bitboss-ui 3.0.0-beta.48 → 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 (356) hide show
  1. package/README.md +24 -7
  2. package/bin/bitboss-ui-mcp.mjs +15 -3
  3. package/bin/bitboss-ui.mjs +115 -13
  4. package/dist/ai/BbAvatar.md +1 -1
  5. package/dist/ai/BbBreadcrumbs.md +65 -65
  6. package/dist/ai/BbButton.md +16 -5
  7. package/dist/ai/BbCheckbox.md +0 -2
  8. package/dist/ai/BbCheckboxGroup.md +13 -20
  9. package/dist/ai/BbDatePickerInput.md +4 -2
  10. package/dist/ai/BbDialog.md +1 -8
  11. package/dist/ai/BbDropdown.md +231 -220
  12. package/dist/ai/BbDropdownButton.md +65 -65
  13. package/dist/ai/BbDropdownGroup.md +2 -2
  14. package/dist/ai/BbDropzone.md +10 -10
  15. package/dist/ai/BbForm.md +43 -52
  16. package/dist/ai/BbHoverCard.md +4 -2
  17. package/dist/ai/BbNumberInput.md +88 -21
  18. package/dist/ai/BbPopover.md +29 -23
  19. package/dist/ai/BbProgress.md +48 -22
  20. package/dist/ai/BbRadioGroup.md +13 -19
  21. package/dist/ai/BbSelect.md +16 -36
  22. package/dist/ai/BbSelectPopover.md +14 -30
  23. package/dist/ai/BbSmoothHeight.md +0 -2
  24. package/dist/ai/BbSwitchGroup.md +13 -20
  25. package/dist/ai/BbTable.md +11 -10
  26. package/dist/ai/BbTabs.md +106 -105
  27. package/dist/ai/BbTabsList.md +2 -2
  28. package/dist/ai/BbTabsPanels.md +1 -1
  29. package/dist/ai/BbTabsRoot.md +2 -2
  30. package/dist/ai/BbTooltip.md +24 -10
  31. package/dist/ai/BbTree.md +14 -11
  32. package/dist/ai/changelog.json +256 -5
  33. package/dist/ai/components.json +36 -34
  34. package/dist/ai/composables/useBbDropdownContext.md +16 -16
  35. package/dist/ai/composables/useBbFormField.md +5 -1
  36. package/dist/ai/composables/useBbTabsContext.md +14 -14
  37. package/dist/ai/guides/agent-contract.md +27 -27
  38. package/dist/ai/guides/ai-router.md +1 -1
  39. package/dist/ai/guides/component-picker.md +3 -3
  40. package/dist/ai/guides/fetch-items-playbook.md +1 -1
  41. package/dist/ai/guides/icons-policy.md +10 -10
  42. package/dist/ai/guides/inertia-helpers.md +120 -67
  43. package/dist/ai/guides/installation-and-plugin-setup.md +43 -15
  44. package/dist/ai/guides/migration/components/bb-breadcrumbs.md +3 -2
  45. package/dist/ai/guides/migration/components/bb-checkbox-group.md +16 -16
  46. package/dist/ai/guides/migration/components/bb-dropdown-button.md +9 -8
  47. package/dist/ai/guides/migration/components/bb-dropdown.md +15 -14
  48. package/dist/ai/guides/migration/components/bb-radio-group.md +2 -1
  49. package/dist/ai/guides/migration/components/bb-select-popover.md +6 -1
  50. package/dist/ai/guides/migration/components/bb-select.md +10 -2
  51. package/dist/ai/guides/migration/components/bb-switch-group.md +2 -1
  52. package/dist/ai/guides/migration/components/bb-tabs.md +9 -8
  53. package/dist/ai/guides/migration/components/bb-tooltip.md +1 -1
  54. package/dist/ai/guides/migration/v2-to-v3.md +114 -17
  55. package/dist/ai/guides/migration/v3-beta-tooling.md +11 -0
  56. package/dist/ai/guides/options-items-playbook.md +30 -24
  57. package/dist/ai/guides/passthrough.md +2 -2
  58. package/dist/ai/guides/preset-components.md +18 -3
  59. package/dist/ai/guides/typescript-generic-components.md +1 -1
  60. package/dist/ai/guides/validated-forms.md +11 -22
  61. package/dist/ai/guides/validation-providers.md +4 -3
  62. package/dist/ai/helpers/inertia/manifest.json +636 -0
  63. package/dist/ai/helpers/inertia/types.ts +15 -0
  64. package/dist/ai/helpers/inertia/useAsyncFn.ts +110 -0
  65. package/dist/ai/helpers/inertia/useConfirmOnRouteLeave.ts +102 -0
  66. package/dist/ai/helpers/inertia/useDeleteCmd.ts +30 -0
  67. package/dist/ai/helpers/inertia/useHasChanged.ts +36 -0
  68. package/dist/ai/helpers/inertia/useIndexById.ts +23 -0
  69. package/dist/ai/helpers/inertia/useLazyProp.ts +148 -0
  70. package/dist/ai/helpers/inertia/useLazyPropGetter.ts +50 -0
  71. package/dist/ai/helpers/inertia/useLoading.ts +20 -0
  72. package/dist/ai/helpers/inertia/usePaginatedResponseContext.ts +88 -0
  73. package/dist/ai/helpers/inertia/usePromiseForm.ts +62 -0
  74. package/dist/ai/helpers/inertia/useProp.ts +63 -0
  75. package/dist/ai/helpers/inertia/useQuery.ts +19 -0
  76. package/dist/ai/helpers/inertia/useQueryObject.ts +116 -0
  77. package/dist/ai/helpers/inertia/useResourceContext.ts +69 -0
  78. package/dist/ai/helpers/inertia/useRouteQuery.ts +54 -0
  79. package/dist/ai/helpers/inertia/useScreenSizes.ts +23 -0
  80. package/dist/ai/helpers/inertia/useTableContext.ts +34 -0
  81. package/dist/ai/helpers/inertia/useTableSelectionContext.ts +48 -0
  82. package/dist/ai/helpers/inertia/useUntil.ts +33 -0
  83. package/dist/ai/helpers/inertia/utils.ts +24 -0
  84. package/dist/ai/index.md +6 -6
  85. package/dist/ai/manifest/components/BbBreadcrumbs.json +10 -6
  86. package/dist/ai/manifest/components/BbBreadcrumbs.tree.json +1 -1
  87. package/dist/ai/manifest/components/BbButton.json +1 -1
  88. package/dist/ai/manifest/components/BbCheckboxGroup.json +2 -2
  89. package/dist/ai/manifest/components/BbDropdown.json +23 -20
  90. package/dist/ai/manifest/components/BbDropdown.tree.json +2 -2
  91. package/dist/ai/manifest/components/BbDropdownButton.json +22 -19
  92. package/dist/ai/manifest/components/BbDropdownButton.tree.json +1 -1
  93. package/dist/ai/manifest/components/BbDropdownGroup.json +2 -2
  94. package/dist/ai/manifest/components/BbForm.json +1 -0
  95. package/dist/ai/manifest/components/BbNumberInput.json +6 -1
  96. package/dist/ai/manifest/components/BbNumberInput.tree.json +2 -1
  97. package/dist/ai/manifest/components/BbPopover.json +1 -0
  98. package/dist/ai/manifest/components/BbProgress.json +6 -6
  99. package/dist/ai/manifest/components/BbProgress.tree.json +1 -0
  100. package/dist/ai/manifest/components/BbRadioGroup.json +2 -2
  101. package/dist/ai/manifest/components/BbSelect.json +2 -2
  102. package/dist/ai/manifest/components/BbSelectPopover.json +2 -2
  103. package/dist/ai/manifest/components/BbSwitchGroup.json +2 -2
  104. package/dist/ai/manifest/components/BbTabs.json +7 -6
  105. package/dist/ai/manifest/components/BbTabsList.json +3 -3
  106. package/dist/ai/manifest/components/BbTabsPanels.json +1 -1
  107. package/dist/ai/manifest/components/BbTabsRoot.json +5 -4
  108. package/dist/ai/manifest/components/BbTooltip.json +1 -1
  109. package/dist/ai/manifest/index.json +2 -2
  110. package/dist/ai/manifest/meta.json +2 -0
  111. package/dist/ai/manifest/types.advanced.json +10 -9
  112. package/dist/ai/manifest/types.api.json +5 -4
  113. package/dist/ai/recipes/inertia/approvals-inbox.md +16 -18
  114. package/dist/ai/recipes/inertia/inline-edit-workspace.md +23 -33
  115. package/dist/ai/recipes/inertia/layout-scaffold.md +16 -16
  116. package/dist/ai/recipes/inertia/onboarding.md +6 -10
  117. package/dist/ai/recipes/inertia/ownership-atlas.md +15 -18
  118. package/dist/ai/recipes/inertia/record-form.md +11 -11
  119. package/dist/ai/recipes/inertia/records-workspace.md +38 -41
  120. package/dist/ai/recipes/inertia/settings-workspace.md +26 -38
  121. package/dist/ai/recipes/inertia/upload-center.md +31 -39
  122. package/dist/ai/recipes/inertia/wizard-form.md +10 -19
  123. package/dist/ai/recipes/nuxt/approvals-inbox.md +7 -8
  124. package/dist/ai/recipes/nuxt/inline-edit-workspace.md +14 -24
  125. package/dist/ai/recipes/nuxt/layout-scaffold.md +16 -16
  126. package/dist/ai/recipes/nuxt/onboarding.md +2 -6
  127. package/dist/ai/recipes/nuxt/ownership-atlas.md +7 -9
  128. package/dist/ai/recipes/nuxt/record-form.md +5 -5
  129. package/dist/ai/recipes/nuxt/records-workspace.md +29 -31
  130. package/dist/ai/recipes/nuxt/settings-workspace.md +22 -34
  131. package/dist/ai/recipes/nuxt/upload-center.md +22 -29
  132. package/dist/ai/recipes/nuxt/wizard-form.md +3 -11
  133. package/dist/ai/recipes/vue/approvals-inbox.md +7 -8
  134. package/dist/ai/recipes/vue/inline-edit-workspace.md +14 -24
  135. package/dist/ai/recipes/vue/layout-scaffold.md +16 -16
  136. package/dist/ai/recipes/vue/onboarding.md +2 -6
  137. package/dist/ai/recipes/vue/ownership-atlas.md +7 -9
  138. package/dist/ai/recipes/vue/record-form.md +5 -5
  139. package/dist/ai/recipes/vue/records-workspace.md +29 -31
  140. package/dist/ai/recipes/vue/settings-workspace.md +22 -34
  141. package/dist/ai/recipes/vue/upload-center.md +22 -29
  142. package/dist/ai/recipes/vue/wizard-form.md +3 -11
  143. package/dist/ai/source/BbAccordion.md +1 -1
  144. package/dist/ai/source/BbAlert.md +3 -3
  145. package/dist/ai/source/BbBadge.md +2 -2
  146. package/dist/ai/source/BbBadgeButton.md +5 -4
  147. package/dist/ai/source/BbBaseButton.md +1 -1
  148. package/dist/ai/source/BbBaseRadioIcon.md +1 -0
  149. package/dist/ai/source/BbBaseSwitchIcon.md +1 -0
  150. package/dist/ai/source/BbBreadcrumbs.md +63 -42
  151. package/dist/ai/source/BbButton.md +71 -33
  152. package/dist/ai/source/BbCalendar.md +17 -16
  153. package/dist/ai/source/BbCheckbox.md +3 -2
  154. package/dist/ai/source/BbCheckboxGroup.md +11 -4
  155. package/dist/ai/source/BbColorInput.md +10 -9
  156. package/dist/ai/source/BbConfirm.md +1 -1
  157. package/dist/ai/source/BbConfirmPortal.md +1 -1
  158. package/dist/ai/source/BbDatePicker.md +2 -2
  159. package/dist/ai/source/BbDatePickerInput.md +47 -20
  160. package/dist/ai/source/BbDialog.md +5 -5
  161. package/dist/ai/source/BbDropdown.md +230 -158
  162. package/dist/ai/source/BbDropdownButton.md +19 -12
  163. package/dist/ai/source/BbDropdownGroup.md +126 -93
  164. package/dist/ai/source/BbForm.md +25 -1
  165. package/dist/ai/source/BbIndicator.md +4 -0
  166. package/dist/ai/source/BbNumberInput.md +855 -19
  167. package/dist/ai/source/BbOffCanvas.md +27 -11
  168. package/dist/ai/source/BbPagination.md +3 -3
  169. package/dist/ai/source/BbPopover.md +152 -8
  170. package/dist/ai/source/BbPopoverPortal.md +11 -0
  171. package/dist/ai/source/BbProgress.md +82 -18
  172. package/dist/ai/source/BbRadioGroup.md +12 -5
  173. package/dist/ai/source/BbRating.md +11 -9
  174. package/dist/ai/source/BbSelect.md +16 -10
  175. package/dist/ai/source/BbSelectPopover.md +29 -23
  176. package/dist/ai/source/BbSlider.md +12 -6
  177. package/dist/ai/source/BbSwitch.md +3 -2
  178. package/dist/ai/source/BbSwitchGroup.md +5 -2
  179. package/dist/ai/source/BbTable.md +102 -18
  180. package/dist/ai/source/BbTabs.md +27 -23
  181. package/dist/ai/source/BbTabsList.md +26 -22
  182. package/dist/ai/source/BbTabsPanels.md +26 -22
  183. package/dist/ai/source/BbTabsRoot.md +25 -21
  184. package/dist/ai/source/BbTag.md +10 -9
  185. package/dist/ai/source/BbTextInput.md +5 -4
  186. package/dist/ai/source/BbTextarea.md +6 -5
  187. package/dist/ai/source/BbTimePicker.md +1 -1
  188. package/dist/ai/source/BbTimePickerInput.md +46 -9
  189. package/dist/ai/source/BbToast.md +10 -7
  190. package/dist/ai/source/BbToastPortal.md +10 -7
  191. package/dist/ai/source/BbTooltip.md +54 -8
  192. package/dist/ai/source/BbTree.md +21 -3
  193. package/dist/ai/source/CommonField.md +6 -4
  194. package/dist/ai/source/CommonFieldInput.md +15 -10
  195. package/dist/ai/source/CommonPopover.md +6 -0
  196. package/dist/ai/source/CommonTimeSelector.md +5 -4
  197. package/dist/components/BbBadge/BbBadgeButton.vue_vue_type_script_setup_true_lang.js +10 -8
  198. package/dist/components/BbBaseButton/BbBaseButton.vue_vue_type_script_setup_true_lang.js +8 -8
  199. package/dist/components/BbBreadcrumbs/BbBreadcrumbs.vue_vue_type_script_setup_true_lang.js +45 -45
  200. package/dist/components/BbBreadcrumbs/types.d.ts +25 -17
  201. package/dist/components/BbButton/BbButton.vue_vue_type_script_setup_true_lang.js +84 -71
  202. package/dist/components/BbButton/toggleRoving.d.ts +6 -0
  203. package/dist/components/BbButton/toggleRoving.js +45 -0
  204. package/dist/components/BbButton/types.d.ts +4 -1
  205. package/dist/components/BbCalendar/BbCalendar.vue_vue_type_script_setup_true_lang.js +178 -178
  206. package/dist/components/BbCalendar/CalendarMonthPanel.vue_vue_type_script_setup_true_lang.js +15 -15
  207. package/dist/components/BbCalendar/CalendarYearPanel.vue_vue_type_script_setup_true_lang.js +28 -28
  208. package/dist/components/BbCalendar/useCalendarGrid.js +141 -139
  209. package/dist/components/BbCalendar/useDayjsLocale.d.ts +38 -15
  210. package/dist/components/BbCalendar/useDayjsLocale.js +31 -30
  211. package/dist/components/BbCheckbox/BbCheckbox.vue_vue_type_script_setup_true_lang.js +48 -48
  212. package/dist/components/BbCheckboxGroup/BbCheckboxGroup.vue_vue_type_script_setup_true_lang.js +81 -80
  213. package/dist/components/BbCheckboxGroup/types.d.ts +6 -2
  214. package/dist/components/BbColorInput/BbColorInput.vue_vue_type_script_setup_true_lang.js +69 -69
  215. package/dist/components/BbDatePickerInput/BbDatePickerInput.vue_vue_type_script_setup_true_lang.js +363 -349
  216. package/dist/components/BbDropdown/AdaptiveDropdown.vue_vue_type_script_setup_true_lang.js +91 -86
  217. package/dist/components/BbDropdown/BbDropdown.vue_vue_type_script_setup_true_lang.js +298 -289
  218. package/dist/components/BbDropdown/BbDropdownList.vue_vue_type_script_setup_true_lang.js +322 -356
  219. package/dist/components/BbDropdown/DropdownPipelineResolver.vue_vue_type_script_setup_true_lang.js +17 -15
  220. package/dist/components/BbDropdown/DropdownRow.vue.d.ts +40 -0
  221. package/dist/components/BbDropdown/DropdownRow.vue.js +5 -0
  222. package/dist/components/BbDropdown/DropdownRow.vue_vue_type_script_setup_true_lang.js +60 -0
  223. package/dist/components/BbDropdown/normalizeGroups.d.ts +8 -2
  224. package/dist/components/BbDropdown/normalizeGroups.js +60 -46
  225. package/dist/components/BbDropdown/types.d.ts +119 -88
  226. package/dist/components/BbDropdownButton/BbDropdownButton.vue_vue_type_script_setup_true_lang.js +11 -2
  227. package/dist/components/BbDropdownButton/types.d.ts +2 -2
  228. package/dist/components/BbForm/BbForm.vue.d.ts +9 -0
  229. package/dist/components/BbForm/BbForm.vue_vue_type_script_setup_true_lang.js +114 -105
  230. package/dist/components/BbForm/BbFormCustomField.js +1 -1
  231. package/dist/components/BbForm/bindFormField.js +2 -1
  232. package/dist/components/BbForm/formFields.d.ts +5 -0
  233. package/dist/components/BbNumberInput/BbNumberInput.vue.d.ts +0 -1
  234. package/dist/components/BbNumberInput/BbNumberInput.vue_vue_type_script_setup_true_lang.js +452 -125
  235. package/dist/components/BbNumberInput/numberDisplay.d.ts +256 -0
  236. package/dist/components/BbNumberInput/numberDisplay.js +499 -0
  237. package/dist/components/BbNumberInput/types.d.ts +54 -1
  238. package/dist/components/BbNumberInput/warroom/corpus.d.ts +58 -0
  239. package/dist/components/BbNumberInput/warroom/currency-verify.rows.d.ts +28 -0
  240. package/dist/components/BbNumberInput/warroom/currency.rows.d.ts +2 -0
  241. package/dist/components/BbNumberInput/warroom/harness.d.ts +217 -0
  242. package/dist/components/BbNumberInput/warroom/oracle.d.ts +150 -0
  243. package/dist/components/BbPagination/BbPagination.vue_vue_type_script_setup_true_lang.js +7 -7
  244. package/dist/components/BbPopover/BbPopover.vue.d.ts +1 -0
  245. package/dist/components/BbPopover/BbPopover.vue_vue_type_script_setup_true_lang.js +207 -164
  246. package/dist/components/BbPopover/types.d.ts +11 -0
  247. package/dist/components/BbProgress/BbProgress.vue_vue_type_script_setup_true_lang.js +15 -7
  248. package/dist/components/BbProgress/types.d.ts +23 -7
  249. package/dist/components/BbProgress/types.js +1 -1
  250. package/dist/components/BbRadioGroup/BbRadioGroup.vue_vue_type_script_setup_true_lang.js +102 -101
  251. package/dist/components/BbRadioGroup/types.d.ts +6 -2
  252. package/dist/components/BbRating/BbRating.vue_vue_type_script_setup_true_lang.js +63 -63
  253. package/dist/components/BbSelect/BbSelect.vue_vue_type_script_setup_true_lang.js +156 -154
  254. package/dist/components/BbSelect/types.d.ts +6 -2
  255. package/dist/components/BbSelectPopover/BbSelectPopover.vue_vue_type_script_setup_true_lang.js +2 -1
  256. package/dist/components/BbSelectPopover/types.d.ts +6 -2
  257. package/dist/components/BbSlider/BbSlider.vue_vue_type_script_setup_true_lang.js +153 -153
  258. package/dist/components/BbSwitch/BbSwitch.vue_vue_type_script_setup_true_lang.js +62 -62
  259. package/dist/components/BbSwitchGroup/BbSwitchGroup.vue_vue_type_script_setup_true_lang.js +131 -130
  260. package/dist/components/BbTable/BbTable.vue_vue_type_script_setup_true_lang.js +711 -676
  261. package/dist/components/BbTabs/BbTabs.vue_vue_type_script_setup_true_lang.js +1 -1
  262. package/dist/components/BbTabs/BbTabsList.vue_vue_type_script_setup_true_lang.js +1 -1
  263. package/dist/components/BbTabs/types.d.ts +25 -21
  264. package/dist/components/BbTag/BbTag.vue_vue_type_script_setup_true_lang.js +76 -76
  265. package/dist/components/BbTextInput/BbTextInput.vue_vue_type_script_setup_true_lang.js +58 -58
  266. package/dist/components/BbTextarea/BbTextarea.vue_vue_type_script_setup_true_lang.js +82 -82
  267. package/dist/components/BbTimePickerInput/BbTimePickerInput.vue_vue_type_script_setup_true_lang.js +246 -236
  268. package/dist/components/BbTooltip/BbTooltip.vue_vue_type_script_setup_true_lang.js +102 -97
  269. package/dist/components/BbTooltip/tooltipWarmup.d.ts +23 -0
  270. package/dist/components/BbTooltip/tooltipWarmup.js +7 -0
  271. package/dist/components/BbTooltip/types.d.ts +7 -2
  272. package/dist/components/BbTree/BbTree.vue_vue_type_script_setup_true_lang.js +29 -21
  273. package/dist/components/BbTree/BbTreeLevel.vue_vue_type_script_setup_true_lang.js +10 -7
  274. package/dist/components/CommonFieldInput/CommonFieldInput.vue_vue_type_script_setup_true_lang.js +37 -36
  275. package/dist/components/CommonTimeSelector/CommonTimeSelector.vue_vue_type_script_setup_true_lang.js +9 -9
  276. package/dist/composables/formSubmitLock.d.ts +6 -0
  277. package/dist/composables/formSubmitLock.js +4 -0
  278. package/dist/composables/useBaseOptions.d.ts +7 -1
  279. package/dist/composables/useBaseOptions.js +32 -32
  280. package/dist/composables/useBbDropdownContext.d.ts +8 -8
  281. package/dist/composables/useBbFormField.d.ts +9 -0
  282. package/dist/composables/useBbFormField.js +5 -3
  283. package/dist/composables/useBbTabsContext.d.ts +10 -10
  284. package/dist/composables/useBbTabsContext.js +18 -18
  285. package/dist/composables/useFormBinding.d.ts +11 -0
  286. package/dist/composables/useFormBinding.js +15 -13
  287. package/dist/composables/useItemText.d.ts +5 -1
  288. package/dist/composables/useItemText.js +8 -3
  289. package/dist/composables/useItemValue.d.ts +5 -1
  290. package/dist/composables/useItemValue.js +8 -3
  291. package/dist/composables/useLocale.js +10 -9
  292. package/dist/deprecation/ai-deprecations.json.d.ts +130 -0
  293. package/dist/deprecation/ai-deprecations.json.js +1 -1
  294. package/dist/deprecation/removedProps.js +1 -1
  295. package/dist/directives/bbDropdown.js +1 -1
  296. package/dist/i18n/index.d.ts +7 -12
  297. package/dist/i18n/locales/cs.json +11 -14
  298. package/dist/i18n/locales/da.json +13 -16
  299. package/dist/i18n/locales/de-CH.json +137 -0
  300. package/dist/i18n/locales/de.json +14 -17
  301. package/dist/i18n/locales/el.json +10 -13
  302. package/dist/i18n/locales/en-GB.json +137 -0
  303. package/dist/i18n/locales/en.json +8 -11
  304. package/dist/i18n/locales/es-MX.json +137 -0
  305. package/dist/i18n/locales/es.json +16 -19
  306. package/dist/i18n/locales/fi.json +8 -11
  307. package/dist/i18n/locales/fr.json +23 -26
  308. package/dist/i18n/locales/hu.json +8 -11
  309. package/dist/i18n/locales/it.json +12 -15
  310. package/dist/i18n/locales/ja.json +13 -16
  311. package/dist/i18n/locales/ko.json +10 -13
  312. package/dist/i18n/locales/nb.json +13 -16
  313. package/dist/i18n/locales/nl.json +21 -24
  314. package/dist/i18n/locales/pl.json +10 -13
  315. package/dist/i18n/locales/{pt.json → pt-BR.json} +19 -22
  316. package/dist/i18n/locales/pt-PT.json +137 -0
  317. package/dist/i18n/locales/ro.json +22 -25
  318. package/dist/i18n/locales/ru.json +11 -14
  319. package/dist/i18n/locales/sv.json +16 -19
  320. package/dist/i18n/locales/tr.json +14 -17
  321. package/dist/i18n/locales/uk.json +11 -14
  322. package/dist/i18n/locales/{zh-cn.json → zh-CN.json} +10 -13
  323. package/dist/i18n/locales/zh-HK.json +137 -0
  324. package/dist/i18n/locales/zh-TW.json +137 -0
  325. package/dist/i18n/regionHints.d.ts +16 -0
  326. package/dist/i18n/regionHints.js +49 -0
  327. package/dist/i18n/regions.d.ts +286 -0
  328. package/dist/i18n/regions.js +265 -0
  329. package/dist/index.d.ts +1 -1
  330. package/dist/index.js +4 -4
  331. package/dist/llms-full.txt +1785 -1637
  332. package/dist/llms-medium.txt +74 -46
  333. package/dist/llms.txt +7 -7
  334. package/dist/locale-blueprint.json +16 -13
  335. package/dist/styles.css +2 -2
  336. package/dist/types/ptComponentMap.d.ts +1 -1
  337. package/dist/utilities/functions/slotKey.d.ts +2 -2
  338. package/dist/utils/versionCheck.js +1 -1
  339. package/dist/vite-plugin.d.ts +22 -19
  340. package/dist/vite.js +309 -297
  341. package/llms.txt +7 -7
  342. package/package.json +5 -3
  343. package/scripts/lib/agent-manifest.mjs +2 -1
  344. package/scripts/lib/eslint-disable.mjs +12 -4
  345. package/scripts/lib/eslint-plugin.d.ts +5 -1
  346. package/scripts/lib/eslint-plugin.mjs +187 -6
  347. package/scripts/lib/helper-canon.mjs +176 -0
  348. package/scripts/lib/helpers-add.mjs +1303 -0
  349. package/scripts/lib/local-components.mjs +33 -4
  350. package/scripts/lib/locale-check.mjs +165 -0
  351. package/scripts/lib/redundant-item-accessor.mjs +398 -0
  352. package/scripts/lib/renamed-item-field.mjs +343 -0
  353. package/scripts/lib/slot-key.mjs +2 -2
  354. package/scripts/lib/slot-renames.mjs +1 -1
  355. package/scripts/lib/validate-bb-markup.mjs +123 -56
  356. package/dist/i18n/index.js +0 -27
@@ -33,9 +33,8 @@ Sibling recipes: [Vue](../vue/ownership-atlas.md) ·
33
33
  the peek stack, the close semantics and the sidebar's out-of-flow
34
34
  behaviour are all load-bearing here.
35
35
  - `<BbToast />` mounted once in the `createInertiaApp` render root — never in a page.
36
- - From the [Inertia Helpers](../../guides/inertia-helpers.md) toolkit:
37
- `useTableContext`, `useQueryObject`, `useResourceContext` (plus the
38
- `useProp` / `useQuery` prop-and-URL helpers).
36
+ - From the [Inertia Helpers](../../guides/inertia-helpers.md) toolkit, installed with
37
+ `npx bitboss-ui add useProp useQuery useQueryObject useResourceContext useTableContext`.
39
38
  - Controller: `Inertia::render('OwnershipAtlas/Index', ['owners' =>
40
39
  OwnerPaginator::make(...), 'tabCounts' => [...], 'ownerOptions' => [...]])` —
41
40
  `owners` is a standard Laravel paginator (`PaginatedResponse<Owner>`) whose
@@ -188,10 +187,10 @@ import {
188
187
  import {
189
188
  useTableContext,
190
189
  type TableContext,
191
- } from '@/composables/useTableContext';
192
- import { useQueryObject } from '@/composables/useQueryObject';
193
- import { useProp } from '@/composables/useProp';
194
- import { useQuery } from '@/composables/useQuery';
190
+ } from '@/composables/inertia-helpers/useTableContext';
191
+ import { useQueryObject } from '@/composables/inertia-helpers/useQueryObject';
192
+ import { useProp } from '@/composables/inertia-helpers/useProp';
193
+ import { useQuery } from '@/composables/inertia-helpers/useQuery';
195
194
  import type {
196
195
  HoldingKind,
197
196
  HoldingStatus,
@@ -462,9 +461,9 @@ export function useOwnershipAtlas(): OwnershipAtlasContext {
462
461
  <BbBreadcrumbs
463
462
  class="min-w-0 flex-auto"
464
463
  :items="[
465
- { key: 'admin', text: 'Admin', href: '/admin' },
466
- { key: 'access', text: 'Access', href: '/access' },
467
- { key: 'ownership', text: 'Ownership' },
464
+ { value: 'admin', label: 'Admin', href: '/admin' },
465
+ { value: 'access', label: 'Access', href: '/access' },
466
+ { value: 'ownership', label: 'Ownership' },
468
467
  ]"
469
468
  />
470
469
  <div class="flex shrink-0 items-center gap-2">
@@ -517,28 +516,28 @@ export function useOwnershipAtlas(): OwnershipAtlasContext {
517
516
  compact
518
517
  :items="[
519
518
  {
520
- key: 'all',
519
+ value: 'all',
521
520
  label: `All · ${ctx.tabCounts.value.all}`,
522
521
  href: tabHref('all'),
523
522
  server: true,
524
523
  only: ['owners', 'tabCounts'],
525
524
  },
526
525
  {
527
- key: 'americas',
526
+ value: 'americas',
528
527
  label: `Americas · ${ctx.tabCounts.value.americas}`,
529
528
  href: tabHref('americas'),
530
529
  server: true,
531
530
  only: ['owners', 'tabCounts'],
532
531
  },
533
532
  {
534
- key: 'emea',
533
+ value: 'emea',
535
534
  label: `EMEA · ${ctx.tabCounts.value.emea}`,
536
535
  href: tabHref('emea'),
537
536
  server: true,
538
537
  only: ['owners', 'tabCounts'],
539
538
  },
540
539
  {
541
- key: 'apac',
540
+ value: 'apac',
542
541
  label: `APAC · ${ctx.tabCounts.value.apac}`,
543
542
  href: tabHref('apac'),
544
543
  server: true,
@@ -707,7 +706,7 @@ import {
707
706
  } from 'bitboss-ui';
708
707
  import qs from 'query-string';
709
708
  import PageShell from '@/components/layout/PageShell.vue';
710
- import { useQuery } from '@/composables/useQuery';
709
+ import { useQuery } from '@/composables/inertia-helpers/useQuery';
711
710
  import {
712
711
  provideOwnershipAtlas,
713
712
  REGION_LABEL,
@@ -946,8 +945,6 @@ const monthLabel = (value: string) =>
946
945
  <BbSelectPopover
947
946
  v-model="ctx.filters.kinds"
948
947
  clearable
949
- item-text="label"
950
- item-value="value"
951
948
  :items="kindOptions"
952
949
  multiple
953
950
  >
@@ -1193,7 +1190,7 @@ const onTransfer = (value: unknown) => {
1193
1190
  <script setup lang="ts">
1194
1191
  import { watch } from 'vue';
1195
1192
  import { BbBadge, BbButton, BbSpinner } from 'bitboss-ui';
1196
- import { useResourceContext } from '@/composables/useResourceContext';
1193
+ import { useResourceContext } from '@/composables/inertia-helpers/useResourceContext';
1197
1194
  import {
1198
1195
  KIND_LABEL,
1199
1196
  REGION_LABEL,
@@ -30,8 +30,8 @@ Sibling recipes: [Vue](../vue/record-form.md) ·
30
30
  the peek stack, the close semantics and the sidebar's out-of-flow
31
31
  behaviour are all load-bearing here.
32
32
  - `<BbConfirm />` and `<BbToast />` mounted once in the `createInertiaApp` render root — never in a page.
33
- - From the [Inertia Helpers](../../guides/inertia-helpers.md) toolkit:
34
- `usePromiseForm`, `useConfirmOnRouteLeave`, `useProp`, `useResourceContext`.
33
+ - From the [Inertia Helpers](../../guides/inertia-helpers.md) toolkit, installed with
34
+ `npx bitboss-ui add useConfirmOnRouteLeave usePromiseForm useProp useResourceContext`.
35
35
  - Controller: `Inertia::render('InvoiceForm/Index', ['invoice' => $invoice])`
36
36
  — `invoice` is `null` on the create route and the full record (including
37
37
  `lineItems`) on the edit route. Standard Laravel validation; on failure
@@ -243,9 +243,9 @@ import {
243
243
  usePageShellContext,
244
244
  type PageShellContext,
245
245
  } from '@/components/layout/usePageShellContext';
246
- import { usePromiseForm } from '@/composables/usePromiseForm';
247
- import { useConfirmOnRouteLeave } from '@/composables/useConfirmOnRouteLeave';
248
- import { useProp } from '@/composables/useProp';
246
+ import { usePromiseForm } from '@/composables/inertia-helpers/usePromiseForm';
247
+ import { useConfirmOnRouteLeave } from '@/composables/inertia-helpers/useConfirmOnRouteLeave';
248
+ import { useProp } from '@/composables/inertia-helpers/useProp';
249
249
  import type {
250
250
  Customer,
251
251
  CustomerDetail,
@@ -730,12 +730,12 @@ const ctx = provideInvoiceForm();
730
730
 
731
731
  // A real trail, ≥ 2 linked levels; the current page carries no target.
732
732
  const trail = computed(() => [
733
- { key: 'dashboard', text: 'Dashboard', href: '/dashboard' },
734
- { key: 'billing', text: 'Billing', href: '/billing' },
735
- { key: 'invoices', text: 'Invoices', href: '/invoices' },
733
+ { value: 'dashboard', label: 'Dashboard', href: '/dashboard' },
734
+ { value: 'billing', label: 'Billing', href: '/billing' },
735
+ { value: 'invoices', label: 'Invoices', href: '/invoices' },
736
736
  {
737
- key: 'invoice',
738
- text:
737
+ value: 'invoice',
738
+ label:
739
739
  ctx.mode === 'edit'
740
740
  ? (ctx.invoiceNumber.value ?? 'Invoice')
741
741
  : 'New invoice',
@@ -1533,7 +1533,7 @@ import {
1533
1533
  BbButton,
1534
1534
  BbSpinner,
1535
1535
  } from 'bitboss-ui';
1536
- import { useResourceContext } from '@/composables/useResourceContext';
1536
+ import { useResourceContext } from '@/composables/inertia-helpers/useResourceContext';
1537
1537
  import { INVOICE_STATUS_LABEL, useInvoiceForm } from './context';
1538
1538
  import type { CustomerDetail } from '@/types';
1539
1539
 
@@ -32,9 +32,8 @@ Sibling recipes: [Vue](../vue/records-workspace.md) ·
32
32
  `soft-green`, `soft-amber`, `soft-red`) — the status badges wear them; see
33
33
  [design-language](../../guides/design-language.md) § Getting soft
34
34
  semantic badges.
35
- - From the [Inertia Helpers](../../guides/inertia-helpers.md) toolkit:
36
- `useTableContext`, `useQueryObject`, `useQuery`, `useProp`,
37
- `useResourceContext`.
35
+ - From the [Inertia Helpers](../../guides/inertia-helpers.md) toolkit, installed with
36
+ `npx bitboss-ui add useProp useQuery useQueryObject useResourceContext useTableContext`.
38
37
  - Controller: `Inertia::render('InvoicesWorkspace/Index', ['invoices' =>
39
38
  InvoicePaginator::make(...), 'tabCounts' => [...]])` — `invoices` is a
40
39
  standard Laravel paginator (`PaginatedResponse<Invoice>`) and `tabCounts`
@@ -182,10 +181,10 @@ import {
182
181
  import {
183
182
  useTableContext,
184
183
  type TableContext,
185
- } from '@/composables/useTableContext';
186
- import { useQueryObject } from '@/composables/useQueryObject';
187
- import { useProp } from '@/composables/useProp';
188
- import { useQuery } from '@/composables/useQuery';
184
+ } from '@/composables/inertia-helpers/useTableContext';
185
+ import { useQueryObject } from '@/composables/inertia-helpers/useQueryObject';
186
+ import { useProp } from '@/composables/inertia-helpers/useProp';
187
+ import { useQuery } from '@/composables/inertia-helpers/useQuery';
189
188
  import type { Invoice, InvoiceStatus, PaymentDraft } from '@/types';
190
189
 
191
190
  /**
@@ -574,9 +573,9 @@ export function useInvoicesWorkspace(): InvoicesWorkspaceContext {
574
573
  <BbBreadcrumbs
575
574
  class="min-w-0 flex-auto"
576
575
  :items="[
577
- { key: 'dashboard', text: 'Dashboard', href: '/dashboard' },
578
- { key: 'billing', text: 'Billing', href: '/billing' },
579
- { key: 'invoices', text: 'Invoices' },
576
+ { value: 'dashboard', label: 'Dashboard', href: '/dashboard' },
577
+ { value: 'billing', label: 'Billing', href: '/billing' },
578
+ { value: 'invoices', label: 'Invoices' },
580
579
  ]"
581
580
  />
582
581
  <div class="flex shrink-0 items-center gap-2">
@@ -621,28 +620,28 @@ export function useInvoicesWorkspace(): InvoicesWorkspaceContext {
621
620
  compact
622
621
  :items="[
623
622
  {
624
- key: 'all',
623
+ value: 'all',
625
624
  label: `All · ${ctx.tabCounts.value.all}`,
626
625
  href: tabHref('all'),
627
626
  server: true,
628
627
  only: ['invoices', 'tabCounts'],
629
628
  },
630
629
  {
631
- key: 'outstanding',
630
+ value: 'outstanding',
632
631
  label: `Outstanding · ${ctx.tabCounts.value.outstanding}`,
633
632
  href: tabHref('outstanding'),
634
633
  server: true,
635
634
  only: ['invoices', 'tabCounts'],
636
635
  },
637
636
  {
638
- key: 'paid',
637
+ value: 'paid',
639
638
  label: `Paid · ${ctx.tabCounts.value.paid}`,
640
639
  href: tabHref('paid'),
641
640
  server: true,
642
641
  only: ['invoices', 'tabCounts'],
643
642
  },
644
643
  {
645
- key: 'archived',
644
+ value: 'archived',
646
645
  label: `Archived · ${ctx.tabCounts.value.archived}`,
647
646
  href: tabHref('archived'),
648
647
  server: true,
@@ -779,7 +778,7 @@ import {
779
778
  } from 'bitboss-ui';
780
779
  import qs from 'query-string';
781
780
  import PageShell from '@/components/layout/PageShell.vue';
782
- import { useQuery } from '@/composables/useQuery';
781
+ import { useQuery } from '@/composables/inertia-helpers/useQuery';
783
782
  import { provideInvoicesWorkspace, type WorkspaceTab } from './context';
784
783
  import CustomerPeek from './CustomerPeek.vue';
785
784
  import DueDateCell from './DueDateCell.vue';
@@ -983,16 +982,16 @@ const searchCustomers = async ({
983
982
  // Static enum facet: item text resolves synchronously, so its chip reads
984
983
  // `useBbDropdownContext` (in FilterChip.vue) with zero extra fetch.
985
984
  const statusGroup: BbDropdownItem = {
986
- key: 'status',
985
+ id: 'status',
987
986
  label: 'Status',
988
987
  hideLabel: true,
989
988
  selectable: true,
990
989
  multiple: true,
991
990
  items: [
992
- { key: 'draft', text: INVOICE_STATUS_LABEL.draft },
993
- { key: 'pending', text: INVOICE_STATUS_LABEL.pending },
994
- { key: 'paid', text: INVOICE_STATUS_LABEL.paid },
995
- { key: 'overdue', text: INVOICE_STATUS_LABEL.overdue },
991
+ { value: 'draft', label: INVOICE_STATUS_LABEL.draft },
992
+ { value: 'pending', label: INVOICE_STATUS_LABEL.pending },
993
+ { value: 'paid', label: INVOICE_STATUS_LABEL.paid },
994
+ { value: 'overdue', label: INVOICE_STATUS_LABEL.overdue },
996
995
  ],
997
996
  };
998
997
 
@@ -1004,7 +1003,7 @@ const statusGroup: BbDropdownItem = {
1004
1003
  // redeclaring `prefill: true` would fetch every seeded facet twice on page
1005
1004
  // load for nothing.
1006
1005
  const customerGroup: BbDropdownItem = {
1007
- key: 'customer',
1006
+ id: 'customer',
1008
1007
  label: 'Customer',
1009
1008
  hideLabel: true,
1010
1009
  selectable: true,
@@ -1021,14 +1020,14 @@ const customerGroup: BbDropdownItem = {
1021
1020
  // the category row already names the facet.
1022
1021
  const menu = computed<BbDropdownItem[]>(() => [
1023
1022
  {
1024
- key: 'status-category',
1025
- text: 'Status',
1023
+ value: 'status-category',
1024
+ label: 'Status',
1026
1025
  'prepend:icon': 'lucide:circle-dot',
1027
1026
  items: [statusGroup],
1028
1027
  },
1029
1028
  {
1030
- key: 'customer-category',
1031
- text: 'Customer',
1029
+ value: 'customer-category',
1030
+ label: 'Customer',
1032
1031
  'prepend:icon': 'lucide:building-2',
1033
1032
  items: [customerGroup],
1034
1033
  },
@@ -1078,7 +1077,7 @@ import {
1078
1077
  import type { BbDropdownItem } from 'bitboss-ui';
1079
1078
 
1080
1079
  const props = defineProps<{
1081
- /** Matches the group's `key` in the Filters menu, and its key in
1080
+ /** Matches the group's `id` in the Filters menu, and its entry in
1082
1081
  * `useBbDropdownContext('invoice-filters').groups`. */
1083
1082
  groupKey: string;
1084
1083
  /** Static fallback/prefix text — the group itself sets `hideLabel`. */
@@ -1115,7 +1114,7 @@ const chipText = computed(() => {
1115
1114
  dropdownFilters.groups.value[props.groupKey]?.selectedOptions ?? [];
1116
1115
  if (!options.length) return props.label;
1117
1116
  return `${props.label}: ${options
1118
- .map((option) => option.text ?? String(option.value))
1117
+ .map((option) => option.label ?? String(option.value))
1119
1118
  .join(', ')}`;
1120
1119
  });
1121
1120
 
@@ -1131,7 +1130,6 @@ const onClear = () =>
1131
1130
  <template>
1132
1131
  <BbSelectPopover
1133
1132
  item-text="text"
1134
- item-value="value"
1135
1133
  :items="INVOICE_STATUS_OPTIONS"
1136
1134
  :model-value="invoice.status"
1137
1135
  width="180"
@@ -1347,32 +1345,32 @@ const pillLabel = computed(() =>
1347
1345
  :boundary="boundary"
1348
1346
  :items="[
1349
1347
  {
1350
- key: 'edit',
1351
- text: 'Edit',
1348
+ value: 'edit',
1349
+ label: 'Edit',
1352
1350
  'prepend:icon': 'lucide:pencil',
1353
1351
  href: `/invoices/${invoice.id}/edit`,
1354
1352
  },
1355
1353
  {
1356
- key: 'duplicate',
1357
- text: 'Duplicate',
1354
+ value: 'duplicate',
1355
+ label: 'Duplicate',
1358
1356
  'prepend:icon': 'lucide:copy',
1359
1357
  onClick: () => ctx.duplicateInvoice(invoice),
1360
1358
  },
1361
1359
  {
1362
- key: 'payment',
1363
- text: 'Record payment',
1360
+ value: 'payment',
1361
+ label: 'Record payment',
1364
1362
  'prepend:icon': 'lucide:banknote',
1365
1363
  onClick: () => (ctx.dialogs.recordPayment.value = invoice),
1366
1364
  },
1367
1365
  {
1368
- key: 'archive',
1369
- text: 'Archive',
1366
+ value: 'archive',
1367
+ label: 'Archive',
1370
1368
  'prepend:icon': 'lucide:archive',
1371
1369
  onClick: () => ctx.archiveInvoice(invoice),
1372
1370
  },
1373
1371
  {
1374
- key: 'delete',
1375
- text: 'Delete',
1372
+ value: 'delete',
1373
+ label: 'Delete',
1376
1374
  'prepend:icon': 'lucide:trash-2',
1377
1375
  variant: 'destructive',
1378
1376
  onClick: () => ctx.deleteInvoice(invoice),
@@ -1605,7 +1603,7 @@ const ctx = useInvoicesWorkspace();
1605
1603
  <script setup lang="ts">
1606
1604
  import { ref, watch } from 'vue';
1607
1605
  import { BbBaseButton, BbButton, BbIcon, BbSpinner, BbTable } from 'bitboss-ui';
1608
- import { useResourceContext } from '@/composables/useResourceContext';
1606
+ import { useResourceContext } from '@/composables/inertia-helpers/useResourceContext';
1609
1607
  import StatusCell from './StatusCell.vue';
1610
1608
  import { useInvoicesWorkspace } from './context';
1611
1609
  import type { InvoiceDetail } from '@/types';
@@ -1756,7 +1754,7 @@ import {
1756
1754
  BbButton,
1757
1755
  BbSpinner,
1758
1756
  } from 'bitboss-ui';
1759
- import { useResourceContext } from '@/composables/useResourceContext';
1757
+ import { useResourceContext } from '@/composables/inertia-helpers/useResourceContext';
1760
1758
  import {
1761
1759
  INVOICE_STATUS_LABEL,
1762
1760
  INVOICE_STATUS_VARIANT,
@@ -1828,7 +1826,6 @@ const currency = new Intl.NumberFormat('en-US', {
1828
1826
  <BbSelect
1829
1827
  v-model="draft.method"
1830
1828
  item-text="text"
1831
- item-value="value"
1832
1829
  :items="PAYMENT_METHOD_OPTIONS"
1833
1830
  label="Method"
1834
1831
  label-mode="outside"
@@ -32,8 +32,8 @@ Sibling recipes: [Vue](../vue/settings-workspace.md) · [Nuxt](../nuxt/settings-
32
32
  `DELETE /settings/api-keys/{id}`, `POST /settings/workspace/delete`
33
33
  (redirects to `/`). A refusal only the server can know (Slack's expired
34
34
  token) comes back as a validation error on `channels`.
35
- - The toolkit composables from [Inertia helpers](../../guides/inertia-helpers.md):
36
- `useProp` and `useConfirmOnRouteLeave`.
35
+ - From the [Inertia Helpers](../../guides/inertia-helpers.md) toolkit, installed with
36
+ `npx bitboss-ui add useConfirmOnRouteLeave useProp`.
37
37
 
38
38
  ## Key ideas
39
39
 
@@ -84,7 +84,7 @@ per field, and never mix both inside one card.
84
84
  | ---------------- | ---------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------- |
85
85
  | What it is | Typed text, several fields that belong together | One discrete choice: a switch, a checkbox, a role, a file |
86
86
  | Commit | A **Save** button in the card footer, disabled until something changed | The change itself. No button anywhere |
87
- | While saving | The button spins (`isSubmitting`); the fields stay editable | The control goes `readonly` so a second flip cannot race the first |
87
+ | 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 |
88
88
  | On success | A toast; the dirty state rebaselines to what was saved | A quiet toast (`Delivery channels saved.`) |
89
89
  | 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…`) |
90
90
  | Leaving | Unsaved work raises a dot on the section tab, and leaving asks first | Nothing can be unsaved, so nothing asks |
@@ -232,8 +232,8 @@ import {
232
232
  useConfirm,
233
233
  useToast,
234
234
  } from 'bitboss-ui';
235
- import { useConfirmOnRouteLeave } from '@/composables/useConfirmOnRouteLeave';
236
- import { useProp } from '@/composables/useProp';
235
+ import { useConfirmOnRouteLeave } from '@/composables/inertia-helpers/useConfirmOnRouteLeave';
236
+ import { useProp } from '@/composables/inertia-helpers/useProp';
237
237
  import type {
238
238
  ApiKey,
239
239
  ApiKeyDraft,
@@ -848,9 +848,9 @@ export function useSettingsWorkspace(): SettingsWorkspaceContext {
848
848
  <BbBreadcrumbs
849
849
  class="min-w-0"
850
850
  :items="[
851
- { key: 'workspace', text: 'Fennel & Hart', href: '/' },
852
- { key: 'settings', text: 'Settings', href: '/settings' },
853
- { key: 'section', text: currentLabel },
851
+ { value: 'workspace', label: 'Fennel & Hart', href: '/' },
852
+ { value: 'settings', label: 'Settings', href: '/settings' },
853
+ { value: 'section', label: currentLabel },
854
854
  ]"
855
855
  style="--flex-grow: 1"
856
856
  />
@@ -890,7 +890,7 @@ export function useSettingsWorkspace(): SettingsWorkspaceContext {
890
890
  replace
891
891
  variant="none"
892
892
  >
893
- <template #label="{ value, text }">
893
+ <template #label="{ value, label }">
894
894
  <!-- In the side column every label is one width, so the counts line
895
895
  up on the right edge. -->
896
896
  <span
@@ -898,7 +898,7 @@ export function useSettingsWorkspace(): SettingsWorkspaceContext {
898
898
  :class="{ 'min-w-[11.5rem]': !isMobile }"
899
899
  >
900
900
  <BbIcon aria-hidden="true" :icon="SECTION_ICONS[value]" size="16" />
901
- <span>{{ text }}</span>
901
+ <span>{{ label }}</span>
902
902
  <!-- Unsaved marker: a dot, not a word, so the label does not jump. -->
903
903
  <span
904
904
  v-if="value === 'profile' && ctx.profileDirty.value"
@@ -959,12 +959,12 @@ const { isMobile } = useMobile();
959
959
 
960
960
  // `eager` on Profile: a half-edited draft must survive a look at Billing.
961
961
  const sections: Array<BbTabsItem<SettingsSection>> = [
962
- { key: 'profile', label: 'Profile', eager: true },
963
- { key: 'notifications', label: 'Notifications' },
964
- { key: 'members', label: 'Members' },
965
- { key: 'billing', label: 'Billing' },
966
- { key: 'api-keys', label: 'API keys' },
967
- { key: 'danger-zone', label: 'Danger zone' },
962
+ { value: 'profile', label: 'Profile', eager: true },
963
+ { value: 'notifications', label: 'Notifications' },
964
+ { value: 'members', label: 'Members' },
965
+ { value: 'billing', label: 'Billing' },
966
+ { value: 'api-keys', label: 'API keys' },
967
+ { value: 'danger-zone', label: 'Danger zone' },
968
968
  ];
969
969
 
970
970
  // Full literals: the production icon scanner only bundles names it can see.
@@ -1146,7 +1146,6 @@ The explicit-save section: Zod schema, 422s, dirty footer.
1146
1146
  not "differs from the values this form mounted with". -->
1147
1147
  <BbForm
1148
1148
  :id="PROFILE_FORM"
1149
- v-slot="{ isSubmitting }"
1150
1149
  :field-errors="ctx.serverErrors.profile.value"
1151
1150
  :model="ctx.profileDraft"
1152
1151
  :schema="profileSchema"
@@ -1176,8 +1175,6 @@ The explicit-save section: Zod schema, 422s, dirty footer.
1176
1175
  />
1177
1176
  <BbSelect
1178
1177
  description="Due dates and reminders follow this zone."
1179
- item-text="label"
1180
- item-value="value"
1181
1178
  :items="TIMEZONES"
1182
1179
  label="Time zone"
1183
1180
  name="timezone"
@@ -1211,7 +1208,6 @@ The explicit-save section: Zod schema, 422s, dirty footer.
1211
1208
  it says why, so the state is never a mystery. -->
1212
1209
  <BbButton
1213
1210
  :disabled="!ctx.profileDirty.value"
1214
- :loading="isSubmitting"
1215
1211
  type="submit"
1216
1212
  variant="primary"
1217
1213
  >
@@ -1855,8 +1851,6 @@ One-click role picker (BbSelectPopover).
1855
1851
  <BbSelectPopover
1856
1852
  v-else
1857
1853
  :item-props="{ description: 'description' }"
1858
- item-text="label"
1859
- item-value="value"
1860
1854
  :items="ROLE_OPTIONS"
1861
1855
  :model-value="member.role"
1862
1856
  width="280"
@@ -1941,21 +1935,21 @@ const items = computed<BbDropdownItem[]>(() => {
1941
1935
  if (m.status === 'invited')
1942
1936
  return [
1943
1937
  {
1944
- key: 'resend',
1945
- text: 'Resend invitation',
1938
+ value: 'resend',
1939
+ label: 'Resend invitation',
1946
1940
  'prepend:icon': 'lucide:send',
1947
1941
  onClick: () => ctx.resendInvite(m),
1948
1942
  },
1949
1943
  {
1950
- key: 'copy',
1951
- text: 'Copy email',
1944
+ value: 'copy',
1945
+ label: 'Copy email',
1952
1946
  'prepend:icon': 'lucide:copy',
1953
1947
  onClick: () => ctx.copy(m.email, 'Email address'),
1954
1948
  },
1955
1949
  [
1956
1950
  {
1957
- key: 'revoke',
1958
- text: 'Revoke invitation',
1951
+ value: 'revoke',
1952
+ label: 'Revoke invitation',
1959
1953
  'prepend:icon': 'lucide:user-x',
1960
1954
  variant: 'destructive',
1961
1955
  onClick: () => ctx.removeMember(m),
@@ -1964,15 +1958,15 @@ const items = computed<BbDropdownItem[]>(() => {
1964
1958
  ];
1965
1959
  return [
1966
1960
  {
1967
- key: 'copy',
1968
- text: 'Copy email',
1961
+ value: 'copy',
1962
+ label: 'Copy email',
1969
1963
  'prepend:icon': 'lucide:copy',
1970
1964
  onClick: () => ctx.copy(m.email, 'Email address'),
1971
1965
  },
1972
1966
  [
1973
1967
  {
1974
- key: 'remove',
1975
- text: 'Remove from workspace',
1968
+ value: 'remove',
1969
+ label: 'Remove from workspace',
1976
1970
  'prepend:icon': 'lucide:user-minus',
1977
1971
  variant: 'destructive',
1978
1972
  onClick: () => ctx.removeMember(m),
@@ -2018,8 +2012,6 @@ Invite by email: BbTag + role radios, footer submits from outside.
2018
2012
  />
2019
2013
  <BbRadioGroup
2020
2014
  :item-props="{ description: 'description' }"
2021
- item-text="label"
2022
- item-value="value"
2023
2015
  :items="ROLE_OPTIONS"
2024
2016
  legend="Role"
2025
2017
  list-layout="vertical"
@@ -2484,8 +2476,6 @@ Create, then reveal once (persistent while shown).
2484
2476
  <BbTextInput label="Name" name="name" placeholder="Production server" />
2485
2477
  <BbRadioGroup
2486
2478
  :item-props="{ description: 'description' }"
2487
- item-text="label"
2488
- item-value="value"
2489
2479
  :items="SCOPES"
2490
2480
  legend="Access"
2491
2481
  list-layout="vertical"
@@ -2493,8 +2483,6 @@ Create, then reveal once (persistent while shown).
2493
2483
  />
2494
2484
  <BbSelect
2495
2485
  description="Short-lived keys limit the damage of a leak."
2496
- item-text="label"
2497
- item-value="value"
2498
2486
  :items="EXPIRIES"
2499
2487
  label="Expires"
2500
2488
  name="expiresIn"