bitboss-ui 3.0.0-beta.65 → 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 (528) 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 +366 -4
  60. package/dist/ai/components.json +87 -83
  61. package/dist/ai/composables/{useBbDialogContext.md → useBbDialog.md} +18 -18
  62. package/dist/ai/composables/{useBbDropdownContext.md → useBbDropdown.md} +31 -31
  63. package/dist/ai/composables/{useBbFormContext.md → useBbForm.md} +11 -11
  64. package/dist/ai/composables/useBbFormField.md +2 -2
  65. package/dist/ai/composables/{useBbOffCanvasContext.md → useBbOffCanvas.md} +13 -13
  66. package/dist/ai/composables/{useBbTableContext.md → useBbTable.md} +20 -20
  67. package/dist/ai/composables/{useBbTabsContext.md → useBbTabs.md} +12 -12
  68. package/dist/ai/composables/useConfirm.md +42 -54
  69. package/dist/ai/composables/useToast.md +9 -26
  70. package/dist/ai/guides/agent-contract.md +57 -43
  71. package/dist/ai/guides/ai-router.md +1 -1
  72. package/dist/ai/guides/app-layout.md +32 -23
  73. package/dist/ai/guides/coherence-playbook.md +4 -2
  74. package/dist/ai/guides/component-picker.md +35 -32
  75. package/dist/ai/guides/design-language.md +26 -12
  76. package/dist/ai/guides/design-tokens.md +73 -32
  77. package/dist/ai/guides/eslint-rules.md +8 -4
  78. package/dist/ai/guides/fetch-items-playbook.md +3 -3
  79. package/dist/ai/guides/floating-bottom-panel.md +1 -1
  80. package/dist/ai/guides/inertia-helpers.md +661 -210
  81. package/dist/ai/guides/installation-and-plugin-setup.md +6 -3
  82. package/dist/ai/guides/migration/adoption-checklist.md +44 -2
  83. package/dist/ai/guides/migration/components/bb-dialog.md +13 -13
  84. package/dist/ai/guides/migration/components/bb-dropdown.md +16 -16
  85. package/dist/ai/guides/migration/components/bb-host.md +15 -14
  86. package/dist/ai/guides/migration/components/bb-offcanvas.md +10 -10
  87. package/dist/ai/guides/migration/components/bb-pagination.md +9 -9
  88. package/dist/ai/guides/migration/components/bb-select.md +1 -1
  89. package/dist/ai/guides/migration/components/bb-table.md +12 -12
  90. package/dist/ai/guides/migration/components/bb-tabs.md +1 -1
  91. package/dist/ai/guides/migration/from-async-validator.md +9 -9
  92. package/dist/ai/guides/migration/v2-to-v3.md +158 -13
  93. package/dist/ai/guides/options-items-playbook.md +2 -2
  94. package/dist/ai/guides/page-shell.md +15 -3
  95. package/dist/ai/guides/passthrough.md +9 -5
  96. package/dist/ai/guides/preset-components.md +102 -43
  97. package/dist/ai/guides/typescript-generic-components.md +21 -5
  98. package/dist/ai/guides/validated-forms.md +20 -11
  99. package/dist/ai/guides/validation-providers.md +3 -3
  100. package/dist/ai/helpers/definePreset.json +11 -4
  101. package/dist/ai/helpers/definePreset.ts +98 -41
  102. package/dist/ai/helpers/inertia/manifest.json +234 -76
  103. package/dist/ai/helpers/inertia/useConfirmOnRouteLeave.ts +24 -12
  104. package/dist/ai/helpers/inertia/usePromiseForm.ts +38 -151
  105. package/dist/ai/helpers/inertia/usePromiseRouter.ts +295 -0
  106. package/dist/ai/helpers/inertia/useQueryObject.ts +36 -5
  107. package/dist/ai/helpers/inertia/useRouteQuery.ts +28 -9
  108. package/dist/ai/helpers/inertia/utils.ts +53 -10
  109. package/dist/ai/index.md +15 -15
  110. package/dist/ai/manifest/common.json +2 -1
  111. package/dist/ai/manifest/components/BbAccordion.tree.json +3 -1
  112. package/dist/ai/manifest/components/BbAlert.json +1 -1
  113. package/dist/ai/manifest/components/BbBadge.tree.json +3 -1
  114. package/dist/ai/manifest/components/BbBadgeButton.json +9 -4
  115. package/dist/ai/manifest/components/BbBadgeButton.tree.json +1 -0
  116. package/dist/ai/manifest/components/BbBaseButton.json +9 -4
  117. package/dist/ai/manifest/components/BbBaseCheckboxIcon.tree.json +3 -1
  118. package/dist/ai/manifest/components/BbBaseRadioIcon.tree.json +3 -1
  119. package/dist/ai/manifest/components/BbBaseSwitchIcon.tree.json +3 -1
  120. package/dist/ai/manifest/components/BbBreadcrumbs.tree.json +7 -3
  121. package/dist/ai/manifest/components/BbButton.json +9 -4
  122. package/dist/ai/manifest/components/BbButton.tree.json +5 -3
  123. package/dist/ai/manifest/components/BbCalendar.json +4 -3
  124. package/dist/ai/manifest/components/BbCalendar.tree.json +10 -1
  125. package/dist/ai/manifest/components/BbCheckbox.json +1 -1
  126. package/dist/ai/manifest/components/BbCheckbox.tree.json +1 -1
  127. package/dist/ai/manifest/components/BbCheckboxGroup.json +1 -1
  128. package/dist/ai/manifest/components/BbCheckboxGroup.tree.json +62 -3
  129. package/dist/ai/manifest/components/BbCollapsible.json +4 -1
  130. package/dist/ai/manifest/components/BbColorInput.json +1 -1
  131. package/dist/ai/manifest/components/BbColorInput.tree.json +5 -3
  132. package/dist/ai/manifest/components/BbColorPalette.json +3 -0
  133. package/dist/ai/manifest/components/BbColorPalette.tree.json +7 -2
  134. package/dist/ai/manifest/components/BbConfirm.tree.json +2 -2
  135. package/dist/ai/manifest/components/BbDatePicker.json +7 -3
  136. package/dist/ai/manifest/components/BbDatePicker.tree.json +3 -4
  137. package/dist/ai/manifest/components/BbDatePickerInput.json +4 -3
  138. package/dist/ai/manifest/components/BbDatePickerInput.tree.json +5 -3
  139. package/dist/ai/manifest/components/BbDialog.json +1 -1
  140. package/dist/ai/manifest/components/BbDialog.tree.json +2 -2
  141. package/dist/ai/manifest/components/BbDropdown.json +3 -3
  142. package/dist/ai/manifest/components/BbDropdown.tree.json +2 -2
  143. package/dist/ai/manifest/components/BbDropdownButton.json +11 -6
  144. package/dist/ai/manifest/components/BbDropdownButton.tree.json +2 -3
  145. package/dist/ai/manifest/components/BbDropzone.json +4 -1
  146. package/dist/ai/manifest/components/BbForm.json +2 -2
  147. package/dist/ai/manifest/components/BbHost.json +1 -1
  148. package/dist/ai/manifest/components/BbHost.tree.json +1 -1
  149. package/dist/ai/manifest/components/BbHoverCard.json +1 -1
  150. package/dist/ai/manifest/components/BbNumberInput.json +1 -1
  151. package/dist/ai/manifest/components/BbNumberInput.tree.json +1 -1
  152. package/dist/ai/manifest/components/BbOffCanvas.json +1 -1
  153. package/dist/ai/manifest/components/BbOffCanvas.tree.json +3 -1
  154. package/dist/ai/manifest/components/BbPagination.json +4 -4
  155. package/dist/ai/manifest/components/BbPagination.tree.json +2 -1
  156. package/dist/ai/manifest/components/BbPopover.json +1 -1
  157. package/dist/ai/manifest/components/BbPopover.tree.json +1 -1
  158. package/dist/ai/manifest/components/BbProgress.json +4 -1
  159. package/dist/ai/manifest/components/BbRadio.json +1 -1
  160. package/dist/ai/manifest/components/BbRadio.tree.json +1 -1
  161. package/dist/ai/manifest/components/BbRadioGroup.json +5 -5
  162. package/dist/ai/manifest/components/BbRadioGroup.tree.json +62 -3
  163. package/dist/ai/manifest/components/BbRating.tree.json +3 -1
  164. package/dist/ai/manifest/components/BbSelect.json +5 -5
  165. package/dist/ai/manifest/components/BbSelect.tree.json +3 -3
  166. package/dist/ai/manifest/components/BbSelectPopover.json +7 -3
  167. package/dist/ai/manifest/components/BbSelectPopover.tree.json +2 -2
  168. package/dist/ai/manifest/components/BbSlider.json +3 -3
  169. package/dist/ai/manifest/components/BbSlider.tree.json +3 -0
  170. package/dist/ai/manifest/components/BbSmoothHeight.json +4 -1
  171. package/dist/ai/manifest/components/BbSwitch.json +1 -1
  172. package/dist/ai/manifest/components/BbSwitch.tree.json +1 -1
  173. package/dist/ai/manifest/components/BbSwitchGroup.tree.json +1 -1
  174. package/dist/ai/manifest/components/BbTable.json +6 -2
  175. package/dist/ai/manifest/components/BbTable.tree.json +4 -1
  176. package/dist/ai/manifest/components/BbTabs.json +9 -12
  177. package/dist/ai/manifest/components/BbTabs.tree.json +4 -1
  178. package/dist/ai/manifest/components/BbTabsList.json +4 -7
  179. package/dist/ai/manifest/components/BbTabsList.tree.json +4 -1
  180. package/dist/ai/manifest/components/BbTabsPanels.json +1 -1
  181. package/dist/ai/manifest/components/BbTabsPanels.tree.json +4 -1
  182. package/dist/ai/manifest/components/BbTabsRoot.json +5 -5
  183. package/dist/ai/manifest/components/BbTag.json +1 -1
  184. package/dist/ai/manifest/components/BbTag.tree.json +2 -2
  185. package/dist/ai/manifest/components/BbTextInput.json +4 -4
  186. package/dist/ai/manifest/components/BbTextInput.tree.json +1 -1
  187. package/dist/ai/manifest/components/BbTextarea.json +2 -2
  188. package/dist/ai/manifest/components/BbTextarea.tree.json +1 -1
  189. package/dist/ai/manifest/components/BbTimePicker.json +4 -1
  190. package/dist/ai/manifest/components/BbTimePicker.tree.json +5 -3
  191. package/dist/ai/manifest/components/BbTimePickerInput.json +2 -2
  192. package/dist/ai/manifest/components/BbTimePickerInput.tree.json +5 -3
  193. package/dist/ai/manifest/components/BbToast.json +1 -1
  194. package/dist/ai/manifest/components/BbToast.tree.json +3 -1
  195. package/dist/ai/manifest/components/BbTooltip.json +3 -0
  196. package/dist/ai/manifest/components/ChipsBox.tree.json +1 -1
  197. package/dist/ai/manifest/components/CommonField.tree.json +1 -0
  198. package/dist/ai/manifest/components/CommonFieldInput.tree.json +4 -2
  199. package/dist/ai/manifest/components/CommonTimeSelector.tree.json +1 -0
  200. package/dist/ai/manifest/components/FlatListBox.json +1 -1
  201. package/dist/ai/manifest/components/GroupedListBox.json +1 -1
  202. package/dist/ai/manifest/components/ListBox.json +1 -1
  203. package/dist/ai/manifest/components/OptionsContainer.json +2 -2
  204. package/dist/ai/manifest/index.json +3 -3
  205. package/dist/ai/manifest/meta.json +31 -16
  206. package/dist/ai/manifest/types.advanced.json +15 -11
  207. package/dist/ai/manifest/types.api.json +2 -2
  208. package/dist/ai/recipes/inertia/approvals-inbox.md +86 -115
  209. package/dist/ai/recipes/inertia/inline-edit-workspace.md +112 -120
  210. package/dist/ai/recipes/inertia/layout-scaffold.md +15 -4
  211. package/dist/ai/recipes/inertia/onboarding.md +76 -58
  212. package/dist/ai/recipes/inertia/ownership-atlas.md +74 -105
  213. package/dist/ai/recipes/inertia/record-form.md +18 -7
  214. package/dist/ai/recipes/inertia/records-workspace.md +106 -127
  215. package/dist/ai/recipes/inertia/settings-workspace.md +131 -73
  216. package/dist/ai/recipes/inertia/upload-center.md +97 -121
  217. package/dist/ai/recipes/inertia/wizard-form.md +25 -15
  218. package/dist/ai/recipes/nuxt/approvals-inbox.md +67 -48
  219. package/dist/ai/recipes/nuxt/inline-edit-workspace.md +73 -58
  220. package/dist/ai/recipes/nuxt/layout-scaffold.md +15 -4
  221. package/dist/ai/recipes/nuxt/onboarding.md +27 -10
  222. package/dist/ai/recipes/nuxt/ownership-atlas.md +40 -22
  223. package/dist/ai/recipes/nuxt/record-form.md +20 -7
  224. package/dist/ai/recipes/nuxt/records-workspace.md +120 -96
  225. package/dist/ai/recipes/nuxt/settings-workspace.md +36 -23
  226. package/dist/ai/recipes/nuxt/upload-center.md +63 -37
  227. package/dist/ai/recipes/nuxt/wizard-form.md +28 -16
  228. package/dist/ai/recipes/vue/approvals-inbox.md +74 -46
  229. package/dist/ai/recipes/vue/inline-edit-workspace.md +83 -56
  230. package/dist/ai/recipes/vue/layout-scaffold.md +15 -4
  231. package/dist/ai/recipes/vue/onboarding.md +27 -10
  232. package/dist/ai/recipes/vue/ownership-atlas.md +40 -22
  233. package/dist/ai/recipes/vue/record-form.md +20 -7
  234. package/dist/ai/recipes/vue/records-workspace.md +132 -95
  235. package/dist/ai/recipes/vue/settings-workspace.md +36 -23
  236. package/dist/ai/recipes/vue/upload-center.md +73 -37
  237. package/dist/ai/recipes/vue/wizard-form.md +28 -16
  238. package/dist/ai/source/BbAccordion.md +36 -6
  239. package/dist/ai/source/BbAlert.md +11 -5
  240. package/dist/ai/source/BbAsterisk.md +4 -1
  241. package/dist/ai/source/BbAvatar.md +11 -5
  242. package/dist/ai/source/BbBadge.md +42 -11
  243. package/dist/ai/source/BbBadgeButton.md +41 -8
  244. package/dist/ai/source/BbBaseButton.md +57 -15
  245. package/dist/ai/source/BbBaseCheckboxIcon.md +37 -13
  246. package/dist/ai/source/BbBaseRadioIcon.md +32 -9
  247. package/dist/ai/source/BbBaseSwitchIcon.md +31 -7
  248. package/dist/ai/source/BbBreadcrumbs.md +32 -9
  249. package/dist/ai/source/BbButton.md +91 -27
  250. package/dist/ai/source/BbCalendar.md +571 -300
  251. package/dist/ai/source/BbCheckbox.md +18 -7
  252. package/dist/ai/source/BbCheckboxGroup.md +16 -5
  253. package/dist/ai/source/BbCollapsible.md +15 -6
  254. package/dist/ai/source/BbColorInput.md +68 -20
  255. package/dist/ai/source/BbColorPalette.md +107 -23
  256. package/dist/ai/source/BbConfirmPortal.md +1 -1
  257. package/dist/ai/source/BbDatePicker.md +106 -25
  258. package/dist/ai/source/BbDatePickerInput.md +105 -42
  259. package/dist/ai/source/BbDialog.md +60 -44
  260. package/dist/ai/source/BbDropdown.md +44 -32
  261. package/dist/ai/source/BbDropdownButton.md +26 -20
  262. package/dist/ai/source/BbDropdownGroup.md +5 -5
  263. package/dist/ai/source/BbDropzone.md +53 -16
  264. package/dist/ai/source/BbForm.md +18 -7
  265. package/dist/ai/source/BbHost.md +25 -12
  266. package/dist/ai/source/BbHoverCard.md +20 -9
  267. package/dist/ai/source/BbIcon.md +9 -3
  268. package/dist/ai/source/BbIndicator.md +11 -4
  269. package/dist/ai/source/BbNumberInput.md +23 -6
  270. package/dist/ai/source/BbOffCanvas.md +73 -32
  271. package/dist/ai/source/BbPagination.md +59 -31
  272. package/dist/ai/source/BbPopover.md +28 -16
  273. package/dist/ai/source/BbProgress.md +13 -5
  274. package/dist/ai/source/BbRadio.md +16 -9
  275. package/dist/ai/source/BbRadioGroup.md +15 -4
  276. package/dist/ai/source/BbRating.md +51 -10
  277. package/dist/ai/source/BbSelect.md +56 -27
  278. package/dist/ai/source/BbSelectPopover.md +81 -35
  279. package/dist/ai/source/BbSlider.md +111 -33
  280. package/dist/ai/source/BbSmoothHeight.md +16 -7
  281. package/dist/ai/source/BbSpinner.md +9 -3
  282. package/dist/ai/source/BbSwitch.md +16 -9
  283. package/dist/ai/source/BbSwitchGroup.md +18 -7
  284. package/dist/ai/source/BbTable.md +172 -38
  285. package/dist/ai/source/BbTabs.md +58 -40
  286. package/dist/ai/source/BbTabsList.md +109 -50
  287. package/dist/ai/source/BbTabsPanels.md +65 -31
  288. package/dist/ai/source/BbTabsRoot.md +35 -24
  289. package/dist/ai/source/BbTag.md +18 -4
  290. package/dist/ai/source/BbTextInput.md +20 -3
  291. package/dist/ai/source/BbTextarea.md +15 -1
  292. package/dist/ai/source/BbTimePicker.md +81 -21
  293. package/dist/ai/source/BbTimePickerInput.md +63 -15
  294. package/dist/ai/source/BbToast.md +20 -3
  295. package/dist/ai/source/BbToastPortal.md +21 -4
  296. package/dist/ai/source/BbTooltip.md +16 -8
  297. package/dist/ai/source/BbTree.md +10 -3
  298. package/dist/ai/source/ClearableButton.md +5 -1
  299. package/dist/ai/source/CommonField.md +65 -9
  300. package/dist/ai/source/CommonFieldInput.md +61 -27
  301. package/dist/ai/source/CommonPopover.md +17 -6
  302. package/dist/ai/source/CommonTimeSelector.md +21 -2
  303. package/dist/ai/source/ErrorIcon.md +4 -0
  304. package/dist/ai/source/ListBox.md +9 -1
  305. package/dist/ai/source/OptionsContainer.md +5 -1
  306. package/dist/ai/source/WarningIcon.md +4 -0
  307. package/dist/components/BbAccordion/BbAccordion.vue.d.ts +2 -1
  308. package/dist/components/BbAccordion/BbAccordion.vue_vue_type_script_setup_true_lang.js +6 -6
  309. package/dist/components/BbAlert/BbAlert.vue.d.ts +2 -1
  310. package/dist/components/BbAlert/BbAlert.vue_vue_type_script_setup_true_lang.js +10 -10
  311. package/dist/components/BbAsterisk/BbAsterisk.vue.d.ts +3 -1
  312. package/dist/components/BbAvatar/BbAvatar.vue.d.ts +3 -1
  313. package/dist/components/BbAvatar/BbAvatar.vue_vue_type_script_setup_true_lang.js +7 -7
  314. package/dist/components/BbBadge/BbBadge.vue.d.ts +5 -3
  315. package/dist/components/BbBadge/BbBadge.vue_vue_type_script_setup_true_lang.js +7 -7
  316. package/dist/components/BbBadge/BbBadgeButton.vue.d.ts +3 -1
  317. package/dist/components/BbBadge/BbBadgeButton.vue_vue_type_script_setup_true_lang.js +7 -7
  318. package/dist/components/BbBaseButton/BbBaseButton.vue.d.ts +3 -1
  319. package/dist/components/BbBaseButton/BbBaseButton.vue_vue_type_script_setup_true_lang.js +85 -85
  320. package/dist/components/BbBaseButton/types.d.ts +8 -5
  321. package/dist/components/BbBaseButton/useLinkState.d.ts +2 -0
  322. package/dist/components/BbBaseButton/useLinkState.js +21 -20
  323. package/dist/components/BbBaseCheckboxIcon/BbBaseCheckboxIcon.vue.d.ts +3 -1
  324. package/dist/components/BbBaseRadioIcon/BbBaseRadioIcon.vue.d.ts +3 -1
  325. package/dist/components/BbBaseSwitchIcon/BbBaseSwitchIcon.vue.d.ts +3 -1
  326. package/dist/components/BbBreadcrumbs/BbBreadcrumbs.vue.d.ts +3 -1
  327. package/dist/components/BbBreadcrumbs/BbBreadcrumbs.vue_vue_type_script_setup_true_lang.js +7 -7
  328. package/dist/components/BbButton/BbButton.vue.d.ts +2 -1
  329. package/dist/components/BbButton/BbButton.vue_vue_type_script_setup_true_lang.js +93 -93
  330. package/dist/components/BbButton/types.d.ts +7 -4
  331. package/dist/components/BbCalendar/BbCalendar.vue.d.ts +157 -30
  332. package/dist/components/BbCalendar/BbCalendar.vue_vue_type_script_setup_true_lang.js +364 -331
  333. package/dist/components/BbCalendar/CalendarMonthPanel.vue_vue_type_script_setup_true_lang.js +5 -5
  334. package/dist/components/BbCalendar/types.d.ts +36 -8
  335. package/dist/components/BbCalendar/useCalendarGrid.d.ts +133 -0
  336. package/dist/components/BbCalendar/useCalendarGrid.js +193 -183
  337. package/dist/components/BbCalendar/useDayGrid.d.ts +24 -19
  338. package/dist/components/BbCalendar/useDayGrid.js +105 -102
  339. package/dist/components/BbCheckbox/BbCheckbox.vue.d.ts +4 -2
  340. package/dist/components/BbCheckboxGroup/BbCheckboxGroup.vue.d.ts +327 -2
  341. package/dist/components/BbCollapsible/BbCollapsible.vue.d.ts +3 -1
  342. package/dist/components/BbCollapsible/BbCollapsible.vue_vue_type_script_setup_true_lang.js +6 -6
  343. package/dist/components/BbColorInput/BbColorInput.vue.d.ts +8 -5
  344. package/dist/components/BbColorInput/BbColorInput.vue_vue_type_script_setup_true_lang.js +5 -5
  345. package/dist/components/BbColorInput/types.d.ts +2 -0
  346. package/dist/components/BbColorPalette/BbColorPalette.vue.d.ts +7 -5
  347. package/dist/components/BbColorPalette/BbColorPalette.vue_vue_type_script_setup_true_lang.js +216 -215
  348. package/dist/components/BbConfirm/BbConfirm.vue_vue_type_script_setup_true_lang.js +25 -25
  349. package/dist/components/BbDatePicker/BbDatePicker.vue.d.ts +206 -41
  350. package/dist/components/BbDatePicker/BbDatePicker.vue_vue_type_script_setup_true_lang.js +112 -106
  351. package/dist/components/BbDatePicker/types.d.ts +27 -8
  352. package/dist/components/BbDatePickerInput/BbDatePickerInput.vue.d.ts +519 -37
  353. package/dist/components/BbDatePickerInput/BbDatePickerInput.vue_vue_type_script_setup_true_lang.js +11 -8
  354. package/dist/components/BbDatePickerInput/types.d.ts +31 -9
  355. package/dist/components/BbDialog/BbDialog.vue.d.ts +6 -5
  356. package/dist/components/BbDialog/BbDialog.vue_vue_type_script_setup_true_lang.js +231 -233
  357. package/dist/components/BbDialog/types.d.ts +7 -7
  358. package/dist/components/BbDialog/useDialogStack.d.ts +2 -0
  359. package/dist/components/BbDialog/useDialogStack.js +6 -2
  360. package/dist/components/BbDropdown/AdaptiveDropdown.vue_vue_type_script_setup_true_lang.js +25 -25
  361. package/dist/components/BbDropdown/BbDropdown.vue.d.ts +8 -6
  362. package/dist/components/BbDropdown/BbDropdown.vue_vue_type_script_setup_true_lang.js +226 -225
  363. package/dist/components/BbDropdown/BbDropdownList.vue_vue_type_script_setup_true_lang.js +49 -49
  364. package/dist/components/BbDropdown/DropdownPipelineResolver.vue_vue_type_script_setup_true_lang.js +7 -7
  365. package/dist/components/BbDropdown/normalizeGroups.js +14 -14
  366. package/dist/components/BbDropdown/types.d.ts +5 -5
  367. package/dist/components/BbDropdown/useDropdownContext.js +1 -1
  368. package/dist/components/BbDropdown/useDropdownGroupRegistry.d.ts +1 -1
  369. package/dist/components/BbDropdownButton/BbDropdownButton.vue.d.ts +6 -4
  370. package/dist/components/BbDropdownButton/BbDropdownButton.vue_vue_type_script_setup_true_lang.js +36 -38
  371. package/dist/components/BbDropdownButton/types.js +4 -4
  372. package/dist/components/BbDropzone/BbDropzone.vue.d.ts +57 -22
  373. package/dist/components/BbDropzone/BbDropzone.vue_vue_type_script_setup_true_lang.js +4 -4
  374. package/dist/components/BbDropzone/types.d.ts +16 -4
  375. package/dist/components/BbForm/BbForm.vue.d.ts +52 -4
  376. package/dist/components/BbForm/BbForm.vue_vue_type_script_setup_true_lang.js +1 -1
  377. package/dist/components/BbHost/BbHost.vue_vue_type_script_setup_true_lang.js +19 -23
  378. package/dist/components/BbHost/BbHostOpening.js +1 -1
  379. package/dist/components/BbHoverCard/BbHoverCard.vue.d.ts +5 -4
  380. package/dist/components/BbHoverCard/BbHoverCard.vue_vue_type_script_setup_true_lang.js +116 -116
  381. package/dist/components/BbIcon/BbIcon.vue.d.ts +3 -1
  382. package/dist/components/BbIcon/BbIcon.vue_vue_type_script_setup_true_lang.js +7 -7
  383. package/dist/components/BbIndicator/BbIndicator.vue.d.ts +3 -1
  384. package/dist/components/BbNumberInput/BbNumberInput.vue.d.ts +6 -3
  385. package/dist/components/BbNumberInput/types.d.ts +2 -0
  386. package/dist/components/BbOffCanvas/BbOffCanvas.vue.d.ts +5 -4
  387. package/dist/components/BbOffCanvas/BbOffCanvas.vue_vue_type_script_setup_true_lang.js +366 -369
  388. package/dist/components/BbOffCanvas/sheetAttrs.d.ts +9 -0
  389. package/dist/components/BbOffCanvas/sheetAttrs.js +10 -0
  390. package/dist/components/BbOffCanvas/types.d.ts +7 -7
  391. package/dist/components/BbOffCanvas/useOffCanvasStack.d.ts +2 -0
  392. package/dist/components/BbOffCanvas/useOffCanvasStack.js +7 -3
  393. package/dist/components/BbPagination/BbPagination.vue.d.ts +2 -1
  394. package/dist/components/BbPagination/BbPagination.vue_vue_type_script_setup_true_lang.js +8 -8
  395. package/dist/components/BbPagination/types.d.ts +5 -5
  396. package/dist/components/BbPopover/BbPopover.vue.d.ts +5 -4
  397. package/dist/components/BbPopover/BbPopover.vue_vue_type_script_setup_true_lang.js +92 -91
  398. package/dist/components/BbProgress/BbProgress.vue.d.ts +6 -1
  399. package/dist/components/BbRadio/BbRadio.vue.d.ts +4 -2
  400. package/dist/components/BbRadioGroup/BbRadioGroup.vue.d.ts +281 -1
  401. package/dist/components/BbRating/BbRating.vue.d.ts +4 -2
  402. package/dist/components/BbRating/BbRating.vue_vue_type_script_setup_true_lang.js +7 -7
  403. package/dist/components/BbSelect/BbSelect.vue.d.ts +575 -4
  404. package/dist/components/BbSelect/BbSelect.vue_vue_type_script_setup_true_lang.js +7 -7
  405. package/dist/components/BbSelect/types.d.ts +12 -2
  406. package/dist/components/BbSelectPopover/BbSelectPopover.vue.d.ts +105 -3
  407. package/dist/components/BbSelectPopover/BbSelectPopover.vue_vue_type_script_setup_true_lang.js +688 -685
  408. package/dist/components/BbSelectPopover/types.d.ts +9 -1
  409. package/dist/components/BbSlider/BbSlider.vue.d.ts +135 -33
  410. package/dist/components/BbSlider/BbSlider.vue_vue_type_script_setup_true_lang.js +5 -5
  411. package/dist/components/BbSlider/types.d.ts +19 -4
  412. package/dist/components/BbSmoothHeight/BbSmoothHeight.vue.d.ts +3 -1
  413. package/dist/components/BbSpinner/BbSpinner.vue.d.ts +3 -1
  414. package/dist/components/BbSwitch/BbSwitch.vue.d.ts +4 -2
  415. package/dist/components/BbSwitchGroup/BbSwitchGroup.vue.d.ts +131 -1
  416. package/dist/components/BbTable/BbTable.vue.d.ts +5 -2
  417. package/dist/components/BbTable/BbTable.vue_vue_type_script_setup_true_lang.js +593 -578
  418. package/dist/components/BbTable/types.d.ts +14 -1
  419. package/dist/components/BbTable/utils.d.ts +2 -1
  420. package/dist/components/BbTable/utils.js +37 -38
  421. package/dist/components/BbTabs/BbTabs.vue.d.ts +96 -2
  422. package/dist/components/BbTabs/BbTabs.vue_vue_type_script_setup_true_lang.js +8 -6
  423. package/dist/components/BbTabs/BbTabsList.vue.d.ts +11 -1
  424. package/dist/components/BbTabs/BbTabsList.vue_vue_type_script_setup_true_lang.js +102 -92
  425. package/dist/components/BbTabs/BbTabsPanels.vue.d.ts +9 -1
  426. package/dist/components/BbTabs/BbTabsPanels.vue_vue_type_script_setup_true_lang.js +20 -17
  427. package/dist/components/BbTabs/BbTabsRoot.vue_vue_type_script_setup_true_lang.js +1 -1
  428. package/dist/components/BbTabs/types.d.ts +34 -23
  429. package/dist/components/BbTag/BbTag.vue.d.ts +5 -2
  430. package/dist/components/BbTag/types.d.ts +2 -0
  431. package/dist/components/BbTextInput/BbTextInput.vue.d.ts +195 -2
  432. package/dist/components/BbTextInput/BbTextInput.vue_vue_type_script_setup_true_lang.js +5 -5
  433. package/dist/components/BbTextInput/types.d.ts +2 -0
  434. package/dist/components/BbTextarea/BbTextarea.vue.d.ts +193 -2
  435. package/dist/components/BbTextarea/types.d.ts +2 -0
  436. package/dist/components/BbTimePicker/BbTimePicker.vue.d.ts +78 -38
  437. package/dist/components/BbTimePicker/BbTimePicker.vue_vue_type_script_setup_true_lang.js +138 -137
  438. package/dist/components/BbTimePicker/types.d.ts +18 -4
  439. package/dist/components/BbTimePickerInput/BbTimePickerInput.vue.d.ts +272 -33
  440. package/dist/components/BbTimePickerInput/BbTimePickerInput.vue_vue_type_script_setup_true_lang.js +16 -16
  441. package/dist/components/BbTimePickerInput/types.d.ts +20 -5
  442. package/dist/components/BbToast/BbToastMessage.vue_vue_type_script_setup_true_lang.js +6 -6
  443. package/dist/components/BbToast/BbToastRegion.vue_vue_type_script_setup_true_lang.js +20 -20
  444. package/dist/components/BbTooltip/BbTooltip.vue.d.ts +3 -2
  445. package/dist/components/BbTooltip/BbTooltip.vue_vue_type_script_setup_true_lang.js +109 -109
  446. package/dist/components/BbTree/BbTree.vue.d.ts +1 -1
  447. package/dist/components/ClearableButton/ClearableButton.vue.d.ts +3 -1
  448. package/dist/components/CloseIcon/CloseButton.vue.d.ts +3 -1
  449. package/dist/components/CloseIcon/CloseButton.vue.js +1 -1
  450. package/dist/components/CommonField/CommonField.vue.d.ts +3 -1
  451. package/dist/components/CommonFieldInput/CommonFieldInput.vue.d.ts +5 -3
  452. package/dist/components/CommonPopover/CommonPopover.vue.d.ts +5 -4
  453. package/dist/components/CommonPopover/CommonPopover.vue_vue_type_script_setup_true_lang.js +55 -55
  454. package/dist/components/ErrorIcon/ErrorIcon.vue.d.ts +3 -1
  455. package/dist/components/FlatListBox/FlatListBox.vue_vue_type_script_setup_true_lang.js +124 -124
  456. package/dist/components/GroupedListBox/GroupedListBox.vue_vue_type_script_setup_true_lang.js +71 -71
  457. package/dist/components/ListBox/ListBox.vue.d.ts +1 -1
  458. package/dist/components/OptionsContainer/OptionsContainer.vue.d.ts +1 -1
  459. package/dist/components/OptionsContainer/OptionsContainer.vue_vue_type_script_setup_true_lang.js +4 -4
  460. package/dist/components/Transitions/Slide.vue.d.ts +1 -1
  461. package/dist/components/WarningIcon/WarningIcon.vue.d.ts +3 -1
  462. package/dist/composables/autoHost.d.ts +22 -0
  463. package/dist/composables/autoHost.js +20 -0
  464. package/dist/composables/hostOpenings.d.ts +3 -3
  465. package/dist/composables/hostOpenings.js +1 -1
  466. package/dist/composables/hostRegistry.d.ts +10 -2
  467. package/dist/composables/hostRegistry.js +5 -3
  468. package/dist/composables/overlayRegistry.d.ts +1 -1
  469. package/dist/composables/overlayRegistry.js +2 -2
  470. package/dist/composables/{useBbDialogContext.d.ts → useBbDialog.d.ts} +9 -9
  471. package/dist/composables/{useBbDialogContext.js → useBbDialog.js} +4 -4
  472. package/dist/composables/{useBbDropdownContext.d.ts → useBbDropdown.d.ts} +14 -14
  473. package/dist/composables/{useBbDropdownContext.js → useBbDropdown.js} +2 -2
  474. package/dist/composables/{useBbFormContext.d.ts → useBbForm.d.ts} +8 -8
  475. package/dist/composables/{useBbFormContext.js → useBbForm.js} +3 -3
  476. package/dist/composables/useBbOffCanvas.d.ts +23 -0
  477. package/dist/composables/{useBbOffCanvasContext.js → useBbOffCanvas.js} +3 -3
  478. package/dist/composables/{useBbTableContext.d.ts → useBbTable.d.ts} +29 -29
  479. package/dist/composables/{useBbTableContext.js → useBbTable.js} +2 -2
  480. package/dist/composables/{useBbTabsContext.d.ts → useBbTabs.d.ts} +19 -3
  481. package/dist/composables/useBbTabs.js +266 -0
  482. package/dist/composables/useConfirm.d.ts +6 -7
  483. package/dist/composables/useConfirm.js +1 -1
  484. package/dist/composables/useOnDemandOpener.d.ts +4 -4
  485. package/dist/composables/useOnDemandOpener.js +1 -1
  486. package/dist/composables/useToast.d.ts +4 -5
  487. package/dist/composables/useToast.js +1 -1
  488. package/dist/directives/bbDialog.d.ts +1 -1
  489. package/dist/directives/bbDropdown.js +3 -3
  490. package/dist/directives/bbOffCanvas.d.ts +1 -1
  491. package/dist/directives/overlayTrigger.js +18 -18
  492. package/dist/index.d.ts +15 -15
  493. package/dist/index.js +55 -55
  494. package/dist/llms-full.txt +4355 -2761
  495. package/dist/llms-medium.txt +127 -93
  496. package/dist/llms.txt +12 -12
  497. package/dist/nuxt-auto-imports.js +6 -6
  498. package/dist/nuxt.js +1 -1
  499. package/dist/plugin.js +30 -28
  500. package/dist/runtime/nuxt-plugin.js +30 -28
  501. package/dist/styles.css +2 -2
  502. package/dist/types/ShapeErased.d.ts +15 -0
  503. package/dist/types/fallthrough.d.ts +134 -0
  504. package/dist/utilities/functions/normalizeDateBound.d.ts +7 -5
  505. package/dist/utilities/functions/normalizeDateBound.js +9 -9
  506. package/dist/utils/versionCheck.js +1 -1
  507. package/llms.txt +12 -12
  508. package/package.json +1 -1
  509. package/scripts/lib/adoption-checklist.json +2 -1
  510. package/scripts/lib/css-class-surface.mjs +39 -3
  511. package/scripts/lib/eslint-disable.mjs +9 -1
  512. package/scripts/lib/eslint-plugin.d.ts +7 -1
  513. package/scripts/lib/eslint-plugin.mjs +280 -3
  514. package/scripts/lib/form-v-model.mjs +2 -2
  515. package/scripts/lib/helper-canon.mjs +34 -2
  516. package/scripts/lib/helpers-add.mjs +80 -13
  517. package/scripts/lib/hidden-label-placeholder.mjs +138 -0
  518. package/scripts/lib/html-attributes.mjs +82 -0
  519. package/scripts/lib/idiom-scan.mjs +175 -2
  520. package/scripts/lib/portal-names.mjs +3 -3
  521. package/scripts/lib/prefer-v-bb-dialog.mjs +1 -1
  522. package/scripts/lib/tab-links.mjs +209 -0
  523. package/scripts/lib/token-color-mix.mjs +114 -0
  524. package/scripts/lib/toolchain-check.mjs +34 -3
  525. package/scripts/lib/unstyled-variants.mjs +57 -0
  526. package/scripts/lib/validate-bb-markup.mjs +72 -1
  527. package/dist/composables/useBbOffCanvasContext.d.ts +0 -23
  528. package/dist/composables/useBbTabsContext.js +0 -252
@@ -29,7 +29,7 @@
29
29
  | `--gap` | `pt:action` | `BbButton` | between icon and label |
30
30
  | `--bg` | `pt:action` | `BbButton` | the plate |
31
31
  | `--bg-hover` | `pt:action` | `BbButton` | also the focus-visible fill; no change by default |
32
- | `--bg-pressed` | `pt:action` | `BbButton` | fill while [aria-pressed='true'] |
32
+ | `--bg-pressed` | `pt:action` | `BbButton` | fill while pressed, or open (aria-expanded) |
33
33
  | `--fg` | `pt:action` | `BbButton` | label and icons (icons paint currentColor) |
34
34
  | `--border-color` | `pt:action` | `BbButton` | the frame; its width is --bw |
35
35
  | `--ring-color` | `pt:action` | `BbButton` | focus ring colour, per variant |
@@ -37,8 +37,8 @@
37
37
  | `--bw` | `pt:action` | `BbButton` | border width |
38
38
  | `--fg-hover` | `pt:action` | `BbButton` | label and icons on hover (and focus-visible) |
39
39
  | `--border-hover` | `pt:action` | `BbButton` | the frame on hover (and focus-visible) |
40
- | `--fg-pressed` | `pt:action` | `BbButton` | label and icons while [aria-pressed='true'] |
41
- | `--border-pressed` | `pt:action` | `BbButton` | the frame while [aria-pressed='true'] |
40
+ | `--fg-pressed` | `pt:action` | `BbButton` | label and icons while pressed or open |
41
+ | `--border-pressed` | `pt:action` | `BbButton` | the frame while pressed or open |
42
42
  | `--bg-disabled` | `pt:action` | `BbButton` | the plate while disabled (not loading) |
43
43
  | `--fg-disabled` | `pt:action` | `BbButton` | label and icons while disabled |
44
44
  | `--border-disabled` | `pt:action` | `BbButton` | the frame while disabled |
@@ -69,17 +69,22 @@ first — this is that gate.
69
69
 
70
70
  ### Setup
71
71
 
72
- Mount `<BbHost />` **exactly once, at the app root** (`App.vue` under Vue,
73
- `app.vue` under Nuxt, the `createInertiaApp` render root under Inertia) — a
74
- single instance serves the whole app, and `confirm()` can then be called from
75
- anywhere, components and stores alike. **Every call opens its own dialog**,
76
- and a new one covers the open one, which stays pending and comes back when
77
- the newer one closes (see [Several confirms at once](#several-confirms-at-once)).
78
- A second host renders nothing (a dev-mode console warning says so). With no
79
- host, `await confirm(...)` resolves `false` after one second, with a dev
80
- warning. A host that unmounts while its dialog is open (a layout the user
81
- navigated out of) gets the same second to come back; after that the open
82
- confirm resolves `false` without running a callback, so it never hangs.
72
+ There is nothing to mount: the plugin (`app.use(bitbossUiPlugin)`, the Nuxt
73
+ module) renders the app's `<BbHost />`, which renders every confirm.
74
+ `confirm()` can be called from anywhere, components and stores alike.
75
+ **Every call opens its own dialog**, and a new one covers the open one, which
76
+ stays pending and comes back when the newer one closes (see
77
+ [Several confirms at once](#several-confirms-at-once)). A host that unmounts
78
+ while its dialog is open (an area layout the user navigated out of) gets one
79
+ second to come back; after that the open confirm resolves `false` without
80
+ running a callback, so it never hangs.
81
+
82
+ ```ts
83
+ const { confirm } = useConfirm();
84
+ if (await confirm({ title: 'Delete this file?', variant: 'destructive' })) {
85
+ await remove();
86
+ }
87
+ ```
83
88
 
84
89
  **Areas with their own look.** A confirm takes the passthrough scope and the
85
90
  tokens of the component that called `useConfirm()`, wherever the host is
@@ -88,21 +93,6 @@ gets confirms in its area's look with nothing to set up. A component portal
88
93
  injects from that component's tree too. A `useConfirm()` called outside a
89
94
  component (a store, module level) takes the host's.
90
95
 
91
- ```vue
92
- <template>
93
- <RouterView />
94
- <BbHost />
95
- </template>
96
-
97
- <script setup lang="ts">
98
- import { BbHost } from 'bitboss-ui';
99
- </script>
100
- ```
101
-
102
- **Every example on this page mounts its own `<BbHost />` only because a
103
- standalone example has no app root to mount it in.** In a real app the host is
104
- already mounted at the root; a page that calls `confirm()` mounts nothing.
105
-
106
96
  Everything — content, buttons, behavior — travels in the message you pass to
107
97
  `confirm()`; the width every confirm defaults to is the plugin's
108
98
  `confirm.defaultSize` (see [Size, fullscreen and focus](#size-fullscreen-and-focus)).
@@ -111,8 +101,10 @@ otherwise).
111
101
 
112
102
  ### The destructive flow
113
103
 
114
- The canonical pattern: `await confirm(...)`, then act only on a truthy result.
115
- Set `variant: 'destructive'` so the dialog reads as dangerous and the Yes button
104
+ Pick by where the work runs. A server call or a visit goes in Yes's `onClick`
105
+ (next section): it spins there, and a failure rejects `confirm()`. A local,
106
+ instant step (removing a row you hold, leaving a page) is `await confirm(...)`,
107
+ then act only on a truthy result, as below. Set `variant: 'destructive'` so the dialog reads as dangerous and the Yes button
116
108
  inherits the destructive button style automatically. Everything after the
117
109
  `await` is your normal code — the dialog has already resolved. A `BbButton`
118
110
  whose click awaits `confirm()` spins until it is answered, like any async
@@ -148,18 +140,11 @@ click; `disable-auto-loading` on that button turns it off.
148
140
  <p v-if="keys.length === 0" class="text-xs text-(--bb-text-muted)">
149
141
  No active keys.
150
142
  </p>
151
-
152
- <!--
153
- Standalone example: it mounts its own host because it has no app root.
154
- A real app mounts exactly one <BbHost /> at the app root, and pages
155
- mount none. See ai/guides/agent-contract.md § Global Host Rule.
156
- -->
157
- <BbHost />
158
143
  </div>
159
144
  </template>
160
145
  <script setup lang="ts">
161
146
  import { ref } from 'vue';
162
- import { BbButton, BbHost, useConfirm } from 'bitboss-ui';
147
+ import { BbButton, useConfirm } from 'bitboss-ui';
163
148
 
164
149
  type ApiKey = { id: string; label: string; masked: string; created: string };
165
150
 
@@ -210,15 +195,16 @@ plain string still works for one-offs) — you provide the
210
195
 
211
196
  ### Async actions and busy state
212
197
 
213
- For work that should finish _before_ the dialog closes, put it in the button's
198
+ For server work (anything that can fail or take time), put it in the button's
214
199
  `onClick` instead of after the `await`: the button shows a spinner while the
215
200
  promise runs, the opposite button is disabled, the X is hidden and dismissal
216
201
  is blocked until it settles. Add `returning: true` to resolve with the
217
202
  callback's own return value rather than a plain boolean. One sharp edge:
218
203
  `confirm()` **rejects** when a button's `onClick` throws — wrap the await in
219
- `try/catch` when the work can fail. An Inertia visit returns no promise: wrap
220
- it, as in `ai/composables/useConfirm.md` § async work, rather than calling
221
- `close()` from its callbacks.
204
+ `try/catch` when the work can fail. An Inertia visit returns no promise: make
205
+ it with the Inertia helpers' `usePromiseRouter`, whose promise rejects with the
206
+ error bag itself on a validation error (not `{ errors }`), rather than calling
207
+ `close()` from its callbacks (`ai/composables/useConfirm.md` § Async work).
222
208
 
223
209
  **Async publish with a spinner**
224
210
 
@@ -236,17 +222,11 @@ it, as in `ai/composables/useConfirm.md` § async work, rather than calling
236
222
  Publish article
237
223
  </BbButton>
238
224
  </div>
239
- <!--
240
- Standalone example: it mounts its own host because it has no app root.
241
- A real app mounts exactly one <BbHost /> at the app root, and pages
242
- mount none. See ai/guides/agent-contract.md § Global Host Rule.
243
- -->
244
- <BbHost />
245
225
  </div>
246
226
  </template>
247
227
  <script setup lang="ts">
248
228
  import { ref } from 'vue';
249
- import { BbButton, BbHost, useConfirm } from 'bitboss-ui';
229
+ import { BbButton, useConfirm } from 'bitboss-ui';
250
230
 
251
231
  const status = ref('Draft');
252
232
 
@@ -333,17 +313,11 @@ the array (`as const` keeps the literal types; without it each handler infers
333
313
  Close editor
334
314
  </BbButton>
335
315
  </div>
336
- <!--
337
- Standalone example: it mounts its own host because it has no app root.
338
- A real app mounts exactly one <BbHost /> at the app root, and pages
339
- mount none. See ai/guides/agent-contract.md § Global Host Rule.
340
- -->
341
- <BbHost />
342
316
  </div>
343
317
  </template>
344
318
  <script setup lang="ts">
345
319
  import { ref } from 'vue';
346
- import { BbButton, BbHost, useConfirm } from 'bitboss-ui';
320
+ import { BbButton, useConfirm } from 'bitboss-ui';
347
321
 
348
322
  const decision = ref('none yet');
349
323
 
@@ -457,17 +431,11 @@ edits, so every implicit way out is blocked and the user answers with a button.
457
431
  <BbButton variant="primary" @click="save">Save</BbButton>
458
432
  <BbButton variant="ghost" @click="cancel">Cancel</BbButton>
459
433
  </div>
460
- <!--
461
- Standalone example: it mounts its own host because it has no app root.
462
- A real app mounts exactly one <BbHost /> at the app root, and pages
463
- mount none. See ai/guides/agent-contract.md § Global Host Rule.
464
- -->
465
- <BbHost />
466
434
  </div>
467
435
  </template>
468
436
  <script setup lang="ts">
469
437
  import { ref } from 'vue';
470
- import { BbButton, BbHost, BbTextInput, useConfirm } from 'bitboss-ui';
438
+ import { BbButton, BbTextInput, useConfirm } from 'bitboss-ui';
471
439
 
472
440
  const saved = ref('Ada Lovelace');
473
441
  const draft = ref<string | null>(saved.value);
@@ -541,17 +509,11 @@ By default the dialog closes as soon as the promise settles. Set
541
509
  <p class="text-center text-sm">{{ progressText }}</p>
542
510
  </template>
543
511
  </BbConfirmPortal>
544
- <!--
545
- Standalone example: it mounts its own host because it has no app root.
546
- A real app mounts exactly one <BbHost /> at the app root, and pages
547
- mount none. See ai/guides/agent-contract.md § Global Host Rule.
548
- -->
549
- <BbHost />
550
512
  </div>
551
513
  </template>
552
514
  <script setup lang="ts">
553
515
  import { ref } from 'vue';
554
- import { BbButton, BbHost, BbConfirmPortal, useConfirm } from 'bitboss-ui';
516
+ import { BbButton, BbConfirmPortal, useConfirm } from 'bitboss-ui';
555
517
 
556
518
  const status = ref('No export yet');
557
519
  const progressText = ref('Everything in this workspace is bundled into a ZIP.');
@@ -658,17 +620,11 @@ portal never renders.
658
620
  </div>
659
621
  </template>
660
622
  </BbConfirmPortal>
661
- <!--
662
- Standalone example: it mounts its own host because it has no app root.
663
- A real app mounts exactly one <BbHost /> at the app root, and pages
664
- mount none. See ai/guides/agent-contract.md § Global Host Rule.
665
- -->
666
- <BbHost />
667
623
  </div>
668
624
  </template>
669
625
  <script setup lang="ts">
670
626
  import { ref } from 'vue';
671
- import { BbButton, BbHost, BbConfirmPortal, useConfirm } from 'bitboss-ui';
627
+ import { BbButton, BbConfirmPortal, useConfirm } from 'bitboss-ui';
672
628
 
673
629
  const result = ref('Member of Acme since 2024');
674
630
 
@@ -728,8 +684,8 @@ custom `actions` entry — at the button's root (a listener runs after the
728
684
  button's own). State `open`. Backdrop is `::backdrop` — CSS, not pt.
729
685
 
730
686
  `<BbHost />` takes no `pt`: every confirm is styled from the build plugin's
731
- global map, under `BbConfirm` (or a named scope's, with `<BbPtScope>` around
732
- the host). A muted wash on `header`, Yes/No spread on `footer`, a muted ✕ on
687
+ global map, under `BbConfirm` (or a named scope's, for a confirm called
688
+ inside a `<BbPtScope>`). A muted wash on `header`, Yes/No spread on `footer`, a muted ✕ on
733
689
  `close`, a primary ring with offset while `root:open`:
734
690
 
735
691
  ```ts
@@ -24,5 +24,5 @@
24
24
 
25
25
  ## See Also
26
26
 
27
- - [BbHost](./BbHost.md) — Renders confirm() and toast(); one, at the app root.
27
+ - [BbHost](./BbHost.md) — Renders confirm() and toast(); the plugin renders one, place one per scoped area.
28
28
  - [useConfirm](./composables/useConfirm.md)
@@ -14,7 +14,6 @@
14
14
 
15
15
  | pt part | Lands on | In |
16
16
  | --- | --- | --- |
17
- | `pt:panel` | the root of `CommonPopover` | `CommonPopover` _(internal)_ |
18
17
  | `pt:panel` | `pt:root` of `BbOffCanvas` | `BbOffCanvas` ([contract](./BbOffCanvas.md)) |
19
18
  | `pt:sheet` | `pt:root` of `BbOffCanvas` | `BbOffCanvas` ([contract](./BbOffCanvas.md)) |
20
19
 
@@ -220,6 +219,42 @@ const time = ref<string | null>(null);
220
219
  </template>
221
220
  ```
222
221
 
222
+ ### Several months
223
+
224
+ `:number-of-months="2"` puts two months side by side in the popover. It is the
225
+ calendar's prop (`BbCalendar`), passed through: arrows and buttons page all the
226
+ months at once, and the keyboard crosses from one month into the next. A
227
+ popover too narrow for them all wraps the months onto the next row; the phone
228
+ sheet always shows one month.
229
+
230
+ **A trip across the month line**
231
+
232
+ ```vue
233
+ <template>
234
+ <BbDatePicker
235
+ v-model="trip"
236
+ floating
237
+ label="Trip dates"
238
+ :number-of-months="2"
239
+ range
240
+ >
241
+ <template #activator="{ props, text }">
242
+ <BbButton v-bind="props" append:icon="lucide:calendar" variant="outline">
243
+ {{ text || 'Pick your trip' }}
244
+ </BbButton>
245
+ </template>
246
+ </BbDatePicker>
247
+ </template>
248
+
249
+ <script setup lang="ts">
250
+ import { ref } from 'vue';
251
+ import { BbButton, BbDatePicker } from 'bitboss-ui';
252
+
253
+ /** Two months in the popover; the phone sheet still shows one. */
254
+ const trip = ref<string[]>([]);
255
+ </script>
256
+ ```
257
+
223
258
  ### Decorating days
224
259
 
225
260
  The picker passes its day slots straight to the calendar inside it, so the four
@@ -434,12 +469,13 @@ and digit typeahead; the time rail exposes labelled columns. Always pass a
434
469
  | `max` | `string \| undefined` | | | Maximum selectable value, in this `type`'s shape. A finer bound is accepted and ceiled to the unit, with a warning. |
435
470
  | `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 accepted and floored to the unit, with a warning. |
436
471
  | `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`). |
437
- | `multiple` | `boolean \| undefined` | `false` | | Multi-selection: each pick toggles a value in a sorted array (days, months or years), and the panel stays open until dismissed. Needs an array `modelValue` (`[]` when empty, never `null`). Throws with `range` or `type="datetime"`. |
472
+ | `multiple` | `boolean` | `false` | | Multi-selection: each pick toggles a value in a sorted array (days, months or years), and the panel stays open until dismissed. Needs an array `modelValue` (`[]` when empty, never `null`). Throws with `range` or `type="datetime"`. |
473
+ | `numberOfMonths` | `number \| undefined` | `1` | | How many months the popover shows side by side (day grids only); the phone sheet always shows one. Too narrow for them all, the months wrap. |
438
474
  | `offCanvasProps` | `Partial<BbOffCanvasProps> \| undefined` | | | Props for the phone sheet (the `BbOffCanvas` that `adaptive` renders on mobile), spread over its defaults. A `pt` inside it styles only the sheet (passthrough guide § Inside the sheet). The sheet hides its ✕; `{ hideClose: false }` brings it back. |
439
475
  | `offset` | `number \| undefined` | `4` | | Space the popover keeps from the activator. |
440
476
  | `padding` | `number \| undefined` | | | Minimum empty space to keep from the edge of the page. |
441
477
  | `placement` | `'top'` \| `'bottom'` \| `'left'` \| `'right'` \| `'top-start'` \| `'top-end'` \| `'right-start'` \| `'right-end'` \| `'bottom-start'` \| `'bottom-end'` \| `'left-start'` \| `'left-end'` | | | Position of the popover relative to the activator/anchor. |
442
- | `range` | `boolean \| undefined` | `false` | | Enables range selection (`[start, end]`). |
478
+ | `range` | `boolean` | `false` | | Enables range selection (`[start, end]`). |
443
479
  | `readonly` | `boolean \| undefined` | `false` | | Prevents opening while keeping the activator visible. |
444
480
  | `seconds` | `boolean \| undefined` | `false` | | Adds the seconds column (requires `type="datetime"`). |
445
481
  | `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`. |
@@ -456,7 +492,7 @@ and digit typeahead; the time rail exposes labelled columns. Always pass a
456
492
  | Part | What it is |
457
493
  | --- | --- |
458
494
  | `root` | The floating element — an invisible positioning wrapper; a `class` on the component lands here. No node on the phone sheet: style what you see with `panel`. |
459
- | `header` | The navigation bar: the previous / next arrows and the month / year headings. |
495
+ | `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). |
460
496
  | `arrow` | The previous / next buttons — a broadcast. |
461
497
  | `month` | The month heading button; it opens the month panel. |
462
498
  | `year` | The year heading button; it opens the year panel. |
@@ -537,7 +573,7 @@ Set these on the element, or on a class you put on it, to retune this component
537
573
  - **CSS custom properties** listed on a node are declared on THAT node's root and read by elements inside it. Set one on that node's root or on the element inside it that reads it — the pt part that lands there is how you reach it (`pt:box="[--border-color:…]"` on a text input) — never on `BbDatePicker`'s root, where the node's own declaration masks it (design-tokens guide, _Overriding one from a consumer app_, rule 0).
538
574
  - Listed nodes are the ones `BbDatePicker`'s API reaches or that declare a documented CSS variable; the rest fold into "also mounts". The complete tree, repeats and undocumented locals included, is `manifest/components/BbDatePicker.tree.json`.
539
575
 
540
- - `BbDatePicker` _(this component)_ — its own template binds: `panel` → `div`, `panel` → `CommonPopover`; hands `BbCalendar` the pt map ` passthrough.forward(DATE_PICKER_CALENDAR_PARTS, BB_CALENDAR_PT.states) ` (ours → theirs); hands `BbOffCanvas` the pt map `{ panel: 'root', sheet: 'root' }` (ours → theirs)
576
+ - `BbDatePicker` _(this component)_ — its own template binds: `panel` → `div`; hands `BbCalendar` the pt map ` passthrough.forward(DATE_PICKER_CALENDAR_PARTS, BB_CALENDAR_PT.states) ` (ours → theirs); hands `BbOffCanvas` the pt map `{ panel: 'root', sheet: 'root' }` (ours → theirs)
541
577
  - `BbCalendar` _(public — [contract](./BbCalendar.md))_ — its own pt parts (`BbCalendar`): `header` → `div.bb-calendar__header`, `arrow` → `BbBaseButton`, `month` → `BbBaseButton`, `year` → `BbBaseButton`, `day` → `div.bb-calendar__day`, `dayButton` → `button.bb-calendar__day-button`; documented CSS variables: `--cell`, `--unit-row`; also mounts `ScaleFade`, `Slide`, `CalendarMonthPanel`, `CalendarYearPanel`
542
578
  - `BbBaseButton` _(public — [contract](./BbBaseButton.md))_ — its own pt parts (`BbBaseButton`): `root` → `RouterComponent`, `root` → `a`, `root` → `component`; also mounts `RouterComponent`
543
579
  - `CommonTimeSelector` _(internal — not importable, reach it through `BbCalendar`)_ — its own pt parts (`BbCalendar`): `header` → `div.bb-time-selector__header`, `cellColumnHeader` → `div.bb-time-selector__cell-column-header`, `item` → `BbBaseButton`; documented CSS variables: `--time-mark`; also mounts `BbBaseButton`
@@ -40,7 +40,7 @@
40
40
  | `--border-focus` | `pt:box` | `CommonFieldInput` | frame while focused, or --active |
41
41
  | `--ring-size` | `pt:box` | `CommonFieldInput` | ring width; 0 is a variant declining the ring |
42
42
  | `--ring-color` | `pt:box` | `CommonFieldInput` | ring colour; state owns it, not variants |
43
- | `--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. |
43
+ | `--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. |
44
44
  | `--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. |
45
45
  | `--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. |
46
46
  | `--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. |
@@ -176,6 +176,36 @@ The value is typed `string | string[] | null` in either mode, so `v-model`
176
176
  needs nothing, and an explicit `@update:model-value` handler narrows in one
177
177
  line: `if (!Array.isArray(value)) return;` before treating it as the range.
178
178
 
179
+ For a window that often crosses the month line, `:number-of-months="2"` shows
180
+ two months side by side in the popover (one in the phone sheet). If the
181
+ popover doesn't have room for both, the second month wraps under the first.
182
+
183
+ **Booking — two months in the popover**
184
+
185
+ ```vue
186
+ <template>
187
+ <BbDatePickerInput
188
+ v-model="booking"
189
+ class="max-w-sm"
190
+ floating
191
+ label="Check-in → check-out"
192
+ :min="today"
193
+ :number-of-months="2"
194
+ range
195
+ />
196
+ </template>
197
+
198
+ <script setup lang="ts">
199
+ import { ref } from 'vue';
200
+ import dayjs from 'dayjs';
201
+ import { BbDatePickerInput } from 'bitboss-ui';
202
+
203
+ const today = dayjs().format('YYYY-MM-DD');
204
+ /** Typed or picked: the popover shows this month and the next. */
205
+ const booking = ref<string[]>([]);
206
+ </script>
207
+ ```
208
+
179
209
  Range mode still lets the user **type** both the start and end dates directly —
180
210
  it does not force the field read-only. If a range comes in reversed (end before
181
211
  start) it is swapped for you on commit (see _Invalid input_). To prevent typing
@@ -613,7 +643,8 @@ the single tab stop). Once focused:
613
643
 
614
644
  - **arrow keys** move by day (←/→) and week (↑/↓);
615
645
  - **Home** / **End** jump to the week's edges, **PageUp** / **PageDown** change
616
- month, and type-ahead jumps within the visible month;
646
+ month, and type-ahead jumps within the focused month (with
647
+ `number-of-months`, every key crosses into the next month on show);
617
648
  - **Enter** / **Space** select the focused day and close the surface;
618
649
  - the month and year headings open their own pick panels (Enter toggles them).
619
650
 
@@ -896,7 +927,7 @@ label>')` matches nothing; query each segment by its own label instead. See
896
927
  | `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). |
897
928
  | `hasErrors` | `boolean \| undefined` | `false` | | Define if the component should be in an error state. It usually attaches a CSS class for styling purposes. |
898
929
  | `hasWarnings` | `boolean \| undefined` | `false` | | Define if the component should be in a warning state. Same chrome as errors with `--bb-warn`; errors take priority. |
899
- | `hideLabel` | `boolean \| undefined` | `false` | | Visually hides the label of the input while maintaining accessibility. |
930
+ | `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. |
900
931
  | `hint` | `string \| undefined` | | | Text box to be displayed near the input, usually to indicate instructions. |
901
932
  | `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. |
902
933
  | `inputAlign` | `'top'` \| `'center'` \| `'bottom'` | | | 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. |
@@ -910,11 +941,12 @@ label>')` matches nothing; query each segment by its own label instead. See
910
941
  | `min` | `string \| undefined` | | | Minimum selectable date in `YYYY-MM-DD` format — or, with `type="datetime"`, `YYYY-MM-DDTHH:mm` to tighten the boundary day to a minute. Values outside both patterns throw during setup to surface configuration mistakes. |
911
942
  | `modelValue` | `string \| string[] \| null \| undefined` | | | Used by v-model. Can be null, a single string, or an array of strings based on whether a range or single date is needed. |
912
943
  | `name` | `string \| undefined` | | | Defines the name of the input. |
944
+ | `numberOfMonths` | `number \| undefined` | `1` | | How many months the calendar popover shows side by side (day grids only); the phone sheet always shows one. Too narrow for them all, the months wrap. |
913
945
  | `offCanvasProps` | `Partial<BbOffCanvasProps> \| undefined` | | | Props for the phone sheet (the `BbOffCanvas` that `adaptive` renders on mobile), spread over its defaults. A `pt` inside it styles only the sheet (passthrough guide § Inside the sheet). The sheet hides its ✕; `{ hideClose: false }` brings it back. |
914
946
  | `persistentHint` | `boolean \| undefined` | `false` | | Keeps the hint displayed. |
915
947
  | `placeholder` | `string \| undefined` | | | Text shown while the field is empty. |
916
948
  | `prepend:icon` | `string \| undefined` | | | Name of the icon to be added at the start of the input. |
917
- | `range` | `boolean \| undefined` | `false` | | Selects a range of dates between two dates. It selects all of the days between start and end. |
949
+ | `range` | `boolean` | `false` | | Selects a range of dates between two dates. It selects all of the days between start and end. |
918
950
  | `readonly` | `boolean \| undefined` | `false` | | Sets the input in a readonly state. |
919
951
  | `required` | `boolean \| undefined` | `false` | | Sets the input as required. |
920
952
  | `reverse` | `boolean \| undefined` | `false` | | Reverses the layout. Applicable in every direction the order of the label and the input is swapped. |
@@ -952,7 +984,7 @@ label>')` matches nothing; query each segment by its own label instead. See
952
984
  | `activator` | The button in the box that opens the calendar. Merged after the picker's own activator props and handlers, so a listener of yours runs after ours. Its glyph is not a part. |
953
985
  | `panel` | The calendar surface — the popover's painted bubble on desktop, the sheet itself on a phone. It carries the calendar's sizing tokens (`pt:panel="[--cell:36px]"`). |
954
986
  | `sheet` | The bottom sheet around the calendar on a phone only. |
955
- | `header` | The navigation bar: the previous / next arrows and the month / year headings. |
987
+ | `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). |
956
988
  | `arrow` | The previous / next buttons — a broadcast. |
957
989
  | `month` | The month heading button; it opens the month panel. |
958
990
  | `year` | The year heading button; it opens the year panel. |
@@ -1032,7 +1064,7 @@ Set these on the element, or on a class you put on it, to retune this component
1032
1064
  - Listed nodes are the ones `BbDatePickerInput`'s API reaches or that declare a documented CSS variable; the rest fold into "also mounts". The complete tree, repeats and undocumented locals included, is `manifest/components/BbDatePickerInput.tree.json`.
1033
1065
 
1034
1066
  - `BbDatePickerInput` _(this component)_ — its own template binds: `controlAttrs` → `input.bb-segmented-field__input`, `input` → `input.bb-segmented-field__input`, `activator` → `button.bb-segmented-field__activator`, `suffix` → `span.bb-field-input__suffix`; hands `BbDatePicker` the pt map `passthrough.forward(PICKER_PARTS, BB_DATE_PICKER_PT.states)` (ours → theirs)
1035
- - `BbDatePicker` _(public — [contract](./BbDatePicker.md))_ — its own pt parts (`BbDatePicker`): `panel` → `div`, `panel` → `CommonPopover`; hands `BbCalendar` the pt map ` passthrough.forward(DATE_PICKER_CALENDAR_PARTS, BB_CALENDAR_PT.states) ` (ours → theirs); hands `BbOffCanvas` the pt map `{ panel: 'root', sheet: 'root' }` (ours → theirs); documented CSS variables: `--cell`, `--unit-row`; also mounts `CommonPopover`
1067
+ - `BbDatePicker` _(public — [contract](./BbDatePicker.md))_ — its own pt parts (`BbDatePicker`): `panel` → `div`; hands `BbCalendar` the pt map ` passthrough.forward(DATE_PICKER_CALENDAR_PARTS, BB_CALENDAR_PT.states) ` (ours → theirs); hands `BbOffCanvas` the pt map `{ panel: 'root', sheet: 'root' }` (ours → theirs); documented CSS variables: `--cell`, `--unit-row`; also mounts `CommonPopover`
1036
1068
  - `BbCalendar` _(public — [contract](./BbCalendar.md))_ — its own pt parts (`BbCalendar`): `header` → `div.bb-calendar__header`, `arrow` → `BbBaseButton`, `month` → `BbBaseButton`, `year` → `BbBaseButton`, `day` → `div.bb-calendar__day`, `dayButton` → `button.bb-calendar__day-button`; documented CSS variables: `--cell`, `--unit-row`; also mounts `ScaleFade`, `Slide`, `CalendarMonthPanel`, `CalendarYearPanel`
1037
1069
  - `BbBaseButton` _(public — [contract](./BbBaseButton.md))_ — its own pt parts (`BbBaseButton`): `root` → `RouterComponent`, `root` → `a`, `root` → `component`; also mounts `RouterComponent`
1038
1070
  - `CommonTimeSelector` _(internal — not importable, reach it through `BbCalendar`)_ — its own pt parts (`BbCalendar`): `header` → `div.bb-time-selector__header`, `cellColumnHeader` → `div.bb-time-selector__cell-column-header`, `item` → `BbBaseButton`; documented CSS variables: `--time-mark`; also mounts `BbBaseButton`