bitboss-ui 2.1.135 → 3.0.0-alpha.4

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 (1369) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +274 -24
  3. package/bin/bitboss-ui-mcp.mjs +662 -0
  4. package/bin/bitboss-ui.mjs +710 -0
  5. package/bin/bitboss-ui.node.test.mjs +113 -0
  6. package/dist/ai/BbAccordion.md +528 -113
  7. package/dist/ai/BbAlert.md +380 -197
  8. package/dist/ai/BbAsterisk.md +46 -0
  9. package/dist/ai/BbAvatar.md +458 -178
  10. package/dist/ai/BbBadge.md +697 -225
  11. package/dist/ai/BbBadgeButton.md +54 -0
  12. package/dist/ai/BbBaseButton.md +491 -0
  13. package/dist/ai/BbBaseCheckbox.md +49 -0
  14. package/dist/ai/BbBaseCheckboxGroup.md +64 -0
  15. package/dist/ai/BbBaseCheckboxIcon.md +176 -0
  16. package/dist/ai/BbBaseColorInput.md +64 -0
  17. package/dist/ai/BbBaseColorPalette.md +39 -0
  18. package/dist/ai/BbBaseDatePicker.md +42 -0
  19. package/dist/ai/BbBaseDatePickerInput.md +73 -0
  20. package/dist/ai/BbBaseInputContainer.md +48 -0
  21. package/dist/ai/BbBaseNumberInput.md +71 -0
  22. package/dist/ai/BbBaseRadio.md +46 -0
  23. package/dist/ai/BbBaseRadioGroup.md +64 -0
  24. package/dist/ai/BbBaseRadioIcon.md +191 -0
  25. package/dist/ai/BbBaseRating.md +51 -0
  26. package/dist/ai/BbBaseSelect.md +88 -0
  27. package/dist/ai/BbBaseSlider.md +56 -0
  28. package/dist/ai/BbBaseSwitch.md +49 -0
  29. package/dist/ai/BbBaseSwitchGroup.md +64 -0
  30. package/dist/ai/BbBaseSwitchIcon.md +186 -0
  31. package/dist/ai/BbBaseTag.md +68 -0
  32. package/dist/ai/BbBaseTextInput.md +75 -0
  33. package/dist/ai/BbBaseTextarea.md +62 -0
  34. package/dist/ai/BbBaseTimePickerInput.md +62 -0
  35. package/dist/ai/BbBreadcrumbs.md +553 -503
  36. package/dist/ai/BbButton.md +841 -636
  37. package/dist/ai/BbCheckbox.md +585 -254
  38. package/dist/ai/BbCheckboxGroup.md +573 -361
  39. package/dist/ai/BbCollapsible.md +425 -103
  40. package/dist/ai/BbColorInput.md +536 -323
  41. package/dist/ai/BbColorPalette.md +569 -330
  42. package/dist/ai/BbConfirm.md +659 -136
  43. package/dist/ai/BbConfirmPortal.md +28 -0
  44. package/dist/ai/BbDatePicker.md +244 -0
  45. package/dist/ai/BbDatePickerInput.md +720 -388
  46. package/dist/ai/BbDialog.md +778 -99
  47. package/dist/ai/BbDropdown.md +1072 -763
  48. package/dist/ai/BbDropdownButton.md +525 -614
  49. package/dist/ai/BbDropdownGroup.md +34 -0
  50. package/dist/ai/BbDropzone.md +1206 -436
  51. package/dist/ai/BbForm.md +239 -0
  52. package/dist/ai/BbIcon.md +382 -212
  53. package/dist/ai/BbIndicator.md +283 -0
  54. package/dist/ai/BbNumberInput.md +717 -355
  55. package/dist/ai/BbOffCanvas.md +897 -498
  56. package/dist/ai/BbPagination.md +489 -535
  57. package/dist/ai/BbPopover.md +591 -546
  58. package/dist/ai/BbProgress.md +462 -69
  59. package/dist/ai/BbRadio.md +352 -229
  60. package/dist/ai/BbRadioGroup.md +437 -353
  61. package/dist/ai/BbRating.md +372 -225
  62. package/dist/ai/BbSelect.md +1399 -536
  63. package/dist/ai/BbSelectPopover.md +1255 -1578
  64. package/dist/ai/BbSlider.md +500 -256
  65. package/dist/ai/BbSmoothHeight.md +485 -139
  66. package/dist/ai/BbSpinner.md +718 -131
  67. package/dist/ai/BbSwitch.md +573 -119
  68. package/dist/ai/BbSwitchGroup.md +521 -214
  69. package/dist/ai/BbTable.md +1996 -2365
  70. package/dist/ai/BbTabs.md +1147 -0
  71. package/dist/ai/BbTabsList.md +29 -0
  72. package/dist/ai/BbTabsPanes.md +27 -0
  73. package/dist/ai/BbTabsRoot.md +57 -0
  74. package/dist/ai/BbTag.md +416 -292
  75. package/dist/ai/BbTextInput.md +878 -333
  76. package/dist/ai/BbTextarea.md +850 -255
  77. package/dist/ai/BbTimePicker.md +231 -0
  78. package/dist/ai/BbTimePickerInput.md +200 -0
  79. package/dist/ai/BbToast.md +669 -196
  80. package/dist/ai/BbToastPortal.md +28 -0
  81. package/dist/ai/BbTooltip.md +453 -346
  82. package/dist/ai/BbTree.md +993 -234
  83. package/dist/ai/ChipsBox.md +27 -199
  84. package/dist/ai/ClearableButton.md +21 -55
  85. package/dist/ai/CommaBox.md +25 -200
  86. package/dist/ai/CommonInputWrapper.md +42 -0
  87. package/dist/ai/CommonPopover.md +30 -510
  88. package/dist/ai/ErrorIcon.md +19 -56
  89. package/dist/ai/FlatListBox.md +35 -379
  90. package/dist/ai/GroupedListBox.md +37 -535
  91. package/dist/ai/GuidesComponent.md +21 -0
  92. package/dist/ai/ListBox.md +38 -231
  93. package/dist/ai/OptionsContainer.md +34 -253
  94. package/dist/ai/WarningIcon.md +21 -0
  95. package/dist/ai/components.json +15897 -0
  96. package/dist/ai/composables/useBbConfig.md +80 -0
  97. package/dist/ai/composables/useBbFormContext.md +110 -0
  98. package/dist/ai/composables/useBbTableContext.md +167 -0
  99. package/dist/ai/composables/useBbTabsContext.md +118 -0
  100. package/dist/ai/composables/useBroadcastChannelInstance.md +97 -0
  101. package/dist/ai/composables/useConfirm.md +313 -0
  102. package/dist/ai/composables/useCountdown.md +86 -0
  103. package/dist/ai/composables/useId.md +60 -0
  104. package/dist/ai/composables/useMobile.md +85 -0
  105. package/dist/ai/composables/useToast.md +238 -0
  106. package/dist/ai/guides/agent-contract.md +165 -0
  107. package/dist/ai/guides/ai-router.md +113 -0
  108. package/dist/ai/guides/app-layout.md +318 -0
  109. package/dist/ai/guides/coherence-playbook.md +136 -0
  110. package/dist/ai/guides/component-picker.md +236 -0
  111. package/dist/ai/guides/design-language.md +478 -0
  112. package/dist/ai/guides/design-tokens.md +450 -0
  113. package/dist/ai/guides/fetch-items-playbook.md +161 -0
  114. package/dist/ai/guides/floating-bottom-panel.md +130 -0
  115. package/dist/ai/guides/icons-policy.md +257 -0
  116. package/dist/ai/guides/inertia-helpers.md +1443 -0
  117. package/dist/ai/guides/inline-edit-playbook.md +267 -0
  118. package/dist/ai/guides/installation-and-plugin-setup.md +440 -0
  119. package/dist/ai/guides/migration/components/bb-alert.md +37 -0
  120. package/dist/ai/guides/migration/components/bb-avatar.md +24 -0
  121. package/dist/ai/guides/migration/components/bb-badge.md +110 -0
  122. package/dist/ai/guides/migration/components/bb-breadcrumbs.md +26 -0
  123. package/dist/ai/guides/migration/components/bb-button.md +55 -0
  124. package/dist/ai/guides/migration/components/bb-checkbox-group.md +54 -0
  125. package/dist/ai/guides/migration/components/bb-checkbox.md +45 -0
  126. package/dist/ai/guides/migration/components/bb-chip.md +35 -0
  127. package/dist/ai/guides/migration/components/bb-collapsible.md +26 -0
  128. package/dist/ai/guides/migration/components/bb-color-input.md +23 -0
  129. package/dist/ai/guides/migration/components/bb-color-palette.md +31 -0
  130. package/dist/ai/guides/migration/components/bb-date-picker-input.md +84 -0
  131. package/dist/ai/guides/migration/components/bb-dialog.md +46 -0
  132. package/dist/ai/guides/migration/components/bb-dropdown-button.md +31 -0
  133. package/dist/ai/guides/migration/components/bb-dropdown.md +36 -0
  134. package/dist/ai/guides/migration/components/bb-dropzone.md +27 -0
  135. package/dist/ai/guides/migration/components/bb-icon.md +27 -0
  136. package/dist/ai/guides/migration/components/bb-offcanvas.md +63 -0
  137. package/dist/ai/guides/migration/components/bb-pagination.md +24 -0
  138. package/dist/ai/guides/migration/components/bb-popover.md +52 -0
  139. package/dist/ai/guides/migration/components/bb-rating.md +24 -0
  140. package/dist/ai/guides/migration/components/bb-select-popover.md +59 -0
  141. package/dist/ai/guides/migration/components/bb-select.md +69 -0
  142. package/dist/ai/guides/migration/components/bb-slider.md +25 -0
  143. package/dist/ai/guides/migration/components/bb-smooth-height.md +45 -0
  144. package/dist/ai/guides/migration/components/bb-spinner.md +23 -0
  145. package/dist/ai/guides/migration/components/bb-table.md +66 -0
  146. package/dist/ai/guides/migration/components/bb-tabs.md +47 -0
  147. package/dist/ai/guides/migration/components/bb-tag.md +29 -0
  148. package/dist/ai/guides/migration/components/bb-text-input.md +37 -0
  149. package/dist/ai/guides/migration/components/bb-toast.md +47 -0
  150. package/dist/ai/guides/migration/components/bb-tooltip.md +34 -0
  151. package/dist/ai/guides/migration/components/bb-tree.md +77 -0
  152. package/dist/ai/guides/migration/components/use-confirm.md +46 -0
  153. package/dist/ai/guides/migration/v2-to-v3.md +649 -0
  154. package/dist/ai/guides/options-items-playbook.md +222 -0
  155. package/dist/ai/guides/page-shell.md +113 -0
  156. package/dist/ai/guides/validated-forms.md +177 -0
  157. package/dist/ai/index.md +158 -32
  158. package/dist/ai/recipes/inertia/approvals-inbox.md +1635 -0
  159. package/dist/ai/recipes/inertia/inline-edit-workspace.md +1765 -0
  160. package/dist/ai/recipes/inertia/layout-scaffold.md +385 -0
  161. package/dist/ai/recipes/inertia/onboarding.md +1791 -0
  162. package/dist/ai/recipes/inertia/ownership-atlas.md +1327 -0
  163. package/dist/ai/recipes/inertia/record-form.md +1489 -0
  164. package/dist/ai/recipes/inertia/records-workspace.md +1416 -0
  165. package/dist/ai/recipes/inertia/upload-center.md +2003 -0
  166. package/dist/ai/recipes/inertia/wizard-form.md +1500 -0
  167. package/dist/ai/recipes/nuxt/approvals-inbox.md +1578 -0
  168. package/dist/ai/recipes/nuxt/inline-edit-workspace.md +1703 -0
  169. package/dist/ai/recipes/nuxt/layout-scaffold.md +385 -0
  170. package/dist/ai/recipes/nuxt/onboarding.md +1724 -0
  171. package/dist/ai/recipes/nuxt/record-form.md +1502 -0
  172. package/dist/ai/recipes/nuxt/records-workspace.md +1329 -0
  173. package/dist/ai/recipes/nuxt/upload-center.md +1886 -0
  174. package/dist/ai/recipes/nuxt/wizard-form.md +1509 -0
  175. package/dist/ai/recipes/vue/approvals-inbox.md +1496 -0
  176. package/dist/ai/recipes/vue/inline-edit-workspace.md +1594 -0
  177. package/dist/ai/recipes/vue/layout-scaffold.md +385 -0
  178. package/dist/ai/recipes/vue/onboarding.md +1679 -0
  179. package/dist/ai/recipes/vue/record-form.md +1586 -0
  180. package/dist/ai/recipes/vue/records-workspace.md +1245 -0
  181. package/dist/ai/recipes/vue/upload-center.md +1845 -0
  182. package/dist/ai/recipes/vue/wizard-form.md +1441 -0
  183. package/dist/ai/source/BbAccordion.md +123 -0
  184. package/dist/ai/source/BbAlert.md +401 -0
  185. package/dist/ai/source/BbAsterisk.md +32 -0
  186. package/dist/ai/source/BbAvatar.md +258 -0
  187. package/dist/ai/source/BbBadge.md +560 -0
  188. package/dist/ai/source/BbBadgeButton.md +490 -0
  189. package/dist/ai/source/BbBaseButton.md +682 -0
  190. package/dist/ai/source/BbBaseCheckbox.md +461 -0
  191. package/dist/ai/source/BbBaseCheckboxGroup.md +554 -0
  192. package/dist/ai/source/BbBaseCheckboxIcon.md +201 -0
  193. package/dist/ai/source/BbBaseColorInput.md +416 -0
  194. package/dist/ai/source/BbBaseColorPalette.md +934 -0
  195. package/dist/ai/source/BbBaseDatePicker.md +1001 -0
  196. package/dist/ai/source/BbBaseDatePickerInput.md +1785 -0
  197. package/dist/ai/source/BbBaseInputContainer.md +1210 -0
  198. package/dist/ai/source/BbBaseNumberInput.md +617 -0
  199. package/dist/ai/source/BbBaseRadio.md +377 -0
  200. package/dist/ai/source/BbBaseRadioGroup.md +533 -0
  201. package/dist/ai/source/BbBaseRadioIcon.md +153 -0
  202. package/dist/ai/source/BbBaseRating.md +573 -0
  203. package/dist/ai/source/BbBaseSelect.md +898 -0
  204. package/dist/ai/source/BbBaseSlider.md +1085 -0
  205. package/dist/ai/source/BbBaseSwitch.md +246 -0
  206. package/dist/ai/source/BbBaseSwitchGroup.md +302 -0
  207. package/dist/ai/source/BbBaseSwitchIcon.md +206 -0
  208. package/dist/ai/source/BbBaseTag.md +694 -0
  209. package/dist/ai/source/BbBaseTextInput.md +511 -0
  210. package/dist/ai/source/BbBaseTextarea.md +480 -0
  211. package/dist/ai/source/BbBaseTimePickerInput.md +1031 -0
  212. package/dist/ai/source/BbBreadcrumbs.md +815 -0
  213. package/dist/ai/source/BbButton.md +1006 -0
  214. package/dist/ai/source/BbCheckbox.md +326 -0
  215. package/dist/ai/source/BbCheckboxGroup.md +419 -0
  216. package/dist/ai/source/BbCollapsible.md +137 -0
  217. package/dist/ai/source/BbColorInput.md +322 -0
  218. package/dist/ai/source/BbColorPalette.md +371 -0
  219. package/dist/ai/source/BbConfirm.md +193 -0
  220. package/dist/ai/source/BbConfirmPortal.md +74 -0
  221. package/dist/ai/source/BbDatePicker.md +729 -0
  222. package/dist/ai/source/BbDatePickerInput.md +525 -0
  223. package/dist/ai/source/BbDialog.md +818 -0
  224. package/dist/ai/source/BbDropdown.md +2387 -0
  225. package/dist/ai/source/BbDropdownButton.md +315 -0
  226. package/dist/ai/source/BbDropdownGroup.md +1259 -0
  227. package/dist/ai/source/BbDropzone.md +864 -0
  228. package/dist/ai/source/BbForm.md +100 -0
  229. package/dist/ai/source/BbIcon.md +214 -0
  230. package/dist/ai/source/BbIndicator.md +298 -0
  231. package/dist/ai/source/BbNumberInput.md +374 -0
  232. package/dist/ai/source/BbOffCanvas.md +1266 -0
  233. package/dist/ai/source/BbPagination.md +835 -0
  234. package/dist/ai/source/BbPopover.md +860 -0
  235. package/dist/ai/source/BbProgress.md +140 -0
  236. package/dist/ai/source/BbRadio.md +303 -0
  237. package/dist/ai/source/BbRadioGroup.md +420 -0
  238. package/dist/ai/source/BbRating.md +369 -0
  239. package/dist/ai/source/BbSelect.md +688 -0
  240. package/dist/ai/source/BbSelectPopover.md +2234 -0
  241. package/dist/ai/source/BbSlider.md +378 -0
  242. package/dist/ai/source/BbSmoothHeight.md +265 -0
  243. package/dist/ai/source/BbSpinner.md +127 -0
  244. package/dist/ai/source/BbSwitch.md +175 -0
  245. package/dist/ai/source/BbSwitchGroup.md +240 -0
  246. package/dist/ai/source/BbTable.md +3433 -0
  247. package/dist/ai/source/BbTabs.md +403 -0
  248. package/dist/ai/source/BbTabsList.md +578 -0
  249. package/dist/ai/source/BbTabsPanes.md +368 -0
  250. package/dist/ai/source/BbTabsRoot.md +372 -0
  251. package/dist/ai/source/BbTag.md +390 -0
  252. package/dist/ai/source/BbTextInput.md +352 -0
  253. package/dist/ai/source/BbTextarea.md +337 -0
  254. package/dist/ai/source/BbTimePicker.md +595 -0
  255. package/dist/ai/source/BbTimePickerInput.md +376 -0
  256. package/dist/ai/source/BbToast.md +525 -0
  257. package/dist/ai/source/BbToastPortal.md +482 -0
  258. package/dist/ai/source/BbTooltip.md +522 -0
  259. package/dist/ai/source/BbTree.md +323 -0
  260. package/dist/ai/source/ChipsBox.md +201 -0
  261. package/dist/ai/source/ClearableButton.md +70 -0
  262. package/dist/ai/source/CommaBox.md +202 -0
  263. package/dist/ai/source/CommonInputWrapper.md +554 -0
  264. package/dist/ai/source/CommonPopover.md +616 -0
  265. package/dist/ai/source/ErrorIcon.md +43 -0
  266. package/dist/ai/source/FlatListBox.md +396 -0
  267. package/dist/ai/source/GroupedListBox.md +540 -0
  268. package/dist/ai/source/GuidesComponent.md +383 -0
  269. package/dist/ai/source/ListBox.md +238 -0
  270. package/dist/ai/source/OptionsContainer.md +191 -0
  271. package/dist/ai/source/WarningIcon.md +47 -0
  272. package/dist/alert-variants.d.ts +19 -0
  273. package/dist/assets/css/reset.css_inline.js +4 -0
  274. package/dist/assets/svgs/alert.svg_raw.js +4 -0
  275. package/dist/assets/svgs/calendar.svg_raw.js +4 -0
  276. package/dist/assets/svgs/check_stroke.svg_raw.js +4 -0
  277. package/dist/assets/svgs/chevron_down.svg_raw.js +4 -0
  278. package/dist/assets/svgs/chevron_right.svg_raw.js +4 -0
  279. package/dist/assets/svgs/clear.svg_raw.js +4 -0
  280. package/dist/assets/svgs/clock.svg_raw.js +4 -0
  281. package/dist/assets/svgs/error.svg_raw.js +4 -0
  282. package/dist/assets/svgs/search.svg_raw.js +4 -0
  283. package/dist/assets/svgs/sort.svg_raw.js +4 -0
  284. package/dist/assets/svgs/spinner.svg_raw.js +4 -0
  285. package/dist/assets/svgs/user.svg_raw.js +4 -0
  286. package/dist/badge-variants.d.ts +19 -0
  287. package/dist/button-variants.d.ts +21 -0
  288. package/dist/components/BbAccordion/BbAccordion.vue.d.ts +9 -3
  289. package/dist/components/BbAccordion/BbAccordion.vue.js +6 -0
  290. package/dist/components/BbAccordion/BbAccordion.vue_vue_type_script_setup_true_lang.js +66 -0
  291. package/dist/components/BbAccordion/types.d.ts +12 -8
  292. package/dist/components/BbAlert/BbAlert.vue.d.ts +12 -3
  293. package/dist/components/BbAlert/BbAlert.vue.js +6 -0
  294. package/dist/components/BbAlert/BbAlert.vue_vue_type_script_setup_true_lang.js +65 -0
  295. package/dist/components/BbAlert/types.d.ts +56 -12
  296. package/dist/components/BbAsterisk/BbAsterisk.vue.d.ts +3 -0
  297. package/dist/components/BbAsterisk/BbAsterisk.vue.js +6 -0
  298. package/dist/components/BbAsterisk/BbAsterisk.vue_vue_type_script_setup_true_lang.js +13 -0
  299. package/dist/components/BbAvatar/BbAvatar.vue.d.ts +5 -0
  300. package/dist/components/BbAvatar/BbAvatar.vue.js +6 -0
  301. package/dist/components/BbAvatar/BbAvatar.vue_vue_type_script_setup_true_lang.js +78 -0
  302. package/dist/components/BbAvatar/types.d.ts +6 -5
  303. package/dist/components/BbBadge/BadgeAppendIcon.vue.d.ts +3 -0
  304. package/dist/components/BbBadge/BadgeAppendIcon.vue.js +5 -0
  305. package/dist/components/BbBadge/BadgeAppendIcon.vue_vue_type_script_setup_true_lang.js +22 -0
  306. package/dist/components/BbBadge/BadgeBodyContent.vue.d.ts +15 -0
  307. package/dist/components/BbBadge/BadgeBodyContent.vue.js +5 -0
  308. package/dist/components/BbBadge/BadgeBodyContent.vue_vue_type_script_setup_true_lang.js +34 -0
  309. package/dist/components/BbBadge/BbBadge.vue.d.ts +8 -1
  310. package/dist/components/BbBadge/BbBadge.vue.js +6 -0
  311. package/dist/components/BbBadge/BbBadge.vue_vue_type_script_setup_true_lang.js +83 -0
  312. package/dist/components/BbBadge/BbBadgeButton.vue.d.ts +12 -0
  313. package/dist/components/BbBadge/BbBadgeButton.vue.js +5 -0
  314. package/dist/components/BbBadge/BbBadgeButton.vue_vue_type_script_setup_true_lang.js +54 -0
  315. package/dist/components/BbBadge/badgeButtonContext.d.ts +27 -0
  316. package/dist/components/BbBadge/badgeButtonContext.js +5 -0
  317. package/dist/components/BbBadge/types.d.ts +61 -16
  318. package/dist/components/BbBaseButton/BbBaseButton.vue.d.ts +13 -0
  319. package/dist/components/BbBaseButton/BbBaseButton.vue.js +6 -0
  320. package/dist/components/BbBaseButton/BbBaseButton.vue_vue_type_script_setup_true_lang.js +171 -0
  321. package/dist/components/BbBaseButton/RouterComponent.vue.js +5 -0
  322. package/dist/components/BbBaseButton/RouterComponent.vue_vue_type_script_setup_true_lang.js +29 -0
  323. package/dist/components/BbBaseButton/types.d.ts +191 -0
  324. package/dist/components/BbBaseButton/types.js +33 -0
  325. package/dist/components/BbBaseCheckbox/BbBaseCheckbox.vue.d.ts +40 -0
  326. package/dist/components/BbBaseCheckbox/BbBaseCheckbox.vue.js +6 -0
  327. package/dist/components/BbBaseCheckbox/BbBaseCheckbox.vue_vue_type_script_setup_true_lang.js +145 -0
  328. package/dist/components/BbBaseCheckbox/types.d.ts +224 -0
  329. package/dist/components/BbBaseCheckboxGroup/BbBaseCheckboxGroup.vue.d.ts +19 -0
  330. package/dist/components/BbBaseCheckboxGroup/BbBaseCheckboxGroup.vue.js +6 -0
  331. package/dist/components/BbBaseCheckboxGroup/BbBaseCheckboxGroup.vue_vue_type_script_setup_true_lang.js +190 -0
  332. package/dist/components/BbBaseCheckboxGroup/types.d.ts +257 -0
  333. package/dist/components/BbBaseCheckboxIcon/BbBaseCheckboxIcon.vue.d.ts +4 -0
  334. package/dist/components/BbBaseCheckboxIcon/BbBaseCheckboxIcon.vue.js +6 -0
  335. package/dist/components/BbBaseCheckboxIcon/BbBaseCheckboxIcon.vue_vue_type_script_setup_true_lang.js +43 -0
  336. package/dist/components/BbBaseCheckboxIcon/types.d.ts +47 -0
  337. package/dist/components/BbBaseColorInput/BbBaseColorInput.vue.d.ts +42 -0
  338. package/dist/components/BbBaseColorInput/BbBaseColorInput.vue.js +6 -0
  339. package/dist/components/BbBaseColorInput/BbBaseColorInput.vue_vue_type_script_setup_true_lang.js +178 -0
  340. package/dist/components/BbBaseColorInput/types.d.ts +210 -0
  341. package/dist/components/BbBaseColorPalette/BbBaseColorPalette.vue.d.ts +13 -0
  342. package/dist/components/BbBaseColorPalette/BbBaseColorPalette.vue.js +6 -0
  343. package/dist/components/BbBaseColorPalette/BbBaseColorPalette.vue_vue_type_script_setup_true_lang.js +395 -0
  344. package/dist/components/BbBaseColorPalette/types.d.ts +40 -0
  345. package/dist/components/BbBaseDatePicker/BbBaseDatePicker.vue.js +6 -0
  346. package/dist/components/BbBaseDatePicker/BbBaseDatePicker.vue_vue_type_script_setup_true_lang.js +300 -0
  347. package/dist/components/BbBaseDatePicker/BbBaseDatePickerInputDaySelector.vue.d.ts +44 -0
  348. package/dist/components/BbBaseDatePicker/BbBaseDatePickerInputDaySelector.vue.js +5 -0
  349. package/dist/components/BbBaseDatePicker/BbBaseDatePickerInputDaySelector.vue_vue_type_script_setup_true_lang.js +310 -0
  350. package/dist/components/BbBaseDatePicker/BbBaseDatePickerMonthSelector.vue.d.ts +5 -0
  351. package/dist/components/BbBaseDatePicker/BbBaseDatePickerMonthSelector.vue.js +5 -0
  352. package/dist/components/BbBaseDatePicker/BbBaseDatePickerMonthSelector.vue_vue_type_script_setup_true_lang.js +63 -0
  353. package/dist/components/BbBaseDatePicker/BbBaseDatePickerYearSelector.vue.d.ts +5 -0
  354. package/dist/components/BbBaseDatePicker/BbBaseDatePickerYearSelector.vue.js +5 -0
  355. package/dist/components/BbBaseDatePicker/BbBaseDatePickerYearSelector.vue_vue_type_script_setup_true_lang.js +75 -0
  356. package/dist/components/BbBaseDatePicker/typeahead.d.ts +112 -0
  357. package/dist/components/BbBaseDatePicker/typeahead.js +37 -0
  358. package/dist/components/BbBaseDatePicker/types.d.ts +97 -0
  359. package/dist/components/BbBaseDatePicker/useDatePickerContext.d.ts +58 -0
  360. package/dist/components/BbBaseDatePicker/useDatePickerContext.js +11 -0
  361. package/dist/components/BbBaseDatePickerInput/BbBaseDatePickerInput.vue.d.ts +30 -0
  362. package/dist/components/BbBaseDatePickerInput/BbBaseDatePickerInput.vue.js +6 -0
  363. package/dist/components/BbBaseDatePickerInput/BbBaseDatePickerInput.vue_vue_type_script_setup_true_lang.js +716 -0
  364. package/dist/components/BbBaseDatePickerInput/BbBaseDatePickerTimeSelector.vue.d.ts +30 -0
  365. package/dist/components/BbBaseDatePickerInput/BbBaseDatePickerTimeSelector.vue.js +6 -0
  366. package/dist/components/BbBaseDatePickerInput/BbBaseDatePickerTimeSelector.vue_vue_type_script_setup_true_lang.js +204 -0
  367. package/dist/components/BbBaseDatePickerInput/types.d.ts +311 -0
  368. package/dist/components/BbBaseInputContainer/BbBaseInputContainer.vue.d.ts +17 -0
  369. package/dist/components/BbBaseInputContainer/BbBaseInputContainer.vue.js +6 -0
  370. package/dist/components/BbBaseInputContainer/BbBaseInputContainer.vue_vue_type_script_setup_true_lang.js +191 -0
  371. package/dist/components/BbBaseInputContainer/types.d.ts +197 -0
  372. package/dist/components/BbBaseNumberInput/BbBaseNumberInput.vue.d.ts +52 -0
  373. package/dist/components/BbBaseNumberInput/BbBaseNumberInput.vue.js +6 -0
  374. package/dist/components/BbBaseNumberInput/BbBaseNumberInput.vue_vue_type_script_setup_true_lang.js +215 -0
  375. package/dist/components/BbBaseNumberInput/types.d.ts +211 -0
  376. package/dist/components/BbBaseRadio/BbBaseRadio.vue.d.ts +33 -0
  377. package/dist/components/BbBaseRadio/BbBaseRadio.vue.js +6 -0
  378. package/dist/components/BbBaseRadio/BbBaseRadio.vue_vue_type_script_setup_true_lang.js +114 -0
  379. package/dist/components/BbBaseRadio/types.d.ts +179 -0
  380. package/dist/components/BbBaseRadioGroup/BbBaseRadioGroup.vue.d.ts +19 -0
  381. package/dist/components/BbBaseRadioGroup/BbBaseRadioGroup.vue.js +6 -0
  382. package/dist/components/BbBaseRadioGroup/BbBaseRadioGroup.vue_vue_type_script_setup_true_lang.js +177 -0
  383. package/dist/components/BbBaseRadioGroup/types.d.ts +223 -0
  384. package/dist/components/BbBaseRadioIcon/BbBaseRadioIcon.vue.d.ts +4 -0
  385. package/dist/components/BbBaseRadioIcon/BbBaseRadioIcon.vue.js +6 -0
  386. package/dist/components/BbBaseRadioIcon/BbBaseRadioIcon.vue_vue_type_script_setup_true_lang.js +28 -0
  387. package/dist/components/BbBaseRadioIcon/types.d.ts +41 -0
  388. package/dist/components/BbBaseRating/BbBaseRating.vue.d.ts +38 -0
  389. package/dist/components/BbBaseRating/BbBaseRating.vue.js +6 -0
  390. package/dist/components/BbBaseRating/BbBaseRating.vue_vue_type_script_setup_true_lang.js +184 -0
  391. package/dist/components/BbBaseRating/types.d.ts +168 -0
  392. package/dist/components/BbBaseSelect/BbBaseSelect.vue.d.ts +19 -0
  393. package/dist/components/BbBaseSelect/BbBaseSelect.vue.js +6 -0
  394. package/dist/components/BbBaseSelect/BbBaseSelect.vue_vue_type_script_setup_true_lang.js +307 -0
  395. package/dist/components/BbBaseSelect/types.d.ts +297 -0
  396. package/dist/components/BbBaseSlider/BbBaseSlider.vue.d.ts +35 -0
  397. package/dist/components/BbBaseSlider/BbBaseSlider.vue.js +6 -0
  398. package/dist/components/BbBaseSlider/BbBaseSlider.vue_vue_type_script_setup_true_lang.js +324 -0
  399. package/dist/components/BbBaseSlider/types.d.ts +200 -0
  400. package/dist/components/BbBaseSwitch/BbBaseSwitch.vue.d.ts +35 -0
  401. package/dist/components/BbBaseSwitch/BbBaseSwitch.vue.js +6 -0
  402. package/dist/components/BbBaseSwitch/BbBaseSwitch.vue_vue_type_script_setup_true_lang.js +146 -0
  403. package/dist/components/BbBaseSwitch/types.d.ts +10 -0
  404. package/dist/components/BbBaseSwitchGroup/BbBaseSwitchGroup.vue.d.ts +19 -0
  405. package/dist/components/BbBaseSwitchGroup/BbBaseSwitchGroup.vue.js +6 -0
  406. package/dist/components/BbBaseSwitchGroup/BbBaseSwitchGroup.vue_vue_type_script_setup_true_lang.js +190 -0
  407. package/dist/components/BbBaseSwitchGroup/types.d.ts +8 -0
  408. package/dist/components/BbBaseSwitchIcon/BbBaseSwitchIcon.vue.d.ts +4 -0
  409. package/dist/components/BbBaseSwitchIcon/BbBaseSwitchIcon.vue.js +6 -0
  410. package/dist/components/BbBaseSwitchIcon/BbBaseSwitchIcon.vue_vue_type_script_setup_true_lang.js +30 -0
  411. package/dist/components/BbBaseSwitchIcon/types.d.ts +48 -0
  412. package/dist/components/BbBaseTag/BbBaseTag.vue.d.ts +50 -0
  413. package/dist/components/BbBaseTag/BbBaseTag.vue.js +6 -0
  414. package/dist/components/BbBaseTag/BbBaseTag.vue_vue_type_script_setup_true_lang.js +266 -0
  415. package/dist/components/BbBaseTag/types.d.ts +160 -0
  416. package/dist/components/BbBaseTextInput/BbBaseTextInput.vue.d.ts +45 -0
  417. package/dist/components/BbBaseTextInput/BbBaseTextInput.vue.js +6 -0
  418. package/dist/components/BbBaseTextInput/BbBaseTextInput.vue_vue_type_script_setup_true_lang.js +200 -0
  419. package/dist/components/BbBaseTextInput/types.d.ts +209 -0
  420. package/dist/components/BbBaseTextarea/BbBaseTextarea.vue.d.ts +39 -0
  421. package/dist/components/BbBaseTextarea/BbBaseTextarea.vue.js +6 -0
  422. package/dist/components/BbBaseTextarea/BbBaseTextarea.vue_vue_type_script_setup_true_lang.js +175 -0
  423. package/dist/components/BbBaseTextarea/types.d.ts +170 -0
  424. package/dist/components/BbBaseTimePickerInput/BbBaseTimePickerInput.vue.d.ts +27 -0
  425. package/dist/components/BbBaseTimePickerInput/BbBaseTimePickerInput.vue.js +6 -0
  426. package/dist/components/BbBaseTimePickerInput/BbBaseTimePickerInput.vue_vue_type_script_setup_true_lang.js +522 -0
  427. package/dist/components/BbBaseTimePickerInput/types.d.ts +151 -0
  428. package/dist/components/BbBreadcrumbs/BbBreadcrumbs.vue.d.ts +0 -1
  429. package/dist/components/BbBreadcrumbs/BbBreadcrumbs.vue.js +6 -0
  430. package/dist/components/BbBreadcrumbs/BbBreadcrumbs.vue_vue_type_script_setup_true_lang.js +224 -0
  431. package/dist/components/BbBreadcrumbs/estimateBreadcrumbItemWidth.js +47 -0
  432. package/dist/components/BbBreadcrumbs/types.d.ts +37 -22
  433. package/dist/components/BbButton/BbButton.vue.d.ts +6 -5
  434. package/dist/components/BbButton/BbButton.vue.js +6 -0
  435. package/dist/components/BbButton/BbButton.vue_vue_type_script_setup_true_lang.js +181 -0
  436. package/dist/components/BbButton/types.d.ts +48 -47
  437. package/dist/components/BbCheckbox/BbCheckbox.vue.d.ts +4 -3
  438. package/dist/components/BbCheckbox/BbCheckbox.vue.js +6 -0
  439. package/dist/components/BbCheckbox/BbCheckbox.vue_vue_type_script_setup_true_lang.js +146 -0
  440. package/dist/components/BbCheckbox/types.d.ts +31 -10
  441. package/dist/components/BbCheckboxGroup/BbCheckboxGroup.vue.d.ts +2 -13
  442. package/dist/components/BbCheckboxGroup/BbCheckboxGroup.vue.js +6 -0
  443. package/dist/components/BbCheckboxGroup/BbCheckboxGroup.vue_vue_type_script_setup_true_lang.js +190 -0
  444. package/dist/components/BbCheckboxGroup/types.d.ts +51 -23
  445. package/dist/components/BbCollapsible/BbCollapsible.vue.d.ts +2 -1
  446. package/dist/components/BbCollapsible/BbCollapsible.vue.js +6 -0
  447. package/dist/components/BbCollapsible/BbCollapsible.vue_vue_type_script_setup_true_lang.js +31 -0
  448. package/dist/components/BbCollapsible/types.d.ts +13 -8
  449. package/dist/components/BbColorInput/BbColorInput.vue.d.ts +10 -1
  450. package/dist/components/BbColorInput/BbColorInput.vue.js +6 -0
  451. package/dist/components/BbColorInput/BbColorInput.vue_vue_type_script_setup_true_lang.js +177 -0
  452. package/dist/components/BbColorInput/types.d.ts +44 -11
  453. package/dist/components/BbColorPalette/BbColorPalette.vue.d.ts +5 -8
  454. package/dist/components/BbColorPalette/BbColorPalette.vue.js +5 -0
  455. package/dist/components/BbColorPalette/BbColorPalette.vue_vue_type_script_setup_true_lang.js +126 -0
  456. package/dist/components/BbColorPalette/types.d.ts +71 -52
  457. package/dist/components/BbConfirm/BbConfirm.vue.js +6 -0
  458. package/dist/components/BbConfirm/BbConfirm.vue_vue_type_script_setup_true_lang.js +138 -0
  459. package/dist/components/BbConfirm/BbConfirmPortal.vue.d.ts +5 -6
  460. package/dist/components/BbConfirm/BbConfirmPortal.vue.js +5 -0
  461. package/dist/components/BbConfirm/BbConfirmPortal.vue_vue_type_script_setup_true_lang.js +19 -0
  462. package/dist/components/BbDatePicker/BbDatePicker.vue.d.ts +37 -0
  463. package/dist/components/BbDatePicker/BbDatePicker.vue.js +6 -0
  464. package/dist/components/BbDatePicker/BbDatePicker.vue_vue_type_script_setup_true_lang.js +319 -0
  465. package/dist/components/BbDatePicker/types.d.ts +159 -0
  466. package/dist/components/BbDatePickerInput/BbDatePickerInput.vue.d.ts +3 -1
  467. package/dist/components/BbDatePickerInput/BbDatePickerInput.vue.js +6 -0
  468. package/dist/components/BbDatePickerInput/BbDatePickerInput.vue_vue_type_script_setup_true_lang.js +179 -0
  469. package/dist/components/BbDatePickerInput/types.d.ts +134 -16
  470. package/dist/components/BbDialog/BbDialog.vue.d.ts +14 -6
  471. package/dist/components/BbDialog/BbDialog.vue.js +6 -0
  472. package/dist/components/BbDialog/BbDialog.vue_vue_type_script_setup_true_lang.js +214 -0
  473. package/dist/components/BbDialog/types.d.ts +146 -1
  474. package/dist/components/BbDialog/useDialogStack.d.ts +5 -0
  475. package/dist/components/BbDialog/useDialogStack.js +20 -0
  476. package/dist/components/BbDropdown/AdaptiveDropdown.vue.d.ts +24 -0
  477. package/dist/components/BbDropdown/AdaptiveDropdown.vue.js +6 -0
  478. package/dist/components/BbDropdown/AdaptiveDropdown.vue_vue_type_script_setup_true_lang.js +116 -0
  479. package/dist/components/BbDropdown/BbDropdown.vue.d.ts +14 -7
  480. package/dist/components/BbDropdown/BbDropdown.vue.js +6 -0
  481. package/dist/components/BbDropdown/BbDropdown.vue_vue_type_script_setup_true_lang.js +561 -0
  482. package/dist/components/BbDropdown/BbDropdownGroup.vue.d.ts +44 -0
  483. package/dist/components/BbDropdown/BbDropdownGroup.vue.js +5 -0
  484. package/dist/components/BbDropdown/BbDropdownGroup.vue_vue_type_script_setup_true_lang.js +36 -0
  485. package/dist/components/BbDropdown/BbDropdownList.vue.d.ts +31 -0
  486. package/dist/components/BbDropdown/BbDropdownList.vue.js +6 -0
  487. package/dist/components/BbDropdown/BbDropdownList.vue_vue_type_script_setup_true_lang.js +470 -0
  488. package/dist/components/BbDropdown/DropdownPipelineResolver.vue.d.ts +16 -0
  489. package/dist/components/BbDropdown/DropdownPipelineResolver.vue.js +5 -0
  490. package/dist/components/BbDropdown/DropdownPipelineResolver.vue_vue_type_script_setup_true_lang.js +168 -0
  491. package/dist/components/BbDropdown/normalizeGroups.d.ts +18 -0
  492. package/dist/components/BbDropdown/normalizeGroups.js +46 -0
  493. package/dist/components/BbDropdown/types.d.ts +468 -46
  494. package/dist/components/BbDropdown/types.js +4 -0
  495. package/dist/components/BbDropdown/useDropdownContext.d.ts +89 -0
  496. package/dist/components/BbDropdown/useDropdownContext.js +9 -0
  497. package/dist/components/BbDropdown/useDropdownGroupRegistry.d.ts +108 -0
  498. package/dist/components/BbDropdown/useDropdownGroupRegistry.js +5 -0
  499. package/dist/components/BbDropdownButton/BbDropdownButton.vue.d.ts +3 -3
  500. package/dist/components/BbDropdownButton/BbDropdownButton.vue.js +6 -0
  501. package/dist/components/BbDropdownButton/BbDropdownButton.vue_vue_type_script_setup_true_lang.js +119 -0
  502. package/dist/components/BbDropdownButton/types.d.ts +47 -52
  503. package/dist/components/BbDropzone/BbDropzone.vue.d.ts +5 -4
  504. package/dist/components/BbDropzone/BbDropzone.vue.js +6 -0
  505. package/dist/components/BbDropzone/BbDropzone.vue_vue_type_script_setup_true_lang.js +308 -0
  506. package/dist/components/BbDropzone/types.d.ts +77 -8
  507. package/dist/components/BbIcon/BbIcon.vue.d.ts +3 -2
  508. package/dist/components/BbIcon/BbIcon.vue.js +6 -0
  509. package/dist/components/BbIcon/BbIcon.vue_vue_type_script_setup_true_lang.js +65 -0
  510. package/dist/components/BbIcon/types.d.ts +6 -19
  511. package/dist/components/BbIndicator/BbIndicator.vue.d.ts +14 -0
  512. package/dist/components/BbIndicator/BbIndicator.vue.js +6 -0
  513. package/dist/components/BbIndicator/BbIndicator.vue_vue_type_script_setup_true_lang.js +56 -0
  514. package/dist/components/BbIndicator/types.d.ts +49 -0
  515. package/dist/components/BbNumberInput/BbNumberInput.vue.d.ts +12 -6
  516. package/dist/components/BbNumberInput/BbNumberInput.vue.js +6 -0
  517. package/dist/components/BbNumberInput/BbNumberInput.vue_vue_type_script_setup_true_lang.js +194 -0
  518. package/dist/components/BbNumberInput/types.d.ts +40 -4
  519. package/dist/components/BbOffCanvas/BbOffCanvas.vue.d.ts +16 -10
  520. package/dist/components/BbOffCanvas/BbOffCanvas.vue.js +6 -0
  521. package/dist/components/BbOffCanvas/BbOffCanvas.vue_vue_type_script_setup_true_lang.js +284 -0
  522. package/dist/components/BbOffCanvas/types.d.ts +71 -39
  523. package/dist/components/BbOffCanvas/useOffCanvasStack.d.ts +25 -0
  524. package/dist/components/BbOffCanvas/useOffCanvasStack.js +68 -0
  525. package/dist/components/BbPagination/BbPagination.vue.d.ts +9 -4
  526. package/dist/components/BbPagination/BbPagination.vue.js +6 -0
  527. package/dist/components/BbPagination/BbPagination.vue_vue_type_script_setup_true_lang.js +244 -0
  528. package/dist/components/BbPagination/paginationFit.d.ts +38 -0
  529. package/dist/components/BbPagination/paginationFit.js +13 -0
  530. package/dist/components/BbPagination/types.d.ts +51 -16
  531. package/dist/components/BbPopover/BbPopover.vue.d.ts +16 -15
  532. package/dist/components/BbPopover/BbPopover.vue.js +6 -0
  533. package/dist/components/BbPopover/BbPopover.vue_vue_type_script_setup_true_lang.js +309 -0
  534. package/dist/components/BbPopover/escapeStack.d.ts +6 -0
  535. package/dist/components/BbPopover/escapeStack.js +10 -0
  536. package/dist/components/BbPopover/types.d.ts +90 -31
  537. package/dist/components/BbProgress/BbProgress.vue.d.ts +1 -0
  538. package/dist/components/BbProgress/BbProgress.vue.js +6 -0
  539. package/dist/components/BbProgress/BbProgress.vue_vue_type_script_setup_true_lang.js +36 -0
  540. package/dist/components/BbProgress/types.d.ts +15 -1
  541. package/dist/components/BbRadio/BbRadio.vue.d.ts +5 -3
  542. package/dist/components/BbRadio/BbRadio.vue.js +6 -0
  543. package/dist/components/BbRadio/BbRadio.vue_vue_type_script_setup_true_lang.js +133 -0
  544. package/dist/components/BbRadio/types.d.ts +32 -9
  545. package/dist/components/BbRadioGroup/BbRadioGroup.vue.d.ts +4 -14
  546. package/dist/components/BbRadioGroup/BbRadioGroup.vue.js +6 -0
  547. package/dist/components/BbRadioGroup/BbRadioGroup.vue_vue_type_script_setup_true_lang.js +186 -0
  548. package/dist/components/BbRadioGroup/types.d.ts +48 -22
  549. package/dist/components/BbRating/BbRating.vue.d.ts +4 -1
  550. package/dist/components/BbRating/BbRating.vue.js +6 -0
  551. package/dist/components/BbRating/BbRating.vue_vue_type_script_setup_true_lang.js +150 -0
  552. package/dist/components/BbRating/types.d.ts +44 -10
  553. package/dist/components/BbSelect/BbSelect.vue.d.ts +2 -11
  554. package/dist/components/BbSelect/BbSelect.vue.js +6 -0
  555. package/dist/components/BbSelect/BbSelect.vue_vue_type_script_setup_true_lang.js +241 -0
  556. package/dist/components/BbSelect/types.d.ts +112 -59
  557. package/dist/components/BbSelectPopover/BbSelectPopover.vue.d.ts +1 -10
  558. package/dist/components/BbSelectPopover/BbSelectPopover.vue.js +6 -0
  559. package/dist/components/BbSelectPopover/BbSelectPopover.vue_vue_type_script_setup_true_lang.js +639 -0
  560. package/dist/components/BbSelectPopover/types.d.ts +197 -105
  561. package/dist/components/BbSlider/BbSlider.vue.d.ts +3 -6
  562. package/dist/components/BbSlider/BbSlider.vue.js +6 -0
  563. package/dist/components/BbSlider/BbSlider.vue_vue_type_script_setup_true_lang.js +166 -0
  564. package/dist/components/BbSlider/types.d.ts +44 -13
  565. package/dist/components/BbSmoothHeight/BbSmoothHeight.vue.d.ts +3 -1
  566. package/dist/components/BbSmoothHeight/BbSmoothHeight.vue.js +6 -0
  567. package/dist/components/BbSmoothHeight/BbSmoothHeight.vue_vue_type_script_setup_true_lang.js +79 -0
  568. package/dist/components/BbSmoothHeight/types.d.ts +17 -2
  569. package/dist/components/BbSpinner/BbSpinner.vue.d.ts +1 -1
  570. package/dist/components/BbSpinner/BbSpinner.vue.js +6 -0
  571. package/dist/components/BbSpinner/BbSpinner.vue_vue_type_script_setup_true_lang.js +30 -0
  572. package/dist/components/BbSpinner/types.d.ts +10 -3
  573. package/dist/components/BbSwitch/BbSwitch.vue.d.ts +5 -3
  574. package/dist/components/BbSwitch/BbSwitch.vue.js +6 -0
  575. package/dist/components/BbSwitch/BbSwitch.vue_vue_type_script_setup_true_lang.js +142 -0
  576. package/dist/components/BbSwitch/types.d.ts +3 -1
  577. package/dist/components/BbSwitchGroup/BbSwitchGroup.vue.d.ts +4 -14
  578. package/dist/components/BbSwitchGroup/BbSwitchGroup.vue.js +6 -0
  579. package/dist/components/BbSwitchGroup/BbSwitchGroup.vue_vue_type_script_setup_true_lang.js +190 -0
  580. package/dist/components/BbSwitchGroup/types.d.ts +3 -22
  581. package/dist/components/BbTable/BbTable.vue.d.ts +58 -31
  582. package/dist/components/BbTable/BbTable.vue.js +6 -0
  583. package/dist/components/BbTable/BbTable.vue_vue_type_script_setup_true_lang.js +900 -0
  584. package/dist/components/BbTable/types.d.ts +213 -37
  585. package/dist/components/BbTable/utils.d.ts +9 -1
  586. package/dist/components/BbTable/utils.js +53 -0
  587. package/dist/components/BbTabs/BbTabs.vue.d.ts +20 -0
  588. package/dist/components/BbTabs/BbTabs.vue.js +6 -0
  589. package/dist/components/BbTabs/BbTabs.vue_vue_type_script_setup_true_lang.js +64 -0
  590. package/dist/components/BbTabs/BbTabsList.vue.d.ts +19 -0
  591. package/dist/components/BbTabs/BbTabsList.vue.js +6 -0
  592. package/dist/components/BbTabs/BbTabsList.vue_vue_type_script_setup_true_lang.js +123 -0
  593. package/dist/components/BbTabs/BbTabsPanes.vue.d.ts +16 -0
  594. package/dist/components/BbTabs/BbTabsPanes.vue.js +6 -0
  595. package/dist/components/BbTabs/BbTabsPanes.vue_vue_type_script_setup_true_lang.js +35 -0
  596. package/dist/components/BbTabs/BbTabsRoot.vue.d.ts +20 -0
  597. package/dist/components/BbTabs/BbTabsRoot.vue.js +5 -0
  598. package/dist/components/BbTabs/BbTabsRoot.vue_vue_type_script_setup_true_lang.js +55 -0
  599. package/dist/components/BbTabs/types.d.ts +264 -0
  600. package/dist/components/BbTag/BbTag.vue.d.ts +19 -6
  601. package/dist/components/BbTag/BbTag.vue.js +6 -0
  602. package/dist/components/BbTag/BbTag.vue_vue_type_script_setup_true_lang.js +187 -0
  603. package/dist/components/BbTag/types.d.ts +55 -17
  604. package/dist/components/BbTextInput/BbTextInput.vue.d.ts +10 -1
  605. package/dist/components/BbTextInput/BbTextInput.vue.js +6 -0
  606. package/dist/components/BbTextInput/BbTextInput.vue_vue_type_script_setup_true_lang.js +195 -0
  607. package/dist/components/BbTextInput/types.d.ts +31 -4
  608. package/dist/components/BbTextarea/BbTextarea.vue.d.ts +10 -1
  609. package/dist/components/BbTextarea/BbTextarea.vue.js +6 -0
  610. package/dist/components/BbTextarea/BbTextarea.vue_vue_type_script_setup_true_lang.js +178 -0
  611. package/dist/components/BbTextarea/types.d.ts +33 -2
  612. package/dist/components/BbTimePicker/BbTimePicker.vue.d.ts +33 -0
  613. package/dist/components/BbTimePicker/BbTimePicker.vue.js +6 -0
  614. package/dist/components/BbTimePicker/BbTimePicker.vue_vue_type_script_setup_true_lang.js +244 -0
  615. package/dist/components/BbTimePicker/types.d.ts +133 -0
  616. package/dist/components/BbTimePickerInput/BbTimePickerInput.vue.d.ts +25 -0
  617. package/dist/components/BbTimePickerInput/BbTimePickerInput.vue.js +6 -0
  618. package/dist/components/BbTimePickerInput/BbTimePickerInput.vue_vue_type_script_setup_true_lang.js +157 -0
  619. package/dist/components/BbTimePickerInput/types.d.ts +174 -0
  620. package/dist/components/BbToast/BbToast.vue.d.ts +2 -3
  621. package/dist/components/BbToast/BbToast.vue.js +6 -0
  622. package/dist/components/BbToast/BbToast.vue_vue_type_script_setup_true_lang.js +39 -0
  623. package/dist/components/BbToast/BbToastMessage.vue.d.ts +17 -8
  624. package/dist/components/BbToast/BbToastMessage.vue.js +5 -0
  625. package/dist/components/BbToast/BbToastMessage.vue_vue_type_script_setup_true_lang.js +170 -0
  626. package/dist/components/BbToast/BbToastPortal.vue.d.ts +30 -0
  627. package/dist/components/BbToast/BbToastPortal.vue.js +5 -0
  628. package/dist/components/BbToast/BbToastPortal.vue_vue_type_script_setup_true_lang.js +19 -0
  629. package/dist/components/BbToast/BbToastRegion.vue.d.ts +8 -0
  630. package/dist/components/BbToast/BbToastRegion.vue.js +5 -0
  631. package/dist/components/BbToast/BbToastRegion.vue_vue_type_script_setup_true_lang.js +100 -0
  632. package/dist/components/BbToast/types.d.ts +69 -5
  633. package/dist/components/BbTooltip/BbTooltip.vue.d.ts +10 -3
  634. package/dist/components/BbTooltip/BbTooltip.vue.js +6 -0
  635. package/dist/components/BbTooltip/BbTooltip.vue_vue_type_script_setup_true_lang.js +160 -0
  636. package/dist/components/BbTooltip/types.d.ts +69 -11
  637. package/dist/components/BbTree/BbTree.vue.d.ts +28 -13
  638. package/dist/components/BbTree/BbTree.vue.js +6 -0
  639. package/dist/components/BbTree/BbTree.vue_vue_type_script_setup_true_lang.js +55 -0
  640. package/dist/components/BbTree/BbTreeLevel.vue.d.ts +19 -0
  641. package/dist/components/BbTree/BbTreeLevel.vue.js +5 -0
  642. package/dist/components/BbTree/BbTreeLevel.vue_vue_type_script_setup_true_lang.js +94 -0
  643. package/dist/components/BbTree/context.d.ts +17 -0
  644. package/dist/components/BbTree/context.js +4 -0
  645. package/dist/components/BbTree/types.d.ts +94 -41
  646. package/dist/components/ChipsBox/ChipsBox.vue.d.ts +2 -1
  647. package/dist/components/ChipsBox/ChipsBox.vue.js +5 -0
  648. package/dist/components/ChipsBox/ChipsBox.vue_vue_type_script_setup_true_lang.js +98 -0
  649. package/dist/components/ChipsBox/types.d.ts +12 -5
  650. package/dist/components/ClearableButton/ClearableButton.vue.d.ts +2 -1
  651. package/dist/components/ClearableButton/ClearableButton.vue.js +6 -0
  652. package/dist/components/ClearableButton/ClearableButton.vue_vue_type_script_setup_true_lang.js +19 -0
  653. package/dist/components/ClearableButton/types.d.ts +7 -1
  654. package/dist/components/CloseIcon/CloseButton.vue.d.ts +5 -0
  655. package/dist/components/CloseIcon/CloseButton.vue.js +7 -0
  656. package/dist/components/CloseIcon/CloseButton.vue_vue_type_script_setup_true_lang.js +23 -0
  657. package/dist/components/CloseIcon/types.d.ts +2 -0
  658. package/dist/components/CommaBox/CommaBox.vue.d.ts +2 -1
  659. package/dist/components/CommaBox/CommaBox.vue.js +6 -0
  660. package/dist/components/CommaBox/CommaBox.vue_vue_type_script_setup_true_lang.js +81 -0
  661. package/dist/components/CommaBox/types.d.ts +6 -7
  662. package/dist/components/CommonInputWrapper/CommonInputWrapper.vue.d.ts +19 -0
  663. package/dist/components/CommonInputWrapper/CommonInputWrapper.vue.js +6 -0
  664. package/dist/components/CommonInputWrapper/CommonInputWrapper.vue_vue_type_script_setup_true_lang.js +107 -0
  665. package/dist/components/CommonInputWrapper/types.d.ts +96 -0
  666. package/dist/components/CommonPopover/CommonPopover.vue.d.ts +9 -3
  667. package/dist/components/CommonPopover/CommonPopover.vue.js +6 -0
  668. package/dist/components/CommonPopover/CommonPopover.vue_vue_type_script_setup_true_lang.js +160 -0
  669. package/dist/components/CommonPopover/types.d.ts +65 -16
  670. package/dist/components/ErrorIcon/ErrorIcon.vue.d.ts +2 -0
  671. package/dist/components/ErrorIcon/ErrorIcon.vue.js +6 -0
  672. package/dist/components/ErrorIcon/ErrorIcon.vue_vue_type_script_setup_true_lang.js +16 -0
  673. package/dist/components/FlatListBox/FlatListBox.vue.d.ts +2 -5
  674. package/dist/components/FlatListBox/FlatListBox.vue.js +5 -0
  675. package/dist/components/FlatListBox/FlatListBox.vue_vue_type_script_setup_true_lang.js +167 -0
  676. package/dist/components/FlatListBox/types.d.ts +1 -1
  677. package/dist/components/GroupedListBox/GroupedListBox.vue.d.ts +2 -5
  678. package/dist/components/GroupedListBox/GroupedListBox.vue.js +5 -0
  679. package/dist/components/GroupedListBox/GroupedListBox.vue_vue_type_script_setup_true_lang.js +218 -0
  680. package/dist/components/ListBox/ListBox.vue.d.ts +3 -6
  681. package/dist/components/ListBox/ListBox.vue.js +5 -0
  682. package/dist/components/ListBox/ListBox.vue_vue_type_script_setup_true_lang.js +112 -0
  683. package/dist/components/ListBox/types.d.ts +1 -1
  684. package/dist/components/OptionsContainer/OptionsContainer.vue.d.ts +1 -0
  685. package/dist/components/OptionsContainer/OptionsContainer.vue.js +5 -0
  686. package/dist/components/OptionsContainer/OptionsContainer.vue_vue_type_script_setup_true_lang.js +52 -0
  687. package/dist/components/OptionsContainer/types.d.ts +14 -24
  688. package/dist/components/Transitions/ScaleFade.vue.d.ts +2 -2
  689. package/dist/components/Transitions/ScaleFade.vue.js +5 -0
  690. package/dist/components/Transitions/ScaleFade.vue_vue_type_script_setup_true_lang.js +47 -0
  691. package/dist/components/Transitions/Slide.vue.d.ts +15 -0
  692. package/dist/components/Transitions/Slide.vue.js +7 -0
  693. package/dist/components/Transitions/Slide.vue_vue_type_script_setup_true_lang.js +28 -0
  694. package/dist/components/WarningIcon/WarningIcon.vue.d.ts +5 -0
  695. package/dist/components/WarningIcon/WarningIcon.vue.js +6 -0
  696. package/dist/components/WarningIcon/WarningIcon.vue_vue_type_script_setup_true_lang.js +16 -0
  697. package/dist/components/WarningIcon/types.d.ts +3 -0
  698. package/dist/composables/__testResets.d.ts +1 -0
  699. package/dist/composables/useActiveInactiveState.d.ts +4 -0
  700. package/dist/composables/useActiveInactiveState.js +21 -0
  701. package/dist/composables/useBaseOptions.d.ts +3 -3
  702. package/dist/composables/useBaseOptions.js +31 -0
  703. package/dist/composables/useBbConfig.d.ts +8 -37
  704. package/dist/composables/useBbConfig.js +5 -0
  705. package/dist/composables/useBbDropdownContext.d.ts +89 -0
  706. package/dist/composables/useBbDropdownContext.js +46 -0
  707. package/dist/composables/useBbFormContext.d.ts +90 -0
  708. package/dist/composables/useBbFormContext.js +69 -0
  709. package/dist/composables/useBbTableContext.d.ts +195 -0
  710. package/dist/composables/useBbTableContext.js +208 -0
  711. package/dist/composables/useBbTabsContext.d.ts +111 -0
  712. package/dist/composables/useBbTabsContext.js +225 -0
  713. package/dist/composables/useBreakpoint.d.ts +13 -0
  714. package/dist/composables/useBreakpoint.js +39 -0
  715. package/dist/composables/useBroadcastChannelInstance.d.ts +1 -3
  716. package/dist/composables/useBroadcastChannelInstance.js +39 -0
  717. package/dist/composables/useCancelableFunction.js +37 -0
  718. package/dist/composables/useClosingInert.d.ts +28 -0
  719. package/dist/composables/useClosingInert.js +23 -0
  720. package/dist/composables/useCoherence.js +16 -0
  721. package/dist/composables/useConfirm.d.ts +278 -68
  722. package/dist/composables/useConfirm.js +130 -0
  723. package/dist/composables/useCountdown.js +42 -0
  724. package/dist/composables/useHashedWatcher.d.ts +17 -0
  725. package/dist/composables/useHashedWatcher.js +14 -0
  726. package/dist/composables/useId.d.ts +3 -2
  727. package/dist/composables/useIndexById.js +16 -0
  728. package/dist/composables/useInertiaPage.d.ts +10 -0
  729. package/dist/composables/useInertiaPage.js +8 -0
  730. package/dist/composables/useItemText.js +17 -0
  731. package/dist/composables/useItemValue.js +9 -0
  732. package/dist/composables/useItemsGetter.d.ts +1 -1
  733. package/dist/composables/useItemsGetter.js +30 -0
  734. package/dist/composables/useListboxFocus.js +66 -0
  735. package/dist/composables/useLocale.d.ts +1 -1
  736. package/dist/composables/useLocale.js +11 -0
  737. package/dist/composables/useLogger.d.ts +1 -1
  738. package/dist/composables/useLogger.js +10 -0
  739. package/dist/composables/useMinimalQueue.d.ts +1 -1
  740. package/dist/composables/useMobile.js +7 -0
  741. package/dist/composables/useOnFalsy.d.ts +2 -0
  742. package/dist/composables/useOnFalsy.js +9 -0
  743. package/dist/composables/useOnTruthy.d.ts +7 -0
  744. package/dist/composables/useOnTruthy.js +9 -0
  745. package/dist/composables/usePrefill.d.ts +2 -1
  746. package/dist/composables/usePrefill.js +24 -0
  747. package/dist/composables/useQuery.d.ts +15 -3
  748. package/dist/composables/useQuery.js +42 -0
  749. package/dist/composables/useRoute.js +11 -0
  750. package/dist/composables/useRouter.js +8 -0
  751. package/dist/composables/useSafeArea.d.ts +51 -0
  752. package/dist/composables/useSafeArea.js +16 -0
  753. package/dist/composables/useSegmentedFields.d.ts +104 -0
  754. package/dist/composables/useSegmentedFields.js +159 -0
  755. package/dist/composables/useTableWidthContext.d.ts +5 -0
  756. package/dist/composables/useTableWidthContext.js +42 -0
  757. package/dist/composables/useToast.d.ts +40 -70
  758. package/dist/composables/useToast.js +58 -0
  759. package/dist/composables/useTopLayer.d.ts +9 -0
  760. package/dist/composables/useTopLayer.js +7 -0
  761. package/dist/composables/useUntil.js +13 -0
  762. package/dist/composables/useViewportWidth.d.ts +17 -0
  763. package/dist/composables/useViewportWidth.js +6 -0
  764. package/dist/confirm-variants.d.ts +17 -0
  765. package/dist/deprecation/ai-deprecations.json.d.ts +784 -0
  766. package/dist/deprecation/ai-deprecations.json.js +4 -0
  767. package/dist/deprecation/removedProps.d.ts +3 -0
  768. package/dist/deprecation/removedProps.js +13 -0
  769. package/dist/directives/bbColor.d.ts +65 -0
  770. package/dist/directives/bbColor.js +24 -0
  771. package/dist/directives/bbDate.d.ts +66 -0
  772. package/dist/directives/bbDate.js +24 -0
  773. package/dist/directives/bbDropdown.d.ts +15 -11
  774. package/dist/directives/bbDropdown.js +23 -0
  775. package/dist/directives/bbTime.d.ts +64 -0
  776. package/dist/directives/bbTime.js +24 -0
  777. package/dist/directives/bbTooltip.d.ts +16 -11
  778. package/dist/directives/bbTooltip.js +24 -0
  779. package/dist/directives/createPopoverDirective.js +54 -0
  780. package/dist/dropdown-item-variants.d.ts +17 -0
  781. package/dist/i18n/index.d.ts +51 -3
  782. package/dist/i18n/index.js +27 -0
  783. package/dist/i18n/locales/cs.json +115 -0
  784. package/dist/i18n/locales/da.json +115 -0
  785. package/dist/i18n/locales/de.json +115 -0
  786. package/dist/i18n/locales/el.json +115 -0
  787. package/dist/i18n/locales/en.json +115 -0
  788. package/dist/i18n/locales/es.json +115 -0
  789. package/dist/i18n/locales/fi.json +115 -0
  790. package/dist/i18n/locales/fr.json +115 -0
  791. package/dist/i18n/locales/hu.json +115 -0
  792. package/dist/i18n/locales/it.json +115 -0
  793. package/dist/i18n/locales/ja.json +115 -0
  794. package/dist/i18n/locales/ko.json +115 -0
  795. package/dist/i18n/locales/nb.json +115 -0
  796. package/dist/i18n/locales/nl.json +115 -0
  797. package/dist/i18n/locales/pl.json +115 -0
  798. package/dist/i18n/locales/pt.json +115 -0
  799. package/dist/i18n/locales/ro.json +115 -0
  800. package/dist/i18n/locales/ru.json +115 -0
  801. package/dist/i18n/locales/sv.json +115 -0
  802. package/dist/i18n/locales/tr.json +115 -0
  803. package/dist/i18n/locales/uk.json +115 -0
  804. package/dist/i18n/locales/zh-cn.json +115 -0
  805. package/dist/icons-whitelist.d.ts +8 -0
  806. package/dist/index.d.ts +96 -79
  807. package/dist/index.js +76 -82
  808. package/dist/indicator-variants.d.ts +20 -0
  809. package/dist/llms-full.txt +79703 -0
  810. package/dist/llms-medium.txt +1514 -0
  811. package/dist/llms.txt +105 -0
  812. package/dist/locale-blueprint.json +141 -0
  813. package/dist/locale-registry.d.ts +37 -0
  814. package/dist/nuxt-module.d.ts +3 -0
  815. package/dist/nuxt.js +19 -0
  816. package/dist/plugin.d.ts +4 -0
  817. package/dist/plugin.js +22 -0
  818. package/dist/reset.css +1 -0
  819. package/dist/reset.d.ts +0 -0
  820. package/dist/runtime/nuxt-plugin.d.ts +2 -0
  821. package/dist/runtime/nuxt-plugin.js +24 -0
  822. package/dist/styles.css +2 -0
  823. package/dist/styles.d.ts +0 -0
  824. package/dist/toast-variants.d.ts +20 -0
  825. package/dist/tooltip-variants.d.ts +17 -0
  826. package/dist/types/ActionButton.d.ts +32 -0
  827. package/dist/types/AlertVariant.d.ts +16 -0
  828. package/dist/types/BadgeVariant.d.ts +16 -0
  829. package/dist/types/ButtonVariant.d.ts +17 -0
  830. package/dist/types/Classes.d.ts +1 -1
  831. package/dist/types/ColumnName.d.ts +1 -1
  832. package/dist/types/CommonProps.d.ts +68 -277
  833. package/dist/types/Config.d.ts +84 -0
  834. package/dist/types/ConfirmVariant.d.ts +15 -0
  835. package/dist/types/DropdownItemVariant.d.ts +18 -0
  836. package/dist/types/Icon.d.ts +5 -7
  837. package/dist/types/IndicatorVariant.d.ts +16 -0
  838. package/dist/types/InputDirection.d.ts +15 -0
  839. package/dist/types/ItemAccessor.d.ts +21 -0
  840. package/dist/types/Placement.d.ts +6 -0
  841. package/dist/types/ResponsiveSize.d.ts +20 -0
  842. package/dist/types/SizeScale.d.ts +8 -0
  843. package/dist/types/ToastVariant.d.ts +17 -0
  844. package/dist/types/TooltipVariant.d.ts +18 -0
  845. package/dist/utilities/functions/bytesToUnit.d.ts +2 -0
  846. package/dist/utilities/functions/bytesToUnit.js +18 -0
  847. package/dist/utilities/functions/clampPrecision.js +10 -0
  848. package/dist/utilities/functions/convertDateValue.d.ts +23 -10
  849. package/dist/utilities/functions/convertDateValue.js +12 -0
  850. package/dist/utilities/functions/deburr.js +5 -0
  851. package/dist/utilities/functions/empty.js +5 -0
  852. package/dist/utilities/functions/flattenTree.d.ts +1 -1
  853. package/dist/utilities/functions/hash.js +5 -0
  854. package/dist/utilities/functions/isDateDisabled.d.ts +1 -0
  855. package/dist/utilities/functions/isDateDisabled.js +20 -0
  856. package/dist/utilities/functions/isEqual.js +5 -0
  857. package/dist/utilities/functions/isNotEmpty.js +5 -0
  858. package/dist/utilities/functions/matchAnyKey.d.ts +1 -1
  859. package/dist/utilities/functions/matchAnyKey.js +15 -0
  860. package/dist/utilities/functions/parseSize.d.ts +1 -1
  861. package/dist/utilities/functions/parseSize.js +15 -0
  862. package/dist/utilities/functions/percentage.js +11 -0
  863. package/dist/utilities/functions/pipe.d.ts +1 -1
  864. package/dist/utilities/functions/reject.d.ts +25 -0
  865. package/dist/utilities/functions/reject.js +28 -0
  866. package/dist/utilities/functions/resolveEnumProp.d.ts +19 -0
  867. package/dist/utilities/functions/resolveEnumProp.js +5 -0
  868. package/dist/utilities/functions/slotKey.d.ts +13 -0
  869. package/dist/utilities/functions/slotKey.js +4 -0
  870. package/dist/utilities/functions/sort.d.ts +2 -2
  871. package/dist/utilities/functions/sort.js +19 -0
  872. package/dist/utilities/functions/throttle.js +5 -0
  873. package/dist/utilities/functions/waitFor.d.ts +9 -2
  874. package/dist/utilities/functions/waitFor.js +14 -0
  875. package/dist/utilities/functions/warnRemovedAttrs.d.ts +11 -0
  876. package/dist/utilities/functions/warnRemovedAttrs.js +20 -0
  877. package/dist/utilities/functions/when.js +5 -0
  878. package/dist/utilities/misc/iconsInjectionKey.d.ts +15 -0
  879. package/dist/utilities/misc/iconsInjectionKey.js +4 -0
  880. package/dist/utilities/misc/transitions.d.ts +5 -0
  881. package/dist/utilities/misc/transitions.js +8 -0
  882. package/dist/utils/injectLibraryStyles.d.ts +6 -0
  883. package/dist/utils/injectLibraryStyles.js +38 -0
  884. package/dist/validated/BbCheckbox.vue.d.ts +29 -0
  885. package/dist/validated/BbCheckbox.vue.js +5 -0
  886. package/dist/validated/BbCheckbox.vue_vue_type_script_setup_true_lang.js +75 -0
  887. package/dist/validated/BbCheckboxGroup.vue.d.ts +34 -0
  888. package/dist/validated/BbCheckboxGroup.vue.js +5 -0
  889. package/dist/validated/BbCheckboxGroup.vue_vue_type_script_setup_true_lang.js +82 -0
  890. package/dist/validated/BbColorInput.vue.d.ts +36 -0
  891. package/dist/validated/BbColorInput.vue.js +5 -0
  892. package/dist/validated/BbColorInput.vue_vue_type_script_setup_true_lang.js +71 -0
  893. package/dist/validated/BbDatePickerInput.vue.d.ts +41 -0
  894. package/dist/validated/BbDatePickerInput.vue.js +5 -0
  895. package/dist/validated/BbDatePickerInput.vue_vue_type_script_setup_true_lang.js +90 -0
  896. package/dist/validated/BbDropzone.vue.d.ts +24 -0
  897. package/dist/validated/BbDropzone.vue.js +5 -0
  898. package/dist/validated/BbDropzone.vue_vue_type_script_setup_true_lang.js +45 -0
  899. package/dist/validated/BbForm.vue.d.ts +28 -0
  900. package/dist/validated/BbForm.vue.js +5 -0
  901. package/dist/validated/BbForm.vue_vue_type_script_setup_true_lang.js +42 -0
  902. package/dist/validated/BbNumberInput.vue.d.ts +36 -0
  903. package/dist/validated/BbNumberInput.vue.js +5 -0
  904. package/dist/validated/BbNumberInput.vue_vue_type_script_setup_true_lang.js +72 -0
  905. package/dist/validated/BbRadioGroup.vue.d.ts +34 -0
  906. package/dist/validated/BbRadioGroup.vue.js +5 -0
  907. package/dist/validated/BbRadioGroup.vue_vue_type_script_setup_true_lang.js +78 -0
  908. package/dist/validated/BbRating.vue.d.ts +30 -0
  909. package/dist/validated/BbRating.vue.js +5 -0
  910. package/dist/validated/BbRating.vue_vue_type_script_setup_true_lang.js +63 -0
  911. package/dist/validated/BbSelect.vue.d.ts +46 -0
  912. package/dist/validated/BbSelect.vue.js +5 -0
  913. package/dist/validated/BbSelect.vue_vue_type_script_setup_true_lang.js +109 -0
  914. package/dist/validated/BbSlider.vue.d.ts +36 -0
  915. package/dist/validated/BbSlider.vue.js +5 -0
  916. package/dist/validated/BbSlider.vue_vue_type_script_setup_true_lang.js +69 -0
  917. package/dist/validated/BbSwitch.vue.d.ts +29 -0
  918. package/dist/validated/BbSwitch.vue.js +5 -0
  919. package/dist/validated/BbSwitch.vue_vue_type_script_setup_true_lang.js +75 -0
  920. package/dist/validated/BbSwitchGroup.vue.d.ts +34 -0
  921. package/dist/validated/BbSwitchGroup.vue.js +5 -0
  922. package/dist/validated/BbSwitchGroup.vue_vue_type_script_setup_true_lang.js +82 -0
  923. package/dist/validated/BbTag.vue.d.ts +36 -0
  924. package/dist/validated/BbTag.vue.js +5 -0
  925. package/dist/validated/BbTag.vue_vue_type_script_setup_true_lang.js +72 -0
  926. package/dist/validated/BbTextInput.vue.d.ts +36 -0
  927. package/dist/validated/BbTextInput.vue.js +5 -0
  928. package/dist/validated/BbTextInput.vue_vue_type_script_setup_true_lang.js +72 -0
  929. package/dist/validated/BbTextarea.vue.d.ts +36 -0
  930. package/dist/validated/BbTextarea.vue.js +5 -0
  931. package/dist/validated/BbTextarea.vue_vue_type_script_setup_true_lang.js +70 -0
  932. package/dist/validated/BbTimePickerInput.vue.d.ts +37 -0
  933. package/dist/validated/BbTimePickerInput.vue.js +5 -0
  934. package/dist/validated/BbTimePickerInput.vue_vue_type_script_setup_true_lang.js +81 -0
  935. package/dist/validated/index.d.ts +29 -0
  936. package/dist/validated/useValidatedField.d.ts +93 -0
  937. package/dist/validated/useValidatedField.js +51 -0
  938. package/dist/validated.js +21 -0
  939. package/dist/vite-plugin.d.ts +261 -0
  940. package/dist/vite.js +603 -0
  941. package/llms.txt +107 -0
  942. package/package.json +181 -60
  943. package/scripts/lib/__fixtures__/validated-manifest.json +65 -0
  944. package/scripts/lib/ensure-manifest.mjs +39 -0
  945. package/scripts/lib/eslint-plugin-autofix.node.test.mjs +109 -0
  946. package/scripts/lib/eslint-plugin-recommended.node.test.mjs +87 -0
  947. package/scripts/lib/eslint-plugin-slots.node.test.mjs +271 -0
  948. package/scripts/lib/eslint-plugin.mjs +702 -0
  949. package/scripts/lib/eslint-plugin.node.test.mjs +193 -0
  950. package/scripts/lib/html-attributes.mjs +191 -0
  951. package/scripts/lib/mcp-config.mjs +126 -0
  952. package/scripts/lib/migrate-fix.mjs +115 -0
  953. package/scripts/lib/validate-bb-markup.mjs +488 -0
  954. package/dist/ai/BaseButton.md +0 -449
  955. package/dist/ai/BaseCheckbox.md +0 -512
  956. package/dist/ai/BaseCheckboxGroup.md +0 -597
  957. package/dist/ai/BaseColorInput.md +0 -461
  958. package/dist/ai/BaseDatePicker.md +0 -739
  959. package/dist/ai/BaseDatePickerInput.md +0 -1517
  960. package/dist/ai/BaseDialog.md +0 -610
  961. package/dist/ai/BaseInputContainer.md +0 -570
  962. package/dist/ai/BaseNumberInput.md +0 -509
  963. package/dist/ai/BaseRadio.md +0 -405
  964. package/dist/ai/BaseRadioGroup.md +0 -535
  965. package/dist/ai/BaseRating.md +0 -489
  966. package/dist/ai/BaseSelect.md +0 -1742
  967. package/dist/ai/BaseSlider.md +0 -871
  968. package/dist/ai/BaseSwitch.md +0 -322
  969. package/dist/ai/BaseSwitchGroup.md +0 -298
  970. package/dist/ai/BaseTag.md +0 -623
  971. package/dist/ai/BaseTextInput.md +0 -392
  972. package/dist/ai/BaseTextarea.md +0 -398
  973. package/dist/ai/BbChip.md +0 -147
  974. package/dist/ai/BbIntersection.md +0 -120
  975. package/dist/ai/BbRatio.md +0 -61
  976. package/dist/ai/BbRows.md +0 -307
  977. package/dist/ai/BbTab.md +0 -950
  978. package/dist/ai/CommonInputInnerContainer.md +0 -414
  979. package/dist/ai/CommonInputOuterContainer.md +0 -55
  980. package/dist/components/BaseButton/BaseButton.vue.d.ts +0 -14
  981. package/dist/components/BaseButton/types.d.ts +0 -159
  982. package/dist/components/BaseCheckbox/BaseCheckbox.vue.d.ts +0 -39
  983. package/dist/components/BaseCheckbox/types.d.ts +0 -213
  984. package/dist/components/BaseCheckboxGroup/BaseCheckboxGroup.vue.d.ts +0 -30
  985. package/dist/components/BaseCheckboxGroup/types.d.ts +0 -282
  986. package/dist/components/BaseColorInput/BaseColorInput.vue.d.ts +0 -35
  987. package/dist/components/BaseColorInput/ColorPalette.vue.d.ts +0 -13
  988. package/dist/components/BaseColorInput/types.d.ts +0 -233
  989. package/dist/components/BaseDatePicker/BaseDatePickerHeader.vue.d.ts +0 -15
  990. package/dist/components/BaseDatePicker/BaseDatePickerInputDaySelector.vue.d.ts +0 -58
  991. package/dist/components/BaseDatePicker/BaseDatePickerMonthSelector.vue.d.ts +0 -12
  992. package/dist/components/BaseDatePicker/BaseDatePickerYearSelector.vue.d.ts +0 -12
  993. package/dist/components/BaseDatePicker/types.d.ts +0 -100
  994. package/dist/components/BaseDatePickerInput/BaseDatePickerInput.vue.d.ts +0 -26
  995. package/dist/components/BaseDatePickerInput/types.d.ts +0 -206
  996. package/dist/components/BaseDialog/BaseDialog.vue.d.ts +0 -37
  997. package/dist/components/BaseDialog/types.d.ts +0 -180
  998. package/dist/components/BaseInputContainer/BaseInputContainer.vue.d.ts +0 -18
  999. package/dist/components/BaseInputContainer/types.d.ts +0 -126
  1000. package/dist/components/BaseNumberInput/BaseNumberInput.vue.d.ts +0 -46
  1001. package/dist/components/BaseNumberInput/types.d.ts +0 -191
  1002. package/dist/components/BaseRadio/BaseRadio.vue.d.ts +0 -31
  1003. package/dist/components/BaseRadio/types.d.ts +0 -173
  1004. package/dist/components/BaseRadioGroup/BaseRadioGroup.vue.d.ts +0 -30
  1005. package/dist/components/BaseRadioGroup/types.d.ts +0 -240
  1006. package/dist/components/BaseRating/BaseRating.vue.d.ts +0 -35
  1007. package/dist/components/BaseRating/types.d.ts +0 -144
  1008. package/dist/components/BaseSelect/BaseSelect.vue.d.ts +0 -28
  1009. package/dist/components/BaseSelect/types.d.ts +0 -470
  1010. package/dist/components/BaseSlider/BaseSlider.vue.d.ts +0 -38
  1011. package/dist/components/BaseSlider/types.d.ts +0 -201
  1012. package/dist/components/BaseSwitch/BaseSwitch.vue.d.ts +0 -34
  1013. package/dist/components/BaseSwitch/types.d.ts +0 -25
  1014. package/dist/components/BaseSwitchGroup/BaseSwitchGroup.vue.d.ts +0 -30
  1015. package/dist/components/BaseSwitchGroup/types.d.ts +0 -8
  1016. package/dist/components/BaseTag/BaseTag.vue.d.ts +0 -37
  1017. package/dist/components/BaseTag/types.d.ts +0 -136
  1018. package/dist/components/BaseTextInput/BaseTextInput.vue.d.ts +0 -33
  1019. package/dist/components/BaseTextInput/types.d.ts +0 -166
  1020. package/dist/components/BaseTextarea/BaseTextarea.vue.d.ts +0 -31
  1021. package/dist/components/BaseTextarea/types.d.ts +0 -151
  1022. package/dist/components/BbChip/BbChip.vue.d.ts +0 -17
  1023. package/dist/components/BbChip/types.d.ts +0 -23
  1024. package/dist/components/BbIntersection/BbIntersection.vue.d.ts +0 -23
  1025. package/dist/components/BbIntersection/types.d.ts +0 -36
  1026. package/dist/components/BbRatio/BbRatio.vue.d.ts +0 -14
  1027. package/dist/components/BbRatio/types.d.ts +0 -15
  1028. package/dist/components/BbRows/BbRows.vue.d.ts +0 -62
  1029. package/dist/components/BbRows/types.d.ts +0 -21
  1030. package/dist/components/BbTab/BbTab.vue.d.ts +0 -27
  1031. package/dist/components/BbTab/types.d.ts +0 -186
  1032. package/dist/components/CommonInputInnerContainer/CommonInputInnerContainer.vue.d.ts +0 -15
  1033. package/dist/components/CommonInputInnerContainer/types.d.ts +0 -47
  1034. package/dist/components/CommonInputOuterContainer/CommonInputOuterContainer.vue.d.ts +0 -11
  1035. package/dist/components/CommonInputOuterContainer/types.d.ts +0 -16
  1036. package/dist/composables/useModalsState.d.ts +0 -5
  1037. package/dist/composables/useQueue.d.ts +0 -58
  1038. package/dist/composables/useWizard.d.ts +0 -85
  1039. package/dist/i18n/en.d.ts +0 -67
  1040. package/dist/i18n/it.d.ts +0 -67
  1041. package/dist/index.css +0 -2
  1042. package/dist/index100.js +0 -6
  1043. package/dist/index101.js +0 -300
  1044. package/dist/index102.js +0 -16
  1045. package/dist/index103.js +0 -16
  1046. package/dist/index104.js +0 -27
  1047. package/dist/index109.js +0 -19
  1048. package/dist/index11.js +0 -42
  1049. package/dist/index110.js +0 -12
  1050. package/dist/index111.js +0 -19
  1051. package/dist/index112.js +0 -25
  1052. package/dist/index114.js +0 -7
  1053. package/dist/index115.js +0 -241
  1054. package/dist/index116.js +0 -5
  1055. package/dist/index117.js +0 -42
  1056. package/dist/index118.js +0 -5
  1057. package/dist/index119.js +0 -53
  1058. package/dist/index120.js +0 -5
  1059. package/dist/index121.js +0 -32
  1060. package/dist/index122.js +0 -5
  1061. package/dist/index124.js +0 -52
  1062. package/dist/index125.js +0 -5
  1063. package/dist/index126.js +0 -223
  1064. package/dist/index128.js +0 -6
  1065. package/dist/index129.js +0 -162
  1066. package/dist/index13.js +0 -92
  1067. package/dist/index130.js +0 -25
  1068. package/dist/index131.js +0 -51
  1069. package/dist/index132.js +0 -5
  1070. package/dist/index133.js +0 -607
  1071. package/dist/index135.js +0 -6
  1072. package/dist/index136.js +0 -14
  1073. package/dist/index137.js +0 -153
  1074. package/dist/index139.js +0 -6
  1075. package/dist/index14.js +0 -306
  1076. package/dist/index140.js +0 -224
  1077. package/dist/index141.js +0 -5
  1078. package/dist/index143.js +0 -128
  1079. package/dist/index145.js +0 -6
  1080. package/dist/index146.js +0 -8
  1081. package/dist/index147.js +0 -182
  1082. package/dist/index149.js +0 -6
  1083. package/dist/index15.js +0 -10
  1084. package/dist/index151.js +0 -4
  1085. package/dist/index152.js +0 -95
  1086. package/dist/index154.js +0 -6
  1087. package/dist/index155.js +0 -168
  1088. package/dist/index157.js +0 -6
  1089. package/dist/index158.js +0 -145
  1090. package/dist/index16.js +0 -59
  1091. package/dist/index160.js +0 -6
  1092. package/dist/index161.js +0 -53
  1093. package/dist/index163.js +0 -6
  1094. package/dist/index164.js +0 -16
  1095. package/dist/index166.js +0 -35
  1096. package/dist/index168.js +0 -6
  1097. package/dist/index169.js +0 -89
  1098. package/dist/index171.js +0 -6
  1099. package/dist/index172.js +0 -82
  1100. package/dist/index174.js +0 -6
  1101. package/dist/index175.js +0 -38
  1102. package/dist/index176.js +0 -461
  1103. package/dist/index177.js +0 -28
  1104. package/dist/index178.js +0 -66
  1105. package/dist/index18.js +0 -35
  1106. package/dist/index180.js +0 -162
  1107. package/dist/index181.js +0 -5
  1108. package/dist/index182.js +0 -217
  1109. package/dist/index183.js +0 -5
  1110. package/dist/index184.js +0 -112
  1111. package/dist/index185.js +0 -5
  1112. package/dist/index186.js +0 -459
  1113. package/dist/index188.js +0 -6
  1114. package/dist/index19.js +0 -4
  1115. package/dist/index192.js +0 -268
  1116. package/dist/index194.js +0 -6
  1117. package/dist/index195.js +0 -124
  1118. package/dist/index197.js +0 -6
  1119. package/dist/index198.js +0 -174
  1120. package/dist/index2.js +0 -20
  1121. package/dist/index20.js +0 -9
  1122. package/dist/index200.js +0 -6
  1123. package/dist/index201.js +0 -224
  1124. package/dist/index203.js +0 -6
  1125. package/dist/index204.js +0 -135
  1126. package/dist/index206.js +0 -6
  1127. package/dist/index207.js +0 -5
  1128. package/dist/index208.js +0 -170
  1129. package/dist/index21.js +0 -35
  1130. package/dist/index210.js +0 -6
  1131. package/dist/index211.js +0 -37
  1132. package/dist/index213.js +0 -6
  1133. package/dist/index214.js +0 -63
  1134. package/dist/index216.js +0 -6
  1135. package/dist/index217.js +0 -74
  1136. package/dist/index219.js +0 -6
  1137. package/dist/index22.js +0 -6
  1138. package/dist/index220.js +0 -65
  1139. package/dist/index222.js +0 -6
  1140. package/dist/index223.js +0 -67
  1141. package/dist/index225.js +0 -6
  1142. package/dist/index226.js +0 -41
  1143. package/dist/index228.js +0 -6
  1144. package/dist/index229.js +0 -10
  1145. package/dist/index23.js +0 -7
  1146. package/dist/index230.js +0 -22
  1147. package/dist/index232.js +0 -8
  1148. package/dist/index233.js +0 -297
  1149. package/dist/index235.js +0 -6
  1150. package/dist/index236.js +0 -47
  1151. package/dist/index237.js +0 -165
  1152. package/dist/index239.js +0 -6
  1153. package/dist/index24.js +0 -9
  1154. package/dist/index241.js +0 -159
  1155. package/dist/index243.js +0 -6
  1156. package/dist/index244.js +0 -134
  1157. package/dist/index246.js +0 -6
  1158. package/dist/index247.js +0 -167
  1159. package/dist/index249.js +0 -6
  1160. package/dist/index25.js +0 -24
  1161. package/dist/index250.js +0 -147
  1162. package/dist/index252.js +0 -6
  1163. package/dist/index253.js +0 -35
  1164. package/dist/index255.js +0 -6
  1165. package/dist/index256.js +0 -65
  1166. package/dist/index258.js +0 -6
  1167. package/dist/index259.js +0 -19
  1168. package/dist/index260.js +0 -5
  1169. package/dist/index261.js +0 -160
  1170. package/dist/index263.js +0 -6
  1171. package/dist/index264.js +0 -60
  1172. package/dist/index266.js +0 -6
  1173. package/dist/index267.js +0 -134
  1174. package/dist/index269.js +0 -6
  1175. package/dist/index27.js +0 -4
  1176. package/dist/index271.js +0 -206
  1177. package/dist/index273.js +0 -6
  1178. package/dist/index274.js +0 -85
  1179. package/dist/index275.js +0 -5
  1180. package/dist/index276.js +0 -55
  1181. package/dist/index277.js +0 -5
  1182. package/dist/index278.js +0 -164
  1183. package/dist/index28.js +0 -8
  1184. package/dist/index280.js +0 -6
  1185. package/dist/index281.js +0 -145
  1186. package/dist/index283.js +0 -6
  1187. package/dist/index284.js +0 -11
  1188. package/dist/index285.js +0 -200
  1189. package/dist/index287.js +0 -6
  1190. package/dist/index288.js +0 -241
  1191. package/dist/index29.js +0 -7
  1192. package/dist/index290.js +0 -6
  1193. package/dist/index291.js +0 -21
  1194. package/dist/index293.js +0 -6
  1195. package/dist/index294.js +0 -125
  1196. package/dist/index296.js +0 -6
  1197. package/dist/index297.js +0 -161
  1198. package/dist/index299.js +0 -6
  1199. package/dist/index30.js +0 -118
  1200. package/dist/index300.js +0 -127
  1201. package/dist/index302.js +0 -6
  1202. package/dist/index303.js +0 -20
  1203. package/dist/index305.js +0 -6
  1204. package/dist/index306.js +0 -116
  1205. package/dist/index307.js +0 -5
  1206. package/dist/index308.js +0 -507
  1207. package/dist/index31.js +0 -10
  1208. package/dist/index310.js +0 -6
  1209. package/dist/index311.js +0 -196
  1210. package/dist/index313.js +0 -6
  1211. package/dist/index314.js +0 -142
  1212. package/dist/index316.js +0 -6
  1213. package/dist/index317.js +0 -134
  1214. package/dist/index319.js +0 -6
  1215. package/dist/index32.js +0 -28
  1216. package/dist/index320.js +0 -162
  1217. package/dist/index322.js +0 -6
  1218. package/dist/index323.js +0 -319
  1219. package/dist/index325.js +0 -6
  1220. package/dist/index326.js +0 -40
  1221. package/dist/index327.js +0 -43
  1222. package/dist/index328.js +0 -665
  1223. package/dist/index33.js +0 -5
  1224. package/dist/index330.js +0 -6
  1225. package/dist/index331.js +0 -155
  1226. package/dist/index333.js +0 -6
  1227. package/dist/index334.js +0 -142
  1228. package/dist/index336.js +0 -6
  1229. package/dist/index337.js +0 -155
  1230. package/dist/index339.js +0 -6
  1231. package/dist/index34.js +0 -112
  1232. package/dist/index340.js +0 -58
  1233. package/dist/index341.js +0 -5
  1234. package/dist/index342.js +0 -20
  1235. package/dist/index344.js +0 -6
  1236. package/dist/index345.js +0 -142
  1237. package/dist/index347.js +0 -6
  1238. package/dist/index349.js +0 -109
  1239. package/dist/index351.js +0 -6
  1240. package/dist/index352.js +0 -55
  1241. package/dist/index353.js +0 -24
  1242. package/dist/index354.js +0 -23
  1243. package/dist/index355.js +0 -839
  1244. package/dist/index356.js +0 -474
  1245. package/dist/index357.js +0 -52
  1246. package/dist/index358.js +0 -7
  1247. package/dist/index36.js +0 -6
  1248. package/dist/index38.js +0 -63
  1249. package/dist/index39.js +0 -63
  1250. package/dist/index40.js +0 -9
  1251. package/dist/index42.js +0 -8
  1252. package/dist/index43.js +0 -179
  1253. package/dist/index44.js +0 -21
  1254. package/dist/index46.js +0 -385
  1255. package/dist/index48.js +0 -6
  1256. package/dist/index49.js +0 -33
  1257. package/dist/index5.js +0 -34
  1258. package/dist/index50.js +0 -12
  1259. package/dist/index51.js +0 -8
  1260. package/dist/index52.js +0 -106
  1261. package/dist/index53.js +0 -330
  1262. package/dist/index54.js +0 -97
  1263. package/dist/index55.js +0 -328
  1264. package/dist/index56.js +0 -28
  1265. package/dist/index57.js +0 -102
  1266. package/dist/index58.js +0 -157
  1267. package/dist/index6.js +0 -38
  1268. package/dist/index60.js +0 -6
  1269. package/dist/index61.js +0 -131
  1270. package/dist/index62.js +0 -5
  1271. package/dist/index65.js +0 -35
  1272. package/dist/index66.js +0 -26
  1273. package/dist/index68.js +0 -6
  1274. package/dist/index69.js +0 -54
  1275. package/dist/index7.js +0 -58
  1276. package/dist/index71.js +0 -6
  1277. package/dist/index72.js +0 -14
  1278. package/dist/index74.js +0 -6
  1279. package/dist/index75.js +0 -159
  1280. package/dist/index77.js +0 -6
  1281. package/dist/index78.js +0 -4
  1282. package/dist/index79.js +0 -4
  1283. package/dist/index80.js +0 -54
  1284. package/dist/index81.js +0 -5
  1285. package/dist/index82.js +0 -5
  1286. package/dist/index83.js +0 -141
  1287. package/dist/index85.js +0 -6
  1288. package/dist/index86.js +0 -65
  1289. package/dist/index88.js +0 -6
  1290. package/dist/index89.js +0 -30
  1291. package/dist/index9.js +0 -11
  1292. package/dist/index90.js +0 -19
  1293. package/dist/index91.js +0 -17
  1294. package/dist/index92.js +0 -9
  1295. package/dist/index93.js +0 -34
  1296. package/dist/index95.js +0 -16
  1297. package/dist/index96.js +0 -10
  1298. package/dist/index97.js +0 -18
  1299. package/dist/index98.js +0 -189
  1300. package/dist/types/VoidHtmlElements.d.ts +0 -1
  1301. package/dist/utilities/functions/add.d.ts +0 -1
  1302. package/dist/utilities/functions/booleanishToBoolean.d.ts +0 -6
  1303. package/dist/utilities/functions/capitalize.d.ts +0 -4
  1304. package/dist/utilities/functions/cloneDeep.d.ts +0 -1
  1305. package/dist/utilities/functions/debounce.d.ts +0 -1
  1306. package/dist/utilities/functions/drop.d.ts +0 -1
  1307. package/dist/utilities/functions/exceedsPrecision.d.ts +0 -1
  1308. package/dist/utilities/functions/findRight.d.ts +0 -4
  1309. package/dist/utilities/functions/findRightIndex.d.ts +0 -4
  1310. package/dist/utilities/functions/flow.d.ts +0 -1
  1311. package/dist/utilities/functions/getHueFromRGB.d.ts +0 -9
  1312. package/dist/utilities/functions/groupBy.d.ts +0 -6
  1313. package/dist/utilities/functions/gt.d.ts +0 -7
  1314. package/dist/utilities/functions/hexToRGB.d.ts +0 -7
  1315. package/dist/utilities/functions/hslToHex.d.ts +0 -1
  1316. package/dist/utilities/functions/includes.d.ts +0 -1
  1317. package/dist/utilities/functions/initial.d.ts +0 -1
  1318. package/dist/utilities/functions/isCssColor.d.ts +0 -5
  1319. package/dist/utilities/functions/lt.d.ts +0 -7
  1320. package/dist/utilities/functions/makeUrl.d.ts +0 -1
  1321. package/dist/utilities/functions/mapKeys.d.ts +0 -5
  1322. package/dist/utilities/functions/mapValues.d.ts +0 -1
  1323. package/dist/utilities/functions/matchesPropertyInsensitive.d.ts +0 -1
  1324. package/dist/utilities/functions/max.d.ts +0 -2
  1325. package/dist/utilities/functions/mean.d.ts +0 -4
  1326. package/dist/utilities/functions/merge.d.ts +0 -11
  1327. package/dist/utilities/functions/millisecondsTo.d.ts +0 -1
  1328. package/dist/utilities/functions/negate.d.ts +0 -4
  1329. package/dist/utilities/functions/normalizeItemGroups.d.ts +0 -13
  1330. package/dist/utilities/functions/omit.d.ts +0 -2
  1331. package/dist/utilities/functions/overEvery.d.ts +0 -4
  1332. package/dist/utilities/functions/pick.d.ts +0 -1
  1333. package/dist/utilities/functions/replace.d.ts +0 -1
  1334. package/dist/utilities/functions/replaceInTree.d.ts +0 -4
  1335. package/dist/utilities/functions/retry.d.ts +0 -5
  1336. package/dist/utilities/functions/roundToTheNearest.d.ts +0 -8
  1337. package/dist/utilities/functions/set.d.ts +0 -15
  1338. package/dist/utilities/functions/stub.d.ts +0 -6
  1339. package/dist/utilities/functions/transposePercent.d.ts +0 -9
  1340. package/dist/utilities/functions/tryTo.d.ts +0 -2
  1341. package/dist/utilities/functions/uniqBy.d.ts +0 -1
  1342. /package/dist/{index64.js → _virtual/_plugin-vue_export-helper.js} +0 -0
  1343. /package/dist/components/{BaseButton → BbBaseButton}/RouterComponent.vue.d.ts +0 -0
  1344. /package/dist/components/{BaseDatePicker/BaseDatePicker.vue.d.ts → BbBaseDatePicker/BbBaseDatePicker.vue.d.ts} +0 -0
  1345. /package/dist/{index165.js → composables/useArray.js} +0 -0
  1346. /package/dist/{index17.js → composables/useFrameworkDetection.js} +0 -0
  1347. /package/dist/{index12.js → composables/useId.js} +0 -0
  1348. /package/dist/{index107.js → utilities/functions/chunk.js} +0 -0
  1349. /package/dist/{index8.js → utilities/functions/clamp.js} +0 -0
  1350. /package/dist/{index150.js → utilities/functions/curry.js} +0 -0
  1351. /package/dist/{index45.js → utilities/functions/extractDomContainer.js} +0 -0
  1352. /package/dist/{index270.js → utilities/functions/findInTree.js} +0 -0
  1353. /package/dist/{index348.js → utilities/functions/flattenTree.js} +0 -0
  1354. /package/dist/{index41.js → utilities/functions/get.js} +0 -0
  1355. /package/dist/{index189.js → utilities/functions/head.js} +0 -0
  1356. /package/dist/{index108.js → utilities/functions/identity.js} +0 -0
  1357. /package/dist/{index179.js → utilities/functions/indexBy.js} +0 -0
  1358. /package/dist/{index37.js → utilities/functions/isHex.js} +0 -0
  1359. /package/dist/{index94.js → utilities/functions/isNil.js} +0 -0
  1360. /package/dist/{index26.js → utilities/functions/isNotNil.js} +0 -0
  1361. /package/dist/{index105.js → utilities/functions/last.js} +0 -0
  1362. /package/dist/{index142.js → utilities/functions/noop.js} +0 -0
  1363. /package/dist/{index231.js → utilities/functions/parseWidthString.js} +0 -0
  1364. /package/dist/{index240.js → utilities/functions/pickBy.js} +0 -0
  1365. /package/dist/{index123.js → utilities/functions/range.js} +0 -0
  1366. /package/dist/{index190.js → utilities/functions/snapToStep.js} +0 -0
  1367. /package/dist/{index191.js → utilities/functions/transpose.js} +0 -0
  1368. /package/dist/{index106.js → utilities/functions/validateDateFormat.js} +0 -0
  1369. /package/dist/{index10.js → utilities/functions/wait.js} +0 -0
@@ -0,0 +1,1724 @@
1
+ ---
2
+ title: Workspace Onboarding (Nuxt)
3
+ summary: Full-anatomy workspace onboarding for Nuxt — a live BbProgress header, an accordion checklist whose steps do the real work inline (integration switches, tag-input invites, a mini project form, CSV import with real byte progress), data loaded with useAsyncData and mutations resolved through $fetch + refresh(), all through one coopting page context.
4
+ ---
5
+
6
+ # Recipe: Workspace Onboarding (Nuxt)
7
+
8
+ The onboarding checklist adapted for **Nuxt**: the same live progress header,
9
+ single-open accordion whose steps carry the real actions inline, and "see
10
+ what you'll get" preview peeks — but the checklist state loads through
11
+ `useAsyncData` and every mutation is a `$fetch` call followed by `refresh()`,
12
+ so the server stays the single source of truth for step statuses. Anatomy,
13
+ components, the context shape, copy and data are identical to the Vue
14
+ recipe; only the data/mutation layer changes.
15
+
16
+ Sibling recipes: [Vue](../vue/onboarding.md) ·
17
+ [Inertia](../inertia/onboarding.md).
18
+
19
+ ## Prerequisites
20
+
21
+ - **[Layout Scaffold](./layout-scaffold.md) — build it first.** This recipe
22
+ imports `PageShell` and `usePageShellContext` from your own app.
23
+ They are not package exports; the scaffold recipe is their source. Copy
24
+ those files before anything below, and do not hand-roll replacements —
25
+ the peek stack, the close semantics and the sidebar's out-of-flow
26
+ behaviour are all load-bearing here.
27
+ - `<BbConfirm />` and `<BbToast />` mounted once in `app.vue` — never in a page.
28
+ - [App Layout](../../guides/app-layout.md) and
29
+ [Page Shell](../../guides/page-shell.md) copied into `src/components/layout/`
30
+ per their guides — this page assumes the chrome exists and renders inside
31
+ it.
32
+ - Server routes: `GET /api/onboarding` (returns `{ steps, connectedIntegrations,
33
+ workspace, invites, firstProject, importedCustomers, reminders }`), plus the
34
+ mutation routes referenced below (`PATCH /api/onboarding/steps/:id`,
35
+ `POST /api/onboarding/integrations/:id/connect`,
36
+ `POST /api/onboarding/invites`, `POST /api/onboarding/project`,
37
+ `POST /api/onboarding/customers/import`, `PATCH /api/onboarding/reminders`,
38
+ `POST /api/onboarding/dismiss`).
39
+
40
+ ## Key ideas
41
+
42
+ - **One coopting page context.** `provideOnboardingWorkspace()` joins the
43
+ page-shell stack once, owns the step statuses, the integration and invite
44
+ state, and every action. Every leaf calls `useOnboardingWorkspace()` and
45
+ nothing else — zero prop drilling anywhere on the page.
46
+ - **`useAsyncData` loads the checklist once; every mutation ends in
47
+ `refresh()`.** There is exactly one status writer path: `$fetch` the
48
+ mutation, then `refresh()` re-pulls `/api/onboarding` and a single watcher
49
+ re-seeds every local field (`steps`, `integrations`, `invites`,
50
+ `firstProject`, `reminders`) from the fresh response — no mutation patches
51
+ local state by hand except the optimistic switches.
52
+ - **Steps act inline; the checklist ticks itself.** Each step body _is_ the
53
+ feature: switches connect integrations, a tag input sends invites, a mini
54
+ form creates the project, a dropzone imports the CSV. Completing the real
55
+ action persists the step status through one private `persistStatus` —
56
+ the same verb the manual "Mark as done" / "Skip for now" ghosts use.
57
+ - **Single-open accordion, modeled — not wrapped.** `BbAccordion` is one
58
+ panel per boolean; there is no group component by design. One
59
+ `activeStep` key in the context derives every panel's `model-value`, and
60
+ finishing a step advances the key to the next unfinished one.
61
+ - **CSV upload progress needs raw `XMLHttpRequest`.** `ofetch` (Nuxt's
62
+ `$fetch`) has no upload-progress hook, so the one import mutation wraps
63
+ `XMLHttpRequest` directly to drive real bytes into `BbProgress`; every
64
+ other mutation on the page uses `$fetch`.
65
+ - **Previews ride the shell stack.** "See what you'll get" pushes a
66
+ `step-preview` peek (replace semantics — previews never stack); the peek
67
+ is a workbench: identity header, benefit list, a stat, and a "Set it up
68
+ now" action that jumps back to the step.
69
+ - **Checklist archetype, so rows 4/5/7/8 of the standard anatomy don't
70
+ apply**: no filter rail, no tabs, no pagination, no selection/bulk bar —
71
+ and no page search, since the page has no filterable collection. Page
72
+ Shell, breadcrumbs topbar and the stacked peek sidebar stay.
73
+ - **Buttons are `md` by default**; one `variant="primary"` on the page
74
+ ("Go to dashboard" in the topbar); step submits are `secondary`,
75
+ done/skip/preview are `ghost`; "Dismiss onboarding" rides `useConfirm`.
76
+
77
+ ## Page anatomy
78
+
79
+ ```
80
+ OnboardingChecklist/
81
+ Index.vue ← assembly: PageShell slots, accordion loop, thin
82
+ context.ts ← coopting page context (shell + useAsyncData + actions)
83
+ ProgressHeader.vue ← title, dismiss, BbProgress + "4 of 7 complete"
84
+ StepHeader.vue ← status icon, title, minutes, chevron (in the header button)
85
+ StepActions.vue ← per-step done / skip / preview footer row
86
+ ProfileStep.vue ← step 1 body: completed-at-signup summary + edit link
87
+ IntegrationsStep.vue ← step 2 body: BbSwitch rows (Stripe, QuickBooks, Slack, Drive)
88
+ InviteStep.vue ← step 3 body: BbTag emails + role BbSelect + send
89
+ FirstProjectStep.vue ← step 4 body: mini create-project form
90
+ ImportCustomersStep.vue ← step 5 body: BbDropzone CSV + BbProgress upload
91
+ FirstInvoiceStep.vue ← step 6 body: link-out to the invoice composer
92
+ RemindersStep.vue ← step 7 body: reminders switch + cadence select
93
+ StepPreviewPeek.vue ← sidebar "what you'll get" workbench per step
94
+ ```
95
+
96
+ Chrome assumed from the guides: [App Layout](../../guides/app-layout.md)
97
+ (left nav + fat footer) and [Page Shell](../../guides/page-shell.md). The
98
+ dismiss confirmation renders through the app-wide `useConfirm` host, so this
99
+ page needs no `#dialogs` content of its own.
100
+
101
+ ## Action inventory
102
+
103
+ | # | Action | Trigger | Mechanism |
104
+ | --- | -------------------------------- | ----------------------------------- | ------------------------------------------------------------------ |
105
+ | 1 | Go to dashboard | topbar, the page's one `primary` | navigation (`/dashboard`) |
106
+ | 2 | Dismiss onboarding | progress header, ghost | `useConfirm` (destructive) → `$fetch` + `navigateTo` + toast |
107
+ | 3 | Expand / collapse a step | accordion header (single-open) | `activeStep` key derives each panel's `model-value` |
108
+ | 4 | See what you'll get | every step footer | `previewStep(id)` → shell peek (replace) |
109
+ | 5 | Mark step done / skip step | step footer ghosts | `completeStep` / `skipStep` → `$fetch` + `refresh()` |
110
+ | 6 | Connect / disconnect integration | switch rows in _Connect your tools_ | optimistic toggle, `readonly` in flight, revert + toast on failure |
111
+ | 7 | Compose the invite list | `BbTag` (Enter/comma, max 10) | local ref; `duplicate`/`max` surfaced via `errors` |
112
+ | 8 | Choose the invite role | `BbSelect` beside the tags | local ref |
113
+ | 9 | Send invitations | secondary button in step body | `sendInvites` → `$fetch` + auto-complete + toast |
114
+ | 10 | Create the first project | mini form submit | `createProject` → `$fetch` + auto-complete + toast |
115
+ | 11 | Import customers CSV | `BbDropzone` + Import button | `importCustomers`; `BbProgress` driven by real XHR upload bytes |
116
+ | 12 | Open the invoice composer | outline button in step 6 | navigation (`/invoices/create`) |
117
+ | 13 | Turn reminders on / pick cadence | switch + select in step 7 | `setReminders` / `setReminderCadence` + toast |
118
+ | 14 | Jump to a step from its preview | peek footer | `jumpToStep(id)` → open step + close peek |
119
+ | 15 | Edit the workspace profile | link in the completed profile step | navigation (`/settings/general`) |
120
+ | 16 | Close the peek | shell chrome | shell stack close |
121
+
122
+ ## The code
123
+
124
+ ### context.ts
125
+
126
+ ```ts
127
+ // OnboardingChecklist/context.ts
128
+ import {
129
+ computed,
130
+ inject,
131
+ provide,
132
+ reactive,
133
+ ref,
134
+ watch,
135
+ type ComputedRef,
136
+ type InjectionKey,
137
+ type Ref,
138
+ } from 'vue';
139
+ import { useConfirm, useToast } from 'bitboss-ui';
140
+ import {
141
+ usePageShellContext,
142
+ type PageShellContext,
143
+ } from '@/components/layout/usePageShellContext';
144
+ import type {
145
+ InviteRole,
146
+ PendingInvite,
147
+ Project,
148
+ ProjectDraft,
149
+ ReminderCadence,
150
+ WorkspaceProfile,
151
+ } from '@/types';
152
+
153
+ export type StepId =
154
+ | 'profile'
155
+ | 'integrations'
156
+ | 'invites'
157
+ | 'first-project'
158
+ | 'import-customers'
159
+ | 'first-invoice'
160
+ | 'reminders';
161
+
162
+ export type StepStatus = 'todo' | 'complete' | 'skipped';
163
+
164
+ export interface OnboardingStep {
165
+ id: StepId;
166
+ title: string;
167
+ description: string;
168
+ /** Rough time estimate shown in the header while the step is open. */
169
+ minutes: number;
170
+ status: StepStatus;
171
+ }
172
+
173
+ export interface WorkspaceIntegration {
174
+ id: string;
175
+ name: string;
176
+ description: string;
177
+ /** Full static literal — the production icon scanner only bundles names it can see. */
178
+ icon: string;
179
+ connected: boolean;
180
+ /** True while a connect/disconnect request is in flight (drives `readonly`). */
181
+ busy: boolean;
182
+ }
183
+
184
+ /** What the stacked sidebar can show: the per-step "what you'll get" preview. */
185
+ export type PeekItem = { type: 'step-preview'; stepId: StepId };
186
+
187
+ /** The whole `/api/onboarding` response — the single source of truth. */
188
+ type OnboardingState = {
189
+ steps: Record<StepId, StepStatus>;
190
+ connectedIntegrations: string[];
191
+ workspace: WorkspaceProfile;
192
+ invites: PendingInvite[];
193
+ firstProject: Project | null;
194
+ importedCustomers: number | null;
195
+ reminders: { enabled: boolean; cadence: ReminderCadence };
196
+ };
197
+
198
+ export interface OnboardingWorkspaceContext {
199
+ // -- Coopted contexts ------------------------------------------------------
200
+ shell: PageShellContext<PeekItem>;
201
+ // -- Page-owned state ------------------------------------------------------
202
+ steps: OnboardingStep[];
203
+ /** The one open panel; `null` collapses everything (single-open accordion). */
204
+ activeStep: Ref<StepId | null>;
205
+ /** Steps no longer todo (complete or skipped) — drives the progress bar. */
206
+ doneCount: ComputedRef<number>;
207
+ allDone: ComputedRef<boolean>;
208
+ workspace: Ref<WorkspaceProfile | null>;
209
+ integrations: WorkspaceIntegration[];
210
+ invites: Ref<PendingInvite[]>;
211
+ firstProject: Ref<Project | null>;
212
+ importState: {
213
+ uploading: boolean;
214
+ sentBytes: number;
215
+ totalBytes: number;
216
+ importedCount: number | null;
217
+ };
218
+ reminders: { enabled: boolean; cadence: ReminderCadence };
219
+ // -- Step grammar ----------------------------------------------------------
220
+ openStep: (id: StepId | null) => void;
221
+ previewStep: (id: StepId) => void;
222
+ jumpToStep: (id: StepId) => void;
223
+ // -- Actions (complete: $fetch + refresh + toast) ----------------------------
224
+ completeStep: (id: StepId) => Promise<void>;
225
+ skipStep: (id: StepId) => Promise<void>;
226
+ toggleIntegration: (
227
+ integration: WorkspaceIntegration,
228
+ next: boolean
229
+ ) => Promise<void>;
230
+ sendInvites: (emails: string[], role: InviteRole) => Promise<void>;
231
+ createProject: (draft: ProjectDraft) => Promise<void>;
232
+ importCustomers: (file: File) => Promise<void>;
233
+ setReminders: (enabled: boolean) => Promise<void>;
234
+ setReminderCadence: (cadence: ReminderCadence) => Promise<void>;
235
+ dismissOnboarding: () => Promise<void>;
236
+ }
237
+
238
+ const key: InjectionKey<OnboardingWorkspaceContext> = Symbol(
239
+ 'onboarding-workspace'
240
+ );
241
+
242
+ // ofetch has no upload-progress hook, so the one import mutation drives real
243
+ // bytes through a plain XMLHttpRequest instead — every other mutation below
244
+ // uses $fetch.
245
+ const uploadWithProgress = (
246
+ url: string,
247
+ body: FormData,
248
+ onProgress: (sentBytes: number, totalBytes: number) => void
249
+ ): Promise<{ imported: number }> =>
250
+ new Promise((resolve, reject) => {
251
+ const xhr = new XMLHttpRequest();
252
+ xhr.open('POST', url);
253
+ xhr.upload.addEventListener('progress', (event) => {
254
+ if (event.lengthComputable) onProgress(event.loaded, event.total);
255
+ });
256
+ xhr.addEventListener('load', () => {
257
+ if (xhr.status >= 200 && xhr.status < 300) {
258
+ resolve(JSON.parse(xhr.responseText));
259
+ } else {
260
+ reject(new Error(`Import failed (${xhr.status}).`));
261
+ }
262
+ });
263
+ xhr.addEventListener('error', () => reject(new Error('Import failed.')));
264
+ xhr.send(body);
265
+ });
266
+
267
+ export function provideOnboardingWorkspace(): OnboardingWorkspaceContext {
268
+ const { toast } = useToast();
269
+ const { confirm } = useConfirm();
270
+
271
+ // -- Coopt the specific contexts: once, here, for the whole page. ----------
272
+ const shell = usePageShellContext<PeekItem>();
273
+
274
+ // -- The checklist definition lives client-side; the server owns statuses. -
275
+ const steps = reactive<OnboardingStep[]>([
276
+ {
277
+ id: 'profile',
278
+ title: 'Set up your company profile',
279
+ description: 'Legal name, billing address and tax details.',
280
+ minutes: 2,
281
+ status: 'todo',
282
+ },
283
+ {
284
+ id: 'integrations',
285
+ title: 'Connect your tools',
286
+ description:
287
+ 'Stripe for payments, QuickBooks for the books, Slack for alerts.',
288
+ minutes: 3,
289
+ status: 'todo',
290
+ },
291
+ {
292
+ id: 'invites',
293
+ title: 'Invite your teammates',
294
+ description:
295
+ 'Billing works better when the whole team sees the same numbers.',
296
+ minutes: 2,
297
+ status: 'todo',
298
+ },
299
+ {
300
+ id: 'first-project',
301
+ title: 'Create your first project',
302
+ description:
303
+ 'Projects group invoices, budgets and time entries per client.',
304
+ minutes: 1,
305
+ status: 'todo',
306
+ },
307
+ {
308
+ id: 'import-customers',
309
+ title: 'Import your customers',
310
+ description: 'Bring your existing customer list over as a CSV.',
311
+ minutes: 5,
312
+ status: 'todo',
313
+ },
314
+ {
315
+ id: 'first-invoice',
316
+ title: 'Send your first invoice',
317
+ description: 'Compose, preview and send — payment link included.',
318
+ minutes: 4,
319
+ status: 'todo',
320
+ },
321
+ {
322
+ id: 'reminders',
323
+ title: 'Turn on payment reminders',
324
+ description: 'Stop chasing overdue invoices by hand.',
325
+ minutes: 1,
326
+ status: 'todo',
327
+ },
328
+ ]);
329
+
330
+ // Icon names are full static literals: the production icon scanner bundles
331
+ // only literals it can see, and brand SVGs live in the app's iconDir.
332
+ const integrations = reactive<WorkspaceIntegration[]>([
333
+ {
334
+ id: 'stripe',
335
+ name: 'Stripe',
336
+ description: 'Accept card payments; payouts reconcile against invoices.',
337
+ icon: 'local:stripe',
338
+ connected: false,
339
+ busy: false,
340
+ },
341
+ {
342
+ id: 'quickbooks',
343
+ name: 'QuickBooks Online',
344
+ description: 'Push paid invoices straight into your accounting.',
345
+ icon: 'local:quickbooks',
346
+ connected: false,
347
+ busy: false,
348
+ },
349
+ {
350
+ id: 'slack',
351
+ name: 'Slack',
352
+ description: 'A message in #finance when an invoice is paid or overdue.',
353
+ icon: 'local:slack',
354
+ connected: false,
355
+ busy: false,
356
+ },
357
+ {
358
+ id: 'google-drive',
359
+ name: 'Google Drive',
360
+ description: 'Attach contracts and receipts from your shared drives.',
361
+ icon: 'local:google-drive',
362
+ connected: false,
363
+ busy: false,
364
+ },
365
+ ]);
366
+
367
+ const activeStep = ref<StepId | null>(null);
368
+ const workspace = ref<WorkspaceProfile | null>(null);
369
+ const invites = ref<PendingInvite[]>([]);
370
+ const firstProject = ref<Project | null>(null);
371
+ const importState = reactive({
372
+ uploading: false,
373
+ sentBytes: 0,
374
+ totalBytes: 0,
375
+ importedCount: null as number | null,
376
+ });
377
+ const reminders = reactive({
378
+ enabled: false,
379
+ cadence: '3-7-14' as ReminderCadence,
380
+ });
381
+
382
+ // Skipped counts as done: the bar rewards moving on, like Linear's checklist.
383
+ const doneCount = computed(
384
+ () => steps.filter((step) => step.status !== 'todo').length
385
+ );
386
+ const allDone = computed(() => doneCount.value === steps.length);
387
+
388
+ const step = (id: StepId): OnboardingStep =>
389
+ steps.find((candidate) => candidate.id === id)!;
390
+
391
+ // -- Data: one useAsyncData load; every mutation ends in refresh(). --------
392
+ const { data, refresh } = useAsyncData<OnboardingState>('onboarding', () =>
393
+ $fetch<OnboardingState>('/api/onboarding')
394
+ );
395
+
396
+ let hasOpenedFirstStep = false;
397
+ watch(
398
+ data,
399
+ (state) => {
400
+ if (!state) return;
401
+ for (const item of steps) item.status = state.steps[item.id];
402
+ const connected = new Set(state.connectedIntegrations);
403
+ for (const integration of integrations)
404
+ integration.connected = connected.has(integration.id);
405
+ workspace.value = state.workspace;
406
+ invites.value = state.invites;
407
+ firstProject.value = state.firstProject;
408
+ importState.importedCount = state.importedCustomers;
409
+ reminders.enabled = state.reminders.enabled;
410
+ reminders.cadence = state.reminders.cadence;
411
+ // Open the first unfinished step once, the first time data arrives.
412
+ if (!hasOpenedFirstStep) {
413
+ activeStep.value =
414
+ steps.find((candidate) => candidate.status === 'todo')?.id ?? null;
415
+ hasOpenedFirstStep = true;
416
+ }
417
+ },
418
+ { immediate: true }
419
+ );
420
+
421
+ // -- Step grammar ----------------------------------------------------------------
422
+ const openStep = (id: StepId | null) => {
423
+ activeStep.value = id;
424
+ };
425
+ // Previews replace: a checklist preview never stacks on another preview.
426
+ const previewStep = (id: StepId) =>
427
+ shell.push({ type: 'step-preview', stepId: id }, true);
428
+ // From the peek back into the page: open the step and drop the sidebar.
429
+ const jumpToStep = (id: StepId) => {
430
+ activeStep.value = id;
431
+ shell.close();
432
+ };
433
+ const openNextTodo = (after: StepId) => {
434
+ const index = steps.findIndex((candidate) => candidate.id === after);
435
+ const next = [...steps.slice(index + 1), ...steps.slice(0, index)].find(
436
+ (candidate) => candidate.status === 'todo'
437
+ );
438
+ activeStep.value = next?.id ?? null;
439
+ };
440
+
441
+ // -- Actions --------------------------------------------------------------------
442
+ // The one status writer: $fetch then refresh() re-seeds the whole page from
443
+ // the server response. Domain actions (send invites, import…) auto-check
444
+ // their step through it; the manual done/skip ghosts use the same verb.
445
+ const persistStatus = async (id: StepId, status: StepStatus) => {
446
+ if (step(id).status === status) return;
447
+ await $fetch(`/api/onboarding/steps/${id}`, {
448
+ method: 'PATCH',
449
+ body: { status },
450
+ });
451
+ await refresh();
452
+ };
453
+
454
+ const completeStep = async (id: StepId) => {
455
+ const title = step(id).title;
456
+ await persistStatus(id, 'complete');
457
+ toast({ title: `"${title}" checked off.`, variant: 'success' });
458
+ openNextTodo(id);
459
+ };
460
+
461
+ // Skipping is quiet: it is a dismissal, not an achievement.
462
+ const skipStep = async (id: StepId) => {
463
+ await persistStatus(id, 'skipped');
464
+ openNextTodo(id);
465
+ };
466
+
467
+ // Optimistic, per the BbSwitch doctrine: flip now, revert + toast on failure.
468
+ // `busy` drives `readonly` so conflicting toggles cannot queue.
469
+ const toggleIntegration = async (
470
+ integration: WorkspaceIntegration,
471
+ next: boolean
472
+ ) => {
473
+ integration.busy = true;
474
+ integration.connected = next;
475
+ try {
476
+ await $fetch(
477
+ `/api/onboarding/integrations/${integration.id}/${next ? 'connect' : 'disconnect'}`,
478
+ { method: 'POST' }
479
+ );
480
+ toast({
481
+ title: `${integration.name} ${next ? 'connected' : 'disconnected'}.`,
482
+ variant: 'success',
483
+ });
484
+ if (next) await persistStatus('integrations', 'complete');
485
+ } catch {
486
+ integration.connected = !next;
487
+ toast({
488
+ title: `Could not ${next ? 'connect' : 'disconnect'} ${integration.name}.`,
489
+ variant: 'destructive',
490
+ });
491
+ } finally {
492
+ integration.busy = false;
493
+ }
494
+ };
495
+
496
+ const sendInvites = async (emails: string[], role: InviteRole) => {
497
+ await $fetch('/api/onboarding/invites', {
498
+ method: 'POST',
499
+ body: { emails, role },
500
+ });
501
+ await persistStatus('invites', 'complete');
502
+ toast({
503
+ title: `${emails.length} invitation${emails.length === 1 ? '' : 's'} sent.`,
504
+ variant: 'success',
505
+ });
506
+ };
507
+
508
+ const createProject = async (draft: ProjectDraft) => {
509
+ await $fetch('/api/onboarding/project', { method: 'POST', body: draft });
510
+ await persistStatus('first-project', 'complete');
511
+ toast({ title: `${draft.name} created.`, variant: 'success' });
512
+ };
513
+
514
+ const importCustomers = async (file: File) => {
515
+ importState.uploading = true;
516
+ importState.totalBytes = file.size;
517
+ importState.sentBytes = 0;
518
+ try {
519
+ const body = new FormData();
520
+ body.append('file', file);
521
+ const result = await uploadWithProgress(
522
+ '/api/onboarding/customers/import',
523
+ body,
524
+ (sentBytes, totalBytes) => {
525
+ importState.sentBytes = sentBytes;
526
+ importState.totalBytes = totalBytes;
527
+ }
528
+ );
529
+ importState.importedCount = result.imported;
530
+ await persistStatus('import-customers', 'complete');
531
+ toast({
532
+ title: `${result.imported} customers imported.`,
533
+ variant: 'success',
534
+ });
535
+ } finally {
536
+ importState.uploading = false;
537
+ }
538
+ };
539
+
540
+ const setReminders = async (enabled: boolean) => {
541
+ reminders.enabled = enabled;
542
+ try {
543
+ await $fetch('/api/onboarding/reminders', {
544
+ method: 'PATCH',
545
+ body: { enabled, cadence: reminders.cadence },
546
+ });
547
+ if (enabled) await persistStatus('reminders', 'complete');
548
+ toast({
549
+ title: enabled
550
+ ? 'Payment reminders are on.'
551
+ : 'Payment reminders turned off.',
552
+ variant: 'success',
553
+ });
554
+ } catch {
555
+ reminders.enabled = !enabled;
556
+ toast({ title: 'Could not update reminders.', variant: 'destructive' });
557
+ }
558
+ };
559
+
560
+ const setReminderCadence = async (cadence: ReminderCadence) => {
561
+ reminders.cadence = cadence;
562
+ await $fetch('/api/onboarding/reminders', {
563
+ method: 'PATCH',
564
+ body: { enabled: reminders.enabled, cadence },
565
+ });
566
+ toast({ title: 'Reminder schedule updated.', variant: 'success' });
567
+ };
568
+
569
+ const dismissOnboarding = async () => {
570
+ const ok = await confirm({
571
+ variant: 'destructive',
572
+ title: 'Dismiss onboarding',
573
+ text: 'Hide the setup checklist for everyone in this workspace? Unfinished steps stay available under Settings → Setup.',
574
+ yes: 'Dismiss',
575
+ no: 'Keep it',
576
+ });
577
+ if (!ok) return;
578
+ await $fetch('/api/onboarding/dismiss', { method: 'POST' });
579
+ toast({
580
+ title: 'Onboarding dismissed. Find it again under Settings → Setup.',
581
+ variant: 'success',
582
+ });
583
+ await navigateTo('/dashboard');
584
+ };
585
+
586
+ const ctx: OnboardingWorkspaceContext = {
587
+ shell,
588
+ steps,
589
+ activeStep,
590
+ doneCount,
591
+ allDone,
592
+ workspace,
593
+ integrations,
594
+ invites,
595
+ firstProject,
596
+ importState,
597
+ reminders,
598
+ openStep,
599
+ previewStep,
600
+ jumpToStep,
601
+ completeStep,
602
+ skipStep,
603
+ toggleIntegration,
604
+ sendInvites,
605
+ createProject,
606
+ importCustomers,
607
+ setReminders,
608
+ setReminderCadence,
609
+ dismissOnboarding,
610
+ };
611
+ provide(key, ctx);
612
+ return ctx;
613
+ }
614
+
615
+ export function useOnboardingWorkspace(): OnboardingWorkspaceContext {
616
+ const ctx = inject(key);
617
+ if (!ctx)
618
+ throw new Error(
619
+ 'useOnboardingWorkspace() called outside OnboardingChecklist'
620
+ );
621
+ return ctx;
622
+ }
623
+ ```
624
+
625
+ ### Index.vue — the assembly
626
+
627
+ ```vue
628
+ <!-- OnboardingChecklist/Index.vue -->
629
+ <template>
630
+ <PageShell>
631
+ <!-- Topbar: breadcrumbs left, the page's one primary action right. -->
632
+ <template #topbar>
633
+ <div class="flex items-center justify-between gap-4 border-b px-4 py-2">
634
+ <!-- Breadcrumbs take the row's slack on a stable basis (min-w-0 flex-auto);
635
+ without it their overflow recompute fights the flex layout every frame. -->
636
+ <BbBreadcrumbs
637
+ class="min-w-0 flex-auto"
638
+ :items="[
639
+ { key: 'dashboard', text: 'Dashboard', to: '/dashboard' },
640
+ { key: 'getting-started', text: 'Getting started' },
641
+ ]"
642
+ />
643
+ <BbButton
644
+ append:icon="lucide:arrow-right"
645
+ class="shrink-0"
646
+ to="/dashboard"
647
+ variant="primary"
648
+ >
649
+ Go to dashboard
650
+ </BbButton>
651
+ </div>
652
+ </template>
653
+
654
+ <div class="mx-auto flex w-full max-w-3xl flex-col gap-6 p-4">
655
+ <ProgressHeader />
656
+
657
+ <!-- Single-open checklist: one active key in the context derives every
658
+ panel's model-value; opening one closes the rest, and clicking the
659
+ open header collapses everything (payload is false → key null). -->
660
+ <div class="flex flex-col divide-y rounded-[var(--bb-radius)] border">
661
+ <BbAccordion
662
+ v-for="item in ctx.steps"
663
+ :key="item.id"
664
+ :model-value="ctx.activeStep.value === item.id"
665
+ @update:model-value="(open) => ctx.openStep(open ? item.id : null)"
666
+ >
667
+ <template #header="{ value }">
668
+ <StepHeader :open="value" :step="item" />
669
+ </template>
670
+ <div class="flex flex-col gap-4 px-11 pb-4">
671
+ <component :is="stepBodies[item.id]" />
672
+ <StepActions :step="item" />
673
+ </div>
674
+ </BbAccordion>
675
+ </div>
676
+
677
+ <p class="text-xs text-[color:var(--bb-text-muted)]">
678
+ Stuck on a step?
679
+ <BbButton size="sm" to="/docs/setup" variant="link"
680
+ >Read the setup guide</BbButton
681
+ >
682
+ — it covers every integration and the CSV format.
683
+ </p>
684
+ </div>
685
+
686
+ <!-- The peek sidebar: the shell owns back/close; we render by type. -->
687
+ <template #sidebar>
688
+ <StepPreviewPeek
689
+ v-if="ctx.shell.current.value?.type === 'step-preview'"
690
+ :step-id="ctx.shell.current.value.stepId"
691
+ />
692
+ </template>
693
+ </PageShell>
694
+ </template>
695
+
696
+ <script setup lang="ts">
697
+ import type { Component } from 'vue';
698
+ import { BbAccordion, BbBreadcrumbs, BbButton } from 'bitboss-ui';
699
+ import PageShell from '@/components/layout/PageShell.vue';
700
+ import { provideOnboardingWorkspace, type StepId } from './context';
701
+ import FirstInvoiceStep from './FirstInvoiceStep.vue';
702
+ import FirstProjectStep from './FirstProjectStep.vue';
703
+ import ImportCustomersStep from './ImportCustomersStep.vue';
704
+ import IntegrationsStep from './IntegrationsStep.vue';
705
+ import InviteStep from './InviteStep.vue';
706
+ import ProfileStep from './ProfileStep.vue';
707
+ import ProgressHeader from './ProgressHeader.vue';
708
+ import RemindersStep from './RemindersStep.vue';
709
+ import StepActions from './StepActions.vue';
710
+ import StepHeader from './StepHeader.vue';
711
+ import StepPreviewPeek from './StepPreviewPeek.vue';
712
+
713
+ const ctx = provideOnboardingWorkspace();
714
+
715
+ // Each step body is its own component — a lookup, not a `type` prop.
716
+ const stepBodies: Record<StepId, Component> = {
717
+ profile: ProfileStep,
718
+ integrations: IntegrationsStep,
719
+ invites: InviteStep,
720
+ 'first-project': FirstProjectStep,
721
+ 'import-customers': ImportCustomersStep,
722
+ 'first-invoice': FirstInvoiceStep,
723
+ reminders: RemindersStep,
724
+ };
725
+ </script>
726
+ ```
727
+
728
+ ### ProgressHeader.vue
729
+
730
+ ```vue
731
+ <!-- OnboardingChecklist/ProgressHeader.vue -->
732
+ <template>
733
+ <header class="flex flex-col gap-3">
734
+ <div class="flex items-start justify-between gap-4">
735
+ <div class="flex flex-col gap-1">
736
+ <h1 class="text-xl font-semibold">Set up Acme</h1>
737
+ <p class="text-sm text-[color:var(--bb-text-muted)]">
738
+ A few steps to get your billing workspace ready for the whole team.
739
+ </p>
740
+ </div>
741
+ <BbButton variant="ghost" @click="ctx.dismissOnboarding">
742
+ Dismiss onboarding
743
+ </BbButton>
744
+ </div>
745
+
746
+ <div class="flex flex-col gap-1.5">
747
+ <div class="flex items-center justify-between gap-4 text-sm">
748
+ <span class="font-medium">
749
+ {{
750
+ ctx.allDone.value
751
+ ? 'All set — your workspace is ready.'
752
+ : 'Your setup checklist'
753
+ }}
754
+ </span>
755
+ <span class="text-[color:var(--bb-text-muted)]">
756
+ {{ ctx.doneCount.value }} of {{ ctx.steps.length }} complete
757
+ </span>
758
+ </div>
759
+ <!-- Real units in, no pre-computed percentage: max = number of steps. -->
760
+ <BbProgress
761
+ aria-label="Setup progress"
762
+ :aria-valuetext="`${ctx.doneCount.value} of ${ctx.steps.length} steps complete`"
763
+ :max="ctx.steps.length"
764
+ :model-value="ctx.doneCount.value"
765
+ />
766
+ </div>
767
+ </header>
768
+ </template>
769
+
770
+ <script setup lang="ts">
771
+ import { BbButton, BbProgress } from 'bitboss-ui';
772
+ import { useOnboardingWorkspace } from './context';
773
+
774
+ const ctx = useOnboardingWorkspace();
775
+ </script>
776
+ ```
777
+
778
+ ### StepHeader.vue
779
+
780
+ ```vue
781
+ <!-- OnboardingChecklist/StepHeader.vue -->
782
+ <template>
783
+ <!-- Rendered INSIDE the accordion's header button: everything here is
784
+ non-interactive and click-transparent by design — the whole row toggles. -->
785
+ <span class="flex w-full items-center gap-3 px-3 py-3 text-left">
786
+ <BbIcon
787
+ class="shrink-0"
788
+ :class="
789
+ step.status === 'complete'
790
+ ? 'text-green-600'
791
+ : 'text-[color:var(--bb-text-muted)]'
792
+ "
793
+ :icon="statusIcon"
794
+ size="20"
795
+ />
796
+ <span class="flex min-w-0 flex-1 flex-col">
797
+ <span
798
+ class="text-sm font-medium"
799
+ :class="
800
+ step.status === 'todo' ? '' : 'text-[color:var(--bb-text-muted)]'
801
+ "
802
+ >
803
+ {{ step.title }}
804
+ </span>
805
+ <span class="truncate text-xs text-[color:var(--bb-text-muted)]">{{
806
+ step.description
807
+ }}</span>
808
+ </span>
809
+ <span
810
+ v-if="step.status === 'skipped'"
811
+ class="shrink-0 text-xs uppercase tracking-wide text-[color:var(--bb-text-muted)]"
812
+ >
813
+ Skipped
814
+ </span>
815
+ <span
816
+ v-else-if="step.status === 'todo'"
817
+ class="shrink-0 text-xs text-[color:var(--bb-text-muted)]"
818
+ >
819
+ ~{{ step.minutes }} min
820
+ </span>
821
+ <BbIcon
822
+ class="shrink-0 text-[color:var(--bb-text-muted)] transition-transform"
823
+ :class="open ? 'rotate-180' : ''"
824
+ icon="lucide:chevron-down"
825
+ size="16"
826
+ />
827
+ </span>
828
+ </template>
829
+
830
+ <script setup lang="ts">
831
+ import { computed } from 'vue';
832
+ import { BbIcon } from 'bitboss-ui';
833
+ import type { OnboardingStep } from './context';
834
+
835
+ const props = defineProps<{ open: boolean; step: OnboardingStep }>();
836
+
837
+ // Full literals — the production icon scanner needs complete names.
838
+ const icons = {
839
+ todo: 'lucide:circle-dashed',
840
+ complete: 'lucide:circle-check',
841
+ skipped: 'lucide:circle-check',
842
+ } as const;
843
+ const statusIcon = computed(() => icons[props.step.status]);
844
+ </script>
845
+ ```
846
+
847
+ ### StepActions.vue
848
+
849
+ ```vue
850
+ <!-- OnboardingChecklist/StepActions.vue -->
851
+ <template>
852
+ <footer class="flex flex-wrap items-center gap-2 border-t pt-3">
853
+ <template v-if="step.status === 'todo'">
854
+ <BbButton
855
+ prepend:icon="lucide:check"
856
+ variant="ghost"
857
+ @click="() => ctx.completeStep(step.id)"
858
+ >
859
+ Mark as done
860
+ </BbButton>
861
+ <BbButton variant="ghost" @click="() => ctx.skipStep(step.id)">
862
+ Skip for now
863
+ </BbButton>
864
+ </template>
865
+ <span v-else class="text-xs text-[color:var(--bb-text-muted)]">
866
+ {{ step.status === 'complete' ? 'Completed' : 'Skipped' }} — revisit any
867
+ time from Settings → Setup.
868
+ </span>
869
+ <BbButton
870
+ append:icon="lucide:chevron-right"
871
+ class="ml-auto"
872
+ variant="ghost"
873
+ @click="() => ctx.previewStep(step.id)"
874
+ >
875
+ See what you'll get
876
+ </BbButton>
877
+ </footer>
878
+ </template>
879
+
880
+ <script setup lang="ts">
881
+ import { BbButton } from 'bitboss-ui';
882
+ import { useOnboardingWorkspace } from './context';
883
+ import type { OnboardingStep } from './context';
884
+
885
+ defineProps<{ step: OnboardingStep }>();
886
+
887
+ const ctx = useOnboardingWorkspace();
888
+ </script>
889
+ ```
890
+
891
+ ### ProfileStep.vue
892
+
893
+ ```vue
894
+ <!-- OnboardingChecklist/ProfileStep.vue -->
895
+ <template>
896
+ <div v-if="ctx.workspace.value" class="flex flex-col gap-3 text-sm">
897
+ <p class="text-[color:var(--bb-text-muted)]">
898
+ Done at signup — these details appear on every invoice you send.
899
+ </p>
900
+ <dl class="grid grid-cols-[auto_1fr] gap-x-6 gap-y-1.5">
901
+ <dt class="text-[color:var(--bb-text-muted)]">Company</dt>
902
+ <dd>{{ ctx.workspace.value.company }}</dd>
903
+ <dt class="text-[color:var(--bb-text-muted)]">Billing address</dt>
904
+ <dd>{{ ctx.workspace.value.address }}</dd>
905
+ <dt class="text-[color:var(--bb-text-muted)]">Tax ID</dt>
906
+ <dd>{{ ctx.workspace.value.taxId }}</dd>
907
+ <dt class="text-[color:var(--bb-text-muted)]">Currency</dt>
908
+ <dd>{{ ctx.workspace.value.currency }}</dd>
909
+ </dl>
910
+ <div>
911
+ <BbButton
912
+ prepend:icon="lucide:pencil"
913
+ size="sm"
914
+ to="/settings/general"
915
+ variant="link"
916
+ >
917
+ Edit workspace profile
918
+ </BbButton>
919
+ </div>
920
+ </div>
921
+ </template>
922
+
923
+ <script setup lang="ts">
924
+ import { BbButton } from 'bitboss-ui';
925
+ import { useOnboardingWorkspace } from './context';
926
+
927
+ const ctx = useOnboardingWorkspace();
928
+ </script>
929
+ ```
930
+
931
+ ### IntegrationsStep.vue
932
+
933
+ ```vue
934
+ <!-- OnboardingChecklist/IntegrationsStep.vue -->
935
+ <template>
936
+ <div class="flex flex-col text-sm">
937
+ <p class="pb-1 text-[color:var(--bb-text-muted)]">
938
+ Flip a switch to connect — you'll be sent through the provider's consent
939
+ screen the first time.
940
+ </p>
941
+ <div
942
+ v-for="integration in ctx.integrations"
943
+ :key="integration.id"
944
+ class="flex items-center gap-3 border-b py-2.5 last:border-b-0"
945
+ >
946
+ <BbIcon class="shrink-0" :icon="integration.icon" size="20" />
947
+ <div class="flex min-w-0 flex-1 flex-col">
948
+ <span class="font-medium">{{ integration.name }}</span>
949
+ <span class="truncate text-xs text-[color:var(--bb-text-muted)]">
950
+ {{ integration.description }}
951
+ </span>
952
+ </div>
953
+ <!-- Instant-effect toggle: the context flips optimistically, holds the
954
+ switch readonly while in flight, and reverts + toasts on failure. -->
955
+ <BbSwitch
956
+ hide-label
957
+ :label="`Connect ${integration.name}`"
958
+ :model-value="integration.connected"
959
+ :name="`integration-${integration.id}`"
960
+ :readonly="integration.busy"
961
+ @update:model-value="(next) => ctx.toggleIntegration(integration, next)"
962
+ />
963
+ </div>
964
+ </div>
965
+ </template>
966
+
967
+ <script setup lang="ts">
968
+ import { BbIcon, BbSwitch } from 'bitboss-ui';
969
+ import { useOnboardingWorkspace } from './context';
970
+
971
+ const ctx = useOnboardingWorkspace();
972
+ </script>
973
+ ```
974
+
975
+ ### InviteStep.vue
976
+
977
+ ```vue
978
+ <!-- OnboardingChecklist/InviteStep.vue -->
979
+ <template>
980
+ <div class="flex flex-col gap-3 text-sm">
981
+ <p class="text-[color:var(--bb-text-muted)]">
982
+ Paste addresses or type them — Enter or a comma adds each one.
983
+ </p>
984
+
985
+ <div class="flex flex-wrap items-end gap-2">
986
+ <BbTag
987
+ v-model="emails"
988
+ class="min-w-64 flex-1"
989
+ compact
990
+ :divider="['Enter', ',']"
991
+ :errors="inviteError"
992
+ label="Email addresses"
993
+ :max="10"
994
+ placeholder="ada.rossi@acme.com"
995
+ prepend:icon="lucide:mail"
996
+ @duplicate="
997
+ (email) => (inviteError = `${email} is already in the list.`)
998
+ "
999
+ @max="() => (inviteError = 'You can invite up to 10 people at once.')"
1000
+ />
1001
+ <BbSelect
1002
+ v-model="role"
1003
+ class="w-44"
1004
+ compact
1005
+ item-text="label"
1006
+ item-value="value"
1007
+ :items="roles"
1008
+ label="Role"
1009
+ label-mode="outside"
1010
+ />
1011
+ <BbButton prepend:icon="lucide:send" variant="secondary" @click="send">
1012
+ Send invitations
1013
+ </BbButton>
1014
+ </div>
1015
+
1016
+ <ul v-if="ctx.invites.value.length" class="flex flex-col gap-1">
1017
+ <li
1018
+ v-for="invite in ctx.invites.value"
1019
+ :key="invite.email"
1020
+ class="flex items-center justify-between gap-2 text-xs"
1021
+ >
1022
+ <span>{{ invite.email }}</span>
1023
+ <span class="text-[color:var(--bb-text-muted)]"
1024
+ >{{ invite.role }} · invited {{ invite.sentAt }}</span
1025
+ >
1026
+ </li>
1027
+ </ul>
1028
+ </div>
1029
+ </template>
1030
+
1031
+ <script setup lang="ts">
1032
+ import { ref } from 'vue';
1033
+ import { BbButton, BbSelect, BbTag } from 'bitboss-ui';
1034
+ import { useOnboardingWorkspace } from './context';
1035
+ import type { InviteRole } from '@/types';
1036
+
1037
+ const ctx = useOnboardingWorkspace();
1038
+
1039
+ // Draft state only this leaf touches: local refs, not context fields.
1040
+ const emails = ref<string[]>([]);
1041
+ const role = ref<InviteRole>('member');
1042
+ const inviteError = ref('');
1043
+
1044
+ const roles: { value: InviteRole; label: string }[] = [
1045
+ { value: 'admin', label: 'Admin' },
1046
+ { value: 'member', label: 'Member' },
1047
+ { value: 'accountant', label: 'Accountant' },
1048
+ ];
1049
+
1050
+ // Returning the promise lets the button's automatic loading track the send.
1051
+ const send = async () => {
1052
+ inviteError.value = '';
1053
+ if (emails.value.length === 0) {
1054
+ inviteError.value = 'Add at least one email address.';
1055
+ return;
1056
+ }
1057
+ const invalid = emails.value.filter((email) => !email.includes('@'));
1058
+ if (invalid.length > 0) {
1059
+ inviteError.value = `${invalid.join(', ')} ${invalid.length === 1 ? 'is' : 'are'} not a valid address.`;
1060
+ return;
1061
+ }
1062
+ await ctx.sendInvites(emails.value, role.value);
1063
+ emails.value = [];
1064
+ };
1065
+ </script>
1066
+ ```
1067
+
1068
+ ### FirstProjectStep.vue
1069
+
1070
+ ```vue
1071
+ <!-- OnboardingChecklist/FirstProjectStep.vue -->
1072
+ <template>
1073
+ <!-- Already created (by this session or a teammate): show it, not the form. -->
1074
+ <div v-if="ctx.firstProject.value" class="flex items-center gap-2 text-sm">
1075
+ <BbIcon class="text-green-600" icon="lucide:circle-check" size="16" />
1076
+ <span>
1077
+ <span class="font-medium">{{ ctx.firstProject.value.name }}</span>
1078
+ is ready for its first invoice.
1079
+ </span>
1080
+ <BbButton
1081
+ append:icon="lucide:arrow-up-right"
1082
+ size="sm"
1083
+ :to="`/projects/${ctx.firstProject.value.id}`"
1084
+ variant="link"
1085
+ >
1086
+ Open project
1087
+ </BbButton>
1088
+ </div>
1089
+
1090
+ <form
1091
+ v-else
1092
+ class="flex flex-col gap-3 text-sm"
1093
+ novalidate
1094
+ @submit.prevent="submit"
1095
+ >
1096
+ <p class="text-[color:var(--bb-text-muted)]">
1097
+ A project keeps one client's invoices, budget and time entries together.
1098
+ </p>
1099
+ <div class="flex flex-wrap items-end gap-2">
1100
+ <BbTextInput
1101
+ v-model="draft.name"
1102
+ class="min-w-56 flex-1"
1103
+ compact
1104
+ :errors="nameError"
1105
+ label="Project name"
1106
+ label-mode="outside"
1107
+ placeholder="Website redesign"
1108
+ />
1109
+ <BbTextInput
1110
+ v-model="draft.client"
1111
+ class="min-w-56 flex-1"
1112
+ compact
1113
+ label="Client"
1114
+ label-mode="outside"
1115
+ placeholder="Globex Corporation"
1116
+ />
1117
+ <BbButton prepend:icon="lucide:plus" type="submit" variant="secondary">
1118
+ Create project
1119
+ </BbButton>
1120
+ </div>
1121
+ </form>
1122
+ </template>
1123
+
1124
+ <script setup lang="ts">
1125
+ import { reactive, ref } from 'vue';
1126
+ import { BbButton, BbIcon, BbTextInput } from 'bitboss-ui';
1127
+ import { useOnboardingWorkspace } from './context';
1128
+
1129
+ const ctx = useOnboardingWorkspace();
1130
+
1131
+ const draft = reactive({ name: '', client: '' });
1132
+ const nameError = ref('');
1133
+
1134
+ // Returning the promise lets the submit button track the async work.
1135
+ const submit = () => {
1136
+ nameError.value = '';
1137
+ if (!draft.name.trim()) {
1138
+ nameError.value = 'Give the project a name.';
1139
+ return;
1140
+ }
1141
+ return ctx.createProject({ ...draft });
1142
+ };
1143
+ </script>
1144
+ ```
1145
+
1146
+ ### ImportCustomersStep.vue
1147
+
1148
+ ```vue
1149
+ <!-- OnboardingChecklist/ImportCustomersStep.vue -->
1150
+ <template>
1151
+ <div class="flex flex-col gap-3 text-sm">
1152
+ <!-- Already imported: report it instead of showing an empty dropzone. -->
1153
+ <div
1154
+ v-if="ctx.importState.importedCount !== null"
1155
+ class="flex items-center gap-2"
1156
+ >
1157
+ <BbIcon class="text-green-600" icon="lucide:circle-check" size="16" />
1158
+ <span>
1159
+ <span class="font-medium">{{ ctx.importState.importedCount }}</span>
1160
+ customers imported.
1161
+ </span>
1162
+ <BbButton
1163
+ append:icon="lucide:arrow-up-right"
1164
+ size="sm"
1165
+ to="/customers"
1166
+ variant="link"
1167
+ >
1168
+ View customers
1169
+ </BbButton>
1170
+ </div>
1171
+
1172
+ <template v-else>
1173
+ <!-- MIME + extension pairing: Excel exports often carry a non-CSV MIME
1174
+ type (or none at all on drag-drop) — '.csv' is what admits them. -->
1175
+ <BbDropzone
1176
+ v-model="file"
1177
+ :accept="['text/csv', '.csv']"
1178
+ :disabled="ctx.importState.uploading"
1179
+ :errors="fileError"
1180
+ :max-size="10 * 1024 * 1024"
1181
+ @error="onReject"
1182
+ >
1183
+ <template #default="{ dragging, focused, open }">
1184
+ <div
1185
+ class="flex flex-col items-center gap-2 rounded-[var(--bb-radius)] border-2 border-dashed p-6 text-center transition-colors"
1186
+ :class="[
1187
+ dragging
1188
+ ? 'border-[color:var(--bb-primary)] bg-[color:var(--bb-panel)]'
1189
+ : '',
1190
+ focused ? 'ring-2 ring-[color:var(--bb-ring)]' : '',
1191
+ ]"
1192
+ >
1193
+ <BbIcon
1194
+ class="text-[color:var(--bb-text-muted)]"
1195
+ icon="lucide:file-spreadsheet"
1196
+ size="24"
1197
+ />
1198
+ <p class="font-medium">
1199
+ {{
1200
+ dragging ? 'Drop your CSV here' : 'Drag your customers CSV here'
1201
+ }}
1202
+ </p>
1203
+ <p class="text-xs text-[color:var(--bb-text-muted)]">
1204
+ We map name, email, VAT number and address columns. Up to 10 MB.
1205
+ </p>
1206
+ <BbButton size="sm" variant="ghost" @click="open"
1207
+ >or browse files</BbButton
1208
+ >
1209
+ </div>
1210
+ </template>
1211
+ </BbDropzone>
1212
+
1213
+ <!-- Captured, not yet imported: confirm before touching the workspace. -->
1214
+ <div v-if="file" class="flex items-center gap-2">
1215
+ <BbIcon
1216
+ class="shrink-0 text-[color:var(--bb-text-muted)]"
1217
+ icon="lucide:file-text"
1218
+ size="16"
1219
+ />
1220
+ <span class="min-w-0 flex-1 truncate">
1221
+ {{ file.name }}
1222
+ <span class="text-xs text-[color:var(--bb-text-muted)]"
1223
+ >· {{ formatSize(file.size) }}</span
1224
+ >
1225
+ </span>
1226
+ <BbButton
1227
+ aria-label="Remove selected file"
1228
+ :disabled="ctx.importState.uploading"
1229
+ icon="lucide:x"
1230
+ size="sm"
1231
+ variant="ghost"
1232
+ @click="() => (file = null)"
1233
+ />
1234
+ <BbButton
1235
+ :disabled="ctx.importState.uploading"
1236
+ prepend:icon="lucide:upload"
1237
+ variant="secondary"
1238
+ @click="startImport"
1239
+ >
1240
+ Import customers
1241
+ </BbButton>
1242
+ </div>
1243
+
1244
+ <!-- The dropzone captures; the context uploads and drives the bar. -->
1245
+ <div v-if="ctx.importState.uploading" class="flex flex-col gap-1">
1246
+ <BbProgress
1247
+ aria-label="Upload progress"
1248
+ :max="ctx.importState.totalBytes"
1249
+ :model-value="ctx.importState.sentBytes"
1250
+ />
1251
+ <span class="text-xs text-[color:var(--bb-text-muted)]">
1252
+ Uploading… {{ formatSize(ctx.importState.sentBytes) }} of
1253
+ {{ formatSize(ctx.importState.totalBytes) }}
1254
+ </span>
1255
+ </div>
1256
+ </template>
1257
+ </div>
1258
+ </template>
1259
+
1260
+ <script setup lang="ts">
1261
+ import { ref } from 'vue';
1262
+ import { BbButton, BbDropzone, BbIcon, BbProgress } from 'bitboss-ui';
1263
+ import type { DropZoneError } from 'bitboss-ui';
1264
+ import { useOnboardingWorkspace } from './context';
1265
+
1266
+ const ctx = useOnboardingWorkspace();
1267
+
1268
+ // The captured-but-not-imported file is this leaf's own state.
1269
+ const file = ref<File | null>(null);
1270
+ const fileError = ref('');
1271
+
1272
+ // Rejects never reach the model — map the typed error to a message and feed
1273
+ // it back through `errors` (the display is a round-trip, not automatic).
1274
+ const onReject = (error: DropZoneError) => {
1275
+ fileError.value =
1276
+ error.type === 'maxSize'
1277
+ ? `${error.filename} is ${error.formattedSize} — the limit is ${error.formattedMaxSize}.`
1278
+ : error.type === 'accept'
1279
+ ? `${error.filename} is not a CSV file.`
1280
+ : `${error.filename} was rejected.`;
1281
+ };
1282
+
1283
+ const startImport = async () => {
1284
+ if (!file.value) return;
1285
+ fileError.value = '';
1286
+ await ctx.importCustomers(file.value);
1287
+ file.value = null;
1288
+ };
1289
+
1290
+ const formatSize = (bytes: number) =>
1291
+ bytes >= 1024 * 1024
1292
+ ? `${(bytes / 1024 / 1024).toFixed(1)} MB`
1293
+ : `${Math.max(1, Math.round(bytes / 1024))} KB`;
1294
+ </script>
1295
+ ```
1296
+
1297
+ ### FirstInvoiceStep.vue
1298
+
1299
+ ```vue
1300
+ <!-- OnboardingChecklist/FirstInvoiceStep.vue -->
1301
+ <template>
1302
+ <div class="flex flex-col gap-3 text-sm">
1303
+ <p class="text-[color:var(--bb-text-muted)]">
1304
+ The composer walks you through line items, taxes and payment terms. Every
1305
+ invoice goes out with a payment link — customers pay by card or bank
1306
+ transfer without creating an account. This step checks itself off when
1307
+ your first invoice is sent.
1308
+ </p>
1309
+ <div>
1310
+ <BbButton
1311
+ append:icon="lucide:arrow-up-right"
1312
+ prepend:icon="lucide:receipt"
1313
+ to="/invoices/create"
1314
+ variant="outline"
1315
+ >
1316
+ Open the invoice composer
1317
+ </BbButton>
1318
+ </div>
1319
+ </div>
1320
+ </template>
1321
+
1322
+ <script setup lang="ts">
1323
+ import { BbButton } from 'bitboss-ui';
1324
+ </script>
1325
+ ```
1326
+
1327
+ ### RemindersStep.vue
1328
+
1329
+ ```vue
1330
+ <!-- OnboardingChecklist/RemindersStep.vue -->
1331
+ <template>
1332
+ <div class="flex flex-col gap-3 text-sm">
1333
+ <!-- Instant-effect switch: the context applies optimistically and reverts
1334
+ with a toast if the server rejects the change. -->
1335
+ <BbSwitch
1336
+ description="Email customers automatically when an invoice goes overdue. Replies land in your inbox."
1337
+ label="Automatic payment reminders"
1338
+ :model-value="ctx.reminders.enabled"
1339
+ name="payment-reminders"
1340
+ @update:model-value="(next) => ctx.setReminders(next)"
1341
+ />
1342
+ <BbSelect
1343
+ v-if="ctx.reminders.enabled"
1344
+ class="max-w-72"
1345
+ compact
1346
+ item-text="label"
1347
+ item-value="value"
1348
+ :items="cadences"
1349
+ label="Reminder schedule"
1350
+ label-mode="outside"
1351
+ :model-value="ctx.reminders.cadence"
1352
+ @update:model-value="(cadence) => ctx.setReminderCadence(cadence)"
1353
+ />
1354
+ </div>
1355
+ </template>
1356
+
1357
+ <script setup lang="ts">
1358
+ import { BbSelect, BbSwitch } from 'bitboss-ui';
1359
+ import { useOnboardingWorkspace } from './context';
1360
+ import type { ReminderCadence } from '@/types';
1361
+
1362
+ const ctx = useOnboardingWorkspace();
1363
+
1364
+ const cadences: { value: ReminderCadence; label: string }[] = [
1365
+ { value: '3-7-14', label: '3, 7 and 14 days overdue' },
1366
+ { value: '7', label: '7 days overdue' },
1367
+ { value: '7-30', label: '7 and 30 days overdue' },
1368
+ ];
1369
+ </script>
1370
+ ```
1371
+
1372
+ ### StepPreviewPeek.vue
1373
+
1374
+ ```vue
1375
+ <!-- OnboardingChecklist/StepPreviewPeek.vue -->
1376
+ <template>
1377
+ <div class="flex flex-col gap-4 text-sm">
1378
+ <!-- Identity header. -->
1379
+ <header class="flex items-center gap-3">
1380
+ <span
1381
+ class="flex h-9 w-9 shrink-0 items-center justify-center rounded-[var(--bb-radius)] border"
1382
+ >
1383
+ <BbIcon :icon="preview.icon" size="18" />
1384
+ </span>
1385
+ <div class="flex min-w-0 flex-col">
1386
+ <h2 class="text-base font-semibold">{{ preview.title }}</h2>
1387
+ <p class="text-xs text-[color:var(--bb-text-muted)]">
1388
+ {{ preview.tagline }}
1389
+ </p>
1390
+ </div>
1391
+ </header>
1392
+
1393
+ <p
1394
+ v-if="step.status !== 'todo'"
1395
+ class="flex items-center gap-1.5 text-xs text-[color:var(--bb-text-muted)]"
1396
+ >
1397
+ <!-- Green is earned: skipped reads as reached-but-unmeasured, not done. -->
1398
+ <BbIcon
1399
+ :class="
1400
+ step.status === 'complete'
1401
+ ? 'text-green-600'
1402
+ : 'text-[color:var(--bb-text-muted)]'
1403
+ "
1404
+ icon="lucide:circle-check"
1405
+ size="14"
1406
+ />
1407
+ {{
1408
+ step.status === 'complete'
1409
+ ? 'Already done in this workspace.'
1410
+ : 'Skipped — you can still set it up.'
1411
+ }}
1412
+ </p>
1413
+
1414
+ <!-- What you'll get. -->
1415
+ <section class="flex flex-col gap-2.5">
1416
+ <h3
1417
+ class="text-xs font-semibold uppercase tracking-wide text-[color:var(--bb-text-muted)]"
1418
+ >
1419
+ What you'll get
1420
+ </h3>
1421
+ <ul class="flex flex-col gap-2.5">
1422
+ <li
1423
+ v-for="bullet in preview.bullets"
1424
+ :key="bullet.title"
1425
+ class="flex gap-2"
1426
+ >
1427
+ <BbIcon
1428
+ class="mt-0.5 shrink-0 text-[color:var(--bb-text-muted)]"
1429
+ :icon="bullet.icon"
1430
+ size="14"
1431
+ />
1432
+ <div class="flex flex-col">
1433
+ <span class="font-medium">{{ bullet.title }}</span>
1434
+ <span class="text-xs text-[color:var(--bb-text-muted)]">{{
1435
+ bullet.text
1436
+ }}</span>
1437
+ </div>
1438
+ </li>
1439
+ </ul>
1440
+ </section>
1441
+
1442
+ <!-- One concrete number beats three adjectives. -->
1443
+ <div class="rounded-[var(--bb-radius)] border p-3">
1444
+ <p class="text-lg font-semibold">{{ preview.stat.value }}</p>
1445
+ <p class="text-xs text-[color:var(--bb-text-muted)]">
1446
+ {{ preview.stat.label }}
1447
+ </p>
1448
+ </div>
1449
+
1450
+ <footer class="mt-2 flex items-center gap-2 border-t pt-3">
1451
+ <BbButton
1452
+ v-if="step.status === 'todo'"
1453
+ prepend:icon="lucide:check"
1454
+ variant="secondary"
1455
+ @click="() => ctx.jumpToStep(stepId)"
1456
+ >
1457
+ Set it up now
1458
+ </BbButton>
1459
+ <BbButton v-else variant="ghost" @click="() => ctx.jumpToStep(stepId)">
1460
+ Review this step
1461
+ </BbButton>
1462
+ </footer>
1463
+ </div>
1464
+ </template>
1465
+
1466
+ <script setup lang="ts">
1467
+ import { computed } from 'vue';
1468
+ import { BbButton, BbIcon } from 'bitboss-ui';
1469
+ import { useOnboardingWorkspace, type StepId } from './context';
1470
+
1471
+ const props = defineProps<{ stepId: StepId }>();
1472
+
1473
+ const ctx = useOnboardingWorkspace();
1474
+
1475
+ const step = computed(
1476
+ () => ctx.steps.find((candidate) => candidate.id === props.stepId)!
1477
+ );
1478
+ const preview = computed(() => previews[props.stepId]);
1479
+
1480
+ interface StepPreview {
1481
+ icon: string;
1482
+ title: string;
1483
+ tagline: string;
1484
+ bullets: { icon: string; title: string; text: string }[];
1485
+ stat: { value: string; label: string };
1486
+ }
1487
+
1488
+ // Presentation content with a single consumer: it lives in the leaf, not the
1489
+ // context. Icon names are full static literals for the production scanner.
1490
+ const previews: Record<StepId, StepPreview> = {
1491
+ profile: {
1492
+ icon: 'lucide:building-2',
1493
+ title: 'A complete company profile',
1494
+ tagline: 'Set once, printed on every document.',
1495
+ bullets: [
1496
+ {
1497
+ icon: 'lucide:file-text',
1498
+ title: 'Compliant invoices',
1499
+ text: 'Legal name, address and tax ID appear on every PDF automatically.',
1500
+ },
1501
+ {
1502
+ icon: 'lucide:euro',
1503
+ title: 'One currency for the books',
1504
+ text: 'Amounts, totals and reports all use your workspace currency.',
1505
+ },
1506
+ ],
1507
+ stat: {
1508
+ value: '2 min',
1509
+ label: 'to update it later under Settings → General',
1510
+ },
1511
+ },
1512
+ integrations: {
1513
+ icon: 'lucide:link',
1514
+ title: 'Your tools, wired together',
1515
+ tagline:
1516
+ 'Payments, accounting and alerts stop being three separate chores.',
1517
+ bullets: [
1518
+ {
1519
+ icon: 'lucide:credit-card',
1520
+ title: 'Payments reconcile themselves',
1521
+ text: 'Stripe payouts are matched against open invoices automatically.',
1522
+ },
1523
+ {
1524
+ icon: 'lucide:receipt',
1525
+ title: 'Books stay current',
1526
+ text: 'Paid invoices flow into QuickBooks the moment they settle.',
1527
+ },
1528
+ {
1529
+ icon: 'lucide:bell',
1530
+ title: 'The team finds out in Slack',
1531
+ text: '#finance gets a message on every paid and overdue invoice.',
1532
+ },
1533
+ ],
1534
+ stat: {
1535
+ value: '9 days',
1536
+ label: 'faster average payment for teams with Stripe connected',
1537
+ },
1538
+ },
1539
+ invites: {
1540
+ icon: 'lucide:users',
1541
+ title: 'Everyone on the same numbers',
1542
+ tagline: 'Roles keep access right-sized from day one.',
1543
+ bullets: [
1544
+ {
1545
+ icon: 'lucide:user-plus',
1546
+ title: 'Sign-in with work email',
1547
+ text: 'Invitees join with their address — no shared passwords.',
1548
+ },
1549
+ {
1550
+ icon: 'lucide:key-round',
1551
+ title: 'Permissions per role',
1552
+ text: 'Accountants see reports; members see their own projects.',
1553
+ },
1554
+ {
1555
+ icon: 'lucide:clock',
1556
+ title: 'Invitations expire safely',
1557
+ text: 'Unaccepted invites lapse after 7 days and can be re-sent.',
1558
+ },
1559
+ ],
1560
+ stat: { value: '10', label: 'invitations per batch' },
1561
+ },
1562
+ 'first-project': {
1563
+ icon: 'lucide:folder',
1564
+ title: 'A home for each client',
1565
+ tagline: 'Projects keep invoices, budgets and time in one place.',
1566
+ bullets: [
1567
+ {
1568
+ icon: 'lucide:folder-open',
1569
+ title: 'Everything grouped',
1570
+ text: 'Invoices, budgets and time entries organized per client.',
1571
+ },
1572
+ {
1573
+ icon: 'lucide:chart-line',
1574
+ title: 'Profitability from day one',
1575
+ text: 'A per-project margin view as soon as the first invoice is paid.',
1576
+ },
1577
+ ],
1578
+ stat: {
1579
+ value: '3',
1580
+ label: 'projects created by the average team in week one',
1581
+ },
1582
+ },
1583
+ 'import-customers': {
1584
+ icon: 'lucide:file-spreadsheet',
1585
+ title: 'Your customer list, moved over',
1586
+ tagline: 'The CSV you already have is enough.',
1587
+ bullets: [
1588
+ {
1589
+ icon: 'lucide:upload',
1590
+ title: 'Columns mapped for you',
1591
+ text: 'Name, email, VAT number and address are detected automatically.',
1592
+ },
1593
+ {
1594
+ icon: 'lucide:check',
1595
+ title: 'No double imports',
1596
+ text: 'Rows are merged by email — re-running an import never duplicates.',
1597
+ },
1598
+ ],
1599
+ stat: { value: '5,000', label: 'rows per import' },
1600
+ },
1601
+ 'first-invoice': {
1602
+ icon: 'lucide:receipt',
1603
+ title: 'Your first invoice, out the door',
1604
+ tagline: 'Composed, sent and tracked in one flow.',
1605
+ bullets: [
1606
+ {
1607
+ icon: 'lucide:send',
1608
+ title: 'Sent from your domain',
1609
+ text: 'Invoices arrive from billing@your-company, not a noreply void.',
1610
+ },
1611
+ {
1612
+ icon: 'lucide:banknote',
1613
+ title: 'Payment link included',
1614
+ text: 'Customers pay by card or bank transfer without an account.',
1615
+ },
1616
+ {
1617
+ icon: 'lucide:clock',
1618
+ title: 'Overdue tracking starts itself',
1619
+ text: 'Due dates and aging are tracked from the moment you hit send.',
1620
+ },
1621
+ ],
1622
+ stat: {
1623
+ value: '2×',
1624
+ label: 'faster payment on invoices with a payment link',
1625
+ },
1626
+ },
1627
+ reminders: {
1628
+ icon: 'lucide:bell',
1629
+ title: 'Overdue chasing, automated',
1630
+ tagline: 'Polite nudges on a schedule you choose.',
1631
+ bullets: [
1632
+ {
1633
+ icon: 'lucide:clock',
1634
+ title: 'A schedule, not a scramble',
1635
+ text: 'Reminders at 3, 7 and 14 days overdue — or the cadence you pick.',
1636
+ },
1637
+ {
1638
+ icon: 'lucide:mail',
1639
+ title: 'Replies reach a human',
1640
+ text: 'Customers answer straight into your inbox thread.',
1641
+ },
1642
+ ],
1643
+ stat: {
1644
+ value: '38%',
1645
+ label: 'fewer invoices reach 30 days overdue with reminders on',
1646
+ },
1647
+ },
1648
+ };
1649
+ </script>
1650
+ ```
1651
+
1652
+ ## Why it is built this way
1653
+
1654
+ - **The context coopts the shell, leaves consume.** The only specific
1655
+ context on a checklist page is the peek stack; `provideOnboardingWorkspace()`
1656
+ joins it once and thirteen components share step state, integration
1657
+ state and every action through one `useOnboardingWorkspace()` call. No
1658
+ component receives a callback prop; the only data props are the `step` /
1659
+ `stepId` an item renders (`StepHeader`, `StepActions`, `StepPreviewPeek`)
1660
+ — everything else is injection.
1661
+ - **One fetch, one refresh path.** `useAsyncData('onboarding', …)` loads the
1662
+ whole checklist once; `persistStatus` is the single place that `$fetch`s a
1663
+ mutation and calls `refresh()` — a `watch(data, …, { immediate: true })`
1664
+ re-seeds every local field from the fresh response, so `steps`,
1665
+ `integrations`, `invites`, `firstProject` and `reminders` can never drift
1666
+ from what the server actually persisted.
1667
+ - **Single-open is one key, per the BbAccordion doctrine.** `BbAccordion`
1668
+ is deliberately one panel per boolean with no group wrapper; the
1669
+ `activeStep` key derives each `model-value`, the `update:modelValue`
1670
+ payload (`false` on closing the open header) resets it to `null`, and
1671
+ `openNextTodo` gives the Linear feel of the checklist walking itself
1672
+ forward. No watchers force-closing siblings.
1673
+ - **Headers stay passive, actions live in the body.** The accordion header
1674
+ is already a `<button>`; the status icon, minutes estimate and chevron in
1675
+ `StepHeader` are click-transparent metadata. Everything interactive —
1676
+ done, skip, preview, the step's real controls — is body content, so the
1677
+ markup stays valid and the click target stays whole.
1678
+ - **`ofetch` has no upload-progress hook.** Every mutation on this page is a
1679
+ plain `$fetch` except the CSV import, which needs real bytes for
1680
+ `BbProgress` — that one call drops to a raw `XMLHttpRequest` wrapped in a
1681
+ promise. It is the only exception, called out explicitly so it doesn't
1682
+ read as an inconsistency.
1683
+ - **Every rung of the state ladder is deliberate.** Draft state one leaf
1684
+ touches is a local ref (invite emails and role, the project draft, the
1685
+ captured CSV file, the reject message); everything two components read
1686
+ sits on the context (statuses, `importState` driving `BbProgress`,
1687
+ reminders); nothing on this page outlives it, so no store is involved.
1688
+ - **The switch promise is kept.** Integration and reminder toggles apply
1689
+ optimistically, hold the control `readonly` while the request flies, and
1690
+ revert with a `destructive` toast on failure — the async-save pattern
1691
+ from the BbSwitch guide, owned by context actions so no leaf ever talks
1692
+ to `$fetch` or toasts on its own.
1693
+ - **The dropzone captures; the context uploads.** `BbDropzone` has no
1694
+ request surface by design: the leaf holds the captured `File`, maps the
1695
+ typed `@error` union back through `errors` (the display round-trip), and
1696
+ `importCustomers` drives `BbProgress` from real bytes — `max` is the file
1697
+ size, never a pre-computed percentage.
1698
+ - **Previews are peeks, not dialogs.** "See what you'll get" is the
1699
+ checklist's version of clicking a record's name: `previewStep` pushes
1700
+ onto the coopted shell stack with `replace` (previews never stack), and
1701
+ `jumpToStep` owns the way back — leaves never touch the stack grammar
1702
+ directly.
1703
+ - **Sizing and variants:** `md`-first throughout the bodies (28px buttons
1704
+ flush beside `compact` inputs in the invite and project rows); `sm` only
1705
+ for genuinely dense spots (inline links, the file-row remove); exactly
1706
+ one `variant="primary"` (Go to dashboard); step submits are `secondary`;
1707
+ dismissal is a ghost gated by a `destructive` `useConfirm`.
1708
+
1709
+ ## Variations
1710
+
1711
+ - **Personal onboarding**: scope statuses per user instead of per
1712
+ workspace (`$fetch('/api/onboarding', { query: { scope: 'user' } })`)
1713
+ and drop the workspace-wide dismiss confirm copy; the page shape is
1714
+ unchanged.
1715
+ - **Sequential (gated) steps**: lock each accordion until the previous
1716
+ step is done by rendering the body's controls `disabled` with an
1717
+ explanatory line; for hard gates with per-step validation, the
1718
+ wizard-form recipe is the full treatment.
1719
+ - **Preview follows the open step**: call `previewStep(id)` from
1720
+ `openStep` so the sidebar always previews the active step; keep the
1721
+ explicit footer button for touch users.
1722
+ - **All-done celebration**: when `allDone` flips, swap `ProgressHeader`'s
1723
+ copy block for a success panel with the dashboard CTA and a "book an
1724
+ onboarding call" link.