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
@@ -69,7 +69,8 @@
69
69
  <script setup lang="ts">
70
70
  import { BbBaseButton, BbSpinner } from '@/index';
71
71
  import BbIcon from '../BbIcon/BbIcon.vue';
72
- import { computed, mergeProps, ref, useAttrs, watchEffect } from 'vue';
72
+ import { computed, inject, mergeProps, ref, useAttrs, watchEffect } from 'vue';
73
+ import { BB_FORM_SUBMIT_LOCK } from '@/composables/formSubmitLock';
73
74
  import { pickBy } from '@/utilities/functions/pickBy';
74
75
  import { noop } from '@/utilities/functions/noop';
75
76
  import { useLocale } from '@/composables/useLocale';
@@ -81,6 +82,7 @@ import { extractDomContainer } from '@/utilities/functions/extractDomContainer';
81
82
  import { isEqual } from '@/utilities/functions/isEqual';
82
83
  import { usePassthrough } from '@/composables/usePassthrough';
83
84
  import { BB_BUTTON_PT, type BbButtonProps, type BbButtonSlots } from './types';
85
+ import { useToggleRoving } from './toggleRoving';
84
86
  import type { Sizes as SizeMap } from '@/types/SizeScale';
85
87
  type Sizes = keyof SizeMap;
86
88
 
@@ -125,7 +127,7 @@ if (process.env.NODE_ENV !== 'production') {
125
127
  logger.warn(
126
128
  'BbButton: `aria-pressed` is managed by the component and your binding is ignored. ' +
127
129
  'Bind `v-model` (with `true-value`/`false-value` when the state is not boolean) — ' +
128
- 'that sets `aria-pressed`, applies `bb-button--active`, and flips the value on click.'
130
+ 'that sets `aria-pressed`, applies `bb-button--pressed`, and flips the value on click.'
129
131
  );
130
132
  });
131
133
  }
@@ -143,8 +145,16 @@ const forwardedAttrs = computed(() => {
143
145
 
144
146
  const internalLoading = ref(0);
145
147
 
148
+ // Q60.17: a `type="submit"` button inside a BbForm spins while the form's
149
+ // save runs (unless the form sets `disable-submit-lock`). Other buttons in
150
+ // the form (Cancel, a row action) are untouched.
151
+ const formLock = inject(BB_FORM_SUBMIT_LOCK, null);
152
+
146
153
  const loading = computed(
147
- () => props.loading || (!!internalLoading.value && !props.disableAutoLoading)
154
+ () =>
155
+ props.loading ||
156
+ (!!internalLoading.value && !props.disableAutoLoading) ||
157
+ (props.type === 'submit' && !!formLock?.locked())
148
158
  );
149
159
 
150
160
  /** Latches on the first load; gates the spinner's <Transition> — see the template. */
@@ -166,6 +176,7 @@ const passthrough = usePassthrough({
166
176
  active: {
167
177
  loading: () => loading.value,
168
178
  disabled: () => !!props.disabled,
179
+ pressed: () => isToggle.value && isPressed.value,
169
180
  },
170
181
  });
171
182
 
@@ -288,11 +299,35 @@ const softDisabled = computed(
288
299
  () => loading.value && !props.interactiveWhileLoading
289
300
  );
290
301
 
302
+ /**
303
+ * Adjacent `group` toggles are one Tab stop with arrow keys inside
304
+ * (Q44.25-001, see `toggleRoving.ts`). A consumer `tabindex` opts a button out.
305
+ */
306
+ const roving = useToggleRoving(
307
+ buttonDom,
308
+ computed(() => !!props.group && isToggle.value && !('tabindex' in attrs)),
309
+ () => [isPressed.value, props.disabled, softDisabled.value]
310
+ );
311
+
312
+ /**
313
+ * The `tabindex` / `aria-disabled` we mean, or nothing. Written as `undefined`
314
+ * they used to reach `mergeProps` after the forwarded attrs and erase a
315
+ * consumer's own `tabindex` / `aria-disabled`: an explicit attr wins unless we
316
+ * mean one (loading takes the button out of the tab order either way).
317
+ */
318
+ const managedFocus = computed(() => {
319
+ const tabindex = softDisabled.value ? -1 : roving.tabindex.value;
320
+ return {
321
+ ...(softDisabled.value ? { 'aria-disabled': true } : {}),
322
+ ...(tabindex === undefined ? {} : { tabindex }),
323
+ };
324
+ });
325
+
291
326
  const rootBindings = computed(() =>
292
327
  mergeProps(
293
328
  propsToPass.value,
294
329
  {
295
- 'aria-disabled': softDisabled.value ? true : undefined,
330
+ ...managedFocus.value,
296
331
  'aria-pressed': isToggle.value ? isPressed.value : undefined,
297
332
  class: [
298
333
  'bb-button',
@@ -302,13 +337,14 @@ const rootBindings = computed(() =>
302
337
  'bb-button--soft-disabled': softDisabled.value,
303
338
  'bb-button--group': props.group,
304
339
  'bb-button--icon': !!props.icon,
305
- 'bb-button--active': isToggle.value && isPressed.value,
340
+ 'bb-button--pressed': isToggle.value && isPressed.value,
306
341
  [`bb-button--${props.variant}`]: props.variant !== 'none',
307
342
  },
308
343
  ],
309
344
  disabled: props.disabled,
310
- tabindex: softDisabled.value ? -1 : undefined,
311
345
  onClick,
346
+ onFocusin: roving.onFocusin,
347
+ onKeydown: roving.onKeydown,
312
348
  },
313
349
  passthrough.root
314
350
  )
@@ -358,17 +394,24 @@ type Sizes = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl';
358
394
  */
359
395
  export type BbButtonPtPart = 'root' | 'icon' | 'spinner' | 'text';
360
396
  /**
361
- * Passthrough states of `BbButton`: true while `--loading` / `--disabled`.
397
+ * Passthrough states of `BbButton`: true while `--loading` / `--disabled` /
398
+ * `--pressed`. There is no `active` state (the pointer press is Tailwind's
399
+ * `active:` variant) and no `current` state (a link to the current route is
400
+ * `activeClass` / `exactActiveClass`).
362
401
  *
363
402
  * @state disabled - Component-wide: the button is `disabled`.
364
403
  * @state loading - Component-wide: `loading` is on — the spinner shows and
365
404
  * the button ignores the pointer.
405
+ * @state pressed - Component-wide: a toggle button (`v-model`) is on —
406
+ * `aria-pressed="true"`, `--pressed` on the root.
366
407
  */
367
- export type BbButtonPtState = 'loading' | 'disabled';
408
+ export type BbButtonPtState = 'loading' | 'disabled' | 'pressed';
368
409
  /** The runtime lists the resolver is wired with — kept next to the types so the two cannot drift. */
369
410
  export const BB_BUTTON_PT = {
370
411
  parts: ['root', 'icon', 'spinner', 'text'],
371
- states: ['disabled', 'loading'],
412
+ // Order = precedence, last wins: a pressed toggle that is also disabled or
413
+ // loading shows the disabled / loading styling.
414
+ states: ['pressed', 'disabled', 'loading'],
372
415
  } as const satisfies {
373
416
  parts: readonly BbButtonPtPart[];
374
417
  states: readonly BbButtonPtState[];
@@ -455,7 +498,10 @@ export type BbButtonProps = {
455
498
  exactActiveClass?: string;
456
499
 
457
500
  /**
458
- * Identifies the button as part of a button group.
501
+ * Identifies the button as part of a button group: adjacent `group`
502
+ * buttons fuse into one segment (shared borders and radius). Adjacent
503
+ * `group` toggles (each with a `v-model`) are also one Tab stop, with
504
+ * ArrowLeft / ArrowRight / Home / End moving between them.
459
505
  */
460
506
  group?: boolean;
461
507
 
@@ -877,15 +923,6 @@ export type BbButtonSlots = {
877
923
  border-radius: var(--r);
878
924
  border-style: solid;
879
925
  border-width: var(--bw);
880
- /* Resting lift, but only on a PLATE — primary, secondary, outline and
881
- destructive opt in below. Ghost, link and `none` stay flat whatever the
882
- theme asks for, because a lift on a transparent box reads as a bug.
883
-
884
- The plates read `--elev-tier`, not `--bb-elev` directly, so the size
885
- blocks can drop xs and sm to the small tier without handing a shadow to
886
- the flat variants. */
887
- --elev-tier: var(--bb-elev); /* the shadow a plate variant may take */
888
- --elev: 0 0 0 0 transparent; /* the shadow painted; flat variants keep this */
889
926
  box-shadow:
890
927
  var(--elev),
891
928
  0px 0px 0px 0px var(--ring-color);
@@ -897,14 +934,23 @@ export type BbButtonSlots = {
897
934
  justify-content: center;
898
935
  line-height: var(--fs);
899
936
  min-height: var(--h);
900
- padding-left: var(--px);
901
- padding-right: var(--px);
937
+ padding-inline-end: var(--px);
938
+ padding-inline-start: var(--px);
902
939
  transition-duration: var(--bb-transition-fast);
903
940
  transition-property:
904
941
  box-shadow, color, background-color, border-color, min-height, font-size,
905
942
  padding-left;
906
943
  transition-timing-function: var(--bb-ease);
907
944
  vertical-align: top;
945
+ /* Resting lift, but only on a PLATE — primary, secondary, outline and
946
+ destructive opt in below. Ghost, link and `none` stay flat whatever the
947
+ theme asks for, because a lift on a transparent box reads as a bug.
948
+
949
+ The plates read `--elev-tier`, not `--bb-elev` directly, so the size
950
+ blocks can drop xs and sm to the small tier without handing a shadow to
951
+ the flat variants. */
952
+ --elev-tier: var(--bb-elev); /* the shadow a plate variant may take */
953
+ --elev: 0 0 0 0 transparent; /* the shadow painted; flat variants keep this */
908
954
 
909
955
  &:hover:not(.bb-base-button--disabled) {
910
956
  background-color: var(--bg-hover);
@@ -1004,7 +1050,7 @@ export type BbButtonSlots = {
1004
1050
  rules above, which paint `border-color` on the button and would
1005
1051
  otherwise take the left edge with them. */
1006
1052
  & + .bb-button.bb-button--group {
1007
- border-left-color: color-mix(
1053
+ border-inline-start-color: color-mix(
1008
1054
  in oklab,
1009
1055
  var(--bb-primary) 60%,
1010
1056
  var(--bb-border)
@@ -1022,7 +1068,7 @@ export type BbButtonSlots = {
1022
1068
  --elev: var(--elev-tier);
1023
1069
 
1024
1070
  & + .bb-button.bb-button--group {
1025
- border-left-color: var(--bb-secondary-pressed);
1071
+ border-inline-start-color: var(--bb-secondary-pressed);
1026
1072
  }
1027
1073
  }
1028
1074
 
@@ -1092,19 +1138,19 @@ export type BbButtonSlots = {
1092
1138
 
1093
1139
  &.bb-button--icon {
1094
1140
  min-width: var(--h);
1095
- padding-left: 0;
1096
- padding-right: 0;
1141
+ padding-inline-end: 0;
1142
+ padding-inline-start: 0;
1097
1143
  }
1098
1144
 
1099
1145
  &:has(.bb-button__prepend-icon),
1100
1146
  &.bb-button--loading:not(.bb-button--icon):not(
1101
1147
  :has(.bb-button__append-icon)
1102
1148
  ) {
1103
- padding-left: calc(var(--px) * 0.65);
1149
+ padding-inline-start: calc(var(--px) * 0.65);
1104
1150
  }
1105
1151
 
1106
1152
  &:has(.bb-button__append-icon) {
1107
- padding-right: calc(var(--px) * 0.65);
1153
+ padding-inline-end: calc(var(--px) * 0.65);
1108
1154
  }
1109
1155
 
1110
1156
  &.bb-button--soft-disabled {
@@ -1125,7 +1171,7 @@ export type BbButtonSlots = {
1125
1171
 
1126
1172
  /* No icon to hide behind: carve the spinner's slot out of the label. */
1127
1173
  + .bb-button__text {
1128
- margin-left: calc(var(--gap) + var(--icon-size));
1174
+ margin-inline-start: calc(var(--gap) + var(--icon-size));
1129
1175
  }
1130
1176
  }
1131
1177
 
@@ -1137,21 +1183,21 @@ export type BbButtonSlots = {
1137
1183
  }
1138
1184
 
1139
1185
  .bb-spinner + .bb-button__text {
1140
- margin-left: 0;
1186
+ margin-inline-start: 0;
1141
1187
  }
1142
1188
  }
1143
1189
  }
1144
1190
 
1145
1191
  &.bb-button--group {
1146
1192
  &:has(+ .bb-button--group) {
1147
- border-bottom-right-radius: 0;
1148
- border-right-width: 0;
1149
- border-top-right-radius: 0;
1193
+ border-end-end-radius: 0;
1194
+ border-inline-end-width: 0;
1195
+ border-start-end-radius: 0;
1150
1196
  }
1151
1197
 
1152
1198
  & + .bb-button--group {
1153
- border-bottom-left-radius: 0;
1154
- border-top-left-radius: 0;
1199
+ border-end-start-radius: 0;
1200
+ border-start-start-radius: 0;
1155
1201
  }
1156
1202
  }
1157
1203
 
@@ -1221,7 +1267,7 @@ export type BbButtonSlots = {
1221
1267
  --elev-tier: var(--bb-elev);
1222
1268
  }
1223
1269
  .bb-button__text {
1224
- margin-left: 0;
1270
+ margin-inline-start: 0;
1225
1271
  transition: margin-left var(--bb-transition-medium) var(--bb-ease);
1226
1272
 
1227
1273
  /* Optical centering, as on BbBadge's label. Flex centers the LINE BOX,
@@ -1265,7 +1311,7 @@ export type BbButtonSlots = {
1265
1311
  by an equal negative margin, so it lands exactly on top of the neighbour
1266
1312
  it stands in for. The fade itself is the Vue <Transition> below. */
1267
1313
  .bb-spinner {
1268
- margin-right: calc((var(--gap) + var(--icon-size)) * -1);
1314
+ margin-inline-end: calc((var(--gap) + var(--icon-size)) * -1);
1269
1315
  }
1270
1316
 
1271
1317
  /* <Transition name="bb-button-spinner"> endpoints; the duration comes from
@@ -1280,8 +1326,8 @@ export type BbButtonSlots = {
1280
1326
  it overlays the append icon by the same zero-cost trick. */
1281
1327
  &:has(.bb-button__append-icon):not(:has(.bb-button__prepend-icon)) {
1282
1328
  .bb-spinner {
1283
- margin-left: calc((var(--gap) + var(--icon-size)) * -1);
1284
- margin-right: 0;
1329
+ margin-inline-end: 0;
1330
+ margin-inline-start: calc((var(--gap) + var(--icon-size)) * -1);
1285
1331
  order: 1;
1286
1332
  }
1287
1333
  }
@@ -1159,7 +1159,7 @@ export type BbCalendarSlots = {
1159
1159
  set inline from the column count), so it is always exactly as tall as the
1160
1160
  grid. */
1161
1161
  &--datetime {
1162
- padding-right: var(--rail-w, 252px);
1162
+ padding-inline-end: var(--rail-w, 252px);
1163
1163
  position: relative;
1164
1164
  }
1165
1165
 
@@ -1175,7 +1175,7 @@ export type BbCalendarSlots = {
1175
1175
  contain-intrinsic-inline-size: var(--natural-w);
1176
1176
 
1177
1177
  container: bb-calendar / inline-size;
1178
- padding-right: 0;
1178
+ padding-inline-end: 0;
1179
1179
  width: min(100%, var(--natural-w));
1180
1180
  }
1181
1181
 
@@ -1360,7 +1360,7 @@ export type BbCalendarSlots = {
1360
1360
  /* Out of flow only while it leaves, so the box's height is the
1361
1361
  incoming month (slots included) and can ease to it. */
1362
1362
  &[class*='leave-active'] {
1363
- left: 0;
1363
+ inset-inline-start: 0;
1364
1364
  position: absolute;
1365
1365
  top: 0;
1366
1366
  }
@@ -1431,10 +1431,10 @@ export type BbCalendarSlots = {
1431
1431
  border-radius: 0;
1432
1432
  content: '';
1433
1433
  height: calc(var(--cell) - 4px);
1434
- left: 0;
1434
+ inset-inline-end: 0;
1435
+ inset-inline-start: 0;
1435
1436
  pointer-events: none;
1436
1437
  position: absolute;
1437
- right: 0;
1438
1438
  top: 2px;
1439
1439
  transition: background-color var(--bb-transition-fast);
1440
1440
  z-index: 0;
@@ -1448,12 +1448,12 @@ export type BbCalendarSlots = {
1448
1448
  /* Endpoints extend the wash on their inner side only, under the solid cap */
1449
1449
  &--first:not([class*='--last'])::before {
1450
1450
  background-color: color-mix(in oklab, var(--bb-primary) 15%, transparent);
1451
- left: 50%;
1451
+ inset-inline-start: 50%;
1452
1452
  }
1453
1453
 
1454
1454
  &--last:not([class*='--first'])::before {
1455
1455
  background-color: color-mix(in oklab, var(--bb-primary) 15%, transparent);
1456
- right: 50%;
1456
+ inset-inline-end: 50%;
1457
1457
  }
1458
1458
 
1459
1459
  /* Round the band where it terminates at a row wrap */
@@ -1473,12 +1473,12 @@ export type BbCalendarSlots = {
1473
1473
 
1474
1474
  &--preview-end::before {
1475
1475
  border-radius: 0 var(--bb-radius-sm) var(--bb-radius-sm) 0;
1476
- right: 2px;
1476
+ inset-inline-end: 2px;
1477
1477
  }
1478
1478
 
1479
1479
  &--preview-start::before {
1480
1480
  border-radius: var(--bb-radius-sm) 0 0 var(--bb-radius-sm);
1481
- left: 2px;
1481
+ inset-inline-start: 2px;
1482
1482
  }
1483
1483
 
1484
1484
  /* Days of the previous / next month are live controls: muted, never
@@ -1501,6 +1501,7 @@ export type BbCalendarSlots = {
1501
1501
  bottom: 2px;
1502
1502
  content: '';
1503
1503
  height: 2px;
1504
+ /* stylelint-disable-next-line property-disallowed-list -- geometry: centred with a physical translate */
1504
1505
  left: 50%;
1505
1506
  position: absolute;
1506
1507
  transform: translateX(-50%);
@@ -1590,7 +1591,7 @@ export type BbCalendarSlots = {
1590
1591
  &__button-menu {
1591
1592
  background-color: var(--bg);
1592
1593
  height: 100%;
1593
- left: 0;
1594
+ inset-inline-start: 0;
1594
1595
  position: absolute;
1595
1596
  top: 0;
1596
1597
  width: 100%;
@@ -1689,7 +1690,7 @@ export type BbCalendarSlots = {
1689
1690
  var(--bb-primary) 15%,
1690
1691
  transparent
1691
1692
  );
1692
- left: 50%;
1693
+ inset-inline-start: 50%;
1693
1694
  }
1694
1695
 
1695
1696
  &--last:not([class*='--first'])::before {
@@ -1698,7 +1699,7 @@ export type BbCalendarSlots = {
1698
1699
  var(--bb-primary) 15%,
1699
1700
  transparent
1700
1701
  );
1701
- right: 50%;
1702
+ inset-inline-end: 50%;
1702
1703
  }
1703
1704
 
1704
1705
  /* Row wraps: cap the band where the grid breaks. */
@@ -1819,7 +1820,7 @@ export type BbCalendarSlots = {
1819
1820
  */
1820
1821
  @container bb-calendar (width < 335px) {
1821
1822
  .bb-time-selector {
1822
- border-left: 0;
1823
+ border-inline-start: 0;
1823
1824
  border-top: var(--bb-border-w) solid var(--bb-border);
1824
1825
  margin-top: 8px;
1825
1826
  padding: 8px 0 0;
@@ -1835,7 +1836,7 @@ export type BbCalendarSlots = {
1835
1836
 
1836
1837
  @container bb-calendar (335px <= width < 385px) {
1837
1838
  :is(.bb-calendar--seconds, .bb-calendar--ampm) .bb-time-selector {
1838
- border-left: 0;
1839
+ border-inline-start: 0;
1839
1840
  border-top: var(--bb-border-w) solid var(--bb-border);
1840
1841
  margin-top: 8px;
1841
1842
  padding: 8px 0 0;
@@ -1851,7 +1852,7 @@ export type BbCalendarSlots = {
1851
1852
 
1852
1853
  @container bb-calendar (385px <= width < 389px) {
1853
1854
  .bb-calendar--ampm .bb-time-selector {
1854
- border-left: 0;
1855
+ border-inline-start: 0;
1855
1856
  border-top: var(--bb-border-w) solid var(--bb-border);
1856
1857
  margin-top: 8px;
1857
1858
  padding: 8px 0 0;
@@ -1867,7 +1868,7 @@ export type BbCalendarSlots = {
1867
1868
 
1868
1869
  @container bb-calendar (389px <= width < 439px) {
1869
1870
  .bb-calendar--seconds.bb-calendar--ampm .bb-time-selector {
1870
- border-left: 0;
1871
+ border-inline-start: 0;
1871
1872
  border-top: var(--bb-border-w) solid var(--bb-border);
1872
1873
  margin-top: 8px;
1873
1874
  padding: 8px 0 0;
@@ -26,7 +26,7 @@
26
26
  :layout="layout"
27
27
  :name="name"
28
28
  :passthrough="passthrough"
29
- :readonly="readonly"
29
+ :readonly="fieldReadonly"
30
30
  :reverse="reverse"
31
31
  :show-asterisk="showAsterisk"
32
32
  :show-hint="showHint"
@@ -71,7 +71,7 @@
71
71
  :has-errors="!!fieldHasErrors"
72
72
  :has-warnings="!!fieldHasWarnings && !fieldHasErrors"
73
73
  :indeterminate="!!indeterminate"
74
- :readonly="!!readonly"
74
+ :readonly="!!fieldReadonly"
75
75
  v-bind="passthrough.icon"
76
76
  />
77
77
  <!-- eslint-enable vue/attributes-order -->
@@ -137,6 +137,7 @@ const {
137
137
  showAsterisk,
138
138
  errors: fieldErrors,
139
139
  ariaRequired: fieldAriaRequired,
140
+ readonly: fieldReadonly,
140
141
  } = useFormBinding(declaredProps, declaredEmit, {
141
142
  componentName: 'BbCheckbox',
142
143
  identifierFallback: () => declaredProps.label,
@@ -29,7 +29,7 @@
29
29
  :loading="loading"
30
30
  :name="name"
31
31
  :passthrough="containerPassthrough"
32
- :readonly="readonly"
32
+ :readonly="fieldReadonly"
33
33
  :reverse="reverse"
34
34
  :show-asterisk="showAsterisk"
35
35
  :show-hint="showHint"
@@ -112,7 +112,7 @@
112
112
  :has-errors="!!fieldHasErrors"
113
113
  :has-warnings="!!fieldHasWarnings && !fieldHasErrors"
114
114
  :indeterminate="false"
115
- :readonly="!!readonly"
115
+ :readonly="!!fieldReadonly"
116
116
  v-bind="passthrough.part('icon', rowStates, option.item)"
117
117
  />
118
118
  <!-- eslint-enable vue/attributes-order -->
@@ -194,6 +194,7 @@ const {
194
194
  emit,
195
195
  showAsterisk,
196
196
  errors: fieldErrors,
197
+ readonly: fieldReadonly,
197
198
  } = useFormBinding(declaredProps, declaredEmit, {
198
199
  componentName: 'BbCheckboxGroup',
199
200
  identifierFallback: () => declaredProps.legend,
@@ -298,6 +299,7 @@ const { options } = useBaseOptions({
298
299
  itemText: props.itemText as any,
299
300
  itemProps: toRef(props, 'itemProps'),
300
301
  itemValue: props.itemValue as any,
302
+ optionDefaults: true,
301
303
  // A ref, not the setup-time number: a runtime `:max` change must re-gate rows.
302
304
  max: toRef(props, 'max'),
303
305
  selectable: toRef(props, 'selectable'),
@@ -754,14 +756,18 @@ export type BbCheckboxGroupProps<T> = {
754
756
  /**
755
757
  * Defines a path that returns a property of the object to use as text or a function that returns a string.
756
758
  *
757
- * @defaultValue `JSON.stringify(item)`
759
+ * Unset: own `label`, else `text` (`{ label, value }` needs no accessor).
760
+ *
761
+ * @defaultValue own `label`, else `text`, else `JSON.stringify(item)`
758
762
  */
759
763
  itemText?: ItemAccessor<T, string>;
760
764
 
761
765
  /**
762
766
  * Defines a path that returns a property of the object to use as value or a function that returns any value.
763
767
  *
764
- * @defaultValue the whole item
768
+ * Unset: own `value`, even `null`.
769
+ *
770
+ * @defaultValue own `value`, else the whole item
765
771
  */
766
772
  itemValue?: ItemAccessor<T>;
767
773
 
@@ -1072,6 +1078,7 @@ export type BbCheckboxGroupSlots<T> = {
1072
1078
  .bb-checkbox-group {
1073
1079
  .bb-field__layout--horizontal {
1074
1080
  .bb-field__label {
1081
+ /* stylelint-disable-next-line declaration-property-value-disallowed-list -- support: `float: inline-start` needs Chrome 118, above the 114 floor */
1075
1082
  float: left;
1076
1083
  }
1077
1084
  }
@@ -130,7 +130,8 @@ export type BbCollapsibleProps = {
130
130
  */
131
131
  tag?: LayoutTag;
132
132
  /**
133
- * Prevents rendering content before it's made visible.
133
+ * Renders the content at mount, while closed, instead of on the first
134
+ * open. Closed content is `inert` and `aria-hidden` either way.
134
135
  */
135
136
  eager?: boolean;
136
137
  /**
@@ -28,7 +28,7 @@
28
28
  :loading="loading"
29
29
  :name="name"
30
30
  :passthrough="passthrough"
31
- :readonly="readonly"
31
+ :readonly="fieldReadonly"
32
32
  :reverse="reverse"
33
33
  :show-asterisk="showAsterisk"
34
34
  :show-hint="showHint"
@@ -52,7 +52,7 @@
52
52
  ref="wrapperRef"
53
53
  :append:icon="props['append:icon']"
54
54
  class="bb-color-input__field"
55
- :clearable="clearable && hasValue && !readonly && !disabled"
55
+ :clearable="clearable && hasValue && !fieldReadonly && !disabled"
56
56
  :compact="compact"
57
57
  :disabled="disabled"
58
58
  :has-errors="fieldHasErrors"
@@ -61,7 +61,7 @@
61
61
  :loading="loading"
62
62
  :passthrough="passthrough"
63
63
  :prepend:icon="props['prepend:icon']"
64
- :readonly="readonly"
64
+ :readonly="fieldReadonly"
65
65
  :variant="variant"
66
66
  @click:clear="emit('update:modelValue', null)"
67
67
  >
@@ -76,7 +76,7 @@
76
76
  :aria-disabled="disabled || undefined"
77
77
  :aria-invalid="fieldHasErrors ? true : undefined"
78
78
  :aria-labelledby="ariaLabelledby"
79
- :aria-readonly="readonly || undefined"
79
+ :aria-readonly="fieldReadonly || undefined"
80
80
  :aria-required="fieldAriaRequired"
81
81
  :autocomplete="autocomplete"
82
82
  :autofocus="autofocus"
@@ -84,7 +84,7 @@
84
84
  :disabled="disabled"
85
85
  :name="name"
86
86
  :placeholder="placeholder"
87
- :readonly="readonly"
87
+ :readonly="fieldReadonly"
88
88
  :required="fieldRequired"
89
89
  size="1"
90
90
  type="text"
@@ -99,7 +99,7 @@
99
99
  :adaptive="adaptive"
100
100
  :alpha="alpha"
101
101
  :anchor="wrapperRef"
102
- :disabled="disabled || readonly"
102
+ :disabled="disabled || fieldReadonly"
103
103
  :eye-dropper="eyeDropper"
104
104
  :label="indicatorLabel"
105
105
  :model-value="fieldModel"
@@ -126,7 +126,7 @@
126
126
  <button
127
127
  v-bind="indicatorBindings(dotProps)"
128
128
  class="bb-color-input__indicator"
129
- :disabled="disabled || readonly"
129
+ :disabled="disabled || fieldReadonly"
130
130
  :style="{ backgroundColor: fieldModel ?? undefined }"
131
131
  type="button"
132
132
  />
@@ -197,6 +197,7 @@ const {
197
197
  required: fieldRequired,
198
198
  ariaRequired: fieldAriaRequired,
199
199
  model: fieldModel,
200
+ readonly: fieldReadonly,
200
201
  } = useFormBinding(declaredProps, declaredEmit, {
201
202
  componentName: 'BbColorInput',
202
203
  identifierFallback: () => declaredProps.label,
@@ -900,11 +901,11 @@ export type BbColorInputSlots = {
900
901
  &::after {
901
902
  content: '';
902
903
  height: calc(var(--bb-input-h) - 2 * var(--bb-border-w));
903
- position: absolute;
904
- right: max(
904
+ inset-inline-end: max(
905
905
  calc((var(--bb-input-icon) - var(--bb-input-h)) / 2),
906
906
  calc(var(--bb-input-px) * -1)
907
907
  );
908
+ position: absolute;
908
909
  top: 50%;
909
910
  transform: translateY(-50%);
910
911
  width: var(--bb-input-h);
@@ -1290,7 +1290,8 @@ export type BbColorPaletteProps = {
1290
1290
  */
1291
1291
  disableFlip?: boolean;
1292
1292
  /**
1293
- * Prevents rendering content before it's made visible.
1293
+ * Renders the palette panel at mount instead of on the first open (the
1294
+ * phone sheet's too).
1294
1295
  */
1295
1296
  eager?: boolean;
1296
1297
  /**
@@ -313,6 +313,23 @@ export type BbConfirmProps = {
313
313
  */
314
314
  size?: keyof DialogSizes;
315
315
  };
316
+
317
+ /**
318
+ * The default slot scope of `<BbConfirmPortal>`: the ONE place this family's
319
+ * portal slot is typed (Q63.8), so tooling that infers `props` from the call
320
+ * sites hooks a single type: `P`, the type of `props`, is the seam it will
321
+ * feed (through a type-only prop on the portal component). Until then `P` is
322
+ * `any`, so `props.person.name` type-checks with no cast.
323
+ */
324
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any -- the default is the point (Q63.8)
325
+ export type BbConfirmPortalSlotProps<P = any> = {
326
+ /** The `portalProps` the `confirm()` passed. */
327
+ props: P;
328
+ /** Resolves the confirm with `true`. */
329
+ yes: () => void;
330
+ /** Resolves the confirm with `false`. */
331
+ no: () => void;
332
+ };
316
333
  ```
317
334
 
318
335
  ## Styles
@@ -337,7 +354,7 @@ export type BbConfirmProps = {
337
354
  display: flex;
338
355
  justify-content: flex-end;
339
356
  > :not(:last-child) {
340
- margin-right: 12px;
357
+ margin-inline-end: 12px;
341
358
  }
342
359
  }
343
360
  }