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

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 (350) hide show
  1. package/README.md +72 -33
  2. package/dist/ai/BbAccordion.md +3 -3
  3. package/dist/ai/BbAlert.md +9 -5
  4. package/dist/ai/BbAsterisk.md +17 -0
  5. package/dist/ai/BbAvatar.md +12 -3
  6. package/dist/ai/BbBadge.md +15 -10
  7. package/dist/ai/BbBadgeButton.md +16 -16
  8. package/dist/ai/BbBaseButton.md +16 -16
  9. package/dist/ai/BbBaseCheckbox.md +8 -8
  10. package/dist/ai/BbBaseCheckboxGroup.md +13 -13
  11. package/dist/ai/BbBaseCheckboxIcon.md +26 -9
  12. package/dist/ai/BbBaseColorInput.md +11 -11
  13. package/dist/ai/BbBaseDatePicker.md +6 -6
  14. package/dist/ai/BbBaseDatePickerInput.md +15 -15
  15. package/dist/ai/BbBaseInputContainer.md +12 -12
  16. package/dist/ai/BbBaseNumberInput.md +8 -8
  17. package/dist/ai/BbBaseRadio.md +5 -5
  18. package/dist/ai/BbBaseRadioGroup.md +7 -7
  19. package/dist/ai/BbBaseRadioIcon.md +25 -9
  20. package/dist/ai/BbBaseRating.md +5 -5
  21. package/dist/ai/BbBaseSelect.md +22 -21
  22. package/dist/ai/BbBaseSlider.md +9 -9
  23. package/dist/ai/BbBaseSwitch.md +8 -8
  24. package/dist/ai/BbBaseSwitchGroup.md +13 -13
  25. package/dist/ai/BbBaseSwitchIcon.md +28 -10
  26. package/dist/ai/BbBaseTag.md +10 -10
  27. package/dist/ai/BbBaseTextInput.md +9 -9
  28. package/dist/ai/BbBaseTextarea.md +9 -9
  29. package/dist/ai/BbBaseTimePickerInput.md +13 -13
  30. package/dist/ai/BbBreadcrumbs.md +2 -2
  31. package/dist/ai/BbButton.md +15 -15
  32. package/dist/ai/BbCheckbox.md +18 -17
  33. package/dist/ai/BbCheckboxGroup.md +15 -14
  34. package/dist/ai/BbCollapsible.md +11 -9
  35. package/dist/ai/BbColorInput.md +15 -15
  36. package/dist/ai/BbColorPalette.md +12 -6
  37. package/dist/ai/BbConfirm.md +12 -5
  38. package/dist/ai/BbDatePicker.md +13 -13
  39. package/dist/ai/BbDatePickerInput.md +20 -20
  40. package/dist/ai/BbDialog.md +78 -12
  41. package/dist/ai/BbDropdown.md +132 -22
  42. package/dist/ai/BbDropdownButton.md +12 -12
  43. package/dist/ai/BbDropdownGroup.md +1 -1
  44. package/dist/ai/BbDropzone.md +4 -4
  45. package/dist/ai/BbForm.md +49 -14
  46. package/dist/ai/BbIcon.md +6 -0
  47. package/dist/ai/BbIndicator.md +5 -5
  48. package/dist/ai/BbNumberInput.md +11 -11
  49. package/dist/ai/BbOffCanvas.md +90 -20
  50. package/dist/ai/BbPagination.md +3 -3
  51. package/dist/ai/BbPopover.md +32 -17
  52. package/dist/ai/BbProgress.md +7 -4
  53. package/dist/ai/BbRadio.md +16 -15
  54. package/dist/ai/BbRadioGroup.md +20 -17
  55. package/dist/ai/BbRating.md +11 -11
  56. package/dist/ai/BbSelect.md +138 -37
  57. package/dist/ai/BbSelectPopover.md +40 -41
  58. package/dist/ai/BbSlider.md +37 -22
  59. package/dist/ai/BbSmoothHeight.md +1 -1
  60. package/dist/ai/BbSwitch.md +25 -10
  61. package/dist/ai/BbSwitchGroup.md +17 -14
  62. package/dist/ai/BbTable.md +920 -109
  63. package/dist/ai/BbTabs.md +28 -14
  64. package/dist/ai/BbTabsList.md +1 -1
  65. package/dist/ai/BbTabsPanes.md +1 -1
  66. package/dist/ai/BbTabsRoot.md +10 -10
  67. package/dist/ai/BbTag.md +14 -14
  68. package/dist/ai/BbTextInput.md +16 -15
  69. package/dist/ai/BbTextarea.md +13 -13
  70. package/dist/ai/BbTimePicker.md +10 -10
  71. package/dist/ai/BbTimePickerInput.md +17 -17
  72. package/dist/ai/BbToast.md +1 -1
  73. package/dist/ai/BbToastPortal.md +1 -1
  74. package/dist/ai/BbTooltip.md +12 -10
  75. package/dist/ai/BbTree.md +1 -1
  76. package/dist/ai/ChipsBox.md +1 -1
  77. package/dist/ai/CommonInputWrapper.md +10 -10
  78. package/dist/ai/CommonPopover.md +6 -6
  79. package/dist/ai/FlatListBox.md +5 -5
  80. package/dist/ai/GroupedListBox.md +5 -5
  81. package/dist/ai/ListBox.md +4 -4
  82. package/dist/ai/OptionsContainer.md +4 -4
  83. package/dist/ai/changelog.json +128 -2
  84. package/dist/ai/components.json +917 -100
  85. package/dist/ai/composables/useBbConfig.md +72 -11
  86. package/dist/ai/composables/useConfirm.md +5 -3
  87. package/dist/ai/guides/ai-router.md +9 -4
  88. package/dist/ai/guides/component-picker.md +18 -18
  89. package/dist/ai/guides/design-language.md +14 -14
  90. package/dist/ai/guides/design-tokens.md +25 -18
  91. package/dist/ai/guides/fetch-items-playbook.md +1 -1
  92. package/dist/ai/guides/icons-policy.md +11 -5
  93. package/dist/ai/guides/installation-and-plugin-setup.md +85 -23
  94. package/dist/ai/guides/migration/components/bb-checkbox-group.md +30 -0
  95. package/dist/ai/guides/migration/components/bb-checkbox.md +37 -3
  96. package/dist/ai/guides/migration/components/bb-collapsible.md +5 -5
  97. package/dist/ai/guides/migration/components/bb-dialog.md +62 -34
  98. package/dist/ai/guides/migration/components/bb-offcanvas.md +29 -13
  99. package/dist/ai/guides/migration/components/bb-rating.md +8 -2
  100. package/dist/ai/guides/migration/components/bb-select.md +5 -2
  101. package/dist/ai/guides/migration/components/bb-table.md +560 -28
  102. package/dist/ai/guides/migration/components/bb-text-input.md +6 -6
  103. package/dist/ai/guides/migration/v2-to-v3.md +260 -89
  104. package/dist/ai/guides/ssr-prefill.md +120 -0
  105. package/dist/ai/index.md +10 -9
  106. package/dist/ai/recipes/inertia/approvals-inbox.md +0 -1
  107. package/dist/ai/recipes/inertia/inline-edit-workspace.md +0 -1
  108. package/dist/ai/recipes/inertia/layout-scaffold.md +5 -1
  109. package/dist/ai/recipes/inertia/ownership-atlas.md +49 -29
  110. package/dist/ai/recipes/inertia/record-form.md +0 -1
  111. package/dist/ai/recipes/inertia/records-workspace.md +26 -8
  112. package/dist/ai/recipes/inertia/upload-center.md +0 -1
  113. package/dist/ai/recipes/nuxt/approvals-inbox.md +0 -1
  114. package/dist/ai/recipes/nuxt/inline-edit-workspace.md +0 -1
  115. package/dist/ai/recipes/nuxt/layout-scaffold.md +5 -1
  116. package/dist/ai/recipes/nuxt/record-form.md +0 -1
  117. package/dist/ai/recipes/nuxt/records-workspace.md +26 -8
  118. package/dist/ai/recipes/nuxt/upload-center.md +0 -1
  119. package/dist/ai/recipes/vue/approvals-inbox.md +0 -1
  120. package/dist/ai/recipes/vue/inline-edit-workspace.md +0 -1
  121. package/dist/ai/recipes/vue/layout-scaffold.md +5 -1
  122. package/dist/ai/recipes/vue/records-workspace.md +26 -8
  123. package/dist/ai/recipes/vue/upload-center.md +0 -1
  124. package/dist/ai/source/BbAlert.md +60 -2
  125. package/dist/ai/source/BbAvatar.md +3 -3
  126. package/dist/ai/source/BbBadge.md +60 -15
  127. package/dist/ai/source/BbBadgeButton.md +8 -2
  128. package/dist/ai/source/BbBaseButton.md +3 -1
  129. package/dist/ai/source/BbBaseCheckboxGroup.md +6 -2
  130. package/dist/ai/source/BbBaseDatePicker.md +3 -1
  131. package/dist/ai/source/BbBaseDatePickerInput.md +5 -1
  132. package/dist/ai/source/BbBaseInputContainer.md +52 -1
  133. package/dist/ai/source/BbBaseRadioGroup.md +4 -0
  134. package/dist/ai/source/BbBaseRating.md +3 -1
  135. package/dist/ai/source/BbBaseSelect.md +71 -16
  136. package/dist/ai/source/BbBaseSwitchGroup.md +4 -0
  137. package/dist/ai/source/BbBaseTimePickerInput.md +5 -1
  138. package/dist/ai/source/BbBreadcrumbs.md +31 -0
  139. package/dist/ai/source/BbButton.md +51 -24
  140. package/dist/ai/source/BbCheckbox.md +15 -1
  141. package/dist/ai/source/BbCheckboxGroup.md +2 -1
  142. package/dist/ai/source/BbCollapsible.md +7 -1
  143. package/dist/ai/source/BbColorInput.md +3 -4
  144. package/dist/ai/source/BbColorPalette.md +3 -4
  145. package/dist/ai/source/BbDatePicker.md +5 -1
  146. package/dist/ai/source/BbDatePickerInput.md +5 -1
  147. package/dist/ai/source/BbDialog.md +175 -19
  148. package/dist/ai/source/BbDropdown.md +376 -69
  149. package/dist/ai/source/BbDropdownGroup.md +330 -59
  150. package/dist/ai/source/BbForm.md +93 -5
  151. package/dist/ai/source/BbIcon.md +46 -36
  152. package/dist/ai/source/BbNumberInput.md +3 -4
  153. package/dist/ai/source/BbOffCanvas.md +474 -194
  154. package/dist/ai/source/BbPopover.md +24 -17
  155. package/dist/ai/source/BbProgress.md +2 -2
  156. package/dist/ai/source/BbRadio.md +15 -1
  157. package/dist/ai/source/BbRadioGroup.md +3 -1
  158. package/dist/ai/source/BbSelect.md +50 -2
  159. package/dist/ai/source/BbSelectPopover.md +171 -23
  160. package/dist/ai/source/BbSlider.md +3 -4
  161. package/dist/ai/source/BbSwitch.md +15 -1
  162. package/dist/ai/source/BbSwitchGroup.md +8 -5
  163. package/dist/ai/source/BbTable.md +5092 -1446
  164. package/dist/ai/source/BbTabs.md +6 -7
  165. package/dist/ai/source/BbTabsList.md +6 -7
  166. package/dist/ai/source/BbTabsPanes.md +6 -7
  167. package/dist/ai/source/BbTabsRoot.md +6 -7
  168. package/dist/ai/source/BbTag.md +3 -4
  169. package/dist/ai/source/BbTextInput.md +3 -4
  170. package/dist/ai/source/BbTextarea.md +3 -4
  171. package/dist/ai/source/BbTimePicker.md +4 -1
  172. package/dist/ai/source/BbTimePickerInput.md +5 -1
  173. package/dist/ai/source/BbToast.md +3 -1
  174. package/dist/ai/source/BbTooltip.md +5 -1
  175. package/dist/ai/source/CommonInputWrapper.md +4 -0
  176. package/dist/ai/source/CommonPopover.md +6 -0
  177. package/dist/ai/source/FlatListBox.md +11 -5
  178. package/dist/ai/source/GroupedListBox.md +7 -5
  179. package/dist/components/BbAlert/BbAlert.vue_vue_type_script_setup_true_lang.js +4 -4
  180. package/dist/components/BbAlert/types.d.ts +10 -1
  181. package/dist/components/BbAvatar/BbAvatar.vue.d.ts +1 -1
  182. package/dist/components/BbAvatar/BbAvatar.vue_vue_type_script_setup_true_lang.js +33 -33
  183. package/dist/components/BbBadge/BadgeBodyContent.vue_vue_type_script_setup_true_lang.js +22 -16
  184. package/dist/components/BbBadge/BbBadge.vue_vue_type_script_setup_true_lang.js +36 -15
  185. package/dist/components/BbBadge/badgeButtonContext.d.ts +21 -8
  186. package/dist/components/BbBadge/types.d.ts +8 -2
  187. package/dist/components/BbBaseButton/BbBaseButton.vue_vue_type_script_setup_true_lang.js +47 -47
  188. package/dist/components/BbBaseButton/RouterComponent.vue_vue_type_script_setup_true_lang.js +14 -14
  189. package/dist/components/BbBaseCheckboxGroup/BbBaseCheckboxGroup.vue_vue_type_script_setup_true_lang.js +30 -28
  190. package/dist/components/BbBaseCheckboxGroup/types.d.ts +2 -2
  191. package/dist/components/BbBaseDatePicker/BbBaseDatePicker.vue_vue_type_script_setup_true_lang.js +167 -167
  192. package/dist/components/BbBaseDatePicker/BbBaseDatePickerInputDaySelector.vue.d.ts +9 -9
  193. package/dist/components/BbBaseDatePicker/BbBaseDatePickerInputDaySelector.vue_vue_type_script_setup_true_lang.js +78 -78
  194. package/dist/components/BbBaseDatePicker/BbBaseDatePickerMonthSelector.vue_vue_type_script_setup_true_lang.js +64 -64
  195. package/dist/components/BbBaseDatePickerInput/BbBaseDatePickerInput.vue.d.ts +1 -1
  196. package/dist/components/BbBaseDatePickerInput/BbBaseDatePickerInput.vue_vue_type_script_setup_true_lang.js +138 -138
  197. package/dist/components/BbBaseInputContainer/BbBaseInputContainer.vue_vue_type_script_setup_true_lang.js +2 -2
  198. package/dist/components/BbBaseRadioGroup/BbBaseRadioGroup.vue_vue_type_script_setup_true_lang.js +24 -22
  199. package/dist/components/BbBaseRating/BbBaseRating.vue_vue_type_script_setup_true_lang.js +40 -40
  200. package/dist/components/BbBaseSelect/BbBaseSelect.vue_vue_type_script_setup_true_lang.js +74 -65
  201. package/dist/components/BbBaseSelect/types.d.ts +22 -0
  202. package/dist/components/BbBaseSlider/BbBaseSlider.vue_vue_type_script_setup_true_lang.js +5 -5
  203. package/dist/components/BbBaseSwitchGroup/BbBaseSwitchGroup.vue_vue_type_script_setup_true_lang.js +30 -28
  204. package/dist/components/BbBaseTimePickerInput/BbBaseTimePickerInput.vue.d.ts +1 -1
  205. package/dist/components/BbBaseTimePickerInput/BbBaseTimePickerInput.vue_vue_type_script_setup_true_lang.js +104 -104
  206. package/dist/components/BbBreadcrumbs/BbBreadcrumbs.vue_vue_type_script_setup_true_lang.js +35 -35
  207. package/dist/components/BbButton/BbButton.vue_vue_type_script_setup_true_lang.js +85 -81
  208. package/dist/components/BbCheckboxGroup/types.d.ts +2 -1
  209. package/dist/components/BbCollapsible/types.d.ts +7 -1
  210. package/dist/components/BbColorInput/BbColorInput.vue.d.ts +1 -1
  211. package/dist/components/BbColorInput/BbColorInput.vue_vue_type_script_setup_true_lang.js +18 -18
  212. package/dist/components/BbColorPalette/BbColorPalette.vue.d.ts +2 -2
  213. package/dist/components/BbColorPalette/BbColorPalette.vue_vue_type_script_setup_true_lang.js +50 -50
  214. package/dist/components/BbConfirm/BbConfirm.vue_vue_type_script_setup_true_lang.js +17 -17
  215. package/dist/components/BbDatePicker/BbDatePicker.vue.d.ts +1 -1
  216. package/dist/components/BbDatePicker/BbDatePicker.vue_vue_type_script_setup_true_lang.js +100 -100
  217. package/dist/components/BbDatePickerInput/BbDatePickerInput.vue_vue_type_script_setup_true_lang.js +21 -21
  218. package/dist/components/BbDialog/BbDialog.vue.d.ts +1 -1
  219. package/dist/components/BbDialog/BbDialog.vue_vue_type_script_setup_true_lang.js +133 -107
  220. package/dist/components/BbDialog/types.d.ts +29 -2
  221. package/dist/components/BbDropdown/AdaptiveDropdown.vue.d.ts +2 -0
  222. package/dist/components/BbDropdown/AdaptiveDropdown.vue_vue_type_script_setup_true_lang.js +99 -100
  223. package/dist/components/BbDropdown/BbDropdown.vue.d.ts +2 -2
  224. package/dist/components/BbDropdown/BbDropdown.vue_vue_type_script_setup_true_lang.js +208 -201
  225. package/dist/components/BbDropdown/BbDropdownList.vue_vue_type_script_setup_true_lang.js +225 -208
  226. package/dist/components/BbDropdown/DropdownPipelineResolver.vue_vue_type_script_setup_true_lang.js +21 -21
  227. package/dist/components/BbDropdown/types.d.ts +20 -5
  228. package/dist/components/BbDropdownButton/BbDropdownButton.vue_vue_type_script_setup_true_lang.js +5 -5
  229. package/dist/components/BbIcon/BbIcon.vue_vue_type_script_setup_true_lang.js +46 -46
  230. package/dist/components/BbIcon/iconCache.d.ts +33 -0
  231. package/dist/components/BbIcon/iconCache.js +17 -0
  232. package/dist/components/BbNumberInput/BbNumberInput.vue.d.ts +1 -1
  233. package/dist/components/BbNumberInput/BbNumberInput.vue_vue_type_script_setup_true_lang.js +15 -15
  234. package/dist/components/BbOffCanvas/BbOffCanvas.vue.d.ts +1 -1
  235. package/dist/components/BbOffCanvas/BbOffCanvas.vue_vue_type_script_setup_true_lang.js +254 -208
  236. package/dist/components/BbOffCanvas/types.d.ts +30 -5
  237. package/dist/components/BbPagination/BbPagination.vue.d.ts +1 -1
  238. package/dist/components/BbPopover/BbPopover.vue.d.ts +2 -2
  239. package/dist/components/BbPopover/BbPopover.vue_vue_type_script_setup_true_lang.js +149 -146
  240. package/dist/components/BbPopover/types.d.ts +3 -2
  241. package/dist/components/BbRadioGroup/types.d.ts +3 -1
  242. package/dist/components/BbSelect/BbSelect.vue_vue_type_script_setup_true_lang.js +27 -23
  243. package/dist/components/BbSelect/types.d.ts +32 -0
  244. package/dist/components/BbSelectPopover/BbSelectPopover.vue_vue_type_script_setup_true_lang.js +221 -213
  245. package/dist/components/BbSlider/BbSlider.vue.d.ts +1 -1
  246. package/dist/components/BbSlider/BbSlider.vue_vue_type_script_setup_true_lang.js +20 -20
  247. package/dist/components/BbTable/BbTable.vue.d.ts +10 -4
  248. package/dist/components/BbTable/BbTable.vue_vue_type_script_setup_true_lang.js +1433 -600
  249. package/dist/components/BbTable/BbTableDataRow.d.ts +162 -0
  250. package/dist/components/BbTable/BbTableDataRow.js +136 -0
  251. package/dist/components/BbTable/BbTableExpandRow.d.ts +73 -0
  252. package/dist/components/BbTable/BbTableExpandRow.js +52 -0
  253. package/dist/components/BbTable/types.d.ts +324 -111
  254. package/dist/components/BbTable/utils.d.ts +92 -4
  255. package/dist/components/BbTable/utils.js +71 -36
  256. package/dist/components/BbTabs/types.d.ts +0 -8
  257. package/dist/components/BbTag/BbTag.vue.d.ts +1 -1
  258. package/dist/components/BbTag/BbTag.vue_vue_type_script_setup_true_lang.js +18 -18
  259. package/dist/components/BbTextInput/BbTextInput.vue.d.ts +1 -1
  260. package/dist/components/BbTextInput/BbTextInput.vue_vue_type_script_setup_true_lang.js +18 -18
  261. package/dist/components/BbTextarea/BbTextarea.vue.d.ts +1 -1
  262. package/dist/components/BbTextarea/BbTextarea.vue_vue_type_script_setup_true_lang.js +54 -54
  263. package/dist/components/BbTimePicker/BbTimePicker.vue.d.ts +1 -1
  264. package/dist/components/BbTimePicker/BbTimePicker.vue_vue_type_script_setup_true_lang.js +80 -80
  265. package/dist/components/BbTimePickerInput/BbTimePickerInput.vue_vue_type_script_setup_true_lang.js +61 -61
  266. package/dist/components/BbToast/BbToast.vue_vue_type_script_setup_true_lang.js +17 -17
  267. package/dist/components/BbToast/BbToastMessage.vue_vue_type_script_setup_true_lang.js +13 -13
  268. package/dist/components/BbTooltip/types.d.ts +5 -1
  269. package/dist/components/ChipsBox/ChipsBox.vue_vue_type_script_setup_true_lang.js +17 -17
  270. package/dist/components/ClearableButton/ClearableButton.vue_vue_type_script_setup_true_lang.js +5 -5
  271. package/dist/components/CommonPopover/CommonPopover.vue_vue_type_script_setup_true_lang.js +2 -1
  272. package/dist/components/FlatListBox/FlatListBox.vue_vue_type_script_setup_true_lang.js +83 -83
  273. package/dist/components/GroupedListBox/GroupedListBox.vue_vue_type_script_setup_true_lang.js +56 -56
  274. package/dist/composables/useBaseOptions.js +30 -20
  275. package/dist/composables/useBbConfig.d.ts +27 -6
  276. package/dist/composables/useBbConfig.js +8 -2
  277. package/dist/composables/useConfig.d.ts +59 -0
  278. package/dist/composables/useConfig.js +9 -0
  279. package/dist/composables/useItemsGetter.d.ts +11 -0
  280. package/dist/composables/useItemsGetter.js +44 -18
  281. package/dist/composables/useLocale.js +10 -7
  282. package/dist/composables/useMobile.js +5 -5
  283. package/dist/composables/usePrefill.d.ts +21 -2
  284. package/dist/composables/usePrefill.js +25 -19
  285. package/dist/composables/useSsrState.d.ts +20 -0
  286. package/dist/composables/useSsrState.js +13 -0
  287. package/dist/composables/useTableWidthContext.d.ts +24 -4
  288. package/dist/composables/useTableWidthContext.js +31 -28
  289. package/dist/composables/useToast.js +5 -5
  290. package/dist/deprecation/ai-deprecations.json.d.ts +121 -11
  291. package/dist/deprecation/ai-deprecations.json.js +1 -1
  292. package/dist/directives/bbDropdown.d.ts +15 -4
  293. package/dist/directives/bbDropdown.js +31 -9
  294. package/dist/directives/createPopoverDirective.d.ts +62 -0
  295. package/dist/directives/createPopoverDirective.js +63 -23
  296. package/dist/i18n/locales/cs.json +4 -1
  297. package/dist/i18n/locales/da.json +4 -1
  298. package/dist/i18n/locales/de.json +4 -1
  299. package/dist/i18n/locales/el.json +4 -1
  300. package/dist/i18n/locales/en.json +4 -1
  301. package/dist/i18n/locales/es.json +4 -1
  302. package/dist/i18n/locales/fi.json +4 -1
  303. package/dist/i18n/locales/fr.json +4 -1
  304. package/dist/i18n/locales/hu.json +4 -1
  305. package/dist/i18n/locales/it.json +4 -1
  306. package/dist/i18n/locales/ja.json +4 -1
  307. package/dist/i18n/locales/ko.json +4 -1
  308. package/dist/i18n/locales/nb.json +4 -1
  309. package/dist/i18n/locales/nl.json +4 -1
  310. package/dist/i18n/locales/pl.json +4 -1
  311. package/dist/i18n/locales/pt.json +4 -1
  312. package/dist/i18n/locales/ro.json +4 -1
  313. package/dist/i18n/locales/ru.json +4 -1
  314. package/dist/i18n/locales/sv.json +4 -1
  315. package/dist/i18n/locales/tr.json +4 -1
  316. package/dist/i18n/locales/uk.json +4 -1
  317. package/dist/i18n/locales/zh-cn.json +4 -1
  318. package/dist/index.d.ts +7 -2
  319. package/dist/index.js +69 -67
  320. package/dist/llms-full.txt +3997 -1458
  321. package/dist/llms-medium.txt +140 -73
  322. package/dist/llms.txt +7 -6
  323. package/dist/locale-blueprint.json +4 -1
  324. package/dist/nuxt-auto-imports.d.ts +100 -0
  325. package/dist/nuxt-auto-imports.js +55 -0
  326. package/dist/nuxt-module.d.ts +22 -1
  327. package/dist/nuxt.js +22 -8
  328. package/dist/plugin.d.ts +10 -1
  329. package/dist/plugin.js +20 -19
  330. package/dist/runtime/nuxt-plugin.js +28 -21
  331. package/dist/styles.css +1 -1
  332. package/dist/utilities/misc/listboxMetrics.d.ts +3 -3
  333. package/dist/utilities/misc/listboxMetrics.js +2 -2
  334. package/dist/utilities/misc/ssrStateInjectionKey.d.ts +42 -0
  335. package/dist/utilities/misc/ssrStateInjectionKey.js +4 -0
  336. package/dist/validated/BbForm.vue_vue_type_script_setup_true_lang.js +45 -27
  337. package/dist/validated/BbSelect.vue.d.ts +2 -0
  338. package/dist/validated/BbSelect.vue_vue_type_script_setup_true_lang.js +1 -0
  339. package/dist/validated/useValidatedField.js +25 -23
  340. package/dist/vite.js +7 -3
  341. package/llms.txt +8 -7
  342. package/package.json +2 -2
  343. package/scripts/lib/eslint-plugin.d.ts +19 -1
  344. package/scripts/lib/eslint-plugin.mjs +155 -14
  345. package/scripts/lib/html-attributes.mjs +91 -0
  346. package/scripts/lib/validate-bb-markup.mjs +59 -11
  347. package/dist/assets/svgs/sort.svg_raw.js +0 -4
  348. package/dist/components/BbBadge/BadgeAppendIcon.vue.d.ts +0 -3
  349. package/dist/components/BbBadge/BadgeAppendIcon.vue.js +0 -5
  350. package/dist/components/BbBadge/BadgeAppendIcon.vue_vue_type_script_setup_true_lang.js +0 -22
@@ -128,9 +128,13 @@ markup needed:
128
128
  the field never shows amber while it has an error.
129
129
  - **Form participation**: `name` renders hidden inputs carrying the selection
130
130
  (one per value; non-string values are JSON-stringified), so the select posts
131
- in a plain HTML form; `required` adds a visually-hidden sentinel input so
132
- native constraint validation fires. `autocomplete` / `autofocus` forward to
133
- the control.
131
+ in a plain HTML form. **`required` does NOT give you native constraint
132
+ validation**: the HTML spec bars `required` on `input[type=hidden]` from
133
+ constraint validation, so the browser will never block submission on an empty
134
+ select (`BbBaseSelect.vue:432` says so in its own comment). `required` is kept
135
+ for form introspection and for the asterisk. Gate submission with `errors` /
136
+ `has-errors`, or with the validated entrypoint. `autocomplete` / `autofocus`
137
+ forward to the control.
134
138
  - **Affixes**: `prepend:icon` / `append:icon` place icons in the control —
135
139
  `append:icon` replaces the default chevron (there is no `#chevron` slot).
136
140
  - **Value display**: `placeholder` shows when a _single-mode_ select is empty.
@@ -609,8 +613,10 @@ later responses don't include them — no need to merge them into every response
609
613
  `prefill` controls **when the first load happens**:
610
614
 
611
615
  - `'interaction'` (default) — on the first open.
612
- - `true` — immediately on mount, and during SSR (`onServerPrefetch`), so the
613
- panel is warm on hydration.
616
+ - `true` — immediately on mount, and during SSR **on hosts that can carry the
617
+ result to the client** (Nuxt does; see
618
+ [SSR prefill](./guides/ssr-prefill.md)), so the panel is warm on hydration.
619
+ Everywhere else the load happens on the client, right after mount.
614
620
  - `false` — **search-first**: nothing loads until the user types. Opening is not
615
621
  a search, so the panel opens empty and shows a _"search to begin"_ hint until
616
622
  the first query. Use it when the result set is too big or too costly to browse
@@ -1068,10 +1074,12 @@ const role = ref<string | null>(null);
1068
1074
 
1069
1075
  ### Custom option rows
1070
1076
 
1071
- The `#option` slot replaces the default row rendering — use it for avatars,
1072
- secondary text or metadata. It exposes the raw `item`, the resolved `text` and
1073
- `value`, plus `selected` / `focused` / `disabled` / `loading` / `hasErrors`
1074
- flags and the row `index`. Rows are fixed-height (the list is virtualized): if
1077
+ The `#option` slot replaces the row's **text** — use it for avatars, secondary
1078
+ text or metadata. It exposes the raw `item`, the resolved `text` and `value`,
1079
+ plus `selected` / `focused` / `disabled` / `loading` / `hasErrors` flags and the
1080
+ row `index`. The selection check is not yours to redraw: it renders outside the
1081
+ slot, so a custom row keeps it (`selected` is there for rows that want to show
1082
+ the state some _other_ way, not for drawing a second check). Rows are fixed-height (the list is virtualized): if
1075
1083
  your markup is taller than the default 28px (24px compact; 44px / 36px inside
1076
1084
  the adaptive sheet), set `item-height` to match — and `header-height` for
1077
1085
  grouped headers (defaults 32px / 24px compact; 36px / 32px in the sheet). The
@@ -1148,11 +1156,91 @@ const assignee = ref<string | null>(null);
1148
1156
  </script>
1149
1157
  ```
1150
1158
 
1159
+ ### Custom chips
1160
+
1161
+ In `multiple` mode each selection renders as a badge. The `#chip` slot replaces
1162
+ that badge outright — a colored label, an avatar plus a name, anything — and
1163
+ receives `{ item, text, value, disabled, deselect }`. `item` is the raw entry
1164
+ from `items` (where a per-selection color or avatar lives), `disabled` is `true`
1165
+ while the control is `disabled` or `readonly` (render no remove affordance —
1166
+ `deselect` refuses anyway), and `deselect` drops just this value from the model.
1167
+
1168
+ Custom chips need none of the library's class names: the chips row supplies the
1169
+ spacing and keeps them from shrinking. The slot is not called in `comma` mode
1170
+ (there are no chips to replace) nor for the collapsed "+N" summary that appears
1171
+ once the chips outgrow the field — keep chips compact, or raise
1172
+ `max-selected-labels`.
1173
+
1174
+ **Labels as colored chips**
1175
+
1176
+ ```vue
1177
+ <template>
1178
+ <div class="grid max-w-sm gap-3 rounded-[var(--bb-radius)] border p-3">
1179
+ <BbSelect
1180
+ v-model="tags"
1181
+ clearable
1182
+ item-text="label"
1183
+ item-value="value"
1184
+ :items="tagItems"
1185
+ label="Labels"
1186
+ multiple
1187
+ placeholder="Add labels"
1188
+ >
1189
+ <template #option="{ item, text }">
1190
+ <span class="flex w-full items-center gap-2">
1191
+ <span
1192
+ class="size-2 shrink-0 rounded-full"
1193
+ :style="{ background: item.color }"
1194
+ ></span>
1195
+ <span class="min-w-0 flex-1 truncate">{{ text }}</span>
1196
+ </span>
1197
+ </template>
1198
+ <!-- The chip slot replaces the default badge for each selection. It
1199
+ hands over the raw `item` (here: the label's own color), the resolved
1200
+ `text` / `value`, a `disabled` flag that is true while the control is
1201
+ disabled or readonly, and `deselect` — which drops just this value. -->
1202
+ <template #chip="{ item, text, disabled, deselect }">
1203
+ <BbBadge
1204
+ :clearable="!disabled"
1205
+ size="lg"
1206
+ :style="{
1207
+ '--bg': `color-mix(in oklab, ${item.color} 15%, transparent)`,
1208
+ '--color': 'var(--bb-text)',
1209
+ }"
1210
+ @click:clear="deselect"
1211
+ >
1212
+ <span
1213
+ class="size-2 rounded-full"
1214
+ :style="{ background: item.color }"
1215
+ ></span>
1216
+ {{ text }}
1217
+ </BbBadge>
1218
+ </template>
1219
+ </BbSelect>
1220
+ </div>
1221
+ </template>
1222
+ <script setup lang="ts">
1223
+ import { ref } from 'vue';
1224
+ import { BbBadge, BbSelect } from 'bitboss-ui';
1225
+
1226
+ type Label = { label: string; value: string; color: string };
1227
+
1228
+ const tagItems: Label[] = [
1229
+ { label: 'Bug', value: 'bug', color: '#ef4444' },
1230
+ { label: 'Enhancement', value: 'enhancement', color: '#0ea5e9' },
1231
+ { label: 'Documentation', value: 'documentation', color: '#8b5cf6' },
1232
+ { label: 'Good first issue', value: 'good-first-issue', color: '#22c55e' },
1233
+ ];
1234
+
1235
+ const tags = ref<string[]>(['bug']);
1236
+ </script>
1237
+ ```
1238
+
1151
1239
  ### Slots around the input
1152
1240
 
1153
1241
  Beyond the panel slots, the field itself is extensible:
1154
1242
 
1155
- - `#label` replaces the label text; receives `{ text, hasErrors }`.
1243
+ - `#label` replaces the label text; receives `{ text, hasErrors, hasWarning }`.
1156
1244
  - `#prefix` / `#suffix` render inline adornments inside the field (no scope) —
1157
1245
  currency symbols, units.
1158
1246
  - `#prepend` / `#append` render inside the field wrapper, before/after the
@@ -1212,6 +1300,14 @@ Shipped behavior — never reimplement it:
1212
1300
  library default) — `direction="horizontal"` gives a label-beside-field row.
1213
1301
  Only `floating`/`inside` label modes force the vertical layout, since they
1214
1302
  embed the label in the field itself.
1303
+ - **A long `placeholder` or a long selected label never widens the control's
1304
+ track.** The trigger is a button, not an `<input>`, so the placeholder is
1305
+ real text rather than a paint-only `::placeholder` — but the field's minimum
1306
+ size is capped so that text cannot become the floor of a grid or flex track.
1307
+ Put a select with a paragraph-length placeholder in
1308
+ `grid-template-columns: repeat(3, 1fr)` and you still get three equal
1309
+ columns, with the text ellipsised inside its field. You do **not** need
1310
+ `min-w-0` on the item or `minmax(0, 1fr)` on the track to get this.
1215
1311
 
1216
1312
  ### Adaptive mobile sheet
1217
1313
 
@@ -1243,9 +1339,13 @@ From the vite/nuxt plugin options:
1243
1339
 
1244
1340
  Platform notes:
1245
1341
 
1246
- - **SSR / Nuxt**: `prefill: true` providers also run in `onServerPrefetch`, so
1247
- server-rendered pages hydrate with options loaded. Keep providers isomorphic
1248
- (no `window` access).
1342
+ - **SSR / Nuxt**: under `bitboss-ui/nuxt`, `prefill: true` providers run in
1343
+ `onServerPrefetch` AND their result travels in the Nuxt payload, so the client
1344
+ hydrates with the options already in hand and never re-requests them. Under any
1345
+ other SSR host the provider does **not** run on the server at all — the server
1346
+ emits the placeholder and the client loads on mount, which keeps hydration
1347
+ clean. Keep providers isomorphic (no `window` access) and have them return
1348
+ plain, serializable rows. See [SSR prefill](./guides/ssr-prefill.md).
1249
1349
  - **Plain HTML forms / Inertia form posts**: give the select a `name` — hidden
1250
1350
  inputs carry the values (JSON-stringified when not strings), and `required`
1251
1351
  participates in native validation.
@@ -1346,58 +1446,58 @@ Platform notes:
1346
1446
 
1347
1447
  | Prop | Type | Default | Required | Description |
1348
1448
  | --- | --- | --- | --- | --- |
1349
- | `adaptive` | `boolean \| undefined` | `undefined` | | When `true`, the options panel opens as a bottom off-canvas sheet on mobile viewports instead of a floating popover; on desktop it stays a popover. When unset, falls back to the global `config.adaptive`. |
1449
+ | `adaptive` | `boolean \| undefined` | ``config.adaptive` (`true`)` | | When `true`, the options panel opens as a bottom off-canvas sheet on mobile viewports instead of a floating popover; on desktop it stays a popover. When unset, falls back to the global `config.adaptive`. |
1350
1450
  | `append:icon` | `string \| undefined` | | | Name of the icon to be added at the end of the input. |
1351
1451
  | `autocomplete` | `string \| undefined` | | | Guides to the browser as to the type of information expected in the field. |
1352
1452
  | `autofocus` | `Booleanish \| undefined` | | | Sets autofocus on page load. |
1353
- | `clearable` | `boolean \| undefined` | | | Displays a clear button when the input has a value and is being interacted with. |
1354
- | `comma` | `boolean \| undefined` | | | Sets the display model for selected values to a list of comma separated string. In this mode the user cannot deselect an option by pressing the close button. |
1355
- | `compact` | `boolean \| undefined` | | | Sets the component in a compact mode. |
1453
+ | `clearable` | `boolean \| undefined` | `false` | | Displays a clear button when the input has a value and is being interacted with. |
1454
+ | `comma` | `boolean \| undefined` | `false` | | Sets the display model for selected values to a list of comma separated string. In this mode the user cannot deselect an option by pressing the close button. |
1455
+ | `compact` | `boolean \| undefined` | `false` | | Sets the component in a compact mode. |
1356
1456
  | `dependencies` | `unknown[] \| undefined` | | | Defines an array of dependencies that will trigger actions in the component upon change. |
1357
- | `depsDebounceTime` | `number \| undefined` | | | Timeout used to debounce response to changes to dependencies. |
1457
+ | `depsDebounceTime` | `number \| undefined` | `0` | | Timeout used to debounce response to changes to dependencies. |
1358
1458
  | `description` | `string \| undefined` | | | Descriptive text displayed below the label and above the input. Unlike the hint it is always visible, and it is linked to the input via `aria-describedby` (after any `errors` / `warnings`, before the `hint`). |
1359
1459
  | `direction` | `InputDirection \| undefined` | | | Direction of the layout of the component. Can either be a predefined value or a pattern separated by a space like `xx xxxxx`. |
1360
- | `disabled` | `boolean \| undefined` | | | Disables the component. |
1361
- | `disableWriting` | `boolean \| "mobile" \| "desktop" \| undefined` | | | Controls whether the search input is shown inside the dropdown panel. Use `'mobile'` / `'desktop'` to hide it on that platform only. |
1362
- | `enforceCoherence` | `boolean \| undefined` | | | If coherence is enforced the input cannot have a modelValue that is incoherent with its current items. modelValue will be reset upon incoherence. |
1460
+ | `disabled` | `boolean \| undefined` | `false` | | Disables the component. |
1461
+ | `disableWriting` | `boolean \| "mobile" \| "desktop" \| undefined` | `false` | | Controls whether the search input is shown inside the dropdown panel. Use `'mobile'` / `'desktop'` to hide it on that platform only. |
1462
+ | `enforceCoherence` | `boolean \| undefined` | `false` | | If coherence is enforced the input cannot have a modelValue that is incoherent with its current items. modelValue will be reset upon incoherence. |
1363
1463
  | `errors` | `string \| string[] \| undefined` | | | Can be a string or an array of string containing the messages to display. They render in an `aria-live="polite"` region (announced when they appear) and, while the list is non-empty, are referenced FIRST from the control's `aria-describedby… |
1364
- | `filterBy` | `string[] \| undefined` | | | Property paths used to filter options when the user types in the search input. When empty (default) options are matched against their display text. When non-empty the provided paths are searched instead of the display text. To disable filte… |
1464
+ | `filterBy` | `string[] \| undefined` | `[]` | | Property paths used to filter options when the user types in the search input. When empty (default) options are matched against their display text. When non-empty the provided paths are searched instead of the display text. To disable filte… |
1365
1465
  | `groupBy` | `string \| ((item: T) => string \| number \| symbol) \| undefined` | | | Path to item property for grouping options. |
1366
- | `hasErrors` | `boolean \| undefined` | | | Define if the component should be in an error state. It usually attaches a CSS class for styling purposes. |
1367
- | `hasWarning` | `boolean \| undefined` | | | Define if the component should be in a warning state. Same chrome as errors with `--bb-warn`; errors take priority. |
1466
+ | `hasErrors` | `boolean \| undefined` | `false` | | Define if the component should be in an error state. It usually attaches a CSS class for styling purposes. |
1467
+ | `hasWarning` | `boolean \| undefined` | `false` | | Define if the component should be in a warning state. Same chrome as errors with `--bb-warn`; errors take priority. |
1368
1468
  | `headerHeight` | `number \| undefined` | | | Height of group headers in the listbox (px). Defaults to 32px (24px compact; 36px / 32px on mobile viewports). Only applies when `groupBy` is set. An explicit value wins on every viewport. |
1369
- | `hideLabel` | `boolean \| undefined` | | | Visually hides the label of the input while maintaining accessibility. |
1469
+ | `hideLabel` | `boolean \| undefined` | `false` | | Visually hides the label of the input while maintaining accessibility. |
1370
1470
  | `hint` | `string \| undefined` | | | Text box to be displayed near the input, usually to indicate instructions. |
1371
1471
  | `id` | `string \| undefined` | | | The identifier of the component. |
1372
- | `itemHeight` | `number \| undefined` | | | Height of the options in the listbox (px). Defaults to 28px (24px compact; 44px / 36px on mobile viewports). An explicit value wins on every viewport. |
1472
+ | `itemHeight` | `number \| undefined` | `28` | | Height of the options in the listbox (px). Defaults to 28px (24px compact; 44px / 36px on mobile viewports). An explicit value wins on every viewport. |
1373
1473
  | `items` | `T[] \| ((query: string, prefill: boolean, modelValue: any) => Promise<T[]>) \| ((query: string, prefill: boolean, modelValue: any) => T[])` | | yes | Used to retrieve items; can be an array or a function. |
1374
1474
  | `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. |
1375
1475
  | `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. |
1376
1476
  | `label` | `string` | | yes | Text content of the label of the element. |
1377
1477
  | `labelMode` | `"floating" \| "outside" \| "inside" \| undefined` | | | Label rendering mode. |
1378
1478
  | `labelPosition` | `"left" \| "center" \| "right" \| undefined` | | | Sets the text alignment of the label. |
1379
- | `loading` | `boolean \| undefined` | | | Sets the component in a loading state, usually triggering some visual styles. |
1479
+ | `loading` | `boolean \| undefined` | `false` | | Sets the component in a loading state, usually triggering some visual styles. |
1380
1480
  | `loadingText` | `string \| undefined` | | | String displayed while items are being loaded. |
1381
1481
  | `max` | `number \| undefined` | | | Maximum number of selectable items when the multiple flag is set. |
1382
1482
  | `maxSelectedLabels` | `number \| undefined` | | | Maximum number of labels shown before collapsing to a count summary. |
1383
1483
  | `modelValue` | `any` | | yes | Used by v-model. Can be any serializable type. |
1384
- | `modelValueDebounceTime` | `number \| undefined` | | | Timeout used to debounce response to changes to modelValue. |
1385
- | `multiple` | `boolean \| undefined` | | | Allows the selection of multiple items. |
1484
+ | `modelValueDebounceTime` | `number \| undefined` | `0` | | Timeout used to debounce response to changes to modelValue. |
1485
+ | `multiple` | `boolean \| undefined` | `false` | | Allows the selection of multiple items. |
1386
1486
  | `name` | `string \| undefined` | | | Defines the name of the input. |
1387
1487
  | `noDataText` | `string \| undefined` | | | String displayed when there are no items to display. |
1388
1488
  | `offCanvasProps` | `Partial<BbOffCanvasProps> \| undefined` | | | Extra props forwarded to the `BbOffCanvas` sheet when `adaptive` is active on mobile. |
1389
- | `persistentHint` | `boolean \| undefined` | | | Keeps the hint displayed. |
1489
+ | `persistentHint` | `boolean \| undefined` | `false` | | Keeps the hint displayed. |
1390
1490
  | `placeholder` | `string \| undefined` | | | String displayed when there's no data. |
1391
- | `prefill` | `boolean \| "interaction" \| undefined` | `undefined` | | Controls when items are pre-loaded. `'interaction'` loads on the first user interaction, `true` loads immediately on mount, `false` is *search-first*: with a provider, nothing is fetched until the user types — opening alone does not load, a… |
1491
+ | `prefill` | `boolean \| "interaction" \| undefined` | `'interaction'` | | Controls when items are pre-loaded. `'interaction'` loads on the first user interaction, `true` loads immediately on mount, `false` is *search-first*: with a provider, nothing is fetched until the user types — opening alone does not load, a… |
1392
1492
  | `prepend:icon` | `string \| undefined` | | | Name of the icon to be added at the start of the input. |
1393
- | `queryDebounceTime` | `number \| undefined` | | | Time to wait when the user stops writing in the input before querying data. |
1394
- | `readonly` | `boolean \| undefined` | | | Sets the input in a readonly state. |
1395
- | `required` | `boolean \| undefined` | | | Sets the input as required. |
1396
- | `reverse` | `boolean \| undefined` | | | Reverses the layout. Applicable in every direction the order of the label and the input is swapped. |
1493
+ | `queryDebounceTime` | `number \| undefined` | `500` | | Time to wait when the user stops writing in the input before querying data. |
1494
+ | `readonly` | `boolean \| undefined` | `false` | | Sets the input in a readonly state. |
1495
+ | `required` | `boolean \| undefined` | `false` | | Sets the input as required. |
1496
+ | `reverse` | `boolean \| undefined` | `false` | | Reverses the layout. Applicable in every direction the order of the label and the input is swapped. |
1397
1497
  | `selectable` | `boolean \| ((item: T) => boolean) \| undefined` | `true` | | Defines whether options are selectable. Can be a global boolean that affects all options or a function that accepts an item and returns a boolean that only affects that item. Non-selectable options are rendered disabled. |
1398
1498
  | `selectedLabelsFn` | `((count: number) => string) \| undefined` | | | Function that returns a string to be displayed when the number of selected labels is greater than `maxSelectedLabels`. |
1399
- | `stash` | `boolean \| undefined` | | | Adds a stash to accumulate selected values across searches. |
1400
- | `transitionDuration` | `number \| undefined` | | | How long the transition has to last in milliseconds. |
1499
+ | `stash` | `boolean \| undefined` | `false` | | Adds a stash to accumulate selected values across searches. |
1500
+ | `transitionDuration` | `number \| undefined` | `250` | | How long the transition has to last in milliseconds. |
1401
1501
  | `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… |
1402
1502
 
1403
1503
  ## Events
@@ -1416,6 +1516,7 @@ Platform notes:
1416
1516
 
1417
1517
  - `append` — scope: `{ query: string; focus: () => void; close: () => Promise<void>; }` — Content appended inside the input field, after the value area.
1418
1518
  - `append-outer` — scope: `{ query: string; close: () => Promise<void>; }` — Content appended outside the input field wrapper.
1519
+ - `chip` — scope: `BbSelectChipSlotProps<T>` — Replaces the default badge rendered for each selection in `multiple` mode. Not called in `comma` mode, nor for the collapsed "+N" summary.
1419
1520
  - `footer` — scope: `BbSelectPanelSlotProps` — Content pinned to the bottom of the options panel, below the options list. Rendered in both the desktop popover and the adaptive sheet.
1420
1521
  - `group` — scope: `BbSelectGroupSlotProps<T>` — Replaces the default group header rendered above grouped options.
1421
1522
  - `header` — scope: `BbSelectPanelSlotProps` — Content pinned to the top of the options panel, above the search field. Rendered in both the desktop popover and the adaptive sheet.
@@ -216,9 +216,11 @@ const reviewers = ref<string[]>(['ada', 'grace']);
216
216
 
217
217
  ### Custom option rows
218
218
 
219
- The `#option` slot replaces each row — exposing the raw `item`, resolved `text` /
220
- `value`, the row `index`, and `selected` / `focused` / `disabled` / `loading`
221
- flags — so options can carry avatars, badges or secondary metadata. Rows are
219
+ The `#option` slot replaces each row's **text** — exposing the raw `item`,
220
+ resolved `text` / `value`, the row `index`, and `selected` / `focused` /
221
+ `disabled` / `loading` flags — so options can carry avatars, badges or secondary
222
+ metadata. The selection check renders outside the slot and survives any custom
223
+ markup, so there is no need to redraw it from `selected`. Rows are
222
224
  fixed-height and virtualized: if your markup is taller than the default 28px
223
225
  (24px compact; 44px / 36px inside the adaptive sheet), set `item-height` to
224
226
  match — and `header-height` for grouped headers (32px / 24px compact; 36px /
@@ -258,16 +260,12 @@ height wins everywhere.
258
260
  }}</BbBadgeButton>
259
261
  </BbBadge>
260
262
  </template>
261
- <template #option="{ item, text, selected }">
263
+ <!-- The slot replaces the row's TEXT only: the selection check keeps
264
+ rendering outside it, so custom rows never have to redraw it. -->
265
+ <template #option="{ item, text }">
262
266
  <span class="flex w-full items-center gap-2">
263
267
  <BbAvatar :alt="text" size="32">{{ item.initials }}</BbAvatar>
264
268
  <span class="min-w-0 flex-1 truncate">{{ text }}</span>
265
- <BbIcon
266
- v-if="selected"
267
- class="shrink-0 text-[color:var(--bb-text-muted)]"
268
- icon="lucide:check"
269
- :size="14"
270
- />
271
269
  </span>
272
270
  </template>
273
271
  </BbSelectPopover>
@@ -275,13 +273,7 @@ height wins everywhere.
275
273
  </template>
276
274
  <script setup lang="ts">
277
275
  import { computed, ref } from 'vue';
278
- import {
279
- BbAvatar,
280
- BbBadge,
281
- BbBadgeButton,
282
- BbIcon,
283
- BbSelectPopover,
284
- } from 'bitboss-ui';
276
+ import { BbAvatar, BbBadge, BbBadgeButton, BbSelectPopover } from 'bitboss-ui';
285
277
 
286
278
  type Person = { label: string; value: string; initials: string };
287
279
 
@@ -406,8 +398,9 @@ const destinationLabel = computed(
406
398
  ### Laziness, prefill and the trigger label
407
399
 
408
400
  `prefill` controls **when the first load happens**: `'interaction'` (default) on
409
- first open, `true` immediately on mount (and during SSR via `onServerPrefetch`),
410
- `false` **search-first** nothing is fetched until the user types a query.
401
+ first open, `true` immediately on mount (and during SSR via `onServerPrefetch`,
402
+ but only on a host that can transfer the result see
403
+ [SSR prefill](./guides/ssr-prefill.md)), `false` **search-first** — nothing is fetched until the user types a query.
411
404
  Opening the panel is not a search, so it loads nothing; until the first query the
412
405
  list shows a _"search to begin"_ hint instead of "no data".
413
406
 
@@ -1179,8 +1172,10 @@ const variantFor = (value: Status | null): BadgeVariantType =>
1179
1172
  With `adaptive` (default: global `config.adaptive`, which is `true`), the panel
1180
1173
  opens as a bottom off-canvas sheet on mobile viewports (below
1181
1174
  `config.mobileMaxWidth`) instead of a floating popover — same search, options and
1182
- `#header`/`#footer` slots, plus a representation of the current selection between
1183
- them. The surface is **latched per open cycle**: a mid-open resize never swaps
1175
+ `#header`/`#footer` slots. In **multiple** mode the current selection also shows
1176
+ as removable chips above the search (so picks stay clearable when filtered or
1177
+ scrolled away); single select relies on the listbox checkmark and closes on pick.
1178
+ The surface is **latched per open cycle**: a mid-open resize never swaps
1184
1179
  popover ↔ sheet. `off-canvas-props` forwards extra `BbOffCanvas` props to the
1185
1180
  sheet (`size`, `draggable`, `fullscreen`, `stack`); `:adaptive="false"` keeps a
1186
1181
  floating popover everywhere.
@@ -1207,9 +1202,13 @@ floating popover everywhere.
1207
1202
  - **Global config** — `config.adaptive` (default for `adaptive`),
1208
1203
  `config.mobileMaxWidth` (the mobile threshold), `config.locale` (the search
1209
1204
  field's default accessible name and panel string defaults).
1210
- - **SSR / Nuxt** — `prefill: true` providers also run in `onServerPrefetch`, so
1211
- server-rendered pages hydrate with options loaded; keep providers isomorphic
1212
- (no `window` access).
1205
+ - **SSR / Nuxt** — under `bitboss-ui/nuxt`, `prefill: true` providers run in
1206
+ `onServerPrefetch` and their result rides the Nuxt payload, so the client
1207
+ hydrates with options already loaded and does not fetch again. On other SSR
1208
+ hosts the provider stays client-side and the server renders the placeholder —
1209
+ deliberately, since server markup the client cannot rebuild is a hydration
1210
+ mismatch. Keep providers isomorphic (no `window` access) and returning plain
1211
+ rows. See [SSR prefill](./guides/ssr-prefill.md).
1213
1212
 
1214
1213
  ### Works well with
1215
1214
 
@@ -1330,36 +1329,36 @@ floating popover everywhere.
1330
1329
  | Prop | Type | Default | Required | Description |
1331
1330
  | --- | --- | --- | --- | --- |
1332
1331
  | `activator` | `Record<string, any> \| HTMLElement \| null \| undefined` | | | External activator element or component ref. When provided, the activator slot is not rendered and event listeners are attached programmatically to the referenced element. |
1333
- | `adaptive` | `boolean \| undefined` | `undefined` | | When `true`, the panel opens as a bottom off-canvas sheet on mobile viewports instead of a floating popover; on desktop it stays a popover. The sheet reuses the same search field and options list, adding a representation of the current sele… |
1332
+ | `adaptive` | `boolean \| undefined` | ``config.adaptive` (`true`)` | | When `true`, the panel opens as a bottom off-canvas sheet on mobile viewports instead of a floating popover; on desktop it stays a popover. The sheet reuses the same search field and options list, adding a representation of the current sele… |
1334
1333
  | `anchor` | `Record<string, any> \| HTMLElement \| null \| undefined` | `null` | | Override the element used for popover positioning and width measurement. Useful when the focusable activator is narrower than its visual container (e.g. a button inside a wrapper). Falls back to `activatorEl` when omitted. |
1335
1334
  | `ariaDescribedby` | `string \| string[] \| undefined` | | | Space-separated IDREF(s) that describe this field for assistive technologies. Accepts either a string or array of ids. |
1336
1335
  | `ariaInvalid` | `boolean \| undefined` | `undefined` | | Explicit invalid state for accessibility semantics. Falls back to `hasErrors` when not provided. |
1337
1336
  | `autocomplete` | `string \| undefined` | `"off"` | | Browser autocomplete hint for the popover search input. |
1338
1337
  | `boundary` | `string \| Record<string, any> \| HTMLElement \| null \| undefined` | | | Constrains the popover to a specific boundary element. |
1339
- | `clearable` | `boolean \| undefined` | | | Shows a clear button inside the search field's icon stack: it takes the lens' place on hover/focus while there is a query or selection to clear, and resets both. Off by default. Leave it off when the component is wrapped by a control that a… |
1340
- | `compact` | `boolean \| undefined` | | | Apply the compact density variant. |
1338
+ | `clearable` | `boolean \| undefined` | `false` | | Shows a clear button inside the search field's icon stack: it takes the lens' place on hover/focus while there is a query or selection to clear, and resets both. Off by default. Leave it off when the component is wrapped by a control that a… |
1339
+ | `compact` | `boolean \| undefined` | `false` | | Apply the compact density variant. |
1341
1340
  | `dependencies` | `unknown[] \| undefined` | `[]` | | Additional dependencies that trigger item reloading when changed. |
1342
1341
  | `depsDebounceTime` | `number \| undefined` | `0` | | Debounce delay (ms) for dependency-triggered reloads. |
1343
- | `disabled` | `boolean \| undefined` | | | Disables the component. |
1344
- | `disableFlip` | `boolean \| undefined` | | | Disables the automatic flip to the opposite side when the popover would overflow (flipping is on by default). |
1345
- | `disableWriting` | `boolean \| "mobile" \| "desktop" \| undefined` | | | Controls whether the search input is shown inside the popover panel. Use `'mobile'` to hide the search input on mobile, `'desktop'` to hide it on desktop. |
1346
- | `enforceCoherence` | `boolean \| undefined` | | | Reset modelValue to `null` or empty array if it no longer matches available items. |
1342
+ | `disabled` | `boolean \| undefined` | `false` | | Disables the component. |
1343
+ | `disableFlip` | `boolean \| undefined` | `false` | | Disables the automatic flip to the opposite side when the popover would overflow (flipping is on by default). |
1344
+ | `disableWriting` | `boolean \| "mobile" \| "desktop" \| undefined` | `false` | | Controls whether the search input is shown inside the popover panel. Use `'mobile'` to hide the search input on mobile, `'desktop'` to hide it on desktop. |
1345
+ | `enforceCoherence` | `boolean \| undefined` | `false` | | Reset modelValue to `null` or empty array if it no longer matches available items. |
1347
1346
  | `filterBy` | `string[] \| undefined` | `[]` | | Property paths used to filter options when the user types in the search input. When empty (default) options are matched against their display text. When non-empty the provided paths are searched instead of the display text. To disable filte… |
1348
1347
  | `groupBy` | `string \| ((item: Item) => string \| number \| symbol) \| undefined` | | | Path to item property for grouping options. |
1349
- | `hasErrors` | `boolean \| undefined` | | | Marks the component as being in error state. |
1350
- | `hasWarning` | `boolean \| undefined` | | | Marks the component as being in a warning state. Visually mirrors `hasErrors` but uses `--bb-warn` chrome; errors take priority when both are set. |
1348
+ | `hasErrors` | `boolean \| undefined` | `false` | | Marks the component as being in error state. |
1349
+ | `hasWarning` | `boolean \| undefined` | `false` | | Marks the component as being in a warning state. Visually mirrors `hasErrors` but uses `--bb-warn` chrome; errors take priority when both are set. |
1351
1350
  | `headerHeight` | `number \| undefined` | | | Height of group headers in the listbox (px). Defaults to 32px (24px compact; 36px / 32px on mobile viewports). Only applies when `groupBy` is set. An explicit value wins on every viewport. |
1352
1351
  | `id` | `string \| undefined` | | | Explicit id for the component. Used to generate ids for listbox and options. |
1353
- | `itemHeight` | `number \| undefined` | | | Height of the options in the listbox (px). Defaults to 28px (24px compact; 44px / 36px on mobile viewports). An explicit value wins on every viewport. |
1354
- | `items` | `Item[] \| ((query: string, prefill: boolean, modelValue: any) => Promise<Item[]>) \| ((query: string, prefill: boolean, modelValue: any) => Item[])` | | yes | Array of items or function to load them asynchronously. Functions receive `(query, prefill, modelValue)` and can return a promise. `modelValue` is the raw v-model: an array in `multiple` mode, the raw model value (possibly `null`) in single… |
1352
+ | `itemHeight` | `number \| undefined` | `28` | | Height of the options in the listbox (px). Defaults to 28px (24px compact; 44px / 36px on mobile viewports). An explicit value wins on every viewport. |
1353
+ | `items` | `Item[] \| ((query: string, prefill: boolean, modelValue: any) => Promise<Item[]>) \| ((query: string, prefill: boolean, modelValue: any) => Item[])` | `[]` | yes | Array of items or function to load them asynchronously. Functions receive `(query, prefill, modelValue)` and can return a promise. `modelValue` is the raw v-model: an array in `multiple` mode, the raw model value (possibly `null`) in single… |
1355
1354
  | `itemText` | `ItemAccessor<Item, string> \| undefined` | | | Path to item property for display text or function to extract it. |
1356
1355
  | `itemValue` | `ItemAccessor<Item> \| undefined` | | | Path to item property for value or function to extract it. |
1357
- | `loading` | `boolean \| undefined` | | | Display the loading state styles. |
1356
+ | `loading` | `boolean \| undefined` | `false` | | Display the loading state styles. |
1358
1357
  | `loadingText` | `string \| undefined` | | | Message shown while items are being loaded. |
1359
1358
  | `max` | `number \| undefined` | `Infinity` | | Maximum number of selectable items (limits selection when `multiple` is true). |
1360
1359
  | `modelValue` | `any` | | yes | v-model value. Single value for single select, array for multiple select. |
1361
1360
  | `modelValueDebounceTime` | `number \| undefined` | `0` | | Debounce delay (ms) for modelValue change handling. |
1362
- | `multiple` | `boolean \| undefined` | | | Enable multiple item selection. When true, modelValue must be an array. |
1361
+ | `multiple` | `boolean \| undefined` | `false` | | Enable multiple item selection. When true, modelValue must be an array. |
1363
1362
  | `noDataText` | `string \| undefined` | | | Message displayed when no items are available. |
1364
1363
  | `offCanvasProps` | `Partial<BbOffCanvasProps> \| undefined` | | | Extra props forwarded to the `BbOffCanvas` sheet when `adaptive` is active on mobile (e.g. `size`, `draggable`, `fullscreen`, `stack`). |
1365
1364
  | `offset` | `number \| undefined` | `4` | | Distance (px) between the activator and the popover. |
@@ -1367,11 +1366,11 @@ floating popover everywhere.
1367
1366
  | `placement` | `Placement \| undefined` | `"bottom"` | | Floating placement of the popover. |
1368
1367
  | `prefill` | `boolean \| "interaction" \| undefined` | `"interaction"` | | Controls when items are pre-loaded. `'interaction'` loads on the first user interaction (opening the popover), `true` loads immediately on mount (and during SSR via `onServerPrefetch`), `false` is *search-first*: nothing is fetched until th… |
1369
1368
  | `queryDebounceTime` | `number \| undefined` | `500` | | Debounce delay (ms) before triggering search queries after user input stops. |
1370
- | `readonly` | `boolean \| undefined` | | | Prevents opening the popover while keeping the activator accessible. |
1371
- | `searchInputAriaLabel` | `string \| undefined` | | | Accessible label used by the search input rendered inside the popover. Falls back to the localized `select.searchLabel` key when omitted. |
1369
+ | `readonly` | `boolean \| undefined` | `false` | | Prevents opening the popover while keeping the activator accessible. |
1370
+ | `searchInputAriaLabel` | `string \| undefined` | ``t('select.searchLabel')` (`'Search options'`)` | | Accessible label used by the search input rendered inside the popover. Falls back to the localized `select.searchLabel` key when omitted. |
1372
1371
  | `selectable` | `boolean \| ((item: Item) => boolean) \| undefined` | `true` | | Defines whether options are selectable. Can be a global boolean that affects all options or a function that accepts an item and returns a boolean that only affects that item. Non-selectable options are rendered disabled. |
1373
- | `stash` | `boolean \| undefined` | | | Accumulate selected items across searches instead of replacing them. |
1374
- | `transitionDuration` | `number \| undefined` | `transitions.medium` | | Transition duration (ms) for popover show/hide animations. |
1372
+ | `stash` | `boolean \| undefined` | `false` | | Accumulate selected items across searches instead of replacing them. |
1373
+ | `transitionDuration` | `number \| undefined` | `250` | | Transition duration (ms) for popover show/hide animations. |
1375
1374
  | `width` | `string \| number \| undefined` | `"200"` | | Width of the popover in pixels, percentage, or `'auto'`. A bare number is read as pixels — the default is the string `'200'`, not the number `200`. |
1376
1375
 
1377
1376
  ## Events
@@ -183,10 +183,16 @@ const volume = ref(40);
183
183
 
184
184
  ### Discrete steps with ticks
185
185
 
186
- `ticks` marks every step. Add `disable-thumb-translate` so the thumb sits exactly
187
- over each tick instead of being nudged to stay centred the two pair naturally
188
- when you want a stepped, notched slider. The `tick` slot (`{ value, percent,
189
- active }`) replaces each mark if you want custom notches or per-step labels.
186
+ `ticks` lays out one evenly-spaced slot per step. **You draw the mark**: the
187
+ library positions the tick elements but ships no default notch
188
+ `.bb-base-slider__tick` carries only `position: relative`, and the `tick` slot
189
+ has no fallback content, so `ticks` on its own renders empty spans and looks
190
+ like nothing happened. Fill the `tick` slot (`{ value, percent, active }`) with
191
+ your notch or per-step label, or style `.bb-base-slider__tick` yourself.
192
+
193
+ Add `disable-thumb-translate` so the thumb sits exactly over each tick instead
194
+ of being nudged to stay centred — the two pair naturally when you want a
195
+ stepped, notched slider.
190
196
 
191
197
  **Stepped slider with ticks**
192
198
 
@@ -309,8 +315,13 @@ const limit = ref<number | null>(200);
309
315
  - `label` is required and names the slider; `hide-label` keeps it for assistive
310
316
  tech only.
311
317
  - `label-mode` is `'outside'` (default) or `'inside'`. `'floating'` is **not
312
- supported and throws at runtime** — a slider has no empty/filled state for the
313
- label to float against.
318
+ supported** — a slider has no empty/filled state for the label to float
319
+ against and it is no longer in the type, so a typed template cannot write
320
+ it. It does not throw: an explicit `'floating'` from untyped code warns in
321
+ dev and falls back to `'outside'` (`resolveEnumProp`, the library-wide policy
322
+ that a bad enum token is cosmetic, never fatal). A plugin-level
323
+ `defaultInputLabelMode: 'floating'` degrades to `'outside'` **silently** —
324
+ the consumer made no per-slider choice, so there is nothing to warn about.
314
325
  - `direction` (`'horizontal'`, `'vertical'`, `'auto'`, or a pattern like
315
326
  `'xx xxxxxx'`), `reverse`, and `label-position` arrange the label against the
316
327
  track, exactly as on the other inputs.
@@ -416,11 +427,15 @@ Works well with:
416
427
 
417
428
  ### Gotchas and anti-patterns
418
429
 
419
- - Don't bind a scalar with `range` (or an array without it) — the mode and the
420
- `modelValue` shape must match, or it throws at mount.
430
+ - Don't bind a scalar with `range` that one throws at mount
431
+ (`BbBaseSlider.vue:249`). The mirror case is worse because it is **quiet**:
432
+ an array **without** `range` renders a single thumb and silently reads
433
+ `head()`, so the second value is dropped with no warning. Keep the mode and
434
+ the `modelValue` shape in step in both directions.
421
435
  - Don't expect `increase`/`decrease` to work in range mode; they are single-value
422
436
  only. Drive range thumbs with the keyboard or pointer.
423
- - Don't set `label-mode="floating"` — it throws. Use `'outside'` or `'inside'`.
437
+ - Don't set `label-mode="floating"` — it is not in the type, and at runtime it
438
+ warns and falls back to `'outside'`. Use `'outside'` or `'inside'`.
424
439
  - Don't rely on a slider for exact numbers — steps finer than `0.01` round away
425
440
  unless you raise `max-precision` to match. Use `BbNumberInput` when the
426
441
  precise figure is the point.
@@ -455,32 +470,32 @@ Works well with:
455
470
  | Prop | Type | Default | Required | Description |
456
471
  | --- | --- | --- | --- | --- |
457
472
  | `autofocus` | `Booleanish \| undefined` | | | Sets autofocus on page load. |
458
- | `compact` | `boolean \| undefined` | | | Set the component in compact mode. |
473
+ | `compact` | `boolean \| undefined` | `false` | | Set the component in compact mode. |
459
474
  | `description` | `string \| undefined` | | | Descriptive text displayed below the label and above the input. Unlike the hint it is always visible, and it is linked to the input via `aria-describedby` (after any `errors` / `warnings`, before the `hint`). |
460
475
  | `direction` | `InputDirection \| undefined` | | | Direction of the layout of the component. Can either be a predefined value or a pattern separated by a space like `xx xxxxx`. |
461
- | `disabled` | `boolean \| undefined` | | | Disables the component. |
462
- | `disableThumbTranslate` | `boolean \| undefined` | | | Disables the proportional thumb translation that keeps the thumb on track (enabled by default). Set it when displaying ticks so they align with less effort. |
476
+ | `disabled` | `boolean \| undefined` | `false` | | Disables the component. |
477
+ | `disableThumbTranslate` | `boolean \| undefined` | `false` | | Disables the proportional thumb translation that keeps the thumb on track (enabled by default). Set it when displaying ticks so they align with less effort. |
463
478
  | `errors` | `string \| string[] \| undefined` | | | Can be a string or an array of string containing the messages to display. They render in an `aria-live="polite"` region (announced when they appear) and, while the list is non-empty, are referenced FIRST from the control's `aria-describedby… |
464
- | `hasErrors` | `boolean \| undefined` | | | Define if the component should be in an error state. It usually attaches a CSS class for styling purposes. |
465
- | `hasWarning` | `boolean \| undefined` | | | Define if the component should be in a warning state. Same chrome as errors with `--bb-warn`; errors take priority. |
466
- | `hideLabel` | `boolean \| undefined` | | | Visually hides the label of the input while maintaining accessibility. |
479
+ | `hasErrors` | `boolean \| undefined` | `false` | | Define if the component should be in an error state. It usually attaches a CSS class for styling purposes. |
480
+ | `hasWarning` | `boolean \| undefined` | `false` | | Define if the component should be in a warning state. Same chrome as errors with `--bb-warn`; errors take priority. |
481
+ | `hideLabel` | `boolean \| undefined` | `false` | | Visually hides the label of the input while maintaining accessibility. |
467
482
  | `hint` | `string \| undefined` | | | Text box to be displayed near the input, usually to indicate instructions. |
468
483
  | `id` | `string \| undefined` | | | The identifier of the component. |
469
484
  | `label` | `string` | | yes | Text content of the label of the element. |
470
485
  | `labelMode` | `"outside" \| "inside" \| undefined` | | | Label rendering mode. Sliders do not support `floating` labels. |
471
486
  | `labelPosition` | `"left" \| "center" \| "right" \| undefined` | | | Sets the text alignment of the label. |
472
487
  | `max` | `number \| undefined` | | | Maximum value cap. |
473
- | `maxPrecision` | `number \| undefined` | | | Maximum decimal places to retain in emitted values. |
488
+ | `maxPrecision` | `number \| undefined` | `2` | | Maximum decimal places to retain in emitted values. |
474
489
  | `min` | `number \| undefined` | | | Minimum value cap. |
475
490
  | `modelValue` | `number \| number[] \| null` | | yes | Used by v-model. |
476
491
  | `name` | `string \| undefined` | | | Defines the name of the input. |
477
- | `persistentHint` | `boolean \| undefined` | | | Keeps the hint displayed. |
478
- | `range` | `boolean \| undefined` | | | Set the input as range. modelValue must be an array. |
479
- | `readonly` | `boolean \| undefined` | | | Sets the input in a readonly state. |
480
- | `required` | `boolean \| undefined` | | | Sets the input as required. |
481
- | `reverse` | `boolean \| undefined` | | | Reverses the layout. Applicable in every direction the order of the label and the input is swapped. |
492
+ | `persistentHint` | `boolean \| undefined` | `false` | | Keeps the hint displayed. |
493
+ | `range` | `boolean \| undefined` | `false` | | Set the input as range. modelValue must be an array. |
494
+ | `readonly` | `boolean \| undefined` | `false` | | Sets the input in a readonly state. |
495
+ | `required` | `boolean \| undefined` | `false` | | Sets the input as required. |
496
+ | `reverse` | `boolean \| undefined` | `false` | | Reverses the layout. Applicable in every direction the order of the label and the input is swapped. |
482
497
  | `step` | `number \| undefined` | | | The step attribute specifies the granularity that the value must adhere to. |
483
- | `ticks` | `boolean \| undefined` | | | Displays ticks on step. |
498
+ | `ticks` | `boolean \| undefined` | `false` | | Displays ticks on step. |
484
499
  | `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… |
485
500
 
486
501
  ## Events
@@ -497,7 +497,7 @@ const expanded = ref(false);
497
497
  | `resizeOptions` | `ResizeObserverOptions \| undefined` | | | Options to pass to the ResizeObserver. |
498
498
  | `strategy` | `"resize" \| "mutation" \| undefined` | `"resize"` | | Define which strategy to use. By default `'resize'` is used, which means the component will update on resizing. You can also define `'mutation'` to use a MutationObserver. |
499
499
  | `tag` | `LayoutTag \| undefined` | `"div"` | | Element rendered as the component's wrapper. |
500
- | `transitionDuration` | `number \| undefined` | `transitions.medium` | | How long the transition has to last in milliseconds |
500
+ | `transitionDuration` | `number \| undefined` | `250` | | How long the transition has to last in milliseconds |
501
501
 
502
502
  ## Events
503
503