@tailor-platform/app-shell 1.18.0 → 1.20.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/app-shell-core.css +2 -2
- package/dist/app-shell.d.ts +1108 -190
- package/dist/app-shell.js +13090 -10783
- package/dist/{appshell-Y1AYCuVJ.js → appshell-B4QkQvXF.js} +519 -392
- package/dist/fonts/inter.css +7 -7
- package/dist/fonts/noto-sans-jp.css +116 -116
- package/dist/style-entry.d.ts +1 -656
- package/dist/testing.d.ts +132 -97
- package/dist/testing.js +1 -1
- package/dist/vite-plugin.d.ts +132 -97
- package/package.json +15 -10
- package/skills/app-shell-patterns/SKILL.md +38 -27
- package/skills/app-shell-patterns/references/api/aggregations.md +131 -0
- package/skills/app-shell-patterns/references/api/create-ai-gateway-client.md +32 -2
- package/skills/app-shell-patterns/references/api/define-module.md +5 -5
- package/skills/app-shell-patterns/references/api/router/use-params.md +2 -2
- package/skills/app-shell-patterns/references/api/use-ai-chat.md +46 -8
- package/skills/app-shell-patterns/references/api/use-app-shell-config.md +4 -4
- package/skills/app-shell-patterns/references/api/use-app-shell-data.md +5 -5
- package/skills/app-shell-patterns/references/api/use-app-shell.md +2 -2
- package/skills/app-shell-patterns/references/api/use-auth.md +3 -3
- package/skills/app-shell-patterns/references/api/use-route-error.md +12 -12
- package/skills/app-shell-patterns/references/components/action-panel.md +57 -23
- package/skills/app-shell-patterns/references/components/activity-card.md +3 -3
- package/skills/app-shell-patterns/references/components/ai-chat.md +37 -3
- package/skills/app-shell-patterns/references/components/app-shell.md +6 -5
- package/skills/app-shell-patterns/references/components/badge.md +7 -3
- package/skills/app-shell-patterns/references/components/card.md +2 -2
- package/skills/app-shell-patterns/references/components/data-table.md +514 -77
- package/skills/app-shell-patterns/references/components/date-picker.md +2 -2
- package/skills/app-shell-patterns/references/components/default-sidebar.md +2 -2
- package/skills/app-shell-patterns/references/components/dialog.md +8 -0
- package/skills/app-shell-patterns/references/components/filter-rail.md +10 -3
- package/skills/app-shell-patterns/references/components/form.md +19 -9
- package/skills/app-shell-patterns/references/components/global-header-layout.md +31 -8
- package/skills/app-shell-patterns/references/components/item-list.md +191 -0
- package/skills/app-shell-patterns/references/components/layout.md +24 -17
- package/skills/app-shell-patterns/references/components/select.md +18 -0
- package/skills/app-shell-patterns/references/components/sidebar-group.md +9 -7
- package/skills/app-shell-patterns/references/components/sidebar-layout.md +74 -11
- package/skills/app-shell-patterns/references/components/sidebar-section.md +8 -8
- package/skills/app-shell-patterns/references/components/tabs.md +32 -2
- package/skills/app-shell-patterns/references/components/text.md +75 -38
- package/skills/app-shell-patterns/references/components/tree.md +342 -0
- package/skills/app-shell-patterns/references/components/with-guard.md +5 -5
- package/skills/app-shell-patterns/references/concepts/authentication.md +1 -1
- package/skills/app-shell-patterns/references/concepts/routing-navigation.md +3 -3
- package/skills/app-shell-patterns/references/concepts/sidebar-navigation.md +16 -14
- package/skills/app-shell-patterns/references/concepts/styling-theming.md +28 -20
- package/skills/app-shell-patterns/references/migrations.md +22 -2
- package/skills/app-shell-patterns/references/pages/document-detail.md +32 -25
- package/skills/app-shell-patterns/references/patterns/form-modal.md +4 -1
- package/skills/app-shell-patterns/references/patterns/interaction-multi-select.md +1 -1
- package/dist/semantic-contrast.test.ts +0 -227
- package/dist/theme-bridge.test.ts +0 -182
package/dist/vite-plugin.d.ts
CHANGED
|
@@ -16,46 +16,6 @@ declare namespace Root {
|
|
|
16
16
|
}
|
|
17
17
|
|
|
18
18
|
|
|
19
|
-
declare namespace Viewport {
|
|
20
|
-
var displayName: string;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
declare namespace Row {
|
|
25
|
-
var displayName: string;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
declare namespace Interval {
|
|
30
|
-
var displayName: string;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
declare namespace TimelineLink {
|
|
35
|
-
var displayName: string;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
declare namespace Root {
|
|
40
|
-
var displayName: string;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
declare namespace Image {
|
|
45
|
-
var displayName: string;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
declare namespace Fallback {
|
|
50
|
-
var displayName: string;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
declare namespace Root {
|
|
55
|
-
var displayName: string;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
|
|
59
19
|
declare namespace Title {
|
|
60
20
|
var displayName: string;
|
|
61
21
|
}
|
|
@@ -66,37 +26,27 @@ declare namespace Description {
|
|
|
66
26
|
}
|
|
67
27
|
|
|
68
28
|
|
|
69
|
-
declare namespace Provider {
|
|
70
|
-
var displayName: string;
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
|
|
74
29
|
declare namespace Root {
|
|
75
30
|
var displayName: string;
|
|
76
31
|
}
|
|
77
32
|
|
|
78
33
|
|
|
79
|
-
declare namespace
|
|
34
|
+
declare namespace Row {
|
|
80
35
|
var displayName: string;
|
|
81
36
|
}
|
|
82
37
|
|
|
83
38
|
|
|
84
|
-
declare namespace
|
|
39
|
+
declare namespace Group {
|
|
85
40
|
var displayName: string;
|
|
86
41
|
}
|
|
87
42
|
|
|
88
43
|
|
|
89
|
-
declare namespace
|
|
44
|
+
declare namespace Separator {
|
|
90
45
|
var displayName: string;
|
|
91
46
|
}
|
|
92
47
|
|
|
93
48
|
|
|
94
|
-
declare namespace
|
|
95
|
-
var displayName: string;
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
declare namespace Settings {
|
|
49
|
+
declare namespace TextRoot {
|
|
100
50
|
var displayName: string;
|
|
101
51
|
}
|
|
102
52
|
|
|
@@ -106,12 +56,12 @@ declare namespace Root {
|
|
|
106
56
|
}
|
|
107
57
|
|
|
108
58
|
|
|
109
|
-
declare namespace
|
|
59
|
+
declare namespace Image {
|
|
110
60
|
var displayName: string;
|
|
111
61
|
}
|
|
112
62
|
|
|
113
63
|
|
|
114
|
-
declare namespace
|
|
64
|
+
declare namespace Fallback {
|
|
115
65
|
var displayName: string;
|
|
116
66
|
}
|
|
117
67
|
|
|
@@ -201,6 +151,21 @@ declare namespace Root {
|
|
|
201
151
|
}
|
|
202
152
|
|
|
203
153
|
|
|
154
|
+
declare namespace Header {
|
|
155
|
+
var displayName: string;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
declare namespace Content {
|
|
160
|
+
var displayName: string;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
declare namespace Root {
|
|
165
|
+
var displayName: string;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
|
|
204
169
|
declare namespace Label {
|
|
205
170
|
var displayName: string;
|
|
206
171
|
}
|
|
@@ -371,167 +336,217 @@ declare namespace Panel {
|
|
|
371
336
|
}
|
|
372
337
|
|
|
373
338
|
|
|
339
|
+
declare namespace Trigger {
|
|
340
|
+
var displayName: string;
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
|
|
344
|
+
declare namespace Provider {
|
|
345
|
+
var displayName: string;
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
|
|
374
349
|
declare namespace Root {
|
|
375
350
|
var displayName: string;
|
|
376
351
|
}
|
|
377
352
|
|
|
378
353
|
|
|
379
|
-
declare namespace
|
|
354
|
+
declare namespace Header {
|
|
380
355
|
var displayName: string;
|
|
381
356
|
}
|
|
382
357
|
|
|
383
358
|
|
|
384
|
-
declare namespace
|
|
359
|
+
declare namespace ClearAll {
|
|
385
360
|
var displayName: string;
|
|
386
361
|
}
|
|
387
362
|
|
|
388
363
|
|
|
389
|
-
declare namespace
|
|
364
|
+
declare namespace Sections {
|
|
390
365
|
var displayName: string;
|
|
391
366
|
}
|
|
392
367
|
|
|
393
368
|
|
|
394
|
-
declare namespace
|
|
369
|
+
declare namespace Settings {
|
|
395
370
|
var displayName: string;
|
|
396
371
|
}
|
|
397
372
|
|
|
398
373
|
|
|
399
|
-
declare namespace
|
|
374
|
+
declare namespace ComboboxRoot {
|
|
400
375
|
var displayName: string;
|
|
401
376
|
}
|
|
402
377
|
|
|
403
378
|
|
|
404
|
-
declare namespace
|
|
379
|
+
declare namespace ComboboxInput {
|
|
405
380
|
var displayName: string;
|
|
406
381
|
}
|
|
407
382
|
|
|
408
383
|
|
|
409
|
-
declare namespace
|
|
384
|
+
declare namespace ComboboxTrigger {
|
|
410
385
|
var displayName: string;
|
|
411
386
|
}
|
|
412
387
|
|
|
413
388
|
|
|
414
|
-
declare namespace
|
|
389
|
+
declare namespace ComboboxInputGroup {
|
|
415
390
|
var displayName: string;
|
|
416
391
|
}
|
|
417
392
|
|
|
418
393
|
|
|
419
|
-
declare namespace
|
|
394
|
+
declare namespace ComboboxContent {
|
|
420
395
|
var displayName: string;
|
|
421
396
|
}
|
|
422
397
|
|
|
423
398
|
|
|
424
|
-
declare namespace
|
|
399
|
+
declare namespace ComboboxList {
|
|
425
400
|
var displayName: string;
|
|
426
401
|
}
|
|
427
402
|
|
|
428
403
|
|
|
429
|
-
declare namespace
|
|
404
|
+
declare namespace ComboboxItem {
|
|
430
405
|
var displayName: string;
|
|
431
406
|
}
|
|
432
407
|
|
|
433
408
|
|
|
434
|
-
declare namespace
|
|
409
|
+
declare namespace ComboboxEmpty {
|
|
435
410
|
var displayName: string;
|
|
436
411
|
}
|
|
437
412
|
|
|
438
413
|
|
|
439
|
-
declare namespace
|
|
414
|
+
declare namespace ComboboxGroup {
|
|
440
415
|
var displayName: string;
|
|
441
416
|
}
|
|
442
417
|
|
|
443
418
|
|
|
444
|
-
declare namespace
|
|
419
|
+
declare namespace ComboboxGroupLabel {
|
|
445
420
|
var displayName: string;
|
|
446
421
|
}
|
|
447
422
|
|
|
448
423
|
|
|
449
|
-
declare namespace
|
|
424
|
+
declare namespace ComboboxClear {
|
|
450
425
|
var displayName: string;
|
|
451
426
|
}
|
|
452
427
|
|
|
453
428
|
|
|
454
|
-
declare namespace
|
|
429
|
+
declare namespace ComboboxChips {
|
|
455
430
|
var displayName: string;
|
|
456
431
|
}
|
|
457
432
|
|
|
458
433
|
|
|
459
|
-
declare namespace
|
|
434
|
+
declare namespace ComboboxChip {
|
|
460
435
|
var displayName: string;
|
|
461
436
|
}
|
|
462
437
|
|
|
463
438
|
|
|
464
|
-
declare namespace
|
|
439
|
+
declare namespace ComboboxChipRemove {
|
|
465
440
|
var displayName: string;
|
|
466
441
|
}
|
|
467
442
|
|
|
468
443
|
|
|
469
|
-
declare namespace
|
|
444
|
+
declare namespace ComboboxValue {
|
|
470
445
|
var displayName: string;
|
|
471
446
|
}
|
|
472
447
|
|
|
473
448
|
|
|
474
|
-
declare namespace
|
|
449
|
+
declare namespace ComboboxStatus {
|
|
475
450
|
var displayName: string;
|
|
476
451
|
}
|
|
477
452
|
|
|
478
453
|
|
|
479
|
-
declare namespace
|
|
454
|
+
declare namespace ComboboxCollection {
|
|
480
455
|
var displayName: string;
|
|
481
456
|
}
|
|
482
457
|
|
|
483
458
|
|
|
484
|
-
declare namespace
|
|
459
|
+
declare namespace Provider {
|
|
485
460
|
var displayName: string;
|
|
486
461
|
}
|
|
487
462
|
|
|
488
463
|
|
|
489
|
-
declare namespace
|
|
464
|
+
declare namespace Root {
|
|
490
465
|
var displayName: string;
|
|
491
466
|
}
|
|
492
467
|
|
|
493
468
|
|
|
494
|
-
declare namespace
|
|
469
|
+
declare namespace Trigger {
|
|
495
470
|
var displayName: string;
|
|
496
471
|
}
|
|
497
472
|
|
|
498
473
|
|
|
499
|
-
declare namespace
|
|
474
|
+
declare namespace Content {
|
|
500
475
|
var displayName: string;
|
|
501
476
|
}
|
|
502
477
|
|
|
503
478
|
|
|
504
|
-
declare namespace
|
|
479
|
+
declare namespace SelectRoot {
|
|
505
480
|
var displayName: string;
|
|
506
481
|
}
|
|
507
482
|
|
|
508
483
|
|
|
509
|
-
declare namespace
|
|
484
|
+
declare namespace SelectTrigger {
|
|
510
485
|
var displayName: string;
|
|
511
486
|
}
|
|
512
487
|
|
|
513
488
|
|
|
514
|
-
declare namespace
|
|
489
|
+
declare namespace SelectValue {
|
|
515
490
|
var displayName: string;
|
|
516
491
|
}
|
|
517
492
|
|
|
518
493
|
|
|
519
|
-
declare namespace
|
|
494
|
+
declare namespace SelectContent {
|
|
520
495
|
var displayName: string;
|
|
521
496
|
}
|
|
522
497
|
|
|
523
498
|
|
|
524
|
-
declare namespace
|
|
499
|
+
declare namespace SelectItem {
|
|
525
500
|
var displayName: string;
|
|
526
501
|
}
|
|
527
502
|
|
|
528
503
|
|
|
529
|
-
declare namespace
|
|
504
|
+
declare namespace SelectGroup {
|
|
530
505
|
var displayName: string;
|
|
531
506
|
}
|
|
532
507
|
|
|
533
508
|
|
|
534
|
-
declare namespace
|
|
509
|
+
declare namespace SelectGroupLabel {
|
|
510
|
+
var displayName: string;
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
|
|
514
|
+
declare namespace SelectSeparator {
|
|
515
|
+
var displayName: string;
|
|
516
|
+
}
|
|
517
|
+
|
|
518
|
+
|
|
519
|
+
declare namespace Root {
|
|
520
|
+
var displayName: string;
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
|
|
524
|
+
declare namespace Viewport {
|
|
525
|
+
var displayName: string;
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
|
|
529
|
+
declare namespace Row {
|
|
530
|
+
var displayName: string;
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
|
|
534
|
+
declare namespace Interval {
|
|
535
|
+
var displayName: string;
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
|
|
539
|
+
declare namespace TimelineLink {
|
|
540
|
+
var displayName: string;
|
|
541
|
+
}
|
|
542
|
+
|
|
543
|
+
|
|
544
|
+
declare namespace AutocompleteStandalone {
|
|
545
|
+
var displayName: string;
|
|
546
|
+
}
|
|
547
|
+
|
|
548
|
+
|
|
549
|
+
declare namespace AutocompleteAsyncStandalone {
|
|
535
550
|
var displayName: string;
|
|
536
551
|
}
|
|
537
552
|
|
|
@@ -606,12 +621,22 @@ declare namespace AutocompleteStatus {
|
|
|
606
621
|
}
|
|
607
622
|
|
|
608
623
|
|
|
609
|
-
declare namespace
|
|
624
|
+
declare namespace TreeRow {
|
|
610
625
|
var displayName: string;
|
|
611
626
|
}
|
|
612
627
|
|
|
613
628
|
|
|
614
|
-
declare namespace
|
|
629
|
+
declare namespace Root {
|
|
630
|
+
var displayName: string;
|
|
631
|
+
}
|
|
632
|
+
|
|
633
|
+
|
|
634
|
+
declare namespace Items {
|
|
635
|
+
var displayName: string;
|
|
636
|
+
}
|
|
637
|
+
|
|
638
|
+
|
|
639
|
+
declare namespace Item {
|
|
615
640
|
var displayName: string;
|
|
616
641
|
}
|
|
617
642
|
|
|
@@ -626,37 +651,37 @@ declare namespace DataTableTable {
|
|
|
626
651
|
}
|
|
627
652
|
|
|
628
653
|
|
|
629
|
-
declare namespace
|
|
654
|
+
declare namespace DataTableToolbar {
|
|
630
655
|
var displayName: string;
|
|
631
656
|
}
|
|
632
657
|
|
|
633
658
|
|
|
634
|
-
declare namespace
|
|
659
|
+
declare namespace DataTableColumnSettings {
|
|
635
660
|
var displayName: string;
|
|
636
661
|
}
|
|
637
662
|
|
|
638
663
|
|
|
639
|
-
declare namespace
|
|
664
|
+
declare namespace DataTableFooter {
|
|
640
665
|
var displayName: string;
|
|
641
666
|
}
|
|
642
667
|
|
|
643
668
|
|
|
644
|
-
declare namespace
|
|
669
|
+
declare namespace DataTableFilters {
|
|
645
670
|
var displayName: string;
|
|
646
671
|
}
|
|
647
672
|
|
|
648
673
|
|
|
649
|
-
declare namespace
|
|
674
|
+
declare namespace DataTableBody {
|
|
650
675
|
var displayName: string;
|
|
651
676
|
}
|
|
652
677
|
|
|
653
678
|
|
|
654
|
-
declare namespace
|
|
679
|
+
declare namespace DataTableHeaders {
|
|
655
680
|
var displayName: string;
|
|
656
681
|
}
|
|
657
682
|
|
|
658
683
|
|
|
659
|
-
declare namespace
|
|
684
|
+
declare namespace AddFilterPanel {
|
|
660
685
|
var displayName: string;
|
|
661
686
|
}
|
|
662
687
|
|
|
@@ -664,3 +689,13 @@ declare namespace DataTableFilters {
|
|
|
664
689
|
declare namespace AsyncErrorState {
|
|
665
690
|
var displayName: string;
|
|
666
691
|
}
|
|
692
|
+
|
|
693
|
+
|
|
694
|
+
declare namespace DataTableHeaderContextMenu {
|
|
695
|
+
var displayName: string;
|
|
696
|
+
}
|
|
697
|
+
|
|
698
|
+
|
|
699
|
+
declare namespace DataTableCellContextMenu {
|
|
700
|
+
var displayName: string;
|
|
701
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tailor-platform/app-shell",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.20.0",
|
|
4
4
|
"description": "An opinionated React application framework for building ERP applications on Tailor Platform",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"app-shell",
|
|
@@ -65,28 +65,32 @@
|
|
|
65
65
|
},
|
|
66
66
|
"devDependencies": {
|
|
67
67
|
"@fontsource-variable/noto-sans-jp": "5.3.0",
|
|
68
|
-
"@microsoft/api-extractor": "7.
|
|
69
|
-
"@
|
|
68
|
+
"@microsoft/api-extractor": "7.60.1",
|
|
69
|
+
"@tailor-platform/eslint-plugin-app-shell": "0.3.0",
|
|
70
|
+
"@tailwindcss/postcss": "^4.3.5",
|
|
70
71
|
"@testing-library/react": "16.3.3",
|
|
71
|
-
"@testing-library/user-event": "14.6.
|
|
72
|
+
"@testing-library/user-event": "14.6.8",
|
|
72
73
|
"@types/encoding-japanese": "2.2.1",
|
|
73
74
|
"@types/node": "^25.9.8",
|
|
74
75
|
"@types/papaparse": "5.5.2",
|
|
75
76
|
"@types/react": "^19",
|
|
76
77
|
"@types/react-dom": "^19",
|
|
77
78
|
"@vitejs/plugin-react": "^6.1.0",
|
|
78
|
-
"@vitest/
|
|
79
|
-
"
|
|
80
|
-
"
|
|
79
|
+
"@vitest/browser-playwright": "4.1.12",
|
|
80
|
+
"@vitest/coverage-v8": "4.1.12",
|
|
81
|
+
"happy-dom": "21.0.4",
|
|
82
|
+
"playwright": "1.63.0",
|
|
83
|
+
"postcss": "8.5.32",
|
|
81
84
|
"react": "^19.2.7",
|
|
82
85
|
"react-dom": "^19.2.7",
|
|
83
86
|
"react-hook-form": "7.71.2",
|
|
84
|
-
"tailwindcss": "^4.3.
|
|
87
|
+
"tailwindcss": "^4.3.5",
|
|
85
88
|
"tw-animate-css": "1.4.0",
|
|
86
89
|
"typescript": "5.9.3",
|
|
87
90
|
"vite": "^8.2.2",
|
|
88
|
-
"vite-plugin-dts": "5.
|
|
89
|
-
"vitest": "^4.1.
|
|
91
|
+
"vite-plugin-dts": "5.1.2",
|
|
92
|
+
"vitest": "^4.1.12",
|
|
93
|
+
"zod": "4.6.7"
|
|
90
94
|
},
|
|
91
95
|
"peerDependencies": {
|
|
92
96
|
"react": ">=19.2.7",
|
|
@@ -99,6 +103,7 @@
|
|
|
99
103
|
"vendor:fonts": "node scripts/sync-noto-fonts.mjs",
|
|
100
104
|
"lint": "oxlint -c .oxlintrc.jsonc",
|
|
101
105
|
"test": "vitest run",
|
|
106
|
+
"test:browser": "pnpm build && vitest run --config vitest.browser.config.ts",
|
|
102
107
|
"type-check": "tsc --incremental"
|
|
103
108
|
}
|
|
104
109
|
}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: app-shell-patterns
|
|
3
3
|
description: "Best-practice UI patterns and correct component usage for building pages in apps that use @tailor-platform/app-shell. Use when: building or editing any screen, page, list, table, detail view, form, modal, dialog, wizard, or bulk/confirm/toast interaction in an app with @tailor-platform/app-shell installed — when choosing the right AppShell component, layout, or design token for a UI — or when upgrading @tailor-platform/app-shell, or diagnosing styling, theming, or dark-mode breakage that appeared after a version bump."
|
|
4
|
+
metadata:
|
|
5
|
+
app-shell-version: "1.20.0"
|
|
4
6
|
---
|
|
5
7
|
|
|
6
8
|
# App-Shell Patterns
|
|
@@ -9,6 +11,10 @@ description: "Best-practice UI patterns and correct component usage for building
|
|
|
9
11
|
|
|
10
12
|
Select and implement the correct UI pattern using @tailor-platform/app-shell components.
|
|
11
13
|
|
|
14
|
+
## Version
|
|
15
|
+
|
|
16
|
+
This skill was generated from `@tailor-platform/app-shell` **1.20.0**. Before relying on it, compare that with the version installed in the app you're working on (resolve `@tailor-platform/app-shell/package.json` from that app, not the monorepo root). If they differ, this copy is stale: tell the user and suggest re-syncing it from the installed package's `skills/app-shell-patterns/` directory.
|
|
17
|
+
|
|
12
18
|
## Concepts
|
|
13
19
|
|
|
14
20
|
Cross-cutting guides that underpin every screen — styling & theming and the token system, GraphQL data access, building custom components, plus auth and routing. Patterns and components build on these.
|
|
@@ -64,6 +70,7 @@ Every AppShell component, its API surface, and usage guidance. Read the entry fo
|
|
|
64
70
|
| [GlobalHeaderLayout](references/components/global-header-layout.md) | Opinionated layout with an app-wide header above the whole shell and a sidebar that collapses to a persistent icon rail |
|
|
65
71
|
| [Grid](references/components/grid.md) | Generic CSS-Grid layout primitive for equal or custom-width columns with responsive reflow, auto-fit, and spanning |
|
|
66
72
|
| [Input](references/components/input.md) | Styled text input with consistent theming |
|
|
73
|
+
| [ItemList](references/components/item-list.md) | Compact icon-and-label lists for consistent navigation inside and outside the Sidebar |
|
|
67
74
|
| [Layout](references/components/layout.md) | Responsive column layout component for organizing page content in 1, 2, or 3 columns |
|
|
68
75
|
| [Menu](references/components/menu.md) | Dropdown menu with a compound component API, supporting checkbox/radio items, groups, separators, and nested sub-menus |
|
|
69
76
|
| [MetricCard](references/components/metric-card.md) | Compact card for dashboard KPI summaries with title, value, optional trend and description |
|
|
@@ -81,39 +88,41 @@ Every AppShell component, its API surface, and usage guidance. Read the entry fo
|
|
|
81
88
|
| [Timeline](references/components/timeline.md) | Composable primitives for building time-based layouts with axis guides, row backgrounds, intervals, and dependency links |
|
|
82
89
|
| [Toolbar](references/components/toolbar.md) | Full-width action bars with composable rows, grouped controls, and keyboard navigation |
|
|
83
90
|
| [Tooltip](references/components/tooltip.md) | Hover/focus tooltip with configurable placement and shared delay via Tooltip.Provider |
|
|
91
|
+
| [Tree](references/components/tree.md) | Browse, pick one, or tick many items in a hierarchy — inline with Tree, or in a search dialog with TreePicker |
|
|
84
92
|
| [WithGuard](references/components/with-guard.md) | Conditionally render UI elements based on guard evaluation with support for async permissions checks |
|
|
85
93
|
|
|
86
94
|
## Available Hooks & Functions
|
|
87
95
|
|
|
88
96
|
Hooks, factory functions, guards, and router utilities exported by AppShell.
|
|
89
97
|
|
|
90
|
-
| Name | Description
|
|
91
|
-
| ------------------------------------------------------------------------------------------ |
|
|
92
|
-
| [
|
|
93
|
-
| [
|
|
94
|
-
| [
|
|
95
|
-
| [
|
|
96
|
-
| [
|
|
97
|
-
| [
|
|
98
|
-
| [
|
|
99
|
-
| [
|
|
100
|
-
| [
|
|
101
|
-
| [
|
|
102
|
-
| [
|
|
103
|
-
| [
|
|
104
|
-
| [
|
|
105
|
-
| [
|
|
106
|
-
| [
|
|
107
|
-
| [
|
|
108
|
-
| [
|
|
109
|
-
| [
|
|
110
|
-
| [
|
|
111
|
-
| [
|
|
112
|
-
| [
|
|
113
|
-
| [
|
|
114
|
-
| [
|
|
115
|
-
| [
|
|
116
|
-
| [
|
|
98
|
+
| Name | Description |
|
|
99
|
+
| ------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------- |
|
|
100
|
+
| [Value aggregations](references/api/aggregations.md) | Reusable selector-based sum, average, minimum, maximum, and non-null count over row collections, with optional result-only transformation |
|
|
101
|
+
| [createAIGatewayClient](references/api/create-ai-gateway-client.md) | Create a low-level AI Gateway client that reuses AppShell authentication |
|
|
102
|
+
| [createTypedPaths](references/api/create-typed-paths.md) | Generate type-safe route paths from file-based routing |
|
|
103
|
+
| [defineI18nLabels](references/api/define-i18n-labels.md) | Type-safe locale-first labels for component text and localized navigation metadata |
|
|
104
|
+
| [defineModule](references/api/define-module.md) | Define a top-level module that appears in the main navigation |
|
|
105
|
+
| [defineResource](references/api/define-resource.md) | Define a nested resource (page) within a module |
|
|
106
|
+
| [hidden](references/api/guards/hidden.md) | Guard function that denies access and returns 404 Not Found |
|
|
107
|
+
| [Guards Overview](references/api/guards/overview.md) | Access control system for routes and components using guard functions |
|
|
108
|
+
| [pass](references/api/guards/pass.md) | Guard function that allows access and continues to the next guard |
|
|
109
|
+
| [redirectTo](references/api/guards/redirect-to.md) | Guard function that redirects to another page |
|
|
110
|
+
| [useLocation](references/api/router/use-location.md) | Hook to access current location object with pathname, search, and state |
|
|
111
|
+
| [useNavigate](references/api/router/use-navigate.md) | Hook for programmatic navigation between routes |
|
|
112
|
+
| [useParams](references/api/router/use-params.md) | Hook to access dynamic route parameters |
|
|
113
|
+
| [useAIChat](references/api/use-ai-chat.md) | AI Gateway chat hook with optional local tools |
|
|
114
|
+
| [useAppShell](references/api/use-app-shell.md) | Hook to access AppShell context data and configuration |
|
|
115
|
+
| [useAppShellConfig](references/api/use-app-shell-config.md) | Hook to access AppShell configuration data |
|
|
116
|
+
| [useAppShellData](references/api/use-app-shell-data.md) | Hook to access custom context data passed to AppShell |
|
|
117
|
+
| [useAuth](references/api/use-auth.md) | Hook for accessing authentication state and methods |
|
|
118
|
+
| [useOverrideBreadcrumb](references/api/use-override-breadcrumb.md) | Hook for dynamically overriding breadcrumb titles from within page components |
|
|
119
|
+
| [usePageMeta](references/api/use-page-meta.md) | Hook to resolve page metadata from route path |
|
|
120
|
+
| [useRegisterCommandPaletteActions](references/api/use-register-command-palette-actions.md) | Hook for registering contextual page actions into the CommandPalette |
|
|
121
|
+
| [useResolvedLocale](references/api/use-resolved-locale.md) | Hook to access the full BCP-47 locale and language code from AppShell context |
|
|
122
|
+
| [useRouteError](references/api/use-route-error.md) | Hook to access error details in custom error boundaries |
|
|
123
|
+
| [useTheme](references/api/use-theme.md) | Hook for accessing and controlling theme (light/dark mode) |
|
|
124
|
+
| [useTimeZone](references/api/use-time-zone.md) | Hook to access the configured IANA timezone from AppShell context |
|
|
125
|
+
| [useToast](references/api/use-toast.md) | Hook for displaying toast notifications |
|
|
117
126
|
|
|
118
127
|
## Available Pages
|
|
119
128
|
|
|
@@ -179,6 +188,8 @@ Full rationale in [`styling-theming`](references/concepts/styling-theming.md)
|
|
|
179
188
|
|
|
180
189
|
- **One primary action per view:** at most one primary/filled `Button`; everything else is `outline`/`secondary`/`ghost`.
|
|
181
190
|
- **Status badges by semantic color:** a **filled** semantic variant for the record's primary/lifecycle status, **`outline-*`** for secondary statuses, **`subtle-*`** for tags; reserve brand `default` for non-status emphasis.
|
|
191
|
+
- **Text uses `Text` and typography roles:** render headings, body copy, labels, and captions with [`Text`](references/components/text.md) and a `variant` (`heading-md`, `body-md`, `body-sm`, `label-md`, …) — never a bare `<p>`, `<h*>`, or `<span>` styled with size and weight utilities such as `text-lg font-semibold` or `text-sm`. Set the heading level with `Text.h1` to `Text.h6` (`<Text.h3 variant="heading-md">`), not by its size, and the color with a token in `className`. For other plain elements use `Text.p`, `Text.span` or `Text.div`; use `render` only to compose with another component. On an element you style yourself, such as a `th`, use the role utility (`text-label-md`). Pick the size with `variant`: a size class such as `text-sm` on `Text` has no effect. `Layout.Header` already renders the page title, and a form field label is [`Field.Label`](references/components/form.md), which already has the label role. Role table and color pairings: [`styling-theming`](references/concepts/styling-theming.md) → Typography.
|
|
192
|
+
- **Status and feedback color by semantic role:** use a component variant first (`Badge`, `Alert`, `Button variant="destructive"`). On your own element, use the roles `{info|success|warning|danger|neutral}-{surface|border|solid|text|contrast|indicator}`, for example `bg-warning-surface text-warning-text border-warning-border`. Error text is `text-danger-text`. Never write the deprecated `--status-*`, `--alert-*` or `--destructive` tokens or their utilities (`bg-status-*`, `text-alert-*`, `bg-destructive`, `text-destructive`) in new code; the next major removes them. When you edit a screen that still uses them, replace them: `text-destructive` → `text-danger-text`, `bg-status-completed` → `bg-success-solid`, `bg-alert-warning-background` → `bg-warning-surface`. Full mapping: [`styling-theming`](references/concepts/styling-theming.md) → Semantic color roles.
|
|
182
193
|
- **No duplicate actions:** an action lives in exactly one place — never repeat the same action in both `Layout.Header` and `ActionPanel`.
|
|
183
194
|
- **Action placement:** primary CTA + status in `Layout.Header`; workflow actions in `ActionPanel`; back/navigation in the breadcrumb — never in `ActionPanel`.
|
|
184
195
|
- **Metric tiles always go in a `Grid`** (`columns={{ initial: 1, md: 2, xl: 4 }}`) — never one-per-row.
|