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
@@ -41,12 +41,10 @@ fields visible; tuck rarely-needed controls behind the disclosure.
41
41
 
42
42
  ```vue
43
43
  <template>
44
- <div
45
- class="flex max-w-sm flex-col gap-3 rounded-[var(--bb-radius)] border p-3"
46
- >
44
+ <div class="flex max-w-sm flex-col gap-3 rounded-(--bb-radius) border p-3">
47
45
  <div class="flex flex-col gap-0.5">
48
46
  <p class="text-sm font-medium">Create webhook</p>
49
- <p class="text-xs text-[color:var(--bb-text-muted)]">
47
+ <p class="text-xs text-(--bb-text-muted)">
50
48
  Northwind Billing · deliver invoice events to your endpoint.
51
49
  </p>
52
50
  </div>
@@ -147,12 +145,10 @@ the switch's checked state already conveys it.
147
145
 
148
146
  ```vue
149
147
  <template>
150
- <div
151
- class="flex max-w-sm flex-col gap-3 rounded-[var(--bb-radius)] border p-3"
152
- >
148
+ <div class="flex max-w-sm flex-col gap-3 rounded-(--bb-radius) border p-3">
153
149
  <div class="flex flex-col gap-0.5">
154
150
  <p class="text-sm font-medium">Custom domain</p>
155
- <p class="text-xs text-[color:var(--bb-text-muted)]">
151
+ <p class="text-xs text-(--bb-text-muted)">
156
152
  Acme Docs · serve from your domain instead of *.bitdocs.app.
157
153
  </p>
158
154
  </div>
@@ -211,12 +207,10 @@ entry that reveals the full bullet list on demand.
211
207
 
212
208
  ```vue
213
209
  <template>
214
- <div
215
- class="flex max-w-md flex-col gap-2 rounded-[var(--bb-radius)] border p-3"
216
- >
210
+ <div class="flex max-w-md flex-col gap-2 rounded-(--bb-radius) border p-3">
217
211
  <div class="flex items-baseline gap-2">
218
212
  <p class="text-sm font-medium">v3.2.0</p>
219
- <p class="text-xs text-[color:var(--bb-text-muted)]">Jul 18, 2026</p>
213
+ <p class="text-xs text-(--bb-text-muted)">Jul 18, 2026</p>
220
214
  </div>
221
215
 
222
216
  <p class="text-sm leading-relaxed">
@@ -225,9 +219,7 @@ entry that reveals the full bullet list on demand.
225
219
  </p>
226
220
 
227
221
  <BbCollapsible id="changelog-more" v-model="more">
228
- <ul
229
- class="flex flex-col gap-1.5 pt-1 text-sm text-[color:var(--bb-text-muted)]"
230
- >
222
+ <ul class="flex flex-col gap-1.5 pt-1 text-sm text-(--bb-text-muted)">
231
223
  <li v-for="note in notes" :key="note">{{ note }}</li>
232
224
  </ul>
233
225
  </BbCollapsible>
@@ -278,12 +270,10 @@ grid-rows transition) and the opacity/visibility fade. Under
278
270
 
279
271
  ```vue
280
272
  <template>
281
- <div
282
- class="flex max-w-sm flex-col gap-2 rounded-[var(--bb-radius)] border p-3"
283
- >
273
+ <div class="flex max-w-sm flex-col gap-2 rounded-(--bb-radius) border p-3">
284
274
  <div class="flex flex-col gap-0.5">
285
275
  <p class="text-sm font-medium">Checkout · Acme Pro</p>
286
- <p class="text-xs text-[color:var(--bb-text-muted)]">
276
+ <p class="text-xs text-(--bb-text-muted)">
287
277
  $29 / month · billed annually
288
278
  </p>
289
279
  </div>
@@ -306,7 +296,7 @@ grid-rows transition) and the opacity/visibility fade. Under
306
296
  eager
307
297
  :transition-duration="350"
308
298
  >
309
- <p class="pt-1 text-sm text-[color:var(--bb-text-muted)]">
299
+ <p class="pt-1 text-sm text-(--bb-text-muted)">
310
300
  Refunds return to the original payment method within 5–10 business days.
311
301
  Annual plans are refundable in full within 30 days of purchase.
312
302
  </p>
@@ -332,12 +322,10 @@ triggers live in a segmented control or toolbar rather than stacked headers.
332
322
 
333
323
  ```vue
334
324
  <template>
335
- <div
336
- class="flex max-w-sm flex-col gap-3 rounded-[var(--bb-radius)] border p-3"
337
- >
325
+ <div class="flex max-w-sm flex-col gap-3 rounded-(--bb-radius) border p-3">
338
326
  <div class="flex flex-col gap-0.5">
339
327
  <p class="text-sm font-medium">Studio Display</p>
340
- <p class="text-xs text-[color:var(--bb-text-muted)]">
328
+ <p class="text-xs text-(--bb-text-muted)">
341
329
  INV-1042 · Acme Studio · $1,599.00
342
330
  </p>
343
331
  </div>
@@ -357,12 +345,12 @@ triggers live in a segmented control or toolbar rather than stacked headers.
357
345
  </div>
358
346
 
359
347
  <BbCollapsible :id="tabs[0].panelId" :model-value="active === 'specs'">
360
- <p class="text-sm text-[color:var(--bb-text-muted)]">
348
+ <p class="text-sm text-(--bb-text-muted)">
361
349
  Aluminium body · 1.2&nbsp;kg · USB-C · 14&quot; matte display · 60 Hz.
362
350
  </p>
363
351
  </BbCollapsible>
364
352
  <BbCollapsible :id="tabs[1].panelId" :model-value="active === 'shipping'">
365
- <p class="text-sm text-[color:var(--bb-text-muted)]">
353
+ <p class="text-sm text-(--bb-text-muted)">
366
354
  Ships in 2–3 business days. Free returns within 30 days of delivery.
367
355
  </p>
368
356
  </BbCollapsible>
@@ -53,18 +53,18 @@ users can type or pick — both paths land in the same `v-model`.
53
53
  ```vue
54
54
  <template>
55
55
  <form
56
- class="flex max-w-sm flex-col gap-3 rounded-[var(--bb-radius)] border p-3"
56
+ class="flex max-w-sm flex-col gap-3 rounded-(--bb-radius) border p-3"
57
57
  @submit.prevent
58
58
  >
59
59
  <div class="flex flex-col gap-0.5">
60
60
  <span class="text-sm font-medium">Workspace appearance</span>
61
- <span class="text-xs text-[color:var(--bb-text-muted)]">
61
+ <span class="text-xs text-(--bb-text-muted)">
62
62
  Brand and accent colors for buttons, links, and chrome.
63
63
  </span>
64
64
  </div>
65
65
 
66
66
  <div
67
- class="flex items-center gap-2 rounded-[var(--bb-radius)] border bg-[color:var(--bb-muted)] px-3 py-2"
67
+ class="flex items-center gap-2 rounded-(--bb-radius) border bg-(--bb-muted) px-3 py-2"
68
68
  >
69
69
  <span
70
70
  class="rounded-full px-2.5 py-0.5 text-xs font-medium"
@@ -85,9 +85,7 @@ users can type or pick — both paths land in the same `v-model`.
85
85
  >
86
86
  Accent
87
87
  </span>
88
- <span v-else class="text-xs text-[color:var(--bb-text-muted)]"
89
- >No accent yet</span
90
- >
88
+ <span v-else class="text-xs text-(--bb-text-muted)">No accent yet</span>
91
89
  </div>
92
90
 
93
91
  <BbColorInput
@@ -162,12 +160,10 @@ const resetToDefaults = () => {
162
160
 
163
161
  ```vue
164
162
  <template>
165
- <div
166
- class="flex max-w-sm flex-col gap-3 rounded-[var(--bb-radius)] border p-3"
167
- >
163
+ <div class="flex max-w-sm flex-col gap-3 rounded-(--bb-radius) border p-3">
168
164
  <div class="flex flex-col gap-0.5">
169
165
  <span class="text-sm font-medium">Label & overlay</span>
170
- <span class="text-xs text-[color:var(--bb-text-muted)]">
166
+ <span class="text-xs text-(--bb-text-muted)">
171
167
  Custom swatch columns, optional alpha, and eyedropper when available.
172
168
  </span>
173
169
  </div>
@@ -220,12 +216,10 @@ color) can parse it without guards.
220
216
 
221
217
  ```vue
222
218
  <template>
223
- <div
224
- class="flex max-w-sm flex-col gap-3 rounded-[var(--bb-radius)] border p-3"
225
- >
219
+ <div class="flex max-w-sm flex-col gap-3 rounded-(--bb-radius) border p-3">
226
220
  <div class="flex flex-col gap-0.5">
227
221
  <span class="text-sm font-medium">New label</span>
228
- <span class="text-xs text-[color:var(--bb-text-muted)]">
222
+ <span class="text-xs text-(--bb-text-muted)">
229
223
  GitHub-style — name a label and paint it as you drag.
230
224
  </span>
231
225
  </div>
@@ -316,12 +310,10 @@ server-side rules, surfaced through `errors`.
316
310
 
317
311
  ```vue
318
312
  <template>
319
- <div
320
- class="flex max-w-sm flex-col gap-3 rounded-[var(--bb-radius)] border p-3"
321
- >
313
+ <div class="flex max-w-sm flex-col gap-3 rounded-(--bb-radius) border p-3">
322
314
  <div class="flex flex-col gap-0.5">
323
315
  <span class="text-sm font-medium">Theme colors</span>
324
- <span class="text-xs text-[color:var(--bb-text-muted)]">
316
+ <span class="text-xs text-(--bb-text-muted)">
325
317
  Floating label, always-visible description, and a required-field error.
326
318
  </span>
327
319
  </div>
@@ -377,12 +369,10 @@ The full common-field surface applies:
377
369
 
378
370
  ```vue
379
371
  <template>
380
- <div
381
- class="flex max-w-sm flex-col gap-3 rounded-[var(--bb-radius)] border p-3"
382
- >
372
+ <div class="flex max-w-sm flex-col gap-3 rounded-(--bb-radius) border p-3">
383
373
  <div class="flex flex-col gap-0.5">
384
374
  <span class="text-sm font-medium">Chart series</span>
385
- <span class="text-xs text-[color:var(--bb-text-muted)]">
375
+ <span class="text-xs text-(--bb-text-muted)">
386
376
  Compact field with a palette icon and a hex suffix.
387
377
  </span>
388
378
  </div>
@@ -395,7 +385,7 @@ The full common-field surface applies:
395
385
  swatches
396
386
  >
397
387
  <template #suffix>
398
- <span class="text-xs text-[color:var(--bb-text-muted)]">hex</span>
388
+ <span class="text-xs text-(--bb-text-muted)">hex</span>
399
389
  </template>
400
390
  </BbColorInput>
401
391
  </div>
@@ -68,17 +68,15 @@ drag would hit your backend.
68
68
 
69
69
  ```vue
70
70
  <template>
71
- <div
72
- class="flex max-w-sm flex-col gap-2 rounded-[var(--bb-radius)] border p-3"
73
- >
71
+ <div class="flex max-w-sm flex-col gap-2 rounded-(--bb-radius) border p-3">
74
72
  <div class="flex items-center justify-between gap-3">
75
73
  <div class="flex flex-col gap-0.5">
76
74
  <span class="text-sm font-medium">Repository labels</span>
77
- <span class="text-xs text-[color:var(--bb-text-muted)]"
75
+ <span class="text-xs text-(--bb-text-muted)"
78
76
  >bitboss/ui · paint from the row</span
79
77
  >
80
78
  </div>
81
- <span class="shrink-0 text-xs text-[color:var(--bb-text-muted)]">
79
+ <span class="shrink-0 text-xs text-(--bb-text-muted)">
82
80
  {{ pending ? 'Saving…' : 'All changes saved' }}
83
81
  </span>
84
82
  </div>
@@ -87,7 +85,7 @@ drag would hit your backend.
87
85
  <li
88
86
  v-for="label in labels"
89
87
  :key="label.name"
90
- class="flex items-center gap-2 rounded-[var(--bb-radius)] px-1 py-1 hover:bg-[color:var(--bb-surface-hover)]"
88
+ class="flex items-center gap-2 rounded-(--bb-radius) px-1 py-1 hover:bg-(--bb-surface-hover)"
91
89
  >
92
90
  <span
93
91
  class="shrink-0 rounded-full px-2 py-0.5 text-xs font-medium"
@@ -98,9 +96,7 @@ drag would hit your backend.
98
96
  >
99
97
  {{ label.name }}
100
98
  </span>
101
- <span
102
- class="mr-auto truncate text-xs text-[color:var(--bb-text-muted)]"
103
- >
99
+ <span class="mr-auto truncate text-xs text-(--bb-text-muted)">
104
100
  {{ label.description }}
105
101
  </span>
106
102
 
@@ -114,8 +110,8 @@ drag would hit your backend.
114
110
  <template #activator="{ props, value, open }">
115
111
  <button
116
112
  v-bind="props"
117
- class="h-4 w-4 shrink-0 rounded-full border border-[color:var(--bb-border)] outline-none ring-offset-1 focus-visible:ring-2 focus-visible:ring-[color:var(--bb-ring)]"
118
- :class="open ? 'ring-2 ring-[color:var(--bb-ring)]' : ''"
113
+ class="h-4 w-4 shrink-0 rounded-full border border-(--bb-border) ring-offset-1 outline-hidden focus-visible:ring-2 focus-visible:ring-(--bb-ring)"
114
+ :class="open ? 'ring-2 ring-(--bb-ring)' : ''"
119
115
  :style="{ backgroundColor: value ?? 'transparent' }"
120
116
  type="button"
121
117
  />
@@ -205,12 +201,10 @@ is one instance per row.
205
201
 
206
202
  ```vue
207
203
  <template>
208
- <div
209
- class="flex max-w-xs flex-col gap-2 rounded-[var(--bb-radius)] border p-3"
210
- >
204
+ <div class="flex max-w-xs flex-col gap-2 rounded-(--bb-radius) border p-3">
211
205
  <div class="flex flex-col gap-0.5">
212
206
  <span class="text-sm font-medium">My calendars</span>
213
- <span class="text-xs text-[color:var(--bb-text-muted)]">
207
+ <span class="text-xs text-(--bb-text-muted)">
214
208
  Dot triggers — one palette instance per category.
215
209
  </span>
216
210
  </div>
@@ -219,7 +213,7 @@ is one instance per row.
219
213
  <li
220
214
  v-for="category in categories"
221
215
  :key="category.name"
222
- class="flex items-center justify-between gap-3 rounded-[var(--bb-radius)] px-1 py-1 hover:bg-[color:var(--bb-surface-hover)]"
216
+ class="flex items-center justify-between gap-3 rounded-(--bb-radius) px-1 py-1 hover:bg-(--bb-surface-hover)"
223
217
  >
224
218
  <span class="text-sm">{{ category.name }}</span>
225
219
 
@@ -232,8 +226,8 @@ is one instance per row.
232
226
  <template #activator="{ props, value, open }">
233
227
  <button
234
228
  v-bind="props"
235
- class="h-4 w-4 shrink-0 rounded-full border border-[color:var(--bb-border)] outline-none ring-offset-1 focus-visible:ring-2 focus-visible:ring-[color:var(--bb-ring)]"
236
- :class="open ? 'ring-2 ring-[color:var(--bb-ring)]' : ''"
229
+ class="h-4 w-4 shrink-0 rounded-full border border-(--bb-border) ring-offset-1 outline-hidden focus-visible:ring-2 focus-visible:ring-(--bb-ring)"
230
+ :class="open ? 'ring-2 ring-(--bb-ring)' : ''"
237
231
  :style="{ backgroundColor: value ?? 'transparent' }"
238
232
  type="button"
239
233
  />
@@ -348,19 +342,17 @@ Three independent enrichments to the palette body:
348
342
 
349
343
  ```vue
350
344
  <template>
351
- <div
352
- class="flex max-w-sm flex-col gap-3 rounded-[var(--bb-radius)] border p-3"
353
- >
345
+ <div class="flex max-w-sm flex-col gap-3 rounded-(--bb-radius) border p-3">
354
346
  <div class="flex flex-col gap-0.5">
355
347
  <span class="text-sm font-medium">Overlay tint</span>
356
- <span class="text-xs text-[color:var(--bb-text-muted)]">
348
+ <span class="text-xs text-(--bb-text-muted)">
357
349
  Custom columns, alpha channel, and eyedropper when the browser supports
358
350
  it.
359
351
  </span>
360
352
  </div>
361
353
 
362
354
  <div
363
- class="flex h-16 items-end overflow-hidden rounded-[var(--bb-radius)] border"
355
+ class="flex h-16 items-end overflow-hidden rounded-(--bb-radius) border"
364
356
  style="
365
357
  background-image:
366
358
  linear-gradient(45deg, var(--bb-muted) 25%, transparent 25%),
@@ -391,11 +383,11 @@ Three independent enrichments to the palette body:
391
383
  <template #activator="{ props, value, open }">
392
384
  <button
393
385
  v-bind="props"
394
- class="inline-flex w-full items-center gap-2 rounded-[var(--bb-radius)] border border-[color:var(--bb-border)] px-3 py-1.5 text-sm outline-none focus-visible:ring-2 focus-visible:ring-[color:var(--bb-ring)]"
386
+ class="inline-flex w-full items-center gap-2 rounded-(--bb-radius) border border-(--bb-border) px-3 py-1.5 text-sm outline-hidden focus-visible:ring-2 focus-visible:ring-(--bb-ring)"
395
387
  type="button"
396
388
  >
397
389
  <span
398
- class="h-4 w-4 shrink-0 rounded-full border border-[color:var(--bb-border)]"
390
+ class="h-4 w-4 shrink-0 rounded-full border border-(--bb-border)"
399
391
  :style="{ backgroundColor: value ?? 'transparent' }"
400
392
  />
401
393
  <span class="mr-auto tabular-nums">{{
@@ -450,12 +442,10 @@ The float itself is tuned with the popover props:
450
442
 
451
443
  ```vue
452
444
  <template>
453
- <div
454
- class="flex max-w-sm flex-col gap-2 rounded-[var(--bb-radius)] border p-3"
455
- >
445
+ <div class="flex max-w-sm flex-col gap-2 rounded-(--bb-radius) border p-3">
456
446
  <div class="flex flex-col gap-0.5">
457
447
  <span class="text-sm font-medium">Brand settings</span>
458
- <span class="text-xs text-[color:var(--bb-text-muted)]">
448
+ <span class="text-xs text-(--bb-text-muted)">
459
449
  Row anchors the popover; only the swatch is clickable.
460
450
  </span>
461
451
  </div>
@@ -469,20 +459,18 @@ The float itself is tuned with the popover props:
469
459
  <template #activator="{ props, anchorProps, value, open }">
470
460
  <span
471
461
  v-bind="anchorProps"
472
- class="flex items-center justify-between gap-3 rounded-[var(--bb-radius)] border border-[color:var(--bb-border)] px-3 py-2 hover:bg-[color:var(--bb-surface-hover)]"
462
+ class="flex items-center justify-between gap-3 rounded-(--bb-radius) border border-(--bb-border) px-3 py-2 hover:bg-(--bb-surface-hover)"
473
463
  >
474
464
  <span class="flex min-w-0 flex-col gap-0.5">
475
465
  <span class="text-sm font-medium">Brand accent</span>
476
- <span
477
- class="truncate text-xs tabular-nums text-[color:var(--bb-text-muted)]"
478
- >
466
+ <span class="truncate text-xs text-(--bb-text-muted) tabular-nums">
479
467
  {{ value ?? 'No color' }}
480
468
  </span>
481
469
  </span>
482
470
  <button
483
471
  v-bind="props"
484
- class="h-5 w-5 shrink-0 rounded-full border border-[color:var(--bb-border)] outline-none ring-offset-1 focus-visible:ring-2 focus-visible:ring-[color:var(--bb-ring)]"
485
- :class="open ? 'ring-2 ring-[color:var(--bb-ring)]' : ''"
472
+ class="h-5 w-5 shrink-0 rounded-full border border-(--bb-border) ring-offset-1 outline-hidden focus-visible:ring-2 focus-visible:ring-(--bb-ring)"
473
+ :class="open ? 'ring-2 ring-(--bb-ring)' : ''"
486
474
  :style="{ backgroundColor: value ?? 'transparent' }"
487
475
  type="button"
488
476
  />
@@ -73,19 +73,17 @@ inherits the destructive button style automatically. Everything after the
73
73
 
74
74
  ```vue
75
75
  <template>
76
- <div
77
- class="flex max-w-sm flex-col gap-3 rounded-[var(--bb-radius)] border p-3"
78
- >
76
+ <div class="flex max-w-sm flex-col gap-3 rounded-(--bb-radius) border p-3">
79
77
  <div class="flex flex-col gap-0.5">
80
78
  <span class="text-sm font-medium">API keys</span>
81
- <span class="text-xs text-[color:var(--bb-text-muted)]">
79
+ <span class="text-xs text-(--bb-text-muted)">
82
80
  <span data-count>{{ keys.length }}</span> active · revoking is immediate
83
81
  </span>
84
82
  </div>
85
83
  <div v-for="key in keys" :key="key.id" class="flex items-center gap-2">
86
84
  <div class="flex min-w-0 flex-1 flex-col">
87
85
  <span class="truncate text-sm font-medium">{{ key.label }}</span>
88
- <span class="text-xs text-[color:var(--bb-text-muted)]">
86
+ <span class="text-xs text-(--bb-text-muted)">
89
87
  {{ key.masked }} · created {{ key.created }}
90
88
  </span>
91
89
  </div>
@@ -98,10 +96,7 @@ inherits the destructive button style automatically. Everything after the
98
96
  Revoke
99
97
  </BbButton>
100
98
  </div>
101
- <p
102
- v-if="keys.length === 0"
103
- class="text-xs text-[color:var(--bb-text-muted)]"
104
- >
99
+ <p v-if="keys.length === 0" class="text-xs text-(--bb-text-muted)">
105
100
  No active keys.
106
101
  </p>
107
102
 
@@ -170,12 +165,10 @@ callback's own return value rather than a plain boolean. One sharp edge:
170
165
 
171
166
  ```vue
172
167
  <template>
173
- <div
174
- class="flex max-w-sm flex-col gap-3 rounded-[var(--bb-radius)] border p-3"
175
- >
168
+ <div class="flex max-w-sm flex-col gap-3 rounded-(--bb-radius) border p-3">
176
169
  <div class="flex flex-col gap-0.5">
177
170
  <span class="text-sm font-medium">Changelog — week 28</span>
178
- <span class="text-xs text-[color:var(--bb-text-muted)]">
171
+ <span class="text-xs text-(--bb-text-muted)">
179
172
  Status: <span data-status>{{ status }}</span>
180
173
  </span>
181
174
  </div>
@@ -268,12 +261,10 @@ the array (`as const` keeps the literal types; without it each handler infers
268
261
 
269
262
  ```vue
270
263
  <template>
271
- <div
272
- class="flex max-w-sm flex-col gap-3 rounded-[var(--bb-radius)] border p-3"
273
- >
264
+ <div class="flex max-w-sm flex-col gap-3 rounded-(--bb-radius) border p-3">
274
265
  <div class="flex flex-col gap-0.5">
275
266
  <span class="text-sm font-medium">Post editor</span>
276
- <span class="text-xs text-[color:var(--bb-text-muted)]">
267
+ <span class="text-xs text-(--bb-text-muted)">
277
268
  Last decision: <span data-decision>{{ decision }}</span>
278
269
  </span>
279
270
  </div>
@@ -391,12 +382,10 @@ edits, so every implicit way out is blocked and the user answers with a button.
391
382
 
392
383
  ```vue
393
384
  <template>
394
- <div
395
- class="flex max-w-sm flex-col gap-3 rounded-[var(--bb-radius)] border p-3"
396
- >
385
+ <div class="flex max-w-sm flex-col gap-3 rounded-(--bb-radius) border p-3">
397
386
  <div class="flex flex-col gap-0.5">
398
387
  <span class="text-sm font-medium">Profile</span>
399
- <span class="text-xs text-[color:var(--bb-text-muted)]">
388
+ <span class="text-xs text-(--bb-text-muted)">
400
389
  Saved as: <span data-saved>{{ saved }}</span>
401
390
  </span>
402
391
  </div>
@@ -463,12 +452,10 @@ By default the dialog closes as soon as the promise settles. Set
463
452
 
464
453
  ```vue
465
454
  <template>
466
- <div
467
- class="flex max-w-sm flex-col gap-3 rounded-[var(--bb-radius)] border p-3"
468
- >
455
+ <div class="flex max-w-sm flex-col gap-3 rounded-(--bb-radius) border p-3">
469
456
  <div class="flex flex-col gap-0.5">
470
457
  <span class="text-sm font-medium">Workspace backup</span>
471
- <span class="text-xs text-[color:var(--bb-text-muted)]" data-status>{{
458
+ <span class="text-xs text-(--bb-text-muted)" data-status>{{
472
459
  status
473
460
  }}</span>
474
461
  </div>
@@ -550,13 +537,11 @@ portal never renders.
550
537
 
551
538
  ```vue
552
539
  <template>
553
- <div
554
- class="flex max-w-sm flex-col gap-3 rounded-[var(--bb-radius)] border p-3"
555
- >
540
+ <div class="flex max-w-sm flex-col gap-3 rounded-(--bb-radius) border p-3">
556
541
  <div class="flex items-center gap-2">
557
542
  <div class="flex min-w-0 flex-1 flex-col">
558
543
  <span class="truncate text-sm font-medium">Sofia Esposito</span>
559
- <span class="text-xs text-[color:var(--bb-text-muted)]"
544
+ <span class="text-xs text-(--bb-text-muted)"
560
545
  >Editor · sofia@acme.dev</span
561
546
  >
562
547
  </div>
@@ -564,7 +549,7 @@ portal never renders.
564
549
  Remove
565
550
  </BbButton>
566
551
  </div>
567
- <p class="text-xs text-[color:var(--bb-text-muted)]" data-result>
552
+ <p class="text-xs text-(--bb-text-muted)" data-result>
568
553
  {{ result }}
569
554
  </p>
570
555
 
@@ -574,10 +559,10 @@ portal never renders.
574
559
  <template #default="{ props }">
575
560
  <div class="flex flex-col items-center gap-1 text-center">
576
561
  <p class="text-sm font-medium">{{ props.name }}</p>
577
- <p class="text-xs text-[color:var(--bb-text-muted)]">
562
+ <p class="text-xs text-(--bb-text-muted)">
578
563
  {{ props.role }}
579
564
  </p>
580
- <p class="mt-1 text-xs text-[color:var(--bb-text-muted)]">
565
+ <p class="mt-1 text-xs text-(--bb-text-muted)">
581
566
  They lose access to every shared resource.
582
567
  </p>
583
568
  </div>
@@ -92,12 +92,10 @@ en-dash.
92
92
 
93
93
  ```vue
94
94
  <template>
95
- <div class="grid max-w-sm gap-3 rounded-[var(--bb-radius)] border p-4">
95
+ <div class="grid max-w-sm gap-3 rounded-(--bb-radius) border p-4">
96
96
  <div>
97
97
  <p class="text-sm font-medium">Book your stay</p>
98
- <p class="text-xs text-[color:var(--bb-text-muted)]">
99
- Seaside Loft · Lisbon
100
- </p>
98
+ <p class="text-xs text-(--bb-text-muted)">Seaside Loft · Lisbon</p>
101
99
  </div>
102
100
  <BbDatePickerInput
103
101
  v-model="stay"
@@ -109,7 +107,7 @@ en-dash.
109
107
  prepend:icon="lucide:calendar"
110
108
  range
111
109
  />
112
- <p class="text-xs text-[color:var(--bb-text-muted)]">
110
+ <p class="text-xs text-(--bb-text-muted)">
113
111
  <template v-if="stay.length === 2">
114
112
  {{ stay[0] }} → {{ stay[1] }} · {{ nights }} night{{
115
113
  nights === 1 ? '' : 's'
@@ -181,10 +179,10 @@ predicate, `floating` output, and the `append:day` slot to dot specific days.
181
179
 
182
180
  ```vue
183
181
  <template>
184
- <div class="grid max-w-sm gap-3 rounded-[var(--bb-radius)] border p-4">
182
+ <div class="grid max-w-sm gap-3 rounded-(--bb-radius) border p-4">
185
183
  <div>
186
184
  <p class="text-sm font-medium">Book a demo</p>
187
- <p class="text-xs text-[color:var(--bb-text-muted)]">
185
+ <p class="text-xs text-(--bb-text-muted)">
188
186
  30 minutes. Dotted days still have open slots.
189
187
  </p>
190
188
  </div>
@@ -208,7 +206,7 @@ predicate, `floating` output, and the `append:day` slot to dot specific days.
208
206
  />
209
207
  </template>
210
208
  </BbDatePickerInput>
211
- <p class="text-xs text-[color:var(--bb-text-muted)]">
209
+ <p class="text-xs text-(--bb-text-muted)">
212
210
  {{ appointment ? `Booked for ${appointment}` : 'No date chosen yet.' }}
213
211
  </p>
214
212
  </div>
@@ -265,13 +263,11 @@ name while the field reads as toolbar chrome.
265
263
 
266
264
  ```vue
267
265
  <template>
268
- <div class="grid max-w-md gap-3 rounded-[var(--bb-radius)] border p-4">
266
+ <div class="grid max-w-md gap-3 rounded-(--bb-radius) border p-4">
269
267
  <div class="flex flex-wrap items-center justify-between gap-2">
270
268
  <div>
271
269
  <p class="text-sm font-medium">Issue date</p>
272
- <p class="text-xs text-[color:var(--bb-text-muted)]">
273
- Filter the invoice list
274
- </p>
270
+ <p class="text-xs text-(--bb-text-muted)">Filter the invoice list</p>
275
271
  </div>
276
272
  <div class="flex gap-1.5">
277
273
  <BbButton size="xs" variant="outline" @click="setPreset(7)">
@@ -297,7 +293,7 @@ name while the field reads as toolbar chrome.
297
293
  prepend:icon="lucide:calendar-range"
298
294
  range
299
295
  />
300
- <p class="text-xs text-[color:var(--bb-text-muted)]">
296
+ <p class="text-xs text-(--bb-text-muted)">
301
297
  {{
302
298
  period.length === 2
303
299
  ? `Showing invoices from ${period[0]} to ${period[1]}`
@@ -447,15 +443,13 @@ issue date and surfaces the normalisation.
447
443
 
448
444
  ```vue
449
445
  <template>
450
- <div class="grid max-w-sm gap-3 rounded-[var(--bb-radius)] border p-4">
446
+ <div class="grid max-w-sm gap-3 rounded-(--bb-radius) border p-4">
451
447
  <div class="flex items-start justify-between gap-3">
452
448
  <div>
453
449
  <p class="text-sm font-medium">INV-2048</p>
454
- <p class="text-xs text-[color:var(--bb-text-muted)]">
455
- Acme Studio · $2,400.00
456
- </p>
450
+ <p class="text-xs text-(--bb-text-muted)">Acme Studio · $2,400.00</p>
457
451
  </div>
458
- <p class="text-xs text-[color:var(--bb-text-muted)]">Draft</p>
452
+ <p class="text-xs text-(--bb-text-muted)">Draft</p>
459
453
  </div>
460
454
  <BbDatePickerInput
461
455
  v-model="dueDate"
@@ -472,7 +466,7 @@ issue date and surfaces the normalisation.
472
466
  @error="onError"
473
467
  @update:model-value="dueError = ''"
474
468
  />
475
- <p class="text-xs text-[color:var(--bb-text-muted)]">
469
+ <p class="text-xs text-(--bb-text-muted)">
476
470
  Issued {{ issuedAt }} · Net 30 from issue
477
471
  </p>
478
472
  </div>
@@ -571,10 +565,10 @@ typing and the calendar (`aria-readonly`).
571
565
 
572
566
  ```vue
573
567
  <template>
574
- <div class="grid max-w-sm gap-3 rounded-[var(--bb-radius)] border p-4">
568
+ <div class="grid max-w-sm gap-3 rounded-(--bb-radius) border p-4">
575
569
  <div>
576
570
  <p class="text-sm font-medium">Contract dates</p>
577
- <p class="text-xs text-[color:var(--bb-text-muted)]">
571
+ <p class="text-xs text-(--bb-text-muted)">
578
572
  Clear the start date, or copy the locked created stamp.
579
573
  </p>
580
574
  </div>