@kerfjs/ui 5.0.0-beta.22 → 5.0.0-beta.24
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +12 -3
- package/ai/compile-time-contracts-v1.json +2 -1
- package/ai/component-catalog-v2-overrides.json +5 -12
- package/ai/component-catalog-v2.json +266 -32
- package/ai/component-catalog.json +293 -37
- package/ai/component-catalog.schema.json +1 -0
- package/ai/public-api-signatures-v1.md +29 -16
- package/ai/skill.md +4 -4
- package/ai/webawesome-jsx-signatures-v1.md +1 -1
- package/analyzer/index.mjs +2 -8
- package/dist/app-tab.js +1 -1
- package/dist/browser/list.js +3 -0
- package/dist/catalog.d.ts +8 -4
- package/dist/catalog.js +19 -10
- package/dist/catalog.js.map +1 -1
- package/dist/{chunk-RYRIFZCT.js → chunk-7XRDUG4Y.js} +5 -5
- package/dist/{chunk-RYRIFZCT.js.map → chunk-7XRDUG4Y.js.map} +1 -1
- package/dist/{chunk-OHU6CI22.js → chunk-B3A3IVO5.js} +2 -2
- package/dist/{chunk-OHU6CI22.js.map → chunk-B3A3IVO5.js.map} +1 -1
- package/dist/{chunk-ELSJX4W7.js → chunk-FEAMR7S4.js} +2 -2
- package/dist/{chunk-ELSJX4W7.js.map → chunk-FEAMR7S4.js.map} +1 -1
- package/dist/{chunk-OZWU5ZPZ.js → chunk-IJBSZ4NX.js} +2 -2
- package/dist/{chunk-OZWU5ZPZ.js.map → chunk-IJBSZ4NX.js.map} +1 -1
- package/dist/chunk-J5BFYY7Q.js +35 -0
- package/dist/chunk-J5BFYY7Q.js.map +1 -0
- package/dist/{chunk-QQFJMRIB.js → chunk-KWWR5VMS.js} +2 -2
- package/dist/{chunk-QQFJMRIB.js.map → chunk-KWWR5VMS.js.map} +1 -1
- package/dist/{chunk-K57KRAOV.js → chunk-NWSEP5RT.js} +2 -2
- package/dist/{chunk-K57KRAOV.js.map → chunk-NWSEP5RT.js.map} +1 -1
- package/dist/{chunk-GP5DP5DL.js → chunk-OJWWHFH3.js} +39 -4
- package/dist/chunk-OJWWHFH3.js.map +1 -0
- package/dist/{chunk-DSNIYOZ3.js → chunk-PSKN344N.js} +2 -2
- package/dist/{chunk-DSNIYOZ3.js.map → chunk-PSKN344N.js.map} +1 -1
- package/dist/{chunk-W7YD6E4N.js → chunk-R7ZWUN64.js} +2 -2
- package/dist/{chunk-W7YD6E4N.js.map → chunk-R7ZWUN64.js.map} +1 -1
- package/dist/{chunk-PZQVSDLH.js → chunk-RKVQEH4J.js} +1 -1
- package/dist/chunk-RKVQEH4J.js.map +1 -0
- package/dist/{chunk-7L6EHUMV.js → chunk-SYDMYBPG.js} +3 -3
- package/dist/chunk-SYDMYBPG.js.map +1 -0
- package/dist/{chunk-W4CXQYSG.js → chunk-TB6DY7H5.js} +3 -1
- package/dist/chunk-TB6DY7H5.js.map +1 -0
- package/dist/{chunk-BBRXX6PF.js → chunk-UFZKLBCF.js} +2 -2
- package/dist/{chunk-BBRXX6PF.js.map → chunk-UFZKLBCF.js.map} +1 -1
- package/dist/{chunk-AASLYRGE.js → chunk-UKKSMZYT.js} +18 -7
- package/dist/chunk-UKKSMZYT.js.map +1 -0
- package/dist/{chunk-VLYV65LK.js → chunk-W5L2JSBY.js} +5 -3
- package/dist/chunk-W5L2JSBY.js.map +1 -0
- package/dist/{chunk-PIDTEQ3U.js → chunk-Y45PPBDV.js} +2 -2
- package/dist/{chunk-PIDTEQ3U.js.map → chunk-Y45PPBDV.js.map} +1 -1
- package/dist/divider-sides-267FA7sY.d.ts +4 -0
- package/dist/index.d.ts +3 -1
- package/dist/index.js +16 -15
- package/dist/list-action-row.js +1 -1
- package/dist/list-header.js +1 -1
- package/dist/list-item.js +1 -1
- package/dist/list.d.ts +19 -0
- package/dist/list.js +3 -0
- package/dist/list.js.map +1 -0
- package/dist/nav-stack.js +1 -1
- package/dist/panel-header.js +1 -1
- package/dist/segmented-control.js +1 -1
- package/dist/select.js +1 -1
- package/dist/skeleton.d.ts +1 -1
- package/dist/skeleton.js +1 -1
- package/dist/split-view.js +1 -1
- package/dist/state-banner.d.ts +4 -2
- package/dist/state-banner.js +1 -1
- package/dist/styles/catalog.css +8 -2
- package/dist/styles/list-item.css +6 -6
- package/dist/styles/list.css +43 -0
- package/dist/styles/state-banner.css +32 -1
- package/dist/styles/styles.css +1 -0
- package/dist/styles/sunken-panel.css +4 -0
- package/dist/styles/toolbar.css +38 -2
- package/dist/sunken-panel.d.ts +5 -2
- package/dist/sunken-panel.js +1 -1
- package/dist/toolbar-text.js +1 -1
- package/dist/toolbar.d.ts +5 -3
- package/dist/toolbar.js +1 -1
- package/dist/value-table.js +1 -1
- package/dist/wire-catalog.d.ts +4 -2
- package/dist/wire-catalog.js +95 -36
- package/dist/wire-catalog.js.map +1 -1
- package/dist/wire-tab-bars.js +1 -1
- package/dist/wire-token-search-fields.d.ts +1 -1
- package/dist/wire-token-search-fields.js +1 -1
- package/docs/accessibility.md +12 -3
- package/docs/catalog.md +17 -12
- package/docs/component-contract.md +14 -1
- package/docs/component-selection.md +18 -2
- package/docs/design/templates/empty-state/filtered-dark.svg +1 -1
- package/docs/design/templates/empty-state/filtered.svg +1 -1
- package/docs/design/templates/empty-state/with-action-dark.svg +1 -1
- package/docs/design/templates/empty-state/with-action.svg +1 -1
- package/docs/design/templates/empty-state-dark.svg +1 -7
- package/docs/design/templates/empty-state.svg +1 -7
- package/docs/design/templates/list/compact-dark.svg +1 -0
- package/docs/design/templates/list/compact.svg +1 -0
- package/docs/design/templates/list/stack-dark.svg +1 -0
- package/docs/design/templates/list/stack.svg +1 -0
- package/docs/design/templates/list-action-row/default-dark.svg +1 -1
- package/docs/design/templates/list-action-row/default.svg +1 -1
- package/docs/design/templates/list-action-row/selected-dark.svg +1 -1
- package/docs/design/templates/list-action-row/selected.svg +1 -1
- package/docs/design/templates/list-action-row-dark.svg +1 -7
- package/docs/design/templates/list-action-row.svg +1 -7
- package/docs/design/templates/list-dark.svg +1 -0
- package/docs/design/templates/list-header/action-dark.svg +1 -1
- package/docs/design/templates/list-header/action.svg +1 -1
- package/docs/design/templates/list-header/toggle-collapsed-dark.svg +1 -1
- package/docs/design/templates/list-header/toggle-collapsed.svg +1 -1
- package/docs/design/templates/list-header/toggle-expanded-dark.svg +1 -1
- package/docs/design/templates/list-header/toggle-expanded.svg +1 -1
- package/docs/design/templates/list-header-dark.svg +1 -11
- package/docs/design/templates/list-header.svg +1 -11
- package/docs/design/templates/list-item/default-dark.svg +1 -1
- package/docs/design/templates/list-item/default.svg +1 -1
- package/docs/design/templates/list-item/multiline-dark.svg +1 -1
- package/docs/design/templates/list-item/multiline.svg +1 -1
- package/docs/design/templates/list-item/selected-dark.svg +1 -1
- package/docs/design/templates/list-item/selected.svg +1 -1
- package/docs/design/templates/list-item/trailing-dark.svg +1 -1
- package/docs/design/templates/list-item/trailing.svg +1 -1
- package/docs/design/templates/list-item-dark.svg +1 -11
- package/docs/design/templates/list-item.svg +1 -11
- package/docs/design/templates/list.svg +1 -0
- package/docs/design/templates/panel-header/icon-actions-dark.svg +1 -1
- package/docs/design/templates/panel-header/icon-actions.svg +1 -1
- package/docs/design/templates/panel-header/icon-summary-actions-dark.svg +1 -1
- package/docs/design/templates/panel-header/icon-summary-actions.svg +1 -1
- package/docs/design/templates/panel-header-dark.svg +1 -13
- package/docs/design/templates/panel-header.svg +1 -13
- package/docs/design/templates/segmented-control-dark.svg +1 -7
- package/docs/design/templates/segmented-control.svg +1 -7
- package/docs/design/templates/skeleton-dark.svg +1 -9
- package/docs/design/templates/skeleton.svg +1 -9
- package/docs/design/templates/state-banner/danger-dark.svg +1 -1
- package/docs/design/templates/state-banner/danger.svg +1 -1
- package/docs/design/templates/state-banner/info-badge-dark.svg +1 -0
- package/docs/design/templates/state-banner/info-badge.svg +1 -0
- package/docs/design/templates/state-banner/info-dark.svg +1 -1
- package/docs/design/templates/state-banner/info.svg +1 -1
- package/docs/design/templates/state-banner/success-dark.svg +1 -1
- package/docs/design/templates/state-banner/success.svg +1 -1
- package/docs/design/templates/state-banner/warning-dark.svg +1 -1
- package/docs/design/templates/state-banner/warning.svg +1 -1
- package/docs/design/templates/state-banner-dark.svg +1 -11
- package/docs/design/templates/state-banner.svg +1 -11
- package/docs/design/templates/tab-bar/workspace-tabs-dark.svg +1 -1
- package/docs/design/templates/tab-bar/workspace-tabs.svg +1 -1
- package/docs/design/templates/tab-bar-dark.svg +1 -5
- package/docs/design/templates/tab-bar.svg +1 -5
- package/docs/design/templates/token-search-field/empty-dark.svg +1 -1
- package/docs/design/templates/token-search-field/empty.svg +1 -1
- package/docs/design/templates/token-search-field/tokens-dark.svg +1 -1
- package/docs/design/templates/token-search-field/tokens.svg +1 -1
- package/docs/design/templates/token-search-field-dark.svg +1 -7
- package/docs/design/templates/token-search-field.svg +1 -7
- package/docs/design/templates/toolbar/title-and-actions-dark.svg +1 -1
- package/docs/design/templates/toolbar/title-and-actions.svg +1 -1
- package/docs/design/templates/toolbar-control-group/borderless-single-dark.svg +1 -1
- package/docs/design/templates/toolbar-control-group/borderless-single.svg +1 -1
- package/docs/design/templates/toolbar-control-group/icon-buttons-dark.svg +1 -1
- package/docs/design/templates/toolbar-control-group/icon-buttons.svg +1 -1
- package/docs/design/templates/toolbar-control-group/push-buttons-dark.svg +1 -1
- package/docs/design/templates/toolbar-control-group/push-buttons.svg +1 -1
- package/docs/design/templates/toolbar-control-group/with-text-dark.svg +1 -1
- package/docs/design/templates/toolbar-control-group/with-text.svg +1 -1
- package/docs/design/templates/toolbar-control-group-dark.svg +1 -11
- package/docs/design/templates/toolbar-control-group.svg +1 -11
- package/docs/design/templates/toolbar-dark.svg +1 -5
- package/docs/design/templates/toolbar-text-dark.svg +1 -9
- package/docs/design/templates/toolbar-text.svg +1 -9
- package/docs/design/templates/toolbar.svg +1 -5
- package/docs/design/templates/value-table/details-dark.svg +1 -1
- package/docs/design/templates/value-table/details.svg +1 -1
- package/docs/design/templates/value-table-dark.svg +1 -5
- package/docs/design/templates/value-table.svg +1 -5
- package/docs/design/templates.md +25 -14
- package/docs/sunken-panel.md +11 -1
- package/docs/type-contracts.md +6 -3
- package/docs/ui-analyzer.md +5 -0
- package/docs/ui-doctor.md +8 -1
- package/docs/ux-demo.md +2 -2
- package/docs/workbench.md +13 -0
- package/doctor/eslint-diagnostics.d.mts +8 -0
- package/doctor/eslint-diagnostics.mjs +7 -0
- package/doctor/index.mjs +11 -10
- package/llms.txt +15 -3
- package/package.json +9 -2
- package/traversal-exclusions.mjs +27 -0
- package/ux-demo/recipes/collapsible-sidebar.tsx +1 -1
- package/ux-demo/recipes/navigation-sidebar.tsx +1 -1
- package/dist/chunk-7L6EHUMV.js.map +0 -1
- package/dist/chunk-AASLYRGE.js.map +0 -1
- package/dist/chunk-GP5DP5DL.js.map +0 -1
- package/dist/chunk-PZQVSDLH.js.map +0 -1
- package/dist/chunk-VLYV65LK.js.map +0 -1
- package/dist/chunk-W4CXQYSG.js.map +0 -1
|
@@ -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,20 +555,104 @@
|
|
|
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",
|
|
407
644
|
"category": "Structure",
|
|
408
645
|
"kind": "component",
|
|
409
646
|
"source": "kerf",
|
|
410
|
-
"description": "A lowered application surface with one compact inset and a vertical content stack.",
|
|
647
|
+
"description": "A rounded or square-corner lowered application surface with one compact inset and a vertical content stack.",
|
|
411
648
|
"uses": [],
|
|
412
|
-
"purpose": "Group a vertical list of application content on a visually lowered surface with one owned 8px inset.",
|
|
649
|
+
"purpose": "Group a vertical list of application content on a visually lowered surface with one owned 8px inset and an explicit rounded or square-corner shape.",
|
|
413
650
|
"publicExports": [
|
|
414
651
|
"SunkenPanel"
|
|
415
652
|
],
|
|
416
653
|
"useWhen": [
|
|
417
|
-
"A main content region or nested work area needs a darker/lowered background and one compact inset around a vertical stack."
|
|
654
|
+
"A main content region or nested work area needs a darker/lowered background and one compact inset around a vertical stack.",
|
|
655
|
+
"Use the default rounded shape for an inset surface; choose square for a flush or edge-to-edge application area."
|
|
418
656
|
],
|
|
419
657
|
"avoidWhen": [
|
|
420
658
|
"Do not use it merely to add padding, as a substitute for Pane anatomy, or around children that already own the same outer surface."
|
|
@@ -428,10 +666,13 @@
|
|
|
428
666
|
],
|
|
429
667
|
"appOwns": [
|
|
430
668
|
"region semantics and accessible name",
|
|
669
|
+
"corner shape",
|
|
431
670
|
"scroll ownership",
|
|
432
671
|
"child ordering and content"
|
|
433
672
|
],
|
|
434
673
|
"variants": [
|
|
674
|
+
"rounded surface",
|
|
675
|
+
"square-corner surface",
|
|
435
676
|
"unnamed surface",
|
|
436
677
|
"named region"
|
|
437
678
|
],
|
|
@@ -503,8 +744,9 @@
|
|
|
503
744
|
"responsive relocation"
|
|
504
745
|
],
|
|
505
746
|
"variants": [
|
|
506
|
-
"divider",
|
|
507
|
-
"no
|
|
747
|
+
"bottom divider (default)",
|
|
748
|
+
"no dividers",
|
|
749
|
+
"top/right/bottom/left divider combinations",
|
|
508
750
|
"centered content"
|
|
509
751
|
],
|
|
510
752
|
"accessibility": [
|
|
@@ -515,7 +757,7 @@
|
|
|
515
757
|
"border": "conditional",
|
|
516
758
|
"padding": "self",
|
|
517
759
|
"notes": [
|
|
518
|
-
"Padding belongs to the toolbar;
|
|
760
|
+
"Padding belongs to the toolbar; dividerSides selects any canonical combination of its physical top, right, bottom, and left edges."
|
|
519
761
|
]
|
|
520
762
|
},
|
|
521
763
|
"delivery": {
|
|
@@ -534,7 +776,8 @@
|
|
|
534
776
|
],
|
|
535
777
|
"publicTokens": [
|
|
536
778
|
"--kui-color-border",
|
|
537
|
-
"--kui-font-sans"
|
|
779
|
+
"--kui-font-sans",
|
|
780
|
+
"--kui-toolbar-divider-color"
|
|
538
781
|
],
|
|
539
782
|
"links": {
|
|
540
783
|
"catalogRoute": "?component=toolbar",
|
|
@@ -989,63 +1232,69 @@
|
|
|
989
1232
|
},
|
|
990
1233
|
{
|
|
991
1234
|
"id": "list",
|
|
992
|
-
"name": "List
|
|
1235
|
+
"name": "List",
|
|
993
1236
|
"category": "Navigation",
|
|
994
|
-
"kind": "
|
|
1237
|
+
"kind": "component",
|
|
995
1238
|
"source": "kerf",
|
|
996
|
-
"description": "
|
|
1239
|
+
"description": "A stretch-aligned vertical stack with optional gap, flex growth, vertical scrolling, and independently selectable divider edges.",
|
|
997
1240
|
"uses": [
|
|
998
1241
|
"list-header",
|
|
999
1242
|
"list-action-row",
|
|
1000
1243
|
"list-item"
|
|
1001
1244
|
],
|
|
1002
|
-
"purpose": "
|
|
1003
|
-
"publicExports": [
|
|
1245
|
+
"purpose": "Standardize vertical component layout and its scroll/divider ownership instead of repeating ad-hoc flex-column wrappers.",
|
|
1246
|
+
"publicExports": [
|
|
1247
|
+
"List"
|
|
1248
|
+
],
|
|
1004
1249
|
"useWhen": [
|
|
1005
|
-
"
|
|
1250
|
+
"Arrange component rows or sections in a vertical stretch-aligned stack.",
|
|
1251
|
+
"Let one bounded list own vertical scrolling, flex growth, or one or more physical-edge dividers."
|
|
1006
1252
|
],
|
|
1007
1253
|
"avoidWhen": [
|
|
1008
|
-
"Do not
|
|
1009
|
-
"Do not
|
|
1254
|
+
"Do not use List as semantic list markup; use ul/ol when list semantics are required and apply layout deliberately.",
|
|
1255
|
+
"Do not create nested scroll owners or use divider sides as a substitute for meaningful grouping."
|
|
1010
1256
|
],
|
|
1011
1257
|
"alternatives": [],
|
|
1012
1258
|
"appOwns": [
|
|
1013
|
-
"
|
|
1014
|
-
"
|
|
1015
|
-
"
|
|
1259
|
+
"child semantics and content",
|
|
1260
|
+
"the bounded height needed for scrolling",
|
|
1261
|
+
"gap, flex, and divider choices"
|
|
1016
1262
|
],
|
|
1017
1263
|
"variants": [
|
|
1018
|
-
"
|
|
1019
|
-
"
|
|
1020
|
-
"
|
|
1021
|
-
"
|
|
1022
|
-
"
|
|
1264
|
+
"no gap",
|
|
1265
|
+
"standard or custom gap",
|
|
1266
|
+
"boolean or custom flex",
|
|
1267
|
+
"scrollable",
|
|
1268
|
+
"top/right/bottom/left divider combinations"
|
|
1023
1269
|
],
|
|
1024
1270
|
"accessibility": [
|
|
1025
|
-
"
|
|
1026
|
-
"
|
|
1271
|
+
"List adds layout only and no list role; children retain responsibility for their native or ARIA semantics.",
|
|
1272
|
+
"Give a scrollable List a bounded block size and keep keyboard focus visible as its contents scroll."
|
|
1027
1273
|
],
|
|
1028
1274
|
"geometry": {
|
|
1029
|
-
"margin": "
|
|
1030
|
-
"border": "
|
|
1031
|
-
"padding": "
|
|
1275
|
+
"margin": "none",
|
|
1276
|
+
"border": "conditional",
|
|
1277
|
+
"padding": "none",
|
|
1278
|
+
"notes": [
|
|
1279
|
+
"List adds no margin or padding; dividerSides draws only the selected physical edges without changing box geometry."
|
|
1280
|
+
]
|
|
1032
1281
|
},
|
|
1033
1282
|
"delivery": {
|
|
1034
|
-
"
|
|
1283
|
+
"browserImport": "@kerfjs/ui/list",
|
|
1284
|
+
"manualCssImport": "@kerfjs/ui/list.css",
|
|
1035
1285
|
"sideEffects": [
|
|
1036
|
-
"css"
|
|
1286
|
+
"browser-condition-css"
|
|
1037
1287
|
]
|
|
1038
1288
|
},
|
|
1039
1289
|
"wiring": [],
|
|
1040
1290
|
"publicClasses": [
|
|
1041
|
-
"kui-
|
|
1042
|
-
"kui-content-item"
|
|
1291
|
+
"kui-list"
|
|
1043
1292
|
],
|
|
1044
1293
|
"publicTokens": [
|
|
1045
|
-
"--kui-
|
|
1046
|
-
"--kui-layout-
|
|
1047
|
-
"--kui-
|
|
1048
|
-
"--kui-
|
|
1294
|
+
"--kui-color-border",
|
|
1295
|
+
"--kui-layout-item-gap",
|
|
1296
|
+
"--kui-list-divider-color",
|
|
1297
|
+
"--kui-list-gap"
|
|
1049
1298
|
],
|
|
1050
1299
|
"links": {
|
|
1051
1300
|
"catalogRoute": "?component=list",
|
|
@@ -2148,6 +2397,7 @@
|
|
|
2148
2397
|
}
|
|
2149
2398
|
],
|
|
2150
2399
|
"appOwns": [
|
|
2400
|
+
"badge content",
|
|
2151
2401
|
"state mapping",
|
|
2152
2402
|
"message lifetime",
|
|
2153
2403
|
"retry behavior",
|
|
@@ -2161,10 +2411,12 @@
|
|
|
2161
2411
|
"danger",
|
|
2162
2412
|
"status",
|
|
2163
2413
|
"alert",
|
|
2414
|
+
"badge",
|
|
2164
2415
|
"placeholder (loading)"
|
|
2165
2416
|
],
|
|
2166
2417
|
"accessibility": [
|
|
2167
|
-
"Use alert urgency only for an attention-requiring failure."
|
|
2418
|
+
"Use alert urgency only for an attention-requiring failure.",
|
|
2419
|
+
"Keep optional badge content terse and do not rely on its tone alone for meaning."
|
|
2168
2420
|
],
|
|
2169
2421
|
"geometry": {
|
|
2170
2422
|
"margin": "self",
|
|
@@ -2182,7 +2434,9 @@
|
|
|
2182
2434
|
"publicClasses": [
|
|
2183
2435
|
"kui-state-banner",
|
|
2184
2436
|
"kui-state-banner__action",
|
|
2437
|
+
"kui-state-banner__badge",
|
|
2185
2438
|
"kui-state-banner__copy",
|
|
2439
|
+
"kui-state-banner__detail",
|
|
2186
2440
|
"kui-state-banner__icon"
|
|
2187
2441
|
],
|
|
2188
2442
|
"publicTokens": [
|
|
@@ -2209,6 +2463,8 @@
|
|
|
2209
2463
|
"--kui-state-banner-action-background",
|
|
2210
2464
|
"--kui-state-banner-action-hover-background",
|
|
2211
2465
|
"--kui-state-banner-background",
|
|
2466
|
+
"--kui-state-banner-badge-background",
|
|
2467
|
+
"--kui-state-banner-badge-foreground",
|
|
2212
2468
|
"--kui-state-banner-border",
|
|
2213
2469
|
"--kui-state-banner-danger-background",
|
|
2214
2470
|
"--kui-state-banner-danger-border",
|
|
@@ -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.
|
|
3
|
+
Generated from emitted declarations for `@kerfjs/ui@5.0.0-beta.24` and `kerfjs@5.0.0-beta.24`. 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
|
|
|
@@ -25,18 +25,20 @@ export { DisclosureArrow, type DisclosureArrowProps, type DisclosureDirection };
|
|
|
25
25
|
|
|
26
26
|
```ts
|
|
27
27
|
import { SafeHtml } from 'kerfjs';
|
|
28
|
+
import { D as DividerSides } from './divider-sides-267FA7sY.js';
|
|
28
29
|
|
|
29
30
|
interface ToolbarProps {
|
|
30
31
|
leading?: SafeHtml;
|
|
31
32
|
center?: SafeHtml;
|
|
32
33
|
trailing?: SafeHtml;
|
|
33
34
|
label?: string;
|
|
34
|
-
divider
|
|
35
|
+
/** Physical divider edges in canonical top/right/bottom/left order. Defaults to bottom. */
|
|
36
|
+
dividerSides?: DividerSides;
|
|
35
37
|
className?: string;
|
|
36
38
|
}
|
|
37
|
-
declare function Toolbar({ leading, center, trailing, label,
|
|
39
|
+
declare function Toolbar({ leading, center, trailing, label, dividerSides, className, }: ToolbarProps): SafeHtml;
|
|
38
40
|
|
|
39
|
-
export { Toolbar, type ToolbarProps };
|
|
41
|
+
export { DividerSides, Toolbar, type ToolbarProps };
|
|
40
42
|
```
|
|
41
43
|
|
|
42
44
|
## `@kerfjs/ui/toolbar-text`
|
|
@@ -1087,10 +1089,10 @@ interface CatalogProps {
|
|
|
1087
1089
|
/** Status line content shown at the start of the detail footer. */
|
|
1088
1090
|
status?: SafeHtml;
|
|
1089
1091
|
/**
|
|
1090
|
-
* Whether to highlight
|
|
1091
|
-
* margins. Pass a boolean (rather than omitting the
|
|
1092
|
-
* entry can switch between component and composition
|
|
1093
|
-
* `wireCatalogGeometryOverlay` keeps the overlay synchronized.
|
|
1092
|
+
* Whether to highlight specimens' computed borders (or transparent outer
|
|
1093
|
+
* bounds) and non-zero margins. Pass a boolean (rather than omitting the
|
|
1094
|
+
* prop) when the active entry can switch between component and composition
|
|
1095
|
+
* previews; `wireCatalogGeometryOverlay` keeps the overlay synchronized.
|
|
1094
1096
|
*/
|
|
1095
1097
|
geometryOverlay?: boolean;
|
|
1096
1098
|
selectAction?: string;
|
|
@@ -1120,11 +1122,15 @@ type CatalogExampleAlign = 'glyph' | 'inline-control' | 'none';
|
|
|
1120
1122
|
type CatalogExampleRootAttributes = Readonly<Record<`data-${string}`, string | undefined> & {
|
|
1121
1123
|
'data-catalog-example'?: never;
|
|
1122
1124
|
'data-catalog-example-stack'?: never;
|
|
1125
|
+
'data-catalog-example-label'?: never;
|
|
1126
|
+
'data-catalog-example-note'?: never;
|
|
1123
1127
|
'data-align'?: never;
|
|
1124
1128
|
}>;
|
|
1125
1129
|
type CatalogExampleStackRootAttributes = Readonly<Record<`data-${string}`, string | undefined> & {
|
|
1126
1130
|
'data-catalog-example'?: never;
|
|
1127
1131
|
'data-catalog-example-stack'?: never;
|
|
1132
|
+
'data-catalog-example-label'?: never;
|
|
1133
|
+
'data-catalog-example-note'?: never;
|
|
1128
1134
|
'data-align'?: never;
|
|
1129
1135
|
}>;
|
|
1130
1136
|
interface CatalogExampleProps {
|
|
@@ -1249,8 +1255,10 @@ interface CatalogRevealOptions {
|
|
|
1249
1255
|
declare function revealCatalogEntry(root: HTMLElement, id: string, { block, inline, behavior, media, }?: CatalogRevealOptions): () => void;
|
|
1250
1256
|
/**
|
|
1251
1257
|
* Keep a Catalog's opt-in geometry overlay synchronized with its preview.
|
|
1252
|
-
*
|
|
1253
|
-
*
|
|
1258
|
+
* Specimens receive computed border highlights (or a dashed bound when they
|
|
1259
|
+
* have no border and are transparent), while positive computed margins use
|
|
1260
|
+
* devtools-style orange bands. CSS/stylesheet-only changes are observed too.
|
|
1261
|
+
* Returns a disposer.
|
|
1254
1262
|
*/
|
|
1255
1263
|
declare function wireCatalogGeometryOverlay(root: HTMLElement): () => void;
|
|
1256
1264
|
/**
|
|
@@ -1352,15 +1360,17 @@ type StateBannerUrgency = 'status' | 'alert';
|
|
|
1352
1360
|
interface StateBannerProps {
|
|
1353
1361
|
title: string;
|
|
1354
1362
|
detail?: string;
|
|
1363
|
+
/** Optional compact status or count shown beside the title. */
|
|
1364
|
+
badge?: string;
|
|
1355
1365
|
icon?: SafeHtml;
|
|
1356
1366
|
action?: SafeHtml;
|
|
1357
1367
|
tone?: StateBannerTone;
|
|
1358
1368
|
urgency?: StateBannerUrgency;
|
|
1359
1369
|
className?: string;
|
|
1360
|
-
/** Render the title and detail as unanimated loading skeletons, keeping the icon and tone. */
|
|
1370
|
+
/** Render the title, badge, and detail as unanimated loading skeletons, keeping the icon and tone. */
|
|
1361
1371
|
placeholder?: boolean;
|
|
1362
1372
|
}
|
|
1363
|
-
declare function StateBanner({ title, detail, icon, action, tone, urgency, className, placeholder, }: StateBannerProps): SafeHtml;
|
|
1373
|
+
declare function StateBanner({ title, detail, badge, icon, action, tone, urgency, className, placeholder, }: StateBannerProps): SafeHtml;
|
|
1364
1374
|
|
|
1365
1375
|
export { StateBanner, type StateBannerProps, type StateBannerTone, type StateBannerUrgency };
|
|
1366
1376
|
```
|
|
@@ -1404,7 +1414,7 @@ export { LoadingSpinner, type LoadingSpinnerProps };
|
|
|
1404
1414
|
import * as kerfjs from 'kerfjs';
|
|
1405
1415
|
|
|
1406
1416
|
interface SkeletonProps {
|
|
1407
|
-
/** Width as any CSS length (e.g. `
|
|
1417
|
+
/** Width as any browser CSS length (e.g. `7.5rem`, `60%`). Defaults to filling its slot. */
|
|
1408
1418
|
width?: string;
|
|
1409
1419
|
/** Height as any CSS length. Defaults to a single text line. */
|
|
1410
1420
|
height?: string;
|
|
@@ -1432,10 +1442,13 @@ export { Skeleton, type SkeletonProps };
|
|
|
1432
1442
|
```ts
|
|
1433
1443
|
import { SafeHtml } from 'kerfjs';
|
|
1434
1444
|
|
|
1445
|
+
type SunkenPanelShape = 'rounded' | 'square';
|
|
1435
1446
|
interface SunkenPanelProps {
|
|
1436
1447
|
children?: SafeHtml | readonly SafeHtml[];
|
|
1437
1448
|
/** Optional accessible landmark name for a distinct application region. */
|
|
1438
1449
|
ariaLabel?: string;
|
|
1450
|
+
/** Corner shape: a rounded rectangle (default) or square corners. */
|
|
1451
|
+
shape?: SunkenPanelShape;
|
|
1439
1452
|
className?: string;
|
|
1440
1453
|
}
|
|
1441
1454
|
/**
|
|
@@ -1443,9 +1456,9 @@ interface SunkenPanelProps {
|
|
|
1443
1456
|
* stack. The panel owns its background and padding; children own their own
|
|
1444
1457
|
* borders and internal geometry.
|
|
1445
1458
|
*/
|
|
1446
|
-
declare function SunkenPanel({ children, ariaLabel, className, }: SunkenPanelProps): SafeHtml;
|
|
1459
|
+
declare function SunkenPanel({ children, ariaLabel, shape, className, }: SunkenPanelProps): SafeHtml;
|
|
1447
1460
|
|
|
1448
|
-
export { SunkenPanel, type SunkenPanelProps };
|
|
1461
|
+
export { SunkenPanel, type SunkenPanelProps, type SunkenPanelShape };
|
|
1449
1462
|
```
|
|
1450
1463
|
|
|
1451
1464
|
## `@kerfjs/ui/token-search-field`
|
|
@@ -1578,7 +1591,7 @@ interface TokenSearchCollapsibleOptions {
|
|
|
1578
1591
|
collapseOnEmptyBlur?: boolean;
|
|
1579
1592
|
/** Collapse an empty field on Escape and restore focus to its trigger. Default: true. */
|
|
1580
1593
|
collapseOnEscape?: boolean;
|
|
1581
|
-
/** Focus the editor on expand and the trigger on Escape-collapse. Default: true. */
|
|
1594
|
+
/** Focus the editor on expand/controlled clear and the trigger on Escape-collapse. Default: true. */
|
|
1582
1595
|
manageFocus?: boolean;
|
|
1583
1596
|
/**
|
|
1584
1597
|
* Keep an empty field expanded when focus moves to a caller-owned surface
|
package/ai/skill.md
CHANGED
|
@@ -69,7 +69,7 @@ Quick routing:
|
|
|
69
69
|
| Navigation row with a trailing action | `ListActionRow` | Use `ListItem` when the trailing region is dormant; never put controls inside either component's SafeHtml slots. Multiline leading icons stay aligned with the first text line. |
|
|
70
70
|
| Page, panel, or dialog heading | `Toolbar` or `PanelHeader` | Toolbar is persistent chrome; `PanelHeader` heads a panel, dialog, or page. |
|
|
71
71
|
| Exclusive choice | `TabBar`, `SegmentedControl`, or `Select` | Tabs switch tabpanels; segments expose a few choices; Select handles a longer value list. |
|
|
72
|
-
| Status or absent content | `StateBanner` or `EmptyState` | Web Awesome callouts suit ecosystem content; toasts are transient and never the only record of important state.
|
|
72
|
+
| Status or absent content | `StateBanner` or `EmptyState` | `StateBanner` accepts an optional terse, tone-tinted `badge` beside its title for a count or compact status; do not rely on color alone. Web Awesome callouts suit ecosystem content; toasts are transient and never the only record of important state. |
|
|
73
73
|
| Loading placeholder | a component's `placeholder` prop, or `Skeleton` | Set `placeholder` on a value-bearing component (`Select`, `ListHeader`, `ListItem`, `ValueTableRow`, `PanelHeader`, `SegmentedControl`, `StateBanner`, `AppTab`, `ToolbarText`, `ListActionRow`) to render its real chrome with value slots as subtle **unanimated** skeletons and interactivity disabled — do not hand-rebuild an empty state. `Skeleton` is the standalone block for a custom slot. Use `LoadingSpinner` for known busy activity, not a skeleton; never animate a skeleton; prefer it over `wa-skeleton`. |
|
|
74
74
|
| Adjustable or static columns | `ResizableRegion` or CSS grid | Use the component only for a user-operable controlled separator. |
|
|
75
75
|
| Structured or ordinary search | `TokenSearchField` or an input | Use token search only when text and ordered filter chips form one editor. |
|
|
@@ -101,12 +101,12 @@ Hard rules:
|
|
|
101
101
|
7. Decorative icons are hidden; controls are named; focus is visible; state never relies on color alone; reduced motion and increased contrast remain usable. `DisclosureArrow` defaults to an 18px root-scaled visual and exposes `--kui-disclosure-arrow-size` for consumer sizing; it never becomes the interaction or accessible-name owner. Put it in an owning native control with a stable accessible name and controlled `aria-expanded`. `ListHeader` toggle mode supplies it when `actionIcon` is omitted, but the app must reveal matching content; a custom icon replaces it. Author replacement icon content facing right before its configured direction transform is applied. Direction changes take the shortest rotation path, with counterclockwise chosen for a 180-degree closed-to-open tie. Kerf `Select` separately keeps its intrinsic Web Awesome expand glyph at `--kui-disclosure-icon-scale: .5`.
|
|
102
102
|
8. `ResizableRegion` uses `wireResizableRegions()` for Arrow, Shift+Arrow, Home/End, and pointer behavior. The app owns size persistence. `handleIcon` replaces decorative dormant glyph content only.
|
|
103
103
|
9. Use controlled `SegmentedControl` for a small exclusive choice set. Select `appearance="toolbar"` when nesting it inside `ToolbarControlGroup`; use rounded or pill shapes for standalone contexts. Handle its action, update `value`, keep meaningful choice labels, and preserve every enabled native button in sequential Tab order.
|
|
104
|
-
10. Compose `AppTab` inside controlled `TabBar`; call `wireTabBars()` once and retain its disposer. It owns same-bar drag mechanics, including proximity-based horizontal edge autoscroll, while the app applies `onReorder` and owns order, selection, panels, close policy, routing, and persistence. Arrow/Home/End select on move by default; pass `activation: 'manual'` (or `TabBar activation="manual"` per strip) so arrow keys move focus only and the user selects with Enter/Space/click — use it when selecting a tab is a heavy action. Use runtime-filtered `rootAttributes` for domain metadata and keep an optional `closeIcon` decorative and noninteractive.
|
|
105
|
-
11. Use token-controlled `TokenSearchField` when free text and removable structured filters share one editor. Editable text stays DOM-owned between token changes. The leading icon, first text line, clear action, and trailing slot share one fixed row when content wraps. The app owns parsing and suggestions; call `readTokenSearchField()` on input, empty `textContent` on clear, use `placeTokenSearchCaret()` after explicit controlled focus changes, and call `wireTokenSearchFields()` once so Enter submits without inserting a line break and keyboard chip deletion restores focus plus the text-relative caret after controlled replacement. Enable `collapsible` for an animated iconic closed state, standalone or inside `ToolbarControlGroup`; the field keeps text or tokens expanded, and `wireTokenSearchFields()` manages the transient expand/collapse/focus by default (activate to reveal + focus, Escape or empty blur to collapse). Bind the field's `expanded` to the returned handle's `expanded(id)` signal or adopt your own via `collapsible.signals`; opt a behavior out only when the app must own it. Do not hand-roll the open handler, the focusout collapse,
|
|
104
|
+
10. Compose `AppTab` inside controlled `TabBar`; call `wireTabBars()` once and retain its disposer. It owns same-bar drag mechanics, including proximity-based horizontal edge autoscroll, while the app applies `onReorder` and owns order, selection, panels, close policy, routing, and persistence. Arrow/Home/End select on move by default and restore focus by bar/tab identity when controlled activation replaces the strip; pass `activation: 'manual'` (or `TabBar activation="manual"` per strip) so arrow keys move focus only and the user selects with Enter/Space/click — use it when selecting a tab is a heavy action. Use runtime-filtered `rootAttributes` for domain metadata and keep an optional `closeIcon` decorative and noninteractive.
|
|
105
|
+
11. Use token-controlled `TokenSearchField` when free text and removable structured filters share one editor. Editable text stays DOM-owned between token changes. The leading icon, first text line, clear action, and trailing slot share one fixed row when content wraps. The app owns parsing and suggestions; call `readTokenSearchField()` on input, empty `textContent` on clear, use `placeTokenSearchCaret()` after explicit controlled focus changes, and call `wireTokenSearchFields()` once so Enter submits without inserting a line break and keyboard chip deletion restores focus plus the text-relative caret after controlled replacement. Enable `collapsible` for an animated iconic closed state, standalone or inside `ToolbarControlGroup`; the field keeps text or tokens expanded, and `wireTokenSearchFields()` manages the transient expand/collapse/focus by default (activate to reveal + focus, Escape or empty blur to collapse). Bind the field's `expanded` to the returned handle's `expanded(id)` signal or adopt your own via `collapsible.signals`; opt a behavior out only when the app must own it. Do not hand-roll the open handler, the focusout collapse, a clear-button mousedown guard, or reopening after controlled clear — the helper keeps the replacement editor open and focused. For real-app adoption it also provides a focusout keep-open exception (`data-token-search-keep-open` regions or `collapsible.keepOpenOn(target)`, so a sibling suggestions/date/help surface does not collapse an empty field), opt-in atomic-chip keyboard (`keyboard`: Backspace/Delete remove the adjacent chip via `onRemoveToken`, ArrowRight moves the caret past a trailing chip), and an `onEdit({id, editor, event})` input callback (the `InputEvent` lets you gate on `inputType`/`data`) — reach for these instead of re-adding hand-rolled keydown/input handlers around the field.
|
|
106
106
|
12. Demo work uses public production component subpaths and their browser-selected CSS. Give every public visual component its own category-grouped catalog route; list themed third-party components under a clearly labeled collapsible ecosystem section, with a focused route for each. For the complete focused/composition decision, `CatalogExample` / `CatalogExampleStack` row/group nesting, exact specimen selection, geometry-overlay legend and exclusions, skip-marker behavior, and metadata ownership, follow the single [Catalog demo authoring contract](../docs/catalog.md#catalog-demo-authoring-contract), discovered machine-readably through [`catalog-authoring.json`](./catalog-authoring.json). Never infer structure from private `kui-catalog-*` classes. Project each component's deterministic repository-relative demo source and existing documentation path so the detail can expose `View demo source` and `Read guidance` links without a runtime export; also derive first-party component implementation paths from their canonical browser imports, and label Web Awesome documentation as Kerf integration guidance. Declare direct `uses` relationships so `Used by` stays derivable, and theme shell chrome through the same semantic tokens as the stage instead of drawing a substitute. Enable `wireCatalog({ revealSelection: true })` for long desktop sidebars so controlled selections remain visible without moving focus; keep its default compact media guard unless compact scrolling is an explicit product behavior, and use `revealCatalogEntry` for an initial deep link.
|
|
107
107
|
13. The Web Awesome theme makes Tooltip and Popover arrowless by default. Keep that default unless a pointer materially clarifies the anchor; opt back in with `--wa-tooltip-arrow-size`, `--kui-wa-popover-arrow-size`, or a popover's public `--arrow-size`, and use `without-arrow` when local no-arrow intent should survive theme changes. Its non-field chrome uses `--kui-wa-control-inset` (8px controls/items), `--kui-wa-surface-margin` / `--kui-wa-surface-inset` (8px around/inside Accordion, Card, Details, Callout, and Include), and `--kui-wa-container-inset` (16px Tab Panel content); override those tiers instead of restyling individual parts. Checkbox and Radio Group option regions, the Color Picker trigger, and Slider's complete interactive region receive the shared 8px logical inline outer inset because those controls have no bordered field shell. Known Date field captions and bordered text-like field hints align with values at the 9px border-plus-padding inset. OTP Input's label uses the same uppercase xs/650 treatment as other field labels, and both its label and hint use that 9px inset.
|
|
108
108
|
14. Treat the complete Web Awesome catalog as support coverage, not a recommendation list. Its UX sidebar marks superseded and exceptional entries `Discouraged`. Consider Popup when it replaces custom anchored positioning. Prefer Kerf `Select` over direct Dropdown/Dropdown Item/Select/Option composition, `SegmentedControl` over Button Group, `TabBar` or `SegmentedControl` over Web Awesome Tabs, `LucideIcon` over Web Awesome Icon, and `ResizableRegion` over Split Panel. Use Tree/Tree Item, Animated Image, and Comparison only for a specific required behavior; avoid Zoomable Frame.
|
|
109
|
-
15. Build sidebars, main areas, inspectors, and dialogs from `@kerfjs/ui/layout.css`: an unpadded `.kui-pane`, optional `.kui-pane__toolbar`, one scrolling `.kui-pane__content`, and optional `.kui-pane__footer`. Add `.kui-content` for 24px major vertical separation and `.kui-content-item` for a child-owned 8px inline margin, 1px transparent-or-visible border, 8px padding, and 12px radius. Use the pill modifier for 22px. Do not pad pane shells
|
|
109
|
+
15. Build sidebars, main areas, inspectors, and dialogs from `@kerfjs/ui/layout.css`: an unpadded `.kui-pane`, optional `.kui-pane__toolbar`, one scrolling `.kui-pane__content`, and optional `.kui-pane__footer`. Use `List` instead of a hand-written flex-column wrapper when rows or sections need stretch alignment, standard/custom gap, flex growth, one vertical scroll owner, or physical-edge dividers; `dividerSides` uses canonical `t`/`r`/`b`/`l` order. Add `.kui-content` for 24px major vertical separation and `.kui-content-item` for a child-owned 8px inline margin, 1px transparent-or-visible border, 8px padding, and 12px radius. Use the pill modifier for 22px. Do not pad pane shells, duplicate item geometry in wrappers, or create nested scroll owners.
|
|
110
110
|
16. Keep a visible collapsible pane's collapse control in its own toolbar. When hidden, move its restore control into the adjacent main toolbar on the corresponding logical edge: leading for an inline-start sidebar and trailing for an inline-end inspector. Collapse the pane completely; do not preserve an empty icon-only rail.
|
|
111
111
|
17. The only direct children of a `Toolbar` zone (`leading`/`center`/`trailing`) are `ToolbarText` (identity/title text) and `ToolbarControlGroup`; never drop bare buttons, inputs, links, or arbitrary markup straight into a zone. `SegmentedControl`, `Select`, a collapsible `TokenSearchField`, and Web Awesome controls all live inside a `ToolbarControlGroup`. For an ordinary icon/action control inside a group, use a plain `<button>` (the group styles `> button` fully) — that is the default; reach for `wa-button` only when you need a Web Awesome feature, chiefly a `wa-dropdown` popup trigger. A popup menu in a toolbar is a `single` `ToolbarControlGroup` wrapping a `wa-dropdown` whose `slot="trigger"` `wa-button` is the toolbar button and whose `wa-dropdown-item`s are the menu, with the dropdown kept under `data-morph-skip-children`. `PanelHeader` composes these for you as a panel/dialog/page heading. Wrap every toolbar item, including dormant text, in `ToolbarControlGroup`. A group remains 44px outside (`calc(2px + remify(42px))`) when its border/background are transparent; use 8px between groups and inside items. Split dormant and interactive regions: `ListHeader` fills the available inline width and keeps its label and mutually exclusive semantic count or non-count `badge` together, with an independent logical-end 44px action unless disclosure mode makes the title cluster the button. Its action visual defaults to 18px through `--kui-list-header-action-icon-size`; never shrink the target to match it. Pass every non-negative safe-integer section quantity through `count` with a localized full spoken `countLabel`; never concatenate it into `label` or put a number in `badge`. `ListItem.trailing` is dormant; use `ListActionRow` when primary and trailing actions need sibling 44px native buttons. Its `label`, `icon`, and `trailingActionIcon` slots are also dormant and cannot contain controls. Let panes relocate at narrow widths instead of shrinking targets.
|
|
112
112
|
18. When a recurring concept has no matching export or production recipe, keep its semantics in a thin application adapter while reusing the public layout vocabulary. The composer recipe uses one visible form surface, `PanelHeader` title/summary ids, shared 8px field/action gutters, 24px major rhythm, and a conditional StateBanner as its only nested semantic surface; do not turn every section into a card or double-inset intrinsically bordered controls. The application-local `../docs/examples/command-palette-adapter.tsx` is reference source for one such missing concept, not an `@kerfjs/ui` runtime export or catalog recipe. The application owns its registration, ranking, history, permissions, availability, shortcut policy, focus policy, dispatch, and copy. If a missing concept recurs across products, open an upstream component or recipe request.
|