@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
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { filterDataAttributes } from './chunk-KH4KEMSP.js';
|
|
2
|
+
import { jsxs, jsx } from 'kerfjs/jsx-runtime';
|
|
3
|
+
|
|
4
|
+
var SWITCH_PROTECTED = /* @__PURE__ */ new Set(["data-component", "data-size"]);
|
|
5
|
+
function Switch({
|
|
6
|
+
label,
|
|
7
|
+
checked = false,
|
|
8
|
+
name,
|
|
9
|
+
value,
|
|
10
|
+
hint,
|
|
11
|
+
size = "default",
|
|
12
|
+
disabled = false,
|
|
13
|
+
action,
|
|
14
|
+
form,
|
|
15
|
+
id,
|
|
16
|
+
className = "",
|
|
17
|
+
rootAttributes = {},
|
|
18
|
+
slot
|
|
19
|
+
}) {
|
|
20
|
+
return /* @__PURE__ */ jsxs(
|
|
21
|
+
"div",
|
|
22
|
+
{
|
|
23
|
+
...filterDataAttributes(rootAttributes, SWITCH_PROTECTED),
|
|
24
|
+
class: `kui-switch ${className}`.trim(),
|
|
25
|
+
"data-component": "switch",
|
|
26
|
+
"data-size": size,
|
|
27
|
+
slot,
|
|
28
|
+
children: [
|
|
29
|
+
/* @__PURE__ */ jsxs("label", { class: "kui-switch__row", children: [
|
|
30
|
+
/* @__PURE__ */ jsxs("span", { class: "kui-switch__control", children: [
|
|
31
|
+
/* @__PURE__ */ jsx(
|
|
32
|
+
"input",
|
|
33
|
+
{
|
|
34
|
+
class: "kui-switch__input",
|
|
35
|
+
type: "checkbox",
|
|
36
|
+
role: "switch",
|
|
37
|
+
id,
|
|
38
|
+
name,
|
|
39
|
+
value,
|
|
40
|
+
form,
|
|
41
|
+
checked,
|
|
42
|
+
disabled,
|
|
43
|
+
"data-action": action,
|
|
44
|
+
"aria-description": hint
|
|
45
|
+
}
|
|
46
|
+
),
|
|
47
|
+
/* @__PURE__ */ jsx("span", { class: "kui-switch__track", "aria-hidden": "true", children: /* @__PURE__ */ jsx("span", { class: "kui-switch__thumb" }) })
|
|
48
|
+
] }),
|
|
49
|
+
/* @__PURE__ */ jsx("span", { class: "kui-switch__label", children: label })
|
|
50
|
+
] }),
|
|
51
|
+
hint === void 0 ? null : /* @__PURE__ */ jsx("span", { class: "kui-switch__hint", "aria-hidden": "true", children: hint })
|
|
52
|
+
]
|
|
53
|
+
}
|
|
54
|
+
);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export { Switch };
|
|
58
|
+
|
|
59
|
+
//# sourceMappingURL=chunk-LTBVP6VN.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/forms/switch/switch.tsx"],"names":[],"mappings":";;;AAKA,IAAM,mCAAmB,IAAI,GAAA,CAAI,CAAC,gBAAA,EAAkB,WAAW,CAAC,CAAA;AAqCzD,SAAS,MAAA,CAAO;AAAA,EACrB,KAAA;AAAA,EACA,OAAA,GAAU,KAAA;AAAA,EACV,IAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA,GAAO,SAAA;AAAA,EACP,QAAA,GAAW,KAAA;AAAA,EACX,MAAA;AAAA,EACA,IAAA;AAAA,EACA,EAAA;AAAA,EACA,SAAA,GAAY,EAAA;AAAA,EACZ,iBAAiB,EAAC;AAAA,EAClB;AACF,CAAA,EAAgB;AACd,EAAA,uBACE,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACE,GAAG,oBAAA,CAAqB,cAAA,EAAgB,gBAAgB,CAAA;AAAA,MACzD,KAAA,EAAO,CAAA,WAAA,EAAc,SAAS,CAAA,CAAA,CAAG,IAAA,EAAK;AAAA,MACtC,gBAAA,EAAe,QAAA;AAAA,MACf,WAAA,EAAW,IAAA;AAAA,MACX,IAAA;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAA,IAAA,CAAC,OAAA,EAAA,EAAM,OAAM,iBAAA,EACX,QAAA,EAAA;AAAA,0BAAA,IAAA,CAAC,MAAA,EAAA,EAAK,OAAM,qBAAA,EACV,QAAA,EAAA;AAAA,4BAAA,GAAA;AAAA,cAAC,OAAA;AAAA,cAAA;AAAA,gBACC,KAAA,EAAM,mBAAA;AAAA,gBACN,IAAA,EAAK,UAAA;AAAA,gBACL,IAAA,EAAK,QAAA;AAAA,gBACL,EAAA;AAAA,gBACA,IAAA;AAAA,gBACA,KAAA;AAAA,gBACA,IAAA;AAAA,gBACA,OAAA;AAAA,gBACA,QAAA;AAAA,gBACA,aAAA,EAAa,MAAA;AAAA,gBACb,kBAAA,EAAkB;AAAA;AAAA,aACpB;AAAA,4BACA,GAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAM,mBAAA,EAAoB,aAAA,EAAY,QAC1C,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAM,mBAAA,EAAoB,CAAA,EAClC;AAAA,WAAA,EACF,CAAA;AAAA,0BACA,GAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAM,mBAAA,EAAqB,QAAA,EAAA,KAAA,EAAM;AAAA,SAAA,EACzC,CAAA;AAAA,QACC,IAAA,KAAS,SAAY,IAAA,mBACpB,GAAA,CAAC,UAAK,KAAA,EAAM,kBAAA,EAAmB,aAAA,EAAY,MAAA,EACxC,QAAA,EAAA,IAAA,EACH;AAAA;AAAA;AAAA,GAEJ;AAEJ","file":"chunk-LTBVP6VN.js","sourcesContent":["import { filterDataAttributes } from '../../../shared/dom/extension-attributes.js';\n\n/** `default` is a 35×20 track beside 16px text; `compact` 31.5×18 and 14px. */\nexport type SwitchSize = 'default' | 'compact';\n\nconst SWITCH_PROTECTED = new Set(['data-component', 'data-size']);\n\n/** Application `data-*` metadata; the Switch's own markers stay protected. */\nexport type SwitchRootAttributes = Readonly<\n Record<`data-${string}`, string | undefined>\n>;\n\nexport interface SwitchProps {\n /** The visible label, which is also the switch's accessible name. */\n label: string;\n /** Whether the setting is on. */\n checked?: boolean;\n name?: string;\n /** The value submitted while on (native default `on`). */\n value?: string;\n /** Supporting text below the label, also the switch's description. */\n hint?: string;\n size?: SwitchSize;\n disabled?: boolean;\n /** Delegated `data-action` on the input; listen for `change`. */\n action?: string;\n /** Associate the input with a form outside its ancestor chain. */\n form?: string;\n /** The input's id. */\n id?: string;\n className?: string;\n /** Safe `data-*` metadata (a `data-key`). */\n rootAttributes?: SwitchRootAttributes;\n /** Native named-slot assignment when composed inside a web component. */\n slot?: string;\n}\n\n/**\n * An on/off setting that applies immediately: a native checkbox with\n * `role=\"switch\"`, drawn as a track and thumb beside its label, with an\n * optional hint aligned under the label.\n */\nexport function Switch({\n label,\n checked = false,\n name,\n value,\n hint,\n size = 'default',\n disabled = false,\n action,\n form,\n id,\n className = '',\n rootAttributes = {},\n slot,\n}: SwitchProps) {\n return (\n <div\n {...filterDataAttributes(rootAttributes, SWITCH_PROTECTED)}\n class={`kui-switch ${className}`.trim()}\n data-component=\"switch\"\n data-size={size}\n slot={slot}\n >\n <label class=\"kui-switch__row\">\n <span class=\"kui-switch__control\">\n <input\n class=\"kui-switch__input\"\n type=\"checkbox\"\n role=\"switch\"\n id={id}\n name={name}\n value={value}\n form={form}\n checked={checked}\n disabled={disabled}\n data-action={action}\n aria-description={hint}\n />\n <span class=\"kui-switch__track\" aria-hidden=\"true\">\n <span class=\"kui-switch__thumb\" />\n </span>\n </span>\n <span class=\"kui-switch__label\">{label}</span>\n </label>\n {hint === undefined ? null : (\n <span class=\"kui-switch__hint\" aria-hidden=\"true\">\n {hint}\n </span>\n )}\n </div>\n );\n}\n"]}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { filterDataAttributes } from './chunk-KH4KEMSP.js';
|
|
2
|
+
import { jsxs, jsx } from 'kerfjs/jsx-runtime';
|
|
3
|
+
|
|
4
|
+
var RADIO_GROUP_PROTECTED = /* @__PURE__ */ new Set([
|
|
5
|
+
"data-component",
|
|
6
|
+
"data-size",
|
|
7
|
+
"data-orientation",
|
|
8
|
+
"data-invalid"
|
|
9
|
+
]);
|
|
10
|
+
function RadioGroup({
|
|
11
|
+
label,
|
|
12
|
+
ariaLabel,
|
|
13
|
+
name,
|
|
14
|
+
choices,
|
|
15
|
+
value,
|
|
16
|
+
hint,
|
|
17
|
+
error,
|
|
18
|
+
size = "default",
|
|
19
|
+
orientation = "vertical",
|
|
20
|
+
required = false,
|
|
21
|
+
disabled = false,
|
|
22
|
+
action,
|
|
23
|
+
form,
|
|
24
|
+
id,
|
|
25
|
+
className = "",
|
|
26
|
+
rootAttributes = {},
|
|
27
|
+
slot
|
|
28
|
+
}) {
|
|
29
|
+
const description = [hint, error].filter(Boolean).join(" ") || void 0;
|
|
30
|
+
return /* @__PURE__ */ jsxs(
|
|
31
|
+
"fieldset",
|
|
32
|
+
{
|
|
33
|
+
...filterDataAttributes(rootAttributes, RADIO_GROUP_PROTECTED),
|
|
34
|
+
class: `kui-radio-group ${className}`.trim(),
|
|
35
|
+
"data-component": "radio-group",
|
|
36
|
+
"data-size": size,
|
|
37
|
+
"data-orientation": orientation,
|
|
38
|
+
"data-invalid": error ? "" : void 0,
|
|
39
|
+
id,
|
|
40
|
+
role: "radiogroup",
|
|
41
|
+
"aria-label": ariaLabel,
|
|
42
|
+
"aria-description": description,
|
|
43
|
+
"aria-invalid": error ? "true" : void 0,
|
|
44
|
+
"aria-required": required ? "true" : void 0,
|
|
45
|
+
disabled,
|
|
46
|
+
slot,
|
|
47
|
+
children: [
|
|
48
|
+
label === void 0 ? null : /* @__PURE__ */ jsx("legend", { class: "kui-radio-group__label", children: label }),
|
|
49
|
+
/* @__PURE__ */ jsx("span", { class: "kui-radio-group__choices", children: choices.map((choice) => /* @__PURE__ */ jsxs("span", { class: "kui-radio-group__choice", children: [
|
|
50
|
+
/* @__PURE__ */ jsxs("label", { class: "kui-radio-group__row", children: [
|
|
51
|
+
/* @__PURE__ */ jsxs("span", { class: "kui-radio-group__control", children: [
|
|
52
|
+
/* @__PURE__ */ jsx(
|
|
53
|
+
"input",
|
|
54
|
+
{
|
|
55
|
+
class: "kui-radio-group__input",
|
|
56
|
+
type: "radio",
|
|
57
|
+
name,
|
|
58
|
+
value: choice.value,
|
|
59
|
+
form,
|
|
60
|
+
checked: choice.value === value,
|
|
61
|
+
disabled: choice.disabled,
|
|
62
|
+
required,
|
|
63
|
+
"data-action": action,
|
|
64
|
+
"aria-description": choice.hint
|
|
65
|
+
}
|
|
66
|
+
),
|
|
67
|
+
/* @__PURE__ */ jsx("span", { class: "kui-radio-group__circle", "aria-hidden": "true" })
|
|
68
|
+
] }),
|
|
69
|
+
/* @__PURE__ */ jsx("span", { class: "kui-radio-group__choice-label", children: choice.label })
|
|
70
|
+
] }),
|
|
71
|
+
choice.hint === void 0 ? null : /* @__PURE__ */ jsx("span", { class: "kui-radio-group__choice-hint", "aria-hidden": "true", children: choice.hint })
|
|
72
|
+
] })) }),
|
|
73
|
+
hint === void 0 ? null : /* @__PURE__ */ jsx("span", { class: "kui-radio-group__hint", "aria-hidden": "true", children: hint }),
|
|
74
|
+
error === void 0 ? null : /* @__PURE__ */ jsx("span", { class: "kui-radio-group__error", "aria-hidden": "true", children: error })
|
|
75
|
+
]
|
|
76
|
+
}
|
|
77
|
+
);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export { RadioGroup };
|
|
81
|
+
|
|
82
|
+
//# sourceMappingURL=chunk-OHPYT2BH.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/forms/radio-group/radio-group.tsx"],"names":[],"mappings":";;;AAQA,IAAM,qBAAA,uBAA4B,GAAA,CAAI;AAAA,EACpC,gBAAA;AAAA,EACA,WAAA;AAAA,EACA,kBAAA;AAAA,EACA;AACF,CAAC,CAAA;AA0DM,SAAS,UAAA,CAAiC;AAAA,EAC/C,KAAA;AAAA,EACA,SAAA;AAAA,EACA,IAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA,GAAO,SAAA;AAAA,EACP,WAAA,GAAc,UAAA;AAAA,EACd,QAAA,GAAW,KAAA;AAAA,EACX,QAAA,GAAW,KAAA;AAAA,EACX,MAAA;AAAA,EACA,IAAA;AAAA,EACA,EAAA;AAAA,EACA,SAAA,GAAY,EAAA;AAAA,EACZ,iBAAiB,EAAC;AAAA,EAClB;AACF,CAAA,EAA2B;AACzB,EAAA,MAAM,WAAA,GAAc,CAAC,IAAA,EAAM,KAAK,CAAA,CAAE,OAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,IAAK,MAAA;AAC/D,EAAA,uBACE,IAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACE,GAAG,oBAAA,CAAqB,cAAA,EAAgB,qBAAqB,CAAA;AAAA,MAC9D,KAAA,EAAO,CAAA,gBAAA,EAAmB,SAAS,CAAA,CAAA,CAAG,IAAA,EAAK;AAAA,MAC3C,gBAAA,EAAe,aAAA;AAAA,MACf,WAAA,EAAW,IAAA;AAAA,MACX,kBAAA,EAAkB,WAAA;AAAA,MAClB,cAAA,EAAc,QAAQ,EAAA,GAAK,MAAA;AAAA,MAC3B,EAAA;AAAA,MACA,IAAA,EAAK,YAAA;AAAA,MACL,YAAA,EAAY,SAAA;AAAA,MACZ,kBAAA,EAAkB,WAAA;AAAA,MAClB,cAAA,EAAc,QAAQ,MAAA,GAAS,MAAA;AAAA,MAC/B,eAAA,EAAe,WAAW,MAAA,GAAS,MAAA;AAAA,MACnC,QAAA;AAAA,MACA,IAAA;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,KAAA,KAAU,SAAY,IAAA,mBACrB,GAAA,CAAC,QAAA,EAAA,EAAO,KAAA,EAAM,0BAA0B,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,wBAEhD,GAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAM,0BAAA,EACT,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,qBACZ,IAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAM,yBAAA,EACV,QAAA,EAAA;AAAA,0BAAA,IAAA,CAAC,OAAA,EAAA,EAAM,OAAM,sBAAA,EACX,QAAA,EAAA;AAAA,4BAAA,IAAA,CAAC,MAAA,EAAA,EAAK,OAAM,0BAAA,EACV,QAAA,EAAA;AAAA,8BAAA,GAAA;AAAA,gBAAC,OAAA;AAAA,gBAAA;AAAA,kBACC,KAAA,EAAM,wBAAA;AAAA,kBACN,IAAA,EAAK,OAAA;AAAA,kBACL,IAAA;AAAA,kBACA,OAAO,MAAA,CAAO,KAAA;AAAA,kBACd,IAAA;AAAA,kBACA,OAAA,EAAS,OAAO,KAAA,KAAU,KAAA;AAAA,kBAC1B,UAAU,MAAA,CAAO,QAAA;AAAA,kBACjB,QAAA;AAAA,kBACA,aAAA,EAAa,MAAA;AAAA,kBACb,oBAAkB,MAAA,CAAO;AAAA;AAAA,eAC3B;AAAA,8BACA,GAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAM,yBAAA,EAA0B,eAAY,MAAA,EAAO;AAAA,aAAA,EAC3D,CAAA;AAAA,4BACA,GAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAM,+BAAA,EAAiC,iBAAO,KAAA,EAAM;AAAA,WAAA,EAC5D,CAAA;AAAA,UACC,MAAA,CAAO,IAAA,KAAS,MAAA,GAAY,IAAA,mBAC3B,GAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAM,8BAAA,EAA+B,aAAA,EAAY,MAAA,EACpD,QAAA,EAAA,MAAA,CAAO,IAAA,EACV;AAAA,SAAA,EAEJ,CACD,CAAA,EACH,CAAA;AAAA,QACC,IAAA,KAAS,SAAY,IAAA,mBACpB,GAAA,CAAC,UAAK,KAAA,EAAM,uBAAA,EAAwB,aAAA,EAAY,MAAA,EAC7C,QAAA,EAAA,IAAA,EACH,CAAA;AAAA,QAED,KAAA,KAAU,SAAY,IAAA,mBACrB,GAAA,CAAC,UAAK,KAAA,EAAM,wBAAA,EAAyB,aAAA,EAAY,MAAA,EAC9C,QAAA,EAAA,KAAA,EACH;AAAA;AAAA;AAAA,GAEJ;AAEJ","file":"chunk-OHPYT2BH.js","sourcesContent":["import { filterDataAttributes } from '../../../shared/dom/extension-attributes.js';\n\n/** `default` is a 20px circle beside 16px text; `compact` 18px and 14px. */\nexport type RadioGroupSize = 'default' | 'compact';\n\n/** `vertical` stacks the choices; `horizontal` lines them up and wraps. */\nexport type RadioGroupOrientation = 'vertical' | 'horizontal';\n\nconst RADIO_GROUP_PROTECTED = new Set([\n 'data-component',\n 'data-size',\n 'data-orientation',\n 'data-invalid',\n]);\n\n/** Application `data-*` metadata; the RadioGroup's own markers stay protected. */\nexport type RadioGroupRootAttributes = Readonly<\n Record<`data-${string}`, string | undefined>\n>;\n\nexport interface RadioGroupChoice<Value extends string = string> {\n value: Value;\n /** Visible label; it is also the radio's accessible name. */\n label: string;\n /** Supporting text under this choice's label, also its description. */\n hint?: string;\n disabled?: boolean;\n}\n\n/** A group is named by a visible `label` (its legend) or by `ariaLabel`. */\nexport type RadioGroupName =\n { label: string; ariaLabel?: never } | { label?: never; ariaLabel: string };\n\nexport interface RadioGroupOptions<Value extends string = string> {\n /** Native input `name`: the form field the selected value submits under. */\n name: string;\n choices: readonly RadioGroupChoice<Value>[];\n /** The selected value. Omit for no selection. */\n value?: NoInfer<Value>;\n /** Supporting text below the choices, also the group's description. */\n hint?: string;\n /** A validation message: shown in the danger color and marking it invalid. */\n error?: string;\n size?: RadioGroupSize;\n orientation?: RadioGroupOrientation;\n /** Require a selection for native form validation. */\n required?: boolean;\n /** Disable the whole group. */\n disabled?: boolean;\n /** Delegated `data-action` on every radio; listen for `change`. */\n action?: string;\n /** Associate the radios with a form outside their ancestor chain. */\n form?: string;\n /** The fieldset's id. */\n id?: string;\n className?: string;\n /** Safe `data-*` metadata (a `data-key`). */\n rootAttributes?: RadioGroupRootAttributes;\n /** Native named-slot assignment when composed inside a web component. */\n slot?: string;\n}\n\nexport type RadioGroupProps<Value extends string = string> = RadioGroupName &\n RadioGroupOptions<Value>;\n\n/**\n * One exclusive choice among a few visible options: a native fieldset of\n * radios, each drawn as a Kerf circle beside its label, with the group label\n * above and hint and error text below. The browser owns the interaction: one\n * Tab stop, arrow keys move and select, and the checked value submits.\n */\nexport function RadioGroup<Value extends string>({\n label,\n ariaLabel,\n name,\n choices,\n value,\n hint,\n error,\n size = 'default',\n orientation = 'vertical',\n required = false,\n disabled = false,\n action,\n form,\n id,\n className = '',\n rootAttributes = {},\n slot,\n}: RadioGroupProps<Value>) {\n const description = [hint, error].filter(Boolean).join(' ') || undefined;\n return (\n <fieldset\n {...filterDataAttributes(rootAttributes, RADIO_GROUP_PROTECTED)}\n class={`kui-radio-group ${className}`.trim()}\n data-component=\"radio-group\"\n data-size={size}\n data-orientation={orientation}\n data-invalid={error ? '' : undefined}\n id={id}\n role=\"radiogroup\"\n aria-label={ariaLabel}\n aria-description={description}\n aria-invalid={error ? 'true' : undefined}\n aria-required={required ? 'true' : undefined}\n disabled={disabled}\n slot={slot}\n >\n {label === undefined ? null : (\n <legend class=\"kui-radio-group__label\">{label}</legend>\n )}\n <span class=\"kui-radio-group__choices\">\n {choices.map((choice) => (\n <span class=\"kui-radio-group__choice\">\n <label class=\"kui-radio-group__row\">\n <span class=\"kui-radio-group__control\">\n <input\n class=\"kui-radio-group__input\"\n type=\"radio\"\n name={name}\n value={choice.value}\n form={form}\n checked={choice.value === value}\n disabled={choice.disabled}\n required={required}\n data-action={action}\n aria-description={choice.hint}\n />\n <span class=\"kui-radio-group__circle\" aria-hidden=\"true\" />\n </span>\n <span class=\"kui-radio-group__choice-label\">{choice.label}</span>\n </label>\n {choice.hint === undefined ? null : (\n <span class=\"kui-radio-group__choice-hint\" aria-hidden=\"true\">\n {choice.hint}\n </span>\n )}\n </span>\n ))}\n </span>\n {hint === undefined ? null : (\n <span class=\"kui-radio-group__hint\" aria-hidden=\"true\">\n {hint}\n </span>\n )}\n {error === undefined ? null : (\n <span class=\"kui-radio-group__error\" aria-hidden=\"true\">\n {error}\n </span>\n )}\n </fieldset>\n );\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { verticalAlignment, horizontalAlignment } from './chunk-
|
|
1
|
+
import { verticalAlignment, horizontalAlignment } from './chunk-D4MXSAMI.js';
|
|
2
2
|
import { gapLength } from './chunk-MHMWQ7RB.js';
|
|
3
3
|
import { filterRootAttributes } from './chunk-KH4KEMSP.js';
|
|
4
4
|
import { jsx } from 'kerfjs/jsx-runtime';
|
|
@@ -16,6 +16,8 @@ var listProtectedAttributes = /* @__PURE__ */ new Set([
|
|
|
16
16
|
"data-frame",
|
|
17
17
|
"data-surface",
|
|
18
18
|
"data-inset",
|
|
19
|
+
"data-content-width",
|
|
20
|
+
"data-content-align",
|
|
19
21
|
"data-text-insets",
|
|
20
22
|
"data-control-insets"
|
|
21
23
|
]);
|
|
@@ -35,6 +37,8 @@ function List({
|
|
|
35
37
|
minHeight,
|
|
36
38
|
surface,
|
|
37
39
|
inset,
|
|
40
|
+
contentWidth,
|
|
41
|
+
contentAlign = "center",
|
|
38
42
|
dividerSides = "",
|
|
39
43
|
textInsets = "",
|
|
40
44
|
controlInsets = "",
|
|
@@ -80,6 +84,8 @@ function List({
|
|
|
80
84
|
"data-frame": frame ? "true" : void 0,
|
|
81
85
|
"data-surface": surface,
|
|
82
86
|
"data-inset": inset,
|
|
87
|
+
"data-content-width": contentWidth,
|
|
88
|
+
"data-content-align": contentWidth === void 0 ? void 0 : contentAlign,
|
|
83
89
|
"divider-sides": dividerSides || void 0,
|
|
84
90
|
"data-text-insets": textInsets || void 0,
|
|
85
91
|
"data-control-insets": controlInsets || void 0,
|
|
@@ -92,4 +98,4 @@ function List({
|
|
|
92
98
|
|
|
93
99
|
export { List };
|
|
94
100
|
|
|
95
|
-
//# sourceMappingURL=chunk-
|
|
101
|
+
//# sourceMappingURL=chunk-OY2MXIBB.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/collections/list/list.tsx"],"names":[],"mappings":"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","file":"chunk-OY2MXIBB.js","sourcesContent":["import type { KerfUiContent } from '../../../shared/content/semantic-content.js';\nimport {\n filterRootAttributes,\n type StructuralRootAttributes,\n} from '../../../shared/dom/extension-attributes.js';\nimport {\n type HorizontalAlignment,\n horizontalAlignment,\n type ListVerticalAlignment,\n verticalAlignment,\n} from '../../../shared/layout/flex-alignment.js';\nimport { gapLength } from '../../../shared/layout/gap.js';\nimport type { ScrollClearance } from '../../../shared/layout/scroll-clearance.js';\nimport type { Sides } from '../../../shared/layout/sides.js';\nimport {\n type CssFlex,\n type CssFlexKeyword,\n type CssLength,\n type UiGap,\n} from '../../../shared/styles/css-values.js';\n\n/** Attributes a multi-select List owns as an ARIA grid. */\nconst listGridAttributes = ['role', 'aria-label', 'aria-multiselectable'];\n\nconst listProtectedAttributes = new Set([\n 'data-component',\n 'data-gap',\n 'data-flex',\n 'data-fill',\n 'data-h-align',\n 'data-v-align',\n 'data-scrollable',\n 'data-scroll-clearance',\n 'data-frame',\n 'data-surface',\n 'data-inset',\n 'data-content-width',\n 'data-content-align',\n 'data-text-insets',\n 'data-control-insets',\n]);\n\ntype ListRootAttributes = StructuralRootAttributes &\n Readonly<{\n 'data-component'?: never;\n 'data-gap'?: never;\n 'data-flex'?: never;\n 'data-fill'?: never;\n 'data-h-align'?: never;\n 'data-v-align'?: never;\n 'data-scrollable'?: never;\n 'data-scroll-clearance'?: never;\n 'data-frame'?: never;\n 'data-surface'?: never;\n 'data-inset'?: never;\n 'data-content-width'?: never;\n 'data-content-align'?: never;\n 'data-text-insets'?: never;\n 'data-control-insets'?: never;\n }>;\n\n/**\n * A solid surface painted behind a List: `base` is the page surface\n * (`--kui-color-surface`), `raised` the raised surface\n * (`--kui-color-surface-raised`). A lowered region is a `SunkenPanel`.\n */\nexport type ListSurface = 'base' | 'raised';\n\n/**\n * A preset inset on all four sides. `document` is the reading inset for long\n * content such as a reader view: 24px block and 32px inline, narrowing to\n * 16px inline below 576px. It replaces any `textInsets`/`controlInsets`.\n */\nexport type ListInset = 'document';\n\n/**\n * A readable measure for a page's content column: `compact` 440px, `medium`\n * 640px, or `wide` 864px of content, the same steps as a catalog example's\n * `contentWidth`.\n */\nexport type ListContentWidth = 'compact' | 'medium' | 'wide';\n\nexport interface ListProps {\n children?: KerfUiContent;\n /** Make this list a labeled multi-select grid for `ContentItem selectionMode=\"multiple\"` rows. */\n selectionMode?: 'multiple';\n /** Accessible name for the multi-select grid. */\n ariaLabel?: string;\n /** Standard gap (`true`), one spacing value, or separate column and row values. Defaults to no gap. */\n gap?: boolean | UiGap;\n /** Allow this list to grow/shrink, use a keyword, or supply a typed CSS flex shorthand. */\n flex?: boolean | CssFlexKeyword | CssFlex;\n /**\n * Fill the height of a parent with a definite height, such as an app root or\n * a fixed-height frame, when this list is that parent's layout root. Inside a\n * flex layout use `flex` instead. Defaults to false.\n */\n fill?: boolean;\n /** Horizontal alignment. Defaults to full to preserve stretch-aligned list children. */\n hAlign?: HorizontalAlignment;\n /** Vertical distribution. Defaults to top. */\n vAlign?: ListVerticalAlignment;\n /**\n * Own vertical scrolling and overscroll containment. Children keep their\n * natural height and scroll instead of shrinking. To bound the list by a\n * `max-height` ancestor (no definite height), give that ancestor a flex\n * column and use `flex`; `fill` needs a definite-height parent.\n */\n scrollable?: boolean;\n /**\n * Clear chrome that lies over this scrollable List's block-start and/or\n * block-end edge, such as a `DialogSurface` floating footer. The List adds\n * the inherited `--kui-scroll-clearance-block-*` context that chrome\n * publishes to its own block padding and `scroll-padding`, so its rows\n * scroll visibly beneath the chrome while the first and last rows (and any\n * row focused or scrolled into view) can still rest clear of it. Opt in only\n * the one scroller that reaches the covered edge. Defaults to none.\n */\n scrollClearance?: ScrollClearance;\n /**\n * Draw a bordered, rounded frame around the stack: a 1px neutral border,\n * the standard control radius, and a 4px inset on every side that keeps the\n * first and last rows' focus rings inside a scrolling frame's clip. It\n * replaces any `inset`/`textInsets`/`controlInsets`. With `scrollable` and\n * `maxHeight` it is a bounded result picker of `ListItem` rows.\n */\n frame?: boolean;\n /**\n * The List's maximum block size, a typed `CssLength` from\n * `@kerfjs/ui/css-values` (such as `rem(14)`). Pair it with `scrollable` so\n * rows beyond it scroll; it bounds the List without a flex-column ancestor.\n */\n maxHeight?: CssLength;\n /**\n * The List's minimum block size, a typed `CssLength` (such as `rem(4.25)`),\n * so a short or empty result set keeps a stable box. Defaults to no minimum.\n */\n minHeight?: CssLength;\n /**\n * Paint a solid surface behind the stack, including its insets: for a strip\n * of chrome (a banner above a sunken work area) that must not show the\n * lowered tint around its content. Omitted, the List is transparent.\n */\n surface?: ListSurface;\n /** Physical divider edges in canonical top/right/bottom/left order. */\n dividerSides?: Sides;\n /** A preset four-sided inset; see `ListInset`. */\n /**\n * Cap the list's content at a readable measure, plus its insets, so a page\n * column needs no application CSS. Composes with `inset=\"document\"`.\n */\n contentWidth?: ListContentWidth;\n /** Where a `contentWidth` column sits: `center` (default) or `start`. */\n contentAlign?: 'start' | 'center';\n inset?: ListInset;\n /** Physical sides that receive the standard 17px text inset. */\n textInsets?: Sides;\n /** Physical sides that receive the standard 8px control inset. Text insets win on overlap. */\n controlInsets?: Sides;\n className?: string;\n /**\n * Safe `data-*`, `aria-*`, and structural `role` metadata (a named drop\n * `region`, `aria-busy`); List-owned structural attributes remain\n * protected, and a multi-select List owns its grid role and name.\n */\n rootAttributes?: ListRootAttributes;\n /** Native named-slot assignment when composed inside a web component. */\n slot?: string;\n}\n\n/**\n * A list's configuration, apart from its content and styling hooks: the props a\n * composite that renders a `List` for the app (the Workbench's `mainHeader` /\n * `mainFooter` chrome) forwards, so the app configures that list instead of\n * styling it. An omitted or `undefined` field keeps the composite's default.\n */\nexport type ListConfig = Pick<\n ListProps,\n 'gap' | 'hAlign' | 'vAlign' | 'dividerSides' | 'textInsets' | 'controlInsets'\n>;\n\n/** A stretch-aligned vertical stack with optional gap, flex, fill, scroll, and dividers. */\nexport function List({\n children,\n selectionMode,\n ariaLabel,\n gap = false,\n flex = false,\n fill = false,\n hAlign = 'full',\n vAlign = 'top',\n scrollable = false,\n scrollClearance,\n frame = false,\n maxHeight,\n minHeight,\n surface,\n inset,\n contentWidth,\n contentAlign = 'center',\n dividerSides = '',\n textInsets = '',\n controlInsets = '',\n className = '',\n rootAttributes = {},\n slot,\n}: ListProps) {\n if (selectionMode === 'multiple' && !ariaLabel) {\n throw new Error('Multi-select List requires an ariaLabel');\n }\n const multiple = selectionMode === 'multiple';\n const safeRootAttributes = filterRootAttributes(\n rootAttributes,\n multiple\n ? new Set([...listProtectedAttributes, ...listGridAttributes])\n : listProtectedAttributes,\n );\n const gridAttributes = multiple\n ? {\n role: 'grid',\n 'aria-label': ariaLabel,\n 'aria-multiselectable': 'true',\n }\n : {};\n const gapStyle =\n gap === true\n ? '--_kui-list-gap:var(--kui-list-gap)'\n : gap === false\n ? ''\n : typeof gap === 'string'\n ? `--_kui-list-gap:${gapLength(gap)}`\n : `--_kui-list-column-gap:${gapLength(gap.column)};--_kui-list-row-gap:${gapLength(gap.row)}`;\n const flexValue = flex === true ? '1 1 auto' : flex || undefined;\n const style = [\n gapStyle,\n flexValue ? `--_kui-list-flex:${flexValue}` : '',\n maxHeight === undefined ? '' : `--_kui-list-max-height:${maxHeight}`,\n minHeight === undefined ? '' : `--_kui-list-min-height:${minHeight}`,\n ]\n .filter(Boolean)\n .join(';');\n\n return (\n <div\n {...safeRootAttributes}\n {...gridAttributes}\n class={`kui-list ${className}`.trim()}\n data-component=\"list\"\n data-gap={String(Boolean(gap))}\n data-flex={String(Boolean(flex))}\n data-fill={fill ? 'true' : undefined}\n data-h-align={horizontalAlignment(hAlign)}\n data-v-align={verticalAlignment(vAlign)}\n data-scrollable={String(scrollable)}\n data-scroll-clearance={scrollClearance}\n data-frame={frame ? 'true' : undefined}\n data-surface={surface}\n data-inset={inset}\n data-content-width={contentWidth}\n data-content-align={contentWidth === undefined ? undefined : contentAlign}\n divider-sides={dividerSides || undefined}\n data-text-insets={textInsets || undefined}\n data-control-insets={controlInsets || undefined}\n style={style || undefined}\n slot={slot}\n >\n {children}\n </div>\n );\n}\n\nexport type {\n HorizontalAlignment,\n ListVerticalAlignment,\n VerticalAlignment,\n} from '../../../shared/layout/flex-alignment.js';\nexport type { ScrollClearance } from '../../../shared/layout/scroll-clearance.js';\nexport type { Sides } from '../../../shared/layout/sides.js';\nexport type {\n CssFlex,\n CssFlexKeyword,\n CssLength,\n UiGap,\n UiGapValue,\n UiSpaceName,\n} from '../../../shared/styles/css-values.js';\n"]}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { computePosition, flip, shift, size, autoUpdate } from '@floating-ui/dom';
|
|
2
|
+
|
|
3
|
+
// src/shared/popup/position-popup.ts
|
|
4
|
+
var POPUP_AVAILABLE_WIDTH = "--_kui-popup-available-width";
|
|
5
|
+
var POPUP_VIEWPORT_PADDING = 10;
|
|
6
|
+
function pointAnchor(x, y) {
|
|
7
|
+
return { getBoundingClientRect: () => new DOMRect(x, y, 0, 0) };
|
|
8
|
+
}
|
|
9
|
+
async function positionPopup(anchor, popup, {
|
|
10
|
+
placement,
|
|
11
|
+
gap = 0,
|
|
12
|
+
crossOffset = 0,
|
|
13
|
+
padding = POPUP_VIEWPORT_PADDING
|
|
14
|
+
}) {
|
|
15
|
+
const boundary = popup.ownerDocument.documentElement;
|
|
16
|
+
popup.style.removeProperty("max-height");
|
|
17
|
+
popup.style.removeProperty(POPUP_AVAILABLE_WIDTH);
|
|
18
|
+
const {
|
|
19
|
+
x,
|
|
20
|
+
y,
|
|
21
|
+
placement: used
|
|
22
|
+
} = await computePosition(anchor, popup, {
|
|
23
|
+
strategy: "fixed",
|
|
24
|
+
placement,
|
|
25
|
+
middleware: [
|
|
26
|
+
{
|
|
27
|
+
name: "offset",
|
|
28
|
+
fn: ({ x: ox, y: oy, placement: current }) => {
|
|
29
|
+
const vertical = current.startsWith("top") || current.startsWith("bottom");
|
|
30
|
+
const sign = current.startsWith("top") || current.startsWith("left") ? -1 : 1;
|
|
31
|
+
const cross = current.endsWith("-end") ? -crossOffset : crossOffset;
|
|
32
|
+
return vertical ? { x: ox + cross, y: oy + sign * gap } : { x: ox + sign * gap, y: oy + cross };
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
flip({ fallbackStrategy: "bestFit", padding, boundary }),
|
|
36
|
+
shift({ padding, crossAxis: true, boundary }),
|
|
37
|
+
size({
|
|
38
|
+
padding,
|
|
39
|
+
boundary,
|
|
40
|
+
apply({ availableHeight, availableWidth }) {
|
|
41
|
+
popup.style.maxHeight = `${Math.max(0, availableHeight)}px`;
|
|
42
|
+
popup.style.setProperty(
|
|
43
|
+
POPUP_AVAILABLE_WIDTH,
|
|
44
|
+
`${Math.max(0, availableWidth)}px`
|
|
45
|
+
);
|
|
46
|
+
}
|
|
47
|
+
})
|
|
48
|
+
]
|
|
49
|
+
});
|
|
50
|
+
popup.style.left = `${x}px`;
|
|
51
|
+
popup.style.top = `${y}px`;
|
|
52
|
+
popup.setAttribute("data-placement", used);
|
|
53
|
+
}
|
|
54
|
+
function followAnchor(anchor, popup, place) {
|
|
55
|
+
return autoUpdate(anchor, popup, place);
|
|
56
|
+
}
|
|
57
|
+
var PHONE_SUBMENU_QUERY = "(max-width: 480px)";
|
|
58
|
+
var PHONE_INSET = 8;
|
|
59
|
+
var PHONE_GAP = 4;
|
|
60
|
+
function phoneSubmenuPosition(parent, submenu, viewport, rtl) {
|
|
61
|
+
const width = Math.min(submenu.width, viewport.width - 2 * PHONE_INSET);
|
|
62
|
+
const height = submenu.height;
|
|
63
|
+
const below = Math.max(
|
|
64
|
+
0,
|
|
65
|
+
viewport.height - parent.bottom - PHONE_GAP - PHONE_INSET
|
|
66
|
+
);
|
|
67
|
+
const above = Math.max(0, parent.top - PHONE_GAP - PHONE_INSET);
|
|
68
|
+
const useBelow = height <= below || height > above && below >= above;
|
|
69
|
+
const availableHeight = useBelow ? below : above;
|
|
70
|
+
const left = rtl ? parent.right - width : parent.left;
|
|
71
|
+
return {
|
|
72
|
+
left: Math.max(
|
|
73
|
+
PHONE_INSET,
|
|
74
|
+
Math.min(left, viewport.width - PHONE_INSET - width)
|
|
75
|
+
),
|
|
76
|
+
top: useBelow ? parent.bottom + PHONE_GAP : parent.top - PHONE_GAP - Math.min(height, availableHeight),
|
|
77
|
+
maxHeight: availableHeight,
|
|
78
|
+
maxWidth: viewport.width - 2 * PHONE_INSET,
|
|
79
|
+
placement: useBelow ? "bottom-start" : "top-start"
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export { PHONE_SUBMENU_QUERY, followAnchor, phoneSubmenuPosition, pointAnchor, positionPopup };
|
|
84
|
+
|
|
85
|
+
//# sourceMappingURL=chunk-PE2KPZDW.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/shared/popup/position-popup.ts"],"names":[],"mappings":"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","file":"chunk-PE2KPZDW.js","sourcesContent":["import {\n autoUpdate,\n computePosition,\n flip,\n type Placement,\n shift,\n size,\n type VirtualElement,\n} from '@floating-ui/dom';\n\n/**\n * Placement for Kerf-owned popups (a PopupMenu's menu and submenus, a\n * Select's listbox): a top-layer element positioned `fixed` against an\n * anchor, flipped to the other side when its preferred side is short,\n * shifted to stay clear of the viewport edge, and capped to the block size\n * its side has room for. The geometry matches the Web Awesome popup these\n * surfaces replaced: no gap, best-fit flip, 10px shift and size padding.\n */\n\n/** Where a popup opens: below or above its anchor, at the start, center, or end. */\nexport type PopupPlacement =\n 'bottom-start' | 'bottom' | 'bottom-end' | 'top-start' | 'top' | 'top-end';\n\n/**\n * The custom property a placed popup's CSS reads to cap its width at the room\n * its side has; the popup also keeps any width limit of its own.\n */\nexport const POPUP_AVAILABLE_WIDTH = '--_kui-popup-available-width';\n\n/** A popup stays this far from the viewport edge when shifted or capped. */\nexport const POPUP_VIEWPORT_PADDING = 10;\n\n/** An element, or a viewport rectangle such as a context menu's pointer point. */\nexport type PopupAnchor = Element | VirtualElement;\n\n/** A zero-size anchor at a viewport point. */\nexport function pointAnchor(x: number, y: number): VirtualElement {\n return { getBoundingClientRect: () => new DOMRect(x, y, 0, 0) };\n}\n\nexport interface PositionPopupOptions {\n placement: Placement;\n /** Main-axis distance from the anchor. */\n gap?: number;\n /** Cross-axis offset (a submenu lifts so its first row meets its item). */\n crossOffset?: number;\n /** Viewport padding the flip, shift, and height cap keep. */\n padding?: number;\n}\n\n/**\n * Position `popup` against `anchor` once. Records the placement used as\n * `data-placement`, so the popup's motion grows from its anchor side.\n */\nexport async function positionPopup(\n anchor: PopupAnchor,\n popup: HTMLElement,\n {\n placement,\n gap = 0,\n crossOffset = 0,\n padding = POPUP_VIEWPORT_PADDING,\n }: PositionPopupOptions,\n): Promise<void> {\n // The popup is in the top layer, which no ancestor clips: only the\n // viewport bounds it, not the scroll containers it is rendered inside.\n const boundary = popup.ownerDocument.documentElement;\n // Measure the natural size: a cap from an earlier, shorter side would\n // otherwise steer the flip.\n popup.style.removeProperty('max-height');\n popup.style.removeProperty(POPUP_AVAILABLE_WIDTH);\n const {\n x,\n y,\n placement: used,\n } = await computePosition(anchor, popup, {\n strategy: 'fixed',\n placement,\n middleware: [\n {\n name: 'offset',\n fn: ({ x: ox, y: oy, placement: current }) => {\n const vertical =\n current.startsWith('top') || current.startsWith('bottom');\n const sign =\n current.startsWith('top') || current.startsWith('left') ? -1 : 1;\n // An end alignment (after a flip) shifts the other way, so the\n // popup's last row meets the anchor as its first row would.\n const cross = current.endsWith('-end') ? -crossOffset : crossOffset;\n return vertical\n ? { x: ox + cross, y: oy + sign * gap }\n : { x: ox + sign * gap, y: oy + cross };\n },\n },\n flip({ fallbackStrategy: 'bestFit', padding, boundary }),\n shift({ padding, crossAxis: true, boundary }),\n size({\n padding,\n boundary,\n apply({ availableHeight, availableWidth }) {\n popup.style.maxHeight = `${Math.max(0, availableHeight)}px`;\n // The popup's own CSS caps its width by this and its own limit.\n popup.style.setProperty(\n POPUP_AVAILABLE_WIDTH,\n `${Math.max(0, availableWidth)}px`,\n );\n },\n }),\n ],\n });\n popup.style.left = `${x}px`;\n popup.style.top = `${y}px`;\n popup.setAttribute('data-placement', used);\n}\n\n/**\n * Keep a shown popup positioned while its anchor or any scroll ancestor\n * moves, the viewport resizes, or either element changes size. Returns the\n * function that stops following.\n */\nexport function followAnchor(\n anchor: PopupAnchor,\n popup: HTMLElement,\n place: () => void,\n): () => void {\n return autoUpdate(anchor, popup, place);\n}\n\n/** Phone-width viewports place a submenu above or below its parent menu. */\nexport const PHONE_SUBMENU_QUERY = '(max-width: 480px)';\n\nconst PHONE_INSET = 8;\nconst PHONE_GAP = 4;\n\nexport interface Box {\n readonly left: number;\n readonly top: number;\n readonly right: number;\n readonly bottom: number;\n}\n\n/**\n * Place a phone-width submenu beside its parent menu in the block axis, so\n * its rows never cover the parent's: below the parent menu when it fits (or\n * when below has more room), otherwise above.\n */\nexport function phoneSubmenuPosition(\n parent: Box,\n submenu: { width: number; height: number },\n viewport: { width: number; height: number },\n rtl: boolean,\n) {\n const width = Math.min(submenu.width, viewport.width - 2 * PHONE_INSET);\n const height = submenu.height;\n const below = Math.max(\n 0,\n viewport.height - parent.bottom - PHONE_GAP - PHONE_INSET,\n );\n const above = Math.max(0, parent.top - PHONE_GAP - PHONE_INSET);\n const useBelow = height <= below || (height > above && below >= above);\n const availableHeight = useBelow ? below : above;\n const left = rtl ? parent.right - width : parent.left;\n return {\n left: Math.max(\n PHONE_INSET,\n Math.min(left, viewport.width - PHONE_INSET - width),\n ),\n top: useBelow\n ? parent.bottom + PHONE_GAP\n : parent.top - PHONE_GAP - Math.min(height, availableHeight),\n maxHeight: availableHeight,\n maxWidth: viewport.width - 2 * PHONE_INSET,\n placement: useBelow ? ('bottom-start' as const) : ('top-start' as const),\n };\n}\n"]}
|
|
@@ -66,10 +66,12 @@ function bounds(panel) {
|
|
|
66
66
|
};
|
|
67
67
|
}
|
|
68
68
|
function resizeTo(handle, target, height) {
|
|
69
|
-
const { panel, host, property } = target;
|
|
69
|
+
const { panel, host, property, publish } = target;
|
|
70
70
|
const { min, max, clearance } = bounds(panel);
|
|
71
71
|
const clamped = Math.min(max, Math.max(min, Math.round(height)));
|
|
72
|
-
|
|
72
|
+
const value = `${Math.max(0, clamped - clearance)}px`;
|
|
73
|
+
if (publish) publish(value);
|
|
74
|
+
else host.style.setProperty(property, value);
|
|
73
75
|
syncSheetHandleValues(handle, panel, clamped);
|
|
74
76
|
}
|
|
75
77
|
function syncSheetHandleValues(handle, panel, height = panel.getBoundingClientRect().height) {
|
|
@@ -82,4 +84,4 @@ function syncSheetHandleValues(handle, panel, height = panel.getBoundingClientRe
|
|
|
82
84
|
|
|
83
85
|
export { createSheetHandle, syncSheetHandleValues, wireSheetHandle };
|
|
84
86
|
|
|
85
|
-
//# sourceMappingURL=chunk-
|
|
87
|
+
//# sourceMappingURL=chunk-QPTJ5DOO.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/surfaces/surface-scaffold/internal/sheet-handle.ts"],"names":[],"mappings":"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","file":"chunk-QPTJ5DOO.js","sourcesContent":["/**\n * The bottom-sheet resize grabber shared by `DialogSurface` and the core\n * `kerfjs/overlay` sheets `wireOverlaySheets` wires: a `role=\"separator\"`\n * that resizes a sheet's visible height by drag or keyboard, between the\n * sheet's computed `min-height` and `max-height`, and reports that height in\n * its ARIA values. The sheet's height rule reads the published property and\n * adds back its block-end clearance.\n */\n\n/** Arrow-key step, and the Page Up/Down step, in px. */\nconst STEP = 16;\nconst PAGE_STEP = 64;\n\n/** Where a grabber reads its bounds and publishes the resized height. */\nexport interface SheetHandleTarget {\n /** The sheet whose border box is measured and bounded, read at each event. */\n panel: HTMLElement;\n /** The element the visible height is published on (the panel or an ancestor). */\n host: HTMLElement;\n /** The custom property holding the visible height. */\n property: string;\n /** False while the sheet is not resizable: input is ignored. */\n enabled: () => boolean;\n /**\n * Publish the visible height in place of setting `property` on `host`\n * directly (a DialogSurface keeps it across re-renders).\n */\n publish?: (value: string) => void;\n}\n\n/** Create an unattached grabber element with its separator semantics. */\nexport function createSheetHandle(\n attributes: Record<string, string>,\n): HTMLElement {\n const handle = document.createElement('div');\n for (const [name, value] of Object.entries(attributes))\n handle.setAttribute(name, value);\n handle.setAttribute('role', 'separator');\n handle.setAttribute('aria-orientation', 'horizontal');\n handle.setAttribute('aria-label', 'Resize sheet');\n handle.tabIndex = 0;\n return handle;\n}\n\n/** Wire a grabber's focus, keyboard, and pointer resizing. Returns a disposer. */\nexport function wireSheetHandle(\n handle: HTMLElement,\n target: SheetHandleTarget,\n): () => void {\n const onFocus = (): void => syncSheetHandleValues(handle, target.panel);\n const onKeydown = (event: KeyboardEvent): void => {\n if (!target.enabled()) return;\n const { min, max } = bounds(target.panel);\n const current = target.panel.getBoundingClientRect().height;\n const next = {\n ArrowUp: current + STEP,\n ArrowDown: current - STEP,\n PageUp: current + PAGE_STEP,\n PageDown: current - PAGE_STEP,\n Home: min,\n End: max,\n }[event.key];\n if (next === undefined) return;\n event.preventDefault();\n resizeTo(handle, target, next);\n };\n const onPointerdown = (event: PointerEvent): void => {\n if (!target.enabled() || event.button !== 0) return;\n event.preventDefault();\n const startY = event.clientY;\n const start = target.panel.getBoundingClientRect().height;\n handle.setPointerCapture?.(event.pointerId);\n const move = (moveEvent: PointerEvent): void =>\n resizeTo(handle, target, start - (moveEvent.clientY - startY));\n const end = (): void => {\n handle.removeEventListener('pointermove', move);\n handle.removeEventListener('pointerup', end);\n handle.removeEventListener('pointercancel', end);\n };\n handle.addEventListener('pointermove', move);\n handle.addEventListener('pointerup', end);\n handle.addEventListener('pointercancel', end);\n };\n handle.addEventListener('focus', onFocus);\n handle.addEventListener('keydown', onKeydown);\n handle.addEventListener('pointerdown', onPointerdown);\n return () => {\n handle.removeEventListener('focus', onFocus);\n handle.removeEventListener('keydown', onKeydown);\n handle.removeEventListener('pointerdown', onPointerdown);\n };\n}\n\n/** The panel's resolved border-box bounds and block-end clearance, in px. */\nfunction bounds(panel: HTMLElement): {\n min: number;\n max: number;\n clearance: number;\n} {\n const style = globalThis.getComputedStyle(panel);\n const clearance = parseFloat(style.paddingBlockEnd) || 0;\n const min = parseFloat(style.minHeight) || 0;\n const max = parseFloat(style.maxHeight);\n return {\n min,\n max: Number.isFinite(max) ? max : globalThis.innerHeight,\n clearance,\n };\n}\n\n/** Resize to a border-box height, published as the visible height above the clearance. */\nfunction resizeTo(\n handle: Element,\n target: SheetHandleTarget,\n height: number,\n): void {\n const { panel, host, property, publish } = target;\n const { min, max, clearance } = bounds(panel);\n const clamped = Math.min(max, Math.max(min, Math.round(height)));\n const value = `${Math.max(0, clamped - clearance)}px`;\n if (publish) publish(value);\n else host.style.setProperty(property, value);\n syncSheetHandleValues(handle, panel, clamped);\n}\n\n/** Separator values in visible (content) px, as a ResizableRegion reports them. */\nexport function syncSheetHandleValues(\n handle: Element,\n panel: HTMLElement,\n height = panel.getBoundingClientRect().height,\n): void {\n const { min, max, clearance } = bounds(panel);\n const visible = (value: number) =>\n String(Math.max(0, Math.round(value - clearance)));\n handle.setAttribute('aria-valuemin', visible(min));\n handle.setAttribute('aria-valuemax', visible(max));\n handle.setAttribute('aria-valuenow', visible(height));\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/navigation/tab-bar/tab-bar.tsx"],"names":[],"mappings":";;;AA6CO,SAAS,MAAA,CAAO;AAAA,EACrB,EAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAA;AAAA,EACA,SAAA,GAAY,EAAA;AAAA,EACZ,UAAA;AAAA,EACA,UAAA,GAAa,WAAA;AAAA,EACb,YAAA,GAAe,MAAA;AAAA,EACf,UAAA;AAAA,EACA,iBAAA,GAAoB,UAAA;AAAA,EACpB,QAAA,GAAW,KAAA;AAAA,EACX;AACF,CAAA,EAAgB;AACd,EAAA,uBACE,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,CAAA,YAAA,EAAe,SAAS,CAAA,CAAA,CAAG,IAAA,EAAK;AAAA,MACvC,gBAAA,EAAe,SAAA;AAAA,MACf,iBAAA,EAAiB,EAAA;AAAA,MACjB,qBAAA,EAAqB,UAAA;AAAA,MACrB,iBAAA,EAAiB,UAAA;AAAA,MACjB,mBAAA,EAAmB,YAAA;AAAA,MACnB,mBAAA,EAAmB,UAAA;AAAA,MACnB,yBAAA,EAAyB,iBAAA;AAAA,MACzB,YAAA,EAAY,KAAA;AAAA,MACZ,IAAA;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,OAAA,oBAAW,GAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,sBAAA,EAAwB,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,wBACvD,GAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAM,mBAAA;AAAA,YACN,IAAA,EAAK,SAAA;AAAA,YACL,YAAA,EAAY,KAAA;AAAA,YACZ,mBAAA,EAAiB,IAAA;AAAA,YACjB,gBAAA,EAAgB,WAAW,MAAA,GAAS,MAAA;AAAA,YAEnC;AAAA;AAAA,SACH;AAAA,QACC,QAAA,oBAAY,GAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,yBAAyB,QAAA,EAAA,QAAA,EAAS,CAAA;AAAA,QACzD,GAAA,oBAAO,GAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,oBAAoB,QAAA,EAAA,GAAA,EAAI;AAAA;AAAA;AAAA,GAC7C;AAEJ","file":"chunk-RFLW4FPL.js","sourcesContent":["import type { KerfUiContent } from '../../../shared/content/semantic-content.js';\n\nexport type TabActivation = 'automatic' | 'manual';\nexport type TabBarAllocation = 'intrinsic' | 'fill';\nexport type TabBarPresentation = 'rail' | 'segmented' | 'inspector';\nexport type TabBarTrailingPlacement = 'separate' | 'adjacent';\n/** Tablist width where segmented TabBarItems switch to icon-only. */\nexport type TabBarIconOnlyAt = 'wide' | 'narrow' | 'compact';\n\nexport interface TabBarProps {\n id: string;\n label: string;\n children: KerfUiContent;\n leading?: KerfUiContent;\n /** Tab-local action: a ToolbarControlGroup or a standalone Web Awesome button. */\n trailing?: KerfUiContent;\n /**\n * Action pinned to the far edge of the bar. Combine with an adjacent `trailing`\n * action when the tab-local and workspace-level actions must remain distinct.\n * Accepts a ToolbarControlGroup or a standalone Web Awesome button.\n */\n end?: KerfUiContent;\n className?: string;\n /**\n * Keyboard activation mode for this strip, emitted as `data-tab-activation` for\n * `wireTabBars` to read (overrides its `activation` option). `'automatic'` (default)\n * selects on arrow / Home / End; `'manual'` moves roving focus only and the user\n * selects with Enter / Space / click — use it when selecting a tab is a heavy action.\n */\n activation?: TabActivation;\n /** How available strip width is allocated across child TabBarItems. */\n allocation?: TabBarAllocation;\n /** Named strip chrome for application rails, segmented tabs, or inspectors. */\n presentation?: TabBarPresentation;\n /** Switch segmented TabBarItems to icon-only at tablist widths of 832, 704, or 448px. Each tab needs a leading icon. */\n iconOnlyAt?: TabBarIconOnlyAt;\n /** Keep a trailing action beside the final tab or at the far edge of the bar. */\n trailingPlacement?: TabBarTrailingPlacement;\n /** Settle scrolling peers at whole-tab starts; wireTabBars measures a pinned leading tab's inset. */\n snapTabs?: boolean;\n /** Native named-slot assignment when composed inside a web component. */\n slot?: string;\n}\n\n/** Render a controlled tab strip. The application owns selection, order, and persistence. */\nexport function TabBar({\n id,\n label,\n children,\n leading,\n trailing,\n end,\n className = '',\n activation,\n allocation = 'intrinsic',\n presentation = 'rail',\n iconOnlyAt,\n trailingPlacement = 'separate',\n snapTabs = false,\n slot,\n}: TabBarProps) {\n return (\n <nav\n class={`kui-tab-bar ${className}`.trim()}\n data-component=\"tab-bar\"\n data-tab-bar-id={id}\n data-tab-activation={activation}\n data-allocation={allocation}\n data-presentation={presentation}\n data-icon-only-at={iconOnlyAt}\n data-trailing-placement={trailingPlacement}\n aria-label={label}\n slot={slot}\n >\n {leading && <div class=\"kui-tab-bar__leading\">{leading}</div>}\n <div\n class=\"kui-tab-bar__tabs\"\n role=\"tablist\"\n aria-label={label}\n data-kui-tab-list\n data-snap-tabs={snapTabs ? 'true' : undefined}\n >\n {children}\n </div>\n {trailing && <div class=\"kui-tab-bar__trailing\">{trailing}</div>}\n {end && <div class=\"kui-tab-bar__end\">{end}</div>}\n </nav>\n );\n}\n"]}
|
|
@@ -8,11 +8,13 @@ var badgeProtectedAttributes = /* @__PURE__ */ new Set([
|
|
|
8
8
|
"data-shape",
|
|
9
9
|
"data-size",
|
|
10
10
|
"data-has-icon",
|
|
11
|
-
"data-truncate"
|
|
11
|
+
"data-truncate",
|
|
12
|
+
"data-placement"
|
|
12
13
|
]);
|
|
13
14
|
function Badge(props) {
|
|
14
15
|
const {
|
|
15
16
|
tone = "neutral",
|
|
17
|
+
placement = "inline",
|
|
16
18
|
title,
|
|
17
19
|
rootAttributes = {},
|
|
18
20
|
className = "",
|
|
@@ -33,6 +35,7 @@ function Badge(props) {
|
|
|
33
35
|
"data-tone": tone,
|
|
34
36
|
"data-appearance": "solid",
|
|
35
37
|
"data-size": "dot",
|
|
38
|
+
"data-placement": placement === "corner" ? "corner" : void 0,
|
|
36
39
|
role: label2 ? "img" : void 0,
|
|
37
40
|
"aria-label": label2 || void 0,
|
|
38
41
|
"aria-hidden": label2 ? void 0 : "true",
|
|
@@ -66,6 +69,7 @@ function Badge(props) {
|
|
|
66
69
|
"data-size": size,
|
|
67
70
|
"data-has-icon": icon === void 0 ? void 0 : "true",
|
|
68
71
|
"data-truncate": truncates ? "true" : void 0,
|
|
72
|
+
"data-placement": placement === "corner" ? "corner" : void 0,
|
|
69
73
|
style: truncates ? `--_kui-badge-max-width:${maxWidth}` : void 0,
|
|
70
74
|
role: named ? "img" : void 0,
|
|
71
75
|
"aria-label": named ? label : void 0,
|
|
@@ -82,4 +86,4 @@ function Badge(props) {
|
|
|
82
86
|
|
|
83
87
|
export { Badge };
|
|
84
88
|
|
|
85
|
-
//# sourceMappingURL=chunk-
|
|
89
|
+
//# sourceMappingURL=chunk-RMWNO6BA.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/feedback/badge/badge.tsx"],"names":["label"],"mappings":"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","file":"chunk-RMWNO6BA.js","sourcesContent":["import type { SafeHtml } from 'kerfjs';\n\nimport { filterDataAttributes } from '../../../shared/dom/extension-attributes.js';\nimport type { CssLength } from '../../../shared/styles/css-values.js';\nimport type { SemanticTone } from '../../../shared/styles/semantic-tone.js';\n\nexport type { SemanticTone } from '../../../shared/styles/semantic-tone.js';\n/** @deprecated Use SemanticTone. */\nexport type BadgeTone = SemanticTone;\nexport type BadgeAppearance = 'quiet' | 'solid' | 'outline';\nexport type BadgeShape = 'pill' | 'rounded';\n/** Size of a text badge. A text-free dot is the separate `size: 'dot'` form. */\nexport type BadgeSize = 'compact' | 'default';\n\nconst badgeProtectedAttributes = new Set([\n 'data-component',\n 'data-tone',\n 'data-appearance',\n 'data-shape',\n 'data-size',\n 'data-has-icon',\n 'data-truncate',\n 'data-placement',\n]);\n\n/** Application `data-*` identity on the badge root; Badge-owned markers stay protected. */\nexport type BadgeRootAttributes = Readonly<\n Record<`data-${string}`, string | undefined> & {\n 'data-component'?: never;\n 'data-tone'?: never;\n 'data-appearance'?: never;\n 'data-shape'?: never;\n 'data-size'?: never;\n 'data-has-icon'?: never;\n 'data-truncate'?: never;\n 'data-placement'?: never;\n }\n>;\n\n/**\n * `inline` (default) flows with its content; `corner` pins the badge to the\n * top-trailing corner of the control it sits in (an icon-only `Button`, or a\n * button in a `ToolbarControlGroup`), out of the pointer's way.\n */\nexport type BadgePlacement = 'inline' | 'corner';\n\ninterface BadgeCommonProps {\n tone?: SemanticTone;\n placement?: BadgePlacement;\n /** Native tooltip text that explains the badge on hover. */\n title?: string;\n /** Safe `data-*` identity, such as a status band, on the badge root. */\n rootAttributes?: BadgeRootAttributes;\n className?: string;\n /** Native named-slot assignment when composed inside a web component. */\n slot?: string;\n}\n\n/** A badge that shows a short status, count, or category as visible text. */\nexport interface BadgeTextProps extends BadgeCommonProps {\n children: SafeHtml | string | number;\n /** Decorative leading icon, normally an unsized LucideIcon, 4px before the text. */\n icon?: SafeHtml;\n appearance?: BadgeAppearance;\n shape?: BadgeShape;\n size?: BadgeSize;\n /**\n * Cap the badge's width and truncate longer text with an ellipsis, for\n * app-supplied text such as a tag or category name. String and number\n * content becomes the native `title` tooltip unless `title` is supplied, so\n * the full text stays available on hover; SafeHtml content needs `title`.\n */\n maxWidth?: CssLength;\n /**\n * Accessible name that replaces the visible content when it is abbreviated\n * or symbolic (`\"82% confidence\"` for `82`); the badge is then exposed as a\n * labeled image.\n */\n label?: string;\n /** Hide a repeated visual badge from assistive technology. */\n ariaHidden?: boolean;\n}\n\n/** A labeled dot, announced as an image with its own accessible name. */\ninterface BadgeDotLabeled {\n /** Accessible name for the dot, for example `\"New activity\"`. */\n label: string;\n ariaHidden?: false;\n}\n\n/** A decorative dot whose meaning the owning component already announces. */\ninterface BadgeDotDecorative {\n label?: never;\n ariaHidden: true;\n}\n\n/**\n * A text-free status dot (the iOS \"new content\" dot): a small solid circle in\n * the badge's tone. It has no visible text, so it must either carry its own\n * accessible `label` (exposed as an image) or be `ariaHidden` because the\n * surrounding component already folds its meaning into an accessible name.\n */\nexport type BadgeDotProps = BadgeCommonProps & {\n size: 'dot';\n children?: never;\n appearance?: never;\n shape?: never;\n maxWidth?: never;\n} & (BadgeDotLabeled | BadgeDotDecorative);\n\nexport type BadgeProps = BadgeTextProps | BadgeDotProps;\n\n/** Compact, non-interactive metadata whose tone, emphasis, and shape are configured by props. */\nexport function Badge(props: BadgeProps) {\n const {\n tone = 'neutral',\n placement = 'inline',\n title,\n rootAttributes = {},\n className = '',\n slot,\n } = props;\n const identity = filterDataAttributes(\n rootAttributes,\n badgeProtectedAttributes,\n );\n if (props.size === 'dot') {\n // A dot without a usable label has no text fallback, so it is decorative.\n const label = props.ariaHidden ? undefined : props.label?.trim();\n return (\n <span\n {...identity}\n class={`kui-badge ${className}`.trim()}\n data-component=\"badge\"\n data-tone={tone}\n data-appearance=\"solid\"\n data-size=\"dot\"\n data-placement={placement === 'corner' ? 'corner' : undefined}\n role={label ? 'img' : undefined}\n aria-label={label || undefined}\n aria-hidden={label ? undefined : 'true'}\n title={title}\n slot={slot}\n />\n );\n }\n const {\n children,\n icon,\n appearance = 'quiet',\n shape = 'pill',\n size = 'default',\n maxWidth,\n label,\n ariaHidden = false,\n } = props;\n const named = !ariaHidden && Boolean(label?.trim());\n const truncates = maxWidth !== undefined;\n // A truncated label keeps its full text as the hover tooltip.\n const tooltip =\n title ??\n (truncates && (typeof children === 'string' || typeof children === 'number')\n ? String(children)\n : undefined);\n return (\n <span\n {...identity}\n class={`kui-badge ${className}`.trim()}\n data-component=\"badge\"\n data-tone={tone}\n data-appearance={appearance}\n data-shape={shape}\n data-size={size}\n data-has-icon={icon === undefined ? undefined : 'true'}\n data-truncate={truncates ? 'true' : undefined}\n data-placement={placement === 'corner' ? 'corner' : undefined}\n style={truncates ? `--_kui-badge-max-width:${maxWidth}` : undefined}\n role={named ? 'img' : undefined}\n aria-label={named ? label : undefined}\n aria-hidden={ariaHidden ? 'true' : undefined}\n title={tooltip}\n slot={slot}\n >\n {icon === undefined ? null : (\n <span class=\"kui-badge__icon\" aria-hidden=\"true\">\n {icon}\n </span>\n )}\n {truncates ? <span class=\"kui-badge__label\">{children}</span> : children}\n </span>\n );\n}\n"]}
|