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
@@ -7,12 +7,12 @@ summary: The type prop narrows to the text-like input types — number/date valu
7
7
 
8
8
  ## Changes
9
9
 
10
- | v2 | v3 | Kind |
11
- | -------------------------------------------------------------------------------- | ---------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
12
- | `type?: HTMLInputElement['type']` (any string) | `type?: 'text' \| 'email' \| 'url' \| 'tel' \| 'search' \| 'password'` | retype — other values fail to compile |
13
- | `direction?: string`-ish | `InputDirection` (`'auto' \| 'horizontal' \| 'vertical' \| '<n> <m>'` ratio) | family-wide retype — typos now fail to compile |
14
- | imperative template-ref API (`inputRef.value.focus()` / `.blur()` / `.select()`) | removed | no consumer-facing expose; use the native `autofocus` prop, or reach the underlying `<input>` for the rare programmatic focus. **⚠ silent**: a stale `inputRef.value?.focus()` is `undefined` at runtime. |
15
- | — | `description`, extra keyboard/composition events | additive |
10
+ | v2 | v3 | Kind |
11
+ | -------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
12
+ | `type?: HTMLInputElement['type']` (any string) | `type?: 'text' \| 'email' \| 'url' \| 'tel' \| 'search' \| 'password'` | retype — other values fail to compile |
13
+ | `direction?: string`-ish | `InputDirection` (`'auto' \| 'horizontal' \| 'vertical' \| 'xx xxxx'`) — in a two-token pattern the tokens' **character counts** are the ratio, not their values | family-wide retype — typos now fail to compile |
14
+ | imperative template-ref API (`inputRef.value.focus()` / `.blur()` / `.select()`) | removed | no consumer-facing expose; use the native `autofocus` prop, or reach the underlying `<input>` for the rare programmatic focus. **⚠ silent**: a stale `inputRef.value?.focus()` is `undefined` at runtime. |
15
+ | — | `description`, extra keyboard/composition events | additive |
16
16
 
17
17
  ## Edits
18
18
 
@@ -62,8 +62,12 @@ explicitly (section 8).
62
62
  ### What v2 looked like
63
63
 
64
64
  v2 was a plain ESM library: named exports, one manual CSS import, optional
65
- manual directive registration. There was no Vite plugin, no Nuxt module, and
66
- no `app.use`.
65
+ manual directive registration. There was no Vite plugin and no `app.use`.
66
+
67
+ Nuxt apps were the exception: they installed a **separate companion package**,
68
+ `@bitboss-dev/bitboss-ui-nuxt`, which wrapped v2 in a Nuxt module. v3 absorbs
69
+ that package — the module now ships inside the library as `bitboss-ui/nuxt`.
70
+ See [Nuxt](#nuxt) below for the option-by-option move.
67
71
 
68
72
  ```ts
69
73
  // v2 main.ts
@@ -173,8 +177,7 @@ nothing else about the plugin changes.
173
177
 
174
178
  ### Nuxt
175
179
 
176
- v2 had no Nuxt story. v3 ships a module that does both halves — do **not**
177
- also call `app.use`:
180
+ v3 ships a module that does both halves — do **not** also call `app.use`:
178
181
 
179
182
  ```ts
180
183
  // v3 nuxt.config.ts
@@ -186,6 +189,57 @@ export default defineNuxtConfig({
186
189
  });
187
190
  ```
188
191
 
192
+ #### Coming from `@bitboss-dev/bitboss-ui-nuxt`
193
+
194
+ That package was the v2 Nuxt story. It is superseded: **uninstall it** and
195
+ delete it from `modules`. Everything it did is now inside `bitboss-ui/nuxt`,
196
+ under the same `bitboss` config key — so the migration is mostly renaming keys,
197
+ not rewriting setup.
198
+
199
+ | `@bitboss-dev/bitboss-ui-nuxt` option | v3 `bitboss-ui/nuxt` |
200
+ | ------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
201
+ | `icons.path` | `iconDir`. Same job, one level up. |
202
+ | `icons.enabled: false` | **Gone** — the icon pipeline is not optional in v3; components import the virtual icon module. Point `iconDir` at an empty folder if you ship no local art. |
203
+ | `styles.enabled` | `injectStyles` (still defaults `true`). |
204
+ | `styles.index` | **Gone**, and nothing replaces it — see the ordering note below. |
205
+ | `link.name` | `nuxtLinkName` (still defaults `'NuxtLink'`). |
206
+ | `link.enabled: false` | **Gone.** The runtime plugin only registers the configured name when the app has not already claimed it, so there is nothing to switch off. |
207
+ | `components.enabled` | `autoImport` — see below. Note the **default flipped**: v2's module auto-imported components, v3 does not. |
208
+ | `components.validation: true` | `autoImport: { validated: true }`, or explicit imports from `bitboss-ui/validated`. The wrappers moved into the library and gained `BbForm` + `useValidatedField`. |
209
+ | `components.requiredAsterisk` | `requiredAsterisk`, same meaning, one level up. |
210
+ | `composables` | Folded into `autoImport`. `useBroadcastChannelInstance`, `useQueue` and `useWizard` are **not exported by v3** — the module registered names the library no longer has. |
211
+ | `logLevel` | **Gone.** The v3 module has nothing to log at setup; build-plugin diagnostics go through Vite. |
212
+
213
+ **⚠ silent — auto-imports are off by default.** The v2 module registered every
214
+ `Bb*` component with Nuxt, so templates used them with no import line. v3 does
215
+ not: an unmigrated template compiles, and each unresolved `<BbButton>` renders
216
+ as an empty unknown element with no error anywhere. Either add explicit imports,
217
+ or opt back in:
218
+
219
+ ```ts
220
+ // v3 nuxt.config.ts — the closest equivalent of the v2 module's defaults
221
+ export default defineNuxtConfig({
222
+ modules: ['bitboss-ui/nuxt'],
223
+ bitboss: {
224
+ iconDir: './assets/icons',
225
+ autoImport: { validated: true }, // drop `validated` if you had no vee-validate
226
+ },
227
+ });
228
+ ```
229
+
230
+ Set `"vueCompilerOptions": { "checkUnknownComponents": true }` in `tsconfig.json`
231
+ before you start either way — it is what turns that silent empty element into a
232
+ `vue-tsc` error naming the file and line.
233
+
234
+ **Style ordering.** `styles.index` let you splice `bitboss-ui/styles.css`
235
+ anywhere in Nuxt's `css` array. v3 injects the sheet at runtime and always puts
236
+ it **first** in `<head>`, ahead of every other stylesheet — so your own CSS is
237
+ always later and always wins, which is the order `styles.index` was normally
238
+ used to obtain. If you need the opposite (library rules winning over yours),
239
+ raise specificity in your own sheet rather than reordering; if you genuinely
240
+ need the library sheet elsewhere in the cascade, set `injectStyles: false` and
241
+ import `bitboss-ui/styles.css` yourself at the position you want.
242
+
189
243
  ### Inertia
190
244
 
191
245
  Inertia apps configure `bitboss-ui/vite` exactly like plain Vite, install
@@ -238,6 +292,23 @@ bitbossUi({
238
292
  useBbConfig().setConfig({ locale: 'en' });
239
293
  ```
240
294
 
295
+ **Under SSR, set the locale where the app is created.** The runtime config is
296
+ held **per Vue app** (3.0.0-beta.15), and SSR builds one app per request, so
297
+ this is per-visitor and correct on the first paint — which is what crawlers
298
+ index and what a JS-disabled reader keeps:
299
+
300
+ ```ts
301
+ const app = createSSRApp(App);
302
+ app.use(bitbossUiPlugin, { locale: localeFor(request) });
303
+ ```
304
+
305
+ `setConfig` still works for runtime switching. During a server render, call it
306
+ from a component's `setup` so it can resolve the current app; from module scope
307
+ there is no app to address, the write lands on the build-time defaults shared
308
+ by the whole process, and it warns in dev. (Before beta.15 the config was a
309
+ single process-global object, so a per-visitor locale was not possible at all —
310
+ if you carried a workaround for that, you can drop it.)
311
+
241
312
  | v2 `setConfig` key | Where it goes in v3 |
242
313
  | --------------------------------------------- | ------------------------------------------------------------------------------ |
243
314
  | `locale` | stays runtime (`setConfig`) — the only survivor |
@@ -314,19 +385,30 @@ to the rename map and to every grep below — see
314
385
  | `--bb-hint`, `--bb-icon-color`, `--bb-placeholder`, `--bb-prefix-color`, `--bb-muted-color` | `--bb-text-muted` |
315
386
  | `--bb-input-color`, `--bb-input-bg` | `--bb-text`, `--bb-panel` |
316
387
  | `--bb-input-font-size`, `--bb-input-mobile-font-size` | `--bb-input-fs`, `--bb-input-fs-mobile` |
388
+ | `--bb-label-size` | `--bb-label-fs` |
389
+ | `--bb-label-compact-spacing-y` | `--bb-label-spacing-y-compact` |
390
+ | `--bb-input-compact-h`, `--bb-input-compact-py` | `--bb-input-h-compact`, `--bb-input-py-compact` — the `compact` qualifier moved from infix to suffix |
391
+ | `--bb-input-compact-px`, `--bb-input-compact-prefix-w`, `--bb-input-compact-floating-py`, `--bb-input-prefix`, `--bb-input-prefix-px` | **deleted, no counterpart.** v3's compact mode re-points only height and vertical padding (the two tokens in the row above); horizontal padding and the prefix column keep their normal-size values, and the prefix's own font-size/padding knobs are gone. |
317
392
  | `--bb-overlay-color` + `--bb-overlay-opacity` | `--bb-overlay` (one color with alpha) |
318
393
  | `--bb-overlay-z-index` | `--bb-z-overlay` |
319
394
  | _(no v2 equivalent)_ | `--bb-ease` — new in v3. v2 hard-coded seven different `cubic-bezier()` curves and exposed no easing token, so there is nothing to rename; set `--bb-ease` once if you want a house curve. |
320
- | `--bb-dialog-px`, `--bb-dialog-py` | `--bb-panel-p` — **one value on both axes**, for dialogs and off-canvas alike. If your v2 px py, see "Asymmetric surface padding" below. |
395
+ | `--bb-dialog-px`, `--bb-dialog-py` | the local pair `--px` / `--py` on `.bb-dialog` / `.bb-offcanvas` — a direct map, set on the component's class (never `:root`). Both branch off `--bb-panel-p`, so if your v2 px = py, set `--bb-panel-p` alone. See "Asymmetric surface padding" below. |
321
396
  | `--bb-dialog-close` | **delete it** — do not map it onto `.bb-close-button { --size }`; v3's default already reproduces the v2 control. See below. |
322
397
  | `--bb-dialog-title-size` | the local `--dialog-title-fs` on `.bb-dialog` / `.bb-offcanvas` (default `calc(var(--bb-fs) + 2px)`) |
323
398
  | `--bb-dialog-title-weight` | **no knob** — the title is hardcoded `font-weight: 500`. Override with a CSS rule, see below. |
324
399
  | `--bb-button-h`, `--bb-button-icon`, `--bb-checkbox-*`, `--bb-radio-*`, `--bb-switch-*`, `--bb-rating-*`, `--bb-slider-*`, `--bb-table-cell-h`, `--bb-select-option-*` | **no longer global.** Component dimensions hang off `--bb-control-h`, `--bb-fs`, `--bb-radius`; anything finer is an unprefixed local on the component's own class — with one exception: `--bb-select-option-px/-py` have **no** v3 local, the listbox option's inline padding is a literal (`.bb-listbox__option { padding-inline: … }` in your own CSS). |
325
400
 
326
- **`--bb-input-*` and `--bb-label-*` are NOT in the row above.** They are still
327
- global v3 theme tokens, declared in `variables.css` and read across the whole
328
- form family — do not delete them. Several changed their default value; the
329
- drift table below lists which.
401
+ **Most `--bb-input-*` and `--bb-label-*` tokens survive but only these
402
+ exact names:** `--bb-input-h`, `--bb-input-px`, `--bb-input-py`,
403
+ `--bb-input-spacing`, `--bb-input-icon`, `--bb-input-prefix-w`,
404
+ `--bb-label-spacing-x`, `--bb-label-spacing-y`, `--bb-label-weight`,
405
+ `--bb-leading`. Those are still global v3 theme tokens, declared in
406
+ `variables.css` and read across the whole form family — do not delete them
407
+ (several changed default value; the drift table below lists which). Everything
408
+ else in the two families either renamed (`--bb-label-size` → `--bb-label-fs`,
409
+ the compact pair — rows above) or is deleted outright, so a declaration that
410
+ is not in this list and not in the rename map is inert: it looks correct and
411
+ does nothing. §8's retired-token grep catches every deleted name.
330
412
 
331
413
  **When a v2 global becomes a component token, resize only what you use.** That
332
414
  last row is the trap: a v2 global like `--bb-button-icon` had ONE value for
@@ -347,50 +429,59 @@ doctrine in `design-tokens.md` § "Overriding one from a consumer app". And chec
347
429
  first whether the v2 value was a real customisation: if it merely restated v2's
348
430
  default, the migration is to **delete it** and inherit the v3 scale.
349
431
 
350
- **Asymmetric surface padding.** `--bb-panel-p` is a single value used on both
351
- axes. If your v2 theme set `--bb-dialog-px` `--bb-dialog-py`, set
352
- `--bb-panel-p` to the **horizontal** value (it also positions the close button)
353
- and override the vertical with a normal `padding` rule on the part classes.
354
- There is no `--bb-panel-px` / `--bb-panel-py` pair.
432
+ **Asymmetric surface padding.** v3 splits the axes with the local pair
433
+ `--px` / `--py`, declared on both surface roots (`.bb-dialog`,
434
+ `.bb-offcanvas`) and each branching off `var(--bb-panel-p)`. Like every
435
+ unprefixed component token, you override them _on the component's class_,
436
+ never `:root`. v2's `--bb-dialog-px` / `--bb-dialog-py` map onto them
437
+ directly:
355
438
 
356
439
  ```css
357
- /* v2: --bb-dialog-px: 24px; header --bb-dialog-py: 10px; body --bb-dialog-py: 20px */
440
+ /* v2: --bb-dialog-px: 24px; --bb-dialog-py: 10px */
358
441
  .my-dialog {
359
- --bb-panel-p: 24px; /* horizontal + close-button inset */
442
+ --px: 24px; /* horizontal padding + the close button's inline inset */
443
+ --py: 10px; /* vertical padding + the close button's block inset */
360
444
  }
445
+ ```
446
+
447
+ Setting only `--bb-panel-p` still moves both axes together (the pair defaults
448
+ to it, resolved on the component root, so a scoped `--bb-panel-p` override
449
+ keeps working too). Per-**part** asymmetry (header `py: 10px`, body
450
+ `py: 20px`) works by scoping the token to the part class — the padding rules
451
+ resolve it on the part elements and the pair inherits:
452
+
453
+ ```css
361
454
  .my-dialog .bb-dialog__header {
362
- padding-block: 10px 5px;
455
+ --py: 10px; /* header block padding (bottom is py/2); × inset follows */
363
456
  }
364
- .my-dialog .bb-dialog__body .bb-dialog__body-content {
365
- padding-block: 0 20px;
366
- }
367
- .my-dialog .bb-dialog__body:first-child .bb-dialog__body-content {
368
- padding-top: 20px;
369
- }
370
- .my-dialog .bb-dialog__footer {
371
- padding-block: 20px;
457
+ .my-dialog .bb-dialog__body-content {
458
+ --py: 20px; /* body bottom padding, and its top in the headerless case */
372
459
  }
373
460
  ```
374
461
 
375
- Use `padding-block`, not the `padding` shorthand, so the horizontal half keeps
376
- tracking `--bb-panel-p`. Specificity: the library rules are
377
- `.bb-dialog .bb-dialog__header` (0,2,0), `.bb-dialog__body-content` (0,1,0) and
378
- `.bb-dialog__body:first-child .bb-dialog__body-content` (0,2,1) the
379
- three-class app selectors above beat all of them. `BbOffCanvas` is identical
380
- with `.bb-offcanvas__*`.
381
-
382
- **`--px` and `--pt` are not dialog knobs.** `.bb-dialog` declares them, but
383
- nothing in the dialog or off-canvas CSS reads them, and every component that
384
- _does_ read `--px` (`BbButton`, `BbAlert`, `BbTooltip`, `BbBaseSlider`)
385
- re-declares it on its own root class, so an ancestor value never reaches those
386
- either. Setting `--px` on a dialog part is inert it silently leaves the
387
- horizontal padding at whatever `--bb-panel-p` resolves to.
462
+ Derived spacings scale with it — the header's bottom padding is `py / 2` and
463
+ the close button's block inset tracks the header's `py`. If you need exact
464
+ literals instead of those ratios, a `padding-block` rule on the part class
465
+ still works (use `padding-block`, not the `padding` shorthand, so the
466
+ horizontal half keeps tracking `--px`; the library part selectors are
467
+ at most (0,2,1) specific, so a three-class app selector beats them all).
468
+ `BbOffCanvas` is identical with `.bb-offcanvas__*` and the same `--px` /
469
+ `--py` names.
470
+
471
+ **Scope the pair to the surface, and it stays the surface's.** `--px` is also
472
+ a local on other components (`BbButton`, `BbAlert`, `BbTooltip`,
473
+ `BbBaseSlider`), but each of those re-declares it on its own root class, so a
474
+ dialog-scoped `--px` never leaks into the buttons or alerts inside the dialog
475
+ — and, symmetrically, never set the pair on `:root` or an arbitrary ancestor:
476
+ the surface roots' own defaults mask it there, and you would be reaching into
477
+ every other `--px`-reading component anyway. (`--pt` remains dead — nothing
478
+ reads it.)
388
479
 
389
480
  If only the **vertical rhythm between parts** differs, the local `--dialog-gap`
390
- (default `--bb-panel-p`) already does it without a padding rule: it drives the
391
- gap below the body content and the footer's block padding on `.bb-dialog` and
481
+ (default `--py`) already does it without a padding rule: it drives the gap
482
+ below the body content and the footer's block padding on `.bb-dialog` and
392
483
  `.bb-offcanvas`. It does **not** cover the header's top padding, or the body's
393
- top padding in the headerless case — those still take `--bb-panel-p`.
484
+ top padding in the headerless case — those still take `--py`.
394
485
 
395
486
  **`--bb-dialog-close` maps to nothing — delete it.** In v2 it was the close
396
487
  **icon** width (`12px`) and the button around it added `8px` of padding, so the
@@ -454,15 +545,25 @@ and delete only the declarations that merely restated a **v2** default.
454
545
  **A type that narrowed.** `--bb-ring-opacity` survives by name but v3 registers
455
546
  it with `@property … syntax: '<percentage>'`:
456
547
 
457
- | token | v2 form | v3 form | symptom |
458
- | ------------------- | -------------------------------------------------------- | -------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
459
- | `--bb-ring-opacity` | unitless `0.25` / `0.4`, multiplied by `100%` internally | `25%` / `40%` — a `<percentage>` | ⚠ silent: a unitless override is invalid at computed-value time, so it is discarded and the token falls back to the registered `initial-value: 25%`. v3's own defaults are `15%` light / `40%` dark. |
548
+ | token | v2 form | v3 form | symptom |
549
+ | ------------------- | -------------------------------------------------------- | -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
550
+ | `--bb-ring-opacity` | unitless `0.25` / `0.4`, multiplied by `100%` internally | `25%` / `40%` — a `<percentage>` | ⚠ silent: a unitless override is invalid at computed-value time, so it is discarded and the token falls back to the registered `initial-value: 15%` v3's own light default, so a light page silently renders the stock ring, while a dark page lands on `15%` against the shipped `40%`. |
460
551
 
461
552
  Nothing reports this — not `vue-tsc`, not the eslint plugin, not
462
553
  `npx bitboss-ui check` (none of them read CSS), and not the browser console:
463
554
  an invalid registered-property value is not a parse error, so it logs nothing.
464
- Grep your stylesheets for `--bb-ring-opacity` and confirm every value carries a
465
- `%`.
555
+ Grep your stylesheets for `--bb-ring-opacity` and check **both directions of
556
+ every hit**:
557
+
558
+ - every **write** must carry a `%` (`0.15` → `15%`), and
559
+ - every **read** must stop multiplying by `100%`. The v2 idiom for consuming
560
+ the unitless form was exactly that —
561
+ `calc(100% - var(--bb-ring-opacity) * 100%)` — and under v3 it multiplies a
562
+ percentage by a percentage, which is invalid in `calc()`. The invalid math
563
+ takes the whole declaration down (typically a `color-mix()` ring), so the
564
+ failure is _worse_ than the write side: a stale write still produces a ring
565
+ at the fallback strength, a stale read produces **no ring at all**, equally
566
+ silently. Delete the `* 100%`.
466
567
 
467
568
  Nine tokens are `@property`-registered in v3 — the eight color knobs
468
569
  (`syntax: '<color>'`) plus `--bb-ring-opacity`. Each rejects values outside its
@@ -565,9 +666,26 @@ this order:
565
666
  1. **Name is in the table, and your app never styled it** → use the built-in
566
667
  `variant`. This is the only genuinely free conversion.
567
668
  2. **Name is in the table, but your app styled it itself** → v3's built-in now
568
- paints underneath your rules. Decide explicitly: accept v3's look and delete
569
- your CSS, or register the name (`alertVariants: ['warning']`) so your CSS
570
- stays the sole styling source.
669
+ paints underneath your rules, and **registering the name does not stop it**.
670
+ The registries feed the type-checker only: `alertVariants: ['warning']`
671
+ regenerates the typed union and nothing else — no CSS is generated and none
672
+ is suppressed; the built-in `.bb-alert--warning` skin ships unconditionally
673
+ in `styles.css` and still applies, so every property your CSS does not
674
+ explicitly set shows through as the library's. Decide explicitly: accept
675
+ v3's look and delete your CSS, or keep your look — which requires your rules
676
+ to **win the cascade** over the library's. Note the library's skin
677
+ selectors are not uniform: some families compile single-class
678
+ (`.bb-alert--warning`, `.bb-toast-message--*` — (0,1,0)), others
679
+ block-scoped (`.bb-button.bb-button--outline`, `.bb-badge.bb-badge--*`,
680
+ `.bb-indicator.bb-indicator--*`, `.bb-tooltip.bb-tooltip--*` — (0,2,0)).
681
+ The pattern that wins everywhere: author your override at block+modifier
682
+ (`.bb-alert.bb-alert--warning`, or nest the modifier under the block) **and**
683
+ load your sheet after `styles.css` — that outweighs the single-class
684
+ families and ties-then-wins-on-order against the block-scoped ones. Or
685
+ sidestep the collision by renaming to a name not in the table, which moves
686
+ you to case 3, where your CSS genuinely is the sole source. Whichever you pick,
687
+ still register the name: that part is required for the type-check either
688
+ way.
571
689
  3. **Name is not in the table** → register it and keep your CSS. **Do not remap
572
690
  onto the "nearest" built-in.** `error → destructive`, `danger →
573
691
  destructive`, `info → primary` all compile, all look plausible in review,
@@ -575,8 +693,12 @@ destructive`, `info → primary` all compile, all look plausible in review,
575
693
  deliberate redesign decision, never as a mechanical migration step.
576
694
  4. **Name was never styled by anyone** → see the next subsection.
577
695
 
578
- Registering is cheap — one array entry per name — and it is the
579
- behaviour-preserving default. Prefer it whenever you are not sure.
696
+ Registering is cheap — one array entry per name — and for a name **not** in
697
+ the table it is the behaviour-preserving default: the library has no rule for
698
+ an unknown name, so your CSS is the sole styling source. For a name that **is**
699
+ in the table, registering buys the type-check and nothing else — behaviour
700
+ preservation there is a cascade question (case 2 above). When unsure, prefer a
701
+ non-colliding name.
580
702
 
581
703
  ### ⚠ silent — a `theme` value that did nothing in v2 may do something in v3
582
704
 
@@ -753,16 +875,16 @@ to the new name (`hide-close`).
753
875
  warns.
754
876
  - **`BbPopover`**: `showClose`, `closeLabel`, `restoreFocus`, `block` removed —
755
877
  render your own close affordance in the content (`#default="{ close }"`).
756
- - **`BbDialog`**: `description`, `hideHeader`, `compact`, `overlayClasses`,
757
- `panelClasses` removed (use the `header` slot and normal classes). The
758
- `#description` and `#close` **slots** are gone too — v3's slot set is
759
- `header | title | default | footer`, and a custom close control goes inside
760
- `#header`, which replaces the whole default header including the ✕ (so
761
- `hide-close` is not needed alongside it).
762
- - **`BbOffCanvas`**: the same `description` prop and the same `#description` /
763
- `#close` slots were removed, with the same replacements. The
764
- `aria-describedby` wiring `description` used to provide is gone — put the
765
- copy in the default slot.
878
+ - **`BbDialog`**: `hideHeader`, `compact`, `overlayClasses`, `panelClasses`
879
+ removed (use the `header` slot and normal classes). The `#close` **slot** is
880
+ gone too — v3's slot set is `header | title | description | default | footer`,
881
+ and a custom close control goes inside `#header`, which replaces the whole
882
+ default header including the ✕ (so `hide-close` is not needed alongside it).
883
+ **`description` and `#description` survive**: they were dropped in early v3
884
+ and restored in 3.0.0-beta.19, unchanged from v2 and with `aria-describedby`
885
+ wired again.
886
+ - **`BbOffCanvas`**: the same `#close` removed, `description` /
887
+ `#description` kept (restored in 3.0.0-beta.19).
766
888
  - **`BbBreadcrumbs`**: string `divider` removed (slot-driven now);
767
889
  `dividerWidth` default changed `5` → `16`.
768
890
  - **`BbPagination`**: `loading` removed.
@@ -837,6 +959,15 @@ is the complete set — a class-by-class diff of the v2 stylesheet against v3
837
959
  leaves nothing else orphaned. All of it is **silent**: a selector on a class
838
960
  nobody emits matches nothing and throws nothing.
839
961
 
962
+ One caution when auditing on your own: absence from `styles.css` answers _"is
963
+ it styled"_, not _"is it emitted"_. Some classes carry no library rule but are
964
+ still rendered as styling hooks for you (`.bb-base-input-container__hint-text`
965
+ is one: its wrapper `__hint-wrap` carries the rules, the inner text node is
966
+ bare) — those are correct targets and correctly
967
+ absent from this table, which maps only classes that moved or died. Before
968
+ filing a class as removed, check the component's markup, not just the
969
+ stylesheet.
970
+
840
971
  **Input chrome**
841
972
 
842
973
  | v2 | v3 |
@@ -881,6 +1012,23 @@ v2 had no full-width tab strip, so apps hand-rolled one (commonly a
881
1012
  `.bb-tabs--block` / `.bb-tabs-list--block` and gives the triggers equal widths.
882
1013
  Delete the hand-rolled modifier rather than porting it.
883
1014
 
1015
+ **BbTable** — no class was renamed, but the markup under `.bb-table` is no
1016
+ longer a `<table>`: it is a CSS grid of `<div>`s carrying ARIA roles. Every
1017
+ **element** selector on it (`table`, `thead`, `tbody`, `tfoot`, `caption`,
1018
+ `tr`, `th`, `td`, `colgroup`/`col`) matches nothing in v3 — silently. The
1019
+ classes all survive; four containers and the roles are the translation:
1020
+
1021
+ | v2 element | v3 selector |
1022
+ | ------------------------------------- | -------------------------------------------------------------------------------------------- |
1023
+ | `table` / `thead` / `tbody` / `tfoot` | `.bb-table__table` / `.bb-table__head` / `.bb-table__body` / `.bb-table__foot` |
1024
+ | `caption` | `.bb-table-caption` |
1025
+ | `tr` / `th` / `td` | `[role=row]` / `[role=columnheader]` / `[role=cell]` (or the `.bb-table-*` row/cell classes) |
1026
+ | `colgroup` / `col` | gone — `columns[].width` |
1027
+
1028
+ Full table, the `.table-flush` idiom rewrite, the `#thead`/`#tbody`/`#tfoot`
1029
+ markup contract and the layout drift that comes with the substrate:
1030
+ [bb-table.md](./components/bb-table.md#the-table-is-a-css-grid-not-a-table-v3-beta-2026-08-26).
1031
+
884
1032
  **Everything else**
885
1033
 
886
1034
  | v2 | v3 |
@@ -914,9 +1062,13 @@ The date **input**'s own field tree (`.bb-base-date-picker-input__field`,
914
1062
  **Removed with no counterpart:** `.bb-base-dialog--compact`,
915
1063
  `.bb-offcanvas--compact`, `.bb-base-textarea--compact` (compact now lives on
916
1064
  `.common-input-wrapper--compact`), `.bb-base-select--active` / `--compact` /
917
- `__inner-wrapper` / `__input-container` (the select activator was rebuilt —
918
- nearest hooks are `.bb-base-select__activator`, `__value`, `__display-value`;
919
- `--shown` survives), `.bb-base-rating__option--highlighted` (v3 uses
1065
+ `__inner-wrapper` / `__input-container` / `__text-input` (the select activator
1066
+ was rebuilt — nearest hooks are `.bb-base-select__activator`, `__value`,
1067
+ `__display-value`; `--shown` survives. `__text-input` was v2's combobox typing
1068
+ field inside the activator; v3's activator is a `type="button"` overlay with no
1069
+ typable field, and typing moved into the panel's
1070
+ `.bb-select-popover__search-input` — restyle that instead, knowing it now sits
1071
+ in the popover, not the field), `.bb-base-rating__option--highlighted` (v3 uses
920
1072
  `--filled` / `--empty`), `.bb-progress--horizontal` (`.bb-progress` /
921
1073
  `.bb-progress-bar` are the blocks), `.bb-ratio` (component removed).
922
1074
 
@@ -928,23 +1080,27 @@ nested-table column alignment. They all dropped the `bb-` prefix, and every one
928
1080
  of them is consumed through `var(name, fallback)`, so a v2 name silently
929
1081
  resolves to the fallback instead of failing.
930
1082
 
931
- | v2 | v3 |
932
- | ----------------------------------------------------- | -------------------------------------------------------------------------- |
933
- | `--bb-table-{id}-track-{key}` | `--table-{id}-track-{key}` |
934
- | `--bb-table-offset-start` / `-end` | `--offset-start` / `--offset-end` |
935
- | `--bb-table-offset-internal-start` / `-end` | `--offset-internal-start` / `--offset-internal-end` |
936
- | `--bb-table-fill` | `--fill` |
937
- | `--bb-table-natural-width` | `--natural-width` |
938
- | `--bb-select-popover-width` (on `.bb-select-popover`) | `--w` — and the supported path is now the `width` prop, not a CSS override |
939
- | `--bb-icon-dimensions-w` (on `.bb-icon`) | `--w` |
940
- | `--bb-breadcrumbs-flex-basis` / `-flex-grow` | `--flex-basis` / `--flex-grow` |
941
- | `--bb-picker-preview-color` | `--picker-preview-color` |
1083
+ | v2 | v3 |
1084
+ | ----------------------------------------------------- | ----------------------------------------------------------------------------------------- |
1085
+ | `--bb-table-{id}-track-{key}` | `--table-{id}-track-{key}` |
1086
+ | `--bb-table-offset-start` / `-end` | `--offset-start` / `--offset-end` |
1087
+ | `--bb-table-offset-internal-start` / `-end` | `--offset-internal-start` / `--offset-internal-end` |
1088
+ | `--bb-table-fill` | **removed in 3.0.0** (briefly `--fill` in the betas; the grid substrate has no fill loop) |
1089
+ | `--bb-table-natural-width` | **removed in 3.0.0** (briefly `--natural-width` in the betas) |
1090
+ | `--bb-select-popover-width` (on `.bb-select-popover`) | `--w` — and the supported path is now the `width` prop, not a CSS override |
1091
+ | `--bb-icon-dimensions-w` (on `.bb-icon`) | `--w` |
1092
+ | `--bb-breadcrumbs-flex-basis` / `-flex-grow` | `--flex-basis` / `--flex-grow` |
1093
+ | `--bb-picker-preview-color` | `--picker-preview-color` |
942
1094
 
943
1095
  A regex matching the old shape (`/--bb-table-[\w-]+-track/`) matches nothing in
944
1096
  v3. Search your app for `--bb-table-`, `--bb-select-popover-`,
945
1097
  `--bb-icon-dimensions-`, `--bb-breadcrumbs-` and `--bb-picker-` — none of those
946
1098
  names exist in v3 and all of them fail quietly. `--available-height`,
947
- `--inner-width` and `--overlay-min-height` were dropped outright.
1099
+ `--inner-width`, `--overlay-min-height`, `--bb-table-fill` and
1100
+ `--bb-table-natural-width` were dropped outright — the last two because
1101
+ `BbTable` is a CSS grid in 3.0.0 and the fixed-layout self-correction they fed
1102
+ no longer exists (see
1103
+ [bb-table.md](./components/bb-table.md#--fill-and---natural-width-are-removed-not-renamed)).
948
1104
 
949
1105
  If you re-published track variables by hand to align a deeply nested table,
950
1106
  delete that code: `inherit-column-widths` takes a **table id**
@@ -1013,6 +1169,16 @@ Nothing here fails to compile — these change what existing code does.
1013
1169
  branch's children are now `inert` (out of the Tab order). Tests or CSS
1014
1170
  keyed on the removed roles match nothing — see
1015
1171
  [bb-tree.md](./components/bb-tree.md).
1172
+ 13. **`BbTable` is a CSS grid, not a `<table>`.** Column widths hold their
1173
+ overflow threshold, wrap floor and frozen widths exactly, but leftover
1174
+ space is shared equally between auto columns rather than proportionally
1175
+ to content, and a few table-only tricks stop working (`max-width: 0` for
1176
+ ellipsis collapses the cell). Copying rows into a spreadsheet pastes one
1177
+ value per line, and a printed table no longer repeats its header on each
1178
+ page. `#thead`/`#tbody`/`#tfoot` take `<div role="row">` rows, never
1179
+ `<tr>`. Requires subgrid (Chrome/Edge 117, Firefox 71, Safari 16) — no
1180
+ fallback. Full detail and the selector translation in
1181
+ [bb-table.md](./components/bb-table.md#the-table-is-a-css-grid-not-a-table-v3-beta-2026-08-26).
1016
1182
 
1017
1183
  ## 7. Class overrides → variants
1018
1184
 
@@ -1046,8 +1212,12 @@ screenshot; do not assume. Two consequences before you start:
1046
1212
  `variant="none"`; it is the one value that emits no variant class.
1047
1213
  - **A name that collides with a v3 built-in is the dangerous case, not the easy
1048
1214
  one.** If your app owned the look of `warning` / `destructive` / `secondary`,
1049
- converting to the same-named `variant` hands that look to the library.
1050
- Register the name as a custom variant (§4) to keep your CSS the only source.
1215
+ converting to the same-named `variant` hands that look to the library — and
1216
+ registering the name does **not** take it back: registration is type-only
1217
+ (§4), the built-in skin stays in `styles.css`. Keep your look by winning the
1218
+ cascade over the library's skin rules — author at block+modifier and load
1219
+ after `styles.css` (§4 case 2 has the specificity detail) — or convert to a
1220
+ non-colliding custom name.
1051
1221
 
1052
1222
  ### Finding them
1053
1223
 
@@ -1067,17 +1237,17 @@ rg -n 'class="bb-(button|badge|alert|toast-message|tooltip|indicator)\b' --type
1067
1237
 
1068
1238
  ### Correcting them
1069
1239
 
1070
- | Found | Rewrite as |
1071
- | --------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
1072
- | `<BbButton class="bb-button--outline">` | `<BbButton variant="outline">` (same for `secondary`, `ghost`, `destructive`, `link`) |
1073
- | `<BbAlert class="bb-alert--warning">` / v2 `theme="warning"` | `<BbAlert variant="warning">` |
1074
- | `class="bb-badge bb-badge--secondary"` on a `<span>` | `<BbBadge variant="secondary">` — the real component, not markup cosplay |
1075
- | `bb-toast-message--success` styling / v2 `theme` on toasts | `toast({ variant: 'success' })` |
1076
- | `bb-tooltip--destructive` | `<BbTooltip variant="destructive">` / `v-bb-tooltip="{ text, variant: 'destructive' }"` |
1077
- | A **custom** modifier (`bb-button--brand`, any name not in section 4's table) | Register it: `buttonVariants: ['brand']` in the plugin, keep your CSS, pass `variant="brand"`. |
1078
- | A modifier your app **styled itself**, whatever its name | Decide before you convert: accept v3's built-in look and delete your CSS, or register the name (§4) so your CSS stays the sole styling source. Converting silently does the former. |
1079
- | A **state** modifier that stacks on a variant (`bb-button--pressed` alongside `bb-button--outline`) | Not convertible — `variant` holds exactly one value. Keep it a class and rename it out of `bb-*` (`app-button--pressed`). If it marks a real toggle, `v-model` on `BbButton` owns the state: it sets `aria-pressed` and emits `bb-button--active`, which the library deliberately leaves unstyled for you. |
1080
- | A class that overrides _layout_, not look (widths, margins) | Leave it — classes remain the right tool for layout; variants own _appearance semantics_. |
1240
+ | Found | Rewrite as |
1241
+ | --------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
1242
+ | `<BbButton class="bb-button--outline">` | `<BbButton variant="outline">` (same for `secondary`, `ghost`, `destructive`, `link`) |
1243
+ | `<BbAlert class="bb-alert--warning">` / v2 `theme="warning"` | `<BbAlert variant="warning">` |
1244
+ | `class="bb-badge bb-badge--secondary"` on a `<span>` | `<BbBadge variant="secondary">` — the real component, not markup cosplay |
1245
+ | `bb-toast-message--success` styling / v2 `theme` on toasts | `toast({ variant: 'success' })` |
1246
+ | `bb-tooltip--destructive` | `<BbTooltip variant="destructive">` / `v-bb-tooltip="{ text, variant: 'destructive' }"` |
1247
+ | A **custom** modifier (`bb-button--brand`, any name not in section 4's table) | Register it: `buttonVariants: ['brand']` in the plugin, keep your CSS, pass `variant="brand"`. |
1248
+ | A modifier your app **styled itself**, whatever its name | Decide before you convert: accept v3's built-in look and delete your CSS, or keep yours. Keeping it is free for a non-built-in name (register it, done — there is no library rule to fight); for a built-in name registering only satisfies the type-check, and your rules must also win the cascade over the library's skin (§4, case 2). Converting silently does the former. |
1249
+ | A **state** modifier that stacks on a variant (`bb-button--pressed` alongside `bb-button--outline`) | Not convertible — `variant` holds exactly one value. Keep it a class and rename it out of `bb-*` (`app-button--pressed`). If it marks a real toggle, `v-model` on `BbButton` owns the state: it sets `aria-pressed` and emits `bb-button--active`, which the library deliberately leaves unstyled for you. |
1250
+ | A class that overrides _layout_, not look (widths, margins) | Leave it — classes remain the right tool for layout; variants own _appearance semantics_. |
1081
1251
 
1082
1252
  Rule of thumb: if the class name encodes a **meaning** (state, emphasis,
1083
1253
  severity), it should be a variant; if it encodes **geometry**, it stays a
@@ -1156,6 +1326,7 @@ rg -n -- '--bb-(contrasting|hint|icon-color|primary-(base|dark)|panel-(light|dar
1156
1326
  rg -n -- '--bb-ring-opacity' # survives by name; every value must now carry a % (section 3)
1157
1327
  rg -n 'bb-base-dialog|bb-tab__|bb-tab--|bb-cr-container|bb-common-input-outer-container|bb-common-input-inner-container|bb-base-input-container__input|bb-base-(checkbox|radio|switch)-container|bb-tree-row|bb-tree-main-content|bb-confirm__no|bb-dropdown__wrapper|bb-offcanvas__close|bb-popover__close|bb-ratio' # renamed or deleted CSS blocks — nothing in v3 emits any of these (§5.6)
1158
1328
  rg -n 'bb-color-palette__' # → .bb-base-color-palette__*; only __popover survives under the old name
1329
+ rg -n '\b(table|thead|tbody|tfoot|caption|colgroup|col|tr|th|td)\b' --type css --type vue # element selectors aimed at BbTable (`.bb-table table`, `:deep(> table > tbody …)`, a global `td { padding }`, `.prose table`) — BbTable is a div grid in v3, none of them reach it; translate per bb-table.md § Selector translation. Expect noise from `<table>` markup of your own and from words in comments — judge each hit
1159
1330
  rg -n 'bb-tabs--' # v3's own modifiers are --horizontal --vertical --block --compact --disabled; anything else is app-minted, and a hand-rolled full-width tab list is now <BbTabs block>
1160
1331
  ```
1161
1332