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