bitboss-ui 3.0.0-beta.4 → 3.0.0-beta.41

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 (937) hide show
  1. package/README.md +317 -98
  2. package/bin/bitboss-ui-mcp.mjs +1566 -75
  3. package/bin/bitboss-ui.mjs +716 -72
  4. package/dist/ai/BbAccordion.md +178 -56
  5. package/dist/ai/BbAlert.md +140 -28
  6. package/dist/ai/BbAsterisk.md +61 -4
  7. package/dist/ai/BbAvatar.md +194 -53
  8. package/dist/ai/BbBadge.md +250 -50
  9. package/dist/ai/BbBadgeButton.md +74 -21
  10. package/dist/ai/BbBaseButton.md +132 -51
  11. package/dist/ai/BbBaseCheckboxIcon.md +118 -26
  12. package/dist/ai/BbBaseRadioIcon.md +115 -26
  13. package/dist/ai/BbBaseSwitchIcon.md +123 -28
  14. package/dist/ai/BbBreadcrumbs.md +221 -51
  15. package/dist/ai/BbButton.md +389 -107
  16. package/dist/ai/BbCalendar.md +667 -0
  17. package/dist/ai/BbCheckbox.md +242 -80
  18. package/dist/ai/BbCheckboxGroup.md +575 -66
  19. package/dist/ai/BbCollapsible.md +158 -39
  20. package/dist/ai/BbColorInput.md +322 -82
  21. package/dist/ai/BbColorPalette.md +261 -61
  22. package/dist/ai/BbConfirm.md +220 -51
  23. package/dist/ai/BbConfirmPortal.md +1 -1
  24. package/dist/ai/BbDatePicker.md +272 -37
  25. package/dist/ai/BbDatePickerInput.md +321 -92
  26. package/dist/ai/BbDialog.md +492 -87
  27. package/dist/ai/BbDropdown.md +1182 -104
  28. package/dist/ai/BbDropdownButton.md +239 -61
  29. package/dist/ai/BbDropdownGroup.md +5 -5
  30. package/dist/ai/BbDropzone.md +140 -36
  31. package/dist/ai/BbForm.md +1165 -40
  32. package/dist/ai/BbIcon.md +100 -33
  33. package/dist/ai/BbIndicator.md +79 -12
  34. package/dist/ai/BbNumberInput.md +257 -87
  35. package/dist/ai/BbOffCanvas.md +396 -91
  36. package/dist/ai/BbPagination.md +199 -32
  37. package/dist/ai/BbPopover.md +219 -54
  38. package/dist/ai/BbProgress.md +137 -71
  39. package/dist/ai/BbPtScope.md +136 -0
  40. package/dist/ai/BbRadio.md +234 -43
  41. package/dist/ai/BbRadioGroup.md +529 -91
  42. package/dist/ai/BbRating.md +243 -61
  43. package/dist/ai/BbSelect.md +690 -120
  44. package/dist/ai/BbSelectPopover.md +434 -122
  45. package/dist/ai/BbSlider.md +275 -79
  46. package/dist/ai/BbSmoothHeight.md +142 -34
  47. package/dist/ai/BbSpinner.md +179 -81
  48. package/dist/ai/BbSwitch.md +249 -63
  49. package/dist/ai/BbSwitchGroup.md +394 -65
  50. package/dist/ai/BbTable.md +1666 -222
  51. package/dist/ai/BbTabs.md +898 -178
  52. package/dist/ai/BbTabsList.md +81 -7
  53. package/dist/ai/BbTabsPanels.md +77 -0
  54. package/dist/ai/BbTabsRoot.md +16 -15
  55. package/dist/ai/BbTag.md +256 -76
  56. package/dist/ai/BbTextInput.md +480 -102
  57. package/dist/ai/BbTextarea.md +310 -96
  58. package/dist/ai/BbTimePicker.md +159 -24
  59. package/dist/ai/BbTimePickerInput.md +277 -46
  60. package/dist/ai/BbToast.md +286 -40
  61. package/dist/ai/BbToastPortal.md +3 -3
  62. package/dist/ai/BbTooltip.md +187 -34
  63. package/dist/ai/BbTree.md +260 -85
  64. package/dist/ai/ChipsBox.md +43 -2
  65. package/dist/ai/ClearableButton.md +12 -0
  66. package/dist/ai/CommaBox.md +2 -1
  67. package/dist/ai/CommonField.md +63 -0
  68. package/dist/ai/CommonFieldInput.md +90 -0
  69. package/dist/ai/CommonPopover.md +17 -12
  70. package/dist/ai/CommonTimeSelector.md +63 -0
  71. package/dist/ai/ErrorIcon.md +20 -0
  72. package/dist/ai/FlatListBox.md +41 -11
  73. package/dist/ai/GroupedListBox.md +42 -12
  74. package/dist/ai/ListBox.md +46 -11
  75. package/dist/ai/OptionsContainer.md +13 -10
  76. package/dist/ai/WarningIcon.md +20 -0
  77. package/dist/ai/changelog.json +4025 -141
  78. package/dist/ai/components.json +51872 -10136
  79. package/dist/ai/composables/useBbConfig.md +72 -11
  80. package/dist/ai/composables/useBbDropdownContext.md +168 -0
  81. package/dist/ai/composables/useBbFormContext.md +51 -24
  82. package/dist/ai/composables/useBbFormField.md +134 -0
  83. package/dist/ai/composables/useBbTableContext.md +41 -19
  84. package/dist/ai/composables/useConfirm.md +16 -8
  85. package/dist/ai/composables/useCountdown.md +1 -1
  86. package/dist/ai/composables/useId.md +10 -10
  87. package/dist/ai/composables/useMobile.md +17 -10
  88. package/dist/ai/composables/useToast.md +25 -19
  89. package/dist/ai/design-tokens.json +940 -0
  90. package/dist/ai/design-tokens.manifest.yaml +175 -0
  91. package/dist/ai/guides/agent-contract.md +168 -22
  92. package/dist/ai/guides/ai-router.md +79 -40
  93. package/dist/ai/guides/app-layout.md +8 -4
  94. package/dist/ai/guides/coherence-playbook.md +8 -8
  95. package/dist/ai/guides/component-picker.md +42 -34
  96. package/dist/ai/guides/design-language.md +274 -97
  97. package/dist/ai/guides/design-tokens.md +493 -105
  98. package/dist/ai/guides/fetch-items-playbook.md +22 -16
  99. package/dist/ai/guides/icons-policy.md +67 -35
  100. package/dist/ai/guides/inertia-helpers.md +4 -1
  101. package/dist/ai/guides/inline-edit-playbook.md +13 -6
  102. package/dist/ai/guides/installation-and-plugin-setup.md +817 -73
  103. package/dist/ai/guides/migration/components/bb-accordion.md +37 -0
  104. package/dist/ai/guides/migration/components/bb-alert.md +2 -2
  105. package/dist/ai/guides/migration/components/bb-avatar.md +13 -14
  106. package/dist/ai/guides/migration/components/bb-badge.md +5 -5
  107. package/dist/ai/guides/migration/components/bb-breadcrumbs.md +9 -8
  108. package/dist/ai/guides/migration/components/bb-button.md +80 -20
  109. package/dist/ai/guides/migration/components/bb-checkbox-group.md +116 -29
  110. package/dist/ai/guides/migration/components/bb-checkbox.md +53 -10
  111. package/dist/ai/guides/migration/components/bb-chip.md +6 -6
  112. package/dist/ai/guides/migration/components/bb-collapsible.md +5 -5
  113. package/dist/ai/guides/migration/components/bb-color-input.md +5 -5
  114. package/dist/ai/guides/migration/components/bb-color-palette.md +16 -9
  115. package/dist/ai/guides/migration/components/bb-date-picker-input.md +45 -35
  116. package/dist/ai/guides/migration/components/bb-dialog.md +69 -36
  117. package/dist/ai/guides/migration/components/bb-dropdown-button.md +7 -1
  118. package/dist/ai/guides/migration/components/bb-dropdown.md +31 -8
  119. package/dist/ai/guides/migration/components/bb-dropzone.md +8 -0
  120. package/dist/ai/guides/migration/components/bb-icon.md +7 -7
  121. package/dist/ai/guides/migration/components/bb-intersection.md +1 -1
  122. package/dist/ai/guides/migration/components/bb-offcanvas.md +29 -31
  123. package/dist/ai/guides/migration/components/bb-pagination.md +10 -0
  124. package/dist/ai/guides/migration/components/bb-popover.md +19 -11
  125. package/dist/ai/guides/migration/components/bb-radio-group.md +14 -0
  126. package/dist/ai/guides/migration/components/bb-rating.md +61 -24
  127. package/dist/ai/guides/migration/components/bb-select-popover.md +9 -1
  128. package/dist/ai/guides/migration/components/bb-select.md +21 -4
  129. package/dist/ai/guides/migration/components/bb-slider.md +14 -6
  130. package/dist/ai/guides/migration/components/bb-switch-group.md +14 -0
  131. package/dist/ai/guides/migration/components/bb-table.md +574 -33
  132. package/dist/ai/guides/migration/components/bb-tabs.md +91 -41
  133. package/dist/ai/guides/migration/components/bb-tag.md +9 -7
  134. package/dist/ai/guides/migration/components/bb-text-input.md +12 -12
  135. package/dist/ai/guides/migration/components/bb-toast.md +2 -2
  136. package/dist/ai/guides/migration/components/bb-tooltip.md +18 -0
  137. package/dist/ai/guides/migration/components/bb-tree.md +11 -9
  138. package/dist/ai/guides/migration/components/use-confirm.md +9 -1
  139. package/dist/ai/guides/migration/v2-to-v3.md +828 -240
  140. package/dist/ai/guides/migration/v3-beta-css-classes.md +751 -0
  141. package/dist/ai/guides/migration/v3-beta-tooling.md +119 -0
  142. package/dist/ai/guides/options-items-playbook.md +161 -12
  143. package/dist/ai/guides/page-shell.md +1 -1
  144. package/dist/ai/guides/passthrough.md +958 -0
  145. package/dist/ai/guides/preset-components.md +361 -0
  146. package/dist/ai/guides/ssr-prefill.md +127 -0
  147. package/dist/ai/guides/validated-forms.md +466 -55
  148. package/dist/ai/guides/validation-libraries.md +171 -0
  149. package/dist/ai/guides/validation-providers.md +113 -0
  150. package/dist/ai/index.md +45 -44
  151. package/dist/ai/recipes/inertia/approvals-inbox.md +26 -10
  152. package/dist/ai/recipes/inertia/command-palette.md +2 -2
  153. package/dist/ai/recipes/inertia/inline-edit-workspace.md +46 -30
  154. package/dist/ai/recipes/inertia/layout-scaffold.md +6 -2
  155. package/dist/ai/recipes/inertia/onboarding.md +30 -8
  156. package/dist/ai/recipes/inertia/ownership-atlas.md +72 -49
  157. package/dist/ai/recipes/inertia/record-form.md +53 -19
  158. package/dist/ai/recipes/inertia/records-workspace.md +201 -49
  159. package/dist/ai/recipes/inertia/settings-workspace.md +3809 -0
  160. package/dist/ai/recipes/inertia/upload-center.md +54 -43
  161. package/dist/ai/recipes/inertia/wizard-form.md +98 -14
  162. package/dist/ai/recipes/nuxt/approvals-inbox.md +26 -10
  163. package/dist/ai/recipes/nuxt/command-palette.md +2 -2
  164. package/dist/ai/recipes/nuxt/inline-edit-workspace.md +68 -52
  165. package/dist/ai/recipes/nuxt/layout-scaffold.md +6 -2
  166. package/dist/ai/recipes/nuxt/onboarding.md +30 -8
  167. package/dist/ai/recipes/nuxt/record-form.md +66 -22
  168. package/dist/ai/recipes/nuxt/records-workspace.md +199 -48
  169. package/dist/ai/recipes/nuxt/settings-workspace.md +3898 -0
  170. package/dist/ai/recipes/nuxt/upload-center.md +52 -41
  171. package/dist/ai/recipes/nuxt/wizard-form.md +98 -14
  172. package/dist/ai/recipes/vue/approvals-inbox.md +28 -12
  173. package/dist/ai/recipes/vue/command-palette.md +2 -2
  174. package/dist/ai/recipes/vue/inline-edit-workspace.md +69 -53
  175. package/dist/ai/recipes/vue/layout-scaffold.md +6 -2
  176. package/dist/ai/recipes/vue/onboarding.md +32 -8
  177. package/dist/ai/recipes/vue/record-form.md +81 -54
  178. package/dist/ai/recipes/vue/records-workspace.md +198 -49
  179. package/dist/ai/recipes/vue/settings-workspace.md +3836 -0
  180. package/dist/ai/recipes/vue/upload-center.md +53 -42
  181. package/dist/ai/recipes/vue/wizard-form.md +97 -14
  182. package/dist/ai/source/BbAccordion.md +90 -24
  183. package/dist/ai/source/BbAlert.md +209 -62
  184. package/dist/ai/source/BbAsterisk.md +54 -4
  185. package/dist/ai/source/BbAvatar.md +73 -16
  186. package/dist/ai/source/BbBadge.md +265 -97
  187. package/dist/ai/source/BbBadgeButton.md +218 -79
  188. package/dist/ai/source/BbBaseButton.md +108 -12
  189. package/dist/ai/source/BbBaseCheckboxIcon.md +151 -36
  190. package/dist/ai/source/BbBaseRadioIcon.md +121 -17
  191. package/dist/ai/source/BbBaseSwitchIcon.md +138 -28
  192. package/dist/ai/source/BbBreadcrumbs.md +363 -69
  193. package/dist/ai/source/BbButton.md +563 -174
  194. package/dist/ai/source/BbCalendar.md +1744 -0
  195. package/dist/ai/source/BbCheckbox.md +470 -68
  196. package/dist/ai/source/BbCheckboxGroup.md +976 -95
  197. package/dist/ai/source/BbCollapsible.md +96 -8
  198. package/dist/ai/source/BbColorInput.md +597 -67
  199. package/dist/ai/source/BbColorPalette.md +1284 -65
  200. package/dist/ai/source/BbConfirm.md +149 -7
  201. package/dist/ai/source/BbConfirmPortal.md +89 -3
  202. package/dist/ai/source/BbDatePicker.md +527 -381
  203. package/dist/ai/source/BbDatePickerInput.md +2015 -118
  204. package/dist/ai/source/BbDialog.md +531 -64
  205. package/dist/ai/source/BbDropdown.md +885 -175
  206. package/dist/ai/source/BbDropdownButton.md +377 -79
  207. package/dist/ai/source/BbDropdownGroup.md +687 -96
  208. package/dist/ai/source/BbDropzone.md +140 -31
  209. package/dist/ai/source/BbForm.md +875 -17
  210. package/dist/ai/source/BbIcon.md +130 -52
  211. package/dist/ai/source/BbIndicator.md +117 -60
  212. package/dist/ai/source/BbNumberInput.md +667 -84
  213. package/dist/ai/source/BbOffCanvas.md +1007 -261
  214. package/dist/ai/source/BbPagination.md +203 -31
  215. package/dist/ai/source/BbPopover.md +267 -90
  216. package/dist/ai/source/BbProgress.md +88 -26
  217. package/dist/ai/source/BbPtScope.md +54 -0
  218. package/dist/ai/source/BbRadio.md +388 -58
  219. package/dist/ai/source/BbRadioGroup.md +940 -109
  220. package/dist/ai/source/BbRating.md +736 -84
  221. package/dist/ai/source/BbSelect.md +1096 -96
  222. package/dist/ai/source/BbSelectPopover.md +807 -114
  223. package/dist/ai/source/BbSlider.md +1390 -98
  224. package/dist/ai/source/BbSmoothHeight.md +48 -2
  225. package/dist/ai/source/BbSpinner.md +62 -6
  226. package/dist/ai/source/BbSwitch.md +297 -60
  227. package/dist/ai/source/BbSwitchGroup.md +761 -83
  228. package/dist/ai/source/BbTable.md +6950 -1864
  229. package/dist/ai/source/BbTabs.md +368 -111
  230. package/dist/ai/source/BbTabsList.md +503 -146
  231. package/dist/ai/source/BbTabsPanels.md +625 -0
  232. package/dist/ai/source/BbTabsRoot.md +319 -100
  233. package/dist/ai/source/BbTag.md +796 -87
  234. package/dist/ai/source/BbTextInput.md +497 -68
  235. package/dist/ai/source/BbTextarea.md +550 -65
  236. package/dist/ai/source/BbTimePicker.md +395 -69
  237. package/dist/ai/source/BbTimePickerInput.md +1233 -106
  238. package/dist/ai/source/BbToast.md +250 -74
  239. package/dist/ai/source/BbToastPortal.md +210 -66
  240. package/dist/ai/source/BbTooltip.md +181 -30
  241. package/dist/ai/source/BbTree.md +76 -11
  242. package/dist/ai/source/ChipsBox.md +25 -5
  243. package/dist/ai/source/CommaBox.md +21 -6
  244. package/dist/ai/source/{BbBaseInputContainer.md → CommonField.md} +467 -250
  245. package/dist/ai/source/CommonFieldInput.md +848 -0
  246. package/dist/ai/source/CommonPopover.md +116 -30
  247. package/dist/ai/source/CommonTimeSelector.md +726 -0
  248. package/dist/ai/source/ErrorIcon.md +2 -2
  249. package/dist/ai/source/FlatListBox.md +188 -17
  250. package/dist/ai/source/GroupedListBox.md +236 -44
  251. package/dist/ai/source/GuidesComponent.md +14 -7
  252. package/dist/ai/source/ListBox.md +46 -8
  253. package/dist/ai/source/OptionsContainer.md +288 -60
  254. package/dist/ai/source/WarningIcon.md +2 -2
  255. package/dist/assets/css/reset.css_inline.js +1 -1
  256. package/dist/assets/svgs/star.svg_raw.js +4 -0
  257. package/dist/components/BbAccordion/BbAccordion.vue_vue_type_script_setup_true_lang.js +49 -32
  258. package/dist/components/BbAccordion/types.d.ts +35 -3
  259. package/dist/components/BbAccordion/types.js +11 -0
  260. package/dist/components/BbAlert/BbAlert.vue_vue_type_script_setup_true_lang.js +46 -30
  261. package/dist/components/BbAlert/types.d.ts +37 -3
  262. package/dist/components/BbAlert/types.js +13 -0
  263. package/dist/components/BbAsterisk/BbAsterisk.vue.d.ts +3 -1
  264. package/dist/components/BbAsterisk/BbAsterisk.vue_vue_type_script_setup_true_lang.js +23 -8
  265. package/dist/components/BbAsterisk/types.d.ts +18 -0
  266. package/dist/components/BbAsterisk/types.js +7 -0
  267. package/dist/components/BbAvatar/BbAvatar.vue.d.ts +1 -1
  268. package/dist/components/BbAvatar/BbAvatar.vue_vue_type_script_setup_true_lang.js +57 -44
  269. package/dist/components/BbAvatar/types.d.ts +23 -0
  270. package/dist/components/BbAvatar/types.js +7 -0
  271. package/dist/components/BbBadge/BadgeBodyContent.vue_vue_type_script_setup_true_lang.js +24 -18
  272. package/dist/components/BbBadge/BbBadge.vue_vue_type_script_setup_true_lang.js +96 -53
  273. package/dist/components/BbBadge/BbBadgeButton.vue_vue_type_script_setup_true_lang.js +27 -8
  274. package/dist/components/BbBadge/badgeButtonContext.d.ts +25 -8
  275. package/dist/components/BbBadge/types.d.ts +46 -3
  276. package/dist/components/BbBadge/types.js +13 -0
  277. package/dist/components/BbBaseButton/BbBaseButton.vue_vue_type_script_setup_true_lang.js +109 -96
  278. package/dist/components/BbBaseButton/RouterComponent.vue_vue_type_script_setup_true_lang.js +11 -11
  279. package/dist/components/BbBaseButton/types.d.ts +33 -3
  280. package/dist/components/BbBaseButton/types.js +9 -2
  281. package/dist/components/BbBaseCheckboxIcon/BbBaseCheckboxIcon.vue_vue_type_script_setup_true_lang.js +50 -18
  282. package/dist/components/BbBaseCheckboxIcon/types.d.ts +31 -2
  283. package/dist/components/BbBaseCheckboxIcon/types.js +8 -0
  284. package/dist/components/BbBaseRadioIcon/BbBaseRadioIcon.vue_vue_type_script_setup_true_lang.js +45 -15
  285. package/dist/components/BbBaseRadioIcon/types.d.ts +31 -2
  286. package/dist/components/BbBaseRadioIcon/types.js +8 -0
  287. package/dist/components/BbBaseSwitchIcon/BbBaseSwitchIcon.vue_vue_type_script_setup_true_lang.js +48 -16
  288. package/dist/components/BbBaseSwitchIcon/types.d.ts +31 -2
  289. package/dist/components/BbBaseSwitchIcon/types.js +8 -0
  290. package/dist/components/BbBreadcrumbs/BbBreadcrumbs.vue_vue_type_script_setup_true_lang.js +187 -132
  291. package/dist/components/BbBreadcrumbs/types.d.ts +45 -3
  292. package/dist/components/BbBreadcrumbs/types.js +12 -0
  293. package/dist/components/BbButton/BbButton.vue.d.ts +5 -0
  294. package/dist/components/BbButton/BbButton.vue_vue_type_script_setup_true_lang.js +107 -81
  295. package/dist/components/BbButton/types.d.ts +113 -2
  296. package/dist/components/BbButton/types.js +12 -0
  297. package/dist/components/BbCalendar/BbCalendar.vue.d.ts +34 -0
  298. package/dist/components/BbCalendar/BbCalendar.vue.js +6 -0
  299. package/dist/components/BbCalendar/BbCalendar.vue_vue_type_script_setup_true_lang.js +608 -0
  300. package/dist/components/BbCalendar/CalendarMonthPanel.vue.js +5 -0
  301. package/dist/components/BbCalendar/CalendarMonthPanel.vue_vue_type_script_setup_true_lang.js +124 -0
  302. package/dist/components/BbCalendar/CalendarYearPanel.vue.js +5 -0
  303. package/dist/components/BbCalendar/CalendarYearPanel.vue_vue_type_script_setup_true_lang.js +126 -0
  304. package/dist/components/BbCalendar/calendarHost.d.ts +29 -0
  305. package/dist/components/BbCalendar/calendarHost.js +10 -0
  306. package/dist/components/BbCalendar/types.d.ts +225 -0
  307. package/dist/components/BbCalendar/types.js +29 -0
  308. package/dist/components/{BbBaseDatePicker/useDatePickerContext.d.ts → BbCalendar/useCalendarContext.d.ts} +10 -7
  309. package/dist/components/BbCalendar/useCalendarContext.js +11 -0
  310. package/dist/components/BbCalendar/useCalendarGrid.d.ts +208 -0
  311. package/dist/components/BbCalendar/useCalendarGrid.js +274 -0
  312. package/dist/components/BbCalendar/useDayGrid.d.ts +79 -0
  313. package/dist/components/BbCalendar/useDayGrid.js +204 -0
  314. package/dist/components/BbCalendar/useToday.d.ts +23 -0
  315. package/dist/components/BbCalendar/useToday.js +21 -0
  316. package/dist/components/BbCheckbox/BbCheckbox.vue.d.ts +7 -7
  317. package/dist/components/BbCheckbox/BbCheckbox.vue_vue_type_script_setup_true_lang.js +214 -72
  318. package/dist/components/BbCheckbox/types.d.ts +180 -13
  319. package/dist/components/BbCheckbox/types.js +8 -0
  320. package/dist/components/BbCheckboxGroup/BbCheckboxGroup.vue.d.ts +15 -3
  321. package/dist/components/BbCheckboxGroup/BbCheckboxGroup.vue_vue_type_script_setup_true_lang.js +338 -90
  322. package/dist/components/BbCheckboxGroup/types.d.ts +195 -20
  323. package/dist/components/BbCheckboxGroup/types.js +10 -0
  324. package/dist/components/BbCollapsible/BbCollapsible.vue.d.ts +2 -1
  325. package/dist/components/BbCollapsible/BbCollapsible.vue_vue_type_script_setup_true_lang.js +41 -19
  326. package/dist/components/BbCollapsible/types.d.ts +44 -1
  327. package/dist/components/BbCollapsible/types.js +7 -0
  328. package/dist/components/BbColorInput/BbColorInput.vue.d.ts +17 -7
  329. package/dist/components/BbColorInput/BbColorInput.vue_vue_type_script_setup_true_lang.js +330 -86
  330. package/dist/components/BbColorInput/types.d.ts +230 -12
  331. package/dist/components/BbColorInput/types.js +24 -0
  332. package/dist/components/BbColorPalette/BbColorPalette.vue.d.ts +10 -2
  333. package/dist/components/BbColorPalette/BbColorPalette.vue_vue_type_script_setup_true_lang.js +515 -108
  334. package/dist/components/BbColorPalette/types.d.ts +76 -7
  335. package/dist/components/BbColorPalette/types.js +12 -0
  336. package/dist/components/BbConfirm/BbConfirm.vue.d.ts +2 -1
  337. package/dist/components/BbConfirm/BbConfirm.vue_vue_type_script_setup_true_lang.js +125 -76
  338. package/dist/components/BbConfirm/BbConfirmPortal.vue.d.ts +1 -0
  339. package/dist/components/BbConfirm/types.d.ts +49 -0
  340. package/dist/components/BbConfirm/types.js +17 -0
  341. package/dist/components/BbDatePicker/BbDatePicker.vue.d.ts +16 -10
  342. package/dist/components/BbDatePicker/BbDatePicker.vue_vue_type_script_setup_true_lang.js +320 -223
  343. package/dist/components/BbDatePicker/types.d.ts +111 -17
  344. package/dist/components/BbDatePicker/types.js +33 -0
  345. package/dist/components/BbDatePickerInput/BbDatePickerInput.vue.d.ts +16 -4
  346. package/dist/components/BbDatePickerInput/BbDatePickerInput.vue_vue_type_script_setup_true_lang.js +1172 -87
  347. package/dist/components/BbDatePickerInput/types.d.ts +224 -19
  348. package/dist/components/BbDatePickerInput/types.js +39 -0
  349. package/dist/components/BbDialog/BbDialog.vue.d.ts +3 -3
  350. package/dist/components/BbDialog/BbDialog.vue_vue_type_script_setup_true_lang.js +227 -136
  351. package/dist/components/BbDialog/types.d.ts +92 -3
  352. package/dist/components/BbDialog/types.js +16 -0
  353. package/dist/components/BbDialog/useDialogStack.d.ts +12 -0
  354. package/dist/components/BbDialog/useDialogStack.js +9 -2
  355. package/dist/components/BbDropdown/AdaptiveDropdown.vue.d.ts +2 -0
  356. package/dist/components/BbDropdown/AdaptiveDropdown.vue_vue_type_script_setup_true_lang.js +108 -96
  357. package/dist/components/BbDropdown/BbDropdown.vue.d.ts +10 -2
  358. package/dist/components/BbDropdown/BbDropdown.vue_vue_type_script_setup_true_lang.js +337 -268
  359. package/dist/components/BbDropdown/BbDropdownGroup.vue.d.ts +5 -1
  360. package/dist/components/BbDropdown/BbDropdownList.vue.d.ts +8 -2
  361. package/dist/components/BbDropdown/BbDropdownList.vue_vue_type_script_setup_true_lang.js +377 -293
  362. package/dist/components/BbDropdown/DropdownPipelineResolver.vue_vue_type_script_setup_true_lang.js +129 -118
  363. package/dist/components/BbDropdown/normalizeGroups.js +55 -31
  364. package/dist/components/BbDropdown/types.d.ts +288 -30
  365. package/dist/components/BbDropdown/types.js +21 -2
  366. package/dist/components/BbDropdown/useDropdownContext.d.ts +10 -4
  367. package/dist/components/BbDropdown/useDropdownGroupRegistry.d.ts +1 -0
  368. package/dist/components/BbDropdownButton/BbDropdownButton.vue.d.ts +18 -3
  369. package/dist/components/BbDropdownButton/BbDropdownButton.vue_vue_type_script_setup_true_lang.js +172 -40
  370. package/dist/components/BbDropdownButton/types.d.ts +137 -8
  371. package/dist/components/BbDropdownButton/types.js +35 -0
  372. package/dist/components/BbDropzone/BbDropzone.vue.d.ts +2 -2
  373. package/dist/components/BbDropzone/BbDropzone.vue_vue_type_script_setup_true_lang.js +186 -144
  374. package/dist/components/BbDropzone/types.d.ts +38 -4
  375. package/dist/components/BbDropzone/types.js +16 -0
  376. package/dist/components/BbForm/BbForm.vue.d.ts +94 -0
  377. package/dist/{validated → components/BbForm}/BbForm.vue.js +1 -1
  378. package/dist/components/BbForm/BbForm.vue_vue_type_script_setup_true_lang.js +317 -0
  379. package/dist/components/BbForm/BbFormCustomField.d.ts +14 -0
  380. package/dist/components/BbForm/BbFormCustomField.js +43 -0
  381. package/dist/components/BbForm/bindFormField.d.ts +16 -0
  382. package/dist/components/BbForm/bindFormField.js +85 -0
  383. package/dist/components/BbForm/formFields.d.ts +64 -0
  384. package/dist/components/BbForm/formFields.js +11 -0
  385. package/dist/components/BbForm/formSchema.d.ts +56 -0
  386. package/dist/components/BbForm/formSchema.js +196 -0
  387. package/dist/components/BbForm/standardSchema.d.ts +59 -0
  388. package/dist/components/BbIcon/BbIcon.vue_vue_type_script_setup_true_lang.js +58 -48
  389. package/dist/components/BbIcon/iconCache.d.ts +63 -0
  390. package/dist/components/BbIcon/iconCache.js +35 -0
  391. package/dist/components/BbIcon/types.d.ts +22 -2
  392. package/dist/components/BbIcon/types.js +7 -0
  393. package/dist/components/BbIndicator/BbIndicator.vue_vue_type_script_setup_true_lang.js +34 -21
  394. package/dist/components/BbIndicator/types.d.ts +24 -0
  395. package/dist/components/BbIndicator/types.js +7 -0
  396. package/dist/components/BbNumberInput/BbNumberInput.vue.d.ts +12 -8
  397. package/dist/components/BbNumberInput/BbNumberInput.vue_vue_type_script_setup_true_lang.js +308 -85
  398. package/dist/components/BbNumberInput/types.d.ts +201 -18
  399. package/dist/components/BbNumberInput/types.js +8 -0
  400. package/dist/components/BbOffCanvas/BbOffCanvas.vue.d.ts +3 -3
  401. package/dist/components/BbOffCanvas/BbOffCanvas.vue_vue_type_script_setup_true_lang.js +311 -210
  402. package/dist/components/BbOffCanvas/types.d.ts +79 -6
  403. package/dist/components/BbOffCanvas/types.js +15 -0
  404. package/dist/components/BbPagination/BbPagination.vue.d.ts +2 -2
  405. package/dist/components/BbPagination/BbPagination.vue_vue_type_script_setup_true_lang.js +125 -90
  406. package/dist/components/BbPagination/types.d.ts +38 -0
  407. package/dist/components/BbPagination/types.js +13 -0
  408. package/dist/components/BbPopover/BbPopover.vue.d.ts +4 -4
  409. package/dist/components/BbPopover/BbPopover.vue_vue_type_script_setup_true_lang.js +219 -179
  410. package/dist/components/BbPopover/types.d.ts +51 -5
  411. package/dist/components/BbPopover/types.js +14 -0
  412. package/dist/components/BbProgress/BbProgress.vue_vue_type_script_setup_true_lang.js +29 -16
  413. package/dist/components/BbProgress/types.d.ts +25 -0
  414. package/dist/components/BbProgress/types.js +7 -0
  415. package/dist/components/BbPtScope/BbPtScope.vue.d.ts +12 -0
  416. package/dist/components/BbPtScope/BbPtScope.vue.js +5 -0
  417. package/dist/components/BbPtScope/BbPtScope.vue_vue_type_script_setup_true_lang.js +13 -0
  418. package/dist/components/BbPtScope/types.d.ts +15 -0
  419. package/dist/components/BbRadio/BbRadio.vue.d.ts +7 -7
  420. package/dist/components/BbRadio/BbRadio.vue_vue_type_script_setup_true_lang.js +172 -59
  421. package/dist/components/BbRadio/types.d.ts +152 -13
  422. package/dist/components/BbRadio/types.js +8 -0
  423. package/dist/components/BbRadioGroup/BbRadioGroup.vue.d.ts +14 -2
  424. package/dist/components/BbRadioGroup/BbRadioGroup.vue_vue_type_script_setup_true_lang.js +319 -92
  425. package/dist/components/BbRadioGroup/types.d.ts +198 -22
  426. package/dist/components/BbRadioGroup/types.js +10 -0
  427. package/dist/components/BbRating/BbRating.vue.d.ts +10 -8
  428. package/dist/components/BbRating/BbRating.vue_vue_type_script_setup_true_lang.js +259 -78
  429. package/dist/components/BbRating/types.d.ts +174 -13
  430. package/dist/components/BbRating/types.js +21 -0
  431. package/dist/components/BbSelect/BbSelect.vue.d.ts +17 -3
  432. package/dist/components/BbSelect/BbSelect.vue_vue_type_script_setup_true_lang.js +553 -83
  433. package/dist/components/BbSelect/types.d.ts +235 -20
  434. package/dist/components/BbSelect/types.js +41 -0
  435. package/dist/components/BbSelectPopover/BbSelectPopover.vue.d.ts +15 -1
  436. package/dist/components/BbSelectPopover/BbSelectPopover.vue_vue_type_script_setup_true_lang.js +541 -391
  437. package/dist/components/BbSelectPopover/types.d.ts +124 -8
  438. package/dist/components/BbSelectPopover/types.js +24 -0
  439. package/dist/components/BbSlider/BbSlider.vue.d.ts +13 -8
  440. package/dist/components/BbSlider/BbSlider.vue_vue_type_script_setup_true_lang.js +472 -96
  441. package/dist/components/BbSlider/types.d.ts +202 -13
  442. package/dist/components/BbSlider/types.js +26 -0
  443. package/dist/components/BbSmoothHeight/BbSmoothHeight.vue.d.ts +1 -1
  444. package/dist/components/BbSmoothHeight/BbSmoothHeight.vue_vue_type_script_setup_true_lang.js +60 -48
  445. package/dist/components/BbSmoothHeight/types.d.ts +19 -0
  446. package/dist/components/BbSmoothHeight/types.js +7 -0
  447. package/dist/components/BbSpinner/BbSpinner.vue_vue_type_script_setup_true_lang.js +27 -14
  448. package/dist/components/BbSpinner/types.d.ts +22 -1
  449. package/dist/components/BbSpinner/types.js +7 -0
  450. package/dist/components/BbSwitch/BbSwitch.vue.d.ts +7 -7
  451. package/dist/components/BbSwitch/BbSwitch.vue_vue_type_script_setup_true_lang.js +220 -78
  452. package/dist/components/BbSwitch/types.d.ts +25 -10
  453. package/dist/components/BbSwitch/types.js +5 -0
  454. package/dist/components/BbSwitchGroup/BbSwitchGroup.vue.d.ts +14 -2
  455. package/dist/components/BbSwitchGroup/BbSwitchGroup.vue_vue_type_script_setup_true_lang.js +338 -90
  456. package/dist/components/BbSwitchGroup/types.d.ts +30 -7
  457. package/dist/components/BbSwitchGroup/types.js +5 -0
  458. package/dist/components/BbTable/BbTable.vue.d.ts +27 -6
  459. package/dist/components/BbTable/BbTable.vue_vue_type_script_setup_true_lang.js +2013 -685
  460. package/dist/components/BbTable/BbTableDataRow.d.ts +196 -0
  461. package/dist/components/BbTable/BbTableDataRow.js +151 -0
  462. package/dist/components/BbTable/BbTableExpandRow.d.ts +84 -0
  463. package/dist/components/BbTable/BbTableExpandRow.js +62 -0
  464. package/dist/components/BbTable/BbTableSelectToggle.d.ts +120 -0
  465. package/dist/components/BbTable/BbTableSelectToggle.js +122 -0
  466. package/dist/components/BbTable/gridWidgets.d.ts +30 -0
  467. package/dist/components/BbTable/gridWidgets.js +14 -0
  468. package/dist/components/BbTable/types.d.ts +473 -123
  469. package/dist/components/BbTable/types.js +31 -0
  470. package/dist/components/BbTable/utils.d.ts +145 -4
  471. package/dist/components/BbTable/utils.js +154 -37
  472. package/dist/components/BbTabs/BbTabs.vue.d.ts +3 -1
  473. package/dist/components/BbTabs/BbTabs.vue_vue_type_script_setup_true_lang.js +62 -26
  474. package/dist/components/BbTabs/BbTabsList.vue.d.ts +3 -10
  475. package/dist/components/BbTabs/BbTabsList.vue_vue_type_script_setup_true_lang.js +143 -81
  476. package/dist/components/BbTabs/BbTabsPanels.vue.d.ts +12 -0
  477. package/dist/components/{BbBaseSwitch/BbBaseSwitch.vue.js → BbTabs/BbTabsPanels.vue.js} +2 -2
  478. package/dist/components/BbTabs/BbTabsPanels.vue_vue_type_script_setup_true_lang.js +59 -0
  479. package/dist/components/BbTabs/BbTabsRoot.vue.d.ts +3 -1
  480. package/dist/components/BbTabs/BbTabsRoot.vue_vue_type_script_setup_true_lang.js +2 -1
  481. package/dist/components/BbTabs/types.d.ts +183 -23
  482. package/dist/components/BbTabs/types.js +34 -0
  483. package/dist/components/BbTag/BbTag.vue.d.ts +13 -10
  484. package/dist/components/BbTag/BbTag.vue_vue_type_script_setup_true_lang.js +383 -92
  485. package/dist/components/BbTag/types.d.ts +139 -14
  486. package/dist/components/BbTag/types.js +22 -0
  487. package/dist/components/BbTextInput/BbTextInput.vue.d.ts +10 -8
  488. package/dist/components/BbTextInput/BbTextInput.vue_vue_type_script_setup_true_lang.js +257 -84
  489. package/dist/components/BbTextInput/types.d.ts +168 -13
  490. package/dist/components/BbTextInput/types.js +8 -0
  491. package/dist/components/BbTextarea/BbTextarea.vue.d.ts +7 -7
  492. package/dist/components/BbTextarea/BbTextarea.vue_vue_type_script_setup_true_lang.js +291 -94
  493. package/dist/components/BbTextarea/types.d.ts +158 -14
  494. package/dist/components/BbTextarea/types.js +8 -0
  495. package/dist/components/BbTimePicker/BbTimePicker.vue.d.ts +12 -4
  496. package/dist/components/BbTimePicker/BbTimePicker.vue_vue_type_script_setup_true_lang.js +199 -122
  497. package/dist/components/BbTimePicker/types.d.ts +94 -7
  498. package/dist/components/BbTimePicker/types.js +18 -0
  499. package/dist/components/BbTimePickerInput/BbTimePickerInput.vue.d.ts +14 -4
  500. package/dist/components/BbTimePickerInput/BbTimePickerInput.vue_vue_type_script_setup_true_lang.js +749 -86
  501. package/dist/components/BbTimePickerInput/types.d.ts +171 -22
  502. package/dist/components/BbTimePickerInput/types.js +25 -0
  503. package/dist/components/BbToast/BbToast.vue_vue_type_script_setup_true_lang.js +63 -25
  504. package/dist/components/BbToast/BbToastMessage.vue.d.ts +4 -1
  505. package/dist/components/BbToast/BbToastMessage.vue_vue_type_script_setup_true_lang.js +79 -76
  506. package/dist/components/BbToast/BbToastPortal.vue.d.ts +1 -0
  507. package/dist/components/BbToast/BbToastRegion.vue.d.ts +4 -1
  508. package/dist/components/BbToast/BbToastRegion.vue_vue_type_script_setup_true_lang.js +72 -64
  509. package/dist/components/BbToast/types.d.ts +54 -1
  510. package/dist/components/BbToast/types.js +28 -0
  511. package/dist/components/BbTooltip/BbTooltip.vue_vue_type_script_setup_true_lang.js +104 -87
  512. package/dist/components/BbTooltip/types.d.ts +40 -2
  513. package/dist/components/BbTooltip/types.js +7 -0
  514. package/dist/components/BbTree/BbTree.vue.d.ts +15 -3
  515. package/dist/components/BbTree/BbTree.vue_vue_type_script_setup_true_lang.js +51 -29
  516. package/dist/components/BbTree/BbTreeLevel.vue.d.ts +1 -1
  517. package/dist/components/BbTree/BbTreeLevel.vue_vue_type_script_setup_true_lang.js +17 -16
  518. package/dist/components/BbTree/context.d.ts +9 -1
  519. package/dist/components/BbTree/types.d.ts +40 -5
  520. package/dist/components/BbTree/types.js +7 -0
  521. package/dist/components/ChipsBox/ChipsBox.vue_vue_type_script_setup_true_lang.js +46 -44
  522. package/dist/components/ChipsBox/types.d.ts +7 -0
  523. package/dist/components/ClearableButton/ClearableButton.vue_vue_type_script_setup_true_lang.js +5 -5
  524. package/dist/components/CommaBox/CommaBox.vue_vue_type_script_setup_true_lang.js +11 -7
  525. package/dist/components/CommaBox/types.d.ts +7 -0
  526. package/dist/components/{BbBaseInputContainer/BbBaseInputContainer.vue.d.ts → CommonField/CommonField.vue.d.ts} +5 -5
  527. package/dist/components/{BbBaseRadio/BbBaseRadio.vue.js → CommonField/CommonField.vue.js} +2 -2
  528. package/dist/components/CommonField/CommonField.vue_vue_type_script_setup_true_lang.js +189 -0
  529. package/dist/components/CommonField/messageHeightMatrix.d.ts +2 -0
  530. package/dist/components/{BbBaseInputContainer → CommonField}/types.d.ts +52 -16
  531. package/dist/components/{CommonInputWrapper/CommonInputWrapper.vue.d.ts → CommonFieldInput/CommonFieldInput.vue.d.ts} +5 -4
  532. package/dist/components/{BbBaseRadioGroup/BbBaseRadioGroup.vue.js → CommonFieldInput/CommonFieldInput.vue.js} +2 -2
  533. package/dist/components/CommonFieldInput/CommonFieldInput.vue_vue_type_script_setup_true_lang.js +120 -0
  534. package/dist/components/CommonFieldInput/boxBorderMatrix.d.ts +10 -0
  535. package/dist/components/{CommonInputWrapper → CommonFieldInput}/types.d.ts +27 -8
  536. package/dist/components/CommonPopover/CommonPopover.vue.d.ts +11 -2
  537. package/dist/components/CommonPopover/CommonPopover.vue_vue_type_script_setup_true_lang.js +76 -63
  538. package/dist/components/CommonPopover/types.d.ts +27 -8
  539. package/dist/components/{BbBaseDatePickerInput/BbBaseDatePickerTimeSelector.vue.d.ts → CommonTimeSelector/CommonTimeSelector.vue.d.ts} +21 -2
  540. package/dist/components/{BbBaseColorPalette/BbBaseColorPalette.vue.js → CommonTimeSelector/CommonTimeSelector.vue.js} +2 -2
  541. package/dist/components/CommonTimeSelector/CommonTimeSelector.vue_vue_type_script_setup_true_lang.js +232 -0
  542. package/dist/components/CommonTimeSelector/types.d.ts +6 -0
  543. package/dist/components/FlatListBox/FlatListBox.vue.d.ts +5 -1
  544. package/dist/components/FlatListBox/FlatListBox.vue_vue_type_script_setup_true_lang.js +165 -95
  545. package/dist/components/FlatListBox/types.d.ts +24 -2
  546. package/dist/components/GroupedListBox/GroupedListBox.vue.d.ts +5 -1
  547. package/dist/components/GroupedListBox/GroupedListBox.vue_vue_type_script_setup_true_lang.js +217 -134
  548. package/dist/components/GroupedListBox/types.d.ts +24 -2
  549. package/dist/components/ListBox/ListBox.vue.d.ts +5 -1
  550. package/dist/components/ListBox/ListBox.vue_vue_type_script_setup_true_lang.js +95 -69
  551. package/dist/components/ListBox/types.d.ts +24 -2
  552. package/dist/components/OptionsContainer/OptionsContainer.vue.d.ts +1 -1
  553. package/dist/components/OptionsContainer/OptionsContainer.vue_vue_type_script_setup_true_lang.js +109 -37
  554. package/dist/components/OptionsContainer/types.d.ts +53 -9
  555. package/dist/components/Transitions/ScaleFade.vue_vue_type_script_setup_true_lang.js +8 -8
  556. package/dist/components/Transitions/Slide.vue.js +1 -1
  557. package/dist/composables/useBaseOptions.d.ts +12 -1
  558. package/dist/composables/useBaseOptions.js +77 -37
  559. package/dist/composables/useBbConfig.d.ts +27 -6
  560. package/dist/composables/useBbConfig.js +8 -2
  561. package/dist/composables/useBbDropdownContext.d.ts +5 -0
  562. package/dist/composables/useBbFormContext.d.ts +131 -8
  563. package/dist/composables/useBbFormContext.js +49 -30
  564. package/dist/composables/useBbFormField.d.ts +40 -0
  565. package/dist/composables/useBbFormField.js +39 -0
  566. package/dist/composables/useBbTableContext.d.ts +45 -1
  567. package/dist/composables/useBbTableContext.js +93 -87
  568. package/dist/composables/useBbTabsContext.d.ts +15 -9
  569. package/dist/composables/useBbTabsContext.js +121 -90
  570. package/dist/composables/useClosingInert.d.ts +4 -4
  571. package/dist/composables/useCoarsePointer.js +7 -10
  572. package/dist/composables/useCoherence.js +1 -1
  573. package/dist/composables/useConfig.d.ts +59 -0
  574. package/dist/composables/useConfig.js +15 -0
  575. package/dist/composables/useConfirm.d.ts +39 -7
  576. package/dist/composables/useConfirm.js +50 -41
  577. package/dist/composables/useEscapeStackEntry.d.ts +13 -0
  578. package/dist/composables/useEscapeStackEntry.js +16 -0
  579. package/dist/composables/useFormBinding.d.ts +116 -0
  580. package/dist/composables/useFormBinding.js +34 -0
  581. package/dist/composables/useHydrated.d.ts +18 -0
  582. package/dist/composables/useHydrated.js +13 -7
  583. package/dist/composables/useId.d.ts +4 -3
  584. package/dist/composables/useId.js +1 -7
  585. package/dist/composables/useItemsGetter.d.ts +11 -0
  586. package/dist/composables/useItemsGetter.js +44 -18
  587. package/dist/composables/useKeyboardInset.d.ts +28 -0
  588. package/dist/composables/useKeyboardInset.js +32 -0
  589. package/dist/composables/useLocale.js +10 -7
  590. package/dist/composables/useMobile.js +7 -10
  591. package/dist/composables/usePassthrough.d.ts +228 -0
  592. package/dist/composables/usePassthrough.js +247 -0
  593. package/dist/composables/usePrefill.d.ts +22 -2
  594. package/dist/composables/usePrefill.js +35 -19
  595. package/dist/composables/useSafeAreaInternal.js +1 -1
  596. package/dist/composables/useSegmentedFields.d.ts +2 -2
  597. package/dist/composables/useSsrState.d.ts +20 -0
  598. package/dist/composables/useSsrState.js +13 -0
  599. package/dist/composables/useTableWidthContext.d.ts +24 -4
  600. package/dist/composables/useTableWidthContext.js +31 -28
  601. package/dist/composables/useToast.d.ts +18 -1
  602. package/dist/composables/useToast.js +31 -18
  603. package/dist/composables/useToggleInput.d.ts +44 -0
  604. package/dist/composables/useToggleInput.js +39 -0
  605. package/dist/composables/useViewportWidth.d.ts +5 -25
  606. package/dist/composables/useViewportWidth.js +14 -7
  607. package/dist/deprecation/ai-deprecations.json.d.ts +1977 -289
  608. package/dist/deprecation/ai-deprecations.json.js +1 -1
  609. package/dist/deprecation/removedProps.js +9 -4
  610. package/dist/directives/bbDropdown.d.ts +15 -4
  611. package/dist/directives/bbDropdown.js +31 -9
  612. package/dist/directives/bbTooltip.d.ts +6 -0
  613. package/dist/directives/createPopoverDirective.d.ts +62 -0
  614. package/dist/directives/createPopoverDirective.js +92 -37
  615. package/dist/i18n/index.d.ts +10 -16
  616. package/dist/i18n/locales/cs.json +9 -5
  617. package/dist/i18n/locales/da.json +9 -5
  618. package/dist/i18n/locales/de.json +9 -5
  619. package/dist/i18n/locales/el.json +9 -5
  620. package/dist/i18n/locales/en.json +9 -5
  621. package/dist/i18n/locales/es.json +9 -5
  622. package/dist/i18n/locales/fi.json +9 -5
  623. package/dist/i18n/locales/fr.json +9 -5
  624. package/dist/i18n/locales/hu.json +9 -5
  625. package/dist/i18n/locales/it.json +9 -5
  626. package/dist/i18n/locales/ja.json +9 -5
  627. package/dist/i18n/locales/ko.json +9 -5
  628. package/dist/i18n/locales/nb.json +9 -5
  629. package/dist/i18n/locales/nl.json +9 -5
  630. package/dist/i18n/locales/pl.json +9 -5
  631. package/dist/i18n/locales/pt.json +9 -5
  632. package/dist/i18n/locales/ro.json +9 -5
  633. package/dist/i18n/locales/ru.json +9 -5
  634. package/dist/i18n/locales/sv.json +9 -5
  635. package/dist/i18n/locales/tr.json +9 -5
  636. package/dist/i18n/locales/uk.json +9 -5
  637. package/dist/i18n/locales/zh-cn.json +9 -5
  638. package/dist/icon-scan.d.ts +276 -0
  639. package/dist/icon-scan.js +485 -0
  640. package/dist/icons-whitelist.d.ts +5 -4
  641. package/dist/index.d.ts +40 -21
  642. package/dist/index.js +78 -71
  643. package/dist/llms-full.txt +61164 -27972
  644. package/dist/llms-medium.txt +1482 -366
  645. package/dist/llms.txt +32 -15
  646. package/dist/locale-blueprint.json +9 -5
  647. package/dist/nuxt-auto-imports.d.ts +76 -0
  648. package/dist/nuxt-auto-imports.js +32 -0
  649. package/dist/nuxt-module.d.ts +30 -15
  650. package/dist/nuxt.js +35 -9
  651. package/dist/passthrough-deduper.js +5 -0
  652. package/dist/plugin.d.ts +10 -1
  653. package/dist/plugin.js +29 -19
  654. package/dist/project-dts.d.ts +84 -0
  655. package/dist/project-dts.js +170 -0
  656. package/dist/reset.css +1 -1
  657. package/dist/runtime/nuxt-plugin.js +34 -21
  658. package/dist/styles.css +3 -2
  659. package/dist/types/AlertVariant.d.ts +10 -1
  660. package/dist/types/BadgeVariant.d.ts +16 -5
  661. package/dist/types/ButtonVariant.d.ts +12 -1
  662. package/dist/types/ColumnName.d.ts +30 -3
  663. package/dist/types/CommonProps.d.ts +2 -2
  664. package/dist/types/Config.d.ts +94 -1
  665. package/dist/types/ConfirmVariant.d.ts +8 -1
  666. package/dist/types/DropdownItemVariant.d.ts +8 -1
  667. package/dist/types/FieldLayout.d.ts +32 -0
  668. package/dist/types/IndicatorVariant.d.ts +11 -1
  669. package/dist/types/InputVariant.d.ts +30 -0
  670. package/dist/types/ItemProps.d.ts +50 -0
  671. package/dist/types/Option.d.ts +6 -0
  672. package/dist/types/PtScope.d.ts +15 -0
  673. package/dist/types/RegistryKey.d.ts +10 -0
  674. package/dist/types/TabsVariant.d.ts +25 -0
  675. package/dist/types/ToastVariant.d.ts +12 -2
  676. package/dist/types/TooltipVariant.d.ts +8 -1
  677. package/dist/types/passthrough.d.ts +362 -0
  678. package/dist/types/passthrough.js +78 -0
  679. package/dist/types/ptComponentMap.d.ts +62 -0
  680. package/dist/utilities/functions/hasVnodeListener.d.ts +16 -0
  681. package/dist/utilities/functions/hasVnodeListener.js +12 -0
  682. package/dist/utilities/functions/isImeComposing.d.ts +7 -0
  683. package/dist/utilities/functions/isImeComposing.js +4 -0
  684. package/dist/utilities/functions/itemProps.d.ts +46 -0
  685. package/dist/utilities/functions/itemProps.js +47 -0
  686. package/dist/utilities/functions/slotKey.d.ts +13 -8
  687. package/dist/utilities/functions/slotKey.js +78 -2
  688. package/dist/utilities/functions/snapToStep.js +2 -1
  689. package/dist/utilities/functions/toggleInput.d.ts +98 -0
  690. package/dist/utilities/functions/toggleInput.js +56 -0
  691. package/dist/utilities/functions/warnRemovedAttrs.d.ts +27 -1
  692. package/dist/utilities/functions/warnRemovedAttrs.js +75 -14
  693. package/dist/utilities/misc/listboxMetrics.d.ts +9 -3
  694. package/dist/utilities/misc/listboxMetrics.js +5 -2
  695. package/dist/utilities/misc/ssrStateInjectionKey.d.ts +42 -0
  696. package/dist/utilities/misc/ssrStateInjectionKey.js +4 -0
  697. package/dist/utils/cssLayers.d.ts +91 -0
  698. package/dist/utils/cssLayers.js +43 -0
  699. package/dist/utils/injectLibraryStyles.d.ts +3 -1
  700. package/dist/utils/injectLibraryStyles.js +24 -23
  701. package/dist/utils/overlayEscapeStack.d.ts +10 -0
  702. package/dist/utils/overlayEscapeStack.js +5 -3
  703. package/dist/utils/passthrough.d.ts +67 -0
  704. package/dist/utils/passthrough.js +100 -0
  705. package/dist/utils/passthroughDeduper.d.ts +2 -0
  706. package/dist/utils/ptScope.d.ts +8 -0
  707. package/dist/utils/ptScope.js +4 -0
  708. package/dist/utils/versionCheck.d.ts +19 -0
  709. package/dist/utils/versionCheck.js +18 -0
  710. package/dist/vite-plugin.d.ts +301 -53
  711. package/dist/vite.js +547 -375
  712. package/llms.txt +33 -16
  713. package/package.json +49 -27
  714. package/scripts/lib/check-fix.mjs +129 -0
  715. package/scripts/lib/component-attr-targets.ts +123 -0
  716. package/scripts/lib/component-tree.ts +648 -0
  717. package/scripts/lib/css-class-check.mjs +326 -0
  718. package/scripts/lib/css-class-surface.mjs +292 -0
  719. package/scripts/lib/css-color-resolve.mjs +172 -0
  720. package/scripts/lib/css-local-check.mjs +267 -0
  721. package/scripts/lib/design-token-manifest.mjs +499 -0
  722. package/scripts/lib/doc-sections.mjs +248 -0
  723. package/scripts/lib/ensure-manifest.mjs +28 -5
  724. package/scripts/lib/eslint-disable.mjs +141 -0
  725. package/scripts/lib/eslint-plugin.d.ts +64 -1
  726. package/scripts/lib/eslint-plugin.mjs +1285 -30
  727. package/scripts/lib/hand-imported-styles.mjs +326 -0
  728. package/scripts/lib/hand-roll-hints.mjs +50 -6
  729. package/scripts/lib/html-attributes.mjs +353 -0
  730. package/scripts/lib/local-components.mjs +177 -0
  731. package/scripts/lib/mcp-config.mjs +87 -58
  732. package/scripts/lib/migrate-fix.mjs +62 -3
  733. package/scripts/lib/project-variant-dts.mjs +122 -0
  734. package/scripts/lib/public-type-exports.mjs +273 -0
  735. package/scripts/lib/slot-key.mjs +147 -0
  736. package/scripts/lib/slot-renames.mjs +46 -0
  737. package/scripts/lib/squashed-slot-words.mjs +133 -0
  738. package/scripts/lib/validate-bb-markup.mjs +2213 -76
  739. package/scripts/lib/wrapper-props.mjs +188 -0
  740. package/dist/ai/BbBaseCheckbox.md +0 -49
  741. package/dist/ai/BbBaseCheckboxGroup.md +0 -64
  742. package/dist/ai/BbBaseColorInput.md +0 -65
  743. package/dist/ai/BbBaseColorPalette.md +0 -39
  744. package/dist/ai/BbBaseDatePicker.md +0 -43
  745. package/dist/ai/BbBaseDatePickerInput.md +0 -73
  746. package/dist/ai/BbBaseInputContainer.md +0 -48
  747. package/dist/ai/BbBaseNumberInput.md +0 -71
  748. package/dist/ai/BbBaseRadio.md +0 -46
  749. package/dist/ai/BbBaseRadioGroup.md +0 -64
  750. package/dist/ai/BbBaseRating.md +0 -52
  751. package/dist/ai/BbBaseSelect.md +0 -88
  752. package/dist/ai/BbBaseSlider.md +0 -56
  753. package/dist/ai/BbBaseSwitch.md +0 -49
  754. package/dist/ai/BbBaseSwitchGroup.md +0 -64
  755. package/dist/ai/BbBaseTag.md +0 -68
  756. package/dist/ai/BbBaseTextInput.md +0 -75
  757. package/dist/ai/BbBaseTextarea.md +0 -62
  758. package/dist/ai/BbBaseTimePickerInput.md +0 -62
  759. package/dist/ai/BbTabsPanes.md +0 -27
  760. package/dist/ai/CommonInputWrapper.md +0 -42
  761. package/dist/ai/source/BbBaseCheckbox.md +0 -461
  762. package/dist/ai/source/BbBaseCheckboxGroup.md +0 -554
  763. package/dist/ai/source/BbBaseColorInput.md +0 -431
  764. package/dist/ai/source/BbBaseColorPalette.md +0 -942
  765. package/dist/ai/source/BbBaseDatePicker.md +0 -1448
  766. package/dist/ai/source/BbBaseDatePickerInput.md +0 -1940
  767. package/dist/ai/source/BbBaseNumberInput.md +0 -617
  768. package/dist/ai/source/BbBaseRadio.md +0 -381
  769. package/dist/ai/source/BbBaseRadioGroup.md +0 -539
  770. package/dist/ai/source/BbBaseRating.md +0 -607
  771. package/dist/ai/source/BbBaseSelect.md +0 -945
  772. package/dist/ai/source/BbBaseSlider.md +0 -1144
  773. package/dist/ai/source/BbBaseSwitch.md +0 -246
  774. package/dist/ai/source/BbBaseSwitchGroup.md +0 -302
  775. package/dist/ai/source/BbBaseTag.md +0 -694
  776. package/dist/ai/source/BbBaseTextInput.md +0 -511
  777. package/dist/ai/source/BbBaseTextarea.md +0 -504
  778. package/dist/ai/source/BbBaseTimePickerInput.md +0 -1037
  779. package/dist/ai/source/BbTabsPanes.md +0 -377
  780. package/dist/ai/source/CommonInputWrapper.md +0 -584
  781. package/dist/alert-variants.d.ts +0 -19
  782. package/dist/assets/svgs/sort.svg_raw.js +0 -4
  783. package/dist/badge-variants.d.ts +0 -19
  784. package/dist/button-variants.d.ts +0 -21
  785. package/dist/components/BbBadge/BadgeAppendIcon.vue.d.ts +0 -3
  786. package/dist/components/BbBadge/BadgeAppendIcon.vue.js +0 -5
  787. package/dist/components/BbBadge/BadgeAppendIcon.vue_vue_type_script_setup_true_lang.js +0 -22
  788. package/dist/components/BbBaseCheckbox/BbBaseCheckbox.vue.d.ts +0 -40
  789. package/dist/components/BbBaseCheckbox/BbBaseCheckbox.vue.js +0 -6
  790. package/dist/components/BbBaseCheckbox/BbBaseCheckbox.vue_vue_type_script_setup_true_lang.js +0 -145
  791. package/dist/components/BbBaseCheckbox/types.d.ts +0 -224
  792. package/dist/components/BbBaseCheckboxGroup/BbBaseCheckboxGroup.vue.d.ts +0 -19
  793. package/dist/components/BbBaseCheckboxGroup/BbBaseCheckboxGroup.vue.js +0 -6
  794. package/dist/components/BbBaseCheckboxGroup/BbBaseCheckboxGroup.vue_vue_type_script_setup_true_lang.js +0 -190
  795. package/dist/components/BbBaseCheckboxGroup/types.d.ts +0 -257
  796. package/dist/components/BbBaseColorInput/BbBaseColorInput.vue.d.ts +0 -43
  797. package/dist/components/BbBaseColorInput/BbBaseColorInput.vue.js +0 -6
  798. package/dist/components/BbBaseColorInput/BbBaseColorInput.vue_vue_type_script_setup_true_lang.js +0 -184
  799. package/dist/components/BbBaseColorInput/types.d.ts +0 -219
  800. package/dist/components/BbBaseColorPalette/BbBaseColorPalette.vue.d.ts +0 -13
  801. package/dist/components/BbBaseColorPalette/BbBaseColorPalette.vue_vue_type_script_setup_true_lang.js +0 -395
  802. package/dist/components/BbBaseColorPalette/types.d.ts +0 -40
  803. package/dist/components/BbBaseDatePicker/BbBaseDatePicker.vue.d.ts +0 -20
  804. package/dist/components/BbBaseDatePicker/BbBaseDatePicker.vue.js +0 -6
  805. package/dist/components/BbBaseDatePicker/BbBaseDatePicker.vue_vue_type_script_setup_true_lang.js +0 -407
  806. package/dist/components/BbBaseDatePicker/BbBaseDatePickerInputDaySelector.vue.d.ts +0 -47
  807. package/dist/components/BbBaseDatePicker/BbBaseDatePickerInputDaySelector.vue.js +0 -5
  808. package/dist/components/BbBaseDatePicker/BbBaseDatePickerInputDaySelector.vue_vue_type_script_setup_true_lang.js +0 -318
  809. package/dist/components/BbBaseDatePicker/BbBaseDatePickerMonthSelector.vue.js +0 -5
  810. package/dist/components/BbBaseDatePicker/BbBaseDatePickerMonthSelector.vue_vue_type_script_setup_true_lang.js +0 -115
  811. package/dist/components/BbBaseDatePicker/BbBaseDatePickerYearSelector.vue.js +0 -5
  812. package/dist/components/BbBaseDatePicker/BbBaseDatePickerYearSelector.vue_vue_type_script_setup_true_lang.js +0 -116
  813. package/dist/components/BbBaseDatePicker/types.d.ts +0 -108
  814. package/dist/components/BbBaseDatePicker/useDatePickerContext.js +0 -11
  815. package/dist/components/BbBaseDatePickerInput/BbBaseDatePickerInput.vue.d.ts +0 -31
  816. package/dist/components/BbBaseDatePickerInput/BbBaseDatePickerInput.vue.js +0 -6
  817. package/dist/components/BbBaseDatePickerInput/BbBaseDatePickerInput.vue_vue_type_script_setup_true_lang.js +0 -737
  818. package/dist/components/BbBaseDatePickerInput/BbBaseDatePickerTimeSelector.vue.js +0 -6
  819. package/dist/components/BbBaseDatePickerInput/BbBaseDatePickerTimeSelector.vue_vue_type_script_setup_true_lang.js +0 -204
  820. package/dist/components/BbBaseDatePickerInput/types.d.ts +0 -325
  821. package/dist/components/BbBaseInputContainer/BbBaseInputContainer.vue.js +0 -6
  822. package/dist/components/BbBaseInputContainer/BbBaseInputContainer.vue_vue_type_script_setup_true_lang.js +0 -190
  823. package/dist/components/BbBaseNumberInput/BbBaseNumberInput.vue.d.ts +0 -52
  824. package/dist/components/BbBaseNumberInput/BbBaseNumberInput.vue.js +0 -6
  825. package/dist/components/BbBaseNumberInput/BbBaseNumberInput.vue_vue_type_script_setup_true_lang.js +0 -215
  826. package/dist/components/BbBaseNumberInput/types.d.ts +0 -211
  827. package/dist/components/BbBaseRadio/BbBaseRadio.vue.d.ts +0 -33
  828. package/dist/components/BbBaseRadio/BbBaseRadio.vue_vue_type_script_setup_true_lang.js +0 -113
  829. package/dist/components/BbBaseRadio/types.d.ts +0 -179
  830. package/dist/components/BbBaseRadioGroup/BbBaseRadioGroup.vue.d.ts +0 -19
  831. package/dist/components/BbBaseRadioGroup/BbBaseRadioGroup.vue_vue_type_script_setup_true_lang.js +0 -179
  832. package/dist/components/BbBaseRadioGroup/types.d.ts +0 -223
  833. package/dist/components/BbBaseRating/BbBaseRating.vue.d.ts +0 -38
  834. package/dist/components/BbBaseRating/BbBaseRating.vue.js +0 -6
  835. package/dist/components/BbBaseRating/BbBaseRating.vue_vue_type_script_setup_true_lang.js +0 -192
  836. package/dist/components/BbBaseRating/types.d.ts +0 -176
  837. package/dist/components/BbBaseSelect/BbBaseSelect.vue.d.ts +0 -19
  838. package/dist/components/BbBaseSelect/BbBaseSelect.vue.js +0 -6
  839. package/dist/components/BbBaseSelect/BbBaseSelect.vue_vue_type_script_setup_true_lang.js +0 -311
  840. package/dist/components/BbBaseSelect/types.d.ts +0 -297
  841. package/dist/components/BbBaseSlider/BbBaseSlider.vue.d.ts +0 -35
  842. package/dist/components/BbBaseSlider/BbBaseSlider.vue.js +0 -6
  843. package/dist/components/BbBaseSlider/BbBaseSlider.vue_vue_type_script_setup_true_lang.js +0 -340
  844. package/dist/components/BbBaseSlider/types.d.ts +0 -200
  845. package/dist/components/BbBaseSwitch/BbBaseSwitch.vue.d.ts +0 -35
  846. package/dist/components/BbBaseSwitch/BbBaseSwitch.vue_vue_type_script_setup_true_lang.js +0 -146
  847. package/dist/components/BbBaseSwitch/types.d.ts +0 -10
  848. package/dist/components/BbBaseSwitchGroup/BbBaseSwitchGroup.vue.d.ts +0 -19
  849. package/dist/components/BbBaseSwitchGroup/BbBaseSwitchGroup.vue.js +0 -6
  850. package/dist/components/BbBaseSwitchGroup/BbBaseSwitchGroup.vue_vue_type_script_setup_true_lang.js +0 -190
  851. package/dist/components/BbBaseSwitchGroup/types.d.ts +0 -8
  852. package/dist/components/BbBaseTag/BbBaseTag.vue.d.ts +0 -50
  853. package/dist/components/BbBaseTag/BbBaseTag.vue.js +0 -6
  854. package/dist/components/BbBaseTag/BbBaseTag.vue_vue_type_script_setup_true_lang.js +0 -266
  855. package/dist/components/BbBaseTag/types.d.ts +0 -160
  856. package/dist/components/BbBaseTextInput/BbBaseTextInput.vue.d.ts +0 -45
  857. package/dist/components/BbBaseTextInput/BbBaseTextInput.vue.js +0 -6
  858. package/dist/components/BbBaseTextInput/BbBaseTextInput.vue_vue_type_script_setup_true_lang.js +0 -200
  859. package/dist/components/BbBaseTextInput/types.d.ts +0 -209
  860. package/dist/components/BbBaseTextarea/BbBaseTextarea.vue.d.ts +0 -39
  861. package/dist/components/BbBaseTextarea/BbBaseTextarea.vue.js +0 -6
  862. package/dist/components/BbBaseTextarea/BbBaseTextarea.vue_vue_type_script_setup_true_lang.js +0 -187
  863. package/dist/components/BbBaseTextarea/types.d.ts +0 -170
  864. package/dist/components/BbBaseTimePickerInput/BbBaseTimePickerInput.vue.d.ts +0 -27
  865. package/dist/components/BbBaseTimePickerInput/BbBaseTimePickerInput.vue.js +0 -6
  866. package/dist/components/BbBaseTimePickerInput/BbBaseTimePickerInput.vue_vue_type_script_setup_true_lang.js +0 -519
  867. package/dist/components/BbBaseTimePickerInput/types.d.ts +0 -151
  868. package/dist/components/BbTabs/BbTabsPanes.vue.d.ts +0 -16
  869. package/dist/components/BbTabs/BbTabsPanes.vue.js +0 -6
  870. package/dist/components/BbTabs/BbTabsPanes.vue_vue_type_script_setup_true_lang.js +0 -35
  871. package/dist/components/CommonInputWrapper/CommonInputWrapper.vue.js +0 -6
  872. package/dist/components/CommonInputWrapper/CommonInputWrapper.vue_vue_type_script_setup_true_lang.js +0 -107
  873. package/dist/confirm-variants.d.ts +0 -17
  874. package/dist/dropdown-item-variants.d.ts +0 -17
  875. package/dist/indicator-variants.d.ts +0 -20
  876. package/dist/locale-registry.d.ts +0 -37
  877. package/dist/toast-variants.d.ts +0 -20
  878. package/dist/tooltip-variants.d.ts +0 -17
  879. package/dist/types/InputDirection.d.ts +0 -15
  880. package/dist/validated/BbCheckbox.vue.d.ts +0 -29
  881. package/dist/validated/BbCheckbox.vue.js +0 -5
  882. package/dist/validated/BbCheckbox.vue_vue_type_script_setup_true_lang.js +0 -75
  883. package/dist/validated/BbCheckboxGroup.vue.d.ts +0 -34
  884. package/dist/validated/BbCheckboxGroup.vue.js +0 -5
  885. package/dist/validated/BbCheckboxGroup.vue_vue_type_script_setup_true_lang.js +0 -82
  886. package/dist/validated/BbColorInput.vue.d.ts +0 -37
  887. package/dist/validated/BbColorInput.vue.js +0 -5
  888. package/dist/validated/BbColorInput.vue_vue_type_script_setup_true_lang.js +0 -75
  889. package/dist/validated/BbDatePickerInput.vue.d.ts +0 -41
  890. package/dist/validated/BbDatePickerInput.vue.js +0 -5
  891. package/dist/validated/BbDatePickerInput.vue_vue_type_script_setup_true_lang.js +0 -90
  892. package/dist/validated/BbDropzone.vue.d.ts +0 -24
  893. package/dist/validated/BbDropzone.vue.js +0 -5
  894. package/dist/validated/BbDropzone.vue_vue_type_script_setup_true_lang.js +0 -45
  895. package/dist/validated/BbForm.vue.d.ts +0 -28
  896. package/dist/validated/BbForm.vue_vue_type_script_setup_true_lang.js +0 -42
  897. package/dist/validated/BbNumberInput.vue.d.ts +0 -36
  898. package/dist/validated/BbNumberInput.vue.js +0 -5
  899. package/dist/validated/BbNumberInput.vue_vue_type_script_setup_true_lang.js +0 -72
  900. package/dist/validated/BbRadioGroup.vue.d.ts +0 -34
  901. package/dist/validated/BbRadioGroup.vue.js +0 -5
  902. package/dist/validated/BbRadioGroup.vue_vue_type_script_setup_true_lang.js +0 -78
  903. package/dist/validated/BbRating.vue.d.ts +0 -30
  904. package/dist/validated/BbRating.vue.js +0 -5
  905. package/dist/validated/BbRating.vue_vue_type_script_setup_true_lang.js +0 -63
  906. package/dist/validated/BbSelect.vue.d.ts +0 -46
  907. package/dist/validated/BbSelect.vue.js +0 -5
  908. package/dist/validated/BbSelect.vue_vue_type_script_setup_true_lang.js +0 -109
  909. package/dist/validated/BbSlider.vue.d.ts +0 -36
  910. package/dist/validated/BbSlider.vue.js +0 -5
  911. package/dist/validated/BbSlider.vue_vue_type_script_setup_true_lang.js +0 -69
  912. package/dist/validated/BbSwitch.vue.d.ts +0 -29
  913. package/dist/validated/BbSwitch.vue.js +0 -5
  914. package/dist/validated/BbSwitch.vue_vue_type_script_setup_true_lang.js +0 -75
  915. package/dist/validated/BbSwitchGroup.vue.d.ts +0 -34
  916. package/dist/validated/BbSwitchGroup.vue.js +0 -5
  917. package/dist/validated/BbSwitchGroup.vue_vue_type_script_setup_true_lang.js +0 -82
  918. package/dist/validated/BbTag.vue.d.ts +0 -36
  919. package/dist/validated/BbTag.vue.js +0 -5
  920. package/dist/validated/BbTag.vue_vue_type_script_setup_true_lang.js +0 -72
  921. package/dist/validated/BbTextInput.vue.d.ts +0 -36
  922. package/dist/validated/BbTextInput.vue.js +0 -5
  923. package/dist/validated/BbTextInput.vue_vue_type_script_setup_true_lang.js +0 -72
  924. package/dist/validated/BbTextarea.vue.d.ts +0 -36
  925. package/dist/validated/BbTextarea.vue.js +0 -5
  926. package/dist/validated/BbTextarea.vue_vue_type_script_setup_true_lang.js +0 -70
  927. package/dist/validated/BbTimePickerInput.vue.d.ts +0 -37
  928. package/dist/validated/BbTimePickerInput.vue.js +0 -5
  929. package/dist/validated/BbTimePickerInput.vue_vue_type_script_setup_true_lang.js +0 -81
  930. package/dist/validated/index.d.ts +0 -43
  931. package/dist/validated/useValidatedField.d.ts +0 -93
  932. package/dist/validated/useValidatedField.js +0 -51
  933. package/dist/validated.js +0 -21
  934. /package/dist/components/{BbBaseDatePicker/BbBaseDatePickerMonthSelector.vue.d.ts → BbCalendar/CalendarMonthPanel.vue.d.ts} +0 -0
  935. /package/dist/components/{BbBaseDatePicker/BbBaseDatePickerYearSelector.vue.d.ts → BbCalendar/CalendarYearPanel.vue.d.ts} +0 -0
  936. /package/dist/{components/BbBaseDatePicker/typeahead.d.ts → composables/useTypeahead.d.ts} +0 -0
  937. /package/dist/{components/BbBaseDatePicker/typeahead.js → composables/useTypeahead.js} +0 -0
@@ -39,6 +39,33 @@ explicitly (section 8).
39
39
 
40
40
  ## 0. Upgrade strategy — do it in this order
41
41
 
42
+ > **Already on v3, bumping between prereleases?** This guide is the v2 → v3
43
+ > move; you want the much shorter answer instead:
44
+ >
45
+ > ```bash
46
+ > npx bitboss-ui changelog --since 3.0.0-beta.20 # what BREAKS in the bump
47
+ > ```
48
+ >
49
+ > Then turn that list into **your** files, before you install anything:
50
+ >
51
+ > ```bash
52
+ > npm pack bitboss-ui@3.0.0-beta.21 && tar -xzf bitboss-ui-3.0.0-beta.21.tgz
53
+ > npx bitboss-ui check --manifest package/dist/ai/components.json
54
+ > ```
55
+ >
56
+ > `check` normally judges the INSTALLED version, which can only tell you what
57
+ > an upgrade broke after you took it. `--manifest` points it at the version you
58
+ > are moving to, so the damage is visible first. Agents with the MCP server get
59
+ > the same answer from `list_changes({ since })`.
60
+ >
61
+ > Once installed, `npx bitboss-ui check --fix` applies every registered
62
+ > prop migration (renames, polarity flips, value remaps) to your `.vue` files
63
+ > and reports what still needs a hand.
64
+ >
65
+ > After installing, restart the dev server and delete `node_modules/.vite`
66
+ > (inside the container, under Docker or Sail): a server started before the
67
+ > install keeps serving the old pre-bundled JS next to the new CSS.
68
+
42
69
  1. **Swap the setup** (section 1): install the build plugin and the runtime
43
70
  plugin. Nothing renders correctly until this is done.
44
71
  2. **Move your config** (section 2): everything you passed to
@@ -52,6 +79,13 @@ explicitly (section 8).
52
79
  fail loudly. Fix them component by component with the per-component guides.
53
80
  5. **Audit what the compiler cannot find** (section 8): untyped templates,
54
81
  `v-bind` objects, and behavioral flips are silent. Run the grep playbook.
82
+ **Your stylesheets are the silent half.** `vue-tsc` never reads CSS, so a
83
+ rule targeting a renamed or deleted class simply stops matching — no error,
84
+ no warning, and the page often still looks close enough to pass review. A
85
+ v2-era theme file can carry hundreds of lines that have done nothing since
86
+ the upgrade. Section 5.6 has the rename table and the grep that finds them;
87
+ run it before you conclude a component "has no token for this", because a
88
+ dead override and a missing affordance look identical from the browser.
55
89
  6. **Convert class overrides to variants** (section 7): userland
56
90
  `class="bb-button--outline"`-style overrides keep _working_ but are now the
57
91
  wrong pattern — the variant prop exists, is typed, and is the only form the
@@ -62,8 +96,12 @@ explicitly (section 8).
62
96
  ### What v2 looked like
63
97
 
64
98
  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`.
99
+ manual directive registration. There was no Vite plugin and no `app.use`.
100
+
101
+ Nuxt apps were the exception: they installed a **separate companion package**,
102
+ `@bitboss-dev/bitboss-ui-nuxt`, which wrapped v2 in a Nuxt module. v3 absorbs
103
+ that package — the module now ships inside the library as `bitboss-ui/nuxt`.
104
+ See [Nuxt](#nuxt) below for the option-by-option move.
67
105
 
68
106
  ```ts
69
107
  // v2 main.ts
@@ -173,8 +211,7 @@ nothing else about the plugin changes.
173
211
 
174
212
  ### Nuxt
175
213
 
176
- v2 had no Nuxt story. v3 ships a module that does both halves — do **not**
177
- also call `app.use`:
214
+ v3 ships a module that does both halves — do **not** also call `app.use`:
178
215
 
179
216
  ```ts
180
217
  // v3 nuxt.config.ts
@@ -186,6 +223,57 @@ export default defineNuxtConfig({
186
223
  });
187
224
  ```
188
225
 
226
+ #### Coming from `@bitboss-dev/bitboss-ui-nuxt`
227
+
228
+ That package was the v2 Nuxt story. It is superseded: **uninstall it** and
229
+ delete it from `modules`. Everything it did is now inside `bitboss-ui/nuxt`,
230
+ under the same `bitboss` config key — so the migration is mostly renaming keys,
231
+ not rewriting setup.
232
+
233
+ | `@bitboss-dev/bitboss-ui-nuxt` option | v3 `bitboss-ui/nuxt` |
234
+ | ------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
235
+ | `icons.path` | `iconDir`. Same job, one level up. |
236
+ | `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. |
237
+ | `styles.enabled` | `injectStyles` (still defaults `true`). |
238
+ | `styles.index` | **Gone**, and nothing replaces it — see the ordering note below. |
239
+ | `link.name` | `nuxtLinkName` (still defaults `'NuxtLink'`). |
240
+ | `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. |
241
+ | `components.enabled` | `autoImport` — see below. Note the **default flipped**: v2's module auto-imported components, v3 does not. |
242
+ | `components.validation: true` | `autoImport: { validated: true }`, or explicit imports from `bitboss-ui/validated`. The wrappers moved into the library and gained `BbForm` + `useValidatedField`. |
243
+ | `components.requiredAsterisk` | `requiredAsterisk`, same meaning, one level up. |
244
+ | `composables` | Folded into `autoImport`. `useBroadcastChannelInstance`, `useQueue` and `useWizard` are **not exported by v3** — the module registered names the library no longer has. |
245
+ | `logLevel` | **Gone.** The v3 module has nothing to log at setup; build-plugin diagnostics go through Vite. |
246
+
247
+ **⚠ silent — auto-imports are off by default.** The v2 module registered every
248
+ `Bb*` component with Nuxt, so templates used them with no import line. v3 does
249
+ not: an unmigrated template compiles, and each unresolved `<BbButton>` renders
250
+ as an empty unknown element with no error anywhere. Either add explicit imports,
251
+ or opt back in:
252
+
253
+ ```ts
254
+ // v3 nuxt.config.ts — the closest equivalent of the v2 module's defaults
255
+ export default defineNuxtConfig({
256
+ modules: ['bitboss-ui/nuxt'],
257
+ bitboss: {
258
+ iconDir: './assets/icons',
259
+ autoImport: { validated: true }, // drop `validated` if you had no vee-validate
260
+ },
261
+ });
262
+ ```
263
+
264
+ Set `"vueCompilerOptions": { "checkUnknownComponents": true }` in `tsconfig.json`
265
+ before you start either way — it is what turns that silent empty element into a
266
+ `vue-tsc` error naming the file and line.
267
+
268
+ **Style ordering.** `styles.index` let you splice `bitboss-ui/styles.css`
269
+ anywhere in Nuxt's `css` array. v3 injects the sheet at runtime and always puts
270
+ it **first** in `<head>`, ahead of every other stylesheet — so your own CSS is
271
+ always later and always wins, which is the order `styles.index` was normally
272
+ used to obtain. If you need the opposite (library rules winning over yours),
273
+ raise specificity in your own sheet rather than reordering; if you genuinely
274
+ need the library sheet elsewhere in the cascade, set `injectStyles: false` and
275
+ import `bitboss-ui/styles.css` yourself at the position you want.
276
+
189
277
  ### Inertia
190
278
 
191
279
  Inertia apps configure `bitboss-ui/vite` exactly like plain Vite, install
@@ -210,7 +298,7 @@ Full option reference:
210
298
 
211
299
  In v2 all configuration was runtime and mutable:
212
300
 
213
- ```ts
301
+ ```ts no-check
214
302
  // v2 — anywhere, usually App.vue setup
215
303
  import { useBbConfig } from 'bitboss-ui';
216
304
 
@@ -238,6 +326,23 @@ bitbossUi({
238
326
  useBbConfig().setConfig({ locale: 'en' });
239
327
  ```
240
328
 
329
+ **Under SSR, set the locale where the app is created.** The runtime config is
330
+ held **per Vue app** (3.0.0-beta.15), and SSR builds one app per request, so
331
+ this is per-visitor and correct on the first paint — which is what crawlers
332
+ index and what a JS-disabled reader keeps:
333
+
334
+ ```ts
335
+ const app = createSSRApp(App);
336
+ app.use(bitbossUiPlugin, { locale: localeFor(request) });
337
+ ```
338
+
339
+ `setConfig` still works for runtime switching. During a server render, call it
340
+ from a component's `setup` so it can resolve the current app; from module scope
341
+ there is no app to address, the write lands on the build-time defaults shared
342
+ by the whole process, and it warns in dev. (Before beta.15 the config was a
343
+ single process-global object, so a per-visitor locale was not possible at all —
344
+ if you carried a workaround for that, you can drop it.)
345
+
241
346
  | v2 `setConfig` key | Where it goes in v3 |
242
347
  | --------------------------------------------- | ------------------------------------------------------------------------------ |
243
348
  | `locale` | stays runtime (`setConfig`) — the only survivor |
@@ -287,8 +392,9 @@ two tiers:
287
392
 
288
393
  Dark mode is no longer a parallel token set: `.dark` re-declares only the
289
394
  knobs that change, and derived tokens follow automatically. Delete every
290
- `--x-light`/`--x-dark` override; re-express as `.light { … }` / `.dark { … }`
291
- blocks. Note: overriding a knob on an arbitrary selector does **not**
395
+ `--x-light`/`--x-dark` override; re-express as `.light { … }` / `:root .dark,
396
+ :root.dark { … }` blocks (a bare `.dark` loses to the library's own dark block
397
+ unless you use `cssLayers`: design-tokens.md § Dark mode). Note: overriding a knob on an arbitrary selector does **not**
292
398
  re-derive dependent tokens — re-apply the `.light`/`.dark` block on that
293
399
  scope instead.
294
400
 
@@ -314,19 +420,30 @@ to the rename map and to every grep below — see
314
420
  | `--bb-hint`, `--bb-icon-color`, `--bb-placeholder`, `--bb-prefix-color`, `--bb-muted-color` | `--bb-text-muted` |
315
421
  | `--bb-input-color`, `--bb-input-bg` | `--bb-text`, `--bb-panel` |
316
422
  | `--bb-input-font-size`, `--bb-input-mobile-font-size` | `--bb-input-fs`, `--bb-input-fs-mobile` |
423
+ | `--bb-label-size` | `--bb-label-fs` |
424
+ | `--bb-label-compact-spacing-y` | `--bb-label-spacing-y-compact` |
425
+ | `--bb-input-compact-h`, `--bb-input-compact-py` | `--bb-input-h-compact`, `--bb-input-py-compact` — the `compact` qualifier moved from infix to suffix |
426
+ | `--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
427
  | `--bb-overlay-color` + `--bb-overlay-opacity` | `--bb-overlay` (one color with alpha) |
318
428
  | `--bb-overlay-z-index` | `--bb-z-overlay` |
319
429
  | _(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. |
430
+ | `--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
431
  | `--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
432
  | `--bb-dialog-title-size` | the local `--dialog-title-fs` on `.bb-dialog` / `.bb-offcanvas` (default `calc(var(--bb-fs) + 2px)`) |
323
- | `--bb-dialog-title-weight` | **no knob** — the title is hardcoded `font-weight: 500`. Override with a CSS rule, see below. |
433
+ | `--bb-dialog-title-weight` | `--dialog-title-fw` on `.bb-dialog` / the sheet (default `500`) — `.bb-theme { --dialog-title-fw: 600 }` restores v2. |
324
434
  | `--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
435
 
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.
436
+ **Most `--bb-input-*` and `--bb-label-*` tokens survive — but only these
437
+ exact names:** `--bb-input-h`, `--bb-input-px`, `--bb-input-py`,
438
+ `--bb-input-spacing`, `--bb-input-icon`, `--bb-input-prefix-w`,
439
+ `--bb-label-spacing-x`, `--bb-label-spacing-y`, `--bb-label-weight`,
440
+ `--bb-leading`. Those are still global v3 theme tokens, declared in
441
+ `variables.css` and read across the whole form family — do not delete them
442
+ (several changed default value; the drift table below lists which). Everything
443
+ else in the two families either renamed (`--bb-label-size` → `--bb-label-fs`,
444
+ the compact pair — rows above) or is deleted outright, so a declaration that
445
+ is not in this list and not in the rename map is inert: it looks correct and
446
+ does nothing. §8's retired-token grep catches every deleted name.
330
447
 
331
448
  **When a v2 global becomes a component token, resize only what you use.** That
332
449
  last row is the trap: a v2 global like `--bb-button-icon` had ONE value for
@@ -347,50 +464,64 @@ doctrine in `design-tokens.md` § "Overriding one from a consumer app". And chec
347
464
  first whether the v2 value was a real customisation: if it merely restated v2's
348
465
  default, the migration is to **delete it** and inherit the v3 scale.
349
466
 
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.
467
+ **Asymmetric surface padding.** v3 splits the axes with the local pair
468
+ `--px` / `--py`, declared on both surface roots (`.bb-dialog`,
469
+ `.bb-offcanvas`) and each branching off `var(--bb-panel-p)`. Like every
470
+ unprefixed component token, you override them _on the component's class_,
471
+ never `:root`. v2's `--bb-dialog-px` / `--bb-dialog-py` map onto them
472
+ directly:
355
473
 
356
474
  ```css
357
- /* v2: --bb-dialog-px: 24px; header --bb-dialog-py: 10px; body --bb-dialog-py: 20px */
475
+ /* v2: --bb-dialog-px: 24px; --bb-dialog-py: 10px */
358
476
  .my-dialog {
359
- --bb-panel-p: 24px; /* horizontal + close-button inset */
477
+ --px: 24px; /* horizontal padding + the close button's inline inset */
478
+ --py: 10px; /* vertical padding + the close button's block inset */
360
479
  }
480
+ ```
481
+
482
+ Setting only `--bb-panel-p` still moves both axes together (the pair defaults
483
+ to it, resolved on the component root, so a scoped `--bb-panel-p` override
484
+ keeps working too). Per-**part** asymmetry (header `py: 10px`, body
485
+ `py: 20px`) works by scoping the token to the part class — the padding rules
486
+ resolve it on the part elements and the pair inherits:
487
+
488
+ ```css
361
489
  .my-dialog .bb-dialog__header {
362
- padding-block: 10px 5px;
490
+ --py: 10px; /* header block padding (bottom is py/2); × inset follows */
363
491
  }
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;
492
+ .my-dialog .bb-dialog__content {
493
+ --py: 20px; /* body bottom padding, and its top in the headerless case */
372
494
  }
373
495
  ```
374
496
 
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.
497
+ The body padding lives on `.bb-dialog__content`, the node `pt:content` lands on,
498
+ so `pt:content="[--py:20px]"` or `pt:content="px-8"` does it without a
499
+ stylesheet (until 3.0.0-beta.29 it sat on the inner `__body-content`).
500
+
501
+ Derived spacings scale with it — the header's bottom padding is `py / 2` and
502
+ the close button's block inset tracks the header's `py`. If you need exact
503
+ literals instead of those ratios, a `padding-block` rule on the part class
504
+ still works (use `padding-block`, not the `padding` shorthand, so the
505
+ horizontal half keeps tracking `--px`; the library part selectors are
506
+ at most (0,2,1) specific, so a three-class app selector beats them all).
507
+ `BbOffCanvas` is identical with `.bb-offcanvas__*` and the same `--px` /
508
+ `--py` names.
509
+
510
+ **Scope the pair to the surface, and it stays the surface's.** `--px` is also
511
+ a local on other components (`BbButton`, `BbAlert`, `BbTooltip`,
512
+ `BbSlider`), but each of those re-declares it on its own element (the slider on
513
+ `.bb-slider__body`), so a
514
+ dialog-scoped `--px` never leaks into the buttons or alerts inside the dialog
515
+ — and, symmetrically, never set the pair on `:root` or an arbitrary ancestor:
516
+ the surface roots' own defaults mask it there, and you would be reaching into
517
+ every other `--px`-reading component anyway. (`--pt` remains dead — nothing
518
+ reads it.)
388
519
 
389
520
  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
521
+ (default `--py`) already does it without a padding rule: it drives the gap
522
+ below the body content and the footer's block padding on `.bb-dialog` and
392
523
  `.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`.
524
+ top padding in the headerless case — those still take `--py`.
394
525
 
395
526
  **`--bb-dialog-close` maps to nothing — delete it.** In v2 it was the close
396
527
  **icon** width (`12px`) and the button around it added `8px` of padding, so the
@@ -412,15 +543,9 @@ the box:
412
543
  That selector needs at least three classes to beat the library's
413
544
  `.bb-dialog .bb-dialog__header > .bb-close-button` (0,3,0).
414
545
 
415
- **`--bb-dialog-title-weight` has no v3 home.** The title is `font-weight: 500`,
416
- hardcoded. Restore v2's `600` with a rule that outweighs the library's
417
- `.bb-dialog .bb-dialog__header .bb-dialog__title` (0,3,0):
418
-
419
- ```css
420
- .my-dialog .bb-dialog__header .bb-dialog__title {
421
- font-weight: 600;
422
- }
423
- ```
546
+ **`--bb-dialog-title-weight` → `--dialog-title-fw`** (default `500`, read by the
547
+ dialog and by the phone sheet). Restore v2's `600` with
548
+ `.bb-theme { --dialog-title-fw: 600 }`; no selector into the header is needed.
424
549
 
425
550
  A complete v3 theme is typically two small blocks of ~10 declarations
426
551
  (`--bb-primary`, `--bb-radius`, `--bb-control-h`, `--bb-panel`, `--bb-text`,
@@ -454,15 +579,25 @@ and delete only the declarations that merely restated a **v2** default.
454
579
  **A type that narrowed.** `--bb-ring-opacity` survives by name but v3 registers
455
580
  it with `@property … syntax: '<percentage>'`:
456
581
 
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. |
582
+ | token | v2 form | v3 form | symptom |
583
+ | ------------------- | -------------------------------------------------------- | -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
584
+ | `--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
585
 
461
586
  Nothing reports this — not `vue-tsc`, not the eslint plugin, not
462
587
  `npx bitboss-ui check` (none of them read CSS), and not the browser console:
463
588
  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
- `%`.
589
+ Grep your stylesheets for `--bb-ring-opacity` and check **both directions of
590
+ every hit**:
591
+
592
+ - every **write** must carry a `%` (`0.15` → `15%`), and
593
+ - every **read** must stop multiplying by `100%`. The v2 idiom for consuming
594
+ the unitless form was exactly that —
595
+ `calc(100% - var(--bb-ring-opacity) * 100%)` — and under v3 it multiplies a
596
+ percentage by a percentage, which is invalid in `calc()`. The invalid math
597
+ takes the whole declaration down (typically a `color-mix()` ring), so the
598
+ failure is _worse_ than the write side: a stale write still produces a ring
599
+ at the fallback strength, a stale read produces **no ring at all**, equally
600
+ silently. Delete the `* 100%`.
466
601
 
467
602
  Nine tokens are `@property`-registered in v3 — the eight color knobs
468
603
  (`syntax: '<color>'`) plus `--bb-ring-opacity`. Each rejects values outside its
@@ -485,18 +620,25 @@ theme tokens. In v2 a skin was four locals set on your own modifier class:
485
620
  }
486
621
  ```
487
622
 
488
- v3 reads none of those — the old locals are inert, so a skin ported verbatim
489
- silently reverts to the library defaults. Each variant has its own `--bb-*`
490
- family, declared in `variables.css` and overridable globally or on any scope:
491
-
492
- | v2 local on `.bb-button` | v3 token family (per variant) |
493
- | -------------------------------------------- | ----------------------------------- |
494
- | `--color` (fill) | `--bb-<variant>` |
495
- | `--text-color` | `--bb-<variant>-fg` |
496
- | `--border-color` | `--bb-<variant>-border` |
497
- | `--ring-color` | `--bb-<variant>-ring` |
498
- | _derived_ `mix(--color 90%, black)` on hover | `--bb-<variant>-hover` (explicit) |
499
- | _derived_ `mix(--color 80%, black)` on press | `--bb-<variant>-pressed` (explicit) |
623
+ **Three of those four are inert in v3; `--border-color` is not.** A skin
624
+ ported verbatim therefore half-applies: the fill and the text revert to the
625
+ library defaults while your border keeps painting, which looks like a styling
626
+ bug rather than a dead override. Convert the **whole** rule, or delete it.
627
+
628
+ `.bb-button` reads `--bg`, `--fg`, `--border-color`, `--ring-color`, `--bg-hover`
629
+ and `--bg-pressed` as **per-instance** locals, and each variant's default for
630
+ them comes from a `--bb-<variant>-*` family declared in `variables.css`. So a
631
+ v2 local maps two ways — to the theme token if you want every button to
632
+ follow, or to the paint local if you want this one class to:
633
+
634
+ | v2 local on `.bb-button` | v3 theme token (everywhere) | v3 paint local (this class) |
635
+ | -------------------------------------------- | ----------------------------------- | ---------------------------------------------- |
636
+ | `--color` (fill) | `--bb-<variant>` | `--bg` |
637
+ | `--text-color` | `--bb-<variant>-fg` | `--fg` |
638
+ | `--border-color` | `--bb-<variant>-border` | `--border-color` — ⚠ same name, and it is LIVE |
639
+ | `--ring-color` | `--bb-<variant>-ring` | `--ring-color` |
640
+ | _derived_ `mix(--color 90%, black)` on hover | `--bb-<variant>-hover` (explicit) | `--bg-hover` |
641
+ | _derived_ `mix(--color 80%, black)` on press | `--bb-<variant>-pressed` (explicit) | `--bg-pressed` |
500
642
 
501
643
  `<variant>` is one of `primary`, `secondary`, `outline`, `ghost`,
502
644
  `destructive`, `link`. Note the last two rows: v2 _derived_ hover and pressed
@@ -551,10 +693,12 @@ Built-in sets and the class each name maps to:
551
693
  | `alertVariants` | `outline, primary, destructive, warning` | `bb-alert--<name>` |
552
694
  | `badgeVariants` | `primary, secondary, destructive, outline` | `bb-badge--<name>` |
553
695
  | `indicatorVariants` | `default, success, info, warning, destructive` | `bb-indicator--<name>` |
554
- | `toastVariants` | `default, success, info, warning, destructive` | `bb-toast-message--<name>` |
696
+ | `toastVariants` | `default, success, info, warning, destructive` | `bb-toast__panel--<name>` |
555
697
  | `confirmVariants` | `default, destructive` | `bb-confirm--<name>` |
556
698
  | `dropdownItemVariants` | `default, destructive` | `bb-dropdown__item--variant-<name>` |
557
699
  | `tooltipVariants` | `default, destructive` | `bb-tooltip--<name>` |
700
+ | `inputVariants` | `outline, secondary, ghost` | `bb-field-input--<name>` |
701
+ | `tabsVariants` | `pill, line, none` | `bb-tabs-list--<name>` |
558
702
 
559
703
  ### Picking a v3 name for a v2 `theme` value
560
704
 
@@ -565,9 +709,27 @@ this order:
565
709
  1. **Name is in the table, and your app never styled it** → use the built-in
566
710
  `variant`. This is the only genuinely free conversion.
567
711
  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.
712
+ paints underneath your rules, and **registering the name does not stop it**.
713
+ The registries feed the type-checker only: `alertVariants: ['warning']`
714
+ regenerates the typed union and nothing else — no CSS is generated and none
715
+ is suppressed; the built-in `.bb-alert--warning` skin ships unconditionally
716
+ in `styles.css` and still applies, so every property your CSS does not
717
+ explicitly set shows through as the library's. Decide explicitly: accept
718
+ v3's look and delete your CSS, or keep your look — which requires your rules
719
+ to **win the cascade** over the library's. Every paint variant compiles
720
+ single-class — `.bb-alert--warning`, `.bb-toast__panel--*`,
721
+ `.bb-button--outline`, `.bb-badge--*`, `.bb-indicator--*`,
722
+ `.bb-tooltip--*`, all (0,1,0). A flat `.bb-x--name` therefore ties them and
723
+ wins on order, provided you load your sheet after `styles.css` — which is
724
+ the documented order. Authoring at block+modifier
725
+ (`.bb-alert.bb-alert--warning`) still works and is order-proof, so it is
726
+ the safer habit if your bundler's CSS order is not under your control.
727
+ Size modifiers are NOT single-class (`.bb-button.bb-button--sm`), so a flat
728
+ size override still loses. Or sidestep the collision by renaming to a name
729
+ not in the table, which moves you to case 3, where your CSS genuinely is
730
+ the sole source. Whichever you pick,
731
+ still register the name: that part is required for the type-check either
732
+ way.
571
733
  3. **Name is not in the table** → register it and keep your CSS. **Do not remap
572
734
  onto the "nearest" built-in.** `error → destructive`, `danger →
573
735
  destructive`, `info → primary` all compile, all look plausible in review,
@@ -575,8 +737,12 @@ destructive`, `info → primary` all compile, all look plausible in review,
575
737
  deliberate redesign decision, never as a mechanical migration step.
576
738
  4. **Name was never styled by anyone** → see the next subsection.
577
739
 
578
- Registering is cheap — one array entry per name — and it is the
579
- behaviour-preserving default. Prefer it whenever you are not sure.
740
+ Registering is cheap — one array entry per name — and for a name **not** in
741
+ the table it is the behaviour-preserving default: the library has no rule for
742
+ an unknown name, so your CSS is the sole styling source. For a name that **is**
743
+ in the table, registering buys the type-check and nothing else — behaviour
744
+ preservation there is a cascade question (case 2 above). When unsure, prefer a
745
+ non-colliding name.
580
746
 
581
747
  ### ⚠ silent — a `theme` value that did nothing in v2 may do something in v3
582
748
 
@@ -645,22 +811,23 @@ every occurrence; this section explains each pattern once.
645
811
 
646
812
  ### 5.1 Components renamed, split, or removed
647
813
 
648
- | v2 | v3 | What to do |
649
- | ----------------------------------------------------------------------------- | ------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
650
- | `BbBadge` (floating count/dot anchored to an element) | **`BbIndicator`** | `content` → `text`, `color` → `variant`, `floating` removed. New `max` prop renders `${max}+`. |
651
- | `BbChip` | **removed** — use `BbBadge` | v3 `BbBadge` is the inline pill/token: same `click:clear` event and `clearableLabel`, but `clearable` is now **opt-in** (v2 chips defaulted clearable). |
652
- | — | **`BbBadge`** (repurposed) | The v3 badge is a new component in an old name: inline label with `variant`, `icon`, `loading`, `clearable`. Any v2 `<BbBadge>` you have is an _indicator_ — rename it. |
653
- | `BbTab` | **`BbTabs`** | Component and types renamed (`BbTabProps` → `BbTabsProps`; deprecated type aliases remain, the component name does not). |
654
- | `Base*` internals (`BaseButton`, `BaseDialog`, `BaseCheckbox`, `BaseTag`, …) | **`BbBase*`** | If you imported any base primitive or targeted its BEM block in CSS (`.base-btn` → `.bb-base-button`), rename. `BbBaseButton` is now a supported public export. |
655
- | `BbCheckboxIcon` / `BbRadioIcon` / `BbSwitchIcon` | **`BbBaseCheckboxIcon`** / **`BbBaseRadioIcon`** / **`BbBaseSwitchIcon`** | Rename import + BEM block (`.bb-base-checkbox-container__icon` → `.bb-base-checkbox-icon`; see §5.6). |
656
- | `BbBase*` input controls + `CommonInputWrapper` / `CommonInputOuterContainer` | **no longer exported** — use the full public component | v2 exposed the styled base inputs (`BbBaseTextInput`, `BbBaseSelect`, `BbBaseSwitch`, `BbBaseDatePickerInput`, …) and the input-chrome wrappers because a few full inputs were missing. v3 ships a full public component for every input, so these are internal now. Use `BbTextInput` / `BbSelect` / `BbSwitch` / … ; for a bare/inline control with no label gap, pass **`hideLabel`**. Still exported: `BbBaseButton` and the glyphs (`BbBaseCheckboxIcon` / `BbBaseRadioIcon` / `BbBaseSwitchIcon`).<br><br>**These primitives were also restructured, not just un-exported.** The outer+inner pair merged into one `CommonInputWrapper` (`.common-input-wrapper` / `__inner`), `BbBaseInputContainer` gained an inner `__layout` element that now carries the orientation modifiers, and `__input` became `__control`. Anything anchored to the old DOM — app CSS, test selectors, JS positioning a floating panel off `.bb-base-input-container__input` — fails silently: nothing throws, the element is simply never found. See §5.6.<br><br>**Built a custom control on the chrome?** If your app composed `BaseInputContainer` + `CommonInputOuterContainer` + `CommonInputInnerContainer` around an element the library does not ship (a highlight-overlay textarea, a field with a bespoke floating panel), there is no public v3 component to swap in — those wrappers exist in v3 but are internal. The sanctioned fallback is to **copy** the chrome into your app from the implementation source that ships with the package: `node_modules/bitboss-ui/dist/ai/source/BbBaseInputContainer.md` and `dist/ai/source/CommonInputWrapper.md` carry the complete `.vue` template, `types.ts` and `index.css` for each (89 components have one). Those files are banner-marked "Reference Only - Internal" — that bans _importing_ the internal component, not copying its template and CSS into a component of your own, which is the supported route here. The class names a copied template emits are styled by the public `bitboss-ui/styles.css`, so it inherits library chrome for free. Check first whether v3 already ships what you built — `BbTimePickerInput` and `BbTimePicker` are new in v3. |
657
- | `useWizard` (+ `Step`, `WizardState`, `wizardInjectionKey`) | **removed** | No replacement — it was unused scaffolding. Copy the v2 implementation into your app if you depended on it. |
658
- | `BbIntersection` (+ `BbIntersectionProps` / `BbIntersectionEvents`) | **removed** | No replacement — it wrapped `IntersectionObserver` in ~40 lines and carried no styling. Use `@vueuse/core`'s `useIntersectionObserver`, or copy the v2 component. Full mapping of the `shown`/`hidden`/`intersected` events and the slot props: [components/bb-intersection.md](./components/bb-intersection.md). |
659
- | `useBroadcastChannelInstance` | **removed** | Same reasoning: a typed wrapper over a browser API, no markup, no styling, used by no component here. Cross-tab messaging is app architecture. Use `useBroadcastChannel` from `@vueuse/core` — already in your tree, since this library depends on it. **Two behaviours do not carry over** (handler auto-removal on unmount, and the refcount the v2 docs described but never had): [components/use-broadcast-channel-instance.md](./components/use-broadcast-channel-instance.md). |
660
- | `BbRatio` (+ `BbRatioProps`, `.bb-ratio`) | **removed** | No replacement — it was a one-rule wrapper. Use the `aspect-ratio` CSS property, or copy the v2 component. |
661
- | `useQueue`, `useQuery` | **removed** | Both were public v2 exports and neither has a v3 equivalent; the import fails at build. Copy the v2 implementations out of the 2.1.135 tarball (`dist/composables/useQueue.d.ts`, `useQuery.d.ts`) into your app, or replace them with `@vueuse/core` equivalents. |
662
- | `BbToastMessage` type export | **removed** | Use `BbToastOptions` (the `toast()` options shape). |
663
- | `IconRegistry` / `IconNameFromRegistry` exports | **removed** | Icon names are plain strings now. Local art goes in `iconDir` as `local:<name>`; delete your `IconRegistry` augmentation. |
814
+ | v2 | v3 | What to do |
815
+ | ----------------------------------------------------------------------------- | ------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
816
+ | `BbBadge` (floating count/dot anchored to an element) | **`BbIndicator`** | `content` → `text`, `color` → `variant`, `floating` removed. New `max` prop renders `${max}+`. |
817
+ | `BbChip` | **removed** — use `BbBadge` | v3 `BbBadge` is the inline pill/token: same `click:clear` event and `clearableLabel`, but `clearable` is now **opt-in** (v2 chips defaulted clearable). |
818
+ | — | **`BbBadge`** (repurposed) | The v3 badge is a new component in an old name: inline label with `variant`, `icon`, `loading`, `clearable`. Any v2 `<BbBadge>` you have is an _indicator_ — rename it. |
819
+ | — | **`BbCalendar`** (new) | New in v3, no v2 equivalent: the calendar grid that v2 only had inside the date picker input's popover, now a component of its own that renders **always visible**, in place — no activator, no popover, no `label` / `hint` / `errors` chrome (name it with `aria-label`). Nothing to migrate; reach for it where a v2 app kept a date popover pinned open, or rebuilt a month grid by hand, to fake an inline calendar (a booking step, a dashboard date panel, a range under From / To fields in a filter sheet). A date _field_ stays `BbDatePickerInput`. `BbDatePicker` and `BbDatePickerInput` render this same component, so its grid classes are `.bb-calendar__*` (§8). |
820
+ | `BbTab` | **`BbTabs`** | Component and types renamed (`BbTabProps` → `BbTabsProps`; deprecated type aliases remain, the component name does not). |
821
+ | `Base*` internals (`BaseButton`, `BaseDialog`, `BaseCheckbox`, `BaseTag`, …) | **`BbBase*`** | If you imported any base primitive or targeted its BEM block in CSS (`.base-btn` → `.bb-base-button`), rename. `BbBaseButton` is now a supported public export. |
822
+ | `BbCheckboxIcon` / `BbRadioIcon` / `BbSwitchIcon` | **`BbBaseCheckboxIcon`** / **`BbBaseRadioIcon`** / **`BbBaseSwitchIcon`** | Rename import + BEM block (`.bb-base-checkbox-container__icon` → `.bb-base-checkbox-icon`; see §5.6). |
823
+ | `BbBase*` input controls + `CommonInputWrapper` / `CommonInputOuterContainer` | **no longer exported** — use the full public component | v2 exposed the styled base inputs (`BbBaseTextInput`, `BbBaseSelect`, `BbBaseSwitch`, `BbBaseDatePickerInput`, …) and the input-chrome wrappers because a few full inputs were missing. v3 ships a full public component for every input, and the private field layers are **deleted**, not hidden: there is no `BbBaseTextInput` / `BbBaseSelect` / `BbBaseSwitch` in v3 at all (the flatten, Queue 30). Use `BbTextInput` / `BbSelect` / `BbSwitch` / … ; for a bare/inline control with no label gap, pass **`hideLabel`**. Still exported: `BbBaseButton` and the glyphs (`BbBaseCheckboxIcon` / `BbBaseRadioIcon` / `BbBaseSwitchIcon`).<br><br>**The shared chrome was also restructured, not just un-exported.** The outer+inner pair merged into one `CommonFieldInput` (`.bb-field-input` / `__box`), `CommonField` gained an inner `__layout` element that now carries the orientation modifiers, and `__input` became `__input-wrapper`. Anything anchored to the old DOM — app CSS, test selectors, JS positioning a floating panel off `.bb-base-input-container__input` — fails silently: nothing throws, the element is simply never found. See §5.6.<br><br>**Built a custom control on the chrome?** If your app composed `BbBaseInputContainer` + `CommonInputOuterContainer` + `CommonInputInnerContainer` around an element the library does not ship (a highlight-overlay textarea, a field with a bespoke floating panel), there is no public v3 component to swap in — the chrome is the reference-only `CommonField` / `CommonFieldInput` pair. The sanctioned fallback is to **copy** the chrome into your app from the implementation source that ships with the package: `node_modules/bitboss-ui/dist/ai/source/CommonField.md` and `dist/ai/source/CommonFieldInput.md` carry the complete `.vue` template, `types.ts` and `index.css` for each (72 components have one). Those files are banner-marked "Reference Only - Internal" — that bans _importing_ the internal component, not copying its template and CSS into a component of your own, which is the supported route here. The class names a copied template emits are styled by the public `bitboss-ui/styles.css`, so it inherits library chrome for free. Check first whether v3 already ships what you built — `BbTimePickerInput`, `BbTimePicker` and `BbCalendar` (the calendar grid on its own, always visible) are new in v3. |
824
+ | `useWizard` (+ `Step`, `WizardState`, `wizardInjectionKey`) | **removed** | No replacement — it was unused scaffolding. Copy the v2 implementation into your app if you depended on it. |
825
+ | `BbIntersection` (+ `BbIntersectionProps` / `BbIntersectionEvents`) | **removed** | No replacement — it wrapped `IntersectionObserver` in ~40 lines and carried no styling. Use `@vueuse/core`'s `useIntersectionObserver`, or copy the v2 component. Full mapping of the `shown`/`hidden`/`intersected` events and the slot props: [components/bb-intersection.md](./components/bb-intersection.md). |
826
+ | `useBroadcastChannelInstance` | **removed** | Same reasoning: a typed wrapper over a browser API, no markup, no styling, used by no component here. Cross-tab messaging is app architecture. Use `useBroadcastChannel` from `@vueuse/core` — already in your tree, since this library depends on it. **Two behaviours do not carry over** (handler auto-removal on unmount, and the refcount the v2 docs described but never had): [components/use-broadcast-channel-instance.md](./components/use-broadcast-channel-instance.md). |
827
+ | `BbRatio` (+ `BbRatioProps`, `.bb-ratio`) | **removed** | No replacement — it was a one-rule wrapper. Use the `aspect-ratio` CSS property, or copy the v2 component. |
828
+ | `useQueue`, `useQuery` | **removed** | Both were public v2 exports and neither has a v3 equivalent; the import fails at build. Copy the v2 implementations out of the 2.1.135 tarball (`dist/composables/useQueue.d.ts`, `useQuery.d.ts`) into your app, or replace them with `@vueuse/core` equivalents. |
829
+ | `BbToastMessage` type export | **removed** | Use `BbToastOptions` (the `toast()` options shape). |
830
+ | `IconRegistry` / `IconNameFromRegistry` exports | **removed** | Icon names are plain strings now. Local art goes in `iconDir` as `local:<name>`; delete your `IconRegistry` augmentation. |
664
831
 
665
832
  ### 5.2 The polarity wave: booleans now read as opt-in
666
833
 
@@ -680,35 +847,39 @@ to the new name (`hide-close`).
680
847
  > applies to **`BbAlert`, `BbDialog` and `BbOffCanvas` only**. See §5.4 and the
681
848
  > per-component files. `npx bitboss-ui check` catches both spellings if you slip.
682
849
 
683
- | Component(s) | v2 prop (default) | v3 prop (default) |
684
- | -------------------------------------------------- | --------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
685
- | `BbAlert`, `BbDialog`, `BbOffCanvas` | `showClose` (`true`) | `hideClose` (`false`) — also on `toast()` options, where v2 had `showClose` too and the same inversion applies (`showClose: false` → `hideClose: true`, `showClose: true` → delete). Genuinely **new** on `confirm()` options. |
686
- | `BbTable` | `allowSelectAll` (`true`) | `disableSelectAll` (`false`) |
687
- | `BbTabs` | `animateX` / `animateY` (`true`) | `disableAnimateX` / `disableAnimateY` (`false`) |
688
- | `BbButton` | `autoLoading` (`false`) | `disableAutoLoading` (`false`) — **⚠ silent behavior flip:** async `@click` handlers now show the loading spinner and disable the button automatically. Pass `disable-auto-loading` to keep v2 behavior. |
689
- | `BbDropdownButton` | `autoLoading` (`true`) | `disableAutoLoading` (`false`) |
690
- | `BbDropdownButton` | `disabledWhileLoading` (`true`) | **removed** — always disabled while loading now |
691
- | `BbSlider` | `thumbTranslate` (`true`) | `disableThumbTranslate` (`false`) |
692
- | `BbColorPalette`, `BbSelectPopover` | `flip` (`true`) | `disableFlip` (`false`) |
693
- | `BbSelect`, `BbSelectPopover`, `BbDatePickerInput` | `allowWriting` (`true`, tokens `boolean \| 'not-mobile'`) | `disableWriting` (`false`, tokens `boolean \| 'mobile' \| 'desktop'`) — `allow-writing="not-mobile"` becomes `disable-writing="mobile"` |
694
- | `BbCheckbox`, `BbRadio`, `BbSwitch` | `reverse` (`true`) | `reverse` (`false`, **meaning inverted**) — unset renders identically, but explicit values flip: v2 `:reverse="false"` → v3 `reverse`; v2 `reverse` → delete. **⚠ silent** — see [bb-checkbox.md](./components/bb-checkbox.md). |
695
- | `BbAlert` | `ariaAtomic` (`true`) | **removed** — correct live-region behavior is hardcoded |
696
- | `BbChip` | `clearable` (`true`) | **removed with the component** — `BbBadge.clearable` defaults `false` |
850
+ | Component(s) | v2 prop (default) | v3 prop (default) |
851
+ | ------------------------------------ | --------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
852
+ | `BbAlert`, `BbDialog`, `BbOffCanvas` | `showClose` (`true`) | `hideClose` (`false`) — also on `toast()` options, where v2 had `showClose` too and the same inversion applies (`showClose: false` → `hideClose: true`, `showClose: true` → delete). Genuinely **new** on `confirm()` options. |
853
+ | `BbTable` | `allowSelectAll` (`true`) | `disableSelectAll` (`false`) |
854
+ | `BbTabs` | `animateX` / `animateY` (`true`) | `disableAnimateX` / `disableAnimateY` (`false`) |
855
+ | `BbButton` | `autoLoading` (`false`) | `disableAutoLoading` (`false`) — **⚠ silent behavior flip:** async `@click` handlers now show the loading spinner and disable the button automatically. Pass `disable-auto-loading` to keep v2 behavior. |
856
+ | `BbDropdownButton` | `autoLoading` (`true`) | `disableAutoLoading` (`false`) |
857
+ | `BbDropdownButton` | `disabledWhileLoading` (`true`) | **removed** — always disabled while loading now |
858
+ | `BbSlider` | `thumbTranslate` (`true`) | `disableThumbTranslate` (`false`) |
859
+ | `BbColorPalette`, `BbSelectPopover` | `flip` (`true`) | `disableFlip` (`false`) |
860
+ | `BbSelect`, `BbSelectPopover` | `allowWriting` (`true`, tokens `boolean \| 'not-mobile'`) | `disableWriting` (`'auto'`, tokens `boolean \| 'mobile' \| 'desktop' \| 'auto'`) — `allow-writing="not-mobile"` becomes `disable-writing="mobile"`; unset hides the search field on short array lists (see §6) |
861
+ | `BbDatePickerInput` | `allowWriting` (`true`, tokens `boolean \| 'not-mobile'`) | `disableWriting` (`false`, tokens `boolean \| 'mobile' \| 'desktop'`) — `allow-writing="not-mobile"` becomes `disable-writing="mobile"` |
862
+ | `BbCheckbox`, `BbRadio`, `BbSwitch` | `reverse` (`true`) | `reverse` (`false`, **meaning inverted**) — unset renders identically, but explicit values flip: v2 `:reverse="false"` → v3 `reverse`; v2 `reverse` → delete. **⚠ silent** — see [bb-checkbox.md](./components/bb-checkbox.md). |
863
+ | `BbAlert` | `ariaAtomic` (`true`) | **removed** — correct live-region behavior is hardcoded |
864
+ | `BbChip` | `clearable` (`true`) | **removed with the component** — `BbBadge.clearable` defaults `false` |
697
865
 
698
866
  ### 5.3 Straight renames
699
867
 
700
- | Component | v2 | v3 |
701
- | -------------------------------------------------- | --------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
702
- | `BbPagination`, `BbTabs` | `querykey` | `queryKey` — **⚠ silent**: a leftover `querykey` falls through to the DOM and the component uses the default key (`'page'` / `'tab'`), quietly moving your URL params. |
703
- | `BbTooltip` | `timeout` | `delay` |
704
- | `toast()`, `confirm()` options | `timeout` | `duration` — same meaning (ms before auto-dismiss). `toast()` throws on `duration <= 0`; on `confirm()` it resolves the promise `false` quietly and implies `autoClose: true`. |
705
- | `useToast()` | `dismissAll()` | `dismiss()` with **no argument**. The v3 return shape is `{ toast, dismiss, update }`. |
706
- | `BbIcon` | `type` (required) | `icon` |
707
- | `BbColorPalette`, `BbColorInput` | `picker` | `eyeDropper` |
708
- | `BbCheckboxGroup`, `BbRadioGroup`, `BbSwitchGroup` | `labelPosition` | `legendPosition` |
709
- | `BbSelect` | `prefill: 'focus'` | `prefill: 'interaction'` (value rename; same default) |
710
- | `BbToast` (host) | `placement` (e.g. `bottom-start`) | `position` (corner set: `top-left` … `bottom-right`) |
711
- | `BbAlert`, `BbTooltip`, `toast()`, `confirm()` | `theme` | `variant` (typed — see section 4). On `confirm()` the v2 type was a free-form `theme?: string`; v3's is `ConfirmVariantType` (`default`, `destructive`). |
868
+ | Component | v2 | v3 |
869
+ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
870
+ | `BbPagination`, `BbTabs` | `querykey` | `queryKey` — **⚠ silent**: a leftover `querykey` falls through to the DOM and the component uses the default key (`'page'` / `'tab'`), quietly moving your URL params. |
871
+ | `BbTooltip` | `timeout` | `delay` |
872
+ | `toast()`, `confirm()` options | `timeout` | `duration` — same meaning (ms before auto-dismiss). `toast()` throws on `duration <= 0`; on `confirm()` it resolves the promise `false` quietly and implies `autoClose: true`. |
873
+ | `useToast()` | `dismissAll()` | `dismiss()` with **no argument**. The v3 return shape is `{ toast, dismiss, update }`. |
874
+ | `BbIcon` | `type` (required) | `icon` |
875
+ | `BbColorPalette`, `BbColorInput` | `picker` | `eyeDropper` |
876
+ | `BbCheckboxGroup`, `BbRadioGroup`, `BbSwitchGroup` | `labelPosition` | `legendPosition` |
877
+ | Every form control — `BbTextInput`, `BbTextarea`, `BbNumberInput`, `BbColorInput`, `BbSelect`, `BbDatePickerInput`, `BbTimePickerInput`, `BbTag`, `BbCheckbox`, `BbRadio`, `BbSwitch`, `BbCheckboxGroup`, `BbRadioGroup`, `BbSwitchGroup`, `BbRating`, `BbSlider` | `direction` | `layout` — same values (`'auto'`, `'horizontal'`, `'vertical'`, a `'xx xxxxxx'` ratio), plus `'label-fill'` (the label takes the free space, the input keeps its size — with `reverse`, the settings row) and `'input-fill'`. **⚠ silent**: a leftover `direction` falls through to the root as an HTML attribute and the field keeps its default layout. The ESLint plugin's `--fix` renames it. |
878
+ | `BbCheckboxGroup`, `BbRadioGroup`, `BbSwitchGroup` | `inputDirection` | `listLayout` — `'horizontal'` (default) / `'vertical'` / `'vertical-stretch'` / `'tiles'`. **⚠ silent**: v2 `'vertical'` rows spanned the list; v3 `'vertical'` rows keep their own width, and `'vertical-stretch'` is the v2 look — the ESLint plugin's `--fix` maps a static `'vertical'` to `'vertical-stretch'`, a bound value is only renamed. New beside it: `itemLayout` (each row's input against its label, the `layout` keywords) and `itemReverse`. |
879
+ | `BbSelect` | `prefill: 'focus'` | `prefill: 'interaction'` (value rename; same default) |
880
+ | `BbToast` (host) | `placement` (e.g. `bottom-start`) | `position` (corner set: `top-left` … `bottom-right`) |
881
+ | `BbAlert`, `BbTooltip`, `toast()`, `confirm()` | `theme` | `variant` (typed — see section 4). On `confirm()` the v2 type was a free-form `theme?: string`; v3's is `ConfirmVariantType` (`default`, `destructive`). |
882
+ | Every form control with a warning state — `BbTextInput`, `BbTextarea`, `BbNumberInput`, `BbColorInput`, `BbSelect`, `BbSelectPopover`, `BbDatePickerInput`, `BbTimePickerInput`, `BbTag`, `BbCheckbox`, `BbRadio`, `BbSwitch`, `BbCheckboxGroup`, `BbRadioGroup`, `BbSwitchGroup`, `BbRating`, `BbSlider`, `BbDropzone` — and the `BbBaseCheckboxIcon` / `BbBaseRadioIcon` / `BbBaseSwitchIcon` glyphs | `hasWarning` _(v3 ≤ beta.24; not in v2)_ | `hasWarnings` — plural, matching `hasErrors` and the `warnings` prop. **⚠ silent**: a leftover `has-warning` falls through to the root as an HTML attribute and the warning chrome never shows. The ESLint plugin's `--fix` renames it. Slot props that carried it (`#input`, `#label`) are renamed the same way. |
712
883
 
713
884
  ### 5.4 Removed props (no replacement needed — behavior became default or moved)
714
885
 
@@ -719,15 +890,15 @@ to the new name (`hide-close`).
719
890
  - **`color` everywhere**: gone from `BbAvatar`, `BbIcon`, `BbSpinner`,
720
891
  `BbCheckbox`, `BbRadio`, `BbSwitch`, `BbSlider`, `BbRating` and all three
721
892
  groups. Components inherit `currentColor` / theme tokens; style via CSS or
722
- the token knobs. `BbAvatar`'s knobs are named: set **both** `--bg-color` and
723
- `--text-color` on `.bb-avatar` (plus `--default-icon-color` for the built-in
724
- icon fallback) — setting only the background leaves the initials painted
725
- `--bb-primary-fg` on top of it.
893
+ the token knobs. `BbAvatar`'s knobs are named: set **both** `--bg` and
894
+ `--fg` on `.bb-avatar` — setting only the background leaves the initials
895
+ painted `--bb-primary-fg` on top of it. The built-in person glyph mixes
896
+ `--fg` over `--bg`; there is no third local.
726
897
 
727
898
  ```css
728
899
  .team-avatar .bb-avatar {
729
- --bg-color: #7c3aed;
730
- --text-color: #fff;
900
+ --bg: #7c3aed;
901
+ --fg: #fff;
731
902
  }
732
903
  ```
733
904
 
@@ -744,6 +915,19 @@ to the new name (`hide-close`).
744
915
  emission (reading accepts both forms either way). Details in the
745
916
  [component page](./components/bb-date-picker-input.md).
746
917
  - **`BbTag`**: `multiple` removed (always an array input).
918
+ - **`vid` on every validated field** (`bitboss-ui/validated`, 3.0.0-beta.41)
919
+ is gone, and what replaces it depends on what YOU used it for, so read the
920
+ value. **From v2**, `vid` was the field's name in messages (almost always
921
+ a display name like `vid="Email address"`): write
922
+ `validation-label="Email address"`. **From a 3.0 beta**, `vid` was the
923
+ field's path (`vid="email"`, `vid="address.city"`): write `name` with the
924
+ same value; brackets work too (`name="address[city]"`), and are what a
925
+ native form post needs (PHP turns dots in a posted name into `_`).
926
+ `npx bitboss-ui check --fix` does this by value: words (a space or a
927
+ capital) → `validation-label`, a key (lowercase, digits, `_`, `-`, dots,
928
+ brackets) → `name`; anything else it reports with both options. **⚠
929
+ silent**: a leftover `vid` renders as an HTML attribute and the field falls
930
+ back to its label-derived path. See § 6 item 18 for what `name` now does.
747
931
  - **Built-in tooltip on `BbButton`** (`tooltip`, `tooltipPlacement`,
748
932
  `tooltipTimeout`): use the `v-bb-tooltip` directive or wrap in `BbTooltip`.
749
933
  - **Arrow props on non-tooltip surfaces**: `hideArrow`
@@ -753,16 +937,16 @@ to the new name (`hide-close`).
753
937
  warns.
754
938
  - **`BbPopover`**: `showClose`, `closeLabel`, `restoreFocus`, `block` removed —
755
939
  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.
940
+ - **`BbDialog`**: `hideHeader`, `compact`, `overlayClasses`, `panelClasses`
941
+ removed (use the `header` slot and normal classes). The `#close` **slot** is
942
+ gone too — v3's slot set is `header | title | description | default | footer`,
943
+ and a custom close control goes inside `#header`, which replaces the whole
944
+ default header including the ✕ (so `hide-close` is not needed alongside it).
945
+ **`description` and `#description` survive**: they were dropped in early v3
946
+ and restored in 3.0.0-beta.19, unchanged from v2 and with `aria-describedby`
947
+ wired again.
948
+ - **`BbOffCanvas`**: the same — `#close` removed, `description` /
949
+ `#description` kept (restored in 3.0.0-beta.19).
766
950
  - **`BbBreadcrumbs`**: string `divider` removed (slot-driven now);
767
951
  `dividerWidth` default changed `5` → `16`.
768
952
  - **`BbPagination`**: `loading` removed.
@@ -796,8 +980,11 @@ to the new name (`hide-close`).
796
980
  the items you pass instead.
797
981
  - **Models**: `BbTag.modelValue` is `string[]`; `BbDropzone.modelValue` is
798
982
  `File | File[] | null`; `BbSlider.modelValue` drops its `string` member.
799
- - **`direction`** on inputs: the exported `InputDirection` union — keyword
800
- typos now fail to compile; two-word ratio strings (`'1 2'`) still work.
983
+ - **`layout`** (v2 `direction`) on inputs: the exported `FieldLayout` union —
984
+ keyword typos now fail to compile; two-word ratio strings (`'x xx'`) still
985
+ work. The v3 prereleases up to beta.32 exported this union as
986
+ `InputDirection`; that type export is gone — import `FieldLayout` (for
987
+ `layout` / `itemLayout`) or `ListLayout` (for `listLayout`) instead.
801
988
 
802
989
  ### 5.5b Fields added to public object types
803
990
 
@@ -832,27 +1019,123 @@ short.
832
1019
 
833
1020
  ### 5.6 Renamed CSS blocks
834
1021
 
1022
+ > **On a 3.0 beta already?** Use [the beta class guide](./v3-beta-css-classes.md)
1023
+ > instead: it lists every class 3.0.0-beta.36 renamed so each `pt` part has a
1024
+ > class of the same name, and has a find-and-replace script.
1025
+
1026
+ **v2 classes that kept their name until 3.0.0-beta.36.** These went through
1027
+ the first v3 betas unchanged, then were renamed with the rest of the class
1028
+ surface. A v2 app uses the right-hand name directly. The
1029
+ [beta class guide](./v3-beta-css-classes.md#every-renamed-class) explains
1030
+ each one.
1031
+
1032
+ <!-- generated:v2rows -->
1033
+
1034
+ | v2 (and 3.0 ≤ beta.35) | v3 |
1035
+ | ----------------------------------- | ------------------------------- |
1036
+ | `.bb-chipsbox-item` | `.bb-tag__badge` |
1037
+ | `.bb-commabox-item` | `.bb-tag__comma` |
1038
+ | `.bb-select-popover__search-input` | `.bb-select-popover__input` |
1039
+ | `.bb-button__content` | `.bb-button__text` |
1040
+ | `.bb-dropdown__items-container` | `.bb-dropdown__list` |
1041
+ | `.bb-pagination__page-chevron` | `.bb-pagination__icon` |
1042
+ | `.bb-tooltip__content` | `.bb-tooltip__panel` |
1043
+ | `.bb-table-caption` | `.bb-table__caption` |
1044
+ | `.bb-table-header-row` | `.bb-table__header-row` |
1045
+ | `.bb-table-header` | `.bb-table__cell-column-header` |
1046
+ | `.bb-table-data__row` | `.bb-table__row` |
1047
+ | `.bb-table-data__cell` | `.bb-table__cell` |
1048
+ | `.bb-toast-message` | `.bb-toast__panel` |
1049
+ | `.bb-toast-message__icon` | `.bb-toast__icon` |
1050
+ | `.bb-toast-message__content` | `.bb-toast__content` |
1051
+ | `.bb-toast-message__title` | `.bb-toast__title` |
1052
+ | `.bb-toast-message__text` | `.bb-toast__text` |
1053
+ | `.bb-toast-message__close` | `.bb-toast__close` |
1054
+ | `.bb-offcanvas__body` | `.bb-offcanvas__content` |
1055
+ | `.bb-color-palette__popover` | `.bb-color-palette` |
1056
+ | `.bb-commabox-item--focused` | `.bb-tag__comma--highlighted` |
1057
+ | `.bb-dropdown-button__main-btn` | `.bb-dropdown-button__main` |
1058
+ | `.bb-dropdown-button__dropdown-btn` | `.bb-dropdown-button__toggle` |
1059
+
1060
+ <!-- /generated:v2rows -->
1061
+
835
1062
  If app CSS or test selectors target library internals, these blocks moved. This
836
1063
  is the complete set — a class-by-class diff of the v2 stylesheet against v3
837
1064
  leaves nothing else orphaned. All of it is **silent**: a selector on a class
838
1065
  nobody emits matches nothing and throws nothing.
839
1066
 
1067
+ One caution when auditing on your own: absence from `styles.css` answers _"is
1068
+ it styled"_, not _"is it emitted"_. Some classes carry no library rule but are
1069
+ still rendered as styling hooks for you (`.bb-field__hint`
1070
+ is one: its wrapper `__hint-wrap` carries the rules, the inner text node is
1071
+ bare) — those are correct targets and correctly
1072
+ absent from this table, which maps only classes that moved or died. Before
1073
+ filing a class as removed, check the component's markup, not just the
1074
+ stylesheet.
1075
+
840
1076
  **Input chrome**
841
1077
 
842
- | v2 | v3 |
843
- | --------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
844
- | `.bb-common-input-inner-container` (+ `--clearable`, `__prefix`, `__suffix`, `__prepend-icon`, `__append-icon`) | `.common-input-wrapper` (+ the same suffixes) — modifiers `--active --compact --disabled --errors --loading --readonly --clearable --warnings` (note: no `bb-` prefix) |
845
- | `.bb-common-input-outer-container` | merged away — the v2 outer/inner pair is one `.common-input-wrapper`, whose inner span is `.common-input-wrapper__inner` |
846
- | `.bb-base-input-outer-container` (+ `--compact`) | merged into `.bb-base-input-container` (+ `--compact`) |
847
- | `.bb-base-input-container__input` (+ `--left --center --right`) | `.bb-base-input-container__control` (+ the same modifiers) |
848
- | `.bb-base-input-container--horizontal` / `--vertical` / `--reverse` (on the root) | `.bb-base-input-container__layout--horizontal` / `--vertical` / `--reverse` — v3 inserts an inner `__layout` element and the orientation modifiers moved onto it; the root keeps only state modifiers (`--disabled --errors --warnings --loading --readonly --compact --floating-label --inside-label` …) |
849
- | `.bb-base-input-container--label-mode-floating` | `.bb-base-input-container--floating-label` |
850
- | `.bb-base-input-container__errors-outer` | `.bb-base-input-container__errors-wrap` |
851
- | `.bb-base-input-container__hint-container` | `.bb-base-input-container__hint-wrap` |
852
- | `.base-btn`, `.base-btn--block`, … | `.bb-base-button*` |
853
- | `.bb-base-checkbox-container` / `.bb-base-radio-container` / `.bb-base-switch-container` | `.bb-base-checkbox` / `.bb-base-radio` / `.bb-base-switch` (the `--disabled` modifier survives) |
854
- | `.bb-base-checkbox-container__icon` / `.bb-base-radio-container__icon` / `.bb-base-switch-container__icon` (+ `__icon-thumb`) | `.bb-base-checkbox-icon` / `.bb-base-radio-icon` / `.bb-base-switch-icon` (+ `.bb-base-switch-icon__thumb`) |
855
- | `.bb-cr-container*` — the shared checkbox/radio/switch group tree (root, `--vertical`, `__container`, `-option`, `-option__text`) | split into per-control blocks: `.bb-base-checkbox-group*` / `.bb-base-radio-group*` / `.bb-base-switch-group*`, same suffixes (`--warnings`, `__loading-container`, `__no-data-container`, `-option--selected` are new). **`BbRating` no longer shares the block** — use `.bb-base-rating__inner-container` / `.bb-base-rating__option`. |
1078
+ | v2 | v3 |
1079
+ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
1080
+ | `.bb-common-input-inner-container` (+ `--clearable`, `__prefix`, `__suffix`, `__prepend-icon`, `__append-icon`) | `.bb-field-input` (+ the same suffixes) — modifiers `--active --compact --disabled --errors --loading --readonly --clearable --warnings` |
1081
+ | `.bb-common-input-outer-container` | merged away — the v2 outer/inner pair is one `.bb-field-input`, whose inner span is `.bb-field-input__box` |
1082
+ | `.bb-base-input-container` (the field frame: root, `__label`, `__label-text`, `__description`, `__control`, `__hint-*`, `__error*`, `__warning*` and every `--` state modifier) | `.bb-field` (+ the same suffixes), renamed in the v3 flatten (Queue 30), **except `__control`, which is now `__input-wrapper`** (Queue 45; no `bb-field__control` is emitted) |
1083
+ | `.bb-base-input-outer-container` (+ `--compact`) | merged into `.bb-field` (+ `--compact`) |
1084
+ | `.bb-base-input-container__input` (+ `--left --center --right`) | `.bb-field__input-wrapper` (+ the same modifiers) |
1085
+ | `.bb-base-input-container--horizontal` / `--vertical` / `--reverse` (on the root) | `.bb-field__layout--horizontal` / `--vertical` / `--reverse`, plus one `--<layout>` keyword modifier (`--auto --ratio --label-fill --input-fill`; `--horizontal` names every side-by-side layout) — v3 inserts an inner `__layout` element and the orientation modifiers moved onto it; the root keeps only state modifiers (`--disabled --errors --warnings --loading --readonly --compact --floating-label --inside-label` …) |
1086
+ | `.bb-base-input-container--label-mode-floating` | `.bb-field--floating-label` |
1087
+ | `.bb-base-input-container__errors-outer` | `.bb-field__errors-wrap` |
1088
+ | `.bb-base-input-container__hint-container` | `.bb-field__hint-wrap` |
1089
+ | `.base-btn`, `.base-btn--block`, … | `.bb-base-button*` |
1090
+ | `.bb-base-checkbox-container` / `.bb-base-radio-container` / `.bb-base-switch-container` | removed — the v3 flatten folds the toggle's wrapper away; style the glyph `.bb-base-checkbox-icon` / `.bb-base-radio-icon` / `.bb-base-switch-icon` and its `--*` modifiers (or `pt:icon:<state>`) |
1091
+ | `.bb-base-checkbox-container__icon` / `.bb-base-radio-container__icon` / `.bb-base-switch-container__icon` (+ `__icon-thumb`) | `.bb-base-checkbox-icon` / `.bb-base-radio-icon` / `.bb-base-switch-icon` (+ `.bb-base-switch-icon__thumb`) |
1092
+ | `.bb-cr-container*` — the shared checkbox/radio/switch group tree (root, `--vertical`, `__container`, `-option`, `-option__text`) | split into per-control blocks: root `.bb-{checkbox,radio,switch}-group__list` (+ `--horizontal --vertical --vertical-stretch --tiles --errors --warnings`, one per `list-layout`), `__loading` / `__empty` (`__container` merged into `__list`, which is the `pt:list` node), rows `.bb-…-group-item` (+ `__label`, the v2 `__text`; `--selected --description --focused --focus-visible --disabled`, one `--<item-layout>` and `--reverse`; `__description` is new; the glyph is itself the row's input cell, with no wrapper, styled with `pt:icon` — `--disabled` is emitted and unstyled, a hook). **⚠ silent**: v2 `--vertical` rows spanned the list; v3 `list-layout="vertical"` rows keep their own width — `vertical-stretch` is the v2 look. **`BbRating` no longer shares the block** — use `.bb-rating__options` / `.bb-rating__item`. |
1093
+
1094
+ **Form controls — the field layers folded into each component**
1095
+
1096
+ Each control's private base layer is folded into the public component
1097
+ (v3 flatten, Queue 30): its classes take the public block, and the box row
1098
+ it used to put its own name on is the shared `.bb-field-input`. Rows are
1099
+ added per control; a control not listed kept its v2 classes.
1100
+
1101
+ | v2 | v3 |
1102
+ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
1103
+ | `.bb-base-text-input` (on the box row, + `--compact --disabled --errors --has-value --loading --readonly`) | removed — target `.bb-text-input .bb-field-input` and its `--compact --disabled --errors --loading --readonly` modifiers; `hasValue` is `.bb-field--has-value` on the root |
1104
+ | `.bb-base-text-input__input` | `.bb-text-input__input` |
1105
+ | `.bb-base-select` (on the box row, + `--shown --disabled --readonly`) | `.bb-select__field` (+ the same modifiers); v2's `--errors --loading --compact` are the box row's `.bb-field-input--*` modifiers |
1106
+ | `.bb-base-select__max-reached` | `.bb-select__max-reached` |
1107
+ | `.bb-base-select__activator`, `__value`, `__chips-row`, `__chip`, `__placeholder` | `.bb-select__activator`, `__value`, `__chips-row`, `__chip`, `__placeholder` — same suffixes on the public block |
1108
+ | `.bb-base-rating` (+ `--disabled --errors --has-value --readonly`) | `.bb-rating__stars` (+ the same modifiers; `--warnings`, `--forced-clear` are new) — the `--size` / `--space` tokens are declared here |
1109
+ | `.bb-base-rating__inner-container` | `.bb-rating__options` |
1110
+ | `.bb-base-rating__option`, `.bb-base-rating__label-text` | `.bb-rating__item`, `.bb-rating__label-text` (`--highlighted` → `--filled` / `--empty`, see components/bb-rating.md) |
1111
+ | `.bb-base-slider` (+ `--disabled --errors --readonly`) | `.bb-slider__body` (+ the same modifiers; `--compact`, `--warnings` are new) — the slider tokens (`--thumb`, `--track`, `--accent`, and the box's field look locals `--bg`, `--bw`, `--border-color`, `--border-focus`, `--elev`, `--ring-size`, `--px`, `--py`; `--shell-*` up to beta.33) are declared here |
1112
+ | `.bb-base-slider__slider-container`, `__ticks-container`, `__tick`, `__track-container`, `__track-fill`, `__track-background`, `__thumb-container`, `__thumb` (+ `--lower --higher --focused`) | `.bb-slider__box` (was `__slider-container`), `__ticks` (was `__ticks-container`), `__tick` (+ new `--in-range`), `__track` (the rail itself: was `__track-container` + the grey `__track-fill`, now one node), `__bar` (the coloured bar, was `__track-background`; BbProgress's word), `__thumb-container`, `__thumb` (+ the same modifiers). Prefer the `pt` parts of the same names: `box`, `track`, `bar`, `ticks`, `tick`, `thumb` |
1113
+ | `.bb-base-textarea` (on the box row, + `--disabled --errors --loading --readonly`) | `.bb-textarea__field` (the box row; tokens `--min-height --inner-h --floating-py`) — state modifiers are `.bb-field-input--disabled --errors --loading --readonly` on the same node |
1114
+ | `.bb-base-textarea--auto-grow` | `.bb-textarea__field--auto-grow` |
1115
+ | `.bb-base-textarea__input` | `.bb-textarea__input` |
1116
+ | `.bb-base-number-input` (on the box row, + `--compact --disabled --errors --loading --readonly`) | removed — target `.bb-number-input .bb-field-input` and its `--compact --disabled --errors --loading --readonly` modifiers |
1117
+ | `.bb-base-number-input__input` | `.bb-number-input__input` |
1118
+ | `.bb-base-tag` (on the box row, + `--disabled --errors --loading --readonly`) | `.bb-tag__field` (the box row) — state modifiers are `.bb-field-input--disabled --errors --loading --readonly` on the same node |
1119
+ | `.bb-base-tag--active` / `--compact` | `.bb-tag__field--active` / `.bb-tag__field--compact` |
1120
+ | `.bb-base-tag__input-container` / `__text-input` | `.bb-tag__input-container` / `.bb-tag__input` |
1121
+ | `.bb-base-tag__selected--focused` | removed (had no rules in v2) — the highlighted chip is `.bb-tag__badge.bb-badge--highlighted`, the comma item `.bb-tag__comma--highlighted` (prefer `pt:badge:highlighted` / `pt:comma:highlighted`) |
1122
+ | `.bb-base-color-input` (on the box row, + `--active --compact --disabled --errors --loading --readonly`) | `.bb-color-input__field`; the modifiers are the box row's `.bb-field-input--compact --disabled --errors --loading --readonly`; `--active` (palette open) has no class — the indicator carries `aria-expanded="true"` |
1123
+ | `.bb-base-color-input__input` / `__indicator` | `.bb-color-input__input` / `.bb-color-input__indicator` |
1124
+ | `.bb-base-date-picker-input` (on the box row, + `--active --compact --disabled --errors --loading --readonly --range`) | `.bb-date-picker-input__field` (+ `--range`); v2's `--active --compact --disabled --errors --loading --readonly` are the box row's `.bb-field-input--*` modifiers |
1125
+ | `.bb-base-date-picker-input__accessible-description` | `.bb-date-picker-input__accessible-description` |
1126
+ | `.bb-base-time-picker-input` (on the box row, + `--range` and the state modifiers) | `.bb-time-picker-input__field` (+ `--range`); the state modifiers are the box row's `.bb-field-input--*` |
1127
+ | `.bb-base-time-picker-input__*`, `.bb-base-time-picker-input-offcanvas` | `.bb-time-picker-input__*`, `.bb-time-picker-input__sheet` — same suffixes |
1128
+ | `.bb-base-time-selector*` (the time columns, shared by the time input and picker) | `.bb-time-selector*` (CommonTimeSelector) — same suffixes |
1129
+ | `.bb-base-date-picker` (the calendar grid) | `.bb-calendar__grid` (+ `--unit-month` / `--unit-year`, new in v3) |
1130
+ | `.bb-base-date-picker__body`, `__button-menu`, `__content`, `__controls`, `__date` (+ `--current --disabled --first --highlighted --last --middle --selected --today`), `__date-button`, `__days-selector` (+ `--hidden`), `__header-cell`, `__header-container`, `__month`, `__month-selector`, `__week`, `__year-selector` | `.bb-calendar__*`, same element and modifier names — except `--current` (now `--highlighted`) and `--highlighted` (now its inverse, `--outside`); see the day-cell row below |
1131
+ | `.content` / `.content__btn` (+ `--selected`) — the month / year panels | `.bb-calendar__menu-grid` / `.bb-calendar__menu-btn` (+ `--selected`); the rows between them are `.bb-calendar__menu-row` |
1132
+ | `.bb-base-checkbox` / `.bb-base-radio` / `.bb-base-switch` (+ `--disabled --errors --indeterminate --readonly`) | removed — BbCheckbox / BbRadio / BbSwitch render the native input and the glyph with no wrapper; the glyph `.bb-base-{checkbox,radio,switch}-icon` carries `--checked --disabled --errors --warnings --focused --focus-visible --indeterminate --readonly`; in a group row the glyph is itself the row's input cell (no wrapper — beta ≤ 35 had `.bb-{…}-group-item__input-wrapper`), styled with `pt:icon`; in BbTable the span is `.bb-table-check` / `.bb-table-radio` |
1133
+ | `.bb-base-checkbox-group` / `.bb-base-radio-group` / `.bb-base-switch-group` | `.bb-checkbox-group__list` / `.bb-radio-group__list` / `.bb-switch-group__list` |
1134
+
1135
+ The date input's built-in strings moved with it: the `Locale` type's
1136
+ `baseDatePickerInput` namespace is `datePickerInput` (v3's new time input
1137
+ uses `timePickerInput`). Only code that reads the `Locale` type by key is
1138
+ affected; the dictionaries themselves ship with the library.
856
1139
 
857
1140
  **Dialogs, off-canvas, popovers**
858
1141
 
@@ -866,45 +1149,66 @@ nobody emits matches nothing and throws nothing.
866
1149
  **Tabs** — the whole tree was renamed, and v2's block name was `bb-tab`, not
867
1150
  `bb-tabs`, so nothing of a v2 tab theme survives untouched:
868
1151
 
869
- | v2 | v3 |
870
- | ------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
871
- | `.bb-tab` | `.bb-tabs` |
872
- | `.bb-tab--vertical` / `--horizontal` | `.bb-tabs--vertical` / `--horizontal` (+ `.bb-tabs-list--vertical` / `--horizontal` on the strip) |
873
- | `.bb-tab__label-boundary` | `.bb-tabs-list` |
874
- | `.bb-tab__label-container` (+ `--no-transition`) | `.bb-tabs-list__tablist` (+ `--no-transition`) — the sliding active pill is still this element's `::before`, so a v2 `.bb-tab__label-boundary .bb-tab__label-container:before` rule becomes the single-class `.bb-tabs-list__tablist:before` |
875
- | `.bb-tab__btn` (+ `--active`) | `.bb-tabs__trigger` (+ `--active`), with new inner `.bb-tabs__trigger-content` / `.bb-tabs__trigger-label` |
876
- | `.bb-tab__pane` (+ `--shown`) | `.bb-tabs__pane` (+ `--shown`) |
877
- | `.bb-tab__panes-container` | `.bb-tabs-panes` |
1152
+ | v2 | v3 |
1153
+ | ------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
1154
+ | `.bb-tab` | `.bb-tabs` |
1155
+ | `.bb-tab--vertical` / `--horizontal` | `.bb-tabs--vertical` / `--horizontal` (+ `.bb-tabs-list--vertical` / `--horizontal` on the strip) |
1156
+ | `.bb-tab__label-boundary` | `.bb-tabs-list` |
1157
+ | `.bb-tab__label-container` (+ `--no-transition`) | `.bb-tabs-list__list` (+ `--no-transition`) — the sliding active pill is no longer its `::before` but its first child, `.bb-tabs-list__indicator` (`pt:indicator`), so a v2 `.bb-tab__label-boundary .bb-tab__label-container:before` rule becomes `.bb-tabs-list__indicator` |
1158
+ | `.bb-tab__btn` (+ `--active`) | `.bb-tabs-list__item` (+ `--active`), with new inner `.bb-tabs__trigger-content` / `.bb-tabs__trigger-label` |
1159
+ | `.bb-tab__pane` (+ `--shown`) | `.bb-tabs__panel` (+ `--shown`) |
1160
+ | `.bb-tab__panes-container` | `.bb-tabs-panels` |
878
1161
 
879
1162
  v2 had no full-width tab strip, so apps hand-rolled one (commonly a
880
1163
  `bb-tabs--full-width` class). v3 ships it: `<BbTabs block>` sets
881
1164
  `.bb-tabs--block` / `.bb-tabs-list--block` and gives the triggers equal widths.
882
1165
  Delete the hand-rolled modifier rather than porting it.
883
1166
 
1167
+ **BbTable** — no class was renamed, but the markup under `.bb-table` is no
1168
+ longer a `<table>`: it is a CSS grid of `<div>`s carrying ARIA roles. Every
1169
+ **element** selector on it (`table`, `thead`, `tbody`, `tfoot`, `caption`,
1170
+ `tr`, `th`, `td`, `colgroup`/`col`) matches nothing in v3 — silently. The
1171
+ classes all survive; four containers and the roles are the translation:
1172
+
1173
+ | v2 element | v3 selector |
1174
+ | ------------------------------------- | -------------------------------------------------------------------------------------------- |
1175
+ | `table` / `thead` / `tbody` / `tfoot` | `.bb-table__table` / `.bb-table__head` / `.bb-table__body` / `.bb-table__foot` |
1176
+ | `caption` | `.bb-table__caption` |
1177
+ | `tr` / `th` / `td` | `[role=row]` / `[role=columnheader]` / `[role=cell]` (or the `.bb-table-*` row/cell classes) |
1178
+ | `colgroup` / `col` | gone — `columns[].width` |
1179
+
1180
+ Full table, the `.table-flush` idiom rewrite, the `#thead`/`#tbody`/`#tfoot`
1181
+ markup contract and the layout drift that comes with the substrate:
1182
+ [bb-table.md](./components/bb-table.md#the-table-is-a-css-grid-not-a-table-v3-beta-2026-08-26).
1183
+
884
1184
  **Everything else**
885
1185
 
886
- | v2 | v3 |
887
- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
888
- | `.bb-chip*` | `.bb-badge*` (component replaced) |
889
- | `.bb-badge*` used as a floating count/dot (`--dot --floating --positioned --left --bottom --empty`, `__wrapper`, `__content-container`) | `.bb-indicator*` (component renamed) |
890
- | `.bb-color-palette__*` (canvas, canvas-thumb, canvas-wrap, controls, eyedropper, preview, preview--alpha, preview-wrap, slider-thumb, slider-track, slider-wrap, slider-wrap--alpha, sliders, swatch, swatch--active, swatch-group, swatches) | `.bb-base-color-palette__*` — 1:1 on every one |
891
- | `.bb-toast--top-start` / `--top` / `--top-end` / `--bottom-start` / `--bottom` / `--bottom-end` | `.bb-toast--top-left` / `--top-center` / `--top-right` / `--bottom-left` / `--bottom-center` / `--bottom-right` (matching the `position` prop's corner set) |
892
- | `.bb-toast-message__icon-container` | **removed** — style `.bb-toast-message__icon` directly |
893
- | `.bb-tree--open` | `.bb-tree__node--expanded` |
894
- | `.bb-tree-row` | `.bb-tree__row` |
895
- | `.bb-tree-main-content` | `.bb-tree__content` |
896
- | `.bb-dropdown-button__dropdown-chevron` | `.bb-dropdown-button__chevron` |
897
- | `.bb-dropdown-button--loading` / `__content` / `__icon` / `__prepend-icon` / `__append-icon` | **removed** — the split button delegates to `BbButton`'s internals; target `.bb-button__*` inside it |
898
- | `.bb-dropdown__wrapper` | **removed** — the extra wrapper element is gone |
899
- | `.bb-select-popover__search-spinner` | `.bb-select-popover__search-icon` (one element, spinner state included) |
900
- | `.bb-base-date-picker__header` (the tinted banner holding the month/year controls) | `.bb-base-date-picker__controls` (+ the inner `__nav-center`) — the banner is gone; the controls sit on the calendar surface. `__header-container` and `__header-cell` are unrelated and unchanged: they are the weekday row. |
901
- | `.bb-base-date-picker__control` / `__year-control` | `.bb-base-date-picker__nav-btn` |
902
- | `.bb-base-date-picker__month-button` / `__year-button` | `.bb-base-date-picker__heading-btn` (+ `--active`) |
903
- | `.bb-base-date-picker__weekday` | `.bb-base-date-picker__header-cell` |
904
- | `.bb-base-date-picker__monthday` | `.bb-base-date-picker__date` (+ the inner `__date-button`) |
905
- | `.bb-base-date-picker__year-container` | `.bb-base-date-picker__year-selector` |
906
- | `.bb-base-date-picker__header--hidden`, `__selected-day-label` | **removed** |
907
- | `.bb-commabox-item--has-comma` | the select's comma list renders `.bb-base-select__comma-item` (`.bb-commabox-item` itself survives; `--has-comma` and `.bb-chipsbox-item--focused` do not) |
1186
+ | v2 | v3 |
1187
+ | --------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
1188
+ | `.bb-chip*` | `.bb-badge*` (component replaced) |
1189
+ | `.bb-badge*` used as a floating count/dot (`--dot --floating --positioned --left --bottom --empty`, `__wrapper`, `__content-container`) | `.bb-indicator*` (component renamed) |
1190
+ | `.bb-color-palette` (the picker root: canvas, sliders, swatches) | `.bb-color-palette__panel` (the painted box: the popover's bubble, or the box inside the sheet; `pt:panel` on desktop — on a phone `pt:panel` is the sheet) — the element classes `.bb-color-palette__*` (canvas, canvas-thumb, canvas-wrap, controls, eyedropper, preview, preview--alpha, preview-wrap, slider-thumb, slider-track, slider-wrap, slider-wrap--alpha, sliders, swatch, swatch--active, swatch-group, swatches) keep their v2 names |
1191
+ | `.bb-toast--top-start` / `--top` / `--top-end` / `--bottom-start` / `--bottom` / `--bottom-end` | `.bb-toast--top-left` / `--top-center` / `--top-right` / `--bottom-left` / `--bottom-center` / `--bottom-right` (matching the `position` prop's corner set) |
1192
+ | `.bb-toast-message__icon-container` | **removed** — style `.bb-toast__icon` directly |
1193
+ | `.bb-tree--open` | `.bb-tree__item--expanded` |
1194
+ | `.bb-tree-row` | `.bb-tree__row` |
1195
+ | `.bb-tree-main-content` | `.bb-tree__content` |
1196
+ | `.bb-progress-bar` (the filled bar inside `.bb-progress`) | `.bb-progress__bar` |
1197
+ | `.bb-dropdown-button__dropdown-chevron` | `.bb-dropdown-button__chevron` |
1198
+ | `.bb-dropdown-button--loading` / `__content` / `__icon` / `__prepend-icon` / `__append-icon` | **removed** — the split button delegates to `BbButton`'s internals; target `.bb-button__*` inside it |
1199
+ | `.bb-dropdown__wrapper` | **removed** — the extra wrapper element is gone |
1200
+ | `.bb-select-popover__search-spinner` | `.bb-select-popover__search-icon` (one element, spinner state included) |
1201
+ | `.bb-base-date-picker__header` (the tinted banner holding the month/year controls) | `.bb-calendar__header` (+ the inner `__nav-center`) — the banner is gone; the controls sit on the calendar surface. `__header-container` and `__header-cell` are unrelated and unchanged: they are the weekday row. |
1202
+ | `.bb-base-date-picker__control` / `__year-control` | `.bb-calendar__arrow` |
1203
+ | `.bb-base-date-picker__month-button` / `__year-button` | `.bb-calendar__heading-btn` (+ `--active`) |
1204
+ | `.bb-base-date-picker__weekday` | `.bb-calendar__cell-column-header` |
1205
+ | `.bb-base-date-picker__monthday` | `.bb-calendar__day` (+ the inner `__date-button`) |
1206
+ | `.bb-base-date-picker__year-container` | `.bb-calendar__year-selector` |
1207
+ | `.bb-base-date-picker__header--hidden`, `__selected-day-label` | **removed** |
1208
+ | `.bb-commabox-item--has-comma` | the select's comma list renders `.bb-select__comma`; BbTag's entry is `.bb-tag__comma` (was `.bb-commabox-item`); `--has-comma` is gone, and the chip cursor `.bb-chipsbox-item--focused` is `.bb-badge--highlighted` |
1209
+ | `.sr-only` — the visually-hidden helper every component uses for accessible names and status text (it shared Tailwind's class name) | `.bb-sr-only`. Only a selector reaching **into** a component (`.bb-table .sr-only`) breaks; your own Tailwind `sr-only` in your markup is untouched — which is why this one is deliberately **not** in the §8 grep: a hit there would be your code, not ours |
1210
+ | `.bb-base-date-picker__date--current` / `__date--highlighted` (the cursor day / a day of the displayed month) | `.bb-calendar__day--highlighted` is now the cursor day; the previous / next month's days carry `.bb-calendar__day--outside` instead — select the displayed month as `.bb-calendar__day:not(.bb-calendar__day--outside)` |
1211
+ | `#day` / `#append:day` slot scope `highlighted` (a day of the displayed month) | `outside`, inverted — `true` for a day of the previous / next month: `highlighted` → `!outside` |
908
1212
 
909
1213
  The date **input**'s own field tree (`.bb-base-date-picker-input__field`,
910
1214
  `__fields`, `__placeholder`, `__separator`, `__calendar-btn`) moved to a shared
@@ -913,12 +1217,16 @@ The date **input**'s own field tree (`.bb-base-date-picker-input__field`,
913
1217
 
914
1218
  **Removed with no counterpart:** `.bb-base-dialog--compact`,
915
1219
  `.bb-offcanvas--compact`, `.bb-base-textarea--compact` (compact now lives on
916
- `.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
920
- `--filled` / `--empty`), `.bb-progress--horizontal` (`.bb-progress` /
921
- `.bb-progress-bar` are the blocks), `.bb-ratio` (component removed).
1220
+ `.bb-field-input--compact`), `.bb-base-select--active` / `--compact` /
1221
+ `__inner-wrapper` / `__input-container` / `__text-input` (the select activator
1222
+ was rebuilt — nearest hooks are `.bb-select__activator`, `__value`,
1223
+ `__display-value`; `--shown` survives as `.bb-select__field--shown`. `__text-input` was v2's combobox typing
1224
+ field inside the activator; v3's activator is a `type="button"` overlay with no
1225
+ typable field, and typing moved into the panel's
1226
+ `.bb-select-popover__input` — restyle that instead, knowing it now sits
1227
+ in the popover, not the field), `.bb-base-rating__option--highlighted` (v3 uses
1228
+ `--filled` / `--empty`), `.bb-progress--horizontal` (`.bb-progress` and its
1229
+ `.bb-progress__bar` are the classes), `.bb-ratio` (component removed).
922
1230
 
923
1231
  ### 5.7 Renamed custom properties the library WRITES
924
1232
 
@@ -928,23 +1236,27 @@ nested-table column alignment. They all dropped the `bb-` prefix, and every one
928
1236
  of them is consumed through `var(name, fallback)`, so a v2 name silently
929
1237
  resolves to the fallback instead of failing.
930
1238
 
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` |
1239
+ | v2 | v3 |
1240
+ | ----------------------------------------------------- | ----------------------------------------------------------------------------------------- |
1241
+ | `--bb-table-{id}-track-{key}` | `--table-{id}-track-{key}` |
1242
+ | `--bb-table-offset-start` / `-end` | `--offset-start` / `--offset-end` |
1243
+ | `--bb-table-offset-internal-start` / `-end` | `--offset-internal-start` / `--offset-internal-end` |
1244
+ | `--bb-table-fill` | **removed in 3.0.0** (briefly `--fill` in the betas; the grid substrate has no fill loop) |
1245
+ | `--bb-table-natural-width` | **removed in 3.0.0** (briefly `--natural-width` in the betas) |
1246
+ | `--bb-select-popover-width` (on `.bb-select-popover`) | `--w` — and the supported path is now the `width` prop, not a CSS override |
1247
+ | `--bb-icon-dimensions-w` (on `.bb-icon`) | `--w` |
1248
+ | `--bb-breadcrumbs-flex-basis` / `-flex-grow` | `--flex-basis` / `--flex-grow` |
1249
+ | `--bb-picker-preview-color` | `--picker-preview-color` |
942
1250
 
943
1251
  A regex matching the old shape (`/--bb-table-[\w-]+-track/`) matches nothing in
944
1252
  v3. Search your app for `--bb-table-`, `--bb-select-popover-`,
945
1253
  `--bb-icon-dimensions-`, `--bb-breadcrumbs-` and `--bb-picker-` — none of those
946
1254
  names exist in v3 and all of them fail quietly. `--available-height`,
947
- `--inner-width` and `--overlay-min-height` were dropped outright.
1255
+ `--inner-width`, `--overlay-min-height`, `--bb-table-fill` and
1256
+ `--bb-table-natural-width` were dropped outright — the last two because
1257
+ `BbTable` is a CSS grid in 3.0.0 and the fixed-layout self-correction they fed
1258
+ no longer exists (see
1259
+ [bb-table.md](./components/bb-table.md#--fill-and---natural-width-are-removed-not-renamed)).
948
1260
 
949
1261
  If you re-published track variables by hand to align a deeply nested table,
950
1262
  delete that code: `inherit-column-widths` takes a **table id**
@@ -962,7 +1274,11 @@ Nothing here fails to compile — these change what existing code does.
962
1274
  (`BbSelect`, `BbSelectPopover`): re-clicking the selected option re-picks
963
1275
  and closes; it used to emit `null` and empty the field. If your UX relied on
964
1276
  click-to-clear, add `clearable` (or the `clear` slot callback). Multiple
965
- mode still toggles.
1277
+ mode still toggles. **`BbDropdown` single selectable groups** follow the
1278
+ same rule since 3.0.0-beta.35: re-clicking the selected row keeps it (no
1279
+ `item:unselected`, the row's `onClick` still runs, a sole top-level group
1280
+ still closes). Put `clearable: true` on the group to get click-to-clear
1281
+ back.
966
1282
  3. **`enforce-coherence` prunes on mount.** A seeded-but-invalid model value is
967
1283
  now cleared on the first load, not on the next change. If "my value clears
968
1284
  on load" appears after upgrading, your provider isn't resolving the current
@@ -986,15 +1302,32 @@ Nothing here fails to compile — these change what existing code does.
986
1302
  a controlled model (`v-model:sort`), so nothing reorders on its own; the
987
1303
  button appears and emits. Strip or rename the field at the `BbTable`
988
1304
  boundary. The compile-time half of the same collision is in §5.5b.
989
- 7. **Dynamic slot names are normalized** via
990
- `slotKey(key) = key.split(/\W+/g).join('_').toLowerCase()` in
991
- `BbBreadcrumbs`, `BbTree`, `BbTabs`, and the date-picker day slots.
992
- `#Order History` → `#order_history`. **⚠ silent**: a stale raw-key slot
993
- simply renders fallback content. `BbTabs` goes further: the label slot is
994
- renamed (`#label-<key>` → `#label:<slotKey>`), the URL query value is the
995
- normalized slug (`?tab=In%20Review` → `?tab=in_review` — update deep links
996
- and server code), and tab/panel DOM ids are normalized. Only `v-model` /
997
- item `key` stay raw.
1305
+ 7. **Dynamic slot names are kebab-case** via `slotKey(key)` (lodash
1306
+ `kebabCase` rules: words split at separators, camelCase humps and digits,
1307
+ lowercased, joined by `-`) in `BbTable`, `BbDropdown`, `BbBreadcrumbs`,
1308
+ `BbTree`, `BbTabs` and the date-picker day slots. v2's BbTable and
1309
+ BbDropdown folded non-word runs to `_` and squashed camelCase, so:
1310
+ `#order_history` → `#order-history`, `#placedat` (key `placedAt`) →
1311
+ `#placed-at`, `#address2` → `#address-2`. The day slots are named by the
1312
+ day's date as written (`#2024-03-15`), where v2 used its ISO timestamp.
1313
+ **⚠ silent**: a stale slot simply renders fallback content — run
1314
+ `npx bitboss-ui check`: where the keys are in the same file it names every
1315
+ rename (and `--fix` rewrites them); elsewhere it warns on squashed-looking
1316
+ names (`#createdat`). For keys with accents or other scripts, write
1317
+ `#[slotKey('…')]`. Three fixed slots were renamed as well, and `check --fix`
1318
+ rewrites them: `#no-data` → `#empty` (with the `noDataText` prop →
1319
+ `emptyText`), `#prepend-outer` / `#append-outer` → `#prepend:outer` /
1320
+ `#append:outer`, and BbTree's `#<value>-children` → `#<value>:children`.
1321
+ In development the components also say so in the console, once per name
1322
+ (`` `#no-data` was renamed to `#empty` on BbSelect (3.0.0-beta.41) ``), and
1323
+ BbTable / BbTabs name a key's old spelling (`#createdat` → `#created-at`);
1324
+ production builds carry none of it.
1325
+ `BbTabs` goes further: the label slot is `#label:<key>` (v2 `#label-<key>`),
1326
+ the URL query value is the kebab slug (`?tab=In%20Review` →
1327
+ `?tab=in-review`; old `?tab=in_review` links from a v3 beta still land and
1328
+ are rewritten in place — update deep links and server code, see the BbTabs
1329
+ guide § URL values changed in 3.0.0-beta.41), and tab/panel DOM ids follow.
1330
+ Only `v-model` / item `key` stay raw.
998
1331
  8. **Dialogs, popovers, dropdowns and selects open as bottom sheets on mobile**
999
1332
  by default (`adaptive`, default `true`). Set `adaptive: false` in the
1000
1333
  plugin, or per component, for v2-like floating behavior.
@@ -1013,6 +1346,172 @@ Nothing here fails to compile — these change what existing code does.
1013
1346
  branch's children are now `inert` (out of the Tab order). Tests or CSS
1014
1347
  keyed on the removed roles match nothing — see
1015
1348
  [bb-tree.md](./components/bb-tree.md).
1349
+ 13. **`BbTable` is a CSS grid, not a `<table>`.** Column widths hold their
1350
+ overflow threshold, wrap floor and frozen widths exactly, but leftover
1351
+ space is shared equally between auto columns rather than proportionally
1352
+ to content, and a few table-only tricks stop working (`max-width: 0` for
1353
+ ellipsis collapses the cell). Copying rows into a spreadsheet pastes one
1354
+ value per line, and a printed table no longer repeats its header on each
1355
+ page. `#thead`/`#tbody`/`#tfoot` take `<div role="row">` rows, never
1356
+ `<tr>`. Requires subgrid (Chrome/Edge 117, Firefox 71, Safari 16) — no
1357
+ fallback. Full detail and the selector translation in
1358
+ [bb-table.md](./components/bb-table.md#the-table-is-a-css-grid-not-a-table-v3-beta-2026-08-26).
1359
+ 14. **Short selects open without a search field.** The select family
1360
+ (`BbSelect` / `BbSelectPopover`) hides the search field under
1361
+ `autoDisableWritingThreshold` (`6`) options by default: an unset
1362
+ `disable-writing` means `'auto'`, and an **array** `items` with fewer
1363
+ options than the threshold opens with no field — decided at open, held
1364
+ while open. Provider `items` and a select that listens to `option:add`
1365
+ keep the field; an explicit `disable-writing` (any value) still wins.
1366
+ ⚠ silent: nothing fails, the field is just gone from five-option selects.
1367
+ Set `autoDisableWritingThreshold: 0` in the plugin to keep every search
1368
+ field, and delete any `:disable-writing="items.length < 6"` you wrote to
1369
+ get this by hand.
1370
+ 15. **A failed `BbForm` submit moves focus** (`bitboss-ui/validated`, since
1371
+ 3.0.0-beta.41): to the first invalid field that is on screen, in page
1372
+ order, and the form emits `invalid` with `{ errors, values }`. It used to
1373
+ leave focus where it was, usually on the submit button. If your
1374
+ `@submit`-adjacent code focused the first error itself, delete it; if a
1375
+ page moved focus somewhere else on failure (an error summary), do it in
1376
+ `@invalid`: a handler that moves focus itself keeps it. See
1377
+ `BbForm.guide.md` § A failed submit focuses the first invalid field.
1378
+ 16. **`bitboss-ui/validated` needs vee-validate `>=4.10.0 <5`** (since
1379
+ 3.0.0-beta.41; it was `>=4.0.0`). `schema` needs 4.8 and
1380
+ `keep-values-on-unmount` as a ref needs 4.10; on an older 4.x they
1381
+ silently did nothing. vee-validate 5 is not tested yet. npm now reports
1382
+ an older vee-validate at install time: upgrade it to the latest 4.x
1383
+ (`npm i vee-validate@^4.15`). Apps that don't use `bitboss-ui/validated`
1384
+ are not affected (the peer is optional).
1385
+ 17. **A picker's activator is named by the label AND what it shows**
1386
+ (`BbDatePicker`, `BbTimePicker`, `BbColorPalette`, since 3.0.0-beta.41):
1387
+ the `label` used to become the activator's `aria-label`, which hid the
1388
+ visible value ("Due date" for a button showing "12 Sep"). Now the
1389
+ activator gets `aria-labelledby` = a hidden label span, then itself, so it
1390
+ reads "Due date 12 Sep". The `activator` slot's `props` carry
1391
+ `aria-labelledby` instead of `aria-label`: keep `v-bind="props"`; code
1392
+ that read `props['aria-label']` reads the `label` you passed instead.
1393
+ Tests that asserted the activator's `aria-label` should query by role and
1394
+ name.
1395
+ 18. **A validated field's path is its `name`** (`bitboss-ui/validated`,
1396
+ since 3.0.0-beta.41). A field that has a `name` now validates, submits
1397
+ and receives schema errors under it, read as a path: `address[city]` is
1398
+ `address.city`, `users[0][name]` is `users.0.name`, `tags[]` is `tags`.
1399
+ Before, a field without `vid` used its slugged label even when it had a
1400
+ `name`, so **⚠ silent**: `@submit` keys, `useBbFormContext(id).values` /
1401
+ `errors` and schema paths move from `fullname` to whatever `name` says.
1402
+ Without a `name` nothing changes (the slugged label). A field with
1403
+ neither a `label` nor a `name` throws "give the field a `label` or a
1404
+ `name`". Messages name the field by `validation-label`, else its label,
1405
+ else "This field", never the path. `npx bitboss-ui check` flags two
1406
+ fields in one `<BbForm>` that land on the same path.
1407
+ 19. **`useBbFormContext(id).errors` holds every message, as an array**
1408
+ (`bitboss-ui/validated`, since 3.0.0-beta.41): `{ email: ['Taken.'] }`,
1409
+ where it was `{ email: 'Taken.' }`. Read the first one as
1410
+ `errors.email?.[0]`. It lists only fields the form knows (`fields`); a
1411
+ server path with no field is in the new `unmatchedErrors` instead, never
1412
+ in both, so `{ ...errors, ...unmatchedErrors }` is every error. **⚠
1413
+ silent** in a template: `{{ errors.email }}` now prints the array. The
1414
+ `invalid` event (new in this beta) carries the same array shape.
1415
+ 20. **The built-in strings are English by default** (since 3.0.0-beta.41;
1416
+ the default `locale` was `'it'`). Italian apps: set `locale: 'it'` in the
1417
+ build plugin, `bitbossUi({ locale: 'it' })` or, in Nuxt,
1418
+ `bitboss: { locale: 'it' }`. Without it, confirm buttons, empty and
1419
+ loading text, close and clear labels, the select-all text and the date
1420
+ pickers' field order (month first) and labels are English, and the bundle
1421
+ carries only the `en` dictionary. Your own Italian copy (labels,
1422
+ placeholders, titles) is not affected.
1423
+ 21. **`bitboss-ui/validated` slot props are typed** (since 3.0.0-beta.41;
1424
+ they were `any`). Every validated component's slots now have the same
1425
+ prop types as its core twin, so `vue-tsc` rejects code that misused
1426
+ them. Two real cases:
1427
+ - `<button type="submit" @click="validate">` inside `<BbForm>`: the
1428
+ click's `PointerEvent` is passed to `validate(opts?)` as its options
1429
+ (TS2345). Write `@click="validate()"`, or let `type="submit"` submit
1430
+ the form.
1431
+ - `<template #default="{ isSubmitting, setFieldError }">`: `setFieldError`
1432
+ is not a `BbForm` slot prop, so it was always `undefined` (TS2339). Use
1433
+ the slot's `setErrors` instead, or drop the name.
1434
+
1435
+ Runtime behaviour does not change: only compile errors that were hidden
1436
+ appear.
1437
+
1438
+ 22. **A `keyboard-navigation` `BbTable` is an ARIA grid** (since
1439
+ 3.0.0-beta.41). It was a `role="table"` whose rows took arrow keys, which
1440
+ promised assistive tech nothing. Now the root is `role="grid"` (or
1441
+ `role="treegrid"` when an `#expand` slot is present), the body cells are
1442
+ `role="gridcell"`, and focus moves over CELLS (the APG data grid): the whole
1443
+ table is one tab stop, ←/→ move between cells, Home/End go to the row's
1444
+ ends, Ctrl+Home/End to the corners, ↑ from the first row reaches the header.
1445
+ Enter/Space still activate the row (highlight + `click:row`). Links and
1446
+ buttons inside cells leave the Tab order (Enter or F2 reaches them, Escape
1447
+ comes back). A treegrid's rows take focus too (→ expands, ← collapses).
1448
+ Selectable rows carry `aria-selected`. **⚠ silent** for CSS and tests:
1449
+ `[role=cell]` no longer matches those tables' body cells — write
1450
+ `:is([role=cell], [role=gridcell])` or use `.bb-table__cell`; a focus ring
1451
+ styled on `.bb-table__row:focus-visible` now shows only on a treegrid (a
1452
+ grid focuses cells: `.bb-table__cell:focus-visible`); tests that pressed
1453
+ arrows on a row or asserted `getByRole('table')` / `document.activeElement`
1454
+ = the row query `getByRole('grid')` and the focused cell. Tables without
1455
+ `keyboard-navigation` are unchanged. See `BbTable.guide.md` § Keyboard
1456
+ navigation and row events.
1457
+ 23. **`setErrors` moves focus** (since 3.0.0-beta.41). A server's errors now
1458
+ focus the first failing field on screen, as a failed client submit
1459
+ already did, while focus is still the form's (inside it, or on the page
1460
+ after a submit). A page that moved focus itself right after `setErrors`
1461
+ keeps its own; pass `setErrors(map, { focus: false })` to opt out. See
1462
+ `BbForm.guide.md` § A failed submit focuses the first invalid field.
1463
+
1464
+ 24. **`validateOn` is now `validation-mode`** (`bitboss-ui/validated`, since
1465
+ 3.0.0-beta.41). The array of events became one mode: `aggressive` (every
1466
+ change), `balanced` (on leave, then every change while the field shows an
1467
+ error), `lazy` (on leave only), `submit-only` or `submit-live`. The old
1468
+ defaults (`['blur']`, `['inactive']`, a checkbox's or switch's
1469
+ `['update:modelValue', 'change', 'blur']`) all behave as `balanced`, the new
1470
+ default, so delete them; `['update:modelValue']` on a text field is
1471
+ `validation-mode="aggressive"`. **⚠ silent**: a leftover `:validate-on`
1472
+ falls through as an unknown attribute and does nothing. Set the mode once
1473
+ on `<BbForm validation-mode="…">`, or app-wide with
1474
+ `formControls: { validationMode }`; a field's own still wins. See
1475
+ `ai/guides/validated-forms.md` § `validationMode`.
1476
+
1477
+ 25. **`v-for` rows follow your array; `removeField` runs after the render**
1478
+ (`bitboss-ui/validated`, since 3.0.0-beta.41). A row keyed by id that
1479
+ moved up after a delete used to show, submit and **write into your
1480
+ `v-model`** the value of the row it replaced; now every row keeps its own
1481
+ value and `@submit` gets exactly the rows on the page. `removeField(path)`
1482
+ applies after the re-render: pass the row you deleted
1483
+ (``form.removeField(`lines.${i}`)`` right after your `splice`, or later).
1484
+ A path a field on the page still owns is left alone (it used to be
1485
+ cleared). The old "index that fell off the end" call still works: that
1486
+ path is unowned, so it goes. A `useFieldArray` workaround can go. See
1487
+ `BbForm.guide.md` § Rows (`v-for`).
1488
+
1489
+ 26. **`bitboss-ui/validated` is retired** (since 3.0.0-beta.41). `BbForm`,
1490
+ `useBbFormContext`, the form types and the form controls come from
1491
+ `bitboss-ui`. `npx bitboss-ui check --fix` rewrites the imports in `.vue`
1492
+ files (other files: change `'bitboss-ui/validated'` to `'bitboss-ui'`).
1493
+ `useValidatedField` is gone: for a control of your own, use
1494
+ `useBbFormField(formId, { name, validationLabel, rules })`.
1495
+ 27. **Form controls join the `BbForm` they are inside** (since
1496
+ 3.0.0-beta.41), keyed by `name`, else their label: their values are
1497
+ submitted, reset, count toward `dirty`, and are validated if they have
1498
+ rules. **⚠ silent**: a plain control you had inside a form (a filter, a
1499
+ "show advanced" switch) is now submitted too; give it `formless`. A form
1500
+ control with neither `name` nor label inside a form throws (a
1501
+ `BbDropzone` needs a `name`). Rows in a `v-for` need a per-row `:name`
1502
+ (`check` reports `row-without-name`).
1503
+ 28. **Outside a `BbForm` a form control is plain** (since 3.0.0-beta.41): a
1504
+ `bitboss-ui/validated` field used to validate its `rules` on its own; now
1505
+ rules run only inside a form. Wrap the fields in `<BbForm>`.
1506
+ 29. **Nuxt `autoImport.validated` is removed** (since 3.0.0-beta.41):
1507
+ `autoImport` already registers `BbForm`, `useBbFormContext` and
1508
+ `useBbFormField`. Delete the option.
1509
+ 30. **`ValidatedFieldProps` is renamed `FormFieldProps`** (since
1510
+ 3.0.0-beta.41): the form props (`rules`, `validationMode`,
1511
+ `validationLabel`, `formless`) are part of each control's own props type
1512
+ (`BbTextInputProps` has them), and `modelValue` is optional on the 16
1513
+ form controls (inside a `BbForm` the form holds the value). Rename the
1514
+ import; there is no wrapper component in between any more.
1016
1515
 
1017
1516
  ## 7. Class overrides → variants
1018
1517
 
@@ -1046,8 +1545,12 @@ screenshot; do not assume. Two consequences before you start:
1046
1545
  `variant="none"`; it is the one value that emits no variant class.
1047
1546
  - **A name that collides with a v3 built-in is the dangerous case, not the easy
1048
1547
  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.
1548
+ converting to the same-named `variant` hands that look to the library — and
1549
+ registering the name does **not** take it back: registration is type-only
1550
+ (§4), the built-in skin stays in `styles.css`. Keep your look by winning the
1551
+ cascade over the library's skin rules — author at block+modifier and load
1552
+ after `styles.css` (§4 case 2 has the specificity detail) — or convert to a
1553
+ non-colliding custom name.
1051
1554
 
1052
1555
  ### Finding them
1053
1556
 
@@ -1067,17 +1570,17 @@ rg -n 'class="bb-(button|badge|alert|toast-message|tooltip|indicator)\b' --type
1067
1570
 
1068
1571
  ### Correcting them
1069
1572
 
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_. |
1573
+ | Found | Rewrite as |
1574
+ | --------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
1575
+ | `<BbButton class="bb-button--outline">` | `<BbButton variant="outline">` (same for `secondary`, `ghost`, `destructive`, `link`) |
1576
+ | `<BbAlert class="bb-alert--warning">` / v2 `theme="warning"` | `<BbAlert variant="warning">` |
1577
+ | `class="bb-badge bb-badge--secondary"` on a `<span>` | `<BbBadge variant="secondary">` — the real component, not markup cosplay |
1578
+ | `bb-toast-message--success` styling / v2 `theme` on toasts | `toast({ variant: 'success', icon: 'lucide:circle-check' })` |
1579
+ | `bb-tooltip--destructive` | `<BbTooltip variant="destructive">` / `v-bb-tooltip="{ text, variant: 'destructive' }"` |
1580
+ | 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"`. |
1581
+ | 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. |
1582
+ | 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. |
1583
+ | A class that overrides _layout_, not look (widths, margins) | Leave it — classes remain the right tool for layout; variants own _appearance semantics_. |
1081
1584
 
1082
1585
  Rule of thumb: if the class name encodes a **meaning** (state, emphasis,
1083
1586
  severity), it should be a variant; if it encodes **geometry**, it stays a
@@ -1113,11 +1616,13 @@ rg -n 'disabled-while-loading|disabledWhileLoading' # removed
1113
1616
  rg -n 'animate-x|animate-y|animateX|animateY' # → disableAnimate*, now default-on
1114
1617
  rg -n 'thumb-translate|thumbTranslate' # → disable-thumb-translate
1115
1618
  rg -n ':flip=|flip="' # → disable-flip on palette/select-popover
1116
- rg -n 'hide-arrow|show-arrow|arrow-padding|hideArrow|showArrow|arrowPadding' # removed off tooltips
1619
+ rg -n 'hide-arrow|show-arrow|arrow-padding|hideArrow|showArrow|arrowPadding' # removed EVERYWHERE EXCEPT BbTooltip, which keeps hide-arrow + arrow-padding — hits on a tooltip are fine
1117
1620
  rg -n '<BbChip' # component removed → BbBadge clearable
1118
1621
  rg -n '<BbBadge' # v2 badges are v3 indicators — review each
1119
1622
  rg -n '<BbTab\b' # → BbTabs (\b so a tag name alone on its line still matches, and <BbTabs does not)
1120
1623
  rg -n '#label-' # BbTabs label slot → #label:<slotKey>
1624
+ rg -n '#no-data|#(prepend|append)-outer|#[a-z0-9_-]+-children' # → #empty, #prepend:outer / #append:outer, #<value>:children (check --fix rewrites them)
1625
+ rg -n '#[a-z]+_[a-z0-9_]+|\?tab=[a-z0-9]+_' # underscore slot names / tab slugs → kebab-case (`npx bitboss-ui check` names each)
1121
1626
  rg -n 'reverse' --type ts --type js # BbRadio/BbSwitch default flipped
1122
1627
  rg -n 'timeout' --type vue # BbTooltip → delay (BbAvatar keeps timeout); no ':' so static attrs match too
1123
1628
  rg -nU '<BbIcon[^>]*type=' # → icon=, and prefix your own icons `local:` (bb-icon.md). -U so a multi-line tag matches
@@ -1154,11 +1659,94 @@ rg -n 'setConfig' # only locale survives at runtime
1154
1659
  ```bash
1155
1660
  rg -n -- '--bb-(contrasting|hint|icon-color|primary-(base|dark)|panel-(light|dark|disabled)|border-(light|dark|hover)|text-(light|dark|secondary|tertiary)|input-(color|compact-|font-size|inner-h|prefix(-px)?([^-a-zA-Z0-9]|$))|label-(size|compact-spacing-y)|overlay-(color|opacity|z-index)|dialog-|button-|badge-|checkbox-w|radio-space|switch-|rating-size|base-rating-spacing|slider-|table-|select-option-|select-popover-|progress-track|toast-m|breadcrumbs-|picker-|icon-dimensions-)' # every retired v2 token — v3 declares none of them (sections 3 and 5.7)
1156
1661
  rg -n -- '--bb-ring-opacity' # survives by name; every value must now carry a % (section 3)
1157
- 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
- rg -n 'bb-color-palette__' # → .bb-base-color-palette__*; only __popover survives under the old name
1662
+ rg -n 'bb-base-dialog|bb-tab__|bb-tab--|bb-cr-container|bb-common-input-outer-container|bb-common-input-inner-container|common-input-wrapper|bb-base-input-container|bb-base-(checkbox|radio|switch)-container|bb-base-(checkbox|radio|switch)([^-]|$)|bb-base-(text-input|textarea|number-input|select|tag|rating|slider|color-input|color-palette|date-picker-input)|bb-base-date-picker|bb-base-time-picker-input|bb-base-time-selector|bb-base-(checkbox|radio|switch)-group|content__btn|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); every bb-base-* field block went in the flatten, only bb-base-button and the three -icon glyphs remain
1663
+ rg -n 'bb-color-palette([^_-]|$)' # the v2 picker root → .bb-color-palette__panel; every .bb-color-palette__* element kept its v2 name
1664
+ rg -n 'bb-progress-bar' # the v2 progress bar → .bb-progress__bar (section 5.6)
1665
+ rg -n 'bb-date-picker__(grid|body|controls|nav-|heading-btn|content|days-selector|month|header-|week|date|button-menu|menu-|year-selector)' # INERT since the calendar became BbCalendar (after 3.0.0-beta.28): the month grid, its panels and its day cells are `.bb-calendar__*` now — same element names, new block. Only `.bb-date-picker__panel` (+ `--sheet` / `--datetime`) and `.bb-date-picker` are still the picker's. Prefer `pt:day` / `pt:day-button` / `pt:header` / `pt:arrow` / `pt:month` / `pt:year` / `pt:cell-column-header` over any of these classes
1666
+ 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
1667
  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>
1668
+ rg -n -- '--(text-color|bg-color|default-icon-color|surface-bg|surface-text|surface-border|main-color|muted-color)' # INERT paint locals — renamed. Valid CSS that nothing reads, so the component silently reverts to its library default. Mapping table below
1669
+ rg -n -- '--pill-(bg|border|shadow)' # INERT on .bb-tabs-list — the sliding pill is the INDICATOR now: --indicator-bg / --indicator-border / --indicator-shadow (renamed after 3.0.0-beta.28). A hand-built underline (transparent pill + inset shadow) is `variant="line"`
1670
+ rg -n -- '--color' # INERT everywhere — the name is retired. On a surface (.bb-badge / .bb-indicator / .bb-alert / .bb-toast__panel / .bb-avatar) it is now --fg; on a glyph (.bb-base-checkbox-icon / -radio-icon / -switch-icon, .bb-slider__body, .bb-rating__stars, .bb-error-icon, .bb-warning-icon) it is --accent
1671
+ rg -n -- '--(border-width|font-size|padding-inline|pad-[xy]|padding-[xy]|page-radius|ring|shell-[a-z-]+|padding)\s*:' # INERT after 3.0.0-beta.33 — one short spelling per local: --bw --fs --px --py --page-r; the ring is --ring-color + --ring-size; BbSlider's --shell-* became --bg --bg-disabled --bw --border-color --border-focus --r --elev --ring-size --px (table below). A hit on YOUR OWN element (not a .bb-* root) is not affected
1672
+ rg -n -- '--radius\s*:' --type css --type vue # a `--radius` set ON a component root (.bb-badge / .bb-indicator / .bb-base-switch-icon / .bb-toast__panel / .bb-slider__body) is INERT — the radius local is --r on all five, as on .bb-button. Your app's own --radius (shadcn's global) is not a hit: it never was a library token, and it is exactly why the local moved (a `--radius: var(--radius)` on the component was a self-reference — invalid, corners at 0)
1160
1673
  ```
1161
1674
 
1675
+ **Paint-local mapping.** Every surface component names its paint the same way
1676
+ now: `--bg` is the background and `--fg` is the text on it. These are the
1677
+ per-element overrides you set on the component's own class — not `--bb-*`
1678
+ theme tokens.
1679
+
1680
+ | Component | v2 / early-v3 local | v3 |
1681
+ | ----------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------- | --------------------------------------------------------------------------------------------------- |
1682
+ | `.bb-badge`, `.bb-indicator` | `--color` | `--fg` |
1683
+ | `.bb-avatar` | `--bg-color` | `--bg` |
1684
+ | `.bb-avatar` | `--text-color` | `--fg` |
1685
+ | `.bb-avatar` | `--default-icon-color` | removed — the glyph mixes `--fg`/`--bg` |
1686
+ | `.bb-alert` | `--main-color` | `--fg` |
1687
+ | `.bb-alert` | `--muted-color` | `--fg-muted` |
1688
+ | `.bb-toast-message` (now `.bb-toast__panel`) | `--surface-bg` | `--bg` |
1689
+ | `.bb-toast-message` (now `.bb-toast__panel`) | `--surface-text` | `--fg` |
1690
+ | `.bb-toast-message` (now `.bb-toast__panel`) | `--surface-border` | `--border-color` |
1691
+ | `.bb-base-switch-icon` | `--bg-color` | `--bg` |
1692
+ | the glyph components | `--color` | `--accent` |
1693
+ | `.bb-badge` (and its size modifiers), `.bb-indicator`, `.bb-base-switch-icon`, `.bb-toast-message` (now `.bb-toast__panel`), `.bb-slider__body` | `--radius` | `--r` — the corner radius, named as on `.bb-button` and `.bb-base-checkbox-icon` (2026-09-17, beta) |
1694
+ | `.bb-tabs-list` | `--pill-bg` | `--indicator-bg` |
1695
+ | `.bb-tabs-list` | `--pill-border` | `--indicator-border` |
1696
+ | `.bb-tabs-list` | `--pill-shadow` | `--indicator-shadow` |
1697
+
1698
+ **Why `--radius` went.** A component local shadows a custom property of the
1699
+ same name for the component's whole subtree, and `--radius` is the global
1700
+ radius in every shadcn theme. The natural alignment,
1701
+ `.bb-toast__panel { --radius: var(--radius) }`, is a self-reference on the
1702
+ declaring element — a cycle, so the value is invalid and the corners collapse
1703
+ to 0. Write `.bb-toast__panel { --r: var(--radius) }` instead; the two names
1704
+ differ, so the app's `--radius` resolves normally. The same trap holds for
1705
+ `--accent`, which keeps its name (it is a documented family name): map it from
1706
+ a differently named app variable, never from one of the same name. The ring
1707
+ left that list after 3.0.0-beta.33: its locals are `--ring-color` +
1708
+ `--ring-size`, so shadcn's `--ring` is safe to read
1709
+ (`.bb-button { --ring-color: var(--ring) }`).
1710
+
1711
+ **Short spellings (after 3.0.0-beta.33).** Every component local now uses one
1712
+ short spelling per concept, the one `.bb-button` always used: `--bw`, `--fs`,
1713
+ `--px`, `--py`, `--r`. The long spellings below are inert. BbSlider's
1714
+ `--shell-*` set became the field look locals the input shells use.
1715
+
1716
+ | Component | beta.33 and earlier | now |
1717
+ | ------------------------------------------------------------------------ | ------------------------------------------------------------------------ | ------------------------------------------------------------------------------------- |
1718
+ | `.bb-badge`, `.bb-indicator` | `--border-width` | `--bw` |
1719
+ | `.bb-badge`, `.bb-indicator` | `--font-size` | `--fs` |
1720
+ | `.bb-badge`, `.bb-indicator`, `.bb-dropdown__*`, `.bb-select-popover__*` | `--padding-inline` | `--px` |
1721
+ | BbCalendar / BbDatePicker panels | `--pad-x` / `--pad-y` | `--px` / `--py` |
1722
+ | CommonTimeSelector (time picker columns) | `--pad-y` | `--py` |
1723
+ | `.bb-table` | `--padding-x` / `--padding-y` (v2 too) | `--px` / `--py` |
1724
+ | `.bb-pagination` | `--page-radius` | `--page-r` |
1725
+ | `.bb-button`, `.bb-badge` | `--ring` (a colour) | `--ring-color`, plus `--ring-size` |
1726
+ | `.bb-slider__body` | `--shell-bg` / `--shell-disabled-bg` | `--bg` / `--bg-disabled` |
1727
+ | `.bb-slider__body` | `--shell-border-width` / `--shell-border-color` / `--shell-focus-border` | `--bw` / `--border-color` / `--border-focus` |
1728
+ | `.bb-slider__body` | `--shell-radius` | `--r` (shared with the rail) |
1729
+ | `.bb-slider__body` | `--shell-shadow` / `--shell-focus-ring` | `--elev` + `--ring-size` / `--ring-color` |
1730
+ | `.bb-slider__body` | `--shell-px` / `--padding` | `--px` / `--py` |
1731
+ | `.bb-progress` | `--fill` (the bar colour) | `--accent`, the slider's word; new `--track-color` (the track) and `--r` (both radii) |
1732
+
1733
+ The tab strip's rows are a beta-to-beta rename (shipped ≤ 3.0.0-beta.28, renamed in the next prerelease):
1734
+ the sliding pill became the **indicator** when `variant` arrived, because the
1735
+ same element is a 2px bar under `variant="line"`. If you built an underline by
1736
+ hand — `--pill-bg: transparent` plus an inset `--pill-shadow` — replace the
1737
+ whole block with `variant="line"` and the label tokens (`--active-fg`,
1738
+ `--active-fw`); see bb-tabs.md.
1739
+
1740
+ `.bb-button` gained the same vocabulary rather than renaming into it: it now
1741
+ reads `--bg`, `--bg-hover`, `--bg-pressed`, `--fg`, `--border-color` and
1742
+ `--ring-color`, which is what makes a one-line re-skin possible (section 3).
1743
+
1744
+ The glyph components — the checkbox, radio and switch icons, the slider, the
1745
+ rating, and the error and warning icons — are not surfaces: their local is the
1746
+ **accent** on a mark, not the text on a background. They name it `--accent`, so
1747
+ `--color` means nothing anywhere in the library now and the grep above is a
1748
+ blind rename.
1749
+
1162
1750
  ⚠ That first pattern is exact on purpose, and the near-misses are the point: a
1163
1751
  looser one (`input-`, `overlay-`, `dialog-p`) sweeps up tokens that are still
1164
1752
  live globals, and deleting those overrides shifts the layout silently. All of
@@ -1188,17 +1776,17 @@ blocks all moved), so check your stylesheet even for these three.
1188
1776
  to `'div' | 'span'`, so anything else is now a compile error — see
1189
1777
  [BbSmoothHeight](./components/bb-smooth-height.md).
1190
1778
 
1191
- | Area | Guides |
1192
- | ----------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
1193
- | Actions | [BbButton](./components/bb-button.md) · [BbDropdownButton](./components/bb-dropdown-button.md) |
1194
- | Badges & status | [BbBadge / BbIndicator](./components/bb-badge.md) · [BbChip (removed)](./components/bb-chip.md) |
1195
- | Feedback | [BbAlert](./components/bb-alert.md) · [BbToast / toast()](./components/bb-toast.md) · [confirm()](./components/use-confirm.md) · [BbSpinner](./components/bb-spinner.md) |
1196
- | Surfaces | [BbDialog](./components/bb-dialog.md) · [BbOffCanvas](./components/bb-offcanvas.md) · [BbPopover](./components/bb-popover.md) · [BbTooltip](./components/bb-tooltip.md) · [BbCollapsible](./components/bb-collapsible.md) |
1197
- | Navigation & data | [BbDropdown](./components/bb-dropdown.md) · [BbTabs](./components/bb-tabs.md) · [BbTable](./components/bb-table.md) · [BbTree](./components/bb-tree.md) · [BbBreadcrumbs](./components/bb-breadcrumbs.md) · [BbPagination](./components/bb-pagination.md) |
1198
- | Media | [BbAvatar](./components/bb-avatar.md) · [BbIcon](./components/bb-icon.md) |
1199
- | Layout | [BbSmoothHeight](./components/bb-smooth-height.md) |
1200
- | Text-ish inputs | [BbTextInput](./components/bb-text-input.md) · [BbColorInput](./components/bb-color-input.md) · [BbDatePickerInput](./components/bb-date-picker-input.md) · [BbColorPalette](./components/bb-color-palette.md) |
1201
- | Selects | [BbSelect](./components/bb-select.md) · [BbSelectPopover](./components/bb-select-popover.md) |
1202
- | Choice controls | [BbCheckbox / BbRadio / BbSwitch](./components/bb-checkbox.md) · [the three groups](./components/bb-checkbox-group.md) |
1203
- | Other inputs | [BbSlider](./components/bb-slider.md) · [BbRating](./components/bb-rating.md) · [BbTag](./components/bb-tag.md) · [BbDropzone](./components/bb-dropzone.md) |
1204
- | Removed | [BbIntersection](./components/bb-intersection.md) · [useBroadcastChannelInstance](./components/use-broadcast-channel-instance.md) |
1779
+ | Area | Guides |
1780
+ | ----------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
1781
+ | Actions | [BbButton](./components/bb-button.md) · [BbDropdownButton](./components/bb-dropdown-button.md) |
1782
+ | Badges & status | [BbBadge / BbIndicator](./components/bb-badge.md) · [BbChip (removed)](./components/bb-chip.md) |
1783
+ | Feedback | [BbAlert](./components/bb-alert.md) · [BbToast / toast()](./components/bb-toast.md) · [confirm()](./components/use-confirm.md) · [BbSpinner](./components/bb-spinner.md) |
1784
+ | Surfaces | [BbDialog](./components/bb-dialog.md) · [BbOffCanvas](./components/bb-offcanvas.md) · [BbPopover](./components/bb-popover.md) · [BbTooltip](./components/bb-tooltip.md) · [BbCollapsible](./components/bb-collapsible.md) · [BbAccordion](./components/bb-accordion.md) |
1785
+ | Navigation & data | [BbDropdown](./components/bb-dropdown.md) · [BbTabs](./components/bb-tabs.md) · [BbTable](./components/bb-table.md) · [BbTree](./components/bb-tree.md) · [BbBreadcrumbs](./components/bb-breadcrumbs.md) · [BbPagination](./components/bb-pagination.md) |
1786
+ | Media | [BbAvatar](./components/bb-avatar.md) · [BbIcon](./components/bb-icon.md) |
1787
+ | Layout | [BbSmoothHeight](./components/bb-smooth-height.md) |
1788
+ | Text-ish inputs | [BbTextInput](./components/bb-text-input.md) · [BbColorInput](./components/bb-color-input.md) · [BbDatePickerInput](./components/bb-date-picker-input.md) · [BbColorPalette](./components/bb-color-palette.md) |
1789
+ | Selects | [BbSelect](./components/bb-select.md) · [BbSelectPopover](./components/bb-select-popover.md) |
1790
+ | Choice controls | [BbCheckbox / BbRadio / BbSwitch](./components/bb-checkbox.md) · [the three groups](./components/bb-checkbox-group.md) |
1791
+ | Other inputs | [BbSlider](./components/bb-slider.md) · [BbRating](./components/bb-rating.md) · [BbTag](./components/bb-tag.md) · [BbDropzone](./components/bb-dropzone.md) |
1792
+ | Removed | [BbIntersection](./components/bb-intersection.md) · [useBroadcastChannelInstance](./components/use-broadcast-channel-instance.md) |