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