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
@@ -164,7 +164,7 @@
164
164
  :query="query"
165
165
  /></template>
166
166
  <template v-if="$slots.option" #option="data"
167
- ><slot :loading="computedLoading" name="option" v-bind="data"
167
+ ><slot name="option" v-bind="optionSlotProps(data)"
168
168
  /></template>
169
169
  <template #group="data"><slot name="group" v-bind="data" /></template>
170
170
  </ListBox>
@@ -186,8 +186,12 @@
186
186
  "
187
187
  v-bind="mergeProps(offcanvasBindings, sheetEvents, withoutClass($attrs))"
188
188
  >
189
- <template v-if="$slots.header" #header>
190
- <slot name="header" v-bind="panelSlotProps" />
189
+ <template v-if="$slots.header" #header="{ titleId: sheetTitleId }">
190
+ <!-- The sheet's own `titleId`: its dialog is labelled by it. -->
191
+ <slot
192
+ name="header"
193
+ v-bind="{ ...panelSlotProps, titleId: sheetTitleId }"
194
+ />
191
195
  </template>
192
196
  <!-- `tabindex="-1"`: the sheet's own opening focus target. Not focusable
193
197
  by Tab — only programmatically, by BbOffCanvas's `focusTarget`. See the
@@ -284,7 +288,11 @@
284
288
  </CommonPopover>
285
289
  </template>
286
290
 
287
- <script setup lang="ts" generic="Item = any">
291
+ <script
292
+ setup
293
+ lang="ts"
294
+ generic="Item = any, Known extends BbSelectKnownItems | undefined = undefined"
295
+ >
288
296
  import type { Option as BaseOption, GroupedOptions } from '@/types/Option';
289
297
  import {
290
298
  computed,
@@ -298,7 +306,11 @@ import {
298
306
  onDeactivated,
299
307
  } from 'vue';
300
308
  import { isImeComposing } from '@/utilities/functions/isImeComposing';
301
- import { extractDomContainer } from '@/utilities/functions/extractDomContainer';
309
+ import {
310
+ domElement,
311
+ extractDomContainer,
312
+ type DomHost,
313
+ } from '@/utilities/functions/extractDomContainer';
302
314
  import { elementLabel } from '@/utilities/functions/elementLabel';
303
315
  import { get } from '@/utilities/functions/get';
304
316
  import { hash } from '@/utilities/functions/hash';
@@ -371,7 +383,9 @@ import searchIcon from '@/assets/svgs/search.svg?raw';
371
383
  import ListBox from '../ListBox/ListBox.vue';
372
384
  import { waitFor } from '@/utilities/functions/waitFor';
373
385
  import type {
386
+ BbSelectKnownItems,
374
387
  BbSelectPopoverEvents,
388
+ BbSelectPopoverOptionSlotProps,
375
389
  BbSelectPopoverProps,
376
390
  BbSelectPopoverSlots,
377
391
  BbSelectResolvedOption,
@@ -386,7 +400,7 @@ import { removedPropsFor } from '@/deprecation/removedProps';
386
400
  import { warnRemovedAttrs } from '@/utilities/functions/warnRemovedAttrs';
387
401
  import { hasVnodeListener } from '@/utilities/functions/hasVnodeListener';
388
402
 
389
- const props = withDefaults(defineProps<BbSelectPopoverProps<Item>>(), {
403
+ const props = withDefaults(defineProps<BbSelectPopoverProps<Item, Known>>(), {
390
404
  // `undefined` (declared, not omitted) keeps `adaptive` three-state: it disables
391
405
  // Vue's absent→`false` Boolean cast so `props.adaptive ?? config.adaptive` can
392
406
  // reach the config default, while keeping the Boolean type so the valueless
@@ -421,7 +435,7 @@ const props = withDefaults(defineProps<BbSelectPopoverProps<Item>>(), {
421
435
 
422
436
  const emit = defineEmits<BbSelectPopoverEvents>();
423
437
 
424
- defineSlots<BbSelectPopoverSlots<Item>>();
438
+ defineSlots<BbSelectPopoverSlots<Item, Known>>();
425
439
 
426
440
  /**
427
441
  * Passthrough (plans/passthrough/BbSelectPopover.md). `root` merges into the `$attrs` spread on the desktop floating element (no node on the phone sheet, where `panel` then `sheet` land on the sheet root); `option` is resolved per option inside the listbox with `part()`.
@@ -432,6 +446,7 @@ const passthrough = usePassthrough({
432
446
  parts: BB_SELECT_POPOVER_PT.parts,
433
447
  states: BB_SELECT_POPOVER_PT.states,
434
448
  active: { open: () => shown.value },
449
+ facts: (row) => ({ known: isKnown(row) }),
435
450
  });
436
451
 
437
452
  const config = useConfig();
@@ -467,13 +482,13 @@ onBeforeMount(() => {
467
482
  /**
468
483
  * START ELEMENT REFERENCES
469
484
  */
470
- const activatorEl = ref<HTMLElement>();
485
+ const activatorEl = ref<DomHost>();
471
486
  const optionsContainer = ref<any | null>(null);
472
487
  const searchInput = ref<HTMLInputElement | null>(null);
473
488
  const popoverFocusProxy = ref<HTMLButtonElement | null>(null);
474
489
  const activeDescendantId = ref<string>();
475
490
 
476
- const positionAnchorEl = computed<HTMLElement | undefined>(() => {
491
+ const positionAnchorEl = computed<DomHost | undefined>(() => {
477
492
  if (props.anchor) {
478
493
  const el = extractDomContainer(props.anchor);
479
494
  if (el) return el;
@@ -482,7 +497,7 @@ const positionAnchorEl = computed<HTMLElement | undefined>(() => {
482
497
  });
483
498
 
484
499
  const { width: activatorWidth } = useElementSize(
485
- positionAnchorEl,
500
+ () => domElement(positionAnchorEl.value),
486
501
  { width: 0, height: 0 },
487
502
  {
488
503
  box: 'border-box',
@@ -613,7 +628,7 @@ const computedAriaDescribedby = computed(() => {
613
628
  let ignoreNextIntersection = false;
614
629
 
615
630
  const { resume, pause } = useIntersectionObserver(
616
- activatorEl,
631
+ () => domElement(activatorEl.value),
617
632
  async ([{ intersectionRatio }]) => {
618
633
  if (ignoreNextIntersection) {
619
634
  ignoreNextIntersection = false;
@@ -973,8 +988,32 @@ const typeahead = useTypeahead<BaseOption<Item>>({
973
988
  },
974
989
  locale: () => config.locale,
975
990
  });
991
+ /**
992
+ * A key typed while a keyboard open is still placing focus belongs to the
993
+ * search field it is about to reach: it waits for the open, then is written
994
+ * there as an input, so typing straight after Enter is not lost (MW-106).
995
+ */
996
+ const typeIntoSearchAfterOpen = async (event: KeyboardEvent) => {
997
+ event.preventDefault();
998
+ await afterKeyboardOpen();
999
+ const input = searchInput.value;
1000
+ if (!(input instanceof HTMLInputElement)) return;
1001
+ if (document.activeElement !== input) return;
1002
+ const end = input.value.length;
1003
+ input.setRangeText(
1004
+ event.key,
1005
+ input.selectionStart ?? end,
1006
+ input.selectionEnd ?? end,
1007
+ 'end'
1008
+ );
1009
+ input.dispatchEvent(new Event('input', { bubbles: true }));
1010
+ };
976
1011
  const onTypeaheadKey = async (event: KeyboardEvent) => {
977
- if (computedAllowWriting.value || !isPrintableTypeaheadKey(event)) return;
1012
+ if (!isPrintableTypeaheadKey(event)) return;
1013
+ if (computedAllowWriting.value) {
1014
+ if (keyboardOpen) await typeIntoSearchAfterOpen(event);
1015
+ return;
1016
+ }
978
1017
  if (!canProcessKeyboardBindings.value) return;
979
1018
  event.preventDefault();
980
1019
  if (!shown.value) {
@@ -1623,7 +1662,22 @@ const keepListedWhileOpen = (valueHash: string) => {
1623
1662
  }
1624
1663
  }
1625
1664
  };
1626
- if (knownSource) knownSource.userUnpick = markUserUnpicked;
1665
+ if (knownSource) {
1666
+ knownSource.userUnpick = markUserUnpicked;
1667
+ knownSource.isKnown = isKnown;
1668
+ }
1669
+
1670
+ /**
1671
+ * The option slot's props, with the `known` that tells a known row from the
1672
+ * list's own (Q77.7). The scope is typed by whether this popover binds
1673
+ * `known-items` (`Known`), which runtime cannot see: the one cast lives here.
1674
+ */
1675
+ const optionSlotProps = <D extends { item: Item }>(data: D) =>
1676
+ ({
1677
+ ...data,
1678
+ loading: computedLoading.value,
1679
+ known: isKnown(data.item),
1680
+ }) as unknown as BbSelectPopoverOptionSlotProps<Item, Known>;
1627
1681
  watch(modelValueIndexedByHash, (selected) => {
1628
1682
  // Closed, a value leaving the model leaves its sticky place (R17).
1629
1683
  if (!shown.value) pruneSticky();
@@ -2316,7 +2370,8 @@ const getGroupData = (option: BaseOption) => {
2316
2370
  /**
2317
2371
  * G5 (owner 2026-10-16): the page decides the order of the groups; a pinned
2318
2372
  * row goes first inside its own group, and a group only pinned rows hold
2319
- * goes first.
2373
+ * goes first. Rows with no group (a nullish `groupBy`, a known row) are
2374
+ * listed before every header (owner 2026-10-26, ATT-15), as in BbDropdown.
2320
2375
  */
2321
2376
  const groupedOptions = computed<GroupedOptions[]>(() => {
2322
2377
  // Every row the open list puts on top (pins and other outside rows) is
@@ -2358,14 +2413,16 @@ const groupedOptions = computed<GroupedOptions[]>(() => {
2358
2413
  });
2359
2414
  return groups
2360
2415
  .map((group, order) => ({ group, order }))
2361
- .sort((a, b) =>
2362
- a.group.firstListed === b.group.firstListed
2363
- ? a.order - b.order
2364
- : a.group.firstListed === Infinity
2365
- ? -1
2366
- : b.group.firstListed === Infinity
2367
- ? 1
2368
- : a.group.firstListed - b.group.firstListed
2416
+ .sort(
2417
+ (a, b) =>
2418
+ Number(b.group.data === null) - Number(a.group.data === null) ||
2419
+ (a.group.firstListed === b.group.firstListed
2420
+ ? a.order - b.order
2421
+ : a.group.firstListed === Infinity
2422
+ ? -1
2423
+ : b.group.firstListed === Infinity
2424
+ ? 1
2425
+ : a.group.firstListed - b.group.firstListed)
2369
2426
  )
2370
2427
  .map(({ group: { id, data, options, pinnedOptions } }) => ({
2371
2428
  id,
@@ -2864,6 +2921,8 @@ const panelSlotProps = computed(() => ({
2864
2921
  focus: focusPopoverContent,
2865
2922
  query: query.value,
2866
2923
  selectedOptions: publicSelectedOptions.value,
2924
+ // The sheet hands its dialog's own id instead (Q76.10 d).
2925
+ titleId: `${id}_title`,
2867
2926
  }));
2868
2927
 
2869
2928
  /**
@@ -3150,6 +3209,41 @@ import type { BbOffCanvasProps } from '../BbOffCanvas/types';
3150
3209
  /** A row naming a value the app already holds (`known-items`): the model value and its text. */
3151
3210
  export type BbSelectKnownItem = { value: unknown; label: string };
3152
3211
 
3212
+ /** What `known-items` takes. */
3213
+ export type BbSelectKnownItems = Array<BbSelectKnownItem | null | undefined>;
3214
+
3215
+ /**
3216
+ * The row an option or chip slot gets, told apart by `known` (Q77.7). On a
3217
+ * select that binds `known-items`, a known row stands in as `item` until the
3218
+ * list brings the real one: `{ value, label }`, whatever the options' shape.
3219
+ * Without `known-items` the row is always the option. `BbSelectSlotRow<Row>`
3220
+ * alone is the bound case: what a helper taking a slot's `{ item, known }`
3221
+ * is typed with.
3222
+ */
3223
+ export type BbSelectSlotRow<
3224
+ Item,
3225
+ Known extends BbSelectKnownItems | undefined = BbSelectKnownItems,
3226
+ > = [Known] extends [undefined]
3227
+ ? {
3228
+ /** Always `false` here: this select binds no `known-items`. */
3229
+ known: false;
3230
+ /** The raw item from the `items` prop. */
3231
+ item: Item;
3232
+ }
3233
+ :
3234
+ | {
3235
+ /** A known row (`known-items`): the list has not brought this value's own row yet. */
3236
+ known: true;
3237
+ /** The known row, `{ value, label }`; read `text` for what it shows. */
3238
+ item: BbSelectKnownItem;
3239
+ }
3240
+ | {
3241
+ /** The list's own row. */
3242
+ known: false;
3243
+ /** The raw item from the `items` prop. */
3244
+ item: Item;
3245
+ };
3246
+
3153
3247
  /**
3154
3248
  * A selected option as resolved by the select family and exposed through slot
3155
3249
  * props (`selectedOptions`): the raw source `item` plus its resolved display
@@ -3271,7 +3365,11 @@ export const BB_SELECT_POPOVER_PT = {
3271
3365
  // Two mapped types, never `Partial<Record<…>>`: the lint autofix rewrites one
3272
3366
  // into the other and the SFC resolver reads only the mapped spelling (T23).
3273
3367
  /* eslint-disable @typescript-eslint/consistent-indexed-object-style */
3274
- export type BbSelectPopoverProps<Item> = {
3368
+ export type BbSelectPopoverProps<
3369
+ Item,
3370
+ // The type alone is the bound case, as on `BbSelectProps` (Q77.7).
3371
+ Known extends BbSelectKnownItems | undefined = BbSelectKnownItems,
3372
+ > = {
3275
3373
  [K in
3276
3374
  | `pt:${BbSelectPopoverSurfacePtPart}`
3277
3375
  | `pt:${BbSelectPopoverPtPart}:${BbSelectPopoverPtState}`]?: PtValue;
@@ -3281,7 +3379,12 @@ export type BbSelectPopoverProps<Item> = {
3281
3379
  [K in `pt:${BbSelectPopoverOptionPtPart}`]?:
3282
3380
  | PtValue
3283
3381
  | ((
3284
- ctx: PtItemCtx<PtNoInfer<Item>, BbSelectPopoverPtState>
3382
+ ctx: PtItemCtx<
3383
+ PtNoInfer<Item>,
3384
+ BbSelectPopoverPtState,
3385
+ never,
3386
+ BbSelectSlotRow<PtNoInfer<Item>, PtNoInfer<Known>>
3387
+ >
3285
3388
  ) => PtItemResult);
3286
3389
  } & {
3287
3390
  /* eslint-enable @typescript-eslint/consistent-indexed-object-style */
@@ -3293,7 +3396,9 @@ export type BbSelectPopoverProps<Item> = {
3293
3396
  BbSelectPopoverPtPart,
3294
3397
  BbSelectPopoverOptionPtPart,
3295
3398
  BbSelectPopoverPtState,
3296
- PtNoInfer<Item>
3399
+ PtNoInfer<Item>,
3400
+ never,
3401
+ BbSelectSlotRow<PtNoInfer<Item>, PtNoInfer<Known>>
3297
3402
  >;
3298
3403
  /**
3299
3404
  * External activator element or component ref.
@@ -3472,11 +3577,11 @@ export type BbSelectPopoverProps<Item> = {
3472
3577
  /**
3473
3578
  * `{ value, label }` rows naming the value the app already holds, whatever
3474
3579
  * the options' shape: the activator's `text` with no request until the
3475
- * first open (`prefill: true` still loads). Not options; the options'
3476
- * accessors never run on them; slots get the row as `item` until the list
3580
+ * first open (`prefill: true` still loads). Not options: accessors never
3581
+ * run on them; slots get one as `item`, `known: true`, until the list
3477
3582
  * brings its own.
3478
3583
  */
3479
- knownItems?: Array<BbSelectKnownItem | null | undefined>;
3584
+ knownItems?: [Known] extends [undefined] ? BbSelectKnownItems : Known;
3480
3585
  /**
3481
3586
  * Display the loading state styles.
3482
3587
  */
@@ -3671,15 +3776,16 @@ export type BbSelectPopoverActivatorSlotProps = {
3671
3776
  };
3672
3777
 
3673
3778
  /** Props exposed by the `option` slot. */
3674
- export type BbSelectPopoverOptionSlotProps<Item> = {
3779
+ export type BbSelectPopoverOptionSlotProps<
3780
+ Item,
3781
+ Known extends BbSelectKnownItems | undefined = undefined,
3782
+ > = BbSelectSlotRow<Item, Known> & {
3675
3783
  /** Whether this option is disabled. */
3676
3784
  disabled: boolean;
3677
3785
  /** Whether this option currently has keyboard focus. */
3678
3786
  focused: boolean;
3679
3787
  /** Zero-based index of this option in the list. */
3680
3788
  index: number;
3681
- /** The raw item from the `items` prop. */
3682
- item: Item;
3683
3789
  /** Whether items are still being fetched. */
3684
3790
  loading: boolean;
3685
3791
  /** Whether this option is currently selected. */
@@ -3721,9 +3827,19 @@ export type BbSelectPopoverPanelSlotProps = {
3721
3827
  query: string;
3722
3828
  /** The resolved options that are currently selected. */
3723
3829
  selectedOptions: BbSelectResolvedOption[];
3830
+ /**
3831
+ * Bind it as the `id` of a heading in `#header`: on the phone sheet the
3832
+ * dialog is labelled by it (`aria-labelledby`); on the desktop panel the
3833
+ * listbox keeps the trigger's name, and the id is there so one markup
3834
+ * serves both.
3835
+ */
3836
+ titleId: string;
3724
3837
  };
3725
3838
 
3726
- export type BbSelectPopoverSlots<Item> = {
3839
+ export type BbSelectPopoverSlots<
3840
+ Item,
3841
+ Known extends BbSelectKnownItems | undefined = undefined,
3842
+ > = {
3727
3843
  /**
3728
3844
  * Replaces the default trigger element that opens the select popover.
3729
3845
  */
@@ -3755,9 +3871,12 @@ export type BbSelectPopoverSlots<Item> = {
3755
3871
  */
3756
3872
  empty?: (props: { query: string; focus: () => void; error: unknown }) => any;
3757
3873
  /**
3758
- * Replaces the default rendering of each option row in the dropdown.
3874
+ * Replaces the default rendering of each option row in the dropdown. With
3875
+ * `known-items` bound, a row the list has not brought yet is the known
3876
+ * `{ value, label }` row, `known: true`: check `known` before reading an
3877
+ * option field off `item`.
3759
3878
  */
3760
- option?: (props: BbSelectPopoverOptionSlotProps<Item>) => any;
3879
+ option?: (props: BbSelectPopoverOptionSlotProps<Item, Known>) => any;
3761
3880
  };
3762
3881
  ```
3763
3882
 
@@ -477,7 +477,7 @@ const rowListeners = (option: Option) => ({
477
477
  onMouseup: (event: MouseEvent) => emit('mouseup', event),
478
478
  });
479
479
 
480
- /** One row's native switch: named by its text when described, described by the group then its own description. */
480
+ /** One row's native switch: named by its text alone, described by the group then its own description. */
481
481
  const rowInputAttrs = (
482
482
  option: Option,
483
483
  index: number,
@@ -538,18 +538,39 @@ const rowIconSlotProps = (
538
538
 
539
539
  ```ts
540
540
  import type { BbCheckboxIconSlotProps } from '../BbCheckbox/types';
541
- import {
542
- BB_CHECKBOX_GROUP_PT,
543
- type BbCheckboxGroupEvents,
544
- type BbCheckboxGroupProps,
541
+ import type {
542
+ BbCheckboxGroupBaseProps,
543
+ BbCheckboxGroupEvents,
545
544
  } from '../BbCheckboxGroup/types';
545
+ import {
546
+ GROUP_PT_PARTS,
547
+ GROUP_PT_STATES,
548
+ GROUP_ROW_PT_PARTS,
549
+ GROUP_ROW_PT_STATES,
550
+ type GroupPtMap,
551
+ type PtNoInfer,
552
+ } from '@/types/passthrough';
546
553
  import type { CommonFieldAsteriskSlotProps } from '../CommonField/types';
547
554
 
548
- /** `BbSwitchGroup` shares `BbCheckboxGroup`'s passthrough vocabulary (its props are the same type). */
549
- export const BB_SWITCH_GROUP_PT = BB_CHECKBOX_GROUP_PT;
550
-
551
- /** Re-export of BbCheckboxGroupProps for the switch-group variant. */
552
- export type BbSwitchGroupProps<T = any> = BbCheckboxGroupProps<T>;
555
+ /**
556
+ * `BbSwitchGroup`'s passthrough vocabulary: BbCheckboxGroup's, without the
557
+ * `variant` indicator (BbTabs' looks are the checkbox group's alone).
558
+ */
559
+ export const BB_SWITCH_GROUP_PT = {
560
+ parts: GROUP_PT_PARTS,
561
+ states: GROUP_PT_STATES,
562
+ rowParts: GROUP_ROW_PT_PARTS,
563
+ rowStates: GROUP_ROW_PT_STATES,
564
+ } as const;
565
+
566
+ /** BbCheckboxGroup's props without its `variant` (and the `indicator` part). */
567
+ export type BbSwitchGroupProps<T = any> = BbCheckboxGroupBaseProps<T> & {
568
+ /**
569
+ * Passthrough, object form: the same keys as the `pt:*` attributes
570
+ * without the prefix. See the `pt:<part>` row.
571
+ */
572
+ pt?: GroupPtMap<PtNoInfer<T>>;
573
+ };
553
574
 
554
575
  /** Re-export for consumers importing events type from BbSwitchGroup. */
555
576
  export type BbSwitchGroupEvents = BbCheckboxGroupEvents;
@@ -966,6 +987,19 @@ export type BbSwitchGroupSlots<T> = {
966
987
  }
967
988
  }
968
989
 
990
+ /* A side hidden with the library's or Tailwind's hiding classes takes its gap
991
+ with it (ATT-11 e): `hideLabel` / `pt:label="sr-only"` (out of flow) or
992
+ `pt:icon="hidden"` would leave an empty track AND the gap beside it (the
993
+ row gap in a `vertical` item, Q76.11 c), and the side still shown sat
994
+ off-centre. `:where` keeps the rule at the row's
995
+ one class, so a consumer `gap-*` on `pt:item` still wins. */
996
+ .bb-switch-group__item:where(
997
+ :has(> .bb-switch-group__label:is(.bb-sr-only, .sr-only)),
998
+ :has(> .bb-toggle-input + :is(.hidden, .sr-only, .bb-sr-only))
999
+ ) {
1000
+ gap: 0;
1001
+ }
1002
+
969
1003
  .bb-switch-group__label {
970
1004
  color: var(--bb-text);
971
1005
  font-size: var(--bb-label-fs);
@@ -998,6 +1032,32 @@ export type BbSwitchGroupSlots<T> = {
998
1032
  user-select: none;
999
1033
  }
1000
1034
 
1035
+ /*
1036
+ * `tiles` (ATT-11 d): the invisible native input covers the WHOLE tile,
1037
+ * padding included, not only the glyph's cell, so a click, a hover tooltip on
1038
+ * the input and a test runner's hit-target check land on it anywhere on the
1039
+ * tile. `grid-area: auto` is load-bearing: an absolutely positioned grid child
1040
+ * is sized against its grid area, so `inset: 0` would still be the glyph
1041
+ * cell. A link or a button inside a tile sits above the input and keeps its
1042
+ * own click. List rows keep the cell overlay.
1043
+ */
1044
+ .bb-switch-group__list--tiles > .bb-switch-group__item {
1045
+ position: relative;
1046
+
1047
+ > .bb-toggle-input {
1048
+ border-radius: inherit;
1049
+ grid-area: auto;
1050
+ inset: 0;
1051
+ position: absolute;
1052
+ z-index: 1;
1053
+ }
1054
+
1055
+ :is(a, button) {
1056
+ position: relative;
1057
+ z-index: 2;
1058
+ }
1059
+ }
1060
+
1001
1061
  /* ---- Touch targets (Q44.19) -------------------------------------------
1002
1062
  * A row is one label line (`--bb-label-lh`, 18px) and the rows sit
1003
1063
  * `--row-gap` (10px) apart. On a coarse pointer only, each row gets an