bitboss-ui 3.0.0-beta.32 → 3.0.0-beta.35

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 (346) hide show
  1. package/README.md +49 -27
  2. package/bin/bitboss-ui.mjs +94 -6
  3. package/dist/ai/BbAccordion.md +19 -19
  4. package/dist/ai/BbAsterisk.md +3 -2
  5. package/dist/ai/BbAvatar.md +1 -0
  6. package/dist/ai/BbBadge.md +13 -12
  7. package/dist/ai/BbBadgeButton.md +8 -7
  8. package/dist/ai/BbBreadcrumbs.md +3 -3
  9. package/dist/ai/BbButton.md +29 -7
  10. package/dist/ai/BbCalendar.md +5 -4
  11. package/dist/ai/BbCheckbox.md +7 -4
  12. package/dist/ai/BbCheckboxGroup.md +256 -15
  13. package/dist/ai/BbColorInput.md +5 -5
  14. package/dist/ai/BbColorPalette.md +9 -1
  15. package/dist/ai/BbConfirm.md +7 -4
  16. package/dist/ai/BbDatePicker.md +9 -9
  17. package/dist/ai/BbDatePickerInput.md +7 -7
  18. package/dist/ai/BbDialog.md +20 -10
  19. package/dist/ai/BbDropdown.md +103 -16
  20. package/dist/ai/BbDropdownButton.md +26 -12
  21. package/dist/ai/BbDropdownGroup.md +4 -3
  22. package/dist/ai/BbDropzone.md +1 -1
  23. package/dist/ai/BbIndicator.md +6 -6
  24. package/dist/ai/BbNumberInput.md +10 -10
  25. package/dist/ai/BbOffCanvas.md +35 -14
  26. package/dist/ai/BbPagination.md +32 -18
  27. package/dist/ai/BbPopover.md +5 -5
  28. package/dist/ai/BbProgress.md +38 -24
  29. package/dist/ai/BbRadio.md +5 -3
  30. package/dist/ai/BbRadioGroup.md +162 -51
  31. package/dist/ai/BbRating.md +109 -27
  32. package/dist/ai/BbSelect.md +20 -9
  33. package/dist/ai/BbSelectPopover.md +15 -14
  34. package/dist/ai/BbSlider.md +46 -28
  35. package/dist/ai/BbSmoothHeight.md +2 -2
  36. package/dist/ai/BbSwitch.md +20 -21
  37. package/dist/ai/BbSwitchGroup.md +70 -10
  38. package/dist/ai/BbTable.md +6 -6
  39. package/dist/ai/BbTabs.md +3 -3
  40. package/dist/ai/BbTabsList.md +1 -1
  41. package/dist/ai/BbTabsPanes.md +1 -1
  42. package/dist/ai/BbTabsRoot.md +1 -1
  43. package/dist/ai/BbTag.md +12 -9
  44. package/dist/ai/BbTextInput.md +15 -10
  45. package/dist/ai/BbTextarea.md +6 -6
  46. package/dist/ai/BbTimePicker.md +9 -1
  47. package/dist/ai/BbTimePickerInput.md +18 -3
  48. package/dist/ai/BbToast.md +1 -1
  49. package/dist/ai/BbTree.md +7 -0
  50. package/dist/ai/ChipsBox.md +7 -6
  51. package/dist/ai/CommonField.md +2 -2
  52. package/dist/ai/OptionsContainer.md +4 -2
  53. package/dist/ai/changelog.json +387 -4
  54. package/dist/ai/components.json +3105 -566
  55. package/dist/ai/composables/useBbDropdownContext.md +168 -0
  56. package/dist/ai/composables/useBbFormContext.md +15 -1
  57. package/dist/ai/composables/useBbTableContext.md +30 -14
  58. package/dist/ai/composables/useConfirm.md +2 -1
  59. package/dist/ai/composables/useMobile.md +17 -10
  60. package/dist/ai/composables/useToast.md +3 -0
  61. package/dist/ai/guides/agent-contract.md +4 -2
  62. package/dist/ai/guides/design-language.md +20 -17
  63. package/dist/ai/guides/design-tokens.md +49 -34
  64. package/dist/ai/guides/icons-policy.md +1 -1
  65. package/dist/ai/guides/inline-edit-playbook.md +6 -1
  66. package/dist/ai/guides/installation-and-plugin-setup.md +58 -21
  67. package/dist/ai/guides/migration/components/bb-accordion.md +8 -0
  68. package/dist/ai/guides/migration/components/bb-button.md +3 -3
  69. package/dist/ai/guides/migration/components/bb-checkbox-group.md +43 -29
  70. package/dist/ai/guides/migration/components/bb-checkbox.md +1 -0
  71. package/dist/ai/guides/migration/components/bb-color-input.md +5 -5
  72. package/dist/ai/guides/migration/components/bb-date-picker-input.md +10 -9
  73. package/dist/ai/guides/migration/components/bb-dropdown-button.md +7 -1
  74. package/dist/ai/guides/migration/components/bb-dropdown.md +1 -1
  75. package/dist/ai/guides/migration/components/bb-dropzone.md +8 -0
  76. package/dist/ai/guides/migration/components/bb-intersection.md +1 -1
  77. package/dist/ai/guides/migration/components/bb-popover.md +7 -0
  78. package/dist/ai/guides/migration/components/bb-rating.md +8 -7
  79. package/dist/ai/guides/migration/components/bb-select-popover.md +1 -1
  80. package/dist/ai/guides/migration/components/bb-select.md +2 -1
  81. package/dist/ai/guides/migration/components/bb-slider.md +7 -6
  82. package/dist/ai/guides/migration/components/bb-table.md +6 -4
  83. package/dist/ai/guides/migration/components/bb-tag.md +1 -0
  84. package/dist/ai/guides/migration/components/bb-text-input.md +6 -6
  85. package/dist/ai/guides/migration/components/bb-toast.md +1 -1
  86. package/dist/ai/guides/migration/components/bb-tree.md +8 -8
  87. package/dist/ai/guides/migration/components/use-confirm.md +8 -0
  88. package/dist/ai/guides/migration/v2-to-v3.md +150 -115
  89. package/dist/ai/guides/options-items-playbook.md +12 -4
  90. package/dist/ai/guides/page-shell.md +1 -1
  91. package/dist/ai/guides/passthrough.md +59 -23
  92. package/dist/ai/guides/validated-forms.md +8 -2
  93. package/dist/ai/index.md +2 -1
  94. package/dist/ai/recipes/inertia/approvals-inbox.md +21 -4
  95. package/dist/ai/recipes/inertia/inline-edit-workspace.md +26 -9
  96. package/dist/ai/recipes/inertia/onboarding.md +28 -6
  97. package/dist/ai/recipes/inertia/ownership-atlas.md +1 -0
  98. package/dist/ai/recipes/inertia/record-form.md +9 -1
  99. package/dist/ai/recipes/inertia/records-workspace.md +52 -25
  100. package/dist/ai/recipes/inertia/upload-center.md +16 -4
  101. package/dist/ai/recipes/inertia/wizard-form.md +16 -3
  102. package/dist/ai/recipes/nuxt/approvals-inbox.md +21 -4
  103. package/dist/ai/recipes/nuxt/inline-edit-workspace.md +26 -9
  104. package/dist/ai/recipes/nuxt/onboarding.md +28 -6
  105. package/dist/ai/recipes/nuxt/record-form.md +22 -4
  106. package/dist/ai/recipes/nuxt/records-workspace.md +48 -24
  107. package/dist/ai/recipes/nuxt/upload-center.md +15 -3
  108. package/dist/ai/recipes/nuxt/wizard-form.md +16 -3
  109. package/dist/ai/recipes/vue/approvals-inbox.md +21 -4
  110. package/dist/ai/recipes/vue/inline-edit-workspace.md +26 -9
  111. package/dist/ai/recipes/vue/onboarding.md +30 -6
  112. package/dist/ai/recipes/vue/record-form.md +22 -4
  113. package/dist/ai/recipes/vue/records-workspace.md +53 -25
  114. package/dist/ai/recipes/vue/upload-center.md +16 -4
  115. package/dist/ai/recipes/vue/wizard-form.md +18 -3
  116. package/dist/ai/source/BbAccordion.md +7 -4
  117. package/dist/ai/source/BbAvatar.md +4 -0
  118. package/dist/ai/source/BbBadge.md +41 -38
  119. package/dist/ai/source/BbBadgeButton.md +41 -38
  120. package/dist/ai/source/BbButton.md +39 -13
  121. package/dist/ai/source/BbCalendar.md +18 -10
  122. package/dist/ai/source/BbCheckbox.md +10 -7
  123. package/dist/ai/source/BbCheckboxGroup.md +214 -70
  124. package/dist/ai/source/BbColorInput.md +13 -6
  125. package/dist/ai/source/BbColorPalette.md +22 -8
  126. package/dist/ai/source/BbDatePicker.md +12 -12
  127. package/dist/ai/source/BbDatePickerInput.md +24 -6
  128. package/dist/ai/source/BbDialog.md +84 -24
  129. package/dist/ai/source/BbDropdown.md +48 -17
  130. package/dist/ai/source/BbDropdownButton.md +55 -14
  131. package/dist/ai/source/BbDropdownGroup.md +29 -8
  132. package/dist/ai/source/BbDropzone.md +30 -9
  133. package/dist/ai/source/BbIndicator.md +23 -18
  134. package/dist/ai/source/BbNumberInput.md +17 -7
  135. package/dist/ai/source/BbOffCanvas.md +192 -15
  136. package/dist/ai/source/BbPagination.md +48 -20
  137. package/dist/ai/source/BbPopover.md +4 -4
  138. package/dist/ai/source/BbProgress.md +43 -29
  139. package/dist/ai/source/BbRadio.md +10 -7
  140. package/dist/ai/source/BbRadioGroup.md +207 -68
  141. package/dist/ai/source/BbRating.md +64 -41
  142. package/dist/ai/source/BbSelect.md +47 -22
  143. package/dist/ai/source/BbSelectPopover.md +141 -16
  144. package/dist/ai/source/BbSlider.md +172 -104
  145. package/dist/ai/source/BbSwitch.md +4 -4
  146. package/dist/ai/source/BbSwitchGroup.md +178 -61
  147. package/dist/ai/source/BbTable.md +28 -21
  148. package/dist/ai/source/BbTabsList.md +12 -3
  149. package/dist/ai/source/BbTag.md +15 -8
  150. package/dist/ai/source/BbTextInput.md +29 -24
  151. package/dist/ai/source/BbTextarea.md +12 -6
  152. package/dist/ai/source/BbTimePicker.md +11 -4
  153. package/dist/ai/source/BbTimePickerInput.md +14 -5
  154. package/dist/ai/source/BbTooltip.md +32 -6
  155. package/dist/ai/source/CommonField.md +138 -50
  156. package/dist/ai/source/CommonFieldInput.md +6 -1
  157. package/dist/ai/source/CommonTimeSelector.md +4 -2
  158. package/dist/ai/source/GroupedListBox.md +80 -85
  159. package/dist/ai/source/OptionsContainer.md +148 -93
  160. package/dist/assets/svgs/star.svg_raw.js +4 -0
  161. package/dist/components/BbAccordion/BbAccordion.vue_vue_type_script_setup_true_lang.js +10 -10
  162. package/dist/components/BbAccordion/types.d.ts +1 -1
  163. package/dist/components/BbButton/BbButton.vue_vue_type_script_setup_true_lang.js +5 -4
  164. package/dist/components/BbCalendar/types.d.ts +1 -1
  165. package/dist/components/BbCalendar/useCalendarGrid.js +21 -21
  166. package/dist/components/BbCalendar/useDayGrid.js +14 -14
  167. package/dist/components/BbCheckbox/BbCheckbox.vue.d.ts +7 -7
  168. package/dist/components/BbCheckbox/BbCheckbox.vue_vue_type_script_setup_true_lang.js +3 -3
  169. package/dist/components/BbCheckbox/types.d.ts +6 -3
  170. package/dist/components/BbCheckboxGroup/BbCheckboxGroup.vue_vue_type_script_setup_true_lang.js +77 -71
  171. package/dist/components/BbCheckboxGroup/types.d.ts +33 -8
  172. package/dist/components/BbColorInput/BbColorInput.vue.d.ts +14 -14
  173. package/dist/components/BbColorInput/BbColorInput.vue_vue_type_script_setup_true_lang.js +3 -3
  174. package/dist/components/BbColorInput/types.d.ts +11 -4
  175. package/dist/components/BbColorPalette/BbColorPalette.vue_vue_type_script_setup_true_lang.js +1 -1
  176. package/dist/components/BbDatePicker/types.d.ts +1 -1
  177. package/dist/components/BbDatePickerInput/BbDatePickerInput.vue.d.ts +4 -4
  178. package/dist/components/BbDatePickerInput/BbDatePickerInput.vue_vue_type_script_setup_true_lang.js +3 -3
  179. package/dist/components/BbDatePickerInput/types.d.ts +11 -4
  180. package/dist/components/BbDialog/BbDialog.vue_vue_type_script_setup_true_lang.js +138 -138
  181. package/dist/components/BbDialog/types.d.ts +6 -1
  182. package/dist/components/BbDropdown/BbDropdown.vue_vue_type_script_setup_true_lang.js +279 -279
  183. package/dist/components/BbDropdown/BbDropdownList.vue_vue_type_script_setup_true_lang.js +333 -305
  184. package/dist/components/BbDropdown/normalizeGroups.js +1 -0
  185. package/dist/components/BbDropdown/types.d.ts +16 -3
  186. package/dist/components/BbDropdownButton/BbDropdownButton.vue.d.ts +5 -0
  187. package/dist/components/BbDropdownButton/BbDropdownButton.vue_vue_type_script_setup_true_lang.js +55 -25
  188. package/dist/components/BbDropdownButton/types.d.ts +19 -7
  189. package/dist/components/BbDropdownButton/types.js +2 -0
  190. package/dist/components/BbDropzone/BbDropzone.vue.d.ts +2 -2
  191. package/dist/components/BbDropzone/BbDropzone.vue_vue_type_script_setup_true_lang.js +143 -140
  192. package/dist/components/BbDropzone/types.d.ts +2 -1
  193. package/dist/components/BbIcon/iconCache.js +2 -2
  194. package/dist/components/BbIndicator/types.d.ts +1 -1
  195. package/dist/components/BbNumberInput/BbNumberInput.vue.d.ts +6 -6
  196. package/dist/components/BbNumberInput/BbNumberInput.vue_vue_type_script_setup_true_lang.js +4 -4
  197. package/dist/components/BbNumberInput/types.d.ts +11 -4
  198. package/dist/components/BbOffCanvas/BbOffCanvas.vue_vue_type_script_setup_true_lang.js +217 -211
  199. package/dist/components/BbOffCanvas/types.d.ts +6 -1
  200. package/dist/components/BbPagination/BbPagination.vue_vue_type_script_setup_true_lang.js +59 -55
  201. package/dist/components/BbPagination/types.d.ts +16 -10
  202. package/dist/components/BbPagination/types.js +2 -0
  203. package/dist/components/BbPopover/BbPopover.vue_vue_type_script_setup_true_lang.js +13 -13
  204. package/dist/components/BbPopover/types.d.ts +2 -2
  205. package/dist/components/BbProgress/BbProgress.vue_vue_type_script_setup_true_lang.js +14 -13
  206. package/dist/components/BbProgress/types.d.ts +8 -4
  207. package/dist/components/BbProgress/types.js +1 -1
  208. package/dist/components/BbRadio/BbRadio.vue.d.ts +7 -7
  209. package/dist/components/BbRadio/BbRadio.vue_vue_type_script_setup_true_lang.js +3 -3
  210. package/dist/components/BbRadio/types.d.ts +6 -3
  211. package/dist/components/BbRadioGroup/BbRadioGroup.vue_vue_type_script_setup_true_lang.js +37 -31
  212. package/dist/components/BbRadioGroup/types.d.ts +33 -8
  213. package/dist/components/BbRating/BbRating.vue.d.ts +6 -6
  214. package/dist/components/BbRating/BbRating.vue_vue_type_script_setup_true_lang.js +111 -112
  215. package/dist/components/BbRating/types.d.ts +16 -5
  216. package/dist/components/BbSelect/BbSelect.vue_vue_type_script_setup_true_lang.js +190 -166
  217. package/dist/components/BbSelect/types.d.ts +18 -8
  218. package/dist/components/BbSelect/types.js +2 -0
  219. package/dist/components/BbSelectPopover/BbSelectPopover.vue_vue_type_script_setup_true_lang.js +442 -408
  220. package/dist/components/BbSlider/BbSlider.vue.d.ts +4 -4
  221. package/dist/components/BbSlider/BbSlider.vue_vue_type_script_setup_true_lang.js +232 -193
  222. package/dist/components/BbSlider/types.d.ts +28 -10
  223. package/dist/components/BbSlider/types.js +5 -0
  224. package/dist/components/BbSwitch/BbSwitch.vue.d.ts +7 -7
  225. package/dist/components/BbSwitch/BbSwitch.vue_vue_type_script_setup_true_lang.js +3 -3
  226. package/dist/components/BbSwitchGroup/BbSwitchGroup.vue_vue_type_script_setup_true_lang.js +77 -71
  227. package/dist/components/BbTable/BbTable.vue_vue_type_script_setup_true_lang.js +103 -100
  228. package/dist/components/BbTabs/BbTabsList.vue_vue_type_script_setup_true_lang.js +21 -21
  229. package/dist/components/BbTag/BbTag.vue.d.ts +6 -6
  230. package/dist/components/BbTag/BbTag.vue_vue_type_script_setup_true_lang.js +91 -91
  231. package/dist/components/BbTag/types.d.ts +11 -5
  232. package/dist/components/BbTextInput/BbTextInput.vue.d.ts +6 -6
  233. package/dist/components/BbTextInput/BbTextInput.vue_vue_type_script_setup_true_lang.js +9 -16
  234. package/dist/components/BbTextInput/types.d.ts +11 -5
  235. package/dist/components/BbTextarea/BbTextarea.vue.d.ts +6 -6
  236. package/dist/components/BbTextarea/BbTextarea.vue_vue_type_script_setup_true_lang.js +3 -3
  237. package/dist/components/BbTextarea/types.d.ts +11 -5
  238. package/dist/components/BbTimePicker/BbTimePicker.vue.d.ts +2 -2
  239. package/dist/components/BbTimePickerInput/BbTimePickerInput.vue.d.ts +4 -4
  240. package/dist/components/BbTimePickerInput/BbTimePickerInput.vue_vue_type_script_setup_true_lang.js +3 -3
  241. package/dist/components/BbTimePickerInput/types.d.ts +13 -4
  242. package/dist/components/BbTooltip/BbTooltip.vue_vue_type_script_setup_true_lang.js +91 -90
  243. package/dist/components/CommonField/CommonField.vue.d.ts +1 -1
  244. package/dist/components/CommonField/CommonField.vue_vue_type_script_setup_true_lang.js +60 -53
  245. package/dist/components/CommonField/types.d.ts +7 -6
  246. package/dist/components/CommonFieldInput/CommonFieldInput.vue_vue_type_script_setup_true_lang.js +1 -1
  247. package/dist/components/GroupedListBox/GroupedListBox.vue_vue_type_script_setup_true_lang.js +137 -124
  248. package/dist/components/OptionsContainer/OptionsContainer.vue_vue_type_script_setup_true_lang.js +49 -33
  249. package/dist/components/OptionsContainer/types.d.ts +15 -3
  250. package/dist/composables/useBaseOptions.js +47 -39
  251. package/dist/composables/useBbTableContext.js +7 -6
  252. package/dist/composables/useBbTabsContext.js +64 -64
  253. package/dist/composables/useClosingInert.d.ts +4 -4
  254. package/dist/composables/useCoherence.js +1 -1
  255. package/dist/composables/useConfirm.js +48 -42
  256. package/dist/composables/useKeyboardInset.d.ts +28 -0
  257. package/dist/composables/useKeyboardInset.js +32 -0
  258. package/dist/composables/usePassthrough.js +14 -4
  259. package/dist/deprecation/ai-deprecations.json.d.ts +336 -104
  260. package/dist/deprecation/ai-deprecations.json.js +1 -1
  261. package/dist/i18n/index.d.ts +10 -16
  262. package/dist/index.d.ts +1 -18
  263. package/dist/llms-full.txt +2482 -927
  264. package/dist/llms-medium.txt +83 -41
  265. package/dist/llms.txt +4 -3
  266. package/dist/nuxt-module.d.ts +0 -17
  267. package/dist/nuxt.js +1 -1
  268. package/dist/plugin.js +18 -17
  269. package/dist/project-dts.d.ts +48 -0
  270. package/dist/project-dts.js +99 -0
  271. package/dist/runtime/nuxt-plugin.js +24 -23
  272. package/dist/styles.css +3 -2
  273. package/dist/types/AlertVariant.d.ts +10 -1
  274. package/dist/types/BadgeVariant.d.ts +10 -1
  275. package/dist/types/ButtonVariant.d.ts +12 -1
  276. package/dist/types/ConfirmVariant.d.ts +8 -1
  277. package/dist/types/DropdownItemVariant.d.ts +8 -1
  278. package/dist/types/FieldLayout.d.ts +32 -0
  279. package/dist/types/IndicatorVariant.d.ts +11 -1
  280. package/dist/types/InputVariant.d.ts +9 -1
  281. package/dist/types/PtScope.d.ts +8 -6
  282. package/dist/types/RegistryKey.d.ts +10 -0
  283. package/dist/types/TabsVariant.d.ts +9 -1
  284. package/dist/types/ToastVariant.d.ts +11 -1
  285. package/dist/types/TooltipVariant.d.ts +8 -1
  286. package/dist/types/ptComponentMap.d.ts +5 -5
  287. package/dist/utilities/functions/isImeComposing.d.ts +7 -0
  288. package/dist/utilities/functions/isImeComposing.js +4 -0
  289. package/dist/utils/overlayEscapeStack.d.ts +10 -0
  290. package/dist/utils/overlayEscapeStack.js +5 -3
  291. package/dist/utils/versionCheck.d.ts +19 -0
  292. package/dist/utils/versionCheck.js +18 -0
  293. package/dist/validated/BbCheckbox.vue.d.ts +2 -2
  294. package/dist/validated/BbCheckbox.vue_vue_type_script_setup_true_lang.js +1 -1
  295. package/dist/validated/BbCheckboxGroup.vue.d.ts +4 -2
  296. package/dist/validated/BbCheckboxGroup.vue_vue_type_script_setup_true_lang.js +4 -2
  297. package/dist/validated/BbColorInput.vue.d.ts +2 -2
  298. package/dist/validated/BbColorInput.vue_vue_type_script_setup_true_lang.js +1 -1
  299. package/dist/validated/BbDatePickerInput.vue_vue_type_script_setup_true_lang.js +1 -1
  300. package/dist/validated/BbDropzone.vue.d.ts +2 -2
  301. package/dist/validated/BbNumberInput.vue.d.ts +2 -2
  302. package/dist/validated/BbNumberInput.vue_vue_type_script_setup_true_lang.js +1 -1
  303. package/dist/validated/BbRadioGroup.vue.d.ts +4 -2
  304. package/dist/validated/BbRadioGroup.vue_vue_type_script_setup_true_lang.js +4 -2
  305. package/dist/validated/BbRating.vue_vue_type_script_setup_true_lang.js +1 -1
  306. package/dist/validated/BbSelect.vue.d.ts +19 -1
  307. package/dist/validated/BbSelect.vue_vue_type_script_setup_true_lang.js +19 -1
  308. package/dist/validated/BbSlider.vue_vue_type_script_setup_true_lang.js +36 -1
  309. package/dist/validated/BbSwitch.vue.d.ts +2 -2
  310. package/dist/validated/BbSwitch.vue_vue_type_script_setup_true_lang.js +1 -1
  311. package/dist/validated/BbSwitchGroup.vue.d.ts +4 -2
  312. package/dist/validated/BbSwitchGroup.vue_vue_type_script_setup_true_lang.js +4 -2
  313. package/dist/validated/BbTag.vue_vue_type_script_setup_true_lang.js +1 -1
  314. package/dist/validated/BbTextInput.vue.d.ts +2 -2
  315. package/dist/validated/BbTextInput.vue_vue_type_script_setup_true_lang.js +1 -1
  316. package/dist/validated/BbTextarea.vue.d.ts +2 -2
  317. package/dist/validated/BbTextarea.vue_vue_type_script_setup_true_lang.js +1 -1
  318. package/dist/validated/BbTimePickerInput.vue_vue_type_script_setup_true_lang.js +1 -1
  319. package/dist/validated/index.d.ts +0 -17
  320. package/dist/vite-plugin.d.ts +71 -29
  321. package/dist/vite.js +337 -342
  322. package/llms.txt +4 -3
  323. package/package.json +8 -5
  324. package/scripts/lib/check-fix.mjs +129 -0
  325. package/scripts/lib/component-attr-targets.ts +117 -0
  326. package/scripts/lib/component-tree.ts +43 -6
  327. package/scripts/lib/eslint-disable.mjs +119 -0
  328. package/scripts/lib/eslint-plugin.d.ts +3 -1
  329. package/scripts/lib/eslint-plugin.mjs +159 -0
  330. package/scripts/lib/html-attributes.mjs +221 -1
  331. package/scripts/lib/validate-bb-markup.mjs +17 -3
  332. package/dist/alert-variants.d.ts +0 -19
  333. package/dist/badge-variants.d.ts +0 -19
  334. package/dist/button-variants.d.ts +0 -21
  335. package/dist/confirm-variants.d.ts +0 -17
  336. package/dist/dropdown-item-variants.d.ts +0 -17
  337. package/dist/indicator-variants.d.ts +0 -20
  338. package/dist/input-variants.d.ts +0 -18
  339. package/dist/locale-registry.d.ts +0 -37
  340. package/dist/pt-scope-registry.d.ts +0 -15
  341. package/dist/tabs-variants.d.ts +0 -18
  342. package/dist/toast-variants.d.ts +0 -20
  343. package/dist/tooltip-variants.d.ts +0 -17
  344. package/dist/types/InputDirection.d.ts +0 -15
  345. package/dist/utils/passthroughTestKit.d.ts +0 -54
  346. package/dist/utils/swipeTestKit.d.ts +0 -9
package/README.md CHANGED
@@ -17,9 +17,10 @@ Published artifacts are **`dist/`** (ESM JavaScript, `.d.ts`, the two stylesheet
17
17
  ### TypeScript: use `vue-tsc` 3
18
18
 
19
19
  Use **`vue-tsc` 3 or newer**. Under `vue-tsc` 2 the template type-checker
20
- silently checks **nothing** about the props of the nine components declared with
21
- `generic="T"` — `BbSelect`, `BbSelectPopover`, `BbTable`, `BbTabs`,
22
- `BbTabsRoot`, `BbTree`, `BbRadioGroup`, `BbCheckboxGroup`, `BbSwitchGroup` —
20
+ silently checks **nothing** about the props of the nine public components that
21
+ use `<script setup generic="…">` — `BbSelect`, `BbSelectPopover`, `BbTable`,
22
+ `BbTabs`, `BbTabsRoot`, `BbTree`, `BbRadioGroup`, `BbCheckboxGroup`,
23
+ `BbSwitchGroup` —
23
24
  because they emit as generic functions rather than `DefineComponent<…>`, a shape
24
25
  Vue Language Tools 2 cannot read props out of.
25
26
 
@@ -39,7 +40,7 @@ Full detail: `ai/guides/installation-and-plugin-setup.md`.
39
40
 
40
41
  | Composable | Role |
41
42
  | ---------------------- | --------------------------------------------------------------------- |
42
- | `useBbConfig` | Global options for the kit (locale, defaults, etc.). |
43
+ | `useBbConfig` | `setConfig()` patches the one runtime-editable kit option: `locale`. |
43
44
  | `useBbDropdownContext` | Read a `BbDropdown`'s resolved groups/selections from anywhere by id. |
44
45
  | `useBbTableContext` | Imperative handle onto a `BbTable` by id. |
45
46
  | `useBbTabsContext` | Programmatic tab selection for a `BbTabs` by id. |
@@ -116,15 +117,15 @@ For the public **Bb\*** components, the package exports matching **props**, **ev
116
117
  **For AI coding agents:**
117
118
 
118
119
  The same knowledge base the npm package ships is served publicly over a CDN, so
119
- an agent can read it before anything is installed. `@alpha` tracks the latest
120
- v3 prerelease; pin an exact version (`bitboss-ui@3.0.0-alpha.5`) for stable
120
+ an agent can read it before anything is installed. `@beta` tracks the latest
121
+ v3 prerelease; pin an exact version (`bitboss-ui@3.0.0-beta.32`) for stable
121
122
  links. Sizes grow with the catalogue — treat them as the current order of
122
123
  magnitude, not a contract.
123
124
 
124
- - [Core knowledge base](https://llms-bitboss-ui.bitboss.it/dist/llms-medium.txt) (~110 KB) — **start here if you can only fetch one file.** Hard rules, setup, component picker, design language, and the full component catalogue.
125
- - [Index](https://llms-bitboss-ui.bitboss.it/llms.txt) (~19 KB) — link index into every document.
125
+ - [Core knowledge base](https://llms-bitboss-ui.bitboss.it/dist/llms-medium.txt) (~190 KB) — **start here if you can only fetch one file.** Hard rules, setup, component picker, design language, and the full component catalogue.
126
+ - [Index](https://llms-bitboss-ui.bitboss.it/llms.txt) (~22 KB) — link index into every document.
126
127
  - [components.json](https://llms-bitboss-ui.bitboss.it/dist/ai/components.json) — machine-readable API surface, for programmatic validation.
127
- - [Complete knowledge base](https://llms-bitboss-ui.bitboss.it/dist/llms-full.txt) (~3.2 MB) — everything concatenated. Bulk ingestion only; too large to prompt with.
128
+ - [Complete knowledge base](https://llms-bitboss-ui.bitboss.it/dist/llms-full.txt) (~4.3 MB) — everything concatenated. Bulk ingestion only; too large to prompt with.
128
129
 
129
130
  Already installed? Prefer the local copy under `node_modules/bitboss-ui/dist/ai/`,
130
131
  run `npx bitboss-ui ai-init` to write agent pointers, and
@@ -142,24 +143,24 @@ This package is developed and maintained by [BitBoss](https://www.bitboss.it/),
142
143
 
143
144
  ## Installation
144
145
 
145
- **v3 is a prerelease: the `@alpha` tag is required.** A bare
146
+ **v3 is a prerelease: the `@beta` tag is required.** A bare
146
147
  `npm install bitboss-ui` resolves to the v2 line, which has no build plugin and
147
148
  no `dist/ai` knowledge base — if you are following the v3 docs, that install
148
149
  will not work.
149
150
 
150
151
  ```bash
151
- npm install bitboss-ui@alpha
152
+ npm install bitboss-ui@beta
152
153
  ```
153
154
 
154
155
  ```bash
155
- pnpm add bitboss-ui@alpha
156
+ pnpm add bitboss-ui@beta
156
157
  ```
157
158
 
158
159
  ```bash
159
- yarn add bitboss-ui@alpha
160
+ yarn add bitboss-ui@beta
160
161
  ```
161
162
 
162
- Verify with `npm ls bitboss-ui` — it must report `3.0.0-alpha.*`.
163
+ Verify with `npm ls bitboss-ui` — it must report `3.0.0-beta.*`.
163
164
 
164
165
  ---
165
166
 
@@ -439,6 +440,27 @@ entry is the state itself and is never reported:
439
440
  />
440
441
  ```
441
442
 
443
+ #### Rating star colours: `no-star-color`
444
+
445
+ `bitboss-ui/no-star-color` flags any colour utility in `BbRating`'s `pt:item`,
446
+ in the base entry or any state: `text-*`, `fill-*` and `stroke-*`, whether a
447
+ shade (`text-amber-500`), a keyword (`fill-current`), a variable
448
+ (`text-(--bb-text-faint)`) or an arbitrary colour (`text-[#f59e0b]`). Sizes and
449
+ widths (`text-sm`, `stroke-2`) are never reported. The rating paints each
450
+ star's colour per state (filled, the hover preview, the error tint), and a
451
+ colour utility beats those rules, so it looks right at rest and freezes the
452
+ stars. The fix lives on another attribute, so the rule explains it rather
453
+ than rewriting:
454
+
455
+ ```vue
456
+ <!-- errors: no hover preview, no error tint -->
457
+ <BbRating pt:item="text-(--bb-text-faint)" pt:item:selected="text-amber-500" />
458
+ <!-- same look, the preview and the states keep working -->
459
+ <BbRating
460
+ pt:root="[--empty:var(--bb-text-faint)] [--accent:var(--color-amber-500)]"
461
+ />
462
+ ```
463
+
442
464
  #### The one rule that reads CSS: `no-unknown-token`
443
465
 
444
466
  `bitboss-ui/no-unknown-token` flags a bare `var(--bb-…)` naming a token the
@@ -501,17 +523,17 @@ A standard `llms.txt` discovery file is also published at:
501
523
 
502
524
  ### Knowledge-base layout
503
525
 
504
- | Path | Contents |
505
- | ------------------------------------- | ----------------------------------------- |
506
- | `dist/ai/guides/ai-router.md` | **Start here** — which file to open next |
507
- | `dist/ai/index.md` | Full catalogue + agent rules |
508
- | `dist/ai/components.json` | Machine-readable API (props/events/slots) |
509
- | `dist/ai/<ComponentName>.md` | Guide-first contract per component |
510
- | `dist/ai/composables/<name>.md` | Composable docs |
511
- | `dist/ai/guides/agent-contract.md` | Mandatory agent rules |
512
- | `dist/ai/guides/*-playbook.md` | Coherence / fetch / options / inline-edit |
513
- | `dist/ai/guides/migration/` | v2 → v3 upgrade corpus |
514
- | `dist/ai/recipes/{vue,nuxt,inertia}/` | Page-level assemblies (11 × 3) |
526
+ | Path | Contents |
527
+ | ------------------------------------- | ------------------------------------------------------------------------------------ |
528
+ | `dist/ai/guides/ai-router.md` | **Start here** — which file to open next |
529
+ | `dist/ai/index.md` | Full catalogue + agent rules |
530
+ | `dist/ai/components.json` | Machine-readable API (props/events/slots) |
531
+ | `dist/ai/<ComponentName>.md` | Guide-first contract per component |
532
+ | `dist/ai/composables/<name>.md` | Composable docs |
533
+ | `dist/ai/guides/agent-contract.md` | Mandatory agent rules |
534
+ | `dist/ai/guides/*-playbook.md` | Coherence / fetch / options / inline-edit |
535
+ | `dist/ai/guides/migration/` | v2 → v3 upgrade corpus |
536
+ | `dist/ai/recipes/{vue,nuxt,inertia}/` | Page-level assemblies (9 vue / 9 nuxt / 10 inertia; Ownership Atlas is inertia-only) |
515
537
 
516
538
  ### Package exports
517
539
 
@@ -571,8 +593,8 @@ To make a report actionable, include:
571
593
  - whether it reproduces in dev, in a production build, or only under SSR
572
594
  - the smallest component snippet that shows it
573
595
 
574
- v3 ships as a prerelease (`npm i bitboss-ui@alpha`). Expect breaking changes
575
- between alphas; each one is recorded in the migration guides under
596
+ v3 ships as a prerelease (`npm i bitboss-ui@beta`). Expect breaking changes
597
+ between prereleases; each one is recorded in the migration guides under
576
598
  [`ai/guides/migration/`](ai/guides/migration/).
577
599
 
578
600
  ---
@@ -46,9 +46,13 @@
46
46
  */
47
47
 
48
48
  import { spawnSync } from 'node:child_process';
49
+ // `globSync` is read off the namespace, not imported by name: it only exists
50
+ // from Node 22, and a named import of a missing builtin export is a
51
+ // SyntaxError at load time, which killed every command on Node 20 (Sail
52
+ // images still ship it). Only quoted glob arguments need it (Q46.4).
53
+ import * as fs from 'node:fs';
49
54
  import {
50
55
  existsSync,
51
- globSync,
52
56
  mkdirSync,
53
57
  readdirSync,
54
58
  readFileSync,
@@ -59,6 +63,11 @@ import {
59
63
  findHandRollHints,
60
64
  loadKnownTokens,
61
65
  } from '../scripts/lib/hand-roll-hints.mjs';
66
+ import {
67
+ disabledChecker,
68
+ ruleForFinding,
69
+ } from '../scripts/lib/eslint-disable.mjs';
70
+ import { applyBitbossFixes } from '../scripts/lib/check-fix.mjs';
62
71
  import { dirname, isAbsolute, join, relative, resolve } from 'node:path';
63
72
  import { fileURLToPath } from 'node:url';
64
73
  import { parseArgs } from 'node:util';
@@ -437,7 +446,13 @@ function resolveCheckFiles(cwd, patterns) {
437
446
  continue;
438
447
  }
439
448
  }
440
- const dirents = globSync(pattern, {
449
+ if (typeof fs.globSync !== 'function') {
450
+ console.error(
451
+ `[bitboss-ui] quoted glob patterns need Node >= 22 (this is ${process.version}): "${pattern}". Pass the directory, or leave the pattern unquoted so the shell expands it.`
452
+ );
453
+ process.exit(1);
454
+ }
455
+ const dirents = fs.globSync(pattern, {
441
456
  cwd,
442
457
  withFileTypes: true,
443
458
  // Pruning is a traversal shortcut; the inSkippedDir filter below is
@@ -710,9 +725,15 @@ function manifestVersionOf(manifestPath) {
710
725
  }
711
726
  }
712
727
 
713
- function checkCommand(
728
+ async function checkCommand(
714
729
  globs,
715
- { json: jsonMode, allowEmpty, allowComponents, manifest: manifestOverride }
730
+ {
731
+ json: jsonMode,
732
+ allowEmpty,
733
+ allowComponents,
734
+ manifest: manifestOverride,
735
+ fix,
736
+ }
716
737
  ) {
717
738
  const projectRoot = process.cwd();
718
739
 
@@ -770,9 +791,40 @@ function checkCommand(
770
791
  ...configuredAllowComponents(projectRoot),
771
792
  ...allowComponents,
772
793
  ];
794
+
795
+ // Q46.8: `--fix` applies the ESLint plugin's fixes (the registered v2→v3
796
+ // migrations) with ONLY the bitboss rules, then the check below reports
797
+ // what is left, so one command migrates and verifies.
798
+ if (fix) {
799
+ const outcome = await applyBitbossFixes({
800
+ projectRoot,
801
+ files,
802
+ manifestPath: manifestOverride ? manifestPath : undefined,
803
+ allowComponents: allowedComponents,
804
+ });
805
+ if ('error' in outcome) {
806
+ console.error(`[bitboss-ui] ${outcome.error}`);
807
+ process.exit(1);
808
+ }
809
+ const log = jsonMode ? console.error : console.log;
810
+ log(
811
+ outcome.fixed.length
812
+ ? `[bitboss-ui] check --fix: fixed ${outcome.fixed.length} file(s):\n${outcome.fixed
813
+ .map((file) => ` ${relative(projectRoot, file)}`)
814
+ .join('\n')}`
815
+ : '[bitboss-ui] check --fix: nothing to fix.'
816
+ );
817
+ if (outcome.skipped?.length)
818
+ log(
819
+ `[bitboss-ui] check --fix: ESLint ignored ${outcome.skipped.length} file(s), not fixed:\n${outcome.skipped
820
+ .map((file) => ` ${relative(projectRoot, file)}`)
821
+ .join('\n')}`
822
+ );
823
+ }
773
824
  const validateOptions = { allowComponents: allowedComponents };
774
825
 
775
826
  const findings = [];
827
+ let suppressed = 0;
776
828
  /*
777
829
  * Advisory only — see scripts/lib/hand-roll-hints.mjs. Hints never touch the
778
830
  * exit code, so a guess can never fail a consumer's build. `--no-hints`
@@ -786,7 +838,18 @@ function checkCommand(
786
838
  const { findings: fileFindings } = file.endsWith('.md')
787
839
  ? validateMarkdown(content, manifest, validateOptions)
788
840
  : validateVueSnippet(content, manifest, validateOptions);
841
+ // Q46.9: a finding the author silenced for ESLint (`eslint-disable*`,
842
+ // usually with a reason) is silenced here too, or `check` cannot gate
843
+ // CI next to a lint step that passes. `.md` lines are fence-relative,
844
+ // and docs carry no directives, so only `.vue` files are filtered.
845
+ const isDisabled = file.endsWith('.vue')
846
+ ? disabledChecker(content)
847
+ : () => false;
789
848
  for (const finding of fileFindings) {
849
+ if (isDisabled(finding.line, ruleForFinding(finding))) {
850
+ suppressed++;
851
+ continue;
852
+ }
790
853
  findings.push({ file: relPath, ...finding });
791
854
  }
792
855
  // .md files are documentation ABOUT components; a round <img> in a doc
@@ -798,6 +861,14 @@ function checkCommand(
798
861
  }
799
862
  }
800
863
 
864
+ /** One line, so a silenced finding is never invisible. */
865
+ const printSuppressed = () => {
866
+ if (suppressed === 0) return;
867
+ console.log(
868
+ `[bitboss-ui] ${suppressed} finding(s) silenced by eslint-disable comments.`
869
+ );
870
+ };
871
+
801
872
  /** Advisory block, printed on success and on failure alike. Never fatal. */
802
873
  const printHints = () => {
803
874
  if (hints.length === 0) return;
@@ -837,6 +908,7 @@ function checkCommand(
837
908
  {
838
909
  findings,
839
910
  hints,
911
+ suppressed,
840
912
  files: files.length,
841
913
  manifestVersion: judgedAgainst,
842
914
  installedVersion: packageVersion(),
@@ -874,10 +946,12 @@ function checkCommand(
874
946
  console.log(
875
947
  `[bitboss-ui] check OK — ${summarizeFileCounts(files)} file(s), zero unknown Bb* props/v-models/slots/nav-attrs.`
876
948
  );
949
+ printSuppressed();
877
950
  printHints();
878
951
  return;
879
952
  }
880
953
 
954
+ printSuppressed();
881
955
  const fileCount = new Set(findings.map((f) => f.file)).size;
882
956
  console.error(
883
957
  `[bitboss-ui] check FAILED — ${findings.length} finding(s) across ${fileCount} file(s):`
@@ -932,7 +1006,7 @@ Commands:
932
1006
  \`--no-mcp\` skips the server and the install. Idempotent —
933
1007
  safe to re-run after upgrades.
934
1008
  check [glob…] [--json] [--allow-empty] [--allow-component <Name>]
935
- [--no-hints] [--manifest <path>]
1009
+ [--no-hints] [--manifest <path>] [--fix]
936
1010
  Validate \`Bb*\` markup in .vue/.md files against the
937
1011
  installed components.json manifest (unknown/removed props,
938
1012
  bad v-models, unknown \`<template #slot>\` names,
@@ -945,6 +1019,18 @@ Commands:
945
1019
  nothing (a typo'd CI path validates zero files silently) —
946
1020
  pass \`--allow-empty\` when an empty match is expected.
947
1021
 
1022
+ \`--fix\` first applies the ESLint plugin's fixes (the
1023
+ registered v2→v3 renames, polarity flips and value
1024
+ remaps) to the matched .vue files with ONLY the
1025
+ bitboss-ui rules — your own ESLint config is not used —
1026
+ then reports what is left. Needs \`eslint\` and
1027
+ \`vue-eslint-parser\` in the project.
1028
+
1029
+ Honours ESLint disable comments in .vue files: a finding
1030
+ silenced for the matching \`bitboss-ui/*\` rule (or by a
1031
+ bare \`eslint-disable\`) is not reported, only counted:
1032
+ <!-- eslint-disable-next-line bitboss-ui/require-table-slot-prop -- why -->
1033
+
948
1034
  \`--manifest <path>\` judges against another version's
949
1035
  components.json instead of the installed one — the answer
950
1036
  to "which of my files break if I upgrade", BEFORE you
@@ -1034,6 +1120,7 @@ switch (command) {
1034
1120
  json: { type: 'boolean' },
1035
1121
  'allow-empty': { type: 'boolean' },
1036
1122
  'allow-component': { type: 'string', multiple: true },
1123
+ fix: { type: 'boolean' },
1037
1124
  manifest: { type: 'string' },
1038
1125
  // Accepted and ignored here — read straight off argv inside
1039
1126
  // checkCommand, but parseArgs is strict, so it must be declared.
@@ -1041,7 +1128,8 @@ switch (command) {
1041
1128
  },
1042
1129
  { allowPositionals: true }
1043
1130
  );
1044
- checkCommand(positionals, {
1131
+ await checkCommand(positionals, {
1132
+ fix: values.fix ?? false,
1045
1133
  json: values.json ?? false,
1046
1134
  allowEmpty: values['allow-empty'] ?? false,
1047
1135
  allowComponents: values['allow-component'] ?? [],
@@ -63,14 +63,14 @@ through `pt:panel` or `.bb-accordion__panel` — collapses with the body.
63
63
  v-model="faq.open"
64
64
  :class="index ? 'border-t border-(--bb-border)' : ''"
65
65
  >
66
- <template #header="{ value }">
66
+ <template #header="{ open }">
67
67
  <div
68
68
  class="flex w-full items-center justify-between gap-2 px-3 py-2 text-left text-sm font-medium"
69
69
  >
70
70
  <span>{{ faq.question }}</span>
71
71
  <span
72
72
  class="shrink-0 text-(--bb-text-muted) transition-transform duration-200"
73
- :class="value ? 'rotate-180' : ''"
73
+ :class="open ? 'rotate-180' : ''"
74
74
  >
75
75
  <BbIcon icon="lucide:chevron-down" size="sm" />
76
76
  </span>
@@ -137,7 +137,7 @@ on the row, badge included, toggles the panel.
137
137
  v-model="endpoint.open"
138
138
  :class="index ? 'border-t border-(--bb-border)' : ''"
139
139
  >
140
- <template #header="{ value }">
140
+ <template #header="{ open }">
141
141
  <div class="flex w-full items-center gap-2 px-3 py-2 text-left">
142
142
  <BbBadge size="xs" :variant="METHOD_VARIANT[endpoint.method]">{{
143
143
  endpoint.method
@@ -145,7 +145,7 @@ on the row, badge included, toggles the panel.
145
145
  <code class="truncate font-mono text-xs">{{ endpoint.path }}</code>
146
146
  <span
147
147
  class="ml-auto shrink-0 text-(--bb-text-muted) transition-transform duration-200"
148
- :class="value ? 'rotate-180' : ''"
148
+ :class="open ? 'rotate-180' : ''"
149
149
  >
150
150
  <BbIcon icon="lucide:chevron-down" size="sm" />
151
151
  </span>
@@ -247,9 +247,9 @@ const endpoints = ref<Endpoint[]>([
247
247
  .bb-badge.bb-badge--soft-red {
248
248
  --bg: color-mix(in oklab, var(--accent) 15%, var(--bb-panel));
249
249
  --fg: color-mix(in oklab, var(--accent) 80%, var(--bb-text));
250
- --border-width: 1px;
250
+ --bw: 1px;
251
251
  --border-color: color-mix(in oklab, var(--accent) 25%, var(--bb-panel));
252
- --ring: color-mix(in oklab, var(--accent) 45%, transparent);
252
+ --ring-color: color-mix(in oklab, var(--accent) 45%, transparent);
253
253
  }
254
254
  </style>
255
255
  ```
@@ -257,9 +257,9 @@ const endpoints = ref<Endpoint[]>([
257
257
  ### Slot scope: the open flag and the toggle handle
258
258
 
259
259
  Both slots — `header` and the default (body) slot — receive the same scope,
260
- `{ value, toggle }`:
260
+ `{ open, toggle }`:
261
261
 
262
- - `value` mirrors the open state (one-way — assigning to it does nothing). Use
262
+ - `open` mirrors the open state (one-way — assigning to it does nothing). Use
263
263
  it to spin a chevron or swap header copy.
264
264
  - `toggle()` flips the panel. In the header it is redundant (the button already
265
265
  toggles); its real use is in the **body**, for a "Show less" affordance that
@@ -274,14 +274,14 @@ Both slots — `header` and the default (body) slot — receive the same scope,
274
274
  class="max-w-md overflow-hidden rounded-(--bb-radius) border border-(--bb-border)"
275
275
  >
276
276
  <BbAccordion v-model="notes">
277
- <template #header="{ value }">
277
+ <template #header="{ open }">
278
278
  <div
279
279
  class="flex w-full items-center justify-between gap-2 px-3 py-2 text-left text-sm font-medium"
280
280
  >
281
281
  <span>Release notes</span>
282
282
  <span
283
283
  class="shrink-0 text-(--bb-text-muted) transition-transform duration-200"
284
- :class="value ? 'rotate-180' : ''"
284
+ :class="open ? 'rotate-180' : ''"
285
285
  >
286
286
  <BbIcon icon="lucide:chevron-down" size="sm" />
287
287
  </span>
@@ -334,7 +334,7 @@ to `null`). Prefer a stable key over an index when the list can reorder.
334
334
  :model-value="openIndex === index"
335
335
  @update:model-value="openIndex = $event ? index : null"
336
336
  >
337
- <template #header="{ value }">
337
+ <template #header="{ open }">
338
338
  <div
339
339
  class="flex w-full items-center justify-between gap-2 px-3 py-2 text-left text-sm"
340
340
  >
@@ -343,7 +343,7 @@ to `null`). Prefer a stable key over an index when the list can reorder.
343
343
  {{ plan.price }}
344
344
  <span
345
345
  class="shrink-0 transition-transform duration-200"
346
- :class="value ? 'rotate-180' : ''"
346
+ :class="open ? 'rotate-180' : ''"
347
347
  >
348
348
  <BbIcon icon="lucide:chevron-down" size="sm" />
349
349
  </span>
@@ -403,14 +403,14 @@ padding on the nested body content.
403
403
  class="max-w-md overflow-hidden rounded-(--bb-radius) border border-(--bb-border)"
404
404
  >
405
405
  <BbAccordion v-model="notifications">
406
- <template #header="{ value }">
406
+ <template #header="{ open }">
407
407
  <div
408
408
  class="flex w-full items-center justify-between gap-2 px-3 py-2 text-left text-sm font-medium"
409
409
  >
410
410
  <span>Notifications</span>
411
411
  <span
412
412
  class="shrink-0 text-(--bb-text-muted) transition-transform duration-200"
413
- :class="value ? 'rotate-180' : ''"
413
+ :class="open ? 'rotate-180' : ''"
414
414
  >
415
415
  <BbIcon icon="lucide:chevron-down" size="sm" />
416
416
  </span>
@@ -420,14 +420,14 @@ padding on the nested body content.
420
420
  <BbCheckbox v-model="mentions" label="Mentions" />
421
421
  <BbCheckbox v-model="digests" label="Weekly digest" />
422
422
  <BbAccordion v-model="advanced">
423
- <template #header="{ value }">
423
+ <template #header="{ open }">
424
424
  <div
425
425
  class="flex w-full items-center justify-between gap-2 py-1 text-left text-sm text-(--bb-text-muted)"
426
426
  >
427
427
  <span>Advanced</span>
428
428
  <span
429
429
  class="shrink-0 transition-transform duration-200"
430
- :class="value ? 'rotate-180' : ''"
430
+ :class="open ? 'rotate-180' : ''"
431
431
  >
432
432
  <BbIcon icon="lucide:chevron-down" size="sm" />
433
433
  </span>
@@ -519,11 +519,11 @@ collapses with the body.
519
519
  pt:panel="text-sm"
520
520
  :pt:root="index ? 'border-t border-(--bb-border)' : ''"
521
521
  >
522
- <template #header="{ value }">
522
+ <template #header="{ open }">
523
523
  <span>{{ faq.question }}</span>
524
524
  <span
525
525
  class="shrink-0 text-(--bb-text-muted) transition-transform duration-200"
526
- :class="value ? 'rotate-180' : ''"
526
+ :class="open ? 'rotate-180' : ''"
527
527
  >
528
528
  <BbIcon icon="lucide:chevron-down" size="sm" />
529
529
  </span>
@@ -575,7 +575,7 @@ grammar, the merge rules and the global map are in the
575
575
 
576
576
  ### Works well with
577
577
 
578
- - `BbIcon` — a rotating chevron in the header, driven by the slot's `value` (see
578
+ - `BbIcon` — a rotating chevron in the header, driven by the slot's `open` (see
579
579
  the FAQ example).
580
580
  - `BbBadge` — counts or soft method/status pills in the header (see the API
581
581
  reference example); non-interactive content stays click-transparent.
@@ -4,7 +4,7 @@
4
4
 
5
5
  - Safety level: **Consumer API**
6
6
  - Group: **Other**
7
- - Description: Presentational required-field marker (red "*"). No props/slots/events; placed in custom label content.
7
+ - Description: Presentational required-field marker (red "*"). No behaviour props/slots/events (only `pt`); placed in custom label content.
8
8
  - Usage rule: Prefer this component for consumer-facing implementations.
9
9
  - Implementation source (only when the contract below is not enough): [source/BbAsterisk.md](./source/BbAsterisk.md)
10
10
 
@@ -13,7 +13,8 @@
13
13
  ### When to use
14
14
 
15
15
  `BbAsterisk` is the small red `*` that marks a field as required. It is purely
16
- presentational — it has no props, slots, or events, and it does not read
16
+ presentational — it has no behaviour props, slots, or events (only `pt` to
17
+ restyle its root), and it does not read
17
18
  `required` or drive validation. You render it yourself wherever you build custom
18
19
  label content, so the marker matches the library's styling (`--bb-danger`).
19
20
 
@@ -648,6 +648,7 @@ Set these on the element, or on a class you put on it, to retune this component
648
648
  | `--bg` | `.bb-avatar` | `var(--bb-primary)` | fallback surface (an image covers it) |
649
649
  | `--fg` | `.bb-avatar` | `var(--bb-primary-fg)` | Initials; the built-in icon is an 80/20 mix of this toward --bg |
650
650
  | `--default-icon-size` | `.bb-avatar` | `clamp(14px, calc(var(--size) * 0.7), 48px)` | Built-in fallback icon: 70% of the avatar, floored at 14px and capped at 48px. `--size` is the avatar's own box, set inline from the `size` prop. |
651
+ | `--elev` | `.bb-avatar` | `var(--bb-elev-sm)` | The theme's resting lift on small chrome (Q44.15), declared here so an ancestor's `--elev` cannot reach in; `--elev: none` flattens one. |
651
652
  | `--size` | `.bb-avatar__default-icon` | `var(--default-icon-size)` | |
652
653
 
653
654
  ## Component tree
@@ -183,9 +183,9 @@ const invoices: InvoiceRow[] = [
183
183
  .bb-badge.bb-badge--soft-red {
184
184
  --bg: color-mix(in oklab, var(--accent) 15%, var(--bb-panel));
185
185
  --fg: color-mix(in oklab, var(--accent) 80%, var(--bb-text));
186
- --border-width: 1px;
186
+ --bw: 1px;
187
187
  --border-color: color-mix(in oklab, var(--accent) 25%, var(--bb-panel));
188
- --ring: color-mix(in oklab, var(--accent) 45%, transparent);
188
+ --ring-color: color-mix(in oklab, var(--accent) 45%, transparent);
189
189
  }
190
190
  </style>
191
191
  ```
@@ -779,10 +779,10 @@ const endpoints: Endpoint[] = [
779
779
  .bb-badge.bb-badge--soft-green,
780
780
  .bb-badge.bb-badge--soft-red {
781
781
  --bg: color-mix(in oklab, var(--accent) 15%, var(--bb-panel));
782
- --color: color-mix(in oklab, var(--accent) 80%, var(--bb-text));
783
- --border-width: 1px;
782
+ --fg: color-mix(in oklab, var(--accent) 80%, var(--bb-text));
783
+ --bw: 1px;
784
784
  --border-color: color-mix(in oklab, var(--accent) 25%, var(--bb-panel));
785
- --ring: color-mix(in oklab, var(--accent) 45%, transparent);
785
+ --ring-color: color-mix(in oklab, var(--accent) 45%, transparent);
786
786
  }
787
787
  </style>
788
788
  ```
@@ -888,20 +888,21 @@ Set these on the element, or on a class you put on it, to retune this component
888
888
  | --- | --- | --- | --- |
889
889
  | `--bg` | `.bb-badge` | `var(--bb-primary)` | pill fill |
890
890
  | `--fg` | `.bb-badge` | `var(--bb-primary-fg)` | label, icons and the clear glyph |
891
- | `--border-width` | `.bb-badge` | `0px` | Pill border. The `border` shorthand is always present, so the width is what turns it on — the filled variants leave it at 0 and the bordered ones (secondary/destructive/outline) step up to `--bb-border-w-sm`. Nothing compensates for it: the… |
891
+ | `--bw` | `.bb-badge` | `0px` | Pill border. The `border` shorthand is always present, so the width is what turns it on — the filled variants leave it at 0 and the bordered ones (secondary/destructive/outline) step up to `--bb-border-w-sm`. Nothing compensates for it: the… |
892
892
  | `--border-color` | `.bb-badge` | `transparent` | |
893
- | `--ring` | `.bb-badge` | `var(--bb-primary-ring)` | focus ring, per variant |
894
- | `--min-size-md` | `.bb-badge` | `16px` | The md value. Only the default --min-size below reads it; the size modifiers set --min-size directly. |
893
+ | `--ring-color` | `.bb-badge` | `var(--bb-primary-ring)` | focus ring colour, per variant |
894
+ | `--ring-size` | `.bb-badge` | `var(--bb-ring-size)` | focus ring width |
895
+ | `--min-size-md` | `.bb-badge` | `calc(var(--bb-control-h) - 16px)` | 16px at the default |
895
896
  | `--min-size` | `.bb-badge` | `var(--min-size-md)` | pill min height and min width |
896
897
  | `--elev` | `.bb-badge` | `var(--bb-elev-sm)` | Resting lift. Invisible while `--bb-elev` is its default transparent layer. A chip is small enough that a theme wanting a different lift here than on a button sets `--elev` on this class. |
897
898
  | `--r` | `.bb-badge` | `calc(var(--bb-radius) * 0.5)` | Pill corners; the body and trailing wrappers round their outer edges to match |
898
- | `--font-size` | `.bb-badge` | `10px` | label |
899
+ | `--fs` | `.bb-badge` | `calc(var(--bb-fs) - 4px)` | Label. Sizes are offsets from the density masters (--bb-fs, --bb-control-h), like BbButton's, so a denser theme scales the pill. |
899
900
  | `--icon-size` | `.bb-badge` | `12px` | leading/append icons (passed to BbIcon as --size) |
900
901
  | `--gap` | `.bb-badge` | `3px` | space between label, icons and the trailing side |
901
- | `--padding-inline` | `.bb-badge` | `6px` | base side padding; the modifiers below scale it per side |
902
+ | `--px` | `.bb-badge` | `6px` | base side padding; the modifiers below scale it per side |
902
903
  | `--clear-size` | `.bb-badge` | `12px` | clear button's glyph box (the circle painted on hover is 2px smaller) |
903
- | `--pad-left` | `.bb-badge` | `var(--padding-inline)` | Side-owned padding: the body and trailing wrappers carry the pill's inline padding (and its radius) so their hit areas run flush to the border. The modifiers below retune these vars instead of the pill's own padding. |
904
- | `--pad-right` | `.bb-badge` | `var(--padding-inline)` | |
904
+ | `--pad-left` | `.bb-badge` | `var(--px)` | Side-owned padding: the body and trailing wrappers carry the pill's inline padding (and its radius) so their hit areas run flush to the border. The modifiers below retune these vars instead of the pill's own padding. |
905
+ | `--pad-right` | `.bb-badge` | `var(--px)` | |
905
906
  | `--size` | `.bb-badge__icon` | `var(--icon-size)` | |
906
907
 
907
908
  ## Component tree
@@ -84,20 +84,21 @@ Set these on the element, or on a class you put on it, to retune this component
84
84
  | --- | --- | --- | --- |
85
85
  | `--bg` | `.bb-badge` | `var(--bb-primary)` | pill fill |
86
86
  | `--fg` | `.bb-badge` | `var(--bb-primary-fg)` | label, icons and the clear glyph |
87
- | `--border-width` | `.bb-badge` | `0px` | Pill border. The `border` shorthand is always present, so the width is what turns it on — the filled variants leave it at 0 and the bordered ones (secondary/destructive/outline) step up to `--bb-border-w-sm`. Nothing compensates for it: the… |
87
+ | `--bw` | `.bb-badge` | `0px` | Pill border. The `border` shorthand is always present, so the width is what turns it on — the filled variants leave it at 0 and the bordered ones (secondary/destructive/outline) step up to `--bb-border-w-sm`. Nothing compensates for it: the… |
88
88
  | `--border-color` | `.bb-badge` | `transparent` | |
89
- | `--ring` | `.bb-badge` | `var(--bb-primary-ring)` | focus ring, per variant |
90
- | `--min-size-md` | `.bb-badge` | `16px` | The md value. Only the default --min-size below reads it; the size modifiers set --min-size directly. |
89
+ | `--ring-color` | `.bb-badge` | `var(--bb-primary-ring)` | focus ring colour, per variant |
90
+ | `--ring-size` | `.bb-badge` | `var(--bb-ring-size)` | focus ring width |
91
+ | `--min-size-md` | `.bb-badge` | `calc(var(--bb-control-h) - 16px)` | 16px at the default |
91
92
  | `--min-size` | `.bb-badge` | `var(--min-size-md)` | pill min height and min width |
92
93
  | `--elev` | `.bb-badge` | `var(--bb-elev-sm)` | Resting lift. Invisible while `--bb-elev` is its default transparent layer. A chip is small enough that a theme wanting a different lift here than on a button sets `--elev` on this class. |
93
94
  | `--r` | `.bb-badge` | `calc(var(--bb-radius) * 0.5)` | Pill corners; the body and trailing wrappers round their outer edges to match |
94
- | `--font-size` | `.bb-badge` | `10px` | label |
95
+ | `--fs` | `.bb-badge` | `calc(var(--bb-fs) - 4px)` | Label. Sizes are offsets from the density masters (--bb-fs, --bb-control-h), like BbButton's, so a denser theme scales the pill. |
95
96
  | `--icon-size` | `.bb-badge` | `12px` | leading/append icons (passed to BbIcon as --size) |
96
97
  | `--gap` | `.bb-badge` | `3px` | space between label, icons and the trailing side |
97
- | `--padding-inline` | `.bb-badge` | `6px` | base side padding; the modifiers below scale it per side |
98
+ | `--px` | `.bb-badge` | `6px` | base side padding; the modifiers below scale it per side |
98
99
  | `--clear-size` | `.bb-badge` | `12px` | clear button's glyph box (the circle painted on hover is 2px smaller) |
99
- | `--pad-left` | `.bb-badge` | `var(--padding-inline)` | Side-owned padding: the body and trailing wrappers carry the pill's inline padding (and its radius) so their hit areas run flush to the border. The modifiers below retune these vars instead of the pill's own padding. |
100
- | `--pad-right` | `.bb-badge` | `var(--padding-inline)` | |
100
+ | `--pad-left` | `.bb-badge` | `var(--px)` | Side-owned padding: the body and trailing wrappers carry the pill's inline padding (and its radius) so their hit areas run flush to the border. The modifiers below retune these vars instead of the pill's own padding. |
101
+ | `--pad-right` | `.bb-badge` | `var(--px)` | |
101
102
  | `--size` | `.bb-badge__icon` | `var(--icon-size)` | |
102
103
 
103
104
  ## Component tree
@@ -724,11 +724,11 @@ States are listed in precedence order: when two are on at once and their entries
724
724
  - `BbBaseButton` _(public — [contract](./BbBaseButton.md))_ — its own pt parts (`BbBaseButton`): `root` → `RouterComponent`, `root` → `a`, `root` → `component`; also mounts `RouterComponent`
725
725
  - `BbDropdown` _(public — [contract](./BbDropdown.md))_ — its own pt parts (`BbDropdown`): `panel` → `CommonPopover`, `root` → `CommonPopover`, `header` → `div.bb-dropdown__header`, `list` → `span.bb-dropdown__items-container`, `footer` → `div.bb-dropdown__footer`; documented CSS variables: `--menu-inset`; also mounts `CommonPopover`, `DropdownPipelineResolver`
726
726
  - `BbDropdownList` _(internal — not importable, reach it through `BbDropdown`)_ — also mounts `BbBaseButton`, `BbIcon`, `CommonPopover`, `BbDropdownList`
727
- - `BbBadge` _(public — [contract](./BbBadge.md))_ — its own pt parts (`BbBadge`): `spinner` → `BbSpinner`, `icon` → `BbIcon`, `clear` → `button.bb-badge__clear-button`; documented CSS variables: `--bg`, `--fg`, `--border-width`, `--ring`, `--min-size-md`, `--min-size`, `--elev`, `--r`, `--font-size`, `--icon-size`, `--gap`, `--padding-inline`, `--clear-size`, `--pad-left`; also mounts `BbIcon`, `BbSpinner`, `BadgeBodyContent`
727
+ - `BbBadge` _(public — [contract](./BbBadge.md))_ — its own pt parts (`BbBadge`): `spinner` → `BbSpinner`, `icon` → `BbIcon`, `clear` → `button.bb-badge__clear-button`; documented CSS variables: `--bg`, `--fg`, `--bw`, `--ring-color`, `--ring-size`, `--min-size-md`, `--min-size`, `--elev`, `--r`, `--fs`, `--icon-size`, `--gap`, `--px`, `--clear-size`, `--pad-left`; also mounts `BbIcon`, `BbSpinner`, `BadgeBodyContent`
728
728
  - `AdaptiveDropdown` _(internal — not importable, reach it through `BbDropdown`)_ — hands `BbOffCanvas` the pt map `{ header: 'header', footer: 'footer', panel: 'root', sheet: 'root' }` (ours → theirs); also mounts `BbSmoothHeight`, `BbDropdownList`
729
- - `BbOffCanvas` _(public — [contract](./BbOffCanvas.md))_ — its own pt parts (`BbOffCanvas`): `header` → `div.bb-offcanvas__header`, `title` → `span.bb-offcanvas__title`, `description` → `p.bb-offcanvas__description`, `close` → `CloseButton`, `content` → `div.bb-offcanvas__body`, `footer` → `div.bb-offcanvas__footer`; documented CSS variables: `--stack-x`, `--stack-fill`, `--stack-transition-duration`, `--px`, `--handle-w`, `--handle-h`, `--handle-bg`, `--close-size`
729
+ - `BbOffCanvas` _(public — [contract](./BbOffCanvas.md))_ — its own pt parts (`BbOffCanvas`): `header` → `div.bb-offcanvas__header`, `title` → `span.bb-offcanvas__title`, `description` → `p.bb-offcanvas__description`, `close` → `CloseButton`, `content` → `div.bb-offcanvas__body`, `footer` → `div.bb-offcanvas__footer`; documented CSS variables: `--stack-x`, `--stack-fill`, `--stack-transition-duration`, `--px`, `--handle-w`, `--handle-h`, `--handle-bg`, `--safe-top`, `--close-size`
730
730
  - `CloseButton` _(internal — not importable, reach it through `BbOffCanvas`)_ — documented CSS variables: `--size`, `--p`
731
- - `BbButton` _(public — [contract](./BbButton.md))_ — its own pt parts (`BbButton`): `root` → `BbBaseButton`, `spinner` → `BbSpinner`, `icon` → `BbIcon`, `text` → `span.bb-button__content`; documented CSS variables: `--h-xs`, `--h`, `--icon-size`, `--px`, `--fs`, `--r`, `--gap`, `--bg`, `--bg-hover`, `--bg-pressed`, `--fg`, `--border-color`, `--ring`, `--bw`, `--fg-hover`, `--border-hover`, `--fg-pressed`, `--border-pressed`, `--bg-disabled`, `--fg-disabled`, `--border-disabled`, `--opacity-disabled`, `--elev-tier`, `--elev`; also mounts `BbIcon`, `BbBaseButton`, `BbSpinner`
731
+ - `BbButton` _(public — [contract](./BbButton.md))_ — its own pt parts (`BbButton`): `root` → `BbBaseButton`, `spinner` → `BbSpinner`, `icon` → `BbIcon`, `text` → `span.bb-button__content`; documented CSS variables: `--h-xs`, `--h`, `--icon-size`, `--px`, `--fs`, `--r`, `--gap`, `--bg`, `--bg-hover`, `--bg-pressed`, `--fg`, `--border-color`, `--ring-color`, `--ring-size`, `--bw`, `--fg-hover`, `--border-hover`, `--fg-pressed`, `--border-pressed`, `--bg-disabled`, `--fg-disabled`, `--border-disabled`, `--opacity-disabled`, `--elev-tier`, `--elev`; also mounts `BbIcon`, `BbBaseButton`, `BbSpinner`
732
732
  - Also mounts `BbIcon`
733
733
 
734
734
  ## See Also