bitboss-ui 3.0.0-beta.21 → 3.0.0-beta.23

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 (252) hide show
  1. package/README.md +55 -3
  2. package/bin/bitboss-ui-mcp.mjs +419 -9
  3. package/bin/bitboss-ui.mjs +293 -22
  4. package/dist/ai/BbAccordion.md +21 -23
  5. package/dist/ai/BbAlert.md +6 -12
  6. package/dist/ai/BbAvatar.md +60 -24
  7. package/dist/ai/BbBadge.md +12 -20
  8. package/dist/ai/BbBaseButton.md +14 -16
  9. package/dist/ai/BbBaseCheckboxIcon.md +6 -10
  10. package/dist/ai/BbBaseColorInput.md +1 -0
  11. package/dist/ai/BbBaseDatePickerInput.md +1 -0
  12. package/dist/ai/BbBaseNumberInput.md +1 -0
  13. package/dist/ai/BbBaseRadioIcon.md +6 -10
  14. package/dist/ai/BbBaseSelect.md +1 -0
  15. package/dist/ai/BbBaseSwitchIcon.md +5 -9
  16. package/dist/ai/BbBaseTag.md +1 -0
  17. package/dist/ai/BbBaseTextInput.md +2 -1
  18. package/dist/ai/BbBaseTextarea.md +1 -0
  19. package/dist/ai/BbBaseTimePickerInput.md +1 -0
  20. package/dist/ai/BbBreadcrumbs.md +23 -34
  21. package/dist/ai/BbButton.md +35 -47
  22. package/dist/ai/BbCheckbox.md +21 -37
  23. package/dist/ai/BbCheckboxGroup.md +13 -13
  24. package/dist/ai/BbCollapsible.md +14 -26
  25. package/dist/ai/BbColorInput.md +27 -23
  26. package/dist/ai/BbColorPalette.md +23 -35
  27. package/dist/ai/BbConfirm.md +17 -32
  28. package/dist/ai/BbDatePickerInput.md +29 -21
  29. package/dist/ai/BbDialog.md +159 -62
  30. package/dist/ai/BbDropdown.md +21 -25
  31. package/dist/ai/BbDropdownButton.md +13 -30
  32. package/dist/ai/BbDropzone.md +9 -11
  33. package/dist/ai/BbIcon.md +44 -33
  34. package/dist/ai/BbIndicator.md +2 -2
  35. package/dist/ai/BbNumberInput.md +32 -20
  36. package/dist/ai/BbOffCanvas.md +42 -42
  37. package/dist/ai/BbPagination.md +21 -23
  38. package/dist/ai/BbPopover.md +15 -17
  39. package/dist/ai/BbProgress.md +40 -51
  40. package/dist/ai/BbRadio.md +9 -9
  41. package/dist/ai/BbRadioGroup.md +7 -11
  42. package/dist/ai/BbRating.md +8 -12
  43. package/dist/ai/BbSelect.md +46 -36
  44. package/dist/ai/BbSelectPopover.md +19 -31
  45. package/dist/ai/BbSlider.md +15 -19
  46. package/dist/ai/BbSmoothHeight.md +16 -31
  47. package/dist/ai/BbSpinner.md +118 -74
  48. package/dist/ai/BbSwitch.md +25 -18
  49. package/dist/ai/BbSwitchGroup.md +9 -14
  50. package/dist/ai/BbTable.md +102 -55
  51. package/dist/ai/BbTabs.md +59 -82
  52. package/dist/ai/BbTag.md +26 -23
  53. package/dist/ai/BbTextInput.md +63 -27
  54. package/dist/ai/BbTextarea.md +42 -34
  55. package/dist/ai/BbTimePickerInput.md +14 -0
  56. package/dist/ai/BbToast.md +14 -34
  57. package/dist/ai/BbTooltip.md +22 -20
  58. package/dist/ai/BbTree.md +46 -72
  59. package/dist/ai/CommonInputWrapper.md +1 -0
  60. package/dist/ai/changelog.json +170 -62
  61. package/dist/ai/components.json +1678 -11
  62. package/dist/ai/composables/useConfirm.md +5 -2
  63. package/dist/ai/composables/useToast.md +4 -2
  64. package/dist/ai/guides/agent-contract.md +7 -4
  65. package/dist/ai/guides/ai-router.md +37 -22
  66. package/dist/ai/guides/component-picker.md +23 -18
  67. package/dist/ai/guides/design-language.md +151 -21
  68. package/dist/ai/guides/design-tokens.md +29 -4
  69. package/dist/ai/guides/icons-policy.md +46 -21
  70. package/dist/ai/guides/installation-and-plugin-setup.md +286 -17
  71. package/dist/ai/guides/migration/components/bb-rating.md +26 -1
  72. package/dist/ai/guides/migration/components/bb-tooltip.md +18 -0
  73. package/dist/ai/guides/migration/v2-to-v3.md +50 -23
  74. package/dist/ai/index.md +1 -1
  75. package/dist/ai/recipes/inertia/approvals-inbox.md +3 -3
  76. package/dist/ai/recipes/inertia/inline-edit-workspace.md +2 -2
  77. package/dist/ai/recipes/inertia/onboarding.md +2 -2
  78. package/dist/ai/recipes/inertia/ownership-atlas.md +6 -6
  79. package/dist/ai/recipes/inertia/record-form.md +5 -5
  80. package/dist/ai/recipes/inertia/records-workspace.md +4 -4
  81. package/dist/ai/recipes/inertia/upload-center.md +6 -6
  82. package/dist/ai/recipes/inertia/wizard-form.md +5 -5
  83. package/dist/ai/recipes/nuxt/approvals-inbox.md +3 -3
  84. package/dist/ai/recipes/nuxt/inline-edit-workspace.md +2 -2
  85. package/dist/ai/recipes/nuxt/onboarding.md +2 -2
  86. package/dist/ai/recipes/nuxt/record-form.md +5 -5
  87. package/dist/ai/recipes/nuxt/records-workspace.md +4 -4
  88. package/dist/ai/recipes/nuxt/upload-center.md +6 -6
  89. package/dist/ai/recipes/nuxt/wizard-form.md +5 -5
  90. package/dist/ai/recipes/vue/approvals-inbox.md +3 -3
  91. package/dist/ai/recipes/vue/inline-edit-workspace.md +2 -2
  92. package/dist/ai/recipes/vue/onboarding.md +2 -2
  93. package/dist/ai/recipes/vue/record-form.md +10 -10
  94. package/dist/ai/recipes/vue/records-workspace.md +4 -4
  95. package/dist/ai/recipes/vue/upload-center.md +6 -6
  96. package/dist/ai/recipes/vue/wizard-form.md +5 -5
  97. package/dist/ai/source/BbBadge.md +1 -1
  98. package/dist/ai/source/BbBaseCheckbox.md +1 -1
  99. package/dist/ai/source/BbBaseColorInput.md +7 -0
  100. package/dist/ai/source/BbBaseDatePicker.md +5 -5
  101. package/dist/ai/source/BbBaseDatePickerInput.md +9 -2
  102. package/dist/ai/source/BbBaseNumberInput.md +7 -0
  103. package/dist/ai/source/BbBaseRadio.md +1 -1
  104. package/dist/ai/source/BbBaseRating.md +5 -5
  105. package/dist/ai/source/BbBaseSelect.md +8 -1
  106. package/dist/ai/source/BbBaseSlider.md +5 -5
  107. package/dist/ai/source/BbBaseSwitch.md +1 -1
  108. package/dist/ai/source/BbBaseTag.md +7 -0
  109. package/dist/ai/source/BbBaseTextInput.md +7 -0
  110. package/dist/ai/source/BbBaseTextarea.md +7 -0
  111. package/dist/ai/source/BbBaseTimePickerInput.md +8 -1
  112. package/dist/ai/source/BbBreadcrumbs.md +20 -1
  113. package/dist/ai/source/BbButton.md +2 -2
  114. package/dist/ai/source/BbColorInput.md +14 -0
  115. package/dist/ai/source/BbDatePickerInput.md +14 -0
  116. package/dist/ai/source/BbDialog.md +39 -8
  117. package/dist/ai/source/BbDropdown.md +1 -1
  118. package/dist/ai/source/BbDropzone.md +5 -5
  119. package/dist/ai/source/BbIcon.md +23 -10
  120. package/dist/ai/source/BbNumberInput.md +14 -0
  121. package/dist/ai/source/BbOffCanvas.md +50 -28
  122. package/dist/ai/source/BbPagination.md +2 -2
  123. package/dist/ai/source/BbPopover.md +12 -1
  124. package/dist/ai/source/BbSelect.md +14 -0
  125. package/dist/ai/source/BbSelectPopover.md +45 -7
  126. package/dist/ai/source/BbSpinner.md +2 -2
  127. package/dist/ai/source/BbTable.md +11 -11
  128. package/dist/ai/source/BbTag.md +14 -0
  129. package/dist/ai/source/BbTextInput.md +14 -0
  130. package/dist/ai/source/BbTextarea.md +14 -0
  131. package/dist/ai/source/BbTimePickerInput.md +14 -0
  132. package/dist/ai/source/BbTooltip.md +57 -10
  133. package/dist/ai/source/ChipsBox.md +1 -1
  134. package/dist/ai/source/CommaBox.md +1 -1
  135. package/dist/ai/source/CommonInputWrapper.md +128 -33
  136. package/dist/ai/source/GuidesComponent.md +14 -7
  137. package/dist/ai/source/OptionsContainer.md +1 -1
  138. package/dist/components/BbBadge/BadgeBodyContent.vue_vue_type_script_setup_true_lang.js +1 -1
  139. package/dist/components/BbBadge/BbBadge.vue_vue_type_script_setup_true_lang.js +1 -1
  140. package/dist/components/BbBaseCheckbox/BbBaseCheckbox.vue_vue_type_script_setup_true_lang.js +1 -1
  141. package/dist/components/BbBaseColorInput/BbBaseColorInput.vue_vue_type_script_setup_true_lang.js +4 -1
  142. package/dist/components/BbBaseColorInput/types.d.ts +5 -0
  143. package/dist/components/BbBaseDatePicker/BbBaseDatePicker.vue_vue_type_script_setup_true_lang.js +4 -4
  144. package/dist/components/BbBaseDatePicker/BbBaseDatePickerInputDaySelector.vue_vue_type_script_setup_true_lang.js +1 -1
  145. package/dist/components/BbBaseDatePickerInput/BbBaseDatePickerInput.vue_vue_type_script_setup_true_lang.js +5 -2
  146. package/dist/components/BbBaseDatePickerInput/types.d.ts +5 -0
  147. package/dist/components/BbBaseInputContainer/BbBaseInputContainer.vue.d.ts +1 -1
  148. package/dist/components/BbBaseNumberInput/BbBaseNumberInput.vue_vue_type_script_setup_true_lang.js +4 -1
  149. package/dist/components/BbBaseNumberInput/types.d.ts +5 -0
  150. package/dist/components/BbBaseRadio/BbBaseRadio.vue_vue_type_script_setup_true_lang.js +1 -1
  151. package/dist/components/BbBaseRating/BbBaseRating.vue_vue_type_script_setup_true_lang.js +3 -3
  152. package/dist/components/BbBaseSelect/BbBaseSelect.vue_vue_type_script_setup_true_lang.js +4 -1
  153. package/dist/components/BbBaseSelect/types.d.ts +5 -0
  154. package/dist/components/BbBaseSlider/BbBaseSlider.vue_vue_type_script_setup_true_lang.js +3 -3
  155. package/dist/components/BbBaseSwitch/BbBaseSwitch.vue_vue_type_script_setup_true_lang.js +1 -1
  156. package/dist/components/BbBaseTag/BbBaseTag.vue_vue_type_script_setup_true_lang.js +4 -1
  157. package/dist/components/BbBaseTag/types.d.ts +5 -0
  158. package/dist/components/BbBaseTextInput/BbBaseTextInput.vue_vue_type_script_setup_true_lang.js +4 -1
  159. package/dist/components/BbBaseTextInput/types.d.ts +5 -0
  160. package/dist/components/BbBaseTextarea/BbBaseTextarea.vue_vue_type_script_setup_true_lang.js +4 -1
  161. package/dist/components/BbBaseTextarea/types.d.ts +5 -0
  162. package/dist/components/BbBaseTimePickerInput/BbBaseTimePickerInput.vue_vue_type_script_setup_true_lang.js +5 -2
  163. package/dist/components/BbBaseTimePickerInput/types.d.ts +5 -0
  164. package/dist/components/BbBreadcrumbs/BbBreadcrumbs.vue_vue_type_script_setup_true_lang.js +71 -71
  165. package/dist/components/BbButton/BbButton.vue_vue_type_script_setup_true_lang.js +2 -2
  166. package/dist/components/BbColorInput/BbColorInput.vue_vue_type_script_setup_true_lang.js +5 -2
  167. package/dist/components/BbColorInput/types.d.ts +12 -0
  168. package/dist/components/BbDatePickerInput/BbDatePickerInput.vue_vue_type_script_setup_true_lang.js +4 -2
  169. package/dist/components/BbDatePickerInput/types.d.ts +12 -0
  170. package/dist/components/BbDialog/BbDialog.vue_vue_type_script_setup_true_lang.js +102 -97
  171. package/dist/components/BbDropdown/AdaptiveDropdown.vue_vue_type_script_setup_true_lang.js +1 -1
  172. package/dist/components/BbDropdown/BbDropdown.vue_vue_type_script_setup_true_lang.js +58 -58
  173. package/dist/components/BbDropzone/BbDropzone.vue_vue_type_script_setup_true_lang.js +2 -2
  174. package/dist/components/BbIcon/BbIcon.vue_vue_type_script_setup_true_lang.js +33 -35
  175. package/dist/components/BbIcon/iconCache.d.ts +30 -0
  176. package/dist/components/BbIcon/iconCache.js +21 -3
  177. package/dist/components/BbNumberInput/BbNumberInput.vue_vue_type_script_setup_true_lang.js +5 -2
  178. package/dist/components/BbNumberInput/types.d.ts +12 -0
  179. package/dist/components/BbOffCanvas/BbOffCanvas.vue_vue_type_script_setup_true_lang.js +57 -56
  180. package/dist/components/BbPagination/BbPagination.vue_vue_type_script_setup_true_lang.js +2 -2
  181. package/dist/components/BbPopover/BbPopover.vue_vue_type_script_setup_true_lang.js +138 -138
  182. package/dist/components/BbSelect/BbSelect.vue_vue_type_script_setup_true_lang.js +4 -2
  183. package/dist/components/BbSelect/types.d.ts +12 -0
  184. package/dist/components/BbSelectPopover/BbSelectPopover.vue_vue_type_script_setup_true_lang.js +43 -43
  185. package/dist/components/BbSpinner/BbSpinner.vue_vue_type_script_setup_true_lang.js +1 -1
  186. package/dist/components/BbSpinner/types.d.ts +1 -1
  187. package/dist/components/BbTable/BbTable.vue_vue_type_script_setup_true_lang.js +8 -8
  188. package/dist/components/BbTable/BbTableDataRow.js +2 -2
  189. package/dist/components/BbTag/BbTag.vue_vue_type_script_setup_true_lang.js +5 -2
  190. package/dist/components/BbTag/types.d.ts +12 -0
  191. package/dist/components/BbTextInput/BbTextInput.vue_vue_type_script_setup_true_lang.js +5 -2
  192. package/dist/components/BbTextInput/types.d.ts +12 -0
  193. package/dist/components/BbTextarea/BbTextarea.vue_vue_type_script_setup_true_lang.js +5 -2
  194. package/dist/components/BbTextarea/types.d.ts +12 -0
  195. package/dist/components/BbTimePickerInput/BbTimePickerInput.vue_vue_type_script_setup_true_lang.js +4 -2
  196. package/dist/components/BbTimePickerInput/types.d.ts +12 -0
  197. package/dist/components/BbToast/BbToastRegion.vue_vue_type_script_setup_true_lang.js +62 -62
  198. package/dist/components/BbTooltip/BbTooltip.vue_vue_type_script_setup_true_lang.js +81 -78
  199. package/dist/components/BbTooltip/types.d.ts +8 -1
  200. package/dist/components/ChipsBox/ChipsBox.vue_vue_type_script_setup_true_lang.js +1 -1
  201. package/dist/components/CommaBox/CommaBox.vue_vue_type_script_setup_true_lang.js +1 -1
  202. package/dist/components/CommonInputWrapper/CommonInputWrapper.vue.d.ts +1 -0
  203. package/dist/components/CommonInputWrapper/CommonInputWrapper.vue_vue_type_script_setup_true_lang.js +4 -2
  204. package/dist/components/CommonInputWrapper/types.d.ts +10 -0
  205. package/dist/components/OptionsContainer/OptionsContainer.vue_vue_type_script_setup_true_lang.js +1 -1
  206. package/dist/composables/useConfirm.d.ts +22 -0
  207. package/dist/composables/useConfirm.js +43 -40
  208. package/dist/composables/useSafeAreaInternal.js +1 -1
  209. package/dist/composables/useToast.d.ts +16 -0
  210. package/dist/composables/useToast.js +20 -16
  211. package/dist/composables/useViewportWidth.d.ts +20 -6
  212. package/dist/composables/useViewportWidth.js +8 -7
  213. package/dist/icon-scan.d.ts +276 -0
  214. package/dist/icon-scan.js +485 -0
  215. package/dist/icons-whitelist.d.ts +5 -4
  216. package/dist/index.d.ts +2 -0
  217. package/dist/input-variants.d.ts +18 -0
  218. package/dist/llms-full.txt +2173 -1537
  219. package/dist/llms-medium.txt +504 -82
  220. package/dist/llms.txt +1 -1
  221. package/dist/nuxt-module.d.ts +1 -0
  222. package/dist/nuxt.js +10 -7
  223. package/dist/plugin.js +1 -0
  224. package/dist/runtime/nuxt-plugin.js +2 -1
  225. package/dist/styles.css +1 -1
  226. package/dist/types/Config.d.ts +18 -0
  227. package/dist/types/InputVariant.d.ts +22 -0
  228. package/dist/utils/cssLayers.d.ts +91 -0
  229. package/dist/utils/cssLayers.js +43 -0
  230. package/dist/utils/injectLibraryStyles.d.ts +3 -1
  231. package/dist/utils/injectLibraryStyles.js +24 -23
  232. package/dist/validated/BbColorInput.vue_vue_type_script_setup_true_lang.js +1 -0
  233. package/dist/validated/BbDatePickerInput.vue_vue_type_script_setup_true_lang.js +1 -0
  234. package/dist/validated/BbNumberInput.vue_vue_type_script_setup_true_lang.js +1 -0
  235. package/dist/validated/BbSelect.vue_vue_type_script_setup_true_lang.js +1 -0
  236. package/dist/validated/BbTag.vue_vue_type_script_setup_true_lang.js +1 -0
  237. package/dist/validated/BbTextInput.vue_vue_type_script_setup_true_lang.js +1 -0
  238. package/dist/validated/BbTextarea.vue_vue_type_script_setup_true_lang.js +1 -0
  239. package/dist/validated/BbTimePickerInput.vue_vue_type_script_setup_true_lang.js +1 -0
  240. package/dist/validated/index.d.ts +1 -0
  241. package/dist/vite-plugin.d.ts +89 -12
  242. package/dist/vite.js +331 -281
  243. package/llms.txt +1 -1
  244. package/package.json +7 -5
  245. package/scripts/lib/ensure-manifest.mjs +28 -5
  246. package/scripts/lib/eslint-plugin.d.ts +35 -0
  247. package/scripts/lib/eslint-plugin.mjs +299 -3
  248. package/scripts/lib/hand-roll-hints.mjs +50 -6
  249. package/scripts/lib/html-attributes.mjs +42 -0
  250. package/scripts/lib/mcp-config.mjs +38 -34
  251. package/scripts/lib/public-type-exports.mjs +246 -0
  252. package/scripts/lib/validate-bb-markup.mjs +205 -12
@@ -1108,7 +1108,7 @@ const today = new Date().toISOString().slice(0, 10);
1108
1108
  >
1109
1109
  <div class="flex items-center justify-between gap-2">
1110
1110
  <h3
1111
- class="text-xs font-semibold uppercase tracking-wide text-[color:var(--bb-text-muted)]"
1111
+ class="text-xs font-semibold tracking-wide text-[color:var(--bb-text-muted)] uppercase"
1112
1112
  >
1113
1113
  Audience
1114
1114
  </h3>
@@ -1155,7 +1155,7 @@ const today = new Date().toISOString().slice(0, 10);
1155
1155
  >
1156
1156
  <div class="flex items-center justify-between gap-2">
1157
1157
  <h3
1158
- class="text-xs font-semibold uppercase tracking-wide text-[color:var(--bb-text-muted)]"
1158
+ class="text-xs font-semibold tracking-wide text-[color:var(--bb-text-muted)] uppercase"
1159
1159
  >
1160
1160
  Content
1161
1161
  </h3>
@@ -1186,7 +1186,7 @@ const today = new Date().toISOString().slice(0, 10);
1186
1186
  >
1187
1187
  <div class="flex items-center justify-between gap-2">
1188
1188
  <h3
1189
- class="text-xs font-semibold uppercase tracking-wide text-[color:var(--bb-text-muted)]"
1189
+ class="text-xs font-semibold tracking-wide text-[color:var(--bb-text-muted)] uppercase"
1190
1190
  >
1191
1191
  Schedule
1192
1192
  </h3>
@@ -1352,7 +1352,7 @@ const isReview = computed(() => ctx.step.value === 'review');
1352
1352
  <!-- The segment's definition, so "who is in here" is answerable in place. -->
1353
1353
  <section class="flex flex-col gap-1.5">
1354
1354
  <h3
1355
- class="text-xs font-semibold uppercase tracking-wide text-[color:var(--bb-text-muted)]"
1355
+ class="text-xs font-semibold tracking-wide text-[color:var(--bb-text-muted)] uppercase"
1356
1356
  >
1357
1357
  Conditions
1358
1358
  </h3>
@@ -1371,7 +1371,7 @@ const isReview = computed(() => ctx.step.value === 'review');
1371
1371
  <!-- Recent campaigns to this segment: fatigue check before sending. -->
1372
1372
  <section class="flex flex-col gap-1.5">
1373
1373
  <h3
1374
- class="text-xs font-semibold uppercase tracking-wide text-[color:var(--bb-text-muted)]"
1374
+ class="text-xs font-semibold tracking-wide text-[color:var(--bb-text-muted)] uppercase"
1375
1375
  >
1376
1376
  Recent campaigns
1377
1377
  </h3>
@@ -1174,7 +1174,7 @@ const clearSelection = () => {
1174
1174
  <!-- Receipt: bigger than the row thumbnail, with a full-size link out. -->
1175
1175
  <section class="flex flex-col gap-1.5">
1176
1176
  <h3
1177
- class="text-xs font-semibold uppercase tracking-wide text-[color:var(--bb-text-muted)]"
1177
+ class="text-xs font-semibold tracking-wide text-[color:var(--bb-text-muted)] uppercase"
1178
1178
  >
1179
1179
  Receipt
1180
1180
  </h3>
@@ -1221,7 +1221,7 @@ const clearSelection = () => {
1221
1221
  <!-- Activity feed. -->
1222
1222
  <section class="flex flex-col gap-1.5">
1223
1223
  <h3
1224
- class="text-xs font-semibold uppercase tracking-wide text-[color:var(--bb-text-muted)]"
1224
+ class="text-xs font-semibold tracking-wide text-[color:var(--bb-text-muted)] uppercase"
1225
1225
  >
1226
1226
  Activity
1227
1227
  </h3>
@@ -1373,7 +1373,7 @@ const statusLabel = (status: ExpenseStatus) =>
1373
1373
  <!-- Recent expenses: names drill down again — the stack keeps growing. -->
1374
1374
  <section class="flex flex-col gap-1.5">
1375
1375
  <h3
1376
- class="text-xs font-semibold uppercase tracking-wide text-[color:var(--bb-text-muted)]"
1376
+ class="text-xs font-semibold tracking-wide text-[color:var(--bb-text-muted)] uppercase"
1377
1377
  >
1378
1378
  Recent expenses
1379
1379
  </h3>
@@ -1455,7 +1455,7 @@ const clearSelection = () => {
1455
1455
  <!-- Description. -->
1456
1456
  <section class="flex flex-col gap-1.5">
1457
1457
  <h3
1458
- class="text-xs font-semibold uppercase tracking-wide text-[color:var(--bb-text-muted)]"
1458
+ class="text-xs font-semibold tracking-wide text-[color:var(--bb-text-muted)] uppercase"
1459
1459
  >
1460
1460
  Description
1461
1461
  </h3>
@@ -1467,7 +1467,7 @@ const clearSelection = () => {
1467
1467
  <!-- Activity feed. -->
1468
1468
  <section class="flex flex-col gap-1.5">
1469
1469
  <h3
1470
- class="text-xs font-semibold uppercase tracking-wide text-[color:var(--bb-text-muted)]"
1470
+ class="text-xs font-semibold tracking-wide text-[color:var(--bb-text-muted)] uppercase"
1471
1471
  >
1472
1472
  Activity
1473
1473
  </h3>
@@ -769,7 +769,7 @@ const ctx = useOnboardingWorkspace();
769
769
  </span>
770
770
  <span
771
771
  v-if="step.status === 'skipped'"
772
- class="shrink-0 text-xs uppercase tracking-wide text-[color:var(--bb-text-muted)]"
772
+ class="shrink-0 text-xs tracking-wide text-[color:var(--bb-text-muted)] uppercase"
773
773
  >
774
774
  Skipped
775
775
  </span>
@@ -1375,7 +1375,7 @@ const cadences: { value: ReminderCadence; label: string }[] = [
1375
1375
  <!-- What you'll get. -->
1376
1376
  <section class="flex flex-col gap-2.5">
1377
1377
  <h3
1378
- class="text-xs font-semibold uppercase tracking-wide text-[color:var(--bb-text-muted)]"
1378
+ class="text-xs font-semibold tracking-wide text-[color:var(--bb-text-muted)] uppercase"
1379
1379
  >
1380
1380
  What you'll get
1381
1381
  </h3>
@@ -712,7 +712,7 @@ const trail = computed(() => [
712
712
  <template>
713
713
  <section class="flex flex-col gap-3">
714
714
  <h2
715
- class="text-xs font-semibold uppercase tracking-wide text-[color:var(--bb-text-muted)]"
715
+ class="text-xs font-semibold tracking-wide text-[color:var(--bb-text-muted)] uppercase"
716
716
  >
717
717
  Details
718
718
  </h2>
@@ -834,7 +834,7 @@ const ctx = useInvoiceForm();
834
834
  <section class="flex flex-col gap-3">
835
835
  <div class="flex items-center justify-between">
836
836
  <h2
837
- class="text-xs font-semibold uppercase tracking-wide text-[color:var(--bb-text-muted)]"
837
+ class="text-xs font-semibold tracking-wide text-[color:var(--bb-text-muted)] uppercase"
838
838
  >
839
839
  Line items
840
840
  </h2>
@@ -926,7 +926,7 @@ const currency = new Intl.NumberFormat('en-US', {
926
926
  <div class="grid min-w-0 flex-1 grid-cols-3 gap-3">
927
927
  <div>
928
928
  <p
929
- class="mb-1 text-right text-xs font-semibold uppercase tracking-wide text-[color:var(--bb-text-muted)]"
929
+ class="mb-1 text-right text-xs font-semibold tracking-wide text-[color:var(--bb-text-muted)] uppercase"
930
930
  >
931
931
  Qty
932
932
  </p>
@@ -934,7 +934,7 @@ const currency = new Intl.NumberFormat('en-US', {
934
934
  </div>
935
935
  <div>
936
936
  <p
937
- class="mb-1 text-right text-xs font-semibold uppercase tracking-wide text-[color:var(--bb-text-muted)]"
937
+ class="mb-1 text-right text-xs font-semibold tracking-wide text-[color:var(--bb-text-muted)] uppercase"
938
938
  >
939
939
  Unit price
940
940
  </p>
@@ -942,7 +942,7 @@ const currency = new Intl.NumberFormat('en-US', {
942
942
  </div>
943
943
  <div>
944
944
  <p
945
- class="mb-1 text-right text-xs font-semibold uppercase tracking-wide text-[color:var(--bb-text-muted)]"
945
+ class="mb-1 text-right text-xs font-semibold tracking-wide text-[color:var(--bb-text-muted)] uppercase"
946
946
  >
947
947
  Amount
948
948
  </p>
@@ -975,7 +975,7 @@ const currency = new Intl.NumberFormat('en-US', {
975
975
 
976
976
  <div>
977
977
  <p
978
- class="mb-1 text-xs font-semibold uppercase tracking-wide text-[color:var(--bb-text-muted)]"
978
+ class="mb-1 text-xs font-semibold tracking-wide text-[color:var(--bb-text-muted)] uppercase"
979
979
  >
980
980
  Description
981
981
  </p>
@@ -1024,7 +1024,7 @@ const currency = new Intl.NumberFormat('en-US', {
1024
1024
  />
1025
1025
  <button
1026
1026
  v-else
1027
- class="w-full whitespace-pre-wrap rounded-[var(--bb-radius)] px-1 py-0.5 text-left hover:bg-[color:var(--bb-hover)]"
1027
+ class="w-full rounded-[var(--bb-radius)] px-1 py-0.5 text-left whitespace-pre-wrap hover:bg-[color:var(--bb-hover)]"
1028
1028
  :class="{
1029
1029
  'text-[color:var(--bb-text-muted)]': !line.description,
1030
1030
  'text-[color:var(--bb-danger)]': hasError,
@@ -1409,7 +1409,7 @@ const ctx = useInvoiceForm();
1409
1409
  <!-- Billing profile: exactly the fields this form negotiates. -->
1410
1410
  <section class="flex flex-col gap-1.5">
1411
1411
  <h3
1412
- class="text-xs font-semibold uppercase tracking-wide text-[color:var(--bb-text-muted)]"
1412
+ class="text-xs font-semibold tracking-wide text-[color:var(--bb-text-muted)] uppercase"
1413
1413
  >
1414
1414
  Billing profile
1415
1415
  </h3>
@@ -1439,7 +1439,7 @@ const ctx = useInvoiceForm();
1439
1439
  through the route-leave guard. -->
1440
1440
  <section class="flex flex-col gap-1.5">
1441
1441
  <h3
1442
- class="text-xs font-semibold uppercase tracking-wide text-[color:var(--bb-text-muted)]"
1442
+ class="text-xs font-semibold tracking-wide text-[color:var(--bb-text-muted)] uppercase"
1443
1443
  >
1444
1444
  Recent invoices
1445
1445
  </h3>
@@ -1453,7 +1453,7 @@ const ctx = useInvoiceForm();
1453
1453
  {{ recent.number }}
1454
1454
  </BbBaseButton>
1455
1455
  <BbBadge variant="outline">{{ recent.status }}</BbBadge>
1456
- <span class="text-xs tabular-nums text-[color:var(--bb-text-muted)]">
1456
+ <span class="text-xs text-[color:var(--bb-text-muted)] tabular-nums">
1457
1457
  {{ currency.format(recent.amount) }}
1458
1458
  </span>
1459
1459
  </li>
@@ -1074,7 +1074,7 @@ const clearSelection = () => {
1074
1074
  <!-- Line items: a real mini-table, not a summary sentence. -->
1075
1075
  <section class="flex flex-col gap-1.5">
1076
1076
  <h3
1077
- class="text-xs font-semibold uppercase tracking-wide text-[color:var(--bb-text-muted)]"
1077
+ class="text-xs font-semibold tracking-wide text-[color:var(--bb-text-muted)] uppercase"
1078
1078
  >
1079
1079
  Line items
1080
1080
  </h3>
@@ -1098,7 +1098,7 @@ const clearSelection = () => {
1098
1098
  <!-- Payments so far. -->
1099
1099
  <section v-if="invoice.payments.length" class="flex flex-col gap-1.5">
1100
1100
  <h3
1101
- class="text-xs font-semibold uppercase tracking-wide text-[color:var(--bb-text-muted)]"
1101
+ class="text-xs font-semibold tracking-wide text-[color:var(--bb-text-muted)] uppercase"
1102
1102
  >
1103
1103
  Payments
1104
1104
  </h3>
@@ -1121,7 +1121,7 @@ const clearSelection = () => {
1121
1121
  <!-- Activity feed. -->
1122
1122
  <section class="flex flex-col gap-1.5">
1123
1123
  <h3
1124
- class="text-xs font-semibold uppercase tracking-wide text-[color:var(--bb-text-muted)]"
1124
+ class="text-xs font-semibold tracking-wide text-[color:var(--bb-text-muted)] uppercase"
1125
1125
  >
1126
1126
  Activity
1127
1127
  </h3>
@@ -1242,7 +1242,7 @@ const longDate = (value: string) =>
1242
1242
  variant — same identity-cell rule as the invoices table. -->
1243
1243
  <section class="flex flex-col gap-1.5">
1244
1244
  <h3
1245
- class="text-xs font-semibold uppercase tracking-wide text-[color:var(--bb-text-muted)]"
1245
+ class="text-xs font-semibold tracking-wide text-[color:var(--bb-text-muted)] uppercase"
1246
1246
  >
1247
1247
  Recent invoices
1248
1248
  </h3>
@@ -1074,7 +1074,7 @@ const formattedSize = computed(() => {
1074
1074
  class="flex-1"
1075
1075
  :model-value="upload.progress"
1076
1076
  />
1077
- <span class="text-xs tabular-nums text-[color:var(--bb-text-muted)]"
1077
+ <span class="text-xs text-[color:var(--bb-text-muted)] tabular-nums"
1078
1078
  >{{ upload.progress }}%</span
1079
1079
  >
1080
1080
  </div>
@@ -1508,7 +1508,7 @@ const clearSelection = () => {
1508
1508
  <section class="flex flex-col gap-1.5">
1509
1509
  <div class="flex items-center justify-between">
1510
1510
  <h3
1511
- class="text-xs font-semibold uppercase tracking-wide text-[color:var(--bb-text-muted)]"
1511
+ class="text-xs font-semibold tracking-wide text-[color:var(--bb-text-muted)] uppercase"
1512
1512
  >
1513
1513
  Extracted fields
1514
1514
  </h3>
@@ -1548,7 +1548,7 @@ const clearSelection = () => {
1548
1548
  one-click cell as in the table. -->
1549
1549
  <section class="flex flex-col gap-1.5">
1550
1550
  <h3
1551
- class="text-xs font-semibold uppercase tracking-wide text-[color:var(--bb-text-muted)]"
1551
+ class="text-xs font-semibold tracking-wide text-[color:var(--bb-text-muted)] uppercase"
1552
1552
  >
1553
1553
  Details
1554
1554
  </h3>
@@ -1565,7 +1565,7 @@ const clearSelection = () => {
1565
1565
  <!-- Activity feed. -->
1566
1566
  <section class="flex flex-col gap-1.5">
1567
1567
  <h3
1568
- class="text-xs font-semibold uppercase tracking-wide text-[color:var(--bb-text-muted)]"
1568
+ class="text-xs font-semibold tracking-wide text-[color:var(--bb-text-muted)] uppercase"
1569
1569
  >
1570
1570
  Activity
1571
1571
  </h3>
@@ -1712,7 +1712,7 @@ const longDate = (value: string) =>
1712
1712
  <!-- Recent receipts: names drill down again — the stack keeps growing. -->
1713
1713
  <section class="flex flex-col gap-1.5">
1714
1714
  <h3
1715
- class="text-xs font-semibold uppercase tracking-wide text-[color:var(--bb-text-muted)]"
1715
+ class="text-xs font-semibold tracking-wide text-[color:var(--bb-text-muted)] uppercase"
1716
1716
  >
1717
1717
  Recent receipts
1718
1718
  </h3>
@@ -1730,7 +1730,7 @@ const longDate = (value: string) =>
1730
1730
  {{ recent.filename }}
1731
1731
  </BbButton>
1732
1732
  <BbBadge variant="outline">{{ recent.status }}</BbBadge>
1733
- <span class="text-xs tabular-nums text-[color:var(--bb-text-muted)]">
1733
+ <span class="text-xs text-[color:var(--bb-text-muted)] tabular-nums">
1734
1734
  {{ currency.format(recent.amount) }}
1735
1735
  </span>
1736
1736
  </li>
@@ -1042,7 +1042,7 @@ const today = new Date().toISOString().slice(0, 10);
1042
1042
  >
1043
1043
  <div class="flex items-center justify-between gap-2">
1044
1044
  <h3
1045
- class="text-xs font-semibold uppercase tracking-wide text-[color:var(--bb-text-muted)]"
1045
+ class="text-xs font-semibold tracking-wide text-[color:var(--bb-text-muted)] uppercase"
1046
1046
  >
1047
1047
  Audience
1048
1048
  </h3>
@@ -1089,7 +1089,7 @@ const today = new Date().toISOString().slice(0, 10);
1089
1089
  >
1090
1090
  <div class="flex items-center justify-between gap-2">
1091
1091
  <h3
1092
- class="text-xs font-semibold uppercase tracking-wide text-[color:var(--bb-text-muted)]"
1092
+ class="text-xs font-semibold tracking-wide text-[color:var(--bb-text-muted)] uppercase"
1093
1093
  >
1094
1094
  Content
1095
1095
  </h3>
@@ -1120,7 +1120,7 @@ const today = new Date().toISOString().slice(0, 10);
1120
1120
  >
1121
1121
  <div class="flex items-center justify-between gap-2">
1122
1122
  <h3
1123
- class="text-xs font-semibold uppercase tracking-wide text-[color:var(--bb-text-muted)]"
1123
+ class="text-xs font-semibold tracking-wide text-[color:var(--bb-text-muted)] uppercase"
1124
1124
  >
1125
1125
  Schedule
1126
1126
  </h3>
@@ -1286,7 +1286,7 @@ const isReview = computed(() => ctx.step.value === 'review');
1286
1286
  <!-- The segment's definition, so "who is in here" is answerable in place. -->
1287
1287
  <section class="flex flex-col gap-1.5">
1288
1288
  <h3
1289
- class="text-xs font-semibold uppercase tracking-wide text-[color:var(--bb-text-muted)]"
1289
+ class="text-xs font-semibold tracking-wide text-[color:var(--bb-text-muted)] uppercase"
1290
1290
  >
1291
1291
  Conditions
1292
1292
  </h3>
@@ -1305,7 +1305,7 @@ const isReview = computed(() => ctx.step.value === 'review');
1305
1305
  <!-- Recent campaigns to this segment: fatigue check before sending. -->
1306
1306
  <section class="flex flex-col gap-1.5">
1307
1307
  <h3
1308
- class="text-xs font-semibold uppercase tracking-wide text-[color:var(--bb-text-muted)]"
1308
+ class="text-xs font-semibold tracking-wide text-[color:var(--bb-text-muted)] uppercase"
1309
1309
  >
1310
1310
  Recent campaigns
1311
1311
  </h3>
@@ -41,7 +41,7 @@
41
41
  <BbIcon :icon="clearIcon" />
42
42
  </button>
43
43
  </span>
44
- <span v-if="props.loading" class="sr-only">{{
44
+ <span v-if="props.loading" class="bb-sr-only">{{
45
45
  t('common.loadingText')
46
46
  }}</span>
47
47
  </span>
@@ -166,7 +166,7 @@ const inputAttributes = computed(() => {
166
166
  // readonly is announced only via aria-readonly.
167
167
  'aria-readonly': props.readonly ? true : undefined,
168
168
  checked: internalChecked.value,
169
- class: 'sr-only',
169
+ class: 'bb-sr-only',
170
170
  disabled: props.disabled,
171
171
  id: props.id,
172
172
  indeterminate: props.indeterminate,
@@ -21,6 +21,7 @@
21
21
  :loading="props.loading"
22
22
  :prepend:icon="props['prepend:icon']"
23
23
  :readonly="props.readonly"
24
+ :variant="props.variant"
24
25
  @click:clear="$emit('update:modelValue', null)"
25
26
  >
26
27
  <template #prepend-outer><slot name="prepend-outer"></slot></template>
@@ -166,6 +167,7 @@ const options = computed<MaskInputOptions>(() => ({
166
167
  ## Types
167
168
 
168
169
  ```ts
170
+ import type { InputVariantType } from '@/types/InputVariant';
169
171
  import type { IconType } from '@/types/Icon';
170
172
  import type { HTMLAttributes, InputHTMLAttributes } from 'vue';
171
173
 
@@ -218,6 +220,11 @@ export type BaseColorInputProps = {
218
220
  * Display the component in a compact layout.
219
221
  */
220
222
  compact?: boolean;
223
+
224
+ /**
225
+ * Visual variant of the field box, forwarded to `CommonInputWrapper`.
226
+ */
227
+ variant?: InputVariantType;
221
228
  /**
222
229
  * Disable all interactions.
223
230
  */
@@ -13,8 +13,8 @@
13
13
  :class="isCoarse ? `bb-base-date-picker--unit-${homeMode}` : undefined"
14
14
  :style="{ '--weeks': weeksInMonth }"
15
15
  >
16
- <span aria-live="polite" class="sr-only">{{ formattedYear }}</span>
17
- <div aria-live="polite" class="sr-only">{{ cursorAnnouncement }}</div>
16
+ <span aria-live="polite" class="bb-sr-only">{{ formattedYear }}</span>
17
+ <div aria-live="polite" class="bb-sr-only">{{ cursorAnnouncement }}</div>
18
18
  <div class="bb-base-date-picker__body">
19
19
  <!-- No controls row under `type="year"`: the year list scrolls itself
20
20
  (and extends lazily at both ends), so there is nothing for the
@@ -42,7 +42,7 @@
42
42
  stroke-width="1.5"
43
43
  />
44
44
  </svg>
45
- <span class="sr-only">{{ previousPageLabel }}</span>
45
+ <span class="bb-sr-only">{{ previousPageLabel }}</span>
46
46
  </BbBaseButton>
47
47
 
48
48
  <div class="bb-base-date-picker__nav-center">
@@ -98,7 +98,7 @@
98
98
  stroke-width="1.5"
99
99
  />
100
100
  </svg>
101
- <span class="sr-only">{{ nextPageLabel }}</span>
101
+ <span class="bb-sr-only">{{ nextPageLabel }}</span>
102
102
  </BbBaseButton>
103
103
  </div>
104
104
 
@@ -141,7 +141,7 @@
141
141
  :id="`${globalId}-status`"
142
142
  aria-atomic="true"
143
143
  aria-live="polite"
144
- class="sr-only"
144
+ class="bb-sr-only"
145
145
  role="status"
146
146
  >
147
147
  {{ modeAnnouncement }}
@@ -25,6 +25,7 @@
25
25
  :loading="props.loading"
26
26
  :prepend:icon="props['prepend:icon']"
27
27
  :readonly="props.readonly"
28
+ :variant="props.variant"
28
29
  @click:clear="onClickClear"
29
30
  @focusin="onFocusIn"
30
31
  >
@@ -165,7 +166,7 @@
165
166
 
166
167
  <span
167
168
  :id="descriptionId"
168
- class="bb-base-date-picker-input__accessible-description sr-only"
169
+ class="bb-base-date-picker-input__accessible-description bb-sr-only"
169
170
  >{{ t('baseDatePickerInput.dateFormat') }} {{ formatHint }}</span
170
171
  >
171
172
  <template v-if="$slots.suffix" #suffix><slot name="suffix" /></template>
@@ -1006,7 +1007,7 @@ const timeHintKey = computed(() =>
1006
1007
  : 'baseDatePickerInput.timeFormat'
1007
1008
  );
1008
1009
 
1009
- /** Localized format hint used by the placeholder and the sr-only description. */
1010
+ /** Localized format hint used by the placeholder and the bb-sr-only description. */
1010
1011
  const formatHint = computed(() => {
1011
1012
  // The hint has to describe the fields that are actually there — promising
1012
1013
  // DD/MM/YYYY to a two-field month input is worse than no hint at all.
@@ -1564,6 +1565,7 @@ onBeforeUnmount(() => {
1564
1565
  ## Types
1565
1566
 
1566
1567
  ```ts
1568
+ import type { InputVariantType } from '@/types/InputVariant';
1567
1569
  import type { DatePickerType } from '@/types/DatePickerType';
1568
1570
  import type { HTMLAttributes, InputHTMLAttributes } from 'vue';
1569
1571
  import type { IconType } from '@/types/Icon';
@@ -1630,6 +1632,11 @@ export type BaseDatePickerInputProps = {
1630
1632
  */
1631
1633
  compact?: boolean;
1632
1634
 
1635
+ /**
1636
+ * Visual variant of the field box, forwarded to `CommonInputWrapper`.
1637
+ */
1638
+ variant?: InputVariantType;
1639
+
1633
1640
  /**
1634
1641
  * Disables the input, calendar trigger, and popover.
1635
1642
  */
@@ -21,6 +21,7 @@
21
21
  :prepend:icon="props['prepend:icon']"
22
22
  :readonly="props.readonly"
23
23
  :reserve-append-space="props.clearable"
24
+ :variant="props.variant"
24
25
  @click:clear="$emit('update:modelValue', null)"
25
26
  >
26
27
  <template #prepend-outer
@@ -372,6 +373,7 @@ defineExpose({
372
373
  ## Types
373
374
 
374
375
  ```ts
376
+ import type { InputVariantType } from '@/types/InputVariant';
375
377
  import type { HTMLAttributes, InputHTMLAttributes } from 'vue';
376
378
  import type { IconType } from '@/types/Icon';
377
379
 
@@ -410,6 +412,11 @@ export type BaseNumberInputProps = {
410
412
  */
411
413
  compact?: boolean;
412
414
 
415
+ /**
416
+ * Visual variant of the field box, forwarded to `CommonInputWrapper`.
417
+ */
418
+ variant?: InputVariantType;
419
+
413
420
  /**
414
421
  * Disable manual input and the exposed increase/decrease helpers.
415
422
  */
@@ -20,7 +20,7 @@
20
20
  'bb-base-radio--readonly': readonly,
21
21
  }"
22
22
  >
23
- <input v-bind="inputAttributes" class="sr-only" />
23
+ <input v-bind="inputAttributes" class="bb-sr-only" />
24
24
  <slot name="icon" v-bind="slotAttributes">
25
25
  <BbBaseRadioIcon
26
26
  :checked="checked"
@@ -20,7 +20,7 @@
20
20
  :role="groupRole"
21
21
  >
22
22
  <slot name="prepend"></slot>
23
- <span v-if="showClearHint" :id="clearHintId" class="sr-only">{{
23
+ <span v-if="showClearHint" :id="clearHintId" class="bb-sr-only">{{
24
24
  clearHintText
25
25
  }}</span>
26
26
  <label
@@ -34,7 +34,7 @@
34
34
  'bb-base-rating__option--readonly': readonly,
35
35
  }"
36
36
  >
37
- <span class="bb-base-rating__label-text sr-only">{{
37
+ <span class="bb-base-rating__label-text bb-sr-only">{{
38
38
  option.value == 1
39
39
  ? t('rating.singleStar', option.value, props.stars).value
40
40
  : t('rating.multipleStars', option.value, props.stars).value
@@ -44,7 +44,7 @@
44
44
  :aria-describedby="computedAriaDescribedby"
45
45
  :autofocus="autofocus && !index"
46
46
  :checked="option.checked"
47
- class="sr-only"
47
+ class="bb-sr-only"
48
48
  :disabled="option.disabled"
49
49
  :name="option.name"
50
50
  :required="required"
@@ -508,7 +508,7 @@ export const sizeMap: Sizes = {
508
508
  --color: var(--bb-primary);
509
509
  --ring-color: var(--bb-ring);
510
510
  --size: 24px;
511
- --spacing: 0px;
511
+ --space: 0px;
512
512
 
513
513
  /* Highlights all previous and current stars when hovering the component so it previews stars */
514
514
  &:not(.bb-base-rating--disabled):not(.bb-base-rating--readonly):not(
@@ -558,7 +558,7 @@ export const sizeMap: Sizes = {
558
558
  }
559
559
 
560
560
  &__inner-container {
561
- column-gap: var(--spacing);
561
+ column-gap: var(--space);
562
562
  display: inline-flex;
563
563
  flex-wrap: wrap;
564
564
  }
@@ -87,6 +87,7 @@
87
87
  :loading="activatorLoading"
88
88
  :prepend:icon="props['prepend:icon']"
89
89
  :readonly="readonly"
90
+ :variant="variant"
90
91
  @click:clear="
91
92
  () => {
92
93
  clear();
@@ -190,7 +191,7 @@
190
191
  so a visually-hidden copy nested inside it would double every reading.
191
192
  The chips keep their ✕ buttons — those are real tab stops and must stay
192
193
  named; the activator's name just stops reading them. -->
193
- <span :id="`${id}__selection`" class="sr-only">{{
194
+ <span :id="`${id}__selection`" class="bb-sr-only">{{
194
195
  accessibleSelectionText(text)
195
196
  }}</span>
196
197
  <template #append-outer
@@ -462,6 +463,7 @@ const hiddenInputs = computed(() =>
462
463
  ## Types
463
464
 
464
465
  ```ts
466
+ import type { InputVariantType } from '@/types/InputVariant';
465
467
  import type { HTMLAttributes, InputHTMLAttributes } from 'vue';
466
468
  import type { IconType } from '@/types/Icon';
467
469
  import type { BbSelectResolvedOption } from '../BbSelectPopover/types';
@@ -532,6 +534,11 @@ export type BaseSelectProps<Item = any> = {
532
534
  */
533
535
  compact?: boolean;
534
536
 
537
+ /**
538
+ * Visual variant of the field box, forwarded to `CommonInputWrapper`.
539
+ */
540
+ variant?: InputVariantType;
541
+
535
542
  /**
536
543
  * Additional dependencies that trigger item reloading when changed.
537
544
  * @defaultValue `[]`
@@ -30,7 +30,7 @@
30
30
  <input
31
31
  :id="id"
32
32
  ref="hiddenInput"
33
- class="sr-only"
33
+ class="bb-sr-only"
34
34
  :disabled="disabled"
35
35
  :name="name"
36
36
  :readonly="true"
@@ -132,10 +132,10 @@
132
132
  <!-- Localized qualifiers referenced by the range thumbs' aria-labelledby
133
133
  so the two identical role=slider spans are distinguishable to AT. -->
134
134
  <template v-if="props.range && props.id">
135
- <span :id="`${props.id}__thumb_label_lower`" class="sr-only">{{
135
+ <span :id="`${props.id}__thumb_label_lower`" class="bb-sr-only">{{
136
136
  t('slider.minimumThumb').value
137
137
  }}</span>
138
- <span :id="`${props.id}__thumb_label_higher`" class="sr-only">{{
138
+ <span :id="`${props.id}__thumb_label_higher`" class="bb-sr-only">{{
139
139
  t('slider.maximumThumb').value
140
140
  }}</span>
141
141
  </template>
@@ -181,11 +181,11 @@ const { t } = useLocale();
181
181
 
182
182
  /**
183
183
  * `role="slider"` is name-from-author: the container's visible `<label>`
184
- * targets the sr-only hidden input (`for`/`id`), which never names these
184
+ * targets the bb-sr-only hidden input (`for`/`id`), which never names these
185
185
  * sibling thumb spans — without an explicit reference the focused thumb
186
186
  * announces as an unnamed "slider, N". The wrapped layer (BbSlider →
187
187
  * BbBaseInputContainer) renders that label as `${id}__label`, so the thumbs
188
- * point at it; range mode appends a localized sr-only qualifier so the two
188
+ * point at it; range mode appends a localized bb-sr-only qualifier so the two
189
189
  * thumbs are distinguishable. Bare BbBaseSlider without a container keeps its
190
190
  * documented hole: the reference targets nothing and the name stays empty.
191
191
  */
@@ -158,7 +158,7 @@ const inputAttributes = computed(() => {
158
158
  // readonly is NOT disabled — native `disabled` conveys disabled.
159
159
  'aria-readonly': props.readonly ? true : undefined,
160
160
  checked: internalChecked.value,
161
- class: 'sr-only',
161
+ class: 'bb-sr-only',
162
162
  disabled: props.disabled,
163
163
  id: props.id,
164
164
  indeterminate: props.indeterminate,
@@ -26,6 +26,7 @@
26
26
  :loading="loading"
27
27
  :prepend:icon="props['prepend:icon']"
28
28
  :readonly="readonly"
29
+ :variant="variant"
29
30
  @click="onWrapperClick"
30
31
  @click:clear="onClear"
31
32
  @focusin="onWrapperFocusIn"
@@ -413,6 +414,7 @@ onBeforeUnmount(() => {
413
414
  ## Types
414
415
 
415
416
  ```ts
417
+ import type { InputVariantType } from '@/types/InputVariant';
416
418
  import type { HTMLAttributes, InputHTMLAttributes } from 'vue';
417
419
  import type { IconType } from '@/types/Icon';
418
420
 
@@ -466,6 +468,11 @@ export type BaseTagProps = {
466
468
  */
467
469
  compact?: boolean;
468
470
 
471
+ /**
472
+ * Visual variant of the field box, forwarded to `CommonInputWrapper`.
473
+ */
474
+ variant?: InputVariantType;
475
+
469
476
  /**
470
477
  * Disable all interactions with the tag input.
471
478
  */