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