bitboss-ui 2.1.135 → 3.0.0-alpha.4

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 (1369) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +274 -24
  3. package/bin/bitboss-ui-mcp.mjs +662 -0
  4. package/bin/bitboss-ui.mjs +710 -0
  5. package/bin/bitboss-ui.node.test.mjs +113 -0
  6. package/dist/ai/BbAccordion.md +528 -113
  7. package/dist/ai/BbAlert.md +380 -197
  8. package/dist/ai/BbAsterisk.md +46 -0
  9. package/dist/ai/BbAvatar.md +458 -178
  10. package/dist/ai/BbBadge.md +697 -225
  11. package/dist/ai/BbBadgeButton.md +54 -0
  12. package/dist/ai/BbBaseButton.md +491 -0
  13. package/dist/ai/BbBaseCheckbox.md +49 -0
  14. package/dist/ai/BbBaseCheckboxGroup.md +64 -0
  15. package/dist/ai/BbBaseCheckboxIcon.md +176 -0
  16. package/dist/ai/BbBaseColorInput.md +64 -0
  17. package/dist/ai/BbBaseColorPalette.md +39 -0
  18. package/dist/ai/BbBaseDatePicker.md +42 -0
  19. package/dist/ai/BbBaseDatePickerInput.md +73 -0
  20. package/dist/ai/BbBaseInputContainer.md +48 -0
  21. package/dist/ai/BbBaseNumberInput.md +71 -0
  22. package/dist/ai/BbBaseRadio.md +46 -0
  23. package/dist/ai/BbBaseRadioGroup.md +64 -0
  24. package/dist/ai/BbBaseRadioIcon.md +191 -0
  25. package/dist/ai/BbBaseRating.md +51 -0
  26. package/dist/ai/BbBaseSelect.md +88 -0
  27. package/dist/ai/BbBaseSlider.md +56 -0
  28. package/dist/ai/BbBaseSwitch.md +49 -0
  29. package/dist/ai/BbBaseSwitchGroup.md +64 -0
  30. package/dist/ai/BbBaseSwitchIcon.md +186 -0
  31. package/dist/ai/BbBaseTag.md +68 -0
  32. package/dist/ai/BbBaseTextInput.md +75 -0
  33. package/dist/ai/BbBaseTextarea.md +62 -0
  34. package/dist/ai/BbBaseTimePickerInput.md +62 -0
  35. package/dist/ai/BbBreadcrumbs.md +553 -503
  36. package/dist/ai/BbButton.md +841 -636
  37. package/dist/ai/BbCheckbox.md +585 -254
  38. package/dist/ai/BbCheckboxGroup.md +573 -361
  39. package/dist/ai/BbCollapsible.md +425 -103
  40. package/dist/ai/BbColorInput.md +536 -323
  41. package/dist/ai/BbColorPalette.md +569 -330
  42. package/dist/ai/BbConfirm.md +659 -136
  43. package/dist/ai/BbConfirmPortal.md +28 -0
  44. package/dist/ai/BbDatePicker.md +244 -0
  45. package/dist/ai/BbDatePickerInput.md +720 -388
  46. package/dist/ai/BbDialog.md +778 -99
  47. package/dist/ai/BbDropdown.md +1072 -763
  48. package/dist/ai/BbDropdownButton.md +525 -614
  49. package/dist/ai/BbDropdownGroup.md +34 -0
  50. package/dist/ai/BbDropzone.md +1206 -436
  51. package/dist/ai/BbForm.md +239 -0
  52. package/dist/ai/BbIcon.md +382 -212
  53. package/dist/ai/BbIndicator.md +283 -0
  54. package/dist/ai/BbNumberInput.md +717 -355
  55. package/dist/ai/BbOffCanvas.md +897 -498
  56. package/dist/ai/BbPagination.md +489 -535
  57. package/dist/ai/BbPopover.md +591 -546
  58. package/dist/ai/BbProgress.md +462 -69
  59. package/dist/ai/BbRadio.md +352 -229
  60. package/dist/ai/BbRadioGroup.md +437 -353
  61. package/dist/ai/BbRating.md +372 -225
  62. package/dist/ai/BbSelect.md +1399 -536
  63. package/dist/ai/BbSelectPopover.md +1255 -1578
  64. package/dist/ai/BbSlider.md +500 -256
  65. package/dist/ai/BbSmoothHeight.md +485 -139
  66. package/dist/ai/BbSpinner.md +718 -131
  67. package/dist/ai/BbSwitch.md +573 -119
  68. package/dist/ai/BbSwitchGroup.md +521 -214
  69. package/dist/ai/BbTable.md +1996 -2365
  70. package/dist/ai/BbTabs.md +1147 -0
  71. package/dist/ai/BbTabsList.md +29 -0
  72. package/dist/ai/BbTabsPanes.md +27 -0
  73. package/dist/ai/BbTabsRoot.md +57 -0
  74. package/dist/ai/BbTag.md +416 -292
  75. package/dist/ai/BbTextInput.md +878 -333
  76. package/dist/ai/BbTextarea.md +850 -255
  77. package/dist/ai/BbTimePicker.md +231 -0
  78. package/dist/ai/BbTimePickerInput.md +200 -0
  79. package/dist/ai/BbToast.md +669 -196
  80. package/dist/ai/BbToastPortal.md +28 -0
  81. package/dist/ai/BbTooltip.md +453 -346
  82. package/dist/ai/BbTree.md +993 -234
  83. package/dist/ai/ChipsBox.md +27 -199
  84. package/dist/ai/ClearableButton.md +21 -55
  85. package/dist/ai/CommaBox.md +25 -200
  86. package/dist/ai/CommonInputWrapper.md +42 -0
  87. package/dist/ai/CommonPopover.md +30 -510
  88. package/dist/ai/ErrorIcon.md +19 -56
  89. package/dist/ai/FlatListBox.md +35 -379
  90. package/dist/ai/GroupedListBox.md +37 -535
  91. package/dist/ai/GuidesComponent.md +21 -0
  92. package/dist/ai/ListBox.md +38 -231
  93. package/dist/ai/OptionsContainer.md +34 -253
  94. package/dist/ai/WarningIcon.md +21 -0
  95. package/dist/ai/components.json +15897 -0
  96. package/dist/ai/composables/useBbConfig.md +80 -0
  97. package/dist/ai/composables/useBbFormContext.md +110 -0
  98. package/dist/ai/composables/useBbTableContext.md +167 -0
  99. package/dist/ai/composables/useBbTabsContext.md +118 -0
  100. package/dist/ai/composables/useBroadcastChannelInstance.md +97 -0
  101. package/dist/ai/composables/useConfirm.md +313 -0
  102. package/dist/ai/composables/useCountdown.md +86 -0
  103. package/dist/ai/composables/useId.md +60 -0
  104. package/dist/ai/composables/useMobile.md +85 -0
  105. package/dist/ai/composables/useToast.md +238 -0
  106. package/dist/ai/guides/agent-contract.md +165 -0
  107. package/dist/ai/guides/ai-router.md +113 -0
  108. package/dist/ai/guides/app-layout.md +318 -0
  109. package/dist/ai/guides/coherence-playbook.md +136 -0
  110. package/dist/ai/guides/component-picker.md +236 -0
  111. package/dist/ai/guides/design-language.md +478 -0
  112. package/dist/ai/guides/design-tokens.md +450 -0
  113. package/dist/ai/guides/fetch-items-playbook.md +161 -0
  114. package/dist/ai/guides/floating-bottom-panel.md +130 -0
  115. package/dist/ai/guides/icons-policy.md +257 -0
  116. package/dist/ai/guides/inertia-helpers.md +1443 -0
  117. package/dist/ai/guides/inline-edit-playbook.md +267 -0
  118. package/dist/ai/guides/installation-and-plugin-setup.md +440 -0
  119. package/dist/ai/guides/migration/components/bb-alert.md +37 -0
  120. package/dist/ai/guides/migration/components/bb-avatar.md +24 -0
  121. package/dist/ai/guides/migration/components/bb-badge.md +110 -0
  122. package/dist/ai/guides/migration/components/bb-breadcrumbs.md +26 -0
  123. package/dist/ai/guides/migration/components/bb-button.md +55 -0
  124. package/dist/ai/guides/migration/components/bb-checkbox-group.md +54 -0
  125. package/dist/ai/guides/migration/components/bb-checkbox.md +45 -0
  126. package/dist/ai/guides/migration/components/bb-chip.md +35 -0
  127. package/dist/ai/guides/migration/components/bb-collapsible.md +26 -0
  128. package/dist/ai/guides/migration/components/bb-color-input.md +23 -0
  129. package/dist/ai/guides/migration/components/bb-color-palette.md +31 -0
  130. package/dist/ai/guides/migration/components/bb-date-picker-input.md +84 -0
  131. package/dist/ai/guides/migration/components/bb-dialog.md +46 -0
  132. package/dist/ai/guides/migration/components/bb-dropdown-button.md +31 -0
  133. package/dist/ai/guides/migration/components/bb-dropdown.md +36 -0
  134. package/dist/ai/guides/migration/components/bb-dropzone.md +27 -0
  135. package/dist/ai/guides/migration/components/bb-icon.md +27 -0
  136. package/dist/ai/guides/migration/components/bb-offcanvas.md +63 -0
  137. package/dist/ai/guides/migration/components/bb-pagination.md +24 -0
  138. package/dist/ai/guides/migration/components/bb-popover.md +52 -0
  139. package/dist/ai/guides/migration/components/bb-rating.md +24 -0
  140. package/dist/ai/guides/migration/components/bb-select-popover.md +59 -0
  141. package/dist/ai/guides/migration/components/bb-select.md +69 -0
  142. package/dist/ai/guides/migration/components/bb-slider.md +25 -0
  143. package/dist/ai/guides/migration/components/bb-smooth-height.md +45 -0
  144. package/dist/ai/guides/migration/components/bb-spinner.md +23 -0
  145. package/dist/ai/guides/migration/components/bb-table.md +66 -0
  146. package/dist/ai/guides/migration/components/bb-tabs.md +47 -0
  147. package/dist/ai/guides/migration/components/bb-tag.md +29 -0
  148. package/dist/ai/guides/migration/components/bb-text-input.md +37 -0
  149. package/dist/ai/guides/migration/components/bb-toast.md +47 -0
  150. package/dist/ai/guides/migration/components/bb-tooltip.md +34 -0
  151. package/dist/ai/guides/migration/components/bb-tree.md +77 -0
  152. package/dist/ai/guides/migration/components/use-confirm.md +46 -0
  153. package/dist/ai/guides/migration/v2-to-v3.md +649 -0
  154. package/dist/ai/guides/options-items-playbook.md +222 -0
  155. package/dist/ai/guides/page-shell.md +113 -0
  156. package/dist/ai/guides/validated-forms.md +177 -0
  157. package/dist/ai/index.md +158 -32
  158. package/dist/ai/recipes/inertia/approvals-inbox.md +1635 -0
  159. package/dist/ai/recipes/inertia/inline-edit-workspace.md +1765 -0
  160. package/dist/ai/recipes/inertia/layout-scaffold.md +385 -0
  161. package/dist/ai/recipes/inertia/onboarding.md +1791 -0
  162. package/dist/ai/recipes/inertia/ownership-atlas.md +1327 -0
  163. package/dist/ai/recipes/inertia/record-form.md +1489 -0
  164. package/dist/ai/recipes/inertia/records-workspace.md +1416 -0
  165. package/dist/ai/recipes/inertia/upload-center.md +2003 -0
  166. package/dist/ai/recipes/inertia/wizard-form.md +1500 -0
  167. package/dist/ai/recipes/nuxt/approvals-inbox.md +1578 -0
  168. package/dist/ai/recipes/nuxt/inline-edit-workspace.md +1703 -0
  169. package/dist/ai/recipes/nuxt/layout-scaffold.md +385 -0
  170. package/dist/ai/recipes/nuxt/onboarding.md +1724 -0
  171. package/dist/ai/recipes/nuxt/record-form.md +1502 -0
  172. package/dist/ai/recipes/nuxt/records-workspace.md +1329 -0
  173. package/dist/ai/recipes/nuxt/upload-center.md +1886 -0
  174. package/dist/ai/recipes/nuxt/wizard-form.md +1509 -0
  175. package/dist/ai/recipes/vue/approvals-inbox.md +1496 -0
  176. package/dist/ai/recipes/vue/inline-edit-workspace.md +1594 -0
  177. package/dist/ai/recipes/vue/layout-scaffold.md +385 -0
  178. package/dist/ai/recipes/vue/onboarding.md +1679 -0
  179. package/dist/ai/recipes/vue/record-form.md +1586 -0
  180. package/dist/ai/recipes/vue/records-workspace.md +1245 -0
  181. package/dist/ai/recipes/vue/upload-center.md +1845 -0
  182. package/dist/ai/recipes/vue/wizard-form.md +1441 -0
  183. package/dist/ai/source/BbAccordion.md +123 -0
  184. package/dist/ai/source/BbAlert.md +401 -0
  185. package/dist/ai/source/BbAsterisk.md +32 -0
  186. package/dist/ai/source/BbAvatar.md +258 -0
  187. package/dist/ai/source/BbBadge.md +560 -0
  188. package/dist/ai/source/BbBadgeButton.md +490 -0
  189. package/dist/ai/source/BbBaseButton.md +682 -0
  190. package/dist/ai/source/BbBaseCheckbox.md +461 -0
  191. package/dist/ai/source/BbBaseCheckboxGroup.md +554 -0
  192. package/dist/ai/source/BbBaseCheckboxIcon.md +201 -0
  193. package/dist/ai/source/BbBaseColorInput.md +416 -0
  194. package/dist/ai/source/BbBaseColorPalette.md +934 -0
  195. package/dist/ai/source/BbBaseDatePicker.md +1001 -0
  196. package/dist/ai/source/BbBaseDatePickerInput.md +1785 -0
  197. package/dist/ai/source/BbBaseInputContainer.md +1210 -0
  198. package/dist/ai/source/BbBaseNumberInput.md +617 -0
  199. package/dist/ai/source/BbBaseRadio.md +377 -0
  200. package/dist/ai/source/BbBaseRadioGroup.md +533 -0
  201. package/dist/ai/source/BbBaseRadioIcon.md +153 -0
  202. package/dist/ai/source/BbBaseRating.md +573 -0
  203. package/dist/ai/source/BbBaseSelect.md +898 -0
  204. package/dist/ai/source/BbBaseSlider.md +1085 -0
  205. package/dist/ai/source/BbBaseSwitch.md +246 -0
  206. package/dist/ai/source/BbBaseSwitchGroup.md +302 -0
  207. package/dist/ai/source/BbBaseSwitchIcon.md +206 -0
  208. package/dist/ai/source/BbBaseTag.md +694 -0
  209. package/dist/ai/source/BbBaseTextInput.md +511 -0
  210. package/dist/ai/source/BbBaseTextarea.md +480 -0
  211. package/dist/ai/source/BbBaseTimePickerInput.md +1031 -0
  212. package/dist/ai/source/BbBreadcrumbs.md +815 -0
  213. package/dist/ai/source/BbButton.md +1006 -0
  214. package/dist/ai/source/BbCheckbox.md +326 -0
  215. package/dist/ai/source/BbCheckboxGroup.md +419 -0
  216. package/dist/ai/source/BbCollapsible.md +137 -0
  217. package/dist/ai/source/BbColorInput.md +322 -0
  218. package/dist/ai/source/BbColorPalette.md +371 -0
  219. package/dist/ai/source/BbConfirm.md +193 -0
  220. package/dist/ai/source/BbConfirmPortal.md +74 -0
  221. package/dist/ai/source/BbDatePicker.md +729 -0
  222. package/dist/ai/source/BbDatePickerInput.md +525 -0
  223. package/dist/ai/source/BbDialog.md +818 -0
  224. package/dist/ai/source/BbDropdown.md +2387 -0
  225. package/dist/ai/source/BbDropdownButton.md +315 -0
  226. package/dist/ai/source/BbDropdownGroup.md +1259 -0
  227. package/dist/ai/source/BbDropzone.md +864 -0
  228. package/dist/ai/source/BbForm.md +100 -0
  229. package/dist/ai/source/BbIcon.md +214 -0
  230. package/dist/ai/source/BbIndicator.md +298 -0
  231. package/dist/ai/source/BbNumberInput.md +374 -0
  232. package/dist/ai/source/BbOffCanvas.md +1266 -0
  233. package/dist/ai/source/BbPagination.md +835 -0
  234. package/dist/ai/source/BbPopover.md +860 -0
  235. package/dist/ai/source/BbProgress.md +140 -0
  236. package/dist/ai/source/BbRadio.md +303 -0
  237. package/dist/ai/source/BbRadioGroup.md +420 -0
  238. package/dist/ai/source/BbRating.md +369 -0
  239. package/dist/ai/source/BbSelect.md +688 -0
  240. package/dist/ai/source/BbSelectPopover.md +2234 -0
  241. package/dist/ai/source/BbSlider.md +378 -0
  242. package/dist/ai/source/BbSmoothHeight.md +265 -0
  243. package/dist/ai/source/BbSpinner.md +127 -0
  244. package/dist/ai/source/BbSwitch.md +175 -0
  245. package/dist/ai/source/BbSwitchGroup.md +240 -0
  246. package/dist/ai/source/BbTable.md +3433 -0
  247. package/dist/ai/source/BbTabs.md +403 -0
  248. package/dist/ai/source/BbTabsList.md +578 -0
  249. package/dist/ai/source/BbTabsPanes.md +368 -0
  250. package/dist/ai/source/BbTabsRoot.md +372 -0
  251. package/dist/ai/source/BbTag.md +390 -0
  252. package/dist/ai/source/BbTextInput.md +352 -0
  253. package/dist/ai/source/BbTextarea.md +337 -0
  254. package/dist/ai/source/BbTimePicker.md +595 -0
  255. package/dist/ai/source/BbTimePickerInput.md +376 -0
  256. package/dist/ai/source/BbToast.md +525 -0
  257. package/dist/ai/source/BbToastPortal.md +482 -0
  258. package/dist/ai/source/BbTooltip.md +522 -0
  259. package/dist/ai/source/BbTree.md +323 -0
  260. package/dist/ai/source/ChipsBox.md +201 -0
  261. package/dist/ai/source/ClearableButton.md +70 -0
  262. package/dist/ai/source/CommaBox.md +202 -0
  263. package/dist/ai/source/CommonInputWrapper.md +554 -0
  264. package/dist/ai/source/CommonPopover.md +616 -0
  265. package/dist/ai/source/ErrorIcon.md +43 -0
  266. package/dist/ai/source/FlatListBox.md +396 -0
  267. package/dist/ai/source/GroupedListBox.md +540 -0
  268. package/dist/ai/source/GuidesComponent.md +383 -0
  269. package/dist/ai/source/ListBox.md +238 -0
  270. package/dist/ai/source/OptionsContainer.md +191 -0
  271. package/dist/ai/source/WarningIcon.md +47 -0
  272. package/dist/alert-variants.d.ts +19 -0
  273. package/dist/assets/css/reset.css_inline.js +4 -0
  274. package/dist/assets/svgs/alert.svg_raw.js +4 -0
  275. package/dist/assets/svgs/calendar.svg_raw.js +4 -0
  276. package/dist/assets/svgs/check_stroke.svg_raw.js +4 -0
  277. package/dist/assets/svgs/chevron_down.svg_raw.js +4 -0
  278. package/dist/assets/svgs/chevron_right.svg_raw.js +4 -0
  279. package/dist/assets/svgs/clear.svg_raw.js +4 -0
  280. package/dist/assets/svgs/clock.svg_raw.js +4 -0
  281. package/dist/assets/svgs/error.svg_raw.js +4 -0
  282. package/dist/assets/svgs/search.svg_raw.js +4 -0
  283. package/dist/assets/svgs/sort.svg_raw.js +4 -0
  284. package/dist/assets/svgs/spinner.svg_raw.js +4 -0
  285. package/dist/assets/svgs/user.svg_raw.js +4 -0
  286. package/dist/badge-variants.d.ts +19 -0
  287. package/dist/button-variants.d.ts +21 -0
  288. package/dist/components/BbAccordion/BbAccordion.vue.d.ts +9 -3
  289. package/dist/components/BbAccordion/BbAccordion.vue.js +6 -0
  290. package/dist/components/BbAccordion/BbAccordion.vue_vue_type_script_setup_true_lang.js +66 -0
  291. package/dist/components/BbAccordion/types.d.ts +12 -8
  292. package/dist/components/BbAlert/BbAlert.vue.d.ts +12 -3
  293. package/dist/components/BbAlert/BbAlert.vue.js +6 -0
  294. package/dist/components/BbAlert/BbAlert.vue_vue_type_script_setup_true_lang.js +65 -0
  295. package/dist/components/BbAlert/types.d.ts +56 -12
  296. package/dist/components/BbAsterisk/BbAsterisk.vue.d.ts +3 -0
  297. package/dist/components/BbAsterisk/BbAsterisk.vue.js +6 -0
  298. package/dist/components/BbAsterisk/BbAsterisk.vue_vue_type_script_setup_true_lang.js +13 -0
  299. package/dist/components/BbAvatar/BbAvatar.vue.d.ts +5 -0
  300. package/dist/components/BbAvatar/BbAvatar.vue.js +6 -0
  301. package/dist/components/BbAvatar/BbAvatar.vue_vue_type_script_setup_true_lang.js +78 -0
  302. package/dist/components/BbAvatar/types.d.ts +6 -5
  303. package/dist/components/BbBadge/BadgeAppendIcon.vue.d.ts +3 -0
  304. package/dist/components/BbBadge/BadgeAppendIcon.vue.js +5 -0
  305. package/dist/components/BbBadge/BadgeAppendIcon.vue_vue_type_script_setup_true_lang.js +22 -0
  306. package/dist/components/BbBadge/BadgeBodyContent.vue.d.ts +15 -0
  307. package/dist/components/BbBadge/BadgeBodyContent.vue.js +5 -0
  308. package/dist/components/BbBadge/BadgeBodyContent.vue_vue_type_script_setup_true_lang.js +34 -0
  309. package/dist/components/BbBadge/BbBadge.vue.d.ts +8 -1
  310. package/dist/components/BbBadge/BbBadge.vue.js +6 -0
  311. package/dist/components/BbBadge/BbBadge.vue_vue_type_script_setup_true_lang.js +83 -0
  312. package/dist/components/BbBadge/BbBadgeButton.vue.d.ts +12 -0
  313. package/dist/components/BbBadge/BbBadgeButton.vue.js +5 -0
  314. package/dist/components/BbBadge/BbBadgeButton.vue_vue_type_script_setup_true_lang.js +54 -0
  315. package/dist/components/BbBadge/badgeButtonContext.d.ts +27 -0
  316. package/dist/components/BbBadge/badgeButtonContext.js +5 -0
  317. package/dist/components/BbBadge/types.d.ts +61 -16
  318. package/dist/components/BbBaseButton/BbBaseButton.vue.d.ts +13 -0
  319. package/dist/components/BbBaseButton/BbBaseButton.vue.js +6 -0
  320. package/dist/components/BbBaseButton/BbBaseButton.vue_vue_type_script_setup_true_lang.js +171 -0
  321. package/dist/components/BbBaseButton/RouterComponent.vue.js +5 -0
  322. package/dist/components/BbBaseButton/RouterComponent.vue_vue_type_script_setup_true_lang.js +29 -0
  323. package/dist/components/BbBaseButton/types.d.ts +191 -0
  324. package/dist/components/BbBaseButton/types.js +33 -0
  325. package/dist/components/BbBaseCheckbox/BbBaseCheckbox.vue.d.ts +40 -0
  326. package/dist/components/BbBaseCheckbox/BbBaseCheckbox.vue.js +6 -0
  327. package/dist/components/BbBaseCheckbox/BbBaseCheckbox.vue_vue_type_script_setup_true_lang.js +145 -0
  328. package/dist/components/BbBaseCheckbox/types.d.ts +224 -0
  329. package/dist/components/BbBaseCheckboxGroup/BbBaseCheckboxGroup.vue.d.ts +19 -0
  330. package/dist/components/BbBaseCheckboxGroup/BbBaseCheckboxGroup.vue.js +6 -0
  331. package/dist/components/BbBaseCheckboxGroup/BbBaseCheckboxGroup.vue_vue_type_script_setup_true_lang.js +190 -0
  332. package/dist/components/BbBaseCheckboxGroup/types.d.ts +257 -0
  333. package/dist/components/BbBaseCheckboxIcon/BbBaseCheckboxIcon.vue.d.ts +4 -0
  334. package/dist/components/BbBaseCheckboxIcon/BbBaseCheckboxIcon.vue.js +6 -0
  335. package/dist/components/BbBaseCheckboxIcon/BbBaseCheckboxIcon.vue_vue_type_script_setup_true_lang.js +43 -0
  336. package/dist/components/BbBaseCheckboxIcon/types.d.ts +47 -0
  337. package/dist/components/BbBaseColorInput/BbBaseColorInput.vue.d.ts +42 -0
  338. package/dist/components/BbBaseColorInput/BbBaseColorInput.vue.js +6 -0
  339. package/dist/components/BbBaseColorInput/BbBaseColorInput.vue_vue_type_script_setup_true_lang.js +178 -0
  340. package/dist/components/BbBaseColorInput/types.d.ts +210 -0
  341. package/dist/components/BbBaseColorPalette/BbBaseColorPalette.vue.d.ts +13 -0
  342. package/dist/components/BbBaseColorPalette/BbBaseColorPalette.vue.js +6 -0
  343. package/dist/components/BbBaseColorPalette/BbBaseColorPalette.vue_vue_type_script_setup_true_lang.js +395 -0
  344. package/dist/components/BbBaseColorPalette/types.d.ts +40 -0
  345. package/dist/components/BbBaseDatePicker/BbBaseDatePicker.vue.js +6 -0
  346. package/dist/components/BbBaseDatePicker/BbBaseDatePicker.vue_vue_type_script_setup_true_lang.js +300 -0
  347. package/dist/components/BbBaseDatePicker/BbBaseDatePickerInputDaySelector.vue.d.ts +44 -0
  348. package/dist/components/BbBaseDatePicker/BbBaseDatePickerInputDaySelector.vue.js +5 -0
  349. package/dist/components/BbBaseDatePicker/BbBaseDatePickerInputDaySelector.vue_vue_type_script_setup_true_lang.js +310 -0
  350. package/dist/components/BbBaseDatePicker/BbBaseDatePickerMonthSelector.vue.d.ts +5 -0
  351. package/dist/components/BbBaseDatePicker/BbBaseDatePickerMonthSelector.vue.js +5 -0
  352. package/dist/components/BbBaseDatePicker/BbBaseDatePickerMonthSelector.vue_vue_type_script_setup_true_lang.js +63 -0
  353. package/dist/components/BbBaseDatePicker/BbBaseDatePickerYearSelector.vue.d.ts +5 -0
  354. package/dist/components/BbBaseDatePicker/BbBaseDatePickerYearSelector.vue.js +5 -0
  355. package/dist/components/BbBaseDatePicker/BbBaseDatePickerYearSelector.vue_vue_type_script_setup_true_lang.js +75 -0
  356. package/dist/components/BbBaseDatePicker/typeahead.d.ts +112 -0
  357. package/dist/components/BbBaseDatePicker/typeahead.js +37 -0
  358. package/dist/components/BbBaseDatePicker/types.d.ts +97 -0
  359. package/dist/components/BbBaseDatePicker/useDatePickerContext.d.ts +58 -0
  360. package/dist/components/BbBaseDatePicker/useDatePickerContext.js +11 -0
  361. package/dist/components/BbBaseDatePickerInput/BbBaseDatePickerInput.vue.d.ts +30 -0
  362. package/dist/components/BbBaseDatePickerInput/BbBaseDatePickerInput.vue.js +6 -0
  363. package/dist/components/BbBaseDatePickerInput/BbBaseDatePickerInput.vue_vue_type_script_setup_true_lang.js +716 -0
  364. package/dist/components/BbBaseDatePickerInput/BbBaseDatePickerTimeSelector.vue.d.ts +30 -0
  365. package/dist/components/BbBaseDatePickerInput/BbBaseDatePickerTimeSelector.vue.js +6 -0
  366. package/dist/components/BbBaseDatePickerInput/BbBaseDatePickerTimeSelector.vue_vue_type_script_setup_true_lang.js +204 -0
  367. package/dist/components/BbBaseDatePickerInput/types.d.ts +311 -0
  368. package/dist/components/BbBaseInputContainer/BbBaseInputContainer.vue.d.ts +17 -0
  369. package/dist/components/BbBaseInputContainer/BbBaseInputContainer.vue.js +6 -0
  370. package/dist/components/BbBaseInputContainer/BbBaseInputContainer.vue_vue_type_script_setup_true_lang.js +191 -0
  371. package/dist/components/BbBaseInputContainer/types.d.ts +197 -0
  372. package/dist/components/BbBaseNumberInput/BbBaseNumberInput.vue.d.ts +52 -0
  373. package/dist/components/BbBaseNumberInput/BbBaseNumberInput.vue.js +6 -0
  374. package/dist/components/BbBaseNumberInput/BbBaseNumberInput.vue_vue_type_script_setup_true_lang.js +215 -0
  375. package/dist/components/BbBaseNumberInput/types.d.ts +211 -0
  376. package/dist/components/BbBaseRadio/BbBaseRadio.vue.d.ts +33 -0
  377. package/dist/components/BbBaseRadio/BbBaseRadio.vue.js +6 -0
  378. package/dist/components/BbBaseRadio/BbBaseRadio.vue_vue_type_script_setup_true_lang.js +114 -0
  379. package/dist/components/BbBaseRadio/types.d.ts +179 -0
  380. package/dist/components/BbBaseRadioGroup/BbBaseRadioGroup.vue.d.ts +19 -0
  381. package/dist/components/BbBaseRadioGroup/BbBaseRadioGroup.vue.js +6 -0
  382. package/dist/components/BbBaseRadioGroup/BbBaseRadioGroup.vue_vue_type_script_setup_true_lang.js +177 -0
  383. package/dist/components/BbBaseRadioGroup/types.d.ts +223 -0
  384. package/dist/components/BbBaseRadioIcon/BbBaseRadioIcon.vue.d.ts +4 -0
  385. package/dist/components/BbBaseRadioIcon/BbBaseRadioIcon.vue.js +6 -0
  386. package/dist/components/BbBaseRadioIcon/BbBaseRadioIcon.vue_vue_type_script_setup_true_lang.js +28 -0
  387. package/dist/components/BbBaseRadioIcon/types.d.ts +41 -0
  388. package/dist/components/BbBaseRating/BbBaseRating.vue.d.ts +38 -0
  389. package/dist/components/BbBaseRating/BbBaseRating.vue.js +6 -0
  390. package/dist/components/BbBaseRating/BbBaseRating.vue_vue_type_script_setup_true_lang.js +184 -0
  391. package/dist/components/BbBaseRating/types.d.ts +168 -0
  392. package/dist/components/BbBaseSelect/BbBaseSelect.vue.d.ts +19 -0
  393. package/dist/components/BbBaseSelect/BbBaseSelect.vue.js +6 -0
  394. package/dist/components/BbBaseSelect/BbBaseSelect.vue_vue_type_script_setup_true_lang.js +307 -0
  395. package/dist/components/BbBaseSelect/types.d.ts +297 -0
  396. package/dist/components/BbBaseSlider/BbBaseSlider.vue.d.ts +35 -0
  397. package/dist/components/BbBaseSlider/BbBaseSlider.vue.js +6 -0
  398. package/dist/components/BbBaseSlider/BbBaseSlider.vue_vue_type_script_setup_true_lang.js +324 -0
  399. package/dist/components/BbBaseSlider/types.d.ts +200 -0
  400. package/dist/components/BbBaseSwitch/BbBaseSwitch.vue.d.ts +35 -0
  401. package/dist/components/BbBaseSwitch/BbBaseSwitch.vue.js +6 -0
  402. package/dist/components/BbBaseSwitch/BbBaseSwitch.vue_vue_type_script_setup_true_lang.js +146 -0
  403. package/dist/components/BbBaseSwitch/types.d.ts +10 -0
  404. package/dist/components/BbBaseSwitchGroup/BbBaseSwitchGroup.vue.d.ts +19 -0
  405. package/dist/components/BbBaseSwitchGroup/BbBaseSwitchGroup.vue.js +6 -0
  406. package/dist/components/BbBaseSwitchGroup/BbBaseSwitchGroup.vue_vue_type_script_setup_true_lang.js +190 -0
  407. package/dist/components/BbBaseSwitchGroup/types.d.ts +8 -0
  408. package/dist/components/BbBaseSwitchIcon/BbBaseSwitchIcon.vue.d.ts +4 -0
  409. package/dist/components/BbBaseSwitchIcon/BbBaseSwitchIcon.vue.js +6 -0
  410. package/dist/components/BbBaseSwitchIcon/BbBaseSwitchIcon.vue_vue_type_script_setup_true_lang.js +30 -0
  411. package/dist/components/BbBaseSwitchIcon/types.d.ts +48 -0
  412. package/dist/components/BbBaseTag/BbBaseTag.vue.d.ts +50 -0
  413. package/dist/components/BbBaseTag/BbBaseTag.vue.js +6 -0
  414. package/dist/components/BbBaseTag/BbBaseTag.vue_vue_type_script_setup_true_lang.js +266 -0
  415. package/dist/components/BbBaseTag/types.d.ts +160 -0
  416. package/dist/components/BbBaseTextInput/BbBaseTextInput.vue.d.ts +45 -0
  417. package/dist/components/BbBaseTextInput/BbBaseTextInput.vue.js +6 -0
  418. package/dist/components/BbBaseTextInput/BbBaseTextInput.vue_vue_type_script_setup_true_lang.js +200 -0
  419. package/dist/components/BbBaseTextInput/types.d.ts +209 -0
  420. package/dist/components/BbBaseTextarea/BbBaseTextarea.vue.d.ts +39 -0
  421. package/dist/components/BbBaseTextarea/BbBaseTextarea.vue.js +6 -0
  422. package/dist/components/BbBaseTextarea/BbBaseTextarea.vue_vue_type_script_setup_true_lang.js +175 -0
  423. package/dist/components/BbBaseTextarea/types.d.ts +170 -0
  424. package/dist/components/BbBaseTimePickerInput/BbBaseTimePickerInput.vue.d.ts +27 -0
  425. package/dist/components/BbBaseTimePickerInput/BbBaseTimePickerInput.vue.js +6 -0
  426. package/dist/components/BbBaseTimePickerInput/BbBaseTimePickerInput.vue_vue_type_script_setup_true_lang.js +522 -0
  427. package/dist/components/BbBaseTimePickerInput/types.d.ts +151 -0
  428. package/dist/components/BbBreadcrumbs/BbBreadcrumbs.vue.d.ts +0 -1
  429. package/dist/components/BbBreadcrumbs/BbBreadcrumbs.vue.js +6 -0
  430. package/dist/components/BbBreadcrumbs/BbBreadcrumbs.vue_vue_type_script_setup_true_lang.js +224 -0
  431. package/dist/components/BbBreadcrumbs/estimateBreadcrumbItemWidth.js +47 -0
  432. package/dist/components/BbBreadcrumbs/types.d.ts +37 -22
  433. package/dist/components/BbButton/BbButton.vue.d.ts +6 -5
  434. package/dist/components/BbButton/BbButton.vue.js +6 -0
  435. package/dist/components/BbButton/BbButton.vue_vue_type_script_setup_true_lang.js +181 -0
  436. package/dist/components/BbButton/types.d.ts +48 -47
  437. package/dist/components/BbCheckbox/BbCheckbox.vue.d.ts +4 -3
  438. package/dist/components/BbCheckbox/BbCheckbox.vue.js +6 -0
  439. package/dist/components/BbCheckbox/BbCheckbox.vue_vue_type_script_setup_true_lang.js +146 -0
  440. package/dist/components/BbCheckbox/types.d.ts +31 -10
  441. package/dist/components/BbCheckboxGroup/BbCheckboxGroup.vue.d.ts +2 -13
  442. package/dist/components/BbCheckboxGroup/BbCheckboxGroup.vue.js +6 -0
  443. package/dist/components/BbCheckboxGroup/BbCheckboxGroup.vue_vue_type_script_setup_true_lang.js +190 -0
  444. package/dist/components/BbCheckboxGroup/types.d.ts +51 -23
  445. package/dist/components/BbCollapsible/BbCollapsible.vue.d.ts +2 -1
  446. package/dist/components/BbCollapsible/BbCollapsible.vue.js +6 -0
  447. package/dist/components/BbCollapsible/BbCollapsible.vue_vue_type_script_setup_true_lang.js +31 -0
  448. package/dist/components/BbCollapsible/types.d.ts +13 -8
  449. package/dist/components/BbColorInput/BbColorInput.vue.d.ts +10 -1
  450. package/dist/components/BbColorInput/BbColorInput.vue.js +6 -0
  451. package/dist/components/BbColorInput/BbColorInput.vue_vue_type_script_setup_true_lang.js +177 -0
  452. package/dist/components/BbColorInput/types.d.ts +44 -11
  453. package/dist/components/BbColorPalette/BbColorPalette.vue.d.ts +5 -8
  454. package/dist/components/BbColorPalette/BbColorPalette.vue.js +5 -0
  455. package/dist/components/BbColorPalette/BbColorPalette.vue_vue_type_script_setup_true_lang.js +126 -0
  456. package/dist/components/BbColorPalette/types.d.ts +71 -52
  457. package/dist/components/BbConfirm/BbConfirm.vue.js +6 -0
  458. package/dist/components/BbConfirm/BbConfirm.vue_vue_type_script_setup_true_lang.js +138 -0
  459. package/dist/components/BbConfirm/BbConfirmPortal.vue.d.ts +5 -6
  460. package/dist/components/BbConfirm/BbConfirmPortal.vue.js +5 -0
  461. package/dist/components/BbConfirm/BbConfirmPortal.vue_vue_type_script_setup_true_lang.js +19 -0
  462. package/dist/components/BbDatePicker/BbDatePicker.vue.d.ts +37 -0
  463. package/dist/components/BbDatePicker/BbDatePicker.vue.js +6 -0
  464. package/dist/components/BbDatePicker/BbDatePicker.vue_vue_type_script_setup_true_lang.js +319 -0
  465. package/dist/components/BbDatePicker/types.d.ts +159 -0
  466. package/dist/components/BbDatePickerInput/BbDatePickerInput.vue.d.ts +3 -1
  467. package/dist/components/BbDatePickerInput/BbDatePickerInput.vue.js +6 -0
  468. package/dist/components/BbDatePickerInput/BbDatePickerInput.vue_vue_type_script_setup_true_lang.js +179 -0
  469. package/dist/components/BbDatePickerInput/types.d.ts +134 -16
  470. package/dist/components/BbDialog/BbDialog.vue.d.ts +14 -6
  471. package/dist/components/BbDialog/BbDialog.vue.js +6 -0
  472. package/dist/components/BbDialog/BbDialog.vue_vue_type_script_setup_true_lang.js +214 -0
  473. package/dist/components/BbDialog/types.d.ts +146 -1
  474. package/dist/components/BbDialog/useDialogStack.d.ts +5 -0
  475. package/dist/components/BbDialog/useDialogStack.js +20 -0
  476. package/dist/components/BbDropdown/AdaptiveDropdown.vue.d.ts +24 -0
  477. package/dist/components/BbDropdown/AdaptiveDropdown.vue.js +6 -0
  478. package/dist/components/BbDropdown/AdaptiveDropdown.vue_vue_type_script_setup_true_lang.js +116 -0
  479. package/dist/components/BbDropdown/BbDropdown.vue.d.ts +14 -7
  480. package/dist/components/BbDropdown/BbDropdown.vue.js +6 -0
  481. package/dist/components/BbDropdown/BbDropdown.vue_vue_type_script_setup_true_lang.js +561 -0
  482. package/dist/components/BbDropdown/BbDropdownGroup.vue.d.ts +44 -0
  483. package/dist/components/BbDropdown/BbDropdownGroup.vue.js +5 -0
  484. package/dist/components/BbDropdown/BbDropdownGroup.vue_vue_type_script_setup_true_lang.js +36 -0
  485. package/dist/components/BbDropdown/BbDropdownList.vue.d.ts +31 -0
  486. package/dist/components/BbDropdown/BbDropdownList.vue.js +6 -0
  487. package/dist/components/BbDropdown/BbDropdownList.vue_vue_type_script_setup_true_lang.js +470 -0
  488. package/dist/components/BbDropdown/DropdownPipelineResolver.vue.d.ts +16 -0
  489. package/dist/components/BbDropdown/DropdownPipelineResolver.vue.js +5 -0
  490. package/dist/components/BbDropdown/DropdownPipelineResolver.vue_vue_type_script_setup_true_lang.js +168 -0
  491. package/dist/components/BbDropdown/normalizeGroups.d.ts +18 -0
  492. package/dist/components/BbDropdown/normalizeGroups.js +46 -0
  493. package/dist/components/BbDropdown/types.d.ts +468 -46
  494. package/dist/components/BbDropdown/types.js +4 -0
  495. package/dist/components/BbDropdown/useDropdownContext.d.ts +89 -0
  496. package/dist/components/BbDropdown/useDropdownContext.js +9 -0
  497. package/dist/components/BbDropdown/useDropdownGroupRegistry.d.ts +108 -0
  498. package/dist/components/BbDropdown/useDropdownGroupRegistry.js +5 -0
  499. package/dist/components/BbDropdownButton/BbDropdownButton.vue.d.ts +3 -3
  500. package/dist/components/BbDropdownButton/BbDropdownButton.vue.js +6 -0
  501. package/dist/components/BbDropdownButton/BbDropdownButton.vue_vue_type_script_setup_true_lang.js +119 -0
  502. package/dist/components/BbDropdownButton/types.d.ts +47 -52
  503. package/dist/components/BbDropzone/BbDropzone.vue.d.ts +5 -4
  504. package/dist/components/BbDropzone/BbDropzone.vue.js +6 -0
  505. package/dist/components/BbDropzone/BbDropzone.vue_vue_type_script_setup_true_lang.js +308 -0
  506. package/dist/components/BbDropzone/types.d.ts +77 -8
  507. package/dist/components/BbIcon/BbIcon.vue.d.ts +3 -2
  508. package/dist/components/BbIcon/BbIcon.vue.js +6 -0
  509. package/dist/components/BbIcon/BbIcon.vue_vue_type_script_setup_true_lang.js +65 -0
  510. package/dist/components/BbIcon/types.d.ts +6 -19
  511. package/dist/components/BbIndicator/BbIndicator.vue.d.ts +14 -0
  512. package/dist/components/BbIndicator/BbIndicator.vue.js +6 -0
  513. package/dist/components/BbIndicator/BbIndicator.vue_vue_type_script_setup_true_lang.js +56 -0
  514. package/dist/components/BbIndicator/types.d.ts +49 -0
  515. package/dist/components/BbNumberInput/BbNumberInput.vue.d.ts +12 -6
  516. package/dist/components/BbNumberInput/BbNumberInput.vue.js +6 -0
  517. package/dist/components/BbNumberInput/BbNumberInput.vue_vue_type_script_setup_true_lang.js +194 -0
  518. package/dist/components/BbNumberInput/types.d.ts +40 -4
  519. package/dist/components/BbOffCanvas/BbOffCanvas.vue.d.ts +16 -10
  520. package/dist/components/BbOffCanvas/BbOffCanvas.vue.js +6 -0
  521. package/dist/components/BbOffCanvas/BbOffCanvas.vue_vue_type_script_setup_true_lang.js +284 -0
  522. package/dist/components/BbOffCanvas/types.d.ts +71 -39
  523. package/dist/components/BbOffCanvas/useOffCanvasStack.d.ts +25 -0
  524. package/dist/components/BbOffCanvas/useOffCanvasStack.js +68 -0
  525. package/dist/components/BbPagination/BbPagination.vue.d.ts +9 -4
  526. package/dist/components/BbPagination/BbPagination.vue.js +6 -0
  527. package/dist/components/BbPagination/BbPagination.vue_vue_type_script_setup_true_lang.js +244 -0
  528. package/dist/components/BbPagination/paginationFit.d.ts +38 -0
  529. package/dist/components/BbPagination/paginationFit.js +13 -0
  530. package/dist/components/BbPagination/types.d.ts +51 -16
  531. package/dist/components/BbPopover/BbPopover.vue.d.ts +16 -15
  532. package/dist/components/BbPopover/BbPopover.vue.js +6 -0
  533. package/dist/components/BbPopover/BbPopover.vue_vue_type_script_setup_true_lang.js +309 -0
  534. package/dist/components/BbPopover/escapeStack.d.ts +6 -0
  535. package/dist/components/BbPopover/escapeStack.js +10 -0
  536. package/dist/components/BbPopover/types.d.ts +90 -31
  537. package/dist/components/BbProgress/BbProgress.vue.d.ts +1 -0
  538. package/dist/components/BbProgress/BbProgress.vue.js +6 -0
  539. package/dist/components/BbProgress/BbProgress.vue_vue_type_script_setup_true_lang.js +36 -0
  540. package/dist/components/BbProgress/types.d.ts +15 -1
  541. package/dist/components/BbRadio/BbRadio.vue.d.ts +5 -3
  542. package/dist/components/BbRadio/BbRadio.vue.js +6 -0
  543. package/dist/components/BbRadio/BbRadio.vue_vue_type_script_setup_true_lang.js +133 -0
  544. package/dist/components/BbRadio/types.d.ts +32 -9
  545. package/dist/components/BbRadioGroup/BbRadioGroup.vue.d.ts +4 -14
  546. package/dist/components/BbRadioGroup/BbRadioGroup.vue.js +6 -0
  547. package/dist/components/BbRadioGroup/BbRadioGroup.vue_vue_type_script_setup_true_lang.js +186 -0
  548. package/dist/components/BbRadioGroup/types.d.ts +48 -22
  549. package/dist/components/BbRating/BbRating.vue.d.ts +4 -1
  550. package/dist/components/BbRating/BbRating.vue.js +6 -0
  551. package/dist/components/BbRating/BbRating.vue_vue_type_script_setup_true_lang.js +150 -0
  552. package/dist/components/BbRating/types.d.ts +44 -10
  553. package/dist/components/BbSelect/BbSelect.vue.d.ts +2 -11
  554. package/dist/components/BbSelect/BbSelect.vue.js +6 -0
  555. package/dist/components/BbSelect/BbSelect.vue_vue_type_script_setup_true_lang.js +241 -0
  556. package/dist/components/BbSelect/types.d.ts +112 -59
  557. package/dist/components/BbSelectPopover/BbSelectPopover.vue.d.ts +1 -10
  558. package/dist/components/BbSelectPopover/BbSelectPopover.vue.js +6 -0
  559. package/dist/components/BbSelectPopover/BbSelectPopover.vue_vue_type_script_setup_true_lang.js +639 -0
  560. package/dist/components/BbSelectPopover/types.d.ts +197 -105
  561. package/dist/components/BbSlider/BbSlider.vue.d.ts +3 -6
  562. package/dist/components/BbSlider/BbSlider.vue.js +6 -0
  563. package/dist/components/BbSlider/BbSlider.vue_vue_type_script_setup_true_lang.js +166 -0
  564. package/dist/components/BbSlider/types.d.ts +44 -13
  565. package/dist/components/BbSmoothHeight/BbSmoothHeight.vue.d.ts +3 -1
  566. package/dist/components/BbSmoothHeight/BbSmoothHeight.vue.js +6 -0
  567. package/dist/components/BbSmoothHeight/BbSmoothHeight.vue_vue_type_script_setup_true_lang.js +79 -0
  568. package/dist/components/BbSmoothHeight/types.d.ts +17 -2
  569. package/dist/components/BbSpinner/BbSpinner.vue.d.ts +1 -1
  570. package/dist/components/BbSpinner/BbSpinner.vue.js +6 -0
  571. package/dist/components/BbSpinner/BbSpinner.vue_vue_type_script_setup_true_lang.js +30 -0
  572. package/dist/components/BbSpinner/types.d.ts +10 -3
  573. package/dist/components/BbSwitch/BbSwitch.vue.d.ts +5 -3
  574. package/dist/components/BbSwitch/BbSwitch.vue.js +6 -0
  575. package/dist/components/BbSwitch/BbSwitch.vue_vue_type_script_setup_true_lang.js +142 -0
  576. package/dist/components/BbSwitch/types.d.ts +3 -1
  577. package/dist/components/BbSwitchGroup/BbSwitchGroup.vue.d.ts +4 -14
  578. package/dist/components/BbSwitchGroup/BbSwitchGroup.vue.js +6 -0
  579. package/dist/components/BbSwitchGroup/BbSwitchGroup.vue_vue_type_script_setup_true_lang.js +190 -0
  580. package/dist/components/BbSwitchGroup/types.d.ts +3 -22
  581. package/dist/components/BbTable/BbTable.vue.d.ts +58 -31
  582. package/dist/components/BbTable/BbTable.vue.js +6 -0
  583. package/dist/components/BbTable/BbTable.vue_vue_type_script_setup_true_lang.js +900 -0
  584. package/dist/components/BbTable/types.d.ts +213 -37
  585. package/dist/components/BbTable/utils.d.ts +9 -1
  586. package/dist/components/BbTable/utils.js +53 -0
  587. package/dist/components/BbTabs/BbTabs.vue.d.ts +20 -0
  588. package/dist/components/BbTabs/BbTabs.vue.js +6 -0
  589. package/dist/components/BbTabs/BbTabs.vue_vue_type_script_setup_true_lang.js +64 -0
  590. package/dist/components/BbTabs/BbTabsList.vue.d.ts +19 -0
  591. package/dist/components/BbTabs/BbTabsList.vue.js +6 -0
  592. package/dist/components/BbTabs/BbTabsList.vue_vue_type_script_setup_true_lang.js +123 -0
  593. package/dist/components/BbTabs/BbTabsPanes.vue.d.ts +16 -0
  594. package/dist/components/BbTabs/BbTabsPanes.vue.js +6 -0
  595. package/dist/components/BbTabs/BbTabsPanes.vue_vue_type_script_setup_true_lang.js +35 -0
  596. package/dist/components/BbTabs/BbTabsRoot.vue.d.ts +20 -0
  597. package/dist/components/BbTabs/BbTabsRoot.vue.js +5 -0
  598. package/dist/components/BbTabs/BbTabsRoot.vue_vue_type_script_setup_true_lang.js +55 -0
  599. package/dist/components/BbTabs/types.d.ts +264 -0
  600. package/dist/components/BbTag/BbTag.vue.d.ts +19 -6
  601. package/dist/components/BbTag/BbTag.vue.js +6 -0
  602. package/dist/components/BbTag/BbTag.vue_vue_type_script_setup_true_lang.js +187 -0
  603. package/dist/components/BbTag/types.d.ts +55 -17
  604. package/dist/components/BbTextInput/BbTextInput.vue.d.ts +10 -1
  605. package/dist/components/BbTextInput/BbTextInput.vue.js +6 -0
  606. package/dist/components/BbTextInput/BbTextInput.vue_vue_type_script_setup_true_lang.js +195 -0
  607. package/dist/components/BbTextInput/types.d.ts +31 -4
  608. package/dist/components/BbTextarea/BbTextarea.vue.d.ts +10 -1
  609. package/dist/components/BbTextarea/BbTextarea.vue.js +6 -0
  610. package/dist/components/BbTextarea/BbTextarea.vue_vue_type_script_setup_true_lang.js +178 -0
  611. package/dist/components/BbTextarea/types.d.ts +33 -2
  612. package/dist/components/BbTimePicker/BbTimePicker.vue.d.ts +33 -0
  613. package/dist/components/BbTimePicker/BbTimePicker.vue.js +6 -0
  614. package/dist/components/BbTimePicker/BbTimePicker.vue_vue_type_script_setup_true_lang.js +244 -0
  615. package/dist/components/BbTimePicker/types.d.ts +133 -0
  616. package/dist/components/BbTimePickerInput/BbTimePickerInput.vue.d.ts +25 -0
  617. package/dist/components/BbTimePickerInput/BbTimePickerInput.vue.js +6 -0
  618. package/dist/components/BbTimePickerInput/BbTimePickerInput.vue_vue_type_script_setup_true_lang.js +157 -0
  619. package/dist/components/BbTimePickerInput/types.d.ts +174 -0
  620. package/dist/components/BbToast/BbToast.vue.d.ts +2 -3
  621. package/dist/components/BbToast/BbToast.vue.js +6 -0
  622. package/dist/components/BbToast/BbToast.vue_vue_type_script_setup_true_lang.js +39 -0
  623. package/dist/components/BbToast/BbToastMessage.vue.d.ts +17 -8
  624. package/dist/components/BbToast/BbToastMessage.vue.js +5 -0
  625. package/dist/components/BbToast/BbToastMessage.vue_vue_type_script_setup_true_lang.js +170 -0
  626. package/dist/components/BbToast/BbToastPortal.vue.d.ts +30 -0
  627. package/dist/components/BbToast/BbToastPortal.vue.js +5 -0
  628. package/dist/components/BbToast/BbToastPortal.vue_vue_type_script_setup_true_lang.js +19 -0
  629. package/dist/components/BbToast/BbToastRegion.vue.d.ts +8 -0
  630. package/dist/components/BbToast/BbToastRegion.vue.js +5 -0
  631. package/dist/components/BbToast/BbToastRegion.vue_vue_type_script_setup_true_lang.js +100 -0
  632. package/dist/components/BbToast/types.d.ts +69 -5
  633. package/dist/components/BbTooltip/BbTooltip.vue.d.ts +10 -3
  634. package/dist/components/BbTooltip/BbTooltip.vue.js +6 -0
  635. package/dist/components/BbTooltip/BbTooltip.vue_vue_type_script_setup_true_lang.js +160 -0
  636. package/dist/components/BbTooltip/types.d.ts +69 -11
  637. package/dist/components/BbTree/BbTree.vue.d.ts +28 -13
  638. package/dist/components/BbTree/BbTree.vue.js +6 -0
  639. package/dist/components/BbTree/BbTree.vue_vue_type_script_setup_true_lang.js +55 -0
  640. package/dist/components/BbTree/BbTreeLevel.vue.d.ts +19 -0
  641. package/dist/components/BbTree/BbTreeLevel.vue.js +5 -0
  642. package/dist/components/BbTree/BbTreeLevel.vue_vue_type_script_setup_true_lang.js +94 -0
  643. package/dist/components/BbTree/context.d.ts +17 -0
  644. package/dist/components/BbTree/context.js +4 -0
  645. package/dist/components/BbTree/types.d.ts +94 -41
  646. package/dist/components/ChipsBox/ChipsBox.vue.d.ts +2 -1
  647. package/dist/components/ChipsBox/ChipsBox.vue.js +5 -0
  648. package/dist/components/ChipsBox/ChipsBox.vue_vue_type_script_setup_true_lang.js +98 -0
  649. package/dist/components/ChipsBox/types.d.ts +12 -5
  650. package/dist/components/ClearableButton/ClearableButton.vue.d.ts +2 -1
  651. package/dist/components/ClearableButton/ClearableButton.vue.js +6 -0
  652. package/dist/components/ClearableButton/ClearableButton.vue_vue_type_script_setup_true_lang.js +19 -0
  653. package/dist/components/ClearableButton/types.d.ts +7 -1
  654. package/dist/components/CloseIcon/CloseButton.vue.d.ts +5 -0
  655. package/dist/components/CloseIcon/CloseButton.vue.js +7 -0
  656. package/dist/components/CloseIcon/CloseButton.vue_vue_type_script_setup_true_lang.js +23 -0
  657. package/dist/components/CloseIcon/types.d.ts +2 -0
  658. package/dist/components/CommaBox/CommaBox.vue.d.ts +2 -1
  659. package/dist/components/CommaBox/CommaBox.vue.js +6 -0
  660. package/dist/components/CommaBox/CommaBox.vue_vue_type_script_setup_true_lang.js +81 -0
  661. package/dist/components/CommaBox/types.d.ts +6 -7
  662. package/dist/components/CommonInputWrapper/CommonInputWrapper.vue.d.ts +19 -0
  663. package/dist/components/CommonInputWrapper/CommonInputWrapper.vue.js +6 -0
  664. package/dist/components/CommonInputWrapper/CommonInputWrapper.vue_vue_type_script_setup_true_lang.js +107 -0
  665. package/dist/components/CommonInputWrapper/types.d.ts +96 -0
  666. package/dist/components/CommonPopover/CommonPopover.vue.d.ts +9 -3
  667. package/dist/components/CommonPopover/CommonPopover.vue.js +6 -0
  668. package/dist/components/CommonPopover/CommonPopover.vue_vue_type_script_setup_true_lang.js +160 -0
  669. package/dist/components/CommonPopover/types.d.ts +65 -16
  670. package/dist/components/ErrorIcon/ErrorIcon.vue.d.ts +2 -0
  671. package/dist/components/ErrorIcon/ErrorIcon.vue.js +6 -0
  672. package/dist/components/ErrorIcon/ErrorIcon.vue_vue_type_script_setup_true_lang.js +16 -0
  673. package/dist/components/FlatListBox/FlatListBox.vue.d.ts +2 -5
  674. package/dist/components/FlatListBox/FlatListBox.vue.js +5 -0
  675. package/dist/components/FlatListBox/FlatListBox.vue_vue_type_script_setup_true_lang.js +167 -0
  676. package/dist/components/FlatListBox/types.d.ts +1 -1
  677. package/dist/components/GroupedListBox/GroupedListBox.vue.d.ts +2 -5
  678. package/dist/components/GroupedListBox/GroupedListBox.vue.js +5 -0
  679. package/dist/components/GroupedListBox/GroupedListBox.vue_vue_type_script_setup_true_lang.js +218 -0
  680. package/dist/components/ListBox/ListBox.vue.d.ts +3 -6
  681. package/dist/components/ListBox/ListBox.vue.js +5 -0
  682. package/dist/components/ListBox/ListBox.vue_vue_type_script_setup_true_lang.js +112 -0
  683. package/dist/components/ListBox/types.d.ts +1 -1
  684. package/dist/components/OptionsContainer/OptionsContainer.vue.d.ts +1 -0
  685. package/dist/components/OptionsContainer/OptionsContainer.vue.js +5 -0
  686. package/dist/components/OptionsContainer/OptionsContainer.vue_vue_type_script_setup_true_lang.js +52 -0
  687. package/dist/components/OptionsContainer/types.d.ts +14 -24
  688. package/dist/components/Transitions/ScaleFade.vue.d.ts +2 -2
  689. package/dist/components/Transitions/ScaleFade.vue.js +5 -0
  690. package/dist/components/Transitions/ScaleFade.vue_vue_type_script_setup_true_lang.js +47 -0
  691. package/dist/components/Transitions/Slide.vue.d.ts +15 -0
  692. package/dist/components/Transitions/Slide.vue.js +7 -0
  693. package/dist/components/Transitions/Slide.vue_vue_type_script_setup_true_lang.js +28 -0
  694. package/dist/components/WarningIcon/WarningIcon.vue.d.ts +5 -0
  695. package/dist/components/WarningIcon/WarningIcon.vue.js +6 -0
  696. package/dist/components/WarningIcon/WarningIcon.vue_vue_type_script_setup_true_lang.js +16 -0
  697. package/dist/components/WarningIcon/types.d.ts +3 -0
  698. package/dist/composables/__testResets.d.ts +1 -0
  699. package/dist/composables/useActiveInactiveState.d.ts +4 -0
  700. package/dist/composables/useActiveInactiveState.js +21 -0
  701. package/dist/composables/useBaseOptions.d.ts +3 -3
  702. package/dist/composables/useBaseOptions.js +31 -0
  703. package/dist/composables/useBbConfig.d.ts +8 -37
  704. package/dist/composables/useBbConfig.js +5 -0
  705. package/dist/composables/useBbDropdownContext.d.ts +89 -0
  706. package/dist/composables/useBbDropdownContext.js +46 -0
  707. package/dist/composables/useBbFormContext.d.ts +90 -0
  708. package/dist/composables/useBbFormContext.js +69 -0
  709. package/dist/composables/useBbTableContext.d.ts +195 -0
  710. package/dist/composables/useBbTableContext.js +208 -0
  711. package/dist/composables/useBbTabsContext.d.ts +111 -0
  712. package/dist/composables/useBbTabsContext.js +225 -0
  713. package/dist/composables/useBreakpoint.d.ts +13 -0
  714. package/dist/composables/useBreakpoint.js +39 -0
  715. package/dist/composables/useBroadcastChannelInstance.d.ts +1 -3
  716. package/dist/composables/useBroadcastChannelInstance.js +39 -0
  717. package/dist/composables/useCancelableFunction.js +37 -0
  718. package/dist/composables/useClosingInert.d.ts +28 -0
  719. package/dist/composables/useClosingInert.js +23 -0
  720. package/dist/composables/useCoherence.js +16 -0
  721. package/dist/composables/useConfirm.d.ts +278 -68
  722. package/dist/composables/useConfirm.js +130 -0
  723. package/dist/composables/useCountdown.js +42 -0
  724. package/dist/composables/useHashedWatcher.d.ts +17 -0
  725. package/dist/composables/useHashedWatcher.js +14 -0
  726. package/dist/composables/useId.d.ts +3 -2
  727. package/dist/composables/useIndexById.js +16 -0
  728. package/dist/composables/useInertiaPage.d.ts +10 -0
  729. package/dist/composables/useInertiaPage.js +8 -0
  730. package/dist/composables/useItemText.js +17 -0
  731. package/dist/composables/useItemValue.js +9 -0
  732. package/dist/composables/useItemsGetter.d.ts +1 -1
  733. package/dist/composables/useItemsGetter.js +30 -0
  734. package/dist/composables/useListboxFocus.js +66 -0
  735. package/dist/composables/useLocale.d.ts +1 -1
  736. package/dist/composables/useLocale.js +11 -0
  737. package/dist/composables/useLogger.d.ts +1 -1
  738. package/dist/composables/useLogger.js +10 -0
  739. package/dist/composables/useMinimalQueue.d.ts +1 -1
  740. package/dist/composables/useMobile.js +7 -0
  741. package/dist/composables/useOnFalsy.d.ts +2 -0
  742. package/dist/composables/useOnFalsy.js +9 -0
  743. package/dist/composables/useOnTruthy.d.ts +7 -0
  744. package/dist/composables/useOnTruthy.js +9 -0
  745. package/dist/composables/usePrefill.d.ts +2 -1
  746. package/dist/composables/usePrefill.js +24 -0
  747. package/dist/composables/useQuery.d.ts +15 -3
  748. package/dist/composables/useQuery.js +42 -0
  749. package/dist/composables/useRoute.js +11 -0
  750. package/dist/composables/useRouter.js +8 -0
  751. package/dist/composables/useSafeArea.d.ts +51 -0
  752. package/dist/composables/useSafeArea.js +16 -0
  753. package/dist/composables/useSegmentedFields.d.ts +104 -0
  754. package/dist/composables/useSegmentedFields.js +159 -0
  755. package/dist/composables/useTableWidthContext.d.ts +5 -0
  756. package/dist/composables/useTableWidthContext.js +42 -0
  757. package/dist/composables/useToast.d.ts +40 -70
  758. package/dist/composables/useToast.js +58 -0
  759. package/dist/composables/useTopLayer.d.ts +9 -0
  760. package/dist/composables/useTopLayer.js +7 -0
  761. package/dist/composables/useUntil.js +13 -0
  762. package/dist/composables/useViewportWidth.d.ts +17 -0
  763. package/dist/composables/useViewportWidth.js +6 -0
  764. package/dist/confirm-variants.d.ts +17 -0
  765. package/dist/deprecation/ai-deprecations.json.d.ts +784 -0
  766. package/dist/deprecation/ai-deprecations.json.js +4 -0
  767. package/dist/deprecation/removedProps.d.ts +3 -0
  768. package/dist/deprecation/removedProps.js +13 -0
  769. package/dist/directives/bbColor.d.ts +65 -0
  770. package/dist/directives/bbColor.js +24 -0
  771. package/dist/directives/bbDate.d.ts +66 -0
  772. package/dist/directives/bbDate.js +24 -0
  773. package/dist/directives/bbDropdown.d.ts +15 -11
  774. package/dist/directives/bbDropdown.js +23 -0
  775. package/dist/directives/bbTime.d.ts +64 -0
  776. package/dist/directives/bbTime.js +24 -0
  777. package/dist/directives/bbTooltip.d.ts +16 -11
  778. package/dist/directives/bbTooltip.js +24 -0
  779. package/dist/directives/createPopoverDirective.js +54 -0
  780. package/dist/dropdown-item-variants.d.ts +17 -0
  781. package/dist/i18n/index.d.ts +51 -3
  782. package/dist/i18n/index.js +27 -0
  783. package/dist/i18n/locales/cs.json +115 -0
  784. package/dist/i18n/locales/da.json +115 -0
  785. package/dist/i18n/locales/de.json +115 -0
  786. package/dist/i18n/locales/el.json +115 -0
  787. package/dist/i18n/locales/en.json +115 -0
  788. package/dist/i18n/locales/es.json +115 -0
  789. package/dist/i18n/locales/fi.json +115 -0
  790. package/dist/i18n/locales/fr.json +115 -0
  791. package/dist/i18n/locales/hu.json +115 -0
  792. package/dist/i18n/locales/it.json +115 -0
  793. package/dist/i18n/locales/ja.json +115 -0
  794. package/dist/i18n/locales/ko.json +115 -0
  795. package/dist/i18n/locales/nb.json +115 -0
  796. package/dist/i18n/locales/nl.json +115 -0
  797. package/dist/i18n/locales/pl.json +115 -0
  798. package/dist/i18n/locales/pt.json +115 -0
  799. package/dist/i18n/locales/ro.json +115 -0
  800. package/dist/i18n/locales/ru.json +115 -0
  801. package/dist/i18n/locales/sv.json +115 -0
  802. package/dist/i18n/locales/tr.json +115 -0
  803. package/dist/i18n/locales/uk.json +115 -0
  804. package/dist/i18n/locales/zh-cn.json +115 -0
  805. package/dist/icons-whitelist.d.ts +8 -0
  806. package/dist/index.d.ts +96 -79
  807. package/dist/index.js +76 -82
  808. package/dist/indicator-variants.d.ts +20 -0
  809. package/dist/llms-full.txt +79703 -0
  810. package/dist/llms-medium.txt +1514 -0
  811. package/dist/llms.txt +105 -0
  812. package/dist/locale-blueprint.json +141 -0
  813. package/dist/locale-registry.d.ts +37 -0
  814. package/dist/nuxt-module.d.ts +3 -0
  815. package/dist/nuxt.js +19 -0
  816. package/dist/plugin.d.ts +4 -0
  817. package/dist/plugin.js +22 -0
  818. package/dist/reset.css +1 -0
  819. package/dist/reset.d.ts +0 -0
  820. package/dist/runtime/nuxt-plugin.d.ts +2 -0
  821. package/dist/runtime/nuxt-plugin.js +24 -0
  822. package/dist/styles.css +2 -0
  823. package/dist/styles.d.ts +0 -0
  824. package/dist/toast-variants.d.ts +20 -0
  825. package/dist/tooltip-variants.d.ts +17 -0
  826. package/dist/types/ActionButton.d.ts +32 -0
  827. package/dist/types/AlertVariant.d.ts +16 -0
  828. package/dist/types/BadgeVariant.d.ts +16 -0
  829. package/dist/types/ButtonVariant.d.ts +17 -0
  830. package/dist/types/Classes.d.ts +1 -1
  831. package/dist/types/ColumnName.d.ts +1 -1
  832. package/dist/types/CommonProps.d.ts +68 -277
  833. package/dist/types/Config.d.ts +84 -0
  834. package/dist/types/ConfirmVariant.d.ts +15 -0
  835. package/dist/types/DropdownItemVariant.d.ts +18 -0
  836. package/dist/types/Icon.d.ts +5 -7
  837. package/dist/types/IndicatorVariant.d.ts +16 -0
  838. package/dist/types/InputDirection.d.ts +15 -0
  839. package/dist/types/ItemAccessor.d.ts +21 -0
  840. package/dist/types/Placement.d.ts +6 -0
  841. package/dist/types/ResponsiveSize.d.ts +20 -0
  842. package/dist/types/SizeScale.d.ts +8 -0
  843. package/dist/types/ToastVariant.d.ts +17 -0
  844. package/dist/types/TooltipVariant.d.ts +18 -0
  845. package/dist/utilities/functions/bytesToUnit.d.ts +2 -0
  846. package/dist/utilities/functions/bytesToUnit.js +18 -0
  847. package/dist/utilities/functions/clampPrecision.js +10 -0
  848. package/dist/utilities/functions/convertDateValue.d.ts +23 -10
  849. package/dist/utilities/functions/convertDateValue.js +12 -0
  850. package/dist/utilities/functions/deburr.js +5 -0
  851. package/dist/utilities/functions/empty.js +5 -0
  852. package/dist/utilities/functions/flattenTree.d.ts +1 -1
  853. package/dist/utilities/functions/hash.js +5 -0
  854. package/dist/utilities/functions/isDateDisabled.d.ts +1 -0
  855. package/dist/utilities/functions/isDateDisabled.js +20 -0
  856. package/dist/utilities/functions/isEqual.js +5 -0
  857. package/dist/utilities/functions/isNotEmpty.js +5 -0
  858. package/dist/utilities/functions/matchAnyKey.d.ts +1 -1
  859. package/dist/utilities/functions/matchAnyKey.js +15 -0
  860. package/dist/utilities/functions/parseSize.d.ts +1 -1
  861. package/dist/utilities/functions/parseSize.js +15 -0
  862. package/dist/utilities/functions/percentage.js +11 -0
  863. package/dist/utilities/functions/pipe.d.ts +1 -1
  864. package/dist/utilities/functions/reject.d.ts +25 -0
  865. package/dist/utilities/functions/reject.js +28 -0
  866. package/dist/utilities/functions/resolveEnumProp.d.ts +19 -0
  867. package/dist/utilities/functions/resolveEnumProp.js +5 -0
  868. package/dist/utilities/functions/slotKey.d.ts +13 -0
  869. package/dist/utilities/functions/slotKey.js +4 -0
  870. package/dist/utilities/functions/sort.d.ts +2 -2
  871. package/dist/utilities/functions/sort.js +19 -0
  872. package/dist/utilities/functions/throttle.js +5 -0
  873. package/dist/utilities/functions/waitFor.d.ts +9 -2
  874. package/dist/utilities/functions/waitFor.js +14 -0
  875. package/dist/utilities/functions/warnRemovedAttrs.d.ts +11 -0
  876. package/dist/utilities/functions/warnRemovedAttrs.js +20 -0
  877. package/dist/utilities/functions/when.js +5 -0
  878. package/dist/utilities/misc/iconsInjectionKey.d.ts +15 -0
  879. package/dist/utilities/misc/iconsInjectionKey.js +4 -0
  880. package/dist/utilities/misc/transitions.d.ts +5 -0
  881. package/dist/utilities/misc/transitions.js +8 -0
  882. package/dist/utils/injectLibraryStyles.d.ts +6 -0
  883. package/dist/utils/injectLibraryStyles.js +38 -0
  884. package/dist/validated/BbCheckbox.vue.d.ts +29 -0
  885. package/dist/validated/BbCheckbox.vue.js +5 -0
  886. package/dist/validated/BbCheckbox.vue_vue_type_script_setup_true_lang.js +75 -0
  887. package/dist/validated/BbCheckboxGroup.vue.d.ts +34 -0
  888. package/dist/validated/BbCheckboxGroup.vue.js +5 -0
  889. package/dist/validated/BbCheckboxGroup.vue_vue_type_script_setup_true_lang.js +82 -0
  890. package/dist/validated/BbColorInput.vue.d.ts +36 -0
  891. package/dist/validated/BbColorInput.vue.js +5 -0
  892. package/dist/validated/BbColorInput.vue_vue_type_script_setup_true_lang.js +71 -0
  893. package/dist/validated/BbDatePickerInput.vue.d.ts +41 -0
  894. package/dist/validated/BbDatePickerInput.vue.js +5 -0
  895. package/dist/validated/BbDatePickerInput.vue_vue_type_script_setup_true_lang.js +90 -0
  896. package/dist/validated/BbDropzone.vue.d.ts +24 -0
  897. package/dist/validated/BbDropzone.vue.js +5 -0
  898. package/dist/validated/BbDropzone.vue_vue_type_script_setup_true_lang.js +45 -0
  899. package/dist/validated/BbForm.vue.d.ts +28 -0
  900. package/dist/validated/BbForm.vue.js +5 -0
  901. package/dist/validated/BbForm.vue_vue_type_script_setup_true_lang.js +42 -0
  902. package/dist/validated/BbNumberInput.vue.d.ts +36 -0
  903. package/dist/validated/BbNumberInput.vue.js +5 -0
  904. package/dist/validated/BbNumberInput.vue_vue_type_script_setup_true_lang.js +72 -0
  905. package/dist/validated/BbRadioGroup.vue.d.ts +34 -0
  906. package/dist/validated/BbRadioGroup.vue.js +5 -0
  907. package/dist/validated/BbRadioGroup.vue_vue_type_script_setup_true_lang.js +78 -0
  908. package/dist/validated/BbRating.vue.d.ts +30 -0
  909. package/dist/validated/BbRating.vue.js +5 -0
  910. package/dist/validated/BbRating.vue_vue_type_script_setup_true_lang.js +63 -0
  911. package/dist/validated/BbSelect.vue.d.ts +46 -0
  912. package/dist/validated/BbSelect.vue.js +5 -0
  913. package/dist/validated/BbSelect.vue_vue_type_script_setup_true_lang.js +109 -0
  914. package/dist/validated/BbSlider.vue.d.ts +36 -0
  915. package/dist/validated/BbSlider.vue.js +5 -0
  916. package/dist/validated/BbSlider.vue_vue_type_script_setup_true_lang.js +69 -0
  917. package/dist/validated/BbSwitch.vue.d.ts +29 -0
  918. package/dist/validated/BbSwitch.vue.js +5 -0
  919. package/dist/validated/BbSwitch.vue_vue_type_script_setup_true_lang.js +75 -0
  920. package/dist/validated/BbSwitchGroup.vue.d.ts +34 -0
  921. package/dist/validated/BbSwitchGroup.vue.js +5 -0
  922. package/dist/validated/BbSwitchGroup.vue_vue_type_script_setup_true_lang.js +82 -0
  923. package/dist/validated/BbTag.vue.d.ts +36 -0
  924. package/dist/validated/BbTag.vue.js +5 -0
  925. package/dist/validated/BbTag.vue_vue_type_script_setup_true_lang.js +72 -0
  926. package/dist/validated/BbTextInput.vue.d.ts +36 -0
  927. package/dist/validated/BbTextInput.vue.js +5 -0
  928. package/dist/validated/BbTextInput.vue_vue_type_script_setup_true_lang.js +72 -0
  929. package/dist/validated/BbTextarea.vue.d.ts +36 -0
  930. package/dist/validated/BbTextarea.vue.js +5 -0
  931. package/dist/validated/BbTextarea.vue_vue_type_script_setup_true_lang.js +70 -0
  932. package/dist/validated/BbTimePickerInput.vue.d.ts +37 -0
  933. package/dist/validated/BbTimePickerInput.vue.js +5 -0
  934. package/dist/validated/BbTimePickerInput.vue_vue_type_script_setup_true_lang.js +81 -0
  935. package/dist/validated/index.d.ts +29 -0
  936. package/dist/validated/useValidatedField.d.ts +93 -0
  937. package/dist/validated/useValidatedField.js +51 -0
  938. package/dist/validated.js +21 -0
  939. package/dist/vite-plugin.d.ts +261 -0
  940. package/dist/vite.js +603 -0
  941. package/llms.txt +107 -0
  942. package/package.json +181 -60
  943. package/scripts/lib/__fixtures__/validated-manifest.json +65 -0
  944. package/scripts/lib/ensure-manifest.mjs +39 -0
  945. package/scripts/lib/eslint-plugin-autofix.node.test.mjs +109 -0
  946. package/scripts/lib/eslint-plugin-recommended.node.test.mjs +87 -0
  947. package/scripts/lib/eslint-plugin-slots.node.test.mjs +271 -0
  948. package/scripts/lib/eslint-plugin.mjs +702 -0
  949. package/scripts/lib/eslint-plugin.node.test.mjs +193 -0
  950. package/scripts/lib/html-attributes.mjs +191 -0
  951. package/scripts/lib/mcp-config.mjs +126 -0
  952. package/scripts/lib/migrate-fix.mjs +115 -0
  953. package/scripts/lib/validate-bb-markup.mjs +488 -0
  954. package/dist/ai/BaseButton.md +0 -449
  955. package/dist/ai/BaseCheckbox.md +0 -512
  956. package/dist/ai/BaseCheckboxGroup.md +0 -597
  957. package/dist/ai/BaseColorInput.md +0 -461
  958. package/dist/ai/BaseDatePicker.md +0 -739
  959. package/dist/ai/BaseDatePickerInput.md +0 -1517
  960. package/dist/ai/BaseDialog.md +0 -610
  961. package/dist/ai/BaseInputContainer.md +0 -570
  962. package/dist/ai/BaseNumberInput.md +0 -509
  963. package/dist/ai/BaseRadio.md +0 -405
  964. package/dist/ai/BaseRadioGroup.md +0 -535
  965. package/dist/ai/BaseRating.md +0 -489
  966. package/dist/ai/BaseSelect.md +0 -1742
  967. package/dist/ai/BaseSlider.md +0 -871
  968. package/dist/ai/BaseSwitch.md +0 -322
  969. package/dist/ai/BaseSwitchGroup.md +0 -298
  970. package/dist/ai/BaseTag.md +0 -623
  971. package/dist/ai/BaseTextInput.md +0 -392
  972. package/dist/ai/BaseTextarea.md +0 -398
  973. package/dist/ai/BbChip.md +0 -147
  974. package/dist/ai/BbIntersection.md +0 -120
  975. package/dist/ai/BbRatio.md +0 -61
  976. package/dist/ai/BbRows.md +0 -307
  977. package/dist/ai/BbTab.md +0 -950
  978. package/dist/ai/CommonInputInnerContainer.md +0 -414
  979. package/dist/ai/CommonInputOuterContainer.md +0 -55
  980. package/dist/components/BaseButton/BaseButton.vue.d.ts +0 -14
  981. package/dist/components/BaseButton/types.d.ts +0 -159
  982. package/dist/components/BaseCheckbox/BaseCheckbox.vue.d.ts +0 -39
  983. package/dist/components/BaseCheckbox/types.d.ts +0 -213
  984. package/dist/components/BaseCheckboxGroup/BaseCheckboxGroup.vue.d.ts +0 -30
  985. package/dist/components/BaseCheckboxGroup/types.d.ts +0 -282
  986. package/dist/components/BaseColorInput/BaseColorInput.vue.d.ts +0 -35
  987. package/dist/components/BaseColorInput/ColorPalette.vue.d.ts +0 -13
  988. package/dist/components/BaseColorInput/types.d.ts +0 -233
  989. package/dist/components/BaseDatePicker/BaseDatePickerHeader.vue.d.ts +0 -15
  990. package/dist/components/BaseDatePicker/BaseDatePickerInputDaySelector.vue.d.ts +0 -58
  991. package/dist/components/BaseDatePicker/BaseDatePickerMonthSelector.vue.d.ts +0 -12
  992. package/dist/components/BaseDatePicker/BaseDatePickerYearSelector.vue.d.ts +0 -12
  993. package/dist/components/BaseDatePicker/types.d.ts +0 -100
  994. package/dist/components/BaseDatePickerInput/BaseDatePickerInput.vue.d.ts +0 -26
  995. package/dist/components/BaseDatePickerInput/types.d.ts +0 -206
  996. package/dist/components/BaseDialog/BaseDialog.vue.d.ts +0 -37
  997. package/dist/components/BaseDialog/types.d.ts +0 -180
  998. package/dist/components/BaseInputContainer/BaseInputContainer.vue.d.ts +0 -18
  999. package/dist/components/BaseInputContainer/types.d.ts +0 -126
  1000. package/dist/components/BaseNumberInput/BaseNumberInput.vue.d.ts +0 -46
  1001. package/dist/components/BaseNumberInput/types.d.ts +0 -191
  1002. package/dist/components/BaseRadio/BaseRadio.vue.d.ts +0 -31
  1003. package/dist/components/BaseRadio/types.d.ts +0 -173
  1004. package/dist/components/BaseRadioGroup/BaseRadioGroup.vue.d.ts +0 -30
  1005. package/dist/components/BaseRadioGroup/types.d.ts +0 -240
  1006. package/dist/components/BaseRating/BaseRating.vue.d.ts +0 -35
  1007. package/dist/components/BaseRating/types.d.ts +0 -144
  1008. package/dist/components/BaseSelect/BaseSelect.vue.d.ts +0 -28
  1009. package/dist/components/BaseSelect/types.d.ts +0 -470
  1010. package/dist/components/BaseSlider/BaseSlider.vue.d.ts +0 -38
  1011. package/dist/components/BaseSlider/types.d.ts +0 -201
  1012. package/dist/components/BaseSwitch/BaseSwitch.vue.d.ts +0 -34
  1013. package/dist/components/BaseSwitch/types.d.ts +0 -25
  1014. package/dist/components/BaseSwitchGroup/BaseSwitchGroup.vue.d.ts +0 -30
  1015. package/dist/components/BaseSwitchGroup/types.d.ts +0 -8
  1016. package/dist/components/BaseTag/BaseTag.vue.d.ts +0 -37
  1017. package/dist/components/BaseTag/types.d.ts +0 -136
  1018. package/dist/components/BaseTextInput/BaseTextInput.vue.d.ts +0 -33
  1019. package/dist/components/BaseTextInput/types.d.ts +0 -166
  1020. package/dist/components/BaseTextarea/BaseTextarea.vue.d.ts +0 -31
  1021. package/dist/components/BaseTextarea/types.d.ts +0 -151
  1022. package/dist/components/BbChip/BbChip.vue.d.ts +0 -17
  1023. package/dist/components/BbChip/types.d.ts +0 -23
  1024. package/dist/components/BbIntersection/BbIntersection.vue.d.ts +0 -23
  1025. package/dist/components/BbIntersection/types.d.ts +0 -36
  1026. package/dist/components/BbRatio/BbRatio.vue.d.ts +0 -14
  1027. package/dist/components/BbRatio/types.d.ts +0 -15
  1028. package/dist/components/BbRows/BbRows.vue.d.ts +0 -62
  1029. package/dist/components/BbRows/types.d.ts +0 -21
  1030. package/dist/components/BbTab/BbTab.vue.d.ts +0 -27
  1031. package/dist/components/BbTab/types.d.ts +0 -186
  1032. package/dist/components/CommonInputInnerContainer/CommonInputInnerContainer.vue.d.ts +0 -15
  1033. package/dist/components/CommonInputInnerContainer/types.d.ts +0 -47
  1034. package/dist/components/CommonInputOuterContainer/CommonInputOuterContainer.vue.d.ts +0 -11
  1035. package/dist/components/CommonInputOuterContainer/types.d.ts +0 -16
  1036. package/dist/composables/useModalsState.d.ts +0 -5
  1037. package/dist/composables/useQueue.d.ts +0 -58
  1038. package/dist/composables/useWizard.d.ts +0 -85
  1039. package/dist/i18n/en.d.ts +0 -67
  1040. package/dist/i18n/it.d.ts +0 -67
  1041. package/dist/index.css +0 -2
  1042. package/dist/index100.js +0 -6
  1043. package/dist/index101.js +0 -300
  1044. package/dist/index102.js +0 -16
  1045. package/dist/index103.js +0 -16
  1046. package/dist/index104.js +0 -27
  1047. package/dist/index109.js +0 -19
  1048. package/dist/index11.js +0 -42
  1049. package/dist/index110.js +0 -12
  1050. package/dist/index111.js +0 -19
  1051. package/dist/index112.js +0 -25
  1052. package/dist/index114.js +0 -7
  1053. package/dist/index115.js +0 -241
  1054. package/dist/index116.js +0 -5
  1055. package/dist/index117.js +0 -42
  1056. package/dist/index118.js +0 -5
  1057. package/dist/index119.js +0 -53
  1058. package/dist/index120.js +0 -5
  1059. package/dist/index121.js +0 -32
  1060. package/dist/index122.js +0 -5
  1061. package/dist/index124.js +0 -52
  1062. package/dist/index125.js +0 -5
  1063. package/dist/index126.js +0 -223
  1064. package/dist/index128.js +0 -6
  1065. package/dist/index129.js +0 -162
  1066. package/dist/index13.js +0 -92
  1067. package/dist/index130.js +0 -25
  1068. package/dist/index131.js +0 -51
  1069. package/dist/index132.js +0 -5
  1070. package/dist/index133.js +0 -607
  1071. package/dist/index135.js +0 -6
  1072. package/dist/index136.js +0 -14
  1073. package/dist/index137.js +0 -153
  1074. package/dist/index139.js +0 -6
  1075. package/dist/index14.js +0 -306
  1076. package/dist/index140.js +0 -224
  1077. package/dist/index141.js +0 -5
  1078. package/dist/index143.js +0 -128
  1079. package/dist/index145.js +0 -6
  1080. package/dist/index146.js +0 -8
  1081. package/dist/index147.js +0 -182
  1082. package/dist/index149.js +0 -6
  1083. package/dist/index15.js +0 -10
  1084. package/dist/index151.js +0 -4
  1085. package/dist/index152.js +0 -95
  1086. package/dist/index154.js +0 -6
  1087. package/dist/index155.js +0 -168
  1088. package/dist/index157.js +0 -6
  1089. package/dist/index158.js +0 -145
  1090. package/dist/index16.js +0 -59
  1091. package/dist/index160.js +0 -6
  1092. package/dist/index161.js +0 -53
  1093. package/dist/index163.js +0 -6
  1094. package/dist/index164.js +0 -16
  1095. package/dist/index166.js +0 -35
  1096. package/dist/index168.js +0 -6
  1097. package/dist/index169.js +0 -89
  1098. package/dist/index171.js +0 -6
  1099. package/dist/index172.js +0 -82
  1100. package/dist/index174.js +0 -6
  1101. package/dist/index175.js +0 -38
  1102. package/dist/index176.js +0 -461
  1103. package/dist/index177.js +0 -28
  1104. package/dist/index178.js +0 -66
  1105. package/dist/index18.js +0 -35
  1106. package/dist/index180.js +0 -162
  1107. package/dist/index181.js +0 -5
  1108. package/dist/index182.js +0 -217
  1109. package/dist/index183.js +0 -5
  1110. package/dist/index184.js +0 -112
  1111. package/dist/index185.js +0 -5
  1112. package/dist/index186.js +0 -459
  1113. package/dist/index188.js +0 -6
  1114. package/dist/index19.js +0 -4
  1115. package/dist/index192.js +0 -268
  1116. package/dist/index194.js +0 -6
  1117. package/dist/index195.js +0 -124
  1118. package/dist/index197.js +0 -6
  1119. package/dist/index198.js +0 -174
  1120. package/dist/index2.js +0 -20
  1121. package/dist/index20.js +0 -9
  1122. package/dist/index200.js +0 -6
  1123. package/dist/index201.js +0 -224
  1124. package/dist/index203.js +0 -6
  1125. package/dist/index204.js +0 -135
  1126. package/dist/index206.js +0 -6
  1127. package/dist/index207.js +0 -5
  1128. package/dist/index208.js +0 -170
  1129. package/dist/index21.js +0 -35
  1130. package/dist/index210.js +0 -6
  1131. package/dist/index211.js +0 -37
  1132. package/dist/index213.js +0 -6
  1133. package/dist/index214.js +0 -63
  1134. package/dist/index216.js +0 -6
  1135. package/dist/index217.js +0 -74
  1136. package/dist/index219.js +0 -6
  1137. package/dist/index22.js +0 -6
  1138. package/dist/index220.js +0 -65
  1139. package/dist/index222.js +0 -6
  1140. package/dist/index223.js +0 -67
  1141. package/dist/index225.js +0 -6
  1142. package/dist/index226.js +0 -41
  1143. package/dist/index228.js +0 -6
  1144. package/dist/index229.js +0 -10
  1145. package/dist/index23.js +0 -7
  1146. package/dist/index230.js +0 -22
  1147. package/dist/index232.js +0 -8
  1148. package/dist/index233.js +0 -297
  1149. package/dist/index235.js +0 -6
  1150. package/dist/index236.js +0 -47
  1151. package/dist/index237.js +0 -165
  1152. package/dist/index239.js +0 -6
  1153. package/dist/index24.js +0 -9
  1154. package/dist/index241.js +0 -159
  1155. package/dist/index243.js +0 -6
  1156. package/dist/index244.js +0 -134
  1157. package/dist/index246.js +0 -6
  1158. package/dist/index247.js +0 -167
  1159. package/dist/index249.js +0 -6
  1160. package/dist/index25.js +0 -24
  1161. package/dist/index250.js +0 -147
  1162. package/dist/index252.js +0 -6
  1163. package/dist/index253.js +0 -35
  1164. package/dist/index255.js +0 -6
  1165. package/dist/index256.js +0 -65
  1166. package/dist/index258.js +0 -6
  1167. package/dist/index259.js +0 -19
  1168. package/dist/index260.js +0 -5
  1169. package/dist/index261.js +0 -160
  1170. package/dist/index263.js +0 -6
  1171. package/dist/index264.js +0 -60
  1172. package/dist/index266.js +0 -6
  1173. package/dist/index267.js +0 -134
  1174. package/dist/index269.js +0 -6
  1175. package/dist/index27.js +0 -4
  1176. package/dist/index271.js +0 -206
  1177. package/dist/index273.js +0 -6
  1178. package/dist/index274.js +0 -85
  1179. package/dist/index275.js +0 -5
  1180. package/dist/index276.js +0 -55
  1181. package/dist/index277.js +0 -5
  1182. package/dist/index278.js +0 -164
  1183. package/dist/index28.js +0 -8
  1184. package/dist/index280.js +0 -6
  1185. package/dist/index281.js +0 -145
  1186. package/dist/index283.js +0 -6
  1187. package/dist/index284.js +0 -11
  1188. package/dist/index285.js +0 -200
  1189. package/dist/index287.js +0 -6
  1190. package/dist/index288.js +0 -241
  1191. package/dist/index29.js +0 -7
  1192. package/dist/index290.js +0 -6
  1193. package/dist/index291.js +0 -21
  1194. package/dist/index293.js +0 -6
  1195. package/dist/index294.js +0 -125
  1196. package/dist/index296.js +0 -6
  1197. package/dist/index297.js +0 -161
  1198. package/dist/index299.js +0 -6
  1199. package/dist/index30.js +0 -118
  1200. package/dist/index300.js +0 -127
  1201. package/dist/index302.js +0 -6
  1202. package/dist/index303.js +0 -20
  1203. package/dist/index305.js +0 -6
  1204. package/dist/index306.js +0 -116
  1205. package/dist/index307.js +0 -5
  1206. package/dist/index308.js +0 -507
  1207. package/dist/index31.js +0 -10
  1208. package/dist/index310.js +0 -6
  1209. package/dist/index311.js +0 -196
  1210. package/dist/index313.js +0 -6
  1211. package/dist/index314.js +0 -142
  1212. package/dist/index316.js +0 -6
  1213. package/dist/index317.js +0 -134
  1214. package/dist/index319.js +0 -6
  1215. package/dist/index32.js +0 -28
  1216. package/dist/index320.js +0 -162
  1217. package/dist/index322.js +0 -6
  1218. package/dist/index323.js +0 -319
  1219. package/dist/index325.js +0 -6
  1220. package/dist/index326.js +0 -40
  1221. package/dist/index327.js +0 -43
  1222. package/dist/index328.js +0 -665
  1223. package/dist/index33.js +0 -5
  1224. package/dist/index330.js +0 -6
  1225. package/dist/index331.js +0 -155
  1226. package/dist/index333.js +0 -6
  1227. package/dist/index334.js +0 -142
  1228. package/dist/index336.js +0 -6
  1229. package/dist/index337.js +0 -155
  1230. package/dist/index339.js +0 -6
  1231. package/dist/index34.js +0 -112
  1232. package/dist/index340.js +0 -58
  1233. package/dist/index341.js +0 -5
  1234. package/dist/index342.js +0 -20
  1235. package/dist/index344.js +0 -6
  1236. package/dist/index345.js +0 -142
  1237. package/dist/index347.js +0 -6
  1238. package/dist/index349.js +0 -109
  1239. package/dist/index351.js +0 -6
  1240. package/dist/index352.js +0 -55
  1241. package/dist/index353.js +0 -24
  1242. package/dist/index354.js +0 -23
  1243. package/dist/index355.js +0 -839
  1244. package/dist/index356.js +0 -474
  1245. package/dist/index357.js +0 -52
  1246. package/dist/index358.js +0 -7
  1247. package/dist/index36.js +0 -6
  1248. package/dist/index38.js +0 -63
  1249. package/dist/index39.js +0 -63
  1250. package/dist/index40.js +0 -9
  1251. package/dist/index42.js +0 -8
  1252. package/dist/index43.js +0 -179
  1253. package/dist/index44.js +0 -21
  1254. package/dist/index46.js +0 -385
  1255. package/dist/index48.js +0 -6
  1256. package/dist/index49.js +0 -33
  1257. package/dist/index5.js +0 -34
  1258. package/dist/index50.js +0 -12
  1259. package/dist/index51.js +0 -8
  1260. package/dist/index52.js +0 -106
  1261. package/dist/index53.js +0 -330
  1262. package/dist/index54.js +0 -97
  1263. package/dist/index55.js +0 -328
  1264. package/dist/index56.js +0 -28
  1265. package/dist/index57.js +0 -102
  1266. package/dist/index58.js +0 -157
  1267. package/dist/index6.js +0 -38
  1268. package/dist/index60.js +0 -6
  1269. package/dist/index61.js +0 -131
  1270. package/dist/index62.js +0 -5
  1271. package/dist/index65.js +0 -35
  1272. package/dist/index66.js +0 -26
  1273. package/dist/index68.js +0 -6
  1274. package/dist/index69.js +0 -54
  1275. package/dist/index7.js +0 -58
  1276. package/dist/index71.js +0 -6
  1277. package/dist/index72.js +0 -14
  1278. package/dist/index74.js +0 -6
  1279. package/dist/index75.js +0 -159
  1280. package/dist/index77.js +0 -6
  1281. package/dist/index78.js +0 -4
  1282. package/dist/index79.js +0 -4
  1283. package/dist/index80.js +0 -54
  1284. package/dist/index81.js +0 -5
  1285. package/dist/index82.js +0 -5
  1286. package/dist/index83.js +0 -141
  1287. package/dist/index85.js +0 -6
  1288. package/dist/index86.js +0 -65
  1289. package/dist/index88.js +0 -6
  1290. package/dist/index89.js +0 -30
  1291. package/dist/index9.js +0 -11
  1292. package/dist/index90.js +0 -19
  1293. package/dist/index91.js +0 -17
  1294. package/dist/index92.js +0 -9
  1295. package/dist/index93.js +0 -34
  1296. package/dist/index95.js +0 -16
  1297. package/dist/index96.js +0 -10
  1298. package/dist/index97.js +0 -18
  1299. package/dist/index98.js +0 -189
  1300. package/dist/types/VoidHtmlElements.d.ts +0 -1
  1301. package/dist/utilities/functions/add.d.ts +0 -1
  1302. package/dist/utilities/functions/booleanishToBoolean.d.ts +0 -6
  1303. package/dist/utilities/functions/capitalize.d.ts +0 -4
  1304. package/dist/utilities/functions/cloneDeep.d.ts +0 -1
  1305. package/dist/utilities/functions/debounce.d.ts +0 -1
  1306. package/dist/utilities/functions/drop.d.ts +0 -1
  1307. package/dist/utilities/functions/exceedsPrecision.d.ts +0 -1
  1308. package/dist/utilities/functions/findRight.d.ts +0 -4
  1309. package/dist/utilities/functions/findRightIndex.d.ts +0 -4
  1310. package/dist/utilities/functions/flow.d.ts +0 -1
  1311. package/dist/utilities/functions/getHueFromRGB.d.ts +0 -9
  1312. package/dist/utilities/functions/groupBy.d.ts +0 -6
  1313. package/dist/utilities/functions/gt.d.ts +0 -7
  1314. package/dist/utilities/functions/hexToRGB.d.ts +0 -7
  1315. package/dist/utilities/functions/hslToHex.d.ts +0 -1
  1316. package/dist/utilities/functions/includes.d.ts +0 -1
  1317. package/dist/utilities/functions/initial.d.ts +0 -1
  1318. package/dist/utilities/functions/isCssColor.d.ts +0 -5
  1319. package/dist/utilities/functions/lt.d.ts +0 -7
  1320. package/dist/utilities/functions/makeUrl.d.ts +0 -1
  1321. package/dist/utilities/functions/mapKeys.d.ts +0 -5
  1322. package/dist/utilities/functions/mapValues.d.ts +0 -1
  1323. package/dist/utilities/functions/matchesPropertyInsensitive.d.ts +0 -1
  1324. package/dist/utilities/functions/max.d.ts +0 -2
  1325. package/dist/utilities/functions/mean.d.ts +0 -4
  1326. package/dist/utilities/functions/merge.d.ts +0 -11
  1327. package/dist/utilities/functions/millisecondsTo.d.ts +0 -1
  1328. package/dist/utilities/functions/negate.d.ts +0 -4
  1329. package/dist/utilities/functions/normalizeItemGroups.d.ts +0 -13
  1330. package/dist/utilities/functions/omit.d.ts +0 -2
  1331. package/dist/utilities/functions/overEvery.d.ts +0 -4
  1332. package/dist/utilities/functions/pick.d.ts +0 -1
  1333. package/dist/utilities/functions/replace.d.ts +0 -1
  1334. package/dist/utilities/functions/replaceInTree.d.ts +0 -4
  1335. package/dist/utilities/functions/retry.d.ts +0 -5
  1336. package/dist/utilities/functions/roundToTheNearest.d.ts +0 -8
  1337. package/dist/utilities/functions/set.d.ts +0 -15
  1338. package/dist/utilities/functions/stub.d.ts +0 -6
  1339. package/dist/utilities/functions/transposePercent.d.ts +0 -9
  1340. package/dist/utilities/functions/tryTo.d.ts +0 -2
  1341. package/dist/utilities/functions/uniqBy.d.ts +0 -1
  1342. /package/dist/{index64.js → _virtual/_plugin-vue_export-helper.js} +0 -0
  1343. /package/dist/components/{BaseButton → BbBaseButton}/RouterComponent.vue.d.ts +0 -0
  1344. /package/dist/components/{BaseDatePicker/BaseDatePicker.vue.d.ts → BbBaseDatePicker/BbBaseDatePicker.vue.d.ts} +0 -0
  1345. /package/dist/{index165.js → composables/useArray.js} +0 -0
  1346. /package/dist/{index17.js → composables/useFrameworkDetection.js} +0 -0
  1347. /package/dist/{index12.js → composables/useId.js} +0 -0
  1348. /package/dist/{index107.js → utilities/functions/chunk.js} +0 -0
  1349. /package/dist/{index8.js → utilities/functions/clamp.js} +0 -0
  1350. /package/dist/{index150.js → utilities/functions/curry.js} +0 -0
  1351. /package/dist/{index45.js → utilities/functions/extractDomContainer.js} +0 -0
  1352. /package/dist/{index270.js → utilities/functions/findInTree.js} +0 -0
  1353. /package/dist/{index348.js → utilities/functions/flattenTree.js} +0 -0
  1354. /package/dist/{index41.js → utilities/functions/get.js} +0 -0
  1355. /package/dist/{index189.js → utilities/functions/head.js} +0 -0
  1356. /package/dist/{index108.js → utilities/functions/identity.js} +0 -0
  1357. /package/dist/{index179.js → utilities/functions/indexBy.js} +0 -0
  1358. /package/dist/{index37.js → utilities/functions/isHex.js} +0 -0
  1359. /package/dist/{index94.js → utilities/functions/isNil.js} +0 -0
  1360. /package/dist/{index26.js → utilities/functions/isNotNil.js} +0 -0
  1361. /package/dist/{index105.js → utilities/functions/last.js} +0 -0
  1362. /package/dist/{index142.js → utilities/functions/noop.js} +0 -0
  1363. /package/dist/{index231.js → utilities/functions/parseWidthString.js} +0 -0
  1364. /package/dist/{index240.js → utilities/functions/pickBy.js} +0 -0
  1365. /package/dist/{index123.js → utilities/functions/range.js} +0 -0
  1366. /package/dist/{index190.js → utilities/functions/snapToStep.js} +0 -0
  1367. /package/dist/{index191.js → utilities/functions/transpose.js} +0 -0
  1368. /package/dist/{index106.js → utilities/functions/validateDateFormat.js} +0 -0
  1369. /package/dist/{index10.js → utilities/functions/wait.js} +0 -0
@@ -1,567 +1,1430 @@
1
1
  # BbSelect
2
2
 
3
- ## Template & Script
3
+ ## Agent Contract
4
+
5
+ - Safety level: **Consumer API**
6
+ - Group: **Selection**
7
+ - Description: Selects one or many options from structured data.
8
+ - Usage rule: Prefer this component for consumer-facing implementations.
9
+ - Implementation source (only when the contract below is not enough): [source/BbSelect.md](./source/BbSelect.md)
10
+
11
+ ## Usage & Guidelines
12
+
13
+ ### When to use
14
+
15
+ Reach for `BbSelect` when the user picks from a list that is **large, dynamic,
16
+ or searchable**, and you want a labelled form control with hint, error and
17
+ loading states baked in. It is the default choice for country/city pickers,
18
+ assignee fields, tag inputs and any async-backed lookup.
19
+
20
+ Prefer a sibling when the shape is simpler:
21
+
22
+ - Small, static, exclusive choice (≤6 options, always visible) → `BbRadioGroup`.
23
+ - Small, static, multi-choice → `BbCheckboxGroup` / `BbSwitchGroup`.
24
+ - You need a **custom trigger** (a status pill, an avatar stack, a badge) rather
25
+ than an inline input → `BbSelectPopover`, the popover-anchored sibling that
26
+ shares this component's search and option engine.
27
+ - Values the user _invents_ (open vocabulary) → `BbTag`; if values come from a
28
+ known set, `BbSelect` in multiple mode is the right tool.
29
+
30
+ `label` is required — it is the accessible name. Hide it visually with
31
+ `hide-label` when the surrounding UI already labels the field.
32
+
33
+ ### Map options with `item-text` and `item-value`
34
+
35
+ Pass your domain objects to `items` **as they are** and tell the component which
36
+ field is the display text and which is the stored value with `item-text` /
37
+ `item-value` (dot-paths or extractor functions). Never pre-map `items` into
38
+ `{ label, value }` objects — matching is hash-based, so component-native
39
+ extraction stays robust. The `v-model` holds the resolved _value_, not the whole
40
+ object.
41
+
42
+ **Single select mapped from domain objects**
4
43
 
5
44
  ```vue
6
45
  <template>
7
- <BaseInputContainer
8
- :id="id"
9
- class="bb-select"
10
- :compact="compact"
11
- :direction="direction"
12
- :errors="errors"
13
- :has-errors="hasErrors"
14
- :hide-label="hideLabel"
15
- :hint="hint"
16
- :label="label"
17
- :label-position="labelPosition"
18
- :model-value="modelValue"
19
- :name="name"
20
- :reverse="reverse"
21
- :show-hint="showHint"
22
- >
23
- <template #label="data"><slot name="label" v-bind="data"></slot></template>
24
- <template #input="{ id, hasErrors, ariaDescribedby }">
25
- <BaseSelect
26
- :id="id"
27
- :allow-writing="allowWriting"
28
- :append:icon="props['append:icon']"
29
- :aria-describedby="ariaDescribedby"
30
- :autocomplete="autocomplete"
31
- :autofocus="autofocus"
32
- :clearable="clearable"
33
- :comma="comma"
34
- :compact="compact"
35
- :dependencies="dependencies"
36
- :deps-debounce-time="depsDebounceTime"
37
- :disabled="disabled"
38
- :enforce-coherence="enforceCoherence"
39
- :filter-by="filterBy"
40
- :group-by="groupBy"
41
- :has-errors="hasErrors"
42
- :header-height="headerHeight"
43
- :item-height="itemHeight"
44
- :item-text="<any>itemText"
45
- :item-value="<any>itemValue"
46
- :items="items"
47
- :loading="loading"
48
- :loading-text="loadingText"
49
- :max="max"
50
- :max-selected-labels="maxSelectedLabels"
51
- :model-value="modelValue"
52
- :model-value-debounce-time="modelValueDebounceTime"
53
- :multiple="multiple"
54
- :name="name"
55
- :no-data-text="noDataText"
56
- :placeholder="placeholder"
57
- :prefill="prefill"
58
- :prepend:icon="props['prepend:icon']"
59
- :query-debounce-time="queryDebounceTime"
60
- :readonly="readonly"
61
- :required="required"
62
- :selected-labels-fn="selectedLabelsFn"
63
- :show-chevron="showChevron"
64
- :stash="stash"
65
- :transition-duration="transitionDuration"
66
- :update-on-animation-frame="updateOnAnimationFrame"
67
- v-bind="eventListeners"
68
- >
69
- <template #append-outer="data"
70
- ><slot name="append-outer" v-bind="data"
71
- /></template>
72
- <template #append="data"><slot name="append" v-bind="data" /></template>
73
- <template #prefix="data"><slot name="prefix" v-bind="data" /></template>
74
- <template #chevron="data"
75
- ><slot name="chevron" v-bind="data"
76
- /></template>
77
- <template #loading="data"
78
- ><slot name="loading" v-bind="data"
79
- /></template>
80
- <template #no-data="data"
81
- ><slot name="no-data" v-bind="data"
82
- /></template>
83
- <template #option="data"><slot name="option" v-bind="data" /></template>
84
- <template #group="data"><slot name="group" v-bind="data" /></template>
85
- <template #options:append="data"
86
- ><slot name="options:append" v-bind="data"
87
- /></template>
88
- <template #options:append:outer="data"
89
- ><slot name="options:append:outer" v-bind="data"
90
- /></template>
91
- <template #options:prepend="data"
92
- ><slot name="options:prepend" v-bind="data"
93
- /></template>
94
- <template #options:prepend:outer="data"
95
- ><slot name="options:prepend:outer" v-bind="data"
96
- /></template>
97
- <template #prepend-outer="data"
98
- ><slot name="prepend-outer" v-bind="data"
99
- /></template>
100
- <template #prepend="data"
101
- ><slot name="prepend" v-bind="data"
102
- /></template>
103
- <template #suffix="data"><slot name="suffix" v-bind="data" /></template>
104
- </BaseSelect>
105
- </template>
106
- </BaseInputContainer>
46
+ <div class="grid max-w-sm gap-3 rounded-[var(--bb-radius)] border p-3">
47
+ <div class="flex items-baseline justify-between gap-2">
48
+ <h3 class="text-sm font-medium">ISSUE-1842</h3>
49
+ <span class="text-xs text-[color:var(--bb-text-muted)]">In progress</span>
50
+ </div>
51
+ <p class="text-xs text-[color:var(--bb-text-muted)]">
52
+ Wire invoice PDF export for the Milan office.
53
+ </p>
54
+ <BbSelect
55
+ v-model="assignee"
56
+ clearable
57
+ compact
58
+ item-text="fullName"
59
+ item-value="id"
60
+ :items="teammates"
61
+ label="Assignee"
62
+ placeholder="Choose a teammate"
63
+ />
64
+ </div>
107
65
  </template>
66
+ <script setup lang="ts">
67
+ import { ref } from 'vue';
68
+ import { BbSelect } from 'bitboss-ui';
69
+
70
+ type Teammate = {
71
+ id: string;
72
+ fullName: string;
73
+ role: string;
74
+ };
108
75
 
109
- <script setup lang="ts" generic="T = any">
110
- import BaseInputContainer from '../BaseInputContainer/BaseInputContainer.vue';
111
- import BaseSelect from '../BaseSelect/BaseSelect.vue';
112
- import { ref, computed } from 'vue';
113
- import type { BbSelectProps, BbSelectEvents, BbSelectSlots } from './types';
114
-
115
- const props = withDefaults(defineProps<BbSelectProps<T>>(), {
116
- allowWriting: true,
117
- filterBy: () => [],
118
- prefill: 'focus',
119
- showChevron: true,
120
- });
76
+ // Raw domain objects — passed straight to `items`, never pre-mapped.
77
+ const teammates: Teammate[] = [
78
+ { id: 'ada', fullName: 'Ada Lovelace', role: 'Engineering' },
79
+ { id: 'grace', fullName: 'Grace Hopper', role: 'Engineering' },
80
+ { id: 'maggie', fullName: 'Margaret Hamilton', role: 'Flight Systems' },
81
+ { id: 'katherine', fullName: 'Katherine Johnson', role: 'Mathematics' },
82
+ ];
121
83
 
122
- const emit = defineEmits<BbSelectEvents>();
123
- defineSlots<BbSelectSlots<T>>();
84
+ // The model holds the resolved value (id), not the whole object.
85
+ const assignee = ref<string | null>(null);
86
+ </script>
87
+ ```
124
88
 
125
- const active = ref(false);
126
- const showHint = computed(() => props.persistentHint || active.value);
89
+ Value-identity rules (shared with every items-driven component — see the
90
+ Options and Items playbook):
91
+
92
+ - For primitive `items` (`string[]` / `number[]`) omit both mapping props — the
93
+ value is the primitive itself. For object items always set both: the defaults
94
+ are the whole item as value and `JSON.stringify(item)` as text.
95
+ - Matching compares **value hashes** (deep structural equality, not reference
96
+ identity), so object values survive refetches — but prefer primitive ids:
97
+ stable, unique, cheap to submit.
98
+ - Options resolving to a **duplicate value are silently dropped** (first wins).
99
+ - Per-option gating goes through `selectable`: a boolean (`false` disables every
100
+ option) or a predicate `(item) => boolean` — rejected options render disabled
101
+ and keyboard navigation skips them (e.g. `:selectable="(u) => u.active"`). A
102
+ `disabled` field on the item object itself is inert domain data — feed it to
103
+ the predicate. Alternatives: filter unavailable choices out of `items`, cap
104
+ with `max`, or disable the whole control with `disabled`.
105
+
106
+ ### The field around the control
107
+
108
+ `BbSelect` is a complete form field. Everything here is declarative — no custom
109
+ markup needed:
110
+
111
+ - **Label**: `label` (required), `hide-label`, `label-position`
112
+ (`left`/`center`/`right`), and `label-mode` — `outside` (the default via
113
+ global config `defaultInputLabelMode`), `floating`, or `inside`. `reverse`
114
+ swaps the order of label and control.
115
+ - **Guidance**: `description` renders always-visible helper text linked via
116
+ `aria-describedby`; `hint` shows contextual guidance while the field is
117
+ active (add `persistent-hint` to keep it visible).
118
+ - **Validation**: `has-errors` switches error styling; `errors` (string or
119
+ array) renders the messages, associated with the field for assistive tech.
120
+ `warnings` (string or array) is the amber counterpart of `errors` — the same
121
+ messages rendered below the field in their own `aria-live="polite"` region —
122
+ and referenced from `aria-describedby` while displayed — in
123
+ amber (`--bb-warn`), with a warning icon in the append stack, for a
124
+ valid-but-noteworthy selection; a non-empty `warnings` implies the warning
125
+ state, so `has-warning` just forces that chrome without a message. Unlike
126
+ `errors` it sets no `aria-invalid` — a soft "needs a second look" state. When
127
+ both are set the error state wins and the warning messages are suppressed, so
128
+ the field never shows amber while it has an error.
129
+ - **Form participation**: `name` renders hidden inputs carrying the selection
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.
134
+ - **Affixes**: `prepend:icon` / `append:icon` place icons in the control —
135
+ `append:icon` replaces the default chevron (there is no `#chevron` slot).
136
+ - **Value display**: `placeholder` shows when a _single-mode_ select is empty.
137
+ In multiple mode the placeholder is never rendered — use `description` /
138
+ `hint` for guidance instead.
139
+
140
+ **A complete form field**
127
141
 
128
- const eventListeners = {
129
- onBlur: (event: FocusEvent) => emit('blur', event),
130
- onChange: (event: Event) => emit('change', event),
131
- onClick: (event: MouseEvent) => emit('click', event),
132
- 'onOption:add': (text: string) => emit('option:add', text),
133
- onFocus: (event: FocusEvent) => {
134
- active.value = true;
135
- emit('focus', event);
136
- },
137
- onInactive: () => {
138
- active.value = false;
139
- emit('inactive');
140
- },
141
- onInput: (event: Event) => emit('input', event),
142
- 'onUpdate:modelValue': (value: any) => emit('update:modelValue', value),
143
- };
142
+ ```vue
143
+ <div class="max-w-sm">
144
+ <BbSelect
145
+ v-model="state.plan"
146
+ label="Plan"
147
+ description="You can change plan at any time."
148
+ hint="Yearly billing saves 20%"
149
+ placeholder="Choose a plan"
150
+ prepend:icon="lucide:credit-card"
151
+ required
152
+ clearable
153
+ :items="['Starter', 'Growth', 'Enterprise']"
154
+ />
155
+ </div>
156
+ ```
157
+
158
+ **Error state**
159
+
160
+ ```vue
161
+ <div class="max-w-sm">
162
+ <BbSelect
163
+ v-model="state.country"
164
+ label="Country"
165
+ placeholder="Required for invoicing"
166
+ has-errors
167
+ errors="Pick a country to continue"
168
+ :items="['Italy', 'Germany', 'Portugal']"
169
+ />
170
+ </div>
171
+ ```
172
+
173
+ ### Multiple selection and how it displays
174
+
175
+ Add `multiple` for multi-select; the model becomes an array and **must be seeded
176
+ as one** (`ref<string[]>([])`) — a non-array model throws at setup. Cap the
177
+ count with `max`: at the cap, unselected options auto-disable while selected
178
+ options never do, so the user can always deselect.
179
+
180
+ Selected values render as removable chips inside the control. When they no
181
+ longer fit the row, it collapses into a count summary ("N items selected", from
182
+ the active locale). You can steer that display:
183
+
184
+ - `max-selected-labels` collapses by **count** instead of by overflow width.
185
+ - `selected-labels-fn` customises the summary text (`(count) => string`).
186
+ - `comma` renders a plain comma-separated string instead of chips — values can
187
+ then only be deselected from the panel.
188
+ - Under `disabled` / `readonly`, chips become non-removable badges.
189
+
190
+ `clearable` shows a clear affix once there is a value; clearing resets the
191
+ model to `[]` (or `null` in single mode).
192
+
193
+ **Multi-select with a maximum and collapsed labels**
194
+
195
+ ```vue
196
+ <template>
197
+ <div class="grid max-w-sm gap-3 rounded-[var(--bb-radius)] border p-3">
198
+ <div>
199
+ <h3 class="text-sm font-medium">Warehouse coverage</h3>
200
+ <p class="text-xs text-[color:var(--bb-text-muted)]">
201
+ Cap at 3 hubs for the pilot route.
202
+ </p>
203
+ </div>
204
+ <BbSelect
205
+ v-model="cities"
206
+ clearable
207
+ compact
208
+ hint="Pick up to 3 cities"
209
+ item-text="label"
210
+ item-value="value"
211
+ :items="options"
212
+ label="Cities"
213
+ :max="3"
214
+ :max-selected-labels="2"
215
+ multiple
216
+ />
217
+ </div>
218
+ </template>
219
+ <script setup lang="ts">
220
+ import { ref } from 'vue';
221
+ import { BbSelect } from 'bitboss-ui';
222
+
223
+ const options = [
224
+ { label: 'Amsterdam', value: 'ams' },
225
+ { label: 'Berlin', value: 'ber' },
226
+ { label: 'Copenhagen', value: 'cph' },
227
+ { label: 'Lisbon', value: 'lis' },
228
+ { label: 'Milan', value: 'mil' },
229
+ ];
230
+
231
+ // `multiple` requires the model to be an array from the start.
232
+ const cities = ref<string[]>(['ber', 'mil']);
144
233
  </script>
234
+ ```
235
+
236
+ **Comma display for dense forms**
145
237
 
146
- <style lang="postcss">
147
- @import './index.css';
148
- </style>
238
+ ```vue
239
+ <template>
240
+ <div class="grid max-w-sm gap-3 rounded-[var(--bb-radius)] border p-3">
241
+ <div>
242
+ <h3 class="text-sm font-medium">Email digests</h3>
243
+ <p class="text-xs text-[color:var(--bb-text-muted)]">
244
+ Who gets the Monday summary?
245
+ </p>
246
+ </div>
247
+ <BbSelect
248
+ v-model="recipients"
249
+ comma
250
+ compact
251
+ item-text="name"
252
+ item-value="id"
253
+ :items="team"
254
+ label="Weekly digest recipients"
255
+ multiple
256
+ />
257
+ </div>
258
+ </template>
259
+ <script setup lang="ts">
260
+ import { ref } from 'vue';
261
+ import { BbSelect } from 'bitboss-ui';
262
+
263
+ const team = [
264
+ { id: 'ada', name: 'Ada Lovelace' },
265
+ { id: 'grace', name: 'Grace Hopper' },
266
+ { id: 'alan', name: 'Alan Turing' },
267
+ { id: 'maggie', name: 'Margaret Hamilton' },
268
+ ];
269
+
270
+ // `comma` renders the selection as plain comma-separated text: values can only
271
+ // be deselected from the panel, not removed from the control itself.
272
+ const recipients = ref<string[]>(['ada', 'grace']);
273
+ </script>
149
274
  ```
150
275
 
151
- ## Types
276
+ ### Panel actions: header, footer and select-all
152
277
 
153
- ```ts
154
- import type { HTMLAttributes, InputHTMLAttributes } from 'vue';
155
- import type { NestedKeyOf } from '@/types/NestedKeyOf';
156
- import type { IconType } from '@/types/Icon';
157
- import type { BaseSelectEvents } from '../BaseSelect/types';
158
-
159
- export type BbSelectProps<T = any> = {
160
- /**
161
- * Allows typing into the input.
162
- */
163
- allowWriting?: boolean | 'not-mobile';
164
-
165
- /**
166
- * Name of the icon to be added at the end of the input.
167
- */
168
- // eslint-disable-next-line vue/prop-name-casing
169
- 'append:icon'?: IconType;
170
-
171
- /**
172
- * Guides to the browser as to the type of information expected in the field.
173
- */
174
- autocomplete?: InputHTMLAttributes['autocomplete'];
175
-
176
- /**
177
- * Sets autofocus on page load.
178
- */
179
- autofocus?: InputHTMLAttributes['autofocus'];
180
-
181
- /**
182
- * Displays a clear button when the input has a value and is being interacted with.
183
- */
184
- clearable?: boolean;
185
-
186
- /**
187
- * Sets the display model for selected values to a list of comma separated string.
188
- * In this mode the user cannot deselect an option by pressing the close button.
189
- */
190
- comma?: boolean;
191
-
192
- /**
193
- * Sets the component in a compact mode.
194
- */
195
- compact?: boolean;
196
-
197
- /**
198
- * Defines an array of dependencies that will trigger actions in the component upon change.
199
- */
200
- dependencies?: any[];
201
-
202
- /**
203
- * Timeout used to debounce response to changes to dependencies.
204
- */
205
- depsDebounceTime?: number;
206
-
207
- /**
208
- * Direction of the layout of the component. Can either be a predefined value or a
209
- * pattern separated by a space like `xx xxxxx`.
210
- */
211
- direction?: 'horizontal' | 'vertical' | 'auto' | string;
212
-
213
- /**
214
- * Disables the component.
215
- */
216
- disabled?: boolean;
217
-
218
- /**
219
- * If coherence is enforced the input cannot have a modelValue that is incoherent
220
- * with its current items. modelValue will be reset upon incoherence.
221
- */
222
- enforceCoherence?: boolean;
223
-
224
- /**
225
- * Can be a string or an array of string containing the messages to display.
226
- */
227
- errors?: string | string[];
228
-
229
- /**
230
- * Defines how the filtering should work.
231
- */
232
- filterBy?:
233
- | string
234
- | string[]
235
- | false
236
- | 'not_stashed'
237
- | ((value: any, item: T, query: string | null) => boolean)
238
- | null;
239
-
240
- /**
241
- * Path to item property for grouping options.
242
- */
243
- groupBy?: string | ((item: T) => string | number | symbol);
244
-
245
- /**
246
- * Define if the component should be in an error state.
247
- * It usually attaches a CSS class for styling purposes.
248
- */
249
- hasErrors?: boolean;
250
-
251
- /**
252
- * Visually hides the label of the input while maintaining accessibility.
253
- */
254
- hideLabel?: boolean;
255
-
256
- /**
257
- * Text box to be displayed near the input, usually to indicate instructions.
258
- */
259
- hint?: string;
260
-
261
- /**
262
- * The identifier of the component.
263
- */
264
- id?: HTMLAttributes['id'];
265
-
266
- /**
267
- * Used to retrieve items; can be an array or a function.
268
- */
269
- items:
270
- | T[]
271
- | ((query: string, prefill: boolean, modelValue: any) => Promise<T[]>)
272
- | ((query: string, prefill: boolean, modelValue: any) => T[]);
273
-
274
- /**
275
- * Height of group headers in the listbox (px). Defaults to 24px (compact) or 32px.
276
- * Only applies when `groupBy` is set.
277
- */
278
- headerHeight?: number;
279
-
280
- /**
281
- * Height of the options in the listbox. By default it will be 32px for the compact
282
- * variant and 40px for the regular variant.
283
- *
284
- * @defaultValue `40`
285
- */
286
- itemHeight?: number;
287
-
288
- /**
289
- * Defines a path that returns a property of the object to use as text or a function
290
- * that returns a string.
291
- */
292
- itemText?: T extends object
293
- ? NestedKeyOf<T> | ((item: T) => string)
294
- : ((item: T) => string) | undefined;
295
-
296
- /**
297
- * Defines a path that returns a property of the object to use as value or a function
298
- * that returns any value.
299
- */
300
- itemValue?: T extends object
301
- ? NestedKeyOf<T> | ((item: T) => any)
302
- : ((item: T) => any) | undefined;
303
-
304
- /**
305
- * Text content of the label of the element.
306
- */
307
- label: string;
278
+ The `#header` and `#footer` slots pin content above the search field and below
279
+ the options list — the same markup renders in the desktop popover and the
280
+ mobile adaptive sheet. Both receive `{ close, clear, focus, query,
281
+ selectedOptions }`: `close()` closes the panel, `clear()` empties the
282
+ selection, `focus()` refocuses the search input, and `selectedOptions` are the
283
+ resolved selected options (`.text` / `.value` / raw `.item`).
284
+
285
+ Select-all is not built in — it is a one-liner in a panel slot, because the
286
+ v-model is yours:
287
+
288
+ **Select all + done in the footer**
289
+
290
+ ```vue
291
+ <template>
292
+ <div class="grid max-w-sm gap-3 rounded-[var(--bb-radius)] border p-3">
293
+ <div>
294
+ <h3 class="text-sm font-medium">Incident alerts</h3>
295
+ <p class="text-xs text-[color:var(--bb-text-muted)]">
296
+ Where should paging go when severity is high?
297
+ </p>
298
+ </div>
299
+ <BbSelect
300
+ v-model="channels"
301
+ compact
302
+ item-text="label"
303
+ item-value="value"
304
+ :items="options"
305
+ label="Notify via"
306
+ :max-selected-labels="2"
307
+ multiple
308
+ :selected-labels-fn="(count) => `${count} channels`"
309
+ >
310
+ <template #footer="{ close, clear, selectedOptions }">
311
+ <div class="flex w-full items-center gap-1.5">
312
+ <BbButton
313
+ size="xs"
314
+ variant="ghost"
315
+ @click="channels = options.map((option) => option.value)"
316
+ >
317
+ Select all
318
+ </BbButton>
319
+ <BbButton size="xs" variant="ghost" @click="clear">Clear</BbButton>
320
+ <BbButton class="ml-auto" size="xs" variant="primary" @click="close">
321
+ Done ({{ selectedOptions.length }})
322
+ </BbButton>
323
+ </div>
324
+ </template>
325
+ </BbSelect>
326
+ </div>
327
+ </template>
328
+ <script setup lang="ts">
329
+ import { ref } from 'vue';
330
+ import { BbSelect, BbButton } from 'bitboss-ui';
331
+
332
+ const options = [
333
+ { label: 'Email', value: 'email' },
334
+ { label: 'SMS', value: 'sms' },
335
+ { label: 'Push notification', value: 'push' },
336
+ { label: 'Slack', value: 'slack' },
337
+ ];
338
+
339
+ const channels = ref<string[]>(['email']);
340
+ </script>
341
+ ```
342
+
343
+ The `#header` slot is the mirror image: pin context above the search field — a
344
+ live summary of the selection, computed from your own model since the v-model
345
+ is yours:
346
+
347
+ **A pinned header with a live summary**
348
+
349
+ ```vue
350
+ <template>
351
+ <div class="grid max-w-sm gap-3 rounded-[var(--bb-radius)] border p-3">
352
+ <div>
353
+ <h3 class="text-sm font-medium">Lisbon half-day</h3>
354
+ <p class="text-xs text-[color:var(--bb-text-muted)]">
355
+ Build a route under about four hours.
356
+ </p>
357
+ </div>
358
+ <BbSelect
359
+ v-model="stops"
360
+ compact
361
+ hint="A half-day tour fits roughly 4 hours"
362
+ item-text="name"
363
+ item-value="id"
364
+ :items="catalog"
365
+ label="Tour stops"
366
+ :max-selected-labels="2"
367
+ multiple
368
+ >
369
+ <template #header="{ clear }">
370
+ <div
371
+ class="flex w-full items-center justify-between gap-2 px-1 text-xs text-[color:var(--bb-text-muted)]"
372
+ >
373
+ <span>{{ summary }}</span>
374
+ <BbButton
375
+ :disabled="!stops.length"
376
+ size="xs"
377
+ variant="ghost"
378
+ @click="clear"
379
+ >
380
+ Reset
381
+ </BbButton>
382
+ </div>
383
+ </template>
384
+ </BbSelect>
385
+ </div>
386
+ </template>
387
+ <script setup lang="ts">
388
+ import { computed, ref } from 'vue';
389
+ import { BbSelect, BbButton } from 'bitboss-ui';
390
+
391
+ type Stop = { id: string; name: string; durationMin: number };
392
+
393
+ const catalog: Stop[] = [
394
+ { id: 'belem', name: 'Belém Tower', durationMin: 45 },
395
+ { id: 'jeronimos', name: 'Jerónimos Monastery', durationMin: 60 },
396
+ { id: 'alfama', name: 'Alfama walking tour', durationMin: 90 },
397
+ { id: 'tram28', name: 'Tram 28 ride', durationMin: 40 },
398
+ { id: 'oceanario', name: 'Oceanário aquarium', durationMin: 120 },
399
+ { id: 'lxfactory', name: 'LX Factory market', durationMin: 60 },
400
+ ];
401
+
402
+ const stops = ref<string[]>(['belem', 'alfama']);
403
+
404
+ // The panel slots also expose `selectedOptions`, but the v-model is ours —
405
+ // deriving the summary from it keeps the header logic on plain typed data.
406
+ const summary = computed(() => {
407
+ if (!stops.value.length) return 'No stops yet';
408
+ const total = stops.value.reduce(
409
+ (sum, id) =>
410
+ sum + (catalog.find((stop) => stop.id === id)?.durationMin ?? 0),
411
+ 0
412
+ );
413
+ const hours = Math.floor(total / 60);
414
+ const minutes = total % 60;
415
+ return `${stops.value.length} stops · ~${hours}h${minutes ? ` ${minutes}m` : ''}`;
416
+ });
417
+ </script>
418
+ ```
419
+
420
+ ### Search and filtering semantics
421
+
422
+ The panel carries a search field (role `searchbox`). How typing filters depends
423
+ on your setup:
424
+
425
+ - **Array `items`**: typing filters locally — a case-insensitive **substring**
426
+ match against each option's display text.
427
+ - **`filter-by: ['path', ...]`**: the listed item paths are searched **instead
428
+ of** the display text (no fallback union with the text). Every path must
429
+ exist on every item, or matching throws. Use it to also match a city by its
430
+ country, a member by email.
431
+ - **Provider `items`**: the provider re-runs with the query (next section) —
432
+ and the local text filter **still applies on top of the response**. Results
433
+ whose display text (or `filter-by` paths) don't contain the query substring
434
+ are hidden, so fuzzy or synonym-based server matches can vanish. Keep server
435
+ search substring-compatible, or point `filter-by` at a field the server
436
+ guarantees to match.
437
+ - **Single-mode exception**: when the query equals the selected option's text
438
+ (as right after picking), the list shows unfiltered.
439
+ - **`disable-writing`** removes the search field entirely (`true`, or
440
+ `'mobile'` / `'desktop'` to remove it on one platform only) — this is also
441
+ the supported way to disable filtering; there is no "falsy `filter-by`"
442
+ escape hatch.
443
+
444
+ **Match on fields other than the display text**
445
+
446
+ ```vue
447
+ <template>
448
+ <div class="grid max-w-sm gap-3 rounded-[var(--bb-radius)] border p-3">
449
+ <div>
450
+ <h3 class="text-sm font-medium">Shipping destination</h3>
451
+ <p class="text-xs text-[color:var(--bb-text-muted)]">
452
+ Search by city or country name.
453
+ </p>
454
+ </div>
455
+ <BbSelect
456
+ v-model="city"
457
+ compact
458
+ :filter-by="['label', 'country']"
459
+ item-text="label"
460
+ item-value="id"
461
+ :items="cities"
462
+ label="City"
463
+ placeholder="Search city or country"
464
+ />
465
+ </div>
466
+ </template>
467
+ <script setup lang="ts">
468
+ import { ref } from 'vue';
469
+ import { BbSelect } from 'bitboss-ui';
470
+
471
+ type City = { label: string; country: string; id: string };
472
+
473
+ // `filter-by` searches these item paths instead of the display text, so a
474
+ // city matches by its country too — every listed path must exist on every item.
475
+ const cities: City[] = [
476
+ { label: 'Milan', country: 'Italy', id: 'mil' },
477
+ { label: 'Rome', country: 'Italy', id: 'rom' },
478
+ { label: 'Lisbon', country: 'Portugal', id: 'lis' },
479
+ { label: 'Porto', country: 'Portugal', id: 'por' },
480
+ ];
481
+
482
+ const city = ref<string | null>(null);
483
+ </script>
484
+ ```
485
+
486
+ ### Fetch options with a provider
487
+
488
+ When options come from a backend, pass a **function** to `items` instead of an
489
+ array. It receives `(query, prefill, modelValue)` and returns `T[]` or a
490
+ `Promise<T[]>` — the full call matrix lives in the Fetch Items playbook. The
491
+ short version:
492
+
493
+ - `prefill === false` means exactly one thing: **the user typed**. Search then.
494
+ - Every component-initiated call (first load, dependency change, external model
495
+ update) passes `prefill === true` and expects the current selection to stay
496
+ resolvable in the response — return the selected items (by id) so chosen
497
+ values are never orphaned.
498
+ - `modelValue` is your v-model as-is (array in multiple mode, the raw model
499
+ value — possibly `null` — otherwise); the prop declares it `any`, so annotate
500
+ it `any` or your own model type.
501
+
502
+ **Async, debounced member search**
503
+
504
+ ```vue
505
+ <template>
506
+ <div class="grid max-w-sm gap-3 rounded-[var(--bb-radius)] border p-3">
507
+ <div>
508
+ <h3 class="text-sm font-medium">Pull request reviewers</h3>
509
+ <p class="text-xs text-[color:var(--bb-text-muted)]">
510
+ Search the directory; picks stay pinned.
511
+ </p>
512
+ </div>
513
+ <BbSelect
514
+ v-model="reviewers"
515
+ clearable
516
+ compact
517
+ hint="Type a name to search"
518
+ item-text="name"
519
+ item-value="id"
520
+ :items="searchMembers"
521
+ label="Reviewers"
522
+ loading-text="Searching…"
523
+ multiple
524
+ no-data-text="No members match your search"
525
+ persistent-hint
526
+ :query-debounce-time="300"
527
+ stash
528
+ />
529
+ </div>
530
+ </template>
531
+ <script setup lang="ts">
532
+ import { ref } from 'vue';
533
+ import { BbSelect } from 'bitboss-ui';
308
534
 
309
- /**
310
- * Sets the text alignment of the label.
311
- */
312
- labelPosition?: 'left' | 'center' | 'right';
313
-
314
- /**
315
- * Sets the component in a loading state, usually triggering some visual styles.
316
- */
317
- loading?: boolean;
318
-
319
- /**
320
- * String displayed while items are being loaded.
321
- */
322
- loadingText?: string;
323
-
324
- /**
325
- * Maximum number of selectable items when the multiple flag is set.
326
- */
327
- max?: number;
328
-
329
- /**
330
- * Maximum number of labels shown before collapsing to a count summary.
331
- */
332
- maxSelectedLabels?: number;
333
-
334
- /**
335
- * Used by v-model. Can be any serializable type.
336
- */
337
- modelValue: any;
338
-
339
- /**
340
- * Timeout used to debounce response to changes to modelValue.
341
- */
342
- modelValueDebounceTime?: number;
343
-
344
- /**
345
- * Allows the selection of multiple items.
346
- */
347
- multiple?: boolean;
348
-
349
- /**
350
- * Defines the name of the input.
351
- */
352
- name?: InputHTMLAttributes['name'];
353
-
354
- /**
355
- * String displayed when there are no items to display.
356
- */
357
- noDataText?: string;
358
-
359
- /**
360
- * Keeps the hint displayed.
361
- */
362
- persistentHint?: boolean;
363
-
364
- /**
365
- * String displayed when there's no data.
366
- */
367
- placeholder?: InputHTMLAttributes['placeholder'];
368
-
369
- /**
370
- * Defines the prefill strategy for the input. By default the input will prefill
371
- * on focus. It can also always prefill with `true` and only prefill on search with `false`.
372
- *
373
- * @defaultValue `'focus'`
374
- */
375
- prefill?: boolean | 'focus';
376
-
377
- /**
378
- * Name of the icon to be added at the start of the input.
379
- */
380
- // eslint-disable-next-line vue/prop-name-casing
381
- 'prepend:icon'?: IconType;
382
-
383
- /**
384
- * Sets the input as required.
385
- */
386
- required?: boolean;
387
-
388
- /**
389
- * Time to wait when the user stops writing in the input before querying data.
390
- */
391
- queryDebounceTime?: number;
392
-
393
- /**
394
- * Sets the input in a readonly state.
395
- */
396
- readonly?: boolean;
397
-
398
- /**
399
- * Reverses the layout. Applicable in every direction the order of the label and
400
- * the input is swapped.
401
- */
402
- reverse?: boolean;
403
-
404
- /**
405
- * Function that returns a string to be displayed when the number of selected labels
406
- * is greater than `maxSelectedLabels`.
407
- */
408
- selectedLabelsFn?: (count: number) => string;
409
-
410
- /**
411
- * If true, the chevron will be shown.
412
- *
413
- * @defaultValue `true`
414
- */
415
- showChevron?: boolean;
416
-
417
- /**
418
- * Adds a stash to accumulate selected values across searches.
419
- */
420
- stash?: boolean;
421
-
422
- /**
423
- * How long the transition has to last in milliseconds.
424
- */
425
- transitionDuration?: number;
426
-
427
- /**
428
- * Pass `true` if the dropdown is not updating following movement in the UI, like in modals.
429
- * Very expensive so use with care.
430
- */
431
- updateOnAnimationFrame?: boolean;
535
+ type Member = {
536
+ id: string;
537
+ name: string;
432
538
  };
433
539
 
434
- /** Re-export for consumers importing events type from BbSelect. */
435
- export type BbSelectEvents = BaseSelectEvents;
540
+ // Stand-in for a real API. In a product this is `api.members.search(...)`.
541
+ const directory: Member[] = [
542
+ { id: 'ada', name: 'Ada Lovelace' },
543
+ { id: 'alan', name: 'Alan Turing' },
544
+ { id: 'grace', name: 'Grace Hopper' },
545
+ { id: 'katherine', name: 'Katherine Johnson' },
546
+ { id: 'ken', name: 'Ken Thompson' },
547
+ { id: 'maggie', name: 'Margaret Hamilton' },
548
+ ];
549
+
550
+ const fetchFromApi = (predicate: (member: Member) => boolean) =>
551
+ new Promise<Member[]>((resolve) => {
552
+ setTimeout(() => resolve(directory.filter(predicate)), 250);
553
+ });
554
+
555
+ // With `stash`, picked options stay resolvable across later searches, so the
556
+ // provider only ever answers the current query — no need to merge the selected
557
+ // members back into every response.
558
+ const searchMembers = (
559
+ query: string,
560
+ _prefill: boolean,
561
+ _modelValue: string[]
562
+ ): Promise<Member[]> => {
563
+ const q = query.trim().toLowerCase();
564
+ if (!q) return Promise.resolve([]);
565
+ return fetchFromApi((member) => member.name.toLowerCase().includes(q));
566
+ };
436
567
 
437
- /** Props exposed by the `label` slot. */
438
- export type BbSelectLabelSlotProps = {
439
- /** The `label` prop value. */
440
- text: string;
441
- /** Whether the input is in an error state. */
442
- hasErrors: boolean;
568
+ const reviewers = ref<string[]>([]);
569
+ </script>
570
+ ```
571
+
572
+ ```ts
573
+ const searchMembers = async (
574
+ query: string,
575
+ prefill: boolean,
576
+ modelValue: string[]
577
+ ): Promise<Member[]> => {
578
+ // Component-initiated: keep the current selection resolvable.
579
+ if (prefill && modelValue.length) {
580
+ return api.members.byIds(modelValue);
581
+ }
582
+ if (!query.trim()) return []; // project-defined idle behavior
583
+ return api.members.search({ query });
443
584
  };
585
+ ```
586
+
587
+ Runtime guarantees you should not re-implement:
588
+
589
+ - **Debouncing**: typing is debounced by `query-debounce-time` (default 500ms);
590
+ dependency reloads by `deps-debounce-time` (default 0); external model-change
591
+ reloads by `model-value-debounce-time` (default 0).
592
+ - **Race protection**: out-of-order responses are discarded — only the latest
593
+ request writes items.
594
+ - **Loading**: in-flight requests set the loading state automatically — the
595
+ `loading` prop is only for _external_ pending state (e.g. the parent form).
596
+ - **Errors**: a rejected provider is logged (`console.error`) and the previous
597
+ items are kept; surface failures yourself (e.g. `useToast`) if the user must
598
+ know.
599
+ - **Panel states**: `loading-text` / `no-data-text` (locale defaults
600
+ "Loading..." / "No data to display") or the `#loading` / `#no-data` slots —
601
+ both receive `{ query }`, `#no-data` also a `focus()` callback.
602
+
603
+ Enable `stash` to accumulate picked options across searches: selected values
604
+ stay resolvable (chips keep their text, coherence keeps passing) even when
605
+ later responses don't include them — no need to merge them into every response.
606
+
607
+ ### Laziness and prefill
608
+
609
+ `prefill` controls **when the first load happens**:
610
+
611
+ - `'interaction'` (default) — on the first open.
612
+ - `true` — immediately on mount, and during SSR (`onServerPrefetch`), so the
613
+ panel is warm on hydration.
614
+ - `false` — **search-first**: nothing loads until the user types. Opening is not
615
+ a search, so the panel opens empty and shows a _"search to begin"_ hint until
616
+ the first query. Use it when the result set is too big or too costly to browse
617
+ and the query is the only sensible entry point.
618
+
619
+ When the model already has a value, `BbSelect` upgrades to immediate prefill
620
+ regardless of the setting, so the selection can render its text right away — so
621
+ `false` never strands a seeded value. **Array `items` are never lazy either** —
622
+ there is no request to defer, so they resolve on mount whatever `prefill` says.
623
+
624
+ Search-first also needs a search field to exist, so `disable-writing` (which
625
+ hides it) falls back to loading on open — otherwise the user would face an empty
626
+ panel with no way to fill it.
627
+
628
+ That upgrade reads "has a value" as "is not empty", and `null` counts as
629
+ **empty** — which is the one case where you must ask for the load yourself (see
630
+ the next section).
631
+
632
+ Laziness also gates coherence: an untouched `prefill: 'interaction'` select — or
633
+ an un-searched `prefill: false` one — with a **provider** and an **empty** model
634
+ ignores `dependencies` and external model changes until its first load. Don't
635
+ "fix" the quiet period with eager watchers: there is nothing on screen to keep
636
+ coherent yet, and the first load reads the current dependencies anyway. The user's
637
+ first search counts as that load, so a search-first select tracks `dependencies`
638
+ from then on.
639
+
640
+ ### An "All" / "Any" option (`null` as a real value)
641
+
642
+ Distinct from the [select-all footer button](#panel-actions-header-footer-and-select-all)
643
+ above: that fills a `multiple` array with every option. This is a **single**
644
+ select where one option means _"everything"_ — the "no filter" row at the top of
645
+ a location or status filter.
646
+
647
+ Model it as a real option whose value is `null`, returned by your provider (or
648
+ present in your array) like any other. It resolves and renders as the selection.
649
+
650
+ **The one requirement: with a provider, set `prefill: true`.** `null` is also the
651
+ value the library reads as _nothing selected_, so the automatic
652
+ model-has-a-value upgrade does **not** fire for it. Nothing loads, there is no
653
+ text to show, and the field falls back to the **placeholder** — greyed, and
654
+ indistinguishable from an empty select, while your model holds a real choice.
655
+ The library cannot tell that `null` means "All" in your app without loading the
656
+ options to look, so you have to say so:
657
+
658
+ **An 'All locations' filter (provider + prefill)**
444
659
 
445
- /** Props exposed by the `option` slot. */
446
- export type BbSelectOptionSlotProps<T> = {
447
- /** Whether this option is disabled. */
448
- disabled: boolean;
449
- /** Whether this option currently has keyboard focus. */
450
- focused: boolean;
451
- /** Zero-based index of this option in the list. */
452
- index: number;
453
- /** Whether the select is in an error state. */
454
- hasErrors?: boolean;
455
- /** The raw item from the `items` prop. */
456
- item: T;
457
- /** Whether items are still being fetched. */
458
- loading: boolean;
459
- /** Whether this option is currently selected. */
460
- selected: boolean;
461
- /** The resolved display text for this option. */
462
- text: string;
463
- /** The resolved value for this option. */
464
- value: any;
660
+ ```vue
661
+ <template>
662
+ <div class="grid max-w-sm gap-3 rounded-[var(--bb-radius)] border p-3">
663
+ <div>
664
+ <h3 class="text-sm font-medium">Invoice filters</h3>
665
+ <p class="text-xs text-[color:var(--bb-text-muted)]">
666
+ Office location, or every office.
667
+ </p>
668
+ </div>
669
+ <BbSelect
670
+ v-model="location"
671
+ compact
672
+ item-text="label"
673
+ item-value="value"
674
+ :items="loadLocations"
675
+ label="Location"
676
+ placeholder="Select location…"
677
+ prefill
678
+ />
679
+ <p class="text-xs text-[color:var(--bb-text-muted)]">
680
+ Filtering by:
681
+ <strong>{{ location === null ? 'All locations' : location }}</strong>
682
+ </p>
683
+ </div>
684
+ </template>
685
+ <script setup lang="ts">
686
+ import { ref } from 'vue';
687
+ import { BbSelect } from 'bitboss-ui';
688
+
689
+ type Location = { label: string; value: string | null };
690
+
691
+ const pool: Location[] = [
692
+ { label: 'Milan', value: 'milan' },
693
+ { label: 'Rome', value: 'rome' },
694
+ { label: 'Berlin', value: 'berlin' },
695
+ ];
696
+
697
+ /**
698
+ * "Everything" is modelled as a real option whose value is `null`, sitting at
699
+ * the top of the list next to the concrete ones. Returned by the provider like
700
+ * any other option — the component does not synthesise it.
701
+ */
702
+ const ALL: Location = { label: 'All locations', value: null };
703
+
704
+ // `null` is the seeded value, and here it means "All locations" — not "empty".
705
+ const location = ref<string | null>(null);
706
+
707
+ const loadLocations = (
708
+ query: string,
709
+ prefill: boolean
710
+ ): Promise<Location[]> => {
711
+ const q = query.trim().toLowerCase();
712
+ const matches =
713
+ prefill || !q
714
+ ? pool
715
+ : pool.filter((l) => l.label.toLowerCase().includes(q));
716
+ // "All" always leads the list; it is not filtered out by a search.
717
+ return new Promise((resolve) =>
718
+ setTimeout(() => resolve([ALL, ...matches]), 200)
719
+ );
465
720
  };
721
+ </script>
722
+ ```
723
+
724
+ With an **array** you need nothing at all — arrays are never lazy, so "All
725
+ locations" renders from the first paint:
726
+
727
+ **The same thing with array items — no prefill needed**
728
+
729
+ ```vue
730
+ <BbSelect
731
+ v-model="state.location"
732
+ item-text="label"
733
+ item-value="value"
734
+ :items="[
735
+ { label: 'All locations', value: null },
736
+ { label: 'Milan', value: 'milan' },
737
+ { label: 'Rome', value: 'rome' },
738
+ ]"
739
+ label="Location"
740
+ placeholder="Select location…"
741
+ />
742
+ ```
743
+
744
+ Know what else you inherit by overloading `null`, because the component cannot
745
+ distinguish the two meanings:
466
746
 
467
- /** Props exposed by the `group` slot. */
468
- export type BbSelectGroupSlotProps<T> = {
469
- /** The display text for this group. */
470
- text: string;
471
- /** The raw group item. */
472
- item: T;
473
- /** Zero-based index of the first option in this group. */
474
- index: number;
475
- /** Number of options in this group. */
476
- length: number;
477
- /** Whether all options in this group are disabled. */
478
- disabled: boolean;
747
+ - **`clear` selects "All".** The clear button emits `null`, which is now a
748
+ choice, not an absence.
749
+ - **`enforce-coherence` never prunes it** — an empty selection is always
750
+ coherent, so the "All" value is never questioned.
751
+ - **A prune of some _other_ stale value widens to "All"**, because enforcement
752
+ emits `null` in single mode. A dead filter value becomes "show everything"
753
+ rather than "show nothing".
754
+
755
+ If "everything" and "nothing" must stay distinct — a required field, or a filter
756
+ where widening is unsafe — use a **sentinel** instead (`value: 'all'`). Then
757
+ `null` keeps meaning empty, but the sentinel must appear in **every** provider
758
+ response or `enforce-coherence` will prune it, and it counts as a value, so it
759
+ triggers the eager-prefill upgrade on its own.
760
+
761
+ ### Dependent fields and enforced coherence
762
+
763
+ When one select constrains another, list the upstream value in `dependencies`:
764
+ the component re-runs its `items` provider whenever a dependency changes
765
+ (value-hash compared, so array identity churn doesn't refetch), debounced by
766
+ `deps-debounce-time`. Add `enforce-coherence` so a now-invalid selection is
767
+ cleaned up automatically. Details in the Coherence playbook.
768
+
769
+ **Region drives the city options**
770
+
771
+ ```vue
772
+ <template>
773
+ <div class="grid max-w-sm gap-3 rounded-[var(--bb-radius)] border p-3">
774
+ <div>
775
+ <h3 class="text-sm font-medium">Shipping address</h3>
776
+ <p class="text-xs text-[color:var(--bb-text-muted)]">
777
+ City options follow the chosen region.
778
+ </p>
779
+ </div>
780
+ <BbSelect
781
+ v-model="region"
782
+ compact
783
+ item-text="label"
784
+ item-value="value"
785
+ :items="regions"
786
+ label="Region"
787
+ placeholder="Pick a region"
788
+ />
789
+ <BbSelect
790
+ v-model="city"
791
+ compact
792
+ :dependencies="[region]"
793
+ :deps-debounce-time="150"
794
+ enforce-coherence
795
+ item-text="label"
796
+ item-value="value"
797
+ :items="loadCities"
798
+ label="City"
799
+ :placeholder="region ? 'Pick a city' : 'Select a region first'"
800
+ />
801
+ </div>
802
+ </template>
803
+ <script setup lang="ts">
804
+ import { ref } from 'vue';
805
+ import { BbSelect } from 'bitboss-ui';
806
+
807
+ type Region = { label: string; value: string };
808
+ type City = { label: string; value: string; region: string };
809
+
810
+ const regions: Region[] = [
811
+ { label: 'Italy', value: 'it' },
812
+ { label: 'Germany', value: 'de' },
813
+ { label: 'Portugal', value: 'pt' },
814
+ ];
815
+
816
+ const cityPool: City[] = [
817
+ { label: 'Rome', value: 'rome', region: 'it' },
818
+ { label: 'Milan', value: 'milan', region: 'it' },
819
+ { label: 'Berlin', value: 'berlin', region: 'de' },
820
+ { label: 'Munich', value: 'munich', region: 'de' },
821
+ { label: 'Lisbon', value: 'lisbon', region: 'pt' },
822
+ { label: 'Porto', value: 'porto', region: 'pt' },
823
+ ];
824
+
825
+ // Single-mode enforcement resolves to `null` — seed the models accordingly.
826
+ const region = ref<string | null>(null);
827
+ const city = ref<string | null>(null);
828
+
829
+ // The provider reads the selected region; the component re-runs it whenever
830
+ // `region` changes because it is listed in `dependencies`. Component-initiated
831
+ // calls (`prefill === true`) return the region's whole pool so a still-valid
832
+ // city stays resolvable; `enforce-coherence` clears one that no longer fits.
833
+ const loadCities = (query: string, prefill: boolean): Promise<City[]> => {
834
+ const pool = cityPool.filter((c) => c.region === region.value);
835
+ const q = query.trim().toLowerCase();
836
+ const matches =
837
+ prefill || !q
838
+ ? pool
839
+ : pool.filter((c) => c.label.toLowerCase().includes(q));
840
+ return new Promise((resolve) => setTimeout(() => resolve(matches), 200));
479
841
  };
842
+ </script>
843
+ ```
844
+
845
+ What enforcement emits when a reload leaves the model incoherent:
846
+
847
+ - multiple → `update:modelValue` with the **filtered array** (still-valid
848
+ entries survive);
849
+ - single → `update:modelValue` with **`null`** — seed single models as
850
+ `ref<T | null>(null)` and treat `null` as "nothing valid" in submit logic;
851
+ - an empty selection is always coherent, so nothing fires.
852
+
853
+ In multiple mode the pruning shows up as a filtered chip row. Here switching
854
+ the project keeps reviewers who belong to the new team and drops the rest —
855
+ no watcher, no manual reset:
856
+
857
+ **Project change prunes reviewers**
480
858
 
481
- export type BbSelectSlots<T> = {
482
- /**
483
- * Content appended inside the input field, after the value area.
484
- */
485
- append?: (props: { query: string; focus: () => void }) => any;
486
- /**
487
- * Content appended outside the input field wrapper.
488
- */
489
- 'append-outer'?: (props: { query: string }) => any;
490
- /**
491
- * Replaces the default dropdown chevron icon.
492
- */
493
- chevron?: (props: { loading: boolean; shown: boolean }) => any;
494
- /**
495
- * Replaces the default label text rendered above the input.
496
- */
497
- label?: (props: BbSelectLabelSlotProps) => any;
498
- /**
499
- * Content shown inside the options dropdown while items are loading.
500
- */
501
- loading?: (props: { query: string }) => any;
502
- /**
503
- * Content shown when no options match the query or the list is empty.
504
- */
505
- 'no-data'?: (props: { query: string; focus: () => void }) => any;
506
- /**
507
- * Replaces the default rendering of each option row in the dropdown.
508
- */
509
- option?: (props: BbSelectOptionSlotProps<T>) => any;
510
- /**
511
- * Replaces the default group header rendered above grouped options.
512
- */
513
- group?: (props: BbSelectGroupSlotProps<T>) => any;
514
- /**
515
- * Content appended inside the options list, after the last option.
516
- */
517
- 'options:append'?: (props: {
518
- focus: () => void;
519
- close: () => Promise<void>;
520
- }) => any;
521
- /**
522
- * Content appended outside the options list container.
523
- */
524
- 'options:append:outer'?: (props: { focus: () => void }) => any;
525
- /**
526
- * Content prepended inside the options list, before the first option.
527
- */
528
- 'options:prepend'?: (props: {
529
- focus: () => void;
530
- close: () => Promise<void>;
531
- }) => any;
532
- /**
533
- * Content prepended outside the options list container.
534
- */
535
- 'options:prepend:outer'?: (props: { focus: () => void }) => any;
536
- /**
537
- * Content rendered as an inline prefix inside the input field.
538
- */
539
- prefix?: (props: object) => any;
540
- /**
541
- * Content prepended inside the input field, before the value area.
542
- */
543
- prepend?: (props: { query: string; focus: () => void }) => any;
544
- /**
545
- * Content prepended outside the input field wrapper.
546
- */
547
- 'prepend-outer'?: (props: { query: string }) => any;
548
- /**
549
- * Content rendered as an inline suffix inside the input field.
550
- */
551
- suffix?: (props: object) => any;
859
+ ```vue
860
+ <template>
861
+ <div class="grid max-w-sm gap-3 rounded-[var(--bb-radius)] border p-3">
862
+ <div>
863
+ <h3 class="text-sm font-medium">Review request</h3>
864
+ <p class="text-xs text-[color:var(--bb-text-muted)]">
865
+ Reviewers must belong to the selected project.
866
+ </p>
867
+ </div>
868
+ <BbSelect
869
+ v-model="project"
870
+ compact
871
+ item-text="name"
872
+ item-value="id"
873
+ :items="projects"
874
+ label="Project"
875
+ />
876
+ <BbSelect
877
+ v-model="reviewers"
878
+ compact
879
+ :dependencies="[project]"
880
+ :deps-debounce-time="150"
881
+ enforce-coherence
882
+ hint="Only members of the selected project can review"
883
+ item-text="name"
884
+ item-value="id"
885
+ :items="loadReviewers"
886
+ label="Reviewers"
887
+ multiple
888
+ name="reviewers"
889
+ />
890
+ </div>
891
+ </template>
892
+ <script setup lang="ts">
893
+ import { ref } from 'vue';
894
+ import { BbSelect } from 'bitboss-ui';
895
+
896
+ type Project = { id: string; name: string };
897
+ type Member = { id: string; name: string; projects: string[] };
898
+
899
+ const projects: Project[] = [
900
+ { id: 'web', name: 'Web app' },
901
+ { id: 'mobile', name: 'Mobile app' },
902
+ ];
903
+
904
+ const members: Member[] = [
905
+ { id: 'ada', name: 'Ada Lovelace', projects: ['web', 'mobile'] },
906
+ { id: 'grace', name: 'Grace Hopper', projects: ['web'] },
907
+ { id: 'alan', name: 'Alan Turing', projects: ['mobile'] },
908
+ { id: 'maggie', name: 'Margaret Hamilton', projects: ['web', 'mobile'] },
909
+ ];
910
+
911
+ const project = ref<string>('web');
912
+ // A seeded selection upgrades the select to immediate prefill, so the
913
+ // dependency watcher is armed from the first render.
914
+ const reviewers = ref<string[]>(['ada', 'grace']);
915
+
916
+ // Query-aware provider: `prefill === false` only when the user typed. On
917
+ // component-initiated calls (mount, project change) return the project's full
918
+ // member pool, so a still-valid selection stays resolvable — switching to
919
+ // "Mobile app" keeps Ada and prunes Grace.
920
+ const loadReviewers = (query: string, prefill: boolean): Promise<Member[]> => {
921
+ const pool = members.filter((member) =>
922
+ member.projects.includes(project.value)
923
+ );
924
+ const q = query.trim().toLowerCase();
925
+ const matches =
926
+ prefill || !q
927
+ ? pool
928
+ : pool.filter((member) => member.name.toLowerCase().includes(q));
929
+ return new Promise((resolve) => setTimeout(() => resolve(matches), 200));
552
930
  };
931
+ </script>
553
932
  ```
554
933
 
555
- ## Styles
934
+ Because enforcement checks the merged result (fetched + stashed), a provider
935
+ that returns `[]` on a `prefill: true` call **will wipe a valid selection** —
936
+ always resolve the current selection on component-initiated calls (or enable
937
+ `stash`).
556
938
 
557
- ```css
558
- .bb-select {
559
- .bb-base-input-container {
560
- .bb-base-input-container__input {
561
- .bb-base-select {
562
- display: flex;
563
- }
564
- }
939
+ ### Create options on the fly (`option:add`)
940
+
941
+ Pressing Enter in the search field with **no option highlighted** emits
942
+ `option:add` with the trimmed query (it can be `''` — guard). The component
943
+ does not create anything itself: append the new item to `items` and select it.
944
+ This is the idiomatic pattern for closed-but-growable vocabularies.
945
+
946
+ **Create a label by pressing Enter**
947
+
948
+ ```vue
949
+ <template>
950
+ <div class="grid max-w-sm gap-3 rounded-[var(--bb-radius)] border p-3">
951
+ <div>
952
+ <h3 class="text-sm font-medium">Issue labels</h3>
953
+ <p class="text-xs text-[color:var(--bb-text-muted)]">
954
+ Add from the list, or invent one with Enter.
955
+ </p>
956
+ </div>
957
+ <BbSelect
958
+ v-model="labels"
959
+ clearable
960
+ compact
961
+ item-text="name"
962
+ item-value="id"
963
+ :items="available"
964
+ label="Labels"
965
+ multiple
966
+ no-data-text="No matching label — press Enter to create it"
967
+ @option:add="createLabel"
968
+ />
969
+ </div>
970
+ </template>
971
+ <script setup lang="ts">
972
+ import { ref } from 'vue';
973
+ import { BbSelect } from 'bitboss-ui';
974
+
975
+ type Label = { id: string; name: string };
976
+
977
+ const available = ref<Label[]>([
978
+ { id: 'bug', name: 'Bug' },
979
+ { id: 'docs', name: 'Documentation' },
980
+ { id: 'design', name: 'Design' },
981
+ ]);
982
+
983
+ const labels = ref<string[]>(['bug']);
984
+
985
+ // `option:add` fires with the trimmed query when the user presses Enter and no
986
+ // option is highlighted. It can fire with '' (Enter on an empty query) — guard.
987
+ const createLabel = (text: string) => {
988
+ const name = text.trim();
989
+ if (!name) return;
990
+ const id = name.toLowerCase().replace(/\s+/g, '-');
991
+ if (!available.value.some((label) => label.id === id)) {
992
+ // Mutating `items` re-runs the options pipeline, so the new label is
993
+ // immediately matchable — no manual refresh needed.
994
+ available.value = [...available.value, { id, name }];
995
+ }
996
+ if (!labels.value.includes(id)) {
997
+ labels.value = [...labels.value, id];
565
998
  }
566
- }
999
+ };
1000
+ </script>
1001
+ ```
1002
+
1003
+ ### Group related options
1004
+
1005
+ Set `group-by` to a field path (or a function) to bucket options under headers.
1006
+ The `#group` slot styles the header and receives
1007
+ `{ text, item, index, length, disabled }` — `length` is the number of options
1008
+ in the group, `index` the list index of its first option.
1009
+
1010
+ **Options grouped by department**
1011
+
1012
+ ```vue
1013
+ <template>
1014
+ <div class="grid max-w-sm gap-3 rounded-[var(--bb-radius)] border p-3">
1015
+ <div>
1016
+ <h3 class="text-sm font-medium">Invite teammate</h3>
1017
+ <p class="text-xs text-[color:var(--bb-text-muted)]">
1018
+ Roles grouped by department.
1019
+ </p>
1020
+ </div>
1021
+ <BbSelect
1022
+ v-model="role"
1023
+ clearable
1024
+ compact
1025
+ group-by="department"
1026
+ item-text="label"
1027
+ item-value="value"
1028
+ :items="roles"
1029
+ label="Role"
1030
+ placeholder="Pick a role"
1031
+ >
1032
+ <template #group="{ text, length }">
1033
+ <div
1034
+ class="flex items-center justify-between px-2 text-xs font-semibold text-[color:var(--bb-text-muted)]"
1035
+ >
1036
+ <span>{{ text }}</span>
1037
+ <span>{{ length }}</span>
1038
+ </div>
1039
+ </template>
1040
+ </BbSelect>
1041
+ </div>
1042
+ </template>
1043
+ <script setup lang="ts">
1044
+ import { ref } from 'vue';
1045
+ import { BbSelect } from 'bitboss-ui';
1046
+
1047
+ type Role = { label: string; value: string; department: string };
1048
+
1049
+ // `group-by` buckets options under headers by this field path; the `#group`
1050
+ // slot styles each header and receives the group `text` and `length`.
1051
+ const roles: Role[] = [
1052
+ { label: 'Frontend', value: 'fe', department: 'Engineering' },
1053
+ { label: 'Backend', value: 'be', department: 'Engineering' },
1054
+ { label: 'Brand', value: 'br', department: 'Design' },
1055
+ { label: 'Product', value: 'pr', department: 'Design' },
1056
+ ];
1057
+
1058
+ const role = ref<string | null>(null);
1059
+ </script>
567
1060
  ```
1061
+
1062
+ ### Custom option rows
1063
+
1064
+ The `#option` slot replaces the default row rendering — use it for avatars,
1065
+ secondary text or metadata. It exposes the raw `item`, the resolved `text` and
1066
+ `value`, plus `selected` / `focused` / `disabled` / `loading` / `hasErrors`
1067
+ flags and the row `index`. Rows are fixed-height (the list is virtualized): if
1068
+ your markup is taller than the default 40px (32px compact), set `item-height`
1069
+ to match — and `header-height` for grouped headers (defaults 32px / 24px
1070
+ compact).
1071
+
1072
+ **Rich option rows with an avatar chip**
1073
+
1074
+ ```vue
1075
+ <template>
1076
+ <div class="grid max-w-sm gap-3 rounded-[var(--bb-radius)] border p-3">
1077
+ <div class="flex items-baseline justify-between gap-2">
1078
+ <h3 class="text-sm font-medium">Code review</h3>
1079
+ <span class="text-xs text-[color:var(--bb-text-muted)]">PR #842</span>
1080
+ </div>
1081
+ <BbSelect
1082
+ v-model="assignee"
1083
+ compact
1084
+ item-text="label"
1085
+ item-value="value"
1086
+ :items="teammates"
1087
+ label="Assignee"
1088
+ placeholder="Choose a teammate"
1089
+ >
1090
+ <template #option="{ item, text }">
1091
+ <span class="flex w-full items-center gap-2">
1092
+ <BbAvatar :alt="text" size="sm">{{ item.initials }}</BbAvatar>
1093
+ <span class="min-w-0 flex-1 truncate">{{ text }}</span>
1094
+ <span class="shrink-0 text-xs text-[color:var(--bb-text-muted)]">{{
1095
+ item.role
1096
+ }}</span>
1097
+ </span>
1098
+ </template>
1099
+ </BbSelect>
1100
+ </div>
1101
+ </template>
1102
+ <script setup lang="ts">
1103
+ import { ref } from 'vue';
1104
+ import { BbAvatar, BbSelect } from 'bitboss-ui';
1105
+
1106
+ type Teammate = {
1107
+ label: string;
1108
+ value: string;
1109
+ initials: string;
1110
+ role: string;
1111
+ };
1112
+
1113
+ // The `#option` slot replaces the default row rendering — here a BbAvatar
1114
+ // initials fallback next to the resolved display `text`.
1115
+ const teammates: Teammate[] = [
1116
+ {
1117
+ label: 'Ada Lovelace',
1118
+ value: 'ada',
1119
+ initials: 'AL',
1120
+ role: 'Platform',
1121
+ },
1122
+ {
1123
+ label: 'Grace Hopper',
1124
+ value: 'grace',
1125
+ initials: 'GH',
1126
+ role: 'Backend',
1127
+ },
1128
+ {
1129
+ label: 'Margaret Hamilton',
1130
+ value: 'maggie',
1131
+ initials: 'MH',
1132
+ role: 'Flight',
1133
+ },
1134
+ ];
1135
+
1136
+ const assignee = ref<string | null>(null);
1137
+ </script>
1138
+ ```
1139
+
1140
+ ### Slots around the input
1141
+
1142
+ Beyond the panel slots, the field itself is extensible:
1143
+
1144
+ - `#label` replaces the label text; receives `{ text, hasErrors }`.
1145
+ - `#prefix` / `#suffix` render inline adornments inside the field (no scope) —
1146
+ currency symbols, units.
1147
+ - `#prepend` / `#append` render inside the field wrapper, before/after the
1148
+ value area; both receive `{ query, focus, close }`.
1149
+ - `#prepend-outer` / `#append-outer` render outside the field wrapper; both
1150
+ receive `{ query, close }` — e.g. a companion button acting on the field.
1151
+
1152
+ Prefer the icon props (`prepend:icon` / `append:icon`) over slots when an icon
1153
+ is all you need.
1154
+
1155
+ ### States
1156
+
1157
+ - `disabled` — control inert, chips become badges, hidden form inputs disabled.
1158
+ - `readonly` — the value is visible and focusable but **the panel never
1159
+ opens**; chips become non-removable badges. Use it for review screens, not
1160
+ for fields whose options the user might still need to browse (they can't).
1161
+ - `loading` — external loading state: shows the control spinner and suspends
1162
+ keyboard opening. Fetch-driven loading is automatic; don't mirror it here.
1163
+ - `clearable` — clear affix when a value exists; emits `null` / `[]`.
1164
+ - Empty panel — `no-data-text` or `#no-data`.
1165
+
1166
+ ### Events and v-model
1167
+
1168
+ - `update:modelValue` — the resolved value (single) or array (multiple), on
1169
+ pick, chip removal, clear and coherence enforcement.
1170
+ - `option:add` — Enter on a query with no highlighted option (see above).
1171
+ - `focus` / `blur` — the control gaining/losing focus; `input` / `change` —
1172
+ native events from the panel search field.
1173
+ - `inactive` — focus has fully left the component (control **and** panel).
1174
+ Because focus legitimately moves into the panel, validate on `inactive`, not
1175
+ on `blur`.
1176
+
1177
+ ### Keyboard model
1178
+
1179
+ Shipped behavior — never reimplement it:
1180
+
1181
+ - Closed, control focused: `ArrowDown` opens and focuses the first selected
1182
+ option, `ArrowUp` opens and focuses the last selected, `Enter` opens and
1183
+ focuses the selection or the search field.
1184
+ - Open: typing searches; `ArrowDown` / `ArrowUp` move the highlighted option
1185
+ while DOM focus stays in the search field (conveyed via
1186
+ `aria-activedescendant`); `Enter` confirms the highlighted option — or emits
1187
+ `option:add` when none is highlighted; `Esc` closes and returns focus to the
1188
+ control.
1189
+ - Picking in single mode closes the panel and refocuses the control; in
1190
+ multiple mode the panel stays open and focus returns to the search field.
1191
+ - Clicks or focus outside the control and panel close it.
1192
+ - `disabled`, `readonly` and `loading` suppress the open/navigate bindings
1193
+ (`Esc` still closes an open panel).
1194
+
1195
+ ### Sizing and layout
1196
+
1197
+ - `compact` — denser control and panel (32px options, 24px group headers).
1198
+ - The panel width always matches the control; the control fills its container,
1199
+ so size it with layout classes on a wrapper (`class="max-w-xs"` etc.).
1200
+ - `direction` works whenever the resolved label mode is `'outside'` (the
1201
+ library default) — `direction="horizontal"` gives a label-beside-field row.
1202
+ Only `floating`/`inside` label modes force the vertical layout, since they
1203
+ embed the label in the field itself.
1204
+
1205
+ ### Adaptive mobile sheet
1206
+
1207
+ With `adaptive` (default: global `config.adaptive`, which is `true`), the panel
1208
+ opens as a bottom off-canvas sheet on mobile viewports (below
1209
+ `config.mobileMaxWidth`) instead of a floating popover — same search, options
1210
+ and header/footer slots, plus a chips row of the current selection above the
1211
+ search field. The surface is latched per open cycle: a mid-open resize never
1212
+ swaps popover ↔ sheet.
1213
+
1214
+ - `off-canvas-props` forwards extra `BbOffCanvas` props to the sheet (`size`,
1215
+ `draggable`, `fullscreen`, …).
1216
+ - `disable-writing="'mobile'"` hides the search on the sheet only — common when
1217
+ the list is short.
1218
+ - Set `:adaptive="false"` to keep a floating popover everywhere.
1219
+
1220
+ ### Global config and platforms
1221
+
1222
+ From the vite/nuxt plugin options:
1223
+
1224
+ - `config.adaptive` — default for `adaptive` (see above).
1225
+ - `config.mobileMaxWidth` — the viewport threshold for "mobile".
1226
+ - `config.defaultInputLabelMode` — default `label-mode`.
1227
+ - `config.locale` (`'en'` / `'it'`) — built-in strings: the collapsed-chips
1228
+ summary ("N items selected") and the panel loading/no-data defaults.
1229
+
1230
+ Platform notes:
1231
+
1232
+ - **SSR / Nuxt**: `prefill: true` providers also run in `onServerPrefetch`, so
1233
+ server-rendered pages hydrate with options loaded. Keep providers isomorphic
1234
+ (no `window` access).
1235
+ - **Plain HTML forms / Inertia form posts**: give the select a `name` — hidden
1236
+ inputs carry the values (JSON-stringified when not strings), and `required`
1237
+ participates in native validation.
1238
+ - The desktop panel is anchored to the control; the mobile sheet manages its
1239
+ own backdrop, Escape and focus.
1240
+
1241
+ ### Works well with
1242
+
1243
+ - `BbSelectPopover` — the same engine on a custom trigger (status pills,
1244
+ table-cell chips, toolbars).
1245
+ - `BbTable` — selects as column filters: list their models in the table
1246
+ provider's `dependencies`.
1247
+ - `useToast` — surface provider failures (the component only logs them).
1248
+ - `BbRadioGroup` / `BbCheckboxGroup` — swap to these when the option set turns
1249
+ out small and static; the `items` contract is identical, so migration is
1250
+ cheap.
1251
+ - `BbTag` — open vocabularies typed by the user; `BbSelect` + `option:add`
1252
+ covers "known set, occasionally growable".
1253
+
1254
+ ### Gotchas and constraints
1255
+
1256
+ - **Clicking the selected option does not clear a single select** — it re-picks
1257
+ it and closes the panel. Add `clearable` for an explicit clear button; a
1258
+ required status field should not empty itself because someone clicked twice.
1259
+ Multiple mode still toggles a selected option off.
1260
+ - `multiple` with a non-array model **throws at setup** — seed `ref([])`.
1261
+ - `placeholder` renders only in single mode; an empty multiple select shows
1262
+ nothing.
1263
+ - **A `null` "All" option needs `prefill: true` when `items` is a provider.**
1264
+ Modelling "everything" as `{ label: 'All locations', value: null }` works — the
1265
+ row resolves and renders as the selection — but `null` is also the value the
1266
+ component reads as _nothing selected_, so it never upgrades to an eager
1267
+ prefill. With a provider that means nothing loads, there is no text, and the
1268
+ field renders the **placeholder** — greyed, indistinguishable from an empty
1269
+ select, while the model holds a real choice. Set `prefill: true` so the label
1270
+ can resolve. Array `items` need nothing: they are never lazy. (Note `clear`
1271
+ then also produces `null`, i.e. it selects "All" — use a sentinel like `'all'`
1272
+ if the two must stay distinct.)
1273
+ - The local substring filter also applies to provider results — server matches
1274
+ whose text doesn't contain the query are hidden (see Search semantics).
1275
+ - `filter-by` is `string[]` only (no function, no bare string) and matches
1276
+ exclusively those paths; each path must exist on every item or matching
1277
+ throws.
1278
+ - `prefill: false` still fetches once when the panel first opens.
1279
+ - `readonly` prevents the panel from opening at all.
1280
+ - `enforce-coherence` + a provider that drops the selection on `prefill: true`
1281
+ calls = wiped model. Resolve the selection, or enable `stash`.
1282
+ - The flip side: `stash` keeps every previously fetched option resolvable, so
1283
+ on a select with `dependencies` it also keeps _stale_ picks coherent —
1284
+ enforcement will never prune them. When an upstream change must clear
1285
+ now-invalid values, skip `stash` and resolve the selection in the provider
1286
+ instead.
1287
+ - `direction` is honored with `'outside'` labels (the default); it is ignored
1288
+ only under `floating`/`inside` label modes.
1289
+ - No `#chevron` slot — customise the trailing icon via `append:icon`.
1290
+ - The multiple-mode search query persists after picking an option (it clears on
1291
+ close).
1292
+ - `option:add` can fire with an empty string — trim and guard in the handler.
1293
+
1294
+ ### Anti-patterns
1295
+
1296
+ - Pre-mapping items to `{ label, value }`, or storing whole objects in the
1297
+ model when an id is enough.
1298
+ - `watch(filter, refetch)` when `dependencies` exists; blind `model = null`
1299
+ resets when `enforce-coherence` would preserve still-valid values.
1300
+ - Hand-rolled debounce or loading refs around the provider.
1301
+ - Rebuilding chips, counts or select-all outside the component when `max`,
1302
+ `max-selected-labels`, `selected-labels-fn` and the panel slots cover it.
1303
+ - Expecting a `disabled` field on items to disable options — it is inert data;
1304
+ use the `selectable` predicate or filter unavailable options out.
1305
+ - Using `BbSelect` for three static options (that's `BbRadioGroup`), or as an
1306
+ actions menu (that's `BbDropdown`).
1307
+
1308
+ ### Accessibility
1309
+
1310
+ - `label` is mandatory and is the accessible name; use `hide-label` (not an
1311
+ empty label) to hide it visually. The activator is announced as a combobox
1312
+ with `aria-expanded`, `aria-controls` and the selected text exposed as
1313
+ `aria-valuetext`.
1314
+ - `errors`, `warnings`, `description` and `hint` are all wired to the trigger through
1315
+ `aria-describedby`, in that order: the reason the field is invalid is spoken
1316
+ first when it regains focus, and a channel is referenced only while it
1317
+ actually has copy. Messages _also_ render in an `aria-live="polite"` region,
1318
+ so they are announced the moment they appear — announced on change, re-read
1319
+ on focus. The error state also sets `aria-invalid`.
1320
+ - The panel manages listbox roles, `aria-activedescendant` and the full
1321
+ keyboard model (see Keyboard model) for you — do not rebuild any of it.
1322
+ - The in-panel search field ships an accessible name ("Search options").
1323
+ - Chip removal affordances only render when removal is actually possible (not
1324
+ under `disabled` / `readonly` / `comma`).
1325
+
1326
+ ## v-model
1327
+
1328
+ - `v-model` — type: `any`
1329
+
1330
+ ## Props
1331
+
1332
+ | Prop | Type | Default | Required | Description |
1333
+ | --- | --- | --- | --- | --- |
1334
+ | `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`. |
1335
+ | `append:icon` | `string \| undefined` | | | Name of the icon to be added at the end of the input. |
1336
+ | `autocomplete` | `string \| undefined` | | | Guides to the browser as to the type of information expected in the field. |
1337
+ | `autofocus` | `Booleanish \| undefined` | | | Sets autofocus on page load. |
1338
+ | `clearable` | `boolean \| undefined` | | | Displays a clear button when the input has a value and is being interacted with. |
1339
+ | `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. |
1340
+ | `compact` | `boolean \| undefined` | | | Sets the component in a compact mode. |
1341
+ | `dependencies` | `unknown[] \| undefined` | | | Defines an array of dependencies that will trigger actions in the component upon change. |
1342
+ | `depsDebounceTime` | `number \| undefined` | | | Timeout used to debounce response to changes to dependencies. |
1343
+ | `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`). |
1344
+ | `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`. |
1345
+ | `disabled` | `boolean \| undefined` | | | Disables the component. |
1346
+ | `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. |
1347
+ | `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. |
1348
+ | `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… |
1349
+ | `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… |
1350
+ | `groupBy` | `string \| ((item: T) => string \| number \| symbol) \| undefined` | | | Path to item property for grouping options. |
1351
+ | `hasErrors` | `boolean \| undefined` | | | Define if the component should be in an error state. It usually attaches a CSS class for styling purposes. |
1352
+ | `hasWarning` | `boolean \| undefined` | | | Define if the component should be in a warning state. Same chrome as errors with `--bb-warn`; errors take priority. |
1353
+ | `headerHeight` | `number \| undefined` | | | Height of group headers in the listbox (px). Defaults to 24px (compact) or 32px. Only applies when `groupBy` is set. |
1354
+ | `hideLabel` | `boolean \| undefined` | | | Visually hides the label of the input while maintaining accessibility. |
1355
+ | `hint` | `string \| undefined` | | | Text box to be displayed near the input, usually to indicate instructions. |
1356
+ | `id` | `string \| undefined` | | | The identifier of the component. |
1357
+ | `itemHeight` | `number \| undefined` | | | Height of the options in the listbox. By default it will be 32px for the compact variant and 40px for the regular variant. |
1358
+ | `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. |
1359
+ | `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. |
1360
+ | `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. |
1361
+ | `label` | `string` | | yes | Text content of the label of the element. |
1362
+ | `labelMode` | `"floating" \| "outside" \| "inside" \| undefined` | | | Label rendering mode. |
1363
+ | `labelPosition` | `"left" \| "center" \| "right" \| undefined` | | | Sets the text alignment of the label. |
1364
+ | `loading` | `boolean \| undefined` | | | Sets the component in a loading state, usually triggering some visual styles. |
1365
+ | `loadingText` | `string \| undefined` | | | String displayed while items are being loaded. |
1366
+ | `max` | `number \| undefined` | | | Maximum number of selectable items when the multiple flag is set. |
1367
+ | `maxSelectedLabels` | `number \| undefined` | | | Maximum number of labels shown before collapsing to a count summary. |
1368
+ | `modelValue` | `any` | | yes | Used by v-model. Can be any serializable type. |
1369
+ | `modelValueDebounceTime` | `number \| undefined` | | | Timeout used to debounce response to changes to modelValue. |
1370
+ | `multiple` | `boolean \| undefined` | | | Allows the selection of multiple items. |
1371
+ | `name` | `string \| undefined` | | | Defines the name of the input. |
1372
+ | `noDataText` | `string \| undefined` | | | String displayed when there are no items to display. |
1373
+ | `offCanvasProps` | `Partial<BbOffCanvasProps> \| undefined` | | | Extra props forwarded to the `BbOffCanvas` sheet when `adaptive` is active on mobile. |
1374
+ | `persistentHint` | `boolean \| undefined` | | | Keeps the hint displayed. |
1375
+ | `placeholder` | `string \| undefined` | | | String displayed when there's no data. |
1376
+ | `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… |
1377
+ | `prepend:icon` | `string \| undefined` | | | Name of the icon to be added at the start of the input. |
1378
+ | `queryDebounceTime` | `number \| undefined` | | | Time to wait when the user stops writing in the input before querying data. |
1379
+ | `readonly` | `boolean \| undefined` | | | Sets the input in a readonly state. |
1380
+ | `required` | `boolean \| undefined` | | | Sets the input as required. |
1381
+ | `reverse` | `boolean \| undefined` | | | Reverses the layout. Applicable in every direction the order of the label and the input is swapped. |
1382
+ | `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. |
1383
+ | `selectedLabelsFn` | `((count: number) => string) \| undefined` | | | Function that returns a string to be displayed when the number of selected labels is greater than `maxSelectedLabels`. |
1384
+ | `stash` | `boolean \| undefined` | | | Adds a stash to accumulate selected values across searches. |
1385
+ | `transitionDuration` | `number \| undefined` | | | How long the transition has to last in milliseconds. |
1386
+ | `warnings` | `string \| string[] \| undefined` | | | Warning messages to display beneath the field, in their own `aria-live` region and amber (`--bb-warn`). A string or array; a non-empty list implies the warning state. Errors suppress warnings when both are set. While displayed they are also… |
1387
+
1388
+ ## Events
1389
+
1390
+ - `active` — `(e: "active"): void`
1391
+ - `blur` — `(e: "blur", event: FocusEvent): void`
1392
+ - `change` — `(e: "change", event: Event): void`
1393
+ - `click` — `(e: "click", event: MouseEvent): void`
1394
+ - `focus` — `(e: "focus", event: FocusEvent): void`
1395
+ - `inactive` — `(e: "inactive"): void`
1396
+ - `input` — `(e: "input", event: Event): void`
1397
+ - `option:add` — `(e: "option:add", text: string): void`
1398
+ - `update:modelValue` — `(e: "update:modelValue", value: any): void`
1399
+
1400
+ ## Slots
1401
+
1402
+ - `append` — scope: `{ query: string; focus: () => void; close: () => Promise<void>; }` — Content appended inside the input field, after the value area.
1403
+ - `append-outer` — scope: `{ query: string; close: () => Promise<void>; }` — Content appended outside the input field wrapper.
1404
+ - `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.
1405
+ - `group` — scope: `BbSelectGroupSlotProps<T>` — Replaces the default group header rendered above grouped options.
1406
+ - `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.
1407
+ - `label` — scope: `BbSelectLabelSlotProps` — Replaces the default label text rendered above the input.
1408
+ - `loading` — scope: `{ query: string; }` — Content shown inside the options dropdown while items are loading.
1409
+ - `no-data` — scope: `{ query: string; focus: () => void; }` — Content shown when no options match the query or the list is empty.
1410
+ - `option` — scope: `BbSelectOptionSlotProps<T>` — Replaces the default rendering of each option row in the dropdown.
1411
+ - `prefix` — scope: `object` — Content rendered as an inline prefix inside the input field.
1412
+ - `prepend` — scope: `{ query: string; focus: () => void; close: () => Promise<void>; }` — Content prepended inside the input field, before the value area.
1413
+ - `prepend-outer` — scope: `{ query: string; close: () => Promise<void>; }` — Content prepended outside the input field wrapper.
1414
+ - `suffix` — scope: `object` — Content rendered as an inline suffix inside the input field.
1415
+
1416
+ ## Validated variant
1417
+
1418
+ Importing this component from `bitboss-ui/validated` instead of `bitboss-ui` binds it to a vee-validate field. Same props, same events, same slots — plus the ones below. Requires the `vee-validate` peer dependency and a `<BbForm>` (or `useForm()`) ancestor. Full guide: [validated-forms](./guides/validated-forms.md).
1419
+
1420
+ | Prop | Type | Description |
1421
+ | --- | --- | --- |
1422
+ | `rules` | `RuleExpression<any>` | vee-validate rules for this field. |
1423
+ | `validateOn` | `ValidateTiming[] \| undefined` | Which interactions trigger validation (see `ValidatedFieldProps.validateOn` for the timing vocabulary). |
1424
+ | `vid` | `string \| undefined` | Explicit vee-validate field name. **Usually omit it** — the name is derived automatically from the control's `label`/`legend`. Only set `vid` when that derivation wouldn't be unique (e.g. v-for rows, or array `v-model`s that share a label).… |
1425
+
1426
+ ## See Also
1427
+
1428
+ - [BbSelectPopover](./BbSelectPopover.md) — Provides popover-driven option selection and search.
1429
+ - [BbCheckboxGroup](./BbCheckboxGroup.md) — Manages multiple checkbox options as a group.
1430
+ - [BbRadioGroup](./BbRadioGroup.md) — Coordinates exclusive selection among radio options.