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
@@ -36,9 +36,9 @@ use `BbPagination`. Show at most one breadcrumb trail per view.
36
36
 
37
37
  ### Build the trail from `items`
38
38
 
39
- Each item is `{ key, text }` plus a navigation target. `key` must be unique (it
40
- also becomes the crumb's named-slot name and the label fallback when `text` is
41
- missing). Navigation is always the item's job — give a crumb an `href` (or
39
+ Each item is `{ label, value }` plus a navigation target. `label` is the
40
+ crumb's text; `value` is optional and, when set, must be unique (it names the
41
+ crumb's own slots). Navigation is always the item's job — give a crumb an `href` (or
42
42
  `to`, or an `onClick`) and it renders as a real link; **never** wrap a crumb in
43
43
  your own click-to-route handler. Leave the **last** item without a target: a
44
44
  last crumb with no target is the current page, and the component marks it
@@ -51,10 +51,10 @@ it) never marks the parent current.
51
51
  ```vue
52
52
  <BbBreadcrumbs
53
53
  :items="[
54
- { key: 'dashboard', text: 'Dashboard', href: '#dashboard' },
55
- { key: 'billing', text: 'Billing', href: '#billing' },
56
- { key: 'invoices', text: 'Invoices', href: '#invoices' },
57
- { key: 'invoice', text: 'Invoice #1042' },
54
+ { value: 'dashboard', label: 'Dashboard', href: '#dashboard' },
55
+ { value: 'billing', label: 'Billing', href: '#billing' },
56
+ { value: 'invoices', label: 'Invoices', href: '#invoices' },
57
+ { value: 'invoice', label: 'Invoice #1042' },
58
58
  ]"
59
59
  />
60
60
  ```
@@ -124,20 +124,20 @@ import type { BbBreadcrumbsItem } from 'bitboss-ui';
124
124
  // crumb is a real link; the current page stays without a target.
125
125
  const trail: BbBreadcrumbsItem[] = [
126
126
  {
127
- key: 'settings',
128
- text: 'Settings',
127
+ value: 'settings',
128
+ label: 'Settings',
129
129
  href: '#settings',
130
130
  'prepend:icon': 'lucide:settings',
131
131
  },
132
132
  {
133
- key: 'team',
134
- text: 'Team',
133
+ value: 'team',
134
+ label: 'Team',
135
135
  href: '#team',
136
136
  'prepend:icon': 'lucide:users',
137
137
  },
138
138
  {
139
- key: 'members',
140
- text: 'Members',
139
+ value: 'members',
140
+ label: 'Members',
141
141
  'prepend:icon': 'lucide:user-round',
142
142
  },
143
143
  ];
@@ -164,7 +164,7 @@ other crumb goes into the menu and the current page stays, its label truncated
164
164
  with an ellipsis (the full text in a tooltip and to assistive tech). That is the
165
165
  floor: in a very narrow toolbar the trail reads `… / Quarterly rev…`. If that is
166
166
  too little, give the trail its own full-width row, or shorten the last label
167
- (`text` is yours).
167
+ (`label` is yours).
168
168
 
169
169
  **Overflow folds into an ellipsis menu**
170
170
 
@@ -172,12 +172,12 @@ too little, give the trail its own full-width row, or shorten the last label
172
172
  <div class="max-w-xs">
173
173
  <BbBreadcrumbs
174
174
  :items="[
175
- { key: 'workspace', text: 'Workspace', href: '#workspace' },
176
- { key: 'engineering', text: 'Engineering', href: '#engineering' },
177
- { key: 'frontend', text: 'Frontend', href: '#frontend' },
178
- { key: 'design-system', text: 'Design System', href: '#design-system' },
179
- { key: 'components', text: 'Components', href: '#components' },
180
- { key: 'breadcrumbs', text: 'Breadcrumbs' },
175
+ { value: 'workspace', label: 'Workspace', href: '#workspace' },
176
+ { value: 'engineering', label: 'Engineering', href: '#engineering' },
177
+ { value: 'frontend', label: 'Frontend', href: '#frontend' },
178
+ { value: 'design-system', label: 'Design System', href: '#design-system' },
179
+ { value: 'components', label: 'Components', href: '#components' },
180
+ { value: 'breadcrumbs', label: 'Breadcrumbs' },
181
181
  ]"
182
182
  />
183
183
  </div>
@@ -250,8 +250,8 @@ When slot (or icon) content adds width the estimator cannot see, set
250
250
  <BbBreadcrumbs
251
251
  :offset-width="96"
252
252
  :items="[
253
- { key: 'settings', text: 'Settings', href: '#settings' },
254
- { key: 'notifications', text: 'Notifications' },
253
+ { value: 'settings', label: 'Settings', href: '#settings' },
254
+ { value: 'notifications', label: 'Notifications' },
255
255
  ]"
256
256
  >
257
257
  <template #prepend>
@@ -260,7 +260,7 @@ When slot (or icon) content adds width the estimator cannot see, set
260
260
  <template #item:prepend="{ item }">
261
261
  <BbIcon
262
262
  class="mr-1"
263
- :icon="item.key === 'settings' ? 'lucide:settings' : 'lucide:bell'"
263
+ :icon="item.value === 'settings' ? 'lucide:settings' : 'lucide:bell'"
264
264
  size="14"
265
265
  />
266
266
  </template>
@@ -310,10 +310,10 @@ import type { BbBreadcrumbsItem } from 'bitboss-ui';
310
310
  // File-view header: trail says where you are; compact `append` actions act on
311
311
  // the file. Declare their width with `offset-width` so overflow stays honest.
312
312
  const items: BbBreadcrumbsItem[] = [
313
- { key: 'repo', text: 'acme-ui', href: '#repo' },
314
- { key: 'src', text: 'src', href: '#src' },
315
- { key: 'components', text: 'components', href: '#components' },
316
- { key: 'button', text: 'Button.tsx' },
313
+ { value: 'repo', label: 'acme-ui', href: '#repo' },
314
+ { value: 'src', label: 'src', href: '#src' },
315
+ { value: 'components', label: 'components', href: '#components' },
316
+ { value: 'button', label: 'Button.tsx' },
317
317
  ];
318
318
 
319
319
  const copied = ref(false);
@@ -330,17 +330,17 @@ const onCopyPath = () => {
330
330
 
331
331
  ### Own one crumb's label with its named slot
332
332
 
333
- Every item also gets a slot named after its `key`, replacing that crumb's
334
- default text (same scope as `item:prepend`). Use it when a single crumb needs
335
- richer content — a status dot on the current record, a badge on one level —
336
- while the rest of the trail stays plain. A crumb's `key` is optional unless
337
- it has a slot of its own — a keyless crumb renders with the generic `item:*`
338
- slots and its text, and its slot name is never derived from the text (a label
339
- changes with translation; a slot name must not). The slot name is the key through
333
+ Every item with a `value` also gets a slot named after it, replacing that
334
+ crumb's default label (same scope as `item:prepend`). Use it when a single crumb
335
+ needs richer content — a status dot on the current record, a badge on one level —
336
+ while the rest of the trail stays plain. A crumb's `value` is optional unless
337
+ it has a slot of its own — a crumb without one renders with the generic `item:*`
338
+ slots and its label, and its slot name is never derived from the label (a label
339
+ changes with translation; a slot name must not). The slot name is the value through
340
340
  `slotKey`, which is kebab-case — `'Order History'` → `#order-history`,
341
341
  `'orderHistory'` → `#order-history`, `'order_history'` → `#order-history`; for
342
- a key with accents or other scripts write `#[slotKey('Qualità')]` (`import {
343
- slotKey } from 'bitboss-ui'`). Because keys become slot names, a key spelled
342
+ a value with accents or other scripts write `#[slotKey('Qualità')]` (`import {
343
+ slotKey } from 'bitboss-ui'`). Because values become slot names, a value spelled
344
344
  like a reserved slot (`prepend`, `append`, `divider`, `ellipsis`, `item`) is an
345
345
  error: `bitboss-ui check` flags it when `items` is in the same file.
346
346
 
@@ -349,16 +349,16 @@ error: `bitboss-ui check` flags it when `items` is in the same file.
349
349
  ```vue
350
350
  <BbBreadcrumbs
351
351
  :items="[
352
- { key: 'deployments', text: 'Deployments', href: '#deployments' },
353
- { key: 'release', text: 'v2.4.0' },
352
+ { value: 'deployments', label: 'Deployments', href: '#deployments' },
353
+ { value: 'release', label: 'v2.4.0' },
354
354
  ]"
355
355
  >
356
- <template #release="{ text }">
356
+ <template #release="{ label }">
357
357
  <span class="inline-flex items-center gap-1.5">
358
358
  <span
359
359
  class="size-2 rounded-full bg-(--bb-primary)"
360
360
  ></span>
361
- {{ text }}
361
+ {{ label }}
362
362
  </span>
363
363
  </template>
364
364
  </BbBreadcrumbs>
@@ -380,10 +380,10 @@ wider than `…`, pair it with `ellipsis-width`.
380
380
  <BbBreadcrumbs
381
381
  :ellipsis-width="40"
382
382
  :items="[
383
- { key: 'library', text: 'Library', href: '#library' },
384
- { key: 'photos', text: 'Photos', href: '#photos' },
385
- { key: 'albums', text: 'Albums', href: '#albums' },
386
- { key: 'summer', text: 'Summer 2026' },
383
+ { value: 'library', label: 'Library', href: '#library' },
384
+ { value: 'photos', label: 'Photos', href: '#photos' },
385
+ { value: 'albums', label: 'Albums', href: '#albums' },
386
+ { value: 'summer', label: 'Summer 2026' },
387
387
  ]"
388
388
  >
389
389
  <template #divider>
@@ -482,8 +482,8 @@ const items = computed<BbBreadcrumbsItem[]>(() =>
482
482
  path.value.map((name, index) => {
483
483
  const isCurrent = index === path.value.length - 1;
484
484
  return {
485
- key: `${index}-${name}`,
486
- text: name,
485
+ value: `${index}-${name}`,
486
+ label: name,
487
487
  'prepend:icon': 'lucide:folder',
488
488
  ...(isCurrent
489
489
  ? {}
@@ -507,9 +507,9 @@ active-class props are wired for you:
507
507
  ```vue
508
508
  <BbBreadcrumbs
509
509
  :items="[
510
- { key: 'home', text: 'Home', to: { name: 'index' } },
511
- { key: 'team', text: 'Team', to: '/team' },
512
- { key: 'member', text: 'Ada Lovelace' },
510
+ { value: 'home', label: 'Home', to: { name: 'index' } },
511
+ { value: 'team', label: 'Team', to: '/team' },
512
+ { value: 'member', label: 'Ada Lovelace' },
513
513
  ]"
514
514
  />
515
515
  ```
@@ -521,9 +521,9 @@ visit:
521
521
  ```vue
522
522
  <BbBreadcrumbs
523
523
  :items="[
524
- { key: 'dashboard', text: 'Dashboard', href: '/dashboard' },
525
- { key: 'orders', text: 'Orders', href: '/orders', preserveScroll: true },
526
- { key: 'order', text: 'Order #8842' },
524
+ { value: 'dashboard', label: 'Dashboard', href: '/dashboard' },
525
+ { value: 'orders', label: 'Orders', href: '/orders', preserveScroll: true },
526
+ { value: 'order', label: 'Order #8842' },
527
527
  ]"
528
528
  />
529
529
  ```
@@ -597,20 +597,20 @@ import type { BbBreadcrumbsItem } from 'bitboss-ui';
597
597
 
598
598
  const trail: BbBreadcrumbsItem[] = [
599
599
  {
600
- key: 'settings',
601
- text: 'Settings',
600
+ value: 'settings',
601
+ label: 'Settings',
602
602
  href: '#settings',
603
603
  'prepend:icon': 'lucide:settings',
604
604
  },
605
605
  {
606
- key: 'team',
607
- text: 'Team',
606
+ value: 'team',
607
+ label: 'Team',
608
608
  href: '#team',
609
609
  'prepend:icon': 'lucide:users',
610
610
  },
611
611
  {
612
- key: 'members',
613
- text: 'Members',
612
+ value: 'members',
613
+ label: 'Members',
614
614
  'prepend:icon': 'lucide:user-round',
615
615
  },
616
616
  ];
@@ -682,7 +682,7 @@ A `pt` value written in `<script>` (a constant, a preset, a wrapper's
682
682
  when its URL is the page you are on. Do not link the page the user is
683
683
  already on.
684
684
  - The overflow button is a real `button` with a localized, count-aware label
685
- ("Show N hidden breadcrumbs"); its menu is a `BbDropdown` with full keyboard
685
+ ("Show hidden breadcrumbs (N)"); its menu is a `BbDropdown` with full keyboard
686
686
  support — nothing to add on your side.
687
687
  - The dividers are decorative (`aria-hidden`); never encode meaning in them.
688
688
  - `disabled` on the component (or an item) removes `href` and exposes
@@ -728,12 +728,12 @@ States are listed in precedence order: when two are on at once and their entries
728
728
  - `append` — scope: `BbBreadcrumbsEdgeSlotProps` `{ disabled?: boolean }` — Content rendered after the breadcrumb list, in a dedicated append region.
729
729
  - `divider` — scope: `Record<string, never>` — Replaces the default separator rendered between breadcrumb items.
730
730
  - `ellipsis` — scope: `BbBreadcrumbsEllipsisSlotProps` `{ props: { ref: (reference: unknown) => void; }; disabled?: boolean; overflowCount: number; ellipsisWidth: number }` — Replaces the default `…` overflow button shown when items overflow.
731
- - `item:append` — scope: `BbBreadcrumbsItemSlotProps` `{ disabled: boolean; index: number; item: Item; text?: string }` — Content rendered after **every** breadcrumb item's link/button. Generic fallback below a per-item `<key>:append` slot and above the item's `append:icon`.
732
- - `item:prepend` — scope: `BbBreadcrumbsItemSlotProps` `{ disabled: boolean; index: number; item: Item; text?: string }` — Content rendered before **every** breadcrumb item's link/button, in the leading edge region. Generic fallback: a per-item `<key>:prepend` slot takes precedence, and the item's `prepend:icon` is used when neither slot is present.
731
+ - `item:append` — scope: `BbBreadcrumbsItemSlotProps` `{ disabled: boolean; index: number; item: Item; label?: string }` — Content rendered after **every** breadcrumb item's link/button. Generic fallback below a per-item `<value>:append` slot and above the item's `append:icon`.
732
+ - `item:prepend` — scope: `BbBreadcrumbsItemSlotProps` `{ disabled: boolean; index: number; item: Item; label?: string }` — Content rendered before **every** breadcrumb item's link/button, in the leading edge region. Generic fallback: a per-item `<value>:prepend` slot takes precedence, and the item's `prepend:icon` is used when neither slot is present.
733
733
  - `prepend` — scope: `BbBreadcrumbsEdgeSlotProps` `{ disabled?: boolean }` — Content rendered before the breadcrumb list, in a dedicated prepend region.
734
- - `#<key>` (named from data) — scope: `BbBreadcrumbsItemSlotProps` — One crumb's label, by its `key` through `slotKey`; falls back to `item.text`. A crumb folded into the overflow menu follows BbDropdown's slot rules instead. Reserved keys (their slot is one of this component's own, so a key spelled like them is an error): `append`, `divider`, `ellipsis`, `item`, `prepend`.
735
- - `#<key>:prepend` (named from data) — scope: `BbBreadcrumbsItemSlotProps` — The glyph before one crumb's label; beats `item:prepend`, which beats its `prepend:icon`.
736
- - `#<key>:append` (named from data) — scope: `BbBreadcrumbsItemSlotProps` — The glyph after one crumb's label; beats `item:append`, which beats its `append:icon`.
734
+ - `#<value>` (named from data) — scope: `BbBreadcrumbsItemSlotProps` — One crumb's label, by its `value` through `slotKey`; falls back to `item.label`. A crumb folded into the overflow menu follows BbDropdown's slot rules instead (the same `#<value>` names). Reserved names (their slot is one of this component's own, so an item value or column key spelled like them is an error): `append`, `divider`, `ellipsis`, `item`, `prepend`.
735
+ - `#<value>:prepend` (named from data) — scope: `BbBreadcrumbsItemSlotProps` — The glyph before one crumb's label; beats `item:prepend`, which beats its `prepend:icon`.
736
+ - `#<value>:append` (named from data) — scope: `BbBreadcrumbsItemSlotProps` — The glyph after one crumb's label; beats `item:append`, which beats its `append:icon`.
737
737
 
738
738
  ## Component tree
739
739
 
@@ -747,7 +747,7 @@ States are listed in precedence order: when two are on at once and their entries
747
747
  - `BbBreadcrumbs` _(this component)_ — its own template binds: `item` → `li.bb-breadcrumbs__item`, `icon` → `BbIcon`, `text` → `span.bb-breadcrumbs__text`
748
748
  - `BbBaseButton` _(public — [contract](./BbBaseButton.md))_ — its own pt parts (`BbBaseButton`): `root` → `RouterComponent`, `root` → `a`, `root` → `component`; also mounts `RouterComponent`
749
749
  - `BbDropdown` _(public — [contract](./BbDropdown.md))_ — its own pt parts (`BbDropdown`): `panel` → `CommonPopover`, `root` → `CommonPopover`, `header` → `div.bb-dropdown__header`, `list` → `span.bb-dropdown__list`, `footer` → `div.bb-dropdown__footer`; documented CSS variables: `--menu-inset`; also mounts `CommonPopover`, `DropdownPipelineResolver`
750
- - `BbDropdownList` _(internal — not importable, reach it through `BbDropdown`)_ — also mounts `BbBaseButton`, `BbIcon`, `ErrorIcon`, `CommonPopover`, `BbDropdownList`
750
+ - `BbDropdownList` _(internal — not importable, reach it through `BbDropdown`)_ — also mounts `BbIcon`, `ErrorIcon`, `CommonPopover`, `BbDropdownList`
751
751
  - `BbBadge` _(public — [contract](./BbBadge.md))_ — its own pt parts (`BbBadge`): `spinner` → `BbSpinner`, `icon` → `BbIcon`, `clear` → `button.bb-badge__clear`; documented CSS variables: `--bg`, `--fg`, `--bw`, `--ring-color`, `--ring-size`, `--min-size-md`, `--min-size`, `--elev`, `--r`, `--fs`, `--icon-size`, `--gap`, `--px`, `--clear-size`, `--bg-disabled`, `--fg-disabled`, `--border-disabled`, `--pad-left`; also mounts `BbIcon`, `BbSpinner`, `BadgeBodyContent`
752
752
  - `AdaptiveDropdown` _(internal — not importable, reach it through `BbDropdown`)_ — hands `BbOffCanvas` the pt map `{ header: 'header', footer: 'footer', panel: 'root', sheet: 'root' }` (ours → theirs); also mounts `BbSmoothHeight`, `BbDropdownList`
753
753
  - `BbOffCanvas` _(public — [contract](./BbOffCanvas.md))_ — its own pt parts (`BbOffCanvas`): `header` → `div.bb-offcanvas__header`, `title` → `span.bb-offcanvas__title`, `description` → `p.bb-offcanvas__description`, `close` → `CloseButton`, `content` → `div.bb-offcanvas__content`, `footer` → `div.bb-offcanvas__footer`; documented CSS variables: `--stack-x`, `--stack-fill`, `--stack-transition-duration`, `--px`, `--handle-w`, `--handle-h`, `--handle-bg`, `--safe-top`, `--close-size`
@@ -410,9 +410,15 @@ live example below uses this shape). The mistake above only becomes possible
410
410
  once that loop is unrolled into separate elements with their own literal
411
411
  strings.
412
412
 
413
- Add `group` to fuse adjacent buttons into one visual segment control. It is
414
- purely visual (shared borders/radius between siblings) — each button keeps its
415
- own semantics, and there is no arrow-key roving between them.
413
+ Add `group` to fuse adjacent buttons into one visual segment control (shared
414
+ borders and radius between siblings). Each button keeps its own semantics: a
415
+ toggle still announces as a toggle button with its pressed state. Adjacent
416
+ `group` **toggles** are also one Tab stop: Tab lands on the pressed button (or
417
+ the one last focused, or the first), ArrowLeft / ArrowRight move between the
418
+ buttons (mirrored under `dir="rtl"`, wrapping at the ends), Home / End jump to
419
+ the first / last, and Space / Enter toggle. Disabled and loading buttons are
420
+ skipped. Any other element between two buttons splits them into two sets, and
421
+ `group` buttons without a `v-model` keep one Tab stop each.
416
422
 
417
423
  **Exclusive toggle groups**
418
424
 
@@ -494,6 +500,11 @@ const activeView = ref<IssueView>('list');
494
500
  </script>
495
501
  ```
496
502
 
503
+ A toggle that is on carries `aria-pressed="true"` and the class
504
+ `bb-button--pressed`. Restyle that state with `pt:root:pressed` (or
505
+ `pt:icon:pressed`, `pt:text:pressed`), not with a selector of your own: it is
506
+ the state's contract.
507
+
497
508
  Listen to `update:modelValue` only if you need side effects; state itself is
498
509
  handled. For form-ish multi-selection prefer `BbCheckboxGroup` /
499
510
  `BbRadioGroup`; toggle buttons are for immediate, tool-bar-like state.
@@ -835,8 +846,11 @@ label span). Typography inherits from `root`, so reach for `text` only when a
835
846
  class must apply to the label ALONE — `truncate` on a long label that must not
836
847
  clip the icons beside it. That span also carries the margin the label slides by
837
848
  while the spinner is in, so a margin of your own fights the slide. States:
838
- `loading`, `disabled`. A name outside that list is a type error and an ESLint
839
- error.
849
+ `loading`, `disabled`, `pressed` (a `v-model` toggle that is on). A name
850
+ outside that list is a type error and an ESLint error. There is no `active`
851
+ state: a pointer press is Tailwind's `active:` variant (`pt:root="active:scale-95"`).
852
+ There is no `current` state either: a link to the current route is
853
+ `active-class` / `exact-active-class` (see Active state above).
840
854
 
841
855
  **pt: a part, a part while loading, the object form**
842
856
 
@@ -1043,7 +1057,10 @@ Gotchas (real behavior, verified against source):
1043
1057
  attribute and drops yours. A hand-rolled toggle (`:aria-pressed` plus a
1044
1058
  `variant` swap) therefore looks right and is invisible to assistive tech.
1045
1059
  Use `v-model` — see [Toggle buttons](#toggle-buttons). Dev builds warn.
1046
- - `group` fuses looks only; it adds no radio semantics or arrow-key navigation.
1060
+ - `group` adds no radio semantics: an exclusive set is still toggle buttons
1061
+ with `aria-pressed`. Adjacent `group` toggles share one Tab stop and move
1062
+ with the arrow keys (see [Toggle buttons](#toggle-buttons)); keep a set's
1063
+ buttons side by side in one parent, since anything between them splits it.
1047
1064
  - Responsive `size` maps change height/font/gap per breakpoint; padding, icon
1048
1065
  size and radius follow the `default` entry.
1049
1066
  - Auto-loading tracks the promise **returned** from `@click`; a handler that
@@ -1072,6 +1089,8 @@ Anti-patterns:
1072
1089
  report one as an error.
1073
1090
  - Toggles expose `aria-pressed` (`true`/`false`) automatically — never add your
1074
1091
  own.
1092
+ - A set of adjacent `group` toggles is one Tab stop (roving `tabindex`), with
1093
+ ArrowLeft / ArrowRight / Home / End inside it — the APG toolbar pattern.
1075
1094
  - While loading: `aria-disabled="true"`, `tabindex="-1"`, and a localized
1076
1095
  visually-hidden loading announcement.
1077
1096
  - Disabled links render with `role="link"`, `aria-disabled="true"`, no `href`,
@@ -1090,7 +1109,7 @@ Anti-patterns:
1090
1109
 
1091
1110
  | Prop | Type | Default | Required | Description |
1092
1111
  | --- | --- | --- | --- | --- |
1093
- | `pt:<part>`, `pt:<part>:<state>`, `pt` | `PtValue` | | | Passthrough — a class list, or `{ class, style, attrs }`, bound to one named part of the component; the state form applies only while that state is on. Parts: `icon`, `root`, `spinner`, `text`. States: `disabled`, `loading`. What each one is: _Passthrough parts and states_ below. `pt` is the object form with the same keys minus the prefix (`{ icon: '…', 'icon:loading': '…' }`). See `guides/passthrough.md`. In `<script>` a `pt` value is typed `BbButtonProps['pt']` (`PtValue` is not exported): § Typing `pt` in `<script>`. |
1112
+ | `pt:<part>`, `pt:<part>:<state>`, `pt` | `PtValue` | | | Passthrough — a class list, or `{ class, style, attrs }`, bound to one named part of the component; the state form applies only while that state is on. Parts: `icon`, `root`, `spinner`, `text`. States: `disabled`, `loading`, `pressed`. What each one is: _Passthrough parts and states_ below. `pt` is the object form with the same keys minus the prefix (`{ icon: '…', 'icon:loading': '…' }`). See `guides/passthrough.md`. In `<script>` a `pt` value is typed `BbButtonProps['pt']` (`PtValue` is not exported): § Typing `pt` in `<script>`. |
1094
1113
  | `activeClass` | `string \| undefined` | | | Class to apply when the link is active. |
1095
1114
  | `append:icon` | `string \| undefined` | | | Icon to be added on the right of the text. |
1096
1115
  | `ariaCurrentValue` | `"page" \| "step" \| "location" \| "date" \| "time" \| "true" \| "false" \| undefined` | `'page'` | | Value passed to the attribute `aria-current` when the link is exact active. |
@@ -1107,7 +1126,7 @@ Anti-patterns:
1107
1126
  | `except` | `string[] \| undefined` | | | Inertia: the inverse of `only` — properties to EXCLUDE from a partial reload. Pass one or the other, not both. |
1108
1127
  | `external` | `boolean \| undefined` | `false` | | Forces an `href` link to render as a plain `<a>` (native navigation), bypassing Inertia/router interception — same intent as Nuxt's `external`. A native-anchor signal alongside `target` and `download`. |
1109
1128
  | `falseValue` | `any` | `false` | | Value emitted when the toggle is deactivated. |
1110
- | `group` | `boolean \| undefined` | `false` | | Identifies the button as part of a button group. |
1129
+ | `group` | `boolean \| undefined` | `false` | | Identifies the button as part of a button group: adjacent `group` buttons fuse into one segment (shared borders and radius). Adjacent `group` toggles (each with a `v-model`) are also one Tab stop, with ArrowLeft / ArrowRight / Home / End moving between them. |
1111
1130
  | `headers` | `object \| undefined` | | | Additional HTTP headers forwarded to Inertia when navigating via `href` in an Inertia-enabled app. |
1112
1131
  | `href` | `string \| undefined` | | | Returns the hyperlink's URL. Can be set, to change the URL. |
1113
1132
  | `icon` | `string \| undefined` | | | Used when only an icon with no text should be displayed. |
@@ -1160,6 +1179,7 @@ States are listed in precedence order: when two are on at once and their entries
1160
1179
 
1161
1180
  | State | When it is on |
1162
1181
  | --- | --- |
1182
+ | `pressed` | Component-wide: a toggle button (`v-model`) is on — `aria-pressed="true"`, `--pressed` on the root. |
1163
1183
  | `disabled` | Component-wide: the button is `disabled`. |
1164
1184
  | `loading` | Component-wide: `loading` is on — the spinner shows and the button ignores the pointer. |
1165
1185
 
@@ -447,8 +447,6 @@ for the children.
447
447
  v-model="granted"
448
448
  class="pl-5"
449
449
  hide-legend
450
- item-text="label"
451
- item-value="value"
452
450
  :items="scopes"
453
451
  legend="Scopes"
454
452
  name="scope-list"
@@ -58,18 +58,14 @@ Reach elsewhere when the shape differs:
58
58
 
59
59
  ### Items are your domain objects
60
60
 
61
- **Object items need `item-text`.** Without it each label is
62
- `JSON.stringify(item)`, and without `item-value` the whole object is the value.
63
- `{ label, value }` items take both:
61
+ **`{ label, value }` and `{ text, value }` items work as they are; any other
62
+ shape needs `item-text` / `item-value`.** With neither prop an option reads its
63
+ own `label` (else its own `text`) and its own `value`, whatever it holds (`null`
64
+ included). An object with none of those fields falls back to
65
+ `JSON.stringify(item)` as text and the whole object as value.
64
66
 
65
67
  ```vue
66
- <BbCheckboxGroup
67
- v-model="plans"
68
- legend="Plans"
69
- :items="options"
70
- item-text="label"
71
- item-value="value"
72
- />
68
+ <BbCheckboxGroup v-model="plans" legend="Plans" :items="options" />
73
69
  ```
74
70
 
75
71
  Pass backend rows straight to `items` and select the display text and stored
@@ -92,7 +88,6 @@ mapped (here, channel ids), which is what you send back to the server.
92
88
  v-model="selected"
93
89
  compact
94
90
  hint="Choose one or more channels."
95
- item-text="label"
96
91
  item-value="id"
97
92
  :items="channels"
98
93
  legend="Channels"
@@ -141,7 +136,8 @@ Two items that resolve to the **same** `item-value` collapse to one option
141
136
 
142
137
  #### Additional row fields: `item-props`
143
138
 
144
- `item-text` and `item-value` are the option's label and identity. Anything
139
+ The option's text and value (from `item-text` / `item-value`, or the item's own
140
+ `label` and `value`) are its label and identity. Anything
145
141
  **additional** about a row comes from `item-props` — for option groups that is
146
142
  one field, `description`: a muted line **under** the option's label, beside the
147
143
  control.
@@ -333,7 +329,6 @@ on the row, feed that field to the predicate.
333
329
  v-model="selected"
334
330
  compact
335
331
  hint="SMS unlocks once a sender number is configured."
336
- item-text="label"
337
332
  item-value="id"
338
333
  :items="channels"
339
334
  legend="Channels"
@@ -665,7 +660,6 @@ border) — floating mode is not supported for checkbox groups.
665
660
  ? 'Select at least one contact method.'
666
661
  : undefined
667
662
  "
668
- item-text="label"
669
663
  item-value="id"
670
664
  :items="options"
671
665
  legend="Contact permissions"
@@ -731,7 +725,6 @@ Read-only, with no cleanup code.
731
725
  <BbRadioGroup
732
726
  v-model="role"
733
727
  compact
734
- item-text="label"
735
728
  item-value="id"
736
729
  :items="roles"
737
730
  legend="Token role"
@@ -745,7 +738,6 @@ Read-only, with no cleanup code.
745
738
  :deps-debounce-time="150"
746
739
  enforce-coherence
747
740
  hint="Scopes outside the selected role are removed automatically."
748
- item-text="label"
749
741
  item-value="id"
750
742
  :items="loadScopes"
751
743
  legend="Scopes"
@@ -947,8 +939,9 @@ for a preset that fits any row type (never `<any>`), not an imported
947
939
  `disabled`.
948
940
  - `readonly` still submits its values and stays focusable; use `disabled` only
949
941
  for choices that genuinely don't apply.
950
- - Don't pre-map `items` into `{ label, value }` — pass raw rows and resolve with
951
- `item-text` / `item-value`.
942
+ - Don't pre-map domain rows into `{ label, value }` copies — pass raw rows and
943
+ resolve with `item-text` / `item-value` (a list that already is
944
+ `{ label, value }` needs neither).
952
945
  - A native (non-JS) form post needs `name`: the group generates none, unlike
953
946
  `BbRadioGroup`, where the name is what ties the options together. Independent
954
947
  boxes need no tie, so with `v-model` alone leave it off.
@@ -1004,8 +997,8 @@ for a preset that fits any row type (never `<any>`), not an imported
1004
997
  | `itemProps` | `BbOptionGroupItemProps<T> \| undefined` | | | ADDITIONAL row fields resolved from each item — never its text or value (those stay on `itemText` / `itemValue`). Option groups accept one field: - `description` — a muted line under the option label, beside the control; it may wrap. Either an object with a path or getter per field (`{ description: 'email' }`) or a function returning the fields (`(item) => ({ description: item.email })`). Without it no field renders — an item's own `description` is never read implicitly — and an empty value renders nothing for that item. The description is announced as the option's description, never part of its name. To disable individual options use `selectable`. |
1005
998
  | `itemReverse` | `boolean \| undefined` | `false` | | Swaps each row's input and label from their natural order (input first), in every `item-layout`. `reverse` swaps the legend and the options instead. |
1006
999
  | `items` | `T[] \| ((context: BbCheckboxGroupItemsContext) => T[] \| Promise<T[]>)` | | yes | The options: an array, or a provider function called with ONE context object and returning the rows, sync or async. The context carries: - `reason` — why this call happened: `'initial'` (the first load, on mount), `'dependencies'` (a `dependencies` entry or the `items` function changed; a retry arrives this way) or `'model'` (the model changed from outside and the options cannot resolve it). The group has no search field, so it never passes `query`; - `modelValue` — the `v-model` as-is; - `signal` — an `AbortSignal`, aborted when a newer call starts or the group is disposed; pass it to every request. A provider signals a failure by THROWING, never by returning `[]`: the rows are cleared, nothing is pruned, and `#empty` receives the `error` (`failed-text` is shown). Zero-argument providers keep working. Annotate the parameter `BbCheckboxGroupItemsContext` (`BbSwitchGroupItemsContext` on a switch group, the same shape). |
1007
- | `itemText` | `ItemAccessor<T, string> \| undefined` | `JSON.stringify(item)` | | Defines a path that returns a property of the object to use as text or a function that returns a string. |
1008
- | `itemValue` | `ItemAccessor<T> \| undefined` | `the whole item` | | Defines a path that returns a property of the object to use as value or a function that returns any value. |
1000
+ | `itemText` | `ItemAccessor<T, string> \| undefined` | `own `label`, else `text`, else `JSON.stringify(item)`` | | Defines a path that returns a property of the object to use as text or a function that returns a string. Unset: own `label`, else `text` (`{ label, value }` needs no accessor). |
1001
+ | `itemValue` | `ItemAccessor<T> \| undefined` | `own `value`, else the whole item` | | Defines a path that returns a property of the object to use as value or a function that returns any value. Unset: own `value`, even `null`. |
1009
1002
  | `labelAlign` | `'top'` \| `'center'` \| `'bottom'` | | | Vertical position of the label block in a side-by-side row; not `labelPosition`, the horizontal one. Omitted, the label's first line meets the control's. |
1010
1003
  | `layout` | `FieldLayout \| undefined` | | | How the label and the input sit together: `'vertical'`, `'horizontal'` (50/50), `'auto'`, `'label-fill'` (the label takes the free space, the input keeps its size), `'input-fill'` (the other way round), or a two-word ratio pattern like `'xx xxxxx'`. |
1011
1004
  | `legend` | `string` | | yes | Text content of the legend. |
@@ -525,7 +525,7 @@ A `pt` value written in `<script>` (a constant, a preset, a wrapper's
525
525
  | Prop | Type | Default | Required | Description |
526
526
  | --- | --- | --- | --- | --- |
527
527
  | `pt:<part>`, `pt:<part>:<state>`, `pt` | `PtValue` | | | Passthrough — a class list, or `{ class, style, attrs }`, bound to one named part of the component; the state form applies only while that state is on. Parts: `content`, `root`. States: `open`. What each one is: _Passthrough parts and states_ below. `pt` is the object form with the same keys minus the prefix (`{ icon: '…', 'icon:loading': '…' }`). See `guides/passthrough.md`. In `<script>` a `pt` value is typed `BbCollapsibleProps['pt']` (`PtValue` is not exported): § Typing `pt` in `<script>`. |
528
- | `eager` | `boolean \| undefined` | `false` | | Prevents rendering content before it's made visible. |
528
+ | `eager` | `boolean \| undefined` | `false` | | Renders the content at mount, while closed, instead of on the first open. Closed content is `inert` and `aria-hidden` either way. |
529
529
  | `modelValue` | `boolean \| undefined` | `false` | | Used by v-model to trigger opening / closing the collapsible. Optional, matching the runtime: `withDefaults` supplies `false`, so an omitted binding renders closed and Vue never warns. It was typed required while carrying that default, which made the manifest publish a row that was `required: true` AND `default: false` — a contradiction that read as a generator bug. |
530
530
  | `tag` | `'div'` \| `'span'` | `"span"` | | Element rendered as the root, and mirrored by the inner animating element — so the pair is span-in-span or div-in-div, both valid. Keep the default inside phrasing content (a `<p>`); use `'div'` when the body is block content (paragraphs, lists, forms), which a `span` may not contain. |
531
531
  | `transitionDuration` | `number \| undefined` | `250` | | How long the transition has to last in milliseconds |
@@ -760,7 +760,7 @@ A `pt` value written in `<script>` (a constant, a preset, a wrapper's
760
760
  | `boundary` | `ElementOrComponentRefOrSelector \| undefined` | | | Constrains the popover within a bounding element. Accepts an HTMLElement, a Vue component ref, or a CSS selector string. |
761
761
  | `disabled` | `boolean \| undefined` | `false` | | Disable all interaction (activator and palette). |
762
762
  | `disableFlip` | `boolean \| undefined` | `false` | | Disables the automatic flip to the opposite side when the popover would overflow (flipping is on by default). |
763
- | `eager` | `boolean \| undefined` | `false` | | Prevents rendering content before it's made visible. |
763
+ | `eager` | `boolean \| undefined` | `false` | | Renders the palette panel at mount instead of on the first open (the phone sheet's too). |
764
764
  | `eyeDropper` | `boolean \| undefined` | `false` | | Show an eyedropper button inside the palette to sample any color on screen. Uses the native EyeDropper API — hidden automatically on unsupported browsers. |
765
765
  | `label` | `string \| undefined` | | | Accessible label. The activator is named by it followed by the activator's own text, through `aria-labelledby`. Defaults to the locale string for "Open color picker" when omitted. |
766
766
  | `modelValue` | `string \| null` | | yes | v-model: the current color as a `#RRGGBB` hex string (or `#RRGGBBAA` when `alpha` is enabled), or `null` when empty. |
@@ -654,6 +654,14 @@ const removeMember = async () => {
654
654
  When the portal owns its own action buttons, pass `actions: false` to hide the
655
655
  standard footer and resolve from inside the slot with its `yes` / `no` helpers.
656
656
 
657
+ **Names are checked.** `bitboss-ui check` and the ESLint rule
658
+ `bitboss-ui/portal-names` (in `recommended`) read every literal
659
+ `confirm({ portal: 'name' })` in your scripts against the
660
+ `<BbConfirmPortal name>`s in your templates: a name no file declares fails,
661
+ with a did-you-mean, and `bitboss-ui/unused-portal` warns on a portal nothing
662
+ opens. A `portal` held in a variable, or `confirm(options)`, is never judged.
663
+ The slot's `props` is `any` per key, so `props.member.name` needs no cast.
664
+
657
665
  ### Size, fullscreen and focus
658
666
 
659
667
  - `size` picks a maximum-width preset (`'xs'` … `'2xl'`, resolvable through
@@ -20,7 +20,7 @@
20
20
 
21
21
  ## Slots
22
22
 
23
- - `default` — scope: `{ yes: () => void; no: () => void; props: Record<string, unknown>; }`
23
+ - `default` — scope: `BbConfirmPortalSlotProps` `{ props: P; yes: () => void; no: () => void }`
24
24
 
25
25
  ## See Also
26
26
 
@@ -179,7 +179,9 @@ entirely, reach for `disableWriting` (below), not `range`.
179
179
  The value is edited as three separate inputs — day, month, year — not one free
180
180
  string. Their **order and separator follow `config.locale`**, read from the
181
181
  locale's own format hint: `en` renders `MM/DD/YYYY`, `it` `DD/MM/YYYY`, `de`
182
- `TT.MM.JJJJ`, `ja` `YYYY/MM/DD`. Typing is forgiving:
182
+ `TT.MM.JJJJ`, `ja` `YYYY/MM/DD`. A region writes its own order with its
183
+ language's letters: `en-GB` `DD/MM/YYYY`, `fr-CA` `AAAA-MM-JJ`. Typing is
184
+ forgiving:
183
185
 
184
186
  - digits **auto-advance** to the next segment when a segment fills (or can't
185
187
  take another digit — e.g. `4` in a day segment becomes `04` and moves on);
@@ -214,7 +216,7 @@ to catch config mistakes early — always pass the `YYYY-MM-DD` shape.
214
216
  For non-contiguous rules (no weekends, no holidays, only in-stock slots), pass a
215
217
  `selectable` predicate: it receives each date string and returns `false` to
216
218
  disable that day. The grid's week starts on the locale's day (Monday for
217
- `it` or `de`, Sunday for bare `en` and `pt`); `firstDayOfWeek` pins it
219
+ `it`, `de` or `en-GB`, Sunday for bare `en`, `pt` and `en-CA`); `firstDayOfWeek` pins it
218
220
  (`0` = Sunday … `6` = Saturday) when the app's week differs from its
219
221
  language's.
220
222
 
@@ -402,14 +402,7 @@ dismissed invite doesn't resurface half-typed:
402
402
  placeholder="teammate@company.com"
403
403
  type="email"
404
404
  />
405
- <BbSelect
406
- v-model="role"
407
- compact
408
- item-text="label"
409
- item-value="value"
410
- :items="roles"
411
- label="Role"
412
- />
405
+ <BbSelect v-model="role" compact :items="roles" label="Role" />
413
406
  <p class="m-0 text-xs text-(--bb-text-muted)">
414
407
  They'll get an email with a link that expires in 7 days.
415
408
  </p>