bitboss-ui 2.1.134 → 3.0.0-alpha.1

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 (1358) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +244 -21
  3. package/bin/bitboss-ui-mcp.mjs +557 -0
  4. package/bin/bitboss-ui.mjs +626 -0
  5. package/dist/ai/BbAccordion.md +522 -113
  6. package/dist/ai/BbAlert.md +377 -197
  7. package/dist/ai/BbAsterisk.md +46 -0
  8. package/dist/ai/BbAvatar.md +454 -178
  9. package/dist/ai/BbBadge.md +695 -225
  10. package/dist/ai/BbBadgeButton.md +54 -0
  11. package/dist/ai/BbBaseButton.md +489 -0
  12. package/dist/ai/BbBaseCheckbox.md +49 -0
  13. package/dist/ai/BbBaseCheckboxGroup.md +64 -0
  14. package/dist/ai/BbBaseCheckboxIcon.md +174 -0
  15. package/dist/ai/BbBaseColorInput.md +64 -0
  16. package/dist/ai/BbBaseColorPalette.md +39 -0
  17. package/dist/ai/BbBaseDatePicker.md +42 -0
  18. package/dist/ai/BbBaseDatePickerInput.md +73 -0
  19. package/dist/ai/BbBaseInputContainer.md +48 -0
  20. package/dist/ai/BbBaseNumberInput.md +71 -0
  21. package/dist/ai/BbBaseRadio.md +46 -0
  22. package/dist/ai/BbBaseRadioGroup.md +63 -0
  23. package/dist/ai/BbBaseRadioIcon.md +187 -0
  24. package/dist/ai/BbBaseRating.md +51 -0
  25. package/dist/ai/BbBaseSelect.md +88 -0
  26. package/dist/ai/BbBaseSlider.md +56 -0
  27. package/dist/ai/BbBaseSwitch.md +49 -0
  28. package/dist/ai/BbBaseSwitchGroup.md +64 -0
  29. package/dist/ai/BbBaseSwitchIcon.md +184 -0
  30. package/dist/ai/BbBaseTag.md +68 -0
  31. package/dist/ai/BbBaseTextInput.md +75 -0
  32. package/dist/ai/BbBaseTextarea.md +62 -0
  33. package/dist/ai/BbBaseTimePickerInput.md +62 -0
  34. package/dist/ai/BbBreadcrumbs.md +542 -503
  35. package/dist/ai/BbButton.md +767 -636
  36. package/dist/ai/BbCheckbox.md +572 -254
  37. package/dist/ai/BbCheckboxGroup.md +561 -361
  38. package/dist/ai/BbCollapsible.md +419 -103
  39. package/dist/ai/BbColorInput.md +529 -323
  40. package/dist/ai/BbColorPalette.md +565 -330
  41. package/dist/ai/BbConfirm.md +612 -136
  42. package/dist/ai/BbConfirmPortal.md +28 -0
  43. package/dist/ai/BbDatePicker.md +244 -0
  44. package/dist/ai/BbDatePickerInput.md +706 -388
  45. package/dist/ai/BbDialog.md +770 -99
  46. package/dist/ai/BbDropdown.md +1054 -763
  47. package/dist/ai/BbDropdownButton.md +511 -615
  48. package/dist/ai/BbDropdownGroup.md +34 -0
  49. package/dist/ai/BbDropzone.md +1148 -436
  50. package/dist/ai/BbForm.md +239 -0
  51. package/dist/ai/BbIcon.md +379 -212
  52. package/dist/ai/BbIndicator.md +283 -0
  53. package/dist/ai/BbNumberInput.md +713 -355
  54. package/dist/ai/BbOffCanvas.md +875 -498
  55. package/dist/ai/BbPagination.md +483 -535
  56. package/dist/ai/BbPopover.md +583 -546
  57. package/dist/ai/BbProgress.md +456 -69
  58. package/dist/ai/BbRadio.md +343 -229
  59. package/dist/ai/BbRadioGroup.md +426 -353
  60. package/dist/ai/BbRating.md +361 -226
  61. package/dist/ai/BbSelect.md +1380 -536
  62. package/dist/ai/BbSelectPopover.md +1240 -1579
  63. package/dist/ai/BbSlider.md +478 -257
  64. package/dist/ai/BbSmoothHeight.md +472 -139
  65. package/dist/ai/BbSpinner.md +718 -131
  66. package/dist/ai/BbSwitch.md +549 -119
  67. package/dist/ai/BbSwitchGroup.md +503 -214
  68. package/dist/ai/BbTable.md +1956 -2358
  69. package/dist/ai/BbTabs.md +1113 -0
  70. package/dist/ai/BbTabsList.md +29 -0
  71. package/dist/ai/BbTabsPanes.md +27 -0
  72. package/dist/ai/BbTabsRoot.md +57 -0
  73. package/dist/ai/BbTag.md +393 -292
  74. package/dist/ai/BbTextInput.md +852 -333
  75. package/dist/ai/BbTextarea.md +836 -255
  76. package/dist/ai/BbTimePicker.md +231 -0
  77. package/dist/ai/BbTimePickerInput.md +196 -0
  78. package/dist/ai/BbToast.md +624 -196
  79. package/dist/ai/BbToastPortal.md +28 -0
  80. package/dist/ai/BbTooltip.md +443 -346
  81. package/dist/ai/BbTree.md +984 -235
  82. package/dist/ai/ChipsBox.md +27 -199
  83. package/dist/ai/ClearableButton.md +21 -55
  84. package/dist/ai/CommaBox.md +25 -200
  85. package/dist/ai/CommonInputWrapper.md +42 -0
  86. package/dist/ai/CommonPopover.md +30 -510
  87. package/dist/ai/ErrorIcon.md +19 -56
  88. package/dist/ai/FlatListBox.md +35 -379
  89. package/dist/ai/GroupedListBox.md +37 -535
  90. package/dist/ai/GuidesComponent.md +21 -0
  91. package/dist/ai/ListBox.md +38 -231
  92. package/dist/ai/OptionsContainer.md +34 -253
  93. package/dist/ai/WarningIcon.md +21 -0
  94. package/dist/ai/components.json +15883 -0
  95. package/dist/ai/composables/useBbConfig.md +80 -0
  96. package/dist/ai/composables/useBbFormContext.md +110 -0
  97. package/dist/ai/composables/useBbTableContext.md +164 -0
  98. package/dist/ai/composables/useBbTabsContext.md +118 -0
  99. package/dist/ai/composables/useBroadcastChannelInstance.md +97 -0
  100. package/dist/ai/composables/useConfirm.md +306 -0
  101. package/dist/ai/composables/useCountdown.md +84 -0
  102. package/dist/ai/composables/useId.md +60 -0
  103. package/dist/ai/composables/useMobile.md +85 -0
  104. package/dist/ai/composables/useToast.md +230 -0
  105. package/dist/ai/guides/agent-contract.md +108 -0
  106. package/dist/ai/guides/ai-router.md +111 -0
  107. package/dist/ai/guides/app-layout.md +295 -0
  108. package/dist/ai/guides/coherence-playbook.md +136 -0
  109. package/dist/ai/guides/component-picker.md +195 -0
  110. package/dist/ai/guides/design-language.md +461 -0
  111. package/dist/ai/guides/design-tokens.md +424 -0
  112. package/dist/ai/guides/fetch-items-playbook.md +161 -0
  113. package/dist/ai/guides/floating-bottom-panel.md +191 -0
  114. package/dist/ai/guides/icons-policy.md +257 -0
  115. package/dist/ai/guides/inertia-helpers.md +1394 -0
  116. package/dist/ai/guides/inline-edit-playbook.md +258 -0
  117. package/dist/ai/guides/installation-and-plugin-setup.md +377 -0
  118. package/dist/ai/guides/migration/components/bb-alert.md +37 -0
  119. package/dist/ai/guides/migration/components/bb-avatar.md +24 -0
  120. package/dist/ai/guides/migration/components/bb-badge.md +110 -0
  121. package/dist/ai/guides/migration/components/bb-breadcrumbs.md +26 -0
  122. package/dist/ai/guides/migration/components/bb-button.md +55 -0
  123. package/dist/ai/guides/migration/components/bb-checkbox-group.md +54 -0
  124. package/dist/ai/guides/migration/components/bb-checkbox.md +45 -0
  125. package/dist/ai/guides/migration/components/bb-chip.md +35 -0
  126. package/dist/ai/guides/migration/components/bb-collapsible.md +26 -0
  127. package/dist/ai/guides/migration/components/bb-color-input.md +23 -0
  128. package/dist/ai/guides/migration/components/bb-color-palette.md +31 -0
  129. package/dist/ai/guides/migration/components/bb-date-picker-input.md +84 -0
  130. package/dist/ai/guides/migration/components/bb-dialog.md +46 -0
  131. package/dist/ai/guides/migration/components/bb-dropdown-button.md +31 -0
  132. package/dist/ai/guides/migration/components/bb-dropdown.md +36 -0
  133. package/dist/ai/guides/migration/components/bb-dropzone.md +27 -0
  134. package/dist/ai/guides/migration/components/bb-icon.md +27 -0
  135. package/dist/ai/guides/migration/components/bb-off-canvas.md +25 -0
  136. package/dist/ai/guides/migration/components/bb-offcanvas.md +54 -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 +58 -0
  141. package/dist/ai/guides/migration/components/bb-select.md +68 -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 +314 -0
  156. package/dist/ai/guides/validated-forms.md +177 -0
  157. package/dist/ai/index.md +156 -32
  158. package/dist/ai/recipes/inertia/approvals-inbox.md +1598 -0
  159. package/dist/ai/recipes/inertia/inline-edit-workspace.md +1733 -0
  160. package/dist/ai/recipes/inertia/onboarding.md +1765 -0
  161. package/dist/ai/recipes/inertia/ownership-atlas.md +1281 -0
  162. package/dist/ai/recipes/inertia/record-form.md +1442 -0
  163. package/dist/ai/recipes/inertia/records-workspace.md +1328 -0
  164. package/dist/ai/recipes/inertia/upload-center.md +1926 -0
  165. package/dist/ai/recipes/inertia/wizard-form.md +1477 -0
  166. package/dist/ai/recipes/nuxt/approvals-inbox.md +1561 -0
  167. package/dist/ai/recipes/nuxt/inline-edit-workspace.md +1690 -0
  168. package/dist/ai/recipes/nuxt/onboarding.md +1698 -0
  169. package/dist/ai/recipes/nuxt/record-form.md +1456 -0
  170. package/dist/ai/recipes/nuxt/records-workspace.md +1314 -0
  171. package/dist/ai/recipes/nuxt/upload-center.md +1847 -0
  172. package/dist/ai/recipes/nuxt/wizard-form.md +1486 -0
  173. package/dist/ai/recipes/vue/approvals-inbox.md +1479 -0
  174. package/dist/ai/recipes/vue/inline-edit-workspace.md +1581 -0
  175. package/dist/ai/recipes/vue/onboarding.md +1653 -0
  176. package/dist/ai/recipes/vue/record-form.md +1540 -0
  177. package/dist/ai/recipes/vue/records-workspace.md +1230 -0
  178. package/dist/ai/recipes/vue/upload-center.md +1806 -0
  179. package/dist/ai/recipes/vue/wizard-form.md +1418 -0
  180. package/dist/ai/source/BbAccordion.md +122 -0
  181. package/dist/ai/source/BbAlert.md +396 -0
  182. package/dist/ai/source/BbAsterisk.md +32 -0
  183. package/dist/ai/source/BbAvatar.md +256 -0
  184. package/dist/ai/source/BbBadge.md +560 -0
  185. package/dist/ai/source/BbBadgeButton.md +490 -0
  186. package/dist/ai/source/BbBaseButton.md +682 -0
  187. package/dist/ai/source/BbBaseCheckbox.md +459 -0
  188. package/dist/ai/source/BbBaseCheckboxGroup.md +554 -0
  189. package/dist/ai/source/BbBaseCheckboxIcon.md +201 -0
  190. package/dist/ai/source/BbBaseColorInput.md +413 -0
  191. package/dist/ai/source/BbBaseColorPalette.md +934 -0
  192. package/dist/ai/source/BbBaseDatePicker.md +1001 -0
  193. package/dist/ai/source/BbBaseDatePickerInput.md +1781 -0
  194. package/dist/ai/source/BbBaseInputContainer.md +1148 -0
  195. package/dist/ai/source/BbBaseNumberInput.md +615 -0
  196. package/dist/ai/source/BbBaseRadio.md +377 -0
  197. package/dist/ai/source/BbBaseRadioGroup.md +499 -0
  198. package/dist/ai/source/BbBaseRadioIcon.md +153 -0
  199. package/dist/ai/source/BbBaseRating.md +573 -0
  200. package/dist/ai/source/BbBaseSelect.md +895 -0
  201. package/dist/ai/source/BbBaseSlider.md +1085 -0
  202. package/dist/ai/source/BbBaseSwitch.md +246 -0
  203. package/dist/ai/source/BbBaseSwitchGroup.md +302 -0
  204. package/dist/ai/source/BbBaseSwitchIcon.md +206 -0
  205. package/dist/ai/source/BbBaseTag.md +688 -0
  206. package/dist/ai/source/BbBaseTextInput.md +511 -0
  207. package/dist/ai/source/BbBaseTextarea.md +480 -0
  208. package/dist/ai/source/BbBaseTimePickerInput.md +1013 -0
  209. package/dist/ai/source/BbBreadcrumbs.md +811 -0
  210. package/dist/ai/source/BbButton.md +990 -0
  211. package/dist/ai/source/BbCheckbox.md +319 -0
  212. package/dist/ai/source/BbCheckboxGroup.md +412 -0
  213. package/dist/ai/source/BbCollapsible.md +133 -0
  214. package/dist/ai/source/BbColorInput.md +315 -0
  215. package/dist/ai/source/BbColorPalette.md +361 -0
  216. package/dist/ai/source/BbConfirm.md +173 -0
  217. package/dist/ai/source/BbConfirmPortal.md +74 -0
  218. package/dist/ai/source/BbDatePicker.md +725 -0
  219. package/dist/ai/source/BbDatePickerInput.md +518 -0
  220. package/dist/ai/source/BbDialog.md +812 -0
  221. package/dist/ai/source/BbDropdown.md +2369 -0
  222. package/dist/ai/source/BbDropdownButton.md +313 -0
  223. package/dist/ai/source/BbDropdownGroup.md +1249 -0
  224. package/dist/ai/source/BbDropzone.md +749 -0
  225. package/dist/ai/source/BbForm.md +100 -0
  226. package/dist/ai/source/BbIcon.md +212 -0
  227. package/dist/ai/source/BbIndicator.md +298 -0
  228. package/dist/ai/source/BbNumberInput.md +365 -0
  229. package/dist/ai/source/BbOffCanvas.md +1260 -0
  230. package/dist/ai/source/BbPagination.md +829 -0
  231. package/dist/ai/source/BbPopover.md +853 -0
  232. package/dist/ai/source/BbProgress.md +140 -0
  233. package/dist/ai/source/BbRadio.md +294 -0
  234. package/dist/ai/source/BbRadioGroup.md +401 -0
  235. package/dist/ai/source/BbRating.md +362 -0
  236. package/dist/ai/source/BbSelect.md +681 -0
  237. package/dist/ai/source/BbSelectPopover.md +2209 -0
  238. package/dist/ai/source/BbSlider.md +371 -0
  239. package/dist/ai/source/BbSmoothHeight.md +261 -0
  240. package/dist/ai/source/BbSpinner.md +127 -0
  241. package/dist/ai/source/BbSwitch.md +175 -0
  242. package/dist/ai/source/BbSwitchGroup.md +240 -0
  243. package/dist/ai/source/BbTable.md +3348 -0
  244. package/dist/ai/source/BbTabs.md +403 -0
  245. package/dist/ai/source/BbTabsList.md +578 -0
  246. package/dist/ai/source/BbTabsPanes.md +368 -0
  247. package/dist/ai/source/BbTabsRoot.md +372 -0
  248. package/dist/ai/source/BbTag.md +383 -0
  249. package/dist/ai/source/BbTextInput.md +345 -0
  250. package/dist/ai/source/BbTextarea.md +330 -0
  251. package/dist/ai/source/BbTimePicker.md +591 -0
  252. package/dist/ai/source/BbTimePickerInput.md +367 -0
  253. package/dist/ai/source/BbToast.md +524 -0
  254. package/dist/ai/source/BbToastPortal.md +482 -0
  255. package/dist/ai/source/BbTooltip.md +508 -0
  256. package/dist/ai/source/BbTree.md +319 -0
  257. package/dist/ai/source/ChipsBox.md +201 -0
  258. package/dist/ai/source/ClearableButton.md +70 -0
  259. package/dist/ai/source/CommaBox.md +202 -0
  260. package/dist/ai/source/CommonInputWrapper.md +554 -0
  261. package/dist/ai/source/CommonPopover.md +606 -0
  262. package/dist/ai/source/ErrorIcon.md +43 -0
  263. package/dist/ai/source/FlatListBox.md +396 -0
  264. package/dist/ai/source/GroupedListBox.md +540 -0
  265. package/dist/ai/source/GuidesComponent.md +383 -0
  266. package/dist/ai/source/ListBox.md +238 -0
  267. package/dist/ai/source/OptionsContainer.md +191 -0
  268. package/dist/ai/source/WarningIcon.md +47 -0
  269. package/dist/alert-variants.d.ts +12 -0
  270. package/dist/assets/css/reset.css_inline.js +4 -0
  271. package/dist/assets/svgs/alert.svg_raw.js +4 -0
  272. package/dist/assets/svgs/calendar.svg_raw.js +4 -0
  273. package/dist/assets/svgs/check_stroke.svg_raw.js +4 -0
  274. package/dist/assets/svgs/chevron_down.svg_raw.js +4 -0
  275. package/dist/assets/svgs/chevron_right.svg_raw.js +4 -0
  276. package/dist/assets/svgs/clear.svg_raw.js +4 -0
  277. package/dist/assets/svgs/clock.svg_raw.js +4 -0
  278. package/dist/assets/svgs/error.svg_raw.js +4 -0
  279. package/dist/assets/svgs/search.svg_raw.js +4 -0
  280. package/dist/assets/svgs/sort.svg_raw.js +4 -0
  281. package/dist/assets/svgs/spinner.svg_raw.js +4 -0
  282. package/dist/assets/svgs/user.svg_raw.js +4 -0
  283. package/dist/badge-variants.d.ts +18 -0
  284. package/dist/button-variants.d.ts +15 -0
  285. package/dist/components/BbAccordion/BbAccordion.vue.d.ts +9 -3
  286. package/dist/components/BbAccordion/BbAccordion.vue.js +6 -0
  287. package/dist/components/BbAccordion/BbAccordion.vue_vue_type_script_setup_true_lang.js +66 -0
  288. package/dist/components/BbAccordion/types.d.ts +10 -7
  289. package/dist/components/BbAlert/BbAlert.vue.d.ts +12 -3
  290. package/dist/components/BbAlert/BbAlert.vue.js +6 -0
  291. package/dist/components/BbAlert/BbAlert.vue_vue_type_script_setup_true_lang.js +65 -0
  292. package/dist/components/BbAlert/types.d.ts +51 -12
  293. package/dist/components/BbAsterisk/BbAsterisk.vue.d.ts +3 -0
  294. package/dist/components/BbAsterisk/BbAsterisk.vue.js +6 -0
  295. package/dist/components/BbAsterisk/BbAsterisk.vue_vue_type_script_setup_true_lang.js +13 -0
  296. package/dist/components/BbAvatar/BbAvatar.vue.d.ts +5 -0
  297. package/dist/components/BbAvatar/BbAvatar.vue.js +6 -0
  298. package/dist/components/BbAvatar/BbAvatar.vue_vue_type_script_setup_true_lang.js +78 -0
  299. package/dist/components/BbAvatar/types.d.ts +4 -5
  300. package/dist/components/BbBadge/BadgeAppendIcon.vue.d.ts +3 -0
  301. package/dist/components/BbBadge/BadgeAppendIcon.vue.js +5 -0
  302. package/dist/components/BbBadge/BadgeAppendIcon.vue_vue_type_script_setup_true_lang.js +22 -0
  303. package/dist/components/BbBadge/BadgeBodyContent.vue.d.ts +15 -0
  304. package/dist/components/BbBadge/BadgeBodyContent.vue.js +5 -0
  305. package/dist/components/BbBadge/BadgeBodyContent.vue_vue_type_script_setup_true_lang.js +34 -0
  306. package/dist/components/BbBadge/BbBadge.vue.d.ts +8 -1
  307. package/dist/components/BbBadge/BbBadge.vue.js +6 -0
  308. package/dist/components/BbBadge/BbBadge.vue_vue_type_script_setup_true_lang.js +83 -0
  309. package/dist/components/BbBadge/BbBadgeButton.vue.d.ts +12 -0
  310. package/dist/components/BbBadge/BbBadgeButton.vue.js +5 -0
  311. package/dist/components/BbBadge/BbBadgeButton.vue_vue_type_script_setup_true_lang.js +54 -0
  312. package/dist/components/BbBadge/badgeButtonContext.d.ts +27 -0
  313. package/dist/components/BbBadge/badgeButtonContext.js +5 -0
  314. package/dist/components/BbBadge/types.d.ts +61 -16
  315. package/dist/components/BbBaseButton/BbBaseButton.vue.d.ts +13 -0
  316. package/dist/components/BbBaseButton/BbBaseButton.vue.js +6 -0
  317. package/dist/components/BbBaseButton/BbBaseButton.vue_vue_type_script_setup_true_lang.js +171 -0
  318. package/dist/components/BbBaseButton/RouterComponent.vue.js +5 -0
  319. package/dist/components/BbBaseButton/RouterComponent.vue_vue_type_script_setup_true_lang.js +28 -0
  320. package/dist/components/BbBaseButton/types.d.ts +191 -0
  321. package/dist/components/BbBaseButton/types.js +33 -0
  322. package/dist/components/BbBaseCheckbox/BbBaseCheckbox.vue.d.ts +40 -0
  323. package/dist/components/BbBaseCheckbox/BbBaseCheckbox.vue.js +6 -0
  324. package/dist/components/BbBaseCheckbox/BbBaseCheckbox.vue_vue_type_script_setup_true_lang.js +145 -0
  325. package/dist/components/BbBaseCheckbox/types.d.ts +222 -0
  326. package/dist/components/BbBaseCheckboxGroup/BbBaseCheckboxGroup.vue.d.ts +19 -0
  327. package/dist/components/BbBaseCheckboxGroup/BbBaseCheckboxGroup.vue.js +6 -0
  328. package/dist/components/BbBaseCheckboxGroup/BbBaseCheckboxGroup.vue_vue_type_script_setup_true_lang.js +190 -0
  329. package/dist/components/BbBaseCheckboxGroup/types.d.ts +257 -0
  330. package/dist/components/BbBaseCheckboxIcon/BbBaseCheckboxIcon.vue.d.ts +4 -0
  331. package/dist/components/BbBaseCheckboxIcon/BbBaseCheckboxIcon.vue.js +6 -0
  332. package/dist/components/BbBaseCheckboxIcon/BbBaseCheckboxIcon.vue_vue_type_script_setup_true_lang.js +43 -0
  333. package/dist/components/BbBaseCheckboxIcon/types.d.ts +47 -0
  334. package/dist/components/BbBaseColorInput/BbBaseColorInput.vue.d.ts +42 -0
  335. package/dist/components/BbBaseColorInput/BbBaseColorInput.vue.js +6 -0
  336. package/dist/components/BbBaseColorInput/BbBaseColorInput.vue_vue_type_script_setup_true_lang.js +178 -0
  337. package/dist/components/BbBaseColorInput/types.d.ts +207 -0
  338. package/dist/components/BbBaseColorPalette/BbBaseColorPalette.vue.d.ts +13 -0
  339. package/dist/components/BbBaseColorPalette/BbBaseColorPalette.vue.js +6 -0
  340. package/dist/components/BbBaseColorPalette/BbBaseColorPalette.vue_vue_type_script_setup_true_lang.js +395 -0
  341. package/dist/components/BbBaseColorPalette/types.d.ts +40 -0
  342. package/dist/components/BbBaseDatePicker/BbBaseDatePicker.vue.js +6 -0
  343. package/dist/components/BbBaseDatePicker/BbBaseDatePicker.vue_vue_type_script_setup_true_lang.js +300 -0
  344. package/dist/components/BbBaseDatePicker/BbBaseDatePickerInputDaySelector.vue.d.ts +44 -0
  345. package/dist/components/BbBaseDatePicker/BbBaseDatePickerInputDaySelector.vue.js +5 -0
  346. package/dist/components/BbBaseDatePicker/BbBaseDatePickerInputDaySelector.vue_vue_type_script_setup_true_lang.js +310 -0
  347. package/dist/components/BbBaseDatePicker/BbBaseDatePickerMonthSelector.vue.d.ts +5 -0
  348. package/dist/components/BbBaseDatePicker/BbBaseDatePickerMonthSelector.vue.js +5 -0
  349. package/dist/components/BbBaseDatePicker/BbBaseDatePickerMonthSelector.vue_vue_type_script_setup_true_lang.js +63 -0
  350. package/dist/components/BbBaseDatePicker/BbBaseDatePickerYearSelector.vue.d.ts +5 -0
  351. package/dist/components/BbBaseDatePicker/BbBaseDatePickerYearSelector.vue.js +5 -0
  352. package/dist/components/BbBaseDatePicker/BbBaseDatePickerYearSelector.vue_vue_type_script_setup_true_lang.js +75 -0
  353. package/dist/components/BbBaseDatePicker/typeahead.d.ts +112 -0
  354. package/dist/components/BbBaseDatePicker/typeahead.js +37 -0
  355. package/dist/components/BbBaseDatePicker/types.d.ts +97 -0
  356. package/dist/components/BbBaseDatePicker/useDatePickerContext.d.ts +58 -0
  357. package/dist/components/BbBaseDatePicker/useDatePickerContext.js +11 -0
  358. package/dist/components/BbBaseDatePickerInput/BbBaseDatePickerInput.vue.d.ts +30 -0
  359. package/dist/components/BbBaseDatePickerInput/BbBaseDatePickerInput.vue.js +6 -0
  360. package/dist/components/BbBaseDatePickerInput/BbBaseDatePickerInput.vue_vue_type_script_setup_true_lang.js +713 -0
  361. package/dist/components/BbBaseDatePickerInput/BbBaseDatePickerTimeSelector.vue.d.ts +30 -0
  362. package/dist/components/BbBaseDatePickerInput/BbBaseDatePickerTimeSelector.vue.js +6 -0
  363. package/dist/components/BbBaseDatePickerInput/BbBaseDatePickerTimeSelector.vue_vue_type_script_setup_true_lang.js +204 -0
  364. package/dist/components/BbBaseDatePickerInput/types.d.ts +309 -0
  365. package/dist/components/BbBaseInputContainer/BbBaseInputContainer.vue.d.ts +17 -0
  366. package/dist/components/BbBaseInputContainer/BbBaseInputContainer.vue.js +6 -0
  367. package/dist/components/BbBaseInputContainer/BbBaseInputContainer.vue_vue_type_script_setup_true_lang.js +184 -0
  368. package/dist/components/BbBaseInputContainer/types.d.ts +185 -0
  369. package/dist/components/BbBaseNumberInput/BbBaseNumberInput.vue.d.ts +52 -0
  370. package/dist/components/BbBaseNumberInput/BbBaseNumberInput.vue.js +6 -0
  371. package/dist/components/BbBaseNumberInput/BbBaseNumberInput.vue_vue_type_script_setup_true_lang.js +211 -0
  372. package/dist/components/BbBaseNumberInput/types.d.ts +211 -0
  373. package/dist/components/BbBaseRadio/BbBaseRadio.vue.d.ts +33 -0
  374. package/dist/components/BbBaseRadio/BbBaseRadio.vue.js +6 -0
  375. package/dist/components/BbBaseRadio/BbBaseRadio.vue_vue_type_script_setup_true_lang.js +114 -0
  376. package/dist/components/BbBaseRadio/types.d.ts +179 -0
  377. package/dist/components/BbBaseRadioGroup/BbBaseRadioGroup.vue.d.ts +19 -0
  378. package/dist/components/BbBaseRadioGroup/BbBaseRadioGroup.vue.js +6 -0
  379. package/dist/components/BbBaseRadioGroup/BbBaseRadioGroup.vue_vue_type_script_setup_true_lang.js +172 -0
  380. package/dist/components/BbBaseRadioGroup/types.d.ts +215 -0
  381. package/dist/components/BbBaseRadioIcon/BbBaseRadioIcon.vue.d.ts +4 -0
  382. package/dist/components/BbBaseRadioIcon/BbBaseRadioIcon.vue.js +6 -0
  383. package/dist/components/BbBaseRadioIcon/BbBaseRadioIcon.vue_vue_type_script_setup_true_lang.js +28 -0
  384. package/dist/components/BbBaseRadioIcon/types.d.ts +41 -0
  385. package/dist/components/BbBaseRating/BbBaseRating.vue.d.ts +38 -0
  386. package/dist/components/BbBaseRating/BbBaseRating.vue.js +6 -0
  387. package/dist/components/BbBaseRating/BbBaseRating.vue_vue_type_script_setup_true_lang.js +184 -0
  388. package/dist/components/BbBaseRating/types.d.ts +168 -0
  389. package/dist/components/BbBaseSelect/BbBaseSelect.vue.d.ts +19 -0
  390. package/dist/components/BbBaseSelect/BbBaseSelect.vue.js +6 -0
  391. package/dist/components/BbBaseSelect/BbBaseSelect.vue_vue_type_script_setup_true_lang.js +307 -0
  392. package/dist/components/BbBaseSelect/types.d.ts +294 -0
  393. package/dist/components/BbBaseSlider/BbBaseSlider.vue.d.ts +35 -0
  394. package/dist/components/BbBaseSlider/BbBaseSlider.vue.js +6 -0
  395. package/dist/components/BbBaseSlider/BbBaseSlider.vue_vue_type_script_setup_true_lang.js +324 -0
  396. package/dist/components/BbBaseSlider/types.d.ts +200 -0
  397. package/dist/components/BbBaseSwitch/BbBaseSwitch.vue.d.ts +35 -0
  398. package/dist/components/BbBaseSwitch/BbBaseSwitch.vue.js +6 -0
  399. package/dist/components/BbBaseSwitch/BbBaseSwitch.vue_vue_type_script_setup_true_lang.js +146 -0
  400. package/dist/components/BbBaseSwitch/types.d.ts +10 -0
  401. package/dist/components/BbBaseSwitchGroup/BbBaseSwitchGroup.vue.d.ts +19 -0
  402. package/dist/components/BbBaseSwitchGroup/BbBaseSwitchGroup.vue.js +6 -0
  403. package/dist/components/BbBaseSwitchGroup/BbBaseSwitchGroup.vue_vue_type_script_setup_true_lang.js +190 -0
  404. package/dist/components/BbBaseSwitchGroup/types.d.ts +8 -0
  405. package/dist/components/BbBaseSwitchIcon/BbBaseSwitchIcon.vue.d.ts +4 -0
  406. package/dist/components/BbBaseSwitchIcon/BbBaseSwitchIcon.vue.js +6 -0
  407. package/dist/components/BbBaseSwitchIcon/BbBaseSwitchIcon.vue_vue_type_script_setup_true_lang.js +30 -0
  408. package/dist/components/BbBaseSwitchIcon/types.d.ts +48 -0
  409. package/dist/components/BbBaseTag/BbBaseTag.vue.d.ts +50 -0
  410. package/dist/components/BbBaseTag/BbBaseTag.vue.js +6 -0
  411. package/dist/components/BbBaseTag/BbBaseTag.vue_vue_type_script_setup_true_lang.js +266 -0
  412. package/dist/components/BbBaseTag/types.d.ts +160 -0
  413. package/dist/components/BbBaseTextInput/BbBaseTextInput.vue.d.ts +45 -0
  414. package/dist/components/BbBaseTextInput/BbBaseTextInput.vue.js +6 -0
  415. package/dist/components/BbBaseTextInput/BbBaseTextInput.vue_vue_type_script_setup_true_lang.js +200 -0
  416. package/dist/components/BbBaseTextInput/types.d.ts +209 -0
  417. package/dist/components/BbBaseTextarea/BbBaseTextarea.vue.d.ts +39 -0
  418. package/dist/components/BbBaseTextarea/BbBaseTextarea.vue.js +6 -0
  419. package/dist/components/BbBaseTextarea/BbBaseTextarea.vue_vue_type_script_setup_true_lang.js +175 -0
  420. package/dist/components/BbBaseTextarea/types.d.ts +170 -0
  421. package/dist/components/BbBaseTimePickerInput/BbBaseTimePickerInput.vue.d.ts +27 -0
  422. package/dist/components/BbBaseTimePickerInput/BbBaseTimePickerInput.vue.js +6 -0
  423. package/dist/components/BbBaseTimePickerInput/BbBaseTimePickerInput.vue_vue_type_script_setup_true_lang.js +517 -0
  424. package/dist/components/BbBaseTimePickerInput/types.d.ts +151 -0
  425. package/dist/components/BbBreadcrumbs/BbBreadcrumbs.vue.d.ts +0 -1
  426. package/dist/components/BbBreadcrumbs/BbBreadcrumbs.vue.js +6 -0
  427. package/dist/components/BbBreadcrumbs/BbBreadcrumbs.vue_vue_type_script_setup_true_lang.js +224 -0
  428. package/dist/components/BbBreadcrumbs/estimateBreadcrumbItemWidth.js +47 -0
  429. package/dist/components/BbBreadcrumbs/types.d.ts +33 -22
  430. package/dist/components/BbButton/BbButton.vue.d.ts +6 -5
  431. package/dist/components/BbButton/BbButton.vue.js +6 -0
  432. package/dist/components/BbButton/BbButton.vue_vue_type_script_setup_true_lang.js +177 -0
  433. package/dist/components/BbButton/types.d.ts +48 -47
  434. package/dist/components/BbCheckbox/BbCheckbox.vue.d.ts +4 -3
  435. package/dist/components/BbCheckbox/BbCheckbox.vue.js +6 -0
  436. package/dist/components/BbCheckbox/BbCheckbox.vue_vue_type_script_setup_true_lang.js +146 -0
  437. package/dist/components/BbCheckbox/types.d.ts +24 -10
  438. package/dist/components/BbCheckboxGroup/BbCheckboxGroup.vue.d.ts +2 -13
  439. package/dist/components/BbCheckboxGroup/BbCheckboxGroup.vue.js +6 -0
  440. package/dist/components/BbCheckboxGroup/BbCheckboxGroup.vue_vue_type_script_setup_true_lang.js +190 -0
  441. package/dist/components/BbCheckboxGroup/types.d.ts +44 -23
  442. package/dist/components/BbCollapsible/BbCollapsible.vue.d.ts +2 -1
  443. package/dist/components/BbCollapsible/BbCollapsible.vue.js +6 -0
  444. package/dist/components/BbCollapsible/BbCollapsible.vue_vue_type_script_setup_true_lang.js +31 -0
  445. package/dist/components/BbCollapsible/types.d.ts +10 -9
  446. package/dist/components/BbColorInput/BbColorInput.vue.d.ts +10 -1
  447. package/dist/components/BbColorInput/BbColorInput.vue.js +6 -0
  448. package/dist/components/BbColorInput/BbColorInput.vue_vue_type_script_setup_true_lang.js +177 -0
  449. package/dist/components/BbColorInput/types.d.ts +37 -11
  450. package/dist/components/BbColorPalette/BbColorPalette.vue.d.ts +5 -8
  451. package/dist/components/BbColorPalette/BbColorPalette.vue.js +5 -0
  452. package/dist/components/BbColorPalette/BbColorPalette.vue_vue_type_script_setup_true_lang.js +125 -0
  453. package/dist/components/BbColorPalette/types.d.ts +66 -53
  454. package/dist/components/BbConfirm/BbConfirm.vue.js +6 -0
  455. package/dist/components/BbConfirm/BbConfirm.vue_vue_type_script_setup_true_lang.js +130 -0
  456. package/dist/components/BbConfirm/BbConfirmPortal.vue.d.ts +5 -6
  457. package/dist/components/BbConfirm/BbConfirmPortal.vue.js +5 -0
  458. package/dist/components/BbConfirm/BbConfirmPortal.vue_vue_type_script_setup_true_lang.js +19 -0
  459. package/dist/components/BbDatePicker/BbDatePicker.vue.d.ts +37 -0
  460. package/dist/components/BbDatePicker/BbDatePicker.vue.js +6 -0
  461. package/dist/components/BbDatePicker/BbDatePicker.vue_vue_type_script_setup_true_lang.js +319 -0
  462. package/dist/components/BbDatePicker/types.d.ts +155 -0
  463. package/dist/components/BbDatePickerInput/BbDatePickerInput.vue.d.ts +3 -1
  464. package/dist/components/BbDatePickerInput/BbDatePickerInput.vue.js +6 -0
  465. package/dist/components/BbDatePickerInput/BbDatePickerInput.vue_vue_type_script_setup_true_lang.js +179 -0
  466. package/dist/components/BbDatePickerInput/types.d.ts +127 -16
  467. package/dist/components/BbDialog/BbDialog.vue.d.ts +8 -6
  468. package/dist/components/BbDialog/BbDialog.vue.js +6 -0
  469. package/dist/components/BbDialog/BbDialog.vue_vue_type_script_setup_true_lang.js +214 -0
  470. package/dist/components/BbDialog/types.d.ts +146 -1
  471. package/dist/components/BbDialog/useDialogStack.d.ts +5 -0
  472. package/dist/components/BbDialog/useDialogStack.js +20 -0
  473. package/dist/components/BbDropdown/AdaptiveDropdown.vue.d.ts +18 -0
  474. package/dist/components/BbDropdown/AdaptiveDropdown.vue.js +6 -0
  475. package/dist/components/BbDropdown/AdaptiveDropdown.vue_vue_type_script_setup_true_lang.js +116 -0
  476. package/dist/components/BbDropdown/BbDropdown.vue.d.ts +14 -7
  477. package/dist/components/BbDropdown/BbDropdown.vue.js +6 -0
  478. package/dist/components/BbDropdown/BbDropdown.vue_vue_type_script_setup_true_lang.js +560 -0
  479. package/dist/components/BbDropdown/BbDropdownGroup.vue.d.ts +44 -0
  480. package/dist/components/BbDropdown/BbDropdownGroup.vue.js +5 -0
  481. package/dist/components/BbDropdown/BbDropdownGroup.vue_vue_type_script_setup_true_lang.js +36 -0
  482. package/dist/components/BbDropdown/BbDropdownList.vue.d.ts +27 -0
  483. package/dist/components/BbDropdown/BbDropdownList.vue.js +6 -0
  484. package/dist/components/BbDropdown/BbDropdownList.vue_vue_type_script_setup_true_lang.js +464 -0
  485. package/dist/components/BbDropdown/DropdownPipelineResolver.vue.d.ts +16 -0
  486. package/dist/components/BbDropdown/DropdownPipelineResolver.vue.js +5 -0
  487. package/dist/components/BbDropdown/DropdownPipelineResolver.vue_vue_type_script_setup_true_lang.js +168 -0
  488. package/dist/components/BbDropdown/normalizeGroups.d.ts +18 -0
  489. package/dist/components/BbDropdown/normalizeGroups.js +46 -0
  490. package/dist/components/BbDropdown/types.d.ts +457 -45
  491. package/dist/components/BbDropdown/types.js +4 -0
  492. package/dist/components/BbDropdown/useDropdownContext.d.ts +89 -0
  493. package/dist/components/BbDropdown/useDropdownContext.js +9 -0
  494. package/dist/components/BbDropdown/useDropdownGroupRegistry.d.ts +108 -0
  495. package/dist/components/BbDropdown/useDropdownGroupRegistry.js +5 -0
  496. package/dist/components/BbDropdownButton/BbDropdownButton.vue.d.ts +3 -3
  497. package/dist/components/BbDropdownButton/BbDropdownButton.vue.js +6 -0
  498. package/dist/components/BbDropdownButton/BbDropdownButton.vue_vue_type_script_setup_true_lang.js +119 -0
  499. package/dist/components/BbDropdownButton/types.d.ts +45 -52
  500. package/dist/components/BbDropzone/BbDropzone.vue.d.ts +5 -4
  501. package/dist/components/BbDropzone/BbDropzone.vue.js +6 -0
  502. package/dist/components/BbDropzone/BbDropzone.vue_vue_type_script_setup_true_lang.js +284 -0
  503. package/dist/components/BbDropzone/types.d.ts +55 -7
  504. package/dist/components/BbIcon/BbIcon.vue.d.ts +3 -2
  505. package/dist/components/BbIcon/BbIcon.vue.js +6 -0
  506. package/dist/components/BbIcon/BbIcon.vue_vue_type_script_setup_true_lang.js +65 -0
  507. package/dist/components/BbIcon/types.d.ts +6 -19
  508. package/dist/components/BbIndicator/BbIndicator.vue.d.ts +14 -0
  509. package/dist/components/BbIndicator/BbIndicator.vue.js +6 -0
  510. package/dist/components/BbIndicator/BbIndicator.vue_vue_type_script_setup_true_lang.js +56 -0
  511. package/dist/components/BbIndicator/types.d.ts +49 -0
  512. package/dist/components/BbNumberInput/BbNumberInput.vue.d.ts +12 -6
  513. package/dist/components/BbNumberInput/BbNumberInput.vue.js +6 -0
  514. package/dist/components/BbNumberInput/BbNumberInput.vue_vue_type_script_setup_true_lang.js +194 -0
  515. package/dist/components/BbNumberInput/types.d.ts +31 -4
  516. package/dist/components/BbOffCanvas/BbOffCanvas.vue.d.ts +10 -10
  517. package/dist/components/BbOffCanvas/BbOffCanvas.vue.js +6 -0
  518. package/dist/components/BbOffCanvas/BbOffCanvas.vue_vue_type_script_setup_true_lang.js +284 -0
  519. package/dist/components/BbOffCanvas/types.d.ts +71 -39
  520. package/dist/components/BbOffCanvas/useOffCanvasStack.d.ts +25 -0
  521. package/dist/components/BbOffCanvas/useOffCanvasStack.js +68 -0
  522. package/dist/components/BbPagination/BbPagination.vue.d.ts +3 -4
  523. package/dist/components/BbPagination/BbPagination.vue.js +6 -0
  524. package/dist/components/BbPagination/BbPagination.vue_vue_type_script_setup_true_lang.js +244 -0
  525. package/dist/components/BbPagination/paginationFit.d.ts +38 -0
  526. package/dist/components/BbPagination/paginationFit.js +13 -0
  527. package/dist/components/BbPagination/types.d.ts +51 -16
  528. package/dist/components/BbPopover/BbPopover.vue.d.ts +10 -15
  529. package/dist/components/BbPopover/BbPopover.vue.js +6 -0
  530. package/dist/components/BbPopover/BbPopover.vue_vue_type_script_setup_true_lang.js +310 -0
  531. package/dist/components/BbPopover/escapeStack.d.ts +6 -0
  532. package/dist/components/BbPopover/escapeStack.js +10 -0
  533. package/dist/components/BbPopover/types.d.ts +84 -31
  534. package/dist/components/BbProgress/BbProgress.vue.d.ts +1 -0
  535. package/dist/components/BbProgress/BbProgress.vue.js +6 -0
  536. package/dist/components/BbProgress/BbProgress.vue_vue_type_script_setup_true_lang.js +36 -0
  537. package/dist/components/BbProgress/types.d.ts +15 -1
  538. package/dist/components/BbRadio/BbRadio.vue.d.ts +5 -3
  539. package/dist/components/BbRadio/BbRadio.vue.js +6 -0
  540. package/dist/components/BbRadio/BbRadio.vue_vue_type_script_setup_true_lang.js +133 -0
  541. package/dist/components/BbRadio/types.d.ts +23 -9
  542. package/dist/components/BbRadioGroup/BbRadioGroup.vue.d.ts +4 -14
  543. package/dist/components/BbRadioGroup/BbRadioGroup.vue.js +6 -0
  544. package/dist/components/BbRadioGroup/BbRadioGroup.vue_vue_type_script_setup_true_lang.js +184 -0
  545. package/dist/components/BbRadioGroup/types.d.ts +41 -22
  546. package/dist/components/BbRating/BbRating.vue.d.ts +4 -1
  547. package/dist/components/BbRating/BbRating.vue.js +6 -0
  548. package/dist/components/BbRating/BbRating.vue_vue_type_script_setup_true_lang.js +150 -0
  549. package/dist/components/BbRating/types.d.ts +37 -10
  550. package/dist/components/BbSelect/BbSelect.vue.d.ts +2 -11
  551. package/dist/components/BbSelect/BbSelect.vue.js +6 -0
  552. package/dist/components/BbSelect/BbSelect.vue_vue_type_script_setup_true_lang.js +241 -0
  553. package/dist/components/BbSelect/types.d.ts +105 -59
  554. package/dist/components/BbSelectPopover/BbSelectPopover.vue.d.ts +1 -10
  555. package/dist/components/BbSelectPopover/BbSelectPopover.vue.js +6 -0
  556. package/dist/components/BbSelectPopover/BbSelectPopover.vue_vue_type_script_setup_true_lang.js +637 -0
  557. package/dist/components/BbSelectPopover/types.d.ts +189 -102
  558. package/dist/components/BbSlider/BbSlider.vue.d.ts +3 -6
  559. package/dist/components/BbSlider/BbSlider.vue.js +6 -0
  560. package/dist/components/BbSlider/BbSlider.vue_vue_type_script_setup_true_lang.js +166 -0
  561. package/dist/components/BbSlider/types.d.ts +37 -13
  562. package/dist/components/BbSmoothHeight/BbSmoothHeight.vue.d.ts +3 -1
  563. package/dist/components/BbSmoothHeight/BbSmoothHeight.vue.js +6 -0
  564. package/dist/components/BbSmoothHeight/BbSmoothHeight.vue_vue_type_script_setup_true_lang.js +79 -0
  565. package/dist/components/BbSmoothHeight/types.d.ts +13 -2
  566. package/dist/components/BbSpinner/BbSpinner.vue.d.ts +1 -1
  567. package/dist/components/BbSpinner/BbSpinner.vue.js +6 -0
  568. package/dist/components/BbSpinner/BbSpinner.vue_vue_type_script_setup_true_lang.js +30 -0
  569. package/dist/components/BbSpinner/types.d.ts +10 -3
  570. package/dist/components/BbSwitch/BbSwitch.vue.d.ts +5 -3
  571. package/dist/components/BbSwitch/BbSwitch.vue.js +6 -0
  572. package/dist/components/BbSwitch/BbSwitch.vue_vue_type_script_setup_true_lang.js +142 -0
  573. package/dist/components/BbSwitch/types.d.ts +3 -1
  574. package/dist/components/BbSwitchGroup/BbSwitchGroup.vue.d.ts +4 -14
  575. package/dist/components/BbSwitchGroup/BbSwitchGroup.vue.js +6 -0
  576. package/dist/components/BbSwitchGroup/BbSwitchGroup.vue_vue_type_script_setup_true_lang.js +190 -0
  577. package/dist/components/BbSwitchGroup/types.d.ts +3 -22
  578. package/dist/components/BbTable/BbTable.vue.d.ts +53 -31
  579. package/dist/components/BbTable/BbTable.vue.js +6 -0
  580. package/dist/components/BbTable/BbTable.vue_vue_type_script_setup_true_lang.js +889 -0
  581. package/dist/components/BbTable/types.d.ts +176 -37
  582. package/dist/components/BbTable/utils.d.ts +9 -1
  583. package/dist/components/BbTable/utils.js +53 -0
  584. package/dist/components/BbTabs/BbTabs.vue.d.ts +20 -0
  585. package/dist/components/BbTabs/BbTabs.vue.js +6 -0
  586. package/dist/components/BbTabs/BbTabs.vue_vue_type_script_setup_true_lang.js +64 -0
  587. package/dist/components/BbTabs/BbTabsList.vue.d.ts +19 -0
  588. package/dist/components/BbTabs/BbTabsList.vue.js +6 -0
  589. package/dist/components/BbTabs/BbTabsList.vue_vue_type_script_setup_true_lang.js +123 -0
  590. package/dist/components/BbTabs/BbTabsPanes.vue.d.ts +16 -0
  591. package/dist/components/BbTabs/BbTabsPanes.vue.js +6 -0
  592. package/dist/components/BbTabs/BbTabsPanes.vue_vue_type_script_setup_true_lang.js +35 -0
  593. package/dist/components/BbTabs/BbTabsRoot.vue.d.ts +20 -0
  594. package/dist/components/BbTabs/BbTabsRoot.vue.js +5 -0
  595. package/dist/components/BbTabs/BbTabsRoot.vue_vue_type_script_setup_true_lang.js +55 -0
  596. package/dist/components/BbTabs/types.d.ts +264 -0
  597. package/dist/components/BbTag/BbTag.vue.d.ts +19 -6
  598. package/dist/components/BbTag/BbTag.vue.js +6 -0
  599. package/dist/components/BbTag/BbTag.vue_vue_type_script_setup_true_lang.js +187 -0
  600. package/dist/components/BbTag/types.d.ts +48 -17
  601. package/dist/components/BbTextInput/BbTextInput.vue.d.ts +10 -1
  602. package/dist/components/BbTextInput/BbTextInput.vue.js +6 -0
  603. package/dist/components/BbTextInput/BbTextInput.vue_vue_type_script_setup_true_lang.js +195 -0
  604. package/dist/components/BbTextInput/types.d.ts +24 -4
  605. package/dist/components/BbTextarea/BbTextarea.vue.d.ts +10 -1
  606. package/dist/components/BbTextarea/BbTextarea.vue.js +6 -0
  607. package/dist/components/BbTextarea/BbTextarea.vue_vue_type_script_setup_true_lang.js +178 -0
  608. package/dist/components/BbTextarea/types.d.ts +26 -2
  609. package/dist/components/BbTimePicker/BbTimePicker.vue.d.ts +33 -0
  610. package/dist/components/BbTimePicker/BbTimePicker.vue.js +6 -0
  611. package/dist/components/BbTimePicker/BbTimePicker.vue_vue_type_script_setup_true_lang.js +244 -0
  612. package/dist/components/BbTimePicker/types.d.ts +129 -0
  613. package/dist/components/BbTimePickerInput/BbTimePickerInput.vue.d.ts +25 -0
  614. package/dist/components/BbTimePickerInput/BbTimePickerInput.vue.js +6 -0
  615. package/dist/components/BbTimePickerInput/BbTimePickerInput.vue_vue_type_script_setup_true_lang.js +157 -0
  616. package/dist/components/BbTimePickerInput/types.d.ts +165 -0
  617. package/dist/components/BbToast/BbToast.vue.d.ts +2 -3
  618. package/dist/components/BbToast/BbToast.vue.js +6 -0
  619. package/dist/components/BbToast/BbToast.vue_vue_type_script_setup_true_lang.js +35 -0
  620. package/dist/components/BbToast/BbToastMessage.vue.d.ts +17 -8
  621. package/dist/components/BbToast/BbToastMessage.vue.js +5 -0
  622. package/dist/components/BbToast/BbToastMessage.vue_vue_type_script_setup_true_lang.js +170 -0
  623. package/dist/components/BbToast/BbToastPortal.vue.d.ts +30 -0
  624. package/dist/components/BbToast/BbToastPortal.vue.js +5 -0
  625. package/dist/components/BbToast/BbToastPortal.vue_vue_type_script_setup_true_lang.js +19 -0
  626. package/dist/components/BbToast/BbToastRegion.vue.d.ts +8 -0
  627. package/dist/components/BbToast/BbToastRegion.vue.js +5 -0
  628. package/dist/components/BbToast/BbToastRegion.vue_vue_type_script_setup_true_lang.js +100 -0
  629. package/dist/components/BbToast/types.d.ts +69 -5
  630. package/dist/components/BbTooltip/BbTooltip.vue.d.ts +4 -3
  631. package/dist/components/BbTooltip/BbTooltip.vue.js +6 -0
  632. package/dist/components/BbTooltip/BbTooltip.vue_vue_type_script_setup_true_lang.js +160 -0
  633. package/dist/components/BbTooltip/types.d.ts +61 -11
  634. package/dist/components/BbTree/BbTree.vue.d.ts +26 -13
  635. package/dist/components/BbTree/BbTree.vue.js +6 -0
  636. package/dist/components/BbTree/BbTree.vue_vue_type_script_setup_true_lang.js +55 -0
  637. package/dist/components/BbTree/BbTreeLevel.vue.d.ts +19 -0
  638. package/dist/components/BbTree/BbTreeLevel.vue.js +5 -0
  639. package/dist/components/BbTree/BbTreeLevel.vue_vue_type_script_setup_true_lang.js +94 -0
  640. package/dist/components/BbTree/context.d.ts +17 -0
  641. package/dist/components/BbTree/context.js +4 -0
  642. package/dist/components/BbTree/types.d.ts +93 -42
  643. package/dist/components/ChipsBox/ChipsBox.vue.d.ts +2 -1
  644. package/dist/components/ChipsBox/ChipsBox.vue.js +5 -0
  645. package/dist/components/ChipsBox/ChipsBox.vue_vue_type_script_setup_true_lang.js +98 -0
  646. package/dist/components/ChipsBox/types.d.ts +12 -5
  647. package/dist/components/ClearableButton/ClearableButton.vue.d.ts +2 -1
  648. package/dist/components/ClearableButton/ClearableButton.vue.js +6 -0
  649. package/dist/components/ClearableButton/ClearableButton.vue_vue_type_script_setup_true_lang.js +19 -0
  650. package/dist/components/ClearableButton/types.d.ts +7 -1
  651. package/dist/components/CloseIcon/CloseButton.vue.d.ts +5 -0
  652. package/dist/components/CloseIcon/CloseButton.vue.js +7 -0
  653. package/dist/components/CloseIcon/CloseButton.vue_vue_type_script_setup_true_lang.js +23 -0
  654. package/dist/components/CloseIcon/types.d.ts +2 -0
  655. package/dist/components/CommaBox/CommaBox.vue.d.ts +2 -1
  656. package/dist/components/CommaBox/CommaBox.vue.js +6 -0
  657. package/dist/components/CommaBox/CommaBox.vue_vue_type_script_setup_true_lang.js +81 -0
  658. package/dist/components/CommaBox/types.d.ts +6 -7
  659. package/dist/components/CommonInputWrapper/CommonInputWrapper.vue.d.ts +19 -0
  660. package/dist/components/CommonInputWrapper/CommonInputWrapper.vue.js +6 -0
  661. package/dist/components/CommonInputWrapper/CommonInputWrapper.vue_vue_type_script_setup_true_lang.js +107 -0
  662. package/dist/components/CommonInputWrapper/types.d.ts +96 -0
  663. package/dist/components/CommonPopover/CommonPopover.vue.d.ts +3 -3
  664. package/dist/components/CommonPopover/CommonPopover.vue.js +6 -0
  665. package/dist/components/CommonPopover/CommonPopover.vue_vue_type_script_setup_true_lang.js +160 -0
  666. package/dist/components/CommonPopover/types.d.ts +61 -16
  667. package/dist/components/ErrorIcon/ErrorIcon.vue.d.ts +2 -0
  668. package/dist/components/ErrorIcon/ErrorIcon.vue.js +6 -0
  669. package/dist/components/ErrorIcon/ErrorIcon.vue_vue_type_script_setup_true_lang.js +16 -0
  670. package/dist/components/FlatListBox/FlatListBox.vue.d.ts +2 -5
  671. package/dist/components/FlatListBox/FlatListBox.vue.js +5 -0
  672. package/dist/components/FlatListBox/FlatListBox.vue_vue_type_script_setup_true_lang.js +167 -0
  673. package/dist/components/FlatListBox/types.d.ts +1 -1
  674. package/dist/components/GroupedListBox/GroupedListBox.vue.d.ts +2 -5
  675. package/dist/components/GroupedListBox/GroupedListBox.vue.js +5 -0
  676. package/dist/components/GroupedListBox/GroupedListBox.vue_vue_type_script_setup_true_lang.js +218 -0
  677. package/dist/components/ListBox/ListBox.vue.d.ts +3 -6
  678. package/dist/components/ListBox/ListBox.vue.js +5 -0
  679. package/dist/components/ListBox/ListBox.vue_vue_type_script_setup_true_lang.js +112 -0
  680. package/dist/components/ListBox/types.d.ts +1 -1
  681. package/dist/components/OptionsContainer/OptionsContainer.vue.d.ts +1 -0
  682. package/dist/components/OptionsContainer/OptionsContainer.vue.js +5 -0
  683. package/dist/components/OptionsContainer/OptionsContainer.vue_vue_type_script_setup_true_lang.js +52 -0
  684. package/dist/components/OptionsContainer/types.d.ts +14 -24
  685. package/dist/components/Transitions/ScaleFade.vue.js +5 -0
  686. package/dist/components/Transitions/ScaleFade.vue_vue_type_script_setup_true_lang.js +47 -0
  687. package/dist/components/Transitions/Slide.vue.js +7 -0
  688. package/dist/components/Transitions/Slide.vue_vue_type_script_setup_true_lang.js +28 -0
  689. package/dist/components/WarningIcon/WarningIcon.vue.d.ts +5 -0
  690. package/dist/components/WarningIcon/WarningIcon.vue.js +6 -0
  691. package/dist/components/WarningIcon/WarningIcon.vue_vue_type_script_setup_true_lang.js +16 -0
  692. package/dist/components/WarningIcon/types.d.ts +3 -0
  693. package/dist/composables/__testResets.d.ts +1 -0
  694. package/dist/composables/useActiveInactiveState.d.ts +4 -0
  695. package/dist/composables/useActiveInactiveState.js +21 -0
  696. package/dist/composables/useBaseOptions.d.ts +3 -3
  697. package/dist/composables/useBaseOptions.js +31 -0
  698. package/dist/composables/useBbConfig.d.ts +8 -37
  699. package/dist/composables/useBbConfig.js +5 -0
  700. package/dist/composables/useBbDropdownContext.d.ts +89 -0
  701. package/dist/composables/useBbDropdownContext.js +46 -0
  702. package/dist/composables/useBbFormContext.d.ts +90 -0
  703. package/dist/composables/useBbFormContext.js +69 -0
  704. package/dist/composables/useBbTableContext.d.ts +195 -0
  705. package/dist/composables/useBbTableContext.js +208 -0
  706. package/dist/composables/useBbTabsContext.d.ts +111 -0
  707. package/dist/composables/useBbTabsContext.js +219 -0
  708. package/dist/composables/useBreakpoint.d.ts +13 -0
  709. package/dist/composables/useBreakpoint.js +39 -0
  710. package/dist/composables/useBroadcastChannelInstance.d.ts +1 -3
  711. package/dist/composables/useBroadcastChannelInstance.js +39 -0
  712. package/dist/composables/useCancelableFunction.js +37 -0
  713. package/dist/composables/useCoherence.js +16 -0
  714. package/dist/composables/useConfirm.d.ts +257 -67
  715. package/dist/composables/useConfirm.js +122 -0
  716. package/dist/composables/useCountdown.js +42 -0
  717. package/dist/composables/useHashedWatcher.d.ts +17 -0
  718. package/dist/composables/useHashedWatcher.js +14 -0
  719. package/dist/composables/useId.d.ts +3 -2
  720. package/dist/composables/useIndexById.js +16 -0
  721. package/dist/composables/useInertiaPage.d.ts +10 -0
  722. package/dist/composables/useInertiaPage.js +8 -0
  723. package/dist/composables/useItemText.js +17 -0
  724. package/dist/composables/useItemValue.js +9 -0
  725. package/dist/composables/useItemsGetter.d.ts +1 -1
  726. package/dist/composables/useItemsGetter.js +30 -0
  727. package/dist/composables/useListboxFocus.js +66 -0
  728. package/dist/composables/useLocale.d.ts +1 -1
  729. package/dist/composables/useLocale.js +11 -0
  730. package/dist/composables/useLogger.d.ts +1 -1
  731. package/dist/composables/useLogger.js +10 -0
  732. package/dist/composables/useMinimalQueue.d.ts +1 -1
  733. package/dist/composables/useMobile.js +7 -0
  734. package/dist/composables/useOnFalsy.d.ts +2 -0
  735. package/dist/composables/useOnFalsy.js +9 -0
  736. package/dist/composables/useOnTruthy.d.ts +7 -0
  737. package/dist/composables/useOnTruthy.js +9 -0
  738. package/dist/composables/usePrefill.d.ts +2 -1
  739. package/dist/composables/usePrefill.js +24 -0
  740. package/dist/composables/useQuery.d.ts +15 -3
  741. package/dist/composables/useQuery.js +42 -0
  742. package/dist/composables/useRoute.js +11 -0
  743. package/dist/composables/useRouter.js +8 -0
  744. package/dist/composables/useSafeArea.d.ts +51 -0
  745. package/dist/composables/useSafeArea.js +16 -0
  746. package/dist/composables/useSegmentedFields.d.ts +103 -0
  747. package/dist/composables/useSegmentedFields.js +152 -0
  748. package/dist/composables/useTableWidthContext.d.ts +5 -0
  749. package/dist/composables/useTableWidthContext.js +42 -0
  750. package/dist/composables/useToast.d.ts +17 -73
  751. package/dist/composables/useToast.js +49 -0
  752. package/dist/composables/useTopLayer.d.ts +9 -0
  753. package/dist/composables/useTopLayer.js +7 -0
  754. package/dist/composables/useUntil.js +13 -0
  755. package/dist/composables/useViewportWidth.d.ts +17 -0
  756. package/dist/composables/useViewportWidth.js +6 -0
  757. package/dist/confirm-variants.d.ts +10 -0
  758. package/dist/deprecation/ai-deprecations.json.d.ts +784 -0
  759. package/dist/deprecation/ai-deprecations.json.js +4 -0
  760. package/dist/deprecation/removedProps.d.ts +3 -0
  761. package/dist/deprecation/removedProps.js +13 -0
  762. package/dist/directives/bbColor.d.ts +65 -0
  763. package/dist/directives/bbColor.js +24 -0
  764. package/dist/directives/bbDate.d.ts +66 -0
  765. package/dist/directives/bbDate.js +24 -0
  766. package/dist/directives/bbDropdown.d.ts +15 -11
  767. package/dist/directives/bbDropdown.js +23 -0
  768. package/dist/directives/bbTime.d.ts +64 -0
  769. package/dist/directives/bbTime.js +24 -0
  770. package/dist/directives/bbTooltip.d.ts +16 -11
  771. package/dist/directives/bbTooltip.js +24 -0
  772. package/dist/dropdown-item-variants.d.ts +10 -0
  773. package/dist/i18n/index.d.ts +51 -3
  774. package/dist/i18n/index.js +27 -0
  775. package/dist/i18n/locales/cs.json +115 -0
  776. package/dist/i18n/locales/da.json +115 -0
  777. package/dist/i18n/locales/de.json +115 -0
  778. package/dist/i18n/locales/el.json +115 -0
  779. package/dist/i18n/locales/en.json +115 -0
  780. package/dist/i18n/locales/es.json +115 -0
  781. package/dist/i18n/locales/fi.json +115 -0
  782. package/dist/i18n/locales/fr.json +115 -0
  783. package/dist/i18n/locales/hu.json +115 -0
  784. package/dist/i18n/locales/it.json +115 -0
  785. package/dist/i18n/locales/ja.json +115 -0
  786. package/dist/i18n/locales/ko.json +115 -0
  787. package/dist/i18n/locales/nb.json +115 -0
  788. package/dist/i18n/locales/nl.json +115 -0
  789. package/dist/i18n/locales/pl.json +115 -0
  790. package/dist/i18n/locales/pt.json +115 -0
  791. package/dist/i18n/locales/ro.json +115 -0
  792. package/dist/i18n/locales/ru.json +115 -0
  793. package/dist/i18n/locales/sv.json +115 -0
  794. package/dist/i18n/locales/tr.json +115 -0
  795. package/dist/i18n/locales/uk.json +115 -0
  796. package/dist/i18n/locales/zh-cn.json +115 -0
  797. package/dist/icons-whitelist.d.ts +8 -0
  798. package/dist/index.d.ts +94 -79
  799. package/dist/index.js +76 -82
  800. package/dist/indicator-variants.d.ts +13 -0
  801. package/dist/llms-full.txt +77073 -0
  802. package/dist/llms-medium.txt +1334 -0
  803. package/dist/llms.txt +103 -0
  804. package/dist/locale-blueprint.json +141 -0
  805. package/dist/nuxt-module.d.ts +3 -0
  806. package/dist/nuxt.js +19 -0
  807. package/dist/plugin.d.ts +4 -0
  808. package/dist/plugin.js +22 -0
  809. package/dist/reset.css +1 -0
  810. package/dist/reset.d.ts +0 -0
  811. package/dist/runtime/nuxt-plugin.d.ts +2 -0
  812. package/dist/runtime/nuxt-plugin.js +24 -0
  813. package/dist/styles.css +2 -0
  814. package/dist/styles.d.ts +0 -0
  815. package/dist/toast-variants.d.ts +13 -0
  816. package/dist/tooltip-variants.d.ts +10 -0
  817. package/dist/types/ActionButton.d.ts +32 -0
  818. package/dist/types/AlertVariant.d.ts +16 -0
  819. package/dist/types/BadgeVariant.d.ts +16 -0
  820. package/dist/types/ButtonVariant.d.ts +17 -0
  821. package/dist/types/Classes.d.ts +1 -1
  822. package/dist/types/ColumnName.d.ts +1 -1
  823. package/dist/types/CommonProps.d.ts +66 -279
  824. package/dist/types/Config.d.ts +84 -0
  825. package/dist/types/ConfirmVariant.d.ts +15 -0
  826. package/dist/types/DropdownItemVariant.d.ts +18 -0
  827. package/dist/types/Icon.d.ts +5 -7
  828. package/dist/types/IndicatorVariant.d.ts +16 -0
  829. package/dist/types/InputDirection.d.ts +15 -0
  830. package/dist/types/ItemAccessor.d.ts +21 -0
  831. package/dist/types/Placement.d.ts +6 -0
  832. package/dist/types/ResponsiveSize.d.ts +20 -0
  833. package/dist/types/SizeScale.d.ts +8 -0
  834. package/dist/types/ToastVariant.d.ts +17 -0
  835. package/dist/types/TooltipVariant.d.ts +18 -0
  836. package/dist/utilities/functions/bytesToUnit.d.ts +2 -0
  837. package/dist/utilities/functions/bytesToUnit.js +18 -0
  838. package/dist/utilities/functions/clampPrecision.js +10 -0
  839. package/dist/utilities/functions/convertDateValue.d.ts +23 -10
  840. package/dist/utilities/functions/convertDateValue.js +12 -0
  841. package/dist/utilities/functions/deburr.js +5 -0
  842. package/dist/utilities/functions/empty.js +5 -0
  843. package/dist/utilities/functions/flattenTree.d.ts +1 -1
  844. package/dist/utilities/functions/hash.js +5 -0
  845. package/dist/utilities/functions/isDateDisabled.d.ts +1 -0
  846. package/dist/utilities/functions/isDateDisabled.js +20 -0
  847. package/dist/utilities/functions/isEqual.js +5 -0
  848. package/dist/utilities/functions/isNotEmpty.js +5 -0
  849. package/dist/utilities/functions/matchAnyKey.d.ts +1 -1
  850. package/dist/utilities/functions/matchAnyKey.js +15 -0
  851. package/dist/utilities/functions/parseSize.d.ts +1 -1
  852. package/dist/utilities/functions/parseSize.js +15 -0
  853. package/dist/utilities/functions/percentage.js +11 -0
  854. package/dist/utilities/functions/pipe.d.ts +1 -1
  855. package/dist/utilities/functions/reject.d.ts +25 -0
  856. package/dist/utilities/functions/reject.js +28 -0
  857. package/dist/utilities/functions/resolveEnumProp.d.ts +19 -0
  858. package/dist/utilities/functions/resolveEnumProp.js +5 -0
  859. package/dist/utilities/functions/slotKey.d.ts +13 -0
  860. package/dist/utilities/functions/slotKey.js +4 -0
  861. package/dist/utilities/functions/sort.d.ts +2 -2
  862. package/dist/utilities/functions/sort.js +19 -0
  863. package/dist/utilities/functions/throttle.js +5 -0
  864. package/dist/utilities/functions/waitFor.d.ts +9 -2
  865. package/dist/utilities/functions/waitFor.js +14 -0
  866. package/dist/utilities/functions/warnRemovedAttrs.d.ts +11 -0
  867. package/dist/utilities/functions/warnRemovedAttrs.js +20 -0
  868. package/dist/utilities/functions/when.js +5 -0
  869. package/dist/utilities/misc/iconsInjectionKey.d.ts +15 -0
  870. package/dist/utilities/misc/iconsInjectionKey.js +4 -0
  871. package/dist/utilities/misc/transitions.d.ts +5 -0
  872. package/dist/utilities/misc/transitions.js +8 -0
  873. package/dist/utils/injectLibraryStyles.d.ts +6 -0
  874. package/dist/utils/injectLibraryStyles.js +38 -0
  875. package/dist/validated/BbCheckbox.vue.d.ts +29 -0
  876. package/dist/validated/BbCheckbox.vue.js +5 -0
  877. package/dist/validated/BbCheckbox.vue_vue_type_script_setup_true_lang.js +75 -0
  878. package/dist/validated/BbCheckboxGroup.vue.d.ts +34 -0
  879. package/dist/validated/BbCheckboxGroup.vue.js +5 -0
  880. package/dist/validated/BbCheckboxGroup.vue_vue_type_script_setup_true_lang.js +76 -0
  881. package/dist/validated/BbColorInput.vue.d.ts +36 -0
  882. package/dist/validated/BbColorInput.vue.js +5 -0
  883. package/dist/validated/BbColorInput.vue_vue_type_script_setup_true_lang.js +71 -0
  884. package/dist/validated/BbDatePickerInput.vue.d.ts +40 -0
  885. package/dist/validated/BbDatePickerInput.vue.js +5 -0
  886. package/dist/validated/BbDatePickerInput.vue_vue_type_script_setup_true_lang.js +87 -0
  887. package/dist/validated/BbDropzone.vue.d.ts +24 -0
  888. package/dist/validated/BbDropzone.vue.js +5 -0
  889. package/dist/validated/BbDropzone.vue_vue_type_script_setup_true_lang.js +45 -0
  890. package/dist/validated/BbForm.vue.d.ts +28 -0
  891. package/dist/validated/BbForm.vue.js +5 -0
  892. package/dist/validated/BbForm.vue_vue_type_script_setup_true_lang.js +42 -0
  893. package/dist/validated/BbNumberInput.vue.d.ts +36 -0
  894. package/dist/validated/BbNumberInput.vue.js +5 -0
  895. package/dist/validated/BbNumberInput.vue_vue_type_script_setup_true_lang.js +72 -0
  896. package/dist/validated/BbRadioGroup.vue.d.ts +34 -0
  897. package/dist/validated/BbRadioGroup.vue.js +5 -0
  898. package/dist/validated/BbRadioGroup.vue_vue_type_script_setup_true_lang.js +75 -0
  899. package/dist/validated/BbRating.vue.d.ts +30 -0
  900. package/dist/validated/BbRating.vue.js +5 -0
  901. package/dist/validated/BbRating.vue_vue_type_script_setup_true_lang.js +63 -0
  902. package/dist/validated/BbSelect.vue.d.ts +46 -0
  903. package/dist/validated/BbSelect.vue.js +5 -0
  904. package/dist/validated/BbSelect.vue_vue_type_script_setup_true_lang.js +100 -0
  905. package/dist/validated/BbSlider.vue.d.ts +36 -0
  906. package/dist/validated/BbSlider.vue.js +5 -0
  907. package/dist/validated/BbSlider.vue_vue_type_script_setup_true_lang.js +69 -0
  908. package/dist/validated/BbSwitch.vue.d.ts +29 -0
  909. package/dist/validated/BbSwitch.vue.js +5 -0
  910. package/dist/validated/BbSwitch.vue_vue_type_script_setup_true_lang.js +75 -0
  911. package/dist/validated/BbSwitchGroup.vue.d.ts +34 -0
  912. package/dist/validated/BbSwitchGroup.vue.js +5 -0
  913. package/dist/validated/BbSwitchGroup.vue_vue_type_script_setup_true_lang.js +76 -0
  914. package/dist/validated/BbTag.vue.d.ts +36 -0
  915. package/dist/validated/BbTag.vue.js +5 -0
  916. package/dist/validated/BbTag.vue_vue_type_script_setup_true_lang.js +72 -0
  917. package/dist/validated/BbTextInput.vue.d.ts +36 -0
  918. package/dist/validated/BbTextInput.vue.js +5 -0
  919. package/dist/validated/BbTextInput.vue_vue_type_script_setup_true_lang.js +72 -0
  920. package/dist/validated/BbTextarea.vue.d.ts +36 -0
  921. package/dist/validated/BbTextarea.vue.js +5 -0
  922. package/dist/validated/BbTextarea.vue_vue_type_script_setup_true_lang.js +70 -0
  923. package/dist/validated/BbTimePickerInput.vue.d.ts +36 -0
  924. package/dist/validated/BbTimePickerInput.vue.js +5 -0
  925. package/dist/validated/BbTimePickerInput.vue_vue_type_script_setup_true_lang.js +78 -0
  926. package/dist/validated/index.d.ts +29 -0
  927. package/dist/validated/useValidatedField.d.ts +52 -0
  928. package/dist/validated/useValidatedField.js +51 -0
  929. package/dist/validated.js +21 -0
  930. package/dist/vite-plugin.d.ts +217 -0
  931. package/dist/vite.js +530 -0
  932. package/llms.txt +105 -0
  933. package/package.json +161 -59
  934. package/scripts/lib/__fixtures__/validated-manifest.json +65 -0
  935. package/scripts/lib/ensure-manifest.mjs +39 -0
  936. package/scripts/lib/eslint-plugin-autofix.node.test.mjs +109 -0
  937. package/scripts/lib/eslint-plugin.mjs +285 -0
  938. package/scripts/lib/eslint-plugin.node.test.mjs +161 -0
  939. package/scripts/lib/html-attributes.mjs +191 -0
  940. package/scripts/lib/mcp-config.mjs +126 -0
  941. package/scripts/lib/migrate-fix.mjs +115 -0
  942. package/scripts/lib/validate-bb-markup.mjs +421 -0
  943. package/dist/ai/BaseButton.md +0 -449
  944. package/dist/ai/BaseCheckbox.md +0 -512
  945. package/dist/ai/BaseCheckboxGroup.md +0 -597
  946. package/dist/ai/BaseColorInput.md +0 -461
  947. package/dist/ai/BaseDatePicker.md +0 -739
  948. package/dist/ai/BaseDatePickerInput.md +0 -1517
  949. package/dist/ai/BaseDialog.md +0 -610
  950. package/dist/ai/BaseInputContainer.md +0 -570
  951. package/dist/ai/BaseNumberInput.md +0 -509
  952. package/dist/ai/BaseRadio.md +0 -405
  953. package/dist/ai/BaseRadioGroup.md +0 -535
  954. package/dist/ai/BaseRating.md +0 -489
  955. package/dist/ai/BaseSelect.md +0 -1742
  956. package/dist/ai/BaseSlider.md +0 -871
  957. package/dist/ai/BaseSwitch.md +0 -322
  958. package/dist/ai/BaseSwitchGroup.md +0 -298
  959. package/dist/ai/BaseTag.md +0 -623
  960. package/dist/ai/BaseTextInput.md +0 -392
  961. package/dist/ai/BaseTextarea.md +0 -398
  962. package/dist/ai/BbChip.md +0 -147
  963. package/dist/ai/BbIntersection.md +0 -120
  964. package/dist/ai/BbRatio.md +0 -61
  965. package/dist/ai/BbRows.md +0 -307
  966. package/dist/ai/BbTab.md +0 -950
  967. package/dist/ai/CommonInputInnerContainer.md +0 -414
  968. package/dist/ai/CommonInputOuterContainer.md +0 -55
  969. package/dist/components/BaseButton/BaseButton.vue.d.ts +0 -14
  970. package/dist/components/BaseButton/types.d.ts +0 -159
  971. package/dist/components/BaseCheckbox/BaseCheckbox.vue.d.ts +0 -39
  972. package/dist/components/BaseCheckbox/types.d.ts +0 -213
  973. package/dist/components/BaseCheckboxGroup/BaseCheckboxGroup.vue.d.ts +0 -30
  974. package/dist/components/BaseCheckboxGroup/types.d.ts +0 -282
  975. package/dist/components/BaseColorInput/BaseColorInput.vue.d.ts +0 -35
  976. package/dist/components/BaseColorInput/ColorPalette.vue.d.ts +0 -13
  977. package/dist/components/BaseColorInput/types.d.ts +0 -233
  978. package/dist/components/BaseDatePicker/BaseDatePickerHeader.vue.d.ts +0 -15
  979. package/dist/components/BaseDatePicker/BaseDatePickerInputDaySelector.vue.d.ts +0 -58
  980. package/dist/components/BaseDatePicker/BaseDatePickerMonthSelector.vue.d.ts +0 -12
  981. package/dist/components/BaseDatePicker/BaseDatePickerYearSelector.vue.d.ts +0 -12
  982. package/dist/components/BaseDatePicker/types.d.ts +0 -100
  983. package/dist/components/BaseDatePickerInput/BaseDatePickerInput.vue.d.ts +0 -26
  984. package/dist/components/BaseDatePickerInput/types.d.ts +0 -206
  985. package/dist/components/BaseDialog/BaseDialog.vue.d.ts +0 -37
  986. package/dist/components/BaseDialog/types.d.ts +0 -180
  987. package/dist/components/BaseInputContainer/BaseInputContainer.vue.d.ts +0 -18
  988. package/dist/components/BaseInputContainer/types.d.ts +0 -126
  989. package/dist/components/BaseNumberInput/BaseNumberInput.vue.d.ts +0 -46
  990. package/dist/components/BaseNumberInput/types.d.ts +0 -191
  991. package/dist/components/BaseRadio/BaseRadio.vue.d.ts +0 -31
  992. package/dist/components/BaseRadio/types.d.ts +0 -173
  993. package/dist/components/BaseRadioGroup/BaseRadioGroup.vue.d.ts +0 -30
  994. package/dist/components/BaseRadioGroup/types.d.ts +0 -240
  995. package/dist/components/BaseRating/BaseRating.vue.d.ts +0 -35
  996. package/dist/components/BaseRating/types.d.ts +0 -144
  997. package/dist/components/BaseSelect/BaseSelect.vue.d.ts +0 -28
  998. package/dist/components/BaseSelect/types.d.ts +0 -470
  999. package/dist/components/BaseSlider/BaseSlider.vue.d.ts +0 -38
  1000. package/dist/components/BaseSlider/types.d.ts +0 -201
  1001. package/dist/components/BaseSwitch/BaseSwitch.vue.d.ts +0 -34
  1002. package/dist/components/BaseSwitch/types.d.ts +0 -25
  1003. package/dist/components/BaseSwitchGroup/BaseSwitchGroup.vue.d.ts +0 -30
  1004. package/dist/components/BaseSwitchGroup/types.d.ts +0 -8
  1005. package/dist/components/BaseTag/BaseTag.vue.d.ts +0 -37
  1006. package/dist/components/BaseTag/types.d.ts +0 -136
  1007. package/dist/components/BaseTextInput/BaseTextInput.vue.d.ts +0 -33
  1008. package/dist/components/BaseTextInput/types.d.ts +0 -166
  1009. package/dist/components/BaseTextarea/BaseTextarea.vue.d.ts +0 -31
  1010. package/dist/components/BaseTextarea/types.d.ts +0 -151
  1011. package/dist/components/BbChip/BbChip.vue.d.ts +0 -17
  1012. package/dist/components/BbChip/types.d.ts +0 -23
  1013. package/dist/components/BbIntersection/BbIntersection.vue.d.ts +0 -23
  1014. package/dist/components/BbIntersection/types.d.ts +0 -36
  1015. package/dist/components/BbRatio/BbRatio.vue.d.ts +0 -14
  1016. package/dist/components/BbRatio/types.d.ts +0 -15
  1017. package/dist/components/BbRows/BbRows.vue.d.ts +0 -62
  1018. package/dist/components/BbRows/types.d.ts +0 -21
  1019. package/dist/components/BbTab/BbTab.vue.d.ts +0 -27
  1020. package/dist/components/BbTab/types.d.ts +0 -186
  1021. package/dist/components/CommonInputInnerContainer/CommonInputInnerContainer.vue.d.ts +0 -15
  1022. package/dist/components/CommonInputInnerContainer/types.d.ts +0 -47
  1023. package/dist/components/CommonInputOuterContainer/CommonInputOuterContainer.vue.d.ts +0 -11
  1024. package/dist/components/CommonInputOuterContainer/types.d.ts +0 -16
  1025. package/dist/composables/useModalsState.d.ts +0 -5
  1026. package/dist/composables/useQueue.d.ts +0 -58
  1027. package/dist/composables/useWizard.d.ts +0 -85
  1028. package/dist/i18n/en.d.ts +0 -67
  1029. package/dist/i18n/it.d.ts +0 -67
  1030. package/dist/index.css +0 -2
  1031. package/dist/index100.js +0 -6
  1032. package/dist/index101.js +0 -300
  1033. package/dist/index102.js +0 -16
  1034. package/dist/index103.js +0 -16
  1035. package/dist/index104.js +0 -27
  1036. package/dist/index109.js +0 -19
  1037. package/dist/index11.js +0 -42
  1038. package/dist/index110.js +0 -12
  1039. package/dist/index111.js +0 -19
  1040. package/dist/index112.js +0 -25
  1041. package/dist/index114.js +0 -7
  1042. package/dist/index115.js +0 -241
  1043. package/dist/index116.js +0 -5
  1044. package/dist/index117.js +0 -42
  1045. package/dist/index118.js +0 -5
  1046. package/dist/index119.js +0 -53
  1047. package/dist/index120.js +0 -5
  1048. package/dist/index121.js +0 -32
  1049. package/dist/index122.js +0 -5
  1050. package/dist/index124.js +0 -52
  1051. package/dist/index125.js +0 -5
  1052. package/dist/index126.js +0 -223
  1053. package/dist/index128.js +0 -6
  1054. package/dist/index129.js +0 -162
  1055. package/dist/index13.js +0 -92
  1056. package/dist/index130.js +0 -25
  1057. package/dist/index131.js +0 -51
  1058. package/dist/index132.js +0 -5
  1059. package/dist/index133.js +0 -607
  1060. package/dist/index135.js +0 -6
  1061. package/dist/index136.js +0 -14
  1062. package/dist/index137.js +0 -153
  1063. package/dist/index139.js +0 -6
  1064. package/dist/index14.js +0 -306
  1065. package/dist/index140.js +0 -224
  1066. package/dist/index141.js +0 -5
  1067. package/dist/index143.js +0 -128
  1068. package/dist/index145.js +0 -6
  1069. package/dist/index146.js +0 -8
  1070. package/dist/index147.js +0 -182
  1071. package/dist/index149.js +0 -6
  1072. package/dist/index15.js +0 -10
  1073. package/dist/index151.js +0 -4
  1074. package/dist/index152.js +0 -95
  1075. package/dist/index154.js +0 -6
  1076. package/dist/index155.js +0 -168
  1077. package/dist/index157.js +0 -6
  1078. package/dist/index158.js +0 -145
  1079. package/dist/index16.js +0 -59
  1080. package/dist/index160.js +0 -6
  1081. package/dist/index161.js +0 -53
  1082. package/dist/index163.js +0 -6
  1083. package/dist/index164.js +0 -16
  1084. package/dist/index166.js +0 -35
  1085. package/dist/index168.js +0 -6
  1086. package/dist/index169.js +0 -89
  1087. package/dist/index171.js +0 -6
  1088. package/dist/index172.js +0 -82
  1089. package/dist/index174.js +0 -6
  1090. package/dist/index175.js +0 -38
  1091. package/dist/index176.js +0 -461
  1092. package/dist/index177.js +0 -28
  1093. package/dist/index178.js +0 -66
  1094. package/dist/index18.js +0 -35
  1095. package/dist/index180.js +0 -162
  1096. package/dist/index181.js +0 -5
  1097. package/dist/index182.js +0 -217
  1098. package/dist/index183.js +0 -5
  1099. package/dist/index184.js +0 -112
  1100. package/dist/index185.js +0 -5
  1101. package/dist/index186.js +0 -459
  1102. package/dist/index188.js +0 -6
  1103. package/dist/index19.js +0 -4
  1104. package/dist/index192.js +0 -268
  1105. package/dist/index194.js +0 -6
  1106. package/dist/index195.js +0 -124
  1107. package/dist/index197.js +0 -6
  1108. package/dist/index198.js +0 -174
  1109. package/dist/index2.js +0 -20
  1110. package/dist/index20.js +0 -9
  1111. package/dist/index200.js +0 -6
  1112. package/dist/index201.js +0 -224
  1113. package/dist/index203.js +0 -6
  1114. package/dist/index204.js +0 -135
  1115. package/dist/index206.js +0 -6
  1116. package/dist/index207.js +0 -5
  1117. package/dist/index208.js +0 -170
  1118. package/dist/index21.js +0 -35
  1119. package/dist/index210.js +0 -6
  1120. package/dist/index211.js +0 -37
  1121. package/dist/index213.js +0 -6
  1122. package/dist/index214.js +0 -63
  1123. package/dist/index216.js +0 -6
  1124. package/dist/index217.js +0 -74
  1125. package/dist/index219.js +0 -6
  1126. package/dist/index22.js +0 -6
  1127. package/dist/index220.js +0 -65
  1128. package/dist/index222.js +0 -6
  1129. package/dist/index223.js +0 -67
  1130. package/dist/index225.js +0 -6
  1131. package/dist/index226.js +0 -41
  1132. package/dist/index228.js +0 -6
  1133. package/dist/index229.js +0 -10
  1134. package/dist/index23.js +0 -7
  1135. package/dist/index230.js +0 -22
  1136. package/dist/index232.js +0 -8
  1137. package/dist/index233.js +0 -297
  1138. package/dist/index235.js +0 -6
  1139. package/dist/index236.js +0 -47
  1140. package/dist/index237.js +0 -165
  1141. package/dist/index239.js +0 -6
  1142. package/dist/index24.js +0 -9
  1143. package/dist/index241.js +0 -159
  1144. package/dist/index243.js +0 -6
  1145. package/dist/index244.js +0 -134
  1146. package/dist/index246.js +0 -6
  1147. package/dist/index247.js +0 -167
  1148. package/dist/index249.js +0 -6
  1149. package/dist/index25.js +0 -24
  1150. package/dist/index250.js +0 -147
  1151. package/dist/index252.js +0 -6
  1152. package/dist/index253.js +0 -35
  1153. package/dist/index255.js +0 -6
  1154. package/dist/index256.js +0 -65
  1155. package/dist/index258.js +0 -6
  1156. package/dist/index259.js +0 -19
  1157. package/dist/index260.js +0 -5
  1158. package/dist/index261.js +0 -160
  1159. package/dist/index263.js +0 -6
  1160. package/dist/index264.js +0 -60
  1161. package/dist/index266.js +0 -6
  1162. package/dist/index267.js +0 -134
  1163. package/dist/index269.js +0 -6
  1164. package/dist/index27.js +0 -4
  1165. package/dist/index271.js +0 -206
  1166. package/dist/index273.js +0 -6
  1167. package/dist/index274.js +0 -85
  1168. package/dist/index275.js +0 -5
  1169. package/dist/index276.js +0 -55
  1170. package/dist/index277.js +0 -5
  1171. package/dist/index278.js +0 -164
  1172. package/dist/index28.js +0 -8
  1173. package/dist/index280.js +0 -6
  1174. package/dist/index281.js +0 -145
  1175. package/dist/index283.js +0 -6
  1176. package/dist/index284.js +0 -11
  1177. package/dist/index285.js +0 -200
  1178. package/dist/index287.js +0 -6
  1179. package/dist/index288.js +0 -241
  1180. package/dist/index29.js +0 -7
  1181. package/dist/index290.js +0 -6
  1182. package/dist/index291.js +0 -21
  1183. package/dist/index293.js +0 -6
  1184. package/dist/index294.js +0 -125
  1185. package/dist/index296.js +0 -6
  1186. package/dist/index297.js +0 -161
  1187. package/dist/index299.js +0 -6
  1188. package/dist/index30.js +0 -118
  1189. package/dist/index300.js +0 -127
  1190. package/dist/index302.js +0 -6
  1191. package/dist/index303.js +0 -20
  1192. package/dist/index305.js +0 -6
  1193. package/dist/index306.js +0 -116
  1194. package/dist/index307.js +0 -5
  1195. package/dist/index308.js +0 -507
  1196. package/dist/index31.js +0 -10
  1197. package/dist/index310.js +0 -6
  1198. package/dist/index311.js +0 -196
  1199. package/dist/index313.js +0 -6
  1200. package/dist/index314.js +0 -142
  1201. package/dist/index316.js +0 -6
  1202. package/dist/index317.js +0 -134
  1203. package/dist/index319.js +0 -6
  1204. package/dist/index32.js +0 -28
  1205. package/dist/index320.js +0 -162
  1206. package/dist/index322.js +0 -6
  1207. package/dist/index323.js +0 -319
  1208. package/dist/index325.js +0 -6
  1209. package/dist/index326.js +0 -40
  1210. package/dist/index327.js +0 -43
  1211. package/dist/index328.js +0 -665
  1212. package/dist/index33.js +0 -5
  1213. package/dist/index330.js +0 -6
  1214. package/dist/index331.js +0 -155
  1215. package/dist/index333.js +0 -6
  1216. package/dist/index334.js +0 -142
  1217. package/dist/index336.js +0 -6
  1218. package/dist/index337.js +0 -155
  1219. package/dist/index339.js +0 -6
  1220. package/dist/index34.js +0 -112
  1221. package/dist/index340.js +0 -58
  1222. package/dist/index341.js +0 -5
  1223. package/dist/index342.js +0 -20
  1224. package/dist/index344.js +0 -6
  1225. package/dist/index345.js +0 -142
  1226. package/dist/index347.js +0 -6
  1227. package/dist/index349.js +0 -109
  1228. package/dist/index351.js +0 -6
  1229. package/dist/index353.js +0 -24
  1230. package/dist/index354.js +0 -23
  1231. package/dist/index355.js +0 -839
  1232. package/dist/index356.js +0 -474
  1233. package/dist/index357.js +0 -52
  1234. package/dist/index358.js +0 -7
  1235. package/dist/index36.js +0 -6
  1236. package/dist/index38.js +0 -63
  1237. package/dist/index39.js +0 -63
  1238. package/dist/index40.js +0 -9
  1239. package/dist/index42.js +0 -8
  1240. package/dist/index43.js +0 -179
  1241. package/dist/index44.js +0 -21
  1242. package/dist/index46.js +0 -385
  1243. package/dist/index48.js +0 -6
  1244. package/dist/index49.js +0 -33
  1245. package/dist/index5.js +0 -34
  1246. package/dist/index50.js +0 -12
  1247. package/dist/index51.js +0 -8
  1248. package/dist/index52.js +0 -106
  1249. package/dist/index53.js +0 -330
  1250. package/dist/index54.js +0 -97
  1251. package/dist/index55.js +0 -328
  1252. package/dist/index56.js +0 -28
  1253. package/dist/index57.js +0 -102
  1254. package/dist/index58.js +0 -157
  1255. package/dist/index6.js +0 -38
  1256. package/dist/index60.js +0 -6
  1257. package/dist/index61.js +0 -131
  1258. package/dist/index62.js +0 -5
  1259. package/dist/index65.js +0 -35
  1260. package/dist/index66.js +0 -26
  1261. package/dist/index68.js +0 -6
  1262. package/dist/index69.js +0 -54
  1263. package/dist/index7.js +0 -58
  1264. package/dist/index71.js +0 -6
  1265. package/dist/index72.js +0 -14
  1266. package/dist/index74.js +0 -6
  1267. package/dist/index75.js +0 -159
  1268. package/dist/index77.js +0 -6
  1269. package/dist/index78.js +0 -4
  1270. package/dist/index79.js +0 -4
  1271. package/dist/index80.js +0 -54
  1272. package/dist/index81.js +0 -5
  1273. package/dist/index82.js +0 -5
  1274. package/dist/index83.js +0 -141
  1275. package/dist/index85.js +0 -6
  1276. package/dist/index86.js +0 -65
  1277. package/dist/index88.js +0 -6
  1278. package/dist/index89.js +0 -30
  1279. package/dist/index9.js +0 -11
  1280. package/dist/index90.js +0 -19
  1281. package/dist/index91.js +0 -17
  1282. package/dist/index92.js +0 -9
  1283. package/dist/index93.js +0 -34
  1284. package/dist/index95.js +0 -16
  1285. package/dist/index96.js +0 -10
  1286. package/dist/index97.js +0 -18
  1287. package/dist/index98.js +0 -189
  1288. package/dist/types/VoidHtmlElements.d.ts +0 -1
  1289. package/dist/utilities/functions/add.d.ts +0 -1
  1290. package/dist/utilities/functions/booleanishToBoolean.d.ts +0 -6
  1291. package/dist/utilities/functions/capitalize.d.ts +0 -4
  1292. package/dist/utilities/functions/cloneDeep.d.ts +0 -1
  1293. package/dist/utilities/functions/debounce.d.ts +0 -1
  1294. package/dist/utilities/functions/drop.d.ts +0 -1
  1295. package/dist/utilities/functions/exceedsPrecision.d.ts +0 -1
  1296. package/dist/utilities/functions/findRight.d.ts +0 -4
  1297. package/dist/utilities/functions/findRightIndex.d.ts +0 -4
  1298. package/dist/utilities/functions/flow.d.ts +0 -1
  1299. package/dist/utilities/functions/getHueFromRGB.d.ts +0 -9
  1300. package/dist/utilities/functions/groupBy.d.ts +0 -6
  1301. package/dist/utilities/functions/gt.d.ts +0 -7
  1302. package/dist/utilities/functions/hexToRGB.d.ts +0 -7
  1303. package/dist/utilities/functions/hslToHex.d.ts +0 -1
  1304. package/dist/utilities/functions/includes.d.ts +0 -1
  1305. package/dist/utilities/functions/initial.d.ts +0 -1
  1306. package/dist/utilities/functions/isCssColor.d.ts +0 -5
  1307. package/dist/utilities/functions/lt.d.ts +0 -7
  1308. package/dist/utilities/functions/makeUrl.d.ts +0 -1
  1309. package/dist/utilities/functions/mapKeys.d.ts +0 -5
  1310. package/dist/utilities/functions/mapValues.d.ts +0 -1
  1311. package/dist/utilities/functions/matchesPropertyInsensitive.d.ts +0 -1
  1312. package/dist/utilities/functions/max.d.ts +0 -2
  1313. package/dist/utilities/functions/mean.d.ts +0 -4
  1314. package/dist/utilities/functions/merge.d.ts +0 -11
  1315. package/dist/utilities/functions/millisecondsTo.d.ts +0 -1
  1316. package/dist/utilities/functions/negate.d.ts +0 -4
  1317. package/dist/utilities/functions/normalizeItemGroups.d.ts +0 -13
  1318. package/dist/utilities/functions/omit.d.ts +0 -2
  1319. package/dist/utilities/functions/overEvery.d.ts +0 -4
  1320. package/dist/utilities/functions/pick.d.ts +0 -1
  1321. package/dist/utilities/functions/replace.d.ts +0 -1
  1322. package/dist/utilities/functions/replaceInTree.d.ts +0 -4
  1323. package/dist/utilities/functions/retry.d.ts +0 -5
  1324. package/dist/utilities/functions/roundToTheNearest.d.ts +0 -8
  1325. package/dist/utilities/functions/set.d.ts +0 -15
  1326. package/dist/utilities/functions/stub.d.ts +0 -6
  1327. package/dist/utilities/functions/transposePercent.d.ts +0 -9
  1328. package/dist/utilities/functions/tryTo.d.ts +0 -2
  1329. package/dist/utilities/functions/uniqBy.d.ts +0 -1
  1330. /package/dist/{index64.js → _virtual/_plugin-vue_export-helper.js} +0 -0
  1331. /package/dist/components/{BaseButton → BbBaseButton}/RouterComponent.vue.d.ts +0 -0
  1332. /package/dist/components/{BaseDatePicker/BaseDatePicker.vue.d.ts → BbBaseDatePicker/BbBaseDatePicker.vue.d.ts} +0 -0
  1333. /package/dist/{index165.js → composables/useArray.js} +0 -0
  1334. /package/dist/{index17.js → composables/useFrameworkDetection.js} +0 -0
  1335. /package/dist/{index12.js → composables/useId.js} +0 -0
  1336. /package/dist/{index352.js → directives/createPopoverDirective.js} +0 -0
  1337. /package/dist/{index107.js → utilities/functions/chunk.js} +0 -0
  1338. /package/dist/{index8.js → utilities/functions/clamp.js} +0 -0
  1339. /package/dist/{index150.js → utilities/functions/curry.js} +0 -0
  1340. /package/dist/{index45.js → utilities/functions/extractDomContainer.js} +0 -0
  1341. /package/dist/{index270.js → utilities/functions/findInTree.js} +0 -0
  1342. /package/dist/{index348.js → utilities/functions/flattenTree.js} +0 -0
  1343. /package/dist/{index41.js → utilities/functions/get.js} +0 -0
  1344. /package/dist/{index189.js → utilities/functions/head.js} +0 -0
  1345. /package/dist/{index108.js → utilities/functions/identity.js} +0 -0
  1346. /package/dist/{index179.js → utilities/functions/indexBy.js} +0 -0
  1347. /package/dist/{index37.js → utilities/functions/isHex.js} +0 -0
  1348. /package/dist/{index94.js → utilities/functions/isNil.js} +0 -0
  1349. /package/dist/{index26.js → utilities/functions/isNotNil.js} +0 -0
  1350. /package/dist/{index105.js → utilities/functions/last.js} +0 -0
  1351. /package/dist/{index142.js → utilities/functions/noop.js} +0 -0
  1352. /package/dist/{index231.js → utilities/functions/parseWidthString.js} +0 -0
  1353. /package/dist/{index240.js → utilities/functions/pickBy.js} +0 -0
  1354. /package/dist/{index123.js → utilities/functions/range.js} +0 -0
  1355. /package/dist/{index190.js → utilities/functions/snapToStep.js} +0 -0
  1356. /package/dist/{index191.js → utilities/functions/transpose.js} +0 -0
  1357. /package/dist/{index106.js → utilities/functions/validateDateFormat.js} +0 -0
  1358. /package/dist/{index10.js → utilities/functions/wait.js} +0 -0
@@ -0,0 +1,1477 @@
1
+ ---
2
+ title: Wizard Form (Inertia)
3
+ summary: Mailchimp-grade 4-step campaign wizard for Laravel + Inertia — BbBaseButton stepper with done/current/upcoming/locked states, per-step validation gating Next behind a BbAlert summary merging form.errors, BbSmoothHeight step swaps, the step mirrored into the URL with no extra visit, a usePromiseForm draft with save-draft everywhere, and useConfirmOnRouteLeave guarding unsaved changes, all through one coopting page context.
4
+ ---
5
+
6
+ # Recipe: Wizard Form (Inertia)
7
+
8
+ The same Mailchimp-grade "Create campaign" wizard adapted for **Laravel +
9
+ Inertia**: four steps (Audience → Content → Schedule → Review) behind a
10
+ custom stepper header, per-step validation gating forward progress, the
11
+ active step mirrored into the URL, save-draft everywhere, and a dirty-state
12
+ leave guard. Anatomy, components, the context shape, copy and data are
13
+ identical to the Vue recipe; only the data/URL/mutation layer changes — the
14
+ draft is a [`usePromiseForm`](../../guides/inertia-helpers.md) whose
15
+ `form.errors` merge straight into the per-step validation, the step mirrors
16
+ into the URL without an Inertia visit (it's pure display state), and
17
+ [`useConfirmOnRouteLeave`](../../guides/inertia-helpers.md) replaces
18
+ `onBeforeRouteLeave`.
19
+
20
+ Sibling recipes: [Vue](../vue/wizard-form.md) ·
21
+ [Nuxt](../nuxt/wizard-form.md).
22
+
23
+ ## Prerequisites
24
+
25
+ - `<BbConfirm />` and `<BbToast />` mounted once in the app layout.
26
+ - From the [Inertia Helpers](../../guides/inertia-helpers.md) toolkit:
27
+ `usePromiseForm`, `useConfirmOnRouteLeave`, `useProp`, `useQuery`,
28
+ `useResourceContext`.
29
+ - [App Layout](../../guides/app-layout.md) and
30
+ [Page Shell](../../guides/page-shell.md) copied into
31
+ `src/components/layout/` per their guides — the page renders inside this
32
+ chrome.
33
+ - Controller: `Inertia::render('Campaigns/Edit', ['campaign' => $campaign,
34
+ 'draft' => $draft])` — `campaign` is the record, `draft` the saved field
35
+ values (matching `CampaignDraft` verbatim, camelCase — the `FormRequest`
36
+ behind the mutation routes below is assumed to key its `422` validation
37
+ messages the same way). Mutation routes: `PUT /campaigns/:id` (save
38
+ draft), `POST /campaigns/:id/send-test`, `POST /campaigns/:id/send`,
39
+ `DELETE /campaigns/:id`; small JSON endpoints back the segment lookups:
40
+ `GET /segments/search?q=`, `GET /segments/:id`,
41
+ `GET /segments/:id/estimate`, `GET /segments/:id/detail`.
42
+
43
+ ## Key ideas
44
+
45
+ - **One coopting page context.** `provideCampaignWizard()` joins the
46
+ page-shell stack once and owns the draft, the current step, the live
47
+ validation, and every action. All seven leaves call
48
+ `useCampaignWizard()` and nothing else — the only prop on the page is
49
+ the id the segment peek renders.
50
+ - **The stepper is derived state, not navigation chrome.** A step is
51
+ reachable exactly when every step before it validates — the same
52
+ predicate `goNext()` uses — so jumping from the header can never outrun
53
+ the validation gate. Steps already passed show `done` (checkmarked),
54
+ reachable future steps stay numbered (`upcoming`), and `locked` steps
55
+ render as disabled `BbBaseButton`s.
56
+ - **Validation merges `form.errors` live — no manual bookkeeping.**
57
+ `issues` recomputes from the client-side checks _and_
58
+ `usePromiseForm`'s already-reactive `form.errors`, folded onto the step
59
+ that owns each field, so a failed save surfaces exactly like a blocked
60
+ Next. The `BbAlert` summary and inline field errors still appear only
61
+ after a blocked Next (`attempted`), and shrink live as each problem
62
+ clears.
63
+ - **The draft and campaign arrive as page props — there is no loading
64
+ state.** `usePromiseForm` seeds itself from the `draft` prop once;
65
+ `ctx.loading` stays permanently `false`. The requested `?step` is
66
+ clamped to the first incomplete step **at setup**, synchronously — no
67
+ deferred fetch to wait on.
68
+ - **The step mirrors into the URL without an Inertia visit.** The step is
69
+ pure client display state, not server data, so changing it updates
70
+ `history.replaceState` directly instead of round-tripping through
71
+ `router.visit` — unlike a tabs-as-filters page, no prop on this page
72
+ depends on which step is showing.
73
+ - **One `BbSmoothHeight` wraps the alert + step outlet together**, so the
74
+ step swap _and_ the validation summary appearing both glide instead of
75
+ snapping. Conditional regions inside a step (the scheduled-date fields)
76
+ need no wrapper of their own — the same resize observer catches them.
77
+ - **Back and Save draft are always free; validation only guards forward.**
78
+ The page's one `variant="primary"` is the final Send/Schedule submit,
79
+ with `:loading` riding `ctx.submitting` (`usePromiseForm`'s
80
+ `isSubmitting`).
81
+ - **Leaving is guarded by `form.isDirty` — no snapshots.**
82
+ `useConfirmOnRouteLeave` reads `draft.isDirty` and whitelists the
83
+ campaign's own save/send/send-test URLs so submitting can't block
84
+ itself; `draft.defaults()` re-baselines after a successful save/send so
85
+ the follow-up navigate-away never re-prompts, and discarding sets a
86
+ local flag before its own delete + navigate for the same reason.
87
+
88
+ ## Page anatomy
89
+
90
+ ```
91
+ CampaignWizard/
92
+ Index.vue ← assembly: PageShell slots, stepper, BbSmoothHeight outlet, footer
93
+ context.ts ← coopting page context (shell + usePromiseForm draft + step + validation + actions)
94
+ StepperHeader.vue ← BbBaseButton steps with done/current/upcoming/locked states
95
+ AudienceStep.vue ← segment select, audience filters, live recipient estimate
96
+ ContentStep.vue ← subject/preheader, body, template picker, send-test
97
+ ScheduleStep.vue ← send-now vs scheduled, date + timezone
98
+ ReviewStep.vue ← read-only summary with per-section Edit links
99
+ WizardFooter.vue ← Back · Save draft · Next / Send with :loading
100
+ SegmentPeek.vue ← sidebar workbench for the selected segment
101
+ ```
102
+
103
+ Chrome assumed from the guides: [App Layout](../../guides/app-layout.md)
104
+ (left nav + fat footer) and [Page Shell](../../guides/page-shell.md).
105
+ Wizard archetype: no filter rail, no tabs, no table, no pagination, no bulk
106
+ bar — the work surface is the step outlet.
107
+
108
+ ## Action inventory
109
+
110
+ | # | Action | Trigger | Mechanism |
111
+ | --- | --------------------------- | -------------------------------- | --------------------------------------------------------------------------- |
112
+ | 1 | Advance a step (validated) | footer **Next** (secondary) | `goNext()` — blocks and raises the `BbAlert` summary on issues |
113
+ | 2 | Go back | footer **Back** (ghost) | `goBack()` — never validated |
114
+ | 3 | Jump to an unlocked step | stepper header | `goToStep()`; locked steps are disabled `BbBaseButton`s |
115
+ | 4 | Edit a section from Review | per-section **Edit** links | `goToStep()` back to that step |
116
+ | 5 | Save draft | footer ghost, on every step | `saveDraft()` → `usePromiseForm.put` (whitelisted) + toast |
117
+ | 6 | Send a test email | Content step ghost | `sendTest()` → `post` to `/campaigns/:id/send-test` |
118
+ | 7 | Send / schedule campaign | Review, the page's one `primary` | `submit()` with `:loading`, whole-wizard validation, `put` then `post` |
119
+ | 8 | Discard draft | topbar, destructive | `useConfirm` → `remove` (DELETE) + `router.visit('/campaigns')` |
120
+ | 9 | Peek the segment | segment name (Audience & Review) | `peekSegment()` → shell stack |
121
+ | 10 | Leave with unsaved changes | any Inertia visit | `useConfirmOnRouteLeave` guard → `useConfirm` |
122
+ | 11 | Restore position on refresh | URL `?step=N` | read via `useQuery()`, clamped at setup; changes via `history.replaceState` |
123
+
124
+ ## The code
125
+
126
+ ### context.ts
127
+
128
+ ```ts
129
+ // CampaignWizard/context.ts
130
+ import {
131
+ computed,
132
+ inject,
133
+ provide,
134
+ reactive,
135
+ ref,
136
+ watch,
137
+ watchEffect,
138
+ type ComputedRef,
139
+ type InjectionKey,
140
+ type Ref,
141
+ } from 'vue';
142
+ import { router } from '@inertiajs/vue3';
143
+ import { useConfirm, useToast } from 'bitboss-ui';
144
+ import {
145
+ usePageShellContext,
146
+ type PageShellContext,
147
+ } from '@/components/layout/usePageShellContext';
148
+ import { useConfirmOnRouteLeave } from '@/composables/useConfirmOnRouteLeave';
149
+ import { usePromiseForm } from '@/composables/usePromiseForm';
150
+ import { useProp } from '@/composables/useProp';
151
+ import { useQuery } from '@/composables/useQuery';
152
+ import type { Campaign, Segment } from '@/types';
153
+
154
+ /** What the sidebar can show: the audience segment behind the campaign. */
155
+ export type PeekItem = { type: 'segment'; id: number };
156
+
157
+ export type StepKey = 'audience' | 'content' | 'schedule' | 'review';
158
+ export type StepStatus = 'done' | 'current' | 'upcoming' | 'locked';
159
+ export type SendMode = 'now' | 'scheduled';
160
+
161
+ export const STEPS: { key: StepKey; label: string }[] = [
162
+ { key: 'audience', label: 'Audience' },
163
+ { key: 'content', label: 'Content' },
164
+ { key: 'schedule', label: 'Schedule' },
165
+ { key: 'review', label: 'Review' },
166
+ ];
167
+
168
+ export interface CampaignTemplate {
169
+ id: string;
170
+ name: string;
171
+ description: string;
172
+ }
173
+
174
+ export const TEMPLATES: CampaignTemplate[] = [
175
+ {
176
+ id: 'product-update',
177
+ name: 'Product update',
178
+ description: 'Hero image, feature blocks, one CTA.',
179
+ },
180
+ {
181
+ id: 'newsletter',
182
+ name: 'Newsletter',
183
+ description: 'Multi-story digest with section dividers.',
184
+ },
185
+ {
186
+ id: 'plain-text',
187
+ name: 'Plain text',
188
+ description: 'No chrome — reads like a personal email.',
189
+ },
190
+ ];
191
+
192
+ export const TIMEZONES = [
193
+ { label: 'Rome (CET)', value: 'Europe/Rome' },
194
+ { label: 'London (GMT)', value: 'Europe/London' },
195
+ { label: 'New York (ET)', value: 'America/New_York' },
196
+ { label: 'Chicago (CT)', value: 'America/Chicago' },
197
+ { label: 'Los Angeles (PT)', value: 'America/Los_Angeles' },
198
+ { label: 'Tokyo (JST)', value: 'Asia/Tokyo' },
199
+ { label: 'Sydney (AEST)', value: 'Australia/Sydney' },
200
+ ];
201
+
202
+ export const COUNTRIES = [
203
+ { label: 'Italy', value: 'IT' },
204
+ { label: 'France', value: 'FR' },
205
+ { label: 'Germany', value: 'DE' },
206
+ { label: 'United Kingdom', value: 'GB' },
207
+ { label: 'United States', value: 'US' },
208
+ { label: 'Canada', value: 'CA' },
209
+ ];
210
+
211
+ /** Everything the four steps edit. Persisted verbatim by saveDraft/submit.
212
+ *
213
+ * `type`, not `interface`: only a type alias satisfies `usePromiseForm`'s
214
+ * `Record<string, FormValue>` constraint (implicit index signature). */
215
+ export type CampaignDraft = {
216
+ // Audience
217
+ segmentId: number | null;
218
+ /** Empty array = every country in the segment. */
219
+ countries: string[];
220
+ /** Skip contacts already emailed in the last 7 days. */
221
+ excludeRecent: boolean;
222
+ // Content
223
+ subject: string;
224
+ preheader: string;
225
+ body: string;
226
+ templateId: string | null;
227
+ // Schedule
228
+ sendMode: SendMode;
229
+ /** ISO string from BbDatePickerInput; only meaningful when scheduled. */
230
+ sendAt: string | null;
231
+ timezone: string;
232
+ };
233
+
234
+ export interface StepIssue {
235
+ /** Draft field the issue belongs to — leaves match on it for inline errors. */
236
+ field: string;
237
+ message: string;
238
+ }
239
+
240
+ export interface CampaignWizardContext {
241
+ // -- Coopted contexts ------------------------------------------------------
242
+ shell: PageShellContext<PeekItem>;
243
+ // -- Wizard state ----------------------------------------------------------
244
+ loading: Ref<boolean>;
245
+ campaign: Ref<Campaign | null>;
246
+ draft: CampaignDraft;
247
+ step: Ref<StepKey>;
248
+ dirty: ComputedRef<boolean>;
249
+ lastSavedAt: Ref<string | null>;
250
+ submitting: Ref<boolean>;
251
+ // -- Validation ------------------------------------------------------------
252
+ issues: ComputedRef<Record<StepKey, StepIssue[]>>;
253
+ /** Steps whose Next was blocked at least once — only they show errors. */
254
+ attempted: Record<StepKey, boolean>;
255
+ stepStatus: (key: StepKey) => StepStatus;
256
+ fieldErrors: (step: StepKey, field: string) => string[];
257
+ // -- Audience intel --------------------------------------------------------
258
+ selectedSegment: Ref<Segment | null>;
259
+ estimatedRecipients: Ref<number | null>;
260
+ // -- Peek grammar ----------------------------------------------------------
261
+ peekSegment: () => void;
262
+ // -- Actions (complete: API + state + toast) --------------------------------
263
+ goToStep: (key: StepKey) => void;
264
+ goBack: () => void;
265
+ goNext: () => void;
266
+ saveDraft: () => Promise<void>;
267
+ sendTest: () => Promise<void>;
268
+ submit: () => Promise<void>;
269
+ discardDraft: () => Promise<void>;
270
+ }
271
+
272
+ const key: InjectionKey<CampaignWizardContext> = Symbol('campaign-wizard');
273
+
274
+ /** Which step owns each server-validated field — used to route a failed
275
+ * save's `form.errors` onto the right step, merged into `issues` below. */
276
+ const FIELDS_BY_STEP: Record<StepKey, (keyof CampaignDraft)[]> = {
277
+ audience: ['segmentId'],
278
+ content: ['subject', 'body', 'templateId'],
279
+ schedule: ['sendAt', 'timezone'],
280
+ review: [],
281
+ };
282
+ const stepForField = (field: string): StepKey | undefined =>
283
+ (Object.keys(FIELDS_BY_STEP) as StepKey[]).find((stepKey) =>
284
+ (FIELDS_BY_STEP[stepKey] as string[]).includes(field)
285
+ );
286
+
287
+ export function provideCampaignWizard(): CampaignWizardContext {
288
+ const { toast } = useToast();
289
+ const { confirm } = useConfirm();
290
+
291
+ // -- Coopt the specific contexts: once, here, for the whole page. ----------
292
+ const shell = usePageShellContext<PeekItem>();
293
+
294
+ // -- Wizard state -----------------------------------------------------------
295
+ // The record and the saved draft arrive as page props — no fetch, no
296
+ // loading state. `usePromiseForm` seeds itself once from `draft`; every
297
+ // further edit is local until saveDraft/submit visits the server.
298
+ const campaign = useProp<Campaign>('campaign');
299
+ const campaignId = campaign.value.id;
300
+ const loading = ref(false);
301
+
302
+ const initialDraft = useProp<CampaignDraft>('draft').value;
303
+ const {
304
+ form: draft,
305
+ put,
306
+ post,
307
+ remove,
308
+ isSubmitting,
309
+ } = usePromiseForm<CampaignDraft>({ ...initialDraft });
310
+
311
+ // -- Validation ---------------------------------------------------------------
312
+ // Live on every keystroke; SURFACED only per `attempted` (set when a Next,
313
+ // submit or save is blocked), so untouched steps never open covered in red.
314
+ const issues = computed<Record<StepKey, StepIssue[]>>(() => {
315
+ const audience: StepIssue[] = [];
316
+ if (draft.segmentId === null)
317
+ audience.push({
318
+ field: 'segmentId',
319
+ message: 'Choose the segment this campaign goes to.',
320
+ });
321
+
322
+ const content: StepIssue[] = [];
323
+ if (!draft.subject.trim())
324
+ content.push({ field: 'subject', message: 'Write a subject line.' });
325
+ else if (draft.subject.length > 150)
326
+ content.push({
327
+ field: 'subject',
328
+ message: 'Keep the subject under 150 characters.',
329
+ });
330
+ if (!draft.body.trim())
331
+ content.push({
332
+ field: 'body',
333
+ message: 'The email body cannot be empty.',
334
+ });
335
+ if (draft.templateId === null)
336
+ content.push({ field: 'templateId', message: 'Pick a template.' });
337
+
338
+ const schedule: StepIssue[] = [];
339
+ if (draft.sendMode === 'scheduled') {
340
+ if (!draft.sendAt)
341
+ schedule.push({ field: 'sendAt', message: 'Pick a send date.' });
342
+ if (!draft.timezone)
343
+ schedule.push({ field: 'timezone', message: 'Pick a timezone.' });
344
+ }
345
+
346
+ // Merge server (422) errors onto the step that owns each field —
347
+ // `form.errors` is already reactive, so no separate bookkeeping is
348
+ // needed, unlike a manual snapshot/errors ref.
349
+ const withServerErrors = (
350
+ stepKey: StepKey,
351
+ list: StepIssue[]
352
+ ): StepIssue[] => [
353
+ ...list,
354
+ ...FIELDS_BY_STEP[stepKey]
355
+ .filter((field) => draft.errors[field])
356
+ .map((field) => ({ field, message: draft.errors[field] as string })),
357
+ ];
358
+
359
+ return {
360
+ audience: withServerErrors('audience', audience),
361
+ content: withServerErrors('content', content),
362
+ schedule: withServerErrors('schedule', schedule),
363
+ review: [],
364
+ };
365
+ });
366
+
367
+ const attempted = reactive<Record<StepKey, boolean>>({
368
+ audience: false,
369
+ content: false,
370
+ schedule: false,
371
+ review: false,
372
+ });
373
+
374
+ const fieldErrors = (stepKey: StepKey, field: string): string[] =>
375
+ attempted[stepKey]
376
+ ? issues.value[stepKey]
377
+ .filter((issue) => issue.field === field)
378
+ .map((issue) => issue.message)
379
+ : [];
380
+
381
+ // -- Step machine ---------------------------------------------------------------
382
+ const step = ref<StepKey>('audience');
383
+
384
+ const indexOf = (stepKey: StepKey) =>
385
+ STEPS.findIndex((item) => item.key === stepKey);
386
+
387
+ // The single gating predicate: a step is reachable when every step
388
+ // before it validates. Next, the stepper, and submit all derive from it.
389
+ const unlocked = (stepKey: StepKey) =>
390
+ STEPS.slice(0, indexOf(stepKey)).every(
391
+ (item) => issues.value[item.key].length === 0
392
+ );
393
+
394
+ const stepStatus = (stepKey: StepKey): StepStatus => {
395
+ if (stepKey === step.value) return 'current';
396
+ // Only steps already passed count as done — unlocked future steps stay
397
+ // numbered (upcoming), not checkmarked.
398
+ if (indexOf(stepKey) < indexOf(step.value)) return 'done';
399
+ return unlocked(stepKey) ? 'upcoming' : 'locked';
400
+ };
401
+
402
+ const firstIncompleteStep = (): StepKey =>
403
+ STEPS.find((item) => issues.value[item.key].length > 0)?.key ?? 'review';
404
+
405
+ const goToStep = (stepKey: StepKey) => {
406
+ if (stepKey !== step.value && stepStatus(stepKey) === 'locked') return;
407
+ step.value = stepKey;
408
+ };
409
+
410
+ const goBack = () => {
411
+ const previous = STEPS[indexOf(step.value) - 1];
412
+ if (previous) step.value = previous.key;
413
+ };
414
+
415
+ const goNext = () => {
416
+ const current = step.value;
417
+ if (issues.value[current].length > 0) {
418
+ attempted[current] = true; // raises the alert + inline errors
419
+ return;
420
+ }
421
+ attempted[current] = false;
422
+ const next = STEPS[indexOf(current) + 1];
423
+ if (next) step.value = next.key;
424
+ };
425
+
426
+ // The draft is already loaded (a page prop), so the requested step is
427
+ // clamped synchronously here — no deferred fetch to wait on.
428
+ const query = useQuery();
429
+ const requestedStep = STEPS[Number(query.step) - 1]?.key ?? 'audience';
430
+ step.value =
431
+ stepStatus(requestedStep) === 'locked'
432
+ ? firstIncompleteStep()
433
+ : requestedStep;
434
+
435
+ // Mirror the step into the URL. This is pure client display state (no
436
+ // page prop depends on it), so it updates history directly instead of
437
+ // round-tripping through an Inertia visit.
438
+ watch(step, (next) => {
439
+ const url = new URL(window.location.href);
440
+ url.searchParams.set('step', String(indexOf(next) + 1));
441
+ window.history.replaceState(history.state, '', url);
442
+ });
443
+
444
+ // -- Audience intel ---------------------------------------------------------------
445
+ // Small JSON endpoints, not Inertia visits — resolving the segment must
446
+ // not re-render the page. Same resolve-by-id pattern as the flagship's
447
+ // customer pill.
448
+ const selectedSegment = ref<Segment | null>(null);
449
+ watchEffect(async () => {
450
+ selectedSegment.value =
451
+ draft.segmentId === null
452
+ ? null
453
+ : await fetch(`/segments/${draft.segmentId}`).then((res) => res.json());
454
+ });
455
+
456
+ const estimatedRecipients = ref<number | null>(null);
457
+ watchEffect(async () => {
458
+ if (draft.segmentId === null) {
459
+ estimatedRecipients.value = null;
460
+ return;
461
+ }
462
+ const params = new URLSearchParams();
463
+ draft.countries.forEach((code) => params.append('countries[]', code));
464
+ params.set('excludeRecent', String(draft.excludeRecent));
465
+ estimatedRecipients.value = await fetch(
466
+ `/segments/${draft.segmentId}/estimate?${params.toString()}`
467
+ ).then((res) => res.json());
468
+ });
469
+
470
+ // -- Peek grammar ----------------------------------------------------------------
471
+ const peekSegment = () => {
472
+ if (draft.segmentId !== null)
473
+ shell.push({ type: 'segment', id: draft.segmentId }, true);
474
+ };
475
+
476
+ // -- Persistence + dirty guard ------------------------------------------------------
477
+ const lastSavedAt = ref<string | null>(null);
478
+ const dirty = computed(() => draft.isDirty);
479
+
480
+ // Set right before a deliberate delete, so the guard below never
481
+ // double-prompts on the navigate-away that follows it.
482
+ const discarded = ref(false);
483
+
484
+ const campaignUrl = `/campaigns/${campaignId}`;
485
+ useConfirmOnRouteLeave({
486
+ disabled: () => discarded.value || !dirty.value,
487
+ whitelist: [campaignUrl, `${campaignUrl}/send`, `${campaignUrl}/send-test`],
488
+ title: 'Leave campaign setup?',
489
+ text: 'You have unsaved changes. Leave and lose them, or stay and save the draft.',
490
+ });
491
+
492
+ // -- Actions --------------------------------------------------------------------
493
+ // After a failed save/send, form.errors is already populated by Inertia;
494
+ // jump to whichever step owns the first offending field, same surfacing
495
+ // as a blocked Next.
496
+ const surfaceServerErrors = () => {
497
+ const brokenStep = Object.keys(draft.errors)
498
+ .map(stepForField)
499
+ .find((found): found is StepKey => Boolean(found));
500
+ if (brokenStep) {
501
+ attempted[brokenStep] = true;
502
+ step.value = brokenStep;
503
+ }
504
+ };
505
+
506
+ const saveDraft = async () => {
507
+ try {
508
+ await put(campaignUrl);
509
+ draft.defaults(); // re-baseline: this save is the new "clean" state
510
+ lastSavedAt.value = new Date().toISOString();
511
+ toast({ title: 'Draft saved.', variant: 'success' });
512
+ } catch {
513
+ surfaceServerErrors();
514
+ }
515
+ };
516
+
517
+ const sendTest = async () => {
518
+ if (issues.value.content.length > 0) {
519
+ attempted.content = true; // same surfacing as a blocked Next
520
+ return;
521
+ }
522
+ await post(`${campaignUrl}/send-test`);
523
+ toast({ title: 'Test email sent to your address.', variant: 'success' });
524
+ };
525
+
526
+ const submit = async () => {
527
+ // Whole-wizard validation: land the user on the first broken step.
528
+ const incomplete = STEPS.find((item) => issues.value[item.key].length > 0);
529
+ if (incomplete) {
530
+ attempted[incomplete.key] = true;
531
+ step.value = incomplete.key;
532
+ return;
533
+ }
534
+ try {
535
+ await put(campaignUrl);
536
+ await post(`${campaignUrl}/send`);
537
+ draft.defaults(); // the guard has nothing left to protect
538
+ toast({
539
+ title:
540
+ draft.sendMode === 'now'
541
+ ? 'Campaign is on its way.'
542
+ : 'Campaign scheduled.',
543
+ variant: 'success',
544
+ });
545
+ router.visit(campaignUrl);
546
+ } catch {
547
+ surfaceServerErrors();
548
+ }
549
+ };
550
+
551
+ const discardDraft = async () => {
552
+ const ok = await confirm({
553
+ variant: 'destructive',
554
+ title: 'Discard draft',
555
+ text: `Delete "${campaign.value?.name ?? 'this campaign'}" and everything entered so far? This cannot be undone.`,
556
+ yes: 'Discard',
557
+ no: 'Keep draft',
558
+ });
559
+ if (!ok) return;
560
+ discarded.value = true; // don't double-prompt via the leave guard
561
+ await remove(campaignUrl);
562
+ toast({ title: 'Draft discarded.', variant: 'success' });
563
+ router.visit('/campaigns');
564
+ };
565
+
566
+ const ctx: CampaignWizardContext = {
567
+ shell,
568
+ loading,
569
+ campaign,
570
+ draft,
571
+ step,
572
+ dirty,
573
+ lastSavedAt,
574
+ submitting: isSubmitting,
575
+ issues,
576
+ attempted,
577
+ stepStatus,
578
+ fieldErrors,
579
+ selectedSegment,
580
+ estimatedRecipients,
581
+ peekSegment,
582
+ goToStep,
583
+ goBack,
584
+ goNext,
585
+ saveDraft,
586
+ sendTest,
587
+ submit,
588
+ discardDraft,
589
+ };
590
+ provide(key, ctx);
591
+ return ctx;
592
+ }
593
+
594
+ export function useCampaignWizard(): CampaignWizardContext {
595
+ const ctx = inject(key);
596
+ if (!ctx)
597
+ throw new Error('useCampaignWizard() called outside CampaignWizard');
598
+ return ctx;
599
+ }
600
+ ```
601
+
602
+ ### Index.vue — the assembly
603
+
604
+ ```vue
605
+ <!-- CampaignWizard/Index.vue -->
606
+ <template>
607
+ <PageShell>
608
+ <!-- Topbar: breadcrumbs left; save state + the destructive escape right.
609
+ Wizard archetype: no page search, no filter rail, no tabs. -->
610
+ <template #topbar>
611
+ <div class="flex items-center justify-between gap-4 border-b px-4 py-2">
612
+ <!-- Breadcrumbs take the row's slack on a stable basis (min-w-0 flex-auto);
613
+ without it their overflow recompute fights the flex layout every frame. -->
614
+ <BbBreadcrumbs class="min-w-0 flex-auto" :items="crumbs" />
615
+ <div class="flex shrink-0 items-center gap-3">
616
+ <span v-if="savedLabel" class="text-xs text-gray-500">{{
617
+ savedLabel
618
+ }}</span>
619
+ <BbButton
620
+ prepend:icon="lucide:trash-2"
621
+ variant="destructive"
622
+ @click="ctx.discardDraft"
623
+ >
624
+ Discard draft
625
+ </BbButton>
626
+ </div>
627
+ </div>
628
+ </template>
629
+
630
+ <div class="mx-auto flex w-full max-w-3xl flex-col gap-5 p-4">
631
+ <header class="flex flex-col gap-0.5">
632
+ <h1 class="text-lg font-semibold">
633
+ {{ ctx.campaign.value?.name ?? 'New campaign' }}
634
+ </h1>
635
+ <p class="text-sm text-gray-500">
636
+ Set up the audience, content and schedule, then review and send.
637
+ </p>
638
+ </header>
639
+
640
+ <StepperHeader />
641
+
642
+ <!-- One wrapper around the alert AND the step outlet: the step swap
643
+ and the validation summary appearing/shrinking both glide. -->
644
+ <!-- Enable height motion only after mount so first paint does not
645
+ animate in; later step swaps still glide. -->
646
+ <BbSmoothHeight :disabled="!stepHeightReady">
647
+ <div class="flex flex-col gap-4">
648
+ <BbAlert
649
+ v-if="summaryIssues.length"
650
+ hide-close
651
+ icon="lucide:circle-x"
652
+ :title="`Fix ${summaryIssues.length} ${summaryIssues.length === 1 ? 'issue' : 'issues'} to continue`"
653
+ variant="destructive"
654
+ >
655
+ <template #text>
656
+ <ul class="list-disc pl-4">
657
+ <li v-for="issue in summaryIssues" :key="issue.field">
658
+ {{ issue.message }}
659
+ </li>
660
+ </ul>
661
+ </template>
662
+ </BbAlert>
663
+
664
+ <div v-if="ctx.loading.value" class="flex justify-center p-10">
665
+ <BbSpinner />
666
+ </div>
667
+ <AudienceStep v-else-if="ctx.step.value === 'audience'" />
668
+ <ContentStep v-else-if="ctx.step.value === 'content'" />
669
+ <ScheduleStep v-else-if="ctx.step.value === 'schedule'" />
670
+ <ReviewStep v-else />
671
+ </div>
672
+ </BbSmoothHeight>
673
+
674
+ <WizardFooter />
675
+ </div>
676
+
677
+ <!-- Clicking the segment's NAME peeks it — Audience step and Review. -->
678
+ <template #sidebar>
679
+ <SegmentPeek
680
+ v-if="ctx.shell.current.value?.type === 'segment'"
681
+ :segment-id="ctx.shell.current.value.id"
682
+ />
683
+ </template>
684
+ </PageShell>
685
+ </template>
686
+
687
+ <script setup lang="ts">
688
+ import { computed, onMounted, ref } from 'vue';
689
+ import {
690
+ BbAlert,
691
+ BbBreadcrumbs,
692
+ BbButton,
693
+ BbSmoothHeight,
694
+ BbSpinner,
695
+ } from 'bitboss-ui';
696
+ import PageShell from '@/components/layout/PageShell.vue';
697
+ import { provideCampaignWizard } from './context';
698
+ import AudienceStep from './AudienceStep.vue';
699
+ import ContentStep from './ContentStep.vue';
700
+ import ReviewStep from './ReviewStep.vue';
701
+ import ScheduleStep from './ScheduleStep.vue';
702
+ import SegmentPeek from './SegmentPeek.vue';
703
+ import StepperHeader from './StepperHeader.vue';
704
+ import WizardFooter from './WizardFooter.vue';
705
+
706
+ const ctx = provideCampaignWizard();
707
+
708
+ /** Keep SmoothHeight off while the first paint settles; enable after 300ms
709
+ * for step-to-step glides. */
710
+ const stepHeightReady = ref(false);
711
+ onMounted(() => {
712
+ setTimeout(() => {
713
+ stepHeightReady.value = true;
714
+ }, 300);
715
+ });
716
+
717
+ const crumbs = computed(() => [
718
+ { key: 'dashboard', text: 'Dashboard', href: '/dashboard' },
719
+ { key: 'campaigns', text: 'Campaigns', href: '/campaigns' },
720
+ { key: 'setup', text: ctx.campaign.value?.name ?? 'New campaign' },
721
+ ]);
722
+
723
+ // The summary shows only the CURRENT step's issues, and only once the user
724
+ // tried to leave it — it shrinks live as each problem is fixed.
725
+ const summaryIssues = computed(() =>
726
+ ctx.attempted[ctx.step.value] ? ctx.issues.value[ctx.step.value] : []
727
+ );
728
+
729
+ const savedLabel = computed(() => {
730
+ if (ctx.dirty.value) return 'Unsaved changes';
731
+ if (!ctx.lastSavedAt.value) return null;
732
+ const time = new Date(ctx.lastSavedAt.value).toLocaleTimeString('en-US', {
733
+ hour: 'numeric',
734
+ minute: '2-digit',
735
+ });
736
+ return `Draft saved at ${time}`;
737
+ });
738
+ </script>
739
+ ```
740
+
741
+ ### StepperHeader.vue
742
+
743
+ ```vue
744
+ <!-- CampaignWizard/StepperHeader.vue -->
745
+ <template>
746
+ <nav aria-label="Campaign setup steps" class="flex items-center gap-1">
747
+ <template v-for="(stepMeta, index) in STEPS" :key="stepMeta.key">
748
+ <!-- Connector line between steps. -->
749
+ <div
750
+ v-if="index > 0"
751
+ aria-hidden="true"
752
+ class="h-px min-w-3 flex-1 bg-[var(--bb-border)]"
753
+ />
754
+
755
+ <!-- The primitive gives element semantics + disabled handling; the
756
+ look is entirely ours. Done and upcoming steps jump, locked
757
+ steps are inert. -->
758
+ <BbBaseButton
759
+ :aria-current="status(stepMeta.key) === 'current' ? 'step' : undefined"
760
+ class="flex items-center gap-2 rounded-[var(--bb-radius)] px-2 py-1.5 text-sm focus-visible:ring-2 focus-visible:ring-[var(--bb-primary)]"
761
+ :class="{
762
+ 'bg-[var(--bb-hover)] font-medium':
763
+ status(stepMeta.key) === 'current',
764
+ 'hover:bg-[var(--bb-hover)]': ['done', 'upcoming'].includes(
765
+ status(stepMeta.key)
766
+ ),
767
+ 'text-gray-400': status(stepMeta.key) === 'locked',
768
+ }"
769
+ :disabled="status(stepMeta.key) === 'locked'"
770
+ @click="() => ctx.goToStep(stepMeta.key)"
771
+ >
772
+ <span
773
+ class="flex size-5 shrink-0 items-center justify-center rounded-full border text-xs"
774
+ :class="{
775
+ 'border-transparent bg-[var(--bb-primary)] text-[var(--bb-primary-fg)]':
776
+ status(stepMeta.key) === 'done',
777
+ 'border-[var(--bb-primary)] text-[color:var(--bb-primary)]':
778
+ status(stepMeta.key) === 'current',
779
+ 'border-[var(--bb-border)]': status(stepMeta.key) === 'locked',
780
+ }"
781
+ >
782
+ <BbIcon
783
+ v-if="status(stepMeta.key) === 'done'"
784
+ icon="lucide:check"
785
+ size="12"
786
+ />
787
+ <template v-else>{{ index + 1 }}</template>
788
+ </span>
789
+ {{ stepMeta.label }}
790
+ </BbBaseButton>
791
+ </template>
792
+ </nav>
793
+ </template>
794
+
795
+ <script setup lang="ts">
796
+ import { BbBaseButton, BbIcon } from 'bitboss-ui';
797
+ import { STEPS, useCampaignWizard, type StepKey } from './context';
798
+
799
+ const ctx = useCampaignWizard();
800
+
801
+ const status = (key: StepKey) => ctx.stepStatus(key);
802
+ </script>
803
+ ```
804
+
805
+ ### AudienceStep.vue
806
+
807
+ ```vue
808
+ <!-- CampaignWizard/AudienceStep.vue -->
809
+ <template>
810
+ <section class="flex flex-col gap-4">
811
+ <div class="flex flex-col gap-0.5">
812
+ <h2 class="text-base font-semibold">Who gets this email?</h2>
813
+ <p class="text-sm text-gray-500">
814
+ Pick a segment, then narrow it with delivery filters.
815
+ </p>
816
+ </div>
817
+
818
+ <!-- Query-aware items function: the select searches the API as you type. -->
819
+ <BbSelect
820
+ v-model="ctx.draft.segmentId"
821
+ :errors="segmentErrors"
822
+ item-text="name"
823
+ item-value="id"
824
+ :items="searchSegments"
825
+ label="Segment"
826
+ label-mode="outside"
827
+ placeholder="Search segments…"
828
+ required
829
+ />
830
+
831
+ <!-- Resolved segment + live estimate: the context owns both fetches. -->
832
+ <div
833
+ v-if="ctx.selectedSegment.value"
834
+ class="flex flex-col gap-1 rounded-[var(--bb-radius)] border p-3 text-sm"
835
+ >
836
+ <div class="flex items-center justify-between gap-2">
837
+ <BbButton size="sm" variant="link" @click="ctx.peekSegment">
838
+ {{ ctx.selectedSegment.value.name }}
839
+ </BbButton>
840
+ <span class="text-xs text-gray-500">
841
+ Last synced {{ shortDate(ctx.selectedSegment.value.lastSyncedAt) }}
842
+ </span>
843
+ </div>
844
+ <p class="text-gray-500">
845
+ {{ number.format(ctx.selectedSegment.value.contactCount) }} contacts in
846
+ the segment ·
847
+ <strong class="text-[var(--bb-text)]">
848
+ {{
849
+ ctx.estimatedRecipients.value === null
850
+ ? '…'
851
+ : number.format(ctx.estimatedRecipients.value)
852
+ }}
853
+ </strong>
854
+ estimated recipients after filters
855
+ </p>
856
+ </div>
857
+
858
+ <BbSelect
859
+ v-model="ctx.draft.countries"
860
+ :items="COUNTRIES"
861
+ item-text="label"
862
+ item-value="value"
863
+ label="Limit to countries"
864
+ label-mode="outside"
865
+ multiple
866
+ placeholder="All countries"
867
+ />
868
+
869
+ <BbSwitch
870
+ v-model="ctx.draft.excludeRecent"
871
+ description="Avoids fatigue: anyone who already received a campaign this week is skipped."
872
+ label="Skip contacts emailed in the last 7 days"
873
+ />
874
+ </section>
875
+ </template>
876
+
877
+ <script setup lang="ts">
878
+ import { computed } from 'vue';
879
+ import { BbButton, BbSelect, BbSwitch } from 'bitboss-ui';
880
+ import { COUNTRIES, useCampaignWizard } from './context';
881
+ import type { Segment } from '@/types';
882
+
883
+ const ctx = useCampaignWizard();
884
+
885
+ // A small JSON endpoint, not an Inertia visit — searching the segment
886
+ // picker must not re-render the page.
887
+ const searchSegments = (query: string): Promise<Segment[]> =>
888
+ fetch(`/segments/search?q=${encodeURIComponent(query)}`).then((res) =>
889
+ res.json()
890
+ );
891
+
892
+ // Inline errors appear only after a blocked Next (attempted), per the context.
893
+ const segmentErrors = computed(() => ctx.fieldErrors('audience', 'segmentId'));
894
+
895
+ const number = new Intl.NumberFormat('en-US');
896
+ const shortDate = (value: string) =>
897
+ new Date(value).toLocaleDateString('en-US', {
898
+ month: 'short',
899
+ day: 'numeric',
900
+ });
901
+ </script>
902
+ ```
903
+
904
+ ### ContentStep.vue
905
+
906
+ ```vue
907
+ <!-- CampaignWizard/ContentStep.vue -->
908
+ <template>
909
+ <section class="flex flex-col gap-4">
910
+ <div class="flex flex-col gap-0.5">
911
+ <h2 class="text-base font-semibold">What does it say?</h2>
912
+ <p class="text-sm text-gray-500">
913
+ Subject and preheader are what people see in the inbox list.
914
+ </p>
915
+ </div>
916
+
917
+ <BbTextInput
918
+ v-model="ctx.draft.subject"
919
+ :description="`${ctx.draft.subject.length}/150 characters`"
920
+ :errors="errorsFor('subject')"
921
+ label="Subject line"
922
+ label-mode="outside"
923
+ placeholder="The July roast drop is here — 20% off subscriptions"
924
+ required
925
+ />
926
+
927
+ <BbTextInput
928
+ v-model="ctx.draft.preheader"
929
+ description="Optional. Shows after the subject in most inboxes — keep it under 90 characters."
930
+ label="Preheader"
931
+ label-mode="outside"
932
+ placeholder="Three new single origins, roasted this week."
933
+ />
934
+
935
+ <!-- Fixed rows on purpose: an auto-growing textarea inside BbSmoothHeight
936
+ would re-animate the outlet on every line break while typing. -->
937
+ <BbTextarea
938
+ v-model="ctx.draft.body"
939
+ :errors="errorsFor('body')"
940
+ label="Body"
941
+ label-mode="outside"
942
+ placeholder="Write the email…"
943
+ required
944
+ :rows="10"
945
+ />
946
+
947
+ <BbRadioGroup
948
+ v-model="ctx.draft.templateId"
949
+ :errors="errorsFor('templateId')"
950
+ item-text="name"
951
+ item-value="id"
952
+ :items="TEMPLATES"
953
+ legend="Template"
954
+ name="template"
955
+ required
956
+ >
957
+ <!-- Name + one-line description per option, from the same items. -->
958
+ <template #label="{ item, text }">
959
+ <span class="flex flex-col">
960
+ <span>{{ text }}</span>
961
+ <span class="text-xs text-gray-500">{{ item.description }}</span>
962
+ </span>
963
+ </template>
964
+ </BbRadioGroup>
965
+
966
+ <!-- Auto-loading: the button tracks the async handler by itself. -->
967
+ <div>
968
+ <BbButton
969
+ prepend:icon="lucide:send"
970
+ variant="ghost"
971
+ @click="ctx.sendTest"
972
+ >
973
+ Send test email
974
+ </BbButton>
975
+ </div>
976
+ </section>
977
+ </template>
978
+
979
+ <script setup lang="ts">
980
+ import { BbButton, BbRadioGroup, BbTextarea, BbTextInput } from 'bitboss-ui';
981
+ import { TEMPLATES, useCampaignWizard } from './context';
982
+
983
+ const ctx = useCampaignWizard();
984
+
985
+ const errorsFor = (field: string) => ctx.fieldErrors('content', field);
986
+ </script>
987
+ ```
988
+
989
+ ### ScheduleStep.vue
990
+
991
+ ```vue
992
+ <!-- CampaignWizard/ScheduleStep.vue -->
993
+ <template>
994
+ <section class="flex flex-col gap-4">
995
+ <div class="flex flex-col gap-0.5">
996
+ <h2 class="text-base font-semibold">When does it go out?</h2>
997
+ <p class="text-sm text-gray-500">
998
+ Send it as soon as you confirm, or pick a date.
999
+ </p>
1000
+ </div>
1001
+
1002
+ <BbRadioGroup
1003
+ v-model="ctx.draft.sendMode"
1004
+ item-text="label"
1005
+ item-value="value"
1006
+ :items="[
1007
+ {
1008
+ label: 'Send now — goes out as soon as you confirm on Review',
1009
+ value: 'now',
1010
+ },
1011
+ { label: 'Schedule for later', value: 'scheduled' },
1012
+ ]"
1013
+ legend="When to send"
1014
+ name="send-mode"
1015
+ />
1016
+
1017
+ <!-- No inner BbSmoothHeight: the page-level wrapper's resize observer
1018
+ already animates this region appearing and disappearing. -->
1019
+ <div
1020
+ v-if="ctx.draft.sendMode === 'scheduled'"
1021
+ class="grid gap-4 sm:grid-cols-2"
1022
+ >
1023
+ <BbDatePickerInput
1024
+ v-model="ctx.draft.sendAt"
1025
+ description="Campaigns go out at 9:00 AM local to the timezone you pick."
1026
+ :errors="errorsFor('sendAt')"
1027
+ label="Send date"
1028
+ label-mode="outside"
1029
+ :min="today"
1030
+ required
1031
+ />
1032
+ <BbSelect
1033
+ v-model="ctx.draft.timezone"
1034
+ :errors="errorsFor('timezone')"
1035
+ item-text="label"
1036
+ item-value="value"
1037
+ :items="TIMEZONES"
1038
+ label="Timezone"
1039
+ label-mode="outside"
1040
+ required
1041
+ />
1042
+ </div>
1043
+ </section>
1044
+ </template>
1045
+
1046
+ <script setup lang="ts">
1047
+ import { BbDatePickerInput, BbRadioGroup, BbSelect } from 'bitboss-ui';
1048
+ import { TIMEZONES, useCampaignWizard } from './context';
1049
+
1050
+ const ctx = useCampaignWizard();
1051
+
1052
+ const errorsFor = (field: string) => ctx.fieldErrors('schedule', field);
1053
+
1054
+ // BbDatePickerInput's min takes YYYY-MM-DD.
1055
+ const today = new Date().toISOString().slice(0, 10);
1056
+ </script>
1057
+ ```
1058
+
1059
+ ### ReviewStep.vue
1060
+
1061
+ ```vue
1062
+ <!-- CampaignWizard/ReviewStep.vue -->
1063
+ <template>
1064
+ <section class="flex flex-col gap-5">
1065
+ <div class="flex flex-col gap-0.5">
1066
+ <h2 class="text-base font-semibold">Review and send</h2>
1067
+ <p class="text-sm text-gray-500">
1068
+ Everything below is what goes out. Edit any section — your progress is
1069
+ kept.
1070
+ </p>
1071
+ </div>
1072
+
1073
+ <!-- Audience -->
1074
+ <section
1075
+ class="flex flex-col gap-2 rounded-[var(--bb-radius)] border p-3 text-sm"
1076
+ >
1077
+ <div class="flex items-center justify-between gap-2">
1078
+ <h3 class="text-xs font-semibold uppercase tracking-wide text-gray-500">
1079
+ Audience
1080
+ </h3>
1081
+ <BbButton
1082
+ prepend:icon="lucide:pencil"
1083
+ size="sm"
1084
+ variant="ghost"
1085
+ @click="() => ctx.goToStep('audience')"
1086
+ >
1087
+ Edit
1088
+ </BbButton>
1089
+ </div>
1090
+ <dl class="grid grid-cols-[auto_1fr] gap-x-4 gap-y-1.5">
1091
+ <dt class="text-gray-500">Segment</dt>
1092
+ <dd>
1093
+ <BbButton size="sm" variant="link" @click="ctx.peekSegment">
1094
+ {{ ctx.selectedSegment.value?.name ?? '—' }}
1095
+ </BbButton>
1096
+ </dd>
1097
+ <dt class="text-gray-500">Countries</dt>
1098
+ <dd>{{ countryNames || 'All countries' }}</dd>
1099
+ <dt class="text-gray-500">Fatigue filter</dt>
1100
+ <dd>
1101
+ {{
1102
+ ctx.draft.excludeRecent
1103
+ ? 'Skipping contacts emailed in the last 7 days'
1104
+ : 'Off'
1105
+ }}
1106
+ </dd>
1107
+ <dt class="text-gray-500">Estimated recipients</dt>
1108
+ <dd class="font-medium">
1109
+ {{
1110
+ ctx.estimatedRecipients.value === null
1111
+ ? '—'
1112
+ : number.format(ctx.estimatedRecipients.value)
1113
+ }}
1114
+ </dd>
1115
+ </dl>
1116
+ </section>
1117
+
1118
+ <!-- Content -->
1119
+ <section
1120
+ class="flex flex-col gap-2 rounded-[var(--bb-radius)] border p-3 text-sm"
1121
+ >
1122
+ <div class="flex items-center justify-between gap-2">
1123
+ <h3 class="text-xs font-semibold uppercase tracking-wide text-gray-500">
1124
+ Content
1125
+ </h3>
1126
+ <BbButton
1127
+ prepend:icon="lucide:pencil"
1128
+ size="sm"
1129
+ variant="ghost"
1130
+ @click="() => ctx.goToStep('content')"
1131
+ >
1132
+ Edit
1133
+ </BbButton>
1134
+ </div>
1135
+ <dl class="grid grid-cols-[auto_1fr] gap-x-4 gap-y-1.5">
1136
+ <dt class="text-gray-500">Subject</dt>
1137
+ <dd class="font-medium">{{ ctx.draft.subject }}</dd>
1138
+ <dt class="text-gray-500">Preheader</dt>
1139
+ <dd>{{ ctx.draft.preheader || '—' }}</dd>
1140
+ <dt class="text-gray-500">Template</dt>
1141
+ <dd>{{ templateName }}</dd>
1142
+ <dt class="text-gray-500">Body</dt>
1143
+ <dd class="text-gray-500">{{ bodyExcerpt }}</dd>
1144
+ </dl>
1145
+ </section>
1146
+
1147
+ <!-- Schedule -->
1148
+ <section
1149
+ class="flex flex-col gap-2 rounded-[var(--bb-radius)] border p-3 text-sm"
1150
+ >
1151
+ <div class="flex items-center justify-between gap-2">
1152
+ <h3 class="text-xs font-semibold uppercase tracking-wide text-gray-500">
1153
+ Schedule
1154
+ </h3>
1155
+ <BbButton
1156
+ prepend:icon="lucide:pencil"
1157
+ size="sm"
1158
+ variant="ghost"
1159
+ @click="() => ctx.goToStep('schedule')"
1160
+ >
1161
+ Edit
1162
+ </BbButton>
1163
+ </div>
1164
+ <p>{{ scheduleSummary }}</p>
1165
+ </section>
1166
+ </section>
1167
+ </template>
1168
+
1169
+ <script setup lang="ts">
1170
+ import { computed } from 'vue';
1171
+ import { BbButton } from 'bitboss-ui';
1172
+ import { COUNTRIES, TEMPLATES, TIMEZONES, useCampaignWizard } from './context';
1173
+
1174
+ const ctx = useCampaignWizard();
1175
+
1176
+ const number = new Intl.NumberFormat('en-US');
1177
+
1178
+ const countryNames = computed(() =>
1179
+ ctx.draft.countries
1180
+ .map(
1181
+ (code) =>
1182
+ COUNTRIES.find((country) => country.value === code)?.label ?? code
1183
+ )
1184
+ .join(', ')
1185
+ );
1186
+
1187
+ const templateName = computed(
1188
+ () =>
1189
+ TEMPLATES.find((template) => template.id === ctx.draft.templateId)?.name ??
1190
+ '—'
1191
+ );
1192
+
1193
+ const bodyExcerpt = computed(() =>
1194
+ ctx.draft.body.length > 140
1195
+ ? `${ctx.draft.body.slice(0, 140)}…`
1196
+ : ctx.draft.body
1197
+ );
1198
+
1199
+ const scheduleSummary = computed(() => {
1200
+ if (ctx.draft.sendMode === 'now')
1201
+ return 'Sends immediately after you confirm.';
1202
+ if (!ctx.draft.sendAt) return '—';
1203
+ const date = new Date(ctx.draft.sendAt).toLocaleDateString('en-US', {
1204
+ weekday: 'short',
1205
+ month: 'short',
1206
+ day: 'numeric',
1207
+ year: 'numeric',
1208
+ });
1209
+ const zone =
1210
+ TIMEZONES.find((timezone) => timezone.value === ctx.draft.timezone)
1211
+ ?.label ?? ctx.draft.timezone;
1212
+ return `Scheduled for ${date} · 9:00 AM · ${zone}`;
1213
+ });
1214
+ </script>
1215
+ ```
1216
+
1217
+ ### WizardFooter.vue
1218
+
1219
+ ```vue
1220
+ <!-- CampaignWizard/WizardFooter.vue -->
1221
+ <template>
1222
+ <footer class="flex items-center justify-between gap-2 border-t pt-4">
1223
+ <!-- Back is always free — never validated, only bounded. -->
1224
+ <BbButton
1225
+ :disabled="isFirst"
1226
+ prepend:icon="lucide:chevron-left"
1227
+ variant="ghost"
1228
+ @click="ctx.goBack"
1229
+ >
1230
+ Back
1231
+ </BbButton>
1232
+
1233
+ <div class="flex items-center gap-2">
1234
+ <!-- On every step, whatever the validation state. -->
1235
+ <BbButton
1236
+ prepend:icon="lucide:save"
1237
+ variant="ghost"
1238
+ @click="ctx.saveDraft"
1239
+ >
1240
+ Save draft
1241
+ </BbButton>
1242
+
1243
+ <BbButton
1244
+ v-if="!isReview"
1245
+ append:icon="lucide:chevron-right"
1246
+ variant="secondary"
1247
+ @click="ctx.goNext"
1248
+ >
1249
+ Next
1250
+ </BbButton>
1251
+
1252
+ <!-- The page's single primary. -->
1253
+ <BbButton
1254
+ v-else
1255
+ :loading="ctx.submitting.value"
1256
+ prepend:icon="lucide:send"
1257
+ variant="primary"
1258
+ @click="ctx.submit"
1259
+ >
1260
+ {{
1261
+ ctx.draft.sendMode === 'now' ? 'Send campaign' : 'Schedule campaign'
1262
+ }}
1263
+ </BbButton>
1264
+ </div>
1265
+ </footer>
1266
+ </template>
1267
+
1268
+ <script setup lang="ts">
1269
+ import { computed } from 'vue';
1270
+ import { BbButton } from 'bitboss-ui';
1271
+ import { STEPS, useCampaignWizard } from './context';
1272
+
1273
+ const ctx = useCampaignWizard();
1274
+
1275
+ const isFirst = computed(() => ctx.step.value === STEPS[0].key);
1276
+ const isReview = computed(() => ctx.step.value === 'review');
1277
+ </script>
1278
+ ```
1279
+
1280
+ ### SegmentPeek.vue
1281
+
1282
+ ```vue
1283
+ <!-- CampaignWizard/SegmentPeek.vue -->
1284
+ <template>
1285
+ <div v-if="segment" class="flex flex-col gap-4 text-sm">
1286
+ <header class="flex flex-col gap-0.5">
1287
+ <h2 class="text-base font-semibold">{{ segment.name }}</h2>
1288
+ <p class="text-xs text-gray-500">
1289
+ {{ number.format(segment.contactCount) }} contacts · last synced
1290
+ {{ longDate(segment.lastSyncedAt) }}
1291
+ </p>
1292
+ </header>
1293
+
1294
+ <!-- Stat strip. -->
1295
+ <div class="grid grid-cols-3 gap-2">
1296
+ <div class="rounded-[var(--bb-radius)] border p-2">
1297
+ <p class="text-xs text-gray-500">Avg. open rate</p>
1298
+ <p class="font-semibold">{{ percent(segment.openRate) }}</p>
1299
+ </div>
1300
+ <div class="rounded-[var(--bb-radius)] border p-2">
1301
+ <p class="text-xs text-gray-500">Avg. click rate</p>
1302
+ <p class="font-semibold">{{ percent(segment.clickRate) }}</p>
1303
+ </div>
1304
+ <div class="rounded-[var(--bb-radius)] border p-2">
1305
+ <p class="text-xs text-gray-500">Unsubscribes / mo</p>
1306
+ <p class="font-semibold">
1307
+ {{ number.format(segment.monthlyUnsubscribes) }}
1308
+ </p>
1309
+ </div>
1310
+ </div>
1311
+
1312
+ <!-- The segment's definition, so "who is in here" is answerable in place. -->
1313
+ <section class="flex flex-col gap-1.5">
1314
+ <h3 class="text-xs font-semibold uppercase tracking-wide text-gray-500">
1315
+ Conditions
1316
+ </h3>
1317
+ <ul class="flex flex-col gap-1">
1318
+ <li v-for="rule in segment.rules" :key="rule" class="flex gap-2">
1319
+ <BbIcon
1320
+ class="mt-0.5 shrink-0 text-gray-400"
1321
+ icon="lucide:filter"
1322
+ size="14"
1323
+ />
1324
+ <span>{{ rule }}</span>
1325
+ </li>
1326
+ </ul>
1327
+ </section>
1328
+
1329
+ <!-- Recent campaigns to this segment: fatigue check before sending. -->
1330
+ <section class="flex flex-col gap-1.5">
1331
+ <h3 class="text-xs font-semibold uppercase tracking-wide text-gray-500">
1332
+ Recent campaigns
1333
+ </h3>
1334
+ <ul class="flex flex-col">
1335
+ <li
1336
+ v-for="recent in segment.recentCampaigns"
1337
+ :key="recent.id"
1338
+ class="flex items-center justify-between gap-2 border-b py-1.5 last:border-b-0"
1339
+ >
1340
+ <span>{{ recent.name }}</span>
1341
+ <span class="text-xs text-gray-500">{{
1342
+ longDate(recent.sentAt)
1343
+ }}</span>
1344
+ </li>
1345
+ </ul>
1346
+ </section>
1347
+
1348
+ <footer class="mt-2 flex items-center gap-2 border-t pt-3">
1349
+ <BbButton
1350
+ append:icon="lucide:arrow-up-right"
1351
+ :href="`/segments/${segment.id}`"
1352
+ size="sm"
1353
+ variant="ghost"
1354
+ >
1355
+ Open segment
1356
+ </BbButton>
1357
+ </footer>
1358
+ </div>
1359
+
1360
+ <div v-else class="flex justify-center p-8">
1361
+ <BbSpinner />
1362
+ </div>
1363
+ </template>
1364
+
1365
+ <script setup lang="ts">
1366
+ import { BbButton, BbIcon, BbSpinner } from 'bitboss-ui';
1367
+ import { useResourceContext } from '@/composables/useResourceContext';
1368
+ import type { SegmentDetail } from '@/types';
1369
+
1370
+ const props = defineProps<{ segmentId: number }>();
1371
+
1372
+ // A small JSON endpoint, not a page visit — opening the peek never
1373
+ // re-renders the wizard underneath it. Re-fetches whenever the stack shows
1374
+ // a different segment.
1375
+ const { data: segment } = useResourceContext<SegmentDetail, number>(
1376
+ () => props.segmentId,
1377
+ (id) => fetch(`/segments/${id}/detail`).then((res) => res.json())
1378
+ );
1379
+
1380
+ const number = new Intl.NumberFormat('en-US');
1381
+ const percent = (value: number) => `${(value * 100).toFixed(1)}%`;
1382
+ const longDate = (value: string) =>
1383
+ new Date(value).toLocaleDateString('en-US', {
1384
+ month: 'short',
1385
+ day: 'numeric',
1386
+ year: 'numeric',
1387
+ });
1388
+ </script>
1389
+ ```
1390
+
1391
+ ## Why it is built this way
1392
+
1393
+ - **The context coopts, leaves consume.** `shell` is joined once in
1394
+ `provideCampaignWizard()`; seven components share the draft, the step
1395
+ machine, validation and every action through one `useCampaignWizard()`
1396
+ call. The only data prop on the page is `SegmentPeek`'s `segment-id`;
1397
+ no component receives a callback.
1398
+ - **One gating predicate rules everything.** `unlocked(step)` — every
1399
+ step before it validates — drives the stepper's `upcoming`/`locked`
1400
+ states, `goToStep`'s guard, and (via `issues[current]`) `goNext`. A
1401
+ stepper jump is therefore exactly as safe as pressing Next the right
1402
+ number of times; the header can never smuggle the user past validation.
1403
+ Only steps already passed count as `done` — a defaulted step (Schedule
1404
+ starts valid on "send now") stays numbered (`upcoming`), not
1405
+ checkmarked, until the user actually moves past it, though it is
1406
+ jumpable straight away: there is genuinely nothing left to do there.
1407
+ - **`form.errors` is the error contract for saves, with zero extra
1408
+ bookkeeping.** It is already reactive, so `issues` simply folds it onto
1409
+ the step that owns each field (`FIELDS_BY_STEP`) — no manual
1410
+ `serverErrors` ref to clear and repopulate. A failed save renders in the
1411
+ exact same `BbAlert` summary and inline errors as a client-side block,
1412
+ and `surfaceServerErrors()` jumps the user to the first broken step.
1413
+ Field names stay camelCase (`segmentId`, not `segment_id`) to keep the
1414
+ context's shape identical across all three platforms — the `FormRequest`
1415
+ behind the mutation routes is assumed to key its messages the same way.
1416
+ - **No loading state, because there is nothing to load.** `campaign` and
1417
+ `draft` arrive as page props; `usePromiseForm` seeds itself from `draft`
1418
+ once and `ctx.loading` stays `false` for the whole page's life. The
1419
+ requested `?step` is clamped **synchronously at setup** — unlike the
1420
+ Vue/Nuxt recipes, there is no fetch to wait on before it's safe to do so.
1421
+ - **The step mirrors via `history.replaceState`, not a visit.** Unlike a
1422
+ tab switch on a listing page, no page prop depends on which wizard step
1423
+ is showing, so round-tripping through `router.visit` would only add
1424
+ latency and risk resetting local form edits for no benefit — a direct
1425
+ history update keeps the URL shareable at zero cost.
1426
+ - **Steps are four components, not one with a `type` prop.** Each step
1427
+ owns its inputs, its formatting helpers, and nothing else; the assembly
1428
+ is a `v-if` chain inside the `BbSmoothHeight` outlet. A single
1429
+ `WizardStep` with a renderer switch is the API-monster seed.
1430
+ - **`BbBaseButton` is the right stepper primitive.** The steps are
1431
+ clickable surfaces whose look is entirely bespoke — token-styled pills
1432
+ with a number/check bullet — and the primitive contributes what CSS
1433
+ can't: a real `<button>`, native `disabled` for locked steps, and a
1434
+ focus scaffold (the visible ring is ours, per its guide). `aria-current="step"`
1435
+ is set manually — the prop-based `ariaCurrentValue` only applies to
1436
+ exact-active _links_.
1437
+ - **One `BbSmoothHeight`, wrapping alert + outlet.** Both height changes
1438
+ on this page — the step swap and the summary toggling — animate through
1439
+ the same wrapper, so they compose into one glide when Next is blocked.
1440
+ Regions that appear _inside_ a step (the scheduled-date grid) are caught
1441
+ by the same resize observer; and the body textarea keeps fixed `rows`
1442
+ because an auto-growing textarea inside the wrapper would re-animate the
1443
+ outlet on every line break. Height motion is enabled only after mount
1444
+ (`:disabled` until a 300ms `onMounted` flag flips), so the first paint
1445
+ never animates in.
1446
+ - **The guard drives off `form.isDirty`, whitelisted against its own
1447
+ saves.** `useConfirmOnRouteLeave` reads `dirty` (an alias for
1448
+ `draft.isDirty`) and whitelists `campaignUrl` and its `/send` and
1449
+ `/send-test` children, so `saveDraft`/`sendTest`/`submit` can never
1450
+ block themselves. `draft.defaults()` re-baselines the dirty tracking
1451
+ right after a successful save/send, so the follow-up `router.visit`
1452
+ away from the page never re-prompts; `discardDraft` sets a local
1453
+ `discarded` flag before its own delete + navigate for the same reason —
1454
+ the same "nothing left to protect" guarantee the Vue/Nuxt snapshot reset
1455
+ gives, expressed with Inertia's own dirty tracking instead.
1456
+ - **Sizing:** everything follows `md`-first — footer, topbar and step
1457
+ forms use default-size buttons and regular inputs; `sm` appears only on
1458
+ the dense inline surfaces (Review's Edit/segment links, the peek
1459
+ footer). One `variant="primary"` (Send/Schedule); Next is `secondary`;
1460
+ Save draft, Back and Send test are ghosts; the two destructive actions
1461
+ (discard, leave-with-changes) both ride `useConfirm`.
1462
+
1463
+ ## Variations
1464
+
1465
+ - **Branching steps**: make `STEPS` a computed — e.g. an A/B test
1466
+ campaign inserts a "Variants" step after Content. The status predicate,
1467
+ URL mapping and footer already work off the array, so nothing else
1468
+ changes.
1469
+ - **Autosave**: debounce a watcher on `draft` that calls a silent
1470
+ `saveDraft` (no toast); the footer button and the topbar save-state stay
1471
+ as the manual escape, and the leave guard almost never fires.
1472
+ - **Vertical checklist stepper** (Mailchimp's actual layout): swap
1473
+ `StepperHeader` for a left rail where each step row also shows its
1474
+ one-line summary and the step bodies expand in place — the context and
1475
+ its predicate are unchanged.
1476
+ - **Send time**: add an hour `BbSelect` beside the timezone and fold it
1477
+ into `sendAt` on save, replacing the fixed 9:00 AM policy.