bitboss-ui 3.0.0-beta.48 → 3.0.0-beta.49

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (356) hide show
  1. package/README.md +24 -7
  2. package/bin/bitboss-ui-mcp.mjs +15 -3
  3. package/bin/bitboss-ui.mjs +115 -13
  4. package/dist/ai/BbAvatar.md +1 -1
  5. package/dist/ai/BbBreadcrumbs.md +65 -65
  6. package/dist/ai/BbButton.md +16 -5
  7. package/dist/ai/BbCheckbox.md +0 -2
  8. package/dist/ai/BbCheckboxGroup.md +13 -20
  9. package/dist/ai/BbDatePickerInput.md +4 -2
  10. package/dist/ai/BbDialog.md +1 -8
  11. package/dist/ai/BbDropdown.md +231 -220
  12. package/dist/ai/BbDropdownButton.md +65 -65
  13. package/dist/ai/BbDropdownGroup.md +2 -2
  14. package/dist/ai/BbDropzone.md +10 -10
  15. package/dist/ai/BbForm.md +43 -52
  16. package/dist/ai/BbHoverCard.md +4 -2
  17. package/dist/ai/BbNumberInput.md +88 -21
  18. package/dist/ai/BbPopover.md +29 -23
  19. package/dist/ai/BbProgress.md +48 -22
  20. package/dist/ai/BbRadioGroup.md +13 -19
  21. package/dist/ai/BbSelect.md +16 -36
  22. package/dist/ai/BbSelectPopover.md +14 -30
  23. package/dist/ai/BbSmoothHeight.md +0 -2
  24. package/dist/ai/BbSwitchGroup.md +13 -20
  25. package/dist/ai/BbTable.md +11 -10
  26. package/dist/ai/BbTabs.md +106 -105
  27. package/dist/ai/BbTabsList.md +2 -2
  28. package/dist/ai/BbTabsPanels.md +1 -1
  29. package/dist/ai/BbTabsRoot.md +2 -2
  30. package/dist/ai/BbTooltip.md +24 -10
  31. package/dist/ai/BbTree.md +14 -11
  32. package/dist/ai/changelog.json +256 -5
  33. package/dist/ai/components.json +36 -34
  34. package/dist/ai/composables/useBbDropdownContext.md +16 -16
  35. package/dist/ai/composables/useBbFormField.md +5 -1
  36. package/dist/ai/composables/useBbTabsContext.md +14 -14
  37. package/dist/ai/guides/agent-contract.md +27 -27
  38. package/dist/ai/guides/ai-router.md +1 -1
  39. package/dist/ai/guides/component-picker.md +3 -3
  40. package/dist/ai/guides/fetch-items-playbook.md +1 -1
  41. package/dist/ai/guides/icons-policy.md +10 -10
  42. package/dist/ai/guides/inertia-helpers.md +120 -67
  43. package/dist/ai/guides/installation-and-plugin-setup.md +43 -15
  44. package/dist/ai/guides/migration/components/bb-breadcrumbs.md +3 -2
  45. package/dist/ai/guides/migration/components/bb-checkbox-group.md +16 -16
  46. package/dist/ai/guides/migration/components/bb-dropdown-button.md +9 -8
  47. package/dist/ai/guides/migration/components/bb-dropdown.md +15 -14
  48. package/dist/ai/guides/migration/components/bb-radio-group.md +2 -1
  49. package/dist/ai/guides/migration/components/bb-select-popover.md +6 -1
  50. package/dist/ai/guides/migration/components/bb-select.md +10 -2
  51. package/dist/ai/guides/migration/components/bb-switch-group.md +2 -1
  52. package/dist/ai/guides/migration/components/bb-tabs.md +9 -8
  53. package/dist/ai/guides/migration/components/bb-tooltip.md +1 -1
  54. package/dist/ai/guides/migration/v2-to-v3.md +114 -17
  55. package/dist/ai/guides/migration/v3-beta-tooling.md +11 -0
  56. package/dist/ai/guides/options-items-playbook.md +30 -24
  57. package/dist/ai/guides/passthrough.md +2 -2
  58. package/dist/ai/guides/preset-components.md +18 -3
  59. package/dist/ai/guides/typescript-generic-components.md +1 -1
  60. package/dist/ai/guides/validated-forms.md +11 -22
  61. package/dist/ai/guides/validation-providers.md +4 -3
  62. package/dist/ai/helpers/inertia/manifest.json +636 -0
  63. package/dist/ai/helpers/inertia/types.ts +15 -0
  64. package/dist/ai/helpers/inertia/useAsyncFn.ts +110 -0
  65. package/dist/ai/helpers/inertia/useConfirmOnRouteLeave.ts +102 -0
  66. package/dist/ai/helpers/inertia/useDeleteCmd.ts +30 -0
  67. package/dist/ai/helpers/inertia/useHasChanged.ts +36 -0
  68. package/dist/ai/helpers/inertia/useIndexById.ts +23 -0
  69. package/dist/ai/helpers/inertia/useLazyProp.ts +148 -0
  70. package/dist/ai/helpers/inertia/useLazyPropGetter.ts +50 -0
  71. package/dist/ai/helpers/inertia/useLoading.ts +20 -0
  72. package/dist/ai/helpers/inertia/usePaginatedResponseContext.ts +88 -0
  73. package/dist/ai/helpers/inertia/usePromiseForm.ts +62 -0
  74. package/dist/ai/helpers/inertia/useProp.ts +63 -0
  75. package/dist/ai/helpers/inertia/useQuery.ts +19 -0
  76. package/dist/ai/helpers/inertia/useQueryObject.ts +116 -0
  77. package/dist/ai/helpers/inertia/useResourceContext.ts +69 -0
  78. package/dist/ai/helpers/inertia/useRouteQuery.ts +54 -0
  79. package/dist/ai/helpers/inertia/useScreenSizes.ts +23 -0
  80. package/dist/ai/helpers/inertia/useTableContext.ts +34 -0
  81. package/dist/ai/helpers/inertia/useTableSelectionContext.ts +48 -0
  82. package/dist/ai/helpers/inertia/useUntil.ts +33 -0
  83. package/dist/ai/helpers/inertia/utils.ts +24 -0
  84. package/dist/ai/index.md +6 -6
  85. package/dist/ai/manifest/components/BbBreadcrumbs.json +10 -6
  86. package/dist/ai/manifest/components/BbBreadcrumbs.tree.json +1 -1
  87. package/dist/ai/manifest/components/BbButton.json +1 -1
  88. package/dist/ai/manifest/components/BbCheckboxGroup.json +2 -2
  89. package/dist/ai/manifest/components/BbDropdown.json +23 -20
  90. package/dist/ai/manifest/components/BbDropdown.tree.json +2 -2
  91. package/dist/ai/manifest/components/BbDropdownButton.json +22 -19
  92. package/dist/ai/manifest/components/BbDropdownButton.tree.json +1 -1
  93. package/dist/ai/manifest/components/BbDropdownGroup.json +2 -2
  94. package/dist/ai/manifest/components/BbForm.json +1 -0
  95. package/dist/ai/manifest/components/BbNumberInput.json +6 -1
  96. package/dist/ai/manifest/components/BbNumberInput.tree.json +2 -1
  97. package/dist/ai/manifest/components/BbPopover.json +1 -0
  98. package/dist/ai/manifest/components/BbProgress.json +6 -6
  99. package/dist/ai/manifest/components/BbProgress.tree.json +1 -0
  100. package/dist/ai/manifest/components/BbRadioGroup.json +2 -2
  101. package/dist/ai/manifest/components/BbSelect.json +2 -2
  102. package/dist/ai/manifest/components/BbSelectPopover.json +2 -2
  103. package/dist/ai/manifest/components/BbSwitchGroup.json +2 -2
  104. package/dist/ai/manifest/components/BbTabs.json +7 -6
  105. package/dist/ai/manifest/components/BbTabsList.json +3 -3
  106. package/dist/ai/manifest/components/BbTabsPanels.json +1 -1
  107. package/dist/ai/manifest/components/BbTabsRoot.json +5 -4
  108. package/dist/ai/manifest/components/BbTooltip.json +1 -1
  109. package/dist/ai/manifest/index.json +2 -2
  110. package/dist/ai/manifest/meta.json +2 -0
  111. package/dist/ai/manifest/types.advanced.json +10 -9
  112. package/dist/ai/manifest/types.api.json +5 -4
  113. package/dist/ai/recipes/inertia/approvals-inbox.md +16 -18
  114. package/dist/ai/recipes/inertia/inline-edit-workspace.md +23 -33
  115. package/dist/ai/recipes/inertia/layout-scaffold.md +16 -16
  116. package/dist/ai/recipes/inertia/onboarding.md +6 -10
  117. package/dist/ai/recipes/inertia/ownership-atlas.md +15 -18
  118. package/dist/ai/recipes/inertia/record-form.md +11 -11
  119. package/dist/ai/recipes/inertia/records-workspace.md +38 -41
  120. package/dist/ai/recipes/inertia/settings-workspace.md +26 -38
  121. package/dist/ai/recipes/inertia/upload-center.md +31 -39
  122. package/dist/ai/recipes/inertia/wizard-form.md +10 -19
  123. package/dist/ai/recipes/nuxt/approvals-inbox.md +7 -8
  124. package/dist/ai/recipes/nuxt/inline-edit-workspace.md +14 -24
  125. package/dist/ai/recipes/nuxt/layout-scaffold.md +16 -16
  126. package/dist/ai/recipes/nuxt/onboarding.md +2 -6
  127. package/dist/ai/recipes/nuxt/ownership-atlas.md +7 -9
  128. package/dist/ai/recipes/nuxt/record-form.md +5 -5
  129. package/dist/ai/recipes/nuxt/records-workspace.md +29 -31
  130. package/dist/ai/recipes/nuxt/settings-workspace.md +22 -34
  131. package/dist/ai/recipes/nuxt/upload-center.md +22 -29
  132. package/dist/ai/recipes/nuxt/wizard-form.md +3 -11
  133. package/dist/ai/recipes/vue/approvals-inbox.md +7 -8
  134. package/dist/ai/recipes/vue/inline-edit-workspace.md +14 -24
  135. package/dist/ai/recipes/vue/layout-scaffold.md +16 -16
  136. package/dist/ai/recipes/vue/onboarding.md +2 -6
  137. package/dist/ai/recipes/vue/ownership-atlas.md +7 -9
  138. package/dist/ai/recipes/vue/record-form.md +5 -5
  139. package/dist/ai/recipes/vue/records-workspace.md +29 -31
  140. package/dist/ai/recipes/vue/settings-workspace.md +22 -34
  141. package/dist/ai/recipes/vue/upload-center.md +22 -29
  142. package/dist/ai/recipes/vue/wizard-form.md +3 -11
  143. package/dist/ai/source/BbAccordion.md +1 -1
  144. package/dist/ai/source/BbAlert.md +3 -3
  145. package/dist/ai/source/BbBadge.md +2 -2
  146. package/dist/ai/source/BbBadgeButton.md +5 -4
  147. package/dist/ai/source/BbBaseButton.md +1 -1
  148. package/dist/ai/source/BbBaseRadioIcon.md +1 -0
  149. package/dist/ai/source/BbBaseSwitchIcon.md +1 -0
  150. package/dist/ai/source/BbBreadcrumbs.md +63 -42
  151. package/dist/ai/source/BbButton.md +71 -33
  152. package/dist/ai/source/BbCalendar.md +17 -16
  153. package/dist/ai/source/BbCheckbox.md +3 -2
  154. package/dist/ai/source/BbCheckboxGroup.md +11 -4
  155. package/dist/ai/source/BbColorInput.md +10 -9
  156. package/dist/ai/source/BbConfirm.md +1 -1
  157. package/dist/ai/source/BbConfirmPortal.md +1 -1
  158. package/dist/ai/source/BbDatePicker.md +2 -2
  159. package/dist/ai/source/BbDatePickerInput.md +47 -20
  160. package/dist/ai/source/BbDialog.md +5 -5
  161. package/dist/ai/source/BbDropdown.md +230 -158
  162. package/dist/ai/source/BbDropdownButton.md +19 -12
  163. package/dist/ai/source/BbDropdownGroup.md +126 -93
  164. package/dist/ai/source/BbForm.md +25 -1
  165. package/dist/ai/source/BbIndicator.md +4 -0
  166. package/dist/ai/source/BbNumberInput.md +855 -19
  167. package/dist/ai/source/BbOffCanvas.md +27 -11
  168. package/dist/ai/source/BbPagination.md +3 -3
  169. package/dist/ai/source/BbPopover.md +152 -8
  170. package/dist/ai/source/BbPopoverPortal.md +11 -0
  171. package/dist/ai/source/BbProgress.md +82 -18
  172. package/dist/ai/source/BbRadioGroup.md +12 -5
  173. package/dist/ai/source/BbRating.md +11 -9
  174. package/dist/ai/source/BbSelect.md +16 -10
  175. package/dist/ai/source/BbSelectPopover.md +29 -23
  176. package/dist/ai/source/BbSlider.md +12 -6
  177. package/dist/ai/source/BbSwitch.md +3 -2
  178. package/dist/ai/source/BbSwitchGroup.md +5 -2
  179. package/dist/ai/source/BbTable.md +102 -18
  180. package/dist/ai/source/BbTabs.md +27 -23
  181. package/dist/ai/source/BbTabsList.md +26 -22
  182. package/dist/ai/source/BbTabsPanels.md +26 -22
  183. package/dist/ai/source/BbTabsRoot.md +25 -21
  184. package/dist/ai/source/BbTag.md +10 -9
  185. package/dist/ai/source/BbTextInput.md +5 -4
  186. package/dist/ai/source/BbTextarea.md +6 -5
  187. package/dist/ai/source/BbTimePicker.md +1 -1
  188. package/dist/ai/source/BbTimePickerInput.md +46 -9
  189. package/dist/ai/source/BbToast.md +10 -7
  190. package/dist/ai/source/BbToastPortal.md +10 -7
  191. package/dist/ai/source/BbTooltip.md +54 -8
  192. package/dist/ai/source/BbTree.md +21 -3
  193. package/dist/ai/source/CommonField.md +6 -4
  194. package/dist/ai/source/CommonFieldInput.md +15 -10
  195. package/dist/ai/source/CommonPopover.md +6 -0
  196. package/dist/ai/source/CommonTimeSelector.md +5 -4
  197. package/dist/components/BbBadge/BbBadgeButton.vue_vue_type_script_setup_true_lang.js +10 -8
  198. package/dist/components/BbBaseButton/BbBaseButton.vue_vue_type_script_setup_true_lang.js +8 -8
  199. package/dist/components/BbBreadcrumbs/BbBreadcrumbs.vue_vue_type_script_setup_true_lang.js +45 -45
  200. package/dist/components/BbBreadcrumbs/types.d.ts +25 -17
  201. package/dist/components/BbButton/BbButton.vue_vue_type_script_setup_true_lang.js +84 -71
  202. package/dist/components/BbButton/toggleRoving.d.ts +6 -0
  203. package/dist/components/BbButton/toggleRoving.js +45 -0
  204. package/dist/components/BbButton/types.d.ts +4 -1
  205. package/dist/components/BbCalendar/BbCalendar.vue_vue_type_script_setup_true_lang.js +178 -178
  206. package/dist/components/BbCalendar/CalendarMonthPanel.vue_vue_type_script_setup_true_lang.js +15 -15
  207. package/dist/components/BbCalendar/CalendarYearPanel.vue_vue_type_script_setup_true_lang.js +28 -28
  208. package/dist/components/BbCalendar/useCalendarGrid.js +141 -139
  209. package/dist/components/BbCalendar/useDayjsLocale.d.ts +38 -15
  210. package/dist/components/BbCalendar/useDayjsLocale.js +31 -30
  211. package/dist/components/BbCheckbox/BbCheckbox.vue_vue_type_script_setup_true_lang.js +48 -48
  212. package/dist/components/BbCheckboxGroup/BbCheckboxGroup.vue_vue_type_script_setup_true_lang.js +81 -80
  213. package/dist/components/BbCheckboxGroup/types.d.ts +6 -2
  214. package/dist/components/BbColorInput/BbColorInput.vue_vue_type_script_setup_true_lang.js +69 -69
  215. package/dist/components/BbDatePickerInput/BbDatePickerInput.vue_vue_type_script_setup_true_lang.js +363 -349
  216. package/dist/components/BbDropdown/AdaptiveDropdown.vue_vue_type_script_setup_true_lang.js +91 -86
  217. package/dist/components/BbDropdown/BbDropdown.vue_vue_type_script_setup_true_lang.js +298 -289
  218. package/dist/components/BbDropdown/BbDropdownList.vue_vue_type_script_setup_true_lang.js +322 -356
  219. package/dist/components/BbDropdown/DropdownPipelineResolver.vue_vue_type_script_setup_true_lang.js +17 -15
  220. package/dist/components/BbDropdown/DropdownRow.vue.d.ts +40 -0
  221. package/dist/components/BbDropdown/DropdownRow.vue.js +5 -0
  222. package/dist/components/BbDropdown/DropdownRow.vue_vue_type_script_setup_true_lang.js +60 -0
  223. package/dist/components/BbDropdown/normalizeGroups.d.ts +8 -2
  224. package/dist/components/BbDropdown/normalizeGroups.js +60 -46
  225. package/dist/components/BbDropdown/types.d.ts +119 -88
  226. package/dist/components/BbDropdownButton/BbDropdownButton.vue_vue_type_script_setup_true_lang.js +11 -2
  227. package/dist/components/BbDropdownButton/types.d.ts +2 -2
  228. package/dist/components/BbForm/BbForm.vue.d.ts +9 -0
  229. package/dist/components/BbForm/BbForm.vue_vue_type_script_setup_true_lang.js +114 -105
  230. package/dist/components/BbForm/BbFormCustomField.js +1 -1
  231. package/dist/components/BbForm/bindFormField.js +2 -1
  232. package/dist/components/BbForm/formFields.d.ts +5 -0
  233. package/dist/components/BbNumberInput/BbNumberInput.vue.d.ts +0 -1
  234. package/dist/components/BbNumberInput/BbNumberInput.vue_vue_type_script_setup_true_lang.js +452 -125
  235. package/dist/components/BbNumberInput/numberDisplay.d.ts +256 -0
  236. package/dist/components/BbNumberInput/numberDisplay.js +499 -0
  237. package/dist/components/BbNumberInput/types.d.ts +54 -1
  238. package/dist/components/BbNumberInput/warroom/corpus.d.ts +58 -0
  239. package/dist/components/BbNumberInput/warroom/currency-verify.rows.d.ts +28 -0
  240. package/dist/components/BbNumberInput/warroom/currency.rows.d.ts +2 -0
  241. package/dist/components/BbNumberInput/warroom/harness.d.ts +217 -0
  242. package/dist/components/BbNumberInput/warroom/oracle.d.ts +150 -0
  243. package/dist/components/BbPagination/BbPagination.vue_vue_type_script_setup_true_lang.js +7 -7
  244. package/dist/components/BbPopover/BbPopover.vue.d.ts +1 -0
  245. package/dist/components/BbPopover/BbPopover.vue_vue_type_script_setup_true_lang.js +207 -164
  246. package/dist/components/BbPopover/types.d.ts +11 -0
  247. package/dist/components/BbProgress/BbProgress.vue_vue_type_script_setup_true_lang.js +15 -7
  248. package/dist/components/BbProgress/types.d.ts +23 -7
  249. package/dist/components/BbProgress/types.js +1 -1
  250. package/dist/components/BbRadioGroup/BbRadioGroup.vue_vue_type_script_setup_true_lang.js +102 -101
  251. package/dist/components/BbRadioGroup/types.d.ts +6 -2
  252. package/dist/components/BbRating/BbRating.vue_vue_type_script_setup_true_lang.js +63 -63
  253. package/dist/components/BbSelect/BbSelect.vue_vue_type_script_setup_true_lang.js +156 -154
  254. package/dist/components/BbSelect/types.d.ts +6 -2
  255. package/dist/components/BbSelectPopover/BbSelectPopover.vue_vue_type_script_setup_true_lang.js +2 -1
  256. package/dist/components/BbSelectPopover/types.d.ts +6 -2
  257. package/dist/components/BbSlider/BbSlider.vue_vue_type_script_setup_true_lang.js +153 -153
  258. package/dist/components/BbSwitch/BbSwitch.vue_vue_type_script_setup_true_lang.js +62 -62
  259. package/dist/components/BbSwitchGroup/BbSwitchGroup.vue_vue_type_script_setup_true_lang.js +131 -130
  260. package/dist/components/BbTable/BbTable.vue_vue_type_script_setup_true_lang.js +711 -676
  261. package/dist/components/BbTabs/BbTabs.vue_vue_type_script_setup_true_lang.js +1 -1
  262. package/dist/components/BbTabs/BbTabsList.vue_vue_type_script_setup_true_lang.js +1 -1
  263. package/dist/components/BbTabs/types.d.ts +25 -21
  264. package/dist/components/BbTag/BbTag.vue_vue_type_script_setup_true_lang.js +76 -76
  265. package/dist/components/BbTextInput/BbTextInput.vue_vue_type_script_setup_true_lang.js +58 -58
  266. package/dist/components/BbTextarea/BbTextarea.vue_vue_type_script_setup_true_lang.js +82 -82
  267. package/dist/components/BbTimePickerInput/BbTimePickerInput.vue_vue_type_script_setup_true_lang.js +246 -236
  268. package/dist/components/BbTooltip/BbTooltip.vue_vue_type_script_setup_true_lang.js +102 -97
  269. package/dist/components/BbTooltip/tooltipWarmup.d.ts +23 -0
  270. package/dist/components/BbTooltip/tooltipWarmup.js +7 -0
  271. package/dist/components/BbTooltip/types.d.ts +7 -2
  272. package/dist/components/BbTree/BbTree.vue_vue_type_script_setup_true_lang.js +29 -21
  273. package/dist/components/BbTree/BbTreeLevel.vue_vue_type_script_setup_true_lang.js +10 -7
  274. package/dist/components/CommonFieldInput/CommonFieldInput.vue_vue_type_script_setup_true_lang.js +37 -36
  275. package/dist/components/CommonTimeSelector/CommonTimeSelector.vue_vue_type_script_setup_true_lang.js +9 -9
  276. package/dist/composables/formSubmitLock.d.ts +6 -0
  277. package/dist/composables/formSubmitLock.js +4 -0
  278. package/dist/composables/useBaseOptions.d.ts +7 -1
  279. package/dist/composables/useBaseOptions.js +32 -32
  280. package/dist/composables/useBbDropdownContext.d.ts +8 -8
  281. package/dist/composables/useBbFormField.d.ts +9 -0
  282. package/dist/composables/useBbFormField.js +5 -3
  283. package/dist/composables/useBbTabsContext.d.ts +10 -10
  284. package/dist/composables/useBbTabsContext.js +18 -18
  285. package/dist/composables/useFormBinding.d.ts +11 -0
  286. package/dist/composables/useFormBinding.js +15 -13
  287. package/dist/composables/useItemText.d.ts +5 -1
  288. package/dist/composables/useItemText.js +8 -3
  289. package/dist/composables/useItemValue.d.ts +5 -1
  290. package/dist/composables/useItemValue.js +8 -3
  291. package/dist/composables/useLocale.js +10 -9
  292. package/dist/deprecation/ai-deprecations.json.d.ts +130 -0
  293. package/dist/deprecation/ai-deprecations.json.js +1 -1
  294. package/dist/deprecation/removedProps.js +1 -1
  295. package/dist/directives/bbDropdown.js +1 -1
  296. package/dist/i18n/index.d.ts +7 -12
  297. package/dist/i18n/locales/cs.json +11 -14
  298. package/dist/i18n/locales/da.json +13 -16
  299. package/dist/i18n/locales/de-CH.json +137 -0
  300. package/dist/i18n/locales/de.json +14 -17
  301. package/dist/i18n/locales/el.json +10 -13
  302. package/dist/i18n/locales/en-GB.json +137 -0
  303. package/dist/i18n/locales/en.json +8 -11
  304. package/dist/i18n/locales/es-MX.json +137 -0
  305. package/dist/i18n/locales/es.json +16 -19
  306. package/dist/i18n/locales/fi.json +8 -11
  307. package/dist/i18n/locales/fr.json +23 -26
  308. package/dist/i18n/locales/hu.json +8 -11
  309. package/dist/i18n/locales/it.json +12 -15
  310. package/dist/i18n/locales/ja.json +13 -16
  311. package/dist/i18n/locales/ko.json +10 -13
  312. package/dist/i18n/locales/nb.json +13 -16
  313. package/dist/i18n/locales/nl.json +21 -24
  314. package/dist/i18n/locales/pl.json +10 -13
  315. package/dist/i18n/locales/{pt.json → pt-BR.json} +19 -22
  316. package/dist/i18n/locales/pt-PT.json +137 -0
  317. package/dist/i18n/locales/ro.json +22 -25
  318. package/dist/i18n/locales/ru.json +11 -14
  319. package/dist/i18n/locales/sv.json +16 -19
  320. package/dist/i18n/locales/tr.json +14 -17
  321. package/dist/i18n/locales/uk.json +11 -14
  322. package/dist/i18n/locales/{zh-cn.json → zh-CN.json} +10 -13
  323. package/dist/i18n/locales/zh-HK.json +137 -0
  324. package/dist/i18n/locales/zh-TW.json +137 -0
  325. package/dist/i18n/regionHints.d.ts +16 -0
  326. package/dist/i18n/regionHints.js +49 -0
  327. package/dist/i18n/regions.d.ts +286 -0
  328. package/dist/i18n/regions.js +265 -0
  329. package/dist/index.d.ts +1 -1
  330. package/dist/index.js +4 -4
  331. package/dist/llms-full.txt +1785 -1637
  332. package/dist/llms-medium.txt +74 -46
  333. package/dist/llms.txt +7 -7
  334. package/dist/locale-blueprint.json +16 -13
  335. package/dist/styles.css +2 -2
  336. package/dist/types/ptComponentMap.d.ts +1 -1
  337. package/dist/utilities/functions/slotKey.d.ts +2 -2
  338. package/dist/utils/versionCheck.js +1 -1
  339. package/dist/vite-plugin.d.ts +22 -19
  340. package/dist/vite.js +309 -297
  341. package/llms.txt +7 -7
  342. package/package.json +5 -3
  343. package/scripts/lib/agent-manifest.mjs +2 -1
  344. package/scripts/lib/eslint-disable.mjs +12 -4
  345. package/scripts/lib/eslint-plugin.d.ts +5 -1
  346. package/scripts/lib/eslint-plugin.mjs +187 -6
  347. package/scripts/lib/helper-canon.mjs +176 -0
  348. package/scripts/lib/helpers-add.mjs +1303 -0
  349. package/scripts/lib/local-components.mjs +33 -4
  350. package/scripts/lib/locale-check.mjs +165 -0
  351. package/scripts/lib/redundant-item-accessor.mjs +398 -0
  352. package/scripts/lib/renamed-item-field.mjs +343 -0
  353. package/scripts/lib/slot-key.mjs +2 -2
  354. package/scripts/lib/slot-renames.mjs +1 -1
  355. package/scripts/lib/validate-bb-markup.mjs +123 -56
  356. package/dist/i18n/index.js +0 -27
@@ -561,6 +561,7 @@
561
561
  when there is content, since an empty `rowgroup` fails the required
562
562
  owned-elements check. -->
563
563
  <div
564
+ ref="footRef"
564
565
  class="bb-table__foot"
565
566
  :role="slots.tfoot ? 'rowgroup' : undefined"
566
567
  v-bind="passthrough.foot"
@@ -3584,11 +3585,15 @@ watch(
3584
3585
  { flush: 'post' }
3585
3586
  );
3586
3587
 
3587
- /** Builds accessible label for selection controls from row content. */
3588
+ /**
3589
+ * Builds accessible label for selection controls from row content. The row's
3590
+ * text fills a template (`Select {0}`, `{0} auswählen`, `{0}を選択`), so each
3591
+ * locale puts the verb where its grammar wants it.
3592
+ */
3588
3593
  const getAccessibleLabel = (columns: MappedCell[], item: any) =>
3589
3594
  props.accessibleLabel
3590
3595
  ? props.accessibleLabel(columns, item)
3591
- : [t('table.select').value, ...columns.map((col) => col.content)].join(' ');
3596
+ : t('table.select', columns.map((col) => col.content).join(' ')).value;
3592
3597
 
3593
3598
  const containerTag = computed(() => (props.selectable ? 'fieldset' : 'div'));
3594
3599
 
@@ -6485,11 +6490,8 @@ const tableBindings = computed(() => {
6485
6490
  ? 'true'
6486
6491
  : undefined,
6487
6492
  'aria-rowcount':
6488
- hasProvidedAccessibilityData.value && contextState.totalItems != null
6489
- ? contextState.totalItems +
6490
- 1 +
6491
- Number(edgeRows.value.first) +
6492
- Number(edgeRows.value.last)
6493
+ lastBodyRowIndex.value !== undefined
6494
+ ? lastBodyRowIndex.value + footRowCount.value
6493
6495
  : undefined,
6494
6496
  // The grid grammar, delegated: a plain table carries no listener.
6495
6497
  ...(gridMode.value
@@ -6593,18 +6595,94 @@ const edgeRowContext = computed<EdgeRowContext>(() => ({
6593
6595
  * `flatRows`), `last` the table's final row (`aria-rowcount`).
6594
6596
  */
6595
6597
  const edgeRowIndex = computed(() => {
6596
- if (!hasProvidedAccessibilityData.value || contextState.totalItems == null)
6598
+ if (lastBodyRowIndex.value === undefined)
6597
6599
  return { first: undefined, last: undefined };
6598
6600
  const offset = ((contextState.page ?? 1) - 1) * (contextState.perPage ?? 0);
6599
- return {
6600
- first: offset + 2,
6601
- last:
6602
- contextState.totalItems +
6603
- 1 +
6604
- Number(edgeRows.value.first) +
6605
- Number(edgeRows.value.last),
6606
- };
6601
+ return { first: offset + 2, last: lastBodyRowIndex.value };
6602
+ });
6603
+
6604
+ /**
6605
+ * Q61.10: the `aria-rowindex` of the body's final row, once the pager facts
6606
+ * are known — the header, every item (`totalItems`, not the page or the
6607
+ * virtual window), the edge rows and the open expand rows. Expand rows are
6608
+ * counted where the table knows them: the rows it holds (every row under
6609
+ * `virtual`, this page under pagination). The empty state and the default
6610
+ * skeleton are rows too, numbered from 2, so the count never ends above them.
6611
+ */
6612
+ const lastBodyRowIndex = computed(() => {
6613
+ if (!hasProvidedAccessibilityData.value || contextState.totalItems == null)
6614
+ return undefined;
6615
+ const items = contextState.totalItems + 1;
6616
+ if (hasTbodySlot.value) return items;
6617
+ if (!options.value.length) {
6618
+ if (!props.loading) return Math.max(items, 2);
6619
+ return slots.loading ? items : Math.max(items, skeletonLength.value + 1);
6620
+ }
6621
+ const expandRows = flatRows.value.length - baseOptions.value.length;
6622
+ return (
6623
+ items +
6624
+ Number(edgeRows.value.first) +
6625
+ Number(edgeRows.value.last) +
6626
+ expandRows
6627
+ );
6628
+ });
6629
+
6630
+ /**
6631
+ * Q61.10: the `#tfoot` rows. They are the consumer's markup, so the table
6632
+ * numbers them after render: each `role="row"` the foot rowgroup owns gets the
6633
+ * next `aria-rowindex` after the body, kept current as the footer's content or
6634
+ * the body's count changes, and counts in `aria-rowcount`. An `aria-rowindex`
6635
+ * the consumer wrote is left alone — a row is the table's to number only while
6636
+ * it carries no index or the one the table last wrote (`stampedFootIndex`).
6637
+ */
6638
+ const footRef = ref<HTMLElement | null>(null);
6639
+ const footRowCount = ref(0);
6640
+ const stampedFootIndex = new WeakMap<Element, string>();
6641
+ const footRows = (foot: HTMLElement) =>
6642
+ Array.from(foot.querySelectorAll('[role="row"]')).filter(
6643
+ (row) =>
6644
+ row.parentElement?.closest(
6645
+ '[role="rowgroup"], [role="table"], [role="grid"], [role="treegrid"]'
6646
+ ) === foot
6647
+ );
6648
+ const syncFootRows = () => {
6649
+ const foot = footRef.value;
6650
+ const rows = foot && slots.tfoot ? footRows(foot) : [];
6651
+ footRowCount.value = rows.length;
6652
+ const last = lastBodyRowIndex.value;
6653
+ rows.forEach((row, index) => {
6654
+ const current = row.getAttribute('aria-rowindex');
6655
+ const ours = current === null || stampedFootIndex.get(row) === current;
6656
+ if (!ours) {
6657
+ stampedFootIndex.delete(row);
6658
+ return;
6659
+ }
6660
+ if (last === undefined) {
6661
+ if (current !== null) row.removeAttribute('aria-rowindex');
6662
+ stampedFootIndex.delete(row);
6663
+ return;
6664
+ }
6665
+ const value = String(last + 1 + index);
6666
+ if (current !== value) row.setAttribute('aria-rowindex', value);
6667
+ stampedFootIndex.set(row, value);
6668
+ });
6669
+ };
6670
+ let footObserver: MutationObserver | undefined;
6671
+ onMounted(() => {
6672
+ syncFootRows();
6673
+ if (!footRef.value || typeof MutationObserver === 'undefined') return;
6674
+ footObserver = new MutationObserver(syncFootRows);
6675
+ // `aria-rowindex` is watched so a consumer re-binding it is seen; the
6676
+ // table's own writes settle on the next pass (the value is already there).
6677
+ footObserver.observe(footRef.value, {
6678
+ childList: true,
6679
+ subtree: true,
6680
+ attributes: true,
6681
+ attributeFilter: ['role', 'aria-rowindex'],
6682
+ });
6607
6683
  });
6684
+ watch(lastBodyRowIndex, syncFootRows, { flush: 'post' });
6685
+ onBeforeUnmount(() => footObserver?.disconnect());
6608
6686
 
6609
6687
  /**
6610
6688
  * The pins, resolved from keys to RENDERED positions for the sticky pass:
@@ -8082,12 +8160,14 @@ export type BbTableSlots<Item = any> = BbTableColumnSlots<Item> & {
8082
8160
 
8083
8161
  &--align {
8084
8162
  &-left {
8163
+ /* stylelint-disable-next-line declaration-property-value-disallowed-list -- geometry: the column `align` prop names a physical side */
8085
8164
  text-align: left;
8086
8165
  }
8087
8166
  &-center {
8088
8167
  text-align: center;
8089
8168
  }
8090
8169
  &-right {
8170
+ /* stylelint-disable-next-line declaration-property-value-disallowed-list -- geometry: the column `align` prop names a physical side */
8091
8171
  text-align: right;
8092
8172
  }
8093
8173
  }
@@ -8383,11 +8463,13 @@ export type BbTableSlots<Item = any> = BbTableColumnSlots<Item> & {
8383
8463
  }
8384
8464
  [data-pin-edge='left']::after {
8385
8465
  background: linear-gradient(to right, var(--cue), transparent);
8466
+ /* stylelint-disable-next-line property-disallowed-list -- geometry: a pinned column side is physical (`pin` names it) */
8386
8467
  left: 100%;
8387
8468
  width: var(--cue-l);
8388
8469
  }
8389
8470
  [data-pin-edge='right']::after {
8390
8471
  background: linear-gradient(to left, var(--cue), transparent);
8472
+ /* stylelint-disable-next-line property-disallowed-list -- geometry: a pinned column side is physical (`pin` names it) */
8391
8473
  right: 100%;
8392
8474
  width: var(--cue-r);
8393
8475
  }
@@ -8477,6 +8559,7 @@ export type BbTableSlots<Item = any> = BbTableColumnSlots<Item> & {
8477
8559
  }
8478
8560
 
8479
8561
  &--right {
8562
+ /* stylelint-disable-next-line declaration-property-value-disallowed-list -- geometry: the column `align` prop names a physical side */
8480
8563
  text-align: right;
8481
8564
  }
8482
8565
  }
@@ -8704,7 +8787,7 @@ export type BbTableSlots<Item = any> = BbTableColumnSlots<Item> & {
8704
8787
  font-size: var(--bb-fs);
8705
8788
  font-weight: 500;
8706
8789
  inset: auto;
8707
- left: 0;
8790
+ inset-inline-start: 0;
8708
8791
  margin: 0;
8709
8792
  overflow: visible;
8710
8793
  padding: 4px 10px;
@@ -9043,6 +9126,7 @@ export type BbTableSlots<Item = any> = BbTableColumnSlots<Item> & {
9043
9126
  }
9044
9127
 
9045
9128
  &--right {
9129
+ /* stylelint-disable-next-line declaration-property-value-disallowed-list -- geometry: the column `align` prop names a physical side */
9046
9130
  text-align: right;
9047
9131
  }
9048
9132
 
@@ -9057,7 +9141,7 @@ export type BbTableSlots<Item = any> = BbTableColumnSlots<Item> & {
9057
9141
  side rather than a wrapped stack. */
9058
9142
  white-space: nowrap;
9059
9143
  > *:not(:first-child) {
9060
- margin-left: var(--actions-spacing);
9144
+ margin-inline-start: var(--actions-spacing);
9061
9145
  }
9062
9146
  }
9063
9147
  }
@@ -92,13 +92,13 @@ defineSlots<BbTabsSlots<K>>();
92
92
 
93
93
  if (process.env.NODE_ENV !== 'production')
94
94
  warnRemovedAttrs('BbTabs', removedPropsFor('BbTabs'), {
95
- slotKeys: () => (props.items ?? []).map((item) => item.key),
95
+ slotKeys: () => (props.items ?? []).map((item) => item.value),
96
96
  family: 'BbTabs',
97
97
  });
98
98
 
99
99
  // Untyped view of the received slots: every slot (*:label, panels, wrapper:*)
100
100
  // is forwarded verbatim to both subcomponents; each renders only the names
101
- // it owns, so the fallback chain (`<key>:label` → `label` → text) is kept.
101
+ // it owns, so the fallback chain (`<value>:label` → `label` → text) is kept.
102
102
  const forwardedSlots = useSlots();
103
103
 
104
104
  const { id, direction, block, compact, disabled } = createTabsContext(
@@ -246,9 +246,13 @@ export type BbTabsItem<K extends string = string> = BbTabsInertiaOptions & {
246
246
  */
247
247
  href?: string;
248
248
  /**
249
- * String that identifies the tab.
249
+ * Identifies the tab: what `v-model` holds while it is the active one, the
250
+ * name of its slots (`#<value>` for its panel, `#<value>:label` for its
251
+ * trigger, through `slotKey`) and, with `navigation`, the URL slug.
250
252
  */
251
- key: K;
253
+ value: K;
254
+ /** Tabs have no `key` (that is `value`). Guards against the old shape. */
255
+ key?: never;
252
256
  /**
253
257
  * Label to use as the tab text.
254
258
  */
@@ -265,7 +269,7 @@ export type BbTabsItem<K extends string = string> = BbTabsInertiaOptions & {
265
269
  * Passthrough parts of `BbTabs` (plans/passthrough/BbTabs.md). Tabs do not
266
270
  * "open", so there is no `open` state.
267
271
  *
268
- * 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_.
272
+ * 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_.
269
273
  *
270
274
  * @part root - The tabs' outer element, around the strip and the panels.
271
275
  * @part wrapper - The strip's outer element: the `wrapper:prepend` slot, the
@@ -466,9 +470,9 @@ export type BbTabsRootProps<K extends string = string> =
466
470
  */
467
471
  manualActivation?: boolean;
468
472
  /**
469
- * The current tab key. Used by v-model.
473
+ * The active tab's `value`. Used by v-model.
470
474
  */
471
- modelValue?: null | BbTabsItem<K>['key'];
475
+ modelValue?: null | BbTabsItem<K>['value'];
472
476
  /**
473
477
  * Synchronizes the current tab with the URL query parameter.
474
478
  *
@@ -569,8 +573,8 @@ export type BbTabsRootEvents<K extends string = string> = BbTabsEvents<K>;
569
573
 
570
574
  /** Props exposed by the per-tab label slots and the generic `label` fallback slot. */
571
575
  export type BbTabsSlotProps<K extends string = string> = {
572
- /** The key of the currently active tab. */
573
- current: BbTabsItem<K>['key'] | null;
576
+ /** The `value` of the currently active tab. */
577
+ current: BbTabsItem<K>['value'] | null;
574
578
  /** Zero-based index of the currently active tab. */
575
579
  currentIndex: number;
576
580
  /** Whether this tab is disabled. */
@@ -581,10 +585,10 @@ export type BbTabsSlotProps<K extends string = string> = {
581
585
  isLast: boolean;
582
586
  /** Whether this specific tab is currently active. */
583
587
  selected: boolean;
584
- /** The `label` value of this tab item. */
585
- text: BbTabsItem<K>['label'];
586
- /** The `key` value of this tab item. */
587
- value: BbTabsItem<K>['key'];
588
+ /** This tab's `label`. */
589
+ label: BbTabsItem<K>['label'];
590
+ /** This tab's `value`. */
591
+ value: BbTabsItem<K>['value'];
588
592
  /** Navigate to `'first'`, `'previous'`, `'next'`, or `'last'` tab. */
589
593
  goTo: (target: 'first' | 'previous' | 'next' | 'last') => void;
590
594
  };
@@ -607,7 +611,7 @@ export type BbTabsScrollSlotProps = {
607
611
  /**
608
612
  * Slots rendered by the tab list (the strip of triggers).
609
613
  *
610
- * @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.
614
+ * @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.
611
615
  */
612
616
  export type BbTabsListSlots<K extends string = string> = {
613
617
  /**
@@ -619,16 +623,16 @@ export type BbTabsListSlots<K extends string = string> = {
619
623
  */
620
624
  'wrapper:append'?: (props: BbTabsScrollSlotProps) => any;
621
625
  /**
622
- * Fallback slot used for all tab labels when no per-tab `<key>:label` slot is provided.
626
+ * Fallback slot used for all tab labels when no per-tab `<value>:label` slot is provided.
623
627
  */
624
628
  label?: (props: BbTabsSlotProps<K>) => any;
625
629
  } & Record<string, ((props: BbTabsSlotProps<K>) => any) | undefined>;
626
630
 
627
631
  /**
628
632
  * Slots rendered by the tab panels — one per tab, keyed by the normalized
629
- * `slotKey(key)`.
633
+ * `slotKey(value)`.
630
634
  *
631
- * @dynamicSlot `<key>` {BbTabsSlotProps<K>} - One tab's content panel, by the tab `key` through `slotKey`; no fallback (an empty panel).
635
+ * @dynamicSlot `<value>` {BbTabsSlotProps<K>} - One tab's content panel, by the tab's `value` through `slotKey`; no fallback (an empty panel).
632
636
  */
633
637
  export type BbTabsPanelsSlots<K extends string = string> = Record<
634
638
  string,
@@ -636,16 +640,16 @@ export type BbTabsPanelsSlots<K extends string = string> = Record<
636
640
  >;
637
641
 
638
642
  /**
639
- * @dynamicSlot `<key>` {BbTabsSlotProps<K>} - One tab's content panel, by the tab `key` through `slotKey`; no fallback (an empty panel).
640
- * @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.
643
+ * @dynamicSlot `<value>` {BbTabsSlotProps<K>} - One tab's content panel, by the tab's `value` through `slotKey`; no fallback (an empty panel).
644
+ * @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.
641
645
  */
642
646
  export type BbTabsSlots<K extends string = string> = BbTabsListSlots<K> &
643
647
  BbTabsPanelsSlots<K>;
644
648
 
645
649
  /** Props exposed by the `BbTabsRoot` default slot. */
646
650
  export type BbTabsRootSlotProps<K extends string = string> = {
647
- /** The key of the currently active tab. */
648
- current: BbTabsItem<K>['key'] | null;
651
+ /** The `value` of the currently active tab. */
652
+ current: BbTabsItem<K>['value'] | null;
649
653
  /** Zero-based index of the currently active tab. */
650
654
  currentIndex: number;
651
655
  /** Whether the active tab is the first tab. */
@@ -654,8 +658,8 @@ export type BbTabsRootSlotProps<K extends string = string> = {
654
658
  isLast: boolean;
655
659
  /** Navigate to `'first'`, `'previous'`, `'next'`, or `'last'` tab. */
656
660
  goTo: (target: 'first' | 'previous' | 'next' | 'last') => void;
657
- /** Select a tab by key. */
658
- select: (key: BbTabsItem<K>['key']) => void;
661
+ /** Select a tab by its `value`. */
662
+ select: (value: BbTabsItem<K>['value']) => void;
659
663
  };
660
664
 
661
665
  export type BbTabsRootSlots<K extends string = string> = {
@@ -154,7 +154,7 @@ const context =
154
154
 
155
155
  if (process.env.NODE_ENV !== 'production')
156
156
  warnRemovedAttrs('BbTabsList', removedPropsFor('BbTabsList'), {
157
- slotKeys: () => context.items.value.map((item) => item.key),
157
+ slotKeys: () => context.items.value.map((item) => item.value),
158
158
  family: 'BbTabs',
159
159
  });
160
160
 
@@ -515,9 +515,13 @@ export type BbTabsItem<K extends string = string> = BbTabsInertiaOptions & {
515
515
  */
516
516
  href?: string;
517
517
  /**
518
- * String that identifies the tab.
518
+ * Identifies the tab: what `v-model` holds while it is the active one, the
519
+ * name of its slots (`#<value>` for its panel, `#<value>:label` for its
520
+ * trigger, through `slotKey`) and, with `navigation`, the URL slug.
519
521
  */
520
- key: K;
522
+ value: K;
523
+ /** Tabs have no `key` (that is `value`). Guards against the old shape. */
524
+ key?: never;
521
525
  /**
522
526
  * Label to use as the tab text.
523
527
  */
@@ -534,7 +538,7 @@ export type BbTabsItem<K extends string = string> = BbTabsInertiaOptions & {
534
538
  * Passthrough parts of `BbTabs` (plans/passthrough/BbTabs.md). Tabs do not
535
539
  * "open", so there is no `open` state.
536
540
  *
537
- * 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_.
541
+ * 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_.
538
542
  *
539
543
  * @part root - The tabs' outer element, around the strip and the panels.
540
544
  * @part wrapper - The strip's outer element: the `wrapper:prepend` slot, the
@@ -735,9 +739,9 @@ export type BbTabsRootProps<K extends string = string> =
735
739
  */
736
740
  manualActivation?: boolean;
737
741
  /**
738
- * The current tab key. Used by v-model.
742
+ * The active tab's `value`. Used by v-model.
739
743
  */
740
- modelValue?: null | BbTabsItem<K>['key'];
744
+ modelValue?: null | BbTabsItem<K>['value'];
741
745
  /**
742
746
  * Synchronizes the current tab with the URL query parameter.
743
747
  *
@@ -838,8 +842,8 @@ export type BbTabsRootEvents<K extends string = string> = BbTabsEvents<K>;
838
842
 
839
843
  /** Props exposed by the per-tab label slots and the generic `label` fallback slot. */
840
844
  export type BbTabsSlotProps<K extends string = string> = {
841
- /** The key of the currently active tab. */
842
- current: BbTabsItem<K>['key'] | null;
845
+ /** The `value` of the currently active tab. */
846
+ current: BbTabsItem<K>['value'] | null;
843
847
  /** Zero-based index of the currently active tab. */
844
848
  currentIndex: number;
845
849
  /** Whether this tab is disabled. */
@@ -850,10 +854,10 @@ export type BbTabsSlotProps<K extends string = string> = {
850
854
  isLast: boolean;
851
855
  /** Whether this specific tab is currently active. */
852
856
  selected: boolean;
853
- /** The `label` value of this tab item. */
854
- text: BbTabsItem<K>['label'];
855
- /** The `key` value of this tab item. */
856
- value: BbTabsItem<K>['key'];
857
+ /** This tab's `label`. */
858
+ label: BbTabsItem<K>['label'];
859
+ /** This tab's `value`. */
860
+ value: BbTabsItem<K>['value'];
857
861
  /** Navigate to `'first'`, `'previous'`, `'next'`, or `'last'` tab. */
858
862
  goTo: (target: 'first' | 'previous' | 'next' | 'last') => void;
859
863
  };
@@ -876,7 +880,7 @@ export type BbTabsScrollSlotProps = {
876
880
  /**
877
881
  * Slots rendered by the tab list (the strip of triggers).
878
882
  *
879
- * @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.
883
+ * @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.
880
884
  */
881
885
  export type BbTabsListSlots<K extends string = string> = {
882
886
  /**
@@ -888,16 +892,16 @@ export type BbTabsListSlots<K extends string = string> = {
888
892
  */
889
893
  'wrapper:append'?: (props: BbTabsScrollSlotProps) => any;
890
894
  /**
891
- * Fallback slot used for all tab labels when no per-tab `<key>:label` slot is provided.
895
+ * Fallback slot used for all tab labels when no per-tab `<value>:label` slot is provided.
892
896
  */
893
897
  label?: (props: BbTabsSlotProps<K>) => any;
894
898
  } & Record<string, ((props: BbTabsSlotProps<K>) => any) | undefined>;
895
899
 
896
900
  /**
897
901
  * Slots rendered by the tab panels — one per tab, keyed by the normalized
898
- * `slotKey(key)`.
902
+ * `slotKey(value)`.
899
903
  *
900
- * @dynamicSlot `<key>` {BbTabsSlotProps<K>} - One tab's content panel, by the tab `key` through `slotKey`; no fallback (an empty panel).
904
+ * @dynamicSlot `<value>` {BbTabsSlotProps<K>} - One tab's content panel, by the tab's `value` through `slotKey`; no fallback (an empty panel).
901
905
  */
902
906
  export type BbTabsPanelsSlots<K extends string = string> = Record<
903
907
  string,
@@ -905,16 +909,16 @@ export type BbTabsPanelsSlots<K extends string = string> = Record<
905
909
  >;
906
910
 
907
911
  /**
908
- * @dynamicSlot `<key>` {BbTabsSlotProps<K>} - One tab's content panel, by the tab `key` through `slotKey`; no fallback (an empty panel).
909
- * @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.
912
+ * @dynamicSlot `<value>` {BbTabsSlotProps<K>} - One tab's content panel, by the tab's `value` through `slotKey`; no fallback (an empty panel).
913
+ * @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.
910
914
  */
911
915
  export type BbTabsSlots<K extends string = string> = BbTabsListSlots<K> &
912
916
  BbTabsPanelsSlots<K>;
913
917
 
914
918
  /** Props exposed by the `BbTabsRoot` default slot. */
915
919
  export type BbTabsRootSlotProps<K extends string = string> = {
916
- /** The key of the currently active tab. */
917
- current: BbTabsItem<K>['key'] | null;
920
+ /** The `value` of the currently active tab. */
921
+ current: BbTabsItem<K>['value'] | null;
918
922
  /** Zero-based index of the currently active tab. */
919
923
  currentIndex: number;
920
924
  /** Whether the active tab is the first tab. */
@@ -923,8 +927,8 @@ export type BbTabsRootSlotProps<K extends string = string> = {
923
927
  isLast: boolean;
924
928
  /** Navigate to `'first'`, `'previous'`, `'next'`, or `'last'` tab. */
925
929
  goTo: (target: 'first' | 'previous' | 'next' | 'last') => void;
926
- /** Select a tab by key. */
927
- select: (key: BbTabsItem<K>['key']) => void;
930
+ /** Select a tab by its `value`. */
931
+ select: (value: BbTabsItem<K>['value']) => void;
928
932
  };
929
933
 
930
934
  export type BbTabsRootSlots<K extends string = string> = {
@@ -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
@@ -416,9 +420,9 @@ export type BbTabsRootProps<K extends string = string> =
416
420
  */
417
421
  manualActivation?: boolean;
418
422
  /**
419
- * The current tab key. Used by v-model.
423
+ * The active tab's `value`. Used by v-model.
420
424
  */
421
- modelValue?: null | BbTabsItem<K>['key'];
425
+ modelValue?: null | BbTabsItem<K>['value'];
422
426
  /**
423
427
  * Synchronizes the current tab with the URL query parameter.
424
428
  *
@@ -519,8 +523,8 @@ export type BbTabsRootEvents<K extends string = string> = BbTabsEvents<K>;
519
523
 
520
524
  /** Props exposed by the per-tab label slots and the generic `label` fallback slot. */
521
525
  export type BbTabsSlotProps<K extends string = string> = {
522
- /** The key of the currently active tab. */
523
- current: BbTabsItem<K>['key'] | null;
526
+ /** The `value` of the currently active tab. */
527
+ current: BbTabsItem<K>['value'] | null;
524
528
  /** Zero-based index of the currently active tab. */
525
529
  currentIndex: number;
526
530
  /** Whether this tab is disabled. */
@@ -531,10 +535,10 @@ export type BbTabsSlotProps<K extends string = string> = {
531
535
  isLast: boolean;
532
536
  /** Whether this specific tab is currently active. */
533
537
  selected: boolean;
534
- /** The `label` value of this tab item. */
535
- text: BbTabsItem<K>['label'];
536
- /** The `key` value of this tab item. */
537
- value: BbTabsItem<K>['key'];
538
+ /** This tab's `label`. */
539
+ label: BbTabsItem<K>['label'];
540
+ /** This tab's `value`. */
541
+ value: BbTabsItem<K>['value'];
538
542
  /** Navigate to `'first'`, `'previous'`, `'next'`, or `'last'` tab. */
539
543
  goTo: (target: 'first' | 'previous' | 'next' | 'last') => void;
540
544
  };
@@ -557,7 +561,7 @@ export type BbTabsScrollSlotProps = {
557
561
  /**
558
562
  * Slots rendered by the tab list (the strip of triggers).
559
563
  *
560
- * @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.
561
565
  */
562
566
  export type BbTabsListSlots<K extends string = string> = {
563
567
  /**
@@ -569,16 +573,16 @@ export type BbTabsListSlots<K extends string = string> = {
569
573
  */
570
574
  'wrapper:append'?: (props: BbTabsScrollSlotProps) => any;
571
575
  /**
572
- * 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.
573
577
  */
574
578
  label?: (props: BbTabsSlotProps<K>) => any;
575
579
  } & Record<string, ((props: BbTabsSlotProps<K>) => any) | undefined>;
576
580
 
577
581
  /**
578
582
  * Slots rendered by the tab panels — one per tab, keyed by the normalized
579
- * `slotKey(key)`.
583
+ * `slotKey(value)`.
580
584
  *
581
- * @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).
582
586
  */
583
587
  export type BbTabsPanelsSlots<K extends string = string> = Record<
584
588
  string,
@@ -586,16 +590,16 @@ export type BbTabsPanelsSlots<K extends string = string> = Record<
586
590
  >;
587
591
 
588
592
  /**
589
- * @dynamicSlot `<key>` {BbTabsSlotProps<K>} - One tab's content panel, by the tab `key` through `slotKey`; no fallback (an empty panel).
590
- * @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.
591
595
  */
592
596
  export type BbTabsSlots<K extends string = string> = BbTabsListSlots<K> &
593
597
  BbTabsPanelsSlots<K>;
594
598
 
595
599
  /** Props exposed by the `BbTabsRoot` default slot. */
596
600
  export type BbTabsRootSlotProps<K extends string = string> = {
597
- /** The key of the currently active tab. */
598
- current: BbTabsItem<K>['key'] | null;
601
+ /** The `value` of the currently active tab. */
602
+ current: BbTabsItem<K>['value'] | null;
599
603
  /** Zero-based index of the currently active tab. */
600
604
  currentIndex: number;
601
605
  /** Whether the active tab is the first tab. */
@@ -604,8 +608,8 @@ export type BbTabsRootSlotProps<K extends string = string> = {
604
608
  isLast: boolean;
605
609
  /** Navigate to `'first'`, `'previous'`, `'next'`, or `'last'` tab. */
606
610
  goTo: (target: 'first' | 'previous' | 'next' | 'last') => void;
607
- /** Select a tab by key. */
608
- select: (key: BbTabsItem<K>['key']) => void;
611
+ /** Select a tab by its `value`. */
612
+ select: (value: BbTabsItem<K>['value']) => void;
609
613
  };
610
614
 
611
615
  export type BbTabsRootSlots<K extends string = string> = {