bitboss-ui 3.0.0-beta.2 → 3.0.0-beta.20

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 (337) hide show
  1. package/README.md +72 -33
  2. package/dist/ai/BbAccordion.md +3 -3
  3. package/dist/ai/BbAlert.md +9 -5
  4. package/dist/ai/BbAsterisk.md +17 -0
  5. package/dist/ai/BbAvatar.md +12 -3
  6. package/dist/ai/BbBadge.md +15 -10
  7. package/dist/ai/BbBadgeButton.md +16 -16
  8. package/dist/ai/BbBaseButton.md +16 -16
  9. package/dist/ai/BbBaseCheckbox.md +8 -8
  10. package/dist/ai/BbBaseCheckboxGroup.md +13 -13
  11. package/dist/ai/BbBaseCheckboxIcon.md +26 -9
  12. package/dist/ai/BbBaseColorInput.md +11 -11
  13. package/dist/ai/BbBaseDatePicker.md +6 -6
  14. package/dist/ai/BbBaseDatePickerInput.md +15 -15
  15. package/dist/ai/BbBaseInputContainer.md +12 -12
  16. package/dist/ai/BbBaseNumberInput.md +8 -8
  17. package/dist/ai/BbBaseRadio.md +5 -5
  18. package/dist/ai/BbBaseRadioGroup.md +7 -7
  19. package/dist/ai/BbBaseRadioIcon.md +25 -9
  20. package/dist/ai/BbBaseRating.md +5 -5
  21. package/dist/ai/BbBaseSelect.md +22 -21
  22. package/dist/ai/BbBaseSlider.md +9 -9
  23. package/dist/ai/BbBaseSwitch.md +8 -8
  24. package/dist/ai/BbBaseSwitchGroup.md +13 -13
  25. package/dist/ai/BbBaseSwitchIcon.md +28 -10
  26. package/dist/ai/BbBaseTag.md +10 -10
  27. package/dist/ai/BbBaseTextInput.md +9 -9
  28. package/dist/ai/BbBaseTextarea.md +9 -9
  29. package/dist/ai/BbBaseTimePickerInput.md +13 -13
  30. package/dist/ai/BbBreadcrumbs.md +2 -2
  31. package/dist/ai/BbButton.md +15 -15
  32. package/dist/ai/BbCheckbox.md +18 -17
  33. package/dist/ai/BbCheckboxGroup.md +15 -14
  34. package/dist/ai/BbCollapsible.md +11 -9
  35. package/dist/ai/BbColorInput.md +15 -15
  36. package/dist/ai/BbColorPalette.md +12 -6
  37. package/dist/ai/BbConfirm.md +12 -5
  38. package/dist/ai/BbDatePicker.md +13 -13
  39. package/dist/ai/BbDatePickerInput.md +20 -20
  40. package/dist/ai/BbDialog.md +78 -12
  41. package/dist/ai/BbDropdown.md +132 -22
  42. package/dist/ai/BbDropdownButton.md +12 -12
  43. package/dist/ai/BbDropdownGroup.md +1 -1
  44. package/dist/ai/BbDropzone.md +4 -4
  45. package/dist/ai/BbForm.md +49 -14
  46. package/dist/ai/BbIcon.md +6 -0
  47. package/dist/ai/BbIndicator.md +5 -5
  48. package/dist/ai/BbNumberInput.md +11 -11
  49. package/dist/ai/BbOffCanvas.md +90 -20
  50. package/dist/ai/BbPagination.md +3 -3
  51. package/dist/ai/BbPopover.md +32 -17
  52. package/dist/ai/BbProgress.md +7 -4
  53. package/dist/ai/BbRadio.md +16 -15
  54. package/dist/ai/BbRadioGroup.md +20 -17
  55. package/dist/ai/BbRating.md +11 -11
  56. package/dist/ai/BbSelect.md +138 -37
  57. package/dist/ai/BbSelectPopover.md +40 -41
  58. package/dist/ai/BbSlider.md +37 -22
  59. package/dist/ai/BbSmoothHeight.md +1 -1
  60. package/dist/ai/BbSwitch.md +25 -10
  61. package/dist/ai/BbSwitchGroup.md +17 -14
  62. package/dist/ai/BbTable.md +791 -88
  63. package/dist/ai/BbTabs.md +28 -14
  64. package/dist/ai/BbTabsList.md +1 -1
  65. package/dist/ai/BbTabsPanes.md +1 -1
  66. package/dist/ai/BbTabsRoot.md +10 -10
  67. package/dist/ai/BbTag.md +14 -14
  68. package/dist/ai/BbTextInput.md +16 -15
  69. package/dist/ai/BbTextarea.md +13 -13
  70. package/dist/ai/BbTimePicker.md +10 -10
  71. package/dist/ai/BbTimePickerInput.md +17 -17
  72. package/dist/ai/BbToast.md +1 -1
  73. package/dist/ai/BbToastPortal.md +1 -1
  74. package/dist/ai/BbTooltip.md +12 -10
  75. package/dist/ai/BbTree.md +1 -1
  76. package/dist/ai/ChipsBox.md +1 -1
  77. package/dist/ai/CommonInputWrapper.md +10 -10
  78. package/dist/ai/CommonPopover.md +6 -6
  79. package/dist/ai/FlatListBox.md +5 -5
  80. package/dist/ai/GroupedListBox.md +5 -5
  81. package/dist/ai/ListBox.md +4 -4
  82. package/dist/ai/OptionsContainer.md +4 -4
  83. package/dist/ai/changelog.json +110 -2
  84. package/dist/ai/components.json +882 -90
  85. package/dist/ai/composables/useBbConfig.md +72 -11
  86. package/dist/ai/composables/useConfirm.md +5 -3
  87. package/dist/ai/guides/ai-router.md +9 -4
  88. package/dist/ai/guides/component-picker.md +2 -2
  89. package/dist/ai/guides/design-language.md +14 -14
  90. package/dist/ai/guides/design-tokens.md +25 -18
  91. package/dist/ai/guides/fetch-items-playbook.md +1 -1
  92. package/dist/ai/guides/icons-policy.md +4 -2
  93. package/dist/ai/guides/installation-and-plugin-setup.md +74 -9
  94. package/dist/ai/guides/migration/components/bb-checkbox-group.md +30 -0
  95. package/dist/ai/guides/migration/components/bb-checkbox.md +37 -3
  96. package/dist/ai/guides/migration/components/bb-collapsible.md +5 -5
  97. package/dist/ai/guides/migration/components/bb-dialog.md +62 -34
  98. package/dist/ai/guides/migration/components/bb-offcanvas.md +29 -13
  99. package/dist/ai/guides/migration/components/bb-rating.md +8 -2
  100. package/dist/ai/guides/migration/components/bb-select.md +5 -2
  101. package/dist/ai/guides/migration/components/bb-table.md +446 -28
  102. package/dist/ai/guides/migration/components/bb-text-input.md +6 -6
  103. package/dist/ai/guides/migration/v2-to-v3.md +260 -89
  104. package/dist/ai/guides/ssr-prefill.md +120 -0
  105. package/dist/ai/index.md +10 -9
  106. package/dist/ai/recipes/inertia/layout-scaffold.md +5 -1
  107. package/dist/ai/recipes/inertia/ownership-atlas.md +41 -20
  108. package/dist/ai/recipes/inertia/records-workspace.md +26 -7
  109. package/dist/ai/recipes/nuxt/layout-scaffold.md +5 -1
  110. package/dist/ai/recipes/nuxt/records-workspace.md +26 -7
  111. package/dist/ai/recipes/vue/layout-scaffold.md +5 -1
  112. package/dist/ai/recipes/vue/records-workspace.md +26 -7
  113. package/dist/ai/source/BbAlert.md +60 -2
  114. package/dist/ai/source/BbAvatar.md +3 -3
  115. package/dist/ai/source/BbBadge.md +60 -15
  116. package/dist/ai/source/BbBadgeButton.md +8 -2
  117. package/dist/ai/source/BbBaseButton.md +3 -1
  118. package/dist/ai/source/BbBaseCheckboxGroup.md +6 -2
  119. package/dist/ai/source/BbBaseDatePicker.md +3 -1
  120. package/dist/ai/source/BbBaseDatePickerInput.md +5 -1
  121. package/dist/ai/source/BbBaseInputContainer.md +52 -1
  122. package/dist/ai/source/BbBaseRadioGroup.md +4 -0
  123. package/dist/ai/source/BbBaseRating.md +3 -1
  124. package/dist/ai/source/BbBaseSelect.md +71 -16
  125. package/dist/ai/source/BbBaseSwitchGroup.md +4 -0
  126. package/dist/ai/source/BbBaseTimePickerInput.md +5 -1
  127. package/dist/ai/source/BbBreadcrumbs.md +31 -0
  128. package/dist/ai/source/BbButton.md +51 -24
  129. package/dist/ai/source/BbCheckbox.md +15 -1
  130. package/dist/ai/source/BbCheckboxGroup.md +2 -1
  131. package/dist/ai/source/BbCollapsible.md +7 -1
  132. package/dist/ai/source/BbColorInput.md +3 -4
  133. package/dist/ai/source/BbColorPalette.md +3 -4
  134. package/dist/ai/source/BbDatePicker.md +5 -1
  135. package/dist/ai/source/BbDatePickerInput.md +5 -1
  136. package/dist/ai/source/BbDialog.md +175 -19
  137. package/dist/ai/source/BbDropdown.md +376 -69
  138. package/dist/ai/source/BbDropdownGroup.md +330 -59
  139. package/dist/ai/source/BbForm.md +93 -5
  140. package/dist/ai/source/BbIcon.md +46 -36
  141. package/dist/ai/source/BbNumberInput.md +3 -4
  142. package/dist/ai/source/BbOffCanvas.md +474 -194
  143. package/dist/ai/source/BbPopover.md +24 -17
  144. package/dist/ai/source/BbProgress.md +2 -2
  145. package/dist/ai/source/BbRadio.md +15 -1
  146. package/dist/ai/source/BbRadioGroup.md +3 -1
  147. package/dist/ai/source/BbSelect.md +50 -2
  148. package/dist/ai/source/BbSelectPopover.md +171 -23
  149. package/dist/ai/source/BbSlider.md +3 -4
  150. package/dist/ai/source/BbSwitch.md +15 -1
  151. package/dist/ai/source/BbSwitchGroup.md +8 -5
  152. package/dist/ai/source/BbTable.md +4642 -1387
  153. package/dist/ai/source/BbTabs.md +6 -7
  154. package/dist/ai/source/BbTabsList.md +6 -7
  155. package/dist/ai/source/BbTabsPanes.md +6 -7
  156. package/dist/ai/source/BbTabsRoot.md +6 -7
  157. package/dist/ai/source/BbTag.md +3 -4
  158. package/dist/ai/source/BbTextInput.md +3 -4
  159. package/dist/ai/source/BbTextarea.md +3 -4
  160. package/dist/ai/source/BbTimePicker.md +4 -1
  161. package/dist/ai/source/BbTimePickerInput.md +5 -1
  162. package/dist/ai/source/BbToast.md +3 -1
  163. package/dist/ai/source/BbTooltip.md +5 -1
  164. package/dist/ai/source/CommonInputWrapper.md +4 -0
  165. package/dist/ai/source/CommonPopover.md +6 -0
  166. package/dist/ai/source/FlatListBox.md +11 -5
  167. package/dist/ai/source/GroupedListBox.md +7 -5
  168. package/dist/components/BbAlert/BbAlert.vue_vue_type_script_setup_true_lang.js +4 -4
  169. package/dist/components/BbAlert/types.d.ts +10 -1
  170. package/dist/components/BbAvatar/BbAvatar.vue.d.ts +1 -1
  171. package/dist/components/BbAvatar/BbAvatar.vue_vue_type_script_setup_true_lang.js +33 -33
  172. package/dist/components/BbBadge/BadgeBodyContent.vue_vue_type_script_setup_true_lang.js +22 -16
  173. package/dist/components/BbBadge/BbBadge.vue_vue_type_script_setup_true_lang.js +36 -15
  174. package/dist/components/BbBadge/badgeButtonContext.d.ts +21 -8
  175. package/dist/components/BbBadge/types.d.ts +8 -2
  176. package/dist/components/BbBaseButton/BbBaseButton.vue_vue_type_script_setup_true_lang.js +47 -47
  177. package/dist/components/BbBaseButton/RouterComponent.vue_vue_type_script_setup_true_lang.js +14 -14
  178. package/dist/components/BbBaseCheckboxGroup/BbBaseCheckboxGroup.vue_vue_type_script_setup_true_lang.js +30 -28
  179. package/dist/components/BbBaseCheckboxGroup/types.d.ts +2 -2
  180. package/dist/components/BbBaseDatePicker/BbBaseDatePicker.vue_vue_type_script_setup_true_lang.js +167 -167
  181. package/dist/components/BbBaseDatePicker/BbBaseDatePickerInputDaySelector.vue.d.ts +9 -9
  182. package/dist/components/BbBaseDatePicker/BbBaseDatePickerInputDaySelector.vue_vue_type_script_setup_true_lang.js +78 -78
  183. package/dist/components/BbBaseDatePicker/BbBaseDatePickerMonthSelector.vue_vue_type_script_setup_true_lang.js +64 -64
  184. package/dist/components/BbBaseDatePickerInput/BbBaseDatePickerInput.vue.d.ts +1 -1
  185. package/dist/components/BbBaseDatePickerInput/BbBaseDatePickerInput.vue_vue_type_script_setup_true_lang.js +138 -138
  186. package/dist/components/BbBaseInputContainer/BbBaseInputContainer.vue_vue_type_script_setup_true_lang.js +2 -2
  187. package/dist/components/BbBaseRadioGroup/BbBaseRadioGroup.vue_vue_type_script_setup_true_lang.js +24 -22
  188. package/dist/components/BbBaseRating/BbBaseRating.vue_vue_type_script_setup_true_lang.js +40 -40
  189. package/dist/components/BbBaseSelect/BbBaseSelect.vue_vue_type_script_setup_true_lang.js +74 -65
  190. package/dist/components/BbBaseSelect/types.d.ts +22 -0
  191. package/dist/components/BbBaseSlider/BbBaseSlider.vue_vue_type_script_setup_true_lang.js +5 -5
  192. package/dist/components/BbBaseSwitchGroup/BbBaseSwitchGroup.vue_vue_type_script_setup_true_lang.js +30 -28
  193. package/dist/components/BbBaseTimePickerInput/BbBaseTimePickerInput.vue.d.ts +1 -1
  194. package/dist/components/BbBaseTimePickerInput/BbBaseTimePickerInput.vue_vue_type_script_setup_true_lang.js +104 -104
  195. package/dist/components/BbBreadcrumbs/BbBreadcrumbs.vue_vue_type_script_setup_true_lang.js +35 -35
  196. package/dist/components/BbButton/BbButton.vue_vue_type_script_setup_true_lang.js +85 -81
  197. package/dist/components/BbCheckboxGroup/types.d.ts +2 -1
  198. package/dist/components/BbCollapsible/types.d.ts +7 -1
  199. package/dist/components/BbColorInput/BbColorInput.vue.d.ts +1 -1
  200. package/dist/components/BbColorInput/BbColorInput.vue_vue_type_script_setup_true_lang.js +18 -18
  201. package/dist/components/BbColorPalette/BbColorPalette.vue.d.ts +2 -2
  202. package/dist/components/BbColorPalette/BbColorPalette.vue_vue_type_script_setup_true_lang.js +50 -50
  203. package/dist/components/BbConfirm/BbConfirm.vue_vue_type_script_setup_true_lang.js +17 -17
  204. package/dist/components/BbDatePicker/BbDatePicker.vue.d.ts +1 -1
  205. package/dist/components/BbDatePicker/BbDatePicker.vue_vue_type_script_setup_true_lang.js +100 -100
  206. package/dist/components/BbDatePickerInput/BbDatePickerInput.vue_vue_type_script_setup_true_lang.js +21 -21
  207. package/dist/components/BbDialog/BbDialog.vue.d.ts +1 -1
  208. package/dist/components/BbDialog/BbDialog.vue_vue_type_script_setup_true_lang.js +133 -107
  209. package/dist/components/BbDialog/types.d.ts +29 -2
  210. package/dist/components/BbDropdown/AdaptiveDropdown.vue.d.ts +2 -0
  211. package/dist/components/BbDropdown/AdaptiveDropdown.vue_vue_type_script_setup_true_lang.js +99 -100
  212. package/dist/components/BbDropdown/BbDropdown.vue.d.ts +2 -2
  213. package/dist/components/BbDropdown/BbDropdown.vue_vue_type_script_setup_true_lang.js +208 -201
  214. package/dist/components/BbDropdown/BbDropdownList.vue_vue_type_script_setup_true_lang.js +225 -208
  215. package/dist/components/BbDropdown/DropdownPipelineResolver.vue_vue_type_script_setup_true_lang.js +21 -21
  216. package/dist/components/BbDropdown/types.d.ts +20 -5
  217. package/dist/components/BbDropdownButton/BbDropdownButton.vue_vue_type_script_setup_true_lang.js +5 -5
  218. package/dist/components/BbIcon/BbIcon.vue_vue_type_script_setup_true_lang.js +46 -46
  219. package/dist/components/BbIcon/iconCache.d.ts +33 -0
  220. package/dist/components/BbIcon/iconCache.js +17 -0
  221. package/dist/components/BbNumberInput/BbNumberInput.vue.d.ts +1 -1
  222. package/dist/components/BbNumberInput/BbNumberInput.vue_vue_type_script_setup_true_lang.js +15 -15
  223. package/dist/components/BbOffCanvas/BbOffCanvas.vue.d.ts +1 -1
  224. package/dist/components/BbOffCanvas/BbOffCanvas.vue_vue_type_script_setup_true_lang.js +254 -208
  225. package/dist/components/BbOffCanvas/types.d.ts +30 -5
  226. package/dist/components/BbPagination/BbPagination.vue.d.ts +1 -1
  227. package/dist/components/BbPopover/BbPopover.vue.d.ts +2 -2
  228. package/dist/components/BbPopover/BbPopover.vue_vue_type_script_setup_true_lang.js +149 -146
  229. package/dist/components/BbPopover/types.d.ts +3 -2
  230. package/dist/components/BbRadioGroup/types.d.ts +3 -1
  231. package/dist/components/BbSelect/BbSelect.vue_vue_type_script_setup_true_lang.js +27 -23
  232. package/dist/components/BbSelect/types.d.ts +32 -0
  233. package/dist/components/BbSelectPopover/BbSelectPopover.vue_vue_type_script_setup_true_lang.js +221 -213
  234. package/dist/components/BbSlider/BbSlider.vue.d.ts +1 -1
  235. package/dist/components/BbSlider/BbSlider.vue_vue_type_script_setup_true_lang.js +20 -20
  236. package/dist/components/BbTable/BbTable.vue.d.ts +8 -4
  237. package/dist/components/BbTable/BbTable.vue_vue_type_script_setup_true_lang.js +1319 -616
  238. package/dist/components/BbTable/BbTableDataRow.d.ts +162 -0
  239. package/dist/components/BbTable/BbTableDataRow.js +136 -0
  240. package/dist/components/BbTable/BbTableExpandRow.d.ts +73 -0
  241. package/dist/components/BbTable/BbTableExpandRow.js +52 -0
  242. package/dist/components/BbTable/types.d.ts +247 -86
  243. package/dist/components/BbTable/utils.d.ts +87 -4
  244. package/dist/components/BbTable/utils.js +71 -36
  245. package/dist/components/BbTabs/types.d.ts +0 -8
  246. package/dist/components/BbTag/BbTag.vue.d.ts +1 -1
  247. package/dist/components/BbTag/BbTag.vue_vue_type_script_setup_true_lang.js +18 -18
  248. package/dist/components/BbTextInput/BbTextInput.vue.d.ts +1 -1
  249. package/dist/components/BbTextInput/BbTextInput.vue_vue_type_script_setup_true_lang.js +18 -18
  250. package/dist/components/BbTextarea/BbTextarea.vue.d.ts +1 -1
  251. package/dist/components/BbTextarea/BbTextarea.vue_vue_type_script_setup_true_lang.js +54 -54
  252. package/dist/components/BbTimePicker/BbTimePicker.vue.d.ts +1 -1
  253. package/dist/components/BbTimePicker/BbTimePicker.vue_vue_type_script_setup_true_lang.js +80 -80
  254. package/dist/components/BbTimePickerInput/BbTimePickerInput.vue_vue_type_script_setup_true_lang.js +61 -61
  255. package/dist/components/BbToast/BbToast.vue_vue_type_script_setup_true_lang.js +17 -17
  256. package/dist/components/BbToast/BbToastMessage.vue_vue_type_script_setup_true_lang.js +13 -13
  257. package/dist/components/BbTooltip/types.d.ts +5 -1
  258. package/dist/components/ChipsBox/ChipsBox.vue_vue_type_script_setup_true_lang.js +17 -17
  259. package/dist/components/ClearableButton/ClearableButton.vue_vue_type_script_setup_true_lang.js +5 -5
  260. package/dist/components/CommonPopover/CommonPopover.vue_vue_type_script_setup_true_lang.js +2 -1
  261. package/dist/components/FlatListBox/FlatListBox.vue_vue_type_script_setup_true_lang.js +83 -83
  262. package/dist/components/GroupedListBox/GroupedListBox.vue_vue_type_script_setup_true_lang.js +56 -56
  263. package/dist/composables/useBaseOptions.js +30 -20
  264. package/dist/composables/useBbConfig.d.ts +27 -6
  265. package/dist/composables/useBbConfig.js +8 -2
  266. package/dist/composables/useConfig.d.ts +59 -0
  267. package/dist/composables/useConfig.js +9 -0
  268. package/dist/composables/useItemsGetter.d.ts +11 -0
  269. package/dist/composables/useItemsGetter.js +44 -18
  270. package/dist/composables/useLocale.js +10 -7
  271. package/dist/composables/useMobile.js +5 -5
  272. package/dist/composables/usePrefill.d.ts +21 -2
  273. package/dist/composables/usePrefill.js +25 -19
  274. package/dist/composables/useSsrState.d.ts +20 -0
  275. package/dist/composables/useSsrState.js +13 -0
  276. package/dist/composables/useToast.js +5 -5
  277. package/dist/deprecation/ai-deprecations.json.d.ts +99 -11
  278. package/dist/deprecation/ai-deprecations.json.js +1 -1
  279. package/dist/directives/bbDropdown.d.ts +15 -4
  280. package/dist/directives/bbDropdown.js +31 -9
  281. package/dist/directives/createPopoverDirective.d.ts +62 -0
  282. package/dist/directives/createPopoverDirective.js +63 -23
  283. package/dist/i18n/locales/cs.json +4 -1
  284. package/dist/i18n/locales/da.json +4 -1
  285. package/dist/i18n/locales/de.json +4 -1
  286. package/dist/i18n/locales/el.json +4 -1
  287. package/dist/i18n/locales/en.json +4 -1
  288. package/dist/i18n/locales/es.json +4 -1
  289. package/dist/i18n/locales/fi.json +4 -1
  290. package/dist/i18n/locales/fr.json +4 -1
  291. package/dist/i18n/locales/hu.json +4 -1
  292. package/dist/i18n/locales/it.json +4 -1
  293. package/dist/i18n/locales/ja.json +4 -1
  294. package/dist/i18n/locales/ko.json +4 -1
  295. package/dist/i18n/locales/nb.json +4 -1
  296. package/dist/i18n/locales/nl.json +4 -1
  297. package/dist/i18n/locales/pl.json +4 -1
  298. package/dist/i18n/locales/pt.json +4 -1
  299. package/dist/i18n/locales/ro.json +4 -1
  300. package/dist/i18n/locales/ru.json +4 -1
  301. package/dist/i18n/locales/sv.json +4 -1
  302. package/dist/i18n/locales/tr.json +4 -1
  303. package/dist/i18n/locales/uk.json +4 -1
  304. package/dist/i18n/locales/zh-cn.json +4 -1
  305. package/dist/index.d.ts +7 -2
  306. package/dist/index.js +69 -67
  307. package/dist/llms-full.txt +3712 -1381
  308. package/dist/llms-medium.txt +113 -43
  309. package/dist/llms.txt +7 -6
  310. package/dist/locale-blueprint.json +4 -1
  311. package/dist/nuxt-auto-imports.d.ts +100 -0
  312. package/dist/nuxt-auto-imports.js +55 -0
  313. package/dist/nuxt-module.d.ts +22 -1
  314. package/dist/nuxt.js +22 -8
  315. package/dist/plugin.d.ts +10 -1
  316. package/dist/plugin.js +20 -19
  317. package/dist/runtime/nuxt-plugin.js +28 -21
  318. package/dist/styles.css +1 -1
  319. package/dist/utilities/misc/listboxMetrics.d.ts +3 -3
  320. package/dist/utilities/misc/listboxMetrics.js +2 -2
  321. package/dist/utilities/misc/ssrStateInjectionKey.d.ts +42 -0
  322. package/dist/utilities/misc/ssrStateInjectionKey.js +4 -0
  323. package/dist/validated/BbForm.vue_vue_type_script_setup_true_lang.js +45 -27
  324. package/dist/validated/BbSelect.vue.d.ts +2 -0
  325. package/dist/validated/BbSelect.vue_vue_type_script_setup_true_lang.js +1 -0
  326. package/dist/validated/useValidatedField.js +25 -23
  327. package/dist/vite.js +6 -2
  328. package/llms.txt +8 -7
  329. package/package.json +2 -2
  330. package/scripts/lib/eslint-plugin.d.ts +19 -1
  331. package/scripts/lib/eslint-plugin.mjs +146 -0
  332. package/scripts/lib/html-attributes.mjs +91 -0
  333. package/scripts/lib/validate-bb-markup.mjs +59 -4
  334. package/dist/assets/svgs/sort.svg_raw.js +0 -4
  335. package/dist/components/BbBadge/BadgeAppendIcon.vue.d.ts +0 -3
  336. package/dist/components/BbBadge/BadgeAppendIcon.vue.js +0 -5
  337. package/dist/components/BbBadge/BadgeAppendIcon.vue_vue_type_script_setup_true_lang.js +0 -22
@@ -25,6 +25,13 @@ export type ItemKey<Item = any> = NestedPaths<Item> | (string & {});
25
25
  * inferred per column, so the conditional has literal types to distribute over.
26
26
  */
27
27
  export type ReservedColumnKey = 'actions' | 'select';
28
+ /**
29
+ * Suffixes of the header affix slots (`header:prepend` / `header:append` and
30
+ * their per-column `header:<key>:prepend/append` variants). A column key that
31
+ * normalizes to one of these shadows the table-wide slot name; the table-wide
32
+ * interpretation wins and dev builds warn.
33
+ */
34
+ export type HeaderAffixSuffix = 'prepend' | 'append';
28
35
  /**
29
36
  * Skeleton placeholder style for the loading state.
30
37
  * Matches the expected content type for a better loading experience.
@@ -80,17 +87,17 @@ export type BbTableColumn<Item = any> = BaseColumn<Item> & {
80
87
  */
81
88
  sorted?: 'asc' | 'desc';
82
89
  /**
83
- * Classes this column contributes to the whole row's `<tr>`. Every column's
90
+ * Classes this column contributes to the whole row element. Every column's
84
91
  * `rowClass` is accumulated with the table-level `rowClass` prop and applied
85
92
  * together. Can also be a function of the cell's content for dynamic values.
86
93
  */
87
94
  rowClass?: ColumnClasses<Item>;
88
95
  /**
89
- * Defines the classes to be passed to the `<td>` elements. Can also be a function for dynamic values.
96
+ * Defines the classes to be passed to this column's data cells. Can also be a function for dynamic values.
90
97
  */
91
98
  tdClass?: ColumnClasses<Item>;
92
99
  /**
93
- * Defines the classes to be passed to the `<th>`.
100
+ * Defines the classes to be passed to this column's header cell.
94
101
  */
95
102
  thClass?: Classes;
96
103
  /**
@@ -112,7 +119,11 @@ export type BbTableColumn<Item = any> = BaseColumn<Item> & {
112
119
  * region.
113
120
  *
114
121
  * When omitted the column chains from the previous column's end to the next
115
- * whole snap point (a one-to-one inheritance by index).
122
+ * whole snap point (a one-to-one inheritance by index). The last column
123
+ * always runs to the end of the parent's data region (as if `[start, -1]`)
124
+ * unless it declares a `width` or an explicit pair, so a table with fewer
125
+ * columns than its parent widens its last content cell across the parent's
126
+ * trailing tracks rather than its actions cell.
116
127
  */
117
128
  snap?: number | [start: number, end: number];
118
129
  };
@@ -120,6 +131,8 @@ export type BbTableProps<Item = any> = {
120
131
  /**
121
132
  * Function that accepts the columns and the current item as
122
133
  * arguments and returns a label to be used for accessibility purposes.
134
+ * The cells arrive in RENDER order (they follow `order`, so the
135
+ * label reads like the row) — look a cell up by `key`, never by position.
123
136
  */
124
137
  accessibleLabel?: (columns: MappedCell[], item: any) => string;
125
138
  /**
@@ -136,31 +149,6 @@ export type BbTableProps<Item = any> = {
136
149
  * @defaultValue `'left'`
137
150
  */
138
151
  align?: 'left' | 'center' | 'right';
139
- /**
140
- * Stable id for this table's width context. When omitted a unique id is
141
- * generated. Nested tables use the nearest ancestor id to inherit widths.
142
- */
143
- id?: string;
144
- /**
145
- * Opt a nested table into inheriting its column widths from an ancestor
146
- * table's matching tracks (accounting for `select`/`actions` columns). This
147
- * also forces `table-layout: fixed`, so it is **off by default** — a nested
148
- * table renders independently unless you ask for alignment.
149
- * - `false` (the default): do not inherit; size independently.
150
- * - `true`: inherit from the nearest ancestor table.
151
- * - a table id (string): inherit from the specific ancestor in the chain with
152
- * that id rather than the immediate parent. Use this when an intermediate
153
- * table has a different column count, so the extra columns would otherwise
154
- * misalign against it.
155
- */
156
- inheritColumnWidths?: boolean | string;
157
- /**
158
- * Hides the "Select all" checkbox that selectable multi-row tables
159
- * display by default.
160
- *
161
- * @defaultValue `false`
162
- */
163
- disableSelectAll?: boolean;
164
152
  /**
165
153
  * Caption that describes the content of the table. Used for accessibility purposes.
166
154
  */
@@ -193,6 +181,18 @@ export type BbTableProps<Item = any> = {
193
181
  * Disables the component
194
182
  */
195
183
  disabled?: boolean;
184
+ /**
185
+ * Hides the "Select all" checkbox that selectable multi-row tables
186
+ * display by default.
187
+ *
188
+ * @defaultValue `false`
189
+ */
190
+ disableSelectAll?: boolean;
191
+ /**
192
+ * Boolean that defines whether to display or hide the caption.
193
+ * By default is true and the caption is hidden.
194
+ */
195
+ displayCaption?: boolean;
196
196
  /**
197
197
  * After every load (initial, `dependencies` refetch or a change of the
198
198
  * `items` array) prunes the row-keyed models of values whose row is no
@@ -210,12 +210,17 @@ export type BbTableProps<Item = any> = {
210
210
  */
211
211
  enforceCoherence?: boolean;
212
212
  /**
213
- * Boolean that defines whether to display or hide the caption.
214
- * By default is true and the caption is hidden.
213
+ * Used by `v-model:expandedItems`. Array of the currently expanded items —
214
+ * toggled by the row expand control and by external writes (mirrors the
215
+ * `highlighted`/`sort` v-model surfaces). Drives the `#expand` slot rows and
216
+ * their `aria-expanded`/`aria-controls` wiring.
217
+ *
218
+ * @defaultValue `[]`
215
219
  */
216
- displayCaption?: boolean;
220
+ expandedItems?: any[];
217
221
  /**
218
- * Defines the table layout as fixed
222
+ * Splits the width equally among the columns that declare no `width`
223
+ * (each undeclared column becomes a `minmax(0, 1fr)` track)
219
224
  * making each column take up the same amount of space.
220
225
  */
221
226
  fixed?: boolean;
@@ -224,6 +229,11 @@ export type BbTableProps<Item = any> = {
224
229
  * It can be an array of index of the column to fix on the left side of the table or
225
230
  * an array of objects indicating the index and the position `left` or `right` where to affix the columns.
226
231
  *
232
+ * Indices are POSITIONS in the rendered column list (a selection column is
233
+ * index 0), like a spreadsheet's freeze panes — not per-column pins. With
234
+ * `order` the pinned slot holds and whichever column lands in it is
235
+ * pinned; dragging a column out of a pinned slot unpins it.
236
+ *
227
237
  * @defaultValue `[]`
228
238
  */
229
239
  fixedColumns?: Array<number | {
@@ -234,21 +244,66 @@ export type BbTableProps<Item = any> = {
234
244
  * Boolean that sets the headers as sticky to the top of the table.
235
245
  */
236
246
  fixedHeaders?: boolean;
247
+ /**
248
+ * Defines the classes to be passed to the header row.
249
+ */
250
+ headerRowClass?: Classes;
237
251
  /**
238
252
  * Used by `v-model:highlighted`. A parallel, UI-intent state to selection —
239
253
  * typically "the row whose details are open". A single item value (or
240
254
  * `null`) — highlight is single by design.
241
- * Purely mechanical: highlighted rows only get the
242
- * `bb-table-data__row--highlighted` class (and `aria-current`) — no styling
243
- * is shipped, targeting the class is up to the consumer.
255
+ *
256
+ * **Opt-in, and `undefined` is the opt-out.** Leave it unbound and the whole
257
+ * mechanic is off: clicking a row emits `click:row` and nothing else — no
258
+ * class, no `aria-current`, no internal state. Bind it and clicking a row
259
+ * toggles it. The value itself is the switch: `undefined` means "never
260
+ * initialised", `null` means "initialised and currently empty", so bind
261
+ * `ref(null)` rather than `ref()` — a bound-but-`undefined` model warns in
262
+ * dev and stays off. A value seeded through
263
+ * `useBbTableContext(id, { highlighted })` counts as bound the same way.
264
+ *
265
+ * A highlighted row gets `aria-current="true"` and the
266
+ * `bb-table-data__row--highlighted` class, which the shipped stylesheet
267
+ * paints with a neutral fill plus a brand accent bar; override the whole
268
+ * look with `rowClass`.
244
269
  */
245
270
  highlighted?: any;
271
+ /**
272
+ * Stable id for this table's width context. When omitted a unique id is
273
+ * generated. Nested tables use the nearest ancestor id to inherit widths.
274
+ */
275
+ id?: string;
276
+ /**
277
+ * Opt a nested table into inheriting its column widths from an ancestor
278
+ * table's matching tracks (accounting for `select`/`actions` columns). This
279
+ * also makes the parent's tracks authoritative, so it is **off by default** — a nested
280
+ * table renders independently unless you ask for alignment.
281
+ * - `false` (the default): do not inherit; size independently.
282
+ * - `true`: inherit from the nearest ancestor table.
283
+ * - a table id (string): inherit from the specific ancestor in the chain with
284
+ * that id rather than the immediate parent. Use this when an intermediate
285
+ * table has a different column count, so the extra columns would otherwise
286
+ * misalign against it.
287
+ */
288
+ inheritColumnWidths?: boolean | string;
289
+ /**
290
+ * Keeps the table interactive while it is loading. The header and the rows are
291
+ * `inert` while loading by default — a refetch is about to replace the rows,
292
+ * so editing, selecting or sorting them races the incoming data. This escape
293
+ * hatch exists for tables that must stay usable during background refreshes
294
+ * (e.g. a poll that must not interrupt an open editor).
295
+ *
296
+ * The loading announcement is never inert, so the busy state is always
297
+ * conveyed.
298
+ */
299
+ interactiveWhileLoading?: boolean;
246
300
  /**
247
301
  * Rows to render, or a fetcher that returns them.
248
302
  *
249
303
  * @defaultValue `[]`
250
304
  */
251
305
  items: Item[] | ((prefill: boolean, modelValue?: any) => Item[] | Promise<Item[]>);
306
+ itemValue?: ItemAccessor<Item>;
252
307
  /**
253
308
  * Opt-in keyboard navigation with a roving tabindex: the body is one tab
254
309
  * stop, ArrowUp/ArrowDown move the focused row (Home/End jump), and
@@ -257,7 +312,6 @@ export type BbTableProps<Item = any> = {
257
312
  * not highlight until committed. Focused rows show the standard focus ring.
258
313
  */
259
314
  keyboardNavigation?: boolean;
260
- itemValue?: ItemAccessor<Item>;
261
315
  /**
262
316
  * Text content of the `<legend>` a `selectable` table renders (it becomes
263
317
  * a `<fieldset>`, and the legend is that fieldset's accessible name).
@@ -274,17 +328,6 @@ export type BbTableProps<Item = any> = {
274
328
  * a refetch should not blank a table the user is reading.
275
329
  */
276
330
  loading?: boolean;
277
- /**
278
- * Keeps the table interactive while it is loading. The header and the rows are
279
- * `inert` while loading by default — a refetch is about to replace the rows,
280
- * so editing, selecting or sorting them races the incoming data. This escape
281
- * hatch exists for tables that must stay usable during background refreshes
282
- * (e.g. a poll that must not interrupt an open editor).
283
- *
284
- * The loading announcement is never inert, so the busy state is always
285
- * conveyed.
286
- */
287
- interactiveWhileLoading?: boolean;
288
331
  /**
289
332
  * Screen-reader announcement for the loading row's `aria-live` status.
290
333
  * Visually hidden — the skeleton (or the `#loading` slot) is the visible
@@ -321,6 +364,24 @@ export type BbTableProps<Item = any> = {
321
364
  * @defaultValue the localized `common.noDataText` ("No data to display")
322
365
  */
323
366
  noDataText?: string;
367
+ /**
368
+ * Used by `v-model:order`. Ordered array of column keys — the render
369
+ * order of the data columns. Keys listed here render first, in this order;
370
+ * declared columns it omits follow, in declaration order (so a column added
371
+ * to `columns` later renders last); keys that match no declared column render
372
+ * nothing but are PRESERVED in place on every write — a column you hide by
373
+ * removing it from `columns` (a column panel) keeps its slot and comes back
374
+ * where it was. The header drag / keyboard reorder of `reorderable`
375
+ * writes it back complete (every declared key present, duplicates dropped —
376
+ * first occurrence wins) with exactly the moved column relocated: every other
377
+ * key, hidden ones included, keeps its relative order, and a drop that
378
+ * changes nothing emits nothing. Works uncontrolled when unbound, exactly
379
+ * like `sort`. The `select` and `actions` columns are structural and never
380
+ * part of it.
381
+ *
382
+ * @defaultValue `[]`
383
+ */
384
+ order?: string[];
324
385
  /**
325
386
  * Current page number starting from 1, used for accessibility purposes.
326
387
  * Also flows into the shared table context, so a `BbPagination` paired
@@ -343,14 +404,42 @@ export type BbTableProps<Item = any> = {
343
404
  */
344
405
  readonly?: boolean;
345
406
  /**
346
- * Defines the classes to be passed to each data `<tr>`. Can also be a
407
+ * Lets the user reorder the data columns: drag a header cell (AG Grid style —
408
+ * the column moves live under the pointer and a chip with its label follows)
409
+ * or, from the keyboard, use each header's reorder handle (ArrowLeft /
410
+ * ArrowRight move the column one slot, Home / End to the ends). Every move
411
+ * writes `v-model:order`. Not needed by an external control (a column
412
+ * panel) that only writes `order`. The `select` / `actions` columns and
413
+ * a custom `#thead` are never draggable.
414
+ *
415
+ * @defaultValue `false`
416
+ */
417
+ reorderable?: boolean;
418
+ /**
419
+ * Lets the user resize the data columns of a root table: drag the handle on
420
+ * a header's trailing edge (the column follows live, the width commits on
421
+ * release), or press Alt + ArrowLeft / ArrowRight on the focused header;
422
+ * double-click the handle to go back to the declared width. Each commit
423
+ * fires `resize:column(key, width)` once. `column.width` stays the single declared
424
+ * truth: a resized width is an override the table keeps until that
425
+ * column's `width` changes — write the reported width back into your
426
+ * column definition to persist it. Ignored on a table that inherits its
427
+ * widths from a parent.
428
+ *
429
+ * @defaultValue `false`
430
+ */
431
+ resizable?: boolean;
432
+ /**
433
+ * Defines the classes to be passed to each data row. Can also be a
347
434
  * function of the row's item for dynamic values.
348
435
  */
349
436
  rowClass?: RowClasses<Item>;
350
437
  /**
351
- * Defines the classes to be passed to the header `<tr>`.
438
+ * Defines whether the table is selectable.
439
+ * Can be a global boolean that affects all rows or a function
440
+ * that accepts an item and returns a boolean that only affects that item.
352
441
  */
353
- headerRowClass?: Classes;
442
+ selectable?: boolean | ((item: Item) => boolean);
354
443
  /**
355
444
  * Defines whether the "Select all" checkbox is checked.
356
445
  *
@@ -358,11 +447,13 @@ export type BbTableProps<Item = any> = {
358
447
  */
359
448
  selectAll?: boolean;
360
449
  /**
361
- * Defines whether the table is selectable.
362
- * Can be a global boolean that affects all rows or a function
363
- * that accepts an item and returns a boolean that only affects that item.
450
+ * Text of the label used by the "Select all" boolean.
364
451
  */
365
- selectable?: boolean | ((item: Item) => boolean);
452
+ selectAllLabel?: string;
453
+ /**
454
+ * Text of the header used for the radio inputs when the table is not `multiple`.
455
+ */
456
+ selectText?: string;
366
457
  /**
367
458
  * Used by `v-model:sort`. Ordered array of `[columnKey, direction]`
368
459
  * entries, one per actively sorted column. Bidirectional: the header
@@ -374,28 +465,11 @@ export type BbTableProps<Item = any> = {
374
465
  */
375
466
  sort?: BbTableSortEntry[];
376
467
  /**
377
- * Used by `v-model:expandedItems`. Array of the currently expanded items —
378
- * toggled by the row expand control and by external writes (mirrors the
379
- * `highlighted`/`sort` v-model surfaces). Drives the `#expand` slot rows and
380
- * their `aria-expanded`/`aria-controls` wiring.
381
- *
382
- * @defaultValue `[]`
383
- */
384
- expandedItems?: any[];
385
- /**
386
- * Text of the label used by the "Select all" boolean.
387
- */
388
- selectAllLabel?: string;
389
- /**
390
- * Text of the header used for the radio inputs when the table is not `multiple`.
391
- */
392
- selectText?: string;
393
- /**
394
- * Defines the classes to be passed to the `<td>` elements. Can also be a function for dynamic values.
468
+ * Defines the classes to be passed to every data cell. Can also be a function for dynamic values.
395
469
  */
396
470
  tdClass?: ColumnClasses<Item>;
397
471
  /**
398
- * Defines the classes to be passed to the `<th>`.
472
+ * Defines the classes to be passed to every header cell.
399
473
  */
400
474
  thClass?: Classes;
401
475
  /**
@@ -423,6 +497,22 @@ export type BbTableProps<Item = any> = {
423
497
  * @defaultValue `[]`
424
498
  */
425
499
  unselectedItems?: any[];
500
+ /**
501
+ * Windows the body: only the rows in (and just around) the vertical
502
+ * scrollport are mounted, so a client-side dataset of any size scrolls at
503
+ * a constant cost. The table itself is the scroller as soon as you bound
504
+ * its height (`max-height` / `height`, or a flex item with
505
+ * `min-height: 0`); left unbounded, the nearest scrolling ancestor or the
506
+ * page scrolls it. The header sticks to that scroller. Column widths are
507
+ * measured once from the first rendered batch and then hold — later rows
508
+ * never widen them. Expand rows and nested tables stay fully rendered
509
+ * inside their row (a nested table is never windowed); the row that owns
510
+ * focus stays mounted even when scrolled out of view. Ignored by a table
511
+ * that inherits its widths from a parent, and under a `#tbody` slot.
512
+ *
513
+ * @defaultValue `false`
514
+ */
515
+ virtual?: boolean;
426
516
  };
427
517
  /**
428
518
  * We allow table data classes to be a function so it can depend on the item.
@@ -454,12 +544,22 @@ export type MappedItem = Option & {
454
544
  onRowContextMenu: (event: MouseEvent) => void;
455
545
  onRowDblClick: (event: MouseEvent) => void;
456
546
  rowIndex: number | undefined;
547
+ /**
548
+ * The row's slot scope, built ONCE per row in the projection rather than
549
+ * per cell per render (a 16-column row used to allocate ~100 closures and
550
+ * objects on every render; a virtualized table mounts a dozen rows per
551
+ * scroll step).
552
+ */
553
+ expandProps: Record<string, unknown>;
554
+ toggleExpanded: () => void;
555
+ toggleHighlighted: () => void;
556
+ toggleSelected: () => void;
457
557
  };
458
558
  /**
459
559
  * Projection that represents a header
460
560
  */
461
561
  export type MappedHeader = {
462
- align: HTMLTableCellElement['align'];
562
+ align: string;
463
563
  classes?: Classes;
464
564
  key: string;
465
565
  label: string;
@@ -486,34 +586,76 @@ export type ExpandControllerProps = {
486
586
  onKeydown: (event: KeyboardEvent) => void;
487
587
  };
488
588
  export type BbTableEvents = {
489
- (e: 'click:row', event: MouseEvent, item: any, selected: boolean): void;
490
- (e: 'contextmenu:row', event: MouseEvent, item: any, selected: boolean): void;
491
- (e: 'dblclick:row', event: MouseEvent, item: any, selected: boolean): void;
589
+ (e: 'click:row', event: MouseEvent, item: any): void;
590
+ (e: 'contextmenu:row', event: MouseEvent, item: any): void;
591
+ (e: 'dblclick:row', event: MouseEvent, item: any): void;
492
592
  (e: 'update:highlighted', value: any): void;
493
593
  (e: 'update:modelValue', value: any): void;
494
594
  (e: 'update:selectAll', value: boolean): void;
495
595
  (e: 'update:sort', value: BbTableSortEntry[]): void;
596
+ (e: 'update:order', value: string[]): void;
597
+ /**
598
+ * A column was resized by the user (`resizable`): the new width in
599
+ * px, or `null` when the handle was double-clicked to reset the column to
600
+ * its declared width.
601
+ */
602
+ (e: 'resize:column', key: string, width: number | null): void;
496
603
  (e: 'update:expandedItems', value: any[]): void;
497
604
  (e: 'update:unselectedItems', value: any[]): void;
498
605
  (e: 'item:selected', value: any): void;
499
606
  (e: 'item:unselected', value: any): void;
500
607
  };
608
+ /**
609
+ * Props exposed by the table-wide `header:prepend` / `header:append` slots and
610
+ * their per-column `header:<key>:prepend` / `header:<key>:append` variants —
611
+ * the `header:<key>` payload plus the column key.
612
+ */
613
+ export type BbTableHeaderAffixSlotProps<Item = any> = {
614
+ /** Merged header classes for this column. */
615
+ classes?: Classes;
616
+ /**
617
+ * The raw key of the column being rendered — branch on it in the
618
+ * table-wide slots.
619
+ */
620
+ columnKey: string;
621
+ /** The current table items. */
622
+ items?: Item[];
623
+ /** The column's label. */
624
+ label?: string;
625
+ /** Whether this column is sortable. */
626
+ sortable?: boolean;
627
+ /** This column's current sort direction, or `null` when unsorted. */
628
+ sortOrder?: 'asc' | 'desc' | null;
629
+ /** Cycles this column's sort: unsorted → asc → desc → unsorted. */
630
+ toggleSort?: () => void;
631
+ };
501
632
  export type BbTableSlots<Item = any> = {
502
633
  /**
503
- * Replaces the entire `<thead>` element. Use when you need full control over the header markup.
634
+ * Replaces the content of the header row group (`.bb-table__head`). Use when
635
+ * you need full control over the header markup. The table is a CSS grid,
636
+ * not a `<table>`: provide role-complete rows — `<div role="row">` holding
637
+ * one `<div role="columnheader">` per column — and never a `<tr>`/`<th>`.
638
+ * Rows are subgrid rows, so each cell lands on the matching column track.
504
639
  */
505
640
  thead?: (props: object) => any;
506
641
  /**
507
- * Replaces the entire `<tbody>` element. Use when you need full control over the body markup.
642
+ * Replaces the content of the body row group (`.bb-table__body`). Use when
643
+ * you need full control over the body markup. Provide role-complete rows —
644
+ * `<div role="row">` holding one `<div role="cell">` per column — never a
645
+ * `<tr>`/`<td>`. A full-width cell spans with `grid-column: 1 / -1`.
508
646
  */
509
647
  tbody?: (props: object) => any;
510
648
  /**
511
- * Replaces the entire `<tfoot>` element. Use when you need full control over the footer markup.
649
+ * Fills the footer row group (`.bb-table__foot`). Use when you need a
650
+ * footer. Provide role-complete rows — `<div role="row">` holding
651
+ * `<div role="cell">` elements — never a `<tr>`/`<td>`.
512
652
  */
513
653
  tfoot?: (props: {
514
654
  /**
515
- * Total rendered column count — the value to give a full-width footer row's
516
- * `colspan` (accounts for the selection/expand columns), so you never hand-count it.
655
+ * Total rendered column count (accounts for the selection/actions
656
+ * columns), so you never hand-count it. A footer cell spanning the
657
+ * whole table uses `grid-column: 1 / -1`; one spanning a subset uses
658
+ * `grid-column: span N` with `N` up to this value.
517
659
  */
518
660
  columnCount: number;
519
661
  }) => any;
@@ -535,6 +677,20 @@ export type BbTableSlots<Item = any> = {
535
677
  'header:actions'?: (props: {
536
678
  text: string;
537
679
  }) => any;
680
+ /**
681
+ * Content rendered before every data column's header cell content — the
682
+ * label + sort control, or the column's own `header:<key>` replacement.
683
+ * A column's `header:<key>:prepend` slot wins over this one for that
684
+ * column; they never stack. Branch on `columnKey` for per-column output.
685
+ */
686
+ 'header:prepend'?: (props: BbTableHeaderAffixSlotProps<Item>) => any;
687
+ /**
688
+ * Content rendered after every data column's header cell content — the
689
+ * label + sort control, or the column's own `header:<key>` replacement.
690
+ * A column's `header:<key>:append` slot wins over this one for that
691
+ * column; they never stack. Branch on `columnKey` for per-column output.
692
+ */
693
+ 'header:append'?: (props: BbTableHeaderAffixSlotProps<Item>) => any;
538
694
  /**
539
695
  * Content shown while table rows are loading (replaces the skeleton rows).
540
696
  * @param items - The current (possibly stale) list of items, useful to match the previous row count.
@@ -544,9 +700,9 @@ export type BbTableSlots<Item = any> = {
544
700
  }) => any;
545
701
  /**
546
702
  * Content shown when the items list is empty and not loading. It fills the
547
- * table's own full-width empty-state cell (the colspan already accounts for
548
- * the selection/actions columns), so provide the *content* — a message, an
549
- * illustration, a "clear filters" button — never a `<tr>`/`<td>` of your own.
703
+ * table's own full-width empty-state cell (it already spans the
704
+ * selection/actions columns), so provide the *content* — a message, an
705
+ * illustration, a "clear filters" button — never a row/cell of your own.
550
706
  */
551
707
  'no-data'?: (props: object) => any;
552
708
  /**
@@ -616,6 +772,11 @@ export type BbTableSlots<Item = any> = {
616
772
  }) => any;
617
773
  } & Record<string, (props: {
618
774
  classes?: Classes[];
775
+ /**
776
+ * Present only in the `header:<key>:prepend/append` affix slots — the
777
+ * raw key of the column being rendered.
778
+ */
779
+ columnKey?: string;
619
780
  content?: any;
620
781
  expanded?: boolean;
621
782
  expandProps?: ExpandControllerProps;
@@ -5,10 +5,93 @@ export type FixedColumnConfig = number | {
5
5
  position: 'left' | 'right';
6
6
  };
7
7
  /**
8
- * Applies sticky positioning to fixed table columns.
9
- * Call after DOM updates (e.g. in watch with flush: 'post') to read layout.
8
+ * Splits the grid root's *resolved* `grid-template-columns` (one
9
+ * `getComputedStyle` read) into its px tokens, verbatim. Returns `null` when
10
+ * any token is not a px length: a table hidden by `display: none` reports its
11
+ * SPECIFIED template (`max-content auto …`) instead of used values, and the
12
+ * caller must keep its last good measurement rather than publish keywords.
13
+ *
14
+ * Read the root only — a subgrid box reports the literal `subgrid [] [] …`.
10
15
  */
11
- export declare const applyFixedTableColumns: (table: HTMLTableElement, fixedColumns: FixedColumnConfig[]) => void;
16
+ export declare const readResolvedTracks: (root: Element) => string[] | null;
17
+ /**
18
+ * Applies sticky positioning to fixed table columns — a RECONCILE pass, not a
19
+ * set-only one: every cell of every processed row ends up with exactly the
20
+ * inline `position`/`left`/`right` its slot calls for, and nothing else.
21
+ *
22
+ * `root` is the grid root (`.bb-table__table`). Offsets are prefix sums of the
23
+ * resolved track list, so they hold to the subpixel regardless of what sized
24
+ * the track (frozen width, inherited parent track, content). Call after DOM
25
+ * updates (e.g. in a `flush: 'post'` watch) and after every re-measure so the
26
+ * offsets follow the tracks.
27
+ *
28
+ * Pins are POSITIONAL (indices into the rendered track list, `select`
29
+ * included): the pinned slot holds and whichever column lands in it is
30
+ * pinned. Cells are keyed by column, so a reorder MOVES the cell element —
31
+ * inline styles travel with it. A column leaving a pinned slot would keep
32
+ * `position: sticky; left: 0px` and, once the container scrolls, paint over
33
+ * the column that took the slot (and shrink a right-pinned slot's `left`
34
+ * would linger too), which is why every non-pinned cell is cleared and every
35
+ * pinned cell has its opposite side cleared. The same clearing is what makes
36
+ * shrinking `fixedColumns` (or emptying it) unpin. Clearing an absent inline
37
+ * property is mutation-free, so the pass is idempotent and cheap.
38
+ */
39
+ export declare const applyFixedTableColumns: (root: HTMLElement, fixedColumns: FixedColumnConfig[],
40
+ /**
41
+ * The resolved tracks when the caller already holds them (the measure path
42
+ * just read them; a `virtual` window change moves no track): skips the
43
+ * `getComputedStyle` read, which forces style on every call.
44
+ */
45
+ resolvedTracks?: string[] | null,
46
+ /**
47
+ * Skip rows whose inline styles were already written for this exact track
48
+ * list and pin config — the caller opting in to the row stamp below. Only
49
+ * safe when the CELL ORDER cannot have changed since the last pass, which
50
+ * is the caller's knowledge, not ours: a reorder can leave the track list
51
+ * and the config byte-identical while every cell has moved to a different
52
+ * track. `virtual`'s window-move pass is exactly that case (the rows
53
+ * change, the columns do not).
54
+ */
55
+ memoize?: boolean) => void;
56
+ /**
57
+ * Completes an `order` model against the declared column keys: the
58
+ * model's keys first (duplicates dropped, first occurrence wins), then every
59
+ * declared key the model omits, in declaration order. Unknown keys (columns
60
+ * the consumer currently hides) are kept in place.
61
+ */
62
+ export declare const completeColumnOrder: (model: readonly string[], declared: readonly string[]) => string[];
63
+ /**
64
+ * Declared columns in render order — the completed model restricted to the
65
+ * declared keys. A key declared twice keeps both columns (parity with the
66
+ * unordered render), adjacent, in declaration order.
67
+ */
68
+ export declare const orderColumns: <C extends {
69
+ key: string;
70
+ }>(columns: readonly C[], model: readonly string[]) => C[];
71
+ /**
72
+ * The write-back. Moves `key` to render index `toIndex` among the declared
73
+ * columns and returns the complete model to emit: the completed model with
74
+ * exactly ONE entry relocated — what dragging that entry in a panel listing
75
+ * the complete order (hidden columns included) would produce.
76
+ *
77
+ * Invariants (each pinned by a unit test):
78
+ * 1. completeness — a permutation of `completeColumnOrder(model, declared)`,
79
+ * no duplicates;
80
+ * 2. single relocation — `result` without `key` equals the completed model
81
+ * without `key`: every other key, hidden ones included, keeps its
82
+ * relative order (this IS the "hidden columns keep their slot" guarantee);
83
+ * 3. render index — among the declared keys, `key` sits at
84
+ * `clamp(toIndex, 0, N - 1)`;
85
+ * 4. adjacency — `key` lands right AFTER (moving right) / right BEFORE
86
+ * (moving left) the visible column it displaces, so a hidden key is never
87
+ * caught between the mover and its new neighbour;
88
+ * 5. stability — an unknown or hidden `key`, or `toIndex` equal to the
89
+ * current index, returns the completed model unchanged (callers compare
90
+ * against the completed model and emit nothing).
91
+ */
92
+ export declare const moveColumnKey: (model: readonly string[], declared: readonly string[], key: string, toIndex: number) => string[];
93
+ /** Sequence equality for the commit guard. */
94
+ export declare const sameColumnOrder: (a: readonly string[], b: readonly string[]) => boolean;
12
95
  /**
13
96
  * Converts a column key (e.g. "address.nested.value") to a slot-safe name (e.g. "address_nested_value").
14
97
  * Thin alias over the shared {@link slotKey} normalizer used across every
@@ -20,7 +103,7 @@ export declare const columnKeyToSlotName: (key: string) => string;
20
103
  */
21
104
  export declare const mergeHeaderClasses: (base: Classes, global?: Classes, column?: Classes) => Classes;
22
105
  /**
23
- * Accumulates every row-class source for a row's `<tr>`: the table-level
106
+ * Accumulates every row-class source for a data row: the table-level
24
107
  * `rowClass` prop (item function or static), then each column's `rowClass`
25
108
  * (resolved with that column's cell content, like `tdClass`), in column order.
26
109
  */