@kerfjs/ui 5.0.0-beta.104 → 5.0.0-beta.106
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 +155 -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 -628
- package/ai/component-composition-rules.json +10 -10
- package/ai/component-composition.json +1688 -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/{token-search-field.md → search-field.md} +23 -23
- 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 +1579 -247
- 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-T5BJBMW7.js → chunk-CIAUILRR.js} +5 -5
- 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-CR5U5FV6.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-ZJC5ND3M.js → chunk-VEME3D7K.js} +35 -35
- 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-JA1i8z4D.d.ts → search-field-CrGTN5sa.d.ts} +45 -45
- 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 +10 -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 +10 -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 +228 -164
- 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 +127 -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/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-CR5U5FV6.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-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-MXNIVEVL.js.map +0 -1
- package/dist/chunk-NS762OVM.js +0 -222
- package/dist/chunk-NS762OVM.js.map +0 -1
- package/dist/chunk-QTSMHH5J.js.map +0 -1
- package/dist/chunk-T5BJBMW7.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/chunk-ZJC5ND3M.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/docs/ui-doctor.md
CHANGED
|
@@ -146,7 +146,7 @@ capitalization rule in [Writing interface copy](./writing.md#capitalization).
|
|
|
146
146
|
Names of commands, controls, views, and fields use title style, following
|
|
147
147
|
Apple's guidance. `KUI-D040` (warning) reports a string or template literal
|
|
148
148
|
passed to a known title-style prop that leaves a word lowercase where title style
|
|
149
|
-
capitalizes it. For example, `<
|
|
149
|
+
capitalizes it. For example, `<Button>Save draft</Button>` should be
|
|
150
150
|
"Save Draft", and `<ListHeader label="Needs attention" />` should be "Needs
|
|
151
151
|
Attention". The action names the repaired label.
|
|
152
152
|
|
|
@@ -166,7 +166,8 @@ covers these string literals:
|
|
|
166
166
|
declared in the same file;
|
|
167
167
|
- `SegmentedControl`, `Select`, and `TabNavigator` choice and tab labels;
|
|
168
168
|
- `NavStack` view titles and `backText`, and `SplitView` `backLabel`;
|
|
169
|
-
- `FieldLabel` text and the static text of a `button
|
|
169
|
+
- `FieldLabel` text and the static text of a `Button`, `button`, or
|
|
170
|
+
`wa-button`;
|
|
170
171
|
- the `name` of a panel toolbar's `toggle: { action, name }` object literal
|
|
171
172
|
(Workbench panels, `CollapsiblePanel`), which names the toggle group and
|
|
172
173
|
completes its "Show …" / "Hide …" label;
|
|
@@ -180,11 +181,14 @@ covers these string literals:
|
|
|
180
181
|
configuration declared in the same file; and the `aria-label` of a
|
|
181
182
|
`section`, `nav`, `aside`, `main`, `header`, `footer`, `form`, or `search`
|
|
182
183
|
element or an element with a landmark `role`;
|
|
183
|
-
- the `label`
|
|
184
|
-
`
|
|
184
|
+
- field and group labels: the `label` and `ariaLabel` of `TextField`,
|
|
185
|
+
`Select`, and `RadioGroup`, and the `label` of a raw `wa-input`,
|
|
186
|
+
`wa-select`, `wa-textarea`, or `wa-radio-group` in an application using the
|
|
187
|
+
optional Web Awesome integration;
|
|
185
188
|
- the accessible names of icon-only controls, which the rule also gives title
|
|
186
|
-
style:
|
|
187
|
-
`SplitButton` `optionsLabel`, `
|
|
189
|
+
style: an icon-only `Button`'s `ariaLabel`, `PopupMenu` `label`,
|
|
190
|
+
`SplitButton` `optionsLabel`, `SearchField` and `TextField`
|
|
191
|
+
`clearLabel`, and the
|
|
188
192
|
`aria-label` of a `button` or `wa-button` whose only content is an icon. A
|
|
189
193
|
button with visible text is judged by that text, never by its `aria-label`.
|
|
190
194
|
|
|
@@ -199,6 +203,7 @@ The check is deliberately one-directional, to keep false positives rare:
|
|
|
199
203
|
is. A word joined to an interpolation (`` `${count}s` ``) is skipped.
|
|
200
204
|
- It ignores other dynamic values and every sentence-style surface: descriptions,
|
|
201
205
|
details, placeholders, tooltips, status text, and option text, including
|
|
206
|
+
`Checkbox` and `Switch` labels, `RadioGroup` choice labels, and
|
|
202
207
|
`wa-checkbox`, `wa-switch`, and `wa-radio` labels. It does not read
|
|
203
208
|
`LoadingSpinner` or `Skeleton` labels, which announce a status.
|
|
204
209
|
- It skips tokens containing digits, code, paths, or URLs, and lowercase-led
|
package/docs/ux-demo.md
CHANGED
|
@@ -33,12 +33,12 @@ deterministic state, and semantic layout owners from the [recipe guide](./recipe
|
|
|
33
33
|
- It imports public component subpaths, exercising their browser-selected reachable CSS rather than a catalog-only style path.
|
|
34
34
|
- The `ListActionRow` route's Run Tests row composes a trailing `PopupMenu` (`trailingMenu`) with Edit and Delete commands, revealed on interaction, that also opens at the pointer when the row's primary button is right-clicked.
|
|
35
35
|
- The `ListActionRow` route demonstrates sibling primary/trailing native controls, independent disabled states, controlled selection, first-line leading-icon alignment for wrapped labels, and an application-owned native popover relationship without nesting controls. The `ListItem` route demonstrates the same multiline leading-icon anchor alongside its single-control navigation contract.
|
|
36
|
-
- The `PopupMenu` route's context example opens one app-owned menu either at the row's right-click point or below its adjacent, keyboard-operable Demand Actions button. The Nested Decisions example shows the automatic phone-width submenu placement above or below its parent list, with
|
|
37
|
-
- The `
|
|
38
|
-
- Every first-party visual component and every free Web Awesome 3.
|
|
36
|
+
- The `PopupMenu` route's context example opens one app-owned menu either at the row's right-click point or below its adjacent, keyboard-operable Demand Actions button. The Nested Decisions example shows the automatic phone-width submenu placement above or below its parent list, with ArrowLeft return, Escape dismissal, and child selection.
|
|
37
|
+
- The `TabBarItem` and `TabBar` routes are focused component specimens: TabBarItem shows its selected, compact, segmented, icon-only, truncation, placeholder, pending, metadata, and close-icon axes inside the required tablist context; TabBar shows its rail, segmented, inspector, allocation, placement, and accessory-zone axes, including an adjacent action plus a separately pinned end action whose tabs overflow at narrow widths, without application readouts. The pinned leading-tab specimen uses native strip scrolling so momentum and the final tab's end position remain natural; `snapTabs` stays an opt-in for applications that want whole-tab settling. The separate `Application tabs` composition route demonstrates controlled selection, matching panel content, overflow, adding (a new tab opens `pending` with a spinner and stays selectable while its panel shows a `Skeleton` heading until a simulated load completes), closing, keyboard/pointer reordering, and application-owned ordering. The `ResizableRegion` route likewise replaces only the decorative handle glyph while retaining separator semantics and shared wiring.
|
|
38
|
+
- Every first-party visual component and every free Web Awesome 3.14 component has its own stable `?component=<id>` URL and focused demo. Composite header, menu, and feedback scenarios remain addressable alongside their subcomponents; the root opens the first Kerf component. The former aggregate Web Awesome theme specimen is intentionally omitted because its component families are covered by those focused routes.
|
|
39
39
|
- `ai/component-catalog.json` is the canonical catalog metadata. A deterministic checked-in projection supplies the demo's unique id, category, kind (`component`, `composition`, or `recipe`), source (`kerf` or `webawesome`), name, description, recommendation, direct `uses` dependencies, existing documentation path, and demo-source path; first-party, recipe, and Web Awesome renderer maps are exhaustively typed against its generated id unions. Functional groups follow their authored importance order; components precede compositions inside each group, equal-importance entries use alphabetical order, and the Recipes group comes last. Composition names stay concise and project a visible `Composition` sidebar tag. Non-supported Web Awesome recommendations project to a visible `Discouraged` tag, with Popup as the deliberate conditional exception. Demo paths resolve to the matching `ui/ux-demo/demos/<id>.tsx` or `ui/ux-demo/recipes/*.tsx` file, or to `ui/ux-demo/webawesome-demos.tsx` for Web Awesome entries. `ui/ux-demo/main.tsx` owns only the catalog shell, shared state, routing, and interaction wiring. First-party component entries additionally derive `ui/src/<public-subpath>.tsx` from their canonical `delivery.browserImport` or opt-in `delivery.moduleImport`.
|
|
40
40
|
- Every detail footer groups compact `Demo Source` and `Guidance` actions; first-party component details also expose `Component Source`. Web Awesome details say `Integration Guidance` to distinguish the local integration contract from the upstream component implementation. Each button retains its repository-relative path in the DOM for verification and uses a deploy-safe absolute GitHub blob URL with a contextual new-tab name; the demo does not depend on a local source server or add a package runtime export. At phone widths, the resource group and related-component selector stack as full-width rows, with any resource overflow contained locally so labels cannot overlap the selector or widen the document.
|
|
41
|
-
- The master/detail shell groups first-party routes by category with production `ListHeader` and `ListItem` components. Catalog entries can supply short reusable trailing tags; the Web Awesome projection uses them to label exactly the
|
|
41
|
+
- The master/detail shell groups first-party routes by category with production `ListHeader` and `ListItem` components. Catalog entries can supply short reusable trailing tags; the Web Awesome projection uses them to label exactly the 47 discouraged choices, every element a Kerf component replaces. A `Show Discouraged` switch at the top of the open section lists them; it is off by default, so the section leads with the elements an integration application may still use, and a direct `?component=` route to a discouraged entry still lists that entry. The 73 optional-integration components live in a separate `Web Awesome Integration` disclosure with seven subgroups, so they remain discoverable without being presented as first-class `@kerfjs/ui` exports. Direct Web Awesome routes open the disclosure and reveal the selected row at wide sizes; narrow layouts keep the expanded list in document flow rather than introducing a competing nested scroller.
|
|
42
42
|
- The shell itself uses `@kerfjs/ui/layout.css`: sidebars, details, previews, dialogs, and resize specimens share unpadded panes plus self-contained content items. Its sidebar identity uses the Kerf logo beside a vertically centered title, with supporting copy in its own aligned row; the current-view heading is also a toolbar. The shared Catalog sidebar includes a filter for entry and heading names that works across first-party and ecosystem sections, including collapsed sections. Collapsing the catalog removes the pane completely and moves its restore action to the main toolbar's leading edge instead of leaving an icon-only rail. The selected view description remains inset below the page toolbar. The preview stage sits directly in the sunken main Pane, with its canvas padded by the medium spacing token. The stage fills the preview scroller for short specimens and grows with taller ones; every background choice follows that same shared behavior in this demo and in consumers. The checkerboard belongs to that stage, rather than a viewport-height wrapper or nested card, and one explicitly repeated SVG tile keeps the pattern continuous through below-fold content. A lightly separated footer keeps live status above compact source, guidance, and relationship groups. The focused `ResizableRegion` specimen stretches its surface through the available stage height and reports committed width in that shared status footer; narrow layouts retain local horizontal access when the pane is resized wider than the stage, and the split remains readable at 200% root scaling. Geometry coverage checks wide, intermediate, narrow, and 200% zoom layouts.
|
|
43
43
|
- The composer-form recipe demonstrates one coherent visible form surface with toolbar title/supporting-copy hierarchy, fields and actions on the shared 8px control gutter, and 24px major rhythm. Its conditional error or success `StateBanner` is the only nested semantic surface. Reset synchronizes the upgraded Web Awesome fields' live value properties with their empty controlled attributes and announces `Draft reset`; browser coverage preserves behavior and verifies wide, narrow, dark, validation, success, reset, 200% zoom, and forced-colors states.
|
|
44
44
|
- The list-detail dialog recipe is laid out like a `Workbench` on roomy devices: a headerless `DialogSurface` modal whose `SplitView` holds a full-height list sidebar `Pane` with its own toolbar beside a full-height detail `Pane` that carries the primary xl title, the `data-dialog="close"` control, and the record actions in its footer. Compact devices get a full-screen sheet with its own labeled header, footer actions, and a list-to-detail drill-down. Browser geometry coverage protects those relationships at wide and narrow widths.
|
|
@@ -46,8 +46,8 @@ deterministic state, and semantic layout owners from the [recipe guide](./recipe
|
|
|
46
46
|
- The menu composition route demonstrates toolbar/content/footer anatomy, 24px major gaps, 8/1/8 child geometry, the full-width `ListHeader` count-or-badge/action split, logical-end 44px action targets with 18px visuals, and 44px row/header/toolbar targets. Its one chevron is a production 18px `DisclosureArrow` inside a controlled Tools header that actually reveals and hides content; ordinary Projects navigation has no false disclosure affordance. Browser assertions cover stable naming, expanded/content transitions, visual rotation, node identity, reduced motion, RTL alignment and containment, and wide, narrow, dark, and 200% layouts. The focused ListHeader route separately shows the shared neutral count pill for Attachments, Notes (including zero), and Duplicates plus a non-count legacy badge, full-width logical-end actions, and no disclosure without content.
|
|
47
47
|
- The `DisclosureArrow` route renders the production 18px root-scaled default without a catalog-only size override. Its two native buttons independently control the default right-to-down chevron and a recognizable right-facing replacement arrow with left-to-up custom directions; both use shortest-path rotation and their names stay stable while `aria-expanded` communicates state. Browser coverage verifies the custom clockwise path, pointer and native keyboard activation, focus, narrow and 200%-zoom stacking with contained labels, consumer sizing, and the independent `.5` Web Awesome glyph scale retained by Kerf `Select`.
|
|
48
48
|
- A detail with relationships renders one content-fitted `Components` footer selector: `Uses` links to direct dependencies and `Used By` links to reverse dependents. Its popup owns the standard surface inset so headings and even long component names stay clear of the menu border. Choosing either navigates to that component's demo. The relationship group is absent when both sets are empty; no duplicate summary is rendered.
|
|
49
|
-
- Focused demos ship no local stylesheets, inline styles, or styling-only class names. They compose Kerf components first
|
|
50
|
-
- Scenarios use deterministic data and cover real variants, long content, disabled state, selection, progress, feedback, overlays, media, helpers, and stateful interactions. Individual Web Awesome action, form, layout, navigation, feedback, media, and helper routes provide focused theme specimens without a redundant aggregate route; ListItem and ListHeader demonstrate typed domain metadata, protected native button/disclosure semantics, and a native popover trigger relationship without product props; the Headers composition demonstrates direct toolbar headings with an extra-large title, optional supporting copy, and grouped icon/actions; the Select route verifies that option icons survive unrelated Kerf rerenders and selected slot content follows value changes; the Animation route exposes preset, easing, duration, playback-rate, and transport controls with live lifecycle status; observer routes provide user-driven intersection, mutation, and resize events with live results; ToolbarControlGroup exposes all eight Hot Sheet 2 variants, loads the
|
|
49
|
+
- Focused demos ship no local stylesheets, inline styles, or styling-only class names. They compose Kerf components first and ordinary semantic HTML for the remainder; a non-discouraged Web Awesome element appears only where neither fits. The catalog-owned `CatalogExample.viewport` contract supplies the few specimen constraints needed to demonstrate layout behavior. Recipes follow the same rule: they ship no stylesheets, inline styles, or styling-only classes, and the catalog frames each one in the `CatalogExample` viewport its exported `presentation` declares (full-width application arrangements span the canvas measure; narrower recipes sit in the left-aligned example column). Demo-only CSS is limited to the document-shell `style.css`, which carries no recipe rules. Decorative chrome and Web Awesome controls share the same semantic system palette instead of carrying a separate demo identity.
|
|
50
|
+
- Scenarios use deterministic data and cover real variants, long content, disabled state, selection, progress, feedback, overlays, media, helpers, and stateful interactions. Individual Web Awesome action, form, layout, navigation, feedback, media, and helper routes provide focused theme specimens without a redundant aggregate route; ListItem and ListHeader demonstrate typed domain metadata, protected native button/disclosure semantics, and a native popover trigger relationship without product props; the Headers composition demonstrates direct toolbar headings with an extra-large title, optional supporting copy, and grouped icon/actions; the Select route verifies that option icons survive unrelated Kerf rerenders and selected slot content follows value changes; the Animation route exposes preset, easing, duration, playback-rate, and transport controls with live lifecycle status; observer routes provide user-driven intersection, mutation, and resize events with live results; ToolbarControlGroup exposes all eight Hot Sheet 2 variants, loads the registrations needed by its popup specimen, and keeps an open PopupMenu's state across Kerf rerenders; the Toolbar route composes a collapsible SearchField inside a group, animates between the empty iconic and complete field states, stays open while populated, and focuses the revealed editor; SegmentedControl covers toolbar, rounded-rectangle, pill, equal-width, and disabled presentations; SearchField covers editable ordered chips, pointer and keyboard removal, caret-preserving controlled deletion, editing, clearing, free text, disabled state, and fixed first-line alignment while content wraps; StateBanner exposes every built-in tone with tone-tinted badges, a scoped override, and a placeholder with and without a badge, the badged placeholder in every tone so captures cover the solid badge skeleton; the Application tabs composition uses a Web Awesome card with semantic header/footer slots and Kerf `Text` while demonstrating overflow, edge autoscroll, and controlled pointer/keyboard reordering.
|
|
51
51
|
- The ToolbarControlGroup route also demonstrates the public compact/tight,
|
|
52
52
|
mixed-content, filled-selection, nested-dropdown, and avatar/scrim contracts
|
|
53
53
|
added for consumers that previously restyled group descendants. The compact
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# Moving an application off Web Awesome
|
|
2
|
+
|
|
3
|
+
Kerf UI no longer needs Web Awesome. Every Kerf component renders native
|
|
4
|
+
elements and reads only `--kui-*` tokens, so an application built only from
|
|
5
|
+
Kerf components installs nothing else. Web Awesome remains an optional
|
|
6
|
+
[integration](./component-selection.md#web-awesome-integration) for an
|
|
7
|
+
application that wants one of its specialized elements.
|
|
8
|
+
|
|
9
|
+
This guide moves an existing application from the Web Awesome elements Kerf
|
|
10
|
+
now replaces to the Kerf components, then, if nothing else needs it, removes
|
|
11
|
+
Web Awesome entirely.
|
|
12
|
+
|
|
13
|
+
## 1. Replace each element
|
|
14
|
+
|
|
15
|
+
Work one element type at a time. Each Kerf component takes typed props, emits
|
|
16
|
+
standard DOM events, and keeps its state in native form controls, so a
|
|
17
|
+
delegated `input` / `change` / `click` handler usually keeps working once the
|
|
18
|
+
selector changes.
|
|
19
|
+
|
|
20
|
+
| Web Awesome markup | Kerf replacement | Notes |
|
|
21
|
+
| ------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
22
|
+
| `<wa-button variant="brand">Save</wa-button>` | `<Button tone="brand" action="save">Save</Button>` (`@kerfjs/ui/button`) | `tone` replaces `variant`; `emphasis` replaces `appearance`. Use `href` for a link button, `icon` with `ariaLabel` and no label for an icon-only one, and `pressed` for a toggle. |
|
|
23
|
+
| `<wa-input label="Name" hint="…" with-clear>` | `<TextField label="Name" hint="…" clearable />` (`@kerfjs/ui/text-field`) | Call `wireTextFields(root)` from `@kerfjs/ui/wire-text-fields` once for the clear button and a live `showCount`. Pass `error` for an invalid field. |
|
|
24
|
+
| `<wa-textarea rows="4" resize="auto">` | `<TextField multiline rows={4} maxRows={10} />` | `maxRows` grows the field with its content up to that height. |
|
|
25
|
+
| `<wa-checkbox>Email me</wa-checkbox>` | `<Checkbox label="Email me" action="toggle-email" />` (`@kerfjs/ui/checkbox`) | For a mixed parent, pass `indeterminate` and call `wireCheckboxes(root)` from `@kerfjs/ui/wire-checkboxes` once. |
|
|
26
|
+
| `<wa-checkbox-group>` | `Checkbox` rows in a `List`, or `ChoiceChips` with `multiple="toggle"` | |
|
|
27
|
+
| `<wa-radio-group label="Density"><wa-radio value="compact">…` | `<RadioGroup label="Density" name="density" value={density.value} choices={[{ value: 'compact', label: 'Compact' }]} />` | `@kerfjs/ui/radio-group`. Use `orientation="horizontal"` for a row. Use `SegmentedControl` for a view switch and `ChoiceChips` for wrapping pills. |
|
|
28
|
+
| `<wa-switch>Live updates</wa-switch>` | `<Switch label="Live updates" checked={live.value} action="toggle-live" />` (`@kerfjs/ui/switch`) | Only for a setting that applies immediately; use `Checkbox` for a submitted option. |
|
|
29
|
+
| `<wa-select>` with `<wa-option>` children | `<Select label="Status" name="status" value={status.value} choices={[…]} />` (`@kerfjs/ui/select`) | Import `@kerfjs/ui/select/register` once. It emits standard `input` and `change` events. |
|
|
30
|
+
| `<wa-dropdown>` with `<wa-dropdown-item>` commands | `<PopupMenu label="More Actions" icon={…} items={[{ label: 'Archive', action: 'archive' }]} />` (`@kerfjs/ui/popup-menu`) | Import `@kerfjs/ui/popup-menu/register` once. A dropdown that picks a value becomes a `Select`. |
|
|
31
|
+
| `<wa-dialog label="Edit">` and toggling `open` | `<DialogSurface id="edit" label="Edit" footer={…}>…</DialogSurface>` with `openDialog(dialog)` / `closeDialog(dialog)` | From `@kerfjs/ui/surface-scaffold`. The surface is a native `<dialog>`; listen for its native `close` event instead of `wa-after-hide`. Never toggle the `open` attribute. |
|
|
32
|
+
| `<wa-drawer>` | `<DialogSurface presentation="side-sheet" …>` (or `"bottom-sheet"`), or `CollapsiblePanel` for a collapsible rail | |
|
|
33
|
+
| `<wa-tab-group>`, `<wa-tab>`, `<wa-tab-panel>` | `TabBar` with `wireTabBars` (`@kerfjs/ui/tab-bar`), or `SegmentedControl` for compact local views | The application owns its panels. |
|
|
34
|
+
| `<wa-tag with-remove>` | `<Chip removeAction="remove-tag">Design</Chip>` (`@kerfjs/ui/chip`) | |
|
|
35
|
+
| `<wa-badge>`, `<wa-spinner>`, `<wa-skeleton>` | `Badge`, `LoadingSpinner`, `Skeleton` | |
|
|
36
|
+
| `<wa-icon name="…">` | `<LucideIcon icon={Star} name="star" />` (`@kerfjs/ui/lucide-icon`) | |
|
|
37
|
+
| `<wa-split-panel>` | `ResizableRegion` with `wireResizableRegions` | |
|
|
38
|
+
| `<wa-card>` | `<ContentItem appearance="surface" frame="framed">` (`@kerfjs/ui/content-item`), or `SunkenPanel` for a lowered region | |
|
|
39
|
+
| `<wa-page>` | `Workbench`, `SplitView`, `NavStack`, or `TabNavigator` | |
|
|
40
|
+
| `<wa-details>`, `<wa-accordion>`, `<wa-accordion-item>` | `<Disclosure title="…">` (`@kerfjs/ui/disclosure`) | Give Disclosures the same `name` for an accordion. The open state is native: set `element.open = false` to close one from code. |
|
|
41
|
+
| `<wa-slider>` | `<Slider id="…" label="…" value={…} />` (`@kerfjs/ui/slider`) | Add `showValue`/`unit` for a readout and `ticks` for stops; call `wireSliders(root)` once. |
|
|
42
|
+
| `<wa-tag-input>` | `<TagField id="…" label="…" tags={…} name="…" />` (`@kerfjs/ui/tag-field`) | Call `wireTagFields(root, { onChange })` once and re-render with the reported tags. |
|
|
43
|
+
| `<wa-color-picker>` | `<ColorField id="…" label="…" value={…} />` (`@kerfjs/ui/color-field`) |
|
|
44
|
+
| `<wa-include src="…">` | `resource()` from `kerfjs/async`, rendering the result as Kerf content | Never inject fetched markup; it bypasses kerf's `SafeHtml` escaping. |
|
|
45
|
+
| `<wa-scroller>` | A `Pane` (scroll edges via `wireScrollDividers`) or `ColumnTrack` for a horizontal track | |
|
|
46
|
+
| `<wa-button-group>` | `ToolbarControlGroup` or `SplitButton` for actions, `SegmentedControl` for a choice | |
|
|
47
|
+
| `<wa-progress-bar value="40">`, `<wa-progress-ring>` | `<ProgressBar label="…" value={0.4} />` (`@kerfjs/ui/progress-bar`) or `<ProgressRing label="…" value={0.4} />` (`@kerfjs/ui/progress-ring`) | Omit `value` for indeterminate progress; `valueText` replaces the spoken percentage. |
|
|
48
|
+
| `<wa-popover>`, `<wa-popup>` | `openAnchoredSurface(anchor, render, { label })` (`@kerfjs/ui/anchored-surface`); `positionAnchored()` or `autoReposition()` from `kerfjs/overlay` to place another element | `openAnchoredSurfaceAt` anchors to the pointer. |
|
|
49
|
+
| `<wa-tooltip>` | `tooltip()` from `kerfjs/overlay` with `@kerfjs/ui/overlay-tooltip.css` imported | Icon-only toolbar and popup controls already get Kerf help tags. Pass `exitClass: 'kui-tooltip-exit'` with `exitDuration: 100`. |
|
|
50
|
+
| `<wa-callout>` | `<StateBanner tone="warning" …>` (`@kerfjs/ui/state-banner`) | |
|
|
51
|
+
| `<wa-toast>`, `<wa-toast-item>` | `toast()` from `kerfjs/overlay` with `@kerfjs/ui/overlay-toast.css` imported | Pass `variant` for a tone, a `StateBanner` as the content for a title and detail, and `exitClass: 'kui-toast-exit'` with `exitDuration: 200`. A persistent status stays a `StateBanner` in place. |
|
|
52
|
+
|
|
53
|
+
Event and selector changes to look for:
|
|
54
|
+
|
|
55
|
+
- Replace listeners for Web Awesome events (`wa-change`, `wa-input`,
|
|
56
|
+
`wa-show`, `wa-after-hide`) with the standard events the native controls
|
|
57
|
+
emit (`change`, `input`, `toggle`, `close`).
|
|
58
|
+
- Replace selectors that name a `wa-*` tag with the component's `data-action`
|
|
59
|
+
or a stable application attribute passed through `rootAttributes`.
|
|
60
|
+
- Delete application CSS that styled `wa-*` parts with `::part()`; configure the
|
|
61
|
+
Kerf component through its props instead.
|
|
62
|
+
|
|
63
|
+
`npx kerf-ui-doctor` and the `eslint-plugin-kerfjs` `recommended-ui` rules flag
|
|
64
|
+
remaining `Discouraged` elements.
|
|
65
|
+
|
|
66
|
+
## 2. Remove Web Awesome
|
|
67
|
+
|
|
68
|
+
Once no `wa-*` element remains in the application:
|
|
69
|
+
|
|
70
|
+
1. Delete every `@awesome.me/webawesome/dist/components/…` registration import.
|
|
71
|
+
2. Delete the `@kerfjs/ui/webawesome.css` import and any
|
|
72
|
+
`import type {} from "@kerfjs/ui/webawesome"` line.
|
|
73
|
+
3. Remove `@awesome.me/webawesome` from `package.json`.
|
|
74
|
+
4. Keep `@kerfjs/ui/foundation.css` (or your theme entry). Its tokens fall back
|
|
75
|
+
to the same values the Web Awesome theme gave them, so the application
|
|
76
|
+
renders identically.
|
|
77
|
+
|
|
78
|
+
If the application keeps a few specialized elements (Tree, Carousel, Rating,
|
|
79
|
+
and so on), keep steps 1–3 only for those elements; the integration's theme
|
|
80
|
+
bridge keeps them visually consistent with Kerf.
|
package/docs/webawesome-theme.md
CHANGED
|
@@ -1,8 +1,32 @@
|
|
|
1
1
|
# Web Awesome theme contract
|
|
2
2
|
|
|
3
|
-
`@kerfjs/ui/webawesome.css` is the optional bridge between Web Awesome 3
|
|
3
|
+
`@kerfjs/ui/webawesome.css` is the optional bridge between Web Awesome 3's
|
|
4
4
|
free components and the Kerf/Hot Sheet 2 design system.
|
|
5
5
|
|
|
6
|
+
**Optional by design.** No Kerf component needs Web Awesome or this bridge.
|
|
7
|
+
`@awesome.me/webawesome` is an optional peer, and `@kerfjs/ui/webawesome.css`
|
|
8
|
+
(with the type-only `@kerfjs/ui/webawesome`) is the only entry that touches
|
|
9
|
+
it. `foundation.css` has no `wa-*` selectors; its tokens may read a Web
|
|
10
|
+
Awesome theme variable (`--kui-font-m: var(--wa-font-size-m, 16px)`), so an
|
|
11
|
+
app's Web Awesome theme also restyles Kerf, but every such read falls back to
|
|
12
|
+
the value this theme gives it. A Kerf-only application therefore renders
|
|
13
|
+
exactly like the catalog. Kerf component stylesheets read only `--kui-*`
|
|
14
|
+
tokens; the few rules that place a raw `wa-*` child inside a Kerf container
|
|
15
|
+
match nothing when Web Awesome is absent. The consumer-bundle tests and the
|
|
16
|
+
`webawesome-optional` browser spec enforce all of this.
|
|
17
|
+
|
|
18
|
+
**Supported versions.** `@kerfjs/ui` supports every Web Awesome 3.x release
|
|
19
|
+
from 3.14 (its optional peer range is `^3.14.0`). No Kerf component patches
|
|
20
|
+
Web Awesome's internals any more: `PopupMenu`, `Select`, and `DialogSurface`
|
|
21
|
+
draw their own native controls, so an upgrade within 3.x reaches only this
|
|
22
|
+
theme and the Web Awesome elements an application renders itself. The
|
|
23
|
+
package's own tests run against 3.14.0 (the lockfile), and CI's
|
|
24
|
+
`ui-webawesome-latest` job runs the ui unit and Chromium browser suites
|
|
25
|
+
against the newest 3.x (`npm run test:webawesome-latest`). That job reports,
|
|
26
|
+
rather than fails on, elements a newer Web Awesome adds that the catalog has
|
|
27
|
+
not reviewed yet, and a demo bundle over the budget recorded for the lockfile;
|
|
28
|
+
a cataloged element that disappears upstream still fails.
|
|
29
|
+
|
|
6
30
|
```ts
|
|
7
31
|
import type {} from "@kerfjs/ui/webawesome";
|
|
8
32
|
import "@kerfjs/ui/webawesome.css";
|
|
@@ -219,7 +243,7 @@ badge or containing scope when a product needs a different contrast-safe pair,
|
|
|
219
243
|
or `--kui-wa-badge-accent-foreground` for a reviewed accent foreground.
|
|
220
244
|
Breadcrumb has no bordered or filled container, and Scroller delegates item chrome
|
|
221
245
|
to its slotted children, so both retain their upstream geometry. Web Awesome
|
|
222
|
-
3.
|
|
246
|
+
3.14's free catalog has
|
|
223
247
|
`wa-dropdown-item`, but no `wa-menu-item`; the theme therefore styles the
|
|
224
248
|
supported dropdown item rather than carrying a dead selector.
|
|
225
249
|
|
|
@@ -244,6 +268,11 @@ That scale applies to each Web Awesome component's intrinsic glyph and is
|
|
|
244
268
|
independent of Kerf `DisclosureArrow`, whose default box is 18px relative to
|
|
245
269
|
the root font size and whose consumer override is its typed `size` prop.
|
|
246
270
|
|
|
271
|
+
A loading step that is also the active `wa-stepper` step draws its spinner in
|
|
272
|
+
the marker's on-accent foreground. Upstream colors that spinner with the same
|
|
273
|
+
accent that fills an active marker, which would leave a blank disc; the theme
|
|
274
|
+
corrects it through the public `spinner` part.
|
|
275
|
+
|
|
247
276
|
Tooltip and Popover use arrowless floating surfaces by default, matching Hot
|
|
248
277
|
Sheet 2. The theme sets Web Awesome's public `--wa-tooltip-arrow-size` token to
|
|
249
278
|
`0px` and maps each popover's public `--arrow-size` property from
|
|
@@ -318,36 +347,30 @@ static content and labels that constraint next to the rendered output.
|
|
|
318
347
|
|
|
319
348
|
## Component selection guidance
|
|
320
349
|
|
|
321
|
-
The catalog lists every free Web Awesome component so
|
|
322
|
-
listing does not make
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
and `SegmentedControl` for compact local views, instead of Web Awesome Tab,
|
|
341
|
-
Tab Group, and Tab Panel.
|
|
350
|
+
The catalog lists every free Web Awesome component so an integration
|
|
351
|
+
application can inspect support; listing does not make any of them the
|
|
352
|
+
preferred Kerf pattern. Kerf components and native elements come first. The
|
|
353
|
+
[integration table](./component-selection.md#web-awesome-integration) names the
|
|
354
|
+
Kerf choice for every overlapping element, and the
|
|
355
|
+
[migration guide](./webawesome-migration.md) shows how to move an existing
|
|
356
|
+
application off them.
|
|
357
|
+
|
|
358
|
+
- Elements a Kerf component replaces are tagged `Discouraged` in the catalog:
|
|
359
|
+
Button, Dropdown, Dropdown Item, Button Group, Input, Textarea, Tag,
|
|
360
|
+
Checkbox, Checkbox Group, Radio, Radio Group, Switch, Select, Option,
|
|
361
|
+
Dialog, Drawer, Card, Page, Callout, Popover, Popup, Tab, Tab Group, Tab
|
|
362
|
+
Panel, Badge, Spinner, Skeleton, Toast, Toast Item, Tooltip, Details, Accordion,
|
|
363
|
+
Accordion Item, Progress Bar, Progress Ring, Slider, Tag Input, Color Picker,
|
|
364
|
+
Split Panel, Icon, Scroller, Include, and Zoomable Frame.
|
|
365
|
+
Never render them in application markup. Popover and Popup give way to
|
|
366
|
+
`AnchoredSurface` and `kerfjs/overlay`'s `positionAnchored()`; Tooltip,
|
|
367
|
+
Toast, and Toast Item give way to `kerfjs/overlay`'s `tooltip()` and
|
|
368
|
+
`toast()` with their Kerf stylesheets.
|
|
342
369
|
- Use Web Awesome Tree, Tree Item, Animated Image, and Comparison only for a
|
|
343
370
|
specific product requirement that needs their specialized behavior.
|
|
344
|
-
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
application panes. It provides the persistent 1px separator, hover/focus
|
|
348
|
-
grip, accessible keyboard and pointer resizing, controlled size, collapse
|
|
349
|
-
support, and application-owned persistence. Use Split Panel only when its
|
|
350
|
-
distinct Web Awesome API is itself required.
|
|
371
|
+
- Use the remaining supported elements (Carousel, Rating, and
|
|
372
|
+
the rest of the coverage list) when their native semantic contract matches
|
|
373
|
+
the product need and the application has adopted the integration.
|
|
351
374
|
|
|
352
375
|
## Customization
|
|
353
376
|
|
|
@@ -368,11 +391,10 @@ smallest subtree that needs a different identity:
|
|
|
368
391
|
}
|
|
369
392
|
```
|
|
370
393
|
|
|
371
|
-
|
|
372
|
-
`--
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
tokens keep it aligned with a neighboring `wa-input` when a form theme changes.
|
|
394
|
+
Kerf components read only `--kui-*` tokens. `SearchField` with
|
|
395
|
+
`presentation="form-field"` follows `--kui-layout-rounded-radius` for its
|
|
396
|
+
corners, as `TextField`, `Select`, and `Button` do, so the fields in a form
|
|
397
|
+
change together.
|
|
376
398
|
|
|
377
399
|
The shipped theme pairs every `--wa-color-{variant}-fill-loud` with an
|
|
378
400
|
`--wa-color-{variant}-on-loud` that clears WCAG AA (4.5:1) in both color
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# Workbench dialog
|
|
2
|
+
|
|
3
|
+
`@kerfjs/ui/workbench-dialog` is the modal form of a `Workbench`: a work area
|
|
4
|
+
with side rails (layers, an inspector) inside a dialog. It is one of three
|
|
5
|
+
dialog types:
|
|
6
|
+
|
|
7
|
+
| Type | Use it for |
|
|
8
|
+
| ------------------------------------------------------------------- | -------------------------------------------------------- |
|
|
9
|
+
| `DialogSurface` ([surface-scaffold.md](surface-scaffold.md)) | One pane: a title, a body, and footer buttons. |
|
|
10
|
+
| `ListDetailDialog` ([list-detail-dialog.md](list-detail-dialog.md)) | Pick a record from a list and show its detail beside it. |
|
|
11
|
+
| `WorkbenchDialog` (this page) | An editing task with side panels. |
|
|
12
|
+
|
|
13
|
+
```tsx
|
|
14
|
+
import { deviceClass } from "@kerfjs/ui/device-class";
|
|
15
|
+
import { openDialog, WorkbenchDialog } from "@kerfjs/ui/workbench-dialog";
|
|
16
|
+
import { wireWorkbench } from "@kerfjs/ui/wire-workbench";
|
|
17
|
+
|
|
18
|
+
const device = deviceClass();
|
|
19
|
+
const layersHidden = signal(false);
|
|
20
|
+
|
|
21
|
+
<WorkbenchDialog
|
|
22
|
+
id="edit-slide"
|
|
23
|
+
label="Edit Slide"
|
|
24
|
+
title="Edit Slide"
|
|
25
|
+
compact={device.value.compact}
|
|
26
|
+
main={<SlideCanvas />}
|
|
27
|
+
mainBottomToolbar={{ label: "Slide Actions", trailing: <SaveButtons /> }}
|
|
28
|
+
leftRail={{
|
|
29
|
+
label: "Layers",
|
|
30
|
+
collapsed: layersHidden.value,
|
|
31
|
+
toolbar: {
|
|
32
|
+
label: "Layers",
|
|
33
|
+
title: <ToolbarText text="Layers" />,
|
|
34
|
+
toggle: { action: "toggle-layers", name: "Layers" },
|
|
35
|
+
},
|
|
36
|
+
content: <LayerList />,
|
|
37
|
+
}}
|
|
38
|
+
/>;
|
|
39
|
+
|
|
40
|
+
wireWorkbench(root, {
|
|
41
|
+
id: "edit-slide-workbench",
|
|
42
|
+
panels: { leftRail: { collapsed: layersHidden } },
|
|
43
|
+
});
|
|
44
|
+
openDialog(document.getElementById("edit-slide"));
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## Layout
|
|
48
|
+
|
|
49
|
+
The dialog draws no surface header and no body inset. Its body is a
|
|
50
|
+
`Workbench` (`<id>-workbench`):
|
|
51
|
+
|
|
52
|
+
- **The work area's toolbar** carries the dialog's primary title (an xl
|
|
53
|
+
level-2 heading, id `<id>-title`) with an optional `description`, any
|
|
54
|
+
`leading` groups, the `actions`, and the close control. Close stays the
|
|
55
|
+
outermost trailing control, after a hidden right rail's toggle.
|
|
56
|
+
- **The rails** (`leftRail`, `rightRail`) keep their own toolbars, with
|
|
57
|
+
default-size titles, and run the dialog's full height. A hidden rail's
|
|
58
|
+
toggle relocates into the work area's toolbar.
|
|
59
|
+
- **The bottom** of the work area takes `mainFooter` and a
|
|
60
|
+
`mainBottomToolbar` for the dialog's buttons; `bottomDrawer` adds a drawer
|
|
61
|
+
under the work area.
|
|
62
|
+
|
|
63
|
+
## Compact devices
|
|
64
|
+
|
|
65
|
+
Pass `compact` from `deviceClass().value.compact`. The dialog fills the
|
|
66
|
+
screen, and each rail presents as an overlay over the work area instead of
|
|
67
|
+
narrowing it. Start the rails collapsed on compact devices; their toolbar
|
|
68
|
+
toggles show them. With `wireWorkbench` and each rail's `collapsed` signal,
|
|
69
|
+
an open rail takes focus, keeps Tab inside it, and closes on Escape or a press
|
|
70
|
+
outside it. Escape closes an open rail before the dialog sees it; a second
|
|
71
|
+
Escape closes the dialog.
|
|
72
|
+
|
|
73
|
+
## Props
|
|
74
|
+
|
|
75
|
+
- `id`, `label` (required): identity and the dialog's accessible name.
|
|
76
|
+
- `title` (required), `description`, `leading`, `actions`.
|
|
77
|
+
- `main` (required), `mainFooter`, `mainBottomToolbar`.
|
|
78
|
+
- `leftRail`, `rightRail`, `bottomDrawer`: `WorkbenchPanel`s.
|
|
79
|
+
- `compact`, `closeLabel` (default `Close`), `lightDismiss`.
|
|
80
|
+
- Roomy sizing: `size` (default `large`), `preferredWidth`, `height` (default
|
|
81
|
+
560px), `maxHeight`, `viewportGutter`, and `mainMinSize`.
|
|
82
|
+
- `rootAttributes`, `className`, `slot`.
|
|
83
|
+
|
|
84
|
+
Open and close it like any dialog surface with `openDialog()` and
|
|
85
|
+
`closeDialog()`, which this module re-exports.
|
package/docs/workbench.md
CHANGED
|
@@ -95,8 +95,9 @@ an optional `label`. Common shell behavior is configured rather than restyled:
|
|
|
95
95
|
- `collapseMotion: "slide" | "fade-slide" | "none"` keeps the track change
|
|
96
96
|
instant while choosing composited content motion;
|
|
97
97
|
- `contentOverflow: "clip" | "auto" | "visible"` chooses the resting overflow
|
|
98
|
-
policy.
|
|
99
|
-
|
|
98
|
+
policy. A `PopupMenu` opens in the browser top layer, which no clipping
|
|
99
|
+
reaches; an open raw Web Awesome dropdown temporarily releases rail/drawer
|
|
100
|
+
clipping and raises its popup layer automatically;
|
|
100
101
|
- `presentation: "inline" | "overlay" | "hidden"` supports compact overlays
|
|
101
102
|
or a responsive replacement. An overlay rail spans the Workbench height at
|
|
102
103
|
its side and an overlay drawer spans the work-area column at the bottom,
|
|
@@ -232,9 +233,12 @@ While a panel is closed, marked groups follow their open-panel zone order
|
|
|
232
233
|
| Panel | Where they go |
|
|
233
234
|
| ------------- | --------------------------------------------------------------------------------------------------------------- |
|
|
234
235
|
| Left rail | The leading edge of `mainToolbar`, before its `title` |
|
|
235
|
-
| Right rail | The trailing edge of `mainToolbar`, after its `trailing` groups
|
|
236
|
+
| Right rail | The trailing edge of `mainToolbar`, after its `trailing` groups and before any `end` groups |
|
|
236
237
|
| Bottom drawer | The trailing edge of `mainBottomToolbar`; without one, a `FloatingToolbar` in the work area's bottom-end corner |
|
|
237
238
|
|
|
239
|
+
`mainToolbar.end` takes groups that stay outermost, after a closed right
|
|
240
|
+
rail's toggle, such as a dialog's close control (`WorkbenchDialog` uses it).
|
|
241
|
+
|
|
238
242
|
A rail with no `mainToolbar` floats its groups in its corner the same way, so
|
|
239
243
|
a closed panel can always be reopened. An open overlay panel carries its own
|
|
240
244
|
toggle, so it never depends on a control it covers. An app's own
|
|
@@ -612,9 +616,9 @@ collapse slides it out at the resized width. A collapsed,
|
|
|
612
616
|
overlay, or hidden region is not resizeable. Together these policies replace
|
|
613
617
|
app CSS for separator suppression, instant-track/composited-content collapse,
|
|
614
618
|
popup overflow, mobile overlay/hidden replacement, resize-transition guards,
|
|
615
|
-
and safe-area restore placement. A descendant `PopupMenu`
|
|
616
|
-
dropdown with `open` releases clipping for its
|
|
617
|
-
not rerender the region. The app still owns the other signals and decides when
|
|
619
|
+
and safe-area restore placement. A descendant `PopupMenu` shows in the top
|
|
620
|
+
layer, and a raw Web Awesome dropdown with `open` releases clipping for its
|
|
621
|
+
lifecycle, so menu events need not rerender the region. The app still owns the other signals and decides when
|
|
618
622
|
each policy applies.
|
|
619
623
|
|
|
620
624
|
## Public styling boundary
|
package/docs/writing.md
CHANGED
|
@@ -105,7 +105,7 @@ interpolated value keeps its own spelling. The covered props are:
|
|
|
105
105
|
- `PopupMenu` `text` and item and heading labels, including submenus;
|
|
106
106
|
- `SegmentedControl`, `Select`, and `TabNavigator` choice and tab labels;
|
|
107
107
|
- `NavStack` view titles and `backText`, and `SplitView` `backLabel`;
|
|
108
|
-
- `FieldLabel` text and the text of a `button
|
|
108
|
+
- `FieldLabel` text and the text of a `Button`, `button`, or `wa-button`;
|
|
109
109
|
- the `name` of a panel toolbar's `toggle: { action, name }`;
|
|
110
110
|
- region and landmark names: the `label` of `Pane`, `Workbench`, `Toolbar`,
|
|
111
111
|
`ToolbarControlGroup`, `TabBar`, `NavStack`, `CollapsiblePanel`,
|
|
@@ -114,15 +114,17 @@ interpolated value keeps its own spelling. The covered props are:
|
|
|
114
114
|
inside `Workbench`, `CollapsiblePanel`, and `NavStack` configuration, and
|
|
115
115
|
the `aria-label` of a landmark element (`section`, `nav`, `aside`, `main`,
|
|
116
116
|
`header`, `footer`, `form`, `search`) or landmark role;
|
|
117
|
-
- the `label`
|
|
118
|
-
`
|
|
119
|
-
|
|
120
|
-
`
|
|
121
|
-
|
|
117
|
+
- field and group labels: the `label` (or `ariaLabel`) of `TextField`,
|
|
118
|
+
`Select`, and `RadioGroup`, and, in an application using the optional Web
|
|
119
|
+
Awesome integration, the `label` of a raw `wa-input`, `wa-select`,
|
|
120
|
+
`wa-textarea`, or `wa-radio-group`;
|
|
121
|
+
- the accessible names of icon-only controls: an icon-only `Button`'s `ariaLabel`, `PopupMenu` `label`, `SplitButton`
|
|
122
|
+
`optionsLabel`, `SearchField` and `TextField` `clearLabel`, and the `aria-label` of a
|
|
122
123
|
`button` or `wa-button` whose only content is an icon.
|
|
123
124
|
|
|
124
|
-
The check never judges sentence-style surfaces (including `
|
|
125
|
-
`
|
|
125
|
+
The check never judges sentence-style surfaces (including `Checkbox` and
|
|
126
|
+
`Switch` labels, `RadioGroup` choice labels, `wa-checkbox`, `wa-switch`, and
|
|
127
|
+
`wa-radio` option text and the `LoadingSpinner` and
|
|
126
128
|
`Skeleton` status labels), interpolated or other dynamic values, or text
|
|
127
129
|
ending with `.`, `!`, or `?`. It skips a word joined to an interpolation, tokens containing digits, code, or paths, and
|
|
128
130
|
lowercase-led brands such as iOS. It does not report capitalized short words,
|
|
@@ -14,7 +14,8 @@ import { isUiTraversalExcluded } from '../traversal-exclusions.mjs';
|
|
|
14
14
|
// to known title-style props are read (a template literal's static words, never
|
|
15
15
|
// its interpolated values), so prose, descriptions, placeholders, tooltips,
|
|
16
16
|
// checkbox/switch option text, status lines, LoadingSpinner and Skeleton
|
|
17
|
-
// labels,
|
|
17
|
+
// labels, Checkbox/Switch labels and RadioGroup choice labels, and dynamic
|
|
18
|
+
// data are never judged. The check reports lowercase words title style capitalizes; it
|
|
18
19
|
// does not report capitalized short words, because Apple capitalizes a
|
|
19
20
|
// preposition of any length inside a phrasal verb ("Log In to the Server").
|
|
20
21
|
|
|
@@ -156,9 +157,9 @@ const titleStyleProps = new Map([
|
|
|
156
157
|
['StateBanner', { props: ['title'] }],
|
|
157
158
|
['SplitButton', { props: ['label', 'optionsLabel'] }],
|
|
158
159
|
['Combobox', { props: ['label'] }],
|
|
159
|
-
|
|
160
|
-
['
|
|
161
|
-
['
|
|
160
|
+
// An icon-only Button is named by ariaLabel; its visible text is read below.
|
|
161
|
+
['Button', { props: ['ariaLabel'] }],
|
|
162
|
+
['SearchField', { props: ['clearLabel'] }],
|
|
162
163
|
// NavStack view titles and backText, plus the stack's region name and each
|
|
163
164
|
// view's toolbar and pane region names.
|
|
164
165
|
[
|
|
@@ -174,7 +175,14 @@ const titleStyleProps = new Map([
|
|
|
174
175
|
['SplitView', { props: ['backLabel'] }],
|
|
175
176
|
['PopupMenu', { props: ['text', 'label'], entries: { items: ['label'] } }],
|
|
176
177
|
['SegmentedControl', { entries: { choices: ['label'] } }],
|
|
177
|
-
[
|
|
178
|
+
[
|
|
179
|
+
'Select',
|
|
180
|
+
{ props: ['label', 'ariaLabel'], entries: { choices: ['label'] } },
|
|
181
|
+
],
|
|
182
|
+
// Field and group labels. A Checkbox or Switch label and a RadioGroup
|
|
183
|
+
// choice label are option text, which is sentence style and not read.
|
|
184
|
+
['TextField', { props: ['label', 'ariaLabel', 'clearLabel'] }],
|
|
185
|
+
['RadioGroup', { props: ['label', 'ariaLabel'] }],
|
|
178
186
|
['TabNavigator', { entries: { tabs: ['label'] } }],
|
|
179
187
|
// Region and landmark names: the accessible name of a pane, toolbar,
|
|
180
188
|
// control group, list, tab bar, or layout region names it, so it is title
|
|
@@ -235,9 +243,10 @@ const landmarkRoles = new Set([
|
|
|
235
243
|
'form',
|
|
236
244
|
'search',
|
|
237
245
|
]);
|
|
238
|
-
// A raw Web Awesome field's or radio group's `label`
|
|
239
|
-
//
|
|
240
|
-
// and is not
|
|
246
|
+
// A raw Web Awesome field's or radio group's `label` (in an application using
|
|
247
|
+
// the optional integration) is a field label. The option text of
|
|
248
|
+
// `wa-checkbox`, `wa-switch`, and `wa-radio` is sentence style and is not
|
|
249
|
+
// read.
|
|
241
250
|
const fieldLabelTags = new Set([
|
|
242
251
|
'wa-input',
|
|
243
252
|
'wa-select',
|
|
@@ -245,7 +254,7 @@ const fieldLabelTags = new Set([
|
|
|
245
254
|
'wa-radio-group',
|
|
246
255
|
]);
|
|
247
256
|
const titleToolbarTextSizes = new Set(['xlarge', 'xlarge-fixed', 'large']);
|
|
248
|
-
const buttonTags = new Set(['button', 'wa-button']);
|
|
257
|
+
const buttonTags = new Set(['button', 'wa-button', 'Button']);
|
|
249
258
|
const titleSlots = new Set(['title', 'leading', 'header']);
|
|
250
259
|
const statusToolbarTextSizes = new Set(['small', 'xsmall']);
|
|
251
260
|
|