bitboss-ui 3.0.0-beta.64 → 3.0.0-beta.66

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 (540) hide show
  1. package/README.md +78 -16
  2. package/bin/bitboss-ui-mcp.mjs +8 -8
  3. package/bin/bitboss-ui.mjs +73 -12
  4. package/dist/ai/BbAccordion.md +4 -3
  5. package/dist/ai/BbAlert.md +1 -1
  6. package/dist/ai/BbBadge.md +1 -0
  7. package/dist/ai/BbBadgeButton.md +4 -3
  8. package/dist/ai/BbBaseButton.md +25 -20
  9. package/dist/ai/BbBaseCheckboxIcon.md +1 -0
  10. package/dist/ai/BbBaseRadioIcon.md +1 -0
  11. package/dist/ai/BbBaseSwitchIcon.md +1 -0
  12. package/dist/ai/BbBreadcrumbs.md +8 -0
  13. package/dist/ai/BbButton.md +67 -21
  14. package/dist/ai/BbCalendar.md +56 -3
  15. package/dist/ai/BbCheckbox.md +1 -1
  16. package/dist/ai/BbCheckboxGroup.md +44 -8
  17. package/dist/ai/BbColorInput.md +3 -2
  18. package/dist/ai/BbColorPalette.md +7 -3
  19. package/dist/ai/BbConfirm.md +36 -80
  20. package/dist/ai/BbConfirmPortal.md +1 -1
  21. package/dist/ai/BbDatePicker.md +41 -5
  22. package/dist/ai/BbDatePickerInput.md +38 -6
  23. package/dist/ai/BbDialog.md +63 -58
  24. package/dist/ai/BbDropdown.md +25 -24
  25. package/dist/ai/BbDropdownButton.md +5 -12
  26. package/dist/ai/BbDropzone.md +2 -3
  27. package/dist/ai/BbForm.md +66 -42
  28. package/dist/ai/BbHost.md +29 -41
  29. package/dist/ai/BbIcon.md +3 -0
  30. package/dist/ai/BbNumberInput.md +2 -2
  31. package/dist/ai/BbOffCanvas.md +16 -9
  32. package/dist/ai/BbPagination.md +17 -17
  33. package/dist/ai/BbPopover.md +8 -3
  34. package/dist/ai/BbPtScope.md +5 -5
  35. package/dist/ai/BbRadio.md +1 -1
  36. package/dist/ai/BbRadioGroup.md +44 -7
  37. package/dist/ai/BbRating.md +1 -0
  38. package/dist/ai/BbSelect.md +146 -21
  39. package/dist/ai/BbSelectPopover.md +16 -12
  40. package/dist/ai/BbSlider.md +5 -3
  41. package/dist/ai/BbSwitch.md +1 -1
  42. package/dist/ai/BbTable.md +51 -39
  43. package/dist/ai/BbTabs.md +127 -63
  44. package/dist/ai/BbTabsList.md +4 -2
  45. package/dist/ai/BbTabsPanels.md +3 -1
  46. package/dist/ai/BbTabsRoot.md +4 -4
  47. package/dist/ai/BbTag.md +2 -2
  48. package/dist/ai/BbTextInput.md +23 -9
  49. package/dist/ai/BbTextarea.md +3 -3
  50. package/dist/ai/BbTimePicker.md +5 -4
  51. package/dist/ai/BbTimePickerInput.md +3 -3
  52. package/dist/ai/BbToast.md +33 -87
  53. package/dist/ai/BbToastPortal.md +1 -1
  54. package/dist/ai/CommonFieldInput.md +2 -1
  55. package/dist/ai/FlatListBox.md +1 -1
  56. package/dist/ai/GroupedListBox.md +1 -1
  57. package/dist/ai/ListBox.md +1 -1
  58. package/dist/ai/OptionsContainer.md +1 -1
  59. package/dist/ai/changelog.json +444 -4
  60. package/dist/ai/components.json +87 -83
  61. package/dist/ai/composables/useBbConfig.md +8 -1
  62. package/dist/ai/composables/{useBbDialogContext.md → useBbDialog.md} +18 -18
  63. package/dist/ai/composables/{useBbDropdownContext.md → useBbDropdown.md} +31 -31
  64. package/dist/ai/composables/{useBbFormContext.md → useBbForm.md} +11 -11
  65. package/dist/ai/composables/useBbFormField.md +2 -2
  66. package/dist/ai/composables/{useBbOffCanvasContext.md → useBbOffCanvas.md} +13 -13
  67. package/dist/ai/composables/{useBbTableContext.md → useBbTable.md} +20 -20
  68. package/dist/ai/composables/{useBbTabsContext.md → useBbTabs.md} +12 -12
  69. package/dist/ai/composables/useConfirm.md +42 -54
  70. package/dist/ai/composables/useToast.md +9 -26
  71. package/dist/ai/guides/agent-contract.md +57 -43
  72. package/dist/ai/guides/ai-router.md +1 -1
  73. package/dist/ai/guides/app-layout.md +32 -23
  74. package/dist/ai/guides/coherence-playbook.md +4 -2
  75. package/dist/ai/guides/component-picker.md +35 -32
  76. package/dist/ai/guides/design-language.md +26 -12
  77. package/dist/ai/guides/design-tokens.md +73 -32
  78. package/dist/ai/guides/eslint-rules.md +8 -4
  79. package/dist/ai/guides/fetch-items-playbook.md +3 -3
  80. package/dist/ai/guides/floating-bottom-panel.md +1 -1
  81. package/dist/ai/guides/inertia-helpers.md +1640 -337
  82. package/dist/ai/guides/installation-and-plugin-setup.md +6 -3
  83. package/dist/ai/guides/migration/adoption-checklist.md +44 -2
  84. package/dist/ai/guides/migration/components/bb-dialog.md +13 -13
  85. package/dist/ai/guides/migration/components/bb-dropdown.md +16 -16
  86. package/dist/ai/guides/migration/components/bb-host.md +15 -14
  87. package/dist/ai/guides/migration/components/bb-offcanvas.md +10 -10
  88. package/dist/ai/guides/migration/components/bb-pagination.md +9 -9
  89. package/dist/ai/guides/migration/components/bb-select.md +1 -1
  90. package/dist/ai/guides/migration/components/bb-table.md +12 -12
  91. package/dist/ai/guides/migration/components/bb-tabs.md +1 -1
  92. package/dist/ai/guides/migration/from-async-validator.md +9 -9
  93. package/dist/ai/guides/migration/v2-to-v3.md +206 -13
  94. package/dist/ai/guides/options-items-playbook.md +2 -2
  95. package/dist/ai/guides/page-shell.md +15 -3
  96. package/dist/ai/guides/passthrough.md +13 -7
  97. package/dist/ai/guides/preset-components.md +102 -43
  98. package/dist/ai/guides/typescript-generic-components.md +21 -5
  99. package/dist/ai/guides/validated-forms.md +20 -11
  100. package/dist/ai/guides/validation-providers.md +3 -3
  101. package/dist/ai/helpers/definePreset.json +11 -4
  102. package/dist/ai/helpers/definePreset.ts +98 -41
  103. package/dist/ai/helpers/inertia/manifest.json +332 -91
  104. package/dist/ai/helpers/inertia/messages.ts +33 -0
  105. package/dist/ai/helpers/inertia/useConfirmOnRouteLeave.ts +133 -21
  106. package/dist/ai/helpers/inertia/useHasChanged.ts +34 -16
  107. package/dist/ai/helpers/inertia/useLazyProp.ts +102 -36
  108. package/dist/ai/helpers/inertia/useLazyPropGetter.ts +3 -1
  109. package/dist/ai/helpers/inertia/usePaginatedResponseContext.ts +129 -24
  110. package/dist/ai/helpers/inertia/usePromiseForm.ts +38 -44
  111. package/dist/ai/helpers/inertia/usePromiseRouter.ts +295 -0
  112. package/dist/ai/helpers/inertia/useQuery.ts +133 -11
  113. package/dist/ai/helpers/inertia/useQueryObject.ts +104 -66
  114. package/dist/ai/helpers/inertia/useResourceContext.ts +60 -14
  115. package/dist/ai/helpers/inertia/useRouteQuery.ts +57 -33
  116. package/dist/ai/helpers/inertia/useScreenSizes.ts +9 -7
  117. package/dist/ai/helpers/inertia/useTableContext.ts +5 -2
  118. package/dist/ai/helpers/inertia/utils.ts +57 -0
  119. package/dist/ai/index.md +15 -15
  120. package/dist/ai/manifest/common.json +2 -1
  121. package/dist/ai/manifest/components/BbAccordion.tree.json +3 -1
  122. package/dist/ai/manifest/components/BbAlert.json +1 -1
  123. package/dist/ai/manifest/components/BbBadge.tree.json +3 -1
  124. package/dist/ai/manifest/components/BbBadgeButton.json +9 -4
  125. package/dist/ai/manifest/components/BbBadgeButton.tree.json +1 -0
  126. package/dist/ai/manifest/components/BbBaseButton.json +9 -4
  127. package/dist/ai/manifest/components/BbBaseCheckboxIcon.tree.json +3 -1
  128. package/dist/ai/manifest/components/BbBaseRadioIcon.tree.json +3 -1
  129. package/dist/ai/manifest/components/BbBaseSwitchIcon.tree.json +3 -1
  130. package/dist/ai/manifest/components/BbBreadcrumbs.tree.json +7 -3
  131. package/dist/ai/manifest/components/BbButton.json +9 -4
  132. package/dist/ai/manifest/components/BbButton.tree.json +5 -3
  133. package/dist/ai/manifest/components/BbCalendar.json +4 -3
  134. package/dist/ai/manifest/components/BbCalendar.tree.json +10 -1
  135. package/dist/ai/manifest/components/BbCheckbox.json +1 -1
  136. package/dist/ai/manifest/components/BbCheckbox.tree.json +1 -1
  137. package/dist/ai/manifest/components/BbCheckboxGroup.json +1 -1
  138. package/dist/ai/manifest/components/BbCheckboxGroup.tree.json +62 -3
  139. package/dist/ai/manifest/components/BbCollapsible.json +4 -1
  140. package/dist/ai/manifest/components/BbColorInput.json +1 -1
  141. package/dist/ai/manifest/components/BbColorInput.tree.json +5 -3
  142. package/dist/ai/manifest/components/BbColorPalette.json +3 -0
  143. package/dist/ai/manifest/components/BbColorPalette.tree.json +7 -2
  144. package/dist/ai/manifest/components/BbConfirm.tree.json +2 -2
  145. package/dist/ai/manifest/components/BbDatePicker.json +7 -3
  146. package/dist/ai/manifest/components/BbDatePicker.tree.json +3 -4
  147. package/dist/ai/manifest/components/BbDatePickerInput.json +4 -3
  148. package/dist/ai/manifest/components/BbDatePickerInput.tree.json +5 -3
  149. package/dist/ai/manifest/components/BbDialog.json +1 -1
  150. package/dist/ai/manifest/components/BbDialog.tree.json +2 -2
  151. package/dist/ai/manifest/components/BbDropdown.json +3 -3
  152. package/dist/ai/manifest/components/BbDropdown.tree.json +2 -2
  153. package/dist/ai/manifest/components/BbDropdownButton.json +11 -6
  154. package/dist/ai/manifest/components/BbDropdownButton.tree.json +2 -3
  155. package/dist/ai/manifest/components/BbDropzone.json +4 -1
  156. package/dist/ai/manifest/components/BbForm.json +2 -2
  157. package/dist/ai/manifest/components/BbHost.json +1 -1
  158. package/dist/ai/manifest/components/BbHost.tree.json +1 -1
  159. package/dist/ai/manifest/components/BbHoverCard.json +1 -1
  160. package/dist/ai/manifest/components/BbNumberInput.json +1 -1
  161. package/dist/ai/manifest/components/BbNumberInput.tree.json +1 -1
  162. package/dist/ai/manifest/components/BbOffCanvas.json +1 -1
  163. package/dist/ai/manifest/components/BbOffCanvas.tree.json +3 -1
  164. package/dist/ai/manifest/components/BbPagination.json +4 -4
  165. package/dist/ai/manifest/components/BbPagination.tree.json +2 -1
  166. package/dist/ai/manifest/components/BbPopover.json +1 -1
  167. package/dist/ai/manifest/components/BbPopover.tree.json +1 -1
  168. package/dist/ai/manifest/components/BbProgress.json +4 -1
  169. package/dist/ai/manifest/components/BbRadio.json +1 -1
  170. package/dist/ai/manifest/components/BbRadio.tree.json +1 -1
  171. package/dist/ai/manifest/components/BbRadioGroup.json +5 -5
  172. package/dist/ai/manifest/components/BbRadioGroup.tree.json +62 -3
  173. package/dist/ai/manifest/components/BbRating.tree.json +3 -1
  174. package/dist/ai/manifest/components/BbSelect.json +5 -5
  175. package/dist/ai/manifest/components/BbSelect.tree.json +3 -3
  176. package/dist/ai/manifest/components/BbSelectPopover.json +7 -3
  177. package/dist/ai/manifest/components/BbSelectPopover.tree.json +2 -2
  178. package/dist/ai/manifest/components/BbSlider.json +3 -3
  179. package/dist/ai/manifest/components/BbSlider.tree.json +3 -0
  180. package/dist/ai/manifest/components/BbSmoothHeight.json +4 -1
  181. package/dist/ai/manifest/components/BbSwitch.json +1 -1
  182. package/dist/ai/manifest/components/BbSwitch.tree.json +1 -1
  183. package/dist/ai/manifest/components/BbSwitchGroup.tree.json +1 -1
  184. package/dist/ai/manifest/components/BbTable.json +6 -2
  185. package/dist/ai/manifest/components/BbTable.tree.json +4 -1
  186. package/dist/ai/manifest/components/BbTabs.json +9 -12
  187. package/dist/ai/manifest/components/BbTabs.tree.json +4 -1
  188. package/dist/ai/manifest/components/BbTabsList.json +4 -7
  189. package/dist/ai/manifest/components/BbTabsList.tree.json +4 -1
  190. package/dist/ai/manifest/components/BbTabsPanels.json +1 -1
  191. package/dist/ai/manifest/components/BbTabsPanels.tree.json +4 -1
  192. package/dist/ai/manifest/components/BbTabsRoot.json +5 -5
  193. package/dist/ai/manifest/components/BbTag.json +1 -1
  194. package/dist/ai/manifest/components/BbTag.tree.json +2 -2
  195. package/dist/ai/manifest/components/BbTextInput.json +4 -4
  196. package/dist/ai/manifest/components/BbTextInput.tree.json +1 -1
  197. package/dist/ai/manifest/components/BbTextarea.json +2 -2
  198. package/dist/ai/manifest/components/BbTextarea.tree.json +1 -1
  199. package/dist/ai/manifest/components/BbTimePicker.json +4 -1
  200. package/dist/ai/manifest/components/BbTimePicker.tree.json +5 -3
  201. package/dist/ai/manifest/components/BbTimePickerInput.json +2 -2
  202. package/dist/ai/manifest/components/BbTimePickerInput.tree.json +5 -3
  203. package/dist/ai/manifest/components/BbToast.json +1 -1
  204. package/dist/ai/manifest/components/BbToast.tree.json +3 -1
  205. package/dist/ai/manifest/components/BbTooltip.json +3 -0
  206. package/dist/ai/manifest/components/ChipsBox.tree.json +1 -1
  207. package/dist/ai/manifest/components/CommonField.tree.json +1 -0
  208. package/dist/ai/manifest/components/CommonFieldInput.tree.json +4 -2
  209. package/dist/ai/manifest/components/CommonTimeSelector.tree.json +1 -0
  210. package/dist/ai/manifest/components/FlatListBox.json +1 -1
  211. package/dist/ai/manifest/components/GroupedListBox.json +1 -1
  212. package/dist/ai/manifest/components/ListBox.json +1 -1
  213. package/dist/ai/manifest/components/OptionsContainer.json +2 -2
  214. package/dist/ai/manifest/index.json +3 -3
  215. package/dist/ai/manifest/meta.json +31 -16
  216. package/dist/ai/manifest/types.advanced.json +15 -11
  217. package/dist/ai/manifest/types.api.json +2 -2
  218. package/dist/ai/recipes/inertia/approvals-inbox.md +87 -116
  219. package/dist/ai/recipes/inertia/inline-edit-workspace.md +113 -121
  220. package/dist/ai/recipes/inertia/layout-scaffold.md +15 -4
  221. package/dist/ai/recipes/inertia/onboarding.md +76 -58
  222. package/dist/ai/recipes/inertia/ownership-atlas.md +75 -106
  223. package/dist/ai/recipes/inertia/record-form.md +18 -7
  224. package/dist/ai/recipes/inertia/records-workspace.md +107 -128
  225. package/dist/ai/recipes/inertia/settings-workspace.md +131 -73
  226. package/dist/ai/recipes/inertia/upload-center.md +98 -122
  227. package/dist/ai/recipes/inertia/wizard-form.md +25 -15
  228. package/dist/ai/recipes/nuxt/approvals-inbox.md +67 -48
  229. package/dist/ai/recipes/nuxt/inline-edit-workspace.md +73 -58
  230. package/dist/ai/recipes/nuxt/layout-scaffold.md +15 -4
  231. package/dist/ai/recipes/nuxt/onboarding.md +27 -10
  232. package/dist/ai/recipes/nuxt/ownership-atlas.md +40 -22
  233. package/dist/ai/recipes/nuxt/record-form.md +20 -7
  234. package/dist/ai/recipes/nuxt/records-workspace.md +120 -96
  235. package/dist/ai/recipes/nuxt/settings-workspace.md +36 -23
  236. package/dist/ai/recipes/nuxt/upload-center.md +63 -37
  237. package/dist/ai/recipes/nuxt/wizard-form.md +28 -16
  238. package/dist/ai/recipes/vue/approvals-inbox.md +74 -46
  239. package/dist/ai/recipes/vue/inline-edit-workspace.md +83 -56
  240. package/dist/ai/recipes/vue/layout-scaffold.md +15 -4
  241. package/dist/ai/recipes/vue/onboarding.md +27 -10
  242. package/dist/ai/recipes/vue/ownership-atlas.md +40 -22
  243. package/dist/ai/recipes/vue/record-form.md +20 -7
  244. package/dist/ai/recipes/vue/records-workspace.md +132 -95
  245. package/dist/ai/recipes/vue/settings-workspace.md +36 -23
  246. package/dist/ai/recipes/vue/upload-center.md +73 -37
  247. package/dist/ai/recipes/vue/wizard-form.md +28 -16
  248. package/dist/ai/source/BbAccordion.md +36 -6
  249. package/dist/ai/source/BbAlert.md +11 -5
  250. package/dist/ai/source/BbAsterisk.md +4 -1
  251. package/dist/ai/source/BbAvatar.md +11 -5
  252. package/dist/ai/source/BbBadge.md +42 -11
  253. package/dist/ai/source/BbBadgeButton.md +41 -8
  254. package/dist/ai/source/BbBaseButton.md +57 -15
  255. package/dist/ai/source/BbBaseCheckboxIcon.md +37 -13
  256. package/dist/ai/source/BbBaseRadioIcon.md +32 -9
  257. package/dist/ai/source/BbBaseSwitchIcon.md +31 -7
  258. package/dist/ai/source/BbBreadcrumbs.md +32 -9
  259. package/dist/ai/source/BbButton.md +91 -27
  260. package/dist/ai/source/BbCalendar.md +571 -300
  261. package/dist/ai/source/BbCheckbox.md +18 -7
  262. package/dist/ai/source/BbCheckboxGroup.md +16 -5
  263. package/dist/ai/source/BbCollapsible.md +15 -6
  264. package/dist/ai/source/BbColorInput.md +68 -20
  265. package/dist/ai/source/BbColorPalette.md +107 -23
  266. package/dist/ai/source/BbConfirmPortal.md +1 -1
  267. package/dist/ai/source/BbDatePicker.md +106 -25
  268. package/dist/ai/source/BbDatePickerInput.md +105 -42
  269. package/dist/ai/source/BbDialog.md +60 -44
  270. package/dist/ai/source/BbDropdown.md +44 -32
  271. package/dist/ai/source/BbDropdownButton.md +26 -20
  272. package/dist/ai/source/BbDropdownGroup.md +5 -5
  273. package/dist/ai/source/BbDropzone.md +53 -16
  274. package/dist/ai/source/BbForm.md +18 -7
  275. package/dist/ai/source/BbHost.md +25 -12
  276. package/dist/ai/source/BbHoverCard.md +20 -9
  277. package/dist/ai/source/BbIcon.md +9 -3
  278. package/dist/ai/source/BbIndicator.md +11 -4
  279. package/dist/ai/source/BbNumberInput.md +23 -6
  280. package/dist/ai/source/BbOffCanvas.md +73 -32
  281. package/dist/ai/source/BbPagination.md +59 -31
  282. package/dist/ai/source/BbPopover.md +28 -16
  283. package/dist/ai/source/BbProgress.md +13 -5
  284. package/dist/ai/source/BbRadio.md +16 -9
  285. package/dist/ai/source/BbRadioGroup.md +15 -4
  286. package/dist/ai/source/BbRating.md +51 -10
  287. package/dist/ai/source/BbSelect.md +56 -27
  288. package/dist/ai/source/BbSelectPopover.md +106 -36
  289. package/dist/ai/source/BbSlider.md +111 -33
  290. package/dist/ai/source/BbSmoothHeight.md +16 -7
  291. package/dist/ai/source/BbSpinner.md +9 -3
  292. package/dist/ai/source/BbSwitch.md +16 -9
  293. package/dist/ai/source/BbSwitchGroup.md +18 -7
  294. package/dist/ai/source/BbTable.md +172 -38
  295. package/dist/ai/source/BbTabs.md +58 -40
  296. package/dist/ai/source/BbTabsList.md +109 -50
  297. package/dist/ai/source/BbTabsPanels.md +65 -31
  298. package/dist/ai/source/BbTabsRoot.md +35 -24
  299. package/dist/ai/source/BbTag.md +18 -4
  300. package/dist/ai/source/BbTextInput.md +20 -3
  301. package/dist/ai/source/BbTextarea.md +15 -1
  302. package/dist/ai/source/BbTimePicker.md +81 -21
  303. package/dist/ai/source/BbTimePickerInput.md +63 -15
  304. package/dist/ai/source/BbToast.md +20 -3
  305. package/dist/ai/source/BbToastPortal.md +21 -4
  306. package/dist/ai/source/BbTooltip.md +16 -8
  307. package/dist/ai/source/BbTree.md +10 -3
  308. package/dist/ai/source/ClearableButton.md +5 -1
  309. package/dist/ai/source/CommonField.md +65 -9
  310. package/dist/ai/source/CommonFieldInput.md +61 -27
  311. package/dist/ai/source/CommonPopover.md +17 -6
  312. package/dist/ai/source/CommonTimeSelector.md +21 -2
  313. package/dist/ai/source/ErrorIcon.md +4 -0
  314. package/dist/ai/source/ListBox.md +9 -1
  315. package/dist/ai/source/OptionsContainer.md +5 -1
  316. package/dist/ai/source/WarningIcon.md +4 -0
  317. package/dist/components/BbAccordion/BbAccordion.vue.d.ts +2 -1
  318. package/dist/components/BbAccordion/BbAccordion.vue_vue_type_script_setup_true_lang.js +6 -6
  319. package/dist/components/BbAlert/BbAlert.vue.d.ts +2 -1
  320. package/dist/components/BbAlert/BbAlert.vue_vue_type_script_setup_true_lang.js +10 -10
  321. package/dist/components/BbAsterisk/BbAsterisk.vue.d.ts +3 -1
  322. package/dist/components/BbAvatar/BbAvatar.vue.d.ts +3 -1
  323. package/dist/components/BbAvatar/BbAvatar.vue_vue_type_script_setup_true_lang.js +7 -7
  324. package/dist/components/BbBadge/BbBadge.vue.d.ts +5 -3
  325. package/dist/components/BbBadge/BbBadge.vue_vue_type_script_setup_true_lang.js +7 -7
  326. package/dist/components/BbBadge/BbBadgeButton.vue.d.ts +3 -1
  327. package/dist/components/BbBadge/BbBadgeButton.vue_vue_type_script_setup_true_lang.js +7 -7
  328. package/dist/components/BbBaseButton/BbBaseButton.vue.d.ts +3 -1
  329. package/dist/components/BbBaseButton/BbBaseButton.vue_vue_type_script_setup_true_lang.js +85 -85
  330. package/dist/components/BbBaseButton/types.d.ts +8 -5
  331. package/dist/components/BbBaseButton/useLinkState.d.ts +2 -0
  332. package/dist/components/BbBaseButton/useLinkState.js +21 -20
  333. package/dist/components/BbBaseCheckboxIcon/BbBaseCheckboxIcon.vue.d.ts +3 -1
  334. package/dist/components/BbBaseRadioIcon/BbBaseRadioIcon.vue.d.ts +3 -1
  335. package/dist/components/BbBaseSwitchIcon/BbBaseSwitchIcon.vue.d.ts +3 -1
  336. package/dist/components/BbBreadcrumbs/BbBreadcrumbs.vue.d.ts +3 -1
  337. package/dist/components/BbBreadcrumbs/BbBreadcrumbs.vue_vue_type_script_setup_true_lang.js +7 -7
  338. package/dist/components/BbButton/BbButton.vue.d.ts +2 -1
  339. package/dist/components/BbButton/BbButton.vue_vue_type_script_setup_true_lang.js +93 -93
  340. package/dist/components/BbButton/types.d.ts +7 -4
  341. package/dist/components/BbCalendar/BbCalendar.vue.d.ts +157 -30
  342. package/dist/components/BbCalendar/BbCalendar.vue_vue_type_script_setup_true_lang.js +364 -331
  343. package/dist/components/BbCalendar/CalendarMonthPanel.vue_vue_type_script_setup_true_lang.js +5 -5
  344. package/dist/components/BbCalendar/types.d.ts +36 -8
  345. package/dist/components/BbCalendar/useCalendarGrid.d.ts +133 -0
  346. package/dist/components/BbCalendar/useCalendarGrid.js +193 -183
  347. package/dist/components/BbCalendar/useDayGrid.d.ts +24 -19
  348. package/dist/components/BbCalendar/useDayGrid.js +105 -102
  349. package/dist/components/BbCheckbox/BbCheckbox.vue.d.ts +4 -2
  350. package/dist/components/BbCheckboxGroup/BbCheckboxGroup.vue.d.ts +327 -2
  351. package/dist/components/BbCollapsible/BbCollapsible.vue.d.ts +3 -1
  352. package/dist/components/BbCollapsible/BbCollapsible.vue_vue_type_script_setup_true_lang.js +6 -6
  353. package/dist/components/BbColorInput/BbColorInput.vue.d.ts +8 -5
  354. package/dist/components/BbColorInput/BbColorInput.vue_vue_type_script_setup_true_lang.js +5 -5
  355. package/dist/components/BbColorInput/types.d.ts +2 -0
  356. package/dist/components/BbColorPalette/BbColorPalette.vue.d.ts +7 -5
  357. package/dist/components/BbColorPalette/BbColorPalette.vue_vue_type_script_setup_true_lang.js +216 -215
  358. package/dist/components/BbConfirm/BbConfirm.vue_vue_type_script_setup_true_lang.js +25 -25
  359. package/dist/components/BbDatePicker/BbDatePicker.vue.d.ts +206 -41
  360. package/dist/components/BbDatePicker/BbDatePicker.vue_vue_type_script_setup_true_lang.js +112 -106
  361. package/dist/components/BbDatePicker/types.d.ts +27 -8
  362. package/dist/components/BbDatePickerInput/BbDatePickerInput.vue.d.ts +519 -37
  363. package/dist/components/BbDatePickerInput/BbDatePickerInput.vue_vue_type_script_setup_true_lang.js +11 -8
  364. package/dist/components/BbDatePickerInput/types.d.ts +31 -9
  365. package/dist/components/BbDialog/BbDialog.vue.d.ts +6 -5
  366. package/dist/components/BbDialog/BbDialog.vue_vue_type_script_setup_true_lang.js +231 -233
  367. package/dist/components/BbDialog/types.d.ts +7 -7
  368. package/dist/components/BbDialog/useDialogStack.d.ts +2 -0
  369. package/dist/components/BbDialog/useDialogStack.js +6 -2
  370. package/dist/components/BbDropdown/AdaptiveDropdown.vue_vue_type_script_setup_true_lang.js +25 -25
  371. package/dist/components/BbDropdown/BbDropdown.vue.d.ts +8 -6
  372. package/dist/components/BbDropdown/BbDropdown.vue_vue_type_script_setup_true_lang.js +226 -225
  373. package/dist/components/BbDropdown/BbDropdownList.vue_vue_type_script_setup_true_lang.js +49 -49
  374. package/dist/components/BbDropdown/DropdownPipelineResolver.vue_vue_type_script_setup_true_lang.js +7 -7
  375. package/dist/components/BbDropdown/normalizeGroups.js +14 -14
  376. package/dist/components/BbDropdown/types.d.ts +5 -5
  377. package/dist/components/BbDropdown/useDropdownContext.js +1 -1
  378. package/dist/components/BbDropdown/useDropdownGroupRegistry.d.ts +1 -1
  379. package/dist/components/BbDropdownButton/BbDropdownButton.vue.d.ts +6 -4
  380. package/dist/components/BbDropdownButton/BbDropdownButton.vue_vue_type_script_setup_true_lang.js +36 -38
  381. package/dist/components/BbDropdownButton/types.js +4 -4
  382. package/dist/components/BbDropzone/BbDropzone.vue.d.ts +57 -22
  383. package/dist/components/BbDropzone/BbDropzone.vue_vue_type_script_setup_true_lang.js +4 -4
  384. package/dist/components/BbDropzone/types.d.ts +16 -4
  385. package/dist/components/BbForm/BbForm.vue.d.ts +52 -4
  386. package/dist/components/BbForm/BbForm.vue_vue_type_script_setup_true_lang.js +1 -1
  387. package/dist/components/BbHost/BbHost.vue_vue_type_script_setup_true_lang.js +19 -23
  388. package/dist/components/BbHost/BbHostOpening.js +1 -1
  389. package/dist/components/BbHoverCard/BbHoverCard.vue.d.ts +5 -4
  390. package/dist/components/BbHoverCard/BbHoverCard.vue_vue_type_script_setup_true_lang.js +116 -116
  391. package/dist/components/BbIcon/BbIcon.vue.d.ts +3 -1
  392. package/dist/components/BbIcon/BbIcon.vue_vue_type_script_setup_true_lang.js +7 -7
  393. package/dist/components/BbIndicator/BbIndicator.vue.d.ts +3 -1
  394. package/dist/components/BbNumberInput/BbNumberInput.vue.d.ts +6 -3
  395. package/dist/components/BbNumberInput/types.d.ts +2 -0
  396. package/dist/components/BbOffCanvas/BbOffCanvas.vue.d.ts +5 -4
  397. package/dist/components/BbOffCanvas/BbOffCanvas.vue_vue_type_script_setup_true_lang.js +366 -369
  398. package/dist/components/BbOffCanvas/sheetAttrs.d.ts +9 -0
  399. package/dist/components/BbOffCanvas/sheetAttrs.js +10 -0
  400. package/dist/components/BbOffCanvas/types.d.ts +7 -7
  401. package/dist/components/BbOffCanvas/useOffCanvasStack.d.ts +2 -0
  402. package/dist/components/BbOffCanvas/useOffCanvasStack.js +7 -3
  403. package/dist/components/BbPagination/BbPagination.vue.d.ts +2 -1
  404. package/dist/components/BbPagination/BbPagination.vue_vue_type_script_setup_true_lang.js +8 -8
  405. package/dist/components/BbPagination/types.d.ts +5 -5
  406. package/dist/components/BbPopover/BbPopover.vue.d.ts +5 -4
  407. package/dist/components/BbPopover/BbPopover.vue_vue_type_script_setup_true_lang.js +92 -91
  408. package/dist/components/BbProgress/BbProgress.vue.d.ts +6 -1
  409. package/dist/components/BbRadio/BbRadio.vue.d.ts +4 -2
  410. package/dist/components/BbRadioGroup/BbRadioGroup.vue.d.ts +281 -1
  411. package/dist/components/BbRating/BbRating.vue.d.ts +4 -2
  412. package/dist/components/BbRating/BbRating.vue_vue_type_script_setup_true_lang.js +7 -7
  413. package/dist/components/BbSelect/BbSelect.vue.d.ts +575 -4
  414. package/dist/components/BbSelect/BbSelect.vue_vue_type_script_setup_true_lang.js +7 -7
  415. package/dist/components/BbSelect/types.d.ts +12 -2
  416. package/dist/components/BbSelectPopover/BbSelectPopover.vue.d.ts +105 -3
  417. package/dist/components/BbSelectPopover/BbSelectPopover.vue_vue_type_script_setup_true_lang.js +695 -680
  418. package/dist/components/BbSelectPopover/types.d.ts +9 -1
  419. package/dist/components/BbSlider/BbSlider.vue.d.ts +135 -33
  420. package/dist/components/BbSlider/BbSlider.vue_vue_type_script_setup_true_lang.js +5 -5
  421. package/dist/components/BbSlider/types.d.ts +19 -4
  422. package/dist/components/BbSmoothHeight/BbSmoothHeight.vue.d.ts +3 -1
  423. package/dist/components/BbSpinner/BbSpinner.vue.d.ts +3 -1
  424. package/dist/components/BbSwitch/BbSwitch.vue.d.ts +4 -2
  425. package/dist/components/BbSwitchGroup/BbSwitchGroup.vue.d.ts +131 -1
  426. package/dist/components/BbTable/BbTable.vue.d.ts +5 -2
  427. package/dist/components/BbTable/BbTable.vue_vue_type_script_setup_true_lang.js +593 -578
  428. package/dist/components/BbTable/types.d.ts +14 -1
  429. package/dist/components/BbTable/utils.d.ts +2 -1
  430. package/dist/components/BbTable/utils.js +37 -38
  431. package/dist/components/BbTabs/BbTabs.vue.d.ts +96 -2
  432. package/dist/components/BbTabs/BbTabs.vue_vue_type_script_setup_true_lang.js +8 -6
  433. package/dist/components/BbTabs/BbTabsList.vue.d.ts +11 -1
  434. package/dist/components/BbTabs/BbTabsList.vue_vue_type_script_setup_true_lang.js +102 -92
  435. package/dist/components/BbTabs/BbTabsPanels.vue.d.ts +9 -1
  436. package/dist/components/BbTabs/BbTabsPanels.vue_vue_type_script_setup_true_lang.js +20 -17
  437. package/dist/components/BbTabs/BbTabsRoot.vue_vue_type_script_setup_true_lang.js +1 -1
  438. package/dist/components/BbTabs/types.d.ts +34 -23
  439. package/dist/components/BbTag/BbTag.vue.d.ts +5 -2
  440. package/dist/components/BbTag/types.d.ts +2 -0
  441. package/dist/components/BbTextInput/BbTextInput.vue.d.ts +195 -2
  442. package/dist/components/BbTextInput/BbTextInput.vue_vue_type_script_setup_true_lang.js +5 -5
  443. package/dist/components/BbTextInput/types.d.ts +2 -0
  444. package/dist/components/BbTextarea/BbTextarea.vue.d.ts +193 -2
  445. package/dist/components/BbTextarea/types.d.ts +2 -0
  446. package/dist/components/BbTimePicker/BbTimePicker.vue.d.ts +78 -38
  447. package/dist/components/BbTimePicker/BbTimePicker.vue_vue_type_script_setup_true_lang.js +138 -137
  448. package/dist/components/BbTimePicker/types.d.ts +18 -4
  449. package/dist/components/BbTimePickerInput/BbTimePickerInput.vue.d.ts +272 -33
  450. package/dist/components/BbTimePickerInput/BbTimePickerInput.vue_vue_type_script_setup_true_lang.js +16 -16
  451. package/dist/components/BbTimePickerInput/types.d.ts +20 -5
  452. package/dist/components/BbToast/BbToastMessage.vue_vue_type_script_setup_true_lang.js +6 -6
  453. package/dist/components/BbToast/BbToastRegion.vue_vue_type_script_setup_true_lang.js +20 -20
  454. package/dist/components/BbTooltip/BbTooltip.vue.d.ts +3 -2
  455. package/dist/components/BbTooltip/BbTooltip.vue_vue_type_script_setup_true_lang.js +109 -109
  456. package/dist/components/BbTree/BbTree.vue.d.ts +1 -1
  457. package/dist/components/ClearableButton/ClearableButton.vue.d.ts +3 -1
  458. package/dist/components/CloseIcon/CloseButton.vue.d.ts +3 -1
  459. package/dist/components/CloseIcon/CloseButton.vue.js +1 -1
  460. package/dist/components/CommonField/CommonField.vue.d.ts +3 -1
  461. package/dist/components/CommonFieldInput/CommonFieldInput.vue.d.ts +5 -3
  462. package/dist/components/CommonPopover/CommonPopover.vue.d.ts +5 -4
  463. package/dist/components/CommonPopover/CommonPopover.vue_vue_type_script_setup_true_lang.js +55 -55
  464. package/dist/components/ErrorIcon/ErrorIcon.vue.d.ts +3 -1
  465. package/dist/components/FlatListBox/FlatListBox.vue_vue_type_script_setup_true_lang.js +124 -124
  466. package/dist/components/GroupedListBox/GroupedListBox.vue_vue_type_script_setup_true_lang.js +71 -71
  467. package/dist/components/ListBox/ListBox.vue.d.ts +1 -1
  468. package/dist/components/OptionsContainer/OptionsContainer.vue.d.ts +1 -1
  469. package/dist/components/OptionsContainer/OptionsContainer.vue_vue_type_script_setup_true_lang.js +4 -4
  470. package/dist/components/Transitions/Slide.vue.d.ts +1 -1
  471. package/dist/components/WarningIcon/WarningIcon.vue.d.ts +3 -1
  472. package/dist/composables/autoHost.d.ts +22 -0
  473. package/dist/composables/autoHost.js +20 -0
  474. package/dist/composables/hostOpenings.d.ts +3 -3
  475. package/dist/composables/hostOpenings.js +1 -1
  476. package/dist/composables/hostRegistry.d.ts +10 -2
  477. package/dist/composables/hostRegistry.js +5 -3
  478. package/dist/composables/overlayRegistry.d.ts +1 -1
  479. package/dist/composables/overlayRegistry.js +2 -2
  480. package/dist/composables/useBbConfig.d.ts +1 -0
  481. package/dist/composables/useBbConfig.js +11 -7
  482. package/dist/composables/{useBbDialogContext.d.ts → useBbDialog.d.ts} +9 -9
  483. package/dist/composables/{useBbDialogContext.js → useBbDialog.js} +4 -4
  484. package/dist/composables/{useBbDropdownContext.d.ts → useBbDropdown.d.ts} +14 -14
  485. package/dist/composables/{useBbDropdownContext.js → useBbDropdown.js} +2 -2
  486. package/dist/composables/{useBbFormContext.d.ts → useBbForm.d.ts} +8 -8
  487. package/dist/composables/{useBbFormContext.js → useBbForm.js} +3 -3
  488. package/dist/composables/useBbOffCanvas.d.ts +23 -0
  489. package/dist/composables/{useBbOffCanvasContext.js → useBbOffCanvas.js} +3 -3
  490. package/dist/composables/{useBbTableContext.d.ts → useBbTable.d.ts} +29 -29
  491. package/dist/composables/{useBbTableContext.js → useBbTable.js} +2 -2
  492. package/dist/composables/{useBbTabsContext.d.ts → useBbTabs.d.ts} +19 -3
  493. package/dist/composables/useBbTabs.js +266 -0
  494. package/dist/composables/useConfirm.d.ts +6 -7
  495. package/dist/composables/useConfirm.js +1 -1
  496. package/dist/composables/useOnDemandOpener.d.ts +4 -4
  497. package/dist/composables/useOnDemandOpener.js +1 -1
  498. package/dist/composables/useToast.d.ts +4 -5
  499. package/dist/composables/useToast.js +1 -1
  500. package/dist/directives/bbDialog.d.ts +1 -1
  501. package/dist/directives/bbDropdown.js +3 -3
  502. package/dist/directives/bbOffCanvas.d.ts +1 -1
  503. package/dist/directives/overlayTrigger.js +18 -18
  504. package/dist/index.d.ts +15 -15
  505. package/dist/index.js +55 -55
  506. package/dist/llms-full.txt +5397 -2894
  507. package/dist/llms-medium.txt +127 -93
  508. package/dist/llms.txt +12 -12
  509. package/dist/nuxt-auto-imports.js +6 -6
  510. package/dist/nuxt.js +1 -1
  511. package/dist/plugin.js +30 -28
  512. package/dist/runtime/nuxt-plugin.js +30 -28
  513. package/dist/styles.css +2 -2
  514. package/dist/types/ShapeErased.d.ts +15 -0
  515. package/dist/types/fallthrough.d.ts +134 -0
  516. package/dist/utilities/functions/normalizeDateBound.d.ts +7 -5
  517. package/dist/utilities/functions/normalizeDateBound.js +9 -9
  518. package/dist/utils/versionCheck.js +1 -1
  519. package/llms.txt +12 -12
  520. package/package.json +3 -2
  521. package/scripts/lib/adoption-checklist.json +2 -1
  522. package/scripts/lib/css-class-surface.mjs +39 -3
  523. package/scripts/lib/eslint-disable.mjs +9 -1
  524. package/scripts/lib/eslint-plugin.d.ts +7 -1
  525. package/scripts/lib/eslint-plugin.mjs +280 -3
  526. package/scripts/lib/form-v-model.mjs +2 -2
  527. package/scripts/lib/helper-canon.mjs +34 -2
  528. package/scripts/lib/helpers-add.mjs +106 -15
  529. package/scripts/lib/hidden-label-placeholder.mjs +138 -0
  530. package/scripts/lib/html-attributes.mjs +82 -0
  531. package/scripts/lib/idiom-scan.mjs +175 -2
  532. package/scripts/lib/portal-names.mjs +3 -3
  533. package/scripts/lib/prefer-v-bb-dialog.mjs +1 -1
  534. package/scripts/lib/tab-links.mjs +209 -0
  535. package/scripts/lib/token-color-mix.mjs +114 -0
  536. package/scripts/lib/toolchain-check.mjs +34 -3
  537. package/scripts/lib/unstyled-variants.mjs +57 -0
  538. package/scripts/lib/validate-bb-markup.mjs +72 -1
  539. package/dist/composables/useBbOffCanvasContext.d.ts +0 -23
  540. package/dist/composables/useBbTabsContext.js +0 -252
@@ -735,6 +735,14 @@ States are listed in precedence order: when two are on at once and their entries
735
735
  - `#<value>:prepend` (named from data) — scope: `BbBreadcrumbsItemSlotProps` — The glyph before one crumb's label; beats `item:prepend`, which beats its `prepend:icon`.
736
736
  - `#<value>:append` (named from data) — scope: `BbBreadcrumbsItemSlotProps` — The glyph after one crumb's label; beats `item:append`, which beats its `append:icon`.
737
737
 
738
+ ## CSS custom properties
739
+
740
+ Set these on the element, or on a class you put on it, to retune this component alone — the sanctioned alternative to reaching past the API with `:deep()`. They are this component's own locals — a **Set on** of `pt:<part>` means the local lives on that part's element, so set it through that entry (`pt:box="[--border-color:var(--color-green-500)]"`); the global `--bb-*` theme tokens are a separate tier (see the [design-tokens guide](./guides/design-tokens.md), or the MCP `list_tokens` tool).
741
+
742
+ | Property | Default | What it is |
743
+ | --- | --- | --- |
744
+ | `--ring-t` | `var(--bb-transition-medium)` | |
745
+
738
746
  ## Component tree
739
747
 
740
748
  `BbBreadcrumbs` is not one component: rendering it mounts every component below, and each one is live inside it. **Read this before styling, theming or debugging `BbBreadcrumbs`, and before concluding a part, a token or a behaviour does not exist** — it may live on a component further down. How to read it:
@@ -104,6 +104,10 @@ bitbossUi({ buttonVariants: ['upgrade'] });
104
104
  export default defineNuxtConfig({ bitboss: { buttonVariants: ['upgrade'] } });
105
105
  ```
106
106
 
107
+ Retint through these locals, never colour utilities on the button
108
+ (`bg-* text-* border-*`): a utility paints one colour over every state, so
109
+ hover, pressed, disabled and focus all look the same.
110
+
107
111
  The library ships **no CSS for registered variants**: style
108
112
  `.bb-button--upgrade` yourself by re-pointing the same locals the built-ins
109
113
  use. The root paints rest, hover, press and focus from these, so you never
@@ -160,7 +164,11 @@ primary has no room left, as the default black in light and white in dark
160
164
  do: hover is always visible and never sinks into the surface. Pressed takes
161
165
  the same move with a larger 1.6:1 step, so it is always the strongest state
162
166
  and never equals rest, and a pressed toggle keeps its pressed fill under
163
- keyboard focus, with the focus ring still showing. The built-in primary
167
+ keyboard focus, with the focus ring still showing. Any BbButton carrying
168
+ `aria-expanded="true"` (menus, popovers, collapsible triggers, row
169
+ expanders) takes the pressed paint while open, since focus has usually moved
170
+ into what it opened; a BbButton without the attribute never does. The
171
+ built-in primary
164
172
  moves its frame with the hover and pressed fills and,
165
173
  where `contrast-color()` exists, picks each state's label for its own fill
166
174
  (a white label on a mid blue can turn dark on the lighter dark-scheme
@@ -278,6 +286,10 @@ no wrapper of your own (`<BbButton>Synced <span class="dot" /></BbButton>`).
278
286
  A plain text label is untouched. Wrap rich text in one element
279
287
  (`<span>Save <b>all</b></span>`) to keep it one sentence; unwrapped, the `<b>`
280
288
  is a child of its own and sits the gap away.
289
+ The label stays on one line: a button with too little room (a full toolbar, a
290
+ narrow card) shrinks and ends its label in "…", the icons kept whole. Several
291
+ children are clipped at the end, not ellipsed, so put a count or a shortcut
292
+ that must stay visible in `append:icon` or next to the button.
281
293
  `type` defaults to `'button'`, so a `BbButton` inside a form never submits by
282
294
  accident; set `type="submit"` for the one that should, and let the form's
283
295
  `@submit` handler own the logic:
@@ -321,6 +333,17 @@ fields — and being the default, you simply omit the `size` prop. Use
321
333
  bulk-action bars) and `lg`+ only for a rare hero action. `block` stretches
322
334
  the button to its container's width (e.g. mobile CTAs, dialog footers).
323
335
 
336
+ Which button sits flush with which field (measured in the default theme; fields
337
+ and choice strips have no `size`, only `compact`):
338
+
339
+ | Beside | Height | Flush button |
340
+ | ----------------------------------------------------------------------- | ------ | ------------------ |
341
+ | A field (text, number, select, date…) or a `pill` / `line` choice strip | 32px | `lg` |
342
+ | The same, `compact` | 28px | `md` (the default) |
343
+
344
+ A strip to match a smaller button is retuned with its own locals (`--list-h`,
345
+ `--fs`, `--p`, …: BbRadioGroup § Segmented control).
346
+
324
347
  **Stretch ≠ `block`.** A flex-column parent (`flex flex-col`) stretches its
325
348
  children on the cross axis by default, so a bare `BbButton` dropped into one
326
349
  looks exactly as wide as a `block` button even though `block` was never set —
@@ -661,7 +684,7 @@ Escape hatches, when the default isn't right:
661
684
  own: promise tracking (e.g. the handler opens a dialog and you don't want a
662
685
  spinner flash) and a `type="submit"` button's spin while its `BbForm` saves.
663
686
  Only an explicit `loading` shows the spinner then. A click that awaits a
664
- dialog (`await useBbDialogContext(id).show()`, `await confirm()`) spins
687
+ dialog (`await useBbDialog(id).show()`, `await confirm()`) spins
665
688
  until the dialog settles, like any async click: that is where this prop
666
689
  goes.
667
690
  - `interactive-while-loading` — keeps the button clickable while it shows the
@@ -916,6 +939,35 @@ never arrived — offline, DNS, connection reset), are **`router.visit()` /
916
939
  does nothing. Reach for a form or an explicit visit when you need to tell those
917
940
  apart — see the Inertia helpers guide.
918
941
 
942
+ **A spinner for a write that is not a form submit** (resend an invite): an
943
+ `href` + `method` visit shows no loading state, and
944
+ `@click="router.post(url)"` returns nothing to wait on. Return the visit as a
945
+ promise from `@click` instead, and the button spins until the server answers,
946
+ with no `loading` flag of your own: the Inertia helpers' `usePromiseRouter`
947
+ (`usePromiseForm` for a form; Inertia helpers guide § usePromiseRouter):
948
+
949
+ ```ts
950
+ const visits = usePromiseRouter();
951
+ const { toast } = useToast();
952
+ // Catch the rejection: the error bag itself, or an Error (a 500, offline).
953
+ const resend = () =>
954
+ visits
955
+ .post(`/users/${id}/invite`)
956
+ .catch(() =>
957
+ toast({ title: 'Not sent. Try again.', variant: 'destructive' })
958
+ );
959
+ // <BbButton @click="resend">Resend invite</BbButton>
960
+ ```
961
+
962
+ **Laravel Wayfinder routes go in as they are.** `href` also takes Inertia's
963
+ `{ url, method }`, what a Wayfinder route returns (the default in Laravel's
964
+ starter kits), so there is no `.url` to split off and no wrapper:
965
+ `<BbButton :href="destroy(user)">Delete</BbButton>` visits with `delete`. The
966
+ pair's `method` wins over a `method` prop, as on Inertia's `<Link>`. The same
967
+ holds for a breadcrumb item's or a dropdown row's `href`. Outside Inertia (a
968
+ plain `<a>`, Nuxt) the link is the pair's `url`, and a method other than
969
+ `get` is ignored, as the `method` prop is: a plain link cannot post.
970
+
919
971
  Every prop Inertia's own `<Link>` accepts is forwarded, and
920
972
  `npm run check:inertia-props` fails the build both when Inertia adds one we
921
973
  don't forward and when we declare a callback `<Link>` never accepted. The list
@@ -951,8 +1003,8 @@ object form, a style and attributes — optionally only while a state is on.
951
1003
  Parts: `root` (the button), `icon` (every content icon the button renders:
952
1004
  `icon`, `prepend:icon`, `append:icon` — a broadcast), `spinner`, `text` (the
953
1005
  label span). Typography inherits from `root`, so reach for `text` only when a
954
- class must apply to the label ALONE — `truncate` on a long label that must not
955
- clip the icons beside it. That span also carries the margin the label slides by
1006
+ class must apply to the label ALONE — a mono font, say (it already ends a long
1007
+ label in "…" without clipping the icons beside it). That span also carries the margin the label slides by
956
1008
  while the spinner is in, so a margin of your own fights the slide. States:
957
1009
  `loading`, `disabled`, `pressed` (a `v-model` toggle that is on), and on a
958
1010
  link `activeLink` / `exactActiveLink` (it points at the current page: see
@@ -1034,9 +1086,9 @@ utility wins. What works in every build:
1034
1086
 
1035
1087
  - `BbDropdownButton` — escalate to it when a primary action grows close
1036
1088
  alternates; it shares this component's `variant`/`size`/loading language.
1037
- - `useConfirm` — gate every `destructive` button behind a confirm: mount the
1038
- `<BbHost />` once (app root), `await confirm(...)` in the handler and
1039
- act only on a yes. The dialog's own buttons are `BbButton` configs (see the
1089
+ - `useConfirm` — gate every `destructive` button behind a confirm:
1090
+ `await confirm(...)` in the handler and act only on a yes (the plugin's
1091
+ `<BbHost />` renders it, nothing to mount). The dialog's own buttons are `BbButton` configs (see the
1040
1092
  composable doc), so the confirm speaks the same `variant`/icon language:
1041
1093
 
1042
1094
  **Destructive action gated behind useConfirm**
@@ -1074,18 +1126,11 @@ utility wins. What works in every build:
1074
1126
  <p v-if="keys.length === 0" class="text-xs text-(--bb-text-muted)">
1075
1127
  No active keys.
1076
1128
  </p>
1077
-
1078
- <!--
1079
- Standalone example: it mounts its own host because it has no app root.
1080
- A real app mounts exactly one <BbHost /> at the app root, and pages
1081
- mount none. See ai/guides/agent-contract.md § Global Host Rule.
1082
- -->
1083
- <BbHost />
1084
1129
  </div>
1085
1130
  </template>
1086
1131
  <script setup lang="ts">
1087
1132
  import { ref } from 'vue';
1088
- import { BbButton, BbHost, useConfirm } from 'bitboss-ui';
1133
+ import { BbButton, useConfirm } from 'bitboss-ui';
1089
1134
 
1090
1135
  type ApiKey = { id: string; label: string; masked: string; created: string };
1091
1136
 
@@ -1220,7 +1265,7 @@ Anti-patterns:
1220
1265
  | `pt:<part>`, `pt:<part>:<state>`, `pt` | `PtValue` | | | Passthrough — a class list, or `{ class, style, attrs }`, bound to one named part of the component; the state form applies only while that state is on. Parts: `icon`, `root`, `spinner`, `text`. States: `activeLink`, `destructive`, `disabled`, `exactActiveLink`, `ghost`, `link`, `loading`, `outline`, `pressed`, `primary`, `secondary`. What each one is: _Passthrough parts and states_ below. `pt` is the object form with the same keys minus the prefix (`{ icon: '…', 'icon:loading': '…' }`). See `guides/passthrough.md`. In `<script>` a `pt` value is typed `BbButtonProps['pt']` (`PtValue` is not exported): § Typing `pt` in `<script>`. |
1221
1266
  | `activeClass` | `string \| undefined` | | | Class to apply when the link is active. |
1222
1267
  | `append:icon` | `string \| undefined` | | | Icon to be added on the right of the text. |
1223
- | `ariaCurrentValue` | `"page" \| "step" \| "location" \| "date" \| "time" \| "true" \| "false" \| undefined` | `'page'` | | Value passed to the attribute `aria-current` when the link is exact active. |
1268
+ | `ariaCurrentValue` | `"time" \| "true" \| "false" \| "page" \| "step" \| "location" \| "date" \| undefined` | `'page'` | | Value passed to the attribute `aria-current` when the link is exact active. |
1224
1269
  | `async` | `boolean \| undefined` | `false` | | Inertia: runs the visit without blocking — the page stays interactive and several async visits can be in flight at once. |
1225
1270
  | `block` | `boolean \| undefined` | `false` | | Displays the component as full width. |
1226
1271
  | `cacheFor` | `string \| number \| (string \| number)[] \| undefined` | | | Inertia: how long a prefetched response stays fresh before it is re-fetched. A single duration, or `[staleAfter, expiresAfter]`. Typed platform-agnostically (matching BbButton) so the library's types never require `@inertiajs/vue3` to be installed. |
@@ -1236,7 +1281,7 @@ Anti-patterns:
1236
1281
  | `falseValue` | `any` | `false` | | Value emitted when the toggle is deactivated. |
1237
1282
  | `group` | `boolean \| undefined` | `false` | | Identifies the button as part of a button group: adjacent `group` buttons fuse into one segment (shared borders and radius). Adjacent `group` toggles (each with a `v-model`) are also one Tab stop, with ArrowLeft / ArrowRight / Home / End moving between them. |
1238
1283
  | `headers` | `object \| undefined` | | | Additional HTTP headers forwarded to Inertia when navigating via `href` in an Inertia-enabled app. |
1239
- | `href` | `string \| undefined` | | | Returns the hyperlink's URL. Can be set, to change the URL. |
1284
+ | `href` | `string \| { url: string; method: "get" \| "post" \| "put" \| "patch" \| "delete"; } \| undefined` | | | The link target: renders an anchor (an Inertia `<Link>` under Inertia). Also takes Inertia's `{ url, method }`, a Wayfinder route: Inertia visits with its method; elsewhere the link is its `url`. |
1240
1285
  | `icon` | `string \| undefined` | | | Used when only an icon with no text should be displayed. |
1241
1286
  | `instant` | `boolean \| undefined` | `false` | | Inertia: navigate optimistically on click and reconcile when the response lands, instead of waiting for the round trip. |
1242
1287
  | `interactiveWhileLoading` | `boolean \| undefined` | `false` | | Keeps the button clickable while it is loading. Buttons are disabled while loading by default; this escape hatch exists for toggles that must stay interactive (e.g. the dropdown-button caret). |
@@ -1268,7 +1313,7 @@ Anti-patterns:
1268
1313
  | `text` | `string \| undefined` | | | Text content of the component. |
1269
1314
  | `to` | `string \| wt \| bt \| undefined` | | | Route Location the link should navigate to when clicked on. |
1270
1315
  | `trueValue` | `any` | `true` | | Value emitted when the toggle is activated. |
1271
- | `type` | `"button" \| "submit" \| "reset" \| undefined` | | | Gets the classification and default behavior of the button. |
1316
+ | `type` | `"button" \| "reset" \| "submit" \| undefined` | | | Gets the classification and default behavior of the button. |
1272
1317
  | `variant` | `'outline'` \| `'primary'` \| `'destructive'` \| `'secondary'` \| `'none'` \| `'ghost'` \| `'link'` | `"primary"` | | Visual variant of the button: colours and surface only, never spacing or size. `'none'` takes no look (you own hover, focus and disabled); register a real one with the plugin's `buttonVariants` and style `.bb-button--<name>` (no CSS ships for it). |
1273
1318
  | `viewTransition` | `boolean \| undefined` | `false` | | Inertia: run the page swap inside a View Transition, where the browser supports one. |
1274
1319
 
@@ -1364,7 +1409,7 @@ Set these on the element, or on a class you put on it, to retune this component
1364
1409
  | `--gap` | `var(--gap-md)` | between icon and label |
1365
1410
  | `--bg` | `transparent` | the plate |
1366
1411
  | `--bg-hover` | `var(--bg)` | also the focus-visible fill; no change by default |
1367
- | `--bg-pressed` | `var(--bg)` | fill while [aria-pressed='true'] |
1412
+ | `--bg-pressed` | `var(--bg)` | fill while pressed, or open (aria-expanded) |
1368
1413
  | `--fg` | `initial` | label and icons (icons paint currentColor) |
1369
1414
  | `--border-color` | `transparent` | the frame; its width is --bw |
1370
1415
  | `--ring-color` | `transparent` | focus ring colour, per variant |
@@ -1372,12 +1417,13 @@ Set these on the element, or on a class you put on it, to retune this component
1372
1417
  | `--bw` | `var(--bb-border-w)` | border width |
1373
1418
  | `--fg-hover` | `var(--fg)` | label and icons on hover (and focus-visible) |
1374
1419
  | `--border-hover` | `var(--border-color)` | the frame on hover (and focus-visible) |
1375
- | `--fg-pressed` | `var(--fg)` | label and icons while [aria-pressed='true'] |
1376
- | `--border-pressed` | `var(--border-color)` | the frame while [aria-pressed='true'] |
1420
+ | `--fg-pressed` | `var(--fg)` | label and icons while pressed or open |
1421
+ | `--border-pressed` | `var(--border-color)` | the frame while pressed or open |
1377
1422
  | `--bg-disabled` | `var(--bb-muted)` | the plate while disabled (not loading) |
1378
1423
  | `--fg-disabled` | `color-mix(in oklab, var(--bb-text) 45%, var(--bb-panel))` | label and icons while disabled |
1379
1424
  | `--border-disabled` | `var(--bb-muted)` | the frame while disabled |
1380
1425
  | `--opacity-disabled` | `1` | whole-button opacity while disabled — `.5` with the three above set to the resting tokens gives "fade instead of grey" |
1426
+ | `--ring-t` | `var(--bb-transition-medium)` | |
1381
1427
  | `--elev-tier` | `var(--bb-elev)` | the shadow a plate variant may take |
1382
1428
  | `--elev` | `0 0 0 0 transparent` | the shadow painted; flat variants keep this |
1383
1429
 
@@ -186,6 +186,54 @@ const onPick = (value: string | string[] | null) => {
186
186
  };
187
187
  ```
188
188
 
189
+ ### Several months side by side
190
+
191
+ `:number-of-months="2"` shows two month grids next to each other, so a range
192
+ that crosses the month line has both ends on screen. Any count renders as
193
+ asked. Each month is its own labelled grid (its month and year), and the whole
194
+ calendar is still one Tab stop. The arrows step a whole page (all the months on
195
+ show), and the keyboard moves from the last day of one month into the next
196
+ one. Past the last month on show, the view jumps a whole page. When there isn't
197
+ room for all the months in one row, they wrap onto the next row. The month and
198
+ year headings belong to the first month. Their panels replace it, and picking
199
+ there moves the whole view. The day grids are the only ones with several
200
+ months: `type="month"` and `type="year"` ignore the prop.
201
+
202
+ **A stay across the month line — two months**
203
+
204
+ ```vue
205
+ <template>
206
+ <div class="grid w-fit gap-3 rounded-(--bb-radius) border p-4">
207
+ <p class="m-0 text-sm font-medium">{{ summary }}</p>
208
+ <BbCalendar
209
+ v-model="stay"
210
+ aria-label="Stay"
211
+ floating
212
+ :number-of-months="2"
213
+ range
214
+ />
215
+ </div>
216
+ </template>
217
+
218
+ <script setup lang="ts">
219
+ import { computed, ref } from 'vue';
220
+ import { BbCalendar } from 'bitboss-ui';
221
+
222
+ /** A stay that crosses the month line: both ends on screen at once. */
223
+ const stay = ref<string[]>(['2026-10-29', '2026-11-03']);
224
+
225
+ const summary = computed(() => {
226
+ const [from, to] = stay.value;
227
+ if (!from) return 'Pick a check-in day';
228
+ if (!to) return 'Now pick the check-out day';
229
+ return `${from} → ${to}`;
230
+ });
231
+ </script>
232
+ ```
233
+
234
+ With more than one month, the days of the neighbouring months are left blank:
235
+ a date belongs to one grid only.
236
+
189
237
  ### `type` — what you are picking
190
238
 
191
239
  One prop decides the grid and the shape of the emitted string:
@@ -528,6 +576,8 @@ The calendar is an ordinary control in the tab order: **one tab stop** lands
528
576
  on the day under the cursor (the value, or today), arrows move by day and
529
577
  week, Home / End jump to the ends of the grid's row, PageUp / PageDown page by month
530
578
  (with Shift, by year), typing a day number jumps to it, Enter or Space picks.
579
+ With `number-of-months`, every key crosses from one month on show into the
580
+ next, and leaving the last (or first) one moves the view a whole page.
531
581
  The grid is a `role="grid"` of `role="row"` / `gridcell` nodes; a picked day
532
582
  carries `aria-selected` and says "selected" in its name, a pending range
533
583
  announces "select an end date", and the month / year headings are buttons
@@ -614,8 +664,9 @@ the page is `BbDatePicker`.
614
664
  | `max` | `string \| undefined` | | | Maximum selectable value, in this `type`'s shape. A finer bound is accepted and ceiled to the unit, with a warning. With `datetime`, on its own day the time rail disables the times after it. |
615
665
  | `min` | `string \| undefined` | | | Minimum selectable value in this `type`'s shape (`YYYY-MM-DD`; `YYYY-MM-DDTHH:mm` with `datetime`, `YYYY-MM` with `month`, `YYYY` with `year`). A finer bound is floored to the unit, with a warning. With `datetime` the rail also disables the earlier times on its day. |
616
666
  | `modelValue` | `string \| string[] \| null` | | yes | v-model: `null` when empty, a string, a `[start, end]` pair with `range`, or a sorted array with `multiple`. The string is `YYYY-MM-DD` when `floating` (`YYYY-MM` / `YYYY` for `month` / `year`), otherwise a zoned ISO instant (carrying the time under `datetime`). |
617
- | `multiple` | `boolean \| undefined` | `false` | | Multi-selection: each pick toggles a value in a sorted array (days, months or years). Needs an array `modelValue` (`[]` when empty, never `null`). Throws with `range` or `type="datetime"`. |
618
- | `range` | `boolean \| undefined` | `false` | | Enables range selection (`[start, end]`). |
667
+ | `multiple` | `boolean` | `false` | | Multi-selection: each pick toggles a value in a sorted array (days, months or years). Needs an array `modelValue` (`[]` when empty, never `null`). Throws with `range` or `type="datetime"`. |
668
+ | `numberOfMonths` | `number \| undefined` | `1` | | How many months show side by side (day grids only). The keyboard crosses from one month into the next, and the arrows page all of them at once. Too narrow for them all, the months wrap onto the next row. |
669
+ | `range` | `boolean` | `false` | | Enables range selection (`[start, end]`). |
619
670
  | `readonly` | `boolean \| undefined` | `false` | | Shows the calendar and lets the user page through it, but no pick changes the value. |
620
671
  | `seconds` | `boolean \| undefined` | `false` | | Adds the seconds column (requires `type="datetime"`). |
621
672
  | `selectable` | `((date: string) => boolean) \| undefined` | | | Predicate invoked per candidate; return `false` to disable it. Receives the value in this `type`'s shape — `YYYY-MM` under `month`, `YYYY` under `year`. |
@@ -631,7 +682,7 @@ the page is `BbDatePicker`.
631
682
  | Part | What it is |
632
683
  | --- | --- |
633
684
  | `root` | The calendar's box: the grid and, with `type="datetime"`, the time rail beside it. A consumer `class` lands here. It carries the sizing tokens — `pt:root="[--cell:36px]"` widens the whole calendar, `pt:root="[--px:2px]"` tightens its padding — and the grid's width follows. |
634
- | `header` | The navigation bar: the previous / next arrows and the month / year headings. |
685
+ | `header` | The navigation bar: the previous / next arrows and the month / year headings. With `number-of-months`, every month's header row (the later ones caption their month). |
635
686
  | `arrow` | The previous / next buttons — a broadcast. |
636
687
  | `month` | The month heading button; it opens the month panel. |
637
688
  | `year` | The year heading button; it opens the year panel. |
@@ -683,6 +734,8 @@ Set these on the element, or on a class you put on it, to retune this component
683
734
  | `--py` | `.bb-calendar` | `8px` | |
684
735
  | `--nav-button-h` | `.bb-calendar` | `24px` | |
685
736
  | `--unit-row` | `.bb-calendar` | `calc(var(--cell) * 1.25)` | Row pitch for the coarse grids (month/year), where a "row" is one of four month rows rather than a week. Roomier than --cell because twelve months in a 4×3 grid have space the 6×7 day grid does not. |
737
+ | `--ring-t` | `.bb-calendar__arrow` | `var(--bb-transition-medium)` | |
738
+ | `--ring-t` | `.bb-calendar__heading-btn` | `var(--bb-transition-medium)` | |
686
739
 
687
740
  ## Component tree
688
741
 
@@ -587,7 +587,7 @@ no box.
587
587
  :name="pref.name"
588
588
  :persistent-hint="!!pref.hint"
589
589
  pt:description="text-xs"
590
- pt:icon:focused="ring-2 ring-(--bb-primary) ring-offset-2"
590
+ pt:icon:focused="outline-(--bb-primary) outline-offset-2"
591
591
  pt:label="font-medium"
592
592
  />
593
593
  </div>
@@ -510,7 +510,7 @@ checked day painted, the hint reading the choice back:
510
510
  pt:icon="hidden"
511
511
  pt:item="justify-items-center rounded-(--bb-radius) border py-2 hover:bg-(--bb-muted)"
512
512
  pt:item:checked="border-(--bb-primary) bg-(--bb-primary) hover:bg-(--bb-primary-hover)"
513
- pt:item:focus-visible="ring-2 ring-(--bb-primary-ring)"
513
+ pt:item:focus-visible="ring-2 ring-(--bb-ring)"
514
514
  pt:label="text-sm font-medium"
515
515
  pt:label:checked="text-(--bb-primary-fg)"
516
516
  pt:list="[--gap:6px] [--tile-min-width:0px]"
@@ -664,8 +664,11 @@ never wraps (it scrolls); `list-layout="vertical"` stacks it into a column
664
664
  (runs stack on the Y axis), `"vertical-stretch"` spans the field, and the
665
665
  other layouts and `item-layout` do not apply. `pt:indicator` reaches every
666
666
  pill or bar, and `pt:<part>:pill` / `pt:<part>:line` style a part in one look
667
- only. The strip's tokens are its own, named and valued as a tab strip's; a
668
- registered `checkboxVariants: ['brand']` sets them on
667
+ only. The strip's tokens are its own, named and valued as a tab strip's. A
668
+ strip has no `size`: it is `--bb-control-h` tall like a field (`compact` drops
669
+ it to 28px), and you size it with `--list-h`, `--list-r`, `--fs`, `--p` and
670
+ `--trigger-px` on `.bb-checkbox-group__list--strip`; beside an `sm` button that
671
+ is `pt:list="[--list-h:24px] [--fs:12px] [--p:2px]"`. A registered `checkboxVariants: ['brand']` sets them on
669
672
  `.bb-checkbox-group__list--brand` and draws pills per run, as `pill` does.
670
673
 
671
674
  **Pick values with the tabs look**
@@ -1179,11 +1182,44 @@ States are listed in precedence order: when two are on at once and their entries
1179
1182
 
1180
1183
  Set these on the element, or on a class you put on it, to retune this component alone — the sanctioned alternative to reaching past the API with `:deep()`. They are this component's own locals — a **Set on** of `pt:<part>` means the local lives on that part's element, so set it through that entry (`pt:box="[--border-color:var(--color-green-500)]"`); the global `--bb-*` theme tokens are a separate tier (see the [design-tokens guide](./guides/design-tokens.md), or the MCP `list_tokens` tool).
1181
1184
 
1182
- | Property | Default | What it is |
1183
- | --- | --- | --- |
1184
- | `--gap` | `24px` | Space between rows on one line. |
1185
- | `--row-gap` | `10px` | Space between wrapped lines. |
1186
- | `--tile-min-width` | `96px` | How narrow a tile may get before the tiles wrap (`tiles` only). |
1185
+ | Property | Set on | Default | What it is |
1186
+ | --- | --- | --- | --- |
1187
+ | `--gap` | `.bb-checkbox-group__list` | `24px` | Space between rows on one line. |
1188
+ | `--row-gap` | `.bb-checkbox-group__list` | `10px` | Space between wrapped lines. |
1189
+ | `--tile-min-width` | `.bb-checkbox-group__list` | `96px` | How narrow a tile may get before the tiles wrap (`tiles` only). |
1190
+ | `--list-bg` | `.bb-checkbox-group__list--strip` | `color-mix(in oklab, var(--bb-text) 8%, transparent)` | The strip behind the triggers |
1191
+ | `--list-border` | `.bb-checkbox-group__list--strip` | `transparent` | The strip's edge line, --bb-border-w thick, painted inside the strip: under the triggers (beside them when vertical). `pill` draws none; `line` sets it to --bb-border |
1192
+ | `--p` | `.bb-checkbox-group__list--strip` | `3px` | strip inner padding — the gutter the indicator sits in, and the scroll inset |
1193
+ | `--list-r` | `.bb-checkbox-group__list--strip` | `var(--bb-radius)` | strip corners |
1194
+ | `--list-h` | `.bb-checkbox-group__list--strip` | `var(--bb-control-h)` | strip min height |
1195
+ | `--fs` | `.bb-checkbox-group__list--strip` | `var(--bb-fs)` | trigger label size |
1196
+ | `--trigger-gap` | `.bb-checkbox-group__list--strip` | `0px` | space between triggers |
1197
+ | `--trigger-px` | `.bb-checkbox-group__list--strip` | `10px` | trigger side padding |
1198
+ | `--trigger-r` | `.bb-checkbox-group__list--strip` | `calc(var(--list-r) - var(--p))` | Trigger corners, concentric inside --list-r |
1199
+ | `--trigger-min-h` | `.bb-checkbox-group__list--strip` | `calc(var(--list-h) - var(--p) * 2)` | Trigger height inside the padded strip |
1200
+ | `--list-fg` | `.bb-checkbox-group__list--strip` | `var(--bb-text-muted)` | unchecked trigger label |
1201
+ | `--hover-fg` | `.bb-checkbox-group__list--strip` | `var(--bb-text)` | hovered trigger label |
1202
+ | `--active-fg` | `.bb-checkbox-group__list--strip` | `var(--bb-text)` | checked trigger label |
1203
+ | `--active-fw` | `.bb-checkbox-group__list--strip` | `500` | checked trigger label weight (unchecked labels are 500) |
1204
+ | `--indicator-bg` | `.bb-checkbox-group__list--strip` | `var(--bb-panel)` | the indicator's fill |
1205
+ | `--indicator-border` | `.bb-checkbox-group__list--strip` | `color-mix(in oklab, var(--bb-text) 8%, transparent)` | The indicator's edge |
1206
+ | `--indicator-r` | `.bb-checkbox-group__list--strip` | `var(--trigger-r)` | The indicator's corners — the pill's, concentric inside --list-r |
1207
+ | `--indicator-h` | `.bb-checkbox-group__list--strip` | `initial` | The indicator's thickness: its height, its width on a vertical strip. `initial` fills the whole trigger box — the pill; a bar is `2px`, on the trigger's bottom edge (inline-end edge when vertical) |
1208
+ | `--indicator-inset` | `.bb-checkbox-group__list--strip` | `0px` | Inset of the indicator from the trigger box — shrinks the pill; a bar keeps its thickness, shortens by it at both ends and floats it above the edge |
1209
+ | `--elev` | `.bb-checkbox-group__list--strip` | `var(--bb-elev)` | The theme's resting lift, composed UNDER the indicator's own shadow |
1210
+ | `--indicator-shadow` | `.bb-checkbox-group__list--strip` | `var(--bb-shadow-sm)` | Indicator lift, painted on top of --elev |
1211
+ | `--list-bg` | `.bb-checkbox-group__list--line` | `transparent` | |
1212
+ | `--list-border` | `.bb-checkbox-group__list--line` | `var(--bb-border)` | |
1213
+ | `--p` | `.bb-checkbox-group__list--line` | `0px` | |
1214
+ | `--list-r` | `.bb-checkbox-group__list--line` | `0px` | |
1215
+ | `--trigger-r` | `.bb-checkbox-group__list--line` | `var(--bb-radius-sm)` | |
1216
+ | `--active-fw` | `.bb-checkbox-group__list--line` | `600` | |
1217
+ | `--indicator-bg` | `.bb-checkbox-group__list--line` | `var(--bb-primary)` | |
1218
+ | `--indicator-border` | `.bb-checkbox-group__list--line` | `transparent` | |
1219
+ | `--indicator-r` | `.bb-checkbox-group__list--line` | `0` | |
1220
+ | `--indicator-h` | `.bb-checkbox-group__list--line` | `2px` | |
1221
+ | `--indicator-shadow` | `.bb-checkbox-group__list--line` | `none` | |
1222
+ | `--elev` | `.bb-checkbox-group__list--line` | `none` | |
1187
1223
 
1188
1224
  ## Component tree
1189
1225
 
@@ -43,7 +43,7 @@
43
43
  | `--border-focus` | `pt:box` | `CommonFieldInput` | frame while focused, or --active |
44
44
  | `--ring-size` | `pt:box` | `CommonFieldInput` | ring width; 0 is a variant declining the ring |
45
45
  | `--ring-color` | `pt:box` | `CommonFieldInput` | ring colour; state owns it, not variants |
46
- | `--elev` | `pt:box` | `CommonFieldInput` | Resting lift, composed UNDER the ring at every box-shadow site below. `0 0 0 0 transparent` and not `none`, so the shadow list keeps a constant length and stays interpolable whatever a variant assigns — the same reason `--bb-elev` itself ships that value. |
46
+ | `--elev` | `pt:box` | `CommonFieldInput` | Resting lift, alone in `box-shadow`: the ring is the box's outline (Q81.6), so a theme's `--elev: none` never takes the ring with it. |
47
47
  | `--frost` | `pt:box` | `CommonFieldInput` | Plate frost — a full `backdrop-filter` value (see --bb-surface-filter). Routed through a local rather than read from the token directly, so a chrome-less variant can decline it: frosting a ghost field gives it the plate it is contractually not supposed to have. |
48
48
  | `--inside-label-clearance` | `pt:box`, `pt:prefix`, `pt:suffix` | `CommonFieldInput` | Height and top padding added above the text for a label rendered inside the box. Zero here; the `--inside-label` rules at the bottom of this file raise it to one label line, or two with a description. |
49
49
  | `--w` | `pt:icon` | `BbIcon` | `--w` is set inline by BbIcon from the size prop. The `initial` default seals it: without it an ancestor's `--w` (e.g. a dropdown's width bridge) would inherit in and size the icon. The `--size` indirection stays so higher-specificity rules (e.g. `.bb-badge .bb-icon`) can re-point it. |
@@ -697,7 +697,7 @@ A `pt` value written in `<script>` (a constant, a preset, a wrapper's
697
697
  | `formless` | `boolean \| undefined` | `false` | | Keep this control out of the enclosing `BbForm` entirely: not submitted, not dirty, not reset, not validated. For a control that is not form data (a filter, a "show advanced" switch). |
698
698
  | `hasErrors` | `boolean \| undefined` | `false` | | Define if the component should be in an error state. It usually attaches a CSS class for styling purposes. |
699
699
  | `hasWarnings` | `boolean \| undefined` | `false` | | Define if the component should be in a warning state. Same chrome as errors with `--bb-warn`; errors take priority. |
700
- | `hideLabel` | `boolean \| undefined` | `false` | | Visually hides the label of the input while maintaining accessibility. |
700
+ | `hideLabel` | `boolean \| undefined` | `false` | | Visually hides the label of the input while maintaining accessibility. Pair it with a `placeholder`: an empty field otherwise shows nothing saying what it is for. |
701
701
  | `hint` | `string \| undefined` | | | Text box to be displayed near the input, usually to indicate instructions. |
702
702
  | `id` | `string \| undefined` | | | The `id` of the native control; the label's `for` and the description and message ids derive from it. Generated when omitted. |
703
703
  | `inputAlign` | `FieldCrossAlign \| undefined` | | | Vertical position of the control in a side-by-side row; not `inputPosition`, the horizontal one. Omitted, the control's first line meets the label's. |
@@ -799,6 +799,7 @@ Set these on the element, or on a class you put on it, to retune this component
799
799
  | Property | Set on | Default | What it is |
800
800
  | --- | --- | --- | --- |
801
801
  | `--elev` | `.bb-color-input__indicator` | `var(--bb-elev-sm)` | Small-chrome resting lift, DECLARED here so it is sealed: an ancestor that sets `--elev` for its own plate must not reach in and lift this. Same tier and same name as the checkbox and radio glyphs. |
802
+ | `--ring-t` | `.bb-color-input__indicator` | `var(--bb-transition-medium)` | |
802
803
  | `--border-color` | `pt:box` | `per variant` | The resting border, at the fixed --bb-border-w. Errors and warnings paint their frame over it, so `pt:box="[--border-color:…]"` recolours the rest without hiding the state; a plain `border-*` utility on the base pt:box would hide it (ESLint `no-box-border-color`). |
803
804
 
804
805
  ## Component tree
@@ -808,9 +808,13 @@ States are listed in precedence order: when two are on at once and their entries
808
808
 
809
809
  Set these on the element, or on a class you put on it, to retune this component alone — the sanctioned alternative to reaching past the API with `:deep()`. They are this component's own locals — a **Set on** of `pt:<part>` means the local lives on that part's element, so set it through that entry (`pt:box="[--border-color:var(--color-green-500)]"`); the global `--bb-*` theme tokens are a separate tier (see the [design-tokens guide](./guides/design-tokens.md), or the MCP `list_tokens` tool).
810
810
 
811
- | Property | Default | What it is |
812
- | --- | --- | --- |
813
- | `--edge` | `color-mix(in oklab, var(--bb-text) 8%, transparent)` | The swatch's own edge: a text-tone hairline, so a pale swatch reads on a light panel AND a deep one (green-900, indigo-900) on a dark panel — a fixed black 8% vanished there. |
811
+ | Property | Set on | Default | What it is |
812
+ | --- | --- | --- | --- |
813
+ | `--ring-t` | `.bb-color-palette__canvas-wrap` | `var(--bb-transition-medium)` | |
814
+ | `--ring-t` | `.bb-color-palette__eyedropper` | `var(--bb-transition-medium)` | |
815
+ | `--ring-t` | `.bb-color-palette__slider-wrap` | `var(--bb-transition-medium)` | |
816
+ | `--edge` | `.bb-color-palette__swatch` | `color-mix(in oklab, var(--bb-text) 8%, transparent)` | The swatch's own edge: a text-tone hairline, so a pale swatch reads on a light panel AND a deep one (green-900, indigo-900) on a dark panel — a fixed black 8% vanished there. |
817
+ | `--ring-t` | `.bb-color-palette__swatch` | `var(--bb-transition-medium)` | |
814
818
 
815
819
  ## Component tree
816
820