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

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 (183) 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/BbBaseRadioIcon.md +6 -10
  11. package/dist/ai/BbBaseSwitchIcon.md +5 -9
  12. package/dist/ai/BbBreadcrumbs.md +23 -34
  13. package/dist/ai/BbButton.md +35 -47
  14. package/dist/ai/BbCheckbox.md +21 -37
  15. package/dist/ai/BbCheckboxGroup.md +13 -13
  16. package/dist/ai/BbCollapsible.md +14 -26
  17. package/dist/ai/BbColorInput.md +13 -23
  18. package/dist/ai/BbColorPalette.md +23 -35
  19. package/dist/ai/BbConfirm.md +17 -32
  20. package/dist/ai/BbDatePickerInput.md +15 -21
  21. package/dist/ai/BbDialog.md +159 -62
  22. package/dist/ai/BbDropdown.md +21 -25
  23. package/dist/ai/BbDropdownButton.md +13 -30
  24. package/dist/ai/BbDropzone.md +9 -11
  25. package/dist/ai/BbIcon.md +44 -33
  26. package/dist/ai/BbIndicator.md +2 -2
  27. package/dist/ai/BbNumberInput.md +18 -20
  28. package/dist/ai/BbOffCanvas.md +42 -42
  29. package/dist/ai/BbPagination.md +21 -23
  30. package/dist/ai/BbPopover.md +15 -17
  31. package/dist/ai/BbProgress.md +40 -51
  32. package/dist/ai/BbRadio.md +9 -9
  33. package/dist/ai/BbRadioGroup.md +7 -11
  34. package/dist/ai/BbRating.md +8 -12
  35. package/dist/ai/BbSelect.md +32 -36
  36. package/dist/ai/BbSelectPopover.md +19 -31
  37. package/dist/ai/BbSlider.md +15 -19
  38. package/dist/ai/BbSmoothHeight.md +16 -31
  39. package/dist/ai/BbSpinner.md +118 -74
  40. package/dist/ai/BbSwitch.md +25 -18
  41. package/dist/ai/BbSwitchGroup.md +9 -14
  42. package/dist/ai/BbTable.md +102 -55
  43. package/dist/ai/BbTabs.md +59 -82
  44. package/dist/ai/BbTag.md +12 -23
  45. package/dist/ai/BbTextInput.md +20 -26
  46. package/dist/ai/BbTextarea.md +28 -34
  47. package/dist/ai/BbToast.md +14 -34
  48. package/dist/ai/BbTooltip.md +22 -20
  49. package/dist/ai/BbTree.md +46 -72
  50. package/dist/ai/changelog.json +169 -62
  51. package/dist/ai/components.json +1467 -9
  52. package/dist/ai/composables/useConfirm.md +5 -2
  53. package/dist/ai/composables/useToast.md +4 -2
  54. package/dist/ai/guides/agent-contract.md +7 -4
  55. package/dist/ai/guides/ai-router.md +37 -22
  56. package/dist/ai/guides/component-picker.md +23 -18
  57. package/dist/ai/guides/design-language.md +141 -13
  58. package/dist/ai/guides/design-tokens.md +29 -4
  59. package/dist/ai/guides/icons-policy.md +46 -21
  60. package/dist/ai/guides/installation-and-plugin-setup.md +253 -17
  61. package/dist/ai/guides/migration/components/bb-rating.md +26 -1
  62. package/dist/ai/guides/migration/components/bb-tooltip.md +18 -0
  63. package/dist/ai/guides/migration/v2-to-v3.md +50 -23
  64. package/dist/ai/index.md +1 -1
  65. package/dist/ai/recipes/inertia/approvals-inbox.md +3 -3
  66. package/dist/ai/recipes/inertia/inline-edit-workspace.md +2 -2
  67. package/dist/ai/recipes/inertia/onboarding.md +2 -2
  68. package/dist/ai/recipes/inertia/ownership-atlas.md +6 -6
  69. package/dist/ai/recipes/inertia/record-form.md +5 -5
  70. package/dist/ai/recipes/inertia/records-workspace.md +4 -4
  71. package/dist/ai/recipes/inertia/upload-center.md +6 -6
  72. package/dist/ai/recipes/inertia/wizard-form.md +5 -5
  73. package/dist/ai/recipes/nuxt/approvals-inbox.md +3 -3
  74. package/dist/ai/recipes/nuxt/inline-edit-workspace.md +2 -2
  75. package/dist/ai/recipes/nuxt/onboarding.md +2 -2
  76. package/dist/ai/recipes/nuxt/record-form.md +5 -5
  77. package/dist/ai/recipes/nuxt/records-workspace.md +4 -4
  78. package/dist/ai/recipes/nuxt/upload-center.md +6 -6
  79. package/dist/ai/recipes/nuxt/wizard-form.md +5 -5
  80. package/dist/ai/recipes/vue/approvals-inbox.md +3 -3
  81. package/dist/ai/recipes/vue/inline-edit-workspace.md +2 -2
  82. package/dist/ai/recipes/vue/onboarding.md +2 -2
  83. package/dist/ai/recipes/vue/record-form.md +10 -10
  84. package/dist/ai/recipes/vue/records-workspace.md +4 -4
  85. package/dist/ai/recipes/vue/upload-center.md +6 -6
  86. package/dist/ai/recipes/vue/wizard-form.md +5 -5
  87. package/dist/ai/source/BbBadge.md +1 -1
  88. package/dist/ai/source/BbBaseCheckbox.md +1 -1
  89. package/dist/ai/source/BbBaseDatePicker.md +5 -5
  90. package/dist/ai/source/BbBaseDatePickerInput.md +2 -2
  91. package/dist/ai/source/BbBaseRadio.md +1 -1
  92. package/dist/ai/source/BbBaseRating.md +5 -5
  93. package/dist/ai/source/BbBaseSelect.md +1 -1
  94. package/dist/ai/source/BbBaseSlider.md +5 -5
  95. package/dist/ai/source/BbBaseSwitch.md +1 -1
  96. package/dist/ai/source/BbBaseTimePickerInput.md +1 -1
  97. package/dist/ai/source/BbBreadcrumbs.md +20 -1
  98. package/dist/ai/source/BbButton.md +2 -2
  99. package/dist/ai/source/BbDialog.md +39 -8
  100. package/dist/ai/source/BbDropdown.md +1 -1
  101. package/dist/ai/source/BbDropzone.md +5 -5
  102. package/dist/ai/source/BbIcon.md +23 -10
  103. package/dist/ai/source/BbOffCanvas.md +50 -28
  104. package/dist/ai/source/BbPagination.md +2 -2
  105. package/dist/ai/source/BbPopover.md +12 -1
  106. package/dist/ai/source/BbSelectPopover.md +45 -7
  107. package/dist/ai/source/BbSpinner.md +2 -2
  108. package/dist/ai/source/BbTable.md +11 -11
  109. package/dist/ai/source/BbTooltip.md +57 -10
  110. package/dist/ai/source/ChipsBox.md +1 -1
  111. package/dist/ai/source/CommaBox.md +1 -1
  112. package/dist/ai/source/GuidesComponent.md +14 -7
  113. package/dist/ai/source/OptionsContainer.md +1 -1
  114. package/dist/components/BbBadge/BadgeBodyContent.vue_vue_type_script_setup_true_lang.js +1 -1
  115. package/dist/components/BbBadge/BbBadge.vue_vue_type_script_setup_true_lang.js +1 -1
  116. package/dist/components/BbBaseCheckbox/BbBaseCheckbox.vue_vue_type_script_setup_true_lang.js +1 -1
  117. package/dist/components/BbBaseDatePicker/BbBaseDatePicker.vue_vue_type_script_setup_true_lang.js +4 -4
  118. package/dist/components/BbBaseDatePicker/BbBaseDatePickerInputDaySelector.vue_vue_type_script_setup_true_lang.js +1 -1
  119. package/dist/components/BbBaseDatePickerInput/BbBaseDatePickerInput.vue_vue_type_script_setup_true_lang.js +1 -1
  120. package/dist/components/BbBaseInputContainer/BbBaseInputContainer.vue.d.ts +1 -1
  121. package/dist/components/BbBaseRadio/BbBaseRadio.vue_vue_type_script_setup_true_lang.js +1 -1
  122. package/dist/components/BbBaseRating/BbBaseRating.vue_vue_type_script_setup_true_lang.js +3 -3
  123. package/dist/components/BbBaseSelect/BbBaseSelect.vue_vue_type_script_setup_true_lang.js +1 -1
  124. package/dist/components/BbBaseSlider/BbBaseSlider.vue_vue_type_script_setup_true_lang.js +3 -3
  125. package/dist/components/BbBaseSwitch/BbBaseSwitch.vue_vue_type_script_setup_true_lang.js +1 -1
  126. package/dist/components/BbBaseTimePickerInput/BbBaseTimePickerInput.vue_vue_type_script_setup_true_lang.js +1 -1
  127. package/dist/components/BbBreadcrumbs/BbBreadcrumbs.vue_vue_type_script_setup_true_lang.js +71 -71
  128. package/dist/components/BbButton/BbButton.vue_vue_type_script_setup_true_lang.js +2 -2
  129. package/dist/components/BbDialog/BbDialog.vue_vue_type_script_setup_true_lang.js +102 -97
  130. package/dist/components/BbDropdown/AdaptiveDropdown.vue_vue_type_script_setup_true_lang.js +1 -1
  131. package/dist/components/BbDropdown/BbDropdown.vue_vue_type_script_setup_true_lang.js +58 -58
  132. package/dist/components/BbDropzone/BbDropzone.vue_vue_type_script_setup_true_lang.js +2 -2
  133. package/dist/components/BbIcon/BbIcon.vue_vue_type_script_setup_true_lang.js +33 -35
  134. package/dist/components/BbIcon/iconCache.d.ts +30 -0
  135. package/dist/components/BbIcon/iconCache.js +21 -3
  136. package/dist/components/BbOffCanvas/BbOffCanvas.vue_vue_type_script_setup_true_lang.js +57 -56
  137. package/dist/components/BbPagination/BbPagination.vue_vue_type_script_setup_true_lang.js +2 -2
  138. package/dist/components/BbPopover/BbPopover.vue_vue_type_script_setup_true_lang.js +138 -138
  139. package/dist/components/BbSelectPopover/BbSelectPopover.vue_vue_type_script_setup_true_lang.js +43 -43
  140. package/dist/components/BbSpinner/BbSpinner.vue_vue_type_script_setup_true_lang.js +1 -1
  141. package/dist/components/BbSpinner/types.d.ts +1 -1
  142. package/dist/components/BbTable/BbTable.vue_vue_type_script_setup_true_lang.js +8 -8
  143. package/dist/components/BbTable/BbTableDataRow.js +2 -2
  144. package/dist/components/BbToast/BbToastRegion.vue_vue_type_script_setup_true_lang.js +62 -62
  145. package/dist/components/BbTooltip/BbTooltip.vue_vue_type_script_setup_true_lang.js +81 -78
  146. package/dist/components/BbTooltip/types.d.ts +8 -1
  147. package/dist/components/ChipsBox/ChipsBox.vue_vue_type_script_setup_true_lang.js +1 -1
  148. package/dist/components/CommaBox/CommaBox.vue_vue_type_script_setup_true_lang.js +1 -1
  149. package/dist/components/OptionsContainer/OptionsContainer.vue_vue_type_script_setup_true_lang.js +1 -1
  150. package/dist/composables/useConfirm.d.ts +22 -0
  151. package/dist/composables/useConfirm.js +43 -40
  152. package/dist/composables/useSafeAreaInternal.js +1 -1
  153. package/dist/composables/useToast.d.ts +16 -0
  154. package/dist/composables/useToast.js +20 -16
  155. package/dist/composables/useViewportWidth.d.ts +20 -6
  156. package/dist/composables/useViewportWidth.js +8 -7
  157. package/dist/icon-scan.d.ts +276 -0
  158. package/dist/icon-scan.js +485 -0
  159. package/dist/icons-whitelist.d.ts +5 -4
  160. package/dist/llms-full.txt +1979 -1527
  161. package/dist/llms-medium.txt +461 -74
  162. package/dist/llms.txt +1 -1
  163. package/dist/nuxt.js +10 -7
  164. package/dist/plugin.js +1 -0
  165. package/dist/runtime/nuxt-plugin.js +2 -1
  166. package/dist/styles.css +1 -1
  167. package/dist/types/Config.d.ts +18 -0
  168. package/dist/utils/cssLayers.d.ts +91 -0
  169. package/dist/utils/cssLayers.js +43 -0
  170. package/dist/utils/injectLibraryStyles.d.ts +3 -1
  171. package/dist/utils/injectLibraryStyles.js +24 -23
  172. package/dist/vite-plugin.d.ts +74 -11
  173. package/dist/vite.js +292 -253
  174. package/llms.txt +1 -1
  175. package/package.json +7 -5
  176. package/scripts/lib/ensure-manifest.mjs +28 -5
  177. package/scripts/lib/eslint-plugin.d.ts +35 -0
  178. package/scripts/lib/eslint-plugin.mjs +299 -3
  179. package/scripts/lib/hand-roll-hints.mjs +50 -6
  180. package/scripts/lib/html-attributes.mjs +42 -0
  181. package/scripts/lib/mcp-config.mjs +38 -34
  182. package/scripts/lib/public-type-exports.mjs +246 -0
  183. package/scripts/lib/validate-bb-markup.mjs +205 -12
@@ -43,12 +43,12 @@ object.
43
43
 
44
44
  ```vue
45
45
  <template>
46
- <div class="grid max-w-sm gap-3 rounded-[var(--bb-radius)] border p-3">
46
+ <div class="grid max-w-sm gap-3 rounded-(--bb-radius) border p-3">
47
47
  <div class="flex items-baseline justify-between gap-2">
48
48
  <h3 class="text-sm font-medium">ISSUE-1842</h3>
49
- <span class="text-xs text-[color:var(--bb-text-muted)]">In progress</span>
49
+ <span class="text-xs text-(--bb-text-muted)">In progress</span>
50
50
  </div>
51
- <p class="text-xs text-[color:var(--bb-text-muted)]">
51
+ <p class="text-xs text-(--bb-text-muted)">
52
52
  Wire invoice PDF export for the Milan office.
53
53
  </p>
54
54
  <BbSelect
@@ -198,10 +198,10 @@ model to `[]` (or `null` in single mode).
198
198
 
199
199
  ```vue
200
200
  <template>
201
- <div class="grid max-w-sm gap-3 rounded-[var(--bb-radius)] border p-3">
201
+ <div class="grid max-w-sm gap-3 rounded-(--bb-radius) border p-3">
202
202
  <div>
203
203
  <h3 class="text-sm font-medium">Warehouse coverage</h3>
204
- <p class="text-xs text-[color:var(--bb-text-muted)]">
204
+ <p class="text-xs text-(--bb-text-muted)">
205
205
  Cap at 3 hubs for the pilot route.
206
206
  </p>
207
207
  </div>
@@ -241,12 +241,10 @@ const cities = ref<string[]>(['ber', 'mil']);
241
241
 
242
242
  ```vue
243
243
  <template>
244
- <div class="grid max-w-sm gap-3 rounded-[var(--bb-radius)] border p-3">
244
+ <div class="grid max-w-sm gap-3 rounded-(--bb-radius) border p-3">
245
245
  <div>
246
246
  <h3 class="text-sm font-medium">Email digests</h3>
247
- <p class="text-xs text-[color:var(--bb-text-muted)]">
248
- Who gets the Monday summary?
249
- </p>
247
+ <p class="text-xs text-(--bb-text-muted)">Who gets the Monday summary?</p>
250
248
  </div>
251
249
  <BbSelect
252
250
  v-model="recipients"
@@ -293,10 +291,10 @@ v-model is yours:
293
291
 
294
292
  ```vue
295
293
  <template>
296
- <div class="grid max-w-sm gap-3 rounded-[var(--bb-radius)] border p-3">
294
+ <div class="grid max-w-sm gap-3 rounded-(--bb-radius) border p-3">
297
295
  <div>
298
296
  <h3 class="text-sm font-medium">Incident alerts</h3>
299
- <p class="text-xs text-[color:var(--bb-text-muted)]">
297
+ <p class="text-xs text-(--bb-text-muted)">
300
298
  Where should paging go when severity is high?
301
299
  </p>
302
300
  </div>
@@ -352,10 +350,10 @@ is yours:
352
350
 
353
351
  ```vue
354
352
  <template>
355
- <div class="grid max-w-sm gap-3 rounded-[var(--bb-radius)] border p-3">
353
+ <div class="grid max-w-sm gap-3 rounded-(--bb-radius) border p-3">
356
354
  <div>
357
355
  <h3 class="text-sm font-medium">Lisbon half-day</h3>
358
- <p class="text-xs text-[color:var(--bb-text-muted)]">
356
+ <p class="text-xs text-(--bb-text-muted)">
359
357
  Build a route under about four hours.
360
358
  </p>
361
359
  </div>
@@ -372,7 +370,7 @@ is yours:
372
370
  >
373
371
  <template #header="{ clear }">
374
372
  <div
375
- class="flex w-full items-center justify-between gap-2 px-1 text-xs text-[color:var(--bb-text-muted)]"
373
+ class="flex w-full items-center justify-between gap-2 px-1 text-xs text-(--bb-text-muted)"
376
374
  >
377
375
  <span>{{ summary }}</span>
378
376
  <BbButton
@@ -449,10 +447,10 @@ on your setup:
449
447
 
450
448
  ```vue
451
449
  <template>
452
- <div class="grid max-w-sm gap-3 rounded-[var(--bb-radius)] border p-3">
450
+ <div class="grid max-w-sm gap-3 rounded-(--bb-radius) border p-3">
453
451
  <div>
454
452
  <h3 class="text-sm font-medium">Shipping destination</h3>
455
- <p class="text-xs text-[color:var(--bb-text-muted)]">
453
+ <p class="text-xs text-(--bb-text-muted)">
456
454
  Search by city or country name.
457
455
  </p>
458
456
  </div>
@@ -507,10 +505,10 @@ short version:
507
505
 
508
506
  ```vue
509
507
  <template>
510
- <div class="grid max-w-sm gap-3 rounded-[var(--bb-radius)] border p-3">
508
+ <div class="grid max-w-sm gap-3 rounded-(--bb-radius) border p-3">
511
509
  <div>
512
510
  <h3 class="text-sm font-medium">Pull request reviewers</h3>
513
- <p class="text-xs text-[color:var(--bb-text-muted)]">
511
+ <p class="text-xs text-(--bb-text-muted)">
514
512
  Search the directory; picks stay pinned.
515
513
  </p>
516
514
  </div>
@@ -665,10 +663,10 @@ options to look, so you have to say so:
665
663
 
666
664
  ```vue
667
665
  <template>
668
- <div class="grid max-w-sm gap-3 rounded-[var(--bb-radius)] border p-3">
666
+ <div class="grid max-w-sm gap-3 rounded-(--bb-radius) border p-3">
669
667
  <div>
670
668
  <h3 class="text-sm font-medium">Invoice filters</h3>
671
- <p class="text-xs text-[color:var(--bb-text-muted)]">
669
+ <p class="text-xs text-(--bb-text-muted)">
672
670
  Office location, or every office.
673
671
  </p>
674
672
  </div>
@@ -682,7 +680,7 @@ options to look, so you have to say so:
682
680
  placeholder="Select location…"
683
681
  prefill
684
682
  />
685
- <p class="text-xs text-[color:var(--bb-text-muted)]">
683
+ <p class="text-xs text-(--bb-text-muted)">
686
684
  Filtering by:
687
685
  <strong>{{ location === null ? 'All locations' : location }}</strong>
688
686
  </p>
@@ -776,10 +774,10 @@ cleaned up automatically. Details in the Coherence playbook.
776
774
 
777
775
  ```vue
778
776
  <template>
779
- <div class="grid max-w-sm gap-3 rounded-[var(--bb-radius)] border p-3">
777
+ <div class="grid max-w-sm gap-3 rounded-(--bb-radius) border p-3">
780
778
  <div>
781
779
  <h3 class="text-sm font-medium">Shipping address</h3>
782
- <p class="text-xs text-[color:var(--bb-text-muted)]">
780
+ <p class="text-xs text-(--bb-text-muted)">
783
781
  City options follow the chosen region.
784
782
  </p>
785
783
  </div>
@@ -864,10 +862,10 @@ no watcher, no manual reset:
864
862
 
865
863
  ```vue
866
864
  <template>
867
- <div class="grid max-w-sm gap-3 rounded-[var(--bb-radius)] border p-3">
865
+ <div class="grid max-w-sm gap-3 rounded-(--bb-radius) border p-3">
868
866
  <div>
869
867
  <h3 class="text-sm font-medium">Review request</h3>
870
- <p class="text-xs text-[color:var(--bb-text-muted)]">
868
+ <p class="text-xs text-(--bb-text-muted)">
871
869
  Reviewers must belong to the selected project.
872
870
  </p>
873
871
  </div>
@@ -953,10 +951,10 @@ This is the idiomatic pattern for closed-but-growable vocabularies.
953
951
 
954
952
  ```vue
955
953
  <template>
956
- <div class="grid max-w-sm gap-3 rounded-[var(--bb-radius)] border p-3">
954
+ <div class="grid max-w-sm gap-3 rounded-(--bb-radius) border p-3">
957
955
  <div>
958
956
  <h3 class="text-sm font-medium">Issue labels</h3>
959
- <p class="text-xs text-[color:var(--bb-text-muted)]">
957
+ <p class="text-xs text-(--bb-text-muted)">
960
958
  Add from the list, or invent one with Enter.
961
959
  </p>
962
960
  </div>
@@ -1024,12 +1022,10 @@ lists window per row) or pre-chunk the data into smaller groups.
1024
1022
 
1025
1023
  ```vue
1026
1024
  <template>
1027
- <div class="grid max-w-sm gap-3 rounded-[var(--bb-radius)] border p-3">
1025
+ <div class="grid max-w-sm gap-3 rounded-(--bb-radius) border p-3">
1028
1026
  <div>
1029
1027
  <h3 class="text-sm font-medium">Invite teammate</h3>
1030
- <p class="text-xs text-[color:var(--bb-text-muted)]">
1031
- Roles grouped by department.
1032
- </p>
1028
+ <p class="text-xs text-(--bb-text-muted)">Roles grouped by department.</p>
1033
1029
  </div>
1034
1030
  <BbSelect
1035
1031
  v-model="role"
@@ -1044,7 +1040,7 @@ lists window per row) or pre-chunk the data into smaller groups.
1044
1040
  >
1045
1041
  <template #group="{ text, length }">
1046
1042
  <div
1047
- class="flex items-center justify-between px-2 text-xs font-semibold text-[color:var(--bb-text-muted)]"
1043
+ class="flex items-center justify-between px-2 text-xs font-semibold text-(--bb-text-muted)"
1048
1044
  >
1049
1045
  <span>{{ text }}</span>
1050
1046
  <span>{{ length }}</span>
@@ -1092,10 +1088,10 @@ compact control, so it keeps the compact rows on every device — turning
1092
1088
 
1093
1089
  ```vue
1094
1090
  <template>
1095
- <div class="grid max-w-sm gap-3 rounded-[var(--bb-radius)] border p-3">
1091
+ <div class="grid max-w-sm gap-3 rounded-(--bb-radius) border p-3">
1096
1092
  <div class="flex items-baseline justify-between gap-2">
1097
1093
  <h3 class="text-sm font-medium">Code review</h3>
1098
- <span class="text-xs text-[color:var(--bb-text-muted)]">PR #842</span>
1094
+ <span class="text-xs text-(--bb-text-muted)">PR #842</span>
1099
1095
  </div>
1100
1096
  <BbSelect
1101
1097
  v-model="assignee"
@@ -1110,7 +1106,7 @@ compact control, so it keeps the compact rows on every device — turning
1110
1106
  <span class="flex w-full items-center gap-2">
1111
1107
  <BbAvatar :alt="text" size="32">{{ item.initials }}</BbAvatar>
1112
1108
  <span class="min-w-0 flex-1 truncate">{{ text }}</span>
1113
- <span class="shrink-0 text-xs text-[color:var(--bb-text-muted)]">{{
1109
+ <span class="shrink-0 text-xs text-(--bb-text-muted)">{{
1114
1110
  item.role
1115
1111
  }}</span>
1116
1112
  </span>
@@ -1175,7 +1171,7 @@ once the chips outgrow the field — keep chips compact, or raise
1175
1171
 
1176
1172
  ```vue
1177
1173
  <template>
1178
- <div class="grid max-w-sm gap-3 rounded-[var(--bb-radius)] border p-3">
1174
+ <div class="grid max-w-sm gap-3 rounded-(--bb-radius) border p-3">
1179
1175
  <BbSelect
1180
1176
  v-model="tags"
1181
1177
  clearable
@@ -94,9 +94,9 @@ code, and it does not change meaning the day the array becomes a provider.)
94
94
  ```vue
95
95
  <template>
96
96
  <div
97
- class="flex max-w-sm items-center gap-1.5 rounded-[var(--bb-radius)] border p-2"
97
+ class="flex max-w-sm items-center gap-1.5 rounded-(--bb-radius) border p-2"
98
98
  >
99
- <span class="pr-1 text-xs font-medium text-[color:var(--bb-text-muted)]"
99
+ <span class="pr-1 text-xs font-medium text-(--bb-text-muted)"
100
100
  >Assignee</span
101
101
  >
102
102
  <BbSelectPopover
@@ -164,11 +164,9 @@ summarise the selection — a count, a chip cluster, an avatar stack — from
164
164
  ```vue
165
165
  <template>
166
166
  <div
167
- class="flex max-w-sm items-center gap-1.5 rounded-[var(--bb-radius)] border p-2"
167
+ class="flex max-w-sm items-center gap-1.5 rounded-(--bb-radius) border p-2"
168
168
  >
169
- <span class="pr-1 text-xs font-medium text-[color:var(--bb-text-muted)]"
170
- >Filters</span
171
- >
169
+ <span class="pr-1 text-xs font-medium text-(--bb-text-muted)">Filters</span>
172
170
  <BbSelectPopover
173
171
  v-model="reviewers"
174
172
  compact
@@ -234,11 +232,9 @@ height wins everywhere.
234
232
  ```vue
235
233
  <template>
236
234
  <div
237
- class="flex max-w-sm items-center gap-1.5 rounded-[var(--bb-radius)] border p-2"
235
+ class="flex max-w-sm items-center gap-1.5 rounded-(--bb-radius) border p-2"
238
236
  >
239
- <span class="pr-1 text-xs font-medium text-[color:var(--bb-text-muted)]"
240
- >Owner</span
241
- >
237
+ <span class="pr-1 text-xs font-medium text-(--bb-text-muted)">Owner</span>
242
238
  <BbSelectPopover
243
239
  v-model="owner"
244
240
  compact
@@ -318,11 +314,9 @@ resolvable even when later responses omit them.
318
314
  ```vue
319
315
  <template>
320
316
  <div
321
- class="flex max-w-sm items-center gap-1.5 rounded-[var(--bb-radius)] border p-2"
317
+ class="flex max-w-sm items-center gap-1.5 rounded-(--bb-radius) border p-2"
322
318
  >
323
- <span class="pr-1 text-xs font-medium text-[color:var(--bb-text-muted)]"
324
- >Trip</span
325
- >
319
+ <span class="pr-1 text-xs font-medium text-(--bb-text-muted)">Trip</span>
326
320
  <BbSelectPopover
327
321
  v-model="destination"
328
322
  compact
@@ -492,11 +486,9 @@ every row its own model.
492
486
  ```vue
493
487
  <template>
494
488
  <div
495
- class="flex max-w-md flex-wrap items-center gap-1.5 rounded-[var(--bb-radius)] border p-2"
489
+ class="flex max-w-md flex-wrap items-center gap-1.5 rounded-(--bb-radius) border p-2"
496
490
  >
497
- <span class="pr-1 text-xs font-medium text-[color:var(--bb-text-muted)]"
498
- >Filters</span
499
- >
491
+ <span class="pr-1 text-xs font-medium text-(--bb-text-muted)">Filters</span>
500
492
  <BbSelectPopover
501
493
  v-model="project"
502
494
  compact
@@ -638,7 +630,7 @@ row, including the hundreds nobody ever opens.
638
630
  <template>
639
631
  <div class="flex max-w-xl flex-col gap-1.5">
640
632
  <div
641
- class="overflow-hidden rounded-[var(--bb-radius)] border border-[color:var(--bb-border)]"
633
+ class="overflow-hidden rounded-(--bb-radius) border border-(--bb-border)"
642
634
  >
643
635
  <BbTable
644
636
  caption="Tickets — edit statuses, then Save the batch"
@@ -694,7 +686,7 @@ row, including the hundreds nobody ever opens.
694
686
  <BbButton :disabled="!dirtyCount" size="sm" @click="save">
695
687
  Save{{ dirtyCount ? ` (${dirtyCount})` : '' }}
696
688
  </BbButton>
697
- <span class="text-xs text-[color:var(--bb-text-muted)]">
689
+ <span class="text-xs text-(--bb-text-muted)">
698
690
  Edits live in a draft map keyed by row id — the map is the save payload.
699
691
  Rows are never mutated, so nothing is lost on a refetch.
700
692
  </span>
@@ -909,11 +901,9 @@ option. Identical to `BbSelect`, anchored to your trigger.
909
901
  ```vue
910
902
  <template>
911
903
  <div
912
- class="flex max-w-sm items-center gap-1.5 rounded-[var(--bb-radius)] border p-2"
904
+ class="flex max-w-sm items-center gap-1.5 rounded-(--bb-radius) border p-2"
913
905
  >
914
- <span class="pr-1 text-xs font-medium text-[color:var(--bb-text-muted)]"
915
- >Role</span
916
- >
906
+ <span class="pr-1 text-xs font-medium text-(--bb-text-muted)">Role</span>
917
907
  <BbSelectPopover
918
908
  v-model="role"
919
909
  compact
@@ -937,7 +927,7 @@ option. Identical to `BbSelect`, anchored to your trigger.
937
927
  </template>
938
928
  <template #group="{ text, length }">
939
929
  <div
940
- class="flex items-center justify-between px-2 text-xs font-medium text-[color:var(--bb-text-muted)]"
930
+ class="flex items-center justify-between px-2 text-xs font-medium text-(--bb-text-muted)"
941
931
  >
942
932
  <span>{{ text }}</span>
943
933
  <span>{{ length }}</span>
@@ -980,9 +970,9 @@ their string equivalents `loading-text` / `no-data-text`.
980
970
  ```vue
981
971
  <template>
982
972
  <div
983
- class="flex max-w-sm items-center gap-1.5 rounded-[var(--bb-radius)] border p-2"
973
+ class="flex max-w-sm items-center gap-1.5 rounded-(--bb-radius) border p-2"
984
974
  >
985
- <span class="pr-1 text-xs font-medium text-[color:var(--bb-text-muted)]"
975
+ <span class="pr-1 text-xs font-medium text-(--bb-text-muted)"
986
976
  >Destination</span
987
977
  >
988
978
  <BbSelectPopover
@@ -1058,11 +1048,9 @@ when the option list is short enough to just scroll.
1058
1048
  ```vue
1059
1049
  <template>
1060
1050
  <div
1061
- class="flex max-w-sm items-center gap-1.5 rounded-[var(--bb-radius)] border p-2"
1051
+ class="flex max-w-sm items-center gap-1.5 rounded-(--bb-radius) border p-2"
1062
1052
  >
1063
- <span class="pr-1 text-xs font-medium text-[color:var(--bb-text-muted)]"
1064
- >Status</span
1065
- >
1053
+ <span class="pr-1 text-xs font-medium text-(--bb-text-muted)">Status</span>
1066
1054
  <BbSelectPopover
1067
1055
  v-model="status"
1068
1056
  compact
@@ -35,7 +35,7 @@ so the current number is legible.
35
35
  ```vue
36
36
  <div class="w-full max-w-sm">
37
37
  <BbSlider v-model="state.volume" label="Volume" :min="0" :max="100" :step="5" />
38
- <p class="text-sm text-[color:var(--bb-text-muted)]">{{ state.volume ?? 0 }}%</p>
38
+ <p class="text-sm text-(--bb-text-muted)">{{ state.volume ?? 0 }}%</p>
39
39
  </div>
40
40
  ```
41
41
 
@@ -57,12 +57,12 @@ have to reason about which handle is which.
57
57
  ```vue
58
58
  <template>
59
59
  <div
60
- class="flex w-full max-w-sm flex-col gap-2 rounded-[var(--bb-radius)] border p-4"
60
+ class="flex w-full max-w-sm flex-col gap-2 rounded-(--bb-radius) border p-4"
61
61
  >
62
62
  <div class="flex items-baseline justify-between gap-2">
63
63
  <p class="text-sm font-medium">Price</p>
64
64
  <p
65
- class="text-xs tabular-nums text-[color:var(--bb-text-muted)]"
65
+ class="text-xs text-(--bb-text-muted) tabular-nums"
66
66
  data-testid="range"
67
67
  >
68
68
  €{{ price[0] }} – €{{ price[1] }}
@@ -77,9 +77,7 @@ have to reason about which handle is which.
77
77
  range
78
78
  :step="50"
79
79
  />
80
- <p class="text-xs text-[color:var(--bb-text-muted)]">
81
- 324 stays in this range
82
- </p>
80
+ <p class="text-xs text-(--bb-text-muted)">324 stays in this range</p>
83
81
  </div>
84
82
  </template>
85
83
  <script setup lang="ts">
@@ -111,7 +109,7 @@ match the step's resolution (e.g. `:step="0.001"` needs
111
109
  ```vue
112
110
  <div class="w-full max-w-sm">
113
111
  <BbSlider v-model="state.opacity" label="Layer opacity" :min="0" :max="1" :step="0.05" />
114
- <p class="text-sm text-[color:var(--bb-text-muted)]">{{ (state.opacity ?? 0).toFixed(2) }}</p>
112
+ <p class="text-sm text-(--bb-text-muted)">{{ (state.opacity ?? 0).toFixed(2) }}</p>
115
113
  </div>
116
114
  ```
117
115
 
@@ -128,17 +126,15 @@ mode (they early-return), so don't build a stepper around a range slider.
128
126
  ```vue
129
127
  <template>
130
128
  <div
131
- class="flex w-full max-w-sm flex-col gap-3 rounded-[var(--bb-radius)] border p-4"
129
+ class="flex w-full max-w-sm flex-col gap-3 rounded-(--bb-radius) border p-4"
132
130
  >
133
131
  <div class="flex items-baseline justify-between gap-2">
134
132
  <div>
135
133
  <p class="text-sm font-medium">Playback volume</p>
136
- <p class="text-xs text-[color:var(--bb-text-muted)]">
137
- Speaker · MacBook Pro
138
- </p>
134
+ <p class="text-xs text-(--bb-text-muted)">Speaker · MacBook Pro</p>
139
135
  </div>
140
136
  <p
141
- class="text-xs tabular-nums text-[color:var(--bb-text-muted)]"
137
+ class="text-xs text-(--bb-text-muted) tabular-nums"
142
138
  data-testid="value"
143
139
  >
144
140
  {{ volume }}%
@@ -239,7 +235,7 @@ it. (Use `thumb:lower` / `thumb:higher` to target one handle of a range.)
239
235
  <BbSlider v-model="zoom" label="Zoom" :max="200" :min="0" :step="10">
240
236
  <template #thumb="{ value, focused }">
241
237
  <span
242
- class="absolute -top-7 left-1/2 -translate-x-1/2 rounded-[var(--bb-radius-sm)] bg-[var(--bb-primary)] px-1.5 py-0.5 text-xs text-[var(--bb-primary-fg)] transition-opacity"
238
+ class="absolute -top-7 left-1/2 -translate-x-1/2 rounded-(--bb-radius-sm) bg-(--bb-primary) px-1.5 py-0.5 text-xs text-(--bb-primary-fg) transition-opacity"
243
239
  :class="focused ? 'opacity-100' : 'opacity-0'"
244
240
  >{{ value ?? 0 }}%</span
245
241
  >
@@ -267,12 +263,12 @@ slider clamps and snaps whatever the field emits.
267
263
  ```vue
268
264
  <template>
269
265
  <div
270
- class="flex w-full max-w-sm flex-col gap-3 rounded-[var(--bb-radius)] border p-4"
266
+ class="flex w-full max-w-sm flex-col gap-3 rounded-(--bb-radius) border p-4"
271
267
  >
272
268
  <div class="flex items-baseline justify-between gap-2">
273
269
  <div>
274
270
  <p class="text-sm font-medium">Monthly spend limit</p>
275
- <p class="text-xs text-[color:var(--bb-text-muted)]">
271
+ <p class="text-xs text-(--bb-text-muted)">
276
272
  API usage pauses once the cap is reached.
277
273
  </p>
278
274
  </div>
@@ -350,11 +346,11 @@ is a screen-level decision, not a per-control one.
350
346
  ```vue
351
347
  <template>
352
348
  <div
353
- class="flex w-full max-w-sm flex-col gap-3 rounded-[var(--bb-radius)] border p-4"
349
+ class="flex w-full max-w-sm flex-col gap-3 rounded-(--bb-radius) border p-4"
354
350
  >
355
351
  <div>
356
352
  <p class="text-sm font-medium">Display</p>
357
- <p class="text-xs text-[color:var(--bb-text-muted)]">
353
+ <p class="text-xs text-(--bb-text-muted)">
358
354
  Applies to this display only.
359
355
  </p>
360
356
  </div>
@@ -368,7 +364,7 @@ is a screen-level decision, not a per-control one.
368
364
  :step="5"
369
365
  />
370
366
  <p
371
- class="text-xs tabular-nums text-[color:var(--bb-text-muted)]"
367
+ class="text-xs text-(--bb-text-muted) tabular-nums"
372
368
  data-testid="brightness"
373
369
  >
374
370
  {{ brightness }}%
@@ -384,7 +380,7 @@ is a screen-level decision, not a per-control one.
384
380
  :step="5"
385
381
  />
386
382
  <p
387
- class="text-xs tabular-nums text-[color:var(--bb-text-muted)]"
383
+ class="text-xs text-(--bb-text-muted) tabular-nums"
388
384
  data-testid="warmth"
389
385
  >
390
386
  {{ warmth }}%
@@ -59,13 +59,11 @@ also catches text reflow, images loading, and window-resize-driven wrapping.
59
59
 
60
60
  ```vue
61
61
  <template>
62
- <div
63
- class="flex max-w-sm flex-col gap-3 rounded-[var(--bb-radius)] border p-3"
64
- >
62
+ <div class="flex max-w-sm flex-col gap-3 rounded-(--bb-radius) border p-3">
65
63
  <div class="flex items-start justify-between gap-3">
66
64
  <div class="flex flex-col gap-0.5">
67
65
  <p class="text-sm font-medium">Acme Pro</p>
68
- <p class="text-xs text-[color:var(--bb-text-muted)]">
66
+ <p class="text-xs text-(--bb-text-muted)">
69
67
  $29 / month · billed annually
70
68
  </p>
71
69
  </div>
@@ -81,7 +79,7 @@ also catches text reflow, images loading, and window-resize-driven wrapping.
81
79
  <BbSmoothHeight>
82
80
  <ul
83
81
  v-if="showDetails"
84
- class="flex flex-col gap-1.5 text-sm text-[color:var(--bb-text-muted)]"
82
+ class="flex flex-col gap-1.5 text-sm text-(--bb-text-muted)"
85
83
  >
86
84
  <li v-for="perk in perks" :key="perk">{{ perk }}</li>
87
85
  </ul>
@@ -116,12 +114,10 @@ controls above and the actions below stay put while the middle animates.
116
114
 
117
115
  ```vue
118
116
  <template>
119
- <div
120
- class="flex max-w-sm flex-col gap-3 rounded-[var(--bb-radius)] border p-3"
121
- >
117
+ <div class="flex max-w-sm flex-col gap-3 rounded-(--bb-radius) border p-3">
122
118
  <div class="flex flex-col gap-0.5">
123
119
  <p class="text-sm font-medium">Billing details</p>
124
- <p class="text-xs text-[color:var(--bb-text-muted)]">
120
+ <p class="text-xs text-(--bb-text-muted)">
125
121
  Acme Studio · next invoice Jul 31, 2026
126
122
  </p>
127
123
  </div>
@@ -163,7 +159,7 @@ controls above and the actions below stay put while the middle animates.
163
159
  label="IBAN"
164
160
  placeholder="DE89 3704 0044 0532 0130 00"
165
161
  />
166
- <p class="text-xs text-[color:var(--bb-text-muted)]">
162
+ <p class="text-xs text-(--bb-text-muted)">
167
163
  We will email a SEPA mandate to finance@acme.dev for approval.
168
164
  </p>
169
165
  </div>
@@ -213,9 +209,7 @@ strategy covers all of it, including results wrapping onto more lines.
213
209
 
214
210
  ```vue
215
211
  <template>
216
- <div
217
- class="flex max-w-sm flex-col gap-2 rounded-[var(--bb-radius)] border p-3"
218
- >
212
+ <div class="flex max-w-sm flex-col gap-2 rounded-(--bb-radius) border p-3">
219
213
  <BbTextInput
220
214
  v-model="query"
221
215
  compact
@@ -228,7 +222,7 @@ strategy covers all of it, including results wrapping onto more lines.
228
222
  <BbSmoothHeight>
229
223
  <div
230
224
  v-if="loading"
231
- class="flex items-center gap-2 px-1 py-2 text-sm text-[color:var(--bb-text-muted)]"
225
+ class="flex items-center gap-2 px-1 py-2 text-sm text-(--bb-text-muted)"
232
226
  role="status"
233
227
  >
234
228
  <BbSpinner size="sm" /> Searching…
@@ -240,15 +234,12 @@ strategy covers all of it, including results wrapping onto more lines.
240
234
  class="flex items-baseline justify-between gap-3 px-1 py-1.5 text-sm"
241
235
  >
242
236
  <a class="truncate font-medium" :href="page.href">{{ page.title }}</a>
243
- <span class="shrink-0 text-xs text-[color:var(--bb-text-muted)]">{{
237
+ <span class="shrink-0 text-xs text-(--bb-text-muted)">{{
244
238
  page.section
245
239
  }}</span>
246
240
  </li>
247
241
  </ul>
248
- <p
249
- v-else-if="query"
250
- class="px-1 py-2 text-sm text-[color:var(--bb-text-muted)]"
251
- >
242
+ <p v-else-if="query" class="px-1 py-2 text-sm text-(--bb-text-muted)">
252
243
  No pages match “{{ query }}”.
253
244
  </p>
254
245
  </BbSmoothHeight>
@@ -321,15 +312,11 @@ class swaps or text edits drive the height.
321
312
 
322
313
  ```vue
323
314
  <template>
324
- <div
325
- class="flex max-w-sm flex-col gap-2 rounded-[var(--bb-radius)] border p-3"
326
- >
315
+ <div class="flex max-w-sm flex-col gap-2 rounded-(--bb-radius) border p-3">
327
316
  <div class="flex items-center justify-between gap-3">
328
317
  <div class="flex flex-col gap-0.5">
329
318
  <p class="text-sm font-medium">Recent activity</p>
330
- <p class="text-xs text-[color:var(--bb-text-muted)]">
331
- Q3 launch · Acme Studio
332
- </p>
319
+ <p class="text-xs text-(--bb-text-muted)">Q3 launch · Acme Studio</p>
333
320
  </div>
334
321
  <div class="flex gap-1.5">
335
322
  <BbButton size="sm" variant="ghost" @click="removeEntry">
@@ -350,7 +337,7 @@ class swaps or text edits drive the height.
350
337
  class="flex items-baseline justify-between gap-3 py-2 text-sm first:pt-0 last:pb-0"
351
338
  >
352
339
  <span>{{ entry.text }}</span>
353
- <span class="shrink-0 text-xs text-[color:var(--bb-text-muted)]">{{
340
+ <span class="shrink-0 text-xs text-(--bb-text-muted)">{{
354
341
  entry.when
355
342
  }}</span>
356
343
  </li>
@@ -417,12 +404,10 @@ on the fly.
417
404
 
418
405
  ```vue
419
406
  <template>
420
- <div
421
- class="flex max-w-sm flex-col gap-3 rounded-[var(--bb-radius)] border p-3"
422
- >
407
+ <div class="flex max-w-sm flex-col gap-3 rounded-(--bb-radius) border p-3">
423
408
  <div class="flex flex-col gap-0.5">
424
409
  <p class="text-sm font-medium">Release checklist</p>
425
- <p class="text-xs text-[color:var(--bb-text-muted)]">
410
+ <p class="text-xs text-(--bb-text-muted)">
426
411
  v2.4.0 · ship window Fri Jul 24
427
412
  </p>
428
413
  </div>
@@ -431,7 +416,7 @@ on the fly.
431
416
  <ul class="flex flex-col gap-1.5 text-sm">
432
417
  <li>Design review signed off</li>
433
418
  <li>Ship the release notes</li>
434
- <li v-if="expanded" class="text-[color:var(--bb-text-muted)]">
419
+ <li v-if="expanded" class="text-(--bb-text-muted)">
435
420
  Notify the changelog subscribers
436
421
  </li>
437
422
  </ul>