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
@@ -1,19 +1,20 @@
1
1
  ---
2
2
  title: 'Migration v2→v3: BbDropdownButton'
3
- summary: autoLoading renamed to disableAutoLoading, disabledWhileLoading and theme removed.
3
+ summary: autoLoading renamed to disableAutoLoading, disabledWhileLoading and theme removed; items are { label, value } rows like BbDropdown's.
4
4
  ---
5
5
 
6
6
  # BbDropdownButton — v2 → v3
7
7
 
8
8
  ## Changes
9
9
 
10
- | v2 | v3 | Kind |
11
- | ------------------------------------------------- | ------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------- |
12
- | `autoLoading?: boolean` (default `true`) | `disableAutoLoading?: boolean` (default `false`) | rename, polarity inverted — same effective default |
13
- | `disabledWhileLoading?: boolean` (default `true`) | removed | always disabled while loading now; `BbButton`'s `interactive-while-loading` is the escape hatch on plain buttons |
14
- | `theme?: string` | removed | use `variant` (shares `ButtonVariantType`) |
15
- | `arrowPadding` | removed | dead prop (no arrow on dropdown surfaces) |
16
- | — | `toggle:icon?: IconType` | additive — replaces the default toggle chevron (spelled `right:icon` up to beta.33) |
10
+ | v2 | v3 | Kind |
11
+ | ------------------------------------------------- | ------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------- |
12
+ | `autoLoading?: boolean` (default `true`) | `disableAutoLoading?: boolean` (default `false`) | rename, polarity inverted — same effective default |
13
+ | `disabledWhileLoading?: boolean` (default `true`) | removed | always disabled while loading now; `BbButton`'s `interactive-while-loading` is the escape hatch on plain buttons |
14
+ | `theme?: string` | removed | use `variant` (shares `ButtonVariantType`) |
15
+ | `arrowPadding` | removed | dead prop (no arrow on dropdown surfaces) |
16
+ | — | `toggle:icon?: IconType` | additive — replaces the default toggle chevron (spelled `right:icon` up to beta.33) |
17
+ | items `{ key, text }` (v2, and v3 up to beta.48) | items `{ value, label }` — the same rows as `BbDropdown`; the main button reads `items[0].label` | hard rename — `npx bitboss-ui check --fix` rewrites literal items; see [bb-dropdown.md](./bb-dropdown.md) |
17
18
 
18
19
  ## Edits
19
20
 
@@ -1,24 +1,25 @@
1
1
  ---
2
2
  title: 'Migration v2→v3: BbDropdown'
3
- summary: Items now expect text as the label and can carry variants/submenus; arrowPadding removed; adaptive mobile sheet on by default.
3
+ summary: Rows are { label, value } (v2 and v3 up to beta.48 { key, text }), groups are named by id; rows can carry variants/submenus; arrowPadding removed; adaptive mobile sheet on by default.
4
4
  ---
5
5
 
6
6
  # BbDropdown / `v-bb-dropdown` — v2 → v3
7
7
 
8
8
  ## Changes
9
9
 
10
- | v2 | v3 | Kind |
11
- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
12
- | items extended `BaseButtonProps` | items extend `BbBaseButtonProps` | transparent unless you typed items with the old export |
13
- | item label conventions | `text` is the expected label field; `description` renders a second line | check items built as plain link objects |
14
- | `arrowPadding` | removed | dead prop (dropdowns never show an arrow) |
15
- | exposed `loading` (via template ref) | removed | read in-flight async state from the activator slot scope (`loading`) instead of a component ref. **⚠ silent**: a stale `dropdownRef.value?.loading` is `undefined`. |
16
- | — | item `variant?: DropdownItemVariantType` (`default, destructive`), recursive `items` submenus, config-driven **groups** (titled/selectable/async sections via `BbDropdownGroup`), `adaptive` + `offCanvasProps`, `anchor` | additive |
17
- | async (pipeline) group rows copied `BbBaseButton` props, icons, `variant`, `onClick` and `disabled` off each raw item | a fetched row takes text/value from `itemText`/`itemValue` and **every other field only from `itemProps`**; per-row `disabled` becomes a `selectable` predicate on the group | **⚠ silent**: a raw `href`/`prepend:icon`/`disabled` field is now ignored. Move it: `itemProps: { href: 'url', 'prepend:icon': 'icon' }`, `selectable: (item) => !item.disabled` |
18
- | floating wrapper/bubble as `<span>` | rendered as `<div>` | DOM only — the menu is block content. Class hooks unchanged; only element selectors like `span.bb-common-popover` break. |
19
- | _(v3 prereleases up to beta.24 only; v2 had no panel)_ `span.bb-dropdown__panel` nested inside `.bb-common-popover__bubble` | one `<div>` carries both classes; `__header` / `__list` / `__footer` are its direct children | DOM only, and only for projects already on a v3 prerelease. Every class name survives and the menu's sizes are unchanged; `span.bb-dropdown__panel` and `.bb-common-popover__bubble > .bb-dropdown__panel` now match nothing — write `.bb-dropdown__panel` alone. `pt:panel` used to reach an unpainted box inside the border; it now reaches the bordered surface itself. Submenus are unchanged. |
20
- | _(v3 prereleases up to beta.30)_ a shared `item:append` lost to a row's `append:icon`; a named `#<key>:append` replaced the check and the submenu chevron; every row of a selectable group reserved its trailing region for the check | each row edge holds **one** occupant, strongest first. Trailing: the check (selected row only) → `#<key>:append` → the submenu chevron → `#<groupKey>:item:append` → `item:append` → `append:icon`. Leading: `#<key>:prepend` → `#<groupKey>:item:prepend` → `item:prepend` → `prepend:icon` | **⚠ silent**: an `item:append` now replaces the rows' `append:icon`; a `#<key>:append` on the selected row gives way to the check; unselected rows of a selectable group now show their `append:icon` or append slot. Nothing renders side by side — to keep an icon next to your slot content, draw both in the slot |
21
- | _(v3 prereleases up to beta.33; v2 had no selectable groups)_ re-clicking the selected row of a single (non-`multiple`) selectable group cleared it (`item:unselected`, `v-model` → `null`) | the group behaves like a radio group: a re-click keeps the pick; the group field `clearable: true` restores clear-on-re-click | **⚠ silent**: no `item:unselected` and no `null` on a re-click. Add `clearable: true` to the group where click-to-clear was the UX |
10
+ | v2 | v3 | Kind |
11
+ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
12
+ | items extended `BaseButtonProps` | items extend `BbBaseButtonProps` | transparent unless you typed items with the old export |
13
+ | item label conventions | `text` is the expected label field; `description` renders a second line | check items built as plain link objects |
14
+ | `arrowPadding` | removed | dead prop (dropdowns never show an arrow) |
15
+ | exposed `loading` (via template ref) | removed | read in-flight async state from the activator slot scope (`loading`) instead of a component ref. **⚠ silent**: a stale `dropdownRef.value?.loading` is `undefined`. |
16
+ | — | item `variant?: DropdownItemVariantType` (`default, destructive`), recursive `items` submenus, config-driven **groups** (titled/selectable/async sections via `BbDropdownGroup`), `adaptive` + `offCanvasProps`, `anchor` | additive |
17
+ | async (pipeline) group rows copied `BbBaseButton` props, icons, `variant`, `onClick` and `disabled` off each raw item | a fetched row takes text/value from `itemText`/`itemValue` and **every other field only from `itemProps`**; per-row `disabled` becomes a `selectable` predicate on the group | **⚠ silent**: a raw `href`/`prepend:icon`/`disabled` field is now ignored. Move it: `itemProps: { href: 'url', 'prepend:icon': 'icon' }`, `selectable: (item) => !item.disabled` |
18
+ | floating wrapper/bubble as `<span>` | rendered as `<div>` | DOM only — the menu is block content. Class hooks unchanged; only element selectors like `span.bb-common-popover` break. |
19
+ | _(v3 prereleases up to beta.24 only; v2 had no panel)_ `span.bb-dropdown__panel` nested inside `.bb-common-popover__bubble` | one `<div>` carries both classes; `__header` / `__list` / `__footer` are its direct children | DOM only, and only for projects already on a v3 prerelease. Every class name survives and the menu's sizes are unchanged; `span.bb-dropdown__panel` and `.bb-common-popover__bubble > .bb-dropdown__panel` now match nothing — write `.bb-dropdown__panel` alone. `pt:panel` used to reach an unpainted box inside the border; it now reaches the bordered surface itself. Submenus are unchanged. |
20
+ | _(v3 prereleases up to beta.30)_ a shared `item:append` lost to a row's `append:icon`; a named `#<key>:append` replaced the check and the submenu chevron; every row of a selectable group reserved its trailing region for the check | each row edge holds **one** occupant, strongest first. Trailing: the check (selected row only) → `#<key>:append` → the submenu chevron → `#<groupKey>:item:append` → `item:append` → `append:icon`. Leading: `#<key>:prepend` → `#<groupKey>:item:prepend` → `item:prepend` → `prepend:icon` | **⚠ silent**: an `item:append` now replaces the rows' `append:icon`; a `#<key>:append` on the selected row gives way to the check; unselected rows of a selectable group now show their `append:icon` or append slot. Nothing renders side by side — to keep an icon next to your slot content, draw both in the slot |
21
+ | _(v3 prereleases up to beta.33; v2 had no selectable groups)_ re-clicking the selected row of a single (non-`multiple`) selectable group cleared it (`item:unselected`, `v-model` → `null`) | the group behaves like a radio group: a re-click keeps the pick; the group field `clearable: true` restores clear-on-re-click | **⚠ silent**: no `item:unselected` and no `null` on a re-click. Add `clearable: true` to the group where click-to-clear was the UX |
22
+ | rows `{ key, text }` (v2, and v3 up to beta.48); groups `{ key, label }` (v3 only); a single-choice group with a `null` model showed no row checked | rows `{ value, label }` — `value` is the identity, any type (the selection value, compared by hash; the `#<value>` slots; the submenu id seed); groups `{ id, label }` (the `<BbDropdownGroup id>` word; `#<groupId>:item`); a `null` model checks the row whose `value` is `null`; slot scopes and `useBbDropdownContext` say `label` / `id` | hard rename, no alias — `npx bitboss-ui check --fix` (ESLint `bitboss-ui/no-renamed-item-field`) rewrites literal items; rows built in `.ts` or mapped from data need a hand pass (typed ones fail `vue-tsc`) |
22
23
 
23
24
  ## Edits
24
25
 
@@ -26,7 +27,7 @@ Fetched groups — raw-item fields move into `itemProps`:
26
27
 
27
28
  ```diff
28
29
  {
29
- key: 'assignee',
30
+ id: 'assignee',
30
31
  - selectable: true,
31
32
  items: () => api.users(),
32
33
  itemText: 'name',
@@ -11,4 +11,5 @@ surface, one set of changes. Everything is in
11
11
  `legendPosition`, `direction` / `inputDirection` → `layout` / `listLayout`),
12
12
  per-item `disabled` becoming inert (use `selectable`), the `bb-cr-container`
13
13
  CSS block split per group, and the `--bb-checkbox-*` / `--bb-radio-*` /
14
- `--bb-switch-*` variables becoming glyph locals.
14
+ `--bb-switch-*` variables becoming glyph locals, and object items reading
15
+ their own `label` (else `text`) and `value` by default.
@@ -14,7 +14,7 @@ summary: flip and allowWriting inverted, arrow props removed, filterBy narrowed,
14
14
  | `hideArrow` (default `true`), `arrowPadding` (default `10`) | removed | arrows are tooltip-only in v3; **⚠ silent** — `:hide-arrow="false"` (the only meaningful v2 use) now lands in `$attrs` and no arrow renders |
15
15
  | `transitionDuration` default `300` | default `250` | visual — the panel now animates on the shared `transitions.medium` scale, like `BbDialog` |
16
16
  | `filterBy` union (fn, `false`, `'not_stashed'`, …) | `filterBy?: string[]` (default `[]`) | retype — filter your `items`/provider instead |
17
- | `itemText` / `itemValue` | `ItemAccessor<Item, …>` | retype |
17
+ | `itemText` / `itemValue` | `ItemAccessor<Item, …>` | retype; left out, an object item reads its own `label` / `text` and `value` (see Behavior) |
18
18
  | per-item `disabled` | inert — use `selectable` | **⚠ silent** |
19
19
  | — | `anchor`, `adaptive` + `offCanvasProps`, `selectable`, `active` event, activator scope `text` / `selectedOptions` | additive |
20
20
 
@@ -52,6 +52,11 @@ the panel now has `#header` / `#footer`.
52
52
  `(query, prefill, modelValue)`; `prefill === true` becomes
53
53
  `reason !== 'search'`, a failure throws (never `return []`). **⚠ silent**
54
54
  for untyped code — see [§6 item 37](../v2-to-v3.md).
55
+ - **Object items read their own `label` and `value`** (beta.49): no
56
+ `item-text` → the item's `label`, else `text`; no `item-value` → its
57
+ `value`, else the whole item. **⚠ silent** for items carrying a `value` key:
58
+ `v-model` gets that value, not the object. See
59
+ [§6 item 49](../v2-to-v3.md).
55
60
 
56
61
  ## Edits
57
62
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  title: 'Migration v2→v3: BbSelect'
3
- summary: allowWriting inverted to disableWriting, filterBy narrowed to string[], prefill value renamed, chevron/options slots removed, and two behavior changes (second click, mount-time coherence).
3
+ summary: allowWriting inverted to disableWriting, filterBy narrowed to string[], prefill value renamed, chevron/options slots removed, and three behavior changes (second click, mount-time coherence, object items read their own label / value).
4
4
  ---
5
5
 
6
6
  # BbSelect — v2 → v3
@@ -17,7 +17,7 @@ summary: allowWriting inverted to disableWriting, filterBy narrowed to string[],
17
17
  | `prefill?: boolean \| 'focus'` (default `'focus'`) | `prefill?: boolean \| 'interaction'` (default `'interaction'`) | value renamed; `'focus'` no longer compiles. Unset now genuinely inherits the default (v2's wrapper silently coerced an unset prop to `false`). |
18
18
  | `prefill: false` (fetched on first open) | `prefill: false` is **search-first**: with a provider, nothing fetches until the user types — opening shows a "search to begin" hint (`select.searchToStart`) | **⚠ silent** — a v2 `prefill: false` select opens to the hint instead of options. If you meant "load on open", delete the prop: that is the default. Falls back to load-on-open for array `items`, `disable-writing`, or a non-empty model. |
19
19
  | `transitionDuration` default `300` | default `250` | visual — the panel now animates on the shared `transitions.medium` scale, like `BbDialog` |
20
- | `itemText` / `itemValue` | `ItemAccessor<T, …>` | retype — keys autocomplete, functions unchanged |
20
+ | `itemText` / `itemValue` | `ItemAccessor<T, …>` | retype — keys autocomplete, functions unchanged; left out, an object item reads its own `label` (else `text`) and `value` (else the whole item) — see Behavior 7 |
21
21
  | per-item `disabled` honored (deprecated) | inert — use `selectable?: boolean \| ((item) => boolean)` | **⚠ silent** — see below |
22
22
  | — | `adaptive` + `offCanvasProps` (mobile sheet, on by default), `labelMode`, `description`, and the new `active` event (fires when the panel opens; `inactive` pre-existed) | additive |
23
23
  | `name` + empty selection posts `name=null` (single) / omits the field (multi) | empty selection (`null`/`[]`) posts **no field**, like a native `<select multiple>` with nothing chosen | **⚠ behavioral** (bugfix 2026-07-18) — backends reading the literal `"null"` string must treat the absent field as empty. Note: `required` never participated in native validation here (hidden inputs are barred from constraint validation). |
@@ -68,6 +68,14 @@ summary: allowWriting inverted to disableWriting, filterBy narrowed to string[],
68
68
  `(query, prefill, modelValue)`; `prefill === true` becomes
69
69
  `reason !== 'search'`, a failure throws (never `return []`). **⚠ silent**
70
70
  for untyped code — see [§6 item 37](../v2-to-v3.md).
71
+ 7. **Object items read their own `label` and `value`** (beta.49). With no
72
+ `item-text`, an object item shows its `label`, else its `text`, else
73
+ `JSON.stringify(item)`; with no `item-value`, `v-model` gets its `value`
74
+ (whatever it holds, `null` included), else the whole item. Explicit
75
+ accessors win. **⚠ silent**: `{ value: 1, label: 'One' }` items with no
76
+ `item-value` used to put the object in `v-model`; now they put `1` — pass
77
+ `:item-value="(item) => item"` to keep the object. See
78
+ [§6 item 49](../v2-to-v3.md).
71
79
 
72
80
  ## Edits
73
81
 
@@ -11,4 +11,5 @@ surface, one set of changes. Everything is in
11
11
  `legendPosition`, `direction` / `inputDirection` → `layout` / `listLayout`),
12
12
  per-item `disabled` becoming inert (use `selectable`), the `bb-cr-container`
13
13
  CSS block split per group, and the `--bb-checkbox-*` / `--bb-radio-*` /
14
- `--bb-switch-*` variables becoming glyph locals.
14
+ `--bb-switch-*` variables becoming glyph locals, and object items reading
15
+ their own `label` (else `text`) and `value` by default.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  title: 'Migration v2→v3: BbTabs (was BbTab)'
3
- summary: Component renamed; querykey→queryKey; animations default on; label slots renamed, header:* slots → wrapper:*, and all dynamic names/URL slugs normalized; the entire .bb-tab BEM tree renamed to .bb-tabs / .bb-tabs-list / .bb-tabs-panels.
3
+ summary: Component renamed; item key→value (v-model carries it); querykey→queryKey; animations default on; label slots renamed, header:* slots → wrapper:*, and all dynamic names/URL slugs normalized; the entire .bb-tab BEM tree renamed to .bb-tabs / .bb-tabs-list / .bb-tabs-panels.
4
4
  ---
5
5
 
6
6
  # BbTabs — v2 → v3
@@ -15,9 +15,9 @@ aliases survive as deprecated re-exports, the tag name does not).
15
15
  | `<BbTab>` | `<BbTabs>` | rename |
16
16
  | `querykey?: string` | `queryKey?: string` (default `'tab'`) | **⚠ silent** — a leftover `querykey` is ignored and URL sync moves to `?tab=` |
17
17
  | `animateX` / `animateY` (default `true`) | `disableAnimateX` / `disableAnimateY` (default `false`) | polarity rename — bare `animate-x` → delete; `:animate-x="false"` → `disable-animate-x` |
18
- | label slot `#label-<key>` (v3 ≤ beta.43: `#label:<key>`) | `#<slotKey(key)>:label` | rename + normalization — dev builds warn on `#label:<key>`, `bitboss-ui check --fix` rewrites it |
18
+ | label slot `#label-<key>` (v3 ≤ beta.43: `#label:<key>`) | `#<slotKey(value)>:label` | rename + normalization — dev builds warn on `#label:<key>`, `bitboss-ui check --fix` rewrites it |
19
19
  | `#header:prepend` / `#header:append` | `#wrapper:prepend` / `#wrapper:append` (same slot props) | a leftover `#header:*` renders nothing — `bitboss-ui check` flags it |
20
- | pane slot `#<key>` (raw) | `#<slotKey(key)>` | normalization |
20
+ | pane slot `#<key>` (raw) | `#<slotKey(value)>` | normalization |
21
21
  | URL value = raw key | URL value = normalized slug | **⚠ breaking for deep links** |
22
22
  | tab/panel DOM ids from raw key | normalized (also fixes invalid ids for spaced keys) | check E2E selectors |
23
23
  | `.bb-tab*` CSS | `.bb-tabs*` / `.bb-tabs-list*` / `.bb-tabs-panels` | **⚠ silent** — the whole BEM tree renamed, see below |
@@ -25,13 +25,14 @@ aliases survive as deprecated re-exports, the tag name does not).
25
25
  | — | `variant` (`pill` default, `line`, `none`, + registered) | additive — replaces hand-rolled underline / no-chrome strips, see below |
26
26
  | `--pill-bg` / `--pill-border` / `--pill-shadow` on `.bb-tabs-list` (beta ≤ 28) | `--indicator-bg` / `--indicator-border` / `--indicator-shadow` | **⚠ silent** — inert locals, the strip reverts to its default pill |
27
27
 
28
- `slotKey(key)` is kebab-case (lodash `kebabCase` rules): `"In Review"` →
29
- `in-review`, `"in_review"` → `in-review`, `"inReview"` → `in-review`. Keys that
28
+ `slotKey(value)` is kebab-case (lodash `kebabCase` rules): `"In Review"` →
29
+ `in-review`, `"in_review"` → `in-review`, `"inReview"` → `in-review`. Values that
30
30
  are already lowercase kebab slugs are untouched — then only the
31
- `#label-<key>` → `#<key>:label` rename applies. (On a v3 beta ≤ 37 the rule was `_`: `in_review`.)
31
+ `#label-<key>` → `#<value>:label` rename applies. (On a v3 beta ≤ 37 the rule was `_`: `in_review`.)
32
32
 
33
- **What stays raw:** `v-model` and the item `key`. `v-model="'In Review'"`
33
+ **What stays raw:** `v-model` and the item `value`. `v-model="'In Review'"`
34
34
  still selects that tab; only slots, ids, and the URL use the slug.
35
+ | item `key` (v2, and v3 up to beta.48) | item `value` — what `v-model` carries and what names the `#<value>` / `#<value>:label` slots (the same characters as before); `useBbTabsContext().select(value)`; the `#label` / `#<value>:label` slot scope says `label` (was `text`) | hard rename — `npx bitboss-ui check --fix` rewrites literal items; `label` is unchanged |
35
36
 
36
37
  ## Edits
37
38
 
@@ -53,7 +54,7 @@ the kebab slug (`?section=in-review`, not `?section=In%20Review`). Bookmarks
53
54
  with a v3 beta's underscore slug (`?section=in_review`) still land and are
54
55
  rewritten in place; raw v2 values fall back to the default tab — add a
55
56
  redirect if those links matter. App code that WRITES tab values (links,
56
- `router.push`, redirects, emails) must use the kebab slug: `slotKey(key)`.
57
+ `router.push`, redirects, emails) must use the kebab slug: `slotKey(value)`.
57
58
 
58
59
  ## CSS: every class renamed with the component
59
60
 
@@ -9,7 +9,7 @@ summary: timeout renamed to delay; theme replaced by typed variant; hideArrow is
9
9
 
10
10
  | v2 | v3 | Kind |
11
11
  | -------------------------------------- | -------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- |
12
- | `timeout?: number` | `delay?: number` (default `0`) | rename (`BbAvatar.timeout` is unrelated and keeps its name) |
12
+ | `timeout?: number` | `delay?: number` (default `100`) | rename (`BbAvatar.timeout` is unrelated and keeps its name) |
13
13
  | `theme?: string` (deprecated) | `variant?: TooltipVariantType` (`default, destructive`; default `default`) | typed rename |
14
14
  | arrow via undeclared fall-through | `hideArrow?: boolean` (default `false` — arrow shown) | now a real, typed prop |
15
15
  | `activator` / `boundary` loose types | `ElementOrComponentRef*` | transparent in templates |
@@ -871,22 +871,26 @@ to the new name (`hide-close`).
871
871
 
872
872
  ### 5.3 Straight renames
873
873
 
874
- | Component | v2 | v3 |
875
- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
876
- | `BbPagination`, `BbTabs` | `querykey` | `queryKey` — **⚠ silent**: a leftover `querykey` falls through to the DOM and the component uses the default key (`'page'` / `'tab'`), quietly moving your URL params. |
877
- | `BbTooltip` | `timeout` | `delay` |
878
- | `toast()`, `confirm()` options | `timeout` | `duration` — same meaning (ms before auto-dismiss). `toast()` throws on `duration <= 0`; on `confirm()` it resolves the promise `false` quietly and implies `autoClose: true`. |
879
- | `useToast()` | `dismissAll()` | `dismiss()` with **no argument**. The v3 return shape is `{ toast, dismiss, update }`. |
880
- | `BbIcon` | `type` (required) | `icon` |
881
- | `BbColorPalette`, `BbColorInput` | `picker` | `eyeDropper` |
882
- | `BbCheckboxGroup`, `BbRadioGroup`, `BbSwitchGroup` | `labelPosition` | `legendPosition` |
883
- | Every form control — `BbTextInput`, `BbTextarea`, `BbNumberInput`, `BbColorInput`, `BbSelect`, `BbDatePickerInput`, `BbTimePickerInput`, `BbTag`, `BbCheckbox`, `BbRadio`, `BbSwitch`, `BbCheckboxGroup`, `BbRadioGroup`, `BbSwitchGroup`, `BbRating`, `BbSlider` | `direction` | `layout` — same values (`'auto'`, `'horizontal'`, `'vertical'`, a `'xx xxxxxx'` ratio), plus `'label-fill'` (the label takes the free space, the input keeps its size — with `reverse`, the settings row) and `'input-fill'`. **⚠ silent**: a leftover `direction` falls through to the root as an HTML attribute and the field keeps its default layout. The ESLint plugin's `--fix` renames it. |
884
- | `BbCheckboxGroup`, `BbRadioGroup`, `BbSwitchGroup` | `inputDirection` | `listLayout` — `'horizontal'` (default) / `'vertical'` / `'vertical-stretch'` / `'tiles'`. **⚠ silent**: v2 `'vertical'` rows spanned the list; v3 `'vertical'` rows keep their own width, and `'vertical-stretch'` is the v2 look — the ESLint plugin's `--fix` maps a static `'vertical'` to `'vertical-stretch'`, a bound value is only renamed. New beside it: `itemLayout` (each row's input against its label, the `layout` keywords) and `itemReverse`. |
885
- | `BbSelect` | `prefill: 'focus'` | `prefill: 'interaction'` (value rename; same default) |
886
- | `BbToast` (host) | `placement` (e.g. `bottom-start`) | `position` (corner set: `top-left` … `bottom-right`) |
887
- | `BbAlert`, `BbTooltip`, `toast()`, `confirm()` | `theme` | `variant` (typed — see section 4). On `confirm()` the v2 type was a free-form `theme?: string`; v3's is `ConfirmVariantType` (`default`, `destructive`). |
888
- | Every form control with a warning state — `BbTextInput`, `BbTextarea`, `BbNumberInput`, `BbColorInput`, `BbSelect`, `BbSelectPopover`, `BbDatePickerInput`, `BbTimePickerInput`, `BbTag`, `BbCheckbox`, `BbRadio`, `BbSwitch`, `BbCheckboxGroup`, `BbRadioGroup`, `BbSwitchGroup`, `BbRating`, `BbSlider`, `BbDropzone` — and the `BbBaseCheckboxIcon` / `BbBaseRadioIcon` / `BbBaseSwitchIcon` glyphs | `hasWarning` _(v3 ≤ beta.24; not in v2)_ | `hasWarnings` — plural, matching `hasErrors` and the `warnings` prop. **⚠ silent**: a leftover `has-warning` falls through to the root as an HTML attribute and the warning chrome never shows. The ESLint plugin's `--fix` renames it. Slot props that carried it (`#input`, `#label`) are renamed the same way. |
889
- | `BbForm` _(v3 ≤ beta.41; not in v2)_ | `modelValue` (`v-model`) | `model`, bound one way: `<BbForm :model="draft">` — any reactive object (`reactive()`, a `ref`, Pinia state, Inertia `useForm()`), written in place; watch it `{ deep: true }`. The form-level `update:modelValue` is gone (it carried the same object back). **⚠ silent**: a leftover `v-model` / `:model-value` falls through to the `<form>` as an attribute and the fields stop seeing the object. The ESLint rule `bitboss-ui/form-model` fixes both. |
874
+ | Component | v2 | v3 |
875
+ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
876
+ | `BbPagination`, `BbTabs` | `querykey` | `queryKey` — **⚠ silent**: a leftover `querykey` falls through to the DOM and the component uses the default key (`'page'` / `'tab'`), quietly moving your URL params. |
877
+ | `BbTooltip` | `timeout` | `delay` |
878
+ | `toast()`, `confirm()` options | `timeout` | `duration` — same meaning (ms before auto-dismiss). `toast()` throws on `duration <= 0`; on `confirm()` it resolves the promise `false` quietly and implies `autoClose: true`. |
879
+ | `useToast()` | `dismissAll()` | `dismiss()` with **no argument**. The v3 return shape is `{ toast, dismiss, update }`. |
880
+ | `BbIcon` | `type` (required) | `icon` |
881
+ | `BbColorPalette`, `BbColorInput` | `picker` | `eyeDropper` |
882
+ | `BbCheckboxGroup`, `BbRadioGroup`, `BbSwitchGroup` | `labelPosition` | `legendPosition` |
883
+ | Every form control — `BbTextInput`, `BbTextarea`, `BbNumberInput`, `BbColorInput`, `BbSelect`, `BbDatePickerInput`, `BbTimePickerInput`, `BbTag`, `BbCheckbox`, `BbRadio`, `BbSwitch`, `BbCheckboxGroup`, `BbRadioGroup`, `BbSwitchGroup`, `BbRating`, `BbSlider` | `direction` | `layout` — same values (`'auto'`, `'horizontal'`, `'vertical'`, a `'xx xxxxxx'` ratio), plus `'label-fill'` (the label takes the free space, the input keeps its size — with `reverse`, the settings row) and `'input-fill'`. **⚠ silent**: a leftover `direction` falls through to the root as an HTML attribute and the field keeps its default layout. The ESLint plugin's `--fix` renames it. |
884
+ | `BbCheckboxGroup`, `BbRadioGroup`, `BbSwitchGroup` | `inputDirection` | `listLayout` — `'horizontal'` (default) / `'vertical'` / `'vertical-stretch'` / `'tiles'`. **⚠ silent**: v2 `'vertical'` rows spanned the list; v3 `'vertical'` rows keep their own width, and `'vertical-stretch'` is the v2 look — the ESLint plugin's `--fix` maps a static `'vertical'` to `'vertical-stretch'`, a bound value is only renamed. New beside it: `itemLayout` (each row's input against its label, the `layout` keywords) and `itemReverse`. |
885
+ | `BbSelect` | `prefill: 'focus'` | `prefill: 'interaction'` (value rename; same default) |
886
+ | `BbToast` (host) | `placement` (e.g. `bottom-start`) | `position` (corner set: `top-left` … `bottom-right`) |
887
+ | `BbAlert`, `BbTooltip`, `toast()`, `confirm()` | `theme` | `variant` (typed — see section 4). On `confirm()` the v2 type was a free-form `theme?: string`; v3's is `ConfirmVariantType` (`default`, `destructive`). |
888
+ | Every form control with a warning state — `BbTextInput`, `BbTextarea`, `BbNumberInput`, `BbColorInput`, `BbSelect`, `BbSelectPopover`, `BbDatePickerInput`, `BbTimePickerInput`, `BbTag`, `BbCheckbox`, `BbRadio`, `BbSwitch`, `BbCheckboxGroup`, `BbRadioGroup`, `BbSwitchGroup`, `BbRating`, `BbSlider`, `BbDropzone` — and the `BbBaseCheckboxIcon` / `BbBaseRadioIcon` / `BbBaseSwitchIcon` glyphs | `hasWarning` _(v3 ≤ beta.24; not in v2)_ | `hasWarnings` — plural, matching `hasErrors` and the `warnings` prop. **⚠ silent**: a leftover `has-warning` falls through to the root as an HTML attribute and the warning chrome never shows. The ESLint plugin's `--fix` renames it. Slot props that carried it (`#input`, `#label`) are renamed the same way. |
889
+ | `BbForm` _(v3 ≤ beta.41; not in v2)_ | `modelValue` (`v-model`) | `model`, bound one way: `<BbForm :model="draft">` — any reactive object (`reactive()`, a `ref`, Pinia state, Inertia `useForm()`), written in place; watch it `{ deep: true }`. The form-level `update:modelValue` is gone (it carried the same object back). **⚠ silent**: a leftover `v-model` / `:model-value` falls through to the `<form>` as an attribute and the fields stop seeing the object. The ESLint rule `bitboss-ui/form-model` fixes both. |
890
+ | `BbDropdown`, `v-bb-dropdown`, `BbDropdownButton` rows | `key`, `text` | `value`, `label` (also v3 ≤ beta.48). `value` is the row's identity, any type: the selection value a selectable group puts in `v-model` (compared by hash, so `null` and objects work), the `#<value>` slot name, the submenu id seed. A row with no `value` still renders and runs `onClick` (disabled in a selectable group). **⚠ silent**: an old `key` / `text` is ignored; `npx bitboss-ui check --fix` (or ESLint `bitboss-ui/no-renamed-item-field`) rewrites literal items. |
891
+ | `BbDropdown`, `v-bb-dropdown`, `BbDropdownButton` groups _(v3 ≤ beta.48; not in v2)_ | `key` | `id`, the word `<BbDropdownGroup id>` binds by (`#<groupId>:item` slots, same characters). **⚠ silent**: a group with `key` is not selectable and no companion binds it; `check --fix` rewrites it. |
892
+ | `BbTabs`, `BbTabsRoot` items | `key` | `value` — what `v-model` carries and what names `#<value>` / `#<value>:label` (the same characters as before); `server` tabs and `useBbTabsContext().select(value)` follow. `label` is unchanged. `check --fix` rewrites literal items. |
893
+ | `BbBreadcrumbs` items | `key`, `text` | `value`, `label` — `value` names the crumb's `#<value>` slots; a crumb hidden in the overflow menu is a dropdown row with the same fields. `check --fix` rewrites literal items. |
890
894
 
891
895
  ### 5.4 Removed props (no replacement needed — behavior became default or moved)
892
896
 
@@ -1340,7 +1344,7 @@ Nothing here fails to compile — these change what existing code does.
1340
1344
  family's day slots are `#<YYYY-MM-DD>:append` and the shared
1341
1345
  `#day:append` (v3 betas: `#append:<date>` / `#append:day`). The same
1342
1346
  warnings and `check --fix` cover these.
1343
- `BbTabs` goes further: the label slot is `#<key>:label` (v2 `#label-<key>`,
1347
+ `BbTabs` goes further: the label slot is `#<value>:label` (v2 `#label-<key>`,
1344
1348
  v3 betas `#label:<key>`),
1345
1349
  the URL query value is the kebab slug (`?tab=In%20Review` →
1346
1350
  `?tab=in-review`; old `?tab=in_review` links from a v3 beta still land and
@@ -1751,6 +1755,99 @@ Nothing here fails to compile — these change what existing code does.
1751
1755
  pseudo-class (Tailwind `active:`), and the current-route highlight stays
1752
1756
  `activeClass` / `exactActiveClass`.
1753
1757
 
1758
+ 48. **Tooltips wait 100 ms on hover** (since 3.0.0-beta.49). `BbTooltip` and
1759
+ `v-bb-tooltip` used to show on hover at once (`delay` defaulted to `0`);
1760
+ the default is now `100`, so a pointer passing over a row of buttons no
1761
+ longer flashes a bubble at each. Keyboard focus shows the tooltip at once
1762
+ whatever `delay` says, and a tooltip reached while another shows or
1763
+ within 300 ms of one closing skips its delay. A test that hovers and
1764
+ expects the bubble on the next tick now waits for it (`vi.waitFor`, or
1765
+ `:delay="0"` in that test); `:delay="0"` / `{ text, delay: 0 }` restores
1766
+ the instant hover open.
1767
+
1768
+ 49. **`{ label, value }` items need no `item-text` / `item-value`** (since
1769
+ 3.0.0-beta.49). With neither prop, an option on `BbSelect`,
1770
+ `BbSelectPopover`, `BbRadioGroup`, `BbCheckboxGroup`, `BbSwitchGroup` and a
1771
+ mapped `BbDropdown` group reads its own `label` (else its own `text`) as
1772
+ its text, and its own `value` as its value, whatever it holds (`null`
1773
+ included). Before, the text was `JSON.stringify(item)` and the value the
1774
+ whole object. The break: object items with a `value` key and no
1775
+ `item-value` used to put the whole object in `v-model`, and now put
1776
+ `item.value` there. To keep the old value, write it out:
1777
+ `:item-value="(item) => item"`. An explicit accessor always wins, and
1778
+ `BbTable` rows keep the whole row. `item-text="label"` /
1779
+ `item-value="value"` now restate the default: the
1780
+ `bitboss-ui/no-redundant-item-accessor` autofix deletes them.
1781
+
1782
+ 50. **A dropdown group's "None" row shows checked** (since 3.0.0-beta.49).
1783
+ A single-choice `BbDropdown` / `BbDropdownButton` group whose `v-model`
1784
+ is `null` (or that has nothing selected) shows its row whose `value` is
1785
+ `null` as checked, as `BbSelect` and `BbRadioGroup` already do (they
1786
+ match by hash); picking it emits `null`. Before, nothing showed checked.
1787
+ A hand-written group's `v-model` holds its rows' `value`s, of any type,
1788
+ where it held their `key` strings (§ 5.3).
1789
+
1790
+ 51. **Slot scopes and `useBbDropdownContext` follow the item fields** (since
1791
+ 3.0.0-beta.49). The row slots of `BbDropdown` / `BbDropdownButton`
1792
+ (`#<value>`, `#<groupId>:item`, `#item:prepend`, …), `BbTabs`'
1793
+ `#<value>:label` / `#label` and `BbBreadcrumbs`' crumb slots hand
1794
+ `{ label }` where they handed `{ text }`; a row slot's `group` carries
1795
+ `id` (was `key`); the `#loading` / `#empty` slots' `groupKey` is
1796
+ `groupId`. `useBbDropdownContext(id).groups` is keyed by each group's
1797
+ `id`, and `selectedOptions[]` carry `label` (was `text`). A destructured
1798
+ `{ text }` reads `undefined`, with no error: rename it to `{ label }`.
1799
+
1800
+ 52. **`BbPopover` is non-modal** (since 3.0.0-beta.49). Its panel is a
1801
+ `role="dialog"` without `aria-modal`, not a `<dialog>` opened with
1802
+ `showModal()`: the page behind stays clickable, focusable and scrollable,
1803
+ an outside click closes the popover and still reaches what was clicked,
1804
+ and Tab past the last control (or Shift+Tab before the first) leaves the
1805
+ panel and closes it. Escape still closes it and returns focus. A flow that
1806
+ relied on the page being blocked while the popover is open adds `modal`
1807
+ (`v-bb-popover="{ portal, modal: true }"` on the directive), which restores
1808
+ the old behaviour exactly. A test that queried `dialog.bb-popover` queries
1809
+ `.bb-popover[role="dialog"]`. The phone sheet is modal either way.
1810
+
1811
+ 53. **A form locks while its save runs** (since 3.0.0-beta.49). While a
1812
+ `@submit` that returned a promise is pending, every field joined to the
1813
+ `BbForm` is read-only (never disabled: values stay visible and focusable,
1814
+ `aria-readonly`) and every `type="submit"` `BbButton` inside it shows its
1815
+ spinner; both end when the promise settles. A sync `@submit` never locks.
1816
+ A `:loading="isSubmitting"` on the submit button is now redundant (drop
1817
+ it); a submit button outside the form still binds `loading` itself. A
1818
+ page that wants the fields editable during the save sets
1819
+ `disable-submit-lock` on the form.
1820
+
1821
+ 54. **A set of `group` toggle buttons is one Tab stop** (since
1822
+ 3.0.0-beta.49). Adjacent `group` `BbButton`s that each bind a `v-model`
1823
+ take a roving `tabindex`: Tab lands on the pressed one (else the one last
1824
+ focused, else the first), ArrowLeft / ArrowRight and Home / End move
1825
+ between them, Space / Enter toggle. They keep `aria-pressed`. A keyboard
1826
+ test that pressed Tab once per button now presses an arrow key instead;
1827
+ `group` buttons without a `v-model` are unchanged.
1828
+
1829
+ 55. **`BbNumberInput` formats live in the locale** (since 3.0.0-beta.49). The
1830
+ field shows `10.005,6` in Italian and `10,005.6` in English while the user
1831
+ types; the model is still the plain number. Code that reads the input's
1832
+ text (`event.target.value`, a `pt:input` listener, a consumer `maxlength`
1833
+ or `pattern`) now sees the formatted text, which is also wider: check
1834
+ narrow fixed-width fields at 200% zoom. `name` moves to a hidden input
1835
+ that posts the raw value (`10005.6`): `form.elements[name]` and
1836
+ `input[name=x]` find that one, so a test that typed into
1837
+ `input[name=x]` targets `input[role="spinbutton"]`. A pasted `1.000` in
1838
+ Italian is 1000 (it was 1), an English `1,234` is 1234, and a paste keeps
1839
+ only the first number (`$1,234.56 - $2,000` is 1234.56, `(1,234.56)` is negative, `1.2E+05` is 120000, `15 m²`
1840
+ is 15); a typed `,` or
1841
+ `.` is still always the decimal; with `maxPrecision` 0 it stays in the
1842
+ text and refuses the digits after it (`12,5` is 12, it was 125), and
1843
+ below 3 decimals (every currency field) a second `,` / `.` is refused.
1844
+ `-` typed anywhere flips the sign (it only counted at the start). While
1845
+ the text is a bare `-` the model keeps its last value instead of
1846
+ becoming `null`; blur rewrites the text from the value (`1,50` → `1,5`).
1847
+ With the new `currency` / `unit` the symbol is in that text too
1848
+ (`$1,234.50`, `20 kg`), so a `maxlength` counts it. `disable-formatting`
1849
+ restores the old field exactly.
1850
+
1754
1851
  ## 7. Class overrides → variants
1755
1852
 
1756
1853
  ### The v2 pattern to hunt down
@@ -118,6 +118,17 @@ All of these land in 3.0.0-beta.41.
118
118
  - A new `warnings` array (never fails the run), with `severity: "warning"`:
119
119
  `likely-squashed-slot` and `local-bb-component`.
120
120
 
121
+ In 3.0.0-beta.49 the dropdown kinds follow the item fields (Q64.2):
122
+ `missing-key` is `missing-value` (a row in a selectable group without a
123
+ `value`) or `missing-id` (a selectable group without an `id`), and
124
+ `duplicate-row-text` is `duplicate-row-label`. A new `renamed-item-field`
125
+ reports an item field spelled the old way (a dropdown row's `key` / `text`, a
126
+ dropdown group's `key`, a tab's `key`, a crumb's `key` / `text`) and
127
+ `check --fix` rewrites it; its ESLint twin is
128
+ `bitboss-ui/no-renamed-item-field` (`error` in `recommended`). A script that
129
+ matches the old kind names in `check --json` output needs the new ones;
130
+ `eslint-disable` comments name rules, which did not change.
131
+
121
132
  After 3.0.0-beta.41, `check` alone (not MCP `validate`: it needs the project's
122
133
  build config) adds `kind: "hand-imported-styles"`: `bitboss-ui/styles.css`
123
134
  imported in a CSS file, a script, a `.vue` block or Nuxt's `css: [...]` while