@kerfjs/ui 5.0.0-beta.55 → 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 +74 -41
- 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/compile-time-contracts-v1.json +2 -2
- package/ai/component-catalog.json +407 -80
- 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} +302 -61
- 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 +572 -101
- package/ai/skill.md +107 -52
- package/ai/webawesome-jsx-signatures-v1.md +8 -2
- 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/app-tab.js +1 -1
- package/dist/badge.d.ts +35 -7
- package/dist/badge.js +1 -1
- package/dist/browser/catalog.js +25 -0
- package/dist/browser/collapsible-panel.js +7 -0
- package/dist/browser/content-item.js +3 -0
- package/dist/browser/nav-stack.js +8 -0
- package/dist/browser/select.js +1 -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 +12 -1
- package/dist/catalog.d.ts +14 -3
- package/dist/catalog.js +53 -43
- package/dist/catalog.js.map +1 -1
- package/dist/{chunk-WZ2GLEY4.js → chunk-2G2ZJQYK.js} +2 -14
- package/dist/chunk-2G2ZJQYK.js.map +1 -0
- package/dist/{chunk-R754MHXX.js → chunk-553ASUK6.js} +8 -8
- package/dist/chunk-553ASUK6.js.map +1 -0
- package/dist/{chunk-D7GWXIAS.js → chunk-5I7QGQVT.js} +1 -1
- package/dist/chunk-5I7QGQVT.js.map +1 -0
- package/dist/{chunk-RNRUVPJ3.js → chunk-63ZWBGE3.js} +3 -2
- package/dist/chunk-63ZWBGE3.js.map +1 -0
- package/dist/{chunk-44IG7PFV.js → chunk-6CINWX2E.js} +3 -3
- package/dist/{chunk-44IG7PFV.js.map → chunk-6CINWX2E.js.map} +1 -1
- package/dist/{chunk-MTM43SJO.js → chunk-6YFHCLHG.js} +2 -2
- package/dist/chunk-6YFHCLHG.js.map +1 -0
- package/dist/{chunk-C2FAYFDE.js → chunk-AGXQQFKZ.js} +2 -2
- package/dist/{chunk-C2FAYFDE.js.map → chunk-AGXQQFKZ.js.map} +1 -1
- package/dist/{chunk-ATHXW6RP.js → chunk-AHEG27M7.js} +2 -2
- package/dist/{chunk-ATHXW6RP.js.map → chunk-AHEG27M7.js.map} +1 -1
- package/dist/chunk-BFPBS5Y4.js +250 -0
- package/dist/chunk-BFPBS5Y4.js.map +1 -0
- package/dist/{chunk-5OLVUEND.js → chunk-DG6G5EPF.js} +4 -6
- package/dist/chunk-DG6G5EPF.js.map +1 -0
- package/dist/{chunk-LZXQVUGN.js → chunk-EVYKTVBQ.js} +5 -14
- package/dist/chunk-EVYKTVBQ.js.map +1 -0
- package/dist/{chunk-7GUQYHKA.js → chunk-EZVNC4J6.js} +7 -1
- package/dist/chunk-EZVNC4J6.js.map +1 -0
- package/dist/{chunk-RNZAKSME.js → chunk-F4QMLOXJ.js} +5 -4
- package/dist/chunk-F4QMLOXJ.js.map +1 -0
- package/dist/{chunk-EAX2GSS4.js → chunk-G2RKFVRB.js} +54 -20
- 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-HMQ2ZDGG.js → chunk-KROD7KZK.js} +3 -2
- package/dist/chunk-KROD7KZK.js.map +1 -0
- package/dist/{chunk-5NDQABWK.js → chunk-M7QV3IHH.js} +3 -1
- package/dist/chunk-M7QV3IHH.js.map +1 -0
- package/dist/chunk-MA73TA6D.js +42 -0
- package/dist/chunk-MA73TA6D.js.map +1 -0
- package/dist/{chunk-ZMBU522F.js → chunk-MEY33VWB.js} +2 -2
- package/dist/{chunk-ZMBU522F.js.map → chunk-MEY33VWB.js.map} +1 -1
- package/dist/chunk-MP2GDBQZ.js +50 -0
- package/dist/chunk-MP2GDBQZ.js.map +1 -0
- package/dist/{chunk-3NBL3OUQ.js → chunk-NAPE7WUS.js} +2 -2
- package/dist/chunk-NAPE7WUS.js.map +1 -0
- package/dist/{chunk-BSKEH3UC.js → chunk-NBYTIVHS.js} +2 -2
- package/dist/{chunk-BSKEH3UC.js.map → chunk-NBYTIVHS.js.map} +1 -1
- package/dist/{chunk-T22EM4ET.js → chunk-OUK6QRDR.js} +71 -31
- package/dist/chunk-OUK6QRDR.js.map +1 -0
- package/dist/chunk-PWXNJS2B.js +115 -0
- package/dist/chunk-PWXNJS2B.js.map +1 -0
- package/dist/{chunk-GUIHMIT2.js → chunk-QOWG4ZCL.js} +5 -4
- package/dist/chunk-QOWG4ZCL.js.map +1 -0
- package/dist/{chunk-5I22LMCV.js → chunk-VZOFZPSO.js} +2 -2
- package/dist/chunk-VZOFZPSO.js.map +1 -0
- package/dist/{chunk-4BIMLITI.js → chunk-WLG6SSNT.js} +5 -3
- package/dist/chunk-WLG6SSNT.js.map +1 -0
- package/dist/{chunk-NE5JAOQS.js → chunk-WOUF7YXM.js} +3 -3
- package/dist/{chunk-NE5JAOQS.js.map → chunk-WOUF7YXM.js.map} +1 -1
- package/dist/{chunk-N7FHFNT6.js → chunk-XCO6YCYM.js} +34 -5
- package/dist/chunk-XCO6YCYM.js.map +1 -0
- package/dist/{chunk-TZ5IHWB2.js → chunk-XDKAYSVD.js} +5 -3
- package/dist/chunk-XDKAYSVD.js.map +1 -0
- package/dist/collapsible-panel.d.ts +14 -3
- package/dist/collapsible-panel.js +13 -16
- package/dist/collapsible-panel.js.map +1 -1
- package/dist/content-item.d.ts +46 -0
- package/dist/content-item.js +4 -0
- package/dist/content-item.js.map +1 -0
- package/dist/css-values.d.ts +5 -11
- package/dist/css-values.js +1 -1
- package/dist/disclosure-arrow.d.ts +4 -1
- package/dist/disclosure-arrow.js +1 -1
- package/dist/floating-toolbar.d.ts +17 -6
- package/dist/floating-toolbar.js +1 -1
- package/dist/grid.js +1 -1
- package/dist/help-tags-register.d.ts +13 -0
- package/dist/help-tags-register.js +9 -0
- package/dist/help-tags-register.js.map +1 -0
- package/dist/index.d.ts +7 -5
- package/dist/index.js +29 -26
- package/dist/list-action-row.js +2 -1
- package/dist/list-header.d.ts +14 -1
- package/dist/list-header.js +1 -1
- package/dist/list-inset-control.d.ts +1 -1
- package/dist/list-inset-control.js +1 -1
- package/dist/list-inset-text.d.ts +3 -10
- package/dist/list-inset-text.js +1 -1
- package/dist/list-item.js +2 -1
- package/dist/list.d.ts +10 -3
- package/dist/list.js +1 -1
- package/dist/nav-stack.d.ts +50 -5
- package/dist/nav-stack.js +4 -1
- package/dist/pane.d.ts +37 -2
- package/dist/pane.js +1 -1
- package/dist/{panel-toolbar-BFQxFITu.d.ts → panel-toolbar-BN4x0rth.d.ts} +13 -1
- package/dist/popup-menu-register.js +3 -2
- package/dist/popup-menu-register.js.map +1 -1
- package/dist/popup-menu.js +1 -1
- package/dist/row.d.ts +1 -1
- package/dist/row.js +1 -1
- package/dist/select-register.js +70 -3
- package/dist/select-register.js.map +1 -1
- package/dist/select.d.ts +46 -8
- package/dist/select.js +2 -1
- package/dist/{divider-sides-BzB6rphT.d.ts → sides-BPSWde0A.d.ts} +1 -3
- package/dist/skeleton.js +1 -1
- package/dist/spacer.js +1 -1
- package/dist/split-view.d.ts +31 -3
- package/dist/split-view.js +34 -5
- 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 +32 -11
- package/dist/styles/catalog/components/catalog-example.css +1 -1
- package/dist/styles/catalog/components/catalog-stage.css +1 -1
- package/dist/styles/collapsible-panel.css +199 -42
- package/dist/styles/content-item.css +30 -0
- package/dist/styles/floating-toolbar.css +26 -2
- package/dist/styles/foundation.css +28 -19
- package/dist/styles/layout.css +1 -21
- package/dist/styles/list-action-row.css +13 -1
- package/dist/styles/list-header.css +0 -12
- package/dist/styles/list-inset-text.css +1 -2
- package/dist/styles/list-item.css +14 -1
- package/dist/styles/list.css +5 -5
- package/dist/styles/nav-stack.css +63 -71
- package/dist/styles/pane.css +83 -1
- package/dist/styles/popup-menu.css +229 -0
- package/dist/styles/resizable-region.css +70 -15
- package/dist/styles/select.css +60 -19
- package/dist/styles/skeleton.css +30 -3
- package/dist/styles/split-view.css +31 -32
- 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 +60 -14
- package/dist/styles/text.css +17 -1
- package/dist/styles/token-search-field.css +4 -4
- package/dist/styles/toolbar-control-group.css +143 -69
- package/dist/styles/toolbar-text.css +21 -0
- package/dist/styles/toolbar.css +22 -37
- package/dist/styles/value-table.css +19 -2
- package/dist/styles/webawesome.css +3 -1
- package/dist/styles/workbench.css +145 -42
- package/dist/tab-scaffold.d.ts +46 -2
- package/dist/tab-scaffold.js +52 -16
- package/dist/tab-scaffold.js.map +1 -1
- package/dist/token-search-field.d.ts +4 -2
- package/dist/token-search-field.js +1 -1
- package/dist/toolbar-text.d.ts +7 -1
- package/dist/toolbar-text.js +1 -1
- package/dist/toolbar.d.ts +20 -5
- package/dist/toolbar.js +1 -1
- package/dist/{types-D6vzj-VT.d.ts → types-BuHELdXR.d.ts} +39 -6
- package/dist/value-table.js +1 -1
- package/dist/webawesome.d.ts +7 -1
- package/dist/wire-catalog.d.ts +15 -2
- package/dist/wire-catalog.js +12 -2
- 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/wire-token-search-fields.js +1 -1
- package/dist/workbench.d.ts +60 -22
- package/dist/workbench.js +1 -1
- package/docs/accessibility.md +116 -7
- package/docs/app-layouts.md +18 -8
- package/docs/catalog.md +26 -7
- package/docs/collapsible-panel.md +32 -9
- package/docs/component-contract.md +182 -30
- package/docs/component-selection.md +59 -46
- package/docs/design/templates/empty-state/with-action-dark.svg +1 -1
- package/docs/design/templates/empty-state/with-action.svg +1 -1
- package/docs/design/templates/empty-state-dark.svg +1 -1
- package/docs/design/templates/empty-state.svg +1 -1
- package/docs/design/templates/list/compact-dark.svg +1 -1
- package/docs/design/templates/list/compact.svg +1 -1
- package/docs/design/templates/list/stack-dark.svg +1 -1
- package/docs/design/templates/list/stack.svg +1 -1
- package/docs/design/templates/list-action-row/default-dark.svg +1 -1
- package/docs/design/templates/list-action-row/default.svg +1 -1
- package/docs/design/templates/list-action-row/selected-dark.svg +1 -1
- package/docs/design/templates/list-action-row/selected.svg +1 -1
- package/docs/design/templates/list-action-row-dark.svg +1 -1
- package/docs/design/templates/list-action-row.svg +1 -1
- package/docs/design/templates/list-dark.svg +1 -1
- package/docs/design/templates/list-item/default-dark.svg +1 -1
- package/docs/design/templates/list-item/default.svg +1 -1
- package/docs/design/templates/list-item/selected-dark.svg +1 -1
- package/docs/design/templates/list-item/selected.svg +1 -1
- package/docs/design/templates/list-item/trailing-dark.svg +1 -1
- package/docs/design/templates/list-item/trailing.svg +1 -1
- package/docs/design/templates/list-item-dark.svg +1 -1
- package/docs/design/templates/list-item.svg +1 -1
- package/docs/design/templates/list.svg +1 -1
- 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/templates/value-table/details-dark.svg +1 -1
- package/docs/design/templates/value-table/details.svg +1 -1
- package/docs/design/templates/value-table-dark.svg +1 -1
- package/docs/design/templates/value-table.svg +1 -1
- package/docs/design-philosophy.md +31 -4
- package/docs/examples/application-ui-profile.json +4 -4
- package/docs/examples/command-palette-adapter.tsx +3 -2
- package/docs/examples/{component-catalog-extension-v2.json → component-composition-extension.json} +3 -3
- package/docs/layout.md +148 -29
- package/docs/nav-stack.md +77 -3
- package/docs/recipes.md +4 -3
- package/docs/split-view.md +54 -5
- package/docs/tab-scaffold.md +73 -2
- package/docs/type-contracts.md +21 -20
- package/docs/ui-analyzer.md +99 -5
- package/docs/ui-doctor.md +10 -0
- package/docs/ux-demo.md +2 -2
- package/docs/webawesome-theme.md +1 -2
- package/docs/workbench.md +57 -11
- package/doctor/index.mjs +6 -1
- package/llms.txt +117 -24
- package/package.json +29 -6
- package/ux-demo/recipes/collapsible-sidebar.tsx +3 -3
- 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/navigation-sidebar.tsx +3 -2
- package/ux-demo/recipes/navigation-stack.tsx +3 -2
- 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-3NBL3OUQ.js.map +0 -1
- package/dist/chunk-4BIMLITI.js.map +0 -1
- package/dist/chunk-5I22LMCV.js.map +0 -1
- package/dist/chunk-5NDQABWK.js.map +0 -1
- package/dist/chunk-5OLVUEND.js.map +0 -1
- package/dist/chunk-7GUQYHKA.js.map +0 -1
- package/dist/chunk-D7GWXIAS.js.map +0 -1
- package/dist/chunk-DQA5FMOX.js +0 -85
- package/dist/chunk-DQA5FMOX.js.map +0 -1
- package/dist/chunk-EAX2GSS4.js.map +0 -1
- package/dist/chunk-GUIHMIT2.js.map +0 -1
- package/dist/chunk-HMQ2ZDGG.js.map +0 -1
- package/dist/chunk-LZXQVUGN.js.map +0 -1
- package/dist/chunk-MTM43SJO.js.map +0 -1
- package/dist/chunk-N7FHFNT6.js.map +0 -1
- package/dist/chunk-R754MHXX.js.map +0 -1
- package/dist/chunk-RNRUVPJ3.js.map +0 -1
- package/dist/chunk-RNZAKSME.js.map +0 -1
- package/dist/chunk-T22EM4ET.js.map +0 -1
- package/dist/chunk-TZ5IHWB2.js.map +0 -1
- package/dist/chunk-WZ2GLEY4.js.map +0 -1
- package/dist/chunk-XD7DWYXG.js +0 -34
- package/dist/chunk-XD7DWYXG.js.map +0 -1
package/docs/workbench.md
CHANGED
|
@@ -9,9 +9,15 @@ desktop-class devices.
|
|
|
9
9
|
|
|
10
10
|
```ts
|
|
11
11
|
import { Workbench } from "@kerfjs/ui/workbench";
|
|
12
|
-
import "@kerfjs/ui/workbench.css";
|
|
13
12
|
```
|
|
14
13
|
|
|
14
|
+
In a browser bundler that honors the `browser` export condition (Vite, esbuild, and
|
|
15
|
+
webpack do by default), the import above also
|
|
16
|
+
loads Workbench's stylesheet and those of the components it renders internally
|
|
17
|
+
(`Pane`, `Toolbar`, `ToolbarControlGroup`, `FloatingToolbar`, `ResizableRegion`,
|
|
18
|
+
`List`, `LucideIcon`). Without that condition, import the manual stylesheets instead:
|
|
19
|
+
`@kerfjs/ui/workbench.css` plus those components' CSS, or `@kerfjs/ui/styles.css`.
|
|
20
|
+
|
|
15
21
|
A top-level `Workbench` needs a definite containing height. Import the opt-in
|
|
16
22
|
`@kerfjs/ui/document.css` baseline and add `.kui-app-root` to the direct mount
|
|
17
23
|
container, or provide an equivalent definite height in application-owned
|
|
@@ -107,7 +113,13 @@ an optional `label`. Common shell behavior is configured rather than restyled:
|
|
|
107
113
|
defaults to two less than the overlay z-index (39), so they sit beneath
|
|
108
114
|
every overlay: an open overlay covers another panel's restore control as
|
|
109
115
|
it covers the rest of the work area, and a collapsed overlay, which drops
|
|
110
|
-
its pointer events, leaves the control beneath it usable
|
|
116
|
+
its pointer events, leaves the control beneath it usable. While a rail
|
|
117
|
+
overlay is open (static, or a responsive one whose breakpoint applies), the
|
|
118
|
+
work area's floating controls — restore corners and any `FloatingToolbar`
|
|
119
|
+
in `main` — are also hidden outright (out of the tab order and the
|
|
120
|
+
accessibility tree), so they can never paint over the rail whatever
|
|
121
|
+
stacking context the app gives the work area; they return as it closes.
|
|
122
|
+
The rail's own floating controls stay, and a drawer overlay hides nothing;
|
|
111
123
|
- `restoreControl` places an application-owned restore affordance in a
|
|
112
124
|
corner of the Workbench itself while the panel is collapsed. Prefer a
|
|
113
125
|
`toolbar.toggle`, which the Workbench relocates for you; keep
|
|
@@ -130,8 +142,8 @@ an optional `label`. Common shell behavior is configured rather than restyled:
|
|
|
130
142
|
carrying `collapsiblePanelToggleIcon(side, true)` — rather than a bare
|
|
131
143
|
button. To give it `FloatingToolbar`'s toolbar role and floating look, wrap
|
|
132
144
|
that group in a `FloatingToolbar` whose `position` matches the corner: the
|
|
133
|
-
corner owns the inset (it
|
|
134
|
-
toolbar floats from the corner instead of doubling it.
|
|
145
|
+
corner owns the inset (it zeroes the toolbar's default inset), so omit
|
|
146
|
+
`inset` there and the toolbar floats from the corner instead of doubling it.
|
|
135
147
|
|
|
136
148
|
- `resizable: true | { min, max }` opts the panel in to drag and keyboard
|
|
137
149
|
resizing, driven by `wireWorkbench` (off by default).
|
|
@@ -154,10 +166,12 @@ and close. A panel's `toolbar` has four parts:
|
|
|
154
166
|
- `constant` — groups that stay available either way. They trail the panel's
|
|
155
167
|
toolbar while it is open and move to the work area's toolbar while it is
|
|
156
168
|
closed.
|
|
157
|
-
- `toggle: { action, name }` — the standard collapse
|
|
158
|
-
Workbench renders: the per-side panel glyph,
|
|
159
|
-
panel, `aria-expanded`, a "Show …"/"Hide …"
|
|
169
|
+
- `toggle: { action, name, showLabel?, hideLabel? }` — the standard collapse
|
|
170
|
+
toggle, which the Workbench renders: the per-side panel glyph,
|
|
171
|
+
`aria-controls` naming the panel, `aria-expanded`, a "Show …"/"Hide …"
|
|
172
|
+
label (or your localized `showLabel` / `hideLabel`), and the `data-action`
|
|
160
173
|
the app handles. It is always the last group.
|
|
174
|
+
- `center` — optional panel-only center content.
|
|
161
175
|
|
|
162
176
|
While a panel is closed, its `constant` groups and then its toggle go to:
|
|
163
177
|
|
|
@@ -198,9 +212,40 @@ The work area's `Pane` can carry more fixed chrome: `mainHeader` renders under
|
|
|
198
212
|
line or a resource toolbar), each divided from the scrolling `main`.
|
|
199
213
|
`mainHeaderPlacement` and `mainFooterPlacement` (`"fixed"` by default, or
|
|
200
214
|
`"scroll"`) let that header or footer chrome scroll away with `main` instead —
|
|
201
|
-
useful where large text would leave pinned chrome little room. `
|
|
202
|
-
|
|
203
|
-
|
|
215
|
+
useful where large text would leave pinned chrome little room. `"auto"` keeps
|
|
216
|
+
it pinned while the work area is tall enough and lets it scroll with `main`
|
|
217
|
+
when the work area is short (the Pane's `chromePlacement="auto"`; it applies to
|
|
218
|
+
the pinned header and footer together).
|
|
219
|
+
|
|
220
|
+
Every toolbar the Workbench composes — `mainToolbar`, `mainBottomToolbar`, and
|
|
221
|
+
each panel's `toolbar` — takes the `Toolbar`'s configuration (`ToolbarConfig`):
|
|
222
|
+
`dividerSides`, `centerAlign`, `responsive`, `responsiveAt`, and
|
|
223
|
+
`safeAreaEdges`. Configure the toolbar through these props rather than styling
|
|
224
|
+
it. No toolbar draws a divider by default: each `Pane` draws one line under
|
|
225
|
+
its header chrome and one over its footer chrome, wherever that chrome ends,
|
|
226
|
+
only while its content is scrolled beneath it (see
|
|
227
|
+
[Scroll dividers](./layout.md#scroll-dividers) — call `wireScrollDividers`
|
|
228
|
+
once at the app root). Set `dividerSides` only for a permanent separator edge,
|
|
229
|
+
or `chromeDividers: "always"` on the pane for a line that never hides.
|
|
230
|
+
`responsive: "wrap"` keeps a long title whole and wraps its actions
|
|
231
|
+
below it. `mainBottomToolbar` also takes a `center`. A panel's
|
|
232
|
+
`restorePosition` also places its floating restore controls.
|
|
233
|
+
|
|
234
|
+
The `Pane`s and `List`s the Workbench composes around your content are
|
|
235
|
+
configurable the same way:
|
|
236
|
+
|
|
237
|
+
- `mainPane` (`PaneConfig`: `contentElement`, `contentLabel`, `separators`,
|
|
238
|
+
`safeAreaEdges`, `chromeDividers`) configures the work area's `Pane`, which exists whenever the
|
|
239
|
+
work area has a toolbar, `mainHeader`, or `mainFooter`;
|
|
240
|
+
- a panel's `pane` configures the `Pane` a `toolbar` panel's `content` renders
|
|
241
|
+
in — for example `{ contentElement: "nav", contentLabel: "Files" }` for a
|
|
242
|
+
navigator rail;
|
|
243
|
+
- `mainHeaderList` / `mainFooterList` (`ListConfig`: `gap`, `hAlign`,
|
|
244
|
+
`vAlign`, `dividerSides`, `textInsets`, `controlInsets`) configure the
|
|
245
|
+
`List`s holding `mainHeader` / `mainFooter`.
|
|
246
|
+
|
|
247
|
+
An omitted or `undefined` field keeps the default, including the scroll
|
|
248
|
+
dividers described above.
|
|
204
249
|
|
|
205
250
|
Size a rail so its title and groups fit at its narrowest (a resizable rail's
|
|
206
251
|
`min`); a toolbar that cannot hold them drops the title rather than
|
|
@@ -487,7 +532,8 @@ when each policy applies.
|
|
|
487
532
|
|
|
488
533
|
## Public styling boundary
|
|
489
534
|
|
|
490
|
-
|
|
535
|
+
The component subpath's browser build loads `workbench.css`; import
|
|
536
|
+
`@kerfjs/ui/workbench.css` manually only without the `browser` condition. Applications may
|
|
491
537
|
set `--kui-workbench-rail-width` and `--kui-workbench-drawer-height` on a
|
|
492
538
|
Workbench instance. The supported composition classes are `.kui-workbench`,
|
|
493
539
|
`.kui-workbench__rail`, `.kui-workbench__rail--left`,
|
package/doctor/index.mjs
CHANGED
|
@@ -21,7 +21,11 @@ import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
|
21
21
|
import { createRequire } from 'node:module';
|
|
22
22
|
|
|
23
23
|
import { loadApplicationUiProfile } from '../ai/application-ui-profile.mjs';
|
|
24
|
-
import {
|
|
24
|
+
import {
|
|
25
|
+
analyzeUiProject,
|
|
26
|
+
UI_ANALYSIS_ACTIONS,
|
|
27
|
+
UI_ANALYSIS_RULES,
|
|
28
|
+
} from '../analyzer/index.mjs';
|
|
25
29
|
import { evaluateUi, UI_EVALUATION_RULES } from '../evaluator/index.mjs';
|
|
26
30
|
import {
|
|
27
31
|
isForeignRuleDefinitionDiagnostic,
|
|
@@ -547,6 +551,7 @@ function normalizeAnalyzer(report) {
|
|
|
547
551
|
evidence: item.evidence,
|
|
548
552
|
catalogFacts: item.chain,
|
|
549
553
|
action:
|
|
554
|
+
UI_ANALYSIS_ACTIONS[item.ruleId] ??
|
|
550
555
|
'Apply the catalog-declared composition or geometry boundary at this source location.',
|
|
551
556
|
meaning: UI_ANALYSIS_RULES[item.ruleId]?.title ?? item.ruleId,
|
|
552
557
|
}),
|
package/llms.txt
CHANGED
|
@@ -17,6 +17,17 @@ component per source file and one owned stylesheet per visual component. Keep it
|
|
|
17
17
|
compatibility entrypoints implementation-free: JavaScript/TypeScript only re-exports
|
|
18
18
|
the folder modules, and CSS only imports their owner stylesheets.
|
|
19
19
|
|
|
20
|
+
## The rule: components own their styles
|
|
21
|
+
|
|
22
|
+
Configure components through their typed props (size, density, inset,
|
|
23
|
+
presentation, `ToolbarConfig`, `PaneConfig`, …); never restyle one from outside.
|
|
24
|
+
No application or parent CSS may select a `.kui-*` class, a `[data-component]`
|
|
25
|
+
root, a `wa-*` element a Kerf component renders, or its `::part()`s, and no
|
|
26
|
+
writing another component's `--_kui-*` / `--kui-*` variables where a prop
|
|
27
|
+
exists. When a component adapts inside another, it styles itself in that
|
|
28
|
+
context in its own stylesheet. A missing prop is a component gap to report,
|
|
29
|
+
not a reason to override — and your own components follow the same rule.
|
|
30
|
+
|
|
20
31
|
## How to build a screen (retrieval order)
|
|
21
32
|
|
|
22
33
|
1. **Pick the component from the interface need**, not by appearance — read
|
|
@@ -25,20 +36,32 @@ the folder modules, and CSS only imports their owner stylesheets.
|
|
|
25
36
|
2. **Get exact signatures before emitting code** — read
|
|
26
37
|
[public-api-signatures-v1.md](./ai/public-api-signatures-v1.md) (real prop names,
|
|
27
38
|
callback shapes, disposer return types).
|
|
28
|
-
3. **
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
39
|
+
3. **Look up each component you use** in the
|
|
40
|
+
[component reference index](./ai/components/README.md) — one line per
|
|
41
|
+
entry — then read only those `ai/components/<id>.md` pages (1–7 KB each):
|
|
42
|
+
use/avoid, imports and side effects, a link to exact props, legal parents,
|
|
43
|
+
zones with their JSX prop and child count, app- and wiring-owned state,
|
|
44
|
+
geometry, accessibility, the styling boundary (configure through props;
|
|
45
|
+
never override internals), and `KUI-C###` diagnostics. Do not load the
|
|
46
|
+
large JSON catalogs just to choose or compose components; the pages are
|
|
47
|
+
generated from them.
|
|
48
|
+
**Tools and mechanical checks** use the JSON sources instead: the
|
|
49
|
+
[Machine-readable component catalog](./ai/component-catalog.json) (ids,
|
|
50
|
+
exports, variants, `publicClasses`, relationships, side effects, and
|
|
51
|
+
geometry ownership) — the canonical checked-in source; its schema is
|
|
52
|
+
alongside it. Also load the
|
|
32
53
|
consuming application's catalog extension when present; generate one from the
|
|
33
54
|
[Consumer catalog extension schema](./ai/component-catalog-extension.schema.json)
|
|
34
55
|
when app-owned components must participate in selection or alignment.
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
56
|
+
A tool loads the [Composition catalog](./ai/component-composition.json) — a
|
|
57
|
+
generated composition layer beside the component catalog, not a replacement
|
|
58
|
+
for it — to mechanically evaluate parents, contexts, zones/cardinality,
|
|
59
|
+
children, state, wiring (including the wiring-owned `stateAttributes` an app
|
|
60
|
+
must never render or remove), responsive/layout/accessibility rules, and
|
|
61
|
+
public boundaries. The component catalog stays the selection and delivery
|
|
62
|
+
surface; the composition layer joins catalogs by `package:id`. Consumer
|
|
63
|
+
composition catalogs use
|
|
64
|
+
[the composition extension schema](./ai/component-composition-extension.schema.json).
|
|
42
65
|
Load [compile-time contracts](./ai/compile-time-contracts-v1.json) for stable
|
|
43
66
|
`KUI-T###` ids, exact declaration symbols, and the boundary between rejected
|
|
44
67
|
source states and relationships that still require runtime/catalog checks.
|
|
@@ -83,7 +106,10 @@ the folder modules, and CSS only imports their owner stylesheets.
|
|
|
83
106
|
prefer its canonical shorthand or typed helper over raw CSS strings; a
|
|
84
107
|
`--wa-color-{tone}-fill-loud` override without a governing `on-loud` (same
|
|
85
108
|
or ancestor scope, possibly in a co-loaded stylesheet), or whose literal
|
|
86
|
-
pair measures below 4.5:1, is review finding `KUI-L018` (set both);
|
|
109
|
+
pair measures below 4.5:1, is review finding `KUI-L018` (set both); CSS that restyles a component
|
|
110
|
+
(`KUI-L019`), touches its private `--_*` variables (`KUI-L020`), overrides a token a typed prop sets
|
|
111
|
+
(`KUI-L021`), or styles it through a hook class on its root (`KUI-L022`) is an error: configure the
|
|
112
|
+
component instead, and report a component gap when no prop exists; repair source-located errors until exit 0. Use full mode for release gates;
|
|
87
113
|
generated `dist`/`coverage`, dependency, cache, evidence, and nested-worktree
|
|
88
114
|
directories are excluded consistently from every static stage.
|
|
89
115
|
[`kerf-ui-analyze`](./docs/ui-analyzer.md) remains available when only static
|
|
@@ -98,15 +124,26 @@ the folder modules, and CSS only imports their owner stylesheets.
|
|
|
98
124
|
|
|
99
125
|
## Core rules (do the right thing)
|
|
100
126
|
|
|
127
|
+
- **Prefer a Kerf UI component over a Web Awesome component over a raw HTML
|
|
128
|
+
tag**, using each for what it is good at. Never render a `Discouraged` Web
|
|
129
|
+
Awesome element (`wa-dropdown`, `wa-button-group`, `wa-select`, `wa-tab-group`,
|
|
130
|
+
`wa-icon`, …) directly; reach it only through the Kerf component that wraps or
|
|
131
|
+
replaces it (`PopupMenu`, `SegmentedControl`, `Select`, `TabBar`,
|
|
132
|
+
`LucideIcon`), and file a component gap rather than dropping to the raw tag.
|
|
101
133
|
- **Reach for the primitive, not for CSS.** The package is built to look right
|
|
102
134
|
without an application customization layer. Before adding `padding`, `margin`,
|
|
103
135
|
`width`, `height`, `border`, `background`, a wrapper card, or a decoration,
|
|
104
136
|
check whether the component, pane, or content-item already owns it. Prefer a
|
|
105
|
-
component prop
|
|
137
|
+
component prop — `FloatingToolbar inset`, `DisclosureArrow size`, `ListHeader
|
|
138
|
+
headingLevel`, `TokenSearchField clearIcon`, `ContentItem frame="framed"` for a
|
|
139
|
+
visibly bounded content item — over overriding its `--kui-*` token. CSS for genuinely new structure
|
|
106
140
|
belongs to the application-owned component that renders it and must not select
|
|
107
141
|
nested Kerf or Web Awesome components.
|
|
108
142
|
- **Never double-inset.** A `.kui-pane` has no padding; its `.kui-content` children
|
|
109
|
-
own the geometry (8px inline margin + 1px border + 8px padding).
|
|
143
|
+
own the geometry (8px inline margin + 1px border + 8px padding). Render an
|
|
144
|
+
ordinary surface-like child as `ContentItem` (`@kerfjs/ui/content-item`) with
|
|
145
|
+
typed `frame` (`none`/`framed`) and `shape` (`rounded`/`pill`) props instead
|
|
146
|
+
of hand-writing `<div class="kui-content-item">`. Do not add a
|
|
110
147
|
container padding on top of a content-item's own margin — pick one owner. Use
|
|
111
148
|
`.kui-content` for 24px major vertical rhythm.
|
|
112
149
|
- **Opt into document globals explicitly.** Import `@kerfjs/ui/document.css`
|
|
@@ -129,7 +166,7 @@ the folder modules, and CSS only imports their owner stylesheets.
|
|
|
129
166
|
`@kerfjs/ui/css-values` builders; raw CSS strings are rejected. Use `flex()`
|
|
130
167
|
for List flex, typed lengths for Skeleton geometry, and
|
|
131
168
|
foreground colors for choice icons: `uiColor()` with an `*-on-*`/text token
|
|
132
|
-
or `foregroundColorVar()`; fill
|
|
169
|
+
or `foregroundColorVar()`; fill tokens such as `uiColor('success-fill-quiet')` do not
|
|
133
170
|
type-check. These brands are intentionally
|
|
134
171
|
not interchangeable; rows use classes/tokens/props rather than raw `style`.
|
|
135
172
|
- **Use `Grid` for a fixed positive count of equal-width columns.** It uses
|
|
@@ -170,7 +207,21 @@ the folder modules, and CSS only imports their owner stylesheets.
|
|
|
170
207
|
label uses the same uppercase xs/650 treatment and its label and hint share
|
|
171
208
|
that 9px alignment.
|
|
172
209
|
- `Select` requires a visible `label` or an `ariaLabel` for a visually hidden
|
|
173
|
-
accessible name.
|
|
210
|
+
accessible name. Set `multiple` with an array `value` for any number of
|
|
211
|
+
choices: the popup stays open while choices toggle and closes on an outside
|
|
212
|
+
press or Escape, and the closed control summarizes the chosen labels. A
|
|
213
|
+
toolbar filter menu adds `selectedPresentation="icon-only"` and a fixed
|
|
214
|
+
`triggerIcon`: the trigger shows that icon plus a count badge while any
|
|
215
|
+
choice is chosen, and its accessible name ends with the chosen labels.
|
|
216
|
+
Icon-only Selects (single or multiple) and icon-only `PopupMenu`s show an
|
|
217
|
+
`aria-hidden` Web Awesome help tag repeating that name (and a Select's
|
|
218
|
+
choice) on hover and keyboard focus, hidden while the popup is open; the
|
|
219
|
+
register import installs it, so do not add a `title` or tooltip of your own.
|
|
220
|
+
The same installer tags an icon-only `<button>` or link inside a
|
|
221
|
+
`ToolbarControlGroup` named by `aria-label` (no visible text or `title`);
|
|
222
|
+
import `@kerfjs/ui/help-tags/register` once when a toolbar has such buttons
|
|
223
|
+
but no registered Select or PopupMenu.
|
|
224
|
+
The package names the internal combobox, including custom
|
|
174
225
|
selected content; consumers do not need shadow-DOM naming workarounds.
|
|
175
226
|
Import `select/register` once for the canonical animation lifecycle: stale
|
|
176
227
|
close/show completions cannot override a later request. Consumers must not
|
|
@@ -191,12 +242,19 @@ the folder modules, and CSS only imports their owner stylesheets.
|
|
|
191
242
|
(`@kerfjs/ui/popup-menu`, registered once via `@kerfjs/ui/popup-menu/register`)
|
|
192
243
|
in a `single` `ToolbarControlGroup` with `nestedDropdown`; never hand-write
|
|
193
244
|
`wa-dropdown` markup for a menu. Let the group size the trigger from its icon,
|
|
194
|
-
localized text, and caret; do not force a dropdown or button width.
|
|
245
|
+
localized text, and caret; do not force a dropdown or button width. Nothing
|
|
246
|
+
wraps inside a group: an icon sits beside its label on one row, and a
|
|
247
|
+
`ToolbarText` is one ellipsized line unless you opt into `wrap`/`maxLines`. A
|
|
248
|
+
Select or PopupMenu trigger drops its focus ring while its popup is open and
|
|
249
|
+
the ring follows the control's shape; never add ring CSS. Compact
|
|
195
250
|
mixed groups keep standard item padding and raised selected chrome without an
|
|
196
251
|
internal separator; the selected item paints over the outer border. For an
|
|
197
252
|
avatar control, set `content="avatar"` and `avatarImage` on the group instead of
|
|
198
253
|
inserting an `img`; a lone control paints the group and a multi-button group
|
|
199
|
-
paints only its pressed highlight.
|
|
254
|
+
paints only its pressed highlight. Dividers earn their place: a `Toolbar`
|
|
255
|
+
draws none by default and pinned chrome gets its line from scroll state (see
|
|
256
|
+
the scroll-divider rule below); never fake one with a border or pad below a
|
|
257
|
+
divider to make it look right.
|
|
200
258
|
- **Use one direct toolbar composition for panel/dialog/page headings.** Put an
|
|
201
259
|
optional icon in a `ToolbarControlGroup`, an extra-large `ToolbarText` directly
|
|
202
260
|
in the leading zone, and actions in a trailing group. Supporting copy is
|
|
@@ -223,10 +281,34 @@ the folder modules, and CSS only imports their owner stylesheets.
|
|
|
223
281
|
radius minus `--kui-layout-highlight-inset`. Do not give an inner highlight an
|
|
224
282
|
unrelated radius.
|
|
225
283
|
- **Panes share one child-owned geometry.** Sidebars, main areas, inspectors, and
|
|
226
|
-
dialogs all
|
|
227
|
-
scrolling `.kui-pane__content`, optional
|
|
228
|
-
|
|
229
|
-
|
|
284
|
+
dialogs all render `Pane`: an unpadded `.kui-pane` (optional header, one
|
|
285
|
+
scrolling `.kui-pane__content`, optional footer). Never write a component's
|
|
286
|
+
anatomy classes onto your own element to recreate it (`KUI-L103`); only
|
|
287
|
+
the catalog's `placeableClasses` (layout utilities, `.kui-app-root`,
|
|
288
|
+
`.kui-content-item` on a non-div carrier) belong there. A visible pane owns
|
|
289
|
+
its collapse control (the last control of its last group); a hidden pane's
|
|
290
|
+
restore moves to the adjacent main toolbar's matching edge — no icon-only
|
|
291
|
+
rail — and a collapsed drawer's restore sits in the bottom toolbar or a
|
|
292
|
+
`FloatingToolbar` beside the drawer, near where its effect appears. Align
|
|
293
|
+
text to text and icons to icons across a pane; a border is decoration, never
|
|
294
|
+
the alignment anchor. Keep one scroll owner per region.
|
|
295
|
+
- **Dividers between pinned chrome and scrolling content are scroll state.**
|
|
296
|
+
Toolbars draw no divider by default. Call `wireScrollDividers(appRoot)`
|
|
297
|
+
(`@kerfjs/ui/wire-scroll-dividers`) once and keep its disposer: every `Pane`
|
|
298
|
+
then draws the line under its header only while content is scrolled beneath
|
|
299
|
+
it and the line over its footer only while more content lies below (never
|
|
300
|
+
when the content fits), every `NavStack`'s top chrome and bottom toolbar and
|
|
301
|
+
every `TabScaffold` bar do the same around the active view or scene, and
|
|
302
|
+
every `TabBar` marks each side of its strip with tabs scrolled out of view. Configure a pane with `chromeDividers`
|
|
303
|
+
(`scroll` default, `always`, `none`), and a `NavStack` or `TabScaffold`
|
|
304
|
+
with its own `chromeDividers` (same values; a `SplitView` forwards it through
|
|
305
|
+
`compactStack`); name app-owned chrome in `targets`.
|
|
306
|
+
Never add a border, or a permanent `dividerSides`, to fake one.
|
|
307
|
+
While a side overlay is open (a Workbench rail overlay, a `wireSidebar` compact
|
|
308
|
+
overlay, an overlay `CollapsiblePanel` or horizontal `ResizableRegion`), the
|
|
309
|
+
layout hides the covered work area's `FloatingToolbar`s and restore corners
|
|
310
|
+
itself (unfocusable, out of the accessibility tree) until it closes — do not
|
|
311
|
+
hide them from overlay state yourself.
|
|
230
312
|
- **State and behavior live in the app.** Components take semantic `data-action`
|
|
231
313
|
strings and controlled values; wire them once with `delegate()`/`delegateActions()`
|
|
232
314
|
or the disposer-returning `wire…` helpers, and own domain copy, transport, and
|
|
@@ -240,7 +322,9 @@ the folder modules, and CSS only imports their owner stylesheets.
|
|
|
240
322
|
(mark a preferred new-view target with `data-nav-focus`), `wireTabBars` the
|
|
241
323
|
overflow autoscroll, drag preview, and
|
|
242
324
|
replacement focus after controlled automatic tab activation,
|
|
243
|
-
`wireResizableRegions` the live drag preview
|
|
325
|
+
`wireResizableRegions` the live drag preview, `wireScrollDividers` the
|
|
326
|
+
scroll-state attributes from which a `Pane` draws its chrome dividers and a
|
|
327
|
+
`TabBar` its overflow dividers; they report committed changes via
|
|
244
328
|
callbacks. For a tab-local action plus a separate far-edge action, set
|
|
245
329
|
`TabBar trailingPlacement="adjacent"`, put the local action in `trailing`, and
|
|
246
330
|
the workspace action in `end`; the component keeps both visible while its tab
|
|
@@ -290,6 +374,10 @@ the folder modules, and CSS only imports their owner stylesheets.
|
|
|
290
374
|
- **Use `Badge` for compact non-interactive metadata.** Configure its semantic
|
|
291
375
|
tone, appearance, shape, and size instead of creating badge CSS in an app or
|
|
292
376
|
consuming component. Use a real button or link for interactive content.
|
|
377
|
+
For new content without a count, use the text-free `size="dot"` form: it
|
|
378
|
+
takes no children, and needs a `label` (announced as an image) or
|
|
379
|
+
`ariaHidden` when its owner announces it. A `TabScaffold` tab shows the dot
|
|
380
|
+
with `badge: true` plus its required `badgeLabel`.
|
|
293
381
|
|
|
294
382
|
## Public exports
|
|
295
383
|
|
|
@@ -298,9 +386,13 @@ the folder modules, and CSS only imports their owner stylesheets.
|
|
|
298
386
|
`ListInsetText`, `SegmentedControl`,
|
|
299
387
|
`Select`, `TokenSearchField` (+ `readTokenSearchField`, `placeTokenSearchCaret`,
|
|
300
388
|
`wireTokenSearchFields`), `AppTab`, `TabBar` (+ `wireTabBars`, `reorderTabs`),
|
|
389
|
+
`wireScrollDividers` (scroll-state dividers for every `Pane`, `NavStack`,
|
|
390
|
+
`TabScaffold`, and `TabBar`),
|
|
301
391
|
`ResizableRegion` (+ `wireResizableRegions`), `StateBanner`, `EmptyState`,
|
|
302
392
|
`LoadingSpinner`, `Skeleton`, `ValueTable`, `ValueTableRow`. Whole-screen layouts (opt-in,
|
|
303
|
-
tree-shakeable, declarative with `wire…` helpers
|
|
393
|
+
tree-shakeable, declarative with `wire…` helpers; the browser build of each layout
|
|
394
|
+
subpath loads its CSS and that of the components it renders, and a companion
|
|
395
|
+
CSS subpath remains for pipelines without the `browser` condition):
|
|
304
396
|
`NavStack`, `SplitView`, `Workbench`, `TabScaffold`, driven by `deviceClass()` from
|
|
305
397
|
`@kerfjs/ui/device-class`. For a standalone collapsible rail/drawer outside a full
|
|
306
398
|
shell, `@kerfjs/ui/collapsible-panel` (`CollapsiblePanel`, `CollapsiblePanelToggle`)
|
|
@@ -329,6 +421,7 @@ shell, `@kerfjs/ui/collapsible-panel` (`CollapsiblePanel`, `CollapsiblePanelTogg
|
|
|
329
421
|
- [workbench.md](./docs/workbench.md): the `Workbench` multi-panel shell, its collapse policies, and opt-in `resizable` panels driven by `wireWorkbench` (`@kerfjs/ui/wire-workbench`: drag, keyboard, min/max, persistence, compact suspension), the `mainMinSize` / `mainMinHeight` work-area minimums (default 320px wide beside any inline rail, 120px tall above the drawer) that resizable panels stop at and inline panels shrink around, and a panel's `responsiveOverlayAt` (`narrow` / `compact`, rails and the bottom drawer) that presents it as an overlay below a Workbench container breakpoint without a device-class check; a panel given its `collapsed` signal is a transient overlay (collapsed on entering the breakpoint, takes focus and keeps Tab inside while open, closed by Escape or an outside press, focus returned; `dismissOverlays`), and overlays are exclusive by default (opening one closes the others; `exclusiveOverlays: false` opts out).
|
|
330
422
|
- [app-layouts.md](./docs/app-layouts.md): choosing `NavStack`/`SplitView`/`Workbench`/`TabScaffold` by data + interaction + device, and dialog presentation, plus the safe-area model (surfaces paint through unsafe areas; content pads only the edges it reaches; `Pane.safeAreaEdges` for app-owned arrangements, `Toolbar.safeAreaEdges` for an app bar or bottom bar at a screen edge).
|
|
331
423
|
- [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). The UX sidebar visibly tags superseded and exceptional Web Awesome choices as `Discouraged`; Popup remains an available conditional positioning primitive.
|
|
424
|
+
- [ai/components/README.md](./ai/components/README.md): the generated per-component markdown reference — the assistant entry point over both JSON catalogs.
|
|
332
425
|
- [component-catalog.json](./ai/component-catalog.json) + [component-catalog-extension.schema.json](./ai/component-catalog-extension.schema.json) + [catalog-authoring.json](./ai/catalog-authoring.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 selection facts, a reusable app-component extension contract, Catalog authoring discovery, and exact signatures.
|
|
333
426
|
- [compile-time-contracts-v1.json](./ai/compile-time-contracts-v1.json) + [type-contracts.md](./docs/type-contracts.md): stable compile diagnostics, packed-declaration proof, migrations, and explicit non-goals.
|
|
334
427
|
- [README.md](./README.md): package overview and the component subpath table.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kerfjs/ui",
|
|
3
|
-
"version": "5.0.0-beta.
|
|
3
|
+
"version": "5.0.0-beta.57",
|
|
4
4
|
"description": "Accessible, composable UI primitives for kerf applications.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -38,7 +38,8 @@
|
|
|
38
38
|
"**/*.css",
|
|
39
39
|
"./dist/browser/*.js",
|
|
40
40
|
"./dist/select-register.js",
|
|
41
|
-
"./dist/popup-menu-register.js"
|
|
41
|
+
"./dist/popup-menu-register.js",
|
|
42
|
+
"./dist/help-tags-register.js"
|
|
42
43
|
],
|
|
43
44
|
"exports": {
|
|
44
45
|
".": {
|
|
@@ -139,6 +140,11 @@
|
|
|
139
140
|
"browser": "./dist/browser/list-inset-text.js",
|
|
140
141
|
"import": "./dist/list-inset-text.js"
|
|
141
142
|
},
|
|
143
|
+
"./content-item": {
|
|
144
|
+
"types": "./dist/content-item.d.ts",
|
|
145
|
+
"browser": "./dist/browser/content-item.js",
|
|
146
|
+
"import": "./dist/content-item.js"
|
|
147
|
+
},
|
|
142
148
|
"./resizable-region": {
|
|
143
149
|
"types": "./dist/resizable-region.d.ts",
|
|
144
150
|
"browser": "./dist/browser/resizable-region.js",
|
|
@@ -159,6 +165,7 @@
|
|
|
159
165
|
},
|
|
160
166
|
"./catalog": {
|
|
161
167
|
"types": "./dist/catalog.d.ts",
|
|
168
|
+
"browser": "./dist/browser/catalog.js",
|
|
162
169
|
"import": "./dist/catalog.js"
|
|
163
170
|
},
|
|
164
171
|
"./catalog-resources": {
|
|
@@ -194,8 +201,13 @@
|
|
|
194
201
|
"types": "./dist/wire-tab-bars.d.ts",
|
|
195
202
|
"import": "./dist/wire-tab-bars.js"
|
|
196
203
|
},
|
|
204
|
+
"./wire-scroll-dividers": {
|
|
205
|
+
"types": "./dist/wire-scroll-dividers.d.ts",
|
|
206
|
+
"import": "./dist/wire-scroll-dividers.js"
|
|
207
|
+
},
|
|
197
208
|
"./nav-stack": {
|
|
198
209
|
"types": "./dist/nav-stack.d.ts",
|
|
210
|
+
"browser": "./dist/browser/nav-stack.js",
|
|
199
211
|
"import": "./dist/nav-stack.js"
|
|
200
212
|
},
|
|
201
213
|
"./wire-nav-stack": {
|
|
@@ -204,6 +216,7 @@
|
|
|
204
216
|
},
|
|
205
217
|
"./split-view": {
|
|
206
218
|
"types": "./dist/split-view.d.ts",
|
|
219
|
+
"browser": "./dist/browser/split-view.js",
|
|
207
220
|
"import": "./dist/split-view.js"
|
|
208
221
|
},
|
|
209
222
|
"./pane": {
|
|
@@ -213,10 +226,12 @@
|
|
|
213
226
|
},
|
|
214
227
|
"./workbench": {
|
|
215
228
|
"types": "./dist/workbench.d.ts",
|
|
229
|
+
"browser": "./dist/browser/workbench.js",
|
|
216
230
|
"import": "./dist/workbench.js"
|
|
217
231
|
},
|
|
218
232
|
"./collapsible-panel": {
|
|
219
233
|
"types": "./dist/collapsible-panel.d.ts",
|
|
234
|
+
"browser": "./dist/browser/collapsible-panel.js",
|
|
220
235
|
"import": "./dist/collapsible-panel.js"
|
|
221
236
|
},
|
|
222
237
|
"./wire-sidebar": {
|
|
@@ -225,6 +240,7 @@
|
|
|
225
240
|
},
|
|
226
241
|
"./tab-scaffold": {
|
|
227
242
|
"types": "./dist/tab-scaffold.d.ts",
|
|
243
|
+
"browser": "./dist/browser/tab-scaffold.js",
|
|
228
244
|
"import": "./dist/tab-scaffold.js"
|
|
229
245
|
},
|
|
230
246
|
"./wire-tab-scaffold": {
|
|
@@ -282,6 +298,10 @@
|
|
|
282
298
|
"types": "./dist/select-register.d.ts",
|
|
283
299
|
"import": "./dist/select-register.js"
|
|
284
300
|
},
|
|
301
|
+
"./help-tags/register": {
|
|
302
|
+
"types": "./dist/help-tags-register.d.ts",
|
|
303
|
+
"import": "./dist/help-tags-register.js"
|
|
304
|
+
},
|
|
285
305
|
"./webawesome": {
|
|
286
306
|
"types": "./dist/webawesome.d.ts",
|
|
287
307
|
"import": "./dist/webawesome.js"
|
|
@@ -328,6 +348,7 @@
|
|
|
328
348
|
"./list-header.css": "./dist/styles/list-header.css",
|
|
329
349
|
"./list-inset-control.css": "./dist/styles/list-inset-control.css",
|
|
330
350
|
"./list-inset-text.css": "./dist/styles/list-inset-text.css",
|
|
351
|
+
"./content-item.css": "./dist/styles/content-item.css",
|
|
331
352
|
"./resizable-region.css": "./dist/styles/resizable-region.css",
|
|
332
353
|
"./app-tab.css": "./dist/styles/app-tab.css",
|
|
333
354
|
"./catalog.css": "./dist/styles/catalog.css",
|
|
@@ -374,12 +395,12 @@
|
|
|
374
395
|
"format": "prettier --write . --ignore-unknown",
|
|
375
396
|
"format:css": "prettier --write \"src/**/*.css\" \"ux-demo/**/*.css\"",
|
|
376
397
|
"check:format": "prettier --check . --ignore-unknown",
|
|
377
|
-
"catalog:sync": "node scripts/sync-component-catalog.mjs && node scripts/sync-component-
|
|
378
|
-
"
|
|
398
|
+
"catalog:sync": "node scripts/sync-component-catalog.mjs && node scripts/sync-component-composition.mjs && node scripts/sync-component-docs.mjs",
|
|
399
|
+
"composition:sync": "node scripts/sync-component-composition.mjs && node scripts/sync-component-docs.mjs",
|
|
379
400
|
"check:component-integrations": "node scripts/check-component-integrations.mjs",
|
|
380
401
|
"component-integrations:dry-run": "node scripts/check-component-integrations.mjs --dry-run",
|
|
381
402
|
"check:change": "node scripts/check-ui-change.mjs",
|
|
382
|
-
"check:catalog": "node scripts/sync-component-catalog.mjs --check && node scripts/sync-component-
|
|
403
|
+
"check:catalog": "node scripts/sync-component-catalog.mjs --check && node scripts/sync-component-composition.mjs --check && node scripts/sync-component-docs.mjs --check && node scripts/check-component-catalog.mjs",
|
|
383
404
|
"check:profile": "node scripts/check-application-ui-profile.mjs",
|
|
384
405
|
"check:demo-conformance": "node scripts/check-catalog-demo-conformance.mjs",
|
|
385
406
|
"check:recipes": "node scripts/check-recipes.mjs",
|
|
@@ -391,6 +412,7 @@
|
|
|
391
412
|
"ai:compatibility:sync": "node scripts/sync-ai-compatibility.mjs --write",
|
|
392
413
|
"ai:regressions:compile": "node scripts/compile-ai-regression-response.mjs",
|
|
393
414
|
"ai:regressions:prepare": "node scripts/prepare-ai-regression.mjs",
|
|
415
|
+
"ai:regressions:measure-context": "node scripts/measure-ai-regression-context.mjs",
|
|
394
416
|
"ai:regressions:record": "node scripts/record-ai-regression-run.mjs",
|
|
395
417
|
"ai:regressions:record-v3": "node scripts/record-ai-regression-run-v3.mjs",
|
|
396
418
|
"ai:regressions:replay-v3": "node scripts/replay-ai-regression-run-v3.mjs",
|
|
@@ -399,12 +421,13 @@
|
|
|
399
421
|
"lint:eslint": "eslint src tests ux-demo docs/examples --max-warnings 0",
|
|
400
422
|
"lint": "npm run lint:eslint && npm run check:format",
|
|
401
423
|
"typecheck": "node node_modules/typescript7/bin/tsc --noEmit",
|
|
402
|
-
"test": "npm run test:unit && npm run test:bundle && npm run test:analyzer && npm run test:doctor && npm run test:evaluator",
|
|
424
|
+
"test": "npm run test:unit && npm run test:bundle && npm run test:analyzer && npm run test:doctor && npm run test:evaluator && npm run test:ai-regressions",
|
|
403
425
|
"test:unit": "vitest run tests/unit --coverage",
|
|
404
426
|
"test:bundle": "npm run build && vitest run tests/bundle",
|
|
405
427
|
"test:analyzer": "vitest run tests/integration/ui-analyzer-downstream.test.ts",
|
|
406
428
|
"test:doctor": "vitest run tests/unit/ui-doctor.test.ts tests/integration/ui-doctor-downstream.test.ts",
|
|
407
429
|
"test:evaluator": "vitest run tests/unit/ui-evaluator.test.ts tests/integration/ui-evaluator-downstream.test.ts",
|
|
430
|
+
"test:ai-regressions": "vitest run tests/integration/ai-regressions-v3.test.ts",
|
|
408
431
|
"test:contract-types:source": "node node_modules/typescript7/bin/tsc -p tests/consumer-types/contracts/tsconfig.source.json",
|
|
409
432
|
"test:contract-types:packed": "node scripts/check-packed-type-contracts.mjs",
|
|
410
433
|
"test:consumer-types": "npm run test:contract-types:source && npm run build && node node_modules/typescript7/bin/tsc -p tests/consumer-types/webawesome/tsconfig.json && npm run test:contract-types:packed",
|
|
@@ -7,6 +7,7 @@ import {
|
|
|
7
7
|
CollapsiblePanelRelocated,
|
|
8
8
|
type CollapsiblePanelToolbar,
|
|
9
9
|
} from '@kerfjs/ui/collapsible-panel';
|
|
10
|
+
import { ContentItem } from '@kerfjs/ui/content-item';
|
|
10
11
|
import { deviceClass } from '@kerfjs/ui/device-class';
|
|
11
12
|
import { FloatingToolbar } from '@kerfjs/ui/floating-toolbar';
|
|
12
13
|
import { Grid } from '@kerfjs/ui/grid';
|
|
@@ -133,7 +134,6 @@ export const createRecipe: RecipeFactory = (announce) => {
|
|
|
133
134
|
header={
|
|
134
135
|
<Toolbar
|
|
135
136
|
label="Current navigation view"
|
|
136
|
-
dividerSides=""
|
|
137
137
|
leading={
|
|
138
138
|
<>
|
|
139
139
|
<CollapsiblePanelRelocated
|
|
@@ -152,7 +152,7 @@ export const createRecipe: RecipeFactory = (announce) => {
|
|
|
152
152
|
/>
|
|
153
153
|
}
|
|
154
154
|
>
|
|
155
|
-
<
|
|
155
|
+
<ContentItem>
|
|
156
156
|
<List gap="2xs">
|
|
157
157
|
<Text variant="span">
|
|
158
158
|
<strong>Narrow the window to a compact width</strong>
|
|
@@ -162,7 +162,7 @@ export const createRecipe: RecipeFactory = (announce) => {
|
|
|
162
162
|
a backdrop, Escape, and a trapped Tab ring, all managed by the wire.
|
|
163
163
|
</Text>
|
|
164
164
|
</List>
|
|
165
|
-
</
|
|
165
|
+
</ContentItem>
|
|
166
166
|
</Pane>
|
|
167
167
|
);
|
|
168
168
|
|
|
@@ -114,7 +114,6 @@ export const createRecipe: RecipeFactory = (announce) => {
|
|
|
114
114
|
header={
|
|
115
115
|
<Toolbar
|
|
116
116
|
label="Recent projects"
|
|
117
|
-
dividerSides=""
|
|
118
117
|
leading={<ToolbarText text="Recent projects" />}
|
|
119
118
|
/>
|
|
120
119
|
}
|
|
@@ -131,7 +130,6 @@ export const createRecipe: RecipeFactory = (announce) => {
|
|
|
131
130
|
header={
|
|
132
131
|
<Toolbar
|
|
133
132
|
label="Project details"
|
|
134
|
-
dividerSides=""
|
|
135
133
|
leading={
|
|
136
134
|
<ToolbarText
|
|
137
135
|
text={record.name}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import '@kerfjs/ui/layout.css';
|
|
2
2
|
|
|
3
|
+
import { ContentItem } from '@kerfjs/ui/content-item';
|
|
3
4
|
import { List } from '@kerfjs/ui/list';
|
|
4
5
|
import { ListHeader } from '@kerfjs/ui/list-header';
|
|
5
6
|
import { ListItem } from '@kerfjs/ui/list-item';
|
|
@@ -120,7 +121,7 @@ export const createRecipe: RecipeFactory = (announce) => {
|
|
|
120
121
|
disabled
|
|
121
122
|
title="Available to administrators"
|
|
122
123
|
/>
|
|
123
|
-
<
|
|
124
|
+
<ContentItem>
|
|
124
125
|
<List gap="2xs">
|
|
125
126
|
<Text variant="span">
|
|
126
127
|
<strong>Quarterly goal</strong>
|
|
@@ -129,7 +130,7 @@ export const createRecipe: RecipeFactory = (announce) => {
|
|
|
129
130
|
Ship accessible navigation patterns to every workspace.
|
|
130
131
|
</Text>
|
|
131
132
|
</List>
|
|
132
|
-
</
|
|
133
|
+
</ContentItem>
|
|
133
134
|
</>
|
|
134
135
|
)}
|
|
135
136
|
</section>
|