bitboss-ui 3.0.0-beta.12 → 3.0.0-beta.15

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 (207) hide show
  1. package/dist/ai/BbAccordion.md +2 -2
  2. package/dist/ai/BbAlert.md +8 -4
  3. package/dist/ai/BbAsterisk.md +17 -0
  4. package/dist/ai/BbAvatar.md +12 -3
  5. package/dist/ai/BbBadge.md +3 -3
  6. package/dist/ai/BbBadgeButton.md +1 -1
  7. package/dist/ai/BbBaseButton.md +1 -1
  8. package/dist/ai/BbBaseCheckboxGroup.md +1 -1
  9. package/dist/ai/BbBaseCheckboxIcon.md +19 -2
  10. package/dist/ai/BbBaseRadioIcon.md +19 -3
  11. package/dist/ai/BbBaseSwitchGroup.md +1 -1
  12. package/dist/ai/BbBaseSwitchIcon.md +21 -3
  13. package/dist/ai/BbBreadcrumbs.md +1 -1
  14. package/dist/ai/BbButton.md +1 -1
  15. package/dist/ai/BbCheckbox.md +8 -7
  16. package/dist/ai/BbCheckboxGroup.md +5 -4
  17. package/dist/ai/BbCollapsible.md +10 -8
  18. package/dist/ai/BbColorPalette.md +7 -1
  19. package/dist/ai/BbConfirm.md +12 -5
  20. package/dist/ai/BbDatePicker.md +1 -1
  21. package/dist/ai/BbDialog.md +9 -6
  22. package/dist/ai/BbDropdown.md +118 -14
  23. package/dist/ai/BbDropdownButton.md +2 -2
  24. package/dist/ai/BbDropdownGroup.md +1 -1
  25. package/dist/ai/BbForm.md +49 -14
  26. package/dist/ai/BbIcon.md +6 -0
  27. package/dist/ai/BbIndicator.md +2 -2
  28. package/dist/ai/BbOffCanvas.md +6 -5
  29. package/dist/ai/BbPopover.md +29 -14
  30. package/dist/ai/BbProgress.md +6 -3
  31. package/dist/ai/BbRadio.md +8 -7
  32. package/dist/ai/BbRadioGroup.md +10 -7
  33. package/dist/ai/BbSelect.md +8 -4
  34. package/dist/ai/BbSelectPopover.md +1 -1
  35. package/dist/ai/BbSlider.md +24 -9
  36. package/dist/ai/BbSmoothHeight.md +1 -1
  37. package/dist/ai/BbSwitch.md +2 -0
  38. package/dist/ai/BbSwitchGroup.md +7 -4
  39. package/dist/ai/BbTabs.md +20 -6
  40. package/dist/ai/BbTabsList.md +1 -1
  41. package/dist/ai/BbTabsPanes.md +1 -1
  42. package/dist/ai/BbTabsRoot.md +2 -2
  43. package/dist/ai/BbTag.md +1 -1
  44. package/dist/ai/BbTextInput.md +4 -3
  45. package/dist/ai/BbTextarea.md +1 -1
  46. package/dist/ai/BbTimePicker.md +1 -1
  47. package/dist/ai/BbToast.md +1 -1
  48. package/dist/ai/BbToastPortal.md +1 -1
  49. package/dist/ai/BbTooltip.md +9 -7
  50. package/dist/ai/CommonPopover.md +1 -1
  51. package/dist/ai/FlatListBox.md +1 -1
  52. package/dist/ai/GroupedListBox.md +1 -1
  53. package/dist/ai/changelog.json +14 -2
  54. package/dist/ai/components.json +180 -43
  55. package/dist/ai/composables/useBbConfig.md +31 -11
  56. package/dist/ai/composables/useConfirm.md +5 -3
  57. package/dist/ai/guides/icons-policy.md +4 -2
  58. package/dist/ai/guides/installation-and-plugin-setup.md +59 -8
  59. package/dist/ai/guides/migration/components/bb-checkbox-group.md +30 -0
  60. package/dist/ai/guides/migration/components/bb-checkbox.md +2 -1
  61. package/dist/ai/guides/migration/components/bb-collapsible.md +5 -5
  62. package/dist/ai/guides/migration/components/bb-dialog.md +7 -5
  63. package/dist/ai/guides/migration/components/bb-offcanvas.md +18 -3
  64. package/dist/ai/guides/migration/components/bb-rating.md +8 -2
  65. package/dist/ai/guides/migration/components/bb-select.md +5 -2
  66. package/dist/ai/guides/migration/components/bb-text-input.md +6 -6
  67. package/dist/ai/guides/migration/v2-to-v3.md +75 -4
  68. package/dist/ai/index.md +6 -6
  69. package/dist/ai/source/BbAlert.md +60 -2
  70. package/dist/ai/source/BbAvatar.md +3 -3
  71. package/dist/ai/source/BbBadge.md +8 -2
  72. package/dist/ai/source/BbBadgeButton.md +8 -2
  73. package/dist/ai/source/BbBaseButton.md +3 -1
  74. package/dist/ai/source/BbBaseCheckboxGroup.md +1 -1
  75. package/dist/ai/source/BbBaseDatePicker.md +3 -1
  76. package/dist/ai/source/BbBaseDatePickerInput.md +5 -1
  77. package/dist/ai/source/BbBaseInputContainer.md +26 -1
  78. package/dist/ai/source/BbBaseRating.md +3 -1
  79. package/dist/ai/source/BbBaseTimePickerInput.md +5 -1
  80. package/dist/ai/source/BbCheckboxGroup.md +2 -1
  81. package/dist/ai/source/BbCollapsible.md +7 -1
  82. package/dist/ai/source/BbColorInput.md +3 -4
  83. package/dist/ai/source/BbColorPalette.md +3 -4
  84. package/dist/ai/source/BbDatePicker.md +5 -1
  85. package/dist/ai/source/BbDatePickerInput.md +5 -1
  86. package/dist/ai/source/BbDialog.md +27 -3
  87. package/dist/ai/source/BbDropdown.md +130 -20
  88. package/dist/ai/source/BbDropdownGroup.md +116 -11
  89. package/dist/ai/source/BbForm.md +93 -5
  90. package/dist/ai/source/BbIcon.md +3 -2
  91. package/dist/ai/source/BbNumberInput.md +3 -4
  92. package/dist/ai/source/BbOffCanvas.md +22 -5
  93. package/dist/ai/source/BbPopover.md +16 -9
  94. package/dist/ai/source/BbRadioGroup.md +3 -1
  95. package/dist/ai/source/BbSelect.md +3 -1
  96. package/dist/ai/source/BbSelectPopover.md +3 -1
  97. package/dist/ai/source/BbSlider.md +3 -4
  98. package/dist/ai/source/BbSwitchGroup.md +8 -5
  99. package/dist/ai/source/BbTable.md +333 -178
  100. package/dist/ai/source/BbTabs.md +6 -7
  101. package/dist/ai/source/BbTabsList.md +6 -7
  102. package/dist/ai/source/BbTabsPanes.md +6 -7
  103. package/dist/ai/source/BbTabsRoot.md +6 -7
  104. package/dist/ai/source/BbTag.md +3 -4
  105. package/dist/ai/source/BbTextInput.md +3 -4
  106. package/dist/ai/source/BbTextarea.md +3 -4
  107. package/dist/ai/source/BbTimePicker.md +4 -1
  108. package/dist/ai/source/BbTimePickerInput.md +5 -1
  109. package/dist/ai/source/BbToast.md +3 -1
  110. package/dist/ai/source/BbTooltip.md +5 -1
  111. package/dist/components/BbAlert/types.d.ts +10 -1
  112. package/dist/components/BbAvatar/BbAvatar.vue.d.ts +1 -1
  113. package/dist/components/BbAvatar/BbAvatar.vue_vue_type_script_setup_true_lang.js +33 -33
  114. package/dist/components/BbBadge/types.d.ts +8 -2
  115. package/dist/components/BbBaseButton/BbBaseButton.vue_vue_type_script_setup_true_lang.js +47 -47
  116. package/dist/components/BbBaseButton/RouterComponent.vue_vue_type_script_setup_true_lang.js +14 -14
  117. package/dist/components/BbBaseCheckboxGroup/types.d.ts +1 -1
  118. package/dist/components/BbBaseDatePicker/BbBaseDatePicker.vue_vue_type_script_setup_true_lang.js +167 -167
  119. package/dist/components/BbBaseDatePicker/BbBaseDatePickerInputDaySelector.vue.d.ts +9 -9
  120. package/dist/components/BbBaseDatePicker/BbBaseDatePickerInputDaySelector.vue_vue_type_script_setup_true_lang.js +79 -79
  121. package/dist/components/BbBaseDatePicker/BbBaseDatePickerMonthSelector.vue_vue_type_script_setup_true_lang.js +64 -64
  122. package/dist/components/BbBaseDatePickerInput/BbBaseDatePickerInput.vue.d.ts +1 -1
  123. package/dist/components/BbBaseDatePickerInput/BbBaseDatePickerInput.vue_vue_type_script_setup_true_lang.js +139 -139
  124. package/dist/components/BbBaseInputContainer/BbBaseInputContainer.vue_vue_type_script_setup_true_lang.js +1 -1
  125. package/dist/components/BbBaseRating/BbBaseRating.vue_vue_type_script_setup_true_lang.js +41 -41
  126. package/dist/components/BbBaseTimePickerInput/BbBaseTimePickerInput.vue.d.ts +1 -1
  127. package/dist/components/BbBaseTimePickerInput/BbBaseTimePickerInput.vue_vue_type_script_setup_true_lang.js +105 -105
  128. package/dist/components/BbCheckboxGroup/types.d.ts +2 -1
  129. package/dist/components/BbCollapsible/types.d.ts +7 -1
  130. package/dist/components/BbColorInput/BbColorInput.vue.d.ts +1 -1
  131. package/dist/components/BbColorInput/BbColorInput.vue_vue_type_script_setup_true_lang.js +18 -18
  132. package/dist/components/BbColorPalette/BbColorPalette.vue.d.ts +2 -2
  133. package/dist/components/BbColorPalette/BbColorPalette.vue_vue_type_script_setup_true_lang.js +50 -50
  134. package/dist/components/BbDatePicker/BbDatePicker.vue.d.ts +1 -1
  135. package/dist/components/BbDatePicker/BbDatePicker.vue_vue_type_script_setup_true_lang.js +100 -100
  136. package/dist/components/BbDatePickerInput/BbDatePickerInput.vue_vue_type_script_setup_true_lang.js +21 -21
  137. package/dist/components/BbDialog/BbDialog.vue.d.ts +1 -1
  138. package/dist/components/BbDialog/BbDialog.vue_vue_type_script_setup_true_lang.js +105 -100
  139. package/dist/components/BbDialog/types.d.ts +1 -1
  140. package/dist/components/BbDropdown/AdaptiveDropdown.vue.d.ts +2 -0
  141. package/dist/components/BbDropdown/AdaptiveDropdown.vue_vue_type_script_setup_true_lang.js +95 -76
  142. package/dist/components/BbDropdown/BbDropdown.vue.d.ts +2 -2
  143. package/dist/components/BbDropdown/BbDropdown.vue_vue_type_script_setup_true_lang.js +180 -174
  144. package/dist/components/BbDropdown/types.d.ts +13 -1
  145. package/dist/components/BbIcon/BbIcon.vue_vue_type_script_setup_true_lang.js +33 -33
  146. package/dist/components/BbNumberInput/BbNumberInput.vue.d.ts +1 -1
  147. package/dist/components/BbNumberInput/BbNumberInput.vue_vue_type_script_setup_true_lang.js +15 -15
  148. package/dist/components/BbOffCanvas/BbOffCanvas.vue.d.ts +1 -1
  149. package/dist/components/BbOffCanvas/BbOffCanvas.vue_vue_type_script_setup_true_lang.js +166 -161
  150. package/dist/components/BbPopover/BbPopover.vue.d.ts +2 -2
  151. package/dist/components/BbPopover/BbPopover.vue_vue_type_script_setup_true_lang.js +149 -146
  152. package/dist/components/BbPopover/types.d.ts +3 -2
  153. package/dist/components/BbRadioGroup/types.d.ts +3 -1
  154. package/dist/components/BbSelect/BbSelect.vue_vue_type_script_setup_true_lang.js +22 -22
  155. package/dist/components/BbSelectPopover/BbSelectPopover.vue_vue_type_script_setup_true_lang.js +209 -209
  156. package/dist/components/BbSlider/BbSlider.vue.d.ts +1 -1
  157. package/dist/components/BbSlider/BbSlider.vue_vue_type_script_setup_true_lang.js +20 -20
  158. package/dist/components/BbTable/BbTable.vue_vue_type_script_setup_true_lang.js +661 -677
  159. package/dist/components/BbTable/BbTableDataRow.d.ts +15 -4
  160. package/dist/components/BbTable/BbTableDataRow.js +2 -4
  161. package/dist/components/BbTable/BbTableExpandRow.d.ts +73 -0
  162. package/dist/components/BbTable/BbTableExpandRow.js +52 -0
  163. package/dist/components/BbTable/utils.js +0 -1
  164. package/dist/components/BbTabs/types.d.ts +0 -8
  165. package/dist/components/BbTag/BbTag.vue.d.ts +1 -1
  166. package/dist/components/BbTag/BbTag.vue_vue_type_script_setup_true_lang.js +18 -18
  167. package/dist/components/BbTextInput/BbTextInput.vue.d.ts +1 -1
  168. package/dist/components/BbTextInput/BbTextInput.vue_vue_type_script_setup_true_lang.js +18 -18
  169. package/dist/components/BbTextarea/BbTextarea.vue.d.ts +1 -1
  170. package/dist/components/BbTextarea/BbTextarea.vue_vue_type_script_setup_true_lang.js +54 -54
  171. package/dist/components/BbTimePicker/BbTimePicker.vue.d.ts +1 -1
  172. package/dist/components/BbTimePicker/BbTimePicker.vue_vue_type_script_setup_true_lang.js +80 -80
  173. package/dist/components/BbTimePickerInput/BbTimePickerInput.vue_vue_type_script_setup_true_lang.js +61 -61
  174. package/dist/components/BbToast/BbToast.vue_vue_type_script_setup_true_lang.js +17 -17
  175. package/dist/components/BbTooltip/types.d.ts +5 -1
  176. package/dist/components/FlatListBox/FlatListBox.vue_vue_type_script_setup_true_lang.js +8 -8
  177. package/dist/components/GroupedListBox/GroupedListBox.vue_vue_type_script_setup_true_lang.js +6 -6
  178. package/dist/composables/useBaseOptions.js +1 -1
  179. package/dist/composables/useBbConfig.d.ts +21 -6
  180. package/dist/composables/useBbConfig.js +10 -3
  181. package/dist/composables/useConfig.d.ts +50 -0
  182. package/dist/composables/useConfig.js +9 -0
  183. package/dist/composables/useLocale.js +10 -7
  184. package/dist/composables/useMobile.js +5 -5
  185. package/dist/composables/useToast.js +5 -5
  186. package/dist/deprecation/ai-deprecations.json.d.ts +110 -0
  187. package/dist/deprecation/ai-deprecations.json.js +1 -1
  188. package/dist/directives/bbDropdown.d.ts +10 -4
  189. package/dist/directives/bbDropdown.js +7 -7
  190. package/dist/index.d.ts +1 -1
  191. package/dist/llms-full.txt +743 -230
  192. package/dist/llms-medium.txt +64 -13
  193. package/dist/llms.txt +1 -1
  194. package/dist/nuxt-auto-imports.d.ts +100 -0
  195. package/dist/nuxt-auto-imports.js +55 -0
  196. package/dist/nuxt-module.d.ts +22 -1
  197. package/dist/nuxt.js +22 -8
  198. package/dist/plugin.d.ts +10 -1
  199. package/dist/plugin.js +20 -19
  200. package/dist/runtime/nuxt-plugin.js +5 -5
  201. package/dist/styles.css +1 -1
  202. package/dist/utilities/misc/listboxMetrics.d.ts +3 -3
  203. package/dist/utilities/misc/listboxMetrics.js +2 -2
  204. package/dist/validated/BbForm.vue_vue_type_script_setup_true_lang.js +45 -27
  205. package/dist/validated/useValidatedField.js +25 -23
  206. package/llms.txt +1 -1
  207. package/package.json +1 -1
@@ -532,7 +532,7 @@ is generated for you.
532
532
  | `eager` | `boolean \| undefined` | | | Prevents rendering content before it's made visible. |
533
533
  | `id` | `string \| undefined` | | | The identifier of the component. |
534
534
  | `modelValue` | `boolean \| undefined` | `false` | | Used by v-model to trigger opening / closing the collapsible. An accordion with no `v-model` starts closed. |
535
- | `transitionDuration` | `number \| undefined` | `transitions.medium` | | How long the transition has to last in milliseconds |
535
+ | `transitionDuration` | `number \| undefined` | `250` | | How long the transition has to last in milliseconds |
536
536
 
537
537
  ## Events
538
538
 
@@ -546,4 +546,4 @@ is generated for you.
546
546
  ## See Also
547
547
 
548
548
  - [BbCollapsible](./BbCollapsible.md) — Toggles visibility of collapsible content blocks.
549
- - [BbTabs](./BbTabs.md) — Switches between tabbed content views (shadcn-like strip; BbTabRoot enables split layouts).
549
+ - [BbTabs](./BbTabs.md) — Switches between tabbed content views (shadcn-like strip; the co-located BbTabsRoot / BbTabsList / BbTabsPanes exports enable split layouts).
@@ -139,8 +139,12 @@ Bind `v-model` when the visibility matters to you:
139
139
  </p>
140
140
  </div>
141
141
 
142
+ <!--
143
+ `v-model` alone owns the dismissal, so the alert plays its own leave
144
+ transition. Pairing it with a `v-if` on the SAME element unmounts the
145
+ node the instant the model flips and the animation never runs.
146
+ -->
142
147
  <BbAlert
143
- v-if="showBanner"
144
148
  v-model="showBanner"
145
149
  close-label="Dismiss email verification reminder"
146
150
  icon="lucide:mail"
@@ -149,7 +153,7 @@ Bind `v-model` when the visibility matters to you:
149
153
  variant="primary"
150
154
  />
151
155
  <BbButton
152
- v-else
156
+ v-if="!showBanner"
153
157
  prepend:icon="lucide:mail"
154
158
  variant="ghost"
155
159
  @click="showBanner = true"
@@ -399,7 +403,7 @@ const publish = () => {
399
403
  | `role` | `"alert" \| "status" \| undefined` | | | Accessibility role for the alert container. Defaults to `'alert'` for destructive/warning variants, otherwise `'status'`. |
400
404
  | `text` | `string \| undefined` | | | Text content of the alert body. |
401
405
  | `title` | `string \| undefined` | | | Text content of the alert title. |
402
- | `transitionDuration` | `number \| undefined` | `transitions.medium` | | Transition duration in milliseconds for enter/leave. |
406
+ | `transitionDuration` | `number \| undefined` | `250` | | Transition duration in milliseconds for enter/leave. |
403
407
  | `variant` | `keyof AlertVariantRegistry \| undefined` | `"outline"` | | Visual variant of the alert. |
404
408
 
405
409
  ## Events
@@ -414,4 +418,4 @@ const publish = () => {
414
418
 
415
419
  ## See Also
416
420
 
417
- - [BbToast](./BbToast.md) — Shows transient notification messages.
421
+ - [BbToast](./BbToast.md) — Shows transient notification messages (includes the co-located BbToastPortal export).
@@ -33,6 +33,23 @@ you compose a bespoke label outside those controls.
33
33
  Wrap it in an element with your own spacing if the default `margin-inline-start`
34
34
  doesn't suit the layout; the glyph inherits nothing else from its surroundings.
35
35
 
36
+ ### It is `aria-hidden` — the control carries the requirement
37
+
38
+ The span renders `aria-hidden="true"`, so **screen readers never announce it**.
39
+ That is deliberate: an asterisk read aloud as "star" is noise, and a marker
40
+ placed in a label is not a reliable way to convey a requirement. What actually
41
+ carries mandatoriness to assistive tech is the **`required` attribute on the
42
+ control** — which the library sets from your `required` prop.
43
+
44
+ The practical consequence: the marker is a _visual_ affordance only, and
45
+ `required` is the real thing. Never ship a field that shows the asterisk
46
+ without `required` (sighted users see a requirement that assistive tech cannot
47
+ perceive), and never assume the asterisk is doing accessibility work.
48
+
49
+ `showAsterisk` on the validated controls is also gated on the plugin option, so
50
+ with `requiredAsterisk: false` there is no way to render the marker through
51
+ them at all — placing `BbAsterisk` by hand is then the only route.
52
+
36
53
  ## Props
37
54
 
38
55
  - None.
@@ -83,8 +83,17 @@ not hero examples.
83
83
  The fallback surface is **always painted with the primary design token** —
84
84
  `--bb-primary` behind, `--bb-primary-fg` for the initials/icon, the same
85
85
  pairing as a primary button — so initials stay legible in light and dark and
86
- every avatar matches your theme automatically. There is no per-avatar tinting
87
- API: theming happens through the tokens, not a prop.
86
+ every avatar matches your theme automatically.
87
+
88
+ There is no tinting **prop**, but there are three component locals on
89
+ `.bb-avatar` for the cases the theme cannot cover — a per-tenant or
90
+ per-user colour: `--bg-color` (fallback surface, defaults to `--bb-primary`),
91
+ `--text-color` (initials, `--bb-primary-fg`) and `--default-icon-color` (the
92
+ placeholder glyph). Set them on the avatar or on a class you put on it:
93
+
94
+ ```vue
95
+ <BbAvatar text="Acme Studio" :style="{ '--bg-color': tenant.color }" />
96
+ ```
88
97
 
89
98
  **The size scale**
90
99
 
@@ -512,4 +521,4 @@ available in visible text or an adjacent label.
512
521
 
513
522
  ## See Also
514
523
 
515
- - [BbBadge](./BbBadge.md) — Displays compact status counters or labels, the floating mode acts as notification dot.
524
+ - [BbBadge](./BbBadge.md) — Displays a compact inline status counter or label. It sits in the flow for a bubble or dot anchored OVER another element, use BbIndicator (includes the co-located BbBadgeButton export).
@@ -4,7 +4,7 @@
4
4
 
5
5
  - Safety level: **Consumer API**
6
6
  - Group: **Feedback**
7
- - Description: Displays compact status counters or labels, the floating mode acts as notification dot.
7
+ - Description: Displays a compact inline status counter or label. It sits in the flow for a bubble or dot anchored OVER another element, use BbIndicator (includes the co-located BbBadgeButton export).
8
8
  - Usage rule: Prefer this component for consumer-facing implementations.
9
9
  - Implementation source (only when the contract below is not enough): [source/BbBadge.md](./source/BbBadge.md)
10
10
 
@@ -715,7 +715,7 @@ selectors like `.bb-badge > .bb-badge__content`, which no longer match.
715
715
  | --- | --- | --- | --- | --- |
716
716
  | `append:icon` | `string \| undefined` | | | Icon rendered after the label. On a `clearable` badge it shares the trailing slot with the clear button: the icon shows at rest and the clear button reveals over it on hover/focus. |
717
717
  | `clearable` | `boolean \| undefined` | | | Renders a trailing clear button and emits `click:clear` when pressed — turns the badge into a dismissible token (the pattern formerly served by `BbChip`). |
718
- | `clearableLabel` | `string \| undefined` | | | Accessible label for the clear button. Falls back to the localized `badge.clearLabel` key. |
718
+ | `clearableLabel` | `string \| undefined` | | | Accessible label for the clear button. Rarely needed: unset, the name is **composed** from the localized `badge.clearLabel` verb and the badge's own text — "Remove Italy", not a bare "Remove" — which is already the right name in almost ever… |
719
719
  | `icon` | `string \| undefined` | | | Renders an icon-only badge. When set, `prepend:icon` / `append:icon` are ignored and the default slot becomes the badge's visually hidden accessible label — always provide it. |
720
720
  | `loading` | `boolean \| undefined` | | | Shows a spinner in place of the leftmost icon, mirroring `BbButton`: it replaces the `icon` glyph or the `prepend:icon` when one is set; when the `append:icon` is the sole icon it replaces that instead (e.g. a select-activator chevron while… |
721
721
  | `prepend:icon` | `string \| undefined` | | | Icon rendered before the label. |
@@ -732,6 +732,6 @@ selectors like `.bb-badge > .bb-badge__content`, which no longer match.
732
732
 
733
733
  ## See Also
734
734
 
735
- - [BbIndicator](./BbIndicator.md) — Anchors a notification bubble (count/short text) or a dot over a wrapped element, with floating and corner-placement options.
735
+ - [BbIndicator](./BbIndicator.md) — Anchors a notification bubble (count/short text) or a dot over a wrapped element.
736
736
  - [BbAvatar](./BbAvatar.md) — Displays an avatar and has a fallback content slot.
737
737
  - [BbBadgeButton](./BbBadgeButton.md) — Makes a badge's body interactive: slotted as a direct child of BbBadge it renders the badge body as a real button/link with full BbBaseButton parity, leaving `clearable` free to remain a separate control.
@@ -63,5 +63,5 @@
63
63
 
64
64
  ## See Also
65
65
 
66
- - [BbBadge](./BbBadge.md) — Displays compact status counters or labels, the floating mode acts as notification dot.
66
+ - [BbBadge](./BbBadge.md) — Displays a compact inline status counter or label. It sits in the flow for a bubble or dot anchored OVER another element, use BbIndicator (includes the co-located BbBadgeButton export).
67
67
  - [BbBaseButton](./BbBaseButton.md) — Unstyled button/link primitive: element resolution (button/anchor/router link) and the full navigation engine, with no visual chrome. Use for any clickable or navigable surface that is not a variant-first BbButton — cards, list rows, custom links.
@@ -510,4 +510,4 @@ const sent = ref(false);
510
510
 
511
511
  - [BbButton](./BbButton.md) — Button with loading state, tooltip, and icon support.
512
512
  - [BbDropdownButton](./BbDropdownButton.md) — A button with primary action and all other actions collected in a dropdown.
513
- - [BbDropdown](./BbDropdown.md) — Displays contextual action menus and menu content.
513
+ - [BbDropdown](./BbDropdown.md) — Displays contextual action menus and menu content (includes the co-located BbDropdownGroup export, which is how a selectable group is bound).
@@ -44,7 +44,7 @@
44
44
 
45
45
  - `active` — `(e: "active"): void` — Emitted when the group becomes active (focus/click enters it).
46
46
  - `blur` — `(e: "blur", event: FocusEvent): void` — Emitted when one of the generated checkbox inputs loses focus. Forwards the original DOM `FocusEvent`.
47
- - `change` — `(e: "change", event: Event): void` — Emitted when a checkbox option is toggled. Forwards the original DOM `Event` from the checkbox input.
47
+ - `change` — `(e: "change", event: Event): void` — Emitted when an option is toggled. Forwards the original DOM `Event` from the checkbox input.
48
48
  - `click` — `(e: "click", event: MouseEvent): void` — Emitted when one of the generated checkbox inputs is clicked. Forwards the original DOM `MouseEvent`.
49
49
  - `focus` — `(e: "focus", event: FocusEvent): void` — Emitted when one of the generated checkbox inputs receives focus. Forwards the original DOM `FocusEvent`.
50
50
  - `inactive` — `(e: "inactive"): void` — Emitted when focus/click moves outside the group after it was active. Useful for validation-on-blur flows at group level.
@@ -110,8 +110,8 @@ const selected = ref<string[]>(['email']);
110
110
 
111
111
  ### Styling
112
112
 
113
- The glyph owns its own tokens, so restyle it by overriding CSS custom properties
114
- on the element (or an ancestor — they inherit):
113
+ The glyph owns its own tokens, so restyle it by overriding CSS custom
114
+ properties on it:
115
115
 
116
116
  - `--size` — box edge length (default `16px`)
117
117
  - `--r` — corner radius (default `4px`)
@@ -119,6 +119,23 @@ on the element (or an ancestor — they inherit):
119
119
  - `--check-color` — checkmark stroke (default `--bb-primary-fg`)
120
120
  - `--ring-color` — focus ring color
121
121
 
122
+ **On the element itself, not an ancestor.** Each of these is declared on the
123
+ glyph's own class, and a declaration on the element always beats one inherited
124
+ from an ancestor — so `--size` set on a wrapper `div` is simply ignored
125
+ (verified: the glyph stays 16px). Target the glyph class, or pass a `style` /
126
+ `class` that lands on it:
127
+
128
+ ```css
129
+ /* works */
130
+ .bb-base-checkbox-icon {
131
+ --size: 20px;
132
+ }
133
+ /* does nothing */
134
+ .my-form {
135
+ --size: 20px;
136
+ }
137
+ ```
138
+
122
139
  **Bigger, rounder, recolored**
123
140
 
124
141
  ```vue
@@ -130,14 +130,30 @@ const selected = ref('team');
130
130
 
131
131
  ### Styling
132
132
 
133
- Restyle by overriding the glyph's CSS custom properties on the element (or an
134
- ancestor — they inherit):
133
+ Restyle by overriding the glyph's CSS custom properties on it:
135
134
 
136
135
  - `--size` — ring diameter (default `16px`)
137
- - `--space` — gap between ring and dot when checked (default `6px`)
136
+ - `--space` — gap between ring and dot when checked (default `2px`)
138
137
  - `--color` — dot color (default `--bb-primary`)
139
138
  - `--ring-color` — focus ring color
140
139
 
140
+ **On the element itself, not an ancestor.** Each of these is declared on the
141
+ glyph's own class, and a declaration on the element always beats one inherited
142
+ from an ancestor — so `--size` set on a wrapper `div` is simply ignored
143
+ (verified: the glyph stays at its 16px default). Target the glyph class, or pass a `style` /
144
+ `class` that lands on it:
145
+
146
+ ```css
147
+ /* works */
148
+ .bb-base-radio-icon {
149
+ --size: 20px;
150
+ }
151
+ /* does nothing */
152
+ .my-form {
153
+ --size: 20px;
154
+ }
155
+ ```
156
+
141
157
  **Bigger and recolored**
142
158
 
143
159
  ```vue
@@ -44,7 +44,7 @@
44
44
 
45
45
  - `active` — `(e: "active"): void` — Emitted when the group becomes active (focus/click enters it).
46
46
  - `blur` — `(e: "blur", event: FocusEvent): void` — Emitted when one of the generated checkbox inputs loses focus. Forwards the original DOM `FocusEvent`.
47
- - `change` — `(e: "change", event: Event): void` — Emitted when a checkbox option is toggled. Forwards the original DOM `Event` from the checkbox input.
47
+ - `change` — `(e: "change", event: Event): void` — Emitted when an option is toggled. Forwards the original DOM `Event` from the checkbox input.
48
48
  - `click` — `(e: "click", event: MouseEvent): void` — Emitted when one of the generated checkbox inputs is clicked. Forwards the original DOM `MouseEvent`.
49
49
  - `focus` — `(e: "focus", event: FocusEvent): void` — Emitted when one of the generated checkbox inputs receives focus. Forwards the original DOM `FocusEvent`.
50
50
  - `inactive` — `(e: "inactive"): void` — Emitted when focus/click moves outside the group after it was active. Useful for validation-on-blur flows at group level.
@@ -120,15 +120,33 @@ const state = reactive<Record<string, boolean>>({
120
120
 
121
121
  ### Styling
122
122
 
123
- Restyle by overriding the glyph's CSS custom properties on the element (or an
124
- ancestor — they inherit):
123
+ Restyle by overriding the glyph's CSS custom properties on it:
125
124
 
126
125
  - `--w` / `--h` — track width / height (default `32px` / `18px`)
127
126
  - `--thumb` — thumb diameter (default `16px`)
128
127
  - `--color` — track fill when checked (default `--bb-primary`)
129
- - `--bg-color` — track fill when off (default `--bb-muted`)
128
+ - `--bg-color` — track fill when off (default `--bb-track`)
130
129
  - `--radius` — track/thumb rounding (default `999px`)
131
130
 
131
+ **On the element itself, not an ancestor.** Each of these is declared on the
132
+ glyph's own class, and a declaration on the element always beats one inherited
133
+ from an ancestor — so `--w` set on a wrapper `div` is simply ignored
134
+ (verified: the glyph keeps its shipped size). Target the glyph class, or pass a `style` /
135
+ `class` that lands on it:
136
+
137
+ ```css
138
+ /* works */
139
+ .bb-base-switch-icon {
140
+ --w: 40px;
141
+ --h: 22px;
142
+ --thumb: 18px;
143
+ }
144
+ /* does nothing */
145
+ .my-form {
146
+ --w: 40px;
147
+ }
148
+ ```
149
+
132
150
  **Larger and recolored**
133
151
 
134
152
  ```vue
@@ -582,4 +582,4 @@ overflow calculation runs after hydration once real widths exist.
582
582
  ## See Also
583
583
 
584
584
  - [BbBaseButton](./BbBaseButton.md) — Unstyled button/link primitive: element resolution (button/anchor/router link) and the full navigation engine, with no visual chrome. Use for any clickable or navigable surface that is not a variant-first BbButton — cards, list rows, custom links.
585
- - [BbDropdown](./BbDropdown.md) — Displays contextual action menus and menu content.
585
+ - [BbDropdown](./BbDropdown.md) — Displays contextual action menus and menu content (includes the co-located BbDropdownGroup export, which is how a selectable group is bound).
@@ -945,5 +945,5 @@ Anti-patterns:
945
945
 
946
946
  - [BbBaseButton](./BbBaseButton.md) — Unstyled button/link primitive: element resolution (button/anchor/router link) and the full navigation engine, with no visual chrome. Use for any clickable or navigable surface that is not a variant-first BbButton — cards, list rows, custom links.
947
947
  - [BbDropdownButton](./BbDropdownButton.md) — A button with primary action and all other actions collected in a dropdown.
948
- - [BbDropdown](./BbDropdown.md) — Displays contextual action menus and menu content.
948
+ - [BbDropdown](./BbDropdown.md) — Displays contextual action menus and menu content (includes the co-located BbDropdownGroup export, which is how a selectable group is bound).
949
949
  - [BbConfirm](./BbConfirm.md) — Prompts users to confirm or cancel critical actions (includes co-located BbConfirmPortal export).
@@ -476,11 +476,12 @@ const toggleAll = (checked: boolean) => {
476
476
  two-token pattern like `"x xxxxxxx"` splits proportionally by token length —
477
477
  the first token sizes the **visually first** element, the second the other.
478
478
  - The box renders **before** the label by default — the conventional checkbox
479
- arrangement. Setting `reverse` swaps the label in front of the box. Known
480
- quirk: the prop is wired through an internal negation, so the layout is
481
- "reversed" by default and `:reverse="false"` is identical to omitting the
482
- prop treat `reverse` as a swap-order switch, not a boolean you can turn
483
- off.
479
+ arrangement. Setting `reverse` swaps the label in front of the box. It is an
480
+ ordinary opt-in boolean: unset and `:reverse="false"` both give box-first,
481
+ `reverse` gives label-first. (There _is_ an internal negation in the source,
482
+ but it exists to cancel `BbBaseInputContainer`'s own polarity, so it is
483
+ invisible from outside. Earlier revisions of this guide described that
484
+ negation as a consumer-facing quirk — it is not.)
484
485
  - `input-position` / `label-position` (`'left' | 'center' | 'right'`) align box
485
486
  and label text inside their columns — useful with percentage directions.
486
487
  - `hide-label` keeps the label for screen readers but hides it visually — only
@@ -522,8 +523,8 @@ input on mount — use sparingly.
522
523
  use `disabled` (see the readonly-vs-disabled section).
523
524
  - Unchecked boxes post nothing in classic forms; use `submit-when-false` when
524
525
  the backend expects an explicit "no".
525
- - `reverse` semantics are inverted internally (see Layout) don't rely on
526
- `:reverse="false"` doing anything.
526
+ - `reverse` is an opt-in, not a toggle you turn off: unset already means
527
+ box-first. Setting `:reverse="false"` is legal but says nothing.
527
528
  - `checked` + `v-model` together fight each other; pick one source of truth.
528
529
 
529
530
  ### Accessibility
@@ -449,7 +449,7 @@ enforcement can empty the array but never throws.
449
449
  Per-option, `#label` replaces an option's text (receives `{ item, text, checked }`)
450
450
  and `#icon` replaces the **entire box visual** for that option (you then own its
451
451
  checked/focus/error styling). `#legend` replaces the fieldset legend
452
- (`{ text, hasErrors }`). `#prepend` / `#append` inject content inside the options
452
+ (`{ text, hasErrors, hasWarning }`; the validated wrapper adds `showAsterisk`). `#prepend` / `#append` inject content inside the options
453
453
  container, before the first / after the last box.
454
454
 
455
455
  ### Events and focus
@@ -457,7 +457,8 @@ container, before the first / after the last box.
457
457
  `update:modelValue` (the `v-model` channel) carries the full array — it is the
458
458
  only source of selection truth. The native `blur`, `change`, `click`, `focus`,
459
459
  `input`, `keydown`, `mousedown`, `mouseup` events are re-emitted with their raw
460
- payloads, plus an `inactive` event when focus leaves the group; listen to those
460
+ payloads, plus the pair `active` (focus enters the group it is what drives
461
+ the hint's show/hide internally) and `inactive` (focus leaves); listen to those
461
462
  for analytics or side effects, never to compute selection yourself. `autofocus`
462
463
  focuses the first option on mount — use sparingly.
463
464
 
@@ -537,7 +538,7 @@ focuses the first option on mount — use sparingly.
537
538
  | `itemText` | `ItemAccessor<T, string> \| undefined` | | | Defines a path that returns a property of the object to use as text or a function that returns a string. |
538
539
  | `itemValue` | `ItemAccessor<T> \| undefined` | | | Defines a path that returns a property of the object to use as value or a function that returns any value. |
539
540
  | `legend` | `string` | | yes | Text content of the legend. |
540
- | `legendMode` | `"outside" \| "inside" \| undefined` | | | Legend rendering mode. `'outside'` renders the legend above the fieldset in the normal flow; `'inside'` overlays the legend inside the fieldset border. Floating mode is not supported for checkbox groups. |
541
+ | `legendMode` | `"outside" \| "inside" \| undefined` | | | Legend rendering mode. `'outside'` renders the legend above the fieldset in the normal flow; `'inside'` overlays the legend inside the fieldset border. Floating mode is not supported for option groups (checkbox, radio or switch) — there is … |
541
542
  | `legendPosition` | `"left" \| "center" \| "right" \| undefined` | | | Sets the text alignment of the label. |
542
543
  | `loadingText` | `string \| undefined` | | | String displayed while items are being loaded. |
543
544
  | `max` | `number \| undefined` | | | Maximum number of selected items. |
@@ -556,7 +557,7 @@ focuses the first option on mount — use sparingly.
556
557
 
557
558
  - `active` — `(e: "active"): void` — Emitted when the group becomes active (focus/click enters it).
558
559
  - `blur` — `(e: "blur", event: FocusEvent): void` — Emitted when one of the generated checkbox inputs loses focus. Forwards the original DOM `FocusEvent`.
559
- - `change` — `(e: "change", event: Event): void` — Emitted when a checkbox option is toggled. Forwards the original DOM `Event` from the checkbox input.
560
+ - `change` — `(e: "change", event: Event): void` — Emitted when an option is toggled. Forwards the original DOM `Event` from the checkbox input.
560
561
  - `click` — `(e: "click", event: MouseEvent): void` — Emitted when one of the generated checkbox inputs is clicked. Forwards the original DOM `MouseEvent`.
561
562
  - `focus` — `(e: "focus", event: FocusEvent): void` — Emitted when one of the generated checkbox inputs receives focus. Forwards the original DOM `FocusEvent`.
562
563
  - `inactive` — `(e: "inactive"): void` — Emitted when focus/click moves outside the group after it was active. Useful for validation-on-blur flows at group level.
@@ -27,7 +27,7 @@ Pick the neighbour that fits instead when you can:
27
27
  async panels, wizard steps) → **`BbSmoothHeight`** (`./BbSmoothHeight.md`) —
28
28
  it has no hidden state, it only animates height.
29
29
 
30
- The whole API: `modelValue` (required boolean), `eager`, `transition-duration`,
30
+ The whole API: `modelValue` (boolean, defaults `false`), `eager`, `transition-duration`,
31
31
  and one default slot. There are no events — see "You own the state" below.
32
32
 
33
33
  ### Advanced options in a form
@@ -124,13 +124,14 @@ const includeDrafts = ref(false);
124
124
 
125
125
  ### You own the state (one-way model)
126
126
 
127
- `modelValue` is a **required** prop and the component never writes it back:
127
+ `modelValue` is a **one-way** prop and the component never writes it back:
128
128
  `BbCollapsible` emits no events and has nothing to emit — it cannot close or
129
129
  open itself. `v-model` works purely as a prop binding; every change comes from
130
130
  your trigger. Two consequences:
131
131
 
132
- - Initialize the boolean explicitly (`const open = ref(false)`) `modelValue`
133
- is required, so leaving it `undefined` is a real omission and Vue warns.
132
+ - Initialize the boolean explicitly (`const open = ref(false)`). Omitting the
133
+ binding is legal it defaults to `false`, i.e. closed, and **nothing warns**
134
+ — so a forgotten `v-model` looks like a collapsible that will not open.
134
135
  - Don't listen for `update:modelValue` on it; put side effects on the trigger
135
136
  that flips the state.
136
137
 
@@ -405,8 +406,9 @@ const active = ref<DetailTab | null>('specs');
405
406
  `BbAccordion`, which wires all of it.
406
407
  - **Don't use it as a pure height animator** — if nothing is ever hidden,
407
408
  `BbSmoothHeight` is the right tool.
408
- - **Initialize the model** — `modelValue` is required with no default; an
409
- `undefined` binding warns in dev (it behaves as closed).
409
+ - **Initialize the model** — an omitted or `undefined` binding silently
410
+ behaves as closed and does **not** warn, so a missing `v-model` presents as
411
+ "the collapsible is broken" rather than as a mistake.
410
412
 
411
413
  ### Accessibility
412
414
 
@@ -423,8 +425,8 @@ const active = ref<DetailTab | null>('specs');
423
425
  | Prop | Type | Default | Required | Description |
424
426
  | --- | --- | --- | --- | --- |
425
427
  | `eager` | `boolean \| undefined` | | | Prevents rendering content before it's made visible. |
426
- | `modelValue` | `boolean` | `false` | yes | Used by v-model to trigger opening / closing the collapsible. |
427
- | `transitionDuration` | `number \| undefined` | `transitions.medium` | | How long the transition has to last in milliseconds |
428
+ | `modelValue` | `boolean \| undefined` | `false` | | Used by v-model to trigger opening / closing the collapsible. Optional, matching the runtime: `withDefaults` supplies `false`, so an omitted binding renders closed and Vue never warns. It was typed required while carrying that default, whic… |
429
+ | `transitionDuration` | `number \| undefined` | `250` | | How long the transition has to last in milliseconds |
428
430
 
429
431
  ## Events
430
432
 
@@ -53,6 +53,12 @@ prop), so always initialise it; `null` is the correct "no color yet" value.
53
53
  `null` renders an "empty" trigger (nothing painted) and is what you get when
54
54
  nothing is chosen yet.
55
55
 
56
+ **The palette never emits `null`** — every selection is a concrete hex — so
57
+ `null` is an _inbound_ value only. Once the user picks a colour there is no
58
+ built-in way back to empty: clearing is the consumer's job (set the model to
59
+ `null` yourself from a Clear button). Don't write an `update:modelValue`
60
+ handler that branches on `null`; that branch is dead code.
61
+
56
62
  The label manager below embraces the emit frequency instead of fighting it: the
57
63
  chip repaints on every drag frame (cheap — it's one style binding), while the
58
64
  _persistence_ is debounced behind a short timer, so only the trailing edge of a
@@ -608,7 +614,7 @@ styling (a caret, a highlight). Two props gate interaction:
608
614
  | `placement` | `Placement \| undefined` | | | Position of the overlay in respect to the related activator. |
609
615
  | `readonly` | `boolean \| undefined` | | | Prevent opening the palette while keeping the activator visible. |
610
616
  | `swatches` | `boolean \| string[][] \| undefined` | | | Controls swatches display in the picker: - `true` — show the built-in Material-palette swatches - `string[][]` — show custom swatches (each inner array = a column of shades) - `false` / omitted — no swatches section |
611
- | `transitionDuration` | `number \| undefined` | `transitions.medium` | | How long the transition has to last in milliseconds |
617
+ | `transitionDuration` | `number \| undefined` | `250` | | How long the transition has to last in milliseconds |
612
618
 
613
619
  ## Events
614
620
 
@@ -34,8 +34,12 @@ first — this is that gate.
34
34
  Mount `<BbConfirm />` **exactly once, at the app root** (`App.vue` under Vue,
35
35
  `app.vue` under Nuxt, the `createInertiaApp` render root under Inertia) — a
36
36
  single instance serves the whole app, and `confirm()` can then be called from
37
- anywhere, components and stores alike. Calls queue: if a dialog is open, the
38
- next message waits its turn. Mounting a second host renders every dialog twice
37
+ anywhere, components and stores alike. **Calls do not queue a new
38
+ `confirm()` supersedes the open one**, and the superseded promise settles
39
+ `false` (an implicit dismiss; no callback runs). So two `confirm()` calls in a
40
+ row show only the second, and the first silently answers "no". If you need both
41
+ questions asked, `await` the first before opening the second.
42
+ Mounting a second host renders every dialog twice
39
43
  (nothing warns you). Mounting none is worse: `await confirm(...)` never settles
40
44
  and the caller hangs.
41
45
 
@@ -376,7 +380,7 @@ the peek closes. For app-lifetime confirms that survive any unmount, call
376
380
  `useConfirm()` outside a component scope (app setup, a store, module level).
377
381
 
378
382
  `useConfirm()` also returns `dismissAll()` — an imperative escape hatch that
379
- quietly dismisses the open dialog and any queued ones regardless of owner, for
383
+ quietly dismisses the open dialog regardless of owner, for
380
384
  app-level events like logout or a global error boundary.
381
385
 
382
386
  The classic case for `persistent` is the unsaved-changes prompt: an accidental
@@ -638,8 +642,11 @@ standard footer and resolve from inside the slot with its `yes` / `no` helpers.
638
642
 
639
643
  ### Gotchas and anti-patterns
640
644
 
641
- - **Don't hand-build a yes/no dialog** out of `BbDialog` + buttons — queueing,
642
- busy states, dismissal semantics and focus handling already live here.
645
+ - **Don't hand-build a yes/no dialog** out of `BbDialog` + buttons — busy
646
+ states, dismissal semantics, ownership and focus handling already live here.
647
+ - **Don't fire two `confirm()` calls without awaiting the first.** The second
648
+ supersedes the first, which settles `false` — so a "delete these two things"
649
+ flow written as two un-awaited confirms deletes nothing and asks once.
643
650
  - **Don't forget the `await`** — `confirm(...)` without it never gates
644
651
  anything.
645
652
  - **Don't call `close()` to "cancel"** a dialog whose buttons haven't run —
@@ -281,7 +281,7 @@ and digit typeahead; the time rail exposes labelled columns. Always pass a
281
281
  | `selectable` | `((date: string) => boolean) \| undefined` | | | Predicate invoked per candidate; return `false` to disable it. Receives the value in this `type`'s shape — `YYYY-MM` under `month`, `YYYY` under `year`. |
282
282
  | `step` | `number \| undefined` | | | Minute-column granularity and arrow stepping (requires `type="datetime"`). |
283
283
  | `time` | `string \| string[] \| null \| undefined` | | | Companion time model (`v-model:time`), 24-hour `HH:mm` / `HH:mm:ss`. With `floating` it is the only carrier of the time; otherwise it mirrors the time inside `modelValue`. Requires `type="datetime"`. |
284
- | `transitionDuration` | `number \| undefined` | `transitions.medium` | | Popover/sheet transition duration in milliseconds. |
284
+ | `transitionDuration` | `number \| undefined` | `250` | | Popover/sheet transition duration in milliseconds. |
285
285
  | `type` | `DatePickerType \| undefined` | `"date"` | | What the picker selects, and therefore what it emits. - `date` (default) — a day. - `datetime` — a day plus a time rail beside the calendar. Non-floating values carry the time inside `modelValue`; with `floating` the time travels only throu… |
286
286
  | `utc` | `boolean \| undefined` | | | Emit UTC (`...Z`) instead of the local offset. Ignored with `floating`, and therefore with `type="month"`/`type="year"`. |
287
287
 
@@ -355,10 +355,13 @@ Every dismissal path is governed by two props:
355
355
  - `disabled` — same guard, different intent: the surface is busy (a save in
356
356
  flight). Combine with disabling your footer actions.
357
357
 
358
- Constraint: the header **close button bypasses both** it always closes,
359
- regardless of `persistent`/`disabled`. When a dialog truly must be resolved from
360
- the footer, pair `persistent` with `hide-close`, and keep a visible Cancel so
361
- users are never trapped.
358
+ The header **close button bypasses `persistent`, but respects `disabled`**
359
+ (`BbDialog.vue:471-477`): while `disabled` is set the × plays the same deny
360
+ nudge as the backdrop and does not close. So for the common case — a dialog
361
+ that must stay put while a save is in flight — `disabled` alone is enough and
362
+ you keep the ×. Reach for `hide-close` only when the dialog must be resolved
363
+ from the footer _permanently_; pair it with `persistent` and keep a visible
364
+ Cancel so users are never trapped.
362
365
 
363
366
  Backdrop clicks are drag-protected: a text selection that starts inside the
364
367
  dialog and releases over the backdrop does not close it — only a genuine click
@@ -779,12 +782,12 @@ default falls back to `config.adaptive`.
779
782
  | `fullscreen` | `boolean \| "mobile" \| undefined` | | | Display the dialog fullscreen. Use `'mobile'` to restrict fullscreen to small devices. |
780
783
  | `hideClose` | `boolean \| undefined` | | | Hide the default close (×) button. The button is shown by default; set this to remove it (e.g. for a `persistent` dialog you don't want dismissible — the × otherwise still closes a persistent dialog). |
781
784
  | `modelValue` | `boolean \| undefined` | `false` | | Used by v-model to open / close the dialog. A dialog with no `v-model` starts closed. |
782
- | `offCanvasProps` | `Partial<BbOffCanvasProps> \| undefined` | | | Overrides merged over the offcanvas (mobile) surface's props. The drawer defaults to a bottom, draggable, content-sized sheet (`direction: 'bottom'`, `draggable: true`, `size: 'auto'`); use this to override those, set other drawer-only opti… |
785
+ | `offCanvasProps` | `Partial<BbOffCanvasProps> \| undefined` | | | Overrides merged over the offcanvas (mobile) surface's props. The drawer defaults to a bottom, draggable, content-sized sheet (`side: 'bottom'`, `draggable: true`, `size: 'auto'`); use this to override those, set other drawer-only options (… |
783
786
  | `persistent` | `boolean \| undefined` | | | Prevent closing via outside clicks or Escape key. The header close (×) button STILL closes a persistent dialog — that is the documented escape hatch; combine with `hideClose` to remove it, or use `disabled` to block every dismissal. Program… |
784
787
  | `size` | `Responsive<NonNullable<number \| ({ size?: any; } & string) \| keyof Sizes \| undefined>> \| undefined` | `"sm"` | | Controls the maximum width of the dialog. Accepts named presets from `'xs'` to `'2xl'`, a custom CSS width string, or a numeric pixel value — or a per-breakpoint map (e.g. `{ default: 'sm', lg: 'lg' }`) to switch width responsively. |
785
788
  | `stack` | `string \| undefined` | | | Name of the stack this dialog belongs to. Dialogs sharing the same `stack` value replace one another: only the most recently opened stays visible while the others in the stack are hidden beneath it. Dialogs in different stacks — or with no … |
786
789
  | `title` | `string \| undefined` | | | Title text announced to assistive technologies. If omitted, no header is rendered (unless a `header` slot is supplied) and accessibility must be handled manually. |
787
- | `transitionDuration` | `number \| undefined` | `transitions.medium` | | Controls the duration of the open and close animations. |
790
+ | `transitionDuration` | `number \| undefined` | `250` | | Controls the duration of the open and close animations. |
788
791
 
789
792
  ## Events
790
793