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
@@ -161,13 +161,68 @@ header and footer stay pinned.
161
161
 
162
162
  - Use the `title` slot to restyle just the title text — it stays wired to
163
163
  `aria-labelledby` and receives the `title` prop as `text`.
164
- - Unlike `BbDialog`, the **`header` slot is fully supported here** and replaces
165
- the whole header section; it receives `titleId`, `title` and `close`, so you
166
- can build a custom header and still keep the accessible name wired through
167
- `titleId`.
164
+ - **`description`** adds one muted line under the title the panel's subtitle,
165
+ and the only thing `aria-describedby` points at. Keep it to a sentence; the
166
+ body is deliberately not described. The `description` slot takes markup and
167
+ receives the prop as `text`. A panel without one keeps its original
168
+ single-row header.
169
+ - The **`header` slot** replaces the whole header section; it receives
170
+ `titleId`, `title` and `close`, so you can build a custom header and still
171
+ keep the accessible name wired through `titleId`. `BbDialog` supports the
172
+ same slot with the same payload, and forwards it to its adaptive sheet — the
173
+ two surfaces are symmetric here.
168
174
  - Omitting `title` (and the `header` slot) removes the header entirely — you
169
175
  then own the accessible name.
170
176
 
177
+ **A described panel (via the #description slot)**
178
+
179
+ ```vue
180
+ <template>
181
+ <BbButton
182
+ prepend:icon="lucide:user-plus"
183
+ variant="outline"
184
+ @click="open = true"
185
+ >
186
+ Invite teammate
187
+ </BbButton>
188
+ <BbOffCanvas v-model="open" side="right" title="Invite teammate">
189
+ <!-- The slot takes markup where the prop would only take a string. -->
190
+ <template #description>
191
+ They join the <strong>Northwind</strong> workspace as a viewer.
192
+ </template>
193
+ <div class="grid gap-3">
194
+ <BbTextInput
195
+ v-model="email"
196
+ compact
197
+ label="Email"
198
+ placeholder="ada@northwind.co"
199
+ type="email"
200
+ />
201
+ </div>
202
+ <template #footer>
203
+ <div class="flex justify-end gap-2">
204
+ <BbButton variant="ghost" @click="open = false">Cancel</BbButton>
205
+ <BbButton
206
+ :disabled="!email.trim()"
207
+ variant="primary"
208
+ @click="open = false"
209
+ >
210
+ Send invite
211
+ </BbButton>
212
+ </div>
213
+ </template>
214
+ </BbOffCanvas>
215
+ </template>
216
+
217
+ <script setup lang="ts">
218
+ import { ref } from 'vue';
219
+ import { BbButton, BbOffCanvas, BbTextInput } from 'bitboss-ui';
220
+
221
+ const open = ref(false);
222
+ const email = ref('');
223
+ </script>
224
+ ```
225
+
171
226
  ### A filters drawer
172
227
 
173
228
  The archetypal off-canvas: search + toggles in the `default` slot, Apply/Reset
@@ -566,15 +621,26 @@ Set `draggable` to let the user flick the panel toward its edge to dismiss; a
566
621
  grab handle appears on the inner edge as the affordance. A draggable,
567
622
  `auto`-sized bottom panel is the canonical mobile sheet.
568
623
 
569
- The gesture is physical, not just a tap target:
570
-
571
- - Dragging past **a quarter of the panel's extent**, or a fast **flick toward
572
- the edge**, dismisses it; a shorter drag springs back to fully open.
573
- - On a vertical (top/bottom) sheet with a scrollable body, the drag **hands off
574
- to native scrolling** first you only start dragging the sheet once the body
575
- is scrolled to its edge, so scrolling a long sheet never accidentally closes
576
- it.
577
- - `persistent` / `disabled` still win: a drag that would dismiss instead plays
624
+ The gesture is powered by VueUse `useSwipe` with a **fixed pixel threshold**
625
+ (not a fraction of the panel height), so a tall filters sheet and a short menu
626
+ dismiss with the same motion:
627
+
628
+ - Swiping **about 50px toward the exit edge** dismisses it; a shorter swipe
629
+ springs back. Motion matches Vaul: the sheet exits on inline `transform`
630
+ (iOS easing, 500ms) while the backdrop fades on the same clock. Styles stay
631
+ frozen off-screen until the normal close wait finishes, so `dialog.close()`
632
+ does not flash the panel or jump the blur. Escape / backdrop / × still use
633
+ the open/close `translate` path.
634
+ - Only travel on the dismiss axis counts — a mostly horizontal flick on a short
635
+ bottom sheet does not latch or close it.
636
+ - On a vertical sheet with a scrollable body, the swipe **hands off to native
637
+ scrolling** first — you only drag the sheet once every scrollable ancestor
638
+ under the finger is at its dismiss edge (latched at touchstart, so a row
639
+ button and the empty panel chrome behave the same). A downward flick that
640
+ starts by scrolling _into_ the list stays a scroll for the rest of the
641
+ gesture; once the sheet is following the finger, reversing back to rest
642
+ does not start a scroll — lift to cancel.
643
+ - `persistent` / `disabled` still win: a swipe that would dismiss instead plays
578
644
  the "deny" nudge and springs back.
579
645
 
580
646
  **A draggable bottom sheet**
@@ -912,6 +978,8 @@ The panel is a native `<dialog>` opened with `showModal()` — the same mechanic
912
978
  - The panel is a true modal (`showModal()`): focus is contained within it, the
913
979
  page behind is inert, and focus returns to the trigger when it closes.
914
980
  `focus-target` only chooses where focus **starts**.
981
+ - `description` is what `aria-describedby` points at, so the panel announces
982
+ its purpose and not just its name.
915
983
  - The header close button carries a localized `aria-label` out of the box
916
984
  (`config.locale`).
917
985
  - Draggable dismissal is a convenience, not the only way out — the close button,
@@ -928,20 +996,21 @@ The panel is a native `<dialog>` opened with `showModal()` — the same mechanic
928
996
 
929
997
  | Prop | Type | Default | Required | Description |
930
998
  | --- | --- | --- | --- | --- |
931
- | `disabled` | `boolean \| undefined` | | | Disable EVERY user-initiated dismissal: backdrop click, Escape, drag-to-dismiss AND the header close (×) button (denied attempts play the deny nudge). Use it while an operation is in flight (e.g. a save) so the drawer cannot be dismissed mi… |
932
- | `draggable` | `boolean \| undefined` | `false` | | Enable drag-to-dismiss. The panel can be dragged from anywhere toward its edge to close, and a grab handle is shown on the inner edge as the affordance. When `false`, the panel is static (dismiss via the close button, backdrop, or Escape on… |
933
- | `eager` | `boolean \| undefined` | | | Render offcanvas content immediately instead of waiting for the first open. |
999
+ | `description` | `string \| undefined` | | | One short line under the title, in the header the shadcn `DialogDescription` shape: same block as the title, lower hierarchy, muted. It is also what `aria-describedby` points at. That wiring was dropped in v3 along with the old `descripti… |
1000
+ | `disabled` | `boolean \| undefined` | `false` | | Disable EVERY user-initiated dismissal: backdrop click, Escape, drag-to-dismiss AND the header close (×) button (denied attempts play the deny nudge). Use it while an operation is in flight (e.g. a save) so the drawer cannot be dismissed mi… |
1001
+ | `draggable` | `boolean \| undefined` | `false` | | Enable drag-to-dismiss via VueUse `useSwipe` (fixed ~50px threshold toward the exit edge, including from the scrollable body once it is at its scroll edge). A grab handle on the inner edge is the visual cue. When `false`, the panel is stati… |
1002
+ | `eager` | `boolean \| undefined` | `false` | | Render offcanvas content immediately instead of waiting for the first open. |
934
1003
  | `focusTarget` | `string \| undefined` | | | CSS selector of the element to focus after opening. Defaults to the first tabbable element. |
935
1004
  | `fullscreen` | `boolean \| "mobile" \| undefined` | | | Display the offcanvas fullscreen. Use `'mobile'` to restrict fullscreen to small devices. |
936
- | `hideClose` | `boolean \| undefined` | | | Hides the default close (×) button in the header (e.g. for a `persistent` drawer you don't want dismissible — the × otherwise still closes a persistent drawer). |
1005
+ | `hideClose` | `boolean \| undefined` | `false` | | Hides the default close (×) button in the header (e.g. for a `persistent` drawer you don't want dismissible — the × otherwise still closes a persistent drawer). |
937
1006
  | `modelValue` | `boolean \| undefined` | `false` | | Used by v-model to open / close the panel. A panel with no `v-model` starts closed. |
938
- | `persistent` | `boolean \| undefined` | | | Prevent closing via outside clicks, Escape key or drag-to-dismiss. The header close (×) button STILL closes a persistent drawer — that is the documented escape hatch; combine with `hideClose` to remove it, or use `disabled` to block every d… |
1007
+ | `persistent` | `boolean \| undefined` | `false` | | Prevent closing via outside clicks, Escape key or drag-to-dismiss. The header close (×) button STILL closes a persistent drawer — that is the documented escape hatch; combine with `hideClose` to remove it, or use `disabled` to block every d… |
939
1008
  | `side` | `"left" \| "right" \| "top" \| "bottom" \| undefined` | `"left"` | | Which viewport edge the offcanvas docks to (and slides in from). |
940
1009
  | `size` | `Responsive<OffCanvasSize> \| undefined` | `"sm"` | | Controls the maximum size of the offcanvas panel. Accepts named presets from `'xs'` to `'2xl'`, `'auto'`, a custom CSS size string, or a numeric pixel value — or a per-breakpoint map (e.g. `{ default: 'sm', lg: 'lg' }`) to switch responsive… |
941
1010
  | `stack` | `string \| undefined` | | | Name of the stack this drawer belongs to. Drawers sharing the same `stack` value step back behind one another as later ones open; drawers in different stacks never affect each other. When omitted, the drawer stacks with nothing. |
942
1011
  | `stackGap` | `number \| undefined` | `60` | | Pixels each stacked parent drawer shifts inward when a child opens on top, leaving a peeking band of the parent visible. |
943
1012
  | `title` | `string \| undefined` | | | Title text announced to assistive technologies. If omitted, no header is rendered and accessibility must be handled manually. |
944
- | `transitionDuration` | `number \| undefined` | `transitions.medium` | | Controls the duration of the open and close animations. |
1013
+ | `transitionDuration` | `number \| undefined` | `250` | | Controls the duration of the open and close animations. |
945
1014
 
946
1015
  ## Events
947
1016
 
@@ -954,9 +1023,10 @@ The panel is a native `<dialog>` opened with `showModal()` — the same mechanic
954
1023
  ## Slots
955
1024
 
956
1025
  - `default` — scope: `{ close: () => void; }` — Primary body content of the off-canvas panel, rendered in the scrollable body area.
1026
+ - `description` — scope: `BbOffCanvasDescriptionSlotProps` — Replaces the description text under the title. Renders the header even when `title` and `description` are unset — a slotted description is a description, the same rule `#title` follows.
957
1027
  - `footer` — scope: `object` — Content rendered in the panel footer, below the body area. Typically used for action buttons.
958
1028
  - `header` — scope: `BbOffCanvasHeaderSlotProps` — Replaces the entire off-canvas header section (title + close button). Maintains accessibility wiring via the provided props.
959
- - `title` — scope: `BbOffCanvasTitleSlotProps` — Replaces the default title text inside the header. Remains linked to the panel through `aria-labelledby`.
1029
+ - `title` — scope: `BbOffCanvasTitleSlotProps` — Replaces the default title text inside the header. Remains linked to the panel through `aria-labelledby`. Providing this slot renders the header even when `title` is unset — a slotted title is a title.
960
1030
 
961
1031
  ## See Also
962
1032
 
@@ -494,15 +494,15 @@ reach invalid pages.
494
494
  | Prop | Type | Default | Required | Description |
495
495
  | --- | --- | --- | --- | --- |
496
496
  | `align` | `"left" \| "center" \| "right" \| undefined` | `"right"` | | Alignment of the pagination control. |
497
- | `disabled` | `boolean \| undefined` | | | Disables the component |
497
+ | `disabled` | `boolean \| undefined` | `false` | | Disables the component |
498
498
  | `ellipsis` | `string \| undefined` | `"..."` | | String of text displayed in place of hidden pages. |
499
499
  | `label` | `string \| undefined` | | | Label of the pagination navigation landmark. When unset, falls back to the localized `pagination.label` (`'Pagination'` / `'Paginazione'`). |
500
500
  | `maxSize` | `string \| number \| undefined` | `6` | | Maximum number of clickable pages displayed at all times. This has a tolerance of +/- 1 for odd / even numbering. It does not include ellipses. |
501
501
  | `modelValue` | `number \| undefined` | `1` | | Used by v-model. The 1-based index of the current page — pagination starts on the first page, not page `0`. |
502
- | `navigation` | `boolean \| undefined` | | | Synchronizes the current page with the URL. Pair it with `replace` — see that prop. |
502
+ | `navigation` | `boolean \| undefined` | `false` | | Synchronizes the current page with the URL. Pair it with `replace` — see that prop. |
503
503
  | `perPage` | `string \| number \| undefined` | | | Number of items per page. Together with `totalItems` it derives the page count (`ceil(totalItems / perPage)`); when unset, one page holds everything. With a `tableId` it is also published to the shared table context, exactly like the table'… |
504
504
  | `queryKey` | `string \| undefined` | `"page"` | | Defines the query key to reference for maintaining navigation. |
505
- | `replace` | `boolean \| undefined` | | | Replaces history rather than pushing it when changing page. Recommended default whenever `navigation` is on: the URL keeps the current page (deep-linkable, survives reload) while Back returns to the page the user came from, instead of stepp… |
505
+ | `replace` | `boolean \| undefined` | `false` | | Replaces history rather than pushing it when changing page. Recommended default whenever `navigation` is on: the URL keeps the current page (deep-linkable, survives reload) while Back returns to the page the user came from, instead of stepp… |
506
506
  | `tableId` | `string \| undefined` | | | Id of a `BbTable` to pair with through the shared table context (see `useBbTableContext`). The current page is kept two-way synced with the table's context state, and the context's page count drives the control, overriding the local props. … |
507
507
  | `totalItems` | `string \| number \| undefined` | | | Total number of items across all pages. When set, the page count is derived as `ceil(totalItems / perPage)` and wins over `totalPages`. With a `tableId` it is also published to the shared table context, exactly like the table's own `total-i… |
508
508
  | `totalPages` | `string \| number \| undefined` | | | Total number of pages. A shortcut for when the server reports a page count rather than a row count — a page count derived from `totalItems` (locally or through the shared table context) always wins over it. Falls back to `1` when nothing pr… |
@@ -27,9 +27,12 @@ Pick a sibling when the shape is more specific:
27
27
  - A focused, page-blocking task → `BbDialog`; supplementary side content →
28
28
  `BbOffCanvas`.
29
29
 
30
- `BbPopover` is a lightweight floating panel, **not** a blocking modal: it does
31
- not dim or lock the page, and an outside click dismisses it. If the surface must
32
- own the user's attention until resolved, that is `BbDialog`.
30
+ `BbPopover` looks lightweight it does not dim the page, and an outside click
31
+ dismisses it but it **is** modal underneath: a `<dialog>` opened with
32
+ `showModal()`, so focus is trapped and the page behind is inert while it is
33
+ open (see Accessibility). Plan for that: the user cannot interact with the page
34
+ until they dismiss it. If the surface should also _look_ like it owns the
35
+ user's attention until resolved, that is `BbDialog`.
33
36
 
34
37
  ### Activator and content
35
38
 
@@ -235,10 +238,12 @@ import {
235
238
  BbIcon,
236
239
  BbPopover,
237
240
  } from 'bitboss-ui';
238
- import {
239
- demoAvatarTimeout,
240
- demoAvatarSrc,
241
- } from '@/components/BbAvatar/examples/demoAvatars';
241
+ // Inlined rather than imported from BbAvatar's example folder: every example
242
+ // must be copy-pasteable into a consumer project on its own, and a
243
+ // cross-example import is the one thing that breaks that.
244
+ const demoAvatarTimeout = 4000;
245
+ const demoAvatarSrc = (photoId: string, size = 256) =>
246
+ `https://images.unsplash.com/${photoId}?w=${size}&h=${size}&fit=crop&crop=faces&auto=format`;
242
247
 
243
248
  const member = {
244
249
  name: 'Maria Bianchi',
@@ -246,7 +251,7 @@ const member = {
246
251
  role: 'Platform engineer · Infra',
247
252
  email: 'maria.bianchi@acme.dev',
248
253
  location: 'Milan, Italy (UTC+2)',
249
- src: demoAvatarSrc('Maria Bianchi'),
254
+ src: demoAvatarSrc('photo-1573496359142-b8d87734a5a2'),
250
255
  };
251
256
  </script>
252
257
  ```
@@ -596,8 +601,18 @@ falls back to `config.adaptive`.
596
601
  `aria-haspopup` and makes the trigger operable by keyboard.
597
602
  - Focus moves into the panel on open and returns to the activator on close;
598
603
  `focus-target` overrides where it lands first.
599
- - The popover is a floating panel, not a modal it does not trap focus or lock
600
- the page behind it. For a blocking task, use `BbDialog`.
604
+ - **The popover is modal, despite looking like it isn't.** It renders as a
605
+ `<dialog>` opened with `showModal()` (`CommonPopover.vue:271`), so while it is
606
+ open Tab is trapped inside it and the rest of the document is inert —
607
+ `dialog.matches(':modal')` is `true`. What makes it _read_ as non-modal is
608
+ that the `::backdrop` is merely `background-color: transparent`: the page
609
+ behind stays fully visible and un-dimmed. That transparent backdrop is also
610
+ what makes click-outside-to-close work — the outside click lands on it, and
611
+ `@click.self` closes the panel.
612
+ Consequence for design: do **not** plan a flow where the user keeps working
613
+ behind an open popover. They cannot. If the surrounding page must stay live,
614
+ use a non-modal surface instead. For a blocking task that should _look_
615
+ blocking, use `BbDialog`, which dims its backdrop.
601
616
  - Give an icon-only activator its own `aria-label`; the popover does not name it.
602
617
 
603
618
  ## v-model
@@ -609,19 +624,19 @@ falls back to `config.adaptive`.
609
624
  | Prop | Type | Default | Required | Description |
610
625
  | --- | --- | --- | --- | --- |
611
626
  | `activator` | `ElementOrComponentRef \| undefined` | | | External activator element or component ref. When provided, the activator slot is not rendered and click events are attached programmatically to the referenced element. |
612
- | `adaptive` | `boolean \| undefined` | `undefined` | | On mobile viewports (below `config.mobileMaxWidth`), render the popover as a bottom-anchored, auto-sized off-canvas sheet instead of a floating panel. The `header`, `default` and `footer` slots are forwarded to the sheet. The `width` prop i… |
627
+ | `adaptive` | `boolean \| undefined` | ``config.adaptive` (`true`)` | | On mobile viewports (below `config.mobileMaxWidth`), render the popover as a bottom-anchored, auto-sized off-canvas sheet instead of a floating panel. The `header`, `default` and `footer` slots are forwarded to the sheet. The `width` prop i… |
613
628
  | `boundary` | `ElementOrComponentRefOrSelector \| undefined` | | | Constrains the popover within a bounding element. When provided, the popover will not overflow this container's bounds (e.g. a sidebar). Accepts an HTMLElement, a Vue component ref, or a CSS selector string. |
614
- | `disabled` | `boolean \| undefined` | | | Disables the component. |
615
- | `eager` | `boolean \| undefined` | | | Prevents rendering content before it's made visible. |
629
+ | `disabled` | `boolean \| undefined` | `false` | | Disables the component. |
630
+ | `eager` | `boolean \| undefined` | `false` | | Prevents rendering content before it's made visible. |
616
631
  | `focusTarget` | `string \| undefined` | | | Selector for the element that receives focus after opening. Defaults to the first focusable element inside the popover. |
617
632
  | `id` | `string \| undefined` | | | The identifier of the component. |
618
633
  | `modelValue` | `boolean \| undefined` | `false` | | Used by v-model to open / close the popover. A popover with no `v-model` starts closed and is driven by its `trigger`. |
619
- | `offCanvasProps` | `Partial<BbOffCanvasProps> \| undefined` | | | Overrides forwarded to the underlying `BbOffCanvas` when `adaptive` renders the sheet on mobile. Merged over the adaptive defaults (`direction: 'bottom'`, `size: 'auto'`, `draggable: true`). Ignored when `adaptive` is `false`. |
634
+ | `offCanvasProps` | `Partial<BbOffCanvasProps> \| undefined` | | | Overrides forwarded to the underlying `BbOffCanvas` when `adaptive` renders the sheet on mobile. Merged over the adaptive defaults (`side: 'bottom'`, `size: 'auto'`, `draggable: true`). Ignored when `adaptive` is `false`. |
620
635
  | `offset` | `number \| undefined` | `3` | | Space the floating container will maintain from the activator. |
621
636
  | `padding` | `number \| undefined` | `10` | | Minimum empty space to keep from the edge of the page. |
622
- | `placement` | `Placement \| "cursor" \| undefined` | `"bottom"` | | Position of the popover relative to the activator. Use `'cursor'` to anchor at the mouse/touch coordinates (hides arrow). |
637
+ | `placement` | `Placement \| "cursor" \| undefined` | `"bottom"` | | Position of the popover relative to the activator. Use `'cursor'` to anchor at the mouse/touch coordinates. (BbPopover never draws an arrow — arrows are tooltip-only in v3.) |
623
638
  | `scrollable` | `boolean \| undefined` | `false` | | Caps the popover height to the available viewport space and enables internal scrolling. Useful for tall content like filter panels. Not recommended for atomic popovers (calendars, color pickers). |
624
- | `transitionDuration` | `number \| undefined` | `transitions.medium` | | How long the transition has to last in milliseconds. |
639
+ | `transitionDuration` | `number \| undefined` | `250` | | How long the transition has to last in milliseconds. |
625
640
  | `trigger` | `PopoverTrigger \| PopoverTrigger[] \| undefined` | `"click"` | | Interaction(s) that open the popover. Accepts a single trigger or an array to combine them. - `'click'` — left-click / tap (default) - `'contextMenu'` — right-click on desktop, long-press on mobile |
626
641
  | `width` | `string \| number \| undefined` | | | Width of the popover. Accepts pixels or percentage (relative to activator width). |
627
642
 
@@ -644,4 +659,4 @@ falls back to `config.adaptive`.
644
659
 
645
660
  - [BbTooltip](./BbTooltip.md) — Displays contextual helper text on interaction.
646
661
  - [BbDialog](./BbDialog.md) — Presents modal dialogs for focused user interactions.
647
- - [BbDropdown](./BbDropdown.md) — Displays contextual action menus and menu content.
662
+ - [BbDropdown](./BbDropdown.md) — Displays contextual action menus and menu content (includes the co-located BbDropdownGroup export, which is how a selectable group is bound).
@@ -95,7 +95,8 @@ const nearLimit = usedGb / maxGb >= 0.8;
95
95
  `min` shifts the lower bound for ranges that don't start at zero (a sales floor,
96
96
  a level's XP band). Out-of-range values are clamped — below `min` renders empty,
97
97
  above `max` renders full — and a degenerate range (`max <= min`) safely renders
98
- an empty bar. Width changes animate over 250 ms on their own; don't add your own
98
+ an empty bar. Value changes animate over 250 ms on their own via `transform`,
99
+ not `width`, so the bar composites instead of relaying out. Don't add your own
99
100
  transition.
100
101
 
101
102
  **A range that does not start at zero**
@@ -444,8 +445,10 @@ another `role="progressbar"`.
444
445
 
445
446
  What's still on you:
446
447
 
447
- - **An accessible name.** Pass `aria-label` (or `aria-labelledby`) — it falls
448
- through to the progressbar element.
448
+ - **An accessible name.** Prefer the **`label` prop** — it forwards to
449
+ `aria-label` on the progressbar and is the same naming prop `BbSpinner` and
450
+ `BbIcon` carry, so one spelling covers all three. A raw `aria-label` (or
451
+ `aria-labelledby`) still falls through if you need it.
449
452
  - **A visible textual value** beside the bar (`72%`, `220 / 500 GB`) so the
450
453
  number is legible, not just the geometry. Add `aria-valuetext` when raw
451
454
  numbers read poorly (units, steps).
@@ -471,7 +474,7 @@ What's still on you:
471
474
 
472
475
  | Prop | Type | Default | Required | Description |
473
476
  | --- | --- | --- | --- | --- |
474
- | `label` | `string \| undefined` | | | Accessible name for the progress bar, forwarded to `aria-label`. A `progressbar` with no name is announced only as a bare percentage, so give it one whenever the surrounding text doesn't already name it (e.g. `"Upload"`). Matches the `label… |
477
+ | `label` | `string \| undefined` | `undefined` | | Accessible name for the progress bar, forwarded to `aria-label`. A `progressbar` with no name is announced only as a bare percentage, so give it one whenever the surrounding text doesn't already name it (e.g. `"Upload"`). Matches the `label… |
475
478
  | `max` | `number \| undefined` | `100` | | Maximum value. Upper cap. |
476
479
  | `min` | `number \| undefined` | `0` | | Minimum value. Lower cap. |
477
480
  | `modelValue` | `number \| null` | `0` | yes | The current progress value — a number between `min` and `max`. This is a one-way input prop (BbProgress is a display component and never emits `update:modelValue`); `null` means no value and renders an empty bar. |
@@ -279,11 +279,12 @@ ring itself.
279
279
  - `input-position` / `label-position` (`'left' | 'center' | 'right'`) align the
280
280
  button and label text within their columns.
281
281
  - `hide-label` keeps the label for screen readers but hides it visually.
282
- - **`reverse` is inverted.** The prop is wired through an internal negation, so a
283
- `BbRadio` is "reversed" by default and `:reverse="false"` is identical to
284
- omitting it. Treat `reverse` as a swap-order switch you turn **on**, not a
285
- boolean you can turn off. (Same quirk as standalone `BbCheckbox`; the _group_
286
- components don't have it.)
282
+ - **`reverse`** swaps the label in front of the button. It is an ordinary
283
+ opt-in boolean: unset and `:reverse="false"` both put the button first,
284
+ `reverse` puts the label first. (The source negates it internally to cancel
285
+ `BbBaseInputContainer`'s own polarity; that is invisible from outside.
286
+ Earlier revisions of this guide called it a consumer-facing quirk — it is
287
+ not, and the same correction applies to `BbCheckbox` and `BbSwitch`.)
287
288
 
288
289
  ### Events and focus
289
290
 
@@ -309,8 +310,8 @@ listen to them for side concerns only. `autofocus` focuses the input on mount.
309
310
  back to its own generated name.
310
311
  - Hand-composed groups have **no** fieldset semantics on their own — wrap them in
311
312
  a `role="radiogroup"` element with an accessible name (see Accessibility).
312
- - `reverse` is inverted (see Layout) don't rely on `:reverse="false"` doing
313
- anything.
313
+ - `reverse` is an opt-in, not a toggle you turn off: unset already means
314
+ button-first. Setting `:reverse="false"` is legal but says nothing.
314
315
  - `checked` + `v-model` together fight; pick one.
315
316
  - `readonly` still submits and stays focusable; use `disabled` when the value
316
317
  must not post.
@@ -347,11 +348,11 @@ listen to them for side concerns only. `autofocus` focuses the input on mount.
347
348
  | `checked` | `boolean \| undefined` | `undefined` | | Defines the input as checked. |
348
349
  | `description` | `string \| undefined` | | | Descriptive text displayed below the label and above the input. Unlike the hint it is always visible, and it is linked to the input via `aria-describedby` (after any `errors` / `warnings`, before the `hint`). |
349
350
  | `direction` | `InputDirection \| undefined` | `"auto"` | | Direction of the layout of the component. Can either be a predefined value or a pattern separated by a space like `xx xxxxx`. |
350
- | `disabled` | `boolean \| undefined` | | | Disables the component. |
351
+ | `disabled` | `boolean \| undefined` | `false` | | Disables the component. |
351
352
  | `errors` | `string \| string[] \| undefined` | | | Can be a string or an array of string containing the messages to display. They render in an `aria-live="polite"` region (announced when they appear) and, while the list is non-empty, are referenced FIRST from the control's `aria-describedby… |
352
- | `hasErrors` | `boolean \| undefined` | | | Define if the component should be in an error state. It usually attaches a CSS class for styling purposes. |
353
- | `hasWarning` | `boolean \| undefined` | | | Define if the component should be in a warning state. Same chrome as errors with `--bb-warn`; errors take priority. |
354
- | `hideLabel` | `boolean \| undefined` | | | Visually hides the label of the input while maintaining accessibility. |
353
+ | `hasErrors` | `boolean \| undefined` | `false` | | Define if the component should be in an error state. It usually attaches a CSS class for styling purposes. |
354
+ | `hasWarning` | `boolean \| undefined` | `false` | | Define if the component should be in a warning state. Same chrome as errors with `--bb-warn`; errors take priority. |
355
+ | `hideLabel` | `boolean \| undefined` | `false` | | Visually hides the label of the input while maintaining accessibility. |
355
356
  | `hint` | `string \| undefined` | | | Text box to be displayed near the input, usually to indicate instructions. |
356
357
  | `id` | `string \| undefined` | | | The identifier of the component. |
357
358
  | `inputPosition` | `"left" \| "center" \| "right" \| undefined` | `"left"` | | Sets the alignment of the input. Since inputs are inline block they can be aligned just as text can. |
@@ -359,10 +360,10 @@ listen to them for side concerns only. `autofocus` focuses the input on mount.
359
360
  | `labelPosition` | `"left" \| "center" \| "right" \| undefined` | | | Sets the text alignment of the label. |
360
361
  | `modelValue` | `any` | | | Used by v-model. Can be any serializable type. |
361
362
  | `name` | `string \| undefined` | | | Defines the name of the input. Optional: an omitted name falls back to a generated one, unique to this button and stable for its lifetime, so a lone radio needs no name at all. Buttons that must form ONE exclusive group still have to share … |
362
- | `persistentHint` | `boolean \| undefined` | | | Keeps the hint displayed. |
363
- | `readonly` | `boolean \| undefined` | | | Sets the input in a readonly state. |
364
- | `required` | `boolean \| undefined` | | | Sets the input as required. |
365
- | `reverse` | `boolean \| undefined` | | | Reverses the layout: in every direction the order of the label and the input is swapped from the standard arrangement. |
363
+ | `persistentHint` | `boolean \| undefined` | `false` | | Keeps the hint displayed. |
364
+ | `readonly` | `boolean \| undefined` | `false` | | Sets the input in a readonly state. |
365
+ | `required` | `boolean \| undefined` | `false` | | Sets the input as required. |
366
+ | `reverse` | `boolean \| undefined` | `false` | | Reverses the layout: in every direction the order of the label and the input is swapped from the standard arrangement. |
366
367
  | `value` | `any` | | yes | Defines the value of the radio input. It can be any serializable value. |
367
368
  | `warnings` | `string \| string[] \| undefined` | | | Warning messages to display beneath the field, in their own `aria-live` region and amber (`--bb-text-warn`). A string or array; a non-empty list implies the warning state. Errors suppress warnings when both are set. While displayed they are… |
368
369
 
@@ -98,9 +98,11 @@ option for it rather than expecting a cleared model.
98
98
 
99
99
  ### Layout and density
100
100
 
101
- `input-direction="horizontal"` lays options in a row for segmented-style
102
- choices (shipping speed, billing cycle); the default stacks them. `compact`
103
- tightens spacing. Because a radio group binds a single value, it drives cleanly
101
+ Options flow in a **wrapping row by default** — `BbBaseRadioGroup` defaults its
102
+ direction to `'horizontal'`, which suits segmented-style choices (shipping
103
+ speed, billing cycle). Pass `input-direction="vertical"` to stack them one per
104
+ line, which is what you want for long option text or a scannable list.
105
+ `compact` tightens spacing. Because a radio group binds a single value, it drives cleanly
104
106
  from `v-model` inline.
105
107
 
106
108
  **Horizontal shipping speed**
@@ -313,9 +315,9 @@ const loadStrategies = (
313
315
 
314
316
  ### Slots
315
317
 
316
- `#label` replaces an option's text (`{ item, text }`); `#icon` replaces the
318
+ `#label` replaces an option's text (`{ item, text, checked }` — `checked` is what tile layouts key off); `#icon` replaces the
317
319
  default radio-dot visual for each option (you then own its selected/focus
318
- styling). `#legend` replaces the fieldset legend (`{ text, hasErrors }`);
320
+ styling). `#legend` replaces the fieldset legend (`{ text, hasErrors, hasWarning }`; the validated wrappers add `showAsterisk`);
319
321
  `#prepend` / `#append` inject content inside the options container.
320
322
 
321
323
  ### Selection tiles
@@ -416,7 +418,8 @@ Two width facts worth knowing before you reach for `width: 100%` anywhere:
416
418
  `update:modelValue` (the `v-model` channel) carries the single selected value —
417
419
  the only source of selection truth. Native `blur`, `change`, `click`, `focus`,
418
420
  `input`, `keydown`, `mousedown`, `mouseup` re-emit with raw payloads, plus
419
- `inactive` when focus leaves the group; use them for side effects, never to
421
+ `active` when focus enters the group (it drives the hint internally) and
422
+ `inactive` when focus leaves; use them for side effects, never to
420
423
  compute selection. `autofocus` focuses the first option on mount.
421
424
 
422
425
  ### Works well with
@@ -478,18 +481,18 @@ compute selection. `autofocus` focuses the first option on mount.
478
481
  | Prop | Type | Default | Required | Description |
479
482
  | --- | --- | --- | --- | --- |
480
483
  | `autofocus` | `Booleanish \| undefined` | | | Sets autofocus on page load. |
481
- | `compact` | `boolean \| undefined` | | | Sets the component in a compact state. |
484
+ | `compact` | `boolean \| undefined` | `false` | | Sets the component in a compact state. |
482
485
  | `dependencies` | `unknown[] \| undefined` | | | Defines an array of dependencies that will trigger actions in the component upon change. |
483
486
  | `depsDebounceTime` | `number \| undefined` | | | Timeout used to debounce response to changes to dependencies. |
484
487
  | `description` | `string \| undefined` | | | Descriptive text displayed below the label and above the input. Unlike the hint it is always visible, and it is linked to the input via `aria-describedby` (after any `errors` / `warnings`, before the `hint`). |
485
488
  | `direction` | `InputDirection \| undefined` | | | Direction of the layout of the component. Can either be a predefined value or a pattern separated by a space like `xx xxxxx`. |
486
- | `disabled` | `boolean \| undefined` | | | Disables the component. |
487
- | `enforceCoherence` | `boolean \| undefined` | | | If coherence is enforced the input cannot have a modelValue that is incoherent with its current items. e.g. You cannot set v-model to a user that is not present in the items passed. modelValue will be reset upon incoherence. |
489
+ | `disabled` | `boolean \| undefined` | `false` | | Disables the component. |
490
+ | `enforceCoherence` | `boolean \| undefined` | `false` | | If coherence is enforced the input cannot have a modelValue that is incoherent with its current items. e.g. You cannot set v-model to a user that is not present in the items passed. modelValue will be reset upon incoherence. |
488
491
  | `errors` | `string \| string[] \| undefined` | | | Can be a string or an array of string containing the messages to display. They render in an `aria-live="polite"` region (announced when they appear) and, while the list is non-empty, are referenced FIRST from the control's `aria-describedby… |
489
- | `hasErrors` | `boolean \| undefined` | | | Define if the component should be in an error state. It usually attaches a CSS class for styling purposes. |
490
- | `hasWarning` | `boolean \| undefined` | | | Define if the component should be in a warning state. Same chrome as errors with `--bb-warn`; errors take priority. |
491
- | `hideLabel` | `boolean \| undefined` | | | Visually hides the label of the input while maintaining accessibility. |
492
- | `hideLegend` | `boolean \| undefined` | | | Visually hides the legend of the fieldset while maintaining accessibility. |
492
+ | `hasErrors` | `boolean \| undefined` | `false` | | Define if the component should be in an error state. It usually attaches a CSS class for styling purposes. |
493
+ | `hasWarning` | `boolean \| undefined` | `false` | | Define if the component should be in a warning state. Same chrome as errors with `--bb-warn`; errors take priority. |
494
+ | `hideLabel` | `boolean \| undefined` | `false` | | Visually hides each option's label text (the text rendered next to every input) while keeping it accessible to screen readers. Does not affect the fieldset legend — use `hideLegend` for that. |
495
+ | `hideLegend` | `boolean \| undefined` | `false` | | Visually hides the legend of the fieldset while maintaining accessibility. |
493
496
  | `hint` | `string \| undefined` | | | Text box to be displayed near the input, usually to indicate instructions. |
494
497
  | `id` | `string \| undefined` | | | The identifier of the component. |
495
498
  | `inputDirection` | `"horizontal" \| "vertical" \| undefined` | | | Defines the direction of the inputs in the fieldset. |
@@ -505,10 +508,10 @@ compute selection. `autofocus` focuses the first option on mount.
505
508
  | `modelValueDebounceTime` | `number \| undefined` | | | Timeout used to debounce response to changes to modelValue. |
506
509
  | `name` | `string \| undefined` | | | Defines the name of the option inputs. Optional: the options live inside a single component instance, so an omitted name falls back to a generated one that groups them correctly on its own — unique per group, so two groups never clear each … |
507
510
  | `noDataText` | `string \| undefined` | | | String displayed when there are no items to display. |
508
- | `persistentHint` | `boolean \| undefined` | | | Keeps the hint displayed. |
509
- | `readonly` | `boolean \| undefined` | | | Sets the input in a readonly state. |
510
- | `required` | `boolean \| undefined` | | | Sets the input as required. |
511
- | `reverse` | `boolean \| undefined` | | | Reverses the layout. Applicable in every direction the order of the label and the input is swapped. |
511
+ | `persistentHint` | `boolean \| undefined` | `false` | | Keeps the hint displayed. |
512
+ | `readonly` | `boolean \| undefined` | `false` | | Sets the input in a readonly state. |
513
+ | `required` | `boolean \| undefined` | `false` | | Sets the input as required. |
514
+ | `reverse` | `boolean \| undefined` | `false` | | Reverses the layout. Applicable in every direction the order of the label and the input is swapped. |
512
515
  | `selectable` | `boolean \| ((item: T) => boolean) \| undefined` | `true` | | Defines whether options are selectable. Can be a global boolean that affects all options or a function that accepts an item and returns a boolean that only affects that item. Non-selectable options are rendered disabled. |
513
516
  | `warnings` | `string \| string[] \| undefined` | | | Warning messages to display beneath the field, in their own `aria-live` region and amber (`--bb-text-warn`). A string or array; a non-empty list implies the warning state. Errors suppress warnings when both are set. While displayed they are… |
514
517
 
@@ -330,15 +330,15 @@ renders SSR-safe markup in Nuxt and Inertia apps.
330
330
  | Prop | Type | Default | Required | Description |
331
331
  | --- | --- | --- | --- | --- |
332
332
  | `autofocus` | `Booleanish \| undefined` | | | Sets autofocus on page load. |
333
- | `clearable` | `boolean \| undefined` | | | Allows clearing the selected rating by clicking the current value. |
334
- | `compact` | `boolean \| undefined` | | | Sets the component in a compact state. |
333
+ | `clearable` | `boolean \| undefined` | `false` | | Allows clearing the selected rating by clicking the current value. |
334
+ | `compact` | `boolean \| undefined` | `false` | | Sets the component in a compact state. |
335
335
  | `description` | `string \| undefined` | | | Descriptive text displayed below the label and above the input. Unlike the hint it is always visible, and it is linked to the input via `aria-describedby` (after any `errors` / `warnings`, before the `hint`). |
336
336
  | `direction` | `InputDirection \| undefined` | | | Direction of the layout of the component. Can either be a predefined value or a pattern separated by a space like `xx xxxxx`. |
337
- | `disabled` | `boolean \| undefined` | | | Disables the component. |
337
+ | `disabled` | `boolean \| undefined` | `false` | | Disables the component. |
338
338
  | `errors` | `string \| string[] \| undefined` | | | Can be a string or an array of string containing the messages to display. They render in an `aria-live="polite"` region (announced when they appear) and, while the list is non-empty, are referenced FIRST from the control's `aria-describedby… |
339
- | `hasErrors` | `boolean \| undefined` | | | Define if the component should be in an error state. It usually attaches a CSS class for styling purposes. |
340
- | `hasWarning` | `boolean \| undefined` | | | Define if the component should be in a warning state. Same chrome as errors with `--bb-warn`; errors take priority. |
341
- | `hideLegend` | `boolean \| undefined` | | | Visually hides the legend of the fieldset while maintaining accessibility. |
339
+ | `hasErrors` | `boolean \| undefined` | `false` | | Define if the component should be in an error state. It usually attaches a CSS class for styling purposes. |
340
+ | `hasWarning` | `boolean \| undefined` | `false` | | Define if the component should be in a warning state. Same chrome as errors with `--bb-warn`; errors take priority. |
341
+ | `hideLegend` | `boolean \| undefined` | `false` | | Visually hides the legend of the fieldset while maintaining accessibility. |
342
342
  | `hint` | `string \| undefined` | | | Text box to be displayed near the input, usually to indicate instructions. |
343
343
  | `id` | `string \| undefined` | | | The identifier of the component. |
344
344
  | `inputPosition` | `"left" \| "center" \| "right" \| undefined` | `"left"` | | Sets the alignment of the input. Since inputs are inline block they can be aligned just as text can. |
@@ -347,11 +347,11 @@ renders SSR-safe markup in Nuxt and Inertia apps.
347
347
  | `legendPosition` | `"left" \| "center" \| "right" \| undefined` | | | Sets the text alignment of the legend. |
348
348
  | `modelValue` | `number \| null` | | yes | Used by v-model. |
349
349
  | `name` | `string \| undefined` | | | Defines the name of the star radio inputs. Optional: the stars live inside a single component instance, so an omitted name falls back to a generated one that groups them correctly on its own. Pass a name only when the value has to be submit… |
350
- | `persistentHint` | `boolean \| undefined` | | | Keeps the hint displayed. |
351
- | `readonly` | `boolean \| undefined` | | | Sets the input in a readonly state. |
352
- | `required` | `boolean \| undefined` | | | Sets the input as required. |
353
- | `reverse` | `boolean \| undefined` | | | Reverses the layout. Applicable in every direction the order of the label and the input is swapped. |
354
- | `size` | `number \| ({ size?: any; } & string) \| keyof Sizes \| undefined` | | | Defines the component size. Accepted values: - A key from the provided size map (`keyof T`), e.g. `'sm' \| 'md' \| 'lg'` - A custom CSS size string (e.g. `'20px'`, `'1.5rem'`, `'2em'`) - A number, typically interpreted as pixels by size par… |
350
+ | `persistentHint` | `boolean \| undefined` | `false` | | Keeps the hint displayed. |
351
+ | `readonly` | `boolean \| undefined` | `false` | | Sets the input in a readonly state. |
352
+ | `required` | `boolean \| undefined` | `false` | | Sets the input as required. |
353
+ | `reverse` | `boolean \| undefined` | `false` | | Reverses the layout. Applicable in every direction the order of the label and the input is swapped. |
354
+ | `size` | `number \| ({ size?: any; } & string) \| keyof Sizes \| undefined` | `'md'` | | Defines the component size. Accepted values: - A key from the provided size map (`keyof T`), e.g. `'sm' \| 'md' \| 'lg'` - A custom CSS size string (e.g. `'20px'`, `'1.5rem'`, `'2em'`) - A number, typically interpreted as pixels by size par… |
355
355
  | `stars` | `number \| undefined` | | | Maximum number of stars to render and maximum value of the component. |
356
356
  | `warnings` | `string \| string[] \| undefined` | | | Warning messages to display beneath the field, in their own `aria-live` region and amber (`--bb-text-warn`). A string or array; a non-empty list implies the warning state. Errors suppress warnings when both are set. While displayed they are… |
357
357