@kerfjs/ui 5.0.0-beta.3 → 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 +12 -9
- package/ai/component-catalog.json +314 -172
- package/ai/public-api-signatures-v1.md +333 -26
- package/ai/skill.md +17 -9
- 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-action-row.css +6 -0
- package/dist/styles/menu-header.css +19 -2
- package/dist/styles/menu-item.css +5 -0
- 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 +37 -9
- package/docs/component-selection.md +57 -8
- package/docs/design-philosophy.md +23 -1
- package/docs/device-class.md +54 -0
- package/docs/layout.md +44 -8
- package/docs/nav-stack.md +47 -0
- package/docs/recipes.md +29 -9
- package/docs/split-view.md +49 -0
- package/docs/tab-scaffold.md +41 -0
- package/docs/ux-demo.md +11 -9
- 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 +5 -4
- 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 +40 -13
- 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 -26
|
@@ -244,25 +244,31 @@
|
|
|
244
244
|
"purpose": "Provide one reusable pane, toolbar, content stack, and content-item geometry across sidebars, main areas, and dialogs.",
|
|
245
245
|
"publicExports": [],
|
|
246
246
|
"useWhen": [
|
|
247
|
-
"Build sidebars, main areas, or dialogs from an unpadded pane with optional toolbar/footer and one content stack."
|
|
247
|
+
"Build sidebars, main areas, inspectors, or dialogs from an unpadded pane with optional toolbar/footer and one content stack.",
|
|
248
|
+
"Relocate a hidden pane's restore control into the adjacent main toolbar on the same logical edge."
|
|
248
249
|
],
|
|
249
250
|
"avoidWhen": [
|
|
250
|
-
"Do not pad the pane itself or add wrapper insets around children that already own content-item geometry."
|
|
251
|
+
"Do not pad the pane itself or add wrapper insets around children that already own content-item geometry.",
|
|
252
|
+
"Do not leave an empty icon-only rail after collapsing a pane."
|
|
251
253
|
],
|
|
252
254
|
"alternatives": [],
|
|
253
255
|
"appOwns": [
|
|
254
256
|
"layout hierarchy",
|
|
255
257
|
"reading width",
|
|
256
|
-
"responsive relocation"
|
|
258
|
+
"responsive relocation",
|
|
259
|
+
"pane visibility and matching collapse/restore controls"
|
|
257
260
|
],
|
|
258
261
|
"variants": [
|
|
259
262
|
"toolbar + content",
|
|
260
263
|
"toolbar + content + footer",
|
|
261
264
|
"rounded content item",
|
|
262
|
-
"pill content item"
|
|
265
|
+
"pill content item",
|
|
266
|
+
"hidden inline-start pane restored from main-toolbar leading",
|
|
267
|
+
"hidden inline-end pane restored from main-toolbar trailing"
|
|
263
268
|
],
|
|
264
269
|
"accessibility": [
|
|
265
|
-
"Keep reading and focus order coherent when controls wrap or panes relocate, and preserve one scroll owner per pane."
|
|
270
|
+
"Keep reading and focus order coherent when controls wrap or panes relocate, and preserve one scroll owner per pane.",
|
|
271
|
+
"When collapse replaces one control with its counterpart in another toolbar, move focus to the newly rendered restore or collapse control."
|
|
266
272
|
],
|
|
267
273
|
"delivery": {
|
|
268
274
|
"manualCssImport": "@kerfjs/ui/layout.css",
|
|
@@ -322,11 +328,7 @@
|
|
|
322
328
|
],
|
|
323
329
|
"alternatives": [
|
|
324
330
|
{
|
|
325
|
-
"id": "
|
|
326
|
-
"relationship": "nearest"
|
|
327
|
-
},
|
|
328
|
-
{
|
|
329
|
-
"id": "dialog-header",
|
|
331
|
+
"id": "panel-header",
|
|
330
332
|
"relationship": "nearest"
|
|
331
333
|
}
|
|
332
334
|
],
|
|
@@ -472,7 +474,7 @@
|
|
|
472
474
|
],
|
|
473
475
|
"alternatives": [
|
|
474
476
|
{
|
|
475
|
-
"id": "
|
|
477
|
+
"id": "panel-header",
|
|
476
478
|
"relationship": "nearest"
|
|
477
479
|
}
|
|
478
480
|
],
|
|
@@ -518,8 +520,7 @@
|
|
|
518
520
|
"source": "kerf",
|
|
519
521
|
"description": "Page, dialog, and definition-list hierarchy.",
|
|
520
522
|
"uses": [
|
|
521
|
-
"
|
|
522
|
-
"dialog-header",
|
|
523
|
+
"panel-header",
|
|
523
524
|
"value-table"
|
|
524
525
|
],
|
|
525
526
|
"purpose": "Page, dialog, and definition-list hierarchy.",
|
|
@@ -536,11 +537,7 @@
|
|
|
536
537
|
"relationship": "nearest"
|
|
537
538
|
},
|
|
538
539
|
{
|
|
539
|
-
"id": "
|
|
540
|
-
"relationship": "nearest"
|
|
541
|
-
},
|
|
542
|
-
{
|
|
543
|
-
"id": "dialog-header",
|
|
540
|
+
"id": "panel-header",
|
|
544
541
|
"relationship": "nearest"
|
|
545
542
|
}
|
|
546
543
|
],
|
|
@@ -572,96 +569,31 @@
|
|
|
572
569
|
}
|
|
573
570
|
},
|
|
574
571
|
{
|
|
575
|
-
"id": "
|
|
576
|
-
"name": "
|
|
572
|
+
"id": "panel-header",
|
|
573
|
+
"name": "PanelHeader",
|
|
577
574
|
"category": "Structure",
|
|
578
575
|
"kind": "component",
|
|
579
576
|
"source": "kerf",
|
|
580
|
-
"description": "
|
|
581
|
-
"uses": [],
|
|
582
|
-
"purpose": "Page identity with an optional trailing action.",
|
|
583
|
-
"publicExports": [
|
|
584
|
-
"PageHeader"
|
|
585
|
-
],
|
|
586
|
-
"useWhen": [
|
|
587
|
-
"Identify a page with its primary heading and optional trailing action."
|
|
588
|
-
],
|
|
589
|
-
"avoidWhen": [
|
|
590
|
-
"Do not use for persistent app chrome or a modal task."
|
|
591
|
-
],
|
|
592
|
-
"alternatives": [
|
|
593
|
-
{
|
|
594
|
-
"id": "toolbar",
|
|
595
|
-
"relationship": "nearest"
|
|
596
|
-
},
|
|
597
|
-
{
|
|
598
|
-
"id": "dialog-header",
|
|
599
|
-
"relationship": "nearest"
|
|
600
|
-
}
|
|
601
|
-
],
|
|
602
|
-
"appOwns": [
|
|
603
|
-
"title",
|
|
604
|
-
"action",
|
|
605
|
-
"responsive placement"
|
|
606
|
-
],
|
|
607
|
-
"variants": [
|
|
608
|
-
"title",
|
|
609
|
-
"title with action"
|
|
610
|
-
],
|
|
611
|
-
"accessibility": [
|
|
612
|
-
"Use once for the page primary heading."
|
|
613
|
-
],
|
|
614
|
-
"delivery": {
|
|
615
|
-
"browserImport": "@kerfjs/ui/page-header",
|
|
616
|
-
"manualCssImport": "@kerfjs/ui/page-header.css",
|
|
617
|
-
"sideEffects": [
|
|
618
|
-
"browser-condition-css"
|
|
619
|
-
]
|
|
620
|
-
},
|
|
621
|
-
"wiring": [],
|
|
622
|
-
"publicClasses": [
|
|
623
|
-
"kui-page-header",
|
|
624
|
-
"kui-page-header__action"
|
|
625
|
-
],
|
|
626
|
-
"publicTokens": [
|
|
627
|
-
"--kui-color-text",
|
|
628
|
-
"--kui-font-2xl",
|
|
629
|
-
"--kui-font-l",
|
|
630
|
-
"--kui-page-header-background",
|
|
631
|
-
"--kui-page-header-border",
|
|
632
|
-
"--kui-page-header-foreground"
|
|
633
|
-
],
|
|
634
|
-
"links": {
|
|
635
|
-
"catalogRoute": "?component=page-header",
|
|
636
|
-
"documentation": "docs/component-selection.md",
|
|
637
|
-
"recipe": "docs/component-selection.md#ambiguous-choices"
|
|
638
|
-
}
|
|
639
|
-
},
|
|
640
|
-
{
|
|
641
|
-
"id": "dialog-header",
|
|
642
|
-
"name": "DialogHeader",
|
|
643
|
-
"category": "Structure",
|
|
644
|
-
"kind": "component",
|
|
645
|
-
"source": "kerf",
|
|
646
|
-
"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.",
|
|
647
578
|
"uses": [
|
|
648
579
|
"lucide-icon",
|
|
649
580
|
"toolbar",
|
|
650
|
-
"toolbar-control-group"
|
|
581
|
+
"toolbar-control-group",
|
|
582
|
+
"toolbar-text"
|
|
651
583
|
],
|
|
652
|
-
"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.",
|
|
653
585
|
"publicExports": [
|
|
654
|
-
"
|
|
586
|
+
"PanelHeader"
|
|
655
587
|
],
|
|
656
588
|
"useWhen": [
|
|
657
|
-
"
|
|
589
|
+
"Give a panel, dialog, or page a heading with an extra-large title, optional icon and subtitle, and trailing actions."
|
|
658
590
|
],
|
|
659
591
|
"avoidWhen": [
|
|
660
|
-
"Do not use as
|
|
592
|
+
"Do not use it as persistent application chrome; use Toolbar. It supplies header structure, not modal behavior."
|
|
661
593
|
],
|
|
662
594
|
"alternatives": [
|
|
663
595
|
{
|
|
664
|
-
"id": "
|
|
596
|
+
"id": "toolbar",
|
|
665
597
|
"relationship": "nearest"
|
|
666
598
|
},
|
|
667
599
|
{
|
|
@@ -674,49 +606,41 @@
|
|
|
674
606
|
"focus lifecycle",
|
|
675
607
|
"dismissal",
|
|
676
608
|
"copy",
|
|
677
|
-
"
|
|
609
|
+
"the trailing action controls"
|
|
678
610
|
],
|
|
679
611
|
"variants": [
|
|
680
612
|
"title",
|
|
681
613
|
"optional summary",
|
|
682
614
|
"icon",
|
|
683
|
-
"actions"
|
|
684
|
-
"actionsLabel"
|
|
615
|
+
"actions"
|
|
685
616
|
],
|
|
686
617
|
"accessibility": [
|
|
687
|
-
"Connect the title id and any provided summary id to the dialog host.",
|
|
688
|
-
"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."
|
|
689
620
|
],
|
|
690
621
|
"delivery": {
|
|
691
|
-
"browserImport": "@kerfjs/ui/
|
|
692
|
-
"manualCssImport": "@kerfjs/ui/
|
|
622
|
+
"browserImport": "@kerfjs/ui/panel-header",
|
|
623
|
+
"manualCssImport": "@kerfjs/ui/panel-header.css",
|
|
693
624
|
"sideEffects": [
|
|
694
625
|
"browser-condition-css"
|
|
695
626
|
]
|
|
696
627
|
},
|
|
697
628
|
"wiring": [],
|
|
698
629
|
"publicClasses": [
|
|
699
|
-
"kui-
|
|
700
|
-
"kui-
|
|
701
|
-
"kui-
|
|
702
|
-
"kui-dialog-header__icon",
|
|
703
|
-
"kui-dialog-header__identity",
|
|
704
|
-
"kui-dialog-header__summary",
|
|
705
|
-
"kui-dialog-header__toolbar"
|
|
630
|
+
"kui-panel-header",
|
|
631
|
+
"kui-panel-header__icon",
|
|
632
|
+
"kui-panel-header__summary"
|
|
706
633
|
],
|
|
707
634
|
"publicTokens": [
|
|
708
635
|
"--kui-color-brand-fill-quiet",
|
|
709
636
|
"--kui-color-brand-on-quiet",
|
|
710
|
-
"--kui-color-text",
|
|
711
637
|
"--kui-color-text-quiet",
|
|
712
|
-
"--kui-
|
|
713
|
-
"--kui-
|
|
714
|
-
"--kui-
|
|
715
|
-
"--kui-font-l",
|
|
716
|
-
"--kui-radius-circle"
|
|
638
|
+
"--kui-panel-header-icon-background",
|
|
639
|
+
"--kui-panel-header-icon-border",
|
|
640
|
+
"--kui-panel-header-icon-foreground"
|
|
717
641
|
],
|
|
718
642
|
"links": {
|
|
719
|
-
"catalogRoute": "?component=
|
|
643
|
+
"catalogRoute": "?component=panel-header",
|
|
720
644
|
"documentation": "docs/component-selection.md",
|
|
721
645
|
"recipe": "docs/component-selection.md#ambiguous-choices"
|
|
722
646
|
}
|
|
@@ -875,11 +799,7 @@
|
|
|
875
799
|
],
|
|
876
800
|
"alternatives": [
|
|
877
801
|
{
|
|
878
|
-
"id": "
|
|
879
|
-
"relationship": "nearest"
|
|
880
|
-
},
|
|
881
|
-
{
|
|
882
|
-
"id": "dialog-header",
|
|
802
|
+
"id": "panel-header",
|
|
883
803
|
"relationship": "nearest"
|
|
884
804
|
}
|
|
885
805
|
],
|
|
@@ -1427,7 +1347,7 @@
|
|
|
1427
1347
|
"tokens",
|
|
1428
1348
|
"query execution",
|
|
1429
1349
|
"results",
|
|
1430
|
-
"
|
|
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)"
|
|
1431
1351
|
],
|
|
1432
1352
|
"variants": [
|
|
1433
1353
|
"tokens",
|
|
@@ -1439,7 +1359,7 @@
|
|
|
1439
1359
|
"Announce result changes when useful and keep tokens atomic during editing.",
|
|
1440
1360
|
"Keep leading and trailing controls aligned to the first text line while content wraps.",
|
|
1441
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.",
|
|
1442
|
-
"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."
|
|
1443
1363
|
],
|
|
1444
1364
|
"delivery": {
|
|
1445
1365
|
"browserImport": "@kerfjs/ui/token-search-field",
|
|
@@ -4365,13 +4285,42 @@
|
|
|
4365
4285
|
"kind": "recipe",
|
|
4366
4286
|
"source": "kerf",
|
|
4367
4287
|
"purpose": "Toolbar, navigation, content, and inspector shell with controlled resizing and explicit pane scroll owners.",
|
|
4368
|
-
"uses": [
|
|
4369
|
-
|
|
4370
|
-
|
|
4371
|
-
|
|
4372
|
-
|
|
4373
|
-
|
|
4374
|
-
|
|
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
|
+
}
|
|
4375
4324
|
},
|
|
4376
4325
|
{
|
|
4377
4326
|
"id": "recipe-navigation-sidebar",
|
|
@@ -4380,13 +4329,37 @@
|
|
|
4380
4329
|
"kind": "recipe",
|
|
4381
4330
|
"source": "kerf",
|
|
4382
4331
|
"purpose": "Navigation sections with icon and iconless rows, a content-item surface, disclosure, and pane footer actions.",
|
|
4383
|
-
"uses": [
|
|
4384
|
-
|
|
4385
|
-
|
|
4386
|
-
|
|
4387
|
-
|
|
4388
|
-
|
|
4389
|
-
"
|
|
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
|
+
}
|
|
4390
4363
|
},
|
|
4391
4364
|
{
|
|
4392
4365
|
"id": "recipe-workspace-header",
|
|
@@ -4395,13 +4368,36 @@
|
|
|
4395
4368
|
"kind": "recipe",
|
|
4396
4369
|
"source": "kerf",
|
|
4397
4370
|
"purpose": "Page identity with primary, secondary, and overflow actions that relocate at narrow widths.",
|
|
4398
|
-
"uses": [
|
|
4399
|
-
|
|
4400
|
-
|
|
4401
|
-
|
|
4402
|
-
|
|
4403
|
-
"
|
|
4404
|
-
|
|
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
|
+
}
|
|
4405
4401
|
},
|
|
4406
4402
|
{
|
|
4407
4403
|
"id": "recipe-master-detail-dialog",
|
|
@@ -4409,14 +4405,41 @@
|
|
|
4409
4405
|
"category": "Recipes",
|
|
4410
4406
|
"kind": "recipe",
|
|
4411
4407
|
"source": "kerf",
|
|
4412
|
-
"purpose": "Production modal containing a
|
|
4413
|
-
"uses": [
|
|
4414
|
-
|
|
4415
|
-
|
|
4416
|
-
|
|
4417
|
-
|
|
4418
|
-
|
|
4419
|
-
|
|
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
|
+
}
|
|
4420
4443
|
},
|
|
4421
4444
|
{
|
|
4422
4445
|
"id": "recipe-composer-form",
|
|
@@ -4424,14 +4447,42 @@
|
|
|
4424
4447
|
"category": "Recipes",
|
|
4425
4448
|
"kind": "recipe",
|
|
4426
4449
|
"source": "kerf",
|
|
4427
|
-
"purpose": "One visible publishing-form surface with
|
|
4428
|
-
"uses": [
|
|
4429
|
-
|
|
4430
|
-
|
|
4431
|
-
|
|
4432
|
-
|
|
4433
|
-
|
|
4434
|
-
|
|
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
|
+
}
|
|
4435
4486
|
},
|
|
4436
4487
|
{
|
|
4437
4488
|
"id": "recipe-list-workspace-states",
|
|
@@ -4440,13 +4491,38 @@
|
|
|
4440
4491
|
"kind": "recipe",
|
|
4441
4492
|
"source": "kerf",
|
|
4442
4493
|
"purpose": "Deterministic loading, empty, populated, stale refresh, and error states around one stable list workspace.",
|
|
4443
|
-
"uses": [
|
|
4444
|
-
|
|
4445
|
-
|
|
4446
|
-
|
|
4447
|
-
|
|
4448
|
-
|
|
4449
|
-
|
|
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
|
+
}
|
|
4450
4526
|
},
|
|
4451
4527
|
{
|
|
4452
4528
|
"id": "recipe-compact-toolbar",
|
|
@@ -4455,13 +4531,79 @@
|
|
|
4455
4531
|
"kind": "recipe",
|
|
4456
4532
|
"source": "kerf",
|
|
4457
4533
|
"purpose": "A compact toolbar that distinguishes grouped commands, a visible exclusive choice, a longer Select, and one ordinary action.",
|
|
4458
|
-
"uses": [
|
|
4459
|
-
|
|
4460
|
-
|
|
4461
|
-
|
|
4462
|
-
|
|
4463
|
-
|
|
4464
|
-
|
|
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
|
+
}
|
|
4465
4607
|
}
|
|
4466
4608
|
]
|
|
4467
4609
|
}
|