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
@@ -131,7 +131,8 @@ bitbossUi({ tooltipVariants: ['info', 'success'] });
131
131
  The most common real use: a compact row of icon-only actions, each named by a
132
132
  tooltip. This companion frames a shared-document chrome — title, muted meta, and
133
133
  `size="xs"` ghost buttons grouped with thin dividers. A `:delay="400"` keeps the
134
- bubbles from flickering while the pointer crosses the dense toolbar.
134
+ bubbles from flickering while the pointer crosses the dense toolbar; once one
135
+ hint shows, its neighbours open at once (the skip delay, below).
135
136
 
136
137
  **Icon toolbar with tooltips**
137
138
 
@@ -248,10 +249,21 @@ is concerned — the whole label (shortcut included) is flattened into the
248
249
 
249
250
  - `placement` — as above; the `top`/`right`/`bottom`/`left` families with
250
251
  `-start`/`-end` variants, auto-flipping near an edge.
251
- - `delay` (ms, default `0`) holds the tooltip back until the pointer settles —
252
- useful on dense toolbars to avoid a flicker of bubbles while the cursor passes
253
- over. It delays only the **open**; the close is always a short debounce (so the
254
- pointer can travel from the trigger into the bubble without it vanishing).
252
+ - `delay` (ms, default `100`) holds the tooltip back until the pointer settles,
253
+ so a cursor passing over a row of buttons doesn't flash a bubble at each one;
254
+ raise it on dense toolbars. It delays only the **open**, and only for a
255
+ pointer; the close is always a short debounce (so the pointer can travel from
256
+ the trigger into the bubble without it vanishing).
257
+ - **Keyboard focus shows the hint at once**, whatever `delay` says: a Tab onto a
258
+ control is never an accident.
259
+ - **The skip delay:** while a tooltip shows, or for 300 ms after one closes, the
260
+ next tooltip the pointer reaches opens at once. Run the pointer along a
261
+ toolbar and every hint after the first appears without a wait. It is shared by
262
+ every `BbTooltip` and `v-bb-tooltip`, needs no setup, and leaves hover cards
263
+ alone (they keep their own 350 ms). A tooltip that hid because a menu or
264
+ dialog opened doesn't count.
265
+ - `:delay="0"` shows the tooltip on hover at once (the default before
266
+ 3.0.0-beta.49).
255
267
  - `width` caps the bubble so long hints wrap instead of stretching across the
256
268
  screen. It is a **maximum, not a fixed width** — the bubble still shrinks to
257
269
  short text, so a one-line hint never sits in an oversized box. A bare number
@@ -262,8 +274,10 @@ is concerned — the whole label (shortcut included) is flattened into the
262
274
  `.bb-tooltip` in your own CSS.
263
275
  - `disabled` suppresses the tooltip entirely — and dismisses it if already open,
264
276
  so you can bind it to skip a hint when the label is already visible elsewhere.
265
- - Content is **lazy** (rendered on first open); `eager` renders it up front, and
266
- `transition-duration` (ms) times the fade.
277
+ - The bubble is **lazy** (its popover and content render on the first open,
278
+ so a closed tooltip costs little in a long table); `eager` renders it up
279
+ front, and `transition-duration` (ms) times the fade. The description screen
280
+ readers hear is there from mount either way.
267
281
 
268
282
  **Delayed, width-capped hint**
269
283
 
@@ -508,7 +522,8 @@ type ToolbarAction = {
508
522
  // Same document-toolbar hints as `IconButtonTooltips.vue`, restyled through
509
523
  // passthrough: a muted wash on `pt:panel` (the bubble — default is the
510
524
  // inverted primary), `pt:root:open` adds a drop shadow while showing. Hover
511
- // a glyph to see the pt; delay 400 matches dense toolbars.
525
+ // a glyph to see the pt; `delay` 400 (the default is 100) holds the first hint
526
+ // back in a dense toolbar, and the next glyph's hint opens at once (skip delay).
512
527
  const actions: ToolbarAction[] = [
513
528
  { label: 'Undo', icon: 'lucide:undo-2' },
514
529
  { label: 'Redo', icon: 'lucide:redo-2' },
@@ -562,9 +577,10 @@ A `pt` value written in `<script>` (a constant, a preset, a wrapper's
562
577
  The node it points at is `hidden`: read as the activator's description, never
563
578
  as page text of its own, and still read inside an open `BbDialog` (the
564
579
  directive's node lives at the end of `<body>`, which a modal makes inert).
565
- - The tooltip opens on keyboard focus (`:focus-visible`) and on hover, and closes
566
- on blur, mouse-leave, or `Escape`. A mouse click does not open it (hover
567
- already covers the pointer), so it never pops over the thing you just clicked.
580
+ - The tooltip opens on keyboard focus (`:focus-visible`, at once) and on hover
581
+ (after `delay`), and closes on blur, mouse-leave, or `Escape`. A mouse click
582
+ does not open it (hover already covers the pointer), so it never pops over the
583
+ thing you just clicked.
568
584
  - Because the bubble is not focusable and holds no interactive content, never
569
585
  place a link or button inside it — use `BbPopover` for that.
570
586
  - The tooltip supplements an accessible name; it does not provide one. Icon-only
@@ -582,9 +598,9 @@ A `pt` value written in `<script>` (a constant, a preset, a wrapper's
582
598
  | `activator` | `ElementOrComponentRef \| undefined` | | | External activator element or component ref. When provided, the activator slot is not rendered and event listeners are attached programmatically to the referenced element. |
583
599
  | `arrowPadding` | `number \| undefined` | `10` | | Space the arrow will maintain to the edge of the tooltip bubble. Useful when the floating element has border radius so it won't appear broken |
584
600
  | `boundary` | `ElementOrComponentRefOrSelector \| undefined` | | | Constrains the tooltip within a bounding element. When provided, the tooltip will not overflow this container's bounds (e.g. a sidebar). Accepts an HTMLElement, a Vue component ref, or a CSS selector string. |
585
- | `delay` | `number \| undefined` | `0` | | The delay in milliseconds before the tooltip is shown. |
601
+ | `delay` | `number \| undefined` | `100` | | How long, in milliseconds, a pointer has to rest on the activator before the tooltip shows; it keeps hints from flashing under a pointer passing by. Keyboard focus shows it at once whatever this says, and so does a pointer arriving while another tooltip shows or within 300 ms of one closing (the skip delay, shared by every tooltip). `0` shows it on hover at once. |
586
602
  | `disabled` | `boolean \| undefined` | `false` | | Disables the component |
587
- | `eager` | `boolean \| undefined` | `false` | | Prevents rendering content before it's made visible. |
603
+ | `eager` | `boolean \| undefined` | `false` | | Renders the tooltip's popover and content at mount instead of on the first open. The description screen readers hear exists from mount either way. |
588
604
  | `hideArrow` | `boolean \| undefined` | `false` | | Hides the tooltip arrow. A tooltip shows its arrow by default (it's the one popover-family surface where an arrow is meaningful — a speech bubble pointing at its anchor); set this to drop it. |
589
605
  | `id` | `string \| undefined` | | | Seed for the tooltip's internal id. It is **prefixed** (`bb_<id>`) and set on the inner content element, not on the root — so `document.getElementById(theIdYouPassed)` finds nothing. Pass it to make the generated id stable (SSR snapshots, tests), not to look the element up. |
590
606
  | `modelValue` | `boolean \| undefined` | `false` | | Used by v-model to show / hide the tooltip. A tooltip with no `v-model` starts hidden and is driven by hover / focus. |
package/dist/ai/BbTree.md CHANGED
@@ -755,10 +755,10 @@ const items = ref<Array<BbTreeItem<FileNode>>>([
755
755
 
756
756
  /* Trunk: vertical line continuing past a node while siblings follow. */
757
757
  .connector-tree .bb-tree__children > .bb-tree__item:not(:last-child)::before {
758
- border-left: 1px solid var(--line);
758
+ border-inline-start: 1px solid var(--line);
759
759
  bottom: 0;
760
760
  content: '';
761
- left: calc(var(--indent) / -2);
761
+ inset-inline-start: calc(var(--indent) / -2);
762
762
  position: absolute;
763
763
  top: calc(var(--gap) * -1);
764
764
  }
@@ -770,11 +770,11 @@ const items = ref<Array<BbTreeItem<FileNode>>>([
770
770
 
771
771
  .connector-tree .bb-tree__children > .bb-tree__item > .bb-tree__row::before {
772
772
  border-bottom: 1px solid var(--line);
773
- border-bottom-left-radius: var(--bb-radius-sm);
774
- border-left: 1px solid var(--line);
773
+ border-end-start-radius: var(--bb-radius-sm);
774
+ border-inline-start: 1px solid var(--line);
775
775
  content: '';
776
776
  height: calc(50% + var(--gap));
777
- left: calc(var(--indent) / -2);
777
+ inset-inline-start: calc(var(--indent) / -2);
778
778
  position: absolute;
779
779
  top: calc(var(--gap) * -1);
780
780
  width: calc(var(--indent) / 2);
@@ -803,10 +803,13 @@ your node markup:
803
803
 
804
804
  ### Large trees and lazy-loaded branches
805
805
 
806
- The whole tree stays mounted: collapsed branches are hidden by CSS, not
807
- removed, and there is no virtualization. For hundreds of nodes that is fine;
808
- for folders of unbounded size, don't ship the entire hierarchy up front — load
809
- children when a branch first opens. `items` is watched deeply, so appending
806
+ A collapsed branch builds its rows the first time it opens and keeps them
807
+ after that (closing hides them by CSS, inert), so a mostly collapsed tree of
808
+ thousands of nodes mounts only what is open. A node you reveal through
809
+ `expandedItems` (a search hit, "expand all") is in the DOM after the next
810
+ tick. There is no virtualization of open branches. For folders of unbounded
811
+ size, don't ship the entire hierarchy up front either: load children when a
812
+ branch first opens. `items` is watched deeply, so appending
810
813
  `children` to a node updates the tree in place, and newly appeared branches
811
814
  follow the same seeding rules (`expanded: false` keeps them collapsed).
812
815
 
@@ -1192,8 +1195,8 @@ States are listed in precedence order: when two are on at once and their entries
1192
1195
  ## Slots
1193
1196
 
1194
1197
  - `default` — scope: `BbTreeNodeSlotProps<Meta>` `{ meta: Meta; item: BbTreeItem<Meta>; parent?: BbTreeItem<Meta>; index: number; depth: number; value: any; expanded: boolean; expandable: boolean; toggleExpanded: () => void; expandProps: BbTreeExpandControllerProps }`
1195
- - `#<value>` (named from data) — scope: `BbTreeNodeSlotProps<Meta>` — One node, by its resolved `item-value` (string or number) through `slotKey`; beats `<depth>`, which beats `default`. Reserved keys (their slot is one of this component's own, so a key spelled like them is an error): `default`.
1196
- - `#<depth>` (named from data) — scope: `BbTreeNodeSlotProps<Meta>` — Every node at one depth (`0` = root); a numeric value can share this name. Reserved keys (their slot is one of this component's own, so a key spelled like them is an error): `default`.
1198
+ - `#<value>` (named from data) — scope: `BbTreeNodeSlotProps<Meta>` — One node, by its resolved `item-value` (string or number) through `slotKey`; beats `<depth>`, which beats `default`. Reserved names (their slot is one of this component's own, so an item value or column key spelled like them is an error): `default`.
1199
+ - `#<depth>` (named from data) — scope: `BbTreeNodeSlotProps<Meta>` — Every node at one depth (`0` = root); a numeric value can share this name. Reserved names (their slot is one of this component's own, so an item value or column key spelled like them is an error): `default`.
1197
1200
  - `#<value>:children` (named from data) — scope: `BbTreeNodeSlotProps<Meta>` — One node's children container, stopping the recursion there; beats `<depth>:children`. Renders for leaves too.
1198
1201
  - `#<depth>:children` (named from data) — scope: `BbTreeNodeSlotProps<Meta>` — The children container of every node at one depth.
1199
1202
 
@@ -22,7 +22,7 @@
22
22
  | `bubbleAttrs` | `Record<string, unknown> \| ((space: CommonPopoverAvailableSpace) => Record<string, unknown>) \| undefined` | | | Attributes bound on the bubble element (`class`, `style`, `inert`, …), merged after its own `bb-common-popover__bubble` class. Lets the owning component make the bubble its layout container instead of nesting a second box inside it. The function form receives the same free space as the default slot, for attributes that depend on it (a height cap). |
23
23
  | `dialog` | `boolean \| undefined` | `false` | | Renders the popover as a `<dialog>` element (modal overlay) instead of a `<span>` with the Popover API. |
24
24
  | `disableFlip` | `boolean \| undefined` | `false` | | Disables the automatic flip to the opposite side when the popover would overflow (flipping is on by default). |
25
- | `eager` | `boolean \| undefined` | `false` | | Prevents rendering content before it's made visible. |
25
+ | `eager` | `boolean \| undefined` | `false` | | Renders the bubble's content at mount instead of on the first open. Either way it stays rendered once it has been. |
26
26
  | `forceAutoUpdate` | `boolean \| undefined` | `false` | | Keeps floating-ui's `autoUpdate` (scroll/resize/resize-observer tracking) running while the popover is closed. By default the position is only tracked while the popover is open, so idle popovers attach no listeners. Enable this only when the anchor moves while the popover is closed and the next open must be pixel-perfect immediately. |
27
27
  | `hideArrow` | `boolean \| undefined` | `false` | | Hides the arrow indicator. |
28
28
  | `modelValue` | `boolean \| undefined` | `false` | | Used by v-model to show / hide the bubble. Closed until the owning component opens it. |
@@ -1,14 +1,14 @@
1
1
  {
2
2
  "schemaVersion": 3,
3
3
  "library": "bitboss-ui",
4
- "version": "3.0.0-beta.47",
4
+ "version": "3.0.0-beta.49",
5
5
  "upgrade": "v2-to-v3",
6
6
  "guide": "ai/guides/migration/v2-to-v3.md",
7
7
  "legend": {
8
8
  "id": "the row's stable id: `fNNN` = its row in the register (FOLLOWUPS §F), `css:<class>` = its pair in the class-rename map. Never reused; unchanged when a row is reworded.",
9
9
  "breaking": "every BREAKING change of the v2 → v3 line: register renames, then class renames, then behaviour breaks. Features and fixes are not tracked: an empty slice means nothing breaks.",
10
10
  "kind": "rename = an old name with a successor, or removed (from → to); behaviour = a change that keeps the name (description says what changed).",
11
- "surface": "on a rename, what the name is: prop | slot (without the #) | pt (the attribute spelling, camelCase words) | cssVar | class | option (a field of a composable or function argument). Apply a row only on its own surface.",
11
+ "surface": "on a rename, what the name is: prop | slot (without the #) | pt (the attribute spelling, camelCase words) | cssVar | class | option (a field of a composable or function argument) | item (a field of an `items` entry: `items[].key` is a row's, `items[group].key` a dropdown group's). Apply a row only on its own surface.",
12
12
  "from / to": "the old and new name, nothing else. to = null: removed with no single successor (the note says what to do). Several names in one cell (`--pad-x / --pad-y` → `--px / --py`) pair in order; `<x>` is one dynamic segment; a class row renames its modifiers too (`.old--x` → `.new--x`).",
13
13
  "note": "the prose the register row carries beside the names (a qualifier, the removed-with-hint advice, the modifiers that follow). Absent when there is none.",
14
14
  "firstReleasedIn": "the first published version that shipped the change; null = not released yet. Filter with bitboss-ui changelog --since <your version>.",
@@ -58,7 +58,9 @@
58
58
  "3.0.0-beta.44",
59
59
  "3.0.0-beta.45",
60
60
  "3.0.0-beta.46",
61
- "3.0.0-beta.47"
61
+ "3.0.0-beta.47",
62
+ "3.0.0-beta.48",
63
+ "3.0.0-beta.49"
62
64
  ],
63
65
  "unpublished": [
64
66
  "3.0.0-alpha.2",
@@ -78,15 +80,16 @@
78
80
  "3.0.0-beta.40"
79
81
  ],
80
82
  "summary": {
81
- "renames": 213,
82
- "behaviourBreaks": 172,
83
+ "renames": 220,
84
+ "behaviourBreaks": 187,
83
85
  "bySurface": {
84
86
  "prop": 15,
85
87
  "option": 1,
86
88
  "pt": 14,
87
89
  "slot": 14,
90
+ "item": 6,
88
91
  "cssVar": 32,
89
- "class": 137
92
+ "class": 138
90
93
  },
91
94
  "unreleased": 0
92
95
  },
@@ -784,6 +787,88 @@
784
787
  "default": "—",
785
788
  "firstReleasedIn": "3.0.0-beta.44"
786
789
  },
790
+ {
791
+ "id": "f310",
792
+ "kind": "rename",
793
+ "surface": "item",
794
+ "components": [
795
+ "BbDropdown",
796
+ "BbDropdownButton"
797
+ ],
798
+ "from": "items[].key",
799
+ "to": "items[].value",
800
+ "since": "2026-10-07, 3.0.0-beta.49 (Q64.2; a row's value is any type, compared by hash: the v-model value, its #<value> slots; v2 rows were { key, text } too)",
801
+ "default": "—",
802
+ "firstReleasedIn": "3.0.0-beta.49"
803
+ },
804
+ {
805
+ "id": "f311",
806
+ "kind": "rename",
807
+ "surface": "item",
808
+ "components": [
809
+ "BbDropdown",
810
+ "BbDropdownButton"
811
+ ],
812
+ "from": "items[].text",
813
+ "to": "items[].label",
814
+ "since": "2026-10-07, 3.0.0-beta.49 (Q64.2; BbDropdownButton's main button reads items[0].label)",
815
+ "default": "—",
816
+ "firstReleasedIn": "3.0.0-beta.49"
817
+ },
818
+ {
819
+ "id": "f312",
820
+ "kind": "rename",
821
+ "surface": "item",
822
+ "components": [
823
+ "BbDropdown",
824
+ "BbDropdownButton"
825
+ ],
826
+ "from": "items[group].key",
827
+ "to": "items[group].id",
828
+ "since": "2026-10-07, 3.0.0-beta.49 (Q64.2; the <BbDropdownGroup id> word; groups are v3-only, so beta-only)",
829
+ "default": "—",
830
+ "firstReleasedIn": "3.0.0-beta.49"
831
+ },
832
+ {
833
+ "id": "f313",
834
+ "kind": "rename",
835
+ "surface": "item",
836
+ "components": [
837
+ "BbTabs",
838
+ "BbTabsRoot"
839
+ ],
840
+ "from": "items[].key",
841
+ "to": "items[].value",
842
+ "since": "2026-10-07, 3.0.0-beta.49 (Q64.4; v-model carries it; #<value> / #<value>:label, same characters)",
843
+ "default": "—",
844
+ "firstReleasedIn": "3.0.0-beta.49"
845
+ },
846
+ {
847
+ "id": "f314",
848
+ "kind": "rename",
849
+ "surface": "item",
850
+ "components": [
851
+ "BbBreadcrumbs"
852
+ ],
853
+ "from": "items[].key",
854
+ "to": "items[].value",
855
+ "since": "2026-10-07, 3.0.0-beta.49 (Q64.5; names the crumb's slots; a hidden crumb is a dropdown row)",
856
+ "default": "—",
857
+ "firstReleasedIn": "3.0.0-beta.49"
858
+ },
859
+ {
860
+ "id": "f315",
861
+ "kind": "rename",
862
+ "surface": "item",
863
+ "components": [
864
+ "BbBreadcrumbs"
865
+ ],
866
+ "from": "items[].text",
867
+ "to": "items[].label",
868
+ "since": "2026-10-07, 3.0.0-beta.49 (Q64.5)",
869
+ "default": "—",
870
+ "firstReleasedIn": "3.0.0-beta.49"
871
+ },
787
872
  {
788
873
  "id": "f015",
789
874
  "kind": "rename",
@@ -2944,6 +3029,20 @@
2944
3029
  "firstReleasedIn": "3.0.0-beta.36",
2945
3030
  "guide": "ai/guides/migration/v3-beta-css-classes.md"
2946
3031
  },
3032
+ {
3033
+ "id": "css:bb-button--active",
3034
+ "kind": "rename",
3035
+ "surface": "class",
3036
+ "components": [
3037
+ ".bb-button"
3038
+ ],
3039
+ "from": ".bb-button--active",
3040
+ "to": ".bb-button--pressed",
3041
+ "since": "",
3042
+ "default": "",
3043
+ "firstReleasedIn": "3.0.0-beta.48",
3044
+ "guide": "ai/guides/migration/v3-beta-css-classes.md"
3045
+ },
2947
3046
  {
2948
3047
  "id": "css:bb-commabox-item--focused",
2949
3048
  "kind": "rename",
@@ -5596,6 +5695,198 @@
5596
5695
  "ruling": "owner 2026-10-06 (Q60.9)",
5597
5696
  "guide": "v2-to-v3.md § 6 item 45 + BbTabs.guide.md § Arrow keys on server strips / § Accessibility",
5598
5697
  "firstReleasedIn": "3.0.0-beta.47"
5698
+ },
5699
+ {
5700
+ "id": "f306",
5701
+ "kind": "behaviour",
5702
+ "summary": "`v-bb-popover` / `v-bb-hover-card` component portals get no `close`: `emit('close')` closes nothing; use a named portal's slot `close` or the component",
5703
+ "components": [
5704
+ "BbPopover",
5705
+ "BbHoverCard"
5706
+ ],
5707
+ "description": "A component portal of v-bb-popover / v-bb-hover-card (v-bb-popover=\"NoteForm\", { portal: NoteForm }) no longer receives an onClose listener, so its emit('close') closes nothing (shipped in 3.0.0-beta.47 for one release). Only a named portal's slot gets close; content that must close its panel becomes a <BbPopoverPortal> / <BbHoverCardPortal> or uses the BbPopover / BbHoverCard component",
5708
+ "ruling": "owner 2026-10-06",
5709
+ "guide": "v2-to-v3.md § 6 item 46 + BbPopover.guide.md / BbHoverCard.guide.md § the directive",
5710
+ "firstReleasedIn": "3.0.0-beta.48"
5711
+ },
5712
+ {
5713
+ "id": "f307",
5714
+ "kind": "behaviour",
5715
+ "summary": "BbButton toggle on: `bb-button--active` → `bb-button--pressed`; new `pt:*:pressed` state",
5716
+ "components": [
5717
+ "BbButton"
5718
+ ],
5719
+ "description": "A toggle BbButton (v-model) that is on carries bb-button--pressed, not bb-button--active (no alias): it is pressed (aria-pressed=\"true\"), not \"active\". A rule on .bb-button--active stops matching. Style the on state with the new pt:root:pressed (any part, the state is component-wide), or a selector on .bb-button--pressed / [aria-pressed='true']. There is no active pt state (a pointer press is Tailwind's active: variant) and no current one (activeClass / exactActiveClass)",
5720
+ "ruling": "owner 2026-10-06 (Q60.14, button half)",
5721
+ "guide": "v2-to-v3.md § 6 item 47 + v3-beta-css-classes.md (class row) + BbButton.guide.md § Toggle buttons",
5722
+ "firstReleasedIn": "3.0.0-beta.48"
5723
+ },
5724
+ {
5725
+ "id": "f308",
5726
+ "kind": "behaviour",
5727
+ "summary": "BbTooltip / `v-bb-tooltip`: hover `delay` default 0 → 100 ms; keyboard focus shows at once; 300 ms skip delay between tooltips; `:delay=\"0\"` restores the instant hover open",
5728
+ "components": [
5729
+ "BbTooltip"
5730
+ ],
5731
+ "description": "BbTooltip and v-bb-tooltip wait 100 ms on hover before showing (the delay default was 0); keyboard focus shows them at once whatever delay says, and a tooltip the pointer reaches while another shows or within 300 ms of one closing skips its delay (shared by every tooltip, hover cards excluded). A test or flow that hovered and expected the bubble on the next tick waits ~100 ms now; :delay=\"0\" (or { delay: 0 }) restores the instant hover open",
5732
+ "ruling": "owner 2026-10-07 (Q60.22 c)",
5733
+ "guide": "v2-to-v3.md § 6 item 48 + BbTooltip.guide.md § Placement, timing, width and disabling",
5734
+ "firstReleasedIn": "3.0.0-beta.49"
5735
+ },
5736
+ {
5737
+ "id": "f309",
5738
+ "kind": "behaviour",
5739
+ "summary": "Option surfaces read `label` / `text` and `value` by default: `{ label, value }` items need no accessors; a `value` key now becomes the v-model value",
5740
+ "components": [
5741
+ "BbSelect",
5742
+ "BbSelectPopover",
5743
+ "BbRadioGroup",
5744
+ "BbCheckboxGroup",
5745
+ "BbSwitchGroup",
5746
+ "BbDropdown"
5747
+ ],
5748
+ "description": "With no item-text / item-value, an option on BbSelect, BbSelectPopover, BbRadioGroup, BbCheckboxGroup, BbSwitchGroup and a mapped BbDropdown group reads its own label (else text) as text and its own value (whatever it holds, null included) as value; before, JSON.stringify(item) and the whole object. Object items with a value key and no item-value now put item.value in v-model (:item-value=\"(item) => item\" keeps the old value). An explicit accessor wins; primitives and BbTable rows unchanged",
5749
+ "ruling": "owner 2026-10-07 (Q60.24)",
5750
+ "guide": "v2-to-v3.md § 6 item 49 + the five guides' items section + options-items-playbook.md",
5751
+ "firstReleasedIn": "3.0.0-beta.49"
5752
+ },
5753
+ {
5754
+ "id": "f316",
5755
+ "kind": "behaviour",
5756
+ "summary": "A single dropdown group with a `null` v-model shows its `value: null` row checked (the None row); a hand-written group's v-model holds row `value`s, not `key` strings",
5757
+ "components": [
5758
+ "BbDropdown",
5759
+ "BbDropdownButton"
5760
+ ],
5761
+ "description": "A single-choice BbDropdown / BbDropdownButton group whose v-model is null (or that has no selection) shows its value: null row checked, the \"None\" row, as BbSelect / BbRadioGroup already do (they match by hash); picking it emits null. A hand-written group's v-model holds its rows' values (any type, compared by hash) where it held their key strings",
5762
+ "ruling": "owner 2026-10-07 (Q64.3)",
5763
+ "guide": "v2-to-v3.md § 6 item 50 + components/bb-dropdown.md",
5764
+ "firstReleasedIn": "3.0.0-beta.49"
5765
+ },
5766
+ {
5767
+ "id": "f317",
5768
+ "kind": "behaviour",
5769
+ "summary": "Slots and useBbDropdownContext follow the fields: `{ text }` → `{ label }`; slot `group.key` → `group.id`; `#empty` `groupKey` → `groupId`; context by `id`, `selectedOptions[].label`",
5770
+ "components": [
5771
+ "BbDropdown",
5772
+ "BbDropdownButton",
5773
+ "BbTabs",
5774
+ "BbBreadcrumbs"
5775
+ ],
5776
+ "description": "Slot scopes and useBbDropdownContext follow the item fields: the row slots of BbDropdown / BbDropdownButton, BbTabs' #<value>:label / #label and BbBreadcrumbs' crumb slots hand { label } where they handed { text }; a row slot's group carries id (was key); the #loading / #empty slots' groupKey is groupId; useBbDropdownContext keys its groups by id and its selectedOptions[] carry label (was text). A destructured { text } reads undefined, no error",
5777
+ "ruling": "owner 2026-10-07 (Q64.2–Q64.5)",
5778
+ "guide": "v2-to-v3.md § 6 item 51 + components/bb-dropdown.md / bb-tabs.md / bb-breadcrumbs.md",
5779
+ "firstReleasedIn": "3.0.0-beta.49"
5780
+ },
5781
+ {
5782
+ "id": "f318",
5783
+ "kind": "behaviour",
5784
+ "summary": "`bitboss-ui check` kinds: `missing-key` → `missing-value` / `missing-id`, `duplicate-row-text` → `duplicate-row-label`; new `renamed-item-field` (ESLint `no-renamed-item-field`)",
5785
+ "components": [
5786
+ "BbDropdown",
5787
+ "BbDropdownButton"
5788
+ ],
5789
+ "description": "bitboss-ui check kinds follow the dropdown fields: missing-key is missing-value (a selectable group's row) or missing-id (a selectable group), duplicate-row-text is duplicate-row-label; the old fields themselves are the new renamed-item-field (check --fix, ESLint bitboss-ui/no-renamed-item-field). A script that matches the old kind names in check --json output needs the new ones (ESLint disable comments name rules, unchanged)",
5790
+ "ruling": "owner 2026-10-07 (Q64.2)",
5791
+ "guide": "v3-beta-tooling.md",
5792
+ "firstReleasedIn": "3.0.0-beta.49"
5793
+ },
5794
+ {
5795
+ "id": "f319",
5796
+ "kind": "behaviour",
5797
+ "summary": "BbPopover is non-modal by default (page stays live, outside click closes and lands, Tab out closes); `modal` restores the modal dialog; the phone sheet stays modal",
5798
+ "components": [
5799
+ "BbPopover"
5800
+ ],
5801
+ "description": "BbPopover is a non-modal dialog by default: a role=\"dialog\" panel without aria-modal, the page behind stays clickable, focusable and scrollable, an outside click closes it and still reaches its target (focus stays there), Escape closes it, and Tab past the last control (or Shift+Tab before the first) leaves and closes it. modal (new, default false) restores the modal <dialog> exactly (focus trap, inert page, no scroll). The phone sheet stays modal either way. Applies to v-bb-popover and the popover portals too (modal through the directive's options)",
5802
+ "ruling": "owner 2026-10-07 (Q60.10)",
5803
+ "guide": "v2-to-v3.md § 6 item 52 + BbPopover.guide.md § Accessibility",
5804
+ "firstReleasedIn": "3.0.0-beta.49"
5805
+ },
5806
+ {
5807
+ "id": "f320",
5808
+ "kind": "behaviour",
5809
+ "summary": "BbForm locks while a promise `@submit` runs: joined fields read-only, `type=submit` buttons spin; opt out with `disable-submit-lock`",
5810
+ "components": [
5811
+ "BbForm",
5812
+ "BbButton"
5813
+ ],
5814
+ "description": "While a @submit that returned a promise is pending, every field joined to the BbForm is read-only (never disabled; aria-readonly) and every type=\"submit\" BbButton inside spins; both end when it settles. A sync submit never locks. Opt out with disable-submit-lock. A useBbFormField handle gains readonly",
5815
+ "ruling": "owner 2026-10-07 (Q60.17)",
5816
+ "guide": "v2-to-v3.md § 6 item 53 + BbForm.guide.md § While it saves",
5817
+ "firstReleasedIn": "3.0.0-beta.49"
5818
+ },
5819
+ {
5820
+ "id": "f321",
5821
+ "kind": "behaviour",
5822
+ "summary": "Adjacent `group` toggle BbButtons are one Tab stop with ArrowLeft/Right, Home/End inside (roving tabindex); aria-pressed unchanged",
5823
+ "components": [
5824
+ "BbButton"
5825
+ ],
5826
+ "description": "Adjacent group toggle BbButtons (each with a v-model, side by side under one parent) are one Tab stop: Tab lands on the pressed button (else the one last focused, else the first), ArrowLeft / ArrowRight (mirrored under dir=\"rtl\", wrapping) and Home / End move focus between them, Space / Enter toggle; disabled and loading buttons are skipped. Each button keeps aria-pressed; group buttons without a v-model, a lone toggle and toggles split by another element keep one Tab stop each. A keyboard test that Tabs through such a set reaches one button, not each",
5827
+ "ruling": "owner 2026-10-07 (Q44.25-001)",
5828
+ "guide": "v2-to-v3.md § 6 item 54 + BbButton.guide.md § Toggle buttons",
5829
+ "firstReleasedIn": "3.0.0-beta.49"
5830
+ },
5831
+ {
5832
+ "id": "f322",
5833
+ "kind": "behaviour",
5834
+ "summary": "BbNumberInput formats live in the locale (`10.005,6`): the DOM text is formatted, paste reads locale grouping and `(1,234.56)` as negative; `disable-formatting` restores the old field",
5835
+ "components": [
5836
+ "BbNumberInput"
5837
+ ],
5838
+ "description": "BbNumberInput shows its number the locale's way while the user types (Q60.25: 10005,6 shows 10.005,6 in it, 10,005.6 in en; grouping per CLDR, so it shows 1000 and then 10.000). The DOM text is the formatted one: event.target.value, pt:input listeners and a consumer maxlength / pattern see it. A typed , or . is always the decimal (Q51.2's key-by-key reclassify stays); a pasted number written the locale's way is read that way (it 1.000 pasted is 1000, was 1; en 1,234 pasted is 1234, was 1.234), and a paste keeps only the FIRST number inside the text (Q60.25b round 5 + owner round 7: $1,234.56 - $2,000 is 1234.56, never the digits run together; (1,234.56) is -1234.56, was 1234.56; 1.2E+05 is 120000, was 1.205; 15 m² is 15, was 152). Leading zeros stay while focused (1.|005 Backspace leaves 005); blur rebuilds the text from the model (1,50 → 1,5); a bare - keeps the last valid value in the model instead of emitting null. disable-formatting (new) restores the previous field exactly; min-precision (new, additive) pads decimals",
5839
+ "ruling": "owner 2026-10-07 (Q60.25)",
5840
+ "guide": "v2-to-v3.md § 6 item 55 + BbNumberInput.guide.md § Locale display",
5841
+ "firstReleasedIn": "3.0.0-beta.49"
5842
+ },
5843
+ {
5844
+ "id": "f323",
5845
+ "kind": "behaviour",
5846
+ "summary": "BbNumberInput posts through a hidden input carrying `name` and the raw value; the visible input has no `name` (`form.elements[name]` is the hidden one)",
5847
+ "components": [
5848
+ "BbNumberInput"
5849
+ ],
5850
+ "description": "BbNumberInput posts through a hidden input: name moves to a sibling <input type=\"hidden\"> carrying the raw period value (10005.6), and the visible input has no name. form.elements[name], input[name=x] and FormData find the hidden input; a test or script that typed into input[name=x] targets the spinbutton (input[role=\"spinbutton\"]). Not with disable-formatting",
5851
+ "ruling": "owner 2026-10-07 (Q60.25)",
5852
+ "guide": "v2-to-v3.md § 6 item 55 + BbNumberInput.guide.md § Locale display",
5853
+ "firstReleasedIn": "3.0.0-beta.49"
5854
+ },
5855
+ {
5856
+ "id": "f324",
5857
+ "kind": "behaviour",
5858
+ "summary": "BbNumberInput `currency` / `unit` paint the symbol inside the text (`$1,234.50`, `20 kg`); `event.target.value`, `pt:input`, `maxlength` / `pattern` see it; the model stays the number",
5859
+ "components": [
5860
+ "BbNumberInput"
5861
+ ],
5862
+ "description": "BbNumberInput currency (new, ISO 4217) / unit (new, an Intl unit) paint the symbol or unit INSIDE the editable text, the locale's way ($1,234.50, 1234,50 €, CHF-1’234.56, 20 kg, 15%): event.target.value, pt:input listeners and a consumer maxlength / pattern see the shell too (a maxlength counts it); Home / End move the caret to the number's edges, never the value; the unit follows the number's plural (1 hr, 2 hrs) and at rest aria-valuetext is the spoken amount (1,234.50 US dollars). unit is typed (BbNumberUnit: kilowatt, square-meter are type errors). The model stays the number (unit=\"percent\" showing 15% is 15); currency sets the decimals unless min-precision / max-precision are set; disable-formatting ignores both",
5863
+ "ruling": "owner 2026-10-07 (Q60.25b)",
5864
+ "guide": "v2-to-v3.md § 6 item 55 + BbNumberInput.guide.md § Currency & unit fields",
5865
+ "firstReleasedIn": "3.0.0-beta.49"
5866
+ },
5867
+ {
5868
+ "id": "f325",
5869
+ "kind": "behaviour",
5870
+ "summary": "BbNumberInput with `max-precision` below 3: a second typed `,` / `.` is refused (`1.234,50` in EUR stays `1,23 €`); at 0 a typed mark refuses later digits (`12,5` is 12)",
5871
+ "components": [
5872
+ "BbNumberInput"
5873
+ ],
5874
+ "description": "BbNumberInput with max-precision=\"0\" (and a 0-digit currency, JPY): a typed , or . stays in the text and the digits after it are refused (12,5 is 12, was 125, a 100× amount); blur drops the mark. A paste of 12,5 truncates to 12 (never rounded). With max-precision below 3 (0–2, every currency field) a second typed , / . is refused once a decimal exists (owner: no hold rule): it EUR 1.234,50 stays 1,23 €, en 1,234 is 1.23; Q51.2's reclassify (1.234,56 → 1234.56) works only in fields with 3+ decimals",
5875
+ "ruling": "owner 2026-10-07 (Q60.25b)",
5876
+ "guide": "v2-to-v3.md § 6 item 55 + BbNumberInput.guide.md § Bounds & precision, § Locale display",
5877
+ "firstReleasedIn": "3.0.0-beta.49"
5878
+ },
5879
+ {
5880
+ "id": "f326",
5881
+ "kind": "behaviour",
5882
+ "summary": "BbNumberInput: `-` typed anywhere flips the sign in every field (was only at the start); a digit typed before the minus lands after it",
5883
+ "components": [
5884
+ "BbNumberInput"
5885
+ ],
5886
+ "description": "BbNumberInput: - typed anywhere flips the sign (was: only at the start; elsewhere ignored), in every field; the caret stays on its digit, and a digit typed before a negative's minus lands after it (-512, was a broken 5-12). Not with disable-formatting (the old field)",
5887
+ "ruling": "owner 2026-10-07 (Q60.25b)",
5888
+ "guide": "v2-to-v3.md § 6 item 55 + BbNumberInput.guide.md § Locale display",
5889
+ "firstReleasedIn": "3.0.0-beta.49"
5599
5890
  }
5600
5891
  ]
5601
5892
  }