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
|
@@ -32,6 +32,7 @@
|
|
|
32
32
|
<AdaptiveDropdown
|
|
33
33
|
v-if="useOffcanvas"
|
|
34
34
|
v-model="open"
|
|
35
|
+
:compact="compact"
|
|
35
36
|
:off-canvas-props="offcanvasBindings"
|
|
36
37
|
:root-groups="renderGroups"
|
|
37
38
|
/>
|
|
@@ -41,7 +42,10 @@
|
|
|
41
42
|
:anchor="effectiveAnchor"
|
|
42
43
|
:boundary="boundary"
|
|
43
44
|
class="bb-dropdown"
|
|
44
|
-
:class="{
|
|
45
|
+
:class="{
|
|
46
|
+
'bb-dropdown--mobile': isMobile,
|
|
47
|
+
'bb-dropdown--compact': compact,
|
|
48
|
+
}"
|
|
45
49
|
:eager="eager"
|
|
46
50
|
hide-arrow
|
|
47
51
|
:offset="offset"
|
|
@@ -58,6 +62,9 @@
|
|
|
58
62
|
:id="panelIsDialog ? `dialog_${id}` : undefined"
|
|
59
63
|
:aria-labelledby="panelIsDialog ? activatorId : undefined"
|
|
60
64
|
class="bb-dropdown__panel"
|
|
65
|
+
:class="{
|
|
66
|
+
'bb-dropdown__panel--reserve-check': reservesCheckSpace,
|
|
67
|
+
}"
|
|
61
68
|
:data-bb-dropdown-surface="id"
|
|
62
69
|
:inert="panelInert"
|
|
63
70
|
:role="panelIsDialog ? 'dialog' : undefined"
|
|
@@ -126,7 +133,7 @@ import { useMobile } from '@/composables/useMobile';
|
|
|
126
133
|
import { provideSheetSurface } from '@/composables/useSheetSurface';
|
|
127
134
|
import { useUntil } from '@/composables/useUntil';
|
|
128
135
|
import { useClosingInert } from '@/composables/useClosingInert';
|
|
129
|
-
import {
|
|
136
|
+
import { useConfig } from '@/composables/useConfig';
|
|
130
137
|
import { wait } from '@/utilities/functions/wait';
|
|
131
138
|
import CommonPopover from '../CommonPopover/CommonPopover.vue';
|
|
132
139
|
import BbDropdownList from './BbDropdownList.vue';
|
|
@@ -158,13 +165,6 @@ import type { Ref } from 'vue';
|
|
|
158
165
|
import { transitions } from '@/utilities/misc/transitions';
|
|
159
166
|
import { removedPropsFor } from '@/deprecation/removedProps';
|
|
160
167
|
import { warnRemovedAttrs } from '@/utilities/functions/warnRemovedAttrs';
|
|
161
|
-
export type {
|
|
162
|
-
BbDropdownProps,
|
|
163
|
-
BbDropdownSlots,
|
|
164
|
-
InternalItem as Item,
|
|
165
|
-
MappedItem,
|
|
166
|
-
DropdownTrigger,
|
|
167
|
-
};
|
|
168
168
|
|
|
169
169
|
defineOptions({
|
|
170
170
|
inheritAttrs: false,
|
|
@@ -185,6 +185,14 @@ const props = withDefaults(defineProps<BbDropdownProps>(), {
|
|
|
185
185
|
});
|
|
186
186
|
const emit = defineEmits<BbDropdownEvents>();
|
|
187
187
|
defineSlots<BbDropdownSlots>();
|
|
188
|
+
const config = useConfig();
|
|
189
|
+
export type {
|
|
190
|
+
BbDropdownProps,
|
|
191
|
+
BbDropdownSlots,
|
|
192
|
+
InternalItem as Item,
|
|
193
|
+
MappedItem,
|
|
194
|
+
DropdownTrigger,
|
|
195
|
+
};
|
|
188
196
|
|
|
189
197
|
if (process.env.NODE_ENV !== 'production')
|
|
190
198
|
warnRemovedAttrs('BbDropdown', removedPropsFor('BbDropdown'));
|
|
@@ -267,6 +275,13 @@ const offcanvasBindings = computed(() => ({
|
|
|
267
275
|
eager: props.eager,
|
|
268
276
|
disabled: props.disabled,
|
|
269
277
|
transitionDuration: props.transitionDuration,
|
|
278
|
+
/*
|
|
279
|
+
* No ✕ on this sheet — same call as BbSelectPopover. A bottom sheet already
|
|
280
|
+
* offers drag-down, backdrop tap and Escape; the picker's own job (tap a
|
|
281
|
+
* row) dismisses most menus too. Before the spread so
|
|
282
|
+
* `offCanvasProps: { hideClose: false }` still brings it back.
|
|
283
|
+
*/
|
|
284
|
+
hideClose: true,
|
|
270
285
|
...props.offCanvasProps,
|
|
271
286
|
}));
|
|
272
287
|
|
|
@@ -1305,10 +1320,31 @@ onBeforeUnmount(() => {
|
|
|
1305
1320
|
removeDocumentListeners();
|
|
1306
1321
|
});
|
|
1307
1322
|
|
|
1323
|
+
/*
|
|
1324
|
+
* Q14.3 — on a SHRINKWRAPPED panel, every selectable row reserves the check's
|
|
1325
|
+
* space up front.
|
|
1326
|
+
*
|
|
1327
|
+
* The check is absolute and mounted on every row (its stroke animates in), but
|
|
1328
|
+
* only the SELECTED row pads to clear it — deliberately, because on a DECLARED
|
|
1329
|
+
* width padding every row steals that space from the label and truncates it
|
|
1330
|
+
* early. The cost of that choice shows up in the other mode: with `width:
|
|
1331
|
+
* 'auto'` the selected row's padding is part of its intrinsic width, so the
|
|
1332
|
+
* first pick widens the whole menu under the pointer.
|
|
1333
|
+
*
|
|
1334
|
+
* Both behaviours are right in their own mode, so this picks per mode rather
|
|
1335
|
+
* than picking one. On `auto` the reservation is free — the panel simply opens
|
|
1336
|
+
* that much wider, once, before the user touches anything.
|
|
1337
|
+
*/
|
|
1338
|
+
const reservesCheckSpace = computed(() => props.width === 'auto');
|
|
1339
|
+
|
|
1308
1340
|
// Measured on the anchor, not the activator: a percentage width is relative to
|
|
1309
1341
|
// whatever the panel aligns to (the two are the same unless `anchor` is set).
|
|
1342
|
+
// Observed only while open: the width feeds the panel's percentage widths,
|
|
1343
|
+
// which only exist while it is rendered — and a closed menu's ResizeObserver
|
|
1344
|
+
// would otherwise fire on every layout of its host (a menu button per row of
|
|
1345
|
+
// a virtualized table is one observer per mounted row).
|
|
1310
1346
|
const { width: anchorWidth } = useElementSize(
|
|
1311
|
-
anchorDom,
|
|
1347
|
+
computed(() => (open.value ? anchorDom.value : null)),
|
|
1312
1348
|
{ width: 0, height: 0 },
|
|
1313
1349
|
{
|
|
1314
1350
|
box: 'border-box',
|
|
@@ -1544,11 +1580,14 @@ export type InternalGroup = DropdownEntryBase & {
|
|
|
1544
1580
|
* predictable size regardless of row content. A `number` is pixels; a `string`
|
|
1545
1581
|
* is any CSS length (`'50vh'`, `'20rem'`). `'none'` (or `0`) removes the cap.
|
|
1546
1582
|
*
|
|
1547
|
-
* `searchable` groups default to `280` (≈ 10 rows of 28px)
|
|
1548
|
-
* list is usually long; set your own value to tweak, or
|
|
1549
|
-
*
|
|
1583
|
+
* `searchable` groups default to `280` (≈ 10 rows of 28px) **on the flyout**,
|
|
1584
|
+
* since a searched list is usually long; set your own value to tweak, or
|
|
1585
|
+
* `'none'` to uncap. The adaptive sheet ignores the cap so the OffCanvas
|
|
1586
|
+
* body stays the only scroller (nested group overflow trapped swipes that
|
|
1587
|
+
* started on a row). Non-searchable flyout groups are uncapped unless you
|
|
1588
|
+
* set this.
|
|
1550
1589
|
*
|
|
1551
|
-
* @defaultValue `280` for `searchable` groups, otherwise unset
|
|
1590
|
+
* @defaultValue `280` for `searchable` flyout groups, otherwise unset
|
|
1552
1591
|
*/
|
|
1553
1592
|
maxHeight?: number | string;
|
|
1554
1593
|
/**
|
|
@@ -1717,6 +1756,17 @@ export type BbDropdownProps = {
|
|
|
1717
1756
|
* @defaultValue `config.adaptive` (`true`)
|
|
1718
1757
|
*/
|
|
1719
1758
|
adaptive?: boolean;
|
|
1759
|
+
/**
|
|
1760
|
+
* Apply the compact density variant — the same ladder `BbSelect` uses, on
|
|
1761
|
+
* both surfaces: flyout rows go 28px → 24px, sheet rows 44px → 36px. The
|
|
1762
|
+
* label size does not change; density here is height, as it is for a select.
|
|
1763
|
+
*
|
|
1764
|
+
* A menu row is a touch target in a way a select option is not quite — a
|
|
1765
|
+
* mis-tap fires the neighbouring COMMAND rather than picking the wrong value
|
|
1766
|
+
* — so the compact sheet stops at 36px and never follows the flyout down to
|
|
1767
|
+
* 24px. That is the same floor the select's sheet holds.
|
|
1768
|
+
*/
|
|
1769
|
+
compact?: boolean;
|
|
1720
1770
|
/**
|
|
1721
1771
|
* Element the panel positions itself against, when it should differ from the
|
|
1722
1772
|
* activator — e.g. a wrapper that the activator is only a part of, so the menu
|
|
@@ -1796,7 +1846,8 @@ export type BbDropdownProps = {
|
|
|
1796
1846
|
padding?: number;
|
|
1797
1847
|
/**
|
|
1798
1848
|
* Position of the dropdown relative to the activator.
|
|
1799
|
-
* Use `'cursor'` to anchor at the mouse/touch coordinates
|
|
1849
|
+
* Use `'cursor'` to anchor at the mouse/touch coordinates.
|
|
1850
|
+
* (No arrow is drawn either way — arrows are tooltip-only in v3.)
|
|
1800
1851
|
*
|
|
1801
1852
|
* @defaultValue `'bottom'`
|
|
1802
1853
|
*/
|
|
@@ -1997,7 +2048,9 @@ export type BbDropdownGroupEvents = {
|
|
|
1997
2048
|
## Styles
|
|
1998
2049
|
|
|
1999
2050
|
```css
|
|
2000
|
-
/* @inherit --transition-duration — set inline by the adaptive surface
|
|
2051
|
+
/* @inherit --transition-duration — set inline by the adaptive surface;
|
|
2052
|
+
@inherit --py — the adaptive sheet's rules target BbOffCanvas elements, which
|
|
2053
|
+
declare it on the panel */
|
|
2001
2054
|
.bb-dropdown {
|
|
2002
2055
|
overflow: visible;
|
|
2003
2056
|
|
|
@@ -2210,7 +2263,11 @@ export type BbDropdownGroupEvents = {
|
|
|
2210
2263
|
* is inert there and `max-height` alone caps it. */
|
|
2211
2264
|
flex: 1 1 auto;
|
|
2212
2265
|
flex-direction: column;
|
|
2213
|
-
|
|
2266
|
+
/* `--bb-fs`, matching the select's option label. These two menus sit at
|
|
2267
|
+
the same 28px row height on the same screen and their labels were a
|
|
2268
|
+
pixel apart (13 against 14) — the desktop twin of the sheet drift, and
|
|
2269
|
+
the kind of difference nobody can name but everybody sees. */
|
|
2270
|
+
font-size: var(--bb-fs);
|
|
2214
2271
|
gap: 1px;
|
|
2215
2272
|
line-height: 1.2;
|
|
2216
2273
|
max-height: var(--max-h, none);
|
|
@@ -2303,9 +2360,11 @@ export type BbDropdownGroupEvents = {
|
|
|
2303
2360
|
/* Keep natural row height under a capped, scrolling container. */
|
|
2304
2361
|
flex-shrink: 0;
|
|
2305
2362
|
height: 28px;
|
|
2306
|
-
/* Let the row sit inside a fixed `--w` panel instead of expanding it.
|
|
2363
|
+
/* Let the row sit inside a fixed `--w` panel instead of expanding it.
|
|
2364
|
+
* Also the containing block for the absolute selection check. */
|
|
2307
2365
|
min-width: 0;
|
|
2308
2366
|
padding: 2px 6px;
|
|
2367
|
+
position: relative;
|
|
2309
2368
|
text-align: left;
|
|
2310
2369
|
width: 100%;
|
|
2311
2370
|
|
|
@@ -2343,8 +2402,7 @@ export type BbDropdownGroupEvents = {
|
|
|
2343
2402
|
}
|
|
2344
2403
|
|
|
2345
2404
|
.item__prepend-icon,
|
|
2346
|
-
.item__append-icon
|
|
2347
|
-
.item__check {
|
|
2405
|
+
.item__append-icon {
|
|
2348
2406
|
--size: 16px;
|
|
2349
2407
|
flex-shrink: 0;
|
|
2350
2408
|
font-size: 15px;
|
|
@@ -2390,21 +2448,42 @@ export type BbDropdownGroupEvents = {
|
|
|
2390
2448
|
|
|
2391
2449
|
.item__prepend-icon,
|
|
2392
2450
|
.item__append-icon,
|
|
2393
|
-
.item__check,
|
|
2394
2451
|
.item__chevron {
|
|
2395
2452
|
margin-top: 2px;
|
|
2396
2453
|
}
|
|
2454
|
+
|
|
2455
|
+
/* Absolute check: pin to the title line, not the row mid-point. */
|
|
2456
|
+
.item__check {
|
|
2457
|
+
margin-top: 0;
|
|
2458
|
+
top: 6px;
|
|
2459
|
+
transform: none;
|
|
2460
|
+
}
|
|
2397
2461
|
}
|
|
2398
2462
|
|
|
2399
|
-
.item__check,
|
|
2400
2463
|
.item__chevron {
|
|
2401
2464
|
--size: 16px;
|
|
2402
2465
|
color: var(--bb-text-muted);
|
|
2466
|
+
flex-shrink: 0;
|
|
2467
|
+
font-size: 19px;
|
|
2403
2468
|
margin-inline-start: auto;
|
|
2404
2469
|
}
|
|
2405
2470
|
|
|
2471
|
+
/*
|
|
2472
|
+
* Selection check is out of flow. Selectable groups always mount the
|
|
2473
|
+
* glyph (stroke animates in when selected); leaving it in flex would
|
|
2474
|
+
* reserve ~24px on EVERY row and make ellipsis truncate as if an
|
|
2475
|
+
* append icon were present. Absolute + pad-only-when-selected lets
|
|
2476
|
+
* unselected labels use the full row.
|
|
2477
|
+
*/
|
|
2406
2478
|
.item__check {
|
|
2479
|
+
--size: 16px;
|
|
2407
2480
|
color: var(--bb-text);
|
|
2481
|
+
font-size: 15px;
|
|
2482
|
+
inset-inline-end: 6px;
|
|
2483
|
+
pointer-events: none;
|
|
2484
|
+
position: absolute;
|
|
2485
|
+
top: 50%;
|
|
2486
|
+
transform: translateY(-50%);
|
|
2408
2487
|
|
|
2409
2488
|
path {
|
|
2410
2489
|
stroke-dasharray: 30;
|
|
@@ -2415,16 +2494,14 @@ export type BbDropdownGroupEvents = {
|
|
|
2415
2494
|
}
|
|
2416
2495
|
|
|
2417
2496
|
&.bb-dropdown__item--selected {
|
|
2497
|
+
/* Keep the label clear of the absolute check. */
|
|
2498
|
+
padding-inline-end: calc(6px + 16px + 4px);
|
|
2499
|
+
|
|
2418
2500
|
.item__check path {
|
|
2419
2501
|
stroke-dashoffset: 0;
|
|
2420
2502
|
}
|
|
2421
2503
|
}
|
|
2422
2504
|
|
|
2423
|
-
.item__chevron {
|
|
2424
|
-
flex-shrink: 0;
|
|
2425
|
-
font-size: 19px;
|
|
2426
|
-
}
|
|
2427
|
-
|
|
2428
2505
|
&.bb-dropdown__item--variant-destructive {
|
|
2429
2506
|
color: var(--bb-danger);
|
|
2430
2507
|
|
|
@@ -2462,6 +2539,24 @@ export type BbDropdownGroupEvents = {
|
|
|
2462
2539
|
}
|
|
2463
2540
|
}
|
|
2464
2541
|
|
|
2542
|
+
/* ---- Compact density --------------------------------------------------
|
|
2543
|
+
* The same ladder `BbSelect` walks, so a dense toolbar can hold a select and a
|
|
2544
|
+
* menu that agree: the flyout drops 28px → 24px here, and the SHEET drops
|
|
2545
|
+
* 44px → 36px through `--sheet-row-h` (AdaptiveDropdown reads
|
|
2546
|
+
* `listboxOptionHeight`, the helper the listbox reads, so neither can drift).
|
|
2547
|
+
* The label does not shrink — density is height, exactly as it is for a select
|
|
2548
|
+
* — and the sheet never follows the flyout to 24px, because a menu row is a
|
|
2549
|
+
* touch target whose mis-tap fires the neighbouring COMMAND. */
|
|
2550
|
+
.bb-dropdown.bb-dropdown--compact {
|
|
2551
|
+
.bb-dropdown__item {
|
|
2552
|
+
height: 24px;
|
|
2553
|
+
}
|
|
2554
|
+
|
|
2555
|
+
.bb-dropdown__placeholder {
|
|
2556
|
+
min-height: 24px;
|
|
2557
|
+
}
|
|
2558
|
+
}
|
|
2559
|
+
|
|
2465
2560
|
/* ---- Adaptive drill-down sheet ----------------------------------------
|
|
2466
2561
|
* The mobile surface (`AdaptiveDropdown`) reuses the `.bb-dropdown` classes
|
|
2467
2562
|
* above by carrying `.bb-dropdown` on the off-canvas root; these rules only
|
|
@@ -2471,7 +2566,104 @@ export type BbDropdownGroupEvents = {
|
|
|
2471
2566
|
/* Shrink the off-canvas chrome so the sheet reads as compact as the desktop
|
|
2472
2567
|
panel rather than a full dialog. */
|
|
2473
2568
|
--dialog-gap: 8px;
|
|
2474
|
-
|
|
2569
|
+
/* The title tracks the row label rather than the off-canvas default. It was
|
|
2570
|
+
pulled DOWN to `--bb-fs - 1` (13px) once, which put it under the rows it
|
|
2571
|
+
heads; the default (`--bb-fs + 2`) fixed that until the rows moved to 18px
|
|
2572
|
+
and passed it again. Tied to the same constant, a title can no longer end
|
|
2573
|
+
up smaller than the list beneath it whatever that constant becomes. */
|
|
2574
|
+
--dialog-title-fs: var(--sheet-option-fs, 1rem);
|
|
2575
|
+
|
|
2576
|
+
/* Root sheet title via `offCanvasProps.title` (no drill nav / custom
|
|
2577
|
+
`#header`): centre it and tighten the title→divider air like BbSelect.
|
|
2578
|
+
`:not(:has(.bb-dropdown__nav))` keeps consumer `#header` content and the
|
|
2579
|
+
drill nav on their own layouts. */
|
|
2580
|
+
.bb-offcanvas__header:not(:has(.bb-dropdown__nav)) {
|
|
2581
|
+
border-bottom: var(--bb-border-w) solid var(--bb-border);
|
|
2582
|
+
padding-bottom: calc(var(--py) - 6px);
|
|
2583
|
+
|
|
2584
|
+
> .bb-offcanvas__title {
|
|
2585
|
+
flex: 1 1 auto;
|
|
2586
|
+
text-align: center;
|
|
2587
|
+
}
|
|
2588
|
+
}
|
|
2589
|
+
|
|
2590
|
+
/* Drill nav owns the title→body air. Drop the OffCanvas header's own bottom
|
|
2591
|
+
pad so it does not stack under the nav and push chips / search below
|
|
2592
|
+
BbSelect's. */
|
|
2593
|
+
.bb-offcanvas__header:has(.bb-dropdown__nav--drill) {
|
|
2594
|
+
padding-bottom: 0;
|
|
2595
|
+
}
|
|
2596
|
+
|
|
2597
|
+
/* Body used to start flush under the header. Match BbSelect's step down
|
|
2598
|
+
from the title rule. Specificity beats OffCanvas's nested shorthand.
|
|
2599
|
+
Skip headerless sheets (`--no-header`): OffCanvas already supplies the
|
|
2600
|
+
top inset (and the handle clearance) that this would otherwise crush to
|
|
2601
|
+
0.5rem — the filters root with no title / drill nav / `#header`. */
|
|
2602
|
+
&.bb-offcanvas:not(.bb-offcanvas--no-header)
|
|
2603
|
+
.bb-offcanvas__body
|
|
2604
|
+
.bb-offcanvas__body-content {
|
|
2605
|
+
padding-top: 0.5rem;
|
|
2606
|
+
}
|
|
2607
|
+
|
|
2608
|
+
/* Flat multi-group sheets: space a following section after the previous
|
|
2609
|
+
group's items/search. */
|
|
2610
|
+
.bb-dropdown__group-items + .bb-dropdown__group-title,
|
|
2611
|
+
.bb-dropdown__group-search + .bb-dropdown__group-title,
|
|
2612
|
+
.bb-dropdown__divider + .bb-dropdown__group-title {
|
|
2613
|
+
margin-top: 0.5rem;
|
|
2614
|
+
}
|
|
2615
|
+
|
|
2616
|
+
/* Group headers on the sheet read as BbSelect's sheet label — centred title
|
|
2617
|
+
weight/size, not the flyout's faint left-aligned section caption. No
|
|
2618
|
+
hairline here: the select sheet label's rule lives on the OffCanvas
|
|
2619
|
+
header, and repeating it under every group stacked like extra chrome.
|
|
2620
|
+
Nested drills with `hideLabel` skip this entirely; the drill nav title is
|
|
2621
|
+
already that label. */
|
|
2622
|
+
.bb-dropdown__group-title {
|
|
2623
|
+
align-items: center;
|
|
2624
|
+
border-bottom: 0;
|
|
2625
|
+
color: var(--bb-text);
|
|
2626
|
+
column-gap: 6px;
|
|
2627
|
+
display: flex;
|
|
2628
|
+
font-size: var(--dialog-title-fs, var(--sheet-option-fs, 1rem));
|
|
2629
|
+
font-weight: 500;
|
|
2630
|
+
justify-content: center;
|
|
2631
|
+
letter-spacing: normal;
|
|
2632
|
+
/* Match select's title→body air (`padding-bottom: calc(var(--py) - 6px)`
|
|
2633
|
+
on the OffCanvas header) so the label sits above the soft search the
|
|
2634
|
+
same way City sits above its field. */
|
|
2635
|
+
padding: 0.25rem 0 calc(var(--py, var(--bb-panel-p)) - 6px);
|
|
2636
|
+
|
|
2637
|
+
.group-title__content {
|
|
2638
|
+
flex: 1 1 auto;
|
|
2639
|
+
line-height: normal;
|
|
2640
|
+
overflow-x: clip;
|
|
2641
|
+
overflow-y: visible;
|
|
2642
|
+
text-align: center;
|
|
2643
|
+
}
|
|
2644
|
+
|
|
2645
|
+
.group-title__prepend-icon,
|
|
2646
|
+
.group-title__append-icon {
|
|
2647
|
+
--size: 1.25rem;
|
|
2648
|
+
font-size: var(--size);
|
|
2649
|
+
}
|
|
2650
|
+
}
|
|
2651
|
+
|
|
2652
|
+
/* Headerless sheet: the first group title IS the sheet label (Flat filters'
|
|
2653
|
+
"Status" beside BbSelect's "City"). Body already clears the handle via
|
|
2654
|
+
`--no-header` padding (`calc(var(--py) + 12px)`); the items-container's
|
|
2655
|
+
4px (meant for air under a nav divider) and the title's own 0.25rem top
|
|
2656
|
+
pad were stacking on top and dropping the label ~8px below City.
|
|
2657
|
+
Measured: City title @29px, Flat Status @33–37px before this. */
|
|
2658
|
+
&.bb-offcanvas--no-header .bb-dropdown__items-container {
|
|
2659
|
+
padding-top: 0;
|
|
2660
|
+
}
|
|
2661
|
+
|
|
2662
|
+
&.bb-offcanvas--no-header
|
|
2663
|
+
.bb-dropdown__items-container
|
|
2664
|
+
> .bb-dropdown__group-title:first-child {
|
|
2665
|
+
padding-top: 0;
|
|
2666
|
+
}
|
|
2475
2667
|
|
|
2476
2668
|
/* Clip the sideways level slide so it never spills a horizontal scrollbar. */
|
|
2477
2669
|
.bb-dropdown__adaptive-body {
|
|
@@ -2501,55 +2693,132 @@ export type BbDropdownGroupEvents = {
|
|
|
2501
2693
|
* construction, so this selector needs no viewport clause of its own. The
|
|
2502
2694
|
* JS half lives in `useTouchRowLadder`, for the virtualized option lists
|
|
2503
2695
|
* whose row heights feed a virtualizer instead of a stylesheet. */
|
|
2696
|
+
/* Belt for an explicit `maxHeight` leaking onto the sheet: never nest a
|
|
2697
|
+
second scrollport inside the OffCanvas body. */
|
|
2698
|
+
.bb-dropdown__group-items--capped {
|
|
2699
|
+
display: contents;
|
|
2700
|
+
max-height: none;
|
|
2701
|
+
overflow: visible;
|
|
2702
|
+
}
|
|
2703
|
+
|
|
2504
2704
|
.bb-dropdown__items-container {
|
|
2505
|
-
|
|
2705
|
+
/* Published by AdaptiveDropdown from `listboxMetrics`, the same helpers the
|
|
2706
|
+
select's sheet reads. The fallbacks are the shipped touch values, so the
|
|
2707
|
+
stylesheet still reads on its own. */
|
|
2708
|
+
font-size: var(--sheet-option-fs, 1rem);
|
|
2506
2709
|
max-height: none;
|
|
2507
2710
|
min-width: 0;
|
|
2508
2711
|
overflow-y: visible;
|
|
2509
|
-
|
|
2712
|
+
/* Horizontal inset is the OffCanvas body's `--px`. Do not re-pad here
|
|
2713
|
+
(or on the rows) to fake alignment with search/chips. */
|
|
2714
|
+
padding: 4px 0 0;
|
|
2510
2715
|
width: 100%;
|
|
2511
2716
|
|
|
2512
2717
|
.bb-dropdown__item {
|
|
2513
|
-
height: 44px;
|
|
2514
|
-
|
|
2718
|
+
height: var(--sheet-row-h, 44px);
|
|
2719
|
+
/* Flyout rows are `2px 6px`. +4px start so the label shares the
|
|
2720
|
+
search field's text edge (`padding-inline: 0.75rem` on the fill). */
|
|
2721
|
+
padding-left: calc(6px + 4px);
|
|
2722
|
+
/* iOS treats a <button> as a tap target and will not hand the pan to
|
|
2723
|
+
the sheet body unless the control itself opts into vertical panning.
|
|
2724
|
+
Without this, dismiss/scroll work on the handle and miss on rows. */
|
|
2725
|
+
touch-action: pan-y;
|
|
2515
2726
|
|
|
2516
2727
|
&.bb-dropdown__item--description {
|
|
2517
|
-
min-height: 44px;
|
|
2728
|
+
min-height: var(--sheet-row-h, 44px);
|
|
2729
|
+
}
|
|
2730
|
+
|
|
2731
|
+
.item__content {
|
|
2732
|
+
line-height: normal;
|
|
2733
|
+
overflow-x: clip;
|
|
2734
|
+
overflow-y: visible;
|
|
2518
2735
|
}
|
|
2519
2736
|
|
|
2737
|
+
/* One step under the row label, the same step the listbox puts between
|
|
2738
|
+
an option and its group header — so the two sheets' secondary text
|
|
2739
|
+
agrees as well as their primary. */
|
|
2520
2740
|
.item__description {
|
|
2521
|
-
font-size: calc(var(--
|
|
2741
|
+
font-size: calc(var(--sheet-option-fs, 1rem) - 2px);
|
|
2522
2742
|
line-height: 18px;
|
|
2523
2743
|
}
|
|
2524
2744
|
}
|
|
2525
2745
|
|
|
2526
2746
|
.bb-dropdown__placeholder {
|
|
2527
|
-
min-height: 44px;
|
|
2528
|
-
padding:
|
|
2747
|
+
min-height: var(--sheet-row-h, 44px);
|
|
2748
|
+
padding-left: calc(6px + 4px);
|
|
2529
2749
|
}
|
|
2530
2750
|
|
|
2531
|
-
.
|
|
2532
|
-
|
|
2533
|
-
|
|
2751
|
+
/* Icons scale with the label they sit beside. The desktop sizes (16px
|
|
2752
|
+
glyphs against a 13px label) were tuned for a 28px row; left alone in a
|
|
2753
|
+
44px row with an 18px label they read as undersized — the chevron that
|
|
2754
|
+
says "this opens another level" ended up the smallest thing in the row.
|
|
2755
|
+
One step up, so the glyph keeps roughly the proportion to its label that
|
|
2756
|
+
it has on the desktop panel. BbIcon reads `--size`; keep `font-size` on
|
|
2757
|
+
the same token so the glyph box and the type size cannot drift. */
|
|
2758
|
+
.item__prepend-icon,
|
|
2759
|
+
.item__append-icon,
|
|
2760
|
+
.item__check,
|
|
2761
|
+
.item__chevron {
|
|
2762
|
+
--size: 1.25rem;
|
|
2763
|
+
font-size: var(--size);
|
|
2534
2764
|
}
|
|
2765
|
+
|
|
2766
|
+
/* Group titles are restyled as select-sheet labels on `--adaptive`
|
|
2767
|
+
(see block above); do not re-apply the flyout caption metrics here. */
|
|
2535
2768
|
}
|
|
2536
2769
|
|
|
2770
|
+
/* Soft filled search — mirrors BbSelectPopover's sheet field: no underline
|
|
2771
|
+
rule, faint `--bb-muted` wash, and the same inset as sheet chips / row
|
|
2772
|
+
padding so the fill lines up. */
|
|
2537
2773
|
.bb-dropdown__group-search {
|
|
2538
|
-
|
|
2774
|
+
background-color: var(--bb-muted);
|
|
2775
|
+
border-bottom: 0;
|
|
2776
|
+
border-radius: var(--bb-radius);
|
|
2777
|
+
/* Undo the flyout's full-bleed negative margins. No extra inline inset —
|
|
2778
|
+
the OffCanvas body already pads `--px`. */
|
|
2779
|
+
margin: 0 0 0.25rem;
|
|
2780
|
+
padding: 0.625rem 0.75rem;
|
|
2781
|
+
position: relative;
|
|
2782
|
+
top: auto;
|
|
2783
|
+
transition: background-color var(--bb-transition-fast) ease;
|
|
2784
|
+
/* Flyout search is sticky `z-index: 1`; that same stacking painted over
|
|
2785
|
+
the sheet's grab handle once the body scrolled. */
|
|
2786
|
+
z-index: auto;
|
|
2787
|
+
|
|
2788
|
+
/* One emphasis stop above the resting --bb-muted (6%) fill. */
|
|
2789
|
+
&:focus-within {
|
|
2790
|
+
background-color: color-mix(in oklab, var(--bb-text) 8%, var(--bb-panel));
|
|
2791
|
+
}
|
|
2792
|
+
|
|
2793
|
+
/* Lens on the trailing edge, same side as BbSelect's sheet search. */
|
|
2794
|
+
.bb-dropdown__search-icon {
|
|
2795
|
+
order: 1;
|
|
2796
|
+
}
|
|
2797
|
+
|
|
2798
|
+
.bb-dropdown__search-input {
|
|
2799
|
+
font-size: var(--bb-input-fs);
|
|
2800
|
+
order: 0;
|
|
2801
|
+
}
|
|
2802
|
+
|
|
2803
|
+
/* Busy strip sits on the field's bottom edge (no border to overlay). */
|
|
2804
|
+
.bb-dropdown__group-loading {
|
|
2805
|
+
border-radius: 0 0 var(--bb-radius) var(--bb-radius);
|
|
2806
|
+
bottom: 0;
|
|
2807
|
+
}
|
|
2539
2808
|
}
|
|
2540
2809
|
|
|
2541
2810
|
/* Removable selection chips for the current multi-select level — sit above the
|
|
2542
2811
|
menu (and its search), mirroring BbSelect's sheet. */
|
|
2543
2812
|
.bb-dropdown__sheet-selection {
|
|
2544
2813
|
flex-shrink: 0;
|
|
2545
|
-
padding: 0
|
|
2814
|
+
padding: 0 0 0.5rem;
|
|
2546
2815
|
text-align: left;
|
|
2547
2816
|
}
|
|
2548
2817
|
|
|
2549
2818
|
.bb-dropdown__sheet-chips {
|
|
2550
2819
|
display: flex;
|
|
2551
2820
|
flex-wrap: wrap;
|
|
2552
|
-
gap:
|
|
2821
|
+
gap: 0.5rem;
|
|
2553
2822
|
}
|
|
2554
2823
|
|
|
2555
2824
|
/* Touch target: the xl badge is a ~24px pill — fine inline on desktop, too
|
|
@@ -2558,9 +2827,9 @@ export type BbDropdownGroupEvents = {
|
|
|
2558
2827
|
padding and a bigger clear glyph; the badge API stays untouched. Mirrors
|
|
2559
2828
|
BbSelectPopover's sheet chips. */
|
|
2560
2829
|
.bb-dropdown__sheet-chip {
|
|
2561
|
-
--min-size:
|
|
2562
|
-
--padding-inline:
|
|
2563
|
-
--clear-size:
|
|
2830
|
+
--min-size: 2.125rem;
|
|
2831
|
+
--padding-inline: 0.75rem;
|
|
2832
|
+
--clear-size: 1.25rem;
|
|
2564
2833
|
}
|
|
2565
2834
|
|
|
2566
2835
|
.bb-dropdown__nav {
|
|
@@ -2568,42 +2837,69 @@ export type BbDropdownGroupEvents = {
|
|
|
2568
2837
|
column-gap: 6px;
|
|
2569
2838
|
display: flex;
|
|
2570
2839
|
width: 100%;
|
|
2571
|
-
}
|
|
2572
2840
|
|
|
2573
|
-
|
|
2574
|
-
|
|
2575
|
-
|
|
2576
|
-
|
|
2577
|
-
|
|
2578
|
-
|
|
2579
|
-
|
|
2580
|
-
|
|
2581
|
-
|
|
2582
|
-
|
|
2583
|
-
|
|
2584
|
-
|
|
2585
|
-
|
|
2586
|
-
|
|
2841
|
+
/* Drilled in: a navigation bar. The TITLE LINE sets the bar height — same
|
|
2842
|
+
as BbSelect's OffCanvas title — so City and Status share one baseline.
|
|
2843
|
+
The back control is a BbButton ghost sm, absolutely pinned to the
|
|
2844
|
+
OffCanvas header with equal inset from the sheet's top and left. */
|
|
2845
|
+
&--drill {
|
|
2846
|
+
/* Title line sets the bar height — same as BbSelect's OffCanvas title.
|
|
2847
|
+
Sit in the header's `--px`; do not pull out and re-pad to fake a
|
|
2848
|
+
full-bleed bar. Bottom pad matches BbSelect's
|
|
2849
|
+
`calc(var(--py) - 6px)`. No `position: relative` — the back button's
|
|
2850
|
+
containing block is the header. */
|
|
2851
|
+
display: block;
|
|
2852
|
+
padding-bottom: calc(var(--py, var(--bb-panel-p)) - 6px);
|
|
2853
|
+
|
|
2854
|
+
/* Equal inset from the sheet edges. Header is `position: relative`
|
|
2855
|
+
in OffCanvas. Size/chrome come from BbButton ghost sm.
|
|
2856
|
+
Use `--bb-panel-p`, not `--px`: BbButton redefines `--px` as its
|
|
2857
|
+
own padding token, which collapsed the inset to 10px. */
|
|
2858
|
+
.bb-dropdown__nav-back {
|
|
2859
|
+
left: var(--bb-panel-p);
|
|
2860
|
+
position: absolute;
|
|
2861
|
+
top: var(--bb-panel-p);
|
|
2862
|
+
|
|
2863
|
+
/* Same chevron_right asset the submenu rows use, pointed back. */
|
|
2864
|
+
.bb-button__icon {
|
|
2865
|
+
transform: rotate(180deg);
|
|
2866
|
+
}
|
|
2867
|
+
}
|
|
2587
2868
|
|
|
2588
|
-
|
|
2589
|
-
|
|
2869
|
+
/* Spacer kept in the DOM for the drill a11y tests; layout is now the
|
|
2870
|
+
title's equal inline gutters below. */
|
|
2871
|
+
.bb-dropdown__nav-gutter {
|
|
2872
|
+
display: none;
|
|
2873
|
+
}
|
|
2590
2874
|
}
|
|
2875
|
+
}
|
|
2591
2876
|
|
|
2592
|
-
|
|
2593
|
-
|
|
2594
|
-
|
|
2595
|
-
|
|
2596
|
-
}
|
|
2877
|
+
/* Pure spacer, mirroring the back button's box (root / non-drill layouts). */
|
|
2878
|
+
.bb-dropdown__nav-gutter {
|
|
2879
|
+
height: 24px;
|
|
2880
|
+
width: 24px;
|
|
2597
2881
|
}
|
|
2598
2882
|
|
|
2599
|
-
.bb-dropdown__nav-title {
|
|
2883
|
+
.bb-offcanvas__title.bb-dropdown__nav-title {
|
|
2600
2884
|
flex: auto;
|
|
2601
2885
|
font-weight: 500;
|
|
2886
|
+
/* Same 1em line box as BbSelect's sheet title so the cap sits on the
|
|
2887
|
+
same baseline. Descenders ("Tags") paint into the drill nav's bottom
|
|
2888
|
+
pad — `overflow-y: visible`; ellipsis still clips on X only. */
|
|
2602
2889
|
min-width: 0;
|
|
2603
|
-
overflow:
|
|
2890
|
+
overflow-x: clip;
|
|
2891
|
+
overflow-y: visible;
|
|
2604
2892
|
text-overflow: ellipsis;
|
|
2605
2893
|
white-space: nowrap;
|
|
2606
2894
|
}
|
|
2895
|
+
|
|
2896
|
+
.bb-dropdown__nav--drill .bb-dropdown__nav-title {
|
|
2897
|
+
/* Equal side gutters matching BbButton sm icon-only (24px) so the label
|
|
2898
|
+
centres. */
|
|
2899
|
+
display: block;
|
|
2900
|
+
padding-inline: 24px;
|
|
2901
|
+
text-align: center;
|
|
2902
|
+
}
|
|
2607
2903
|
}
|
|
2608
2904
|
|
|
2609
2905
|
/* Level slide: drilling in enters from the right and the old level exits left;
|
|
@@ -2639,4 +2935,15 @@ export type BbDropdownGroupEvents = {
|
|
|
2639
2935
|
opacity: 0;
|
|
2640
2936
|
transform: translateX(28px);
|
|
2641
2937
|
}
|
|
2938
|
+
|
|
2939
|
+
/*
|
|
2940
|
+
* Q14.3 — see `reservesCheckSpace` in BbDropdown.vue for why this is scoped to
|
|
2941
|
+
* an auto-width panel. `:has(.item__check)` targets exactly the rows a
|
|
2942
|
+
* selectable group mounts a check on, so a non-selectable group in the same
|
|
2943
|
+
* menu is untouched. The value matches the `--selected` rule's clearance; when
|
|
2944
|
+
* both apply they agree, so nothing shifts on selection.
|
|
2945
|
+
*/
|
|
2946
|
+
.bb-dropdown__panel--reserve-check .bb-dropdown__item:has(.item__check) {
|
|
2947
|
+
padding-inline-end: calc(6px + 16px + 4px);
|
|
2948
|
+
}
|
|
2642
2949
|
```
|