@kerfjs/ui 5.0.0-beta.4 → 5.0.0-beta.6
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 +8 -8
- package/ai/component-catalog.json +303 -167
- package/ai/public-api-signatures-v1.md +333 -26
- package/ai/skill.md +14 -7
- package/ai/webawesome-jsx-signatures-v1.md +1 -1
- package/dist/browser/{dialog-header.js → panel-header.js} +3 -2
- package/dist/{chunk-GY5WH7TO.js → chunk-24Z2XE6C.js} +3 -3
- package/dist/chunk-24Z2XE6C.js.map +1 -0
- package/dist/chunk-2RJBFNB6.js +172 -0
- package/dist/chunk-2RJBFNB6.js.map +1 -0
- package/dist/chunk-KZKSBUKC.js +19 -0
- package/dist/chunk-KZKSBUKC.js.map +1 -0
- package/dist/chunk-RBTVBGRD.js +23 -0
- package/dist/chunk-RBTVBGRD.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 +2 -3
- package/dist/index.js +8 -9
- package/dist/nav-stack.d.ts +38 -0
- package/dist/nav-stack.js +4 -0
- package/dist/nav-stack.js.map +1 -0
- package/dist/panel-header.d.ts +26 -0
- package/dist/panel-header.js +6 -0
- package/dist/panel-header.js.map +1 -0
- package/dist/split-view.d.ts +42 -0
- package/dist/split-view.js +20 -0
- package/dist/split-view.js.map +1 -0
- 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 +59 -0
- package/dist/styles/split-view.css +35 -0
- package/dist/styles/styles.css +1 -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 +4 -2
- package/dist/toolbar-text.js +1 -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 +34 -9
- package/docs/component-selection.md +56 -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 +107 -43
- package/package.json +37 -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/page-header.js +0 -3
- package/dist/chunk-2PES33HS.js +0 -13
- package/dist/chunk-2PES33HS.js.map +0 -1
- 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/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
package/README.md
CHANGED
|
@@ -8,7 +8,7 @@ For connective application patterns, use the seven [production composition
|
|
|
8
8
|
recipes](./docs/recipes.md). Each has a stable catalog route, runnable state,
|
|
9
9
|
public-subpath source, semantic layout ownership, and explicit application
|
|
10
10
|
customization boundaries. The composer recipe demonstrates one coherent form
|
|
11
|
-
surface with `
|
|
11
|
+
surface with `PanelHeader` hierarchy and field/action controls aligned to the
|
|
12
12
|
shared 8px gutter; only persistent feedback adds a nested semantic
|
|
13
13
|
`StateBanner` surface.
|
|
14
14
|
|
|
@@ -108,7 +108,6 @@ as a `New` marker.
|
|
|
108
108
|
| `AppTab` | `@kerfjs/ui/app-tab` | `@kerfjs/ui/app-tab.css` |
|
|
109
109
|
| `TabBar` | `@kerfjs/ui/tab-bar` | `@kerfjs/ui/tab-bar.css` |
|
|
110
110
|
| `wireTabBars`, `reorderTabs` | `@kerfjs/ui/wire-tab-bars` | — |
|
|
111
|
-
| `PageHeader` | `@kerfjs/ui/page-header` | `@kerfjs/ui/page-header.css` |
|
|
112
111
|
| `LoadingSpinner` | `@kerfjs/ui/loading-spinner` | `@kerfjs/ui/loading-spinner.css` |
|
|
113
112
|
| `Select` | `@kerfjs/ui/select` | `@kerfjs/ui/select.css` |
|
|
114
113
|
| `SegmentedControl` | `@kerfjs/ui/segmented-control` | `@kerfjs/ui/segmented-control.css` |
|
|
@@ -116,14 +115,15 @@ as a `New` marker.
|
|
|
116
115
|
| `wireTokenSearchFields` | `@kerfjs/ui/wire-token-search-fields` | — |
|
|
117
116
|
| `StateBanner` | `@kerfjs/ui/state-banner` | `@kerfjs/ui/state-banner.css` |
|
|
118
117
|
| `EmptyState` | `@kerfjs/ui/empty-state` | `@kerfjs/ui/empty-state.css` |
|
|
119
|
-
| `
|
|
118
|
+
| `PanelHeader` | `@kerfjs/ui/panel-header` | `@kerfjs/ui/panel-header.css` |
|
|
120
119
|
| `ValueTable`, `ValueTableRow` | `@kerfjs/ui/value-table` | `@kerfjs/ui/value-table.css` |
|
|
121
120
|
|
|
122
|
-
`
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
121
|
+
`PanelHeader` is a plain `Toolbar` used as a panel, dialog, or page heading: an
|
|
122
|
+
optional icon control group (given a brand fill with a matching border), the
|
|
123
|
+
title as extra-large `ToolbarText`, the app's trailing action controls, and an
|
|
124
|
+
optional subtitle on a separate row below the title. It overrides no toolbar
|
|
125
|
+
styles — the app passes its own trailing controls (typically a
|
|
126
|
+
`ToolbarControlGroup`).
|
|
127
127
|
|
|
128
128
|
`DisclosureArrow` defaults to an 18px root-scaled decorative visual. Override
|
|
129
129
|
`--kui-disclosure-arrow-size` at the narrowest useful scope when a consumer
|
|
@@ -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
|
],
|
|
@@ -524,8 +520,7 @@
|
|
|
524
520
|
"source": "kerf",
|
|
525
521
|
"description": "Page, dialog, and definition-list hierarchy.",
|
|
526
522
|
"uses": [
|
|
527
|
-
"
|
|
528
|
-
"dialog-header",
|
|
523
|
+
"panel-header",
|
|
529
524
|
"value-table"
|
|
530
525
|
],
|
|
531
526
|
"purpose": "Page, dialog, and definition-list hierarchy.",
|
|
@@ -542,11 +537,7 @@
|
|
|
542
537
|
"relationship": "nearest"
|
|
543
538
|
},
|
|
544
539
|
{
|
|
545
|
-
"id": "
|
|
546
|
-
"relationship": "nearest"
|
|
547
|
-
},
|
|
548
|
-
{
|
|
549
|
-
"id": "dialog-header",
|
|
540
|
+
"id": "panel-header",
|
|
550
541
|
"relationship": "nearest"
|
|
551
542
|
}
|
|
552
543
|
],
|
|
@@ -578,96 +569,31 @@
|
|
|
578
569
|
}
|
|
579
570
|
},
|
|
580
571
|
{
|
|
581
|
-
"id": "
|
|
582
|
-
"name": "
|
|
572
|
+
"id": "panel-header",
|
|
573
|
+
"name": "PanelHeader",
|
|
583
574
|
"category": "Structure",
|
|
584
575
|
"kind": "component",
|
|
585
576
|
"source": "kerf",
|
|
586
|
-
"description": "
|
|
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",
|
|
649
|
-
"category": "Structure",
|
|
650
|
-
"kind": "component",
|
|
651
|
-
"source": "kerf",
|
|
652
|
-
"description": "Dialog toolbar with aligned icon, title, grouped actions, and a subtitle row.",
|
|
577
|
+
"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
578
|
"uses": [
|
|
654
579
|
"lucide-icon",
|
|
655
580
|
"toolbar",
|
|
656
|
-
"toolbar-control-group"
|
|
581
|
+
"toolbar-control-group",
|
|
582
|
+
"toolbar-text"
|
|
657
583
|
],
|
|
658
|
-
"purpose": "
|
|
584
|
+
"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
585
|
"publicExports": [
|
|
660
|
-
"
|
|
586
|
+
"PanelHeader"
|
|
661
587
|
],
|
|
662
588
|
"useWhen": [
|
|
663
|
-
"
|
|
589
|
+
"Give a panel, dialog, or page a heading with an extra-large title, optional icon and subtitle, and trailing actions."
|
|
664
590
|
],
|
|
665
591
|
"avoidWhen": [
|
|
666
|
-
"Do not use as
|
|
592
|
+
"Do not use it as persistent application chrome; use Toolbar. It supplies header structure, not modal behavior."
|
|
667
593
|
],
|
|
668
594
|
"alternatives": [
|
|
669
595
|
{
|
|
670
|
-
"id": "
|
|
596
|
+
"id": "toolbar",
|
|
671
597
|
"relationship": "nearest"
|
|
672
598
|
},
|
|
673
599
|
{
|
|
@@ -680,49 +606,41 @@
|
|
|
680
606
|
"focus lifecycle",
|
|
681
607
|
"dismissal",
|
|
682
608
|
"copy",
|
|
683
|
-
"
|
|
609
|
+
"the trailing action controls"
|
|
684
610
|
],
|
|
685
611
|
"variants": [
|
|
686
612
|
"title",
|
|
687
613
|
"optional summary",
|
|
688
614
|
"icon",
|
|
689
|
-
"actions"
|
|
690
|
-
"actionsLabel"
|
|
615
|
+
"actions"
|
|
691
616
|
],
|
|
692
617
|
"accessibility": [
|
|
693
|
-
"Connect the title id and any provided summary id to the dialog host.",
|
|
694
|
-
"Pass a
|
|
618
|
+
"Connect the title id and any provided summary id to the dialog or panel host.",
|
|
619
|
+
"Pass the trailing actions as a labeled ToolbarControlGroup when the group needs an accessible name."
|
|
695
620
|
],
|
|
696
621
|
"delivery": {
|
|
697
|
-
"browserImport": "@kerfjs/ui/
|
|
698
|
-
"manualCssImport": "@kerfjs/ui/
|
|
622
|
+
"browserImport": "@kerfjs/ui/panel-header",
|
|
623
|
+
"manualCssImport": "@kerfjs/ui/panel-header.css",
|
|
699
624
|
"sideEffects": [
|
|
700
625
|
"browser-condition-css"
|
|
701
626
|
]
|
|
702
627
|
},
|
|
703
628
|
"wiring": [],
|
|
704
629
|
"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"
|
|
630
|
+
"kui-panel-header",
|
|
631
|
+
"kui-panel-header__icon",
|
|
632
|
+
"kui-panel-header__summary"
|
|
712
633
|
],
|
|
713
634
|
"publicTokens": [
|
|
714
635
|
"--kui-color-brand-fill-quiet",
|
|
715
636
|
"--kui-color-brand-on-quiet",
|
|
716
|
-
"--kui-color-text",
|
|
717
637
|
"--kui-color-text-quiet",
|
|
718
|
-
"--kui-
|
|
719
|
-
"--kui-
|
|
720
|
-
"--kui-
|
|
721
|
-
"--kui-font-l",
|
|
722
|
-
"--kui-radius-circle"
|
|
638
|
+
"--kui-panel-header-icon-background",
|
|
639
|
+
"--kui-panel-header-icon-border",
|
|
640
|
+
"--kui-panel-header-icon-foreground"
|
|
723
641
|
],
|
|
724
642
|
"links": {
|
|
725
|
-
"catalogRoute": "?component=
|
|
643
|
+
"catalogRoute": "?component=panel-header",
|
|
726
644
|
"documentation": "docs/component-selection.md",
|
|
727
645
|
"recipe": "docs/component-selection.md#ambiguous-choices"
|
|
728
646
|
}
|
|
@@ -881,11 +799,7 @@
|
|
|
881
799
|
],
|
|
882
800
|
"alternatives": [
|
|
883
801
|
{
|
|
884
|
-
"id": "
|
|
885
|
-
"relationship": "nearest"
|
|
886
|
-
},
|
|
887
|
-
{
|
|
888
|
-
"id": "dialog-header",
|
|
802
|
+
"id": "panel-header",
|
|
889
803
|
"relationship": "nearest"
|
|
890
804
|
}
|
|
891
805
|
],
|
|
@@ -1433,7 +1347,7 @@
|
|
|
1433
1347
|
"tokens",
|
|
1434
1348
|
"query execution",
|
|
1435
1349
|
"results",
|
|
1436
|
-
"
|
|
1350
|
+
"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
1351
|
],
|
|
1438
1352
|
"variants": [
|
|
1439
1353
|
"tokens",
|
|
@@ -1445,7 +1359,7 @@
|
|
|
1445
1359
|
"Announce result changes when useful and keep tokens atomic during editing.",
|
|
1446
1360
|
"Keep leading and trailing controls aligned to the first text line while content wraps.",
|
|
1447
1361
|
"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,
|
|
1362
|
+
"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
1363
|
],
|
|
1450
1364
|
"delivery": {
|
|
1451
1365
|
"browserImport": "@kerfjs/ui/token-search-field",
|
|
@@ -4371,13 +4285,42 @@
|
|
|
4371
4285
|
"kind": "recipe",
|
|
4372
4286
|
"source": "kerf",
|
|
4373
4287
|
"purpose": "Toolbar, navigation, content, and inspector shell with controlled resizing and explicit pane scroll owners.",
|
|
4374
|
-
"uses": [
|
|
4375
|
-
|
|
4376
|
-
|
|
4377
|
-
|
|
4378
|
-
|
|
4379
|
-
|
|
4380
|
-
|
|
4288
|
+
"uses": [
|
|
4289
|
+
"toolbar",
|
|
4290
|
+
"toolbar-text",
|
|
4291
|
+
"toolbar-control-group",
|
|
4292
|
+
"menu-header",
|
|
4293
|
+
"menu-item",
|
|
4294
|
+
"panel-header",
|
|
4295
|
+
"resize",
|
|
4296
|
+
"value-table",
|
|
4297
|
+
"layout"
|
|
4298
|
+
],
|
|
4299
|
+
"useWhen": [
|
|
4300
|
+
"A desktop workspace needs persistent chrome and user-adjustable navigation or inspector panes."
|
|
4301
|
+
],
|
|
4302
|
+
"avoidWhen": [
|
|
4303
|
+
"Use ordinary CSS grid when panes are static or the product does not need a user-operable separator."
|
|
4304
|
+
],
|
|
4305
|
+
"appOwns": [
|
|
4306
|
+
"routing",
|
|
4307
|
+
"pane visibility",
|
|
4308
|
+
"pane sizes and persistence",
|
|
4309
|
+
"workspace data"
|
|
4310
|
+
],
|
|
4311
|
+
"accessibility": [
|
|
4312
|
+
"Each pane has one scroll owner and each resize handle keeps its separator keyboard contract."
|
|
4313
|
+
],
|
|
4314
|
+
"delivery": {
|
|
4315
|
+
"sideEffects": [
|
|
4316
|
+
"lazy-recipe-css"
|
|
4317
|
+
]
|
|
4318
|
+
},
|
|
4319
|
+
"links": {
|
|
4320
|
+
"catalogRoute": "?component=recipe-app-shell",
|
|
4321
|
+
"documentation": "docs/recipes.md#desktop-application-shell",
|
|
4322
|
+
"recipe": "docs/recipes.md#desktop-application-shell"
|
|
4323
|
+
}
|
|
4381
4324
|
},
|
|
4382
4325
|
{
|
|
4383
4326
|
"id": "recipe-navigation-sidebar",
|
|
@@ -4386,13 +4329,37 @@
|
|
|
4386
4329
|
"kind": "recipe",
|
|
4387
4330
|
"source": "kerf",
|
|
4388
4331
|
"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
|
-
"
|
|
4332
|
+
"uses": [
|
|
4333
|
+
"menu-header",
|
|
4334
|
+
"menu-item",
|
|
4335
|
+
"toolbar",
|
|
4336
|
+
"toolbar-control-group"
|
|
4337
|
+
],
|
|
4338
|
+
"useWhen": [
|
|
4339
|
+
"A workspace sidebar needs the shared toolbar/content/footer pane model, 24px major section rhythm, and 44px row and utility-action targets."
|
|
4340
|
+
],
|
|
4341
|
+
"avoidWhen": [
|
|
4342
|
+
"Use ordinary links when menu selection, section, and sidebar anatomy do not apply."
|
|
4343
|
+
],
|
|
4344
|
+
"appOwns": [
|
|
4345
|
+
"information architecture",
|
|
4346
|
+
"routing",
|
|
4347
|
+
"permissions",
|
|
4348
|
+
"disclosure state"
|
|
4349
|
+
],
|
|
4350
|
+
"accessibility": [
|
|
4351
|
+
"Native buttons retain names, current state, sequential focus, and disclosure state; rows and standalone footer actions remain at least 44px tall."
|
|
4352
|
+
],
|
|
4353
|
+
"delivery": {
|
|
4354
|
+
"sideEffects": [
|
|
4355
|
+
"lazy-recipe-css"
|
|
4356
|
+
]
|
|
4357
|
+
},
|
|
4358
|
+
"links": {
|
|
4359
|
+
"catalogRoute": "?component=recipe-navigation-sidebar",
|
|
4360
|
+
"documentation": "docs/recipes.md#navigation-sidebar",
|
|
4361
|
+
"recipe": "docs/recipes.md#navigation-sidebar"
|
|
4362
|
+
}
|
|
4396
4363
|
},
|
|
4397
4364
|
{
|
|
4398
4365
|
"id": "recipe-workspace-header",
|
|
@@ -4401,13 +4368,36 @@
|
|
|
4401
4368
|
"kind": "recipe",
|
|
4402
4369
|
"source": "kerf",
|
|
4403
4370
|
"purpose": "Page identity with primary, secondary, and overflow actions that relocate at narrow widths.",
|
|
4404
|
-
"uses": [
|
|
4405
|
-
|
|
4406
|
-
|
|
4407
|
-
|
|
4408
|
-
|
|
4409
|
-
"
|
|
4410
|
-
|
|
4371
|
+
"uses": [
|
|
4372
|
+
"panel-header",
|
|
4373
|
+
"state-banner",
|
|
4374
|
+
"layout"
|
|
4375
|
+
],
|
|
4376
|
+
"useWhen": [
|
|
4377
|
+
"A workspace page needs one primary heading and a small prioritized action set."
|
|
4378
|
+
],
|
|
4379
|
+
"avoidWhen": [
|
|
4380
|
+
"Use Toolbar for persistent application chrome or PanelHeader for a focused modal task."
|
|
4381
|
+
],
|
|
4382
|
+
"appOwns": [
|
|
4383
|
+
"authorization",
|
|
4384
|
+
"command behavior",
|
|
4385
|
+
"breadcrumbs",
|
|
4386
|
+
"product copy"
|
|
4387
|
+
],
|
|
4388
|
+
"accessibility": [
|
|
4389
|
+
"Heading order and action focus order remain stable when controls wrap."
|
|
4390
|
+
],
|
|
4391
|
+
"delivery": {
|
|
4392
|
+
"sideEffects": [
|
|
4393
|
+
"lazy-recipe-css"
|
|
4394
|
+
]
|
|
4395
|
+
},
|
|
4396
|
+
"links": {
|
|
4397
|
+
"catalogRoute": "?component=recipe-workspace-header",
|
|
4398
|
+
"documentation": "docs/recipes.md#workspace-header",
|
|
4399
|
+
"recipe": "docs/recipes.md#workspace-header"
|
|
4400
|
+
}
|
|
4411
4401
|
},
|
|
4412
4402
|
{
|
|
4413
4403
|
"id": "recipe-master-detail-dialog",
|
|
@@ -4415,14 +4405,41 @@
|
|
|
4415
4405
|
"category": "Recipes",
|
|
4416
4406
|
"kind": "recipe",
|
|
4417
4407
|
"source": "kerf",
|
|
4418
|
-
"purpose": "Production modal containing a
|
|
4419
|
-
"uses": [
|
|
4420
|
-
|
|
4421
|
-
|
|
4422
|
-
|
|
4423
|
-
|
|
4424
|
-
|
|
4425
|
-
|
|
4408
|
+
"purpose": "Production modal containing a PanelHeader, navigable record master list, and ValueTable detail.",
|
|
4409
|
+
"uses": [
|
|
4410
|
+
"panel-header",
|
|
4411
|
+
"menu-header",
|
|
4412
|
+
"menu-item",
|
|
4413
|
+
"value-table",
|
|
4414
|
+
"wa-dialog",
|
|
4415
|
+
"wa-button"
|
|
4416
|
+
],
|
|
4417
|
+
"useWhen": [
|
|
4418
|
+
"A focused task compares several records without leaving the current workspace."
|
|
4419
|
+
],
|
|
4420
|
+
"avoidWhen": [
|
|
4421
|
+
"Use a page when the task needs a durable route or substantially more working space."
|
|
4422
|
+
],
|
|
4423
|
+
"appOwns": [
|
|
4424
|
+
"open state",
|
|
4425
|
+
"selected record",
|
|
4426
|
+
"dismiss policy",
|
|
4427
|
+
"record actions"
|
|
4428
|
+
],
|
|
4429
|
+
"accessibility": [
|
|
4430
|
+
"Web Awesome owns modal focus and Escape; the application adapter restores the invoking control after hide, and PanelHeader supplies the visible hierarchy."
|
|
4431
|
+
],
|
|
4432
|
+
"delivery": {
|
|
4433
|
+
"sideEffects": [
|
|
4434
|
+
"lazy-recipe-css",
|
|
4435
|
+
"individual-custom-element-registration"
|
|
4436
|
+
]
|
|
4437
|
+
},
|
|
4438
|
+
"links": {
|
|
4439
|
+
"catalogRoute": "?component=recipe-master-detail-dialog",
|
|
4440
|
+
"documentation": "docs/recipes.md#master-detail-dialog",
|
|
4441
|
+
"recipe": "docs/recipes.md#master-detail-dialog"
|
|
4442
|
+
}
|
|
4426
4443
|
},
|
|
4427
4444
|
{
|
|
4428
4445
|
"id": "recipe-composer-form",
|
|
@@ -4430,14 +4447,42 @@
|
|
|
4430
4447
|
"category": "Recipes",
|
|
4431
4448
|
"kind": "recipe",
|
|
4432
4449
|
"source": "kerf",
|
|
4433
|
-
"purpose": "One visible publishing-form surface with
|
|
4434
|
-
"uses": [
|
|
4435
|
-
|
|
4436
|
-
|
|
4437
|
-
|
|
4438
|
-
|
|
4439
|
-
|
|
4440
|
-
|
|
4450
|
+
"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.",
|
|
4451
|
+
"uses": [
|
|
4452
|
+
"panel-header",
|
|
4453
|
+
"select",
|
|
4454
|
+
"state-banner",
|
|
4455
|
+
"wa-input",
|
|
4456
|
+
"wa-textarea",
|
|
4457
|
+
"wa-button",
|
|
4458
|
+
"layout"
|
|
4459
|
+
],
|
|
4460
|
+
"useWhen": [
|
|
4461
|
+
"A short form needs one coherent surface, consistent field/action rhythm, and persistent validation feedback."
|
|
4462
|
+
],
|
|
4463
|
+
"avoidWhen": [
|
|
4464
|
+
"Do not turn each form section into another visible card or use the recipe as a generic form engine or transport abstraction."
|
|
4465
|
+
],
|
|
4466
|
+
"appOwns": [
|
|
4467
|
+
"validation rules",
|
|
4468
|
+
"draft persistence",
|
|
4469
|
+
"permissions",
|
|
4470
|
+
"transport"
|
|
4471
|
+
],
|
|
4472
|
+
"accessibility": [
|
|
4473
|
+
"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."
|
|
4474
|
+
],
|
|
4475
|
+
"delivery": {
|
|
4476
|
+
"sideEffects": [
|
|
4477
|
+
"lazy-recipe-css",
|
|
4478
|
+
"individual-custom-element-registration"
|
|
4479
|
+
]
|
|
4480
|
+
},
|
|
4481
|
+
"links": {
|
|
4482
|
+
"catalogRoute": "?component=recipe-composer-form",
|
|
4483
|
+
"documentation": "docs/recipes.md#composer-form",
|
|
4484
|
+
"recipe": "docs/recipes.md#composer-form"
|
|
4485
|
+
}
|
|
4441
4486
|
},
|
|
4442
4487
|
{
|
|
4443
4488
|
"id": "recipe-list-workspace-states",
|
|
@@ -4446,13 +4491,38 @@
|
|
|
4446
4491
|
"kind": "recipe",
|
|
4447
4492
|
"source": "kerf",
|
|
4448
4493
|
"purpose": "Deterministic loading, empty, populated, stale refresh, and error states around one stable list workspace.",
|
|
4449
|
-
"uses": [
|
|
4450
|
-
|
|
4451
|
-
|
|
4452
|
-
|
|
4453
|
-
|
|
4454
|
-
|
|
4455
|
-
|
|
4494
|
+
"uses": [
|
|
4495
|
+
"panel-header",
|
|
4496
|
+
"state-banner",
|
|
4497
|
+
"empty-state",
|
|
4498
|
+
"loading-spinner",
|
|
4499
|
+
"layout"
|
|
4500
|
+
],
|
|
4501
|
+
"useWhen": [
|
|
4502
|
+
"A list surface must communicate initial load, absence, background refresh, failure, and recovery."
|
|
4503
|
+
],
|
|
4504
|
+
"avoidWhen": [
|
|
4505
|
+
"Do not replace domain rows with a generic component or use transient toasts as the only error record."
|
|
4506
|
+
],
|
|
4507
|
+
"appOwns": [
|
|
4508
|
+
"fetching",
|
|
4509
|
+
"cache age",
|
|
4510
|
+
"retry policy",
|
|
4511
|
+
"domain rows"
|
|
4512
|
+
],
|
|
4513
|
+
"accessibility": [
|
|
4514
|
+
"Busy, polite, and assertive states use the appropriate production feedback semantics."
|
|
4515
|
+
],
|
|
4516
|
+
"delivery": {
|
|
4517
|
+
"sideEffects": [
|
|
4518
|
+
"lazy-recipe-css"
|
|
4519
|
+
]
|
|
4520
|
+
},
|
|
4521
|
+
"links": {
|
|
4522
|
+
"catalogRoute": "?component=recipe-list-workspace-states",
|
|
4523
|
+
"documentation": "docs/recipes.md#list-workspace-states",
|
|
4524
|
+
"recipe": "docs/recipes.md#list-workspace-states"
|
|
4525
|
+
}
|
|
4456
4526
|
},
|
|
4457
4527
|
{
|
|
4458
4528
|
"id": "recipe-compact-toolbar",
|
|
@@ -4461,13 +4531,79 @@
|
|
|
4461
4531
|
"kind": "recipe",
|
|
4462
4532
|
"source": "kerf",
|
|
4463
4533
|
"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
|
-
|
|
4534
|
+
"uses": [
|
|
4535
|
+
"toolbar",
|
|
4536
|
+
"toolbar-text",
|
|
4537
|
+
"toolbar-control-group",
|
|
4538
|
+
"segmented-control",
|
|
4539
|
+
"select",
|
|
4540
|
+
"lucide-icon"
|
|
4541
|
+
],
|
|
4542
|
+
"useWhen": [
|
|
4543
|
+
"A dense workspace toolbar mixes a few distinct control semantics."
|
|
4544
|
+
],
|
|
4545
|
+
"avoidWhen": [
|
|
4546
|
+
"Do not group unrelated actions or use buttons to imitate selection controls."
|
|
4547
|
+
],
|
|
4548
|
+
"appOwns": [
|
|
4549
|
+
"controlled values",
|
|
4550
|
+
"actions",
|
|
4551
|
+
"persistence",
|
|
4552
|
+
"responsive priority"
|
|
4553
|
+
],
|
|
4554
|
+
"accessibility": [
|
|
4555
|
+
"Each control retains its own native name, pressed/value state, and keyboard contract."
|
|
4556
|
+
],
|
|
4557
|
+
"delivery": {
|
|
4558
|
+
"sideEffects": [
|
|
4559
|
+
"lazy-recipe-css",
|
|
4560
|
+
"individual-custom-element-registration"
|
|
4561
|
+
]
|
|
4562
|
+
},
|
|
4563
|
+
"links": {
|
|
4564
|
+
"catalogRoute": "?component=recipe-compact-toolbar",
|
|
4565
|
+
"documentation": "docs/recipes.md#compact-toolbar-choices-and-actions",
|
|
4566
|
+
"recipe": "docs/recipes.md#compact-toolbar-choices-and-actions"
|
|
4567
|
+
}
|
|
4568
|
+
},
|
|
4569
|
+
{
|
|
4570
|
+
"id": "recipe-navigation-stack",
|
|
4571
|
+
"name": "Navigation stack",
|
|
4572
|
+
"category": "Recipes",
|
|
4573
|
+
"kind": "recipe",
|
|
4574
|
+
"source": "kerf",
|
|
4575
|
+
"purpose": "A push/pop navigation stack drill-down with animated slides and a live device class.",
|
|
4576
|
+
"uses": [
|
|
4577
|
+
"menu-header",
|
|
4578
|
+
"menu-item",
|
|
4579
|
+
"lucide-icon",
|
|
4580
|
+
"layout"
|
|
4581
|
+
],
|
|
4582
|
+
"useWhen": [
|
|
4583
|
+
"A flow drills from a list into detail and back on one pane, at any device size or inside a dialog."
|
|
4584
|
+
],
|
|
4585
|
+
"avoidWhen": [
|
|
4586
|
+
"Use SplitView when a list and its detail should show together on roomy classes."
|
|
4587
|
+
],
|
|
4588
|
+
"appOwns": [
|
|
4589
|
+
"the stack (a signal of views)",
|
|
4590
|
+
"selection",
|
|
4591
|
+
"routing",
|
|
4592
|
+
"data"
|
|
4593
|
+
],
|
|
4594
|
+
"accessibility": [
|
|
4595
|
+
"The back control is a real button; reduced motion collapses the slide to instant."
|
|
4596
|
+
],
|
|
4597
|
+
"delivery": {
|
|
4598
|
+
"sideEffects": [
|
|
4599
|
+
"lazy-recipe-css"
|
|
4600
|
+
]
|
|
4601
|
+
},
|
|
4602
|
+
"links": {
|
|
4603
|
+
"catalogRoute": "?component=recipe-navigation-stack",
|
|
4604
|
+
"documentation": "docs/recipes.md#navigation-stack",
|
|
4605
|
+
"recipe": "docs/recipes.md#navigation-stack"
|
|
4606
|
+
}
|
|
4471
4607
|
}
|
|
4472
4608
|
]
|
|
4473
4609
|
}
|