bitboss-ui 3.0.0-beta.2 → 3.0.0-beta.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +72 -33
- package/dist/ai/BbAccordion.md +3 -3
- package/dist/ai/BbAlert.md +9 -5
- package/dist/ai/BbAsterisk.md +17 -0
- package/dist/ai/BbAvatar.md +12 -3
- package/dist/ai/BbBadge.md +15 -10
- package/dist/ai/BbBadgeButton.md +16 -16
- package/dist/ai/BbBaseButton.md +16 -16
- package/dist/ai/BbBaseCheckbox.md +8 -8
- package/dist/ai/BbBaseCheckboxGroup.md +13 -13
- package/dist/ai/BbBaseCheckboxIcon.md +26 -9
- package/dist/ai/BbBaseColorInput.md +11 -11
- package/dist/ai/BbBaseDatePicker.md +6 -6
- package/dist/ai/BbBaseDatePickerInput.md +15 -15
- package/dist/ai/BbBaseInputContainer.md +12 -12
- package/dist/ai/BbBaseNumberInput.md +8 -8
- package/dist/ai/BbBaseRadio.md +5 -5
- package/dist/ai/BbBaseRadioGroup.md +7 -7
- package/dist/ai/BbBaseRadioIcon.md +25 -9
- package/dist/ai/BbBaseRating.md +5 -5
- package/dist/ai/BbBaseSelect.md +22 -21
- package/dist/ai/BbBaseSlider.md +9 -9
- package/dist/ai/BbBaseSwitch.md +8 -8
- package/dist/ai/BbBaseSwitchGroup.md +13 -13
- package/dist/ai/BbBaseSwitchIcon.md +28 -10
- package/dist/ai/BbBaseTag.md +10 -10
- package/dist/ai/BbBaseTextInput.md +9 -9
- package/dist/ai/BbBaseTextarea.md +9 -9
- package/dist/ai/BbBaseTimePickerInput.md +13 -13
- package/dist/ai/BbBreadcrumbs.md +2 -2
- package/dist/ai/BbButton.md +15 -15
- package/dist/ai/BbCheckbox.md +18 -17
- package/dist/ai/BbCheckboxGroup.md +15 -14
- package/dist/ai/BbCollapsible.md +11 -9
- package/dist/ai/BbColorInput.md +15 -15
- package/dist/ai/BbColorPalette.md +12 -6
- package/dist/ai/BbConfirm.md +12 -5
- package/dist/ai/BbDatePicker.md +13 -13
- package/dist/ai/BbDatePickerInput.md +20 -20
- package/dist/ai/BbDialog.md +78 -12
- package/dist/ai/BbDropdown.md +132 -22
- package/dist/ai/BbDropdownButton.md +12 -12
- package/dist/ai/BbDropdownGroup.md +1 -1
- package/dist/ai/BbDropzone.md +4 -4
- package/dist/ai/BbForm.md +49 -14
- package/dist/ai/BbIcon.md +6 -0
- package/dist/ai/BbIndicator.md +5 -5
- package/dist/ai/BbNumberInput.md +11 -11
- package/dist/ai/BbOffCanvas.md +90 -20
- package/dist/ai/BbPagination.md +3 -3
- package/dist/ai/BbPopover.md +32 -17
- package/dist/ai/BbProgress.md +7 -4
- package/dist/ai/BbRadio.md +16 -15
- package/dist/ai/BbRadioGroup.md +20 -17
- package/dist/ai/BbRating.md +11 -11
- package/dist/ai/BbSelect.md +138 -37
- package/dist/ai/BbSelectPopover.md +40 -41
- package/dist/ai/BbSlider.md +37 -22
- package/dist/ai/BbSmoothHeight.md +1 -1
- package/dist/ai/BbSwitch.md +25 -10
- package/dist/ai/BbSwitchGroup.md +17 -14
- package/dist/ai/BbTable.md +920 -109
- package/dist/ai/BbTabs.md +28 -14
- package/dist/ai/BbTabsList.md +1 -1
- package/dist/ai/BbTabsPanes.md +1 -1
- package/dist/ai/BbTabsRoot.md +10 -10
- package/dist/ai/BbTag.md +14 -14
- package/dist/ai/BbTextInput.md +16 -15
- package/dist/ai/BbTextarea.md +13 -13
- package/dist/ai/BbTimePicker.md +10 -10
- package/dist/ai/BbTimePickerInput.md +17 -17
- package/dist/ai/BbToast.md +1 -1
- package/dist/ai/BbToastPortal.md +1 -1
- package/dist/ai/BbTooltip.md +12 -10
- package/dist/ai/BbTree.md +1 -1
- package/dist/ai/ChipsBox.md +1 -1
- package/dist/ai/CommonInputWrapper.md +10 -10
- package/dist/ai/CommonPopover.md +6 -6
- package/dist/ai/FlatListBox.md +5 -5
- package/dist/ai/GroupedListBox.md +5 -5
- package/dist/ai/ListBox.md +4 -4
- package/dist/ai/OptionsContainer.md +4 -4
- package/dist/ai/changelog.json +128 -2
- package/dist/ai/components.json +917 -100
- package/dist/ai/composables/useBbConfig.md +72 -11
- package/dist/ai/composables/useConfirm.md +5 -3
- package/dist/ai/guides/ai-router.md +9 -4
- package/dist/ai/guides/component-picker.md +18 -18
- package/dist/ai/guides/design-language.md +14 -14
- package/dist/ai/guides/design-tokens.md +25 -18
- package/dist/ai/guides/fetch-items-playbook.md +1 -1
- package/dist/ai/guides/icons-policy.md +11 -5
- package/dist/ai/guides/installation-and-plugin-setup.md +85 -23
- package/dist/ai/guides/migration/components/bb-checkbox-group.md +30 -0
- package/dist/ai/guides/migration/components/bb-checkbox.md +37 -3
- package/dist/ai/guides/migration/components/bb-collapsible.md +5 -5
- package/dist/ai/guides/migration/components/bb-dialog.md +62 -34
- package/dist/ai/guides/migration/components/bb-offcanvas.md +29 -13
- package/dist/ai/guides/migration/components/bb-rating.md +8 -2
- package/dist/ai/guides/migration/components/bb-select.md +5 -2
- package/dist/ai/guides/migration/components/bb-table.md +560 -28
- package/dist/ai/guides/migration/components/bb-text-input.md +6 -6
- package/dist/ai/guides/migration/v2-to-v3.md +260 -89
- package/dist/ai/guides/ssr-prefill.md +120 -0
- package/dist/ai/index.md +10 -9
- package/dist/ai/recipes/inertia/approvals-inbox.md +0 -1
- package/dist/ai/recipes/inertia/inline-edit-workspace.md +0 -1
- package/dist/ai/recipes/inertia/layout-scaffold.md +5 -1
- package/dist/ai/recipes/inertia/ownership-atlas.md +49 -29
- package/dist/ai/recipes/inertia/record-form.md +0 -1
- package/dist/ai/recipes/inertia/records-workspace.md +26 -8
- package/dist/ai/recipes/inertia/upload-center.md +0 -1
- package/dist/ai/recipes/nuxt/approvals-inbox.md +0 -1
- package/dist/ai/recipes/nuxt/inline-edit-workspace.md +0 -1
- package/dist/ai/recipes/nuxt/layout-scaffold.md +5 -1
- package/dist/ai/recipes/nuxt/record-form.md +0 -1
- package/dist/ai/recipes/nuxt/records-workspace.md +26 -8
- package/dist/ai/recipes/nuxt/upload-center.md +0 -1
- package/dist/ai/recipes/vue/approvals-inbox.md +0 -1
- package/dist/ai/recipes/vue/inline-edit-workspace.md +0 -1
- package/dist/ai/recipes/vue/layout-scaffold.md +5 -1
- package/dist/ai/recipes/vue/records-workspace.md +26 -8
- package/dist/ai/recipes/vue/upload-center.md +0 -1
- package/dist/ai/source/BbAlert.md +60 -2
- package/dist/ai/source/BbAvatar.md +3 -3
- package/dist/ai/source/BbBadge.md +60 -15
- package/dist/ai/source/BbBadgeButton.md +8 -2
- package/dist/ai/source/BbBaseButton.md +3 -1
- package/dist/ai/source/BbBaseCheckboxGroup.md +6 -2
- package/dist/ai/source/BbBaseDatePicker.md +3 -1
- package/dist/ai/source/BbBaseDatePickerInput.md +5 -1
- package/dist/ai/source/BbBaseInputContainer.md +52 -1
- package/dist/ai/source/BbBaseRadioGroup.md +4 -0
- package/dist/ai/source/BbBaseRating.md +3 -1
- package/dist/ai/source/BbBaseSelect.md +71 -16
- package/dist/ai/source/BbBaseSwitchGroup.md +4 -0
- package/dist/ai/source/BbBaseTimePickerInput.md +5 -1
- package/dist/ai/source/BbBreadcrumbs.md +31 -0
- package/dist/ai/source/BbButton.md +51 -24
- package/dist/ai/source/BbCheckbox.md +15 -1
- package/dist/ai/source/BbCheckboxGroup.md +2 -1
- package/dist/ai/source/BbCollapsible.md +7 -1
- package/dist/ai/source/BbColorInput.md +3 -4
- package/dist/ai/source/BbColorPalette.md +3 -4
- package/dist/ai/source/BbDatePicker.md +5 -1
- package/dist/ai/source/BbDatePickerInput.md +5 -1
- package/dist/ai/source/BbDialog.md +175 -19
- package/dist/ai/source/BbDropdown.md +376 -69
- package/dist/ai/source/BbDropdownGroup.md +330 -59
- package/dist/ai/source/BbForm.md +93 -5
- package/dist/ai/source/BbIcon.md +46 -36
- package/dist/ai/source/BbNumberInput.md +3 -4
- package/dist/ai/source/BbOffCanvas.md +474 -194
- package/dist/ai/source/BbPopover.md +24 -17
- package/dist/ai/source/BbProgress.md +2 -2
- package/dist/ai/source/BbRadio.md +15 -1
- package/dist/ai/source/BbRadioGroup.md +3 -1
- package/dist/ai/source/BbSelect.md +50 -2
- package/dist/ai/source/BbSelectPopover.md +171 -23
- package/dist/ai/source/BbSlider.md +3 -4
- package/dist/ai/source/BbSwitch.md +15 -1
- package/dist/ai/source/BbSwitchGroup.md +8 -5
- package/dist/ai/source/BbTable.md +5092 -1446
- package/dist/ai/source/BbTabs.md +6 -7
- package/dist/ai/source/BbTabsList.md +6 -7
- package/dist/ai/source/BbTabsPanes.md +6 -7
- package/dist/ai/source/BbTabsRoot.md +6 -7
- package/dist/ai/source/BbTag.md +3 -4
- package/dist/ai/source/BbTextInput.md +3 -4
- package/dist/ai/source/BbTextarea.md +3 -4
- package/dist/ai/source/BbTimePicker.md +4 -1
- package/dist/ai/source/BbTimePickerInput.md +5 -1
- package/dist/ai/source/BbToast.md +3 -1
- package/dist/ai/source/BbTooltip.md +5 -1
- package/dist/ai/source/CommonInputWrapper.md +4 -0
- package/dist/ai/source/CommonPopover.md +6 -0
- package/dist/ai/source/FlatListBox.md +11 -5
- package/dist/ai/source/GroupedListBox.md +7 -5
- package/dist/components/BbAlert/BbAlert.vue_vue_type_script_setup_true_lang.js +4 -4
- package/dist/components/BbAlert/types.d.ts +10 -1
- package/dist/components/BbAvatar/BbAvatar.vue.d.ts +1 -1
- package/dist/components/BbAvatar/BbAvatar.vue_vue_type_script_setup_true_lang.js +33 -33
- package/dist/components/BbBadge/BadgeBodyContent.vue_vue_type_script_setup_true_lang.js +22 -16
- package/dist/components/BbBadge/BbBadge.vue_vue_type_script_setup_true_lang.js +36 -15
- package/dist/components/BbBadge/badgeButtonContext.d.ts +21 -8
- package/dist/components/BbBadge/types.d.ts +8 -2
- package/dist/components/BbBaseButton/BbBaseButton.vue_vue_type_script_setup_true_lang.js +47 -47
- package/dist/components/BbBaseButton/RouterComponent.vue_vue_type_script_setup_true_lang.js +14 -14
- package/dist/components/BbBaseCheckboxGroup/BbBaseCheckboxGroup.vue_vue_type_script_setup_true_lang.js +30 -28
- package/dist/components/BbBaseCheckboxGroup/types.d.ts +2 -2
- package/dist/components/BbBaseDatePicker/BbBaseDatePicker.vue_vue_type_script_setup_true_lang.js +167 -167
- package/dist/components/BbBaseDatePicker/BbBaseDatePickerInputDaySelector.vue.d.ts +9 -9
- package/dist/components/BbBaseDatePicker/BbBaseDatePickerInputDaySelector.vue_vue_type_script_setup_true_lang.js +78 -78
- package/dist/components/BbBaseDatePicker/BbBaseDatePickerMonthSelector.vue_vue_type_script_setup_true_lang.js +64 -64
- package/dist/components/BbBaseDatePickerInput/BbBaseDatePickerInput.vue.d.ts +1 -1
- package/dist/components/BbBaseDatePickerInput/BbBaseDatePickerInput.vue_vue_type_script_setup_true_lang.js +138 -138
- package/dist/components/BbBaseInputContainer/BbBaseInputContainer.vue_vue_type_script_setup_true_lang.js +2 -2
- package/dist/components/BbBaseRadioGroup/BbBaseRadioGroup.vue_vue_type_script_setup_true_lang.js +24 -22
- package/dist/components/BbBaseRating/BbBaseRating.vue_vue_type_script_setup_true_lang.js +40 -40
- package/dist/components/BbBaseSelect/BbBaseSelect.vue_vue_type_script_setup_true_lang.js +74 -65
- package/dist/components/BbBaseSelect/types.d.ts +22 -0
- package/dist/components/BbBaseSlider/BbBaseSlider.vue_vue_type_script_setup_true_lang.js +5 -5
- package/dist/components/BbBaseSwitchGroup/BbBaseSwitchGroup.vue_vue_type_script_setup_true_lang.js +30 -28
- package/dist/components/BbBaseTimePickerInput/BbBaseTimePickerInput.vue.d.ts +1 -1
- package/dist/components/BbBaseTimePickerInput/BbBaseTimePickerInput.vue_vue_type_script_setup_true_lang.js +104 -104
- package/dist/components/BbBreadcrumbs/BbBreadcrumbs.vue_vue_type_script_setup_true_lang.js +35 -35
- package/dist/components/BbButton/BbButton.vue_vue_type_script_setup_true_lang.js +85 -81
- package/dist/components/BbCheckboxGroup/types.d.ts +2 -1
- package/dist/components/BbCollapsible/types.d.ts +7 -1
- package/dist/components/BbColorInput/BbColorInput.vue.d.ts +1 -1
- package/dist/components/BbColorInput/BbColorInput.vue_vue_type_script_setup_true_lang.js +18 -18
- package/dist/components/BbColorPalette/BbColorPalette.vue.d.ts +2 -2
- package/dist/components/BbColorPalette/BbColorPalette.vue_vue_type_script_setup_true_lang.js +50 -50
- package/dist/components/BbConfirm/BbConfirm.vue_vue_type_script_setup_true_lang.js +17 -17
- package/dist/components/BbDatePicker/BbDatePicker.vue.d.ts +1 -1
- package/dist/components/BbDatePicker/BbDatePicker.vue_vue_type_script_setup_true_lang.js +100 -100
- package/dist/components/BbDatePickerInput/BbDatePickerInput.vue_vue_type_script_setup_true_lang.js +21 -21
- package/dist/components/BbDialog/BbDialog.vue.d.ts +1 -1
- package/dist/components/BbDialog/BbDialog.vue_vue_type_script_setup_true_lang.js +133 -107
- package/dist/components/BbDialog/types.d.ts +29 -2
- package/dist/components/BbDropdown/AdaptiveDropdown.vue.d.ts +2 -0
- package/dist/components/BbDropdown/AdaptiveDropdown.vue_vue_type_script_setup_true_lang.js +99 -100
- package/dist/components/BbDropdown/BbDropdown.vue.d.ts +2 -2
- package/dist/components/BbDropdown/BbDropdown.vue_vue_type_script_setup_true_lang.js +208 -201
- package/dist/components/BbDropdown/BbDropdownList.vue_vue_type_script_setup_true_lang.js +225 -208
- package/dist/components/BbDropdown/DropdownPipelineResolver.vue_vue_type_script_setup_true_lang.js +21 -21
- package/dist/components/BbDropdown/types.d.ts +20 -5
- package/dist/components/BbDropdownButton/BbDropdownButton.vue_vue_type_script_setup_true_lang.js +5 -5
- package/dist/components/BbIcon/BbIcon.vue_vue_type_script_setup_true_lang.js +46 -46
- package/dist/components/BbIcon/iconCache.d.ts +33 -0
- package/dist/components/BbIcon/iconCache.js +17 -0
- package/dist/components/BbNumberInput/BbNumberInput.vue.d.ts +1 -1
- package/dist/components/BbNumberInput/BbNumberInput.vue_vue_type_script_setup_true_lang.js +15 -15
- package/dist/components/BbOffCanvas/BbOffCanvas.vue.d.ts +1 -1
- package/dist/components/BbOffCanvas/BbOffCanvas.vue_vue_type_script_setup_true_lang.js +254 -208
- package/dist/components/BbOffCanvas/types.d.ts +30 -5
- package/dist/components/BbPagination/BbPagination.vue.d.ts +1 -1
- package/dist/components/BbPopover/BbPopover.vue.d.ts +2 -2
- package/dist/components/BbPopover/BbPopover.vue_vue_type_script_setup_true_lang.js +149 -146
- package/dist/components/BbPopover/types.d.ts +3 -2
- package/dist/components/BbRadioGroup/types.d.ts +3 -1
- package/dist/components/BbSelect/BbSelect.vue_vue_type_script_setup_true_lang.js +27 -23
- package/dist/components/BbSelect/types.d.ts +32 -0
- package/dist/components/BbSelectPopover/BbSelectPopover.vue_vue_type_script_setup_true_lang.js +221 -213
- package/dist/components/BbSlider/BbSlider.vue.d.ts +1 -1
- package/dist/components/BbSlider/BbSlider.vue_vue_type_script_setup_true_lang.js +20 -20
- package/dist/components/BbTable/BbTable.vue.d.ts +10 -4
- package/dist/components/BbTable/BbTable.vue_vue_type_script_setup_true_lang.js +1433 -600
- package/dist/components/BbTable/BbTableDataRow.d.ts +162 -0
- package/dist/components/BbTable/BbTableDataRow.js +136 -0
- package/dist/components/BbTable/BbTableExpandRow.d.ts +73 -0
- package/dist/components/BbTable/BbTableExpandRow.js +52 -0
- package/dist/components/BbTable/types.d.ts +324 -111
- package/dist/components/BbTable/utils.d.ts +92 -4
- package/dist/components/BbTable/utils.js +71 -36
- package/dist/components/BbTabs/types.d.ts +0 -8
- package/dist/components/BbTag/BbTag.vue.d.ts +1 -1
- package/dist/components/BbTag/BbTag.vue_vue_type_script_setup_true_lang.js +18 -18
- package/dist/components/BbTextInput/BbTextInput.vue.d.ts +1 -1
- package/dist/components/BbTextInput/BbTextInput.vue_vue_type_script_setup_true_lang.js +18 -18
- package/dist/components/BbTextarea/BbTextarea.vue.d.ts +1 -1
- package/dist/components/BbTextarea/BbTextarea.vue_vue_type_script_setup_true_lang.js +54 -54
- package/dist/components/BbTimePicker/BbTimePicker.vue.d.ts +1 -1
- package/dist/components/BbTimePicker/BbTimePicker.vue_vue_type_script_setup_true_lang.js +80 -80
- package/dist/components/BbTimePickerInput/BbTimePickerInput.vue_vue_type_script_setup_true_lang.js +61 -61
- package/dist/components/BbToast/BbToast.vue_vue_type_script_setup_true_lang.js +17 -17
- package/dist/components/BbToast/BbToastMessage.vue_vue_type_script_setup_true_lang.js +13 -13
- package/dist/components/BbTooltip/types.d.ts +5 -1
- package/dist/components/ChipsBox/ChipsBox.vue_vue_type_script_setup_true_lang.js +17 -17
- package/dist/components/ClearableButton/ClearableButton.vue_vue_type_script_setup_true_lang.js +5 -5
- package/dist/components/CommonPopover/CommonPopover.vue_vue_type_script_setup_true_lang.js +2 -1
- package/dist/components/FlatListBox/FlatListBox.vue_vue_type_script_setup_true_lang.js +83 -83
- package/dist/components/GroupedListBox/GroupedListBox.vue_vue_type_script_setup_true_lang.js +56 -56
- package/dist/composables/useBaseOptions.js +30 -20
- package/dist/composables/useBbConfig.d.ts +27 -6
- package/dist/composables/useBbConfig.js +8 -2
- package/dist/composables/useConfig.d.ts +59 -0
- package/dist/composables/useConfig.js +9 -0
- package/dist/composables/useItemsGetter.d.ts +11 -0
- package/dist/composables/useItemsGetter.js +44 -18
- package/dist/composables/useLocale.js +10 -7
- package/dist/composables/useMobile.js +5 -5
- package/dist/composables/usePrefill.d.ts +21 -2
- package/dist/composables/usePrefill.js +25 -19
- package/dist/composables/useSsrState.d.ts +20 -0
- package/dist/composables/useSsrState.js +13 -0
- package/dist/composables/useTableWidthContext.d.ts +24 -4
- package/dist/composables/useTableWidthContext.js +31 -28
- package/dist/composables/useToast.js +5 -5
- package/dist/deprecation/ai-deprecations.json.d.ts +121 -11
- package/dist/deprecation/ai-deprecations.json.js +1 -1
- package/dist/directives/bbDropdown.d.ts +15 -4
- package/dist/directives/bbDropdown.js +31 -9
- package/dist/directives/createPopoverDirective.d.ts +62 -0
- package/dist/directives/createPopoverDirective.js +63 -23
- package/dist/i18n/locales/cs.json +4 -1
- package/dist/i18n/locales/da.json +4 -1
- package/dist/i18n/locales/de.json +4 -1
- package/dist/i18n/locales/el.json +4 -1
- package/dist/i18n/locales/en.json +4 -1
- package/dist/i18n/locales/es.json +4 -1
- package/dist/i18n/locales/fi.json +4 -1
- package/dist/i18n/locales/fr.json +4 -1
- package/dist/i18n/locales/hu.json +4 -1
- package/dist/i18n/locales/it.json +4 -1
- package/dist/i18n/locales/ja.json +4 -1
- package/dist/i18n/locales/ko.json +4 -1
- package/dist/i18n/locales/nb.json +4 -1
- package/dist/i18n/locales/nl.json +4 -1
- package/dist/i18n/locales/pl.json +4 -1
- package/dist/i18n/locales/pt.json +4 -1
- package/dist/i18n/locales/ro.json +4 -1
- package/dist/i18n/locales/ru.json +4 -1
- package/dist/i18n/locales/sv.json +4 -1
- package/dist/i18n/locales/tr.json +4 -1
- package/dist/i18n/locales/uk.json +4 -1
- package/dist/i18n/locales/zh-cn.json +4 -1
- package/dist/index.d.ts +7 -2
- package/dist/index.js +69 -67
- package/dist/llms-full.txt +3997 -1458
- package/dist/llms-medium.txt +140 -73
- package/dist/llms.txt +7 -6
- package/dist/locale-blueprint.json +4 -1
- package/dist/nuxt-auto-imports.d.ts +100 -0
- package/dist/nuxt-auto-imports.js +55 -0
- package/dist/nuxt-module.d.ts +22 -1
- package/dist/nuxt.js +22 -8
- package/dist/plugin.d.ts +10 -1
- package/dist/plugin.js +20 -19
- package/dist/runtime/nuxt-plugin.js +28 -21
- package/dist/styles.css +1 -1
- package/dist/utilities/misc/listboxMetrics.d.ts +3 -3
- package/dist/utilities/misc/listboxMetrics.js +2 -2
- package/dist/utilities/misc/ssrStateInjectionKey.d.ts +42 -0
- package/dist/utilities/misc/ssrStateInjectionKey.js +4 -0
- package/dist/validated/BbForm.vue_vue_type_script_setup_true_lang.js +45 -27
- package/dist/validated/BbSelect.vue.d.ts +2 -0
- package/dist/validated/BbSelect.vue_vue_type_script_setup_true_lang.js +1 -0
- package/dist/validated/useValidatedField.js +25 -23
- package/dist/vite.js +7 -3
- package/llms.txt +8 -7
- package/package.json +2 -2
- package/scripts/lib/eslint-plugin.d.ts +19 -1
- package/scripts/lib/eslint-plugin.mjs +155 -14
- package/scripts/lib/html-attributes.mjs +91 -0
- package/scripts/lib/validate-bb-markup.mjs +59 -11
- package/dist/assets/svgs/sort.svg_raw.js +0 -4
- package/dist/components/BbBadge/BadgeAppendIcon.vue.d.ts +0 -3
- package/dist/components/BbBadge/BadgeAppendIcon.vue.js +0 -5
- package/dist/components/BbBadge/BadgeAppendIcon.vue_vue_type_script_setup_true_lang.js +0 -22
|
@@ -17,12 +17,21 @@
|
|
|
17
17
|
}"
|
|
18
18
|
/>
|
|
19
19
|
|
|
20
|
+
<!--
|
|
21
|
+
`$attrs` is spread here as well as on the CommonPopover branch below
|
|
22
|
+
(Q18.15). `inheritAttrs: false` means nothing reaches either surface
|
|
23
|
+
unless it is spread explicitly, and this branch used to bind only its own
|
|
24
|
+
options — so a consumer `class` on `<BbPopover>` silently vanished below
|
|
25
|
+
768px, at exactly the breakpoint where the guide promises the slots carry
|
|
26
|
+
over unchanged. Vue merges the static class above with `$attrs.class`,
|
|
27
|
+
and the explicit bindings after it still win.
|
|
28
|
+
-->
|
|
20
29
|
<BbOffCanvas
|
|
21
30
|
v-if="useOffcanvas"
|
|
22
31
|
:id="popoverId"
|
|
23
32
|
v-model="isOpen"
|
|
24
33
|
class="bb-popover-offcanvas"
|
|
25
|
-
v-bind="offcanvasBindings"
|
|
34
|
+
v-bind="{ ...$attrs, ...offcanvasBindings }"
|
|
26
35
|
@hidden="onOffcanvasHidden"
|
|
27
36
|
@hide="emit('hide')"
|
|
28
37
|
@show="emit('show')"
|
|
@@ -74,7 +83,7 @@
|
|
|
74
83
|
v-bind="$attrs"
|
|
75
84
|
>
|
|
76
85
|
<template #default="{ availableHeight }">
|
|
77
|
-
<
|
|
86
|
+
<div
|
|
78
87
|
class="bb-popover__panel"
|
|
79
88
|
:class="{ 'bb-popover__panel--scrollable': scrollable }"
|
|
80
89
|
:inert="panelInert"
|
|
@@ -85,7 +94,7 @@
|
|
|
85
94
|
: undefined,
|
|
86
95
|
}"
|
|
87
96
|
>
|
|
88
|
-
<
|
|
97
|
+
<div v-if="$slots.header" class="bb-popover__header">
|
|
89
98
|
<slot
|
|
90
99
|
:close="close"
|
|
91
100
|
:disabled="!!disabled"
|
|
@@ -93,16 +102,16 @@
|
|
|
93
102
|
:open="isOpen"
|
|
94
103
|
:placement="placement"
|
|
95
104
|
/>
|
|
96
|
-
</
|
|
97
|
-
<
|
|
105
|
+
</div>
|
|
106
|
+
<div class="bb-popover__content scrollbar-border">
|
|
98
107
|
<slot
|
|
99
108
|
:close="close"
|
|
100
109
|
:disabled="!!disabled"
|
|
101
110
|
:open="isOpen"
|
|
102
111
|
:placement="placement"
|
|
103
112
|
/>
|
|
104
|
-
</
|
|
105
|
-
<
|
|
113
|
+
</div>
|
|
114
|
+
<div v-if="$slots.footer" class="bb-popover__footer">
|
|
106
115
|
<slot
|
|
107
116
|
:close="close"
|
|
108
117
|
:disabled="!!disabled"
|
|
@@ -110,8 +119,8 @@
|
|
|
110
119
|
:open="isOpen"
|
|
111
120
|
:placement="placement"
|
|
112
121
|
/>
|
|
113
|
-
</
|
|
114
|
-
</
|
|
122
|
+
</div>
|
|
123
|
+
</div>
|
|
115
124
|
</template>
|
|
116
125
|
</CommonPopover>
|
|
117
126
|
</template>
|
|
@@ -136,7 +145,7 @@ import { useElementSize, useIntersectionObserver } from '@vueuse/core';
|
|
|
136
145
|
import { useUntil } from '@/composables/useUntil';
|
|
137
146
|
import { useClosingInert } from '@/composables/useClosingInert';
|
|
138
147
|
import { useMobile } from '@/composables/useMobile';
|
|
139
|
-
import {
|
|
148
|
+
import { useConfig } from '@/composables/useConfig';
|
|
140
149
|
import CommonPopover from '../CommonPopover/CommonPopover.vue';
|
|
141
150
|
import BbOffCanvas from '../BbOffCanvas/BbOffCanvas.vue';
|
|
142
151
|
import { extractDomContainer } from '@/utilities/functions/extractDomContainer';
|
|
@@ -150,10 +159,8 @@ import type {
|
|
|
150
159
|
PopoverTrigger,
|
|
151
160
|
} from './types';
|
|
152
161
|
import { transitions } from '@/utilities/misc/transitions';
|
|
153
|
-
export type { BbPopoverProps, BbPopoverEvents, BbPopoverSlots, PopoverTrigger };
|
|
154
162
|
|
|
155
163
|
defineOptions({ inheritAttrs: false });
|
|
156
|
-
|
|
157
164
|
/**
|
|
158
165
|
* Used by v-model to open / close the popover. A popover with no `v-model`
|
|
159
166
|
* starts closed and is driven by its `trigger`.
|
|
@@ -161,7 +168,6 @@ defineOptions({ inheritAttrs: false });
|
|
|
161
168
|
* @defaultValue `false`
|
|
162
169
|
*/
|
|
163
170
|
const isOpen = defineModel<boolean>({ default: false });
|
|
164
|
-
|
|
165
171
|
const props = withDefaults(defineProps<BbPopoverProps>(), {
|
|
166
172
|
// Declared as `undefined` (not omitted) on purpose: it keeps `adaptive`
|
|
167
173
|
// three-state. Vue would otherwise cast an *absent* Boolean prop to `false`,
|
|
@@ -176,10 +182,10 @@ const props = withDefaults(defineProps<BbPopoverProps>(), {
|
|
|
176
182
|
transitionDuration: transitions.medium,
|
|
177
183
|
trigger: 'click',
|
|
178
184
|
});
|
|
179
|
-
|
|
180
185
|
const emit = defineEmits<BbPopoverEvents>();
|
|
181
|
-
|
|
182
186
|
defineSlots<BbPopoverSlots>();
|
|
187
|
+
const config = useConfig();
|
|
188
|
+
export type { BbPopoverProps, BbPopoverEvents, BbPopoverSlots, PopoverTrigger };
|
|
183
189
|
|
|
184
190
|
if (process.env.NODE_ENV !== 'production')
|
|
185
191
|
warnRemovedAttrs('BbPopover', removedPropsFor('BbPopover'));
|
|
@@ -691,7 +697,7 @@ export type BbPopoverProps = {
|
|
|
691
697
|
/**
|
|
692
698
|
* Overrides forwarded to the underlying `BbOffCanvas` when `adaptive` renders
|
|
693
699
|
* the sheet on mobile. Merged over the adaptive defaults
|
|
694
|
-
* (`
|
|
700
|
+
* (`side: 'bottom'`, `size: 'auto'`, `draggable: true`). Ignored when
|
|
695
701
|
* `adaptive` is `false`.
|
|
696
702
|
*/
|
|
697
703
|
offCanvasProps?: Partial<BbOffCanvasProps>;
|
|
@@ -703,7 +709,8 @@ export type BbPopoverProps = {
|
|
|
703
709
|
padding?: number;
|
|
704
710
|
/**
|
|
705
711
|
* Position of the popover relative to the activator.
|
|
706
|
-
* Use `'cursor'` to anchor at the mouse/touch coordinates
|
|
712
|
+
* Use `'cursor'` to anchor at the mouse/touch coordinates.
|
|
713
|
+
* (BbPopover never draws an arrow — arrows are tooltip-only in v3.)
|
|
707
714
|
*
|
|
708
715
|
* @defaultValue `'bottom'`
|
|
709
716
|
*/
|
|
@@ -126,8 +126,8 @@ export type BbProgressProps = {
|
|
|
126
126
|
* --track — track height (default 4px)
|
|
127
127
|
* --fill — bar color (default var(--bb-primary))
|
|
128
128
|
* Declared on the root (not read with a fallback) so a consumer override wins
|
|
129
|
-
* and an inherited --fill from an ancestor
|
|
130
|
-
*
|
|
129
|
+
* and an inherited --fill from an ancestor (any same-named local a consumer
|
|
130
|
+
* sets up-tree) is shadowed for this subtree instead of leaking into the bar.
|
|
131
131
|
*/
|
|
132
132
|
.bb-progress {
|
|
133
133
|
--track: 4px;
|
|
@@ -306,9 +306,23 @@ export type BbRadioSlots = {
|
|
|
306
306
|
.bb-base-input-container__layout--horizontal {
|
|
307
307
|
align-items: flex-start;
|
|
308
308
|
|
|
309
|
+
/*
|
|
310
|
+
* `align-items` + `min-height` are what pin the control to the
|
|
311
|
+
* LABEL'S FIRST LINE instead of the block centre — measured: with a
|
|
312
|
+
* 4-line label the control's mid sits exactly on the first line's
|
|
313
|
+
* mid, and 28px above the block centre.
|
|
314
|
+
*
|
|
315
|
+
* There used to be a `display: inline-flex` here too, and it was
|
|
316
|
+
* doing none of that vertical work — but it silently killed
|
|
317
|
+
* `input-position`, whose only lever is `justify-items` (a grid
|
|
318
|
+
* property, inert on a flex container). So a described row with
|
|
319
|
+
* `input-position="right"` painted its control at the START of the
|
|
320
|
+
* column: 182px out on a 198px column (Q20.2). Removing the one
|
|
321
|
+
* declaration restores left/center/right and leaves the vertical
|
|
322
|
+
* geometry byte-identical.
|
|
323
|
+
*/
|
|
309
324
|
.bb-base-input-container__control {
|
|
310
325
|
align-items: center;
|
|
311
|
-
display: inline-flex;
|
|
312
326
|
min-height: var(--bb-label-lh);
|
|
313
327
|
}
|
|
314
328
|
}
|
|
@@ -241,7 +241,9 @@ export type BbRadioGroupProps<T> = {
|
|
|
241
241
|
hasWarning?: boolean;
|
|
242
242
|
|
|
243
243
|
/**
|
|
244
|
-
* Visually hides
|
|
244
|
+
* Visually hides each option's label text (the text rendered next to every
|
|
245
|
+
* input) while keeping it accessible to screen readers.
|
|
246
|
+
* Does not affect the fieldset legend — use `hideLegend` for that.
|
|
245
247
|
*/
|
|
246
248
|
hideLabel?: boolean;
|
|
247
249
|
|
|
@@ -67,7 +67,7 @@
|
|
|
67
67
|
:multiple="multiple"
|
|
68
68
|
:name="name"
|
|
69
69
|
:no-data-text="noDataText"
|
|
70
|
-
:off-canvas-props="
|
|
70
|
+
:off-canvas-props="resolvedOffCanvasProps"
|
|
71
71
|
:placeholder="placeholder"
|
|
72
72
|
:prefill="prefill"
|
|
73
73
|
:prepend:icon="props['prepend:icon']"
|
|
@@ -116,6 +116,9 @@
|
|
|
116
116
|
<template #group="data">
|
|
117
117
|
<slot name="group" v-bind="data" />
|
|
118
118
|
</template>
|
|
119
|
+
<template #chip="data">
|
|
120
|
+
<slot name="chip" v-bind="data" />
|
|
121
|
+
</template>
|
|
119
122
|
</BaseSelect>
|
|
120
123
|
</template>
|
|
121
124
|
</BaseInputContainer>
|
|
@@ -126,7 +129,7 @@ import { computed, ref } from 'vue';
|
|
|
126
129
|
import BaseInputContainer from '../BbBaseInputContainer/BbBaseInputContainer.vue';
|
|
127
130
|
import BaseSelect from '../BbBaseSelect/BbBaseSelect.vue';
|
|
128
131
|
import { useMobile } from '@/composables/useMobile';
|
|
129
|
-
import {
|
|
132
|
+
import { useConfig } from '@/composables/useConfig';
|
|
130
133
|
import { removedPropsFor } from '@/deprecation/removedProps';
|
|
131
134
|
import { warnRemovedAttrs } from '@/utilities/functions/warnRemovedAttrs';
|
|
132
135
|
import { isNotEmpty } from '@/utilities/functions/isNotEmpty';
|
|
@@ -153,6 +156,8 @@ const emit = defineEmits<BbSelectEvents>();
|
|
|
153
156
|
|
|
154
157
|
defineSlots<BbSelectSlots<T>>();
|
|
155
158
|
|
|
159
|
+
const config = useConfig();
|
|
160
|
+
|
|
156
161
|
if (process.env.NODE_ENV !== 'production')
|
|
157
162
|
warnRemovedAttrs('BbSelect', removedPropsFor('BbSelect'));
|
|
158
163
|
|
|
@@ -167,6 +172,16 @@ const resolvedLabelMode = computed(
|
|
|
167
172
|
() => props.labelMode ?? config.defaultInputLabelMode
|
|
168
173
|
);
|
|
169
174
|
|
|
175
|
+
/**
|
|
176
|
+
* Sheet chrome: default the adaptive off-canvas title to the field label.
|
|
177
|
+
* Consumer `offCanvasProps` spread last so an explicit `title` (or any other
|
|
178
|
+
* sheet prop) still wins — same shape as BbSelectPopover's `offcanvasBindings`.
|
|
179
|
+
*/
|
|
180
|
+
const resolvedOffCanvasProps = computed(() => ({
|
|
181
|
+
title: props.label,
|
|
182
|
+
...props.offCanvasProps,
|
|
183
|
+
}));
|
|
184
|
+
|
|
170
185
|
/**
|
|
171
186
|
* These events are just propagated
|
|
172
187
|
*/
|
|
@@ -279,6 +294,8 @@ export type BbSelectProps<T> = {
|
|
|
279
294
|
|
|
280
295
|
/**
|
|
281
296
|
* Timeout used to debounce response to changes to dependencies.
|
|
297
|
+
*
|
|
298
|
+
* @defaultValue `0`
|
|
282
299
|
*/
|
|
283
300
|
depsDebounceTime?: number;
|
|
284
301
|
|
|
@@ -437,6 +454,8 @@ export type BbSelectProps<T> = {
|
|
|
437
454
|
|
|
438
455
|
/**
|
|
439
456
|
* Timeout used to debounce response to changes to modelValue.
|
|
457
|
+
*
|
|
458
|
+
* @defaultValue `0`
|
|
440
459
|
*/
|
|
441
460
|
modelValueDebounceTime?: number;
|
|
442
461
|
|
|
@@ -494,6 +513,8 @@ export type BbSelectProps<T> = {
|
|
|
494
513
|
|
|
495
514
|
/**
|
|
496
515
|
* Time to wait when the user stops writing in the input before querying data.
|
|
516
|
+
*
|
|
517
|
+
* @defaultValue `500`
|
|
497
518
|
*/
|
|
498
519
|
queryDebounceTime?: number;
|
|
499
520
|
|
|
@@ -530,6 +551,8 @@ export type BbSelectProps<T> = {
|
|
|
530
551
|
|
|
531
552
|
/**
|
|
532
553
|
* How long the transition has to last in milliseconds.
|
|
554
|
+
*
|
|
555
|
+
* @defaultValue `250`
|
|
533
556
|
*/
|
|
534
557
|
transitionDuration?: number;
|
|
535
558
|
};
|
|
@@ -583,6 +606,26 @@ export type BbSelectGroupSlotProps<T> = {
|
|
|
583
606
|
disabled: boolean;
|
|
584
607
|
};
|
|
585
608
|
|
|
609
|
+
/**
|
|
610
|
+
* Props exposed by the `chip` slot — called once per selected value in
|
|
611
|
+
* `multiple` mode, in place of the default badge.
|
|
612
|
+
*/
|
|
613
|
+
export type BbSelectChipSlotProps<T> = {
|
|
614
|
+
/** The selected item, exactly as it was supplied in `items`. */
|
|
615
|
+
item: T;
|
|
616
|
+
/** The item's resolved display text (what the default badge prints). */
|
|
617
|
+
text: string;
|
|
618
|
+
/** The item's resolved value — what sits in the v-model. */
|
|
619
|
+
value: any;
|
|
620
|
+
/**
|
|
621
|
+
* `true` while the select is disabled or readonly: the chip must not offer a
|
|
622
|
+
* way to remove itself, and `deselect` is a no-op.
|
|
623
|
+
*/
|
|
624
|
+
disabled: boolean;
|
|
625
|
+
/** Drops this value from the selection. No-op while `disabled`. */
|
|
626
|
+
deselect: () => void;
|
|
627
|
+
};
|
|
628
|
+
|
|
586
629
|
/**
|
|
587
630
|
* Props exposed by the `header` / `footer` panel slots — identical whether the
|
|
588
631
|
* select renders as a desktop popover or an adaptive bottom sheet.
|
|
@@ -646,6 +689,11 @@ export type BbSelectSlots<T> = {
|
|
|
646
689
|
* Replaces the default group header rendered above grouped options.
|
|
647
690
|
*/
|
|
648
691
|
group?: (props: BbSelectGroupSlotProps<T>) => any;
|
|
692
|
+
/**
|
|
693
|
+
* Replaces the default badge rendered for each selection in `multiple` mode.
|
|
694
|
+
* Not called in `comma` mode, nor for the collapsed "+N" summary.
|
|
695
|
+
*/
|
|
696
|
+
chip?: (props: BbSelectChipSlotProps<T>) => any;
|
|
649
697
|
/**
|
|
650
698
|
* Content rendered as an inline prefix inside the input field.
|
|
651
699
|
*/
|
|
@@ -48,6 +48,7 @@
|
|
|
48
48
|
:autocomplete="autocomplete"
|
|
49
49
|
class="bb-select-popover__search-input"
|
|
50
50
|
:inputmode="inputmode"
|
|
51
|
+
:placeholder="searchInputAriaLabel"
|
|
51
52
|
role="searchbox"
|
|
52
53
|
:tabindex="shown ? 0 : -1"
|
|
53
54
|
type="text"
|
|
@@ -150,8 +151,8 @@
|
|
|
150
151
|
</DefineOptions>
|
|
151
152
|
|
|
152
153
|
<!-- Mobile adaptive surface: a bottom sheet that reuses the search + options
|
|
153
|
-
verbatim
|
|
154
|
-
|
|
154
|
+
verbatim. In `multiple` mode it also surfaces the current selection as
|
|
155
|
+
removable chips above the search. -->
|
|
155
156
|
<BbOffCanvas
|
|
156
157
|
v-if="useOffcanvas"
|
|
157
158
|
v-model="shown"
|
|
@@ -162,6 +163,10 @@
|
|
|
162
163
|
<template v-if="$slots.header" #header>
|
|
163
164
|
<slot name="header" v-bind="panelSlotProps" />
|
|
164
165
|
</template>
|
|
166
|
+
<!-- `tabindex="-1"`: the sheet's own opening focus target. Not focusable
|
|
167
|
+
by Tab — only programmatically, by BbOffCanvas's `focusTarget`. See the
|
|
168
|
+
`focusTarget` note in `offcanvasBindings` for why the sheet focuses its
|
|
169
|
+
container rather than the search field or an option. -->
|
|
165
170
|
<div
|
|
166
171
|
class="bb-select-popover bb-select-popover--sheet"
|
|
167
172
|
:class="{
|
|
@@ -171,11 +176,13 @@
|
|
|
171
176
|
'bb-select-popover--reloading': isReloading,
|
|
172
177
|
'bb-select-popover--clearable-active': hasClearableValue,
|
|
173
178
|
}"
|
|
179
|
+
tabindex="-1"
|
|
174
180
|
>
|
|
175
|
-
<!-- Current selection
|
|
176
|
-
|
|
181
|
+
<!-- Current selection as removable chips — multiple only. Single relies
|
|
182
|
+
on the listbox checkmark; a chip above the search read as unexpected
|
|
183
|
+
chrome on a one-pick sheet (and single closes on pick anyway). -->
|
|
177
184
|
<div
|
|
178
|
-
v-if="selectedOptions.length"
|
|
185
|
+
v-if="multiple && selectedOptions.length"
|
|
179
186
|
class="bb-select-popover__sheet-selection"
|
|
180
187
|
>
|
|
181
188
|
<div class="bb-select-popover__sheet-chips">
|
|
@@ -294,7 +301,7 @@ import { useLocale } from '@/composables/useLocale';
|
|
|
294
301
|
import { useMobile } from '@/composables/useMobile';
|
|
295
302
|
import { provideSheetSurface } from '@/composables/useSheetSurface';
|
|
296
303
|
import { usePrefill } from '@/composables/usePrefill';
|
|
297
|
-
import {
|
|
304
|
+
import { useConfig } from '@/composables/useConfig';
|
|
298
305
|
import { useUntil } from '@/composables/useUntil';
|
|
299
306
|
import { useClosingInert } from '@/composables/useClosingInert';
|
|
300
307
|
import { wait } from '@/utilities/functions/wait';
|
|
@@ -351,6 +358,8 @@ const emit = defineEmits<BbSelectPopoverEvents>();
|
|
|
351
358
|
|
|
352
359
|
defineSlots<BbSelectPopoverSlots<Item>>();
|
|
353
360
|
|
|
361
|
+
const config = useConfig();
|
|
362
|
+
|
|
354
363
|
if (process.env.NODE_ENV !== 'production')
|
|
355
364
|
warnRemovedAttrs('BbSelectPopover', removedPropsFor('BbSelectPopover'));
|
|
356
365
|
|
|
@@ -778,6 +787,8 @@ const hasInteracted = ref(false);
|
|
|
778
787
|
const {
|
|
779
788
|
getter,
|
|
780
789
|
debouncedGetter,
|
|
790
|
+
clientReproducible,
|
|
791
|
+
hydratedFromSsr,
|
|
781
792
|
items: internalItems,
|
|
782
793
|
loading,
|
|
783
794
|
} = useItemsGetter({
|
|
@@ -830,6 +841,8 @@ const {
|
|
|
830
841
|
prefill: prefillItems,
|
|
831
842
|
markPrefilled,
|
|
832
843
|
} = usePrefill({
|
|
844
|
+
alreadyLoaded: hydratedFromSsr,
|
|
845
|
+
clientReproducible,
|
|
833
846
|
trigger: computed(
|
|
834
847
|
() =>
|
|
835
848
|
// Array `items` are never lazy: there is no request to defer, so waiting
|
|
@@ -1132,11 +1145,43 @@ const offcanvasBindings = computed(() => ({
|
|
|
1132
1145
|
side: 'bottom' as const,
|
|
1133
1146
|
size: 'auto' as const,
|
|
1134
1147
|
draggable: true,
|
|
1135
|
-
|
|
1136
|
-
|
|
1137
|
-
|
|
1138
|
-
|
|
1139
|
-
|
|
1148
|
+
/*
|
|
1149
|
+
* The sheet focuses ITSELF — not the search field, not an option.
|
|
1150
|
+
*
|
|
1151
|
+
* This surface only exists on mobile, and both of the obvious targets are
|
|
1152
|
+
* wrong there:
|
|
1153
|
+
*
|
|
1154
|
+
* - The search field raises the virtual keyboard the instant the sheet
|
|
1155
|
+
* starts animating in. The viewport resizes under a sheet that is still
|
|
1156
|
+
* moving, and the whole panel jumps. (The chip handlers a few lines up
|
|
1157
|
+
* already fight the same keyboard flicker from the other direction.)
|
|
1158
|
+
* - The first option paints a focus ring on a row the user has not chosen,
|
|
1159
|
+
* which on a touch surface reads as "already selected".
|
|
1160
|
+
*
|
|
1161
|
+
* So focus goes to the sheet container, the WAI-APG fallback when a dialog
|
|
1162
|
+
* has no natural first control: focus is inside the dialog, so the modal is
|
|
1163
|
+
* announced, Escape works, the trap holds, and closing returns focus to the
|
|
1164
|
+
* activator — with no keyboard and nothing pre-highlighted. Typing is one
|
|
1165
|
+
* tap away, which is how a touch user reaches a search field anyway.
|
|
1166
|
+
*
|
|
1167
|
+
* Known trade-off: arrow-key navigation is wired to the search input and
|
|
1168
|
+
* the focus proxy, so a hardware keyboard on a tablet must Tab into the
|
|
1169
|
+
* field first. The desktop popover — where a keyboard is the normal input —
|
|
1170
|
+
* is untouched and still focuses the field or the first option.
|
|
1171
|
+
*/
|
|
1172
|
+
focusTarget: '.bb-select-popover--sheet',
|
|
1173
|
+
/*
|
|
1174
|
+
* No ✕ on this sheet (owner's call). A bottom sheet already offers three
|
|
1175
|
+
* ways out that a touch user reaches first — drag it down, tap the
|
|
1176
|
+
* backdrop, or press Back/Escape — and the picker's own job (tap an option)
|
|
1177
|
+
* dismisses it too. The close control only added chrome above the search
|
|
1178
|
+
* field, in the one surface with the least room for it.
|
|
1179
|
+
*
|
|
1180
|
+
* Before the spread below, so `offCanvasProps: { hideClose: false }` still
|
|
1181
|
+
* brings it back.
|
|
1182
|
+
*/
|
|
1183
|
+
hideClose: true,
|
|
1184
|
+
|
|
1140
1185
|
disabled: props.disabled,
|
|
1141
1186
|
transitionDuration: props.transitionDuration,
|
|
1142
1187
|
// Name the modal sheet after its activator: with no `title` the dialog root
|
|
@@ -2004,7 +2049,9 @@ export type BbSelectPopoverSlots<Item> = {
|
|
|
2004
2049
|
## Styles
|
|
2005
2050
|
|
|
2006
2051
|
```css
|
|
2007
|
-
/* @inherit --transition-duration --option-height --option-font-size — set inline by the component
|
|
2052
|
+
/* @inherit --transition-duration --option-height --option-font-size — set inline by the component;
|
|
2053
|
+
@inherit --py --close-size — the adaptive sheet's rules target BbOffCanvas
|
|
2054
|
+
elements, which declare both on the panel */
|
|
2008
2055
|
.bb-select-popover {
|
|
2009
2056
|
overflow: visible;
|
|
2010
2057
|
text-align: left;
|
|
@@ -2087,6 +2134,13 @@ export type BbSelectPopoverSlots<Item> = {
|
|
|
2087
2134
|
padding: 0;
|
|
2088
2135
|
padding-right: calc(var(--bb-input-icon) + 0.5rem);
|
|
2089
2136
|
width: 100%;
|
|
2137
|
+
|
|
2138
|
+
/* Same cue BbDropdown's group search uses — empty field still reads as
|
|
2139
|
+
a search box when the lens alone is not enough. */
|
|
2140
|
+
&::placeholder {
|
|
2141
|
+
color: var(--bb-text-muted);
|
|
2142
|
+
opacity: 0.8;
|
|
2143
|
+
}
|
|
2090
2144
|
}
|
|
2091
2145
|
|
|
2092
2146
|
.bb-select-popover__search-icon {
|
|
@@ -2275,9 +2329,11 @@ export type BbSelectPopoverSlots<Item> = {
|
|
|
2275
2329
|
/* GroupedListBox virtualizes whole groups, so its options flow
|
|
2276
2330
|
inside the group box instead of being placed by the row
|
|
2277
2331
|
virtualizer. Must stay AFTER — or at least out-specify — the
|
|
2278
|
-
`position: absolute` below.
|
|
2332
|
+
`position: absolute` below. `relative`, not `static`: still in
|
|
2333
|
+
flow, but the row stays the containing block for its absolute
|
|
2334
|
+
selection check (see `-check` below). */
|
|
2279
2335
|
.bb-listbox__group > .bb-listbox__option {
|
|
2280
|
-
position:
|
|
2336
|
+
position: relative;
|
|
2281
2337
|
}
|
|
2282
2338
|
|
|
2283
2339
|
/* One block: the virtualizer's absolute positioning and the row's
|
|
@@ -2330,10 +2386,22 @@ export type BbSelectPopoverSlots<Item> = {
|
|
|
2330
2386
|
white-space: nowrap;
|
|
2331
2387
|
}
|
|
2332
2388
|
|
|
2389
|
+
/*
|
|
2390
|
+
* Selection check is out of flow. Every row mounts the glyph
|
|
2391
|
+
* (its stroke animates in when selected), so leaving it in the
|
|
2392
|
+
* flex row would reserve the icon + gap on EVERY row and make
|
|
2393
|
+
* unselected labels ellipsize as if something followed them.
|
|
2394
|
+
* Absolute + pad-only-when-selected lets an unselected label
|
|
2395
|
+
* use the full row — same treatment as BbDropdown's item check.
|
|
2396
|
+
*/
|
|
2333
2397
|
&-check {
|
|
2334
2398
|
color: var(--bb-text);
|
|
2335
|
-
flex-shrink: 0;
|
|
2336
2399
|
height: var(--option-font-size, var(--bb-fs));
|
|
2400
|
+
inset-inline-end: 0.5rem;
|
|
2401
|
+
pointer-events: none;
|
|
2402
|
+
position: absolute;
|
|
2403
|
+
top: 50%;
|
|
2404
|
+
transform: translateY(-50%);
|
|
2337
2405
|
width: var(--option-font-size, var(--bb-fs));
|
|
2338
2406
|
|
|
2339
2407
|
path {
|
|
@@ -2345,6 +2413,12 @@ export type BbSelectPopoverSlots<Item> = {
|
|
|
2345
2413
|
}
|
|
2346
2414
|
|
|
2347
2415
|
&--selected {
|
|
2416
|
+
/* Keep the label clear of the absolute check: row padding +
|
|
2417
|
+
the glyph + the gap the flex row used to supply. */
|
|
2418
|
+
padding-inline-end: calc(
|
|
2419
|
+
0.5rem + var(--option-font-size, var(--bb-fs)) + 0.5rem
|
|
2420
|
+
);
|
|
2421
|
+
|
|
2348
2422
|
.bb-listbox__option-check {
|
|
2349
2423
|
path {
|
|
2350
2424
|
stroke-dashoffset: 0;
|
|
@@ -2399,6 +2473,42 @@ export type BbSelectPopoverSlots<Item> = {
|
|
|
2399
2473
|
/* sits above the search. Declared after the base block so equal-specificity */
|
|
2400
2474
|
/* overrides (width, listbox max-height) win on source order. */
|
|
2401
2475
|
/* ------------------------------------------------------------------------- */
|
|
2476
|
+
|
|
2477
|
+
/* Picker chrome: centre the sheet title (BbSelect passes `label`) the same way
|
|
2478
|
+
BbDropdown centres its adaptive drill-in nav. Scoped to this off-canvas only —
|
|
2479
|
+
general OffCanvas / dialog titles stay start-aligned. `flex: 1` so
|
|
2480
|
+
`text-align: center` spans the header; when a consumer restores the ×,
|
|
2481
|
+
mirror its reserved right gutter on the left so the label stays visually
|
|
2482
|
+
centred. */
|
|
2483
|
+
.bb-select-popover-offcanvas .bb-offcanvas__title {
|
|
2484
|
+
flex: 1 1 auto;
|
|
2485
|
+
text-align: center;
|
|
2486
|
+
|
|
2487
|
+
&:has(~ .bb-close-button) {
|
|
2488
|
+
padding-left: calc(var(--close-size) + 4px);
|
|
2489
|
+
}
|
|
2490
|
+
}
|
|
2491
|
+
|
|
2492
|
+
/* Hairline under the title separates picker chrome from the body (search +
|
|
2493
|
+
options). The search field no longer carries that role — see the sheet
|
|
2494
|
+
search restyle below. */
|
|
2495
|
+
.bb-select-popover-offcanvas .bb-offcanvas__header {
|
|
2496
|
+
/* Default OffCanvas bottoms the header at half `--py`; full `--py` opened
|
|
2497
|
+
too much air above the rule. Nudge two pixels under full for a tighter
|
|
2498
|
+
title→divider read without collapsing back to the jammed half. */
|
|
2499
|
+
padding-bottom: calc(var(--py) - 6px);
|
|
2500
|
+
}
|
|
2501
|
+
|
|
2502
|
+
/* Body used to start flush under the header (`padding-top: 0`). Give the
|
|
2503
|
+
search / chips a clear step down from the title rule. Specificity must beat
|
|
2504
|
+
BbOffCanvas's nested `.bb-offcanvas .bb-offcanvas__body .bb-offcanvas__body-content`
|
|
2505
|
+
shorthand (`padding: 0 …`). */
|
|
2506
|
+
.bb-offcanvas.bb-select-popover-offcanvas
|
|
2507
|
+
.bb-offcanvas__body
|
|
2508
|
+
.bb-offcanvas__body-content {
|
|
2509
|
+
padding-top: 0.5rem;
|
|
2510
|
+
}
|
|
2511
|
+
|
|
2402
2512
|
.bb-select-popover.bb-select-popover--sheet {
|
|
2403
2513
|
display: flex;
|
|
2404
2514
|
flex-direction: column;
|
|
@@ -2408,11 +2518,15 @@ export type BbSelectPopoverSlots<Item> = {
|
|
|
2408
2518
|
}
|
|
2409
2519
|
|
|
2410
2520
|
.bb-select-popover--sheet {
|
|
2521
|
+
outline: none;
|
|
2411
2522
|
/* Selection sits above the search; search + listbox keep the popover styling
|
|
2412
2523
|
(they are the same `.bb-select-popover` descendants). */
|
|
2413
2524
|
.bb-select-popover__sheet-selection {
|
|
2414
2525
|
flex-shrink: 0;
|
|
2415
|
-
|
|
2526
|
+
/* Tight to the search below so chips + field read as one cluster under
|
|
2527
|
+
the title, not three stacked bands. Inline inset is the OffCanvas
|
|
2528
|
+
body's `--px`. */
|
|
2529
|
+
padding: 0 0 0.5rem;
|
|
2416
2530
|
text-align: left;
|
|
2417
2531
|
}
|
|
2418
2532
|
|
|
@@ -2433,13 +2547,28 @@ export type BbSelectPopoverSlots<Item> = {
|
|
|
2433
2547
|
--clear-size: 1.25rem;
|
|
2434
2548
|
}
|
|
2435
2549
|
|
|
2436
|
-
|
|
2437
|
-
|
|
2438
|
-
|
|
2439
|
-
|
|
2440
|
-
|
|
2441
|
-
|
|
2442
|
-
|
|
2550
|
+
/* Soft filled field instead of the popover's underline rule: still reads as
|
|
2551
|
+
a tap target, but stops competing with the title divider for hierarchy.
|
|
2552
|
+
`--bb-muted` is the library's 6% text wash — faint on both themes.
|
|
2553
|
+
Inline inset is the OffCanvas body's `--px`. */
|
|
2554
|
+
.bb-select-popover__search-container {
|
|
2555
|
+
background-color: var(--bb-muted);
|
|
2556
|
+
border-bottom: 0;
|
|
2557
|
+
border-radius: var(--bb-radius);
|
|
2558
|
+
margin-bottom: 0.25rem;
|
|
2559
|
+
padding: 0.625rem 0.75rem;
|
|
2560
|
+
transition: background-color var(--bb-transition-fast) ease;
|
|
2561
|
+
|
|
2562
|
+
/* One emphasis stop above the resting --bb-muted (6%) fill. */
|
|
2563
|
+
&:focus-within {
|
|
2564
|
+
background-color: color-mix(in oklab, var(--bb-text) 8%, var(--bb-panel));
|
|
2565
|
+
}
|
|
2566
|
+
}
|
|
2567
|
+
|
|
2568
|
+
/* Busy strip sits on the field's bottom edge (no border to overlay). */
|
|
2569
|
+
.bb-select-popover__search-strip {
|
|
2570
|
+
border-radius: 0 0 var(--bb-radius) var(--bb-radius);
|
|
2571
|
+
bottom: 0;
|
|
2443
2572
|
}
|
|
2444
2573
|
|
|
2445
2574
|
/* Options list breathes a little more on a sheet and scrolls internally. */
|
|
@@ -2453,6 +2582,25 @@ export type BbSelectPopoverSlots<Item> = {
|
|
|
2453
2582
|
calc(var(--option-h) * 9 + 0.5rem),
|
|
2454
2583
|
calc(round(down, 55dvh, var(--option-h)) - 1px)
|
|
2455
2584
|
);
|
|
2585
|
+
/* Popover listbox pads 0.25rem so options sit inside the bubble; the
|
|
2586
|
+
sheet body already pads `--px`. Keep the block pad for the first/last
|
|
2587
|
+
row, drop the inline pad that was lining the fill up with the field. */
|
|
2588
|
+
padding-inline: 0;
|
|
2589
|
+
|
|
2590
|
+
/* Popover options are `padding-left: 0.5rem`. +4px so the label shares
|
|
2591
|
+
the search field's text edge (`padding-inline: 0.75rem` on the fill).
|
|
2592
|
+
`padding-left` (not `-inline-start`): the popover longhand would
|
|
2593
|
+
otherwise win and swallow the extra 4px. */
|
|
2594
|
+
span[role='listbox'] .bb-listbox__option,
|
|
2595
|
+
.bb-listbox__group > .bb-listbox__option {
|
|
2596
|
+
padding-left: calc(0.5rem + 4px);
|
|
2597
|
+
}
|
|
2598
|
+
|
|
2599
|
+
.bb-listbox__group-header,
|
|
2600
|
+
.bb-listbox__loading,
|
|
2601
|
+
.bb-listbox__no-data {
|
|
2602
|
+
padding-left: calc(0.5rem + 4px);
|
|
2603
|
+
}
|
|
2456
2604
|
}
|
|
2457
2605
|
}
|
|
2458
2606
|
|
|
@@ -70,18 +70,17 @@
|
|
|
70
70
|
import BaseInputContainer from '../BbBaseInputContainer/BbBaseInputContainer.vue';
|
|
71
71
|
import BaseSlider from '../BbBaseSlider/BbBaseSlider.vue';
|
|
72
72
|
import { ref, computed } from 'vue';
|
|
73
|
-
import {
|
|
73
|
+
import { useConfig } from '@/composables/useConfig';
|
|
74
74
|
import { removedPropsFor } from '@/deprecation/removedProps';
|
|
75
75
|
import { warnRemovedAttrs } from '@/utilities/functions/warnRemovedAttrs';
|
|
76
76
|
import { resolveEnumProp } from '@/utilities/functions/resolveEnumProp';
|
|
77
77
|
import type { BbSliderProps, BbSliderEvents, BbSliderSlots } from './types';
|
|
78
|
-
export type { BbSliderProps, BbSliderEvents, BbSliderSlots };
|
|
79
78
|
|
|
80
79
|
const props = withDefaults(defineProps<BbSliderProps>(), {});
|
|
81
|
-
|
|
82
80
|
const emit = defineEmits<BbSliderEvents>();
|
|
83
|
-
|
|
84
81
|
defineSlots<BbSliderSlots>();
|
|
82
|
+
const config = useConfig();
|
|
83
|
+
export type { BbSliderProps, BbSliderEvents, BbSliderSlots };
|
|
85
84
|
|
|
86
85
|
if (process.env.NODE_ENV !== 'production')
|
|
87
86
|
warnRemovedAttrs('BbSlider', removedPropsFor('BbSlider'));
|
|
@@ -164,9 +164,23 @@ export type BbSwitchSlots = {
|
|
|
164
164
|
.bb-base-input-container__layout--horizontal {
|
|
165
165
|
align-items: flex-start;
|
|
166
166
|
|
|
167
|
+
/*
|
|
168
|
+
* `align-items` + `min-height` are what pin the control to the
|
|
169
|
+
* LABEL'S FIRST LINE instead of the block centre — measured: with a
|
|
170
|
+
* 4-line label the control's mid sits exactly on the first line's
|
|
171
|
+
* mid, and 28px above the block centre.
|
|
172
|
+
*
|
|
173
|
+
* There used to be a `display: inline-flex` here too, and it was
|
|
174
|
+
* doing none of that vertical work — but it silently killed
|
|
175
|
+
* `input-position`, whose only lever is `justify-items` (a grid
|
|
176
|
+
* property, inert on a flex container). So a described row with
|
|
177
|
+
* `input-position="right"` painted its control at the START of the
|
|
178
|
+
* column: 166px out on a 198px column (Q20.2). Removing the one
|
|
179
|
+
* declaration restores left/center/right and leaves the vertical
|
|
180
|
+
* geometry byte-identical.
|
|
181
|
+
*/
|
|
167
182
|
.bb-base-input-container__control {
|
|
168
183
|
align-items: center;
|
|
169
|
-
display: inline-flex;
|
|
170
184
|
min-height: var(--bb-label-lh);
|
|
171
185
|
}
|
|
172
186
|
}
|