@kerfjs/ui 5.0.0-beta.73 → 5.0.0-beta.75

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 (116) hide show
  1. package/ai/component-catalog.json +34 -6
  2. package/ai/component-composition.json +10 -3
  3. package/ai/components/foundation.md +1 -1
  4. package/ai/components/list-header.md +2 -1
  5. package/ai/components/list.md +3 -2
  6. package/ai/components/lucide-icon.md +9 -1
  7. package/ai/components/select.md +5 -4
  8. package/ai/public-api-signatures-v1.md +16 -4
  9. package/ai/skill.md +4 -0
  10. package/ai/webawesome-jsx-signatures-v1.md +1 -1
  11. package/dist/app-tab.js +1 -1
  12. package/dist/catalog.js +66 -28
  13. package/dist/catalog.js.map +1 -1
  14. package/dist/{chunk-W2AC6Q2A.js → chunk-4FEVHE7C.js} +2 -2
  15. package/dist/{chunk-W2AC6Q2A.js.map → chunk-4FEVHE7C.js.map} +1 -1
  16. package/dist/{chunk-2IGHGE3M.js → chunk-5TTZPGUY.js} +4 -4
  17. package/dist/{chunk-2IGHGE3M.js.map → chunk-5TTZPGUY.js.map} +1 -1
  18. package/dist/{chunk-RT5WKYX3.js → chunk-5UGLKFBF.js} +3 -3
  19. package/dist/{chunk-RT5WKYX3.js.map → chunk-5UGLKFBF.js.map} +1 -1
  20. package/dist/{chunk-KFJSNWO4.js → chunk-DA3HS64I.js} +3 -3
  21. package/dist/{chunk-KFJSNWO4.js.map → chunk-DA3HS64I.js.map} +1 -1
  22. package/dist/{chunk-WTSNV5RG.js → chunk-DUBUXJA3.js} +7 -3
  23. package/dist/chunk-DUBUXJA3.js.map +1 -0
  24. package/dist/{chunk-B2ZMR7NY.js → chunk-EHIMH4J7.js} +2 -2
  25. package/dist/{chunk-B2ZMR7NY.js.map → chunk-EHIMH4J7.js.map} +1 -1
  26. package/dist/{chunk-RVERAFFY.js → chunk-FKPKGP2H.js} +2 -2
  27. package/dist/{chunk-RVERAFFY.js.map → chunk-FKPKGP2H.js.map} +1 -1
  28. package/dist/{chunk-2RMDP7HQ.js → chunk-GRHJQWV2.js} +4 -4
  29. package/dist/{chunk-2RMDP7HQ.js.map → chunk-GRHJQWV2.js.map} +1 -1
  30. package/dist/{chunk-IJNYCPAU.js → chunk-HKVJ5MW3.js} +3 -3
  31. package/dist/{chunk-IJNYCPAU.js.map → chunk-HKVJ5MW3.js.map} +1 -1
  32. package/dist/{chunk-6LAQWWEX.js → chunk-HXTAPIHQ.js} +4 -4
  33. package/dist/{chunk-6LAQWWEX.js.map → chunk-HXTAPIHQ.js.map} +1 -1
  34. package/dist/{chunk-KZRR7NNV.js → chunk-JA4J7Y4C.js} +2 -2
  35. package/dist/{chunk-KZRR7NNV.js.map → chunk-JA4J7Y4C.js.map} +1 -1
  36. package/dist/{chunk-TT5ROTQK.js → chunk-JGIV6ZDA.js} +2 -2
  37. package/dist/{chunk-TT5ROTQK.js.map → chunk-JGIV6ZDA.js.map} +1 -1
  38. package/dist/{chunk-3DOHW3K4.js → chunk-LHSUPNSE.js} +2 -2
  39. package/dist/{chunk-3DOHW3K4.js.map → chunk-LHSUPNSE.js.map} +1 -1
  40. package/dist/{chunk-DB5ADJKF.js → chunk-NPNSKX3K.js} +2 -2
  41. package/dist/{chunk-DB5ADJKF.js.map → chunk-NPNSKX3K.js.map} +1 -1
  42. package/dist/{chunk-33EOFAUN.js → chunk-O5GM2JAM.js} +4 -4
  43. package/dist/{chunk-33EOFAUN.js.map → chunk-O5GM2JAM.js.map} +1 -1
  44. package/dist/{chunk-L67OYMGE.js → chunk-OYQIONQF.js} +4 -4
  45. package/dist/{chunk-L67OYMGE.js.map → chunk-OYQIONQF.js.map} +1 -1
  46. package/dist/{chunk-HFBI4ZGP.js → chunk-PL26TKNK.js} +8 -4
  47. package/dist/chunk-PL26TKNK.js.map +1 -0
  48. package/dist/{chunk-2G2ZJQYK.js → chunk-RFGW735Q.js} +8 -2
  49. package/dist/chunk-RFGW735Q.js.map +1 -0
  50. package/dist/{chunk-I6FTU27I.js → chunk-SVLDRGPJ.js} +2 -2
  51. package/dist/{chunk-I6FTU27I.js.map → chunk-SVLDRGPJ.js.map} +1 -1
  52. package/dist/{chunk-VZOFZPSO.js → chunk-SX7FJXPJ.js} +2 -2
  53. package/dist/{chunk-VZOFZPSO.js.map → chunk-SX7FJXPJ.js.map} +1 -1
  54. package/dist/{chunk-ZSJOLL3S.js → chunk-TCXDZNCX.js} +4 -4
  55. package/dist/{chunk-ZSJOLL3S.js.map → chunk-TCXDZNCX.js.map} +1 -1
  56. package/dist/{chunk-BGD7EHUE.js → chunk-TOICTHR2.js} +2 -2
  57. package/dist/{chunk-BGD7EHUE.js.map → chunk-TOICTHR2.js.map} +1 -1
  58. package/dist/{chunk-7KHKLG5C.js → chunk-V4GAQ74C.js} +3 -3
  59. package/dist/{chunk-7KHKLG5C.js.map → chunk-V4GAQ74C.js.map} +1 -1
  60. package/dist/{chunk-G4S2QU6V.js → chunk-VA5TN5PR.js} +2 -2
  61. package/dist/{chunk-G4S2QU6V.js.map → chunk-VA5TN5PR.js.map} +1 -1
  62. package/dist/collapsible-panel.js +3 -3
  63. package/dist/css-values.d.ts +6 -1
  64. package/dist/css-values.js +1 -1
  65. package/dist/disclosure-arrow.js +1 -1
  66. package/dist/empty-state.js +1 -1
  67. package/dist/grid.js +1 -1
  68. package/dist/index.d.ts +1 -1
  69. package/dist/index.js +21 -21
  70. package/dist/list-action-row.js +1 -1
  71. package/dist/list-header.d.ts +4 -1
  72. package/dist/list-header.js +1 -1
  73. package/dist/list-item.js +1 -1
  74. package/dist/list.js +1 -1
  75. package/dist/loading-spinner.d.ts +1 -0
  76. package/dist/loading-spinner.js +1 -1
  77. package/dist/lucide-icon.d.ts +4 -1
  78. package/dist/lucide-icon.js +1 -1
  79. package/dist/nav-stack.js +1 -1
  80. package/dist/row.js +1 -1
  81. package/dist/select.js +1 -1
  82. package/dist/skeleton.js +1 -1
  83. package/dist/spacer.js +1 -1
  84. package/dist/split-view.js +1 -1
  85. package/dist/state-banner.js +1 -1
  86. package/dist/styles/catalog/components/catalog.css +38 -0
  87. package/dist/styles/foundation.css +1 -0
  88. package/dist/styles/text.css +27 -0
  89. package/dist/token-search-field.js +1 -1
  90. package/dist/toolbar-control-group.js +1 -1
  91. package/dist/toolbar-text.js +1 -1
  92. package/dist/value-table.js +1 -1
  93. package/dist/wire-catalog.js +80 -0
  94. package/dist/wire-catalog.js.map +1 -1
  95. package/dist/wire-token-search-fields.js +1 -1
  96. package/dist/workbench.js +1 -1
  97. package/docs/catalog.md +13 -3
  98. package/docs/component-selection.md +1 -1
  99. package/docs/design/templates/list-header/size-l-dark.svg +1 -0
  100. package/docs/design/templates/list-header/size-l.svg +1 -0
  101. package/docs/design/templates/list-header/size-m-dark.svg +1 -0
  102. package/docs/design/templates/list-header/size-m.svg +1 -0
  103. package/docs/design/templates/list-header/size-xl-dark.svg +1 -0
  104. package/docs/design/templates/list-header/size-xl.svg +1 -0
  105. package/docs/design/templates/list-header/size-xs-dark.svg +1 -0
  106. package/docs/design/templates/list-header/size-xs.svg +1 -0
  107. package/docs/design/templates/list-header-dark.svg +1 -1
  108. package/docs/design/templates/list-header.svg +1 -1
  109. package/docs/layout.md +7 -0
  110. package/docs/type-contracts.md +17 -17
  111. package/docs/ux-demo.md +4 -1
  112. package/llms.txt +6 -3
  113. package/package.json +1 -1
  114. package/dist/chunk-2G2ZJQYK.js.map +0 -1
  115. package/dist/chunk-HFBI4ZGP.js.map +0 -1
  116. package/dist/chunk-WTSNV5RG.js.map +0 -1
@@ -155,7 +155,8 @@
155
155
  ],
156
156
  "appOwns": [
157
157
  "icon choice",
158
- "meaningful label"
158
+ "meaningful label",
159
+ "optional foreground color"
159
160
  ],
160
161
  "variants": [
161
162
  "decorative",
@@ -168,6 +169,11 @@
168
169
  "title": "Solid selected glyph",
169
170
  "description": "The solid appearance fills a compatible Lucide glyph with currentColor while retaining its stroke and accessible name policy.",
170
171
  "code": "<LucideIcon icon={Star} name=\"star\" appearance=\"solid\" />"
172
+ },
173
+ {
174
+ "title": "Semantic icon color",
175
+ "description": "Set an icon foreground with a semantic color token; omit color to inherit from surrounding text. Use foregroundColor() for a custom CSS color or foregroundColorVar() for an app variable.",
176
+ "code": "<LucideIcon icon={Bell} name=\"alert\" color={uiColor('warning-on-quiet')} />"
171
177
  }
172
178
  ],
173
179
  "accessibility": [
@@ -342,6 +348,7 @@
342
348
  "--kui-font-s",
343
349
  "--kui-font-m",
344
350
  "--kui-font-l",
351
+ "--kui-font-xl",
345
352
  "--kui-font-2xl",
346
353
  "--kui-font-weight-semibold",
347
354
  "--kui-space-none",
@@ -2706,6 +2713,17 @@
2706
2713
  "calc",
2707
2714
  "flex"
2708
2715
  ],
2716
+ "publicExportImports": {
2717
+ "px": "@kerfjs/ui/css-values",
2718
+ "rem": "@kerfjs/ui/css-values",
2719
+ "em": "@kerfjs/ui/css-values",
2720
+ "pct": "@kerfjs/ui/css-values",
2721
+ "space": "@kerfjs/ui/css-values",
2722
+ "lengthVar": "@kerfjs/ui/css-values",
2723
+ "plus": "@kerfjs/ui/css-values",
2724
+ "calc": "@kerfjs/ui/css-values",
2725
+ "flex": "@kerfjs/ui/css-values"
2726
+ },
2709
2727
  "cssValueProps": [
2710
2728
  {
2711
2729
  "path": "gap",
@@ -2869,7 +2887,7 @@
2869
2887
  "category": "Navigation",
2870
2888
  "kind": "component",
2871
2889
  "source": "kerf",
2872
- "description": "Configurable section headings with full-width or shrink-wrapped inline presentation, semantic count/status indicators, density, group dividers, a logical-end action, disclosure states, and protected native-popover trigger metadata.",
2890
+ "description": "Configurable section headings with five independent label sizes, full-width or shrink-wrapped inline presentation, semantic count/status indicators, density, group dividers, a logical-end action, disclosure states, and protected native-popover trigger metadata.",
2873
2891
  "uses": [
2874
2892
  "badge",
2875
2893
  "lucide-icon",
@@ -2904,6 +2922,7 @@
2904
2922
  ],
2905
2923
  "variants": [
2906
2924
  "heading",
2925
+ "label sizes xs, sm (default), m, l, xl",
2907
2926
  "count",
2908
2927
  "badge",
2909
2928
  "action",
@@ -4169,15 +4188,23 @@
4169
4188
  "Select",
4170
4189
  "uiColor",
4171
4190
  "colorVar",
4172
- "foregroundColorVar"
4191
+ "foregroundColorVar",
4192
+ "foregroundColor"
4173
4193
  ],
4194
+ "publicExportImports": {
4195
+ "uiColor": "@kerfjs/ui/css-values",
4196
+ "colorVar": "@kerfjs/ui/css-values",
4197
+ "foregroundColorVar": "@kerfjs/ui/css-values",
4198
+ "foregroundColor": "@kerfjs/ui/css-values"
4199
+ },
4174
4200
  "cssValueProps": [
4175
4201
  {
4176
4202
  "path": "choices[].color",
4177
4203
  "grammar": "color",
4178
4204
  "helpers": [
4179
4205
  "uiColor",
4180
- "foregroundColorVar"
4206
+ "foregroundColorVar",
4207
+ "foregroundColor"
4181
4208
  ],
4182
4209
  "shorthands": [],
4183
4210
  "canonicalShorthands": [],
@@ -4185,13 +4212,14 @@
4185
4212
  "rawPolicy": "forbid",
4186
4213
  "examples": [
4187
4214
  "color: uiColor(\"success-on-quiet\")",
4188
- "color: foregroundColorVar(\"--app-choice-color\")"
4215
+ "color: foregroundColorVar(\"--app-choice-color\")",
4216
+ "color: foregroundColor(\"rebeccapurple\")"
4189
4217
  ]
4190
4218
  }
4191
4219
  ],
4192
4220
  "useWhen": [
4193
4221
  "Choose a controlled value from a moderate or long list, including grouped and icon-bearing choices.",
4194
- "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."
4222
+ "Color an optional choice icon with a CssForegroundColor: uiColor() with a foreground token such as success-on-quiet, foregroundColorVar() for an app-owned property, or foregroundColor() for a direct custom CSS color. 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."
4195
4223
  ],
4196
4224
  "avoidWhen": [
4197
4225
  "Do not use for commands or a small choice set that should stay visible."
@@ -126,7 +126,12 @@
126
126
  "children": { "mode": "any", "concepts": [], "requiredConcepts": [] },
127
127
  "state": [
128
128
  { "id": "icon choice", "owner": "application", "required": false },
129
- { "id": "meaningful label", "owner": "application", "required": false }
129
+ { "id": "meaningful label", "owner": "application", "required": false },
130
+ {
131
+ "id": "optional foreground color",
132
+ "owner": "application",
133
+ "required": false
134
+ }
130
135
  ],
131
136
  "wiring": {
132
137
  "required": false,
@@ -282,6 +287,7 @@
282
287
  "--kui-font-s",
283
288
  "--kui-font-m",
284
289
  "--kui-font-l",
290
+ "--kui-font-xl",
285
291
  "--kui-font-2xl",
286
292
  "--kui-font-weight-semibold",
287
293
  "--kui-space-none",
@@ -3493,14 +3499,15 @@
3493
3499
  {
3494
3500
  "path": "choices[].color",
3495
3501
  "grammar": "color",
3496
- "helpers": ["uiColor", "foregroundColorVar"],
3502
+ "helpers": ["uiColor", "foregroundColorVar", "foregroundColor"],
3497
3503
  "shorthands": [],
3498
3504
  "canonicalShorthands": [],
3499
3505
  "exceptionalShorthands": [],
3500
3506
  "rawPolicy": "forbid",
3501
3507
  "examples": [
3502
3508
  "color: uiColor(\"success-on-quiet\")",
3503
- "color: foregroundColorVar(\"--app-choice-color\")"
3509
+ "color: foregroundColorVar(\"--app-choice-color\")",
3510
+ "color: foregroundColor(\"rebeccapurple\")"
3504
3511
  ]
3505
3512
  }
3506
3513
  ],
@@ -55,7 +55,7 @@ Margin: none · border: none · padding: none (layout role: foundation). `self`
55
55
 
56
56
  The component owns its own styles. Configure it through its props and variants; do not override its internals.
57
57
 
58
- Public tokens it reads: `--kui-font-sans`, `--kui-font-mono`, `--kui-font-2xs`, `--kui-font-xs`, `--kui-font-s`, `--kui-font-m`, `--kui-font-l`, `--kui-font-2xl`, `--kui-font-weight-semibold`, `--kui-space-none`, `--kui-space-2xs`, `--kui-space-xs`, `--kui-space-s`, `--kui-space-m`, `--kui-space-l`, `--kui-space-xl`, `--kui-bp-mobile`, `--kui-bp-tablet`, `--kui-bp-desktop`, `--kui-bp-xl-desktop`, `--kui-layout-inline-margin`, `--kui-layout-item-border-width`, `--kui-layout-item-padding`, `--kui-layout-item-gap`, `--kui-layout-content-gap`, `--kui-layout-control-gap`, `--kui-layout-metadata-gap`, `--kui-layout-highlight-inset`, `--kui-layout-rounded-radius`, `--kui-layout-pill-radius`, `--kui-toolbar-group-inner-size`, `--kui-toolbar-group-size`, `--kui-toolbar-gap`, `--kui-safe-area-block-start`, `--kui-safe-area-block-end`, `--kui-safe-area-inline-start`, `--kui-safe-area-inline-end`, `--kui-radius-s`, `--kui-radius-m`, `--kui-radius-l`, `--kui-radius-circle`, `--kui-radius-pill`, `--kui-disclosure-icon-scale`, `--kui-color-surface`, `--kui-color-surface-raised`, `--kui-color-surface-lowered`, `--kui-color-text`, `--kui-color-text-quiet`, `--kui-color-text-link`, `--kui-color-neutral-fill-quiet`, `--kui-color-neutral-fill-normal`, `--kui-color-neutral-fill-loud`, `--kui-color-neutral-border-quiet`, `--kui-color-neutral-border-normal`, `--kui-color-neutral-border-loud`, `--kui-color-neutral-on-quiet`, `--kui-color-neutral-on-normal`, `--kui-color-neutral-on-loud`, `--kui-color-brand-fill-loud`, `--kui-color-brand-fill-quiet`, `--kui-color-brand-fill-normal`, `--kui-color-brand-border-quiet`, `--kui-color-brand-border-normal`, `--kui-color-brand-border-loud`, `--kui-color-brand-on-quiet`, `--kui-color-brand-on-normal`, `--kui-color-brand-on-loud`, `--kui-color-brand-on-fill`, `--kui-color-pop-fill-loud`, `--kui-color-pop-fill-quiet`, `--kui-color-pop-fill-normal`, `--kui-color-pop-border-quiet`, `--kui-color-pop-border-normal`, `--kui-color-pop-border-loud`, `--kui-color-pop-on-quiet`, `--kui-color-pop-on-normal`, `--kui-color-pop-on-loud`, `--kui-color-pop-on-fill`, `--kui-color-success-fill-loud`, `--kui-color-success-fill-quiet`, `--kui-color-success-fill-normal`, `--kui-color-success-border-quiet`, `--kui-color-success-border-normal`, `--kui-color-success-border-loud`, `--kui-color-success-on-quiet`, `--kui-color-success-on-normal`, `--kui-color-success-on-loud`, `--kui-color-success-on-fill`, `--kui-color-warning-fill-loud`, `--kui-color-warning-fill-quiet`, `--kui-color-warning-fill-normal`, `--kui-color-warning-border-quiet`, `--kui-color-warning-border-normal`, `--kui-color-warning-border-loud`, `--kui-color-warning-on-quiet`, `--kui-color-warning-on-normal`, `--kui-color-warning-on-loud`, `--kui-color-warning-on-fill`, `--kui-color-danger-fill-loud`, `--kui-color-danger-fill-quiet`, `--kui-color-danger-fill-normal`, `--kui-color-danger-border-quiet`, `--kui-color-danger-border-normal`, `--kui-color-danger-border-loud`, `--kui-color-danger-on-quiet`, `--kui-color-danger-on-normal`, `--kui-color-danger-on-loud`, `--kui-color-danger-on-fill`, `--kui-focus-ring`, `--kui-shadow-s`, `--kui-shadow-l`. Set a token only where its public contract allows; prefer a prop.
58
+ Public tokens it reads: `--kui-font-sans`, `--kui-font-mono`, `--kui-font-2xs`, `--kui-font-xs`, `--kui-font-s`, `--kui-font-m`, `--kui-font-l`, `--kui-font-xl`, `--kui-font-2xl`, `--kui-font-weight-semibold`, `--kui-space-none`, `--kui-space-2xs`, `--kui-space-xs`, `--kui-space-s`, `--kui-space-m`, `--kui-space-l`, `--kui-space-xl`, `--kui-bp-mobile`, `--kui-bp-tablet`, `--kui-bp-desktop`, `--kui-bp-xl-desktop`, `--kui-layout-inline-margin`, `--kui-layout-item-border-width`, `--kui-layout-item-padding`, `--kui-layout-item-gap`, `--kui-layout-content-gap`, `--kui-layout-control-gap`, `--kui-layout-metadata-gap`, `--kui-layout-highlight-inset`, `--kui-layout-rounded-radius`, `--kui-layout-pill-radius`, `--kui-toolbar-group-inner-size`, `--kui-toolbar-group-size`, `--kui-toolbar-gap`, `--kui-safe-area-block-start`, `--kui-safe-area-block-end`, `--kui-safe-area-inline-start`, `--kui-safe-area-inline-end`, `--kui-radius-s`, `--kui-radius-m`, `--kui-radius-l`, `--kui-radius-circle`, `--kui-radius-pill`, `--kui-disclosure-icon-scale`, `--kui-color-surface`, `--kui-color-surface-raised`, `--kui-color-surface-lowered`, `--kui-color-text`, `--kui-color-text-quiet`, `--kui-color-text-link`, `--kui-color-neutral-fill-quiet`, `--kui-color-neutral-fill-normal`, `--kui-color-neutral-fill-loud`, `--kui-color-neutral-border-quiet`, `--kui-color-neutral-border-normal`, `--kui-color-neutral-border-loud`, `--kui-color-neutral-on-quiet`, `--kui-color-neutral-on-normal`, `--kui-color-neutral-on-loud`, `--kui-color-brand-fill-loud`, `--kui-color-brand-fill-quiet`, `--kui-color-brand-fill-normal`, `--kui-color-brand-border-quiet`, `--kui-color-brand-border-normal`, `--kui-color-brand-border-loud`, `--kui-color-brand-on-quiet`, `--kui-color-brand-on-normal`, `--kui-color-brand-on-loud`, `--kui-color-brand-on-fill`, `--kui-color-pop-fill-loud`, `--kui-color-pop-fill-quiet`, `--kui-color-pop-fill-normal`, `--kui-color-pop-border-quiet`, `--kui-color-pop-border-normal`, `--kui-color-pop-border-loud`, `--kui-color-pop-on-quiet`, `--kui-color-pop-on-normal`, `--kui-color-pop-on-loud`, `--kui-color-pop-on-fill`, `--kui-color-success-fill-loud`, `--kui-color-success-fill-quiet`, `--kui-color-success-fill-normal`, `--kui-color-success-border-quiet`, `--kui-color-success-border-normal`, `--kui-color-success-border-loud`, `--kui-color-success-on-quiet`, `--kui-color-success-on-normal`, `--kui-color-success-on-loud`, `--kui-color-success-on-fill`, `--kui-color-warning-fill-loud`, `--kui-color-warning-fill-quiet`, `--kui-color-warning-fill-normal`, `--kui-color-warning-border-quiet`, `--kui-color-warning-border-normal`, `--kui-color-warning-border-loud`, `--kui-color-warning-on-quiet`, `--kui-color-warning-on-normal`, `--kui-color-warning-on-loud`, `--kui-color-warning-on-fill`, `--kui-color-danger-fill-loud`, `--kui-color-danger-fill-quiet`, `--kui-color-danger-fill-normal`, `--kui-color-danger-border-quiet`, `--kui-color-danger-border-normal`, `--kui-color-danger-border-loud`, `--kui-color-danger-on-quiet`, `--kui-color-danger-on-normal`, `--kui-color-danger-on-loud`, `--kui-color-danger-on-fill`, `--kui-focus-ring`, `--kui-shadow-s`, `--kui-shadow-l`. Set a token only where its public contract allows; prefer a prop.
59
59
 
60
60
  Everything else is internal: `kerf-ui-analyze` reports private or unknown `.kui-*` selectors (`KUI-L001`, `KUI-L010`), unknown or private tokens (`KUI-L002`, `KUI-L012`), and any application rule that restyles the component, forced dimensions included (`KUI-L019`).
61
61
 
@@ -4,7 +4,7 @@
4
4
 
5
5
  `@kerfjs/ui:list-header` · Kerf UI · component · Navigation
6
6
 
7
- Configurable section headings with full-width or shrink-wrapped inline presentation, semantic count/status indicators, density, group dividers, a logical-end action, disclosure states, and protected native-popover trigger metadata.
7
+ Configurable section headings with five independent label sizes, full-width or shrink-wrapped inline presentation, semantic count/status indicators, density, group dividers, a logical-end action, disclosure states, and protected native-popover trigger metadata.
8
8
 
9
9
  ## When to use
10
10
 
@@ -34,6 +34,7 @@ Exact prop names and types: [`@kerfjs/ui/list-header`](../public-api-signatures-
34
34
  **Variants (configure, do not restyle):**
35
35
 
36
36
  - heading
37
+ - label sizes xs, sm (default), m, l, xl
37
38
  - count
38
39
  - badge
39
40
  - action
@@ -26,14 +26,15 @@ Standardize vertical component layout, optional physical-side text/control inset
26
26
 
27
27
  ## Imports
28
28
 
29
- - JavaScript: `@kerfjs/ui/list` — exports `List`, `px`, `rem`, `em`, `pct`, `space`, `lengthVar`, `plus`, `calc`, `flex`.
29
+ - JavaScript: `@kerfjs/ui/list` — exports `List`.
30
+ - JavaScript: `@kerfjs/ui/css-values` — exports `px`, `rem`, `em`, `pct`, `space`, `lengthVar`, `plus`, `calc`, `flex`.
30
31
  - CSS: the browser build of `@kerfjs/ui/list` pulls its CSS automatically; import `@kerfjs/ui/list.css` manually only without the `browser` export condition.
31
32
  - Wiring: `wireScrollDividers` from `@kerfjs/ui/wire-scroll-dividers` (optional).
32
33
  - Declared side effects: browser-condition-css.
33
34
 
34
35
  ## Props
35
36
 
36
- Exact prop names and types: [`@kerfjs/ui/list`](../public-api-signatures-v1.md#kerfjsuilist), [`@kerfjs/ui/wire-scroll-dividers`](../public-api-signatures-v1.md#kerfjsuiwire-scroll-dividers) in `public-api-signatures-v1.md`. Do not infer props from examples.
37
+ Exact prop names and types: [`@kerfjs/ui/list`](../public-api-signatures-v1.md#kerfjsuilist), [`@kerfjs/ui/css-values`](../public-api-signatures-v1.md#kerfjsuicss-values), [`@kerfjs/ui/wire-scroll-dividers`](../public-api-signatures-v1.md#kerfjsuiwire-scroll-dividers) in `public-api-signatures-v1.md`. Do not infer props from examples.
37
38
 
38
39
  **Variants (configure, do not restyle):**
39
40
 
@@ -43,7 +43,7 @@ Exact prop names and types: [`@kerfjs/ui/lucide-icon`](../public-api-signatures-
43
43
 
44
44
  ## State and wiring
45
45
 
46
- **The app owns:** icon choice; meaningful label.
46
+ **The app owns:** icon choice; meaningful label; optional foreground color.
47
47
 
48
48
  No wiring helper.
49
49
 
@@ -65,6 +65,14 @@ The solid appearance fills a compatible Lucide glyph with currentColor while ret
65
65
  <LucideIcon icon={Star} name="star" appearance="solid" />
66
66
  ```
67
67
 
68
+ ### Semantic icon color
69
+
70
+ Set an icon foreground with a semantic color token; omit color to inherit from surrounding text. Use foregroundColor() for a custom CSS color or foregroundColorVar() for an app variable.
71
+
72
+ ```tsx
73
+ <LucideIcon icon={Bell} name="alert" color={uiColor('warning-on-quiet')} />
74
+ ```
75
+
68
76
  ## Styling boundary
69
77
 
70
78
  The component owns its own styles. Configure it through its props and variants; do not override its internals.
@@ -11,7 +11,7 @@ Controlled Web Awesome select with typed single or multiple values, disabled cho
11
11
  Choose one or more controlled values, keep unavailable choices visible, and optionally select all enabled choices or clear a multiple selection.
12
12
 
13
13
  - Choose a controlled value from a moderate or long list, including grouped and icon-bearing choices.
14
- - 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.
14
+ - Color an optional choice icon with a CssForegroundColor: uiColor() with a foreground token such as success-on-quiet, foregroundColorVar() for an app-owned property, or foregroundColor() for a direct custom CSS color. 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.
15
15
 
16
16
  **Not when:**
17
17
 
@@ -25,14 +25,15 @@ Choose one or more controlled values, keep unavailable choices visible, and opti
25
25
 
26
26
  ## Imports
27
27
 
28
- - JavaScript: `@kerfjs/ui/select` — exports `Select`, `uiColor`, `colorVar`, `foregroundColorVar`.
28
+ - JavaScript: `@kerfjs/ui/select` — exports `Select`.
29
+ - JavaScript: `@kerfjs/ui/css-values` — exports `uiColor`, `colorVar`, `foregroundColorVar`, `foregroundColor`.
29
30
  - CSS: the browser build of `@kerfjs/ui/select` pulls its CSS automatically; import `@kerfjs/ui/select.css` manually only without the `browser` export condition.
30
31
  - Registration: import `@kerfjs/ui/select/register` once (a side effect).
31
32
  - Declared side effects: custom-element-registration.
32
33
 
33
34
  ## Props
34
35
 
35
- Exact prop names and types: [`@kerfjs/ui/select`](../public-api-signatures-v1.md#kerfjsuiselect) in `public-api-signatures-v1.md`. Do not infer props from examples.
36
+ Exact prop names and types: [`@kerfjs/ui/select`](../public-api-signatures-v1.md#kerfjsuiselect), [`@kerfjs/ui/css-values`](../public-api-signatures-v1.md#kerfjsuicss-values) in `public-api-signatures-v1.md`. Do not infer props from examples.
36
37
 
37
38
  **Variants (configure, do not restyle):**
38
39
 
@@ -58,7 +59,7 @@ Exact prop names and types: [`@kerfjs/ui/select`](../public-api-signatures-v1.md
58
59
 
59
60
  **CSS-value props** (typed builders from `@kerfjs/ui/css-values`; raw CSS strings are rejected):
60
61
 
61
- - `choices[].color`: color grammar; raw values: forbid; helpers `uiColor`, `foregroundColorVar` — e.g. `color: uiColor("success-on-quiet")`
62
+ - `choices[].color`: color grammar; raw values: forbid; helpers `uiColor`, `foregroundColorVar`, `foregroundColor` — e.g. `color: uiColor("success-on-quiet")`
62
63
 
63
64
  ## Composition
64
65
 
@@ -1,6 +1,6 @@
1
1
  # Public API signatures for the UI authoring corpus
2
2
 
3
- Generated from emitted declarations for `@kerfjs/ui@5.0.0-beta.73` and `kerfjs@5.0.0-beta.73`. This bounded reference covers only APIs used by the seven-task corpus. It is interface evidence, not an implementation or runtime guarantee.
3
+ Generated from emitted declarations for `@kerfjs/ui@5.0.0-beta.75` and `kerfjs@5.0.0-beta.75`. This bounded reference covers only APIs used by the seven-task corpus. It is interface evidence, not an implementation or runtime guarantee.
4
4
 
5
5
  ## `@kerfjs/ui/css-values`
6
6
 
@@ -110,8 +110,13 @@ declare function colorVar(name: `--${string}`, fallback?: CssColor): CssColor;
110
110
  * accepts only {@link CssForegroundColor}, such as `SelectChoice.color`.
111
111
  */
112
112
  declare function foregroundColorVar(name: `--${string}`, fallback?: CssForegroundColor): CssForegroundColor;
113
+ /**
114
+ * Use an application-chosen CSS color for foreground content. The browser
115
+ * resolves the color syntax; this checks only that it is one declaration value.
116
+ */
117
+ declare function foregroundColor(value: string): CssForegroundColor;
113
118
 
114
- export { type CssColor, type CssFlex, type CssFlexBasis, type CssFlexKeyword, type CssForegroundColor, type CssLength, type CssLengthExpression, type CssSize, type CssSizeKeyword, type CssValue, type UiColor, type UiColorName, type UiForegroundColorName, type UiSpaceName, calc, colorVar, em, flex, foregroundColorVar, lengthVar, pct, plus, px, rem, remify, space, uiColor };
119
+ export { type CssColor, type CssFlex, type CssFlexBasis, type CssFlexKeyword, type CssForegroundColor, type CssLength, type CssLengthExpression, type CssSize, type CssSizeKeyword, type CssValue, type UiColor, type UiColorName, type UiForegroundColorName, type UiSpaceName, calc, colorVar, em, flex, foregroundColor, foregroundColorVar, lengthVar, pct, plus, px, rem, remify, space, uiColor };
115
120
  ```
116
121
 
117
122
  ## `@kerfjs/ui/disclosure-arrow`
@@ -527,6 +532,7 @@ type ListHeaderRootAttributes = Readonly<Record<`data-${string}`, string | undef
527
532
  'data-has-badge'?: never;
528
533
  'data-has-count'?: never;
529
534
  'data-density'?: never;
535
+ 'data-size'?: never;
530
536
  'data-divider'?: never;
531
537
  'data-inline'?: never;
532
538
  'data-width'?: never;
@@ -543,6 +549,8 @@ type ListHeaderTriggerAttributes = Readonly<Record<`data-${string}`, string | un
543
549
  }>;
544
550
  interface ListHeaderBaseProps {
545
551
  label: string;
552
+ /** Visual label size, independent of the native heading level. Default `sm`. */
553
+ size?: 'xs' | 'sm' | 'm' | 'l' | 'xl';
546
554
  density?: 'standard' | 'compact';
547
555
  divider?: 'none' | 'before' | 'after' | 'both';
548
556
  /** Shrink-wrap the header without its default outer margin, border, or padding. */
@@ -614,7 +622,7 @@ type ListHeaderIndicatorProps = {
614
622
  status?: SafeHtml;
615
623
  };
616
624
  type ListHeaderProps = ListHeaderBaseProps & ListHeaderIndicatorProps & ListHeaderModeProps;
617
- declare function ListHeader({ label, headingLevel, count, countLabel, badge, status, density, divider, inline, width, indicatorTone, action, actionLabel, actionIcon, actionDisabled, disabledReason, expanded, toggle, placeholder, rootAttributes, triggerAttributes, slot, }: ListHeaderProps): SafeHtml;
625
+ declare function ListHeader({ label, size, headingLevel, count, countLabel, badge, status, density, divider, inline, width, indicatorTone, action, actionLabel, actionIcon, actionDisabled, disabledReason, expanded, toggle, placeholder, rootAttributes, triggerAttributes, slot, }: ListHeaderProps): SafeHtml;
618
626
 
619
627
  export { ListHeader, type ListHeaderProps };
620
628
  ```
@@ -2868,6 +2876,7 @@ export { EmptyState, type EmptyStateProps };
2868
2876
  import * as kerfjs from 'kerfjs';
2869
2877
  import { LucideIconSize } from './lucide-icon.js';
2870
2878
  import 'lucide';
2879
+ import './css-values.js';
2871
2880
 
2872
2881
  type LoadingSpinnerSize = LucideIconSize;
2873
2882
  interface LoadingSpinnerProps {
@@ -3259,6 +3268,7 @@ export { Chip, type ChipProps };
3259
3268
  ```ts
3260
3269
  import * as kerfjs from 'kerfjs';
3261
3270
  import { IconNode } from 'lucide';
3271
+ import { CssForegroundColor } from './css-values.js';
3262
3272
 
3263
3273
  type LucideNode = IconNode;
3264
3274
  type LucideIconSize = 'xs' | 's' | 'm' | 'l' | 'xl' | number;
@@ -3268,6 +3278,8 @@ interface LucideIconProps {
3268
3278
  /** Outline by default; solid fills compatible glyphs with the current text color. */
3269
3279
  appearance?: 'outline' | 'solid';
3270
3280
  className?: string;
3281
+ /** Foreground color; omit to inherit the surrounding text color. */
3282
+ color?: CssForegroundColor;
3271
3283
  label?: string;
3272
3284
  /** Named icon scale or positive pixel size, converted to rem. Omit for 1em. */
3273
3285
  size?: LucideIconSize;
@@ -3275,7 +3287,7 @@ interface LucideIconProps {
3275
3287
  slot?: string;
3276
3288
  }
3277
3289
  /** Render a Lucide-compatible icon node without copying icon SVG strings. */
3278
- declare function LucideIcon({ icon, name, appearance, className, label, size, slot, }: LucideIconProps): kerfjs.SafeHtml;
3290
+ declare function LucideIcon({ icon, name, appearance, className, color, label, size, slot, }: LucideIconProps): kerfjs.SafeHtml;
3279
3291
 
3280
3292
  export { LucideIcon, type LucideIconProps, type LucideIconSize, type LucideNode };
3281
3293
  ```
package/ai/skill.md CHANGED
@@ -253,6 +253,8 @@ Use `--kui-resizable-region-background` for a region surface and `contentOverflo
253
253
 
254
254
  Use `ListItem density="spacious"` for larger option rows, `multiline` plus `multilineIconAlign="center"` when its icon should center on wrapped copy, `divider` for row separators, and `state="drag-target"` for the drop target treatment. Public `--kui-list-item-*` tokens adjust row, icon, label, and trailing geometry and color; ListHeader height, title padding, and border tokens adjust section density.
255
255
 
256
+ Set `ListHeader.size` to `xs`, `sm`, `m`, `l`, or `xl` for label scale. The default `sm` remains the small uppercase style shared with `FieldLabel`; `xs` is 2xs and capitalized, while `m`/`l`/`xl` match themed h5/h4/h3 typography. Choose `headingLevel` separately from the document outline.
257
+
256
258
  For a filled command list, scope `--kui-list-item-background`, `--kui-list-item-color`, `--kui-list-item-border`, `--kui-list-item-hover-background`, `--kui-list-item-hover-border`, `--kui-list-item-selected-background`, `--kui-list-item-selected-color`, and `--kui-list-item-selected-border` at the List or ListItem boundary. Keep global neutral and brand border colors semantic.
257
259
 
258
260
  Use `Toolbar responsive="trailing-priority"` when an expanded trailing search needs a full second row below its heading at `responsiveAt`. Configure a leading minimum width, trailing gap and justification, or zone inline padding with the public `--kui-toolbar-*` tokens rather than selectors into toolbar zones.
@@ -307,6 +309,8 @@ For prominent content text, use `Text size="large"`; use `size="xlarge"` for dis
307
309
 
308
310
  For removable tags use `Chip`, with `removeAction` for delegated handling and a specific `removeLabel` for the native button. `itemId` identifies the tag; the app owns removal. `size="compact"` and `disabled` replace app styling of raw `wa-tag` internals. Use `Badge` for non-interactive metadata.
309
311
 
312
+ For an icon with a specific meaning, set `LucideIcon.color` using `uiColor('warning-on-quiet')` or another foreground token. Use `foregroundColorVar('--app-icon-color')` for an app-owned property or `foregroundColor('#8b5cf6')` for a direct custom CSS color. Omit the prop to inherit text color. Outline stroke and solid fill both follow the chosen color; size, appearance, label, and slot remain separate props. Avoid pale fill tokens as foregrounds.
313
+
310
314
  For `Select`, mark an unavailable choice with `disabled` and optionally `disabledReason`. In a multiple Select, `selectAllLabel` and `clearLabel` opt in to localized footer actions that select enabled choices or clear the selection through normal input/change events; the app still owns the controlled `value`.
311
315
 
312
316
  For nested action menus, use `PopupMenuItem.submenu` with item, heading, and divider entries; headings and dividers do not enter keyboard navigation. Items support `checked`, `icon`, `details`, `disabledReason`, and `tone`. The app owns choice state. For a right-click menu, use `PopupMenu` with `context: true` and call `openPopupMenuAt` from the app's `contextmenu` handler; the package positions and opens the menu. Call `closePopupMenu` for programmatic dismissal.
@@ -1,6 +1,6 @@
1
1
  # Web Awesome JSX signatures for the UI authoring corpus
2
2
 
3
- Generated from the emitted `@kerfjs/ui@5.0.0-beta.73` declaration boundary. Import `@kerfjs/ui/webawesome` for type effects when authoring direct `wa-*` JSX. The module emits no runtime behavior and does not register custom elements.
3
+ Generated from the emitted `@kerfjs/ui@5.0.0-beta.75` declaration boundary. Import `@kerfjs/ui/webawesome` for type effects when authoring direct `wa-*` JSX. The module emits no runtime behavior and does not register custom elements.
4
4
 
5
5
  ```ts
6
6
  import { KerfCustomElement } from 'kerfjs/jsx-runtime';
package/dist/app-tab.js CHANGED
@@ -1,4 +1,4 @@
1
- export { AppTab } from './chunk-7KHKLG5C.js';
1
+ export { AppTab } from './chunk-V4GAQ74C.js';
2
2
 
3
3
 
4
4
 
package/dist/catalog.js CHANGED
@@ -1,14 +1,14 @@
1
- import { Workbench } from './chunk-33EOFAUN.js';
1
+ import { Workbench } from './chunk-O5GM2JAM.js';
2
2
 
3
3
 
4
4
  import { PopupMenu } from './chunk-4NG4Y2Q6.js';
5
5
 
6
- import { Row } from './chunk-VZOFZPSO.js';
7
- import { ListHeader } from './chunk-HFBI4ZGP.js';
6
+ import { Row } from './chunk-SX7FJXPJ.js';
7
+ import { ListHeader } from './chunk-PL26TKNK.js';
8
8
  import { Text } from './chunk-YDGNU2OD.js';
9
9
  import { ListInsetText } from './chunk-DG6G5EPF.js';
10
- import { ListItem } from './chunk-6LAQWWEX.js';
11
- import { ToolbarText } from './chunk-IJNYCPAU.js';
10
+ import { ListItem } from './chunk-HXTAPIHQ.js';
11
+ import { ToolbarText } from './chunk-HKVJ5MW3.js';
12
12
 
13
13
 
14
14
 
@@ -16,11 +16,11 @@ import { ToolbarText } from './chunk-IJNYCPAU.js';
16
16
 
17
17
 
18
18
 
19
- import { List } from './chunk-W2AC6Q2A.js';
19
+ import { List } from './chunk-4FEVHE7C.js';
20
20
 
21
- import { ToolbarControlGroup, ToolbarActionLink } from './chunk-BGD7EHUE.js';
21
+ import { ToolbarControlGroup, ToolbarActionLink } from './chunk-TOICTHR2.js';
22
22
  import { Toolbar } from './chunk-RGS4WX2M.js';
23
- import { LucideIcon } from './chunk-WTSNV5RG.js';
23
+ import { LucideIcon } from './chunk-DUBUXJA3.js';
24
24
 
25
25
  import { filterDataAttributes } from './chunk-SRSJO5QE.js';
26
26
 
@@ -136,7 +136,8 @@ function CatalogSectionEntries({
136
136
  status: entry.tags?.join(" \xB7 "),
137
137
  selected: active === entry.id,
138
138
  title: entry.description,
139
- multiline: true
139
+ multiline: true,
140
+ rootAttributes: { "data-catalog-entry-name": entry.name }
140
141
  }
141
142
  )) })
142
143
  ] });
@@ -148,25 +149,43 @@ function CatalogSecondarySections({
148
149
  toggleAction
149
150
  }) {
150
151
  const open = !group.collapsible || Boolean(group.expanded);
151
- return /* @__PURE__ */ jsxs(List, { dividerSides: "t", controlInsets: "t", children: [
152
- group.collapsible ? /* @__PURE__ */ jsx(
153
- ListHeader,
154
- {
155
- label: group.label,
156
- toggle: true,
157
- expanded: open,
158
- action: toggleAction
159
- }
160
- ) : /* @__PURE__ */ jsx(ListHeader, { label: group.label }),
161
- open ? /* @__PURE__ */ jsx(List, { gap: "m", rootAttributes: { "data-catalog-secondary": "" }, children: group.sections.map((section) => /* @__PURE__ */ jsx(
162
- CatalogSectionEntries,
163
- {
164
- section,
165
- active,
166
- selectAction
167
- }
168
- )) }) : null
169
- ] });
152
+ return /* @__PURE__ */ jsxs(
153
+ List,
154
+ {
155
+ dividerSides: "t",
156
+ controlInsets: "t",
157
+ rootAttributes: { "data-catalog-secondary-group": group.label },
158
+ children: [
159
+ group.collapsible ? /* @__PURE__ */ jsx(
160
+ ListHeader,
161
+ {
162
+ label: group.label,
163
+ toggle: true,
164
+ expanded: open,
165
+ action: toggleAction
166
+ }
167
+ ) : /* @__PURE__ */ jsx(ListHeader, { label: group.label }),
168
+ /* @__PURE__ */ jsx(
169
+ List,
170
+ {
171
+ gap: "m",
172
+ rootAttributes: {
173
+ "data-catalog-secondary": "",
174
+ "data-catalog-secondary-collapsed": String(!open)
175
+ },
176
+ children: group.sections.map((section) => /* @__PURE__ */ jsx(
177
+ CatalogSectionEntries,
178
+ {
179
+ section,
180
+ active,
181
+ selectAction
182
+ }
183
+ ))
184
+ }
185
+ )
186
+ ]
187
+ }
188
+ );
170
189
  }
171
190
  function CatalogSectionList({
172
191
  sections,
@@ -193,6 +212,17 @@ function CatalogSidebar({
193
212
  }) {
194
213
  return /* @__PURE__ */ jsx("nav", { "aria-label": `${brand.title} components`, children: /* @__PURE__ */ jsxs(List, { gap: "m", controlInsets: "b", children: [
195
214
  brand.subtitle ? /* @__PURE__ */ jsx(ListInsetText, { sides: "rl", children: /* @__PURE__ */ jsx(Text, { variant: "span", size: "compact", tone: "quiet", children: brand.subtitle }) }) : null,
215
+ /* @__PURE__ */ jsx(ListInsetText, { sides: "rl", children: /* @__PURE__ */ jsx(
216
+ "input",
217
+ {
218
+ class: "kui-catalog__filter",
219
+ type: "search",
220
+ "aria-label": "Filter catalog",
221
+ placeholder: "Filter items or headings",
222
+ autocomplete: "off",
223
+ "data-catalog-filter": true
224
+ }
225
+ ) }),
196
226
  /* @__PURE__ */ jsx(
197
227
  CatalogSectionList,
198
228
  {
@@ -210,6 +240,14 @@ function CatalogSidebar({
210
240
  toggleAction: toggleSecondaryAction
211
241
  }
212
242
  ) : null,
243
+ /* @__PURE__ */ jsx(
244
+ ListInsetText,
245
+ {
246
+ sides: "rl",
247
+ rootAttributes: { "data-catalog-filter-empty": "" },
248
+ children: /* @__PURE__ */ jsx(Text, { variant: "span", tone: "quiet", children: "No matching items" })
249
+ }
250
+ ),
213
251
  footer
214
252
  ] }) });
215
253
  }