@kerfjs/ui 5.0.0-beta.103 → 5.0.0-beta.105
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 +163 -116
- package/ai/application-ui-profile.defaults.json +125 -4
- package/ai/compile-time-contracts-v1.json +11 -11
- package/ai/component-catalog.json +2606 -627
- package/ai/component-composition-rules.json +11 -10
- package/ai/component-composition.json +1689 -300
- package/ai/components/README.md +66 -48
- package/ai/components/application-tabs.md +4 -4
- package/ai/components/badge.md +1 -0
- package/ai/components/button.md +91 -0
- package/ai/components/checkbox.md +89 -0
- package/ai/components/choice-chips.md +9 -3
- package/ai/components/color-field.md +92 -0
- package/ai/components/color-picker.md +90 -0
- package/ai/components/color-swatches.md +82 -0
- package/ai/components/combobox.md +6 -4
- package/ai/components/content-item.md +5 -2
- package/ai/components/disclosure.md +83 -0
- package/ai/components/file-picker.md +1 -0
- package/ai/components/foundation.md +1 -1
- package/ai/components/list-action-row.md +3 -3
- package/ai/components/list-detail-dialog.md +90 -0
- package/ai/components/list.md +2 -0
- package/ai/components/lucide-icon.md +2 -0
- package/ai/components/{composer.md → message-composer.md} +17 -16
- package/ai/components/pane.md +3 -1
- package/ai/components/popup-menu.md +12 -9
- package/ai/components/progress-bar.md +82 -0
- package/ai/components/progress-ring.md +80 -0
- package/ai/components/radio-group.md +88 -0
- package/ai/components/recipe-list-detail-dialog.md +5 -5
- package/ai/components/search-field.md +108 -0
- package/ai/components/select.md +15 -13
- package/ai/components/slider.md +84 -0
- package/ai/components/surface-scaffold.md +16 -13
- package/ai/components/switch.md +81 -0
- package/ai/components/tab-bar.md +6 -6
- package/ai/components/tab-navigator.md +2 -2
- package/ai/components/tabs.md +7 -7
- package/ai/components/tag-field.md +86 -0
- package/ai/components/text-field.md +98 -0
- package/ai/components/text.md +1 -0
- package/ai/components/toast.md +85 -0
- package/ai/components/toolbar-control-group.md +3 -3
- package/ai/components/tooltip.md +81 -0
- package/ai/components/wa-accordion-item.md +11 -5
- package/ai/components/wa-accordion.md +11 -5
- package/ai/components/wa-animated-image.md +2 -1
- package/ai/components/wa-animation.md +1 -0
- package/ai/components/wa-avatar.md +1 -0
- package/ai/components/wa-badge.md +10 -3
- package/ai/components/wa-breadcrumb-item.md +1 -0
- package/ai/components/wa-breadcrumb.md +1 -0
- package/ai/components/wa-button-group.md +6 -4
- package/ai/components/wa-button.md +7 -5
- package/ai/components/wa-callout.md +7 -5
- package/ai/components/wa-card.md +12 -4
- package/ai/components/wa-carousel-item.md +1 -0
- package/ai/components/wa-carousel.md +1 -0
- package/ai/components/wa-checkbox-group.md +11 -4
- package/ai/components/wa-checkbox.md +10 -4
- package/ai/components/wa-color-picker.md +13 -5
- package/ai/components/wa-comparison.md +2 -1
- package/ai/components/wa-copy-button.md +1 -0
- package/ai/components/wa-details.md +11 -5
- package/ai/components/wa-dialog.md +10 -4
- package/ai/components/wa-divider.md +1 -0
- package/ai/components/wa-drawer.md +12 -5
- package/ai/components/wa-dropdown-item.md +8 -6
- package/ai/components/wa-dropdown.md +8 -6
- package/ai/components/wa-format-bytes.md +1 -0
- package/ai/components/wa-format-date.md +1 -0
- package/ai/components/wa-format-number.md +1 -0
- package/ai/components/wa-icon.md +2 -1
- package/ai/components/wa-include.md +6 -4
- package/ai/components/wa-input.md +9 -6
- package/ai/components/wa-intersection-observer.md +1 -0
- package/ai/components/wa-known-date.md +1 -0
- package/ai/components/wa-markdown.md +1 -0
- package/ai/components/wa-mutation-observer.md +1 -0
- package/ai/components/wa-number-input.md +1 -0
- package/ai/components/wa-option.md +7 -5
- package/ai/components/wa-otp-input.md +1 -0
- package/ai/components/wa-page.md +13 -4
- package/ai/components/wa-pagination.md +1 -0
- package/ai/components/wa-popover.md +11 -5
- package/ai/components/wa-popup.md +11 -4
- package/ai/components/wa-progress-bar.md +11 -4
- package/ai/components/wa-progress-ring.md +11 -4
- package/ai/components/wa-qr-code.md +1 -0
- package/ai/components/wa-radio-group.md +12 -4
- package/ai/components/wa-radio.md +10 -4
- package/ai/components/wa-random-content.md +1 -0
- package/ai/components/wa-rating.md +1 -0
- package/ai/components/wa-relative-time.md +1 -0
- package/ai/components/wa-resize-observer.md +1 -0
- package/ai/components/wa-scroller.md +12 -4
- package/ai/components/wa-select.md +7 -5
- package/ai/components/wa-skeleton.md +10 -3
- package/ai/components/wa-slider.md +11 -5
- package/ai/components/wa-spinner.md +7 -5
- package/ai/components/wa-split-panel.md +7 -5
- package/ai/components/wa-step.md +56 -0
- package/ai/components/wa-stepper.md +56 -0
- package/ai/components/wa-switch.md +10 -3
- package/ai/components/wa-tab-group.md +8 -6
- package/ai/components/wa-tab-panel.md +7 -5
- package/ai/components/wa-tab.md +8 -6
- package/ai/components/wa-tag-input.md +62 -0
- package/ai/components/wa-tag.md +9 -6
- package/ai/components/wa-textarea.md +10 -3
- package/ai/components/wa-time-input.md +1 -0
- package/ai/components/wa-toast-item.md +9 -7
- package/ai/components/wa-toast.md +9 -7
- package/ai/components/wa-tooltip.md +11 -5
- package/ai/components/wa-tree-item.md +2 -1
- package/ai/components/wa-tree.md +2 -1
- package/ai/components/wa-zoomable-frame.md +2 -1
- package/ai/components/workbench-dialog.md +90 -0
- package/ai/public-api-signatures-v1.md +1577 -245
- package/ai/skill.md +83 -50
- package/ai/webawesome-jsx-signatures-v1.md +4 -1
- package/dist/badge.d.ts +9 -1
- package/dist/badge.js +1 -1
- package/dist/browser/button.js +5 -0
- package/dist/browser/catalog.js +3 -2
- package/dist/browser/{icon-button.js → checkbox.js} +2 -2
- 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/disclosure.js +5 -0
- package/dist/browser/list-action-row.js +1 -0
- package/dist/browser/list-detail-dialog.js +14 -0
- package/dist/browser/message-composer.js +5 -0
- package/dist/browser/popup-menu.js +1 -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/search-field.js +4 -0
- package/dist/browser/slider.js +3 -0
- package/dist/browser/surface-scaffold.js +1 -0
- package/dist/browser/switch.js +3 -0
- package/dist/browser/tab-bar-item.js +4 -0
- package/dist/browser/tag-field.js +5 -0
- package/dist/browser/text-field.js +4 -0
- package/dist/browser/workbench-dialog.js +15 -0
- package/dist/button.d.ts +108 -0
- package/dist/button.js +7 -0
- package/dist/button.js.map +1 -0
- package/dist/catalog-resources.d.ts +1 -1
- package/dist/catalog.d.ts +3 -3
- package/dist/catalog.js +57 -27
- package/dist/catalog.js.map +1 -1
- package/dist/checkbox.d.ts +45 -0
- package/dist/checkbox.js +6 -0
- package/dist/checkbox.js.map +1 -0
- package/dist/choice-chips.d.ts +49 -15
- package/dist/choice-chips.js +1 -1
- package/dist/chunk-23PPPNH6.js +93 -0
- package/dist/chunk-23PPPNH6.js.map +1 -0
- package/dist/{chunk-FNZQOUZ5.js → chunk-2FW7D4IG.js} +2 -2
- package/dist/{chunk-FNZQOUZ5.js.map → chunk-2FW7D4IG.js.map} +1 -1
- package/dist/{chunk-ZYU5WRC3.js → chunk-3GLYIIFR.js} +2 -2
- package/dist/{chunk-ZYU5WRC3.js.map → chunk-3GLYIIFR.js.map} +1 -1
- package/dist/{chunk-5NQF35VO.js → chunk-4RECPEHI.js} +2 -2
- package/dist/{chunk-5NQF35VO.js.map → chunk-4RECPEHI.js.map} +1 -1
- package/dist/{chunk-7IUEBNCO.js → chunk-5USKCWGL.js} +8 -3
- package/dist/chunk-5USKCWGL.js.map +1 -0
- package/dist/chunk-6VVIW7VB.js +69 -0
- package/dist/chunk-6VVIW7VB.js.map +1 -0
- package/dist/{chunk-LL45C7BB.js → chunk-7K6U6FCN.js} +1 -1
- package/dist/chunk-7K6U6FCN.js.map +1 -0
- package/dist/{chunk-HQZYKJ56.js → chunk-7W3GKMN4.js} +110 -74
- package/dist/chunk-7W3GKMN4.js.map +1 -0
- package/dist/chunk-ACUKTVS3.js +371 -0
- package/dist/chunk-ACUKTVS3.js.map +1 -0
- package/dist/{chunk-YQ2AC4E2.js → chunk-AMIHGFLP.js} +2 -2
- package/dist/{chunk-YQ2AC4E2.js.map → chunk-AMIHGFLP.js.map} +1 -1
- 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-ETCWQLJV.js → chunk-BKUMG2KB.js} +38 -28
- 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-C3RLKKFQ.js +452 -0
- package/dist/chunk-C3RLKKFQ.js.map +1 -0
- package/dist/{chunk-IM3GKYOG.js → chunk-CIAUILRR.js} +52 -32
- 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-LPHU44S3.js → chunk-CTQUDCY5.js} +3 -1
- package/dist/chunk-CTQUDCY5.js.map +1 -0
- package/dist/{chunk-MXNIVEVL.js → chunk-D4MXSAMI.js} +5 -3
- package/dist/chunk-D4MXSAMI.js.map +1 -0
- package/dist/{chunk-YBWQR2OK.js → chunk-DDSCVEO5.js} +10 -9
- package/dist/chunk-DDSCVEO5.js.map +1 -0
- package/dist/{chunk-SIW64V65.js → chunk-DF2YKGIX.js} +3 -3
- package/dist/{chunk-SIW64V65.js.map → chunk-DF2YKGIX.js.map} +1 -1
- package/dist/{chunk-3SKAEPPZ.js → chunk-ECFCAKWE.js} +4 -4
- package/dist/{chunk-3SKAEPPZ.js.map → chunk-ECFCAKWE.js.map} +1 -1
- package/dist/chunk-EKBMUXFV.js +298 -0
- package/dist/chunk-EKBMUXFV.js.map +1 -0
- package/dist/{chunk-IXLUZHGT.js → chunk-FG6U7KQQ.js} +5 -5
- package/dist/{chunk-IXLUZHGT.js.map → chunk-FG6U7KQQ.js.map} +1 -1
- package/dist/chunk-FKKJHGN5.js +147 -0
- package/dist/chunk-FKKJHGN5.js.map +1 -0
- package/dist/{chunk-FDZNYD4C.js → chunk-GCAK23PU.js} +34 -3
- package/dist/chunk-GCAK23PU.js.map +1 -0
- package/dist/chunk-GXSX6Q6O.js +42 -0
- package/dist/chunk-GXSX6Q6O.js.map +1 -0
- package/dist/{chunk-LOSRXZAH.js → chunk-HJXVVFBT.js} +14 -6
- package/dist/chunk-HJXVVFBT.js.map +1 -0
- package/dist/{chunk-M5KZ26VV.js → chunk-HQZG3OFL.js} +11 -1
- package/dist/chunk-HQZG3OFL.js.map +1 -0
- package/dist/{chunk-ELCMSQNJ.js → chunk-HTERKONR.js} +8 -8
- package/dist/chunk-HTERKONR.js.map +1 -0
- package/dist/chunk-HYORKKYP.js +8 -0
- package/dist/chunk-HYORKKYP.js.map +1 -0
- package/dist/chunk-IO27YTL3.js +73 -0
- package/dist/chunk-IO27YTL3.js.map +1 -0
- package/dist/chunk-ITUQC4FW.js +163 -0
- package/dist/chunk-ITUQC4FW.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-W4IK7AWD.js → chunk-KDQZ3E5C.js} +3 -1
- package/dist/chunk-KDQZ3E5C.js.map +1 -0
- package/dist/{chunk-2MSPNRWJ.js → chunk-KK3S5OTW.js} +27 -11
- package/dist/chunk-KK3S5OTW.js.map +1 -0
- package/dist/chunk-LTBVP6VN.js +59 -0
- package/dist/chunk-LTBVP6VN.js.map +1 -0
- package/dist/chunk-OHPYT2BH.js +82 -0
- package/dist/chunk-OHPYT2BH.js.map +1 -0
- package/dist/{chunk-HZPHCSCS.js → chunk-OY2MXIBB.js} +8 -2
- package/dist/chunk-OY2MXIBB.js.map +1 -0
- package/dist/chunk-PE2KPZDW.js +85 -0
- package/dist/chunk-PE2KPZDW.js.map +1 -0
- package/dist/{chunk-QTSMHH5J.js → chunk-QPTJ5DOO.js} +5 -3
- package/dist/chunk-QPTJ5DOO.js.map +1 -0
- package/dist/{chunk-JOR5LGYE.js → chunk-RFLW4FPL.js} +1 -1
- package/dist/chunk-RFLW4FPL.js.map +1 -0
- package/dist/{chunk-U6QYTMDB.js → chunk-RMWNO6BA.js} +6 -2
- package/dist/chunk-RMWNO6BA.js.map +1 -0
- package/dist/{chunk-TDMHA7C3.js → chunk-SQ2Q3OQI.js} +112 -63
- package/dist/chunk-SQ2Q3OQI.js.map +1 -0
- package/dist/{chunk-K4AT3V3J.js → chunk-T74YB76U.js} +13 -11
- package/dist/chunk-T74YB76U.js.map +1 -0
- package/dist/{chunk-BYFTHA4I.js → chunk-TAHR457X.js} +53 -6
- package/dist/chunk-TAHR457X.js.map +1 -0
- package/dist/{chunk-3VXDSIBJ.js → chunk-TKNVL53O.js} +2 -2
- package/dist/{chunk-3VXDSIBJ.js.map → chunk-TKNVL53O.js.map} +1 -1
- 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-PKL6QJKK.js → chunk-UMNHJSIO.js} +93 -80
- package/dist/chunk-UMNHJSIO.js.map +1 -0
- package/dist/chunk-UTCAOOXU.js +116 -0
- package/dist/chunk-UTCAOOXU.js.map +1 -0
- package/dist/{chunk-MF6ZUUJZ.js → chunk-VEME3D7K.js} +38 -40
- package/dist/chunk-VEME3D7K.js.map +1 -0
- package/dist/{chunk-HLDRH23D.js → chunk-WJKHLOP5.js} +2 -2
- package/dist/{chunk-HLDRH23D.js.map → chunk-WJKHLOP5.js.map} +1 -1
- package/dist/chunk-WU57BYYM.js +115 -0
- package/dist/chunk-WU57BYYM.js.map +1 -0
- package/dist/{chunk-TGLUDQP2.js → chunk-ZCDRLN3B.js} +11 -11
- package/dist/chunk-ZCDRLN3B.js.map +1 -0
- package/dist/chunk-ZX2QQJXD.js +249 -0
- package/dist/chunk-ZX2QQJXD.js.map +1 -0
- package/dist/{chunk-6E2H2E5A.js → chunk-ZXZAECHZ.js} +6 -6
- package/dist/{chunk-6E2H2E5A.js.map → chunk-ZXZAECHZ.js.map} +1 -1
- package/dist/collapsible-panel.js +3 -3
- 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 +88 -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/combobox.js +1 -1
- package/dist/content-item.d.ts +13 -1
- package/dist/content-item.js +1 -1
- package/dist/disclosure-arrow.js +1 -1
- package/dist/disclosure.d.ts +57 -0
- package/dist/disclosure.js +51 -0
- package/dist/disclosure.js.map +1 -0
- package/dist/file-picker.d.ts +7 -0
- package/dist/file-picker.js +1 -1
- package/dist/help-tags-register.d.ts +8 -8
- package/dist/help-tags-register.js +3 -2
- package/dist/help-tags-register.js.map +1 -1
- package/dist/index.d.ts +16 -9
- package/dist/index.js +58 -46
- package/dist/list-action-row.js +4 -1
- package/dist/list-detail-dialog.d.ts +117 -0
- package/dist/list-detail-dialog.js +165 -0
- package/dist/list-detail-dialog.js.map +1 -0
- package/dist/list-header.js +1 -1
- package/dist/list-item.js +1 -1
- package/dist/list.d.ts +17 -2
- package/dist/list.js +1 -1
- package/dist/lucide-icon.d.ts +9 -1
- package/dist/lucide-icon.js +1 -1
- package/dist/{composer.d.ts → message-composer.d.ts} +20 -12
- package/dist/message-composer.js +6 -0
- package/dist/message-composer.js.map +1 -0
- package/dist/nav-stack.js +1 -1
- package/dist/pane.d.ts +36 -3
- package/dist/pane.js +1 -1
- package/dist/popup-menu-register.d.ts +6 -5
- package/dist/popup-menu-register.js +3 -326
- package/dist/popup-menu-register.js.map +1 -1
- package/dist/popup-menu.d.ts +41 -23
- package/dist/popup-menu.js +5 -1
- 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/row.js +1 -1
- package/dist/{token-search-model-aYR0YAei.d.ts → search-field-CrGTN5sa.d.ts} +67 -43
- 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/select-register.d.ts +6 -3
- package/dist/select-register.js +383 -241
- package/dist/select-register.js.map +1 -1
- package/dist/select.d.ts +30 -6
- package/dist/select.js +3 -1
- package/dist/selection.d.ts +54 -0
- package/dist/selection.js +3 -0
- package/dist/selection.js.map +1 -0
- package/dist/slider.d.ts +74 -0
- package/dist/slider.js +103 -0
- package/dist/slider.js.map +1 -0
- package/dist/split-button.js +1 -1
- package/dist/split-view.d.ts +5 -2
- package/dist/split-view.js +18 -159
- package/dist/split-view.js.map +1 -1
- package/dist/state-banner.js +1 -1
- package/dist/styles/badge.css +18 -6
- package/dist/styles/button.css +230 -0
- package/dist/styles/catalog/components/catalog-example.css +13 -4
- package/dist/styles/checkbox.css +121 -0
- package/dist/styles/choice-chips.css +58 -7
- package/dist/styles/color-field.css +125 -0
- package/dist/styles/color-picker.css +331 -0
- package/dist/styles/color-swatches.css +122 -0
- package/dist/styles/combobox.css +7 -5
- package/dist/styles/components/actions/button/button.css +230 -0
- package/dist/styles/components/actions/popup-menu/popup-menu.css +326 -198
- package/dist/styles/components/actions/toolbar/toolbar.css +25 -3
- package/dist/styles/components/actions/toolbar-control-group/toolbar-control-group.css +67 -104
- package/dist/styles/components/actions/toolbar-text/toolbar-text.css +5 -18
- package/dist/styles/components/collections/list/list.css +37 -0
- package/dist/styles/components/feedback/badge/badge.css +18 -6
- 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/state-banner/state-banner.css +18 -3
- package/dist/styles/components/forms/checkbox/checkbox.css +121 -0
- package/dist/styles/components/forms/choice-chips/choice-chips.css +58 -7
- package/dist/styles/components/forms/color-field/color-field.css +125 -0
- package/dist/styles/components/forms/color-picker/color-picker.css +331 -0
- package/dist/styles/components/forms/color-swatches/color-swatches.css +122 -0
- package/dist/styles/components/forms/combobox/combobox.css +7 -5
- package/dist/styles/components/forms/{composer/composer.css → message-composer/message-composer.css} +17 -33
- package/dist/styles/components/forms/radio-group/radio-group.css +156 -0
- package/dist/styles/{token-search-field.css → components/forms/search-field/search-field.css} +111 -102
- package/dist/styles/components/forms/select/select.css +370 -249
- 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/pane/pane.css +254 -0
- package/dist/styles/components/layout/resizable-region/resizable-region.css +3 -2
- package/dist/styles/components/layout/row/row.css +11 -0
- package/dist/styles/components/layout/split-view/split-view.css +25 -0
- package/dist/styles/components/layout/workbench/workbench.css +12 -4
- package/dist/styles/components/navigation/disclosure-arrow/disclosure-arrow.css +20 -0
- package/dist/styles/components/navigation/tab-bar/tab-bar.css +7 -7
- package/dist/styles/components/navigation/{app-tab/app-tab.css → tab-bar-item/tab-bar-item.css} +95 -90
- package/dist/styles/components/surfaces/disclosure/disclosure.css +98 -0
- package/dist/styles/components/surfaces/surface-scaffold/surface-scaffold.css +263 -116
- package/dist/styles/components/typography/text/text.css +14 -12
- package/dist/styles/disclosure-arrow.css +20 -0
- package/dist/styles/disclosure.css +98 -0
- package/dist/styles/foundation.css +6 -4
- package/dist/styles/list-detail-dialog.css +11 -0
- package/dist/styles/list.css +37 -0
- package/dist/styles/{composer.css → message-composer.css} +17 -33
- package/dist/styles/overlay-toast.css +149 -0
- package/dist/styles/overlay-tooltip.css +55 -0
- package/dist/styles/pane.css +254 -0
- package/dist/styles/popup-menu.css +326 -198
- package/dist/styles/progress-bar.css +168 -0
- package/dist/styles/progress-ring.css +91 -0
- package/dist/styles/radio-group.css +156 -0
- package/dist/styles/resizable-region.css +3 -2
- package/dist/styles/row.css +11 -0
- package/dist/styles/{components/forms/token-search-field/token-search-field.css → search-field.css} +111 -102
- package/dist/styles/select.css +370 -249
- package/dist/styles/slider.css +241 -0
- package/dist/styles/split-view.css +25 -0
- package/dist/styles/state-banner.css +18 -3
- package/dist/styles/styles.css +16 -5
- package/dist/styles/surface-scaffold.css +263 -116
- package/dist/styles/switch.css +132 -0
- package/dist/styles/{app-tab.css → tab-bar-item.css} +95 -90
- package/dist/styles/tab-bar.css +7 -7
- package/dist/styles/tag-field.css +8 -0
- package/dist/styles/text-field.css +193 -0
- package/dist/styles/text.css +14 -12
- package/dist/styles/toolbar-control-group.css +67 -104
- package/dist/styles/toolbar-text.css +5 -18
- package/dist/styles/toolbar.css +25 -3
- package/dist/styles/webawesome.css +9 -0
- package/dist/styles/workbench-dialog.css +10 -0
- package/dist/styles/workbench.css +12 -4
- package/dist/surface-scaffold-register.d.ts +7 -5
- package/dist/surface-scaffold-register.js +2 -246
- package/dist/surface-scaffold-register.js.map +1 -1
- package/dist/surface-scaffold.d.ts +70 -7
- package/dist/surface-scaffold.js +5 -1
- package/dist/switch.d.ts +38 -0
- package/dist/switch.js +4 -0
- package/dist/switch.js.map +1 -0
- package/dist/{app-tab.d.ts → tab-bar-item.d.ts} +11 -11
- package/dist/tab-bar-item.js +6 -0
- package/dist/tab-bar-item.js.map +1 -0
- package/dist/tab-bar.d.ts +3 -3
- package/dist/tab-bar.js +1 -1
- package/dist/tab-navigator.js +1 -1
- 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 +83 -0
- package/dist/text-field.js +6 -0
- package/dist/text-field.js.map +1 -0
- package/dist/text.d.ts +6 -1
- package/dist/text.js +1 -1
- package/dist/{types-CVgIwSdq.d.ts → types-DmHWkSd6.d.ts} +19 -1
- package/dist/webawesome.d.ts +3 -0
- package/dist/wire-catalog.d.ts +8 -2
- package/dist/wire-catalog.js +16 -4
- 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-composers.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-token-search-fields.js.map → wire-choice-chips.js.map} +1 -1
- 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 +34 -0
- package/dist/wire-color-pickers.js +9 -0
- package/dist/wire-color-pickers.js.map +1 -0
- package/dist/wire-comboboxes.js +2 -1
- package/dist/wire-content-items.d.ts +5 -1
- package/dist/wire-content-items.js +84 -15
- package/dist/wire-content-items.js.map +1 -1
- package/dist/wire-file-pickers.d.ts +3 -2
- package/dist/wire-file-pickers.js +1 -1
- package/dist/{wire-composers.d.ts → wire-message-composers.d.ts} +5 -4
- package/dist/wire-message-composers.js +3 -0
- package/dist/wire-message-composers.js.map +1 -0
- package/dist/wire-overlay-sheets.js +1 -1
- 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-token-search-fields.d.ts → wire-search-fields.d.ts} +25 -25
- package/dist/wire-search-fields.js +6 -0
- package/dist/wire-search-fields.js.map +1 -0
- 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.js +1 -1
- 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/workbench-dialog.d.ts +97 -0
- package/dist/workbench-dialog.js +124 -0
- package/dist/workbench-dialog.js.map +1 -0
- package/dist/workbench.d.ts +5 -0
- package/dist/workbench.js +1 -1
- package/docs/accessibility.md +181 -97
- package/docs/anchored-surface.md +8 -7
- package/docs/app-layouts.md +28 -0
- package/docs/catalog.md +14 -5
- package/docs/color-field.md +65 -0
- package/docs/color-picker.md +71 -0
- package/docs/color-swatches.md +46 -0
- package/docs/component-contract.md +31 -32
- package/docs/component-selection.md +232 -165
- package/docs/design/templates/button/emphasis-dark.svg +1 -0
- package/docs/design/templates/button/emphasis.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.svg +1 -0
- package/docs/design/templates/choice-chips/color-palette-dark.svg +1 -1
- package/docs/design/templates/choice-chips/color-palette.svg +1 -1
- package/docs/design/templates/choice-chips/compact-icons-dark.svg +1 -1
- package/docs/design/templates/choice-chips/compact-icons.svg +1 -1
- package/docs/design/templates/choice-chips/multiple-dark.svg +1 -1
- package/docs/design/templates/choice-chips/multiple.svg +1 -1
- package/docs/design/templates/choice-chips-dark.svg +1 -1
- package/docs/design/templates/choice-chips.svg +1 -1
- 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/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/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/list-header/size-l-dark.svg +1 -1
- package/docs/design/templates/list-header/size-l.svg +1 -1
- package/docs/design/templates/list-header/size-m-dark.svg +1 -1
- package/docs/design/templates/list-header/size-m.svg +1 -1
- package/docs/design/templates/list-header/size-xl-dark.svg +1 -1
- package/docs/design/templates/list-header/size-xl.svg +1 -1
- package/docs/design/templates/list-header-dark.svg +1 -1
- package/docs/design/templates/list-header.svg +1 -1
- 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/{composer → message-composer}/prompt-dark.svg +1 -1
- package/docs/design/templates/{composer → message-composer}/prompt.svg +1 -1
- 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/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 -1
- package/docs/design/templates/segmented-control.svg +1 -1
- 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/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/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/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/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 -1
- package/docs/design/templates/toolbar/width-visibility-320.svg +1 -1
- package/docs/design/templates/toolbar/width-visibility-600-dark.svg +1 -1
- package/docs/design/templates/toolbar/width-visibility-600.svg +1 -1
- package/docs/design/templates/toolbar-dark.svg +1 -1
- package/docs/design/templates/toolbar.svg +1 -1
- package/docs/design/templates/value-table/details-dark.svg +1 -1
- package/docs/design/templates/value-table/details.svg +1 -1
- package/docs/design/templates/value-table-dark.svg +1 -1
- package/docs/design/templates/value-table.svg +1 -1
- package/docs/design/templates.md +19 -6
- package/docs/design-philosophy.md +6 -6
- package/docs/disclosure.md +63 -0
- package/docs/examples/component-catalog-extension.json +2 -2
- package/docs/layout.md +16 -7
- package/docs/list-detail-dialog.md +96 -0
- package/docs/manual-test-plan.md +1 -1
- package/docs/{composer.md → message-composer.md} +41 -28
- package/docs/overlay-toast.md +62 -0
- package/docs/overlay-tooltip.md +53 -0
- package/docs/progress.md +62 -0
- package/docs/recipes.md +15 -21
- package/docs/slider.md +64 -0
- package/docs/surface-scaffold.md +155 -88
- package/docs/tag-field.md +66 -0
- package/docs/type-contracts.md +8 -8
- package/docs/ui-analyzer.md +1 -1
- package/docs/ui-doctor.md +11 -6
- package/docs/ux-demo.md +6 -6
- package/docs/webawesome-migration.md +80 -0
- package/docs/webawesome-theme.md +57 -35
- package/docs/workbench-dialog.md +85 -0
- package/docs/workbench.md +10 -6
- package/docs/writing.md +10 -8
- package/doctor/copy-capitalization-checks.mjs +18 -9
- package/llms.txt +131 -57
- package/package.json +156 -39
- package/ux-demo/recipes/composer-form.tsx +18 -19
- package/ux-demo/recipes/list-detail-dialog.tsx +55 -162
- package/ux-demo/recipes/mount-recipe.ts +7 -6
- package/ux-demo/recipes/types.ts +1 -0
- package/ai/components/icon-button.md +0 -82
- package/ai/components/icon-toggle-button.md +0 -80
- package/ai/components/token-search-field.md +0 -107
- package/dist/app-tab.js +0 -6
- package/dist/app-tab.js.map +0 -1
- package/dist/browser/app-tab.js +0 -4
- package/dist/browser/composer.js +0 -4
- package/dist/browser/icon-toggle-button.js +0 -4
- package/dist/browser/token-search-field.js +0 -4
- package/dist/chunk-2MSPNRWJ.js.map +0 -1
- package/dist/chunk-7IUEBNCO.js.map +0 -1
- package/dist/chunk-AV7CPAPT.js +0 -82
- package/dist/chunk-AV7CPAPT.js.map +0 -1
- package/dist/chunk-BYFTHA4I.js.map +0 -1
- package/dist/chunk-CA7LNX3J.js +0 -44
- package/dist/chunk-CA7LNX3J.js.map +0 -1
- package/dist/chunk-ELCMSQNJ.js.map +0 -1
- package/dist/chunk-ETCWQLJV.js.map +0 -1
- package/dist/chunk-FDZNYD4C.js.map +0 -1
- package/dist/chunk-FR76ZJQC.js +0 -90
- package/dist/chunk-FR76ZJQC.js.map +0 -1
- package/dist/chunk-HQZYKJ56.js.map +0 -1
- package/dist/chunk-HZPHCSCS.js.map +0 -1
- package/dist/chunk-IM3GKYOG.js.map +0 -1
- package/dist/chunk-JOR5LGYE.js.map +0 -1
- package/dist/chunk-K4AT3V3J.js.map +0 -1
- package/dist/chunk-LL45C7BB.js.map +0 -1
- package/dist/chunk-LOSRXZAH.js.map +0 -1
- package/dist/chunk-LPHU44S3.js.map +0 -1
- package/dist/chunk-M5KZ26VV.js.map +0 -1
- package/dist/chunk-MF6ZUUJZ.js.map +0 -1
- package/dist/chunk-MXNIVEVL.js.map +0 -1
- package/dist/chunk-NS762OVM.js +0 -222
- package/dist/chunk-NS762OVM.js.map +0 -1
- package/dist/chunk-PKL6QJKK.js.map +0 -1
- package/dist/chunk-QTSMHH5J.js.map +0 -1
- package/dist/chunk-TDMHA7C3.js.map +0 -1
- package/dist/chunk-TGLUDQP2.js.map +0 -1
- package/dist/chunk-U6QYTMDB.js.map +0 -1
- package/dist/chunk-VFYO3UGZ.js +0 -45
- package/dist/chunk-VFYO3UGZ.js.map +0 -1
- package/dist/chunk-W4IK7AWD.js.map +0 -1
- package/dist/chunk-YBWQR2OK.js.map +0 -1
- package/dist/composer.js +0 -5
- package/dist/composer.js.map +0 -1
- package/dist/icon-button.d.ts +0 -46
- package/dist/icon-button.js +0 -6
- package/dist/icon-button.js.map +0 -1
- package/dist/icon-toggle-button.d.ts +0 -42
- package/dist/icon-toggle-button.js +0 -6
- package/dist/icon-toggle-button.js.map +0 -1
- package/dist/styles/components/actions/icon-button/icon-button.css +0 -22
- package/dist/styles/components/actions/icon-toggle-button/icon-toggle-button.css +0 -83
- package/dist/styles/icon-button.css +0 -22
- package/dist/styles/icon-toggle-button.css +0 -83
- package/dist/token-search-field.d.ts +0 -3
- package/dist/token-search-field.js +0 -5
- package/dist/token-search-field.js.map +0 -1
- package/dist/token-search-model.d.ts +0 -3
- package/dist/token-search-model.js +0 -3
- package/dist/token-search-model.js.map +0 -1
- package/dist/wire-composers.js +0 -3
- package/dist/wire-token-search-fields.js +0 -6
- package/docs/design/templates/composer/chat-dark.svg +0 -1
- package/docs/design/templates/composer/chat.svg +0 -1
- package/docs/design/templates/composer-dark.svg +0 -1
- package/docs/design/templates/composer.svg +0 -1
- /package/docs/design/templates/{token-search-field → search-field}/empty-dark.svg +0 -0
- /package/docs/design/templates/{token-search-field → search-field}/empty.svg +0 -0
- /package/docs/design/templates/{token-search-field → search-field}/tokens-dark.svg +0 -0
- /package/docs/design/templates/{token-search-field → search-field}/tokens.svg +0 -0
- /package/docs/design/templates/{token-search-field-dark.svg → search-field-dark.svg} +0 -0
- /package/docs/design/templates/{token-search-field.svg → search-field.svg} +0 -0
package/llms.txt
CHANGED
|
@@ -231,18 +231,21 @@ title-style labels as `KUI-D040`. See
|
|
|
231
231
|
|
|
232
232
|
## Core rules (do the right thing)
|
|
233
233
|
|
|
234
|
-
- **Prefer a Kerf UI component
|
|
235
|
-
|
|
236
|
-
Awesome element (`wa-
|
|
237
|
-
`wa-
|
|
238
|
-
|
|
239
|
-
`
|
|
234
|
+
- **Prefer a Kerf UI component, then a native HTML element**, using each for
|
|
235
|
+
what it is good at. Kerf UI needs no Web Awesome; it is an optional
|
|
236
|
+
integration. Never render a `Discouraged` Web Awesome element (`wa-button`,
|
|
237
|
+
`wa-input`, `wa-checkbox`, `wa-select`, `wa-dropdown`, `wa-dialog`,
|
|
238
|
+
`wa-tab-group`, `wa-icon`, …); use the Kerf component that replaces it
|
|
239
|
+
(`Button`, `TextField`, `Checkbox`, `Select`, `PopupMenu`, `DialogSurface`,
|
|
240
|
+
`TabBar`, `LucideIcon`; see
|
|
241
|
+
[webawesome-migration.md](./docs/webawesome-migration.md)), and file a
|
|
242
|
+
component gap rather than dropping to the raw tag.
|
|
240
243
|
- **Reach for the primitive, not for CSS.** The package is built to look right
|
|
241
244
|
without an application customization layer. Before adding `padding`, `margin`,
|
|
242
245
|
`width`, `height`, `border`, `background`, a wrapper card, or a decoration,
|
|
243
246
|
check whether the component, pane, or content-item already owns it. Prefer a
|
|
244
247
|
component prop — `FloatingToolbar inset`, `DisclosureArrow size`, `ListHeader
|
|
245
|
-
headingLevel`, `
|
|
248
|
+
headingLevel`, `SearchField clearIcon`, `ContentItem frame="framed"` for a
|
|
246
249
|
visibly bounded content item — over overriding its `--kui-*` token. CSS for genuinely new structure
|
|
247
250
|
belongs to the application-owned component that renders it and must not select
|
|
248
251
|
nested Kerf or Web Awesome components.
|
|
@@ -270,8 +273,8 @@ headingLevel`, `TokenSearchField clearIcon`, `ContentItem frame="framed"` for a
|
|
|
270
273
|
copy; `ValueTable density="compact"` reduces row spacing,
|
|
271
274
|
with public row column, padding, and gap tokens for specific metadata layouts.
|
|
272
275
|
`ToolbarText size="xsmall"` suits a dense rail heading. The
|
|
273
|
-
`
|
|
274
|
-
set with `--kui-
|
|
276
|
+
`SearchField` editor shrinks in narrow groups; its minimum width can be
|
|
277
|
+
set with `--kui-search-field-editor-min-width`.
|
|
275
278
|
- **Label read-only field previews.** Use `FieldLabel` from `@kerfjs/ui/text`
|
|
276
279
|
in `ListInsetControl sides="trl"` above a `ContentItem` value. Connect its
|
|
277
280
|
id to the preview group's `aria-labelledby`; use the live control's own
|
|
@@ -367,7 +370,11 @@ headingLevel`, `TokenSearchField clearIcon`, `ContentItem frame="framed"` for a
|
|
|
367
370
|
standard 17px text and 8px control inset; text wins on overlap.
|
|
368
371
|
For selectable document tiles, use `selectionMode="multiple"` and a required
|
|
369
372
|
`ariaLabel`, with `ContentItem selectionMode="multiple"` children. Wire
|
|
370
|
-
`wireContentItems` for spatial arrow navigation
|
|
373
|
+
`wireContentItems` for spatial arrow navigation, Enter/Space activation, and
|
|
374
|
+
one roving Tab stop per grid; a non-selectable row between them is a
|
|
375
|
+
`ContentItem gridRow` (row + gridcell, no selection).
|
|
376
|
+
Resolve each activation with `applySelection` and `selectionGesture` from
|
|
377
|
+
`@kerfjs/ui/selection` (plain replaces, Cmd/Ctrl toggles, Shift extends).
|
|
371
378
|
- **Give a layout root `fill`, not a frame `Pane`.** A Row, List, or Grid that
|
|
372
379
|
is the sole layout root of a definite-height parent takes its full height
|
|
373
380
|
with `fill` and carries safe `data-*` markers through `rootAttributes`.
|
|
@@ -416,7 +423,7 @@ headingLevel`, `TokenSearchField clearIcon`, `ContentItem frame="framed"` for a
|
|
|
416
423
|
or clear the value through ordinary change events. The app owns the updated
|
|
417
424
|
controlled value and localized action labels.
|
|
418
425
|
Icon-only Selects (single or multiple) and icon-only `PopupMenu`s show an
|
|
419
|
-
`aria-hidden`
|
|
426
|
+
`aria-hidden` help tag repeating that name (and a Select's
|
|
420
427
|
choice) on hover and keyboard focus, hidden while the popup is open; the
|
|
421
428
|
register import installs it, so do not add a `title` or tooltip of your own.
|
|
422
429
|
The same installer tags an icon-only `<button>` or link inside a
|
|
@@ -437,7 +444,7 @@ headingLevel`, `TokenSearchField clearIcon`, `ContentItem frame="framed"` for a
|
|
|
437
444
|
- **Make room for an expanded search instead of growing it past what fits.** A
|
|
438
445
|
collapsible search group grows into the space beside its sibling groups; if
|
|
439
446
|
that space is too small, the siblings wrap onto a new row while it opens.
|
|
440
|
-
Size the expanded search to what fits (`--kui-
|
|
447
|
+
Size the expanded search to what fits (`--kui-search-field-expanded-width`,
|
|
441
448
|
or `sizing="grow"` with a `growBasis` that fits), and if a useful search
|
|
442
449
|
cannot fit beside the other controls, set aside those controls while the
|
|
443
450
|
search is open: mark them `visibility="yield-to-expanded-sibling"` (they
|
|
@@ -447,10 +454,10 @@ headingLevel`, `TokenSearchField clearIcon`, `ContentItem frame="framed"` for a
|
|
|
447
454
|
- **Toolbars hold only `ToolbarText` and `ToolbarControlGroup`.** Never put a bare
|
|
448
455
|
button, input, link, or loose markup in a `leading`/`center`/`trailing` zone.
|
|
449
456
|
Wrap every control — `SegmentedControl`, `Select`, a collapsible
|
|
450
|
-
`
|
|
457
|
+
`SearchField`, Web Awesome controls — inside a `ToolbarControlGroup`. For an
|
|
451
458
|
ordinary icon/action control inside the group use a **plain `<button>`** (the
|
|
452
|
-
group styles it fully) — that is the default;
|
|
453
|
-
|
|
459
|
+
group styles it fully) — that is the default; a standalone `Button` belongs
|
|
460
|
+
outside a group. A toolbar popup menu is a `PopupMenu`
|
|
454
461
|
(`@kerfjs/ui/popup-menu`, registered once via `@kerfjs/ui/popup-menu/register`)
|
|
455
462
|
in a `single` `ToolbarControlGroup` with `nestedDropdown`; never hand-write
|
|
456
463
|
`wa-dropdown` markup for a menu. Let the group size the trigger from its icon,
|
|
@@ -459,6 +466,9 @@ headingLevel`, `TokenSearchField clearIcon`, `ContentItem frame="framed"` for a
|
|
|
459
466
|
row, as in the catalog resource footer. `PopupMenu` items also support nested `submenu`
|
|
460
467
|
actions, headings, dividers, checked or trailing choice marks, danger tone,
|
|
461
468
|
and disabled reasons; nested headings/dividers stay out of keyboard choices;
|
|
469
|
+
a choice dispatches its `data-action` plus a bubbling `kui-menu-select` event whose
|
|
470
|
+
`detail.checked` is the state a checkbox choice asks for (the app owns and
|
|
471
|
+
renders that state);
|
|
462
472
|
use `context` with `anchor` + `openPopupMenu` (or `openPopupMenuAt`) and
|
|
463
473
|
`closePopupMenu` for pointer-anchored row menus; the menu owns its
|
|
464
474
|
zero-footprint anchor host, so add no wrapper or CSS. `openPopupMenuAt`
|
|
@@ -503,7 +513,7 @@ headingLevel`, `TokenSearchField clearIcon`, `ContentItem frame="framed"` for a
|
|
|
503
513
|
`ToolbarControlGroup` `material="glass"` paints a group that floats over imagery or a clear (transparent) toolbar on the translucent chrome material (`--kui-chrome-material` with the blur/saturate `--kui-chrome-material-filter`), with a specular edge in place of the gray border and a soft shadow. Its controls take `--kui-color-text`, so they stay at AA over any content; a raised or outline selection paints an opaque surface pill. The fill turns opaque under reduced transparency, increased contrast, static effects (`update: slow` or `:root[data-kui-effects="static"]`), or without backdrop-filter support, and paints Canvas/CanvasText in forced colors. A `tone="dark"` glass group keeps its loud fill and gains the blur and edge; a borderless group has no surface and ignores the material. Keep the solid default on an opaque toolbar, and never add your own `backdrop-filter` or translucent background to a group.
|
|
504
514
|
`ListItem`, `ListItemLink`, and `ListActionRow` take `iconTile` to present their leading `icon` in a filled 32px rounded tile holding an 18px glyph, for settings or command rows that identify each entry by color. Pass a tone (`neutral`, `brand`, `success`, `warning`, or `danger`) for the same quiet fill, matching quiet border, and on-quiet foreground as `ToolbarControlGroup.tileTone`, or `{ color, foreground? }` for an application color: `color` is a `CssColor` (`uiColor()`, `colorVar()`, or `fillColor('#e5484d')`) and `foreground` a `CssForegroundColor`; without one, the glyph is black or white, whichever contrasts with the fill. The tile sits 6px clear of a standard 44px row (a compact row is at least 42px tall), moves the label to the tile's edge, and keeps its colors when the row is hovered or selected. Never wrap the icon in your own tile or resize the row's icon slot.
|
|
505
515
|
Toolbar zones accept `KerfUiContent` directly. Use `ToolbarText` for identity and `ToolbarControlGroup` for related controls that need its shared chrome; a bare control keeps its own styling and accessibility responsibilities.
|
|
506
|
-
Expanded search groups accept `expandedOverflow="visible"` to anchor app-owned suggestion/date/help surfaces below their relative root; collapsed/default groups retain existing clipping. Apps own surface placement/dismissal and use `data-
|
|
516
|
+
Expanded search groups accept `expandedOverflow="visible"` to anchor app-owned suggestion/date/help surfaces below their relative root; collapsed/default groups retain existing clipping. Apps own surface placement/dismissal and use `data-search-field-keep-open` or `collapsible.keepOpenOn` for focus.
|
|
507
517
|
|
|
508
518
|
- **Space by the five-step scale, by relationship not by eye.** `0`
|
|
509
519
|
`--kui-space-none`, `4px` `--kui-space-2xs`, `8px` `--kui-space-xs` (inside a
|
|
@@ -596,9 +606,9 @@ headingLevel`, `TokenSearchField clearIcon`, `ContentItem frame="framed"` for a
|
|
|
596
606
|
`TabBar trailingPlacement="adjacent"`, put the local action in `trailing`, and
|
|
597
607
|
the workspace action in `end`; the component keeps both visible while its tab
|
|
598
608
|
list shrinks and scrolls, without application descendant CSS. Each action
|
|
599
|
-
zone accepts one ToolbarControlGroup or a standalone `
|
|
600
|
-
|
|
601
|
-
|
|
609
|
+
zone accepts one ToolbarControlGroup or a standalone `Button` for its own
|
|
610
|
+
chrome. Managed
|
|
611
|
+
SearchField clear also preserves open state and replacement
|
|
602
612
|
editor focus before the next input task, so shortcut-letter typing stays in search.
|
|
603
613
|
Select All deletion does the same; deletion
|
|
604
614
|
restoration finishes before the next keystroke rather than on a delayed frame.
|
|
@@ -610,13 +620,17 @@ headingLevel`, `TokenSearchField clearIcon`, `ContentItem frame="framed"` for a
|
|
|
610
620
|
A sibling helper can call `model.commit(value)` for the active `name:` prefix
|
|
611
621
|
even when that value is not suggested; invalid values and missing prefixes
|
|
612
622
|
leave state unchanged.
|
|
613
|
-
|
|
623
|
+
A managed field subscribes the host render only to `model.structure`
|
|
624
|
+
(committed tokens, empty or non-empty text, editor revision), so typing plain
|
|
625
|
+
text never re-runs it; in the host's own render read `model.state.peek()` and
|
|
626
|
+
bind `model.result` as a signal hole instead of reading `model.state.value`.
|
|
627
|
+
The one richer case is `wireSearchFields`, which manages the
|
|
614
628
|
collapsible field's expand/collapse/focus by default (on, per-behavior opt-out) and
|
|
615
629
|
exposes the `expanded` signal on its handle — bind it in render or hand in your own
|
|
616
630
|
via `collapsible.signals`. Do not hand-roll open/collapse/focus that helper
|
|
617
631
|
provides; but do keep a plain disclosure toggle (a one-line boolean the app already
|
|
618
632
|
renders from) in the app. For real-app composition it also offers a focusout
|
|
619
|
-
keep-open exception (`data-
|
|
633
|
+
keep-open exception (`data-search-field-keep-open` regions or `collapsible.keepOpenOn`,
|
|
620
634
|
so a sibling suggestions/date popover does not collapse an empty field), opt-in
|
|
621
635
|
atomic-chip keyboard (`keyboard`: Backspace/Delete remove the adjacent chip via
|
|
622
636
|
`onRemoveToken`, ArrowRight moves the caret past a trailing chip), and an
|
|
@@ -629,15 +643,15 @@ headingLevel`, `TokenSearchField clearIcon`, `ContentItem frame="framed"` for a
|
|
|
629
643
|
- **Placeholder loading state, don't rebuild it.** For a value or component that is
|
|
630
644
|
still loading, set `placeholder` on the component (`Select`, `ListHeader`,
|
|
631
645
|
`ListItem`, `ValueTableRow`, `SegmentedControl`, `StateBanner`,
|
|
632
|
-
`
|
|
646
|
+
`TabBarItem`, `ToolbarText`, `ListActionRow`): it renders its real chrome with value
|
|
633
647
|
slots as subtle **unanimated** skeleton blocks and interactivity disabled. Only
|
|
634
648
|
unknown values change: a placeholder is never dimmed or styled as disabled (a
|
|
635
649
|
control you disabled keeps its live disabled tone), so a parent composes a
|
|
636
650
|
faithful loading view (e.g. an inspector) without hand-rebuilding markup.
|
|
637
651
|
Component-drawn chrome stays live: a `ListItem` or `ListActionRow` keeps its
|
|
638
652
|
`busy` spinner while its `status` (and a `ListItem`'s `trailing`) content
|
|
639
|
-
become skeletons. Use the standalone `Skeleton` for a custom slot. Prefer it over `wa-skeleton
|
|
640
|
-
|
|
653
|
+
become skeletons. Use the standalone `Skeleton` for a custom slot. Prefer it over `wa-skeleton`,
|
|
654
|
+
and never animate it — use
|
|
641
655
|
`LoadingSpinner` for known busy activity instead. Set its `size` prop to a
|
|
642
656
|
named icon step or positive pixel number when the inherited 1em is unsuitable.
|
|
643
657
|
- **Keep ListItem content inside the row.** The rounded `ListItem` root clips
|
|
@@ -664,11 +678,11 @@ headingLevel`, `TokenSearchField clearIcon`, `ContentItem frame="framed"` for a
|
|
|
664
678
|
fill with a native primary button and an options trigger (`aria-expanded`,
|
|
665
679
|
`aria-haspopup`); `tone`, `fill`, `busy`, and `disabled` are props. Never
|
|
666
680
|
build one from `wa-button-group` or app CSS on native buttons.
|
|
667
|
-
- **
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
button to
|
|
681
|
+
- **Make any `Button` a toggle with `pressed`.** In content or a pane footer,
|
|
682
|
+
`<Button icon={…} ariaLabel="Show Conversation" emphasis="plain" pressed={open} action="toggle-chat" />`
|
|
683
|
+
renders a native `aria-pressed` button whose pressed look draws on top of
|
|
684
|
+
its tone and emphasis; the app flips the state. Never wrap a
|
|
685
|
+
`ToolbarControlGroup` outside a toolbar or restyle a button to fake it.
|
|
672
686
|
- **Let an icon-state toggle skip selected chrome.** When a pressed toggle's
|
|
673
687
|
glyph already shows its state (an empty or filled star), set
|
|
674
688
|
`data-selected-chrome="none"` on that button, or `selectedChrome="none"` on
|
|
@@ -693,14 +707,31 @@ headingLevel`, `TokenSearchField clearIcon`, `ContentItem frame="framed"` for a
|
|
|
693
707
|
that keeps the first and last rows' focus rings inside the clip, and the
|
|
694
708
|
typed `CssLength` bounds need no flex-column ancestor. Never wrap a List in
|
|
695
709
|
an app div with `max-height`, `overflow`, and a border.
|
|
696
|
-
- **
|
|
697
|
-
`
|
|
698
|
-
`
|
|
699
|
-
|
|
700
|
-
|
|
710
|
+
- **Use `Button` for every standalone action, icon-only included.**
|
|
711
|
+
`Button` (`@kerfjs/ui/button`) is a native button in a `tone` (`neutral`,
|
|
712
|
+
`brand`, `danger`) and an `emphasis` (`primary`, `secondary`, `plain`), at
|
|
713
|
+
the 44px control height or `size="compact"`, with an optional `icon`,
|
|
714
|
+
`loading`, `href`, form `type`, `shape` (`rounded` or `pill`), and `pressed`
|
|
715
|
+
for a toggle. With an `icon` and `ariaLabel` but no label it is an icon-only
|
|
716
|
+
square (a circle as a pill). Inside a `ToolbarControlGroup`
|
|
717
|
+
keep a native `button`; the group owns its geometry.
|
|
701
718
|
- **Paint a strip's surface with `List surface`.** `surface="base"` or
|
|
702
719
|
`"raised"` fills a List and its insets with a solid surface (a banner strip
|
|
703
720
|
above a sunken work area); never wrap it in app CSS that sets a background.
|
|
721
|
+
- **Use `TextField` for free text.** `@kerfjs/ui/text-field` is a native
|
|
722
|
+
input in one labeled box: `label` (or `ariaLabel`), `hint`, and `error` (its
|
|
723
|
+
description; an error marks it invalid), an optional `icon` and `clearable`
|
|
724
|
+
button, `multiline` with `rows` and a growing `maxRows`, and `maxLength` with
|
|
725
|
+
`showCount`, at the 44px height or `size="compact"`. Call
|
|
726
|
+
`wireTextFields(root)` (`@kerfjs/ui/wire-text-fields`) once for clearing and
|
|
727
|
+
counting. Never render `wa-input` or `wa-textarea` for a form field.
|
|
728
|
+
- **Use `Checkbox`, `RadioGroup`, and `Switch` for native toggles.**
|
|
729
|
+
`@kerfjs/ui/checkbox` (with `indeterminate` and `wireCheckboxes(root)` from
|
|
730
|
+
`@kerfjs/ui/wire-checkboxes`), `@kerfjs/ui/radio-group` (`label`, `name`,
|
|
731
|
+
`choices`, `value`; one Tab stop, arrow keys), and `@kerfjs/ui/switch`
|
|
732
|
+
(`role="switch"`, only for a setting that applies immediately) draw Kerf
|
|
733
|
+
boxes over native inputs with hint and error text. Never render
|
|
734
|
+
`wa-checkbox`, `wa-radio-group`, or `wa-switch`.
|
|
704
735
|
- **Use `Combobox` to pick or create a value by typing.** A themed native
|
|
705
736
|
input on the ARIA combobox pattern with filtered suggestions and an optional
|
|
706
737
|
create option; `wireComboboxes(root, { onCommit })` reports `{ id, value,
|
|
@@ -727,24 +758,59 @@ created, input }`. Never use a hand-styled `<input list>` + `<datalist>`.
|
|
|
727
758
|
`wireCornerStatus` once: a top-layer manual popover at a safe-area-aware
|
|
728
759
|
corner, with no close button, light dismiss, Escape, or focus change. Never
|
|
729
760
|
position a banner with fixed-position CSS or hide a toast's close part.
|
|
761
|
+
- **Style transient toasts with `@kerfjs/ui/overlay-toast.css`.** Import it
|
|
762
|
+
once and call `toast()` from `kerfjs/overlay` with `exitClass:
|
|
763
|
+
'kui-toast-exit'` and `exitDuration: 200`: a bottom-edge, safe-area-aware
|
|
764
|
+
stack on the raised surface, `variant` tones, a `StateBanner` as the only
|
|
765
|
+
content, and reduced-motion-aware motion. Never use `wa-toast`.
|
|
766
|
+
- **Style hover tooltips with `@kerfjs/ui/overlay-tooltip.css`.** Import it
|
|
767
|
+
once and call `tooltip(anchor, content)` from `kerfjs/overlay` with
|
|
768
|
+
`exitClass: 'kui-tooltip-exit'` and `exitDuration: 100`: the help tag's look,
|
|
769
|
+
wrapping at 40 characters. Icon-only Kerf controls already get help tags.
|
|
770
|
+
Never use `wa-tooltip`.
|
|
771
|
+
- **Show and hide content with `Disclosure`** (`@kerfjs/ui/disclosure`): a
|
|
772
|
+
native details element with a DisclosureArrow on content-item geometry,
|
|
773
|
+
`plain` / `framed` / `sunken`; Disclosures sharing a `name` form an
|
|
774
|
+
accordion. Never use `wa-details` or `wa-accordion`.
|
|
775
|
+
- **Show progress with `ProgressBar` or `ProgressRing`** (`@kerfjs/ui/progress-bar`,
|
|
776
|
+
`@kerfjs/ui/progress-ring`): `value` of `max` (omit `value` for
|
|
777
|
+
indeterminate), a `label`, `valueText`, tones. Never use `wa-progress-bar` or
|
|
778
|
+
`wa-progress-ring`.
|
|
779
|
+
- **Pick a value on a range with `Slider`** (`@kerfjs/ui/slider`): a native
|
|
780
|
+
range input drawn as a track, fill, and thumb, with `showValue`/`unit`,
|
|
781
|
+
`ticks`, and `hint`; call `wireSliders(root)` once. Never use `wa-slider`.
|
|
782
|
+
- **Collect tags with `TagField`** (`@kerfjs/ui/tag-field`): SearchField's
|
|
783
|
+
token editor as a form field, a hidden input per tag; call
|
|
784
|
+
`wireTagFields(root, { onChange })` and re-render. Never use `wa-tag-input`.
|
|
785
|
+
- **Pick from a fixed palette with `ColorSwatches`** (`@kerfjs/ui/color-swatches`):
|
|
786
|
+
a native radio group of named round swatches, one Tab stop, a ring that
|
|
787
|
+
does not depend on hue, and a `'transparent'` no-color swatch.
|
|
788
|
+
- **Choose any color with `ColorPicker`** (`@kerfjs/ui/color-picker`): an area,
|
|
789
|
+
hue and opacity sliders, RGB/HSL/HSB/Grayscale fields, hex, presets, and
|
|
790
|
+
samples; call `wireColorPickers(root, { onChange })` and re-render.
|
|
791
|
+
- **Put a color in a form with `ColorField`** (`@kerfjs/ui/color-field`): a
|
|
792
|
+
swatch-and-hex trigger that opens a ColorPicker below it; call
|
|
793
|
+
`wireColorFields(root, { onChange, pickers })` and re-render. Never use
|
|
794
|
+
`wa-color-picker`.
|
|
730
795
|
- **Size a Select through its API.** `triggerWidth` chooses `fit-content`,
|
|
731
|
-
`max-content`, or `fill`;
|
|
796
|
+
`max-content`, or `fill`; `maxTriggerWidth`/`minTriggerWidth` bound it under any
|
|
797
|
+
presentation, ellipsizing even `renderSelected` content. For custom
|
|
732
798
|
selected text, use the public color, font-size, and font-weight tokens; the
|
|
733
799
|
closed value ellipsizes when space runs out. `presentation="title"` gives a
|
|
734
800
|
rail view heading a 36px bold, flush-start trigger and adjacent caret;
|
|
735
801
|
`focusRingInset` keeps its ring inside clipping ancestors.
|
|
736
|
-
- **Configure application tabs at their owners.**
|
|
802
|
+
- **Configure application tabs at their owners.** TabBarItem's `icon-only`
|
|
737
803
|
presentation keeps `name` accessible, `labelMaxWidth` ellipsizes a long name,
|
|
738
804
|
`nameOverflow="visible"` shows the full name during inline loading, and
|
|
739
805
|
`dropTarget` highlights a drag-over without changing selection. `attention`
|
|
740
|
-
uses `--kui-
|
|
806
|
+
uses `--kui-tab-bar-item-attention-color`. TabBar's public
|
|
741
807
|
`--kui-tab-bar-strip-*` tokens set compact strip geometry.
|
|
742
808
|
An inspector TabBar uses the shared rounded rectangle radius on its strip
|
|
743
809
|
and inset segmented tabs; an ordinary segmented TabBar keeps pill ends and
|
|
744
810
|
smaller interior tab corners. Configure the presentation instead of
|
|
745
|
-
restyling
|
|
746
|
-
Set `pinned` on the first
|
|
747
|
-
tablist; it remains in keyboard order. Use `--kui-
|
|
811
|
+
restyling TabBarItem.
|
|
812
|
+
Set `pinned` on the first TabBarItem to keep it visible within a scrolling
|
|
813
|
+
tablist; it remains in keyboard order. Use `--kui-tab-bar-item-pinned-background`
|
|
748
814
|
for the surrounding surface and keep that backdrop opaque.
|
|
749
815
|
- **Use `Badge` for compact non-interactive metadata.** Configure its semantic
|
|
750
816
|
tone, appearance, shape, and size instead of creating badge CSS in an app or
|
|
@@ -782,10 +848,14 @@ created, input }`. Never use a hand-styled `<input list>` + `<datalist>`.
|
|
|
782
848
|
the group with `label` or `labelledBy`, lead choices with a `swatch`
|
|
783
849
|
(`CssColor` such as `fillColor('#3b82f6')`, or `'transparent'` for the struck-through no-color dot) or an
|
|
784
850
|
`icon`, and handle the delegated `action` on `change`. Never wrap a
|
|
785
|
-
`SegmentedControl` or button
|
|
786
|
-
`multiple` (with a `readonly Value[]` `value`) when any number may
|
|
787
|
-
|
|
788
|
-
|
|
851
|
+
`SegmentedControl` or a joined button group instead. Set
|
|
852
|
+
`multiple: 'toggle'` (with a `readonly Value[]` `value`) when any number may
|
|
853
|
+
be on and each pill toggles alone: native checkboxes in a `role="group"`,
|
|
854
|
+
each a Tab stop that Space toggles. Set `multiple: true` for the desktop
|
|
855
|
+
multi-select: a listbox where a click selects one, Cmd/Ctrl toggles, Shift
|
|
856
|
+
extends, and hidden inputs submit under `name`; wire it with
|
|
857
|
+
`wireChoiceChips` (`@kerfjs/ui/wire-choice-chips`) and read the set with
|
|
858
|
+
`readChoiceChips`. On dark
|
|
789
859
|
inverse chrome, place the chips in a dark appearance scope (`.wa-dark`)
|
|
790
860
|
instead of restyling them.
|
|
791
861
|
|
|
@@ -801,17 +871,18 @@ created, input }`. Never use a hand-styled `<input list>` + `<datalist>`.
|
|
|
801
871
|
a hard edge (overlay on a solid `fadeTo` band) under reduced transparency. Never hand-roll scroll listeners or
|
|
802
872
|
`background-attachment: fixed`.
|
|
803
873
|
|
|
804
|
-
- **Use `
|
|
874
|
+
- **Use `MessageComposer` for a chat or prompt composer.** `@kerfjs/ui/message-composer`
|
|
805
875
|
renders a raised frame (standard border, large radius, `shadow-l`) whose
|
|
806
876
|
border turns brand while focus is within, a borderless textarea that grows
|
|
807
877
|
between `minRows` (default 1) and `maxRows` (default 8) lines and then
|
|
808
|
-
scrolls, and
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
878
|
+
scrolls, and a compact `Toolbar` action row: optional `leading` controls
|
|
879
|
+
(attach, a model `Select`), an optional quiet `hint`, and `trailing` actions
|
|
880
|
+
(a brand Send `Button`). Name it with a title-style `label`; give it
|
|
881
|
+
an `id` so the hint describes the field. Pass it as a `DialogSurface`'s
|
|
882
|
+
floating `footer` (`footerInset="none"`) over a transcript. Never rebuild
|
|
812
883
|
composer chrome around a `wa-textarea` with app CSS. For Enter-to-send, set
|
|
813
|
-
`submitOnEnter` and call `
|
|
814
|
-
`@kerfjs/ui/wire-composers` once: Enter or Cmd/Ctrl+Enter clicks the first
|
|
884
|
+
`submitOnEnter` and call `wireMessageComposers(root)` from
|
|
885
|
+
`@kerfjs/ui/wire-message-composers` once: Enter or Cmd/Ctrl+Enter clicks the first
|
|
815
886
|
trailing action, Shift+Enter inserts a newline, and an IME composition
|
|
816
887
|
commit or an empty message never sends. Never hand-roll that handler.
|
|
817
888
|
|
|
@@ -819,9 +890,9 @@ created, input }`. Never use a hand-styled `<input list>` + `<datalist>`.
|
|
|
819
890
|
|
|
820
891
|
`Badge`, `LucideIcon`, `DisclosureArrow`, `Toolbar`, `ToolbarControlGroup`, `ToolbarActionLink`, `FloatingToolbar`, `ToolbarText`, `Text`,
|
|
821
892
|
`ListItem`, `ListActionRow` (+ `wireListReorder`, `reorderListItems`), `wireListFocusScroll`, `ListHeader`, `ListInsetControl`,
|
|
822
|
-
`ListInsetText`, `SegmentedControl`, `ChoiceChips`, `
|
|
823
|
-
`Select`, `
|
|
824
|
-
`
|
|
893
|
+
`ListInsetText`, `SegmentedControl`, `ChoiceChips`, `MessageComposer`,
|
|
894
|
+
`Select`, `SearchField` (+ `readSearchField`, `placeSearchFieldCaret`,
|
|
895
|
+
`wireSearchFields`), `TabBarItem`, `TabBar` (+ `wireTabBars`, `reorderTabs`),
|
|
825
896
|
`wireScrollDividers` (scroll-state dividers for every `Pane`, `NavStack`,
|
|
826
897
|
`TabNavigator`, and `TabBar`),
|
|
827
898
|
`ResizableRegion` (+ `wireResizableRegions`), `StateBanner`, `EmptyState`,
|
|
@@ -861,8 +932,11 @@ shell, `@kerfjs/ui/collapsible-panel` (`CollapsiblePanel`, `CollapsiblePanelTogg
|
|
|
861
932
|
- [accessibility.md](./docs/accessibility.md): keyboard and ARIA contracts per component.
|
|
862
933
|
- [recipes.md](./docs/recipes.md): production compositions (app shell, list-detail dialog, composer form, …) as copyable references.
|
|
863
934
|
- [workbench.md](./docs/workbench.md): the `Workbench` multi-panel shell, its collapse policies, and opt-in `resizable` panels driven by `wireWorkbench` (`@kerfjs/ui/wire-workbench`: drag, keyboard, min/max, persistence, compact suspension), the `mainMinSize` / `mainMinHeight` work-area minimums (default 320px wide beside any inline rail, 120px tall above the drawer) that resizable panels stop at and inline panels shrink around, and a panel's `responsiveOverlayAt` (`narrow` / `compact`, rails and the bottom drawer) that presents it as an overlay below a Workbench container breakpoint without a device-class check; a panel given its `collapsed` signal is a transient overlay (collapsed on entering the breakpoint, takes focus and keeps Tab inside while open, closed by Escape or an outside press, focus returned; `dismissOverlays`), and overlays are exclusive by default (opening one closes the others; `exclusiveOverlays: false` opts out).
|
|
935
|
+
- [workbench-dialog.md](./docs/workbench-dialog.md): `WorkbenchDialog`, the modal workbench dialog type: the title, actions, and close control in the work area's toolbar, full-height rails with their own toolbars, and overlay rails on compact devices.
|
|
936
|
+
- [list-detail-dialog.md](./docs/list-detail-dialog.md): `ListDetailDialog`, the modal list-detail dialog type: full-height list and detail columns, the title and close control in the detail column, and a compact full-screen `NavStack` drill-down.
|
|
864
937
|
- [app-layouts.md](./docs/app-layouts.md): choosing `NavStack`/`SplitView`/`Workbench`/`TabNavigator` by data + interaction + device, and dialog presentation, plus the safe-area model (surfaces paint through unsafe areas; content pads only the edges it reaches; `Pane.safeAreaEdges` for app-owned arrangements, `Toolbar.safeAreaEdges` for an app bar or bottom bar at a screen edge).
|
|
865
|
-
- [webawesome-theme.md](./docs/webawesome-theme.md): the optional Web Awesome theme; catalog coverage means themed-and-supported, not preferred
|
|
938
|
+
- [webawesome-theme.md](./docs/webawesome-theme.md): the optional Web Awesome integration theme; catalog coverage means themed-and-supported for integration applications, not preferred. The UX sidebar tags every element a Kerf component replaces as `Discouraged`; Popup remains an available conditional positioning primitive.
|
|
939
|
+
- [webawesome-migration.md](./docs/webawesome-migration.md): moving an application from Web Awesome elements to their Kerf replacements, then removing Web Awesome.
|
|
866
940
|
- [ai/components/README.md](./ai/components/README.md): the generated per-component markdown reference — the assistant entry point over both JSON catalogs.
|
|
867
941
|
- [component-catalog.json](./ai/component-catalog.json) + [component-catalog-extension.schema.json](./ai/component-catalog-extension.schema.json) + [catalog-authoring.json](./ai/catalog-authoring.json) + [public-api-signatures-v1.md](./ai/public-api-signatures-v1.md) + [webawesome-jsx-signatures-v1.md](./ai/webawesome-jsx-signatures-v1.md): machine-readable selection facts, a reusable app-component extension contract, Catalog authoring discovery, and exact signatures.
|
|
868
942
|
- [compile-time-contracts-v1.json](./ai/compile-time-contracts-v1.json) + [type-contracts.md](./docs/type-contracts.md): stable compile diagnostics, packed-declaration proof, migrations, and explicit non-goals.
|
|
@@ -890,8 +964,8 @@ details.
|
|
|
890
964
|
|
|
891
965
|
Select menus use native viewport shifting with 10px gutters: default menus grow to content (up to 20rem), while `fitMenu` matches trigger width and long labels wrap. Keep popup sizing and position repairs out of consumer CSS.
|
|
892
966
|
|
|
893
|
-
Key sibling `DialogSurface`s that render conditionally with `rootAttributes={{ "data-key": "…" }}` so a re-render morphs each dialog into itself; never wrap one in a keyed app `div`. Modal `DialogSurface` bounds use typed `viewportGutter` and `maxHeight` (`CssLength` or `"viewport"`); explicit caps stay within the dynamic viewport minus both gutters. Omitted props
|
|
967
|
+
Key sibling `DialogSurface`s that render conditionally with `rootAttributes={{ "data-key": "…" }}` so a re-render morphs each dialog into itself; never wrap one in a keyed app `div`. Modal `DialogSurface` bounds use typed `viewportGutter` and `maxHeight` (`CssLength` or `"viewport"`); explicit caps stay within the dynamic viewport minus both gutters. Omitted props keep the default caps (20px clear of each edge, 80% of the viewport height at 420px wide or narrower). Application render state chooses responsive values, and preview layout remains application-owned. `height` sets a definite bounded modal size and `bodyLayout="fill"` lets one child fill the body; `bodyLayout="fill-last"` keeps leading rows at their height above one filling last child, and `footerPresentation="floating"` (with a typed `footerOffset`) floats a chat composer over the body while the body reserves its measured height; give the transcript `scrollClearance="block-end"` (a `scrollable` `List` or a `Pane`) to let it scroll beneath the composer, with the last message still resting above it, through the published `--kui-scroll-clearance-block-end` context (overlaying chrome publishes `--kui-scroll-clearance-block-start` / `-end`; one scroller per covered edge opts in; a composed Pane opts in through `PaneConfig.scrollClearance` on a Workbench `mainPane` or panel `pane`, a `CollapsiblePanel` `pane`, or a `NavStack` view's `pane`). `headerPresentation="floating"` lays the title bar over the body on the translucent `--kui-chrome-material-raised` (opaque under reduced transparency, increased contrast, and forced colors); the register measures it and the body reserves it, and a `fill` body's only child with `scrollClearance="both"` scrolls beneath both the title bar and a floating composer through the published `--kui-scroll-clearance-block-start`. `presentation="bottom-sheet"` attaches the dialog to the bottom edge with square bottom corners, safe-area and virtual-keyboard clearance behind the panel, and a slide in/out (`enterMotion` / `exitMotion`); `resizable` adds a top grabber separator bounded by `minHeight` and `maxHeight`. `PopoverDialogSurface` is the non-modal, light-dismiss counterpart on the native Popover API, with the same size props and an `embedded` in-flow presentation; `describedBy` sets its `aria-describedby` (usually a title `ToolbarText`'s `descriptionId`).
|
|
894
968
|
|
|
895
|
-
|
|
969
|
+
Render a modal dialog as `DialogSurface` itself, a native `<dialog>`: `label` (or `labelledBy` with a `heading`, such as an xl `ToolbarText` with a description) names it, `children` is its body, `footer` holds its buttons, and `headerActions` sit before its close button (`withoutHeader` drops the header for content that owns its heading and close control). Open it with `openDialog(dialog)` and close it with `closeDialog(dialog)` from `@kerfjs/ui/surface-scaffold`; never toggle its `open` attribute. The close button, any `data-dialog-close` element inside (a Cancel button), Escape, and, with `lightDismiss`, a backdrop press dispatch a cancelable `kui-request-close` (`detail.source`: `close-button`, `escape`, or `backdrop`); cancel it to keep the dialog open (the panel pulses). The native `close` event fires once it closes. `openDialog` installs the listeners and, while the dialog is open, measures its floating header/footer, follows a bottom sheet's keyboard and grabber, and keeps that state across re-renders; import `@kerfjs/ui/surface-scaffold/register` only when a dialog may open some other way. Do not write `wa-dialog` inside a `DialogSurface`.
|
|
896
970
|
|
|
897
971
|
Toolbar visibility measurement probes and invisible state children are helper-owned and survive Kerf rerenders through `data-morph-preserve`. Actual CSS visibility stays stable while rendering removes transient parent markers, preventing geometry-driven render feedback and repeated probe recreation. Toolbar replacement, explicit internal-node removal and disposal retain their existing behavior.
|