@kerfjs/ui 5.0.0-beta.8 → 5.0.0-beta.80
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 +546 -139
- package/ai/application-ui-diagnostic-ids-v1.json +113 -0
- package/ai/application-ui-profile-sync.cjs +548 -0
- package/ai/application-ui-profile.d.mts +1 -0
- package/ai/application-ui-profile.d.ts +106 -0
- package/ai/application-ui-profile.defaults.json +96 -0
- package/ai/application-ui-profile.mjs +653 -0
- package/ai/application-ui-profile.schema.json +140 -0
- package/ai/catalog-authoring.json +36 -0
- package/ai/catalog-authoring.schema.json +109 -0
- package/ai/compile-time-contracts-v1.json +149 -0
- package/ai/compile-time-contracts-v1.schema.json +52 -0
- package/ai/component-catalog-extension.schema.json +104 -0
- package/ai/component-catalog.json +4280 -457
- package/ai/component-catalog.schema.json +94 -1
- 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-composition-rules.json +516 -0
- package/ai/component-composition.d.ts +129 -0
- package/ai/component-composition.json +7397 -0
- package/ai/component-composition.schema.json +408 -0
- package/ai/components/README.md +171 -0
- package/ai/components/application-tabs.md +65 -0
- package/ai/components/badge.md +72 -0
- package/ai/components/chip.md +72 -0
- package/ai/components/collapsible-panel.md +102 -0
- package/ai/components/content-item.md +96 -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 +82 -0
- package/ai/components/foundation.md +65 -0
- package/ai/components/grid.md +100 -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 +91 -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 +94 -0
- package/ai/components/list.md +106 -0
- package/ai/components/loading-spinner.md +73 -0
- package/ai/components/lucide-icon.md +97 -0
- package/ai/components/nav-stack.md +105 -0
- package/ai/components/pane.md +104 -0
- package/ai/components/popup-menu.md +171 -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 +106 -0
- package/ai/components/row.md +96 -0
- package/ai/components/segmented-control.md +82 -0
- package/ai/components/select.md +115 -0
- package/ai/components/skeleton.md +84 -0
- package/ai/components/spacer.md +86 -0
- package/ai/components/split-view.md +103 -0
- package/ai/components/state-banner.md +94 -0
- package/ai/components/sunken-panel.md +79 -0
- package/ai/components/surface-scaffold.md +87 -0
- package/ai/components/tab-bar.md +113 -0
- package/ai/components/tab-navigator.md +95 -0
- package/ai/components/tabs.md +95 -0
- package/ai/components/text.md +87 -0
- package/ai/components/token-search-field.md +107 -0
- package/ai/components/toolbar-control-group.md +121 -0
- package/ai/components/toolbar-text.md +98 -0
- package/ai/components/toolbar.md +101 -0
- package/ai/components/value-table.md +73 -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 +119 -0
- package/ai/public-api-signatures-v1.md +2821 -250
- package/ai/skill.md +354 -66
- package/ai/webawesome-jsx-signatures-v1.md +9 -2
- package/analyzer/cli.mjs +49 -0
- package/analyzer/component-ownership.d.mts +72 -0
- package/analyzer/component-ownership.mjs +429 -0
- package/analyzer/index.d.mts +53 -0
- package/analyzer/index.mjs +2346 -0
- package/analyzer/loud-pairs.d.mts +49 -0
- package/analyzer/loud-pairs.mjs +357 -0
- package/analyzer/report.schema.json +66 -0
- package/analyzer/selectors.d.mts +21 -0
- package/analyzer/selectors.mjs +212 -0
- package/catalog-projection-cli.mjs +96 -0
- package/catalog-projection.d.mts +55 -0
- package/catalog-projection.mjs +62 -0
- package/dist/app-tab.d.ts +39 -4
- package/dist/app-tab.js +2 -1
- package/dist/badge.d.ts +54 -0
- package/dist/badge.js +3 -0
- package/dist/badge.js.map +1 -0
- package/dist/browser/badge.js +3 -0
- package/dist/browser/catalog.js +26 -0
- package/dist/browser/chip.js +3 -0
- package/dist/browser/collapsible-panel.js +9 -0
- package/dist/browser/content-item.js +3 -0
- package/dist/browser/floating-toolbar.js +3 -0
- package/dist/browser/grid.js +3 -0
- package/dist/browser/list-action-row.js +5 -0
- package/dist/browser/{menu-header.js → list-header.js} +5 -3
- package/dist/browser/list-inset-control.js +3 -0
- package/dist/browser/list-inset-text.js +3 -0
- package/dist/browser/list-item.js +5 -0
- package/dist/browser/list.js +3 -0
- package/dist/browser/nav-stack.js +11 -0
- package/dist/browser/pane.js +3 -0
- package/dist/browser/popup-menu.js +3 -0
- package/dist/browser/row.js +3 -0
- package/dist/browser/segmented-control.js +0 -1
- package/dist/browser/select.js +2 -1
- package/dist/browser/spacer.js +3 -0
- package/dist/browser/split-view.js +13 -0
- package/dist/browser/state-banner.js +1 -0
- package/dist/browser/sunken-panel.js +3 -0
- package/dist/browser/surface-scaffold.js +3 -0
- package/dist/browser/tab-navigator.js +4 -0
- package/dist/browser/text.js +3 -0
- package/dist/browser/toolbar-control-group.js +1 -0
- package/dist/browser/workbench.js +14 -0
- package/dist/catalog-resources.d.ts +48 -0
- package/dist/catalog-resources.js +22 -0
- package/dist/catalog-resources.js.map +1 -0
- package/dist/catalog.d.ts +92 -0
- package/dist/catalog.js +541 -0
- package/dist/catalog.js.map +1 -0
- package/dist/chip.d.ts +36 -0
- package/dist/chip.js +3 -0
- package/dist/chip.js.map +1 -0
- package/dist/chunk-2GOCOLQL.js +270 -0
- package/dist/chunk-2GOCOLQL.js.map +1 -0
- package/dist/chunk-3CXRQAYT.js +288 -0
- package/dist/chunk-3CXRQAYT.js.map +1 -0
- package/dist/chunk-3RE2JMZU.js +48 -0
- package/dist/chunk-3RE2JMZU.js.map +1 -0
- package/dist/chunk-3SXWV2IR.js +295 -0
- package/dist/chunk-3SXWV2IR.js.map +1 -0
- package/dist/chunk-3XPGJUUQ.js +37 -0
- package/dist/chunk-3XPGJUUQ.js.map +1 -0
- package/dist/chunk-4Y4L5YEI.js +66 -0
- package/dist/chunk-4Y4L5YEI.js.map +1 -0
- package/dist/chunk-5BZBIRQG.js +452 -0
- package/dist/chunk-5BZBIRQG.js.map +1 -0
- package/dist/chunk-5D3WDMIK.js +71 -0
- package/dist/chunk-5D3WDMIK.js.map +1 -0
- package/dist/chunk-62VMNBV2.js +779 -0
- package/dist/chunk-62VMNBV2.js.map +1 -0
- package/dist/chunk-75I3SNUJ.js +44 -0
- package/dist/chunk-75I3SNUJ.js.map +1 -0
- package/dist/chunk-7QQ3HE47.js +17 -0
- package/dist/chunk-7QQ3HE47.js.map +1 -0
- package/dist/chunk-7TE6XDFI.js +91 -0
- package/dist/chunk-7TE6XDFI.js.map +1 -0
- package/dist/chunk-A7DYEERU.js +59 -0
- package/dist/chunk-A7DYEERU.js.map +1 -0
- package/dist/chunk-AN5IWMTM.js +24 -0
- package/dist/chunk-AN5IWMTM.js.map +1 -0
- package/dist/chunk-ARZ4RSQO.js +48 -0
- package/dist/chunk-ARZ4RSQO.js.map +1 -0
- package/dist/chunk-BJLXE56E.js +135 -0
- package/dist/chunk-BJLXE56E.js.map +1 -0
- package/dist/chunk-BYHGRKC3.js +44 -0
- package/dist/chunk-BYHGRKC3.js.map +1 -0
- package/dist/chunk-CEJ5FK6G.js +288 -0
- package/dist/chunk-CEJ5FK6G.js.map +1 -0
- package/dist/chunk-CVKIADIS.js +172 -0
- package/dist/chunk-CVKIADIS.js.map +1 -0
- package/dist/chunk-DQDTZE4W.js +70 -0
- package/dist/chunk-DQDTZE4W.js.map +1 -0
- package/dist/chunk-EFDCALR3.js +66 -0
- package/dist/chunk-EFDCALR3.js.map +1 -0
- package/dist/chunk-FL6J644M.js +116 -0
- package/dist/chunk-FL6J644M.js.map +1 -0
- package/dist/chunk-GS2QD3N7.js +14 -0
- package/dist/chunk-GS2QD3N7.js.map +1 -0
- package/dist/chunk-H45DAZBL.js +491 -0
- package/dist/chunk-H45DAZBL.js.map +1 -0
- package/dist/chunk-H7ZJEI3H.js +52 -0
- package/dist/chunk-H7ZJEI3H.js.map +1 -0
- package/dist/chunk-HFLGWMG3.js +138 -0
- package/dist/chunk-HFLGWMG3.js.map +1 -0
- package/dist/chunk-HFQDSSED.js +188 -0
- package/dist/chunk-HFQDSSED.js.map +1 -0
- package/dist/{chunk-56RJXPHG.js → chunk-I4SDIMFA.js} +7 -4
- package/dist/chunk-I4SDIMFA.js.map +1 -0
- package/dist/chunk-IM3GKYOG.js +202 -0
- package/dist/chunk-IM3GKYOG.js.map +1 -0
- package/dist/chunk-J3AWE5I4.js +50 -0
- package/dist/chunk-J3AWE5I4.js.map +1 -0
- package/dist/chunk-JOR5LGYE.js +55 -0
- package/dist/chunk-JOR5LGYE.js.map +1 -0
- package/dist/chunk-JZM3G6RT.js +149 -0
- package/dist/chunk-JZM3G6RT.js.map +1 -0
- package/dist/{chunk-7BR3DO2A.js → chunk-LAZLBC2Q.js} +14 -5
- package/dist/chunk-LAZLBC2Q.js.map +1 -0
- package/dist/chunk-LQKY5S4F.js +506 -0
- package/dist/chunk-LQKY5S4F.js.map +1 -0
- package/dist/chunk-LRAIS3YB.js +158 -0
- package/dist/chunk-LRAIS3YB.js.map +1 -0
- package/dist/chunk-MXNIVEVL.js +48 -0
- package/dist/chunk-MXNIVEVL.js.map +1 -0
- package/dist/chunk-NJZMR7HM.js +135 -0
- package/dist/chunk-NJZMR7HM.js.map +1 -0
- package/dist/chunk-NMWDHZVM.js +35 -0
- package/dist/chunk-NMWDHZVM.js.map +1 -0
- package/dist/{chunk-YGN7OMLT.js → chunk-NS2TBYM4.js} +8 -5
- package/dist/chunk-NS2TBYM4.js.map +1 -0
- package/dist/chunk-NVKRZ5DI.js +222 -0
- package/dist/chunk-NVKRZ5DI.js.map +1 -0
- package/dist/chunk-NVRJ7C3W.js +83 -0
- package/dist/chunk-NVRJ7C3W.js.map +1 -0
- package/dist/chunk-O27D24CA.js +250 -0
- package/dist/chunk-O27D24CA.js.map +1 -0
- package/dist/chunk-PQQQXJGV.js +58 -0
- package/dist/chunk-PQQQXJGV.js.map +1 -0
- package/dist/chunk-RRCD3A6G.js +139 -0
- package/dist/chunk-RRCD3A6G.js.map +1 -0
- package/dist/chunk-S3ECMF23.js +33 -0
- package/dist/chunk-S3ECMF23.js.map +1 -0
- package/dist/chunk-S4ZGTDSG.js +18 -0
- package/dist/chunk-S4ZGTDSG.js.map +1 -0
- package/dist/chunk-VHXHLZ6R.js +69 -0
- package/dist/chunk-VHXHLZ6R.js.map +1 -0
- package/dist/chunk-VIGVNDXZ.js +165 -0
- package/dist/chunk-VIGVNDXZ.js.map +1 -0
- package/dist/chunk-VR7MWD2X.js +91 -0
- package/dist/chunk-VR7MWD2X.js.map +1 -0
- package/dist/chunk-Y6KT7ZTR.js +109 -0
- package/dist/chunk-Y6KT7ZTR.js.map +1 -0
- package/dist/chunk-YLJ6X3AC.js +34 -0
- package/dist/chunk-YLJ6X3AC.js.map +1 -0
- package/dist/collapsible-panel.d.ts +137 -0
- package/dist/collapsible-panel.js +135 -0
- package/dist/collapsible-panel.js.map +1 -0
- package/dist/content-item.d.ts +99 -0
- package/dist/content-item.js +4 -0
- package/dist/content-item.js.map +1 -0
- package/dist/css-values.d.ts +112 -0
- package/dist/css-values.js +3 -0
- package/dist/css-values.js.map +1 -0
- package/dist/device-class.js +34 -6
- package/dist/device-class.js.map +1 -1
- package/dist/disclosure-arrow.d.ts +6 -1
- package/dist/disclosure-arrow.js +2 -1
- package/dist/empty-state.d.ts +5 -2
- package/dist/empty-state.js +2 -1
- package/dist/flex-alignment-4ms8ZbV8.d.ts +5 -0
- package/dist/floating-toolbar.d.ts +51 -0
- package/dist/floating-toolbar.js +3 -0
- package/dist/floating-toolbar.js.map +1 -0
- package/dist/grid.d.ts +57 -0
- package/dist/grid.js +5 -0
- package/dist/grid.js.map +1 -0
- 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 +40 -18
- package/dist/index.js +44 -23
- package/dist/{menu-action-row.d.ts → list-action-row.d.ts} +21 -9
- package/dist/list-action-row.js +8 -0
- package/dist/list-action-row.js.map +1 -0
- package/dist/list-header.d.ts +98 -0
- package/dist/list-header.js +10 -0
- package/dist/list-header.js.map +1 -0
- package/dist/list-inset-control.d.ts +22 -0
- package/dist/list-inset-control.js +3 -0
- package/dist/list-inset-control.js.map +1 -0
- package/dist/list-inset-text.d.ts +30 -0
- package/dist/list-inset-text.js +4 -0
- package/dist/list-inset-text.js.map +1 -0
- package/dist/list-item.d.ts +62 -0
- package/dist/list-item.js +8 -0
- package/dist/list-item.js.map +1 -0
- package/dist/list.d.ts +63 -0
- package/dist/list.js +6 -0
- package/dist/list.js.map +1 -0
- package/dist/loading-spinner.d.ts +12 -2
- package/dist/loading-spinner.js +2 -1
- package/dist/lucide-icon.d.ts +14 -2
- package/dist/lucide-icon.js +2 -1
- package/dist/nav-stack-B1Qc2e5q.d.ts +101 -0
- package/dist/nav-stack.d.ts +13 -38
- package/dist/nav-stack.js +10 -1
- package/dist/pane.d.ts +116 -0
- package/dist/pane.js +4 -0
- package/dist/pane.js.map +1 -0
- package/dist/panel-toolbar-CL9tYOkh.d.ts +72 -0
- package/dist/popup-menu-register.d.ts +9 -0
- package/dist/popup-menu-register.js +244 -0
- package/dist/popup-menu-register.js.map +1 -0
- package/dist/popup-menu.d.ts +100 -0
- package/dist/popup-menu.js +3 -0
- package/dist/popup-menu.js.map +1 -0
- package/dist/resizable-region.d.ts +32 -3
- package/dist/resizable-region.js +1 -1
- package/dist/row.d.ts +48 -0
- package/dist/row.js +6 -0
- package/dist/row.js.map +1 -0
- package/dist/segmented-control.d.ts +12 -9
- package/dist/segmented-control.js +1 -2
- package/dist/select-register.d.ts +5 -1
- package/dist/select-register.js +247 -3
- package/dist/select-register.js.map +1 -1
- package/dist/select.d.ts +103 -8
- package/dist/select.js +3 -1
- package/dist/semantic-content-BbzjvSu9.d.ts +14 -0
- package/dist/semantic-tone-CdW013KF.d.ts +4 -0
- package/dist/sides-BPSWde0A.d.ts +4 -0
- package/dist/skeleton.d.ts +14 -7
- package/dist/skeleton.js +2 -1
- package/dist/spacer.d.ts +18 -0
- package/dist/spacer.js +4 -0
- package/dist/spacer.js.map +1 -0
- package/dist/split-view.d.ts +44 -7
- package/dist/split-view.js +124 -10
- package/dist/split-view.js.map +1 -1
- package/dist/state-banner.d.ts +21 -7
- package/dist/state-banner.js +3 -1
- package/dist/styles/app-tab.css +224 -0
- package/dist/styles/badge.css +118 -0
- package/dist/styles/catalog/components/catalog-example-stack.css +9 -0
- package/dist/styles/catalog/components/catalog-example.css +168 -0
- package/dist/styles/catalog/components/catalog-stage.css +55 -0
- package/dist/styles/catalog/components/catalog.css +50 -0
- package/dist/styles/catalog.css +5 -0
- package/dist/styles/chip.css +138 -0
- package/dist/styles/collapsible-panel.css +580 -0
- package/dist/styles/components/actions/floating-toolbar/floating-toolbar.css +119 -0
- package/dist/styles/components/actions/popup-menu/popup-menu.css +285 -0
- package/dist/styles/components/actions/toolbar/toolbar.css +417 -0
- package/dist/styles/components/actions/toolbar-control-group/toolbar-control-group.css +891 -0
- package/dist/styles/components/actions/toolbar-text/toolbar-text.css +171 -0
- package/dist/styles/components/collections/list/list.css +133 -0
- package/dist/styles/components/collections/list-action-row/list-action-row.css +258 -0
- package/dist/styles/components/collections/list-header/list-header.css +229 -0
- package/dist/styles/components/collections/list-inset-control/list-inset-control.css +30 -0
- package/dist/styles/components/collections/list-inset-text/list-inset-text.css +29 -0
- package/dist/styles/components/collections/list-item/list-item.css +255 -0
- package/dist/styles/components/data-display/value-table/value-table.css +105 -0
- package/dist/styles/components/feedback/badge/badge.css +118 -0
- package/dist/styles/components/feedback/chip/chip.css +138 -0
- package/dist/styles/components/feedback/empty-state/empty-state.css +47 -0
- package/dist/styles/components/feedback/loading-spinner/loading-spinner.css +25 -0
- package/dist/styles/components/feedback/skeleton/skeleton.css +92 -0
- package/dist/styles/components/feedback/state-banner/state-banner.css +248 -0
- package/dist/styles/components/forms/segmented-control/segmented-control.css +196 -0
- package/dist/styles/components/forms/select/select.css +454 -0
- package/dist/styles/components/forms/token-search-field/token-search-field.css +392 -0
- package/dist/styles/components/layout/collapsible-panel/collapsible-panel.css +580 -0
- package/dist/styles/components/layout/grid/grid.css +85 -0
- package/dist/styles/components/layout/pane/pane.css +294 -0
- package/dist/styles/components/layout/resizable-region/resizable-region.css +545 -0
- package/dist/styles/components/layout/row/row.css +111 -0
- package/dist/styles/components/layout/spacer/spacer.css +11 -0
- package/dist/styles/components/layout/split-view/split-view.css +146 -0
- package/dist/styles/components/layout/workbench/workbench.css +1075 -0
- package/dist/styles/components/media/lucide-icon/lucide-icon.css +15 -0
- package/dist/styles/components/navigation/app-tab/app-tab.css +376 -0
- package/dist/styles/components/navigation/disclosure-arrow/disclosure-arrow.css +23 -0
- package/dist/styles/components/navigation/nav-stack/nav-stack.css +242 -0
- package/dist/styles/components/navigation/tab-bar/tab-bar.css +183 -0
- package/dist/styles/components/navigation/tab-navigator/tab-navigator.css +237 -0
- package/dist/styles/components/surfaces/content-item/content-item.css +120 -0
- package/dist/styles/components/surfaces/sunken-panel/sunken-panel.css +34 -0
- package/dist/styles/components/surfaces/surface-scaffold/surface-scaffold.css +111 -0
- package/dist/styles/components/typography/text/text.css +158 -0
- package/dist/styles/content-item.css +120 -0
- package/dist/styles/document.css +33 -0
- package/dist/styles/floating-toolbar.css +119 -0
- package/dist/styles/foundation.css +187 -45
- package/dist/styles/grid.css +85 -0
- package/dist/styles/layout.css +3 -41
- package/dist/styles/list-action-row.css +258 -0
- package/dist/styles/list-header.css +229 -0
- package/dist/styles/list-inset-control.css +30 -0
- package/dist/styles/list-inset-text.css +29 -0
- package/dist/styles/list-item.css +255 -0
- package/dist/styles/list.css +133 -0
- package/dist/styles/loading-spinner.css +4 -0
- package/dist/styles/lucide-icon.css +9 -0
- package/dist/styles/nav-stack.css +180 -50
- package/dist/styles/pane.css +294 -0
- package/dist/styles/popup-menu.css +285 -0
- package/dist/styles/resizable-region.css +438 -4
- package/dist/styles/row.css +111 -0
- package/dist/styles/segmented-control.css +36 -9
- package/dist/styles/select.css +337 -21
- package/dist/styles/skeleton.css +64 -3
- package/dist/styles/spacer.css +11 -0
- package/dist/styles/split-view.css +114 -3
- package/dist/styles/state-banner.css +94 -19
- package/dist/styles/styles.css +13 -4
- package/dist/styles/sunken-panel.css +34 -0
- package/dist/styles/surface-scaffold.css +111 -0
- package/dist/styles/tab-bar.css +147 -9
- package/dist/styles/tab-navigator.css +237 -0
- package/dist/styles/text.css +158 -0
- package/dist/styles/token-search-field.css +167 -56
- package/dist/styles/toolbar-control-group.css +710 -30
- package/dist/styles/toolbar-text.css +139 -8
- package/dist/styles/toolbar.css +367 -11
- package/dist/styles/value-table.css +34 -4
- package/dist/styles/webawesome.css +388 -16
- package/dist/styles/workbench.css +988 -7
- package/dist/sunken-panel.d.ts +31 -0
- package/dist/sunken-panel.js +3 -0
- package/dist/sunken-panel.js.map +1 -0
- package/dist/surface-scaffold-register.d.ts +4 -0
- package/dist/surface-scaffold-register.js +59 -0
- package/dist/surface-scaffold-register.js.map +1 -0
- package/dist/surface-scaffold.d.ts +38 -0
- package/dist/surface-scaffold.js +3 -0
- package/dist/surface-scaffold.js.map +1 -0
- package/dist/tab-bar.d.ts +39 -6
- package/dist/tab-bar.js +1 -1
- package/dist/tab-navigator.d.ts +86 -0
- package/dist/tab-navigator.js +95 -0
- package/dist/tab-navigator.js.map +1 -0
- package/dist/text.d.ts +63 -0
- package/dist/text.js +3 -0
- package/dist/text.js.map +1 -0
- package/dist/token-search-field.d.ts +3 -43
- package/dist/token-search-field.js +2 -1
- package/dist/token-search-model-DTcTXWMS.d.ts +154 -0
- package/dist/token-search-model.d.ts +3 -0
- package/dist/token-search-model.js +3 -0
- package/dist/token-search-model.js.map +1 -0
- package/dist/toolbar-control-group.d.ts +89 -7
- package/dist/toolbar-control-group.js +3 -1
- package/dist/toolbar-text.d.ts +45 -9
- package/dist/toolbar-text.js +2 -1
- package/dist/toolbar.d.ts +59 -7
- package/dist/toolbar.js +1 -1
- package/dist/types-C9BubXfz.d.ts +117 -0
- package/dist/value-table.d.ts +11 -3
- package/dist/value-table.js +2 -1
- package/dist/webawesome.d.ts +8 -1
- package/dist/wire-catalog.d.ts +82 -0
- package/dist/wire-catalog.js +407 -0
- package/dist/wire-catalog.js.map +1 -0
- package/dist/wire-content-items.d.ts +11 -0
- package/dist/wire-content-items.js +114 -0
- package/dist/wire-content-items.js.map +1 -0
- package/dist/wire-nav-stack.d.ts +4 -1
- package/dist/wire-nav-stack.js +191 -15
- package/dist/wire-nav-stack.js.map +1 -1
- package/dist/wire-resizable-regions.d.ts +2 -1
- package/dist/wire-resizable-regions.js +2 -1
- package/dist/wire-scroll-dividers.d.ts +72 -0
- package/dist/wire-scroll-dividers.js +3 -0
- package/dist/wire-scroll-dividers.js.map +1 -0
- package/dist/wire-sidebar.d.ts +63 -0
- package/dist/wire-sidebar.js +231 -0
- package/dist/wire-sidebar.js.map +1 -0
- package/dist/wire-tab-bars.d.ts +19 -2
- package/dist/wire-tab-bars.js +1 -1
- package/dist/wire-tab-navigator.d.ts +11 -0
- package/dist/wire-tab-navigator.js +21 -0
- package/dist/wire-tab-navigator.js.map +1 -0
- package/dist/wire-token-search-fields.d.ts +65 -3
- package/dist/wire-token-search-fields.js +2 -1
- package/dist/wire-toolbar-visibility.d.ts +13 -0
- package/dist/wire-toolbar-visibility.js +3 -0
- package/dist/wire-toolbar-visibility.js.map +1 -0
- package/dist/wire-workbench.d.ts +116 -0
- package/dist/wire-workbench.js +6 -0
- package/dist/wire-workbench.js.map +1 -0
- package/dist/workbench.d.ts +246 -9
- package/dist/workbench.js +17 -15
- package/dist/workbench.js.map +1 -1
- package/docs/accessibility.md +497 -26
- package/docs/app-layouts.md +141 -10
- package/docs/apple-hig.md +1 -0
- package/docs/catalog.md +493 -0
- package/docs/collapsible-panel.md +382 -0
- package/docs/component-contract.md +736 -61
- package/docs/component-integration.md +75 -0
- package/docs/component-selection.md +617 -97
- 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 +1 -0
- package/docs/design/templates/empty-state.svg +1 -0
- package/docs/design/templates/list/compact-dark.svg +1 -0
- package/docs/design/templates/list/compact.svg +1 -0
- package/docs/design/templates/list/stack-dark.svg +1 -0
- package/docs/design/templates/list/stack.svg +1 -0
- package/docs/design/templates/list-action-row/default-dark.svg +1 -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 +1 -0
- package/docs/design/templates/list-action-row.svg +1 -0
- package/docs/design/templates/list-dark.svg +1 -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/inline-action-dark.svg +1 -0
- package/docs/design/templates/list-header/inline-action.svg +1 -0
- package/docs/design/templates/list-header/size-l-dark.svg +1 -0
- package/docs/design/templates/list-header/size-l.svg +1 -0
- package/docs/design/templates/list-header/size-m-dark.svg +1 -0
- package/docs/design/templates/list-header/size-m.svg +1 -0
- package/docs/design/templates/list-header/size-xl-dark.svg +1 -0
- package/docs/design/templates/list-header/size-xl.svg +1 -0
- package/docs/design/templates/list-header/size-xs-dark.svg +1 -0
- package/docs/design/templates/list-header/size-xs.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 +1 -0
- package/docs/design/templates/list-header.svg +1 -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 +1 -0
- package/docs/design/templates/list-item.svg +1 -0
- package/docs/design/templates/list.svg +1 -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 +1 -0
- package/docs/design/templates/segmented-control.svg +1 -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 +1 -0
- package/docs/design/templates/skeleton.svg +1 -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-badge-dark.svg +1 -0
- package/docs/design/templates/state-banner/info-badge.svg +1 -0
- package/docs/design/templates/state-banner/info-dark.svg +1 -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 +1 -0
- package/docs/design/templates/state-banner.svg +1 -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 +1 -0
- package/docs/design/templates/tab-bar.svg +1 -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 +1 -0
- package/docs/design/templates/token-search-field.svg +1 -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/width-visibility-320-dark.svg +1 -0
- package/docs/design/templates/toolbar/width-visibility-320.svg +1 -0
- package/docs/design/templates/toolbar/width-visibility-600-dark.svg +1 -0
- package/docs/design/templates/toolbar/width-visibility-600.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/icon-tile-brand-dark.svg +1 -0
- package/docs/design/templates/toolbar-control-group/icon-tile-brand.svg +1 -0
- package/docs/design/templates/toolbar-control-group/icon-tile-danger-dark.svg +1 -0
- package/docs/design/templates/toolbar-control-group/icon-tile-danger.svg +1 -0
- package/docs/design/templates/toolbar-control-group/icon-tile-neutral-dark.svg +1 -0
- package/docs/design/templates/toolbar-control-group/icon-tile-neutral.svg +1 -0
- package/docs/design/templates/toolbar-control-group/icon-tile-success-dark.svg +1 -0
- package/docs/design/templates/toolbar-control-group/icon-tile-success.svg +1 -0
- package/docs/design/templates/toolbar-control-group/icon-tile-warning-dark.svg +1 -0
- package/docs/design/templates/toolbar-control-group/icon-tile-warning.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 +1 -0
- package/docs/design/templates/toolbar-control-group.svg +1 -0
- package/docs/design/templates/toolbar-dark.svg +1 -0
- package/docs/design/templates/toolbar-text/dark-tone-dark.svg +1 -0
- package/docs/design/templates/toolbar-text/dark-tone.svg +1 -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 +1 -0
- package/docs/design/templates/toolbar-text.svg +1 -0
- package/docs/design/templates/toolbar.svg +1 -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 +1 -0
- package/docs/design/templates/value-table.svg +1 -0
- package/docs/design/templates.md +140 -0
- package/docs/design-philosophy.md +48 -20
- package/docs/device-class.md +10 -9
- package/docs/document-baseline.md +42 -0
- package/docs/examples/application-ui-profile.json +60 -0
- package/docs/examples/command-palette-adapter.tsx +69 -17
- package/docs/examples/component-catalog-extension.json +52 -0
- package/docs/examples/component-composition-extension.json +80 -0
- package/docs/layout.md +601 -59
- package/docs/nav-stack.md +154 -14
- package/docs/recipes.md +142 -55
- package/docs/split-view.md +77 -6
- package/docs/sunken-panel.md +93 -0
- package/docs/surface-scaffold.md +74 -0
- package/docs/tab-navigator.md +210 -0
- package/docs/type-contracts.md +135 -0
- package/docs/ui-analyzer.md +404 -0
- package/docs/ui-doctor.md +202 -0
- package/docs/ui-evaluator.md +139 -0
- package/docs/ux-demo.md +46 -16
- package/docs/webawesome-theme.md +188 -16
- package/docs/workbench.md +621 -12
- package/doctor/cli.mjs +120 -0
- package/doctor/component-style-checks.mjs +457 -0
- package/doctor/config.schema.json +94 -0
- package/doctor/eslint-diagnostics.d.mts +24 -0
- package/doctor/eslint-diagnostics.mjs +24 -0
- package/doctor/index.d.mts +122 -0
- package/doctor/index.mjs +1403 -0
- package/doctor/report.schema.json +118 -0
- package/evaluator/cli.mjs +89 -0
- package/evaluator/index.d.mts +90 -0
- package/evaluator/index.mjs +1203 -0
- package/evaluator/report.schema.json +152 -0
- package/llms.txt +510 -49
- package/package.json +266 -44
- package/scripts/component-catalog-extension-validation.mjs +28 -0
- package/traversal-exclusions.mjs +27 -0
- package/ux-demo/recipes/app-shell.tsx +205 -17
- package/ux-demo/recipes/collapsible-sidebar.tsx +260 -0
- package/ux-demo/recipes/compact-toolbar.tsx +135 -14
- package/ux-demo/recipes/composer-form.tsx +133 -21
- package/ux-demo/recipes/list-detail-dialog.tsx +286 -0
- package/ux-demo/recipes/list-workspace-states.tsx +183 -11
- package/ux-demo/recipes/loaders.ts +15 -5
- package/ux-demo/recipes/loading-inspector.tsx +204 -0
- package/ux-demo/recipes/mount-recipe.ts +28 -10
- package/ux-demo/recipes/navigation-sidebar.tsx +139 -13
- package/ux-demo/recipes/navigation-stack.tsx +81 -26
- package/ux-demo/recipes/types.ts +23 -2
- package/ux-demo/recipes/workspace-header.tsx +86 -5
- package/dist/browser/menu-action-row.js +0 -4
- package/dist/browser/menu-item.js +0 -4
- package/dist/browser/panel-header.js +0 -7
- package/dist/chunk-2RJBFNB6.js +0 -172
- package/dist/chunk-2RJBFNB6.js.map +0 -1
- package/dist/chunk-2Z5TWHKQ.js +0 -34
- package/dist/chunk-2Z5TWHKQ.js.map +0 -1
- package/dist/chunk-3YD6ZNRA.js +0 -34
- package/dist/chunk-3YD6ZNRA.js.map +0 -1
- package/dist/chunk-55DATV3A.js +0 -10
- package/dist/chunk-55DATV3A.js.map +0 -1
- package/dist/chunk-56RJXPHG.js.map +0 -1
- package/dist/chunk-7BR3DO2A.js.map +0 -1
- package/dist/chunk-7LDCTU7D.js +0 -134
- package/dist/chunk-7LDCTU7D.js.map +0 -1
- package/dist/chunk-AQNKJRFH.js +0 -79
- package/dist/chunk-AQNKJRFH.js.map +0 -1
- package/dist/chunk-B24C4A6T.js +0 -22
- package/dist/chunk-B24C4A6T.js.map +0 -1
- package/dist/chunk-BLK3UEEI.js +0 -23
- package/dist/chunk-BLK3UEEI.js.map +0 -1
- package/dist/chunk-BNQ2YDV4.js +0 -20
- package/dist/chunk-BNQ2YDV4.js.map +0 -1
- package/dist/chunk-DAFFDO33.js +0 -14
- package/dist/chunk-DAFFDO33.js.map +0 -1
- package/dist/chunk-H6URQGJI.js +0 -42
- package/dist/chunk-H6URQGJI.js.map +0 -1
- package/dist/chunk-I7INRJO4.js +0 -17
- package/dist/chunk-I7INRJO4.js.map +0 -1
- package/dist/chunk-LC3YSAZC.js +0 -39
- package/dist/chunk-LC3YSAZC.js.map +0 -1
- package/dist/chunk-M5JRI6MN.js +0 -27
- package/dist/chunk-M5JRI6MN.js.map +0 -1
- package/dist/chunk-MBR3TYNL.js +0 -14
- package/dist/chunk-MBR3TYNL.js.map +0 -1
- package/dist/chunk-MFKMHK5W.js +0 -10
- package/dist/chunk-MFKMHK5W.js.map +0 -1
- package/dist/chunk-MQIZAD4A.js +0 -227
- package/dist/chunk-MQIZAD4A.js.map +0 -1
- package/dist/chunk-PONXLV5U.js +0 -19
- package/dist/chunk-PONXLV5U.js.map +0 -1
- package/dist/chunk-RUNWEPR4.js +0 -10
- package/dist/chunk-RUNWEPR4.js.map +0 -1
- package/dist/chunk-W2FK7ZNY.js +0 -26
- package/dist/chunk-W2FK7ZNY.js.map +0 -1
- package/dist/chunk-WVPYVDXY.js +0 -15
- package/dist/chunk-WVPYVDXY.js.map +0 -1
- package/dist/chunk-YGN7OMLT.js.map +0 -1
- package/dist/chunk-YKUUZPED.js +0 -24
- package/dist/chunk-YKUUZPED.js.map +0 -1
- package/dist/menu-action-row.js +0 -5
- package/dist/menu-action-row.js.map +0 -1
- package/dist/menu-header.d.ts +0 -43
- package/dist/menu-header.js +0 -7
- package/dist/menu-header.js.map +0 -1
- package/dist/menu-item.d.ts +0 -33
- package/dist/menu-item.js +0 -5
- package/dist/menu-item.js.map +0 -1
- package/dist/panel-header.d.ts +0 -36
- package/dist/panel-header.js +0 -7
- package/dist/panel-header.js.map +0 -1
- package/dist/styles/menu-action-row.css +0 -160
- package/dist/styles/menu-header.css +0 -160
- package/dist/styles/menu-item.css +0 -123
- package/dist/styles/panel-header.css +0 -64
- package/dist/styles/tab-scaffold.css +0 -84
- package/dist/tab-scaffold.d.ts +0 -30
- package/dist/tab-scaffold.js +0 -16
- package/dist/tab-scaffold.js.map +0 -1
- package/dist/wire-tab-scaffold.d.ts +0 -11
- package/dist/wire-tab-scaffold.js +0 -16
- package/dist/wire-tab-scaffold.js.map +0 -1
- package/docs/tab-scaffold.md +0 -41
- package/ux-demo/recipes/master-detail-dialog.tsx +0 -45
- package/ux-demo/recipes/recipes.css +0 -355
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 492 274" width="492" height="274"><defs><clipPath id="cp0"><rect x="16" y="38" width="460" height="220"/></clipPath><clipPath id="ct1"><rect x="16" y="16" width="460" height="22"/></clipPath><clipPath id="irc2"><rect x="16" y="38" width="460" height="220" rx="0"/></clipPath></defs><rect x="0" y="0" width="492" height="274" rx="0" fill="rgb(255,255,255)"/><text x="16" y="28" font-family="system-ui, "-apple-system", sans-serif" font-size="12" font-weight="600" fill="rgb(110,110,115)">Key/value detail rows</text><g clip-path="url(#cp0)"><g clip-path="url(#irc2)"><clipPath id="svgimg3vclip"><rect x="16" y="38" width="460" height="220"/></clipPath><g clip-path="url(#svgimg3vclip)"><g transform="translate(16 38)"><defs><clipPath id="svgimg3cp0"><rect x="28" y="20" width="404" height="165.2"/></clipPath><clipPath id="svgimg3ov1"><rect x="29" y="21" width="402" height="163.2" rx="11"/></clipPath><clipPath id="svgimg3cp2"><rect x="37" y="32.4" width="46.5" height="18"/></clipPath><clipPath id="svgimg3ct3"><rect x="37" y="32.4" width="46.5" height="18"/></clipPath><clipPath id="svgimg3ct4"><rect x="241.7" y="32.4" width="181.3" height="18"/></clipPath><clipPath id="svgimg3cp5"><rect x="37" y="70" width="24" height="24.2"/></clipPath><clipPath id="svgimg3cp7"><rect x="69" y="73.2" width="90.6" height="18"/></clipPath><clipPath id="svgimg3ct8"><rect x="69" y="73.2" width="90.6" height="18"/></clipPath><clipPath id="svgimg3ct9"><rect x="253.1" y="73.2" width="169.9" height="18"/></clipPath><clipPath id="svgimg3cp10"><rect x="37" y="114" width="50" height="18"/></clipPath><clipPath id="svgimg3ct11"><rect x="37" y="114" width="50" height="18"/></clipPath><clipPath id="svgimg3ct12"><rect x="222.2" y="114" width="200.8" height="18"/></clipPath><clipPath id="svgimg3cp13"><rect x="37" y="154.8" width="83.7" height="18"/></clipPath><clipPath id="svgimg3ct14"><rect x="37" y="154.8" width="83.7" height="18"/></clipPath><clipPath id="svgimg3ct15"><rect x="230.9" y="154.8" width="192.1" height="18"/></clipPath></defs><g clip-path="url(#svgimg3cp0)"><rect x="28" y="20" width="404" height="165.2" rx="12" fill="rgba(0,0,98,0.05)"/><rect x="28.5" y="20.5" width="403" height="164" rx="11.5" fill="none" stroke="rgba(0,0,28,0.18)" stroke-width="1"/></g><g clip-path="url(#svgimg3ov1)"><g clip-path="url(#svgimg3cp2)"><g clip-path="url(#svgimg3ct3)"><text x="37" y="47.39" font-family="system-ui, "-apple-system", sans-serif" font-size="16" fill="rgb(110,110,115)">Status</text></g></g><text x="391.91" y="47.39" font-family="system-ui, "-apple-system", sans-serif" font-size="16" font-weight="650" fill="rgb(29,29,31)">Live</text></g><g clip-path="url(#svgimg3ov1)"><g clip-path="url(#svgimg3cp5)"><g color="rgb(110, 110, 115)"><clipPath id="svgimg3svgic6"><rect x="37" y="70.2" width="24" height="24"/></clipPath><g clip-path="url(#svgimg3svgic6)"><g transform="translate(37 70.188)"><path d="M12 15v5s3-.6 4-2c1-1.6 0-5 0-5" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(110, 110, 115)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><path d="M4.5 16.5c-1.5 1.3-2 5-2 5s3.7-.5 5-2c.7-.8.7-2.1 0-3a2 2 0 0 0-3 0" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(110, 110, 115)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><path d="M9 12a22 22 0 0 1 2-4 13 13 0 0 1 11-6c0 2.7-.8 7.5-6 11a22 22 0 0 1-4 2Z" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(110, 110, 115)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><path d="M9 12H4s.5-3 2-4c1.6-1 5 0 5 0" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(110, 110, 115)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/></g></g></g></g><g clip-path="url(#svgimg3cp7)"><g clip-path="url(#svgimg3ct8)"><text x="69" y="88.19" font-family="system-ui, "-apple-system", sans-serif" font-size="16" fill="rgb(110,110,115)">Environment</text></g></g><text x="338.63" y="88.19" font-family="system-ui, "-apple-system", sans-serif" font-size="16" font-weight="650" fill="rgb(29,29,31)">Production</text><g data-domotion-pseudo-source="blink-pseudo-fragment-v1" data-domotion-pseudo="::before" data-domotion-pseudo-owner="source-fragments"><g><line x1="69" y1="62.5" x2="423" y2="62.5" stroke="rgba(0, 0, 28, 0.18)" stroke-width="1"/></g></g></g><g clip-path="url(#svgimg3ov1)"><g clip-path="url(#svgimg3cp10)"><g clip-path="url(#svgimg3ct11)"><text x="37" y="128.98" font-family="system-ui, "-apple-system", sans-serif" font-size="16" fill="rgb(110,110,115)">Region</text></g></g><text x="349.39" y="128.98" font-family="system-ui, "-apple-system", sans-serif" font-size="16" font-weight="650" fill="rgb(29,29,31)">us-east-1</text><g data-domotion-pseudo-source="blink-pseudo-fragment-v1" data-domotion-pseudo="::before" data-domotion-pseudo-owner="source-fragments"><g><line x1="37" y1="103.5" x2="423" y2="103.5" stroke="rgba(0, 0, 28, 0.18)" stroke-width="1"/></g></g></g><g clip-path="url(#svgimg3ov1)"><g clip-path="url(#svgimg3cp13)"><g clip-path="url(#svgimg3ct14)"><text x="37" y="169.78" font-family="system-ui, "-apple-system", sans-serif" font-size="16" fill="rgb(110,110,115)">Last deploy</text></g></g><text x="333.14" y="169.78" font-family="system-ui, "-apple-system", sans-serif" font-size="16" font-weight="650" fill="rgb(29,29,31)">2 hours ago</text><g data-domotion-pseudo-source="blink-pseudo-fragment-v1" data-domotion-pseudo="::before" data-domotion-pseudo-owner="source-fragments"><g><line x1="37" y1="143.5" x2="423" y2="143.5" stroke="rgba(0, 0, 28, 0.18)" stroke-width="1"/></g></g></g></g></g></g></g></svg>
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
# Design templates — components as self-contained SVGs
|
|
2
|
+
|
|
3
|
+
`docs/design/templates/` holds **SVG design templates** for `@kerfjs/ui`
|
|
4
|
+
components: a faithful, self-contained picture of each component in its common
|
|
5
|
+
presentation combinations, captured from the real rendered HTML/CSS (production
|
|
6
|
+
tokens and styles, representative sample data). They're for design review,
|
|
7
|
+
documentation, figma/paste hand-off, and any surface that wants an accurate
|
|
8
|
+
component picture without running the app.
|
|
9
|
+
|
|
10
|
+
## Coverage
|
|
11
|
+
|
|
12
|
+
Templated components (each with light + dark variants):
|
|
13
|
+
`ToolbarControlGroup`, `Toolbar`, `ToolbarText`, `List`, `ListItem`, `ListHeader`,
|
|
14
|
+
`ListActionRow`, `ValueTable`, `StateBanner`, `EmptyState`, `Skeleton`,
|
|
15
|
+
`SegmentedControl`, `TabBar`/`AppTab`, and `TokenSearchField`.
|
|
16
|
+
|
|
17
|
+
Deliberately **not** templated (they don't read as a single static component
|
|
18
|
+
picture): `Select` renders a Web Awesome custom element that needs its runtime
|
|
19
|
+
registered, so it has no faithful static capture; `LucideIcon` and
|
|
20
|
+
`DisclosureArrow` are decorative primitives best seen inside the components that
|
|
21
|
+
use them; `ResizableRegion` and the whole-screen layouts (`NavStack`,
|
|
22
|
+
`SplitView`, `Workbench`, `TabNavigator`) and the `Catalog` shell are
|
|
23
|
+
interaction-/viewport-driven screens rather than component cards — the live UX
|
|
24
|
+
catalog and the app-layouts docs cover those.
|
|
25
|
+
|
|
26
|
+
## Layout
|
|
27
|
+
|
|
28
|
+
```
|
|
29
|
+
docs/design/templates/
|
|
30
|
+
toolbar.svg ← library: every variant, composed (light)
|
|
31
|
+
toolbar-dark.svg ← library: dark theme
|
|
32
|
+
toolbar/
|
|
33
|
+
icon-actions.svg
|
|
34
|
+
icon-actions-dark.svg
|
|
35
|
+
…
|
|
36
|
+
toolbar-control-group.svg
|
|
37
|
+
toolbar-control-group-dark.svg
|
|
38
|
+
toolbar-control-group/
|
|
39
|
+
…
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
- Each **variant** is captured in both themes — `<variant>.svg` (light) and
|
|
43
|
+
`<variant>-dark.svg` (dark) — a standalone SVG that scales crisply and drops
|
|
44
|
+
into an `<img>` anywhere. Dark is driven by domotion's `--color-scheme`, which
|
|
45
|
+
foundation.css's `light-dark()` tokens respond to. Captured with
|
|
46
|
+
`--text-mode system-font`, so text is emitted as authored `<text>` painted by the
|
|
47
|
+
viewer's system fonts: real, selectable, and small (no embedded font data). The
|
|
48
|
+
kerf UI design font stack is system-based, so the picture matches; a viewer
|
|
49
|
+
without those fonts falls back to its own.
|
|
50
|
+
- The **library** files (`<component>.svg` light, `<component>-dark.svg` dark) lay
|
|
51
|
+
the variants out with captions. The generator writes a temporary HTML page whose
|
|
52
|
+
`<img>` elements reference the individual variant SVGs, then captures that page
|
|
53
|
+
with domotion and `--flatten-nested-svg`. The final library is self-contained,
|
|
54
|
+
contains positioned groups rather than nested `<svg>` elements, and remains
|
|
55
|
+
reliable in design tools such as Sketch. The individual variant files stay
|
|
56
|
+
independently reusable.
|
|
57
|
+
|
|
58
|
+
## Building
|
|
59
|
+
|
|
60
|
+
```sh
|
|
61
|
+
npm run design-templates:build
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
This renders each component's real `SafeHtml` (with its CSS subpaths + `foundation.css`
|
|
65
|
+
tokens and representative sample data) into a standalone page and captures it with
|
|
66
|
+
[`domotion-svg`](https://github.com/brianwestphal/domotion)'s `domotion capture`.
|
|
67
|
+
The capture command uses `--flatten-nested-svg`, which converts safely flattenable
|
|
68
|
+
inline SVGs (including component icons) to groups so design tools such as Sketch do
|
|
69
|
+
not have to interpret nested `<svg>` elements.
|
|
70
|
+
`domotion` must be reachable: it resolves `DOMOTION_BIN`, then a local
|
|
71
|
+
`node_modules/.bin/domotion`, then a sibling `../domotion` checkout.
|
|
72
|
+
|
|
73
|
+
Each manifest entry's `css` list names the stylesheets a template starts from; the
|
|
74
|
+
build expands every component in it through that component's generated browser
|
|
75
|
+
entry (`dist/browser/<name>.js`), which imports every stylesheet the component's
|
|
76
|
+
runtime reaches. A nested component's styles — the `Badge` inside `StateBanner` or
|
|
77
|
+
`ListHeader`, the `Skeleton` inside a placeholder — are therefore loaded exactly as a
|
|
78
|
+
consumer's browser import loads them, instead of depending on a hand-maintained
|
|
79
|
+
list. Run `npm run build` before the template build so those entries exist.
|
|
80
|
+
|
|
81
|
+
**Keep the templates current as components change.** The variants live in the
|
|
82
|
+
`COMPONENTS` manifest in `scripts/build-design-templates.mjs` — when a component
|
|
83
|
+
gains or changes a presentation combination (e.g. a new `Toolbar` slot), add
|
|
84
|
+
or adjust its variant there and re-run the build. Cover the common cases: if a
|
|
85
|
+
component can render with or without an icon, include both.
|
|
86
|
+
|
|
87
|
+
`npm run check:design-templates` (part of `npm run check`) is an offline gate
|
|
88
|
+
that verifies every component + variant in the manifest has its committed output —
|
|
89
|
+
a light and dark SVG per variant plus the two per-component library files — and
|
|
90
|
+
that no stray template files linger for a removed component. It also rejects any
|
|
91
|
+
variant or library capture that still contains nested `<svg>` elements, guarding
|
|
92
|
+
the Sketch compatibility contract. It does **not**
|
|
93
|
+
re-render (that needs domotion + a browser), so it catches a manifest entry whose
|
|
94
|
+
templates were never generated or a half-regenerated set.
|
|
95
|
+
|
|
96
|
+
Deeper **visual drift** — a component changed but its template was not regenerated —
|
|
97
|
+
is caught by `npm run check:design-templates:drift`, a CI-only gate (it runs in a
|
|
98
|
+
dedicated macOS browser job, **not** in the offline `npm run check`). The committed
|
|
99
|
+
templates use system-font text, whose layout metrics differ by operating system, so
|
|
100
|
+
macOS is the canonical exact-render environment for both generation and comparison.
|
|
101
|
+
The capture fixture also pins its monospace token to `Courier New`; otherwise
|
|
102
|
+
`ui-monospace` resolves to different fonts on developer and hosted macOS machines.
|
|
103
|
+
The gate regenerates every template into a throwaway directory and fails if any
|
|
104
|
+
regenerated SVG differs from the committed one, after normalizing the bits that
|
|
105
|
+
legitimately vary between runs (XML comments and the auto-minted element ids / font
|
|
106
|
+
names). If it fails, run `npm run design-templates:build` on macOS and commit the
|
|
107
|
+
updated SVGs.
|
|
108
|
+
|
|
109
|
+
## Templating your own components
|
|
110
|
+
|
|
111
|
+
Apps that build on `@kerfjs/ui` can produce the same design templates for their
|
|
112
|
+
own application-level components. Copy `scripts/build-design-templates.mjs` as a
|
|
113
|
+
starting point and:
|
|
114
|
+
|
|
115
|
+
1. Import your component and render it to a `SafeHtml` string with realistic
|
|
116
|
+
sample data (pass icon/action slots as `SafeHtml`, e.g. `LucideIcon({ … })` or
|
|
117
|
+
`raw('<button …>')` — never plain strings, which kerf escapes).
|
|
118
|
+
2. List the component's CSS (its `@kerfjs/ui` subpaths plus `foundation.css` for
|
|
119
|
+
tokens and `layout.css`), and any of your own component CSS. Include the CSS of
|
|
120
|
+
every `@kerfjs/ui` component it renders inside itself (a `Badge`, a `Skeleton`),
|
|
121
|
+
or expand the list the way `resolveTemplateStyles()` does.
|
|
122
|
+
3. Enumerate the presentation combinations in the per-component manifest.
|
|
123
|
+
4. Capture each variant with `domotion capture <page.html> --selector <css>
|
|
124
|
+
--text-mode system-font --flatten-nested-svg -o <variant>.svg`, once per theme with
|
|
125
|
+
`--color-scheme light` / `--color-scheme dark` (if your components theme with
|
|
126
|
+
`light-dark()`).
|
|
127
|
+
5. Build a light and dark HTML library page that references the generated variants
|
|
128
|
+
with `<img src="./component/variant.svg">`, and capture each page with the same
|
|
129
|
+
domotion options, including `--flatten-nested-svg`. Let domotion own embedding,
|
|
130
|
+
id isolation, and flattening instead of hand-assembling SVG markup.
|
|
131
|
+
|
|
132
|
+
Maintaining these next to the components — and reviewing the captured SVGs on
|
|
133
|
+
every component change — keeps the design source of truth honest.
|
|
134
|
+
|
|
135
|
+
ListItem templates retain the shared 18px leading icon and 44px row target;
|
|
136
|
+
regenerate both themes and library sheets when that geometry changes. The browser
|
|
137
|
+
pane/sidebar geometry checks cover the resulting 43px icon-label offset from the
|
|
138
|
+
section edge (17px content inset + 18px icon + 8px gap).
|
|
139
|
+
|
|
140
|
+
For a focused update, pass component names: `npm run design-templates:build -- toolbar`. Omit them to capture all components. Toolbar width variants use the real `wireToolbarVisibility` helper after rendering typed props.
|
|
@@ -18,26 +18,50 @@ A reference image defines hierarchy, relationships, and intended feel. It does n
|
|
|
18
18
|
|
|
19
19
|
### Continuity is correctness
|
|
20
20
|
|
|
21
|
-
Unrelated updates must not close controls, move focus, reset a draft, replace a selection, or jump scroll. Give every durable and transient state an explicit owner. The default owner is the application: domain data and persisted layout preferences — a navigation stack, a selection, a tab order, a pane size, a `collapsed`/`expanded` disclosure flag — are the app's signals, which it reads to render. A `wire…` helper owns only the
|
|
21
|
+
Unrelated updates must not close controls, move focus, reset a draft, replace a selection, or jump scroll. Give every durable and transient state an explicit owner. The default owner is the application: domain data and persisted layout preferences — a navigation stack, a selection, a tab order, a pane size, a `collapsed`/`expanded` disclosure flag — are the app's signals, which it reads to render. A `wire…` helper owns only the _ephemeral mechanics_ around that state (a push/pop animation, overflow autoscroll, a live resize preview) and reports committed changes through callbacks. A helper takes over a piece of transient state itself only when hand-rolling that behavior is substantial and error-prone enough to cause real, inconsistent variation across apps — `wireTokenSearchFields`'s collapsible reveal/focus/Escape/blur-collapse is the bar; a one-line boolean toggle is not. Preserve DOM identity when meaning has not changed. Distinguish blocking foreground work from background synchronization.
|
|
22
22
|
|
|
23
23
|
### Hierarchy precedes decoration
|
|
24
24
|
|
|
25
|
-
Establish one reading order and one dominant action per decision point. Group first with alignment, spacing, typography, and shared surfaces. A border, fill, badge, or nested card must communicate a real distinction.
|
|
25
|
+
Establish one reading order and one dominant action per decision point. Group first with alignment, spacing, typography, and shared surfaces. A border, fill, badge, or nested card must communicate a real distinction. A divider is chrome too: a line between a pane's own header and its list, or under a toolbar whose content already spaces itself, marks nothing and is dropped (`dividerSides=""`), never padded around. Put a control near where its effect appears — a collapsed drawer's restore beside the drawer, not in a distant top toolbar.
|
|
26
26
|
|
|
27
27
|
### Reach for the primitive, not for CSS
|
|
28
28
|
|
|
29
|
-
The package is designed to look right
|
|
29
|
+
The package is designed to look right _unstyled_. A screen built from the
|
|
30
30
|
primitives, their props, and the semantic tokens should already read well, so
|
|
31
|
-
|
|
31
|
+
applications do not carry a component-customization stylesheet. Prefer a Kerf
|
|
32
|
+
UI component over a Web Awesome component over a raw HTML tag, using each for
|
|
33
|
+
what it is good at; a `Discouraged` Web Awesome element is reached only through
|
|
34
|
+
the Kerf component that wraps it (`PopupMenu`, `Select`), never rendered
|
|
35
|
+
directly. Before adding any `padding`, `margin`, `width`,
|
|
32
36
|
`height`, `border`, `background`, wrapper card, or decoration, check whether the
|
|
33
37
|
component, the pane, or the content-item already owns it — it almost always does,
|
|
34
38
|
and adding more usually **double-insets** or fights the component (the most common
|
|
35
39
|
mistake). Trust component defaults: render a control at its natural size and color
|
|
36
40
|
and fix the surrounding layout rather than overriding the control. Legitimate
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
never build a heading, toolbar, card,
|
|
41
|
+
CSS for genuinely new structure belongs to the application-owned component that
|
|
42
|
+
renders that structure. It must not select a nested Kerf or Web Awesome component;
|
|
43
|
+
configure those children through props and documented tokens instead. Never size,
|
|
44
|
+
space, or re-skin a primitive by hand, and never build a heading, toolbar, card,
|
|
45
|
+
or pane geometry that a primitive provides.
|
|
46
|
+
|
|
47
|
+
### Components own their styles; configure, never override
|
|
48
|
+
|
|
49
|
+
Every component styles only itself. How it looks and sits is configuration —
|
|
50
|
+
typed props and data attributes such as size, density, inset, presentation,
|
|
51
|
+
tone, `dividerSides`, `ToolbarConfig`, and `PaneConfig` — never a stylesheet
|
|
52
|
+
somewhere else reaching into it. When a component must adapt inside another
|
|
53
|
+
(a `PopupMenu` inside a compact `ToolbarControlGroup`, an `AppTab` in a
|
|
54
|
+
segmented `TabBar`), the **child** styles itself in that context, in its own
|
|
55
|
+
stylesheet; the parent keys only its own elements on a child's state
|
|
56
|
+
(`:has(> .kui-select[open])`) and names kerf children by class, not by `wa-*`
|
|
57
|
+
tag. Values a parent provides to its children are custom properties named after
|
|
58
|
+
the parent. A component never writes another component's private variables and
|
|
59
|
+
never puts a hook class on a child's root to restyle it.
|
|
60
|
+
|
|
61
|
+
The same holds for applications and component packages built on Kerf UI: expose
|
|
62
|
+
configuration on your own components, configure kerf components through their
|
|
63
|
+
props, and treat a missing prop as a component gap to report, not a reason to
|
|
64
|
+
override. `npm run check:css-ownership` enforces this inside the package.
|
|
41
65
|
|
|
42
66
|
### Panes share one child-owned geometry
|
|
43
67
|
|
|
@@ -45,21 +69,23 @@ Sidebars, main areas, inspectors, and dialogs use the same unpadded pane. Their
|
|
|
45
69
|
children own margin, border, background, padding, and radius, so a transparent
|
|
46
70
|
surface occupies exactly the same geometry as a visible one. Major content
|
|
47
71
|
groups use 24px vertical separation; the inside of an item and the gap between
|
|
48
|
-
toolbar groups use 8px. Rows and actions keep 44px targets.
|
|
72
|
+
toolbar groups use 8px. Rows and actions keep 44px targets. Align text to text
|
|
73
|
+
and icons to icons: a title, a row label, and bare prose share one text column,
|
|
74
|
+
and a border is decoration, never the alignment anchor — a bordered surface
|
|
75
|
+
extends to the pane gutter rather than being indented so its border lines up
|
|
76
|
+
with a heading's text.
|
|
49
77
|
|
|
50
78
|
Use the package composition so the geometry has one owner:
|
|
51
79
|
|
|
52
80
|
```tsx
|
|
53
|
-
<aside
|
|
54
|
-
<nav class="kui-pane__content kui-content">
|
|
81
|
+
<Pane element="aside" contentElement="nav" label="Workspace" contentLabel="Workspace pages">
|
|
55
82
|
<section>
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
83
|
+
<ListHeader label="Workspace" />
|
|
84
|
+
<ListItem action="open" label="Inbox" icon={inboxIcon} />
|
|
85
|
+
<ListItem action="open" label="Drafts" />
|
|
59
86
|
</section>
|
|
60
|
-
<
|
|
61
|
-
|
|
62
|
-
</aside>
|
|
87
|
+
<ContentItem>Panel contents</ContentItem>
|
|
88
|
+
</Pane>
|
|
63
89
|
```
|
|
64
90
|
|
|
65
91
|
Do not pad the pane and then pad every wrapper. That duplicates the geometry
|
|
@@ -68,7 +94,7 @@ and makes transparent borders behave differently from visible ones:
|
|
|
68
94
|
```tsx
|
|
69
95
|
<aside class="pane padded">
|
|
70
96
|
<section class="padded">
|
|
71
|
-
<
|
|
97
|
+
<ListHeader label="Workspace" />
|
|
72
98
|
<div class="panel padded-again">Panel contents</div>
|
|
73
99
|
</section>
|
|
74
100
|
</aside>
|
|
@@ -90,8 +116,10 @@ Reuse a component when surfaces share its purpose, anatomy, state model, and int
|
|
|
90
116
|
Color, type, spacing, radius, elevation, and motion express semantic roles. Prefer package tokens over raw values in consuming code. State is never communicated by color alone.
|
|
91
117
|
|
|
92
118
|
The default vocabulary is opinionated rather than empty: neutral, brand/info,
|
|
93
|
-
success, warning, and danger provide quiet/normal/loud fills, borders, and
|
|
94
|
-
foregrounds compatible with Hot Sheet 2 and Web Awesome.
|
|
119
|
+
pop, success, warning, and danger provide quiet/normal/loud fills, borders, and
|
|
120
|
+
foregrounds compatible with Hot Sheet 2 and Web Awesome. Pop is vibrant,
|
|
121
|
+
non-status emphasis for featured, novel, or celebratory content; never use it as
|
|
122
|
+
a success, warning, or danger substitute. Consumers may replace
|
|
95
123
|
the global palette, one semantic role, or one component instance through
|
|
96
124
|
documented custom properties without rewriting component CSS.
|
|
97
125
|
|
package/docs/device-class.md
CHANGED
|
@@ -7,7 +7,7 @@ the foundation the app/dialog layouts build on (see
|
|
|
7
7
|
[`../../docs/23-app-layouts.md`](../../docs/23-app-layouts.md)).
|
|
8
8
|
|
|
9
9
|
```ts
|
|
10
|
-
import { deviceClass } from
|
|
10
|
+
import { deviceClass } from "@kerfjs/ui/device-class";
|
|
11
11
|
|
|
12
12
|
const device = deviceClass(); // ReadonlySignal<DeviceClass>
|
|
13
13
|
|
|
@@ -19,14 +19,14 @@ effect(() => {
|
|
|
19
19
|
|
|
20
20
|
## `DeviceClass`
|
|
21
21
|
|
|
22
|
-
| Field
|
|
23
|
-
|
|
|
24
|
-
| `size`
|
|
25
|
-
| `orientation`
|
|
22
|
+
| Field | Meaning |
|
|
23
|
+
| ------------------------------- | -------------------------------------------------------------------------- |
|
|
24
|
+
| `size` | `xs-mobile` \| `mobile` \| `tablet` \| `desktop` \| `xl-desktop` |
|
|
25
|
+
| `orientation` | `portrait` \| `landscape` |
|
|
26
26
|
| `segments` / `verticalSegments` | viewport segment counts (foldables / dual-screen); `1` on ordinary devices |
|
|
27
|
-
| `handset`
|
|
28
|
-
| `compact`
|
|
29
|
-
| `atLeast(size)`
|
|
27
|
+
| `handset` | `xs-mobile` or `mobile` |
|
|
28
|
+
| `compact` | "one pane at a time" — a handset or a portrait tablet |
|
|
29
|
+
| `atLeast(size)` | true when the current size is `size` or larger |
|
|
30
30
|
|
|
31
31
|
Reading `device.value` inside an `effect`/`computed` re-runs when the viewport
|
|
32
32
|
crosses a breakpoint, rotates, or changes its segment count. One shared viewport
|
|
@@ -50,5 +50,6 @@ pure, DOM-free bucketing core.
|
|
|
50
50
|
## Server rendering
|
|
51
51
|
|
|
52
52
|
Without a DOM, `deviceClass()` resolves to an SSR default (1024×768, landscape,
|
|
53
|
-
one segment)
|
|
53
|
+
one segment). That signal is a fixed snapshot — there is no hydration step; a
|
|
54
|
+
`deviceClass()` called in the browser reads the real viewport. Override the assumed
|
|
54
55
|
viewport with `deviceClass({ ssr: { width, height } })`.
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# Document baseline
|
|
2
|
+
|
|
3
|
+
Import `@kerfjs/ui/document.css` when an application wants Kerf UI to own its
|
|
4
|
+
document-level defaults:
|
|
5
|
+
|
|
6
|
+
```ts
|
|
7
|
+
import "@kerfjs/ui/document.css";
|
|
8
|
+
```
|
|
9
|
+
|
|
10
|
+
```html
|
|
11
|
+
<body>
|
|
12
|
+
<div id="app" class="kui-app-root"></div>
|
|
13
|
+
</body>
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
The opt-in stylesheet applies `border-box` sizing to every element and
|
|
17
|
+
pseudo-element, removes the body margin, and gives the body the foundation
|
|
18
|
+
font, foreground, lowered surface, and `1.45` line height. Plain links use the
|
|
19
|
+
semantic `--kui-color-text-link` token with zero selector specificity.
|
|
20
|
+
Native table cells (`th`, `td`) and form controls (`button`, `input`, `select`,
|
|
21
|
+
`textarea`) inherit the surrounding font family, size, and line height through
|
|
22
|
+
zero-specificity selectors. Table headers keep their native bold weight and
|
|
23
|
+
alignment, and application styles can override the baseline.
|
|
24
|
+
|
|
25
|
+
`html`, `body`, and `.kui-app-root` form a definite `height: 100%` chain. Add
|
|
26
|
+
`.kui-app-root` to the one direct mount container of a full-height application
|
|
27
|
+
whose child is a `Workbench`, `SplitView`, `NavStack`, or another percentage-
|
|
28
|
+
height shell. Ordinary document-flow pages can import the baseline without the
|
|
29
|
+
class. Do not put `.kui-app-root` on several sibling containers: each requests
|
|
30
|
+
the full available document height.
|
|
31
|
+
The class sets `height: 100%`, not a viewport minimum; the direct child shell
|
|
32
|
+
must also fill its parent (for example with its `fill` prop). If the host page
|
|
33
|
+
already supplies a definite height, use that host geometry instead.
|
|
34
|
+
|
|
35
|
+
`kui-app-root` is the public class of the component catalog's
|
|
36
|
+
`document-baseline` entry, so `kerf-ui-doctor` and the
|
|
37
|
+
`kerfjs/ui-public-boundaries` ESLint rule accept it (no KUI-L101 finding).
|
|
38
|
+
|
|
39
|
+
The stylesheet is intentionally absent from `@kerfjs/ui/styles.css` and every
|
|
40
|
+
component browser import because its global selectors would otherwise change
|
|
41
|
+
consumer documents implicitly. Import it once and load application overrides
|
|
42
|
+
after it.
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "../../ai/application-ui-profile.schema.json",
|
|
3
|
+
"schemaVersion": 1,
|
|
4
|
+
"scope": "workspace",
|
|
5
|
+
"catalogs": [
|
|
6
|
+
{
|
|
7
|
+
"package": "@kerfjs/ui",
|
|
8
|
+
"selection": {
|
|
9
|
+
"path": "../../ai/component-catalog.json",
|
|
10
|
+
"schemaVersion": 1
|
|
11
|
+
},
|
|
12
|
+
"composition": {
|
|
13
|
+
"path": "../../ai/component-composition.json",
|
|
14
|
+
"schemaVersion": 1
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"package": "@acme/ui",
|
|
19
|
+
"composition": {
|
|
20
|
+
"path": "./component-composition-extension.json",
|
|
21
|
+
"schemaVersion": 1
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
],
|
|
25
|
+
"preferences": {
|
|
26
|
+
"application-shell": {
|
|
27
|
+
"preferred": "@kerfjs/ui:recipe-app-shell",
|
|
28
|
+
"rationale": "The workspace uses the standard resizable three-region shell."
|
|
29
|
+
},
|
|
30
|
+
"record-inspector": {
|
|
31
|
+
"preferred": "@acme/ui:inspector",
|
|
32
|
+
"rationale": "The application-owned inspector maps record policy onto Kerf panel primitives."
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
"theme": {
|
|
36
|
+
"colorScheme": "light",
|
|
37
|
+
"allowedColorSchemes": ["light", "dark"],
|
|
38
|
+
"density": "standard",
|
|
39
|
+
"allowedDensities": ["standard"]
|
|
40
|
+
},
|
|
41
|
+
"tokens": {
|
|
42
|
+
"--kui-color-brand-fill-normal": "oklch(0.62 0.16 255)"
|
|
43
|
+
},
|
|
44
|
+
"layout": {
|
|
45
|
+
"shell": "@kerfjs/ui:recipe-app-shell",
|
|
46
|
+
"pane": "@kerfjs/ui:pane",
|
|
47
|
+
"responsiveStrategy": "device-class",
|
|
48
|
+
"compactNavigation": "nav-stack",
|
|
49
|
+
"scrollOwnership": "one-per-pane",
|
|
50
|
+
"spacingScale": "kerf-five-step"
|
|
51
|
+
},
|
|
52
|
+
"exceptions": [
|
|
53
|
+
{
|
|
54
|
+
"id": "legacy-list-header",
|
|
55
|
+
"rules": ["KUI-C103"],
|
|
56
|
+
"target": "src/features/legacy-report/report-list-header.tsx",
|
|
57
|
+
"rationale": "The legacy report adapter owns disclosure content and its expanded state."
|
|
58
|
+
}
|
|
59
|
+
]
|
|
60
|
+
}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import '@kerfjs/ui/layout.css';
|
|
2
2
|
|
|
3
|
+
import { ContentItem } from '@kerfjs/ui/content-item';
|
|
4
|
+
import { Text } from '@kerfjs/ui/text';
|
|
3
5
|
import { delegate, mount, signal } from 'kerfjs';
|
|
4
6
|
import { delegateActions } from 'kerfjs/actions';
|
|
5
7
|
|
|
@@ -26,17 +28,57 @@ export function mountCommandPaletteAdapter(
|
|
|
26
28
|
const query = signal('');
|
|
27
29
|
const render = () => {
|
|
28
30
|
const needle = query.value.trim().toLocaleLowerCase();
|
|
29
|
-
const matches = commands.filter(
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
31
|
+
const matches = commands.filter(
|
|
32
|
+
(command) =>
|
|
33
|
+
!needle ||
|
|
34
|
+
[command.label, ...(command.keywords ?? [])].some((value) =>
|
|
35
|
+
value.toLocaleLowerCase().includes(needle),
|
|
36
|
+
),
|
|
37
|
+
);
|
|
38
|
+
return (
|
|
39
|
+
<section
|
|
40
|
+
class="app-command-palette kui-content"
|
|
41
|
+
aria-label="Command palette"
|
|
42
|
+
>
|
|
43
|
+
<ContentItem>
|
|
44
|
+
<label for="app-command-query">Search commands</label>
|
|
45
|
+
<input
|
|
46
|
+
id="app-command-query"
|
|
47
|
+
type="search"
|
|
48
|
+
value={query.value}
|
|
49
|
+
autocomplete="off"
|
|
50
|
+
data-command-query
|
|
51
|
+
/>
|
|
52
|
+
</ContentItem>
|
|
53
|
+
<Text class="kui-content-item" aria-live="polite">
|
|
54
|
+
{matches.length} matching commands
|
|
55
|
+
</Text>
|
|
56
|
+
<ul class="kui-content-item" aria-label="Matching commands">
|
|
57
|
+
{matches.map((command) => (
|
|
58
|
+
<li>
|
|
59
|
+
<button
|
|
60
|
+
type="button"
|
|
61
|
+
data-action="run-command"
|
|
62
|
+
data-command-id={command.id}
|
|
63
|
+
>
|
|
64
|
+
{command.label}
|
|
65
|
+
</button>
|
|
66
|
+
</li>
|
|
67
|
+
))}
|
|
68
|
+
</ul>
|
|
69
|
+
<footer
|
|
70
|
+
class="kui-control-cluster kui-content-item"
|
|
71
|
+
aria-label="Command palette actions"
|
|
72
|
+
>
|
|
73
|
+
<button type="button" data-action="clear-query">
|
|
74
|
+
Clear search
|
|
75
|
+
</button>
|
|
76
|
+
<button type="button" data-action="close-palette">
|
|
77
|
+
Close
|
|
78
|
+
</button>
|
|
79
|
+
</footer>
|
|
80
|
+
</section>
|
|
81
|
+
);
|
|
40
82
|
};
|
|
41
83
|
|
|
42
84
|
const stopMount = mount(root, render);
|
|
@@ -52,12 +94,22 @@ export function mountCommandPaletteAdapter(
|
|
|
52
94
|
},
|
|
53
95
|
'close-palette': onClose,
|
|
54
96
|
});
|
|
55
|
-
const stopInput = delegate<HTMLInputElement>(
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
97
|
+
const stopInput = delegate<HTMLInputElement>(
|
|
98
|
+
root,
|
|
99
|
+
'input',
|
|
100
|
+
'[data-command-query]',
|
|
101
|
+
(_event, input) => {
|
|
102
|
+
query.value = input.value;
|
|
103
|
+
},
|
|
104
|
+
);
|
|
105
|
+
const stopEscape = delegate(
|
|
106
|
+
root,
|
|
107
|
+
'keydown',
|
|
108
|
+
'[data-command-query]',
|
|
109
|
+
(event) => {
|
|
110
|
+
if ((event as KeyboardEvent).key === 'Escape') onClose();
|
|
111
|
+
},
|
|
112
|
+
);
|
|
61
113
|
let disposed = false;
|
|
62
114
|
return () => {
|
|
63
115
|
if (disposed) return;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "../../ai/component-catalog-extension.schema.json",
|
|
3
|
+
"schemaVersion": 1,
|
|
4
|
+
"package": "@acme/ui",
|
|
5
|
+
"description": "Application-owned components composed with Kerf UI.",
|
|
6
|
+
"entries": [
|
|
7
|
+
{
|
|
8
|
+
"id": "acme-filter-chip",
|
|
9
|
+
"name": "FilterChip",
|
|
10
|
+
"kind": "component",
|
|
11
|
+
"purpose": "A removable application filter displayed inside a token-search workflow.",
|
|
12
|
+
"useWhen": [
|
|
13
|
+
"A saved application filter needs a compact visible label and remove action."
|
|
14
|
+
],
|
|
15
|
+
"avoidWhen": [
|
|
16
|
+
"The value belongs to TokenSearchField's own controlled token collection."
|
|
17
|
+
],
|
|
18
|
+
"publicClasses": ["acme-filter-chip"],
|
|
19
|
+
"publicTokens": ["--acme-filter-chip-accent"],
|
|
20
|
+
"uses": ["chip"],
|
|
21
|
+
"source": "src/filter-chip.tsx",
|
|
22
|
+
"styleSources": ["src/filter-chip.css"],
|
|
23
|
+
"demoSource": "ux-demo/demos/filter-chip.tsx",
|
|
24
|
+
"geometry": {
|
|
25
|
+
"margin": "none",
|
|
26
|
+
"border": "self",
|
|
27
|
+
"padding": "self"
|
|
28
|
+
},
|
|
29
|
+
"documentation": "docs/filter-chip.md"
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"id": "acme-inspector",
|
|
33
|
+
"name": "Inspector",
|
|
34
|
+
"kind": "composition",
|
|
35
|
+
"purpose": "An application inspector composed from Kerf panel, content, and value primitives.",
|
|
36
|
+
"useWhen": ["A selected record needs a titled fact-and-action region."],
|
|
37
|
+
"avoidWhen": ["A ValueTable alone expresses the complete interaction."],
|
|
38
|
+
"uses": ["acme-filter-chip", "toolbar", "value-table"],
|
|
39
|
+
"source": "src/inspector.tsx",
|
|
40
|
+
"demoSource": "ux-demo/demos/inspector.tsx",
|
|
41
|
+
"geometry": {
|
|
42
|
+
"margin": "parent",
|
|
43
|
+
"border": "child",
|
|
44
|
+
"padding": "child",
|
|
45
|
+
"notes": [
|
|
46
|
+
"The embedding pane positions the inspector; Toolbar, ValueTable, and action groups retain their own geometry."
|
|
47
|
+
]
|
|
48
|
+
},
|
|
49
|
+
"documentation": "docs/inspector.md"
|
|
50
|
+
}
|
|
51
|
+
]
|
|
52
|
+
}
|