bitboss-ui 3.0.0-beta.63 → 3.0.0-beta.65

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 (396) hide show
  1. package/README.md +25 -20
  2. package/bin/bitboss-ui.mjs +73 -7
  3. package/dist/ai/BbAlert.md +10 -1
  4. package/dist/ai/BbBadge.md +35 -3
  5. package/dist/ai/BbBadgeButton.md +4 -2
  6. package/dist/ai/BbBaseButton.md +9 -3
  7. package/dist/ai/BbBreadcrumbs.md +2 -2
  8. package/dist/ai/BbButton.md +113 -8
  9. package/dist/ai/BbCheckbox.md +1 -1
  10. package/dist/ai/BbCheckboxGroup.md +94 -6
  11. package/dist/ai/BbColorInput.md +4 -1
  12. package/dist/ai/BbColorPalette.md +2 -1
  13. package/dist/ai/BbConfirm.md +7 -3
  14. package/dist/ai/BbDatePicker.md +2 -1
  15. package/dist/ai/BbDatePickerInput.md +4 -1
  16. package/dist/ai/BbDialog.md +12 -11
  17. package/dist/ai/BbDropdown.md +189 -38
  18. package/dist/ai/BbDropdownButton.md +27 -7
  19. package/dist/ai/BbForm.md +55 -22
  20. package/dist/ai/BbHost.md +2 -2
  21. package/dist/ai/BbHoverCard.md +7 -3
  22. package/dist/ai/BbIcon.md +12 -6
  23. package/dist/ai/BbIndicator.md +11 -1
  24. package/dist/ai/BbNumberInput.md +4 -1
  25. package/dist/ai/BbOffCanvas.md +37 -3
  26. package/dist/ai/BbPopover.md +2 -1
  27. package/dist/ai/BbRadio.md +1 -1
  28. package/dist/ai/BbRadioGroup.md +102 -10
  29. package/dist/ai/BbSelect.md +52 -17
  30. package/dist/ai/BbSelectPopover.md +93 -26
  31. package/dist/ai/BbSwitch.md +1 -1
  32. package/dist/ai/BbSwitchGroup.md +30 -3
  33. package/dist/ai/BbTable.md +17 -10
  34. package/dist/ai/BbTabs.md +8 -3
  35. package/dist/ai/BbTabsList.md +4 -1
  36. package/dist/ai/BbTag.md +5 -2
  37. package/dist/ai/BbTextInput.md +4 -1
  38. package/dist/ai/BbTextarea.md +4 -1
  39. package/dist/ai/BbTimePicker.md +2 -1
  40. package/dist/ai/BbTimePickerInput.md +4 -1
  41. package/dist/ai/BbToast.md +9 -3
  42. package/dist/ai/BbTooltip.md +71 -9
  43. package/dist/ai/ChipsBox.md +1 -1
  44. package/dist/ai/CommonField.md +1 -1
  45. package/dist/ai/OptionsContainer.md +42 -0
  46. package/dist/ai/changelog.json +494 -6
  47. package/dist/ai/components.json +50 -48
  48. package/dist/ai/composables/useBbConfig.md +8 -1
  49. package/dist/ai/composables/useConfirm.md +39 -1
  50. package/dist/ai/design-tokens.json +6 -6
  51. package/dist/ai/guides/agent-contract.md +2 -2
  52. package/dist/ai/guides/ai-router.md +24 -23
  53. package/dist/ai/guides/app-layout.md +5 -0
  54. package/dist/ai/guides/component-picker.md +9 -2
  55. package/dist/ai/guides/design-language.md +24 -24
  56. package/dist/ai/guides/design-tokens.md +15 -8
  57. package/dist/ai/guides/icons-policy.md +9 -2
  58. package/dist/ai/guides/inertia-helpers.md +1183 -301
  59. package/dist/ai/guides/installation-and-plugin-setup.md +12 -2
  60. package/dist/ai/guides/migration/adoption-checklist.md +235 -0
  61. package/dist/ai/guides/migration/components/bb-checkbox-group.md +16 -15
  62. package/dist/ai/guides/migration/components/bb-dialog.md +9 -9
  63. package/dist/ai/guides/migration/components/bb-dropdown.md +7 -2
  64. package/dist/ai/guides/migration/components/bb-popover.md +4 -2
  65. package/dist/ai/guides/migration/components/bb-select.md +19 -0
  66. package/dist/ai/guides/migration/components/bb-table.md +1 -0
  67. package/dist/ai/guides/migration/components/bb-toast.md +4 -0
  68. package/dist/ai/guides/migration/components/bb-tooltip.md +15 -12
  69. package/dist/ai/guides/migration/components/use-confirm.md +25 -2
  70. package/dist/ai/guides/migration/v2-to-v3.md +211 -9
  71. package/dist/ai/guides/migration/v3-beta-css-classes.md +7 -3
  72. package/dist/ai/guides/options-items-playbook.md +2 -1
  73. package/dist/ai/guides/passthrough.md +149 -85
  74. package/dist/ai/guides/preset-components.md +140 -15
  75. package/dist/ai/helpers/definePreset.json +7 -0
  76. package/dist/ai/helpers/definePreset.ts +123 -11
  77. package/dist/ai/helpers/inertia/manifest.json +151 -62
  78. package/dist/ai/helpers/inertia/messages.ts +33 -0
  79. package/dist/ai/helpers/inertia/useConfirmOnRouteLeave.ts +120 -20
  80. package/dist/ai/helpers/inertia/useHasChanged.ts +34 -16
  81. package/dist/ai/helpers/inertia/useLazyProp.ts +102 -36
  82. package/dist/ai/helpers/inertia/useLazyPropGetter.ts +3 -1
  83. package/dist/ai/helpers/inertia/usePaginatedResponseContext.ts +154 -34
  84. package/dist/ai/helpers/inertia/usePromiseForm.ts +121 -14
  85. package/dist/ai/helpers/inertia/useQuery.ts +133 -11
  86. package/dist/ai/helpers/inertia/useQueryObject.ts +74 -67
  87. package/dist/ai/helpers/inertia/useResourceContext.ts +60 -14
  88. package/dist/ai/helpers/inertia/useRouteQuery.ts +38 -27
  89. package/dist/ai/helpers/inertia/useScreenSizes.ts +9 -7
  90. package/dist/ai/helpers/inertia/useTableContext.ts +5 -2
  91. package/dist/ai/helpers/inertia/utils.ts +14 -0
  92. package/dist/ai/index.md +1 -0
  93. package/dist/ai/manifest/common.json +0 -1
  94. package/dist/ai/manifest/components/BbAlert.json +7 -2
  95. package/dist/ai/manifest/components/BbBadge.json +13 -4
  96. package/dist/ai/manifest/components/BbBadge.tree.json +2 -0
  97. package/dist/ai/manifest/components/BbBadgeButton.json +4 -2
  98. package/dist/ai/manifest/components/BbBaseButton.json +4 -2
  99. package/dist/ai/manifest/components/BbBreadcrumbs.tree.json +1 -1
  100. package/dist/ai/manifest/components/BbButton.json +14 -3
  101. package/dist/ai/manifest/components/BbButton.tree.json +5 -1
  102. package/dist/ai/manifest/components/BbCheckboxGroup.json +13 -8
  103. package/dist/ai/manifest/components/BbCheckboxGroup.tree.json +11 -1
  104. package/dist/ai/manifest/components/BbColorInput.json +18 -15
  105. package/dist/ai/manifest/components/BbColorPalette.json +1 -1
  106. package/dist/ai/manifest/components/BbConfirm.json +4 -2
  107. package/dist/ai/manifest/components/BbConfirm.tree.json +1 -1
  108. package/dist/ai/manifest/components/BbDatePicker.json +1 -1
  109. package/dist/ai/manifest/components/BbDatePickerInput.json +17 -14
  110. package/dist/ai/manifest/components/BbDialog.tree.json +2 -1
  111. package/dist/ai/manifest/components/BbDropdown.json +24 -19
  112. package/dist/ai/manifest/components/BbDropdown.tree.json +9 -2
  113. package/dist/ai/manifest/components/BbDropdownButton.json +33 -20
  114. package/dist/ai/manifest/components/BbDropdownButton.tree.json +2 -2
  115. package/dist/ai/manifest/components/BbForm.json +2 -2
  116. package/dist/ai/manifest/components/BbHost.tree.json +1 -1
  117. package/dist/ai/manifest/components/BbHoverCard.json +1 -1
  118. package/dist/ai/manifest/components/BbIndicator.json +8 -2
  119. package/dist/ai/manifest/components/BbNumberInput.json +5 -2
  120. package/dist/ai/manifest/components/BbOffCanvas.json +2 -2
  121. package/dist/ai/manifest/components/BbOffCanvas.tree.json +1 -1
  122. package/dist/ai/manifest/components/BbPopover.json +1 -1
  123. package/dist/ai/manifest/components/BbRadioGroup.json +17 -12
  124. package/dist/ai/manifest/components/BbRadioGroup.tree.json +8 -1
  125. package/dist/ai/manifest/components/BbSelect.json +21 -18
  126. package/dist/ai/manifest/components/BbSelect.tree.json +2 -2
  127. package/dist/ai/manifest/components/BbSelectPopover.json +10 -10
  128. package/dist/ai/manifest/components/BbSelectPopover.tree.json +3 -2
  129. package/dist/ai/manifest/components/BbSwitchGroup.json +1 -1
  130. package/dist/ai/manifest/components/BbSwitchGroup.tree.json +3 -1
  131. package/dist/ai/manifest/components/BbTable.tree.json +14 -1
  132. package/dist/ai/manifest/components/BbTabs.json +9 -6
  133. package/dist/ai/manifest/components/BbTabs.tree.json +1 -1
  134. package/dist/ai/manifest/components/BbTabsList.json +6 -3
  135. package/dist/ai/manifest/components/BbTag.json +19 -16
  136. package/dist/ai/manifest/components/BbTag.tree.json +1 -1
  137. package/dist/ai/manifest/components/BbTextInput.json +6 -3
  138. package/dist/ai/manifest/components/BbTextarea.json +6 -3
  139. package/dist/ai/manifest/components/BbTimePicker.json +1 -1
  140. package/dist/ai/manifest/components/BbTimePickerInput.json +10 -7
  141. package/dist/ai/manifest/components/BbToast.json +7 -2
  142. package/dist/ai/manifest/components/BbToast.tree.json +4 -2
  143. package/dist/ai/manifest/components/BbTooltip.json +6 -5
  144. package/dist/ai/manifest/components/ChipsBox.tree.json +1 -1
  145. package/dist/ai/manifest/components/CommonField.json +1 -1
  146. package/dist/ai/manifest/components/OptionsContainer.json +3 -1
  147. package/dist/ai/manifest/components/OptionsContainer.tree.json +38 -0
  148. package/dist/ai/manifest/index.json +3 -3
  149. package/dist/ai/manifest/meta.json +5 -3
  150. package/dist/ai/manifest/types.advanced.json +5 -2
  151. package/dist/ai/manifest/types.api.json +9 -7
  152. package/dist/ai/recipes/inertia/approvals-inbox.md +1 -1
  153. package/dist/ai/recipes/inertia/inline-edit-workspace.md +1 -1
  154. package/dist/ai/recipes/inertia/layout-scaffold.md +19 -6
  155. package/dist/ai/recipes/inertia/ownership-atlas.md +1 -1
  156. package/dist/ai/recipes/inertia/records-workspace.md +50 -14
  157. package/dist/ai/recipes/inertia/upload-center.md +1 -1
  158. package/dist/ai/recipes/nuxt/layout-scaffold.md +19 -6
  159. package/dist/ai/recipes/nuxt/records-workspace.md +42 -12
  160. package/dist/ai/recipes/vue/layout-scaffold.md +19 -6
  161. package/dist/ai/recipes/vue/records-workspace.md +42 -12
  162. package/dist/ai/source/BbAlert.md +94 -76
  163. package/dist/ai/source/BbBadge.md +174 -72
  164. package/dist/ai/source/BbBadgeButton.md +130 -65
  165. package/dist/ai/source/BbBaseButton.md +46 -124
  166. package/dist/ai/source/BbBaseCheckboxIcon.md +38 -0
  167. package/dist/ai/source/BbBaseRadioIcon.md +18 -0
  168. package/dist/ai/source/BbBaseSwitchIcon.md +51 -0
  169. package/dist/ai/source/BbButton.md +153 -36
  170. package/dist/ai/source/BbCheckboxGroup.md +142 -18
  171. package/dist/ai/source/BbColorInput.md +240 -204
  172. package/dist/ai/source/BbColorPalette.md +7 -4
  173. package/dist/ai/source/BbConfirm.md +34 -11
  174. package/dist/ai/source/BbConfirmPortal.md +24 -9
  175. package/dist/ai/source/BbDatePicker.md +11 -7
  176. package/dist/ai/source/BbDatePickerInput.md +306 -269
  177. package/dist/ai/source/BbDialog.md +49 -14
  178. package/dist/ai/source/BbDropdown.md +314 -197
  179. package/dist/ai/source/BbDropdownButton.md +197 -31
  180. package/dist/ai/source/BbDropdownGroup.md +274 -176
  181. package/dist/ai/source/BbForm.md +50 -6
  182. package/dist/ai/source/BbHoverCard.md +12 -5
  183. package/dist/ai/source/BbIcon.md +4 -3
  184. package/dist/ai/source/BbIndicator.md +73 -52
  185. package/dist/ai/source/BbNumberInput.md +293 -257
  186. package/dist/ai/source/BbOffCanvas.md +55 -29
  187. package/dist/ai/source/BbPopover.md +14 -10
  188. package/dist/ai/source/BbRadioGroup.md +413 -297
  189. package/dist/ai/source/BbSelect.md +549 -435
  190. package/dist/ai/source/BbSelectPopover.md +153 -34
  191. package/dist/ai/source/BbSwitchGroup.md +70 -10
  192. package/dist/ai/source/BbTable.md +369 -37
  193. package/dist/ai/source/BbTabs.md +115 -39
  194. package/dist/ai/source/BbTabsList.md +106 -38
  195. package/dist/ai/source/BbTabsPanels.md +96 -36
  196. package/dist/ai/source/BbTabsRoot.md +96 -36
  197. package/dist/ai/source/BbTag.md +267 -233
  198. package/dist/ai/source/BbTextInput.md +261 -225
  199. package/dist/ai/source/BbTextarea.md +251 -215
  200. package/dist/ai/source/BbTimePicker.md +11 -7
  201. package/dist/ai/source/BbTimePickerInput.md +257 -220
  202. package/dist/ai/source/BbToast.md +73 -32
  203. package/dist/ai/source/BbToastPortal.md +65 -30
  204. package/dist/ai/source/BbTooltip.md +148 -113
  205. package/dist/ai/source/CommonPopover.md +6 -1
  206. package/dist/ai/source/FlatListBox.md +19 -9
  207. package/dist/ai/source/GroupedListBox.md +19 -9
  208. package/dist/ai/source/OptionsContainer.md +25 -9
  209. package/dist/components/BbAlert/BbAlert.vue_vue_type_script_setup_true_lang.js +61 -36
  210. package/dist/components/BbAlert/types.d.ts +9 -5
  211. package/dist/components/BbAlert/types.js +8 -3
  212. package/dist/components/BbBadge/BadgeBodyContent.vue.d.ts +3 -3
  213. package/dist/components/BbBadge/BadgeBodyContent.vue_vue_type_script_setup_true_lang.js +26 -17
  214. package/dist/components/BbBadge/BbBadge.vue_vue_type_script_setup_true_lang.js +103 -50
  215. package/dist/components/BbBadge/BbBadgeButton.vue_vue_type_script_setup_true_lang.js +20 -15
  216. package/dist/components/BbBadge/badgeButtonContext.d.ts +12 -1
  217. package/dist/components/BbBadge/types.d.ts +45 -15
  218. package/dist/components/BbBadge/types.js +12 -3
  219. package/dist/components/BbBaseButton/BbBaseButton.vue_vue_type_script_setup_true_lang.js +89 -126
  220. package/dist/components/BbBaseButton/types.d.ts +23 -4
  221. package/dist/components/BbBaseButton/types.js +7 -1
  222. package/dist/components/BbBaseButton/useLinkState.d.ts +41 -0
  223. package/dist/components/BbBaseButton/useLinkState.js +70 -0
  224. package/dist/components/BbButton/BbButton.vue_vue_type_script_setup_true_lang.js +130 -74
  225. package/dist/components/BbButton/types.d.ts +50 -13
  226. package/dist/components/BbButton/types.js +10 -3
  227. package/dist/components/BbCheckboxGroup/BbCheckboxGroup.vue_vue_type_script_setup_true_lang.js +148 -95
  228. package/dist/components/BbCheckboxGroup/types.d.ts +34 -11
  229. package/dist/components/BbCheckboxGroup/types.js +9 -4
  230. package/dist/components/BbCollapsible/BbCollapsible.vue.d.ts +1 -1
  231. package/dist/components/BbColorInput/BbColorInput.vue_vue_type_script_setup_true_lang.js +134 -93
  232. package/dist/components/BbColorInput/types.d.ts +11 -4
  233. package/dist/components/BbColorInput/types.js +9 -3
  234. package/dist/components/BbConfirm/BbConfirm.vue_vue_type_script_setup_true_lang.js +82 -59
  235. package/dist/components/BbConfirm/types.d.ts +9 -4
  236. package/dist/components/BbConfirm/types.js +8 -3
  237. package/dist/components/BbDatePicker/BbDatePicker.vue.d.ts +1 -1
  238. package/dist/components/BbDatePicker/BbDatePicker.vue_vue_type_script_setup_true_lang.js +68 -67
  239. package/dist/components/BbDatePickerInput/BbDatePickerInput.vue.d.ts +1 -1
  240. package/dist/components/BbDatePickerInput/BbDatePickerInput.vue_vue_type_script_setup_true_lang.js +259 -215
  241. package/dist/components/BbDatePickerInput/types.d.ts +12 -5
  242. package/dist/components/BbDatePickerInput/types.js +9 -3
  243. package/dist/components/BbDialog/BbDialog.vue_vue_type_script_setup_true_lang.js +223 -219
  244. package/dist/components/BbDialog/useDialogStack.d.ts +1 -1
  245. package/dist/components/BbDropdown/AdaptiveDropdown.vue_vue_type_script_setup_true_lang.js +104 -89
  246. package/dist/components/BbDropdown/BbDropdown.vue.d.ts +1 -0
  247. package/dist/components/BbDropdown/BbDropdown.vue_vue_type_script_setup_true_lang.js +323 -285
  248. package/dist/components/BbDropdown/BbDropdownList.vue.d.ts +1 -0
  249. package/dist/components/BbDropdown/BbDropdownList.vue_vue_type_script_setup_true_lang.js +411 -319
  250. package/dist/components/BbDropdown/DropdownPipelineResolver.vue_vue_type_script_setup_true_lang.js +100 -98
  251. package/dist/components/BbDropdown/DropdownRow.vue.d.ts +4 -3
  252. package/dist/components/BbDropdown/DropdownRow.vue_vue_type_script_setup_true_lang.js +49 -28
  253. package/dist/components/BbDropdown/normalizeGroups.d.ts +6 -0
  254. package/dist/components/BbDropdown/normalizeGroups.js +21 -15
  255. package/dist/components/BbDropdown/types.d.ts +59 -12
  256. package/dist/components/BbDropdown/types.js +16 -3
  257. package/dist/components/BbDropdown/useDropdownContext.d.ts +6 -0
  258. package/dist/components/BbDropdownButton/BbDropdownButton.vue.d.ts +2 -1
  259. package/dist/components/BbDropdownButton/BbDropdownButton.vue_vue_type_script_setup_true_lang.js +179 -68
  260. package/dist/components/BbDropdownButton/types.d.ts +44 -16
  261. package/dist/components/BbDropdownButton/types.js +28 -3
  262. package/dist/components/BbForm/BbForm.vue_vue_type_script_setup_true_lang.js +111 -89
  263. package/dist/components/BbForm/formSchema.d.ts +13 -0
  264. package/dist/components/BbHoverCard/BbHoverCard.vue_vue_type_script_setup_true_lang.js +100 -100
  265. package/dist/components/BbIndicator/BbIndicator.vue_vue_type_script_setup_true_lang.js +40 -25
  266. package/dist/components/BbIndicator/types.d.ts +9 -5
  267. package/dist/components/BbIndicator/types.js +8 -3
  268. package/dist/components/BbNumberInput/BbNumberInput.vue_vue_type_script_setup_true_lang.js +243 -202
  269. package/dist/components/BbNumberInput/types.d.ts +12 -5
  270. package/dist/components/BbNumberInput/types.js +9 -3
  271. package/dist/components/BbOffCanvas/BbOffCanvas.vue.d.ts +1 -1
  272. package/dist/components/BbOffCanvas/BbOffCanvas.vue_vue_type_script_setup_true_lang.js +401 -399
  273. package/dist/components/BbOffCanvas/types.d.ts +6 -2
  274. package/dist/components/BbPopover/BbPopover.vue_vue_type_script_setup_true_lang.js +81 -80
  275. package/dist/components/BbRadioGroup/BbRadioGroup.vue_vue_type_script_setup_true_lang.js +158 -105
  276. package/dist/components/BbRadioGroup/types.d.ts +21 -7
  277. package/dist/components/BbRadioGroup/types.js +9 -4
  278. package/dist/components/BbSelect/BbSelect.vue.d.ts +4 -3
  279. package/dist/components/BbSelect/BbSelect.vue_vue_type_script_setup_true_lang.js +181 -137
  280. package/dist/components/BbSelect/types.d.ts +36 -22
  281. package/dist/components/BbSelect/types.js +22 -3
  282. package/dist/components/BbSelectPopover/BbSelectPopover.vue.d.ts +4 -4
  283. package/dist/components/BbSelectPopover/BbSelectPopover.vue_vue_type_script_setup_true_lang.js +600 -577
  284. package/dist/components/BbSelectPopover/knownItems.d.ts +5 -0
  285. package/dist/components/BbSelectPopover/types.d.ts +46 -12
  286. package/dist/components/BbSmoothHeight/BbSmoothHeight.vue.d.ts +1 -1
  287. package/dist/components/BbSwitchGroup/BbSwitchGroup.vue_vue_type_script_setup_true_lang.js +2 -2
  288. package/dist/components/BbSwitchGroup/types.d.ts +14 -4
  289. package/dist/components/BbSwitchGroup/types.js +8 -3
  290. package/dist/components/BbTable/BbTable.vue_vue_type_script_setup_true_lang.js +1102 -995
  291. package/dist/components/BbTable/estimatedFloors.golden.d.ts +25 -0
  292. package/dist/components/BbTable/measuredFloors.d.ts +46 -0
  293. package/dist/components/BbTable/measuredFloors.js +322 -0
  294. package/dist/components/BbTable/measuredFloorsTestKit.d.ts +27 -0
  295. package/dist/components/BbTable/textRuler.d.ts +71 -0
  296. package/dist/components/BbTable/textRuler.js +121 -0
  297. package/dist/components/BbTable/utils.d.ts +113 -6
  298. package/dist/components/BbTable/utils.js +118 -65
  299. package/dist/components/BbTabs/BbTabs.vue_vue_type_script_setup_true_lang.js +53 -35
  300. package/dist/components/BbTabs/BbTabsList.vue_vue_type_script_setup_true_lang.js +62 -45
  301. package/dist/components/BbTabs/types.d.ts +26 -11
  302. package/dist/components/BbTabs/types.js +23 -8
  303. package/dist/components/BbTag/BbTag.vue_vue_type_script_setup_true_lang.js +205 -164
  304. package/dist/components/BbTag/types.d.ts +11 -4
  305. package/dist/components/BbTag/types.js +9 -3
  306. package/dist/components/BbTextInput/BbTextInput.vue_vue_type_script_setup_true_lang.js +98 -57
  307. package/dist/components/BbTextInput/types.d.ts +12 -5
  308. package/dist/components/BbTextInput/types.js +9 -3
  309. package/dist/components/BbTextarea/BbTextarea.vue_vue_type_script_setup_true_lang.js +137 -96
  310. package/dist/components/BbTextarea/types.d.ts +12 -5
  311. package/dist/components/BbTextarea/types.js +9 -3
  312. package/dist/components/BbTimePicker/BbTimePicker.vue_vue_type_script_setup_true_lang.js +105 -104
  313. package/dist/components/BbTimePickerInput/BbTimePickerInput.vue_vue_type_script_setup_true_lang.js +241 -197
  314. package/dist/components/BbTimePickerInput/types.d.ts +12 -5
  315. package/dist/components/BbTimePickerInput/types.js +9 -3
  316. package/dist/components/BbToast/BbToast.vue_vue_type_script_setup_true_lang.js +74 -32
  317. package/dist/components/BbToast/BbToastMessage.vue_vue_type_script_setup_true_lang.js +47 -47
  318. package/dist/components/BbToast/types.d.ts +10 -5
  319. package/dist/components/BbToast/types.js +18 -3
  320. package/dist/components/BbTooltip/BbTooltip.vue_vue_type_script_setup_true_lang.js +85 -71
  321. package/dist/components/BbTooltip/types.d.ts +13 -8
  322. package/dist/components/BbTooltip/types.js +8 -3
  323. package/dist/components/CommonField/CommonField.vue.d.ts +1 -1
  324. package/dist/components/CommonPopover/CommonPopover.vue.d.ts +1 -1
  325. package/dist/components/CommonPopover/CommonPopover.vue_vue_type_script_setup_true_lang.js +69 -69
  326. package/dist/components/FlatListBox/FlatListBox.vue_vue_type_script_setup_true_lang.js +53 -50
  327. package/dist/components/GroupedListBox/GroupedListBox.vue_vue_type_script_setup_true_lang.js +146 -143
  328. package/dist/components/OptionsContainer/OptionsContainer.vue_vue_type_script_setup_true_lang.js +7 -2
  329. package/dist/components/OptionsContainer/types.d.ts +14 -3
  330. package/dist/composables/useBbConfig.d.ts +1 -0
  331. package/dist/composables/useBbConfig.js +11 -7
  332. package/dist/composables/useBbFormContext.d.ts +4 -3
  333. package/dist/composables/useBbTabsContext.js +99 -85
  334. package/dist/composables/useChoiceIndicator.d.ts +58 -0
  335. package/dist/composables/useChoiceIndicator.js +197 -0
  336. package/dist/composables/useConfirm.d.ts +4 -4
  337. package/dist/composables/usePassthrough.d.ts +54 -1
  338. package/dist/composables/usePassthrough.js +100 -71
  339. package/dist/directives/bbTooltip.d.ts +12 -6
  340. package/dist/directives/createPopoverDirective.js +1 -1
  341. package/dist/index.d.ts +3 -1
  342. package/dist/llms-full.txt +3467 -801
  343. package/dist/llms-medium.txt +71 -53
  344. package/dist/llms.txt +2 -1
  345. package/dist/passthrough-deduper.js +6 -3
  346. package/dist/project-dts.d.ts +24 -0
  347. package/dist/project-dts.js +43 -17
  348. package/dist/styles.css +2 -2
  349. package/dist/types/AlertVariant.d.ts +14 -0
  350. package/dist/types/AlertVariant.js +9 -0
  351. package/dist/types/BadgeVariant.d.ts +14 -0
  352. package/dist/types/BadgeVariant.js +9 -0
  353. package/dist/types/ButtonVariant.d.ts +16 -0
  354. package/dist/types/ButtonVariant.js +11 -0
  355. package/dist/types/CheckboxVariant.d.ts +38 -0
  356. package/dist/types/CheckboxVariant.js +4 -0
  357. package/dist/types/CommonProps.d.ts +4 -3
  358. package/dist/types/Config.d.ts +7 -0
  359. package/dist/types/ConfirmVariant.d.ts +12 -0
  360. package/dist/types/ConfirmVariant.js +4 -0
  361. package/dist/types/DropdownItemVariant.d.ts +12 -0
  362. package/dist/types/DropdownItemVariant.js +4 -0
  363. package/dist/types/IndicatorVariant.d.ts +15 -0
  364. package/dist/types/IndicatorVariant.js +10 -0
  365. package/dist/types/InputVariant.d.ts +13 -0
  366. package/dist/types/InputVariant.js +8 -0
  367. package/dist/types/RadioVariant.d.ts +38 -0
  368. package/dist/types/RadioVariant.js +4 -0
  369. package/dist/types/TabsVariant.d.ts +13 -0
  370. package/dist/types/TabsVariant.js +8 -0
  371. package/dist/types/ToastVariant.d.ts +15 -0
  372. package/dist/types/ToastVariant.js +10 -0
  373. package/dist/types/TooltipVariant.d.ts +12 -0
  374. package/dist/types/TooltipVariant.js +4 -0
  375. package/dist/types/passthrough.d.ts +83 -15
  376. package/dist/types/passthrough.js +2 -2
  377. package/dist/types/ptComponentMap.d.ts +35 -23
  378. package/dist/utilities/functions/extractDomContainer.d.ts +20 -1
  379. package/dist/utilities/functions/extractDomContainer.js +8 -3
  380. package/dist/utils/focusVisibility.d.ts +6 -0
  381. package/dist/utils/focusVisibility.js +4 -1
  382. package/dist/utils/passthroughDeduper.d.ts +14 -0
  383. package/dist/utils/versionCheck.js +1 -1
  384. package/dist/vite-plugin.d.ts +64 -7
  385. package/dist/vite.js +385 -259
  386. package/llms.txt +2 -1
  387. package/package.json +5 -4
  388. package/scripts/lib/adoption-checklist.json +312 -0
  389. package/scripts/lib/eslint-plugin.d.ts +13 -0
  390. package/scripts/lib/eslint-plugin.mjs +75 -11
  391. package/scripts/lib/helpers-add.mjs +26 -2
  392. package/scripts/lib/idiom-scan.mjs +65 -0
  393. package/scripts/lib/mcp-config.mjs +203 -9
  394. package/scripts/lib/migrate-fix.mjs +42 -1
  395. package/scripts/lib/project-variant-dts.mjs +18 -0
  396. package/scripts/lib/validate-bb-markup.mjs +99 -2
@@ -16,13 +16,14 @@ plugin (`bitbossUi({ ... })`) and cannot be changed at runtime.
16
16
 
17
17
  Use it for exactly one job: switching the locale of locale-aware components
18
18
  (built-in labels, close buttons, table/pagination strings) while the app runs.
19
+ `locale` reads the current setting back, read-only.
19
20
 
20
21
  ## Import
21
22
 
22
23
  ```ts
23
24
  import { useBbConfig } from 'bitboss-ui';
24
25
 
25
- const { setConfig } = useBbConfig();
26
+ const { setConfig, locale } = useBbConfig();
26
27
  ```
27
28
 
28
29
  ## API
@@ -37,6 +38,12 @@ declare function setConfig(patch: Partial<DynamicConfig>): void;
37
38
  Merges the patch into **this app's** config. The change is immediate and
38
39
  reactive — every mounted component in that app which reads the key updates.
39
40
 
41
+ ### `locale`
42
+
43
+ A read-only `ComputedRef` of this app's locale exactly as it was set (`'it'`,
44
+ `'it-IT'`), following every `setConfig`. Read it to pick your own words in the
45
+ same language as the library's (the Inertia helpers' `messages.ts` does).
46
+
40
47
  ### Per-request locale under SSR
41
48
 
42
49
  The config is held **per Vue app**, and SSR gives every request its own app,
@@ -69,7 +69,8 @@ declare function close(): void;
69
69
  Hides the newest open dialog opened through the same `useConfirm()` (never
70
70
  another component's) without resolving anything. Its purpose is multi-step
71
71
  flows: with `autoClose: false` the dialog stays open after the promise resolves,
72
- and you call `close()` when your flow is done. Don't use it as a substitute for
72
+ and you call `close()` when your flow is done. Server work is not such a flow:
73
+ it goes in `yes.onClick` (see **Async work before the dialog closes**). Don't use it as a substitute for
73
74
  the buttons — a `confirm()` closed this way before any button ran leaves its
74
75
  promise pending.
75
76
 
@@ -166,6 +167,43 @@ const post = await confirm({
166
167
  // post is the api result, or false when the user declined
167
168
  ```
168
169
 
170
+ An Inertia visit goes in `onClick` too. It returns no promise, so wrap it (the
171
+ same wrapper as BbDialog's `save()`): Yes spins for the whole visit, and the
172
+ dialog closes when it settles. A failed visit rejects `confirm()` and still
173
+ closes the dialog.
174
+
175
+ ```ts
176
+ import { router } from '@inertiajs/vue3';
177
+ import { useConfirm } from 'bitboss-ui';
178
+
179
+ const { confirm } = useConfirm();
180
+
181
+ const destroy = (url: string) =>
182
+ new Promise<void>((resolve, reject) => {
183
+ router.delete(url, {
184
+ onSuccess: () => resolve(),
185
+ onError: (errors) => reject({ errors }),
186
+ // Cut short by another visit: resolve. Ended unsettled (a 500, a
187
+ // network error): reject. Both are no-ops after onSuccess / onError.
188
+ onFinish: (visit) =>
189
+ visit.cancelled || visit.interrupted
190
+ ? resolve()
191
+ : reject(new Error('The delete failed')),
192
+ });
193
+ });
194
+
195
+ const remove = (id: number) =>
196
+ confirm({
197
+ title: 'Delete invoice?',
198
+ variant: 'destructive',
199
+ yes: { text: 'Delete', onClick: () => destroy(`/invoices/${id}`) },
200
+ });
201
+ ```
202
+
203
+ Not `autoClose: false` with `close()` called from the visit callbacks: Yes
204
+ never shows busy, and a missed callback leaves the dialog up or closes it
205
+ mid-visit.
206
+
169
207
  ### Custom footer actions — more than yes/no
170
208
 
171
209
  Pass an `actions` array to replace the Yes/No footer with your own buttons.
@@ -456,18 +456,18 @@
456
456
  "dark": "#00000080"
457
457
  }
458
458
  },
459
- "--bb-overlay-blur": {
460
- "css": "--bb-overlay-blur",
461
- "light": "2px"
462
- },
463
- "--bb-overlay-stacked": {
464
- "css": "--bb-overlay-stacked",
459
+ "--bb-overlay-above": {
460
+ "css": "--bb-overlay-above",
465
461
  "derived": "var(--bb-overlay)",
466
462
  "resolved": {
467
463
  "light": "#0000001a",
468
464
  "dark": "#00000080"
469
465
  }
470
466
  },
467
+ "--bb-overlay-blur": {
468
+ "css": "--bb-overlay-blur",
469
+ "light": "2px"
470
+ },
471
471
  "--bb-panel": {
472
472
  "css": "--bb-panel",
473
473
  "light": "rgb(255 255 255)",
@@ -240,8 +240,8 @@ semantic status badges, a brand button tone — **add it, in both halves**:
240
240
 
241
241
  1. **Register the name** in the build plugin: `badgeVariants`, `buttonVariants`,
242
242
  `alertVariants`, `confirmVariants`, `dropdownItemVariants`, `tooltipVariants`,
243
- `toastVariants`, `indicatorVariants`, `inputVariants`, `tabsVariants`
244
- (`bitboss-ui/vite` or `bitboss-ui/nuxt`).
243
+ `toastVariants`, `indicatorVariants`, `inputVariants`, `tabsVariants`,
244
+ `radioVariants`, `checkboxVariants` (`bitboss-ui/vite` or `bitboss-ui/nuxt`).
245
245
  The plugin regenerates the typed registry, so the name type-checks.
246
246
  2. **Style the class** — `.bb-badge--<name>`, `.bb-button--<name>`, … —
247
247
  in a project stylesheet loaded **after** `bitboss-ui/styles.css`. The library
@@ -98,29 +98,30 @@ inline-edit playbook) instead of inventing a new shape.
98
98
 
99
99
  ## Playbooks (only when the pattern applies)
100
100
 
101
- | Need | Guide |
102
- | -------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
103
- | ⌘K / Ctrl+K global command palette | [BbSelectPopover](../BbSelectPopover.md#a-k-command-palette) § A ⌘K command palette |
104
- | Tied selects / stale model cleanup | [coherence-playbook](./coherence-playbook.md) |
105
- | Async `items` providers / prefill | [fetch-items-playbook](./fetch-items-playbook.md) |
106
- | `item-text` / `item-value` / the default `label` / `value` keys / disabled | [options-items-playbook](./options-items-playbook.md) |
107
- | Table cell edit ownership | [inline-edit-playbook](./inline-edit-playbook.md) |
108
- | Table row → detail (identity cells) | [agent-contract](./agent-contract.md) § Inline Links |
109
- | Peek that drills into related records | [agent-contract](./agent-contract.md) § Consult-Stack |
110
- | Icons (`lucide:*`, never invent names) | [icons-policy](./icons-policy.md) |
111
- | Tokens / styling around components | [design-language](./design-language.md) |
112
- | Inertia app-side helpers (`useProp`, `useQuery`, `useQueryObject`, `useTableContext`, …) the Inertia recipes import | [inertia-helpers](./inertia-helpers.md) |
113
- | Theming a whole app / retuning a component | [design-tokens](./design-tokens.md) — the two tiers, and why most restyling is a component token, not a `--bb-*` one |
114
- | Paint as data (DESIGN.md, impeccable, design-taste) | [design-tokens.json](../design-tokens.json) and [design-tokens.manifest.yaml](../design-tokens.manifest.yaml), generated from `variables.css`. Grep `--bb-*`, not `--color-*` or `--radius-*`. Root `DESIGN.md` is the Inertia fixture, not this library. |
115
- | A Tailwind utility on a `Bb*` component does nothing, or half-applies | [installation](./installation-and-plugin-setup.md) § Cascade layers — v4 is layered, we are not by default. It is per PROPERTY: a utility loses only where we declare the same one, and a shorthand like `p-4` can half-apply. `cssLayers: TAILWIND_V4_LAYERS` in the build plugin |
116
- | Restyling ONE part of a component (its icon, its spinner, its field box) — or a `:deep()` you are about to write | [passthrough](./passthrough.md) — the first choice: `pt:<part>` / `pt:<part>:<state>`, typed and linted; classes append, attributes win, listeners concatenate. A look many places need is a **variant**, not `pt`. No part for it? A CSS override on the internal class is allowed but can break in any release (a part's class is stable within 3.x) — [design-language](./design-language.md) § Hard Rules |
117
- | Styling the SELECTED option, the HIGHLIGHTED row, the CURRENT tab — a state a modifier class used to carry | [passthrough](./passthrough.md) § Parts that resolve per node — `pt:option:selected`, `pt:row:highlighted`, `pt:item:active`; every component's parts and states are in its table |
118
- | Typing a `pt` value in `<script>` (a const, a preset, a wrapper's `pt` prop, a global map split across files) | [passthrough](./passthrough.md) § Typing `pt` in `<script>` — `<Component>Props<Row>['pt']` with `satisfies`, `definePt` for map fragments. `PtValue` / `PtMap` are not exported |
119
- | `InstanceType<typeof BbSelect>` fails, a Storybook `Meta` or `findComponent` won't type, a `ref('')` on a text field | [typescript-generic-components](./typescript-generic-components.md) — the generic components and their four script-side differences |
120
- | Wrapping a `Bb*` component in your own (`MemberSelect`, `PriceListSelect`) | A preset (fixed items, label, option row): [preset-components](./preset-components.md), one `definePreset` call. With its own logic: [options-items-playbook](./options-items-playbook.md) § Wrapping BbSelect in your own component |
121
- | Forms with validation (`BbForm`) | [validated-forms](./validated-forms.md); the schema library (Zod, Valibot, ArkType, Yup, Joi, Effect, string rules) and switching between them: [validation-libraries](./validation-libraries.md); server errors from Inertia, a Laravel 422, Precognition, vee-validate or Nuxt UI into `setErrors`: [validation-providers](./validation-providers.md); porting an Element Plus / Naive UI / Ant Design Vue form (`rules` objects, async-validator): [from-async-validator](./migration/from-async-validator.md) |
122
- | Upgrading from bitboss-ui 2.x | [migration/v2-to-v3](./migration/v2-to-v3.md) |
123
- | Bumping between two v3 prereleases | `npx bitboss-ui changelog --since <your version>` (MCP `list_changes`) — what BREAKS in the bump, and in which release each break first shipped (`firstReleasedIn`); then `check --manifest` for the files it breaks |
101
+ | Need | Guide |
102
+ | ----------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
103
+ | ⌘K / Ctrl+K global command palette | [BbSelectPopover](../BbSelectPopover.md#a-k-command-palette) § A ⌘K command palette |
104
+ | Tied selects / stale model cleanup | [coherence-playbook](./coherence-playbook.md) |
105
+ | Async `items` providers / prefill | [fetch-items-playbook](./fetch-items-playbook.md) |
106
+ | `item-text` / `item-value` / the default `label` / `value` keys / disabled | [options-items-playbook](./options-items-playbook.md) |
107
+ | Table cell edit ownership | [inline-edit-playbook](./inline-edit-playbook.md) |
108
+ | Table row → detail (identity cells) | [agent-contract](./agent-contract.md) § Inline Links |
109
+ | Peek that drills into related records | [agent-contract](./agent-contract.md) § Consult-Stack |
110
+ | Icons (`lucide:*`, never invent names) | [icons-policy](./icons-policy.md) |
111
+ | Tokens / styling around components | [design-language](./design-language.md) |
112
+ | Inertia app-side helpers (`useProp`, `useQuery`, `useQueryObject`, `useTableContext`, …) the Inertia recipes import | [inertia-helpers](./inertia-helpers.md) |
113
+ | Theming a whole app / retuning a component | [design-tokens](./design-tokens.md) — the two tiers, and why most restyling is a component token, not a `--bb-*` one |
114
+ | Paint as data (DESIGN.md, impeccable, design-taste) | [design-tokens.json](../design-tokens.json) and [design-tokens.manifest.yaml](../design-tokens.manifest.yaml), generated from `variables.css`. Grep `--bb-*`, not `--color-*` or `--radius-*`. Root `DESIGN.md` is the Inertia fixture, not this library. |
115
+ | A Tailwind utility on a `Bb*` component does nothing, or half-applies | [installation](./installation-and-plugin-setup.md) § Cascade layers — v4 is layered, we are not by default. It is per PROPERTY: a utility loses only where we declare the same one, and a shorthand like `p-4` can half-apply. `cssLayers: TAILWIND_V4_LAYERS` in the build plugin |
116
+ | Restyling ONE part of a component (its icon, its spinner, its field box) — or a `:deep()` you are about to write | [passthrough](./passthrough.md) — the first choice: `pt:<part>` / `pt:<part>:<state>`, typed and linted; classes append, attributes win, listeners concatenate. A look many places need is a **variant**, not `pt`. No part for it? A CSS override on the internal class is allowed but can break in any release (a part's class is stable within 3.x) — [design-language](./design-language.md) § Hard Rules |
117
+ | Styling the SELECTED option, the HIGHLIGHTED row, the CURRENT tab — a state a modifier class used to carry | [passthrough](./passthrough.md) § Parts that resolve per node — `pt:option:selected`, `pt:row:highlighted`, `pt:item:active`; every component's parts and states are in its table |
118
+ | Typing a `pt` value in `<script>` (a const, a preset, a wrapper's `pt` prop, a global map split across files) | [passthrough](./passthrough.md) § Typing `pt` in `<script>` — `<Component>Props<Row>['pt']` with `satisfies`, `definePt` for map fragments. `PtValue` / `PtMap` are not exported |
119
+ | `InstanceType<typeof BbSelect>` fails, a Storybook `Meta` or `findComponent` won't type, a `ref('')` on a text field | [typescript-generic-components](./typescript-generic-components.md) — the generic components and their four script-side differences |
120
+ | Wrapping a `Bb*` component in your own (`MemberSelect`, `PriceListSelect`) | A preset (fixed items, label, option row): [preset-components](./preset-components.md), one `definePreset` call. With its own logic: [options-items-playbook](./options-items-playbook.md) § Wrapping BbSelect in your own component |
121
+ | Forms with validation (`BbForm`) | [validated-forms](./validated-forms.md); the schema library (Zod, Valibot, ArkType, Yup, Joi, Effect, string rules) and switching between them: [validation-libraries](./validation-libraries.md); server errors from Inertia, a Laravel 422, Precognition, vee-validate or Nuxt UI into `setErrors`: [validation-providers](./validation-providers.md); porting an Element Plus / Naive UI / Ant Design Vue form (`rules` objects, async-validator): [from-async-validator](./migration/from-async-validator.md) |
122
+ | Finishing a migration (from v2 or another library): the hand-rolled controls to move onto the library, `check --idioms` | [migration/adoption-checklist](./migration/adoption-checklist.md) |
123
+ | Upgrading from bitboss-ui 2.x | [migration/v2-to-v3](./migration/v2-to-v3.md) |
124
+ | Bumping between two v3 prereleases | `npx bitboss-ui changelog --since <your version>` (MCP `list_changes`) — what BREAKS in the bump, and in which release each break first shipped (`firstReleasedIn`); then `check --manifest` for the files it breaks |
124
125
 
125
126
  ---
126
127
 
@@ -242,6 +242,11 @@ const footer = [
242
242
  background: color-mix(in oklab, var(--bb-text) 6%, transparent);
243
243
  }
244
244
 
245
+ /* BbBaseButton drops the native ring: the keyboard focus is drawn here. */
246
+ .layout__nav-item:focus-visible {
247
+ box-shadow: 0 0 0 var(--bb-ring-size) var(--bb-ring);
248
+ }
249
+
245
250
  .layout__nav-item--active {
246
251
  background: color-mix(in oklab, var(--bb-text) 9%, transparent);
247
252
  font-weight: 500;
@@ -40,6 +40,12 @@ logo — on every `.vue` file it scans. That is the backstop: it fires without
40
40
  anyone thinking to ask. The badge case is not decidable from markup (a tinted
41
41
  pill is as often decoration as status), so it has no hint and stays your job.
42
42
 
43
+ Migrating an app that already built these? The
44
+ [adoption checklist](./migration/adoption-checklist.md) is the same question
45
+ asked of existing code: every hand-rolled pattern the library ships, how to
46
+ find it, and the replacement. `npx bitboss-ui check --idioms` runs its patterns
47
+ over the app (report-only).
48
+
43
49
  ---
44
50
 
45
51
  ## Text Input
@@ -81,6 +87,7 @@ pill is as often decoration as status), so it has no hint and stays your job.
81
87
  - Small static multi-choice submitted with a form → `BbCheckboxGroup`.
82
88
  - Each option is a live setting that applies the moment it flips → `BbSwitchGroup`.
83
89
  - The trigger is a status pill, avatar stack, or table-cell chip rather than a form field → `BbSelectPopover` (same search/options engine as `BbSelect`, you own the trigger).
90
+ - A segmented control: **switch views → `BbTabs`** (default `pill`), **pick a value → `BbRadioGroup` `variant="pill"`** (or `"line"`; several values → `BbCheckboxGroup` `variant="pill"`): BbTabs' look on a radiogroup ([§ Segmented control](../BbRadioGroup.md#segmented-control)). Decide by the job, not the look: a value a form or a filter submits is a radio group; what the page shows is a tab.
84
91
 
85
92
  Never hand-assemble a row of `BbCheckbox`/`BbRadio` — the groups give you fieldset semantics, item mapping, and validation for free.
86
93
 
@@ -192,7 +199,7 @@ There are also **`v-bb-color`**, **`v-bb-date`**, and **`v-bb-time`** directives
192
199
 
193
200
  **Offload navigation to the component.** `BbButton`, dropdown items, and breadcrumb items accept `href` (anchor, or Inertia visit with `method`/`data`/`preserveScroll`/…) and `to` (vue-router); tabs items accept `href`; `BbPagination` with `navigation` builds per-page links itself. Never wire `@click="router.push(...)"` for a plain destination.
194
201
 
195
- **Picking the pattern:** `BbTabs` switches peer sections of _one_ subject (Overview / Activity / Settings) — not steps in a flow, not hierarchy. A look the shipped variants don't have (a side nav, a filter row) starts from `variant="none"` plus the strip's tokens in `pt.wrapper.style` (inline, so no stylesheet and no scoped-style trap); the library does not add a variant per need. `BbBreadcrumbs` answers "where am I and how do I get back up". `BbPagination` steps through a paged result set — prefer it over infinite scroll when users need to find their place again.
202
+ **Picking the pattern:** `BbTabs` switches peer sections of _one_ subject (Overview / Activity / Settings) — not steps in a flow, not hierarchy, and not a value: a segmented strip that picks a value a form or a filter submits is a `BbRadioGroup` `variant="pill"` / `"line"`, the same look ([§ Segmented control](../BbRadioGroup.md#segmented-control)). A look the shipped variants don't have (a side nav, a filter row) starts from `variant="none"` plus the strip's tokens in `pt.wrapper.style` (inline, so no stylesheet and no scoped-style trap); the library does not add a variant per need. `BbBreadcrumbs` answers "where am I and how do I get back up". `BbPagination` steps through a paged result set — prefer it over infinite scroll when users need to find their place again.
196
203
 
197
204
  **Disclosure ladder (BbAccordion vs BbCollapsible vs BbSmoothHeight):**
198
205
 
@@ -247,7 +254,7 @@ compose it or write it yourself.
247
254
  | `BbModal` | It is [BbDialog](../BbDialog.md). |
248
255
  | `BbDrawer` / `BbSheet` | It is [BbOffCanvas](../BbOffCanvas.md). |
249
256
  | `BbCombobox` / `BbAutocomplete` | It is [BbSelect](../BbSelect.md) / [BbSelectPopover](../BbSelectPopover.md) — search is built in, see `disable-writing`. |
250
- | `BbToggle` / `BbToggleGroup` | It is [BbButton](../BbButton.md) with `v-model` (+ `true-value` / `false-value`), which owns `aria-pressed` and the active class. A group is several buttons: a boolean per button for independent toggles, one shared `v-model` with `:false-value="null"` for an optional choice, `group` to fuse them ([BbButton § Toggle buttons](../BbButton.md#toggle-buttons)); exactly one always active is a `BbRadioGroup` segmented control or `BbTabs`. |
257
+ | `BbToggle` / `BbToggleGroup` | It is [BbButton](../BbButton.md) with `v-model` (+ `true-value` / `false-value`), which owns `aria-pressed` and the active class. A group is several buttons: a boolean per button for independent toggles, one shared `v-model` with `:false-value="null"` for an optional choice, `group` to fuse them ([BbButton § Toggle buttons](../BbButton.md#toggle-buttons)); exactly one always active is a `BbRadioGroup` `variant="pill"` or `BbTabs`. |
251
258
  | `TagChip` / colored, read-only tag chip | It is [BbBadge](../BbBadge.md) — [BbTag](../BbTag.md) is a tags-_input_ only, not a display component. Use `BbBadge` with a registered `soft-*` variant for a fixed palette, or a one-off `--bg`/`--fg` override per row for arbitrary/data-driven colors (BbBadge.md § One-off colors) — not a registered variant per distinct color. |
252
259
  | `BbTab` (singular) | The consumer API is [BbTabs](../BbTabs.md) / `BbTabsRoot`. `BbTab` appears only as the **v2 "before" side** of the migration diffs. |
253
260
  | `BbCard` | Does not exist — a card is a `<div>` with tokens. See [design-language](./design-language.md). |
@@ -132,28 +132,28 @@ one renders with no value at all rather than erroring.
132
132
 
133
133
  ### Surfaces & structure
134
134
 
135
- | Token | Meaning |
136
- | ---------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
137
- | `--bb-panel` | Surface/background color of panels, popovers, dialogs |
138
- | `--bb-muted` | Subtle/disabled surface (derived, neutral) |
139
- | `--bb-hover` | Hover fill for **affordances** (buttons, links, controls) |
140
- | `--bb-surface-hover` | Hover fill for **passive surfaces** (rows, cells, days) — fainter |
141
- | `--bb-pressed` | Neutral pressed/active fill |
142
- | `--bb-border` | Border color; pair with `--bb-border-w` (1px) |
143
- | `--bb-field-border` | Resting border of every form field (the default input box and the group / rating / slider shells); follows `--bb-border` until set |
144
- | `--bb-border-w` | Hairline thickness — plates **and** internal dividers (dialog/off-canvas footers, menu rules, popover headers) |
145
- | `--bb-border-w-sm` | Nested / small hairline (xs/sm buttons, badges, glyphs) — half of `--bb-border-w`, floored at 1px and capped by it |
146
- | `--bb-radius` | Corner radius of controls (8px) |
147
- | `--bb-radius-surface` | Corner radius of large surfaces (derived, ×1.8) |
148
- | `--bb-radius-sm` | Corner radius of small nested elements (derived) |
149
- | `--bb-shadow` | Overlay elevation (dialogs, popovers, menus, toasts) |
150
- | `--bb-elev` | Resting lift on controls — a full `box-shadow`, default a transparent layer. Covers a soft lift and a hard offset alike |
151
- | `--bb-elev-sm` | The same lift on small chrome (badges, glyphs, xs/sm buttons); inherits `--bb-elev` unless a hard-offset theme splits it |
152
- | `--bb-panel-p` | Content padding of large surfaces (dialog, off-canvas); axis split via the locals `--px`/`--py` on `.bb-dialog` / `.bb-offcanvas` |
153
- | `--bb-overlay-blur` | Backdrop dim blur (2px) — on the bottom-most open panel's backdrop only |
154
- | `--bb-overlay-stacked` | Dim painted by a panel stacked over another open one (derived, equal to `--bb-overlay`; `transparent` = one dim under the pile) |
155
- | `--bb-surface-filter` | Frost on raised plates — dialog, off-canvas, popover bubble, toast, input shell, alert, table. A full `backdrop-filter` value, default `none` |
156
- | `--bb-z-overlay` | Z-index for overlays (10) |
135
+ | Token | Meaning |
136
+ | --------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
137
+ | `--bb-panel` | Surface/background color of panels, popovers, dialogs |
138
+ | `--bb-muted` | Subtle/disabled surface (derived, neutral) |
139
+ | `--bb-hover` | Hover fill for **affordances** (buttons, links, controls) |
140
+ | `--bb-surface-hover` | Hover fill for **passive surfaces** (rows, cells, days) — fainter |
141
+ | `--bb-pressed` | Neutral pressed/active fill |
142
+ | `--bb-border` | Border color; pair with `--bb-border-w` (1px) |
143
+ | `--bb-field-border` | Resting border of every form field (the default input box and the group / rating / slider shells); follows `--bb-border` until set |
144
+ | `--bb-border-w` | Hairline thickness — plates **and** internal dividers (dialog/off-canvas footers, menu rules, popover headers) |
145
+ | `--bb-border-w-sm` | Nested / small hairline (xs/sm buttons, badges, glyphs) — half of `--bb-border-w`, floored at 1px and capped by it |
146
+ | `--bb-radius` | Corner radius of controls (8px) |
147
+ | `--bb-radius-surface` | Corner radius of large surfaces (derived, ×1.8) |
148
+ | `--bb-radius-sm` | Corner radius of small nested elements (derived) |
149
+ | `--bb-shadow` | Overlay elevation (dialogs, popovers, menus, toasts) |
150
+ | `--bb-elev` | Resting lift on controls — a full `box-shadow`, default a transparent layer. Covers a soft lift and a hard offset alike |
151
+ | `--bb-elev-sm` | The same lift on small chrome (badges, glyphs, xs/sm buttons); inherits `--bb-elev` unless a hard-offset theme splits it |
152
+ | `--bb-panel-p` | Content padding of large surfaces (dialog, off-canvas); axis split via the locals `--px`/`--py` on `.bb-dialog` / `.bb-offcanvas` |
153
+ | `--bb-overlay-blur` | Backdrop dim blur (2px) — on the bottom-most open panel's backdrop only |
154
+ | `--bb-overlay-above` | Dim painted by a panel stacked over another open one (derived, equal to `--bb-overlay`; `transparent` = one dim under the pile); none on a dialog replacing a member of its own `stack` |
155
+ | `--bb-surface-filter` | Frost on raised plates — dialog, off-canvas, popover bubble, toast, input shell, alert, table. A full `backdrop-filter` value, default `none` |
156
+ | `--bb-z-overlay` | Z-index for overlays (10) |
157
157
 
158
158
  ### Color semantics
159
159
 
@@ -240,8 +240,8 @@ What the shared names mean (shadcn-style vocabulary):
240
240
 
241
241
  Projects can register extra variants through the Vite/Nuxt plugin
242
242
  (`buttonVariants`, `badgeVariants`, `alertVariants`, `confirmVariants`,
243
- `dropdownItemVariants`, `tooltipVariants`, `toastVariants`, `inputVariants`
244
- options).
243
+ `dropdownItemVariants`, `tooltipVariants`, `toastVariants`, `inputVariants`,
244
+ `tabsVariants`, `radioVariants`, `checkboxVariants` options).
245
245
  Registered names become typed values, but the library ships no CSS for them —
246
246
  the project styles `.bb-button--<name>` (etc.) itself, following the state
247
247
  recipe in [design-tokens.md](./design-tokens.md).
@@ -373,6 +373,13 @@ ladder formulas instead of these tokens, so a state name never lies.
373
373
  | `--bb-elev` | `0 0 0 0 transparent` | Resting lift on **controls** (buttons, inputs, badges, alerts, checkbox, slider thumb, tab pill). A full `box-shadow`, composed under the focus ring, so one knob covers a soft lift (`0 1px 2px rgb(0 0 0 / 0.05)`) and a hard offset (`4px 4px 0 0 #111`) alike. The default is a transparent layer, not `none`, so the shadow list keeps a constant length and stays interpolable. `--bb-shadow` is the overlay lift; this is the resting one. Ghost / link / none buttons stay flat whatever the theme sets. Avatar and the Indicator bubble carry it via `--bb-elev-sm`; BbDropzone (no plate of its own — the surface is your content) and BbProgress (a recessed track, not a raised plate) deliberately do not. |
374
374
  | `--bb-elev-sm` | `var(--bb-elev)` | The same lift on **small chrome** — badges, checkbox and radio glyphs, the slider thumb, the colour swatch, xs/sm buttons, the active pagination chip. It inherits `--bb-elev`, so a soft shadow needs one knob; only a hard offset needs the second value, because a hard offset has no falloff and its weight is purely relative to the box (a 4px offset is 11% of an xl button and 25% of a 16px glyph). It cannot be derived — CSS cannot halve the offsets inside a shadow string. |
375
375
 
376
+ **Turn a shadow knob off with `0 0 0 0 transparent`, not `none`.** `--bb-elev`,
377
+ `--bb-elev-sm` and `--bb-shadow-sm` are composed into `box-shadow` lists (the
378
+ tab indicator stacks `--bb-elev` and `--bb-shadow-sm`), and `none` inside a list
379
+ invalidates the whole declaration, taking the other layers with it. The
380
+ transparent layer draws nothing and keeps the list valid. `--bb-shadow` stands
381
+ alone wherever it is used, so `none` works there too.
382
+
376
383
  A four-knob chrome shift is `border-w` + `elev` + `shadow` + `radius`, and
377
384
  both nested tiers follow from the first and last, so there is no second pin
378
385
  to remember. Loud fills also pin `--bb-primary-border` and `--bb-link-fg`
@@ -476,14 +483,14 @@ to hardcode past it.
476
483
 
477
484
  ### Overlays
478
485
 
479
- | Token | Default | Notes |
480
- | ---------------------- | ----------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
481
- | `--bb-overlay` | `rgb(0 0 0 / 0.1)` | Backdrop dim color+opacity in one — the bottom-most open panel's backdrop |
482
- | `--bb-overlay-stacked` | derived: `--bb-overlay` | Dim painted by a dialog or off-canvas stacked over another open one, on top of everything beneath it (the parent included). Derived, so a theme that only sets `--bb-overlay` gets a matching value; `transparent` gives a single dim under the whole pile |
483
- | `--bb-overlay-blur` | `2px` | Backdrop blur — only the bottom-most open panel's backdrop carries it, whatever the depth |
484
- | `--bb-surface-filter` | `none` | Frost on raised plates (dialog, sheet, bubble, toast, alert, table, input shell). A full `backdrop-filter` value — `blur(22px) saturate(1.8)` — not a length. Glass themes set it and give `--bb-panel` an alpha. |
485
- | `--bb-z-overlay` | `10` | Overlay z-index |
486
- | `--bb-arrow` | `1` | Popover arrows on (`1`) / off (`0`) |
486
+ | Token | Default | Notes |
487
+ | --------------------- | ----------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
488
+ | `--bb-overlay` | `rgb(0 0 0 / 0.1)` | Backdrop dim color+opacity in one — the bottom-most open panel's backdrop |
489
+ | `--bb-overlay-above` | derived: `--bb-overlay` | Dim painted by a dialog or off-canvas stacked over another open one, on top of everything beneath it (the parent included). A dialog that replaces a member of its own `stack` paints none: the covered member's backdrop stays the only one. Derived, so a theme that only sets `--bb-overlay` gets a matching value; `transparent` gives a single dim under the whole pile |
490
+ | `--bb-overlay-blur` | `2px` | Backdrop blur — only the bottom-most open panel's backdrop carries it, whatever the depth |
491
+ | `--bb-surface-filter` | `none` | Frost on raised plates (dialog, sheet, bubble, toast, alert, table, input shell). A full `backdrop-filter` value — `blur(22px) saturate(1.8)` — not a length. Glass themes set it and give `--bb-panel` an alpha. |
492
+ | `--bb-z-overlay` | `10` | Overlay z-index |
493
+ | `--bb-arrow` | `1` | Popover arrows on (`1`) / off (`0`) |
487
494
 
488
495
  ### Input family
489
496
 
@@ -262,8 +262,15 @@ markup) yourself:
262
262
  duplicate.
263
263
  - Meaningful standalone icon: give `BbIcon` a `label` — it adds `role="img"`
264
264
  and `aria-label`. Deliberately **no `title`**: that renders a native browser
265
- tooltip, which double-tooltips any icon also carrying `v-bb-tooltip` (owner
266
- ruling 2026-07-30, `BbIcon.vue:200`). For a visible tip, add `v-bb-tooltip`.
265
+ tooltip (owner ruling 2026-07-30). `BbIcon` is never focusable.
266
+ - An info icon with a tip: make it an icon-only ghost `BbButton`, so keyboard
267
+ focus reaches it and opens the tip; the slot text is its name, the tip its
268
+ description:
269
+ `<BbButton variant="ghost" icon="lucide:info" v-bb-tooltip="'Prices include VAT'">About prices</BbButton>`.
270
+ When the text must be readable on touch, make it a `BbPopover` toggletip
271
+ (the same button as its activator; see the BbPopover guide, "Inline field
272
+ help"). `v-bb-tooltip` on a bare `BbIcon` or `<span>` is a pointer-only
273
+ hint: keyboard and touch never open it.
267
274
  - Icon-only `BbButton` (the `icon` prop): supply the accessible name through the
268
275
  label (default slot, or `text`) — it renders `sr-only` but is still announced.
269
276
  `aria-label` is only an override; the one hard rule is that the button must