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
@@ -0,0 +1,1496 @@
1
+ ---
2
+ title: Approvals Inbox (Vue)
3
+ summary: Keyboard-first expense-approvals triage for a vue-router SPA — `keyboard-navigation` with highlight-opens-peek, one-click approve, reject-with-reason and snooze dialogs, bulk approve/reject, and an `A`/`R`/`S` shortcut bar, all through one coopting page context.
4
+ ---
5
+
6
+ # Recipe: Approvals Inbox (Vue)
7
+
8
+ The densest advanced-page recipe in the folder: a Linear-triage ×
9
+ Expensify-approvals expense inbox for a **plain Vue SPA with vue-router**.
10
+ `keyboard-navigation` turns the table into a single tab stop; the row under
11
+ the roving tabindex drives the peek sidebar directly (no click handler);
12
+ approve, reject-with-reason and snooze are each reachable from the row, the
13
+ peek footer, and an `A`/`R`/`S` shortcut bar — three dispatch surfaces
14
+ calling the exact same context actions; and a floating bottom panel adds
15
+ bulk approve/reject on top of the selection axis, fully independent of
16
+ highlight. All of it is wired through one coopting page context so every
17
+ leaf component takes zero props beyond the record it renders.
18
+
19
+ Sibling recipes: [Nuxt](../nuxt/approvals-inbox.md) ·
20
+ [Inertia](../inertia/approvals-inbox.md).
21
+
22
+ ## Prerequisites
23
+
24
+ - **[Layout Scaffold](./layout-scaffold.md) — build it first.** This recipe
25
+ imports `PageShell`, `usePageShellContext` and `FloatingBottomPanel` from your own app.
26
+ They are not package exports; the scaffold recipe is their source. Copy
27
+ those files before anything below, and do not hand-roll replacements —
28
+ the peek stack, the close semantics and the sidebar's out-of-flow
29
+ behaviour are all load-bearing here.
30
+ - `<BbConfirm />` and `<BbToast />` mounted once in the app root (`App.vue`) — never in a page.
31
+ - [App Layout](../../guides/app-layout.md), [Page Shell](../../guides/page-shell.md)
32
+ and [Floating Bottom Panel](../../guides/floating-bottom-panel.md) copied
33
+ into `src/components/layout/` per their guides — every recipe page assumes
34
+ this chrome exists and renders inside it.
35
+
36
+ ## Key ideas
37
+
38
+ - **Highlight drives the peek, not a click handler.** The table gets
39
+ `keyboard-navigation`; `ctx.table.highlighted` (the coopted table
40
+ context) is watched in `context.ts`, and every highlight change
41
+ replaces the sidebar's stack with that expense — arrowing through rows
42
+ previews each one with zero markup in `Index.vue`. Selection stays a
43
+ fully independent axis, free for the bulk bar.
44
+ - **One coopting page context.** `provideApprovalsInbox()` joins the
45
+ page-shell stack and the table context once, owns filters/tab/dialogs,
46
+ and exposes complete actions. Every leaf calls `useApprovalsInbox()` and
47
+ nothing else.
48
+ - **Three dispatch surfaces, one set of actions.** Approve / reject /
49
+ snooze are reachable from the row, from inside the peek, and from the
50
+ `A`/`R`/`S` keyboard shortcuts — all three call the exact same context
51
+ functions (`approve`, `openReject`, `openSnooze`), so there is exactly
52
+ one place each action's API call, refresh and toast live.
53
+ - **Reason and date are dialogs, not confirms.** Reject needs a typed
54
+ reason and snooze needs a date, so both open a small `BbDialog` (the
55
+ dialog itself is the confirmation gate) — a plain `useConfirm` is
56
+ reserved for actions that need no input.
57
+ - **The shortcut bar mirrors `useDeleteCmd`'s guard.** A small keydown
58
+ handler in the context checks `isInteractiveElementFocused()` before
59
+ firing — typing "reason" in the reject textarea never triggers `R`.
60
+ - **Clicking a submitter's name always stacks**, from a row or from inside
61
+ the expense peek — the back arrow appears once the stack is two deep,
62
+ exactly the "peek vs stack" grammar of the flagship.
63
+ - **Tabs are URL filters with live counts** (`Needs approval` / `Approved`
64
+ / `Rejected` / `All`), same shape as every other workspace in the
65
+ folder.
66
+ - **Buttons are `md` by default**; `sm`/`xs` apply only where the doctrine
67
+ allows it — table rows, the peek footers, the bulk bar, the shortcut
68
+ bar.
69
+
70
+ - **Spread the filters object into `dependencies`.** `BbTable` hash-compares
71
+ `dependencies`; it does not deep-watch them. Passing the reactive `filters`
72
+ proxy itself tracks only its identity — which never changes — so the table
73
+ never refetches. `{ ...ctx.filters }` reads every field during render, so any
74
+ field change yields a new, differently-hashed array. Read `.value` off the
75
+ refs for the same reason: context members are not auto-unwrapped in a template.
76
+
77
+ ## Page anatomy
78
+
79
+ ```
80
+ ApprovalsInbox/
81
+ Index.vue ← assembly: PageShell slots, table, tabs, pagination
82
+ context.ts ← coopting page context (shell + table + filters + shortcuts + actions)
83
+ FilterRail.vue ← pill filters + clear-all
84
+ ShortcutsHint.vue ← A / R / S icon buttons, tooltip-labelled, act on the highlighted row
85
+ ReceiptThumbnail.vue ← receipt image/placeholder cell
86
+ RowActions.vue ← per-row approve / reject / snooze icon buttons
87
+ SelectionBar.vue ← bulk approve / reject in the floating bottom panel
88
+ RejectDialog.vue ← single-row reject, required reason
89
+ BulkRejectDialog.vue ← bulk reject, required reason
90
+ SnoozeDialog.vue ← single-row snooze, date picker
91
+ ExpensePeek.vue ← sidebar workbench, stack level 1 (opens from highlight)
92
+ SubmitterPeek.vue ← stacked peek, back arrow via the shell
93
+ ```
94
+
95
+ Chrome assumed from the guides: [App Layout](../../guides/app-layout.md)
96
+ (left nav + fat footer), [Page Shell](../../guides/page-shell.md),
97
+ [Floating Bottom Panel](../../guides/floating-bottom-panel.md).
98
+
99
+ ## Action inventory
100
+
101
+ | # | Action | Trigger | Mechanism |
102
+ | --- | -------------------------------- | ------------------------------------------------------ | --------------------------------------------------------- |
103
+ | 1 | Page search (merchant/submitter) | topbar right | `filters.search` → fetch dependency |
104
+ | 2 | Filter by submitter | filter rail pill | `BbSelectPopover` single, query-aware |
105
+ | 3 | Filter by category | filter rail pill | `BbSelectPopover` multiple |
106
+ | 4 | Quick filter: amount over | filter rail pill | `BbSelectPopover` single, preset thresholds |
107
+ | 5 | Clear filters | rail right (only when active) | context `clearFilters()` |
108
+ | 6 | Switch tab | href tabs with counts | URL + fetch dependency |
109
+ | 7 | Arrow through rows | `keyboard-navigation` roving tabindex | table's own Arrow/Home/End |
110
+ | 8 | Preview an expense | highlight a row (click, Enter/Space, arrow-then-Enter) | `ctx.table.highlighted` watcher → `peekExpense` (replace) |
111
+ | 9 | Approve (one click) | row icon button, peek footer, key `A` | `approve(expense)` — API + refresh + toast |
112
+ | 10 | Reject with reason | row icon button, peek footer, key `R` | `openReject` → `RejectDialog` (required `BbTextarea`) |
113
+ | 11 | Snooze | row icon button, peek footer, key `S` | `openSnooze` → `SnoozeDialog` (`BbDatePickerInput`) |
114
+ | 12 | Select rows / select all | table checkboxes | table context |
115
+ | 13 | Bulk approve | floating bottom panel | `bulkApprove()` on `table.selected` |
116
+ | 14 | Bulk reject with reason | floating bottom panel | `BulkRejectDialog`, destructive |
117
+ | 15 | Stack a submitter | submitter cell / peek property | `stackSubmitter(id)` → shell stack, back arrow |
118
+ | 16 | Stack an expense from a profile | recent-expense row inside `SubmitterPeek` | `stackExpense(id)` → shell stack |
119
+ | 17 | View full-size receipt | peek "View receipt" link | navigation (`href`, new tab) |
120
+ | 18 | Open full expense | peek footer | navigation (`/expenses/:id`) |
121
+ | 19 | Back / close peek | shell chrome | shell stack pop / close |
122
+
123
+ Nineteen distinct actions, spanning inline one-click mutation (8),
124
+ input-gated mutation via dialog (10, 11, 14), bulk mutation (13, 14),
125
+ keyboard dispatch (7, 9, 10, 11), navigation (17, 18, 19) and contextual
126
+ drill-down (15, 16) — well past the ≥ 12 bar.
127
+
128
+ ## The code
129
+
130
+ ### context.ts
131
+
132
+ ```ts
133
+ // ApprovalsInbox/context.ts
134
+ import {
135
+ computed,
136
+ inject,
137
+ provide,
138
+ reactive,
139
+ ref,
140
+ watch,
141
+ type ComputedRef,
142
+ type InjectionKey,
143
+ type Ref,
144
+ } from 'vue';
145
+ import { useMagicKeys, whenever } from '@vueuse/core';
146
+ import {
147
+ useBbTableContext,
148
+ useConfirm,
149
+ useToast,
150
+ type BbTableContext,
151
+ } from 'bitboss-ui';
152
+ import {
153
+ usePageShellContext,
154
+ type PageShellContext,
155
+ } from '@/components/layout/usePageShellContext';
156
+ import { api } from '@/api';
157
+ import type { Expense, ExpenseCategory } from '@/types';
158
+
159
+ /** What the stacked sidebar can show. Clicking a name pushes one of these. */
160
+ export type PeekItem =
161
+ | { type: 'expense'; id: number }
162
+ | { type: 'submitter'; id: number };
163
+
164
+ export type ApprovalsTab = 'needsApproval' | 'approved' | 'rejected' | 'all';
165
+
166
+ export interface ApprovalsFilters {
167
+ search: string;
168
+ submitterId: number | null;
169
+ categories: ExpenseCategory[];
170
+ /** Preset threshold from the quick filter (`50`, `100`, `250`…), or `null`. */
171
+ amountOver: number | null;
172
+ }
173
+
174
+ export interface ApprovalsInboxContext {
175
+ // -- Coopted contexts ------------------------------------------------------
176
+ shell: PageShellContext<PeekItem>;
177
+ table: BbTableContext;
178
+ // -- Page-owned state --------------------------------------------------------
179
+ filters: ApprovalsFilters;
180
+ hasActiveFilters: ComputedRef<boolean>;
181
+ tab: Ref<ApprovalsTab>;
182
+ tabCounts: Ref<Record<ApprovalsTab, number>>;
183
+ refreshKey: Ref<number>;
184
+ dialogs: {
185
+ reject: Ref<Expense | null>;
186
+ bulkReject: Ref<boolean>;
187
+ snooze: Ref<Expense | null>;
188
+ };
189
+ /** The expense under the roving tabindex, resolved from the last fetch. */
190
+ highlightedExpense: ComputedRef<Expense | null>;
191
+ // -- Data ----------------------------------------------------------------
192
+ fetchExpenses: () => Promise<Expense[]>;
193
+ // -- Peek grammar ----------------------------------------------------------
194
+ // (peekExpense — the highlight-driven replace — is internal to the watcher
195
+ // below, not part of the public surface: leaves never open the peek
196
+ // directly, only highlight drives it.)
197
+ stackExpense: (id: number) => void;
198
+ stackSubmitter: (id: number) => void;
199
+ // -- Actions (complete: API + refresh + toast) ------------------------------
200
+ clearFilters: () => void;
201
+ approve: (expense: Expense) => Promise<void>;
202
+ openReject: (expense: Expense) => void;
203
+ reject: (expense: Expense, reason: string) => Promise<void>;
204
+ openSnooze: (expense: Expense) => void;
205
+ snooze: (expense: Expense, until: string) => Promise<void>;
206
+ bulkApprove: () => Promise<void>;
207
+ openBulkReject: () => void;
208
+ bulkReject: (reason: string) => Promise<void>;
209
+ // -- Keyboard-shortcut dispatch (mirrors the row/peek buttons) --------------
210
+ approveHighlighted: () => void;
211
+ rejectHighlighted: () => void;
212
+ snoozeHighlighted: () => void;
213
+ }
214
+
215
+ const key: InjectionKey<ApprovalsInboxContext> = Symbol('approvals-inbox');
216
+
217
+ /** Mirrors `useDeleteCmd`'s guard: skip shortcuts while the user is typing. */
218
+ const isInteractiveElementFocused = (): boolean => {
219
+ const active = document.activeElement;
220
+ if (!active) return false;
221
+ const tag = active.tagName.toLowerCase();
222
+ if (tag === 'input' || tag === 'textarea' || tag === 'select') return true;
223
+ return active.getAttribute('contenteditable') === 'true';
224
+ };
225
+
226
+ export function provideApprovalsInbox(): ApprovalsInboxContext {
227
+ const { toast } = useToast();
228
+ const { confirm } = useConfirm();
229
+
230
+ // -- Coopt the specific contexts: once, here, for the whole page. ----------
231
+ const shell = usePageShellContext<PeekItem>();
232
+ const table = useBbTableContext('approvals-table', { perPage: 25 });
233
+
234
+ // -- Page state ---------------------------------------------------------------
235
+ const filters = reactive<ApprovalsFilters>({
236
+ search: '',
237
+ submitterId: null,
238
+ categories: [],
239
+ amountOver: null,
240
+ });
241
+ const hasActiveFilters = computed(
242
+ () =>
243
+ filters.search !== '' ||
244
+ filters.submitterId !== null ||
245
+ filters.categories.length > 0 ||
246
+ filters.amountOver !== null
247
+ );
248
+ const tab = ref<ApprovalsTab>('needsApproval');
249
+ const tabCounts = ref<Record<ApprovalsTab, number>>({
250
+ needsApproval: 0,
251
+ approved: 0,
252
+ rejected: 0,
253
+ all: 0,
254
+ });
255
+ const refreshKey = ref(0);
256
+ const dialogs = {
257
+ reject: ref<Expense | null>(null),
258
+ bulkReject: ref(false),
259
+ snooze: ref<Expense | null>(null),
260
+ };
261
+
262
+ const clearFilters = () => {
263
+ filters.search = '';
264
+ filters.submitterId = null;
265
+ filters.categories = [];
266
+ filters.amountOver = null;
267
+ };
268
+
269
+ // -- Data -----------------------------------------------------------------------
270
+ // Cached so the keyboard shortcuts and the peek watcher can resolve a full
271
+ // expense from the id the table context reports.
272
+ const lastItems = ref<Expense[]>([]);
273
+ const fetchExpenses = async (): Promise<Expense[]> => {
274
+ const response = await api.expenses.list({
275
+ ...filters,
276
+ tab: tab.value,
277
+ page: table.page.value,
278
+ perPage: table.perPage.value,
279
+ });
280
+ table.total.value = response.total;
281
+ tabCounts.value = response.tabCounts;
282
+ lastItems.value = response.data;
283
+ return response.data;
284
+ };
285
+
286
+ // -- Peek grammar -----------------------------------------------------------------
287
+ // peekX replaces the stack (from the list / highlight); stackX drills down.
288
+ const peekExpense = (id: number) => shell.push({ type: 'expense', id }, true);
289
+ const stackExpense = (id: number) => shell.push({ type: 'expense', id });
290
+ const stackSubmitter = (id: number) => shell.push({ type: 'submitter', id });
291
+
292
+ // Highlighting IS the peek trigger: arrowing (or clicking) a row opens it,
293
+ // clearing the highlight closes it. `item-value="id"` on the table means
294
+ // `table.highlighted` already holds the plain id.
295
+ watch(table.highlighted, (id) => {
296
+ if (id == null) {
297
+ shell.close();
298
+ } else {
299
+ peekExpense(id as number);
300
+ }
301
+ });
302
+
303
+ const highlightedExpense = computed<Expense | null>(
304
+ () =>
305
+ lastItems.value.find(
306
+ (expense) => expense.id === table.highlighted.value
307
+ ) ?? null
308
+ );
309
+
310
+ // -- Actions ----------------------------------------------------------------------
311
+ const refresh = () => {
312
+ refreshKey.value++;
313
+ };
314
+ const clearSelection = () => {
315
+ table.selected.value = [];
316
+ };
317
+
318
+ const approve = async (expense: Expense) => {
319
+ await api.expenses.approve(expense.id);
320
+ refresh();
321
+ toast({
322
+ title: `Approved ${expense.merchant} — $${expense.amount.toFixed(2)}.`,
323
+ variant: 'success',
324
+ });
325
+ };
326
+
327
+ const openReject = (expense: Expense) => {
328
+ dialogs.reject.value = expense;
329
+ };
330
+ const reject = async (expense: Expense, reason: string) => {
331
+ await api.expenses.reject(expense.id, reason);
332
+ dialogs.reject.value = null;
333
+ refresh();
334
+ toast({ title: `Rejected ${expense.merchant}.`, variant: 'success' });
335
+ };
336
+
337
+ const openSnooze = (expense: Expense) => {
338
+ dialogs.snooze.value = expense;
339
+ };
340
+ const snooze = async (expense: Expense, until: string) => {
341
+ await api.expenses.snooze(expense.id, until);
342
+ dialogs.snooze.value = null;
343
+ refresh();
344
+ toast({ title: `${expense.merchant} snoozed.`, variant: 'success' });
345
+ };
346
+
347
+ const bulkApprove = async () => {
348
+ const ids = table.selected.value as number[];
349
+ await api.expenses.approveMany(ids);
350
+ clearSelection();
351
+ refresh();
352
+ toast({ title: `${ids.length} expenses approved.`, variant: 'success' });
353
+ };
354
+
355
+ const openBulkReject = () => {
356
+ dialogs.bulkReject.value = true;
357
+ };
358
+ const bulkReject = async (reason: string) => {
359
+ const ids = table.selected.value as number[];
360
+ const ok = await confirm({
361
+ variant: 'destructive',
362
+ title: 'Reject expenses',
363
+ text: `Reject ${ids.length} expenses? The submitters are notified.`,
364
+ yes: 'Reject',
365
+ no: 'Cancel',
366
+ });
367
+ if (!ok) return;
368
+ await api.expenses.rejectMany(ids, reason);
369
+ dialogs.bulkReject.value = false;
370
+ clearSelection();
371
+ refresh();
372
+ toast({ title: `${ids.length} expenses rejected.`, variant: 'success' });
373
+ };
374
+
375
+ // -- Keyboard-shortcut dispatch: same actions, resolved against the row
376
+ // under the roving tabindex. Guarded exactly like `useDeleteCmd`.
377
+ const keys = useMagicKeys();
378
+ const withHighlighted = (run: (expense: Expense) => void) => {
379
+ if (isInteractiveElementFocused()) return;
380
+ if (
381
+ dialogs.reject.value ||
382
+ dialogs.bulkReject.value ||
383
+ dialogs.snooze.value
384
+ )
385
+ return;
386
+ const expense = highlightedExpense.value;
387
+ if (expense) run(expense);
388
+ };
389
+ const approveHighlighted = () =>
390
+ withHighlighted((expense) => void approve(expense));
391
+ const rejectHighlighted = () => withHighlighted(openReject);
392
+ const snoozeHighlighted = () => withHighlighted(openSnooze);
393
+
394
+ whenever(keys['a'], approveHighlighted);
395
+ whenever(keys['r'], rejectHighlighted);
396
+ whenever(keys['s'], snoozeHighlighted);
397
+
398
+ const ctx: ApprovalsInboxContext = {
399
+ shell,
400
+ table,
401
+ filters,
402
+ hasActiveFilters,
403
+ tab,
404
+ tabCounts,
405
+ refreshKey,
406
+ dialogs,
407
+ highlightedExpense,
408
+ fetchExpenses,
409
+ stackExpense,
410
+ stackSubmitter,
411
+ clearFilters,
412
+ approve,
413
+ openReject,
414
+ reject,
415
+ openSnooze,
416
+ snooze,
417
+ bulkApprove,
418
+ openBulkReject,
419
+ bulkReject,
420
+ approveHighlighted,
421
+ rejectHighlighted,
422
+ snoozeHighlighted,
423
+ };
424
+ provide(key, ctx);
425
+ return ctx;
426
+ }
427
+
428
+ export function useApprovalsInbox(): ApprovalsInboxContext {
429
+ const ctx = inject(key);
430
+ if (!ctx)
431
+ throw new Error('useApprovalsInbox() called outside ApprovalsInbox');
432
+ return ctx;
433
+ }
434
+ ```
435
+
436
+ ### Index.vue — the assembly
437
+
438
+ ```vue
439
+ <!-- ApprovalsInbox/Index.vue -->
440
+ <template>
441
+ <PageShell>
442
+ <!-- Topbar: breadcrumbs left, page search right. -->
443
+ <template #topbar>
444
+ <div class="flex items-center justify-between gap-4 border-b px-4 py-2">
445
+ <!-- Breadcrumbs take the row's slack on a stable basis (min-w-0 flex-auto);
446
+ without it their overflow recompute fights the flex layout every frame. -->
447
+ <BbBreadcrumbs
448
+ class="min-w-0 flex-auto"
449
+ :items="[
450
+ { key: 'dashboard', text: 'Dashboard', to: '/dashboard' },
451
+ { key: 'finance', text: 'Finance', to: '/finance' },
452
+ { key: 'approvals', text: 'Approvals' },
453
+ ]"
454
+ />
455
+ <BbTextInput
456
+ v-model="ctx.filters.search"
457
+ autocomplete="off"
458
+ class="shrink-0"
459
+ clearable
460
+ compact
461
+ hide-label
462
+ label="Search expenses"
463
+ placeholder="Search merchant or submitter…"
464
+ prepend:icon="lucide:search"
465
+ />
466
+ </div>
467
+ </template>
468
+
469
+ <div class="flex flex-col gap-3 p-4">
470
+ <FilterRail />
471
+
472
+ <div class="flex items-center justify-between gap-2">
473
+ <!-- Tabs as URL filters: counts come from the server on every fetch. -->
474
+ <BbTabs
475
+ v-model="ctx.tab.value"
476
+ compact
477
+ :items="[
478
+ {
479
+ key: 'needsApproval',
480
+ label: `Needs approval · ${ctx.tabCounts.value.needsApproval}`,
481
+ href: '?tab=needsApproval',
482
+ },
483
+ {
484
+ key: 'approved',
485
+ label: `Approved · ${ctx.tabCounts.value.approved}`,
486
+ href: '?tab=approved',
487
+ },
488
+ {
489
+ key: 'rejected',
490
+ label: `Rejected · ${ctx.tabCounts.value.rejected}`,
491
+ href: '?tab=rejected',
492
+ },
493
+ {
494
+ key: 'all',
495
+ label: `All · ${ctx.tabCounts.value.all}`,
496
+ href: '?tab=all',
497
+ },
498
+ ]"
499
+ />
500
+ <ShortcutsHint />
501
+ </div>
502
+
503
+ <BbTable
504
+ id="approvals-table"
505
+ actions
506
+ caption="Expense approvals"
507
+ :columns="columns"
508
+ compact
509
+ :dependencies="[
510
+ { ...ctx.filters },
511
+ ctx.tab.value,
512
+ ctx.refreshKey.value,
513
+ ]"
514
+ :deps-debounce-time="300"
515
+ item-value="id"
516
+ :items="ctx.fetchExpenses"
517
+ keyboard-navigation
518
+ loading-text="Loading expenses…"
519
+ :row-class="rowClass"
520
+ selectable
521
+ >
522
+ <template #receipt="{ item }">
523
+ <ReceiptThumbnail :expense="item" />
524
+ </template>
525
+
526
+ <template #merchant="{ content }">
527
+ <span class="font-medium">{{ content }}</span>
528
+ </template>
529
+
530
+ <template #submitter_name="{ item }">
531
+ <BbButton
532
+ size="sm"
533
+ variant="ghost"
534
+ @click="() => ctx.stackSubmitter(item.submitter.id)"
535
+ >
536
+ {{ item.submitter.name }}
537
+ </BbButton>
538
+ </template>
539
+
540
+ <template #category="{ item }">
541
+ <BbBadge variant="outline">{{ item.category }}</BbBadge>
542
+ </template>
543
+
544
+ <template #status="{ item }">
545
+ <BbBadge variant="outline">{{ statusLabel(item.status) }}</BbBadge>
546
+ </template>
547
+
548
+ <template #actions="{ item }">
549
+ <RowActions :expense="item" />
550
+ </template>
551
+
552
+ <template #no-data>
553
+ <div class="flex flex-col items-center gap-2 p-6 text-center">
554
+ <p class="text-sm text-[color:var(--bb-text-muted)]">
555
+ No expenses match
556
+ {{
557
+ ctx.hasActiveFilters.value ? 'the current filters' : 'this tab'
558
+ }}.
559
+ </p>
560
+ <BbButton
561
+ v-if="ctx.hasActiveFilters.value"
562
+ variant="ghost"
563
+ @click="ctx.clearFilters"
564
+ >
565
+ Clear filters
566
+ </BbButton>
567
+ </div>
568
+ </template>
569
+ </BbTable>
570
+
571
+ <BbPagination table-id="approvals-table" />
572
+ </div>
573
+
574
+ <SelectionBar />
575
+
576
+ <!-- Stacked peek sidebar: highlight opens the expense; names drill down. -->
577
+ <template #sidebar>
578
+ <ExpensePeek
579
+ v-if="ctx.shell.current.value?.type === 'expense'"
580
+ :expense-id="ctx.shell.current.value.id"
581
+ />
582
+ <SubmitterPeek
583
+ v-else-if="ctx.shell.current.value?.type === 'submitter'"
584
+ :submitter-id="ctx.shell.current.value.id"
585
+ />
586
+ </template>
587
+
588
+ <template #dialogs>
589
+ <RejectDialog />
590
+ <BulkRejectDialog />
591
+ <SnoozeDialog />
592
+ </template>
593
+ </PageShell>
594
+ </template>
595
+
596
+ <script setup lang="ts">
597
+ import {
598
+ BbBadge,
599
+ BbBreadcrumbs,
600
+ BbButton,
601
+ BbPagination,
602
+ BbTable,
603
+ BbTabs,
604
+ BbTextInput,
605
+ } from 'bitboss-ui';
606
+ import PageShell from '@/components/layout/PageShell.vue';
607
+ import { provideApprovalsInbox } from './context';
608
+ import BulkRejectDialog from './BulkRejectDialog.vue';
609
+ import ExpensePeek from './ExpensePeek.vue';
610
+ import FilterRail from './FilterRail.vue';
611
+ import ReceiptThumbnail from './ReceiptThumbnail.vue';
612
+ import RejectDialog from './RejectDialog.vue';
613
+ import RowActions from './RowActions.vue';
614
+ import SelectionBar from './SelectionBar.vue';
615
+ import ShortcutsHint from './ShortcutsHint.vue';
616
+ import SnoozeDialog from './SnoozeDialog.vue';
617
+ import SubmitterPeek from './SubmitterPeek.vue';
618
+ import type { Expense, ExpenseStatus } from '@/types';
619
+
620
+ const ctx = provideApprovalsInbox();
621
+
622
+ const currency = new Intl.NumberFormat('en-US', {
623
+ style: 'currency',
624
+ currency: 'USD',
625
+ });
626
+ const shortDate = (value: string) =>
627
+ new Date(value).toLocaleDateString('en-US', {
628
+ month: 'short',
629
+ day: 'numeric',
630
+ });
631
+ const statusLabel = (status: ExpenseStatus) =>
632
+ ({
633
+ needsApproval: 'Needs approval',
634
+ approved: 'Approved',
635
+ rejected: 'Rejected',
636
+ snoozed: 'Snoozed',
637
+ })[status];
638
+
639
+ const columns = [
640
+ { key: 'receipt', label: 'Receipt', width: 48 },
641
+ { key: 'merchant', label: 'Merchant' },
642
+ { key: 'submitter.name', label: 'Submitter' },
643
+ { key: 'category', label: 'Category' },
644
+ {
645
+ key: 'amount',
646
+ label: 'Amount',
647
+ align: 'right' as const,
648
+ formatter: (value: number) => currency.format(value),
649
+ },
650
+ { key: 'submittedAt', label: 'Submitted', formatter: shortDate },
651
+ { key: 'status', label: 'Status' },
652
+ ];
653
+
654
+ // Highlight ships unstyled — paint it via the public row-class API.
655
+ const rowClass = (item: Expense) =>
656
+ ctx.table.highlighted.value === item.id
657
+ ? 'bg-indigo-50 dark:bg-indigo-950/20'
658
+ : undefined;
659
+ </script>
660
+ ```
661
+
662
+ ### FilterRail.vue
663
+
664
+ ```vue
665
+ <!-- ApprovalsInbox/FilterRail.vue -->
666
+ <template>
667
+ <div class="flex flex-wrap items-center gap-2">
668
+ <!-- Submitter: single, query-aware search against the API. -->
669
+ <BbSelectPopover
670
+ v-model="ctx.filters.submitterId"
671
+ item-text="name"
672
+ item-value="id"
673
+ :items="searchSubmitters"
674
+ >
675
+ <template #activator="{ props }">
676
+ <BbButton
677
+ v-bind="props"
678
+ append:icon="lucide:chevron-down"
679
+ size="sm"
680
+ variant="outline"
681
+ >
682
+ {{ submitterLabel }}
683
+ </BbButton>
684
+ </template>
685
+ </BbSelectPopover>
686
+
687
+ <!-- Category: multi-select pill. -->
688
+ <BbSelectPopover
689
+ v-model="ctx.filters.categories"
690
+ :items="['travel', 'meals', 'software', 'office', 'client', 'other']"
691
+ multiple
692
+ >
693
+ <template #activator="{ props }">
694
+ <BbButton
695
+ v-bind="props"
696
+ append:icon="lucide:chevron-down"
697
+ size="sm"
698
+ variant="outline"
699
+ >
700
+ Category{{
701
+ ctx.filters.categories.length
702
+ ? ` · ${ctx.filters.categories.length}`
703
+ : ''
704
+ }}
705
+ </BbButton>
706
+ </template>
707
+ </BbSelectPopover>
708
+
709
+ <!-- Amount over: a quick-filter pill from preset thresholds. -->
710
+ <BbSelectPopover
711
+ v-model="ctx.filters.amountOver"
712
+ disable-writing
713
+ :items="[50, 100, 250, 500, 1000]"
714
+ width="160px"
715
+ >
716
+ <template #activator="{ props }">
717
+ <BbButton
718
+ v-bind="props"
719
+ append:icon="lucide:chevron-down"
720
+ size="sm"
721
+ variant="outline"
722
+ >
723
+ {{
724
+ ctx.filters.amountOver
725
+ ? `Over $${ctx.filters.amountOver}`
726
+ : 'Amount'
727
+ }}
728
+ </BbButton>
729
+ </template>
730
+ </BbSelectPopover>
731
+
732
+ <!-- Clear-all renders only while something is active. -->
733
+ <BbButton
734
+ v-if="ctx.hasActiveFilters.value"
735
+ class="ml-auto"
736
+ prepend:icon="lucide:x"
737
+ size="sm"
738
+ variant="ghost"
739
+ @click="ctx.clearFilters"
740
+ >
741
+ Clear filters
742
+ </BbButton>
743
+ </div>
744
+ </template>
745
+
746
+ <script setup lang="ts">
747
+ import { computed, ref, watchEffect } from 'vue';
748
+ import { BbButton, BbSelectPopover } from 'bitboss-ui';
749
+ import { useApprovalsInbox } from './context';
750
+ import { api } from '@/api';
751
+ import type { Submitter } from '@/types';
752
+
753
+ const ctx = useApprovalsInbox();
754
+
755
+ const searchSubmitters = (query: string): Promise<Submitter[]> =>
756
+ api.submitters.list({ search: query });
757
+
758
+ // The trigger labels itself from page state (a standalone popover with a
759
+ // seeded model stays lazy and has no resolvable `text` before first open).
760
+ const selectedSubmitter = ref<Submitter | null>(null);
761
+ watchEffect(async () => {
762
+ selectedSubmitter.value =
763
+ ctx.filters.submitterId == null
764
+ ? null
765
+ : await api.submitters.get(ctx.filters.submitterId);
766
+ });
767
+ const submitterLabel = computed(
768
+ () => selectedSubmitter.value?.name ?? 'Submitter'
769
+ );
770
+ </script>
771
+ ```
772
+
773
+ ### ShortcutsHint.vue
774
+
775
+ ```vue
776
+ <!-- ApprovalsInbox/ShortcutsHint.vue -->
777
+ <template>
778
+ <div class="flex items-center gap-1">
779
+ <span class="mr-1 text-xs text-[color:var(--bb-text-muted)]"
780
+ >Shortcuts</span
781
+ >
782
+ <BbTooltip>
783
+ <template #activator="{ props }">
784
+ <BbButton
785
+ v-bind="props"
786
+ aria-label="Approve highlighted expense"
787
+ :disabled="!ctx.highlightedExpense.value"
788
+ icon="lucide:check"
789
+ size="xs"
790
+ variant="ghost"
791
+ @click="ctx.approveHighlighted"
792
+ />
793
+ </template>
794
+ <span class="flex items-center gap-1.5">
795
+ Approve
796
+ <kbd
797
+ class="rounded border border-current px-1 font-mono text-[10px] leading-4 opacity-75"
798
+ >A</kbd
799
+ >
800
+ </span>
801
+ </BbTooltip>
802
+ <BbTooltip>
803
+ <template #activator="{ props }">
804
+ <BbButton
805
+ v-bind="props"
806
+ aria-label="Reject highlighted expense"
807
+ :disabled="!ctx.highlightedExpense.value"
808
+ icon="lucide:x"
809
+ size="xs"
810
+ variant="ghost"
811
+ @click="ctx.rejectHighlighted"
812
+ />
813
+ </template>
814
+ <span class="flex items-center gap-1.5">
815
+ Reject
816
+ <kbd
817
+ class="rounded border border-current px-1 font-mono text-[10px] leading-4 opacity-75"
818
+ >R</kbd
819
+ >
820
+ </span>
821
+ </BbTooltip>
822
+ <BbTooltip>
823
+ <template #activator="{ props }">
824
+ <BbButton
825
+ v-bind="props"
826
+ aria-label="Snooze highlighted expense"
827
+ :disabled="!ctx.highlightedExpense.value"
828
+ icon="lucide:clock"
829
+ size="xs"
830
+ variant="ghost"
831
+ @click="ctx.snoozeHighlighted"
832
+ />
833
+ </template>
834
+ <span class="flex items-center gap-1.5">
835
+ Snooze
836
+ <kbd
837
+ class="rounded border border-current px-1 font-mono text-[10px] leading-4 opacity-75"
838
+ >S</kbd
839
+ >
840
+ </span>
841
+ </BbTooltip>
842
+ </div>
843
+ </template>
844
+
845
+ <script setup lang="ts">
846
+ import { BbButton, BbTooltip } from 'bitboss-ui';
847
+ import { useApprovalsInbox } from './context';
848
+
849
+ const ctx = useApprovalsInbox();
850
+ </script>
851
+ ```
852
+
853
+ ### ReceiptThumbnail.vue
854
+
855
+ ```vue
856
+ <!-- ApprovalsInbox/ReceiptThumbnail.vue -->
857
+ <template>
858
+ <img
859
+ v-if="expense.receiptUrl"
860
+ :alt="`Receipt from ${expense.merchant}`"
861
+ class="h-8 w-8 rounded-[var(--bb-radius)] border border-[color:var(--bb-border)] object-cover"
862
+ :src="expense.receiptUrl"
863
+ />
864
+ <div
865
+ v-else
866
+ aria-hidden="true"
867
+ class="flex h-8 w-8 items-center justify-center rounded-[var(--bb-radius)] border border-dashed border-[color:var(--bb-border)] text-[color:var(--bb-text-muted)]"
868
+ >
869
+ <BbIcon icon="lucide:receipt" size="14" />
870
+ </div>
871
+ </template>
872
+
873
+ <script setup lang="ts">
874
+ import { BbIcon } from 'bitboss-ui';
875
+ import type { Expense } from '@/types';
876
+
877
+ defineProps<{ expense: Expense }>();
878
+ </script>
879
+ ```
880
+
881
+ ### RowActions.vue
882
+
883
+ ```vue
884
+ <!-- ApprovalsInbox/RowActions.vue -->
885
+ <template>
886
+ <div class="flex items-center gap-1">
887
+ <BbTooltip text="Approve">
888
+ <template #activator="{ props }">
889
+ <BbButton
890
+ v-bind="props"
891
+ aria-label="Approve"
892
+ :disabled="resolved"
893
+ icon="lucide:check"
894
+ size="xs"
895
+ variant="ghost"
896
+ @click="() => ctx.approve(expense)"
897
+ />
898
+ </template>
899
+ </BbTooltip>
900
+ <BbTooltip text="Reject">
901
+ <template #activator="{ props }">
902
+ <BbButton
903
+ v-bind="props"
904
+ aria-label="Reject"
905
+ :disabled="resolved"
906
+ icon="lucide:x"
907
+ size="xs"
908
+ variant="ghost"
909
+ @click="() => ctx.openReject(expense)"
910
+ />
911
+ </template>
912
+ </BbTooltip>
913
+ <BbTooltip text="Snooze">
914
+ <template #activator="{ props }">
915
+ <BbButton
916
+ v-bind="props"
917
+ aria-label="Snooze"
918
+ :disabled="resolved"
919
+ icon="lucide:clock"
920
+ size="xs"
921
+ variant="ghost"
922
+ @click="() => ctx.openSnooze(expense)"
923
+ />
924
+ </template>
925
+ </BbTooltip>
926
+ </div>
927
+ </template>
928
+
929
+ <script setup lang="ts">
930
+ import { computed } from 'vue';
931
+ import { BbButton, BbTooltip } from 'bitboss-ui';
932
+ import { useApprovalsInbox } from './context';
933
+ import type { Expense } from '@/types';
934
+
935
+ const props = defineProps<{ expense: Expense }>();
936
+
937
+ const ctx = useApprovalsInbox();
938
+
939
+ const resolved = computed(
940
+ () =>
941
+ props.expense.status === 'approved' || props.expense.status === 'rejected'
942
+ );
943
+ </script>
944
+ ```
945
+
946
+ ### RejectDialog.vue
947
+
948
+ ```vue
949
+ <!-- ApprovalsInbox/RejectDialog.vue -->
950
+ <template>
951
+ <BbDialog
952
+ :model-value="expense !== null"
953
+ size="sm"
954
+ :title="expense ? `Reject — ${expense.merchant}` : ''"
955
+ @show="reason = ''"
956
+ @update:model-value="close"
957
+ >
958
+ <form
959
+ v-if="expense"
960
+ class="flex flex-col gap-3"
961
+ novalidate
962
+ @submit.prevent="submit"
963
+ >
964
+ <BbTextarea
965
+ v-model="reason"
966
+ label="Reason"
967
+ label-mode="outside"
968
+ placeholder="Why is this expense being rejected?"
969
+ rows="3"
970
+ />
971
+ <div class="mt-1 flex justify-end gap-2">
972
+ <BbButton type="button" variant="ghost" @click="close">Cancel</BbButton>
973
+ <BbButton
974
+ :disabled="reason.trim().length < 3"
975
+ type="submit"
976
+ variant="destructive"
977
+ >
978
+ Reject expense
979
+ </BbButton>
980
+ </div>
981
+ </form>
982
+ </BbDialog>
983
+ </template>
984
+
985
+ <script setup lang="ts">
986
+ import { computed, ref } from 'vue';
987
+ import { BbButton, BbDialog, BbTextarea } from 'bitboss-ui';
988
+ import { useApprovalsInbox } from './context';
989
+
990
+ const ctx = useApprovalsInbox();
991
+
992
+ // The dialog's subject lives in the page context — the row action and the
993
+ // peek's reject button both just assign it.
994
+ const expense = computed(() => ctx.dialogs.reject.value);
995
+ const close = () => {
996
+ ctx.dialogs.reject.value = null;
997
+ };
998
+
999
+ const reason = ref('');
1000
+ const submit = () =>
1001
+ expense.value ? ctx.reject(expense.value, reason.value.trim()) : undefined;
1002
+ </script>
1003
+ ```
1004
+
1005
+ ### BulkRejectDialog.vue
1006
+
1007
+ ```vue
1008
+ <!-- ApprovalsInbox/BulkRejectDialog.vue -->
1009
+ <template>
1010
+ <BbDialog
1011
+ :model-value="ctx.dialogs.bulkReject.value"
1012
+ size="sm"
1013
+ :title="`Reject ${count} expenses`"
1014
+ @show="reason = ''"
1015
+ @update:model-value="close"
1016
+ >
1017
+ <form class="flex flex-col gap-3" novalidate @submit.prevent="submit">
1018
+ <BbTextarea
1019
+ v-model="reason"
1020
+ label="Reason"
1021
+ label-mode="outside"
1022
+ placeholder="Applied to every selected expense."
1023
+ rows="3"
1024
+ />
1025
+ <div class="mt-1 flex justify-end gap-2">
1026
+ <BbButton type="button" variant="ghost" @click="close">Cancel</BbButton>
1027
+ <BbButton
1028
+ :disabled="reason.trim().length < 3"
1029
+ type="submit"
1030
+ variant="destructive"
1031
+ >
1032
+ Reject {{ count }} expenses
1033
+ </BbButton>
1034
+ </div>
1035
+ </form>
1036
+ </BbDialog>
1037
+ </template>
1038
+
1039
+ <script setup lang="ts">
1040
+ import { computed, ref } from 'vue';
1041
+ import { BbButton, BbDialog, BbTextarea } from 'bitboss-ui';
1042
+ import { useApprovalsInbox } from './context';
1043
+
1044
+ const ctx = useApprovalsInbox();
1045
+
1046
+ const count = computed(() => (ctx.table.selected.value as number[]).length);
1047
+ const close = () => {
1048
+ ctx.dialogs.bulkReject.value = false;
1049
+ };
1050
+
1051
+ const reason = ref('');
1052
+ const submit = () => ctx.bulkReject(reason.value.trim());
1053
+ </script>
1054
+ ```
1055
+
1056
+ ### SnoozeDialog.vue
1057
+
1058
+ ```vue
1059
+ <!-- ApprovalsInbox/SnoozeDialog.vue -->
1060
+ <template>
1061
+ <BbDialog
1062
+ :model-value="expense !== null"
1063
+ size="xs"
1064
+ :title="expense ? `Snooze — ${expense.merchant}` : ''"
1065
+ @show="until = tomorrow"
1066
+ @update:model-value="close"
1067
+ >
1068
+ <form
1069
+ v-if="expense"
1070
+ class="flex flex-col gap-3"
1071
+ novalidate
1072
+ @submit.prevent="submit"
1073
+ >
1074
+ <BbDatePickerInput
1075
+ v-model="until"
1076
+ floating
1077
+ label="Snooze until"
1078
+ label-mode="outside"
1079
+ :min="tomorrow"
1080
+ />
1081
+ <div class="mt-1 flex justify-end gap-2">
1082
+ <BbButton type="button" variant="ghost" @click="close">Cancel</BbButton>
1083
+ <BbButton type="submit" variant="secondary">Snooze</BbButton>
1084
+ </div>
1085
+ </form>
1086
+ </BbDialog>
1087
+ </template>
1088
+
1089
+ <script setup lang="ts">
1090
+ import { computed, ref } from 'vue';
1091
+ import { BbButton, BbDatePickerInput, BbDialog } from 'bitboss-ui';
1092
+ import { useApprovalsInbox } from './context';
1093
+
1094
+ const ctx = useApprovalsInbox();
1095
+
1096
+ const expense = computed(() => ctx.dialogs.snooze.value);
1097
+ const close = () => {
1098
+ ctx.dialogs.snooze.value = null;
1099
+ };
1100
+
1101
+ const tomorrow = new Date(Date.now() + 86_400_000).toISOString().slice(0, 10);
1102
+ const until = ref(tomorrow);
1103
+ const submit = () =>
1104
+ expense.value ? ctx.snooze(expense.value, until.value) : undefined;
1105
+ </script>
1106
+ ```
1107
+
1108
+ ### SelectionBar.vue
1109
+
1110
+ ```vue
1111
+ <!-- ApprovalsInbox/SelectionBar.vue -->
1112
+ <template>
1113
+ <FloatingBottomPanel :open="selectedCount > 0">
1114
+ <span class="px-2 text-sm">{{ selectedCount }} selected</span>
1115
+ <BbButton
1116
+ prepend:icon="lucide:check"
1117
+ size="sm"
1118
+ variant="ghost"
1119
+ @click="ctx.bulkApprove"
1120
+ >
1121
+ Approve
1122
+ </BbButton>
1123
+ <div class="floating-bottom-panel__right flex items-center gap-1">
1124
+ <BbButton size="sm" variant="destructive" @click="ctx.openBulkReject">
1125
+ Reject
1126
+ </BbButton>
1127
+ <BbButton
1128
+ aria-label="Clear selection"
1129
+ icon="lucide:x"
1130
+ size="sm"
1131
+ variant="ghost"
1132
+ @click="clearSelection"
1133
+ />
1134
+ </div>
1135
+ </FloatingBottomPanel>
1136
+ </template>
1137
+
1138
+ <script setup lang="ts">
1139
+ import { computed } from 'vue';
1140
+ import { BbButton } from 'bitboss-ui';
1141
+ import FloatingBottomPanel from '@/components/layout/FloatingBottomPanel.vue';
1142
+ import { useApprovalsInbox } from './context';
1143
+
1144
+ const ctx = useApprovalsInbox();
1145
+
1146
+ const selectedCount = computed(() => ctx.table.selected.value?.length ?? 0);
1147
+ const clearSelection = () => {
1148
+ ctx.table.selected.value = [];
1149
+ };
1150
+ </script>
1151
+ ```
1152
+
1153
+ ### ExpensePeek.vue
1154
+
1155
+ ```vue
1156
+ <!-- ApprovalsInbox/ExpensePeek.vue -->
1157
+ <template>
1158
+ <div v-if="expense" class="flex flex-col gap-4 text-sm">
1159
+ <!-- Header: identity + amount + status. -->
1160
+ <header class="flex flex-col gap-1.5">
1161
+ <div class="flex items-center justify-between gap-2">
1162
+ <h2 class="text-base font-semibold">{{ expense.merchant }}</h2>
1163
+ <BbBadge variant="outline">{{ statusLabel(expense.status) }}</BbBadge>
1164
+ </div>
1165
+ <p class="text-xl font-semibold">{{ currency.format(expense.amount) }}</p>
1166
+ <p class="text-xs text-[color:var(--bb-text-muted)]">
1167
+ Submitted {{ longDate(expense.submittedAt) }}
1168
+ </p>
1169
+ </header>
1170
+
1171
+ <!-- Receipt: bigger than the row thumbnail, with a full-size link out. -->
1172
+ <section class="flex flex-col gap-1.5">
1173
+ <h3
1174
+ class="text-xs font-semibold uppercase tracking-wide text-[color:var(--bb-text-muted)]"
1175
+ >
1176
+ Receipt
1177
+ </h3>
1178
+ <img
1179
+ v-if="expense.receiptUrl"
1180
+ :alt="`Receipt from ${expense.merchant}`"
1181
+ class="h-40 w-full rounded-[var(--bb-radius)] border border-[color:var(--bb-border)] object-cover"
1182
+ :src="expense.receiptUrl"
1183
+ />
1184
+ <p v-else class="text-xs text-[color:var(--bb-text-muted)]">
1185
+ No receipt attached.
1186
+ </p>
1187
+ <BbButton
1188
+ v-if="expense.receiptUrl"
1189
+ append:icon="lucide:arrow-up-right"
1190
+ :href="expense.receiptUrl"
1191
+ size="sm"
1192
+ target="_blank"
1193
+ variant="ghost"
1194
+ >
1195
+ View full-size receipt
1196
+ </BbButton>
1197
+ </section>
1198
+
1199
+ <!-- Properties: submitter name drills DOWN — stacked peek, back arrow. -->
1200
+ <dl class="grid grid-cols-[auto_1fr] gap-x-4 gap-y-1.5">
1201
+ <dt class="text-[color:var(--bb-text-muted)]">Submitter</dt>
1202
+ <dd>
1203
+ <BbButton
1204
+ size="sm"
1205
+ variant="link"
1206
+ @click="() => ctx.stackSubmitter(expense!.submitter.id)"
1207
+ >
1208
+ {{ expense.submitter.name }}
1209
+ </BbButton>
1210
+ </dd>
1211
+ <dt class="text-[color:var(--bb-text-muted)]">Category</dt>
1212
+ <dd class="capitalize">{{ expense.category }}</dd>
1213
+ <dt class="text-[color:var(--bb-text-muted)]">Memo</dt>
1214
+ <dd>{{ expense.memo ?? '—' }}</dd>
1215
+ </dl>
1216
+
1217
+ <!-- Activity feed. -->
1218
+ <section class="flex flex-col gap-1.5">
1219
+ <h3
1220
+ class="text-xs font-semibold uppercase tracking-wide text-[color:var(--bb-text-muted)]"
1221
+ >
1222
+ Activity
1223
+ </h3>
1224
+ <ul class="flex flex-col gap-2">
1225
+ <li
1226
+ v-for="entry in expense.activity"
1227
+ :key="entry.id"
1228
+ class="flex gap-2"
1229
+ >
1230
+ <BbIcon
1231
+ class="mt-0.5 shrink-0 text-[color:var(--bb-text-muted)]"
1232
+ :icon="entry.icon"
1233
+ size="14"
1234
+ />
1235
+ <div class="flex flex-col">
1236
+ <span>{{ entry.text }}</span>
1237
+ <span class="text-xs text-[color:var(--bb-text-muted)]"
1238
+ >{{ entry.actor }} · {{ longDate(entry.at) }}</span
1239
+ >
1240
+ </div>
1241
+ </li>
1242
+ </ul>
1243
+ </section>
1244
+
1245
+ <!-- Peek is a workbench: the same three actions as the row, plus the real page. -->
1246
+ <footer class="mt-2 flex flex-wrap items-center gap-2 border-t pt-3">
1247
+ <BbButton
1248
+ :disabled="resolved"
1249
+ prepend:icon="lucide:check"
1250
+ size="sm"
1251
+ variant="secondary"
1252
+ @click="() => ctx.approve(expense!)"
1253
+ >
1254
+ Approve
1255
+ </BbButton>
1256
+ <BbButton
1257
+ :disabled="resolved"
1258
+ prepend:icon="lucide:x"
1259
+ size="sm"
1260
+ variant="destructive"
1261
+ @click="() => ctx.openReject(expense!)"
1262
+ >
1263
+ Reject
1264
+ </BbButton>
1265
+ <BbButton
1266
+ :disabled="resolved"
1267
+ prepend:icon="lucide:clock"
1268
+ size="sm"
1269
+ variant="outline"
1270
+ @click="() => ctx.openSnooze(expense!)"
1271
+ >
1272
+ Snooze
1273
+ </BbButton>
1274
+ <BbButton
1275
+ append:icon="lucide:arrow-up-right"
1276
+ class="ml-auto"
1277
+ size="sm"
1278
+ :to="`/expenses/${expense.id}`"
1279
+ variant="ghost"
1280
+ >
1281
+ Open full expense
1282
+ </BbButton>
1283
+ </footer>
1284
+ </div>
1285
+
1286
+ <div v-else class="flex justify-center p-8">
1287
+ <BbSpinner />
1288
+ </div>
1289
+ </template>
1290
+
1291
+ <script setup lang="ts">
1292
+ import { computed, ref, watchEffect } from 'vue';
1293
+ import { BbBadge, BbButton, BbIcon, BbSpinner } from 'bitboss-ui';
1294
+ import { useApprovalsInbox } from './context';
1295
+ import { api } from '@/api';
1296
+ import type { ExpenseDetail, ExpenseStatus } from '@/types';
1297
+
1298
+ const props = defineProps<{ expenseId: number }>();
1299
+
1300
+ const ctx = useApprovalsInbox();
1301
+
1302
+ // Re-fetches whenever the stack shows a different expense; refreshKey makes
1303
+ // approve/reject/snooze reflect here immediately.
1304
+ const expense = ref<ExpenseDetail | null>(null);
1305
+ watchEffect(async () => {
1306
+ void ctx.refreshKey.value;
1307
+ expense.value = await api.expenses.get(props.expenseId);
1308
+ });
1309
+
1310
+ const resolved = computed(
1311
+ () =>
1312
+ expense.value?.status === 'approved' || expense.value?.status === 'rejected'
1313
+ );
1314
+
1315
+ const currency = new Intl.NumberFormat('en-US', {
1316
+ style: 'currency',
1317
+ currency: 'USD',
1318
+ });
1319
+ const longDate = (value: string) =>
1320
+ new Date(value).toLocaleDateString('en-US', {
1321
+ month: 'short',
1322
+ day: 'numeric',
1323
+ year: 'numeric',
1324
+ });
1325
+ const statusLabel = (status: ExpenseStatus) =>
1326
+ ({
1327
+ needsApproval: 'Needs approval',
1328
+ approved: 'Approved',
1329
+ rejected: 'Rejected',
1330
+ snoozed: 'Snoozed',
1331
+ })[status];
1332
+ </script>
1333
+ ```
1334
+
1335
+ ### SubmitterPeek.vue
1336
+
1337
+ ```vue
1338
+ <!-- ApprovalsInbox/SubmitterPeek.vue -->
1339
+ <template>
1340
+ <div v-if="submitter" class="flex flex-col gap-4 text-sm">
1341
+ <header class="flex items-center gap-3">
1342
+ <BbAvatar :alt="submitter.name" :src="submitter.avatarUrl" />
1343
+ <div class="flex flex-col">
1344
+ <h2 class="text-base font-semibold">{{ submitter.name }}</h2>
1345
+ <p class="text-xs text-[color:var(--bb-text-muted)]">
1346
+ {{ submitter.email }} · {{ submitter.team }}
1347
+ </p>
1348
+ </div>
1349
+ </header>
1350
+
1351
+ <!-- Stat strip. -->
1352
+ <div class="grid grid-cols-3 gap-2">
1353
+ <div class="rounded-[var(--bb-radius)] border p-2">
1354
+ <p class="text-xs text-[color:var(--bb-text-muted)]">Submitted (YTD)</p>
1355
+ <p class="font-semibold">
1356
+ {{ currency.format(submitter.totalSubmitted) }}
1357
+ </p>
1358
+ </div>
1359
+ <div class="rounded-[var(--bb-radius)] border p-2">
1360
+ <p class="text-xs text-[color:var(--bb-text-muted)]">Pending</p>
1361
+ <p class="font-semibold">{{ submitter.pendingCount }}</p>
1362
+ </div>
1363
+ <div class="rounded-[var(--bb-radius)] border p-2">
1364
+ <p class="text-xs text-[color:var(--bb-text-muted)]">Approval rate</p>
1365
+ <p class="font-semibold">{{ submitter.approvalRate }}%</p>
1366
+ </div>
1367
+ </div>
1368
+
1369
+ <!-- Recent expenses: names drill down again — the stack keeps growing. -->
1370
+ <section class="flex flex-col gap-1.5">
1371
+ <h3
1372
+ class="text-xs font-semibold uppercase tracking-wide text-[color:var(--bb-text-muted)]"
1373
+ >
1374
+ Recent expenses
1375
+ </h3>
1376
+ <ul class="flex flex-col">
1377
+ <li
1378
+ v-for="recent in submitter.recentExpenses"
1379
+ :key="recent.id"
1380
+ class="flex items-center justify-between gap-2 border-b py-1.5 last:border-b-0"
1381
+ >
1382
+ <BbButton
1383
+ size="sm"
1384
+ variant="link"
1385
+ @click="() => ctx.stackExpense(recent.id)"
1386
+ >
1387
+ {{ recent.merchant }}
1388
+ </BbButton>
1389
+ <BbBadge variant="outline">{{ recent.status }}</BbBadge>
1390
+ <span class="text-xs text-[color:var(--bb-text-muted)]">{{
1391
+ currency.format(recent.amount)
1392
+ }}</span>
1393
+ </li>
1394
+ </ul>
1395
+ </section>
1396
+
1397
+ <footer class="mt-2 flex items-center gap-2 border-t pt-3">
1398
+ <BbButton
1399
+ append:icon="lucide:arrow-up-right"
1400
+ size="sm"
1401
+ :to="`/people/${submitter.id}`"
1402
+ variant="ghost"
1403
+ >
1404
+ Open profile
1405
+ </BbButton>
1406
+ </footer>
1407
+ </div>
1408
+
1409
+ <div v-else class="flex justify-center p-8">
1410
+ <BbSpinner />
1411
+ </div>
1412
+ </template>
1413
+
1414
+ <script setup lang="ts">
1415
+ import { ref, watchEffect } from 'vue';
1416
+ import { BbAvatar, BbBadge, BbButton, BbSpinner } from 'bitboss-ui';
1417
+ import { useApprovalsInbox } from './context';
1418
+ import { api } from '@/api';
1419
+ import type { SubmitterDetail } from '@/types';
1420
+
1421
+ const props = defineProps<{ submitterId: number }>();
1422
+
1423
+ const ctx = useApprovalsInbox();
1424
+
1425
+ const submitter = ref<SubmitterDetail | null>(null);
1426
+ watchEffect(async () => {
1427
+ submitter.value = await api.submitters.getDetail(props.submitterId);
1428
+ });
1429
+
1430
+ const currency = new Intl.NumberFormat('en-US', {
1431
+ style: 'currency',
1432
+ currency: 'USD',
1433
+ });
1434
+ </script>
1435
+ ```
1436
+
1437
+ ## Why it is built this way
1438
+
1439
+ - **The context coopts, leaves consume.** `shell` and `table` are joined
1440
+ once in `provideApprovalsInbox()`; twelve components share filters,
1441
+ selection, highlight, the peek stack, the keyboard shortcuts and every
1442
+ action through one `useApprovalsInbox()` call.
1443
+ - **Highlight is the trigger, not a bespoke click handler.** Per the
1444
+ `BbTable` guide, `highlighted` is "a parallel, UI-intent state…
1445
+ independent of selection" that ships unstyled — this recipe is exactly
1446
+ the case the guide's Row Highlight section describes: a `watch` on
1447
+ `table.highlighted` is the entire wiring between "arrow to a row" and
1448
+ "the peek is open", and `keyboard-navigation`'s Enter/Space "activate…
1449
+ through the same path as a mouse click" means the mouse and the keyboard
1450
+ share one code path for free.
1451
+ - **`item-value="id"`** is what lets `table.highlighted` (and
1452
+ `table.selected`) hold plain ids instead of whole objects — the keyboard
1453
+ handler and the peek both resolve the full `Expense` from a small
1454
+ `lastItems` cache populated by `fetchExpenses`, never from the table's
1455
+ internal row wrapper.
1456
+ - **One dispatch path per action, three entry points.** `approve`,
1457
+ `openReject` and `openSnooze` are called identically from `RowActions`,
1458
+ `ExpensePeek`'s footer, and the `A`/`R`/`S` keyboard handlers
1459
+ (`approveHighlighted` etc. are the same functions, resolved against
1460
+ `highlightedExpense` instead of a row prop) — there is exactly one place
1461
+ each action's API call, refresh and toast live.
1462
+ - **Reason and date are dialogs, not confirms.** Per the pattern catalog
1463
+ (§6.2), "anything needing input opens a `BbDialog`" — reject needs a
1464
+ typed reason, snooze needs a date, so both get a small dialog whose
1465
+ open-state is the subject itself (`ctx.dialogs.reject` holds the
1466
+ `Expense`, not a boolean), exactly like the flagship's
1467
+ `RecordPaymentDialog`. Bulk reject is destructive **and** needs input,
1468
+ so it layers a `useConfirm` on top of the dialog's own submit.
1469
+ - **The shortcut guard mirrors `useDeleteCmd`.** `isInteractiveElementFocused()`
1470
+ is copied verbatim from the Inertia Helpers guide's `useDeleteCmd` (which
1471
+ the guide notes "works on any platform") so typing a rejection reason
1472
+ never fires `R`; the handler also bails while any dialog is open.
1473
+ - **`peekX` vs `stackX` is the whole stack grammar**, unchanged from the
1474
+ flagship: highlighting always **replaces** (`peekExpense`, `true`),
1475
+ clicking a submitter's name always **pushes** (`stackSubmitter`), and the
1476
+ shell renders the back arrow once depth > 1 — from a row, from inside
1477
+ the expense peek, or drilling back from the submitter peek's own recent
1478
+ expenses.
1479
+ - **Sizing:** topbar and rail follow `md`-first; `sm`/`xs` appear exactly
1480
+ where the doctrine allows — table rows (`xs`, the densest surface), the
1481
+ shortcut bar (`xs`), the peek footers and the bulk bar (`sm`).
1482
+ - **No `variant="primary"` on this page.** Triage has no "create" action —
1483
+ the one-primary-action rule is satisfied vacuously; every action here is
1484
+ either a one-click mutation, a gated mutation via dialog, or navigation.
1485
+
1486
+ ## Variations
1487
+
1488
+ - **No snooze**: drop `SnoozeDialog.vue`, the `S` shortcut, and the
1489
+ `snoozed` tab state — the remaining approve/reject pair still clears the
1490
+ ≥ 12 action bar on its own via the bulk/keyboard/peek spread.
1491
+ - **Auto-advance after action**: after `approve`/`reject` resolves, call
1492
+ `table.highlighted.value = nextExpenseId` (the id following the acted-on
1493
+ row in `lastItems`) so triage keeps moving without a re-highlight —
1494
+ the classic "Superhuman" flow.
1495
+ - **Per-category routing**: seed `filters.categories` from a saved view
1496
+ per approver role (a store-backed default) instead of starting empty.