@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
|
@@ -6,11 +6,12 @@
|
|
|
6
6
|
|
|
7
7
|
## When to use
|
|
8
8
|
|
|
9
|
-
A typed action menu with nested choices, selected state, and optional pointer-anchored context opening,
|
|
9
|
+
A typed action menu with nested choices, selected state, and optional pointer-anchored context opening, drawn by Kerf as a native menu in the top layer.
|
|
10
10
|
|
|
11
11
|
- Offer a short list of commands behind one trigger, such as a toolbar sort or More menu.
|
|
12
12
|
- Group related commands under headings and dividers in one popup.
|
|
13
13
|
- Nest decisions under a parent command, show checked or trailing choice state, or open a context menu at pointer coordinates.
|
|
14
|
+
- Make a status Badge the trigger of a menu (a ticket status with a nested phase submenu): pass triggerContent with the Badge and label for the name, instead of wrapping the Badge in an application button.
|
|
14
15
|
|
|
15
16
|
**Not when:**
|
|
16
17
|
|
|
@@ -28,7 +29,7 @@ A typed action menu with nested choices, selected state, and optional pointer-an
|
|
|
28
29
|
- CSS: the browser build of `@kerfjs/ui/popup-menu` pulls its CSS automatically; import `@kerfjs/ui/popup-menu.css` manually only without the `browser` export condition.
|
|
29
30
|
- Theme CSS: import `@kerfjs/ui/webawesome.css` once.
|
|
30
31
|
- Registration: import `@kerfjs/ui/popup-menu/register` once (a side effect).
|
|
31
|
-
- Declared side effects: browser-condition-css, custom-element-registration.
|
|
32
|
+
- Declared side effects: browser-condition-css, document-listeners, custom-element-registration.
|
|
32
33
|
|
|
33
34
|
## Props
|
|
34
35
|
|
|
@@ -47,17 +48,18 @@ Exact prop names and types: [`@kerfjs/ui/popup-menu`](../public-api-signatures-v
|
|
|
47
48
|
- danger tone and disabled reasons
|
|
48
49
|
- context trigger with a rendered anchor point and a zero-footprint anchor host
|
|
49
50
|
- placement
|
|
51
|
+
- triggerContent: app content such as a Badge as the whole trigger, a bare button named by label with a pill focus ring
|
|
50
52
|
|
|
51
53
|
## Composition
|
|
52
54
|
|
|
53
55
|
- Parents: any.
|
|
54
56
|
- Contexts: `application-ui`.
|
|
55
57
|
- Children: unrestricted.
|
|
56
|
-
- Built from: [
|
|
58
|
+
- Built from: [LucideIcon](./lucide-icon.md), [Tooltip](./wa-tooltip.md).
|
|
57
59
|
|
|
58
60
|
## State and wiring
|
|
59
61
|
|
|
60
|
-
**The app owns:** commands and their delegated actions; which items are enabled; reactions to the menu opening or closing; contextmenu event handling and identification of the menu root when using a pointer-anchored context menu.
|
|
62
|
+
**The app owns:** commands and their delegated actions; which items are enabled; the checked state of checkbox choices, which the menu reports as requested in its kui-menu-select event; reactions to the menu opening or closing; contextmenu event handling and identification of the menu root when using a pointer-anchored context menu.
|
|
61
63
|
|
|
62
64
|
No wiring helper.
|
|
63
65
|
|
|
@@ -67,8 +69,9 @@ Margin: none · border: child · padding: child (layout role: controls). `self`
|
|
|
67
69
|
|
|
68
70
|
## Accessibility
|
|
69
71
|
|
|
70
|
-
-
|
|
71
|
-
-
|
|
72
|
+
- The trigger is a native button with aria-haspopup="menu" and aria-expanded; an icon-only trigger requires label, rendered as visually hidden text inside the button, and a trigger with visible text is named by that text. The context anchor stays out of the accessibility tree. The open menu (role="menu") takes the trigger's name, each submenu takes its parent item's label, and a heading names the role="group" that holds its items, so a screen reader announces named menus and getByRole('menu', { name }) finds them. Items are menuitem or menuitemcheckbox buttons with aria-checked and aria-disabled.
|
|
73
|
+
- Keyboard: Enter, Space, or ArrowDown on the trigger opens on the first item (ArrowUp on the last); ArrowUp/ArrowDown move and wrap past disabled items, Home/End jump, and typing a label's first letters moves to it; Enter or Space chooses; ArrowRight opens a submenu on its first item and ArrowLeft returns to the parent item (mirrored right to left); Escape closes the current level and returns focus to its opener; Tab closes the menu and continues from the trigger.
|
|
74
|
+
- Once registered, an icon-only trigger shows its label as an aria-hidden help tag after a 500ms hover and at once on keyboard focus; it hides while the menu is open, on a press, and on Escape, and never joins aria-labelledby. Do not add a title or another tooltip.
|
|
72
75
|
|
|
73
76
|
## Usage examples
|
|
74
77
|
|
|
@@ -158,14 +161,14 @@ row.addEventListener('contextmenu', (event) => {
|
|
|
158
161
|
|
|
159
162
|
The component owns its own styles. Configure it through its props and variants; do not override its internals.
|
|
160
163
|
|
|
161
|
-
Public class hooks (select for layout placement only, never to change the component's look): `kui-popup-menu`, `kui-popup-menu__label`, `kui-popup-menu__details`, `kui-popup-menu__context-anchor`.
|
|
164
|
+
Public class hooks (select for layout placement only, never to change the component's look): `kui-popup-menu`, `kui-popup-menu__trigger`, `kui-popup-menu__label`, `kui-popup-menu__menu`, `kui-popup-menu__item`, `kui-popup-menu__details`, `kui-popup-menu__context-anchor`.
|
|
162
165
|
|
|
163
|
-
Never put `kui-popup-menu`, `kui-popup-menu__label`, `kui-popup-menu__details`, `kui-popup-menu__context-anchor` on an element you write; render `PopupMenu` instead (`KUI-L103`).
|
|
166
|
+
Never put `kui-popup-menu`, `kui-popup-menu__trigger`, `kui-popup-menu__label`, `kui-popup-menu__menu`, `kui-popup-menu__item`, `kui-popup-menu__details`, `kui-popup-menu__context-anchor` on an element you write; render `PopupMenu` instead (`KUI-L103`).
|
|
164
167
|
|
|
165
168
|
Everything else is internal: `kerf-ui-analyze` reports private or unknown `.kui-*` selectors (`KUI-L001`, `KUI-L010`), unknown or private tokens (`KUI-L002`, `KUI-L012`), and any application rule that restyles the component, forced dimensions included (`KUI-L019`).
|
|
166
169
|
|
|
167
170
|
## Related
|
|
168
171
|
|
|
169
|
-
- Components: [
|
|
172
|
+
- Components: [LucideIcon](./lucide-icon.md), [Tooltip](./wa-tooltip.md), [Select](./select.md), [Dropdown](./wa-dropdown.md).
|
|
170
173
|
- Docs: [`docs/component-selection.md`](../../docs/component-selection.md), [`docs/component-selection.md#popup-menu-migration`](../../docs/component-selection.md#popup-menu-migration).
|
|
171
174
|
- UX catalog route: `?component=popup-menu`.
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# ProgressBar
|
|
2
|
+
|
|
3
|
+
<!-- Generated by scripts/sync-component-docs.mjs from ai/component-catalog.json and ai/component-composition.json. Do not edit; run `npm run catalog:sync`. -->
|
|
4
|
+
|
|
5
|
+
`@kerfjs/ui:progress-bar` · Kerf UI · component · Feedback
|
|
6
|
+
|
|
7
|
+
A linear progress indicator on the native progress element: determinate value of max or an indeterminate sweep, a visible label or ariaLabel, an optional value or valueText readout, brand or status tones, and a default or compact track.
|
|
8
|
+
|
|
9
|
+
## When to use
|
|
10
|
+
|
|
11
|
+
Show how far a measurable task has gone (an upload, a migration, a quota) or that work of unknown size is under way.
|
|
12
|
+
|
|
13
|
+
- A task reports measurable progress (files uploaded, steps completed, quota used): pass value and max, a label, and showValue or valueText for the readout.
|
|
14
|
+
- Work of unknown length is under way and a full-width indicator fits: omit value for the indeterminate sweep.
|
|
15
|
+
|
|
16
|
+
**Not when:**
|
|
17
|
+
|
|
18
|
+
- Do not use it for a small inline busy state; use LoadingSpinner or an indeterminate ProgressRing.
|
|
19
|
+
- Do not use it for a scale reading that is not progress (a rating, a level); use a native meter.
|
|
20
|
+
- Do not use wa-progress-bar.
|
|
21
|
+
|
|
22
|
+
**Alternatives:**
|
|
23
|
+
|
|
24
|
+
- [ProgressRing](./progress-ring.md) (nearest) — Use a ProgressRing where a bar does not fit, inline in a row or toolbar.
|
|
25
|
+
- [LoadingSpinner](./loading-spinner.md) (nearest) — Use a LoadingSpinner for a brief busy state with no measurable progress.
|
|
26
|
+
|
|
27
|
+
## Imports
|
|
28
|
+
|
|
29
|
+
- JavaScript: `@kerfjs/ui/progress-bar` — exports `ProgressBar`, `ProgressBarProps`, `ProgressBarSize`, `ProgressBarRootAttributes`, `ProgressTone`.
|
|
30
|
+
- CSS: the browser build of `@kerfjs/ui/progress-bar` pulls its CSS automatically; import `@kerfjs/ui/progress-bar.css` manually only without the `browser` export condition.
|
|
31
|
+
- Declared side effects: browser-condition-css.
|
|
32
|
+
|
|
33
|
+
## Props
|
|
34
|
+
|
|
35
|
+
Exact prop names and types: [`@kerfjs/ui/progress-bar`](../public-api-signatures-v1.md#kerfjsuiprogress-bar) in `public-api-signatures-v1.md`. Do not infer props from examples.
|
|
36
|
+
|
|
37
|
+
**Variants (configure, do not restyle):**
|
|
38
|
+
|
|
39
|
+
- determinate with a label and value readout
|
|
40
|
+
- indeterminate sweep
|
|
41
|
+
- brand, success, warning, or danger tone
|
|
42
|
+
- default 6px or compact 4px track
|
|
43
|
+
- ariaLabel without a visible label
|
|
44
|
+
|
|
45
|
+
## Composition
|
|
46
|
+
|
|
47
|
+
- Parents: any.
|
|
48
|
+
- Contexts: `application-ui`.
|
|
49
|
+
- Children: unrestricted.
|
|
50
|
+
|
|
51
|
+
## State and wiring
|
|
52
|
+
|
|
53
|
+
**The app owns:** the value, max, and valueText; the label or ariaLabel; the tone and size.
|
|
54
|
+
|
|
55
|
+
No wiring helper.
|
|
56
|
+
|
|
57
|
+
## Geometry
|
|
58
|
+
|
|
59
|
+
Margin: none · border: self · padding: self (layout role: feedback). `self` means the component already owns it — do not add wrapper padding, margin, or borders around it.
|
|
60
|
+
|
|
61
|
+
- It fills the available width with the shared block-content inset (a transparent 1px border and 8px padding); the label row sits 4px above the track.
|
|
62
|
+
|
|
63
|
+
## Accessibility
|
|
64
|
+
|
|
65
|
+
- The native progress element is the progressbar: a visible label names it through aria-labelledby (or ariaLabel without one), and valueText replaces the spoken percentage.
|
|
66
|
+
- The indeterminate sweep holds still under prefers-reduced-motion or the static-effects switch; forced colors draw a CanvasText-bordered track with a Highlight fill.
|
|
67
|
+
|
|
68
|
+
## Styling boundary
|
|
69
|
+
|
|
70
|
+
The component owns its own styles. Configure it through its props and variants; do not override its internals.
|
|
71
|
+
|
|
72
|
+
Public class hooks (select for layout placement only, never to change the component's look): `kui-progress-bar`, `kui-progress-bar__header`, `kui-progress-bar__label`, `kui-progress-bar__value`, `kui-progress-bar__track`.
|
|
73
|
+
|
|
74
|
+
Never put `kui-progress-bar`, `kui-progress-bar__header`, `kui-progress-bar__label`, `kui-progress-bar__value`, `kui-progress-bar__track` on an element you write; render `ProgressBar` instead (`KUI-L103`).
|
|
75
|
+
|
|
76
|
+
Everything else is internal: `kerf-ui-analyze` reports private or unknown `.kui-*` selectors (`KUI-L001`, `KUI-L010`), unknown or private tokens (`KUI-L002`, `KUI-L012`), and any application rule that restyles the component, forced dimensions included (`KUI-L019`).
|
|
77
|
+
|
|
78
|
+
## Related
|
|
79
|
+
|
|
80
|
+
- Components: [ProgressRing](./progress-ring.md), [LoadingSpinner](./loading-spinner.md).
|
|
81
|
+
- Docs: [`docs/progress.md`](../../docs/progress.md), [`docs/component-selection.md#problem-to-component-matrix`](../../docs/component-selection.md#problem-to-component-matrix).
|
|
82
|
+
- UX catalog route: `?component=progress-bar`.
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# ProgressRing
|
|
2
|
+
|
|
3
|
+
<!-- Generated by scripts/sync-component-docs.mjs from ai/component-catalog.json and ai/component-composition.json. Do not edit; run `npm run catalog:sync`. -->
|
|
4
|
+
|
|
5
|
+
`@kerfjs/ui:progress-ring` · Kerf UI · component · Feedback
|
|
6
|
+
|
|
7
|
+
A circular progress indicator: an SVG track and arc, determinate (filling clockwise from the top) or an indeterminate spinning arc, in small, medium, and large sizes to sit inline in text, a row, or a toolbar, as a named progressbar.
|
|
8
|
+
|
|
9
|
+
## When to use
|
|
10
|
+
|
|
11
|
+
Show compact progress (a claim's time remaining, a per-row upload) where a bar does not fit.
|
|
12
|
+
|
|
13
|
+
- Progress belongs beside an item in a row, a toolbar, or a line of text: pass value and max, a label, and valueText for speech.
|
|
14
|
+
- A compact indicator of work of unknown length: omit value for the spinning arc.
|
|
15
|
+
|
|
16
|
+
**Not when:**
|
|
17
|
+
|
|
18
|
+
- Do not use it where a full-width readout fits and the amount matters; use ProgressBar.
|
|
19
|
+
- Do not use wa-progress-ring.
|
|
20
|
+
|
|
21
|
+
**Alternatives:**
|
|
22
|
+
|
|
23
|
+
- [ProgressBar](./progress-bar.md) (nearest) — Use a ProgressBar where a full-width bar with a label row fits.
|
|
24
|
+
- [LoadingSpinner](./loading-spinner.md) (nearest) — Use a LoadingSpinner for a brief busy glyph inside a control.
|
|
25
|
+
|
|
26
|
+
## Imports
|
|
27
|
+
|
|
28
|
+
- JavaScript: `@kerfjs/ui/progress-ring` — exports `ProgressRing`, `ProgressRingProps`, `ProgressRingSize`, `ProgressRingRootAttributes`, `ProgressTone`.
|
|
29
|
+
- CSS: the browser build of `@kerfjs/ui/progress-ring` pulls its CSS automatically; import `@kerfjs/ui/progress-ring.css` manually only without the `browser` export condition.
|
|
30
|
+
- Declared side effects: browser-condition-css.
|
|
31
|
+
|
|
32
|
+
## Props
|
|
33
|
+
|
|
34
|
+
Exact prop names and types: [`@kerfjs/ui/progress-ring`](../public-api-signatures-v1.md#kerfjsuiprogress-ring) in `public-api-signatures-v1.md`. Do not infer props from examples.
|
|
35
|
+
|
|
36
|
+
**Variants (configure, do not restyle):**
|
|
37
|
+
|
|
38
|
+
- determinate arc
|
|
39
|
+
- indeterminate spinning arc
|
|
40
|
+
- small (16px), medium (24px), or large (40px)
|
|
41
|
+
- brand, success, warning, or danger tone
|
|
42
|
+
|
|
43
|
+
## Composition
|
|
44
|
+
|
|
45
|
+
- Parents: any.
|
|
46
|
+
- Contexts: `application-ui`.
|
|
47
|
+
- Children: unrestricted.
|
|
48
|
+
|
|
49
|
+
## State and wiring
|
|
50
|
+
|
|
51
|
+
**The app owns:** the value, max, and valueText; the label; the tone and size.
|
|
52
|
+
|
|
53
|
+
No wiring helper.
|
|
54
|
+
|
|
55
|
+
## Geometry
|
|
56
|
+
|
|
57
|
+
Margin: none · border: none · padding: none (layout role: feedback). `self` means the component already owns it — do not add wrapper padding, margin, or borders around it.
|
|
58
|
+
|
|
59
|
+
- Its box is exactly its diameter, so it aligns with icons of the same size.
|
|
60
|
+
|
|
61
|
+
## Accessibility
|
|
62
|
+
|
|
63
|
+
- It is role progressbar named by label, with aria-valuenow as a percentage (or valueText); the SVG is decorative.
|
|
64
|
+
- The spin holds still under prefers-reduced-motion or the static-effects switch; forced colors draw a GrayText track and a Highlight arc.
|
|
65
|
+
|
|
66
|
+
## Styling boundary
|
|
67
|
+
|
|
68
|
+
The component owns its own styles. Configure it through its props and variants; do not override its internals.
|
|
69
|
+
|
|
70
|
+
Public class hooks (select for layout placement only, never to change the component's look): `kui-progress-ring`, `kui-progress-ring__track`, `kui-progress-ring__arc`.
|
|
71
|
+
|
|
72
|
+
Never put `kui-progress-ring`, `kui-progress-ring__track`, `kui-progress-ring__arc` on an element you write; render `ProgressRing` instead (`KUI-L103`).
|
|
73
|
+
|
|
74
|
+
Everything else is internal: `kerf-ui-analyze` reports private or unknown `.kui-*` selectors (`KUI-L001`, `KUI-L010`), unknown or private tokens (`KUI-L002`, `KUI-L012`), and any application rule that restyles the component, forced dimensions included (`KUI-L019`).
|
|
75
|
+
|
|
76
|
+
## Related
|
|
77
|
+
|
|
78
|
+
- Components: [ProgressBar](./progress-bar.md), [LoadingSpinner](./loading-spinner.md).
|
|
79
|
+
- Docs: [`docs/progress.md`](../../docs/progress.md), [`docs/component-selection.md#problem-to-component-matrix`](../../docs/component-selection.md#problem-to-component-matrix).
|
|
80
|
+
- UX catalog route: `?component=progress-ring`.
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
# RadioGroup
|
|
2
|
+
|
|
3
|
+
<!-- Generated by scripts/sync-component-docs.mjs from ai/component-catalog.json and ai/component-composition.json. Do not edit; run `npm run catalog:sync`. -->
|
|
4
|
+
|
|
5
|
+
`@kerfjs/ui:radio-group` · Kerf UI · component · Controls
|
|
6
|
+
|
|
7
|
+
A native fieldset of radios, each drawn as a Kerf circle beside its label, with the group label above, per-choice hints, and hint and error text below, stacked or wrapping.
|
|
8
|
+
|
|
9
|
+
## When to use
|
|
10
|
+
|
|
11
|
+
Choose exactly one of a few options that should stay visible with room for a label and hint each, with native keyboard behavior and form participation.
|
|
12
|
+
|
|
13
|
+
- A form asks for one of two to about six options that people should compare at a glance, each with a readable label and an optional hint.
|
|
14
|
+
|
|
15
|
+
**Not when:**
|
|
16
|
+
|
|
17
|
+
- Do not use for many options or a compact toolbar value; use Select.
|
|
18
|
+
- Do not use to switch a view; use SegmentedControl.
|
|
19
|
+
- Do not use for chip-styled or color choices; use ChoiceChips.
|
|
20
|
+
|
|
21
|
+
**Alternatives:**
|
|
22
|
+
|
|
23
|
+
- [Radio Group](./wa-radio-group.md) (prefer-over)
|
|
24
|
+
- [Radio](./wa-radio.md) (prefer-over)
|
|
25
|
+
- [Select](./select.md) (nearest) — Use Select for a long list.
|
|
26
|
+
- [ChoiceChips](./choice-chips.md) (nearest) — Use ChoiceChips for wrapping pill choices.
|
|
27
|
+
|
|
28
|
+
## Imports
|
|
29
|
+
|
|
30
|
+
- JavaScript: `@kerfjs/ui/radio-group` — exports `RadioGroup`.
|
|
31
|
+
- CSS: the browser build of `@kerfjs/ui/radio-group` pulls its CSS automatically; import `@kerfjs/ui/radio-group.css` manually only without the `browser` export condition.
|
|
32
|
+
- Declared side effects: browser-condition-css.
|
|
33
|
+
|
|
34
|
+
## Props
|
|
35
|
+
|
|
36
|
+
Exact prop names and types: [`@kerfjs/ui/radio-group`](../public-api-signatures-v1.md#kerfjsuiradio-group) in `public-api-signatures-v1.md`. Do not infer props from examples.
|
|
37
|
+
|
|
38
|
+
**Variants (configure, do not restyle):**
|
|
39
|
+
|
|
40
|
+
- vertical or horizontal
|
|
41
|
+
- per-choice hint
|
|
42
|
+
- disabled choice
|
|
43
|
+
- whole group disabled
|
|
44
|
+
- hint
|
|
45
|
+
- error
|
|
46
|
+
- required
|
|
47
|
+
- default or compact size
|
|
48
|
+
|
|
49
|
+
## Composition
|
|
50
|
+
|
|
51
|
+
- Parents: any.
|
|
52
|
+
- Contexts: `application-ui`.
|
|
53
|
+
- Children: unrestricted.
|
|
54
|
+
|
|
55
|
+
## State and wiring
|
|
56
|
+
|
|
57
|
+
**The app owns:** value; choices and their copy; validation and error copy.
|
|
58
|
+
|
|
59
|
+
No wiring helper.
|
|
60
|
+
|
|
61
|
+
## Geometry
|
|
62
|
+
|
|
63
|
+
Margin: none · border: none · padding: self (layout role: controls). `self` means the component already owns it — do not add wrapper padding, margin, or borders around it.
|
|
64
|
+
|
|
65
|
+
- The label and hint sit on the text column (1px + 8px); the choices sit on the 8px control column, 12px apart.
|
|
66
|
+
|
|
67
|
+
## Accessibility
|
|
68
|
+
|
|
69
|
+
- A native \<fieldset role="radiogroup"> named by its legend (label) or ariaLabel; each choice is a native radio inside its \<label>, invisibly over the drawn circle. The browser owns the interaction: one Tab stop, arrow keys move and select, and the checked radio submits its value under name.
|
|
70
|
+
- The group's hint and error form its aria-description; an error sets aria-invalid on the group and the danger border on each circle. required sets each radio's native required and aria-required on the group. A choice's hint is that radio's aria-description.
|
|
71
|
+
|
|
72
|
+
## Styling boundary
|
|
73
|
+
|
|
74
|
+
The component owns its own styles. Configure it through its props and variants; do not override its internals.
|
|
75
|
+
|
|
76
|
+
Public class hooks (select for layout placement only, never to change the component's look): `kui-radio-group`, `kui-radio-group__label`, `kui-radio-group__choices`, `kui-radio-group__choice`, `kui-radio-group__row`, `kui-radio-group__control`, `kui-radio-group__input`, `kui-radio-group__circle`, `kui-radio-group__choice-label`, `kui-radio-group__choice-hint`, `kui-radio-group__hint`, `kui-radio-group__error`.
|
|
77
|
+
|
|
78
|
+
Never put `kui-radio-group`, `kui-radio-group__label`, `kui-radio-group__choices`, `kui-radio-group__choice`, `kui-radio-group__row`, `kui-radio-group__control`, `kui-radio-group__input`, `kui-radio-group__circle`, `kui-radio-group__choice-label`, `kui-radio-group__choice-hint`, `kui-radio-group__hint`, `kui-radio-group__error` on an element you write; render `RadioGroup` instead (`KUI-L103`).
|
|
79
|
+
|
|
80
|
+
Public tokens it reads: `--kui-color-brand-fill-loud`, `--kui-color-neutral-border-normal`, `--kui-color-surface`, `--kui-color-text`, `--kui-color-text-quiet`, `--kui-color-danger-border-loud`, `--kui-color-danger-on-quiet`, `--kui-focus-ring`, `--kui-font-m`, `--kui-font-s`, `--kui-font-xs`, `--kui-color-neutral-on-quiet`, `--kui-layout-item-padding`. Set a token only where its public contract allows; prefer a prop.
|
|
81
|
+
|
|
82
|
+
Everything else is internal: `kerf-ui-analyze` reports private or unknown `.kui-*` selectors (`KUI-L001`, `KUI-L010`), unknown or private tokens (`KUI-L002`, `KUI-L012`), and any application rule that restyles the component, forced dimensions included (`KUI-L019`).
|
|
83
|
+
|
|
84
|
+
## Related
|
|
85
|
+
|
|
86
|
+
- Components: [Radio Group](./wa-radio-group.md), [Radio](./wa-radio.md), [Select](./select.md), [ChoiceChips](./choice-chips.md).
|
|
87
|
+
- Docs: [`docs/component-selection.md`](../../docs/component-selection.md), [`docs/component-selection.md#problem-to-component-matrix`](../../docs/component-selection.md#problem-to-component-matrix).
|
|
88
|
+
- UX catalog route: `?component=radio-group`.
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
## When to use
|
|
8
8
|
|
|
9
|
-
Production
|
|
9
|
+
Production ListDetailDialog: a full-height list column with its own title beside a full-height detail column that carries the primary title, close control, and record actions; a full-screen drill-down on compact devices.
|
|
10
10
|
|
|
11
11
|
- A focused task compares several records without leaving the current workspace.
|
|
12
12
|
|
|
@@ -17,7 +17,7 @@ Production modal laid out as a workbench: a full-height SplitView list sidebar w
|
|
|
17
17
|
## Imports
|
|
18
18
|
|
|
19
19
|
- Nothing to import: this is a reference composition.
|
|
20
|
-
- Declared side effects: lazy-recipe-css
|
|
20
|
+
- Declared side effects: lazy-recipe-css.
|
|
21
21
|
|
|
22
22
|
## Props
|
|
23
23
|
|
|
@@ -28,7 +28,7 @@ No props: this entry has no JavaScript API.
|
|
|
28
28
|
- Parents: used at the root of a screen or reference, not nested.
|
|
29
29
|
- Contexts: `application-reference`.
|
|
30
30
|
- Children: unrestricted.
|
|
31
|
-
- Built from: [
|
|
31
|
+
- Built from: [ListDetailDialog](./list-detail-dialog.md), [Row](./row.md), [List](./list.md), [ListItem](./list-item.md), [ValueTable](./value-table.md), [LucideIcon](./lucide-icon.md), [Button](./button.md).
|
|
32
32
|
|
|
33
33
|
## State and wiring
|
|
34
34
|
|
|
@@ -42,7 +42,7 @@ Margin: composed · border: composed · padding: composed (layout role: referenc
|
|
|
42
42
|
|
|
43
43
|
## Accessibility
|
|
44
44
|
|
|
45
|
-
-
|
|
45
|
+
- ListDetailDialog's native modal dialog owns focus, Escape, and inertness, and returns focus to the opener on close; the close control sits in the detail column (or each compact view), and the compact NavStack back control returns to the list.
|
|
46
46
|
|
|
47
47
|
## Styling boundary
|
|
48
48
|
|
|
@@ -52,6 +52,6 @@ Everything else is internal: `kerf-ui-analyze` reports private or unknown `.kui-
|
|
|
52
52
|
|
|
53
53
|
## Related
|
|
54
54
|
|
|
55
|
-
- Components: [
|
|
55
|
+
- Components: [ListDetailDialog](./list-detail-dialog.md), [Row](./row.md), [List](./list.md), [ListItem](./list-item.md), [ValueTable](./value-table.md), [LucideIcon](./lucide-icon.md), [Button](./button.md).
|
|
56
56
|
- Docs: [`docs/recipes.md#list-detail-dialog`](../../docs/recipes.md#list-detail-dialog).
|
|
57
57
|
- UX catalog route: `?component=recipe-list-detail-dialog`.
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
# SearchField
|
|
2
|
+
|
|
3
|
+
<!-- Generated by scripts/sync-component-docs.mjs from ai/component-catalog.json and ai/component-composition.json. Do not edit; run `npm run catalog:sync`. -->
|
|
4
|
+
|
|
5
|
+
`@kerfjs/ui:search-field` · Kerf UI · component · Controls
|
|
6
|
+
|
|
7
|
+
## When to use
|
|
8
|
+
|
|
9
|
+
Token-controlled, optionally collapsible search editor with ordered, editable, removable filter chips.
|
|
10
|
+
|
|
11
|
+
- Combine DOM-owned free text with ordered editable/removable filter tokens in one searchbox.
|
|
12
|
+
- Enable collapsible mode when an empty, unfocused search should reduce to one iconic action, standalone or inside a toolbar group.
|
|
13
|
+
- Use presentation="form-field" for a structured search query beside Web Awesome form controls, with a visible label, optional hint, and required marker.
|
|
14
|
+
|
|
15
|
+
**Not when:**
|
|
16
|
+
|
|
17
|
+
- Do not use for ordinary text input or separately labeled filter controls.
|
|
18
|
+
|
|
19
|
+
**Alternatives:**
|
|
20
|
+
|
|
21
|
+
- [Input](./wa-input.md) (prefer-over)
|
|
22
|
+
|
|
23
|
+
## Imports
|
|
24
|
+
|
|
25
|
+
- JavaScript: `@kerfjs/ui/search-field` — exports `SearchField`, `readSearchField`, `placeSearchFieldCaret`.
|
|
26
|
+
- JavaScript: `@kerfjs/ui/wire-search-fields` — exports `wireSearchFields`.
|
|
27
|
+
- JavaScript: `@kerfjs/ui/search-field-model` — exports `createSearchFieldModel`.
|
|
28
|
+
- CSS: the browser build of `@kerfjs/ui/search-field` pulls its CSS automatically; import `@kerfjs/ui/search-field.css` manually only without the `browser` export condition.
|
|
29
|
+
- Wiring: `readSearchField` from `@kerfjs/ui/search-field` (required).
|
|
30
|
+
- Wiring: `placeSearchFieldCaret` from `@kerfjs/ui/search-field` (optional).
|
|
31
|
+
- Wiring: `wireSearchFields` from `@kerfjs/ui/wire-search-fields` (required).
|
|
32
|
+
- Declared side effects: browser-condition-css.
|
|
33
|
+
|
|
34
|
+
## Props
|
|
35
|
+
|
|
36
|
+
Exact prop names and types: [`@kerfjs/ui/search-field`](../public-api-signatures-v1.md#kerfjsuisearch-field), [`@kerfjs/ui/wire-search-fields`](../public-api-signatures-v1.md#kerfjsuiwire-search-fields), [`@kerfjs/ui/search-field-model`](../public-api-signatures-v1.md#kerfjsuisearch-field-model) in `public-api-signatures-v1.md`. Do not infer props from examples.
|
|
37
|
+
|
|
38
|
+
**Variants (configure, do not restyle):**
|
|
39
|
+
|
|
40
|
+
- tokens
|
|
41
|
+
- free text
|
|
42
|
+
- disabled
|
|
43
|
+
- collapsible standalone or toolbar composition
|
|
44
|
+
- visible form-field label, hint, and required marker
|
|
45
|
+
|
|
46
|
+
## Composition
|
|
47
|
+
|
|
48
|
+
- Parents: any.
|
|
49
|
+
- Contexts: `structured-search-editor`.
|
|
50
|
+
- Children: unrestricted.
|
|
51
|
+
- Built from: [LucideIcon](./lucide-icon.md).
|
|
52
|
+
|
|
53
|
+
Zones (a zone is bound to JSX only through its listed prop; never assume the zone id is a prop):
|
|
54
|
+
|
|
55
|
+
- `leading-decoration` — JSX prop `leading`; accepts `dormant-decoration`; 0–1.
|
|
56
|
+
- `trailing-control` — JSX prop `trailing`; accepts `control`; 0–1.
|
|
57
|
+
|
|
58
|
+
## State and wiring
|
|
59
|
+
|
|
60
|
+
- tokens — controlled (required)
|
|
61
|
+
- text — component (required)
|
|
62
|
+
- expanded — controlled
|
|
63
|
+
|
|
64
|
+
**Wiring:** `wireSearchFields` is required.
|
|
65
|
+
|
|
66
|
+
- Retain and invoke the disposer.
|
|
67
|
+
- Use readSearchField for DOM-owned text.
|
|
68
|
+
- With a managed model, read model.state.peek() (never model.state.value) in the host render and bind model.result as a signal hole; the field itself re-renders only when model.structure changes, not per keystroke.
|
|
69
|
+
|
|
70
|
+
**Wiring-owned state attributes** — never render, remove, or branch on these as app state:
|
|
71
|
+
|
|
72
|
+
- `data-search-field-text` on `the text span inside kui-search-field__editor` (`wireSearchFields`): Marks the plain-text span the helper inserts when the editor is emptied.
|
|
73
|
+
- `data-empty` on `the text span inside kui-search-field__editor` (`wireSearchFields`): "true" on that span while it holds no text.
|
|
74
|
+
- `data-placeholder-visible` on `the kui-search-field root` (`wireSearchFields`): Tracks whether the DOM-owned editor is empty so its placeholder stays outside the editable area.
|
|
75
|
+
|
|
76
|
+
## Geometry
|
|
77
|
+
|
|
78
|
+
Margin: none · border: self · padding: self (layout role: controls). `self` means the component already owns it — do not add wrapper padding, margin, or borders around it.
|
|
79
|
+
|
|
80
|
+
## Accessibility
|
|
81
|
+
|
|
82
|
+
- Announce result changes when useful and keep tokens atomic during editing.
|
|
83
|
+
- Keep leading and trailing controls aligned to the first text line while content wraps. Managed Clear restores replacement focus before the next input task, preserving immediate typing and later focus handoffs without a frame delay.
|
|
84
|
+
- Wire Enter to submit without inserting a contenteditable line break and preserve focus plus the text-relative caret across controlled keyboard chip deletion before the next keystroke. Select All deletion preserves managed open state and replacement focus; persist both edited query and tokens. Visual wrapping remains available.
|
|
85
|
+
- In collapsible mode, wireSearchFields manages this by default: activating the trigger reveals the searchbox and moves focus into it, Escape on an empty field collapses and returns focus to the trigger, and focus leaving an empty field collapses it; each behavior is individually opt-out.
|
|
86
|
+
- The form-field presentation associates its visible label and optional hint with the searchbox, exposes aria-required when required, and lets wireSearchFields focus the editor from a label click. The app validates required input.
|
|
87
|
+
|
|
88
|
+
## Styling boundary
|
|
89
|
+
|
|
90
|
+
The component owns its own styles. Configure it through its props and variants; do not override its internals.
|
|
91
|
+
|
|
92
|
+
Public class hooks (select for layout placement only, never to change the component's look): `kui-search-field`, `kui-search-field__clear`, `kui-search-field__editor`, `kui-search-field__expand`, `kui-search-field__leading`, `kui-search-field__token`, `kui-search-field__token-edit`, `kui-search-field__token-remove`, `kui-search-field__suggestions`, `kui-search-field__suggestion`, `kui-search-field__trailing`.
|
|
93
|
+
|
|
94
|
+
Never put `kui-search-field`, `kui-search-field__clear`, `kui-search-field__editor`, `kui-search-field__expand`, `kui-search-field__leading`, `kui-search-field__token`, `kui-search-field__token-edit`, `kui-search-field__token-remove`, `kui-search-field__suggestions`, `kui-search-field__suggestion`, `kui-search-field__trailing` on an element you write; render `SearchField` instead (`KUI-L103`).
|
|
95
|
+
|
|
96
|
+
Public tokens it reads: `--kui-color-brand-fill-normal`, `--kui-color-brand-on-quiet`, `--kui-color-neutral-border-normal`, `--kui-color-text-link`, `--kui-color-surface`, `--kui-color-text`, `--kui-color-text-quiet`, `--kui-focus-ring`, `--kui-font-s`, `--kui-font-xs`, `--kui-radius-pill`, `--kui-search-field-background`, `--kui-search-field-border`, `--kui-search-field-editor-min-width`, `--kui-search-field-line-size`, `--kui-search-field-token-background`, `--kui-search-field-token-foreground`, `--kui-search-field-expanded-width`. Set a token only where its public contract allows; prefer a prop.
|
|
97
|
+
|
|
98
|
+
Everything else is internal: `kerf-ui-analyze` reports private or unknown `.kui-*` selectors (`KUI-L001`, `KUI-L010`), unknown or private tokens (`KUI-L002`, `KUI-L012`), and any application rule that restyles the component, forced dimensions included (`KUI-L019`).
|
|
99
|
+
|
|
100
|
+
## Diagnostics
|
|
101
|
+
|
|
102
|
+
- `KUI-C105` (error) when wireSearchFields is absent: SearchField requires its public wiring helper for keyboard and collapsible behavior.
|
|
103
|
+
|
|
104
|
+
## Related
|
|
105
|
+
|
|
106
|
+
- Components: [LucideIcon](./lucide-icon.md), [Input](./wa-input.md).
|
|
107
|
+
- Docs: [`docs/component-selection.md`](../../docs/component-selection.md), [`docs/accessibility.md#searchfield`](../../docs/accessibility.md#searchfield).
|
|
108
|
+
- UX catalog route: `?component=search-field`.
|
package/ai/components/select.md
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
`@kerfjs/ui:select` · Kerf UI · component · Controls
|
|
6
6
|
|
|
7
|
-
Controlled
|
|
7
|
+
Controlled Kerf select with typed single or multiple values, disabled choices, optional bulk actions, and form, toolbar, navigation, compact, icon-only, truncating, hint, and grouped-choice presentations; a native trigger and a top-layer listbox wired by select/register.
|
|
8
8
|
|
|
9
9
|
## When to use
|
|
10
10
|
|
|
@@ -58,6 +58,7 @@ Exact prop names and types: [`@kerfjs/ui/select`](../public-api-signatures-v1.md
|
|
|
58
58
|
- disabled choice with an optional reason
|
|
59
59
|
- opt-in select-all and clear actions for multiple selection
|
|
60
60
|
- multiple icon-only filter trigger with a fixed triggerIcon
|
|
61
|
+
- maxTriggerWidth / minTriggerWidth bounds on the closed trigger under any presentation, ellipsizing custom selected content
|
|
61
62
|
|
|
62
63
|
**CSS-value props** (typed builders from `@kerfjs/ui/css-values`; raw CSS strings are rejected):
|
|
63
64
|
|
|
@@ -68,7 +69,7 @@ Exact prop names and types: [`@kerfjs/ui/select`](../public-api-signatures-v1.md
|
|
|
68
69
|
- Parents: any.
|
|
69
70
|
- Contexts: `controlled-value-selection`.
|
|
70
71
|
- Children: unrestricted.
|
|
71
|
-
- Built from: [LucideIcon](./lucide-icon.md), [Badge](./badge.md)
|
|
72
|
+
- Built from: [LucideIcon](./lucide-icon.md), [Badge](./badge.md).
|
|
72
73
|
|
|
73
74
|
## State and wiring
|
|
74
75
|
|
|
@@ -85,21 +86,22 @@ Margin: none · border: self · padding: self (layout role: controls). `self` me
|
|
|
85
86
|
## Accessibility
|
|
86
87
|
|
|
87
88
|
- Verify the live value, standard events, focus, and rendered output.
|
|
88
|
-
- A nonempty label names the
|
|
89
|
-
- Hint text is visible below the control
|
|
90
|
-
- Import select/register once
|
|
91
|
-
-
|
|
92
|
-
-
|
|
93
|
-
-
|
|
94
|
-
-
|
|
89
|
+
- The trigger is a native button with role="combobox", aria-haspopup="listbox", and aria-expanded. A nonempty label names it (the visible label is aria-hidden text beside it); otherwise ariaLabel names it without adding control height, including custom selected content.
|
|
90
|
+
- Hint text is visible below the control and is the trigger's aria-description; placeholderText remains the empty value inside the closed control.
|
|
91
|
+
- Import select/register once: it defines the form-associated kui-select root (value, name, form submission, and form reset) and wires every Select in the document. The listbox opens below the trigger in the top layer, flipping above when short and capped at the viewport edges. Do not add consumer popup timing or position repairs.
|
|
92
|
+
- Keyboard: Enter, Space, ArrowDown, or ArrowUp on the trigger opens on the chosen option (Home/End on the first/last), and typing opens on a matching label; in the listbox the arrows move and wrap, Home/End jump, typing a label's first letters moves to it, Enter or Space chooses, Escape closes and returns focus to the trigger, and Tab closes and continues from the trigger.
|
|
93
|
+
- With multiple, the listbox (aria-multiselectable) stays open while choices toggle (pointer, Enter, or Space) and closes on an outside press, Escape, or Tab; each chosen option shows a check, and the closed control summarizes the chosen labels in choice order.
|
|
94
|
+
- Disabled choices stay visible with aria-disabled but cannot be chosen; disabledReason is their title. A multiple Select can opt in to localized select-all and clear buttons below the listbox, which skip disabled choices and publish ordinary change events for changed values.
|
|
95
|
+
- A multiple icon-only trigger shows its fixed triggerIcon and, while any choice is chosen, an aria-hidden count Badge; the trigger's accessible name ends with the chosen labels in choice order, and its value text stays empty.
|
|
96
|
+
- Once registered, an icon-only trigger (single or multiple) shows an aria-hidden help tag repeating its accessible name (a single Select adds its current choice) after a 500ms hover and at once on keyboard focus; it hides while the listbox is open, on a press, and on Escape, and never joins aria-labelledby. Do not add a title or another tooltip.
|
|
95
97
|
|
|
96
98
|
## Styling boundary
|
|
97
99
|
|
|
98
100
|
The component owns its own styles. Configure it through its props and variants; do not override its internals.
|
|
99
101
|
|
|
100
|
-
Public class hooks (select for layout placement only, never to change the component's look): `kui-select`, `kui-select--custom-selected`, `kui-select--fit-menu`, `kui-
|
|
102
|
+
Public class hooks (select for layout placement only, never to change the component's look): `kui-select`, `kui-select--custom-selected`, `kui-select--fit-menu`, `kui-select__custom-selected`, `kui-select__custom-selected-content`, `kui-select__group`, `kui-select__group--separated`, `kui-select__group-title`, `kui-select__icon`, `kui-select__listbox`, `kui-select__option`, `kui-select__popup`, `kui-select__trigger`, `kui-select__value`.
|
|
101
103
|
|
|
102
|
-
Never put `kui-select`, `kui-select--custom-selected`, `kui-select--fit-menu`, `kui-
|
|
104
|
+
Never put `kui-select`, `kui-select--custom-selected`, `kui-select--fit-menu`, `kui-select__custom-selected`, `kui-select__custom-selected-content`, `kui-select__group`, `kui-select__group--separated`, `kui-select__group-title`, `kui-select__icon`, `kui-select__listbox`, `kui-select__option`, `kui-select__popup`, `kui-select__trigger`, `kui-select__value` on an element you write; render `Select` instead (`KUI-L103`).
|
|
103
105
|
|
|
104
106
|
Public tokens it reads: `--kui-color-neutral-border-quiet`, `--kui-color-neutral-on-quiet`, `--kui-disclosure-icon-scale`, `--kui-font-2xs`, `--kui-select-selected-color`, `--kui-select-selected-font-size`, `--kui-select-selected-font-weight`, `--kui-select-trigger-max-width`. Set a token only where its public contract allows; prefer a prop.
|
|
105
107
|
|
|
@@ -111,6 +113,6 @@ Everything else is internal: `kerf-ui-analyze` reports private or unknown `.kui-
|
|
|
111
113
|
|
|
112
114
|
## Related
|
|
113
115
|
|
|
114
|
-
- Components: [LucideIcon](./lucide-icon.md), [Badge](./badge.md), [
|
|
115
|
-
- Docs: [`docs/component-selection.md`](../../docs/component-selection.md), [`docs/component-selection.md#web-awesome-
|
|
116
|
+
- Components: [LucideIcon](./lucide-icon.md), [Badge](./badge.md), [SegmentedControl](./segmented-control.md), [Select](./wa-select.md), [Dropdown](./wa-dropdown.md), [Combobox](./combobox.md).
|
|
117
|
+
- Docs: [`docs/component-selection.md`](../../docs/component-selection.md), [`docs/component-selection.md#web-awesome-integration`](../../docs/component-selection.md#web-awesome-integration).
|
|
116
118
|
- UX catalog route: `?component=select`.
|