@kerfjs/ui 4.4.1 → 5.0.0-beta.11
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 +241 -10
- package/ai/component-catalog.json +4828 -0
- package/ai/component-catalog.schema.json +79 -0
- package/ai/public-api-signatures-v1.md +1371 -0
- package/ai/skill.md +73 -11
- package/ai/webawesome-jsx-signatures-v1.md +106 -0
- package/dist/app-tab.d.ts +14 -2
- package/dist/app-tab.js +3 -1
- package/dist/browser/app-tab.js +3 -2
- package/dist/browser/disclosure-arrow.js +4 -0
- package/dist/browser/empty-state.js +3 -3
- package/dist/browser/floating-toolbar.js +3 -0
- package/dist/browser/list-action-row.js +4 -0
- package/dist/browser/list-header.js +6 -0
- package/dist/browser/list-item.js +4 -0
- package/dist/browser/loading-spinner.js +2 -2
- package/dist/browser/lucide-icon.js +2 -2
- package/dist/browser/panel-header.js +7 -0
- package/dist/browser/resizable-region.js +2 -2
- package/dist/browser/segmented-control.js +3 -2
- package/dist/browser/select.js +4 -3
- package/dist/browser/skeleton.js +3 -0
- package/dist/browser/state-banner.js +3 -2
- package/dist/browser/tab-bar.js +2 -2
- package/dist/browser/token-search-field.js +4 -0
- package/dist/browser/toolbar-control-group.js +2 -2
- package/dist/browser/toolbar-text.js +3 -2
- package/dist/browser/toolbar.js +2 -2
- package/dist/browser/value-table.js +3 -2
- package/dist/catalog.d.ts +119 -0
- package/dist/catalog.js +146 -0
- package/dist/catalog.js.map +1 -0
- package/dist/chunk-2Z5TWHKQ.js +34 -0
- package/dist/chunk-2Z5TWHKQ.js.map +1 -0
- package/dist/chunk-37T3VNIZ.js +19 -0
- package/dist/chunk-37T3VNIZ.js.map +1 -0
- package/dist/chunk-56RJXPHG.js +43 -0
- package/dist/chunk-56RJXPHG.js.map +1 -0
- package/dist/chunk-5ATCDSQS.js +42 -0
- package/dist/chunk-5ATCDSQS.js.map +1 -0
- package/dist/chunk-5E2HVJ33.js +10 -0
- package/dist/chunk-5E2HVJ33.js.map +1 -0
- package/dist/chunk-7BR3DO2A.js +31 -0
- package/dist/chunk-7BR3DO2A.js.map +1 -0
- package/dist/chunk-7JB7VPRI.js +34 -0
- package/dist/chunk-7JB7VPRI.js.map +1 -0
- package/dist/chunk-7LDCTU7D.js +134 -0
- package/dist/chunk-7LDCTU7D.js.map +1 -0
- package/dist/{chunk-4HHCYSGT.js → chunk-AQNKJRFH.js} +2 -2
- package/dist/{chunk-4HHCYSGT.js.map → chunk-AQNKJRFH.js.map} +1 -1
- package/dist/{chunk-MBR3TYNL.js → chunk-AVZHJN6C.js} +3 -3
- package/dist/chunk-AVZHJN6C.js.map +1 -0
- package/dist/chunk-B24C4A6T.js +22 -0
- package/dist/chunk-B24C4A6T.js.map +1 -0
- package/dist/chunk-BLK3UEEI.js +23 -0
- package/dist/chunk-BLK3UEEI.js.map +1 -0
- package/dist/chunk-CH4SQ6H5.js +39 -0
- package/dist/chunk-CH4SQ6H5.js.map +1 -0
- package/dist/chunk-I7INRJO4.js +17 -0
- package/dist/chunk-I7INRJO4.js.map +1 -0
- package/dist/chunk-L4OKFDJY.js +24 -0
- package/dist/chunk-L4OKFDJY.js.map +1 -0
- package/dist/chunk-LCOBDOCC.js +265 -0
- package/dist/chunk-LCOBDOCC.js.map +1 -0
- package/dist/{chunk-3O7ZEUW2.js → chunk-M5JRI6MN.js} +3 -3
- package/dist/chunk-M5JRI6MN.js.map +1 -0
- package/dist/{chunk-MFKMHK5W.js → chunk-RNPGFQ33.js} +3 -3
- package/dist/chunk-RNPGFQ33.js.map +1 -0
- package/dist/chunk-RUNWEPR4.js +10 -0
- package/dist/chunk-RUNWEPR4.js.map +1 -0
- package/dist/chunk-XE5ZLPCC.js +20 -0
- package/dist/chunk-XE5ZLPCC.js.map +1 -0
- package/dist/{chunk-MQIZAD4A.js → chunk-XXMOARTH.js} +5 -3
- package/dist/chunk-XXMOARTH.js.map +1 -0
- package/dist/{chunk-TRNBHPNW.js → chunk-YGN7OMLT.js} +11 -8
- package/dist/chunk-YGN7OMLT.js.map +1 -0
- package/dist/collapsible-panel.d.ts +66 -0
- package/dist/collapsible-panel.js +22 -0
- package/dist/collapsible-panel.js.map +1 -0
- package/dist/device-class.d.ts +62 -0
- package/dist/device-class.js +75 -0
- package/dist/device-class.js.map +1 -0
- package/dist/disclosure-arrow.d.ts +14 -0
- package/dist/disclosure-arrow.js +4 -0
- package/dist/disclosure-arrow.js.map +1 -0
- package/dist/floating-toolbar.d.ts +28 -0
- package/dist/floating-toolbar.js +3 -0
- package/dist/floating-toolbar.js.map +1 -0
- package/dist/index.d.ts +11 -6
- package/dist/index.js +22 -16
- package/dist/list-action-row.d.ts +52 -0
- package/dist/list-action-row.js +5 -0
- package/dist/list-action-row.js.map +1 -0
- package/dist/list-header.d.ts +43 -0
- package/dist/list-header.js +7 -0
- package/dist/list-header.js.map +1 -0
- package/dist/list-item.d.ts +33 -0
- package/dist/list-item.js +5 -0
- package/dist/list-item.js.map +1 -0
- package/dist/nav-stack.d.ts +38 -0
- package/dist/nav-stack.js +5 -0
- package/dist/nav-stack.js.map +1 -0
- package/dist/panel-header.d.ts +36 -0
- package/dist/panel-header.js +7 -0
- package/dist/panel-header.js.map +1 -0
- package/dist/resizable-region.d.ts +3 -1
- package/dist/resizable-region.js +1 -1
- package/dist/segmented-control.d.ts +3 -1
- package/dist/segmented-control.js +2 -1
- package/dist/select-register.d.ts +5 -1
- package/dist/select-register.js +3 -0
- package/dist/select-register.js.map +1 -1
- package/dist/select.d.ts +5 -2
- package/dist/select.js +2 -1
- package/dist/skeleton.d.ts +24 -0
- package/dist/skeleton.js +3 -0
- package/dist/skeleton.js.map +1 -0
- package/dist/split-view.d.ts +42 -0
- package/dist/split-view.js +21 -0
- package/dist/split-view.js.map +1 -0
- package/dist/state-banner.d.ts +3 -1
- package/dist/state-banner.js +2 -1
- package/dist/styles/app-tab.css +152 -0
- package/dist/styles/catalog.css +522 -0
- package/dist/styles/collapsible-panel.css +146 -0
- package/dist/styles/disclosure-arrow.css +23 -0
- package/dist/styles/empty-state.css +47 -0
- package/dist/styles/floating-toolbar.css +38 -0
- package/dist/styles/foundation.css +347 -0
- package/dist/styles/layout.css +73 -0
- package/dist/styles/list-action-row.css +160 -0
- package/dist/styles/list-header.css +160 -0
- package/dist/styles/list-item.css +123 -0
- package/dist/styles/loading-spinner.css +21 -0
- package/dist/styles/lucide-icon.css +6 -0
- package/dist/styles/nav-stack.css +111 -0
- package/dist/styles/panel-header.css +64 -0
- package/dist/styles/resizable-region.css +111 -0
- package/{src → dist/styles}/segmented-control.css +62 -31
- package/dist/styles/select.css +138 -0
- package/dist/styles/skeleton.css +31 -0
- package/dist/styles/split-view.css +35 -0
- package/dist/styles/state-banner.css +173 -0
- package/dist/styles/styles.css +23 -0
- package/dist/styles/tab-bar.css +45 -0
- package/dist/styles/tab-scaffold.css +84 -0
- package/dist/styles/token-search-field.css +289 -0
- package/dist/styles/toolbar-control-group.css +225 -0
- package/dist/styles/toolbar-text.css +40 -0
- package/dist/styles/toolbar.css +61 -0
- package/dist/styles/value-table.css +75 -0
- package/{src → dist/styles}/webawesome.css +119 -29
- package/dist/styles/workbench.css +94 -0
- package/dist/tab-bar.d.ts +8 -1
- package/dist/tab-bar.js +1 -1
- package/dist/tab-scaffold.d.ts +30 -0
- package/dist/tab-scaffold.js +16 -0
- package/dist/tab-scaffold.js.map +1 -0
- package/dist/token-search-field.d.ts +43 -0
- package/dist/token-search-field.js +4 -0
- package/dist/token-search-field.js.map +1 -0
- package/dist/toolbar-control-group.d.ts +3 -1
- package/dist/toolbar-control-group.js +1 -1
- package/dist/toolbar-text.d.ts +15 -3
- package/dist/toolbar-text.js +2 -1
- package/dist/value-table.d.ts +12 -2
- package/dist/value-table.js +2 -1
- package/dist/webawesome.d.ts +100 -0
- package/dist/webawesome.js +3 -0
- package/dist/webawesome.js.map +1 -0
- package/dist/wire-catalog.d.ts +26 -0
- package/dist/wire-catalog.js +48 -0
- package/dist/wire-catalog.js.map +1 -0
- package/dist/wire-nav-stack.d.ts +15 -0
- package/dist/wire-nav-stack.js +88 -0
- package/dist/wire-nav-stack.js.map +1 -0
- package/dist/wire-resizable-regions.js +1 -1
- package/dist/wire-sidebar.d.ts +43 -0
- package/dist/wire-sidebar.js +117 -0
- package/dist/wire-sidebar.js.map +1 -0
- package/dist/wire-tab-bars.d.ts +15 -2
- package/dist/wire-tab-bars.js +1 -1
- package/dist/wire-tab-scaffold.d.ts +11 -0
- package/dist/wire-tab-scaffold.js +16 -0
- package/dist/wire-tab-scaffold.js.map +1 -0
- package/dist/wire-token-search-fields.d.ts +106 -0
- package/dist/wire-token-search-fields.js +5 -0
- package/dist/wire-token-search-fields.js.map +1 -0
- package/dist/workbench.d.ts +33 -0
- package/dist/workbench.js +17 -0
- package/dist/workbench.js.map +1 -0
- package/docs/accessibility.md +112 -3
- package/docs/app-layouts.md +61 -0
- package/docs/catalog.md +155 -0
- package/docs/collapsible-panel.md +102 -0
- package/docs/component-contract.md +169 -4
- package/docs/component-selection.md +186 -0
- package/docs/design/templates/empty-state/filtered-dark.svg +1 -0
- package/docs/design/templates/empty-state/filtered.svg +1 -0
- package/docs/design/templates/empty-state/with-action-dark.svg +1 -0
- package/docs/design/templates/empty-state/with-action.svg +1 -0
- package/docs/design/templates/empty-state-dark.svg +7 -0
- package/docs/design/templates/empty-state.svg +7 -0
- package/docs/design/templates/list-action-row/default-dark.svg +1 -0
- package/docs/design/templates/list-action-row/default.svg +1 -0
- package/docs/design/templates/list-action-row/selected-dark.svg +1 -0
- package/docs/design/templates/list-action-row/selected.svg +1 -0
- package/docs/design/templates/list-action-row-dark.svg +7 -0
- package/docs/design/templates/list-action-row.svg +7 -0
- package/docs/design/templates/list-header/action-dark.svg +1 -0
- package/docs/design/templates/list-header/action.svg +1 -0
- package/docs/design/templates/list-header/count-dark.svg +1 -0
- package/docs/design/templates/list-header/count.svg +1 -0
- package/docs/design/templates/list-header/toggle-collapsed-dark.svg +1 -0
- package/docs/design/templates/list-header/toggle-collapsed.svg +1 -0
- package/docs/design/templates/list-header/toggle-expanded-dark.svg +1 -0
- package/docs/design/templates/list-header/toggle-expanded.svg +1 -0
- package/docs/design/templates/list-header-dark.svg +11 -0
- package/docs/design/templates/list-header.svg +11 -0
- package/docs/design/templates/list-item/default-dark.svg +1 -0
- package/docs/design/templates/list-item/default.svg +1 -0
- package/docs/design/templates/list-item/multiline-dark.svg +1 -0
- package/docs/design/templates/list-item/multiline.svg +1 -0
- package/docs/design/templates/list-item/selected-dark.svg +1 -0
- package/docs/design/templates/list-item/selected.svg +1 -0
- package/docs/design/templates/list-item/trailing-dark.svg +1 -0
- package/docs/design/templates/list-item/trailing.svg +1 -0
- package/docs/design/templates/list-item-dark.svg +11 -0
- package/docs/design/templates/list-item.svg +11 -0
- package/docs/design/templates/panel-header/icon-actions-dark.svg +1 -0
- package/docs/design/templates/panel-header/icon-actions.svg +1 -0
- package/docs/design/templates/panel-header/icon-summary-actions-dark.svg +1 -0
- package/docs/design/templates/panel-header/icon-summary-actions.svg +1 -0
- package/docs/design/templates/panel-header/no-icon-dark.svg +1 -0
- package/docs/design/templates/panel-header/no-icon.svg +1 -0
- package/docs/design/templates/panel-header/page-heading-dark.svg +1 -0
- package/docs/design/templates/panel-header/page-heading.svg +1 -0
- package/docs/design/templates/panel-header/title-only-dark.svg +1 -0
- package/docs/design/templates/panel-header/title-only.svg +1 -0
- package/docs/design/templates/panel-header-dark.svg +13 -0
- package/docs/design/templates/panel-header.svg +13 -0
- package/docs/design/templates/segmented-control/equal-dark.svg +1 -0
- package/docs/design/templates/segmented-control/equal.svg +1 -0
- package/docs/design/templates/segmented-control/pill-small-dark.svg +1 -0
- package/docs/design/templates/segmented-control/pill-small.svg +1 -0
- package/docs/design/templates/segmented-control-dark.svg +7 -0
- package/docs/design/templates/segmented-control.svg +7 -0
- package/docs/design/templates/skeleton/avatar-dark.svg +1 -0
- package/docs/design/templates/skeleton/avatar.svg +1 -0
- package/docs/design/templates/skeleton/block-dark.svg +1 -0
- package/docs/design/templates/skeleton/block.svg +1 -0
- package/docs/design/templates/skeleton/lines-dark.svg +1 -0
- package/docs/design/templates/skeleton/lines.svg +1 -0
- package/docs/design/templates/skeleton-dark.svg +9 -0
- package/docs/design/templates/skeleton.svg +9 -0
- package/docs/design/templates/state-banner/danger-dark.svg +1 -0
- package/docs/design/templates/state-banner/danger.svg +1 -0
- package/docs/design/templates/state-banner/info-dark.svg +1 -0
- package/docs/design/templates/state-banner/info.svg +1 -0
- package/docs/design/templates/state-banner/success-dark.svg +1 -0
- package/docs/design/templates/state-banner/success.svg +1 -0
- package/docs/design/templates/state-banner/warning-dark.svg +1 -0
- package/docs/design/templates/state-banner/warning.svg +1 -0
- package/docs/design/templates/state-banner-dark.svg +11 -0
- package/docs/design/templates/state-banner.svg +11 -0
- package/docs/design/templates/tab-bar/workspace-tabs-dark.svg +1 -0
- package/docs/design/templates/tab-bar/workspace-tabs.svg +1 -0
- package/docs/design/templates/tab-bar-dark.svg +5 -0
- package/docs/design/templates/tab-bar.svg +5 -0
- package/docs/design/templates/token-search-field/empty-dark.svg +1 -0
- package/docs/design/templates/token-search-field/empty.svg +1 -0
- package/docs/design/templates/token-search-field/tokens-dark.svg +1 -0
- package/docs/design/templates/token-search-field/tokens.svg +1 -0
- package/docs/design/templates/token-search-field-dark.svg +7 -0
- package/docs/design/templates/token-search-field.svg +7 -0
- package/docs/design/templates/toolbar/title-and-actions-dark.svg +1 -0
- package/docs/design/templates/toolbar/title-and-actions.svg +1 -0
- package/docs/design/templates/toolbar-control-group/borderless-single-dark.svg +1 -0
- package/docs/design/templates/toolbar-control-group/borderless-single.svg +1 -0
- package/docs/design/templates/toolbar-control-group/icon-buttons-dark.svg +1 -0
- package/docs/design/templates/toolbar-control-group/icon-buttons.svg +1 -0
- package/docs/design/templates/toolbar-control-group/push-buttons-dark.svg +1 -0
- package/docs/design/templates/toolbar-control-group/push-buttons.svg +1 -0
- package/docs/design/templates/toolbar-control-group/with-text-dark.svg +1 -0
- package/docs/design/templates/toolbar-control-group/with-text.svg +1 -0
- package/docs/design/templates/toolbar-control-group-dark.svg +11 -0
- package/docs/design/templates/toolbar-control-group.svg +11 -0
- package/docs/design/templates/toolbar-dark.svg +5 -0
- package/docs/design/templates/toolbar-text/default-dark.svg +1 -0
- package/docs/design/templates/toolbar-text/default.svg +1 -0
- package/docs/design/templates/toolbar-text/large-dark.svg +1 -0
- package/docs/design/templates/toolbar-text/large.svg +1 -0
- package/docs/design/templates/toolbar-text/small-dark.svg +1 -0
- package/docs/design/templates/toolbar-text/small.svg +1 -0
- package/docs/design/templates/toolbar-text-dark.svg +9 -0
- package/docs/design/templates/toolbar-text.svg +9 -0
- package/docs/design/templates/toolbar.svg +5 -0
- package/docs/design/templates/value-table/details-dark.svg +1 -0
- package/docs/design/templates/value-table/details.svg +1 -0
- package/docs/design/templates/value-table-dark.svg +5 -0
- package/docs/design/templates/value-table.svg +5 -0
- package/docs/design/templates.md +114 -0
- package/docs/design-philosophy.md +61 -1
- package/docs/device-class.md +54 -0
- package/docs/examples/command-palette-adapter.tsx +70 -0
- package/docs/layout.md +131 -0
- package/docs/nav-stack.md +47 -0
- package/docs/recipes.md +167 -0
- package/docs/split-view.md +49 -0
- package/docs/tab-scaffold.md +41 -0
- package/docs/ux-demo.md +23 -9
- package/docs/webawesome-theme.md +15 -0
- package/docs/workbench.md +47 -0
- package/llms.txt +123 -14
- package/package.json +147 -44
- package/ux-demo/recipes/app-shell.tsx +32 -0
- package/ux-demo/recipes/collapsible-sidebar.tsx +100 -0
- package/ux-demo/recipes/compact-toolbar.tsx +43 -0
- package/ux-demo/recipes/composer-form.tsx +63 -0
- package/ux-demo/recipes/list-detail-dialog.tsx +45 -0
- package/ux-demo/recipes/list-workspace-states.tsx +26 -0
- package/ux-demo/recipes/loaders.ts +33 -0
- package/ux-demo/recipes/loading-inspector.tsx +81 -0
- package/ux-demo/recipes/mount-recipe.ts +43 -0
- package/ux-demo/recipes/navigation-sidebar.tsx +26 -0
- package/ux-demo/recipes/navigation-stack.tsx +76 -0
- package/ux-demo/recipes/recipes.css +448 -0
- package/ux-demo/recipes/types.ts +17 -0
- package/ux-demo/recipes/workspace-header.tsx +12 -0
- package/dist/browser/dialog-header.js +0 -3
- package/dist/browser/menu-header.js +0 -3
- package/dist/browser/menu-item.js +0 -3
- package/dist/browser/page-header.js +0 -3
- package/dist/chunk-2PES33HS.js +0 -13
- package/dist/chunk-2PES33HS.js.map +0 -1
- package/dist/chunk-3O7ZEUW2.js.map +0 -1
- package/dist/chunk-723YNJBH.js +0 -17
- package/dist/chunk-723YNJBH.js.map +0 -1
- package/dist/chunk-GY5WH7TO.js +0 -10
- package/dist/chunk-GY5WH7TO.js.map +0 -1
- package/dist/chunk-MBR3TYNL.js.map +0 -1
- package/dist/chunk-MFKMHK5W.js.map +0 -1
- package/dist/chunk-MQIZAD4A.js.map +0 -1
- package/dist/chunk-NHXX4JI5.js +0 -28
- package/dist/chunk-NHXX4JI5.js.map +0 -1
- package/dist/chunk-OPCJRCYO.js +0 -19
- package/dist/chunk-OPCJRCYO.js.map +0 -1
- package/dist/chunk-T5XNMVOI.js +0 -24
- package/dist/chunk-T5XNMVOI.js.map +0 -1
- package/dist/chunk-TRNBHPNW.js.map +0 -1
- package/dist/chunk-VHW5YNIB.js +0 -17
- package/dist/chunk-VHW5YNIB.js.map +0 -1
- package/dist/chunk-VKH2JLDZ.js +0 -10
- package/dist/chunk-VKH2JLDZ.js.map +0 -1
- package/dist/chunk-WY4CAEPG.js +0 -14
- package/dist/chunk-WY4CAEPG.js.map +0 -1
- package/dist/dialog-header.d.ts +0 -14
- package/dist/dialog-header.js +0 -3
- package/dist/dialog-header.js.map +0 -1
- package/dist/menu-header.d.ts +0 -15
- package/dist/menu-header.js +0 -3
- package/dist/menu-header.js.map +0 -1
- package/dist/menu-item.d.ts +0 -22
- package/dist/menu-item.js +0 -3
- package/dist/menu-item.js.map +0 -1
- package/dist/page-header.d.ts +0 -9
- package/dist/page-header.js +0 -3
- package/dist/page-header.js.map +0 -1
- package/src/app-tab.css +0 -20
- package/src/dialog-header.css +0 -9
- package/src/empty-state.css +0 -6
- package/src/foundation.css +0 -106
- package/src/loading-spinner.css +0 -4
- package/src/lucide-icon.css +0 -1
- package/src/menu-header.css +0 -13
- package/src/menu-item.css +0 -12
- package/src/page-header.css +0 -3
- package/src/resizable-region.css +0 -19
- package/src/select.css +0 -18
- package/src/state-banner.css +0 -31
- package/src/styles.css +0 -18
- package/src/tab-bar.css +0 -4
- package/src/toolbar-control-group.css +0 -25
- package/src/toolbar-text.css +0 -4
- package/src/toolbar.css +0 -9
- package/src/value-table.css +0 -5
package/docs/ux-demo.md
CHANGED
|
@@ -1,18 +1,32 @@
|
|
|
1
1
|
# UX catalog contract
|
|
2
2
|
|
|
3
|
-
Run `npm run dev` from `ui/`. The catalog is a development and review surface, not a second implementation.
|
|
3
|
+
Run `npm run dev` from `ui/`. The catalog is a development and review surface, not a second implementation. The development server allows repo-owned assets used by the catalog, and its production bundle uses relative asset URLs so the complete catalog remains intact below preview and proxy paths.
|
|
4
|
+
|
|
5
|
+
Seven lazy production-composition routes live under the `Recipes` category.
|
|
6
|
+
Each `?component=recipe-*` route uses public package primitives, real wiring,
|
|
7
|
+
deterministic state, and semantic layout owners from the [recipe guide](./recipes.md).
|
|
4
8
|
|
|
5
9
|
- It imports public component subpaths, exercising their browser-selected reachable CSS rather than a catalog-only style path.
|
|
10
|
+
- The `ListActionRow` route demonstrates sibling primary/trailing native controls, independent disabled states, controlled selection, first-line leading-icon alignment for wrapped labels, and an application-owned native popover relationship without nesting controls. The `ListItem` route demonstrates the same multiline leading-icon anchor alongside its single-control navigation contract.
|
|
11
|
+
- The `AppTab` route demonstrates a runtime-filtered domain metadata slot and a decorative replacement close icon without changing TabBar selection, close, reorder, or focus ownership. The `ResizableRegion` route likewise replaces only the decorative handle glyph while retaining separator semantics and shared wiring.
|
|
6
12
|
- Every first-party visual component and every free Web Awesome 3.12 component has its own stable `?component=<id>` URL and focused demo. Composite header, menu, feedback, and theme scenarios remain addressable alongside their subcomponents; the root opens the first Kerf component.
|
|
7
|
-
-
|
|
8
|
-
-
|
|
9
|
-
-
|
|
13
|
+
- `ai/component-catalog.json` is the canonical catalog metadata. A deterministic checked-in projection supplies the demo's unique id, category, kind (`component`, `composition`, or `recipe`), source (`kerf` or `webawesome`), name, description, direct `uses` dependencies, existing documentation path, and demo-source path; first-party, recipe, and Web Awesome renderer maps are exhaustively typed against its generated id unions. Demo paths resolve to `ui/ux-demo/main.tsx`, the matching `ui/ux-demo/recipes/*.tsx` file, or `ui/ux-demo/webawesome-demos.tsx` according to the canonical entry. First-party component entries additionally derive `ui/src/<browser-subpath>.tsx` from their canonical `delivery.browserImport`.
|
|
14
|
+
- Every detail footer groups compact `Demo source` and `Guidance` actions; first-party component details also expose `Component source`. Web Awesome details say `Integration guidance` to distinguish the local integration contract from the upstream component implementation. Each button retains its repository-relative path in the DOM for verification and uses a deploy-safe absolute GitHub blob URL with a contextual new-tab name; the demo does not depend on a local source server or add a package runtime export. At phone widths, the resource group and related-component selector stack as full-width rows, with any resource overflow contained locally so labels cannot overlap the selector or widen the document.
|
|
15
|
+
- The master/detail shell groups first-party routes by category with production `ListHeader` and `ListItem` components. The 70 ecosystem components live in a separate `Web Awesome` disclosure with seven subgroups, so they remain discoverable without being presented as first-class `@kerfjs/ui` exports. Direct Web Awesome routes open the disclosure and reveal the selected row at wide sizes; narrow layouts keep the expanded list in document flow rather than introducing a competing nested scroller.
|
|
16
|
+
- The shell itself uses `@kerfjs/ui/layout.css`: sidebars, details, previews, dialogs, and resize specimens share unpadded panes plus self-contained content items. Its sidebar identity uses the Kerf logo beside a vertically centered title, with the subtitle in its own aligned row like `PanelHeader`; the current-view heading is also a toolbar. Collapsing the catalog removes the pane completely and moves its restore action to the main toolbar's leading edge instead of leaving an icon-only rail. The selected view description remains inset below the page toolbar. The checkerboard belongs to the complete scrollable preview region rather than a nested card. A lightly separated footer keeps live status above compact source, guidance, and relationship groups. The focused `ResizableRegion` specimen stretches its surface through the available stage height and reports committed width in that shared status footer; narrow layouts retain local horizontal access when the pane is resized wider than the stage, and the split remains readable at 200% root scaling. Geometry coverage checks wide, intermediate, narrow, and 200% zoom layouts.
|
|
17
|
+
- The composer-form recipe demonstrates one coherent visible form surface with `PanelHeader` title/summary hierarchy, fields and actions on the shared 8px control gutter, and 24px major rhythm. Its conditional error or success `StateBanner` is the only nested semantic surface. Reset synchronizes the upgraded Web Awesome fields' live value properties with their empty controlled attributes and announces `Draft reset`; browser coverage preserves behavior and verifies wide, narrow, dark, validation, success, reset, 200% zoom, and forced-colors states.
|
|
18
|
+
- The list-detail dialog recipe places its header directly on the dialog edge while preserving the header's internal inset, gives the selected project title the complete outer-plus-inner content gutter, lets the value table fill the available detail column between the shared outer margins, and keeps record actions on one outer gutter without an extra content-item inset. Browser geometry coverage protects those relationships at wide and narrow widths.
|
|
19
|
+
- Catalog-only brand marks, preview dimensions, checkerboard tiles, and the compound display-settings control retain local geometry because they are specimen chrome or intrinsic control anatomy rather than reusable application spacing roles.
|
|
20
|
+
- The menu composition route demonstrates toolbar/content/footer anatomy, 24px major gaps, 8/1/8 child geometry, the full-width `ListHeader` count-or-badge/action split, logical-end 44px action targets with 18px visuals, and 44px row/header/toolbar targets. Its one chevron is a production 18px `DisclosureArrow` inside a controlled Tools header that actually reveals and hides content; ordinary Projects navigation has no false disclosure affordance. Browser assertions cover stable naming, expanded/content transitions, visual rotation, node identity, reduced motion, RTL alignment and containment, and wide, narrow, dark, and 200% layouts. The focused ListHeader route separately shows the shared neutral count pill for Attachments, Notes (including zero), and Duplicates plus a non-count legacy badge, full-width logical-end actions, and no disclosure without content.
|
|
21
|
+
- The `DisclosureArrow` route renders the production 18px root-scaled default without a catalog-only size override. Its two native buttons independently control the default right-to-down chevron and a recognizable right-facing replacement arrow with left-to-up custom directions; both use shortest-path rotation and their names stay stable while `aria-expanded` communicates state. Browser coverage verifies the custom clockwise path, pointer and native keyboard activation, focus, narrow and 200%-zoom stacking with contained labels, consumer sizing, and the independent `.5` Web Awesome glyph scale retained by Kerf `Select`.
|
|
22
|
+
- A detail with relationships renders one grouped footer selector: `Uses` links to direct dependencies and `Used by` links to reverse dependents. Choosing either navigates to that component's demo. The relationship group is absent when both sets are empty; no duplicate summary is rendered.
|
|
10
23
|
- Demo-only CSS supplies only the catalog shell and stages; component appearance stays in package CSS. Decorative chrome and Web Awesome controls share the same semantic system palette instead of carrying a separate demo identity.
|
|
11
|
-
- Scenarios use deterministic data and cover real variants, long content, disabled state, selection, progress, feedback, overlays, media, helpers, and stateful interactions. The Web Awesome theme route remains the broad system view, while individual action, form, layout, navigation, feedback, media, and helper routes provide focused specimens; the Animation route exposes preset, easing, duration, playback-rate, and transport controls with live lifecycle status; observer routes provide user-driven intersection, mutation, and resize events with live results; ToolbarControlGroup exposes all eight Hot Sheet 2 variants; SegmentedControl covers toolbar, rounded-rectangle, pill, equal-width, and disabled presentations; StateBanner exposes every built-in tone plus a scoped override; TabBar demonstrates overflow, edge autoscroll, and controlled pointer/keyboard reordering.
|
|
12
|
-
-
|
|
13
|
-
- The action
|
|
24
|
+
- Scenarios use deterministic data and cover real variants, long content, disabled state, selection, progress, feedback, overlays, media, helpers, and stateful interactions. The Web Awesome theme route remains the broad system view, while individual action, form, layout, navigation, feedback, media, and helper routes provide focused specimens; ListItem and ListHeader demonstrate typed domain metadata, protected native button/disclosure semantics, and a native popover trigger relationship without product props; PanelHeader demonstrates its plain top-toolbar identity, extra-large title, optional subtitle row, and bordered brand-filled icon group; the Select route verifies that option icons survive unrelated Kerf rerenders and selected slot content follows value changes; the Animation route exposes preset, easing, duration, playback-rate, and transport controls with live lifecycle status; observer routes provide user-driven intersection, mutation, and resize events with live results; ToolbarControlGroup exposes all eight Hot Sheet 2 variants, loads the Web Awesome registrations needed by its popup specimen, and preserves the upgraded dropdown's managed light-DOM children across Kerf rerenders; the Toolbar route composes a collapsible TokenSearchField inside a group, animates between the empty iconic and complete field states, stays open while populated, and focuses the revealed editor; SegmentedControl covers toolbar, rounded-rectangle, pill, equal-width, and disabled presentations; TokenSearchField covers editable ordered chips, pointer and keyboard removal, caret-preserving controlled deletion, editing, clearing, free text, disabled state, and fixed first-line alignment while content wraps; StateBanner exposes every built-in tone plus a scoped override; TabBar demonstrates overflow, edge autoscroll, and controlled pointer/keyboard reordering.
|
|
25
|
+
- Recipe ownership notes are hidden by default. A page-toolbar toggle reveals them as floating warning-toned notes with a folded corner, keeping instructional copy visually distinct and removable from the specimen flow.
|
|
26
|
+
- Settings exercise light/dark, increased contrast, and reduced motion without changing component code. The theme action starts from the operating system's effective color scheme, always names the appearance it will switch to, and installs an explicit light or dark override when activated; contrast and reduced motion expose their independent preferences through `aria-pressed`.
|
|
27
|
+
- The footer action log is an `aria-live` region, making interactions visible to both people and browser tests.
|
|
14
28
|
- The focused Toast route calls Web Awesome's documented programmatic stack API and notes that Hot Sheet 2 still uses its own app-level toast implementation; the catalog demonstrates ecosystem support without implying current product adoption.
|
|
15
|
-
- Browser coverage walks every Kerf, composition, and Web Awesome route, checks every listed Web Awesome custom element is registered in its focused specimen, exercises the ecosystem disclosure and both relationship directions, and covers tab selection/reordering/overflow, semantic palettes and scoped overrides, light/dark rendering, toolbar popup behavior, menu alignment, banner urgency, keyboard resizing, live custom-element values, and representative wide/narrow captures.
|
|
16
|
-
- The production build keeps the catalog shell and Kerf routes in the entry chunk, then dynamically imports the complete Web Awesome specimen and registration surface when an ecosystem route
|
|
29
|
+
- Browser coverage walks every Kerf, composition, and Web Awesome route, checks every listed Web Awesome custom element is registered in its focused specimen, exercises the ecosystem disclosure and both relationship directions, validates offline source/guidance hrefs and accessible wide/narrow/200%-zoom wrapping, and covers tab selection/reordering/overflow, semantic palettes and scoped overrides, light/dark rendering, toolbar popup and responsive find behavior, single/multiline search alignment, menu alignment, banner urgency, keyboard resizing, live custom-element values, and representative wide/narrow captures.
|
|
30
|
+
- The production build keeps the catalog shell and Kerf routes in the entry chunk, then dynamically imports the complete Web Awesome specimen and registration surface when an ecosystem route, the broad Web Awesome theme route, or the ToolbarControlGroup popup specimen is selected. Directly addressed routes pass through the same loader.
|
|
17
31
|
|
|
18
32
|
Before handoff, inspect the actual captures for readability, context, alignment, clipping, spacing, responsiveness, focus, and obvious defects. Fix and recapture rather than treating the screenshot as proof by itself.
|
package/docs/webawesome-theme.md
CHANGED
|
@@ -4,11 +4,18 @@
|
|
|
4
4
|
free components and the Kerf/Hot Sheet 2 design system.
|
|
5
5
|
|
|
6
6
|
```ts
|
|
7
|
+
import type {} from '@kerfjs/ui/webawesome';
|
|
7
8
|
import '@kerfjs/ui/webawesome.css';
|
|
8
9
|
import '@awesome.me/webawesome/dist/components/button/button.js';
|
|
9
10
|
import '@awesome.me/webawesome/dist/components/input/input.js';
|
|
10
11
|
```
|
|
11
12
|
|
|
13
|
+
The type-only package import augments `kerfjs/jsx-runtime` with the 70
|
|
14
|
+
catalog-supported `wa-*` elements. It has no runtime side effects. The catalog
|
|
15
|
+
gate keeps the declaration tags aligned with Web Awesome's installed custom
|
|
16
|
+
elements manifest, while individual component imports remain the only
|
|
17
|
+
registration boundary.
|
|
18
|
+
|
|
12
19
|
The CSS entry includes Web Awesome's native, utility, palette, and default-theme
|
|
13
20
|
styles, then overrides the public semantic contract in
|
|
14
21
|
`@layer wa-theme-overrides`. It does not import or register component
|
|
@@ -53,6 +60,11 @@ chevrons keep the same visual weight. The Accordion and Details components
|
|
|
53
60
|
retain their own rotation behavior because scaling uses `transform` while
|
|
54
61
|
their open state uses the independent `rotate` property.
|
|
55
62
|
|
|
63
|
+
That scale applies to each Web Awesome component's intrinsic glyph and is
|
|
64
|
+
independent of Kerf `DisclosureArrow`, whose default box is 18px relative to
|
|
65
|
+
the root font size and whose consumer override is
|
|
66
|
+
`--kui-disclosure-arrow-size`.
|
|
67
|
+
|
|
56
68
|
Tooltip and Popover use arrowless floating surfaces by default, matching Hot
|
|
57
69
|
Sheet 2. The theme sets Web Awesome's public `--wa-tooltip-arrow-size` token to
|
|
58
70
|
`0px` and maps each popover's public `--arrow-size` property from
|
|
@@ -129,6 +141,9 @@ static content and labels that constraint next to the rendered output.
|
|
|
129
141
|
|
|
130
142
|
The catalog lists every free Web Awesome component so support can be inspected;
|
|
131
143
|
listing does not make each component the preferred Kerf application pattern.
|
|
144
|
+
The [need-first decision matrix](./component-selection.md#web-awesome-overlap-policy)
|
|
145
|
+
is the exhaustive Kerf/Web Awesome overlap index; the rules below explain the
|
|
146
|
+
highest-risk choices.
|
|
132
147
|
|
|
133
148
|
- Consider `wa-popup` for low-level anchored positioning when its flip, shift,
|
|
134
149
|
or placement behavior avoids custom positioning code. Prefer the higher-level
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# Workbench
|
|
2
|
+
|
|
3
|
+
`@kerfjs/ui/workbench` is the Xcode-like multi-panel workspace: a collapsible
|
|
4
|
+
left rail, right rail, and bottom drawer around a central work area (any absent).
|
|
5
|
+
It generalizes the instant-width / sliding-content collapse used by the catalog
|
|
6
|
+
sidebar. One of the opt-in app layouts (see
|
|
7
|
+
[`../../docs/23-app-layouts.md`](../../docs/23-app-layouts.md)); best on
|
|
8
|
+
desktop-class devices.
|
|
9
|
+
|
|
10
|
+
```ts
|
|
11
|
+
import { Workbench } from '@kerfjs/ui/workbench';
|
|
12
|
+
import '@kerfjs/ui/workbench.css';
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## State lives in the app
|
|
16
|
+
|
|
17
|
+
`Workbench` is declarative and the collapse is **pure CSS** — no wire. The app
|
|
18
|
+
owns each panel's `collapsed` flag (usually a signal) and toggles it; the panel
|
|
19
|
+
animates itself.
|
|
20
|
+
|
|
21
|
+
```tsx
|
|
22
|
+
const navCollapsed = signal(false);
|
|
23
|
+
|
|
24
|
+
<Workbench
|
|
25
|
+
id="studio"
|
|
26
|
+
label="Studio"
|
|
27
|
+
main={<Editor />}
|
|
28
|
+
leftRail={{ content: <Navigator />, label: 'Navigator', collapsed: navCollapsed.value, size: 280 }}
|
|
29
|
+
rightRail={{ content: <Inspector />, label: 'Inspector', collapsed: inspectorCollapsed.value }}
|
|
30
|
+
bottomDrawer={{ content: <Console />, label: 'Console', collapsed: consoleCollapsed.value }}
|
|
31
|
+
/>;
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Each `WorkbenchPanel` takes `content`, an optional `collapsed`, an optional
|
|
35
|
+
`size` (rail width or drawer height in px, overriding the CSS default —
|
|
36
|
+
`--kui-workbench-rail-width` 280px, `--kui-workbench-drawer-height` 220px), and
|
|
37
|
+
an optional `label`.
|
|
38
|
+
|
|
39
|
+
## How the collapse animates
|
|
40
|
+
|
|
41
|
+
Collapsing snaps the panel's flex track to zero in a single reflow (so the work
|
|
42
|
+
area relayouts once, not per frame) while the panel's fixed-size content slides
|
|
43
|
+
out via a composited `transform` — a rail slides horizontally, the drawer
|
|
44
|
+
vertically — clipped by the shell's overflow. It honors `prefers-reduced-motion`
|
|
45
|
+
(the slide collapses to instant). On smaller device classes, present the rails'
|
|
46
|
+
contents through a `NavStack` or overlay drawers rather than shrinking the
|
|
47
|
+
three-panel shell.
|
package/llms.txt
CHANGED
|
@@ -1,22 +1,131 @@
|
|
|
1
1
|
# @kerfjs/ui
|
|
2
2
|
|
|
3
|
-
Accessible, production-backed UI primitives for kerf
|
|
3
|
+
> Accessible, production-backed UI primitives for [kerf](https://github.com/brianwestphal/kerf)
|
|
4
|
+
> applications. Components are plain functions returning `SafeHtml`; the app owns
|
|
5
|
+
> state and wires stable `data-action` hooks once. This file orients an LLM to
|
|
6
|
+
> generate correct, good-looking kerf UI — it is not a catalog to browse.
|
|
4
7
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
- [Web Awesome theme contract](./docs/webawesome-theme.md)
|
|
9
|
-
- [Accessibility and keyboard contracts](./docs/accessibility.md)
|
|
10
|
-
- [Design philosophy](./docs/design-philosophy.md)
|
|
11
|
-
- [Apple HIG translation](./docs/apple-hig.md)
|
|
12
|
-
- [UX catalog](./docs/ux-demo.md)
|
|
8
|
+
```bash
|
|
9
|
+
npm install kerfjs @kerfjs/ui # kerfjs is a peer; Web Awesome is an optional peer
|
|
10
|
+
```
|
|
13
11
|
|
|
14
|
-
|
|
12
|
+
Import each component from its own subpath (`@kerfjs/ui/list-item`, `@kerfjs/ui/toolbar`,
|
|
13
|
+
…); the browser build pulls that component's reachable CSS automatically, so do not
|
|
14
|
+
maintain a central style list. Configure JSX with `"jsxImportSource": "kerfjs"`.
|
|
15
15
|
|
|
16
|
-
|
|
16
|
+
## How to build a screen (retrieval order)
|
|
17
17
|
|
|
18
|
-
|
|
18
|
+
1. **Pick the component from the interface need**, not by appearance — read
|
|
19
|
+
[component-selection.md](./docs/component-selection.md) (the problem→component
|
|
20
|
+
matrix, with imports, wiring, ownership, and alternatives).
|
|
21
|
+
2. **Get exact signatures before emitting code** — read
|
|
22
|
+
[public-api-signatures-v1.md](./ai/public-api-signatures-v1.md) (real prop names,
|
|
23
|
+
callback shapes, disposer return types).
|
|
24
|
+
3. **For exhaustive, structured facts** (ids, exports, variants, `publicClasses`,
|
|
25
|
+
relationships, side effects) load the
|
|
26
|
+
[Machine-readable component catalog](./ai/component-catalog.json) — the
|
|
27
|
+
canonical checked-in source; its schema is alongside it.
|
|
28
|
+
4. **Apply the rules below and in** [skill.md](./ai/skill.md).
|
|
19
29
|
|
|
20
|
-
|
|
30
|
+
## Core rules (do the right thing)
|
|
21
31
|
|
|
22
|
-
|
|
32
|
+
- **Reach for the primitive, not for CSS.** The package is built to look right
|
|
33
|
+
*unstyled*. Before adding `padding`, `margin`, `width`, `height`, `border`,
|
|
34
|
+
`background`, a wrapper card, or a decoration, check whether the component, the
|
|
35
|
+
pane, or the content-item already owns it — it almost always does. Prefer a
|
|
36
|
+
component prop or a `--kui-*` token; write CSS only for genuinely new structure,
|
|
37
|
+
and then only join a component's documented `publicClasses` (never reach in by
|
|
38
|
+
tag/id/attribute or an unlisted class).
|
|
39
|
+
- **Never double-inset.** A `.kui-pane` has no padding; its `.kui-content` children
|
|
40
|
+
own the geometry (8px inline margin + 1px border + 8px padding). Do not add a
|
|
41
|
+
container padding on top of a content-item's own margin — pick one owner. Use
|
|
42
|
+
`.kui-content` for 24px major vertical rhythm.
|
|
43
|
+
- **Trust the defaults.** Render a control at its natural size and color (a
|
|
44
|
+
`LucideIcon` is 24px); if it looks wrong, fix the surrounding layout, not the
|
|
45
|
+
control. Never force a component's width/height to size it — that leaves a halo
|
|
46
|
+
or a stretched oval.
|
|
47
|
+
- **Toolbars hold only `ToolbarText` and `ToolbarControlGroup`.** Never put a bare
|
|
48
|
+
button, input, link, or loose markup in a `leading`/`center`/`trailing` zone.
|
|
49
|
+
Wrap every control — `SegmentedControl`, `Select`, a collapsible
|
|
50
|
+
`TokenSearchField`, Web Awesome controls — inside a `ToolbarControlGroup`. A
|
|
51
|
+
toolbar popup menu is a `single` `ToolbarControlGroup` around a `wa-dropdown`
|
|
52
|
+
(its `slot="trigger"` `wa-button` is the toolbar button, kept under
|
|
53
|
+
`data-morph-skip-children`).
|
|
54
|
+
- **`PanelHeader` is *the* panel/dialog/page heading.** A plain toolbar with an
|
|
55
|
+
optional bordered icon group, an extra-large `ToolbarText` title, the trailing
|
|
56
|
+
controls you pass, and an optional subtitle below — do not hand-build a heading
|
|
57
|
+
row or restyle a toolbar into one.
|
|
58
|
+
- **Space by the five-step scale, by relationship not by eye.** `0`
|
|
59
|
+
`--kui-space-none`, `4px` `--kui-space-2xs`, `8px` `--kui-space-xs` (inside a
|
|
60
|
+
group), `16px` `--kui-space-m`, `24px` `--kui-space-l` (between major differing
|
|
61
|
+
regions). 12px/32px are off-scale exceptions.
|
|
62
|
+
- **Panes share one child-owned geometry.** Sidebars, main areas, inspectors, and
|
|
63
|
+
dialogs all use an unpadded `.kui-pane` (optional `.kui-pane__toolbar`, one
|
|
64
|
+
scrolling `.kui-pane__content`, optional `.kui-pane__footer`). A visible pane owns
|
|
65
|
+
its collapse control; a hidden pane's restore moves to the adjacent main
|
|
66
|
+
toolbar's matching edge — no icon-only rail. Keep one scroll owner per region.
|
|
67
|
+
- **State and behavior live in the app.** Components take semantic `data-action`
|
|
68
|
+
strings and controlled values; wire them once with `delegate()`/`delegateActions()`
|
|
69
|
+
or the disposer-returning `wire…` helpers, and own domain copy, transport, and
|
|
70
|
+
policy in a thin adapter. Every element must earn its place — cut chrome, labels,
|
|
71
|
+
and readouts that do not help a person decide or act.
|
|
72
|
+
- **App state is domain/persisted; helpers own only ephemeral mechanics.** Keep
|
|
73
|
+
navigation stacks, tab selection and order, pane sizes, and `collapsed`/`expanded`
|
|
74
|
+
disclosure flags in the app — they are data or persisted layout, and the app reads
|
|
75
|
+
them to render. The `wire…` helpers own the *ephemeral* parts: `wireNavStack` the
|
|
76
|
+
push/pop animation, `wireTabBars` the overflow autoscroll and drag preview,
|
|
77
|
+
`wireResizableRegions` the live drag preview; they report committed changes via
|
|
78
|
+
callbacks. The one richer case is `wireTokenSearchFields`, which manages the
|
|
79
|
+
collapsible field's expand/collapse/focus by default (on, per-behavior opt-out) and
|
|
80
|
+
exposes the `expanded` signal on its handle — bind it in render or hand in your own
|
|
81
|
+
via `collapsible.signals`. Do not hand-roll open/collapse/focus that helper
|
|
82
|
+
provides; but do keep a plain disclosure toggle (a one-line boolean the app already
|
|
83
|
+
renders from) in the app. For real-app composition it also offers a focusout
|
|
84
|
+
keep-open exception (`data-token-search-keep-open` regions or `collapsible.keepOpenOn`,
|
|
85
|
+
so a sibling suggestions/date popover does not collapse an empty field), opt-in
|
|
86
|
+
atomic-chip keyboard (`keyboard`: Backspace/Delete remove the adjacent chip via
|
|
87
|
+
`onRemoveToken`, ArrowRight moves the caret past a trailing chip), and an
|
|
88
|
+
`onEdit({id, editor, event})` input callback (the `InputEvent` lets you gate on `inputType`/`data`) — so the app can drop its own keydown/input
|
|
89
|
+
boilerplate while still owning parsing and controlled token state.
|
|
90
|
+
- **Placeholder loading state, don't rebuild it.** For a value or component that is
|
|
91
|
+
still loading, set `placeholder` on the component (`Select`, `ListHeader`,
|
|
92
|
+
`ListItem`, `ValueTableRow`, `PanelHeader`, `SegmentedControl`, `StateBanner`,
|
|
93
|
+
`AppTab`, `ToolbarText`, `ListActionRow`): it renders its real chrome with value
|
|
94
|
+
slots as subtle **unanimated** skeleton blocks and interactivity disabled, so a
|
|
95
|
+
parent composes a faithful loading view (e.g. an inspector) without hand-rebuilding
|
|
96
|
+
markup. Use the standalone `Skeleton` for a custom slot. Prefer it over `wa-skeleton`
|
|
97
|
+
(the pure-Kerf primitives avoid Web Awesome), and never animate it — use
|
|
98
|
+
`LoadingSpinner` for known busy activity instead.
|
|
99
|
+
|
|
100
|
+
## Public exports
|
|
101
|
+
|
|
102
|
+
`LucideIcon`, `DisclosureArrow`, `Toolbar`, `ToolbarControlGroup`, `FloatingToolbar`, `ToolbarText`,
|
|
103
|
+
`PanelHeader`, `ListItem`, `ListActionRow`, `ListHeader`, `SegmentedControl`,
|
|
104
|
+
`Select`, `TokenSearchField` (+ `readTokenSearchField`, `placeTokenSearchCaret`,
|
|
105
|
+
`wireTokenSearchFields`), `AppTab`, `TabBar` (+ `wireTabBars`, `reorderTabs`),
|
|
106
|
+
`ResizableRegion` (+ `wireResizableRegions`), `StateBanner`, `EmptyState`,
|
|
107
|
+
`LoadingSpinner`, `Skeleton`, `ValueTable`, `ValueTableRow`. Whole-screen layouts (opt-in,
|
|
108
|
+
tree-shakeable, declarative with `wire…` helpers, each with a companion CSS import):
|
|
109
|
+
`NavStack`, `SplitView`, `Workbench`, `TabScaffold`, driven by `deviceClass()` from
|
|
110
|
+
`@kerfjs/ui/device-class`. For a standalone collapsible rail/drawer outside a full
|
|
111
|
+
shell, `@kerfjs/ui/collapsible-panel` (`CollapsiblePanel`, `CollapsiblePanelToggle`)
|
|
112
|
+
+ `@kerfjs/ui/wire-sidebar` (`wireSidebar`: toggle, focus, compact overlay, persistence).
|
|
113
|
+
`@kerfjs/ui/catalog` is another opt-in shell — a
|
|
114
|
+
`Catalog` component + `wireCatalog` helper for building a component-gallery catalog
|
|
115
|
+
(collapsible category sidebar + preview stage + resources footer) from your own
|
|
116
|
+
entries; controlled/stateless like the layouts. `@kerfjs/ui/webawesome` is a
|
|
117
|
+
type-only boundary for `wa-*` JSX; `@kerfjs/ui/select/register` and the CSS are the
|
|
118
|
+
declared side effects.
|
|
119
|
+
|
|
120
|
+
## Reference
|
|
121
|
+
|
|
122
|
+
- [skill.md](./ai/skill.md): the full rule set + a common-mistakes table (the shipped AI skill).
|
|
123
|
+
- [design-philosophy.md](./docs/design-philosophy.md): why kerf UI is shaped this way — the decision principles behind the rules above.
|
|
124
|
+
- [layout.md](./docs/layout.md): the pane/content-item geometry, public roles/tokens, and the spacing scale.
|
|
125
|
+
- [component-contract.md](./docs/component-contract.md): what a component owns vs. what the app owns.
|
|
126
|
+
- [accessibility.md](./docs/accessibility.md): keyboard and ARIA contracts per component.
|
|
127
|
+
- [recipes.md](./docs/recipes.md): production compositions (app shell, list-detail dialog, composer form, …) as copyable references.
|
|
128
|
+
- [app-layouts.md](./docs/app-layouts.md): choosing `NavStack`/`SplitView`/`Workbench`/`TabScaffold` by data + interaction + device, and dialog presentation.
|
|
129
|
+
- [webawesome-theme.md](./docs/webawesome-theme.md): the optional Web Awesome theme; catalog coverage means themed-and-supported, not preferred (prefer the Kerf primitive when one exists).
|
|
130
|
+
- [component-catalog.json](./ai/component-catalog.json) + [public-api-signatures-v1.md](./ai/public-api-signatures-v1.md) + [webawesome-jsx-signatures-v1.md](./ai/webawesome-jsx-signatures-v1.md): machine-readable facts and exact signatures.
|
|
131
|
+
- [README.md](./README.md): package overview and the component subpath table.
|
package/package.json
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kerfjs/ui",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "5.0.0-beta.11",
|
|
4
4
|
"description": "Accessible, composable UI primitives for kerf applications.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"author": "Brian Westphal <brian.westphal@bleugris.com>",
|
|
8
|
-
"homepage": "https://brianwestphal.github.io/kerf/docs/
|
|
8
|
+
"homepage": "https://brianwestphal.github.io/kerf/docs/component-packages/",
|
|
9
9
|
"repository": {
|
|
10
10
|
"type": "git",
|
|
11
11
|
"url": "https://github.com/brianwestphal/kerf",
|
|
@@ -44,6 +44,11 @@
|
|
|
44
44
|
"browser": "./dist/browser/lucide-icon.js",
|
|
45
45
|
"import": "./dist/lucide-icon.js"
|
|
46
46
|
},
|
|
47
|
+
"./disclosure-arrow": {
|
|
48
|
+
"types": "./dist/disclosure-arrow.d.ts",
|
|
49
|
+
"browser": "./dist/browser/disclosure-arrow.js",
|
|
50
|
+
"import": "./dist/disclosure-arrow.js"
|
|
51
|
+
},
|
|
47
52
|
"./toolbar": {
|
|
48
53
|
"types": "./dist/toolbar.d.ts",
|
|
49
54
|
"browser": "./dist/browser/toolbar.js",
|
|
@@ -54,20 +59,30 @@
|
|
|
54
59
|
"browser": "./dist/browser/toolbar-control-group.js",
|
|
55
60
|
"import": "./dist/toolbar-control-group.js"
|
|
56
61
|
},
|
|
62
|
+
"./floating-toolbar": {
|
|
63
|
+
"types": "./dist/floating-toolbar.d.ts",
|
|
64
|
+
"browser": "./dist/browser/floating-toolbar.js",
|
|
65
|
+
"import": "./dist/floating-toolbar.js"
|
|
66
|
+
},
|
|
57
67
|
"./toolbar-text": {
|
|
58
68
|
"types": "./dist/toolbar-text.d.ts",
|
|
59
69
|
"browser": "./dist/browser/toolbar-text.js",
|
|
60
70
|
"import": "./dist/toolbar-text.js"
|
|
61
71
|
},
|
|
62
|
-
"./
|
|
63
|
-
"types": "./dist/
|
|
64
|
-
"browser": "./dist/browser/
|
|
65
|
-
"import": "./dist/
|
|
72
|
+
"./list-action-row": {
|
|
73
|
+
"types": "./dist/list-action-row.d.ts",
|
|
74
|
+
"browser": "./dist/browser/list-action-row.js",
|
|
75
|
+
"import": "./dist/list-action-row.js"
|
|
76
|
+
},
|
|
77
|
+
"./list-item": {
|
|
78
|
+
"types": "./dist/list-item.d.ts",
|
|
79
|
+
"browser": "./dist/browser/list-item.js",
|
|
80
|
+
"import": "./dist/list-item.js"
|
|
66
81
|
},
|
|
67
|
-
"./
|
|
68
|
-
"types": "./dist/
|
|
69
|
-
"browser": "./dist/browser/
|
|
70
|
-
"import": "./dist/
|
|
82
|
+
"./list-header": {
|
|
83
|
+
"types": "./dist/list-header.d.ts",
|
|
84
|
+
"browser": "./dist/browser/list-header.js",
|
|
85
|
+
"import": "./dist/list-header.js"
|
|
71
86
|
},
|
|
72
87
|
"./resizable-region": {
|
|
73
88
|
"types": "./dist/resizable-region.d.ts",
|
|
@@ -78,11 +93,23 @@
|
|
|
78
93
|
"types": "./dist/wire-resizable-regions.d.ts",
|
|
79
94
|
"import": "./dist/wire-resizable-regions.js"
|
|
80
95
|
},
|
|
96
|
+
"./device-class": {
|
|
97
|
+
"types": "./dist/device-class.d.ts",
|
|
98
|
+
"import": "./dist/device-class.js"
|
|
99
|
+
},
|
|
81
100
|
"./app-tab": {
|
|
82
101
|
"types": "./dist/app-tab.d.ts",
|
|
83
102
|
"browser": "./dist/browser/app-tab.js",
|
|
84
103
|
"import": "./dist/app-tab.js"
|
|
85
104
|
},
|
|
105
|
+
"./catalog": {
|
|
106
|
+
"types": "./dist/catalog.d.ts",
|
|
107
|
+
"import": "./dist/catalog.js"
|
|
108
|
+
},
|
|
109
|
+
"./wire-catalog": {
|
|
110
|
+
"types": "./dist/wire-catalog.d.ts",
|
|
111
|
+
"import": "./dist/wire-catalog.js"
|
|
112
|
+
},
|
|
86
113
|
"./tab-bar": {
|
|
87
114
|
"types": "./dist/tab-bar.d.ts",
|
|
88
115
|
"browser": "./dist/browser/tab-bar.js",
|
|
@@ -92,10 +119,37 @@
|
|
|
92
119
|
"types": "./dist/wire-tab-bars.d.ts",
|
|
93
120
|
"import": "./dist/wire-tab-bars.js"
|
|
94
121
|
},
|
|
95
|
-
"./
|
|
96
|
-
"types": "./dist/
|
|
97
|
-
"
|
|
98
|
-
|
|
122
|
+
"./nav-stack": {
|
|
123
|
+
"types": "./dist/nav-stack.d.ts",
|
|
124
|
+
"import": "./dist/nav-stack.js"
|
|
125
|
+
},
|
|
126
|
+
"./wire-nav-stack": {
|
|
127
|
+
"types": "./dist/wire-nav-stack.d.ts",
|
|
128
|
+
"import": "./dist/wire-nav-stack.js"
|
|
129
|
+
},
|
|
130
|
+
"./split-view": {
|
|
131
|
+
"types": "./dist/split-view.d.ts",
|
|
132
|
+
"import": "./dist/split-view.js"
|
|
133
|
+
},
|
|
134
|
+
"./workbench": {
|
|
135
|
+
"types": "./dist/workbench.d.ts",
|
|
136
|
+
"import": "./dist/workbench.js"
|
|
137
|
+
},
|
|
138
|
+
"./collapsible-panel": {
|
|
139
|
+
"types": "./dist/collapsible-panel.d.ts",
|
|
140
|
+
"import": "./dist/collapsible-panel.js"
|
|
141
|
+
},
|
|
142
|
+
"./wire-sidebar": {
|
|
143
|
+
"types": "./dist/wire-sidebar.d.ts",
|
|
144
|
+
"import": "./dist/wire-sidebar.js"
|
|
145
|
+
},
|
|
146
|
+
"./tab-scaffold": {
|
|
147
|
+
"types": "./dist/tab-scaffold.d.ts",
|
|
148
|
+
"import": "./dist/tab-scaffold.js"
|
|
149
|
+
},
|
|
150
|
+
"./wire-tab-scaffold": {
|
|
151
|
+
"types": "./dist/wire-tab-scaffold.d.ts",
|
|
152
|
+
"import": "./dist/wire-tab-scaffold.js"
|
|
99
153
|
},
|
|
100
154
|
"./loading-spinner": {
|
|
101
155
|
"types": "./dist/loading-spinner.d.ts",
|
|
@@ -107,15 +161,33 @@
|
|
|
107
161
|
"browser": "./dist/browser/select.js",
|
|
108
162
|
"import": "./dist/select.js"
|
|
109
163
|
},
|
|
164
|
+
"./skeleton": {
|
|
165
|
+
"types": "./dist/skeleton.d.ts",
|
|
166
|
+
"browser": "./dist/browser/skeleton.js",
|
|
167
|
+
"import": "./dist/skeleton.js"
|
|
168
|
+
},
|
|
110
169
|
"./segmented-control": {
|
|
111
170
|
"types": "./dist/segmented-control.d.ts",
|
|
112
171
|
"browser": "./dist/browser/segmented-control.js",
|
|
113
172
|
"import": "./dist/segmented-control.js"
|
|
114
173
|
},
|
|
174
|
+
"./token-search-field": {
|
|
175
|
+
"types": "./dist/token-search-field.d.ts",
|
|
176
|
+
"browser": "./dist/browser/token-search-field.js",
|
|
177
|
+
"import": "./dist/token-search-field.js"
|
|
178
|
+
},
|
|
179
|
+
"./wire-token-search-fields": {
|
|
180
|
+
"types": "./dist/wire-token-search-fields.d.ts",
|
|
181
|
+
"import": "./dist/wire-token-search-fields.js"
|
|
182
|
+
},
|
|
115
183
|
"./select/register": {
|
|
116
184
|
"types": "./dist/select-register.d.ts",
|
|
117
185
|
"import": "./dist/select-register.js"
|
|
118
186
|
},
|
|
187
|
+
"./webawesome": {
|
|
188
|
+
"types": "./dist/webawesome.d.ts",
|
|
189
|
+
"import": "./dist/webawesome.js"
|
|
190
|
+
},
|
|
119
191
|
"./state-banner": {
|
|
120
192
|
"types": "./dist/state-banner.d.ts",
|
|
121
193
|
"browser": "./dist/browser/state-banner.js",
|
|
@@ -126,10 +198,10 @@
|
|
|
126
198
|
"browser": "./dist/browser/empty-state.js",
|
|
127
199
|
"import": "./dist/empty-state.js"
|
|
128
200
|
},
|
|
129
|
-
"./
|
|
130
|
-
"types": "./dist/
|
|
131
|
-
"browser": "./dist/browser/
|
|
132
|
-
"import": "./dist/
|
|
201
|
+
"./panel-header": {
|
|
202
|
+
"types": "./dist/panel-header.d.ts",
|
|
203
|
+
"browser": "./dist/browser/panel-header.js",
|
|
204
|
+
"import": "./dist/panel-header.js"
|
|
133
205
|
},
|
|
134
206
|
"./value-table": {
|
|
135
207
|
"types": "./dist/value-table.d.ts",
|
|
@@ -140,55 +212,83 @@
|
|
|
140
212
|
"types": "./dist/index.d.ts",
|
|
141
213
|
"import": "./dist/index.js"
|
|
142
214
|
},
|
|
143
|
-
"./foundation.css": "./
|
|
144
|
-
"./
|
|
145
|
-
"./
|
|
146
|
-
"./
|
|
147
|
-
"./
|
|
148
|
-
"./
|
|
149
|
-
"./toolbar
|
|
150
|
-
"./
|
|
151
|
-
"./
|
|
152
|
-
"./
|
|
153
|
-
"./
|
|
154
|
-
"./
|
|
155
|
-
"./
|
|
156
|
-
"./
|
|
157
|
-
"./
|
|
158
|
-
"./
|
|
159
|
-
"./
|
|
160
|
-
"./
|
|
161
|
-
"./
|
|
162
|
-
"./
|
|
215
|
+
"./foundation.css": "./dist/styles/foundation.css",
|
|
216
|
+
"./layout.css": "./dist/styles/layout.css",
|
|
217
|
+
"./webawesome.css": "./dist/styles/webawesome.css",
|
|
218
|
+
"./styles.css": "./dist/styles/styles.css",
|
|
219
|
+
"./lucide-icon.css": "./dist/styles/lucide-icon.css",
|
|
220
|
+
"./disclosure-arrow.css": "./dist/styles/disclosure-arrow.css",
|
|
221
|
+
"./toolbar.css": "./dist/styles/toolbar.css",
|
|
222
|
+
"./toolbar-control-group.css": "./dist/styles/toolbar-control-group.css",
|
|
223
|
+
"./floating-toolbar.css": "./dist/styles/floating-toolbar.css",
|
|
224
|
+
"./toolbar-text.css": "./dist/styles/toolbar-text.css",
|
|
225
|
+
"./list-action-row.css": "./dist/styles/list-action-row.css",
|
|
226
|
+
"./list-item.css": "./dist/styles/list-item.css",
|
|
227
|
+
"./list-header.css": "./dist/styles/list-header.css",
|
|
228
|
+
"./resizable-region.css": "./dist/styles/resizable-region.css",
|
|
229
|
+
"./app-tab.css": "./dist/styles/app-tab.css",
|
|
230
|
+
"./catalog.css": "./dist/styles/catalog.css",
|
|
231
|
+
"./tab-bar.css": "./dist/styles/tab-bar.css",
|
|
232
|
+
"./nav-stack.css": "./dist/styles/nav-stack.css",
|
|
233
|
+
"./split-view.css": "./dist/styles/split-view.css",
|
|
234
|
+
"./workbench.css": "./dist/styles/workbench.css",
|
|
235
|
+
"./collapsible-panel.css": "./dist/styles/collapsible-panel.css",
|
|
236
|
+
"./tab-scaffold.css": "./dist/styles/tab-scaffold.css",
|
|
237
|
+
"./loading-spinner.css": "./dist/styles/loading-spinner.css",
|
|
238
|
+
"./select.css": "./dist/styles/select.css",
|
|
239
|
+
"./skeleton.css": "./dist/styles/skeleton.css",
|
|
240
|
+
"./segmented-control.css": "./dist/styles/segmented-control.css",
|
|
241
|
+
"./token-search-field.css": "./dist/styles/token-search-field.css",
|
|
242
|
+
"./state-banner.css": "./dist/styles/state-banner.css",
|
|
243
|
+
"./empty-state.css": "./dist/styles/empty-state.css",
|
|
244
|
+
"./panel-header.css": "./dist/styles/panel-header.css",
|
|
245
|
+
"./value-table.css": "./dist/styles/value-table.css",
|
|
163
246
|
"./ai/*": "./ai/*",
|
|
164
247
|
"./docs/*": "./docs/*"
|
|
165
248
|
},
|
|
166
249
|
"files": [
|
|
167
250
|
"dist",
|
|
168
|
-
"src/*.css",
|
|
169
251
|
"ai",
|
|
170
252
|
"docs",
|
|
253
|
+
"ux-demo/recipes",
|
|
171
254
|
"llms.txt",
|
|
172
255
|
"README.md",
|
|
173
256
|
"LICENSE"
|
|
174
257
|
],
|
|
175
258
|
"scripts": {
|
|
176
|
-
"build": "tsup && node ../scripts/clean-dist-output.mjs dist && node scripts/build-browser-entries.mjs",
|
|
259
|
+
"build": "tsup && node ../scripts/clean-dist-output.mjs dist && node scripts/build-css.mjs && node scripts/build-browser-entries.mjs",
|
|
177
260
|
"dev": "npm run build && vite --config ux-demo/vite.config.ts",
|
|
178
261
|
"demo:build": "npm run build && vite build --config ux-demo/vite.config.ts && node scripts/check-demo-bundle.mjs",
|
|
179
262
|
"demo:serve": "vite preview --config ux-demo/vite.config.ts",
|
|
180
|
-
"
|
|
263
|
+
"format:css": "prettier --write \"src/**/*.css\" \"ux-demo/**/*.css\"",
|
|
264
|
+
"check:format": "prettier --check \"src/**/*.css\" \"ux-demo/**/*.css\"",
|
|
265
|
+
"catalog:sync": "node scripts/sync-component-catalog.mjs",
|
|
266
|
+
"check:catalog": "node scripts/sync-component-catalog.mjs --check && node scripts/check-component-catalog.mjs",
|
|
267
|
+
"check:recipes": "node scripts/check-recipes.mjs",
|
|
268
|
+
"check:ai-regressions": "node scripts/check-ai-regressions.mjs && node scripts/audit-ai-regression-results.mjs",
|
|
269
|
+
"check:ai-signatures": "node scripts/sync-ai-public-signatures.mjs --check",
|
|
270
|
+
"ai:signatures:sync": "npm run build && node scripts/sync-ai-public-signatures.mjs",
|
|
271
|
+
"ai:regressions:compile": "node scripts/compile-ai-regression-response.mjs",
|
|
272
|
+
"ai:regressions:prepare": "node scripts/prepare-ai-regression.mjs",
|
|
273
|
+
"ai:regressions:record": "node scripts/record-ai-regression-run.mjs",
|
|
274
|
+
"ai:regressions:score": "node scripts/score-ai-regression.mjs",
|
|
275
|
+
"check:guidance": "node scripts/check-decision-guidance.mjs",
|
|
276
|
+
"lint": "eslint src tests ux-demo docs/examples --max-warnings 0",
|
|
181
277
|
"typecheck": "node node_modules/typescript7/bin/tsc --noEmit",
|
|
182
278
|
"test": "npm run test:unit && npm run test:bundle",
|
|
183
279
|
"test:unit": "vitest run tests/unit --coverage",
|
|
184
280
|
"test:bundle": "npm run build && vitest run tests/bundle",
|
|
281
|
+
"test:consumer-types": "npm run build && node node_modules/typescript7/bin/tsc -p tests/consumer-types/webawesome/tsconfig.json",
|
|
185
282
|
"test:e2e": "npm run demo:build && playwright test",
|
|
186
|
-
"check": "npm run lint && npm run typecheck && npm test && npm run demo:build && npm pack --dry-run",
|
|
187
|
-
"prepublishOnly": "npm run check"
|
|
283
|
+
"check": "npm run check:format && npm run check:catalog && npm run check:recipes && npm run check:guidance && npm run check:ai-regressions && npm run lint && npm run typecheck && npm test && npm run test:consumer-types && npm run check:ai-signatures && npm run demo:build && npm run check:design-templates && npm pack --dry-run",
|
|
284
|
+
"prepublishOnly": "npm run check",
|
|
285
|
+
"check:design-templates": "node scripts/check-design-templates.mjs",
|
|
286
|
+
"check:design-templates:drift": "node scripts/check-design-templates-drift.mjs",
|
|
287
|
+
"design-templates:build": "node scripts/build-design-templates.mjs"
|
|
188
288
|
},
|
|
189
289
|
"peerDependencies": {
|
|
190
290
|
"@awesome.me/webawesome": "^3.12.0",
|
|
191
|
-
"kerfjs": "^
|
|
291
|
+
"kerfjs": "^5.0.0-0",
|
|
192
292
|
"lucide": "^1.43.0"
|
|
193
293
|
},
|
|
194
294
|
"peerDependenciesMeta": {
|
|
@@ -204,11 +304,14 @@
|
|
|
204
304
|
"@typescript-eslint/eslint-plugin": "^8.65.0",
|
|
205
305
|
"@typescript-eslint/parser": "^8.65.0",
|
|
206
306
|
"@vitest/coverage-v8": "4.1.11",
|
|
307
|
+
"domotion-svg": "^0.29.0",
|
|
207
308
|
"esbuild": "^0.25.0",
|
|
208
309
|
"eslint": "^10.8.0",
|
|
209
310
|
"eslint-plugin-simple-import-sort": "^12.1.1",
|
|
210
311
|
"happy-dom": "^20.9.0",
|
|
211
312
|
"lucide": "1.43.0",
|
|
313
|
+
"postcss": "^8.5.28",
|
|
314
|
+
"prettier": "^3.9.6",
|
|
212
315
|
"tsup": "^8.3.0",
|
|
213
316
|
"typescript": "^6.0.3",
|
|
214
317
|
"typescript7": "npm:typescript@^7.0.2",
|