bitboss-ui 2.1.135 → 3.0.0-alpha.4
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/LICENSE +21 -0
- package/README.md +274 -24
- package/bin/bitboss-ui-mcp.mjs +662 -0
- package/bin/bitboss-ui.mjs +710 -0
- package/bin/bitboss-ui.node.test.mjs +113 -0
- package/dist/ai/BbAccordion.md +528 -113
- package/dist/ai/BbAlert.md +380 -197
- package/dist/ai/BbAsterisk.md +46 -0
- package/dist/ai/BbAvatar.md +458 -178
- package/dist/ai/BbBadge.md +697 -225
- package/dist/ai/BbBadgeButton.md +54 -0
- package/dist/ai/BbBaseButton.md +491 -0
- package/dist/ai/BbBaseCheckbox.md +49 -0
- package/dist/ai/BbBaseCheckboxGroup.md +64 -0
- package/dist/ai/BbBaseCheckboxIcon.md +176 -0
- package/dist/ai/BbBaseColorInput.md +64 -0
- package/dist/ai/BbBaseColorPalette.md +39 -0
- package/dist/ai/BbBaseDatePicker.md +42 -0
- package/dist/ai/BbBaseDatePickerInput.md +73 -0
- package/dist/ai/BbBaseInputContainer.md +48 -0
- package/dist/ai/BbBaseNumberInput.md +71 -0
- package/dist/ai/BbBaseRadio.md +46 -0
- package/dist/ai/BbBaseRadioGroup.md +64 -0
- package/dist/ai/BbBaseRadioIcon.md +191 -0
- package/dist/ai/BbBaseRating.md +51 -0
- package/dist/ai/BbBaseSelect.md +88 -0
- package/dist/ai/BbBaseSlider.md +56 -0
- package/dist/ai/BbBaseSwitch.md +49 -0
- package/dist/ai/BbBaseSwitchGroup.md +64 -0
- package/dist/ai/BbBaseSwitchIcon.md +186 -0
- package/dist/ai/BbBaseTag.md +68 -0
- package/dist/ai/BbBaseTextInput.md +75 -0
- package/dist/ai/BbBaseTextarea.md +62 -0
- package/dist/ai/BbBaseTimePickerInput.md +62 -0
- package/dist/ai/BbBreadcrumbs.md +553 -503
- package/dist/ai/BbButton.md +841 -636
- package/dist/ai/BbCheckbox.md +585 -254
- package/dist/ai/BbCheckboxGroup.md +573 -361
- package/dist/ai/BbCollapsible.md +425 -103
- package/dist/ai/BbColorInput.md +536 -323
- package/dist/ai/BbColorPalette.md +569 -330
- package/dist/ai/BbConfirm.md +659 -136
- package/dist/ai/BbConfirmPortal.md +28 -0
- package/dist/ai/BbDatePicker.md +244 -0
- package/dist/ai/BbDatePickerInput.md +720 -388
- package/dist/ai/BbDialog.md +778 -99
- package/dist/ai/BbDropdown.md +1072 -763
- package/dist/ai/BbDropdownButton.md +525 -614
- package/dist/ai/BbDropdownGroup.md +34 -0
- package/dist/ai/BbDropzone.md +1206 -436
- package/dist/ai/BbForm.md +239 -0
- package/dist/ai/BbIcon.md +382 -212
- package/dist/ai/BbIndicator.md +283 -0
- package/dist/ai/BbNumberInput.md +717 -355
- package/dist/ai/BbOffCanvas.md +897 -498
- package/dist/ai/BbPagination.md +489 -535
- package/dist/ai/BbPopover.md +591 -546
- package/dist/ai/BbProgress.md +462 -69
- package/dist/ai/BbRadio.md +352 -229
- package/dist/ai/BbRadioGroup.md +437 -353
- package/dist/ai/BbRating.md +372 -225
- package/dist/ai/BbSelect.md +1399 -536
- package/dist/ai/BbSelectPopover.md +1255 -1578
- package/dist/ai/BbSlider.md +500 -256
- package/dist/ai/BbSmoothHeight.md +485 -139
- package/dist/ai/BbSpinner.md +718 -131
- package/dist/ai/BbSwitch.md +573 -119
- package/dist/ai/BbSwitchGroup.md +521 -214
- package/dist/ai/BbTable.md +1996 -2365
- package/dist/ai/BbTabs.md +1147 -0
- package/dist/ai/BbTabsList.md +29 -0
- package/dist/ai/BbTabsPanes.md +27 -0
- package/dist/ai/BbTabsRoot.md +57 -0
- package/dist/ai/BbTag.md +416 -292
- package/dist/ai/BbTextInput.md +878 -333
- package/dist/ai/BbTextarea.md +850 -255
- package/dist/ai/BbTimePicker.md +231 -0
- package/dist/ai/BbTimePickerInput.md +200 -0
- package/dist/ai/BbToast.md +669 -196
- package/dist/ai/BbToastPortal.md +28 -0
- package/dist/ai/BbTooltip.md +453 -346
- package/dist/ai/BbTree.md +993 -234
- package/dist/ai/ChipsBox.md +27 -199
- package/dist/ai/ClearableButton.md +21 -55
- package/dist/ai/CommaBox.md +25 -200
- package/dist/ai/CommonInputWrapper.md +42 -0
- package/dist/ai/CommonPopover.md +30 -510
- package/dist/ai/ErrorIcon.md +19 -56
- package/dist/ai/FlatListBox.md +35 -379
- package/dist/ai/GroupedListBox.md +37 -535
- package/dist/ai/GuidesComponent.md +21 -0
- package/dist/ai/ListBox.md +38 -231
- package/dist/ai/OptionsContainer.md +34 -253
- package/dist/ai/WarningIcon.md +21 -0
- package/dist/ai/components.json +15897 -0
- package/dist/ai/composables/useBbConfig.md +80 -0
- package/dist/ai/composables/useBbFormContext.md +110 -0
- package/dist/ai/composables/useBbTableContext.md +167 -0
- package/dist/ai/composables/useBbTabsContext.md +118 -0
- package/dist/ai/composables/useBroadcastChannelInstance.md +97 -0
- package/dist/ai/composables/useConfirm.md +313 -0
- package/dist/ai/composables/useCountdown.md +86 -0
- package/dist/ai/composables/useId.md +60 -0
- package/dist/ai/composables/useMobile.md +85 -0
- package/dist/ai/composables/useToast.md +238 -0
- package/dist/ai/guides/agent-contract.md +165 -0
- package/dist/ai/guides/ai-router.md +113 -0
- package/dist/ai/guides/app-layout.md +318 -0
- package/dist/ai/guides/coherence-playbook.md +136 -0
- package/dist/ai/guides/component-picker.md +236 -0
- package/dist/ai/guides/design-language.md +478 -0
- package/dist/ai/guides/design-tokens.md +450 -0
- package/dist/ai/guides/fetch-items-playbook.md +161 -0
- package/dist/ai/guides/floating-bottom-panel.md +130 -0
- package/dist/ai/guides/icons-policy.md +257 -0
- package/dist/ai/guides/inertia-helpers.md +1443 -0
- package/dist/ai/guides/inline-edit-playbook.md +267 -0
- package/dist/ai/guides/installation-and-plugin-setup.md +440 -0
- package/dist/ai/guides/migration/components/bb-alert.md +37 -0
- package/dist/ai/guides/migration/components/bb-avatar.md +24 -0
- package/dist/ai/guides/migration/components/bb-badge.md +110 -0
- package/dist/ai/guides/migration/components/bb-breadcrumbs.md +26 -0
- package/dist/ai/guides/migration/components/bb-button.md +55 -0
- package/dist/ai/guides/migration/components/bb-checkbox-group.md +54 -0
- package/dist/ai/guides/migration/components/bb-checkbox.md +45 -0
- package/dist/ai/guides/migration/components/bb-chip.md +35 -0
- package/dist/ai/guides/migration/components/bb-collapsible.md +26 -0
- package/dist/ai/guides/migration/components/bb-color-input.md +23 -0
- package/dist/ai/guides/migration/components/bb-color-palette.md +31 -0
- package/dist/ai/guides/migration/components/bb-date-picker-input.md +84 -0
- package/dist/ai/guides/migration/components/bb-dialog.md +46 -0
- package/dist/ai/guides/migration/components/bb-dropdown-button.md +31 -0
- package/dist/ai/guides/migration/components/bb-dropdown.md +36 -0
- package/dist/ai/guides/migration/components/bb-dropzone.md +27 -0
- package/dist/ai/guides/migration/components/bb-icon.md +27 -0
- package/dist/ai/guides/migration/components/bb-offcanvas.md +63 -0
- package/dist/ai/guides/migration/components/bb-pagination.md +24 -0
- package/dist/ai/guides/migration/components/bb-popover.md +52 -0
- package/dist/ai/guides/migration/components/bb-rating.md +24 -0
- package/dist/ai/guides/migration/components/bb-select-popover.md +59 -0
- package/dist/ai/guides/migration/components/bb-select.md +69 -0
- package/dist/ai/guides/migration/components/bb-slider.md +25 -0
- package/dist/ai/guides/migration/components/bb-smooth-height.md +45 -0
- package/dist/ai/guides/migration/components/bb-spinner.md +23 -0
- package/dist/ai/guides/migration/components/bb-table.md +66 -0
- package/dist/ai/guides/migration/components/bb-tabs.md +47 -0
- package/dist/ai/guides/migration/components/bb-tag.md +29 -0
- package/dist/ai/guides/migration/components/bb-text-input.md +37 -0
- package/dist/ai/guides/migration/components/bb-toast.md +47 -0
- package/dist/ai/guides/migration/components/bb-tooltip.md +34 -0
- package/dist/ai/guides/migration/components/bb-tree.md +77 -0
- package/dist/ai/guides/migration/components/use-confirm.md +46 -0
- package/dist/ai/guides/migration/v2-to-v3.md +649 -0
- package/dist/ai/guides/options-items-playbook.md +222 -0
- package/dist/ai/guides/page-shell.md +113 -0
- package/dist/ai/guides/validated-forms.md +177 -0
- package/dist/ai/index.md +158 -32
- package/dist/ai/recipes/inertia/approvals-inbox.md +1635 -0
- package/dist/ai/recipes/inertia/inline-edit-workspace.md +1765 -0
- package/dist/ai/recipes/inertia/layout-scaffold.md +385 -0
- package/dist/ai/recipes/inertia/onboarding.md +1791 -0
- package/dist/ai/recipes/inertia/ownership-atlas.md +1327 -0
- package/dist/ai/recipes/inertia/record-form.md +1489 -0
- package/dist/ai/recipes/inertia/records-workspace.md +1416 -0
- package/dist/ai/recipes/inertia/upload-center.md +2003 -0
- package/dist/ai/recipes/inertia/wizard-form.md +1500 -0
- package/dist/ai/recipes/nuxt/approvals-inbox.md +1578 -0
- package/dist/ai/recipes/nuxt/inline-edit-workspace.md +1703 -0
- package/dist/ai/recipes/nuxt/layout-scaffold.md +385 -0
- package/dist/ai/recipes/nuxt/onboarding.md +1724 -0
- package/dist/ai/recipes/nuxt/record-form.md +1502 -0
- package/dist/ai/recipes/nuxt/records-workspace.md +1329 -0
- package/dist/ai/recipes/nuxt/upload-center.md +1886 -0
- package/dist/ai/recipes/nuxt/wizard-form.md +1509 -0
- package/dist/ai/recipes/vue/approvals-inbox.md +1496 -0
- package/dist/ai/recipes/vue/inline-edit-workspace.md +1594 -0
- package/dist/ai/recipes/vue/layout-scaffold.md +385 -0
- package/dist/ai/recipes/vue/onboarding.md +1679 -0
- package/dist/ai/recipes/vue/record-form.md +1586 -0
- package/dist/ai/recipes/vue/records-workspace.md +1245 -0
- package/dist/ai/recipes/vue/upload-center.md +1845 -0
- package/dist/ai/recipes/vue/wizard-form.md +1441 -0
- package/dist/ai/source/BbAccordion.md +123 -0
- package/dist/ai/source/BbAlert.md +401 -0
- package/dist/ai/source/BbAsterisk.md +32 -0
- package/dist/ai/source/BbAvatar.md +258 -0
- package/dist/ai/source/BbBadge.md +560 -0
- package/dist/ai/source/BbBadgeButton.md +490 -0
- package/dist/ai/source/BbBaseButton.md +682 -0
- package/dist/ai/source/BbBaseCheckbox.md +461 -0
- package/dist/ai/source/BbBaseCheckboxGroup.md +554 -0
- package/dist/ai/source/BbBaseCheckboxIcon.md +201 -0
- package/dist/ai/source/BbBaseColorInput.md +416 -0
- package/dist/ai/source/BbBaseColorPalette.md +934 -0
- package/dist/ai/source/BbBaseDatePicker.md +1001 -0
- package/dist/ai/source/BbBaseDatePickerInput.md +1785 -0
- package/dist/ai/source/BbBaseInputContainer.md +1210 -0
- package/dist/ai/source/BbBaseNumberInput.md +617 -0
- package/dist/ai/source/BbBaseRadio.md +377 -0
- package/dist/ai/source/BbBaseRadioGroup.md +533 -0
- package/dist/ai/source/BbBaseRadioIcon.md +153 -0
- package/dist/ai/source/BbBaseRating.md +573 -0
- package/dist/ai/source/BbBaseSelect.md +898 -0
- package/dist/ai/source/BbBaseSlider.md +1085 -0
- package/dist/ai/source/BbBaseSwitch.md +246 -0
- package/dist/ai/source/BbBaseSwitchGroup.md +302 -0
- package/dist/ai/source/BbBaseSwitchIcon.md +206 -0
- package/dist/ai/source/BbBaseTag.md +694 -0
- package/dist/ai/source/BbBaseTextInput.md +511 -0
- package/dist/ai/source/BbBaseTextarea.md +480 -0
- package/dist/ai/source/BbBaseTimePickerInput.md +1031 -0
- package/dist/ai/source/BbBreadcrumbs.md +815 -0
- package/dist/ai/source/BbButton.md +1006 -0
- package/dist/ai/source/BbCheckbox.md +326 -0
- package/dist/ai/source/BbCheckboxGroup.md +419 -0
- package/dist/ai/source/BbCollapsible.md +137 -0
- package/dist/ai/source/BbColorInput.md +322 -0
- package/dist/ai/source/BbColorPalette.md +371 -0
- package/dist/ai/source/BbConfirm.md +193 -0
- package/dist/ai/source/BbConfirmPortal.md +74 -0
- package/dist/ai/source/BbDatePicker.md +729 -0
- package/dist/ai/source/BbDatePickerInput.md +525 -0
- package/dist/ai/source/BbDialog.md +818 -0
- package/dist/ai/source/BbDropdown.md +2387 -0
- package/dist/ai/source/BbDropdownButton.md +315 -0
- package/dist/ai/source/BbDropdownGroup.md +1259 -0
- package/dist/ai/source/BbDropzone.md +864 -0
- package/dist/ai/source/BbForm.md +100 -0
- package/dist/ai/source/BbIcon.md +214 -0
- package/dist/ai/source/BbIndicator.md +298 -0
- package/dist/ai/source/BbNumberInput.md +374 -0
- package/dist/ai/source/BbOffCanvas.md +1266 -0
- package/dist/ai/source/BbPagination.md +835 -0
- package/dist/ai/source/BbPopover.md +860 -0
- package/dist/ai/source/BbProgress.md +140 -0
- package/dist/ai/source/BbRadio.md +303 -0
- package/dist/ai/source/BbRadioGroup.md +420 -0
- package/dist/ai/source/BbRating.md +369 -0
- package/dist/ai/source/BbSelect.md +688 -0
- package/dist/ai/source/BbSelectPopover.md +2234 -0
- package/dist/ai/source/BbSlider.md +378 -0
- package/dist/ai/source/BbSmoothHeight.md +265 -0
- package/dist/ai/source/BbSpinner.md +127 -0
- package/dist/ai/source/BbSwitch.md +175 -0
- package/dist/ai/source/BbSwitchGroup.md +240 -0
- package/dist/ai/source/BbTable.md +3433 -0
- package/dist/ai/source/BbTabs.md +403 -0
- package/dist/ai/source/BbTabsList.md +578 -0
- package/dist/ai/source/BbTabsPanes.md +368 -0
- package/dist/ai/source/BbTabsRoot.md +372 -0
- package/dist/ai/source/BbTag.md +390 -0
- package/dist/ai/source/BbTextInput.md +352 -0
- package/dist/ai/source/BbTextarea.md +337 -0
- package/dist/ai/source/BbTimePicker.md +595 -0
- package/dist/ai/source/BbTimePickerInput.md +376 -0
- package/dist/ai/source/BbToast.md +525 -0
- package/dist/ai/source/BbToastPortal.md +482 -0
- package/dist/ai/source/BbTooltip.md +522 -0
- package/dist/ai/source/BbTree.md +323 -0
- package/dist/ai/source/ChipsBox.md +201 -0
- package/dist/ai/source/ClearableButton.md +70 -0
- package/dist/ai/source/CommaBox.md +202 -0
- package/dist/ai/source/CommonInputWrapper.md +554 -0
- package/dist/ai/source/CommonPopover.md +616 -0
- package/dist/ai/source/ErrorIcon.md +43 -0
- package/dist/ai/source/FlatListBox.md +396 -0
- package/dist/ai/source/GroupedListBox.md +540 -0
- package/dist/ai/source/GuidesComponent.md +383 -0
- package/dist/ai/source/ListBox.md +238 -0
- package/dist/ai/source/OptionsContainer.md +191 -0
- package/dist/ai/source/WarningIcon.md +47 -0
- package/dist/alert-variants.d.ts +19 -0
- package/dist/assets/css/reset.css_inline.js +4 -0
- package/dist/assets/svgs/alert.svg_raw.js +4 -0
- package/dist/assets/svgs/calendar.svg_raw.js +4 -0
- package/dist/assets/svgs/check_stroke.svg_raw.js +4 -0
- package/dist/assets/svgs/chevron_down.svg_raw.js +4 -0
- package/dist/assets/svgs/chevron_right.svg_raw.js +4 -0
- package/dist/assets/svgs/clear.svg_raw.js +4 -0
- package/dist/assets/svgs/clock.svg_raw.js +4 -0
- package/dist/assets/svgs/error.svg_raw.js +4 -0
- package/dist/assets/svgs/search.svg_raw.js +4 -0
- package/dist/assets/svgs/sort.svg_raw.js +4 -0
- package/dist/assets/svgs/spinner.svg_raw.js +4 -0
- package/dist/assets/svgs/user.svg_raw.js +4 -0
- package/dist/badge-variants.d.ts +19 -0
- package/dist/button-variants.d.ts +21 -0
- package/dist/components/BbAccordion/BbAccordion.vue.d.ts +9 -3
- package/dist/components/BbAccordion/BbAccordion.vue.js +6 -0
- package/dist/components/BbAccordion/BbAccordion.vue_vue_type_script_setup_true_lang.js +66 -0
- package/dist/components/BbAccordion/types.d.ts +12 -8
- package/dist/components/BbAlert/BbAlert.vue.d.ts +12 -3
- package/dist/components/BbAlert/BbAlert.vue.js +6 -0
- package/dist/components/BbAlert/BbAlert.vue_vue_type_script_setup_true_lang.js +65 -0
- package/dist/components/BbAlert/types.d.ts +56 -12
- package/dist/components/BbAsterisk/BbAsterisk.vue.d.ts +3 -0
- package/dist/components/BbAsterisk/BbAsterisk.vue.js +6 -0
- package/dist/components/BbAsterisk/BbAsterisk.vue_vue_type_script_setup_true_lang.js +13 -0
- package/dist/components/BbAvatar/BbAvatar.vue.d.ts +5 -0
- package/dist/components/BbAvatar/BbAvatar.vue.js +6 -0
- package/dist/components/BbAvatar/BbAvatar.vue_vue_type_script_setup_true_lang.js +78 -0
- package/dist/components/BbAvatar/types.d.ts +6 -5
- package/dist/components/BbBadge/BadgeAppendIcon.vue.d.ts +3 -0
- package/dist/components/BbBadge/BadgeAppendIcon.vue.js +5 -0
- package/dist/components/BbBadge/BadgeAppendIcon.vue_vue_type_script_setup_true_lang.js +22 -0
- package/dist/components/BbBadge/BadgeBodyContent.vue.d.ts +15 -0
- package/dist/components/BbBadge/BadgeBodyContent.vue.js +5 -0
- package/dist/components/BbBadge/BadgeBodyContent.vue_vue_type_script_setup_true_lang.js +34 -0
- package/dist/components/BbBadge/BbBadge.vue.d.ts +8 -1
- package/dist/components/BbBadge/BbBadge.vue.js +6 -0
- package/dist/components/BbBadge/BbBadge.vue_vue_type_script_setup_true_lang.js +83 -0
- package/dist/components/BbBadge/BbBadgeButton.vue.d.ts +12 -0
- package/dist/components/BbBadge/BbBadgeButton.vue.js +5 -0
- package/dist/components/BbBadge/BbBadgeButton.vue_vue_type_script_setup_true_lang.js +54 -0
- package/dist/components/BbBadge/badgeButtonContext.d.ts +27 -0
- package/dist/components/BbBadge/badgeButtonContext.js +5 -0
- package/dist/components/BbBadge/types.d.ts +61 -16
- package/dist/components/BbBaseButton/BbBaseButton.vue.d.ts +13 -0
- package/dist/components/BbBaseButton/BbBaseButton.vue.js +6 -0
- package/dist/components/BbBaseButton/BbBaseButton.vue_vue_type_script_setup_true_lang.js +171 -0
- package/dist/components/BbBaseButton/RouterComponent.vue.js +5 -0
- package/dist/components/BbBaseButton/RouterComponent.vue_vue_type_script_setup_true_lang.js +29 -0
- package/dist/components/BbBaseButton/types.d.ts +191 -0
- package/dist/components/BbBaseButton/types.js +33 -0
- package/dist/components/BbBaseCheckbox/BbBaseCheckbox.vue.d.ts +40 -0
- package/dist/components/BbBaseCheckbox/BbBaseCheckbox.vue.js +6 -0
- package/dist/components/BbBaseCheckbox/BbBaseCheckbox.vue_vue_type_script_setup_true_lang.js +145 -0
- package/dist/components/BbBaseCheckbox/types.d.ts +224 -0
- package/dist/components/BbBaseCheckboxGroup/BbBaseCheckboxGroup.vue.d.ts +19 -0
- package/dist/components/BbBaseCheckboxGroup/BbBaseCheckboxGroup.vue.js +6 -0
- package/dist/components/BbBaseCheckboxGroup/BbBaseCheckboxGroup.vue_vue_type_script_setup_true_lang.js +190 -0
- package/dist/components/BbBaseCheckboxGroup/types.d.ts +257 -0
- package/dist/components/BbBaseCheckboxIcon/BbBaseCheckboxIcon.vue.d.ts +4 -0
- package/dist/components/BbBaseCheckboxIcon/BbBaseCheckboxIcon.vue.js +6 -0
- package/dist/components/BbBaseCheckboxIcon/BbBaseCheckboxIcon.vue_vue_type_script_setup_true_lang.js +43 -0
- package/dist/components/BbBaseCheckboxIcon/types.d.ts +47 -0
- package/dist/components/BbBaseColorInput/BbBaseColorInput.vue.d.ts +42 -0
- package/dist/components/BbBaseColorInput/BbBaseColorInput.vue.js +6 -0
- package/dist/components/BbBaseColorInput/BbBaseColorInput.vue_vue_type_script_setup_true_lang.js +178 -0
- package/dist/components/BbBaseColorInput/types.d.ts +210 -0
- package/dist/components/BbBaseColorPalette/BbBaseColorPalette.vue.d.ts +13 -0
- package/dist/components/BbBaseColorPalette/BbBaseColorPalette.vue.js +6 -0
- package/dist/components/BbBaseColorPalette/BbBaseColorPalette.vue_vue_type_script_setup_true_lang.js +395 -0
- package/dist/components/BbBaseColorPalette/types.d.ts +40 -0
- package/dist/components/BbBaseDatePicker/BbBaseDatePicker.vue.js +6 -0
- package/dist/components/BbBaseDatePicker/BbBaseDatePicker.vue_vue_type_script_setup_true_lang.js +300 -0
- package/dist/components/BbBaseDatePicker/BbBaseDatePickerInputDaySelector.vue.d.ts +44 -0
- package/dist/components/BbBaseDatePicker/BbBaseDatePickerInputDaySelector.vue.js +5 -0
- package/dist/components/BbBaseDatePicker/BbBaseDatePickerInputDaySelector.vue_vue_type_script_setup_true_lang.js +310 -0
- package/dist/components/BbBaseDatePicker/BbBaseDatePickerMonthSelector.vue.d.ts +5 -0
- package/dist/components/BbBaseDatePicker/BbBaseDatePickerMonthSelector.vue.js +5 -0
- package/dist/components/BbBaseDatePicker/BbBaseDatePickerMonthSelector.vue_vue_type_script_setup_true_lang.js +63 -0
- package/dist/components/BbBaseDatePicker/BbBaseDatePickerYearSelector.vue.d.ts +5 -0
- package/dist/components/BbBaseDatePicker/BbBaseDatePickerYearSelector.vue.js +5 -0
- package/dist/components/BbBaseDatePicker/BbBaseDatePickerYearSelector.vue_vue_type_script_setup_true_lang.js +75 -0
- package/dist/components/BbBaseDatePicker/typeahead.d.ts +112 -0
- package/dist/components/BbBaseDatePicker/typeahead.js +37 -0
- package/dist/components/BbBaseDatePicker/types.d.ts +97 -0
- package/dist/components/BbBaseDatePicker/useDatePickerContext.d.ts +58 -0
- package/dist/components/BbBaseDatePicker/useDatePickerContext.js +11 -0
- package/dist/components/BbBaseDatePickerInput/BbBaseDatePickerInput.vue.d.ts +30 -0
- package/dist/components/BbBaseDatePickerInput/BbBaseDatePickerInput.vue.js +6 -0
- package/dist/components/BbBaseDatePickerInput/BbBaseDatePickerInput.vue_vue_type_script_setup_true_lang.js +716 -0
- package/dist/components/BbBaseDatePickerInput/BbBaseDatePickerTimeSelector.vue.d.ts +30 -0
- package/dist/components/BbBaseDatePickerInput/BbBaseDatePickerTimeSelector.vue.js +6 -0
- package/dist/components/BbBaseDatePickerInput/BbBaseDatePickerTimeSelector.vue_vue_type_script_setup_true_lang.js +204 -0
- package/dist/components/BbBaseDatePickerInput/types.d.ts +311 -0
- package/dist/components/BbBaseInputContainer/BbBaseInputContainer.vue.d.ts +17 -0
- package/dist/components/BbBaseInputContainer/BbBaseInputContainer.vue.js +6 -0
- package/dist/components/BbBaseInputContainer/BbBaseInputContainer.vue_vue_type_script_setup_true_lang.js +191 -0
- package/dist/components/BbBaseInputContainer/types.d.ts +197 -0
- package/dist/components/BbBaseNumberInput/BbBaseNumberInput.vue.d.ts +52 -0
- package/dist/components/BbBaseNumberInput/BbBaseNumberInput.vue.js +6 -0
- package/dist/components/BbBaseNumberInput/BbBaseNumberInput.vue_vue_type_script_setup_true_lang.js +215 -0
- package/dist/components/BbBaseNumberInput/types.d.ts +211 -0
- package/dist/components/BbBaseRadio/BbBaseRadio.vue.d.ts +33 -0
- package/dist/components/BbBaseRadio/BbBaseRadio.vue.js +6 -0
- package/dist/components/BbBaseRadio/BbBaseRadio.vue_vue_type_script_setup_true_lang.js +114 -0
- package/dist/components/BbBaseRadio/types.d.ts +179 -0
- package/dist/components/BbBaseRadioGroup/BbBaseRadioGroup.vue.d.ts +19 -0
- package/dist/components/BbBaseRadioGroup/BbBaseRadioGroup.vue.js +6 -0
- package/dist/components/BbBaseRadioGroup/BbBaseRadioGroup.vue_vue_type_script_setup_true_lang.js +177 -0
- package/dist/components/BbBaseRadioGroup/types.d.ts +223 -0
- package/dist/components/BbBaseRadioIcon/BbBaseRadioIcon.vue.d.ts +4 -0
- package/dist/components/BbBaseRadioIcon/BbBaseRadioIcon.vue.js +6 -0
- package/dist/components/BbBaseRadioIcon/BbBaseRadioIcon.vue_vue_type_script_setup_true_lang.js +28 -0
- package/dist/components/BbBaseRadioIcon/types.d.ts +41 -0
- package/dist/components/BbBaseRating/BbBaseRating.vue.d.ts +38 -0
- package/dist/components/BbBaseRating/BbBaseRating.vue.js +6 -0
- package/dist/components/BbBaseRating/BbBaseRating.vue_vue_type_script_setup_true_lang.js +184 -0
- package/dist/components/BbBaseRating/types.d.ts +168 -0
- package/dist/components/BbBaseSelect/BbBaseSelect.vue.d.ts +19 -0
- package/dist/components/BbBaseSelect/BbBaseSelect.vue.js +6 -0
- package/dist/components/BbBaseSelect/BbBaseSelect.vue_vue_type_script_setup_true_lang.js +307 -0
- package/dist/components/BbBaseSelect/types.d.ts +297 -0
- package/dist/components/BbBaseSlider/BbBaseSlider.vue.d.ts +35 -0
- package/dist/components/BbBaseSlider/BbBaseSlider.vue.js +6 -0
- package/dist/components/BbBaseSlider/BbBaseSlider.vue_vue_type_script_setup_true_lang.js +324 -0
- package/dist/components/BbBaseSlider/types.d.ts +200 -0
- package/dist/components/BbBaseSwitch/BbBaseSwitch.vue.d.ts +35 -0
- package/dist/components/BbBaseSwitch/BbBaseSwitch.vue.js +6 -0
- package/dist/components/BbBaseSwitch/BbBaseSwitch.vue_vue_type_script_setup_true_lang.js +146 -0
- package/dist/components/BbBaseSwitch/types.d.ts +10 -0
- package/dist/components/BbBaseSwitchGroup/BbBaseSwitchGroup.vue.d.ts +19 -0
- package/dist/components/BbBaseSwitchGroup/BbBaseSwitchGroup.vue.js +6 -0
- package/dist/components/BbBaseSwitchGroup/BbBaseSwitchGroup.vue_vue_type_script_setup_true_lang.js +190 -0
- package/dist/components/BbBaseSwitchGroup/types.d.ts +8 -0
- package/dist/components/BbBaseSwitchIcon/BbBaseSwitchIcon.vue.d.ts +4 -0
- package/dist/components/BbBaseSwitchIcon/BbBaseSwitchIcon.vue.js +6 -0
- package/dist/components/BbBaseSwitchIcon/BbBaseSwitchIcon.vue_vue_type_script_setup_true_lang.js +30 -0
- package/dist/components/BbBaseSwitchIcon/types.d.ts +48 -0
- package/dist/components/BbBaseTag/BbBaseTag.vue.d.ts +50 -0
- package/dist/components/BbBaseTag/BbBaseTag.vue.js +6 -0
- package/dist/components/BbBaseTag/BbBaseTag.vue_vue_type_script_setup_true_lang.js +266 -0
- package/dist/components/BbBaseTag/types.d.ts +160 -0
- package/dist/components/BbBaseTextInput/BbBaseTextInput.vue.d.ts +45 -0
- package/dist/components/BbBaseTextInput/BbBaseTextInput.vue.js +6 -0
- package/dist/components/BbBaseTextInput/BbBaseTextInput.vue_vue_type_script_setup_true_lang.js +200 -0
- package/dist/components/BbBaseTextInput/types.d.ts +209 -0
- package/dist/components/BbBaseTextarea/BbBaseTextarea.vue.d.ts +39 -0
- package/dist/components/BbBaseTextarea/BbBaseTextarea.vue.js +6 -0
- package/dist/components/BbBaseTextarea/BbBaseTextarea.vue_vue_type_script_setup_true_lang.js +175 -0
- package/dist/components/BbBaseTextarea/types.d.ts +170 -0
- package/dist/components/BbBaseTimePickerInput/BbBaseTimePickerInput.vue.d.ts +27 -0
- package/dist/components/BbBaseTimePickerInput/BbBaseTimePickerInput.vue.js +6 -0
- package/dist/components/BbBaseTimePickerInput/BbBaseTimePickerInput.vue_vue_type_script_setup_true_lang.js +522 -0
- package/dist/components/BbBaseTimePickerInput/types.d.ts +151 -0
- package/dist/components/BbBreadcrumbs/BbBreadcrumbs.vue.d.ts +0 -1
- package/dist/components/BbBreadcrumbs/BbBreadcrumbs.vue.js +6 -0
- package/dist/components/BbBreadcrumbs/BbBreadcrumbs.vue_vue_type_script_setup_true_lang.js +224 -0
- package/dist/components/BbBreadcrumbs/estimateBreadcrumbItemWidth.js +47 -0
- package/dist/components/BbBreadcrumbs/types.d.ts +37 -22
- package/dist/components/BbButton/BbButton.vue.d.ts +6 -5
- package/dist/components/BbButton/BbButton.vue.js +6 -0
- package/dist/components/BbButton/BbButton.vue_vue_type_script_setup_true_lang.js +181 -0
- package/dist/components/BbButton/types.d.ts +48 -47
- package/dist/components/BbCheckbox/BbCheckbox.vue.d.ts +4 -3
- package/dist/components/BbCheckbox/BbCheckbox.vue.js +6 -0
- package/dist/components/BbCheckbox/BbCheckbox.vue_vue_type_script_setup_true_lang.js +146 -0
- package/dist/components/BbCheckbox/types.d.ts +31 -10
- package/dist/components/BbCheckboxGroup/BbCheckboxGroup.vue.d.ts +2 -13
- package/dist/components/BbCheckboxGroup/BbCheckboxGroup.vue.js +6 -0
- package/dist/components/BbCheckboxGroup/BbCheckboxGroup.vue_vue_type_script_setup_true_lang.js +190 -0
- package/dist/components/BbCheckboxGroup/types.d.ts +51 -23
- package/dist/components/BbCollapsible/BbCollapsible.vue.d.ts +2 -1
- package/dist/components/BbCollapsible/BbCollapsible.vue.js +6 -0
- package/dist/components/BbCollapsible/BbCollapsible.vue_vue_type_script_setup_true_lang.js +31 -0
- package/dist/components/BbCollapsible/types.d.ts +13 -8
- package/dist/components/BbColorInput/BbColorInput.vue.d.ts +10 -1
- package/dist/components/BbColorInput/BbColorInput.vue.js +6 -0
- package/dist/components/BbColorInput/BbColorInput.vue_vue_type_script_setup_true_lang.js +177 -0
- package/dist/components/BbColorInput/types.d.ts +44 -11
- package/dist/components/BbColorPalette/BbColorPalette.vue.d.ts +5 -8
- package/dist/components/BbColorPalette/BbColorPalette.vue.js +5 -0
- package/dist/components/BbColorPalette/BbColorPalette.vue_vue_type_script_setup_true_lang.js +126 -0
- package/dist/components/BbColorPalette/types.d.ts +71 -52
- package/dist/components/BbConfirm/BbConfirm.vue.js +6 -0
- package/dist/components/BbConfirm/BbConfirm.vue_vue_type_script_setup_true_lang.js +138 -0
- package/dist/components/BbConfirm/BbConfirmPortal.vue.d.ts +5 -6
- package/dist/components/BbConfirm/BbConfirmPortal.vue.js +5 -0
- package/dist/components/BbConfirm/BbConfirmPortal.vue_vue_type_script_setup_true_lang.js +19 -0
- package/dist/components/BbDatePicker/BbDatePicker.vue.d.ts +37 -0
- package/dist/components/BbDatePicker/BbDatePicker.vue.js +6 -0
- package/dist/components/BbDatePicker/BbDatePicker.vue_vue_type_script_setup_true_lang.js +319 -0
- package/dist/components/BbDatePicker/types.d.ts +159 -0
- package/dist/components/BbDatePickerInput/BbDatePickerInput.vue.d.ts +3 -1
- package/dist/components/BbDatePickerInput/BbDatePickerInput.vue.js +6 -0
- package/dist/components/BbDatePickerInput/BbDatePickerInput.vue_vue_type_script_setup_true_lang.js +179 -0
- package/dist/components/BbDatePickerInput/types.d.ts +134 -16
- package/dist/components/BbDialog/BbDialog.vue.d.ts +14 -6
- package/dist/components/BbDialog/BbDialog.vue.js +6 -0
- package/dist/components/BbDialog/BbDialog.vue_vue_type_script_setup_true_lang.js +214 -0
- package/dist/components/BbDialog/types.d.ts +146 -1
- package/dist/components/BbDialog/useDialogStack.d.ts +5 -0
- package/dist/components/BbDialog/useDialogStack.js +20 -0
- package/dist/components/BbDropdown/AdaptiveDropdown.vue.d.ts +24 -0
- package/dist/components/BbDropdown/AdaptiveDropdown.vue.js +6 -0
- package/dist/components/BbDropdown/AdaptiveDropdown.vue_vue_type_script_setup_true_lang.js +116 -0
- package/dist/components/BbDropdown/BbDropdown.vue.d.ts +14 -7
- package/dist/components/BbDropdown/BbDropdown.vue.js +6 -0
- package/dist/components/BbDropdown/BbDropdown.vue_vue_type_script_setup_true_lang.js +561 -0
- package/dist/components/BbDropdown/BbDropdownGroup.vue.d.ts +44 -0
- package/dist/components/BbDropdown/BbDropdownGroup.vue.js +5 -0
- package/dist/components/BbDropdown/BbDropdownGroup.vue_vue_type_script_setup_true_lang.js +36 -0
- package/dist/components/BbDropdown/BbDropdownList.vue.d.ts +31 -0
- package/dist/components/BbDropdown/BbDropdownList.vue.js +6 -0
- package/dist/components/BbDropdown/BbDropdownList.vue_vue_type_script_setup_true_lang.js +470 -0
- package/dist/components/BbDropdown/DropdownPipelineResolver.vue.d.ts +16 -0
- package/dist/components/BbDropdown/DropdownPipelineResolver.vue.js +5 -0
- package/dist/components/BbDropdown/DropdownPipelineResolver.vue_vue_type_script_setup_true_lang.js +168 -0
- package/dist/components/BbDropdown/normalizeGroups.d.ts +18 -0
- package/dist/components/BbDropdown/normalizeGroups.js +46 -0
- package/dist/components/BbDropdown/types.d.ts +468 -46
- package/dist/components/BbDropdown/types.js +4 -0
- package/dist/components/BbDropdown/useDropdownContext.d.ts +89 -0
- package/dist/components/BbDropdown/useDropdownContext.js +9 -0
- package/dist/components/BbDropdown/useDropdownGroupRegistry.d.ts +108 -0
- package/dist/components/BbDropdown/useDropdownGroupRegistry.js +5 -0
- package/dist/components/BbDropdownButton/BbDropdownButton.vue.d.ts +3 -3
- package/dist/components/BbDropdownButton/BbDropdownButton.vue.js +6 -0
- package/dist/components/BbDropdownButton/BbDropdownButton.vue_vue_type_script_setup_true_lang.js +119 -0
- package/dist/components/BbDropdownButton/types.d.ts +47 -52
- package/dist/components/BbDropzone/BbDropzone.vue.d.ts +5 -4
- package/dist/components/BbDropzone/BbDropzone.vue.js +6 -0
- package/dist/components/BbDropzone/BbDropzone.vue_vue_type_script_setup_true_lang.js +308 -0
- package/dist/components/BbDropzone/types.d.ts +77 -8
- package/dist/components/BbIcon/BbIcon.vue.d.ts +3 -2
- package/dist/components/BbIcon/BbIcon.vue.js +6 -0
- package/dist/components/BbIcon/BbIcon.vue_vue_type_script_setup_true_lang.js +65 -0
- package/dist/components/BbIcon/types.d.ts +6 -19
- package/dist/components/BbIndicator/BbIndicator.vue.d.ts +14 -0
- package/dist/components/BbIndicator/BbIndicator.vue.js +6 -0
- package/dist/components/BbIndicator/BbIndicator.vue_vue_type_script_setup_true_lang.js +56 -0
- package/dist/components/BbIndicator/types.d.ts +49 -0
- package/dist/components/BbNumberInput/BbNumberInput.vue.d.ts +12 -6
- package/dist/components/BbNumberInput/BbNumberInput.vue.js +6 -0
- package/dist/components/BbNumberInput/BbNumberInput.vue_vue_type_script_setup_true_lang.js +194 -0
- package/dist/components/BbNumberInput/types.d.ts +40 -4
- package/dist/components/BbOffCanvas/BbOffCanvas.vue.d.ts +16 -10
- package/dist/components/BbOffCanvas/BbOffCanvas.vue.js +6 -0
- package/dist/components/BbOffCanvas/BbOffCanvas.vue_vue_type_script_setup_true_lang.js +284 -0
- package/dist/components/BbOffCanvas/types.d.ts +71 -39
- package/dist/components/BbOffCanvas/useOffCanvasStack.d.ts +25 -0
- package/dist/components/BbOffCanvas/useOffCanvasStack.js +68 -0
- package/dist/components/BbPagination/BbPagination.vue.d.ts +9 -4
- package/dist/components/BbPagination/BbPagination.vue.js +6 -0
- package/dist/components/BbPagination/BbPagination.vue_vue_type_script_setup_true_lang.js +244 -0
- package/dist/components/BbPagination/paginationFit.d.ts +38 -0
- package/dist/components/BbPagination/paginationFit.js +13 -0
- package/dist/components/BbPagination/types.d.ts +51 -16
- package/dist/components/BbPopover/BbPopover.vue.d.ts +16 -15
- package/dist/components/BbPopover/BbPopover.vue.js +6 -0
- package/dist/components/BbPopover/BbPopover.vue_vue_type_script_setup_true_lang.js +309 -0
- package/dist/components/BbPopover/escapeStack.d.ts +6 -0
- package/dist/components/BbPopover/escapeStack.js +10 -0
- package/dist/components/BbPopover/types.d.ts +90 -31
- package/dist/components/BbProgress/BbProgress.vue.d.ts +1 -0
- package/dist/components/BbProgress/BbProgress.vue.js +6 -0
- package/dist/components/BbProgress/BbProgress.vue_vue_type_script_setup_true_lang.js +36 -0
- package/dist/components/BbProgress/types.d.ts +15 -1
- package/dist/components/BbRadio/BbRadio.vue.d.ts +5 -3
- package/dist/components/BbRadio/BbRadio.vue.js +6 -0
- package/dist/components/BbRadio/BbRadio.vue_vue_type_script_setup_true_lang.js +133 -0
- package/dist/components/BbRadio/types.d.ts +32 -9
- package/dist/components/BbRadioGroup/BbRadioGroup.vue.d.ts +4 -14
- package/dist/components/BbRadioGroup/BbRadioGroup.vue.js +6 -0
- package/dist/components/BbRadioGroup/BbRadioGroup.vue_vue_type_script_setup_true_lang.js +186 -0
- package/dist/components/BbRadioGroup/types.d.ts +48 -22
- package/dist/components/BbRating/BbRating.vue.d.ts +4 -1
- package/dist/components/BbRating/BbRating.vue.js +6 -0
- package/dist/components/BbRating/BbRating.vue_vue_type_script_setup_true_lang.js +150 -0
- package/dist/components/BbRating/types.d.ts +44 -10
- package/dist/components/BbSelect/BbSelect.vue.d.ts +2 -11
- package/dist/components/BbSelect/BbSelect.vue.js +6 -0
- package/dist/components/BbSelect/BbSelect.vue_vue_type_script_setup_true_lang.js +241 -0
- package/dist/components/BbSelect/types.d.ts +112 -59
- package/dist/components/BbSelectPopover/BbSelectPopover.vue.d.ts +1 -10
- package/dist/components/BbSelectPopover/BbSelectPopover.vue.js +6 -0
- package/dist/components/BbSelectPopover/BbSelectPopover.vue_vue_type_script_setup_true_lang.js +639 -0
- package/dist/components/BbSelectPopover/types.d.ts +197 -105
- package/dist/components/BbSlider/BbSlider.vue.d.ts +3 -6
- package/dist/components/BbSlider/BbSlider.vue.js +6 -0
- package/dist/components/BbSlider/BbSlider.vue_vue_type_script_setup_true_lang.js +166 -0
- package/dist/components/BbSlider/types.d.ts +44 -13
- package/dist/components/BbSmoothHeight/BbSmoothHeight.vue.d.ts +3 -1
- package/dist/components/BbSmoothHeight/BbSmoothHeight.vue.js +6 -0
- package/dist/components/BbSmoothHeight/BbSmoothHeight.vue_vue_type_script_setup_true_lang.js +79 -0
- package/dist/components/BbSmoothHeight/types.d.ts +17 -2
- package/dist/components/BbSpinner/BbSpinner.vue.d.ts +1 -1
- package/dist/components/BbSpinner/BbSpinner.vue.js +6 -0
- package/dist/components/BbSpinner/BbSpinner.vue_vue_type_script_setup_true_lang.js +30 -0
- package/dist/components/BbSpinner/types.d.ts +10 -3
- package/dist/components/BbSwitch/BbSwitch.vue.d.ts +5 -3
- package/dist/components/BbSwitch/BbSwitch.vue.js +6 -0
- package/dist/components/BbSwitch/BbSwitch.vue_vue_type_script_setup_true_lang.js +142 -0
- package/dist/components/BbSwitch/types.d.ts +3 -1
- package/dist/components/BbSwitchGroup/BbSwitchGroup.vue.d.ts +4 -14
- package/dist/components/BbSwitchGroup/BbSwitchGroup.vue.js +6 -0
- package/dist/components/BbSwitchGroup/BbSwitchGroup.vue_vue_type_script_setup_true_lang.js +190 -0
- package/dist/components/BbSwitchGroup/types.d.ts +3 -22
- package/dist/components/BbTable/BbTable.vue.d.ts +58 -31
- package/dist/components/BbTable/BbTable.vue.js +6 -0
- package/dist/components/BbTable/BbTable.vue_vue_type_script_setup_true_lang.js +900 -0
- package/dist/components/BbTable/types.d.ts +213 -37
- package/dist/components/BbTable/utils.d.ts +9 -1
- package/dist/components/BbTable/utils.js +53 -0
- package/dist/components/BbTabs/BbTabs.vue.d.ts +20 -0
- package/dist/components/BbTabs/BbTabs.vue.js +6 -0
- package/dist/components/BbTabs/BbTabs.vue_vue_type_script_setup_true_lang.js +64 -0
- package/dist/components/BbTabs/BbTabsList.vue.d.ts +19 -0
- package/dist/components/BbTabs/BbTabsList.vue.js +6 -0
- package/dist/components/BbTabs/BbTabsList.vue_vue_type_script_setup_true_lang.js +123 -0
- package/dist/components/BbTabs/BbTabsPanes.vue.d.ts +16 -0
- package/dist/components/BbTabs/BbTabsPanes.vue.js +6 -0
- package/dist/components/BbTabs/BbTabsPanes.vue_vue_type_script_setup_true_lang.js +35 -0
- package/dist/components/BbTabs/BbTabsRoot.vue.d.ts +20 -0
- package/dist/components/BbTabs/BbTabsRoot.vue.js +5 -0
- package/dist/components/BbTabs/BbTabsRoot.vue_vue_type_script_setup_true_lang.js +55 -0
- package/dist/components/BbTabs/types.d.ts +264 -0
- package/dist/components/BbTag/BbTag.vue.d.ts +19 -6
- package/dist/components/BbTag/BbTag.vue.js +6 -0
- package/dist/components/BbTag/BbTag.vue_vue_type_script_setup_true_lang.js +187 -0
- package/dist/components/BbTag/types.d.ts +55 -17
- package/dist/components/BbTextInput/BbTextInput.vue.d.ts +10 -1
- package/dist/components/BbTextInput/BbTextInput.vue.js +6 -0
- package/dist/components/BbTextInput/BbTextInput.vue_vue_type_script_setup_true_lang.js +195 -0
- package/dist/components/BbTextInput/types.d.ts +31 -4
- package/dist/components/BbTextarea/BbTextarea.vue.d.ts +10 -1
- package/dist/components/BbTextarea/BbTextarea.vue.js +6 -0
- package/dist/components/BbTextarea/BbTextarea.vue_vue_type_script_setup_true_lang.js +178 -0
- package/dist/components/BbTextarea/types.d.ts +33 -2
- package/dist/components/BbTimePicker/BbTimePicker.vue.d.ts +33 -0
- package/dist/components/BbTimePicker/BbTimePicker.vue.js +6 -0
- package/dist/components/BbTimePicker/BbTimePicker.vue_vue_type_script_setup_true_lang.js +244 -0
- package/dist/components/BbTimePicker/types.d.ts +133 -0
- package/dist/components/BbTimePickerInput/BbTimePickerInput.vue.d.ts +25 -0
- package/dist/components/BbTimePickerInput/BbTimePickerInput.vue.js +6 -0
- package/dist/components/BbTimePickerInput/BbTimePickerInput.vue_vue_type_script_setup_true_lang.js +157 -0
- package/dist/components/BbTimePickerInput/types.d.ts +174 -0
- package/dist/components/BbToast/BbToast.vue.d.ts +2 -3
- package/dist/components/BbToast/BbToast.vue.js +6 -0
- package/dist/components/BbToast/BbToast.vue_vue_type_script_setup_true_lang.js +39 -0
- package/dist/components/BbToast/BbToastMessage.vue.d.ts +17 -8
- package/dist/components/BbToast/BbToastMessage.vue.js +5 -0
- package/dist/components/BbToast/BbToastMessage.vue_vue_type_script_setup_true_lang.js +170 -0
- package/dist/components/BbToast/BbToastPortal.vue.d.ts +30 -0
- package/dist/components/BbToast/BbToastPortal.vue.js +5 -0
- package/dist/components/BbToast/BbToastPortal.vue_vue_type_script_setup_true_lang.js +19 -0
- package/dist/components/BbToast/BbToastRegion.vue.d.ts +8 -0
- package/dist/components/BbToast/BbToastRegion.vue.js +5 -0
- package/dist/components/BbToast/BbToastRegion.vue_vue_type_script_setup_true_lang.js +100 -0
- package/dist/components/BbToast/types.d.ts +69 -5
- package/dist/components/BbTooltip/BbTooltip.vue.d.ts +10 -3
- package/dist/components/BbTooltip/BbTooltip.vue.js +6 -0
- package/dist/components/BbTooltip/BbTooltip.vue_vue_type_script_setup_true_lang.js +160 -0
- package/dist/components/BbTooltip/types.d.ts +69 -11
- package/dist/components/BbTree/BbTree.vue.d.ts +28 -13
- package/dist/components/BbTree/BbTree.vue.js +6 -0
- package/dist/components/BbTree/BbTree.vue_vue_type_script_setup_true_lang.js +55 -0
- package/dist/components/BbTree/BbTreeLevel.vue.d.ts +19 -0
- package/dist/components/BbTree/BbTreeLevel.vue.js +5 -0
- package/dist/components/BbTree/BbTreeLevel.vue_vue_type_script_setup_true_lang.js +94 -0
- package/dist/components/BbTree/context.d.ts +17 -0
- package/dist/components/BbTree/context.js +4 -0
- package/dist/components/BbTree/types.d.ts +94 -41
- package/dist/components/ChipsBox/ChipsBox.vue.d.ts +2 -1
- package/dist/components/ChipsBox/ChipsBox.vue.js +5 -0
- package/dist/components/ChipsBox/ChipsBox.vue_vue_type_script_setup_true_lang.js +98 -0
- package/dist/components/ChipsBox/types.d.ts +12 -5
- package/dist/components/ClearableButton/ClearableButton.vue.d.ts +2 -1
- package/dist/components/ClearableButton/ClearableButton.vue.js +6 -0
- package/dist/components/ClearableButton/ClearableButton.vue_vue_type_script_setup_true_lang.js +19 -0
- package/dist/components/ClearableButton/types.d.ts +7 -1
- package/dist/components/CloseIcon/CloseButton.vue.d.ts +5 -0
- package/dist/components/CloseIcon/CloseButton.vue.js +7 -0
- package/dist/components/CloseIcon/CloseButton.vue_vue_type_script_setup_true_lang.js +23 -0
- package/dist/components/CloseIcon/types.d.ts +2 -0
- package/dist/components/CommaBox/CommaBox.vue.d.ts +2 -1
- package/dist/components/CommaBox/CommaBox.vue.js +6 -0
- package/dist/components/CommaBox/CommaBox.vue_vue_type_script_setup_true_lang.js +81 -0
- package/dist/components/CommaBox/types.d.ts +6 -7
- package/dist/components/CommonInputWrapper/CommonInputWrapper.vue.d.ts +19 -0
- package/dist/components/CommonInputWrapper/CommonInputWrapper.vue.js +6 -0
- package/dist/components/CommonInputWrapper/CommonInputWrapper.vue_vue_type_script_setup_true_lang.js +107 -0
- package/dist/components/CommonInputWrapper/types.d.ts +96 -0
- package/dist/components/CommonPopover/CommonPopover.vue.d.ts +9 -3
- package/dist/components/CommonPopover/CommonPopover.vue.js +6 -0
- package/dist/components/CommonPopover/CommonPopover.vue_vue_type_script_setup_true_lang.js +160 -0
- package/dist/components/CommonPopover/types.d.ts +65 -16
- package/dist/components/ErrorIcon/ErrorIcon.vue.d.ts +2 -0
- package/dist/components/ErrorIcon/ErrorIcon.vue.js +6 -0
- package/dist/components/ErrorIcon/ErrorIcon.vue_vue_type_script_setup_true_lang.js +16 -0
- package/dist/components/FlatListBox/FlatListBox.vue.d.ts +2 -5
- package/dist/components/FlatListBox/FlatListBox.vue.js +5 -0
- package/dist/components/FlatListBox/FlatListBox.vue_vue_type_script_setup_true_lang.js +167 -0
- package/dist/components/FlatListBox/types.d.ts +1 -1
- package/dist/components/GroupedListBox/GroupedListBox.vue.d.ts +2 -5
- package/dist/components/GroupedListBox/GroupedListBox.vue.js +5 -0
- package/dist/components/GroupedListBox/GroupedListBox.vue_vue_type_script_setup_true_lang.js +218 -0
- package/dist/components/ListBox/ListBox.vue.d.ts +3 -6
- package/dist/components/ListBox/ListBox.vue.js +5 -0
- package/dist/components/ListBox/ListBox.vue_vue_type_script_setup_true_lang.js +112 -0
- package/dist/components/ListBox/types.d.ts +1 -1
- package/dist/components/OptionsContainer/OptionsContainer.vue.d.ts +1 -0
- package/dist/components/OptionsContainer/OptionsContainer.vue.js +5 -0
- package/dist/components/OptionsContainer/OptionsContainer.vue_vue_type_script_setup_true_lang.js +52 -0
- package/dist/components/OptionsContainer/types.d.ts +14 -24
- package/dist/components/Transitions/ScaleFade.vue.d.ts +2 -2
- package/dist/components/Transitions/ScaleFade.vue.js +5 -0
- package/dist/components/Transitions/ScaleFade.vue_vue_type_script_setup_true_lang.js +47 -0
- package/dist/components/Transitions/Slide.vue.d.ts +15 -0
- package/dist/components/Transitions/Slide.vue.js +7 -0
- package/dist/components/Transitions/Slide.vue_vue_type_script_setup_true_lang.js +28 -0
- package/dist/components/WarningIcon/WarningIcon.vue.d.ts +5 -0
- package/dist/components/WarningIcon/WarningIcon.vue.js +6 -0
- package/dist/components/WarningIcon/WarningIcon.vue_vue_type_script_setup_true_lang.js +16 -0
- package/dist/components/WarningIcon/types.d.ts +3 -0
- package/dist/composables/__testResets.d.ts +1 -0
- package/dist/composables/useActiveInactiveState.d.ts +4 -0
- package/dist/composables/useActiveInactiveState.js +21 -0
- package/dist/composables/useBaseOptions.d.ts +3 -3
- package/dist/composables/useBaseOptions.js +31 -0
- package/dist/composables/useBbConfig.d.ts +8 -37
- package/dist/composables/useBbConfig.js +5 -0
- package/dist/composables/useBbDropdownContext.d.ts +89 -0
- package/dist/composables/useBbDropdownContext.js +46 -0
- package/dist/composables/useBbFormContext.d.ts +90 -0
- package/dist/composables/useBbFormContext.js +69 -0
- package/dist/composables/useBbTableContext.d.ts +195 -0
- package/dist/composables/useBbTableContext.js +208 -0
- package/dist/composables/useBbTabsContext.d.ts +111 -0
- package/dist/composables/useBbTabsContext.js +225 -0
- package/dist/composables/useBreakpoint.d.ts +13 -0
- package/dist/composables/useBreakpoint.js +39 -0
- package/dist/composables/useBroadcastChannelInstance.d.ts +1 -3
- package/dist/composables/useBroadcastChannelInstance.js +39 -0
- package/dist/composables/useCancelableFunction.js +37 -0
- package/dist/composables/useClosingInert.d.ts +28 -0
- package/dist/composables/useClosingInert.js +23 -0
- package/dist/composables/useCoherence.js +16 -0
- package/dist/composables/useConfirm.d.ts +278 -68
- package/dist/composables/useConfirm.js +130 -0
- package/dist/composables/useCountdown.js +42 -0
- package/dist/composables/useHashedWatcher.d.ts +17 -0
- package/dist/composables/useHashedWatcher.js +14 -0
- package/dist/composables/useId.d.ts +3 -2
- package/dist/composables/useIndexById.js +16 -0
- package/dist/composables/useInertiaPage.d.ts +10 -0
- package/dist/composables/useInertiaPage.js +8 -0
- package/dist/composables/useItemText.js +17 -0
- package/dist/composables/useItemValue.js +9 -0
- package/dist/composables/useItemsGetter.d.ts +1 -1
- package/dist/composables/useItemsGetter.js +30 -0
- package/dist/composables/useListboxFocus.js +66 -0
- package/dist/composables/useLocale.d.ts +1 -1
- package/dist/composables/useLocale.js +11 -0
- package/dist/composables/useLogger.d.ts +1 -1
- package/dist/composables/useLogger.js +10 -0
- package/dist/composables/useMinimalQueue.d.ts +1 -1
- package/dist/composables/useMobile.js +7 -0
- package/dist/composables/useOnFalsy.d.ts +2 -0
- package/dist/composables/useOnFalsy.js +9 -0
- package/dist/composables/useOnTruthy.d.ts +7 -0
- package/dist/composables/useOnTruthy.js +9 -0
- package/dist/composables/usePrefill.d.ts +2 -1
- package/dist/composables/usePrefill.js +24 -0
- package/dist/composables/useQuery.d.ts +15 -3
- package/dist/composables/useQuery.js +42 -0
- package/dist/composables/useRoute.js +11 -0
- package/dist/composables/useRouter.js +8 -0
- package/dist/composables/useSafeArea.d.ts +51 -0
- package/dist/composables/useSafeArea.js +16 -0
- package/dist/composables/useSegmentedFields.d.ts +104 -0
- package/dist/composables/useSegmentedFields.js +159 -0
- package/dist/composables/useTableWidthContext.d.ts +5 -0
- package/dist/composables/useTableWidthContext.js +42 -0
- package/dist/composables/useToast.d.ts +40 -70
- package/dist/composables/useToast.js +58 -0
- package/dist/composables/useTopLayer.d.ts +9 -0
- package/dist/composables/useTopLayer.js +7 -0
- package/dist/composables/useUntil.js +13 -0
- package/dist/composables/useViewportWidth.d.ts +17 -0
- package/dist/composables/useViewportWidth.js +6 -0
- package/dist/confirm-variants.d.ts +17 -0
- package/dist/deprecation/ai-deprecations.json.d.ts +784 -0
- package/dist/deprecation/ai-deprecations.json.js +4 -0
- package/dist/deprecation/removedProps.d.ts +3 -0
- package/dist/deprecation/removedProps.js +13 -0
- package/dist/directives/bbColor.d.ts +65 -0
- package/dist/directives/bbColor.js +24 -0
- package/dist/directives/bbDate.d.ts +66 -0
- package/dist/directives/bbDate.js +24 -0
- package/dist/directives/bbDropdown.d.ts +15 -11
- package/dist/directives/bbDropdown.js +23 -0
- package/dist/directives/bbTime.d.ts +64 -0
- package/dist/directives/bbTime.js +24 -0
- package/dist/directives/bbTooltip.d.ts +16 -11
- package/dist/directives/bbTooltip.js +24 -0
- package/dist/directives/createPopoverDirective.js +54 -0
- package/dist/dropdown-item-variants.d.ts +17 -0
- package/dist/i18n/index.d.ts +51 -3
- package/dist/i18n/index.js +27 -0
- package/dist/i18n/locales/cs.json +115 -0
- package/dist/i18n/locales/da.json +115 -0
- package/dist/i18n/locales/de.json +115 -0
- package/dist/i18n/locales/el.json +115 -0
- package/dist/i18n/locales/en.json +115 -0
- package/dist/i18n/locales/es.json +115 -0
- package/dist/i18n/locales/fi.json +115 -0
- package/dist/i18n/locales/fr.json +115 -0
- package/dist/i18n/locales/hu.json +115 -0
- package/dist/i18n/locales/it.json +115 -0
- package/dist/i18n/locales/ja.json +115 -0
- package/dist/i18n/locales/ko.json +115 -0
- package/dist/i18n/locales/nb.json +115 -0
- package/dist/i18n/locales/nl.json +115 -0
- package/dist/i18n/locales/pl.json +115 -0
- package/dist/i18n/locales/pt.json +115 -0
- package/dist/i18n/locales/ro.json +115 -0
- package/dist/i18n/locales/ru.json +115 -0
- package/dist/i18n/locales/sv.json +115 -0
- package/dist/i18n/locales/tr.json +115 -0
- package/dist/i18n/locales/uk.json +115 -0
- package/dist/i18n/locales/zh-cn.json +115 -0
- package/dist/icons-whitelist.d.ts +8 -0
- package/dist/index.d.ts +96 -79
- package/dist/index.js +76 -82
- package/dist/indicator-variants.d.ts +20 -0
- package/dist/llms-full.txt +79703 -0
- package/dist/llms-medium.txt +1514 -0
- package/dist/llms.txt +105 -0
- package/dist/locale-blueprint.json +141 -0
- package/dist/locale-registry.d.ts +37 -0
- package/dist/nuxt-module.d.ts +3 -0
- package/dist/nuxt.js +19 -0
- package/dist/plugin.d.ts +4 -0
- package/dist/plugin.js +22 -0
- package/dist/reset.css +1 -0
- package/dist/reset.d.ts +0 -0
- package/dist/runtime/nuxt-plugin.d.ts +2 -0
- package/dist/runtime/nuxt-plugin.js +24 -0
- package/dist/styles.css +2 -0
- package/dist/styles.d.ts +0 -0
- package/dist/toast-variants.d.ts +20 -0
- package/dist/tooltip-variants.d.ts +17 -0
- package/dist/types/ActionButton.d.ts +32 -0
- package/dist/types/AlertVariant.d.ts +16 -0
- package/dist/types/BadgeVariant.d.ts +16 -0
- package/dist/types/ButtonVariant.d.ts +17 -0
- package/dist/types/Classes.d.ts +1 -1
- package/dist/types/ColumnName.d.ts +1 -1
- package/dist/types/CommonProps.d.ts +68 -277
- package/dist/types/Config.d.ts +84 -0
- package/dist/types/ConfirmVariant.d.ts +15 -0
- package/dist/types/DropdownItemVariant.d.ts +18 -0
- package/dist/types/Icon.d.ts +5 -7
- package/dist/types/IndicatorVariant.d.ts +16 -0
- package/dist/types/InputDirection.d.ts +15 -0
- package/dist/types/ItemAccessor.d.ts +21 -0
- package/dist/types/Placement.d.ts +6 -0
- package/dist/types/ResponsiveSize.d.ts +20 -0
- package/dist/types/SizeScale.d.ts +8 -0
- package/dist/types/ToastVariant.d.ts +17 -0
- package/dist/types/TooltipVariant.d.ts +18 -0
- package/dist/utilities/functions/bytesToUnit.d.ts +2 -0
- package/dist/utilities/functions/bytesToUnit.js +18 -0
- package/dist/utilities/functions/clampPrecision.js +10 -0
- package/dist/utilities/functions/convertDateValue.d.ts +23 -10
- package/dist/utilities/functions/convertDateValue.js +12 -0
- package/dist/utilities/functions/deburr.js +5 -0
- package/dist/utilities/functions/empty.js +5 -0
- package/dist/utilities/functions/flattenTree.d.ts +1 -1
- package/dist/utilities/functions/hash.js +5 -0
- package/dist/utilities/functions/isDateDisabled.d.ts +1 -0
- package/dist/utilities/functions/isDateDisabled.js +20 -0
- package/dist/utilities/functions/isEqual.js +5 -0
- package/dist/utilities/functions/isNotEmpty.js +5 -0
- package/dist/utilities/functions/matchAnyKey.d.ts +1 -1
- package/dist/utilities/functions/matchAnyKey.js +15 -0
- package/dist/utilities/functions/parseSize.d.ts +1 -1
- package/dist/utilities/functions/parseSize.js +15 -0
- package/dist/utilities/functions/percentage.js +11 -0
- package/dist/utilities/functions/pipe.d.ts +1 -1
- package/dist/utilities/functions/reject.d.ts +25 -0
- package/dist/utilities/functions/reject.js +28 -0
- package/dist/utilities/functions/resolveEnumProp.d.ts +19 -0
- package/dist/utilities/functions/resolveEnumProp.js +5 -0
- package/dist/utilities/functions/slotKey.d.ts +13 -0
- package/dist/utilities/functions/slotKey.js +4 -0
- package/dist/utilities/functions/sort.d.ts +2 -2
- package/dist/utilities/functions/sort.js +19 -0
- package/dist/utilities/functions/throttle.js +5 -0
- package/dist/utilities/functions/waitFor.d.ts +9 -2
- package/dist/utilities/functions/waitFor.js +14 -0
- package/dist/utilities/functions/warnRemovedAttrs.d.ts +11 -0
- package/dist/utilities/functions/warnRemovedAttrs.js +20 -0
- package/dist/utilities/functions/when.js +5 -0
- package/dist/utilities/misc/iconsInjectionKey.d.ts +15 -0
- package/dist/utilities/misc/iconsInjectionKey.js +4 -0
- package/dist/utilities/misc/transitions.d.ts +5 -0
- package/dist/utilities/misc/transitions.js +8 -0
- package/dist/utils/injectLibraryStyles.d.ts +6 -0
- package/dist/utils/injectLibraryStyles.js +38 -0
- package/dist/validated/BbCheckbox.vue.d.ts +29 -0
- package/dist/validated/BbCheckbox.vue.js +5 -0
- package/dist/validated/BbCheckbox.vue_vue_type_script_setup_true_lang.js +75 -0
- package/dist/validated/BbCheckboxGroup.vue.d.ts +34 -0
- package/dist/validated/BbCheckboxGroup.vue.js +5 -0
- package/dist/validated/BbCheckboxGroup.vue_vue_type_script_setup_true_lang.js +82 -0
- package/dist/validated/BbColorInput.vue.d.ts +36 -0
- package/dist/validated/BbColorInput.vue.js +5 -0
- package/dist/validated/BbColorInput.vue_vue_type_script_setup_true_lang.js +71 -0
- package/dist/validated/BbDatePickerInput.vue.d.ts +41 -0
- package/dist/validated/BbDatePickerInput.vue.js +5 -0
- package/dist/validated/BbDatePickerInput.vue_vue_type_script_setup_true_lang.js +90 -0
- package/dist/validated/BbDropzone.vue.d.ts +24 -0
- package/dist/validated/BbDropzone.vue.js +5 -0
- package/dist/validated/BbDropzone.vue_vue_type_script_setup_true_lang.js +45 -0
- package/dist/validated/BbForm.vue.d.ts +28 -0
- package/dist/validated/BbForm.vue.js +5 -0
- package/dist/validated/BbForm.vue_vue_type_script_setup_true_lang.js +42 -0
- package/dist/validated/BbNumberInput.vue.d.ts +36 -0
- package/dist/validated/BbNumberInput.vue.js +5 -0
- package/dist/validated/BbNumberInput.vue_vue_type_script_setup_true_lang.js +72 -0
- package/dist/validated/BbRadioGroup.vue.d.ts +34 -0
- package/dist/validated/BbRadioGroup.vue.js +5 -0
- package/dist/validated/BbRadioGroup.vue_vue_type_script_setup_true_lang.js +78 -0
- package/dist/validated/BbRating.vue.d.ts +30 -0
- package/dist/validated/BbRating.vue.js +5 -0
- package/dist/validated/BbRating.vue_vue_type_script_setup_true_lang.js +63 -0
- package/dist/validated/BbSelect.vue.d.ts +46 -0
- package/dist/validated/BbSelect.vue.js +5 -0
- package/dist/validated/BbSelect.vue_vue_type_script_setup_true_lang.js +109 -0
- package/dist/validated/BbSlider.vue.d.ts +36 -0
- package/dist/validated/BbSlider.vue.js +5 -0
- package/dist/validated/BbSlider.vue_vue_type_script_setup_true_lang.js +69 -0
- package/dist/validated/BbSwitch.vue.d.ts +29 -0
- package/dist/validated/BbSwitch.vue.js +5 -0
- package/dist/validated/BbSwitch.vue_vue_type_script_setup_true_lang.js +75 -0
- package/dist/validated/BbSwitchGroup.vue.d.ts +34 -0
- package/dist/validated/BbSwitchGroup.vue.js +5 -0
- package/dist/validated/BbSwitchGroup.vue_vue_type_script_setup_true_lang.js +82 -0
- package/dist/validated/BbTag.vue.d.ts +36 -0
- package/dist/validated/BbTag.vue.js +5 -0
- package/dist/validated/BbTag.vue_vue_type_script_setup_true_lang.js +72 -0
- package/dist/validated/BbTextInput.vue.d.ts +36 -0
- package/dist/validated/BbTextInput.vue.js +5 -0
- package/dist/validated/BbTextInput.vue_vue_type_script_setup_true_lang.js +72 -0
- package/dist/validated/BbTextarea.vue.d.ts +36 -0
- package/dist/validated/BbTextarea.vue.js +5 -0
- package/dist/validated/BbTextarea.vue_vue_type_script_setup_true_lang.js +70 -0
- package/dist/validated/BbTimePickerInput.vue.d.ts +37 -0
- package/dist/validated/BbTimePickerInput.vue.js +5 -0
- package/dist/validated/BbTimePickerInput.vue_vue_type_script_setup_true_lang.js +81 -0
- package/dist/validated/index.d.ts +29 -0
- package/dist/validated/useValidatedField.d.ts +93 -0
- package/dist/validated/useValidatedField.js +51 -0
- package/dist/validated.js +21 -0
- package/dist/vite-plugin.d.ts +261 -0
- package/dist/vite.js +603 -0
- package/llms.txt +107 -0
- package/package.json +181 -60
- package/scripts/lib/__fixtures__/validated-manifest.json +65 -0
- package/scripts/lib/ensure-manifest.mjs +39 -0
- package/scripts/lib/eslint-plugin-autofix.node.test.mjs +109 -0
- package/scripts/lib/eslint-plugin-recommended.node.test.mjs +87 -0
- package/scripts/lib/eslint-plugin-slots.node.test.mjs +271 -0
- package/scripts/lib/eslint-plugin.mjs +702 -0
- package/scripts/lib/eslint-plugin.node.test.mjs +193 -0
- package/scripts/lib/html-attributes.mjs +191 -0
- package/scripts/lib/mcp-config.mjs +126 -0
- package/scripts/lib/migrate-fix.mjs +115 -0
- package/scripts/lib/validate-bb-markup.mjs +488 -0
- package/dist/ai/BaseButton.md +0 -449
- package/dist/ai/BaseCheckbox.md +0 -512
- package/dist/ai/BaseCheckboxGroup.md +0 -597
- package/dist/ai/BaseColorInput.md +0 -461
- package/dist/ai/BaseDatePicker.md +0 -739
- package/dist/ai/BaseDatePickerInput.md +0 -1517
- package/dist/ai/BaseDialog.md +0 -610
- package/dist/ai/BaseInputContainer.md +0 -570
- package/dist/ai/BaseNumberInput.md +0 -509
- package/dist/ai/BaseRadio.md +0 -405
- package/dist/ai/BaseRadioGroup.md +0 -535
- package/dist/ai/BaseRating.md +0 -489
- package/dist/ai/BaseSelect.md +0 -1742
- package/dist/ai/BaseSlider.md +0 -871
- package/dist/ai/BaseSwitch.md +0 -322
- package/dist/ai/BaseSwitchGroup.md +0 -298
- package/dist/ai/BaseTag.md +0 -623
- package/dist/ai/BaseTextInput.md +0 -392
- package/dist/ai/BaseTextarea.md +0 -398
- package/dist/ai/BbChip.md +0 -147
- package/dist/ai/BbIntersection.md +0 -120
- package/dist/ai/BbRatio.md +0 -61
- package/dist/ai/BbRows.md +0 -307
- package/dist/ai/BbTab.md +0 -950
- package/dist/ai/CommonInputInnerContainer.md +0 -414
- package/dist/ai/CommonInputOuterContainer.md +0 -55
- package/dist/components/BaseButton/BaseButton.vue.d.ts +0 -14
- package/dist/components/BaseButton/types.d.ts +0 -159
- package/dist/components/BaseCheckbox/BaseCheckbox.vue.d.ts +0 -39
- package/dist/components/BaseCheckbox/types.d.ts +0 -213
- package/dist/components/BaseCheckboxGroup/BaseCheckboxGroup.vue.d.ts +0 -30
- package/dist/components/BaseCheckboxGroup/types.d.ts +0 -282
- package/dist/components/BaseColorInput/BaseColorInput.vue.d.ts +0 -35
- package/dist/components/BaseColorInput/ColorPalette.vue.d.ts +0 -13
- package/dist/components/BaseColorInput/types.d.ts +0 -233
- package/dist/components/BaseDatePicker/BaseDatePickerHeader.vue.d.ts +0 -15
- package/dist/components/BaseDatePicker/BaseDatePickerInputDaySelector.vue.d.ts +0 -58
- package/dist/components/BaseDatePicker/BaseDatePickerMonthSelector.vue.d.ts +0 -12
- package/dist/components/BaseDatePicker/BaseDatePickerYearSelector.vue.d.ts +0 -12
- package/dist/components/BaseDatePicker/types.d.ts +0 -100
- package/dist/components/BaseDatePickerInput/BaseDatePickerInput.vue.d.ts +0 -26
- package/dist/components/BaseDatePickerInput/types.d.ts +0 -206
- package/dist/components/BaseDialog/BaseDialog.vue.d.ts +0 -37
- package/dist/components/BaseDialog/types.d.ts +0 -180
- package/dist/components/BaseInputContainer/BaseInputContainer.vue.d.ts +0 -18
- package/dist/components/BaseInputContainer/types.d.ts +0 -126
- package/dist/components/BaseNumberInput/BaseNumberInput.vue.d.ts +0 -46
- package/dist/components/BaseNumberInput/types.d.ts +0 -191
- package/dist/components/BaseRadio/BaseRadio.vue.d.ts +0 -31
- package/dist/components/BaseRadio/types.d.ts +0 -173
- package/dist/components/BaseRadioGroup/BaseRadioGroup.vue.d.ts +0 -30
- package/dist/components/BaseRadioGroup/types.d.ts +0 -240
- package/dist/components/BaseRating/BaseRating.vue.d.ts +0 -35
- package/dist/components/BaseRating/types.d.ts +0 -144
- package/dist/components/BaseSelect/BaseSelect.vue.d.ts +0 -28
- package/dist/components/BaseSelect/types.d.ts +0 -470
- package/dist/components/BaseSlider/BaseSlider.vue.d.ts +0 -38
- package/dist/components/BaseSlider/types.d.ts +0 -201
- package/dist/components/BaseSwitch/BaseSwitch.vue.d.ts +0 -34
- package/dist/components/BaseSwitch/types.d.ts +0 -25
- package/dist/components/BaseSwitchGroup/BaseSwitchGroup.vue.d.ts +0 -30
- package/dist/components/BaseSwitchGroup/types.d.ts +0 -8
- package/dist/components/BaseTag/BaseTag.vue.d.ts +0 -37
- package/dist/components/BaseTag/types.d.ts +0 -136
- package/dist/components/BaseTextInput/BaseTextInput.vue.d.ts +0 -33
- package/dist/components/BaseTextInput/types.d.ts +0 -166
- package/dist/components/BaseTextarea/BaseTextarea.vue.d.ts +0 -31
- package/dist/components/BaseTextarea/types.d.ts +0 -151
- package/dist/components/BbChip/BbChip.vue.d.ts +0 -17
- package/dist/components/BbChip/types.d.ts +0 -23
- package/dist/components/BbIntersection/BbIntersection.vue.d.ts +0 -23
- package/dist/components/BbIntersection/types.d.ts +0 -36
- package/dist/components/BbRatio/BbRatio.vue.d.ts +0 -14
- package/dist/components/BbRatio/types.d.ts +0 -15
- package/dist/components/BbRows/BbRows.vue.d.ts +0 -62
- package/dist/components/BbRows/types.d.ts +0 -21
- package/dist/components/BbTab/BbTab.vue.d.ts +0 -27
- package/dist/components/BbTab/types.d.ts +0 -186
- package/dist/components/CommonInputInnerContainer/CommonInputInnerContainer.vue.d.ts +0 -15
- package/dist/components/CommonInputInnerContainer/types.d.ts +0 -47
- package/dist/components/CommonInputOuterContainer/CommonInputOuterContainer.vue.d.ts +0 -11
- package/dist/components/CommonInputOuterContainer/types.d.ts +0 -16
- package/dist/composables/useModalsState.d.ts +0 -5
- package/dist/composables/useQueue.d.ts +0 -58
- package/dist/composables/useWizard.d.ts +0 -85
- package/dist/i18n/en.d.ts +0 -67
- package/dist/i18n/it.d.ts +0 -67
- package/dist/index.css +0 -2
- package/dist/index100.js +0 -6
- package/dist/index101.js +0 -300
- package/dist/index102.js +0 -16
- package/dist/index103.js +0 -16
- package/dist/index104.js +0 -27
- package/dist/index109.js +0 -19
- package/dist/index11.js +0 -42
- package/dist/index110.js +0 -12
- package/dist/index111.js +0 -19
- package/dist/index112.js +0 -25
- package/dist/index114.js +0 -7
- package/dist/index115.js +0 -241
- package/dist/index116.js +0 -5
- package/dist/index117.js +0 -42
- package/dist/index118.js +0 -5
- package/dist/index119.js +0 -53
- package/dist/index120.js +0 -5
- package/dist/index121.js +0 -32
- package/dist/index122.js +0 -5
- package/dist/index124.js +0 -52
- package/dist/index125.js +0 -5
- package/dist/index126.js +0 -223
- package/dist/index128.js +0 -6
- package/dist/index129.js +0 -162
- package/dist/index13.js +0 -92
- package/dist/index130.js +0 -25
- package/dist/index131.js +0 -51
- package/dist/index132.js +0 -5
- package/dist/index133.js +0 -607
- package/dist/index135.js +0 -6
- package/dist/index136.js +0 -14
- package/dist/index137.js +0 -153
- package/dist/index139.js +0 -6
- package/dist/index14.js +0 -306
- package/dist/index140.js +0 -224
- package/dist/index141.js +0 -5
- package/dist/index143.js +0 -128
- package/dist/index145.js +0 -6
- package/dist/index146.js +0 -8
- package/dist/index147.js +0 -182
- package/dist/index149.js +0 -6
- package/dist/index15.js +0 -10
- package/dist/index151.js +0 -4
- package/dist/index152.js +0 -95
- package/dist/index154.js +0 -6
- package/dist/index155.js +0 -168
- package/dist/index157.js +0 -6
- package/dist/index158.js +0 -145
- package/dist/index16.js +0 -59
- package/dist/index160.js +0 -6
- package/dist/index161.js +0 -53
- package/dist/index163.js +0 -6
- package/dist/index164.js +0 -16
- package/dist/index166.js +0 -35
- package/dist/index168.js +0 -6
- package/dist/index169.js +0 -89
- package/dist/index171.js +0 -6
- package/dist/index172.js +0 -82
- package/dist/index174.js +0 -6
- package/dist/index175.js +0 -38
- package/dist/index176.js +0 -461
- package/dist/index177.js +0 -28
- package/dist/index178.js +0 -66
- package/dist/index18.js +0 -35
- package/dist/index180.js +0 -162
- package/dist/index181.js +0 -5
- package/dist/index182.js +0 -217
- package/dist/index183.js +0 -5
- package/dist/index184.js +0 -112
- package/dist/index185.js +0 -5
- package/dist/index186.js +0 -459
- package/dist/index188.js +0 -6
- package/dist/index19.js +0 -4
- package/dist/index192.js +0 -268
- package/dist/index194.js +0 -6
- package/dist/index195.js +0 -124
- package/dist/index197.js +0 -6
- package/dist/index198.js +0 -174
- package/dist/index2.js +0 -20
- package/dist/index20.js +0 -9
- package/dist/index200.js +0 -6
- package/dist/index201.js +0 -224
- package/dist/index203.js +0 -6
- package/dist/index204.js +0 -135
- package/dist/index206.js +0 -6
- package/dist/index207.js +0 -5
- package/dist/index208.js +0 -170
- package/dist/index21.js +0 -35
- package/dist/index210.js +0 -6
- package/dist/index211.js +0 -37
- package/dist/index213.js +0 -6
- package/dist/index214.js +0 -63
- package/dist/index216.js +0 -6
- package/dist/index217.js +0 -74
- package/dist/index219.js +0 -6
- package/dist/index22.js +0 -6
- package/dist/index220.js +0 -65
- package/dist/index222.js +0 -6
- package/dist/index223.js +0 -67
- package/dist/index225.js +0 -6
- package/dist/index226.js +0 -41
- package/dist/index228.js +0 -6
- package/dist/index229.js +0 -10
- package/dist/index23.js +0 -7
- package/dist/index230.js +0 -22
- package/dist/index232.js +0 -8
- package/dist/index233.js +0 -297
- package/dist/index235.js +0 -6
- package/dist/index236.js +0 -47
- package/dist/index237.js +0 -165
- package/dist/index239.js +0 -6
- package/dist/index24.js +0 -9
- package/dist/index241.js +0 -159
- package/dist/index243.js +0 -6
- package/dist/index244.js +0 -134
- package/dist/index246.js +0 -6
- package/dist/index247.js +0 -167
- package/dist/index249.js +0 -6
- package/dist/index25.js +0 -24
- package/dist/index250.js +0 -147
- package/dist/index252.js +0 -6
- package/dist/index253.js +0 -35
- package/dist/index255.js +0 -6
- package/dist/index256.js +0 -65
- package/dist/index258.js +0 -6
- package/dist/index259.js +0 -19
- package/dist/index260.js +0 -5
- package/dist/index261.js +0 -160
- package/dist/index263.js +0 -6
- package/dist/index264.js +0 -60
- package/dist/index266.js +0 -6
- package/dist/index267.js +0 -134
- package/dist/index269.js +0 -6
- package/dist/index27.js +0 -4
- package/dist/index271.js +0 -206
- package/dist/index273.js +0 -6
- package/dist/index274.js +0 -85
- package/dist/index275.js +0 -5
- package/dist/index276.js +0 -55
- package/dist/index277.js +0 -5
- package/dist/index278.js +0 -164
- package/dist/index28.js +0 -8
- package/dist/index280.js +0 -6
- package/dist/index281.js +0 -145
- package/dist/index283.js +0 -6
- package/dist/index284.js +0 -11
- package/dist/index285.js +0 -200
- package/dist/index287.js +0 -6
- package/dist/index288.js +0 -241
- package/dist/index29.js +0 -7
- package/dist/index290.js +0 -6
- package/dist/index291.js +0 -21
- package/dist/index293.js +0 -6
- package/dist/index294.js +0 -125
- package/dist/index296.js +0 -6
- package/dist/index297.js +0 -161
- package/dist/index299.js +0 -6
- package/dist/index30.js +0 -118
- package/dist/index300.js +0 -127
- package/dist/index302.js +0 -6
- package/dist/index303.js +0 -20
- package/dist/index305.js +0 -6
- package/dist/index306.js +0 -116
- package/dist/index307.js +0 -5
- package/dist/index308.js +0 -507
- package/dist/index31.js +0 -10
- package/dist/index310.js +0 -6
- package/dist/index311.js +0 -196
- package/dist/index313.js +0 -6
- package/dist/index314.js +0 -142
- package/dist/index316.js +0 -6
- package/dist/index317.js +0 -134
- package/dist/index319.js +0 -6
- package/dist/index32.js +0 -28
- package/dist/index320.js +0 -162
- package/dist/index322.js +0 -6
- package/dist/index323.js +0 -319
- package/dist/index325.js +0 -6
- package/dist/index326.js +0 -40
- package/dist/index327.js +0 -43
- package/dist/index328.js +0 -665
- package/dist/index33.js +0 -5
- package/dist/index330.js +0 -6
- package/dist/index331.js +0 -155
- package/dist/index333.js +0 -6
- package/dist/index334.js +0 -142
- package/dist/index336.js +0 -6
- package/dist/index337.js +0 -155
- package/dist/index339.js +0 -6
- package/dist/index34.js +0 -112
- package/dist/index340.js +0 -58
- package/dist/index341.js +0 -5
- package/dist/index342.js +0 -20
- package/dist/index344.js +0 -6
- package/dist/index345.js +0 -142
- package/dist/index347.js +0 -6
- package/dist/index349.js +0 -109
- package/dist/index351.js +0 -6
- package/dist/index352.js +0 -55
- package/dist/index353.js +0 -24
- package/dist/index354.js +0 -23
- package/dist/index355.js +0 -839
- package/dist/index356.js +0 -474
- package/dist/index357.js +0 -52
- package/dist/index358.js +0 -7
- package/dist/index36.js +0 -6
- package/dist/index38.js +0 -63
- package/dist/index39.js +0 -63
- package/dist/index40.js +0 -9
- package/dist/index42.js +0 -8
- package/dist/index43.js +0 -179
- package/dist/index44.js +0 -21
- package/dist/index46.js +0 -385
- package/dist/index48.js +0 -6
- package/dist/index49.js +0 -33
- package/dist/index5.js +0 -34
- package/dist/index50.js +0 -12
- package/dist/index51.js +0 -8
- package/dist/index52.js +0 -106
- package/dist/index53.js +0 -330
- package/dist/index54.js +0 -97
- package/dist/index55.js +0 -328
- package/dist/index56.js +0 -28
- package/dist/index57.js +0 -102
- package/dist/index58.js +0 -157
- package/dist/index6.js +0 -38
- package/dist/index60.js +0 -6
- package/dist/index61.js +0 -131
- package/dist/index62.js +0 -5
- package/dist/index65.js +0 -35
- package/dist/index66.js +0 -26
- package/dist/index68.js +0 -6
- package/dist/index69.js +0 -54
- package/dist/index7.js +0 -58
- package/dist/index71.js +0 -6
- package/dist/index72.js +0 -14
- package/dist/index74.js +0 -6
- package/dist/index75.js +0 -159
- package/dist/index77.js +0 -6
- package/dist/index78.js +0 -4
- package/dist/index79.js +0 -4
- package/dist/index80.js +0 -54
- package/dist/index81.js +0 -5
- package/dist/index82.js +0 -5
- package/dist/index83.js +0 -141
- package/dist/index85.js +0 -6
- package/dist/index86.js +0 -65
- package/dist/index88.js +0 -6
- package/dist/index89.js +0 -30
- package/dist/index9.js +0 -11
- package/dist/index90.js +0 -19
- package/dist/index91.js +0 -17
- package/dist/index92.js +0 -9
- package/dist/index93.js +0 -34
- package/dist/index95.js +0 -16
- package/dist/index96.js +0 -10
- package/dist/index97.js +0 -18
- package/dist/index98.js +0 -189
- package/dist/types/VoidHtmlElements.d.ts +0 -1
- package/dist/utilities/functions/add.d.ts +0 -1
- package/dist/utilities/functions/booleanishToBoolean.d.ts +0 -6
- package/dist/utilities/functions/capitalize.d.ts +0 -4
- package/dist/utilities/functions/cloneDeep.d.ts +0 -1
- package/dist/utilities/functions/debounce.d.ts +0 -1
- package/dist/utilities/functions/drop.d.ts +0 -1
- package/dist/utilities/functions/exceedsPrecision.d.ts +0 -1
- package/dist/utilities/functions/findRight.d.ts +0 -4
- package/dist/utilities/functions/findRightIndex.d.ts +0 -4
- package/dist/utilities/functions/flow.d.ts +0 -1
- package/dist/utilities/functions/getHueFromRGB.d.ts +0 -9
- package/dist/utilities/functions/groupBy.d.ts +0 -6
- package/dist/utilities/functions/gt.d.ts +0 -7
- package/dist/utilities/functions/hexToRGB.d.ts +0 -7
- package/dist/utilities/functions/hslToHex.d.ts +0 -1
- package/dist/utilities/functions/includes.d.ts +0 -1
- package/dist/utilities/functions/initial.d.ts +0 -1
- package/dist/utilities/functions/isCssColor.d.ts +0 -5
- package/dist/utilities/functions/lt.d.ts +0 -7
- package/dist/utilities/functions/makeUrl.d.ts +0 -1
- package/dist/utilities/functions/mapKeys.d.ts +0 -5
- package/dist/utilities/functions/mapValues.d.ts +0 -1
- package/dist/utilities/functions/matchesPropertyInsensitive.d.ts +0 -1
- package/dist/utilities/functions/max.d.ts +0 -2
- package/dist/utilities/functions/mean.d.ts +0 -4
- package/dist/utilities/functions/merge.d.ts +0 -11
- package/dist/utilities/functions/millisecondsTo.d.ts +0 -1
- package/dist/utilities/functions/negate.d.ts +0 -4
- package/dist/utilities/functions/normalizeItemGroups.d.ts +0 -13
- package/dist/utilities/functions/omit.d.ts +0 -2
- package/dist/utilities/functions/overEvery.d.ts +0 -4
- package/dist/utilities/functions/pick.d.ts +0 -1
- package/dist/utilities/functions/replace.d.ts +0 -1
- package/dist/utilities/functions/replaceInTree.d.ts +0 -4
- package/dist/utilities/functions/retry.d.ts +0 -5
- package/dist/utilities/functions/roundToTheNearest.d.ts +0 -8
- package/dist/utilities/functions/set.d.ts +0 -15
- package/dist/utilities/functions/stub.d.ts +0 -6
- package/dist/utilities/functions/transposePercent.d.ts +0 -9
- package/dist/utilities/functions/tryTo.d.ts +0 -2
- package/dist/utilities/functions/uniqBy.d.ts +0 -1
- /package/dist/{index64.js → _virtual/_plugin-vue_export-helper.js} +0 -0
- /package/dist/components/{BaseButton → BbBaseButton}/RouterComponent.vue.d.ts +0 -0
- /package/dist/components/{BaseDatePicker/BaseDatePicker.vue.d.ts → BbBaseDatePicker/BbBaseDatePicker.vue.d.ts} +0 -0
- /package/dist/{index165.js → composables/useArray.js} +0 -0
- /package/dist/{index17.js → composables/useFrameworkDetection.js} +0 -0
- /package/dist/{index12.js → composables/useId.js} +0 -0
- /package/dist/{index107.js → utilities/functions/chunk.js} +0 -0
- /package/dist/{index8.js → utilities/functions/clamp.js} +0 -0
- /package/dist/{index150.js → utilities/functions/curry.js} +0 -0
- /package/dist/{index45.js → utilities/functions/extractDomContainer.js} +0 -0
- /package/dist/{index270.js → utilities/functions/findInTree.js} +0 -0
- /package/dist/{index348.js → utilities/functions/flattenTree.js} +0 -0
- /package/dist/{index41.js → utilities/functions/get.js} +0 -0
- /package/dist/{index189.js → utilities/functions/head.js} +0 -0
- /package/dist/{index108.js → utilities/functions/identity.js} +0 -0
- /package/dist/{index179.js → utilities/functions/indexBy.js} +0 -0
- /package/dist/{index37.js → utilities/functions/isHex.js} +0 -0
- /package/dist/{index94.js → utilities/functions/isNil.js} +0 -0
- /package/dist/{index26.js → utilities/functions/isNotNil.js} +0 -0
- /package/dist/{index105.js → utilities/functions/last.js} +0 -0
- /package/dist/{index142.js → utilities/functions/noop.js} +0 -0
- /package/dist/{index231.js → utilities/functions/parseWidthString.js} +0 -0
- /package/dist/{index240.js → utilities/functions/pickBy.js} +0 -0
- /package/dist/{index123.js → utilities/functions/range.js} +0 -0
- /package/dist/{index190.js → utilities/functions/snapToStep.js} +0 -0
- /package/dist/{index191.js → utilities/functions/transpose.js} +0 -0
- /package/dist/{index106.js → utilities/functions/validateDateFormat.js} +0 -0
- /package/dist/{index10.js → utilities/functions/wait.js} +0 -0
package/dist/ai/BbSelect.md
CHANGED
|
@@ -1,567 +1,1430 @@
|
|
|
1
1
|
# BbSelect
|
|
2
2
|
|
|
3
|
-
##
|
|
3
|
+
## Agent Contract
|
|
4
|
+
|
|
5
|
+
- Safety level: **Consumer API**
|
|
6
|
+
- Group: **Selection**
|
|
7
|
+
- Description: Selects one or many options from structured data.
|
|
8
|
+
- Usage rule: Prefer this component for consumer-facing implementations.
|
|
9
|
+
- Implementation source (only when the contract below is not enough): [source/BbSelect.md](./source/BbSelect.md)
|
|
10
|
+
|
|
11
|
+
## Usage & Guidelines
|
|
12
|
+
|
|
13
|
+
### When to use
|
|
14
|
+
|
|
15
|
+
Reach for `BbSelect` when the user picks from a list that is **large, dynamic,
|
|
16
|
+
or searchable**, and you want a labelled form control with hint, error and
|
|
17
|
+
loading states baked in. It is the default choice for country/city pickers,
|
|
18
|
+
assignee fields, tag inputs and any async-backed lookup.
|
|
19
|
+
|
|
20
|
+
Prefer a sibling when the shape is simpler:
|
|
21
|
+
|
|
22
|
+
- Small, static, exclusive choice (≤6 options, always visible) → `BbRadioGroup`.
|
|
23
|
+
- Small, static, multi-choice → `BbCheckboxGroup` / `BbSwitchGroup`.
|
|
24
|
+
- You need a **custom trigger** (a status pill, an avatar stack, a badge) rather
|
|
25
|
+
than an inline input → `BbSelectPopover`, the popover-anchored sibling that
|
|
26
|
+
shares this component's search and option engine.
|
|
27
|
+
- Values the user _invents_ (open vocabulary) → `BbTag`; if values come from a
|
|
28
|
+
known set, `BbSelect` in multiple mode is the right tool.
|
|
29
|
+
|
|
30
|
+
`label` is required — it is the accessible name. Hide it visually with
|
|
31
|
+
`hide-label` when the surrounding UI already labels the field.
|
|
32
|
+
|
|
33
|
+
### Map options with `item-text` and `item-value`
|
|
34
|
+
|
|
35
|
+
Pass your domain objects to `items` **as they are** and tell the component which
|
|
36
|
+
field is the display text and which is the stored value with `item-text` /
|
|
37
|
+
`item-value` (dot-paths or extractor functions). Never pre-map `items` into
|
|
38
|
+
`{ label, value }` objects — matching is hash-based, so component-native
|
|
39
|
+
extraction stays robust. The `v-model` holds the resolved _value_, not the whole
|
|
40
|
+
object.
|
|
41
|
+
|
|
42
|
+
**Single select mapped from domain objects**
|
|
4
43
|
|
|
5
44
|
```vue
|
|
6
45
|
<template>
|
|
7
|
-
<
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
:id="id"
|
|
27
|
-
:allow-writing="allowWriting"
|
|
28
|
-
:append:icon="props['append:icon']"
|
|
29
|
-
:aria-describedby="ariaDescribedby"
|
|
30
|
-
:autocomplete="autocomplete"
|
|
31
|
-
:autofocus="autofocus"
|
|
32
|
-
:clearable="clearable"
|
|
33
|
-
:comma="comma"
|
|
34
|
-
:compact="compact"
|
|
35
|
-
:dependencies="dependencies"
|
|
36
|
-
:deps-debounce-time="depsDebounceTime"
|
|
37
|
-
:disabled="disabled"
|
|
38
|
-
:enforce-coherence="enforceCoherence"
|
|
39
|
-
:filter-by="filterBy"
|
|
40
|
-
:group-by="groupBy"
|
|
41
|
-
:has-errors="hasErrors"
|
|
42
|
-
:header-height="headerHeight"
|
|
43
|
-
:item-height="itemHeight"
|
|
44
|
-
:item-text="<any>itemText"
|
|
45
|
-
:item-value="<any>itemValue"
|
|
46
|
-
:items="items"
|
|
47
|
-
:loading="loading"
|
|
48
|
-
:loading-text="loadingText"
|
|
49
|
-
:max="max"
|
|
50
|
-
:max-selected-labels="maxSelectedLabels"
|
|
51
|
-
:model-value="modelValue"
|
|
52
|
-
:model-value-debounce-time="modelValueDebounceTime"
|
|
53
|
-
:multiple="multiple"
|
|
54
|
-
:name="name"
|
|
55
|
-
:no-data-text="noDataText"
|
|
56
|
-
:placeholder="placeholder"
|
|
57
|
-
:prefill="prefill"
|
|
58
|
-
:prepend:icon="props['prepend:icon']"
|
|
59
|
-
:query-debounce-time="queryDebounceTime"
|
|
60
|
-
:readonly="readonly"
|
|
61
|
-
:required="required"
|
|
62
|
-
:selected-labels-fn="selectedLabelsFn"
|
|
63
|
-
:show-chevron="showChevron"
|
|
64
|
-
:stash="stash"
|
|
65
|
-
:transition-duration="transitionDuration"
|
|
66
|
-
:update-on-animation-frame="updateOnAnimationFrame"
|
|
67
|
-
v-bind="eventListeners"
|
|
68
|
-
>
|
|
69
|
-
<template #append-outer="data"
|
|
70
|
-
><slot name="append-outer" v-bind="data"
|
|
71
|
-
/></template>
|
|
72
|
-
<template #append="data"><slot name="append" v-bind="data" /></template>
|
|
73
|
-
<template #prefix="data"><slot name="prefix" v-bind="data" /></template>
|
|
74
|
-
<template #chevron="data"
|
|
75
|
-
><slot name="chevron" v-bind="data"
|
|
76
|
-
/></template>
|
|
77
|
-
<template #loading="data"
|
|
78
|
-
><slot name="loading" v-bind="data"
|
|
79
|
-
/></template>
|
|
80
|
-
<template #no-data="data"
|
|
81
|
-
><slot name="no-data" v-bind="data"
|
|
82
|
-
/></template>
|
|
83
|
-
<template #option="data"><slot name="option" v-bind="data" /></template>
|
|
84
|
-
<template #group="data"><slot name="group" v-bind="data" /></template>
|
|
85
|
-
<template #options:append="data"
|
|
86
|
-
><slot name="options:append" v-bind="data"
|
|
87
|
-
/></template>
|
|
88
|
-
<template #options:append:outer="data"
|
|
89
|
-
><slot name="options:append:outer" v-bind="data"
|
|
90
|
-
/></template>
|
|
91
|
-
<template #options:prepend="data"
|
|
92
|
-
><slot name="options:prepend" v-bind="data"
|
|
93
|
-
/></template>
|
|
94
|
-
<template #options:prepend:outer="data"
|
|
95
|
-
><slot name="options:prepend:outer" v-bind="data"
|
|
96
|
-
/></template>
|
|
97
|
-
<template #prepend-outer="data"
|
|
98
|
-
><slot name="prepend-outer" v-bind="data"
|
|
99
|
-
/></template>
|
|
100
|
-
<template #prepend="data"
|
|
101
|
-
><slot name="prepend" v-bind="data"
|
|
102
|
-
/></template>
|
|
103
|
-
<template #suffix="data"><slot name="suffix" v-bind="data" /></template>
|
|
104
|
-
</BaseSelect>
|
|
105
|
-
</template>
|
|
106
|
-
</BaseInputContainer>
|
|
46
|
+
<div class="grid max-w-sm gap-3 rounded-[var(--bb-radius)] border p-3">
|
|
47
|
+
<div class="flex items-baseline justify-between gap-2">
|
|
48
|
+
<h3 class="text-sm font-medium">ISSUE-1842</h3>
|
|
49
|
+
<span class="text-xs text-[color:var(--bb-text-muted)]">In progress</span>
|
|
50
|
+
</div>
|
|
51
|
+
<p class="text-xs text-[color:var(--bb-text-muted)]">
|
|
52
|
+
Wire invoice PDF export for the Milan office.
|
|
53
|
+
</p>
|
|
54
|
+
<BbSelect
|
|
55
|
+
v-model="assignee"
|
|
56
|
+
clearable
|
|
57
|
+
compact
|
|
58
|
+
item-text="fullName"
|
|
59
|
+
item-value="id"
|
|
60
|
+
:items="teammates"
|
|
61
|
+
label="Assignee"
|
|
62
|
+
placeholder="Choose a teammate"
|
|
63
|
+
/>
|
|
64
|
+
</div>
|
|
107
65
|
</template>
|
|
66
|
+
<script setup lang="ts">
|
|
67
|
+
import { ref } from 'vue';
|
|
68
|
+
import { BbSelect } from 'bitboss-ui';
|
|
69
|
+
|
|
70
|
+
type Teammate = {
|
|
71
|
+
id: string;
|
|
72
|
+
fullName: string;
|
|
73
|
+
role: string;
|
|
74
|
+
};
|
|
108
75
|
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
allowWriting: true,
|
|
117
|
-
filterBy: () => [],
|
|
118
|
-
prefill: 'focus',
|
|
119
|
-
showChevron: true,
|
|
120
|
-
});
|
|
76
|
+
// Raw domain objects — passed straight to `items`, never pre-mapped.
|
|
77
|
+
const teammates: Teammate[] = [
|
|
78
|
+
{ id: 'ada', fullName: 'Ada Lovelace', role: 'Engineering' },
|
|
79
|
+
{ id: 'grace', fullName: 'Grace Hopper', role: 'Engineering' },
|
|
80
|
+
{ id: 'maggie', fullName: 'Margaret Hamilton', role: 'Flight Systems' },
|
|
81
|
+
{ id: 'katherine', fullName: 'Katherine Johnson', role: 'Mathematics' },
|
|
82
|
+
];
|
|
121
83
|
|
|
122
|
-
|
|
123
|
-
|
|
84
|
+
// The model holds the resolved value (id), not the whole object.
|
|
85
|
+
const assignee = ref<string | null>(null);
|
|
86
|
+
</script>
|
|
87
|
+
```
|
|
124
88
|
|
|
125
|
-
|
|
126
|
-
|
|
89
|
+
Value-identity rules (shared with every items-driven component — see the
|
|
90
|
+
Options and Items playbook):
|
|
91
|
+
|
|
92
|
+
- For primitive `items` (`string[]` / `number[]`) omit both mapping props — the
|
|
93
|
+
value is the primitive itself. For object items always set both: the defaults
|
|
94
|
+
are the whole item as value and `JSON.stringify(item)` as text.
|
|
95
|
+
- Matching compares **value hashes** (deep structural equality, not reference
|
|
96
|
+
identity), so object values survive refetches — but prefer primitive ids:
|
|
97
|
+
stable, unique, cheap to submit.
|
|
98
|
+
- Options resolving to a **duplicate value are silently dropped** (first wins).
|
|
99
|
+
- Per-option gating goes through `selectable`: a boolean (`false` disables every
|
|
100
|
+
option) or a predicate `(item) => boolean` — rejected options render disabled
|
|
101
|
+
and keyboard navigation skips them (e.g. `:selectable="(u) => u.active"`). A
|
|
102
|
+
`disabled` field on the item object itself is inert domain data — feed it to
|
|
103
|
+
the predicate. Alternatives: filter unavailable choices out of `items`, cap
|
|
104
|
+
with `max`, or disable the whole control with `disabled`.
|
|
105
|
+
|
|
106
|
+
### The field around the control
|
|
107
|
+
|
|
108
|
+
`BbSelect` is a complete form field. Everything here is declarative — no custom
|
|
109
|
+
markup needed:
|
|
110
|
+
|
|
111
|
+
- **Label**: `label` (required), `hide-label`, `label-position`
|
|
112
|
+
(`left`/`center`/`right`), and `label-mode` — `outside` (the default via
|
|
113
|
+
global config `defaultInputLabelMode`), `floating`, or `inside`. `reverse`
|
|
114
|
+
swaps the order of label and control.
|
|
115
|
+
- **Guidance**: `description` renders always-visible helper text linked via
|
|
116
|
+
`aria-describedby`; `hint` shows contextual guidance while the field is
|
|
117
|
+
active (add `persistent-hint` to keep it visible).
|
|
118
|
+
- **Validation**: `has-errors` switches error styling; `errors` (string or
|
|
119
|
+
array) renders the messages, associated with the field for assistive tech.
|
|
120
|
+
`warnings` (string or array) is the amber counterpart of `errors` — the same
|
|
121
|
+
messages rendered below the field in their own `aria-live="polite"` region —
|
|
122
|
+
and referenced from `aria-describedby` while displayed — in
|
|
123
|
+
amber (`--bb-warn`), with a warning icon in the append stack, for a
|
|
124
|
+
valid-but-noteworthy selection; a non-empty `warnings` implies the warning
|
|
125
|
+
state, so `has-warning` just forces that chrome without a message. Unlike
|
|
126
|
+
`errors` it sets no `aria-invalid` — a soft "needs a second look" state. When
|
|
127
|
+
both are set the error state wins and the warning messages are suppressed, so
|
|
128
|
+
the field never shows amber while it has an error.
|
|
129
|
+
- **Form participation**: `name` renders hidden inputs carrying the selection
|
|
130
|
+
(one per value; non-string values are JSON-stringified), so the select posts
|
|
131
|
+
in a plain HTML form; `required` adds a visually-hidden sentinel input so
|
|
132
|
+
native constraint validation fires. `autocomplete` / `autofocus` forward to
|
|
133
|
+
the control.
|
|
134
|
+
- **Affixes**: `prepend:icon` / `append:icon` place icons in the control —
|
|
135
|
+
`append:icon` replaces the default chevron (there is no `#chevron` slot).
|
|
136
|
+
- **Value display**: `placeholder` shows when a _single-mode_ select is empty.
|
|
137
|
+
In multiple mode the placeholder is never rendered — use `description` /
|
|
138
|
+
`hint` for guidance instead.
|
|
139
|
+
|
|
140
|
+
**A complete form field**
|
|
127
141
|
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
142
|
+
```vue
|
|
143
|
+
<div class="max-w-sm">
|
|
144
|
+
<BbSelect
|
|
145
|
+
v-model="state.plan"
|
|
146
|
+
label="Plan"
|
|
147
|
+
description="You can change plan at any time."
|
|
148
|
+
hint="Yearly billing saves 20%"
|
|
149
|
+
placeholder="Choose a plan"
|
|
150
|
+
prepend:icon="lucide:credit-card"
|
|
151
|
+
required
|
|
152
|
+
clearable
|
|
153
|
+
:items="['Starter', 'Growth', 'Enterprise']"
|
|
154
|
+
/>
|
|
155
|
+
</div>
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
**Error state**
|
|
159
|
+
|
|
160
|
+
```vue
|
|
161
|
+
<div class="max-w-sm">
|
|
162
|
+
<BbSelect
|
|
163
|
+
v-model="state.country"
|
|
164
|
+
label="Country"
|
|
165
|
+
placeholder="Required for invoicing"
|
|
166
|
+
has-errors
|
|
167
|
+
errors="Pick a country to continue"
|
|
168
|
+
:items="['Italy', 'Germany', 'Portugal']"
|
|
169
|
+
/>
|
|
170
|
+
</div>
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
### Multiple selection and how it displays
|
|
174
|
+
|
|
175
|
+
Add `multiple` for multi-select; the model becomes an array and **must be seeded
|
|
176
|
+
as one** (`ref<string[]>([])`) — a non-array model throws at setup. Cap the
|
|
177
|
+
count with `max`: at the cap, unselected options auto-disable while selected
|
|
178
|
+
options never do, so the user can always deselect.
|
|
179
|
+
|
|
180
|
+
Selected values render as removable chips inside the control. When they no
|
|
181
|
+
longer fit the row, it collapses into a count summary ("N items selected", from
|
|
182
|
+
the active locale). You can steer that display:
|
|
183
|
+
|
|
184
|
+
- `max-selected-labels` collapses by **count** instead of by overflow width.
|
|
185
|
+
- `selected-labels-fn` customises the summary text (`(count) => string`).
|
|
186
|
+
- `comma` renders a plain comma-separated string instead of chips — values can
|
|
187
|
+
then only be deselected from the panel.
|
|
188
|
+
- Under `disabled` / `readonly`, chips become non-removable badges.
|
|
189
|
+
|
|
190
|
+
`clearable` shows a clear affix once there is a value; clearing resets the
|
|
191
|
+
model to `[]` (or `null` in single mode).
|
|
192
|
+
|
|
193
|
+
**Multi-select with a maximum and collapsed labels**
|
|
194
|
+
|
|
195
|
+
```vue
|
|
196
|
+
<template>
|
|
197
|
+
<div class="grid max-w-sm gap-3 rounded-[var(--bb-radius)] border p-3">
|
|
198
|
+
<div>
|
|
199
|
+
<h3 class="text-sm font-medium">Warehouse coverage</h3>
|
|
200
|
+
<p class="text-xs text-[color:var(--bb-text-muted)]">
|
|
201
|
+
Cap at 3 hubs for the pilot route.
|
|
202
|
+
</p>
|
|
203
|
+
</div>
|
|
204
|
+
<BbSelect
|
|
205
|
+
v-model="cities"
|
|
206
|
+
clearable
|
|
207
|
+
compact
|
|
208
|
+
hint="Pick up to 3 cities"
|
|
209
|
+
item-text="label"
|
|
210
|
+
item-value="value"
|
|
211
|
+
:items="options"
|
|
212
|
+
label="Cities"
|
|
213
|
+
:max="3"
|
|
214
|
+
:max-selected-labels="2"
|
|
215
|
+
multiple
|
|
216
|
+
/>
|
|
217
|
+
</div>
|
|
218
|
+
</template>
|
|
219
|
+
<script setup lang="ts">
|
|
220
|
+
import { ref } from 'vue';
|
|
221
|
+
import { BbSelect } from 'bitboss-ui';
|
|
222
|
+
|
|
223
|
+
const options = [
|
|
224
|
+
{ label: 'Amsterdam', value: 'ams' },
|
|
225
|
+
{ label: 'Berlin', value: 'ber' },
|
|
226
|
+
{ label: 'Copenhagen', value: 'cph' },
|
|
227
|
+
{ label: 'Lisbon', value: 'lis' },
|
|
228
|
+
{ label: 'Milan', value: 'mil' },
|
|
229
|
+
];
|
|
230
|
+
|
|
231
|
+
// `multiple` requires the model to be an array from the start.
|
|
232
|
+
const cities = ref<string[]>(['ber', 'mil']);
|
|
144
233
|
</script>
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
**Comma display for dense forms**
|
|
145
237
|
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
238
|
+
```vue
|
|
239
|
+
<template>
|
|
240
|
+
<div class="grid max-w-sm gap-3 rounded-[var(--bb-radius)] border p-3">
|
|
241
|
+
<div>
|
|
242
|
+
<h3 class="text-sm font-medium">Email digests</h3>
|
|
243
|
+
<p class="text-xs text-[color:var(--bb-text-muted)]">
|
|
244
|
+
Who gets the Monday summary?
|
|
245
|
+
</p>
|
|
246
|
+
</div>
|
|
247
|
+
<BbSelect
|
|
248
|
+
v-model="recipients"
|
|
249
|
+
comma
|
|
250
|
+
compact
|
|
251
|
+
item-text="name"
|
|
252
|
+
item-value="id"
|
|
253
|
+
:items="team"
|
|
254
|
+
label="Weekly digest recipients"
|
|
255
|
+
multiple
|
|
256
|
+
/>
|
|
257
|
+
</div>
|
|
258
|
+
</template>
|
|
259
|
+
<script setup lang="ts">
|
|
260
|
+
import { ref } from 'vue';
|
|
261
|
+
import { BbSelect } from 'bitboss-ui';
|
|
262
|
+
|
|
263
|
+
const team = [
|
|
264
|
+
{ id: 'ada', name: 'Ada Lovelace' },
|
|
265
|
+
{ id: 'grace', name: 'Grace Hopper' },
|
|
266
|
+
{ id: 'alan', name: 'Alan Turing' },
|
|
267
|
+
{ id: 'maggie', name: 'Margaret Hamilton' },
|
|
268
|
+
];
|
|
269
|
+
|
|
270
|
+
// `comma` renders the selection as plain comma-separated text: values can only
|
|
271
|
+
// be deselected from the panel, not removed from the control itself.
|
|
272
|
+
const recipients = ref<string[]>(['ada', 'grace']);
|
|
273
|
+
</script>
|
|
149
274
|
```
|
|
150
275
|
|
|
151
|
-
|
|
276
|
+
### Panel actions: header, footer and select-all
|
|
152
277
|
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
278
|
+
The `#header` and `#footer` slots pin content above the search field and below
|
|
279
|
+
the options list — the same markup renders in the desktop popover and the
|
|
280
|
+
mobile adaptive sheet. Both receive `{ close, clear, focus, query,
|
|
281
|
+
selectedOptions }`: `close()` closes the panel, `clear()` empties the
|
|
282
|
+
selection, `focus()` refocuses the search input, and `selectedOptions` are the
|
|
283
|
+
resolved selected options (`.text` / `.value` / raw `.item`).
|
|
284
|
+
|
|
285
|
+
Select-all is not built in — it is a one-liner in a panel slot, because the
|
|
286
|
+
v-model is yours:
|
|
287
|
+
|
|
288
|
+
**Select all + done in the footer**
|
|
289
|
+
|
|
290
|
+
```vue
|
|
291
|
+
<template>
|
|
292
|
+
<div class="grid max-w-sm gap-3 rounded-[var(--bb-radius)] border p-3">
|
|
293
|
+
<div>
|
|
294
|
+
<h3 class="text-sm font-medium">Incident alerts</h3>
|
|
295
|
+
<p class="text-xs text-[color:var(--bb-text-muted)]">
|
|
296
|
+
Where should paging go when severity is high?
|
|
297
|
+
</p>
|
|
298
|
+
</div>
|
|
299
|
+
<BbSelect
|
|
300
|
+
v-model="channels"
|
|
301
|
+
compact
|
|
302
|
+
item-text="label"
|
|
303
|
+
item-value="value"
|
|
304
|
+
:items="options"
|
|
305
|
+
label="Notify via"
|
|
306
|
+
:max-selected-labels="2"
|
|
307
|
+
multiple
|
|
308
|
+
:selected-labels-fn="(count) => `${count} channels`"
|
|
309
|
+
>
|
|
310
|
+
<template #footer="{ close, clear, selectedOptions }">
|
|
311
|
+
<div class="flex w-full items-center gap-1.5">
|
|
312
|
+
<BbButton
|
|
313
|
+
size="xs"
|
|
314
|
+
variant="ghost"
|
|
315
|
+
@click="channels = options.map((option) => option.value)"
|
|
316
|
+
>
|
|
317
|
+
Select all
|
|
318
|
+
</BbButton>
|
|
319
|
+
<BbButton size="xs" variant="ghost" @click="clear">Clear</BbButton>
|
|
320
|
+
<BbButton class="ml-auto" size="xs" variant="primary" @click="close">
|
|
321
|
+
Done ({{ selectedOptions.length }})
|
|
322
|
+
</BbButton>
|
|
323
|
+
</div>
|
|
324
|
+
</template>
|
|
325
|
+
</BbSelect>
|
|
326
|
+
</div>
|
|
327
|
+
</template>
|
|
328
|
+
<script setup lang="ts">
|
|
329
|
+
import { ref } from 'vue';
|
|
330
|
+
import { BbSelect, BbButton } from 'bitboss-ui';
|
|
331
|
+
|
|
332
|
+
const options = [
|
|
333
|
+
{ label: 'Email', value: 'email' },
|
|
334
|
+
{ label: 'SMS', value: 'sms' },
|
|
335
|
+
{ label: 'Push notification', value: 'push' },
|
|
336
|
+
{ label: 'Slack', value: 'slack' },
|
|
337
|
+
];
|
|
338
|
+
|
|
339
|
+
const channels = ref<string[]>(['email']);
|
|
340
|
+
</script>
|
|
341
|
+
```
|
|
342
|
+
|
|
343
|
+
The `#header` slot is the mirror image: pin context above the search field — a
|
|
344
|
+
live summary of the selection, computed from your own model since the v-model
|
|
345
|
+
is yours:
|
|
346
|
+
|
|
347
|
+
**A pinned header with a live summary**
|
|
348
|
+
|
|
349
|
+
```vue
|
|
350
|
+
<template>
|
|
351
|
+
<div class="grid max-w-sm gap-3 rounded-[var(--bb-radius)] border p-3">
|
|
352
|
+
<div>
|
|
353
|
+
<h3 class="text-sm font-medium">Lisbon half-day</h3>
|
|
354
|
+
<p class="text-xs text-[color:var(--bb-text-muted)]">
|
|
355
|
+
Build a route under about four hours.
|
|
356
|
+
</p>
|
|
357
|
+
</div>
|
|
358
|
+
<BbSelect
|
|
359
|
+
v-model="stops"
|
|
360
|
+
compact
|
|
361
|
+
hint="A half-day tour fits roughly 4 hours"
|
|
362
|
+
item-text="name"
|
|
363
|
+
item-value="id"
|
|
364
|
+
:items="catalog"
|
|
365
|
+
label="Tour stops"
|
|
366
|
+
:max-selected-labels="2"
|
|
367
|
+
multiple
|
|
368
|
+
>
|
|
369
|
+
<template #header="{ clear }">
|
|
370
|
+
<div
|
|
371
|
+
class="flex w-full items-center justify-between gap-2 px-1 text-xs text-[color:var(--bb-text-muted)]"
|
|
372
|
+
>
|
|
373
|
+
<span>{{ summary }}</span>
|
|
374
|
+
<BbButton
|
|
375
|
+
:disabled="!stops.length"
|
|
376
|
+
size="xs"
|
|
377
|
+
variant="ghost"
|
|
378
|
+
@click="clear"
|
|
379
|
+
>
|
|
380
|
+
Reset
|
|
381
|
+
</BbButton>
|
|
382
|
+
</div>
|
|
383
|
+
</template>
|
|
384
|
+
</BbSelect>
|
|
385
|
+
</div>
|
|
386
|
+
</template>
|
|
387
|
+
<script setup lang="ts">
|
|
388
|
+
import { computed, ref } from 'vue';
|
|
389
|
+
import { BbSelect, BbButton } from 'bitboss-ui';
|
|
390
|
+
|
|
391
|
+
type Stop = { id: string; name: string; durationMin: number };
|
|
392
|
+
|
|
393
|
+
const catalog: Stop[] = [
|
|
394
|
+
{ id: 'belem', name: 'Belém Tower', durationMin: 45 },
|
|
395
|
+
{ id: 'jeronimos', name: 'Jerónimos Monastery', durationMin: 60 },
|
|
396
|
+
{ id: 'alfama', name: 'Alfama walking tour', durationMin: 90 },
|
|
397
|
+
{ id: 'tram28', name: 'Tram 28 ride', durationMin: 40 },
|
|
398
|
+
{ id: 'oceanario', name: 'Oceanário aquarium', durationMin: 120 },
|
|
399
|
+
{ id: 'lxfactory', name: 'LX Factory market', durationMin: 60 },
|
|
400
|
+
];
|
|
401
|
+
|
|
402
|
+
const stops = ref<string[]>(['belem', 'alfama']);
|
|
403
|
+
|
|
404
|
+
// The panel slots also expose `selectedOptions`, but the v-model is ours —
|
|
405
|
+
// deriving the summary from it keeps the header logic on plain typed data.
|
|
406
|
+
const summary = computed(() => {
|
|
407
|
+
if (!stops.value.length) return 'No stops yet';
|
|
408
|
+
const total = stops.value.reduce(
|
|
409
|
+
(sum, id) =>
|
|
410
|
+
sum + (catalog.find((stop) => stop.id === id)?.durationMin ?? 0),
|
|
411
|
+
0
|
|
412
|
+
);
|
|
413
|
+
const hours = Math.floor(total / 60);
|
|
414
|
+
const minutes = total % 60;
|
|
415
|
+
return `${stops.value.length} stops · ~${hours}h${minutes ? ` ${minutes}m` : ''}`;
|
|
416
|
+
});
|
|
417
|
+
</script>
|
|
418
|
+
```
|
|
419
|
+
|
|
420
|
+
### Search and filtering semantics
|
|
421
|
+
|
|
422
|
+
The panel carries a search field (role `searchbox`). How typing filters depends
|
|
423
|
+
on your setup:
|
|
424
|
+
|
|
425
|
+
- **Array `items`**: typing filters locally — a case-insensitive **substring**
|
|
426
|
+
match against each option's display text.
|
|
427
|
+
- **`filter-by: ['path', ...]`**: the listed item paths are searched **instead
|
|
428
|
+
of** the display text (no fallback union with the text). Every path must
|
|
429
|
+
exist on every item, or matching throws. Use it to also match a city by its
|
|
430
|
+
country, a member by email.
|
|
431
|
+
- **Provider `items`**: the provider re-runs with the query (next section) —
|
|
432
|
+
and the local text filter **still applies on top of the response**. Results
|
|
433
|
+
whose display text (or `filter-by` paths) don't contain the query substring
|
|
434
|
+
are hidden, so fuzzy or synonym-based server matches can vanish. Keep server
|
|
435
|
+
search substring-compatible, or point `filter-by` at a field the server
|
|
436
|
+
guarantees to match.
|
|
437
|
+
- **Single-mode exception**: when the query equals the selected option's text
|
|
438
|
+
(as right after picking), the list shows unfiltered.
|
|
439
|
+
- **`disable-writing`** removes the search field entirely (`true`, or
|
|
440
|
+
`'mobile'` / `'desktop'` to remove it on one platform only) — this is also
|
|
441
|
+
the supported way to disable filtering; there is no "falsy `filter-by`"
|
|
442
|
+
escape hatch.
|
|
443
|
+
|
|
444
|
+
**Match on fields other than the display text**
|
|
445
|
+
|
|
446
|
+
```vue
|
|
447
|
+
<template>
|
|
448
|
+
<div class="grid max-w-sm gap-3 rounded-[var(--bb-radius)] border p-3">
|
|
449
|
+
<div>
|
|
450
|
+
<h3 class="text-sm font-medium">Shipping destination</h3>
|
|
451
|
+
<p class="text-xs text-[color:var(--bb-text-muted)]">
|
|
452
|
+
Search by city or country name.
|
|
453
|
+
</p>
|
|
454
|
+
</div>
|
|
455
|
+
<BbSelect
|
|
456
|
+
v-model="city"
|
|
457
|
+
compact
|
|
458
|
+
:filter-by="['label', 'country']"
|
|
459
|
+
item-text="label"
|
|
460
|
+
item-value="id"
|
|
461
|
+
:items="cities"
|
|
462
|
+
label="City"
|
|
463
|
+
placeholder="Search city or country"
|
|
464
|
+
/>
|
|
465
|
+
</div>
|
|
466
|
+
</template>
|
|
467
|
+
<script setup lang="ts">
|
|
468
|
+
import { ref } from 'vue';
|
|
469
|
+
import { BbSelect } from 'bitboss-ui';
|
|
470
|
+
|
|
471
|
+
type City = { label: string; country: string; id: string };
|
|
472
|
+
|
|
473
|
+
// `filter-by` searches these item paths instead of the display text, so a
|
|
474
|
+
// city matches by its country too — every listed path must exist on every item.
|
|
475
|
+
const cities: City[] = [
|
|
476
|
+
{ label: 'Milan', country: 'Italy', id: 'mil' },
|
|
477
|
+
{ label: 'Rome', country: 'Italy', id: 'rom' },
|
|
478
|
+
{ label: 'Lisbon', country: 'Portugal', id: 'lis' },
|
|
479
|
+
{ label: 'Porto', country: 'Portugal', id: 'por' },
|
|
480
|
+
];
|
|
481
|
+
|
|
482
|
+
const city = ref<string | null>(null);
|
|
483
|
+
</script>
|
|
484
|
+
```
|
|
485
|
+
|
|
486
|
+
### Fetch options with a provider
|
|
487
|
+
|
|
488
|
+
When options come from a backend, pass a **function** to `items` instead of an
|
|
489
|
+
array. It receives `(query, prefill, modelValue)` and returns `T[]` or a
|
|
490
|
+
`Promise<T[]>` — the full call matrix lives in the Fetch Items playbook. The
|
|
491
|
+
short version:
|
|
492
|
+
|
|
493
|
+
- `prefill === false` means exactly one thing: **the user typed**. Search then.
|
|
494
|
+
- Every component-initiated call (first load, dependency change, external model
|
|
495
|
+
update) passes `prefill === true` and expects the current selection to stay
|
|
496
|
+
resolvable in the response — return the selected items (by id) so chosen
|
|
497
|
+
values are never orphaned.
|
|
498
|
+
- `modelValue` is your v-model as-is (array in multiple mode, the raw model
|
|
499
|
+
value — possibly `null` — otherwise); the prop declares it `any`, so annotate
|
|
500
|
+
it `any` or your own model type.
|
|
501
|
+
|
|
502
|
+
**Async, debounced member search**
|
|
503
|
+
|
|
504
|
+
```vue
|
|
505
|
+
<template>
|
|
506
|
+
<div class="grid max-w-sm gap-3 rounded-[var(--bb-radius)] border p-3">
|
|
507
|
+
<div>
|
|
508
|
+
<h3 class="text-sm font-medium">Pull request reviewers</h3>
|
|
509
|
+
<p class="text-xs text-[color:var(--bb-text-muted)]">
|
|
510
|
+
Search the directory; picks stay pinned.
|
|
511
|
+
</p>
|
|
512
|
+
</div>
|
|
513
|
+
<BbSelect
|
|
514
|
+
v-model="reviewers"
|
|
515
|
+
clearable
|
|
516
|
+
compact
|
|
517
|
+
hint="Type a name to search"
|
|
518
|
+
item-text="name"
|
|
519
|
+
item-value="id"
|
|
520
|
+
:items="searchMembers"
|
|
521
|
+
label="Reviewers"
|
|
522
|
+
loading-text="Searching…"
|
|
523
|
+
multiple
|
|
524
|
+
no-data-text="No members match your search"
|
|
525
|
+
persistent-hint
|
|
526
|
+
:query-debounce-time="300"
|
|
527
|
+
stash
|
|
528
|
+
/>
|
|
529
|
+
</div>
|
|
530
|
+
</template>
|
|
531
|
+
<script setup lang="ts">
|
|
532
|
+
import { ref } from 'vue';
|
|
533
|
+
import { BbSelect } from 'bitboss-ui';
|
|
308
534
|
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
labelPosition?: 'left' | 'center' | 'right';
|
|
313
|
-
|
|
314
|
-
/**
|
|
315
|
-
* Sets the component in a loading state, usually triggering some visual styles.
|
|
316
|
-
*/
|
|
317
|
-
loading?: boolean;
|
|
318
|
-
|
|
319
|
-
/**
|
|
320
|
-
* String displayed while items are being loaded.
|
|
321
|
-
*/
|
|
322
|
-
loadingText?: string;
|
|
323
|
-
|
|
324
|
-
/**
|
|
325
|
-
* Maximum number of selectable items when the multiple flag is set.
|
|
326
|
-
*/
|
|
327
|
-
max?: number;
|
|
328
|
-
|
|
329
|
-
/**
|
|
330
|
-
* Maximum number of labels shown before collapsing to a count summary.
|
|
331
|
-
*/
|
|
332
|
-
maxSelectedLabels?: number;
|
|
333
|
-
|
|
334
|
-
/**
|
|
335
|
-
* Used by v-model. Can be any serializable type.
|
|
336
|
-
*/
|
|
337
|
-
modelValue: any;
|
|
338
|
-
|
|
339
|
-
/**
|
|
340
|
-
* Timeout used to debounce response to changes to modelValue.
|
|
341
|
-
*/
|
|
342
|
-
modelValueDebounceTime?: number;
|
|
343
|
-
|
|
344
|
-
/**
|
|
345
|
-
* Allows the selection of multiple items.
|
|
346
|
-
*/
|
|
347
|
-
multiple?: boolean;
|
|
348
|
-
|
|
349
|
-
/**
|
|
350
|
-
* Defines the name of the input.
|
|
351
|
-
*/
|
|
352
|
-
name?: InputHTMLAttributes['name'];
|
|
353
|
-
|
|
354
|
-
/**
|
|
355
|
-
* String displayed when there are no items to display.
|
|
356
|
-
*/
|
|
357
|
-
noDataText?: string;
|
|
358
|
-
|
|
359
|
-
/**
|
|
360
|
-
* Keeps the hint displayed.
|
|
361
|
-
*/
|
|
362
|
-
persistentHint?: boolean;
|
|
363
|
-
|
|
364
|
-
/**
|
|
365
|
-
* String displayed when there's no data.
|
|
366
|
-
*/
|
|
367
|
-
placeholder?: InputHTMLAttributes['placeholder'];
|
|
368
|
-
|
|
369
|
-
/**
|
|
370
|
-
* Defines the prefill strategy for the input. By default the input will prefill
|
|
371
|
-
* on focus. It can also always prefill with `true` and only prefill on search with `false`.
|
|
372
|
-
*
|
|
373
|
-
* @defaultValue `'focus'`
|
|
374
|
-
*/
|
|
375
|
-
prefill?: boolean | 'focus';
|
|
376
|
-
|
|
377
|
-
/**
|
|
378
|
-
* Name of the icon to be added at the start of the input.
|
|
379
|
-
*/
|
|
380
|
-
// eslint-disable-next-line vue/prop-name-casing
|
|
381
|
-
'prepend:icon'?: IconType;
|
|
382
|
-
|
|
383
|
-
/**
|
|
384
|
-
* Sets the input as required.
|
|
385
|
-
*/
|
|
386
|
-
required?: boolean;
|
|
387
|
-
|
|
388
|
-
/**
|
|
389
|
-
* Time to wait when the user stops writing in the input before querying data.
|
|
390
|
-
*/
|
|
391
|
-
queryDebounceTime?: number;
|
|
392
|
-
|
|
393
|
-
/**
|
|
394
|
-
* Sets the input in a readonly state.
|
|
395
|
-
*/
|
|
396
|
-
readonly?: boolean;
|
|
397
|
-
|
|
398
|
-
/**
|
|
399
|
-
* Reverses the layout. Applicable in every direction the order of the label and
|
|
400
|
-
* the input is swapped.
|
|
401
|
-
*/
|
|
402
|
-
reverse?: boolean;
|
|
403
|
-
|
|
404
|
-
/**
|
|
405
|
-
* Function that returns a string to be displayed when the number of selected labels
|
|
406
|
-
* is greater than `maxSelectedLabels`.
|
|
407
|
-
*/
|
|
408
|
-
selectedLabelsFn?: (count: number) => string;
|
|
409
|
-
|
|
410
|
-
/**
|
|
411
|
-
* If true, the chevron will be shown.
|
|
412
|
-
*
|
|
413
|
-
* @defaultValue `true`
|
|
414
|
-
*/
|
|
415
|
-
showChevron?: boolean;
|
|
416
|
-
|
|
417
|
-
/**
|
|
418
|
-
* Adds a stash to accumulate selected values across searches.
|
|
419
|
-
*/
|
|
420
|
-
stash?: boolean;
|
|
421
|
-
|
|
422
|
-
/**
|
|
423
|
-
* How long the transition has to last in milliseconds.
|
|
424
|
-
*/
|
|
425
|
-
transitionDuration?: number;
|
|
426
|
-
|
|
427
|
-
/**
|
|
428
|
-
* Pass `true` if the dropdown is not updating following movement in the UI, like in modals.
|
|
429
|
-
* Very expensive so use with care.
|
|
430
|
-
*/
|
|
431
|
-
updateOnAnimationFrame?: boolean;
|
|
535
|
+
type Member = {
|
|
536
|
+
id: string;
|
|
537
|
+
name: string;
|
|
432
538
|
};
|
|
433
539
|
|
|
434
|
-
|
|
435
|
-
|
|
540
|
+
// Stand-in for a real API. In a product this is `api.members.search(...)`.
|
|
541
|
+
const directory: Member[] = [
|
|
542
|
+
{ id: 'ada', name: 'Ada Lovelace' },
|
|
543
|
+
{ id: 'alan', name: 'Alan Turing' },
|
|
544
|
+
{ id: 'grace', name: 'Grace Hopper' },
|
|
545
|
+
{ id: 'katherine', name: 'Katherine Johnson' },
|
|
546
|
+
{ id: 'ken', name: 'Ken Thompson' },
|
|
547
|
+
{ id: 'maggie', name: 'Margaret Hamilton' },
|
|
548
|
+
];
|
|
549
|
+
|
|
550
|
+
const fetchFromApi = (predicate: (member: Member) => boolean) =>
|
|
551
|
+
new Promise<Member[]>((resolve) => {
|
|
552
|
+
setTimeout(() => resolve(directory.filter(predicate)), 250);
|
|
553
|
+
});
|
|
554
|
+
|
|
555
|
+
// With `stash`, picked options stay resolvable across later searches, so the
|
|
556
|
+
// provider only ever answers the current query — no need to merge the selected
|
|
557
|
+
// members back into every response.
|
|
558
|
+
const searchMembers = (
|
|
559
|
+
query: string,
|
|
560
|
+
_prefill: boolean,
|
|
561
|
+
_modelValue: string[]
|
|
562
|
+
): Promise<Member[]> => {
|
|
563
|
+
const q = query.trim().toLowerCase();
|
|
564
|
+
if (!q) return Promise.resolve([]);
|
|
565
|
+
return fetchFromApi((member) => member.name.toLowerCase().includes(q));
|
|
566
|
+
};
|
|
436
567
|
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
568
|
+
const reviewers = ref<string[]>([]);
|
|
569
|
+
</script>
|
|
570
|
+
```
|
|
571
|
+
|
|
572
|
+
```ts
|
|
573
|
+
const searchMembers = async (
|
|
574
|
+
query: string,
|
|
575
|
+
prefill: boolean,
|
|
576
|
+
modelValue: string[]
|
|
577
|
+
): Promise<Member[]> => {
|
|
578
|
+
// Component-initiated: keep the current selection resolvable.
|
|
579
|
+
if (prefill && modelValue.length) {
|
|
580
|
+
return api.members.byIds(modelValue);
|
|
581
|
+
}
|
|
582
|
+
if (!query.trim()) return []; // project-defined idle behavior
|
|
583
|
+
return api.members.search({ query });
|
|
443
584
|
};
|
|
585
|
+
```
|
|
586
|
+
|
|
587
|
+
Runtime guarantees you should not re-implement:
|
|
588
|
+
|
|
589
|
+
- **Debouncing**: typing is debounced by `query-debounce-time` (default 500ms);
|
|
590
|
+
dependency reloads by `deps-debounce-time` (default 0); external model-change
|
|
591
|
+
reloads by `model-value-debounce-time` (default 0).
|
|
592
|
+
- **Race protection**: out-of-order responses are discarded — only the latest
|
|
593
|
+
request writes items.
|
|
594
|
+
- **Loading**: in-flight requests set the loading state automatically — the
|
|
595
|
+
`loading` prop is only for _external_ pending state (e.g. the parent form).
|
|
596
|
+
- **Errors**: a rejected provider is logged (`console.error`) and the previous
|
|
597
|
+
items are kept; surface failures yourself (e.g. `useToast`) if the user must
|
|
598
|
+
know.
|
|
599
|
+
- **Panel states**: `loading-text` / `no-data-text` (locale defaults
|
|
600
|
+
"Loading..." / "No data to display") or the `#loading` / `#no-data` slots —
|
|
601
|
+
both receive `{ query }`, `#no-data` also a `focus()` callback.
|
|
602
|
+
|
|
603
|
+
Enable `stash` to accumulate picked options across searches: selected values
|
|
604
|
+
stay resolvable (chips keep their text, coherence keeps passing) even when
|
|
605
|
+
later responses don't include them — no need to merge them into every response.
|
|
606
|
+
|
|
607
|
+
### Laziness and prefill
|
|
608
|
+
|
|
609
|
+
`prefill` controls **when the first load happens**:
|
|
610
|
+
|
|
611
|
+
- `'interaction'` (default) — on the first open.
|
|
612
|
+
- `true` — immediately on mount, and during SSR (`onServerPrefetch`), so the
|
|
613
|
+
panel is warm on hydration.
|
|
614
|
+
- `false` — **search-first**: nothing loads until the user types. Opening is not
|
|
615
|
+
a search, so the panel opens empty and shows a _"search to begin"_ hint until
|
|
616
|
+
the first query. Use it when the result set is too big or too costly to browse
|
|
617
|
+
and the query is the only sensible entry point.
|
|
618
|
+
|
|
619
|
+
When the model already has a value, `BbSelect` upgrades to immediate prefill
|
|
620
|
+
regardless of the setting, so the selection can render its text right away — so
|
|
621
|
+
`false` never strands a seeded value. **Array `items` are never lazy either** —
|
|
622
|
+
there is no request to defer, so they resolve on mount whatever `prefill` says.
|
|
623
|
+
|
|
624
|
+
Search-first also needs a search field to exist, so `disable-writing` (which
|
|
625
|
+
hides it) falls back to loading on open — otherwise the user would face an empty
|
|
626
|
+
panel with no way to fill it.
|
|
627
|
+
|
|
628
|
+
That upgrade reads "has a value" as "is not empty", and `null` counts as
|
|
629
|
+
**empty** — which is the one case where you must ask for the load yourself (see
|
|
630
|
+
the next section).
|
|
631
|
+
|
|
632
|
+
Laziness also gates coherence: an untouched `prefill: 'interaction'` select — or
|
|
633
|
+
an un-searched `prefill: false` one — with a **provider** and an **empty** model
|
|
634
|
+
ignores `dependencies` and external model changes until its first load. Don't
|
|
635
|
+
"fix" the quiet period with eager watchers: there is nothing on screen to keep
|
|
636
|
+
coherent yet, and the first load reads the current dependencies anyway. The user's
|
|
637
|
+
first search counts as that load, so a search-first select tracks `dependencies`
|
|
638
|
+
from then on.
|
|
639
|
+
|
|
640
|
+
### An "All" / "Any" option (`null` as a real value)
|
|
641
|
+
|
|
642
|
+
Distinct from the [select-all footer button](#panel-actions-header-footer-and-select-all)
|
|
643
|
+
above: that fills a `multiple` array with every option. This is a **single**
|
|
644
|
+
select where one option means _"everything"_ — the "no filter" row at the top of
|
|
645
|
+
a location or status filter.
|
|
646
|
+
|
|
647
|
+
Model it as a real option whose value is `null`, returned by your provider (or
|
|
648
|
+
present in your array) like any other. It resolves and renders as the selection.
|
|
649
|
+
|
|
650
|
+
**The one requirement: with a provider, set `prefill: true`.** `null` is also the
|
|
651
|
+
value the library reads as _nothing selected_, so the automatic
|
|
652
|
+
model-has-a-value upgrade does **not** fire for it. Nothing loads, there is no
|
|
653
|
+
text to show, and the field falls back to the **placeholder** — greyed, and
|
|
654
|
+
indistinguishable from an empty select, while your model holds a real choice.
|
|
655
|
+
The library cannot tell that `null` means "All" in your app without loading the
|
|
656
|
+
options to look, so you have to say so:
|
|
657
|
+
|
|
658
|
+
**An 'All locations' filter (provider + prefill)**
|
|
444
659
|
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
660
|
+
```vue
|
|
661
|
+
<template>
|
|
662
|
+
<div class="grid max-w-sm gap-3 rounded-[var(--bb-radius)] border p-3">
|
|
663
|
+
<div>
|
|
664
|
+
<h3 class="text-sm font-medium">Invoice filters</h3>
|
|
665
|
+
<p class="text-xs text-[color:var(--bb-text-muted)]">
|
|
666
|
+
Office location, or every office.
|
|
667
|
+
</p>
|
|
668
|
+
</div>
|
|
669
|
+
<BbSelect
|
|
670
|
+
v-model="location"
|
|
671
|
+
compact
|
|
672
|
+
item-text="label"
|
|
673
|
+
item-value="value"
|
|
674
|
+
:items="loadLocations"
|
|
675
|
+
label="Location"
|
|
676
|
+
placeholder="Select location…"
|
|
677
|
+
prefill
|
|
678
|
+
/>
|
|
679
|
+
<p class="text-xs text-[color:var(--bb-text-muted)]">
|
|
680
|
+
Filtering by:
|
|
681
|
+
<strong>{{ location === null ? 'All locations' : location }}</strong>
|
|
682
|
+
</p>
|
|
683
|
+
</div>
|
|
684
|
+
</template>
|
|
685
|
+
<script setup lang="ts">
|
|
686
|
+
import { ref } from 'vue';
|
|
687
|
+
import { BbSelect } from 'bitboss-ui';
|
|
688
|
+
|
|
689
|
+
type Location = { label: string; value: string | null };
|
|
690
|
+
|
|
691
|
+
const pool: Location[] = [
|
|
692
|
+
{ label: 'Milan', value: 'milan' },
|
|
693
|
+
{ label: 'Rome', value: 'rome' },
|
|
694
|
+
{ label: 'Berlin', value: 'berlin' },
|
|
695
|
+
];
|
|
696
|
+
|
|
697
|
+
/**
|
|
698
|
+
* "Everything" is modelled as a real option whose value is `null`, sitting at
|
|
699
|
+
* the top of the list next to the concrete ones. Returned by the provider like
|
|
700
|
+
* any other option — the component does not synthesise it.
|
|
701
|
+
*/
|
|
702
|
+
const ALL: Location = { label: 'All locations', value: null };
|
|
703
|
+
|
|
704
|
+
// `null` is the seeded value, and here it means "All locations" — not "empty".
|
|
705
|
+
const location = ref<string | null>(null);
|
|
706
|
+
|
|
707
|
+
const loadLocations = (
|
|
708
|
+
query: string,
|
|
709
|
+
prefill: boolean
|
|
710
|
+
): Promise<Location[]> => {
|
|
711
|
+
const q = query.trim().toLowerCase();
|
|
712
|
+
const matches =
|
|
713
|
+
prefill || !q
|
|
714
|
+
? pool
|
|
715
|
+
: pool.filter((l) => l.label.toLowerCase().includes(q));
|
|
716
|
+
// "All" always leads the list; it is not filtered out by a search.
|
|
717
|
+
return new Promise((resolve) =>
|
|
718
|
+
setTimeout(() => resolve([ALL, ...matches]), 200)
|
|
719
|
+
);
|
|
465
720
|
};
|
|
721
|
+
</script>
|
|
722
|
+
```
|
|
723
|
+
|
|
724
|
+
With an **array** you need nothing at all — arrays are never lazy, so "All
|
|
725
|
+
locations" renders from the first paint:
|
|
726
|
+
|
|
727
|
+
**The same thing with array items — no prefill needed**
|
|
728
|
+
|
|
729
|
+
```vue
|
|
730
|
+
<BbSelect
|
|
731
|
+
v-model="state.location"
|
|
732
|
+
item-text="label"
|
|
733
|
+
item-value="value"
|
|
734
|
+
:items="[
|
|
735
|
+
{ label: 'All locations', value: null },
|
|
736
|
+
{ label: 'Milan', value: 'milan' },
|
|
737
|
+
{ label: 'Rome', value: 'rome' },
|
|
738
|
+
]"
|
|
739
|
+
label="Location"
|
|
740
|
+
placeholder="Select location…"
|
|
741
|
+
/>
|
|
742
|
+
```
|
|
743
|
+
|
|
744
|
+
Know what else you inherit by overloading `null`, because the component cannot
|
|
745
|
+
distinguish the two meanings:
|
|
466
746
|
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
747
|
+
- **`clear` selects "All".** The clear button emits `null`, which is now a
|
|
748
|
+
choice, not an absence.
|
|
749
|
+
- **`enforce-coherence` never prunes it** — an empty selection is always
|
|
750
|
+
coherent, so the "All" value is never questioned.
|
|
751
|
+
- **A prune of some _other_ stale value widens to "All"**, because enforcement
|
|
752
|
+
emits `null` in single mode. A dead filter value becomes "show everything"
|
|
753
|
+
rather than "show nothing".
|
|
754
|
+
|
|
755
|
+
If "everything" and "nothing" must stay distinct — a required field, or a filter
|
|
756
|
+
where widening is unsafe — use a **sentinel** instead (`value: 'all'`). Then
|
|
757
|
+
`null` keeps meaning empty, but the sentinel must appear in **every** provider
|
|
758
|
+
response or `enforce-coherence` will prune it, and it counts as a value, so it
|
|
759
|
+
triggers the eager-prefill upgrade on its own.
|
|
760
|
+
|
|
761
|
+
### Dependent fields and enforced coherence
|
|
762
|
+
|
|
763
|
+
When one select constrains another, list the upstream value in `dependencies`:
|
|
764
|
+
the component re-runs its `items` provider whenever a dependency changes
|
|
765
|
+
(value-hash compared, so array identity churn doesn't refetch), debounced by
|
|
766
|
+
`deps-debounce-time`. Add `enforce-coherence` so a now-invalid selection is
|
|
767
|
+
cleaned up automatically. Details in the Coherence playbook.
|
|
768
|
+
|
|
769
|
+
**Region drives the city options**
|
|
770
|
+
|
|
771
|
+
```vue
|
|
772
|
+
<template>
|
|
773
|
+
<div class="grid max-w-sm gap-3 rounded-[var(--bb-radius)] border p-3">
|
|
774
|
+
<div>
|
|
775
|
+
<h3 class="text-sm font-medium">Shipping address</h3>
|
|
776
|
+
<p class="text-xs text-[color:var(--bb-text-muted)]">
|
|
777
|
+
City options follow the chosen region.
|
|
778
|
+
</p>
|
|
779
|
+
</div>
|
|
780
|
+
<BbSelect
|
|
781
|
+
v-model="region"
|
|
782
|
+
compact
|
|
783
|
+
item-text="label"
|
|
784
|
+
item-value="value"
|
|
785
|
+
:items="regions"
|
|
786
|
+
label="Region"
|
|
787
|
+
placeholder="Pick a region"
|
|
788
|
+
/>
|
|
789
|
+
<BbSelect
|
|
790
|
+
v-model="city"
|
|
791
|
+
compact
|
|
792
|
+
:dependencies="[region]"
|
|
793
|
+
:deps-debounce-time="150"
|
|
794
|
+
enforce-coherence
|
|
795
|
+
item-text="label"
|
|
796
|
+
item-value="value"
|
|
797
|
+
:items="loadCities"
|
|
798
|
+
label="City"
|
|
799
|
+
:placeholder="region ? 'Pick a city' : 'Select a region first'"
|
|
800
|
+
/>
|
|
801
|
+
</div>
|
|
802
|
+
</template>
|
|
803
|
+
<script setup lang="ts">
|
|
804
|
+
import { ref } from 'vue';
|
|
805
|
+
import { BbSelect } from 'bitboss-ui';
|
|
806
|
+
|
|
807
|
+
type Region = { label: string; value: string };
|
|
808
|
+
type City = { label: string; value: string; region: string };
|
|
809
|
+
|
|
810
|
+
const regions: Region[] = [
|
|
811
|
+
{ label: 'Italy', value: 'it' },
|
|
812
|
+
{ label: 'Germany', value: 'de' },
|
|
813
|
+
{ label: 'Portugal', value: 'pt' },
|
|
814
|
+
];
|
|
815
|
+
|
|
816
|
+
const cityPool: City[] = [
|
|
817
|
+
{ label: 'Rome', value: 'rome', region: 'it' },
|
|
818
|
+
{ label: 'Milan', value: 'milan', region: 'it' },
|
|
819
|
+
{ label: 'Berlin', value: 'berlin', region: 'de' },
|
|
820
|
+
{ label: 'Munich', value: 'munich', region: 'de' },
|
|
821
|
+
{ label: 'Lisbon', value: 'lisbon', region: 'pt' },
|
|
822
|
+
{ label: 'Porto', value: 'porto', region: 'pt' },
|
|
823
|
+
];
|
|
824
|
+
|
|
825
|
+
// Single-mode enforcement resolves to `null` — seed the models accordingly.
|
|
826
|
+
const region = ref<string | null>(null);
|
|
827
|
+
const city = ref<string | null>(null);
|
|
828
|
+
|
|
829
|
+
// The provider reads the selected region; the component re-runs it whenever
|
|
830
|
+
// `region` changes because it is listed in `dependencies`. Component-initiated
|
|
831
|
+
// calls (`prefill === true`) return the region's whole pool so a still-valid
|
|
832
|
+
// city stays resolvable; `enforce-coherence` clears one that no longer fits.
|
|
833
|
+
const loadCities = (query: string, prefill: boolean): Promise<City[]> => {
|
|
834
|
+
const pool = cityPool.filter((c) => c.region === region.value);
|
|
835
|
+
const q = query.trim().toLowerCase();
|
|
836
|
+
const matches =
|
|
837
|
+
prefill || !q
|
|
838
|
+
? pool
|
|
839
|
+
: pool.filter((c) => c.label.toLowerCase().includes(q));
|
|
840
|
+
return new Promise((resolve) => setTimeout(() => resolve(matches), 200));
|
|
479
841
|
};
|
|
842
|
+
</script>
|
|
843
|
+
```
|
|
844
|
+
|
|
845
|
+
What enforcement emits when a reload leaves the model incoherent:
|
|
846
|
+
|
|
847
|
+
- multiple → `update:modelValue` with the **filtered array** (still-valid
|
|
848
|
+
entries survive);
|
|
849
|
+
- single → `update:modelValue` with **`null`** — seed single models as
|
|
850
|
+
`ref<T | null>(null)` and treat `null` as "nothing valid" in submit logic;
|
|
851
|
+
- an empty selection is always coherent, so nothing fires.
|
|
852
|
+
|
|
853
|
+
In multiple mode the pruning shows up as a filtered chip row. Here switching
|
|
854
|
+
the project keeps reviewers who belong to the new team and drops the rest —
|
|
855
|
+
no watcher, no manual reset:
|
|
856
|
+
|
|
857
|
+
**Project change prunes reviewers**
|
|
480
858
|
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
'
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
859
|
+
```vue
|
|
860
|
+
<template>
|
|
861
|
+
<div class="grid max-w-sm gap-3 rounded-[var(--bb-radius)] border p-3">
|
|
862
|
+
<div>
|
|
863
|
+
<h3 class="text-sm font-medium">Review request</h3>
|
|
864
|
+
<p class="text-xs text-[color:var(--bb-text-muted)]">
|
|
865
|
+
Reviewers must belong to the selected project.
|
|
866
|
+
</p>
|
|
867
|
+
</div>
|
|
868
|
+
<BbSelect
|
|
869
|
+
v-model="project"
|
|
870
|
+
compact
|
|
871
|
+
item-text="name"
|
|
872
|
+
item-value="id"
|
|
873
|
+
:items="projects"
|
|
874
|
+
label="Project"
|
|
875
|
+
/>
|
|
876
|
+
<BbSelect
|
|
877
|
+
v-model="reviewers"
|
|
878
|
+
compact
|
|
879
|
+
:dependencies="[project]"
|
|
880
|
+
:deps-debounce-time="150"
|
|
881
|
+
enforce-coherence
|
|
882
|
+
hint="Only members of the selected project can review"
|
|
883
|
+
item-text="name"
|
|
884
|
+
item-value="id"
|
|
885
|
+
:items="loadReviewers"
|
|
886
|
+
label="Reviewers"
|
|
887
|
+
multiple
|
|
888
|
+
name="reviewers"
|
|
889
|
+
/>
|
|
890
|
+
</div>
|
|
891
|
+
</template>
|
|
892
|
+
<script setup lang="ts">
|
|
893
|
+
import { ref } from 'vue';
|
|
894
|
+
import { BbSelect } from 'bitboss-ui';
|
|
895
|
+
|
|
896
|
+
type Project = { id: string; name: string };
|
|
897
|
+
type Member = { id: string; name: string; projects: string[] };
|
|
898
|
+
|
|
899
|
+
const projects: Project[] = [
|
|
900
|
+
{ id: 'web', name: 'Web app' },
|
|
901
|
+
{ id: 'mobile', name: 'Mobile app' },
|
|
902
|
+
];
|
|
903
|
+
|
|
904
|
+
const members: Member[] = [
|
|
905
|
+
{ id: 'ada', name: 'Ada Lovelace', projects: ['web', 'mobile'] },
|
|
906
|
+
{ id: 'grace', name: 'Grace Hopper', projects: ['web'] },
|
|
907
|
+
{ id: 'alan', name: 'Alan Turing', projects: ['mobile'] },
|
|
908
|
+
{ id: 'maggie', name: 'Margaret Hamilton', projects: ['web', 'mobile'] },
|
|
909
|
+
];
|
|
910
|
+
|
|
911
|
+
const project = ref<string>('web');
|
|
912
|
+
// A seeded selection upgrades the select to immediate prefill, so the
|
|
913
|
+
// dependency watcher is armed from the first render.
|
|
914
|
+
const reviewers = ref<string[]>(['ada', 'grace']);
|
|
915
|
+
|
|
916
|
+
// Query-aware provider: `prefill === false` only when the user typed. On
|
|
917
|
+
// component-initiated calls (mount, project change) return the project's full
|
|
918
|
+
// member pool, so a still-valid selection stays resolvable — switching to
|
|
919
|
+
// "Mobile app" keeps Ada and prunes Grace.
|
|
920
|
+
const loadReviewers = (query: string, prefill: boolean): Promise<Member[]> => {
|
|
921
|
+
const pool = members.filter((member) =>
|
|
922
|
+
member.projects.includes(project.value)
|
|
923
|
+
);
|
|
924
|
+
const q = query.trim().toLowerCase();
|
|
925
|
+
const matches =
|
|
926
|
+
prefill || !q
|
|
927
|
+
? pool
|
|
928
|
+
: pool.filter((member) => member.name.toLowerCase().includes(q));
|
|
929
|
+
return new Promise((resolve) => setTimeout(() => resolve(matches), 200));
|
|
552
930
|
};
|
|
931
|
+
</script>
|
|
553
932
|
```
|
|
554
933
|
|
|
555
|
-
|
|
934
|
+
Because enforcement checks the merged result (fetched + stashed), a provider
|
|
935
|
+
that returns `[]` on a `prefill: true` call **will wipe a valid selection** —
|
|
936
|
+
always resolve the current selection on component-initiated calls (or enable
|
|
937
|
+
`stash`).
|
|
556
938
|
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
939
|
+
### Create options on the fly (`option:add`)
|
|
940
|
+
|
|
941
|
+
Pressing Enter in the search field with **no option highlighted** emits
|
|
942
|
+
`option:add` with the trimmed query (it can be `''` — guard). The component
|
|
943
|
+
does not create anything itself: append the new item to `items` and select it.
|
|
944
|
+
This is the idiomatic pattern for closed-but-growable vocabularies.
|
|
945
|
+
|
|
946
|
+
**Create a label by pressing Enter**
|
|
947
|
+
|
|
948
|
+
```vue
|
|
949
|
+
<template>
|
|
950
|
+
<div class="grid max-w-sm gap-3 rounded-[var(--bb-radius)] border p-3">
|
|
951
|
+
<div>
|
|
952
|
+
<h3 class="text-sm font-medium">Issue labels</h3>
|
|
953
|
+
<p class="text-xs text-[color:var(--bb-text-muted)]">
|
|
954
|
+
Add from the list, or invent one with Enter.
|
|
955
|
+
</p>
|
|
956
|
+
</div>
|
|
957
|
+
<BbSelect
|
|
958
|
+
v-model="labels"
|
|
959
|
+
clearable
|
|
960
|
+
compact
|
|
961
|
+
item-text="name"
|
|
962
|
+
item-value="id"
|
|
963
|
+
:items="available"
|
|
964
|
+
label="Labels"
|
|
965
|
+
multiple
|
|
966
|
+
no-data-text="No matching label — press Enter to create it"
|
|
967
|
+
@option:add="createLabel"
|
|
968
|
+
/>
|
|
969
|
+
</div>
|
|
970
|
+
</template>
|
|
971
|
+
<script setup lang="ts">
|
|
972
|
+
import { ref } from 'vue';
|
|
973
|
+
import { BbSelect } from 'bitboss-ui';
|
|
974
|
+
|
|
975
|
+
type Label = { id: string; name: string };
|
|
976
|
+
|
|
977
|
+
const available = ref<Label[]>([
|
|
978
|
+
{ id: 'bug', name: 'Bug' },
|
|
979
|
+
{ id: 'docs', name: 'Documentation' },
|
|
980
|
+
{ id: 'design', name: 'Design' },
|
|
981
|
+
]);
|
|
982
|
+
|
|
983
|
+
const labels = ref<string[]>(['bug']);
|
|
984
|
+
|
|
985
|
+
// `option:add` fires with the trimmed query when the user presses Enter and no
|
|
986
|
+
// option is highlighted. It can fire with '' (Enter on an empty query) — guard.
|
|
987
|
+
const createLabel = (text: string) => {
|
|
988
|
+
const name = text.trim();
|
|
989
|
+
if (!name) return;
|
|
990
|
+
const id = name.toLowerCase().replace(/\s+/g, '-');
|
|
991
|
+
if (!available.value.some((label) => label.id === id)) {
|
|
992
|
+
// Mutating `items` re-runs the options pipeline, so the new label is
|
|
993
|
+
// immediately matchable — no manual refresh needed.
|
|
994
|
+
available.value = [...available.value, { id, name }];
|
|
995
|
+
}
|
|
996
|
+
if (!labels.value.includes(id)) {
|
|
997
|
+
labels.value = [...labels.value, id];
|
|
565
998
|
}
|
|
566
|
-
}
|
|
999
|
+
};
|
|
1000
|
+
</script>
|
|
1001
|
+
```
|
|
1002
|
+
|
|
1003
|
+
### Group related options
|
|
1004
|
+
|
|
1005
|
+
Set `group-by` to a field path (or a function) to bucket options under headers.
|
|
1006
|
+
The `#group` slot styles the header and receives
|
|
1007
|
+
`{ text, item, index, length, disabled }` — `length` is the number of options
|
|
1008
|
+
in the group, `index` the list index of its first option.
|
|
1009
|
+
|
|
1010
|
+
**Options grouped by department**
|
|
1011
|
+
|
|
1012
|
+
```vue
|
|
1013
|
+
<template>
|
|
1014
|
+
<div class="grid max-w-sm gap-3 rounded-[var(--bb-radius)] border p-3">
|
|
1015
|
+
<div>
|
|
1016
|
+
<h3 class="text-sm font-medium">Invite teammate</h3>
|
|
1017
|
+
<p class="text-xs text-[color:var(--bb-text-muted)]">
|
|
1018
|
+
Roles grouped by department.
|
|
1019
|
+
</p>
|
|
1020
|
+
</div>
|
|
1021
|
+
<BbSelect
|
|
1022
|
+
v-model="role"
|
|
1023
|
+
clearable
|
|
1024
|
+
compact
|
|
1025
|
+
group-by="department"
|
|
1026
|
+
item-text="label"
|
|
1027
|
+
item-value="value"
|
|
1028
|
+
:items="roles"
|
|
1029
|
+
label="Role"
|
|
1030
|
+
placeholder="Pick a role"
|
|
1031
|
+
>
|
|
1032
|
+
<template #group="{ text, length }">
|
|
1033
|
+
<div
|
|
1034
|
+
class="flex items-center justify-between px-2 text-xs font-semibold text-[color:var(--bb-text-muted)]"
|
|
1035
|
+
>
|
|
1036
|
+
<span>{{ text }}</span>
|
|
1037
|
+
<span>{{ length }}</span>
|
|
1038
|
+
</div>
|
|
1039
|
+
</template>
|
|
1040
|
+
</BbSelect>
|
|
1041
|
+
</div>
|
|
1042
|
+
</template>
|
|
1043
|
+
<script setup lang="ts">
|
|
1044
|
+
import { ref } from 'vue';
|
|
1045
|
+
import { BbSelect } from 'bitboss-ui';
|
|
1046
|
+
|
|
1047
|
+
type Role = { label: string; value: string; department: string };
|
|
1048
|
+
|
|
1049
|
+
// `group-by` buckets options under headers by this field path; the `#group`
|
|
1050
|
+
// slot styles each header and receives the group `text` and `length`.
|
|
1051
|
+
const roles: Role[] = [
|
|
1052
|
+
{ label: 'Frontend', value: 'fe', department: 'Engineering' },
|
|
1053
|
+
{ label: 'Backend', value: 'be', department: 'Engineering' },
|
|
1054
|
+
{ label: 'Brand', value: 'br', department: 'Design' },
|
|
1055
|
+
{ label: 'Product', value: 'pr', department: 'Design' },
|
|
1056
|
+
];
|
|
1057
|
+
|
|
1058
|
+
const role = ref<string | null>(null);
|
|
1059
|
+
</script>
|
|
567
1060
|
```
|
|
1061
|
+
|
|
1062
|
+
### Custom option rows
|
|
1063
|
+
|
|
1064
|
+
The `#option` slot replaces the default row rendering — use it for avatars,
|
|
1065
|
+
secondary text or metadata. It exposes the raw `item`, the resolved `text` and
|
|
1066
|
+
`value`, plus `selected` / `focused` / `disabled` / `loading` / `hasErrors`
|
|
1067
|
+
flags and the row `index`. Rows are fixed-height (the list is virtualized): if
|
|
1068
|
+
your markup is taller than the default 40px (32px compact), set `item-height`
|
|
1069
|
+
to match — and `header-height` for grouped headers (defaults 32px / 24px
|
|
1070
|
+
compact).
|
|
1071
|
+
|
|
1072
|
+
**Rich option rows with an avatar chip**
|
|
1073
|
+
|
|
1074
|
+
```vue
|
|
1075
|
+
<template>
|
|
1076
|
+
<div class="grid max-w-sm gap-3 rounded-[var(--bb-radius)] border p-3">
|
|
1077
|
+
<div class="flex items-baseline justify-between gap-2">
|
|
1078
|
+
<h3 class="text-sm font-medium">Code review</h3>
|
|
1079
|
+
<span class="text-xs text-[color:var(--bb-text-muted)]">PR #842</span>
|
|
1080
|
+
</div>
|
|
1081
|
+
<BbSelect
|
|
1082
|
+
v-model="assignee"
|
|
1083
|
+
compact
|
|
1084
|
+
item-text="label"
|
|
1085
|
+
item-value="value"
|
|
1086
|
+
:items="teammates"
|
|
1087
|
+
label="Assignee"
|
|
1088
|
+
placeholder="Choose a teammate"
|
|
1089
|
+
>
|
|
1090
|
+
<template #option="{ item, text }">
|
|
1091
|
+
<span class="flex w-full items-center gap-2">
|
|
1092
|
+
<BbAvatar :alt="text" size="sm">{{ item.initials }}</BbAvatar>
|
|
1093
|
+
<span class="min-w-0 flex-1 truncate">{{ text }}</span>
|
|
1094
|
+
<span class="shrink-0 text-xs text-[color:var(--bb-text-muted)]">{{
|
|
1095
|
+
item.role
|
|
1096
|
+
}}</span>
|
|
1097
|
+
</span>
|
|
1098
|
+
</template>
|
|
1099
|
+
</BbSelect>
|
|
1100
|
+
</div>
|
|
1101
|
+
</template>
|
|
1102
|
+
<script setup lang="ts">
|
|
1103
|
+
import { ref } from 'vue';
|
|
1104
|
+
import { BbAvatar, BbSelect } from 'bitboss-ui';
|
|
1105
|
+
|
|
1106
|
+
type Teammate = {
|
|
1107
|
+
label: string;
|
|
1108
|
+
value: string;
|
|
1109
|
+
initials: string;
|
|
1110
|
+
role: string;
|
|
1111
|
+
};
|
|
1112
|
+
|
|
1113
|
+
// The `#option` slot replaces the default row rendering — here a BbAvatar
|
|
1114
|
+
// initials fallback next to the resolved display `text`.
|
|
1115
|
+
const teammates: Teammate[] = [
|
|
1116
|
+
{
|
|
1117
|
+
label: 'Ada Lovelace',
|
|
1118
|
+
value: 'ada',
|
|
1119
|
+
initials: 'AL',
|
|
1120
|
+
role: 'Platform',
|
|
1121
|
+
},
|
|
1122
|
+
{
|
|
1123
|
+
label: 'Grace Hopper',
|
|
1124
|
+
value: 'grace',
|
|
1125
|
+
initials: 'GH',
|
|
1126
|
+
role: 'Backend',
|
|
1127
|
+
},
|
|
1128
|
+
{
|
|
1129
|
+
label: 'Margaret Hamilton',
|
|
1130
|
+
value: 'maggie',
|
|
1131
|
+
initials: 'MH',
|
|
1132
|
+
role: 'Flight',
|
|
1133
|
+
},
|
|
1134
|
+
];
|
|
1135
|
+
|
|
1136
|
+
const assignee = ref<string | null>(null);
|
|
1137
|
+
</script>
|
|
1138
|
+
```
|
|
1139
|
+
|
|
1140
|
+
### Slots around the input
|
|
1141
|
+
|
|
1142
|
+
Beyond the panel slots, the field itself is extensible:
|
|
1143
|
+
|
|
1144
|
+
- `#label` replaces the label text; receives `{ text, hasErrors }`.
|
|
1145
|
+
- `#prefix` / `#suffix` render inline adornments inside the field (no scope) —
|
|
1146
|
+
currency symbols, units.
|
|
1147
|
+
- `#prepend` / `#append` render inside the field wrapper, before/after the
|
|
1148
|
+
value area; both receive `{ query, focus, close }`.
|
|
1149
|
+
- `#prepend-outer` / `#append-outer` render outside the field wrapper; both
|
|
1150
|
+
receive `{ query, close }` — e.g. a companion button acting on the field.
|
|
1151
|
+
|
|
1152
|
+
Prefer the icon props (`prepend:icon` / `append:icon`) over slots when an icon
|
|
1153
|
+
is all you need.
|
|
1154
|
+
|
|
1155
|
+
### States
|
|
1156
|
+
|
|
1157
|
+
- `disabled` — control inert, chips become badges, hidden form inputs disabled.
|
|
1158
|
+
- `readonly` — the value is visible and focusable but **the panel never
|
|
1159
|
+
opens**; chips become non-removable badges. Use it for review screens, not
|
|
1160
|
+
for fields whose options the user might still need to browse (they can't).
|
|
1161
|
+
- `loading` — external loading state: shows the control spinner and suspends
|
|
1162
|
+
keyboard opening. Fetch-driven loading is automatic; don't mirror it here.
|
|
1163
|
+
- `clearable` — clear affix when a value exists; emits `null` / `[]`.
|
|
1164
|
+
- Empty panel — `no-data-text` or `#no-data`.
|
|
1165
|
+
|
|
1166
|
+
### Events and v-model
|
|
1167
|
+
|
|
1168
|
+
- `update:modelValue` — the resolved value (single) or array (multiple), on
|
|
1169
|
+
pick, chip removal, clear and coherence enforcement.
|
|
1170
|
+
- `option:add` — Enter on a query with no highlighted option (see above).
|
|
1171
|
+
- `focus` / `blur` — the control gaining/losing focus; `input` / `change` —
|
|
1172
|
+
native events from the panel search field.
|
|
1173
|
+
- `inactive` — focus has fully left the component (control **and** panel).
|
|
1174
|
+
Because focus legitimately moves into the panel, validate on `inactive`, not
|
|
1175
|
+
on `blur`.
|
|
1176
|
+
|
|
1177
|
+
### Keyboard model
|
|
1178
|
+
|
|
1179
|
+
Shipped behavior — never reimplement it:
|
|
1180
|
+
|
|
1181
|
+
- Closed, control focused: `ArrowDown` opens and focuses the first selected
|
|
1182
|
+
option, `ArrowUp` opens and focuses the last selected, `Enter` opens and
|
|
1183
|
+
focuses the selection or the search field.
|
|
1184
|
+
- Open: typing searches; `ArrowDown` / `ArrowUp` move the highlighted option
|
|
1185
|
+
while DOM focus stays in the search field (conveyed via
|
|
1186
|
+
`aria-activedescendant`); `Enter` confirms the highlighted option — or emits
|
|
1187
|
+
`option:add` when none is highlighted; `Esc` closes and returns focus to the
|
|
1188
|
+
control.
|
|
1189
|
+
- Picking in single mode closes the panel and refocuses the control; in
|
|
1190
|
+
multiple mode the panel stays open and focus returns to the search field.
|
|
1191
|
+
- Clicks or focus outside the control and panel close it.
|
|
1192
|
+
- `disabled`, `readonly` and `loading` suppress the open/navigate bindings
|
|
1193
|
+
(`Esc` still closes an open panel).
|
|
1194
|
+
|
|
1195
|
+
### Sizing and layout
|
|
1196
|
+
|
|
1197
|
+
- `compact` — denser control and panel (32px options, 24px group headers).
|
|
1198
|
+
- The panel width always matches the control; the control fills its container,
|
|
1199
|
+
so size it with layout classes on a wrapper (`class="max-w-xs"` etc.).
|
|
1200
|
+
- `direction` works whenever the resolved label mode is `'outside'` (the
|
|
1201
|
+
library default) — `direction="horizontal"` gives a label-beside-field row.
|
|
1202
|
+
Only `floating`/`inside` label modes force the vertical layout, since they
|
|
1203
|
+
embed the label in the field itself.
|
|
1204
|
+
|
|
1205
|
+
### Adaptive mobile sheet
|
|
1206
|
+
|
|
1207
|
+
With `adaptive` (default: global `config.adaptive`, which is `true`), the panel
|
|
1208
|
+
opens as a bottom off-canvas sheet on mobile viewports (below
|
|
1209
|
+
`config.mobileMaxWidth`) instead of a floating popover — same search, options
|
|
1210
|
+
and header/footer slots, plus a chips row of the current selection above the
|
|
1211
|
+
search field. The surface is latched per open cycle: a mid-open resize never
|
|
1212
|
+
swaps popover ↔ sheet.
|
|
1213
|
+
|
|
1214
|
+
- `off-canvas-props` forwards extra `BbOffCanvas` props to the sheet (`size`,
|
|
1215
|
+
`draggable`, `fullscreen`, …).
|
|
1216
|
+
- `disable-writing="'mobile'"` hides the search on the sheet only — common when
|
|
1217
|
+
the list is short.
|
|
1218
|
+
- Set `:adaptive="false"` to keep a floating popover everywhere.
|
|
1219
|
+
|
|
1220
|
+
### Global config and platforms
|
|
1221
|
+
|
|
1222
|
+
From the vite/nuxt plugin options:
|
|
1223
|
+
|
|
1224
|
+
- `config.adaptive` — default for `adaptive` (see above).
|
|
1225
|
+
- `config.mobileMaxWidth` — the viewport threshold for "mobile".
|
|
1226
|
+
- `config.defaultInputLabelMode` — default `label-mode`.
|
|
1227
|
+
- `config.locale` (`'en'` / `'it'`) — built-in strings: the collapsed-chips
|
|
1228
|
+
summary ("N items selected") and the panel loading/no-data defaults.
|
|
1229
|
+
|
|
1230
|
+
Platform notes:
|
|
1231
|
+
|
|
1232
|
+
- **SSR / Nuxt**: `prefill: true` providers also run in `onServerPrefetch`, so
|
|
1233
|
+
server-rendered pages hydrate with options loaded. Keep providers isomorphic
|
|
1234
|
+
(no `window` access).
|
|
1235
|
+
- **Plain HTML forms / Inertia form posts**: give the select a `name` — hidden
|
|
1236
|
+
inputs carry the values (JSON-stringified when not strings), and `required`
|
|
1237
|
+
participates in native validation.
|
|
1238
|
+
- The desktop panel is anchored to the control; the mobile sheet manages its
|
|
1239
|
+
own backdrop, Escape and focus.
|
|
1240
|
+
|
|
1241
|
+
### Works well with
|
|
1242
|
+
|
|
1243
|
+
- `BbSelectPopover` — the same engine on a custom trigger (status pills,
|
|
1244
|
+
table-cell chips, toolbars).
|
|
1245
|
+
- `BbTable` — selects as column filters: list their models in the table
|
|
1246
|
+
provider's `dependencies`.
|
|
1247
|
+
- `useToast` — surface provider failures (the component only logs them).
|
|
1248
|
+
- `BbRadioGroup` / `BbCheckboxGroup` — swap to these when the option set turns
|
|
1249
|
+
out small and static; the `items` contract is identical, so migration is
|
|
1250
|
+
cheap.
|
|
1251
|
+
- `BbTag` — open vocabularies typed by the user; `BbSelect` + `option:add`
|
|
1252
|
+
covers "known set, occasionally growable".
|
|
1253
|
+
|
|
1254
|
+
### Gotchas and constraints
|
|
1255
|
+
|
|
1256
|
+
- **Clicking the selected option does not clear a single select** — it re-picks
|
|
1257
|
+
it and closes the panel. Add `clearable` for an explicit clear button; a
|
|
1258
|
+
required status field should not empty itself because someone clicked twice.
|
|
1259
|
+
Multiple mode still toggles a selected option off.
|
|
1260
|
+
- `multiple` with a non-array model **throws at setup** — seed `ref([])`.
|
|
1261
|
+
- `placeholder` renders only in single mode; an empty multiple select shows
|
|
1262
|
+
nothing.
|
|
1263
|
+
- **A `null` "All" option needs `prefill: true` when `items` is a provider.**
|
|
1264
|
+
Modelling "everything" as `{ label: 'All locations', value: null }` works — the
|
|
1265
|
+
row resolves and renders as the selection — but `null` is also the value the
|
|
1266
|
+
component reads as _nothing selected_, so it never upgrades to an eager
|
|
1267
|
+
prefill. With a provider that means nothing loads, there is no text, and the
|
|
1268
|
+
field renders the **placeholder** — greyed, indistinguishable from an empty
|
|
1269
|
+
select, while the model holds a real choice. Set `prefill: true` so the label
|
|
1270
|
+
can resolve. Array `items` need nothing: they are never lazy. (Note `clear`
|
|
1271
|
+
then also produces `null`, i.e. it selects "All" — use a sentinel like `'all'`
|
|
1272
|
+
if the two must stay distinct.)
|
|
1273
|
+
- The local substring filter also applies to provider results — server matches
|
|
1274
|
+
whose text doesn't contain the query are hidden (see Search semantics).
|
|
1275
|
+
- `filter-by` is `string[]` only (no function, no bare string) and matches
|
|
1276
|
+
exclusively those paths; each path must exist on every item or matching
|
|
1277
|
+
throws.
|
|
1278
|
+
- `prefill: false` still fetches once when the panel first opens.
|
|
1279
|
+
- `readonly` prevents the panel from opening at all.
|
|
1280
|
+
- `enforce-coherence` + a provider that drops the selection on `prefill: true`
|
|
1281
|
+
calls = wiped model. Resolve the selection, or enable `stash`.
|
|
1282
|
+
- The flip side: `stash` keeps every previously fetched option resolvable, so
|
|
1283
|
+
on a select with `dependencies` it also keeps _stale_ picks coherent —
|
|
1284
|
+
enforcement will never prune them. When an upstream change must clear
|
|
1285
|
+
now-invalid values, skip `stash` and resolve the selection in the provider
|
|
1286
|
+
instead.
|
|
1287
|
+
- `direction` is honored with `'outside'` labels (the default); it is ignored
|
|
1288
|
+
only under `floating`/`inside` label modes.
|
|
1289
|
+
- No `#chevron` slot — customise the trailing icon via `append:icon`.
|
|
1290
|
+
- The multiple-mode search query persists after picking an option (it clears on
|
|
1291
|
+
close).
|
|
1292
|
+
- `option:add` can fire with an empty string — trim and guard in the handler.
|
|
1293
|
+
|
|
1294
|
+
### Anti-patterns
|
|
1295
|
+
|
|
1296
|
+
- Pre-mapping items to `{ label, value }`, or storing whole objects in the
|
|
1297
|
+
model when an id is enough.
|
|
1298
|
+
- `watch(filter, refetch)` when `dependencies` exists; blind `model = null`
|
|
1299
|
+
resets when `enforce-coherence` would preserve still-valid values.
|
|
1300
|
+
- Hand-rolled debounce or loading refs around the provider.
|
|
1301
|
+
- Rebuilding chips, counts or select-all outside the component when `max`,
|
|
1302
|
+
`max-selected-labels`, `selected-labels-fn` and the panel slots cover it.
|
|
1303
|
+
- Expecting a `disabled` field on items to disable options — it is inert data;
|
|
1304
|
+
use the `selectable` predicate or filter unavailable options out.
|
|
1305
|
+
- Using `BbSelect` for three static options (that's `BbRadioGroup`), or as an
|
|
1306
|
+
actions menu (that's `BbDropdown`).
|
|
1307
|
+
|
|
1308
|
+
### Accessibility
|
|
1309
|
+
|
|
1310
|
+
- `label` is mandatory and is the accessible name; use `hide-label` (not an
|
|
1311
|
+
empty label) to hide it visually. The activator is announced as a combobox
|
|
1312
|
+
with `aria-expanded`, `aria-controls` and the selected text exposed as
|
|
1313
|
+
`aria-valuetext`.
|
|
1314
|
+
- `errors`, `warnings`, `description` and `hint` are all wired to the trigger through
|
|
1315
|
+
`aria-describedby`, in that order: the reason the field is invalid is spoken
|
|
1316
|
+
first when it regains focus, and a channel is referenced only while it
|
|
1317
|
+
actually has copy. Messages _also_ render in an `aria-live="polite"` region,
|
|
1318
|
+
so they are announced the moment they appear — announced on change, re-read
|
|
1319
|
+
on focus. The error state also sets `aria-invalid`.
|
|
1320
|
+
- The panel manages listbox roles, `aria-activedescendant` and the full
|
|
1321
|
+
keyboard model (see Keyboard model) for you — do not rebuild any of it.
|
|
1322
|
+
- The in-panel search field ships an accessible name ("Search options").
|
|
1323
|
+
- Chip removal affordances only render when removal is actually possible (not
|
|
1324
|
+
under `disabled` / `readonly` / `comma`).
|
|
1325
|
+
|
|
1326
|
+
## v-model
|
|
1327
|
+
|
|
1328
|
+
- `v-model` — type: `any`
|
|
1329
|
+
|
|
1330
|
+
## Props
|
|
1331
|
+
|
|
1332
|
+
| Prop | Type | Default | Required | Description |
|
|
1333
|
+
| --- | --- | --- | --- | --- |
|
|
1334
|
+
| `adaptive` | `boolean \| undefined` | `undefined` | | When `true`, the options panel opens as a bottom off-canvas sheet on mobile viewports instead of a floating popover; on desktop it stays a popover. When unset, falls back to the global `config.adaptive`. |
|
|
1335
|
+
| `append:icon` | `string \| undefined` | | | Name of the icon to be added at the end of the input. |
|
|
1336
|
+
| `autocomplete` | `string \| undefined` | | | Guides to the browser as to the type of information expected in the field. |
|
|
1337
|
+
| `autofocus` | `Booleanish \| undefined` | | | Sets autofocus on page load. |
|
|
1338
|
+
| `clearable` | `boolean \| undefined` | | | Displays a clear button when the input has a value and is being interacted with. |
|
|
1339
|
+
| `comma` | `boolean \| undefined` | | | Sets the display model for selected values to a list of comma separated string. In this mode the user cannot deselect an option by pressing the close button. |
|
|
1340
|
+
| `compact` | `boolean \| undefined` | | | Sets the component in a compact mode. |
|
|
1341
|
+
| `dependencies` | `unknown[] \| undefined` | | | Defines an array of dependencies that will trigger actions in the component upon change. |
|
|
1342
|
+
| `depsDebounceTime` | `number \| undefined` | | | Timeout used to debounce response to changes to dependencies. |
|
|
1343
|
+
| `description` | `string \| undefined` | | | Descriptive text displayed below the label and above the input. Unlike the hint it is always visible, and it is linked to the input via `aria-describedby` (after any `errors` / `warnings`, before the `hint`). |
|
|
1344
|
+
| `direction` | `InputDirection \| undefined` | | | Direction of the layout of the component. Can either be a predefined value or a pattern separated by a space like `xx xxxxx`. |
|
|
1345
|
+
| `disabled` | `boolean \| undefined` | | | Disables the component. |
|
|
1346
|
+
| `disableWriting` | `boolean \| "mobile" \| "desktop" \| undefined` | | | Controls whether the search input is shown inside the dropdown panel. Use `'mobile'` / `'desktop'` to hide it on that platform only. |
|
|
1347
|
+
| `enforceCoherence` | `boolean \| undefined` | | | If coherence is enforced the input cannot have a modelValue that is incoherent with its current items. modelValue will be reset upon incoherence. |
|
|
1348
|
+
| `errors` | `string \| string[] \| undefined` | | | Can be a string or an array of string containing the messages to display. They render in an `aria-live="polite"` region (announced when they appear) and, while the list is non-empty, are referenced FIRST from the control's `aria-describedby… |
|
|
1349
|
+
| `filterBy` | `string[] \| undefined` | | | Property paths used to filter options when the user types in the search input. When empty (default) options are matched against their display text. When non-empty the provided paths are searched instead of the display text. To disable filte… |
|
|
1350
|
+
| `groupBy` | `string \| ((item: T) => string \| number \| symbol) \| undefined` | | | Path to item property for grouping options. |
|
|
1351
|
+
| `hasErrors` | `boolean \| undefined` | | | Define if the component should be in an error state. It usually attaches a CSS class for styling purposes. |
|
|
1352
|
+
| `hasWarning` | `boolean \| undefined` | | | Define if the component should be in a warning state. Same chrome as errors with `--bb-warn`; errors take priority. |
|
|
1353
|
+
| `headerHeight` | `number \| undefined` | | | Height of group headers in the listbox (px). Defaults to 24px (compact) or 32px. Only applies when `groupBy` is set. |
|
|
1354
|
+
| `hideLabel` | `boolean \| undefined` | | | Visually hides the label of the input while maintaining accessibility. |
|
|
1355
|
+
| `hint` | `string \| undefined` | | | Text box to be displayed near the input, usually to indicate instructions. |
|
|
1356
|
+
| `id` | `string \| undefined` | | | The identifier of the component. |
|
|
1357
|
+
| `itemHeight` | `number \| undefined` | | | Height of the options in the listbox. By default it will be 32px for the compact variant and 40px for the regular variant. |
|
|
1358
|
+
| `items` | `T[] \| ((query: string, prefill: boolean, modelValue: any) => Promise<T[]>) \| ((query: string, prefill: boolean, modelValue: any) => T[])` | | yes | Used to retrieve items; can be an array or a function. |
|
|
1359
|
+
| `itemText` | `ItemAccessor<T, string> \| undefined` | | | Defines a path that returns a property of the object to use as text or a function that returns a string. |
|
|
1360
|
+
| `itemValue` | `ItemAccessor<T> \| undefined` | | | Defines a path that returns a property of the object to use as value or a function that returns any value. |
|
|
1361
|
+
| `label` | `string` | | yes | Text content of the label of the element. |
|
|
1362
|
+
| `labelMode` | `"floating" \| "outside" \| "inside" \| undefined` | | | Label rendering mode. |
|
|
1363
|
+
| `labelPosition` | `"left" \| "center" \| "right" \| undefined` | | | Sets the text alignment of the label. |
|
|
1364
|
+
| `loading` | `boolean \| undefined` | | | Sets the component in a loading state, usually triggering some visual styles. |
|
|
1365
|
+
| `loadingText` | `string \| undefined` | | | String displayed while items are being loaded. |
|
|
1366
|
+
| `max` | `number \| undefined` | | | Maximum number of selectable items when the multiple flag is set. |
|
|
1367
|
+
| `maxSelectedLabels` | `number \| undefined` | | | Maximum number of labels shown before collapsing to a count summary. |
|
|
1368
|
+
| `modelValue` | `any` | | yes | Used by v-model. Can be any serializable type. |
|
|
1369
|
+
| `modelValueDebounceTime` | `number \| undefined` | | | Timeout used to debounce response to changes to modelValue. |
|
|
1370
|
+
| `multiple` | `boolean \| undefined` | | | Allows the selection of multiple items. |
|
|
1371
|
+
| `name` | `string \| undefined` | | | Defines the name of the input. |
|
|
1372
|
+
| `noDataText` | `string \| undefined` | | | String displayed when there are no items to display. |
|
|
1373
|
+
| `offCanvasProps` | `Partial<BbOffCanvasProps> \| undefined` | | | Extra props forwarded to the `BbOffCanvas` sheet when `adaptive` is active on mobile. |
|
|
1374
|
+
| `persistentHint` | `boolean \| undefined` | | | Keeps the hint displayed. |
|
|
1375
|
+
| `placeholder` | `string \| undefined` | | | String displayed when there's no data. |
|
|
1376
|
+
| `prefill` | `boolean \| "interaction" \| undefined` | `undefined` | | Controls when items are pre-loaded. `'interaction'` loads on the first user interaction, `true` loads immediately on mount, `false` is *search-first*: with a provider, nothing is fetched until the user types — opening alone does not load, a… |
|
|
1377
|
+
| `prepend:icon` | `string \| undefined` | | | Name of the icon to be added at the start of the input. |
|
|
1378
|
+
| `queryDebounceTime` | `number \| undefined` | | | Time to wait when the user stops writing in the input before querying data. |
|
|
1379
|
+
| `readonly` | `boolean \| undefined` | | | Sets the input in a readonly state. |
|
|
1380
|
+
| `required` | `boolean \| undefined` | | | Sets the input as required. |
|
|
1381
|
+
| `reverse` | `boolean \| undefined` | | | Reverses the layout. Applicable in every direction the order of the label and the input is swapped. |
|
|
1382
|
+
| `selectable` | `boolean \| ((item: T) => boolean) \| undefined` | `true` | | Defines whether options are selectable. Can be a global boolean that affects all options or a function that accepts an item and returns a boolean that only affects that item. Non-selectable options are rendered disabled. |
|
|
1383
|
+
| `selectedLabelsFn` | `((count: number) => string) \| undefined` | | | Function that returns a string to be displayed when the number of selected labels is greater than `maxSelectedLabels`. |
|
|
1384
|
+
| `stash` | `boolean \| undefined` | | | Adds a stash to accumulate selected values across searches. |
|
|
1385
|
+
| `transitionDuration` | `number \| undefined` | | | How long the transition has to last in milliseconds. |
|
|
1386
|
+
| `warnings` | `string \| string[] \| undefined` | | | Warning messages to display beneath the field, in their own `aria-live` region and amber (`--bb-warn`). A string or array; a non-empty list implies the warning state. Errors suppress warnings when both are set. While displayed they are also… |
|
|
1387
|
+
|
|
1388
|
+
## Events
|
|
1389
|
+
|
|
1390
|
+
- `active` — `(e: "active"): void`
|
|
1391
|
+
- `blur` — `(e: "blur", event: FocusEvent): void`
|
|
1392
|
+
- `change` — `(e: "change", event: Event): void`
|
|
1393
|
+
- `click` — `(e: "click", event: MouseEvent): void`
|
|
1394
|
+
- `focus` — `(e: "focus", event: FocusEvent): void`
|
|
1395
|
+
- `inactive` — `(e: "inactive"): void`
|
|
1396
|
+
- `input` — `(e: "input", event: Event): void`
|
|
1397
|
+
- `option:add` — `(e: "option:add", text: string): void`
|
|
1398
|
+
- `update:modelValue` — `(e: "update:modelValue", value: any): void`
|
|
1399
|
+
|
|
1400
|
+
## Slots
|
|
1401
|
+
|
|
1402
|
+
- `append` — scope: `{ query: string; focus: () => void; close: () => Promise<void>; }` — Content appended inside the input field, after the value area.
|
|
1403
|
+
- `append-outer` — scope: `{ query: string; close: () => Promise<void>; }` — Content appended outside the input field wrapper.
|
|
1404
|
+
- `footer` — scope: `BbSelectPanelSlotProps` — Content pinned to the bottom of the options panel, below the options list. Rendered in both the desktop popover and the adaptive sheet.
|
|
1405
|
+
- `group` — scope: `BbSelectGroupSlotProps<T>` — Replaces the default group header rendered above grouped options.
|
|
1406
|
+
- `header` — scope: `BbSelectPanelSlotProps` — Content pinned to the top of the options panel, above the search field. Rendered in both the desktop popover and the adaptive sheet.
|
|
1407
|
+
- `label` — scope: `BbSelectLabelSlotProps` — Replaces the default label text rendered above the input.
|
|
1408
|
+
- `loading` — scope: `{ query: string; }` — Content shown inside the options dropdown while items are loading.
|
|
1409
|
+
- `no-data` — scope: `{ query: string; focus: () => void; }` — Content shown when no options match the query or the list is empty.
|
|
1410
|
+
- `option` — scope: `BbSelectOptionSlotProps<T>` — Replaces the default rendering of each option row in the dropdown.
|
|
1411
|
+
- `prefix` — scope: `object` — Content rendered as an inline prefix inside the input field.
|
|
1412
|
+
- `prepend` — scope: `{ query: string; focus: () => void; close: () => Promise<void>; }` — Content prepended inside the input field, before the value area.
|
|
1413
|
+
- `prepend-outer` — scope: `{ query: string; close: () => Promise<void>; }` — Content prepended outside the input field wrapper.
|
|
1414
|
+
- `suffix` — scope: `object` — Content rendered as an inline suffix inside the input field.
|
|
1415
|
+
|
|
1416
|
+
## Validated variant
|
|
1417
|
+
|
|
1418
|
+
Importing this component from `bitboss-ui/validated` instead of `bitboss-ui` binds it to a vee-validate field. Same props, same events, same slots — plus the ones below. Requires the `vee-validate` peer dependency and a `<BbForm>` (or `useForm()`) ancestor. Full guide: [validated-forms](./guides/validated-forms.md).
|
|
1419
|
+
|
|
1420
|
+
| Prop | Type | Description |
|
|
1421
|
+
| --- | --- | --- |
|
|
1422
|
+
| `rules` | `RuleExpression<any>` | vee-validate rules for this field. |
|
|
1423
|
+
| `validateOn` | `ValidateTiming[] \| undefined` | Which interactions trigger validation (see `ValidatedFieldProps.validateOn` for the timing vocabulary). |
|
|
1424
|
+
| `vid` | `string \| undefined` | Explicit vee-validate field name. **Usually omit it** — the name is derived automatically from the control's `label`/`legend`. Only set `vid` when that derivation wouldn't be unique (e.g. v-for rows, or array `v-model`s that share a label).… |
|
|
1425
|
+
|
|
1426
|
+
## See Also
|
|
1427
|
+
|
|
1428
|
+
- [BbSelectPopover](./BbSelectPopover.md) — Provides popover-driven option selection and search.
|
|
1429
|
+
- [BbCheckboxGroup](./BbCheckboxGroup.md) — Manages multiple checkbox options as a group.
|
|
1430
|
+
- [BbRadioGroup](./BbRadioGroup.md) — Coordinates exclusive selection among radio options.
|