@kerfjs/ui 5.0.0-beta.4 → 5.0.0-beta.7
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/README.md +9 -8
- package/ai/component-catalog.json +379 -174
- package/ai/public-api-signatures-v1.md +387 -33
- package/ai/skill.md +15 -7
- package/ai/webawesome-jsx-signatures-v1.md +1 -1
- package/dist/app-tab.d.ts +3 -1
- package/dist/app-tab.js +2 -1
- package/dist/browser/app-tab.js +1 -0
- package/dist/browser/menu-action-row.js +1 -0
- package/dist/browser/menu-header.js +1 -0
- package/dist/browser/menu-item.js +1 -0
- package/dist/browser/panel-header.js +7 -0
- package/dist/browser/segmented-control.js +1 -0
- package/dist/browser/select.js +1 -0
- package/dist/browser/skeleton.js +3 -0
- package/dist/browser/state-banner.js +1 -0
- package/dist/browser/toolbar-text.js +1 -0
- package/dist/browser/value-table.js +1 -0
- package/dist/chunk-2RJBFNB6.js +172 -0
- package/dist/chunk-2RJBFNB6.js.map +1 -0
- package/dist/{chunk-XZXRLY5Q.js → chunk-2Z5TWHKQ.js} +7 -6
- package/dist/chunk-2Z5TWHKQ.js.map +1 -0
- package/dist/{chunk-EGHL5S4P.js → chunk-3YD6ZNRA.js} +8 -7
- package/dist/chunk-3YD6ZNRA.js.map +1 -0
- package/dist/chunk-B24C4A6T.js +22 -0
- package/dist/chunk-B24C4A6T.js.map +1 -0
- package/dist/{chunk-NPPD2A6O.js → chunk-H6URQGJI.js} +8 -6
- package/dist/chunk-H6URQGJI.js.map +1 -0
- package/dist/chunk-I7INRJO4.js +17 -0
- package/dist/chunk-I7INRJO4.js.map +1 -0
- package/dist/chunk-KJYXOTG3.js +10 -0
- package/dist/chunk-KJYXOTG3.js.map +1 -0
- package/dist/{chunk-CTQKI2XL.js → chunk-LC3YSAZC.js} +14 -3
- package/dist/chunk-LC3YSAZC.js.map +1 -0
- package/dist/chunk-N3SUXLLS.js +23 -0
- package/dist/chunk-N3SUXLLS.js.map +1 -0
- package/dist/{chunk-R6JHHBKQ.js → chunk-PONXLV5U.js} +5 -5
- package/dist/chunk-PONXLV5U.js.map +1 -0
- package/dist/chunk-TZNCCM5H.js +20 -0
- package/dist/chunk-TZNCCM5H.js.map +1 -0
- package/dist/{chunk-TRNBHPNW.js → chunk-YGN7OMLT.js} +11 -8
- package/dist/chunk-YGN7OMLT.js.map +1 -0
- package/dist/chunk-YKUUZPED.js +24 -0
- package/dist/chunk-YKUUZPED.js.map +1 -0
- package/dist/device-class.d.ts +62 -0
- package/dist/device-class.js +75 -0
- package/dist/device-class.js.map +1 -0
- package/dist/index.d.ts +3 -3
- package/dist/index.js +15 -15
- package/dist/menu-action-row.d.ts +3 -1
- package/dist/menu-action-row.js +2 -1
- package/dist/menu-header.d.ts +3 -1
- package/dist/menu-header.js +2 -1
- package/dist/menu-item.d.ts +3 -1
- package/dist/menu-item.js +2 -1
- package/dist/nav-stack.d.ts +38 -0
- package/dist/nav-stack.js +5 -0
- package/dist/nav-stack.js.map +1 -0
- package/dist/panel-header.d.ts +28 -0
- package/dist/panel-header.js +7 -0
- package/dist/panel-header.js.map +1 -0
- package/dist/segmented-control.d.ts +3 -1
- package/dist/segmented-control.js +2 -1
- package/dist/select.d.ts +5 -2
- package/dist/select.js +2 -1
- package/dist/skeleton.d.ts +24 -0
- package/dist/skeleton.js +3 -0
- package/dist/skeleton.js.map +1 -0
- package/dist/split-view.d.ts +42 -0
- package/dist/split-view.js +21 -0
- package/dist/split-view.js.map +1 -0
- package/dist/state-banner.d.ts +3 -1
- package/dist/state-banner.js +2 -1
- package/dist/styles/foundation.css +21 -0
- package/dist/styles/menu-header.css +19 -2
- package/dist/styles/nav-stack.css +112 -0
- package/dist/styles/panel-header.css +64 -0
- package/dist/styles/select.css +42 -0
- package/dist/styles/skeleton.css +31 -0
- package/dist/styles/split-view.css +35 -0
- package/dist/styles/styles.css +2 -2
- package/dist/styles/tab-scaffold.css +84 -0
- package/dist/styles/toolbar-control-group.css +52 -2
- package/dist/styles/toolbar-text.css +11 -0
- package/dist/styles/toolbar.css +9 -0
- package/dist/styles/workbench.css +94 -0
- package/dist/tab-scaffold.d.ts +30 -0
- package/dist/tab-scaffold.js +16 -0
- package/dist/tab-scaffold.js.map +1 -0
- package/dist/toolbar-text.d.ts +6 -2
- package/dist/toolbar-text.js +2 -1
- package/dist/value-table.d.ts +3 -1
- package/dist/value-table.js +2 -1
- package/dist/wire-nav-stack.d.ts +15 -0
- package/dist/wire-nav-stack.js +88 -0
- package/dist/wire-nav-stack.js.map +1 -0
- package/dist/wire-tab-scaffold.d.ts +11 -0
- package/dist/wire-tab-scaffold.js +16 -0
- package/dist/wire-tab-scaffold.js.map +1 -0
- package/dist/wire-token-search-fields.d.ts +46 -4
- package/dist/wire-token-search-fields.js +1 -1
- package/dist/workbench.d.ts +33 -0
- package/dist/workbench.js +17 -0
- package/dist/workbench.js.map +1 -0
- package/docs/accessibility.md +10 -10
- package/docs/app-layouts.md +57 -0
- package/docs/component-contract.md +46 -9
- package/docs/component-selection.md +57 -7
- package/docs/design-philosophy.md +23 -1
- package/docs/device-class.md +54 -0
- package/docs/layout.md +33 -8
- package/docs/nav-stack.md +47 -0
- package/docs/recipes.md +17 -5
- package/docs/split-view.md +49 -0
- package/docs/tab-scaffold.md +41 -0
- package/docs/ux-demo.md +3 -3
- package/docs/workbench.md +47 -0
- package/llms.txt +116 -43
- package/package.json +43 -11
- package/ux-demo/recipes/app-shell.tsx +3 -3
- package/ux-demo/recipes/composer-form.tsx +2 -2
- package/ux-demo/recipes/list-workspace-states.tsx +2 -2
- package/ux-demo/recipes/loaders.ts +2 -0
- package/ux-demo/recipes/master-detail-dialog.tsx +2 -2
- package/ux-demo/recipes/mount-recipe.ts +3 -0
- package/ux-demo/recipes/navigation-stack.tsx +76 -0
- package/ux-demo/recipes/recipes.css +19 -8
- package/ux-demo/recipes/workspace-header.tsx +2 -2
- package/dist/browser/dialog-header.js +0 -5
- package/dist/browser/page-header.js +0 -3
- package/dist/chunk-2PES33HS.js +0 -13
- package/dist/chunk-2PES33HS.js.map +0 -1
- package/dist/chunk-CTQKI2XL.js.map +0 -1
- package/dist/chunk-EGHL5S4P.js.map +0 -1
- package/dist/chunk-GY5WH7TO.js +0 -10
- package/dist/chunk-GY5WH7TO.js.map +0 -1
- package/dist/chunk-H5AGGVU5.js +0 -75
- package/dist/chunk-H5AGGVU5.js.map +0 -1
- package/dist/chunk-K3G72I6D.js +0 -24
- package/dist/chunk-K3G72I6D.js.map +0 -1
- package/dist/chunk-NPPD2A6O.js.map +0 -1
- package/dist/chunk-R6JHHBKQ.js.map +0 -1
- package/dist/chunk-S3TPM2LP.js +0 -23
- package/dist/chunk-S3TPM2LP.js.map +0 -1
- package/dist/chunk-TRNBHPNW.js.map +0 -1
- package/dist/chunk-VHW5YNIB.js +0 -17
- package/dist/chunk-VHW5YNIB.js.map +0 -1
- package/dist/chunk-XZXRLY5Q.js.map +0 -1
- package/dist/dialog-header.d.ts +0 -15
- package/dist/dialog-header.js +0 -5
- package/dist/dialog-header.js.map +0 -1
- package/dist/page-header.d.ts +0 -9
- package/dist/page-header.js +0 -3
- package/dist/page-header.js.map +0 -1
- package/dist/styles/dialog-header.css +0 -87
- package/dist/styles/page-header.css +0 -33
|
@@ -328,11 +328,7 @@
|
|
|
328
328
|
],
|
|
329
329
|
"alternatives": [
|
|
330
330
|
{
|
|
331
|
-
"id": "
|
|
332
|
-
"relationship": "nearest"
|
|
333
|
-
},
|
|
334
|
-
{
|
|
335
|
-
"id": "dialog-header",
|
|
331
|
+
"id": "panel-header",
|
|
336
332
|
"relationship": "nearest"
|
|
337
333
|
}
|
|
338
334
|
],
|
|
@@ -478,7 +474,7 @@
|
|
|
478
474
|
],
|
|
479
475
|
"alternatives": [
|
|
480
476
|
{
|
|
481
|
-
"id": "
|
|
477
|
+
"id": "panel-header",
|
|
482
478
|
"relationship": "nearest"
|
|
483
479
|
}
|
|
484
480
|
],
|
|
@@ -489,7 +485,8 @@
|
|
|
489
485
|
"variants": [
|
|
490
486
|
"large",
|
|
491
487
|
"default",
|
|
492
|
-
"small"
|
|
488
|
+
"small",
|
|
489
|
+
"placeholder (loading)"
|
|
493
490
|
],
|
|
494
491
|
"accessibility": [],
|
|
495
492
|
"delivery": {
|
|
@@ -524,8 +521,7 @@
|
|
|
524
521
|
"source": "kerf",
|
|
525
522
|
"description": "Page, dialog, and definition-list hierarchy.",
|
|
526
523
|
"uses": [
|
|
527
|
-
"
|
|
528
|
-
"dialog-header",
|
|
524
|
+
"panel-header",
|
|
529
525
|
"value-table"
|
|
530
526
|
],
|
|
531
527
|
"purpose": "Page, dialog, and definition-list hierarchy.",
|
|
@@ -542,11 +538,7 @@
|
|
|
542
538
|
"relationship": "nearest"
|
|
543
539
|
},
|
|
544
540
|
{
|
|
545
|
-
"id": "
|
|
546
|
-
"relationship": "nearest"
|
|
547
|
-
},
|
|
548
|
-
{
|
|
549
|
-
"id": "dialog-header",
|
|
541
|
+
"id": "panel-header",
|
|
550
542
|
"relationship": "nearest"
|
|
551
543
|
}
|
|
552
544
|
],
|
|
@@ -578,96 +570,31 @@
|
|
|
578
570
|
}
|
|
579
571
|
},
|
|
580
572
|
{
|
|
581
|
-
"id": "
|
|
582
|
-
"name": "
|
|
583
|
-
"category": "Structure",
|
|
584
|
-
"kind": "component",
|
|
585
|
-
"source": "kerf",
|
|
586
|
-
"description": "Page identity with an optional trailing action.",
|
|
587
|
-
"uses": [],
|
|
588
|
-
"purpose": "Page identity with an optional trailing action.",
|
|
589
|
-
"publicExports": [
|
|
590
|
-
"PageHeader"
|
|
591
|
-
],
|
|
592
|
-
"useWhen": [
|
|
593
|
-
"Identify a page with its primary heading and optional trailing action."
|
|
594
|
-
],
|
|
595
|
-
"avoidWhen": [
|
|
596
|
-
"Do not use for persistent app chrome or a modal task."
|
|
597
|
-
],
|
|
598
|
-
"alternatives": [
|
|
599
|
-
{
|
|
600
|
-
"id": "toolbar",
|
|
601
|
-
"relationship": "nearest"
|
|
602
|
-
},
|
|
603
|
-
{
|
|
604
|
-
"id": "dialog-header",
|
|
605
|
-
"relationship": "nearest"
|
|
606
|
-
}
|
|
607
|
-
],
|
|
608
|
-
"appOwns": [
|
|
609
|
-
"title",
|
|
610
|
-
"action",
|
|
611
|
-
"responsive placement"
|
|
612
|
-
],
|
|
613
|
-
"variants": [
|
|
614
|
-
"title",
|
|
615
|
-
"title with action"
|
|
616
|
-
],
|
|
617
|
-
"accessibility": [
|
|
618
|
-
"Use once for the page primary heading."
|
|
619
|
-
],
|
|
620
|
-
"delivery": {
|
|
621
|
-
"browserImport": "@kerfjs/ui/page-header",
|
|
622
|
-
"manualCssImport": "@kerfjs/ui/page-header.css",
|
|
623
|
-
"sideEffects": [
|
|
624
|
-
"browser-condition-css"
|
|
625
|
-
]
|
|
626
|
-
},
|
|
627
|
-
"wiring": [],
|
|
628
|
-
"publicClasses": [
|
|
629
|
-
"kui-page-header",
|
|
630
|
-
"kui-page-header__action"
|
|
631
|
-
],
|
|
632
|
-
"publicTokens": [
|
|
633
|
-
"--kui-color-text",
|
|
634
|
-
"--kui-font-2xl",
|
|
635
|
-
"--kui-font-l",
|
|
636
|
-
"--kui-page-header-background",
|
|
637
|
-
"--kui-page-header-border",
|
|
638
|
-
"--kui-page-header-foreground"
|
|
639
|
-
],
|
|
640
|
-
"links": {
|
|
641
|
-
"catalogRoute": "?component=page-header",
|
|
642
|
-
"documentation": "docs/component-selection.md",
|
|
643
|
-
"recipe": "docs/component-selection.md#ambiguous-choices"
|
|
644
|
-
}
|
|
645
|
-
},
|
|
646
|
-
{
|
|
647
|
-
"id": "dialog-header",
|
|
648
|
-
"name": "DialogHeader",
|
|
573
|
+
"id": "panel-header",
|
|
574
|
+
"name": "PanelHeader",
|
|
649
575
|
"category": "Structure",
|
|
650
576
|
"kind": "component",
|
|
651
577
|
"source": "kerf",
|
|
652
|
-
"description": "
|
|
578
|
+
"description": "A plain Toolbar as a panel, dialog, or page heading: optional icon group, an extra-large title, trailing actions, and an optional subtitle row.",
|
|
653
579
|
"uses": [
|
|
654
580
|
"lucide-icon",
|
|
655
581
|
"toolbar",
|
|
656
|
-
"toolbar-control-group"
|
|
582
|
+
"toolbar-control-group",
|
|
583
|
+
"toolbar-text"
|
|
657
584
|
],
|
|
658
|
-
"purpose": "
|
|
585
|
+
"purpose": "A plain Toolbar as a panel, dialog, or page heading: optional icon group, an extra-large title, trailing actions, and an optional subtitle row.",
|
|
659
586
|
"publicExports": [
|
|
660
|
-
"
|
|
587
|
+
"PanelHeader"
|
|
661
588
|
],
|
|
662
589
|
"useWhen": [
|
|
663
|
-
"
|
|
590
|
+
"Give a panel, dialog, or page a heading with an extra-large title, optional icon and subtitle, and trailing actions."
|
|
664
591
|
],
|
|
665
592
|
"avoidWhen": [
|
|
666
|
-
"Do not use as
|
|
593
|
+
"Do not use it as persistent application chrome; use Toolbar. It supplies header structure, not modal behavior."
|
|
667
594
|
],
|
|
668
595
|
"alternatives": [
|
|
669
596
|
{
|
|
670
|
-
"id": "
|
|
597
|
+
"id": "toolbar",
|
|
671
598
|
"relationship": "nearest"
|
|
672
599
|
},
|
|
673
600
|
{
|
|
@@ -680,49 +607,42 @@
|
|
|
680
607
|
"focus lifecycle",
|
|
681
608
|
"dismissal",
|
|
682
609
|
"copy",
|
|
683
|
-
"
|
|
610
|
+
"the trailing action controls"
|
|
684
611
|
],
|
|
685
612
|
"variants": [
|
|
686
613
|
"title",
|
|
687
614
|
"optional summary",
|
|
688
615
|
"icon",
|
|
689
616
|
"actions",
|
|
690
|
-
"
|
|
617
|
+
"placeholder (loading)"
|
|
691
618
|
],
|
|
692
619
|
"accessibility": [
|
|
693
|
-
"Connect the title id and any provided summary id to the dialog host.",
|
|
694
|
-
"Pass a
|
|
620
|
+
"Connect the title id and any provided summary id to the dialog or panel host.",
|
|
621
|
+
"Pass the trailing actions as a labeled ToolbarControlGroup when the group needs an accessible name."
|
|
695
622
|
],
|
|
696
623
|
"delivery": {
|
|
697
|
-
"browserImport": "@kerfjs/ui/
|
|
698
|
-
"manualCssImport": "@kerfjs/ui/
|
|
624
|
+
"browserImport": "@kerfjs/ui/panel-header",
|
|
625
|
+
"manualCssImport": "@kerfjs/ui/panel-header.css",
|
|
699
626
|
"sideEffects": [
|
|
700
627
|
"browser-condition-css"
|
|
701
628
|
]
|
|
702
629
|
},
|
|
703
630
|
"wiring": [],
|
|
704
631
|
"publicClasses": [
|
|
705
|
-
"kui-
|
|
706
|
-
"kui-
|
|
707
|
-
"kui-
|
|
708
|
-
"kui-dialog-header__icon",
|
|
709
|
-
"kui-dialog-header__identity",
|
|
710
|
-
"kui-dialog-header__summary",
|
|
711
|
-
"kui-dialog-header__toolbar"
|
|
632
|
+
"kui-panel-header",
|
|
633
|
+
"kui-panel-header__icon",
|
|
634
|
+
"kui-panel-header__summary"
|
|
712
635
|
],
|
|
713
636
|
"publicTokens": [
|
|
714
637
|
"--kui-color-brand-fill-quiet",
|
|
715
638
|
"--kui-color-brand-on-quiet",
|
|
716
|
-
"--kui-color-text",
|
|
717
639
|
"--kui-color-text-quiet",
|
|
718
|
-
"--kui-
|
|
719
|
-
"--kui-
|
|
720
|
-
"--kui-
|
|
721
|
-
"--kui-font-l",
|
|
722
|
-
"--kui-radius-circle"
|
|
640
|
+
"--kui-panel-header-icon-background",
|
|
641
|
+
"--kui-panel-header-icon-border",
|
|
642
|
+
"--kui-panel-header-icon-foreground"
|
|
723
643
|
],
|
|
724
644
|
"links": {
|
|
725
|
-
"catalogRoute": "?component=
|
|
645
|
+
"catalogRoute": "?component=panel-header",
|
|
726
646
|
"documentation": "docs/component-selection.md",
|
|
727
647
|
"recipe": "docs/component-selection.md#ambiguous-choices"
|
|
728
648
|
}
|
|
@@ -756,7 +676,8 @@
|
|
|
756
676
|
],
|
|
757
677
|
"variants": [
|
|
758
678
|
"icon rows",
|
|
759
|
-
"iconless rows"
|
|
679
|
+
"iconless rows",
|
|
680
|
+
"placeholder (loading)"
|
|
760
681
|
],
|
|
761
682
|
"accessibility": [
|
|
762
683
|
"Name ValueTable with its label; ValueTableRow supplies dt/dd semantics, and row icons stay decorative unless meaning requires an accessible label."
|
|
@@ -881,11 +802,7 @@
|
|
|
881
802
|
],
|
|
882
803
|
"alternatives": [
|
|
883
804
|
{
|
|
884
|
-
"id": "
|
|
885
|
-
"relationship": "nearest"
|
|
886
|
-
},
|
|
887
|
-
{
|
|
888
|
-
"id": "dialog-header",
|
|
805
|
+
"id": "panel-header",
|
|
889
806
|
"relationship": "nearest"
|
|
890
807
|
}
|
|
891
808
|
],
|
|
@@ -903,7 +820,8 @@
|
|
|
903
820
|
"count",
|
|
904
821
|
"badge",
|
|
905
822
|
"action",
|
|
906
|
-
"toggle"
|
|
823
|
+
"toggle",
|
|
824
|
+
"placeholder (loading)"
|
|
907
825
|
],
|
|
908
826
|
"accessibility": [
|
|
909
827
|
"A valid count is hidden as duplicate visual text and its required localized countLabel joins the owned heading or disclosure-button accessible name; zero remains visible.",
|
|
@@ -992,7 +910,8 @@
|
|
|
992
910
|
"pressed",
|
|
993
911
|
"disabled primary",
|
|
994
912
|
"disabled trailing action",
|
|
995
|
-
"multiline"
|
|
913
|
+
"multiline",
|
|
914
|
+
"placeholder (loading)"
|
|
996
915
|
],
|
|
997
916
|
"accessibility": [
|
|
998
917
|
"The noninteractive root contains two sibling native buttons in primary-then-trailing focus order; each button has its own action, item identity, accessible name, and disabled state.",
|
|
@@ -1082,7 +1001,8 @@
|
|
|
1082
1001
|
"pressed",
|
|
1083
1002
|
"disabled",
|
|
1084
1003
|
"trailing",
|
|
1085
|
-
"multiline"
|
|
1004
|
+
"multiline",
|
|
1005
|
+
"placeholder (loading)"
|
|
1086
1006
|
],
|
|
1087
1007
|
"accessibility": [
|
|
1088
1008
|
"Uses native button activation; selected maps to aria-current and pressed to aria-pressed; rootAttributes cannot add role=menuitem or replace owned ARIA; trailing is dormant content and must not contain controls."
|
|
@@ -1347,7 +1267,8 @@
|
|
|
1347
1267
|
"rounded",
|
|
1348
1268
|
"pill",
|
|
1349
1269
|
"equal width",
|
|
1350
|
-
"small"
|
|
1270
|
+
"small",
|
|
1271
|
+
"placeholder (loading)"
|
|
1351
1272
|
],
|
|
1352
1273
|
"accessibility": [
|
|
1353
1274
|
"Keep choice labels meaningful and every enabled native button in sequential Tab order."
|
|
@@ -1433,7 +1354,7 @@
|
|
|
1433
1354
|
"tokens",
|
|
1434
1355
|
"query execution",
|
|
1435
1356
|
"results",
|
|
1436
|
-
"
|
|
1357
|
+
"optional override of the collapsible expand/collapse/focus, which wireTokenSearchFields manages by default (adopt an app expanded signal, opt out per behavior, or drive it via the returned handle)"
|
|
1437
1358
|
],
|
|
1438
1359
|
"variants": [
|
|
1439
1360
|
"tokens",
|
|
@@ -1445,7 +1366,7 @@
|
|
|
1445
1366
|
"Announce result changes when useful and keep tokens atomic during editing.",
|
|
1446
1367
|
"Keep leading and trailing controls aligned to the first text line while content wraps.",
|
|
1447
1368
|
"Wire Enter to submit without inserting a contenteditable line break and preserve focus plus the text-relative caret across controlled keyboard chip deletion; visual wrapping remains available.",
|
|
1448
|
-
"In collapsible mode,
|
|
1369
|
+
"In collapsible mode, wireTokenSearchFields manages this by default: activating the trigger reveals the searchbox and moves focus into it, Escape on an empty field collapses and returns focus to the trigger, and focus leaving an empty field collapses it; each behavior is individually opt-out."
|
|
1449
1370
|
],
|
|
1450
1371
|
"delivery": {
|
|
1451
1372
|
"browserImport": "@kerfjs/ui/token-search-field",
|
|
@@ -1652,7 +1573,8 @@
|
|
|
1652
1573
|
"disabled",
|
|
1653
1574
|
"fit menu",
|
|
1654
1575
|
"grouped",
|
|
1655
|
-
"custom selected content"
|
|
1576
|
+
"custom selected content",
|
|
1577
|
+
"placeholder (loading)"
|
|
1656
1578
|
],
|
|
1657
1579
|
"accessibility": [
|
|
1658
1580
|
"Verify the live value, standard events, focus, and rendered output."
|
|
@@ -1803,7 +1725,8 @@
|
|
|
1803
1725
|
"warning",
|
|
1804
1726
|
"danger",
|
|
1805
1727
|
"status",
|
|
1806
|
-
"alert"
|
|
1728
|
+
"alert",
|
|
1729
|
+
"placeholder (loading)"
|
|
1807
1730
|
],
|
|
1808
1731
|
"accessibility": [
|
|
1809
1732
|
"Use alert urgency only for an attention-requiring failure."
|
|
@@ -2005,6 +1928,66 @@
|
|
|
2005
1928
|
"recipe": "docs/component-selection.md#problem-to-component-matrix"
|
|
2006
1929
|
}
|
|
2007
1930
|
},
|
|
1931
|
+
{
|
|
1932
|
+
"id": "skeleton",
|
|
1933
|
+
"name": "Skeleton",
|
|
1934
|
+
"category": "Feedback",
|
|
1935
|
+
"kind": "component",
|
|
1936
|
+
"source": "kerf",
|
|
1937
|
+
"description": "A subtle, unanimated loading placeholder block for a not-yet-known value slot.",
|
|
1938
|
+
"uses": [],
|
|
1939
|
+
"purpose": "A subtle, unanimated loading placeholder block for a not-yet-known value slot.",
|
|
1940
|
+
"publicExports": [
|
|
1941
|
+
"Skeleton"
|
|
1942
|
+
],
|
|
1943
|
+
"useWhen": [
|
|
1944
|
+
"Stand in for a value that is still loading, on its own or via a component's placeholder prop, keeping the surrounding layout stable.",
|
|
1945
|
+
"Placeholder a custom or free-text slot with the same visual the components' placeholder mode uses."
|
|
1946
|
+
],
|
|
1947
|
+
"avoidWhen": [
|
|
1948
|
+
"Do not use for known progress or a busy spinner; use LoadingSpinner.",
|
|
1949
|
+
"Do not animate it or use it as decorative filler."
|
|
1950
|
+
],
|
|
1951
|
+
"alternatives": [
|
|
1952
|
+
{
|
|
1953
|
+
"id": "wa-skeleton",
|
|
1954
|
+
"relationship": "prefer-over"
|
|
1955
|
+
}
|
|
1956
|
+
],
|
|
1957
|
+
"appOwns": [
|
|
1958
|
+
"loading lifecycle",
|
|
1959
|
+
"which slots are unknown",
|
|
1960
|
+
"announcing the loading region"
|
|
1961
|
+
],
|
|
1962
|
+
"variants": [
|
|
1963
|
+
"block",
|
|
1964
|
+
"lines",
|
|
1965
|
+
"labeled"
|
|
1966
|
+
],
|
|
1967
|
+
"accessibility": [
|
|
1968
|
+
"Decorative by default (aria-hidden); pass label to announce it as an image. A component in placeholder mode marks itself aria-busy and disables its own controls."
|
|
1969
|
+
],
|
|
1970
|
+
"delivery": {
|
|
1971
|
+
"browserImport": "@kerfjs/ui/skeleton",
|
|
1972
|
+
"manualCssImport": "@kerfjs/ui/skeleton.css",
|
|
1973
|
+
"sideEffects": [
|
|
1974
|
+
"browser-condition-css"
|
|
1975
|
+
]
|
|
1976
|
+
},
|
|
1977
|
+
"wiring": [],
|
|
1978
|
+
"publicClasses": [
|
|
1979
|
+
"kui-skeleton",
|
|
1980
|
+
"kui-skeleton-lines"
|
|
1981
|
+
],
|
|
1982
|
+
"publicTokens": [
|
|
1983
|
+
"--kui-skeleton-radius"
|
|
1984
|
+
],
|
|
1985
|
+
"links": {
|
|
1986
|
+
"catalogRoute": "?component=skeleton",
|
|
1987
|
+
"documentation": "docs/component-selection.md",
|
|
1988
|
+
"recipe": "docs/component-selection.md#problem-to-component-matrix"
|
|
1989
|
+
}
|
|
1990
|
+
},
|
|
2008
1991
|
{
|
|
2009
1992
|
"id": "wa-button",
|
|
2010
1993
|
"name": "Button",
|
|
@@ -4371,13 +4354,42 @@
|
|
|
4371
4354
|
"kind": "recipe",
|
|
4372
4355
|
"source": "kerf",
|
|
4373
4356
|
"purpose": "Toolbar, navigation, content, and inspector shell with controlled resizing and explicit pane scroll owners.",
|
|
4374
|
-
"uses": [
|
|
4375
|
-
|
|
4376
|
-
|
|
4377
|
-
|
|
4378
|
-
|
|
4379
|
-
|
|
4380
|
-
|
|
4357
|
+
"uses": [
|
|
4358
|
+
"toolbar",
|
|
4359
|
+
"toolbar-text",
|
|
4360
|
+
"toolbar-control-group",
|
|
4361
|
+
"menu-header",
|
|
4362
|
+
"menu-item",
|
|
4363
|
+
"panel-header",
|
|
4364
|
+
"resize",
|
|
4365
|
+
"value-table",
|
|
4366
|
+
"layout"
|
|
4367
|
+
],
|
|
4368
|
+
"useWhen": [
|
|
4369
|
+
"A desktop workspace needs persistent chrome and user-adjustable navigation or inspector panes."
|
|
4370
|
+
],
|
|
4371
|
+
"avoidWhen": [
|
|
4372
|
+
"Use ordinary CSS grid when panes are static or the product does not need a user-operable separator."
|
|
4373
|
+
],
|
|
4374
|
+
"appOwns": [
|
|
4375
|
+
"routing",
|
|
4376
|
+
"pane visibility",
|
|
4377
|
+
"pane sizes and persistence",
|
|
4378
|
+
"workspace data"
|
|
4379
|
+
],
|
|
4380
|
+
"accessibility": [
|
|
4381
|
+
"Each pane has one scroll owner and each resize handle keeps its separator keyboard contract."
|
|
4382
|
+
],
|
|
4383
|
+
"delivery": {
|
|
4384
|
+
"sideEffects": [
|
|
4385
|
+
"lazy-recipe-css"
|
|
4386
|
+
]
|
|
4387
|
+
},
|
|
4388
|
+
"links": {
|
|
4389
|
+
"catalogRoute": "?component=recipe-app-shell",
|
|
4390
|
+
"documentation": "docs/recipes.md#desktop-application-shell",
|
|
4391
|
+
"recipe": "docs/recipes.md#desktop-application-shell"
|
|
4392
|
+
}
|
|
4381
4393
|
},
|
|
4382
4394
|
{
|
|
4383
4395
|
"id": "recipe-navigation-sidebar",
|
|
@@ -4386,13 +4398,37 @@
|
|
|
4386
4398
|
"kind": "recipe",
|
|
4387
4399
|
"source": "kerf",
|
|
4388
4400
|
"purpose": "Navigation sections with icon and iconless rows, a content-item surface, disclosure, and pane footer actions.",
|
|
4389
|
-
"uses": [
|
|
4390
|
-
|
|
4391
|
-
|
|
4392
|
-
|
|
4393
|
-
|
|
4394
|
-
|
|
4395
|
-
"
|
|
4401
|
+
"uses": [
|
|
4402
|
+
"menu-header",
|
|
4403
|
+
"menu-item",
|
|
4404
|
+
"toolbar",
|
|
4405
|
+
"toolbar-control-group"
|
|
4406
|
+
],
|
|
4407
|
+
"useWhen": [
|
|
4408
|
+
"A workspace sidebar needs the shared toolbar/content/footer pane model, 24px major section rhythm, and 44px row and utility-action targets."
|
|
4409
|
+
],
|
|
4410
|
+
"avoidWhen": [
|
|
4411
|
+
"Use ordinary links when menu selection, section, and sidebar anatomy do not apply."
|
|
4412
|
+
],
|
|
4413
|
+
"appOwns": [
|
|
4414
|
+
"information architecture",
|
|
4415
|
+
"routing",
|
|
4416
|
+
"permissions",
|
|
4417
|
+
"disclosure state"
|
|
4418
|
+
],
|
|
4419
|
+
"accessibility": [
|
|
4420
|
+
"Native buttons retain names, current state, sequential focus, and disclosure state; rows and standalone footer actions remain at least 44px tall."
|
|
4421
|
+
],
|
|
4422
|
+
"delivery": {
|
|
4423
|
+
"sideEffects": [
|
|
4424
|
+
"lazy-recipe-css"
|
|
4425
|
+
]
|
|
4426
|
+
},
|
|
4427
|
+
"links": {
|
|
4428
|
+
"catalogRoute": "?component=recipe-navigation-sidebar",
|
|
4429
|
+
"documentation": "docs/recipes.md#navigation-sidebar",
|
|
4430
|
+
"recipe": "docs/recipes.md#navigation-sidebar"
|
|
4431
|
+
}
|
|
4396
4432
|
},
|
|
4397
4433
|
{
|
|
4398
4434
|
"id": "recipe-workspace-header",
|
|
@@ -4401,13 +4437,36 @@
|
|
|
4401
4437
|
"kind": "recipe",
|
|
4402
4438
|
"source": "kerf",
|
|
4403
4439
|
"purpose": "Page identity with primary, secondary, and overflow actions that relocate at narrow widths.",
|
|
4404
|
-
"uses": [
|
|
4405
|
-
|
|
4406
|
-
|
|
4407
|
-
|
|
4408
|
-
|
|
4409
|
-
"
|
|
4410
|
-
|
|
4440
|
+
"uses": [
|
|
4441
|
+
"panel-header",
|
|
4442
|
+
"state-banner",
|
|
4443
|
+
"layout"
|
|
4444
|
+
],
|
|
4445
|
+
"useWhen": [
|
|
4446
|
+
"A workspace page needs one primary heading and a small prioritized action set."
|
|
4447
|
+
],
|
|
4448
|
+
"avoidWhen": [
|
|
4449
|
+
"Use Toolbar for persistent application chrome or PanelHeader for a focused modal task."
|
|
4450
|
+
],
|
|
4451
|
+
"appOwns": [
|
|
4452
|
+
"authorization",
|
|
4453
|
+
"command behavior",
|
|
4454
|
+
"breadcrumbs",
|
|
4455
|
+
"product copy"
|
|
4456
|
+
],
|
|
4457
|
+
"accessibility": [
|
|
4458
|
+
"Heading order and action focus order remain stable when controls wrap."
|
|
4459
|
+
],
|
|
4460
|
+
"delivery": {
|
|
4461
|
+
"sideEffects": [
|
|
4462
|
+
"lazy-recipe-css"
|
|
4463
|
+
]
|
|
4464
|
+
},
|
|
4465
|
+
"links": {
|
|
4466
|
+
"catalogRoute": "?component=recipe-workspace-header",
|
|
4467
|
+
"documentation": "docs/recipes.md#workspace-header",
|
|
4468
|
+
"recipe": "docs/recipes.md#workspace-header"
|
|
4469
|
+
}
|
|
4411
4470
|
},
|
|
4412
4471
|
{
|
|
4413
4472
|
"id": "recipe-master-detail-dialog",
|
|
@@ -4415,14 +4474,41 @@
|
|
|
4415
4474
|
"category": "Recipes",
|
|
4416
4475
|
"kind": "recipe",
|
|
4417
4476
|
"source": "kerf",
|
|
4418
|
-
"purpose": "Production modal containing a
|
|
4419
|
-
"uses": [
|
|
4420
|
-
|
|
4421
|
-
|
|
4422
|
-
|
|
4423
|
-
|
|
4424
|
-
|
|
4425
|
-
|
|
4477
|
+
"purpose": "Production modal containing a PanelHeader, navigable record master list, and ValueTable detail.",
|
|
4478
|
+
"uses": [
|
|
4479
|
+
"panel-header",
|
|
4480
|
+
"menu-header",
|
|
4481
|
+
"menu-item",
|
|
4482
|
+
"value-table",
|
|
4483
|
+
"wa-dialog",
|
|
4484
|
+
"wa-button"
|
|
4485
|
+
],
|
|
4486
|
+
"useWhen": [
|
|
4487
|
+
"A focused task compares several records without leaving the current workspace."
|
|
4488
|
+
],
|
|
4489
|
+
"avoidWhen": [
|
|
4490
|
+
"Use a page when the task needs a durable route or substantially more working space."
|
|
4491
|
+
],
|
|
4492
|
+
"appOwns": [
|
|
4493
|
+
"open state",
|
|
4494
|
+
"selected record",
|
|
4495
|
+
"dismiss policy",
|
|
4496
|
+
"record actions"
|
|
4497
|
+
],
|
|
4498
|
+
"accessibility": [
|
|
4499
|
+
"Web Awesome owns modal focus and Escape; the application adapter restores the invoking control after hide, and PanelHeader supplies the visible hierarchy."
|
|
4500
|
+
],
|
|
4501
|
+
"delivery": {
|
|
4502
|
+
"sideEffects": [
|
|
4503
|
+
"lazy-recipe-css",
|
|
4504
|
+
"individual-custom-element-registration"
|
|
4505
|
+
]
|
|
4506
|
+
},
|
|
4507
|
+
"links": {
|
|
4508
|
+
"catalogRoute": "?component=recipe-master-detail-dialog",
|
|
4509
|
+
"documentation": "docs/recipes.md#master-detail-dialog",
|
|
4510
|
+
"recipe": "docs/recipes.md#master-detail-dialog"
|
|
4511
|
+
}
|
|
4426
4512
|
},
|
|
4427
4513
|
{
|
|
4428
4514
|
"id": "recipe-composer-form",
|
|
@@ -4430,14 +4516,42 @@
|
|
|
4430
4516
|
"category": "Recipes",
|
|
4431
4517
|
"kind": "recipe",
|
|
4432
4518
|
"source": "kerf",
|
|
4433
|
-
"purpose": "One visible publishing-form surface with
|
|
4434
|
-
"uses": [
|
|
4435
|
-
|
|
4436
|
-
|
|
4437
|
-
|
|
4438
|
-
|
|
4439
|
-
|
|
4440
|
-
|
|
4519
|
+
"purpose": "One visible publishing-form surface with PanelHeader hierarchy, fields and actions on the shared 8px control gutter, 24px major rhythm, and a conditional StateBanner as its only nested semantic surface.",
|
|
4520
|
+
"uses": [
|
|
4521
|
+
"panel-header",
|
|
4522
|
+
"select",
|
|
4523
|
+
"state-banner",
|
|
4524
|
+
"wa-input",
|
|
4525
|
+
"wa-textarea",
|
|
4526
|
+
"wa-button",
|
|
4527
|
+
"layout"
|
|
4528
|
+
],
|
|
4529
|
+
"useWhen": [
|
|
4530
|
+
"A short form needs one coherent surface, consistent field/action rhythm, and persistent validation feedback."
|
|
4531
|
+
],
|
|
4532
|
+
"avoidWhen": [
|
|
4533
|
+
"Do not turn each form section into another visible card or use the recipe as a generic form engine or transport abstraction."
|
|
4534
|
+
],
|
|
4535
|
+
"appOwns": [
|
|
4536
|
+
"validation rules",
|
|
4537
|
+
"draft persistence",
|
|
4538
|
+
"permissions",
|
|
4539
|
+
"transport"
|
|
4540
|
+
],
|
|
4541
|
+
"accessibility": [
|
|
4542
|
+
"The form references PanelHeader's title and summary ids; production fields own labels and help; invalid submission creates an assertive persistent StateBanner while successful submission creates a polite persistent banner."
|
|
4543
|
+
],
|
|
4544
|
+
"delivery": {
|
|
4545
|
+
"sideEffects": [
|
|
4546
|
+
"lazy-recipe-css",
|
|
4547
|
+
"individual-custom-element-registration"
|
|
4548
|
+
]
|
|
4549
|
+
},
|
|
4550
|
+
"links": {
|
|
4551
|
+
"catalogRoute": "?component=recipe-composer-form",
|
|
4552
|
+
"documentation": "docs/recipes.md#composer-form",
|
|
4553
|
+
"recipe": "docs/recipes.md#composer-form"
|
|
4554
|
+
}
|
|
4441
4555
|
},
|
|
4442
4556
|
{
|
|
4443
4557
|
"id": "recipe-list-workspace-states",
|
|
@@ -4446,13 +4560,38 @@
|
|
|
4446
4560
|
"kind": "recipe",
|
|
4447
4561
|
"source": "kerf",
|
|
4448
4562
|
"purpose": "Deterministic loading, empty, populated, stale refresh, and error states around one stable list workspace.",
|
|
4449
|
-
"uses": [
|
|
4450
|
-
|
|
4451
|
-
|
|
4452
|
-
|
|
4453
|
-
|
|
4454
|
-
|
|
4455
|
-
|
|
4563
|
+
"uses": [
|
|
4564
|
+
"panel-header",
|
|
4565
|
+
"state-banner",
|
|
4566
|
+
"empty-state",
|
|
4567
|
+
"loading-spinner",
|
|
4568
|
+
"layout"
|
|
4569
|
+
],
|
|
4570
|
+
"useWhen": [
|
|
4571
|
+
"A list surface must communicate initial load, absence, background refresh, failure, and recovery."
|
|
4572
|
+
],
|
|
4573
|
+
"avoidWhen": [
|
|
4574
|
+
"Do not replace domain rows with a generic component or use transient toasts as the only error record."
|
|
4575
|
+
],
|
|
4576
|
+
"appOwns": [
|
|
4577
|
+
"fetching",
|
|
4578
|
+
"cache age",
|
|
4579
|
+
"retry policy",
|
|
4580
|
+
"domain rows"
|
|
4581
|
+
],
|
|
4582
|
+
"accessibility": [
|
|
4583
|
+
"Busy, polite, and assertive states use the appropriate production feedback semantics."
|
|
4584
|
+
],
|
|
4585
|
+
"delivery": {
|
|
4586
|
+
"sideEffects": [
|
|
4587
|
+
"lazy-recipe-css"
|
|
4588
|
+
]
|
|
4589
|
+
},
|
|
4590
|
+
"links": {
|
|
4591
|
+
"catalogRoute": "?component=recipe-list-workspace-states",
|
|
4592
|
+
"documentation": "docs/recipes.md#list-workspace-states",
|
|
4593
|
+
"recipe": "docs/recipes.md#list-workspace-states"
|
|
4594
|
+
}
|
|
4456
4595
|
},
|
|
4457
4596
|
{
|
|
4458
4597
|
"id": "recipe-compact-toolbar",
|
|
@@ -4461,13 +4600,79 @@
|
|
|
4461
4600
|
"kind": "recipe",
|
|
4462
4601
|
"source": "kerf",
|
|
4463
4602
|
"purpose": "A compact toolbar that distinguishes grouped commands, a visible exclusive choice, a longer Select, and one ordinary action.",
|
|
4464
|
-
"uses": [
|
|
4465
|
-
|
|
4466
|
-
|
|
4467
|
-
|
|
4468
|
-
|
|
4469
|
-
|
|
4470
|
-
|
|
4603
|
+
"uses": [
|
|
4604
|
+
"toolbar",
|
|
4605
|
+
"toolbar-text",
|
|
4606
|
+
"toolbar-control-group",
|
|
4607
|
+
"segmented-control",
|
|
4608
|
+
"select",
|
|
4609
|
+
"lucide-icon"
|
|
4610
|
+
],
|
|
4611
|
+
"useWhen": [
|
|
4612
|
+
"A dense workspace toolbar mixes a few distinct control semantics."
|
|
4613
|
+
],
|
|
4614
|
+
"avoidWhen": [
|
|
4615
|
+
"Do not group unrelated actions or use buttons to imitate selection controls."
|
|
4616
|
+
],
|
|
4617
|
+
"appOwns": [
|
|
4618
|
+
"controlled values",
|
|
4619
|
+
"actions",
|
|
4620
|
+
"persistence",
|
|
4621
|
+
"responsive priority"
|
|
4622
|
+
],
|
|
4623
|
+
"accessibility": [
|
|
4624
|
+
"Each control retains its own native name, pressed/value state, and keyboard contract."
|
|
4625
|
+
],
|
|
4626
|
+
"delivery": {
|
|
4627
|
+
"sideEffects": [
|
|
4628
|
+
"lazy-recipe-css",
|
|
4629
|
+
"individual-custom-element-registration"
|
|
4630
|
+
]
|
|
4631
|
+
},
|
|
4632
|
+
"links": {
|
|
4633
|
+
"catalogRoute": "?component=recipe-compact-toolbar",
|
|
4634
|
+
"documentation": "docs/recipes.md#compact-toolbar-choices-and-actions",
|
|
4635
|
+
"recipe": "docs/recipes.md#compact-toolbar-choices-and-actions"
|
|
4636
|
+
}
|
|
4637
|
+
},
|
|
4638
|
+
{
|
|
4639
|
+
"id": "recipe-navigation-stack",
|
|
4640
|
+
"name": "Navigation stack",
|
|
4641
|
+
"category": "Recipes",
|
|
4642
|
+
"kind": "recipe",
|
|
4643
|
+
"source": "kerf",
|
|
4644
|
+
"purpose": "A push/pop navigation stack drill-down with animated slides and a live device class.",
|
|
4645
|
+
"uses": [
|
|
4646
|
+
"menu-header",
|
|
4647
|
+
"menu-item",
|
|
4648
|
+
"lucide-icon",
|
|
4649
|
+
"layout"
|
|
4650
|
+
],
|
|
4651
|
+
"useWhen": [
|
|
4652
|
+
"A flow drills from a list into detail and back on one pane, at any device size or inside a dialog."
|
|
4653
|
+
],
|
|
4654
|
+
"avoidWhen": [
|
|
4655
|
+
"Use SplitView when a list and its detail should show together on roomy classes."
|
|
4656
|
+
],
|
|
4657
|
+
"appOwns": [
|
|
4658
|
+
"the stack (a signal of views)",
|
|
4659
|
+
"selection",
|
|
4660
|
+
"routing",
|
|
4661
|
+
"data"
|
|
4662
|
+
],
|
|
4663
|
+
"accessibility": [
|
|
4664
|
+
"The back control is a real button; reduced motion collapses the slide to instant."
|
|
4665
|
+
],
|
|
4666
|
+
"delivery": {
|
|
4667
|
+
"sideEffects": [
|
|
4668
|
+
"lazy-recipe-css"
|
|
4669
|
+
]
|
|
4670
|
+
},
|
|
4671
|
+
"links": {
|
|
4672
|
+
"catalogRoute": "?component=recipe-navigation-stack",
|
|
4673
|
+
"documentation": "docs/recipes.md#navigation-stack",
|
|
4674
|
+
"recipe": "docs/recipes.md#navigation-stack"
|
|
4675
|
+
}
|
|
4471
4676
|
}
|
|
4472
4677
|
]
|
|
4473
4678
|
}
|