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.
Files changed (350) hide show
  1. package/README.md +72 -33
  2. package/dist/ai/BbAccordion.md +3 -3
  3. package/dist/ai/BbAlert.md +9 -5
  4. package/dist/ai/BbAsterisk.md +17 -0
  5. package/dist/ai/BbAvatar.md +12 -3
  6. package/dist/ai/BbBadge.md +15 -10
  7. package/dist/ai/BbBadgeButton.md +16 -16
  8. package/dist/ai/BbBaseButton.md +16 -16
  9. package/dist/ai/BbBaseCheckbox.md +8 -8
  10. package/dist/ai/BbBaseCheckboxGroup.md +13 -13
  11. package/dist/ai/BbBaseCheckboxIcon.md +26 -9
  12. package/dist/ai/BbBaseColorInput.md +11 -11
  13. package/dist/ai/BbBaseDatePicker.md +6 -6
  14. package/dist/ai/BbBaseDatePickerInput.md +15 -15
  15. package/dist/ai/BbBaseInputContainer.md +12 -12
  16. package/dist/ai/BbBaseNumberInput.md +8 -8
  17. package/dist/ai/BbBaseRadio.md +5 -5
  18. package/dist/ai/BbBaseRadioGroup.md +7 -7
  19. package/dist/ai/BbBaseRadioIcon.md +25 -9
  20. package/dist/ai/BbBaseRating.md +5 -5
  21. package/dist/ai/BbBaseSelect.md +22 -21
  22. package/dist/ai/BbBaseSlider.md +9 -9
  23. package/dist/ai/BbBaseSwitch.md +8 -8
  24. package/dist/ai/BbBaseSwitchGroup.md +13 -13
  25. package/dist/ai/BbBaseSwitchIcon.md +28 -10
  26. package/dist/ai/BbBaseTag.md +10 -10
  27. package/dist/ai/BbBaseTextInput.md +9 -9
  28. package/dist/ai/BbBaseTextarea.md +9 -9
  29. package/dist/ai/BbBaseTimePickerInput.md +13 -13
  30. package/dist/ai/BbBreadcrumbs.md +2 -2
  31. package/dist/ai/BbButton.md +15 -15
  32. package/dist/ai/BbCheckbox.md +18 -17
  33. package/dist/ai/BbCheckboxGroup.md +15 -14
  34. package/dist/ai/BbCollapsible.md +11 -9
  35. package/dist/ai/BbColorInput.md +15 -15
  36. package/dist/ai/BbColorPalette.md +12 -6
  37. package/dist/ai/BbConfirm.md +12 -5
  38. package/dist/ai/BbDatePicker.md +13 -13
  39. package/dist/ai/BbDatePickerInput.md +20 -20
  40. package/dist/ai/BbDialog.md +78 -12
  41. package/dist/ai/BbDropdown.md +132 -22
  42. package/dist/ai/BbDropdownButton.md +12 -12
  43. package/dist/ai/BbDropdownGroup.md +1 -1
  44. package/dist/ai/BbDropzone.md +4 -4
  45. package/dist/ai/BbForm.md +49 -14
  46. package/dist/ai/BbIcon.md +6 -0
  47. package/dist/ai/BbIndicator.md +5 -5
  48. package/dist/ai/BbNumberInput.md +11 -11
  49. package/dist/ai/BbOffCanvas.md +90 -20
  50. package/dist/ai/BbPagination.md +3 -3
  51. package/dist/ai/BbPopover.md +32 -17
  52. package/dist/ai/BbProgress.md +7 -4
  53. package/dist/ai/BbRadio.md +16 -15
  54. package/dist/ai/BbRadioGroup.md +20 -17
  55. package/dist/ai/BbRating.md +11 -11
  56. package/dist/ai/BbSelect.md +138 -37
  57. package/dist/ai/BbSelectPopover.md +40 -41
  58. package/dist/ai/BbSlider.md +37 -22
  59. package/dist/ai/BbSmoothHeight.md +1 -1
  60. package/dist/ai/BbSwitch.md +25 -10
  61. package/dist/ai/BbSwitchGroup.md +17 -14
  62. package/dist/ai/BbTable.md +920 -109
  63. package/dist/ai/BbTabs.md +28 -14
  64. package/dist/ai/BbTabsList.md +1 -1
  65. package/dist/ai/BbTabsPanes.md +1 -1
  66. package/dist/ai/BbTabsRoot.md +10 -10
  67. package/dist/ai/BbTag.md +14 -14
  68. package/dist/ai/BbTextInput.md +16 -15
  69. package/dist/ai/BbTextarea.md +13 -13
  70. package/dist/ai/BbTimePicker.md +10 -10
  71. package/dist/ai/BbTimePickerInput.md +17 -17
  72. package/dist/ai/BbToast.md +1 -1
  73. package/dist/ai/BbToastPortal.md +1 -1
  74. package/dist/ai/BbTooltip.md +12 -10
  75. package/dist/ai/BbTree.md +1 -1
  76. package/dist/ai/ChipsBox.md +1 -1
  77. package/dist/ai/CommonInputWrapper.md +10 -10
  78. package/dist/ai/CommonPopover.md +6 -6
  79. package/dist/ai/FlatListBox.md +5 -5
  80. package/dist/ai/GroupedListBox.md +5 -5
  81. package/dist/ai/ListBox.md +4 -4
  82. package/dist/ai/OptionsContainer.md +4 -4
  83. package/dist/ai/changelog.json +128 -2
  84. package/dist/ai/components.json +917 -100
  85. package/dist/ai/composables/useBbConfig.md +72 -11
  86. package/dist/ai/composables/useConfirm.md +5 -3
  87. package/dist/ai/guides/ai-router.md +9 -4
  88. package/dist/ai/guides/component-picker.md +18 -18
  89. package/dist/ai/guides/design-language.md +14 -14
  90. package/dist/ai/guides/design-tokens.md +25 -18
  91. package/dist/ai/guides/fetch-items-playbook.md +1 -1
  92. package/dist/ai/guides/icons-policy.md +11 -5
  93. package/dist/ai/guides/installation-and-plugin-setup.md +85 -23
  94. package/dist/ai/guides/migration/components/bb-checkbox-group.md +30 -0
  95. package/dist/ai/guides/migration/components/bb-checkbox.md +37 -3
  96. package/dist/ai/guides/migration/components/bb-collapsible.md +5 -5
  97. package/dist/ai/guides/migration/components/bb-dialog.md +62 -34
  98. package/dist/ai/guides/migration/components/bb-offcanvas.md +29 -13
  99. package/dist/ai/guides/migration/components/bb-rating.md +8 -2
  100. package/dist/ai/guides/migration/components/bb-select.md +5 -2
  101. package/dist/ai/guides/migration/components/bb-table.md +560 -28
  102. package/dist/ai/guides/migration/components/bb-text-input.md +6 -6
  103. package/dist/ai/guides/migration/v2-to-v3.md +260 -89
  104. package/dist/ai/guides/ssr-prefill.md +120 -0
  105. package/dist/ai/index.md +10 -9
  106. package/dist/ai/recipes/inertia/approvals-inbox.md +0 -1
  107. package/dist/ai/recipes/inertia/inline-edit-workspace.md +0 -1
  108. package/dist/ai/recipes/inertia/layout-scaffold.md +5 -1
  109. package/dist/ai/recipes/inertia/ownership-atlas.md +49 -29
  110. package/dist/ai/recipes/inertia/record-form.md +0 -1
  111. package/dist/ai/recipes/inertia/records-workspace.md +26 -8
  112. package/dist/ai/recipes/inertia/upload-center.md +0 -1
  113. package/dist/ai/recipes/nuxt/approvals-inbox.md +0 -1
  114. package/dist/ai/recipes/nuxt/inline-edit-workspace.md +0 -1
  115. package/dist/ai/recipes/nuxt/layout-scaffold.md +5 -1
  116. package/dist/ai/recipes/nuxt/record-form.md +0 -1
  117. package/dist/ai/recipes/nuxt/records-workspace.md +26 -8
  118. package/dist/ai/recipes/nuxt/upload-center.md +0 -1
  119. package/dist/ai/recipes/vue/approvals-inbox.md +0 -1
  120. package/dist/ai/recipes/vue/inline-edit-workspace.md +0 -1
  121. package/dist/ai/recipes/vue/layout-scaffold.md +5 -1
  122. package/dist/ai/recipes/vue/records-workspace.md +26 -8
  123. package/dist/ai/recipes/vue/upload-center.md +0 -1
  124. package/dist/ai/source/BbAlert.md +60 -2
  125. package/dist/ai/source/BbAvatar.md +3 -3
  126. package/dist/ai/source/BbBadge.md +60 -15
  127. package/dist/ai/source/BbBadgeButton.md +8 -2
  128. package/dist/ai/source/BbBaseButton.md +3 -1
  129. package/dist/ai/source/BbBaseCheckboxGroup.md +6 -2
  130. package/dist/ai/source/BbBaseDatePicker.md +3 -1
  131. package/dist/ai/source/BbBaseDatePickerInput.md +5 -1
  132. package/dist/ai/source/BbBaseInputContainer.md +52 -1
  133. package/dist/ai/source/BbBaseRadioGroup.md +4 -0
  134. package/dist/ai/source/BbBaseRating.md +3 -1
  135. package/dist/ai/source/BbBaseSelect.md +71 -16
  136. package/dist/ai/source/BbBaseSwitchGroup.md +4 -0
  137. package/dist/ai/source/BbBaseTimePickerInput.md +5 -1
  138. package/dist/ai/source/BbBreadcrumbs.md +31 -0
  139. package/dist/ai/source/BbButton.md +51 -24
  140. package/dist/ai/source/BbCheckbox.md +15 -1
  141. package/dist/ai/source/BbCheckboxGroup.md +2 -1
  142. package/dist/ai/source/BbCollapsible.md +7 -1
  143. package/dist/ai/source/BbColorInput.md +3 -4
  144. package/dist/ai/source/BbColorPalette.md +3 -4
  145. package/dist/ai/source/BbDatePicker.md +5 -1
  146. package/dist/ai/source/BbDatePickerInput.md +5 -1
  147. package/dist/ai/source/BbDialog.md +175 -19
  148. package/dist/ai/source/BbDropdown.md +376 -69
  149. package/dist/ai/source/BbDropdownGroup.md +330 -59
  150. package/dist/ai/source/BbForm.md +93 -5
  151. package/dist/ai/source/BbIcon.md +46 -36
  152. package/dist/ai/source/BbNumberInput.md +3 -4
  153. package/dist/ai/source/BbOffCanvas.md +474 -194
  154. package/dist/ai/source/BbPopover.md +24 -17
  155. package/dist/ai/source/BbProgress.md +2 -2
  156. package/dist/ai/source/BbRadio.md +15 -1
  157. package/dist/ai/source/BbRadioGroup.md +3 -1
  158. package/dist/ai/source/BbSelect.md +50 -2
  159. package/dist/ai/source/BbSelectPopover.md +171 -23
  160. package/dist/ai/source/BbSlider.md +3 -4
  161. package/dist/ai/source/BbSwitch.md +15 -1
  162. package/dist/ai/source/BbSwitchGroup.md +8 -5
  163. package/dist/ai/source/BbTable.md +5092 -1446
  164. package/dist/ai/source/BbTabs.md +6 -7
  165. package/dist/ai/source/BbTabsList.md +6 -7
  166. package/dist/ai/source/BbTabsPanes.md +6 -7
  167. package/dist/ai/source/BbTabsRoot.md +6 -7
  168. package/dist/ai/source/BbTag.md +3 -4
  169. package/dist/ai/source/BbTextInput.md +3 -4
  170. package/dist/ai/source/BbTextarea.md +3 -4
  171. package/dist/ai/source/BbTimePicker.md +4 -1
  172. package/dist/ai/source/BbTimePickerInput.md +5 -1
  173. package/dist/ai/source/BbToast.md +3 -1
  174. package/dist/ai/source/BbTooltip.md +5 -1
  175. package/dist/ai/source/CommonInputWrapper.md +4 -0
  176. package/dist/ai/source/CommonPopover.md +6 -0
  177. package/dist/ai/source/FlatListBox.md +11 -5
  178. package/dist/ai/source/GroupedListBox.md +7 -5
  179. package/dist/components/BbAlert/BbAlert.vue_vue_type_script_setup_true_lang.js +4 -4
  180. package/dist/components/BbAlert/types.d.ts +10 -1
  181. package/dist/components/BbAvatar/BbAvatar.vue.d.ts +1 -1
  182. package/dist/components/BbAvatar/BbAvatar.vue_vue_type_script_setup_true_lang.js +33 -33
  183. package/dist/components/BbBadge/BadgeBodyContent.vue_vue_type_script_setup_true_lang.js +22 -16
  184. package/dist/components/BbBadge/BbBadge.vue_vue_type_script_setup_true_lang.js +36 -15
  185. package/dist/components/BbBadge/badgeButtonContext.d.ts +21 -8
  186. package/dist/components/BbBadge/types.d.ts +8 -2
  187. package/dist/components/BbBaseButton/BbBaseButton.vue_vue_type_script_setup_true_lang.js +47 -47
  188. package/dist/components/BbBaseButton/RouterComponent.vue_vue_type_script_setup_true_lang.js +14 -14
  189. package/dist/components/BbBaseCheckboxGroup/BbBaseCheckboxGroup.vue_vue_type_script_setup_true_lang.js +30 -28
  190. package/dist/components/BbBaseCheckboxGroup/types.d.ts +2 -2
  191. package/dist/components/BbBaseDatePicker/BbBaseDatePicker.vue_vue_type_script_setup_true_lang.js +167 -167
  192. package/dist/components/BbBaseDatePicker/BbBaseDatePickerInputDaySelector.vue.d.ts +9 -9
  193. package/dist/components/BbBaseDatePicker/BbBaseDatePickerInputDaySelector.vue_vue_type_script_setup_true_lang.js +78 -78
  194. package/dist/components/BbBaseDatePicker/BbBaseDatePickerMonthSelector.vue_vue_type_script_setup_true_lang.js +64 -64
  195. package/dist/components/BbBaseDatePickerInput/BbBaseDatePickerInput.vue.d.ts +1 -1
  196. package/dist/components/BbBaseDatePickerInput/BbBaseDatePickerInput.vue_vue_type_script_setup_true_lang.js +138 -138
  197. package/dist/components/BbBaseInputContainer/BbBaseInputContainer.vue_vue_type_script_setup_true_lang.js +2 -2
  198. package/dist/components/BbBaseRadioGroup/BbBaseRadioGroup.vue_vue_type_script_setup_true_lang.js +24 -22
  199. package/dist/components/BbBaseRating/BbBaseRating.vue_vue_type_script_setup_true_lang.js +40 -40
  200. package/dist/components/BbBaseSelect/BbBaseSelect.vue_vue_type_script_setup_true_lang.js +74 -65
  201. package/dist/components/BbBaseSelect/types.d.ts +22 -0
  202. package/dist/components/BbBaseSlider/BbBaseSlider.vue_vue_type_script_setup_true_lang.js +5 -5
  203. package/dist/components/BbBaseSwitchGroup/BbBaseSwitchGroup.vue_vue_type_script_setup_true_lang.js +30 -28
  204. package/dist/components/BbBaseTimePickerInput/BbBaseTimePickerInput.vue.d.ts +1 -1
  205. package/dist/components/BbBaseTimePickerInput/BbBaseTimePickerInput.vue_vue_type_script_setup_true_lang.js +104 -104
  206. package/dist/components/BbBreadcrumbs/BbBreadcrumbs.vue_vue_type_script_setup_true_lang.js +35 -35
  207. package/dist/components/BbButton/BbButton.vue_vue_type_script_setup_true_lang.js +85 -81
  208. package/dist/components/BbCheckboxGroup/types.d.ts +2 -1
  209. package/dist/components/BbCollapsible/types.d.ts +7 -1
  210. package/dist/components/BbColorInput/BbColorInput.vue.d.ts +1 -1
  211. package/dist/components/BbColorInput/BbColorInput.vue_vue_type_script_setup_true_lang.js +18 -18
  212. package/dist/components/BbColorPalette/BbColorPalette.vue.d.ts +2 -2
  213. package/dist/components/BbColorPalette/BbColorPalette.vue_vue_type_script_setup_true_lang.js +50 -50
  214. package/dist/components/BbConfirm/BbConfirm.vue_vue_type_script_setup_true_lang.js +17 -17
  215. package/dist/components/BbDatePicker/BbDatePicker.vue.d.ts +1 -1
  216. package/dist/components/BbDatePicker/BbDatePicker.vue_vue_type_script_setup_true_lang.js +100 -100
  217. package/dist/components/BbDatePickerInput/BbDatePickerInput.vue_vue_type_script_setup_true_lang.js +21 -21
  218. package/dist/components/BbDialog/BbDialog.vue.d.ts +1 -1
  219. package/dist/components/BbDialog/BbDialog.vue_vue_type_script_setup_true_lang.js +133 -107
  220. package/dist/components/BbDialog/types.d.ts +29 -2
  221. package/dist/components/BbDropdown/AdaptiveDropdown.vue.d.ts +2 -0
  222. package/dist/components/BbDropdown/AdaptiveDropdown.vue_vue_type_script_setup_true_lang.js +99 -100
  223. package/dist/components/BbDropdown/BbDropdown.vue.d.ts +2 -2
  224. package/dist/components/BbDropdown/BbDropdown.vue_vue_type_script_setup_true_lang.js +208 -201
  225. package/dist/components/BbDropdown/BbDropdownList.vue_vue_type_script_setup_true_lang.js +225 -208
  226. package/dist/components/BbDropdown/DropdownPipelineResolver.vue_vue_type_script_setup_true_lang.js +21 -21
  227. package/dist/components/BbDropdown/types.d.ts +20 -5
  228. package/dist/components/BbDropdownButton/BbDropdownButton.vue_vue_type_script_setup_true_lang.js +5 -5
  229. package/dist/components/BbIcon/BbIcon.vue_vue_type_script_setup_true_lang.js +46 -46
  230. package/dist/components/BbIcon/iconCache.d.ts +33 -0
  231. package/dist/components/BbIcon/iconCache.js +17 -0
  232. package/dist/components/BbNumberInput/BbNumberInput.vue.d.ts +1 -1
  233. package/dist/components/BbNumberInput/BbNumberInput.vue_vue_type_script_setup_true_lang.js +15 -15
  234. package/dist/components/BbOffCanvas/BbOffCanvas.vue.d.ts +1 -1
  235. package/dist/components/BbOffCanvas/BbOffCanvas.vue_vue_type_script_setup_true_lang.js +254 -208
  236. package/dist/components/BbOffCanvas/types.d.ts +30 -5
  237. package/dist/components/BbPagination/BbPagination.vue.d.ts +1 -1
  238. package/dist/components/BbPopover/BbPopover.vue.d.ts +2 -2
  239. package/dist/components/BbPopover/BbPopover.vue_vue_type_script_setup_true_lang.js +149 -146
  240. package/dist/components/BbPopover/types.d.ts +3 -2
  241. package/dist/components/BbRadioGroup/types.d.ts +3 -1
  242. package/dist/components/BbSelect/BbSelect.vue_vue_type_script_setup_true_lang.js +27 -23
  243. package/dist/components/BbSelect/types.d.ts +32 -0
  244. package/dist/components/BbSelectPopover/BbSelectPopover.vue_vue_type_script_setup_true_lang.js +221 -213
  245. package/dist/components/BbSlider/BbSlider.vue.d.ts +1 -1
  246. package/dist/components/BbSlider/BbSlider.vue_vue_type_script_setup_true_lang.js +20 -20
  247. package/dist/components/BbTable/BbTable.vue.d.ts +10 -4
  248. package/dist/components/BbTable/BbTable.vue_vue_type_script_setup_true_lang.js +1433 -600
  249. package/dist/components/BbTable/BbTableDataRow.d.ts +162 -0
  250. package/dist/components/BbTable/BbTableDataRow.js +136 -0
  251. package/dist/components/BbTable/BbTableExpandRow.d.ts +73 -0
  252. package/dist/components/BbTable/BbTableExpandRow.js +52 -0
  253. package/dist/components/BbTable/types.d.ts +324 -111
  254. package/dist/components/BbTable/utils.d.ts +92 -4
  255. package/dist/components/BbTable/utils.js +71 -36
  256. package/dist/components/BbTabs/types.d.ts +0 -8
  257. package/dist/components/BbTag/BbTag.vue.d.ts +1 -1
  258. package/dist/components/BbTag/BbTag.vue_vue_type_script_setup_true_lang.js +18 -18
  259. package/dist/components/BbTextInput/BbTextInput.vue.d.ts +1 -1
  260. package/dist/components/BbTextInput/BbTextInput.vue_vue_type_script_setup_true_lang.js +18 -18
  261. package/dist/components/BbTextarea/BbTextarea.vue.d.ts +1 -1
  262. package/dist/components/BbTextarea/BbTextarea.vue_vue_type_script_setup_true_lang.js +54 -54
  263. package/dist/components/BbTimePicker/BbTimePicker.vue.d.ts +1 -1
  264. package/dist/components/BbTimePicker/BbTimePicker.vue_vue_type_script_setup_true_lang.js +80 -80
  265. package/dist/components/BbTimePickerInput/BbTimePickerInput.vue_vue_type_script_setup_true_lang.js +61 -61
  266. package/dist/components/BbToast/BbToast.vue_vue_type_script_setup_true_lang.js +17 -17
  267. package/dist/components/BbToast/BbToastMessage.vue_vue_type_script_setup_true_lang.js +13 -13
  268. package/dist/components/BbTooltip/types.d.ts +5 -1
  269. package/dist/components/ChipsBox/ChipsBox.vue_vue_type_script_setup_true_lang.js +17 -17
  270. package/dist/components/ClearableButton/ClearableButton.vue_vue_type_script_setup_true_lang.js +5 -5
  271. package/dist/components/CommonPopover/CommonPopover.vue_vue_type_script_setup_true_lang.js +2 -1
  272. package/dist/components/FlatListBox/FlatListBox.vue_vue_type_script_setup_true_lang.js +83 -83
  273. package/dist/components/GroupedListBox/GroupedListBox.vue_vue_type_script_setup_true_lang.js +56 -56
  274. package/dist/composables/useBaseOptions.js +30 -20
  275. package/dist/composables/useBbConfig.d.ts +27 -6
  276. package/dist/composables/useBbConfig.js +8 -2
  277. package/dist/composables/useConfig.d.ts +59 -0
  278. package/dist/composables/useConfig.js +9 -0
  279. package/dist/composables/useItemsGetter.d.ts +11 -0
  280. package/dist/composables/useItemsGetter.js +44 -18
  281. package/dist/composables/useLocale.js +10 -7
  282. package/dist/composables/useMobile.js +5 -5
  283. package/dist/composables/usePrefill.d.ts +21 -2
  284. package/dist/composables/usePrefill.js +25 -19
  285. package/dist/composables/useSsrState.d.ts +20 -0
  286. package/dist/composables/useSsrState.js +13 -0
  287. package/dist/composables/useTableWidthContext.d.ts +24 -4
  288. package/dist/composables/useTableWidthContext.js +31 -28
  289. package/dist/composables/useToast.js +5 -5
  290. package/dist/deprecation/ai-deprecations.json.d.ts +121 -11
  291. package/dist/deprecation/ai-deprecations.json.js +1 -1
  292. package/dist/directives/bbDropdown.d.ts +15 -4
  293. package/dist/directives/bbDropdown.js +31 -9
  294. package/dist/directives/createPopoverDirective.d.ts +62 -0
  295. package/dist/directives/createPopoverDirective.js +63 -23
  296. package/dist/i18n/locales/cs.json +4 -1
  297. package/dist/i18n/locales/da.json +4 -1
  298. package/dist/i18n/locales/de.json +4 -1
  299. package/dist/i18n/locales/el.json +4 -1
  300. package/dist/i18n/locales/en.json +4 -1
  301. package/dist/i18n/locales/es.json +4 -1
  302. package/dist/i18n/locales/fi.json +4 -1
  303. package/dist/i18n/locales/fr.json +4 -1
  304. package/dist/i18n/locales/hu.json +4 -1
  305. package/dist/i18n/locales/it.json +4 -1
  306. package/dist/i18n/locales/ja.json +4 -1
  307. package/dist/i18n/locales/ko.json +4 -1
  308. package/dist/i18n/locales/nb.json +4 -1
  309. package/dist/i18n/locales/nl.json +4 -1
  310. package/dist/i18n/locales/pl.json +4 -1
  311. package/dist/i18n/locales/pt.json +4 -1
  312. package/dist/i18n/locales/ro.json +4 -1
  313. package/dist/i18n/locales/ru.json +4 -1
  314. package/dist/i18n/locales/sv.json +4 -1
  315. package/dist/i18n/locales/tr.json +4 -1
  316. package/dist/i18n/locales/uk.json +4 -1
  317. package/dist/i18n/locales/zh-cn.json +4 -1
  318. package/dist/index.d.ts +7 -2
  319. package/dist/index.js +69 -67
  320. package/dist/llms-full.txt +3997 -1458
  321. package/dist/llms-medium.txt +140 -73
  322. package/dist/llms.txt +7 -6
  323. package/dist/locale-blueprint.json +4 -1
  324. package/dist/nuxt-auto-imports.d.ts +100 -0
  325. package/dist/nuxt-auto-imports.js +55 -0
  326. package/dist/nuxt-module.d.ts +22 -1
  327. package/dist/nuxt.js +22 -8
  328. package/dist/plugin.d.ts +10 -1
  329. package/dist/plugin.js +20 -19
  330. package/dist/runtime/nuxt-plugin.js +28 -21
  331. package/dist/styles.css +1 -1
  332. package/dist/utilities/misc/listboxMetrics.d.ts +3 -3
  333. package/dist/utilities/misc/listboxMetrics.js +2 -2
  334. package/dist/utilities/misc/ssrStateInjectionKey.d.ts +42 -0
  335. package/dist/utilities/misc/ssrStateInjectionKey.js +4 -0
  336. package/dist/validated/BbForm.vue_vue_type_script_setup_true_lang.js +45 -27
  337. package/dist/validated/BbSelect.vue.d.ts +2 -0
  338. package/dist/validated/BbSelect.vue_vue_type_script_setup_true_lang.js +1 -0
  339. package/dist/validated/useValidatedField.js +25 -23
  340. package/dist/vite.js +7 -3
  341. package/llms.txt +8 -7
  342. package/package.json +2 -2
  343. package/scripts/lib/eslint-plugin.d.ts +19 -1
  344. package/scripts/lib/eslint-plugin.mjs +155 -14
  345. package/scripts/lib/html-attributes.mjs +91 -0
  346. package/scripts/lib/validate-bb-markup.mjs +59 -11
  347. package/dist/assets/svgs/sort.svg_raw.js +0 -4
  348. package/dist/components/BbBadge/BadgeAppendIcon.vue.d.ts +0 -3
  349. package/dist/components/BbBadge/BadgeAppendIcon.vue.js +0 -5
  350. 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="{ 'bb-dropdown--mobile': isMobile }"
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 { config } from 'virtual:bitboss-ui/config';
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), since a searched
1548
- * list is usually long; set your own value to tweak, or `'none'` to uncap.
1549
- * Non-searchable groups are uncapped unless you set this.
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 (hides arrow).
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
- font-size: calc(var(--bb-fs) - 1px);
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
- --dialog-title-fs: calc(var(--bb-fs) - 1px);
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
- font-size: calc(var(--bb-fs) + 1px);
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
- padding: 0;
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
- padding: 2px 10px;
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(--bb-fs) - 1px);
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: 2px 10px;
2747
+ min-height: var(--sheet-row-h, 44px);
2748
+ padding-left: calc(6px + 4px);
2529
2749
  }
2530
2750
 
2531
- .bb-dropdown__group-title {
2532
- font-size: calc(var(--bb-fs) - 1px);
2533
- padding: 8px 10px 4px;
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
- padding: 8px 10px;
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 4px 8px;
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: 8px;
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: 34px;
2562
- --padding-inline: 12px;
2563
- --clear-size: 20px;
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
- .bb-dropdown__nav-back {
2574
- align-items: center;
2575
- background: transparent;
2576
- border: none;
2577
- border-radius: var(--bb-radius-sm);
2578
- color: var(--bb-text);
2579
- cursor: pointer;
2580
- display: inline-flex;
2581
- flex-shrink: 0;
2582
- /* Touch target: this is the sheet's only way back up a level. */
2583
- height: 40px;
2584
- justify-content: center;
2585
- margin-inline-start: -8px;
2586
- width: 40px;
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
- &:hover {
2589
- background-color: color-mix(in oklab, var(--bb-text) 8%, transparent);
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
- .bb-dropdown__nav-back-icon {
2593
- --size: 16px;
2594
- /* Reuse `chevron_right` pointed the other way (no left asset exists). */
2595
- transform: rotate(180deg);
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: hidden;
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
  ```