bitboss-ui 3.0.0-beta.63 → 3.0.0-beta.65

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 (396) hide show
  1. package/README.md +25 -20
  2. package/bin/bitboss-ui.mjs +73 -7
  3. package/dist/ai/BbAlert.md +10 -1
  4. package/dist/ai/BbBadge.md +35 -3
  5. package/dist/ai/BbBadgeButton.md +4 -2
  6. package/dist/ai/BbBaseButton.md +9 -3
  7. package/dist/ai/BbBreadcrumbs.md +2 -2
  8. package/dist/ai/BbButton.md +113 -8
  9. package/dist/ai/BbCheckbox.md +1 -1
  10. package/dist/ai/BbCheckboxGroup.md +94 -6
  11. package/dist/ai/BbColorInput.md +4 -1
  12. package/dist/ai/BbColorPalette.md +2 -1
  13. package/dist/ai/BbConfirm.md +7 -3
  14. package/dist/ai/BbDatePicker.md +2 -1
  15. package/dist/ai/BbDatePickerInput.md +4 -1
  16. package/dist/ai/BbDialog.md +12 -11
  17. package/dist/ai/BbDropdown.md +189 -38
  18. package/dist/ai/BbDropdownButton.md +27 -7
  19. package/dist/ai/BbForm.md +55 -22
  20. package/dist/ai/BbHost.md +2 -2
  21. package/dist/ai/BbHoverCard.md +7 -3
  22. package/dist/ai/BbIcon.md +12 -6
  23. package/dist/ai/BbIndicator.md +11 -1
  24. package/dist/ai/BbNumberInput.md +4 -1
  25. package/dist/ai/BbOffCanvas.md +37 -3
  26. package/dist/ai/BbPopover.md +2 -1
  27. package/dist/ai/BbRadio.md +1 -1
  28. package/dist/ai/BbRadioGroup.md +102 -10
  29. package/dist/ai/BbSelect.md +52 -17
  30. package/dist/ai/BbSelectPopover.md +93 -26
  31. package/dist/ai/BbSwitch.md +1 -1
  32. package/dist/ai/BbSwitchGroup.md +30 -3
  33. package/dist/ai/BbTable.md +17 -10
  34. package/dist/ai/BbTabs.md +8 -3
  35. package/dist/ai/BbTabsList.md +4 -1
  36. package/dist/ai/BbTag.md +5 -2
  37. package/dist/ai/BbTextInput.md +4 -1
  38. package/dist/ai/BbTextarea.md +4 -1
  39. package/dist/ai/BbTimePicker.md +2 -1
  40. package/dist/ai/BbTimePickerInput.md +4 -1
  41. package/dist/ai/BbToast.md +9 -3
  42. package/dist/ai/BbTooltip.md +71 -9
  43. package/dist/ai/ChipsBox.md +1 -1
  44. package/dist/ai/CommonField.md +1 -1
  45. package/dist/ai/OptionsContainer.md +42 -0
  46. package/dist/ai/changelog.json +494 -6
  47. package/dist/ai/components.json +50 -48
  48. package/dist/ai/composables/useBbConfig.md +8 -1
  49. package/dist/ai/composables/useConfirm.md +39 -1
  50. package/dist/ai/design-tokens.json +6 -6
  51. package/dist/ai/guides/agent-contract.md +2 -2
  52. package/dist/ai/guides/ai-router.md +24 -23
  53. package/dist/ai/guides/app-layout.md +5 -0
  54. package/dist/ai/guides/component-picker.md +9 -2
  55. package/dist/ai/guides/design-language.md +24 -24
  56. package/dist/ai/guides/design-tokens.md +15 -8
  57. package/dist/ai/guides/icons-policy.md +9 -2
  58. package/dist/ai/guides/inertia-helpers.md +1183 -301
  59. package/dist/ai/guides/installation-and-plugin-setup.md +12 -2
  60. package/dist/ai/guides/migration/adoption-checklist.md +235 -0
  61. package/dist/ai/guides/migration/components/bb-checkbox-group.md +16 -15
  62. package/dist/ai/guides/migration/components/bb-dialog.md +9 -9
  63. package/dist/ai/guides/migration/components/bb-dropdown.md +7 -2
  64. package/dist/ai/guides/migration/components/bb-popover.md +4 -2
  65. package/dist/ai/guides/migration/components/bb-select.md +19 -0
  66. package/dist/ai/guides/migration/components/bb-table.md +1 -0
  67. package/dist/ai/guides/migration/components/bb-toast.md +4 -0
  68. package/dist/ai/guides/migration/components/bb-tooltip.md +15 -12
  69. package/dist/ai/guides/migration/components/use-confirm.md +25 -2
  70. package/dist/ai/guides/migration/v2-to-v3.md +211 -9
  71. package/dist/ai/guides/migration/v3-beta-css-classes.md +7 -3
  72. package/dist/ai/guides/options-items-playbook.md +2 -1
  73. package/dist/ai/guides/passthrough.md +149 -85
  74. package/dist/ai/guides/preset-components.md +140 -15
  75. package/dist/ai/helpers/definePreset.json +7 -0
  76. package/dist/ai/helpers/definePreset.ts +123 -11
  77. package/dist/ai/helpers/inertia/manifest.json +151 -62
  78. package/dist/ai/helpers/inertia/messages.ts +33 -0
  79. package/dist/ai/helpers/inertia/useConfirmOnRouteLeave.ts +120 -20
  80. package/dist/ai/helpers/inertia/useHasChanged.ts +34 -16
  81. package/dist/ai/helpers/inertia/useLazyProp.ts +102 -36
  82. package/dist/ai/helpers/inertia/useLazyPropGetter.ts +3 -1
  83. package/dist/ai/helpers/inertia/usePaginatedResponseContext.ts +154 -34
  84. package/dist/ai/helpers/inertia/usePromiseForm.ts +121 -14
  85. package/dist/ai/helpers/inertia/useQuery.ts +133 -11
  86. package/dist/ai/helpers/inertia/useQueryObject.ts +74 -67
  87. package/dist/ai/helpers/inertia/useResourceContext.ts +60 -14
  88. package/dist/ai/helpers/inertia/useRouteQuery.ts +38 -27
  89. package/dist/ai/helpers/inertia/useScreenSizes.ts +9 -7
  90. package/dist/ai/helpers/inertia/useTableContext.ts +5 -2
  91. package/dist/ai/helpers/inertia/utils.ts +14 -0
  92. package/dist/ai/index.md +1 -0
  93. package/dist/ai/manifest/common.json +0 -1
  94. package/dist/ai/manifest/components/BbAlert.json +7 -2
  95. package/dist/ai/manifest/components/BbBadge.json +13 -4
  96. package/dist/ai/manifest/components/BbBadge.tree.json +2 -0
  97. package/dist/ai/manifest/components/BbBadgeButton.json +4 -2
  98. package/dist/ai/manifest/components/BbBaseButton.json +4 -2
  99. package/dist/ai/manifest/components/BbBreadcrumbs.tree.json +1 -1
  100. package/dist/ai/manifest/components/BbButton.json +14 -3
  101. package/dist/ai/manifest/components/BbButton.tree.json +5 -1
  102. package/dist/ai/manifest/components/BbCheckboxGroup.json +13 -8
  103. package/dist/ai/manifest/components/BbCheckboxGroup.tree.json +11 -1
  104. package/dist/ai/manifest/components/BbColorInput.json +18 -15
  105. package/dist/ai/manifest/components/BbColorPalette.json +1 -1
  106. package/dist/ai/manifest/components/BbConfirm.json +4 -2
  107. package/dist/ai/manifest/components/BbConfirm.tree.json +1 -1
  108. package/dist/ai/manifest/components/BbDatePicker.json +1 -1
  109. package/dist/ai/manifest/components/BbDatePickerInput.json +17 -14
  110. package/dist/ai/manifest/components/BbDialog.tree.json +2 -1
  111. package/dist/ai/manifest/components/BbDropdown.json +24 -19
  112. package/dist/ai/manifest/components/BbDropdown.tree.json +9 -2
  113. package/dist/ai/manifest/components/BbDropdownButton.json +33 -20
  114. package/dist/ai/manifest/components/BbDropdownButton.tree.json +2 -2
  115. package/dist/ai/manifest/components/BbForm.json +2 -2
  116. package/dist/ai/manifest/components/BbHost.tree.json +1 -1
  117. package/dist/ai/manifest/components/BbHoverCard.json +1 -1
  118. package/dist/ai/manifest/components/BbIndicator.json +8 -2
  119. package/dist/ai/manifest/components/BbNumberInput.json +5 -2
  120. package/dist/ai/manifest/components/BbOffCanvas.json +2 -2
  121. package/dist/ai/manifest/components/BbOffCanvas.tree.json +1 -1
  122. package/dist/ai/manifest/components/BbPopover.json +1 -1
  123. package/dist/ai/manifest/components/BbRadioGroup.json +17 -12
  124. package/dist/ai/manifest/components/BbRadioGroup.tree.json +8 -1
  125. package/dist/ai/manifest/components/BbSelect.json +21 -18
  126. package/dist/ai/manifest/components/BbSelect.tree.json +2 -2
  127. package/dist/ai/manifest/components/BbSelectPopover.json +10 -10
  128. package/dist/ai/manifest/components/BbSelectPopover.tree.json +3 -2
  129. package/dist/ai/manifest/components/BbSwitchGroup.json +1 -1
  130. package/dist/ai/manifest/components/BbSwitchGroup.tree.json +3 -1
  131. package/dist/ai/manifest/components/BbTable.tree.json +14 -1
  132. package/dist/ai/manifest/components/BbTabs.json +9 -6
  133. package/dist/ai/manifest/components/BbTabs.tree.json +1 -1
  134. package/dist/ai/manifest/components/BbTabsList.json +6 -3
  135. package/dist/ai/manifest/components/BbTag.json +19 -16
  136. package/dist/ai/manifest/components/BbTag.tree.json +1 -1
  137. package/dist/ai/manifest/components/BbTextInput.json +6 -3
  138. package/dist/ai/manifest/components/BbTextarea.json +6 -3
  139. package/dist/ai/manifest/components/BbTimePicker.json +1 -1
  140. package/dist/ai/manifest/components/BbTimePickerInput.json +10 -7
  141. package/dist/ai/manifest/components/BbToast.json +7 -2
  142. package/dist/ai/manifest/components/BbToast.tree.json +4 -2
  143. package/dist/ai/manifest/components/BbTooltip.json +6 -5
  144. package/dist/ai/manifest/components/ChipsBox.tree.json +1 -1
  145. package/dist/ai/manifest/components/CommonField.json +1 -1
  146. package/dist/ai/manifest/components/OptionsContainer.json +3 -1
  147. package/dist/ai/manifest/components/OptionsContainer.tree.json +38 -0
  148. package/dist/ai/manifest/index.json +3 -3
  149. package/dist/ai/manifest/meta.json +5 -3
  150. package/dist/ai/manifest/types.advanced.json +5 -2
  151. package/dist/ai/manifest/types.api.json +9 -7
  152. package/dist/ai/recipes/inertia/approvals-inbox.md +1 -1
  153. package/dist/ai/recipes/inertia/inline-edit-workspace.md +1 -1
  154. package/dist/ai/recipes/inertia/layout-scaffold.md +19 -6
  155. package/dist/ai/recipes/inertia/ownership-atlas.md +1 -1
  156. package/dist/ai/recipes/inertia/records-workspace.md +50 -14
  157. package/dist/ai/recipes/inertia/upload-center.md +1 -1
  158. package/dist/ai/recipes/nuxt/layout-scaffold.md +19 -6
  159. package/dist/ai/recipes/nuxt/records-workspace.md +42 -12
  160. package/dist/ai/recipes/vue/layout-scaffold.md +19 -6
  161. package/dist/ai/recipes/vue/records-workspace.md +42 -12
  162. package/dist/ai/source/BbAlert.md +94 -76
  163. package/dist/ai/source/BbBadge.md +174 -72
  164. package/dist/ai/source/BbBadgeButton.md +130 -65
  165. package/dist/ai/source/BbBaseButton.md +46 -124
  166. package/dist/ai/source/BbBaseCheckboxIcon.md +38 -0
  167. package/dist/ai/source/BbBaseRadioIcon.md +18 -0
  168. package/dist/ai/source/BbBaseSwitchIcon.md +51 -0
  169. package/dist/ai/source/BbButton.md +153 -36
  170. package/dist/ai/source/BbCheckboxGroup.md +142 -18
  171. package/dist/ai/source/BbColorInput.md +240 -204
  172. package/dist/ai/source/BbColorPalette.md +7 -4
  173. package/dist/ai/source/BbConfirm.md +34 -11
  174. package/dist/ai/source/BbConfirmPortal.md +24 -9
  175. package/dist/ai/source/BbDatePicker.md +11 -7
  176. package/dist/ai/source/BbDatePickerInput.md +306 -269
  177. package/dist/ai/source/BbDialog.md +49 -14
  178. package/dist/ai/source/BbDropdown.md +314 -197
  179. package/dist/ai/source/BbDropdownButton.md +197 -31
  180. package/dist/ai/source/BbDropdownGroup.md +274 -176
  181. package/dist/ai/source/BbForm.md +50 -6
  182. package/dist/ai/source/BbHoverCard.md +12 -5
  183. package/dist/ai/source/BbIcon.md +4 -3
  184. package/dist/ai/source/BbIndicator.md +73 -52
  185. package/dist/ai/source/BbNumberInput.md +293 -257
  186. package/dist/ai/source/BbOffCanvas.md +55 -29
  187. package/dist/ai/source/BbPopover.md +14 -10
  188. package/dist/ai/source/BbRadioGroup.md +413 -297
  189. package/dist/ai/source/BbSelect.md +549 -435
  190. package/dist/ai/source/BbSelectPopover.md +153 -34
  191. package/dist/ai/source/BbSwitchGroup.md +70 -10
  192. package/dist/ai/source/BbTable.md +369 -37
  193. package/dist/ai/source/BbTabs.md +115 -39
  194. package/dist/ai/source/BbTabsList.md +106 -38
  195. package/dist/ai/source/BbTabsPanels.md +96 -36
  196. package/dist/ai/source/BbTabsRoot.md +96 -36
  197. package/dist/ai/source/BbTag.md +267 -233
  198. package/dist/ai/source/BbTextInput.md +261 -225
  199. package/dist/ai/source/BbTextarea.md +251 -215
  200. package/dist/ai/source/BbTimePicker.md +11 -7
  201. package/dist/ai/source/BbTimePickerInput.md +257 -220
  202. package/dist/ai/source/BbToast.md +73 -32
  203. package/dist/ai/source/BbToastPortal.md +65 -30
  204. package/dist/ai/source/BbTooltip.md +148 -113
  205. package/dist/ai/source/CommonPopover.md +6 -1
  206. package/dist/ai/source/FlatListBox.md +19 -9
  207. package/dist/ai/source/GroupedListBox.md +19 -9
  208. package/dist/ai/source/OptionsContainer.md +25 -9
  209. package/dist/components/BbAlert/BbAlert.vue_vue_type_script_setup_true_lang.js +61 -36
  210. package/dist/components/BbAlert/types.d.ts +9 -5
  211. package/dist/components/BbAlert/types.js +8 -3
  212. package/dist/components/BbBadge/BadgeBodyContent.vue.d.ts +3 -3
  213. package/dist/components/BbBadge/BadgeBodyContent.vue_vue_type_script_setup_true_lang.js +26 -17
  214. package/dist/components/BbBadge/BbBadge.vue_vue_type_script_setup_true_lang.js +103 -50
  215. package/dist/components/BbBadge/BbBadgeButton.vue_vue_type_script_setup_true_lang.js +20 -15
  216. package/dist/components/BbBadge/badgeButtonContext.d.ts +12 -1
  217. package/dist/components/BbBadge/types.d.ts +45 -15
  218. package/dist/components/BbBadge/types.js +12 -3
  219. package/dist/components/BbBaseButton/BbBaseButton.vue_vue_type_script_setup_true_lang.js +89 -126
  220. package/dist/components/BbBaseButton/types.d.ts +23 -4
  221. package/dist/components/BbBaseButton/types.js +7 -1
  222. package/dist/components/BbBaseButton/useLinkState.d.ts +41 -0
  223. package/dist/components/BbBaseButton/useLinkState.js +70 -0
  224. package/dist/components/BbButton/BbButton.vue_vue_type_script_setup_true_lang.js +130 -74
  225. package/dist/components/BbButton/types.d.ts +50 -13
  226. package/dist/components/BbButton/types.js +10 -3
  227. package/dist/components/BbCheckboxGroup/BbCheckboxGroup.vue_vue_type_script_setup_true_lang.js +148 -95
  228. package/dist/components/BbCheckboxGroup/types.d.ts +34 -11
  229. package/dist/components/BbCheckboxGroup/types.js +9 -4
  230. package/dist/components/BbCollapsible/BbCollapsible.vue.d.ts +1 -1
  231. package/dist/components/BbColorInput/BbColorInput.vue_vue_type_script_setup_true_lang.js +134 -93
  232. package/dist/components/BbColorInput/types.d.ts +11 -4
  233. package/dist/components/BbColorInput/types.js +9 -3
  234. package/dist/components/BbConfirm/BbConfirm.vue_vue_type_script_setup_true_lang.js +82 -59
  235. package/dist/components/BbConfirm/types.d.ts +9 -4
  236. package/dist/components/BbConfirm/types.js +8 -3
  237. package/dist/components/BbDatePicker/BbDatePicker.vue.d.ts +1 -1
  238. package/dist/components/BbDatePicker/BbDatePicker.vue_vue_type_script_setup_true_lang.js +68 -67
  239. package/dist/components/BbDatePickerInput/BbDatePickerInput.vue.d.ts +1 -1
  240. package/dist/components/BbDatePickerInput/BbDatePickerInput.vue_vue_type_script_setup_true_lang.js +259 -215
  241. package/dist/components/BbDatePickerInput/types.d.ts +12 -5
  242. package/dist/components/BbDatePickerInput/types.js +9 -3
  243. package/dist/components/BbDialog/BbDialog.vue_vue_type_script_setup_true_lang.js +223 -219
  244. package/dist/components/BbDialog/useDialogStack.d.ts +1 -1
  245. package/dist/components/BbDropdown/AdaptiveDropdown.vue_vue_type_script_setup_true_lang.js +104 -89
  246. package/dist/components/BbDropdown/BbDropdown.vue.d.ts +1 -0
  247. package/dist/components/BbDropdown/BbDropdown.vue_vue_type_script_setup_true_lang.js +323 -285
  248. package/dist/components/BbDropdown/BbDropdownList.vue.d.ts +1 -0
  249. package/dist/components/BbDropdown/BbDropdownList.vue_vue_type_script_setup_true_lang.js +411 -319
  250. package/dist/components/BbDropdown/DropdownPipelineResolver.vue_vue_type_script_setup_true_lang.js +100 -98
  251. package/dist/components/BbDropdown/DropdownRow.vue.d.ts +4 -3
  252. package/dist/components/BbDropdown/DropdownRow.vue_vue_type_script_setup_true_lang.js +49 -28
  253. package/dist/components/BbDropdown/normalizeGroups.d.ts +6 -0
  254. package/dist/components/BbDropdown/normalizeGroups.js +21 -15
  255. package/dist/components/BbDropdown/types.d.ts +59 -12
  256. package/dist/components/BbDropdown/types.js +16 -3
  257. package/dist/components/BbDropdown/useDropdownContext.d.ts +6 -0
  258. package/dist/components/BbDropdownButton/BbDropdownButton.vue.d.ts +2 -1
  259. package/dist/components/BbDropdownButton/BbDropdownButton.vue_vue_type_script_setup_true_lang.js +179 -68
  260. package/dist/components/BbDropdownButton/types.d.ts +44 -16
  261. package/dist/components/BbDropdownButton/types.js +28 -3
  262. package/dist/components/BbForm/BbForm.vue_vue_type_script_setup_true_lang.js +111 -89
  263. package/dist/components/BbForm/formSchema.d.ts +13 -0
  264. package/dist/components/BbHoverCard/BbHoverCard.vue_vue_type_script_setup_true_lang.js +100 -100
  265. package/dist/components/BbIndicator/BbIndicator.vue_vue_type_script_setup_true_lang.js +40 -25
  266. package/dist/components/BbIndicator/types.d.ts +9 -5
  267. package/dist/components/BbIndicator/types.js +8 -3
  268. package/dist/components/BbNumberInput/BbNumberInput.vue_vue_type_script_setup_true_lang.js +243 -202
  269. package/dist/components/BbNumberInput/types.d.ts +12 -5
  270. package/dist/components/BbNumberInput/types.js +9 -3
  271. package/dist/components/BbOffCanvas/BbOffCanvas.vue.d.ts +1 -1
  272. package/dist/components/BbOffCanvas/BbOffCanvas.vue_vue_type_script_setup_true_lang.js +401 -399
  273. package/dist/components/BbOffCanvas/types.d.ts +6 -2
  274. package/dist/components/BbPopover/BbPopover.vue_vue_type_script_setup_true_lang.js +81 -80
  275. package/dist/components/BbRadioGroup/BbRadioGroup.vue_vue_type_script_setup_true_lang.js +158 -105
  276. package/dist/components/BbRadioGroup/types.d.ts +21 -7
  277. package/dist/components/BbRadioGroup/types.js +9 -4
  278. package/dist/components/BbSelect/BbSelect.vue.d.ts +4 -3
  279. package/dist/components/BbSelect/BbSelect.vue_vue_type_script_setup_true_lang.js +181 -137
  280. package/dist/components/BbSelect/types.d.ts +36 -22
  281. package/dist/components/BbSelect/types.js +22 -3
  282. package/dist/components/BbSelectPopover/BbSelectPopover.vue.d.ts +4 -4
  283. package/dist/components/BbSelectPopover/BbSelectPopover.vue_vue_type_script_setup_true_lang.js +600 -577
  284. package/dist/components/BbSelectPopover/knownItems.d.ts +5 -0
  285. package/dist/components/BbSelectPopover/types.d.ts +46 -12
  286. package/dist/components/BbSmoothHeight/BbSmoothHeight.vue.d.ts +1 -1
  287. package/dist/components/BbSwitchGroup/BbSwitchGroup.vue_vue_type_script_setup_true_lang.js +2 -2
  288. package/dist/components/BbSwitchGroup/types.d.ts +14 -4
  289. package/dist/components/BbSwitchGroup/types.js +8 -3
  290. package/dist/components/BbTable/BbTable.vue_vue_type_script_setup_true_lang.js +1102 -995
  291. package/dist/components/BbTable/estimatedFloors.golden.d.ts +25 -0
  292. package/dist/components/BbTable/measuredFloors.d.ts +46 -0
  293. package/dist/components/BbTable/measuredFloors.js +322 -0
  294. package/dist/components/BbTable/measuredFloorsTestKit.d.ts +27 -0
  295. package/dist/components/BbTable/textRuler.d.ts +71 -0
  296. package/dist/components/BbTable/textRuler.js +121 -0
  297. package/dist/components/BbTable/utils.d.ts +113 -6
  298. package/dist/components/BbTable/utils.js +118 -65
  299. package/dist/components/BbTabs/BbTabs.vue_vue_type_script_setup_true_lang.js +53 -35
  300. package/dist/components/BbTabs/BbTabsList.vue_vue_type_script_setup_true_lang.js +62 -45
  301. package/dist/components/BbTabs/types.d.ts +26 -11
  302. package/dist/components/BbTabs/types.js +23 -8
  303. package/dist/components/BbTag/BbTag.vue_vue_type_script_setup_true_lang.js +205 -164
  304. package/dist/components/BbTag/types.d.ts +11 -4
  305. package/dist/components/BbTag/types.js +9 -3
  306. package/dist/components/BbTextInput/BbTextInput.vue_vue_type_script_setup_true_lang.js +98 -57
  307. package/dist/components/BbTextInput/types.d.ts +12 -5
  308. package/dist/components/BbTextInput/types.js +9 -3
  309. package/dist/components/BbTextarea/BbTextarea.vue_vue_type_script_setup_true_lang.js +137 -96
  310. package/dist/components/BbTextarea/types.d.ts +12 -5
  311. package/dist/components/BbTextarea/types.js +9 -3
  312. package/dist/components/BbTimePicker/BbTimePicker.vue_vue_type_script_setup_true_lang.js +105 -104
  313. package/dist/components/BbTimePickerInput/BbTimePickerInput.vue_vue_type_script_setup_true_lang.js +241 -197
  314. package/dist/components/BbTimePickerInput/types.d.ts +12 -5
  315. package/dist/components/BbTimePickerInput/types.js +9 -3
  316. package/dist/components/BbToast/BbToast.vue_vue_type_script_setup_true_lang.js +74 -32
  317. package/dist/components/BbToast/BbToastMessage.vue_vue_type_script_setup_true_lang.js +47 -47
  318. package/dist/components/BbToast/types.d.ts +10 -5
  319. package/dist/components/BbToast/types.js +18 -3
  320. package/dist/components/BbTooltip/BbTooltip.vue_vue_type_script_setup_true_lang.js +85 -71
  321. package/dist/components/BbTooltip/types.d.ts +13 -8
  322. package/dist/components/BbTooltip/types.js +8 -3
  323. package/dist/components/CommonField/CommonField.vue.d.ts +1 -1
  324. package/dist/components/CommonPopover/CommonPopover.vue.d.ts +1 -1
  325. package/dist/components/CommonPopover/CommonPopover.vue_vue_type_script_setup_true_lang.js +69 -69
  326. package/dist/components/FlatListBox/FlatListBox.vue_vue_type_script_setup_true_lang.js +53 -50
  327. package/dist/components/GroupedListBox/GroupedListBox.vue_vue_type_script_setup_true_lang.js +146 -143
  328. package/dist/components/OptionsContainer/OptionsContainer.vue_vue_type_script_setup_true_lang.js +7 -2
  329. package/dist/components/OptionsContainer/types.d.ts +14 -3
  330. package/dist/composables/useBbConfig.d.ts +1 -0
  331. package/dist/composables/useBbConfig.js +11 -7
  332. package/dist/composables/useBbFormContext.d.ts +4 -3
  333. package/dist/composables/useBbTabsContext.js +99 -85
  334. package/dist/composables/useChoiceIndicator.d.ts +58 -0
  335. package/dist/composables/useChoiceIndicator.js +197 -0
  336. package/dist/composables/useConfirm.d.ts +4 -4
  337. package/dist/composables/usePassthrough.d.ts +54 -1
  338. package/dist/composables/usePassthrough.js +100 -71
  339. package/dist/directives/bbTooltip.d.ts +12 -6
  340. package/dist/directives/createPopoverDirective.js +1 -1
  341. package/dist/index.d.ts +3 -1
  342. package/dist/llms-full.txt +3467 -801
  343. package/dist/llms-medium.txt +71 -53
  344. package/dist/llms.txt +2 -1
  345. package/dist/passthrough-deduper.js +6 -3
  346. package/dist/project-dts.d.ts +24 -0
  347. package/dist/project-dts.js +43 -17
  348. package/dist/styles.css +2 -2
  349. package/dist/types/AlertVariant.d.ts +14 -0
  350. package/dist/types/AlertVariant.js +9 -0
  351. package/dist/types/BadgeVariant.d.ts +14 -0
  352. package/dist/types/BadgeVariant.js +9 -0
  353. package/dist/types/ButtonVariant.d.ts +16 -0
  354. package/dist/types/ButtonVariant.js +11 -0
  355. package/dist/types/CheckboxVariant.d.ts +38 -0
  356. package/dist/types/CheckboxVariant.js +4 -0
  357. package/dist/types/CommonProps.d.ts +4 -3
  358. package/dist/types/Config.d.ts +7 -0
  359. package/dist/types/ConfirmVariant.d.ts +12 -0
  360. package/dist/types/ConfirmVariant.js +4 -0
  361. package/dist/types/DropdownItemVariant.d.ts +12 -0
  362. package/dist/types/DropdownItemVariant.js +4 -0
  363. package/dist/types/IndicatorVariant.d.ts +15 -0
  364. package/dist/types/IndicatorVariant.js +10 -0
  365. package/dist/types/InputVariant.d.ts +13 -0
  366. package/dist/types/InputVariant.js +8 -0
  367. package/dist/types/RadioVariant.d.ts +38 -0
  368. package/dist/types/RadioVariant.js +4 -0
  369. package/dist/types/TabsVariant.d.ts +13 -0
  370. package/dist/types/TabsVariant.js +8 -0
  371. package/dist/types/ToastVariant.d.ts +15 -0
  372. package/dist/types/ToastVariant.js +10 -0
  373. package/dist/types/TooltipVariant.d.ts +12 -0
  374. package/dist/types/TooltipVariant.js +4 -0
  375. package/dist/types/passthrough.d.ts +83 -15
  376. package/dist/types/passthrough.js +2 -2
  377. package/dist/types/ptComponentMap.d.ts +35 -23
  378. package/dist/utilities/functions/extractDomContainer.d.ts +20 -1
  379. package/dist/utilities/functions/extractDomContainer.js +8 -3
  380. package/dist/utils/focusVisibility.d.ts +6 -0
  381. package/dist/utils/focusVisibility.js +4 -1
  382. package/dist/utils/passthroughDeduper.d.ts +14 -0
  383. package/dist/utils/versionCheck.js +1 -1
  384. package/dist/vite-plugin.d.ts +64 -7
  385. package/dist/vite.js +385 -259
  386. package/llms.txt +2 -1
  387. package/package.json +5 -4
  388. package/scripts/lib/adoption-checklist.json +312 -0
  389. package/scripts/lib/eslint-plugin.d.ts +13 -0
  390. package/scripts/lib/eslint-plugin.mjs +75 -11
  391. package/scripts/lib/helpers-add.mjs +26 -2
  392. package/scripts/lib/idiom-scan.mjs +65 -0
  393. package/scripts/lib/mcp-config.mjs +203 -9
  394. package/scripts/lib/migrate-fix.mjs +42 -1
  395. package/scripts/lib/project-variant-dts.mjs +18 -0
  396. package/scripts/lib/validate-bb-markup.mjs +99 -2
@@ -560,7 +560,8 @@ only some of the picks name none of them until the first open:
560
560
  It is the same prop as `BbSelect`'s, with the same rules: the provider does
561
561
  not change (the first open still asks for the picks by id), a value no row
562
562
  names loads as it would without the prop, the options' accessors never run on
563
- a known row (slots get it as `item` until the list brings its own), the rows
563
+ a known row (the `option` slot gets it as `item`, with `known: true`, until
564
+ the list brings its own, and `item` is typed accordingly: check `known`), the rows
564
565
  are never listed unless selected, they vouch for their values under
565
566
  `enforce-coherence` until a parent change, and a selected row the list lacks is
566
567
  listed first. The details are in the BbSelect guide (_Rows the form already
@@ -1321,8 +1322,9 @@ Inertia visit), `navigateTo(href)` (Nuxt).
1321
1322
 
1322
1323
  `#header` and `#footer` pin content above the search field and below the options
1323
1324
  list, in **both** the desktop popover and the mobile adaptive sheet. Both receive
1324
- `{ close, clear, focus, query, selectedOptions }` — ideal for a title and a
1325
- "Done" action. Two more panel slots cover async states: `#loading` and
1325
+ `{ close, clear, focus, query, selectedOptions, titleId }` — ideal for a title
1326
+ and a "Done" action. Bind `titleId` as the title's `id`: on the phone sheet it
1327
+ names the dialog, as a `BbDialog` header's does. Two more panel slots cover async states: `#loading` and
1326
1328
  `#empty` (both receive `{ query }`; `#empty` also a `focus()` callback), or
1327
1329
  their string equivalents `loading-text` / `empty-text`.
1328
1330
 
@@ -1349,8 +1351,10 @@ their string equivalents `loading-text` / `empty-text`.
1349
1351
  }}</BbBadgeButton>
1350
1352
  </BbBadge>
1351
1353
  </template>
1352
- <template #header>
1353
- <span class="text-sm font-medium">Popular destinations</span>
1354
+ <template #header="{ titleId }">
1355
+ <span :id="titleId" class="text-sm font-medium"
1356
+ >Popular destinations</span
1357
+ >
1354
1358
  </template>
1355
1359
  <template #footer="{ close, clear }">
1356
1360
  <div class="flex w-full items-center gap-2">
@@ -1547,7 +1551,71 @@ const variantFor = (value: Status | null): BadgeVariantType =>
1547
1551
  taller custom `#option` / `#group` markup.
1548
1552
  - Placement props mirror the palette/dropdown float: `placement`, `offset`
1549
1553
  (default 4), `padding`, `boundary`, `disable-flip`, `transition-duration`. The
1550
- panel is a frame, not a bubble — it never shows an arrow.
1554
+ panel is a frame, not a bubble — it never shows an arrow. `placement` is read
1555
+ at open: a change while open applies at the next open.
1556
+
1557
+ #### A narrow column: a badge trigger and a panel of its own
1558
+
1559
+ This is the pattern for a choice that lives in a narrow column, or any time
1560
+ the trigger and the panel need different widths. `BbSelect`'s panel always
1561
+ matches its field and has no width prop, so a select in a narrow grid column
1562
+ truncates both the picked option and every row in its panel. Anchor a
1563
+ `BbSelectPopover` on a `BbBadgeButton` instead. The badge is the compact
1564
+ trigger: it ellipsises the picked label inside the column (`max-w-full` on the
1565
+ badge, `min-w-0` on the cell). The panel's `width` fits the longest option,
1566
+ whatever the column's width.
1567
+
1568
+ **A role in a narrow column**
1569
+
1570
+ ```vue
1571
+ <template>
1572
+ <div class="grid max-w-xl grid-cols-3 items-start gap-3">
1573
+ <BbTextInput v-model="name" label="Referent" />
1574
+ <!-- The column is narrow, the role names are long: a badge is the
1575
+ compact trigger, and the panel takes a width of its own. -->
1576
+ <div class="flex min-w-0 flex-col items-start gap-1.5">
1577
+ <span class="text-sm font-medium">Role</span>
1578
+ <BbSelectPopover v-model="role" compact :items="roles" width="300px">
1579
+ <template #activator="{ props }">
1580
+ <BbBadge
1581
+ append:icon="lucide:chevron-down"
1582
+ class="max-w-full"
1583
+ size="lg"
1584
+ variant="outline"
1585
+ >
1586
+ <BbBadgeButton v-bind="props">{{
1587
+ roleLabel || 'Assign role'
1588
+ }}</BbBadgeButton>
1589
+ </BbBadge>
1590
+ </template>
1591
+ </BbSelectPopover>
1592
+ </div>
1593
+ <BbTextInput v-model="email" label="Email" />
1594
+ </div>
1595
+ </template>
1596
+ <script setup lang="ts">
1597
+ import { computed, ref } from 'vue';
1598
+ import {
1599
+ BbBadge,
1600
+ BbBadgeButton,
1601
+ BbSelectPopover,
1602
+ BbTextInput,
1603
+ } from 'bitboss-ui';
1604
+
1605
+ const roles = [
1606
+ { value: 'ceo', label: 'Chief Executive and Head of Administration' },
1607
+ { value: 'admin', label: 'Administrative Manager' },
1608
+ { value: 'hr', label: 'Human Resources and Payroll Coordinator' },
1609
+ ];
1610
+
1611
+ const name = ref<string | null>(null);
1612
+ const email = ref<string | null>(null);
1613
+ const role = ref<string | null>(null);
1614
+ const roleLabel = computed(
1615
+ () => roles.find((r) => r.value === role.value)?.label
1616
+ );
1617
+ </script>
1618
+ ```
1551
1619
 
1552
1620
  ### Adaptive mobile sheet
1553
1621
 
@@ -1687,7 +1755,9 @@ never instead of it. The full grammar, the merge rules and the global map are
1687
1755
  in the [passthrough guide](./guides/passthrough.md).
1688
1756
 
1689
1757
  A `pt` value written in `<script>` (a constant, a preset, a wrapper's
1690
- `pt` prop) is typed as `BbSelectPopoverProps['pt']`, never an imported `PtValue`: see
1758
+ `pt` prop) is typed as `BbSelectPopoverProps<Row>['pt']`, or
1759
+ `BbSelectPopoverProps<object>['pt']` for a preset that fits any row type
1760
+ (never `<any>`), not an imported `PtValue`: see
1691
1761
  [passthrough § Typing `pt` in `<script>`](./guides/passthrough.md#typing-pt-in-script).
1692
1762
 
1693
1763
  ### Works well with
@@ -1715,12 +1785,11 @@ A `pt` value written in `<script>` (a constant, a preset, a wrapper's
1715
1785
  the "search to begin" hint until the user types. It quietly falls back to
1716
1786
  loading on open when writing is disabled, the model is non-empty, or `items` is
1717
1787
  an array.
1718
- - Closing clears the search. With a provider, a panel closed on a searched list
1719
- reopens with a fresh empty-query request (the provider gets `''`), showing
1720
- loading until it answers, never the old results; a search still in flight at
1721
- close is dropped. Search-first reopens to the "search to begin" hint without
1722
- a request. A panel closed on the unfiltered list reopens as it was, with no
1723
- request, and the selection is never touched.
1788
+ - Closing clears the search. With a provider, reopening after a search sends a
1789
+ fresh `''` request (loading shows, never the old results; a search in flight
1790
+ at close is dropped); search-first reopens to its hint with no request; a
1791
+ panel closed on the unfiltered list reopens as it was. The selection is never
1792
+ touched.
1724
1793
  - `enforce-coherence` + a provider that drops the selection on the calls the
1725
1794
  popover starts itself (`reason !== 'search'`) = wiped model — and since the
1726
1795
  check runs on the **first** load, that wipe happens at mount rather than
@@ -1735,13 +1804,11 @@ A `pt` value written in `<script>` (a constant, a preset, a wrapper's
1735
1804
  - **Clicking the selected option does not clear a single select** — it re-picks
1736
1805
  it and closes the panel. Emptying is the `clear` callback (activator/panel
1737
1806
  slot scope), never an accidental second click. Multiple mode still toggles.
1738
- - **`null` as a real "All" option** works — it resolves and renders as the
1739
- selection — but it overloads the value the component uses for _nothing
1740
- selected_. So a `null` model stays lazy (nothing to resolve, no load, not even
1741
- with `enforce-coherence`), `clear` is indistinguishable from picking "All", and
1742
- an `enforce-coherence` prune emits `null` — i.e. a stale value **widens to
1743
- "All"** rather than clearing. Fine if you want it; use a sentinel
1744
- (`'all'`) if "everything" and "nothing" must stay distinct.
1807
+ - **`null` as a real "All" option** works, but `null` also means _nothing
1808
+ selected_: a `null` model stays lazy (no load, even with `enforce-coherence`),
1809
+ `clear` equals picking "All", and an `enforce-coherence` prune emits `null`, so
1810
+ a stale value **widens to "All"**. Use a sentinel (`'all'`) when "everything"
1811
+ and "nothing" must differ.
1745
1812
 
1746
1813
  ### Anti-patterns
1747
1814
 
@@ -1819,7 +1886,7 @@ A `pt` value written in `<script>` (a constant, a preset, a wrapper's
1819
1886
 
1820
1887
  | Prop | Type | Default | Required | Description |
1821
1888
  | --- | --- | --- | --- | --- |
1822
- | `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: `clear`, `footer`, `header`, `input`, `itemDescription`, `itemIcon`, `itemText`, `list`, `option`, `panel`, `root`, `sheet`. States: `disabled`, `open`, `selected`. 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 `BbSelectPopoverProps['pt']` (`PtValue` is not exported): § Typing `pt` in `<script>`. |
1889
+ | `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: `clear`, `footer`, `header`, `input`, `itemDescription`, `itemIcon`, `itemText`, `list`, `option`, `panel`, `root`, `sheet`. States: `disabled`, `open`, `selected`. 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 `BbSelectPopoverProps<Row>['pt']` (`BbSelectPopoverProps<object>['pt']` for a preset that fits any row type, never `<any>`) (`PtValue` is not exported): § Typing `pt` in `<script>`. |
1823
1890
  | `activator` | `Record<string, any> \| HTMLElement \| null \| undefined` | | | External activator element or component ref. When provided, the activator slot is not rendered and event listeners are attached programmatically to the referenced element. |
1824
1891
  | `adaptive` | `boolean \| undefined` | ``config.adaptive` (`true`)` | | On mobile, the panel opens as a bottom sheet instead of a floating popover, with the same search and list. Unset, the global `config.adaptive` applies. |
1825
1892
  | `anchor` | `Record<string, any> \| HTMLElement \| null \| undefined` | `null` | | Override the element used for popover positioning and width measurement. Useful when the focusable activator is narrower than its visual container (e.g. a button inside a wrapper). Falls back to `activatorEl` when omitted. |
@@ -1848,7 +1915,7 @@ A `pt` value written in `<script>` (a constant, a preset, a wrapper's
1848
1915
  | `items` | `Item[] \| ((context: BbSelectPopoverItemsContext) => Item[] \| Promise<Item[]>)` | `[]` | yes | The options: an array, or a sync or async provider given a `BbSelectPopoverItemsContext` (`query`, `reason`, `modelValue`, `signal`). Branch on `reason !== 'search'` to resolve the selection by id. A provider fails by THROWING, never by returning `[]`. |
1849
1916
  | `itemText` | `ItemAccessor<Item, string> \| undefined` | `own `label`, else `text`, else `JSON.stringify(item)`` | | Path to item property for display text or function to extract it. Unset: own `label`, else `text` (`{ label, value }` needs no accessor). |
1850
1917
  | `itemValue` | `ItemAccessor<Item> \| undefined` | `own `value`, else the whole item` | | Path to item property for value or function to extract it. Unset: own `value`, even `null`. |
1851
- | `knownItems` | `(BbSelectKnownItem \| null \| undefined)[] \| undefined` | | | `{ value, label }` rows naming the value the app already holds, whatever the options' shape: the activator's `text` with no request until the first open (`prefill: true` still loads). Not options; the options' accessors never run on them; slots get the row as `item` until the list brings its own. |
1918
+ | `knownItems` | `([Known] extends [undefined] ? BbSelectKnownItems : Known) \| undefined` | | | `{ value, label }` rows naming the value the app already holds, whatever the options' shape: the activator's `text` with no request until the first open (`prefill: true` still loads). Not options: accessors never run on them; slots get one as `item`, `known: true`, until the list brings its own. |
1852
1919
  | `loading` | `boolean \| undefined` | `false` | | Display the loading state styles. |
1853
1920
  | `loadingText` | `string \| undefined` | | | Message shown while items are being loaded. |
1854
1921
  | `max` | `number \| undefined` | `Infinity` | | Maximum number of selectable items (limits selection when `multiple` is true). |
@@ -1915,11 +1982,11 @@ States are listed in precedence order: when two are on at once and their entries
1915
1982
 
1916
1983
  - `activator` — scope: `BbSelectPopoverActivatorSlotProps` `{ clear: () => void; close: () => Promise<void>; focus: () => void; disabled: boolean; loading: boolean; open: () => Promise<void>; props: { ref: (reference: unknown) => void; }; query: string; readonly: boolean; selectedOptions: BbSelectResolvedOption<any>[]; shown: boolean; text: string; toggle: () => Promise<void> }` — Replaces the default trigger element that opens the select popover.
1917
1984
  - `empty` — scope: `{ query: string; focus: () => void; error: unknown; }` — Content shown when no options match the query or the list is empty. `error` is what the latest failed load threw, untouched (`null` when none).
1918
- - `footer` — scope: `BbSelectPopoverPanelSlotProps` `{ close: () => Promise<void>; clear: () => void; focus: () => void; query: string; selectedOptions: BbSelectResolvedOption<any>[] }` — Content pinned to the bottom of the panel, below the options list. Rendered in both the desktop popover and the adaptive sheet.
1985
+ - `footer` — scope: `BbSelectPopoverPanelSlotProps` `{ close: () => Promise<void>; clear: () => void; focus: () => void; query: string; selectedOptions: BbSelectResolvedOption<any>[]; titleId: string }` — Content pinned to the bottom of the panel, below the options list. Rendered in both the desktop popover and the adaptive sheet.
1919
1986
  - `group` — scope: `BbSelectPopoverGroupSlotProps<Item>` `{ disabled: boolean; index: number; item: Item; length: number; text: string }` — Replaces the default group header rendered above grouped options. Not called for rows with no group (`group-by` gives `null`/`undefined`, known rows): they are listed without a header.
1920
- - `header` — scope: `BbSelectPopoverPanelSlotProps` `{ close: () => Promise<void>; clear: () => void; focus: () => void; query: string; selectedOptions: BbSelectResolvedOption<any>[] }` — Content pinned to the top of the panel, above the search field. Rendered in both the desktop popover and the adaptive sheet.
1987
+ - `header` — scope: `BbSelectPopoverPanelSlotProps` `{ close: () => Promise<void>; clear: () => void; focus: () => void; query: string; selectedOptions: BbSelectResolvedOption<any>[]; titleId: string }` — Content pinned to the top of the panel, above the search field. Rendered in both the desktop popover and the adaptive sheet.
1921
1988
  - `loading` — scope: `{ query: string; }` — Content shown inside the options dropdown while items are loading.
1922
- - `option` — scope: `BbSelectPopoverOptionSlotProps<Item>` `{ disabled: boolean; focused: boolean; index: number; item: Item; loading: boolean; selected: boolean; text: string; value: any; description: string }` — Replaces the default rendering of each option row in the dropdown.
1989
+ - `option` — scope: `BbSelectPopoverOptionSlotProps<Item, Known>` `{ known: boolean; item: BbSelectKnownItem \| Item; disabled: boolean; focused: boolean; index: number; loading: boolean; selected: boolean; text: string; value: any; description: string }` — Replaces the default rendering of each option row in the dropdown. With `known-items` bound, a row the list has not brought yet is the known `{ value, label }` row, `known: true`: check `known` before reading an option field off `item`.
1923
1990
 
1924
1991
  ## CSS custom properties
1925
1992
 
@@ -1942,7 +2009,7 @@ Set these on the element, or on a class you put on it, to retune this component
1942
2009
  - Listed nodes are the ones `BbSelectPopover`'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/BbSelectPopover.tree.json`.
1943
2010
 
1944
2011
  - `BbSelectPopover` _(this component)_ — its own template binds: `input` → `input.bb-select-popover__input`, `clear` → `ClearableButton`, `panel` → `CommonPopover`, `root` → `CommonPopover`, `header` → `div.bb-select-popover__header`, `footer` → `div.bb-select-popover__footer`; hands `BbOffCanvas` the pt map `{ header: 'header', footer: 'footer', panel: 'root', sheet: 'root' }` (ours → theirs)
1945
- - `BbBadge` _(public — [contract](./BbBadge.md))_ — its own pt parts (`BbBadge`): `spinner` → `BbSpinner`, `icon` → `BbIcon`, `clear` → `button.bb-badge__clear`; documented CSS variables: `--bg`, `--fg`, `--bw`, `--ring-color`, `--ring-size`, `--min-size-md`, `--min-size`, `--elev`, `--r`, `--fs`, `--icon-size`, `--gap`, `--px`, `--clear-size`, `--bg-disabled`, `--fg-disabled`, `--border-disabled`, `--pad-left`; also mounts `BbIcon`, `BbSpinner`, `BadgeBodyContent`
2012
+ - `BbBadge` _(public — [contract](./BbBadge.md))_ — its own pt parts (`BbBadge`): `spinner` → `BbSpinner`, `icon` → `span.bb-badge__append-icon`, `icon` → `BbIcon`, `clear` → `button.bb-badge__clear`; documented CSS variables: `--bg`, `--fg`, `--bw`, `--ring-color`, `--ring-size`, `--min-size-md`, `--min-size`, `--elev`, `--r`, `--fs`, `--icon-size`, `--gap`, `--px`, `--clear-size`, `--bg-disabled`, `--fg-disabled`, `--border-disabled`, `--pad-left`; also mounts `BbIcon`, `BbSpinner`, `BadgeBodyContent`
1946
2013
  - `BbOffCanvas` _(public — [contract](./BbOffCanvas.md))_ — its own pt parts (`BbOffCanvas`): `header` → `div.bb-offcanvas__header`, `title` → `span.bb-offcanvas__title`, `description` → `p.bb-offcanvas__description`, `close` → `CloseButton`, `content` → `div.bb-offcanvas__content`, `footer` → `div.bb-offcanvas__footer`; documented CSS variables: `--stack-x`, `--snap-y`, `--stack-fill`, `--stack-transition-duration`, `--px`, `--handle-w`, `--handle-h`, `--handle-bg`, `--safe-top`, `--close-size`
1947
2014
  - `CloseButton` _(internal — not importable, reach it through `BbOffCanvas`)_ — documented CSS variables: `--size`, `--p`
1948
2015
  - `ListBox` _(internal — not importable, reach it through `BbSelectPopover`)_
@@ -674,7 +674,7 @@ const settings = reactive<Setting[]>([
674
674
  </script>
675
675
  ```
676
676
 
677
- An attribute in `attrs` wins over ours. The visually hidden native input is
677
+ An attribute in `attrs` wins over ours. The invisible native input under the glyph is
678
678
  not a part — plain attributes on the component land on the root. A listener in `attrs` runs after the control's own
679
679
  handler, never instead of it. The full grammar, the merge rules and the global
680
680
  map are in the [passthrough guide](./guides/passthrough.md).
@@ -41,6 +41,27 @@
41
41
  | `--inset` | `pt:icon` | `BbBaseSwitchIcon` | Equal gap around the thumb — centres it vertically by construction, and is reused as the resting left/right inset. |
42
42
  | `--travel` | `pt:icon` | `BbBaseSwitchIcon` | How far the thumb slides between off and on (inset ↔ inset). |
43
43
  | `--ctrl-line` | `pt:label` | `CommonField` | Where the control's first line is centred, from the top of the control column (half the box height by default); the label's first line aligns to it in side-by-side layouts. |
44
+ | `--list-bg` | `pt:list`, `pt:item`, `pt:label`, `pt:itemDescription` | `OptionsContainer` | The strip behind the triggers |
45
+ | `--list-border` | `pt:list`, `pt:item`, `pt:label`, `pt:itemDescription` | `OptionsContainer` | 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 |
46
+ | `--p` | `pt:list`, `pt:item`, `pt:label`, `pt:itemDescription` | `OptionsContainer` | strip inner padding — the gutter the indicator sits in, and the scroll inset |
47
+ | `--list-r` | `pt:list`, `pt:item`, `pt:label`, `pt:itemDescription` | `OptionsContainer` | strip corners |
48
+ | `--list-h` | `pt:list`, `pt:item`, `pt:label`, `pt:itemDescription` | `OptionsContainer` | strip min height |
49
+ | `--fs` | `pt:list`, `pt:item`, `pt:label`, `pt:itemDescription` | `OptionsContainer` | trigger label size |
50
+ | `--trigger-gap` | `pt:list`, `pt:item`, `pt:label`, `pt:itemDescription` | `OptionsContainer` | space between triggers |
51
+ | `--trigger-px` | `pt:list`, `pt:item`, `pt:label`, `pt:itemDescription` | `OptionsContainer` | trigger side padding |
52
+ | `--trigger-r` | `pt:list`, `pt:item`, `pt:label`, `pt:itemDescription` | `OptionsContainer` | Trigger corners, concentric inside --list-r |
53
+ | `--trigger-min-h` | `pt:list`, `pt:item`, `pt:label`, `pt:itemDescription` | `OptionsContainer` | Trigger height inside the padded strip |
54
+ | `--list-fg` | `pt:list`, `pt:item`, `pt:label`, `pt:itemDescription` | `OptionsContainer` | unchecked trigger label |
55
+ | `--hover-fg` | `pt:list`, `pt:item`, `pt:label`, `pt:itemDescription` | `OptionsContainer` | hovered trigger label |
56
+ | `--active-fg` | `pt:list`, `pt:item`, `pt:label`, `pt:itemDescription` | `OptionsContainer` | checked trigger label |
57
+ | `--active-fw` | `pt:list`, `pt:item`, `pt:label`, `pt:itemDescription` | `OptionsContainer` | checked trigger label weight (unchecked labels are 500) |
58
+ | `--indicator-bg` | `pt:list`, `pt:item`, `pt:label`, `pt:itemDescription` | `OptionsContainer` | the indicator's fill |
59
+ | `--indicator-border` | `pt:list`, `pt:item`, `pt:label`, `pt:itemDescription` | `OptionsContainer` | The indicator's edge |
60
+ | `--indicator-r` | `pt:list`, `pt:item`, `pt:label`, `pt:itemDescription` | `OptionsContainer` | The indicator's corners — the pill's, concentric inside --list-r |
61
+ | `--indicator-h` | `pt:list`, `pt:item`, `pt:label`, `pt:itemDescription` | `OptionsContainer` | 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) |
62
+ | `--indicator-inset` | `pt:list`, `pt:item`, `pt:label`, `pt:itemDescription` | `OptionsContainer` | 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 |
63
+ | `--elev` | `pt:list`, `pt:item`, `pt:label`, `pt:itemDescription` | `OptionsContainer` | The theme's resting lift, composed UNDER the indicator's own shadow |
64
+ | `--indicator-shadow` | `pt:list`, `pt:item`, `pt:label`, `pt:itemDescription` | `OptionsContainer` | Indicator lift, painted on top of --elev |
44
65
 
45
66
  ## Usage & Guidelines
46
67
 
@@ -624,6 +645,12 @@ that list is a type error and an ESLint error.
624
645
  The notification channels above, restyled as option tiles: `pt:item` is a
625
646
  broadcast over every row, `pt:item:checked` resolves per row.
626
647
 
648
+ In `list-layout="tiles"` the whole tile is the switch's click and hover
649
+ target, padding included; a link or a button inside a tile keeps its own
650
+ click. A side hidden with the library's or Tailwind's hiding classes
651
+ (`pt:icon="hidden"`, `hide-label`, `pt:label="sr-only"`) takes its gap with
652
+ it, so the other side stays centred.
653
+
627
654
  **pt:item — notification tiles, the selected ones accented**
628
655
 
629
656
  ```vue
@@ -686,7 +713,7 @@ ours, an attribute in `attrs` wins over ours. The full grammar, the merge rules
686
713
  and the global map are in the [passthrough guide](./guides/passthrough.md).
687
714
 
688
715
  A `pt` value written in `<script>` (a constant, a preset, a wrapper's
689
- `pt` prop) is typed as `BbSwitchGroupProps<Row>['pt']`, or `BbSwitchGroupProps['pt']`
716
+ `pt` prop) is typed as `BbSwitchGroupProps<Row>['pt']`, or `BbSwitchGroupProps<object>['pt']`
690
717
  for a preset that fits any row type (never `<any>`), not an imported
691
718
  `PtValue`: see
692
719
  [passthrough § Typing `pt` in `<script>`](./guides/passthrough.md#typing-pt-in-script).
@@ -739,7 +766,7 @@ for a preset that fits any row type (never `<any>`), not an imported
739
766
 
740
767
  | Prop | Type | Default | Required | Description |
741
768
  | --- | --- | --- | --- | --- |
742
- | `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: `description`, `hint`, `icon`, `item`, `itemDescription`, `label`, `legend`, `list`, `message`, `root`. States: `disabled`, `errors`, `hasValue`, `loading`, `readonly`, `warnings`, `checked`, `focused`, `focusVisible`. 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 `BbSwitchGroupProps<Row>['pt']` (`BbSwitchGroupProps['pt']` for a preset that fits any row type, never `<any>`) (`PtValue` is not exported): § Typing `pt` in `<script>`. |
769
+ | `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: `description`, `hint`, `icon`, `item`, `itemDescription`, `label`, `legend`, `list`, `message`, `root`. States: `disabled`, `errors`, `hasValue`, `loading`, `readonly`, `warnings`, `checked`, `focused`, `focusVisible`. 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 `BbSwitchGroupProps<Row>['pt']` (`BbSwitchGroupProps<object>['pt']` for a preset that fits any row type, never `<any>`) (`PtValue` is not exported): § Typing `pt` in `<script>`. |
743
770
  | `autofocus` | `Booleanish \| undefined` | | | Focuses the field when it mounts (a dialog already open included), unless the user is typing in another field. |
744
771
  | `compact` | `boolean \| undefined` | `false` | | Compact density. Swaps `--bb-label-spacing-y` for `--bb-label-spacing-y-compact`, so tune a compact group's label gap with the `-compact` token, not the base one. |
745
772
  | `dependencies` | `unknown[] \| undefined` | | | Defines an array of dependencies that will trigger actions in the component upon change. |
@@ -865,7 +892,7 @@ Set these on the element, or on a class you put on it, to retune this component
865
892
 
866
893
  - `BbSwitchGroup` _(this component)_ — its own template binds: `icon` → `BbBaseSwitchIcon`
867
894
  - `CommonField` _(internal — not importable, reach it through `BbSwitchGroup`)_ — `BbSwitchGroup`'s pt parts land here: `root` → `div.bb-field`, `label` → `component`, `description` → `span.bb-field__description`, `hint` → `span.bb-field__hint`, `counter` → `span.bb-field__counter`, `message` → `div.bb-field__message`; documented CSS variables: `--ctrl-line`; also mounts `BbAsterisk`
868
- - `OptionsContainer` _(internal — not importable, reach it through `BbSwitchGroup`)_ — `BbSwitchGroup`'s pt parts land here: `list` → `span`, `item` → `label`, `label` → `span`, `itemDescription` → `span`
895
+ - `OptionsContainer` _(internal — not importable, reach it through `BbSwitchGroup`)_ — `BbSwitchGroup`'s pt parts land here: `list` → `span`, `item` → `label`, `label` → `span`, `itemDescription` → `span`; documented CSS variables: `--list-bg`, `--list-border`, `--p`, `--list-r`, `--list-h`, `--fs`, `--trigger-gap`, `--trigger-px`, `--trigger-r`, `--trigger-min-h`, `--list-fg`, `--hover-fg`, `--active-fg`, `--active-fw`, `--indicator-bg`, `--indicator-border`, `--indicator-r`, `--indicator-h`, `--indicator-inset`, `--elev`, `--indicator-shadow`
869
896
  - Also mounts `BbBaseSwitchIcon`
870
897
 
871
898
  ## See Also
@@ -93,17 +93,24 @@ needs is declared here, not in markup:
93
93
  for about three, fitted to the room the sized columns leave. Values a line
94
94
  break would harm stay whole: a short name or status ("Poltrona 10", "In
95
95
  attesa di verifica"), an amount with its currency, a range or pair ("0,00 € /
96
- 450,00 €"), a date or code ("16/10/2026", a grouped IBAN). When room runs
97
- short, longer values wrap first, then prose narrows, then a long heading of
96
+ 450,00 €"), a date or code ("16/10/2026", a grouped IBAN). The floors are
97
+ estimated on the server and then refined in the browser from the text as it
98
+ actually renders (its font, weight, letter-spacing, text-transform, numeric
99
+ features and size), so a value the table keeps on one line stays whole in
100
+ any font, including a web font that loads late. When room runs short,
101
+ longer values wrap first, then prose narrows, then a long heading of
98
102
  several words takes two lines; a table that scrolls sideways anyway keeps
99
103
  all of those whole. Only a table that would otherwise _start_ scrolling
100
104
  wraps them, and long-form text never runs wider than a readable measure.
101
- You rarely need `whitespace-nowrap` in a `td-class`. The header is always
102
- part of that floor, so a heading never clips. (On a server-rendered page
103
- the server cannot know the width: a table whose headings need two lines
104
- takes them, once, when the page hydrates.) The floors read every row up
105
- to 2,000; past that, the first 1,000 and a sample across the rest (a
106
- `virtual` table has no floors at all). No floor on `fixed` or
105
+ You rarely need `whitespace-nowrap` in a `td-class`, in any font. It
106
+ overrides the table's choice: the value stays whole even where the table
107
+ would wrap it to spare a sideways scroll. The header is always part of
108
+ that floor, so a heading never clips. (On a server-rendered page the
109
+ server cannot know the width: a table whose headings need two lines takes
110
+ them, once, when the page hydrates.) The floors read every row up to
111
+ 2,000; past that, the first 1,000 and a sample across the rest, and a value
112
+ only the unread rows show may wrap (a `virtual` table has no floors at
113
+ all). No floor on `fixed` or
107
114
  `virtual` tables, slot columns, or under a custom `#thead`, so never slot a
108
115
  column only to restyle its blank: use [`--placeholder`](#empty-cells-value-and-placeholder). A grid keyword or function is the track as written:
109
116
  `'auto'`, `'2fr'`, `'minmax(0, 1fr)'` (a share that may shrink below its
@@ -4068,7 +4075,7 @@ The full grammar, the merge rules and the global map are in the
4068
4075
  [passthrough guide](./guides/passthrough.md).
4069
4076
 
4070
4077
  A `pt` value written in `<script>` (a constant, a preset, a wrapper's
4071
- `pt` prop) is typed as `BbTableProps<Row>['pt']`, or `BbTableProps['pt']`
4078
+ `pt` prop) is typed as `BbTableProps<Row>['pt']`, or `BbTableProps<object>['pt']`
4072
4079
  for a preset that fits any row type (never `<any>`), not an imported
4073
4080
  `PtValue`: see
4074
4081
  [passthrough § Typing `pt` in `<script>`](./guides/passthrough.md#typing-pt-in-script).
@@ -4234,7 +4241,7 @@ for a preset that fits any row type (never `<any>`), not an imported
4234
4241
 
4235
4242
  | Prop | Type | Default | Required | Description |
4236
4243
  | --- | --- | --- | --- | --- |
4237
- | `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: `body`, `caption`, `cell`, `cellColumnHeader`, `dragHandle`, `dragIcon`, `expand`, `firstRow`, `foot`, `head`, `headerRow`, `lastRow`, `root`, `row`, `selectIcon`, `sortIcon`, `table`. States: `disabled`, `empty`, `expanded`, `highlighted`, `indeterminate`, `loading`, `placeholder`, `selected`, `sorted`, `sortedDesc`, `value`. 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 `BbTableProps<Row>['pt']` (`BbTableProps['pt']` for a preset that fits any row type, never `<any>`) (`PtValue` is not exported): § Typing `pt` in `<script>`. |
4244
+ | `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: `body`, `caption`, `cell`, `cellColumnHeader`, `dragHandle`, `dragIcon`, `expand`, `firstRow`, `foot`, `head`, `headerRow`, `lastRow`, `root`, `row`, `selectIcon`, `sortIcon`, `table`. States: `disabled`, `empty`, `expanded`, `highlighted`, `indeterminate`, `loading`, `placeholder`, `selected`, `sorted`, `sortedDesc`, `value`. 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 `BbTableProps<Row>['pt']` (`BbTableProps<object>['pt']` for a preset that fits any row type, never `<any>`) (`PtValue` is not exported): § Typing `pt` in `<script>`. |
4238
4245
  | `accessibleLabel` | `((columns: MappedCell[], item: any) => string) \| undefined` | | | The label of each row's selection checkbox, from `(columns, item)`. Unset: the row's name in the locale's select template (its `rowHeader` cells, else its first column: "Select INV-1041"). The cells arrive in render order: look one up by `key`, never by position. |
4239
4246
  | `actionsText` | `string \| undefined` | | | Label used in the header of the actions column. |
4240
4247
  | `align` | `"left" \| "center" \| "right" \| undefined` | `"left"` | | Text alignment of the columns. |
package/dist/ai/BbTabs.md CHANGED
@@ -649,7 +649,9 @@ every variant. Three ship:
649
649
 
650
650
  - **`pill`** (default) — the segmented strip: a muted rounded bar with a raised
651
651
  pill sliding under the active trigger. Reach for it to switch _views of the
652
- same content_ (Board / Table, Code / Preview).
652
+ same content_ (Board / Table, Code / Preview). Switch views → `BbTabs`;
653
+ pick a value a form or a filter submits → a segmented `BbRadioGroup`
654
+ (BbRadioGroup § Segmented control), even when the two look alike.
653
655
  - **`line`** — triggers on a thin baseline that runs the full width of the
654
656
  strip's container, a sliding underline under the active one (on the side edge
655
657
  when `direction="vertical"`), active label bold. Reach
@@ -1838,7 +1840,7 @@ A `pt` value written in `<script>` (a constant, a preset, a wrapper's
1838
1840
 
1839
1841
  | Prop | Type | Default | Required | Description |
1840
1842
  | --- | --- | --- | --- | --- |
1841
- | `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: `indicator`, `item`, `list`, `panel`, `panels`, `root`, `wrapper`. States: `active`, `disabled`. 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 `BbTabsProps['pt']` (`PtValue` is not exported): § Typing `pt` in `<script>`. |
1843
+ | `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: `indicator`, `item`, `list`, `panel`, `panels`, `root`, `wrapper`. States: `active`, `disabled`, `line`, `none`, `pill`. 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 `BbTabsProps['pt']` (`PtValue` is not exported): § Typing `pt` in `<script>`. |
1842
1844
  | `block` | `boolean \| undefined` | `false` | | Displays the component as full width. |
1843
1845
  | `compact` | `boolean \| undefined` | `false` | | Adds a CSS class that applies a compact style to the component. |
1844
1846
  | `direction` | `"horizontal" \| "vertical" \| undefined` | `"horizontal"` | | Direction of the tabs component. |
@@ -1887,6 +1889,9 @@ States are listed in precedence order: when two are on at once and their entries
1887
1889
  | --- | --- |
1888
1890
  | `disabled` | On every part while the whole tabs is `disabled`; per node on `item`: a tab that is disabled. |
1889
1891
  | `active` | Per node, on `item` and `panel`: the selected tab's trigger and its shown panel. |
1892
+ | `line` | On the strip's parts: `variant: 'line'`. Below the real states, like every variant. |
1893
+ | `none` | On the strip's parts: `variant: 'none'`. Below the real states, like every variant. |
1894
+ | `pill` | On the strip's parts: `variant: 'pill'`. Merged after the part's base entry and before its states, so the real states still win. |
1890
1895
 
1891
1896
  ## Events
1892
1897
 
@@ -1941,7 +1946,7 @@ Set these on the element, or on a class you put on it, to retune this component
1941
1946
  - **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 `BbTabs`'s root, where the node's own declaration masks it (design-tokens guide, _Overriding one from a consumer app_, rule 0).
1942
1947
  - Listed nodes are the ones `BbTabs`'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/BbTabs.tree.json`.
1943
1948
 
1944
- - `BbTabs` _(this component)_ — hands `BbTabsList` the pt map `passthrough.forwardInstance(LIST_PARTS)` (ours → theirs); hands `BbTabsPanels` the pt map `passthrough.forwardInstance(PANELS_PARTS)` (ours → theirs)
1949
+ - `BbTabs` _(this component)_ — hands `BbTabsList` the pt map `passthrough.forwardInstance(LIST_PARTS, LIST_STATES)` (ours → theirs); hands `BbTabsPanels` the pt map `passthrough.forwardInstance(PANELS_PARTS)` (ours → theirs)
1945
1950
  - `BbTabsList` _(public — [contract](./BbTabsList.md))_ — `BbTabs`'s pt parts land here: `list` → `ul.bb-tabs-list__list`, `indicator` → `li.bb-tabs-list__indicator`, `item` → `BbBaseButton`
1946
1951
  - `BbBaseButton` _(public — [contract](./BbBaseButton.md))_ — its own pt parts (`BbBaseButton`): `root` → `RouterComponent`, `root` → `a`, `root` → `component`; also mounts `RouterComponent`
1947
1952
  - `BbTabsPanels` _(public — [contract](./BbTabsPanels.md))_ — `BbTabs`'s pt parts land here: `panel` → `section.bb-tabs__panel`
@@ -20,7 +20,7 @@
20
20
 
21
21
  | Prop | Type | Default | Required | Description |
22
22
  | --- | --- | --- | --- | --- |
23
- | `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: `indicator`, `item`, `list`, `root`. States: `active`, `disabled`. 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 `BbTabsListProps['pt']` (`PtValue` is not exported): § Typing `pt` in `<script>`. |
23
+ | `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: `indicator`, `item`, `list`, `root`. States: `active`, `disabled`, `line`, `none`, `pill`. 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 `BbTabsListProps['pt']` (`PtValue` is not exported): § Typing `pt` in `<script>`. |
24
24
  | `variant` | `'none'` \| `'pill'` \| `'line'` | | | Look of this strip — the `variant` of the owning `BbTabs` / `BbTabsRoot` unless set here. See `BbTabsProps.variant` for the values. |
25
25
 
26
26
  ## Passthrough parts and states
@@ -40,6 +40,9 @@ States are listed in precedence order: when two are on at once and their entries
40
40
  | --- | --- |
41
41
  | `disabled` | On every part while the whole tabs is `disabled`; per node on `item`: a tab that is disabled. |
42
42
  | `active` | Per node, on `item` and `panel`: the selected tab's trigger and its shown panel. |
43
+ | `line` | On the strip's parts: `variant: 'line'`. Below the real states, like every variant. |
44
+ | `none` | On the strip's parts: `variant: 'none'`. Below the real states, like every variant. |
45
+ | `pill` | On the strip's parts: `variant: 'pill'`. Merged after the part's base entry and before its states, so the real states still win. |
43
46
 
44
47
  ## Events
45
48
 
package/dist/ai/BbTag.md CHANGED
@@ -493,7 +493,7 @@ only sets the label's text alignment.
493
493
 
494
494
  | Prop | Type | Default | Required | Description |
495
495
  | --- | --- | --- | --- | --- |
496
- | `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: `badge`, `box`, `clear`, `comma`, `description`, `hint`, `icon`, `input`, `label`, `message`, `prefix`, `root`, `spinner`, `suffix`. States: `disabled`, `errors`, `hasValue`, `highlighted`, `loading`, `readonly`, `warnings`. 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 `BbTagProps['pt']` (`PtValue` is not exported): § Typing `pt` in `<script>`. |
496
+ | `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: `badge`, `box`, `clear`, `comma`, `description`, `hint`, `icon`, `input`, `label`, `message`, `prefix`, `root`, `spinner`, `suffix`. States: `disabled`, `errors`, `hasValue`, `highlighted`, `loading`, `readonly`, `warnings`, `ghost`, `outline`, `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 `BbTagProps['pt']` (`PtValue` is not exported): § Typing `pt` in `<script>`. |
497
497
  | `append:icon` | `string \| undefined` | | | Name of the icon to be added at the end of the input. |
498
498
  | `autocomplete` | `string \| undefined` | `"off"` | | Guides to the browser as to the type of information expected in the field. |
499
499
  | `autofocus` | `Booleanish \| undefined` | | | Focuses the field when it mounts (a dialog already open included), unless the user is typing in another field. |
@@ -565,6 +565,9 @@ States are listed in precedence order: when two are on at once and their entries
565
565
  | `errors` | Component-wide: the control is in its error state (`errors` / `has-errors`, or its validation) — the message line and the box turn red. |
566
566
  | `highlighted` | Per node, on `badge` / `comma`: the tag the arrow keys are on (`bb-badge--highlighted` / `bb-tag__comma--highlighted`). A cursor, not focus: focus stays in the text input. |
567
567
  | `loading` | Component-wide: `loading` is on; the box shows its `spinner`. |
568
+ | `ghost` | On the field's parts: `variant: 'ghost'`. Below the real states, like every variant. |
569
+ | `outline` | On the field's parts: `variant: 'outline'`. Merged after the part's base entry and before its states, so the real states still win. |
570
+ | `secondary` | On the field's parts: `variant: 'secondary'`. Below the real states, like every variant. |
568
571
 
569
572
  ## Events
570
573
 
@@ -619,7 +622,7 @@ Set these on the element, or on a class you put on it, to retune this component
619
622
  - `CommonField` _(internal — not importable, reach it through `BbTag`)_ — `BbTag`'s pt parts land here: `root` → `div.bb-field`, `label` → `component`, `description` → `span.bb-field__description`, `hint` → `span.bb-field__hint`, `counter` → `span.bb-field__counter`, `message` → `div.bb-field__message`; documented CSS variables: `--ctrl-line`; also mounts `BbAsterisk`
620
623
  - `CommonFieldInput` _(internal — not importable, reach it through `BbTag`)_ — `BbTag`'s pt parts land here: `box` → `span.bb-field-input__box`, `prefix` → `span.bb-field-input__prefix`, `icon` → `BbIcon`, `clear` → `ClearableButton`, `spinner` → `BbSpinner`, `suffix` → `span.bb-field-input__suffix`; documented CSS variables: `--bg`, `--bg-hover`, `--bg-focus`, `--bg-disabled`, `--fg-disabled`, `--border-color`, `--border-focus`, `--ring-size`, `--ring-color`, `--elev`, `--frost`, `--inside-label-clearance`; also mounts `ErrorIcon`, `WarningIcon`, `ClearableButton`, `BbIcon`, `BbSpinner`
621
624
  - `ChipsBox` _(internal — not importable, reach it through `BbTag`)_ — `BbTag`'s pt parts land here: `badge` → `BbBadge`
622
- - `BbBadge` _(public — [contract](./BbBadge.md))_ — its own pt parts (`BbBadge`): `spinner` → `BbSpinner`, `icon` → `BbIcon`, `clear` → `button.bb-badge__clear`; documented CSS variables: `--bg`, `--fg`, `--bw`, `--ring-color`, `--ring-size`, `--min-size-md`, `--min-size`, `--elev`, `--r`, `--fs`, `--icon-size`, `--gap`, `--px`, `--clear-size`, `--bg-disabled`, `--fg-disabled`, `--border-disabled`, `--pad-left`; also mounts `BbIcon`, `BbSpinner`, `BadgeBodyContent`
625
+ - `BbBadge` _(public — [contract](./BbBadge.md))_ — its own pt parts (`BbBadge`): `spinner` → `BbSpinner`, `icon` → `span.bb-badge__append-icon`, `icon` → `BbIcon`, `clear` → `button.bb-badge__clear`; documented CSS variables: `--bg`, `--fg`, `--bw`, `--ring-color`, `--ring-size`, `--min-size-md`, `--min-size`, `--elev`, `--r`, `--fs`, `--icon-size`, `--gap`, `--px`, `--clear-size`, `--bg-disabled`, `--fg-disabled`, `--border-disabled`, `--pad-left`; also mounts `BbIcon`, `BbSpinner`, `BadgeBodyContent`
623
626
  - `CommaBox` _(internal — not importable, reach it through `BbTag`)_ — `BbTag`'s pt parts land here: `comma` → `span.bb-tag__comma`
624
627
  - Also mounts `BbSmoothHeight`
625
628
 
@@ -1267,7 +1267,7 @@ A `pt` value written in `<script>` (a constant, a preset, a wrapper's
1267
1267
 
1268
1268
  | Prop | Type | Default | Required | Description |
1269
1269
  | --- | --- | --- | --- | --- |
1270
- | `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: `box`, `clear`, `counter`, `description`, `hint`, `icon`, `input`, `label`, `message`, `prefix`, `root`, `spinner`, `suffix`. States: `atLimit`, `disabled`, `errors`, `hasValue`, `loading`, `nearLimit`, `readonly`, `warnings`. 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 `BbTextInputProps['pt']` (`PtValue` is not exported): § Typing `pt` in `<script>`. |
1270
+ | `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: `box`, `clear`, `counter`, `description`, `hint`, `icon`, `input`, `label`, `message`, `prefix`, `root`, `spinner`, `suffix`. States: `atLimit`, `disabled`, `errors`, `ghost`, `hasValue`, `loading`, `nearLimit`, `outline`, `readonly`, `secondary`, `warnings`. 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 `BbTextInputProps['pt']` (`PtValue` is not exported): § Typing `pt` in `<script>`. |
1271
1271
  | `append:icon` | `string \| undefined` | | | Name of the icon to be added at the end of the input. |
1272
1272
  | `autocomplete` | `string \| undefined` | | | Guides to the browser as to the type of information expected in the field. |
1273
1273
  | `autofocus` | `Booleanish \| undefined` | | | Focuses the field when it mounts (a dialog already open included), unless the user is typing in another field. |
@@ -1341,6 +1341,9 @@ States are listed in precedence order: when two are on at once and their entries
1341
1341
  | `warnings` | Component-wide: the control is in its warning state (`warnings` / `has-warnings`) and not in an error state — errors win, so the two are never on together. |
1342
1342
  | `errors` | Component-wide: the control is in its error state (`errors` / `has-errors`, or its validation) — the message line and the box turn red. |
1343
1343
  | `loading` | Component-wide: `loading` is on; the box shows its `spinner`. |
1344
+ | `ghost` | On the field's parts: `variant: 'ghost'`. Below the real states, like every variant. |
1345
+ | `outline` | On the field's parts: `variant: 'outline'`. Merged after the part's base entry and before its states, so the real states still win. |
1346
+ | `secondary` | On the field's parts: `variant: 'secondary'`. Below the real states, like every variant. |
1344
1347
 
1345
1348
  ## Events
1346
1349
 
@@ -1026,7 +1026,7 @@ A `pt` value written in `<script>` (a constant, a preset, a wrapper's
1026
1026
 
1027
1027
  | Prop | Type | Default | Required | Description |
1028
1028
  | --- | --- | --- | --- | --- |
1029
- | `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: `box`, `clear`, `counter`, `description`, `hint`, `icon`, `input`, `label`, `message`, `prefix`, `root`, `spinner`, `suffix`. States: `atLimit`, `disabled`, `errors`, `hasValue`, `loading`, `nearLimit`, `readonly`, `warnings`. 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 `BbTextareaProps['pt']` (`PtValue` is not exported): § Typing `pt` in `<script>`. |
1029
+ | `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: `box`, `clear`, `counter`, `description`, `hint`, `icon`, `input`, `label`, `message`, `prefix`, `root`, `spinner`, `suffix`. States: `atLimit`, `disabled`, `errors`, `ghost`, `hasValue`, `loading`, `nearLimit`, `outline`, `readonly`, `secondary`, `warnings`. 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 `BbTextareaProps['pt']` (`PtValue` is not exported): § Typing `pt` in `<script>`. |
1030
1030
  | `append:icon` | `string \| undefined` | | | Name of the icon to be added at the end of the input. |
1031
1031
  | `autocomplete` | `string \| undefined` | | | Guides to the browser as to the type of information expected in the field. |
1032
1032
  | `autofocus` | `Booleanish \| undefined` | | | Focuses the field when it mounts (a dialog already open included), unless the user is typing in another field. |
@@ -1098,6 +1098,9 @@ States are listed in precedence order: when two are on at once and their entries
1098
1098
  | `warnings` | Component-wide: the control is in its warning state (`warnings` / `has-warnings`) and not in an error state — errors win, so the two are never on together. |
1099
1099
  | `errors` | Component-wide: the control is in its error state (`errors` / `has-errors`, or its validation) — the message line and the box turn red. |
1100
1100
  | `loading` | Component-wide: `loading` is on; the box shows its `spinner`. |
1101
+ | `ghost` | On the field's parts: `variant: 'ghost'`. Below the real states, like every variant. |
1102
+ | `outline` | On the field's parts: `variant: 'outline'`. Merged after the part's base entry and before its states, so the real states still win. |
1103
+ | `secondary` | On the field's parts: `variant: 'secondary'`. Below the real states, like every variant. |
1101
1104
 
1102
1105
  ## Events
1103
1106
 
@@ -165,7 +165,8 @@ On mobile the columns open in a bottom off-canvas sheet instead of a floating
165
165
  popover (`adaptive`, on by default via `config.adaptive`; forward extra sheet
166
166
  props with `offCanvasProps`). Position the desktop popover with `placement`,
167
167
  `offset`, `padding`, `boundary`, and `disableFlip` — the same knobs as the other
168
- overlays. Escape and backdrop clicks close it; focus returns to the activator.
168
+ overlays (`placement` is read at open: a change while open applies at the next
169
+ open). Escape and backdrop clicks close it; focus returns to the activator.
169
170
 
170
171
  The sheet can be **dragged down to dismiss** and shows **no ✕** — picking,
171
172
  drag, backdrop tap and Escape close it. The time wheels are no-drag zones: a
@@ -304,7 +304,7 @@ Messages _also_ render in an `aria-live="polite"` region.
304
304
 
305
305
  | Prop | Type | Default | Required | Description |
306
306
  | --- | --- | --- | --- | --- |
307
- | `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: `activator`, `box`, `cellColumnHeader`, `clear`, `description`, `header`, `hint`, `icon`, `input`, `item`, `label`, `message`, `panel`, `prefix`, `root`, `sheet`, `spinner`, `suffix`. States: `disabled`, `errors`, `hasValue`, `loading`, `open`, `readonly`, `selected`, `warnings`. 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 `BbTimePickerInputProps['pt']` (`PtValue` is not exported): § Typing `pt` in `<script>`. |
307
+ | `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: `activator`, `box`, `cellColumnHeader`, `clear`, `description`, `header`, `hint`, `icon`, `input`, `item`, `label`, `message`, `panel`, `prefix`, `root`, `sheet`, `spinner`, `suffix`. States: `disabled`, `errors`, `ghost`, `hasValue`, `loading`, `open`, `outline`, `readonly`, `secondary`, `selected`, `warnings`. 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 `BbTimePickerInputProps['pt']` (`PtValue` is not exported): § Typing `pt` in `<script>`. |
308
308
  | `adaptive` | `boolean \| undefined` | ``config.adaptive` (`true`)` | | On mobile the time columns open inside a bottom off-canvas sheet instead of a floating popover. When unset, falls back to the global `config.adaptive`. |
309
309
  | `ampm` | `boolean \| undefined` | `false` | | 12-hour display with an AM/PM segment. Purely a field-composition concern: the model stays 24-hour. Type `A`/`P` (or ArrowUp/Down) to set the meridiem. |
310
310
  | `append:icon` | `string \| undefined` | | | Name of the icon to be added at the end of the input. |
@@ -387,6 +387,9 @@ States are listed in precedence order: when two are on at once and their entries
387
387
  | `errors` | Component-wide: the control is in its error state (`errors` / `has-errors`, or its validation) — the message line and the box turn red. |
388
388
  | `open` | Component-wide: the panel is showing — `pt:activator:open` styles the trigger while it is. |
389
389
  | `loading` | Component-wide: `loading` is on; the box shows its `spinner`. |
390
+ | `ghost` | On the field's parts: `variant: 'ghost'`. Below the real states, like every variant. |
391
+ | `outline` | On the field's parts: `variant: 'outline'`. Merged after the part's base entry and before its states, so the real states still win. |
392
+ | `secondary` | On the field's parts: `variant: 'secondary'`. Below the real states, like every variant. |
390
393
 
391
394
  ## Events
392
395
 
@@ -772,7 +772,7 @@ The map is typed where you write it by `definePt`, never with an imported
772
772
 
773
773
  | Prop | Type | Default | Required | Description |
774
774
  | --- | --- | --- | --- | --- |
775
- | `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: `action`, `close`, `content`, `footer`, `icon`, `panel`, `root`, `text`, `title`. States: `loading`. 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 `BbToastProps['pt']` (`PtValue` is not exported): § Typing `pt` in `<script>`. |
775
+ | `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: `action`, `close`, `content`, `footer`, `icon`, `panel`, `root`, `text`, `title`. States: `default`, `destructive`, `info`, `loading`, `success`, `warning`. 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 `BbToastProps['pt']` (`PtValue` is not exported): § Typing `pt` in `<script>`. |
776
776
 
777
777
  ## Passthrough parts and states
778
778
 
@@ -795,6 +795,11 @@ States are listed in precedence order: when two are on at once and their entries
795
795
  | State | When it is on |
796
796
  | --- | --- |
797
797
  | `loading` | Per toast, on its card parts (every part but `root`): the toast is `loading` (the spinner shows in its `icon`). |
798
+ | `default` | Per toast, on its card parts: `variant: 'default'`. Merged after the part's base entry and before its states, so the real states still win. |
799
+ | `destructive` | Per toast, on its card parts: `variant: 'destructive'`. Below the real states, like every variant. |
800
+ | `info` | Per toast, on its card parts: `variant: 'info'`. Below the real states, like every variant. |
801
+ | `success` | Per toast, on its card parts: `variant: 'success'`. Below the real states, like every variant. |
802
+ | `warning` | Per toast, on its card parts: `variant: 'warning'`. Below the real states, like every variant. |
798
803
 
799
804
  ## Events
800
805
 
@@ -822,7 +827,8 @@ Set these on the element, or on a class you put on it, to retune this component
822
827
  | `--r` | `.bb-toast__panel` | `min(var(--bb-radius), 10px)` | Card corners. `border-radius` caps whatever lands here again, at 14px. |
823
828
  | `--ring-size` | `.bb-toast__panel` | `2px` | focus ring on the close button |
824
829
  | `--bg` | `.bb-toast__panel` | `var(--bb-panel)` | card fill, and the close button's own fill |
825
- | `--border-color` | `.bb-toast__panel` | `var(--bb-border)` | Card edge, painted as an inset ring (the card carries no `border`) |
830
+ | `--border-color` | `.bb-toast__panel` | `var(--bb-border)` | card edge |
831
+ | `--bw` | `.bb-toast__panel` | `var(--bb-border-w)` | Edge width: a real `border`, counted in the measured height; the inner padding and the × take it back, so the card keeps its size. |
826
832
  | `--fg` | `.bb-toast__panel` | `var(--bb-text)` | title, text and close glyph |
827
833
  | `--icon-color` | `.bb-toast__panel` | `var(--bb-text)` | The status glyph only — the variants below re-point this and nothing else |
828
834
  | `--icon-color` | `.bb-toast__panel--success` | `var(--bb-success)` | |
@@ -843,7 +849,7 @@ Set these on the element, or on a class you put on it, to retune this component
843
849
  - `BbToast` _(this component)_
844
850
  - `BbToastRegion` _(internal — not importable, reach it through `BbToast`)_ — `BbToast`'s pt parts land here: `root` → `ol.bb-toast`
845
851
  - `BbToastMessage` _(internal — not importable, reach it through `BbToast`)_ — also mounts `BbIcon`, `BbSpinner`
846
- - `BbButton` _(public — [contract](./BbButton.md))_ — its own pt parts (`BbButton`): `root` → `BbBaseButton`, `spinner` → `BbSpinner`, `icon` → `BbIcon`, `text` → `span.bb-button__text`; documented CSS variables: `--h-xs`, `--h`, `--icon-size`, `--px`, `--fs`, `--r`, `--gap`, `--bg`, `--bg-hover`, `--bg-pressed`, `--fg`, `--border-color`, `--ring-color`, `--ring-size`, `--bw`, `--fg-hover`, `--border-hover`, `--fg-pressed`, `--border-pressed`, `--bg-disabled`, `--fg-disabled`, `--border-disabled`, `--opacity-disabled`, `--elev-tier`, `--elev`; also mounts `BbIcon`, `BbSpinner`
852
+ - `BbButton` _(public — [contract](./BbButton.md))_ — its own pt parts (`BbButton`): `root` → `BbBaseButton`, `spinner` → `BbSpinner`, `icon` → `span.bb-button__icon`, `icon` → `BbIcon`, `icon` → `span.bb-button__prepend-icon`, `text` → `span.bb-button__text`, `icon` → `span.bb-button__append-icon`; documented CSS variables: `--h-xs`, `--h`, `--icon-size`, `--px`, `--fs`, `--r`, `--gap`, `--bg`, `--bg-hover`, `--bg-pressed`, `--fg`, `--border-color`, `--ring-color`, `--ring-size`, `--bw`, `--fg-hover`, `--border-hover`, `--fg-pressed`, `--border-pressed`, `--bg-disabled`, `--fg-disabled`, `--border-disabled`, `--opacity-disabled`, `--elev-tier`, `--elev`; also mounts `BbIcon`, `BbSpinner`
847
853
  - `BbBaseButton` _(public — [contract](./BbBaseButton.md))_ — its own pt parts (`BbBaseButton`): `root` → `RouterComponent`, `root` → `a`, `root` → `component`; also mounts `RouterComponent`
848
854
 
849
855
  ## See Also