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
@@ -46,7 +46,7 @@ export type { BbTabsPanelsProps, BbTabsPanelsSlots } from './types';
46
46
 
47
47
  defineOptions({ inheritAttrs: false });
48
48
  /**
49
- * The tab panels — one `section` per item, keyed by the item `key`, rendered
49
+ * The tab panels — one `section` per item, keyed by the item `value`, rendered
50
50
  * from the nearest `BbTabsRoot`/`BbTabs` context. Discovery is automatic; the
51
51
  * only props are its `pt`. Honors the root's `eager` and
52
52
  * `disableAnimateX`/`disableAnimateY` settings.
@@ -196,9 +196,13 @@ export type BbTabsItem<K extends string = string> = BbTabsInertiaOptions & {
196
196
  */
197
197
  href?: string;
198
198
  /**
199
- * String that identifies the tab.
199
+ * Identifies the tab: what `v-model` holds while it is the active one, the
200
+ * name of its slots (`#<value>` for its panel, `#<value>:label` for its
201
+ * trigger, through `slotKey`) and, with `navigation`, the URL slug.
200
202
  */
201
- key: K;
203
+ value: K;
204
+ /** Tabs have no `key` (that is `value`). Guards against the old shape. */
205
+ key?: never;
202
206
  /**
203
207
  * Label to use as the tab text.
204
208
  */
@@ -215,7 +219,7 @@ export type BbTabsItem<K extends string = string> = BbTabsInertiaOptions & {
215
219
  * Passthrough parts of `BbTabs` (plans/passthrough/BbTabs.md). Tabs do not
216
220
  * "open", so there is no `open` state.
217
221
  *
218
- * Per-item functions: on the instance, `item` also accepts `({ item, active, … }) => PtValue | false | null | undefined` — `item` is the tab's descriptor (the element of `items`: its `key`, `label`, anything else you put on it), and every state a boolean beside it, on for it (`active`, `disabled`, …) — in the `pt` object or the `:pt:item` attribute, never on a `item:<state>` key and never in the global map or a scope (they ship as JSON). Its result is merged last, after every state entry, through the same deduper; a falsy result leaves the trigger as it was. No other part takes a function. See the passthrough guide, _Per-item functions_.
222
+ * Per-item functions: on the instance, `item` also accepts `({ item, active, … }) => PtValue | false | null | undefined` — `item` is the tab's descriptor (the element of `items`: its `value`, `label`, anything else you put on it), and every state a boolean beside it, on for it (`active`, `disabled`, …) — in the `pt` object or the `:pt:item` attribute, never on a `item:<state>` key and never in the global map or a scope (they ship as JSON). Its result is merged last, after every state entry, through the same deduper; a falsy result leaves the trigger as it was. No other part takes a function. See the passthrough guide, _Per-item functions_.
219
223
  *
220
224
  * @part root - The tabs' outer element, around the strip and the panels.
221
225
  * @part wrapper - The strip's outer element: the `wrapper:prepend` slot, the
@@ -365,7 +369,9 @@ export type BbTabsRootProps<K extends string = string> =
365
369
  */
366
370
  disabled?: boolean;
367
371
  /**
368
- * Prevents rendering content before it's made visible.
372
+ * Renders every tab's panel at mount and keeps it mounted, hidden while
373
+ * inactive, instead of only the active one. One tab alone: its item's
374
+ * `eager`.
369
375
  */
370
376
  eager?: boolean;
371
377
  /**
@@ -414,9 +420,9 @@ export type BbTabsRootProps<K extends string = string> =
414
420
  */
415
421
  manualActivation?: boolean;
416
422
  /**
417
- * The current tab key. Used by v-model.
423
+ * The active tab's `value`. Used by v-model.
418
424
  */
419
- modelValue?: null | BbTabsItem<K>['key'];
425
+ modelValue?: null | BbTabsItem<K>['value'];
420
426
  /**
421
427
  * Synchronizes the current tab with the URL query parameter.
422
428
  *
@@ -517,8 +523,8 @@ export type BbTabsRootEvents<K extends string = string> = BbTabsEvents<K>;
517
523
 
518
524
  /** Props exposed by the per-tab label slots and the generic `label` fallback slot. */
519
525
  export type BbTabsSlotProps<K extends string = string> = {
520
- /** The key of the currently active tab. */
521
- current: BbTabsItem<K>['key'] | null;
526
+ /** The `value` of the currently active tab. */
527
+ current: BbTabsItem<K>['value'] | null;
522
528
  /** Zero-based index of the currently active tab. */
523
529
  currentIndex: number;
524
530
  /** Whether this tab is disabled. */
@@ -529,10 +535,10 @@ export type BbTabsSlotProps<K extends string = string> = {
529
535
  isLast: boolean;
530
536
  /** Whether this specific tab is currently active. */
531
537
  selected: boolean;
532
- /** The `label` value of this tab item. */
533
- text: BbTabsItem<K>['label'];
534
- /** The `key` value of this tab item. */
535
- value: BbTabsItem<K>['key'];
538
+ /** This tab's `label`. */
539
+ label: BbTabsItem<K>['label'];
540
+ /** This tab's `value`. */
541
+ value: BbTabsItem<K>['value'];
536
542
  /** Navigate to `'first'`, `'previous'`, `'next'`, or `'last'` tab. */
537
543
  goTo: (target: 'first' | 'previous' | 'next' | 'last') => void;
538
544
  };
@@ -555,7 +561,7 @@ export type BbTabsScrollSlotProps = {
555
561
  /**
556
562
  * Slots rendered by the tab list (the strip of triggers).
557
563
  *
558
- * @dynamicSlot `<key>:label` {BbTabsSlotProps<K>} - One tab trigger's label, by the tab `key` through `slotKey`; beats `label`, which beats the item's `label` text.
564
+ * @dynamicSlot `<value>:label` {BbTabsSlotProps<K>} - One tab trigger's label, by the tab's `value` through `slotKey`; beats `label`, which beats the item's `label` text.
559
565
  */
560
566
  export type BbTabsListSlots<K extends string = string> = {
561
567
  /**
@@ -567,16 +573,16 @@ export type BbTabsListSlots<K extends string = string> = {
567
573
  */
568
574
  'wrapper:append'?: (props: BbTabsScrollSlotProps) => any;
569
575
  /**
570
- * Fallback slot used for all tab labels when no per-tab `<key>:label` slot is provided.
576
+ * Fallback slot used for all tab labels when no per-tab `<value>:label` slot is provided.
571
577
  */
572
578
  label?: (props: BbTabsSlotProps<K>) => any;
573
579
  } & Record<string, ((props: BbTabsSlotProps<K>) => any) | undefined>;
574
580
 
575
581
  /**
576
582
  * Slots rendered by the tab panels — one per tab, keyed by the normalized
577
- * `slotKey(key)`.
583
+ * `slotKey(value)`.
578
584
  *
579
- * @dynamicSlot `<key>` {BbTabsSlotProps<K>} - One tab's content panel, by the tab `key` through `slotKey`; no fallback (an empty panel).
585
+ * @dynamicSlot `<value>` {BbTabsSlotProps<K>} - One tab's content panel, by the tab's `value` through `slotKey`; no fallback (an empty panel).
580
586
  */
581
587
  export type BbTabsPanelsSlots<K extends string = string> = Record<
582
588
  string,
@@ -584,16 +590,16 @@ export type BbTabsPanelsSlots<K extends string = string> = Record<
584
590
  >;
585
591
 
586
592
  /**
587
- * @dynamicSlot `<key>` {BbTabsSlotProps<K>} - One tab's content panel, by the tab `key` through `slotKey`; no fallback (an empty panel).
588
- * @dynamicSlot `<key>:label` {BbTabsSlotProps<K>} - One tab trigger's label, by the tab `key` through `slotKey`; beats `label`, which beats the item's `label` text.
593
+ * @dynamicSlot `<value>` {BbTabsSlotProps<K>} - One tab's content panel, by the tab's `value` through `slotKey`; no fallback (an empty panel).
594
+ * @dynamicSlot `<value>:label` {BbTabsSlotProps<K>} - One tab trigger's label, by the tab's `value` through `slotKey`; beats `label`, which beats the item's `label` text.
589
595
  */
590
596
  export type BbTabsSlots<K extends string = string> = BbTabsListSlots<K> &
591
597
  BbTabsPanelsSlots<K>;
592
598
 
593
599
  /** Props exposed by the `BbTabsRoot` default slot. */
594
600
  export type BbTabsRootSlotProps<K extends string = string> = {
595
- /** The key of the currently active tab. */
596
- current: BbTabsItem<K>['key'] | null;
601
+ /** The `value` of the currently active tab. */
602
+ current: BbTabsItem<K>['value'] | null;
597
603
  /** Zero-based index of the currently active tab. */
598
604
  currentIndex: number;
599
605
  /** Whether the active tab is the first tab. */
@@ -602,8 +608,8 @@ export type BbTabsRootSlotProps<K extends string = string> = {
602
608
  isLast: boolean;
603
609
  /** Navigate to `'first'`, `'previous'`, `'next'`, or `'last'` tab. */
604
610
  goTo: (target: 'first' | 'previous' | 'next' | 'last') => void;
605
- /** Select a tab by key. */
606
- select: (key: BbTabsItem<K>['key']) => void;
611
+ /** Select a tab by its `value`. */
612
+ select: (value: BbTabsItem<K>['value']) => void;
607
613
  };
608
614
 
609
615
  export type BbTabsRootSlots<K extends string = string> = {
@@ -177,9 +177,13 @@ export type BbTabsItem<K extends string = string> = BbTabsInertiaOptions & {
177
177
  */
178
178
  href?: string;
179
179
  /**
180
- * String that identifies the tab.
180
+ * Identifies the tab: what `v-model` holds while it is the active one, the
181
+ * name of its slots (`#<value>` for its panel, `#<value>:label` for its
182
+ * trigger, through `slotKey`) and, with `navigation`, the URL slug.
181
183
  */
182
- key: K;
184
+ value: K;
185
+ /** Tabs have no `key` (that is `value`). Guards against the old shape. */
186
+ key?: never;
183
187
  /**
184
188
  * Label to use as the tab text.
185
189
  */
@@ -196,7 +200,7 @@ export type BbTabsItem<K extends string = string> = BbTabsInertiaOptions & {
196
200
  * Passthrough parts of `BbTabs` (plans/passthrough/BbTabs.md). Tabs do not
197
201
  * "open", so there is no `open` state.
198
202
  *
199
- * Per-item functions: on the instance, `item` also accepts `({ item, active, … }) => PtValue | false | null | undefined` — `item` is the tab's descriptor (the element of `items`: its `key`, `label`, anything else you put on it), and every state a boolean beside it, on for it (`active`, `disabled`, …) — in the `pt` object or the `:pt:item` attribute, never on a `item:<state>` key and never in the global map or a scope (they ship as JSON). Its result is merged last, after every state entry, through the same deduper; a falsy result leaves the trigger as it was. No other part takes a function. See the passthrough guide, _Per-item functions_.
203
+ * Per-item functions: on the instance, `item` also accepts `({ item, active, … }) => PtValue | false | null | undefined` — `item` is the tab's descriptor (the element of `items`: its `value`, `label`, anything else you put on it), and every state a boolean beside it, on for it (`active`, `disabled`, …) — in the `pt` object or the `:pt:item` attribute, never on a `item:<state>` key and never in the global map or a scope (they ship as JSON). Its result is merged last, after every state entry, through the same deduper; a falsy result leaves the trigger as it was. No other part takes a function. See the passthrough guide, _Per-item functions_.
200
204
  *
201
205
  * @part root - The tabs' outer element, around the strip and the panels.
202
206
  * @part wrapper - The strip's outer element: the `wrapper:prepend` slot, the
@@ -346,7 +350,9 @@ export type BbTabsRootProps<K extends string = string> =
346
350
  */
347
351
  disabled?: boolean;
348
352
  /**
349
- * Prevents rendering content before it's made visible.
353
+ * Renders every tab's panel at mount and keeps it mounted, hidden while
354
+ * inactive, instead of only the active one. One tab alone: its item's
355
+ * `eager`.
350
356
  */
351
357
  eager?: boolean;
352
358
  /**
@@ -395,9 +401,9 @@ export type BbTabsRootProps<K extends string = string> =
395
401
  */
396
402
  manualActivation?: boolean;
397
403
  /**
398
- * The current tab key. Used by v-model.
404
+ * The active tab's `value`. Used by v-model.
399
405
  */
400
- modelValue?: null | BbTabsItem<K>['key'];
406
+ modelValue?: null | BbTabsItem<K>['value'];
401
407
  /**
402
408
  * Synchronizes the current tab with the URL query parameter.
403
409
  *
@@ -498,8 +504,8 @@ export type BbTabsRootEvents<K extends string = string> = BbTabsEvents<K>;
498
504
 
499
505
  /** Props exposed by the per-tab label slots and the generic `label` fallback slot. */
500
506
  export type BbTabsSlotProps<K extends string = string> = {
501
- /** The key of the currently active tab. */
502
- current: BbTabsItem<K>['key'] | null;
507
+ /** The `value` of the currently active tab. */
508
+ current: BbTabsItem<K>['value'] | null;
503
509
  /** Zero-based index of the currently active tab. */
504
510
  currentIndex: number;
505
511
  /** Whether this tab is disabled. */
@@ -510,10 +516,10 @@ export type BbTabsSlotProps<K extends string = string> = {
510
516
  isLast: boolean;
511
517
  /** Whether this specific tab is currently active. */
512
518
  selected: boolean;
513
- /** The `label` value of this tab item. */
514
- text: BbTabsItem<K>['label'];
515
- /** The `key` value of this tab item. */
516
- value: BbTabsItem<K>['key'];
519
+ /** This tab's `label`. */
520
+ label: BbTabsItem<K>['label'];
521
+ /** This tab's `value`. */
522
+ value: BbTabsItem<K>['value'];
517
523
  /** Navigate to `'first'`, `'previous'`, `'next'`, or `'last'` tab. */
518
524
  goTo: (target: 'first' | 'previous' | 'next' | 'last') => void;
519
525
  };
@@ -536,7 +542,7 @@ export type BbTabsScrollSlotProps = {
536
542
  /**
537
543
  * Slots rendered by the tab list (the strip of triggers).
538
544
  *
539
- * @dynamicSlot `<key>:label` {BbTabsSlotProps<K>} - One tab trigger's label, by the tab `key` through `slotKey`; beats `label`, which beats the item's `label` text.
545
+ * @dynamicSlot `<value>:label` {BbTabsSlotProps<K>} - One tab trigger's label, by the tab's `value` through `slotKey`; beats `label`, which beats the item's `label` text.
540
546
  */
541
547
  export type BbTabsListSlots<K extends string = string> = {
542
548
  /**
@@ -548,16 +554,16 @@ export type BbTabsListSlots<K extends string = string> = {
548
554
  */
549
555
  'wrapper:append'?: (props: BbTabsScrollSlotProps) => any;
550
556
  /**
551
- * Fallback slot used for all tab labels when no per-tab `<key>:label` slot is provided.
557
+ * Fallback slot used for all tab labels when no per-tab `<value>:label` slot is provided.
552
558
  */
553
559
  label?: (props: BbTabsSlotProps<K>) => any;
554
560
  } & Record<string, ((props: BbTabsSlotProps<K>) => any) | undefined>;
555
561
 
556
562
  /**
557
563
  * Slots rendered by the tab panels — one per tab, keyed by the normalized
558
- * `slotKey(key)`.
564
+ * `slotKey(value)`.
559
565
  *
560
- * @dynamicSlot `<key>` {BbTabsSlotProps<K>} - One tab's content panel, by the tab `key` through `slotKey`; no fallback (an empty panel).
566
+ * @dynamicSlot `<value>` {BbTabsSlotProps<K>} - One tab's content panel, by the tab's `value` through `slotKey`; no fallback (an empty panel).
561
567
  */
562
568
  export type BbTabsPanelsSlots<K extends string = string> = Record<
563
569
  string,
@@ -565,16 +571,16 @@ export type BbTabsPanelsSlots<K extends string = string> = Record<
565
571
  >;
566
572
 
567
573
  /**
568
- * @dynamicSlot `<key>` {BbTabsSlotProps<K>} - One tab's content panel, by the tab `key` through `slotKey`; no fallback (an empty panel).
569
- * @dynamicSlot `<key>:label` {BbTabsSlotProps<K>} - One tab trigger's label, by the tab `key` through `slotKey`; beats `label`, which beats the item's `label` text.
574
+ * @dynamicSlot `<value>` {BbTabsSlotProps<K>} - One tab's content panel, by the tab's `value` through `slotKey`; no fallback (an empty panel).
575
+ * @dynamicSlot `<value>:label` {BbTabsSlotProps<K>} - One tab trigger's label, by the tab's `value` through `slotKey`; beats `label`, which beats the item's `label` text.
570
576
  */
571
577
  export type BbTabsSlots<K extends string = string> = BbTabsListSlots<K> &
572
578
  BbTabsPanelsSlots<K>;
573
579
 
574
580
  /** Props exposed by the `BbTabsRoot` default slot. */
575
581
  export type BbTabsRootSlotProps<K extends string = string> = {
576
- /** The key of the currently active tab. */
577
- current: BbTabsItem<K>['key'] | null;
582
+ /** The `value` of the currently active tab. */
583
+ current: BbTabsItem<K>['value'] | null;
578
584
  /** Zero-based index of the currently active tab. */
579
585
  currentIndex: number;
580
586
  /** Whether the active tab is the first tab. */
@@ -583,8 +589,8 @@ export type BbTabsRootSlotProps<K extends string = string> = {
583
589
  isLast: boolean;
584
590
  /** Navigate to `'first'`, `'previous'`, `'next'`, or `'last'` tab. */
585
591
  goTo: (target: 'first' | 'previous' | 'next' | 'last') => void;
586
- /** Select a tab by key. */
587
- select: (key: BbTabsItem<K>['key']) => void;
592
+ /** Select a tab by its `value`. */
593
+ select: (value: BbTabsItem<K>['value']) => void;
588
594
  };
589
595
 
590
596
  export type BbTabsRootSlots<K extends string = string> = {
@@ -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"
@@ -66,7 +66,7 @@
66
66
  :loading="loading"
67
67
  :passthrough="passthrough"
68
68
  :prepend:icon="props['prepend:icon']"
69
- :readonly="readonly"
69
+ :readonly="fieldReadonly"
70
70
  :variant="variant"
71
71
  @click="onWrapperClick"
72
72
  @click:clear="onClear"
@@ -88,7 +88,7 @@
88
88
  <template v-else>
89
89
  <ChipsBox
90
90
  ref="chipsBox"
91
- :disabled="disabled || readonly"
91
+ :disabled="disabled || fieldReadonly"
92
92
  :options="selectedOptions"
93
93
  :passthrough="passthrough"
94
94
  size="lg"
@@ -105,14 +105,14 @@
105
105
  :aria-disabled="disabled || undefined"
106
106
  :aria-invalid="fieldHasErrors || undefined"
107
107
  :aria-labelledby="ariaLabelledby"
108
- :aria-readonly="readonly || undefined"
108
+ :aria-readonly="fieldReadonly || undefined"
109
109
  :autocomplete="autocomplete"
110
110
  :autofocus="autofocus"
111
111
  class="bb-tag__input"
112
112
  :disabled="disabled"
113
113
  enterkeyhint="done"
114
114
  :placeholder="placeholder"
115
- :readonly="readonly"
115
+ :readonly="fieldReadonly"
116
116
  :required="fieldRequired && !fieldModel.length"
117
117
  :aria-required="inputAriaRequired"
118
118
  size="1"
@@ -189,6 +189,7 @@ const {
189
189
  required: fieldRequired,
190
190
  ariaRequired: fieldAriaRequired,
191
191
  model: fieldModel,
192
+ readonly: fieldReadonly,
192
193
  } = useFormBinding(declaredProps, declaredEmit, {
193
194
  componentName: 'BbTag',
194
195
  identifierFallback: () => declaredProps.label,
@@ -1111,19 +1112,19 @@ export type BbTagSlots = {
1111
1112
 
1112
1113
  .bb-smooth-height {
1113
1114
  align-self: center;
1114
- text-align: left;
1115
+ text-align: start;
1115
1116
  width: 100%;
1116
1117
  }
1117
1118
 
1118
1119
  /* If there is no prepend icon, reduce left inset without clipping chip content. Also allow for the ring size to be displayed. */
1119
1120
  &:not(:has(.bb-field-input__prepend-icon)) {
1120
1121
  .bb-smooth-height:has(.bb-tag__badge) {
1121
- margin-left: calc(
1122
+ margin-inline-start: calc(
1122
1123
  var(--bb-input-px) * var(--compensation-multiplier) * -1 -
1123
1124
  var(--bb-ring-size)
1124
1125
  );
1125
1126
  .bb-tag__input-container {
1126
- padding-left: var(--bb-ring-size);
1127
+ padding-inline-start: var(--bb-ring-size);
1127
1128
  }
1128
1129
  }
1129
1130
  }
@@ -1141,7 +1142,7 @@ export type BbTagSlots = {
1141
1142
  width: 100%;
1142
1143
 
1143
1144
  .bb-tag__badge:not(:last-child) {
1144
- margin-right: 0.25rem;
1145
+ margin-inline-end: 0.25rem;
1145
1146
  }
1146
1147
 
1147
1148
  .bb-tag__input {
@@ -30,7 +30,7 @@
30
30
  :mobile="isMobile"
31
31
  :name="name"
32
32
  :passthrough="passthrough"
33
- :readonly="readonly"
33
+ :readonly="fieldReadonly"
34
34
  :reverse="reverse"
35
35
  :show-asterisk="showAsterisk"
36
36
  :show-hint="showHint"
@@ -61,7 +61,7 @@
61
61
  :loading="loading"
62
62
  :passthrough="passthrough"
63
63
  :prepend:icon="declaredProps['prepend:icon']"
64
- :readonly="readonly"
64
+ :readonly="fieldReadonly"
65
65
  :reserve-append-space="clearable"
66
66
  :variant="variant"
67
67
  @click:clear="emit('update:modelValue', emptyValue())"
@@ -77,7 +77,7 @@
77
77
  :aria-disabled="disabled || undefined"
78
78
  :aria-invalid="fieldHasErrors || undefined"
79
79
  :aria-labelledby="ariaLabelledby"
80
- :aria-readonly="readonly || undefined"
80
+ :aria-readonly="fieldReadonly || undefined"
81
81
  :autocomplete="autocomplete"
82
82
  :autofocus="autofocus"
83
83
  class="bb-text-input__input"
@@ -85,7 +85,7 @@
85
85
  :inputmode="inputMode"
86
86
  :name="name"
87
87
  :placeholder="placeholder"
88
- :readonly="readonly"
88
+ :readonly="fieldReadonly"
89
89
  :required="fieldRequired"
90
90
  :aria-required="fieldAriaRequired"
91
91
  size="1"
@@ -161,6 +161,7 @@ const {
161
161
  errors: fieldErrors,
162
162
  required: fieldRequired,
163
163
  ariaRequired: fieldAriaRequired,
164
+ readonly: fieldReadonly,
164
165
  } = useFormBinding(declaredProps, declaredEmit, {
165
166
  componentName: 'BbTextInput',
166
167
  identifierFallback: () => declaredProps.label,
@@ -29,7 +29,7 @@
29
29
  :loading="loading"
30
30
  :name="name"
31
31
  :passthrough="passthrough"
32
- :readonly="readonly"
32
+ :readonly="fieldReadonly"
33
33
  :reverse="reverse"
34
34
  :show-asterisk="showAsterisk"
35
35
  :show-hint="showHint"
@@ -64,7 +64,7 @@
64
64
  :loading="loading"
65
65
  :passthrough="passthrough"
66
66
  :prepend:icon="declaredProps['prepend:icon']"
67
- :readonly="readonly"
67
+ :readonly="fieldReadonly"
68
68
  :reserve-append-space="clearable"
69
69
  :variant="variant"
70
70
  @click:clear="emit('update:modelValue', emptyValue())"
@@ -81,14 +81,14 @@
81
81
  :aria-disabled="disabled || undefined"
82
82
  :aria-invalid="fieldHasErrors || undefined"
83
83
  :aria-labelledby="ariaLabelledby"
84
- :aria-readonly="readonly || undefined"
84
+ :aria-readonly="fieldReadonly || undefined"
85
85
  :autocomplete="autocomplete"
86
86
  :autofocus="autofocus"
87
87
  class="bb-textarea__input scrollbar-border"
88
88
  :disabled="disabled"
89
89
  :name="name"
90
90
  :placeholder="placeholder"
91
- :readonly="readonly"
91
+ :readonly="fieldReadonly"
92
92
  :required="fieldRequired"
93
93
  :aria-required="fieldAriaRequired"
94
94
  :rows="renderedRows"
@@ -161,6 +161,7 @@ const {
161
161
  errors: fieldErrors,
162
162
  required: fieldRequired,
163
163
  ariaRequired: fieldAriaRequired,
164
+ readonly: fieldReadonly,
164
165
  } = useFormBinding(declaredProps, declaredEmit, {
165
166
  componentName: 'BbTextarea',
166
167
  identifierFallback: () => declaredProps.label,
@@ -824,7 +825,7 @@ export type BbTextareaSlots = {
824
825
  .bb-smooth-height {
825
826
  align-self: center;
826
827
  flex: 1 1 auto;
827
- text-align: left;
828
+ text-align: start;
828
829
  }
829
830
 
830
831
  .bb-field-input__box {
@@ -844,7 +844,7 @@ export type BbTimePickerSlots = {
844
844
  rail sizing (and the mobile-sheet centring/touch scale) is shared with the
845
845
  time input's panel in CommonTimeSelector/index.css. */
846
846
  .bb-time-selector {
847
- margin-left: 0;
847
+ margin-inline-start: 0;
848
848
  }
849
849
  }
850
850
 
@@ -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"
@@ -64,7 +64,7 @@
64
64
  :loading="loading"
65
65
  :passthrough="passthrough"
66
66
  :prepend:icon="props['prepend:icon']"
67
- :readonly="readonly"
67
+ :readonly="fieldReadonly"
68
68
  :variant="variant"
69
69
  @click="onFieldTap"
70
70
  @click:clear="onClickClear"
@@ -169,7 +169,7 @@
169
169
  :class="{
170
170
  'bb-segmented-field__activator--active': shown,
171
171
  }"
172
- :disabled="disabled || readonly"
172
+ :disabled="disabled || fieldReadonly"
173
173
  type="button"
174
174
  @click.stop="open"
175
175
  v-bind="passthrough.activator"
@@ -203,7 +203,7 @@
203
203
  <DefinePanel>
204
204
  <CommonTimeSelector
205
205
  :ampm="ampm"
206
- :disabled="disabled || readonly"
206
+ :disabled="disabled || fieldReadonly"
207
207
  :hour="panelHour"
208
208
  :max="max"
209
209
  :meridiem="fields[timeTargetSegment].meridiem"
@@ -309,6 +309,7 @@ import CommonPopover from '../CommonPopover/CommonPopover.vue';
309
309
  import CommonTimeSelector from '../CommonTimeSelector/CommonTimeSelector.vue';
310
310
  import type { TimeUnit } from '../CommonTimeSelector/types';
311
311
  import { useMeridiem } from '../CommonTimeSelector/useMeridiem';
312
+ import { formatDateOf, timeFieldsOf } from '../BbCalendar/useDayjsLocale';
312
313
  import {
313
314
  BB_TIME_PICKER_INPUT_PT,
314
315
  type BbTimePickerInputEvents,
@@ -339,6 +340,7 @@ const {
339
340
  required: fieldRequired,
340
341
  ariaRequired: fieldAriaRequired,
341
342
  model: fieldModel,
343
+ readonly: fieldReadonly,
342
344
  } = useFormBinding(declaredProps, declaredEmit, {
343
345
  componentName: 'BbTimePickerInput',
344
346
  identifierFallback: () => declaredProps.label,
@@ -1028,6 +1030,13 @@ const onFieldTap = (event: MouseEvent) => {
1028
1030
  return;
1029
1031
  open();
1030
1032
  };
1033
+ /** A key that would change a segment's value (step, clear, type). */
1034
+ const changesSegment = (event: KeyboardEvent) =>
1035
+ event.key === 'ArrowUp' ||
1036
+ event.key === 'ArrowDown' ||
1037
+ event.key === 'Backspace' ||
1038
+ event.key === 'Delete' ||
1039
+ (event.key.length === 1 && !event.ctrlKey && !event.metaKey && !event.altKey);
1031
1040
  const onSegmentKeydown = (
1032
1041
  descriptor: FieldDescriptor,
1033
1042
  event: KeyboardEvent
@@ -1037,6 +1046,12 @@ const onSegmentKeydown = (
1037
1046
  if (!shown.value) open();
1038
1047
  return;
1039
1048
  }
1049
+ // Q60.17: a read-only field (its `readonly`, or its form saving) refuses
1050
+ // the keys that change a segment; moving between segments still works.
1051
+ if (props.readonly && changesSegment(event)) {
1052
+ event.preventDefault();
1053
+ return;
1054
+ }
1040
1055
  onFieldKeydown(descriptor, event);
1041
1056
  };
1042
1057
 
@@ -1098,15 +1113,37 @@ const onTimeSelect = ({ unit, value }: { unit: TimeUnit; value: string }) => {
1098
1113
 
1099
1114
  // ── Accessible button label ─────────────────────────────────────────────────
1100
1115
 
1116
+ /**
1117
+ * A `HH:mm(:ss)` model value as the locale says a time (Intl, CLDR): 12-hour
1118
+ * with the locale's day period when the field shows `ampm` ("3:05 PM",
1119
+ * "午後3:05"), else 24-hour ("15:05", fi "15.05"). A value that doesn't parse
1120
+ * is read as written.
1121
+ */
1122
+ const spokenTime = (value: string) => {
1123
+ const match = /^(\d{1,2}):(\d{1,2})(?::(\d{1,2}))?$/.exec(value);
1124
+ if (!match) return value;
1125
+ const [, h, m, s] = match;
1126
+ return formatDateOf(
1127
+ new Date(2000, 0, 1, +h, +m, +(s ?? 0)),
1128
+ config.locale,
1129
+ timeFieldsOf(!!props.ampm, !!props.seconds)
1130
+ );
1131
+ };
1132
+
1101
1133
  const accessibleButtonLabel = computed(() => {
1102
1134
  if (props.range) {
1103
1135
  const values = Array.isArray(props.modelValue) ? props.modelValue : [];
1104
1136
  const [start, end] = values;
1105
1137
  if (!start || !end) return t('timePickerInput.emptyRange').value;
1106
- return t('timePickerInput.changeSelectionRange', start, end).value;
1138
+ return t(
1139
+ 'timePickerInput.changeSelectionRange',
1140
+ spokenTime(start),
1141
+ spokenTime(end)
1142
+ ).value;
1107
1143
  }
1108
1144
  if (typeof props.modelValue === 'string' && props.modelValue) {
1109
- return t('timePickerInput.changeSelection', props.modelValue).value;
1145
+ return t('timePickerInput.changeSelection', spokenTime(props.modelValue))
1146
+ .value;
1110
1147
  }
1111
1148
  return t('timePickerInput.emptySelection').value;
1112
1149
  });
@@ -1563,9 +1600,9 @@ export type BbTimePickerInputSlots = {
1563
1600
  .bb-time-picker-input__panel {
1564
1601
  /* The panel hosts only the time columns — no calendar to align with. */
1565
1602
  .bb-time-selector {
1566
- border-left: 0;
1567
- margin-left: 0;
1568
- padding-left: 0;
1603
+ border-inline-start: 0;
1604
+ margin-inline-start: 0;
1605
+ padding-inline-start: 0;
1569
1606
  }
1570
1607
  }
1571
1608
 
@@ -383,14 +383,17 @@ export type BbToastProps = {
383
383
  }
384
384
  .bb-toast--top-left,
385
385
  .bb-toast--bottom-left {
386
+ /* stylelint-disable-next-line property-disallowed-list -- geometry: the `position` prop names a physical corner */
386
387
  left: calc(var(--offset) + var(--safe-h, 0px));
387
388
  }
388
389
  .bb-toast--top-right,
389
390
  .bb-toast--bottom-right {
391
+ /* stylelint-disable-next-line property-disallowed-list -- geometry: the `position` prop names a physical corner */
390
392
  right: calc(var(--offset) + var(--safe-h, 0px));
391
393
  }
392
394
  .bb-toast--top-center,
393
395
  .bb-toast--bottom-center {
396
+ /* stylelint-disable-next-line property-disallowed-list -- geometry: centred with a physical translate */
394
397
  left: 50%;
395
398
  transform: translateX(-50%);
396
399
  }
@@ -440,11 +443,11 @@ export type BbToastProps = {
440
443
  box-sizing: border-box;
441
444
  color: var(--fg);
442
445
  height: var(--toast-height);
443
- left: 0;
446
+ inset-inline-end: 0;
447
+ inset-inline-start: 0;
444
448
  overflow: hidden;
445
449
  pointer-events: auto;
446
450
  position: absolute;
447
- right: 0;
448
451
  touch-action: none;
449
452
 
450
453
  transform: translate3d(
@@ -587,7 +590,7 @@ export type BbToastProps = {
587
590
  /* Portal content fills the row (no icon column) and leaves room for the close
588
591
  * button when one is shown. */
589
592
  .bb-toast__content--portal {
590
- padding-right: 4px;
593
+ padding-inline-end: 4px;
591
594
  }
592
595
 
593
596
  .bb-toast__close {
@@ -599,11 +602,11 @@ export type BbToastProps = {
599
602
  cursor: pointer;
600
603
  display: flex;
601
604
  height: 22px;
605
+ inset-inline-end: 8px;
602
606
  justify-content: center;
603
607
  opacity: 0;
604
608
  padding: 0;
605
609
  position: absolute;
606
- right: 8px;
607
610
  top: 8px;
608
611
  transition:
609
612
  opacity 0.15s var(--bb-ease),
@@ -657,8 +660,8 @@ export type BbToastProps = {
657
660
  @media (max-width: 600px) {
658
661
  .bb-toast {
659
662
  --offset: 14px;
660
- left: var(--offset);
661
- right: var(--offset);
663
+ inset-inline-end: var(--offset);
664
+ inset-inline-start: var(--offset);
662
665
  width: auto;
663
666
  }
664
667
  .bb-toast--top-center,
@@ -696,8 +699,8 @@ export type BbToastProps = {
696
699
  --hit: 44px;
697
700
  content: '';
698
701
  height: calc(var(--hit) - 2px);
702
+ inset-inline-end: -8px; /* the button's inset from the card corner */
699
703
  position: absolute;
700
- right: -8px; /* the button's inset from the card corner */
701
704
  top: -8px;
702
705
  width: var(--hit);
703
706
  }