@kerfjs/ui 5.0.0-beta.56 → 5.0.0-beta.57
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 +63 -32
- package/ai/application-ui-diagnostic-ids-v1.json +9 -1
- package/ai/application-ui-profile-sync.cjs +1 -1
- package/ai/application-ui-profile.defaults.json +63 -8
- package/ai/application-ui-profile.mjs +1 -1
- package/ai/component-catalog.json +208 -32
- package/ai/component-catalog.schema.json +2 -0
- package/ai/component-class-owners.cjs +83 -0
- package/ai/component-composition-extension.d.ts +7 -0
- package/ai/component-composition-extension.schema.json +7 -0
- package/ai/{component-catalog-v2-overrides.json → component-composition-rules.json} +2 -1
- package/ai/{component-catalog-v2.d.ts → component-composition.d.ts} +9 -5
- package/ai/{component-catalog-v2.json → component-composition.json} +155 -24
- package/ai/{component-catalog-v2.schema.json → component-composition.schema.json} +21 -5
- package/ai/components/README.md +170 -0
- package/ai/components/application-tabs.md +65 -0
- package/ai/components/badge.md +72 -0
- package/ai/components/collapsible-panel.md +102 -0
- package/ai/components/content-item.md +90 -0
- package/ai/components/disclosure-arrow.md +77 -0
- package/ai/components/document-baseline.md +75 -0
- package/ai/components/empty-state.md +80 -0
- package/ai/components/feedback.md +71 -0
- package/ai/components/floating-toolbar.md +80 -0
- package/ai/components/foundation.md +65 -0
- package/ai/components/grid.md +93 -0
- package/ai/components/headers.md +63 -0
- package/ai/components/layout.md +75 -0
- package/ai/components/list-action-row.md +91 -0
- package/ai/components/list-header.md +89 -0
- package/ai/components/list-inset-control.md +74 -0
- package/ai/components/list-inset-text.md +72 -0
- package/ai/components/list-item.md +88 -0
- package/ai/components/list.md +103 -0
- package/ai/components/loading-spinner.md +72 -0
- package/ai/components/lucide-icon.md +66 -0
- package/ai/components/nav-stack.md +103 -0
- package/ai/components/pane.md +100 -0
- package/ai/components/popup-menu.md +82 -0
- package/ai/components/recipe-app-shell.md +57 -0
- package/ai/components/recipe-collapsible-sidebar.md +57 -0
- package/ai/components/recipe-compact-toolbar.md +57 -0
- package/ai/components/recipe-composer-form.md +57 -0
- package/ai/components/recipe-list-detail-dialog.md +57 -0
- package/ai/components/recipe-list-workspace-states.md +57 -0
- package/ai/components/recipe-loading-inspector.md +57 -0
- package/ai/components/recipe-navigation-sidebar.md +57 -0
- package/ai/components/recipe-navigation-stack.md +57 -0
- package/ai/components/recipe-workspace-header.md +57 -0
- package/ai/components/resize.md +101 -0
- package/ai/components/row.md +96 -0
- package/ai/components/segmented-control.md +82 -0
- package/ai/components/select.md +107 -0
- package/ai/components/skeleton.md +84 -0
- package/ai/components/spacer.md +86 -0
- package/ai/components/split-view.md +102 -0
- package/ai/components/state-banner.md +92 -0
- package/ai/components/sunken-panel.md +79 -0
- package/ai/components/surface-scaffold.md +78 -0
- package/ai/components/tab-bar.md +112 -0
- package/ai/components/tab-scaffold.md +94 -0
- package/ai/components/tabs.md +90 -0
- package/ai/components/text.md +82 -0
- package/ai/components/token-search-field.md +101 -0
- package/ai/components/toolbar-control-group.md +100 -0
- package/ai/components/toolbar-text.md +76 -0
- package/ai/components/toolbar.md +95 -0
- package/ai/components/value-table.md +72 -0
- package/ai/components/wa-accordion-item.md +55 -0
- package/ai/components/wa-accordion.md +65 -0
- package/ai/components/wa-animated-image.md +55 -0
- package/ai/components/wa-animation.md +55 -0
- package/ai/components/wa-avatar.md +55 -0
- package/ai/components/wa-badge.md +55 -0
- package/ai/components/wa-breadcrumb-item.md +53 -0
- package/ai/components/wa-breadcrumb.md +55 -0
- package/ai/components/wa-button-group.md +59 -0
- package/ai/components/wa-button.md +55 -0
- package/ai/components/wa-callout.md +58 -0
- package/ai/components/wa-card.md +59 -0
- package/ai/components/wa-carousel-item.md +53 -0
- package/ai/components/wa-carousel.md +55 -0
- package/ai/components/wa-checkbox-group.md +55 -0
- package/ai/components/wa-checkbox.md +55 -0
- package/ai/components/wa-color-picker.md +55 -0
- package/ai/components/wa-comparison.md +55 -0
- package/ai/components/wa-copy-button.md +55 -0
- package/ai/components/wa-details.md +61 -0
- package/ai/components/wa-dialog.md +59 -0
- package/ai/components/wa-divider.md +53 -0
- package/ai/components/wa-drawer.md +55 -0
- package/ai/components/wa-dropdown-item.md +60 -0
- package/ai/components/wa-dropdown.md +60 -0
- package/ai/components/wa-format-bytes.md +53 -0
- package/ai/components/wa-format-date.md +53 -0
- package/ai/components/wa-format-number.md +53 -0
- package/ai/components/wa-icon.md +58 -0
- package/ai/components/wa-include.md +53 -0
- package/ai/components/wa-input.md +59 -0
- package/ai/components/wa-intersection-observer.md +53 -0
- package/ai/components/wa-known-date.md +53 -0
- package/ai/components/wa-markdown.md +53 -0
- package/ai/components/wa-mutation-observer.md +53 -0
- package/ai/components/wa-number-input.md +55 -0
- package/ai/components/wa-option.md +59 -0
- package/ai/components/wa-otp-input.md +53 -0
- package/ai/components/wa-page.md +53 -0
- package/ai/components/wa-pagination.md +55 -0
- package/ai/components/wa-popover.md +55 -0
- package/ai/components/wa-popup.md +53 -0
- package/ai/components/wa-progress-bar.md +53 -0
- package/ai/components/wa-progress-ring.md +53 -0
- package/ai/components/wa-qr-code.md +53 -0
- package/ai/components/wa-radio-group.md +59 -0
- package/ai/components/wa-radio.md +55 -0
- package/ai/components/wa-random-content.md +53 -0
- package/ai/components/wa-rating.md +55 -0
- package/ai/components/wa-relative-time.md +53 -0
- package/ai/components/wa-resize-observer.md +53 -0
- package/ai/components/wa-scroller.md +53 -0
- package/ai/components/wa-select.md +63 -0
- package/ai/components/wa-skeleton.md +53 -0
- package/ai/components/wa-slider.md +55 -0
- package/ai/components/wa-spinner.md +58 -0
- package/ai/components/wa-split-panel.md +58 -0
- package/ai/components/wa-switch.md +53 -0
- package/ai/components/wa-tab-group.md +69 -0
- package/ai/components/wa-tab-panel.md +60 -0
- package/ai/components/wa-tab.md +59 -0
- package/ai/components/wa-tag.md +59 -0
- package/ai/components/wa-textarea.md +53 -0
- package/ai/components/wa-time-input.md +55 -0
- package/ai/components/wa-toast-item.md +60 -0
- package/ai/components/wa-toast.md +60 -0
- package/ai/components/wa-tooltip.md +55 -0
- package/ai/components/wa-tree-item.md +55 -0
- package/ai/components/wa-tree.md +55 -0
- package/ai/components/wa-zoomable-frame.md +55 -0
- package/ai/components/workbench.md +114 -0
- package/ai/public-api-signatures-v1.md +161 -32
- package/ai/skill.md +100 -48
- package/ai/webawesome-jsx-signatures-v1.md +1 -1
- package/analyzer/component-ownership.d.mts +56 -0
- package/analyzer/component-ownership.mjs +184 -0
- package/analyzer/index.d.mts +3 -0
- package/analyzer/index.mjs +274 -20
- package/analyzer/selectors.d.mts +21 -0
- package/analyzer/selectors.mjs +212 -0
- package/dist/browser/catalog.js +25 -0
- package/dist/browser/collapsible-panel.js +7 -0
- package/dist/browser/nav-stack.js +8 -0
- package/dist/browser/split-view.js +10 -0
- package/dist/browser/tab-scaffold.js +4 -0
- package/dist/browser/workbench.js +10 -0
- package/dist/catalog-resources.d.ts +2 -2
- package/dist/catalog.d.ts +3 -3
- package/dist/catalog.js +7 -6
- package/dist/catalog.js.map +1 -1
- package/dist/{chunk-PK4N5QTO.js → chunk-553ASUK6.js} +2 -3
- package/dist/chunk-553ASUK6.js.map +1 -0
- package/dist/{chunk-G33XC2NB.js → chunk-6YFHCLHG.js} +2 -2
- package/dist/chunk-6YFHCLHG.js.map +1 -0
- package/dist/{chunk-T4UZTNZ4.js → chunk-EVYKTVBQ.js} +2 -11
- package/dist/chunk-EVYKTVBQ.js.map +1 -0
- package/dist/{chunk-AK67F6QN.js → chunk-EZVNC4J6.js} +4 -1
- package/dist/chunk-EZVNC4J6.js.map +1 -0
- package/dist/{chunk-MA6Z6EIM.js → chunk-F4QMLOXJ.js} +3 -2
- package/dist/chunk-F4QMLOXJ.js.map +1 -0
- package/dist/{chunk-QQOTQTDD.js → chunk-G2RKFVRB.js} +13 -10
- package/dist/chunk-G2RKFVRB.js.map +1 -0
- package/dist/chunk-JCV4GXWB.js +249 -0
- package/dist/chunk-JCV4GXWB.js.map +1 -0
- package/dist/chunk-K47P7QZC.js +17 -0
- package/dist/chunk-K47P7QZC.js.map +1 -0
- package/dist/{chunk-MOBRFZH3.js → chunk-OUK6QRDR.js} +2 -12
- package/dist/chunk-OUK6QRDR.js.map +1 -0
- package/dist/{chunk-O3EXIBEZ.js → chunk-PWXNJS2B.js} +7 -6
- package/dist/chunk-PWXNJS2B.js.map +1 -0
- package/dist/{chunk-VNPQDCQZ.js → chunk-QOWG4ZCL.js} +3 -2
- package/dist/chunk-QOWG4ZCL.js.map +1 -0
- package/dist/{chunk-V65EOWNF.js → chunk-XCO6YCYM.js} +5 -4
- package/dist/chunk-XCO6YCYM.js.map +1 -0
- package/dist/{chunk-K6UNVKDK.js → chunk-XDKAYSVD.js} +3 -1
- package/dist/chunk-XDKAYSVD.js.map +1 -0
- package/dist/collapsible-panel.d.ts +3 -3
- package/dist/collapsible-panel.js +2 -2
- package/dist/collapsible-panel.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +10 -8
- package/dist/list-action-row.js +2 -1
- package/dist/list-header.js +1 -1
- package/dist/list-item.js +2 -1
- package/dist/nav-stack.d.ts +13 -1
- package/dist/nav-stack.js +1 -1
- package/dist/pane.d.ts +20 -3
- package/dist/pane.js +1 -1
- package/dist/{panel-toolbar-C8sF-YZC.d.ts → panel-toolbar-BN4x0rth.d.ts} +3 -2
- package/dist/select.js +1 -1
- package/dist/split-view.d.ts +3 -3
- package/dist/split-view.js +3 -2
- package/dist/split-view.js.map +1 -1
- package/dist/state-banner.js +1 -1
- package/dist/styles/app-tab.css +31 -0
- package/dist/styles/badge.css +19 -11
- package/dist/styles/collapsible-panel.css +13 -9
- package/dist/styles/floating-toolbar.css +25 -6
- package/dist/styles/list-header.css +0 -12
- package/dist/styles/list.css +4 -4
- package/dist/styles/nav-stack.css +46 -19
- package/dist/styles/pane.css +50 -0
- package/dist/styles/popup-menu.css +151 -0
- package/dist/styles/resizable-region.css +22 -10
- package/dist/styles/select.css +28 -14
- package/dist/styles/skeleton.css +30 -3
- package/dist/styles/split-view.css +10 -7
- package/dist/styles/state-banner.css +0 -19
- package/dist/styles/surface-scaffold.css +8 -3
- package/dist/styles/tab-bar.css +79 -28
- package/dist/styles/tab-scaffold.css +25 -1
- package/dist/styles/text.css +16 -0
- package/dist/styles/toolbar-control-group.css +121 -66
- package/dist/styles/toolbar-text.css +21 -0
- package/dist/styles/toolbar.css +8 -32
- package/dist/styles/workbench.css +18 -18
- package/dist/tab-scaffold.d.ts +11 -1
- package/dist/tab-scaffold.js +2 -0
- package/dist/tab-scaffold.js.map +1 -1
- package/dist/toolbar-text.d.ts +7 -1
- package/dist/toolbar-text.js +1 -1
- package/dist/toolbar.d.ts +8 -1
- package/dist/toolbar.js +1 -1
- package/dist/{types-DXAGogOS.d.ts → types-BuHELdXR.d.ts} +1 -1
- package/dist/wire-catalog.d.ts +3 -1
- package/dist/wire-catalog.js +2 -0
- package/dist/wire-catalog.js.map +1 -1
- package/dist/wire-scroll-dividers.d.ts +69 -0
- package/dist/wire-scroll-dividers.js +3 -0
- package/dist/wire-scroll-dividers.js.map +1 -0
- package/dist/workbench.d.ts +13 -12
- package/dist/workbench.js +1 -1
- package/docs/app-layouts.md +9 -1
- package/docs/catalog.md +10 -5
- package/docs/collapsible-panel.md +10 -6
- package/docs/component-contract.md +147 -21
- package/docs/component-selection.md +18 -6
- 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 -1
- package/docs/design/templates/tab-bar.svg +1 -1
- package/docs/design-philosophy.md +30 -3
- package/docs/examples/application-ui-profile.json +4 -4
- package/docs/examples/{component-catalog-extension-v2.json → component-composition-extension.json} +3 -3
- package/docs/layout.md +82 -3
- package/docs/nav-stack.md +33 -3
- package/docs/split-view.md +10 -5
- package/docs/tab-scaffold.md +23 -1
- package/docs/type-contracts.md +4 -3
- package/docs/ui-analyzer.md +99 -5
- package/docs/ui-doctor.md +10 -0
- package/docs/workbench.md +19 -9
- package/doctor/index.mjs +6 -1
- package/llms.txt +85 -20
- package/package.json +17 -5
- package/ux-demo/recipes/collapsible-sidebar.tsx +0 -1
- package/ux-demo/recipes/composer-form.tsx +0 -1
- package/ux-demo/recipes/list-detail-dialog.tsx +0 -2
- package/ux-demo/recipes/list-workspace-states.tsx +0 -1
- package/ux-demo/recipes/loading-inspector.tsx +0 -1
- package/ux-demo/recipes/workspace-header.tsx +0 -1
- package/ai/component-catalog-extension-v2.d.ts +0 -7
- package/ai/component-catalog-extension-v2.schema.json +0 -7
- package/dist/chunk-AK67F6QN.js.map +0 -1
- package/dist/chunk-G33XC2NB.js.map +0 -1
- package/dist/chunk-K6UNVKDK.js.map +0 -1
- package/dist/chunk-MA6Z6EIM.js.map +0 -1
- package/dist/chunk-MOBRFZH3.js.map +0 -1
- package/dist/chunk-O3EXIBEZ.js.map +0 -1
- package/dist/chunk-PK4N5QTO.js.map +0 -1
- package/dist/chunk-QQOTQTDD.js.map +0 -1
- package/dist/chunk-T4UZTNZ4.js.map +0 -1
- package/dist/chunk-V65EOWNF.js.map +0 -1
- package/dist/chunk-VNPQDCQZ.js.map +0 -1
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# Desktop application shell
|
|
2
|
+
|
|
3
|
+
<!-- Generated by scripts/sync-component-docs.mjs from ai/component-catalog.json and ai/component-composition.json. Do not edit; run `npm run catalog:sync`. -->
|
|
4
|
+
|
|
5
|
+
`@kerfjs/ui:recipe-app-shell` · Kerf UI · production recipe · Recipes
|
|
6
|
+
|
|
7
|
+
## When to use
|
|
8
|
+
|
|
9
|
+
App bar above a Workbench with resizable navigation and inspector rails, relocated rail toggles, narrow-container overlays, and explicit pane scroll owners.
|
|
10
|
+
|
|
11
|
+
- A desktop workspace needs persistent chrome and user-adjustable navigation or inspector panes.
|
|
12
|
+
|
|
13
|
+
**Not when:**
|
|
14
|
+
|
|
15
|
+
- Use ordinary CSS grid when panes are static or the product does not need a user-operable separator.
|
|
16
|
+
|
|
17
|
+
## Imports
|
|
18
|
+
|
|
19
|
+
- Nothing to import: this is a reference composition.
|
|
20
|
+
- Declared side effects: lazy-recipe-css.
|
|
21
|
+
|
|
22
|
+
## Props
|
|
23
|
+
|
|
24
|
+
No props: this entry has no JavaScript API.
|
|
25
|
+
|
|
26
|
+
## Composition
|
|
27
|
+
|
|
28
|
+
- Parents: used at the root of a screen or reference, not nested.
|
|
29
|
+
- Contexts: `application-reference`.
|
|
30
|
+
- Children: unrestricted.
|
|
31
|
+
- Built from: [Pane](./pane.md), [Toolbar](./toolbar.md), [ToolbarText](./toolbar-text.md), [ToolbarControlGroup](./toolbar-control-group.md), [Workbench](./workbench.md), [List](./list.md), [ListItem](./list-item.md), [ValueTable](./value-table.md), [LucideIcon](./lucide-icon.md), [Application layout](./layout.md).
|
|
32
|
+
|
|
33
|
+
## State and wiring
|
|
34
|
+
|
|
35
|
+
**The app owns:** routing; pane visibility; pane sizes and persistence; workspace data.
|
|
36
|
+
|
|
37
|
+
No wiring helper.
|
|
38
|
+
|
|
39
|
+
## Geometry
|
|
40
|
+
|
|
41
|
+
Margin: composed · border: composed · padding: composed (layout role: reference-composition). `self` means the component already owns it — do not add wrapper padding, margin, or borders around it.
|
|
42
|
+
|
|
43
|
+
## Accessibility
|
|
44
|
+
|
|
45
|
+
- Each pane has one scroll owner and each resize handle keeps its separator keyboard contract.
|
|
46
|
+
|
|
47
|
+
## Styling boundary
|
|
48
|
+
|
|
49
|
+
The component owns its own styles. Configure it through its props and variants; do not override its internals.
|
|
50
|
+
|
|
51
|
+
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`).
|
|
52
|
+
|
|
53
|
+
## Related
|
|
54
|
+
|
|
55
|
+
- Components: [Pane](./pane.md), [Toolbar](./toolbar.md), [ToolbarText](./toolbar-text.md), [ToolbarControlGroup](./toolbar-control-group.md), [Workbench](./workbench.md), [List](./list.md), [ListItem](./list-item.md), [ValueTable](./value-table.md), [LucideIcon](./lucide-icon.md), [Application layout](./layout.md).
|
|
56
|
+
- Docs: [`docs/recipes.md#desktop-application-shell`](../../docs/recipes.md#desktop-application-shell).
|
|
57
|
+
- UX catalog route: `?component=recipe-app-shell`.
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# Collapsible sidebar
|
|
2
|
+
|
|
3
|
+
<!-- Generated by scripts/sync-component-docs.mjs from ai/component-catalog.json and ai/component-composition.json. Do not edit; run `npm run catalog:sync`. -->
|
|
4
|
+
|
|
5
|
+
`@kerfjs/ui:recipe-collapsible-sidebar` · Kerf UI · production recipe · Recipes
|
|
6
|
+
|
|
7
|
+
## When to use
|
|
8
|
+
|
|
9
|
+
A mini app frame whose left navigation rail and bottom activity drawer are standalone CollapsiblePanels driven by wireSidebar: per-side collapse/expand toggles, focus move-in and restore, a dismissable compact overlay, and per-panel persistence.
|
|
10
|
+
|
|
11
|
+
- A rail or drawer must collapse and expand outside a full Workbench shell, keeping the app's collapsed signals, sizes, and content while the wire owns toggle, focus, the compact overlay, and persistence.
|
|
12
|
+
|
|
13
|
+
**Not when:**
|
|
14
|
+
|
|
15
|
+
- Use the Workbench layout when the whole screen is a three-pane shell; use an ordinary always-visible sidebar when it never collapses.
|
|
16
|
+
|
|
17
|
+
## Imports
|
|
18
|
+
|
|
19
|
+
- Nothing to import: this is a reference composition.
|
|
20
|
+
- Declared side effects: lazy-recipe-css.
|
|
21
|
+
|
|
22
|
+
## Props
|
|
23
|
+
|
|
24
|
+
No props: this entry has no JavaScript API.
|
|
25
|
+
|
|
26
|
+
## Composition
|
|
27
|
+
|
|
28
|
+
- Parents: used at the root of a screen or reference, not nested.
|
|
29
|
+
- Contexts: `application-reference`.
|
|
30
|
+
- Children: unrestricted.
|
|
31
|
+
- Built from: [CollapsiblePanel](./collapsible-panel.md), [Pane](./pane.md), [Row](./row.md), [List](./list.md), [Grid](./grid.md), [ListHeader](./list-header.md), [ListItem](./list-item.md), [Text](./text.md), [Toolbar](./toolbar.md), [ToolbarControlGroup](./toolbar-control-group.md), [ToolbarText](./toolbar-text.md), [ValueTable](./value-table.md), [LucideIcon](./lucide-icon.md), [Application layout](./layout.md), [ContentItem](./content-item.md).
|
|
32
|
+
|
|
33
|
+
## State and wiring
|
|
34
|
+
|
|
35
|
+
**The app owns:** each panel's collapsed signal; panel sizes; routing and selection; content.
|
|
36
|
+
|
|
37
|
+
No wiring helper.
|
|
38
|
+
|
|
39
|
+
## Geometry
|
|
40
|
+
|
|
41
|
+
Margin: composed · border: composed · padding: composed (layout role: reference-composition). `self` means the component already owns it — do not add wrapper padding, margin, or borders around it.
|
|
42
|
+
|
|
43
|
+
## Accessibility
|
|
44
|
+
|
|
45
|
+
- Each panel is a labeled aside that is aria-hidden while collapsed; toggles carry aria-expanded and the standard per-side glyph; while compact an open panel is an overlay with a backdrop, Escape and backdrop-click dismiss, and a trapped Tab ring.
|
|
46
|
+
|
|
47
|
+
## Styling boundary
|
|
48
|
+
|
|
49
|
+
The component owns its own styles. Configure it through its props and variants; do not override its internals.
|
|
50
|
+
|
|
51
|
+
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`).
|
|
52
|
+
|
|
53
|
+
## Related
|
|
54
|
+
|
|
55
|
+
- Components: [CollapsiblePanel](./collapsible-panel.md), [Pane](./pane.md), [Row](./row.md), [List](./list.md), [Grid](./grid.md), [ListHeader](./list-header.md), [ListItem](./list-item.md), [Text](./text.md), [Toolbar](./toolbar.md), [ToolbarControlGroup](./toolbar-control-group.md), [ToolbarText](./toolbar-text.md), [ValueTable](./value-table.md), [LucideIcon](./lucide-icon.md), [Application layout](./layout.md), [ContentItem](./content-item.md).
|
|
56
|
+
- Docs: [`docs/recipes.md#collapsible-sidebar`](../../docs/recipes.md#collapsible-sidebar).
|
|
57
|
+
- UX catalog route: `?component=recipe-collapsible-sidebar`.
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# Compact toolbar choices and actions
|
|
2
|
+
|
|
3
|
+
<!-- Generated by scripts/sync-component-docs.mjs from ai/component-catalog.json and ai/component-composition.json. Do not edit; run `npm run catalog:sync`. -->
|
|
4
|
+
|
|
5
|
+
`@kerfjs/ui:recipe-compact-toolbar` · Kerf UI · production recipe · Recipes
|
|
6
|
+
|
|
7
|
+
## When to use
|
|
8
|
+
|
|
9
|
+
A compact toolbar that distinguishes grouped commands, a visible exclusive choice, a longer Select, and one ordinary action.
|
|
10
|
+
|
|
11
|
+
- A dense workspace toolbar mixes a few distinct control semantics.
|
|
12
|
+
|
|
13
|
+
**Not when:**
|
|
14
|
+
|
|
15
|
+
- Do not group unrelated actions or use buttons to imitate selection controls.
|
|
16
|
+
|
|
17
|
+
## Imports
|
|
18
|
+
|
|
19
|
+
- Nothing to import: this is a reference composition.
|
|
20
|
+
- Declared side effects: lazy-recipe-css, individual-custom-element-registration.
|
|
21
|
+
|
|
22
|
+
## Props
|
|
23
|
+
|
|
24
|
+
No props: this entry has no JavaScript API.
|
|
25
|
+
|
|
26
|
+
## Composition
|
|
27
|
+
|
|
28
|
+
- Parents: used at the root of a screen or reference, not nested.
|
|
29
|
+
- Contexts: `application-reference`.
|
|
30
|
+
- Children: unrestricted.
|
|
31
|
+
- Built from: [Toolbar](./toolbar.md), [ToolbarText](./toolbar-text.md), [ToolbarControlGroup](./toolbar-control-group.md), [SegmentedControl](./segmented-control.md), [Select](./select.md), [LucideIcon](./lucide-icon.md), [Grid](./grid.md), [List](./list.md), [ListInsetText](./list-inset-text.md), [Text](./text.md).
|
|
32
|
+
|
|
33
|
+
## State and wiring
|
|
34
|
+
|
|
35
|
+
**The app owns:** controlled values; actions; persistence; responsive priority.
|
|
36
|
+
|
|
37
|
+
No wiring helper.
|
|
38
|
+
|
|
39
|
+
## Geometry
|
|
40
|
+
|
|
41
|
+
Margin: composed · border: composed · padding: composed (layout role: reference-composition). `self` means the component already owns it — do not add wrapper padding, margin, or borders around it.
|
|
42
|
+
|
|
43
|
+
## Accessibility
|
|
44
|
+
|
|
45
|
+
- Each control retains its own native name, pressed/value state, and keyboard contract.
|
|
46
|
+
|
|
47
|
+
## Styling boundary
|
|
48
|
+
|
|
49
|
+
The component owns its own styles. Configure it through its props and variants; do not override its internals.
|
|
50
|
+
|
|
51
|
+
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`).
|
|
52
|
+
|
|
53
|
+
## Related
|
|
54
|
+
|
|
55
|
+
- Components: [Toolbar](./toolbar.md), [ToolbarText](./toolbar-text.md), [ToolbarControlGroup](./toolbar-control-group.md), [SegmentedControl](./segmented-control.md), [Select](./select.md), [LucideIcon](./lucide-icon.md), [Grid](./grid.md), [List](./list.md), [ListInsetText](./list-inset-text.md), [Text](./text.md).
|
|
56
|
+
- Docs: [`docs/recipes.md#compact-toolbar-choices-and-actions`](../../docs/recipes.md#compact-toolbar-choices-and-actions).
|
|
57
|
+
- UX catalog route: `?component=recipe-compact-toolbar`.
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# Composer form
|
|
2
|
+
|
|
3
|
+
<!-- Generated by scripts/sync-component-docs.mjs from ai/component-catalog.json and ai/component-composition.json. Do not edit; run `npm run catalog:sync`. -->
|
|
4
|
+
|
|
5
|
+
`@kerfjs/ui:recipe-composer-form` · Kerf UI · production recipe · Recipes
|
|
6
|
+
|
|
7
|
+
## When to use
|
|
8
|
+
|
|
9
|
+
One visible publishing-form surface with Toolbar heading hierarchy, fields and actions on the shared 8px control gutter, 24px major rhythm, and a conditional StateBanner as its only nested semantic surface.
|
|
10
|
+
|
|
11
|
+
- A short form needs one coherent surface, consistent field/action rhythm, and persistent validation feedback.
|
|
12
|
+
|
|
13
|
+
**Not when:**
|
|
14
|
+
|
|
15
|
+
- Do not turn each form section into another visible card or use the recipe as a generic form engine or transport abstraction.
|
|
16
|
+
|
|
17
|
+
## Imports
|
|
18
|
+
|
|
19
|
+
- Nothing to import: this is a reference composition.
|
|
20
|
+
- Declared side effects: lazy-recipe-css, individual-custom-element-registration.
|
|
21
|
+
|
|
22
|
+
## Props
|
|
23
|
+
|
|
24
|
+
No props: this entry has no JavaScript API.
|
|
25
|
+
|
|
26
|
+
## Composition
|
|
27
|
+
|
|
28
|
+
- Parents: used at the root of a screen or reference, not nested.
|
|
29
|
+
- Contexts: `application-reference`.
|
|
30
|
+
- Children: unrestricted.
|
|
31
|
+
- Built from: [Toolbar](./toolbar.md), [ToolbarText](./toolbar-text.md), [List](./list.md), [ListInsetText](./list-inset-text.md), [Text](./text.md), [Row](./row.md), [Select](./select.md), [StateBanner](./state-banner.md), [Input](./wa-input.md), [Textarea](./wa-textarea.md), [Button](./wa-button.md), [Application layout](./layout.md).
|
|
32
|
+
|
|
33
|
+
## State and wiring
|
|
34
|
+
|
|
35
|
+
**The app owns:** validation rules; draft persistence; permissions; transport.
|
|
36
|
+
|
|
37
|
+
No wiring helper.
|
|
38
|
+
|
|
39
|
+
## Geometry
|
|
40
|
+
|
|
41
|
+
Margin: composed · border: composed · padding: composed (layout role: reference-composition). `self` means the component already owns it — do not add wrapper padding, margin, or borders around it.
|
|
42
|
+
|
|
43
|
+
## Accessibility
|
|
44
|
+
|
|
45
|
+
- The form references its ToolbarText title and supporting-summary ids; production fields own labels and help; invalid submission creates an assertive persistent StateBanner while successful submission creates a polite persistent banner.
|
|
46
|
+
|
|
47
|
+
## Styling boundary
|
|
48
|
+
|
|
49
|
+
The component owns its own styles. Configure it through its props and variants; do not override its internals.
|
|
50
|
+
|
|
51
|
+
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`).
|
|
52
|
+
|
|
53
|
+
## Related
|
|
54
|
+
|
|
55
|
+
- Components: [Toolbar](./toolbar.md), [ToolbarText](./toolbar-text.md), [List](./list.md), [ListInsetText](./list-inset-text.md), [Text](./text.md), [Row](./row.md), [Select](./select.md), [StateBanner](./state-banner.md), [Input](./wa-input.md), [Textarea](./wa-textarea.md), [Button](./wa-button.md), [Application layout](./layout.md).
|
|
56
|
+
- Docs: [`docs/recipes.md#composer-form`](../../docs/recipes.md#composer-form).
|
|
57
|
+
- UX catalog route: `?component=recipe-composer-form`.
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# List-detail dialog
|
|
2
|
+
|
|
3
|
+
<!-- Generated by scripts/sync-component-docs.mjs from ai/component-catalog.json and ai/component-composition.json. Do not edit; run `npm run catalog:sync`. -->
|
|
4
|
+
|
|
5
|
+
`@kerfjs/ui:recipe-list-detail-dialog` · Kerf UI · production recipe · Recipes
|
|
6
|
+
|
|
7
|
+
## When to use
|
|
8
|
+
|
|
9
|
+
Production modal laid out as a workbench: a full-height SplitView list sidebar with its own toolbar beside a full-height detail column that carries the primary title, close control, and record actions; a full-screen drill-down on compact devices.
|
|
10
|
+
|
|
11
|
+
- A focused task compares several records without leaving the current workspace.
|
|
12
|
+
|
|
13
|
+
**Not when:**
|
|
14
|
+
|
|
15
|
+
- Use a page when the task needs a durable route or substantially more working space.
|
|
16
|
+
|
|
17
|
+
## Imports
|
|
18
|
+
|
|
19
|
+
- Nothing to import: this is a reference composition.
|
|
20
|
+
- Declared side effects: lazy-recipe-css, individual-custom-element-registration.
|
|
21
|
+
|
|
22
|
+
## Props
|
|
23
|
+
|
|
24
|
+
No props: this entry has no JavaScript API.
|
|
25
|
+
|
|
26
|
+
## Composition
|
|
27
|
+
|
|
28
|
+
- Parents: used at the root of a screen or reference, not nested.
|
|
29
|
+
- Contexts: `application-reference`.
|
|
30
|
+
- Children: unrestricted.
|
|
31
|
+
- Built from: [Surface scaffolds](./surface-scaffold.md), [SplitView](./split-view.md), [NavStack](./nav-stack.md), [Row](./row.md), [List](./list.md), [ListHeader](./list-header.md), [ListItem](./list-item.md), [ValueTable](./value-table.md), [LucideIcon](./lucide-icon.md), [Dialog](./wa-dialog.md), [Button](./wa-button.md).
|
|
32
|
+
|
|
33
|
+
## State and wiring
|
|
34
|
+
|
|
35
|
+
**The app owns:** open state; selected record; pushed compact detail; dismiss policy; record actions.
|
|
36
|
+
|
|
37
|
+
No wiring helper.
|
|
38
|
+
|
|
39
|
+
## Geometry
|
|
40
|
+
|
|
41
|
+
Margin: composed · border: composed · padding: composed (layout role: reference-composition). `self` means the component already owns it — do not add wrapper padding, margin, or borders around it.
|
|
42
|
+
|
|
43
|
+
## Accessibility
|
|
44
|
+
|
|
45
|
+
- Web Awesome owns modal focus, Escape, and the labeled header with its close control; the application adapter restores the invoking control after hide, and the compact NavStack back control returns to the list.
|
|
46
|
+
|
|
47
|
+
## Styling boundary
|
|
48
|
+
|
|
49
|
+
The component owns its own styles. Configure it through its props and variants; do not override its internals.
|
|
50
|
+
|
|
51
|
+
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`).
|
|
52
|
+
|
|
53
|
+
## Related
|
|
54
|
+
|
|
55
|
+
- Components: [Surface scaffolds](./surface-scaffold.md), [SplitView](./split-view.md), [NavStack](./nav-stack.md), [Row](./row.md), [List](./list.md), [ListHeader](./list-header.md), [ListItem](./list-item.md), [ValueTable](./value-table.md), [LucideIcon](./lucide-icon.md), [Dialog](./wa-dialog.md), [Button](./wa-button.md).
|
|
56
|
+
- Docs: [`docs/recipes.md#list-detail-dialog`](../../docs/recipes.md#list-detail-dialog).
|
|
57
|
+
- UX catalog route: `?component=recipe-list-detail-dialog`.
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# List workspace states
|
|
2
|
+
|
|
3
|
+
<!-- Generated by scripts/sync-component-docs.mjs from ai/component-catalog.json and ai/component-composition.json. Do not edit; run `npm run catalog:sync`. -->
|
|
4
|
+
|
|
5
|
+
`@kerfjs/ui:recipe-list-workspace-states` · Kerf UI · production recipe · Recipes
|
|
6
|
+
|
|
7
|
+
## When to use
|
|
8
|
+
|
|
9
|
+
Deterministic loading, empty, populated, stale refresh, and error states around one stable list workspace.
|
|
10
|
+
|
|
11
|
+
- A list surface must communicate initial load, absence, background refresh, failure, and recovery.
|
|
12
|
+
|
|
13
|
+
**Not when:**
|
|
14
|
+
|
|
15
|
+
- Do not replace domain rows with a generic component or use transient toasts as the only error record.
|
|
16
|
+
|
|
17
|
+
## Imports
|
|
18
|
+
|
|
19
|
+
- Nothing to import: this is a reference composition.
|
|
20
|
+
- Declared side effects: lazy-recipe-css.
|
|
21
|
+
|
|
22
|
+
## Props
|
|
23
|
+
|
|
24
|
+
No props: this entry has no JavaScript API.
|
|
25
|
+
|
|
26
|
+
## Composition
|
|
27
|
+
|
|
28
|
+
- Parents: used at the root of a screen or reference, not nested.
|
|
29
|
+
- Contexts: `application-reference`.
|
|
30
|
+
- Children: unrestricted.
|
|
31
|
+
- Built from: [Pane](./pane.md), [Toolbar](./toolbar.md), [ToolbarControlGroup](./toolbar-control-group.md), [ToolbarText](./toolbar-text.md), [ListItem](./list-item.md), [Row](./row.md), [StateBanner](./state-banner.md), [EmptyState](./empty-state.md), [LoadingSpinner](./loading-spinner.md), [Application layout](./layout.md).
|
|
32
|
+
|
|
33
|
+
## State and wiring
|
|
34
|
+
|
|
35
|
+
**The app owns:** fetching; cache age; retry policy; domain rows.
|
|
36
|
+
|
|
37
|
+
No wiring helper.
|
|
38
|
+
|
|
39
|
+
## Geometry
|
|
40
|
+
|
|
41
|
+
Margin: composed · border: composed · padding: composed (layout role: reference-composition). `self` means the component already owns it — do not add wrapper padding, margin, or borders around it.
|
|
42
|
+
|
|
43
|
+
## Accessibility
|
|
44
|
+
|
|
45
|
+
- Busy, polite, and assertive states use the appropriate production feedback semantics.
|
|
46
|
+
|
|
47
|
+
## Styling boundary
|
|
48
|
+
|
|
49
|
+
The component owns its own styles. Configure it through its props and variants; do not override its internals.
|
|
50
|
+
|
|
51
|
+
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`).
|
|
52
|
+
|
|
53
|
+
## Related
|
|
54
|
+
|
|
55
|
+
- Components: [Pane](./pane.md), [Toolbar](./toolbar.md), [ToolbarControlGroup](./toolbar-control-group.md), [ToolbarText](./toolbar-text.md), [ListItem](./list-item.md), [Row](./row.md), [StateBanner](./state-banner.md), [EmptyState](./empty-state.md), [LoadingSpinner](./loading-spinner.md), [Application layout](./layout.md).
|
|
56
|
+
- Docs: [`docs/recipes.md#list-workspace-states`](../../docs/recipes.md#list-workspace-states).
|
|
57
|
+
- UX catalog route: `?component=recipe-list-workspace-states`.
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# Loading inspector
|
|
2
|
+
|
|
3
|
+
<!-- Generated by scripts/sync-component-docs.mjs from ai/component-catalog.json and ai/component-composition.json. Do not edit; run `npm run catalog:sync`. -->
|
|
4
|
+
|
|
5
|
+
`@kerfjs/ui:recipe-loading-inspector` · Kerf UI · production recipe · Recipes
|
|
6
|
+
|
|
7
|
+
## When to use
|
|
8
|
+
|
|
9
|
+
A record inspector whose per-record values load asynchronously — every value-bearing component takes a shared placeholder flag, so the same chrome renders a faithful loading state and then the populated record.
|
|
10
|
+
|
|
11
|
+
- A detail or inspector view must render its real chrome while its per-record values are still loading, then swap to the populated record without duplicating markup.
|
|
12
|
+
|
|
13
|
+
**Not when:**
|
|
14
|
+
|
|
15
|
+
- Do not hand-build a separate empty-state layout, and do not use it for known progress — use LoadingSpinner for that.
|
|
16
|
+
|
|
17
|
+
## Imports
|
|
18
|
+
|
|
19
|
+
- Nothing to import: this is a reference composition.
|
|
20
|
+
- Declared side effects: lazy-recipe-css, individual-custom-element-registration.
|
|
21
|
+
|
|
22
|
+
## Props
|
|
23
|
+
|
|
24
|
+
No props: this entry has no JavaScript API.
|
|
25
|
+
|
|
26
|
+
## Composition
|
|
27
|
+
|
|
28
|
+
- Parents: used at the root of a screen or reference, not nested.
|
|
29
|
+
- Contexts: `application-reference`.
|
|
30
|
+
- Children: unrestricted.
|
|
31
|
+
- Built from: [Pane](./pane.md), [Toolbar](./toolbar.md), [ToolbarControlGroup](./toolbar-control-group.md), [ToolbarText](./toolbar-text.md), [ListInsetText](./list-inset-text.md), [Text](./text.md), [List](./list.md), [ValueTable](./value-table.md), [Select](./select.md), [SegmentedControl](./segmented-control.md), [ListItem](./list-item.md), [StateBanner](./state-banner.md), [Skeleton](./skeleton.md), [LucideIcon](./lucide-icon.md).
|
|
32
|
+
|
|
33
|
+
## State and wiring
|
|
34
|
+
|
|
35
|
+
**The app owns:** loading lifecycle; which values are unknown; fetching, transport, and domain data.
|
|
36
|
+
|
|
37
|
+
No wiring helper.
|
|
38
|
+
|
|
39
|
+
## Geometry
|
|
40
|
+
|
|
41
|
+
Margin: composed · border: composed · padding: composed (layout role: reference-composition). `self` means the component already owns it — do not add wrapper padding, margin, or borders around it.
|
|
42
|
+
|
|
43
|
+
## Accessibility
|
|
44
|
+
|
|
45
|
+
- Each component marks itself aria-busy and disables its own controls while loading; the composition keeps labels and structure stable across the transition.
|
|
46
|
+
|
|
47
|
+
## Styling boundary
|
|
48
|
+
|
|
49
|
+
The component owns its own styles. Configure it through its props and variants; do not override its internals.
|
|
50
|
+
|
|
51
|
+
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`).
|
|
52
|
+
|
|
53
|
+
## Related
|
|
54
|
+
|
|
55
|
+
- Components: [Pane](./pane.md), [Toolbar](./toolbar.md), [ToolbarControlGroup](./toolbar-control-group.md), [ToolbarText](./toolbar-text.md), [ListInsetText](./list-inset-text.md), [Text](./text.md), [List](./list.md), [ValueTable](./value-table.md), [Select](./select.md), [SegmentedControl](./segmented-control.md), [ListItem](./list-item.md), [StateBanner](./state-banner.md), [Skeleton](./skeleton.md), [LucideIcon](./lucide-icon.md).
|
|
56
|
+
- Docs: [`docs/recipes.md#loading-inspector`](../../docs/recipes.md#loading-inspector).
|
|
57
|
+
- UX catalog route: `?component=recipe-loading-inspector`.
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# Navigation sidebar
|
|
2
|
+
|
|
3
|
+
<!-- Generated by scripts/sync-component-docs.mjs from ai/component-catalog.json and ai/component-composition.json. Do not edit; run `npm run catalog:sync`. -->
|
|
4
|
+
|
|
5
|
+
`@kerfjs/ui:recipe-navigation-sidebar` · Kerf UI · production recipe · Recipes
|
|
6
|
+
|
|
7
|
+
## When to use
|
|
8
|
+
|
|
9
|
+
Navigation sections with icon and iconless rows, a content-item surface, disclosure, and pane footer actions.
|
|
10
|
+
|
|
11
|
+
- A workspace sidebar needs the shared toolbar/content/footer pane model, 24px major section rhythm, and 44px row and utility-action targets.
|
|
12
|
+
|
|
13
|
+
**Not when:**
|
|
14
|
+
|
|
15
|
+
- Use ordinary links when menu selection, section, and sidebar anatomy do not apply.
|
|
16
|
+
|
|
17
|
+
## Imports
|
|
18
|
+
|
|
19
|
+
- Nothing to import: this is a reference composition.
|
|
20
|
+
- Declared side effects: lazy-recipe-css.
|
|
21
|
+
|
|
22
|
+
## Props
|
|
23
|
+
|
|
24
|
+
No props: this entry has no JavaScript API.
|
|
25
|
+
|
|
26
|
+
## Composition
|
|
27
|
+
|
|
28
|
+
- Parents: used at the root of a screen or reference, not nested.
|
|
29
|
+
- Contexts: `application-reference`.
|
|
30
|
+
- Children: unrestricted.
|
|
31
|
+
- Built from: [Pane](./pane.md), [ListHeader](./list-header.md), [ListItem](./list-item.md), [List](./list.md), [Text](./text.md), [Toolbar](./toolbar.md), [ToolbarControlGroup](./toolbar-control-group.md), [LucideIcon](./lucide-icon.md), [Application layout](./layout.md), [ContentItem](./content-item.md).
|
|
32
|
+
|
|
33
|
+
## State and wiring
|
|
34
|
+
|
|
35
|
+
**The app owns:** information architecture; routing; permissions; disclosure state.
|
|
36
|
+
|
|
37
|
+
No wiring helper.
|
|
38
|
+
|
|
39
|
+
## Geometry
|
|
40
|
+
|
|
41
|
+
Margin: composed · border: composed · padding: composed (layout role: reference-composition). `self` means the component already owns it — do not add wrapper padding, margin, or borders around it.
|
|
42
|
+
|
|
43
|
+
## Accessibility
|
|
44
|
+
|
|
45
|
+
- Native buttons retain names, current state, sequential focus, and disclosure state; rows and standalone footer actions remain at least 44px tall.
|
|
46
|
+
|
|
47
|
+
## Styling boundary
|
|
48
|
+
|
|
49
|
+
The component owns its own styles. Configure it through its props and variants; do not override its internals.
|
|
50
|
+
|
|
51
|
+
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`).
|
|
52
|
+
|
|
53
|
+
## Related
|
|
54
|
+
|
|
55
|
+
- Components: [Pane](./pane.md), [ListHeader](./list-header.md), [ListItem](./list-item.md), [List](./list.md), [Text](./text.md), [Toolbar](./toolbar.md), [ToolbarControlGroup](./toolbar-control-group.md), [LucideIcon](./lucide-icon.md), [Application layout](./layout.md), [ContentItem](./content-item.md).
|
|
56
|
+
- Docs: [`docs/recipes.md#navigation-sidebar`](../../docs/recipes.md#navigation-sidebar).
|
|
57
|
+
- UX catalog route: `?component=recipe-navigation-sidebar`.
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# Navigation stack
|
|
2
|
+
|
|
3
|
+
<!-- Generated by scripts/sync-component-docs.mjs from ai/component-catalog.json and ai/component-composition.json. Do not edit; run `npm run catalog:sync`. -->
|
|
4
|
+
|
|
5
|
+
`@kerfjs/ui:recipe-navigation-stack` · Kerf UI · production recipe · Recipes
|
|
6
|
+
|
|
7
|
+
## When to use
|
|
8
|
+
|
|
9
|
+
A push/pop navigation stack drill-down with animated slides and a live device class.
|
|
10
|
+
|
|
11
|
+
- A flow drills from a list into detail and back on one pane, at any device size or inside a dialog.
|
|
12
|
+
|
|
13
|
+
**Not when:**
|
|
14
|
+
|
|
15
|
+
- Use SplitView when a list and its detail should show together on roomy classes.
|
|
16
|
+
|
|
17
|
+
## Imports
|
|
18
|
+
|
|
19
|
+
- Nothing to import: this is a reference composition.
|
|
20
|
+
- Declared side effects: lazy-recipe-css.
|
|
21
|
+
|
|
22
|
+
## Props
|
|
23
|
+
|
|
24
|
+
No props: this entry has no JavaScript API.
|
|
25
|
+
|
|
26
|
+
## Composition
|
|
27
|
+
|
|
28
|
+
- Parents: used at the root of a screen or reference, not nested.
|
|
29
|
+
- Contexts: `application-reference`.
|
|
30
|
+
- Children: unrestricted.
|
|
31
|
+
- Built from: [NavStack](./nav-stack.md), [List](./list.md), [ListHeader](./list-header.md), [ListItem](./list-item.md), [Row](./row.md), [Text](./text.md), [LucideIcon](./lucide-icon.md), [Application layout](./layout.md), [ContentItem](./content-item.md).
|
|
32
|
+
|
|
33
|
+
## State and wiring
|
|
34
|
+
|
|
35
|
+
**The app owns:** the stack (a signal of views); selection; routing; data.
|
|
36
|
+
|
|
37
|
+
No wiring helper.
|
|
38
|
+
|
|
39
|
+
## Geometry
|
|
40
|
+
|
|
41
|
+
Margin: composed · border: composed · padding: composed (layout role: reference-composition). `self` means the component already owns it — do not add wrapper padding, margin, or borders around it.
|
|
42
|
+
|
|
43
|
+
## Accessibility
|
|
44
|
+
|
|
45
|
+
- The back control is a real button; reduced motion collapses the slide to instant.
|
|
46
|
+
|
|
47
|
+
## Styling boundary
|
|
48
|
+
|
|
49
|
+
The component owns its own styles. Configure it through its props and variants; do not override its internals.
|
|
50
|
+
|
|
51
|
+
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`).
|
|
52
|
+
|
|
53
|
+
## Related
|
|
54
|
+
|
|
55
|
+
- Components: [NavStack](./nav-stack.md), [List](./list.md), [ListHeader](./list-header.md), [ListItem](./list-item.md), [Row](./row.md), [Text](./text.md), [LucideIcon](./lucide-icon.md), [Application layout](./layout.md), [ContentItem](./content-item.md).
|
|
56
|
+
- Docs: [`docs/recipes.md#navigation-stack`](../../docs/recipes.md#navigation-stack).
|
|
57
|
+
- UX catalog route: `?component=recipe-navigation-stack`.
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# Workspace header
|
|
2
|
+
|
|
3
|
+
<!-- Generated by scripts/sync-component-docs.mjs from ai/component-catalog.json and ai/component-composition.json. Do not edit; run `npm run catalog:sync`. -->
|
|
4
|
+
|
|
5
|
+
`@kerfjs/ui:recipe-workspace-header` · Kerf UI · production recipe · Recipes
|
|
6
|
+
|
|
7
|
+
## When to use
|
|
8
|
+
|
|
9
|
+
Page identity with primary, secondary, and overflow actions that relocate at narrow widths.
|
|
10
|
+
|
|
11
|
+
- A workspace page needs one primary heading and a small prioritized action set.
|
|
12
|
+
|
|
13
|
+
**Not when:**
|
|
14
|
+
|
|
15
|
+
- Use a smaller local heading when the page does not need actions or persistent identity.
|
|
16
|
+
|
|
17
|
+
## Imports
|
|
18
|
+
|
|
19
|
+
- Nothing to import: this is a reference composition.
|
|
20
|
+
- Declared side effects: lazy-recipe-css.
|
|
21
|
+
|
|
22
|
+
## Props
|
|
23
|
+
|
|
24
|
+
No props: this entry has no JavaScript API.
|
|
25
|
+
|
|
26
|
+
## Composition
|
|
27
|
+
|
|
28
|
+
- Parents: used at the root of a screen or reference, not nested.
|
|
29
|
+
- Contexts: `application-reference`.
|
|
30
|
+
- Children: unrestricted.
|
|
31
|
+
- Built from: [Toolbar](./toolbar.md), [ToolbarControlGroup](./toolbar-control-group.md), [ToolbarText](./toolbar-text.md), [List](./list.md), [ListInsetText](./list-inset-text.md), [Text](./text.md), [StateBanner](./state-banner.md), [Application layout](./layout.md).
|
|
32
|
+
|
|
33
|
+
## State and wiring
|
|
34
|
+
|
|
35
|
+
**The app owns:** authorization; command behavior; breadcrumbs; product copy.
|
|
36
|
+
|
|
37
|
+
No wiring helper.
|
|
38
|
+
|
|
39
|
+
## Geometry
|
|
40
|
+
|
|
41
|
+
Margin: composed · border: composed · padding: composed (layout role: reference-composition). `self` means the component already owns it — do not add wrapper padding, margin, or borders around it.
|
|
42
|
+
|
|
43
|
+
## Accessibility
|
|
44
|
+
|
|
45
|
+
- Heading order and action focus order remain stable when controls wrap.
|
|
46
|
+
|
|
47
|
+
## Styling boundary
|
|
48
|
+
|
|
49
|
+
The component owns its own styles. Configure it through its props and variants; do not override its internals.
|
|
50
|
+
|
|
51
|
+
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`).
|
|
52
|
+
|
|
53
|
+
## Related
|
|
54
|
+
|
|
55
|
+
- Components: [Toolbar](./toolbar.md), [ToolbarControlGroup](./toolbar-control-group.md), [ToolbarText](./toolbar-text.md), [List](./list.md), [ListInsetText](./list-inset-text.md), [Text](./text.md), [StateBanner](./state-banner.md), [Application layout](./layout.md).
|
|
56
|
+
- Docs: [`docs/recipes.md#workspace-header`](../../docs/recipes.md#workspace-header).
|
|
57
|
+
- UX catalog route: `?component=recipe-workspace-header`.
|