@kerfjs/ui 5.0.0-beta.21 → 5.0.0-beta.23

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 (55) hide show
  1. package/README.md +11 -3
  2. package/ai/component-catalog-v2.json +223 -0
  3. package/ai/component-catalog.json +237 -0
  4. package/ai/component-catalog.schema.json +1 -0
  5. package/ai/public-api-signatures-v1.md +1 -1
  6. package/ai/webawesome-jsx-signatures-v1.md +1 -1
  7. package/analyzer/index.mjs +2 -8
  8. package/dist/{chunk-CN2XNTAM.js → chunk-GP5DP5DL.js} +50 -10
  9. package/dist/chunk-GP5DP5DL.js.map +1 -0
  10. package/dist/index.js +1 -1
  11. package/dist/wire-token-search-fields.js +1 -1
  12. package/docs/component-selection.md +12 -0
  13. package/docs/design/templates/panel-header/icon-actions-dark.svg +1 -1
  14. package/docs/design/templates/panel-header/icon-actions.svg +1 -1
  15. package/docs/design/templates/panel-header/icon-summary-actions-dark.svg +1 -1
  16. package/docs/design/templates/panel-header/icon-summary-actions.svg +1 -1
  17. package/docs/design/templates/panel-header/no-icon-dark.svg +1 -1
  18. package/docs/design/templates/panel-header/no-icon.svg +1 -1
  19. package/docs/design/templates/panel-header/page-heading-dark.svg +1 -1
  20. package/docs/design/templates/panel-header/page-heading.svg +1 -1
  21. package/docs/design/templates/panel-header/title-only-dark.svg +1 -1
  22. package/docs/design/templates/panel-header/title-only.svg +1 -1
  23. package/docs/design/templates/panel-header-dark.svg +5 -5
  24. package/docs/design/templates/panel-header.svg +5 -5
  25. package/docs/design/templates/segmented-control/equal-dark.svg +1 -1
  26. package/docs/design/templates/segmented-control/equal.svg +1 -1
  27. package/docs/design/templates/segmented-control-dark.svg +1 -1
  28. package/docs/design/templates/segmented-control.svg +1 -1
  29. package/docs/design/templates/toolbar/title-and-actions-dark.svg +1 -1
  30. package/docs/design/templates/toolbar/title-and-actions.svg +1 -1
  31. package/docs/design/templates/toolbar-control-group/with-text-dark.svg +1 -1
  32. package/docs/design/templates/toolbar-control-group/with-text.svg +1 -1
  33. package/docs/design/templates/toolbar-control-group-dark.svg +1 -1
  34. package/docs/design/templates/toolbar-control-group.svg +1 -1
  35. package/docs/design/templates/toolbar-dark.svg +1 -1
  36. package/docs/design/templates/toolbar-text/default-dark.svg +1 -1
  37. package/docs/design/templates/toolbar-text/default.svg +1 -1
  38. package/docs/design/templates/toolbar-text/large-dark.svg +1 -1
  39. package/docs/design/templates/toolbar-text/large.svg +1 -1
  40. package/docs/design/templates/toolbar-text/small-dark.svg +1 -1
  41. package/docs/design/templates/toolbar-text/small.svg +1 -1
  42. package/docs/design/templates/toolbar-text-dark.svg +3 -3
  43. package/docs/design/templates/toolbar-text.svg +3 -3
  44. package/docs/design/templates/toolbar.svg +1 -1
  45. package/docs/design/templates.md +11 -6
  46. package/docs/ui-analyzer.md +5 -0
  47. package/docs/ui-doctor.md +6 -1
  48. package/docs/ux-demo.md +1 -1
  49. package/docs/workbench.md +13 -0
  50. package/doctor/eslint-diagnostics.d.mts +8 -0
  51. package/doctor/eslint-diagnostics.mjs +7 -0
  52. package/doctor/index.mjs +8 -10
  53. package/package.json +2 -1
  54. package/traversal-exclusions.mjs +21 -0
  55. package/dist/chunk-CN2XNTAM.js.map +0 -1
package/README.md CHANGED
@@ -146,6 +146,13 @@ as a `New` marker.
146
146
  | `PanelHeader` | `@kerfjs/ui/panel-header` | `@kerfjs/ui/panel-header.css` |
147
147
  | `ValueTable`, `ValueTableRow` | `@kerfjs/ui/value-table` | `@kerfjs/ui/value-table.css` |
148
148
 
149
+ Opt-in application layouts keep JavaScript and CSS explicit. For the
150
+ desktop-class multi-panel shell, import `Workbench` from
151
+ `@kerfjs/ui/workbench` and load `@kerfjs/ui/workbench.css`; its supported
152
+ classes and size tokens are cataloged under the `workbench` entry. See
153
+ [`docs/workbench.md`](./docs/workbench.md) for panel ownership and responsive
154
+ replacement guidance.
155
+
149
156
  `PanelHeader` is a plain `Toolbar` used as a panel, dialog, or page heading: an
150
157
  optional icon control group (given a brand fill with a matching border), the
151
158
  title as extra-large `ToolbarText`, the app's trailing action controls, and an
@@ -331,9 +338,10 @@ that convenience import, also import `@kerfjs/ui/styles.css`, which deliberately
331
338
  contains the complete layer. Non-browser/SSR tools resolve the pure `import`
332
339
  condition automatically; `@kerfjs/ui/unstyled` is the explicit CSS-free root
333
340
  entry for a browser build with a custom styling pipeline. The exported
334
- `foundation.css` and component CSS paths remain available for fully manual
335
- delivery. Load application overrides after package styles, or scope `--kui-*`
336
- variables directly on a component instance.
341
+ `@kerfjs/ui/foundation.css` and component CSS paths remain available for fully
342
+ manual delivery. Its complete supported `--kui-*` token surface is cataloged
343
+ under the `foundation` entry. Load application overrides after package styles,
344
+ or scope variables directly on a component instance.
337
345
 
338
346
  ## Pane and content geometry
339
347
 
@@ -141,6 +141,157 @@
141
141
  "composition": "generated-permissive-default"
142
142
  }
143
143
  },
144
+ {
145
+ "key": "@kerfjs/ui:foundation",
146
+ "package": "@kerfjs/ui",
147
+ "id": "foundation",
148
+ "name": "Foundation tokens",
149
+ "kind": "composition",
150
+ "source": "kerf",
151
+ "parents": { "mode": "any", "entries": [] },
152
+ "contexts": ["application-ui"],
153
+ "zones": [],
154
+ "children": { "mode": "any", "concepts": [], "requiredConcepts": [] },
155
+ "state": [
156
+ {
157
+ "id": "application theme overrides",
158
+ "owner": "application",
159
+ "required": false
160
+ },
161
+ {
162
+ "id": "responsive policy at the cataloged device-class breakpoints",
163
+ "owner": "application",
164
+ "required": false
165
+ }
166
+ ],
167
+ "wiring": { "required": false, "helpers": [], "obligations": [] },
168
+ "responsive": { "owner": "not-applicable", "behaviors": [] },
169
+ "layout": {
170
+ "roles": ["foundation"],
171
+ "geometry": { "margin": "none", "border": "none", "padding": "none" }
172
+ },
173
+ "accessibility": {
174
+ "obligations": [
175
+ "Preserve semantic contrast relationships and the visible focus ring when overriding foundation colors."
176
+ ]
177
+ },
178
+ "boundaries": {
179
+ "rootClass": null,
180
+ "publicClasses": [],
181
+ "publicTokens": [
182
+ "--kui-font-sans",
183
+ "--kui-font-mono",
184
+ "--kui-font-2xs",
185
+ "--kui-font-xs",
186
+ "--kui-font-s",
187
+ "--kui-font-m",
188
+ "--kui-font-l",
189
+ "--kui-font-2xl",
190
+ "--kui-font-weight-semibold",
191
+ "--kui-space-none",
192
+ "--kui-space-2xs",
193
+ "--kui-space-xs",
194
+ "--kui-space-s",
195
+ "--kui-space-m",
196
+ "--kui-space-l",
197
+ "--kui-space-xl",
198
+ "--kui-bp-mobile",
199
+ "--kui-bp-tablet",
200
+ "--kui-bp-desktop",
201
+ "--kui-bp-xl-desktop",
202
+ "--kui-layout-inline-margin",
203
+ "--kui-layout-item-border-width",
204
+ "--kui-layout-item-padding",
205
+ "--kui-layout-item-gap",
206
+ "--kui-layout-content-gap",
207
+ "--kui-layout-control-gap",
208
+ "--kui-layout-metadata-gap",
209
+ "--kui-layout-rounded-radius",
210
+ "--kui-layout-pill-radius",
211
+ "--kui-toolbar-group-inner-size",
212
+ "--kui-toolbar-group-size",
213
+ "--kui-toolbar-gap",
214
+ "--kui-radius-s",
215
+ "--kui-radius-m",
216
+ "--kui-radius-l",
217
+ "--kui-radius-circle",
218
+ "--kui-radius-pill",
219
+ "--kui-disclosure-icon-scale",
220
+ "--kui-color-surface",
221
+ "--kui-color-surface-raised",
222
+ "--kui-color-surface-lowered",
223
+ "--kui-color-text",
224
+ "--kui-color-text-quiet",
225
+ "--kui-color-text-link",
226
+ "--kui-color-neutral-fill-quiet",
227
+ "--kui-color-neutral-fill-normal",
228
+ "--kui-color-neutral-fill-loud",
229
+ "--kui-color-neutral-border-quiet",
230
+ "--kui-color-neutral-border-normal",
231
+ "--kui-color-neutral-border-loud",
232
+ "--kui-color-neutral-on-quiet",
233
+ "--kui-color-neutral-on-normal",
234
+ "--kui-color-neutral-on-loud",
235
+ "--kui-color-brand-fill-loud",
236
+ "--kui-color-brand-fill-quiet",
237
+ "--kui-color-brand-fill-normal",
238
+ "--kui-color-brand-border-quiet",
239
+ "--kui-color-brand-border-normal",
240
+ "--kui-color-brand-border-loud",
241
+ "--kui-color-brand-on-quiet",
242
+ "--kui-color-brand-on-normal",
243
+ "--kui-color-brand-on-loud",
244
+ "--kui-color-brand-on-fill",
245
+ "--kui-color-success-fill-loud",
246
+ "--kui-color-success-fill-quiet",
247
+ "--kui-color-success-fill-normal",
248
+ "--kui-color-success-border-quiet",
249
+ "--kui-color-success-border-normal",
250
+ "--kui-color-success-border-loud",
251
+ "--kui-color-success-on-quiet",
252
+ "--kui-color-success-on-normal",
253
+ "--kui-color-success-on-loud",
254
+ "--kui-color-success-on-fill",
255
+ "--kui-color-warning-fill-loud",
256
+ "--kui-color-warning-fill-quiet",
257
+ "--kui-color-warning-fill-normal",
258
+ "--kui-color-warning-border-quiet",
259
+ "--kui-color-warning-border-normal",
260
+ "--kui-color-warning-border-loud",
261
+ "--kui-color-warning-on-quiet",
262
+ "--kui-color-warning-on-normal",
263
+ "--kui-color-warning-on-loud",
264
+ "--kui-color-warning-on-fill",
265
+ "--kui-color-danger-fill-loud",
266
+ "--kui-color-danger-fill-quiet",
267
+ "--kui-color-danger-fill-normal",
268
+ "--kui-color-danger-border-quiet",
269
+ "--kui-color-danger-border-normal",
270
+ "--kui-color-danger-border-loud",
271
+ "--kui-color-danger-on-quiet",
272
+ "--kui-color-danger-on-normal",
273
+ "--kui-color-danger-on-loud",
274
+ "--kui-color-border",
275
+ "--kui-color-border-quiet",
276
+ "--kui-color-accent",
277
+ "--kui-color-accent-text",
278
+ "--kui-color-success",
279
+ "--kui-color-success-text",
280
+ "--kui-color-warning",
281
+ "--kui-color-warning-text",
282
+ "--kui-color-danger",
283
+ "--kui-color-danger-text",
284
+ "--kui-focus-ring",
285
+ "--kui-shadow-s",
286
+ "--kui-shadow-l"
287
+ ]
288
+ },
289
+ "diagnostics": [],
290
+ "provenance": {
291
+ "selection": "ai/component-catalog.json",
292
+ "composition": "generated-permissive-default"
293
+ }
294
+ },
144
295
  {
145
296
  "key": "@kerfjs/ui:layout",
146
297
  "package": "@kerfjs/ui",
@@ -282,6 +433,78 @@
282
433
  "composition": "generated-permissive-default"
283
434
  }
284
435
  },
436
+ {
437
+ "key": "@kerfjs/ui:workbench",
438
+ "package": "@kerfjs/ui",
439
+ "id": "workbench",
440
+ "name": "Workbench",
441
+ "kind": "component",
442
+ "source": "kerf",
443
+ "parents": { "mode": "any", "entries": [] },
444
+ "contexts": ["application-ui"],
445
+ "zones": [],
446
+ "children": { "mode": "any", "concepts": [], "requiredConcepts": [] },
447
+ "state": [
448
+ {
449
+ "id": "panel presence and content",
450
+ "owner": "application",
451
+ "required": false
452
+ },
453
+ { "id": "collapsed state", "owner": "application", "required": false },
454
+ { "id": "panel sizes", "owner": "application", "required": false },
455
+ {
456
+ "id": "responsive replacement below desktop",
457
+ "owner": "application",
458
+ "required": false
459
+ },
460
+ {
461
+ "id": "collapse controls and focus policy",
462
+ "owner": "application",
463
+ "required": false
464
+ }
465
+ ],
466
+ "wiring": { "required": false, "helpers": [], "obligations": [] },
467
+ "responsive": { "owner": "not-applicable", "behaviors": [] },
468
+ "layout": {
469
+ "roles": ["structure"],
470
+ "geometry": {
471
+ "margin": "none",
472
+ "border": "self",
473
+ "padding": "child",
474
+ "notes": [
475
+ "Workbench owns the rail and drawer separators; each region's content owns its internal padding and scroll behavior."
476
+ ]
477
+ }
478
+ },
479
+ "accessibility": {
480
+ "obligations": [
481
+ "Give the Workbench and each meaningful rail or drawer an accessible label.",
482
+ "Keep collapse controls outside the disappearing region and move focus when a controlled rerender replaces a collapse control with its restore control."
483
+ ]
484
+ },
485
+ "boundaries": {
486
+ "rootClass": "kui-workbench",
487
+ "publicClasses": [
488
+ "kui-workbench",
489
+ "kui-workbench__rail",
490
+ "kui-workbench__rail--left",
491
+ "kui-workbench__rail--right",
492
+ "kui-workbench__center",
493
+ "kui-workbench__main",
494
+ "kui-workbench__drawer",
495
+ "kui-workbench__panel-content"
496
+ ],
497
+ "publicTokens": [
498
+ "--kui-workbench-rail-width",
499
+ "--kui-workbench-drawer-height"
500
+ ]
501
+ },
502
+ "diagnostics": [],
503
+ "provenance": {
504
+ "selection": "ai/component-catalog.json",
505
+ "composition": "generated-permissive-default"
506
+ }
507
+ },
285
508
  {
286
509
  "key": "@kerfjs/ui:sunken-panel",
287
510
  "package": "@kerfjs/ui",
@@ -248,6 +248,160 @@
248
248
  "recipe": "docs/webawesome-theme.md#component-selection-guidance"
249
249
  }
250
250
  },
251
+ {
252
+ "id": "foundation",
253
+ "name": "Foundation tokens",
254
+ "category": "Foundation",
255
+ "kind": "composition",
256
+ "source": "kerf",
257
+ "description": "The complete public typography, spacing, breakpoint, geometry, radius, color, focus, and shadow token surface shipped by foundation.css.",
258
+ "uses": [],
259
+ "purpose": "Provide the shared semantic token foundation for application themes and every styled Kerf UI component.",
260
+ "publicExports": [],
261
+ "useWhen": [
262
+ "Theme a Kerf application globally or reuse the shipped semantic typography, spacing, geometry, color, focus, and shadow values in application-owned composition CSS."
263
+ ],
264
+ "avoidWhen": [
265
+ "Do not replace a component-specific prop or token with a broad foundation override when only one component instance should change."
266
+ ],
267
+ "alternatives": [],
268
+ "appOwns": [
269
+ "application theme overrides",
270
+ "responsive policy at the cataloged device-class breakpoints"
271
+ ],
272
+ "variants": [
273
+ "light",
274
+ "dark"
275
+ ],
276
+ "accessibility": [
277
+ "Preserve semantic contrast relationships and the visible focus ring when overriding foundation colors."
278
+ ],
279
+ "geometry": {
280
+ "margin": "none",
281
+ "border": "none",
282
+ "padding": "none"
283
+ },
284
+ "delivery": {
285
+ "manualCssImport": "@kerfjs/ui/foundation.css",
286
+ "sideEffects": [
287
+ "css"
288
+ ]
289
+ },
290
+ "wiring": [],
291
+ "publicClasses": [],
292
+ "publicTokens": [
293
+ "--kui-font-sans",
294
+ "--kui-font-mono",
295
+ "--kui-font-2xs",
296
+ "--kui-font-xs",
297
+ "--kui-font-s",
298
+ "--kui-font-m",
299
+ "--kui-font-l",
300
+ "--kui-font-2xl",
301
+ "--kui-font-weight-semibold",
302
+ "--kui-space-none",
303
+ "--kui-space-2xs",
304
+ "--kui-space-xs",
305
+ "--kui-space-s",
306
+ "--kui-space-m",
307
+ "--kui-space-l",
308
+ "--kui-space-xl",
309
+ "--kui-bp-mobile",
310
+ "--kui-bp-tablet",
311
+ "--kui-bp-desktop",
312
+ "--kui-bp-xl-desktop",
313
+ "--kui-layout-inline-margin",
314
+ "--kui-layout-item-border-width",
315
+ "--kui-layout-item-padding",
316
+ "--kui-layout-item-gap",
317
+ "--kui-layout-content-gap",
318
+ "--kui-layout-control-gap",
319
+ "--kui-layout-metadata-gap",
320
+ "--kui-layout-rounded-radius",
321
+ "--kui-layout-pill-radius",
322
+ "--kui-toolbar-group-inner-size",
323
+ "--kui-toolbar-group-size",
324
+ "--kui-toolbar-gap",
325
+ "--kui-radius-s",
326
+ "--kui-radius-m",
327
+ "--kui-radius-l",
328
+ "--kui-radius-circle",
329
+ "--kui-radius-pill",
330
+ "--kui-disclosure-icon-scale",
331
+ "--kui-color-surface",
332
+ "--kui-color-surface-raised",
333
+ "--kui-color-surface-lowered",
334
+ "--kui-color-text",
335
+ "--kui-color-text-quiet",
336
+ "--kui-color-text-link",
337
+ "--kui-color-neutral-fill-quiet",
338
+ "--kui-color-neutral-fill-normal",
339
+ "--kui-color-neutral-fill-loud",
340
+ "--kui-color-neutral-border-quiet",
341
+ "--kui-color-neutral-border-normal",
342
+ "--kui-color-neutral-border-loud",
343
+ "--kui-color-neutral-on-quiet",
344
+ "--kui-color-neutral-on-normal",
345
+ "--kui-color-neutral-on-loud",
346
+ "--kui-color-brand-fill-loud",
347
+ "--kui-color-brand-fill-quiet",
348
+ "--kui-color-brand-fill-normal",
349
+ "--kui-color-brand-border-quiet",
350
+ "--kui-color-brand-border-normal",
351
+ "--kui-color-brand-border-loud",
352
+ "--kui-color-brand-on-quiet",
353
+ "--kui-color-brand-on-normal",
354
+ "--kui-color-brand-on-loud",
355
+ "--kui-color-brand-on-fill",
356
+ "--kui-color-success-fill-loud",
357
+ "--kui-color-success-fill-quiet",
358
+ "--kui-color-success-fill-normal",
359
+ "--kui-color-success-border-quiet",
360
+ "--kui-color-success-border-normal",
361
+ "--kui-color-success-border-loud",
362
+ "--kui-color-success-on-quiet",
363
+ "--kui-color-success-on-normal",
364
+ "--kui-color-success-on-loud",
365
+ "--kui-color-success-on-fill",
366
+ "--kui-color-warning-fill-loud",
367
+ "--kui-color-warning-fill-quiet",
368
+ "--kui-color-warning-fill-normal",
369
+ "--kui-color-warning-border-quiet",
370
+ "--kui-color-warning-border-normal",
371
+ "--kui-color-warning-border-loud",
372
+ "--kui-color-warning-on-quiet",
373
+ "--kui-color-warning-on-normal",
374
+ "--kui-color-warning-on-loud",
375
+ "--kui-color-warning-on-fill",
376
+ "--kui-color-danger-fill-loud",
377
+ "--kui-color-danger-fill-quiet",
378
+ "--kui-color-danger-fill-normal",
379
+ "--kui-color-danger-border-quiet",
380
+ "--kui-color-danger-border-normal",
381
+ "--kui-color-danger-border-loud",
382
+ "--kui-color-danger-on-quiet",
383
+ "--kui-color-danger-on-normal",
384
+ "--kui-color-danger-on-loud",
385
+ "--kui-color-border",
386
+ "--kui-color-border-quiet",
387
+ "--kui-color-accent",
388
+ "--kui-color-accent-text",
389
+ "--kui-color-success",
390
+ "--kui-color-success-text",
391
+ "--kui-color-warning",
392
+ "--kui-color-warning-text",
393
+ "--kui-color-danger",
394
+ "--kui-color-danger-text",
395
+ "--kui-focus-ring",
396
+ "--kui-shadow-s",
397
+ "--kui-shadow-l"
398
+ ],
399
+ "links": {
400
+ "catalogRoute": "?component=foundation",
401
+ "documentation": "docs/component-selection.md",
402
+ "recipe": "docs/component-selection.md#foundation-tokens"
403
+ }
404
+ },
251
405
  {
252
406
  "id": "layout",
253
407
  "name": "Application layout",
@@ -401,6 +555,89 @@
401
555
  "recipe": "docs/layout.md#anatomy"
402
556
  }
403
557
  },
558
+ {
559
+ "id": "workbench",
560
+ "name": "Workbench",
561
+ "category": "Structure",
562
+ "kind": "component",
563
+ "source": "kerf",
564
+ "description": "A desktop-class multi-panel workspace with independently collapsible left and right rails and a bottom drawer around one central work area.",
565
+ "uses": [],
566
+ "purpose": "Arrange a complex tool or editor as a stable central work area with optional peripheral rails and a bottom drawer.",
567
+ "publicExports": [
568
+ "Workbench",
569
+ "WorkbenchPanel",
570
+ "WorkbenchProps"
571
+ ],
572
+ "useWhen": [
573
+ "A desktop-class tool needs a central work area plus independently collapsible navigator, inspector, or console regions."
574
+ ],
575
+ "avoidWhen": [
576
+ "Do not shrink the full multi-panel shell onto compact devices; present peripheral content through NavStack or overlay drawers instead.",
577
+ "Do not use Workbench for one standalone collapsible rail or drawer; use CollapsiblePanel."
578
+ ],
579
+ "alternatives": [
580
+ {
581
+ "id": "pane",
582
+ "relationship": "composes-with",
583
+ "when": "Use Pane inside Workbench regions when fixed header/footer chrome must surround one scroll owner."
584
+ }
585
+ ],
586
+ "appOwns": [
587
+ "panel presence and content",
588
+ "collapsed state",
589
+ "panel sizes",
590
+ "responsive replacement below desktop",
591
+ "collapse controls and focus policy"
592
+ ],
593
+ "variants": [
594
+ "main only",
595
+ "left rail",
596
+ "right rail",
597
+ "bottom drawer",
598
+ "all panels",
599
+ "independently collapsed panels"
600
+ ],
601
+ "accessibility": [
602
+ "Give the Workbench and each meaningful rail or drawer an accessible label.",
603
+ "Keep collapse controls outside the disappearing region and move focus when a controlled rerender replaces a collapse control with its restore control."
604
+ ],
605
+ "geometry": {
606
+ "margin": "none",
607
+ "border": "self",
608
+ "padding": "child",
609
+ "notes": [
610
+ "Workbench owns the rail and drawer separators; each region's content owns its internal padding and scroll behavior."
611
+ ]
612
+ },
613
+ "delivery": {
614
+ "moduleImport": "@kerfjs/ui/workbench",
615
+ "manualCssImport": "@kerfjs/ui/workbench.css",
616
+ "sideEffects": [
617
+ "manual-css"
618
+ ]
619
+ },
620
+ "wiring": [],
621
+ "publicClasses": [
622
+ "kui-workbench",
623
+ "kui-workbench__rail",
624
+ "kui-workbench__rail--left",
625
+ "kui-workbench__rail--right",
626
+ "kui-workbench__center",
627
+ "kui-workbench__main",
628
+ "kui-workbench__drawer",
629
+ "kui-workbench__panel-content"
630
+ ],
631
+ "publicTokens": [
632
+ "--kui-workbench-rail-width",
633
+ "--kui-workbench-drawer-height"
634
+ ],
635
+ "links": {
636
+ "catalogRoute": "?component=workbench",
637
+ "documentation": "docs/workbench.md",
638
+ "recipe": "docs/workbench.md#state-lives-in-the-app"
639
+ }
640
+ },
404
641
  {
405
642
  "id": "sunken-panel",
406
643
  "name": "SunkenPanel",
@@ -76,6 +76,7 @@
76
76
  "type": "object",
77
77
  "required": ["sideEffects"],
78
78
  "properties": {
79
+ "moduleImport": { "type": "string" },
79
80
  "browserImport": { "type": "string" },
80
81
  "manualCssImport": { "type": "string" },
81
82
  "registrationImport": { "type": "string" },
@@ -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.21` and `kerfjs@5.0.0-beta.21`. 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.23` and `kerfjs@5.0.0-beta.23`. 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/disclosure-arrow`
6
6
 
@@ -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.21` 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.23` 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';
@@ -13,6 +13,7 @@ import postcss from 'postcss';
13
13
  import ts from 'typescript';
14
14
 
15
15
  import { loadApplicationUiProfile } from '../ai/application-ui-profile.mjs';
16
+ import { isUiTraversalExcluded } from '../traversal-exclusions.mjs';
16
17
 
17
18
  export const UI_ANALYSIS_SCHEMA_VERSION = 1;
18
19
 
@@ -36,16 +37,10 @@ const spacingProperties = /^(?:margin|padding|gap|inset)(?:-|$)/;
36
37
  const dimensionProperties =
37
38
  /^(?:width|height|min-width|max-width|min-height|max-height)$/;
38
39
  const approvedSpacing = new Set([0, 4, 8, 16, 24]);
39
- const ignoredDirectories = new Set([
40
- '.git',
41
- 'coverage',
42
- 'dist',
43
- 'node_modules',
44
- ]);
45
-
46
40
  async function collectFiles(root, paths) {
47
41
  const files = [];
48
42
  const visit = async (path) => {
43
+ if (isUiTraversalExcluded(root, path)) return;
49
44
  const details = await stat(path);
50
45
  if (details.isFile()) {
51
46
  if (sourceExtensions.has(extname(path)) || path.endsWith('.css'))
@@ -54,7 +49,6 @@ async function collectFiles(root, paths) {
54
49
  }
55
50
  const entries = await readdir(path, { withFileTypes: true });
56
51
  for (const entry of entries) {
57
- if (entry.isDirectory() && ignoredDirectories.has(entry.name)) continue;
58
52
  const child = resolve(path, entry.name);
59
53
  if (entry.isDirectory()) await visit(child);
60
54
  else if (