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
@@ -39,6 +39,25 @@ explicitly (section 8).
39
39
 
40
40
  ## 0. Upgrade strategy — do it in this order
41
41
 
42
+ > **Already on v3, bumping between prereleases?** This guide is the v2 → v3
43
+ > move; you want the much shorter answer instead:
44
+ >
45
+ > ```bash
46
+ > npx bitboss-ui changelog --since 3.0.0-beta.20 # what BREAKS in the bump
47
+ > ```
48
+ >
49
+ > Then turn that list into **your** files, before you install anything:
50
+ >
51
+ > ```bash
52
+ > npm pack bitboss-ui@3.0.0-beta.21 && tar -xzf bitboss-ui-3.0.0-beta.21.tgz
53
+ > npx bitboss-ui check --manifest package/dist/ai/components.json
54
+ > ```
55
+ >
56
+ > `check` normally judges the INSTALLED version, which can only tell you what
57
+ > an upgrade broke after you took it. `--manifest` points it at the version you
58
+ > are moving to, so the damage is visible first. Agents with the MCP server get
59
+ > the same answer from `list_changes({ since })`.
60
+
42
61
  1. **Swap the setup** (section 1): install the build plugin and the runtime
43
62
  plugin. Nothing renders correctly until this is done.
44
63
  2. **Move your config** (section 2): everything you passed to
@@ -52,6 +71,13 @@ explicitly (section 8).
52
71
  fail loudly. Fix them component by component with the per-component guides.
53
72
  5. **Audit what the compiler cannot find** (section 8): untyped templates,
54
73
  `v-bind` objects, and behavioral flips are silent. Run the grep playbook.
74
+ **Your stylesheets are the silent half.** `vue-tsc` never reads CSS, so a
75
+ rule targeting a renamed or deleted class simply stops matching — no error,
76
+ no warning, and the page often still looks close enough to pass review. A
77
+ v2-era theme file can carry hundreds of lines that have done nothing since
78
+ the upgrade. Section 5.6 has the rename table and the grep that finds them;
79
+ run it before you conclude a component "has no token for this", because a
80
+ dead override and a missing affordance look identical from the browser.
55
81
  6. **Convert class overrides to variants** (section 7): userland
56
82
  `class="bb-button--outline"`-style overrides keep _working_ but are now the
57
83
  wrong pattern — the variant prop exists, is typed, and is the only form the
@@ -1031,28 +1057,29 @@ markup contract and the layout drift that comes with the substrate:
1031
1057
 
1032
1058
  **Everything else**
1033
1059
 
1034
- | v2 | v3 |
1035
- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
1036
- | `.bb-chip*` | `.bb-badge*` (component replaced) |
1037
- | `.bb-badge*` used as a floating count/dot (`--dot --floating --positioned --left --bottom --empty`, `__wrapper`, `__content-container`) | `.bb-indicator*` (component renamed) |
1038
- | `.bb-color-palette__*` (canvas, canvas-thumb, canvas-wrap, controls, eyedropper, preview, preview--alpha, preview-wrap, slider-thumb, slider-track, slider-wrap, slider-wrap--alpha, sliders, swatch, swatch--active, swatch-group, swatches) | `.bb-base-color-palette__*` — 1:1 on every one |
1039
- | `.bb-toast--top-start` / `--top` / `--top-end` / `--bottom-start` / `--bottom` / `--bottom-end` | `.bb-toast--top-left` / `--top-center` / `--top-right` / `--bottom-left` / `--bottom-center` / `--bottom-right` (matching the `position` prop's corner set) |
1040
- | `.bb-toast-message__icon-container` | **removed** — style `.bb-toast-message__icon` directly |
1041
- | `.bb-tree--open` | `.bb-tree__node--expanded` |
1042
- | `.bb-tree-row` | `.bb-tree__row` |
1043
- | `.bb-tree-main-content` | `.bb-tree__content` |
1044
- | `.bb-dropdown-button__dropdown-chevron` | `.bb-dropdown-button__chevron` |
1045
- | `.bb-dropdown-button--loading` / `__content` / `__icon` / `__prepend-icon` / `__append-icon` | **removed** — the split button delegates to `BbButton`'s internals; target `.bb-button__*` inside it |
1046
- | `.bb-dropdown__wrapper` | **removed** — the extra wrapper element is gone |
1047
- | `.bb-select-popover__search-spinner` | `.bb-select-popover__search-icon` (one element, spinner state included) |
1048
- | `.bb-base-date-picker__header` (the tinted banner holding the month/year controls) | `.bb-base-date-picker__controls` (+ the inner `__nav-center`) — the banner is gone; the controls sit on the calendar surface. `__header-container` and `__header-cell` are unrelated and unchanged: they are the weekday row. |
1049
- | `.bb-base-date-picker__control` / `__year-control` | `.bb-base-date-picker__nav-btn` |
1050
- | `.bb-base-date-picker__month-button` / `__year-button` | `.bb-base-date-picker__heading-btn` (+ `--active`) |
1051
- | `.bb-base-date-picker__weekday` | `.bb-base-date-picker__header-cell` |
1052
- | `.bb-base-date-picker__monthday` | `.bb-base-date-picker__date` (+ the inner `__date-button`) |
1053
- | `.bb-base-date-picker__year-container` | `.bb-base-date-picker__year-selector` |
1054
- | `.bb-base-date-picker__header--hidden`, `__selected-day-label` | **removed** |
1055
- | `.bb-commabox-item--has-comma` | the select's comma list renders `.bb-base-select__comma-item` (`.bb-commabox-item` itself survives; `--has-comma` and `.bb-chipsbox-item--focused` do not) |
1060
+ | v2 | v3 |
1061
+ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
1062
+ | `.bb-chip*` | `.bb-badge*` (component replaced) |
1063
+ | `.bb-badge*` used as a floating count/dot (`--dot --floating --positioned --left --bottom --empty`, `__wrapper`, `__content-container`) | `.bb-indicator*` (component renamed) |
1064
+ | `.bb-color-palette__*` (canvas, canvas-thumb, canvas-wrap, controls, eyedropper, preview, preview--alpha, preview-wrap, slider-thumb, slider-track, slider-wrap, slider-wrap--alpha, sliders, swatch, swatch--active, swatch-group, swatches) | `.bb-base-color-palette__*` — 1:1 on every one |
1065
+ | `.bb-toast--top-start` / `--top` / `--top-end` / `--bottom-start` / `--bottom` / `--bottom-end` | `.bb-toast--top-left` / `--top-center` / `--top-right` / `--bottom-left` / `--bottom-center` / `--bottom-right` (matching the `position` prop's corner set) |
1066
+ | `.bb-toast-message__icon-container` | **removed** — style `.bb-toast-message__icon` directly |
1067
+ | `.bb-tree--open` | `.bb-tree__node--expanded` |
1068
+ | `.bb-tree-row` | `.bb-tree__row` |
1069
+ | `.bb-tree-main-content` | `.bb-tree__content` |
1070
+ | `.bb-dropdown-button__dropdown-chevron` | `.bb-dropdown-button__chevron` |
1071
+ | `.bb-dropdown-button--loading` / `__content` / `__icon` / `__prepend-icon` / `__append-icon` | **removed** — the split button delegates to `BbButton`'s internals; target `.bb-button__*` inside it |
1072
+ | `.bb-dropdown__wrapper` | **removed** — the extra wrapper element is gone |
1073
+ | `.bb-select-popover__search-spinner` | `.bb-select-popover__search-icon` (one element, spinner state included) |
1074
+ | `.bb-base-date-picker__header` (the tinted banner holding the month/year controls) | `.bb-base-date-picker__controls` (+ the inner `__nav-center`) — the banner is gone; the controls sit on the calendar surface. `__header-container` and `__header-cell` are unrelated and unchanged: they are the weekday row. |
1075
+ | `.bb-base-date-picker__control` / `__year-control` | `.bb-base-date-picker__nav-btn` |
1076
+ | `.bb-base-date-picker__month-button` / `__year-button` | `.bb-base-date-picker__heading-btn` (+ `--active`) |
1077
+ | `.bb-base-date-picker__weekday` | `.bb-base-date-picker__header-cell` |
1078
+ | `.bb-base-date-picker__monthday` | `.bb-base-date-picker__date` (+ the inner `__date-button`) |
1079
+ | `.bb-base-date-picker__year-container` | `.bb-base-date-picker__year-selector` |
1080
+ | `.bb-base-date-picker__header--hidden`, `__selected-day-label` | **removed** |
1081
+ | `.bb-commabox-item--has-comma` | the select's comma list renders `.bb-base-select__comma-item` (`.bb-commabox-item` itself survives; `--has-comma` and `.bb-chipsbox-item--focused` do not) |
1082
+ | `.sr-only` — the visually-hidden helper every component uses for accessible names and status text (it shared Tailwind's class name) | `.bb-sr-only`. Only a selector reaching **into** a component (`.bb-table .sr-only`) breaks; your own Tailwind `sr-only` in your markup is untouched — which is why this one is deliberately **not** in the §8 grep: a hit there would be your code, not ours |
1056
1083
 
1057
1084
  The date **input**'s own field tree (`.bb-base-date-picker-input__field`,
1058
1085
  `__fields`, `__placeholder`, `__separator`, `__calendar-btn`) moved to a shared
@@ -1283,7 +1310,7 @@ rg -n 'disabled-while-loading|disabledWhileLoading' # removed
1283
1310
  rg -n 'animate-x|animate-y|animateX|animateY' # → disableAnimate*, now default-on
1284
1311
  rg -n 'thumb-translate|thumbTranslate' # → disable-thumb-translate
1285
1312
  rg -n ':flip=|flip="' # → disable-flip on palette/select-popover
1286
- rg -n 'hide-arrow|show-arrow|arrow-padding|hideArrow|showArrow|arrowPadding' # removed off tooltips
1313
+ rg -n 'hide-arrow|show-arrow|arrow-padding|hideArrow|showArrow|arrowPadding' # removed EVERYWHERE EXCEPT BbTooltip, which keeps hide-arrow + arrow-padding — hits on a tooltip are fine
1287
1314
  rg -n '<BbChip' # component removed → BbBadge clearable
1288
1315
  rg -n '<BbBadge' # v2 badges are v3 indicators — review each
1289
1316
  rg -n '<BbTab\b' # → BbTabs (\b so a tag name alone on its line still matches, and <BbTabs does not)
package/dist/ai/index.md CHANGED
@@ -12,7 +12,7 @@ This index helps agents quickly find component intent and authored guides before
12
12
  - Setup policy: verify installation + plugin setup before proposing usage code.
13
13
  - Icon policy: discover available icons first and use only existing icon names.
14
14
  - Contract-first policy: each component link below is a typed contract (props/events/slots/v-model). Read `source/<Name>.md` only when the contract is not enough.
15
- - Machine-readable manifest: [components.json](./components.json) lists every component API surface for programmatic validation.
15
+ - Machine-readable manifest: [components.json](./components.json) lists every component API surface for programmatic validation, plus a `types` array of the public TYPE exports (`BbTableColumn`, `BbDropdownItem`, …) naming the prop each one types and a `usage` tier — `api` is the two dozen you actually reach for, `wrapper` is for wrapping our components in yours, `advanced` is registries and contexts. Those are not components: import them, never write them as a tag.
16
16
  - Package path: use `dist/ai/guides/ai-router.md` (then `dist/ai/index.md`) inside the installed `bitboss-ui` package (`node_modules/bitboss-ui/dist/ai/`).
17
17
 
18
18
  ## Recipes (Page-Level Assemblies)
@@ -1286,7 +1286,7 @@ const selectedCount = computed(() =>
1286
1286
  <!-- Receipt: bigger than the row thumbnail, with a full-size link out. -->
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
  Receipt
1292
1292
  </h3>
@@ -1333,7 +1333,7 @@ const selectedCount = computed(() =>
1333
1333
  <!-- Activity feed. -->
1334
1334
  <section class="flex flex-col gap-1.5">
1335
1335
  <h3
1336
- class="text-xs font-semibold uppercase tracking-wide text-[color:var(--bb-text-muted)]"
1336
+ class="text-xs font-semibold tracking-wide text-[color:var(--bb-text-muted)] uppercase"
1337
1337
  >
1338
1338
  Activity
1339
1339
  </h3>
@@ -1487,7 +1487,7 @@ const statusLabel = (status: ExpenseStatus) =>
1487
1487
  <!-- Recent expenses: names drill down again — the stack keeps growing. -->
1488
1488
  <section class="flex flex-col gap-1.5">
1489
1489
  <h3
1490
- class="text-xs font-semibold uppercase tracking-wide text-[color:var(--bb-text-muted)]"
1490
+ class="text-xs font-semibold tracking-wide text-[color:var(--bb-text-muted)] uppercase"
1491
1491
  >
1492
1492
  Recent expenses
1493
1493
  </h3>
@@ -1585,7 +1585,7 @@ const selectedCount = computed(() =>
1585
1585
  <!-- Description. -->
1586
1586
  <section class="flex flex-col gap-1.5">
1587
1587
  <h3
1588
- class="text-xs font-semibold uppercase tracking-wide text-[color:var(--bb-text-muted)]"
1588
+ class="text-xs font-semibold tracking-wide text-[color:var(--bb-text-muted)] uppercase"
1589
1589
  >
1590
1590
  Description
1591
1591
  </h3>
@@ -1597,7 +1597,7 @@ const selectedCount = computed(() =>
1597
1597
  <!-- Activity feed. -->
1598
1598
  <section class="flex flex-col gap-1.5">
1599
1599
  <h3
1600
- class="text-xs font-semibold uppercase tracking-wide text-[color:var(--bb-text-muted)]"
1600
+ class="text-xs font-semibold tracking-wide text-[color:var(--bb-text-muted)] uppercase"
1601
1601
  >
1602
1602
  Activity
1603
1603
  </h3>
@@ -841,7 +841,7 @@ const ctx = useOnboardingWorkspace();
841
841
  </span>
842
842
  <span
843
843
  v-if="step.status === 'skipped'"
844
- class="shrink-0 text-xs uppercase tracking-wide text-[color:var(--bb-text-muted)]"
844
+ class="shrink-0 text-xs tracking-wide text-[color:var(--bb-text-muted)] uppercase"
845
845
  >
846
846
  Skipped
847
847
  </span>
@@ -1467,7 +1467,7 @@ const cadences: { value: ReminderCadence; label: string }[] = [
1467
1467
  <!-- What you'll get. -->
1468
1468
  <section class="flex flex-col gap-2.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
  What you'll get
1473
1473
  </h3>
@@ -1122,7 +1122,7 @@ const onTransfer = (value: unknown) => {
1122
1122
 
1123
1123
  <section v-if="owner.notes" class="flex flex-col gap-1.5">
1124
1124
  <h3
1125
- class="text-xs font-semibold uppercase tracking-wide text-[color:var(--bb-text-muted)]"
1125
+ class="text-xs font-semibold tracking-wide text-[color:var(--bb-text-muted)] uppercase"
1126
1126
  >
1127
1127
  Notes
1128
1128
  </h3>
@@ -1132,7 +1132,7 @@ const onTransfer = (value: unknown) => {
1132
1132
  <!-- Rollup by holding type. -->
1133
1133
  <section class="flex flex-col gap-1.5">
1134
1134
  <h3
1135
- class="text-xs font-semibold uppercase tracking-wide text-[color:var(--bb-text-muted)]"
1135
+ class="text-xs font-semibold tracking-wide text-[color:var(--bb-text-muted)] uppercase"
1136
1136
  >
1137
1137
  By type
1138
1138
  </h3>
@@ -1144,11 +1144,11 @@ const onTransfer = (value: unknown) => {
1144
1144
  >
1145
1145
  <span class="min-w-0">{{ KIND_LABEL[row.kind] }}</span>
1146
1146
  <span
1147
- class="text-xs tabular-nums text-[color:var(--bb-text-muted)]"
1147
+ class="text-xs text-[color:var(--bb-text-muted)] tabular-nums"
1148
1148
  >{{ row.count }}</span
1149
1149
  >
1150
1150
  <span
1151
- class="text-xs tabular-nums text-[color:var(--bb-text-muted)]"
1151
+ class="text-xs text-[color:var(--bb-text-muted)] tabular-nums"
1152
1152
  >{{ money(row.monthlyCost) }}</span
1153
1153
  >
1154
1154
  </li>
@@ -1158,7 +1158,7 @@ const onTransfer = (value: unknown) => {
1158
1158
  <!-- The holdings themselves — a real list, not a summary sentence. -->
1159
1159
  <section class="flex flex-col gap-1.5">
1160
1160
  <h3
1161
- class="text-xs font-semibold uppercase tracking-wide text-[color:var(--bb-text-muted)]"
1161
+ class="text-xs font-semibold tracking-wide text-[color:var(--bb-text-muted)] uppercase"
1162
1162
  >
1163
1163
  Holdings
1164
1164
  </h3>
@@ -1179,7 +1179,7 @@ const onTransfer = (value: unknown) => {
1179
1179
  {{ STATUS_LABEL[holding.status] }}
1180
1180
  </BbBadge>
1181
1181
  <span
1182
- class="text-xs tabular-nums text-[color:var(--bb-text-muted)]"
1182
+ class="text-xs text-[color:var(--bb-text-muted)] tabular-nums"
1183
1183
  >{{ money(holding.monthlyCost) }}</span
1184
1184
  >
1185
1185
  </div>
@@ -686,7 +686,7 @@ const trail = computed(() => [
686
686
  <template>
687
687
  <section class="flex flex-col gap-3">
688
688
  <h2
689
- class="text-xs font-semibold uppercase tracking-wide text-[color:var(--bb-text-muted)]"
689
+ class="text-xs font-semibold tracking-wide text-[color:var(--bb-text-muted)] uppercase"
690
690
  >
691
691
  Details
692
692
  </h2>
@@ -801,7 +801,7 @@ const ctx = useInvoiceForm();
801
801
  <section class="flex flex-col gap-3">
802
802
  <div class="flex items-center justify-between">
803
803
  <h2
804
- class="text-xs font-semibold uppercase tracking-wide text-[color:var(--bb-text-muted)]"
804
+ class="text-xs font-semibold tracking-wide text-[color:var(--bb-text-muted)] uppercase"
805
805
  >
806
806
  Line items
807
807
  </h2>
@@ -1288,7 +1288,7 @@ const ctx = useInvoiceForm();
1288
1288
  <!-- Billing profile: exactly the fields this form negotiates. -->
1289
1289
  <section class="flex flex-col gap-1.5">
1290
1290
  <h3
1291
- class="text-xs font-semibold uppercase tracking-wide text-[color:var(--bb-text-muted)]"
1291
+ class="text-xs font-semibold tracking-wide text-[color:var(--bb-text-muted)] uppercase"
1292
1292
  >
1293
1293
  Billing profile
1294
1294
  </h3>
@@ -1318,7 +1318,7 @@ const ctx = useInvoiceForm();
1318
1318
  through the route-leave guard. -->
1319
1319
  <section class="flex flex-col gap-1.5">
1320
1320
  <h3
1321
- class="text-xs font-semibold uppercase tracking-wide text-[color:var(--bb-text-muted)]"
1321
+ class="text-xs font-semibold tracking-wide text-[color:var(--bb-text-muted)] uppercase"
1322
1322
  >
1323
1323
  Recent invoices
1324
1324
  </h3>
@@ -1332,7 +1332,7 @@ const ctx = useInvoiceForm();
1332
1332
  {{ recent.number }}
1333
1333
  </BbBaseButton>
1334
1334
  <BbBadge variant="outline">{{ recent.status }}</BbBadge>
1335
- <span class="text-xs tabular-nums text-[color:var(--bb-text-muted)]">
1335
+ <span class="text-xs text-[color:var(--bb-text-muted)] tabular-nums">
1336
1336
  {{ currency.format(recent.amount) }}
1337
1337
  </span>
1338
1338
  </li>
@@ -1156,7 +1156,7 @@ const selectedCount = computed(() =>
1156
1156
  <!-- Line items: a real mini-table, not a summary sentence. -->
1157
1157
  <section class="flex flex-col gap-1.5">
1158
1158
  <h3
1159
- class="text-xs font-semibold uppercase tracking-wide text-[color:var(--bb-text-muted)]"
1159
+ class="text-xs font-semibold tracking-wide text-[color:var(--bb-text-muted)] uppercase"
1160
1160
  >
1161
1161
  Line items
1162
1162
  </h3>
@@ -1180,7 +1180,7 @@ const selectedCount = computed(() =>
1180
1180
  <!-- Payments so far. -->
1181
1181
  <section v-if="invoice.payments.length" class="flex flex-col gap-1.5">
1182
1182
  <h3
1183
- class="text-xs font-semibold uppercase tracking-wide text-[color:var(--bb-text-muted)]"
1183
+ class="text-xs font-semibold tracking-wide text-[color:var(--bb-text-muted)] uppercase"
1184
1184
  >
1185
1185
  Payments
1186
1186
  </h3>
@@ -1203,7 +1203,7 @@ const selectedCount = computed(() =>
1203
1203
  <!-- Activity feed. -->
1204
1204
  <section class="flex flex-col gap-1.5">
1205
1205
  <h3
1206
- class="text-xs font-semibold uppercase tracking-wide text-[color:var(--bb-text-muted)]"
1206
+ class="text-xs font-semibold tracking-wide text-[color:var(--bb-text-muted)] uppercase"
1207
1207
  >
1208
1208
  Activity
1209
1209
  </h3>
@@ -1353,7 +1353,7 @@ const longDate = (value: string) =>
1353
1353
  variant — same identity-cell rule as the invoices table. -->
1354
1354
  <section class="flex flex-col gap-1.5">
1355
1355
  <h3
1356
- class="text-xs font-semibold uppercase tracking-wide text-[color:var(--bb-text-muted)]"
1356
+ class="text-xs font-semibold tracking-wide text-[color:var(--bb-text-muted)] uppercase"
1357
1357
  >
1358
1358
  Recent invoices
1359
1359
  </h3>
@@ -1174,7 +1174,7 @@ const formattedSize = computed(() => {
1174
1174
  class="flex-1"
1175
1175
  :model-value="upload.progress"
1176
1176
  />
1177
- <span class="text-xs tabular-nums text-[color:var(--bb-text-muted)]"
1177
+ <span class="text-xs text-[color:var(--bb-text-muted)] tabular-nums"
1178
1178
  >{{ upload.progress }}%</span
1179
1179
  >
1180
1180
  </div>
@@ -1631,7 +1631,7 @@ const selectedCount = computed(() =>
1631
1631
  <section class="flex flex-col gap-1.5">
1632
1632
  <div class="flex items-center justify-between">
1633
1633
  <h3
1634
- class="text-xs font-semibold uppercase tracking-wide text-[color:var(--bb-text-muted)]"
1634
+ class="text-xs font-semibold tracking-wide text-[color:var(--bb-text-muted)] uppercase"
1635
1635
  >
1636
1636
  Extracted fields
1637
1637
  </h3>
@@ -1671,7 +1671,7 @@ const selectedCount = computed(() =>
1671
1671
  one-click cell as in the table. -->
1672
1672
  <section class="flex flex-col gap-1.5">
1673
1673
  <h3
1674
- class="text-xs font-semibold uppercase tracking-wide text-[color:var(--bb-text-muted)]"
1674
+ class="text-xs font-semibold tracking-wide text-[color:var(--bb-text-muted)] uppercase"
1675
1675
  >
1676
1676
  Details
1677
1677
  </h3>
@@ -1688,7 +1688,7 @@ const selectedCount = computed(() =>
1688
1688
  <!-- Activity feed. -->
1689
1689
  <section class="flex flex-col gap-1.5">
1690
1690
  <h3
1691
- class="text-xs font-semibold uppercase tracking-wide text-[color:var(--bb-text-muted)]"
1691
+ class="text-xs font-semibold tracking-wide text-[color:var(--bb-text-muted)] uppercase"
1692
1692
  >
1693
1693
  Activity
1694
1694
  </h3>
@@ -1840,7 +1840,7 @@ const longDate = (value: string) =>
1840
1840
  <!-- Recent receipts: names drill down again — the stack keeps growing. -->
1841
1841
  <section class="flex flex-col gap-1.5">
1842
1842
  <h3
1843
- class="text-xs font-semibold uppercase tracking-wide text-[color:var(--bb-text-muted)]"
1843
+ class="text-xs font-semibold tracking-wide text-[color:var(--bb-text-muted)] uppercase"
1844
1844
  >
1845
1845
  Recent receipts
1846
1846
  </h3>
@@ -1860,7 +1860,7 @@ const longDate = (value: string) =>
1860
1860
  <BbBadge :variant="STATUS_VARIANT[recent.status]">{{
1861
1861
  STATUS_LABEL[recent.status]
1862
1862
  }}</BbBadge>
1863
- <span class="text-xs tabular-nums text-[color:var(--bb-text-muted)]">
1863
+ <span class="text-xs text-[color:var(--bb-text-muted)] tabular-nums">
1864
1864
  {{ currency.format(recent.amount) }}
1865
1865
  </span>
1866
1866
  </li>
@@ -1087,7 +1087,7 @@ const today = new Date().toISOString().slice(0, 10);
1087
1087
  >
1088
1088
  <div class="flex items-center justify-between gap-2">
1089
1089
  <h3
1090
- class="text-xs font-semibold uppercase tracking-wide text-[color:var(--bb-text-muted)]"
1090
+ class="text-xs font-semibold tracking-wide text-[color:var(--bb-text-muted)] uppercase"
1091
1091
  >
1092
1092
  Audience
1093
1093
  </h3>
@@ -1134,7 +1134,7 @@ const today = new Date().toISOString().slice(0, 10);
1134
1134
  >
1135
1135
  <div class="flex items-center justify-between gap-2">
1136
1136
  <h3
1137
- class="text-xs font-semibold uppercase tracking-wide text-[color:var(--bb-text-muted)]"
1137
+ class="text-xs font-semibold tracking-wide text-[color:var(--bb-text-muted)] uppercase"
1138
1138
  >
1139
1139
  Content
1140
1140
  </h3>
@@ -1165,7 +1165,7 @@ const today = new Date().toISOString().slice(0, 10);
1165
1165
  >
1166
1166
  <div class="flex items-center justify-between gap-2">
1167
1167
  <h3
1168
- class="text-xs font-semibold uppercase tracking-wide text-[color:var(--bb-text-muted)]"
1168
+ class="text-xs font-semibold tracking-wide text-[color:var(--bb-text-muted)] uppercase"
1169
1169
  >
1170
1170
  Schedule
1171
1171
  </h3>
@@ -1331,7 +1331,7 @@ const isReview = computed(() => ctx.step.value === 'review');
1331
1331
  <!-- The segment's definition, so "who is in here" is answerable in place. -->
1332
1332
  <section class="flex flex-col gap-1.5">
1333
1333
  <h3
1334
- class="text-xs font-semibold uppercase tracking-wide text-[color:var(--bb-text-muted)]"
1334
+ class="text-xs font-semibold tracking-wide text-[color:var(--bb-text-muted)] uppercase"
1335
1335
  >
1336
1336
  Conditions
1337
1337
  </h3>
@@ -1350,7 +1350,7 @@ const isReview = computed(() => ctx.step.value === 'review');
1350
1350
  <!-- Recent campaigns to this segment: fatigue check before sending. -->
1351
1351
  <section class="flex flex-col gap-1.5">
1352
1352
  <h3
1353
- class="text-xs font-semibold uppercase tracking-wide text-[color:var(--bb-text-muted)]"
1353
+ class="text-xs font-semibold tracking-wide text-[color:var(--bb-text-muted)] uppercase"
1354
1354
  >
1355
1355
  Recent campaigns
1356
1356
  </h3>
@@ -1234,7 +1234,7 @@ const clearSelection = () => {
1234
1234
  <!-- Receipt: bigger than the row thumbnail, with a full-size link out. -->
1235
1235
  <section class="flex flex-col gap-1.5">
1236
1236
  <h3
1237
- class="text-xs font-semibold uppercase tracking-wide text-[color:var(--bb-text-muted)]"
1237
+ class="text-xs font-semibold tracking-wide text-[color:var(--bb-text-muted)] uppercase"
1238
1238
  >
1239
1239
  Receipt
1240
1240
  </h3>
@@ -1281,7 +1281,7 @@ const clearSelection = () => {
1281
1281
  <!-- Activity feed. -->
1282
1282
  <section class="flex flex-col gap-1.5">
1283
1283
  <h3
1284
- class="text-xs font-semibold uppercase tracking-wide text-[color:var(--bb-text-muted)]"
1284
+ class="text-xs font-semibold tracking-wide text-[color:var(--bb-text-muted)] uppercase"
1285
1285
  >
1286
1286
  Activity
1287
1287
  </h3>
@@ -1435,7 +1435,7 @@ const statusLabel = (status: ExpenseStatus) =>
1435
1435
  <!-- Recent expenses: names drill down again — the stack keeps growing. -->
1436
1436
  <section class="flex flex-col gap-1.5">
1437
1437
  <h3
1438
- class="text-xs font-semibold uppercase tracking-wide text-[color:var(--bb-text-muted)]"
1438
+ class="text-xs font-semibold tracking-wide text-[color:var(--bb-text-muted)] uppercase"
1439
1439
  >
1440
1440
  Recent expenses
1441
1441
  </h3>
@@ -1548,7 +1548,7 @@ const clearSelection = () => {
1548
1548
  <!-- Description. -->
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
  Description
1554
1554
  </h3>
@@ -1560,7 +1560,7 @@ const clearSelection = () => {
1560
1560
  <!-- Activity feed. -->
1561
1561
  <section class="flex flex-col gap-1.5">
1562
1562
  <h3
1563
- class="text-xs font-semibold uppercase tracking-wide text-[color:var(--bb-text-muted)]"
1563
+ class="text-xs font-semibold tracking-wide text-[color:var(--bb-text-muted)] uppercase"
1564
1564
  >
1565
1565
  Activity
1566
1566
  </h3>
@@ -808,7 +808,7 @@ const ctx = useOnboardingWorkspace();
808
808
  </span>
809
809
  <span
810
810
  v-if="step.status === 'skipped'"
811
- class="shrink-0 text-xs uppercase tracking-wide text-[color:var(--bb-text-muted)]"
811
+ class="shrink-0 text-xs tracking-wide text-[color:var(--bb-text-muted)] uppercase"
812
812
  >
813
813
  Skipped
814
814
  </span>
@@ -1414,7 +1414,7 @@ const cadences: { value: ReminderCadence; label: string }[] = [
1414
1414
  <!-- What you'll get. -->
1415
1415
  <section class="flex flex-col gap-2.5">
1416
1416
  <h3
1417
- class="text-xs font-semibold uppercase tracking-wide text-[color:var(--bb-text-muted)]"
1417
+ class="text-xs font-semibold tracking-wide text-[color:var(--bb-text-muted)] uppercase"
1418
1418
  >
1419
1419
  What you'll get
1420
1420
  </h3>
@@ -715,7 +715,7 @@ const trail = computed(() => [
715
715
  <template>
716
716
  <section class="flex flex-col gap-3">
717
717
  <h2
718
- class="text-xs font-semibold uppercase tracking-wide text-[color:var(--bb-text-muted)]"
718
+ class="text-xs font-semibold tracking-wide text-[color:var(--bb-text-muted)] uppercase"
719
719
  >
720
720
  Details
721
721
  </h2>
@@ -830,7 +830,7 @@ const ctx = useInvoiceForm();
830
830
  <section class="flex flex-col gap-3">
831
831
  <div class="flex items-center justify-between">
832
832
  <h2
833
- class="text-xs font-semibold uppercase tracking-wide text-[color:var(--bb-text-muted)]"
833
+ class="text-xs font-semibold tracking-wide text-[color:var(--bb-text-muted)] uppercase"
834
834
  >
835
835
  Line items
836
836
  </h2>
@@ -1317,7 +1317,7 @@ const ctx = useInvoiceForm();
1317
1317
  <!-- Billing profile: exactly the fields this form negotiates. -->
1318
1318
  <section class="flex flex-col gap-1.5">
1319
1319
  <h3
1320
- class="text-xs font-semibold uppercase tracking-wide text-[color:var(--bb-text-muted)]"
1320
+ class="text-xs font-semibold tracking-wide text-[color:var(--bb-text-muted)] uppercase"
1321
1321
  >
1322
1322
  Billing profile
1323
1323
  </h3>
@@ -1347,7 +1347,7 @@ const ctx = useInvoiceForm();
1347
1347
  through the route-leave guard. -->
1348
1348
  <section class="flex flex-col gap-1.5">
1349
1349
  <h3
1350
- class="text-xs font-semibold uppercase tracking-wide text-[color:var(--bb-text-muted)]"
1350
+ class="text-xs font-semibold tracking-wide text-[color:var(--bb-text-muted)] uppercase"
1351
1351
  >
1352
1352
  Recent invoices
1353
1353
  </h3>
@@ -1361,7 +1361,7 @@ const ctx = useInvoiceForm();
1361
1361
  {{ recent.number }}
1362
1362
  </BbBaseButton>
1363
1363
  <BbBadge variant="outline">{{ recent.status }}</BbBadge>
1364
- <span class="text-xs tabular-nums text-[color:var(--bb-text-muted)]">
1364
+ <span class="text-xs text-[color:var(--bb-text-muted)] tabular-nums">
1365
1365
  {{ currency.format(recent.amount) }}
1366
1366
  </span>
1367
1367
  </li>
@@ -1141,7 +1141,7 @@ const clearSelection = () => {
1141
1141
  <!-- Line items: a real mini-table, not a summary sentence. -->
1142
1142
  <section class="flex flex-col gap-1.5">
1143
1143
  <h3
1144
- class="text-xs font-semibold uppercase tracking-wide text-[color:var(--bb-text-muted)]"
1144
+ class="text-xs font-semibold tracking-wide text-[color:var(--bb-text-muted)] uppercase"
1145
1145
  >
1146
1146
  Line items
1147
1147
  </h3>
@@ -1165,7 +1165,7 @@ const clearSelection = () => {
1165
1165
  <!-- Payments so far. -->
1166
1166
  <section v-if="invoice.payments.length" class="flex flex-col gap-1.5">
1167
1167
  <h3
1168
- class="text-xs font-semibold uppercase tracking-wide text-[color:var(--bb-text-muted)]"
1168
+ class="text-xs font-semibold tracking-wide text-[color:var(--bb-text-muted)] uppercase"
1169
1169
  >
1170
1170
  Payments
1171
1171
  </h3>
@@ -1188,7 +1188,7 @@ const clearSelection = () => {
1188
1188
  <!-- Activity feed. -->
1189
1189
  <section class="flex flex-col gap-1.5">
1190
1190
  <h3
1191
- class="text-xs font-semibold uppercase tracking-wide text-[color:var(--bb-text-muted)]"
1191
+ class="text-xs font-semibold tracking-wide text-[color:var(--bb-text-muted)] uppercase"
1192
1192
  >
1193
1193
  Activity
1194
1194
  </h3>
@@ -1311,7 +1311,7 @@ const longDate = (value: string) =>
1311
1311
  variant — same identity-cell rule as the invoices table. -->
1312
1312
  <section class="flex flex-col gap-1.5">
1313
1313
  <h3
1314
- class="text-xs font-semibold uppercase tracking-wide text-[color:var(--bb-text-muted)]"
1314
+ class="text-xs font-semibold tracking-wide text-[color:var(--bb-text-muted)] uppercase"
1315
1315
  >
1316
1316
  Recent invoices
1317
1317
  </h3>
@@ -1102,7 +1102,7 @@ const formattedSize = computed(() => {
1102
1102
  class="flex-1"
1103
1103
  :model-value="upload.progress"
1104
1104
  />
1105
- <span class="text-xs tabular-nums text-[color:var(--bb-text-muted)]"
1105
+ <span class="text-xs text-[color:var(--bb-text-muted)] tabular-nums"
1106
1106
  >{{ upload.progress }}%</span
1107
1107
  >
1108
1108
  </div>
@@ -1539,7 +1539,7 @@ const clearSelection = () => {
1539
1539
  <section class="flex flex-col gap-1.5">
1540
1540
  <div class="flex items-center justify-between">
1541
1541
  <h3
1542
- class="text-xs font-semibold uppercase tracking-wide text-[color:var(--bb-text-muted)]"
1542
+ class="text-xs font-semibold tracking-wide text-[color:var(--bb-text-muted)] uppercase"
1543
1543
  >
1544
1544
  Extracted fields
1545
1545
  </h3>
@@ -1579,7 +1579,7 @@ const clearSelection = () => {
1579
1579
  one-click cell as in the table. -->
1580
1580
  <section class="flex flex-col gap-1.5">
1581
1581
  <h3
1582
- class="text-xs font-semibold uppercase tracking-wide text-[color:var(--bb-text-muted)]"
1582
+ class="text-xs font-semibold tracking-wide text-[color:var(--bb-text-muted)] uppercase"
1583
1583
  >
1584
1584
  Details
1585
1585
  </h3>
@@ -1596,7 +1596,7 @@ const clearSelection = () => {
1596
1596
  <!-- Activity feed. -->
1597
1597
  <section class="flex flex-col gap-1.5">
1598
1598
  <h3
1599
- class="text-xs font-semibold uppercase tracking-wide text-[color:var(--bb-text-muted)]"
1599
+ class="text-xs font-semibold tracking-wide text-[color:var(--bb-text-muted)] uppercase"
1600
1600
  >
1601
1601
  Activity
1602
1602
  </h3>
@@ -1746,7 +1746,7 @@ const longDate = (value: string) =>
1746
1746
  <!-- Recent receipts: names drill down again — the stack keeps growing. -->
1747
1747
  <section class="flex flex-col gap-1.5">
1748
1748
  <h3
1749
- class="text-xs font-semibold uppercase tracking-wide text-[color:var(--bb-text-muted)]"
1749
+ class="text-xs font-semibold tracking-wide text-[color:var(--bb-text-muted)] uppercase"
1750
1750
  >
1751
1751
  Recent receipts
1752
1752
  </h3>
@@ -1764,7 +1764,7 @@ const longDate = (value: string) =>
1764
1764
  {{ recent.filename }}
1765
1765
  </BbButton>
1766
1766
  <BbBadge variant="outline">{{ recent.status }}</BbBadge>
1767
- <span class="text-xs tabular-nums text-[color:var(--bb-text-muted)]">
1767
+ <span class="text-xs text-[color:var(--bb-text-muted)] tabular-nums">
1768
1768
  {{ currency.format(recent.amount) }}
1769
1769
  </span>
1770
1770
  </li>