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
@@ -308,14 +308,17 @@ export type BbToastProps = {
308
308
  }
309
309
  .bb-toast--top-left,
310
310
  .bb-toast--bottom-left {
311
+ /* stylelint-disable-next-line property-disallowed-list -- geometry: the `position` prop names a physical corner */
311
312
  left: calc(var(--offset) + var(--safe-h, 0px));
312
313
  }
313
314
  .bb-toast--top-right,
314
315
  .bb-toast--bottom-right {
316
+ /* stylelint-disable-next-line property-disallowed-list -- geometry: the `position` prop names a physical corner */
315
317
  right: calc(var(--offset) + var(--safe-h, 0px));
316
318
  }
317
319
  .bb-toast--top-center,
318
320
  .bb-toast--bottom-center {
321
+ /* stylelint-disable-next-line property-disallowed-list -- geometry: centred with a physical translate */
319
322
  left: 50%;
320
323
  transform: translateX(-50%);
321
324
  }
@@ -365,11 +368,11 @@ export type BbToastProps = {
365
368
  box-sizing: border-box;
366
369
  color: var(--fg);
367
370
  height: var(--toast-height);
368
- left: 0;
371
+ inset-inline-end: 0;
372
+ inset-inline-start: 0;
369
373
  overflow: hidden;
370
374
  pointer-events: auto;
371
375
  position: absolute;
372
- right: 0;
373
376
  touch-action: none;
374
377
 
375
378
  transform: translate3d(
@@ -512,7 +515,7 @@ export type BbToastProps = {
512
515
  /* Portal content fills the row (no icon column) and leaves room for the close
513
516
  * button when one is shown. */
514
517
  .bb-toast__content--portal {
515
- padding-right: 4px;
518
+ padding-inline-end: 4px;
516
519
  }
517
520
 
518
521
  .bb-toast__close {
@@ -524,11 +527,11 @@ export type BbToastProps = {
524
527
  cursor: pointer;
525
528
  display: flex;
526
529
  height: 22px;
530
+ inset-inline-end: 8px;
527
531
  justify-content: center;
528
532
  opacity: 0;
529
533
  padding: 0;
530
534
  position: absolute;
531
- right: 8px;
532
535
  top: 8px;
533
536
  transition:
534
537
  opacity 0.15s var(--bb-ease),
@@ -582,8 +585,8 @@ export type BbToastProps = {
582
585
  @media (max-width: 600px) {
583
586
  .bb-toast {
584
587
  --offset: 14px;
585
- left: var(--offset);
586
- right: var(--offset);
588
+ inset-inline-end: var(--offset);
589
+ inset-inline-start: var(--offset);
587
590
  width: auto;
588
591
  }
589
592
  .bb-toast--top-center,
@@ -621,8 +624,8 @@ export type BbToastProps = {
621
624
  --hit: 44px;
622
625
  content: '';
623
626
  height: calc(var(--hit) - 2px);
627
+ inset-inline-end: -8px; /* the button's inset from the card corner */
624
628
  position: absolute;
625
- right: -8px; /* the button's inset from the card corner */
626
629
  top: -8px;
627
630
  width: var(--hit);
628
631
  }
@@ -34,10 +34,16 @@
34
34
  paragraph during SSR HTML parsing. The bubble holds phrasing content anyway.
35
35
  `role="none"`: Chromium exposes every `[popover]` element as an unnamed group
36
36
  of its own, around the `role="tooltip"` span (Q62.3, measured in the AX tree,
37
- BbTooltip.axTree.test.ts); BbHoverCard's read-only card says the same. -->
37
+ BbTooltip.axTree.test.ts); BbHoverCard's read-only card says the same.
38
+ Mounted on the first open (or at once with `eager`), never before (Q63.5):
39
+ a closed tooltip is the description node above and the activator's
40
+ listeners, so a thousand of them cost half the instances and under a third of
41
+ the mount time. Nothing a screen reader reads lives in here before it opens
42
+ (the description is above), so the first open is the only change. -->
38
43
  <CommonPopover
44
+ v-if="popoverMounted"
39
45
  ref="popover"
40
- v-model="open"
46
+ v-model="popoverOpen"
41
47
  :anchor="activatorEl"
42
48
  :arrow-padding="arrowPadding"
43
49
  :boundary="boundary"
@@ -53,6 +59,7 @@
53
59
  tag="span"
54
60
  :transition-duration="transitionDuration"
55
61
  v-bind="mergeProps($attrs, passthrough.root)"
62
+ @vue:mounted="onPopoverMounted"
56
63
  >
57
64
  <span
58
65
  :id="id"
@@ -87,6 +94,7 @@ import {
87
94
  } from '@/utils/overlayEscapeStack';
88
95
  import { useUntil } from '../../composables/useUntil';
89
96
  import { useOverlayYield } from '@/composables/useOverlayYield';
97
+ import { isWarm, markHidden, markShown } from './tooltipWarmup';
90
98
  import { removedPropsFor } from '@/deprecation/removedProps';
91
99
  import { warnRemovedAttrs } from '@/utilities/functions/warnRemovedAttrs';
92
100
  import CommonPopover from '../CommonPopover/CommonPopover.vue';
@@ -119,7 +127,7 @@ const props = withDefaults(defineProps<BbTooltipProps>(), {
119
127
  placement: 'top',
120
128
  variant: 'default',
121
129
  transitionDuration: transitions.medium,
122
- delay: 0,
130
+ delay: 100,
123
131
  });
124
132
 
125
133
  const slots = defineSlots<BbTooltipSlots>();
@@ -188,6 +196,28 @@ const hasExternalActivator = computed(() => props.activator != null);
188
196
  const popoverRef = useTemplateRef('popover');
189
197
  const popoverDom = computed(() => extractDomContainer(popoverRef.value));
190
198
  const hasOpenedOnce = useUntil(open);
199
+ /** CommonPopover exists from the first open on, or from mount with `eager` (Q63.5). */
200
+ const popoverMounted = useUntil(() => !!props.eager || open.value);
201
+ /**
202
+ * Whether the popover has rendered closed once. Mounted by the first open, it
203
+ * would otherwise mount already open: no closed style to transition from, so
204
+ * the first open jumped into view while every later one faded in (owner,
205
+ * 2026-10-06). So it mounts closed, its style is computed once (the forced
206
+ * layout below), and the open reaches it on the next render, a tick later:
207
+ * same delay, same fade as every later open.
208
+ */
209
+ const popoverReady = ref(false);
210
+ const onPopoverMounted = () => {
211
+ popoverDom.value?.getBoundingClientRect();
212
+ popoverReady.value = true;
213
+ };
214
+ /** `open`, held back until the popover is ready; writes go straight through. */
215
+ const popoverOpen = computed({
216
+ get: () => open.value && popoverReady.value,
217
+ set: (value: boolean) => {
218
+ open.value = value;
219
+ },
220
+ });
191
221
 
192
222
  const setActivatorRef = (reference: unknown) => {
193
223
  const el = extractDomContainer(reference);
@@ -216,14 +246,33 @@ const scheduleClose = () => {
216
246
  _closeTimeout = setTimeout(forceClose, 50);
217
247
  };
218
248
 
249
+ /**
250
+ * A pointer arriving: wait `delay` (it filters a pointer passing over on its
251
+ * way elsewhere), unless another tooltip is showing or closed within the skip
252
+ * window (`tooltipWarmup.ts`), when the user is reading hint after hint.
253
+ */
219
254
  const scheduleOpen = () => {
220
255
  cancelClose();
221
256
  if (open.value || props.disabled || blocked()) return;
222
- _openTimeout = setTimeout(() => {
223
- if (!blocked()) open.value = true;
224
- }, props.delay);
257
+ _openTimeout = setTimeout(
258
+ () => {
259
+ if (!blocked()) open.value = true;
260
+ },
261
+ isWarm() ? 0 : props.delay
262
+ );
225
263
  };
226
264
 
265
+ /** Keyboard focus is never accidental: it shows the hint at once, whatever `delay` says. */
266
+ const openNow = () => {
267
+ cancelClose();
268
+ clearTimeout(_openTimeout);
269
+ if (open.value || props.disabled || blocked()) return;
270
+ open.value = true;
271
+ };
272
+
273
+ /** Set while a close is a yield (Q63.7), read by the warm-up bookkeeping below. */
274
+ let yielding = false;
275
+
227
276
  // Tooltips give way to anything the user opened deliberately (Q63.7), like
228
277
  // hover cards: no showing while a menu, popover, dialog, select or picker is
229
278
  // open — unless the trigger is inside it — and a shown one hides. Only the
@@ -232,7 +281,12 @@ const scheduleOpen = () => {
232
281
  const { blocked } = useOverlayYield(
233
282
  () => activatorEl.value,
234
283
  () => popoverDom.value,
235
- forceClose
284
+ () => {
285
+ // Giving way to a menu or dialog is not the user moving on: it doesn't
286
+ // warm the next tooltip up.
287
+ yielding = true;
288
+ forceClose();
289
+ }
236
290
  );
237
291
 
238
292
  /** A press on the trigger (a click, a right-click opening a menu) hides it at once. */
@@ -260,7 +314,7 @@ const onEsc = (event: KeyboardEvent) => {
260
314
  */
261
315
  const onActivatorFocus = (event: FocusEvent) => {
262
316
  const el = event.currentTarget as HTMLElement | null;
263
- if (el?.matches(':focus-visible')) scheduleOpen();
317
+ if (el?.matches(':focus-visible')) openNow();
264
318
  };
265
319
 
266
320
  /**
@@ -268,7 +322,18 @@ const onActivatorFocus = (event: FocusEvent) => {
268
322
  * it also works when the tooltip is opened via `v-model`, and never lingers
269
323
  * on the document after an external close.
270
324
  */
325
+ /** Whether this tooltip counts as showing in the shared skip window. */
326
+ let counted = false;
327
+
271
328
  watch(open, (isOpen) => {
329
+ if (isOpen && !counted) {
330
+ counted = true;
331
+ markShown();
332
+ } else if (!isOpen && counted) {
333
+ counted = false;
334
+ markHidden(!yielding);
335
+ }
336
+ yielding = false;
272
337
  if (isOpen) {
273
338
  // Transient: a shown tooltip never makes another surface give way.
274
339
  pushEscapeEntry(escapeKey, {
@@ -409,6 +474,11 @@ onBeforeUnmount(() => {
409
474
  describedByHost = null;
410
475
  }
411
476
  forceClose();
477
+ // Unmounting is not the user moving on: release the count, no warm-up.
478
+ if (counted) {
479
+ counted = false;
480
+ markHidden(false);
481
+ }
412
482
  // The open watcher may not flush during teardown — drop the listener (and
413
483
  // the stack entry, which would otherwise wedge Escape page-wide) directly.
414
484
  removeEscapeEntry(escapeKey);
@@ -537,7 +607,9 @@ export type BbTooltipProps = {
537
607
  */
538
608
  disabled?: boolean;
539
609
  /**
540
- * Prevents rendering content before it's made visible.
610
+ * Renders the tooltip's popover and content at mount instead of on the
611
+ * first open. The description screen readers hear exists from mount either
612
+ * way.
541
613
  */
542
614
  eager?: boolean;
543
615
  /**
@@ -599,9 +671,14 @@ export type BbTooltipProps = {
599
671
  */
600
672
  variant?: BbTooltipVariant;
601
673
  /**
602
- * The delay in milliseconds before the tooltip is shown.
674
+ * How long, in milliseconds, a pointer has to rest on the activator before
675
+ * the tooltip shows; it keeps hints from flashing under a pointer passing
676
+ * by. Keyboard focus shows it at once whatever this says, and so does a
677
+ * pointer arriving while another tooltip shows or within 300 ms of one
678
+ * closing (the skip delay, shared by every tooltip). `0` shows it on hover
679
+ * at once.
603
680
  *
604
- * @defaultValue `0`
681
+ * @defaultValue `100`
605
682
  */
606
683
  delay?: number;
607
684
  /**
@@ -27,7 +27,7 @@
27
27
  <script setup lang="ts" generic="Meta">
28
28
  import { removedPropsFor } from '@/deprecation/removedProps';
29
29
  import { warnRemovedAttrs } from '@/utilities/functions/warnRemovedAttrs';
30
- import { provide, useAttrs, watch } from 'vue';
30
+ import { provide, reactive, useAttrs, watch } from 'vue';
31
31
  import BbTreeLevel from './BbTreeLevel.vue';
32
32
  import { BbTreeContextKey, type BbTreeContext } from './context';
33
33
  import { usePassthrough } from '@/composables/usePassthrough';
@@ -113,9 +113,27 @@ if (process.env.NODE_ENV !== 'production')
113
113
  ),
114
114
  });
115
115
 
116
+ /*
117
+ * Q44.22 (B): the open state per node. A reactive Set tracks `has(hash)` per
118
+ * key, so a level's nodes depend on their own entries only: toggling one
119
+ * branch re-renders the level that holds it, not every level of the tree
120
+ * (the shared index object used to invalidate them all). Kept in sync with
121
+ * the model synchronously, before any render reads it.
122
+ */
123
+ const expandedHashes = reactive(new Set<string>());
124
+ watch(
125
+ expandedItemsIndexedByHash,
126
+ (index) => {
127
+ for (const key of expandedHashes)
128
+ if (!(key in index)) expandedHashes.delete(key);
129
+ for (const key of Object.keys(index)) expandedHashes.add(key);
130
+ },
131
+ { immediate: true, flush: 'sync' }
132
+ );
133
+
116
134
  /* Leaves have nothing to hide, so they always count as expanded. */
117
135
  const isExpanded = (item: BbTreeItem<Meta>) =>
118
- !item.children?.length || hashFor(item) in expandedItemsIndexedByHash.value;
136
+ !item.children?.length || expandedHashes.has(hashFor(item));
119
137
 
120
138
  const toggleExpanded = (item: BbTreeItem<Meta>) => {
121
139
  const value = valueFor(item);
@@ -399,7 +417,7 @@ export type BbTreeLevelProps<Meta = any> = {
399
417
 
400
418
  > .bb-tree__children {
401
419
  overflow: hidden;
402
- padding-left: var(--indent);
420
+ padding-inline-start: var(--indent);
403
421
 
404
422
  > .bb-tree__item:first-child {
405
423
  margin-top: var(--gap);
@@ -930,7 +930,7 @@ export type CommonFieldSlots = {
930
930
  }
931
931
 
932
932
  .bb-field__label {
933
- left: var(--bb-input-px);
933
+ inset-inline-start: var(--bb-input-px);
934
934
  top: 5px;
935
935
  }
936
936
 
@@ -957,7 +957,7 @@ export type CommonFieldSlots = {
957
957
  /* Keep inside labels single-line and clipped in crowded layouts. */
958
958
  display: -webkit-box;
959
959
  font-size: var(--bb-label-fs-sm);
960
- left: var(--inside-label-offset-l);
960
+ inset-inline-start: var(--inside-label-offset-l);
961
961
  -webkit-line-clamp: 1;
962
962
  line-height: var(--bb-label-lh-sm);
963
963
  max-width: calc(
@@ -1086,7 +1086,7 @@ export type CommonFieldSlots = {
1086
1086
  It shrinks to the small size only when it rises to the border. */
1087
1087
  font-size: var(--bb-label-fs);
1088
1088
  font-weight: var(--bb-label-weight);
1089
- left: 0;
1089
+ inset-inline-start: 0;
1090
1090
  line-height: 1;
1091
1091
  max-width: calc(100% - var(--fl-rest-l) - var(--fl-rest-r));
1092
1092
  opacity: 0.6;
@@ -1310,12 +1310,14 @@ export type CommonFieldSlots = {
1310
1310
  transition-timing-function: var(--bb-ease);
1311
1311
 
1312
1312
  &--left {
1313
+ /* stylelint-disable-next-line declaration-property-value-disallowed-list -- geometry: the `labelPosition` prop names a physical side */
1313
1314
  text-align: left;
1314
1315
  }
1315
1316
  &--center {
1316
1317
  text-align: center;
1317
1318
  }
1318
1319
  &--right {
1320
+ /* stylelint-disable-next-line declaration-property-value-disallowed-list -- geometry: the `labelPosition` prop names a physical side */
1319
1321
  text-align: right;
1320
1322
  }
1321
1323
  &--hidden {
@@ -1485,7 +1487,7 @@ export type CommonFieldSlots = {
1485
1487
  &.bb-field--inside-label.bb-field--description {
1486
1488
  .bb-field__description {
1487
1489
  font-size: var(--bb-description-fs-sm);
1488
- left: var(--inside-label-offset-l);
1490
+ inset-inline-start: var(--inside-label-offset-l);
1489
1491
  line-height: var(--bb-description-lh-sm);
1490
1492
  margin-top: 0;
1491
1493
  max-width: calc(
@@ -47,12 +47,17 @@
47
47
  }"
48
48
  >
49
49
  <Transition appear name="bb-field-input-icon">
50
+ <!-- `@mousedown.prevent` keeps focus in the field: the ✕ shows while
51
+ the field has focus, and WebKit does not focus a button on mousedown,
52
+ so the press blurred the field and hid the ✕ before the click landed
53
+ (clear-webkit; BbSelectPopover does the same). -->
50
54
  <!-- eslint-disable vue/attributes-order -- `pt` binds LAST so a consumer listener runs after ours (PASSTHROUGH.md T17) -->
51
55
  <ClearableButton
52
56
  v-if="shouldShowClearVisible"
53
57
  key="clear"
54
58
  class="bb-field-input__clear"
55
59
  @click="onClickClear"
60
+ @mousedown.prevent
56
61
  v-bind="passthrough?.clear"
57
62
  />
58
63
  <!-- eslint-enable vue/attributes-order -->
@@ -550,8 +555,8 @@ export type CommonFieldInputSlots = {
550
555
  min-height: calc(var(--bb-input-h) + var(--inside-label-clearance));
551
556
  min-width: 0;
552
557
  overflow: clip;
553
- padding-left: var(--bb-input-px);
554
- padding-right: var(--bb-input-px);
558
+ padding-inline-end: var(--bb-input-px);
559
+ padding-inline-start: var(--bb-input-px);
555
560
  padding-top: var(--inside-label-clearance);
556
561
 
557
562
  /* Enumerated, not `all`: background-color (disabled), border-color +
@@ -611,14 +616,14 @@ export type CommonFieldInputSlots = {
611
616
  }
612
617
 
613
618
  .bb-button:first-child {
614
- margin-left: clamp(
619
+ margin-inline-start: clamp(
615
620
  calc(var(--bb-input-px) * -1),
616
621
  calc(((var(--bb-input-h) - var(--h)) / 2) - var(--bb-input-px)),
617
622
  0px
618
623
  );
619
624
  }
620
625
  .bb-button:last-child {
621
- margin-right: clamp(
626
+ margin-inline-end: clamp(
622
627
  calc(var(--bb-input-px) * -1),
623
628
  calc(((var(--bb-input-h) - var(--h)) / 2) - var(--bb-input-px)),
624
629
  0px
@@ -629,7 +634,7 @@ export type CommonFieldInputSlots = {
629
634
  &__prepend-icon {
630
635
  color: var(--bb-text-muted);
631
636
  flex-shrink: 0;
632
- margin-left: calc(var(--bb-input-px) * 0.4 * -1);
637
+ margin-inline-start: calc(var(--bb-input-px) * 0.4 * -1);
633
638
  }
634
639
 
635
640
  /* The field's own icons are BbIcons: size them through BbIcon's `--size`
@@ -646,7 +651,7 @@ export type CommonFieldInputSlots = {
646
651
  display: grid;
647
652
  flex-shrink: 0;
648
653
  height: var(--bb-input-icon);
649
- margin-right: calc(var(--bb-input-px) * 0.4 * -1);
654
+ margin-inline-end: calc(var(--bb-input-px) * 0.4 * -1);
650
655
  place-items: center;
651
656
  width: var(--bb-input-icon);
652
657
 
@@ -698,14 +703,14 @@ export type CommonFieldInputSlots = {
698
703
  the same rhythm on both sides. It used to sit half that from the border. */
699
704
  &__prefix {
700
705
  justify-content: end;
701
- margin-left: calc(var(--bb-input-px) * -1);
702
- padding-left: var(--bb-input-px);
706
+ margin-inline-start: calc(var(--bb-input-px) * -1);
707
+ padding-inline-start: var(--bb-input-px);
703
708
  }
704
709
 
705
710
  &__suffix {
706
711
  justify-content: start;
707
- margin-right: calc(var(--bb-input-px) * -1);
708
- padding-right: var(--bb-input-px);
712
+ margin-inline-end: calc(var(--bb-input-px) * -1);
713
+ padding-inline-end: var(--bb-input-px);
709
714
  }
710
715
 
711
716
  /* Disabled — after the variants and the inner hover/focus rules so it wins
@@ -443,7 +443,9 @@ const closePopover = () => {
443
443
  .bb-common-popover__arrow {
444
444
  border-bottom: calc(var(--arrow-h) * var(--bb-arrow)) solid
445
445
  var(--border-color);
446
+ /* stylelint-disable-next-line property-disallowed-list -- geometry: the arrow follows the side Floating UI placed the panel on */
446
447
  border-left: calc(var(--arrow-w) / 2 * var(--bb-arrow)) solid transparent;
448
+ /* stylelint-disable-next-line property-disallowed-list -- geometry: the arrow follows the side Floating UI placed the panel on */
447
449
  border-right: calc(var(--arrow-w) / 2 * var(--bb-arrow)) solid transparent;
448
450
  height: 0;
449
451
  position: relative;
@@ -451,8 +453,10 @@ const closePopover = () => {
451
453
 
452
454
  &::after {
453
455
  border-bottom: calc(var(--arrow-h) * var(--bb-arrow)) solid var(--bg);
456
+ /* stylelint-disable-next-line property-disallowed-list -- geometry: the arrow follows the side Floating UI placed the panel on */
454
457
  border-left: calc(var(--arrow-w) / 2 * var(--bb-arrow)) solid
455
458
  transparent;
459
+ /* stylelint-disable-next-line property-disallowed-list -- geometry: the arrow follows the side Floating UI placed the panel on */
456
460
  border-right: calc(var(--arrow-w) / 2 * var(--bb-arrow)) solid
457
461
  transparent;
458
462
  content: '';
@@ -491,6 +495,7 @@ const closePopover = () => {
491
495
  .bb-common-popover__arrow {
492
496
  border-bottom: calc(var(--arrow-w) / 2 * var(--bb-arrow)) solid
493
497
  transparent;
498
+ /* stylelint-disable-next-line property-disallowed-list -- geometry: the arrow follows the side Floating UI placed the panel on */
494
499
  border-left: calc(var(--arrow-h) * var(--bb-arrow)) solid
495
500
  var(--border-color);
496
501
  border-top: calc(var(--arrow-w) / 2 * var(--bb-arrow)) solid transparent;
@@ -501,6 +506,7 @@ const closePopover = () => {
501
506
  &::after {
502
507
  border-bottom: calc(var(--arrow-w) / 2 * var(--bb-arrow)) solid
503
508
  transparent;
509
+ /* stylelint-disable-next-line property-disallowed-list -- geometry: the arrow follows the side Floating UI placed the panel on */
504
510
  border-left: calc(var(--arrow-h) * var(--bb-arrow)) solid var(--bg);
505
511
  border-top: calc(var(--arrow-w) / 2 * var(--bb-arrow)) solid transparent;
506
512
  content: '';
@@ -593,7 +599,8 @@ export type CommonPopoverProps = {
593
599
  */
594
600
  arrowPadding?: number;
595
601
  /**
596
- * Prevents rendering content before it's made visible.
602
+ * Renders the bubble's content at mount instead of on the first open.
603
+ * Either way it stays rendered once it has been.
597
604
  */
598
605
  eager?: boolean;
599
606
  /**
@@ -520,17 +520,17 @@ export type TimeUnit = 'hour' | 'minute' | 'second' | 'meridiem';
520
520
  row; only the painted knob matches the calendar's. */
521
521
  --time-mark: 24px;
522
522
 
523
- border-left: var(--bb-border-w) solid var(--bb-border);
523
+ border-inline-start: var(--bb-border-w) solid var(--bb-border);
524
524
  bottom: 0;
525
525
  display: flex;
526
526
  flex-direction: column;
527
+ inset-inline-end: 0;
527
528
  /* Mirror the calendar body's vertical padding (--py, 8px) top AND bottom:
528
529
  the readout then sits level with the month/year controls, the headers level
529
530
  with the weekday initials, and — because the middle scroll flexes — the last
530
531
  row anchors on the calendar's bottom edge. 12px left gutter for the divider. */
531
532
  padding: 8px 8px 8px 12px;
532
533
  position: absolute;
533
- right: 0;
534
534
  top: 0;
535
535
  width: calc(var(--rail-w, 252px) - 12px);
536
536
 
@@ -634,6 +634,7 @@ export type TimeUnit = 'hour' | 'minute' | 'second' | 'meridiem';
634
634
  border-radius: var(--bb-radius-sm);
635
635
  content: '';
636
636
  height: var(--time-mark);
637
+ /* stylelint-disable-next-line property-disallowed-list -- geometry: centred with a physical translate */
637
638
  left: 50%;
638
639
  position: absolute;
639
640
  top: 50%;
@@ -696,8 +697,8 @@ export type TimeUnit = 'hour' | 'minute' | 'second' | 'meridiem';
696
697
  position: relative;
697
698
 
698
699
  .bb-time-selector {
699
- border-left: 0;
700
- padding-left: 0;
700
+ border-inline-start: 0;
701
+ padding-inline-start: 0;
701
702
  padding-top: 8px;
702
703
  position: static;
703
704
  width: auto;
@@ -1,7 +1,7 @@
1
1
  import { useLogger as e } from "../../composables/useLogger.js";
2
- import t from "../BbBaseButton/BbBaseButton.vue.js";
3
- import { useBadgeHost as n } from "./badgeButtonContext.js";
4
- import r from "./BadgeBodyContent.vue.js";
2
+ import { useBadgeHost as t } from "./badgeButtonContext.js";
3
+ import n from "./BadgeBodyContent.vue.js";
4
+ import r from "../BbBaseButton/BbBaseButton.vue.js";
5
5
  import { computed as i, createBlock as a, createVNode as o, defineComponent as s, mergeProps as c, openBlock as l, renderSlot as u, useAttrs as d, withCtx as f } from "vue";
6
6
  //#region src/components/BbBadge/BbBadgeButton.vue?vue&type=script&setup=true&lang.ts
7
7
  var p = /*@__PURE__*/ s({
@@ -65,13 +65,15 @@ var p = /*@__PURE__*/ s({
65
65
  viewTransition: { type: Boolean }
66
66
  },
67
67
  setup(s) {
68
- let p = s, m = n();
68
+ let p = s, m = t();
69
69
  m || e().throw("[BbBadgeButton] must be rendered inside a <BbBadge> default slot.");
70
70
  let h = d(), g = i(() => !!m?.loading.value), _ = i(() => {
71
71
  let { onClick: e, ...t } = h, n = [].concat(e ?? []).filter((e) => typeof e == "function");
72
72
  return c(t, p, {
73
- "aria-disabled": g.value ? !0 : void 0,
74
- tabindex: g.value ? -1 : void 0,
73
+ ...g.value ? {
74
+ "aria-disabled": !0,
75
+ tabindex: -1
76
+ } : {},
75
77
  onClick: (e) => {
76
78
  if (g.value) {
77
79
  e.preventDefault();
@@ -81,8 +83,8 @@ var p = /*@__PURE__*/ s({
81
83
  }
82
84
  });
83
85
  });
84
- return (e, n) => (l(), a(t, c({ class: "bb-badge__body" }, _.value), {
85
- default: f(() => [o(r, null, {
86
+ return (e, t) => (l(), a(r, c({ class: "bb-badge__body" }, _.value), {
87
+ default: f(() => [o(n, null, {
86
88
  default: f(() => [u(e.$slots, "default")]),
87
89
  _: 3
88
90
  })]),
@@ -1,10 +1,10 @@
1
1
  import { usePassthrough as e } from "../../composables/usePassthrough.js";
2
2
  import { useConfig as t } from "../../composables/useConfig.js";
3
3
  import { useHydrated as n } from "../../composables/useHydrated.js";
4
- import { useFrameworkDetection as r } from "../../composables/useFrameworkDetection.js";
5
- import i from "./RouterComponent.vue.js";
6
- import { useInertiaPage as a } from "../../composables/useInertiaPage.js";
7
- import { BB_BASE_BUTTON_PT as o } from "./types.js";
4
+ import { BB_BASE_BUTTON_PT as r } from "./types.js";
5
+ import { useFrameworkDetection as i } from "../../composables/useFrameworkDetection.js";
6
+ import a from "./RouterComponent.vue.js";
7
+ import { useInertiaPage as o } from "../../composables/useInertiaPage.js";
8
8
  import { computed as s, createBlock as c, createElementBlock as l, createTextVNode as u, defineComponent as d, mergeProps as f, openBlock as p, renderSlot as m, resolveDynamicComponent as h, toDisplayString as g, unref as _, useAttrs as v, withCtx as y } from "vue";
9
9
  //#region src/components/BbBaseButton/BbBaseButton.vue?vue&type=script&setup=true&lang.ts
10
10
  var b = "http://localhost", x = /*@__PURE__*/ d({
@@ -70,10 +70,10 @@ var b = "http://localhost", x = /*@__PURE__*/ d({
70
70
  component: "BbBaseButton",
71
71
  attrs: v(),
72
72
  props: x,
73
- parts: o.parts,
74
- states: o.states,
73
+ parts: r.parts,
74
+ states: r.states,
75
75
  active: { disabled: () => !!x.disabled }
76
- }), C = t(), { isInertia: w, isNuxt: T } = r(), { isHydrated: E } = n(), { getPageUrl: D } = a(), O = typeof window < "u", k = O ? window.location.origin : null, A = (e, t) => {
76
+ }), C = t(), { isInertia: w, isNuxt: T } = i(), { isHydrated: E } = n(), { getPageUrl: D } = o(), O = typeof window < "u", k = O ? window.location.origin : null, A = (e, t) => {
77
77
  let n = e.trim();
78
78
  if (!n) return !1;
79
79
  if (n.startsWith("#") || n.startsWith("//")) return !0;
@@ -185,7 +185,7 @@ var b = "http://localhost", x = /*@__PURE__*/ d({
185
185
  ...$.value,
186
186
  ...Y()
187
187
  } : ee.value);
188
- return (e, t) => V.value ? (p(), c(i, f({
188
+ return (e, t) => V.value ? (p(), c(a, f({
189
189
  key: 0,
190
190
  class: G.value
191
191
  }, f(te.value, _(S).forwardAttrs, _(S).root)), {