bitboss-ui 3.0.0-beta.3 → 3.0.0-beta.30

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 (771) hide show
  1. package/README.md +190 -35
  2. package/bin/bitboss-ui-mcp.mjs +472 -16
  3. package/bin/bitboss-ui.mjs +300 -23
  4. package/dist/ai/BbAccordion.md +150 -32
  5. package/dist/ai/BbAlert.md +124 -21
  6. package/dist/ai/BbAsterisk.md +53 -1
  7. package/dist/ai/BbAvatar.md +179 -27
  8. package/dist/ai/BbBadge.md +221 -35
  9. package/dist/ai/BbBadgeButton.md +68 -16
  10. package/dist/ai/BbBaseButton.md +123 -46
  11. package/dist/ai/BbBaseCheckboxIcon.md +114 -26
  12. package/dist/ai/BbBaseRadioIcon.md +111 -26
  13. package/dist/ai/BbBaseSwitchIcon.md +119 -28
  14. package/dist/ai/BbBreadcrumbs.md +192 -43
  15. package/dist/ai/BbButton.md +323 -76
  16. package/dist/ai/BbCalendar.md +548 -0
  17. package/dist/ai/BbCheckbox.md +216 -56
  18. package/dist/ai/BbCheckboxGroup.md +267 -30
  19. package/dist/ai/BbCollapsible.md +154 -39
  20. package/dist/ai/BbColorInput.md +280 -44
  21. package/dist/ai/BbColorPalette.md +227 -45
  22. package/dist/ai/BbConfirm.md +201 -41
  23. package/dist/ai/BbDatePicker.md +214 -25
  24. package/dist/ai/BbDatePickerInput.md +289 -54
  25. package/dist/ai/BbDialog.md +464 -73
  26. package/dist/ai/BbDropdown.md +699 -54
  27. package/dist/ai/BbDropdownButton.md +172 -43
  28. package/dist/ai/BbDropdownGroup.md +9 -1
  29. package/dist/ai/BbDropzone.md +122 -16
  30. package/dist/ai/BbForm.md +49 -14
  31. package/dist/ai/BbIcon.md +92 -31
  32. package/dist/ai/BbIndicator.md +73 -10
  33. package/dist/ai/BbNumberInput.md +211 -45
  34. package/dist/ai/BbOffCanvas.md +357 -66
  35. package/dist/ai/BbPagination.md +165 -26
  36. package/dist/ai/BbPopover.md +201 -34
  37. package/dist/ai/BbProgress.md +96 -55
  38. package/dist/ai/BbPtScope.md +136 -0
  39. package/dist/ai/BbRadio.md +205 -26
  40. package/dist/ai/BbRadioGroup.md +346 -39
  41. package/dist/ai/BbRating.md +130 -25
  42. package/dist/ai/BbSelect.md +583 -77
  43. package/dist/ai/BbSelectPopover.md +359 -82
  44. package/dist/ai/BbSlider.md +226 -51
  45. package/dist/ai/BbSmoothHeight.md +136 -32
  46. package/dist/ai/BbSpinner.md +166 -74
  47. package/dist/ai/BbSwitch.md +219 -31
  48. package/dist/ai/BbSwitchGroup.md +267 -29
  49. package/dist/ai/BbTable.md +1310 -162
  50. package/dist/ai/BbTabs.md +568 -101
  51. package/dist/ai/BbTabsList.md +56 -2
  52. package/dist/ai/BbTabsPanes.md +33 -1
  53. package/dist/ai/BbTabsRoot.md +61 -10
  54. package/dist/ai/BbTag.md +220 -42
  55. package/dist/ai/BbTextInput.md +429 -55
  56. package/dist/ai/BbTextarea.md +263 -51
  57. package/dist/ai/BbTimePicker.md +125 -11
  58. package/dist/ai/BbTimePickerInput.md +236 -22
  59. package/dist/ai/BbToast.md +183 -38
  60. package/dist/ai/BbToastPortal.md +28 -1
  61. package/dist/ai/BbTooltip.md +170 -30
  62. package/dist/ai/BbTree.md +225 -73
  63. package/dist/ai/ChipsBox.md +41 -1
  64. package/dist/ai/ClearableButton.md +12 -0
  65. package/dist/ai/CommaBox.md +1 -0
  66. package/dist/ai/{BbBaseInputContainer.md → CommonField.md} +19 -17
  67. package/dist/ai/CommonFieldInput.md +90 -0
  68. package/dist/ai/CommonPopover.md +12 -7
  69. package/dist/ai/CommonTimeSelector.md +61 -0
  70. package/dist/ai/ErrorIcon.md +20 -0
  71. package/dist/ai/FlatListBox.md +33 -5
  72. package/dist/ai/GroupedListBox.md +33 -5
  73. package/dist/ai/ListBox.md +37 -4
  74. package/dist/ai/OptionsContainer.md +6 -5
  75. package/dist/ai/WarningIcon.md +20 -0
  76. package/dist/ai/changelog.json +1183 -44
  77. package/dist/ai/components.json +41195 -9996
  78. package/dist/ai/composables/useBbConfig.md +72 -11
  79. package/dist/ai/composables/useConfirm.md +10 -5
  80. package/dist/ai/composables/useToast.md +4 -2
  81. package/dist/ai/guides/agent-contract.md +95 -10
  82. package/dist/ai/guides/ai-router.md +54 -26
  83. package/dist/ai/guides/app-layout.md +3 -1
  84. package/dist/ai/guides/component-picker.md +24 -18
  85. package/dist/ai/guides/design-language.md +217 -61
  86. package/dist/ai/guides/design-tokens.md +448 -105
  87. package/dist/ai/guides/fetch-items-playbook.md +1 -1
  88. package/dist/ai/guides/icons-policy.md +50 -19
  89. package/dist/ai/guides/inline-edit-playbook.md +1 -1
  90. package/dist/ai/guides/installation-and-plugin-setup.md +618 -42
  91. package/dist/ai/guides/migration/components/bb-accordion.md +29 -0
  92. package/dist/ai/guides/migration/components/bb-alert.md +2 -2
  93. package/dist/ai/guides/migration/components/bb-avatar.md +13 -14
  94. package/dist/ai/guides/migration/components/bb-breadcrumbs.md +8 -7
  95. package/dist/ai/guides/migration/components/bb-button.md +80 -20
  96. package/dist/ai/guides/migration/components/bb-checkbox-group.md +61 -28
  97. package/dist/ai/guides/migration/components/bb-checkbox.md +45 -10
  98. package/dist/ai/guides/migration/components/bb-collapsible.md +5 -5
  99. package/dist/ai/guides/migration/components/bb-color-palette.md +9 -9
  100. package/dist/ai/guides/migration/components/bb-date-picker-input.md +39 -29
  101. package/dist/ai/guides/migration/components/bb-dialog.md +68 -35
  102. package/dist/ai/guides/migration/components/bb-dropdown.md +29 -8
  103. package/dist/ai/guides/migration/components/bb-offcanvas.md +29 -13
  104. package/dist/ai/guides/migration/components/bb-popover.md +12 -11
  105. package/dist/ai/guides/migration/components/bb-rating.md +52 -17
  106. package/dist/ai/guides/migration/components/bb-select-popover.md +8 -0
  107. package/dist/ai/guides/migration/components/bb-select.md +18 -2
  108. package/dist/ai/guides/migration/components/bb-table.md +560 -28
  109. package/dist/ai/guides/migration/components/bb-tabs.md +56 -14
  110. package/dist/ai/guides/migration/components/bb-text-input.md +12 -12
  111. package/dist/ai/guides/migration/components/bb-tooltip.md +18 -0
  112. package/dist/ai/guides/migration/v2-to-v3.md +526 -192
  113. package/dist/ai/guides/options-items-playbook.md +57 -1
  114. package/dist/ai/guides/passthrough.md +725 -0
  115. package/dist/ai/guides/ssr-prefill.md +120 -0
  116. package/dist/ai/guides/validated-forms.md +5 -0
  117. package/dist/ai/index.md +24 -36
  118. package/dist/ai/recipes/inertia/approvals-inbox.md +3 -4
  119. package/dist/ai/recipes/inertia/inline-edit-workspace.md +10 -11
  120. package/dist/ai/recipes/inertia/layout-scaffold.md +5 -1
  121. package/dist/ai/recipes/inertia/onboarding.md +2 -2
  122. package/dist/ai/recipes/inertia/ownership-atlas.md +66 -44
  123. package/dist/ai/recipes/inertia/record-form.md +5 -6
  124. package/dist/ai/recipes/inertia/records-workspace.md +133 -12
  125. package/dist/ai/recipes/inertia/upload-center.md +8 -9
  126. package/dist/ai/recipes/inertia/wizard-form.md +68 -5
  127. package/dist/ai/recipes/nuxt/approvals-inbox.md +3 -4
  128. package/dist/ai/recipes/nuxt/inline-edit-workspace.md +10 -11
  129. package/dist/ai/recipes/nuxt/layout-scaffold.md +5 -1
  130. package/dist/ai/recipes/nuxt/onboarding.md +2 -2
  131. package/dist/ai/recipes/nuxt/record-form.md +5 -6
  132. package/dist/ai/recipes/nuxt/records-workspace.md +135 -12
  133. package/dist/ai/recipes/nuxt/upload-center.md +8 -9
  134. package/dist/ai/recipes/nuxt/wizard-form.md +68 -5
  135. package/dist/ai/recipes/vue/approvals-inbox.md +3 -4
  136. package/dist/ai/recipes/vue/inline-edit-workspace.md +10 -11
  137. package/dist/ai/recipes/vue/layout-scaffold.md +5 -1
  138. package/dist/ai/recipes/vue/onboarding.md +2 -2
  139. package/dist/ai/recipes/vue/record-form.md +10 -10
  140. package/dist/ai/recipes/vue/records-workspace.md +129 -12
  141. package/dist/ai/recipes/vue/upload-center.md +8 -9
  142. package/dist/ai/recipes/vue/wizard-form.md +65 -5
  143. package/dist/ai/source/BbAccordion.md +83 -21
  144. package/dist/ai/source/BbAlert.md +188 -60
  145. package/dist/ai/source/BbAsterisk.md +54 -4
  146. package/dist/ai/source/BbAvatar.md +63 -16
  147. package/dist/ai/source/BbBadge.md +193 -59
  148. package/dist/ai/source/BbBadgeButton.md +108 -41
  149. package/dist/ai/source/BbBaseButton.md +103 -9
  150. package/dist/ai/source/BbBaseCheckboxIcon.md +151 -36
  151. package/dist/ai/source/BbBaseRadioIcon.md +121 -17
  152. package/dist/ai/source/BbBaseSwitchIcon.md +138 -28
  153. package/dist/ai/source/BbBreadcrumbs.md +241 -57
  154. package/dist/ai/source/BbButton.md +457 -165
  155. package/dist/ai/source/BbCalendar.md +1617 -0
  156. package/dist/ai/source/BbCheckbox.md +433 -59
  157. package/dist/ai/source/BbCheckboxGroup.md +722 -77
  158. package/dist/ai/source/BbCollapsible.md +90 -8
  159. package/dist/ai/source/BbColorInput.md +505 -58
  160. package/dist/ai/source/BbColorPalette.md +1160 -51
  161. package/dist/ai/source/BbConfirm.md +134 -4
  162. package/dist/ai/source/BbConfirmPortal.md +83 -0
  163. package/dist/ai/source/BbDatePicker.md +447 -367
  164. package/dist/ai/source/BbDatePickerInput.md +1970 -106
  165. package/dist/ai/source/BbDialog.md +435 -45
  166. package/dist/ai/source/BbDropdown.md +693 -130
  167. package/dist/ai/source/BbDropdownButton.md +279 -68
  168. package/dist/ai/source/BbDropdownGroup.md +535 -64
  169. package/dist/ai/source/BbDropzone.md +93 -14
  170. package/dist/ai/source/BbForm.md +93 -5
  171. package/dist/ai/source/BbIcon.md +114 -48
  172. package/dist/ai/source/BbIndicator.md +85 -42
  173. package/dist/ai/source/BbNumberInput.md +574 -73
  174. package/dist/ai/source/BbOffCanvas.md +789 -249
  175. package/dist/ai/source/BbPagination.md +124 -19
  176. package/dist/ai/source/BbPopover.md +226 -77
  177. package/dist/ai/source/BbProgress.md +53 -5
  178. package/dist/ai/source/BbPtScope.md +54 -0
  179. package/dist/ai/source/BbRadio.md +369 -52
  180. package/dist/ai/source/BbRadioGroup.md +707 -91
  181. package/dist/ai/source/BbRating.md +645 -73
  182. package/dist/ai/source/BbSelect.md +939 -76
  183. package/dist/ai/source/BbSelectPopover.md +611 -66
  184. package/dist/ai/source/BbSlider.md +1205 -81
  185. package/dist/ai/source/BbSmoothHeight.md +48 -2
  186. package/dist/ai/source/BbSpinner.md +62 -6
  187. package/dist/ai/source/BbSwitch.md +277 -55
  188. package/dist/ai/source/BbSwitchGroup.md +568 -77
  189. package/dist/ai/source/BbTable.md +5729 -1779
  190. package/dist/ai/source/BbTabs.md +176 -87
  191. package/dist/ai/source/BbTabsList.md +207 -88
  192. package/dist/ai/source/BbTabsPanes.md +179 -83
  193. package/dist/ai/source/BbTabsRoot.md +171 -82
  194. package/dist/ai/source/BbTag.md +670 -76
  195. package/dist/ai/source/BbTextInput.md +439 -59
  196. package/dist/ai/source/BbTextarea.md +483 -54
  197. package/dist/ai/source/BbTimePicker.md +302 -56
  198. package/dist/ai/source/BbTimePickerInput.md +1143 -91
  199. package/dist/ai/source/BbToast.md +121 -36
  200. package/dist/ai/source/BbToastPortal.md +77 -27
  201. package/dist/ai/source/BbTooltip.md +147 -22
  202. package/dist/ai/source/BbTree.md +55 -3
  203. package/dist/ai/source/ChipsBox.md +12 -2
  204. package/dist/ai/source/CommaBox.md +10 -2
  205. package/dist/ai/source/{BbBaseInputContainer.md → CommonField.md} +318 -210
  206. package/dist/ai/source/CommonFieldInput.md +799 -0
  207. package/dist/ai/source/CommonPopover.md +107 -22
  208. package/dist/ai/source/CommonTimeSelector.md +642 -0
  209. package/dist/ai/source/ErrorIcon.md +2 -2
  210. package/dist/ai/source/FlatListBox.md +172 -11
  211. package/dist/ai/source/GroupedListBox.md +198 -11
  212. package/dist/ai/source/GuidesComponent.md +14 -7
  213. package/dist/ai/source/ListBox.md +29 -2
  214. package/dist/ai/source/OptionsContainer.md +197 -26
  215. package/dist/ai/source/WarningIcon.md +2 -2
  216. package/dist/components/BbAccordion/BbAccordion.vue_vue_type_script_setup_true_lang.js +49 -32
  217. package/dist/components/BbAccordion/types.d.ts +32 -1
  218. package/dist/components/BbAccordion/types.js +11 -0
  219. package/dist/components/BbAlert/BbAlert.vue_vue_type_script_setup_true_lang.js +45 -29
  220. package/dist/components/BbAlert/types.d.ts +35 -1
  221. package/dist/components/BbAlert/types.js +13 -0
  222. package/dist/components/BbAsterisk/BbAsterisk.vue.d.ts +3 -1
  223. package/dist/components/BbAsterisk/BbAsterisk.vue_vue_type_script_setup_true_lang.js +23 -8
  224. package/dist/components/BbAsterisk/types.d.ts +18 -0
  225. package/dist/components/BbAsterisk/types.js +7 -0
  226. package/dist/components/BbAvatar/BbAvatar.vue.d.ts +1 -1
  227. package/dist/components/BbAvatar/BbAvatar.vue_vue_type_script_setup_true_lang.js +57 -44
  228. package/dist/components/BbAvatar/types.d.ts +23 -0
  229. package/dist/components/BbAvatar/types.js +7 -0
  230. package/dist/components/BbBadge/BadgeBodyContent.vue_vue_type_script_setup_true_lang.js +22 -16
  231. package/dist/components/BbBadge/BbBadge.vue_vue_type_script_setup_true_lang.js +95 -52
  232. package/dist/components/BbBadge/BbBadgeButton.vue_vue_type_script_setup_true_lang.js +3 -0
  233. package/dist/components/BbBadge/badgeButtonContext.d.ts +25 -8
  234. package/dist/components/BbBadge/types.d.ts +44 -3
  235. package/dist/components/BbBadge/types.js +13 -0
  236. package/dist/components/BbBaseButton/BbBaseButton.vue_vue_type_script_setup_true_lang.js +110 -97
  237. package/dist/components/BbBaseButton/RouterComponent.vue_vue_type_script_setup_true_lang.js +11 -11
  238. package/dist/components/BbBaseButton/types.d.ts +28 -0
  239. package/dist/components/BbBaseButton/types.js +9 -2
  240. package/dist/components/BbBaseCheckboxIcon/BbBaseCheckboxIcon.vue_vue_type_script_setup_true_lang.js +50 -18
  241. package/dist/components/BbBaseCheckboxIcon/types.d.ts +31 -2
  242. package/dist/components/BbBaseCheckboxIcon/types.js +8 -0
  243. package/dist/components/BbBaseRadioIcon/BbBaseRadioIcon.vue_vue_type_script_setup_true_lang.js +45 -15
  244. package/dist/components/BbBaseRadioIcon/types.d.ts +31 -2
  245. package/dist/components/BbBaseRadioIcon/types.js +8 -0
  246. package/dist/components/BbBaseSwitchIcon/BbBaseSwitchIcon.vue_vue_type_script_setup_true_lang.js +48 -16
  247. package/dist/components/BbBaseSwitchIcon/types.d.ts +31 -2
  248. package/dist/components/BbBaseSwitchIcon/types.js +8 -0
  249. package/dist/components/BbBreadcrumbs/BbBreadcrumbs.vue_vue_type_script_setup_true_lang.js +151 -110
  250. package/dist/components/BbBreadcrumbs/types.d.ts +35 -0
  251. package/dist/components/BbBreadcrumbs/types.js +12 -0
  252. package/dist/components/BbButton/BbButton.vue_vue_type_script_setup_true_lang.js +104 -77
  253. package/dist/components/BbButton/types.d.ts +49 -2
  254. package/dist/components/BbButton/types.js +12 -0
  255. package/dist/components/BbCalendar/BbCalendar.vue.d.ts +34 -0
  256. package/dist/components/BbCalendar/BbCalendar.vue.js +6 -0
  257. package/dist/components/BbCalendar/BbCalendar.vue_vue_type_script_setup_true_lang.js +576 -0
  258. package/dist/components/BbCalendar/CalendarMonthPanel.vue.js +5 -0
  259. package/dist/components/BbCalendar/CalendarMonthPanel.vue_vue_type_script_setup_true_lang.js +124 -0
  260. package/dist/components/BbCalendar/CalendarYearPanel.vue.js +5 -0
  261. package/dist/components/BbCalendar/CalendarYearPanel.vue_vue_type_script_setup_true_lang.js +126 -0
  262. package/dist/components/BbCalendar/calendarHost.d.ts +29 -0
  263. package/dist/components/BbCalendar/calendarHost.js +10 -0
  264. package/dist/components/BbCalendar/types.d.ts +211 -0
  265. package/dist/components/BbCalendar/types.js +28 -0
  266. package/dist/components/{BbBaseDatePicker/useDatePickerContext.d.ts → BbCalendar/useCalendarContext.d.ts} +10 -7
  267. package/dist/components/BbCalendar/useCalendarContext.js +11 -0
  268. package/dist/components/BbCalendar/useCalendarGrid.d.ts +208 -0
  269. package/dist/components/BbCalendar/useCalendarGrid.js +269 -0
  270. package/dist/components/BbCalendar/useDayGrid.d.ts +79 -0
  271. package/dist/components/BbCalendar/useDayGrid.js +203 -0
  272. package/dist/components/BbCheckbox/BbCheckbox.vue.d.ts +1 -1
  273. package/dist/components/BbCheckbox/BbCheckbox.vue_vue_type_script_setup_true_lang.js +194 -67
  274. package/dist/components/BbCheckbox/types.d.ts +164 -9
  275. package/dist/components/BbCheckbox/types.js +8 -0
  276. package/dist/components/BbCheckboxGroup/BbCheckboxGroup.vue.d.ts +3 -3
  277. package/dist/components/BbCheckboxGroup/BbCheckboxGroup.vue_vue_type_script_setup_true_lang.js +310 -80
  278. package/dist/components/BbCheckboxGroup/types.d.ts +152 -8
  279. package/dist/components/BbCheckboxGroup/types.js +10 -0
  280. package/dist/components/BbCollapsible/BbCollapsible.vue.d.ts +2 -1
  281. package/dist/components/BbCollapsible/BbCollapsible.vue_vue_type_script_setup_true_lang.js +41 -19
  282. package/dist/components/BbCollapsible/types.d.ts +44 -1
  283. package/dist/components/BbCollapsible/types.js +7 -0
  284. package/dist/components/BbColorInput/BbColorInput.vue.d.ts +11 -1
  285. package/dist/components/BbColorInput/BbColorInput.vue_vue_type_script_setup_true_lang.js +306 -81
  286. package/dist/components/BbColorInput/types.d.ts +204 -6
  287. package/dist/components/BbColorInput/types.js +24 -0
  288. package/dist/components/BbColorPalette/BbColorPalette.vue.d.ts +10 -2
  289. package/dist/components/BbColorPalette/BbColorPalette.vue_vue_type_script_setup_true_lang.js +508 -104
  290. package/dist/components/BbColorPalette/types.d.ts +69 -3
  291. package/dist/components/BbColorPalette/types.js +12 -0
  292. package/dist/components/BbConfirm/BbConfirm.vue.d.ts +2 -1
  293. package/dist/components/BbConfirm/BbConfirm.vue_vue_type_script_setup_true_lang.js +116 -76
  294. package/dist/components/BbConfirm/types.d.ts +49 -0
  295. package/dist/components/BbConfirm/types.js +17 -0
  296. package/dist/components/BbDatePicker/BbDatePicker.vue.d.ts +16 -10
  297. package/dist/components/BbDatePicker/BbDatePicker.vue_vue_type_script_setup_true_lang.js +291 -218
  298. package/dist/components/BbDatePicker/types.d.ts +95 -15
  299. package/dist/components/BbDatePicker/types.js +32 -0
  300. package/dist/components/BbDatePickerInput/BbDatePickerInput.vue.d.ts +14 -2
  301. package/dist/components/BbDatePickerInput/BbDatePickerInput.vue_vue_type_script_setup_true_lang.js +1148 -82
  302. package/dist/components/BbDatePickerInput/types.d.ts +198 -11
  303. package/dist/components/BbDatePickerInput/types.js +38 -0
  304. package/dist/components/BbDialog/BbDialog.vue.d.ts +4 -4
  305. package/dist/components/BbDialog/BbDialog.vue_vue_type_script_setup_true_lang.js +218 -136
  306. package/dist/components/BbDialog/types.d.ts +86 -2
  307. package/dist/components/BbDialog/types.js +16 -0
  308. package/dist/components/BbDialog/useDialogStack.d.ts +12 -0
  309. package/dist/components/BbDialog/useDialogStack.js +9 -2
  310. package/dist/components/BbDropdown/AdaptiveDropdown.vue.d.ts +2 -0
  311. package/dist/components/BbDropdown/AdaptiveDropdown.vue_vue_type_script_setup_true_lang.js +103 -96
  312. package/dist/components/BbDropdown/BbDropdown.vue.d.ts +10 -2
  313. package/dist/components/BbDropdown/BbDropdown.vue_vue_type_script_setup_true_lang.js +346 -281
  314. package/dist/components/BbDropdown/BbDropdownList.vue_vue_type_script_setup_true_lang.js +285 -257
  315. package/dist/components/BbDropdown/DropdownPipelineResolver.vue_vue_type_script_setup_true_lang.js +100 -89
  316. package/dist/components/BbDropdown/normalizeGroups.js +34 -31
  317. package/dist/components/BbDropdown/types.d.ts +161 -8
  318. package/dist/components/BbDropdown/types.js +20 -2
  319. package/dist/components/BbDropdown/useDropdownContext.d.ts +7 -1
  320. package/dist/components/BbDropdown/useDropdownGroupRegistry.d.ts +1 -0
  321. package/dist/components/BbDropdownButton/BbDropdownButton.vue.d.ts +13 -3
  322. package/dist/components/BbDropdownButton/BbDropdownButton.vue_vue_type_script_setup_true_lang.js +122 -35
  323. package/dist/components/BbDropdownButton/types.d.ts +94 -1
  324. package/dist/components/BbDropdownButton/types.js +30 -0
  325. package/dist/components/BbDropzone/BbDropzone.vue_vue_type_script_setup_true_lang.js +169 -138
  326. package/dist/components/BbDropzone/types.d.ts +32 -1
  327. package/dist/components/BbDropzone/types.js +16 -0
  328. package/dist/components/BbIcon/BbIcon.vue_vue_type_script_setup_true_lang.js +58 -48
  329. package/dist/components/BbIcon/iconCache.d.ts +63 -0
  330. package/dist/components/BbIcon/iconCache.js +35 -0
  331. package/dist/components/BbIcon/types.d.ts +22 -2
  332. package/dist/components/BbIcon/types.js +7 -0
  333. package/dist/components/BbIndicator/BbIndicator.vue_vue_type_script_setup_true_lang.js +33 -20
  334. package/dist/components/BbIndicator/types.d.ts +24 -0
  335. package/dist/components/BbIndicator/types.js +7 -0
  336. package/dist/components/BbNumberInput/BbNumberInput.vue.d.ts +6 -1
  337. package/dist/components/BbNumberInput/BbNumberInput.vue_vue_type_script_setup_true_lang.js +272 -80
  338. package/dist/components/BbNumberInput/types.d.ts +178 -11
  339. package/dist/components/BbNumberInput/types.js +8 -0
  340. package/dist/components/BbOffCanvas/BbOffCanvas.vue.d.ts +4 -4
  341. package/dist/components/BbOffCanvas/BbOffCanvas.vue_vue_type_script_setup_true_lang.js +294 -207
  342. package/dist/components/BbOffCanvas/types.d.ts +73 -5
  343. package/dist/components/BbOffCanvas/types.js +15 -0
  344. package/dist/components/BbPagination/BbPagination.vue.d.ts +1 -1
  345. package/dist/components/BbPagination/BbPagination.vue_vue_type_script_setup_true_lang.js +119 -96
  346. package/dist/components/BbPagination/types.d.ts +32 -0
  347. package/dist/components/BbPagination/types.js +11 -0
  348. package/dist/components/BbPopover/BbPopover.vue.d.ts +5 -5
  349. package/dist/components/BbPopover/BbPopover.vue_vue_type_script_setup_true_lang.js +184 -154
  350. package/dist/components/BbPopover/types.d.ts +48 -2
  351. package/dist/components/BbPopover/types.js +14 -0
  352. package/dist/components/BbProgress/BbProgress.vue_vue_type_script_setup_true_lang.js +27 -15
  353. package/dist/components/BbProgress/types.d.ts +21 -0
  354. package/dist/components/BbProgress/types.js +7 -0
  355. package/dist/components/BbPtScope/BbPtScope.vue.d.ts +12 -0
  356. package/dist/components/BbPtScope/BbPtScope.vue.js +5 -0
  357. package/dist/components/BbPtScope/BbPtScope.vue_vue_type_script_setup_true_lang.js +13 -0
  358. package/dist/components/BbPtScope/types.d.ts +15 -0
  359. package/dist/components/BbRadio/BbRadio.vue.d.ts +1 -1
  360. package/dist/components/BbRadio/BbRadio.vue_vue_type_script_setup_true_lang.js +166 -56
  361. package/dist/components/BbRadio/types.d.ts +137 -9
  362. package/dist/components/BbRadio/types.js +8 -0
  363. package/dist/components/BbRadioGroup/BbRadioGroup.vue.d.ts +2 -2
  364. package/dist/components/BbRadioGroup/BbRadioGroup.vue_vue_type_script_setup_true_lang.js +292 -82
  365. package/dist/components/BbRadioGroup/types.d.ts +155 -10
  366. package/dist/components/BbRadioGroup/types.js +10 -0
  367. package/dist/components/BbRating/BbRating.vue.d.ts +4 -2
  368. package/dist/components/BbRating/BbRating.vue_vue_type_script_setup_true_lang.js +245 -73
  369. package/dist/components/BbRating/types.d.ts +152 -6
  370. package/dist/components/BbRating/types.js +21 -0
  371. package/dist/components/BbSelect/BbSelect.vue.d.ts +3 -3
  372. package/dist/components/BbSelect/BbSelect.vue_vue_type_script_setup_true_lang.js +474 -75
  373. package/dist/components/BbSelect/types.d.ts +174 -8
  374. package/dist/components/BbSelect/types.js +26 -0
  375. package/dist/components/BbSelectPopover/BbSelectPopover.vue_vue_type_script_setup_true_lang.js +460 -349
  376. package/dist/components/BbSelectPopover/types.d.ts +114 -4
  377. package/dist/components/BbSelectPopover/types.js +24 -0
  378. package/dist/components/BbSlider/BbSlider.vue.d.ts +10 -4
  379. package/dist/components/BbSlider/BbSlider.vue_vue_type_script_setup_true_lang.js +396 -92
  380. package/dist/components/BbSlider/types.d.ts +175 -6
  381. package/dist/components/BbSlider/types.js +21 -0
  382. package/dist/components/BbSmoothHeight/BbSmoothHeight.vue.d.ts +1 -1
  383. package/dist/components/BbSmoothHeight/BbSmoothHeight.vue_vue_type_script_setup_true_lang.js +60 -48
  384. package/dist/components/BbSmoothHeight/types.d.ts +19 -0
  385. package/dist/components/BbSmoothHeight/types.js +7 -0
  386. package/dist/components/BbSpinner/BbSpinner.vue_vue_type_script_setup_true_lang.js +27 -14
  387. package/dist/components/BbSpinner/types.d.ts +22 -1
  388. package/dist/components/BbSpinner/types.js +7 -0
  389. package/dist/components/BbSwitch/BbSwitch.vue.d.ts +1 -1
  390. package/dist/components/BbSwitch/BbSwitch.vue_vue_type_script_setup_true_lang.js +202 -75
  391. package/dist/components/BbSwitch/types.d.ts +25 -10
  392. package/dist/components/BbSwitch/types.js +5 -0
  393. package/dist/components/BbSwitchGroup/BbSwitchGroup.vue.d.ts +2 -2
  394. package/dist/components/BbSwitchGroup/BbSwitchGroup.vue_vue_type_script_setup_true_lang.js +310 -80
  395. package/dist/components/BbSwitchGroup/types.d.ts +29 -6
  396. package/dist/components/BbSwitchGroup/types.js +5 -0
  397. package/dist/components/BbTable/BbTable.vue.d.ts +10 -4
  398. package/dist/components/BbTable/BbTable.vue_vue_type_script_setup_true_lang.js +1577 -654
  399. package/dist/components/BbTable/BbTableDataRow.d.ts +169 -0
  400. package/dist/components/BbTable/BbTableDataRow.js +133 -0
  401. package/dist/components/BbTable/BbTableExpandRow.d.ts +73 -0
  402. package/dist/components/BbTable/BbTableExpandRow.js +52 -0
  403. package/dist/components/BbTable/BbTableSelectToggle.d.ts +103 -0
  404. package/dist/components/BbTable/BbTableSelectToggle.js +114 -0
  405. package/dist/components/BbTable/types.d.ts +366 -111
  406. package/dist/components/BbTable/types.js +18 -0
  407. package/dist/components/BbTable/utils.d.ts +92 -4
  408. package/dist/components/BbTable/utils.js +71 -36
  409. package/dist/components/BbTabs/BbTabs.vue_vue_type_script_setup_true_lang.js +32 -20
  410. package/dist/components/BbTabs/BbTabsList.vue.d.ts +3 -10
  411. package/dist/components/BbTabs/BbTabsList.vue_vue_type_script_setup_true_lang.js +39 -33
  412. package/dist/components/BbTabs/BbTabsPanes.vue_vue_type_script_setup_true_lang.js +14 -13
  413. package/dist/components/BbTabs/BbTabsRoot.vue_vue_type_script_setup_true_lang.js +12 -1
  414. package/dist/components/BbTabs/types.d.ts +72 -9
  415. package/dist/components/BbTabs/types.js +11 -0
  416. package/dist/components/BbTag/BbTag.vue.d.ts +7 -4
  417. package/dist/components/BbTag/BbTag.vue_vue_type_script_setup_true_lang.js +350 -88
  418. package/dist/components/BbTag/types.d.ts +90 -5
  419. package/dist/components/BbTag/types.js +8 -0
  420. package/dist/components/BbTextInput/BbTextInput.vue.d.ts +4 -2
  421. package/dist/components/BbTextInput/BbTextInput.vue_vue_type_script_setup_true_lang.js +245 -80
  422. package/dist/components/BbTextInput/types.d.ts +147 -6
  423. package/dist/components/BbTextInput/types.js +8 -0
  424. package/dist/components/BbTextarea/BbTextarea.vue.d.ts +1 -1
  425. package/dist/components/BbTextarea/BbTextarea.vue_vue_type_script_setup_true_lang.js +273 -91
  426. package/dist/components/BbTextarea/types.d.ts +134 -6
  427. package/dist/components/BbTextarea/types.js +8 -0
  428. package/dist/components/BbTimePicker/BbTimePicker.vue.d.ts +10 -2
  429. package/dist/components/BbTimePicker/BbTimePicker.vue_vue_type_script_setup_true_lang.js +152 -103
  430. package/dist/components/BbTimePicker/types.d.ts +65 -3
  431. package/dist/components/BbTimePicker/types.js +12 -0
  432. package/dist/components/BbTimePickerInput/BbTimePickerInput.vue.d.ts +12 -2
  433. package/dist/components/BbTimePickerInput/BbTimePickerInput.vue_vue_type_script_setup_true_lang.js +705 -83
  434. package/dist/components/BbTimePickerInput/types.d.ts +128 -12
  435. package/dist/components/BbTimePickerInput/types.js +23 -0
  436. package/dist/components/BbToast/BbToast.vue_vue_type_script_setup_true_lang.js +51 -25
  437. package/dist/components/BbToast/BbToastMessage.vue.d.ts +3 -0
  438. package/dist/components/BbToast/BbToastMessage.vue_vue_type_script_setup_true_lang.js +48 -47
  439. package/dist/components/BbToast/BbToastRegion.vue.d.ts +3 -0
  440. package/dist/components/BbToast/BbToastRegion.vue_vue_type_script_setup_true_lang.js +72 -64
  441. package/dist/components/BbToast/types.d.ts +28 -0
  442. package/dist/components/BbToast/types.js +13 -0
  443. package/dist/components/BbTooltip/BbTooltip.vue_vue_type_script_setup_true_lang.js +100 -84
  444. package/dist/components/BbTooltip/types.d.ts +40 -2
  445. package/dist/components/BbTooltip/types.js +7 -0
  446. package/dist/components/BbTree/BbTree.vue.d.ts +11 -1
  447. package/dist/components/BbTree/BbTree.vue_vue_type_script_setup_true_lang.js +44 -28
  448. package/dist/components/BbTree/BbTreeLevel.vue_vue_type_script_setup_true_lang.js +13 -12
  449. package/dist/components/BbTree/context.d.ts +4 -1
  450. package/dist/components/BbTree/types.d.ts +30 -1
  451. package/dist/components/BbTree/types.js +7 -0
  452. package/dist/components/ChipsBox/ChipsBox.vue_vue_type_script_setup_true_lang.js +9 -7
  453. package/dist/components/ChipsBox/types.d.ts +6 -0
  454. package/dist/components/ClearableButton/ClearableButton.vue_vue_type_script_setup_true_lang.js +5 -5
  455. package/dist/components/CommaBox/CommaBox.vue_vue_type_script_setup_true_lang.js +11 -7
  456. package/dist/components/CommaBox/types.d.ts +6 -0
  457. package/dist/components/{BbBaseInputContainer/BbBaseInputContainer.vue.d.ts → CommonField/CommonField.vue.d.ts} +4 -4
  458. package/dist/components/{BbBaseRadio/BbBaseRadio.vue.js → CommonField/CommonField.vue.js} +2 -2
  459. package/dist/components/CommonField/CommonField.vue_vue_type_script_setup_true_lang.js +178 -0
  460. package/dist/components/CommonField/messageHeightMatrix.d.ts +2 -0
  461. package/dist/components/{BbBaseInputContainer → CommonField}/types.d.ts +33 -10
  462. package/dist/components/{CommonInputWrapper/CommonInputWrapper.vue.d.ts → CommonFieldInput/CommonFieldInput.vue.d.ts} +5 -4
  463. package/dist/components/{BbBaseRadioGroup/BbBaseRadioGroup.vue.js → CommonFieldInput/CommonFieldInput.vue.js} +2 -2
  464. package/dist/components/CommonFieldInput/CommonFieldInput.vue_vue_type_script_setup_true_lang.js +116 -0
  465. package/dist/components/CommonFieldInput/boxBorderMatrix.d.ts +10 -0
  466. package/dist/components/{CommonInputWrapper → CommonFieldInput}/types.d.ts +25 -6
  467. package/dist/components/CommonPopover/CommonPopover.vue.d.ts +11 -2
  468. package/dist/components/CommonPopover/CommonPopover.vue_vue_type_script_setup_true_lang.js +65 -53
  469. package/dist/components/CommonPopover/types.d.ts +27 -8
  470. package/dist/components/{BbBaseDatePickerInput/BbBaseDatePickerTimeSelector.vue.d.ts → CommonTimeSelector/CommonTimeSelector.vue.d.ts} +4 -1
  471. package/dist/components/{BbBaseColorPalette/BbBaseColorPalette.vue.js → CommonTimeSelector/CommonTimeSelector.vue.js} +2 -2
  472. package/dist/components/CommonTimeSelector/CommonTimeSelector.vue_vue_type_script_setup_true_lang.js +207 -0
  473. package/dist/components/CommonTimeSelector/types.d.ts +6 -0
  474. package/dist/components/FlatListBox/FlatListBox.vue_vue_type_script_setup_true_lang.js +163 -100
  475. package/dist/components/FlatListBox/types.d.ts +15 -0
  476. package/dist/components/GroupedListBox/GroupedListBox.vue_vue_type_script_setup_true_lang.js +190 -127
  477. package/dist/components/GroupedListBox/types.d.ts +15 -0
  478. package/dist/components/ListBox/ListBox.vue_vue_type_script_setup_true_lang.js +82 -66
  479. package/dist/components/ListBox/types.d.ts +15 -0
  480. package/dist/components/OptionsContainer/OptionsContainer.vue_vue_type_script_setup_true_lang.js +89 -35
  481. package/dist/components/OptionsContainer/types.d.ts +37 -5
  482. package/dist/composables/useBaseOptions.d.ts +12 -1
  483. package/dist/composables/useBaseOptions.js +63 -31
  484. package/dist/composables/useBbConfig.d.ts +27 -6
  485. package/dist/composables/useBbConfig.js +8 -2
  486. package/dist/composables/useBbDropdownContext.d.ts +5 -0
  487. package/dist/composables/useBbTabsContext.d.ts +16 -2
  488. package/dist/composables/useBbTabsContext.js +157 -145
  489. package/dist/composables/useConfig.d.ts +59 -0
  490. package/dist/composables/useConfig.js +11 -0
  491. package/dist/composables/useConfirm.d.ts +33 -2
  492. package/dist/composables/useConfirm.js +43 -40
  493. package/dist/composables/useItemsGetter.d.ts +11 -0
  494. package/dist/composables/useItemsGetter.js +44 -18
  495. package/dist/composables/useLocale.js +10 -7
  496. package/dist/composables/useMobile.js +5 -5
  497. package/dist/composables/usePassthrough.d.ts +206 -0
  498. package/dist/composables/usePassthrough.js +224 -0
  499. package/dist/composables/usePrefill.d.ts +22 -2
  500. package/dist/composables/usePrefill.js +35 -19
  501. package/dist/composables/useSafeAreaInternal.js +1 -1
  502. package/dist/composables/useSegmentedFields.d.ts +2 -2
  503. package/dist/composables/useSsrState.d.ts +20 -0
  504. package/dist/composables/useSsrState.js +13 -0
  505. package/dist/composables/useTableWidthContext.d.ts +24 -4
  506. package/dist/composables/useTableWidthContext.js +31 -28
  507. package/dist/composables/useToast.d.ts +18 -1
  508. package/dist/composables/useToast.js +22 -18
  509. package/dist/composables/useToggleInput.d.ts +44 -0
  510. package/dist/composables/useToggleInput.js +39 -0
  511. package/dist/composables/useViewportWidth.d.ts +20 -6
  512. package/dist/composables/useViewportWidth.js +8 -7
  513. package/dist/deprecation/ai-deprecations.json.d.ts +352 -11
  514. package/dist/deprecation/ai-deprecations.json.js +1 -1
  515. package/dist/directives/bbDropdown.d.ts +15 -4
  516. package/dist/directives/bbDropdown.js +31 -9
  517. package/dist/directives/createPopoverDirective.d.ts +62 -0
  518. package/dist/directives/createPopoverDirective.js +92 -37
  519. package/dist/i18n/locales/cs.json +6 -3
  520. package/dist/i18n/locales/da.json +6 -3
  521. package/dist/i18n/locales/de.json +6 -3
  522. package/dist/i18n/locales/el.json +6 -3
  523. package/dist/i18n/locales/en.json +6 -3
  524. package/dist/i18n/locales/es.json +6 -3
  525. package/dist/i18n/locales/fi.json +6 -3
  526. package/dist/i18n/locales/fr.json +6 -3
  527. package/dist/i18n/locales/hu.json +6 -3
  528. package/dist/i18n/locales/it.json +6 -3
  529. package/dist/i18n/locales/ja.json +6 -3
  530. package/dist/i18n/locales/ko.json +6 -3
  531. package/dist/i18n/locales/nb.json +6 -3
  532. package/dist/i18n/locales/nl.json +6 -3
  533. package/dist/i18n/locales/pl.json +6 -3
  534. package/dist/i18n/locales/pt.json +6 -3
  535. package/dist/i18n/locales/ro.json +6 -3
  536. package/dist/i18n/locales/ru.json +6 -3
  537. package/dist/i18n/locales/sv.json +6 -3
  538. package/dist/i18n/locales/tr.json +6 -3
  539. package/dist/i18n/locales/uk.json +6 -3
  540. package/dist/i18n/locales/zh-cn.json +6 -3
  541. package/dist/icon-scan.d.ts +276 -0
  542. package/dist/icon-scan.js +485 -0
  543. package/dist/icons-whitelist.d.ts +5 -4
  544. package/dist/index.d.ts +25 -4
  545. package/dist/index.js +71 -67
  546. package/dist/input-variants.d.ts +18 -0
  547. package/dist/llms-full.txt +19105 -4677
  548. package/dist/llms-medium.txt +1027 -174
  549. package/dist/llms.txt +13 -10
  550. package/dist/locale-blueprint.json +6 -3
  551. package/dist/nuxt-auto-imports.d.ts +100 -0
  552. package/dist/nuxt-auto-imports.js +55 -0
  553. package/dist/nuxt-module.d.ts +26 -1
  554. package/dist/nuxt.js +26 -9
  555. package/dist/passthrough-deduper.js +5 -0
  556. package/dist/plugin.d.ts +10 -1
  557. package/dist/plugin.js +21 -19
  558. package/dist/pt-scope-registry.d.ts +15 -0
  559. package/dist/runtime/nuxt-plugin.js +29 -21
  560. package/dist/styles.css +1 -1
  561. package/dist/tabs-variants.d.ts +18 -0
  562. package/dist/types/ColumnName.d.ts +1 -1
  563. package/dist/types/CommonProps.d.ts +2 -2
  564. package/dist/types/Config.d.ts +47 -0
  565. package/dist/types/InputVariant.d.ts +22 -0
  566. package/dist/types/ItemProps.d.ts +50 -0
  567. package/dist/types/Option.d.ts +6 -0
  568. package/dist/types/PtScope.d.ts +13 -0
  569. package/dist/types/TabsVariant.d.ts +17 -0
  570. package/dist/types/passthrough.d.ts +332 -0
  571. package/dist/types/passthrough.js +78 -0
  572. package/dist/types/ptComponentMap.d.ts +60 -0
  573. package/dist/utilities/functions/hasVnodeListener.d.ts +16 -0
  574. package/dist/utilities/functions/hasVnodeListener.js +12 -0
  575. package/dist/utilities/functions/itemProps.d.ts +46 -0
  576. package/dist/utilities/functions/itemProps.js +47 -0
  577. package/dist/utilities/functions/slotKey.d.ts +5 -5
  578. package/dist/utilities/functions/slotKey.js +1 -1
  579. package/dist/utilities/functions/toggleInput.d.ts +98 -0
  580. package/dist/utilities/functions/toggleInput.js +56 -0
  581. package/dist/utilities/misc/listboxMetrics.d.ts +9 -3
  582. package/dist/utilities/misc/listboxMetrics.js +5 -2
  583. package/dist/utilities/misc/ssrStateInjectionKey.d.ts +42 -0
  584. package/dist/utilities/misc/ssrStateInjectionKey.js +4 -0
  585. package/dist/utils/cssLayers.d.ts +91 -0
  586. package/dist/utils/cssLayers.js +43 -0
  587. package/dist/utils/injectLibraryStyles.d.ts +3 -1
  588. package/dist/utils/injectLibraryStyles.js +24 -23
  589. package/dist/utils/passthrough.d.ts +63 -0
  590. package/dist/utils/passthrough.js +96 -0
  591. package/dist/utils/passthroughDeduper.d.ts +2 -0
  592. package/dist/utils/passthroughTestKit.d.ts +54 -0
  593. package/dist/utils/ptScope.d.ts +8 -0
  594. package/dist/utils/ptScope.js +4 -0
  595. package/dist/utils/swipeTestKit.d.ts +9 -0
  596. package/dist/validated/BbCheckbox.vue.d.ts +3 -1
  597. package/dist/validated/BbCheckbox.vue_vue_type_script_setup_true_lang.js +82 -23
  598. package/dist/validated/BbCheckboxGroup.vue.d.ts +125 -2
  599. package/dist/validated/BbCheckboxGroup.vue_vue_type_script_setup_true_lang.js +113 -25
  600. package/dist/validated/BbColorInput.vue.d.ts +9 -7
  601. package/dist/validated/BbColorInput.vue_vue_type_script_setup_true_lang.js +145 -25
  602. package/dist/validated/BbDatePickerInput.vue.d.ts +11 -9
  603. package/dist/validated/BbDatePickerInput.vue_vue_type_script_setup_true_lang.js +417 -27
  604. package/dist/validated/BbDropzone.vue_vue_type_script_setup_true_lang.js +17 -1
  605. package/dist/validated/BbForm.vue_vue_type_script_setup_true_lang.js +45 -27
  606. package/dist/validated/BbNumberInput.vue.d.ts +9 -7
  607. package/dist/validated/BbNumberInput.vue_vue_type_script_setup_true_lang.js +115 -25
  608. package/dist/validated/BbRadioGroup.vue.d.ts +124 -2
  609. package/dist/validated/BbRadioGroup.vue_vue_type_script_setup_true_lang.js +113 -25
  610. package/dist/validated/BbRating.vue.d.ts +6 -4
  611. package/dist/validated/BbRating.vue_vue_type_script_setup_true_lang.js +69 -22
  612. package/dist/validated/BbSelect.vue.d.ts +235 -2
  613. package/dist/validated/BbSelect.vue_vue_type_script_setup_true_lang.js +217 -32
  614. package/dist/validated/BbSlider.vue.d.ts +9 -7
  615. package/dist/validated/BbSlider.vue_vue_type_script_setup_true_lang.js +72 -25
  616. package/dist/validated/BbSwitch.vue.d.ts +3 -1
  617. package/dist/validated/BbSwitch.vue_vue_type_script_setup_true_lang.js +82 -23
  618. package/dist/validated/BbSwitchGroup.vue.d.ts +125 -2
  619. package/dist/validated/BbSwitchGroup.vue_vue_type_script_setup_true_lang.js +113 -25
  620. package/dist/validated/BbTag.vue.d.ts +9 -7
  621. package/dist/validated/BbTag.vue_vue_type_script_setup_true_lang.js +122 -25
  622. package/dist/validated/BbTextInput.vue.d.ts +9 -7
  623. package/dist/validated/BbTextInput.vue_vue_type_script_setup_true_lang.js +115 -25
  624. package/dist/validated/BbTextarea.vue.d.ts +9 -7
  625. package/dist/validated/BbTextarea.vue_vue_type_script_setup_true_lang.js +115 -25
  626. package/dist/validated/BbTimePickerInput.vue.d.ts +9 -7
  627. package/dist/validated/BbTimePickerInput.vue_vue_type_script_setup_true_lang.js +175 -25
  628. package/dist/validated/index.d.ts +3 -0
  629. package/dist/validated/useValidatedField.js +25 -23
  630. package/dist/vite-plugin.d.ts +230 -23
  631. package/dist/vite.js +515 -301
  632. package/llms.txt +14 -11
  633. package/package.json +15 -11
  634. package/scripts/lib/component-tree.ts +611 -0
  635. package/scripts/lib/ensure-manifest.mjs +28 -5
  636. package/scripts/lib/eslint-plugin.d.ts +58 -1
  637. package/scripts/lib/eslint-plugin.mjs +899 -17
  638. package/scripts/lib/hand-roll-hints.mjs +50 -6
  639. package/scripts/lib/html-attributes.mjs +133 -0
  640. package/scripts/lib/mcp-config.mjs +38 -34
  641. package/scripts/lib/public-type-exports.mjs +246 -0
  642. package/scripts/lib/validate-bb-markup.mjs +312 -33
  643. package/dist/ai/BbBaseCheckbox.md +0 -49
  644. package/dist/ai/BbBaseCheckboxGroup.md +0 -64
  645. package/dist/ai/BbBaseColorInput.md +0 -65
  646. package/dist/ai/BbBaseColorPalette.md +0 -39
  647. package/dist/ai/BbBaseDatePicker.md +0 -43
  648. package/dist/ai/BbBaseDatePickerInput.md +0 -73
  649. package/dist/ai/BbBaseNumberInput.md +0 -71
  650. package/dist/ai/BbBaseRadio.md +0 -46
  651. package/dist/ai/BbBaseRadioGroup.md +0 -64
  652. package/dist/ai/BbBaseRating.md +0 -52
  653. package/dist/ai/BbBaseSelect.md +0 -88
  654. package/dist/ai/BbBaseSlider.md +0 -56
  655. package/dist/ai/BbBaseSwitch.md +0 -49
  656. package/dist/ai/BbBaseSwitchGroup.md +0 -64
  657. package/dist/ai/BbBaseTag.md +0 -68
  658. package/dist/ai/BbBaseTextInput.md +0 -75
  659. package/dist/ai/BbBaseTextarea.md +0 -62
  660. package/dist/ai/BbBaseTimePickerInput.md +0 -62
  661. package/dist/ai/CommonInputWrapper.md +0 -42
  662. package/dist/ai/source/BbBaseCheckbox.md +0 -461
  663. package/dist/ai/source/BbBaseCheckboxGroup.md +0 -554
  664. package/dist/ai/source/BbBaseColorInput.md +0 -431
  665. package/dist/ai/source/BbBaseColorPalette.md +0 -942
  666. package/dist/ai/source/BbBaseDatePicker.md +0 -1448
  667. package/dist/ai/source/BbBaseDatePickerInput.md +0 -1940
  668. package/dist/ai/source/BbBaseNumberInput.md +0 -617
  669. package/dist/ai/source/BbBaseRadio.md +0 -381
  670. package/dist/ai/source/BbBaseRadioGroup.md +0 -539
  671. package/dist/ai/source/BbBaseRating.md +0 -607
  672. package/dist/ai/source/BbBaseSelect.md +0 -945
  673. package/dist/ai/source/BbBaseSlider.md +0 -1144
  674. package/dist/ai/source/BbBaseSwitch.md +0 -246
  675. package/dist/ai/source/BbBaseSwitchGroup.md +0 -302
  676. package/dist/ai/source/BbBaseTag.md +0 -694
  677. package/dist/ai/source/BbBaseTextInput.md +0 -511
  678. package/dist/ai/source/BbBaseTextarea.md +0 -504
  679. package/dist/ai/source/BbBaseTimePickerInput.md +0 -1037
  680. package/dist/ai/source/CommonInputWrapper.md +0 -584
  681. package/dist/assets/svgs/sort.svg_raw.js +0 -4
  682. package/dist/components/BbBadge/BadgeAppendIcon.vue.d.ts +0 -3
  683. package/dist/components/BbBadge/BadgeAppendIcon.vue.js +0 -5
  684. package/dist/components/BbBadge/BadgeAppendIcon.vue_vue_type_script_setup_true_lang.js +0 -22
  685. package/dist/components/BbBaseCheckbox/BbBaseCheckbox.vue.d.ts +0 -40
  686. package/dist/components/BbBaseCheckbox/BbBaseCheckbox.vue.js +0 -6
  687. package/dist/components/BbBaseCheckbox/BbBaseCheckbox.vue_vue_type_script_setup_true_lang.js +0 -145
  688. package/dist/components/BbBaseCheckbox/types.d.ts +0 -224
  689. package/dist/components/BbBaseCheckboxGroup/BbBaseCheckboxGroup.vue.d.ts +0 -19
  690. package/dist/components/BbBaseCheckboxGroup/BbBaseCheckboxGroup.vue.js +0 -6
  691. package/dist/components/BbBaseCheckboxGroup/BbBaseCheckboxGroup.vue_vue_type_script_setup_true_lang.js +0 -190
  692. package/dist/components/BbBaseCheckboxGroup/types.d.ts +0 -257
  693. package/dist/components/BbBaseColorInput/BbBaseColorInput.vue.d.ts +0 -43
  694. package/dist/components/BbBaseColorInput/BbBaseColorInput.vue.js +0 -6
  695. package/dist/components/BbBaseColorInput/BbBaseColorInput.vue_vue_type_script_setup_true_lang.js +0 -184
  696. package/dist/components/BbBaseColorInput/types.d.ts +0 -219
  697. package/dist/components/BbBaseColorPalette/BbBaseColorPalette.vue.d.ts +0 -13
  698. package/dist/components/BbBaseColorPalette/BbBaseColorPalette.vue_vue_type_script_setup_true_lang.js +0 -395
  699. package/dist/components/BbBaseColorPalette/types.d.ts +0 -40
  700. package/dist/components/BbBaseDatePicker/BbBaseDatePicker.vue.d.ts +0 -20
  701. package/dist/components/BbBaseDatePicker/BbBaseDatePicker.vue.js +0 -6
  702. package/dist/components/BbBaseDatePicker/BbBaseDatePicker.vue_vue_type_script_setup_true_lang.js +0 -407
  703. package/dist/components/BbBaseDatePicker/BbBaseDatePickerInputDaySelector.vue.d.ts +0 -47
  704. package/dist/components/BbBaseDatePicker/BbBaseDatePickerInputDaySelector.vue.js +0 -5
  705. package/dist/components/BbBaseDatePicker/BbBaseDatePickerInputDaySelector.vue_vue_type_script_setup_true_lang.js +0 -318
  706. package/dist/components/BbBaseDatePicker/BbBaseDatePickerMonthSelector.vue.js +0 -5
  707. package/dist/components/BbBaseDatePicker/BbBaseDatePickerMonthSelector.vue_vue_type_script_setup_true_lang.js +0 -115
  708. package/dist/components/BbBaseDatePicker/BbBaseDatePickerYearSelector.vue.js +0 -5
  709. package/dist/components/BbBaseDatePicker/BbBaseDatePickerYearSelector.vue_vue_type_script_setup_true_lang.js +0 -116
  710. package/dist/components/BbBaseDatePicker/types.d.ts +0 -108
  711. package/dist/components/BbBaseDatePicker/useDatePickerContext.js +0 -11
  712. package/dist/components/BbBaseDatePickerInput/BbBaseDatePickerInput.vue.d.ts +0 -31
  713. package/dist/components/BbBaseDatePickerInput/BbBaseDatePickerInput.vue.js +0 -6
  714. package/dist/components/BbBaseDatePickerInput/BbBaseDatePickerInput.vue_vue_type_script_setup_true_lang.js +0 -737
  715. package/dist/components/BbBaseDatePickerInput/BbBaseDatePickerTimeSelector.vue.js +0 -6
  716. package/dist/components/BbBaseDatePickerInput/BbBaseDatePickerTimeSelector.vue_vue_type_script_setup_true_lang.js +0 -204
  717. package/dist/components/BbBaseDatePickerInput/types.d.ts +0 -325
  718. package/dist/components/BbBaseInputContainer/BbBaseInputContainer.vue.js +0 -6
  719. package/dist/components/BbBaseInputContainer/BbBaseInputContainer.vue_vue_type_script_setup_true_lang.js +0 -190
  720. package/dist/components/BbBaseNumberInput/BbBaseNumberInput.vue.d.ts +0 -52
  721. package/dist/components/BbBaseNumberInput/BbBaseNumberInput.vue.js +0 -6
  722. package/dist/components/BbBaseNumberInput/BbBaseNumberInput.vue_vue_type_script_setup_true_lang.js +0 -215
  723. package/dist/components/BbBaseNumberInput/types.d.ts +0 -211
  724. package/dist/components/BbBaseRadio/BbBaseRadio.vue.d.ts +0 -33
  725. package/dist/components/BbBaseRadio/BbBaseRadio.vue_vue_type_script_setup_true_lang.js +0 -113
  726. package/dist/components/BbBaseRadio/types.d.ts +0 -179
  727. package/dist/components/BbBaseRadioGroup/BbBaseRadioGroup.vue.d.ts +0 -19
  728. package/dist/components/BbBaseRadioGroup/BbBaseRadioGroup.vue_vue_type_script_setup_true_lang.js +0 -179
  729. package/dist/components/BbBaseRadioGroup/types.d.ts +0 -223
  730. package/dist/components/BbBaseRating/BbBaseRating.vue.d.ts +0 -38
  731. package/dist/components/BbBaseRating/BbBaseRating.vue.js +0 -6
  732. package/dist/components/BbBaseRating/BbBaseRating.vue_vue_type_script_setup_true_lang.js +0 -192
  733. package/dist/components/BbBaseRating/types.d.ts +0 -176
  734. package/dist/components/BbBaseSelect/BbBaseSelect.vue.d.ts +0 -19
  735. package/dist/components/BbBaseSelect/BbBaseSelect.vue.js +0 -6
  736. package/dist/components/BbBaseSelect/BbBaseSelect.vue_vue_type_script_setup_true_lang.js +0 -311
  737. package/dist/components/BbBaseSelect/types.d.ts +0 -297
  738. package/dist/components/BbBaseSlider/BbBaseSlider.vue.d.ts +0 -35
  739. package/dist/components/BbBaseSlider/BbBaseSlider.vue.js +0 -6
  740. package/dist/components/BbBaseSlider/BbBaseSlider.vue_vue_type_script_setup_true_lang.js +0 -340
  741. package/dist/components/BbBaseSlider/types.d.ts +0 -200
  742. package/dist/components/BbBaseSwitch/BbBaseSwitch.vue.d.ts +0 -35
  743. package/dist/components/BbBaseSwitch/BbBaseSwitch.vue.js +0 -6
  744. package/dist/components/BbBaseSwitch/BbBaseSwitch.vue_vue_type_script_setup_true_lang.js +0 -146
  745. package/dist/components/BbBaseSwitch/types.d.ts +0 -10
  746. package/dist/components/BbBaseSwitchGroup/BbBaseSwitchGroup.vue.d.ts +0 -19
  747. package/dist/components/BbBaseSwitchGroup/BbBaseSwitchGroup.vue.js +0 -6
  748. package/dist/components/BbBaseSwitchGroup/BbBaseSwitchGroup.vue_vue_type_script_setup_true_lang.js +0 -190
  749. package/dist/components/BbBaseSwitchGroup/types.d.ts +0 -8
  750. package/dist/components/BbBaseTag/BbBaseTag.vue.d.ts +0 -50
  751. package/dist/components/BbBaseTag/BbBaseTag.vue.js +0 -6
  752. package/dist/components/BbBaseTag/BbBaseTag.vue_vue_type_script_setup_true_lang.js +0 -266
  753. package/dist/components/BbBaseTag/types.d.ts +0 -160
  754. package/dist/components/BbBaseTextInput/BbBaseTextInput.vue.d.ts +0 -45
  755. package/dist/components/BbBaseTextInput/BbBaseTextInput.vue.js +0 -6
  756. package/dist/components/BbBaseTextInput/BbBaseTextInput.vue_vue_type_script_setup_true_lang.js +0 -200
  757. package/dist/components/BbBaseTextInput/types.d.ts +0 -209
  758. package/dist/components/BbBaseTextarea/BbBaseTextarea.vue.d.ts +0 -39
  759. package/dist/components/BbBaseTextarea/BbBaseTextarea.vue.js +0 -6
  760. package/dist/components/BbBaseTextarea/BbBaseTextarea.vue_vue_type_script_setup_true_lang.js +0 -187
  761. package/dist/components/BbBaseTextarea/types.d.ts +0 -170
  762. package/dist/components/BbBaseTimePickerInput/BbBaseTimePickerInput.vue.d.ts +0 -27
  763. package/dist/components/BbBaseTimePickerInput/BbBaseTimePickerInput.vue.js +0 -6
  764. package/dist/components/BbBaseTimePickerInput/BbBaseTimePickerInput.vue_vue_type_script_setup_true_lang.js +0 -519
  765. package/dist/components/BbBaseTimePickerInput/types.d.ts +0 -151
  766. package/dist/components/CommonInputWrapper/CommonInputWrapper.vue.js +0 -6
  767. package/dist/components/CommonInputWrapper/CommonInputWrapper.vue_vue_type_script_setup_true_lang.js +0 -107
  768. /package/dist/components/{BbBaseDatePicker/BbBaseDatePickerMonthSelector.vue.d.ts → BbCalendar/CalendarMonthPanel.vue.d.ts} +0 -0
  769. /package/dist/components/{BbBaseDatePicker/BbBaseDatePickerYearSelector.vue.d.ts → BbCalendar/CalendarYearPanel.vue.d.ts} +0 -0
  770. /package/dist/{components/BbBaseDatePicker/typeahead.d.ts → composables/useTypeahead.d.ts} +0 -0
  771. /package/dist/{components/BbBaseDatePicker/typeahead.js → composables/useTypeahead.js} +0 -0
package/dist/ai/BbTabs.md CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  - Safety level: **Consumer API**
6
6
  - Group: **Navigation**
7
- - Description: Switches between tabbed content views (shadcn-like strip; BbTabRoot enables split layouts).
7
+ - Description: Switches between tabbed content views (shadcn-like strip; the co-located BbTabsRoot / BbTabsList / BbTabsPanes exports enable split layouts).
8
8
  - Usage rule: Prefer this component for consumer-facing implementations.
9
9
  - Implementation source (only when the contract below is not enough): [source/BbTabs.md](./source/BbTabs.md)
10
10
 
@@ -45,12 +45,10 @@ in one component.
45
45
 
46
46
  ```vue
47
47
  <template>
48
- <div
49
- class="max-w-md rounded-[var(--bb-radius)] border border-[color:var(--bb-border)] p-3"
50
- >
48
+ <div class="max-w-md rounded-(--bb-radius) border border-(--bb-border) p-3">
51
49
  <div class="mb-3 flex flex-col gap-0.5">
52
50
  <p class="text-sm font-medium">Acme Checkout</p>
53
- <p class="text-xs text-[color:var(--bb-text-muted)]">
51
+ <p class="text-xs text-(--bb-text-muted)">
54
52
  Project · last deploy 14m ago
55
53
  </p>
56
54
  </div>
@@ -58,34 +56,34 @@ in one component.
58
56
  <template #overview>
59
57
  <div class="grid gap-1.5 pt-3 text-sm">
60
58
  <p class="font-medium">Health: stable</p>
61
- <p class="text-xs text-[color:var(--bb-text-muted)]">
59
+ <p class="text-xs text-(--bb-text-muted)">
62
60
  Error rate 0.12% · p95 180ms · 3 open incidents
63
61
  </p>
64
62
  </div>
65
63
  </template>
66
64
  <template #activity>
67
- <ul class="divide-y divide-[color:var(--bb-border)] pt-3">
65
+ <ul class="divide-y divide-(--bb-border) pt-3">
68
66
  <li
69
67
  v-for="event in activity"
70
68
  :key="event.id"
71
69
  class="flex flex-col gap-0.5 py-2"
72
70
  >
73
71
  <p class="text-sm">{{ event.text }}</p>
74
- <p class="text-xs text-[color:var(--bb-text-muted)]">
72
+ <p class="text-xs text-(--bb-text-muted)">
75
73
  {{ event.when }}
76
74
  </p>
77
75
  </li>
78
76
  </ul>
79
77
  </template>
80
78
  <template #members>
81
- <ul class="divide-y divide-[color:var(--bb-border)] pt-3">
79
+ <ul class="divide-y divide-(--bb-border) pt-3">
82
80
  <li
83
81
  v-for="member in members"
84
82
  :key="member.email"
85
83
  class="flex items-center justify-between gap-2 py-2 text-sm"
86
84
  >
87
85
  <span class="truncate">{{ member.name }}</span>
88
- <span class="shrink-0 text-xs text-[color:var(--bb-text-muted)]">{{
86
+ <span class="shrink-0 text-xs text-(--bb-text-muted)">{{
89
87
  member.role
90
88
  }}</span>
91
89
  </li>
@@ -136,23 +134,21 @@ dynamic-name slot instead of writing one block per key:
136
134
  **Dynamic pane slots from generated items**
137
135
 
138
136
  ```vue
139
- <div
140
- class="max-w-md rounded-[var(--bb-radius)] border border-[color:var(--bb-border)] p-3"
141
- >
137
+ <div class="max-w-md rounded-(--bb-radius) border border-(--bb-border) p-3">
142
138
  <BbTabs
143
139
  compact
144
140
  :items="[
145
141
  { key: 'draft', label: 'Draft' },
146
- { key: 'in-review', label: 'In review' },
142
+ { key: 'review', label: 'In review' },
147
143
  { key: 'published', label: 'Published' },
148
144
  ]"
149
145
  >
150
146
  <template
151
- v-for="stage in ['draft', 'in-review', 'published']"
147
+ v-for="stage in ['draft', 'review', 'published']"
152
148
  :key="stage"
153
149
  #[stage]
154
150
  >
155
- <p class="pt-3 text-sm capitalize text-[color:var(--bb-text-muted)]">{{ stage }} documents.</p>
151
+ <p class="pt-3 text-sm capitalize text-(--bb-text-muted)">{{ stage }} documents.</p>
156
152
  </template>
157
153
  </BbTabs>
158
154
  </div>
@@ -172,9 +168,7 @@ button or link inside a label — the trigger is already the control).
172
168
 
173
169
  ```vue
174
170
  <template>
175
- <div
176
- class="max-w-md rounded-[var(--bb-radius)] border border-[color:var(--bb-border)] p-3"
177
- >
171
+ <div class="max-w-md rounded-(--bb-radius) border border-(--bb-border) p-3">
178
172
  <BbTabs v-model="active" compact :items="tabs">
179
173
  <template #label:inbox="{ text }">
180
174
  <span class="inline-flex items-center gap-1.5">
@@ -183,26 +177,26 @@ button or link inside a label — the trigger is already the control).
183
177
  </span>
184
178
  </template>
185
179
  <template #inbox>
186
- <ul class="divide-y divide-[color:var(--bb-border)] pt-3">
180
+ <ul class="divide-y divide-(--bb-border) pt-3">
187
181
  <li
188
182
  v-for="thread in inbox"
189
183
  :key="thread.id"
190
184
  class="flex flex-col gap-0.5 py-2"
191
185
  >
192
186
  <p class="text-sm font-medium">{{ thread.subject }}</p>
193
- <p class="text-xs text-[color:var(--bb-text-muted)]">
187
+ <p class="text-xs text-(--bb-text-muted)">
194
188
  {{ thread.from }} · {{ thread.when }}
195
189
  </p>
196
190
  </li>
197
191
  </ul>
198
192
  </template>
199
193
  <template #sent>
200
- <p class="pt-3 text-sm text-[color:var(--bb-text-muted)]">
194
+ <p class="pt-3 text-sm text-(--bb-text-muted)">
201
195
  12 messages sent this week.
202
196
  </p>
203
197
  </template>
204
198
  <template #spam>
205
- <p class="pt-3 text-sm text-[color:var(--bb-text-muted)]">
199
+ <p class="pt-3 text-sm text-(--bb-text-muted)">
206
200
  3 filtered messages · last scan 2h ago.
207
201
  </p>
208
202
  </template>
@@ -255,7 +249,7 @@ const inbox = [
255
249
  .bb-badge.bb-badge--soft-blue {
256
250
  --accent: #2563eb;
257
251
  --bg: color-mix(in oklab, var(--accent) 15%, var(--bb-panel));
258
- --color: color-mix(in oklab, var(--accent) 80%, var(--bb-text));
252
+ --fg: color-mix(in oklab, var(--accent) 80%, var(--bb-text));
259
253
  --border-width: 1px;
260
254
  --border-color: color-mix(in oklab, var(--accent) 25%, var(--bb-panel));
261
255
  --ring: color-mix(in oklab, var(--accent) 45%, transparent);
@@ -290,12 +284,10 @@ the Audience and Schedule tabs:
290
284
 
291
285
  ```vue
292
286
  <template>
293
- <div
294
- class="max-w-md rounded-[var(--bb-radius)] border border-[color:var(--bb-border)] p-3"
295
- >
287
+ <div class="max-w-md rounded-(--bb-radius) border border-(--bb-border) p-3">
296
288
  <div class="mb-3 flex flex-col gap-0.5">
297
289
  <p class="text-sm font-medium">Product announcement</p>
298
- <p class="text-xs text-[color:var(--bb-text-muted)]">
290
+ <p class="text-xs text-(--bb-text-muted)">
299
291
  Draft · scheduled for Tue 09:00 local
300
292
  </p>
301
293
  </div>
@@ -320,7 +312,7 @@ the Audience and Schedule tabs:
320
312
  </div>
321
313
  </template>
322
314
  <template #audience>
323
- <p class="pt-3 text-sm text-[color:var(--bb-text-muted)]">
315
+ <p class="pt-3 text-sm text-(--bb-text-muted)">
324
316
  Sending to
325
317
  <span class="font-medium tabular-nums">{{
326
318
  recipients.toLocaleString()
@@ -329,7 +321,7 @@ the Audience and Schedule tabs:
329
321
  </p>
330
322
  </template>
331
323
  <template #schedule>
332
- <p class="pt-3 text-sm text-[color:var(--bb-text-muted)]">
324
+ <p class="pt-3 text-sm text-(--bb-text-muted)">
333
325
  Queued for Tuesday 09:00 in each recipient's local timezone.
334
326
  </p>
335
327
  </template>
@@ -379,12 +371,10 @@ nothing when you flip back:
379
371
 
380
372
  ```vue
381
373
  <template>
382
- <div
383
- class="max-w-md rounded-[var(--bb-radius)] border border-[color:var(--bb-border)] p-3"
384
- >
374
+ <div class="max-w-md rounded-(--bb-radius) border border-(--bb-border) p-3">
385
375
  <div class="mb-3 flex flex-col gap-0.5">
386
376
  <p class="text-sm font-medium">Release notes</p>
387
- <p class="text-xs text-[color:var(--bb-text-muted)]">
377
+ <p class="text-xs text-(--bb-text-muted)">
388
378
  Markdown draft · preview before publishing.
389
379
  </p>
390
380
  </div>
@@ -405,14 +395,12 @@ nothing when you flip back:
405
395
  </div>
406
396
  </template>
407
397
  <template #preview>
408
- <div class="grid gap-1.5 whitespace-pre-line pt-3 text-sm">
398
+ <div class="grid gap-1.5 pt-3 text-sm whitespace-pre-line">
409
399
  <template v-if="draft.trim()">
410
400
  <p class="font-medium">{{ previewTitle }}</p>
411
- <p class="text-[color:var(--bb-text-muted)]">{{ previewBody }}</p>
401
+ <p class="text-(--bb-text-muted)">{{ previewBody }}</p>
412
402
  </template>
413
- <p v-else class="text-[color:var(--bb-text-muted)]">
414
- Nothing to preview.
415
- </p>
403
+ <p v-else class="text-(--bb-text-muted)">Nothing to preview.</p>
416
404
  </div>
417
405
  </template>
418
406
  </BbTabs>
@@ -470,12 +458,10 @@ active section stays in the URL without flooding Back history:
470
458
 
471
459
  ```vue
472
460
  <template>
473
- <div
474
- class="max-w-md rounded-[var(--bb-radius)] border border-[color:var(--bb-border)] p-3"
475
- >
461
+ <div class="max-w-md rounded-(--bb-radius) border border-(--bb-border) p-3">
476
462
  <div class="mb-3 flex flex-col gap-0.5">
477
463
  <p class="text-sm font-medium">Workspace settings</p>
478
- <p class="text-xs text-[color:var(--bb-text-muted)]">
464
+ <p class="text-xs text-(--bb-text-muted)">
479
465
  Northwind Billing · changes save per section.
480
466
  </p>
481
467
  </div>
@@ -511,7 +497,7 @@ active section stays in the URL without flooding Back history:
511
497
  </div>
512
498
  </template>
513
499
  <template #members>
514
- <ul class="divide-y divide-[color:var(--bb-border)] pt-3">
500
+ <ul class="divide-y divide-(--bb-border) pt-3">
515
501
  <li
516
502
  v-for="member in members"
517
503
  :key="member.email"
@@ -519,11 +505,11 @@ active section stays in the URL without flooding Back history:
519
505
  >
520
506
  <span class="min-w-0 truncate">
521
507
  <span class="font-medium">{{ member.name }}</span>
522
- <span class="text-xs text-[color:var(--bb-text-muted)]">
508
+ <span class="text-xs text-(--bb-text-muted)">
523
509
  · {{ member.email }}</span
524
510
  >
525
511
  </span>
526
- <span class="shrink-0 text-xs text-[color:var(--bb-text-muted)]">{{
512
+ <span class="shrink-0 text-xs text-(--bb-text-muted)">{{
527
513
  member.role
528
514
  }}</span>
529
515
  </li>
@@ -532,7 +518,7 @@ active section stays in the URL without flooding Back history:
532
518
  <template #billing>
533
519
  <div class="grid gap-1.5 pt-3">
534
520
  <p class="text-sm font-medium">Pro · €49 / month</p>
535
- <p class="text-xs text-[color:var(--bb-text-muted)]">
521
+ <p class="text-xs text-(--bb-text-muted)">
536
522
  Next invoice Jul 28, 2026 · Visa ···· 4242
537
523
  </p>
538
524
  <div class="pt-1">
@@ -577,9 +563,7 @@ const onSaveGeneral = async () => {
577
563
  **Full-width strip with a disabled tab**
578
564
 
579
565
  ```vue
580
- <div
581
- class="max-w-md rounded-[var(--bb-radius)] border border-[color:var(--bb-border)] p-3"
582
- >
566
+ <div class="max-w-md rounded-(--bb-radius) border border-(--bb-border) p-3">
583
567
  <BbTabs
584
568
  block
585
569
  compact
@@ -589,9 +573,9 @@ const onSaveGeneral = async () => {
589
573
  { key: 'billing', label: 'Billing', disabled: true },
590
574
  ]"
591
575
  >
592
- <template #summary><p class="pt-3 text-sm text-[color:var(--bb-text-muted)]">Environment status at a glance.</p></template>
593
- <template #integrations><p class="pt-3 text-sm text-[color:var(--bb-text-muted)]">Connected services.</p></template>
594
- <template #billing><p class="pt-3 text-sm text-[color:var(--bb-text-muted)]">Locked on this plan.</p></template>
576
+ <template #summary><p class="pt-3 text-sm text-(--bb-text-muted)">Environment status at a glance.</p></template>
577
+ <template #integrations><p class="pt-3 text-sm text-(--bb-text-muted)">Connected services.</p></template>
578
+ <template #billing><p class="pt-3 text-sm text-(--bb-text-muted)">Locked on this plan.</p></template>
595
579
  </BbTabs>
596
580
  </div>
597
581
  ```
@@ -599,9 +583,7 @@ const onSaveGeneral = async () => {
599
583
  **Vertical, compact strip**
600
584
 
601
585
  ```vue
602
- <div
603
- class="max-w-md rounded-[var(--bb-radius)] border border-[color:var(--bb-border)] p-3"
604
- >
586
+ <div class="max-w-md rounded-(--bb-radius) border border-(--bb-border) p-3">
605
587
  <BbTabs
606
588
  compact
607
589
  direction="vertical"
@@ -611,9 +593,9 @@ const onSaveGeneral = async () => {
611
593
  { key: 'api', label: 'API keys' },
612
594
  ]"
613
595
  >
614
- <template #general><p class="px-3 text-sm text-[color:var(--bb-text-muted)]">Workspace basics.</p></template>
615
- <template #security><p class="px-3 text-sm text-[color:var(--bb-text-muted)]">Sessions and 2FA.</p></template>
616
- <template #api><p class="px-3 text-sm text-[color:var(--bb-text-muted)]">Personal access tokens.</p></template>
596
+ <template #general><p class="px-3 text-sm text-(--bb-text-muted)">Workspace basics.</p></template>
597
+ <template #security><p class="px-3 text-sm text-(--bb-text-muted)">Sessions and 2FA.</p></template>
598
+ <template #api><p class="px-3 text-sm text-(--bb-text-muted)">Personal access tokens.</p></template>
617
599
  </BbTabs>
618
600
  </div>
619
601
  ```
@@ -623,7 +605,286 @@ width — set `style="--max-w: 160px"` on the list and long labels ellipse inste
623
605
  of widening the column. The strip never exceeds its container. Sizing otherwise
624
606
  follows the design tokens (`--bb-control-h`, `--bb-radius`, `--bb-fs`); there is
625
607
  no numeric size prop and no global tabs config to set — tokens and the `block` /
626
- `compact` / `direction` props are the whole surface.
608
+ `compact` / `direction` / `variant` props are the whole surface.
609
+
610
+ ### Variants
611
+
612
+ `variant` picks the strip's look and nothing else — items, `v-model`, keyboard
613
+ navigation, panes, `block` / `compact` / `direction` all behave the same under
614
+ every variant. Three ship:
615
+
616
+ - **`pill`** (default) — the segmented strip: a muted rounded bar with a raised
617
+ pill sliding under the active trigger. Reach for it to switch _views of the
618
+ same content_ (Board / Table, Code / Preview).
619
+ - **`line`** — triggers on a thin baseline, a sliding underline under the active
620
+ one (on the side edge when `direction="vertical"`), active label bold. Reach
621
+ for it to navigate _sections of a page_ (Overview / Activity / Settings).
622
+ - **`none`** — behaviour and structure only, no chrome: no strip, no indicator
623
+ paint, labels inherit the host's colour and weight. Reach for it when the
624
+ design is yours, styled through `pt` and classes, like `BbButton`'s `none`.
625
+
626
+ **pill — switching views of one list**
627
+
628
+ ```vue
629
+ <div class="max-w-md rounded-(--bb-radius) border border-(--bb-border) p-3">
630
+ <BbTabs
631
+ :items="[
632
+ { key: 'board', label: 'Board' },
633
+ { key: 'table', label: 'Table' },
634
+ { key: 'calendar', label: 'Calendar' },
635
+ ]"
636
+ >
637
+ <template #board><p class="pt-3 text-sm text-(--bb-text-muted)">Cards by status.</p></template>
638
+ <template #table><p class="pt-3 text-sm text-(--bb-text-muted)">One row per task.</p></template>
639
+ <template #calendar><p class="pt-3 text-sm text-(--bb-text-muted)">Due dates on a month grid.</p></template>
640
+ </BbTabs>
641
+ </div>
642
+ ```
643
+
644
+ **line — navigating the sections of a record**
645
+
646
+ ```vue
647
+ <div class="max-w-md rounded-(--bb-radius) border border-(--bb-border) p-3">
648
+ <BbTabs
649
+ :items="[
650
+ { key: 'overview', label: 'Overview' },
651
+ { key: 'activity', label: 'Activity' },
652
+ { key: 'settings', label: 'Settings' },
653
+ ]"
654
+ variant="line"
655
+ >
656
+ <template #overview><p class="pt-3 text-sm text-(--bb-text-muted)">Status, owner, next step.</p></template>
657
+ <template #activity><p class="pt-3 text-sm text-(--bb-text-muted)">Everything that happened, newest first.</p></template>
658
+ <template #settings><p class="pt-3 text-sm text-(--bb-text-muted)">Notifications and access.</p></template>
659
+ </BbTabs>
660
+ </div>
661
+ ```
662
+
663
+ `line` composes with everything else: `compact` drops the baseline strip to
664
+ 28px, `direction="vertical"` moves the bar to the side edge of a column strip,
665
+ and the bar keeps sliding — it is the same measured element as the pill.
666
+
667
+ **line, vertical and compact**
668
+
669
+ ```vue
670
+ <div class="max-w-md rounded-(--bb-radius) border border-(--bb-border) p-3">
671
+ <BbTabs
672
+ compact
673
+ direction="vertical"
674
+ :items="[
675
+ { key: 'profile', label: 'Profile' },
676
+ { key: 'sessions', label: 'Sessions' },
677
+ { key: 'tokens', label: 'API tokens' },
678
+ ]"
679
+ variant="line"
680
+ >
681
+ <template #profile><p class="px-3 text-sm text-(--bb-text-muted)">Name, avatar, locale.</p></template>
682
+ <template #sessions><p class="px-3 text-sm text-(--bb-text-muted)">Signed-in devices.</p></template>
683
+ <template #tokens><p class="px-3 text-sm text-(--bb-text-muted)">Personal access tokens.</p></template>
684
+ </BbTabs>
685
+ </div>
686
+ ```
687
+
688
+ `none` renders the same tablist with no paint of its own, so the look is
689
+ whatever you put on the parts — here the trigger gets a bottom border while
690
+ active through `pt:item:active`:
691
+
692
+ **none — your own look through pt**
693
+
694
+ ```vue
695
+ <div class="max-w-md rounded-(--bb-radius) border border-(--bb-border) p-3">
696
+ <BbTabs
697
+ :items="[
698
+ { key: 'week', label: 'This week' },
699
+ { key: 'month', label: 'This month' },
700
+ { key: 'year', label: 'This year' },
701
+ ]"
702
+ pt:item="border-b-2 border-transparent text-(--bb-text-muted) uppercase tracking-wide text-xs"
703
+ pt:item:active="border-(--bb-text) text-(--bb-text)"
704
+ variant="none"
705
+ >
706
+ <template #week><p class="pt-3 text-sm text-(--bb-text-muted)">7 days of activity.</p></template>
707
+ <template #month><p class="pt-3 text-sm text-(--bb-text-muted)">30 days of activity.</p></template>
708
+ <template #year><p class="pt-3 text-sm text-(--bb-text-muted)">12 months of activity.</p></template>
709
+ </BbTabs>
710
+ </div>
711
+ ```
712
+
713
+ On the split layout `variant` set on `BbTabsRoot` is the default for every
714
+ `BbTabsList` under it, and a list can take its own `variant` to differ.
715
+
716
+ #### The token model
717
+
718
+ Every variant — shipped or registered — is a preset of one set of custom
719
+ properties declared on `.bb-tabs-list`. Set them on the strip (or on a class
720
+ you put on it) to retune one instance; set them on a `.bb-tabs-list--<name>`
721
+ class to define a variant. `pill` is the base values; `line` and `none` are the
722
+ presets shown in the last two columns.
723
+
724
+ | Custom property | What it paints | `line` | `none` |
725
+ | ----------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- | --------------------- | ------------- |
726
+ | **Strip** — `--list-bg` | the bar behind the triggers | `transparent` | `transparent` |
727
+ | `--list-border` | the strip's edge line: a baseline under the triggers (beside them when vertical), `--bb-border-w` thick, painted inside the strip | `var(--bb-border)` | — |
728
+ | `--p` | inner padding — the gutter the indicator sits in and the scroll inset | `0px` | `0px` |
729
+ | `--list-r`, `--list-h` | corners, min height | `--list-r: 0px` | `0px` |
730
+ | **Triggers** — `--trigger-gap` | space between triggers | — | — |
731
+ | `--trigger-px`, `--trigger-min-h`, `--trigger-r`, `--fs` | side padding, min height (derived from `--list-h` and `--p`), corners (concentric inside `--list-r`), label size | `--trigger-r` small | — |
732
+ | **Labels** — `--list-fg`, `--hover-fg` | inactive and hovered label colour | — | `inherit` |
733
+ | `--active-fg`, `--active-fw` | active label colour and weight (inactive labels are `500`) | `--active-fw: 600` | `inherit` |
734
+ | **Indicator** — `--indicator-bg`, `--indicator-border`, `--indicator-r` | the sliding element's fill, edge and corners | primary fill, no edge | transparent |
735
+ | `--indicator-h` | its thickness: height (width when vertical). `initial` fills the whole trigger box — the pill; `2px` is a bar on the bottom/side edge | `2px` | — |
736
+ | `--indicator-inset` | inset from the trigger box — shrinks a pill; a bar keeps its thickness, shortens by it at both ends and floats it above the edge | — | — |
737
+ | `--indicator-shadow`, `--elev` | the indicator's own lift, and the theme's resting lift composed under it | `none` | `none` |
738
+
739
+ A text-only look with no underline is `line` with `--indicator-h: 0px`; a
740
+ thicker bar is `--indicator-h: 3px`; a bar the width of the label rather than
741
+ the trigger is `--indicator-inset: var(--trigger-px)`. The generated contract
742
+ lists every property with its default.
743
+
744
+ #### Registered variants
745
+
746
+ The two looks other libraries ship as `pills` and `outline` are a registered
747
+ name and a token block away. Register the name in the build plugin so it
748
+ type-checks —
749
+
750
+ ```ts
751
+ // vite.config.ts (or the `bitboss` key of nuxt.config.ts)
752
+ bitbossUi({ tabsVariants: ['soft', 'outline'] });
753
+ ```
754
+
755
+ — then give the class hook `.bb-tabs-list--<name>` its tokens in a stylesheet
756
+ loaded after the library's, and use `variant="<name>"`. **`soft`** — no strip,
757
+ the active trigger is a filled tonal pill, the rest is plain text; the whole
758
+ recipe is the `<style>` of the example:
759
+
760
+ **soft — a registered tonal-pill variant**
761
+
762
+ ```vue
763
+ <template>
764
+ <div class="max-w-md rounded-(--bb-radius) border border-(--bb-border) p-3">
765
+ <p class="mb-2 text-xs text-(--bb-text-muted)">Inbox filters</p>
766
+ <!-- `soft` is a registered variant (`tabsVariants: ['soft']`); its look is
767
+ the token block in this file's <style>. -->
768
+ <BbTabs v-model="filter" compact :items="filters" variant="soft">
769
+ <template #all>
770
+ <p class="pt-3 text-sm text-(--bb-text-muted)">
771
+ Every conversation, newest first.
772
+ </p>
773
+ </template>
774
+ <template #unread>
775
+ <p class="pt-3 text-sm text-(--bb-text-muted)">
776
+ 12 conversations waiting for a reply.
777
+ </p>
778
+ </template>
779
+ <template #starred>
780
+ <p class="pt-3 text-sm text-(--bb-text-muted)">
781
+ Pinned threads you come back to.
782
+ </p>
783
+ </template>
784
+ </BbTabs>
785
+ </div>
786
+ </template>
787
+ <script setup lang="ts">
788
+ import { ref } from 'vue';
789
+ import { BbTabs } from 'bitboss-ui';
790
+ import type { BbTabsItem } from 'bitboss-ui';
791
+
792
+ type Filter = 'all' | 'unread' | 'starred';
793
+
794
+ const filters: Array<BbTabsItem<Filter>> = [
795
+ { key: 'all', label: 'All' },
796
+ { key: 'unread', label: 'Unread' },
797
+ { key: 'starred', label: 'Starred' },
798
+ ];
799
+ const filter = ref<Filter>('unread');
800
+ </script>
801
+ <style>
802
+ /* `soft` — no strip, the active trigger is a filled tonal pill, the rest is
803
+ plain text. The whole recipe: the class hook plus the strip's own tokens. */
804
+ .bb-tabs-list--soft {
805
+ --list-bg: transparent;
806
+ --trigger-gap: 4px;
807
+ --trigger-r: 999px;
808
+ --indicator-bg: color-mix(in oklab, var(--bb-primary) 15%, transparent);
809
+ --indicator-border: transparent;
810
+ --indicator-shadow: none;
811
+ --elev: none;
812
+ --active-fg: var(--bb-primary);
813
+ --active-fw: 600;
814
+ }
815
+ </style>
816
+ ```
817
+
818
+ **`outline`** — a 1px-framed strip with no fill and an outlined indicator
819
+ sliding inside it. The frame is the one thing the token model does not draw
820
+ (`--list-border` is a baseline, not a box), so this recipe adds one rule on the
821
+ tablist beside its tokens:
822
+
823
+ **outline — a registered framed variant**
824
+
825
+ ```vue
826
+ <template>
827
+ <div class="max-w-md rounded-(--bb-radius) border border-(--bb-border) p-3">
828
+ <p class="mb-2 text-xs text-(--bb-text-muted)">Editor panel</p>
829
+ <!-- `outline` is a registered variant (`tabsVariants: ['outline']`); its
830
+ look is the token block in this file's <style>. -->
831
+ <BbTabs v-model="panel" compact :items="panels" variant="outline">
832
+ <template #code>
833
+ <pre
834
+ class="mt-3 rounded-(--bb-radius) bg-(--bb-muted) p-2 text-xs"
835
+ ><code>const total = lines.reduce((sum, l) => sum + l.amount, 0);</code></pre>
836
+ </template>
837
+ <template #preview>
838
+ <p class="pt-3 text-sm text-(--bb-text-muted)">
839
+ Total: <span class="font-medium text-(--bb-text)">€ 1,240.00</span>
840
+ </p>
841
+ </template>
842
+ <template #diff>
843
+ <p class="pt-3 text-sm text-(--bb-text-muted)">
844
+ 2 lines changed since the last save.
845
+ </p>
846
+ </template>
847
+ </BbTabs>
848
+ </div>
849
+ </template>
850
+ <script setup lang="ts">
851
+ import { ref } from 'vue';
852
+ import { BbTabs } from 'bitboss-ui';
853
+ import type { BbTabsItem } from 'bitboss-ui';
854
+
855
+ type Panel = 'code' | 'preview' | 'diff';
856
+
857
+ const panels: Array<BbTabsItem<Panel>> = [
858
+ { key: 'code', label: 'Code' },
859
+ { key: 'preview', label: 'Preview' },
860
+ { key: 'diff', label: 'Diff' },
861
+ ];
862
+ const panel = ref<Panel>('code');
863
+ </script>
864
+ <style>
865
+ /* `outline` — a 1px-framed strip with no fill, and an outlined indicator (a
866
+ border, no lift) sliding inside it. Tokens for the paint; one rule for the
867
+ frame, which the token model does not draw (`--list-border` is the
868
+ baseline of a `line` strip, not a box). */
869
+ .bb-tabs-list--outline {
870
+ --list-bg: transparent;
871
+ --indicator-bg: transparent;
872
+ --indicator-border: var(--bb-text-muted);
873
+ --indicator-shadow: none;
874
+ --elev: none;
875
+ --active-fg: var(--bb-text);
876
+ --active-fw: 600;
877
+ }
878
+ .bb-tabs-list--outline .bb-tabs-list__tablist {
879
+ box-shadow: inset 0 0 0 var(--bb-border-w) var(--bb-border);
880
+ }
881
+ </style>
882
+ ```
883
+
884
+ An unregistered name fails `vue-tsc`, like every other variant registry (see
885
+ the [installation guide](./guides/installation-and-plugin-setup.md), _Variant
886
+ registries_). The class is plain interpolation at runtime, so a one-off can be
887
+ forced with a cast — register it instead.
627
888
 
628
889
  ### Overflowing strips and scroll affordances
629
890
 
@@ -640,12 +901,10 @@ ends.
640
901
 
641
902
  ```vue
642
903
  <template>
643
- <div
644
- class="max-w-md rounded-[var(--bb-radius)] border border-[color:var(--bb-border)] p-3"
645
- >
904
+ <div class="max-w-md rounded-(--bb-radius) border border-(--bb-border) p-3">
646
905
  <div class="mb-3 flex flex-col gap-0.5">
647
906
  <p class="text-sm font-medium">Release timeline</p>
648
- <p class="text-xs text-[color:var(--bb-text-muted)]">
907
+ <p class="text-xs text-(--bb-text-muted)">
649
908
  Monthly notes · scroll arrows when the strip overflows.
650
909
  </p>
651
910
  </div>
@@ -672,8 +931,19 @@ ends.
672
931
  @click="scroll('right')"
673
932
  />
674
933
  </template>
675
- <template v-for="release in releases" :key="release.key" #[release.key]>
676
- <p class="pt-3 text-sm text-[color:var(--bb-text-muted)]">
934
+ <!--
935
+ `slotKey(...)`, never the raw key. A pane's slot name is the
936
+ NORMALIZED key: `v3.0` becomes `v3_0`, so `#[release.key]` would
937
+ name a slot that never matches and every pane would silently render
938
+ empty. The keys here carry a dot on purpose — with slug-safe keys
939
+ (`v1`…`v9`) the mistake is invisible.
940
+ -->
941
+ <template
942
+ v-for="release in releases"
943
+ :key="release.key"
944
+ #[slotKey(release.key)]
945
+ >
946
+ <p class="pt-3 text-sm text-(--bb-text-muted)">
677
947
  {{ release.label }} shipped the design-token overhaul and the tabs
678
948
  keyboard-navigation pass.
679
949
  </p>
@@ -683,7 +953,7 @@ ends.
683
953
  </template>
684
954
  <script setup lang="ts">
685
955
  import { ref } from 'vue';
686
- import { BbButton, BbTabs } from 'bitboss-ui';
956
+ import { BbButton, BbTabs, slotKey } from 'bitboss-ui';
687
957
  import type { BbTabsItem } from 'bitboss-ui';
688
958
 
689
959
  // A block strip with more triggers than fit: the pill and scroll-into-view keep
@@ -700,12 +970,14 @@ const months = [
700
970
  'August',
701
971
  'September',
702
972
  ];
973
+ // Realistic release tags: `v3.0` … `v3.8`. The dot is what makes the
974
+ // `slotKey` call in the template load-bearing (see the note there).
703
975
  const releases: BbTabsItem[] = months.map((label, index) => ({
704
- key: `v${index + 1}`,
705
- label: `${label} 2026`,
976
+ key: `v3.${index}`,
977
+ label: `${label} · v3.${index}`,
706
978
  }));
707
979
 
708
- const active = ref('v1');
980
+ const active = ref('v3.0');
709
981
  </script>
710
982
  ```
711
983
 
@@ -732,12 +1004,10 @@ context; use nesting freely.
732
1004
 
733
1005
  ```vue
734
1006
  <template>
735
- <div
736
- class="max-w-md rounded-[var(--bb-radius)] border border-[color:var(--bb-border)] p-3"
737
- >
1007
+ <div class="max-w-md rounded-(--bb-radius) border border-(--bb-border) p-3">
738
1008
  <div class="mb-3 flex flex-col gap-0.5">
739
1009
  <p class="text-sm font-medium">Acme Checkout</p>
740
- <p class="text-xs text-[color:var(--bb-text-muted)]">
1010
+ <p class="text-xs text-(--bb-text-muted)">
741
1011
  Workspace · Prev/Next via root slot
742
1012
  </p>
743
1013
  </div>
@@ -764,21 +1034,21 @@ context; use nesting freely.
764
1034
  </BbButton>
765
1035
  </div>
766
1036
  </div>
767
- <hr class="my-3 border-[color:var(--bb-border)]" />
1037
+ <hr class="my-3 border-(--bb-border)" />
768
1038
  <BbTabsPanes>
769
1039
  <template #overview>
770
- <p class="text-sm text-[color:var(--bb-text-muted)]">
1040
+ <p class="text-sm text-(--bb-text-muted)">
771
1041
  Health stable · owners Alex + Sam · objective: cut checkout
772
1042
  latency 20%.
773
1043
  </p>
774
1044
  </template>
775
1045
  <template #activity>
776
- <p class="text-sm text-[color:var(--bb-text-muted)]">
1046
+ <p class="text-sm text-(--bb-text-muted)">
777
1047
  Shipped billing retries; fixed avatar upload timeout.
778
1048
  </p>
779
1049
  </template>
780
1050
  <template #members>
781
- <p class="text-sm text-[color:var(--bb-text-muted)]">
1051
+ <p class="text-sm text-(--bb-text-muted)">
782
1052
  14 editors, 23 viewers, 3 billing admins.
783
1053
  </p>
784
1054
  </template>
@@ -841,7 +1111,7 @@ the tabs jumps straight to the Security section:
841
1111
  ```vue
842
1112
  <template>
843
1113
  <div
844
- class="max-w-md space-y-3 rounded-[var(--bb-radius)] border border-[color:var(--bb-border)] p-3"
1114
+ class="max-w-md space-y-3 rounded-(--bb-radius) border border-(--bb-border) p-3"
845
1115
  >
846
1116
  <div class="grid gap-2">
847
1117
  <BbAlert
@@ -888,7 +1158,7 @@ the tabs jumps straight to the Security section:
888
1158
  <template #security>
889
1159
  <div class="grid gap-1.5 pt-3 text-sm">
890
1160
  <p class="font-medium">Two-factor authentication</p>
891
- <p class="text-xs text-[color:var(--bb-text-muted)]">
1161
+ <p class="text-xs text-(--bb-text-muted)">
892
1162
  Off · last password change Mar 12, 2026 · 2 active sessions
893
1163
  </p>
894
1164
  <div class="pt-1">
@@ -899,15 +1169,12 @@ the tabs jumps straight to the Security section:
899
1169
  </div>
900
1170
  </template>
901
1171
  <template #notifications>
902
- <p class="pt-3 text-sm text-[color:var(--bb-text-muted)]">
1172
+ <p class="pt-3 text-sm text-(--bb-text-muted)">
903
1173
  Email digests and mention alerts for alex@northwind.io.
904
1174
  </p>
905
1175
  </template>
906
1176
  </BbTabs>
907
- <p
908
- class="text-xs text-[color:var(--bb-text-muted)]"
909
- data-test="active-section"
910
- >
1177
+ <p class="text-xs text-(--bb-text-muted)" data-test="active-section">
911
1178
  Active section: {{ current }}
912
1179
  </p>
913
1180
  </div>
@@ -1067,6 +1334,134 @@ route, so it is SSR-safe and shareable:
1067
1334
  <BbTabs :items="items" navigation replace query-key="section" />
1068
1335
  ```
1069
1336
 
1337
+ ### Restyling with passthrough
1338
+
1339
+ On the split layout the same `pt` props live on `BbTabsRoot` (it owns the
1340
+ context the list and the panes render from); `BbTabsList` and `BbTabsPanes`
1341
+ declare no `pt` of their own.
1342
+
1343
+ `pt` reaches a named part with a class list — or, in the object form, a
1344
+ style and attributes — optionally only while a state is on. Parts: `root`,
1345
+ `item` (one tab trigger, a broadcast) and `panel` (one pane, a broadcast).
1346
+ States, per tab: `active` (the current trigger / the shown pane) and
1347
+ `disabled`. Tabs do not "open", so there is no `open`; the sliding indicator
1348
+ is not a part — its paint is the strip's tokens (see _Variants_).
1349
+
1350
+ The workspace settings above, restyled through those parts: type on
1351
+ `pt:item`, weight on `pt:item:active`, pane padding on `pt:panel`. A look
1352
+ that depends on the TAB'S OWN DATA — a tab flagged by a count you put on its
1353
+ descriptor — is a per-item function on `pt:item`:
1354
+ `:pt:item="({ item, states }) => item.badge && 'text-red-600'"`, called with
1355
+ the element of `items` and the states on for that tab, merged after
1356
+ `pt:item:active`. `panel` takes no function.
1357
+
1358
+ **pt:item and pt:panel — settings sections**
1359
+
1360
+ ```vue
1361
+ <template>
1362
+ <div class="max-w-md rounded-(--bb-radius) border border-(--bb-border) p-3">
1363
+ <div class="mb-3 flex flex-col gap-0.5">
1364
+ <p class="text-sm font-medium">Workspace settings</p>
1365
+ <p class="text-xs text-(--bb-text-muted)">
1366
+ Northwind Billing · changes save per section.
1367
+ </p>
1368
+ </div>
1369
+ <BbTabs
1370
+ v-model="section"
1371
+ block
1372
+ :items="tabs"
1373
+ pt:item="text-sm"
1374
+ pt:item:active="font-semibold"
1375
+ pt:panel="pt-3 text-sm"
1376
+ >
1377
+ <template #general>
1378
+ <div class="grid gap-3">
1379
+ <BbTextInput
1380
+ v-model="org.name"
1381
+ compact
1382
+ label="Workspace name"
1383
+ name="workspace-name"
1384
+ />
1385
+ <BbTextInput
1386
+ v-model="org.slug"
1387
+ compact
1388
+ label="URL slug"
1389
+ name="workspace-slug"
1390
+ prepend:icon="lucide:link"
1391
+ />
1392
+ <div class="flex justify-end">
1393
+ <BbButton variant="primary" @click="onSaveGeneral">
1394
+ Save general
1395
+ </BbButton>
1396
+ </div>
1397
+ </div>
1398
+ </template>
1399
+ <template #members>
1400
+ <ul class="divide-y divide-(--bb-border)">
1401
+ <li
1402
+ v-for="member in members"
1403
+ :key="member.email"
1404
+ class="flex items-center justify-between gap-2 py-2 text-sm"
1405
+ >
1406
+ <span class="min-w-0 truncate">
1407
+ <span class="font-medium">{{ member.name }}</span>
1408
+ <span class="text-xs text-(--bb-text-muted)">
1409
+ · {{ member.email }}</span
1410
+ >
1411
+ </span>
1412
+ <span class="shrink-0 text-xs text-(--bb-text-muted)">{{
1413
+ member.role
1414
+ }}</span>
1415
+ </li>
1416
+ </ul>
1417
+ </template>
1418
+ <template #billing>
1419
+ <div class="grid gap-1.5">
1420
+ <p class="font-medium">Pro · €49 / month</p>
1421
+ <p class="text-xs text-(--bb-text-muted)">
1422
+ Next invoice Jul 28, 2026 · Visa ···· 4242
1423
+ </p>
1424
+ <div class="pt-1">
1425
+ <BbButton prepend:icon="lucide:credit-card" variant="outline">
1426
+ Manage billing
1427
+ </BbButton>
1428
+ </div>
1429
+ </div>
1430
+ </template>
1431
+ </BbTabs>
1432
+ </div>
1433
+ </template>
1434
+
1435
+ <script setup lang="ts">
1436
+ import { reactive, ref } from 'vue';
1437
+ import { BbButton, BbTabs, BbTextInput } from 'bitboss-ui';
1438
+ import type { BbTabsItem } from 'bitboss-ui';
1439
+
1440
+ type Section = 'general' | 'members' | 'billing';
1441
+
1442
+ const tabs: Array<BbTabsItem<Section>> = [
1443
+ { key: 'general', label: 'General' },
1444
+ { key: 'members', label: 'Members' },
1445
+ { key: 'billing', label: 'Billing' },
1446
+ ];
1447
+
1448
+ const section = ref<Section>('general');
1449
+ const org = reactive({ name: 'Northwind Billing', slug: 'northwind' });
1450
+ const members = [
1451
+ { name: 'Alex Rivera', email: 'alex@northwind.io', role: 'Owner' },
1452
+ { name: 'Sam Chen', email: 'sam@northwind.io', role: 'Admin' },
1453
+ { name: 'Jordan Lee', email: 'jordan@northwind.io', role: 'Editor' },
1454
+ ];
1455
+
1456
+ const onSaveGeneral = async () => {
1457
+ await new Promise((resolve) => setTimeout(resolve, 400));
1458
+ };
1459
+ </script>
1460
+ ```
1461
+
1462
+ The full grammar, the merge rules and the global map are in the
1463
+ [passthrough guide](./guides/passthrough.md).
1464
+
1070
1465
  ### Works well with
1071
1466
 
1072
1467
  - **`BbBadge` / count pills in `label` slots** — status dots and unread counts
@@ -1082,11 +1477,15 @@ route, so it is SSR-safe and shareable:
1082
1477
 
1083
1478
  ### Gotchas and anti-patterns
1084
1479
 
1085
- - **The sliding pill is measured from layout.** It reads the active trigger's
1086
- `offsetLeft`/`offsetTop`, so render tabs in a visible, normally-positioned
1087
- container. It settles itself on mount, resize, and font load, and paints a
1088
- static pill until the first measurement lands — nothing to configure, and
1089
- nothing to fight in demos.
1480
+ - **The sliding indicator is measured from layout.** It reads the active
1481
+ trigger's `offsetLeft`/`offsetTop`, so render tabs in a visible,
1482
+ normally-positioned container. It settles itself on mount, resize, and font
1483
+ load, and paints a static pill (or bar) until the first measurement lands —
1484
+ nothing to configure, and nothing to fight in demos.
1485
+ - **Do not fake a variant with `pt`.** An underline built from
1486
+ `pt:item:active="border-b-2 …"` on a `pill` strip fights the pill; use
1487
+ `variant="line"` (or a registered token preset) and keep `pt` for what is
1488
+ genuinely per-call-site.
1090
1489
  - **Vertical strips answer Up/Down _and_ Left/Right arrows.** Up/Down is the
1091
1490
  primary pair (matching the vertical `aria-orientation`, per the ARIA APG);
1092
1491
  Left/Right keeps working as a forgiving extra. Horizontal strips answer
@@ -1105,8 +1504,11 @@ route, so it is SSR-safe and shareable:
1105
1504
  - **Don't reach for `BbTabsRoot` by default.** If you only need a strip over its
1106
1505
  panes, `BbTabs` is less markup and identical behavior; split only for markup
1107
1506
  between them.
1108
- - **Every tab disabled throws.** With no `modelValue` and no valid first tab the
1109
- group has nothing to select — always leave at least one enabled tab.
1507
+ - **Every tab disabled renders an inert tablist** — it does not throw. With no
1508
+ `modelValue` and no enabled tab there is nothing to select, so the strip
1509
+ renders with no active tab and no pane (`useBbTabsContext.ts:200-206` handles
1510
+ this deliberately). Nothing warns, so an all-disabled group looks like a
1511
+ rendering bug; leave at least one tab enabled, or hide the strip.
1110
1512
 
1111
1513
  ### Accessibility
1112
1514
 
@@ -1139,18 +1541,19 @@ route, so it is SSR-safe and shareable:
1139
1541
 
1140
1542
  | Prop | Type | Default | Required | Description |
1141
1543
  | --- | --- | --- | --- | --- |
1142
- | `block` | `boolean \| undefined` | | | Displays the component as full width. |
1143
- | `compact` | `boolean \| undefined` | | | Adds a CSS class that applies a compact style to the component. |
1544
+ | `pt:<part>`, `pt:<part>:<state>`, `pt` | `PtValue` | | | Passthrough — a class list, or `{ class, style, attrs }`, bound to one named part of the component; the state form applies only while that state is on. Parts: `item`, `panel`, `root`. States: `active`, `disabled`. What each one is: _Passthrough parts and states_ below. `pt` is the object form with the same keys minus the prefix (`{ icon: '…', 'icon:loading': '…' }`). See `guides/passthrough.md`. |
1545
+ | `block` | `boolean \| undefined` | `false` | | Displays the component as full width. |
1546
+ | `compact` | `boolean \| undefined` | `false` | | Adds a CSS class that applies a compact style to the component. |
1144
1547
  | `direction` | `"horizontal" \| "vertical" \| undefined` | `"horizontal"` | | Direction of the tabs component. |
1145
- | `disableAnimateX` | `boolean \| undefined` | | | Disables the horizontal slide transition between tab panels (enabled by default). |
1146
- | `disableAnimateY` | `boolean \| undefined` | | | Disables the smooth height animation when switching between tab panels (enabled by default). |
1147
- | `disabled` | `boolean \| undefined` | | | Disables the component |
1148
- | `eager` | `boolean \| undefined` | | | Prevents rendering content before it's made visible. |
1548
+ | `disableAnimateX` | `boolean \| undefined` | `false` | | Disables the horizontal slide transition between tab panels (enabled by default). |
1549
+ | `disableAnimateY` | `boolean \| undefined` | `false` | | Disables the smooth height animation when switching between tab panels (enabled by default). |
1550
+ | `disabled` | `boolean \| undefined` | `false` | | Disables the component |
1551
+ | `eager` | `boolean \| undefined` | `false` | | Prevents rendering content before it's made visible. |
1149
1552
  | `headers` | `Record<string, string> \| undefined` | | | Additional HTTP headers forwarded to Inertia when navigation is triggered. Only meaningful in an Inertia context. |
1150
1553
  | `id` | `string \| undefined` | | | The identifier of the component. |
1151
1554
  | `items` | `BbTabsItem<K>[]` | | yes | Array of items that define the tabs in the component. |
1152
1555
  | `modelValue` | `K \| null \| undefined` | | | The current tab key. Used by v-model. |
1153
- | `navigation` | `boolean \| undefined` | | | Synchronizes the current tab with the URL query parameter. Pair it with `replace` unless a tab is genuinely a separate destination — see the `replace` prop. |
1556
+ | `navigation` | `boolean \| undefined` | `false` | | Synchronizes the current tab with the URL query parameter. Pair it with `replace` unless a tab is genuinely a separate destination — see the `replace` prop. |
1154
1557
  | `onBefore` | `(() => boolean \| void) \| undefined` | | | Inertia lifecycle hook — fired just before the request is sent. Return `false` to cancel the visit. |
1155
1558
  | `onCancel` | `(() => void) \| undefined` | | | Inertia lifecycle hook — fired when the request is cancelled. |
1156
1559
  | `onError` | `((errors: Record<string, string>) => void) \| undefined` | | | Inertia lifecycle hook — fired when the server returns validation errors. |
@@ -1162,8 +1565,26 @@ route, so it is SSR-safe and shareable:
1162
1565
  | `preserveScroll` | `boolean \| ((props: Record<string, unknown>) => boolean) \| undefined` | | | Controls whether Inertia preserves the scroll position after navigation. Only meaningful in an Inertia context. |
1163
1566
  | `preserveState` | `boolean \| ((props: Record<string, unknown>) => boolean) \| null \| undefined` | | | Controls whether Inertia preserves the current component state after navigation. Only meaningful in an Inertia context. |
1164
1567
  | `queryKey` | `string \| undefined` | `"tab"` | | Defines the query key used for URL-based navigation. |
1165
- | `replace` | `boolean \| undefined` | | | Uses history replacement instead of push navigation. Prefer `replace` whenever `navigation` is on: the URL still carries the active tab (deep-linkable, survives reload), but switching tabs does not stack a history entry per click, so Back l… |
1166
- | `server` | `boolean \| undefined` | | | When true and in an Inertia context, triggers a real server-side Inertia visit instead of a client-only `history.pushState`. |
1568
+ | `replace` | `boolean \| undefined` | `false` | | Replaces history rather than pushing it when changing tab. Recommended default whenever `navigation` is on: the query keeps the active tab (deep-linkable, survives reload) while Back still returns to the page the user came from, instead of … |
1569
+ | `server` | `boolean \| undefined` | `false` | | When true and in an Inertia context, triggers a real server-side Inertia visit instead of a client-only `history.pushState`. |
1570
+ | `variant` | `keyof TabsVariantRegistry \| undefined` | `"pill"` | | Look of the tab strip. `pill` is the segmented strip — a muted rounded bar with a raised pill sliding under the active trigger; `line` puts the triggers on a thin baseline with a sliding underline (on the side edge when `direction="vertical… |
1571
+
1572
+ ## Passthrough parts and states
1573
+
1574
+ `pt:<part>="…"` restyles a part; `pt:<part>:<state>="…"` applies only while the state is on. A component-wide state is on for every part at once; a _per node_ state resolves on each node of a broadcast part (one row, one option, one day). Grammar and merge rules: `guides/passthrough.md`.
1575
+
1576
+ | Part | What it is |
1577
+ | --- | --- |
1578
+ | `root` | The tabs' outer element. The strip and the sliding pill are not parts. |
1579
+ | `item` | One tab trigger — a broadcast resolved per tab with its own `active` / `disabled`. Also takes a per-item function, called with the tab's descriptor. |
1580
+ | `panel` | One tab pane — a broadcast; `panel:active` is the pane on show. Takes no function. |
1581
+
1582
+ States are listed in precedence order: when two are on at once and their entries conflict, the later one wins.
1583
+
1584
+ | State | When it is on |
1585
+ | --- | --- |
1586
+ | `disabled` | Per node, on `item` only: a tab that is disabled. |
1587
+ | `active` | Per node, on `item` and `panel`: the selected tab's trigger and its shown pane. |
1167
1588
 
1168
1589
  ## Events
1169
1590
 
@@ -1175,6 +1596,52 @@ route, so it is SSR-safe and shareable:
1175
1596
  - `header:prepend` — scope: `BbTabsScrollSlotProps` — Content rendered before the scrollable tab label list (e.g. a left scroll arrow).
1176
1597
  - `label` — scope: `BbTabsSlotProps<K>` — Fallback slot used for all tab labels when no per-tab `label:{key}` slot is provided.
1177
1598
 
1599
+ ## CSS custom properties
1600
+
1601
+ Set these on the element, or on a class you put on it, to retune this component alone — the sanctioned alternative to reaching past the API with `:deep()`. They are this component's own locals — a **Set on** of `pt:<part>` means the local lives on that part's element, so set it through that entry (`pt:box="[--border-color:var(--color-green-500)]"`); the global `--bb-*` theme tokens are a separate tier (see the [design-tokens guide](./guides/design-tokens.md), or the MCP `list_tokens` tool).
1602
+
1603
+ | Property | Set on | Default | What it is |
1604
+ | --- | --- | --- | --- |
1605
+ | `--gap` | `.bb-tabs` | `8px` | |
1606
+ | `--list-bg` | `.bb-tabs-list` | `color-mix(in oklab, var(--bb-text) 8%, transparent)` | The strip behind the triggers |
1607
+ | `--list-border` | `.bb-tabs-list` | `transparent` | The strip's edge line: a baseline under the triggers (beside them when vertical), --bb-border-w thick, painted inside the strip. `pill` draws none; `line` sets it to --bb-border |
1608
+ | `--p` | `.bb-tabs-list` | `3px` | strip inner padding — the gutter the indicator sits in, and the scroll inset |
1609
+ | `--list-r` | `.bb-tabs-list` | `var(--bb-radius)` | strip corners |
1610
+ | `--list-h` | `.bb-tabs-list` | `var(--bb-control-h)` | strip min height |
1611
+ | `--fs` | `.bb-tabs-list` | `var(--bb-fs)` | trigger label size |
1612
+ | `--trigger-gap` | `.bb-tabs-list` | `0px` | space between triggers |
1613
+ | `--trigger-px` | `.bb-tabs-list` | `10px` | trigger side padding |
1614
+ | `--trigger-r` | `.bb-tabs-list` | `calc(var(--list-r) - var(--p))` | Trigger corners, concentric inside --list-r |
1615
+ | `--trigger-min-h` | `.bb-tabs-list` | `calc(var(--list-h) - var(--p) * 2)` | Trigger height inside the padded strip |
1616
+ | `--list-fg` | `.bb-tabs-list` | `var(--bb-text-muted)` | inactive trigger label |
1617
+ | `--hover-fg` | `.bb-tabs-list` | `var(--bb-text)` | hovered trigger label |
1618
+ | `--active-fg` | `.bb-tabs-list` | `var(--bb-text)` | active trigger label |
1619
+ | `--active-fw` | `.bb-tabs-list` | `500` | active trigger label weight (inactive labels are 500) |
1620
+ | `--indicator-bg` | `.bb-tabs-list` | `var(--bb-panel)` | the indicator's fill |
1621
+ | `--indicator-border` | `.bb-tabs-list` | `color-mix(in oklab, var(--bb-text) 8%, transparent)` | The indicator's edge |
1622
+ | `--indicator-r` | `.bb-tabs-list` | `var(--trigger-r)` | The indicator's corners — the pill's, concentric inside --list-r |
1623
+ | `--indicator-h` | `.bb-tabs-list` | `initial` | The indicator's thickness: its height, its width on a vertical strip. `initial` fills the whole trigger box — the pill; a bar is `2px`, on the trigger's bottom edge (side edge when vertical) |
1624
+ | `--indicator-inset` | `.bb-tabs-list` | `0px` | Inset of the indicator from the trigger box — shrinks the pill; a bar keeps its thickness, shortens by it at both ends and floats it above the edge |
1625
+ | `--elev` | `.bb-tabs-list` | `var(--bb-elev)` | The theme's resting lift, composed UNDER the indicator's own shadow. Two names because they are two decisions: `--elev` is what the language lifts every plate by, `--indicator-shadow` is this component's own. |
1626
+ | `--indicator-shadow` | `.bb-tabs-list` | `0 1px 2px 0 rgb(0 0 0 / 0.06), 0 1px 3px 0 rgb(0 0 0 / 0.08)` | Indicator lift, painted on top of --elev |
1627
+ | `--transition-duration` | `.bb-tabs-panes` | `var(--bb-transition-slow)` | |
1628
+ | `--gap` | `.bb-tabs-panes` | `30px` | |
1629
+ | `--max-w` | `.bb-tabs-panes` | `initial` | The strip-width knob must not percolate into pane content: nested tabs rendered inside a pane start with a clean slate |
1630
+
1631
+ ## Component tree
1632
+
1633
+ `BbTabs` is not one component: rendering it mounts every component below, and each one is live inside it. **Read this before styling, theming or debugging `BbTabs`, and before concluding a part, a token or a behaviour does not exist** — it may live on a component further down. How to read it:
1634
+
1635
+ - **_internal_** nodes are building blocks with no API of their own: you reach them only through `BbTabs`. A pt part listed as landing there is set on `BbTabs` (`pt:<part>`).
1636
+ - **_public_** nodes are components with their own contract. `BbTabs` reaches one only through a pt part of its own that lands on it (shown on the parent node as `part → Component`, e.g. `spinner → BbSpinner`) or through a pt map it hands it (shown as "hands … the pt map", in `BbTabs`'s words → the child's). The child's other props and parts are not exposed; its contract explains what it renders.
1637
+ - **CSS custom properties** listed on a node are declared on THAT node's root and read by elements inside it. Set one on that node's root or on the element inside it that reads it — the pt part that lands there is how you reach it (`pt:box="[--border-color:…]"` on a text input) — never on `BbTabs`'s root, where the node's own declaration masks it (design-tokens guide, _Overriding one from a consumer app_, rule 0).
1638
+ - Listed nodes are the ones `BbTabs`'s API reaches or that declare a documented CSS variable; the rest fold into "also mounts". The complete tree, repeats and undocumented locals included, is the `tree` field of this component in `components.json`.
1639
+
1640
+ - `BbTabs` _(this component)_
1641
+ - `BbTabsList` _(public — [contract](./BbTabsList.md))_
1642
+ - `BbBaseButton` _(public — [contract](./BbBaseButton.md))_ — its own pt parts (`BbBaseButton`): `root` → `RouterComponent`, `root` → `a`, `root` → `component`; also mounts `RouterComponent`
1643
+ - Also mounts `BbTabsPanes`
1644
+
1178
1645
  ## See Also
1179
1646
 
1180
1647
  - [BbAccordion](./BbAccordion.md) — Expands and collapses a content panel.