@kerfjs/ui 5.0.0-beta.104 → 5.0.0-beta.106
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +155 -116
- package/ai/application-ui-profile.defaults.json +125 -4
- package/ai/compile-time-contracts-v1.json +11 -11
- package/ai/component-catalog.json +2606 -628
- package/ai/component-composition-rules.json +10 -10
- package/ai/component-composition.json +1688 -300
- package/ai/components/README.md +66 -48
- package/ai/components/application-tabs.md +4 -4
- package/ai/components/badge.md +1 -0
- package/ai/components/button.md +91 -0
- package/ai/components/checkbox.md +89 -0
- package/ai/components/choice-chips.md +9 -3
- package/ai/components/color-field.md +92 -0
- package/ai/components/color-picker.md +90 -0
- package/ai/components/color-swatches.md +82 -0
- package/ai/components/combobox.md +6 -4
- package/ai/components/content-item.md +5 -2
- package/ai/components/disclosure.md +83 -0
- package/ai/components/file-picker.md +1 -0
- package/ai/components/foundation.md +1 -1
- package/ai/components/list-action-row.md +3 -3
- package/ai/components/list-detail-dialog.md +90 -0
- package/ai/components/list.md +2 -0
- package/ai/components/lucide-icon.md +2 -0
- package/ai/components/{composer.md → message-composer.md} +17 -16
- package/ai/components/pane.md +3 -1
- package/ai/components/popup-menu.md +12 -9
- package/ai/components/progress-bar.md +82 -0
- package/ai/components/progress-ring.md +80 -0
- package/ai/components/radio-group.md +88 -0
- package/ai/components/recipe-list-detail-dialog.md +5 -5
- package/ai/components/{token-search-field.md → search-field.md} +23 -23
- package/ai/components/select.md +15 -13
- package/ai/components/slider.md +84 -0
- package/ai/components/surface-scaffold.md +16 -13
- package/ai/components/switch.md +81 -0
- package/ai/components/tab-bar.md +6 -6
- package/ai/components/tab-navigator.md +2 -2
- package/ai/components/tabs.md +7 -7
- package/ai/components/tag-field.md +86 -0
- package/ai/components/text-field.md +98 -0
- package/ai/components/text.md +1 -0
- package/ai/components/toast.md +85 -0
- package/ai/components/toolbar-control-group.md +3 -3
- package/ai/components/tooltip.md +81 -0
- package/ai/components/wa-accordion-item.md +11 -5
- package/ai/components/wa-accordion.md +11 -5
- package/ai/components/wa-animated-image.md +2 -1
- package/ai/components/wa-animation.md +1 -0
- package/ai/components/wa-avatar.md +1 -0
- package/ai/components/wa-badge.md +10 -3
- package/ai/components/wa-breadcrumb-item.md +1 -0
- package/ai/components/wa-breadcrumb.md +1 -0
- package/ai/components/wa-button-group.md +6 -4
- package/ai/components/wa-button.md +7 -5
- package/ai/components/wa-callout.md +7 -5
- package/ai/components/wa-card.md +12 -4
- package/ai/components/wa-carousel-item.md +1 -0
- package/ai/components/wa-carousel.md +1 -0
- package/ai/components/wa-checkbox-group.md +11 -4
- package/ai/components/wa-checkbox.md +10 -4
- package/ai/components/wa-color-picker.md +13 -5
- package/ai/components/wa-comparison.md +2 -1
- package/ai/components/wa-copy-button.md +1 -0
- package/ai/components/wa-details.md +11 -5
- package/ai/components/wa-dialog.md +10 -4
- package/ai/components/wa-divider.md +1 -0
- package/ai/components/wa-drawer.md +12 -5
- package/ai/components/wa-dropdown-item.md +8 -6
- package/ai/components/wa-dropdown.md +8 -6
- package/ai/components/wa-format-bytes.md +1 -0
- package/ai/components/wa-format-date.md +1 -0
- package/ai/components/wa-format-number.md +1 -0
- package/ai/components/wa-icon.md +2 -1
- package/ai/components/wa-include.md +6 -4
- package/ai/components/wa-input.md +9 -6
- package/ai/components/wa-intersection-observer.md +1 -0
- package/ai/components/wa-known-date.md +1 -0
- package/ai/components/wa-markdown.md +1 -0
- package/ai/components/wa-mutation-observer.md +1 -0
- package/ai/components/wa-number-input.md +1 -0
- package/ai/components/wa-option.md +7 -5
- package/ai/components/wa-otp-input.md +1 -0
- package/ai/components/wa-page.md +13 -4
- package/ai/components/wa-pagination.md +1 -0
- package/ai/components/wa-popover.md +11 -5
- package/ai/components/wa-popup.md +11 -4
- package/ai/components/wa-progress-bar.md +11 -4
- package/ai/components/wa-progress-ring.md +11 -4
- package/ai/components/wa-qr-code.md +1 -0
- package/ai/components/wa-radio-group.md +12 -4
- package/ai/components/wa-radio.md +10 -4
- package/ai/components/wa-random-content.md +1 -0
- package/ai/components/wa-rating.md +1 -0
- package/ai/components/wa-relative-time.md +1 -0
- package/ai/components/wa-resize-observer.md +1 -0
- package/ai/components/wa-scroller.md +12 -4
- package/ai/components/wa-select.md +7 -5
- package/ai/components/wa-skeleton.md +10 -3
- package/ai/components/wa-slider.md +11 -5
- package/ai/components/wa-spinner.md +7 -5
- package/ai/components/wa-split-panel.md +7 -5
- package/ai/components/wa-step.md +56 -0
- package/ai/components/wa-stepper.md +56 -0
- package/ai/components/wa-switch.md +10 -3
- package/ai/components/wa-tab-group.md +8 -6
- package/ai/components/wa-tab-panel.md +7 -5
- package/ai/components/wa-tab.md +8 -6
- package/ai/components/wa-tag-input.md +62 -0
- package/ai/components/wa-tag.md +9 -6
- package/ai/components/wa-textarea.md +10 -3
- package/ai/components/wa-time-input.md +1 -0
- package/ai/components/wa-toast-item.md +9 -7
- package/ai/components/wa-toast.md +9 -7
- package/ai/components/wa-tooltip.md +11 -5
- package/ai/components/wa-tree-item.md +2 -1
- package/ai/components/wa-tree.md +2 -1
- package/ai/components/wa-zoomable-frame.md +2 -1
- package/ai/components/workbench-dialog.md +90 -0
- package/ai/public-api-signatures-v1.md +1579 -247
- package/ai/skill.md +83 -50
- package/ai/webawesome-jsx-signatures-v1.md +4 -1
- package/dist/badge.d.ts +9 -1
- package/dist/badge.js +1 -1
- package/dist/browser/button.js +5 -0
- package/dist/browser/catalog.js +3 -2
- package/dist/browser/{icon-button.js → checkbox.js} +2 -2
- package/dist/browser/color-field.js +4 -0
- package/dist/browser/color-picker.js +5 -0
- package/dist/browser/color-swatches.js +3 -0
- package/dist/browser/disclosure.js +5 -0
- package/dist/browser/list-action-row.js +1 -0
- package/dist/browser/list-detail-dialog.js +14 -0
- package/dist/browser/message-composer.js +5 -0
- package/dist/browser/popup-menu.js +1 -0
- package/dist/browser/progress-bar.js +3 -0
- package/dist/browser/progress-ring.js +3 -0
- package/dist/browser/radio-group.js +3 -0
- package/dist/browser/search-field.js +4 -0
- package/dist/browser/slider.js +3 -0
- package/dist/browser/surface-scaffold.js +1 -0
- package/dist/browser/switch.js +3 -0
- package/dist/browser/tab-bar-item.js +4 -0
- package/dist/browser/tag-field.js +5 -0
- package/dist/browser/text-field.js +4 -0
- package/dist/browser/workbench-dialog.js +15 -0
- package/dist/button.d.ts +108 -0
- package/dist/button.js +7 -0
- package/dist/button.js.map +1 -0
- package/dist/catalog-resources.d.ts +1 -1
- package/dist/catalog.d.ts +3 -3
- package/dist/catalog.js +57 -27
- package/dist/catalog.js.map +1 -1
- package/dist/checkbox.d.ts +45 -0
- package/dist/checkbox.js +6 -0
- package/dist/checkbox.js.map +1 -0
- package/dist/choice-chips.d.ts +49 -15
- package/dist/choice-chips.js +1 -1
- package/dist/chunk-23PPPNH6.js +93 -0
- package/dist/chunk-23PPPNH6.js.map +1 -0
- package/dist/{chunk-FNZQOUZ5.js → chunk-2FW7D4IG.js} +2 -2
- package/dist/{chunk-FNZQOUZ5.js.map → chunk-2FW7D4IG.js.map} +1 -1
- package/dist/{chunk-ZYU5WRC3.js → chunk-3GLYIIFR.js} +2 -2
- package/dist/{chunk-ZYU5WRC3.js.map → chunk-3GLYIIFR.js.map} +1 -1
- package/dist/{chunk-5NQF35VO.js → chunk-4RECPEHI.js} +2 -2
- package/dist/{chunk-5NQF35VO.js.map → chunk-4RECPEHI.js.map} +1 -1
- package/dist/{chunk-7IUEBNCO.js → chunk-5USKCWGL.js} +8 -3
- package/dist/chunk-5USKCWGL.js.map +1 -0
- package/dist/chunk-6VVIW7VB.js +69 -0
- package/dist/chunk-6VVIW7VB.js.map +1 -0
- package/dist/{chunk-LL45C7BB.js → chunk-7K6U6FCN.js} +1 -1
- package/dist/chunk-7K6U6FCN.js.map +1 -0
- package/dist/{chunk-HQZYKJ56.js → chunk-7W3GKMN4.js} +110 -74
- package/dist/chunk-7W3GKMN4.js.map +1 -0
- package/dist/chunk-ACUKTVS3.js +371 -0
- package/dist/chunk-ACUKTVS3.js.map +1 -0
- package/dist/{chunk-YQ2AC4E2.js → chunk-AMIHGFLP.js} +2 -2
- package/dist/{chunk-YQ2AC4E2.js.map → chunk-AMIHGFLP.js.map} +1 -1
- package/dist/chunk-ATGAJVZ6.js +268 -0
- package/dist/chunk-ATGAJVZ6.js.map +1 -0
- package/dist/chunk-AYPGXR2E.js +20 -0
- package/dist/chunk-AYPGXR2E.js.map +1 -0
- package/dist/{chunk-ETCWQLJV.js → chunk-BKUMG2KB.js} +38 -28
- package/dist/chunk-BKUMG2KB.js.map +1 -0
- package/dist/chunk-C26Q6P4Q.js +76 -0
- package/dist/chunk-C26Q6P4Q.js.map +1 -0
- package/dist/chunk-C3RLKKFQ.js +452 -0
- package/dist/chunk-C3RLKKFQ.js.map +1 -0
- package/dist/{chunk-T5BJBMW7.js → chunk-CIAUILRR.js} +5 -5
- package/dist/chunk-CIAUILRR.js.map +1 -0
- package/dist/chunk-CNM6ZWP2.js +38 -0
- package/dist/chunk-CNM6ZWP2.js.map +1 -0
- package/dist/{chunk-LPHU44S3.js → chunk-CTQUDCY5.js} +3 -1
- package/dist/chunk-CTQUDCY5.js.map +1 -0
- package/dist/{chunk-MXNIVEVL.js → chunk-D4MXSAMI.js} +5 -3
- package/dist/chunk-D4MXSAMI.js.map +1 -0
- package/dist/{chunk-YBWQR2OK.js → chunk-DDSCVEO5.js} +10 -9
- package/dist/chunk-DDSCVEO5.js.map +1 -0
- package/dist/{chunk-SIW64V65.js → chunk-DF2YKGIX.js} +3 -3
- package/dist/{chunk-SIW64V65.js.map → chunk-DF2YKGIX.js.map} +1 -1
- package/dist/{chunk-3SKAEPPZ.js → chunk-ECFCAKWE.js} +4 -4
- package/dist/{chunk-3SKAEPPZ.js.map → chunk-ECFCAKWE.js.map} +1 -1
- package/dist/chunk-EKBMUXFV.js +298 -0
- package/dist/chunk-EKBMUXFV.js.map +1 -0
- package/dist/{chunk-IXLUZHGT.js → chunk-FG6U7KQQ.js} +5 -5
- package/dist/{chunk-IXLUZHGT.js.map → chunk-FG6U7KQQ.js.map} +1 -1
- package/dist/chunk-FKKJHGN5.js +147 -0
- package/dist/chunk-FKKJHGN5.js.map +1 -0
- package/dist/{chunk-FDZNYD4C.js → chunk-GCAK23PU.js} +34 -3
- package/dist/chunk-GCAK23PU.js.map +1 -0
- package/dist/chunk-GXSX6Q6O.js +42 -0
- package/dist/chunk-GXSX6Q6O.js.map +1 -0
- package/dist/{chunk-LOSRXZAH.js → chunk-HJXVVFBT.js} +14 -6
- package/dist/chunk-HJXVVFBT.js.map +1 -0
- package/dist/{chunk-M5KZ26VV.js → chunk-HQZG3OFL.js} +11 -1
- package/dist/chunk-HQZG3OFL.js.map +1 -0
- package/dist/{chunk-ELCMSQNJ.js → chunk-HTERKONR.js} +8 -8
- package/dist/chunk-HTERKONR.js.map +1 -0
- package/dist/chunk-HYORKKYP.js +8 -0
- package/dist/chunk-HYORKKYP.js.map +1 -0
- package/dist/chunk-IO27YTL3.js +73 -0
- package/dist/chunk-IO27YTL3.js.map +1 -0
- package/dist/chunk-ITUQC4FW.js +163 -0
- package/dist/chunk-ITUQC4FW.js.map +1 -0
- package/dist/chunk-K57NINLH.js +137 -0
- package/dist/chunk-K57NINLH.js.map +1 -0
- package/dist/chunk-KC6WUSNS.js +34 -0
- package/dist/chunk-KC6WUSNS.js.map +1 -0
- package/dist/{chunk-W4IK7AWD.js → chunk-KDQZ3E5C.js} +3 -1
- package/dist/chunk-KDQZ3E5C.js.map +1 -0
- package/dist/{chunk-2MSPNRWJ.js → chunk-KK3S5OTW.js} +27 -11
- package/dist/chunk-KK3S5OTW.js.map +1 -0
- package/dist/chunk-LTBVP6VN.js +59 -0
- package/dist/chunk-LTBVP6VN.js.map +1 -0
- package/dist/chunk-OHPYT2BH.js +82 -0
- package/dist/chunk-OHPYT2BH.js.map +1 -0
- package/dist/{chunk-HZPHCSCS.js → chunk-OY2MXIBB.js} +8 -2
- package/dist/chunk-OY2MXIBB.js.map +1 -0
- package/dist/chunk-PE2KPZDW.js +85 -0
- package/dist/chunk-PE2KPZDW.js.map +1 -0
- package/dist/{chunk-QTSMHH5J.js → chunk-QPTJ5DOO.js} +5 -3
- package/dist/chunk-QPTJ5DOO.js.map +1 -0
- package/dist/{chunk-JOR5LGYE.js → chunk-RFLW4FPL.js} +1 -1
- package/dist/chunk-RFLW4FPL.js.map +1 -0
- package/dist/{chunk-U6QYTMDB.js → chunk-RMWNO6BA.js} +6 -2
- package/dist/chunk-RMWNO6BA.js.map +1 -0
- package/dist/{chunk-TDMHA7C3.js → chunk-SQ2Q3OQI.js} +112 -63
- package/dist/chunk-SQ2Q3OQI.js.map +1 -0
- package/dist/{chunk-K4AT3V3J.js → chunk-T74YB76U.js} +13 -11
- package/dist/chunk-T74YB76U.js.map +1 -0
- package/dist/{chunk-BYFTHA4I.js → chunk-TAHR457X.js} +53 -6
- package/dist/chunk-TAHR457X.js.map +1 -0
- package/dist/{chunk-3VXDSIBJ.js → chunk-TKNVL53O.js} +2 -2
- package/dist/{chunk-3VXDSIBJ.js.map → chunk-TKNVL53O.js.map} +1 -1
- package/dist/chunk-TNJLNLVE.js +115 -0
- package/dist/chunk-TNJLNLVE.js.map +1 -0
- package/dist/chunk-TUID42UE.js +15 -0
- package/dist/chunk-TUID42UE.js.map +1 -0
- package/dist/{chunk-CR5U5FV6.js → chunk-UMNHJSIO.js} +93 -80
- package/dist/chunk-UMNHJSIO.js.map +1 -0
- package/dist/chunk-UTCAOOXU.js +116 -0
- package/dist/chunk-UTCAOOXU.js.map +1 -0
- package/dist/{chunk-ZJC5ND3M.js → chunk-VEME3D7K.js} +35 -35
- package/dist/chunk-VEME3D7K.js.map +1 -0
- package/dist/{chunk-HLDRH23D.js → chunk-WJKHLOP5.js} +2 -2
- package/dist/{chunk-HLDRH23D.js.map → chunk-WJKHLOP5.js.map} +1 -1
- package/dist/chunk-WU57BYYM.js +115 -0
- package/dist/chunk-WU57BYYM.js.map +1 -0
- package/dist/{chunk-TGLUDQP2.js → chunk-ZCDRLN3B.js} +11 -11
- package/dist/chunk-ZCDRLN3B.js.map +1 -0
- package/dist/chunk-ZX2QQJXD.js +249 -0
- package/dist/chunk-ZX2QQJXD.js.map +1 -0
- package/dist/{chunk-6E2H2E5A.js → chunk-ZXZAECHZ.js} +6 -6
- package/dist/{chunk-6E2H2E5A.js.map → chunk-ZXZAECHZ.js.map} +1 -1
- package/dist/collapsible-panel.js +3 -3
- package/dist/color-field.d.ts +51 -0
- package/dist/color-field.js +92 -0
- package/dist/color-field.js.map +1 -0
- package/dist/color-picker.d.ts +88 -0
- package/dist/color-picker.js +8 -0
- package/dist/color-picker.js.map +1 -0
- package/dist/color-swatches.d.ts +56 -0
- package/dist/color-swatches.js +4 -0
- package/dist/color-swatches.js.map +1 -0
- package/dist/combobox.js +1 -1
- package/dist/content-item.d.ts +13 -1
- package/dist/content-item.js +1 -1
- package/dist/disclosure-arrow.js +1 -1
- package/dist/disclosure.d.ts +57 -0
- package/dist/disclosure.js +51 -0
- package/dist/disclosure.js.map +1 -0
- package/dist/file-picker.d.ts +7 -0
- package/dist/file-picker.js +1 -1
- package/dist/help-tags-register.d.ts +8 -8
- package/dist/help-tags-register.js +3 -2
- package/dist/help-tags-register.js.map +1 -1
- package/dist/index.d.ts +16 -9
- package/dist/index.js +58 -46
- package/dist/list-action-row.js +4 -1
- package/dist/list-detail-dialog.d.ts +117 -0
- package/dist/list-detail-dialog.js +165 -0
- package/dist/list-detail-dialog.js.map +1 -0
- package/dist/list-header.js +1 -1
- package/dist/list-item.js +1 -1
- package/dist/list.d.ts +17 -2
- package/dist/list.js +1 -1
- package/dist/lucide-icon.d.ts +9 -1
- package/dist/lucide-icon.js +1 -1
- package/dist/{composer.d.ts → message-composer.d.ts} +20 -12
- package/dist/message-composer.js +6 -0
- package/dist/message-composer.js.map +1 -0
- package/dist/nav-stack.js +1 -1
- package/dist/pane.d.ts +36 -3
- package/dist/pane.js +1 -1
- package/dist/popup-menu-register.d.ts +6 -5
- package/dist/popup-menu-register.js +3 -326
- package/dist/popup-menu-register.js.map +1 -1
- package/dist/popup-menu.d.ts +41 -23
- package/dist/popup-menu.js +5 -1
- package/dist/progress-bar.d.ts +52 -0
- package/dist/progress-bar.js +68 -0
- package/dist/progress-bar.js.map +1 -0
- package/dist/progress-ring.d.ts +44 -0
- package/dist/progress-ring.js +73 -0
- package/dist/progress-ring.js.map +1 -0
- package/dist/radio-group.d.ts +62 -0
- package/dist/radio-group.js +4 -0
- package/dist/radio-group.js.map +1 -0
- package/dist/row.js +1 -1
- package/dist/{token-search-model-JA1i8z4D.d.ts → search-field-CrGTN5sa.d.ts} +45 -45
- package/dist/search-field-model.d.ts +3 -0
- package/dist/search-field-model.js +3 -0
- package/dist/search-field-model.js.map +1 -0
- package/dist/search-field.d.ts +3 -0
- package/dist/search-field.js +5 -0
- package/dist/search-field.js.map +1 -0
- package/dist/select-register.d.ts +6 -3
- package/dist/select-register.js +383 -241
- package/dist/select-register.js.map +1 -1
- package/dist/select.d.ts +30 -6
- package/dist/select.js +3 -1
- package/dist/selection.d.ts +54 -0
- package/dist/selection.js +3 -0
- package/dist/selection.js.map +1 -0
- package/dist/slider.d.ts +74 -0
- package/dist/slider.js +103 -0
- package/dist/slider.js.map +1 -0
- package/dist/split-button.js +1 -1
- package/dist/split-view.d.ts +5 -2
- package/dist/split-view.js +18 -159
- package/dist/split-view.js.map +1 -1
- package/dist/state-banner.js +1 -1
- package/dist/styles/badge.css +18 -6
- package/dist/styles/button.css +230 -0
- package/dist/styles/catalog/components/catalog-example.css +13 -4
- package/dist/styles/checkbox.css +121 -0
- package/dist/styles/choice-chips.css +58 -7
- package/dist/styles/color-field.css +125 -0
- package/dist/styles/color-picker.css +331 -0
- package/dist/styles/color-swatches.css +122 -0
- package/dist/styles/combobox.css +7 -5
- package/dist/styles/components/actions/button/button.css +230 -0
- package/dist/styles/components/actions/popup-menu/popup-menu.css +326 -198
- package/dist/styles/components/actions/toolbar/toolbar.css +10 -3
- package/dist/styles/components/actions/toolbar-control-group/toolbar-control-group.css +67 -104
- package/dist/styles/components/actions/toolbar-text/toolbar-text.css +5 -18
- package/dist/styles/components/collections/list/list.css +37 -0
- package/dist/styles/components/feedback/badge/badge.css +18 -6
- package/dist/styles/components/feedback/progress-bar/progress-bar.css +168 -0
- package/dist/styles/components/feedback/progress-ring/progress-ring.css +91 -0
- package/dist/styles/components/feedback/state-banner/state-banner.css +18 -3
- package/dist/styles/components/forms/checkbox/checkbox.css +121 -0
- package/dist/styles/components/forms/choice-chips/choice-chips.css +58 -7
- package/dist/styles/components/forms/color-field/color-field.css +125 -0
- package/dist/styles/components/forms/color-picker/color-picker.css +331 -0
- package/dist/styles/components/forms/color-swatches/color-swatches.css +122 -0
- package/dist/styles/components/forms/combobox/combobox.css +7 -5
- package/dist/styles/components/forms/{composer/composer.css → message-composer/message-composer.css} +17 -33
- package/dist/styles/components/forms/radio-group/radio-group.css +156 -0
- package/dist/styles/{token-search-field.css → components/forms/search-field/search-field.css} +111 -102
- package/dist/styles/components/forms/select/select.css +370 -249
- package/dist/styles/components/forms/slider/slider.css +241 -0
- package/dist/styles/components/forms/switch/switch.css +132 -0
- package/dist/styles/components/forms/tag-field/tag-field.css +8 -0
- package/dist/styles/components/forms/text-field/text-field.css +193 -0
- package/dist/styles/components/layout/pane/pane.css +254 -0
- package/dist/styles/components/layout/resizable-region/resizable-region.css +3 -2
- package/dist/styles/components/layout/row/row.css +11 -0
- package/dist/styles/components/layout/split-view/split-view.css +25 -0
- package/dist/styles/components/layout/workbench/workbench.css +12 -4
- package/dist/styles/components/navigation/disclosure-arrow/disclosure-arrow.css +20 -0
- package/dist/styles/components/navigation/tab-bar/tab-bar.css +7 -7
- package/dist/styles/components/navigation/{app-tab/app-tab.css → tab-bar-item/tab-bar-item.css} +95 -90
- package/dist/styles/components/surfaces/disclosure/disclosure.css +98 -0
- package/dist/styles/components/surfaces/surface-scaffold/surface-scaffold.css +263 -116
- package/dist/styles/components/typography/text/text.css +14 -12
- package/dist/styles/disclosure-arrow.css +20 -0
- package/dist/styles/disclosure.css +98 -0
- package/dist/styles/foundation.css +6 -4
- package/dist/styles/list-detail-dialog.css +11 -0
- package/dist/styles/list.css +37 -0
- package/dist/styles/{composer.css → message-composer.css} +17 -33
- package/dist/styles/overlay-toast.css +149 -0
- package/dist/styles/overlay-tooltip.css +55 -0
- package/dist/styles/pane.css +254 -0
- package/dist/styles/popup-menu.css +326 -198
- package/dist/styles/progress-bar.css +168 -0
- package/dist/styles/progress-ring.css +91 -0
- package/dist/styles/radio-group.css +156 -0
- package/dist/styles/resizable-region.css +3 -2
- package/dist/styles/row.css +11 -0
- package/dist/styles/{components/forms/token-search-field/token-search-field.css → search-field.css} +111 -102
- package/dist/styles/select.css +370 -249
- package/dist/styles/slider.css +241 -0
- package/dist/styles/split-view.css +25 -0
- package/dist/styles/state-banner.css +18 -3
- package/dist/styles/styles.css +16 -5
- package/dist/styles/surface-scaffold.css +263 -116
- package/dist/styles/switch.css +132 -0
- package/dist/styles/{app-tab.css → tab-bar-item.css} +95 -90
- package/dist/styles/tab-bar.css +7 -7
- package/dist/styles/tag-field.css +8 -0
- package/dist/styles/text-field.css +193 -0
- package/dist/styles/text.css +14 -12
- package/dist/styles/toolbar-control-group.css +67 -104
- package/dist/styles/toolbar-text.css +5 -18
- package/dist/styles/toolbar.css +10 -3
- package/dist/styles/webawesome.css +9 -0
- package/dist/styles/workbench-dialog.css +10 -0
- package/dist/styles/workbench.css +12 -4
- package/dist/surface-scaffold-register.d.ts +7 -5
- package/dist/surface-scaffold-register.js +2 -246
- package/dist/surface-scaffold-register.js.map +1 -1
- package/dist/surface-scaffold.d.ts +70 -7
- package/dist/surface-scaffold.js +5 -1
- package/dist/switch.d.ts +38 -0
- package/dist/switch.js +4 -0
- package/dist/switch.js.map +1 -0
- package/dist/{app-tab.d.ts → tab-bar-item.d.ts} +11 -11
- package/dist/tab-bar-item.js +6 -0
- package/dist/tab-bar-item.js.map +1 -0
- package/dist/tab-bar.d.ts +3 -3
- package/dist/tab-bar.js +1 -1
- package/dist/tab-navigator.js +1 -1
- package/dist/tag-field.d.ts +52 -0
- package/dist/tag-field.js +6 -0
- package/dist/tag-field.js.map +1 -0
- package/dist/text-field.d.ts +83 -0
- package/dist/text-field.js +6 -0
- package/dist/text-field.js.map +1 -0
- package/dist/text.d.ts +6 -1
- package/dist/text.js +1 -1
- package/dist/{types-CVgIwSdq.d.ts → types-DmHWkSd6.d.ts} +19 -1
- package/dist/webawesome.d.ts +3 -0
- package/dist/wire-catalog.d.ts +8 -2
- package/dist/wire-catalog.js +16 -4
- package/dist/wire-catalog.js.map +1 -1
- package/dist/wire-checkboxes.d.ts +10 -0
- package/dist/wire-checkboxes.js +3 -0
- package/dist/{wire-composers.js.map → wire-checkboxes.js.map} +1 -1
- package/dist/wire-choice-chips.d.ts +17 -0
- package/dist/wire-choice-chips.js +4 -0
- package/dist/{wire-token-search-fields.js.map → wire-choice-chips.js.map} +1 -1
- package/dist/wire-color-fields.d.ts +33 -0
- package/dist/wire-color-fields.js +82 -0
- package/dist/wire-color-fields.js.map +1 -0
- package/dist/wire-color-pickers.d.ts +34 -0
- package/dist/wire-color-pickers.js +9 -0
- package/dist/wire-color-pickers.js.map +1 -0
- package/dist/wire-comboboxes.js +2 -1
- package/dist/wire-content-items.d.ts +5 -1
- package/dist/wire-content-items.js +84 -15
- package/dist/wire-content-items.js.map +1 -1
- package/dist/wire-file-pickers.d.ts +3 -2
- package/dist/wire-file-pickers.js +1 -1
- package/dist/{wire-composers.d.ts → wire-message-composers.d.ts} +5 -4
- package/dist/wire-message-composers.js +3 -0
- package/dist/wire-message-composers.js.map +1 -0
- package/dist/wire-overlay-sheets.js +1 -1
- package/dist/wire-pane-chrome.d.ts +21 -0
- package/dist/wire-pane-chrome.js +67 -0
- package/dist/wire-pane-chrome.js.map +1 -0
- package/dist/{wire-token-search-fields.d.ts → wire-search-fields.d.ts} +25 -25
- package/dist/wire-search-fields.js +6 -0
- package/dist/wire-search-fields.js.map +1 -0
- package/dist/wire-sliders.d.ts +12 -0
- package/dist/wire-sliders.js +31 -0
- package/dist/wire-sliders.js.map +1 -0
- package/dist/wire-tab-bars.js +1 -1
- package/dist/wire-tag-fields.d.ts +41 -0
- package/dist/wire-tag-fields.js +258 -0
- package/dist/wire-tag-fields.js.map +1 -0
- package/dist/wire-text-fields.d.ts +12 -0
- package/dist/wire-text-fields.js +3 -0
- package/dist/wire-text-fields.js.map +1 -0
- package/dist/workbench-dialog.d.ts +97 -0
- package/dist/workbench-dialog.js +124 -0
- package/dist/workbench-dialog.js.map +1 -0
- package/dist/workbench.d.ts +5 -0
- package/dist/workbench.js +1 -1
- package/docs/accessibility.md +181 -97
- package/docs/anchored-surface.md +8 -7
- package/docs/app-layouts.md +28 -0
- package/docs/catalog.md +14 -5
- package/docs/color-field.md +65 -0
- package/docs/color-picker.md +71 -0
- package/docs/color-swatches.md +46 -0
- package/docs/component-contract.md +31 -32
- package/docs/component-selection.md +228 -164
- package/docs/design/templates/button/emphasis-dark.svg +1 -0
- package/docs/design/templates/button/emphasis.svg +1 -0
- package/docs/design/templates/button/icons-dark.svg +1 -0
- package/docs/design/templates/button/icons.svg +1 -0
- package/docs/design/templates/button/pill-dark.svg +1 -0
- package/docs/design/templates/button/pill.svg +1 -0
- package/docs/design/templates/button/states-dark.svg +1 -0
- package/docs/design/templates/button/states.svg +1 -0
- package/docs/design/templates/button/toggles-dark.svg +1 -0
- package/docs/design/templates/button/toggles.svg +1 -0
- package/docs/design/templates/button/tones-dark.svg +1 -0
- package/docs/design/templates/button/tones.svg +1 -0
- package/docs/design/templates/button-dark.svg +1 -0
- package/docs/design/templates/button.svg +1 -0
- package/docs/design/templates/checkbox/compact-dark.svg +1 -0
- package/docs/design/templates/checkbox/compact.svg +1 -0
- package/docs/design/templates/checkbox/error-dark.svg +1 -0
- package/docs/design/templates/checkbox/error.svg +1 -0
- package/docs/design/templates/checkbox/mixed-dark.svg +1 -0
- package/docs/design/templates/checkbox/mixed.svg +1 -0
- package/docs/design/templates/checkbox/states-dark.svg +1 -0
- package/docs/design/templates/checkbox/states.svg +1 -0
- package/docs/design/templates/checkbox-dark.svg +1 -0
- package/docs/design/templates/checkbox.svg +1 -0
- package/docs/design/templates/choice-chips/color-palette-dark.svg +1 -1
- package/docs/design/templates/choice-chips/color-palette.svg +1 -1
- package/docs/design/templates/choice-chips/compact-icons-dark.svg +1 -1
- package/docs/design/templates/choice-chips/compact-icons.svg +1 -1
- package/docs/design/templates/choice-chips/multiple-dark.svg +1 -1
- package/docs/design/templates/choice-chips/multiple.svg +1 -1
- package/docs/design/templates/choice-chips-dark.svg +1 -1
- package/docs/design/templates/choice-chips.svg +1 -1
- package/docs/design/templates/color-field/compact-dark.svg +1 -0
- package/docs/design/templates/color-field/compact.svg +1 -0
- package/docs/design/templates/color-field/error-dark.svg +1 -0
- package/docs/design/templates/color-field/error.svg +1 -0
- package/docs/design/templates/color-field/hint-dark.svg +1 -0
- package/docs/design/templates/color-field/hint.svg +1 -0
- package/docs/design/templates/color-field-dark.svg +1 -0
- package/docs/design/templates/color-field.svg +1 -0
- package/docs/design/templates/color-picker/gray-dark.svg +1 -0
- package/docs/design/templates/color-picker/gray.svg +1 -0
- package/docs/design/templates/color-picker/rgb-dark.svg +1 -0
- package/docs/design/templates/color-picker/rgb.svg +1 -0
- package/docs/design/templates/color-picker-dark.svg +1 -0
- package/docs/design/templates/color-picker.svg +1 -0
- package/docs/design/templates/color-swatches/palette-dark.svg +1 -0
- package/docs/design/templates/color-swatches/palette.svg +1 -0
- package/docs/design/templates/color-swatches-dark.svg +1 -0
- package/docs/design/templates/color-swatches.svg +1 -0
- package/docs/design/templates/disclosure/framed-sunken-dark.svg +1 -0
- package/docs/design/templates/disclosure/framed-sunken.svg +1 -0
- package/docs/design/templates/disclosure/plain-dark.svg +1 -0
- package/docs/design/templates/disclosure/plain.svg +1 -0
- package/docs/design/templates/disclosure-dark.svg +1 -0
- package/docs/design/templates/disclosure.svg +1 -0
- package/docs/design/templates/list-header/size-l-dark.svg +1 -1
- package/docs/design/templates/list-header/size-l.svg +1 -1
- package/docs/design/templates/list-header/size-m-dark.svg +1 -1
- package/docs/design/templates/list-header/size-m.svg +1 -1
- package/docs/design/templates/list-header/size-xl-dark.svg +1 -1
- package/docs/design/templates/list-header/size-xl.svg +1 -1
- package/docs/design/templates/list-header-dark.svg +1 -1
- package/docs/design/templates/list-header.svg +1 -1
- package/docs/design/templates/message-composer/chat-dark.svg +1 -0
- package/docs/design/templates/message-composer/chat.svg +1 -0
- package/docs/design/templates/{composer → message-composer}/prompt-dark.svg +1 -1
- package/docs/design/templates/{composer → message-composer}/prompt.svg +1 -1
- package/docs/design/templates/message-composer-dark.svg +1 -0
- package/docs/design/templates/message-composer.svg +1 -0
- package/docs/design/templates/progress-bar/determinate-dark.svg +1 -0
- package/docs/design/templates/progress-bar/determinate.svg +1 -0
- package/docs/design/templates/progress-bar/tones-dark.svg +1 -0
- package/docs/design/templates/progress-bar/tones.svg +1 -0
- package/docs/design/templates/progress-bar-dark.svg +1 -0
- package/docs/design/templates/progress-bar.svg +1 -0
- package/docs/design/templates/progress-ring/sizes-dark.svg +1 -0
- package/docs/design/templates/progress-ring/sizes.svg +1 -0
- package/docs/design/templates/progress-ring/tones-dark.svg +1 -0
- package/docs/design/templates/progress-ring/tones.svg +1 -0
- package/docs/design/templates/progress-ring-dark.svg +1 -0
- package/docs/design/templates/progress-ring.svg +1 -0
- package/docs/design/templates/radio-group/horizontal-dark.svg +1 -0
- package/docs/design/templates/radio-group/horizontal.svg +1 -0
- package/docs/design/templates/radio-group/vertical-dark.svg +1 -0
- package/docs/design/templates/radio-group/vertical.svg +1 -0
- package/docs/design/templates/radio-group-dark.svg +1 -0
- package/docs/design/templates/radio-group.svg +1 -0
- package/docs/design/templates/segmented-control/equal-dark.svg +1 -1
- package/docs/design/templates/segmented-control/equal.svg +1 -1
- package/docs/design/templates/segmented-control/pill-small-dark.svg +1 -1
- package/docs/design/templates/segmented-control/pill-small.svg +1 -1
- package/docs/design/templates/segmented-control-dark.svg +1 -1
- package/docs/design/templates/segmented-control.svg +1 -1
- package/docs/design/templates/select/compact-dark.svg +1 -0
- package/docs/design/templates/select/compact.svg +1 -0
- package/docs/design/templates/select/form-dark.svg +1 -0
- package/docs/design/templates/select/form.svg +1 -0
- package/docs/design/templates/select/icons-dark.svg +1 -0
- package/docs/design/templates/select/icons.svg +1 -0
- package/docs/design/templates/select-dark.svg +1 -0
- package/docs/design/templates/select.svg +1 -0
- package/docs/design/templates/slider/compact-dark.svg +1 -0
- package/docs/design/templates/slider/compact.svg +1 -0
- package/docs/design/templates/slider/readout-dark.svg +1 -0
- package/docs/design/templates/slider/readout.svg +1 -0
- package/docs/design/templates/slider/ticks-dark.svg +1 -0
- package/docs/design/templates/slider/ticks.svg +1 -0
- package/docs/design/templates/slider-dark.svg +1 -0
- package/docs/design/templates/slider.svg +1 -0
- package/docs/design/templates/switch/compact-dark.svg +1 -0
- package/docs/design/templates/switch/compact.svg +1 -0
- package/docs/design/templates/switch/states-dark.svg +1 -0
- package/docs/design/templates/switch/states.svg +1 -0
- package/docs/design/templates/switch-dark.svg +1 -0
- package/docs/design/templates/switch.svg +1 -0
- package/docs/design/templates/tag-field/error-dark.svg +1 -0
- package/docs/design/templates/tag-field/error.svg +1 -0
- package/docs/design/templates/tag-field/tags-dark.svg +1 -0
- package/docs/design/templates/tag-field/tags.svg +1 -0
- package/docs/design/templates/tag-field-dark.svg +1 -0
- package/docs/design/templates/tag-field.svg +1 -0
- package/docs/design/templates/text-field/compact-dark.svg +1 -0
- package/docs/design/templates/text-field/compact.svg +1 -0
- package/docs/design/templates/text-field/error-dark.svg +1 -0
- package/docs/design/templates/text-field/error.svg +1 -0
- package/docs/design/templates/text-field/labeled-dark.svg +1 -0
- package/docs/design/templates/text-field/labeled.svg +1 -0
- package/docs/design/templates/text-field/multiline-dark.svg +1 -0
- package/docs/design/templates/text-field/multiline.svg +1 -0
- package/docs/design/templates/text-field/search-dark.svg +1 -0
- package/docs/design/templates/text-field/search.svg +1 -0
- package/docs/design/templates/text-field-dark.svg +1 -0
- package/docs/design/templates/text-field.svg +1 -0
- package/docs/design/templates/toolbar/title-and-actions-dark.svg +1 -1
- package/docs/design/templates/toolbar/title-and-actions.svg +1 -1
- package/docs/design/templates/toolbar/width-visibility-320-dark.svg +1 -1
- package/docs/design/templates/toolbar/width-visibility-320.svg +1 -1
- package/docs/design/templates/toolbar/width-visibility-600-dark.svg +1 -1
- package/docs/design/templates/toolbar/width-visibility-600.svg +1 -1
- package/docs/design/templates/toolbar-dark.svg +1 -1
- package/docs/design/templates/toolbar.svg +1 -1
- package/docs/design/templates/value-table/details-dark.svg +1 -1
- package/docs/design/templates/value-table/details.svg +1 -1
- package/docs/design/templates/value-table-dark.svg +1 -1
- package/docs/design/templates/value-table.svg +1 -1
- package/docs/design/templates.md +19 -6
- package/docs/design-philosophy.md +6 -6
- package/docs/disclosure.md +63 -0
- package/docs/examples/component-catalog-extension.json +2 -2
- package/docs/layout.md +16 -7
- package/docs/list-detail-dialog.md +96 -0
- package/docs/manual-test-plan.md +1 -1
- package/docs/{composer.md → message-composer.md} +41 -28
- package/docs/overlay-toast.md +62 -0
- package/docs/overlay-tooltip.md +53 -0
- package/docs/progress.md +62 -0
- package/docs/recipes.md +15 -21
- package/docs/slider.md +64 -0
- package/docs/surface-scaffold.md +155 -88
- package/docs/tag-field.md +66 -0
- package/docs/type-contracts.md +8 -8
- package/docs/ui-analyzer.md +1 -1
- package/docs/ui-doctor.md +11 -6
- package/docs/ux-demo.md +6 -6
- package/docs/webawesome-migration.md +80 -0
- package/docs/webawesome-theme.md +57 -35
- package/docs/workbench-dialog.md +85 -0
- package/docs/workbench.md +10 -6
- package/docs/writing.md +10 -8
- package/doctor/copy-capitalization-checks.mjs +18 -9
- package/llms.txt +127 -57
- package/package.json +156 -39
- package/ux-demo/recipes/composer-form.tsx +18 -19
- package/ux-demo/recipes/list-detail-dialog.tsx +55 -162
- package/ux-demo/recipes/mount-recipe.ts +7 -6
- package/ux-demo/recipes/types.ts +1 -0
- package/ai/components/icon-button.md +0 -82
- package/ai/components/icon-toggle-button.md +0 -80
- package/dist/app-tab.js +0 -6
- package/dist/app-tab.js.map +0 -1
- package/dist/browser/app-tab.js +0 -4
- package/dist/browser/composer.js +0 -4
- package/dist/browser/icon-toggle-button.js +0 -4
- package/dist/browser/token-search-field.js +0 -4
- package/dist/chunk-2MSPNRWJ.js.map +0 -1
- package/dist/chunk-7IUEBNCO.js.map +0 -1
- package/dist/chunk-AV7CPAPT.js +0 -82
- package/dist/chunk-AV7CPAPT.js.map +0 -1
- package/dist/chunk-BYFTHA4I.js.map +0 -1
- package/dist/chunk-CA7LNX3J.js +0 -44
- package/dist/chunk-CA7LNX3J.js.map +0 -1
- package/dist/chunk-CR5U5FV6.js.map +0 -1
- package/dist/chunk-ELCMSQNJ.js.map +0 -1
- package/dist/chunk-ETCWQLJV.js.map +0 -1
- package/dist/chunk-FDZNYD4C.js.map +0 -1
- package/dist/chunk-FR76ZJQC.js +0 -90
- package/dist/chunk-FR76ZJQC.js.map +0 -1
- package/dist/chunk-HQZYKJ56.js.map +0 -1
- package/dist/chunk-HZPHCSCS.js.map +0 -1
- package/dist/chunk-JOR5LGYE.js.map +0 -1
- package/dist/chunk-K4AT3V3J.js.map +0 -1
- package/dist/chunk-LL45C7BB.js.map +0 -1
- package/dist/chunk-LOSRXZAH.js.map +0 -1
- package/dist/chunk-LPHU44S3.js.map +0 -1
- package/dist/chunk-M5KZ26VV.js.map +0 -1
- package/dist/chunk-MXNIVEVL.js.map +0 -1
- package/dist/chunk-NS762OVM.js +0 -222
- package/dist/chunk-NS762OVM.js.map +0 -1
- package/dist/chunk-QTSMHH5J.js.map +0 -1
- package/dist/chunk-T5BJBMW7.js.map +0 -1
- package/dist/chunk-TDMHA7C3.js.map +0 -1
- package/dist/chunk-TGLUDQP2.js.map +0 -1
- package/dist/chunk-U6QYTMDB.js.map +0 -1
- package/dist/chunk-VFYO3UGZ.js +0 -45
- package/dist/chunk-VFYO3UGZ.js.map +0 -1
- package/dist/chunk-W4IK7AWD.js.map +0 -1
- package/dist/chunk-YBWQR2OK.js.map +0 -1
- package/dist/chunk-ZJC5ND3M.js.map +0 -1
- package/dist/composer.js +0 -5
- package/dist/composer.js.map +0 -1
- package/dist/icon-button.d.ts +0 -46
- package/dist/icon-button.js +0 -6
- package/dist/icon-button.js.map +0 -1
- package/dist/icon-toggle-button.d.ts +0 -42
- package/dist/icon-toggle-button.js +0 -6
- package/dist/icon-toggle-button.js.map +0 -1
- package/dist/styles/components/actions/icon-button/icon-button.css +0 -22
- package/dist/styles/components/actions/icon-toggle-button/icon-toggle-button.css +0 -83
- package/dist/styles/icon-button.css +0 -22
- package/dist/styles/icon-toggle-button.css +0 -83
- package/dist/token-search-field.d.ts +0 -3
- package/dist/token-search-field.js +0 -5
- package/dist/token-search-field.js.map +0 -1
- package/dist/token-search-model.d.ts +0 -3
- package/dist/token-search-model.js +0 -3
- package/dist/token-search-model.js.map +0 -1
- package/dist/wire-composers.js +0 -3
- package/dist/wire-token-search-fields.js +0 -6
- package/docs/design/templates/composer/chat-dark.svg +0 -1
- package/docs/design/templates/composer/chat.svg +0 -1
- package/docs/design/templates/composer-dark.svg +0 -1
- package/docs/design/templates/composer.svg +0 -1
- /package/docs/design/templates/{token-search-field → search-field}/empty-dark.svg +0 -0
- /package/docs/design/templates/{token-search-field → search-field}/empty.svg +0 -0
- /package/docs/design/templates/{token-search-field → search-field}/tokens-dark.svg +0 -0
- /package/docs/design/templates/{token-search-field → search-field}/tokens.svg +0 -0
- /package/docs/design/templates/{token-search-field-dark.svg → search-field-dark.svg} +0 -0
- /package/docs/design/templates/{token-search-field.svg → search-field.svg} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/forms/search-field/wiring/wire-search-fields.ts"],"names":["offset","block","keyboard","current"],"mappings":"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","file":"chunk-UMNHJSIO.js","sourcesContent":["import {\n autoUpdate,\n computePosition,\n flip,\n offset,\n shift,\n size,\n} from '@floating-ui/dom';\nimport { delegate, delegateCapture, type Signal, signal } from 'kerfjs';\n\nimport type { SearchFieldModel } from '../model/search-field-model.js';\nimport { placeSearchFieldCaret, readSearchField } from '../search-field.js';\n\nexport interface SearchFieldSubmit {\n id: string;\n editor: HTMLElement;\n}\n\n/** Reported to {@link WireSearchFieldsOptions.onEdit} on every editor input. */\nexport interface SearchFieldEdit extends SearchFieldSubmit {\n /**\n * The `InputEvent` that mutated the editor — read `event.inputType` / `event.data`\n * to gate commit behavior (e.g. only parse a chip on whitespace-terminated input)\n * without keeping a separate `input` listener.\n */\n event: InputEvent;\n}\n\n/** Reported when adjacent-token keyboard deletion asks the app to drop a chip. */\nexport interface SearchFieldTokenRemoval {\n id: string;\n /** The `data-token-value` of the token the app should remove from its state. */\n value: string;\n editor: HTMLElement;\n /** `'backward'` = the token before the caret (Backspace); `'forward'` = after (Delete). */\n direction: 'backward' | 'forward';\n}\n\n/**\n * Opt-in keyboard behavior for the atomic token chips. Off unless `keyboard` is\n * set; each piece defaults on once opted in. The helper never mutates app state:\n * a removal is reported through {@link SearchFieldKeyboardOptions.onRemoveToken}\n * for the caller to apply, while caret movement past a chip is a pure ephemeral\n * mechanic the helper performs itself.\n */\ninterface SearchFieldKeyboardBaseOptions {\n /**\n * From a collapsed caret with no selection, Backspace removes the token\n * immediately before it and Delete the token immediately after — reported via\n * `onRemoveToken` — instead of deleting a character. Default: true.\n */\n /**\n * ArrowRight moves the caret past a trailing atomic token so text typed next\n * lands after the chip. Default: true.\n */\n moveCaretPastToken?: boolean;\n /** Apply the reported removal to your controlled state, then re-render. */\n}\n\nexport type SearchFieldKeyboardOptions = SearchFieldKeyboardBaseOptions &\n (\n | {\n removeAdjacentToken?: true;\n /** Apply the reported removal to your controlled state, then re-render. */\n onRemoveToken: (removal: SearchFieldTokenRemoval) => void;\n }\n | { removeAdjacentToken: false; onRemoveToken?: never }\n );\n\n/**\n * Managed collapsible behavior for the iconic SearchField. Every piece is on\n * by default; disable a specific one to own it in the app. Provide `signals` to\n * drive app-owned `expanded` signals per field id instead of helper-created ones.\n */\nexport interface SearchFieldCollapsibleOptions {\n /** Expand the field and focus its editor when the iconic trigger is activated. Default: true. */\n expandOnActivate?: boolean;\n /** Collapse the field when focus leaves it while it is empty. Default: true. */\n collapseOnEmptyBlur?: boolean;\n /** Collapse an empty field on Escape and restore focus to its trigger. Default: true. */\n collapseOnEscape?: boolean;\n /** Focus the editor on expand/controlled clear and the trigger on Escape-collapse. Default: true. */\n manageFocus?: boolean;\n /**\n * Keep an empty field expanded when focus moves to a caller-owned surface\n * rendered outside the field — a suggestions dropdown, date picker, or help\n * popover shown beside it. Return true for any focus target that must NOT\n * trigger collapse-on-empty-blur. An element carrying `data-search-field-keep-open`\n * (or any node inside one) is always exempt, so this predicate is only needed\n * for surfaces you cannot mark declaratively.\n */\n keepOpenOn?: (target: Node | null) => boolean;\n /** App-owned `expanded` signals keyed by field id; adopted instead of helper-created. */\n signals?: Readonly<Record<string, Signal<boolean>>>;\n}\n\nexport interface WireSearchFieldsOptions {\n /** Optional automatic grammar/suggestion models, keyed by SearchField id. */\n models?: Readonly<Record<string, SearchFieldModel>>;\n onSubmit?: (submission: SearchFieldSubmit) => void;\n /** Fired on every editor `input`, after the browser mutates it, so a caller can drop its own `input` listener. */\n onEdit?: (edit: SearchFieldEdit) => void;\n /** Managed collapsible transient behavior. `true`/omitted = on with defaults; `false` = fully off. */\n collapsible?: boolean | SearchFieldCollapsibleOptions;\n /** Opt-in atomic-chip keyboard behavior (off by default). */\n keyboard?: false | SearchFieldKeyboardOptions;\n}\n\n/**\n * The value returned from {@link wireSearchFields}: call it (or `dispose()`) to\n * tear down. When collapsible behavior is managed, it also exposes the transient\n * `expanded` state per field id so the app can read it in render, hand in its own\n * signal, or drive it imperatively.\n */\nexport interface SearchFieldsHandle {\n (): void;\n dispose(): void;\n /** The managed `expanded` signal for a field id (adopted or helper-created); undefined when unmanaged. */\n expanded(id: string): Signal<boolean> | undefined;\n /** Expand the field (and, when focus is managed, focus its editor). */\n open(id: string): void;\n /** Collapse the field (and, when focus is managed, restore focus to its trigger). */\n close(id: string): void;\n}\n\ninterface PendingTokenDeletion {\n id: string;\n offset: number;\n tokenCount: number;\n selectedAll: boolean;\n}\n\nfunction editorFromEvent(\n root: HTMLElement,\n event: Event,\n): HTMLElement | undefined {\n const target = event.target;\n if (!(target instanceof Element)) return;\n const editor = target.closest<HTMLElement>('[data-search-field-editor]');\n return editor && root.contains(editor) ? editor : undefined;\n}\n\nfunction caretQueryOffset(editor: HTMLElement): number | undefined {\n const selection = editor.ownerDocument.getSelection();\n if (!selection || selection.rangeCount === 0) return;\n const selectionRange = selection.getRangeAt(0);\n if (!editor.contains(selectionRange.startContainer)) return;\n const prefixRange = editor.ownerDocument.createRange();\n prefixRange.selectNodeContents(editor);\n prefixRange.setEnd(selectionRange.startContainer, selectionRange.startOffset);\n const prefix = editor.ownerDocument.createElement('div');\n prefix.append(prefixRange.cloneContents());\n return readSearchField(prefix).query.length;\n}\n\nfunction replacementEditor(\n root: HTMLElement,\n id: string,\n): HTMLElement | undefined {\n return [\n ...root.querySelectorAll<HTMLElement>('[data-search-field-editor]'),\n ].find((editor) => editor.dataset.searchFieldEditor === id);\n}\n\nfunction editorIsEmpty(editor: HTMLElement): boolean {\n const value = readSearchField(editor);\n return value.query.length === 0 && value.tokens.length === 0;\n}\n\n/** Whether the active selection covers all logical text and tokens in the editor. */\nfunction selectionCoversEditor(editor: HTMLElement): boolean {\n // onBeforeInput calls this only after caretQueryOffset verified a live range.\n const selected = editor.ownerDocument.getSelection()!.getRangeAt(0);\n if (selected.collapsed || !editor.contains(selected.commonAncestorContainer))\n return false;\n // Browser select-all ranges are not structurally identical across platforms:\n // some use editor child offsets while others start/end inside the first/last\n // text nodes. Compare the selected logical value instead of DOM boundaries.\n const selectedHost = editor.ownerDocument.createElement('div');\n selectedHost.append(selected.cloneContents());\n const fullValue = readSearchField(editor);\n const selectedValue = readSearchField(selectedHost);\n return (\n selectedValue.query === fullValue.query &&\n selectedValue.tokens.length === fullValue.tokens.length &&\n selectedValue.tokens.every(\n (token, index) => token.value === fullValue.tokens[index]?.value,\n )\n );\n}\n\nconst TOKEN_SELECTOR = '[data-component=\"search-field-token\"]';\nconst TEXT_SELECTOR = '[data-search-field-text]';\nconst stripZwsp = (text: string): string => text.replaceAll('', '');\n\n/**\n * A `contenteditable` host emptied by select-all + Delete (or Backspace) leaves a\n * bogus `<br>` in every engine: it renders as a stray newline and `readSearchField`\n * reads it back as a space. Strip those line breaks after a delete, and when the field\n * is otherwise empty (no chips, no visible text) restore the canonical empty text span\n * and place the caret in it so typing resumes cleanly. Called only after the browser has\n * applied the delete, so an ordinary partial delete is never touched.\n */\nfunction normalizeEmptiedEditor(\n editor: HTMLElement,\n selectedAll = false,\n): void {\n const lineBreaks = editor.querySelectorAll('br');\n if (lineBreaks.length === 0 && !selectedAll) return;\n for (const lineBreak of lineBreaks) lineBreak.remove();\n if (!selectedAll && editor.querySelector(TOKEN_SELECTOR)) return;\n if (!selectedAll && stripZwsp(editor.textContent ?? '') !== '') return;\n const doc = editor.ownerDocument;\n const span = doc.createElement('span');\n span.setAttribute('data-search-field-text', '');\n span.setAttribute('data-empty', 'true');\n editor.replaceChildren(span);\n if (doc.activeElement !== editor) return;\n // The editor is the focused, connected editing host, so a selection exists.\n const selection = doc.getSelection()!;\n const range = doc.createRange();\n range.setStart(span, 0);\n range.collapse(true);\n selection.removeAllRanges();\n selection.addRange(range);\n}\n\n/** The collapsed, in-editor caret range, or undefined when there is a selection or none. */\nfunction collapsedCaret(editor: HTMLElement): Range | undefined {\n const selection = editor.ownerDocument.getSelection();\n if (!selection || selection.rangeCount === 0) return;\n const range = selection.getRangeAt(0);\n if (!range.collapsed || !editor.contains(range.startContainer)) return;\n return range;\n}\n\n/** The direct child of `editor` that contains `node` (or `node` itself), else null. */\nfunction topBlock(editor: HTMLElement, node: Node): Node | null {\n let current: Node = node;\n while (current.parentNode && current.parentNode !== editor)\n current = current.parentNode;\n return current.parentNode === editor ? current : null;\n}\n\n/** A text node or text span holding no visible character (only zero-width spacers). */\nfunction isBlankText(node: Node): boolean {\n if (node.nodeType === Node.TEXT_NODE)\n return stripZwsp((node as CharacterData).data) === '';\n return (\n node instanceof Element &&\n node.matches(TEXT_SELECTOR) &&\n stripZwsp(node.textContent ?? '') === ''\n );\n}\n\n/** The nearest sibling block on `direction`, skipping blank text spacers. */\nfunction meaningfulSibling(\n block: Node,\n direction: 'backward' | 'forward',\n): Node | null {\n let sibling =\n direction === 'backward' ? block.previousSibling : block.nextSibling;\n while (sibling && isBlankText(sibling))\n sibling =\n direction === 'backward' ? sibling.previousSibling : sibling.nextSibling;\n return sibling;\n}\n\n/** The node immediately on `direction` of the caret, only when no visible character separates them. */\nfunction caretSideNode(\n editor: HTMLElement,\n range: Range,\n direction: 'backward' | 'forward',\n): Node | null {\n const { startContainer: container, startOffset: offset } = range;\n if (container.nodeType === Node.TEXT_NODE) {\n const text = (container as CharacterData).data;\n const side =\n direction === 'backward' ? text.slice(0, offset) : text.slice(offset);\n if (stripZwsp(side).length > 0) return null;\n // An in-editor text node always has a top block (itself or its wrapping span).\n return meaningfulSibling(topBlock(editor, container)!, direction);\n }\n const child = container.childNodes[\n direction === 'backward' ? offset - 1 : offset\n ] as Node | undefined;\n if (child) {\n // `child` is a descendant of the in-editor caret container, so it has a top block.\n const block = topBlock(editor, child)!;\n return isBlankText(child) ? meaningfulSibling(block, direction) : block;\n }\n const block = topBlock(editor, container);\n return block ? meaningfulSibling(block, direction) : null;\n}\n\n/** The atomic token chip adjacent to a collapsed caret on `direction`, if any. */\nfunction adjacentToken(\n editor: HTMLElement,\n direction: 'backward' | 'forward',\n): HTMLElement | undefined {\n const range = collapsedCaret(editor);\n if (!range) return;\n const node = caretSideNode(editor, range, direction);\n if (!node) return;\n const base = node instanceof Element ? node : node.parentElement;\n const chip = base?.closest<HTMLElement>(TOKEN_SELECTOR) ?? null;\n return chip && editor.contains(chip) ? chip : undefined;\n}\n\n/** Move the caret to just after an atomic token chip so typed text lands after it.\n * Only reached after {@link collapsedCaret} already found a live selection, and the\n * chip is a direct block of the editor. */\nfunction placeCaretAfterToken(editor: HTMLElement, chip: HTMLElement): void {\n const selection = editor.ownerDocument.getSelection()!;\n const range = editor.ownerDocument.createRange();\n range.setStartAfter(topBlock(editor, chip)!);\n range.collapse(true);\n selection.removeAllRanges();\n selection.addRange(range);\n editor.focus({ preventScroll: true });\n}\n\n/**\n * Wire every SearchField under `root`: submit on Enter, preserve the caret across\n * controlled token deletion, and (by default) manage the collapsible field's transient\n * expand/collapse/focus. Returns a {@link SearchFieldsHandle} — a disposer that also\n * exposes the managed `expanded` state per field id.\n */\nexport function wireSearchFields(\n root: HTMLElement,\n {\n models = {},\n onSubmit,\n onEdit,\n collapsible = true,\n keyboard = false,\n }: WireSearchFieldsOptions = {},\n): SearchFieldsHandle {\n const managed = collapsible !== false;\n const config = typeof collapsible === 'object' ? collapsible : {};\n const expandOnActivate = managed && (config.expandOnActivate ?? true);\n const collapseOnEmptyBlur = managed && (config.collapseOnEmptyBlur ?? true);\n const collapseOnEscape = managed && (config.collapseOnEscape ?? true);\n const manageFocus = managed && (config.manageFocus ?? true);\n const keepOpenOn = config.keepOpenOn;\n const keyboardOn = keyboard !== false || Object.keys(models).length > 0;\n const keyboardConfig = typeof keyboard === 'object' ? keyboard : undefined;\n const removeAdjacentToken =\n keyboardOn && (keyboardConfig?.removeAdjacentToken ?? true);\n const moveCaretPastToken =\n keyboardOn && (keyboardConfig?.moveCaretPastToken ?? true);\n const onRemoveToken = keyboardConfig?.onRemoveToken;\n const adopted = config.signals ?? {};\n const created = new Map<string, Signal<boolean>>();\n let disposed = false;\n let pointerActivationTarget: Element | null = null;\n const pendingPointerBlurCollapses = new Map<string, () => void>();\n let pointerReleaseTimer: number | undefined;\n const positionedSuggestions = new Map<HTMLElement, () => void>();\n\n const syncSuggestions = () => {\n const current = new Set(\n root.querySelectorAll<HTMLElement>('.kui-search-field__suggestions'),\n );\n for (const [popup, stop] of positionedSuggestions) {\n if (current.has(popup)) continue;\n stop();\n positionedSuggestions.delete(popup);\n }\n for (const popup of current) {\n if (positionedSuggestions.has(popup)) continue;\n const field = popup.closest<HTMLElement>(\n '[data-component=\"search-field\"]',\n );\n if (!field) continue;\n let active = true;\n popup.style.position = 'absolute';\n popup.style.insetBlockStart = 'auto';\n popup.style.insetInlineStart = 'auto';\n popup.style.left = '0';\n popup.style.top = '0';\n popup.style.visibility = 'hidden';\n const update = async () => {\n const width = Math.min(\n Math.max(field.getBoundingClientRect().width, 240),\n Math.max(0, field.ownerDocument.defaultView!.innerWidth - 16),\n );\n popup.style.width = `${width}px`;\n const position = await computePosition(field, popup, {\n strategy: 'absolute',\n placement: 'bottom-start',\n middleware: [\n offset(4),\n flip({ padding: 8 }),\n shift({ padding: 8 }),\n size({\n padding: 8,\n apply({ availableHeight }) {\n popup.style.maxHeight = `${Math.max(0, Math.min(240, availableHeight))}px`;\n },\n }),\n ],\n });\n if (!active || disposed || !popup.isConnected) return;\n popup.style.left = `${position.x}px`;\n popup.style.top = `${position.y}px`;\n popup.style.visibility = 'visible';\n };\n const stopAutoUpdate = autoUpdate(field, popup, () => void update(), {\n layoutShift: false,\n });\n positionedSuggestions.set(popup, () => {\n active = false;\n stopAutoUpdate();\n for (const property of [\n 'position',\n 'inset-block-start',\n 'inset-inline-start',\n 'left',\n 'top',\n 'visibility',\n 'width',\n 'max-height',\n ])\n popup.style.removeProperty(property);\n });\n }\n };\n const suggestionsObserver = new MutationObserver(syncSuggestions);\n suggestionsObserver.observe(root, { childList: true, subtree: true });\n\n // The typed text is DOM-owned, but a host re-render for any other reason\n // (an error message beside the field, say) re-renders the field's\n // placeholder state from the app's query, which may be empty while text is\n // typed. Re-derive it from the live editor whenever a render resets it.\n const placeholderObserver = new MutationObserver((records) => {\n for (const record of records) {\n const field = record.target as HTMLElement;\n if (field.dataset.placeholderVisible !== 'true') continue;\n const editor = field.querySelector<HTMLElement>(\n ':scope > .kui-search-field__editor',\n );\n if (\n editor &&\n (editor.querySelector(TOKEN_SELECTOR) ||\n readSearchField(editor).query.length > 0)\n )\n field.dataset.placeholderVisible = 'false';\n }\n });\n placeholderObserver.observe(root, {\n attributes: true,\n attributeFilter: ['data-placeholder-visible'],\n subtree: true,\n });\n syncSuggestions();\n\n /** True when focus moving to `element` should keep an empty field expanded. */\n const isExemptTarget = (element: Element | null): boolean => {\n if (!element) return false;\n if (element.closest('[data-search-field-keep-open]')) return true;\n return keepOpenOn ? keepOpenOn(element) : false;\n };\n\n // WebKit can report `focusout.relatedTarget === null` while a pointer is\n // moving focus into a sibling button. Preserve the actual activation target\n // across that focus transition so a keep-open surface cannot be collapsed\n // (and removed) between pointerdown and click.\n const trackPointerActivation = (event: Event) => {\n if (pointerReleaseTimer !== undefined)\n view().clearTimeout(pointerReleaseTimer);\n pointerReleaseTimer = undefined;\n pointerActivationTarget =\n event.target instanceof Element ? event.target : null;\n };\n const flushPointerBlurCollapses = () => {\n if (pointerReleaseTimer !== undefined)\n view().clearTimeout(pointerReleaseTimer);\n pointerReleaseTimer = undefined;\n for (const collapse of pendingPointerBlurCollapses.values()) collapse();\n pendingPointerBlurCollapses.clear();\n };\n // The click has reached the window, the end of its propagation path, so\n // every app handler has run: collapse in the same task as the click's own\n // render, so the browser pays one style recalc and layout for both.\n const flushAfterClickDispatch = () => {\n view().queueMicrotask(flushPointerBlurCollapses);\n };\n const flushAfterPointerClick = () => {\n if (pendingPointerBlurCollapses.size === 0) return;\n if (pointerReleaseTimer !== undefined)\n view().clearTimeout(pointerReleaseTimer);\n // A pointerup can have no click (drag/cancel); a click can run app handlers\n // after capture. A task after either event preserves the pressed target.\n pointerReleaseTimer = view().setTimeout(flushPointerBlurCollapses, 0);\n };\n const clearPointerActivation = () => {\n pointerActivationTarget = null;\n };\n const clearPointerActivationAfterDefault = () => {\n view().queueMicrotask(clearPointerActivation);\n flushAfterPointerClick();\n };\n const clearPointerActivationAfterClick = () => {\n clearPointerActivation();\n flushAfterPointerClick();\n // The task above stays the fallback for a click whose propagation stops\n // before the window, or that is dispatched outside the document.\n if (pendingPointerBlurCollapses.size > 0)\n view().addEventListener('click', flushAfterClickDispatch, {\n once: true,\n });\n };\n const cancelPointerActivation = () => {\n clearPointerActivation();\n flushAfterPointerClick();\n };\n\n const signalFor = (id: string): Signal<boolean> => {\n const own = adopted[id];\n if (own) return own;\n let field = created.get(id);\n if (!field) {\n field = signal(false);\n created.set(id, field);\n }\n return field;\n };\n const setExpanded = (id: string, next: boolean) => {\n const state = signalFor(id);\n if (state.value !== next) state.value = next;\n };\n const view = () => root.ownerDocument.defaultView!;\n const focusing = new Map<string, () => void>();\n const focusAfterRender = (\n id: string,\n selector: string,\n guardMovedFocus = false,\n ) => {\n focusing.get(id)?.();\n let frame: number | undefined;\n const stop = () => {\n observer.disconnect();\n if (frame !== undefined) view().cancelAnimationFrame(frame);\n if (focusing.get(id) === stop) focusing.delete(id);\n };\n const restore = () => {\n if (disposed) return stop();\n const field = root.querySelector<HTMLElement>(\n `[data-component=\"search-field\"][data-search-field-id=\"${CSS.escape(id)}\"]`,\n );\n const target = field?.querySelector<HTMLElement>(selector);\n if (!field || !target) return;\n const active = field.ownerDocument.activeElement;\n // A later focus move to another control wins. The original editor may\n // have been replaced, leaving body active; controls of this field are\n // still part of the same interaction.\n if (\n guardMovedFocus &&\n active !== field.ownerDocument.body &&\n active !== target &&\n !field.contains(active)\n )\n return stop();\n stop();\n if (target.matches('[data-search-field-editor]'))\n placeSearchFieldCaret(target);\n else target.focus();\n };\n const observer = new MutationObserver(restore);\n observer.observe(root, { childList: true, subtree: true });\n focusing.set(id, stop);\n view().queueMicrotask(restore);\n // A collapsed field may reveal its editor in the next render frame.\n // The microtask/mutation path runs first; this bounded fallback keeps\n // opening reliable without reclaiming focus a user moved elsewhere.\n frame = view().requestAnimationFrame(() => {\n frame = undefined;\n restore();\n stop();\n });\n };\n const openField = (id: string) => {\n setExpanded(id, true);\n if (manageFocus) focusAfterRender(id, '[data-search-field-editor]');\n };\n const closeField = (id: string) => {\n setExpanded(id, false);\n if (manageFocus) focusAfterRender(id, '.kui-search-field__expand');\n };\n\n const clearing = new Map<string, () => void>();\n /** Whether a search field held focus when its ✕ was pressed. */\n const focusAtClearPress = new WeakMap<Element, boolean>();\n const pending = new Map<string, PendingTokenDeletion>();\n const deleting = new Map<string, () => void>();\n const selectAllIntents = new WeakSet<HTMLElement>();\n // editorFromEvent's selector guarantees this data attribute is present.\n const intentId = (editor: HTMLElement): string =>\n editor.dataset.searchFieldEditor!;\n const captureDeletion = (editor: HTMLElement, selectedAll?: boolean) => {\n if (editor.ownerDocument.activeElement !== editor) return;\n const field = editor.closest<HTMLElement>(\n '[data-component=\"search-field\"]',\n );\n const id = field?.dataset.searchFieldId;\n const offset = selectedAll ? 0 : caretQueryOffset(editor);\n if (!id || offset === undefined || field?.dataset.disabled === 'true')\n return;\n pending.set(id, {\n id,\n offset,\n tokenCount: editor.querySelectorAll(\n '[data-component=\"search-field-token\"]',\n ).length,\n selectedAll: selectedAll ?? selectionCoversEditor(editor),\n });\n };\n const onBeforeInput = (event: Event) => {\n const editor = editorFromEvent(root, event);\n if (editor && (event as InputEvent).inputType.startsWith('delete'))\n captureDeletion(editor);\n };\n const restoreDeletion = (\n editor: HTMLElement,\n deletion: {\n id: string;\n /** Query offset for the replacement, or a function of it. */\n offset: number | ((replacement: HTMLElement) => number | undefined);\n },\n ) => {\n deleting.get(deletion.id)?.();\n const stop = () => {\n observer.disconnect();\n view().clearTimeout(timeout);\n deleting.delete(deletion.id);\n };\n const restore = () => {\n const replacement = replacementEditor(root, deletion.id);\n // A native input can drain microtasks between capture and bubble listeners.\n // Wait for the actual replacement, including one rendered by a later listener.\n if (!replacement || replacement === editor) return;\n stop();\n const active = replacement.ownerDocument.activeElement;\n if (\n active !== editor &&\n active !== replacement &&\n active !== replacement.ownerDocument.body\n )\n return;\n placeSearchFieldCaret(\n replacement,\n typeof deletion.offset === 'number'\n ? deletion.offset\n : deletion.offset(replacement),\n );\n };\n const observer = new MutationObserver(restore);\n observer.observe(root, { childList: true, subtree: true });\n // The input task owns synchronous controlled rendering. Expiration only\n // disconnects observation; it cannot move a later selection or steal focus.\n const timeout = view().setTimeout(stop, 0);\n deleting.set(deletion.id, stop);\n };\n // An application that changes tokens while handling this input or key (it\n // commits typed grammar to a chip in onEdit, or applies onRemoveToken)\n // re-renders and replaces the focused editor. Hand focus and caret to the\n // replacement at the same mutation checkpoint, before another key can land\n // on no editor: a caret at the end of the query stays at the end, any other\n // caret keeps its place in the text that remains after the new chip.\n const handOffAppEdit = (editor: HTMLElement, id: string) => {\n if (editor.ownerDocument.activeElement !== editor) return;\n const offset = caretQueryOffset(editor);\n if (offset === undefined) return;\n const before = readSearchField(editor).query.length;\n restoreDeletion(editor, {\n id,\n offset: (replacement) => {\n if (offset >= before) return undefined;\n const after = readSearchField(replacement).query.length;\n return Math.min(after, Math.max(0, offset - (before - after)));\n },\n });\n };\n const onInput = (event: Event) => {\n const editor = editorFromEvent(root, event);\n if (!editor) return;\n const editorId = intentId(editor);\n const inputType = (event as InputEvent).inputType;\n if (!inputType.startsWith('delete')) selectAllIntents.delete(editor);\n const deletion = pending.get(editorId);\n if (inputType.startsWith('delete'))\n normalizeEmptiedEditor(editor, deletion?.selectedAll);\n const restore =\n deletion &&\n (deletion.selectedAll ||\n editor.querySelectorAll(TOKEN_SELECTOR).length < deletion.tokenCount);\n // Own the replacement before application listeners synchronously render.\n // A populated field can be visually open while its adopted signal is false.\n if (restore) {\n restoreDeletion(editor, deletion);\n if (\n manageFocus &&\n editor.closest<HTMLElement>('[data-component=\"search-field\"]')?.dataset\n .collapsible === 'true'\n )\n setExpanded(editorId, true);\n }\n const field = editor.closest<HTMLElement>(\n '[data-component=\"search-field\"]',\n );\n if (field)\n field.dataset.placeholderVisible = String(\n !editor.querySelector(TOKEN_SELECTOR) &&\n readSearchField(editor).query.length === 0,\n );\n const id = field?.dataset.searchFieldId;\n if (id && field?.dataset.disabled !== 'true') {\n const model = models[id];\n if (model) {\n const before = editor.querySelectorAll(TOKEN_SELECTOR).length;\n const current = readSearchField(editor, model.state.value.tokens);\n const input = event as InputEvent;\n const commit =\n (typeof input.data === 'string' && /\\s$/.test(input.data)) ||\n (input.inputType === 'insertFromPaste' && /\\s$/.test(current.query));\n model.edit(current, commit);\n if (model.state.value.tokens.length > before)\n focusAfterRender(id, '[data-search-field-editor]', true);\n }\n if (onEdit) {\n if (!restore && !model && !deleting.has(id)) handOffAppEdit(editor, id);\n onEdit({ id, editor, event: event as InputEvent });\n }\n }\n pending.delete(editorId);\n };\n root.addEventListener('beforeinput', onBeforeInput, true);\n root.addEventListener('input', onInput, true);\n\n const clearSelectAllIntent = (event: Event) => {\n const editor = editorFromEvent(root, event);\n if (editor) selectAllIntents.delete(editor);\n };\n const trackSelectAllIntent = (event: Event) => {\n const keyboardEvent = event as KeyboardEvent;\n const editor = editorFromEvent(root, event);\n if (!editor || keyboardEvent.isComposing) return;\n const fullDeletionInputType =\n keyboardEvent.key === 'Backspace'\n ? 'deleteContentBackward'\n : keyboardEvent.key === 'Delete'\n ? 'deleteContentForward'\n : undefined;\n if (\n keyboardEvent.key.toLowerCase() === 'a' &&\n (keyboardEvent.ctrlKey || keyboardEvent.metaKey) &&\n !keyboardEvent.altKey &&\n !keyboardEvent.shiftKey\n ) {\n // Capture this before target/bubble handlers can stop propagation.\n selectAllIntents.add(editor);\n return;\n }\n if (fullDeletionInputType && selectAllIntents.delete(editor)) {\n if (editor.parentElement?.dataset.disabled === 'true') return;\n // Native mixed-contenteditable deletion is not reliable: Linux engines\n // can leave contenteditable=false chips behind, and a controlled render\n // then restores them from application state. The preceding shortcut is\n // an unambiguous full-delete request, so own that transition and publish\n // the same bubbling input contract the native edit would have produced.\n keyboardEvent.preventDefault();\n captureDeletion(editor, true);\n normalizeEmptiedEditor(editor, true);\n editor.dispatchEvent(\n new InputEvent('input', {\n bubbles: true,\n inputType: fullDeletionInputType,\n }),\n );\n return;\n }\n // Any intervening keyboard action consumes the shortcut intent. Printable\n // replacement typing clears it here before the browser's input event; the\n // input listener also covers paste, drop, and other non-keyboard edits.\n if (!fullDeletionInputType) selectAllIntents.delete(editor);\n };\n root.addEventListener('keydown', trackSelectAllIntent, true);\n root.addEventListener('pointerdown', clearSelectAllIntent, true);\n root.addEventListener('focusout', clearSelectAllIntent, true);\n\n const disposers: Array<() => void> = [\n () => {\n pending.clear();\n for (const stop of deleting.values()) stop();\n },\n () => root.removeEventListener('beforeinput', onBeforeInput, true),\n () => root.removeEventListener('input', onInput, true),\n () => root.removeEventListener('keydown', trackSelectAllIntent, true),\n () => root.removeEventListener('pointerdown', clearSelectAllIntent, true),\n () => root.removeEventListener('focusout', clearSelectAllIntent, true),\n ];\n\n disposers.push(\n delegate(\n root,\n 'click',\n '[data-search-field-form-label]',\n (_event, label) => {\n const field = label.parentElement?.querySelector<HTMLElement>(\n '[data-component=\"search-field\"]',\n );\n if (field?.dataset.disabled === 'true') return;\n field\n ?.querySelector<HTMLElement>('[data-search-field-editor]')\n ?.focus();\n },\n ),\n );\n\n disposers.push(\n delegate(\n root,\n 'keydown',\n '[data-search-field-editor]',\n (event, element) => {\n const keyboardEvent = event as KeyboardEvent;\n const editor = element as HTMLElement;\n if (keyboardEvent.isComposing) return;\n const field = editor.closest<HTMLElement>(\n '[data-component=\"search-field\"]',\n );\n const id = field?.dataset.searchFieldId;\n if (!id || field?.dataset.disabled === 'true') return;\n // A TagField's editor is a SearchField whose keys `wireTagFields`\n // owns (adding, removing, and moving between tags), so the token\n // keyboard behavior here leaves it alone.\n const keyboardForField =\n !editor.closest('[data-component=\"tag-field\"]') &&\n (keyboard !== false || Boolean(models[id]));\n if (keyboardEvent.key === 'Enter') {\n keyboardEvent.preventDefault();\n const model = models[id];\n if (model)\n model.submit(readSearchField(editor, model.state.value.tokens));\n onSubmit?.({ id, editor });\n return;\n }\n if (models[id] && keyboardEvent.key === 'ArrowDown') {\n const first = field.querySelector<HTMLButtonElement>(\n '[data-search-field-suggestion]',\n );\n if (first) {\n keyboardEvent.preventDefault();\n first.focus();\n return;\n }\n }\n if (models[id] && keyboardEvent.key === 'Escape') models[id].dismiss();\n if (\n keyboardForField &&\n removeAdjacentToken &&\n (keyboardEvent.key === 'Backspace' || keyboardEvent.key === 'Delete')\n ) {\n const direction =\n keyboardEvent.key === 'Backspace' ? 'backward' : 'forward';\n const chip = adjacentToken(editor, direction);\n if (chip) {\n keyboardEvent.preventDefault();\n const removal: SearchFieldTokenRemoval = {\n id,\n value: chip.dataset.tokenValue ?? '',\n editor,\n direction,\n };\n const offset = caretQueryOffset(editor);\n if (offset !== undefined) restoreDeletion(editor, { id, offset });\n models[id]?.remove(removal.value);\n onRemoveToken?.(removal);\n return;\n }\n }\n if (\n keyboardForField &&\n moveCaretPastToken &&\n keyboardEvent.key === 'ArrowRight'\n ) {\n const chip = adjacentToken(editor, 'forward');\n if (chip) {\n keyboardEvent.preventDefault();\n placeCaretAfterToken(editor, chip);\n return;\n }\n }\n if (\n collapseOnEscape &&\n keyboardEvent.key === 'Escape' &&\n field?.dataset.collapsible === 'true' &&\n editorIsEmpty(editor)\n ) {\n keyboardEvent.preventDefault();\n closeField(id);\n }\n },\n ),\n );\n\n if (Object.keys(models).length > 0) {\n disposers.push(\n delegate(\n root,\n 'keydown',\n '[data-search-field-suggestion]',\n (event, element) => {\n const keyboard = event as KeyboardEvent;\n const button = element as HTMLButtonElement;\n const buttons = [\n ...button.parentElement!.querySelectorAll<HTMLButtonElement>(\n '[data-search-field-suggestion]',\n ),\n ];\n const index = buttons.indexOf(button);\n if (keyboard.key === 'Escape') {\n keyboard.preventDefault();\n button\n .closest<HTMLElement>('[data-component=\"search-field\"]')\n ?.querySelector<HTMLElement>('[data-search-field-editor]')\n ?.focus();\n } else if (\n keyboard.key === 'ArrowDown' ||\n keyboard.key === 'ArrowUp'\n ) {\n keyboard.preventDefault();\n buttons[\n (index +\n (keyboard.key === 'ArrowDown' ? 1 : buttons.length - 1)) %\n buttons.length\n ]?.focus();\n }\n },\n ),\n delegate(\n root,\n 'click',\n '[data-search-field-suggestion]',\n (_event, element) => {\n const field = element.closest<HTMLElement>(\n '[data-component=\"search-field\"]',\n );\n const id = field?.dataset.searchFieldId;\n const value = (element as HTMLElement).dataset.searchFieldSuggestion;\n if (!id || !value || field?.dataset.disabled === 'true') return;\n models[id]?.choose(value);\n focusAfterRender(id, '[data-search-field-editor]', true);\n },\n ),\n delegate(\n root,\n 'click',\n '.kui-search-field__token-edit',\n (_event, element) => {\n const field = element.closest<HTMLElement>(\n '[data-component=\"search-field\"]',\n );\n const id = field?.dataset.searchFieldId;\n const value = (element as HTMLElement).dataset.tokenValue;\n if (\n !id ||\n !value ||\n field?.dataset.disabled === 'true' ||\n !models[id]\n )\n return;\n models[id].expandToken(value);\n focusAfterRender(id, '[data-search-field-editor]', true);\n },\n ),\n delegate(\n root,\n 'click',\n '.kui-search-field__token-remove',\n (_event, element) => {\n const field = element.closest<HTMLElement>(\n '[data-component=\"search-field\"]',\n );\n const id = field?.dataset.searchFieldId;\n const value = (element as HTMLElement).dataset.tokenValue;\n if (id && value && field?.dataset.disabled !== 'true')\n models[id]?.remove(value);\n },\n ),\n delegate(root, 'click', '.kui-search-field__clear', (_event, element) => {\n const field = element.closest<HTMLElement>(\n '[data-component=\"search-field\"]',\n );\n const id = field?.dataset.searchFieldId;\n if (id && field?.dataset.disabled !== 'true') models[id]?.clear();\n }),\n );\n }\n\n if (expandOnActivate) {\n disposers.push(\n delegate(\n root,\n 'click',\n '.kui-search-field__expand',\n (_event, element) => {\n // The selector guarantees a collapsible field ancestor; only skip a disabled one.\n const field = (element as HTMLElement).closest<HTMLElement>(\n '[data-component=\"search-field\"]',\n );\n const id = field?.dataset.searchFieldId;\n if (id && field?.dataset.disabled !== 'true') openField(id);\n },\n ),\n );\n }\n\n if (manageFocus) {\n disposers.push(\n () => {\n for (const stop of clearing.values()) stop();\n },\n delegateCapture(\n root,\n 'pointerdown',\n '.kui-search-field__clear',\n (_event, element) => {\n const field = element.closest('[data-component=\"search-field\"]');\n focusAtClearPress.set(\n element,\n !!field?.contains(root.ownerDocument.activeElement),\n );\n },\n ),\n delegateCapture(\n root,\n 'click',\n '.kui-search-field__clear',\n (_event, element) => {\n const field = element.closest<HTMLElement>(\n '[data-component=\"search-field\"]',\n );\n const id = field?.dataset.searchFieldId;\n if (\n !id ||\n (field.dataset.collapsible !== 'true' && !models[id]) ||\n field.dataset.disabled === 'true'\n )\n return;\n const editor = replacementEditor(root, id);\n clearing.get(id)?.();\n // Whether the field held focus when ✕ was pressed. A pointer press\n // is recorded at pointerdown, before WebKit drops focus to the body\n // for a button it does not focus; keyboard activation focuses ✕\n // itself. When focus was outside the field, the clear must not pull\n // focus or the caret in: an emptied collapsible field collapses\n // instead, as it would on blur.\n const pressed = focusAtClearPress.get(element);\n focusAtClearPress.delete(element);\n const focusedBefore =\n pressed ?? field.contains(root.ownerDocument.activeElement);\n const collapseIfEmpty = () => {\n const current = replacementEditor(root, id);\n if (\n field.dataset.collapsible === 'true' &&\n current &&\n editorIsEmpty(current)\n )\n setExpanded(id, false);\n };\n const stop = () => {\n observer.disconnect();\n view().clearTimeout(timeout);\n clearing.delete(id);\n };\n const ownsFocus = (replacement: HTMLElement) => {\n const active = root.ownerDocument.activeElement;\n return (\n active === editor ||\n active === element ||\n active === replacement ||\n active === root.ownerDocument.body\n );\n };\n const observer = new MutationObserver(() => {\n const replacement = replacementEditor(root, id);\n if (!replacement || replacement === editor) return;\n stop();\n if (!focusedBefore) collapseIfEmpty();\n else if (ownsFocus(replacement)) placeSearchFieldCaret(replacement);\n });\n // Native clicks can drain microtasks between capture and bubble listeners.\n // Observe the actual controlled replacement before the app clears; a frame\n // is too late because the next shortcut-letter input may reach the page.\n observer.observe(root, { childList: true, subtree: true });\n const timeout = view().setTimeout(() => {\n stop();\n // A clear that re-rendered in place (no replacement editor).\n if (!focusedBefore) collapseIfEmpty();\n }, 0);\n clearing.set(id, stop);\n if (!focusedBefore) return;\n if (field.dataset.collapsible === 'true') setExpanded(id, true);\n const current = replacementEditor(root, id);\n // Keyboard activation may start on the clear button. Own the current\n // editor now, and its replacement at the mutation checkpoint. Expiration\n // only disconnects observation; it never moves a later caret or focus.\n if (current && ownsFocus(current)) placeSearchFieldCaret(current);\n },\n ),\n );\n }\n\n if (collapseOnEmptyBlur) {\n root.ownerDocument.addEventListener(\n 'pointerdown',\n trackPointerActivation,\n true,\n );\n root.ownerDocument.addEventListener(\n 'pointerup',\n clearPointerActivationAfterDefault,\n true,\n );\n root.ownerDocument.addEventListener(\n 'pointercancel',\n cancelPointerActivation,\n true,\n );\n root.ownerDocument.addEventListener(\n 'click',\n clearPointerActivationAfterClick,\n true,\n );\n disposers.push(\n () =>\n root.ownerDocument.removeEventListener(\n 'pointerdown',\n trackPointerActivation,\n true,\n ),\n () =>\n root.ownerDocument.removeEventListener(\n 'pointerup',\n clearPointerActivationAfterDefault,\n true,\n ),\n () =>\n root.ownerDocument.removeEventListener(\n 'pointercancel',\n cancelPointerActivation,\n true,\n ),\n () =>\n root.ownerDocument.removeEventListener(\n 'click',\n clearPointerActivationAfterClick,\n true,\n ),\n );\n // Pressing an in-field control (clear, trailing, token, or the trigger) must not\n // blur the editor — otherwise the transient blur would collapse the field before\n // the control's own handler runs. Keeping focus also keeps the click firing.\n disposers.push(\n delegate(\n root,\n 'mousedown',\n '[data-component=\"search-field\"][data-collapsible=\"true\"] button',\n (event) => {\n event.preventDefault();\n },\n ),\n );\n disposers.push(\n delegate(\n root,\n 'focusout',\n '[data-search-field-editor]',\n (event, element) => {\n const editor = element as HTMLElement;\n const field = editor.closest<HTMLElement>(\n '[data-component=\"search-field\"]',\n );\n const id = field?.dataset.searchFieldId;\n if (\n !id ||\n field?.dataset.collapsible !== 'true' ||\n field.dataset.disabled === 'true'\n )\n return;\n const relatedTarget = (event as FocusEvent).relatedTarget;\n const next =\n relatedTarget instanceof Element\n ? relatedTarget\n : pointerActivationTarget;\n if (!next && (clearing.has(id) || (manageFocus && deleting.has(id))))\n return;\n if (next instanceof Node && field.contains(next)) return;\n if (isExemptTarget(next instanceof Element ? next : null)) return;\n if (!editorIsEmpty(editor)) return;\n const collapseIfStillEmptyAndBlurred = () => {\n if (disposed || !editorIsEmpty(editor)) return;\n const active = field.ownerDocument.activeElement;\n if (!field.contains(active) && !isExemptTarget(active))\n setExpanded(id, false);\n };\n if (pointerActivationTarget)\n pendingPointerBlurCollapses.set(id, collapseIfStillEmptyAndBlurred);\n else view().queueMicrotask(collapseIfStillEmptyAndBlurred);\n },\n ),\n );\n }\n\n const dispose = () => {\n disposed = true;\n if (pointerReleaseTimer !== undefined)\n view().clearTimeout(pointerReleaseTimer);\n view().removeEventListener('click', flushAfterClickDispatch);\n pendingPointerBlurCollapses.clear();\n suggestionsObserver.disconnect();\n placeholderObserver.disconnect();\n for (const stop of positionedSuggestions.values()) stop();\n positionedSuggestions.clear();\n for (const stop of focusing.values()) stop();\n for (const stop of disposers.splice(0)) stop();\n };\n const handle = (() => dispose()) as SearchFieldsHandle;\n handle.dispose = dispose;\n handle.expanded = (id) => (managed ? signalFor(id) : undefined);\n handle.open = (id) => {\n if (managed && !disposed) openField(id);\n };\n handle.close = (id) => {\n if (managed && !disposed) closeField(id);\n };\n return handle;\n}\n"]}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { LoadingSpinner } from './chunk-WVS6CUCT.js';
|
|
2
|
+
import { Badge } from './chunk-RMWNO6BA.js';
|
|
3
|
+
import { filterDataAttributes } from './chunk-KH4KEMSP.js';
|
|
4
|
+
import { jsx, jsxs, Fragment } from 'kerfjs/jsx-runtime';
|
|
5
|
+
|
|
6
|
+
var BUTTON_PROTECTED = /* @__PURE__ */ new Set([
|
|
7
|
+
"data-component",
|
|
8
|
+
"data-action",
|
|
9
|
+
"data-tone",
|
|
10
|
+
"data-emphasis",
|
|
11
|
+
"data-size",
|
|
12
|
+
"data-loading",
|
|
13
|
+
"data-icon-only",
|
|
14
|
+
"data-shape"
|
|
15
|
+
]);
|
|
16
|
+
function Button({
|
|
17
|
+
children,
|
|
18
|
+
tone = "neutral",
|
|
19
|
+
emphasis = "primary",
|
|
20
|
+
size = "default",
|
|
21
|
+
shape = "rounded",
|
|
22
|
+
pressed,
|
|
23
|
+
icon,
|
|
24
|
+
loading = false,
|
|
25
|
+
disabled = false,
|
|
26
|
+
type = "button",
|
|
27
|
+
name,
|
|
28
|
+
value,
|
|
29
|
+
form,
|
|
30
|
+
href,
|
|
31
|
+
target,
|
|
32
|
+
action,
|
|
33
|
+
badge,
|
|
34
|
+
badgeLabel,
|
|
35
|
+
badgeTone = "danger",
|
|
36
|
+
ariaLabel,
|
|
37
|
+
title,
|
|
38
|
+
id,
|
|
39
|
+
className = "",
|
|
40
|
+
rootAttributes = {},
|
|
41
|
+
slot
|
|
42
|
+
}) {
|
|
43
|
+
const shared = {
|
|
44
|
+
...filterDataAttributes(rootAttributes, BUTTON_PROTECTED),
|
|
45
|
+
id,
|
|
46
|
+
class: `kui-button ${className}`.trim(),
|
|
47
|
+
"data-component": "button",
|
|
48
|
+
"data-tone": tone,
|
|
49
|
+
"data-emphasis": emphasis,
|
|
50
|
+
"data-size": size,
|
|
51
|
+
"data-loading": loading ? "" : void 0,
|
|
52
|
+
"data-icon-only": children === void 0 ? "" : void 0,
|
|
53
|
+
"data-shape": shape === "pill" ? "pill" : void 0,
|
|
54
|
+
"data-action": action,
|
|
55
|
+
"aria-label": ariaLabel && badge !== void 0 && badgeLabel ? `${ariaLabel}, ${badgeLabel}` : ariaLabel,
|
|
56
|
+
title,
|
|
57
|
+
"aria-busy": loading ? "true" : void 0,
|
|
58
|
+
slot
|
|
59
|
+
};
|
|
60
|
+
const content = /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
61
|
+
icon === void 0 ? null : /* @__PURE__ */ jsx("span", { class: "kui-button__icon", "aria-hidden": "true", children: icon }),
|
|
62
|
+
children === void 0 ? null : /* @__PURE__ */ jsx("span", { class: "kui-button__label", children }),
|
|
63
|
+
badge === void 0 || badge === "" ? null : badge === true ? /* @__PURE__ */ jsx(
|
|
64
|
+
Badge,
|
|
65
|
+
{
|
|
66
|
+
tone: badgeTone,
|
|
67
|
+
size: "dot",
|
|
68
|
+
placement: "corner",
|
|
69
|
+
...ariaLabel || !badgeLabel ? { ariaHidden: true } : { label: badgeLabel }
|
|
70
|
+
}
|
|
71
|
+
) : /* @__PURE__ */ jsx(
|
|
72
|
+
Badge,
|
|
73
|
+
{
|
|
74
|
+
tone: badgeTone,
|
|
75
|
+
appearance: "solid",
|
|
76
|
+
size: "compact",
|
|
77
|
+
placement: "corner",
|
|
78
|
+
...ariaLabel || !badgeLabel ? { ariaHidden: true } : { label: badgeLabel },
|
|
79
|
+
children: String(badge)
|
|
80
|
+
}
|
|
81
|
+
),
|
|
82
|
+
loading ? /* @__PURE__ */ jsx("span", { class: "kui-button__spinner", "aria-hidden": "true", children: /* @__PURE__ */ jsx(LoadingSpinner, {}) }) : null
|
|
83
|
+
] });
|
|
84
|
+
if (href !== void 0) {
|
|
85
|
+
if (pressed !== void 0)
|
|
86
|
+
throw new TypeError("A link Button cannot be a toggle (pressed).");
|
|
87
|
+
return /* @__PURE__ */ jsx(
|
|
88
|
+
"a",
|
|
89
|
+
{
|
|
90
|
+
...shared,
|
|
91
|
+
href: disabled ? void 0 : href,
|
|
92
|
+
target: disabled ? void 0 : target,
|
|
93
|
+
role: disabled ? "link" : void 0,
|
|
94
|
+
"aria-disabled": disabled ? "true" : void 0,
|
|
95
|
+
children: content
|
|
96
|
+
}
|
|
97
|
+
);
|
|
98
|
+
}
|
|
99
|
+
return /* @__PURE__ */ jsx(
|
|
100
|
+
"button",
|
|
101
|
+
{
|
|
102
|
+
...shared,
|
|
103
|
+
type,
|
|
104
|
+
name,
|
|
105
|
+
value,
|
|
106
|
+
form,
|
|
107
|
+
disabled,
|
|
108
|
+
"aria-pressed": pressed === void 0 ? void 0 : String(pressed),
|
|
109
|
+
children: content
|
|
110
|
+
}
|
|
111
|
+
);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
export { Button };
|
|
115
|
+
|
|
116
|
+
//# sourceMappingURL=chunk-UTCAOOXU.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/actions/button/button.tsx"],"names":[],"mappings":"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","file":"chunk-UTCAOOXU.js","sourcesContent":["import type { KerfUiContent } from '../../../shared/content/semantic-content.js';\nimport { filterDataAttributes } from '../../../shared/dom/extension-attributes.js';\nimport { Badge, type BadgeTone } from '../../feedback/badge/badge.js';\nimport { LoadingSpinner } from '../../feedback/loading-spinner/loading-spinner.js';\n\n/** The color family: `neutral` (default), `brand` for the main action, `danger` for a destructive one. */\nexport type ButtonTone = 'neutral' | 'brand' | 'danger';\n\n/**\n * How loudly it asks: `primary` (default) fills the button, `secondary`\n * outlines it, and `plain` shows only its text until hovered.\n */\nexport type ButtonEmphasis = 'primary' | 'secondary' | 'plain';\n\n/** `default` is the 44px control height; `compact` is 33px with smaller text. */\nexport type ButtonSize = 'default' | 'compact';\n\n/** Corner shape: the shared `rounded` control radius (default) or a full `pill`. */\nexport type ButtonShape = 'rounded' | 'pill';\n/** What a form button does: `button` (default), `submit`, or `reset`. */\nexport type ButtonType = 'button' | 'submit' | 'reset';\n\nconst BUTTON_PROTECTED = new Set([\n 'data-component',\n 'data-action',\n 'data-tone',\n 'data-emphasis',\n 'data-size',\n 'data-loading',\n 'data-icon-only',\n 'data-shape',\n]);\n\n/** Application `data-*` metadata; the Button's own markers stay protected. */\nexport type ButtonRootAttributes = Readonly<\n Record<`data-${string}`, string | undefined>\n>;\n\n/** A Button's visible label: text or rendered content, never empty. */\nexport type ButtonLabel =\n string | Exclude<KerfUiContent, null | undefined | boolean>;\n\n/**\n * A labeled button (its label names it; `ariaLabel` only when the label is\n * not enough), or an icon-only square named by `ariaLabel`.\n */\nexport type ButtonContent =\n | {\n /** The label. */\n children: ButtonLabel;\n /** A leading icon, such as a `LucideIcon`; it is decorative. */\n icon?: KerfUiContent;\n ariaLabel?: string;\n }\n | {\n children?: undefined;\n /** The icon of an icon-only square button. */\n icon: KerfUiContent;\n /** The accessible name an icon-only button needs. */\n ariaLabel: string;\n };\n\nexport type ButtonProps = ButtonContent & ButtonOptions;\n\nexport interface ButtonOptions {\n tone?: ButtonTone;\n emphasis?: ButtonEmphasis;\n size?: ButtonSize;\n /** Corner shape (default `rounded`). */\n shape?: ButtonShape;\n /**\n * Make it a toggle: `aria-pressed` reports the state, and a pressed look is\n * drawn on top of the tone and emphasis. The application owns the state and\n * flips it in its `action` handler. A link (`href`) cannot be a toggle.\n */\n pressed?: boolean;\n /**\n * Busy: a spinner replaces the label (which still names it) and the button\n * reports `aria-busy`. Presses still reach it; the application decides\n * what a press does while it is busy.\n */\n loading?: boolean;\n disabled?: boolean;\n /** A form button's behavior (default `button`, which never submits). */\n type?: ButtonType;\n name?: string;\n value?: string;\n /** The id of the form it belongs to, when it sits outside that form. */\n form?: string;\n /** Render a link with button styling instead of a `<button>`. */\n href?: string;\n /** Where a link opens. */\n target?: '_self' | '_blank' | '_parent' | '_top';\n /** Delegated `data-action` the application handles. */\n action?: string;\n /**\n * A count, short text, or `true` for a text-free dot over the button's\n * top-trailing corner, such as how many items a filter hides. It stays out\n * of the accessible name unless `badgeLabel` names it.\n */\n badge?: number | string | true;\n /** Words for the badge (\"3 hidden\"), added to the button's name. */\n badgeLabel?: string;\n /** The badge's tone (default `danger`). */\n badgeTone?: BadgeTone;\n /**\n * Native hover text that says more than the name, such as \"More Actions\n * for report.pdf\". An icon-only Button already gets a help tag with its\n * `ariaLabel` (with `@kerfjs/ui/help-tags-register`); a `title` replaces\n * that tag.\n */\n title?: string;\n id?: string;\n className?: string;\n /** Safe `data-*` metadata (a `data-key`, `data-dialog-close`). */\n rootAttributes?: ButtonRootAttributes;\n /** Native named-slot assignment when composed inside a web component. */\n slot?: string;\n}\n\n/**\n * A standalone action button: a native `<button>` (or a link with `href`)\n * in one of three tones and three emphases, at the 44px control height or\n * compact, with a label or as an icon-only square, rounded or pill-shaped,\n * and optionally a `pressed` toggle. Inside a\n * `ToolbarControlGroup`, use a plain `<button>`, which the group styles; use\n * Button for a dialog footer, a form, or a standalone action beside other\n * content.\n */\nexport function Button({\n children,\n tone = 'neutral',\n emphasis = 'primary',\n size = 'default',\n shape = 'rounded',\n pressed,\n icon,\n loading = false,\n disabled = false,\n type = 'button',\n name,\n value,\n form,\n href,\n target,\n action,\n badge,\n badgeLabel,\n badgeTone = 'danger',\n ariaLabel,\n title,\n id,\n className = '',\n rootAttributes = {},\n slot,\n}: ButtonProps) {\n const shared = {\n ...filterDataAttributes(rootAttributes, BUTTON_PROTECTED),\n id,\n class: `kui-button ${className}`.trim(),\n 'data-component': 'button',\n 'data-tone': tone,\n 'data-emphasis': emphasis,\n 'data-size': size,\n 'data-loading': loading ? '' : undefined,\n 'data-icon-only': children === undefined ? '' : undefined,\n 'data-shape': shape === 'pill' ? 'pill' : undefined,\n 'data-action': action,\n 'aria-label':\n ariaLabel && badge !== undefined && badgeLabel\n ? `${ariaLabel}, ${badgeLabel}`\n : ariaLabel,\n title,\n 'aria-busy': loading ? 'true' : undefined,\n slot,\n };\n const content = (\n <>\n {icon === undefined ? null : (\n <span class=\"kui-button__icon\" aria-hidden=\"true\">\n {icon}\n </span>\n )}\n {children === undefined ? null : (\n <span class=\"kui-button__label\">{children}</span>\n )}\n {badge === undefined || badge === '' ? null : badge === true ? (\n <Badge\n tone={badgeTone}\n size=\"dot\"\n placement=\"corner\"\n {...(ariaLabel || !badgeLabel\n ? { ariaHidden: true as const }\n : { label: badgeLabel })}\n />\n ) : (\n <Badge\n tone={badgeTone}\n appearance=\"solid\"\n size=\"compact\"\n placement=\"corner\"\n {...(ariaLabel || !badgeLabel\n ? { ariaHidden: true as const }\n : { label: badgeLabel })}\n >\n {String(badge)}\n </Badge>\n )}\n {loading ? (\n <span class=\"kui-button__spinner\" aria-hidden=\"true\">\n <LoadingSpinner />\n </span>\n ) : null}\n </>\n );\n // A disabled link has no destination and is announced as disabled.\n if (href !== undefined) {\n if (pressed !== undefined)\n throw new TypeError('A link Button cannot be a toggle (pressed).');\n return (\n <a\n {...shared}\n href={disabled ? undefined : href}\n target={disabled ? undefined : target}\n role={disabled ? 'link' : undefined}\n aria-disabled={disabled ? 'true' : undefined}\n >\n {content}\n </a>\n );\n }\n return (\n <button\n {...shared}\n type={type}\n name={name}\n value={value}\n form={form}\n disabled={disabled}\n aria-pressed={pressed === undefined ? undefined : String(pressed)}\n >\n {content}\n </button>\n );\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { LucideIcon } from './chunk-
|
|
1
|
+
import { LucideIcon } from './chunk-HJXVVFBT.js';
|
|
2
2
|
import { Search, X } from 'lucide';
|
|
3
3
|
import { jsx, jsxs, Fragment } from 'kerfjs/jsx-runtime';
|
|
4
4
|
|
|
@@ -23,7 +23,7 @@ function orderedParts(query, tokens) {
|
|
|
23
23
|
function CloseIcon() {
|
|
24
24
|
return /* @__PURE__ */ jsx(LucideIcon, { icon: X, name: "x" });
|
|
25
25
|
}
|
|
26
|
-
function
|
|
26
|
+
function SearchField({
|
|
27
27
|
id,
|
|
28
28
|
label,
|
|
29
29
|
query = "",
|
|
@@ -37,7 +37,7 @@ function TokenSearchField({
|
|
|
37
37
|
fill = false,
|
|
38
38
|
collapsible = false,
|
|
39
39
|
expanded = false,
|
|
40
|
-
expandAction = "expand-
|
|
40
|
+
expandAction = "expand-search-field",
|
|
41
41
|
expandLabel,
|
|
42
42
|
leading,
|
|
43
43
|
trailing,
|
|
@@ -47,7 +47,7 @@ function TokenSearchField({
|
|
|
47
47
|
required = false,
|
|
48
48
|
editAction = "edit-search-token",
|
|
49
49
|
removeAction = "remove-search-token",
|
|
50
|
-
clearAction = "clear-
|
|
50
|
+
clearAction = "clear-search-field",
|
|
51
51
|
clearLabel = "Clear Search",
|
|
52
52
|
clearIcon,
|
|
53
53
|
className = "",
|
|
@@ -64,9 +64,9 @@ function TokenSearchField({
|
|
|
64
64
|
const control = /* @__PURE__ */ jsx(
|
|
65
65
|
"div",
|
|
66
66
|
{
|
|
67
|
-
class: `kui-
|
|
68
|
-
"data-component": "
|
|
69
|
-
"data-
|
|
67
|
+
class: `kui-search-field ${presentation === "form-field" ? "" : className}`.trim(),
|
|
68
|
+
"data-component": "search-field",
|
|
69
|
+
"data-search-field-id": id,
|
|
70
70
|
"data-disabled": String(disabled),
|
|
71
71
|
"data-collapsible": String(collapsible),
|
|
72
72
|
"data-expanded": String(resolvedExpanded),
|
|
@@ -82,7 +82,7 @@ function TokenSearchField({
|
|
|
82
82
|
"button",
|
|
83
83
|
{
|
|
84
84
|
type: "button",
|
|
85
|
-
class: "kui-
|
|
85
|
+
class: "kui-search-field__expand",
|
|
86
86
|
"data-action": expandAction,
|
|
87
87
|
"aria-label": expandLabel ?? label,
|
|
88
88
|
title: expandLabel ?? label,
|
|
@@ -90,15 +90,15 @@ function TokenSearchField({
|
|
|
90
90
|
children: /* @__PURE__ */ jsx(LucideIcon, { icon: Search, name: "search" })
|
|
91
91
|
}
|
|
92
92
|
) : /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
93
|
-
/* @__PURE__ */ jsx("span", { class: "kui-
|
|
93
|
+
/* @__PURE__ */ jsx("span", { class: "kui-search-field__leading", "aria-hidden": "true", children: leading ?? /* @__PURE__ */ jsx(LucideIcon, { icon: Search, name: "search" }) }),
|
|
94
94
|
/* @__PURE__ */ jsx(
|
|
95
95
|
"div",
|
|
96
96
|
{
|
|
97
97
|
...editorAttributes,
|
|
98
|
-
class: "kui-
|
|
98
|
+
class: "kui-search-field__editor",
|
|
99
99
|
"data-key": key,
|
|
100
100
|
"data-morph-skip": true,
|
|
101
|
-
"data-
|
|
101
|
+
"data-search-field-editor": id,
|
|
102
102
|
"data-token-count": tokens.length,
|
|
103
103
|
"data-placeholder": tokens.length ? tokenPlaceholder : placeholder,
|
|
104
104
|
role: "searchbox",
|
|
@@ -114,23 +114,23 @@ function TokenSearchField({
|
|
|
114
114
|
(part) => part.kind === "text" ? /* @__PURE__ */ jsx(
|
|
115
115
|
"span",
|
|
116
116
|
{
|
|
117
|
-
"data-
|
|
117
|
+
"data-search-field-text": true,
|
|
118
118
|
"data-empty": String(part.value.length === 0),
|
|
119
119
|
children: part.value || (tokens.length ? "\u200B" : "")
|
|
120
120
|
}
|
|
121
121
|
) : /* @__PURE__ */ jsxs(
|
|
122
122
|
"span",
|
|
123
123
|
{
|
|
124
|
-
class: "kui-
|
|
124
|
+
class: "kui-search-field__token",
|
|
125
125
|
contenteditable: "false",
|
|
126
|
-
"data-component": "
|
|
126
|
+
"data-component": "search-field-token",
|
|
127
127
|
"data-token-value": part.token.value,
|
|
128
128
|
children: [
|
|
129
129
|
/* @__PURE__ */ jsx(
|
|
130
130
|
"button",
|
|
131
131
|
{
|
|
132
132
|
type: "button",
|
|
133
|
-
class: "kui-
|
|
133
|
+
class: "kui-search-field__token-edit",
|
|
134
134
|
"data-action": editAction,
|
|
135
135
|
"data-token-value": part.token.value,
|
|
136
136
|
"aria-label": `Edit ${part.token.accessibleLabel ?? part.token.label}`,
|
|
@@ -142,7 +142,7 @@ function TokenSearchField({
|
|
|
142
142
|
"button",
|
|
143
143
|
{
|
|
144
144
|
type: "button",
|
|
145
|
-
class: "kui-
|
|
145
|
+
class: "kui-search-field__token-remove",
|
|
146
146
|
"data-action": removeAction,
|
|
147
147
|
"data-token-value": part.token.value,
|
|
148
148
|
"aria-label": `Remove ${part.token.accessibleLabel ?? part.token.label}`,
|
|
@@ -160,7 +160,7 @@ function TokenSearchField({
|
|
|
160
160
|
"button",
|
|
161
161
|
{
|
|
162
162
|
type: "button",
|
|
163
|
-
class: "kui-
|
|
163
|
+
class: "kui-search-field__clear",
|
|
164
164
|
"data-action": clearAction,
|
|
165
165
|
"aria-label": clearLabel,
|
|
166
166
|
title: clearLabel,
|
|
@@ -173,7 +173,7 @@ function TokenSearchField({
|
|
|
173
173
|
{
|
|
174
174
|
...trailingAction.attributes,
|
|
175
175
|
type: "button",
|
|
176
|
-
class: "kui-
|
|
176
|
+
class: "kui-search-field__trailing-action",
|
|
177
177
|
id: trailingAction.id,
|
|
178
178
|
"data-action": trailingAction.action,
|
|
179
179
|
"aria-label": trailingAction.label,
|
|
@@ -185,18 +185,18 @@ function TokenSearchField({
|
|
|
185
185
|
disabled,
|
|
186
186
|
children: trailingAction.icon
|
|
187
187
|
}
|
|
188
|
-
) : trailing ? /* @__PURE__ */ jsx("span", { class: "kui-
|
|
188
|
+
) : trailing ? /* @__PURE__ */ jsx("span", { class: "kui-search-field__trailing", children: trailing }) : null,
|
|
189
189
|
!disabled && suggestions.length > 0 && /* @__PURE__ */ jsx(
|
|
190
190
|
"div",
|
|
191
191
|
{
|
|
192
|
-
class: "kui-
|
|
193
|
-
"data-
|
|
192
|
+
class: "kui-search-field__suggestions",
|
|
193
|
+
"data-search-field-keep-open": true,
|
|
194
194
|
children: suggestions.map((suggestion) => /* @__PURE__ */ jsx(
|
|
195
195
|
"button",
|
|
196
196
|
{
|
|
197
197
|
type: "button",
|
|
198
|
-
class: "kui-
|
|
199
|
-
"data-
|
|
198
|
+
class: "kui-search-field__suggestion",
|
|
199
|
+
"data-search-field-suggestion": suggestion.value,
|
|
200
200
|
children: suggestion.label
|
|
201
201
|
}
|
|
202
202
|
))
|
|
@@ -209,28 +209,28 @@ function TokenSearchField({
|
|
|
209
209
|
return /* @__PURE__ */ jsxs(
|
|
210
210
|
"div",
|
|
211
211
|
{
|
|
212
|
-
class: `kui-
|
|
213
|
-
"data-
|
|
212
|
+
class: `kui-search-field__field ${className}`.trim(),
|
|
213
|
+
"data-search-field-form-field": id,
|
|
214
214
|
children: [
|
|
215
215
|
/* @__PURE__ */ jsxs(
|
|
216
216
|
"div",
|
|
217
217
|
{
|
|
218
|
-
class: "kui-
|
|
218
|
+
class: "kui-search-field__field-label",
|
|
219
219
|
id: `${id}-label`,
|
|
220
|
-
"data-
|
|
220
|
+
"data-search-field-form-label": id,
|
|
221
221
|
children: [
|
|
222
222
|
label,
|
|
223
|
-
required && /* @__PURE__ */ jsx("span", { class: "kui-
|
|
223
|
+
required && /* @__PURE__ */ jsx("span", { class: "kui-search-field__field-required", "aria-hidden": "true", children: "*" })
|
|
224
224
|
]
|
|
225
225
|
}
|
|
226
226
|
),
|
|
227
227
|
control,
|
|
228
|
-
hint && /* @__PURE__ */ jsx("div", { class: "kui-
|
|
228
|
+
hint && /* @__PURE__ */ jsx("div", { class: "kui-search-field__field-hint", id: `${id}-hint`, children: hint })
|
|
229
229
|
]
|
|
230
230
|
}
|
|
231
231
|
);
|
|
232
232
|
}
|
|
233
|
-
function
|
|
233
|
+
function readSearchField(editor, knownTokens = []) {
|
|
234
234
|
let query = "";
|
|
235
235
|
const tokens = [];
|
|
236
236
|
const visit = (node) => {
|
|
@@ -239,7 +239,7 @@ function readTokenSearchField(editor, knownTokens = []) {
|
|
|
239
239
|
return;
|
|
240
240
|
}
|
|
241
241
|
if (!(node instanceof HTMLElement)) return;
|
|
242
|
-
if (node.matches('[data-component="
|
|
242
|
+
if (node.matches('[data-component="search-field-token"]')) {
|
|
243
243
|
const value = node.dataset.tokenValue;
|
|
244
244
|
const known = knownTokens.find((token) => token.value === value);
|
|
245
245
|
if (known) tokens.push({ ...known, offset: query.length });
|
|
@@ -256,7 +256,7 @@ function readTokenSearchField(editor, knownTokens = []) {
|
|
|
256
256
|
for (const child of editor.childNodes) visit(child);
|
|
257
257
|
return { query, tokens };
|
|
258
258
|
}
|
|
259
|
-
function
|
|
259
|
+
function placeSearchFieldCaret(editor, offset) {
|
|
260
260
|
editor.focus({ preventScroll: true });
|
|
261
261
|
const selection = globalThis.getSelection();
|
|
262
262
|
if (!selection) return;
|
|
@@ -268,7 +268,7 @@ function placeTokenSearchCaret(editor, offset) {
|
|
|
268
268
|
let remaining = Math.max(0, offset);
|
|
269
269
|
let found = false;
|
|
270
270
|
const walker = document.createTreeWalker(editor, NodeFilter.SHOW_TEXT, {
|
|
271
|
-
acceptNode: (node) => node.parentElement?.closest('[data-component="
|
|
271
|
+
acceptNode: (node) => node.parentElement?.closest('[data-component="search-field-token"]') ? NodeFilter.FILTER_REJECT : NodeFilter.FILTER_ACCEPT
|
|
272
272
|
});
|
|
273
273
|
for (let node = walker.nextNode(); node; node = walker.nextNode()) {
|
|
274
274
|
const source = node.textContent ?? "";
|
|
@@ -293,6 +293,6 @@ function placeTokenSearchCaret(editor, offset) {
|
|
|
293
293
|
selection.addRange(range);
|
|
294
294
|
}
|
|
295
295
|
|
|
296
|
-
export {
|
|
296
|
+
export { SearchField, placeSearchFieldCaret, readSearchField };
|
|
297
297
|
|
|
298
|
-
//# sourceMappingURL=chunk-
|
|
298
|
+
//# sourceMappingURL=chunk-VEME3D7K.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/forms/search-field/search-field.tsx"],"names":[],"mappings":"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","file":"chunk-VEME3D7K.js","sourcesContent":["import type { SafeHtml } from 'kerfjs';\nimport { Search, X } from 'lucide';\n\nimport type { KerfUiContent } from '../../../shared/content/semantic-content.js';\nimport { LucideIcon } from '../../media/lucide-icon/lucide-icon.js';\nimport type { SearchFieldModel } from './model/search-field-model.js';\n\nexport interface SearchFieldToken {\n value: string;\n label: string;\n offset?: number;\n accessibleLabel?: string;\n}\n\n/**\n * Domain `data-*` metadata for a trailing action button. The component owns\n * `data-action` (pass `action`) and its state attributes.\n */\nexport type SearchFieldTrailingActionAttributes = Readonly<\n Record<`data-${string}`, string | undefined> & {\n 'data-action'?: never;\n 'data-component'?: never;\n 'data-key'?: never;\n }\n>;\n\ninterface SearchFieldTrailingActionBase {\n /** Decorative glyph, such as a `LucideIcon`. */\n icon: SafeHtml;\n /** Accessible name and tooltip, in title style (\"Search Help\"). */\n label: string;\n /** Delegated `data-action` value. */\n action: string;\n id?: string;\n /** `aria-controls`: the id of the surface this button opens or toggles. */\n controls?: string;\n /** `aria-haspopup` for a button that opens a dialog, menu, or listbox. */\n haspopup?: 'dialog' | 'menu' | 'listbox' | 'true';\n /** Domain `data-*` metadata for the app's delegated handler. */\n attributes?: SearchFieldTrailingActionAttributes;\n}\n\n/**\n * A compact icon button in the field's trailing slot, sized and styled like\n * the clear button. Pass `expanded` for a disclosure (a help surface it opens)\n * or `pressed` for a toggle; the button shows the state with its hover fill.\n */\nexport type SearchFieldTrailingAction = SearchFieldTrailingActionBase &\n (\n | { expanded?: boolean; pressed?: never }\n | { expanded?: never; pressed?: boolean }\n );\n\nexport type SearchFieldEditorAttributes = Readonly<\n Record<`data-${string}`, string | undefined> & {\n 'data-component'?: never;\n 'data-key'?: never;\n 'data-morph-skip'?: never;\n 'data-search-field-editor'?: never;\n 'data-token-count'?: never;\n 'data-placeholder'?: never;\n }\n>;\n\ninterface SearchFieldBaseProps {\n id: string;\n label: string;\n query?: string;\n tokens?: readonly SearchFieldToken[];\n /** Opt-in grammar, suggestion, and evaluation state. Overrides `query` and `tokens`. */\n model?: SearchFieldModel;\n /**\n * Editor identity for a programmatic text replacement. The editor's text is\n * DOM-owned between token changes, so a new `query` with the same tokens\n * does not re-render it (that would reset the caret on every keystroke).\n * Change `revision` when the app replaces the text itself — reseeding a\n * persistent dialog's field on reopen, applying a saved search — and the\n * editor is rebuilt from `query` and `tokens`.\n */\n revision?: string | number;\n placeholder?: string;\n tokenPlaceholder?: string;\n disabled?: boolean;\n autofocus?: boolean;\n /** Let an expanded collapsible field consume the available inline width. */\n fill?: boolean;\n leading?: KerfUiContent;\n editAction?: string;\n removeAction?: string;\n clearAction?: string;\n clearLabel?: string;\n /** Icon for the clear button. Default: the Lucide `x` glyph token chips also use. */\n clearIcon?: SafeHtml;\n className?: string;\n editorAttributes?: SearchFieldEditorAttributes;\n /** Native named-slot assignment when composed inside a web component. */\n slot?: string;\n}\n\ntype SearchFieldTrailingProps =\n | { trailing?: KerfUiContent; trailingAction?: never }\n | { trailing?: never; trailingAction: SearchFieldTrailingAction };\n\ntype SearchFieldPresentationProps =\n | {\n /** Standalone field chrome or the inset visual layer of a configured toolbar group. */\n presentation?: 'standalone' | 'toolbar-group';\n hint?: never;\n required?: never;\n }\n | {\n /** Visible form label and optional hint around the full-width standalone control. */\n presentation: 'form-field';\n hint?: string;\n /** Marks the editor required; the app validates its value. */\n required?: boolean;\n };\n\ntype SearchFieldCollapsibleProps =\n | {\n /** Allow an empty field to render as one iconic action. */\n collapsible: true;\n /** Keep an empty collapsible field open while the application owns focus. */\n expanded?: boolean;\n expandAction?: string;\n expandLabel?: string;\n }\n | {\n collapsible?: false;\n expanded?: never;\n expandAction?: never;\n expandLabel?: never;\n };\n\nexport type SearchFieldProps = SearchFieldBaseProps &\n SearchFieldCollapsibleProps &\n SearchFieldTrailingProps &\n SearchFieldPresentationProps;\n\nexport interface SearchFieldValue {\n query: string;\n tokens: SearchFieldToken[];\n}\n\ntype SearchFieldPart =\n { kind: 'text'; value: string } | { kind: 'token'; token: SearchFieldToken };\n\nfunction orderedParts(\n query: string,\n tokens: readonly SearchFieldToken[],\n): SearchFieldPart[] {\n const ordered = tokens\n .map((token, index) => ({\n token,\n index,\n offset: Math.max(0, Math.min(query.length, token.offset ?? query.length)),\n }))\n .sort(\n (left, right) => left.offset - right.offset || left.index - right.index,\n );\n const parts: SearchFieldPart[] = [];\n let cursor = 0;\n for (const { token, offset } of ordered) {\n parts.push({ kind: 'text', value: query.slice(cursor, offset) });\n parts.push({ kind: 'token', token: { ...token, offset } });\n cursor = offset;\n }\n parts.push({ kind: 'text', value: query.slice(cursor) });\n return parts;\n}\n\nfunction CloseIcon() {\n return <LucideIcon icon={X} name=\"x\" />;\n}\n\nexport function SearchField({\n id,\n label,\n query = '',\n tokens = [],\n model,\n revision,\n placeholder = 'Search',\n tokenPlaceholder = 'Add search…',\n disabled = false,\n autofocus = false,\n fill = false,\n collapsible = false,\n expanded = false,\n expandAction = 'expand-search-field',\n expandLabel,\n leading,\n trailing,\n trailingAction,\n presentation = 'standalone',\n hint,\n required = false,\n editAction = 'edit-search-token',\n removeAction = 'remove-search-token',\n clearAction = 'clear-search-field',\n clearLabel = 'Clear Search',\n clearIcon,\n className = '',\n editorAttributes = {},\n slot,\n}: SearchFieldProps) {\n // A managed model subscribes the host render to `structure` (token,\n // emptiness, and revision changes) only. The live text is DOM-owned between\n // structural changes, so it is peeked, not read: typing must not re-run the\n // host render on every keystroke.\n const structure = model?.structure.value;\n if (model) ({ query, tokens } = model.state.peek());\n const suggestions = model?.suggestions.value ?? [];\n const parts = orderedParts(query, tokens);\n const tokenKey = tokens.map((token) => token.value).join('|');\n const key = structure\n ? `${id}@${String(revision ?? '')}:${structure.editorRevision}:${tokenKey}`\n : revision === undefined\n ? `${id}:${tokenKey}`\n : `${id}@${String(revision)}:${tokenKey}`;\n const resolvedExpanded =\n !collapsible || expanded || query.length > 0 || tokens.length > 0;\n const control = (\n <div\n class={`kui-search-field ${presentation === 'form-field' ? '' : className}`.trim()}\n data-component=\"search-field\"\n data-search-field-id={id}\n data-disabled={String(disabled)}\n data-collapsible={String(collapsible)}\n data-expanded={String(resolvedExpanded)}\n data-fill={String(fill)}\n data-has-trailing={String(Boolean(trailing || trailingAction))}\n data-presentation={presentation}\n data-placeholder={tokens.length ? tokenPlaceholder : placeholder}\n data-placeholder-visible={String(\n query.length === 0 && tokens.length === 0,\n )}\n slot={slot}\n >\n {!resolvedExpanded ? (\n <button\n type=\"button\"\n class=\"kui-search-field__expand\"\n data-action={expandAction}\n aria-label={expandLabel ?? label}\n title={expandLabel ?? label}\n disabled={disabled}\n >\n <LucideIcon icon={Search} name=\"search\" />\n </button>\n ) : (\n <>\n <span class=\"kui-search-field__leading\" aria-hidden=\"true\">\n {leading ?? <LucideIcon icon={Search} name=\"search\" />}\n </span>\n <div\n {...editorAttributes}\n class=\"kui-search-field__editor\"\n data-key={key}\n data-morph-skip\n data-search-field-editor={id}\n data-token-count={tokens.length}\n data-placeholder={tokens.length ? tokenPlaceholder : placeholder}\n role=\"searchbox\"\n aria-label={presentation === 'form-field' ? undefined : label}\n aria-labelledby={\n presentation === 'form-field' ? `${id}-label` : undefined\n }\n aria-describedby={\n presentation === 'form-field' && hint ? `${id}-hint` : undefined\n }\n aria-required={required ? 'true' : undefined}\n aria-disabled={disabled ? 'true' : undefined}\n contenteditable={disabled ? 'false' : 'true'}\n spellcheck=\"false\"\n autofocus={autofocus}\n >\n {parts.map((part) =>\n part.kind === 'text' ? (\n <span\n data-search-field-text\n data-empty={String(part.value.length === 0)}\n >\n {part.value || (tokens.length ? '\\u200b' : '')}\n </span>\n ) : (\n <span\n class=\"kui-search-field__token\"\n contenteditable=\"false\"\n data-component=\"search-field-token\"\n data-token-value={part.token.value}\n >\n <button\n type=\"button\"\n class=\"kui-search-field__token-edit\"\n data-action={editAction}\n data-token-value={part.token.value}\n aria-label={`Edit ${part.token.accessibleLabel ?? part.token.label}`}\n disabled={disabled}\n >\n {part.token.label}\n </button>\n <button\n type=\"button\"\n class=\"kui-search-field__token-remove\"\n data-action={removeAction}\n data-token-value={part.token.value}\n aria-label={`Remove ${part.token.accessibleLabel ?? part.token.label}`}\n disabled={disabled}\n >\n <CloseIcon />\n </button>\n </span>\n ),\n )}\n </div>\n {(query || tokens.length > 0) && (\n <button\n type=\"button\"\n class=\"kui-search-field__clear\"\n data-action={clearAction}\n aria-label={clearLabel}\n title={clearLabel}\n disabled={disabled}\n >\n {clearIcon ?? <CloseIcon />}\n </button>\n )}\n {trailingAction ? (\n <button\n {...trailingAction.attributes}\n type=\"button\"\n class=\"kui-search-field__trailing-action\"\n id={trailingAction.id}\n data-action={trailingAction.action}\n aria-label={trailingAction.label}\n aria-expanded={\n trailingAction.expanded === undefined\n ? undefined\n : String(trailingAction.expanded)\n }\n aria-pressed={\n trailingAction.pressed === undefined\n ? undefined\n : String(trailingAction.pressed)\n }\n aria-controls={trailingAction.controls}\n aria-haspopup={trailingAction.haspopup}\n title={trailingAction.label}\n disabled={disabled}\n >\n {trailingAction.icon}\n </button>\n ) : trailing ? (\n <span class=\"kui-search-field__trailing\">{trailing}</span>\n ) : null}\n {!disabled && suggestions.length > 0 && (\n <div\n class=\"kui-search-field__suggestions\"\n data-search-field-keep-open\n >\n {suggestions.map((suggestion) => (\n <button\n type=\"button\"\n class=\"kui-search-field__suggestion\"\n data-search-field-suggestion={suggestion.value}\n >\n {suggestion.label}\n </button>\n ))}\n </div>\n )}\n </>\n )}\n </div>\n );\n if (presentation !== 'form-field') return control;\n return (\n <div\n class={`kui-search-field__field ${className}`.trim()}\n data-search-field-form-field={id}\n >\n <div\n class=\"kui-search-field__field-label\"\n id={`${id}-label`}\n data-search-field-form-label={id}\n >\n {label}\n {required && (\n <span class=\"kui-search-field__field-required\" aria-hidden=\"true\">\n *\n </span>\n )}\n </div>\n {control}\n {hint && (\n <div class=\"kui-search-field__field-hint\" id={`${id}-hint`}>\n {hint}\n </div>\n )}\n </div>\n );\n}\n\n/** Read editable text and ordered token offsets from a rendered SearchField editor. */\nexport function readSearchField(\n editor: HTMLElement,\n knownTokens: readonly SearchFieldToken[] = [],\n): SearchFieldValue {\n let query = '';\n const tokens: SearchFieldToken[] = [];\n const visit = (node: Node): void => {\n if (node.nodeType === Node.TEXT_NODE) {\n query += (node.textContent ?? '')\n .replaceAll('\\u00a0', ' ')\n .replaceAll('\\u200b', '');\n return;\n }\n if (!(node instanceof HTMLElement)) return;\n if (node.matches('[data-component=\"search-field-token\"]')) {\n const value = node.dataset.tokenValue;\n const known = knownTokens.find((token) => token.value === value);\n if (known) tokens.push({ ...known, offset: query.length });\n else if (value)\n tokens.push({ value, label: value, offset: query.length });\n return;\n }\n if (node.tagName === 'BR') {\n query += ' ';\n return;\n }\n for (const child of node.childNodes) visit(child);\n };\n for (const child of editor.childNodes) visit(child);\n return { query, tokens };\n}\n\n/** Focus an editor and place its caret at a text offset, skipping atomic token chips. */\nexport function placeSearchFieldCaret(\n editor: HTMLElement,\n offset?: number,\n): void {\n editor.focus({ preventScroll: true });\n const selection = globalThis.getSelection();\n if (!selection) return;\n const range = document.createRange();\n if (offset === undefined) {\n range.selectNodeContents(editor);\n range.collapse(false);\n } else {\n let remaining = Math.max(0, offset);\n let found = false;\n const walker = document.createTreeWalker(editor, NodeFilter.SHOW_TEXT, {\n acceptNode: (node) =>\n node.parentElement?.closest('[data-component=\"search-field-token\"]')\n ? NodeFilter.FILTER_REJECT\n : NodeFilter.FILTER_ACCEPT,\n });\n for (let node = walker.nextNode(); node; node = walker.nextNode()) {\n const source = node.textContent ?? '';\n const length = source.replaceAll('\\u200b', '').length;\n if (remaining <= length) {\n range.setStart(\n node,\n source === '\\u200b' ? 0 : Math.min(remaining, source.length),\n );\n range.collapse(true);\n found = true;\n break;\n }\n remaining -= length;\n }\n if (!found) {\n range.selectNodeContents(editor);\n range.collapse(false);\n }\n }\n selection.removeAllRanges();\n selection.addRange(range);\n}\n"]}
|