bitboss-ui 3.0.0-beta.53 → 3.0.0-beta.56

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 (462) hide show
  1. package/README.md +36 -43
  2. package/bin/bitboss-ui-mcp.mjs +4 -3
  3. package/bin/bitboss-ui.mjs +130 -23
  4. package/dist/ai/BbAccordion.md +119 -178
  5. package/dist/ai/BbAlert.md +44 -14
  6. package/dist/ai/BbAsterisk.md +10 -8
  7. package/dist/ai/BbAvatar.md +14 -29
  8. package/dist/ai/BbBadge.md +36 -21
  9. package/dist/ai/BbBaseButton.md +45 -21
  10. package/dist/ai/BbBaseCheckboxIcon.md +4 -4
  11. package/dist/ai/BbBreadcrumbs.md +1 -1
  12. package/dist/ai/BbButton.md +60 -49
  13. package/dist/ai/BbCalendar.md +29 -13
  14. package/dist/ai/BbCheckbox.md +28 -9
  15. package/dist/ai/BbCheckboxGroup.md +19 -8
  16. package/dist/ai/BbCollapsible.md +5 -4
  17. package/dist/ai/BbColorInput.md +9 -7
  18. package/dist/ai/BbConfirm.md +85 -113
  19. package/dist/ai/BbConfirmPortal.md +3 -3
  20. package/dist/ai/BbDatePicker.md +33 -26
  21. package/dist/ai/BbDatePickerInput.md +20 -11
  22. package/dist/ai/BbDialog.md +594 -327
  23. package/dist/ai/BbDropdown.md +14 -6
  24. package/dist/ai/BbDropdownButton.md +3 -3
  25. package/dist/ai/BbDropzone.md +88 -44
  26. package/dist/ai/BbForm.md +38 -21
  27. package/dist/ai/BbHost.md +159 -0
  28. package/dist/ai/BbHoverCard.md +12 -12
  29. package/dist/ai/BbHoverCardPortal.md +4 -4
  30. package/dist/ai/BbIndicator.md +41 -14
  31. package/dist/ai/BbNumberInput.md +8 -6
  32. package/dist/ai/BbOffCanvas.md +225 -164
  33. package/dist/ai/BbPagination.md +5 -4
  34. package/dist/ai/BbPopover.md +23 -17
  35. package/dist/ai/BbPopoverPortal.md +4 -4
  36. package/dist/ai/BbProgress.md +3 -3
  37. package/dist/ai/BbPtScope.md +5 -5
  38. package/dist/ai/BbRadio.md +7 -5
  39. package/dist/ai/BbRadioGroup.md +24 -8
  40. package/dist/ai/BbRating.md +13 -7
  41. package/dist/ai/BbSelect.md +67 -35
  42. package/dist/ai/BbSelectPopover.md +46 -22
  43. package/dist/ai/BbSlider.md +35 -12
  44. package/dist/ai/BbSpinner.md +4 -2
  45. package/dist/ai/BbSwitch.md +9 -7
  46. package/dist/ai/BbSwitchGroup.md +14 -13
  47. package/dist/ai/BbTable.md +13 -8
  48. package/dist/ai/BbTabs.md +43 -33
  49. package/dist/ai/BbTag.md +3 -3
  50. package/dist/ai/BbTextInput.md +30 -4
  51. package/dist/ai/BbTextarea.md +15 -7
  52. package/dist/ai/BbTimePicker.md +28 -13
  53. package/dist/ai/BbTimePickerInput.md +4 -4
  54. package/dist/ai/BbToast.md +109 -205
  55. package/dist/ai/BbToastPortal.md +3 -3
  56. package/dist/ai/BbTooltip.md +14 -13
  57. package/dist/ai/BbTree.md +33 -39
  58. package/dist/ai/CommonField.md +4 -4
  59. package/dist/ai/changelog.json +348 -42
  60. package/dist/ai/components.json +87 -66
  61. package/dist/ai/composables/useBbDialogContext.md +144 -0
  62. package/dist/ai/composables/useBbFormContext.md +7 -6
  63. package/dist/ai/composables/useBbOffCanvasContext.md +64 -0
  64. package/dist/ai/composables/useConfirm.md +25 -25
  65. package/dist/ai/composables/useMobile.md +2 -3
  66. package/dist/ai/composables/useToast.md +24 -24
  67. package/dist/ai/guides/agent-contract.md +9 -9
  68. package/dist/ai/guides/app-layout.md +4 -4
  69. package/dist/ai/guides/component-picker.md +2 -2
  70. package/dist/ai/guides/design-language.md +2 -6
  71. package/dist/ai/guides/design-tokens.md +7 -5
  72. package/dist/ai/guides/eslint-rules.md +67 -0
  73. package/dist/ai/guides/fetch-items-playbook.md +4 -0
  74. package/dist/ai/guides/inertia-helpers.md +188 -130
  75. package/dist/ai/guides/installation-and-plugin-setup.md +99 -97
  76. package/dist/ai/guides/migration/components/bb-collapsible.md +5 -5
  77. package/dist/ai/guides/migration/components/bb-dialog.md +12 -12
  78. package/dist/ai/guides/migration/components/bb-dropzone.md +8 -8
  79. package/dist/ai/guides/migration/components/bb-host.md +41 -0
  80. package/dist/ai/guides/migration/components/bb-offcanvas.md +9 -9
  81. package/dist/ai/guides/migration/components/bb-select-popover.md +2 -2
  82. package/dist/ai/guides/migration/components/bb-select.md +15 -15
  83. package/dist/ai/guides/migration/components/bb-toast.md +23 -17
  84. package/dist/ai/guides/migration/components/bb-tree.md +8 -8
  85. package/dist/ai/guides/migration/components/use-confirm.md +1 -1
  86. package/dist/ai/guides/migration/from-async-validator.md +2 -2
  87. package/dist/ai/guides/migration/v2-to-v3.md +184 -21
  88. package/dist/ai/guides/migration/v3-beta-css-classes.md +11 -0
  89. package/dist/ai/guides/migration/v3-beta-tooling.md +18 -2
  90. package/dist/ai/guides/options-items-playbook.md +8 -1
  91. package/dist/ai/guides/page-shell.md +11 -0
  92. package/dist/ai/guides/passthrough.md +24 -33
  93. package/dist/ai/guides/preset-components.md +32 -5
  94. package/dist/ai/guides/validated-forms.md +50 -27
  95. package/dist/ai/helpers/definePreset.json +26 -0
  96. package/dist/ai/helpers/definePreset.ts +234 -0
  97. package/dist/ai/helpers/inertia/manifest.json +21 -13
  98. package/dist/ai/helpers/inertia/types.ts +18 -7
  99. package/dist/ai/helpers/inertia/useConfirmOnRouteLeave.ts +13 -8
  100. package/dist/ai/helpers/inertia/usePaginatedResponseContext.ts +39 -18
  101. package/dist/ai/helpers/inertia/useQueryObject.ts +68 -33
  102. package/dist/ai/index.md +18 -13
  103. package/dist/ai/manifest/components/BbAccordion.json +6 -2
  104. package/dist/ai/manifest/components/BbAccordion.tree.json +13 -3
  105. package/dist/ai/manifest/components/BbAlert.json +4 -3
  106. package/dist/ai/manifest/components/BbAlert.tree.json +3 -3
  107. package/dist/ai/manifest/components/BbBaseButton.json +1 -1
  108. package/dist/ai/manifest/components/BbBaseCheckboxIcon.tree.json +4 -4
  109. package/dist/ai/manifest/components/BbBreadcrumbs.tree.json +1 -1
  110. package/dist/ai/manifest/components/BbButton.json +1 -1
  111. package/dist/ai/manifest/components/BbCalendar.json +2 -2
  112. package/dist/ai/manifest/components/BbCheckbox.json +3 -2
  113. package/dist/ai/manifest/components/BbCheckbox.tree.json +3 -2
  114. package/dist/ai/manifest/components/BbCheckboxGroup.json +3 -2
  115. package/dist/ai/manifest/components/BbCheckboxGroup.tree.json +4 -1
  116. package/dist/ai/manifest/components/BbCollapsible.json +1 -1
  117. package/dist/ai/manifest/components/BbColorInput.json +4 -3
  118. package/dist/ai/manifest/components/BbColorInput.tree.json +1 -1
  119. package/dist/ai/manifest/components/BbColorPalette.json +1 -1
  120. package/dist/ai/manifest/components/BbColorPalette.tree.json +1 -1
  121. package/dist/ai/manifest/components/BbConfirm.json +3 -4
  122. package/dist/ai/manifest/components/BbConfirm.tree.json +1 -1
  123. package/dist/ai/manifest/components/BbConfirmPortal.json +3 -3
  124. package/dist/ai/manifest/components/BbDatePicker.json +4 -4
  125. package/dist/ai/manifest/components/BbDatePicker.tree.json +1 -1
  126. package/dist/ai/manifest/components/BbDatePickerInput.json +6 -5
  127. package/dist/ai/manifest/components/BbDatePickerInput.tree.json +1 -1
  128. package/dist/ai/manifest/components/BbDialog.json +8 -7
  129. package/dist/ai/manifest/components/BbDialog.tree.json +4 -2
  130. package/dist/ai/manifest/components/BbDropdown.json +2 -2
  131. package/dist/ai/manifest/components/BbDropdown.tree.json +1 -1
  132. package/dist/ai/manifest/components/BbDropdownButton.json +2 -2
  133. package/dist/ai/manifest/components/BbDropdownButton.tree.json +1 -1
  134. package/dist/ai/manifest/components/BbDropzone.json +1 -1
  135. package/dist/ai/manifest/components/BbHost.json +14 -0
  136. package/dist/ai/manifest/components/BbHost.tree.json +9 -0
  137. package/dist/ai/manifest/components/BbHoverCardPortal.json +3 -3
  138. package/dist/ai/manifest/components/BbNumberInput.json +4 -3
  139. package/dist/ai/manifest/components/BbOffCanvas.json +8 -7
  140. package/dist/ai/manifest/components/BbOffCanvas.tree.json +3 -1
  141. package/dist/ai/manifest/components/BbPopover.json +1 -1
  142. package/dist/ai/manifest/components/BbPopover.tree.json +1 -1
  143. package/dist/ai/manifest/components/BbPopoverPortal.json +3 -3
  144. package/dist/ai/manifest/components/BbProgress.json +1 -1
  145. package/dist/ai/manifest/components/BbRadio.json +4 -3
  146. package/dist/ai/manifest/components/BbRadio.tree.json +2 -1
  147. package/dist/ai/manifest/components/BbRadioGroup.json +3 -2
  148. package/dist/ai/manifest/components/BbRadioGroup.tree.json +3 -0
  149. package/dist/ai/manifest/components/BbRating.json +3 -2
  150. package/dist/ai/manifest/components/BbRating.tree.json +2 -0
  151. package/dist/ai/manifest/components/BbSelect.json +5 -4
  152. package/dist/ai/manifest/components/BbSelect.tree.json +1 -1
  153. package/dist/ai/manifest/components/BbSelectPopover.json +2 -2
  154. package/dist/ai/manifest/components/BbSelectPopover.tree.json +1 -1
  155. package/dist/ai/manifest/components/BbSlider.json +5 -4
  156. package/dist/ai/manifest/components/BbSwitch.json +5 -4
  157. package/dist/ai/manifest/components/BbSwitch.tree.json +2 -1
  158. package/dist/ai/manifest/components/BbSwitchGroup.json +11 -10
  159. package/dist/ai/manifest/components/BbSwitchGroup.tree.json +3 -0
  160. package/dist/ai/manifest/components/BbTable.json +1 -1
  161. package/dist/ai/manifest/components/BbTable.tree.json +1 -1
  162. package/dist/ai/manifest/components/BbTabs.tree.json +1 -0
  163. package/dist/ai/manifest/components/BbTag.json +3 -2
  164. package/dist/ai/manifest/components/BbTextInput.json +4 -3
  165. package/dist/ai/manifest/components/BbTextarea.json +4 -3
  166. package/dist/ai/manifest/components/BbTimePicker.json +2 -2
  167. package/dist/ai/manifest/components/BbTimePicker.tree.json +1 -1
  168. package/dist/ai/manifest/components/BbTimePickerInput.json +5 -4
  169. package/dist/ai/manifest/components/BbTimePickerInput.tree.json +1 -1
  170. package/dist/ai/manifest/components/BbToast.json +4 -8
  171. package/dist/ai/manifest/components/BbToast.removed.json +1 -1
  172. package/dist/ai/manifest/components/BbToastPortal.json +6 -3
  173. package/dist/ai/manifest/components/BbTree.json +1 -1
  174. package/dist/ai/manifest/components/CommonField.json +5 -4
  175. package/dist/ai/manifest/components/CommonField.tree.json +76 -1
  176. package/dist/ai/manifest/index.json +9 -10
  177. package/dist/ai/manifest/meta.json +28 -4
  178. package/dist/ai/manifest/types.advanced.json +15 -7
  179. package/dist/ai/manifest/types.api.json +7 -7
  180. package/dist/ai/manifest/types.wrapper.json +2 -3
  181. package/dist/ai/recipes/inertia/approvals-inbox.md +174 -157
  182. package/dist/ai/recipes/inertia/inline-edit-workspace.md +13 -14
  183. package/dist/ai/recipes/inertia/onboarding.md +15 -18
  184. package/dist/ai/recipes/inertia/ownership-atlas.md +67 -30
  185. package/dist/ai/recipes/inertia/record-form.md +8 -8
  186. package/dist/ai/recipes/inertia/records-workspace.md +122 -97
  187. package/dist/ai/recipes/inertia/settings-workspace.md +89 -96
  188. package/dist/ai/recipes/inertia/upload-center.md +30 -24
  189. package/dist/ai/recipes/inertia/wizard-form.md +9 -7
  190. package/dist/ai/recipes/nuxt/approvals-inbox.md +174 -156
  191. package/dist/ai/recipes/nuxt/inline-edit-workspace.md +11 -13
  192. package/dist/ai/recipes/nuxt/onboarding.md +15 -18
  193. package/dist/ai/recipes/nuxt/ownership-atlas.md +63 -26
  194. package/dist/ai/recipes/nuxt/record-form.md +8 -9
  195. package/dist/ai/recipes/nuxt/records-workspace.md +112 -96
  196. package/dist/ai/recipes/nuxt/settings-workspace.md +91 -101
  197. package/dist/ai/recipes/nuxt/upload-center.md +25 -23
  198. package/dist/ai/recipes/nuxt/wizard-form.md +9 -7
  199. package/dist/ai/recipes/vue/approvals-inbox.md +175 -158
  200. package/dist/ai/recipes/vue/inline-edit-workspace.md +10 -12
  201. package/dist/ai/recipes/vue/onboarding.md +15 -20
  202. package/dist/ai/recipes/vue/ownership-atlas.md +63 -26
  203. package/dist/ai/recipes/vue/record-form.md +8 -9
  204. package/dist/ai/recipes/vue/records-workspace.md +112 -96
  205. package/dist/ai/recipes/vue/settings-workspace.md +91 -101
  206. package/dist/ai/recipes/vue/upload-center.md +25 -23
  207. package/dist/ai/recipes/vue/wizard-form.md +9 -9
  208. package/dist/ai/source/BbAccordion.md +79 -9
  209. package/dist/ai/source/BbAlert.md +34 -12
  210. package/dist/ai/source/BbBaseButton.md +15 -2
  211. package/dist/ai/source/BbBaseCheckboxIcon.md +4 -0
  212. package/dist/ai/source/BbButton.md +8 -4
  213. package/dist/ai/source/BbCalendar.md +10 -5
  214. package/dist/ai/source/BbCheckbox.md +24 -7
  215. package/dist/ai/source/BbCheckboxGroup.md +23 -5
  216. package/dist/ai/source/BbCollapsible.md +6 -7
  217. package/dist/ai/source/BbColorInput.md +6 -5
  218. package/dist/ai/source/BbColorPalette.md +0 -1
  219. package/dist/ai/source/BbConfirm.md +16 -28
  220. package/dist/ai/source/BbConfirmPortal.md +7 -14
  221. package/dist/ai/source/BbDatePicker.md +66 -2
  222. package/dist/ai/source/BbDatePickerInput.md +16 -15
  223. package/dist/ai/source/BbDialog.md +188 -36
  224. package/dist/ai/source/BbDropdown.md +5 -5
  225. package/dist/ai/source/BbDropdownGroup.md +5 -4
  226. package/dist/ai/source/BbDropzone.md +26 -9
  227. package/dist/ai/source/BbForm.md +7 -1
  228. package/dist/ai/source/BbHost.md +97 -0
  229. package/dist/ai/source/BbHoverCard.md +5 -5
  230. package/dist/ai/source/BbHoverCardPortal.md +7 -7
  231. package/dist/ai/source/BbNumberInput.md +7 -6
  232. package/dist/ai/source/BbOffCanvas.md +183 -37
  233. package/dist/ai/source/BbPopover.md +5 -6
  234. package/dist/ai/source/BbPopoverPortal.md +7 -7
  235. package/dist/ai/source/BbProgress.md +1 -1
  236. package/dist/ai/source/BbRadio.md +23 -6
  237. package/dist/ai/source/BbRadioGroup.md +22 -5
  238. package/dist/ai/source/BbRating.md +19 -5
  239. package/dist/ai/source/BbSelect.md +18 -10
  240. package/dist/ai/source/BbSelectPopover.md +10 -7
  241. package/dist/ai/source/BbSlider.md +40 -7
  242. package/dist/ai/source/BbSwitch.md +20 -3
  243. package/dist/ai/source/BbSwitchGroup.md +18 -1
  244. package/dist/ai/source/BbTable.md +5 -3
  245. package/dist/ai/source/BbTabs.md +33 -3
  246. package/dist/ai/source/BbTabsList.md +16 -3
  247. package/dist/ai/source/BbTabsPanels.md +6 -0
  248. package/dist/ai/source/BbTabsRoot.md +6 -0
  249. package/dist/ai/source/BbTag.md +6 -5
  250. package/dist/ai/source/BbTextInput.md +7 -6
  251. package/dist/ai/source/BbTextarea.md +7 -6
  252. package/dist/ai/source/BbTimePicker.md +23 -2
  253. package/dist/ai/source/BbTimePickerInput.md +11 -19
  254. package/dist/ai/source/BbToast.md +58 -27
  255. package/dist/ai/source/BbToastPortal.md +25 -14
  256. package/dist/ai/source/BbTree.md +21 -12
  257. package/dist/ai/source/CommonField.md +393 -45
  258. package/dist/ai/source/CommonPopover.md +4 -0
  259. package/dist/components/BbAccordion/BbAccordion.vue_vue_type_script_setup_true_lang.js +47 -33
  260. package/dist/components/BbAccordion/types.d.ts +21 -6
  261. package/dist/components/BbAccordion/types.js +2 -0
  262. package/dist/components/BbAlert/BbAlert.vue_vue_type_script_setup_true_lang.js +39 -37
  263. package/dist/components/BbAlert/types.d.ts +11 -4
  264. package/dist/components/BbBaseButton/types.d.ts +3 -2
  265. package/dist/components/BbButton/BbButton.vue_vue_type_script_setup_true_lang.js +40 -40
  266. package/dist/components/BbButton/types.d.ts +3 -2
  267. package/dist/components/BbCalendar/BbCalendar.vue_vue_type_script_setup_true_lang.js +4 -4
  268. package/dist/components/BbCalendar/types.d.ts +6 -1
  269. package/dist/components/BbCalendar/useDayjsLocale.d.ts +8 -0
  270. package/dist/components/BbCalendar/useDayjsLocale.js +14 -2
  271. package/dist/components/BbCheckbox/BbCheckbox.vue.d.ts +1 -1
  272. package/dist/components/BbCheckbox/BbCheckbox.vue_vue_type_script_setup_true_lang.js +44 -43
  273. package/dist/components/BbCheckbox/types.d.ts +6 -5
  274. package/dist/components/BbCheckboxGroup/types.d.ts +6 -5
  275. package/dist/components/BbCollapsible/BbCollapsible.vue_vue_type_script_setup_true_lang.js +1 -1
  276. package/dist/components/BbCollapsible/types.d.ts +4 -4
  277. package/dist/components/BbColorInput/types.d.ts +6 -5
  278. package/dist/components/BbColorPalette/BbColorPalette.vue_vue_type_script_setup_true_lang.js +0 -1
  279. package/dist/components/BbConfirm/BbConfirm.vue_vue_type_script_setup_true_lang.js +46 -48
  280. package/dist/components/BbConfirm/BbConfirmPortal.vue.d.ts +1 -1
  281. package/dist/components/BbConfirm/BbConfirmPortal.vue_vue_type_script_setup_true_lang.js +1 -1
  282. package/dist/components/BbConfirm/types.d.ts +5 -12
  283. package/dist/components/BbDatePicker/BbDatePicker.vue_vue_type_script_setup_true_lang.js +118 -103
  284. package/dist/components/BbDatePicker/types.d.ts +8 -0
  285. package/dist/components/BbDatePickerInput/BbDatePickerInput.vue_vue_type_script_setup_true_lang.js +312 -319
  286. package/dist/components/BbDatePickerInput/types.d.ts +14 -10
  287. package/dist/components/BbDialog/BbDialog.vue.d.ts +1 -0
  288. package/dist/components/BbDialog/BbDialog.vue_vue_type_script_setup_true_lang.js +193 -151
  289. package/dist/components/BbDialog/types.d.ts +59 -11
  290. package/dist/components/BbDropdown/BbDropdown.vue_vue_type_script_setup_true_lang.js +0 -1
  291. package/dist/components/BbDropdown/BbDropdownList.vue_vue_type_script_setup_true_lang.js +1 -1
  292. package/dist/components/BbDropdown/DropdownPipelineResolver.vue_vue_type_script_setup_true_lang.js +13 -13
  293. package/dist/components/BbDropdown/types.d.ts +5 -4
  294. package/dist/components/BbDropzone/BbDropzone.vue.d.ts +2 -2
  295. package/dist/components/BbDropzone/BbDropzone.vue_vue_type_script_setup_true_lang.js +142 -139
  296. package/dist/components/BbDropzone/types.d.ts +7 -2
  297. package/dist/components/BbForm/BbForm.vue_vue_type_script_setup_true_lang.js +170 -170
  298. package/dist/components/BbForm/bindFormField.d.ts +2 -3
  299. package/dist/components/BbHost/BbHost.vue.d.ts +4 -0
  300. package/dist/components/BbHost/BbHost.vue.js +5 -0
  301. package/dist/components/BbHost/BbHost.vue_vue_type_script_setup_true_lang.js +30 -0
  302. package/dist/components/BbHost/BbHostOpening.d.ts +27 -0
  303. package/dist/components/BbHost/BbHostOpening.js +43 -0
  304. package/dist/components/BbHost/types.d.ts +7 -0
  305. package/dist/components/BbHoverCard/BbHoverCardPortal.vue.d.ts +2 -2
  306. package/dist/components/BbHoverCard/types.d.ts +5 -5
  307. package/dist/components/BbNumberInput/types.d.ts +7 -6
  308. package/dist/components/BbOffCanvas/BbOffCanvas.vue.d.ts +1 -0
  309. package/dist/components/BbOffCanvas/BbOffCanvas.vue_vue_type_script_setup_true_lang.js +249 -222
  310. package/dist/components/BbOffCanvas/types.d.ts +69 -18
  311. package/dist/components/BbPopover/BbPopover.vue_vue_type_script_setup_true_lang.js +0 -1
  312. package/dist/components/BbPopover/BbPopoverPortal.vue.d.ts +2 -2
  313. package/dist/components/BbPopover/types.d.ts +5 -5
  314. package/dist/components/BbProgress/types.d.ts +1 -1
  315. package/dist/components/BbRadio/BbRadio.vue.d.ts +1 -1
  316. package/dist/components/BbRadio/BbRadio.vue_vue_type_script_setup_true_lang.js +65 -64
  317. package/dist/components/BbRadio/types.d.ts +6 -5
  318. package/dist/components/BbRadioGroup/types.d.ts +6 -5
  319. package/dist/components/BbRating/types.d.ts +6 -5
  320. package/dist/components/BbSelect/BbSelect.vue_vue_type_script_setup_true_lang.js +13 -10
  321. package/dist/components/BbSelect/types.d.ts +11 -9
  322. package/dist/components/BbSelectPopover/BbSelectPopover.vue_vue_type_script_setup_true_lang.js +7 -5
  323. package/dist/components/BbSelectPopover/types.d.ts +5 -4
  324. package/dist/components/BbSlider/BbSlider.vue_vue_type_script_setup_true_lang.js +154 -146
  325. package/dist/components/BbSlider/types.d.ts +13 -5
  326. package/dist/components/BbSwitch/BbSwitch.vue.d.ts +1 -1
  327. package/dist/components/BbSwitch/BbSwitch.vue_vue_type_script_setup_true_lang.js +83 -82
  328. package/dist/components/BbSwitch/types.d.ts +2 -1
  329. package/dist/components/BbSwitchGroup/types.d.ts +2 -1
  330. package/dist/components/BbTable/types.d.ts +5 -3
  331. package/dist/components/BbTabs/BbTabs.vue_vue_type_script_setup_true_lang.js +33 -30
  332. package/dist/components/BbTabs/BbTabsList.vue_vue_type_script_setup_true_lang.js +54 -50
  333. package/dist/components/BbTabs/tablistName.d.ts +4 -0
  334. package/dist/components/BbTabs/tablistName.js +13 -0
  335. package/dist/components/BbTag/types.d.ts +6 -5
  336. package/dist/components/BbTextInput/types.d.ts +7 -6
  337. package/dist/components/BbTextarea/types.d.ts +7 -6
  338. package/dist/components/BbTimePicker/BbTimePicker.vue_vue_type_script_setup_true_lang.js +90 -86
  339. package/dist/components/BbTimePicker/types.d.ts +6 -0
  340. package/dist/components/BbTimePickerInput/BbTimePickerInput.vue_vue_type_script_setup_true_lang.js +145 -151
  341. package/dist/components/BbTimePickerInput/types.d.ts +8 -7
  342. package/dist/components/BbToast/BbToast.vue_vue_type_script_setup_true_lang.js +41 -34
  343. package/dist/components/BbToast/BbToastMessage.vue_vue_type_script_setup_true_lang.js +79 -78
  344. package/dist/components/BbToast/BbToastPortal.vue.d.ts +5 -5
  345. package/dist/components/BbToast/BbToastPortal.vue_vue_type_script_setup_true_lang.js +1 -1
  346. package/dist/components/BbToast/BbToastRegion.vue.d.ts +2 -0
  347. package/dist/components/BbToast/BbToastRegion.vue_vue_type_script_setup_true_lang.js +66 -66
  348. package/dist/components/BbToast/types.d.ts +17 -8
  349. package/dist/components/BbTree/BbTree.vue.d.ts +1 -1
  350. package/dist/components/BbTree/BbTree.vue_vue_type_script_setup_true_lang.js +1 -1
  351. package/dist/components/BbTree/types.d.ts +6 -6
  352. package/dist/components/CommonField/CommonField.vue.d.ts +2 -1
  353. package/dist/components/CommonField/CommonField.vue_vue_type_script_setup_true_lang.js +146 -99
  354. package/dist/components/CommonField/types.d.ts +18 -12
  355. package/dist/components/CommonPopover/CommonPopover.vue_vue_type_script_setup_true_lang.js +32 -29
  356. package/dist/composables/formSubmitLock.d.ts +35 -0
  357. package/dist/composables/formSubmitLock.js +17 -2
  358. package/dist/composables/hostOpenings.d.ts +82 -0
  359. package/dist/composables/hostOpenings.js +70 -0
  360. package/dist/composables/hostRegistry.d.ts +39 -0
  361. package/dist/composables/hostRegistry.js +21 -0
  362. package/dist/composables/overlayRegistry.d.ts +160 -0
  363. package/dist/composables/overlayRegistry.js +230 -0
  364. package/dist/composables/useBbDialogContext.d.ts +86 -0
  365. package/dist/composables/useBbDialogContext.js +53 -0
  366. package/dist/composables/useBbOffCanvasContext.d.ts +23 -0
  367. package/dist/composables/useBbOffCanvasContext.js +8 -0
  368. package/dist/composables/useConfig.js +4 -0
  369. package/dist/composables/useConfirm.d.ts +44 -21
  370. package/dist/composables/useConfirm.js +4 -4
  371. package/dist/composables/useOnDemandOpener.d.ts +35 -0
  372. package/dist/composables/useOnDemandOpener.js +30 -0
  373. package/dist/composables/useRefusedCloseAnnouncement.d.ts +13 -0
  374. package/dist/composables/useRefusedCloseAnnouncement.js +15 -0
  375. package/dist/composables/useToast.d.ts +5 -6
  376. package/dist/composables/useToast.js +4 -3
  377. package/dist/deprecation/ai-deprecations.json.d.ts +3 -10
  378. package/dist/deprecation/ai-deprecations.json.js +1 -1
  379. package/dist/directives/bbDate.d.ts +40 -9
  380. package/dist/directives/bbDialog.d.ts +60 -0
  381. package/dist/directives/bbDialog.js +7 -0
  382. package/dist/directives/bbHoverCard.d.ts +3 -3
  383. package/dist/directives/bbHoverCard.js +1 -1
  384. package/dist/directives/bbOffCanvas.d.ts +46 -0
  385. package/dist/directives/bbOffCanvas.js +7 -0
  386. package/dist/directives/bbPopover.d.ts +3 -3
  387. package/dist/directives/bbPopover.js +1 -1
  388. package/dist/directives/bbTime.d.ts +23 -6
  389. package/dist/directives/directivePortal.d.ts +11 -11
  390. package/dist/directives/directivePortal.js +1 -1
  391. package/dist/directives/overlayTrigger.d.ts +28 -0
  392. package/dist/directives/overlayTrigger.js +93 -0
  393. package/dist/i18n/locales/cs.json +2 -1
  394. package/dist/i18n/locales/da.json +2 -1
  395. package/dist/i18n/locales/de-CH.json +2 -1
  396. package/dist/i18n/locales/de.json +2 -1
  397. package/dist/i18n/locales/el.json +2 -1
  398. package/dist/i18n/locales/en-GB.json +2 -1
  399. package/dist/i18n/locales/en.json +2 -1
  400. package/dist/i18n/locales/es-MX.json +2 -1
  401. package/dist/i18n/locales/es.json +2 -1
  402. package/dist/i18n/locales/fi.json +2 -1
  403. package/dist/i18n/locales/fr.json +2 -1
  404. package/dist/i18n/locales/hu.json +2 -1
  405. package/dist/i18n/locales/it.json +2 -1
  406. package/dist/i18n/locales/ja.json +2 -1
  407. package/dist/i18n/locales/ko.json +2 -1
  408. package/dist/i18n/locales/nb.json +2 -1
  409. package/dist/i18n/locales/nl.json +2 -1
  410. package/dist/i18n/locales/pl.json +2 -1
  411. package/dist/i18n/locales/pt-BR.json +2 -1
  412. package/dist/i18n/locales/pt-PT.json +2 -1
  413. package/dist/i18n/locales/ro.json +2 -1
  414. package/dist/i18n/locales/ru.json +2 -1
  415. package/dist/i18n/locales/sv.json +2 -1
  416. package/dist/i18n/locales/tr.json +2 -1
  417. package/dist/i18n/locales/uk.json +2 -1
  418. package/dist/i18n/locales/zh-CN.json +2 -1
  419. package/dist/i18n/locales/zh-HK.json +2 -1
  420. package/dist/i18n/locales/zh-TW.json +2 -1
  421. package/dist/icon-scan.d.ts +21 -0
  422. package/dist/icon-scan.js +29 -26
  423. package/dist/index.d.ts +13 -4
  424. package/dist/index.js +60 -57
  425. package/dist/llms-full.txt +4978 -3435
  426. package/dist/llms-medium.txt +119 -122
  427. package/dist/llms.txt +11 -7
  428. package/dist/locale-blueprint.json +2 -1
  429. package/dist/nuxt-auto-imports.js +3 -1
  430. package/dist/nuxt-module.d.ts +7 -4
  431. package/dist/nuxt.js +23 -20
  432. package/dist/plugin.js +27 -24
  433. package/dist/project-dts.d.ts +15 -2
  434. package/dist/project-dts.js +16 -10
  435. package/dist/runtime/nuxt-plugin.js +19 -17
  436. package/dist/styles.css +2 -2
  437. package/dist/types/Config.d.ts +33 -7
  438. package/dist/types/ptComponentMap.d.ts +1 -1
  439. package/dist/utilities/functions/responsiveDefault.d.ts +7 -0
  440. package/dist/utilities/functions/responsiveDefault.js +11 -0
  441. package/dist/utils/copyData.d.ts +10 -0
  442. package/dist/utils/copyData.js +29 -0
  443. package/dist/utils/cssLayers.d.ts +10 -0
  444. package/dist/utils/cssLayers.js +23 -18
  445. package/dist/utils/versionCheck.js +1 -1
  446. package/dist/vite-plugin.d.ts +29 -14
  447. package/dist/vite.js +247 -242
  448. package/llms.txt +11 -7
  449. package/package.json +1 -1
  450. package/scripts/lib/agent-manifest.mjs +22 -3
  451. package/scripts/lib/css-class-check.mjs +33 -2
  452. package/scripts/lib/define-preset-copy.mjs +123 -0
  453. package/scripts/lib/eslint-disable.mjs +3 -2
  454. package/scripts/lib/eslint-plugin.d.ts +2 -2
  455. package/scripts/lib/eslint-plugin.mjs +73 -93
  456. package/scripts/lib/portal-names.mjs +198 -28
  457. package/scripts/lib/project-variant-dts.mjs +53 -1
  458. package/scripts/lib/rule-registry.mjs +379 -0
  459. package/scripts/lib/swap-noun.mjs +33 -0
  460. package/scripts/lib/unimported-components.mjs +3 -1
  461. package/scripts/lib/validate-bb-markup.mjs +82 -76
  462. package/scripts/lib/required-in-form.mjs +0 -240
package/README.md CHANGED
@@ -38,18 +38,20 @@ Full detail: `dist/ai/guides/installation-and-plugin-setup.md`.
38
38
 
39
39
  ### Composables
40
40
 
41
- | Composable | Role |
42
- | ---------------------- | --------------------------------------------------------------------- |
43
- | `useBbConfig` | `setConfig()` patches the one runtime-editable kit option: `locale`. |
44
- | `useBbDropdownContext` | Read a `BbDropdown`'s resolved groups/selections from anywhere by id. |
45
- | `useBbTableContext` | Imperative handle onto a `BbTable` by id. |
46
- | `useBbTabsContext` | Programmatic tab selection for a `BbTabs` by id. |
47
- | `useConfirm` | Programmatic confirm / modal flows. |
48
- | `useCountdown` | Countdown timer state. |
49
- | `useId` | SSR-safe unique ids. |
50
- | `useMobile` | Mobile / viewport-oriented behaviour. |
51
- | `useSafeArea` | Claim a screen edge for a docked panel so toasts avoid it. |
52
- | `useToast` | Toast notifications API. |
41
+ | Composable | Role |
42
+ | ----------------------- | --------------------------------------------------------------------- |
43
+ | `useBbConfig` | `setConfig()` patches the one runtime-editable kit option: `locale`. |
44
+ | `useBbDialogContext` | Open, close and read a `BbDialog` by id (nearest scope). |
45
+ | `useBbDropdownContext` | Read a `BbDropdown`'s resolved groups/selections from anywhere by id. |
46
+ | `useBbOffCanvasContext` | Open, close and read a `BbOffCanvas` by id (nearest scope). |
47
+ | `useBbTableContext` | Imperative handle onto a `BbTable` by id. |
48
+ | `useBbTabsContext` | Programmatic tab selection for a `BbTabs` by id. |
49
+ | `useConfirm` | Programmatic confirm / modal flows. |
50
+ | `useCountdown` | Countdown timer state. |
51
+ | `useId` | SSR-safe unique ids. |
52
+ | `useMobile` | Mobile / viewport-oriented behaviour. |
53
+ | `useSafeArea` | Claim a screen edge for a docked panel so toasts avoid it. |
54
+ | `useToast` | Toast notifications API. |
53
55
 
54
56
  ### Utilities
55
57
 
@@ -57,7 +59,7 @@ Full detail: `dist/ai/guides/installation-and-plugin-setup.md`.
57
59
 
58
60
  ### Directives
59
61
 
60
- `vBbTooltip`, `vBbDropdown`, `vBbColor`, `vBbDate`, `vBbTime`, `vBbHoverCard`, `vBbPopover` — plus a
62
+ `vBbTooltip`, `vBbDropdown`, `vBbColor`, `vBbDate`, `vBbTime`, `vBbHoverCard`, `vBbPopover`, `vBbDialog`, `vBbOffCanvas` — plus a
61
63
  `Bb*DirectivePlugin` for each, for app-level registration. Prefer the directive
62
64
  over the component for simple no-slot cases.
63
65
 
@@ -382,7 +384,7 @@ in place — the rule is a codemod, not just a linter:
382
384
  | `<BbIcon type="star" />` | `<BbIcon icon="star" />` | rename |
383
385
  | `<BbTable :allow-select-all="x" />` | `<BbTable :disable-select-all="!(x)" />` | polarity inversion |
384
386
  | `<BbSelect allow-writing="not-mobile" />` | `<BbSelect disable-writing="mobile" />` | rename + value remap |
385
- | `<BbToast placement="top-end" />` | `<BbToast position="top-right" />` | value map |
387
+ | `<BbHost />` | `<BbHost />` | value map |
386
388
  | `<BbPopover show-arrow />` | `<BbPopover />` | removed & inert → deleted |
387
389
  | `<BbBadge content="5" />` | _(unchanged — reported)_ | needs a slot: manual |
388
390
 
@@ -597,37 +599,28 @@ script, a switch bound to the same ref and your own components are never
597
599
  reported. `BbAccordion` wires all of it for you.
598
600
  `bitboss-ui check` reports the same as `collapsible-trigger-aria`.
599
601
 
600
- #### `required` inside a BbForm: `no-required-in-form`
601
-
602
- A `BbForm` posts `novalidate` (vee-validate owns validation), so `required` on
603
- a form control inside one shows the asterisk and enforces nothing: an empty
604
- field submits. `bitboss-ui/no-required-in-form` (error) reports a static
605
- `required` or a bound `:required` on a library form control inside a
606
- `<BbForm>` in the same template. Write the requirement where the form
607
- validates; the asterisk follows:
608
-
609
- ```vue
610
- <template>
611
- <BbForm :model="draft" @submit="save">
612
- <BbTextInput name="email" label="Email" rules="required|email" />
613
- <BbTextInput
614
- name="vat"
615
- label="VAT number"
616
- :rules="{ required: isCompany }"
617
- />
618
- </BbForm>
619
- </template>
602
+ #### A rule nobody registered: `no-unregistered-rule`
603
+
604
+ A string rule is a vee-validate rule name, and vee-validate knows only the
605
+ names your app passes to `defineRule`; it throws "No such validator" when the
606
+ field validates. `bitboss-ui/no-unregistered-rule` (error) reads every rule
607
+ name a library control's `rules` shows (`rules="required|email"`, a bound
608
+ string, `:rules="{ required: isCompany }"`) and looks for its registration
609
+ across the project: a literal `defineRule('email', …)`, a loop over
610
+ `@vee-validate/rules` itself (it reads the installed package), or a loop over
611
+ an object literal in the same file. A registration it cannot read (a name
612
+ from a variable, an object from another file, a shared package) is never a
613
+ silence: the rule is reported as unconfirmed, naming the call. Write the name
614
+ literally, or list it once in `bitboss-ui.check.json`:
615
+
616
+ ```json
617
+ { "registeredRules": ["tenant_code"] }
620
618
  ```
621
619
 
622
- `--fix` rewrites a bare `required` to `rules="required"` when the control has
623
- no `rules` and the form no `schema`; anything else is reported for you to move
624
- (with a `schema`, require the key there). A control your own component renders
625
- inside the form's slot is not seen. `required` beside a `:rules` function is
626
- reported too, without a fix: the function checks a value only when there is
627
- one, so register it (`defineRule('vat', isVat)`) and write
628
- `rules="required|vat"`, or require the key in the schema. Outside a `BbForm`
629
- `required` stays: a plain `<form>` validates natively.
630
- `bitboss-ui check` reports the same as `required-in-form`.
620
+ (or `package.json` → `"bitboss-ui": { "registeredRules": [...] }`). A function
621
+ rule needs no registration, and rules beside a form `schema` never run, so
622
+ neither is reported. `bitboss-ui check` reports the same as
623
+ `unregistered-rule`.
631
624
 
632
625
  #### Rating star colours: `no-star-color`
633
626
 
@@ -672,7 +672,7 @@ function seeAlso(entry, contract) {
672
672
  // where "write a MemberSelect around BbSelect" is answered (Q52.6.1).
673
673
  if (/options-items-playbook\.md/.test(contract) && isGeneric(entry))
674
674
  out.push(
675
- `Your own ${entry.name} with fixed items (a CustomerSelect): a preset, one call to definePreset (a helper you copy from the guide, not a bitboss-ui export): get_guide({ name: 'preset-components.md' }). Wrapping BbSelect in your own component with its own logic: get_guide({ name: 'options-items-playbook.md', sections: ['Wrapping BbSelect in your own component'] })`
675
+ `Your own ${entry.name} with fixed items (a CustomerSelect): a preset, one call to definePreset (a helper you copy with: cp node_modules/bitboss-ui/dist/ai/helpers/definePreset.ts src/lib/definePreset.ts; not a bitboss-ui export): get_guide({ name: 'preset-components.md' }). Wrapping BbSelect in your own component with its own logic: get_guide({ name: 'options-items-playbook.md', sections: ['Wrapping BbSelect in your own component'] })`
676
676
  );
677
677
  if (entry.validated)
678
678
  out.push(
@@ -2180,12 +2180,13 @@ function getComposable({ name, sections, maxChars } = {}) {
2180
2180
  const markdown = readFileSync(join(dir, file), 'utf-8');
2181
2181
  /*
2182
2182
  * A composable that needs a host component says so FIRST, as a field: with
2183
- * no `<BbConfirm />`, `await confirm()` never settles. Every blind answerer
2183
+ * no `<BbHost />`, `await confirm()` resolves `false` after a second and a
2184
+ * toast never shows. Every blind answerer
2184
2185
  * of "await an Are-you-sure dialog" (4 of 4, 2026-09-24) left the host out,
2185
2186
  * although the doc's second paragraph states it.
2186
2187
  */
2187
2188
  const host = frontmatter(markdown).summary?.match(
2188
- /Requires (exactly one <Bb\w+ \/> host[^.]*)\./
2189
+ /Requires (exactly one <Bb\w+ \/>(?: host)?[^.]*)\./
2189
2190
  )?.[1];
2190
2191
  const base = {
2191
2192
  found: true,
@@ -86,7 +86,10 @@ import {
86
86
  portalFindings,
87
87
  projectPortalIndex,
88
88
  } from '../scripts/lib/portal-names.mjs';
89
- import { cssClassFindings } from '../scripts/lib/css-class-check.mjs';
89
+ import {
90
+ cssClassFindings,
91
+ ownedClassBlocks,
92
+ } from '../scripts/lib/css-class-check.mjs';
90
93
  import {
91
94
  cssLocalFindings,
92
95
  libraryTokens,
@@ -98,6 +101,11 @@ import {
98
101
  } from '../scripts/lib/hand-imported-styles.mjs';
99
102
  import { unknownLocaleFindings } from '../scripts/lib/locale-check.mjs';
100
103
  import {
104
+ readShippedDefinePreset,
105
+ staleDefinePresetFindings,
106
+ } from '../scripts/lib/define-preset-copy.mjs';
107
+ import {
108
+ readRegisteredVariants,
101
109
  syncNotice,
102
110
  syncProjectVariantDts,
103
111
  } from '../scripts/lib/project-variant-dts.mjs';
@@ -117,12 +125,18 @@ import {
117
125
  MCP_BIN_PATH,
118
126
  MCP_PEERS,
119
127
  } from '../scripts/lib/mcp-config.mjs';
128
+ import {
129
+ addRegistrations,
130
+ configuredRegisteredRules,
131
+ ownedBy,
132
+ packageRuleNames,
133
+ } from '../scripts/lib/rule-registry.mjs';
120
134
  import {
121
135
  loadManifest,
122
- registeredRuleNames,
123
136
  presetDefinitions,
124
137
  validateMarkdown,
125
138
  validateVueSnippet,
139
+ VARIANT_INTENT_OPTIONS,
126
140
  } from '../scripts/lib/validate-bb-markup.mjs';
127
141
 
128
142
  const PACKAGE_ROOT = join(dirname(fileURLToPath(import.meta.url)), '..');
@@ -455,29 +469,71 @@ function inSkippedDir(relPath) {
455
469
  * `recursive: true` readdir) is what keeps a multi-thousand-file `vendor/`
456
470
  * tree from being walked at all.
457
471
  */
458
- function collectCheckFiles(dir, relBase = dir, extensions = CHECK_EXTENSIONS) {
472
+ function collectCheckFiles(
473
+ dir,
474
+ relBase = dir,
475
+ extensions = CHECK_EXTENSIONS,
476
+ chain = []
477
+ ) {
459
478
  let entries;
460
479
  try {
461
480
  entries = readdirSync(dir, { withFileTypes: true });
462
481
  } catch {
463
482
  return [];
464
483
  }
484
+ // The `.gitignore` chain at this level (git semantics, shared with the
485
+ // icon scan): build output a project ignores (`.vercel/output`, `.nuxt`,
486
+ // `coverage`) is never swept.
487
+ const own = gitignoreKit?.readGitignore(dir);
488
+ const here = own ? [...chain, { dir, ig: own }] : chain;
489
+ const ignored = (full, isDir) =>
490
+ !!gitignoreKit && gitignoreKit.isGitignored(here, full, isDir);
465
491
  const out = [];
466
492
  for (const entry of entries) {
467
493
  const full = join(dir, entry.name);
468
494
  if (entry.isDirectory()) {
469
495
  if (isSkippedSegment(entry.name)) continue;
470
496
  if (isSkippedSubpath(relative(relBase, full))) continue;
471
- out.push(...collectCheckFiles(full, relBase, extensions));
497
+ if (ignored(full, true)) continue;
498
+ out.push(...collectCheckFiles(full, relBase, extensions, here));
472
499
  continue;
473
500
  }
474
501
  if (!entry.isFile()) continue;
475
502
  if (!extensions.some((ext) => entry.name.endsWith(ext))) continue;
503
+ if (ignored(full, false)) continue;
476
504
  out.push(full);
477
505
  }
478
506
  return out;
479
507
  }
480
508
 
509
+ /**
510
+ * The icon scan's `.gitignore` reader, loaded once by `check` before its
511
+ * sweep. In the library repo it loads from source (`src/icon-scan.ts`, Node
512
+ * strips the types): `dist` may be absent (the release runs the node suite
513
+ * before the build) or stale. In the package, which ships no `src`, it loads
514
+ * from `dist/icon-scan.js`. Failing to load it is an error, never a sweep
515
+ * without it: that would report a project's gitignored build output.
516
+ * Returns the error, or null once loaded.
517
+ */
518
+ let gitignoreKit = null;
519
+ async function loadGitignoreKit() {
520
+ const source = join(PACKAGE_ROOT, 'src', 'icon-scan.ts');
521
+ const file = existsSync(source)
522
+ ? source
523
+ : join(PACKAGE_ROOT, 'dist', 'icon-scan.js');
524
+ const where = relative(PACKAGE_ROOT, file);
525
+ let kit;
526
+ try {
527
+ kit = await import(pathToFileURL(file).href);
528
+ } catch (error) {
529
+ return `cannot load the .gitignore reader from ${where}: ${error.message}`;
530
+ }
531
+ if (!kit.readGitignore || !kit.isGitignored || !kit.ancestorGitignores)
532
+ return `${where} does not export the .gitignore reader`;
533
+ gitignoreKit = kit;
534
+ return null;
535
+ }
536
+
481
537
  /**
482
538
  * Resolve the file list for `check`: explicit globs/paths if given, otherwise
483
539
  * every `.vue`/`.md` file under `cwd` (excluding `CHECK_SKIP_DIRS`/
@@ -492,7 +548,13 @@ function collectCheckFiles(dir, relBase = dir, extensions = CHECK_EXTENSIONS) {
492
548
  * skipped dirs.
493
549
  */
494
550
  function resolveCheckFiles(cwd, patterns) {
495
- if (patterns.length === 0) return collectCheckFiles(cwd).sort();
551
+ if (patterns.length === 0)
552
+ return collectCheckFiles(
553
+ cwd,
554
+ cwd,
555
+ CHECK_EXTENSIONS,
556
+ gitignoreKit?.ancestorGitignores(cwd) ?? []
557
+ ).sort();
496
558
 
497
559
  const matched = new Set();
498
560
  for (const pattern of patterns) {
@@ -855,6 +917,11 @@ async function checkCommand(
855
917
  }
856
918
  ) {
857
919
  const projectRoot = process.cwd();
920
+ const kitError = await loadGitignoreKit();
921
+ if (kitError) {
922
+ console.error(`[bitboss-ui] check: ${kitError}`);
923
+ process.exit(1);
924
+ }
858
925
  if (changedOnly && globs.length) {
859
926
  console.error('[bitboss-ui] check: pass paths or `--changed`, not both.');
860
927
  process.exit(1);
@@ -986,7 +1053,8 @@ async function checkCommand(
986
1053
  const projectSources = collectCheckFiles(
987
1054
  projectRoot,
988
1055
  projectRoot,
989
- HAND_IMPORTED_STYLES_EXTENSIONS
1056
+ HAND_IMPORTED_STYLES_EXTENSIONS,
1057
+ gitignoreKit?.ancestorGitignores(projectRoot) ?? []
990
1058
  );
991
1059
  const texts = new Map();
992
1060
  const readText = (path) => {
@@ -1010,8 +1078,15 @@ async function checkCommand(
1010
1078
  .map((path) => readFileSync(path, 'utf-8')),
1011
1079
  ]);
1012
1080
  // Q54.2: the rules the project registers with `defineRule`, from the same
1013
- // whole-project sweep, so a string rule nobody registered is caught.
1014
- const registeredRules = { names: new Set(), dynamic: false };
1081
+ // whole-project sweep, so a string rule nobody registered is caught. Q67.1:
1082
+ // a call the sweep cannot read is kept by its place, never a silence.
1083
+ const registeredRules = {
1084
+ names: new Set(configuredRegisteredRules(projectRoot)),
1085
+ unreadable: [],
1086
+ stock: packageRuleNames(projectRoot),
1087
+ };
1088
+ const packageRules = registeredRules.stock;
1089
+ const ownedRuleSource = ownedBy(projectRoot);
1015
1090
  const presets = new Map();
1016
1091
  const RULE_EXTENSIONS = ['.ts', '.js', '.mjs', '.cjs', '.vue'];
1017
1092
  for (const path of projectSources.filter((file) =>
@@ -1022,18 +1097,29 @@ async function checkCommand(
1022
1097
  // Q57.3: the project's `definePreset` wrappers, by name.
1023
1098
  for (const [name, preset] of presetDefinitions(text))
1024
1099
  presets.set(name, preset);
1025
- const found = registeredRuleNames(text);
1026
- for (const name of found.names) registeredRules.names.add(name);
1027
- if (found.dynamic) registeredRules.dynamic = true;
1100
+ // A nested app (its own package.json) registers nothing for this one.
1101
+ if (ownedRuleSource(path))
1102
+ addRegistrations(
1103
+ registeredRules,
1104
+ text,
1105
+ relative(projectRoot, path),
1106
+ packageRules
1107
+ );
1028
1108
  } catch {
1029
- /* unreadable: fewer names, which only means more caution below */
1030
- registeredRules.dynamic = true;
1109
+ /* unreadable: its registrations are unknown, said where they would be */
1110
+ if (ownedRuleSource(path))
1111
+ registeredRules.unreadable.push(relative(projectRoot, path));
1031
1112
  }
1032
1113
  const validateOptions = {
1033
1114
  allowComponents: allowedComponents,
1034
1115
  projectReads,
1035
1116
  registeredRules,
1036
1117
  presets,
1118
+ // A variant the build plugin registers is the project's own name.
1119
+ registeredVariants: readRegisteredVariants(
1120
+ projectRoot,
1121
+ Object.values(VARIANT_INTENT_OPTIONS)
1122
+ ),
1037
1123
  };
1038
1124
 
1039
1125
  const findings = [];
@@ -1165,6 +1251,16 @@ async function checkCommand(
1165
1251
  readText
1166
1252
  )
1167
1253
  );
1254
+ // Q67.9: a project copy of the definePreset recipe older than the one
1255
+ // shipped beside the manifest judged against (`<dist>/ai/helpers/`), or
1256
+ // unstamped. Reads the stamp only: an edited copy is the app's own.
1257
+ findings.push(
1258
+ ...staleDefinePresetFindings(
1259
+ styleScan.map((path) => ({ path, relPath: relative(projectRoot, path) })),
1260
+ readText,
1261
+ readShippedDefinePreset(dirname(manifestPath))
1262
+ )
1263
+ );
1168
1264
  // Q46.5: `.bb-*` selectors in the app's stylesheets (the `.vue` `<style>`
1169
1265
  // blocks are read by the validator above).
1170
1266
  for (const path of styleScan) {
@@ -1172,7 +1268,10 @@ async function checkCommand(
1172
1268
  const relPath = relative(projectRoot, path);
1173
1269
  const content = readText(path);
1174
1270
  for (const finding of [
1175
- ...cssClassFindings(content, manifest.cssSurface, { stylesheet: true }),
1271
+ ...cssClassFindings(content, manifest.cssSurface, {
1272
+ stylesheet: true,
1273
+ ownedBlocks: ownedClassBlocks(allowedComponents, manifest.cssSurface),
1274
+ }),
1176
1275
  // Q46.6: custom properties set where nothing reads them.
1177
1276
  ...cssLocalFindings(content, manifest.cssSurface, manifest.localSurface, {
1178
1277
  stylesheet: true,
@@ -1450,7 +1549,9 @@ Commands:
1450
1549
  package.json { "bitboss-ui": { "allowComponents": ["BbRichEditor"] } }
1451
1550
  or \`bitboss-ui.check.json\` \`{ "allowComponents": [...] }\`.
1452
1551
  Same option name as the ESLint rules' \`allowComponents\`,
1453
- so both gates configure alike.
1552
+ so both gates configure alike. An allowed or
1553
+ project-local component owns its \`bb-<kebab>\` class
1554
+ block, so CSS styling it is never \`unknown-class\`.
1454
1555
 
1455
1556
  \`--json\` prints \`{ findings: [...], warnings: [...], hints: [...],
1456
1557
  suppressed, files, manifestVersion, installedVersion }\`
@@ -1515,11 +1616,6 @@ Commands:
1515
1616
  \`@click="open = !open"\` flips a BbCollapsible's
1516
1617
  ref, with no \`aria-expanded\`: add
1517
1618
  \`:aria-expanded="open"\` + \`aria-controls\`),
1518
- \`required-in-form\` (\`required\` on a form control
1519
- inside a \`BbForm\`: the asterisk shows but the form
1520
- posts \`novalidate\`, so nothing enforces it; write
1521
- \`rules="required"\` or make it required in the
1522
- schema),
1523
1619
  \`form-v-model\` (\`v-model\`, \`:model-value\` or an
1524
1620
  \`@update:model-value\` listener on a \`BbForm\`: it
1525
1621
  takes its object one way, \`:model="draft"\`),
@@ -1534,6 +1630,11 @@ Commands:
1534
1630
  hover-card portal opened by \`v-bb-popover\`, or the
1535
1631
  other way round; literal names only, a \`:name\`
1536
1632
  binding or a non-literal call site is never judged),
1633
+ \`unknown-dialog\` (\`v-bb-dialog\` /
1634
+ \`v-bb-off-canvas\` / \`useBbDialogContext()\` /
1635
+ \`useBbOffCanvasContext()\` names an id no
1636
+ \`<BbDialog | BbOffCanvas id>\` declares, or one of
1637
+ the other family; literal ids only),
1537
1638
  \`positional-provider\` (an \`items\` provider with
1538
1639
  positional arguments: it receives one object,
1539
1640
  \`({ query, reason, modelValue, signal })\`),
@@ -1549,12 +1650,18 @@ Commands:
1549
1650
  \`retired-entrypoint\` (an import from
1550
1651
  \`bitboss-ui/validated\`, retired: everything is in
1551
1652
  \`bitboss-ui\`; \`--fix\` rewrites it in .vue files),
1552
- \`unregistered-rule\` (a string rule no
1553
- \`defineRule\` in the project registers; silent when
1554
- the project registers rules in a loop),
1653
+ \`unregistered-rule\` (a string or object rule no
1654
+ \`defineRule\` in the project registers; a
1655
+ registration it cannot read is named, never skipped:
1656
+ list such names under \`registeredRules\` in
1657
+ bitboss-ui.check.json),
1555
1658
  \`invalid-value\` (a static value outside a closed
1556
1659
  union, e.g. \`placement="bottom-centre"\`; variants
1557
1660
  and other registry-backed unions are not checked),
1661
+ \`stale-define-preset\` (a copy of the definePreset
1662
+ recipe whose \`// bitboss-ui definePreset rev N\` stamp
1663
+ is older than the shipped one, or missing; update it
1664
+ with \`cp node_modules/bitboss-ui/dist/ai/helpers/definePreset.ts <file>\`),
1558
1665
  \`wrapper-drops-props\` (a wrapper whose
1559
1666
  \`defineProps\` declares a \`Bb*Props\` type, bare,
1560
1667
  \`Omit\` or \`Pick\`, and never binds or reads some