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
@@ -21,6 +21,8 @@ import {
21
21
  } from './items-provider-context.mjs';
22
22
  import { reactiveVModelFindings } from './reactive-v-model.mjs';
23
23
  import { textNullValueFindings } from './text-null-value.mjs';
24
+ import { redundantItemAccessorFindings } from './redundant-item-accessor.mjs';
25
+ import { renamedItemFieldFindings } from './renamed-item-field.mjs';
24
26
  import { unimportedFindings } from './unimported-components.mjs';
25
27
  import {
26
28
  classRenamesFrom,
@@ -472,7 +474,7 @@ const INTENT_ALIASES = {
472
474
  * may well be doing something today — a native listener reaching the root
473
475
  * element — but is outside the component's contract. It is the flag a caller
474
476
  * uses to report at a lower severity; see `checkEvent`.
475
- * @typedef {{ component: string, attr: string, line?: number, kind: 'unknown-prop' | 'unknown-component' | 'unknown-model' | 'removed-prop' | 'unknown-slot' | 'unknown-event' | 'object-items-without-text' | string, message: string, hint?: string, fallthrough?: boolean }} Finding
477
+ * @typedef {{ component: string, attr: string, line?: number, kind: 'unknown-prop' | 'unknown-component' | 'unknown-model' | 'removed-prop' | 'unknown-slot' | 'unknown-event' | 'object-items-without-text' | 'redundant-item-accessor' | string, message: string, hint?: string, fallthrough?: boolean }} Finding
476
478
  */
477
479
 
478
480
  /**
@@ -872,6 +874,15 @@ export function validateVueSnippet(code, manifest, options = {}) {
872
874
  findings.splice(i, 1);
873
875
  }
874
876
  findings.push(...formModel);
877
+ // Q60.24: an accessor that names the default field (`item-text="label"`).
878
+ findings.push(
879
+ ...redundantItemAccessorFindings(code, { templateAst: ast, arrays })
880
+ );
881
+ // Q64.2–Q64.5: an item field spelled the old way (`{ key, text }` rows,
882
+ // a group's `key`, a tab's or crumb's `key`).
883
+ findings.push(
884
+ ...renamedItemFieldFindings(code, { templateAst: ast, arrays })
885
+ );
875
886
  // Q43.9: positional `items` providers and single-cause `reason` checks.
876
887
  findings.push(...itemsProviderFindings(code, options.providerBindings));
877
888
  findings.push(...wrapperDropsPropFindings(code, manifest, aliases));
@@ -1498,7 +1509,9 @@ export function createComponentChecker(surface, options = {}) {
1498
1509
  r.surface !== 'slot' &&
1499
1510
  r.surface !== 'event' &&
1500
1511
  r.surface !== 'method' &&
1501
- r.surface !== 'option';
1512
+ r.surface !== 'option' &&
1513
+ // An item field (Q64.2) is `renamed-item-field`'s, never an attribute.
1514
+ r.surface !== 'item';
1502
1515
  // A removed or renamed EVENT (Q56.28): `checkEvent` reads these.
1503
1516
  const removedEvents = new Map(
1504
1517
  (surface.removed ?? [])
@@ -2379,25 +2392,37 @@ const resolveArray = (node, arrays) => {
2379
2392
  return null;
2380
2393
  };
2381
2394
 
2382
- const hasObjectElement = (array) =>
2383
- array.elements.some(
2384
- (el) => unwrapTsExpression(el)?.type === 'ObjectExpression'
2385
- );
2395
+ /**
2396
+ * Q60.24: an object item the option default chain cannot label — no `label`
2397
+ * and no `text` key. A spread may bring either, so it is never judged.
2398
+ */
2399
+ const hasUnlabelledObjectElement = (array) =>
2400
+ array.elements.some((el) => {
2401
+ const item = unwrapTsExpression(el);
2402
+ return (
2403
+ item?.type === 'ObjectExpression' &&
2404
+ !item.properties.some((p) => p.type === 'SpreadElement') &&
2405
+ !objectKeyNode(item, 'label') &&
2406
+ !objectKeyNode(item, 'text')
2407
+ );
2408
+ });
2386
2409
 
2387
2410
  const GROUP_ITEMS_HINT =
2388
- "add `itemText` to the group (e.g. `itemText: 'label'`), and `itemValue` (e.g. `itemValue: 'value'`) — without `itemValue` the whole object is the value";
2411
+ 'hand-written rows are labelled by `label`: give each row one, or make it a mapped group (an `items` getter, or `itemText` / `itemValue` naming the fields your data holds), which reads `label` / `text` and `value` by default';
2389
2412
 
2390
2413
  const OBJECT_ITEMS_HINT =
2391
- 'set `item-text` to the field holding the label (e.g. `item-text="label"`), and `item-value` to the field holding the value (e.g. `item-value="value"`) — without `item-value` the whole object is the value';
2414
+ '`{ label, value }` and `{ text, value }` items work as they are (text: `label`, else `text`; value: `value`, else the whole object). Any other shape needs `item-text` (the field holding the label) and `item-value` (the field holding the value)';
2392
2415
 
2393
2416
  /**
2394
- * Q53.3 (owner ruling 2026-09-24): OBJECT items with no `item-text` render
2395
- * `JSON.stringify(item)` as each label, and with no `item-value` the whole
2396
- * object is the value — so `{ label, value }` items read as blank or JSON.
2397
- * Flags every item-driven control (any component whose API has `itemText`),
2417
+ * Q53.3 (owner ruling 2026-09-24), narrowed by Q60.24 (2026-10-07): with no
2418
+ * `item-text` an option reads its own `label`, else its own `text`, else
2419
+ * `JSON.stringify(item)`; with no `item-value`, its own `value`, else the
2420
+ * whole object. So only OBJECT items with neither `label` nor `text` render as
2421
+ * JSON. Flags every item-driven control (any component whose API has `itemText`),
2398
2422
  * and each BbDropdown group (`group: true`) with no `itemText` whose object
2399
- * rows have no `text` (hand-written rows are labelled by `text`, so those
2400
- * render blank). `item-text` set without `item-value` is a
2423
+ * rows have neither `label` nor `text` (hand-written rows are labelled by
2424
+ * `label`, so those render blank; a `text` row is `renamed-item-field`'s).
2425
+ * `item-text` set without `item-value` is a
2401
2426
  * deliberate whole-object value and is not flagged; string items are fine.
2402
2427
  *
2403
2428
  * Reach: only arrays visible in the same file — an inline `:items="[…]"`, or
@@ -2436,12 +2461,14 @@ export function checkObjectItemsWithoutText(name, surface, node, arrays) {
2436
2461
  : null;
2437
2462
  if (!childArray) continue;
2438
2463
  // A literal group with no mapper renders hand-written rows by their
2439
- // `text`; a `{ label, value }` row there has no label at all.
2464
+ // `label`; a row with neither `label` nor `text` (the old spelling,
2465
+ // reported as `renamed-item-field`) has no label at all.
2440
2466
  const unlabelledRow = childArray.elements.some((raw) => {
2441
2467
  const row = unwrapTsExpression(raw);
2442
2468
  return (
2443
2469
  row?.type === 'ObjectExpression' &&
2444
2470
  !row.properties.some((p) => p.type === 'SpreadElement') &&
2471
+ !objectKeyNode(row, 'label') &&
2445
2472
  !objectKeyNode(row, 'text')
2446
2473
  );
2447
2474
  });
@@ -2450,15 +2477,13 @@ export function checkObjectItemsWithoutText(name, surface, node, arrays) {
2450
2477
  !objectKeyNode(entry, 'itemText') &&
2451
2478
  unlabelledRow
2452
2479
  ) {
2453
- const key = objectKeyNode(entry, 'key')?.value;
2480
+ const id = objectKeyNode(entry, 'id')?.value;
2454
2481
  const label =
2455
- key?.type === 'StringLiteral'
2456
- ? `group \`${key.value}\``
2457
- : 'a group';
2482
+ id?.type === 'StringLiteral' ? `group \`${id.value}\`` : 'a group';
2458
2483
  findings.push({
2459
2484
  kind: 'object-items-without-text',
2460
2485
  attr: 'items',
2461
- message: `${label} on BbDropdown has object \`items\` with no \`text\` and the group has no \`itemText\` — those rows render without a label.`,
2486
+ message: `${label} on BbDropdown has object \`items\` with no \`label\` and the group has no \`itemText\` — those rows render without a label.`,
2462
2487
  hint: GROUP_ITEMS_HINT,
2463
2488
  });
2464
2489
  }
@@ -2472,12 +2497,12 @@ export function checkObjectItemsWithoutText(name, surface, node, arrays) {
2472
2497
  if (!(surface.props ?? []).some((p) => toCamel(p.name) === 'itemText'))
2473
2498
  return [];
2474
2499
  if (compilerHasProp(node, 'itemText')) return [];
2475
- if (!hasObjectElement(items)) return [];
2500
+ if (!hasUnlabelledObjectElement(items)) return [];
2476
2501
  return [
2477
2502
  {
2478
2503
  kind: 'object-items-without-text',
2479
2504
  attr: 'items',
2480
- message: `${name}'s \`items\` are objects but \`item-text\` is not set — each option's label is \`JSON.stringify(item)\`.`,
2505
+ message: `${name}'s \`items\` include objects with neither \`label\` nor \`text\` and \`item-text\` is not set — those options' label is \`JSON.stringify(item)\`.`,
2481
2506
  hint: OBJECT_ITEMS_HINT,
2482
2507
  },
2483
2508
  ];
@@ -2787,12 +2812,45 @@ export function checkComputedSlotRenames(name, surface, node) {
2787
2812
  * same-file literal (`scriptSetupArrayConsts`, Q53.14).
2788
2813
  */
2789
2814
  export const RESERVED_KEY_SOURCES = {
2790
- BbTable: { prop: 'columns', noun: 'column key' },
2791
- BbTabs: { prop: 'items', noun: 'tab key' },
2792
- BbTabsList: { prop: 'items', noun: 'tab key' },
2793
- BbBreadcrumbs: { prop: 'items', noun: 'item key' },
2794
- BbDropdown: { prop: 'items', noun: 'item key', nested: true },
2795
- BbDropdownButton: { prop: 'items', noun: 'item key', nested: true },
2815
+ BbTable: { prop: 'columns', field: 'key', noun: 'column key' },
2816
+ BbTabs: { prop: 'items', field: 'value', noun: 'tab value' },
2817
+ BbTabsList: { prop: 'items', field: 'value', noun: 'tab value' },
2818
+ BbBreadcrumbs: { prop: 'items', field: 'value', noun: 'crumb value' },
2819
+ // Rows are named by `value`, groups by `id` (`#<groupId>:item`).
2820
+ BbDropdown: {
2821
+ prop: 'items',
2822
+ field: 'value',
2823
+ noun: 'row value',
2824
+ nested: true,
2825
+ },
2826
+ BbDropdownButton: {
2827
+ prop: 'items',
2828
+ field: 'value',
2829
+ noun: 'row value',
2830
+ nested: true,
2831
+ },
2832
+ };
2833
+
2834
+ /** The field the identity was spelled in before 3.0.0-beta.49 (Q64.2–Q64.5). */
2835
+ const OLD_IDENTITY_FIELD = 'key';
2836
+
2837
+ /**
2838
+ * The identity a slot is named after, as written: a dropdown group's `id`,
2839
+ * any other entry's `field` (a stale `key` still counts, so a slot check
2840
+ * agrees with the rename `renamed-item-field` asks for).
2841
+ */
2842
+ const identityOf = (source, element) => {
2843
+ const entry = unwrapTsExpression(element);
2844
+ const isGroup =
2845
+ source.nested &&
2846
+ entry?.type === 'ObjectExpression' &&
2847
+ (objectKeyNode(entry, 'group') ||
2848
+ objectKeyNode(entry, 'selectable') ||
2849
+ objectKeyNode(entry, 'multiple'));
2850
+ const field = isGroup ? 'id' : source.field;
2851
+ const now = literalKeyOf(element, field);
2852
+ if (now !== null || field === OLD_IDENTITY_FIELD) return now;
2853
+ return literalKeyOf(element, OLD_IDENTITY_FIELD);
2796
2854
  };
2797
2855
 
2798
2856
  /**
@@ -2861,18 +2919,19 @@ export function checkReservedKeys(name, surface, node, arrays) {
2861
2919
  const findings = [];
2862
2920
  const walk = (array) => {
2863
2921
  for (const element of array.elements) {
2864
- const key = literalKeyOf(element, 'key');
2922
+ const key = identityOf(source, element);
2865
2923
  if (key !== null) {
2866
2924
  const slot = reserved.get(runtimeSlotKey(key));
2925
+ const word = source.field;
2867
2926
  if (slot)
2868
2927
  findings.push({
2869
2928
  kind: 'reserved-key',
2870
2929
  attr: source.prop,
2871
- message: `${source.noun} \`${key}\` collides with ${name}'s \`#${slot}\` slot; rename the key`,
2930
+ message: `${source.noun} \`${key}\` collides with ${name}'s \`#${slot}\` slot; rename the ${word}`,
2872
2931
  hint:
2873
2932
  slot === 'actions' && name === 'BbTable'
2874
2933
  ? 'the #actions slot already creates the actions column — drop this column, or rename its key (e.g. `rowActions`)'
2875
- : `a key whose slot name is \`${runtimeSlotKey(key)}\` can never have its own slot: pick another key`,
2934
+ : `a ${word} whose slot name is \`${runtimeSlotKey(key)}\` can never have its own slot: pick another ${word}`,
2876
2935
  });
2877
2936
  }
2878
2937
  const entry = unwrapTsExpression(element);
@@ -2937,7 +2996,7 @@ export function keyedSlotLookup(name, surface, propSource, arrays) {
2937
2996
  );
2938
2997
  const walk = (array) => {
2939
2998
  for (const element of array.elements) {
2940
- const key = literalKeyOf(element, 'key');
2999
+ const key = identityOf(source, element);
2941
3000
  if (key === null) complete = false;
2942
3001
  else keys.push(key);
2943
3002
  const entry = unwrapTsExpression(element);
@@ -2964,7 +3023,7 @@ export function keyedSlotLookup(name, surface, propSource, arrays) {
2964
3023
  );
2965
3024
  const expected = new Map();
2966
3025
  const legacy = new Map();
2967
- const noun = source.noun.replace(/ key$/, '');
3026
+ const noun = source.noun.replace(/ (key|value)$/, '');
2968
3027
  for (const key of keys)
2969
3028
  for (const { head, tail } of patterns) {
2970
3029
  const now = `${head}${slotKey(key)}${tail}`;
@@ -3049,7 +3108,7 @@ export function keyedSlotLookup(name, surface, propSource, arrays) {
3049
3108
  return {
3050
3109
  attr: `#${slot}`,
3051
3110
  kind: 'unknown-slot',
3052
- message: `slot \`#${slot}\` matches no ${noun} key and no slot of this ${name}, so it renders nothing${nearest ? ` — the nearest is \`#${nearest.candidate}\`${expected.has(nearest.candidate) ? ` (${noun} \`${expected.get(nearest.candidate)}\`)` : ''}` : ''}.`,
3111
+ message: `slot \`#${slot}\` matches no ${source.noun} and no slot of this ${name}, so it renders nothing${nearest ? ` — the nearest is \`#${nearest.candidate}\`${expected.has(nearest.candidate) ? ` (${noun} \`${expected.get(nearest.candidate)}\`)` : ''}` : ''}.`,
3053
3112
  };
3054
3113
  }
3055
3114
  }
@@ -3105,11 +3164,13 @@ export function squashedSlotWarning(name, surface, slot) {
3105
3164
  * Q53.17 (owner ruling 2026-09-24; doctrine: identifiers something outside the
3106
3165
  * component reads are written, never derived). On BbDropdown items `check` can
3107
3166
  * see (an inline array or a same-file literal, Q53.14):
3108
- * - a row in a `selectable` group needs a `key` (the v-model holds it);
3109
- * - a `selectable` group needs a `key` (its picks are stored under it);
3110
- * - two keyless rows with the same text in ONE group are an error (their
3111
- * derived identity would collide; across groups it is legal).
3112
- * A keyless action row, a layout-only group and a keyless crumb are fine.
3167
+ * - a row in a `selectable` group needs a `value` (the v-model holds it);
3168
+ * - a `selectable` group needs an `id` (its picks are stored under it);
3169
+ * - two rows with no `value` and the same `label` in ONE group are an error
3170
+ * (their derived identity would collide; across groups it is legal).
3171
+ * An action row without a `value`, a layout-only group and a crumb without a
3172
+ * `value` are fine. (Before 3.0.0-beta.49 the kinds were `missing-key` and
3173
+ * `duplicate-row-text`; the old fields themselves are `renamed-item-field`.)
3113
3174
  * @param {string} name
3114
3175
  * @param {{ props?: Array<Record<string, any>> }} node compiler-sfc element
3115
3176
  * @param {Map<string, any>} arrays
@@ -3171,7 +3232,8 @@ export function checkDropdownKeys(name, node, arrays) {
3171
3232
  if (value.type === 'BooleanLiteral') return value.value;
3172
3233
  return null; // bound to something `check` can't read
3173
3234
  };
3174
- const hasKey = (object) => objectKeyNode(object, 'key') != null;
3235
+ const hasValue = (object) => objectKeyNode(object, 'value') != null;
3236
+ const hasId = (object) => objectKeyNode(object, 'id') != null;
3175
3237
  const isSelectable = (object) => {
3176
3238
  const node = objectKeyNode(object, 'selectable');
3177
3239
  return (
@@ -3194,37 +3256,42 @@ export function checkDropdownKeys(name, node, arrays) {
3194
3256
  const children = objectKeyNode(entry, 'items');
3195
3257
  const childArray = children ? resolveArray(children.value, arrays) : null;
3196
3258
  if (isGroup) {
3197
- const groupKey = literal(entry, 'key');
3198
- if (isSelectable(entry) && !hasKey(entry))
3259
+ const groupId = literal(entry, 'id');
3260
+ // A group still spelling `key` is `renamed-item-field`'s.
3261
+ if (
3262
+ isSelectable(entry) &&
3263
+ !hasId(entry) &&
3264
+ !objectKeyNode(entry, 'key')
3265
+ )
3199
3266
  findings.push({
3200
- kind: 'missing-key',
3267
+ kind: 'missing-id',
3201
3268
  attr: 'items',
3202
- message: `a selectable group on ${name} has no \`key\` — its picks are stored under it, so it is required (a keyless group renders as a plain group)`,
3269
+ message: `a selectable group on ${name} has no \`id\` — its picks are stored under it, so it is required (a group without an \`id\` renders as a plain group)`,
3203
3270
  });
3204
3271
  if (childArray)
3205
3272
  scope(
3206
3273
  childArray,
3207
- isSelectable(entry) && hasKey(entry),
3208
- groupKey ? `group \`${groupKey}\`` : 'a group'
3274
+ isSelectable(entry) && hasId(entry),
3275
+ groupId ? `group \`${groupId}\`` : 'a group'
3209
3276
  );
3210
3277
  continue;
3211
3278
  }
3212
- if (!hasKey(entry)) {
3279
+ if (!hasValue(entry) && !objectKeyNode(entry, 'key')) {
3213
3280
  if (selectable)
3214
3281
  findings.push({
3215
- kind: 'missing-key',
3282
+ kind: 'missing-value',
3216
3283
  attr: 'items',
3217
- message: `a row in ${groupName} (selectable) on ${name} has no \`key\` — the v-model holds it, so it is required (a keyless row renders but can't be selected)`,
3284
+ message: `a row in ${groupName} (selectable) on ${name} has no \`value\` — the v-model holds it, so it is required (a row without a \`value\` renders disabled)`,
3218
3285
  });
3219
- const text = literal(entry, 'text');
3220
- if (typeof text === 'string') {
3221
- if (seen.has(text))
3286
+ const label = literal(entry, 'label');
3287
+ if (typeof label === 'string') {
3288
+ if (seen.has(label))
3222
3289
  findings.push({
3223
- kind: 'duplicate-row-text',
3290
+ kind: 'duplicate-row-label',
3224
3291
  attr: 'items',
3225
- message: `two keyless rows in ${groupName} on ${name} read \`${text}\` — give them a \`key\` each (identical text is legal across groups, not within one)`,
3292
+ message: `two rows with no \`value\` in ${groupName} on ${name} read \`${label}\` — give each a \`value\` (an identical label is legal across groups, not within one)`,
3226
3293
  });
3227
- else seen.set(text, true);
3294
+ else seen.set(label, true);
3228
3295
  }
3229
3296
  }
3230
3297
  // A submenu is its own level.
@@ -3232,7 +3299,7 @@ export function checkDropdownKeys(name, node, arrays) {
3232
3299
  scope(
3233
3300
  childArray,
3234
3301
  false,
3235
- `the submenu of \`${literal(entry, 'text') ?? 'a row'}\``
3302
+ `the submenu of \`${literal(entry, 'label') ?? 'a row'}\``
3236
3303
  );
3237
3304
  }
3238
3305
  };
@@ -1,27 +0,0 @@
1
- //#region src/i18n/index.ts
2
- var e = [
3
- "cs",
4
- "da",
5
- "de",
6
- "el",
7
- "en",
8
- "es",
9
- "fi",
10
- "fr",
11
- "hu",
12
- "it",
13
- "ja",
14
- "ko",
15
- "nb",
16
- "nl",
17
- "pl",
18
- "pt",
19
- "ro",
20
- "ru",
21
- "sv",
22
- "tr",
23
- "uk",
24
- "zh-cn"
25
- ];
26
- //#endregion
27
- export { e as BUILTIN_LOCALE_KEYS };