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
@@ -55,10 +55,10 @@ label already plays that role and the two would overlap.
55
55
 
56
56
  ```vue
57
57
  <template>
58
- <div class="grid max-w-sm gap-3 rounded-[var(--bb-radius)] border p-4">
58
+ <div class="grid max-w-sm gap-3 rounded-(--bb-radius) border p-4">
59
59
  <div>
60
60
  <p class="text-sm font-medium">Profile basics</p>
61
- <p class="text-xs text-[color:var(--bb-text-muted)]">
61
+ <p class="text-xs text-(--bb-text-muted)">
62
62
  Same field, three label placements — pick one per product.
63
63
  </p>
64
64
  </div>
@@ -85,10 +85,10 @@ const inside = ref<string | null>('Bitboss');
85
85
 
86
86
  ```vue
87
87
  <template>
88
- <div class="grid max-w-sm gap-3 rounded-[var(--bb-radius)] border p-4">
88
+ <div class="grid max-w-sm gap-3 rounded-(--bb-radius) border p-4">
89
89
  <div>
90
90
  <p class="text-sm font-medium">Workspace settings</p>
91
- <p class="text-xs text-[color:var(--bb-text-muted)]">
91
+ <p class="text-xs text-(--bb-text-muted)">
92
92
  Required fields mark the label — keep the accessible name intact.
93
93
  </p>
94
94
  </div>
@@ -102,11 +102,7 @@ const inside = ref<string | null>('Bitboss');
102
102
  <template #label="{ text, hasErrors }">
103
103
  {{ text }}
104
104
  <span
105
- :class="
106
- hasErrors
107
- ? 'text-[color:var(--bb-danger)]'
108
- : 'text-[color:var(--bb-text-muted)]'
109
- "
105
+ :class="hasErrors ? 'text-(--bb-danger)' : 'text-(--bb-text-muted)'"
110
106
  >
111
107
  *
112
108
  </span>
@@ -171,10 +167,8 @@ validation layer should still drive `errors`.
171
167
  ```vue
172
168
  <template>
173
169
  <div class="grid max-w-sm gap-3">
174
- <div class="grid gap-2 rounded-[var(--bb-radius)] border p-3">
175
- <p class="text-xs font-medium text-[color:var(--bb-text-muted)]">
176
- Invite teammate
177
- </p>
170
+ <div class="grid gap-2 rounded-(--bb-radius) border p-3">
171
+ <p class="text-xs font-medium text-(--bb-text-muted)">Invite teammate</p>
178
172
  <BbTextInput
179
173
  v-model="email"
180
174
  compact
@@ -186,8 +180,8 @@ validation layer should still drive `errors`.
186
180
  type="email"
187
181
  />
188
182
  </div>
189
- <div class="grid gap-2 rounded-[var(--bb-radius)] border p-3">
190
- <p class="text-xs font-medium text-[color:var(--bb-text-muted)]">
183
+ <div class="grid gap-2 rounded-(--bb-radius) border p-3">
184
+ <p class="text-xs font-medium text-(--bb-text-muted)">
191
185
  Non-blocking hint
192
186
  </p>
193
187
  <BbTextInput
@@ -199,7 +193,7 @@ validation layer should still drive `errors`.
199
193
  :warnings="['This name is very short — is it what you meant?']"
200
194
  />
201
195
  </div>
202
- <div class="rounded-[var(--bb-radius)] border px-2 py-1.5">
196
+ <div class="rounded-(--bb-radius) border px-2 py-1.5">
203
197
  <BbTextInput
204
198
  v-model="search"
205
199
  class="w-full"
@@ -258,10 +252,10 @@ The full slot ring, inside → out:
258
252
 
259
253
  ```vue
260
254
  <template>
261
- <div class="grid max-w-sm gap-3 rounded-[var(--bb-radius)] border p-4">
255
+ <div class="grid max-w-sm gap-3 rounded-(--bb-radius) border p-4">
262
256
  <div>
263
257
  <p class="text-sm font-medium">Workspace & billing</p>
264
- <p class="text-xs text-[color:var(--bb-text-muted)]">
258
+ <p class="text-xs text-(--bb-text-muted)">
265
259
  Icons and short affixes live inside the chrome; actions sit outside.
266
260
  </p>
267
261
  </div>
@@ -328,10 +322,10 @@ the status.
328
322
 
329
323
  ```vue
330
324
  <template>
331
- <div class="grid max-w-sm gap-3 rounded-[var(--bb-radius)] border p-4">
325
+ <div class="grid max-w-sm gap-3 rounded-(--bb-radius) border p-4">
332
326
  <div>
333
327
  <p class="text-sm font-medium">Claim your handle</p>
334
- <p class="text-xs text-[color:var(--bb-text-muted)]">
328
+ <p class="text-xs text-(--bb-text-muted)">
335
329
  Debounced check — spinner while pending, hint or error on result.
336
330
  </p>
337
331
  </div>
@@ -550,10 +544,10 @@ five carry `labelMode` and all five fall back to
550
544
 
551
545
  ```vue
552
546
  <template>
553
- <div class="grid max-w-md gap-3 rounded-[var(--bb-radius)] border p-4">
547
+ <div class="grid max-w-md gap-3 rounded-(--bb-radius) border p-4">
554
548
  <div>
555
549
  <p class="text-sm font-medium">Billing contact</p>
556
- <p class="text-xs text-[color:var(--bb-text-muted)]">
550
+ <p class="text-xs text-(--bb-text-muted)">
557
551
  Outside labels only — horizontal rows keep dense forms scannable.
558
552
  </p>
559
553
  </div>
@@ -591,10 +585,10 @@ const company = ref<string | null>('Bitboss');
591
585
 
592
586
  ```vue
593
587
  <template>
594
- <div class="grid max-w-sm gap-2 rounded-[var(--bb-radius)] border p-3">
588
+ <div class="grid max-w-sm gap-2 rounded-(--bb-radius) border p-3">
595
589
  <div>
596
590
  <p class="text-sm font-medium">Merino Tee — Black / M</p>
597
- <p class="text-xs text-[color:var(--bb-text-muted)]">
591
+ <p class="text-xs text-(--bb-text-muted)">
598
592
  Product identifiers · compact density
599
593
  </p>
600
594
  </div>
@@ -623,6 +617,47 @@ const barcode = ref<string | null>('0 12345 67890 5');
623
617
  </script>
624
618
  ```
625
619
 
620
+ ### Variants
621
+
622
+ `variant` picks the field box's look — and only its look. Height, padding and
623
+ border width are identical across variants, so mixing them in one view never
624
+ reflows anything. The names and tokens are the `BbButton` ones, so a page
625
+ reads one vocabulary for buttons and fields:
626
+
627
+ - **`outline`** (default) — the raised panel with the neutral border.
628
+ - **`secondary`** — a soft tinted surface with a faint border; fields that
629
+ should sit back on a busy panel.
630
+ - **`ghost`** — no border in **any** state, a hover wash as the affordance,
631
+ and the same wash under the focus ring (a ring around nothing reads as a
632
+ glitch). Errors and warnings do not tint it; the icon and
633
+ the message carry the state. This is the inline-edit table cell: the field
634
+ reads as text at rest and needs no `:deep()` to get there.
635
+ - **`none`** — structure only: every colour transparent and **no focus
636
+ ring**. An escape hatch for a fully custom look; prefer registering a
637
+ variant, which keeps the ring.
638
+
639
+ **The variant ladder**
640
+
641
+ ```vue
642
+ <template>
643
+ <div class="grid gap-3 sm:grid-cols-3">
644
+ <BbTextInput label="Outline" model-value="Ada Lovelace" />
645
+ <BbTextInput
646
+ label="Secondary"
647
+ model-value="Ada Lovelace"
648
+ variant="secondary"
649
+ />
650
+ <BbTextInput label="Ghost" model-value="Ada Lovelace" variant="ghost" />
651
+ </div>
652
+ </template>
653
+ ```
654
+
655
+ `variant` is the same prop on `BbTextarea`, `BbNumberInput`, `BbSelect`,
656
+ `BbTag`, `BbDatePickerInput`, `BbTimePickerInput` and `BbColorInput`. Extra
657
+ names are registered through the plugin's `inputVariants` option and styled
658
+ as a token block on `common-input-wrapper--<name>` — see the installation
659
+ guide.
660
+
626
661
  ### Global config & platforms
627
662
 
628
663
  - `config.defaultInputLabelMode` — project-wide default for `labelMode`
@@ -655,7 +690,7 @@ submit, format checks on blur, errors cleared as the user fixes them.
655
690
  ```vue
656
691
  <template>
657
692
  <form
658
- class="grid max-w-md gap-3 rounded-[var(--bb-radius)] border p-4"
693
+ class="grid max-w-md gap-3 rounded-(--bb-radius) border p-4"
659
694
  novalidate
660
695
  @submit.prevent="submit"
661
696
  >
@@ -663,7 +698,7 @@ submit, format checks on blur, errors cleared as the user fixes them.
663
698
  <p class="text-sm font-medium">
664
699
  Invoice for {{ customer || 'a new client' }}
665
700
  </p>
666
- <p class="text-xs text-[color:var(--bb-text-muted)]">
701
+ <p class="text-xs text-(--bb-text-muted)">
667
702
  Draft INV-2048 · validate on blur / submit, clear as they type
668
703
  </p>
669
704
  </div>
@@ -880,7 +915,7 @@ const formattedTotal = computed(() =>
880
915
  | `hideLabel` | `boolean \| undefined` | `false` | | Visually hides the label of the input while maintaining accessibility. |
881
916
  | `hint` | `string \| undefined` | | | Text box to be displayed near the input, usually to indicate instructions. |
882
917
  | `id` | `string \| undefined` | | | The identifier of the component. |
883
- | `inputMode` | `"text" \| "search" \| "email" \| "url" \| "tel" \| "none" \| "numeric" \| "decimal" \| undefined` | | | The inputmode of the input. |
918
+ | `inputMode` | `"text" \| "none" \| "search" \| "email" \| "url" \| "tel" \| "numeric" \| "decimal" \| undefined` | | | The inputmode of the input. |
884
919
  | `label` | `string` | | yes | Text content of the label of the element. |
885
920
  | `labelMode` | `"floating" \| "outside" \| "inside" \| undefined` | | | Label rendering mode. |
886
921
  | `labelPosition` | `"left" \| "center" \| "right" \| undefined` | | | Sets the text alignment of the label. |
@@ -895,6 +930,7 @@ const formattedTotal = computed(() =>
895
930
  | `required` | `boolean \| undefined` | `false` | | Sets the input as required. |
896
931
  | `reverse` | `boolean \| undefined` | `false` | | Reverses the layout. Applicable in every direction the order of the label and the input is swapped. |
897
932
  | `type` | `"text" \| "search" \| "email" \| "url" \| "tel" \| "password" \| undefined` | | | Type of the input. Restricted to the textual input types this component supports — use `BbNumberInput` for numbers and `BbDatePickerInput` for dates. |
933
+ | `variant` | `InputVariantType \| undefined` | `'outline'` | | Visual variant of the field box — the same names and tokens as the `BbButton` variants. Colours only: height, padding and border width are identical across variants, so a form never reflows when one changes. `'ghost'` has no border in any s… |
898
934
  | `warnings` | `string \| string[] \| undefined` | | | Warning messages to display beneath the field, in their own `aria-live` region and amber (`--bb-text-warn`). A string or array; a non-empty list implies the warning state. Errors suppress warnings when both are set. While displayed they are… |
899
935
 
900
936
  ## Events
@@ -51,10 +51,10 @@ form or read from `FormData`.
51
51
 
52
52
  ```vue
53
53
  <template>
54
- <div class="grid max-w-sm gap-3 rounded-[var(--bb-radius)] border p-4">
54
+ <div class="grid max-w-sm gap-3 rounded-(--bb-radius) border p-4">
55
55
  <div>
56
56
  <p class="text-sm font-medium">Member profile</p>
57
- <p class="text-xs text-[color:var(--bb-text-muted)]">
57
+ <p class="text-xs text-(--bb-text-muted)">
58
58
  Label stays required — hide it visually or customize the slot.
59
59
  </p>
60
60
  </div>
@@ -69,11 +69,7 @@ form or read from `FormData`.
69
69
  <template #label="{ text, hasErrors }">
70
70
  {{ text }}
71
71
  <span
72
- :class="
73
- hasErrors
74
- ? 'text-[color:var(--bb-danger)]'
75
- : 'text-[color:var(--bb-text-muted)]'
76
- "
72
+ :class="hasErrors ? 'text-(--bb-danger)' : 'text-(--bb-text-muted)'"
77
73
  >
78
74
  *
79
75
  </span>
@@ -118,10 +114,10 @@ label and the placeholder occupy the same spot.
118
114
 
119
115
  ```vue
120
116
  <template>
121
- <div class="grid max-w-sm gap-3 rounded-[var(--bb-radius)] border p-4">
117
+ <div class="grid max-w-sm gap-3 rounded-(--bb-radius) border p-4">
122
118
  <div>
123
119
  <p class="text-sm font-medium">Checkout · shipping</p>
124
- <p class="text-xs text-[color:var(--bb-text-muted)]">
120
+ <p class="text-xs text-(--bb-text-muted)">
125
121
  Floating and inside labels — skip placeholders on floating fields.
126
122
  </p>
127
123
  </div>
@@ -191,10 +187,10 @@ validation layer should still drive `errors`.
191
187
  ```vue
192
188
  <template>
193
189
  <div class="grid max-w-sm gap-3">
194
- <div class="grid gap-3 rounded-[var(--bb-radius)] border p-4">
190
+ <div class="grid gap-3 rounded-(--bb-radius) border p-4">
195
191
  <div>
196
192
  <p class="text-sm font-medium">Public profile</p>
197
- <p class="text-xs text-[color:var(--bb-text-muted)]">
193
+ <p class="text-xs text-(--bb-text-muted)">
198
194
  Description before typing; hint while focused.
199
195
  </p>
200
196
  </div>
@@ -210,12 +206,10 @@ validation layer should still drive `errors`.
210
206
  :rows="3"
211
207
  />
212
208
  </div>
213
- <div class="grid gap-3 rounded-[var(--bb-radius)] border p-4">
209
+ <div class="grid gap-3 rounded-(--bb-radius) border p-4">
214
210
  <div>
215
211
  <p class="text-sm font-medium">Request a refund</p>
216
- <p class="text-xs text-[color:var(--bb-text-muted)]">
217
- INV-2048 · Acme Studio
218
- </p>
212
+ <p class="text-xs text-(--bb-text-muted)">INV-2048 · Acme Studio</p>
219
213
  </div>
220
214
  <BbTextarea
221
215
  v-model="reason"
@@ -265,10 +259,10 @@ Two ways to size the box — and they compose:
265
259
 
266
260
  ```vue
267
261
  <template>
268
- <div class="grid max-w-sm gap-3 rounded-[var(--bb-radius)] border p-4">
262
+ <div class="grid max-w-sm gap-3 rounded-(--bb-radius) border p-4">
269
263
  <div>
270
264
  <p class="text-sm font-medium">Issue description</p>
271
- <p class="text-xs text-[color:var(--bb-text-muted)]">
265
+ <p class="text-xs text-(--bb-text-muted)">
272
266
  Fixed rows, auto-grow, or rows as a minimum floor.
273
267
  </p>
274
268
  </div>
@@ -320,10 +314,10 @@ while the comment saves:
320
314
 
321
315
  ```vue
322
316
  <template>
323
- <div class="grid max-w-md gap-3 rounded-[var(--bb-radius)] border p-3">
317
+ <div class="grid max-w-md gap-3 rounded-(--bb-radius) border p-3">
324
318
  <div>
325
319
  <p class="text-sm font-medium">PR #2048 · Review</p>
326
- <p class="text-xs text-[color:var(--bb-text-muted)]">
320
+ <p class="text-xs text-(--bb-text-muted)">
327
321
  feat/command-palette · 2 comments
328
322
  </p>
329
323
  </div>
@@ -332,7 +326,7 @@ while the comment saves:
332
326
  :key="comment.id"
333
327
  class="grid gap-0.5 border-t pt-2 first:border-t-0 first:pt-0"
334
328
  >
335
- <p class="text-xs text-[color:var(--bb-text-muted)]">
329
+ <p class="text-xs text-(--bb-text-muted)">
336
330
  {{ comment.author }} · {{ comment.postedAt }}
337
331
  </p>
338
332
  <p class="text-sm">{{ comment.body }}</p>
@@ -409,10 +403,10 @@ informed. For a simple inline readout the `suffix` slot is enough:
409
403
 
410
404
  ```vue
411
405
  <template>
412
- <div class="grid max-w-sm gap-3 rounded-[var(--bb-radius)] border p-4">
406
+ <div class="grid max-w-sm gap-3 rounded-(--bb-radius) border p-4">
413
407
  <div>
414
408
  <p class="text-sm font-medium">Status update</p>
415
- <p class="text-xs text-[color:var(--bb-text-muted)]">
409
+ <p class="text-xs text-(--bb-text-muted)">
416
410
  Inline suffix counter — visual only, no hard cap.
417
411
  </p>
418
412
  </div>
@@ -445,10 +439,10 @@ companion SFC:
445
439
 
446
440
  ```vue
447
441
  <template>
448
- <div class="grid max-w-sm gap-3 rounded-[var(--bb-radius)] border p-4">
442
+ <div class="grid max-w-sm gap-3 rounded-(--bb-radius) border p-4">
449
443
  <div>
450
444
  <p class="text-sm font-medium">Contact support</p>
451
- <p class="text-xs text-[color:var(--bb-text-muted)]">
445
+ <p class="text-xs text-(--bb-text-muted)">
452
446
  Ticket #4812 · counter is visual; cap is enforced via errors.
453
447
  </p>
454
448
  </div>
@@ -509,10 +503,10 @@ The full slot ring, inside → out:
509
503
 
510
504
  ```vue
511
505
  <template>
512
- <div class="grid max-w-sm gap-3 rounded-[var(--bb-radius)] border p-4">
506
+ <div class="grid max-w-sm gap-3 rounded-(--bb-radius) border p-4">
513
507
  <div>
514
508
  <p class="text-sm font-medium">Deal notes</p>
515
- <p class="text-xs text-[color:var(--bb-text-muted)]">
509
+ <p class="text-xs text-(--bb-text-muted)">
516
510
  Icons inside the chrome; copy actions sit in append-outer.
517
511
  </p>
518
512
  </div>
@@ -568,10 +562,10 @@ change mid-operation (e.g. an autosave round-trip). They compose freely.
568
562
 
569
563
  ```vue
570
564
  <template>
571
- <div class="grid max-w-sm gap-3 rounded-[var(--bb-radius)] border p-4">
565
+ <div class="grid max-w-sm gap-3 rounded-(--bb-radius) border p-4">
572
566
  <div>
573
567
  <p class="text-sm font-medium">Meeting notes</p>
574
- <p class="text-xs text-[color:var(--bb-text-muted)]">
568
+ <p class="text-xs text-(--bb-text-muted)">
575
569
  Q3 roadmap sync · clearable draft and autosave spinner.
576
570
  </p>
577
571
  </div>
@@ -619,10 +613,10 @@ content — screen-reader and keyboard users can still reach it.
619
613
  ```vue
620
614
  <template>
621
615
  <div class="grid max-w-sm gap-3">
622
- <div class="grid gap-3 rounded-[var(--bb-radius)] border p-4">
616
+ <div class="grid gap-3 rounded-(--bb-radius) border p-4">
623
617
  <div>
624
618
  <p class="text-sm font-medium">Refund policy</p>
625
- <p class="text-xs text-[color:var(--bb-text-muted)]">
619
+ <p class="text-xs text-(--bb-text-muted)">
626
620
  Readonly keeps terms focusable and copyable.
627
621
  </p>
628
622
  </div>
@@ -635,10 +629,10 @@ content — screen-reader and keyboard users can still reach it.
635
629
  :rows="3"
636
630
  />
637
631
  </div>
638
- <div class="grid gap-3 rounded-[var(--bb-radius)] border p-4">
632
+ <div class="grid gap-3 rounded-(--bb-radius) border p-4">
639
633
  <div>
640
634
  <p class="text-sm font-medium">Deploy log</p>
641
- <p class="text-xs text-[color:var(--bb-text-muted)]">
635
+ <p class="text-xs text-(--bb-text-muted)">
642
636
  Disabled greys the field and blocks interaction.
643
637
  </p>
644
638
  </div>
@@ -678,10 +672,10 @@ order. This makes it a good pick for label-beside-field settings rows.
678
672
 
679
673
  ```vue
680
674
  <template>
681
- <div class="grid max-w-md gap-3 rounded-[var(--bb-radius)] border p-4">
675
+ <div class="grid max-w-md gap-3 rounded-(--bb-radius) border p-4">
682
676
  <div>
683
677
  <p class="text-sm font-medium">Issue properties</p>
684
- <p class="text-xs text-[color:var(--bb-text-muted)]">
678
+ <p class="text-xs text-(--bb-text-muted)">
685
679
  Horizontal outside labels + compact density on the whole panel.
686
680
  </p>
687
681
  </div>
@@ -751,6 +745,19 @@ comment composer above).
751
745
  />
752
746
  ```
753
747
 
748
+ ### Variants
749
+
750
+ `variant` picks the field box's look and nothing else — height, padding and
751
+ border width are identical across variants. `outline` (default) is the raised
752
+ panel with the neutral border, `secondary` a soft tinted surface with a faint
753
+ border, and `ghost` draws **no border in any state**: a hover wash is the
754
+ affordance, the focus ring still shows, and errors or warnings surface through
755
+ the icon and the message rather than a tinted edge. `ghost` is the inline-edit
756
+ table cell (`<BbTextarea compact hide-label variant="ghost" />`) — no
757
+ `:deep()` needed. The names and tokens are the `BbButton` ones; extra names
758
+ register through the plugin's `inputVariants` option. The full ladder is in
759
+ the `BbTextInput` guide.
760
+
754
761
  ### Works well with
755
762
 
756
763
  - `BbTextInput` / `BbNumberInput` / `BbDatePickerInput` — same chrome and
@@ -829,6 +836,7 @@ comment composer above).
829
836
  | `required` | `boolean \| undefined` | `false` | | Sets the input as required. |
830
837
  | `reverse` | `boolean \| undefined` | `false` | | Reverses the layout. Applicable in every direction the order of the label and the input is swapped. |
831
838
  | `rows` | `string \| number \| undefined` | | | Sets the number of visible text lines for the control. |
839
+ | `variant` | `InputVariantType \| undefined` | `'outline'` | | Visual variant of the field box — the same names and tokens as the `BbButton` variants. Colours only: height, padding and border width are identical across variants, so a form never reflows when one changes. `'ghost'` has no border in any s… |
832
840
  | `warnings` | `string \| string[] \| undefined` | | | Warning messages to display beneath the field, in their own `aria-live` region and amber (`--bb-text-warn`). A string or array; a non-empty list implies the warning state. Errors suppress warnings when both are set. While displayed they are… |
833
841
 
834
842
  ## Events
@@ -101,6 +101,19 @@ interaction.
101
101
  | `active`/`inactive` | — | focus enters / leaves the whole control |
102
102
  | `focus` | `FocusEvent` | a native field gains focus |
103
103
 
104
+ ### Variants
105
+
106
+ `variant` picks the field box's look and nothing else — height, padding and
107
+ border width are identical across variants. `outline` (default) is the raised
108
+ panel with the neutral border, `secondary` a soft tinted surface with a faint
109
+ border, and `ghost` draws **no border in any state**: a hover wash is the
110
+ affordance, the focus ring still shows, and errors or warnings surface through
111
+ the icon and the message rather than a tinted edge. `ghost` is the inline-edit
112
+ table cell (`<BbTimePickerInput compact hide-label variant="ghost" />`) — no
113
+ `:deep()` needed. The names and tokens are the `BbButton` ones; extra names
114
+ register through the plugin's `inputVariants` option. The full ladder is in
115
+ the `BbTextInput` guide.
116
+
104
117
  ### Gotchas & anti-patterns
105
118
 
106
119
  - **Don't parse the value with `new Date('14:30')`** — it's a wall-clock
@@ -165,6 +178,7 @@ Messages _also_ render in an `aria-live="polite"` region.
165
178
  | `seconds` | `boolean \| undefined` | `false` | | Adds the seconds segment. Without it an incoming value carrying seconds displays truncated and zeroes out on the next user commit. |
166
179
  | `step` | `number \| undefined` | `1` | | Minute granularity for the minute column and its arrow stepping. Constrains what the columns produce, never what typing accepts. |
167
180
  | `transitionDuration` | `number \| undefined` | | | Transition duration, in milliseconds, for the popover appearance. |
181
+ | `variant` | `InputVariantType \| undefined` | `'outline'` | | Visual variant of the field box — the same names and tokens as the `BbButton` variants. Colours only: height, padding and border width are identical across variants, so a form never reflows when one changes. `'ghost'` has no border in any s… |
168
182
  | `warnings` | `string \| string[] \| undefined` | | | Warning messages to display beneath the field, in their own `aria-live` region and amber (`--bb-text-warn`). A string or array; a non-empty list implies the warning state. Errors suppress warnings when both are set. While displayed they are… |
169
183
 
170
184
  ## Events
@@ -70,14 +70,10 @@ per-message options. Built-in variants: `default`, `success`, `info`,
70
70
 
71
71
  ```vue
72
72
  <template>
73
- <div
74
- class="flex max-w-sm flex-col gap-3 rounded-[var(--bb-radius)] border p-3"
75
- >
73
+ <div class="flex max-w-sm flex-col gap-3 rounded-(--bb-radius) border p-3">
76
74
  <div class="flex flex-col gap-0.5">
77
75
  <p class="text-sm font-medium">Alex Rivera</p>
78
- <p class="text-xs text-[color:var(--bb-text-muted)]">
79
- alex@northwind.co · Product
80
- </p>
76
+ <p class="text-xs text-(--bb-text-muted)">alex@northwind.co · Product</p>
81
77
  </div>
82
78
 
83
79
  <div class="flex flex-wrap items-center gap-2">
@@ -196,14 +192,10 @@ the spinner and the pinning stay).
196
192
 
197
193
  ```vue
198
194
  <template>
199
- <div
200
- class="flex max-w-sm flex-col gap-3 rounded-[var(--bb-radius)] border p-3"
201
- >
195
+ <div class="flex max-w-sm flex-col gap-3 rounded-(--bb-radius) border p-3">
202
196
  <div class="flex flex-col gap-0.5">
203
197
  <p class="text-sm font-medium">invoice-INV-1042.pdf</p>
204
- <p class="text-xs text-[color:var(--bb-text-muted)]">
205
- 248 KB · ready to upload
206
- </p>
198
+ <p class="text-xs text-(--bb-text-muted)">248 KB · ready to upload</p>
207
199
  </div>
208
200
 
209
201
  <BbButton prepend:icon="lucide:upload" variant="primary" @click="upload">
@@ -261,12 +253,10 @@ status, "copied" — so hammering the action never floods the corner.
261
253
 
262
254
  ```vue
263
255
  <template>
264
- <div
265
- class="flex max-w-sm flex-col gap-3 rounded-[var(--bb-radius)] border p-3"
266
- >
256
+ <div class="flex max-w-sm flex-col gap-3 rounded-(--bb-radius) border p-3">
267
257
  <div class="flex flex-col gap-0.5">
268
258
  <p class="text-sm font-medium">Proposal — Acme Studio</p>
269
- <p class="text-xs text-[color:var(--bb-text-muted)]">
259
+ <p class="text-xs text-(--bb-text-muted)">
270
260
  Draft · last edited just now · {{ saveCount }} saves this session
271
261
  </p>
272
262
  </div>
@@ -362,12 +352,10 @@ toast expires, the delete simply stands.
362
352
 
363
353
  ```vue
364
354
  <template>
365
- <div
366
- class="flex max-w-sm flex-col gap-3 rounded-[var(--bb-radius)] border p-3"
367
- >
355
+ <div class="flex max-w-sm flex-col gap-3 rounded-(--bb-radius) border p-3">
368
356
  <div class="flex flex-col gap-0.5">
369
357
  <p class="text-sm font-medium">Saved replies</p>
370
- <p class="text-xs text-[color:var(--bb-text-muted)]">
358
+ <p class="text-xs text-(--bb-text-muted)">
371
359
  Delete commits immediately — Undo lives on the toast.
372
360
  </p>
373
361
  </div>
@@ -389,9 +377,7 @@ toast expires, the delete simply stands.
389
377
  </BbButton>
390
378
  </li>
391
379
  </ul>
392
- <p v-else class="text-sm text-[color:var(--bb-text-muted)]">
393
- No saved replies left.
394
- </p>
380
+ <p v-else class="text-sm text-(--bb-text-muted)">No saved replies left.</p>
395
381
 
396
382
  <!--
397
383
  Standalone example: it mounts its own host because it has no app root.
@@ -449,12 +435,10 @@ morphs in place with a fresh countdown (e.g. into a success confirmation).
449
435
 
450
436
  ```vue
451
437
  <template>
452
- <div
453
- class="flex max-w-sm flex-col gap-3 rounded-[var(--bb-radius)] border p-3"
454
- >
438
+ <div class="flex max-w-sm flex-col gap-3 rounded-(--bb-radius) border p-3">
455
439
  <div class="flex flex-col gap-0.5">
456
440
  <p class="text-sm font-medium">Workspace sync</p>
457
- <p class="text-xs text-[color:var(--bb-text-muted)]">
441
+ <p class="text-xs text-(--bb-text-muted)">
458
442
  Northwind · last synced 12 minutes ago
459
443
  </p>
460
444
  </div>
@@ -546,12 +530,10 @@ overlays unless `hideClose`.
546
530
 
547
531
  ```vue
548
532
  <template>
549
- <div
550
- class="flex max-w-sm flex-col gap-3 rounded-[var(--bb-radius)] border p-3"
551
- >
533
+ <div class="flex max-w-sm flex-col gap-3 rounded-(--bb-radius) border p-3">
552
534
  <div class="flex flex-col gap-0.5">
553
535
  <p class="text-sm font-medium">Invite teammate</p>
554
- <p class="text-xs text-[color:var(--bb-text-muted)]">
536
+ <p class="text-xs text-(--bb-text-muted)">
555
537
  Portal toast with avatar + custom actions.
556
538
  </p>
557
539
  </div>
@@ -572,9 +554,7 @@ overlays unless `hideClose`.
572
554
  <BbAvatar size="32">{{ props.initials }}</BbAvatar>
573
555
  <div class="min-w-0 flex-1">
574
556
  <p class="text-sm font-semibold">{{ props.name }} was invited</p>
575
- <p class="text-xs text-[color:var(--bb-text-muted)]">
576
- Northwind · Design
577
- </p>
557
+ <p class="text-xs text-(--bb-text-muted)">Northwind · Design</p>
578
558
  <div class="mt-2 flex gap-2">
579
559
  <BbButton size="xs" @click="close">Got it</BbButton>
580
560
  <BbButton size="xs" variant="outline" @click="close">Undo</BbButton>