@kerfjs/ui 5.0.0-beta.24 → 5.0.0-beta.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (149) hide show
  1. package/README.md +44 -23
  2. package/ai/application-ui-diagnostic-ids-v1.json +3 -0
  3. package/ai/application-ui-profile.defaults.json +1 -1
  4. package/ai/compile-time-contracts-v1.json +3 -11
  5. package/ai/component-catalog-v2-overrides.json +7 -37
  6. package/ai/component-catalog-v2.d.ts +1 -0
  7. package/ai/component-catalog-v2.json +415 -91
  8. package/ai/component-catalog-v2.schema.json +2 -1
  9. package/ai/component-catalog.json +602 -158
  10. package/ai/public-api-signatures-v1.md +132 -65
  11. package/ai/skill.md +20 -20
  12. package/ai/webawesome-jsx-signatures-v1.md +2 -1
  13. package/analyzer/cli.mjs +5 -2
  14. package/analyzer/index.d.mts +1 -0
  15. package/analyzer/index.mjs +117 -10
  16. package/dist/app-tab.d.ts +10 -2
  17. package/dist/app-tab.js +1 -1
  18. package/dist/browser/list-action-row.js +1 -0
  19. package/dist/browser/list-item.js +1 -0
  20. package/dist/browser/surface-scaffold.js +3 -0
  21. package/dist/catalog.js +5 -4
  22. package/dist/catalog.js.map +1 -1
  23. package/dist/{chunk-FEAMR7S4.js → chunk-4EF2CMYS.js} +24 -5
  24. package/dist/chunk-4EF2CMYS.js.map +1 -0
  25. package/dist/{chunk-NWSEP5RT.js → chunk-FRVS5RFM.js} +23 -5
  26. package/dist/chunk-FRVS5RFM.js.map +1 -0
  27. package/dist/{chunk-PSKN344N.js → chunk-GWEAPEZI.js} +15 -2
  28. package/dist/chunk-GWEAPEZI.js.map +1 -0
  29. package/dist/chunk-HP2B2L26.js +102 -0
  30. package/dist/chunk-HP2B2L26.js.map +1 -0
  31. package/dist/{chunk-OJWWHFH3.js → chunk-JFGXQBIP.js} +49 -23
  32. package/dist/chunk-JFGXQBIP.js.map +1 -0
  33. package/dist/chunk-OBLTAKSX.js +43 -0
  34. package/dist/chunk-OBLTAKSX.js.map +1 -0
  35. package/dist/{chunk-Y45PPBDV.js → chunk-OT6RPYAP.js} +16 -2
  36. package/dist/chunk-OT6RPYAP.js.map +1 -0
  37. package/dist/{chunk-UFZKLBCF.js → chunk-VCE4MPVE.js} +25 -3
  38. package/dist/chunk-VCE4MPVE.js.map +1 -0
  39. package/dist/{chunk-5VTB2BKP.js → chunk-WNWD54GR.js} +16 -2
  40. package/dist/chunk-WNWD54GR.js.map +1 -0
  41. package/dist/{chunk-M7JBER5U.js → chunk-X2U3QJCJ.js} +8 -2
  42. package/dist/chunk-X2U3QJCJ.js.map +1 -0
  43. package/dist/{chunk-DPDBVKNA.js → chunk-YMKH5XTF.js} +5 -3
  44. package/dist/chunk-YMKH5XTF.js.map +1 -0
  45. package/dist/collapsible-panel.d.ts +9 -1
  46. package/dist/collapsible-panel.js +36 -15
  47. package/dist/collapsible-panel.js.map +1 -1
  48. package/dist/index.d.ts +2 -2
  49. package/dist/index.js +12 -12
  50. package/dist/list-action-row.d.ts +11 -1
  51. package/dist/list-action-row.js +2 -1
  52. package/dist/list-header.d.ts +15 -2
  53. package/dist/list-header.js +1 -1
  54. package/dist/list-item.d.ts +12 -1
  55. package/dist/list-item.js +2 -1
  56. package/dist/resizable-region.d.ts +19 -2
  57. package/dist/resizable-region.js +1 -1
  58. package/dist/select.d.ts +12 -1
  59. package/dist/select.js +1 -1
  60. package/dist/split-view.js +1 -1
  61. package/dist/styles/app-tab.css +26 -0
  62. package/dist/styles/collapsible-panel.css +66 -4
  63. package/dist/styles/list-action-row.css +64 -0
  64. package/dist/styles/list-header.css +32 -0
  65. package/dist/styles/list-item.css +39 -0
  66. package/dist/styles/resizable-region.css +132 -0
  67. package/dist/styles/select.css +68 -0
  68. package/dist/styles/styles.css +1 -1
  69. package/dist/styles/surface-scaffold.css +51 -0
  70. package/dist/styles/tab-bar.css +24 -0
  71. package/dist/styles/toolbar-control-group.css +73 -1
  72. package/dist/styles/toolbar-text.css +1 -1
  73. package/dist/styles/webawesome.css +12 -0
  74. package/dist/styles/workbench.css +89 -0
  75. package/dist/surface-scaffold.d.ts +25 -0
  76. package/dist/surface-scaffold.js +3 -0
  77. package/dist/surface-scaffold.js.map +1 -0
  78. package/dist/tab-bar.d.ts +11 -2
  79. package/dist/tab-bar.js +1 -1
  80. package/dist/toolbar-control-group.d.ts +16 -2
  81. package/dist/toolbar-control-group.js +1 -1
  82. package/dist/webawesome.d.ts +1 -0
  83. package/dist/wire-resizable-regions.js +1 -1
  84. package/dist/wire-sidebar.d.ts +6 -1
  85. package/dist/wire-sidebar.js +27 -8
  86. package/dist/wire-sidebar.js.map +1 -1
  87. package/dist/wire-token-search-fields.js +1 -1
  88. package/dist/workbench.d.ts +8 -0
  89. package/dist/workbench.js +42 -0
  90. package/dist/workbench.js.map +1 -1
  91. package/docs/accessibility.md +55 -12
  92. package/docs/collapsible-panel.md +7 -0
  93. package/docs/component-contract.md +5 -8
  94. package/docs/component-selection.md +63 -33
  95. package/docs/design/templates.md +5 -7
  96. package/docs/examples/component-catalog-extension-v2.json +3 -6
  97. package/docs/examples/component-catalog-extension.json +1 -1
  98. package/docs/layout.md +7 -9
  99. package/docs/recipes.md +8 -7
  100. package/docs/surface-scaffold.md +17 -0
  101. package/docs/type-contracts.md +6 -8
  102. package/docs/ui-analyzer.md +19 -1
  103. package/docs/ui-doctor.md +1 -1
  104. package/docs/ux-demo.md +6 -3
  105. package/docs/webawesome-theme.md +4 -1
  106. package/docs/workbench.md +49 -2
  107. package/doctor/eslint-diagnostics.d.mts +16 -0
  108. package/doctor/eslint-diagnostics.mjs +17 -0
  109. package/doctor/index.mjs +16 -1
  110. package/llms.txt +19 -9
  111. package/package.json +7 -7
  112. package/ux-demo/recipes/app-shell.tsx +36 -23
  113. package/ux-demo/recipes/collapsible-sidebar.tsx +22 -16
  114. package/ux-demo/recipes/composer-form.tsx +15 -6
  115. package/ux-demo/recipes/list-detail-dialog.tsx +31 -15
  116. package/ux-demo/recipes/list-workspace-states.tsx +16 -7
  117. package/ux-demo/recipes/loading-inspector.tsx +39 -18
  118. package/ux-demo/recipes/recipes.css +7 -2
  119. package/ux-demo/recipes/workspace-header.tsx +17 -7
  120. package/dist/browser/panel-header.js +0 -7
  121. package/dist/chunk-5VTB2BKP.js.map +0 -1
  122. package/dist/chunk-7XRDUG4Y.js +0 -58
  123. package/dist/chunk-7XRDUG4Y.js.map +0 -1
  124. package/dist/chunk-DPDBVKNA.js.map +0 -1
  125. package/dist/chunk-FEAMR7S4.js.map +0 -1
  126. package/dist/chunk-M7JBER5U.js.map +0 -1
  127. package/dist/chunk-NENBUYX5.js +0 -79
  128. package/dist/chunk-NENBUYX5.js.map +0 -1
  129. package/dist/chunk-NWSEP5RT.js.map +0 -1
  130. package/dist/chunk-OJWWHFH3.js.map +0 -1
  131. package/dist/chunk-PSKN344N.js.map +0 -1
  132. package/dist/chunk-UFZKLBCF.js.map +0 -1
  133. package/dist/chunk-Y45PPBDV.js.map +0 -1
  134. package/dist/panel-header.d.ts +0 -42
  135. package/dist/panel-header.js +0 -7
  136. package/dist/panel-header.js.map +0 -1
  137. package/dist/styles/panel-header.css +0 -64
  138. package/docs/design/templates/panel-header/icon-actions-dark.svg +0 -1
  139. package/docs/design/templates/panel-header/icon-actions.svg +0 -1
  140. package/docs/design/templates/panel-header/icon-summary-actions-dark.svg +0 -1
  141. package/docs/design/templates/panel-header/icon-summary-actions.svg +0 -1
  142. package/docs/design/templates/panel-header/no-icon-dark.svg +0 -1
  143. package/docs/design/templates/panel-header/no-icon.svg +0 -1
  144. package/docs/design/templates/panel-header/page-heading-dark.svg +0 -1
  145. package/docs/design/templates/panel-header/page-heading.svg +0 -1
  146. package/docs/design/templates/panel-header/title-only-dark.svg +0 -1
  147. package/docs/design/templates/panel-header/title-only.svg +0 -1
  148. package/docs/design/templates/panel-header-dark.svg +0 -1
  149. package/docs/design/templates/panel-header.svg +0 -1
@@ -555,6 +555,286 @@
555
555
  "recipe": "docs/layout.md#anatomy"
556
556
  }
557
557
  },
558
+ {
559
+ "id": "nav-stack",
560
+ "name": "NavStack",
561
+ "category": "Structure",
562
+ "kind": "component",
563
+ "source": "kerf",
564
+ "description": "A controlled one-pane navigation stack that keeps prior views mounted and animates push and pop transitions.",
565
+ "uses": [
566
+ "toolbar-text"
567
+ ],
568
+ "purpose": "Present a single linear or drill-down flow while preserving each prior view's state, scroll position, and place in the stack.",
569
+ "publicExports": [
570
+ "NavStackView",
571
+ "NavStackProps",
572
+ "NavStack"
573
+ ],
574
+ "useWhen": [
575
+ "A compact surface shows one view at a time and navigation pushes into details or pops back.",
576
+ "A simple single-pane screen needs the same stable app-layout contract without any nested navigation."
577
+ ],
578
+ "avoidWhen": [
579
+ "Do not use NavStack when a list and detail should remain visible together; use SplitView.",
580
+ "Do not use it for co-equal top-level destinations on compact devices; wrap one stack per destination in TabScaffold."
581
+ ],
582
+ "alternatives": [
583
+ {
584
+ "id": "split-view",
585
+ "relationship": "roomy-alternative",
586
+ "when": "Promote a list-to-detail stack to SplitView once both regions fit together."
587
+ },
588
+ {
589
+ "id": "tab-scaffold",
590
+ "relationship": "composes-with",
591
+ "when": "Use one NavStack as each TabScaffold tab's persistent content."
592
+ }
593
+ ],
594
+ "appOwns": [
595
+ "ordered view stack and stable keys",
596
+ "view content and titles",
597
+ "push and pop actions",
598
+ "focus restoration policy",
599
+ "optional persistent bottom toolbar"
600
+ ],
601
+ "variants": [
602
+ "single root view",
603
+ "pushed detail view",
604
+ "toolbar hidden",
605
+ "persistent bottom toolbar"
606
+ ],
607
+ "accessibility": [
608
+ "Give the stack region an accessible label and every back control a stable action label.",
609
+ "Wire pop behavior and restore focus to the control that opened the departing view after the controlled rerender."
610
+ ],
611
+ "geometry": {
612
+ "margin": "none",
613
+ "border": "conditional",
614
+ "padding": "child",
615
+ "notes": [
616
+ "The stack owns its full-height chrome and viewport; each view owns its internal content padding and scrollable content."
617
+ ]
618
+ },
619
+ "delivery": {
620
+ "moduleImport": "@kerfjs/ui/nav-stack",
621
+ "manualCssImport": "@kerfjs/ui/nav-stack.css",
622
+ "sideEffects": [
623
+ "manual-css"
624
+ ]
625
+ },
626
+ "wiring": [
627
+ {
628
+ "export": "wireNavStack",
629
+ "import": "@kerfjs/ui/wire-nav-stack",
630
+ "required": true
631
+ }
632
+ ],
633
+ "publicClasses": [
634
+ "kui-nav-stack",
635
+ "kui-nav-stack__chrome",
636
+ "kui-nav-stack__lead",
637
+ "kui-nav-stack__back",
638
+ "kui-nav-stack__back-icon",
639
+ "kui-nav-stack__title",
640
+ "kui-nav-stack__actions",
641
+ "kui-nav-stack__viewport",
642
+ "kui-nav-stack__view",
643
+ "kui-nav-stack__view--entering",
644
+ "kui-nav-stack__view--exiting",
645
+ "kui-nav-stack__bottom"
646
+ ],
647
+ "publicTokens": [],
648
+ "links": {
649
+ "catalogRoute": "?component=nav-stack",
650
+ "documentation": "docs/nav-stack.md",
651
+ "recipe": "docs/app-layouts.md#decision-matrix"
652
+ }
653
+ },
654
+ {
655
+ "id": "split-view",
656
+ "name": "SplitView",
657
+ "category": "Structure",
658
+ "kind": "component",
659
+ "source": "kerf",
660
+ "description": "A responsive list-detail layout that shows both panes on roomy device classes and collapses to a navigation stack on compact classes.",
661
+ "uses": [
662
+ "nav-stack",
663
+ "resize"
664
+ ],
665
+ "purpose": "Present a selectable list and its detail together when space permits, with a one-pane drill-down replacement on compact devices.",
666
+ "publicExports": [
667
+ "SplitView",
668
+ "SplitViewProps",
669
+ "SplitViewResizable"
670
+ ],
671
+ "useWhen": [
672
+ "Selection in a primary list updates a related detail pane and both should remain visible on roomy device classes.",
673
+ "The same list-detail flow must become a navigation stack on a handset or portrait tablet."
674
+ ],
675
+ "avoidWhen": [
676
+ "Do not use SplitView for a single linear flow; use NavStack.",
677
+ "Do not use it for a complex desktop tool with multiple peripheral panels; use Workbench."
678
+ ],
679
+ "alternatives": [
680
+ {
681
+ "id": "recipe-navigation-stack",
682
+ "relationship": "responsive-alternative",
683
+ "when": "SplitView renders the one-pane navigation-stack form on compact device classes."
684
+ },
685
+ {
686
+ "id": "workbench",
687
+ "relationship": "nearest",
688
+ "when": "Use Workbench when a desktop-class tool needs more than the list and detail regions."
689
+ }
690
+ ],
691
+ "appOwns": [
692
+ "device-class policy",
693
+ "selected item and detail-active state",
694
+ "list and detail content",
695
+ "optional list width and persistence",
696
+ "back action"
697
+ ],
698
+ "variants": [
699
+ "fixed roomy split",
700
+ "resizable roomy split",
701
+ "compact list",
702
+ "compact detail"
703
+ ],
704
+ "accessibility": [
705
+ "Give the overall split and both meaningful panes accessible labels.",
706
+ "Wire the compact back action and optional separator keyboard behavior, and restore focus when controlled navigation replaces a view."
707
+ ],
708
+ "geometry": {
709
+ "margin": "none",
710
+ "border": "self",
711
+ "padding": "child",
712
+ "notes": [
713
+ "The root owns the two-column split and the list pane owns its separator; list and detail content own their internal padding and scroll behavior."
714
+ ]
715
+ },
716
+ "delivery": {
717
+ "moduleImport": "@kerfjs/ui/split-view",
718
+ "manualCssImport": "@kerfjs/ui/split-view.css",
719
+ "sideEffects": [
720
+ "manual-css"
721
+ ]
722
+ },
723
+ "wiring": [
724
+ {
725
+ "export": "wireResizableRegions",
726
+ "import": "@kerfjs/ui/wire-resizable-regions",
727
+ "required": false
728
+ },
729
+ {
730
+ "export": "wireNavStack",
731
+ "import": "@kerfjs/ui/wire-nav-stack",
732
+ "required": true
733
+ }
734
+ ],
735
+ "publicClasses": [
736
+ "kui-split-view",
737
+ "kui-split-view__list",
738
+ "kui-resizable-region",
739
+ "kui-split-view__detail",
740
+ "kui-split-view--compact"
741
+ ],
742
+ "publicTokens": [
743
+ "--kui-split-view-list-width"
744
+ ],
745
+ "links": {
746
+ "catalogRoute": "?component=split-view",
747
+ "documentation": "docs/split-view.md",
748
+ "recipe": "docs/app-layouts.md#decision-matrix"
749
+ }
750
+ },
751
+ {
752
+ "id": "tab-scaffold",
753
+ "name": "TabScaffold",
754
+ "category": "Structure",
755
+ "kind": "component",
756
+ "source": "kerf",
757
+ "description": "A controlled compact-device bottom tab scaffold that keeps every tab scene mounted so its navigation and scroll state survive selection changes.",
758
+ "uses": [],
759
+ "purpose": "Switch among two to five co-equal top-level destinations on compact devices while preserving each destination's independent content state.",
760
+ "publicExports": [
761
+ "TabScaffoldTab",
762
+ "TabScaffoldProps",
763
+ "TabScaffold"
764
+ ],
765
+ "useWhen": [
766
+ "A handset or portrait-tablet app has two to five co-equal top-level destinations.",
767
+ "Each destination must stay mounted so its NavStack and scroll position survive tab switches."
768
+ ],
769
+ "avoidWhen": [
770
+ "Do not use TabScaffold for document tabs or reorderable work items; use TabBar.",
771
+ "Do not retain the bottom bar on desktop when the same destinations should be promoted to a Workbench rail or sidebar."
772
+ ],
773
+ "alternatives": [
774
+ {
775
+ "id": "tabs",
776
+ "relationship": "semantic-alternative",
777
+ "when": "Use TabBar and AppTab for document-style tabpanels, overflow, closing, or reordering."
778
+ },
779
+ {
780
+ "id": "workbench",
781
+ "relationship": "roomy-alternative",
782
+ "when": "Promote top-level destinations to a rail or sidebar on desktop-class layouts."
783
+ }
784
+ ],
785
+ "appOwns": [
786
+ "controlled active tab id",
787
+ "tab labels, icons, and content",
788
+ "routing and persistence",
789
+ "responsive replacement on larger device classes"
790
+ ],
791
+ "variants": [
792
+ "text-only tabs",
793
+ "icon and text tabs",
794
+ "one NavStack per tab"
795
+ ],
796
+ "accessibility": [
797
+ "Give the tablist an accessible label and keep exactly the active tab in the sequential focus order.",
798
+ "Wire selection through the controlled active id while leaving inactive scenes mounted and hidden."
799
+ ],
800
+ "geometry": {
801
+ "margin": "none",
802
+ "border": "self",
803
+ "padding": "self",
804
+ "notes": [
805
+ "The scaffold owns the full-height scene region and safe-area-aware bottom bar; scene content owns its internal geometry."
806
+ ]
807
+ },
808
+ "delivery": {
809
+ "moduleImport": "@kerfjs/ui/tab-scaffold",
810
+ "manualCssImport": "@kerfjs/ui/tab-scaffold.css",
811
+ "sideEffects": [
812
+ "manual-css"
813
+ ]
814
+ },
815
+ "wiring": [
816
+ {
817
+ "export": "wireTabScaffold",
818
+ "import": "@kerfjs/ui/wire-tab-scaffold",
819
+ "required": true
820
+ }
821
+ ],
822
+ "publicClasses": [
823
+ "kui-tab-scaffold",
824
+ "kui-tab-scaffold__scenes",
825
+ "kui-tab-scaffold__scene",
826
+ "kui-tab-scaffold__bar",
827
+ "kui-tab-scaffold__tab",
828
+ "kui-tab-scaffold__tab-icon",
829
+ "kui-tab-scaffold__tab-label"
830
+ ],
831
+ "publicTokens": [],
832
+ "links": {
833
+ "catalogRoute": "?component=tab-scaffold",
834
+ "documentation": "docs/tab-scaffold.md",
835
+ "recipe": "docs/app-layouts.md#decision-matrix"
836
+ }
837
+ },
558
838
  {
559
839
  "id": "workbench",
560
840
  "name": "Workbench",
@@ -596,7 +876,12 @@
596
876
  "right rail",
597
877
  "bottom drawer",
598
878
  "all panels",
599
- "independently collapsed panels"
879
+ "independently collapsed panels",
880
+ "hidden separator",
881
+ "slide, fade-slide, or instant content",
882
+ "clipped, scrolling, or popup-visible content",
883
+ "inline, overlay, or hidden responsive presentation",
884
+ "safe-area restore control"
600
885
  ],
601
886
  "accessibility": [
602
887
  "Give the Workbench and each meaningful rail or drawer an accessible label.",
@@ -623,14 +908,21 @@
623
908
  "kui-workbench__rail",
624
909
  "kui-workbench__rail--left",
625
910
  "kui-workbench__rail--right",
911
+ "kui-workbench__drawer",
626
912
  "kui-workbench__center",
627
913
  "kui-workbench__main",
628
- "kui-workbench__drawer",
629
- "kui-workbench__panel-content"
914
+ "kui-workbench__panel-content",
915
+ "kui-workbench__restore"
630
916
  ],
631
917
  "publicTokens": [
632
918
  "--kui-workbench-rail-width",
633
- "--kui-workbench-drawer-height"
919
+ "--kui-workbench-drawer-height",
920
+ "--kui-workbench-popup-z",
921
+ "--kui-workbench-overlay-z",
922
+ "--kui-workbench-overlay-max-width",
923
+ "--kui-workbench-overlay-max-height",
924
+ "--kui-workbench-restore-z",
925
+ "--kui-workbench-restore-inset"
634
926
  ],
635
927
  "links": {
636
928
  "catalogRoute": "?component=workbench",
@@ -638,6 +930,115 @@
638
930
  "recipe": "docs/workbench.md#state-lives-in-the-app"
639
931
  }
640
932
  },
933
+ {
934
+ "id": "collapsible-panel",
935
+ "name": "CollapsiblePanel",
936
+ "category": "Structure",
937
+ "kind": "component",
938
+ "source": "kerf",
939
+ "description": "A standalone controlled left or right rail or bottom drawer with standard collapse icons and optional compact-overlay behavior through wireSidebar.",
940
+ "uses": [
941
+ "lucide-icon"
942
+ ],
943
+ "purpose": "Add one independently collapsible peripheral panel without adopting the complete multi-panel Workbench shell.",
944
+ "publicExports": [
945
+ "CollapsiblePanelSide",
946
+ "collapsiblePanelToggleIcon",
947
+ "CollapsiblePanelToggleProps",
948
+ "CollapsiblePanelToggle",
949
+ "CollapsiblePanelProps",
950
+ "CollapsiblePanel"
951
+ ],
952
+ "useWhen": [
953
+ "An application needs one collapsible side rail or bottom drawer outside a full Workbench.",
954
+ "The panel should become a dismissable, focus-managed overlay on compact devices."
955
+ ],
956
+ "avoidWhen": [
957
+ "Do not use CollapsiblePanel for a complete editor shell with multiple coordinated rails and a drawer; use Workbench.",
958
+ "Do not preserve an empty icon-only rail when collapsed; move the restore control into adjacent visible chrome."
959
+ ],
960
+ "alternatives": [
961
+ {
962
+ "id": "workbench",
963
+ "relationship": "larger-composition",
964
+ "when": "Use Workbench when the central work area coordinates multiple peripheral panels."
965
+ },
966
+ {
967
+ "id": "recipe-collapsible-sidebar",
968
+ "relationship": "recipe",
969
+ "when": "Use the production recipe for collapse, restore, compact overlay, focus, and persistence ownership."
970
+ }
971
+ ],
972
+ "appOwns": [
973
+ "controlled collapsed state",
974
+ "panel content and size",
975
+ "toggle placement",
976
+ "persistence policy",
977
+ "compact-device policy"
978
+ ],
979
+ "variants": [
980
+ "left rail",
981
+ "right rail",
982
+ "bottom drawer",
983
+ "collapsed",
984
+ "compact overlay",
985
+ "compact responsive replacement",
986
+ "hidden separator",
987
+ "slide, fade-slide, or instant content",
988
+ "clipped, scrolling, or popup-visible content",
989
+ "safe-area restore control"
990
+ ],
991
+ "accessibility": [
992
+ "Give the panel region and every collapse or restore control an accessible label.",
993
+ "Keep the restore control outside the disappearing panel and use wireSidebar for focus transfer, Escape, backdrop dismissal, and compact focus trapping."
994
+ ],
995
+ "geometry": {
996
+ "margin": "none",
997
+ "border": "self",
998
+ "padding": "child",
999
+ "notes": [
1000
+ "The panel owns its dock-edge separator and size track; its child content owns internal padding and scrolling."
1001
+ ]
1002
+ },
1003
+ "delivery": {
1004
+ "moduleImport": "@kerfjs/ui/collapsible-panel",
1005
+ "manualCssImport": "@kerfjs/ui/collapsible-panel.css",
1006
+ "sideEffects": [
1007
+ "manual-css"
1008
+ ]
1009
+ },
1010
+ "wiring": [
1011
+ {
1012
+ "export": "wireSidebar",
1013
+ "import": "@kerfjs/ui/wire-sidebar",
1014
+ "required": true
1015
+ }
1016
+ ],
1017
+ "publicClasses": [
1018
+ "kui-collapsible-panel",
1019
+ "kui-collapsible-panel--left",
1020
+ "kui-collapsible-panel--right",
1021
+ "kui-collapsible-panel--bottom",
1022
+ "kui-collapsible-panel__content",
1023
+ "kui-collapsible-panel__restore",
1024
+ "kui-collapsible-panel__backdrop",
1025
+ "kui-collapsible-panel__toggle"
1026
+ ],
1027
+ "publicTokens": [
1028
+ "--kui-collapsible-panel-width",
1029
+ "--kui-collapsible-panel-height",
1030
+ "--kui-collapsible-panel-popup-z",
1031
+ "--kui-collapsible-panel-overlay-z",
1032
+ "--kui-collapsible-panel-restore-z",
1033
+ "--kui-collapsible-panel-restore-inset",
1034
+ "--kui-collapsible-panel-backdrop-z"
1035
+ ],
1036
+ "links": {
1037
+ "catalogRoute": "?component=collapsible-panel",
1038
+ "documentation": "docs/collapsible-panel.md",
1039
+ "recipe": "docs/collapsible-panel.md#recipe-and-coverage"
1040
+ }
1041
+ },
641
1042
  {
642
1043
  "id": "sunken-panel",
643
1044
  "name": "SunkenPanel",
@@ -727,17 +1128,12 @@
727
1128
  "Toolbar"
728
1129
  ],
729
1130
  "useWhen": [
730
- "Compose persistent application chrome with leading, center, and trailing regions."
1131
+ "Compose application chrome or a page, panel, or dialog heading with leading, center, and trailing regions."
731
1132
  ],
732
1133
  "avoidWhen": [
733
- "Do not use for a page title or dialog heading."
734
- ],
735
- "alternatives": [
736
- {
737
- "id": "panel-header",
738
- "relationship": "nearest"
739
- }
1134
+ "Do not use it as a generic wrapper when no toolbar or heading relationship exists."
740
1135
  ],
1136
+ "alternatives": [],
741
1137
  "appOwns": [
742
1138
  "actions",
743
1139
  "command availability",
@@ -791,12 +1187,12 @@
791
1187
  "category": "Structure",
792
1188
  "kind": "component",
793
1189
  "source": "kerf",
794
- "description": "Contained, borderless, pressed, and single-control toolbar groups.",
1190
+ "description": "Typed toolbar groups for compact, mixed, selected, dropdown, and avatar controls.",
795
1191
  "uses": [
796
1192
  "lucide-icon",
797
1193
  "segmented-control"
798
1194
  ],
799
- "purpose": "Contained, borderless, pressed, and single-control toolbar groups.",
1195
+ "purpose": "Typed toolbar groups for compact, mixed, selected, dropdown, and avatar controls.",
800
1196
  "publicExports": [
801
1197
  "ToolbarControlGroup"
802
1198
  ],
@@ -827,7 +1223,14 @@
827
1223
  "contained",
828
1224
  "borderless",
829
1225
  "pressed",
830
- "single"
1226
+ "single",
1227
+ "default or compact size",
1228
+ "comfortable or tight density",
1229
+ "icon, text, mixed, or avatar content",
1230
+ "raised, filled, or outline selected chrome",
1231
+ "brand or neutral selected tone",
1232
+ "nested dropdown trigger",
1233
+ "avatar scrim"
831
1234
  ],
832
1235
  "accessibility": [
833
1236
  "Name the group when its relationship is not evident from context."
@@ -877,6 +1280,75 @@
877
1280
  "recipe": "docs/component-selection.md#problem-to-component-matrix"
878
1281
  }
879
1282
  },
1283
+ {
1284
+ "id": "surface-scaffold",
1285
+ "name": "Surface scaffolds",
1286
+ "category": "Structure",
1287
+ "kind": "component",
1288
+ "source": "kerf",
1289
+ "description": "Typed Web Awesome dialog and popup surface sizing, presentation, and inset composition.",
1290
+ "uses": [
1291
+ "wa-dialog",
1292
+ "wa-dropdown",
1293
+ "wa-dropdown-item"
1294
+ ],
1295
+ "purpose": "Configure recurring dialog and popup geometry without consumer ::part() overrides.",
1296
+ "publicExports": [
1297
+ "DialogSurface",
1298
+ "PopupSurface"
1299
+ ],
1300
+ "useWhen": [
1301
+ "A Web Awesome dialog or dropdown needs a standard size, presentation, body/footer inset, or list-compatible menu inset."
1302
+ ],
1303
+ "avoidWhen": [
1304
+ "Do not use it as a generic layout wrapper or to replace application-owned modal state and focus lifecycle."
1305
+ ],
1306
+ "alternatives": [],
1307
+ "appOwns": [
1308
+ "open state",
1309
+ "focus lifecycle",
1310
+ "dismissal policy",
1311
+ "content",
1312
+ "outer placement"
1313
+ ],
1314
+ "variants": [
1315
+ "small, medium, or large dialog",
1316
+ "modal, side-sheet, or fullscreen dialog",
1317
+ "none, compact, or comfortable body and footer inset",
1318
+ "standard, compact, or zero-inset popup menu"
1319
+ ],
1320
+ "accessibility": [
1321
+ "Supply the wrapped wa-dialog label and retain Web Awesome's native modal and focus behavior.",
1322
+ "Use popup surfaces only for real dropdown menus with named triggers."
1323
+ ],
1324
+ "geometry": {
1325
+ "margin": "parent",
1326
+ "border": "child",
1327
+ "padding": "self"
1328
+ },
1329
+ "delivery": {
1330
+ "browserImport": "@kerfjs/ui/surface-scaffold",
1331
+ "manualCssImport": "@kerfjs/ui/surface-scaffold.css",
1332
+ "sideEffects": [
1333
+ "browser-condition-css"
1334
+ ]
1335
+ },
1336
+ "wiring": [],
1337
+ "publicClasses": [
1338
+ "kui-dialog-surface",
1339
+ "kui-popup-surface"
1340
+ ],
1341
+ "publicTokens": [
1342
+ "--kui-radius-l",
1343
+ "--kui-wa-container-inset",
1344
+ "--kui-wa-surface-inset"
1345
+ ],
1346
+ "links": {
1347
+ "catalogRoute": "?component=surface-scaffold",
1348
+ "documentation": "docs/surface-scaffold.md",
1349
+ "recipe": "docs/component-selection.md#problem-to-component-matrix"
1350
+ }
1351
+ },
880
1352
  {
881
1353
  "id": "floating-toolbar",
882
1354
  "name": "FloatingToolbar",
@@ -957,17 +1429,12 @@
957
1429
  "ToolbarText"
958
1430
  ],
959
1431
  "useWhen": [
960
- "Render toolbar identity text at a supported hierarchy size."
1432
+ "Render toolbar identity or heading text at a supported hierarchy size; pass headingLevel for heading semantics."
961
1433
  ],
962
1434
  "avoidWhen": [
963
- "Do not substitute it for document heading semantics."
964
- ],
965
- "alternatives": [
966
- {
967
- "id": "panel-header",
968
- "relationship": "nearest"
969
- }
1435
+ "Do not omit headingLevel when the text is the page or section heading."
970
1436
  ],
1437
+ "alternatives": [],
971
1438
  "appOwns": [
972
1439
  "text",
973
1440
  "responsive priority"
@@ -1018,7 +1485,9 @@
1018
1485
  "source": "kerf",
1019
1486
  "description": "Page, dialog, and definition-list hierarchy.",
1020
1487
  "uses": [
1021
- "panel-header",
1488
+ "toolbar",
1489
+ "toolbar-control-group",
1490
+ "toolbar-text",
1022
1491
  "value-table"
1023
1492
  ],
1024
1493
  "purpose": "Page, dialog, and definition-list hierarchy.",
@@ -1029,16 +1498,7 @@
1029
1498
  "avoidWhen": [
1030
1499
  "Do not reuse one header primitive only because its typography looks similar."
1031
1500
  ],
1032
- "alternatives": [
1033
- {
1034
- "id": "toolbar",
1035
- "relationship": "nearest"
1036
- },
1037
- {
1038
- "id": "panel-header",
1039
- "relationship": "nearest"
1040
- }
1041
- ],
1501
+ "alternatives": [],
1042
1502
  "appOwns": [
1043
1503
  "scope hierarchy",
1044
1504
  "copy",
@@ -1071,91 +1531,6 @@
1071
1531
  "recipe": "docs/component-selection.md#ambiguous-choices"
1072
1532
  }
1073
1533
  },
1074
- {
1075
- "id": "panel-header",
1076
- "name": "PanelHeader",
1077
- "category": "Structure",
1078
- "kind": "component",
1079
- "source": "kerf",
1080
- "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.",
1081
- "uses": [
1082
- "lucide-icon",
1083
- "toolbar",
1084
- "toolbar-control-group",
1085
- "toolbar-text"
1086
- ],
1087
- "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.",
1088
- "publicExports": [
1089
- "PanelHeader"
1090
- ],
1091
- "useWhen": [
1092
- "Give a panel, dialog, or page a heading with an extra-large title, optional icon and subtitle, and trailing actions."
1093
- ],
1094
- "avoidWhen": [
1095
- "Do not use it as persistent application chrome; use Toolbar. It supplies header structure, not modal behavior."
1096
- ],
1097
- "alternatives": [
1098
- {
1099
- "id": "toolbar",
1100
- "relationship": "nearest"
1101
- },
1102
- {
1103
- "id": "wa-dialog",
1104
- "relationship": "prefer-over"
1105
- }
1106
- ],
1107
- "appOwns": [
1108
- "open state",
1109
- "focus lifecycle",
1110
- "dismissal",
1111
- "copy",
1112
- "the trailing action controls"
1113
- ],
1114
- "variants": [
1115
- "title",
1116
- "optional summary",
1117
- "icon",
1118
- "actions",
1119
- "placeholder (loading)",
1120
- "page heading (headingLevel)"
1121
- ],
1122
- "accessibility": [
1123
- "Connect the title id and any provided summary id to the dialog or panel host.",
1124
- "Pass the trailing actions as a labeled ToolbarControlGroup when the group needs an accessible name.",
1125
- "For a page/view title pass headingLevel (usually 1) so the title exposes role=heading + aria-level as a heading landmark; omit it for a dialog title, which is referenced via aria-labelledby to titleId."
1126
- ],
1127
- "geometry": {
1128
- "margin": "none",
1129
- "border": "child",
1130
- "padding": "child"
1131
- },
1132
- "delivery": {
1133
- "browserImport": "@kerfjs/ui/panel-header",
1134
- "manualCssImport": "@kerfjs/ui/panel-header.css",
1135
- "sideEffects": [
1136
- "browser-condition-css"
1137
- ]
1138
- },
1139
- "wiring": [],
1140
- "publicClasses": [
1141
- "kui-panel-header",
1142
- "kui-panel-header__icon",
1143
- "kui-panel-header__summary"
1144
- ],
1145
- "publicTokens": [
1146
- "--kui-color-brand-fill-quiet",
1147
- "--kui-color-brand-on-quiet",
1148
- "--kui-color-text-quiet",
1149
- "--kui-panel-header-icon-background",
1150
- "--kui-panel-header-icon-border",
1151
- "--kui-panel-header-icon-foreground"
1152
- ],
1153
- "links": {
1154
- "catalogRoute": "?component=panel-header",
1155
- "documentation": "docs/component-selection.md",
1156
- "recipe": "docs/component-selection.md#ambiguous-choices"
1157
- }
1158
- },
1159
1534
  {
1160
1535
  "id": "value-table",
1161
1536
  "name": "ValueTable",
@@ -1308,7 +1683,7 @@
1308
1683
  "category": "Navigation",
1309
1684
  "kind": "component",
1310
1685
  "source": "kerf",
1311
- "description": "Full-width section headings with a semantic neutral count pill or non-count badge, a logical-end action, disclosure states, and protected native-popover trigger metadata.",
1686
+ "description": "Configurable section headings with semantic count/status indicators, density, group dividers, a logical-end action, disclosure states, and protected native-popover trigger metadata.",
1312
1687
  "uses": [
1313
1688
  "lucide-icon",
1314
1689
  "disclosure-arrow"
@@ -1326,7 +1701,7 @@
1326
1701
  ],
1327
1702
  "alternatives": [
1328
1703
  {
1329
- "id": "panel-header",
1704
+ "id": "toolbar",
1330
1705
  "relationship": "nearest"
1331
1706
  }
1332
1707
  ],
@@ -1345,7 +1720,10 @@
1345
1720
  "badge",
1346
1721
  "action",
1347
1722
  "toggle",
1348
- "placeholder (loading)"
1723
+ "placeholder (loading)",
1724
+ "compact density",
1725
+ "neutral, accent, or danger indicator tone",
1726
+ "before, after, or paired group divider"
1349
1727
  ],
1350
1728
  "accessibility": [
1351
1729
  "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.",
@@ -1387,7 +1765,11 @@
1387
1765
  "--kui-layout-item-padding",
1388
1766
  "--kui-layout-pill-radius",
1389
1767
  "--kui-list-header-count-font-size",
1390
- "--kui-list-header-hover-background"
1768
+ "--kui-list-header-hover-background",
1769
+ "--kui-list-group-divider-color",
1770
+ "--kui-color-brand-on-normal",
1771
+ "--kui-color-danger-fill-normal",
1772
+ "--kui-color-danger-on-normal"
1391
1773
  ],
1392
1774
  "links": {
1393
1775
  "catalogRoute": "?component=list-header",
@@ -1401,9 +1783,10 @@
1401
1783
  "category": "Navigation",
1402
1784
  "kind": "component",
1403
1785
  "source": "kerf",
1404
- "description": "Full-width navigation rows with sibling primary and trailing native-button actions.",
1786
+ "description": "Configurable navigation rows with structured labels, status/busy metadata, density, group dividers, and sibling primary/trailing native-button actions.",
1405
1787
  "uses": [
1406
- "lucide-icon"
1788
+ "lucide-icon",
1789
+ "loading-spinner"
1407
1790
  ],
1408
1791
  "purpose": "Keep a selectable primary row action and an independently named trailing action as sibling native controls inside one noninteractive visual row.",
1409
1792
  "publicExports": [
@@ -1440,7 +1823,12 @@
1440
1823
  "disabled primary",
1441
1824
  "disabled trailing action",
1442
1825
  "multiline",
1443
- "placeholder (loading)"
1826
+ "placeholder (loading)",
1827
+ "compact density",
1828
+ "description and status",
1829
+ "busy while retaining content",
1830
+ "interaction-revealed trailing action",
1831
+ "before, after, or paired group divider"
1444
1832
  ],
1445
1833
  "accessibility": [
1446
1834
  "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.",
@@ -1463,6 +1851,9 @@
1463
1851
  "kui-list-action-row",
1464
1852
  "kui-list-action-row__icon",
1465
1853
  "kui-list-action-row__label",
1854
+ "kui-list-action-row__primary-label",
1855
+ "kui-list-action-row__description",
1856
+ "kui-list-action-row__status",
1466
1857
  "kui-list-action-row__primary",
1467
1858
  "kui-list-action-row__trailing-action"
1468
1859
  ],
@@ -1473,6 +1864,8 @@
1473
1864
  "--kui-color-neutral-fill-normal",
1474
1865
  "--kui-color-neutral-fill-quiet",
1475
1866
  "--kui-color-neutral-on-normal",
1867
+ "--kui-color-neutral-on-quiet",
1868
+ "--kui-color-neutral-border-quiet",
1476
1869
  "--kui-focus-ring",
1477
1870
  "--kui-layout-inline-margin",
1478
1871
  "--kui-layout-item-gap",
@@ -1487,7 +1880,9 @@
1487
1880
  "--kui-list-action-row-selected-background",
1488
1881
  "--kui-list-action-row-selected-border",
1489
1882
  "--kui-list-action-row-selected-color",
1490
- "--kui-list-action-row-trailing-hover-background"
1883
+ "--kui-list-action-row-trailing-hover-background",
1884
+ "--kui-list-group-divider-color",
1885
+ "--kui-font-xs"
1491
1886
  ],
1492
1887
  "links": {
1493
1888
  "catalogRoute": "?component=list-action-row",
@@ -1501,9 +1896,10 @@
1501
1896
  "category": "Navigation",
1502
1897
  "kind": "component",
1503
1898
  "source": "kerf",
1504
- "description": "Selectable, disabled, trailing, and multiline native-button navigation rows with protected domain metadata hooks.",
1899
+ "description": "Configurable native-button navigation rows with structured labels, status/busy metadata, density, group dividers, and protected domain metadata hooks.",
1505
1900
  "uses": [
1506
- "lucide-icon"
1901
+ "lucide-icon",
1902
+ "loading-spinner"
1507
1903
  ],
1508
1904
  "purpose": "Selectable, disabled, trailing, and multiline navigation rows.",
1509
1905
  "publicExports": [
@@ -1535,7 +1931,11 @@
1535
1931
  "disabled",
1536
1932
  "trailing",
1537
1933
  "multiline",
1538
- "placeholder (loading)"
1934
+ "placeholder (loading)",
1935
+ "compact density",
1936
+ "description and status",
1937
+ "busy while retaining content",
1938
+ "before, after, or paired group divider"
1539
1939
  ],
1540
1940
  "accessibility": [
1541
1941
  "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."
@@ -1557,6 +1957,9 @@
1557
1957
  "kui-list-item",
1558
1958
  "kui-list-item__icon",
1559
1959
  "kui-list-item__label",
1960
+ "kui-list-item__primary-label",
1961
+ "kui-list-item__description",
1962
+ "kui-list-item__status",
1560
1963
  "kui-list-item__trailing"
1561
1964
  ],
1562
1965
  "publicTokens": [
@@ -1564,11 +1967,14 @@
1564
1967
  "--kui-color-neutral-fill-quiet",
1565
1968
  "--kui-color-neutral-on-normal",
1566
1969
  "--kui-color-neutral-on-quiet",
1970
+ "--kui-color-neutral-border-quiet",
1567
1971
  "--kui-focus-ring",
1568
1972
  "--kui-list-item-color",
1569
1973
  "--kui-list-item-hover-background",
1570
1974
  "--kui-list-item-selected-background",
1571
1975
  "--kui-list-item-selected-color",
1976
+ "--kui-list-group-divider-color",
1977
+ "--kui-font-xs",
1572
1978
  "--kui-layout-inline-margin",
1573
1979
  "--kui-layout-item-gap",
1574
1980
  "--kui-layout-item-padding",
@@ -1695,11 +2101,11 @@
1695
2101
  "category": "Navigation",
1696
2102
  "kind": "component",
1697
2103
  "source": "kerf",
1698
- "description": "Roving-tabindex-ready tabs with protected application metadata and customizable close affordances.",
2104
+ "description": "Roving-tabindex-ready tabs with typed compact, segmented, icon-only, and truncating-label presentations.",
1699
2105
  "uses": [
1700
2106
  "lucide-icon"
1701
2107
  ],
1702
- "purpose": "Roving-tabindex-ready tabs with protected application metadata and customizable close affordances.",
2108
+ "purpose": "Roving-tabindex-ready tabs with typed compact, segmented, icon-only, and truncating-label presentations.",
1703
2109
  "publicExports": [
1704
2110
  "AppTab"
1705
2111
  ],
@@ -1720,7 +2126,8 @@
1720
2126
  "selection",
1721
2127
  "close policy",
1722
2128
  "content",
1723
- "application data attribute values"
2129
+ "application data attribute values",
2130
+ "outer placement"
1724
2131
  ],
1725
2132
  "variants": [
1726
2133
  "selected",
@@ -1729,7 +2136,11 @@
1729
2136
  "leading",
1730
2137
  "trailing",
1731
2138
  "custom close icon",
1732
- "root metadata"
2139
+ "root metadata",
2140
+ "compact size",
2141
+ "segmented presentation",
2142
+ "icon-only accessible presentation",
2143
+ "label maximum width and truncation"
1733
2144
  ],
1734
2145
  "accessibility": [
1735
2146
  "Compose in a tablist and pair with an application-owned tabpanel.",
@@ -1789,12 +2200,12 @@
1789
2200
  "category": "Navigation",
1790
2201
  "kind": "component",
1791
2202
  "source": "kerf",
1792
- "description": "Controlled, reorderable tab strips with horizontal overflow.",
2203
+ "description": "Controlled tab strips with typed rail, segmented, and inspector presentation plus intrinsic or fill allocation.",
1793
2204
  "uses": [
1794
2205
  "tabs",
1795
2206
  "toolbar-control-group"
1796
2207
  ],
1797
- "purpose": "Controlled, reorderable tab strips with horizontal overflow.",
2208
+ "purpose": "Controlled tab strips with typed rail, segmented, and inspector presentation plus intrinsic or fill allocation.",
1798
2209
  "publicExports": [
1799
2210
  "TabBar",
1800
2211
  "wireTabBars",
@@ -1825,13 +2236,17 @@
1825
2236
  "selection",
1826
2237
  "panels",
1827
2238
  "routing",
1828
- "persistence"
2239
+ "persistence",
2240
+ "outer placement"
1829
2241
  ],
1830
2242
  "variants": [
1831
2243
  "leading",
1832
2244
  "trailing",
1833
2245
  "overflow",
1834
- "reorderable"
2246
+ "reorderable",
2247
+ "rail, segmented, and inspector presentation",
2248
+ "intrinsic or fill allocation",
2249
+ "separate or adjacent trailing action"
1835
2250
  ],
1836
2251
  "accessibility": [
1837
2252
  "Keep exactly one selected tab at tabindex 0 and preserve the wiring keyboard model."
@@ -2026,7 +2441,7 @@
2026
2441
  "accessibility": [
2027
2442
  "Announce result changes when useful and keep tokens atomic during editing.",
2028
2443
  "Keep leading and trailing controls aligned to the first text line while content wraps.",
2029
- "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.",
2444
+ "Wire Enter to submit without inserting a contenteditable line break and preserve focus plus the text-relative caret across controlled keyboard chip deletion before the next keystroke. Select All deletion preserves managed open state and replacement focus; persist both edited query and tokens. Visual wrapping remains available.",
2030
2445
  "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."
2031
2446
  ],
2032
2447
  "geometry": {
@@ -2139,7 +2554,12 @@
2139
2554
  "start edge",
2140
2555
  "end edge",
2141
2556
  "collapsed",
2142
- "custom handle icon"
2557
+ "custom handle icon",
2558
+ "hidden separator",
2559
+ "slide, fade-slide, or instant content",
2560
+ "clipped, scrolling, or popup-visible content",
2561
+ "inline, overlay, or hidden responsive presentation",
2562
+ "safe-area restore control"
2143
2563
  ],
2144
2564
  "accessibility": [
2145
2565
  "Preserve separator naming, value ARIA, and keyboard behavior.",
@@ -2181,7 +2601,8 @@
2181
2601
  "kui-resizable-region",
2182
2602
  "kui-resizable-region__content",
2183
2603
  "kui-resizable-region__handle",
2184
- "kui-resizable-region__handle-icon"
2604
+ "kui-resizable-region__handle-icon",
2605
+ "kui-resizable-region__restore"
2185
2606
  ],
2186
2607
  "publicTokens": [
2187
2608
  "--kui-color-border",
@@ -2191,6 +2612,10 @@
2191
2612
  "--kui-radius-s",
2192
2613
  "--kui-resizable-region-handle-active-color",
2193
2614
  "--kui-resizable-region-handle-color",
2615
+ "--kui-resizable-region-overlay-z",
2616
+ "--kui-resizable-region-popup-z",
2617
+ "--kui-resizable-region-restore-inset",
2618
+ "--kui-resizable-region-restore-z",
2194
2619
  "--kui-resizable-region-separator-color",
2195
2620
  "--kui-resizable-region-size"
2196
2621
  ],
@@ -2206,13 +2631,13 @@
2206
2631
  "category": "Controls",
2207
2632
  "kind": "component",
2208
2633
  "source": "kerf",
2209
- "description": "Controlled Web Awesome select with grouped choices and rerender-stable icon slots.",
2634
+ "description": "Controlled Web Awesome select with typed form, toolbar, navigation, compact, icon-only, truncating, hint, and grouped-choice presentations.",
2210
2635
  "uses": [
2211
2636
  "lucide-icon",
2212
2637
  "wa-select",
2213
2638
  "wa-option"
2214
2639
  ],
2215
- "purpose": "Controlled Web Awesome select with grouped choices and rerender-stable icon slots.",
2640
+ "purpose": "Controlled Web Awesome select with typed form, toolbar, navigation, compact, icon-only, truncating, hint, and grouped-choice presentations.",
2216
2641
  "publicExports": [
2217
2642
  "Select"
2218
2643
  ],
@@ -2240,7 +2665,9 @@
2240
2665
  "value",
2241
2666
  "validation",
2242
2667
  "choices",
2243
- "domain mapping"
2668
+ "hint copy",
2669
+ "domain mapping",
2670
+ "outer placement"
2244
2671
  ],
2245
2672
  "variants": [
2246
2673
  "placeholder",
@@ -2248,10 +2675,18 @@
2248
2675
  "fit menu",
2249
2676
  "grouped",
2250
2677
  "custom selected content",
2251
- "placeholder (loading)"
2678
+ "hint text",
2679
+ "placeholder (loading)",
2680
+ "form, toolbar-borderless, or navigation presentation",
2681
+ "default or compact size",
2682
+ "label or icon-only selected presentation",
2683
+ "select- or group-owned focus ring",
2684
+ "label maximum width and truncation"
2252
2685
  ],
2253
2686
  "accessibility": [
2254
- "Verify the live value, standard events, focus, and rendered output."
2687
+ "Verify the live value, standard events, focus, and rendered output.",
2688
+ "A nonempty label names the internal combobox; otherwise ariaLabel supplies a visually hidden label without adding control height, including custom selected content.",
2689
+ "Hint text is visible below the control through Web Awesome's native hint relationship; placeholderText remains the empty value inside the closed control."
2255
2690
  ],
2256
2691
  "geometry": {
2257
2692
  "margin": "none",
@@ -2271,6 +2706,7 @@
2271
2706
  "kui-select",
2272
2707
  "kui-select--custom-selected",
2273
2708
  "kui-select--fit-menu",
2709
+ "kui-select--label-hidden",
2274
2710
  "kui-select__custom-selected",
2275
2711
  "kui-select__group",
2276
2712
  "kui-select__group--separated",
@@ -5424,7 +5860,6 @@
5424
5860
  "toolbar-control-group",
5425
5861
  "list-header",
5426
5862
  "list-item",
5427
- "panel-header",
5428
5863
  "resize",
5429
5864
  "value-table",
5430
5865
  "layout"
@@ -5502,7 +5937,9 @@
5502
5937
  "source": "kerf",
5503
5938
  "purpose": "Page identity with primary, secondary, and overflow actions that relocate at narrow widths.",
5504
5939
  "uses": [
5505
- "panel-header",
5940
+ "toolbar",
5941
+ "toolbar-control-group",
5942
+ "toolbar-text",
5506
5943
  "state-banner",
5507
5944
  "layout"
5508
5945
  ],
@@ -5510,7 +5947,7 @@
5510
5947
  "A workspace page needs one primary heading and a small prioritized action set."
5511
5948
  ],
5512
5949
  "avoidWhen": [
5513
- "Use Toolbar for persistent application chrome or PanelHeader for a focused modal task."
5950
+ "Use a smaller local heading when the page does not need actions or persistent identity."
5514
5951
  ],
5515
5952
  "appOwns": [
5516
5953
  "authorization",
@@ -5538,9 +5975,11 @@
5538
5975
  "category": "Recipes",
5539
5976
  "kind": "recipe",
5540
5977
  "source": "kerf",
5541
- "purpose": "Production modal containing a PanelHeader, navigable record master list, and ValueTable detail.",
5978
+ "purpose": "Production modal containing a Toolbar heading, navigable record master list, and ValueTable detail.",
5542
5979
  "uses": [
5543
- "panel-header",
5980
+ "toolbar",
5981
+ "toolbar-control-group",
5982
+ "toolbar-text",
5544
5983
  "list-header",
5545
5984
  "list-item",
5546
5985
  "value-table",
@@ -5560,7 +5999,7 @@
5560
5999
  "record actions"
5561
6000
  ],
5562
6001
  "accessibility": [
5563
- "Web Awesome owns modal focus and Escape; the application adapter restores the invoking control after hide, and PanelHeader supplies the visible hierarchy."
6002
+ "Web Awesome owns modal focus and Escape; the application adapter restores the invoking control after hide, and Toolbar plus ToolbarText supply the visible hierarchy."
5564
6003
  ],
5565
6004
  "delivery": {
5566
6005
  "sideEffects": [
@@ -5580,9 +6019,11 @@
5580
6019
  "category": "Recipes",
5581
6020
  "kind": "recipe",
5582
6021
  "source": "kerf",
5583
- "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.",
6022
+ "purpose": "One visible publishing-form surface with Toolbar heading hierarchy, fields and actions on the shared 8px control gutter, 24px major rhythm, and a conditional StateBanner as its only nested semantic surface.",
5584
6023
  "uses": [
5585
- "panel-header",
6024
+ "toolbar",
6025
+ "toolbar-control-group",
6026
+ "toolbar-text",
5586
6027
  "select",
5587
6028
  "state-banner",
5588
6029
  "wa-input",
@@ -5603,7 +6044,7 @@
5603
6044
  "transport"
5604
6045
  ],
5605
6046
  "accessibility": [
5606
- "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."
6047
+ "The form references its ToolbarText title and supporting-summary ids; production fields own labels and help; invalid submission creates an assertive persistent StateBanner while successful submission creates a polite persistent banner."
5607
6048
  ],
5608
6049
  "delivery": {
5609
6050
  "sideEffects": [
@@ -5625,7 +6066,9 @@
5625
6066
  "source": "kerf",
5626
6067
  "purpose": "Deterministic loading, empty, populated, stale refresh, and error states around one stable list workspace.",
5627
6068
  "uses": [
5628
- "panel-header",
6069
+ "toolbar",
6070
+ "toolbar-control-group",
6071
+ "toolbar-text",
5629
6072
  "state-banner",
5630
6073
  "empty-state",
5631
6074
  "loading-spinner",
@@ -5746,7 +6189,9 @@
5746
6189
  "source": "kerf",
5747
6190
  "purpose": "A record inspector whose per-record values load asynchronously — every value-bearing component takes a shared placeholder flag, so the same chrome renders a faithful loading state and then the populated record.",
5748
6191
  "uses": [
5749
- "panel-header",
6192
+ "toolbar",
6193
+ "toolbar-control-group",
6194
+ "toolbar-text",
5750
6195
  "value-table",
5751
6196
  "select",
5752
6197
  "segmented-control",
@@ -5789,7 +6234,6 @@
5789
6234
  "source": "kerf",
5790
6235
  "purpose": "A mini app frame whose left navigation rail and bottom activity drawer are standalone CollapsiblePanels driven by wireSidebar: per-side collapse/expand toggles, focus move-in and restore, a dismissable compact overlay, and per-panel persistence.",
5791
6236
  "uses": [
5792
- "panel-header",
5793
6237
  "list-header",
5794
6238
  "list-item",
5795
6239
  "toolbar",