bitboss-ui 3.0.0-beta.47 → 3.0.0-beta.49

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 (398) hide show
  1. package/README.md +24 -7
  2. package/bin/bitboss-ui-mcp.mjs +15 -3
  3. package/bin/bitboss-ui.mjs +167 -14
  4. package/dist/ai/BbAccordion.md +1 -1
  5. package/dist/ai/BbAvatar.md +1 -1
  6. package/dist/ai/BbBreadcrumbs.md +65 -65
  7. package/dist/ai/BbButton.md +28 -8
  8. package/dist/ai/BbCheckbox.md +0 -2
  9. package/dist/ai/BbCheckboxGroup.md +13 -20
  10. package/dist/ai/BbCollapsible.md +1 -1
  11. package/dist/ai/BbColorPalette.md +1 -1
  12. package/dist/ai/BbConfirm.md +8 -0
  13. package/dist/ai/BbConfirmPortal.md +1 -1
  14. package/dist/ai/BbDatePickerInput.md +4 -2
  15. package/dist/ai/BbDialog.md +1 -8
  16. package/dist/ai/BbDropdown.md +231 -220
  17. package/dist/ai/BbDropdownButton.md +65 -65
  18. package/dist/ai/BbDropdownGroup.md +2 -2
  19. package/dist/ai/BbDropzone.md +10 -10
  20. package/dist/ai/BbForm.md +43 -52
  21. package/dist/ai/BbHoverCard.md +19 -7
  22. package/dist/ai/BbHoverCardPortal.md +1 -1
  23. package/dist/ai/BbNumberInput.md +88 -21
  24. package/dist/ai/BbPopover.md +47 -40
  25. package/dist/ai/BbPopoverPortal.md +1 -1
  26. package/dist/ai/BbProgress.md +48 -22
  27. package/dist/ai/BbRadioGroup.md +13 -19
  28. package/dist/ai/BbSelect.md +16 -36
  29. package/dist/ai/BbSelectPopover.md +14 -30
  30. package/dist/ai/BbSmoothHeight.md +0 -2
  31. package/dist/ai/BbSwitchGroup.md +13 -20
  32. package/dist/ai/BbTable.md +11 -10
  33. package/dist/ai/BbTabs.md +107 -106
  34. package/dist/ai/BbTabsList.md +2 -2
  35. package/dist/ai/BbTabsPanels.md +1 -1
  36. package/dist/ai/BbTabsRoot.md +3 -3
  37. package/dist/ai/BbTooltip.md +29 -13
  38. package/dist/ai/BbTree.md +14 -11
  39. package/dist/ai/CommonPopover.md +1 -1
  40. package/dist/ai/changelog.json +297 -6
  41. package/dist/ai/components.json +50 -45
  42. package/dist/ai/composables/useBbDropdownContext.md +16 -16
  43. package/dist/ai/composables/useBbFormField.md +5 -1
  44. package/dist/ai/composables/useBbTabsContext.md +14 -14
  45. package/dist/ai/guides/agent-contract.md +27 -27
  46. package/dist/ai/guides/ai-router.md +1 -1
  47. package/dist/ai/guides/component-picker.md +3 -3
  48. package/dist/ai/guides/fetch-items-playbook.md +1 -1
  49. package/dist/ai/guides/icons-policy.md +10 -10
  50. package/dist/ai/guides/inertia-helpers.md +120 -67
  51. package/dist/ai/guides/installation-and-plugin-setup.md +45 -15
  52. package/dist/ai/guides/migration/components/bb-breadcrumbs.md +3 -2
  53. package/dist/ai/guides/migration/components/bb-checkbox-group.md +16 -16
  54. package/dist/ai/guides/migration/components/bb-dropdown-button.md +9 -8
  55. package/dist/ai/guides/migration/components/bb-dropdown.md +15 -14
  56. package/dist/ai/guides/migration/components/bb-radio-group.md +2 -1
  57. package/dist/ai/guides/migration/components/bb-select-popover.md +6 -1
  58. package/dist/ai/guides/migration/components/bb-select.md +10 -2
  59. package/dist/ai/guides/migration/components/bb-switch-group.md +2 -1
  60. package/dist/ai/guides/migration/components/bb-tabs.md +9 -8
  61. package/dist/ai/guides/migration/components/bb-tooltip.md +1 -1
  62. package/dist/ai/guides/migration/v2-to-v3.md +143 -28
  63. package/dist/ai/guides/migration/v3-beta-css-classes.md +29 -27
  64. package/dist/ai/guides/migration/v3-beta-tooling.md +11 -0
  65. package/dist/ai/guides/options-items-playbook.md +30 -24
  66. package/dist/ai/guides/passthrough.md +4 -4
  67. package/dist/ai/guides/preset-components.md +18 -3
  68. package/dist/ai/guides/typescript-generic-components.md +1 -1
  69. package/dist/ai/guides/validated-forms.md +11 -22
  70. package/dist/ai/guides/validation-providers.md +4 -3
  71. package/dist/ai/helpers/inertia/manifest.json +636 -0
  72. package/dist/ai/helpers/inertia/types.ts +15 -0
  73. package/dist/ai/helpers/inertia/useAsyncFn.ts +110 -0
  74. package/dist/ai/helpers/inertia/useConfirmOnRouteLeave.ts +102 -0
  75. package/dist/ai/helpers/inertia/useDeleteCmd.ts +30 -0
  76. package/dist/ai/helpers/inertia/useHasChanged.ts +36 -0
  77. package/dist/ai/helpers/inertia/useIndexById.ts +23 -0
  78. package/dist/ai/helpers/inertia/useLazyProp.ts +148 -0
  79. package/dist/ai/helpers/inertia/useLazyPropGetter.ts +50 -0
  80. package/dist/ai/helpers/inertia/useLoading.ts +20 -0
  81. package/dist/ai/helpers/inertia/usePaginatedResponseContext.ts +88 -0
  82. package/dist/ai/helpers/inertia/usePromiseForm.ts +62 -0
  83. package/dist/ai/helpers/inertia/useProp.ts +63 -0
  84. package/dist/ai/helpers/inertia/useQuery.ts +19 -0
  85. package/dist/ai/helpers/inertia/useQueryObject.ts +116 -0
  86. package/dist/ai/helpers/inertia/useResourceContext.ts +69 -0
  87. package/dist/ai/helpers/inertia/useRouteQuery.ts +54 -0
  88. package/dist/ai/helpers/inertia/useScreenSizes.ts +23 -0
  89. package/dist/ai/helpers/inertia/useTableContext.ts +34 -0
  90. package/dist/ai/helpers/inertia/useTableSelectionContext.ts +48 -0
  91. package/dist/ai/helpers/inertia/useUntil.ts +33 -0
  92. package/dist/ai/helpers/inertia/utils.ts +24 -0
  93. package/dist/ai/index.md +6 -6
  94. package/dist/ai/manifest/components/BbAccordion.json +1 -1
  95. package/dist/ai/manifest/components/BbBreadcrumbs.json +10 -6
  96. package/dist/ai/manifest/components/BbBreadcrumbs.tree.json +1 -1
  97. package/dist/ai/manifest/components/BbButton.json +2 -1
  98. package/dist/ai/manifest/components/BbButton.tree.json +1 -1
  99. package/dist/ai/manifest/components/BbCheckboxGroup.json +2 -2
  100. package/dist/ai/manifest/components/BbCollapsible.json +1 -1
  101. package/dist/ai/manifest/components/BbColorPalette.json +1 -1
  102. package/dist/ai/manifest/components/BbConfirmPortal.json +5 -2
  103. package/dist/ai/manifest/components/BbDropdown.json +23 -20
  104. package/dist/ai/manifest/components/BbDropdown.tree.json +2 -2
  105. package/dist/ai/manifest/components/BbDropdownButton.json +22 -19
  106. package/dist/ai/manifest/components/BbDropdownButton.tree.json +1 -1
  107. package/dist/ai/manifest/components/BbDropdownGroup.json +2 -2
  108. package/dist/ai/manifest/components/BbForm.json +1 -0
  109. package/dist/ai/manifest/components/BbHoverCard.json +1 -1
  110. package/dist/ai/manifest/components/BbHoverCardPortal.json +2 -2
  111. package/dist/ai/manifest/components/BbNumberInput.json +6 -1
  112. package/dist/ai/manifest/components/BbNumberInput.tree.json +2 -1
  113. package/dist/ai/manifest/components/BbPopover.json +2 -1
  114. package/dist/ai/manifest/components/BbPopoverPortal.json +2 -2
  115. package/dist/ai/manifest/components/BbProgress.json +6 -6
  116. package/dist/ai/manifest/components/BbProgress.tree.json +1 -0
  117. package/dist/ai/manifest/components/BbRadioGroup.json +2 -2
  118. package/dist/ai/manifest/components/BbSelect.json +2 -2
  119. package/dist/ai/manifest/components/BbSelect.tree.json +2 -2
  120. package/dist/ai/manifest/components/BbSelectPopover.json +2 -2
  121. package/dist/ai/manifest/components/BbSelectPopover.tree.json +1 -1
  122. package/dist/ai/manifest/components/BbSwitchGroup.json +2 -2
  123. package/dist/ai/manifest/components/BbTabs.json +8 -7
  124. package/dist/ai/manifest/components/BbTabsList.json +3 -3
  125. package/dist/ai/manifest/components/BbTabsPanels.json +1 -1
  126. package/dist/ai/manifest/components/BbTabsRoot.json +6 -5
  127. package/dist/ai/manifest/components/BbTag.tree.json +1 -1
  128. package/dist/ai/manifest/components/BbTooltip.json +2 -2
  129. package/dist/ai/manifest/components/ChipsBox.tree.json +1 -1
  130. package/dist/ai/manifest/components/CommonPopover.json +1 -1
  131. package/dist/ai/manifest/index.json +2 -2
  132. package/dist/ai/manifest/meta.json +5 -0
  133. package/dist/ai/manifest/types.advanced.json +10 -9
  134. package/dist/ai/manifest/types.api.json +8 -5
  135. package/dist/ai/manifest/types.wrapper.json +1 -0
  136. package/dist/ai/recipes/inertia/approvals-inbox.md +16 -18
  137. package/dist/ai/recipes/inertia/inline-edit-workspace.md +23 -33
  138. package/dist/ai/recipes/inertia/layout-scaffold.md +16 -16
  139. package/dist/ai/recipes/inertia/onboarding.md +6 -10
  140. package/dist/ai/recipes/inertia/ownership-atlas.md +15 -18
  141. package/dist/ai/recipes/inertia/record-form.md +11 -11
  142. package/dist/ai/recipes/inertia/records-workspace.md +38 -41
  143. package/dist/ai/recipes/inertia/settings-workspace.md +26 -38
  144. package/dist/ai/recipes/inertia/upload-center.md +31 -39
  145. package/dist/ai/recipes/inertia/wizard-form.md +10 -19
  146. package/dist/ai/recipes/nuxt/approvals-inbox.md +7 -8
  147. package/dist/ai/recipes/nuxt/inline-edit-workspace.md +14 -24
  148. package/dist/ai/recipes/nuxt/layout-scaffold.md +16 -16
  149. package/dist/ai/recipes/nuxt/onboarding.md +2 -6
  150. package/dist/ai/recipes/nuxt/ownership-atlas.md +7 -9
  151. package/dist/ai/recipes/nuxt/record-form.md +5 -5
  152. package/dist/ai/recipes/nuxt/records-workspace.md +29 -31
  153. package/dist/ai/recipes/nuxt/settings-workspace.md +22 -34
  154. package/dist/ai/recipes/nuxt/upload-center.md +22 -29
  155. package/dist/ai/recipes/nuxt/wizard-form.md +3 -11
  156. package/dist/ai/recipes/vue/approvals-inbox.md +7 -8
  157. package/dist/ai/recipes/vue/inline-edit-workspace.md +14 -24
  158. package/dist/ai/recipes/vue/layout-scaffold.md +16 -16
  159. package/dist/ai/recipes/vue/onboarding.md +2 -6
  160. package/dist/ai/recipes/vue/ownership-atlas.md +7 -9
  161. package/dist/ai/recipes/vue/record-form.md +5 -5
  162. package/dist/ai/recipes/vue/records-workspace.md +29 -31
  163. package/dist/ai/recipes/vue/settings-workspace.md +22 -34
  164. package/dist/ai/recipes/vue/upload-center.md +22 -29
  165. package/dist/ai/recipes/vue/wizard-form.md +3 -11
  166. package/dist/ai/source/BbAccordion.md +1 -1
  167. package/dist/ai/source/BbAlert.md +3 -3
  168. package/dist/ai/source/BbBadge.md +14 -10
  169. package/dist/ai/source/BbBadgeButton.md +17 -12
  170. package/dist/ai/source/BbBaseButton.md +1 -1
  171. package/dist/ai/source/BbBaseRadioIcon.md +1 -0
  172. package/dist/ai/source/BbBaseSwitchIcon.md +1 -0
  173. package/dist/ai/source/BbBreadcrumbs.md +63 -42
  174. package/dist/ai/source/BbButton.md +84 -38
  175. package/dist/ai/source/BbCalendar.md +17 -16
  176. package/dist/ai/source/BbCheckbox.md +3 -2
  177. package/dist/ai/source/BbCheckboxGroup.md +11 -4
  178. package/dist/ai/source/BbCollapsible.md +2 -1
  179. package/dist/ai/source/BbColorInput.md +10 -9
  180. package/dist/ai/source/BbColorPalette.md +2 -1
  181. package/dist/ai/source/BbConfirm.md +18 -1
  182. package/dist/ai/source/BbConfirmPortal.md +20 -6
  183. package/dist/ai/source/BbDatePicker.md +2 -2
  184. package/dist/ai/source/BbDatePickerInput.md +47 -20
  185. package/dist/ai/source/BbDialog.md +5 -5
  186. package/dist/ai/source/BbDropdown.md +231 -158
  187. package/dist/ai/source/BbDropdownButton.md +19 -12
  188. package/dist/ai/source/BbDropdownGroup.md +127 -93
  189. package/dist/ai/source/BbForm.md +25 -1
  190. package/dist/ai/source/BbHoverCard.md +30 -3
  191. package/dist/ai/source/BbHoverCardPortal.md +18 -3
  192. package/dist/ai/source/BbIndicator.md +4 -0
  193. package/dist/ai/source/BbNumberInput.md +855 -19
  194. package/dist/ai/source/BbOffCanvas.md +27 -11
  195. package/dist/ai/source/BbPagination.md +3 -3
  196. package/dist/ai/source/BbPopover.md +185 -12
  197. package/dist/ai/source/BbPopoverPortal.md +30 -3
  198. package/dist/ai/source/BbProgress.md +82 -18
  199. package/dist/ai/source/BbRadioGroup.md +12 -5
  200. package/dist/ai/source/BbRating.md +11 -9
  201. package/dist/ai/source/BbSelect.md +16 -10
  202. package/dist/ai/source/BbSelectPopover.md +29 -23
  203. package/dist/ai/source/BbSlider.md +12 -6
  204. package/dist/ai/source/BbSwitch.md +3 -2
  205. package/dist/ai/source/BbSwitchGroup.md +5 -2
  206. package/dist/ai/source/BbTable.md +102 -18
  207. package/dist/ai/source/BbTabs.md +30 -24
  208. package/dist/ai/source/BbTabsList.md +29 -23
  209. package/dist/ai/source/BbTabsPanels.md +29 -23
  210. package/dist/ai/source/BbTabsRoot.md +28 -22
  211. package/dist/ai/source/BbTag.md +10 -9
  212. package/dist/ai/source/BbTextInput.md +5 -4
  213. package/dist/ai/source/BbTextarea.md +6 -5
  214. package/dist/ai/source/BbTimePicker.md +1 -1
  215. package/dist/ai/source/BbTimePickerInput.md +46 -9
  216. package/dist/ai/source/BbToast.md +10 -7
  217. package/dist/ai/source/BbToastPortal.md +10 -7
  218. package/dist/ai/source/BbTooltip.md +88 -11
  219. package/dist/ai/source/BbTree.md +21 -3
  220. package/dist/ai/source/CommonField.md +6 -4
  221. package/dist/ai/source/CommonFieldInput.md +15 -10
  222. package/dist/ai/source/CommonPopover.md +8 -1
  223. package/dist/ai/source/CommonTimeSelector.md +5 -4
  224. package/dist/components/BbBadge/BbBadgeButton.vue_vue_type_script_setup_true_lang.js +10 -8
  225. package/dist/components/BbBaseButton/BbBaseButton.vue_vue_type_script_setup_true_lang.js +8 -8
  226. package/dist/components/BbBreadcrumbs/BbBreadcrumbs.vue_vue_type_script_setup_true_lang.js +45 -45
  227. package/dist/components/BbBreadcrumbs/types.d.ts +25 -17
  228. package/dist/components/BbButton/BbButton.vue_vue_type_script_setup_true_lang.js +88 -70
  229. package/dist/components/BbButton/toggleRoving.d.ts +6 -0
  230. package/dist/components/BbButton/toggleRoving.js +45 -0
  231. package/dist/components/BbButton/types.d.ts +12 -4
  232. package/dist/components/BbButton/types.js +5 -1
  233. package/dist/components/BbCalendar/BbCalendar.vue_vue_type_script_setup_true_lang.js +178 -178
  234. package/dist/components/BbCalendar/CalendarMonthPanel.vue_vue_type_script_setup_true_lang.js +15 -15
  235. package/dist/components/BbCalendar/CalendarYearPanel.vue_vue_type_script_setup_true_lang.js +28 -28
  236. package/dist/components/BbCalendar/useCalendarGrid.js +141 -139
  237. package/dist/components/BbCalendar/useDayjsLocale.d.ts +38 -15
  238. package/dist/components/BbCalendar/useDayjsLocale.js +31 -30
  239. package/dist/components/BbCheckbox/BbCheckbox.vue_vue_type_script_setup_true_lang.js +48 -48
  240. package/dist/components/BbCheckboxGroup/BbCheckboxGroup.vue_vue_type_script_setup_true_lang.js +81 -80
  241. package/dist/components/BbCheckboxGroup/types.d.ts +6 -2
  242. package/dist/components/BbCollapsible/types.d.ts +2 -1
  243. package/dist/components/BbColorInput/BbColorInput.vue_vue_type_script_setup_true_lang.js +69 -69
  244. package/dist/components/BbColorPalette/types.d.ts +2 -1
  245. package/dist/components/BbConfirm/BbConfirmPortal.vue.d.ts +2 -5
  246. package/dist/components/BbConfirm/types.d.ts +15 -0
  247. package/dist/components/BbDatePickerInput/BbDatePickerInput.vue_vue_type_script_setup_true_lang.js +363 -349
  248. package/dist/components/BbDropdown/AdaptiveDropdown.vue_vue_type_script_setup_true_lang.js +91 -86
  249. package/dist/components/BbDropdown/BbDropdown.vue_vue_type_script_setup_true_lang.js +298 -289
  250. package/dist/components/BbDropdown/BbDropdownList.vue_vue_type_script_setup_true_lang.js +322 -356
  251. package/dist/components/BbDropdown/DropdownPipelineResolver.vue_vue_type_script_setup_true_lang.js +17 -15
  252. package/dist/components/BbDropdown/DropdownRow.vue.d.ts +40 -0
  253. package/dist/components/BbDropdown/DropdownRow.vue.js +5 -0
  254. package/dist/components/BbDropdown/DropdownRow.vue_vue_type_script_setup_true_lang.js +60 -0
  255. package/dist/components/BbDropdown/normalizeGroups.d.ts +8 -2
  256. package/dist/components/BbDropdown/normalizeGroups.js +60 -46
  257. package/dist/components/BbDropdown/types.d.ts +120 -88
  258. package/dist/components/BbDropdownButton/BbDropdownButton.vue_vue_type_script_setup_true_lang.js +11 -2
  259. package/dist/components/BbDropdownButton/types.d.ts +2 -2
  260. package/dist/components/BbForm/BbForm.vue.d.ts +9 -0
  261. package/dist/components/BbForm/BbForm.vue_vue_type_script_setup_true_lang.js +114 -105
  262. package/dist/components/BbForm/BbFormCustomField.js +1 -1
  263. package/dist/components/BbForm/bindFormField.js +2 -1
  264. package/dist/components/BbForm/formFields.d.ts +5 -0
  265. package/dist/components/BbHoverCard/BbHoverCard.vue_vue_type_script_setup_true_lang.js +145 -142
  266. package/dist/components/BbHoverCard/BbHoverCardPortal.vue.d.ts +2 -2
  267. package/dist/components/BbHoverCard/types.d.ts +14 -1
  268. package/dist/components/BbNumberInput/BbNumberInput.vue.d.ts +0 -1
  269. package/dist/components/BbNumberInput/BbNumberInput.vue_vue_type_script_setup_true_lang.js +452 -125
  270. package/dist/components/BbNumberInput/numberDisplay.d.ts +256 -0
  271. package/dist/components/BbNumberInput/numberDisplay.js +499 -0
  272. package/dist/components/BbNumberInput/types.d.ts +54 -1
  273. package/dist/components/BbNumberInput/warroom/corpus.d.ts +58 -0
  274. package/dist/components/BbNumberInput/warroom/currency-verify.rows.d.ts +28 -0
  275. package/dist/components/BbNumberInput/warroom/currency.rows.d.ts +2 -0
  276. package/dist/components/BbNumberInput/warroom/harness.d.ts +217 -0
  277. package/dist/components/BbNumberInput/warroom/oracle.d.ts +150 -0
  278. package/dist/components/BbPagination/BbPagination.vue_vue_type_script_setup_true_lang.js +7 -7
  279. package/dist/components/BbPopover/BbPopover.vue.d.ts +1 -0
  280. package/dist/components/BbPopover/BbPopover.vue_vue_type_script_setup_true_lang.js +207 -162
  281. package/dist/components/BbPopover/BbPopoverPortal.vue.d.ts +2 -2
  282. package/dist/components/BbPopover/types.d.ts +26 -1
  283. package/dist/components/BbProgress/BbProgress.vue_vue_type_script_setup_true_lang.js +15 -7
  284. package/dist/components/BbProgress/types.d.ts +23 -7
  285. package/dist/components/BbProgress/types.js +1 -1
  286. package/dist/components/BbRadioGroup/BbRadioGroup.vue_vue_type_script_setup_true_lang.js +102 -101
  287. package/dist/components/BbRadioGroup/types.d.ts +6 -2
  288. package/dist/components/BbRating/BbRating.vue_vue_type_script_setup_true_lang.js +63 -63
  289. package/dist/components/BbSelect/BbSelect.vue_vue_type_script_setup_true_lang.js +156 -154
  290. package/dist/components/BbSelect/types.d.ts +6 -2
  291. package/dist/components/BbSelectPopover/BbSelectPopover.vue_vue_type_script_setup_true_lang.js +2 -1
  292. package/dist/components/BbSelectPopover/types.d.ts +6 -2
  293. package/dist/components/BbSlider/BbSlider.vue_vue_type_script_setup_true_lang.js +153 -153
  294. package/dist/components/BbSwitch/BbSwitch.vue_vue_type_script_setup_true_lang.js +62 -62
  295. package/dist/components/BbSwitchGroup/BbSwitchGroup.vue_vue_type_script_setup_true_lang.js +131 -130
  296. package/dist/components/BbTable/BbTable.vue_vue_type_script_setup_true_lang.js +711 -676
  297. package/dist/components/BbTabs/BbTabs.vue_vue_type_script_setup_true_lang.js +1 -1
  298. package/dist/components/BbTabs/BbTabsList.vue_vue_type_script_setup_true_lang.js +1 -1
  299. package/dist/components/BbTabs/types.d.ts +28 -22
  300. package/dist/components/BbTag/BbTag.vue_vue_type_script_setup_true_lang.js +76 -76
  301. package/dist/components/BbTextInput/BbTextInput.vue_vue_type_script_setup_true_lang.js +58 -58
  302. package/dist/components/BbTextarea/BbTextarea.vue_vue_type_script_setup_true_lang.js +82 -82
  303. package/dist/components/BbTimePickerInput/BbTimePickerInput.vue_vue_type_script_setup_true_lang.js +246 -236
  304. package/dist/components/BbTooltip/BbTooltip.vue_vue_type_script_setup_true_lang.js +99 -86
  305. package/dist/components/BbTooltip/tooltipWarmup.d.ts +23 -0
  306. package/dist/components/BbTooltip/tooltipWarmup.js +7 -0
  307. package/dist/components/BbTooltip/types.d.ts +10 -3
  308. package/dist/components/BbTree/BbTree.vue_vue_type_script_setup_true_lang.js +29 -21
  309. package/dist/components/BbTree/BbTreeLevel.vue_vue_type_script_setup_true_lang.js +10 -7
  310. package/dist/components/CommonFieldInput/CommonFieldInput.vue_vue_type_script_setup_true_lang.js +37 -36
  311. package/dist/components/CommonPopover/types.d.ts +2 -1
  312. package/dist/components/CommonTimeSelector/CommonTimeSelector.vue_vue_type_script_setup_true_lang.js +9 -9
  313. package/dist/composables/formSubmitLock.d.ts +6 -0
  314. package/dist/composables/formSubmitLock.js +4 -0
  315. package/dist/composables/useBaseOptions.d.ts +7 -1
  316. package/dist/composables/useBaseOptions.js +32 -32
  317. package/dist/composables/useBbDropdownContext.d.ts +8 -8
  318. package/dist/composables/useBbFormField.d.ts +9 -0
  319. package/dist/composables/useBbFormField.js +5 -3
  320. package/dist/composables/useBbTabsContext.d.ts +10 -10
  321. package/dist/composables/useBbTabsContext.js +18 -18
  322. package/dist/composables/useFormBinding.d.ts +11 -0
  323. package/dist/composables/useFormBinding.js +15 -13
  324. package/dist/composables/useItemText.d.ts +5 -1
  325. package/dist/composables/useItemText.js +8 -3
  326. package/dist/composables/useItemValue.d.ts +5 -1
  327. package/dist/composables/useItemValue.js +8 -3
  328. package/dist/composables/useLocale.js +10 -9
  329. package/dist/deprecation/ai-deprecations.json.d.ts +130 -0
  330. package/dist/deprecation/ai-deprecations.json.js +1 -1
  331. package/dist/deprecation/removedProps.js +1 -1
  332. package/dist/directives/bbDropdown.js +1 -1
  333. package/dist/directives/directivePortal.d.ts +13 -7
  334. package/dist/directives/directivePortal.js +1 -4
  335. package/dist/i18n/index.d.ts +7 -12
  336. package/dist/i18n/locales/cs.json +11 -14
  337. package/dist/i18n/locales/da.json +13 -16
  338. package/dist/i18n/locales/de-CH.json +137 -0
  339. package/dist/i18n/locales/de.json +14 -17
  340. package/dist/i18n/locales/el.json +10 -13
  341. package/dist/i18n/locales/en-GB.json +137 -0
  342. package/dist/i18n/locales/en.json +8 -11
  343. package/dist/i18n/locales/es-MX.json +137 -0
  344. package/dist/i18n/locales/es.json +16 -19
  345. package/dist/i18n/locales/fi.json +8 -11
  346. package/dist/i18n/locales/fr.json +23 -26
  347. package/dist/i18n/locales/hu.json +8 -11
  348. package/dist/i18n/locales/it.json +12 -15
  349. package/dist/i18n/locales/ja.json +13 -16
  350. package/dist/i18n/locales/ko.json +10 -13
  351. package/dist/i18n/locales/nb.json +13 -16
  352. package/dist/i18n/locales/nl.json +21 -24
  353. package/dist/i18n/locales/pl.json +10 -13
  354. package/dist/i18n/locales/{pt.json → pt-BR.json} +19 -22
  355. package/dist/i18n/locales/pt-PT.json +137 -0
  356. package/dist/i18n/locales/ro.json +22 -25
  357. package/dist/i18n/locales/ru.json +11 -14
  358. package/dist/i18n/locales/sv.json +16 -19
  359. package/dist/i18n/locales/tr.json +14 -17
  360. package/dist/i18n/locales/uk.json +11 -14
  361. package/dist/i18n/locales/{zh-cn.json → zh-CN.json} +10 -13
  362. package/dist/i18n/locales/zh-HK.json +137 -0
  363. package/dist/i18n/locales/zh-TW.json +137 -0
  364. package/dist/i18n/regionHints.d.ts +16 -0
  365. package/dist/i18n/regionHints.js +49 -0
  366. package/dist/i18n/regions.d.ts +286 -0
  367. package/dist/i18n/regions.js +265 -0
  368. package/dist/index.d.ts +4 -4
  369. package/dist/index.js +4 -4
  370. package/dist/llms-full.txt +1914 -1714
  371. package/dist/llms-medium.txt +76 -46
  372. package/dist/llms.txt +7 -7
  373. package/dist/locale-blueprint.json +16 -13
  374. package/dist/styles.css +2 -2
  375. package/dist/types/passthrough.d.ts +1 -1
  376. package/dist/types/ptComponentMap.d.ts +2 -2
  377. package/dist/utilities/functions/slotKey.d.ts +2 -2
  378. package/dist/utils/versionCheck.js +1 -1
  379. package/dist/vite-plugin.d.ts +22 -19
  380. package/dist/vite.js +309 -297
  381. package/llms.txt +7 -7
  382. package/package.json +5 -3
  383. package/scripts/lib/agent-manifest.mjs +2 -1
  384. package/scripts/lib/eslint-disable.mjs +17 -4
  385. package/scripts/lib/eslint-plugin.d.ts +9 -1
  386. package/scripts/lib/eslint-plugin.mjs +256 -6
  387. package/scripts/lib/helper-canon.mjs +176 -0
  388. package/scripts/lib/helpers-add.mjs +1303 -0
  389. package/scripts/lib/local-components.mjs +33 -4
  390. package/scripts/lib/locale-check.mjs +165 -0
  391. package/scripts/lib/portal-names.mjs +458 -0
  392. package/scripts/lib/redundant-item-accessor.mjs +398 -0
  393. package/scripts/lib/renamed-item-field.mjs +343 -0
  394. package/scripts/lib/slot-key.mjs +2 -2
  395. package/scripts/lib/slot-renames.mjs +1 -1
  396. package/scripts/lib/unimported-components.mjs +5 -2
  397. package/scripts/lib/validate-bb-markup.mjs +123 -56
  398. package/dist/i18n/index.js +0 -27
@@ -587,36 +587,36 @@ const warehouseId = ref('denver');
587
587
 
588
588
  const accountMenuItems: BbDropdownItem[] = [
589
589
  {
590
- key: 'theme',
591
- text: 'Theme',
590
+ value: 'theme',
591
+ label: 'Theme',
592
592
  'prepend:icon': 'lucide:sun-moon',
593
593
  // A submenu opener (`items`) whose own `items` is one selectable
594
594
  // group — `selectable: true` gives single-choice radio semantics and a
595
595
  // check on the picked row, with no bordered field anywhere.
596
596
  items: [
597
597
  {
598
- key: 'theme-opts',
598
+ id: 'theme-opts',
599
599
  selectable: true,
600
600
  items: [
601
- { key: 'system', text: 'System' },
602
- { key: 'light', text: 'Light' },
603
- { key: 'dark', text: 'Dark' },
601
+ { value: 'system', label: 'System' },
602
+ { value: 'light', label: 'Light' },
603
+ { value: 'dark', label: 'Dark' },
604
604
  ],
605
605
  },
606
606
  ],
607
607
  },
608
608
  {
609
- key: 'warehouse',
610
- text: 'Warehouse',
609
+ value: 'warehouse',
610
+ label: 'Warehouse',
611
611
  'prepend:icon': 'lucide:warehouse',
612
612
  items: [
613
613
  {
614
- key: 'warehouse-opts',
614
+ id: 'warehouse-opts',
615
615
  selectable: true,
616
616
  items: [
617
- { key: 'denver', text: 'Denver DC' },
618
- { key: 'reno', text: 'Reno DC' },
619
- { key: 'columbus', text: 'Columbus DC' },
617
+ { value: 'denver', label: 'Denver DC' },
618
+ { value: 'reno', label: 'Reno DC' },
619
+ { value: 'columbus', label: 'Columbus DC' },
620
620
  ],
621
621
  },
622
622
  ],
@@ -624,14 +624,14 @@ const accountMenuItems: BbDropdownItem[] = [
624
624
  // A trailing separator section (a nested array) for plain navigation rows.
625
625
  [
626
626
  {
627
- key: 'settings',
628
- text: 'Settings',
627
+ value: 'settings',
628
+ label: 'Settings',
629
629
  'prepend:icon': 'lucide:settings',
630
630
  href: '/settings',
631
631
  },
632
632
  {
633
- key: 'signout',
634
- text: 'Sign out',
633
+ value: 'signout',
634
+ label: 'Sign out',
635
635
  'prepend:icon': 'lucide:log-out',
636
636
  href: '/logout',
637
637
  method: 'post',
@@ -627,8 +627,8 @@ export function useOnboardingWorkspace(): OnboardingWorkspaceContext {
627
627
  <BbBreadcrumbs
628
628
  class="min-w-0 flex-auto"
629
629
  :items="[
630
- { key: 'dashboard', text: 'Dashboard', to: '/dashboard' },
631
- { key: 'getting-started', text: 'Getting started' },
630
+ { value: 'dashboard', label: 'Dashboard', to: '/dashboard' },
631
+ { value: 'getting-started', label: 'Getting started' },
632
632
  ]"
633
633
  />
634
634
  <BbButton
@@ -993,8 +993,6 @@ const ctx = useOnboardingWorkspace();
993
993
  v-model="role"
994
994
  class="w-44"
995
995
  compact
996
- item-text="label"
997
- item-value="value"
998
996
  :items="roles"
999
997
  label="Role"
1000
998
  label-mode="outside"
@@ -1337,8 +1335,6 @@ import { BbButton } from 'bitboss-ui';
1337
1335
  v-if="ctx.reminders.enabled"
1338
1336
  class="max-w-72"
1339
1337
  compact
1340
- item-text="label"
1341
- item-value="value"
1342
1338
  :items="cadences"
1343
1339
  label="Reminder schedule"
1344
1340
  label-mode="outside"
@@ -495,9 +495,9 @@ export function useOwnershipAtlas(): OwnershipAtlasContext {
495
495
  <BbBreadcrumbs
496
496
  class="min-w-0 flex-auto"
497
497
  :items="[
498
- { key: 'admin', text: 'Admin', to: '/admin' },
499
- { key: 'access', text: 'Access', to: '/access' },
500
- { key: 'ownership', text: 'Ownership' },
498
+ { value: 'admin', label: 'Admin', to: '/admin' },
499
+ { value: 'access', label: 'Access', to: '/access' },
500
+ { value: 'ownership', label: 'Ownership' },
501
501
  ]"
502
502
  />
503
503
  <div class="flex shrink-0 items-center gap-2">
@@ -543,13 +543,13 @@ export function useOwnershipAtlas(): OwnershipAtlasContext {
543
543
  v-model="ctx.tab.value"
544
544
  compact
545
545
  :items="[
546
- { key: 'all', label: `All · ${ctx.tabCounts.value.all}` },
546
+ { value: 'all', label: `All · ${ctx.tabCounts.value.all}` },
547
547
  {
548
- key: 'americas',
548
+ value: 'americas',
549
549
  label: `Americas · ${ctx.tabCounts.value.americas}`,
550
550
  },
551
- { key: 'emea', label: `EMEA · ${ctx.tabCounts.value.emea}` },
552
- { key: 'apac', label: `APAC · ${ctx.tabCounts.value.apac}` },
551
+ { value: 'emea', label: `EMEA · ${ctx.tabCounts.value.emea}` },
552
+ { value: 'apac', label: `APAC · ${ctx.tabCounts.value.apac}` },
553
553
  ]"
554
554
  />
555
555
 
@@ -916,8 +916,6 @@ const monthLabel = (value: string) =>
916
916
  <BbSelectPopover
917
917
  v-model="ctx.filters.kinds"
918
918
  clearable
919
- item-text="label"
920
- item-value="value"
921
919
  :items="kindOptions"
922
920
  multiple
923
921
  >
@@ -779,12 +779,12 @@ const ctx = provideInvoiceForm();
779
779
 
780
780
  // A real trail, ≥ 2 linked levels; the current page carries no target.
781
781
  const trail = computed(() => [
782
- { key: 'dashboard', text: 'Dashboard', to: '/dashboard' },
783
- { key: 'billing', text: 'Billing', to: '/billing' },
784
- { key: 'invoices', text: 'Invoices', to: '/invoices' },
782
+ { value: 'dashboard', label: 'Dashboard', to: '/dashboard' },
783
+ { value: 'billing', label: 'Billing', to: '/billing' },
784
+ { value: 'invoices', label: 'Invoices', to: '/invoices' },
785
785
  {
786
- key: 'invoice',
787
- text:
786
+ value: 'invoice',
787
+ label:
788
788
  ctx.mode === 'edit'
789
789
  ? (ctx.invoiceNumber.value ?? 'Invoice')
790
790
  : 'New invoice',
@@ -567,9 +567,9 @@ export function useInvoicesWorkspace(): InvoicesWorkspaceContext {
567
567
  <BbBreadcrumbs
568
568
  class="min-w-0 flex-auto"
569
569
  :items="[
570
- { key: 'dashboard', text: 'Dashboard', to: '/dashboard' },
571
- { key: 'billing', text: 'Billing', to: '/billing' },
572
- { key: 'invoices', text: 'Invoices' },
570
+ { value: 'dashboard', label: 'Dashboard', to: '/dashboard' },
571
+ { value: 'billing', label: 'Billing', to: '/billing' },
572
+ { value: 'invoices', label: 'Invoices' },
573
573
  ]"
574
574
  />
575
575
  <div class="flex shrink-0 items-center gap-2">
@@ -604,22 +604,22 @@ export function useInvoicesWorkspace(): InvoicesWorkspaceContext {
604
604
  compact
605
605
  :items="[
606
606
  {
607
- key: 'all',
607
+ value: 'all',
608
608
  label: `All · ${ctx.tabCounts.value.all}`,
609
609
  href: '?tab=all',
610
610
  },
611
611
  {
612
- key: 'outstanding',
612
+ value: 'outstanding',
613
613
  label: `Outstanding · ${ctx.tabCounts.value.outstanding}`,
614
614
  href: '?tab=outstanding',
615
615
  },
616
616
  {
617
- key: 'paid',
617
+ value: 'paid',
618
618
  label: `Paid · ${ctx.tabCounts.value.paid}`,
619
619
  href: '?tab=paid',
620
620
  },
621
621
  {
622
- key: 'archived',
622
+ value: 'archived',
623
623
  label: `Archived · ${ctx.tabCounts.value.archived}`,
624
624
  href: '?tab=archived',
625
625
  },
@@ -938,16 +938,16 @@ const searchCustomers = async ({
938
938
  // Static enum facet: item text resolves synchronously, so its chip reads
939
939
  // `useBbDropdownContext` (in FilterChip.vue) with zero extra fetch.
940
940
  const statusGroup: BbDropdownItem = {
941
- key: 'status',
941
+ id: 'status',
942
942
  label: 'Status',
943
943
  hideLabel: true,
944
944
  selectable: true,
945
945
  multiple: true,
946
946
  items: [
947
- { key: 'draft', text: INVOICE_STATUS_LABEL.draft },
948
- { key: 'pending', text: INVOICE_STATUS_LABEL.pending },
949
- { key: 'paid', text: INVOICE_STATUS_LABEL.paid },
950
- { key: 'overdue', text: INVOICE_STATUS_LABEL.overdue },
947
+ { value: 'draft', label: INVOICE_STATUS_LABEL.draft },
948
+ { value: 'pending', label: INVOICE_STATUS_LABEL.pending },
949
+ { value: 'paid', label: INVOICE_STATUS_LABEL.paid },
950
+ { value: 'overdue', label: INVOICE_STATUS_LABEL.overdue },
951
951
  ],
952
952
  };
953
953
 
@@ -959,7 +959,7 @@ const statusGroup: BbDropdownItem = {
959
959
  // redeclaring `prefill: true` would fetch every seeded facet twice on page
960
960
  // load for nothing.
961
961
  const customerGroup: BbDropdownItem = {
962
- key: 'customer',
962
+ id: 'customer',
963
963
  label: 'Customer',
964
964
  hideLabel: true,
965
965
  selectable: true,
@@ -976,14 +976,14 @@ const customerGroup: BbDropdownItem = {
976
976
  // the category row already names the facet.
977
977
  const menu = computed<BbDropdownItem[]>(() => [
978
978
  {
979
- key: 'status-category',
980
- text: 'Status',
979
+ value: 'status-category',
980
+ label: 'Status',
981
981
  'prepend:icon': 'lucide:circle-dot',
982
982
  items: [statusGroup],
983
983
  },
984
984
  {
985
- key: 'customer-category',
986
- text: 'Customer',
985
+ value: 'customer-category',
986
+ label: 'Customer',
987
987
  'prepend:icon': 'lucide:building-2',
988
988
  items: [customerGroup],
989
989
  },
@@ -1033,7 +1033,7 @@ import {
1033
1033
  import type { BbDropdownItem } from 'bitboss-ui';
1034
1034
 
1035
1035
  const props = defineProps<{
1036
- /** Matches the group's `key` in the Filters menu, and its key in
1036
+ /** Matches the group's `id` in the Filters menu, and its entry in
1037
1037
  * `useBbDropdownContext('invoice-filters').groups`. */
1038
1038
  groupKey: string;
1039
1039
  /** Static fallback/prefix text — the group itself sets `hideLabel`. */
@@ -1070,7 +1070,7 @@ const chipText = computed(() => {
1070
1070
  dropdownFilters.groups.value[props.groupKey]?.selectedOptions ?? [];
1071
1071
  if (!options.length) return props.label;
1072
1072
  return `${props.label}: ${options
1073
- .map((option) => option.text ?? String(option.value))
1073
+ .map((option) => option.label ?? String(option.value))
1074
1074
  .join(', ')}`;
1075
1075
  });
1076
1076
 
@@ -1086,7 +1086,6 @@ const onClear = () =>
1086
1086
  <template>
1087
1087
  <BbSelectPopover
1088
1088
  item-text="text"
1089
- item-value="value"
1090
1089
  :items="INVOICE_STATUS_OPTIONS"
1091
1090
  :model-value="invoice.status"
1092
1091
  width="180"
@@ -1302,32 +1301,32 @@ const pillLabel = computed(() =>
1302
1301
  :boundary="boundary"
1303
1302
  :items="[
1304
1303
  {
1305
- key: 'edit',
1306
- text: 'Edit',
1304
+ value: 'edit',
1305
+ label: 'Edit',
1307
1306
  'prepend:icon': 'lucide:pencil',
1308
1307
  to: `/invoices/${invoice.id}/edit`,
1309
1308
  },
1310
1309
  {
1311
- key: 'duplicate',
1312
- text: 'Duplicate',
1310
+ value: 'duplicate',
1311
+ label: 'Duplicate',
1313
1312
  'prepend:icon': 'lucide:copy',
1314
1313
  onClick: () => ctx.duplicateInvoice(invoice),
1315
1314
  },
1316
1315
  {
1317
- key: 'payment',
1318
- text: 'Record payment',
1316
+ value: 'payment',
1317
+ label: 'Record payment',
1319
1318
  'prepend:icon': 'lucide:banknote',
1320
1319
  onClick: () => (ctx.dialogs.recordPayment.value = invoice),
1321
1320
  },
1322
1321
  {
1323
- key: 'archive',
1324
- text: 'Archive',
1322
+ value: 'archive',
1323
+ label: 'Archive',
1325
1324
  'prepend:icon': 'lucide:archive',
1326
1325
  onClick: () => ctx.archiveInvoice(invoice),
1327
1326
  },
1328
1327
  {
1329
- key: 'delete',
1330
- text: 'Delete',
1328
+ value: 'delete',
1329
+ label: 'Delete',
1331
1330
  'prepend:icon': 'lucide:trash-2',
1332
1331
  variant: 'destructive',
1333
1332
  onClick: () => ctx.deleteInvoice(invoice),
@@ -1732,7 +1731,6 @@ const currency = new Intl.NumberFormat('en-US', {
1732
1731
  <BbSelect
1733
1732
  v-model="draft.method"
1734
1733
  item-text="text"
1735
- item-value="value"
1736
1734
  :items="PAYMENT_METHOD_OPTIONS"
1737
1735
  label="Method"
1738
1736
  label-mode="outside"
@@ -77,7 +77,7 @@ per field, and never mix both inside one card.
77
77
  | ---------------- | ---------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------- |
78
78
  | What it is | Typed text, several fields that belong together | One discrete choice: a switch, a checkbox, a role, a file |
79
79
  | Commit | A **Save** button in the card footer, disabled until something changed | The change itself. No button anywhere |
80
- | While saving | The button spins (`isSubmitting`); the fields stay editable | The control goes `readonly` so a second flip cannot race the first |
80
+ | While saving | The button spins and the fields go read-only until the save settles (the form's save lock) | The control goes `readonly` so a second flip cannot race the first |
81
81
  | On success | A toast; the dirty state rebaselines to what was saved | A quiet toast (`Delivery channels saved.`) |
82
82
  | On failure | Server messages land on their fields (`field-errors`); focus moves to the first one; nothing is lost | The control **snaps back** and the toast says why (`Slack needs reconnecting…`) |
83
83
  | Leaving | Unsaved work raises a dot on the section tab, and leaving asks first | Nothing can be unsaved, so nothing asks |
@@ -880,9 +880,9 @@ export function useSettingsWorkspace(): SettingsWorkspaceContext {
880
880
  <BbBreadcrumbs
881
881
  class="min-w-0"
882
882
  :items="[
883
- { key: 'workspace', text: 'Fennel & Hart', to: '/' },
884
- { key: 'settings', text: 'Settings', to: '/settings' },
885
- { key: 'section', text: currentLabel },
883
+ { value: 'workspace', label: 'Fennel & Hart', to: '/' },
884
+ { value: 'settings', label: 'Settings', to: '/settings' },
885
+ { value: 'section', label: currentLabel },
886
886
  ]"
887
887
  style="--flex-grow: 1"
888
888
  />
@@ -922,7 +922,7 @@ export function useSettingsWorkspace(): SettingsWorkspaceContext {
922
922
  replace
923
923
  variant="none"
924
924
  >
925
- <template #label="{ value, text }">
925
+ <template #label="{ value, label }">
926
926
  <!-- In the side column every label is one width, so the counts line
927
927
  up on the right edge. -->
928
928
  <span
@@ -930,7 +930,7 @@ export function useSettingsWorkspace(): SettingsWorkspaceContext {
930
930
  :class="{ 'min-w-[11.5rem]': !isMobile }"
931
931
  >
932
932
  <BbIcon aria-hidden="true" :icon="SECTION_ICONS[value]" size="16" />
933
- <span>{{ text }}</span>
933
+ <span>{{ label }}</span>
934
934
  <!-- Unsaved marker: a dot, not a word, so the label does not jump. -->
935
935
  <span
936
936
  v-if="value === 'profile' && ctx.profileDirty.value"
@@ -991,12 +991,12 @@ const { isMobile } = useMobile();
991
991
 
992
992
  // `eager` on Profile: a half-edited draft must survive a look at Billing.
993
993
  const sections: Array<BbTabsItem<SettingsSection>> = [
994
- { key: 'profile', label: 'Profile', eager: true },
995
- { key: 'notifications', label: 'Notifications' },
996
- { key: 'members', label: 'Members' },
997
- { key: 'billing', label: 'Billing' },
998
- { key: 'api-keys', label: 'API keys' },
999
- { key: 'danger-zone', label: 'Danger zone' },
994
+ { value: 'profile', label: 'Profile', eager: true },
995
+ { value: 'notifications', label: 'Notifications' },
996
+ { value: 'members', label: 'Members' },
997
+ { value: 'billing', label: 'Billing' },
998
+ { value: 'api-keys', label: 'API keys' },
999
+ { value: 'danger-zone', label: 'Danger zone' },
1000
1000
  ];
1001
1001
 
1002
1002
  // Full literals: the production icon scanner only bundles names it can see.
@@ -1178,7 +1178,6 @@ The explicit-save section: Zod schema, 422s, dirty footer.
1178
1178
  not "differs from the values this form mounted with". -->
1179
1179
  <BbForm
1180
1180
  :id="PROFILE_FORM"
1181
- v-slot="{ isSubmitting }"
1182
1181
  :field-errors="ctx.serverErrors.profile.value"
1183
1182
  :model="ctx.profileDraft"
1184
1183
  :schema="profileSchema"
@@ -1208,8 +1207,6 @@ The explicit-save section: Zod schema, 422s, dirty footer.
1208
1207
  />
1209
1208
  <BbSelect
1210
1209
  description="Due dates and reminders follow this zone."
1211
- item-text="label"
1212
- item-value="value"
1213
1210
  :items="TIMEZONES"
1214
1211
  label="Time zone"
1215
1212
  name="timezone"
@@ -1243,7 +1240,6 @@ The explicit-save section: Zod schema, 422s, dirty footer.
1243
1240
  it says why, so the state is never a mystery. -->
1244
1241
  <BbButton
1245
1242
  :disabled="!ctx.profileDirty.value"
1246
- :loading="isSubmitting"
1247
1243
  type="submit"
1248
1244
  variant="primary"
1249
1245
  >
@@ -1887,8 +1883,6 @@ One-click role picker (BbSelectPopover).
1887
1883
  <BbSelectPopover
1888
1884
  v-else
1889
1885
  :item-props="{ description: 'description' }"
1890
- item-text="label"
1891
- item-value="value"
1892
1886
  :items="ROLE_OPTIONS"
1893
1887
  :model-value="member.role"
1894
1888
  width="280"
@@ -1973,21 +1967,21 @@ const items = computed<BbDropdownItem[]>(() => {
1973
1967
  if (m.status === 'invited')
1974
1968
  return [
1975
1969
  {
1976
- key: 'resend',
1977
- text: 'Resend invitation',
1970
+ value: 'resend',
1971
+ label: 'Resend invitation',
1978
1972
  'prepend:icon': 'lucide:send',
1979
1973
  onClick: () => ctx.resendInvite(m),
1980
1974
  },
1981
1975
  {
1982
- key: 'copy',
1983
- text: 'Copy email',
1976
+ value: 'copy',
1977
+ label: 'Copy email',
1984
1978
  'prepend:icon': 'lucide:copy',
1985
1979
  onClick: () => ctx.copy(m.email, 'Email address'),
1986
1980
  },
1987
1981
  [
1988
1982
  {
1989
- key: 'revoke',
1990
- text: 'Revoke invitation',
1983
+ value: 'revoke',
1984
+ label: 'Revoke invitation',
1991
1985
  'prepend:icon': 'lucide:user-x',
1992
1986
  variant: 'destructive',
1993
1987
  onClick: () => ctx.removeMember(m),
@@ -1996,15 +1990,15 @@ const items = computed<BbDropdownItem[]>(() => {
1996
1990
  ];
1997
1991
  return [
1998
1992
  {
1999
- key: 'copy',
2000
- text: 'Copy email',
1993
+ value: 'copy',
1994
+ label: 'Copy email',
2001
1995
  'prepend:icon': 'lucide:copy',
2002
1996
  onClick: () => ctx.copy(m.email, 'Email address'),
2003
1997
  },
2004
1998
  [
2005
1999
  {
2006
- key: 'remove',
2007
- text: 'Remove from workspace',
2000
+ value: 'remove',
2001
+ label: 'Remove from workspace',
2008
2002
  'prepend:icon': 'lucide:user-minus',
2009
2003
  variant: 'destructive',
2010
2004
  onClick: () => ctx.removeMember(m),
@@ -2050,8 +2044,6 @@ Invite by email: BbTag + role radios, footer submits from outside.
2050
2044
  />
2051
2045
  <BbRadioGroup
2052
2046
  :item-props="{ description: 'description' }"
2053
- item-text="label"
2054
- item-value="value"
2055
2047
  :items="ROLE_OPTIONS"
2056
2048
  legend="Role"
2057
2049
  list-layout="vertical"
@@ -2516,8 +2508,6 @@ Create, then reveal once (persistent while shown).
2516
2508
  <BbTextInput label="Name" name="name" placeholder="Production server" />
2517
2509
  <BbRadioGroup
2518
2510
  :item-props="{ description: 'description' }"
2519
- item-text="label"
2520
- item-value="value"
2521
2511
  :items="SCOPES"
2522
2512
  legend="Access"
2523
2513
  list-layout="vertical"
@@ -2525,8 +2515,6 @@ Create, then reveal once (persistent while shown).
2525
2515
  />
2526
2516
  <BbSelect
2527
2517
  description="Short-lived keys limit the damage of a leak."
2528
- item-text="label"
2529
- item-value="value"
2530
2518
  :items="EXPIRIES"
2531
2519
  label="Expires"
2532
2520
  name="expiresIn"
@@ -605,9 +605,9 @@ export function useUploadCenter(): UploadCenterContext {
605
605
  <BbBreadcrumbs
606
606
  class="min-w-0 flex-auto"
607
607
  :items="[
608
- { key: 'dashboard', text: 'Dashboard', to: '/dashboard' },
609
- { key: 'expenses', text: 'Expenses', to: '/expenses' },
610
- { key: 'receipts', text: 'Receipts' },
608
+ { value: 'dashboard', label: 'Dashboard', to: '/dashboard' },
609
+ { value: 'expenses', label: 'Expenses', to: '/expenses' },
610
+ { value: 'receipts', label: 'Receipts' },
611
611
  ]"
612
612
  />
613
613
  <div class="flex shrink-0 items-center gap-2">
@@ -649,17 +649,17 @@ export function useUploadCenter(): UploadCenterContext {
649
649
  compact
650
650
  :items="[
651
651
  {
652
- key: 'drafts',
652
+ value: 'drafts',
653
653
  label: `Drafts · ${ctx.tabCounts.value.drafts}`,
654
654
  href: '?tab=drafts',
655
655
  },
656
656
  {
657
- key: 'submitted',
657
+ value: 'submitted',
658
658
  label: `Submitted · ${ctx.tabCounts.value.submitted}`,
659
659
  href: '?tab=submitted',
660
660
  },
661
661
  {
662
- key: 'reimbursed',
662
+ value: 'reimbursed',
663
663
  label: `Reimbursed · ${ctx.tabCounts.value.reimbursed}`,
664
664
  href: '?tab=reimbursed',
665
665
  },
@@ -1309,6 +1309,7 @@ const categoryName = computed(
1309
1309
  label="Amount"
1310
1310
  :max-precision="2"
1311
1311
  :min="0"
1312
+ :min-precision="2"
1312
1313
  placeholder="0.00"
1313
1314
  variant="ghost"
1314
1315
  @change="commit"
@@ -1328,32 +1329,24 @@ const props = defineProps<{ receipt: Receipt }>();
1328
1329
 
1329
1330
  const ctx = useUploadCenter();
1330
1331
 
1331
- /** Money cells always show two decimals so the column optically aligns. */
1332
- const formatMoney = (value: number | null): string | null =>
1333
- value === null || Number.isNaN(value) ? null : value.toFixed(2);
1334
-
1335
- // Same commit/revert contract as the merchant cell, on the number model —
1336
- // commit on @change, not @blur + @keydown.enter (see MerchantCell.vue).
1337
- const draft = ref<number | string | null>(formatMoney(props.receipt.amount));
1332
+ // Money cells always show two decimals (`min-precision`), so the column
1333
+ // optically aligns. Same commit/revert contract as the merchant cell, on the
1334
+ // number model — commit on @change, not @blur + @keydown.enter (see
1335
+ // MerchantCell.vue).
1336
+ const draft = ref<number | null>(props.receipt.amount);
1338
1337
  watch(
1339
1338
  () => props.receipt.amount,
1340
1339
  (value) => {
1341
- draft.value = formatMoney(value);
1340
+ draft.value = value;
1342
1341
  }
1343
1342
  );
1344
1343
 
1345
1344
  const commit = () => {
1346
- const amount =
1347
- draft.value === null || draft.value === '' ? null : Number(draft.value);
1348
- if (amount === props.receipt.amount) {
1349
- draft.value = formatMoney(props.receipt.amount);
1350
- return;
1351
- }
1352
- void ctx.updateReceipt(props.receipt, { amount });
1353
- draft.value = formatMoney(amount);
1345
+ if (draft.value === props.receipt.amount) return;
1346
+ void ctx.updateReceipt(props.receipt, { amount: draft.value });
1354
1347
  };
1355
1348
  const revert = () => {
1356
- draft.value = formatMoney(props.receipt.amount);
1349
+ draft.value = props.receipt.amount;
1357
1350
  };
1358
1351
  </script>
1359
1352
  ```
@@ -1436,24 +1429,24 @@ const items = computed(() => {
1436
1429
  ...(isDraft
1437
1430
  ? [
1438
1431
  {
1439
- key: 'submit',
1440
- text: 'Submit for approval',
1432
+ value: 'submit',
1433
+ label: 'Submit for approval',
1441
1434
  'prepend:icon': 'lucide:send',
1442
1435
  onClick: () => ctx.submitReceipt(receipt),
1443
1436
  },
1444
1437
  ]
1445
1438
  : []),
1446
1439
  {
1447
- key: 'download',
1448
- text: 'Download original',
1440
+ value: 'download',
1441
+ label: 'Download original',
1449
1442
  'prepend:icon': 'lucide:download',
1450
1443
  href: `/receipts/${receipt.id}/file`,
1451
1444
  },
1452
1445
  ...(isDraft
1453
1446
  ? [
1454
1447
  {
1455
- key: 'remove',
1456
- text: 'Remove',
1448
+ value: 'remove',
1449
+ label: 'Remove',
1457
1450
  'prepend:icon': 'lucide:trash-2',
1458
1451
  variant: 'destructive' as const,
1459
1452
  onClick: () => ctx.deleteReceipt(receipt),
@@ -704,9 +704,9 @@ onMounted(() => {
704
704
  });
705
705
 
706
706
  const crumbs = computed(() => [
707
- { key: 'dashboard', text: 'Dashboard', to: '/dashboard' },
708
- { key: 'campaigns', text: 'Campaigns', to: '/campaigns' },
709
- { key: 'setup', text: ctx.campaign.value?.name ?? 'New campaign' },
707
+ { value: 'dashboard', label: 'Dashboard', to: '/dashboard' },
708
+ { value: 'campaigns', label: 'Campaigns', to: '/campaigns' },
709
+ { value: 'setup', label: ctx.campaign.value?.name ?? 'New campaign' },
710
710
  ]);
711
711
 
712
712
  // The summary shows only the CURRENT step's issues, and only once the user
@@ -850,8 +850,6 @@ const status = (key: StepKey) => ctx.stepStatus(key);
850
850
 
851
851
  <BbSelect
852
852
  v-model="ctx.draft.countries"
853
- item-text="label"
854
- item-value="value"
855
853
  :items="COUNTRIES"
856
854
  label="Limit to countries"
857
855
  label-mode="outside"
@@ -1015,8 +1013,6 @@ const errorsFor = (field: string) => ctx.fieldErrors('content', field);
1015
1013
 
1016
1014
  <BbRadioGroup
1017
1015
  v-model="ctx.draft.sendMode"
1018
- item-text="label"
1019
- item-value="value"
1020
1016
  :items="[
1021
1017
  {
1022
1018
  label: 'Send now — goes out as soon as you confirm on Review',
@@ -1046,8 +1042,6 @@ const errorsFor = (field: string) => ctx.fieldErrors('content', field);
1046
1042
  <BbSelect
1047
1043
  v-model="ctx.draft.timezone"
1048
1044
  :errors="errorsFor('timezone')"
1049
- item-text="label"
1050
- item-value="value"
1051
1045
  :items="TIMEZONES"
1052
1046
  label="Timezone"
1053
1047
  label-mode="outside"
@@ -1533,8 +1527,6 @@ the file is unchanged, plus `BbCalendar` in its import):
1533
1527
  <BbSelect
1534
1528
  v-model="ctx.draft.timezone"
1535
1529
  :errors="errorsFor('timezone')"
1536
- item-text="label"
1537
- item-value="value"
1538
1530
  :items="TIMEZONES"
1539
1531
  label="Timezone"
1540
1532
  label-mode="outside"
@@ -210,7 +210,7 @@ export type BbAccordionSlots = {
210
210
  text-transform: inherit;
211
211
  }
212
212
  .bb-accordion__header {
213
- text-align: left;
213
+ text-align: start;
214
214
  width: 100%;
215
215
 
216
216
  /*