@kerfjs/ui 5.0.0-beta.11 → 5.0.0-beta.111
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 +708 -160
- package/ai/application-ui-diagnostic-ids-v1.json +115 -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 +222 -0
- package/ai/application-ui-profile.mjs +653 -0
- package/ai/application-ui-profile.schema.json +140 -0
- package/ai/catalog-authoring.json +34 -0
- package/ai/catalog-authoring.schema.json +105 -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 +9118 -1376
- 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 +570 -0
- package/ai/component-composition.d.ts +143 -0
- package/ai/component-composition.json +10444 -0
- package/ai/component-composition.schema.json +444 -0
- package/ai/components/README.md +206 -0
- package/ai/components/anchored-surface.md +99 -0
- package/ai/components/application-tabs.md +65 -0
- package/ai/components/backdrop-image.md +84 -0
- package/ai/components/badge.md +77 -0
- package/ai/components/button.md +97 -0
- package/ai/components/checkbox-group.md +89 -0
- package/ai/components/checkbox.md +90 -0
- package/ai/components/chip.md +80 -0
- package/ai/components/choice-chips.md +93 -0
- package/ai/components/collapsible-panel.md +103 -0
- package/ai/components/color-field.md +92 -0
- package/ai/components/color-picker.md +93 -0
- package/ai/components/color-swatches.md +82 -0
- package/ai/components/column-track.md +78 -0
- package/ai/components/combobox.md +90 -0
- package/ai/components/content-item.md +101 -0
- package/ai/components/content-swap.md +78 -0
- package/ai/components/corner-status.md +88 -0
- package/ai/components/disclosure-arrow.md +77 -0
- package/ai/components/disclosure.md +88 -0
- package/ai/components/document-baseline.md +77 -0
- package/ai/components/edge-activity-indicator.md +81 -0
- package/ai/components/empty-state.md +80 -0
- package/ai/components/feedback.md +71 -0
- package/ai/components/file-picker.md +89 -0
- package/ai/components/floating-toolbar.md +82 -0
- package/ai/components/foundation.md +65 -0
- package/ai/components/framed-list.md +80 -0
- package/ai/components/grid.md +101 -0
- package/ai/components/headers.md +63 -0
- package/ai/components/layout.md +75 -0
- package/ai/components/list-action-row.md +108 -0
- package/ai/components/list-detail-dialog.md +90 -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 +108 -0
- package/ai/components/list.md +127 -0
- package/ai/components/loading-spinner.md +73 -0
- package/ai/components/lucide-icon.md +99 -0
- package/ai/components/message-composer.md +85 -0
- package/ai/components/nav-stack.md +120 -0
- package/ai/components/pane.md +127 -0
- package/ai/components/popup-menu.md +174 -0
- package/ai/components/progress-bar.md +82 -0
- package/ai/components/progress-ring.md +80 -0
- package/ai/components/radio-group.md +89 -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-media-detail.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/search-field.md +108 -0
- package/ai/components/segmented-control.md +83 -0
- package/ai/components/select.md +118 -0
- package/ai/components/skeleton.md +84 -0
- package/ai/components/slider.md +84 -0
- package/ai/components/spacer.md +86 -0
- package/ai/components/split-button.md +83 -0
- package/ai/components/split-view.md +105 -0
- package/ai/components/state-banner.md +96 -0
- package/ai/components/summary-row.md +85 -0
- package/ai/components/sunken-panel.md +79 -0
- package/ai/components/surface-scaffold.md +120 -0
- package/ai/components/switch.md +81 -0
- package/ai/components/tab-bar.md +114 -0
- package/ai/components/tab-navigator.md +105 -0
- package/ai/components/tabs.md +95 -0
- package/ai/components/tag-field.md +86 -0
- package/ai/components/text-field.md +102 -0
- package/ai/components/text.md +93 -0
- package/ai/components/toast.md +85 -0
- package/ai/components/toolbar-control-group.md +127 -0
- package/ai/components/toolbar-text.md +100 -0
- package/ai/components/toolbar.md +103 -0
- package/ai/components/tooltip.md +81 -0
- package/ai/components/value-table.md +80 -0
- package/ai/components/wa-accordion-item.md +61 -0
- package/ai/components/wa-accordion.md +71 -0
- package/ai/components/wa-animated-image.md +56 -0
- package/ai/components/wa-animation.md +56 -0
- package/ai/components/wa-avatar.md +56 -0
- package/ai/components/wa-badge.md +62 -0
- package/ai/components/wa-breadcrumb-item.md +54 -0
- package/ai/components/wa-breadcrumb.md +56 -0
- package/ai/components/wa-button-group.md +62 -0
- package/ai/components/wa-button.md +61 -0
- package/ai/components/wa-callout.md +60 -0
- package/ai/components/wa-card.md +67 -0
- package/ai/components/wa-carousel-item.md +54 -0
- package/ai/components/wa-carousel.md +56 -0
- package/ai/components/wa-checkbox-group.md +62 -0
- package/ai/components/wa-checkbox.md +61 -0
- package/ai/components/wa-color-picker.md +63 -0
- package/ai/components/wa-comparison.md +56 -0
- package/ai/components/wa-copy-button.md +56 -0
- package/ai/components/wa-details.md +67 -0
- package/ai/components/wa-dialog.md +65 -0
- package/ai/components/wa-divider.md +54 -0
- package/ai/components/wa-drawer.md +62 -0
- package/ai/components/wa-dropdown-item.md +62 -0
- package/ai/components/wa-dropdown.md +62 -0
- package/ai/components/wa-format-bytes.md +54 -0
- package/ai/components/wa-format-date.md +54 -0
- package/ai/components/wa-format-number.md +54 -0
- package/ai/components/wa-icon.md +59 -0
- package/ai/components/wa-include.md +55 -0
- package/ai/components/wa-input.md +62 -0
- package/ai/components/wa-intersection-observer.md +54 -0
- package/ai/components/wa-known-date.md +54 -0
- package/ai/components/wa-markdown.md +54 -0
- package/ai/components/wa-mutation-observer.md +54 -0
- package/ai/components/wa-number-input.md +56 -0
- package/ai/components/wa-option.md +61 -0
- package/ai/components/wa-otp-input.md +54 -0
- package/ai/components/wa-page.md +62 -0
- package/ai/components/wa-pagination.md +56 -0
- package/ai/components/wa-popover.md +61 -0
- package/ai/components/wa-popup.md +60 -0
- package/ai/components/wa-progress-bar.md +60 -0
- package/ai/components/wa-progress-ring.md +60 -0
- package/ai/components/wa-qr-code.md +54 -0
- package/ai/components/wa-radio-group.md +67 -0
- package/ai/components/wa-radio.md +61 -0
- package/ai/components/wa-random-content.md +54 -0
- package/ai/components/wa-rating.md +56 -0
- package/ai/components/wa-relative-time.md +54 -0
- package/ai/components/wa-resize-observer.md +54 -0
- package/ai/components/wa-scroller.md +61 -0
- package/ai/components/wa-select.md +65 -0
- package/ai/components/wa-skeleton.md +60 -0
- package/ai/components/wa-slider.md +61 -0
- package/ai/components/wa-spinner.md +60 -0
- package/ai/components/wa-split-panel.md +60 -0
- package/ai/components/wa-step.md +56 -0
- package/ai/components/wa-stepper.md +56 -0
- package/ai/components/wa-switch.md +60 -0
- package/ai/components/wa-tab-group.md +71 -0
- package/ai/components/wa-tab-panel.md +62 -0
- package/ai/components/wa-tab.md +61 -0
- package/ai/components/wa-tag-input.md +62 -0
- package/ai/components/wa-tag.md +62 -0
- package/ai/components/wa-textarea.md +60 -0
- package/ai/components/wa-time-input.md +56 -0
- package/ai/components/wa-toast-item.md +62 -0
- package/ai/components/wa-toast.md +62 -0
- package/ai/components/wa-tooltip.md +61 -0
- package/ai/components/wa-tree-item.md +56 -0
- package/ai/components/wa-tree.md +56 -0
- package/ai/components/wa-zoomable-frame.md +56 -0
- package/ai/components/workbench-dialog.md +90 -0
- package/ai/components/workbench.md +120 -0
- package/ai/public-api-signatures-v1.md +6162 -446
- package/ai/skill.md +549 -65
- package/ai/webawesome-jsx-signatures-v1.md +12 -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 +2375 -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/anchored-surface.d.ts +69 -0
- package/dist/anchored-surface.js +3 -0
- package/dist/anchored-surface.js.map +1 -0
- package/dist/backdrop-image.d.ts +140 -0
- package/dist/backdrop-image.js +5 -0
- package/dist/backdrop-image.js.map +1 -0
- package/dist/badge.d.ts +91 -0
- package/dist/badge.js +4 -0
- package/dist/badge.js.map +1 -0
- package/dist/browser/anchored-surface.js +3 -0
- package/dist/browser/backdrop-image.js +3 -0
- package/dist/browser/badge.js +3 -0
- package/dist/browser/button.js +5 -0
- package/dist/browser/catalog.js +29 -0
- package/dist/browser/checkbox-group.js +5 -0
- package/dist/browser/checkbox.js +4 -0
- package/dist/browser/chip.js +3 -0
- package/dist/browser/choice-chips.js +3 -0
- package/dist/browser/collapsible-panel.js +9 -0
- package/dist/browser/color-field.js +4 -0
- package/dist/browser/color-picker.js +5 -0
- package/dist/browser/color-swatches.js +3 -0
- package/dist/browser/column-track.js +3 -0
- package/dist/browser/combobox.js +3 -0
- package/dist/browser/content-item.js +4 -0
- package/dist/browser/content-swap.js +3 -0
- package/dist/browser/corner-status.js +3 -0
- package/dist/browser/disclosure.js +5 -0
- package/dist/browser/edge-activity-indicator.js +3 -0
- package/dist/browser/file-picker.js +3 -0
- package/dist/browser/framed-list.js +3 -0
- package/dist/browser/grid.js +3 -0
- package/dist/browser/list-action-row.js +3 -0
- package/dist/browser/list-detail-dialog.js +14 -0
- package/dist/browser/list-header.js +3 -1
- package/dist/browser/list-inset-control.js +3 -0
- package/dist/browser/list-inset-text.js +3 -0
- package/dist/browser/list-item.js +1 -0
- package/dist/browser/list.js +3 -0
- package/dist/browser/message-composer.js +5 -0
- package/dist/browser/nav-stack.js +11 -0
- package/dist/browser/pane.js +3 -0
- package/dist/browser/popup-menu.js +4 -0
- package/dist/browser/progress-bar.js +3 -0
- package/dist/browser/progress-ring.js +3 -0
- package/dist/browser/radio-group.js +3 -0
- package/dist/browser/row.js +3 -0
- package/dist/browser/search-field.js +4 -0
- package/dist/browser/segmented-control.js +0 -1
- package/dist/browser/select.js +2 -1
- package/dist/browser/slider.js +3 -0
- package/dist/browser/spacer.js +3 -0
- package/dist/browser/split-button.js +5 -0
- package/dist/browser/split-view.js +13 -0
- package/dist/browser/state-banner.js +1 -0
- package/dist/browser/summary-row.js +3 -0
- package/dist/browser/sunken-panel.js +3 -0
- package/dist/browser/surface-scaffold.js +4 -0
- package/dist/browser/switch.js +3 -0
- package/dist/browser/tab-bar-item.js +4 -0
- package/dist/browser/tab-navigator.js +4 -0
- package/dist/browser/tag-field.js +5 -0
- package/dist/browser/text-field.js +4 -0
- package/dist/browser/text.js +3 -0
- package/dist/browser/toolbar-control-group.js +1 -0
- package/dist/browser/workbench-dialog.js +15 -0
- package/dist/browser/workbench.js +14 -0
- package/dist/button.d.ts +123 -0
- package/dist/button.js +7 -0
- package/dist/button.js.map +1 -0
- package/dist/catalog-resources.d.ts +51 -0
- package/dist/catalog-resources.js +22 -0
- package/dist/catalog-resources.js.map +1 -0
- package/dist/catalog.d.ts +135 -101
- package/dist/catalog.js +701 -108
- package/dist/catalog.js.map +1 -1
- package/dist/checkbox-group.d.ts +70 -0
- package/dist/checkbox-group.js +7 -0
- package/dist/checkbox-group.js.map +1 -0
- package/dist/checkbox.d.ts +45 -0
- package/dist/checkbox.js +6 -0
- package/dist/checkbox.js.map +1 -0
- package/dist/chip.d.ts +117 -0
- package/dist/chip.js +4 -0
- package/dist/chip.js.map +1 -0
- package/dist/choice-chips.d.ts +116 -0
- package/dist/choice-chips.js +3 -0
- package/dist/choice-chips.js.map +1 -0
- package/dist/chunk-2FW7D4IG.js +52 -0
- package/dist/chunk-2FW7D4IG.js.map +1 -0
- package/dist/chunk-2GOCOLQL.js +270 -0
- package/dist/chunk-2GOCOLQL.js.map +1 -0
- package/dist/chunk-2LM3PYHA.js +300 -0
- package/dist/chunk-2LM3PYHA.js.map +1 -0
- package/dist/chunk-36HVQ72F.js +123 -0
- package/dist/chunk-36HVQ72F.js.map +1 -0
- package/dist/chunk-3GLYIIFR.js +230 -0
- package/dist/chunk-3GLYIIFR.js.map +1 -0
- package/dist/chunk-3VZ6SFD4.js +8 -0
- package/dist/chunk-3VZ6SFD4.js.map +1 -0
- package/dist/chunk-3WYREXW4.js +120 -0
- package/dist/chunk-3WYREXW4.js.map +1 -0
- package/dist/chunk-3Z7N2NAZ.js +385 -0
- package/dist/chunk-3Z7N2NAZ.js.map +1 -0
- package/dist/chunk-4OV272LF.js +93 -0
- package/dist/chunk-4OV272LF.js.map +1 -0
- package/dist/chunk-4RECPEHI.js +67 -0
- package/dist/chunk-4RECPEHI.js.map +1 -0
- package/dist/chunk-4UB5Z3ZZ.js +68 -0
- package/dist/chunk-4UB5Z3ZZ.js.map +1 -0
- package/dist/chunk-5J6Z4BWY.js +141 -0
- package/dist/chunk-5J6Z4BWY.js.map +1 -0
- package/dist/chunk-6C6DLP3W.js +31 -0
- package/dist/chunk-6C6DLP3W.js.map +1 -0
- package/dist/chunk-6VVIW7VB.js +69 -0
- package/dist/chunk-6VVIW7VB.js.map +1 -0
- package/dist/chunk-7AK5I7U7.js +55 -0
- package/dist/chunk-7AK5I7U7.js.map +1 -0
- package/dist/chunk-7K6U6FCN.js +122 -0
- package/dist/chunk-7K6U6FCN.js.map +1 -0
- package/dist/chunk-AMIHGFLP.js +59 -0
- package/dist/chunk-AMIHGFLP.js.map +1 -0
- package/dist/chunk-AN5IWMTM.js +24 -0
- package/dist/chunk-AN5IWMTM.js.map +1 -0
- package/dist/chunk-ATGAJVZ6.js +268 -0
- package/dist/chunk-ATGAJVZ6.js.map +1 -0
- package/dist/chunk-AYPGXR2E.js +20 -0
- package/dist/chunk-AYPGXR2E.js.map +1 -0
- package/dist/chunk-B53PS2LE.js +34 -0
- package/dist/chunk-B53PS2LE.js.map +1 -0
- package/dist/chunk-BKUMG2KB.js +95 -0
- package/dist/chunk-BKUMG2KB.js.map +1 -0
- package/dist/chunk-C26Q6P4Q.js +76 -0
- package/dist/chunk-C26Q6P4Q.js.map +1 -0
- package/dist/chunk-CEJ5FK6G.js +288 -0
- package/dist/chunk-CEJ5FK6G.js.map +1 -0
- package/dist/chunk-CIAUILRR.js +222 -0
- package/dist/chunk-CIAUILRR.js.map +1 -0
- package/dist/chunk-CNM6ZWP2.js +38 -0
- package/dist/chunk-CNM6ZWP2.js.map +1 -0
- package/dist/chunk-CTQUDCY5.js +26 -0
- package/dist/chunk-CTQUDCY5.js.map +1 -0
- package/dist/chunk-CVD5IZGB.js +66 -0
- package/dist/chunk-CVD5IZGB.js.map +1 -0
- package/dist/chunk-D4MXSAMI.js +50 -0
- package/dist/chunk-D4MXSAMI.js.map +1 -0
- package/dist/chunk-D5RGM3XA.js +38 -0
- package/dist/chunk-D5RGM3XA.js.map +1 -0
- package/dist/chunk-DZJ4GBSP.js +59 -0
- package/dist/chunk-DZJ4GBSP.js.map +1 -0
- package/dist/chunk-EIET4QLK.js +51 -0
- package/dist/chunk-EIET4QLK.js.map +1 -0
- package/dist/chunk-EKHDLBRP.js +86 -0
- package/dist/chunk-EKHDLBRP.js.map +1 -0
- package/dist/chunk-ETFP7HAR.js +147 -0
- package/dist/chunk-ETFP7HAR.js.map +1 -0
- package/dist/chunk-EYDXFOSH.js +457 -0
- package/dist/chunk-EYDXFOSH.js.map +1 -0
- package/dist/chunk-G3J7JDP6.js +29 -0
- package/dist/chunk-G3J7JDP6.js.map +1 -0
- package/dist/chunk-GS2QD3N7.js +14 -0
- package/dist/chunk-GS2QD3N7.js.map +1 -0
- package/dist/chunk-GXSX6Q6O.js +42 -0
- package/dist/chunk-GXSX6Q6O.js.map +1 -0
- package/dist/chunk-HDXUHLTQ.js +90 -0
- package/dist/chunk-HDXUHLTQ.js.map +1 -0
- package/dist/chunk-HJXVVFBT.js +108 -0
- package/dist/chunk-HJXVVFBT.js.map +1 -0
- package/dist/chunk-HTERKONR.js +49 -0
- package/dist/chunk-HTERKONR.js.map +1 -0
- package/dist/chunk-HU5IHXCI.js +73 -0
- package/dist/chunk-HU5IHXCI.js.map +1 -0
- package/dist/chunk-IIQ2XIMU.js +197 -0
- package/dist/chunk-IIQ2XIMU.js.map +1 -0
- package/dist/chunk-IKS72C6P.js +53 -0
- package/dist/chunk-IKS72C6P.js.map +1 -0
- package/dist/chunk-IO27YTL3.js +73 -0
- package/dist/chunk-IO27YTL3.js.map +1 -0
- package/dist/chunk-IQSRHXZR.js +164 -0
- package/dist/chunk-IQSRHXZR.js.map +1 -0
- package/dist/chunk-IRC5N7FA.js +16 -0
- package/dist/chunk-IRC5N7FA.js.map +1 -0
- package/dist/chunk-ITENVZ6Q.js +24 -0
- package/dist/chunk-ITENVZ6Q.js.map +1 -0
- package/dist/chunk-ITUQC4FW.js +163 -0
- package/dist/chunk-ITUQC4FW.js.map +1 -0
- package/dist/chunk-JCCN3U6X.js +176 -0
- package/dist/chunk-JCCN3U6X.js.map +1 -0
- package/dist/chunk-K57NINLH.js +137 -0
- package/dist/chunk-K57NINLH.js.map +1 -0
- package/dist/chunk-KC6WUSNS.js +34 -0
- package/dist/chunk-KC6WUSNS.js.map +1 -0
- package/dist/chunk-KCS6NJ3O.js +82 -0
- package/dist/chunk-KCS6NJ3O.js.map +1 -0
- package/dist/chunk-KDQZ3E5C.js +75 -0
- package/dist/chunk-KDQZ3E5C.js.map +1 -0
- package/dist/chunk-KH4KEMSP.js +71 -0
- package/dist/chunk-KH4KEMSP.js.map +1 -0
- package/dist/chunk-KK3S5OTW.js +98 -0
- package/dist/chunk-KK3S5OTW.js.map +1 -0
- package/dist/chunk-LMHN2TJL.js +167 -0
- package/dist/chunk-LMHN2TJL.js.map +1 -0
- package/dist/chunk-LTBVP6VN.js +59 -0
- package/dist/chunk-LTBVP6VN.js.map +1 -0
- package/dist/{chunk-YGN7OMLT.js → chunk-LZUUUHNH.js} +13 -6
- package/dist/chunk-LZUUUHNH.js.map +1 -0
- package/dist/chunk-MHMWQ7RB.js +19 -0
- package/dist/chunk-MHMWQ7RB.js.map +1 -0
- package/dist/chunk-MJ5RU6XT.js +173 -0
- package/dist/chunk-MJ5RU6XT.js.map +1 -0
- package/dist/chunk-MVKHSAKE.js +169 -0
- package/dist/chunk-MVKHSAKE.js.map +1 -0
- package/dist/chunk-NB6POCFH.js +103 -0
- package/dist/chunk-NB6POCFH.js.map +1 -0
- package/dist/chunk-NR6O74ST.js +169 -0
- package/dist/chunk-NR6O74ST.js.map +1 -0
- package/dist/chunk-OHPYT2BH.js +82 -0
- package/dist/chunk-OHPYT2BH.js.map +1 -0
- package/dist/chunk-OQP3PFKQ.js +341 -0
- package/dist/chunk-OQP3PFKQ.js.map +1 -0
- package/dist/chunk-OUCHU7JB.js +162 -0
- package/dist/chunk-OUCHU7JB.js.map +1 -0
- package/dist/chunk-OZ6X76G5.js +547 -0
- package/dist/chunk-OZ6X76G5.js.map +1 -0
- package/dist/chunk-PS24PVR6.js +124 -0
- package/dist/chunk-PS24PVR6.js.map +1 -0
- package/dist/chunk-QDSZTQXL.js +28 -0
- package/dist/chunk-QDSZTQXL.js.map +1 -0
- package/dist/chunk-QH5KOFNS.js +39 -0
- package/dist/chunk-QH5KOFNS.js.map +1 -0
- package/dist/chunk-QPTJ5DOO.js +87 -0
- package/dist/chunk-QPTJ5DOO.js.map +1 -0
- package/dist/chunk-QYMJHS4K.js +36 -0
- package/dist/chunk-QYMJHS4K.js.map +1 -0
- package/dist/chunk-RMWNO6BA.js +89 -0
- package/dist/chunk-RMWNO6BA.js.map +1 -0
- package/dist/chunk-S2XULQEK.js +52 -0
- package/dist/chunk-S2XULQEK.js.map +1 -0
- package/dist/chunk-S3ECMF23.js +33 -0
- package/dist/chunk-S3ECMF23.js.map +1 -0
- package/dist/chunk-S4Y3YTAI.js +35 -0
- package/dist/chunk-S4Y3YTAI.js.map +1 -0
- package/dist/chunk-S4ZGTDSG.js +18 -0
- package/dist/chunk-S4ZGTDSG.js.map +1 -0
- package/dist/chunk-SOBRGH7T.js +151 -0
- package/dist/chunk-SOBRGH7T.js.map +1 -0
- package/dist/chunk-T74YB76U.js +547 -0
- package/dist/chunk-T74YB76U.js.map +1 -0
- package/dist/chunk-TI2GV36S.js +90 -0
- package/dist/chunk-TI2GV36S.js.map +1 -0
- package/dist/{chunk-56RJXPHG.js → chunk-TKNVL53O.js} +7 -4
- package/dist/chunk-TKNVL53O.js.map +1 -0
- package/dist/chunk-TNJLNLVE.js +115 -0
- package/dist/chunk-TNJLNLVE.js.map +1 -0
- package/dist/chunk-TUID42UE.js +15 -0
- package/dist/chunk-TUID42UE.js.map +1 -0
- package/dist/chunk-UMNHJSIO.js +848 -0
- package/dist/chunk-UMNHJSIO.js.map +1 -0
- package/dist/chunk-VEME3D7K.js +298 -0
- package/dist/chunk-VEME3D7K.js.map +1 -0
- package/dist/chunk-VGECEXM6.js +213 -0
- package/dist/chunk-VGECEXM6.js.map +1 -0
- package/dist/chunk-WD6KABEU.js +200 -0
- package/dist/chunk-WD6KABEU.js.map +1 -0
- package/dist/chunk-WPNIKZMJ.js +507 -0
- package/dist/chunk-WPNIKZMJ.js.map +1 -0
- package/dist/chunk-WVS6CUCT.js +48 -0
- package/dist/chunk-WVS6CUCT.js.map +1 -0
- package/dist/chunk-XRZSK2WC.js +159 -0
- package/dist/chunk-XRZSK2WC.js.map +1 -0
- package/dist/chunk-XWNXGFX3.js +381 -0
- package/dist/chunk-XWNXGFX3.js.map +1 -0
- package/dist/chunk-Y6KT7ZTR.js +109 -0
- package/dist/chunk-Y6KT7ZTR.js.map +1 -0
- package/dist/chunk-YMUIQRWK.js +44 -0
- package/dist/chunk-YMUIQRWK.js.map +1 -0
- package/dist/chunk-YPAQFBMN.js +527 -0
- package/dist/chunk-YPAQFBMN.js.map +1 -0
- package/dist/chunk-ZCDRLN3B.js +138 -0
- package/dist/chunk-ZCDRLN3B.js.map +1 -0
- package/dist/chunk-ZKKO4MHC.js +25 -0
- package/dist/chunk-ZKKO4MHC.js.map +1 -0
- package/dist/chunk-ZN7KUMPY.js +48 -0
- package/dist/chunk-ZN7KUMPY.js.map +1 -0
- package/dist/chunk-ZNROKDSZ.js +54 -0
- package/dist/chunk-ZNROKDSZ.js.map +1 -0
- package/dist/chunk-ZX2QQJXD.js +249 -0
- package/dist/chunk-ZX2QQJXD.js.map +1 -0
- package/dist/collapsible-panel.d.ts +97 -17
- package/dist/collapsible-panel.js +134 -14
- package/dist/collapsible-panel.js.map +1 -1
- package/dist/color-field.d.ts +51 -0
- package/dist/color-field.js +92 -0
- package/dist/color-field.js.map +1 -0
- package/dist/color-picker.d.ts +113 -0
- package/dist/color-picker.js +8 -0
- package/dist/color-picker.js.map +1 -0
- package/dist/color-swatches.d.ts +56 -0
- package/dist/color-swatches.js +4 -0
- package/dist/color-swatches.js.map +1 -0
- package/dist/column-track.d.ts +41 -0
- package/dist/column-track.js +4 -0
- package/dist/column-track.js.map +1 -0
- package/dist/combobox.d.ts +40 -0
- package/dist/combobox.js +3 -0
- package/dist/combobox.js.map +1 -0
- package/dist/content-item.d.ts +170 -0
- package/dist/content-item.js +7 -0
- package/dist/content-item.js.map +1 -0
- package/dist/content-swap.d.ts +34 -0
- package/dist/content-swap.js +3 -0
- package/dist/content-swap.js.map +1 -0
- package/dist/corner-status.d.ts +36 -0
- package/dist/corner-status.js +3 -0
- package/dist/corner-status.js.map +1 -0
- package/dist/css-values.d.ts +127 -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/disclosure.d.ts +66 -0
- package/dist/disclosure.js +51 -0
- package/dist/disclosure.js.map +1 -0
- package/dist/edge-activity-indicator.d.ts +28 -0
- package/dist/edge-activity-indicator.js +3 -0
- package/dist/edge-activity-indicator.js.map +1 -0
- package/dist/empty-state.d.ts +5 -2
- package/dist/empty-state.js +2 -1
- package/dist/extension-attributes-mu8MFUl0.d.ts +13 -0
- package/dist/file-picker.d.ts +54 -0
- package/dist/file-picker.js +3 -0
- package/dist/file-picker.js.map +1 -0
- package/dist/flex-alignment-4ms8ZbV8.d.ts +5 -0
- package/dist/floating-toolbar.d.ts +29 -6
- package/dist/floating-toolbar.js +1 -1
- package/dist/framed-list.d.ts +47 -0
- package/dist/framed-list.js +4 -0
- package/dist/framed-list.js.map +1 -0
- package/dist/grid.d.ts +58 -0
- package/dist/grid.js +6 -0
- package/dist/grid.js.map +1 -0
- package/dist/help-tags-register.d.ts +13 -0
- package/dist/help-tags-register.js +10 -0
- package/dist/help-tags-register.js.map +1 -0
- package/dist/index.d.ts +73 -17
- package/dist/index.js +85 -25
- package/dist/list-action-row.d.ts +69 -12
- package/dist/list-action-row.js +8 -1
- package/dist/list-detail-dialog.d.ts +124 -0
- package/dist/list-detail-dialog.js +168 -0
- package/dist/list-detail-dialog.js.map +1 -0
- package/dist/list-header.d.ts +72 -10
- package/dist/list-header.js +4 -1
- package/dist/list-icon-tile-B8dr97OW.d.ts +18 -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 +49 -5
- package/dist/list-item.js +4 -1
- package/dist/list.d.ts +149 -0
- package/dist/list.js +7 -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 +23 -3
- package/dist/lucide-icon.js +2 -1
- package/dist/message-composer.d.ts +70 -0
- package/dist/message-composer.js +6 -0
- package/dist/message-composer.js.map +1 -0
- package/dist/nav-stack-CrZF95VO.d.ts +195 -0
- package/dist/nav-stack.d.ts +16 -38
- package/dist/nav-stack.js +15 -1
- package/dist/pane.d.ts +238 -0
- package/dist/pane.js +7 -0
- package/dist/pane.js.map +1 -0
- package/dist/panel-toolbar-vg6Ir5Dy.d.ts +77 -0
- package/dist/popup-menu-register.d.ts +11 -0
- package/dist/popup-menu-register.js +13 -0
- package/dist/popup-menu-register.js.map +1 -0
- package/dist/popup-menu.d.ts +153 -0
- package/dist/popup-menu.js +7 -0
- package/dist/popup-menu.js.map +1 -0
- package/dist/progress-bar.d.ts +52 -0
- package/dist/progress-bar.js +68 -0
- package/dist/progress-bar.js.map +1 -0
- package/dist/progress-ring.d.ts +44 -0
- package/dist/progress-ring.js +73 -0
- package/dist/progress-ring.js.map +1 -0
- package/dist/radio-group.d.ts +62 -0
- package/dist/radio-group.js +4 -0
- package/dist/radio-group.js.map +1 -0
- package/dist/resizable-region.d.ts +32 -3
- package/dist/resizable-region.js +1 -1
- package/dist/row.d.ts +53 -0
- package/dist/row.js +7 -0
- package/dist/row.js.map +1 -0
- package/dist/scroll-clearance-BikHljTc.d.ts +14 -0
- package/dist/search-field-CrGTN5sa.d.ts +208 -0
- package/dist/search-field-model.d.ts +3 -0
- package/dist/search-field-model.js +3 -0
- package/dist/search-field-model.js.map +1 -0
- package/dist/search-field.d.ts +3 -0
- package/dist/search-field.js +5 -0
- package/dist/search-field.js.map +1 -0
- package/dist/segmented-control.d.ts +14 -9
- package/dist/segmented-control.js +1 -2
- package/dist/select-register.d.ts +6 -3
- package/dist/select-register.js +402 -8
- package/dist/select-register.js.map +1 -1
- package/dist/select.d.ts +128 -9
- package/dist/select.js +6 -1
- package/dist/selection.d.ts +54 -0
- package/dist/selection.js +3 -0
- package/dist/selection.js.map +1 -0
- 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/slider.d.ts +74 -0
- package/dist/slider.js +103 -0
- package/dist/slider.js.map +1 -0
- package/dist/spacer.d.ts +18 -0
- package/dist/spacer.js +4 -0
- package/dist/spacer.js.map +1 -0
- package/dist/split-button.d.ts +69 -0
- package/dist/split-button.js +7 -0
- package/dist/split-button.js.map +1 -0
- package/dist/split-view.d.ts +67 -6
- package/dist/split-view.js +15 -15
- package/dist/split-view.js.map +1 -1
- package/dist/state-banner.d.ts +41 -7
- package/dist/state-banner.js +4 -1
- package/dist/styles/anchored-surface.css +44 -0
- package/dist/styles/backdrop-image.css +258 -0
- package/dist/styles/badge.css +157 -0
- package/dist/styles/button.css +293 -0
- package/dist/styles/catalog/components/catalog-example-stack.css +14 -0
- package/dist/styles/catalog/components/catalog-example.css +250 -0
- package/dist/styles/catalog/components/catalog-stage.css +61 -0
- package/dist/styles/catalog/components/catalog.css +26 -0
- package/dist/styles/catalog.css +5 -522
- package/dist/styles/checkbox-group.css +63 -0
- package/dist/styles/checkbox.css +122 -0
- package/dist/styles/chip.css +234 -0
- package/dist/styles/choice-chips.css +205 -0
- package/dist/styles/collapsible-panel.css +450 -16
- package/dist/styles/color-field.css +125 -0
- package/dist/styles/color-picker.css +366 -0
- package/dist/styles/color-swatches.css +122 -0
- package/dist/styles/column-track.css +57 -0
- package/dist/styles/combobox.css +115 -0
- package/dist/styles/components/actions/button/button.css +293 -0
- package/dist/styles/components/actions/floating-toolbar/floating-toolbar.css +119 -0
- package/dist/styles/components/actions/popup-menu/popup-menu.css +498 -0
- package/dist/styles/components/actions/split-button/split-button.css +141 -0
- package/dist/styles/components/actions/toolbar/toolbar.css +483 -0
- package/dist/styles/components/actions/toolbar-control-group/toolbar-control-group.css +1188 -0
- package/dist/styles/components/actions/toolbar-text/toolbar-text.css +256 -0
- package/dist/styles/components/collections/framed-list/framed-list.css +53 -0
- package/dist/styles/components/collections/list/list.css +293 -0
- package/dist/styles/components/collections/list-action-row/list-action-row.css +466 -0
- package/dist/styles/components/collections/list-header/list-header.css +236 -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 +461 -0
- package/dist/styles/components/collections/summary-row/summary-row.css +161 -0
- package/dist/styles/components/data-display/value-table/value-table.css +183 -0
- package/dist/styles/components/feedback/anchored-surface/anchored-surface.css +44 -0
- package/dist/styles/components/feedback/badge/badge.css +157 -0
- package/dist/styles/components/feedback/chip/chip.css +234 -0
- package/dist/styles/components/feedback/corner-status/corner-status.css +60 -0
- package/dist/styles/components/feedback/edge-activity-indicator/edge-activity-indicator.css +127 -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/progress-bar/progress-bar.css +168 -0
- package/dist/styles/components/feedback/progress-ring/progress-ring.css +91 -0
- package/dist/styles/components/feedback/skeleton/skeleton.css +92 -0
- package/dist/styles/components/feedback/state-banner/state-banner.css +312 -0
- package/dist/styles/components/forms/checkbox/checkbox.css +122 -0
- package/dist/styles/components/forms/checkbox-group/checkbox-group.css +63 -0
- package/dist/styles/components/forms/choice-chips/choice-chips.css +205 -0
- package/dist/styles/components/forms/color-field/color-field.css +125 -0
- package/dist/styles/components/forms/color-picker/color-picker.css +366 -0
- package/dist/styles/components/forms/color-swatches/color-swatches.css +122 -0
- package/dist/styles/components/forms/combobox/combobox.css +115 -0
- package/dist/styles/components/forms/file-picker/file-picker.css +81 -0
- package/dist/styles/components/forms/message-composer/message-composer.css +84 -0
- package/dist/styles/components/forms/radio-group/radio-group.css +158 -0
- package/dist/styles/components/forms/search-field/search-field.css +441 -0
- package/dist/styles/components/forms/segmented-control/segmented-control.css +196 -0
- package/dist/styles/components/forms/select/select.css +580 -0
- package/dist/styles/components/forms/slider/slider.css +241 -0
- package/dist/styles/components/forms/switch/switch.css +132 -0
- package/dist/styles/components/forms/tag-field/tag-field.css +8 -0
- package/dist/styles/components/forms/text-field/text-field.css +193 -0
- package/dist/styles/components/layout/collapsible-panel/collapsible-panel.css +580 -0
- package/dist/styles/components/layout/column-track/column-track.css +57 -0
- package/dist/styles/components/layout/content-swap/content-swap.css +154 -0
- package/dist/styles/components/layout/grid/grid.css +88 -0
- package/dist/styles/components/layout/pane/pane.css +780 -0
- package/dist/styles/components/layout/resizable-region/resizable-region.css +546 -0
- package/dist/styles/components/layout/row/row.css +125 -0
- package/dist/styles/components/layout/spacer/spacer.css +11 -0
- package/dist/styles/components/layout/split-view/split-view.css +171 -0
- package/dist/styles/components/layout/workbench/workbench.css +1098 -0
- package/dist/styles/components/media/lucide-icon/lucide-icon.css +15 -0
- package/dist/styles/components/navigation/disclosure-arrow/disclosure-arrow.css +43 -0
- package/dist/styles/components/navigation/nav-stack/nav-stack.css +619 -0
- package/dist/styles/components/navigation/tab-bar/tab-bar.css +203 -0
- package/dist/styles/components/navigation/tab-bar-item/tab-bar-item.css +389 -0
- package/dist/styles/components/navigation/tab-navigator/tab-navigator.css +460 -0
- package/dist/styles/components/surfaces/backdrop-image/backdrop-image.css +258 -0
- package/dist/styles/components/surfaces/content-item/content-item.css +220 -0
- package/dist/styles/components/surfaces/disclosure/disclosure.css +136 -0
- package/dist/styles/components/surfaces/sunken-panel/sunken-panel.css +34 -0
- package/dist/styles/components/surfaces/surface-scaffold/surface-scaffold.css +752 -0
- package/dist/styles/components/typography/text/text.css +232 -0
- package/dist/styles/content-item.css +3 -0
- package/dist/styles/content-swap.css +154 -0
- package/dist/styles/corner-status.css +60 -0
- package/dist/styles/disclosure-arrow.css +20 -0
- package/dist/styles/disclosure.css +136 -0
- package/dist/styles/document.css +98 -0
- package/dist/styles/edge-activity-indicator.css +127 -0
- package/dist/styles/file-picker.css +81 -0
- package/dist/styles/floating-toolbar.css +87 -6
- package/dist/styles/foundation.css +491 -51
- package/dist/styles/framed-list.css +53 -0
- package/dist/styles/grid.css +88 -0
- package/dist/styles/layout.css +3 -41
- package/dist/styles/list-action-row.css +324 -18
- package/dist/styles/list-detail-dialog.css +11 -0
- package/dist/styles/list-header.css +135 -59
- package/dist/styles/list-inset-control.css +30 -0
- package/dist/styles/list-inset-text.css +29 -0
- package/dist/styles/list-item.css +371 -33
- package/dist/styles/list.css +293 -0
- package/dist/styles/loading-spinner.css +4 -0
- package/dist/styles/lucide-icon.css +9 -0
- package/dist/styles/message-composer.css +84 -0
- package/dist/styles/nav-stack.css +555 -47
- package/dist/styles/overlay-sheet.css +211 -0
- package/dist/styles/overlay-toast.css +149 -0
- package/dist/styles/overlay-tooltip.css +55 -0
- package/dist/styles/pane.css +780 -0
- package/dist/styles/popup-menu.css +498 -0
- package/dist/styles/progress-bar.css +168 -0
- package/dist/styles/progress-ring.css +91 -0
- package/dist/styles/radio-group.css +158 -0
- package/dist/styles/resizable-region.css +439 -4
- package/dist/styles/row.css +125 -0
- package/dist/styles/search-field.css +441 -0
- package/dist/styles/segmented-control.css +36 -9
- package/dist/styles/select.css +516 -74
- package/dist/styles/skeleton.css +64 -3
- package/dist/styles/slider.css +241 -0
- package/dist/styles/spacer.css +11 -0
- package/dist/styles/split-button.css +141 -0
- package/dist/styles/split-view.css +139 -3
- package/dist/styles/state-banner.css +164 -25
- package/dist/styles/styles.css +38 -3
- package/dist/styles/summary-row.css +161 -0
- package/dist/styles/sunken-panel.css +34 -0
- package/dist/styles/surface-scaffold.css +752 -0
- package/dist/styles/switch.css +132 -0
- package/dist/styles/tab-bar-item.css +389 -0
- package/dist/styles/tab-bar.css +167 -9
- package/dist/styles/tab-navigator.css +460 -0
- package/dist/styles/tag-field.css +8 -0
- package/dist/styles/text-field.css +193 -0
- package/dist/styles/text.css +232 -0
- package/dist/styles/toolbar-control-group.css +1000 -37
- package/dist/styles/toolbar-text.css +223 -7
- package/dist/styles/toolbar.css +433 -11
- package/dist/styles/value-table.css +115 -7
- package/dist/styles/webawesome.css +476 -20
- package/dist/styles/workbench-dialog.css +10 -0
- package/dist/styles/workbench.css +1011 -7
- package/dist/summary-row.d.ts +56 -0
- package/dist/summary-row.js +4 -0
- package/dist/summary-row.js.map +1 -0
- package/dist/sunken-panel.d.ts +38 -0
- package/dist/sunken-panel.js +4 -0
- package/dist/sunken-panel.js.map +1 -0
- package/dist/surface-scaffold-register.d.ts +12 -0
- package/dist/surface-scaffold-register.js +10 -0
- package/dist/surface-scaffold-register.js.map +1 -0
- package/dist/surface-scaffold.d.ts +284 -0
- package/dist/surface-scaffold.js +8 -0
- package/dist/surface-scaffold.js.map +1 -0
- package/dist/surface-tint-DQgYCaP9.d.ts +25 -0
- package/dist/switch.d.ts +38 -0
- package/dist/switch.js +4 -0
- package/dist/switch.js.map +1 -0
- package/dist/tab-bar-item.d.ts +65 -0
- package/dist/tab-bar-item.js +6 -0
- package/dist/tab-bar-item.js.map +1 -0
- package/dist/tab-bar.d.ts +33 -7
- package/dist/tab-bar.js +1 -1
- package/dist/tab-navigator.d.ts +155 -0
- package/dist/tab-navigator.js +132 -0
- package/dist/tab-navigator.js.map +1 -0
- package/dist/tag-field.d.ts +52 -0
- package/dist/tag-field.js +6 -0
- package/dist/tag-field.js.map +1 -0
- package/dist/text-field.d.ts +91 -0
- package/dist/text-field.js +6 -0
- package/dist/text-field.js.map +1 -0
- package/dist/text.d.ts +103 -0
- package/dist/text.js +3 -0
- package/dist/text.js.map +1 -0
- package/dist/toolbar-control-group.d.ts +112 -8
- package/dist/toolbar-control-group.js +3 -1
- package/dist/toolbar-text.d.ts +63 -9
- package/dist/toolbar-text.js +2 -1
- package/dist/toolbar.d.ts +78 -7
- package/dist/toolbar.js +1 -1
- package/dist/types-DmHWkSd6.d.ts +207 -0
- package/dist/value-table.d.ts +30 -4
- package/dist/value-table.js +2 -1
- package/dist/webawesome.d.ts +11 -1
- package/dist/wire-catalog.d.ts +118 -5
- package/dist/wire-catalog.js +314 -14
- package/dist/wire-catalog.js.map +1 -1
- package/dist/wire-checkboxes.d.ts +10 -0
- package/dist/wire-checkboxes.js +3 -0
- package/dist/{wire-token-search-fields.js.map → wire-checkboxes.js.map} +1 -1
- package/dist/wire-choice-chips.d.ts +17 -0
- package/dist/wire-choice-chips.js +4 -0
- package/dist/wire-choice-chips.js.map +1 -0
- package/dist/wire-color-fields.d.ts +33 -0
- package/dist/wire-color-fields.js +82 -0
- package/dist/wire-color-fields.js.map +1 -0
- package/dist/wire-color-pickers.d.ts +35 -0
- package/dist/wire-color-pickers.js +9 -0
- package/dist/wire-color-pickers.js.map +1 -0
- package/dist/wire-comboboxes.d.ts +26 -0
- package/dist/wire-comboboxes.js +4 -0
- package/dist/wire-comboboxes.js.map +1 -0
- package/dist/wire-content-items.d.ts +15 -0
- package/dist/wire-content-items.js +270 -0
- package/dist/wire-content-items.js.map +1 -0
- package/dist/wire-corner-status.d.ts +11 -0
- package/dist/wire-corner-status.js +3 -0
- package/dist/wire-corner-status.js.map +1 -0
- package/dist/wire-file-pickers.d.ts +27 -0
- package/dist/wire-file-pickers.js +3 -0
- package/dist/wire-file-pickers.js.map +1 -0
- package/dist/wire-list-focus-scroll.d.ts +16 -0
- package/dist/wire-list-focus-scroll.js +3 -0
- package/dist/wire-list-focus-scroll.js.map +1 -0
- package/dist/wire-list-reorder.d.ts +41 -0
- package/dist/wire-list-reorder.js +3 -0
- package/dist/wire-list-reorder.js.map +1 -0
- package/dist/wire-message-composers.d.ts +17 -0
- package/dist/wire-message-composers.js +3 -0
- package/dist/wire-message-composers.js.map +1 -0
- package/dist/wire-nav-stack.d.ts +4 -1
- package/dist/wire-nav-stack.js +352 -15
- package/dist/wire-nav-stack.js.map +1 -1
- package/dist/wire-overlay-sheets.d.ts +20 -0
- package/dist/wire-overlay-sheets.js +4 -0
- package/dist/wire-overlay-sheets.js.map +1 -0
- package/dist/wire-pane-chrome.d.ts +21 -0
- package/dist/wire-pane-chrome.js +67 -0
- package/dist/wire-pane-chrome.js.map +1 -0
- package/dist/wire-resizable-regions.d.ts +2 -1
- package/dist/wire-resizable-regions.js +2 -1
- package/dist/wire-scroll-dividers.d.ts +87 -0
- package/dist/wire-scroll-dividers.js +3 -0
- package/dist/wire-scroll-dividers.js.map +1 -0
- package/dist/{wire-token-search-fields.d.ts → wire-search-fields.d.ts} +34 -25
- package/dist/wire-search-fields.js +6 -0
- package/dist/wire-search-fields.js.map +1 -0
- package/dist/wire-sidebar.d.ts +24 -4
- package/dist/wire-sidebar.js +159 -45
- package/dist/wire-sidebar.js.map +1 -1
- package/dist/wire-sliders.d.ts +12 -0
- package/dist/wire-sliders.js +31 -0
- package/dist/wire-sliders.js.map +1 -0
- package/dist/wire-tab-bars.d.ts +6 -2
- package/dist/wire-tab-bars.js +1 -1
- package/dist/wire-tab-navigator.d.ts +13 -0
- package/dist/wire-tab-navigator.js +153 -0
- package/dist/wire-tab-navigator.js.map +1 -0
- package/dist/wire-tag-fields.d.ts +41 -0
- package/dist/wire-tag-fields.js +258 -0
- package/dist/wire-tag-fields.js.map +1 -0
- package/dist/wire-text-fields.d.ts +12 -0
- package/dist/wire-text-fields.js +3 -0
- package/dist/wire-text-fields.js.map +1 -0
- 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-dialog.d.ts +107 -0
- package/dist/workbench-dialog.js +128 -0
- package/dist/workbench-dialog.js.map +1 -0
- package/dist/workbench.d.ts +259 -10
- package/dist/workbench.js +22 -15
- package/dist/workbench.js.map +1 -1
- package/docs/accessibility.md +835 -41
- package/docs/anchored-surface.md +107 -0
- package/docs/app-layouts.md +200 -10
- package/docs/apple-hig.md +2 -0
- package/docs/backdrop-image.md +132 -0
- package/docs/button.md +15 -0
- package/docs/catalog.md +599 -63
- package/docs/collapsible-panel.md +308 -25
- package/docs/color-field.md +65 -0
- package/docs/color-picker.md +102 -0
- package/docs/color-swatches.md +46 -0
- package/docs/component-contract.md +872 -57
- package/docs/component-integration.md +75 -0
- package/docs/component-selection.md +1124 -108
- package/docs/design/templates/button/emphasis-dark.svg +1 -0
- package/docs/design/templates/button/emphasis.svg +1 -0
- package/docs/design/templates/button/full-width-dark.svg +1 -0
- package/docs/design/templates/button/full-width.svg +1 -0
- package/docs/design/templates/button/icons-dark.svg +1 -0
- package/docs/design/templates/button/icons.svg +1 -0
- package/docs/design/templates/button/pill-dark.svg +1 -0
- package/docs/design/templates/button/pill.svg +1 -0
- package/docs/design/templates/button/states-dark.svg +1 -0
- package/docs/design/templates/button/states.svg +1 -0
- package/docs/design/templates/button/toggles-dark.svg +1 -0
- package/docs/design/templates/button/toggles.svg +1 -0
- package/docs/design/templates/button/tones-dark.svg +1 -0
- package/docs/design/templates/button/tones.svg +1 -0
- package/docs/design/templates/button-dark.svg +1 -0
- package/docs/design/templates/button.svg +1 -0
- package/docs/design/templates/checkbox/compact-dark.svg +1 -0
- package/docs/design/templates/checkbox/compact.svg +1 -0
- package/docs/design/templates/checkbox/error-dark.svg +1 -0
- package/docs/design/templates/checkbox/error.svg +1 -0
- package/docs/design/templates/checkbox/mixed-dark.svg +1 -0
- package/docs/design/templates/checkbox/mixed.svg +1 -0
- package/docs/design/templates/checkbox/states-dark.svg +1 -0
- package/docs/design/templates/checkbox/states.svg +1 -0
- package/docs/design/templates/checkbox-dark.svg +1 -0
- package/docs/design/templates/checkbox-group/horizontal-dark.svg +1 -0
- package/docs/design/templates/checkbox-group/horizontal.svg +1 -0
- package/docs/design/templates/checkbox-group/vertical-dark.svg +1 -0
- package/docs/design/templates/checkbox-group/vertical.svg +1 -0
- package/docs/design/templates/checkbox-group-dark.svg +1 -0
- package/docs/design/templates/checkbox-group.svg +1 -0
- package/docs/design/templates/checkbox.svg +1 -0
- package/docs/design/templates/chip/action-filters-dark.svg +1 -0
- package/docs/design/templates/chip/action-filters.svg +1 -0
- package/docs/design/templates/chip/tags-dark.svg +1 -0
- package/docs/design/templates/chip/tags.svg +1 -0
- package/docs/design/templates/chip-dark.svg +1 -0
- package/docs/design/templates/chip.svg +1 -0
- package/docs/design/templates/choice-chips/color-palette-dark.svg +1 -0
- package/docs/design/templates/choice-chips/color-palette.svg +1 -0
- package/docs/design/templates/choice-chips/compact-icons-dark.svg +1 -0
- package/docs/design/templates/choice-chips/compact-icons.svg +1 -0
- package/docs/design/templates/choice-chips/multiple-dark.svg +1 -0
- package/docs/design/templates/choice-chips/multiple.svg +1 -0
- package/docs/design/templates/choice-chips-dark.svg +1 -0
- package/docs/design/templates/choice-chips.svg +1 -0
- package/docs/design/templates/color-field/compact-dark.svg +1 -0
- package/docs/design/templates/color-field/compact.svg +1 -0
- package/docs/design/templates/color-field/error-dark.svg +1 -0
- package/docs/design/templates/color-field/error.svg +1 -0
- package/docs/design/templates/color-field/hint-dark.svg +1 -0
- package/docs/design/templates/color-field/hint.svg +1 -0
- package/docs/design/templates/color-field-dark.svg +1 -0
- package/docs/design/templates/color-field.svg +1 -0
- package/docs/design/templates/color-picker/gray-dark.svg +1 -0
- package/docs/design/templates/color-picker/gray.svg +1 -0
- package/docs/design/templates/color-picker/hsb-dark.svg +1 -0
- package/docs/design/templates/color-picker/hsb.svg +1 -0
- package/docs/design/templates/color-picker/rgb-dark.svg +1 -0
- package/docs/design/templates/color-picker/rgb.svg +1 -0
- package/docs/design/templates/color-picker-dark.svg +1 -0
- package/docs/design/templates/color-picker.svg +1 -0
- package/docs/design/templates/color-swatches/palette-dark.svg +1 -0
- package/docs/design/templates/color-swatches/palette.svg +1 -0
- package/docs/design/templates/color-swatches-dark.svg +1 -0
- package/docs/design/templates/color-swatches.svg +1 -0
- package/docs/design/templates/disclosure/embedded-dark.svg +1 -0
- package/docs/design/templates/disclosure/embedded.svg +1 -0
- package/docs/design/templates/disclosure/framed-sunken-dark.svg +1 -0
- package/docs/design/templates/disclosure/framed-sunken.svg +1 -0
- package/docs/design/templates/disclosure/plain-dark.svg +1 -0
- package/docs/design/templates/disclosure/plain.svg +1 -0
- package/docs/design/templates/disclosure-dark.svg +1 -0
- package/docs/design/templates/disclosure.svg +1 -0
- package/docs/design/templates/empty-state/filtered-dark.svg +1 -1
- package/docs/design/templates/empty-state/filtered.svg +1 -1
- package/docs/design/templates/empty-state/with-action-dark.svg +1 -1
- package/docs/design/templates/empty-state/with-action.svg +1 -1
- package/docs/design/templates/empty-state-dark.svg +1 -7
- package/docs/design/templates/empty-state.svg +1 -7
- package/docs/design/templates/list/compact-dark.svg +1 -0
- package/docs/design/templates/list/compact.svg +1 -0
- package/docs/design/templates/list/stack-dark.svg +1 -0
- package/docs/design/templates/list/stack.svg +1 -0
- package/docs/design/templates/list-action-row/default-dark.svg +1 -1
- package/docs/design/templates/list-action-row/default.svg +1 -1
- package/docs/design/templates/list-action-row/icon-tile-dark.svg +1 -0
- package/docs/design/templates/list-action-row/icon-tile.svg +1 -0
- 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/trailing-menu-dark.svg +1 -0
- package/docs/design/templates/list-action-row/trailing-menu.svg +1 -0
- package/docs/design/templates/list-action-row-dark.svg +1 -7
- package/docs/design/templates/list-action-row.svg +1 -7
- package/docs/design/templates/list-dark.svg +1 -0
- package/docs/design/templates/list-header/action-dark.svg +1 -1
- package/docs/design/templates/list-header/action.svg +1 -1
- package/docs/design/templates/list-header/count-dark.svg +1 -1
- package/docs/design/templates/list-header/count.svg +1 -1
- 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 -1
- package/docs/design/templates/list-header/toggle-collapsed.svg +1 -1
- package/docs/design/templates/list-header/toggle-expanded-dark.svg +1 -1
- package/docs/design/templates/list-header/toggle-expanded.svg +1 -1
- package/docs/design/templates/list-header-dark.svg +1 -11
- package/docs/design/templates/list-header.svg +1 -11
- package/docs/design/templates/list-item/default-dark.svg +1 -1
- package/docs/design/templates/list-item/default.svg +1 -1
- package/docs/design/templates/list-item/icon-tile-dark.svg +1 -0
- package/docs/design/templates/list-item/icon-tile.svg +1 -0
- package/docs/design/templates/list-item/multiline-dark.svg +1 -1
- package/docs/design/templates/list-item/multiline.svg +1 -1
- package/docs/design/templates/list-item/selected-dark.svg +1 -1
- package/docs/design/templates/list-item/selected.svg +1 -1
- package/docs/design/templates/list-item/trailing-dark.svg +1 -1
- package/docs/design/templates/list-item/trailing.svg +1 -1
- package/docs/design/templates/list-item-dark.svg +1 -11
- package/docs/design/templates/list-item.svg +1 -11
- package/docs/design/templates/list.svg +1 -0
- package/docs/design/templates/message-composer/chat-dark.svg +1 -0
- package/docs/design/templates/message-composer/chat.svg +1 -0
- package/docs/design/templates/message-composer/prompt-dark.svg +1 -0
- package/docs/design/templates/message-composer/prompt.svg +1 -0
- package/docs/design/templates/message-composer-dark.svg +1 -0
- package/docs/design/templates/message-composer.svg +1 -0
- package/docs/design/templates/progress-bar/determinate-dark.svg +1 -0
- package/docs/design/templates/progress-bar/determinate.svg +1 -0
- package/docs/design/templates/progress-bar/tones-dark.svg +1 -0
- package/docs/design/templates/progress-bar/tones.svg +1 -0
- package/docs/design/templates/progress-bar-dark.svg +1 -0
- package/docs/design/templates/progress-bar.svg +1 -0
- package/docs/design/templates/progress-ring/sizes-dark.svg +1 -0
- package/docs/design/templates/progress-ring/sizes.svg +1 -0
- package/docs/design/templates/progress-ring/tones-dark.svg +1 -0
- package/docs/design/templates/progress-ring/tones.svg +1 -0
- package/docs/design/templates/progress-ring-dark.svg +1 -0
- package/docs/design/templates/progress-ring.svg +1 -0
- package/docs/design/templates/radio-group/horizontal-dark.svg +1 -0
- package/docs/design/templates/radio-group/horizontal.svg +1 -0
- package/docs/design/templates/radio-group/vertical-dark.svg +1 -0
- package/docs/design/templates/radio-group/vertical.svg +1 -0
- package/docs/design/templates/radio-group-dark.svg +1 -0
- package/docs/design/templates/radio-group.svg +1 -0
- package/docs/design/templates/search-field/empty-dark.svg +1 -0
- package/docs/design/templates/search-field/empty.svg +1 -0
- package/docs/design/templates/search-field/tokens-dark.svg +1 -0
- package/docs/design/templates/search-field/tokens.svg +1 -0
- package/docs/design/templates/search-field-dark.svg +1 -0
- package/docs/design/templates/search-field.svg +1 -0
- package/docs/design/templates/segmented-control/equal-dark.svg +1 -1
- package/docs/design/templates/segmented-control/equal.svg +1 -1
- package/docs/design/templates/segmented-control/pill-small-dark.svg +1 -1
- package/docs/design/templates/segmented-control/pill-small.svg +1 -1
- package/docs/design/templates/segmented-control-dark.svg +1 -7
- package/docs/design/templates/segmented-control.svg +1 -7
- package/docs/design/templates/select/compact-dark.svg +1 -0
- package/docs/design/templates/select/compact.svg +1 -0
- package/docs/design/templates/select/form-dark.svg +1 -0
- package/docs/design/templates/select/form.svg +1 -0
- package/docs/design/templates/select/icons-dark.svg +1 -0
- package/docs/design/templates/select/icons.svg +1 -0
- package/docs/design/templates/select-dark.svg +1 -0
- package/docs/design/templates/select.svg +1 -0
- package/docs/design/templates/skeleton-dark.svg +1 -9
- package/docs/design/templates/skeleton.svg +1 -9
- package/docs/design/templates/slider/compact-dark.svg +1 -0
- package/docs/design/templates/slider/compact.svg +1 -0
- package/docs/design/templates/slider/readout-dark.svg +1 -0
- package/docs/design/templates/slider/readout.svg +1 -0
- package/docs/design/templates/slider/ticks-dark.svg +1 -0
- package/docs/design/templates/slider/ticks.svg +1 -0
- package/docs/design/templates/slider-dark.svg +1 -0
- package/docs/design/templates/slider.svg +1 -0
- package/docs/design/templates/split-button/full-width-dark.svg +1 -0
- package/docs/design/templates/split-button/full-width.svg +1 -0
- package/docs/design/templates/split-button/pill-dark.svg +1 -0
- package/docs/design/templates/split-button/pill.svg +1 -0
- package/docs/design/templates/split-button/states-dark.svg +1 -0
- package/docs/design/templates/split-button/states.svg +1 -0
- package/docs/design/templates/split-button/tones-dark.svg +1 -0
- package/docs/design/templates/split-button/tones.svg +1 -0
- package/docs/design/templates/split-button-dark.svg +1 -0
- package/docs/design/templates/split-button.svg +1 -0
- package/docs/design/templates/state-banner/danger-dark.svg +1 -1
- package/docs/design/templates/state-banner/danger.svg +1 -1
- package/docs/design/templates/state-banner/info-badge-dark.svg +1 -0
- package/docs/design/templates/state-banner/info-badge.svg +1 -0
- package/docs/design/templates/state-banner/info-dark.svg +1 -1
- package/docs/design/templates/state-banner/info.svg +1 -1
- package/docs/design/templates/state-banner/strip-dark.svg +1 -0
- package/docs/design/templates/state-banner/strip.svg +1 -0
- package/docs/design/templates/state-banner/success-dark.svg +1 -1
- package/docs/design/templates/state-banner/success.svg +1 -1
- package/docs/design/templates/state-banner/warning-dark.svg +1 -1
- package/docs/design/templates/state-banner/warning.svg +1 -1
- package/docs/design/templates/state-banner-dark.svg +1 -11
- package/docs/design/templates/state-banner.svg +1 -11
- package/docs/design/templates/switch/compact-dark.svg +1 -0
- package/docs/design/templates/switch/compact.svg +1 -0
- package/docs/design/templates/switch/states-dark.svg +1 -0
- package/docs/design/templates/switch/states.svg +1 -0
- package/docs/design/templates/switch-dark.svg +1 -0
- package/docs/design/templates/switch.svg +1 -0
- package/docs/design/templates/tab-bar/workspace-tabs-dark.svg +1 -1
- package/docs/design/templates/tab-bar/workspace-tabs.svg +1 -1
- package/docs/design/templates/tab-bar-dark.svg +1 -5
- package/docs/design/templates/tab-bar.svg +1 -5
- package/docs/design/templates/tag-field/error-dark.svg +1 -0
- package/docs/design/templates/tag-field/error.svg +1 -0
- package/docs/design/templates/tag-field/tags-dark.svg +1 -0
- package/docs/design/templates/tag-field/tags.svg +1 -0
- package/docs/design/templates/tag-field-dark.svg +1 -0
- package/docs/design/templates/tag-field.svg +1 -0
- package/docs/design/templates/text-field/compact-dark.svg +1 -0
- package/docs/design/templates/text-field/compact.svg +1 -0
- package/docs/design/templates/text-field/error-dark.svg +1 -0
- package/docs/design/templates/text-field/error.svg +1 -0
- package/docs/design/templates/text-field/labeled-dark.svg +1 -0
- package/docs/design/templates/text-field/labeled.svg +1 -0
- package/docs/design/templates/text-field/multiline-dark.svg +1 -0
- package/docs/design/templates/text-field/multiline.svg +1 -0
- package/docs/design/templates/text-field/number-dark.svg +1 -0
- package/docs/design/templates/text-field/number.svg +1 -0
- package/docs/design/templates/text-field/search-dark.svg +1 -0
- package/docs/design/templates/text-field/search.svg +1 -0
- package/docs/design/templates/text-field-dark.svg +1 -0
- package/docs/design/templates/text-field.svg +1 -0
- package/docs/design/templates/toolbar/title-and-actions-dark.svg +1 -1
- package/docs/design/templates/toolbar/title-and-actions.svg +1 -1
- package/docs/design/templates/toolbar/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 -1
- package/docs/design/templates/toolbar-control-group/borderless-single.svg +1 -1
- package/docs/design/templates/toolbar-control-group/glass-dark.svg +1 -0
- package/docs/design/templates/toolbar-control-group/glass.svg +1 -0
- package/docs/design/templates/toolbar-control-group/icon-buttons-dark.svg +1 -1
- package/docs/design/templates/toolbar-control-group/icon-buttons.svg +1 -1
- package/docs/design/templates/toolbar-control-group/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 -1
- package/docs/design/templates/toolbar-control-group/push-buttons.svg +1 -1
- package/docs/design/templates/toolbar-control-group/with-text-dark.svg +1 -1
- package/docs/design/templates/toolbar-control-group/with-text.svg +1 -1
- package/docs/design/templates/toolbar-control-group-dark.svg +1 -11
- package/docs/design/templates/toolbar-control-group.svg +1 -11
- package/docs/design/templates/toolbar-dark.svg +1 -5
- package/docs/design/templates/toolbar-text/dark-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 -1
- package/docs/design/templates/toolbar-text/default.svg +1 -1
- package/docs/design/templates/toolbar-text/large-dark.svg +1 -1
- package/docs/design/templates/toolbar-text/large.svg +1 -1
- package/docs/design/templates/toolbar-text/small-dark.svg +1 -1
- package/docs/design/templates/toolbar-text/small.svg +1 -1
- package/docs/design/templates/toolbar-text-dark.svg +1 -9
- package/docs/design/templates/toolbar-text.svg +1 -9
- package/docs/design/templates/toolbar.svg +1 -5
- package/docs/design/templates/value-table/details-dark.svg +1 -1
- package/docs/design/templates/value-table/details.svg +1 -1
- package/docs/design/templates/value-table-dark.svg +1 -5
- package/docs/design/templates/value-table.svg +1 -5
- package/docs/design/templates.md +89 -33
- package/docs/design-philosophy.md +65 -20
- package/docs/device-class.md +10 -9
- package/docs/disclosure.md +97 -0
- package/docs/document-baseline.md +93 -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 +971 -53
- package/docs/list-detail-dialog.md +100 -0
- package/docs/manual-test-plan.md +55 -0
- package/docs/message-composer.md +156 -0
- package/docs/nav-stack.md +327 -14
- package/docs/overlay-toast.md +62 -0
- package/docs/overlay-tooltip.md +53 -0
- package/docs/progress.md +62 -0
- package/docs/recipes.md +156 -73
- package/docs/slider.md +64 -0
- package/docs/split-view.md +96 -7
- package/docs/sunken-panel.md +106 -0
- package/docs/surface-scaffold.md +490 -0
- package/docs/tab-navigator.md +291 -0
- package/docs/tag-field.md +66 -0
- package/docs/type-contracts.md +137 -0
- package/docs/ui-analyzer.md +406 -0
- package/docs/ui-doctor.md +298 -0
- package/docs/ui-evaluator.md +139 -0
- package/docs/ux-demo.md +58 -17
- package/docs/webawesome-migration.md +82 -0
- package/docs/webawesome-theme.md +306 -47
- package/docs/workbench-dialog.md +88 -0
- package/docs/workbench.md +637 -12
- package/docs/writing.md +154 -0
- package/doctor/cli.mjs +120 -0
- package/doctor/component-style-checks.mjs +457 -0
- package/doctor/config.schema.json +94 -0
- package/doctor/copy-capitalization-checks.mjs +603 -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 +1424 -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 +943 -54
- package/package.json +488 -43
- package/scripts/component-catalog-extension-validation.mjs +28 -0
- package/traversal-exclusions.mjs +86 -0
- package/ux-demo/recipes/app-shell.tsx +204 -16
- package/ux-demo/recipes/collapsible-sidebar.tsx +206 -45
- package/ux-demo/recipes/compact-toolbar.tsx +135 -14
- package/ux-demo/recipes/composer-form.tsx +135 -24
- package/ux-demo/recipes/list-detail-dialog.tsx +155 -21
- package/ux-demo/recipes/list-workspace-states.tsx +183 -11
- package/ux-demo/recipes/loaders.ts +11 -3
- package/ux-demo/recipes/loading-inspector.tsx +162 -39
- package/ux-demo/recipes/media-detail.tsx +272 -0
- package/ux-demo/recipes/mount-recipe.ts +28 -11
- package/ux-demo/recipes/navigation-sidebar.tsx +137 -11
- package/ux-demo/recipes/navigation-stack.tsx +79 -24
- package/ux-demo/recipes/types.ts +18 -2
- package/ux-demo/recipes/workspace-header.tsx +86 -5
- package/vite-ux-review.d.mts +83 -0
- package/vite-ux-review.mjs +120 -0
- package/dist/app-tab.d.ts +0 -30
- package/dist/app-tab.js +0 -5
- package/dist/app-tab.js.map +0 -1
- package/dist/browser/app-tab.js +0 -4
- package/dist/browser/panel-header.js +0 -7
- package/dist/browser/token-search-field.js +0 -4
- package/dist/chunk-2Z5TWHKQ.js +0 -34
- package/dist/chunk-2Z5TWHKQ.js.map +0 -1
- package/dist/chunk-37T3VNIZ.js +0 -19
- package/dist/chunk-37T3VNIZ.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-5ATCDSQS.js +0 -42
- package/dist/chunk-5ATCDSQS.js.map +0 -1
- package/dist/chunk-5E2HVJ33.js +0 -10
- package/dist/chunk-5E2HVJ33.js.map +0 -1
- package/dist/chunk-7BR3DO2A.js +0 -31
- package/dist/chunk-7BR3DO2A.js.map +0 -1
- package/dist/chunk-7JB7VPRI.js +0 -34
- package/dist/chunk-7JB7VPRI.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-AVZHJN6C.js +0 -14
- package/dist/chunk-AVZHJN6C.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-CH4SQ6H5.js +0 -39
- package/dist/chunk-CH4SQ6H5.js.map +0 -1
- package/dist/chunk-DAFFDO33.js +0 -14
- package/dist/chunk-DAFFDO33.js.map +0 -1
- package/dist/chunk-I7INRJO4.js +0 -17
- package/dist/chunk-I7INRJO4.js.map +0 -1
- package/dist/chunk-L4OKFDJY.js +0 -24
- package/dist/chunk-L4OKFDJY.js.map +0 -1
- package/dist/chunk-LCOBDOCC.js +0 -265
- package/dist/chunk-LCOBDOCC.js.map +0 -1
- package/dist/chunk-M5JRI6MN.js +0 -27
- package/dist/chunk-M5JRI6MN.js.map +0 -1
- package/dist/chunk-RNPGFQ33.js +0 -10
- package/dist/chunk-RNPGFQ33.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-XE5ZLPCC.js +0 -20
- package/dist/chunk-XE5ZLPCC.js.map +0 -1
- package/dist/chunk-XXMOARTH.js +0 -229
- package/dist/chunk-XXMOARTH.js.map +0 -1
- package/dist/chunk-YGN7OMLT.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/app-tab.css +0 -152
- package/dist/styles/panel-header.css +0 -64
- package/dist/styles/tab-scaffold.css +0 -84
- package/dist/styles/token-search-field.css +0 -289
- 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/token-search-field.d.ts +0 -43
- package/dist/token-search-field.js +0 -4
- package/dist/token-search-field.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/dist/wire-token-search-fields.js +0 -5
- package/docs/design/templates/panel-header/icon-actions-dark.svg +0 -1
- package/docs/design/templates/panel-header/icon-actions.svg +0 -1
- package/docs/design/templates/panel-header/icon-summary-actions-dark.svg +0 -1
- package/docs/design/templates/panel-header/icon-summary-actions.svg +0 -1
- package/docs/design/templates/panel-header/no-icon-dark.svg +0 -1
- package/docs/design/templates/panel-header/no-icon.svg +0 -1
- package/docs/design/templates/panel-header/page-heading-dark.svg +0 -1
- package/docs/design/templates/panel-header/page-heading.svg +0 -1
- package/docs/design/templates/panel-header/title-only-dark.svg +0 -1
- package/docs/design/templates/panel-header/title-only.svg +0 -1
- package/docs/design/templates/panel-header-dark.svg +0 -13
- package/docs/design/templates/panel-header.svg +0 -13
- package/docs/design/templates/token-search-field/empty-dark.svg +0 -1
- package/docs/design/templates/token-search-field/empty.svg +0 -1
- package/docs/design/templates/token-search-field/tokens-dark.svg +0 -1
- package/docs/design/templates/token-search-field/tokens.svg +0 -1
- package/docs/design/templates/token-search-field-dark.svg +0 -7
- package/docs/design/templates/token-search-field.svg +0 -7
- package/docs/tab-scaffold.md +0 -41
- package/ux-demo/recipes/recipes.css +0 -448
package/README.md
CHANGED
|
@@ -4,11 +4,57 @@ Accessible, composable UI primitives for [kerf](https://github.com/brianwestphal
|
|
|
4
4
|
|
|
5
5
|
Start interface work with the [need-first component selection matrix](./docs/component-selection.md). It distinguishes direct reuse, composition, thin application adapters, and genuinely custom semantics, with imports, required wiring, application ownership, alternatives, and recipes for every public primitive.
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
When adding a first-party public component, follow the
|
|
8
|
+
[component integration workflow](./docs/component-integration.md). The catalog
|
|
9
|
+
entry drives one validator across package, build, barrel, CSS, demo, route, and
|
|
10
|
+
AI signature projections, with a non-mutating dry-run report.
|
|
11
|
+
|
|
12
|
+
### Shared semantic tones
|
|
13
|
+
|
|
14
|
+
`SemanticTone` is the shared color-role type for `Badge`, `Chip`, `StateBanner`,
|
|
15
|
+
and semantic `ContentItem` appearances: `neutral`, `info`, `pop`, `success`,
|
|
16
|
+
`warning`, and `danger`. Import it as a type from `@kerfjs/ui`,
|
|
17
|
+
`@kerfjs/ui/badge`, `@kerfjs/ui/state-banner`, or `@kerfjs/ui/content-item`.
|
|
18
|
+
Use `info` for the role backed by the existing `--kui-color-brand-*` tokens.
|
|
19
|
+
Migrate Badge/Chip `tone="brand"` to `tone="info"`; `BadgeTone` and
|
|
20
|
+
`StateBannerTone` remain deprecated aliases of `SemanticTone`.
|
|
21
|
+
|
|
22
|
+
## Source organization
|
|
23
|
+
|
|
24
|
+
The flat files directly under `src/` are stable package entry facades. Keep
|
|
25
|
+
component implementation and CSS together under
|
|
26
|
+
`src/components/<family>/<component>/`. Put support code used by one component
|
|
27
|
+
in its `internal/`, `model/`, `register/`, or `wiring/` folder. Shared types and
|
|
28
|
+
utilities live under `src/shared/`; wiring that spans several components lives
|
|
29
|
+
under `src/wiring/`; Web Awesome integration code lives under
|
|
30
|
+
`src/integrations/`. Catalog-only implementation remains under `src/catalog/`.
|
|
31
|
+
|
|
32
|
+
Choose an existing family by the component role, and add a family only when no
|
|
33
|
+
current one fits. Public JavaScript and CSS subpaths remain flat through their
|
|
34
|
+
root facades. `npm run check:source-organization` rejects implementation added
|
|
35
|
+
back to the root or component-local support code placed in the wrong folder.
|
|
36
|
+
|
|
37
|
+
Browser verification always builds current source: both `npm run test:e2e`
|
|
38
|
+
and direct focused Playwright commands run the catalog/conformance preflights
|
|
39
|
+
and production build before preview. See the [UX catalog contract](./docs/ux-demo.md).
|
|
40
|
+
Failed Playwright tests retain traces and screenshots alongside an HTML report.
|
|
41
|
+
CI runs the complete suite in concurrent Chromium, Firefox, and WebKit jobs,
|
|
42
|
+
while the `ui` job checks the package. A failing browser job uploads its report
|
|
43
|
+
and per-test evidence for 14 days as
|
|
44
|
+
`ui-browser-failure-<browser>-<run>-<attempt>`.
|
|
45
|
+
|
|
46
|
+
When authoring a component gallery, follow the single
|
|
47
|
+
[Catalog demo authoring contract](./docs/catalog.md#catalog-demo-authoring-contract)
|
|
48
|
+
for focused-versus-composition modes, helper nesting, specimen selection,
|
|
49
|
+
geometry inspection, and metadata ownership. AI tools can discover that
|
|
50
|
+
contract and its public imports through the shipped
|
|
51
|
+
[`catalog-authoring.json`](./ai/catalog-authoring.json) artifact.
|
|
52
|
+
|
|
53
|
+
For connective application patterns, use the eleven [production composition
|
|
8
54
|
recipes](./docs/recipes.md). Each has a stable catalog route, runnable state,
|
|
9
55
|
public-subpath source, semantic layout ownership, and explicit application
|
|
10
56
|
customization boundaries. The composer recipe demonstrates one coherent form
|
|
11
|
-
surface with `
|
|
57
|
+
surface with a `Toolbar`/`ToolbarText` heading and field/action controls aligned to the
|
|
12
58
|
shared 8px gutter; only persistent feedback adds a nested semantic
|
|
13
59
|
`StateBanner` surface.
|
|
14
60
|
|
|
@@ -23,57 +69,90 @@ npm install kerfjs @kerfjs/ui
|
|
|
23
69
|
```
|
|
24
70
|
|
|
25
71
|
```tsx
|
|
26
|
-
import {
|
|
27
|
-
import {
|
|
28
|
-
import {
|
|
29
|
-
import {
|
|
30
|
-
import {
|
|
31
|
-
import { ToolbarText } from
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
rootAttributes={{ 'data-section-id': 'workspace' }}
|
|
41
|
-
triggerAttributes={{
|
|
42
|
-
popoverTarget: 'workspace-actions',
|
|
43
|
-
popoverTargetAction: 'toggle',
|
|
44
|
-
'aria-controls': 'workspace-actions',
|
|
45
|
-
'aria-haspopup': 'dialog',
|
|
46
|
-
}}
|
|
47
|
-
/>
|
|
48
|
-
<ListItem
|
|
49
|
-
action="open-notes"
|
|
50
|
-
label="Notes"
|
|
51
|
-
selected
|
|
52
|
-
rootAttributes={{ 'data-command-color': 'blue', 'data-drop-status': 'ready' }}
|
|
72
|
+
import { mount } from "kerfjs";
|
|
73
|
+
import { ListItem } from "@kerfjs/ui/list-item";
|
|
74
|
+
import { ListHeader } from "@kerfjs/ui/list-header";
|
|
75
|
+
import { ListActionRow } from "@kerfjs/ui/list-action-row";
|
|
76
|
+
import { Toolbar } from "@kerfjs/ui/toolbar";
|
|
77
|
+
import { ToolbarText } from "@kerfjs/ui/toolbar-text";
|
|
78
|
+
|
|
79
|
+
const root = document.getElementById("app")!;
|
|
80
|
+
|
|
81
|
+
mount(root, () => (
|
|
82
|
+
<>
|
|
83
|
+
<Toolbar
|
|
84
|
+
label="Document"
|
|
85
|
+
leading={<ToolbarText text="Notes" />}
|
|
53
86
|
/>
|
|
54
|
-
<
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
87
|
+
<section>
|
|
88
|
+
<ListHeader
|
|
89
|
+
label="Workspace"
|
|
90
|
+
action="show-workspace-actions"
|
|
91
|
+
actionLabel="Workspace actions"
|
|
92
|
+
rootAttributes={{ "data-section-id": "workspace" }}
|
|
93
|
+
triggerAttributes={{
|
|
94
|
+
popoverTarget: "workspace-actions",
|
|
95
|
+
popoverTargetAction: "toggle",
|
|
96
|
+
"aria-controls": "workspace-actions",
|
|
97
|
+
"aria-haspopup": "dialog",
|
|
98
|
+
}}
|
|
99
|
+
/>
|
|
100
|
+
<ListItem
|
|
101
|
+
action="open-notes"
|
|
102
|
+
label="Notes"
|
|
103
|
+
selected
|
|
104
|
+
rootAttributes={{
|
|
105
|
+
"data-command-color": "blue",
|
|
106
|
+
"data-drop-status": "ready",
|
|
107
|
+
}}
|
|
108
|
+
/>
|
|
109
|
+
<ListActionRow
|
|
110
|
+
action="open-file"
|
|
111
|
+
itemId="src/main.ts"
|
|
112
|
+
label="src/main.ts"
|
|
113
|
+
trailingAction="open-file-actions"
|
|
114
|
+
trailingActionLabel="Actions for src/main.ts"
|
|
115
|
+
trailingActionIcon={<span aria-hidden="true">⋯</span>}
|
|
116
|
+
/>
|
|
117
|
+
<div id="workspace-actions" popover="auto">
|
|
118
|
+
Application-owned actions
|
|
119
|
+
</div>
|
|
120
|
+
</section>
|
|
121
|
+
</>
|
|
122
|
+
));
|
|
65
123
|
```
|
|
66
124
|
|
|
67
125
|
Components return Kerf `SafeHtml`. They do not own application state or attach transient listeners. Actions are stable `data-action` hooks; the application wires them once with `delegate()` or `delegateActions()` and retains the disposer.
|
|
68
126
|
|
|
127
|
+
Component content positions use one convention: `children` is the homogeneous
|
|
128
|
+
primary region, while semantic positions and replacement content use explicit
|
|
129
|
+
named `SafeHtml` props such as `header`, `footer`, `leading`, `trailing`,
|
|
130
|
+
`icon`, and `action`. These named `SafeHtml` prop slots are ordinary typed
|
|
131
|
+
function-component props—not native `<slot>` elements, wrapper slot
|
|
132
|
+
components, or a generic `slots` object. The composition catalog publishes
|
|
133
|
+
sound prop bindings as `zone.jsx.prop`, allowing ESLint to validate statically
|
|
134
|
+
visible content and cardinality without guessing from zone names.
|
|
135
|
+
|
|
136
|
+
Stable single-root visual components also accept the explicit native
|
|
137
|
+
`slot?: string` prop, so their returned root can participate directly in a web
|
|
138
|
+
component's named slot and keep that assignment through Kerf rerenders. This is
|
|
139
|
+
a narrow interop attribute, not general native-attribute spreading. The
|
|
140
|
+
multi-root `ResizableRegion` and `CollapsiblePanel` intentionally omit it
|
|
141
|
+
because neither has one unambiguous returned root; `CollapsiblePanelToggle`
|
|
142
|
+
supports it as a normal single-root control.
|
|
143
|
+
|
|
69
144
|
`ListItem.rootAttributes`, `ListHeader.rootAttributes`,
|
|
70
|
-
`ListActionRow.rootAttributes`,
|
|
145
|
+
`ListActionRow.rootAttributes`, `TabBarItem.rootAttributes`,
|
|
146
|
+
`Catalog.stageRootAttributes`, `CatalogExample.rootAttributes`, and `CatalogExampleStack.rootAttributes` carry typed
|
|
71
147
|
application `data-*` metadata without
|
|
72
148
|
teaching the package domain fields. `ListHeader.triggerAttributes` and
|
|
73
149
|
`ListActionRow.trailingActionAttributes` additionally support native popover
|
|
74
150
|
target and relationship attributes. Roles and component-owned action, selection,
|
|
75
|
-
disclosure, naming, disabled, and
|
|
151
|
+
disclosure, naming, disabled, icon, and catalog-structure semantics remain protected props; an
|
|
76
152
|
isolated `role="menuitem"` is not an extension shortcut.
|
|
153
|
+
`CatalogExample.viewport` owns the finite layout constraints needed by focused
|
|
154
|
+
specimens, so catalog authors do not need route-local stylesheets, inline
|
|
155
|
+
styles, or styling-only demo classes.
|
|
77
156
|
The slots are also filtered at runtime, so structurally widened objects and
|
|
78
157
|
JavaScript callers cannot bypass those protections with case-variant names.
|
|
79
158
|
`ListItem.trailing` is dormant metadata. Use `ListActionRow` when a row needs
|
|
@@ -90,47 +169,186 @@ Do not concatenate a count into `label` or pass a numeric `badge`; the mutually
|
|
|
90
169
|
exclusive legacy `badge` slot remains available for non-count `SafeHtml` such
|
|
91
170
|
as a `New` marker.
|
|
92
171
|
|
|
172
|
+
`Row.gap`, `Grid.gap`, `List.gap`, and `Spacer` dimensions accept a direct spacing name such as
|
|
173
|
+
`gap="xs"` or `gap="m"`, or a branded `CssLength`. Import `space`, `rem`, `em`,
|
|
174
|
+
`px`, `pct`, `lengthVar`, `plus`, and `calc` from the CSS-free
|
|
175
|
+
`@kerfjs/ui/css-values` subpath when a named step is not enough. `plus` returns
|
|
176
|
+
an incomplete expression, so wrap it with `calc` before passing it to a prop.
|
|
177
|
+
Raw CSS strings are deliberately rejected; the opaque brands catch authoring
|
|
178
|
+
mistakes but are not sanitizers.
|
|
179
|
+
|
|
180
|
+
Use `Row` for horizontal flex composition and `List` for vertical composition.
|
|
181
|
+
Both accept `hAlign` (`left`, `center`, `right`, `full`) and `vAlign` (`top`,
|
|
182
|
+
`middle`, `bottom`, `full`), plus their documented short/CSS aliases. `Row`
|
|
183
|
+
also accepts `vAlign="baseline"` for cross-axis text alignment; baseline is not
|
|
184
|
+
available on `List`, whose vertical axis uses `justify-content`. `Row`
|
|
185
|
+
defaults to left/full alignment, the `xs` gap, and `wrap={false}`; List keeps
|
|
186
|
+
its existing full/top alignment and zero-gap defaults. Set `textInsets` or
|
|
187
|
+
`controlInsets` with canonical physical sides in `t`/`r`/`b`/`l` order (for
|
|
188
|
+
example, `textInsets="tbl"` or `controlInsets="r"`). Text geometry takes
|
|
189
|
+
precedence where both select the same side. `ListInsetText` and
|
|
190
|
+
`ListInsetControl` inset all four sides by default and accept the same `sides`
|
|
191
|
+
grammar for selective insets. Nested Rows and Lists resolve their inset sides
|
|
192
|
+
independently, so an unselected inner side does not inherit its parent's inset.
|
|
193
|
+
|
|
194
|
+
Use `Grid` for a fixed positive number of evenly distributed columns. Its
|
|
195
|
+
`minmax(0, 1fr)` tracks stay equal when children have different intrinsic
|
|
196
|
+
widths; the application owns responsive count changes. Use application CSS grid
|
|
197
|
+
for asymmetric or intrinsic tracks and `ResizableRegion` for adjustable ones.
|
|
198
|
+
|
|
199
|
+
The same property-specific boundary applies beyond spacing: use `flex()` (or a
|
|
200
|
+
finite keyword) for `Row.flex`, `Grid.flex`, and `List.flex`; length builders and intrinsic-size keywords for
|
|
201
|
+
`Skeleton.width`/`height`; length builders for `Skeleton.radius`; and
|
|
202
|
+
a foreground color for `SelectChoice.color` — `uiColor()` with a foreground
|
|
203
|
+
token such as `success-on-quiet`, or `foregroundColorVar()` (fill tokens such
|
|
204
|
+
as `uiColor('success-fill-quiet')` are rejected). These grammars are not
|
|
205
|
+
interchangeable. `ListItem` and `ListActionRow` deliberately expose no raw
|
|
206
|
+
`style` declarations; use `className`, public tokens, and component props.
|
|
207
|
+
|
|
93
208
|
## Component subpaths
|
|
94
209
|
|
|
95
|
-
| Component
|
|
96
|
-
|
|
|
97
|
-
| `LucideIcon`
|
|
98
|
-
| `
|
|
99
|
-
| `
|
|
100
|
-
| `
|
|
101
|
-
| `
|
|
102
|
-
| `
|
|
103
|
-
| `
|
|
104
|
-
| `
|
|
105
|
-
| `
|
|
106
|
-
|
|
|
107
|
-
| `
|
|
108
|
-
| `
|
|
109
|
-
| `
|
|
110
|
-
| `
|
|
111
|
-
| `
|
|
112
|
-
| `
|
|
113
|
-
| `
|
|
114
|
-
| `
|
|
115
|
-
| `
|
|
116
|
-
| `
|
|
117
|
-
| `
|
|
118
|
-
| `
|
|
119
|
-
| `
|
|
120
|
-
| `
|
|
121
|
-
| `
|
|
122
|
-
|
|
123
|
-
`
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
`
|
|
129
|
-
|
|
130
|
-
`
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
210
|
+
| Component | Browser import (includes reachable CSS) | Manual CSS export |
|
|
211
|
+
| ------------------------------------------------------------ | --------------------------------------- | ---------------------------------------- |
|
|
212
|
+
| `LucideIcon` | `@kerfjs/ui/lucide-icon` | `@kerfjs/ui/lucide-icon.css` |
|
|
213
|
+
| `Badge` | `@kerfjs/ui/badge` | `@kerfjs/ui/badge.css` |
|
|
214
|
+
| `Chip` | `@kerfjs/ui/chip` | `@kerfjs/ui/chip.css` |
|
|
215
|
+
| `DisclosureArrow` | `@kerfjs/ui/disclosure-arrow` | `@kerfjs/ui/disclosure-arrow.css` |
|
|
216
|
+
| `Toolbar` | `@kerfjs/ui/toolbar` | `@kerfjs/ui/toolbar.css` |
|
|
217
|
+
| `ToolbarControlGroup`, `ToolbarActionLink` | `@kerfjs/ui/toolbar-control-group` | `@kerfjs/ui/toolbar-control-group.css` |
|
|
218
|
+
| `DialogSurface`, `PopupSurface` | `@kerfjs/ui/surface-scaffold` | `@kerfjs/ui/surface-scaffold.css` |
|
|
219
|
+
| `ListDetailDialog` | `@kerfjs/ui/list-detail-dialog` | `@kerfjs/ui/list-detail-dialog.css` |
|
|
220
|
+
| `WorkbenchDialog` | `@kerfjs/ui/workbench-dialog` | `@kerfjs/ui/workbench-dialog.css` |
|
|
221
|
+
| `Disclosure` | `@kerfjs/ui/disclosure` | `@kerfjs/ui/disclosure.css` |
|
|
222
|
+
| `ProgressBar` | `@kerfjs/ui/progress-bar` | `@kerfjs/ui/progress-bar.css` |
|
|
223
|
+
| `ProgressRing` | `@kerfjs/ui/progress-ring` | `@kerfjs/ui/progress-ring.css` |
|
|
224
|
+
| `Slider` | `@kerfjs/ui/slider` | `@kerfjs/ui/slider.css` |
|
|
225
|
+
| `wireSliders`, `syncSlider` | `@kerfjs/ui/wire-sliders` | — |
|
|
226
|
+
| `TagField` | `@kerfjs/ui/tag-field` | `@kerfjs/ui/tag-field.css` |
|
|
227
|
+
| `wireTagFields` | `@kerfjs/ui/wire-tag-fields` | — |
|
|
228
|
+
| `ColorSwatches` | `@kerfjs/ui/color-swatches` | `@kerfjs/ui/color-swatches.css` |
|
|
229
|
+
| `ColorPicker` | `@kerfjs/ui/color-picker` | `@kerfjs/ui/color-picker.css` |
|
|
230
|
+
| `wireColorPickers` | `@kerfjs/ui/wire-color-pickers` | — |
|
|
231
|
+
| `ColorField` | `@kerfjs/ui/color-field` | `@kerfjs/ui/color-field.css` |
|
|
232
|
+
| `wireColorFields` | `@kerfjs/ui/wire-color-fields` | — |
|
|
233
|
+
| `FloatingToolbar` | `@kerfjs/ui/floating-toolbar` | `@kerfjs/ui/floating-toolbar.css` |
|
|
234
|
+
| `PopupMenu` (register with `@kerfjs/ui/popup-menu/register`) | `@kerfjs/ui/popup-menu` | `@kerfjs/ui/popup-menu.css` |
|
|
235
|
+
| `openAnchoredSurface`, `openAnchoredSurfaceAt` | `@kerfjs/ui/anchored-surface` | `@kerfjs/ui/anchored-surface.css` |
|
|
236
|
+
| `ToolbarText` | `@kerfjs/ui/toolbar-text` | `@kerfjs/ui/toolbar-text.css` |
|
|
237
|
+
| `Text`, `FieldLabel` | `@kerfjs/ui/text` | `@kerfjs/ui/text.css` |
|
|
238
|
+
| `List` | `@kerfjs/ui/list` | `@kerfjs/ui/list.css` |
|
|
239
|
+
| `Row` | `@kerfjs/ui/row` | `@kerfjs/ui/row.css` |
|
|
240
|
+
| `Grid` | `@kerfjs/ui/grid` | `@kerfjs/ui/grid.css` |
|
|
241
|
+
| `Spacer` | `@kerfjs/ui/spacer` | `@kerfjs/ui/spacer.css` |
|
|
242
|
+
| Typed CSS dimension builders | `@kerfjs/ui/css-values` | — |
|
|
243
|
+
| `ListActionRow` | `@kerfjs/ui/list-action-row` | `@kerfjs/ui/list-action-row.css` |
|
|
244
|
+
| `ListItem` | `@kerfjs/ui/list-item` | `@kerfjs/ui/list-item.css` |
|
|
245
|
+
| `wireListReorder`, `reorderListItems` | `@kerfjs/ui/wire-list-reorder` | — |
|
|
246
|
+
| `wireListFocusScroll` | `@kerfjs/ui/wire-list-focus-scroll` | — |
|
|
247
|
+
| `ListHeader` | `@kerfjs/ui/list-header` | `@kerfjs/ui/list-header.css` |
|
|
248
|
+
| `ListInsetControl` | `@kerfjs/ui/list-inset-control` | `@kerfjs/ui/list-inset-control.css` |
|
|
249
|
+
| `ListInsetText` | `@kerfjs/ui/list-inset-text` | `@kerfjs/ui/list-inset-text.css` |
|
|
250
|
+
| `ContentItem` | `@kerfjs/ui/content-item` | `@kerfjs/ui/content-item.css` |
|
|
251
|
+
| `Pane` | `@kerfjs/ui/pane` | `@kerfjs/ui/pane.css` |
|
|
252
|
+
| `NavStack` | `@kerfjs/ui/nav-stack` | `@kerfjs/ui/nav-stack.css` |
|
|
253
|
+
| `wireNavStack` | `@kerfjs/ui/wire-nav-stack` | — |
|
|
254
|
+
| `wirePaneChrome` | `@kerfjs/ui/wire-pane-chrome` | — |
|
|
255
|
+
| `SplitView` | `@kerfjs/ui/split-view` | `@kerfjs/ui/split-view.css` |
|
|
256
|
+
| `TabNavigator` | `@kerfjs/ui/tab-navigator` | `@kerfjs/ui/tab-navigator.css` |
|
|
257
|
+
| `wireTabNavigator` | `@kerfjs/ui/wire-tab-navigator` | — |
|
|
258
|
+
| `Workbench` | `@kerfjs/ui/workbench` | `@kerfjs/ui/workbench.css` |
|
|
259
|
+
| `wireWorkbench` | `@kerfjs/ui/wire-workbench` | — |
|
|
260
|
+
| `CollapsiblePanel`, `CollapsiblePanelToggle` | `@kerfjs/ui/collapsible-panel` | `@kerfjs/ui/collapsible-panel.css` |
|
|
261
|
+
| `wireSidebar` | `@kerfjs/ui/wire-sidebar` | — |
|
|
262
|
+
| Content and navigation composition | — | `@kerfjs/ui/layout.css` |
|
|
263
|
+
| `ResizableRegion` | `@kerfjs/ui/resizable-region` | `@kerfjs/ui/resizable-region.css` |
|
|
264
|
+
| `wireResizableRegions` | `@kerfjs/ui/wire-resizable-regions` | — |
|
|
265
|
+
| `TabBarItem` | `@kerfjs/ui/tab-bar-item` | `@kerfjs/ui/tab-bar-item.css` |
|
|
266
|
+
| `TabBar` | `@kerfjs/ui/tab-bar` | `@kerfjs/ui/tab-bar.css` |
|
|
267
|
+
| `wireTabBars`, `reorderTabs` | `@kerfjs/ui/wire-tab-bars` | — |
|
|
268
|
+
| `wireScrollDividers` | `@kerfjs/ui/wire-scroll-dividers` | — |
|
|
269
|
+
| `wireToolbarVisibility` | `@kerfjs/ui/wire-toolbar-visibility` | — |
|
|
270
|
+
| `wireOverlaySheets` | `@kerfjs/ui/wire-overlay-sheets` | `@kerfjs/ui/overlay-sheet.css` |
|
|
271
|
+
| Toasts for `kerfjs/overlay` `toast()` | — | `@kerfjs/ui/overlay-toast.css` |
|
|
272
|
+
| Tooltips for `kerfjs/overlay` `tooltip()` | — | `@kerfjs/ui/overlay-tooltip.css` |
|
|
273
|
+
| `LoadingSpinner` | `@kerfjs/ui/loading-spinner` | `@kerfjs/ui/loading-spinner.css` |
|
|
274
|
+
| `Skeleton` | `@kerfjs/ui/skeleton` | `@kerfjs/ui/skeleton.css` |
|
|
275
|
+
| `SunkenPanel` | `@kerfjs/ui/sunken-panel` | `@kerfjs/ui/sunken-panel.css` |
|
|
276
|
+
| `BackdropImage` | `@kerfjs/ui/backdrop-image` | `@kerfjs/ui/backdrop-image.css` |
|
|
277
|
+
| `Select` | `@kerfjs/ui/select` | `@kerfjs/ui/select.css` |
|
|
278
|
+
| `SegmentedControl` | `@kerfjs/ui/segmented-control` | `@kerfjs/ui/segmented-control.css` |
|
|
279
|
+
| `ChoiceChips` | `@kerfjs/ui/choice-chips` | `@kerfjs/ui/choice-chips.css` |
|
|
280
|
+
| `TextField` | `@kerfjs/ui/text-field` | `@kerfjs/ui/text-field.css` |
|
|
281
|
+
| `wireTextFields` | `@kerfjs/ui/wire-text-fields` | — |
|
|
282
|
+
| `Checkbox` | `@kerfjs/ui/checkbox` | `@kerfjs/ui/checkbox.css` |
|
|
283
|
+
| `CheckboxGroup` | `@kerfjs/ui/checkbox-group` | `@kerfjs/ui/checkbox-group.css` |
|
|
284
|
+
| `wireCheckboxes` | `@kerfjs/ui/wire-checkboxes` | — |
|
|
285
|
+
| `RadioGroup` | `@kerfjs/ui/radio-group` | `@kerfjs/ui/radio-group.css` |
|
|
286
|
+
| `Switch` | `@kerfjs/ui/switch` | `@kerfjs/ui/switch.css` |
|
|
287
|
+
| `MessageComposer` | `@kerfjs/ui/message-composer` | `@kerfjs/ui/message-composer.css` |
|
|
288
|
+
| `wireMessageComposers` | `@kerfjs/ui/wire-message-composers` | — |
|
|
289
|
+
| `SearchField`, `readSearchField`, `placeSearchFieldCaret` | `@kerfjs/ui/search-field` | `@kerfjs/ui/search-field.css` |
|
|
290
|
+
| `wireSearchFields` | `@kerfjs/ui/wire-search-fields` | — |
|
|
291
|
+
| `createSearchFieldModel` | `@kerfjs/ui/search-field-model` | — |
|
|
292
|
+
| `StateBanner` | `@kerfjs/ui/state-banner` | `@kerfjs/ui/state-banner.css` |
|
|
293
|
+
| `Button` | `@kerfjs/ui/button` | `@kerfjs/ui/button.css` |
|
|
294
|
+
| `SplitButton` | `@kerfjs/ui/split-button` | `@kerfjs/ui/split-button.css` |
|
|
295
|
+
| `FramedList`, `FramedListRow` | `@kerfjs/ui/framed-list` | `@kerfjs/ui/framed-list.css` |
|
|
296
|
+
| `SummaryRow` | `@kerfjs/ui/summary-row` | `@kerfjs/ui/summary-row.css` |
|
|
297
|
+
| `ColumnTrack` | `@kerfjs/ui/column-track` | `@kerfjs/ui/column-track.css` |
|
|
298
|
+
| `ContentSwap` | `@kerfjs/ui/content-swap` | `@kerfjs/ui/content-swap.css` |
|
|
299
|
+
| `FilePickerTrigger`, `FileDropZone` | `@kerfjs/ui/file-picker` | `@kerfjs/ui/file-picker.css` |
|
|
300
|
+
| `wireFilePickers`, `fileMatchesAccept` | `@kerfjs/ui/wire-file-pickers` | — |
|
|
301
|
+
| `Combobox` | `@kerfjs/ui/combobox` | `@kerfjs/ui/combobox.css` |
|
|
302
|
+
| `wireComboboxes` | `@kerfjs/ui/wire-comboboxes` | — |
|
|
303
|
+
| `CornerStatus` | `@kerfjs/ui/corner-status` | `@kerfjs/ui/corner-status.css` |
|
|
304
|
+
| `EdgeActivityIndicator` | `@kerfjs/ui/edge-activity-indicator` | `@kerfjs/ui/edge-activity-indicator.css` |
|
|
305
|
+
| `wireCornerStatus` | `@kerfjs/ui/wire-corner-status` | — |
|
|
306
|
+
| `EmptyState` | `@kerfjs/ui/empty-state` | `@kerfjs/ui/empty-state.css` |
|
|
307
|
+
| `ValueTable`, `ValueTableRow` | `@kerfjs/ui/value-table` | `@kerfjs/ui/value-table.css` |
|
|
308
|
+
|
|
309
|
+
Application layouts are separate component subpaths. Browser-condition imports
|
|
310
|
+
include their reachable CSS; use the matching manual CSS export when your
|
|
311
|
+
bundler does not select the browser condition. Add a wire subpath when the
|
|
312
|
+
layout has interactive behavior. The catalog
|
|
313
|
+
entries for `nav-stack`, `split-view`, `tab-navigator`, `workbench`, and
|
|
314
|
+
`collapsible-panel` document their selection rules, ownership boundaries,
|
|
315
|
+
public classes, tokens, and focused demos. See
|
|
316
|
+
[`docs/app-layouts.md`](./docs/app-layouts.md) for the layout decision matrix.
|
|
317
|
+
`NavStack` and `TabNavigator` expose `chromeDividers="scroll" | "always" |
|
|
318
|
+
"none"` for their chrome lines; `SplitView` forwards the setting to its
|
|
319
|
+
compact stack. A sole `Pane` in a view or scene fills it, keeping the Pane's
|
|
320
|
+
header in place while its own content scrolls.
|
|
321
|
+
|
|
322
|
+
For a `Workbench` or `CollapsiblePanel`, place panel toolbar groups in its
|
|
323
|
+
`leading`, `center`, and `trailing` zones. Add `relocateOnCollapse` to each
|
|
324
|
+
`ToolbarControlGroup` that should remain available in the work-area toolbar
|
|
325
|
+
while the panel is closed. The panel collects marked groups in zone order;
|
|
326
|
+
its toggle follows them. See [Workbench panel toolbars](./docs/workbench.md#panel-toolbars).
|
|
327
|
+
|
|
328
|
+
Compose panel, dialog, and page headings directly with `Toolbar`: put an optional
|
|
329
|
+
icon in a `ToolbarControlGroup`, use a direct extra-large `ToolbarText` for the
|
|
330
|
+
title, and put actions in the trailing zone inside their own control group. Set
|
|
331
|
+
`headingLevel` for page or section headings. Supporting copy is app-owned content
|
|
332
|
+
below the toolbar and should be connected to its host with `aria-describedby`
|
|
333
|
+
when it adds useful context. Set `responsive="wrap"` on a heading whose title
|
|
334
|
+
must stay whole: it keeps one row while everything fits and otherwise moves the
|
|
335
|
+
trailing actions below the title instead of truncating it.
|
|
336
|
+
|
|
337
|
+
A toolbar with a single zone gives it the whole content box, so content set to
|
|
338
|
+
fill the row reaches both insets; an absent zone leaves no empty track or gap.
|
|
339
|
+
|
|
340
|
+
A toolbar never clips an action. Its trailing zone wraps whole control groups
|
|
341
|
+
onto another trailing-aligned row under every `responsive` policy, and a
|
|
342
|
+
`responsive="stack"` toolbar wraps its stacked center and trailing groups the
|
|
343
|
+
same way. Wrapping keeps every command visible at its full 44px target without
|
|
344
|
+
moving focus or DOM identity. When a product wants fewer visible commands at
|
|
345
|
+
narrow widths, it chooses them: render a lower-priority command inside an
|
|
346
|
+
app-owned "More" `PopupMenu` (in a `single` group with `nestedDropdown`).
|
|
347
|
+
|
|
348
|
+
`DisclosureArrow` defaults to an 18px root-scaled decorative visual. Pass a
|
|
349
|
+
typed `size` (for example `size={remify(24)}` from `@kerfjs/ui/css-values`)
|
|
350
|
+
when a consumer needs another size; the owning control still supplies interaction, naming, and
|
|
351
|
+
expanded state. Kerf `Select` keeps its own expand-glyph
|
|
134
352
|
scale of `.5` through `--kui-disclosure-icon-scale`. Author replacement
|
|
135
353
|
`DisclosureArrow` icon content facing right before its configured direction
|
|
136
354
|
transform is applied. Direction changes take the shortest rotation path; a
|
|
@@ -141,20 +359,172 @@ transform is applied. Direction changes take the shortest rotation path; a
|
|
|
141
359
|
real controlled content and preserve the button's stable label; ordinary
|
|
142
360
|
navigation must not display a disclosure arrow. A custom `actionIcon` remains
|
|
143
361
|
an escape hatch and replaces the default arrow entirely. The header fills its
|
|
144
|
-
available inline width
|
|
145
|
-
|
|
362
|
+
available inline width by default; set `inline` to shrink-wrap it beside other
|
|
363
|
+
content and remove its root margin, border, and padding. It keeps a separate
|
|
364
|
+
action at the logical end. Its visible action glyph defaults to 18px through
|
|
146
365
|
`--kui-list-header-action-icon-size`.
|
|
147
366
|
|
|
148
367
|
## Machine-readable catalog
|
|
149
368
|
|
|
150
|
-
AI
|
|
369
|
+
AI assistants should start from the generated markdown reference,
|
|
370
|
+
[`ai/components/README.md`](./ai/components/README.md): a one-line index of
|
|
371
|
+
every entry grouped like the catalog, plus one short page per entry
|
|
372
|
+
(`ai/components/<id>.md`) covering when to use and avoid it, imports and
|
|
373
|
+
CSS/registration side effects, where its exact props live, legal parents,
|
|
374
|
+
zones with their JSX props and child counts, app- and wiring-owned state,
|
|
375
|
+
geometry ownership, accessibility obligations, the styling boundary
|
|
376
|
+
(configure through props; never override internals), and its composition
|
|
377
|
+
diagnostics. The pages are projected from the two JSON catalogs by
|
|
378
|
+
`scripts/sync-component-docs.mjs` (`npm run catalog:sync`), and
|
|
379
|
+
`npm run check:catalog` fails when any page drifts.
|
|
380
|
+
|
|
381
|
+
Tools can retrieve the shipped [`ai/component-catalog.json`](./ai/component-catalog.json)
|
|
151
382
|
for the exhaustive component and composition inventory. It is the canonical
|
|
152
383
|
source for ids, public exports, purpose and selection guidance, relationships,
|
|
153
384
|
delivery and side effects, companion wiring, application-owned policy,
|
|
154
385
|
variants, accessibility obligations, public CSS hooks, routes, and current
|
|
155
386
|
documentation/recipe links. The adjacent
|
|
156
387
|
[`component-catalog.schema.json`](./ai/component-catalog.schema.json) describes
|
|
157
|
-
the versioned format.
|
|
388
|
+
the versioned format. Every visual entry also declares who owns its margin,
|
|
389
|
+
border, and padding, so a generator can fit it into Kerf's alignment model
|
|
390
|
+
without guessing from a screenshot or private CSS.
|
|
391
|
+
|
|
392
|
+
Catalog demo authoring is deliberately separate from the entry inventory. Load
|
|
393
|
+
[`catalog-authoring.json`](./ai/catalog-authoring.json) to discover the
|
|
394
|
+
authoritative [Catalog demo authoring contract](./docs/catalog.md#catalog-demo-authoring-contract),
|
|
395
|
+
the exact API-signature context, public imports/helpers, sanctioned metadata
|
|
396
|
+
slot, three-kind taxonomy, and functional-group/importance ordering policy.
|
|
397
|
+
Keeping this as a companion artifact prevents per-entry selection facts from
|
|
398
|
+
duplicating presentation rules.
|
|
399
|
+
|
|
400
|
+
Tools that evaluate composition may additionally load
|
|
401
|
+
[`component-composition.json`](./ai/component-composition.json). It is a
|
|
402
|
+
generated composition layer beside `component-catalog.json`, not a newer
|
|
403
|
+
version of it: a deterministic, package-qualified projection of every
|
|
404
|
+
component-catalog entry with formal parent/context, zone/cardinality, child,
|
|
405
|
+
state ownership, wiring, responsive, layout, accessibility, public-boundary,
|
|
406
|
+
and stable-diagnostic fields. `component-catalog.json` remains the selection
|
|
407
|
+
and delivery surface. Composition defaults are
|
|
408
|
+
deliberately permissive; only documented objective rules receive an
|
|
409
|
+
authoritative override and enforceable diagnostic. The adjacent schema and
|
|
410
|
+
[`component-composition.d.ts`](./ai/component-composition.d.ts) types describe
|
|
411
|
+
the same contract.
|
|
412
|
+
|
|
413
|
+
Applications and downstream design systems should publish the same facts for
|
|
414
|
+
their own components. Start from the reusable
|
|
415
|
+
[`component-catalog-extension.schema.json`](./ai/component-catalog-extension.schema.json)
|
|
416
|
+
and the checked
|
|
417
|
+
[`component-catalog-extension.json`](./docs/examples/component-catalog-extension.json)
|
|
418
|
+
example. Give each app-owned component or composition a stable id, selection
|
|
419
|
+
guidance, public hooks, and explicit geometry ownership; then concatenate its
|
|
420
|
+
`entries` with Kerf's shipped `entries` in the AI context. Keep package/source
|
|
421
|
+
identity alongside each input when ids could collide. This makes a combined
|
|
422
|
+
tool reason about both sides of a composition using one vocabulary without
|
|
423
|
+
pretending app-local components are `@kerfjs/ui` exports. A package that
|
|
424
|
+
keeps a `kerf.components.json` generates this extension with
|
|
425
|
+
`kerf-component-catalog` by setting `kerfComponentCatalog.selectionOutput`
|
|
426
|
+
instead of maintaining a second JSON by hand.
|
|
427
|
+
For a consumer UX demo, `@kerfjs/ui/catalog-projection` derives rows and
|
|
428
|
+
relationships from that extension; `kerf-catalog-demo --write` emits a typed
|
|
429
|
+
module and `--check` catches drift. See the [catalog guide](./docs/catalog.md)
|
|
430
|
+
for repository base and source path configuration. To offer the catalog's
|
|
431
|
+
**Capture region** link to UX Review on a local server, add the Node-only
|
|
432
|
+
`uxReviewPlugin` from `@kerfjs/ui/vite-ux-review` to the Vite config (or, for a
|
|
433
|
+
catalog your own backend serves, mount its `uxReviewProjectResponse` /
|
|
434
|
+
`uxReviewMiddleware` on the development server) and pass `wireCatalog`'s
|
|
435
|
+
`onUxReviewProject` result to `Catalog`'s `uxReview` (the
|
|
436
|
+
[catalog guide](./docs/catalog.md#ux-review-capture) has the wiring).
|
|
437
|
+
|
|
438
|
+
Composition-aware consumers use
|
|
439
|
+
[`component-composition-extension.schema.json`](./ai/component-composition-extension.schema.json),
|
|
440
|
+
its shipped TypeScript types, and the checked
|
|
441
|
+
[`component-composition-extension.json`](./docs/examples/component-composition-extension.json)
|
|
442
|
+
example. Preserve each catalog's package and qualify every identity and
|
|
443
|
+
cross-catalog reference as `package:id`; never merge entries by bare id.
|
|
444
|
+
|
|
445
|
+
[`compile-time-contracts-v1.json`](./ai/compile-time-contracts-v1.json) is the
|
|
446
|
+
matching declaration contract: stable `KUI-T###` ids identify the invalid prop,
|
|
447
|
+
state, identity, accessibility, and protected-attribute combinations TypeScript
|
|
448
|
+
rejects. The package gate compiles one positive/negative consumer fixture against
|
|
449
|
+
both source and declarations extracted from the real packed tarball. The
|
|
450
|
+
[compile-time contract guide](./docs/type-contracts.md) documents migrations and
|
|
451
|
+
the dynamic DOM/children relationships that remain runtime or catalog checks.
|
|
452
|
+
Packages scaffolded by `create-kerf-component` maintain this composition input from
|
|
453
|
+
`kerf.components.json`: `npm run catalog:generate` emits the catalog and
|
|
454
|
+
`npm run catalog:check` verifies source files, named public exports, explicit
|
|
455
|
+
author decisions, and byte-for-byte drift. Tools index the generated consumer
|
|
456
|
+
entries and this catalog by full key, reject duplicate full keys, search the
|
|
457
|
+
consumer package first, and retain package identity across every reference.
|
|
458
|
+
They must not infer missing semantics or geometry from rendered appearance.
|
|
459
|
+
|
|
460
|
+
### Application UI profile
|
|
461
|
+
|
|
462
|
+
Applications can check in `.kerf-ui-profile.json` so tools do not have to infer
|
|
463
|
+
project-wide UI policy. Start from the shipped
|
|
464
|
+
[`application-ui-profile.defaults.json`](./ai/application-ui-profile.defaults.json)
|
|
465
|
+
and the checked
|
|
466
|
+
[`application-ui-profile.json`](./docs/examples/application-ui-profile.json)
|
|
467
|
+
workspace example. The versioned
|
|
468
|
+
[`application-ui-profile.schema.json`](./ai/application-ui-profile.schema.json)
|
|
469
|
+
and [`application-ui-profile.d.ts`](./ai/application-ui-profile.d.ts) cover
|
|
470
|
+
catalog locations, concept preferences, allowed theme/density choices, semantic
|
|
471
|
+
token overrides, layout/responsive conventions, and narrow rule exceptions.
|
|
472
|
+
Profiles contain policy only—never product records, user data, or broad styling
|
|
473
|
+
waivers.
|
|
474
|
+
|
|
475
|
+
Catalog declarations always provide a `composition` location. Consumer
|
|
476
|
+
packages generated with composition-only metadata omit `selection`;
|
|
477
|
+
`@kerfjs/ui` continues to require its `component-catalog.json` selection catalog.
|
|
478
|
+
|
|
479
|
+
Node-based AI and static-analysis tools may import the shipped discovery API
|
|
480
|
+
from `@kerfjs/ui/ai/application-ui-profile.mjs`. It discovers package defaults,
|
|
481
|
+
then the workspace profile, then directory profiles from parent to child;
|
|
482
|
+
`mergeApplicationUiProfiles()` applies later scalar/map values, replaces a
|
|
483
|
+
catalog by package and an exception by id, and preserves source provenance.
|
|
484
|
+
`loadApplicationUiProfile()` resolves catalogs and returns diagnostics with the
|
|
485
|
+
originating file plus JSON path. Unknown/stale components, tokens, rules, and
|
|
486
|
+
catalog locations are errors. Every layer is checked against its then-effective
|
|
487
|
+
catalogs, including parent references and catalog paths later overridden by a
|
|
488
|
+
child profile. Synchronous integrations can require the shipped
|
|
489
|
+
`application-ui-profile-sync.cjs` projection and call
|
|
490
|
+
`loadApplicationUiProfileSync()` with already-discovered layers. Consumers that define additional stable
|
|
491
|
+
diagnostics pass their ids through the additive `knownRules` option; those ids
|
|
492
|
+
are merged with catalog diagnostics before exception validation.
|
|
493
|
+
|
|
494
|
+
### Static CSS and layout ownership analysis
|
|
495
|
+
|
|
496
|
+
Run `kerf-ui-analyze --root . src` (or import
|
|
497
|
+
`@kerfjs/ui/analyzer`) to evaluate cross-file integration facts against the
|
|
498
|
+
composition catalogs and application profile. It catches provable private
|
|
499
|
+
selector reach-through, unknown tokens, competing geometry owners, nested
|
|
500
|
+
scroll owners, and cataloged CSS-value violations in JavaScript/TypeScript
|
|
501
|
+
component calls and JSX, plus component-ownership overrides: CSS that makes
|
|
502
|
+
another package's component its subject, touches its private variables,
|
|
503
|
+
overrides a token its typed prop sets, or styles it through a hook class on
|
|
504
|
+
its root (`KUI-L019`–`KUI-L022`; forcing a component's dimensions is one such
|
|
505
|
+
restyle). It reports repeated insets, exceptional spacing shorthands, and
|
|
506
|
+
dynamic classes separately as review findings. Text, versioned JSON,
|
|
507
|
+
and SARIF outputs carry stable `KUI-L###` ids, repository-relative locations,
|
|
508
|
+
evidence, and ownership chains. See the [analyzer guide](./docs/ui-analyzer.md).
|
|
509
|
+
Opt into ownership between components in one package with Doctor's
|
|
510
|
+
`"ownership": "component"` setting and catalog `styleSources` declarations;
|
|
511
|
+
the default keeps package-level ownership.
|
|
512
|
+
|
|
513
|
+
### Browser-backed integration evaluation
|
|
514
|
+
|
|
515
|
+
Run `kerf-ui-evaluate --url <running-app>` (or import
|
|
516
|
+
`@kerfjs/ui/evaluator`) after the static analyzer. Its Playwright-backed
|
|
517
|
+
wide/intermediate/narrow/200%-zoom, light/dark, and reduced-motion matrix checks
|
|
518
|
+
rendered overflow, clipping, reachability, focus/keyboard behavior, accessible
|
|
519
|
+
names, contrast, hit targets, scrolling, alignment, and cataloged runtime
|
|
520
|
+
geometry. The versioned report carries stable `KUI-B###` diagnostics, focused
|
|
521
|
+
DOM/computed-style evidence, hashed screenshot artifacts, explicit timeout and
|
|
522
|
+
retention policy, and a separate unscored human-visual rubric. See the
|
|
523
|
+
[browser evaluator guide](./docs/ui-evaluator.md).
|
|
524
|
+
|
|
525
|
+
### Unified repair-loop doctor
|
|
526
|
+
|
|
527
|
+
Use `kerf-ui-doctor` for the supported application repair loop across profile/catalog validation, TypeScript, the Kerf UI ESLint preset, static layout analysis, and an optional explicitly authorized browser evaluation. Its isolated Kerf lint pass preserves each file's applicable core-rule and suppression settings without executing consumer plugin rules. It emits one portable versioned JSON report with deterministic exit codes, exact suppressions, monorepo package selection, changed/full modes, caching, and local-path redaction. See the [UI doctor guide](./docs/ui-doctor.md).
|
|
158
528
|
|
|
159
529
|
For code generation, pair catalog selection guidance with the checked-in
|
|
160
530
|
[`public-api-signatures-v1.md`](./ai/public-api-signatures-v1.md) declaration
|
|
@@ -184,40 +554,74 @@ roots therefore do not need a transitive stylesheet list, and removing the last
|
|
|
184
554
|
component import also removes its reachable CSS. This is component-level CSS
|
|
185
555
|
tree shaking; variants within an imported component remain together.
|
|
186
556
|
|
|
557
|
+
When one public subpath groups several visual components, its source is a
|
|
558
|
+
folder: one component per file and one owned stylesheet per visual component.
|
|
559
|
+
The public JavaScript/TypeScript compatibility entrypoint only re-exports those
|
|
560
|
+
modules, and its CSS compatibility entrypoint only imports the owner
|
|
561
|
+
stylesheets. Do not accumulate multiple visual owners in either compatibility
|
|
562
|
+
file.
|
|
563
|
+
|
|
564
|
+
`npm run check:css-ownership` keeps that boundary honest: application CSS may
|
|
565
|
+
style only application-owned structure, never package component classes or
|
|
566
|
+
Web Awesome descendants, and a package component's stylesheet styles only
|
|
567
|
+
itself (in a composing parent's context when needed) — never another kerf
|
|
568
|
+
component's root, the `wa-*` tags it renders, its variables, or a hook class on
|
|
569
|
+
its root. The UX catalog's `style.css` contains document-shell
|
|
570
|
+
mechanics only, recipes ship no stylesheets (`npm run check:recipes` rejects
|
|
571
|
+
route stylesheets, inline styles, and styling-only classes), and `catalog.css`
|
|
572
|
+
remains a
|
|
573
|
+
minimal compatibility entrypoint.
|
|
574
|
+
|
|
187
575
|
The root `@kerfjs/ui` barrel stays JavaScript-only because making a side-effectful
|
|
188
576
|
CSS barrel tree-shakable is not portable across bundlers. If an application uses
|
|
189
577
|
that convenience import, also import `@kerfjs/ui/styles.css`, which deliberately
|
|
190
578
|
contains the complete layer. Non-browser/SSR tools resolve the pure `import`
|
|
191
579
|
condition automatically; `@kerfjs/ui/unstyled` is the explicit CSS-free root
|
|
192
580
|
entry for a browser build with a custom styling pipeline. The exported
|
|
193
|
-
|
|
194
|
-
delivery.
|
|
195
|
-
|
|
581
|
+
`@kerfjs/ui/foundation.css` and component CSS paths remain available for fully
|
|
582
|
+
manual delivery. Its complete supported `--kui-*` token surface is cataloged
|
|
583
|
+
under the `foundation` entry. Load application overrides after package styles,
|
|
584
|
+
or scope variables directly on a component instance.
|
|
585
|
+
|
|
586
|
+
Applications can separately opt into `@kerfjs/ui/document.css` for border-box
|
|
587
|
+
sizing, token-backed body typography/colors, zero body margin, plain-link color,
|
|
588
|
+
inherited native table-cell and form-control font metrics, and a definite
|
|
589
|
+
full-height chain. Add `class="kui-app-root"` to the one direct
|
|
590
|
+
mount container when a percentage-height application shell must fill the
|
|
591
|
+
viewport. This global baseline is deliberately absent from `styles.css` and
|
|
592
|
+
component browser imports. See [Document baseline](./docs/document-baseline.md).
|
|
196
593
|
|
|
197
594
|
## Pane and content geometry
|
|
198
595
|
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
an optional
|
|
202
|
-
|
|
596
|
+
Render `Pane` (`@kerfjs/ui/pane`) for a sidebar, main area, inspector, or
|
|
597
|
+
dialog: the same structural vocabulary everywhere. Its `.kui-pane` root is
|
|
598
|
+
unpadded and contains an optional header, one scrolling `.kui-pane__content`,
|
|
599
|
+
and an optional footer; the content slot already carries `.kui-content`, which
|
|
600
|
+
makes its major children a vertical stack with 24px gaps. Choose landmark
|
|
601
|
+
semantics with `element` / `contentElement` rather than writing the pane
|
|
602
|
+
classes onto your own elements — `eslint-plugin-kerfjs` reports a component's
|
|
603
|
+
anatomy class on an application-owned element as `KUI-L103`.
|
|
203
604
|
|
|
204
605
|
```tsx
|
|
205
|
-
<
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
<
|
|
214
|
-
|
|
215
|
-
</
|
|
606
|
+
<Pane
|
|
607
|
+
element="aside"
|
|
608
|
+
label="Workspace"
|
|
609
|
+
contentElement="nav"
|
|
610
|
+
header={<Toolbar label="Workspace" ... />}
|
|
611
|
+
>
|
|
612
|
+
<section>
|
|
613
|
+
<ListHeader label="Workspace" count={3} countLabel="3 workspaces" />
|
|
614
|
+
<ListItem action="open" label="Inbox" icon={inboxIcon} />
|
|
615
|
+
<ListItem action="open" label="Drafts" />
|
|
616
|
+
</section>
|
|
617
|
+
<ContentItem>Workspace details</ContentItem>
|
|
618
|
+
</Pane>
|
|
216
619
|
```
|
|
217
620
|
|
|
218
|
-
Ordinary children use
|
|
219
|
-
(transparent by default), 8px padding, and 12px
|
|
220
|
-
|
|
621
|
+
Ordinary children use `ContentItem` (`@kerfjs/ui/content-item`): 8px inline
|
|
622
|
+
margin, a real 1px border (transparent by default), 8px padding, and 12px
|
|
623
|
+
rounded corners. `shape="pill"` uses a 22px radius, and `frame="framed"` paints
|
|
624
|
+
the neutral border only when the item marks a real distinction. A component can expose a transparent border or
|
|
221
625
|
background without changing layout. `ListHeader` follows the same rule while
|
|
222
626
|
keeping its dormant title and count-or-badge cluster separate from its optional
|
|
223
627
|
44px action.
|
|
@@ -234,14 +638,17 @@ the complete [layout contract](./docs/layout.md).
|
|
|
234
638
|
|
|
235
639
|
## Web Awesome theme
|
|
236
640
|
|
|
237
|
-
|
|
238
|
-
|
|
641
|
+
Kerf components never need Web Awesome: every Kerf component draws native
|
|
642
|
+
controls and reads only `--kui-*` tokens, which resolve to the same values with
|
|
643
|
+
or without the Web Awesome theme. `@awesome.me/webawesome` is an optional peer
|
|
644
|
+
for applications that also render Web Awesome's `wa-*` elements. Those apps opt
|
|
645
|
+
into the same visual universe with one CSS import:
|
|
239
646
|
|
|
240
647
|
```ts
|
|
241
|
-
import type {} from
|
|
242
|
-
import
|
|
243
|
-
import
|
|
244
|
-
import
|
|
648
|
+
import type {} from "@kerfjs/ui/webawesome";
|
|
649
|
+
import "@kerfjs/ui/webawesome.css";
|
|
650
|
+
import "@awesome.me/webawesome/dist/components/button/button.js";
|
|
651
|
+
import "@awesome.me/webawesome/dist/components/input/input.js";
|
|
245
652
|
```
|
|
246
653
|
|
|
247
654
|
The type-only `@kerfjs/ui/webawesome` import adds Kerf JSX intrinsic-element
|
|
@@ -252,7 +659,10 @@ Awesome modules the application renders.
|
|
|
252
659
|
`webawesome.css` includes Web Awesome's native/base theme and then applies the
|
|
253
660
|
Hot Sheet 2 palette, surfaces, status colors, focus treatment, form geometry,
|
|
254
661
|
radii, tooltips, and shadows through Web Awesome's public `--wa-*` contract.
|
|
255
|
-
|
|
662
|
+
On `wa-dialog`, the optional `hide-actions` class hides the exported
|
|
663
|
+
`header-actions` shadow part for compositions that provide another dismissal
|
|
664
|
+
affordance.
|
|
665
|
+
Those tokens flow into all free component families. Every free Web Awesome 3.14
|
|
256
666
|
component has an individual UX-catalog route under the collapsible ecosystem
|
|
257
667
|
section, but the theme entry does not import or register component JavaScript,
|
|
258
668
|
so each component module remains independently tree-shakeable in consuming apps.
|
|
@@ -260,37 +670,44 @@ Tooltip and Popover surfaces omit pointer arrows by default. Override
|
|
|
260
670
|
`--wa-tooltip-arrow-size` and `--kui-wa-popover-arrow-size`, or a single
|
|
261
671
|
popover's public `--arrow-size`, when an arrow communicates useful context.
|
|
262
672
|
|
|
263
|
-
|
|
264
|
-
|
|
673
|
+
Configure semantic values globally at the application root, or scope variables
|
|
674
|
+
to a self-owned subtree. Use Web Awesome's `.wa-light`, `.wa-dark`, and `.wa-invert`
|
|
265
675
|
classes for explicit appearance boundaries:
|
|
266
676
|
|
|
267
677
|
```css
|
|
268
678
|
:root {
|
|
269
679
|
--wa-color-brand-fill-loud: #7540a8;
|
|
270
|
-
--wa-form-control-border-radius: .5rem;
|
|
680
|
+
--wa-form-control-border-radius: 0.5rem;
|
|
271
681
|
}
|
|
272
682
|
```
|
|
273
683
|
|
|
274
684
|
`foundation.css` follows Hot Sheet 2's Web Awesome-compatible semantic palette.
|
|
275
|
-
Brand, neutral, success, warning, and danger each expose fill, border, and
|
|
276
|
-
foreground roles through `--kui-color
|
|
685
|
+
Brand, pop, neutral, success, warning, and danger each expose fill, border, and
|
|
686
|
+
foreground roles through `--kui-color-*`. Pop is attractive, non-status emphasis
|
|
687
|
+
for featured, novel, or celebratory content; it never substitutes for success,
|
|
688
|
+
warning, or danger. Stateful components also expose
|
|
277
689
|
component variables such as `--kui-state-banner-background`. Override the
|
|
278
690
|
foundation for an application theme, a tone variable for one semantic state, or
|
|
279
691
|
a component variable on one instance without replacing component selectors.
|
|
280
|
-
Prefer an equivalent prop or token.
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
`
|
|
692
|
+
Prefer an equivalent prop or token. The component catalog's `publicClasses`
|
|
693
|
+
arrays support diagnostics, tooling, browser assertions, and package-owned
|
|
694
|
+
composition; they are not an application styling API. Application-owned CSS may
|
|
695
|
+
style new structure rendered by its own component, but it must not select a
|
|
696
|
+
nested Kerf or Web Awesome component. Add missing configuration to the owner.
|
|
697
|
+
Markup follows the same rule: write only an entry's `placeableClasses` (layout
|
|
698
|
+
utilities, `kui-app-root`, `kui-content-item` on a non-div carrier) onto your
|
|
699
|
+
own elements; any other public class recreates a component by class, which
|
|
700
|
+
`eslint-plugin-kerfjs` reports as `KUI-L103` with the component to render.
|
|
701
|
+
|
|
702
|
+
`StateBanner` has opinionated `neutral`, `info`, `pop`, `success`, `warning`,
|
|
703
|
+
and `danger` palettes. Override an individual banner with
|
|
287
704
|
`--kui-state-banner-background`, `--kui-state-banner-border`,
|
|
288
705
|
`--kui-state-banner-foreground`, `--kui-state-banner-detail`,
|
|
289
706
|
`--kui-state-banner-action-background`, and
|
|
290
707
|
`--kui-state-banner-action-hover-background`. To retheme one tone everywhere,
|
|
291
708
|
override `--kui-state-banner-{tone}-{background|border|foreground}`. Other
|
|
292
709
|
stateful components follow the same public-variable pattern, including
|
|
293
|
-
`--kui-toolbar-control-*`, `--kui-segmented-*`, `--kui-
|
|
710
|
+
`--kui-toolbar-control-*`, `--kui-segmented-*`, `--kui-tab-bar-item-*`, and
|
|
294
711
|
`--kui-tab-bar-*`.
|
|
295
712
|
|
|
296
713
|
`SegmentedControl` is a controlled exclusive-choice component. Use
|
|
@@ -307,8 +724,8 @@ standalone `filled`/`outlined` appearance with `shape="rounded"` or
|
|
|
307
724
|
appearance="toolbar"
|
|
308
725
|
shape="pill"
|
|
309
726
|
choices={[
|
|
310
|
-
{ value:
|
|
311
|
-
{ value:
|
|
727
|
+
{ value: "list", label: "List" },
|
|
728
|
+
{ value: "columns", label: "Columns" },
|
|
312
729
|
]}
|
|
313
730
|
/>
|
|
314
731
|
```
|
|
@@ -318,18 +735,97 @@ value through `data-segment-value`. Override an instance through
|
|
|
318
735
|
`--kui-segmented-{background|border|foreground|hover-background}` and
|
|
319
736
|
`--kui-segmented-selected-{background|foreground|border|shadow}`.
|
|
320
737
|
|
|
321
|
-
`
|
|
738
|
+
`ChoiceChips` is the wrapping exclusive choice for a visible set too large for
|
|
739
|
+
one segmented track, such as a labeled color palette. Each choice is a separate
|
|
740
|
+
pill backed by a native radio, so the group is one Tab stop, arrow keys move
|
|
741
|
+
the selection, and the checked radio submits the form value under `name`. A
|
|
742
|
+
choice may lead with a `swatch` (a `CssColor`, or `'transparent'` for the
|
|
743
|
+
struck-through no-color dot) or a decorative `icon`:
|
|
744
|
+
|
|
745
|
+
```tsx
|
|
746
|
+
<ChoiceChips
|
|
747
|
+
name="color"
|
|
748
|
+
label="Command color"
|
|
749
|
+
value={color.value}
|
|
750
|
+
action="select-command-color"
|
|
751
|
+
choices={[
|
|
752
|
+
{ value: "transparent", label: "Transparent", swatch: "transparent" },
|
|
753
|
+
{ value: "blue", label: "Blue", swatch: fillColor("#3b82f6") },
|
|
754
|
+
]}
|
|
755
|
+
/>
|
|
756
|
+
```
|
|
757
|
+
|
|
758
|
+
Listen for `change` on the supplied action (for example
|
|
759
|
+
`delegateActions(root, "change", { "select-command-color": … })`), read the
|
|
760
|
+
radio's `value`, and re-render.
|
|
761
|
+
|
|
762
|
+
Set `multiple` when any number of the options may be on, such as label filters
|
|
763
|
+
or annotation intents. `value` is then a `readonly Value[]`, the pills are
|
|
764
|
+
native checkboxes in a `role="group"` (each a Tab stop that Space toggles), and
|
|
765
|
+
every checked value submits under `name`. Read the checked boxes by name in the
|
|
766
|
+
change handler. A multiple group takes no `required`. On dark inverse chrome,
|
|
767
|
+
place the chips in a dark appearance scope (`.wa-dark`) instead of restyling
|
|
768
|
+
them.
|
|
769
|
+
|
|
770
|
+
`MessageComposer` is the chat or prompt composer: a raised frame (the standard
|
|
771
|
+
border, large radius, and `shadow-l`) whose border turns brand while focus is
|
|
772
|
+
within. Its borderless message field grows with its content between `minRows`
|
|
773
|
+
(default 1) and `maxRows` (default 8) lines, then scrolls, above an action row
|
|
774
|
+
with an optional quiet `hint` and the trailing `actions`:
|
|
775
|
+
|
|
776
|
+
```tsx
|
|
777
|
+
<MessageComposer
|
|
778
|
+
id="assistant-message"
|
|
779
|
+
name="message"
|
|
780
|
+
label="Message"
|
|
781
|
+
placeholder="Ask about this build"
|
|
782
|
+
hint="Answers use the latest nightly build."
|
|
783
|
+
trailing={<Button tone="brand" action="send-message">Send</Button>}
|
|
784
|
+
/>
|
|
785
|
+
```
|
|
786
|
+
|
|
787
|
+
The app reads and clears the textarea from its send action. For
|
|
788
|
+
Enter-to-send, set `submitOnEnter` and call `wireMessageComposers(root)` from
|
|
789
|
+
`@kerfjs/ui/wire-message-composers` once: Enter or Cmd/Ctrl+Enter clicks the first
|
|
790
|
+
trailing action, Shift+Enter inserts a newline, and an IME composition commit
|
|
791
|
+
or an empty message never sends. Put it in a `DialogSurface` with
|
|
792
|
+
`footerPresentation="floating"` (`slot="footer"`) to float it over a
|
|
793
|
+
transcript, and give the transcript `scrollClearance="block-end"` so it
|
|
794
|
+
scrolls beneath the composer while its last message still rests above it.
|
|
795
|
+
Add `headerPresentation="floating"` with a `fill` body and
|
|
796
|
+
`scrollClearance="both"` to let the transcript scroll beneath a translucent
|
|
797
|
+
title bar as well.
|
|
798
|
+
|
|
799
|
+
`SearchField` is a token-controlled contenteditable searchbox that keeps
|
|
322
800
|
free text and ordered filter chips in one field. Its editable text stays
|
|
323
801
|
DOM-owned between token changes so typing does not replace the caret. Tokens
|
|
324
802
|
expose stable edit/remove actions and remain atomic during editing; the app owns
|
|
325
|
-
parsing, suggestions, query execution, and state.
|
|
803
|
+
parsing, suggestions, query execution, and state in manual mode. For automatic
|
|
804
|
+
handling, create a model with `createSearchFieldModel({ rules, evaluate })`,
|
|
805
|
+
pass it as the field's `model`, and register it under the field id in
|
|
806
|
+
`wireSearchFields(root, { models })`. Rules parse `name:value` expressions;
|
|
807
|
+
their optional `suggest` function supplies selectable completions. The model
|
|
808
|
+
commits valid expressions on whitespace or Enter, owns chips and clear/edit/
|
|
809
|
+
remove actions, and exposes `state`, `suggestions`, and the latest `result` as
|
|
810
|
+
signals. The field subscribes only to `model.structure`, which changes when a
|
|
811
|
+
token is committed or removed, the text becomes empty or non-empty, or the
|
|
812
|
+
editor revision changes, so typing plain text never re-runs the host render.
|
|
813
|
+
Keep it that way in the host: read `model.state.peek()` in render, and bind
|
|
814
|
+
`model.result` (or a `computed`) as a fine-grained signal hole rather than
|
|
815
|
+
reading `model.state.value`. Omit the model to retain full manual control. Use `readSearchField()`
|
|
326
816
|
after browser input to recover text plus token offsets, and
|
|
327
|
-
`
|
|
328
|
-
Call `
|
|
817
|
+
`placeSearchFieldCaret()` when restoring focus after a controlled update.
|
|
818
|
+
Call `wireSearchFields()` once at a stable root to make Enter submit through
|
|
329
819
|
`onSubmit` without inserting a contenteditable line break and to preserve focus
|
|
330
820
|
plus the text-relative caret when keyboard deletion of a chip causes controlled
|
|
331
|
-
rendering to replace the editor.
|
|
332
|
-
|
|
821
|
+
rendering to replace the editor. A select-all deletion is normalized to a truly
|
|
822
|
+
empty editor even when the browser leaves an atomic chip or line break behind;
|
|
823
|
+
replacement typing consumes that intent so a later Backspace/Delete remains an
|
|
824
|
+
ordinary character edit.
|
|
825
|
+
Managed deletion keeps a collapsible replacement editor open and focused before
|
|
826
|
+
the next keystroke; applications must persist both query and tokens from the DOM
|
|
827
|
+
read. Genuine outside focus and Escape still collapse an empty field.
|
|
828
|
+
Text still wraps visually when it reaches the field edge.
|
|
333
829
|
Clear actions should empty the editor's `textContent` before clearing app state.
|
|
334
830
|
The leading icon, first text line, clear action, and trailing slot share one
|
|
335
831
|
fixed alignment row; when text wraps, those controls stay pinned to that first
|
|
@@ -341,67 +837,119 @@ and respect reduced-motion preferences. The field works standalone or inside a
|
|
|
341
837
|
`ToolbarControlGroup`; the application owns the transient focused/open signal,
|
|
342
838
|
focus transfer, and focusout policy. The catalog's Toolbar route demonstrates
|
|
343
839
|
that composition at wide and narrow sizes.
|
|
344
|
-
Override its surface through `--kui-
|
|
345
|
-
chips through `--kui-
|
|
346
|
-
`--kui-
|
|
840
|
+
Override its surface through `--kui-search-field-{background|border}` and its
|
|
841
|
+
chips through `--kui-search-field-token-{background|foreground}`. Override
|
|
842
|
+
`--kui-search-field-line-size` only when the complete first-line geometry must
|
|
347
843
|
change together.
|
|
348
844
|
|
|
349
|
-
`TabBar` is controlled: pass ordered `
|
|
845
|
+
`TabBar` is controlled: pass ordered `TabBarItem` children, then wire its keyboard
|
|
350
846
|
and same-bar drag behavior with `wireTabBars(root, { onReorder })`. During a
|
|
351
847
|
drag, the scroll strip automatically moves toward either edge with speed based
|
|
352
848
|
on pointer proximity, exposing earlier or later drop targets. Apply the reported
|
|
353
849
|
change with `reorderTabs()` or application-specific state logic. The application
|
|
354
850
|
still owns selection, closing, routing, and persistence.
|
|
355
|
-
|
|
851
|
+
For a tab-local action immediately after the final tab plus a workspace action
|
|
852
|
+
at the opposite edge, set `trailingPlacement="adjacent"`, pass the local action
|
|
853
|
+
through `trailing`, and pass the workspace action through `end`. TabBar owns the
|
|
854
|
+
flex geometry: the tab strip shrinks and scrolls while both action regions stay
|
|
855
|
+
visible. Do not recreate that split with descendant CSS overrides.
|
|
856
|
+
Use `TabBarItem.rootAttributes` for domain `data-*` metadata and `closeIcon` for a
|
|
356
857
|
decorative replacement glyph. The runtime rejects roles and case variants of
|
|
357
858
|
the component- or wiring-owned action, tab identity, selection, drag, drop, and
|
|
358
859
|
component markers. Keep the icon free of interactive descendants; the named
|
|
359
860
|
close button retains all close interaction.
|
|
360
861
|
|
|
361
|
-
`Select`
|
|
862
|
+
`Select` and `PopupMenu` draw their own native controls and need no Web Awesome. Each renders inert markup until its registration entry is imported once in the application:
|
|
362
863
|
|
|
363
864
|
```ts
|
|
364
|
-
import
|
|
365
|
-
import
|
|
865
|
+
import "@kerfjs/ui/select/register";
|
|
866
|
+
import "@kerfjs/ui/popup-menu/register";
|
|
366
867
|
```
|
|
367
868
|
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
869
|
+
`select/register` defines the form-associated `kui-select` root and wires every `Select` in the document; `popup-menu/register` wires every `PopupMenu` (opening, keyboard navigation, submenus, the `kui-menu-select` event, and focus return). That boundary keeps custom-element and document-listener side effects out of bundles that use unrelated components. Automated consumer-bundle tests enforce it, and also prove that no public entry except `@kerfjs/ui/webawesome.css` pulls in Web Awesome. Either registration also installs help tags: an icon-only Select, PopupMenu, or `aria-label`-named `<button>` in a `ToolbarControlGroup` shows its name in an `aria-hidden` tooltip on hover and keyboard focus. A toolbar with icon-only buttons but neither control imports `@kerfjs/ui/help-tags/register`, which registers only the tooltip.
|
|
870
|
+
|
|
871
|
+
`PopupMenu` items may include `submenu` children, `checked` choices, a leading `icon`, trailing `details`, `disabledReason`, and a `danger` tone. The app owns choice state and dispatches each item's `action`. For a right-click menu, set `context: true`, a `label`, and `anchor={pointSignal.value}`; the app's `contextmenu` handler stores `{ x: event.clientX, y: event.clientY }` in that signal and calls `openPopupMenu(menu)`. The menu renders its own zero-footprint anchor host and keeps the point across re-renders, so it needs no wrapper or CSS (`openPopupMenuAt(menu, x, y, { placement? })` still opens a menu rendered without `anchor`); `closePopupMenu(menu)` closes it programmatically. See [component selection](docs/component-selection.md#popup-menu-migration) for examples.
|
|
872
|
+
Use `label` for a visible label or `ariaLabel` for a visually hidden name. A
|
|
873
|
+
nonempty visible label takes precedence when both are supplied. Kerf names the
|
|
874
|
+
native trigger without adding visible label spacing; this also works with
|
|
875
|
+
`renderSelected`. Use `hint`
|
|
876
|
+
for persistent supporting text below the control and `placeholderText` for the
|
|
877
|
+
empty value inside the closed control. Loading placeholders preserve the hint.
|
|
878
|
+
|
|
879
|
+
`Select` also owns its reconciliation boundary: option icons keep stable
|
|
880
|
+
elements across rerenders, and `renderSelected` content is replaced when the
|
|
881
|
+
controlled value changes. Consumers do not need to add
|
|
882
|
+
`data-key` or `data-morph-skip` workarounds around choice icons. Icon-bearing
|
|
883
|
+
options retain the standard icon-to-label gap. When a compact Select is wrapped
|
|
884
|
+
in a `ToolbarControlGroup`, use `focusRingOwner="group"`; the group paints the
|
|
885
|
+
focus ring with its configured pill or rounded geometry.
|
|
886
|
+
|
|
887
|
+
For application choices and panes, use Kerf's purpose-built primitives;
|
|
888
|
+
Web Awesome is an optional integration, and the
|
|
889
|
+
[migration guide](./docs/webawesome-migration.md) maps each Web Awesome
|
|
890
|
+
element a Kerf component replaces (`Select`, `PopupMenu`, `SegmentedControl`,
|
|
891
|
+
`TabBar`, `LucideIcon`, `ResizableRegion`, and the native form controls). `ResizableRegion` includes Hot Sheet 2's 1px separator and
|
|
379
892
|
hover/focus grip. Its optional `handleIcon` replaces only the decorative glyph;
|
|
380
893
|
the component and `wireResizableRegions()` retain separator semantics and
|
|
381
|
-
pointer/keyboard behavior.
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
894
|
+
pointer/keyboard behavior. Typed policies cover separator visibility,
|
|
895
|
+
instant-track/composited-content collapse, popup-safe overflow,
|
|
896
|
+
inline/overlay/hidden responsive presentation, `responsiveFillAt` single-track
|
|
897
|
+
replacement, and safe-area restore controls;
|
|
898
|
+
the same policies are available on `Workbench` and `CollapsiblePanel`. In an
|
|
899
|
+
integration application, consider Web Awesome Popup when its anchored-positioning
|
|
900
|
+
engine removes custom placement code, and treat Tree, Animated Image,
|
|
901
|
+
Comparison, and Zoomable Frame as exceptional rather than default patterns.
|
|
902
|
+
The detailed rationale lives in the theme contract.
|
|
385
903
|
|
|
386
904
|
## Design and tool guidance
|
|
387
905
|
|
|
388
906
|
- [Component selection and composition](./docs/component-selection.md)
|
|
389
907
|
- [Design philosophy](./docs/design-philosophy.md)
|
|
390
908
|
- [Apple HIG translation](./docs/apple-hig.md)
|
|
909
|
+
- [Writing interface copy](./docs/writing.md)
|
|
391
910
|
- [Accessibility and keyboard contracts](./docs/accessibility.md)
|
|
911
|
+
- [Button current-step semantics](./docs/button.md)
|
|
392
912
|
- [Component and integration contract](./docs/component-contract.md)
|
|
393
913
|
- [Spacing and application layout](./docs/layout.md)
|
|
394
914
|
- [Web Awesome theme contract](./docs/webawesome-theme.md)
|
|
915
|
+
- [Moving an application off Web Awesome](./docs/webawesome-migration.md)
|
|
395
916
|
- [UX catalog contract](./docs/ux-demo.md)
|
|
396
917
|
- [AI guide](./ai/skill.md)
|
|
397
918
|
|
|
398
|
-
Run `npm run dev` from this directory for the category-grouped master/detail catalog. Every public visual component has a focused route; all
|
|
919
|
+
Run `npm run dev` from this directory for the category-grouped master/detail catalog. Every public visual component has a focused route; all 73 free Web Awesome 3.14 components have focused routes under the collapsible Web Awesome Integration section. Every detail visibly links its first-party demo source and existing guidance while showing the repository-relative paths; first-party components also link their implementation source, and Web Awesome entries label local guidance as Kerf integration guidance. One grouped `Related components` selector contains derived `Uses` / `Used by` navigation across both sets. Run `npm run check` for static/unit/bundle gates and `npm run test:e2e` for the real-browser suite.
|
|
399
920
|
|
|
400
|
-
Run `npm run format
|
|
401
|
-
|
|
921
|
+
Run `npm run format` after editing source or structured content. The narrower
|
|
922
|
+
`npm run format:css` command remains available for style-only work. The normal
|
|
923
|
+
`npm run lint` and `npm run check` gates use Prettier to reject formatting drift.
|
|
402
924
|
|
|
403
925
|
For dimensions that should scale with the root font size, author pixels with
|
|
404
926
|
`remify()`: `gap: remify(17px)` builds to `gap: 1.0625rem` using a fixed 16px
|
|
405
927
|
baseline. Keep intentional 1px borders in pixels and contextual `em` values
|
|
406
928
|
explicit. `npm run build` emits standard CSS to `dist/styles`; `npm run dev`
|
|
407
929
|
applies the same transform directly to source styles and hot-reloads edits.
|
|
930
|
+
|
|
931
|
+
Lowered surfaces and decorative neutral fills/borders use translucent shared theme colors. Nested surfaces compound naturally; demos compose public components without per-depth overrides. See [contextual transparency](docs/webawesome-theme.md#contextual-transparency).
|
|
932
|
+
|
|
933
|
+
`ToolbarText` and `ToolbarControlGroup` accept typed `hideBelow`/`showBelow`
|
|
934
|
+
lengths (for example `px(416)`). Wire `wireToolbarVisibility(root)` from
|
|
935
|
+
`@kerfjs/ui/wire-toolbar-visibility` and dispose on unmount. Thresholds use the
|
|
936
|
+
nearest Toolbar content-box width: hideBelow hides strictly below, showBelow
|
|
937
|
+
shows strictly below, with complementary behavior at equality. Percentages use
|
|
938
|
+
that content width; em and custom properties use the item's own context. Invalid,
|
|
939
|
+
negative, unresolved, or contradictory values leave the item visible under this
|
|
940
|
+
width policy. Keep primary actions visible and offer a complementary overflow
|
|
941
|
+
group. See `docs/component-contract.md` "Toolbar width visibility" for lifecycle
|
|
942
|
+
details.
|
|
943
|
+
|
|
944
|
+
## License and third-party notices
|
|
945
|
+
|
|
946
|
+
`@kerfjs/ui` is MIT licensed (see `LICENSE`).
|
|
947
|
+
|
|
948
|
+
Web Awesome (`@awesome.me/webawesome`, copyright Fonticons, Inc., MIT) is an
|
|
949
|
+
optional peer dependency. This package does not copy or bundle Web Awesome
|
|
950
|
+
code: `@kerfjs/ui/webawesome.css` imports Web Awesome's stylesheet from the
|
|
951
|
+
application's own installation, and `@kerfjs/ui/webawesome` contains only type
|
|
952
|
+
declarations. An application that bundles Web Awesome components
|
|
953
|
+
redistributes them, so it should retain Web Awesome's MIT notice; Font Awesome
|
|
954
|
+
Free, whose icons Web Awesome embeds, asks that the attribution comments in
|
|
955
|
+
those icons stay intact.
|