@kerfjs/ui 5.0.0-beta.50 → 5.0.0-beta.52

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 (212) hide show
  1. package/README.md +29 -5
  2. package/ai/compile-time-contracts-v1.json +5 -2
  3. package/ai/component-catalog-v2.d.ts +19 -1
  4. package/ai/component-catalog-v2.json +842 -127
  5. package/ai/component-catalog-v2.schema.json +33 -1
  6. package/ai/component-catalog.json +603 -126
  7. package/ai/component-catalog.schema.json +21 -1
  8. package/ai/public-api-signatures-v1.md +218 -31
  9. package/ai/skill.md +27 -24
  10. package/ai/webawesome-jsx-signatures-v1.md +1 -1
  11. package/analyzer/index.mjs +105 -35
  12. package/dist/app-tab.d.ts +10 -1
  13. package/dist/app-tab.js +1 -1
  14. package/dist/catalog-resources.d.ts +1 -1
  15. package/dist/catalog.d.ts +28 -5
  16. package/dist/catalog.js +66 -25
  17. package/dist/catalog.js.map +1 -1
  18. package/dist/{chunk-OL4TC3U2.js → chunk-2CE22Q2K.js} +9 -2
  19. package/dist/chunk-2CE22Q2K.js.map +1 -0
  20. package/dist/{chunk-SIU2AC5W.js → chunk-2S7OWAEV.js} +3 -3
  21. package/dist/{chunk-SIU2AC5W.js.map → chunk-2S7OWAEV.js.map} +1 -1
  22. package/dist/{chunk-2YOUUEWR.js → chunk-3S7OUHUN.js} +4 -4
  23. package/dist/{chunk-2YOUUEWR.js.map → chunk-3S7OUHUN.js.map} +1 -1
  24. package/dist/{chunk-2WMSE4MK.js → chunk-4XE2CDYB.js} +2 -2
  25. package/dist/{chunk-2WMSE4MK.js.map → chunk-4XE2CDYB.js.map} +1 -1
  26. package/dist/{chunk-V6RZWDII.js → chunk-7GUQYHKA.js} +19 -2
  27. package/dist/chunk-7GUQYHKA.js.map +1 -0
  28. package/dist/{chunk-ZNZ2JDBW.js → chunk-7IUSV4XG.js} +1 -1
  29. package/dist/chunk-7IUSV4XG.js.map +1 -0
  30. package/dist/{chunk-UMGY5JSP.js → chunk-7XJO4D6A.js} +22 -2
  31. package/dist/chunk-7XJO4D6A.js.map +1 -0
  32. package/dist/{chunk-KKNK3JUT.js → chunk-ABAXNUXU.js} +5 -5
  33. package/dist/chunk-ABAXNUXU.js.map +1 -0
  34. package/dist/{chunk-AQSKJ6U6.js → chunk-DNCOFEUL.js} +21 -2
  35. package/dist/chunk-DNCOFEUL.js.map +1 -0
  36. package/dist/chunk-EKYZCRCX.js +256 -0
  37. package/dist/chunk-EKYZCRCX.js.map +1 -0
  38. package/dist/{chunk-COUPLRZG.js → chunk-IR53BQUJ.js} +16 -12
  39. package/dist/chunk-IR53BQUJ.js.map +1 -0
  40. package/dist/{chunk-3V75EQIP.js → chunk-JGFZ42ZF.js} +3 -3
  41. package/dist/{chunk-3V75EQIP.js.map → chunk-JGFZ42ZF.js.map} +1 -1
  42. package/dist/{chunk-54HM36IQ.js → chunk-KAQUUTZR.js} +4 -2
  43. package/dist/chunk-KAQUUTZR.js.map +1 -0
  44. package/dist/{chunk-ZSYLBVWG.js → chunk-LIOXPQ7N.js} +4 -4
  45. package/dist/chunk-LIOXPQ7N.js.map +1 -0
  46. package/dist/{chunk-S6ZTTTV7.js → chunk-M6GLI6A6.js} +3 -3
  47. package/dist/{chunk-S6ZTTTV7.js.map → chunk-M6GLI6A6.js.map} +1 -1
  48. package/dist/{chunk-OQI7RCRP.js → chunk-MTM43SJO.js} +7 -1
  49. package/dist/chunk-MTM43SJO.js.map +1 -0
  50. package/dist/{chunk-5CE64WGC.js → chunk-OSCL5TKR.js} +3 -3
  51. package/dist/{chunk-5CE64WGC.js.map → chunk-OSCL5TKR.js.map} +1 -1
  52. package/dist/{chunk-DARTMI5Z.js → chunk-SV22UIW4.js} +2 -2
  53. package/dist/{chunk-DARTMI5Z.js.map → chunk-SV22UIW4.js.map} +1 -1
  54. package/dist/{chunk-ELRMBQEC.js → chunk-T7C2VZUB.js} +17 -2
  55. package/dist/chunk-T7C2VZUB.js.map +1 -0
  56. package/dist/{chunk-DJKWFYAA.js → chunk-YZV2PTY4.js} +3 -3
  57. package/dist/{chunk-DJKWFYAA.js.map → chunk-YZV2PTY4.js.map} +1 -1
  58. package/dist/collapsible-panel.d.ts +1 -1
  59. package/dist/collapsible-panel.js.map +1 -1
  60. package/dist/css-values.d.ts +41 -3
  61. package/dist/css-values.js +1 -1
  62. package/dist/grid.d.ts +15 -1
  63. package/dist/grid.js +2 -1
  64. package/dist/index.d.ts +1 -1
  65. package/dist/index.js +19 -19
  66. package/dist/list-action-row.js +1 -1
  67. package/dist/list-header.js +1 -1
  68. package/dist/list-item.js +1 -1
  69. package/dist/list.d.ts +21 -2
  70. package/dist/list.js +2 -1
  71. package/dist/nav-stack.js +1 -1
  72. package/dist/pane.d.ts +17 -2
  73. package/dist/pane.js +1 -1
  74. package/dist/row.d.ts +19 -1
  75. package/dist/row.js +2 -1
  76. package/dist/segmented-control.js +1 -1
  77. package/dist/select.d.ts +13 -3
  78. package/dist/select.js +1 -1
  79. package/dist/skeleton.d.ts +5 -1
  80. package/dist/skeleton.js +1 -1
  81. package/dist/spacer.js +1 -1
  82. package/dist/split-view.js +1 -1
  83. package/dist/state-banner.js +1 -1
  84. package/dist/styles/app-tab.css +9 -0
  85. package/dist/styles/catalog/components/catalog-example-stack.css +4 -1
  86. package/dist/styles/catalog/components/catalog-example.css +145 -0
  87. package/dist/styles/collapsible-panel.css +132 -4
  88. package/dist/styles/document.css +23 -0
  89. package/dist/styles/foundation.css +21 -7
  90. package/dist/styles/grid.css +10 -0
  91. package/dist/styles/list-header.css +45 -0
  92. package/dist/styles/list-inset-control.css +8 -1
  93. package/dist/styles/list-item.css +6 -0
  94. package/dist/styles/list.css +11 -0
  95. package/dist/styles/nav-stack.css +89 -2
  96. package/dist/styles/pane.css +86 -1
  97. package/dist/styles/resizable-region.css +93 -5
  98. package/dist/styles/row.css +10 -0
  99. package/dist/styles/select.css +39 -4
  100. package/dist/styles/skeleton.css +4 -1
  101. package/dist/styles/split-view.css +107 -1
  102. package/dist/styles/tab-scaffold.css +64 -1
  103. package/dist/styles/text.css +6 -0
  104. package/dist/styles/toolbar-control-group.css +90 -11
  105. package/dist/styles/toolbar-text.css +4 -1
  106. package/dist/styles/toolbar.css +130 -38
  107. package/dist/styles/webawesome.css +48 -2
  108. package/dist/styles/workbench.css +136 -4
  109. package/dist/text.d.ts +4 -3
  110. package/dist/text.js +1 -1
  111. package/dist/toolbar-text.js +1 -1
  112. package/dist/toolbar.d.ts +24 -3
  113. package/dist/toolbar.js +1 -1
  114. package/dist/{types-CzgSrFXP.d.ts → types-CEsieBZi.d.ts} +6 -1
  115. package/dist/value-table.js +1 -1
  116. package/dist/wire-resizable-regions.js +1 -1
  117. package/dist/wire-sidebar.d.ts +18 -3
  118. package/dist/wire-sidebar.js +96 -15
  119. package/dist/wire-sidebar.js.map +1 -1
  120. package/docs/accessibility.md +49 -9
  121. package/docs/app-layouts.md +73 -0
  122. package/docs/catalog.md +23 -2
  123. package/docs/collapsible-panel.md +83 -9
  124. package/docs/component-contract.md +36 -12
  125. package/docs/component-integration.md +9 -4
  126. package/docs/component-selection.md +25 -6
  127. package/docs/design/templates/list/stack-dark.svg +1 -1
  128. package/docs/design/templates/list/stack.svg +1 -1
  129. package/docs/design/templates/list-dark.svg +1 -1
  130. package/docs/design/templates/list-header/action-dark.svg +1 -1
  131. package/docs/design/templates/list-header/action.svg +1 -1
  132. package/docs/design/templates/list-header/count-dark.svg +1 -1
  133. package/docs/design/templates/list-header/count.svg +1 -1
  134. package/docs/design/templates/list-header/inline-action-dark.svg +1 -1
  135. package/docs/design/templates/list-header/inline-action.svg +1 -1
  136. package/docs/design/templates/list-header/toggle-expanded-dark.svg +1 -1
  137. package/docs/design/templates/list-header/toggle-expanded.svg +1 -1
  138. package/docs/design/templates/list-header-dark.svg +1 -1
  139. package/docs/design/templates/list-header.svg +1 -1
  140. package/docs/design/templates/list.svg +1 -1
  141. package/docs/design/templates/state-banner/info-badge-dark.svg +1 -1
  142. package/docs/design/templates/state-banner/info-badge.svg +1 -1
  143. package/docs/design/templates/state-banner-dark.svg +1 -1
  144. package/docs/design/templates/state-banner.svg +1 -1
  145. package/docs/design/templates/toolbar/title-and-actions-dark.svg +1 -1
  146. package/docs/design/templates/toolbar/title-and-actions.svg +1 -1
  147. package/docs/design/templates/toolbar-control-group/with-text-dark.svg +1 -1
  148. package/docs/design/templates/toolbar-control-group/with-text.svg +1 -1
  149. package/docs/design/templates/toolbar-control-group-dark.svg +1 -1
  150. package/docs/design/templates/toolbar-control-group.svg +1 -1
  151. package/docs/design/templates/toolbar-dark.svg +1 -1
  152. package/docs/design/templates/toolbar-text/default-dark.svg +1 -1
  153. package/docs/design/templates/toolbar-text/default.svg +1 -1
  154. package/docs/design/templates/toolbar-text/large-dark.svg +1 -1
  155. package/docs/design/templates/toolbar-text/large.svg +1 -1
  156. package/docs/design/templates/toolbar-text/small-dark.svg +1 -1
  157. package/docs/design/templates/toolbar-text/small.svg +1 -1
  158. package/docs/design/templates/toolbar-text-dark.svg +1 -1
  159. package/docs/design/templates/toolbar-text.svg +1 -1
  160. package/docs/design/templates/toolbar.svg +1 -1
  161. package/docs/document-baseline.md +31 -0
  162. package/docs/layout.md +86 -21
  163. package/docs/nav-stack.md +8 -0
  164. package/docs/recipes.md +81 -44
  165. package/docs/split-view.md +8 -0
  166. package/docs/tab-scaffold.md +4 -2
  167. package/docs/type-contracts.md +21 -17
  168. package/docs/ui-analyzer.md +19 -0
  169. package/docs/ui-evaluator.md +17 -0
  170. package/docs/ux-demo.md +5 -5
  171. package/docs/webawesome-theme.md +20 -2
  172. package/docs/workbench.md +20 -1
  173. package/evaluator/index.mjs +73 -8
  174. package/llms.txt +32 -14
  175. package/package.json +4 -2
  176. package/ux-demo/recipes/app-shell.tsx +209 -178
  177. package/ux-demo/recipes/collapsible-sidebar.tsx +189 -159
  178. package/ux-demo/recipes/compact-toolbar.tsx +48 -35
  179. package/ux-demo/recipes/composer-form.tsx +87 -79
  180. package/ux-demo/recipes/list-detail-dialog.tsx +124 -142
  181. package/ux-demo/recipes/list-workspace-states.tsx +83 -83
  182. package/ux-demo/recipes/loaders.ts +5 -2
  183. package/ux-demo/recipes/loading-inspector.tsx +157 -160
  184. package/ux-demo/recipes/navigation-sidebar.tsx +111 -109
  185. package/ux-demo/recipes/navigation-stack.tsx +50 -49
  186. package/ux-demo/recipes/types.ts +14 -0
  187. package/ux-demo/recipes/workspace-header.tsx +73 -56
  188. package/dist/chunk-54HM36IQ.js.map +0 -1
  189. package/dist/chunk-AQSKJ6U6.js.map +0 -1
  190. package/dist/chunk-COUPLRZG.js.map +0 -1
  191. package/dist/chunk-ELRMBQEC.js.map +0 -1
  192. package/dist/chunk-J3EE6XWD.js +0 -115
  193. package/dist/chunk-J3EE6XWD.js.map +0 -1
  194. package/dist/chunk-KKNK3JUT.js.map +0 -1
  195. package/dist/chunk-OL4TC3U2.js.map +0 -1
  196. package/dist/chunk-OQI7RCRP.js.map +0 -1
  197. package/dist/chunk-UMGY5JSP.js.map +0 -1
  198. package/dist/chunk-V6RZWDII.js.map +0 -1
  199. package/dist/chunk-ZNZ2JDBW.js.map +0 -1
  200. package/dist/chunk-ZSYLBVWG.js.map +0 -1
  201. package/ux-demo/recipes/app-shell.css +0 -87
  202. package/ux-demo/recipes/collapsible-sidebar.css +0 -83
  203. package/ux-demo/recipes/compact-toolbar.css +0 -35
  204. package/ux-demo/recipes/composer-form.css +0 -19
  205. package/ux-demo/recipes/list-detail-dialog.css +0 -42
  206. package/ux-demo/recipes/list-workspace-states.css +0 -30
  207. package/ux-demo/recipes/loading-inspector.css +0 -7
  208. package/ux-demo/recipes/navigation-sidebar.css +0 -12
  209. package/ux-demo/recipes/navigation-stack.css +0 -12
  210. package/ux-demo/recipes/recipe-root.css +0 -67
  211. package/ux-demo/recipes/recipe-root.tsx +0 -87
  212. package/ux-demo/recipes/workspace-header.css +0 -7
@@ -256,6 +256,10 @@
256
256
  "--kui-toolbar-group-inner-size",
257
257
  "--kui-toolbar-group-size",
258
258
  "--kui-toolbar-gap",
259
+ "--kui-safe-area-block-start",
260
+ "--kui-safe-area-block-end",
261
+ "--kui-safe-area-inline-start",
262
+ "--kui-safe-area-inline-end",
259
263
  "--kui-radius-s",
260
264
  "--kui-radius-m",
261
265
  "--kui-radius-l",
@@ -453,6 +457,7 @@
453
457
  "accessible labels",
454
458
  "header, content, and footer children",
455
459
  "which logical boundaries show separators",
460
+ "which sides may compensate for device safe areas in an app-owned arrangement (safeAreaEdges)",
456
461
  "responsive placement and visibility"
457
462
  ],
458
463
  "variants": [
@@ -473,7 +478,8 @@
473
478
  "border": "conditional",
474
479
  "padding": "child",
475
480
  "notes": [
476
- "The pane is unpadded; separators are independently opt-in on logical edges and default off."
481
+ "The pane is unpadded; separators are independently opt-in on logical edges and default off.",
482
+ "Safe areas: the root and separators paint through unsafe areas while header, content, and footer pad the sides the pane still reaches (routed by --kui-edge-inset-*); content block insets are scroll padding."
477
483
  ]
478
484
  },
479
485
  "delivery": {
@@ -492,6 +498,10 @@
492
498
  "kui-pane__toolbar"
493
499
  ],
494
500
  "publicTokens": [
501
+ "--kui-edge-inset-block-end",
502
+ "--kui-edge-inset-block-start",
503
+ "--kui-edge-inset-inline-end",
504
+ "--kui-edge-inset-inline-start",
495
505
  "--kui-pane-separator-color",
496
506
  "--kui-pane-separator-width"
497
507
  ],
@@ -575,7 +585,24 @@
575
585
  {
576
586
  "export": "wireNavStack",
577
587
  "import": "@kerfjs/ui/wire-nav-stack",
578
- "required": true
588
+ "required": true,
589
+ "stateAttributes": [
590
+ {
591
+ "name": "data-nav-chrome-transition",
592
+ "on": "kui-nav-stack",
593
+ "meaning": "\"true\" while the chrome cross-fades between the outgoing and incoming view."
594
+ },
595
+ {
596
+ "name": "data-nav-chrome-copy",
597
+ "on": "kui-nav-stack__chrome-copy",
598
+ "meaning": "Marks the inert, aria-hidden snapshot of the outgoing chrome shown during the cross-fade."
599
+ },
600
+ {
601
+ "name": "data-nav-exiting",
602
+ "on": "kui-nav-stack__view",
603
+ "meaning": "\"true\" on a popped view the helper briefly re-inserts to slide it out."
604
+ }
605
+ ]
579
606
  }
580
607
  ],
581
608
  "publicClasses": [
@@ -678,12 +705,41 @@
678
705
  {
679
706
  "export": "wireResizableRegions",
680
707
  "import": "@kerfjs/ui/wire-resizable-regions",
681
- "required": false
708
+ "required": false,
709
+ "stateAttributes": [
710
+ {
711
+ "name": "data-handle-inset",
712
+ "on": "kui-resizable-region",
713
+ "meaning": "Present while a clipping edge clamps the region: the handle and its focus ring sit inside the region instead of overhanging that edge."
714
+ },
715
+ {
716
+ "name": "data-resizing",
717
+ "on": "kui-resizable-region",
718
+ "meaning": "\"true\" during an active pointer drag of the handle."
719
+ }
720
+ ]
682
721
  },
683
722
  {
684
723
  "export": "wireNavStack",
685
724
  "import": "@kerfjs/ui/wire-nav-stack",
686
- "required": true
725
+ "required": true,
726
+ "stateAttributes": [
727
+ {
728
+ "name": "data-nav-chrome-transition",
729
+ "on": "kui-nav-stack",
730
+ "meaning": "\"true\" while the chrome cross-fades between the outgoing and incoming view."
731
+ },
732
+ {
733
+ "name": "data-nav-chrome-copy",
734
+ "on": "kui-nav-stack__chrome-copy",
735
+ "meaning": "Marks the inert, aria-hidden snapshot of the outgoing chrome shown during the cross-fade."
736
+ },
737
+ {
738
+ "name": "data-nav-exiting",
739
+ "on": "kui-nav-stack__view",
740
+ "meaning": "\"true\" on a popped view the helper briefly re-inserts to slide it out."
741
+ }
742
+ ]
687
743
  }
688
744
  ],
689
745
  "publicClasses": [
@@ -965,7 +1021,24 @@
965
1021
  {
966
1022
  "export": "wireSidebar",
967
1023
  "import": "@kerfjs/ui/wire-sidebar",
968
- "required": true
1024
+ "required": true,
1025
+ "stateAttributes": [
1026
+ {
1027
+ "name": "data-collapsible-responsive",
1028
+ "on": "the root passed to wireSidebar",
1029
+ "meaning": "With a deviceClass: \"inline\" on a wide device class, otherwise the compact presentation (\"overlay\" or \"hidden\"). Re-applied if a re-render drops it."
1030
+ },
1031
+ {
1032
+ "name": "data-collapsible-overlay",
1033
+ "on": "the root passed to wireSidebar",
1034
+ "meaning": "With a deviceClass on a compact device: \"true\" for the overlay presentation, \"false\" for hidden. Absent on a wide device class. Re-applied if a re-render drops it."
1035
+ },
1036
+ {
1037
+ "name": "data-morph-preserve",
1038
+ "on": "kui-collapsible-panel__backdrop",
1039
+ "meaning": "Keeps the injected compact-overlay backdrop through the application's re-render; the helper creates and removes the backdrop itself."
1040
+ }
1041
+ ]
969
1042
  }
970
1043
  ],
971
1044
  "publicClasses": [
@@ -1091,13 +1164,19 @@
1091
1164
  "appOwns": [
1092
1165
  "actions",
1093
1166
  "command availability",
1094
- "responsive relocation"
1167
+ "responsive relocation",
1168
+ "which screen edges an app bar or bottom bar outside a Pane header or footer claims for device safe areas (safeAreaEdges)"
1095
1169
  ],
1096
1170
  "variants": [
1097
1171
  "bottom divider (default)",
1098
1172
  "no dividers",
1099
1173
  "top/right/bottom/left divider combinations",
1100
- "centered content"
1174
+ "centered content",
1175
+ "stacked zones at compact or narrow widths",
1176
+ "content-driven wrap that keeps a heading title whole",
1177
+ "center priority for an expanded center control",
1178
+ "trailing groups wrap instead of clipping",
1179
+ "app bar or bottom bar claiming its screen edges (safeAreaEdges)"
1101
1180
  ],
1102
1181
  "accessibility": [
1103
1182
  "Supply a label when the toolbar needs an accessible name."
@@ -1107,7 +1186,8 @@
1107
1186
  "border": "conditional",
1108
1187
  "padding": "self",
1109
1188
  "notes": [
1110
- "Padding belongs to the toolbar; dividerSides selects any canonical combination of its physical top, right, bottom, and left edges."
1189
+ "Padding belongs to the toolbar; dividerSides selects any canonical combination of its physical top, right, bottom, and left edges.",
1190
+ "Safe areas: a Pane header or footer hands a sole Toolbar its inline edges; an app bar or bottom bar at a screen edge claims its sides with safeAreaEdges and pads each claimed side by the --kui-edge-inset-* context or the full device inset, while its box and dividers paint through."
1111
1191
  ]
1112
1192
  },
1113
1193
  "delivery": {
@@ -1402,9 +1482,21 @@
1402
1482
  "Render toolbar identity or heading text at a supported hierarchy size; pass headingLevel for heading semantics."
1403
1483
  ],
1404
1484
  "avoidWhen": [
1405
- "Do not omit headingLevel when the text is the page or section heading."
1485
+ "Do not omit headingLevel when the text is the page or section heading.",
1486
+ "Do not use a size below xlarge as a normal-color subsection title: large, default, and small are intentionally quiet toolbar identity text and have no tone option. Use Text with an h2-h6 variant for a content subsection title, or ListHeader for a list or menu section."
1487
+ ],
1488
+ "alternatives": [
1489
+ {
1490
+ "id": "text",
1491
+ "relationship": "semantic-alternative",
1492
+ "when": "Use Text variant h2-h6 for a normal-color subsection title in content rather than toolbar identity."
1493
+ },
1494
+ {
1495
+ "id": "list-header",
1496
+ "relationship": "semantic-alternative",
1497
+ "when": "Use ListHeader for a list or menu section label with a count, badge, action, or disclosure."
1498
+ }
1406
1499
  ],
1407
- "alternatives": [],
1408
1500
  "appOwns": [
1409
1501
  "text",
1410
1502
  "responsive priority"
@@ -1436,8 +1528,10 @@
1436
1528
  ],
1437
1529
  "publicTokens": [
1438
1530
  "--kui-color-neutral-on-quiet",
1531
+ "--kui-color-text",
1532
+ "--kui-font-2xl",
1533
+ "--kui-font-l",
1439
1534
  "--kui-font-m",
1440
- "--kui-font-mono",
1441
1535
  "--kui-font-s",
1442
1536
  "--kui-font-xs"
1443
1537
  ],
@@ -1453,12 +1547,14 @@
1453
1547
  "category": "Structure",
1454
1548
  "kind": "component",
1455
1549
  "source": "kerf",
1456
- "description": "Semantic native paragraph text by default, with heading variants, composable semantic presentation roles, and standard padded content geometry.",
1550
+ "description": "Semantic native paragraph text by default, with heading and inline-span variants plus composable semantic presentation roles.",
1457
1551
  "uses": [],
1458
- "purpose": "Render paragraph semantics by default or h1 through h6 when selected, while independently configuring quiet or danger tone, compact size, or monospace font and consistently supplying standard geometry.",
1459
- "publicExports": ["Text"],
1552
+ "purpose": "Render paragraph semantics by default, h1 through h6 when selected, or geometry-free inline secondary text as a span while independently configuring quiet or danger tone, compact size, or monospace font.",
1553
+ "publicExports": [
1554
+ "Text"
1555
+ ],
1460
1556
  "useWhen": [
1461
- "Render ordinary application headings or paragraphs that should use native document semantics and the standard text-box inset."
1557
+ "Render ordinary application headings or paragraphs with native document semantics, or inline secondary text inside rows, labels, and table cells."
1462
1558
  ],
1463
1559
  "avoidWhen": [
1464
1560
  "Do not use Text for toolbar identity or title content; use ToolbarText inside a Toolbar zone.",
@@ -1483,13 +1579,13 @@
1483
1579
  "document heading hierarchy"
1484
1580
  ],
1485
1581
  "variants": [
1486
- "p or h1 through h6 semantic variant",
1582
+ "p, h1 through h6, or inline span semantic variant",
1487
1583
  "default, quiet, or danger tone",
1488
1584
  "default or compact size",
1489
1585
  "default or monospace font"
1490
1586
  ],
1491
1587
  "accessibility": [
1492
- "Text renders a native paragraph by default; choose an h1 through h6 variant by document outline rather than appearance.",
1588
+ "Text renders a native paragraph by default; choose an h1 through h6 variant by document outline rather than appearance, or span for inline secondary text.",
1493
1589
  "Ordinary global, data, and ARIA attributes pass through to the native element.",
1494
1590
  "Choose tone, size, and font independently of the heading level so appearance does not distort the document outline."
1495
1591
  ],
@@ -1498,16 +1594,20 @@
1498
1594
  "border": "self",
1499
1595
  "padding": "self",
1500
1596
  "notes": [
1501
- "Text resets the native variant's margin and adds a 1px transparent border plus the standard 8px item padding."
1597
+ "Block Text variants reset native margins and add a 1px transparent border plus the standard 8px item padding; span has no margin, border, or padding."
1502
1598
  ]
1503
1599
  },
1504
1600
  "delivery": {
1505
1601
  "browserImport": "@kerfjs/ui/text",
1506
1602
  "manualCssImport": "@kerfjs/ui/text.css",
1507
- "sideEffects": ["browser-condition-css"]
1603
+ "sideEffects": [
1604
+ "browser-condition-css"
1605
+ ]
1508
1606
  },
1509
1607
  "wiring": [],
1510
- "publicClasses": ["kui-text"],
1608
+ "publicClasses": [
1609
+ "kui-text"
1610
+ ],
1511
1611
  "publicTokens": [
1512
1612
  "--kui-color-danger-text",
1513
1613
  "--kui-color-text-quiet",
@@ -1652,60 +1752,107 @@
1652
1752
  {
1653
1753
  "id": "row",
1654
1754
  "name": "Row",
1655
- "category": "Structure",
1755
+ "category": "Structure",
1656
1756
  "kind": "component",
1657
1757
  "source": "kerf",
1658
1758
  "description": "A horizontal flex row with physical-axis alignment, side-selectable text/control insets, a typed xs gap by default, flex participation, and opt-in wrapping.",
1659
1759
  "uses": [],
1660
1760
  "purpose": "Arrange related content horizontally with consistent spacing, optional physical-side text/control insets, and explicit left/center/right/full plus top/middle/bottom/full/baseline alignment instead of application-owned flex wrappers.",
1661
- "publicExports": ["Row"],
1761
+ "publicExports": [
1762
+ "Row"
1763
+ ],
1662
1764
  "cssValueProps": [
1663
1765
  {
1664
1766
  "path": "gap",
1665
1767
  "grammar": "length",
1666
- "helpers": ["px", "rem", "em", "pct", "space", "lengthVar", "calc"],
1667
- "nonStandaloneHelpers": ["plus"],
1668
- "shorthands": ["none", "2xs", "xs", "s", "m", "l", "xl"],
1669
- "canonicalShorthands": ["none", "2xs", "xs", "m", "l"],
1670
- "exceptionalShorthands": ["s", "xl"],
1768
+ "helpers": [
1769
+ "px",
1770
+ "rem",
1771
+ "em",
1772
+ "pct",
1773
+ "space",
1774
+ "lengthVar",
1775
+ "calc"
1776
+ ],
1777
+ "nonStandaloneHelpers": [
1778
+ "plus"
1779
+ ],
1780
+ "shorthands": [
1781
+ "none",
1782
+ "2xs",
1783
+ "xs",
1784
+ "s",
1785
+ "m",
1786
+ "l",
1787
+ "xl"
1788
+ ],
1789
+ "canonicalShorthands": [
1790
+ "none",
1791
+ "2xs",
1792
+ "xs",
1793
+ "m",
1794
+ "l"
1795
+ ],
1796
+ "exceptionalShorthands": [
1797
+ "s",
1798
+ "xl"
1799
+ ],
1671
1800
  "rawPolicy": "forbid",
1672
- "examples": ["gap=\"xs\"", "gap={space(\"m\")}", "gap={calc(plus(rem(0.25), pct(10)))}"]
1801
+ "examples": [
1802
+ "gap=\"xs\"",
1803
+ "gap={space(\"m\")}",
1804
+ "gap={calc(plus(rem(0.25), pct(10)))}"
1805
+ ]
1673
1806
  },
1674
1807
  {
1675
1808
  "path": "flex",
1676
1809
  "grammar": "flex",
1677
- "helpers": ["flex"],
1678
- "shorthands": ["none", "auto", "initial"],
1679
- "canonicalShorthands": ["none", "auto", "initial"],
1810
+ "helpers": [
1811
+ "flex"
1812
+ ],
1813
+ "shorthands": [
1814
+ "none",
1815
+ "auto",
1816
+ "initial"
1817
+ ],
1818
+ "canonicalShorthands": [
1819
+ "none",
1820
+ "auto",
1821
+ "initial"
1822
+ ],
1680
1823
  "exceptionalShorthands": [],
1681
1824
  "rawPolicy": "forbid",
1682
- "examples": ["flex", "flex=\"none\"", "flex={flex(1, 1, rem(20))}"]
1825
+ "examples": [
1826
+ "flex",
1827
+ "flex=\"none\"",
1828
+ "flex={flex(1, 1, rem(20))}"
1829
+ ]
1683
1830
  }
1684
1831
  ],
1685
1832
  "useWhen": [
1686
1833
  "Arrange a group of sibling components horizontally.",
1687
1834
  "Choose physical horizontal distribution and vertical alignment without writing one-off flex CSS.",
1688
1835
  "Use a finite flex keyword or the flex() builder when Row participates in a flexible parent layout.",
1689
- "Allow a bounded group to wrap while retaining the same typed gap and alignment contract."
1690
- ,"Apply the standard text or control inset to selected physical sides without an application wrapper."
1836
+ "Allow a bounded group to wrap while retaining the same typed gap and alignment contract.",
1837
+ "Apply the standard text or control inset to selected physical sides without an application wrapper."
1691
1838
  ],
1692
1839
  "avoidWhen": [
1693
1840
  "Do not use Row when content belongs in a semantic list or when a named-zone component such as Toolbar owns the composition.",
1694
1841
  "Do not pass raw CSS strings to gap or flex, mix their distinct grammars, or use s/xl spacing steps without a deliberate exception.",
1695
1842
  "Do not use alignment to replace semantic grouping or responsive relocation."
1696
1843
  ],
1697
- "alternatives": [
1698
- {
1699
- "id": "list",
1700
- "relationship": "axis-alternative",
1701
- "when": "Use List when the main layout axis is vertical."
1702
- },
1703
- {
1704
- "id": "toolbar",
1705
- "relationship": "semantic-alternative",
1706
- "when": "Use Toolbar when content belongs to named leading, center, and trailing application-chrome zones."
1707
- }
1708
- ],
1844
+ "alternatives": [
1845
+ {
1846
+ "id": "list",
1847
+ "relationship": "axis-alternative",
1848
+ "when": "Use List when the main layout axis is vertical."
1849
+ },
1850
+ {
1851
+ "id": "toolbar",
1852
+ "relationship": "semantic-alternative",
1853
+ "when": "Use Toolbar when content belongs to named leading, center, and trailing application-chrome zones."
1854
+ }
1855
+ ],
1709
1856
  "appOwns": [
1710
1857
  "child semantics and content",
1711
1858
  "alignment and wrapping policy",
@@ -1718,7 +1865,9 @@
1718
1865
  "typed CssLength gap",
1719
1866
  "boolean, finite-keyword, or typed CssFlex flex",
1720
1867
  "nowrap or wrapping",
1721
- "top/right/bottom/left text and control inset combinations"
1868
+ "top/right/bottom/left text and control inset combinations",
1869
+ "fill: the layout root fills a definite-height parent",
1870
+ "rootAttributes: safe data-* metadata on the root"
1722
1871
  ],
1723
1872
  "accessibility": [
1724
1873
  "Row adds layout only and no grouping role; children retain responsibility for native or ARIA semantics.",
@@ -1735,11 +1884,18 @@
1735
1884
  "delivery": {
1736
1885
  "browserImport": "@kerfjs/ui/row",
1737
1886
  "manualCssImport": "@kerfjs/ui/row.css",
1738
- "sideEffects": ["browser-condition-css"]
1887
+ "sideEffects": [
1888
+ "browser-condition-css"
1889
+ ]
1739
1890
  },
1740
1891
  "wiring": [],
1741
- "publicClasses": ["kui-row"],
1742
- "publicTokens": ["--kui-layout-item-gap", "--kui-row-gap"],
1892
+ "publicClasses": [
1893
+ "kui-row"
1894
+ ],
1895
+ "publicTokens": [
1896
+ "--kui-layout-item-gap",
1897
+ "--kui-row-gap"
1898
+ ],
1743
1899
  "links": {
1744
1900
  "catalogRoute": "?component=row",
1745
1901
  "documentation": "docs/layout.md",
@@ -1755,28 +1911,75 @@
1755
1911
  "description": "A fixed positive number of evenly distributed minmax columns with a typed xs gap by default and optional flex participation.",
1756
1912
  "uses": [],
1757
1913
  "purpose": "Arrange related siblings in equal-width columns without repeating application-owned grid-template-columns CSS.",
1758
- "publicExports": ["Grid"],
1914
+ "publicExports": [
1915
+ "Grid"
1916
+ ],
1759
1917
  "cssValueProps": [
1760
1918
  {
1761
1919
  "path": "gap",
1762
1920
  "grammar": "length",
1763
- "helpers": ["px", "rem", "em", "pct", "space", "lengthVar", "calc"],
1764
- "nonStandaloneHelpers": ["plus"],
1765
- "shorthands": ["none", "2xs", "xs", "s", "m", "l", "xl"],
1766
- "canonicalShorthands": ["none", "2xs", "xs", "m", "l"],
1767
- "exceptionalShorthands": ["s", "xl"],
1921
+ "helpers": [
1922
+ "px",
1923
+ "rem",
1924
+ "em",
1925
+ "pct",
1926
+ "space",
1927
+ "lengthVar",
1928
+ "calc"
1929
+ ],
1930
+ "nonStandaloneHelpers": [
1931
+ "plus"
1932
+ ],
1933
+ "shorthands": [
1934
+ "none",
1935
+ "2xs",
1936
+ "xs",
1937
+ "s",
1938
+ "m",
1939
+ "l",
1940
+ "xl"
1941
+ ],
1942
+ "canonicalShorthands": [
1943
+ "none",
1944
+ "2xs",
1945
+ "xs",
1946
+ "m",
1947
+ "l"
1948
+ ],
1949
+ "exceptionalShorthands": [
1950
+ "s",
1951
+ "xl"
1952
+ ],
1768
1953
  "rawPolicy": "forbid",
1769
- "examples": ["gap=\"m\"", "gap={space(\"m\")}", "gap={calc(plus(rem(0.25), pct(10)))}"]
1954
+ "examples": [
1955
+ "gap=\"m\"",
1956
+ "gap={space(\"m\")}",
1957
+ "gap={calc(plus(rem(0.25), pct(10)))}"
1958
+ ]
1770
1959
  },
1771
1960
  {
1772
1961
  "path": "flex",
1773
1962
  "grammar": "flex",
1774
- "helpers": ["flex"],
1775
- "shorthands": ["none", "auto", "initial"],
1776
- "canonicalShorthands": ["none", "auto", "initial"],
1963
+ "helpers": [
1964
+ "flex"
1965
+ ],
1966
+ "shorthands": [
1967
+ "none",
1968
+ "auto",
1969
+ "initial"
1970
+ ],
1971
+ "canonicalShorthands": [
1972
+ "none",
1973
+ "auto",
1974
+ "initial"
1975
+ ],
1777
1976
  "exceptionalShorthands": [],
1778
1977
  "rawPolicy": "forbid",
1779
- "examples": ["flex", "flex=\"none\"", "flex={flex(1, 1, rem(20))}"]
1978
+ "examples": [
1979
+ "flex",
1980
+ "flex=\"none\"",
1981
+ "flex={flex(1, 1, rem(20))}"
1982
+ ]
1780
1983
  }
1781
1984
  ],
1782
1985
  "useWhen": [
@@ -1816,7 +2019,9 @@
1816
2019
  "any positive safe-integer equal-track count",
1817
2020
  "named none/2xs/xs/s/m/l/xl token gap",
1818
2021
  "typed CssLength gap",
1819
- "boolean, finite-keyword, or typed CssFlex flex"
2022
+ "boolean, finite-keyword, or typed CssFlex flex",
2023
+ "fill: the layout root fills a definite-height parent",
2024
+ "rootAttributes: safe data-* metadata on the root"
1820
2025
  ],
1821
2026
  "accessibility": [
1822
2027
  "Grid adds layout only and no grid role; children retain responsibility for native or ARIA semantics.",
@@ -1833,11 +2038,18 @@
1833
2038
  "delivery": {
1834
2039
  "browserImport": "@kerfjs/ui/grid",
1835
2040
  "manualCssImport": "@kerfjs/ui/grid.css",
1836
- "sideEffects": ["browser-condition-css"]
2041
+ "sideEffects": [
2042
+ "browser-condition-css"
2043
+ ]
1837
2044
  },
1838
2045
  "wiring": [],
1839
- "publicClasses": ["kui-grid"],
1840
- "publicTokens": ["--kui-grid-gap", "--kui-layout-item-gap"],
2046
+ "publicClasses": [
2047
+ "kui-grid"
2048
+ ],
2049
+ "publicTokens": [
2050
+ "--kui-grid-gap",
2051
+ "--kui-layout-item-gap"
2052
+ ],
1841
2053
  "links": {
1842
2054
  "catalogRoute": "?component=grid",
1843
2055
  "documentation": "docs/layout.md",
@@ -1853,29 +2065,92 @@
1853
2065
  "description": "A decorative, non-shrinking fixed gap or flexible main-axis spacer with typed physical width and height.",
1854
2066
  "uses": [],
1855
2067
  "purpose": "Express an intentional empty dimension or consume remaining flex space without application-owned spacer markup or raw CSS lengths.",
1856
- "publicExports": ["Spacer"],
2068
+ "publicExports": [
2069
+ "Spacer"
2070
+ ],
1857
2071
  "cssValueProps": [
1858
2072
  {
1859
2073
  "path": "width",
1860
2074
  "grammar": "length",
1861
- "helpers": ["px", "rem", "em", "pct", "space", "lengthVar", "calc"],
1862
- "nonStandaloneHelpers": ["plus"],
1863
- "shorthands": ["none", "2xs", "xs", "s", "m", "l", "xl"],
1864
- "canonicalShorthands": ["none", "2xs", "xs", "m", "l"],
1865
- "exceptionalShorthands": ["s", "xl"],
2075
+ "helpers": [
2076
+ "px",
2077
+ "rem",
2078
+ "em",
2079
+ "pct",
2080
+ "space",
2081
+ "lengthVar",
2082
+ "calc"
2083
+ ],
2084
+ "nonStandaloneHelpers": [
2085
+ "plus"
2086
+ ],
2087
+ "shorthands": [
2088
+ "none",
2089
+ "2xs",
2090
+ "xs",
2091
+ "s",
2092
+ "m",
2093
+ "l",
2094
+ "xl"
2095
+ ],
2096
+ "canonicalShorthands": [
2097
+ "none",
2098
+ "2xs",
2099
+ "xs",
2100
+ "m",
2101
+ "l"
2102
+ ],
2103
+ "exceptionalShorthands": [
2104
+ "s",
2105
+ "xl"
2106
+ ],
1866
2107
  "rawPolicy": "forbid",
1867
- "examples": ["width=\"m\"", "width={space(\"m\")}", "width={calc(plus(rem(0.25), pct(10)))}"]
2108
+ "examples": [
2109
+ "width=\"m\"",
2110
+ "width={space(\"m\")}",
2111
+ "width={calc(plus(rem(0.25), pct(10)))}"
2112
+ ]
1868
2113
  },
1869
2114
  {
1870
2115
  "path": "height",
1871
2116
  "grammar": "length",
1872
- "helpers": ["px", "rem", "em", "pct", "space", "lengthVar", "calc"],
1873
- "nonStandaloneHelpers": ["plus"],
1874
- "shorthands": ["none", "2xs", "xs", "s", "m", "l", "xl"],
1875
- "canonicalShorthands": ["none", "2xs", "xs", "m", "l"],
1876
- "exceptionalShorthands": ["s", "xl"],
2117
+ "helpers": [
2118
+ "px",
2119
+ "rem",
2120
+ "em",
2121
+ "pct",
2122
+ "space",
2123
+ "lengthVar",
2124
+ "calc"
2125
+ ],
2126
+ "nonStandaloneHelpers": [
2127
+ "plus"
2128
+ ],
2129
+ "shorthands": [
2130
+ "none",
2131
+ "2xs",
2132
+ "xs",
2133
+ "s",
2134
+ "m",
2135
+ "l",
2136
+ "xl"
2137
+ ],
2138
+ "canonicalShorthands": [
2139
+ "none",
2140
+ "2xs",
2141
+ "xs",
2142
+ "m",
2143
+ "l"
2144
+ ],
2145
+ "exceptionalShorthands": [
2146
+ "s",
2147
+ "xl"
2148
+ ],
1877
2149
  "rawPolicy": "forbid",
1878
- "examples": ["height=\"xs\"", "height={rem(1)}"]
2150
+ "examples": [
2151
+ "height=\"xs\"",
2152
+ "height={rem(1)}"
2153
+ ]
1879
2154
  }
1880
2155
  ],
1881
2156
  "useWhen": [
@@ -1925,10 +2200,14 @@
1925
2200
  "delivery": {
1926
2201
  "browserImport": "@kerfjs/ui/spacer",
1927
2202
  "manualCssImport": "@kerfjs/ui/spacer.css",
1928
- "sideEffects": ["browser-condition-css"]
2203
+ "sideEffects": [
2204
+ "browser-condition-css"
2205
+ ]
1929
2206
  },
1930
2207
  "wiring": [],
1931
- "publicClasses": ["kui-spacer"],
2208
+ "publicClasses": [
2209
+ "kui-spacer"
2210
+ ],
1932
2211
  "publicTokens": [],
1933
2212
  "links": {
1934
2213
  "catalogRoute": "?component=spacer",
@@ -1965,23 +2244,67 @@
1965
2244
  {
1966
2245
  "path": "gap",
1967
2246
  "grammar": "length",
1968
- "helpers": ["px", "rem", "em", "pct", "space", "lengthVar", "calc"],
1969
- "nonStandaloneHelpers": ["plus"],
1970
- "shorthands": ["none", "2xs", "xs", "s", "m", "l", "xl"],
1971
- "canonicalShorthands": ["none", "2xs", "xs", "m", "l"],
1972
- "exceptionalShorthands": ["s", "xl"],
2247
+ "helpers": [
2248
+ "px",
2249
+ "rem",
2250
+ "em",
2251
+ "pct",
2252
+ "space",
2253
+ "lengthVar",
2254
+ "calc"
2255
+ ],
2256
+ "nonStandaloneHelpers": [
2257
+ "plus"
2258
+ ],
2259
+ "shorthands": [
2260
+ "none",
2261
+ "2xs",
2262
+ "xs",
2263
+ "s",
2264
+ "m",
2265
+ "l",
2266
+ "xl"
2267
+ ],
2268
+ "canonicalShorthands": [
2269
+ "none",
2270
+ "2xs",
2271
+ "xs",
2272
+ "m",
2273
+ "l"
2274
+ ],
2275
+ "exceptionalShorthands": [
2276
+ "s",
2277
+ "xl"
2278
+ ],
1973
2279
  "rawPolicy": "forbid",
1974
- "examples": ["gap=\"xs\"", "gap={rem(0.25)}", "gap={calc(plus(rem(0.25), pct(10)))}"]
2280
+ "examples": [
2281
+ "gap=\"xs\"",
2282
+ "gap={rem(0.25)}",
2283
+ "gap={calc(plus(rem(0.25), pct(10)))}"
2284
+ ]
1975
2285
  },
1976
2286
  {
1977
2287
  "path": "flex",
1978
2288
  "grammar": "flex",
1979
- "helpers": ["flex"],
1980
- "shorthands": ["none", "auto", "initial"],
1981
- "canonicalShorthands": ["none", "auto", "initial"],
2289
+ "helpers": [
2290
+ "flex"
2291
+ ],
2292
+ "shorthands": [
2293
+ "none",
2294
+ "auto",
2295
+ "initial"
2296
+ ],
2297
+ "canonicalShorthands": [
2298
+ "none",
2299
+ "auto",
2300
+ "initial"
2301
+ ],
1982
2302
  "exceptionalShorthands": [],
1983
2303
  "rawPolicy": "forbid",
1984
- "examples": ["flex=\"none\"", "flex={flex(1, 1, rem(20))}"]
2304
+ "examples": [
2305
+ "flex=\"none\"",
2306
+ "flex={flex(1, 1, rem(20))}"
2307
+ ]
1985
2308
  }
1986
2309
  ],
1987
2310
  "useWhen": [
@@ -1989,8 +2312,8 @@
1989
2312
  "Let one bounded list own vertical scrolling, flex growth, or one or more physical-edge dividers.",
1990
2313
  "Choose a finite gap shorthand such as xs or m, or compose a typed length with @kerfjs/ui/css-values when the spacing scale is insufficient.",
1991
2314
  "Use a finite flex keyword or the flex() builder when List participates in flexible layout.",
1992
- "Apply the standard text or control inset to selected physical sides without an application wrapper."
1993
- ,"Align children horizontally or distribute them vertically with the same physical alignment vocabulary as Row."
2315
+ "Apply the standard text or control inset to selected physical sides without an application wrapper.",
2316
+ "Align children horizontally or distribute them vertically with the same physical alignment vocabulary as Row."
1994
2317
  ],
1995
2318
  "avoidWhen": [
1996
2319
  "Do not use List as semantic list markup; use ul/ol when list semantics are required and apply layout deliberately.",
@@ -2013,7 +2336,9 @@
2013
2336
  "left/center/right/full horizontal alignment",
2014
2337
  "top/middle/bottom/full vertical alignment",
2015
2338
  "top/right/bottom/left divider combinations",
2016
- "top/right/bottom/left text and control inset combinations"
2339
+ "top/right/bottom/left text and control inset combinations",
2340
+ "fill: the layout root fills a definite-height parent",
2341
+ "rootAttributes: safe data-* metadata on the root"
2017
2342
  ],
2018
2343
  "accessibility": [
2019
2344
  "List adds layout only and no list role; children retain responsibility for their native or ARIA semantics.",
@@ -2168,7 +2493,9 @@
2168
2493
  "canonicalShorthands": [],
2169
2494
  "exceptionalShorthands": [],
2170
2495
  "rawPolicy": "forbid",
2171
- "examples": ["className=\"app-row\""]
2496
+ "examples": [
2497
+ "className=\"app-row\""
2498
+ ]
2172
2499
  }
2173
2500
  ],
2174
2501
  "useWhen": [
@@ -2294,7 +2621,9 @@
2294
2621
  "canonicalShorthands": [],
2295
2622
  "exceptionalShorthands": [],
2296
2623
  "rawPolicy": "forbid",
2297
- "examples": ["className=\"app-row\""]
2624
+ "examples": [
2625
+ "className=\"app-row\""
2626
+ ]
2298
2627
  }
2299
2628
  ],
2300
2629
  "useWhen": [
@@ -2507,7 +2836,9 @@
2507
2836
  "uses": [
2508
2837
  "tabs",
2509
2838
  "tab-bar",
2510
- "toolbar-control-group"
2839
+ "toolbar-control-group",
2840
+ "text",
2841
+ "wa-card"
2511
2842
  ],
2512
2843
  "purpose": "Show AppTab and TabBar in a complete controlled composition.",
2513
2844
  "publicExports": [],
@@ -2728,7 +3059,24 @@
2728
3059
  {
2729
3060
  "export": "wireTabBars",
2730
3061
  "import": "@kerfjs/ui/wire-tab-bars",
2731
- "required": true
3062
+ "required": true,
3063
+ "stateAttributes": [
3064
+ {
3065
+ "name": "data-tab-dragging",
3066
+ "on": "AppTab (data-component=\"app-tab\")",
3067
+ "meaning": "\"true\" on the tab being dragged."
3068
+ },
3069
+ {
3070
+ "name": "data-tab-drop-position",
3071
+ "on": "AppTab (data-component=\"app-tab\")",
3072
+ "meaning": "\"before\" or \"after\" on the tab under the pointer: where the dragged tab would land."
3073
+ },
3074
+ {
3075
+ "name": "data-tab-autoscroll",
3076
+ "on": "kui-tab-bar__tabs",
3077
+ "meaning": "\"start\" or \"end\" while a drag near that edge auto-scrolls the strip."
3078
+ }
3079
+ ]
2732
3080
  },
2733
3081
  {
2734
3082
  "export": "reorderTabs",
@@ -2932,7 +3280,19 @@
2932
3280
  {
2933
3281
  "export": "wireTokenSearchFields",
2934
3282
  "import": "@kerfjs/ui/wire-token-search-fields",
2935
- "required": true
3283
+ "required": true,
3284
+ "stateAttributes": [
3285
+ {
3286
+ "name": "data-token-search-text",
3287
+ "on": "the text span inside kui-token-search__editor",
3288
+ "meaning": "Marks the plain-text span the helper inserts when the editor is emptied."
3289
+ },
3290
+ {
3291
+ "name": "data-empty",
3292
+ "on": "the text span inside kui-token-search__editor",
3293
+ "meaning": "\"true\" on that span while it holds no text."
3294
+ }
3295
+ ]
2936
3296
  }
2937
3297
  ],
2938
3298
  "publicClasses": [
@@ -3046,7 +3406,19 @@
3046
3406
  {
3047
3407
  "export": "wireResizableRegions",
3048
3408
  "import": "@kerfjs/ui/wire-resizable-regions",
3049
- "required": true
3409
+ "required": true,
3410
+ "stateAttributes": [
3411
+ {
3412
+ "name": "data-handle-inset",
3413
+ "on": "kui-resizable-region",
3414
+ "meaning": "Present while a clipping edge clamps the region: the handle and its focus ring sit inside the region instead of overhanging that edge."
3415
+ },
3416
+ {
3417
+ "name": "data-resizing",
3418
+ "on": "kui-resizable-region",
3419
+ "meaning": "\"true\" during an active pointer drag of the handle."
3420
+ }
3421
+ ]
3050
3422
  },
3051
3423
  {
3052
3424
  "export": "clampRegionSize",
@@ -3072,6 +3444,7 @@
3072
3444
  "--kui-color-text-link",
3073
3445
  "--kui-focus-ring",
3074
3446
  "--kui-radius-s",
3447
+ "--kui-resizable-region-edge-extent",
3075
3448
  "--kui-resizable-region-handle-active-color",
3076
3449
  "--kui-resizable-region-handle-color",
3077
3450
  "--kui-resizable-region-overlay-z",
@@ -3103,23 +3476,27 @@
3103
3476
  "publicExports": [
3104
3477
  "Select",
3105
3478
  "uiColor",
3106
- "colorVar"
3479
+ "colorVar",
3480
+ "foregroundColorVar"
3107
3481
  ],
3108
3482
  "cssValueProps": [
3109
3483
  {
3110
3484
  "path": "choices[].color",
3111
3485
  "grammar": "color",
3112
- "helpers": ["uiColor", "colorVar"],
3486
+ "helpers": [
3487
+ "uiColor",
3488
+ "foregroundColorVar"
3489
+ ],
3113
3490
  "shorthands": [],
3114
3491
  "canonicalShorthands": [],
3115
3492
  "exceptionalShorthands": [],
3116
3493
  "rawPolicy": "forbid",
3117
- "examples": ["color: uiColor(\"success\")", "color: colorVar(\"--app-choice-color\")"]
3494
+ "examples": ["color: uiColor(\"success-on-quiet\")", "color: foregroundColorVar(\"--app-choice-color\")"]
3118
3495
  }
3119
3496
  ],
3120
3497
  "useWhen": [
3121
3498
  "Choose a controlled value from a moderate or long list, including grouped and icon-bearing choices.",
3122
- "Color an optional choice icon with uiColor() or colorVar(); the CssColor contract intentionally rejects lengths and raw color strings."
3499
+ "Color an optional choice icon with a CssForegroundColor: uiColor() with a foreground token such as success-on-quiet, or foregroundColorVar() for an app-owned property. Fill tokens such as success are backgrounds that leave the icon nearly invisible, so they, lengths, raw color strings, and unqualified colorVar() values are rejected."
3123
3500
  ],
3124
3501
  "avoidWhen": [
3125
3502
  "Do not use for commands or a small choice set that should stay visible."
@@ -3570,35 +3947,92 @@
3570
3947
  {
3571
3948
  "path": "width",
3572
3949
  "grammar": "size",
3573
- "helpers": ["px", "rem", "em", "pct", "space", "lengthVar", "calc"],
3574
- "nonStandaloneHelpers": ["plus"],
3575
- "shorthands": ["auto", "min-content", "max-content", "fit-content"],
3576
- "canonicalShorthands": ["auto", "min-content", "max-content", "fit-content"],
3950
+ "helpers": [
3951
+ "px",
3952
+ "rem",
3953
+ "em",
3954
+ "pct",
3955
+ "space",
3956
+ "lengthVar",
3957
+ "calc"
3958
+ ],
3959
+ "nonStandaloneHelpers": [
3960
+ "plus"
3961
+ ],
3962
+ "shorthands": [
3963
+ "auto",
3964
+ "min-content",
3965
+ "max-content",
3966
+ "fit-content"
3967
+ ],
3968
+ "canonicalShorthands": [
3969
+ "auto",
3970
+ "min-content",
3971
+ "max-content",
3972
+ "fit-content"
3973
+ ],
3577
3974
  "exceptionalShorthands": [],
3578
3975
  "rawPolicy": "forbid",
3579
- "examples": ["width={em(12)}", "width=\"fit-content\""]
3976
+ "examples": [
3977
+ "width={em(12)}",
3978
+ "width=\"fit-content\""
3979
+ ]
3580
3980
  },
3581
3981
  {
3582
3982
  "path": "height",
3583
3983
  "grammar": "size",
3584
- "helpers": ["px", "rem", "em", "pct", "space", "lengthVar", "calc"],
3585
- "nonStandaloneHelpers": ["plus"],
3586
- "shorthands": ["auto", "min-content", "max-content", "fit-content"],
3587
- "canonicalShorthands": ["auto", "min-content", "max-content", "fit-content"],
3984
+ "helpers": [
3985
+ "px",
3986
+ "rem",
3987
+ "em",
3988
+ "pct",
3989
+ "space",
3990
+ "lengthVar",
3991
+ "calc"
3992
+ ],
3993
+ "nonStandaloneHelpers": [
3994
+ "plus"
3995
+ ],
3996
+ "shorthands": [
3997
+ "auto",
3998
+ "min-content",
3999
+ "max-content",
4000
+ "fit-content"
4001
+ ],
4002
+ "canonicalShorthands": [
4003
+ "auto",
4004
+ "min-content",
4005
+ "max-content",
4006
+ "fit-content"
4007
+ ],
3588
4008
  "exceptionalShorthands": [],
3589
4009
  "rawPolicy": "forbid",
3590
- "examples": ["height={em(1.5)}"]
4010
+ "examples": [
4011
+ "height={em(1.5)}"
4012
+ ]
3591
4013
  },
3592
4014
  {
3593
4015
  "path": "radius",
3594
4016
  "grammar": "length",
3595
- "helpers": ["px", "rem", "em", "pct", "space", "lengthVar", "calc"],
3596
- "nonStandaloneHelpers": ["plus"],
4017
+ "helpers": [
4018
+ "px",
4019
+ "rem",
4020
+ "em",
4021
+ "pct",
4022
+ "space",
4023
+ "lengthVar",
4024
+ "calc"
4025
+ ],
4026
+ "nonStandaloneHelpers": [
4027
+ "plus"
4028
+ ],
3597
4029
  "shorthands": [],
3598
4030
  "canonicalShorthands": [],
3599
4031
  "exceptionalShorthands": [],
3600
4032
  "rawPolicy": "forbid",
3601
- "examples": ["radius={px(999)}"]
4033
+ "examples": [
4034
+ "radius={px(999)}"
4035
+ ]
3602
4036
  }
3603
4037
  ],
3604
4038
  "useWhen": [
@@ -6412,13 +6846,17 @@
6412
6846
  "source": "kerf",
6413
6847
  "purpose": "Toolbar, navigation, content, and inspector shell with controlled resizing and explicit pane scroll owners.",
6414
6848
  "uses": [
6849
+ "pane",
6415
6850
  "toolbar",
6416
6851
  "toolbar-text",
6417
6852
  "toolbar-control-group",
6853
+ "row",
6854
+ "grid",
6855
+ "resize",
6418
6856
  "list-header",
6419
6857
  "list-item",
6420
- "resize",
6421
6858
  "value-table",
6859
+ "lucide-icon",
6422
6860
  "layout"
6423
6861
  ],
6424
6862
  "useWhen": [
@@ -6455,10 +6893,15 @@
6455
6893
  "source": "kerf",
6456
6894
  "purpose": "Navigation sections with icon and iconless rows, a content-item surface, disclosure, and pane footer actions.",
6457
6895
  "uses": [
6896
+ "pane",
6458
6897
  "list-header",
6459
6898
  "list-item",
6899
+ "list",
6900
+ "text",
6460
6901
  "toolbar",
6461
- "toolbar-control-group"
6902
+ "toolbar-control-group",
6903
+ "lucide-icon",
6904
+ "layout"
6462
6905
  ],
6463
6906
  "useWhen": [
6464
6907
  "A workspace sidebar needs the shared toolbar/content/footer pane model, 24px major section rhythm, and 44px row and utility-action targets."
@@ -6497,6 +6940,9 @@
6497
6940
  "toolbar",
6498
6941
  "toolbar-control-group",
6499
6942
  "toolbar-text",
6943
+ "list",
6944
+ "list-inset-text",
6945
+ "text",
6500
6946
  "state-banner",
6501
6947
  "layout"
6502
6948
  ],
@@ -6532,14 +6978,17 @@
6532
6978
  "category": "Recipes",
6533
6979
  "kind": "recipe",
6534
6980
  "source": "kerf",
6535
- "purpose": "Production modal containing a Toolbar heading, navigable record master list, and ValueTable detail.",
6981
+ "purpose": "Production modal whose labeled Web Awesome header frames a SplitView record list and ValueTable detail, becoming a full-screen drill-down on compact devices.",
6536
6982
  "uses": [
6537
- "toolbar",
6538
- "toolbar-control-group",
6539
- "toolbar-text",
6983
+ "surface-scaffold",
6984
+ "split-view",
6985
+ "nav-stack",
6986
+ "row",
6987
+ "list",
6540
6988
  "list-header",
6541
6989
  "list-item",
6542
6990
  "value-table",
6991
+ "lucide-icon",
6543
6992
  "wa-dialog",
6544
6993
  "wa-button"
6545
6994
  ],
@@ -6552,11 +7001,12 @@
6552
7001
  "appOwns": [
6553
7002
  "open state",
6554
7003
  "selected record",
7004
+ "pushed compact detail",
6555
7005
  "dismiss policy",
6556
7006
  "record actions"
6557
7007
  ],
6558
7008
  "accessibility": [
6559
- "Web Awesome owns modal focus and Escape; the application adapter restores the invoking control after hide, and Toolbar plus ToolbarText supply the visible hierarchy."
7009
+ "Web Awesome owns modal focus, Escape, and the labeled header with its close control; the application adapter restores the invoking control after hide, and the compact NavStack back control returns to the list."
6560
7010
  ],
6561
7011
  "delivery": {
6562
7012
  "sideEffects": [
@@ -6579,8 +7029,11 @@
6579
7029
  "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.",
6580
7030
  "uses": [
6581
7031
  "toolbar",
6582
- "toolbar-control-group",
6583
7032
  "toolbar-text",
7033
+ "list",
7034
+ "list-inset-text",
7035
+ "text",
7036
+ "row",
6584
7037
  "select",
6585
7038
  "state-banner",
6586
7039
  "wa-input",
@@ -6623,9 +7076,12 @@
6623
7076
  "source": "kerf",
6624
7077
  "purpose": "Deterministic loading, empty, populated, stale refresh, and error states around one stable list workspace.",
6625
7078
  "uses": [
7079
+ "pane",
6626
7080
  "toolbar",
6627
7081
  "toolbar-control-group",
6628
7082
  "toolbar-text",
7083
+ "list-item",
7084
+ "row",
6629
7085
  "state-banner",
6630
7086
  "empty-state",
6631
7087
  "loading-spinner",
@@ -6670,7 +7126,11 @@
6670
7126
  "toolbar-control-group",
6671
7127
  "segmented-control",
6672
7128
  "select",
6673
- "lucide-icon"
7129
+ "lucide-icon",
7130
+ "grid",
7131
+ "list",
7132
+ "list-inset-text",
7133
+ "text"
6674
7134
  ],
6675
7135
  "useWhen": [
6676
7136
  "A dense workspace toolbar mixes a few distinct control semantics."
@@ -6707,8 +7167,12 @@
6707
7167
  "source": "kerf",
6708
7168
  "purpose": "A push/pop navigation stack drill-down with animated slides and a live device class.",
6709
7169
  "uses": [
7170
+ "nav-stack",
7171
+ "list",
6710
7172
  "list-header",
6711
7173
  "list-item",
7174
+ "row",
7175
+ "text",
6712
7176
  "lucide-icon",
6713
7177
  "layout"
6714
7178
  ],
@@ -6746,9 +7210,13 @@
6746
7210
  "source": "kerf",
6747
7211
  "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.",
6748
7212
  "uses": [
7213
+ "pane",
6749
7214
  "toolbar",
6750
7215
  "toolbar-control-group",
6751
7216
  "toolbar-text",
7217
+ "list-inset-text",
7218
+ "text",
7219
+ "list",
6752
7220
  "value-table",
6753
7221
  "select",
6754
7222
  "segmented-control",
@@ -6791,11 +7259,20 @@
6791
7259
  "source": "kerf",
6792
7260
  "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.",
6793
7261
  "uses": [
7262
+ "collapsible-panel",
7263
+ "pane",
7264
+ "row",
7265
+ "list",
7266
+ "grid",
6794
7267
  "list-header",
6795
7268
  "list-item",
7269
+ "text",
6796
7270
  "toolbar",
6797
7271
  "toolbar-control-group",
6798
- "toolbar-text"
7272
+ "toolbar-text",
7273
+ "value-table",
7274
+ "lucide-icon",
7275
+ "layout"
6799
7276
  ],
6800
7277
  "useWhen": [
6801
7278
  "A rail or drawer must collapse and expand outside a full Workbench shell, keeping the app's collapsed signals, sizes, and content while the wire owns toggle, focus, the compact overlay, and persistence."