bitboss-ui 2.1.135 → 3.0.0-alpha.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1369) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +274 -24
  3. package/bin/bitboss-ui-mcp.mjs +662 -0
  4. package/bin/bitboss-ui.mjs +710 -0
  5. package/bin/bitboss-ui.node.test.mjs +113 -0
  6. package/dist/ai/BbAccordion.md +528 -113
  7. package/dist/ai/BbAlert.md +380 -197
  8. package/dist/ai/BbAsterisk.md +46 -0
  9. package/dist/ai/BbAvatar.md +458 -178
  10. package/dist/ai/BbBadge.md +697 -225
  11. package/dist/ai/BbBadgeButton.md +54 -0
  12. package/dist/ai/BbBaseButton.md +491 -0
  13. package/dist/ai/BbBaseCheckbox.md +49 -0
  14. package/dist/ai/BbBaseCheckboxGroup.md +64 -0
  15. package/dist/ai/BbBaseCheckboxIcon.md +176 -0
  16. package/dist/ai/BbBaseColorInput.md +64 -0
  17. package/dist/ai/BbBaseColorPalette.md +39 -0
  18. package/dist/ai/BbBaseDatePicker.md +42 -0
  19. package/dist/ai/BbBaseDatePickerInput.md +73 -0
  20. package/dist/ai/BbBaseInputContainer.md +48 -0
  21. package/dist/ai/BbBaseNumberInput.md +71 -0
  22. package/dist/ai/BbBaseRadio.md +46 -0
  23. package/dist/ai/BbBaseRadioGroup.md +64 -0
  24. package/dist/ai/BbBaseRadioIcon.md +191 -0
  25. package/dist/ai/BbBaseRating.md +51 -0
  26. package/dist/ai/BbBaseSelect.md +88 -0
  27. package/dist/ai/BbBaseSlider.md +56 -0
  28. package/dist/ai/BbBaseSwitch.md +49 -0
  29. package/dist/ai/BbBaseSwitchGroup.md +64 -0
  30. package/dist/ai/BbBaseSwitchIcon.md +186 -0
  31. package/dist/ai/BbBaseTag.md +68 -0
  32. package/dist/ai/BbBaseTextInput.md +75 -0
  33. package/dist/ai/BbBaseTextarea.md +62 -0
  34. package/dist/ai/BbBaseTimePickerInput.md +62 -0
  35. package/dist/ai/BbBreadcrumbs.md +553 -503
  36. package/dist/ai/BbButton.md +841 -636
  37. package/dist/ai/BbCheckbox.md +585 -254
  38. package/dist/ai/BbCheckboxGroup.md +573 -361
  39. package/dist/ai/BbCollapsible.md +425 -103
  40. package/dist/ai/BbColorInput.md +536 -323
  41. package/dist/ai/BbColorPalette.md +569 -330
  42. package/dist/ai/BbConfirm.md +659 -136
  43. package/dist/ai/BbConfirmPortal.md +28 -0
  44. package/dist/ai/BbDatePicker.md +244 -0
  45. package/dist/ai/BbDatePickerInput.md +720 -388
  46. package/dist/ai/BbDialog.md +778 -99
  47. package/dist/ai/BbDropdown.md +1072 -763
  48. package/dist/ai/BbDropdownButton.md +525 -614
  49. package/dist/ai/BbDropdownGroup.md +34 -0
  50. package/dist/ai/BbDropzone.md +1206 -436
  51. package/dist/ai/BbForm.md +239 -0
  52. package/dist/ai/BbIcon.md +382 -212
  53. package/dist/ai/BbIndicator.md +283 -0
  54. package/dist/ai/BbNumberInput.md +717 -355
  55. package/dist/ai/BbOffCanvas.md +897 -498
  56. package/dist/ai/BbPagination.md +489 -535
  57. package/dist/ai/BbPopover.md +591 -546
  58. package/dist/ai/BbProgress.md +462 -69
  59. package/dist/ai/BbRadio.md +352 -229
  60. package/dist/ai/BbRadioGroup.md +437 -353
  61. package/dist/ai/BbRating.md +372 -225
  62. package/dist/ai/BbSelect.md +1399 -536
  63. package/dist/ai/BbSelectPopover.md +1255 -1578
  64. package/dist/ai/BbSlider.md +500 -256
  65. package/dist/ai/BbSmoothHeight.md +485 -139
  66. package/dist/ai/BbSpinner.md +718 -131
  67. package/dist/ai/BbSwitch.md +573 -119
  68. package/dist/ai/BbSwitchGroup.md +521 -214
  69. package/dist/ai/BbTable.md +1996 -2365
  70. package/dist/ai/BbTabs.md +1147 -0
  71. package/dist/ai/BbTabsList.md +29 -0
  72. package/dist/ai/BbTabsPanes.md +27 -0
  73. package/dist/ai/BbTabsRoot.md +57 -0
  74. package/dist/ai/BbTag.md +416 -292
  75. package/dist/ai/BbTextInput.md +878 -333
  76. package/dist/ai/BbTextarea.md +850 -255
  77. package/dist/ai/BbTimePicker.md +231 -0
  78. package/dist/ai/BbTimePickerInput.md +200 -0
  79. package/dist/ai/BbToast.md +669 -196
  80. package/dist/ai/BbToastPortal.md +28 -0
  81. package/dist/ai/BbTooltip.md +453 -346
  82. package/dist/ai/BbTree.md +993 -234
  83. package/dist/ai/ChipsBox.md +27 -199
  84. package/dist/ai/ClearableButton.md +21 -55
  85. package/dist/ai/CommaBox.md +25 -200
  86. package/dist/ai/CommonInputWrapper.md +42 -0
  87. package/dist/ai/CommonPopover.md +30 -510
  88. package/dist/ai/ErrorIcon.md +19 -56
  89. package/dist/ai/FlatListBox.md +35 -379
  90. package/dist/ai/GroupedListBox.md +37 -535
  91. package/dist/ai/GuidesComponent.md +21 -0
  92. package/dist/ai/ListBox.md +38 -231
  93. package/dist/ai/OptionsContainer.md +34 -253
  94. package/dist/ai/WarningIcon.md +21 -0
  95. package/dist/ai/components.json +15897 -0
  96. package/dist/ai/composables/useBbConfig.md +80 -0
  97. package/dist/ai/composables/useBbFormContext.md +110 -0
  98. package/dist/ai/composables/useBbTableContext.md +167 -0
  99. package/dist/ai/composables/useBbTabsContext.md +118 -0
  100. package/dist/ai/composables/useBroadcastChannelInstance.md +97 -0
  101. package/dist/ai/composables/useConfirm.md +313 -0
  102. package/dist/ai/composables/useCountdown.md +86 -0
  103. package/dist/ai/composables/useId.md +60 -0
  104. package/dist/ai/composables/useMobile.md +85 -0
  105. package/dist/ai/composables/useToast.md +238 -0
  106. package/dist/ai/guides/agent-contract.md +165 -0
  107. package/dist/ai/guides/ai-router.md +113 -0
  108. package/dist/ai/guides/app-layout.md +318 -0
  109. package/dist/ai/guides/coherence-playbook.md +136 -0
  110. package/dist/ai/guides/component-picker.md +236 -0
  111. package/dist/ai/guides/design-language.md +478 -0
  112. package/dist/ai/guides/design-tokens.md +450 -0
  113. package/dist/ai/guides/fetch-items-playbook.md +161 -0
  114. package/dist/ai/guides/floating-bottom-panel.md +130 -0
  115. package/dist/ai/guides/icons-policy.md +257 -0
  116. package/dist/ai/guides/inertia-helpers.md +1443 -0
  117. package/dist/ai/guides/inline-edit-playbook.md +267 -0
  118. package/dist/ai/guides/installation-and-plugin-setup.md +440 -0
  119. package/dist/ai/guides/migration/components/bb-alert.md +37 -0
  120. package/dist/ai/guides/migration/components/bb-avatar.md +24 -0
  121. package/dist/ai/guides/migration/components/bb-badge.md +110 -0
  122. package/dist/ai/guides/migration/components/bb-breadcrumbs.md +26 -0
  123. package/dist/ai/guides/migration/components/bb-button.md +55 -0
  124. package/dist/ai/guides/migration/components/bb-checkbox-group.md +54 -0
  125. package/dist/ai/guides/migration/components/bb-checkbox.md +45 -0
  126. package/dist/ai/guides/migration/components/bb-chip.md +35 -0
  127. package/dist/ai/guides/migration/components/bb-collapsible.md +26 -0
  128. package/dist/ai/guides/migration/components/bb-color-input.md +23 -0
  129. package/dist/ai/guides/migration/components/bb-color-palette.md +31 -0
  130. package/dist/ai/guides/migration/components/bb-date-picker-input.md +84 -0
  131. package/dist/ai/guides/migration/components/bb-dialog.md +46 -0
  132. package/dist/ai/guides/migration/components/bb-dropdown-button.md +31 -0
  133. package/dist/ai/guides/migration/components/bb-dropdown.md +36 -0
  134. package/dist/ai/guides/migration/components/bb-dropzone.md +27 -0
  135. package/dist/ai/guides/migration/components/bb-icon.md +27 -0
  136. package/dist/ai/guides/migration/components/bb-offcanvas.md +63 -0
  137. package/dist/ai/guides/migration/components/bb-pagination.md +24 -0
  138. package/dist/ai/guides/migration/components/bb-popover.md +52 -0
  139. package/dist/ai/guides/migration/components/bb-rating.md +24 -0
  140. package/dist/ai/guides/migration/components/bb-select-popover.md +59 -0
  141. package/dist/ai/guides/migration/components/bb-select.md +69 -0
  142. package/dist/ai/guides/migration/components/bb-slider.md +25 -0
  143. package/dist/ai/guides/migration/components/bb-smooth-height.md +45 -0
  144. package/dist/ai/guides/migration/components/bb-spinner.md +23 -0
  145. package/dist/ai/guides/migration/components/bb-table.md +66 -0
  146. package/dist/ai/guides/migration/components/bb-tabs.md +47 -0
  147. package/dist/ai/guides/migration/components/bb-tag.md +29 -0
  148. package/dist/ai/guides/migration/components/bb-text-input.md +37 -0
  149. package/dist/ai/guides/migration/components/bb-toast.md +47 -0
  150. package/dist/ai/guides/migration/components/bb-tooltip.md +34 -0
  151. package/dist/ai/guides/migration/components/bb-tree.md +77 -0
  152. package/dist/ai/guides/migration/components/use-confirm.md +46 -0
  153. package/dist/ai/guides/migration/v2-to-v3.md +649 -0
  154. package/dist/ai/guides/options-items-playbook.md +222 -0
  155. package/dist/ai/guides/page-shell.md +113 -0
  156. package/dist/ai/guides/validated-forms.md +177 -0
  157. package/dist/ai/index.md +158 -32
  158. package/dist/ai/recipes/inertia/approvals-inbox.md +1635 -0
  159. package/dist/ai/recipes/inertia/inline-edit-workspace.md +1765 -0
  160. package/dist/ai/recipes/inertia/layout-scaffold.md +385 -0
  161. package/dist/ai/recipes/inertia/onboarding.md +1791 -0
  162. package/dist/ai/recipes/inertia/ownership-atlas.md +1327 -0
  163. package/dist/ai/recipes/inertia/record-form.md +1489 -0
  164. package/dist/ai/recipes/inertia/records-workspace.md +1416 -0
  165. package/dist/ai/recipes/inertia/upload-center.md +2003 -0
  166. package/dist/ai/recipes/inertia/wizard-form.md +1500 -0
  167. package/dist/ai/recipes/nuxt/approvals-inbox.md +1578 -0
  168. package/dist/ai/recipes/nuxt/inline-edit-workspace.md +1703 -0
  169. package/dist/ai/recipes/nuxt/layout-scaffold.md +385 -0
  170. package/dist/ai/recipes/nuxt/onboarding.md +1724 -0
  171. package/dist/ai/recipes/nuxt/record-form.md +1502 -0
  172. package/dist/ai/recipes/nuxt/records-workspace.md +1329 -0
  173. package/dist/ai/recipes/nuxt/upload-center.md +1886 -0
  174. package/dist/ai/recipes/nuxt/wizard-form.md +1509 -0
  175. package/dist/ai/recipes/vue/approvals-inbox.md +1496 -0
  176. package/dist/ai/recipes/vue/inline-edit-workspace.md +1594 -0
  177. package/dist/ai/recipes/vue/layout-scaffold.md +385 -0
  178. package/dist/ai/recipes/vue/onboarding.md +1679 -0
  179. package/dist/ai/recipes/vue/record-form.md +1586 -0
  180. package/dist/ai/recipes/vue/records-workspace.md +1245 -0
  181. package/dist/ai/recipes/vue/upload-center.md +1845 -0
  182. package/dist/ai/recipes/vue/wizard-form.md +1441 -0
  183. package/dist/ai/source/BbAccordion.md +123 -0
  184. package/dist/ai/source/BbAlert.md +401 -0
  185. package/dist/ai/source/BbAsterisk.md +32 -0
  186. package/dist/ai/source/BbAvatar.md +258 -0
  187. package/dist/ai/source/BbBadge.md +560 -0
  188. package/dist/ai/source/BbBadgeButton.md +490 -0
  189. package/dist/ai/source/BbBaseButton.md +682 -0
  190. package/dist/ai/source/BbBaseCheckbox.md +461 -0
  191. package/dist/ai/source/BbBaseCheckboxGroup.md +554 -0
  192. package/dist/ai/source/BbBaseCheckboxIcon.md +201 -0
  193. package/dist/ai/source/BbBaseColorInput.md +416 -0
  194. package/dist/ai/source/BbBaseColorPalette.md +934 -0
  195. package/dist/ai/source/BbBaseDatePicker.md +1001 -0
  196. package/dist/ai/source/BbBaseDatePickerInput.md +1785 -0
  197. package/dist/ai/source/BbBaseInputContainer.md +1210 -0
  198. package/dist/ai/source/BbBaseNumberInput.md +617 -0
  199. package/dist/ai/source/BbBaseRadio.md +377 -0
  200. package/dist/ai/source/BbBaseRadioGroup.md +533 -0
  201. package/dist/ai/source/BbBaseRadioIcon.md +153 -0
  202. package/dist/ai/source/BbBaseRating.md +573 -0
  203. package/dist/ai/source/BbBaseSelect.md +898 -0
  204. package/dist/ai/source/BbBaseSlider.md +1085 -0
  205. package/dist/ai/source/BbBaseSwitch.md +246 -0
  206. package/dist/ai/source/BbBaseSwitchGroup.md +302 -0
  207. package/dist/ai/source/BbBaseSwitchIcon.md +206 -0
  208. package/dist/ai/source/BbBaseTag.md +694 -0
  209. package/dist/ai/source/BbBaseTextInput.md +511 -0
  210. package/dist/ai/source/BbBaseTextarea.md +480 -0
  211. package/dist/ai/source/BbBaseTimePickerInput.md +1031 -0
  212. package/dist/ai/source/BbBreadcrumbs.md +815 -0
  213. package/dist/ai/source/BbButton.md +1006 -0
  214. package/dist/ai/source/BbCheckbox.md +326 -0
  215. package/dist/ai/source/BbCheckboxGroup.md +419 -0
  216. package/dist/ai/source/BbCollapsible.md +137 -0
  217. package/dist/ai/source/BbColorInput.md +322 -0
  218. package/dist/ai/source/BbColorPalette.md +371 -0
  219. package/dist/ai/source/BbConfirm.md +193 -0
  220. package/dist/ai/source/BbConfirmPortal.md +74 -0
  221. package/dist/ai/source/BbDatePicker.md +729 -0
  222. package/dist/ai/source/BbDatePickerInput.md +525 -0
  223. package/dist/ai/source/BbDialog.md +818 -0
  224. package/dist/ai/source/BbDropdown.md +2387 -0
  225. package/dist/ai/source/BbDropdownButton.md +315 -0
  226. package/dist/ai/source/BbDropdownGroup.md +1259 -0
  227. package/dist/ai/source/BbDropzone.md +864 -0
  228. package/dist/ai/source/BbForm.md +100 -0
  229. package/dist/ai/source/BbIcon.md +214 -0
  230. package/dist/ai/source/BbIndicator.md +298 -0
  231. package/dist/ai/source/BbNumberInput.md +374 -0
  232. package/dist/ai/source/BbOffCanvas.md +1266 -0
  233. package/dist/ai/source/BbPagination.md +835 -0
  234. package/dist/ai/source/BbPopover.md +860 -0
  235. package/dist/ai/source/BbProgress.md +140 -0
  236. package/dist/ai/source/BbRadio.md +303 -0
  237. package/dist/ai/source/BbRadioGroup.md +420 -0
  238. package/dist/ai/source/BbRating.md +369 -0
  239. package/dist/ai/source/BbSelect.md +688 -0
  240. package/dist/ai/source/BbSelectPopover.md +2234 -0
  241. package/dist/ai/source/BbSlider.md +378 -0
  242. package/dist/ai/source/BbSmoothHeight.md +265 -0
  243. package/dist/ai/source/BbSpinner.md +127 -0
  244. package/dist/ai/source/BbSwitch.md +175 -0
  245. package/dist/ai/source/BbSwitchGroup.md +240 -0
  246. package/dist/ai/source/BbTable.md +3433 -0
  247. package/dist/ai/source/BbTabs.md +403 -0
  248. package/dist/ai/source/BbTabsList.md +578 -0
  249. package/dist/ai/source/BbTabsPanes.md +368 -0
  250. package/dist/ai/source/BbTabsRoot.md +372 -0
  251. package/dist/ai/source/BbTag.md +390 -0
  252. package/dist/ai/source/BbTextInput.md +352 -0
  253. package/dist/ai/source/BbTextarea.md +337 -0
  254. package/dist/ai/source/BbTimePicker.md +595 -0
  255. package/dist/ai/source/BbTimePickerInput.md +376 -0
  256. package/dist/ai/source/BbToast.md +525 -0
  257. package/dist/ai/source/BbToastPortal.md +482 -0
  258. package/dist/ai/source/BbTooltip.md +522 -0
  259. package/dist/ai/source/BbTree.md +323 -0
  260. package/dist/ai/source/ChipsBox.md +201 -0
  261. package/dist/ai/source/ClearableButton.md +70 -0
  262. package/dist/ai/source/CommaBox.md +202 -0
  263. package/dist/ai/source/CommonInputWrapper.md +554 -0
  264. package/dist/ai/source/CommonPopover.md +616 -0
  265. package/dist/ai/source/ErrorIcon.md +43 -0
  266. package/dist/ai/source/FlatListBox.md +396 -0
  267. package/dist/ai/source/GroupedListBox.md +540 -0
  268. package/dist/ai/source/GuidesComponent.md +383 -0
  269. package/dist/ai/source/ListBox.md +238 -0
  270. package/dist/ai/source/OptionsContainer.md +191 -0
  271. package/dist/ai/source/WarningIcon.md +47 -0
  272. package/dist/alert-variants.d.ts +19 -0
  273. package/dist/assets/css/reset.css_inline.js +4 -0
  274. package/dist/assets/svgs/alert.svg_raw.js +4 -0
  275. package/dist/assets/svgs/calendar.svg_raw.js +4 -0
  276. package/dist/assets/svgs/check_stroke.svg_raw.js +4 -0
  277. package/dist/assets/svgs/chevron_down.svg_raw.js +4 -0
  278. package/dist/assets/svgs/chevron_right.svg_raw.js +4 -0
  279. package/dist/assets/svgs/clear.svg_raw.js +4 -0
  280. package/dist/assets/svgs/clock.svg_raw.js +4 -0
  281. package/dist/assets/svgs/error.svg_raw.js +4 -0
  282. package/dist/assets/svgs/search.svg_raw.js +4 -0
  283. package/dist/assets/svgs/sort.svg_raw.js +4 -0
  284. package/dist/assets/svgs/spinner.svg_raw.js +4 -0
  285. package/dist/assets/svgs/user.svg_raw.js +4 -0
  286. package/dist/badge-variants.d.ts +19 -0
  287. package/dist/button-variants.d.ts +21 -0
  288. package/dist/components/BbAccordion/BbAccordion.vue.d.ts +9 -3
  289. package/dist/components/BbAccordion/BbAccordion.vue.js +6 -0
  290. package/dist/components/BbAccordion/BbAccordion.vue_vue_type_script_setup_true_lang.js +66 -0
  291. package/dist/components/BbAccordion/types.d.ts +12 -8
  292. package/dist/components/BbAlert/BbAlert.vue.d.ts +12 -3
  293. package/dist/components/BbAlert/BbAlert.vue.js +6 -0
  294. package/dist/components/BbAlert/BbAlert.vue_vue_type_script_setup_true_lang.js +65 -0
  295. package/dist/components/BbAlert/types.d.ts +56 -12
  296. package/dist/components/BbAsterisk/BbAsterisk.vue.d.ts +3 -0
  297. package/dist/components/BbAsterisk/BbAsterisk.vue.js +6 -0
  298. package/dist/components/BbAsterisk/BbAsterisk.vue_vue_type_script_setup_true_lang.js +13 -0
  299. package/dist/components/BbAvatar/BbAvatar.vue.d.ts +5 -0
  300. package/dist/components/BbAvatar/BbAvatar.vue.js +6 -0
  301. package/dist/components/BbAvatar/BbAvatar.vue_vue_type_script_setup_true_lang.js +78 -0
  302. package/dist/components/BbAvatar/types.d.ts +6 -5
  303. package/dist/components/BbBadge/BadgeAppendIcon.vue.d.ts +3 -0
  304. package/dist/components/BbBadge/BadgeAppendIcon.vue.js +5 -0
  305. package/dist/components/BbBadge/BadgeAppendIcon.vue_vue_type_script_setup_true_lang.js +22 -0
  306. package/dist/components/BbBadge/BadgeBodyContent.vue.d.ts +15 -0
  307. package/dist/components/BbBadge/BadgeBodyContent.vue.js +5 -0
  308. package/dist/components/BbBadge/BadgeBodyContent.vue_vue_type_script_setup_true_lang.js +34 -0
  309. package/dist/components/BbBadge/BbBadge.vue.d.ts +8 -1
  310. package/dist/components/BbBadge/BbBadge.vue.js +6 -0
  311. package/dist/components/BbBadge/BbBadge.vue_vue_type_script_setup_true_lang.js +83 -0
  312. package/dist/components/BbBadge/BbBadgeButton.vue.d.ts +12 -0
  313. package/dist/components/BbBadge/BbBadgeButton.vue.js +5 -0
  314. package/dist/components/BbBadge/BbBadgeButton.vue_vue_type_script_setup_true_lang.js +54 -0
  315. package/dist/components/BbBadge/badgeButtonContext.d.ts +27 -0
  316. package/dist/components/BbBadge/badgeButtonContext.js +5 -0
  317. package/dist/components/BbBadge/types.d.ts +61 -16
  318. package/dist/components/BbBaseButton/BbBaseButton.vue.d.ts +13 -0
  319. package/dist/components/BbBaseButton/BbBaseButton.vue.js +6 -0
  320. package/dist/components/BbBaseButton/BbBaseButton.vue_vue_type_script_setup_true_lang.js +171 -0
  321. package/dist/components/BbBaseButton/RouterComponent.vue.js +5 -0
  322. package/dist/components/BbBaseButton/RouterComponent.vue_vue_type_script_setup_true_lang.js +29 -0
  323. package/dist/components/BbBaseButton/types.d.ts +191 -0
  324. package/dist/components/BbBaseButton/types.js +33 -0
  325. package/dist/components/BbBaseCheckbox/BbBaseCheckbox.vue.d.ts +40 -0
  326. package/dist/components/BbBaseCheckbox/BbBaseCheckbox.vue.js +6 -0
  327. package/dist/components/BbBaseCheckbox/BbBaseCheckbox.vue_vue_type_script_setup_true_lang.js +145 -0
  328. package/dist/components/BbBaseCheckbox/types.d.ts +224 -0
  329. package/dist/components/BbBaseCheckboxGroup/BbBaseCheckboxGroup.vue.d.ts +19 -0
  330. package/dist/components/BbBaseCheckboxGroup/BbBaseCheckboxGroup.vue.js +6 -0
  331. package/dist/components/BbBaseCheckboxGroup/BbBaseCheckboxGroup.vue_vue_type_script_setup_true_lang.js +190 -0
  332. package/dist/components/BbBaseCheckboxGroup/types.d.ts +257 -0
  333. package/dist/components/BbBaseCheckboxIcon/BbBaseCheckboxIcon.vue.d.ts +4 -0
  334. package/dist/components/BbBaseCheckboxIcon/BbBaseCheckboxIcon.vue.js +6 -0
  335. package/dist/components/BbBaseCheckboxIcon/BbBaseCheckboxIcon.vue_vue_type_script_setup_true_lang.js +43 -0
  336. package/dist/components/BbBaseCheckboxIcon/types.d.ts +47 -0
  337. package/dist/components/BbBaseColorInput/BbBaseColorInput.vue.d.ts +42 -0
  338. package/dist/components/BbBaseColorInput/BbBaseColorInput.vue.js +6 -0
  339. package/dist/components/BbBaseColorInput/BbBaseColorInput.vue_vue_type_script_setup_true_lang.js +178 -0
  340. package/dist/components/BbBaseColorInput/types.d.ts +210 -0
  341. package/dist/components/BbBaseColorPalette/BbBaseColorPalette.vue.d.ts +13 -0
  342. package/dist/components/BbBaseColorPalette/BbBaseColorPalette.vue.js +6 -0
  343. package/dist/components/BbBaseColorPalette/BbBaseColorPalette.vue_vue_type_script_setup_true_lang.js +395 -0
  344. package/dist/components/BbBaseColorPalette/types.d.ts +40 -0
  345. package/dist/components/BbBaseDatePicker/BbBaseDatePicker.vue.js +6 -0
  346. package/dist/components/BbBaseDatePicker/BbBaseDatePicker.vue_vue_type_script_setup_true_lang.js +300 -0
  347. package/dist/components/BbBaseDatePicker/BbBaseDatePickerInputDaySelector.vue.d.ts +44 -0
  348. package/dist/components/BbBaseDatePicker/BbBaseDatePickerInputDaySelector.vue.js +5 -0
  349. package/dist/components/BbBaseDatePicker/BbBaseDatePickerInputDaySelector.vue_vue_type_script_setup_true_lang.js +310 -0
  350. package/dist/components/BbBaseDatePicker/BbBaseDatePickerMonthSelector.vue.d.ts +5 -0
  351. package/dist/components/BbBaseDatePicker/BbBaseDatePickerMonthSelector.vue.js +5 -0
  352. package/dist/components/BbBaseDatePicker/BbBaseDatePickerMonthSelector.vue_vue_type_script_setup_true_lang.js +63 -0
  353. package/dist/components/BbBaseDatePicker/BbBaseDatePickerYearSelector.vue.d.ts +5 -0
  354. package/dist/components/BbBaseDatePicker/BbBaseDatePickerYearSelector.vue.js +5 -0
  355. package/dist/components/BbBaseDatePicker/BbBaseDatePickerYearSelector.vue_vue_type_script_setup_true_lang.js +75 -0
  356. package/dist/components/BbBaseDatePicker/typeahead.d.ts +112 -0
  357. package/dist/components/BbBaseDatePicker/typeahead.js +37 -0
  358. package/dist/components/BbBaseDatePicker/types.d.ts +97 -0
  359. package/dist/components/BbBaseDatePicker/useDatePickerContext.d.ts +58 -0
  360. package/dist/components/BbBaseDatePicker/useDatePickerContext.js +11 -0
  361. package/dist/components/BbBaseDatePickerInput/BbBaseDatePickerInput.vue.d.ts +30 -0
  362. package/dist/components/BbBaseDatePickerInput/BbBaseDatePickerInput.vue.js +6 -0
  363. package/dist/components/BbBaseDatePickerInput/BbBaseDatePickerInput.vue_vue_type_script_setup_true_lang.js +716 -0
  364. package/dist/components/BbBaseDatePickerInput/BbBaseDatePickerTimeSelector.vue.d.ts +30 -0
  365. package/dist/components/BbBaseDatePickerInput/BbBaseDatePickerTimeSelector.vue.js +6 -0
  366. package/dist/components/BbBaseDatePickerInput/BbBaseDatePickerTimeSelector.vue_vue_type_script_setup_true_lang.js +204 -0
  367. package/dist/components/BbBaseDatePickerInput/types.d.ts +311 -0
  368. package/dist/components/BbBaseInputContainer/BbBaseInputContainer.vue.d.ts +17 -0
  369. package/dist/components/BbBaseInputContainer/BbBaseInputContainer.vue.js +6 -0
  370. package/dist/components/BbBaseInputContainer/BbBaseInputContainer.vue_vue_type_script_setup_true_lang.js +191 -0
  371. package/dist/components/BbBaseInputContainer/types.d.ts +197 -0
  372. package/dist/components/BbBaseNumberInput/BbBaseNumberInput.vue.d.ts +52 -0
  373. package/dist/components/BbBaseNumberInput/BbBaseNumberInput.vue.js +6 -0
  374. package/dist/components/BbBaseNumberInput/BbBaseNumberInput.vue_vue_type_script_setup_true_lang.js +215 -0
  375. package/dist/components/BbBaseNumberInput/types.d.ts +211 -0
  376. package/dist/components/BbBaseRadio/BbBaseRadio.vue.d.ts +33 -0
  377. package/dist/components/BbBaseRadio/BbBaseRadio.vue.js +6 -0
  378. package/dist/components/BbBaseRadio/BbBaseRadio.vue_vue_type_script_setup_true_lang.js +114 -0
  379. package/dist/components/BbBaseRadio/types.d.ts +179 -0
  380. package/dist/components/BbBaseRadioGroup/BbBaseRadioGroup.vue.d.ts +19 -0
  381. package/dist/components/BbBaseRadioGroup/BbBaseRadioGroup.vue.js +6 -0
  382. package/dist/components/BbBaseRadioGroup/BbBaseRadioGroup.vue_vue_type_script_setup_true_lang.js +177 -0
  383. package/dist/components/BbBaseRadioGroup/types.d.ts +223 -0
  384. package/dist/components/BbBaseRadioIcon/BbBaseRadioIcon.vue.d.ts +4 -0
  385. package/dist/components/BbBaseRadioIcon/BbBaseRadioIcon.vue.js +6 -0
  386. package/dist/components/BbBaseRadioIcon/BbBaseRadioIcon.vue_vue_type_script_setup_true_lang.js +28 -0
  387. package/dist/components/BbBaseRadioIcon/types.d.ts +41 -0
  388. package/dist/components/BbBaseRating/BbBaseRating.vue.d.ts +38 -0
  389. package/dist/components/BbBaseRating/BbBaseRating.vue.js +6 -0
  390. package/dist/components/BbBaseRating/BbBaseRating.vue_vue_type_script_setup_true_lang.js +184 -0
  391. package/dist/components/BbBaseRating/types.d.ts +168 -0
  392. package/dist/components/BbBaseSelect/BbBaseSelect.vue.d.ts +19 -0
  393. package/dist/components/BbBaseSelect/BbBaseSelect.vue.js +6 -0
  394. package/dist/components/BbBaseSelect/BbBaseSelect.vue_vue_type_script_setup_true_lang.js +307 -0
  395. package/dist/components/BbBaseSelect/types.d.ts +297 -0
  396. package/dist/components/BbBaseSlider/BbBaseSlider.vue.d.ts +35 -0
  397. package/dist/components/BbBaseSlider/BbBaseSlider.vue.js +6 -0
  398. package/dist/components/BbBaseSlider/BbBaseSlider.vue_vue_type_script_setup_true_lang.js +324 -0
  399. package/dist/components/BbBaseSlider/types.d.ts +200 -0
  400. package/dist/components/BbBaseSwitch/BbBaseSwitch.vue.d.ts +35 -0
  401. package/dist/components/BbBaseSwitch/BbBaseSwitch.vue.js +6 -0
  402. package/dist/components/BbBaseSwitch/BbBaseSwitch.vue_vue_type_script_setup_true_lang.js +146 -0
  403. package/dist/components/BbBaseSwitch/types.d.ts +10 -0
  404. package/dist/components/BbBaseSwitchGroup/BbBaseSwitchGroup.vue.d.ts +19 -0
  405. package/dist/components/BbBaseSwitchGroup/BbBaseSwitchGroup.vue.js +6 -0
  406. package/dist/components/BbBaseSwitchGroup/BbBaseSwitchGroup.vue_vue_type_script_setup_true_lang.js +190 -0
  407. package/dist/components/BbBaseSwitchGroup/types.d.ts +8 -0
  408. package/dist/components/BbBaseSwitchIcon/BbBaseSwitchIcon.vue.d.ts +4 -0
  409. package/dist/components/BbBaseSwitchIcon/BbBaseSwitchIcon.vue.js +6 -0
  410. package/dist/components/BbBaseSwitchIcon/BbBaseSwitchIcon.vue_vue_type_script_setup_true_lang.js +30 -0
  411. package/dist/components/BbBaseSwitchIcon/types.d.ts +48 -0
  412. package/dist/components/BbBaseTag/BbBaseTag.vue.d.ts +50 -0
  413. package/dist/components/BbBaseTag/BbBaseTag.vue.js +6 -0
  414. package/dist/components/BbBaseTag/BbBaseTag.vue_vue_type_script_setup_true_lang.js +266 -0
  415. package/dist/components/BbBaseTag/types.d.ts +160 -0
  416. package/dist/components/BbBaseTextInput/BbBaseTextInput.vue.d.ts +45 -0
  417. package/dist/components/BbBaseTextInput/BbBaseTextInput.vue.js +6 -0
  418. package/dist/components/BbBaseTextInput/BbBaseTextInput.vue_vue_type_script_setup_true_lang.js +200 -0
  419. package/dist/components/BbBaseTextInput/types.d.ts +209 -0
  420. package/dist/components/BbBaseTextarea/BbBaseTextarea.vue.d.ts +39 -0
  421. package/dist/components/BbBaseTextarea/BbBaseTextarea.vue.js +6 -0
  422. package/dist/components/BbBaseTextarea/BbBaseTextarea.vue_vue_type_script_setup_true_lang.js +175 -0
  423. package/dist/components/BbBaseTextarea/types.d.ts +170 -0
  424. package/dist/components/BbBaseTimePickerInput/BbBaseTimePickerInput.vue.d.ts +27 -0
  425. package/dist/components/BbBaseTimePickerInput/BbBaseTimePickerInput.vue.js +6 -0
  426. package/dist/components/BbBaseTimePickerInput/BbBaseTimePickerInput.vue_vue_type_script_setup_true_lang.js +522 -0
  427. package/dist/components/BbBaseTimePickerInput/types.d.ts +151 -0
  428. package/dist/components/BbBreadcrumbs/BbBreadcrumbs.vue.d.ts +0 -1
  429. package/dist/components/BbBreadcrumbs/BbBreadcrumbs.vue.js +6 -0
  430. package/dist/components/BbBreadcrumbs/BbBreadcrumbs.vue_vue_type_script_setup_true_lang.js +224 -0
  431. package/dist/components/BbBreadcrumbs/estimateBreadcrumbItemWidth.js +47 -0
  432. package/dist/components/BbBreadcrumbs/types.d.ts +37 -22
  433. package/dist/components/BbButton/BbButton.vue.d.ts +6 -5
  434. package/dist/components/BbButton/BbButton.vue.js +6 -0
  435. package/dist/components/BbButton/BbButton.vue_vue_type_script_setup_true_lang.js +181 -0
  436. package/dist/components/BbButton/types.d.ts +48 -47
  437. package/dist/components/BbCheckbox/BbCheckbox.vue.d.ts +4 -3
  438. package/dist/components/BbCheckbox/BbCheckbox.vue.js +6 -0
  439. package/dist/components/BbCheckbox/BbCheckbox.vue_vue_type_script_setup_true_lang.js +146 -0
  440. package/dist/components/BbCheckbox/types.d.ts +31 -10
  441. package/dist/components/BbCheckboxGroup/BbCheckboxGroup.vue.d.ts +2 -13
  442. package/dist/components/BbCheckboxGroup/BbCheckboxGroup.vue.js +6 -0
  443. package/dist/components/BbCheckboxGroup/BbCheckboxGroup.vue_vue_type_script_setup_true_lang.js +190 -0
  444. package/dist/components/BbCheckboxGroup/types.d.ts +51 -23
  445. package/dist/components/BbCollapsible/BbCollapsible.vue.d.ts +2 -1
  446. package/dist/components/BbCollapsible/BbCollapsible.vue.js +6 -0
  447. package/dist/components/BbCollapsible/BbCollapsible.vue_vue_type_script_setup_true_lang.js +31 -0
  448. package/dist/components/BbCollapsible/types.d.ts +13 -8
  449. package/dist/components/BbColorInput/BbColorInput.vue.d.ts +10 -1
  450. package/dist/components/BbColorInput/BbColorInput.vue.js +6 -0
  451. package/dist/components/BbColorInput/BbColorInput.vue_vue_type_script_setup_true_lang.js +177 -0
  452. package/dist/components/BbColorInput/types.d.ts +44 -11
  453. package/dist/components/BbColorPalette/BbColorPalette.vue.d.ts +5 -8
  454. package/dist/components/BbColorPalette/BbColorPalette.vue.js +5 -0
  455. package/dist/components/BbColorPalette/BbColorPalette.vue_vue_type_script_setup_true_lang.js +126 -0
  456. package/dist/components/BbColorPalette/types.d.ts +71 -52
  457. package/dist/components/BbConfirm/BbConfirm.vue.js +6 -0
  458. package/dist/components/BbConfirm/BbConfirm.vue_vue_type_script_setup_true_lang.js +138 -0
  459. package/dist/components/BbConfirm/BbConfirmPortal.vue.d.ts +5 -6
  460. package/dist/components/BbConfirm/BbConfirmPortal.vue.js +5 -0
  461. package/dist/components/BbConfirm/BbConfirmPortal.vue_vue_type_script_setup_true_lang.js +19 -0
  462. package/dist/components/BbDatePicker/BbDatePicker.vue.d.ts +37 -0
  463. package/dist/components/BbDatePicker/BbDatePicker.vue.js +6 -0
  464. package/dist/components/BbDatePicker/BbDatePicker.vue_vue_type_script_setup_true_lang.js +319 -0
  465. package/dist/components/BbDatePicker/types.d.ts +159 -0
  466. package/dist/components/BbDatePickerInput/BbDatePickerInput.vue.d.ts +3 -1
  467. package/dist/components/BbDatePickerInput/BbDatePickerInput.vue.js +6 -0
  468. package/dist/components/BbDatePickerInput/BbDatePickerInput.vue_vue_type_script_setup_true_lang.js +179 -0
  469. package/dist/components/BbDatePickerInput/types.d.ts +134 -16
  470. package/dist/components/BbDialog/BbDialog.vue.d.ts +14 -6
  471. package/dist/components/BbDialog/BbDialog.vue.js +6 -0
  472. package/dist/components/BbDialog/BbDialog.vue_vue_type_script_setup_true_lang.js +214 -0
  473. package/dist/components/BbDialog/types.d.ts +146 -1
  474. package/dist/components/BbDialog/useDialogStack.d.ts +5 -0
  475. package/dist/components/BbDialog/useDialogStack.js +20 -0
  476. package/dist/components/BbDropdown/AdaptiveDropdown.vue.d.ts +24 -0
  477. package/dist/components/BbDropdown/AdaptiveDropdown.vue.js +6 -0
  478. package/dist/components/BbDropdown/AdaptiveDropdown.vue_vue_type_script_setup_true_lang.js +116 -0
  479. package/dist/components/BbDropdown/BbDropdown.vue.d.ts +14 -7
  480. package/dist/components/BbDropdown/BbDropdown.vue.js +6 -0
  481. package/dist/components/BbDropdown/BbDropdown.vue_vue_type_script_setup_true_lang.js +561 -0
  482. package/dist/components/BbDropdown/BbDropdownGroup.vue.d.ts +44 -0
  483. package/dist/components/BbDropdown/BbDropdownGroup.vue.js +5 -0
  484. package/dist/components/BbDropdown/BbDropdownGroup.vue_vue_type_script_setup_true_lang.js +36 -0
  485. package/dist/components/BbDropdown/BbDropdownList.vue.d.ts +31 -0
  486. package/dist/components/BbDropdown/BbDropdownList.vue.js +6 -0
  487. package/dist/components/BbDropdown/BbDropdownList.vue_vue_type_script_setup_true_lang.js +470 -0
  488. package/dist/components/BbDropdown/DropdownPipelineResolver.vue.d.ts +16 -0
  489. package/dist/components/BbDropdown/DropdownPipelineResolver.vue.js +5 -0
  490. package/dist/components/BbDropdown/DropdownPipelineResolver.vue_vue_type_script_setup_true_lang.js +168 -0
  491. package/dist/components/BbDropdown/normalizeGroups.d.ts +18 -0
  492. package/dist/components/BbDropdown/normalizeGroups.js +46 -0
  493. package/dist/components/BbDropdown/types.d.ts +468 -46
  494. package/dist/components/BbDropdown/types.js +4 -0
  495. package/dist/components/BbDropdown/useDropdownContext.d.ts +89 -0
  496. package/dist/components/BbDropdown/useDropdownContext.js +9 -0
  497. package/dist/components/BbDropdown/useDropdownGroupRegistry.d.ts +108 -0
  498. package/dist/components/BbDropdown/useDropdownGroupRegistry.js +5 -0
  499. package/dist/components/BbDropdownButton/BbDropdownButton.vue.d.ts +3 -3
  500. package/dist/components/BbDropdownButton/BbDropdownButton.vue.js +6 -0
  501. package/dist/components/BbDropdownButton/BbDropdownButton.vue_vue_type_script_setup_true_lang.js +119 -0
  502. package/dist/components/BbDropdownButton/types.d.ts +47 -52
  503. package/dist/components/BbDropzone/BbDropzone.vue.d.ts +5 -4
  504. package/dist/components/BbDropzone/BbDropzone.vue.js +6 -0
  505. package/dist/components/BbDropzone/BbDropzone.vue_vue_type_script_setup_true_lang.js +308 -0
  506. package/dist/components/BbDropzone/types.d.ts +77 -8
  507. package/dist/components/BbIcon/BbIcon.vue.d.ts +3 -2
  508. package/dist/components/BbIcon/BbIcon.vue.js +6 -0
  509. package/dist/components/BbIcon/BbIcon.vue_vue_type_script_setup_true_lang.js +65 -0
  510. package/dist/components/BbIcon/types.d.ts +6 -19
  511. package/dist/components/BbIndicator/BbIndicator.vue.d.ts +14 -0
  512. package/dist/components/BbIndicator/BbIndicator.vue.js +6 -0
  513. package/dist/components/BbIndicator/BbIndicator.vue_vue_type_script_setup_true_lang.js +56 -0
  514. package/dist/components/BbIndicator/types.d.ts +49 -0
  515. package/dist/components/BbNumberInput/BbNumberInput.vue.d.ts +12 -6
  516. package/dist/components/BbNumberInput/BbNumberInput.vue.js +6 -0
  517. package/dist/components/BbNumberInput/BbNumberInput.vue_vue_type_script_setup_true_lang.js +194 -0
  518. package/dist/components/BbNumberInput/types.d.ts +40 -4
  519. package/dist/components/BbOffCanvas/BbOffCanvas.vue.d.ts +16 -10
  520. package/dist/components/BbOffCanvas/BbOffCanvas.vue.js +6 -0
  521. package/dist/components/BbOffCanvas/BbOffCanvas.vue_vue_type_script_setup_true_lang.js +284 -0
  522. package/dist/components/BbOffCanvas/types.d.ts +71 -39
  523. package/dist/components/BbOffCanvas/useOffCanvasStack.d.ts +25 -0
  524. package/dist/components/BbOffCanvas/useOffCanvasStack.js +68 -0
  525. package/dist/components/BbPagination/BbPagination.vue.d.ts +9 -4
  526. package/dist/components/BbPagination/BbPagination.vue.js +6 -0
  527. package/dist/components/BbPagination/BbPagination.vue_vue_type_script_setup_true_lang.js +244 -0
  528. package/dist/components/BbPagination/paginationFit.d.ts +38 -0
  529. package/dist/components/BbPagination/paginationFit.js +13 -0
  530. package/dist/components/BbPagination/types.d.ts +51 -16
  531. package/dist/components/BbPopover/BbPopover.vue.d.ts +16 -15
  532. package/dist/components/BbPopover/BbPopover.vue.js +6 -0
  533. package/dist/components/BbPopover/BbPopover.vue_vue_type_script_setup_true_lang.js +309 -0
  534. package/dist/components/BbPopover/escapeStack.d.ts +6 -0
  535. package/dist/components/BbPopover/escapeStack.js +10 -0
  536. package/dist/components/BbPopover/types.d.ts +90 -31
  537. package/dist/components/BbProgress/BbProgress.vue.d.ts +1 -0
  538. package/dist/components/BbProgress/BbProgress.vue.js +6 -0
  539. package/dist/components/BbProgress/BbProgress.vue_vue_type_script_setup_true_lang.js +36 -0
  540. package/dist/components/BbProgress/types.d.ts +15 -1
  541. package/dist/components/BbRadio/BbRadio.vue.d.ts +5 -3
  542. package/dist/components/BbRadio/BbRadio.vue.js +6 -0
  543. package/dist/components/BbRadio/BbRadio.vue_vue_type_script_setup_true_lang.js +133 -0
  544. package/dist/components/BbRadio/types.d.ts +32 -9
  545. package/dist/components/BbRadioGroup/BbRadioGroup.vue.d.ts +4 -14
  546. package/dist/components/BbRadioGroup/BbRadioGroup.vue.js +6 -0
  547. package/dist/components/BbRadioGroup/BbRadioGroup.vue_vue_type_script_setup_true_lang.js +186 -0
  548. package/dist/components/BbRadioGroup/types.d.ts +48 -22
  549. package/dist/components/BbRating/BbRating.vue.d.ts +4 -1
  550. package/dist/components/BbRating/BbRating.vue.js +6 -0
  551. package/dist/components/BbRating/BbRating.vue_vue_type_script_setup_true_lang.js +150 -0
  552. package/dist/components/BbRating/types.d.ts +44 -10
  553. package/dist/components/BbSelect/BbSelect.vue.d.ts +2 -11
  554. package/dist/components/BbSelect/BbSelect.vue.js +6 -0
  555. package/dist/components/BbSelect/BbSelect.vue_vue_type_script_setup_true_lang.js +241 -0
  556. package/dist/components/BbSelect/types.d.ts +112 -59
  557. package/dist/components/BbSelectPopover/BbSelectPopover.vue.d.ts +1 -10
  558. package/dist/components/BbSelectPopover/BbSelectPopover.vue.js +6 -0
  559. package/dist/components/BbSelectPopover/BbSelectPopover.vue_vue_type_script_setup_true_lang.js +639 -0
  560. package/dist/components/BbSelectPopover/types.d.ts +197 -105
  561. package/dist/components/BbSlider/BbSlider.vue.d.ts +3 -6
  562. package/dist/components/BbSlider/BbSlider.vue.js +6 -0
  563. package/dist/components/BbSlider/BbSlider.vue_vue_type_script_setup_true_lang.js +166 -0
  564. package/dist/components/BbSlider/types.d.ts +44 -13
  565. package/dist/components/BbSmoothHeight/BbSmoothHeight.vue.d.ts +3 -1
  566. package/dist/components/BbSmoothHeight/BbSmoothHeight.vue.js +6 -0
  567. package/dist/components/BbSmoothHeight/BbSmoothHeight.vue_vue_type_script_setup_true_lang.js +79 -0
  568. package/dist/components/BbSmoothHeight/types.d.ts +17 -2
  569. package/dist/components/BbSpinner/BbSpinner.vue.d.ts +1 -1
  570. package/dist/components/BbSpinner/BbSpinner.vue.js +6 -0
  571. package/dist/components/BbSpinner/BbSpinner.vue_vue_type_script_setup_true_lang.js +30 -0
  572. package/dist/components/BbSpinner/types.d.ts +10 -3
  573. package/dist/components/BbSwitch/BbSwitch.vue.d.ts +5 -3
  574. package/dist/components/BbSwitch/BbSwitch.vue.js +6 -0
  575. package/dist/components/BbSwitch/BbSwitch.vue_vue_type_script_setup_true_lang.js +142 -0
  576. package/dist/components/BbSwitch/types.d.ts +3 -1
  577. package/dist/components/BbSwitchGroup/BbSwitchGroup.vue.d.ts +4 -14
  578. package/dist/components/BbSwitchGroup/BbSwitchGroup.vue.js +6 -0
  579. package/dist/components/BbSwitchGroup/BbSwitchGroup.vue_vue_type_script_setup_true_lang.js +190 -0
  580. package/dist/components/BbSwitchGroup/types.d.ts +3 -22
  581. package/dist/components/BbTable/BbTable.vue.d.ts +58 -31
  582. package/dist/components/BbTable/BbTable.vue.js +6 -0
  583. package/dist/components/BbTable/BbTable.vue_vue_type_script_setup_true_lang.js +900 -0
  584. package/dist/components/BbTable/types.d.ts +213 -37
  585. package/dist/components/BbTable/utils.d.ts +9 -1
  586. package/dist/components/BbTable/utils.js +53 -0
  587. package/dist/components/BbTabs/BbTabs.vue.d.ts +20 -0
  588. package/dist/components/BbTabs/BbTabs.vue.js +6 -0
  589. package/dist/components/BbTabs/BbTabs.vue_vue_type_script_setup_true_lang.js +64 -0
  590. package/dist/components/BbTabs/BbTabsList.vue.d.ts +19 -0
  591. package/dist/components/BbTabs/BbTabsList.vue.js +6 -0
  592. package/dist/components/BbTabs/BbTabsList.vue_vue_type_script_setup_true_lang.js +123 -0
  593. package/dist/components/BbTabs/BbTabsPanes.vue.d.ts +16 -0
  594. package/dist/components/BbTabs/BbTabsPanes.vue.js +6 -0
  595. package/dist/components/BbTabs/BbTabsPanes.vue_vue_type_script_setup_true_lang.js +35 -0
  596. package/dist/components/BbTabs/BbTabsRoot.vue.d.ts +20 -0
  597. package/dist/components/BbTabs/BbTabsRoot.vue.js +5 -0
  598. package/dist/components/BbTabs/BbTabsRoot.vue_vue_type_script_setup_true_lang.js +55 -0
  599. package/dist/components/BbTabs/types.d.ts +264 -0
  600. package/dist/components/BbTag/BbTag.vue.d.ts +19 -6
  601. package/dist/components/BbTag/BbTag.vue.js +6 -0
  602. package/dist/components/BbTag/BbTag.vue_vue_type_script_setup_true_lang.js +187 -0
  603. package/dist/components/BbTag/types.d.ts +55 -17
  604. package/dist/components/BbTextInput/BbTextInput.vue.d.ts +10 -1
  605. package/dist/components/BbTextInput/BbTextInput.vue.js +6 -0
  606. package/dist/components/BbTextInput/BbTextInput.vue_vue_type_script_setup_true_lang.js +195 -0
  607. package/dist/components/BbTextInput/types.d.ts +31 -4
  608. package/dist/components/BbTextarea/BbTextarea.vue.d.ts +10 -1
  609. package/dist/components/BbTextarea/BbTextarea.vue.js +6 -0
  610. package/dist/components/BbTextarea/BbTextarea.vue_vue_type_script_setup_true_lang.js +178 -0
  611. package/dist/components/BbTextarea/types.d.ts +33 -2
  612. package/dist/components/BbTimePicker/BbTimePicker.vue.d.ts +33 -0
  613. package/dist/components/BbTimePicker/BbTimePicker.vue.js +6 -0
  614. package/dist/components/BbTimePicker/BbTimePicker.vue_vue_type_script_setup_true_lang.js +244 -0
  615. package/dist/components/BbTimePicker/types.d.ts +133 -0
  616. package/dist/components/BbTimePickerInput/BbTimePickerInput.vue.d.ts +25 -0
  617. package/dist/components/BbTimePickerInput/BbTimePickerInput.vue.js +6 -0
  618. package/dist/components/BbTimePickerInput/BbTimePickerInput.vue_vue_type_script_setup_true_lang.js +157 -0
  619. package/dist/components/BbTimePickerInput/types.d.ts +174 -0
  620. package/dist/components/BbToast/BbToast.vue.d.ts +2 -3
  621. package/dist/components/BbToast/BbToast.vue.js +6 -0
  622. package/dist/components/BbToast/BbToast.vue_vue_type_script_setup_true_lang.js +39 -0
  623. package/dist/components/BbToast/BbToastMessage.vue.d.ts +17 -8
  624. package/dist/components/BbToast/BbToastMessage.vue.js +5 -0
  625. package/dist/components/BbToast/BbToastMessage.vue_vue_type_script_setup_true_lang.js +170 -0
  626. package/dist/components/BbToast/BbToastPortal.vue.d.ts +30 -0
  627. package/dist/components/BbToast/BbToastPortal.vue.js +5 -0
  628. package/dist/components/BbToast/BbToastPortal.vue_vue_type_script_setup_true_lang.js +19 -0
  629. package/dist/components/BbToast/BbToastRegion.vue.d.ts +8 -0
  630. package/dist/components/BbToast/BbToastRegion.vue.js +5 -0
  631. package/dist/components/BbToast/BbToastRegion.vue_vue_type_script_setup_true_lang.js +100 -0
  632. package/dist/components/BbToast/types.d.ts +69 -5
  633. package/dist/components/BbTooltip/BbTooltip.vue.d.ts +10 -3
  634. package/dist/components/BbTooltip/BbTooltip.vue.js +6 -0
  635. package/dist/components/BbTooltip/BbTooltip.vue_vue_type_script_setup_true_lang.js +160 -0
  636. package/dist/components/BbTooltip/types.d.ts +69 -11
  637. package/dist/components/BbTree/BbTree.vue.d.ts +28 -13
  638. package/dist/components/BbTree/BbTree.vue.js +6 -0
  639. package/dist/components/BbTree/BbTree.vue_vue_type_script_setup_true_lang.js +55 -0
  640. package/dist/components/BbTree/BbTreeLevel.vue.d.ts +19 -0
  641. package/dist/components/BbTree/BbTreeLevel.vue.js +5 -0
  642. package/dist/components/BbTree/BbTreeLevel.vue_vue_type_script_setup_true_lang.js +94 -0
  643. package/dist/components/BbTree/context.d.ts +17 -0
  644. package/dist/components/BbTree/context.js +4 -0
  645. package/dist/components/BbTree/types.d.ts +94 -41
  646. package/dist/components/ChipsBox/ChipsBox.vue.d.ts +2 -1
  647. package/dist/components/ChipsBox/ChipsBox.vue.js +5 -0
  648. package/dist/components/ChipsBox/ChipsBox.vue_vue_type_script_setup_true_lang.js +98 -0
  649. package/dist/components/ChipsBox/types.d.ts +12 -5
  650. package/dist/components/ClearableButton/ClearableButton.vue.d.ts +2 -1
  651. package/dist/components/ClearableButton/ClearableButton.vue.js +6 -0
  652. package/dist/components/ClearableButton/ClearableButton.vue_vue_type_script_setup_true_lang.js +19 -0
  653. package/dist/components/ClearableButton/types.d.ts +7 -1
  654. package/dist/components/CloseIcon/CloseButton.vue.d.ts +5 -0
  655. package/dist/components/CloseIcon/CloseButton.vue.js +7 -0
  656. package/dist/components/CloseIcon/CloseButton.vue_vue_type_script_setup_true_lang.js +23 -0
  657. package/dist/components/CloseIcon/types.d.ts +2 -0
  658. package/dist/components/CommaBox/CommaBox.vue.d.ts +2 -1
  659. package/dist/components/CommaBox/CommaBox.vue.js +6 -0
  660. package/dist/components/CommaBox/CommaBox.vue_vue_type_script_setup_true_lang.js +81 -0
  661. package/dist/components/CommaBox/types.d.ts +6 -7
  662. package/dist/components/CommonInputWrapper/CommonInputWrapper.vue.d.ts +19 -0
  663. package/dist/components/CommonInputWrapper/CommonInputWrapper.vue.js +6 -0
  664. package/dist/components/CommonInputWrapper/CommonInputWrapper.vue_vue_type_script_setup_true_lang.js +107 -0
  665. package/dist/components/CommonInputWrapper/types.d.ts +96 -0
  666. package/dist/components/CommonPopover/CommonPopover.vue.d.ts +9 -3
  667. package/dist/components/CommonPopover/CommonPopover.vue.js +6 -0
  668. package/dist/components/CommonPopover/CommonPopover.vue_vue_type_script_setup_true_lang.js +160 -0
  669. package/dist/components/CommonPopover/types.d.ts +65 -16
  670. package/dist/components/ErrorIcon/ErrorIcon.vue.d.ts +2 -0
  671. package/dist/components/ErrorIcon/ErrorIcon.vue.js +6 -0
  672. package/dist/components/ErrorIcon/ErrorIcon.vue_vue_type_script_setup_true_lang.js +16 -0
  673. package/dist/components/FlatListBox/FlatListBox.vue.d.ts +2 -5
  674. package/dist/components/FlatListBox/FlatListBox.vue.js +5 -0
  675. package/dist/components/FlatListBox/FlatListBox.vue_vue_type_script_setup_true_lang.js +167 -0
  676. package/dist/components/FlatListBox/types.d.ts +1 -1
  677. package/dist/components/GroupedListBox/GroupedListBox.vue.d.ts +2 -5
  678. package/dist/components/GroupedListBox/GroupedListBox.vue.js +5 -0
  679. package/dist/components/GroupedListBox/GroupedListBox.vue_vue_type_script_setup_true_lang.js +218 -0
  680. package/dist/components/ListBox/ListBox.vue.d.ts +3 -6
  681. package/dist/components/ListBox/ListBox.vue.js +5 -0
  682. package/dist/components/ListBox/ListBox.vue_vue_type_script_setup_true_lang.js +112 -0
  683. package/dist/components/ListBox/types.d.ts +1 -1
  684. package/dist/components/OptionsContainer/OptionsContainer.vue.d.ts +1 -0
  685. package/dist/components/OptionsContainer/OptionsContainer.vue.js +5 -0
  686. package/dist/components/OptionsContainer/OptionsContainer.vue_vue_type_script_setup_true_lang.js +52 -0
  687. package/dist/components/OptionsContainer/types.d.ts +14 -24
  688. package/dist/components/Transitions/ScaleFade.vue.d.ts +2 -2
  689. package/dist/components/Transitions/ScaleFade.vue.js +5 -0
  690. package/dist/components/Transitions/ScaleFade.vue_vue_type_script_setup_true_lang.js +47 -0
  691. package/dist/components/Transitions/Slide.vue.d.ts +15 -0
  692. package/dist/components/Transitions/Slide.vue.js +7 -0
  693. package/dist/components/Transitions/Slide.vue_vue_type_script_setup_true_lang.js +28 -0
  694. package/dist/components/WarningIcon/WarningIcon.vue.d.ts +5 -0
  695. package/dist/components/WarningIcon/WarningIcon.vue.js +6 -0
  696. package/dist/components/WarningIcon/WarningIcon.vue_vue_type_script_setup_true_lang.js +16 -0
  697. package/dist/components/WarningIcon/types.d.ts +3 -0
  698. package/dist/composables/__testResets.d.ts +1 -0
  699. package/dist/composables/useActiveInactiveState.d.ts +4 -0
  700. package/dist/composables/useActiveInactiveState.js +21 -0
  701. package/dist/composables/useBaseOptions.d.ts +3 -3
  702. package/dist/composables/useBaseOptions.js +31 -0
  703. package/dist/composables/useBbConfig.d.ts +8 -37
  704. package/dist/composables/useBbConfig.js +5 -0
  705. package/dist/composables/useBbDropdownContext.d.ts +89 -0
  706. package/dist/composables/useBbDropdownContext.js +46 -0
  707. package/dist/composables/useBbFormContext.d.ts +90 -0
  708. package/dist/composables/useBbFormContext.js +69 -0
  709. package/dist/composables/useBbTableContext.d.ts +195 -0
  710. package/dist/composables/useBbTableContext.js +208 -0
  711. package/dist/composables/useBbTabsContext.d.ts +111 -0
  712. package/dist/composables/useBbTabsContext.js +225 -0
  713. package/dist/composables/useBreakpoint.d.ts +13 -0
  714. package/dist/composables/useBreakpoint.js +39 -0
  715. package/dist/composables/useBroadcastChannelInstance.d.ts +1 -3
  716. package/dist/composables/useBroadcastChannelInstance.js +39 -0
  717. package/dist/composables/useCancelableFunction.js +37 -0
  718. package/dist/composables/useClosingInert.d.ts +28 -0
  719. package/dist/composables/useClosingInert.js +23 -0
  720. package/dist/composables/useCoherence.js +16 -0
  721. package/dist/composables/useConfirm.d.ts +278 -68
  722. package/dist/composables/useConfirm.js +130 -0
  723. package/dist/composables/useCountdown.js +42 -0
  724. package/dist/composables/useHashedWatcher.d.ts +17 -0
  725. package/dist/composables/useHashedWatcher.js +14 -0
  726. package/dist/composables/useId.d.ts +3 -2
  727. package/dist/composables/useIndexById.js +16 -0
  728. package/dist/composables/useInertiaPage.d.ts +10 -0
  729. package/dist/composables/useInertiaPage.js +8 -0
  730. package/dist/composables/useItemText.js +17 -0
  731. package/dist/composables/useItemValue.js +9 -0
  732. package/dist/composables/useItemsGetter.d.ts +1 -1
  733. package/dist/composables/useItemsGetter.js +30 -0
  734. package/dist/composables/useListboxFocus.js +66 -0
  735. package/dist/composables/useLocale.d.ts +1 -1
  736. package/dist/composables/useLocale.js +11 -0
  737. package/dist/composables/useLogger.d.ts +1 -1
  738. package/dist/composables/useLogger.js +10 -0
  739. package/dist/composables/useMinimalQueue.d.ts +1 -1
  740. package/dist/composables/useMobile.js +7 -0
  741. package/dist/composables/useOnFalsy.d.ts +2 -0
  742. package/dist/composables/useOnFalsy.js +9 -0
  743. package/dist/composables/useOnTruthy.d.ts +7 -0
  744. package/dist/composables/useOnTruthy.js +9 -0
  745. package/dist/composables/usePrefill.d.ts +2 -1
  746. package/dist/composables/usePrefill.js +24 -0
  747. package/dist/composables/useQuery.d.ts +15 -3
  748. package/dist/composables/useQuery.js +42 -0
  749. package/dist/composables/useRoute.js +11 -0
  750. package/dist/composables/useRouter.js +8 -0
  751. package/dist/composables/useSafeArea.d.ts +51 -0
  752. package/dist/composables/useSafeArea.js +16 -0
  753. package/dist/composables/useSegmentedFields.d.ts +104 -0
  754. package/dist/composables/useSegmentedFields.js +159 -0
  755. package/dist/composables/useTableWidthContext.d.ts +5 -0
  756. package/dist/composables/useTableWidthContext.js +42 -0
  757. package/dist/composables/useToast.d.ts +40 -70
  758. package/dist/composables/useToast.js +58 -0
  759. package/dist/composables/useTopLayer.d.ts +9 -0
  760. package/dist/composables/useTopLayer.js +7 -0
  761. package/dist/composables/useUntil.js +13 -0
  762. package/dist/composables/useViewportWidth.d.ts +17 -0
  763. package/dist/composables/useViewportWidth.js +6 -0
  764. package/dist/confirm-variants.d.ts +17 -0
  765. package/dist/deprecation/ai-deprecations.json.d.ts +784 -0
  766. package/dist/deprecation/ai-deprecations.json.js +4 -0
  767. package/dist/deprecation/removedProps.d.ts +3 -0
  768. package/dist/deprecation/removedProps.js +13 -0
  769. package/dist/directives/bbColor.d.ts +65 -0
  770. package/dist/directives/bbColor.js +24 -0
  771. package/dist/directives/bbDate.d.ts +66 -0
  772. package/dist/directives/bbDate.js +24 -0
  773. package/dist/directives/bbDropdown.d.ts +15 -11
  774. package/dist/directives/bbDropdown.js +23 -0
  775. package/dist/directives/bbTime.d.ts +64 -0
  776. package/dist/directives/bbTime.js +24 -0
  777. package/dist/directives/bbTooltip.d.ts +16 -11
  778. package/dist/directives/bbTooltip.js +24 -0
  779. package/dist/directives/createPopoverDirective.js +54 -0
  780. package/dist/dropdown-item-variants.d.ts +17 -0
  781. package/dist/i18n/index.d.ts +51 -3
  782. package/dist/i18n/index.js +27 -0
  783. package/dist/i18n/locales/cs.json +115 -0
  784. package/dist/i18n/locales/da.json +115 -0
  785. package/dist/i18n/locales/de.json +115 -0
  786. package/dist/i18n/locales/el.json +115 -0
  787. package/dist/i18n/locales/en.json +115 -0
  788. package/dist/i18n/locales/es.json +115 -0
  789. package/dist/i18n/locales/fi.json +115 -0
  790. package/dist/i18n/locales/fr.json +115 -0
  791. package/dist/i18n/locales/hu.json +115 -0
  792. package/dist/i18n/locales/it.json +115 -0
  793. package/dist/i18n/locales/ja.json +115 -0
  794. package/dist/i18n/locales/ko.json +115 -0
  795. package/dist/i18n/locales/nb.json +115 -0
  796. package/dist/i18n/locales/nl.json +115 -0
  797. package/dist/i18n/locales/pl.json +115 -0
  798. package/dist/i18n/locales/pt.json +115 -0
  799. package/dist/i18n/locales/ro.json +115 -0
  800. package/dist/i18n/locales/ru.json +115 -0
  801. package/dist/i18n/locales/sv.json +115 -0
  802. package/dist/i18n/locales/tr.json +115 -0
  803. package/dist/i18n/locales/uk.json +115 -0
  804. package/dist/i18n/locales/zh-cn.json +115 -0
  805. package/dist/icons-whitelist.d.ts +8 -0
  806. package/dist/index.d.ts +96 -79
  807. package/dist/index.js +76 -82
  808. package/dist/indicator-variants.d.ts +20 -0
  809. package/dist/llms-full.txt +79703 -0
  810. package/dist/llms-medium.txt +1514 -0
  811. package/dist/llms.txt +105 -0
  812. package/dist/locale-blueprint.json +141 -0
  813. package/dist/locale-registry.d.ts +37 -0
  814. package/dist/nuxt-module.d.ts +3 -0
  815. package/dist/nuxt.js +19 -0
  816. package/dist/plugin.d.ts +4 -0
  817. package/dist/plugin.js +22 -0
  818. package/dist/reset.css +1 -0
  819. package/dist/reset.d.ts +0 -0
  820. package/dist/runtime/nuxt-plugin.d.ts +2 -0
  821. package/dist/runtime/nuxt-plugin.js +24 -0
  822. package/dist/styles.css +2 -0
  823. package/dist/styles.d.ts +0 -0
  824. package/dist/toast-variants.d.ts +20 -0
  825. package/dist/tooltip-variants.d.ts +17 -0
  826. package/dist/types/ActionButton.d.ts +32 -0
  827. package/dist/types/AlertVariant.d.ts +16 -0
  828. package/dist/types/BadgeVariant.d.ts +16 -0
  829. package/dist/types/ButtonVariant.d.ts +17 -0
  830. package/dist/types/Classes.d.ts +1 -1
  831. package/dist/types/ColumnName.d.ts +1 -1
  832. package/dist/types/CommonProps.d.ts +68 -277
  833. package/dist/types/Config.d.ts +84 -0
  834. package/dist/types/ConfirmVariant.d.ts +15 -0
  835. package/dist/types/DropdownItemVariant.d.ts +18 -0
  836. package/dist/types/Icon.d.ts +5 -7
  837. package/dist/types/IndicatorVariant.d.ts +16 -0
  838. package/dist/types/InputDirection.d.ts +15 -0
  839. package/dist/types/ItemAccessor.d.ts +21 -0
  840. package/dist/types/Placement.d.ts +6 -0
  841. package/dist/types/ResponsiveSize.d.ts +20 -0
  842. package/dist/types/SizeScale.d.ts +8 -0
  843. package/dist/types/ToastVariant.d.ts +17 -0
  844. package/dist/types/TooltipVariant.d.ts +18 -0
  845. package/dist/utilities/functions/bytesToUnit.d.ts +2 -0
  846. package/dist/utilities/functions/bytesToUnit.js +18 -0
  847. package/dist/utilities/functions/clampPrecision.js +10 -0
  848. package/dist/utilities/functions/convertDateValue.d.ts +23 -10
  849. package/dist/utilities/functions/convertDateValue.js +12 -0
  850. package/dist/utilities/functions/deburr.js +5 -0
  851. package/dist/utilities/functions/empty.js +5 -0
  852. package/dist/utilities/functions/flattenTree.d.ts +1 -1
  853. package/dist/utilities/functions/hash.js +5 -0
  854. package/dist/utilities/functions/isDateDisabled.d.ts +1 -0
  855. package/dist/utilities/functions/isDateDisabled.js +20 -0
  856. package/dist/utilities/functions/isEqual.js +5 -0
  857. package/dist/utilities/functions/isNotEmpty.js +5 -0
  858. package/dist/utilities/functions/matchAnyKey.d.ts +1 -1
  859. package/dist/utilities/functions/matchAnyKey.js +15 -0
  860. package/dist/utilities/functions/parseSize.d.ts +1 -1
  861. package/dist/utilities/functions/parseSize.js +15 -0
  862. package/dist/utilities/functions/percentage.js +11 -0
  863. package/dist/utilities/functions/pipe.d.ts +1 -1
  864. package/dist/utilities/functions/reject.d.ts +25 -0
  865. package/dist/utilities/functions/reject.js +28 -0
  866. package/dist/utilities/functions/resolveEnumProp.d.ts +19 -0
  867. package/dist/utilities/functions/resolveEnumProp.js +5 -0
  868. package/dist/utilities/functions/slotKey.d.ts +13 -0
  869. package/dist/utilities/functions/slotKey.js +4 -0
  870. package/dist/utilities/functions/sort.d.ts +2 -2
  871. package/dist/utilities/functions/sort.js +19 -0
  872. package/dist/utilities/functions/throttle.js +5 -0
  873. package/dist/utilities/functions/waitFor.d.ts +9 -2
  874. package/dist/utilities/functions/waitFor.js +14 -0
  875. package/dist/utilities/functions/warnRemovedAttrs.d.ts +11 -0
  876. package/dist/utilities/functions/warnRemovedAttrs.js +20 -0
  877. package/dist/utilities/functions/when.js +5 -0
  878. package/dist/utilities/misc/iconsInjectionKey.d.ts +15 -0
  879. package/dist/utilities/misc/iconsInjectionKey.js +4 -0
  880. package/dist/utilities/misc/transitions.d.ts +5 -0
  881. package/dist/utilities/misc/transitions.js +8 -0
  882. package/dist/utils/injectLibraryStyles.d.ts +6 -0
  883. package/dist/utils/injectLibraryStyles.js +38 -0
  884. package/dist/validated/BbCheckbox.vue.d.ts +29 -0
  885. package/dist/validated/BbCheckbox.vue.js +5 -0
  886. package/dist/validated/BbCheckbox.vue_vue_type_script_setup_true_lang.js +75 -0
  887. package/dist/validated/BbCheckboxGroup.vue.d.ts +34 -0
  888. package/dist/validated/BbCheckboxGroup.vue.js +5 -0
  889. package/dist/validated/BbCheckboxGroup.vue_vue_type_script_setup_true_lang.js +82 -0
  890. package/dist/validated/BbColorInput.vue.d.ts +36 -0
  891. package/dist/validated/BbColorInput.vue.js +5 -0
  892. package/dist/validated/BbColorInput.vue_vue_type_script_setup_true_lang.js +71 -0
  893. package/dist/validated/BbDatePickerInput.vue.d.ts +41 -0
  894. package/dist/validated/BbDatePickerInput.vue.js +5 -0
  895. package/dist/validated/BbDatePickerInput.vue_vue_type_script_setup_true_lang.js +90 -0
  896. package/dist/validated/BbDropzone.vue.d.ts +24 -0
  897. package/dist/validated/BbDropzone.vue.js +5 -0
  898. package/dist/validated/BbDropzone.vue_vue_type_script_setup_true_lang.js +45 -0
  899. package/dist/validated/BbForm.vue.d.ts +28 -0
  900. package/dist/validated/BbForm.vue.js +5 -0
  901. package/dist/validated/BbForm.vue_vue_type_script_setup_true_lang.js +42 -0
  902. package/dist/validated/BbNumberInput.vue.d.ts +36 -0
  903. package/dist/validated/BbNumberInput.vue.js +5 -0
  904. package/dist/validated/BbNumberInput.vue_vue_type_script_setup_true_lang.js +72 -0
  905. package/dist/validated/BbRadioGroup.vue.d.ts +34 -0
  906. package/dist/validated/BbRadioGroup.vue.js +5 -0
  907. package/dist/validated/BbRadioGroup.vue_vue_type_script_setup_true_lang.js +78 -0
  908. package/dist/validated/BbRating.vue.d.ts +30 -0
  909. package/dist/validated/BbRating.vue.js +5 -0
  910. package/dist/validated/BbRating.vue_vue_type_script_setup_true_lang.js +63 -0
  911. package/dist/validated/BbSelect.vue.d.ts +46 -0
  912. package/dist/validated/BbSelect.vue.js +5 -0
  913. package/dist/validated/BbSelect.vue_vue_type_script_setup_true_lang.js +109 -0
  914. package/dist/validated/BbSlider.vue.d.ts +36 -0
  915. package/dist/validated/BbSlider.vue.js +5 -0
  916. package/dist/validated/BbSlider.vue_vue_type_script_setup_true_lang.js +69 -0
  917. package/dist/validated/BbSwitch.vue.d.ts +29 -0
  918. package/dist/validated/BbSwitch.vue.js +5 -0
  919. package/dist/validated/BbSwitch.vue_vue_type_script_setup_true_lang.js +75 -0
  920. package/dist/validated/BbSwitchGroup.vue.d.ts +34 -0
  921. package/dist/validated/BbSwitchGroup.vue.js +5 -0
  922. package/dist/validated/BbSwitchGroup.vue_vue_type_script_setup_true_lang.js +82 -0
  923. package/dist/validated/BbTag.vue.d.ts +36 -0
  924. package/dist/validated/BbTag.vue.js +5 -0
  925. package/dist/validated/BbTag.vue_vue_type_script_setup_true_lang.js +72 -0
  926. package/dist/validated/BbTextInput.vue.d.ts +36 -0
  927. package/dist/validated/BbTextInput.vue.js +5 -0
  928. package/dist/validated/BbTextInput.vue_vue_type_script_setup_true_lang.js +72 -0
  929. package/dist/validated/BbTextarea.vue.d.ts +36 -0
  930. package/dist/validated/BbTextarea.vue.js +5 -0
  931. package/dist/validated/BbTextarea.vue_vue_type_script_setup_true_lang.js +70 -0
  932. package/dist/validated/BbTimePickerInput.vue.d.ts +37 -0
  933. package/dist/validated/BbTimePickerInput.vue.js +5 -0
  934. package/dist/validated/BbTimePickerInput.vue_vue_type_script_setup_true_lang.js +81 -0
  935. package/dist/validated/index.d.ts +29 -0
  936. package/dist/validated/useValidatedField.d.ts +93 -0
  937. package/dist/validated/useValidatedField.js +51 -0
  938. package/dist/validated.js +21 -0
  939. package/dist/vite-plugin.d.ts +261 -0
  940. package/dist/vite.js +603 -0
  941. package/llms.txt +107 -0
  942. package/package.json +181 -60
  943. package/scripts/lib/__fixtures__/validated-manifest.json +65 -0
  944. package/scripts/lib/ensure-manifest.mjs +39 -0
  945. package/scripts/lib/eslint-plugin-autofix.node.test.mjs +109 -0
  946. package/scripts/lib/eslint-plugin-recommended.node.test.mjs +87 -0
  947. package/scripts/lib/eslint-plugin-slots.node.test.mjs +271 -0
  948. package/scripts/lib/eslint-plugin.mjs +702 -0
  949. package/scripts/lib/eslint-plugin.node.test.mjs +193 -0
  950. package/scripts/lib/html-attributes.mjs +191 -0
  951. package/scripts/lib/mcp-config.mjs +126 -0
  952. package/scripts/lib/migrate-fix.mjs +115 -0
  953. package/scripts/lib/validate-bb-markup.mjs +488 -0
  954. package/dist/ai/BaseButton.md +0 -449
  955. package/dist/ai/BaseCheckbox.md +0 -512
  956. package/dist/ai/BaseCheckboxGroup.md +0 -597
  957. package/dist/ai/BaseColorInput.md +0 -461
  958. package/dist/ai/BaseDatePicker.md +0 -739
  959. package/dist/ai/BaseDatePickerInput.md +0 -1517
  960. package/dist/ai/BaseDialog.md +0 -610
  961. package/dist/ai/BaseInputContainer.md +0 -570
  962. package/dist/ai/BaseNumberInput.md +0 -509
  963. package/dist/ai/BaseRadio.md +0 -405
  964. package/dist/ai/BaseRadioGroup.md +0 -535
  965. package/dist/ai/BaseRating.md +0 -489
  966. package/dist/ai/BaseSelect.md +0 -1742
  967. package/dist/ai/BaseSlider.md +0 -871
  968. package/dist/ai/BaseSwitch.md +0 -322
  969. package/dist/ai/BaseSwitchGroup.md +0 -298
  970. package/dist/ai/BaseTag.md +0 -623
  971. package/dist/ai/BaseTextInput.md +0 -392
  972. package/dist/ai/BaseTextarea.md +0 -398
  973. package/dist/ai/BbChip.md +0 -147
  974. package/dist/ai/BbIntersection.md +0 -120
  975. package/dist/ai/BbRatio.md +0 -61
  976. package/dist/ai/BbRows.md +0 -307
  977. package/dist/ai/BbTab.md +0 -950
  978. package/dist/ai/CommonInputInnerContainer.md +0 -414
  979. package/dist/ai/CommonInputOuterContainer.md +0 -55
  980. package/dist/components/BaseButton/BaseButton.vue.d.ts +0 -14
  981. package/dist/components/BaseButton/types.d.ts +0 -159
  982. package/dist/components/BaseCheckbox/BaseCheckbox.vue.d.ts +0 -39
  983. package/dist/components/BaseCheckbox/types.d.ts +0 -213
  984. package/dist/components/BaseCheckboxGroup/BaseCheckboxGroup.vue.d.ts +0 -30
  985. package/dist/components/BaseCheckboxGroup/types.d.ts +0 -282
  986. package/dist/components/BaseColorInput/BaseColorInput.vue.d.ts +0 -35
  987. package/dist/components/BaseColorInput/ColorPalette.vue.d.ts +0 -13
  988. package/dist/components/BaseColorInput/types.d.ts +0 -233
  989. package/dist/components/BaseDatePicker/BaseDatePickerHeader.vue.d.ts +0 -15
  990. package/dist/components/BaseDatePicker/BaseDatePickerInputDaySelector.vue.d.ts +0 -58
  991. package/dist/components/BaseDatePicker/BaseDatePickerMonthSelector.vue.d.ts +0 -12
  992. package/dist/components/BaseDatePicker/BaseDatePickerYearSelector.vue.d.ts +0 -12
  993. package/dist/components/BaseDatePicker/types.d.ts +0 -100
  994. package/dist/components/BaseDatePickerInput/BaseDatePickerInput.vue.d.ts +0 -26
  995. package/dist/components/BaseDatePickerInput/types.d.ts +0 -206
  996. package/dist/components/BaseDialog/BaseDialog.vue.d.ts +0 -37
  997. package/dist/components/BaseDialog/types.d.ts +0 -180
  998. package/dist/components/BaseInputContainer/BaseInputContainer.vue.d.ts +0 -18
  999. package/dist/components/BaseInputContainer/types.d.ts +0 -126
  1000. package/dist/components/BaseNumberInput/BaseNumberInput.vue.d.ts +0 -46
  1001. package/dist/components/BaseNumberInput/types.d.ts +0 -191
  1002. package/dist/components/BaseRadio/BaseRadio.vue.d.ts +0 -31
  1003. package/dist/components/BaseRadio/types.d.ts +0 -173
  1004. package/dist/components/BaseRadioGroup/BaseRadioGroup.vue.d.ts +0 -30
  1005. package/dist/components/BaseRadioGroup/types.d.ts +0 -240
  1006. package/dist/components/BaseRating/BaseRating.vue.d.ts +0 -35
  1007. package/dist/components/BaseRating/types.d.ts +0 -144
  1008. package/dist/components/BaseSelect/BaseSelect.vue.d.ts +0 -28
  1009. package/dist/components/BaseSelect/types.d.ts +0 -470
  1010. package/dist/components/BaseSlider/BaseSlider.vue.d.ts +0 -38
  1011. package/dist/components/BaseSlider/types.d.ts +0 -201
  1012. package/dist/components/BaseSwitch/BaseSwitch.vue.d.ts +0 -34
  1013. package/dist/components/BaseSwitch/types.d.ts +0 -25
  1014. package/dist/components/BaseSwitchGroup/BaseSwitchGroup.vue.d.ts +0 -30
  1015. package/dist/components/BaseSwitchGroup/types.d.ts +0 -8
  1016. package/dist/components/BaseTag/BaseTag.vue.d.ts +0 -37
  1017. package/dist/components/BaseTag/types.d.ts +0 -136
  1018. package/dist/components/BaseTextInput/BaseTextInput.vue.d.ts +0 -33
  1019. package/dist/components/BaseTextInput/types.d.ts +0 -166
  1020. package/dist/components/BaseTextarea/BaseTextarea.vue.d.ts +0 -31
  1021. package/dist/components/BaseTextarea/types.d.ts +0 -151
  1022. package/dist/components/BbChip/BbChip.vue.d.ts +0 -17
  1023. package/dist/components/BbChip/types.d.ts +0 -23
  1024. package/dist/components/BbIntersection/BbIntersection.vue.d.ts +0 -23
  1025. package/dist/components/BbIntersection/types.d.ts +0 -36
  1026. package/dist/components/BbRatio/BbRatio.vue.d.ts +0 -14
  1027. package/dist/components/BbRatio/types.d.ts +0 -15
  1028. package/dist/components/BbRows/BbRows.vue.d.ts +0 -62
  1029. package/dist/components/BbRows/types.d.ts +0 -21
  1030. package/dist/components/BbTab/BbTab.vue.d.ts +0 -27
  1031. package/dist/components/BbTab/types.d.ts +0 -186
  1032. package/dist/components/CommonInputInnerContainer/CommonInputInnerContainer.vue.d.ts +0 -15
  1033. package/dist/components/CommonInputInnerContainer/types.d.ts +0 -47
  1034. package/dist/components/CommonInputOuterContainer/CommonInputOuterContainer.vue.d.ts +0 -11
  1035. package/dist/components/CommonInputOuterContainer/types.d.ts +0 -16
  1036. package/dist/composables/useModalsState.d.ts +0 -5
  1037. package/dist/composables/useQueue.d.ts +0 -58
  1038. package/dist/composables/useWizard.d.ts +0 -85
  1039. package/dist/i18n/en.d.ts +0 -67
  1040. package/dist/i18n/it.d.ts +0 -67
  1041. package/dist/index.css +0 -2
  1042. package/dist/index100.js +0 -6
  1043. package/dist/index101.js +0 -300
  1044. package/dist/index102.js +0 -16
  1045. package/dist/index103.js +0 -16
  1046. package/dist/index104.js +0 -27
  1047. package/dist/index109.js +0 -19
  1048. package/dist/index11.js +0 -42
  1049. package/dist/index110.js +0 -12
  1050. package/dist/index111.js +0 -19
  1051. package/dist/index112.js +0 -25
  1052. package/dist/index114.js +0 -7
  1053. package/dist/index115.js +0 -241
  1054. package/dist/index116.js +0 -5
  1055. package/dist/index117.js +0 -42
  1056. package/dist/index118.js +0 -5
  1057. package/dist/index119.js +0 -53
  1058. package/dist/index120.js +0 -5
  1059. package/dist/index121.js +0 -32
  1060. package/dist/index122.js +0 -5
  1061. package/dist/index124.js +0 -52
  1062. package/dist/index125.js +0 -5
  1063. package/dist/index126.js +0 -223
  1064. package/dist/index128.js +0 -6
  1065. package/dist/index129.js +0 -162
  1066. package/dist/index13.js +0 -92
  1067. package/dist/index130.js +0 -25
  1068. package/dist/index131.js +0 -51
  1069. package/dist/index132.js +0 -5
  1070. package/dist/index133.js +0 -607
  1071. package/dist/index135.js +0 -6
  1072. package/dist/index136.js +0 -14
  1073. package/dist/index137.js +0 -153
  1074. package/dist/index139.js +0 -6
  1075. package/dist/index14.js +0 -306
  1076. package/dist/index140.js +0 -224
  1077. package/dist/index141.js +0 -5
  1078. package/dist/index143.js +0 -128
  1079. package/dist/index145.js +0 -6
  1080. package/dist/index146.js +0 -8
  1081. package/dist/index147.js +0 -182
  1082. package/dist/index149.js +0 -6
  1083. package/dist/index15.js +0 -10
  1084. package/dist/index151.js +0 -4
  1085. package/dist/index152.js +0 -95
  1086. package/dist/index154.js +0 -6
  1087. package/dist/index155.js +0 -168
  1088. package/dist/index157.js +0 -6
  1089. package/dist/index158.js +0 -145
  1090. package/dist/index16.js +0 -59
  1091. package/dist/index160.js +0 -6
  1092. package/dist/index161.js +0 -53
  1093. package/dist/index163.js +0 -6
  1094. package/dist/index164.js +0 -16
  1095. package/dist/index166.js +0 -35
  1096. package/dist/index168.js +0 -6
  1097. package/dist/index169.js +0 -89
  1098. package/dist/index171.js +0 -6
  1099. package/dist/index172.js +0 -82
  1100. package/dist/index174.js +0 -6
  1101. package/dist/index175.js +0 -38
  1102. package/dist/index176.js +0 -461
  1103. package/dist/index177.js +0 -28
  1104. package/dist/index178.js +0 -66
  1105. package/dist/index18.js +0 -35
  1106. package/dist/index180.js +0 -162
  1107. package/dist/index181.js +0 -5
  1108. package/dist/index182.js +0 -217
  1109. package/dist/index183.js +0 -5
  1110. package/dist/index184.js +0 -112
  1111. package/dist/index185.js +0 -5
  1112. package/dist/index186.js +0 -459
  1113. package/dist/index188.js +0 -6
  1114. package/dist/index19.js +0 -4
  1115. package/dist/index192.js +0 -268
  1116. package/dist/index194.js +0 -6
  1117. package/dist/index195.js +0 -124
  1118. package/dist/index197.js +0 -6
  1119. package/dist/index198.js +0 -174
  1120. package/dist/index2.js +0 -20
  1121. package/dist/index20.js +0 -9
  1122. package/dist/index200.js +0 -6
  1123. package/dist/index201.js +0 -224
  1124. package/dist/index203.js +0 -6
  1125. package/dist/index204.js +0 -135
  1126. package/dist/index206.js +0 -6
  1127. package/dist/index207.js +0 -5
  1128. package/dist/index208.js +0 -170
  1129. package/dist/index21.js +0 -35
  1130. package/dist/index210.js +0 -6
  1131. package/dist/index211.js +0 -37
  1132. package/dist/index213.js +0 -6
  1133. package/dist/index214.js +0 -63
  1134. package/dist/index216.js +0 -6
  1135. package/dist/index217.js +0 -74
  1136. package/dist/index219.js +0 -6
  1137. package/dist/index22.js +0 -6
  1138. package/dist/index220.js +0 -65
  1139. package/dist/index222.js +0 -6
  1140. package/dist/index223.js +0 -67
  1141. package/dist/index225.js +0 -6
  1142. package/dist/index226.js +0 -41
  1143. package/dist/index228.js +0 -6
  1144. package/dist/index229.js +0 -10
  1145. package/dist/index23.js +0 -7
  1146. package/dist/index230.js +0 -22
  1147. package/dist/index232.js +0 -8
  1148. package/dist/index233.js +0 -297
  1149. package/dist/index235.js +0 -6
  1150. package/dist/index236.js +0 -47
  1151. package/dist/index237.js +0 -165
  1152. package/dist/index239.js +0 -6
  1153. package/dist/index24.js +0 -9
  1154. package/dist/index241.js +0 -159
  1155. package/dist/index243.js +0 -6
  1156. package/dist/index244.js +0 -134
  1157. package/dist/index246.js +0 -6
  1158. package/dist/index247.js +0 -167
  1159. package/dist/index249.js +0 -6
  1160. package/dist/index25.js +0 -24
  1161. package/dist/index250.js +0 -147
  1162. package/dist/index252.js +0 -6
  1163. package/dist/index253.js +0 -35
  1164. package/dist/index255.js +0 -6
  1165. package/dist/index256.js +0 -65
  1166. package/dist/index258.js +0 -6
  1167. package/dist/index259.js +0 -19
  1168. package/dist/index260.js +0 -5
  1169. package/dist/index261.js +0 -160
  1170. package/dist/index263.js +0 -6
  1171. package/dist/index264.js +0 -60
  1172. package/dist/index266.js +0 -6
  1173. package/dist/index267.js +0 -134
  1174. package/dist/index269.js +0 -6
  1175. package/dist/index27.js +0 -4
  1176. package/dist/index271.js +0 -206
  1177. package/dist/index273.js +0 -6
  1178. package/dist/index274.js +0 -85
  1179. package/dist/index275.js +0 -5
  1180. package/dist/index276.js +0 -55
  1181. package/dist/index277.js +0 -5
  1182. package/dist/index278.js +0 -164
  1183. package/dist/index28.js +0 -8
  1184. package/dist/index280.js +0 -6
  1185. package/dist/index281.js +0 -145
  1186. package/dist/index283.js +0 -6
  1187. package/dist/index284.js +0 -11
  1188. package/dist/index285.js +0 -200
  1189. package/dist/index287.js +0 -6
  1190. package/dist/index288.js +0 -241
  1191. package/dist/index29.js +0 -7
  1192. package/dist/index290.js +0 -6
  1193. package/dist/index291.js +0 -21
  1194. package/dist/index293.js +0 -6
  1195. package/dist/index294.js +0 -125
  1196. package/dist/index296.js +0 -6
  1197. package/dist/index297.js +0 -161
  1198. package/dist/index299.js +0 -6
  1199. package/dist/index30.js +0 -118
  1200. package/dist/index300.js +0 -127
  1201. package/dist/index302.js +0 -6
  1202. package/dist/index303.js +0 -20
  1203. package/dist/index305.js +0 -6
  1204. package/dist/index306.js +0 -116
  1205. package/dist/index307.js +0 -5
  1206. package/dist/index308.js +0 -507
  1207. package/dist/index31.js +0 -10
  1208. package/dist/index310.js +0 -6
  1209. package/dist/index311.js +0 -196
  1210. package/dist/index313.js +0 -6
  1211. package/dist/index314.js +0 -142
  1212. package/dist/index316.js +0 -6
  1213. package/dist/index317.js +0 -134
  1214. package/dist/index319.js +0 -6
  1215. package/dist/index32.js +0 -28
  1216. package/dist/index320.js +0 -162
  1217. package/dist/index322.js +0 -6
  1218. package/dist/index323.js +0 -319
  1219. package/dist/index325.js +0 -6
  1220. package/dist/index326.js +0 -40
  1221. package/dist/index327.js +0 -43
  1222. package/dist/index328.js +0 -665
  1223. package/dist/index33.js +0 -5
  1224. package/dist/index330.js +0 -6
  1225. package/dist/index331.js +0 -155
  1226. package/dist/index333.js +0 -6
  1227. package/dist/index334.js +0 -142
  1228. package/dist/index336.js +0 -6
  1229. package/dist/index337.js +0 -155
  1230. package/dist/index339.js +0 -6
  1231. package/dist/index34.js +0 -112
  1232. package/dist/index340.js +0 -58
  1233. package/dist/index341.js +0 -5
  1234. package/dist/index342.js +0 -20
  1235. package/dist/index344.js +0 -6
  1236. package/dist/index345.js +0 -142
  1237. package/dist/index347.js +0 -6
  1238. package/dist/index349.js +0 -109
  1239. package/dist/index351.js +0 -6
  1240. package/dist/index352.js +0 -55
  1241. package/dist/index353.js +0 -24
  1242. package/dist/index354.js +0 -23
  1243. package/dist/index355.js +0 -839
  1244. package/dist/index356.js +0 -474
  1245. package/dist/index357.js +0 -52
  1246. package/dist/index358.js +0 -7
  1247. package/dist/index36.js +0 -6
  1248. package/dist/index38.js +0 -63
  1249. package/dist/index39.js +0 -63
  1250. package/dist/index40.js +0 -9
  1251. package/dist/index42.js +0 -8
  1252. package/dist/index43.js +0 -179
  1253. package/dist/index44.js +0 -21
  1254. package/dist/index46.js +0 -385
  1255. package/dist/index48.js +0 -6
  1256. package/dist/index49.js +0 -33
  1257. package/dist/index5.js +0 -34
  1258. package/dist/index50.js +0 -12
  1259. package/dist/index51.js +0 -8
  1260. package/dist/index52.js +0 -106
  1261. package/dist/index53.js +0 -330
  1262. package/dist/index54.js +0 -97
  1263. package/dist/index55.js +0 -328
  1264. package/dist/index56.js +0 -28
  1265. package/dist/index57.js +0 -102
  1266. package/dist/index58.js +0 -157
  1267. package/dist/index6.js +0 -38
  1268. package/dist/index60.js +0 -6
  1269. package/dist/index61.js +0 -131
  1270. package/dist/index62.js +0 -5
  1271. package/dist/index65.js +0 -35
  1272. package/dist/index66.js +0 -26
  1273. package/dist/index68.js +0 -6
  1274. package/dist/index69.js +0 -54
  1275. package/dist/index7.js +0 -58
  1276. package/dist/index71.js +0 -6
  1277. package/dist/index72.js +0 -14
  1278. package/dist/index74.js +0 -6
  1279. package/dist/index75.js +0 -159
  1280. package/dist/index77.js +0 -6
  1281. package/dist/index78.js +0 -4
  1282. package/dist/index79.js +0 -4
  1283. package/dist/index80.js +0 -54
  1284. package/dist/index81.js +0 -5
  1285. package/dist/index82.js +0 -5
  1286. package/dist/index83.js +0 -141
  1287. package/dist/index85.js +0 -6
  1288. package/dist/index86.js +0 -65
  1289. package/dist/index88.js +0 -6
  1290. package/dist/index89.js +0 -30
  1291. package/dist/index9.js +0 -11
  1292. package/dist/index90.js +0 -19
  1293. package/dist/index91.js +0 -17
  1294. package/dist/index92.js +0 -9
  1295. package/dist/index93.js +0 -34
  1296. package/dist/index95.js +0 -16
  1297. package/dist/index96.js +0 -10
  1298. package/dist/index97.js +0 -18
  1299. package/dist/index98.js +0 -189
  1300. package/dist/types/VoidHtmlElements.d.ts +0 -1
  1301. package/dist/utilities/functions/add.d.ts +0 -1
  1302. package/dist/utilities/functions/booleanishToBoolean.d.ts +0 -6
  1303. package/dist/utilities/functions/capitalize.d.ts +0 -4
  1304. package/dist/utilities/functions/cloneDeep.d.ts +0 -1
  1305. package/dist/utilities/functions/debounce.d.ts +0 -1
  1306. package/dist/utilities/functions/drop.d.ts +0 -1
  1307. package/dist/utilities/functions/exceedsPrecision.d.ts +0 -1
  1308. package/dist/utilities/functions/findRight.d.ts +0 -4
  1309. package/dist/utilities/functions/findRightIndex.d.ts +0 -4
  1310. package/dist/utilities/functions/flow.d.ts +0 -1
  1311. package/dist/utilities/functions/getHueFromRGB.d.ts +0 -9
  1312. package/dist/utilities/functions/groupBy.d.ts +0 -6
  1313. package/dist/utilities/functions/gt.d.ts +0 -7
  1314. package/dist/utilities/functions/hexToRGB.d.ts +0 -7
  1315. package/dist/utilities/functions/hslToHex.d.ts +0 -1
  1316. package/dist/utilities/functions/includes.d.ts +0 -1
  1317. package/dist/utilities/functions/initial.d.ts +0 -1
  1318. package/dist/utilities/functions/isCssColor.d.ts +0 -5
  1319. package/dist/utilities/functions/lt.d.ts +0 -7
  1320. package/dist/utilities/functions/makeUrl.d.ts +0 -1
  1321. package/dist/utilities/functions/mapKeys.d.ts +0 -5
  1322. package/dist/utilities/functions/mapValues.d.ts +0 -1
  1323. package/dist/utilities/functions/matchesPropertyInsensitive.d.ts +0 -1
  1324. package/dist/utilities/functions/max.d.ts +0 -2
  1325. package/dist/utilities/functions/mean.d.ts +0 -4
  1326. package/dist/utilities/functions/merge.d.ts +0 -11
  1327. package/dist/utilities/functions/millisecondsTo.d.ts +0 -1
  1328. package/dist/utilities/functions/negate.d.ts +0 -4
  1329. package/dist/utilities/functions/normalizeItemGroups.d.ts +0 -13
  1330. package/dist/utilities/functions/omit.d.ts +0 -2
  1331. package/dist/utilities/functions/overEvery.d.ts +0 -4
  1332. package/dist/utilities/functions/pick.d.ts +0 -1
  1333. package/dist/utilities/functions/replace.d.ts +0 -1
  1334. package/dist/utilities/functions/replaceInTree.d.ts +0 -4
  1335. package/dist/utilities/functions/retry.d.ts +0 -5
  1336. package/dist/utilities/functions/roundToTheNearest.d.ts +0 -8
  1337. package/dist/utilities/functions/set.d.ts +0 -15
  1338. package/dist/utilities/functions/stub.d.ts +0 -6
  1339. package/dist/utilities/functions/transposePercent.d.ts +0 -9
  1340. package/dist/utilities/functions/tryTo.d.ts +0 -2
  1341. package/dist/utilities/functions/uniqBy.d.ts +0 -1
  1342. /package/dist/{index64.js → _virtual/_plugin-vue_export-helper.js} +0 -0
  1343. /package/dist/components/{BaseButton → BbBaseButton}/RouterComponent.vue.d.ts +0 -0
  1344. /package/dist/components/{BaseDatePicker/BaseDatePicker.vue.d.ts → BbBaseDatePicker/BbBaseDatePicker.vue.d.ts} +0 -0
  1345. /package/dist/{index165.js → composables/useArray.js} +0 -0
  1346. /package/dist/{index17.js → composables/useFrameworkDetection.js} +0 -0
  1347. /package/dist/{index12.js → composables/useId.js} +0 -0
  1348. /package/dist/{index107.js → utilities/functions/chunk.js} +0 -0
  1349. /package/dist/{index8.js → utilities/functions/clamp.js} +0 -0
  1350. /package/dist/{index150.js → utilities/functions/curry.js} +0 -0
  1351. /package/dist/{index45.js → utilities/functions/extractDomContainer.js} +0 -0
  1352. /package/dist/{index270.js → utilities/functions/findInTree.js} +0 -0
  1353. /package/dist/{index348.js → utilities/functions/flattenTree.js} +0 -0
  1354. /package/dist/{index41.js → utilities/functions/get.js} +0 -0
  1355. /package/dist/{index189.js → utilities/functions/head.js} +0 -0
  1356. /package/dist/{index108.js → utilities/functions/identity.js} +0 -0
  1357. /package/dist/{index179.js → utilities/functions/indexBy.js} +0 -0
  1358. /package/dist/{index37.js → utilities/functions/isHex.js} +0 -0
  1359. /package/dist/{index94.js → utilities/functions/isNil.js} +0 -0
  1360. /package/dist/{index26.js → utilities/functions/isNotNil.js} +0 -0
  1361. /package/dist/{index105.js → utilities/functions/last.js} +0 -0
  1362. /package/dist/{index142.js → utilities/functions/noop.js} +0 -0
  1363. /package/dist/{index231.js → utilities/functions/parseWidthString.js} +0 -0
  1364. /package/dist/{index240.js → utilities/functions/pickBy.js} +0 -0
  1365. /package/dist/{index123.js → utilities/functions/range.js} +0 -0
  1366. /package/dist/{index190.js → utilities/functions/snapToStep.js} +0 -0
  1367. /package/dist/{index191.js → utilities/functions/transpose.js} +0 -0
  1368. /package/dist/{index106.js → utilities/functions/validateDateFormat.js} +0 -0
  1369. /package/dist/{index10.js → utilities/functions/wait.js} +0 -0
@@ -0,0 +1,1703 @@
1
+ ---
2
+ title: Inline-Edit Workspace (Nuxt)
3
+ summary: Linear-style sprint backlog for Nuxt where every cell autosaves — optimistic per-field overlay with rollback, commit-on-blur text cells, spinner-in-the-chevron badge pickers, an async assignee search, bulk bar and peek workbench, filters URL-synced and data fetched with useAsyncData (the overlay retires in its transform), all through one coopting page context.
4
+ ---
5
+
6
+ # Recipe: Inline-Edit Workspace (Nuxt)
7
+
8
+ The flagship of pattern **§6.8 — autosave cells**, adapted for **Nuxt**: a
9
+ Linear-grade sprint backlog where **every cell persists itself and the page
10
+ has no Save button anywhere**. Change a status, retype a title, clear an
11
+ estimate — it is already saved, or it has already rolled back and told you.
12
+ Filters and the active tab live in the URL, the list loads through
13
+ `useAsyncData` watching `route.query`, and the optimistic overlay retires in
14
+ that fetch's `transform`; every mutation ends in `refresh()`. Anatomy,
15
+ components, the context shape, copy and data are identical to the Vue
16
+ recipe; only the data/URL/mutation layer changes.
17
+
18
+ Domain: **Sprint 24** of a product team — fourteen issues (`BB-227` …
19
+ `BB-241`), four statuses, three priorities, a six-member team (Sofia Reyes,
20
+ Jonah Weiss, Priya Natarajan, Tom Okafor, Elif Demir, Marco Bianchi).
21
+ Deliberately distinct from the invoices/members/expenses of the sibling
22
+ recipes.
23
+
24
+ ## Prerequisites
25
+
26
+ - **[Layout Scaffold](./layout-scaffold.md) — build it first.** This recipe
27
+ imports `PageShell`, `usePageShellContext` and `FloatingBottomPanel` from your own app.
28
+ They are not package exports; the scaffold recipe is their source. Copy
29
+ those files before anything below, and do not hand-roll replacements —
30
+ the peek stack, the close semantics and the sidebar's out-of-flow
31
+ behaviour are all load-bearing here.
32
+ Components: [BbTable](../../BbTable.md) ·
33
+ [BbSelectPopover](../../BbSelectPopover.md) (§ One popover per table row is
34
+ load-bearing here) · [BbBadge](../../BbBadge.md) (the `loading` /
35
+ `append:icon` interplay).
36
+
37
+ Guides: [Inline Edit Playbook](../../guides/inline-edit-playbook.md) (who owns
38
+ the edit — this page is the autosave answer) ·
39
+ [Design language](../../guides/design-language.md) (§ Using color, § Badges
40
+ label state) · [Page Shell](../../guides/page-shell.md) ·
41
+ [Floating Bottom Panel](../../guides/floating-bottom-panel.md).
42
+
43
+ Siblings: [vue](../vue/inline-edit-workspace.md) ·
44
+ [inertia](../inertia/inline-edit-workspace.md).
45
+
46
+ Platform assumptions: `<BbConfirm />` and `<BbToast />` mounted once in
47
+ `app.vue` — never in a page; the layout chrome from the guides copied into
48
+ `src/components/layout/`. Server routes: `GET /api/issues` (accepts
49
+ `search`, `status[]`, `priority[]`, `assignee`, `tab`, `page`, `perPage`;
50
+ returns `{ data, total, tabCounts }`); `GET /api/members` (`search`; the
51
+ team directory) and `GET /api/members/:id`; plus the mutation routes
52
+ referenced below (`PATCH /api/issues/:id`, `POST /api/issues/:id/duplicate`,
53
+ `POST /api/issues/move-to-next-sprint`, `PATCH /api/issues/bulk`,
54
+ `DELETE /api/issues/:id`).
55
+
56
+ ## Key ideas
57
+
58
+ - **No Save button anywhere.** Every cell commits itself through one context
59
+ action, `persistField(issue, key, value)` — optimistic write, single-field
60
+ PATCH, refetch; failure rolls back just that field and toasts. Nothing on
61
+ the page is ever "changed but unsaved", so there is no dirty ring and no
62
+ dirty-gated button — the only transient state is _saving_, and the spinner
63
+ carries it.
64
+ - **The optimistic overlay is page state, not cell state.** `pending` maps
65
+ `issue.id → { field: value }` on **rung 3** of the state ladder: the grid
66
+ cells, the peek workbench _and the fetch itself_ all read it. This is the
67
+ deliberate contrast with the one-shot §6.1 status cell (see
68
+ `records-workspace`), whose `saving` flag is a rung-1 local ref — in an
69
+ autosave grid the fetch must also know what is in flight, so the flag
70
+ cannot live inside a cell.
71
+ - **The overlay is retired in the fetch's `transform`, never when a save
72
+ resolves** — and only for fields the response actually confirms. Retiring
73
+ on save-resolve makes the cell flash new → old → new for the whole reload,
74
+ because the table still holds the stale row until the refetch lands.
75
+ - **Typed inputs commit on `@change` (blur/Enter), never `v-model`.** A
76
+ `v-model` autosave is one request per keystroke. Pickers commit on pick —
77
+ the click already _is_ the commit.
78
+ - **One coopting page context.** `provideBacklogWorkspace()` joins the
79
+ page-shell stack and the table context once, owns filters/tab/overlay, and
80
+ exposes complete actions. Eleven components share everything through one
81
+ `useBacklogWorkspace()` call — zero prop drilling.
82
+ - **Filters and tab live in the URL, not in local-only refs.** They are
83
+ seeded from `route.query` at setup and every change mirrors back through
84
+ `navigateTo` (debounced for free text); `useAsyncData('issues', …)`
85
+ watching `route.query` is the single refetch trigger, and its own
86
+ `refresh()` is the one imperative reload every mutation calls. The page is
87
+ bookmarkable mid-triage and survives reload.
88
+ - **Options resolve once, at page level.** Status and priority are static
89
+ module-level catalogs (fifty rows, zero requests); the assignee picker
90
+ shares **one** query provider across every row, so unopened rows cost
91
+ nothing.
92
+ - **Status is color, per the soft palette.** The registered `soft-*` badge
93
+ variants label the closed status/priority sets; the internal trailing
94
+ chevron says "clickable", and the badge's `loading` swaps the spinner into
95
+ the chevron's place while that one field saves.
96
+ - **Buttons are `md` by default**; `sm` appears only in row actions, the
97
+ filter pills, the peek footer and the bulk bar. Internal navigation
98
+ (`New issue`, the peek's `Open full page`) uses `to`, Nuxt's Vue Router
99
+ prop, instead of a raw `href`.
100
+
101
+ ## Page anatomy
102
+
103
+ ```
104
+ BacklogWorkspace/
105
+ Index.vue ← assembly: PageShell slots, table, tabs, pagination
106
+ context.ts ← coopts shell + table ctx; owns URL-synced filters + the pending overlay + persistField
107
+ FilterRail.vue ← status / priority / assignee filter pills + clear-all
108
+ EditableTitleCell.vue ← commit-on-blur text (@change, never v-model)
109
+ EstimateCell.vue ← commit-on-change number cell
110
+ StatusCell.vue ← editable soft badge (chevron at rest, spinner in flight)
111
+ PriorityCell.vue ← same grammar, its own leaf (§6.3: never one EditableCell with a type prop)
112
+ AssigneeCell.vue ← provider-backed people picker badge (ONE shared query fn)
113
+ RowActions.vue ← … dropdown: duplicate, move to next sprint, delete (confirm)
114
+ SelectionBar.vue ← bulk status / bulk assign / bulk move (floating bottom panel)
115
+ IssuePeek.vue ← peek workbench reusing the SAME Status/Priority/Assignee cells
116
+ ```
117
+
118
+ Chrome assumed from the guides: `AppLayout` (left nav + fat footer),
119
+ `PageShell`, `FloatingBottomPanel`. Note what is _missing_ compared to the
120
+ records workspace: there is no dialog component and the shell's `#dialogs`
121
+ slot stays empty — on an autosave page the grid _is_ the form, so nothing
122
+ needs a modal to edit.
123
+
124
+ ## Action inventory
125
+
126
+ | # | Action | Trigger | Mechanism |
127
+ | --- | ------------------------ | ---------------------------------- | ---------------------------------------------------- |
128
+ | 1 | New issue | topbar, the page's one `primary` | navigation (`to="/issues/new"`) |
129
+ | 2 | Page search | topbar right | `filters.search` → URL → `useAsyncData` refetch |
130
+ | 3 | Switch sprint tab | href tabs with live counts | URL + `useAsyncData` refetch |
131
+ | 4 | Filter by status | rail pill | `BbSelectPopover` multiple over the static catalog |
132
+ | 5 | Filter by priority | rail pill | `BbSelectPopover` multiple over the static catalog |
133
+ | 6 | Filter by assignee | rail pill | the shared people provider, single select |
134
+ | 7 | Clear filters | rail right (only when active) | context `clearFilters()` |
135
+ | 8 | Rename issue | title cell (grid) | commit-on-blur `@change` → `persistField('title')` |
136
+ | 9 | Re-estimate | estimate cell (grid) | commit-on-change number → `persistField('estimate')` |
137
+ | 10 | Change status | status badge (grid **and** peek) | pick = commit; spinner in the chevron (§6.8) |
138
+ | 11 | Change priority | priority badge (grid **and** peek) | same grammar, its own leaf |
139
+ | 12 | Reassign | assignee badge (grid **and** peek) | async people search; one shared provider |
140
+ | 13 | Peek issue | issue ref cell | `peekIssue(id)` → shell stack |
141
+ | 14 | Duplicate | row `…` dropdown | context action + toast |
142
+ | 15 | Move to next sprint | row `…` **and** bulk bar | `moveToNextSprint` / `bulkMoveToNextSprint` |
143
+ | 16 | Delete | row `…`, peek footer | destructive behind `useConfirm` |
144
+ | 17 | Bulk set status | bottom panel picker | `bulkStatus` on `table.selected` |
145
+ | 18 | Bulk assign | bottom panel picker | `bulkAssign` on `table.selected` |
146
+ | 19 | Select rows / select all | table checkboxes | table context |
147
+ | 20 | Open full issue | peek footer | navigation (`to="/issues/:id"`) |
148
+ | 21 | Close peek | shell chrome | shell stack close |
149
+
150
+ Rows 8–12 are the recipe's reason to exist: five editable fields of three
151
+ different control kinds, each persisting itself, two of them able to be in
152
+ flight **on the same row at the same time**.
153
+
154
+ ## The code
155
+
156
+ ### Project setup — the soft status palette
157
+
158
+ Status and priority are small closed sets — the textbook case for the soft
159
+ semantic accents. The names are registered in the Nuxt module (that makes
160
+ them type-check as `BbBadge` variants); the CSS is the project's own,
161
+ kept in a stylesheet separate from the library defaults:
162
+
163
+ ```ts
164
+ // nuxt.config.ts — the names; the library ships no CSS for them.
165
+ export default defineNuxtConfig({
166
+ modules: ['bitboss-ui/nuxt'],
167
+ css: ['~/assets/css/badge-variants.css'],
168
+ bitboss: {
169
+ iconDir: './assets/icons',
170
+ badgeVariants: [
171
+ 'soft-gray',
172
+ 'soft-blue',
173
+ 'soft-green',
174
+ 'soft-amber',
175
+ 'soft-red',
176
+ ],
177
+ },
178
+ });
179
+ ```
180
+
181
+ ```css
182
+ /* assets/css/badge-variants.css — trimmed. Canonical palette + the full
183
+ recipe (why the selectors are doubled, why the hue lives in a local
184
+ --accent): design-language.md § Using color. */
185
+ .bb-badge.bb-badge--soft-gray {
186
+ --accent: #64748b;
187
+ }
188
+ .bb-badge.bb-badge--soft-blue {
189
+ --accent: #2563eb;
190
+ }
191
+ .bb-badge.bb-badge--soft-green {
192
+ --accent: #16a34a;
193
+ }
194
+ .bb-badge.bb-badge--soft-amber {
195
+ --accent: #d97706;
196
+ }
197
+ .bb-badge.bb-badge--soft-red {
198
+ --accent: #dc2626;
199
+ }
200
+
201
+ .bb-badge.bb-badge--soft-gray,
202
+ .bb-badge.bb-badge--soft-blue,
203
+ .bb-badge.bb-badge--soft-green,
204
+ .bb-badge.bb-badge--soft-amber,
205
+ .bb-badge.bb-badge--soft-red {
206
+ --bg: color-mix(in oklab, var(--accent) 15%, var(--bb-panel));
207
+ --color: color-mix(in oklab, var(--accent) 80%, var(--bb-text));
208
+ --border-width: 1px;
209
+ --border-color: color-mix(in oklab, var(--accent) 25%, var(--bb-panel));
210
+ --ring: color-mix(in oklab, var(--accent) 45%, transparent);
211
+ }
212
+ ```
213
+
214
+ ### context.ts
215
+
216
+ ```ts
217
+ // BacklogWorkspace/context.ts
218
+ import {
219
+ computed,
220
+ inject,
221
+ provide,
222
+ reactive,
223
+ ref,
224
+ watch,
225
+ type ComputedRef,
226
+ type InjectionKey,
227
+ type Ref,
228
+ } from 'vue';
229
+ import {
230
+ useBbTableContext,
231
+ useConfirm,
232
+ useToast,
233
+ type BadgeVariantType,
234
+ type BbTableContext,
235
+ } from 'bitboss-ui';
236
+ import {
237
+ usePageShellContext,
238
+ type PageShellContext,
239
+ } from '@/components/layout/usePageShellContext';
240
+ import { watchDebounced } from '@vueuse/core';
241
+ import type { Issue, IssuePriority, IssueStatus, Member } from '@/types';
242
+
243
+ /** What the peek sidebar can show. Clicking an issue ref pushes one of these. */
244
+ export type PeekItem = { type: 'issue'; id: string };
245
+
246
+ export type SprintTab = 'backlog' | 'current' | 'done';
247
+
248
+ /**
249
+ * Exactly what a save can carry: the subset of Issue the user edits inline.
250
+ * Five fields of three control kinds on purpose — the pattern only proves
251
+ * itself once a row can be PARTIALLY in flight (title saving while the same
252
+ * row's status saves), once a field is backed by a search (assignee), and
253
+ * once a field changes on every keystroke (title, estimate).
254
+ */
255
+ export type IssuePatch = Partial<
256
+ Pick<Issue, 'title' | 'estimate' | 'status' | 'priority' | 'assignee'>
257
+ >;
258
+ export type EditableKey = keyof IssuePatch;
259
+
260
+ export interface BacklogFilters {
261
+ search: string;
262
+ status: IssueStatus[];
263
+ priority: IssuePriority[];
264
+ /** The whole member, not an id — the pill labels itself with zero fetches. */
265
+ assignee: Member | null;
266
+ }
267
+
268
+ type IssueListResponse = {
269
+ data: Issue[];
270
+ total: number;
271
+ tabCounts: Record<SprintTab, number>;
272
+ };
273
+
274
+ // -- Option catalogs: resolved once, at module level, for the whole page. ----
275
+ // Static arrays cost fifty rows zero requests; a per-row provider would cost
276
+ // one request per opened row (BbSelectPopover § One popover per table row).
277
+ export const STATUS_OPTIONS: { value: IssueStatus; label: string }[] = [
278
+ { value: 'open', label: 'Open' },
279
+ { value: 'in-progress', label: 'In progress' },
280
+ { value: 'blocked', label: 'Blocked' },
281
+ { value: 'done', label: 'Done' },
282
+ ];
283
+ export const PRIORITY_OPTIONS: { value: IssuePriority; label: string }[] = [
284
+ { value: 'high', label: 'High' },
285
+ { value: 'normal', label: 'Normal' },
286
+ { value: 'low', label: 'Low' },
287
+ ];
288
+
289
+ // Status/priority are small closed sets — the textbook case for the soft
290
+ // accents (design-language.md § Using color). Registered in nuxt.config.ts.
291
+ export const STATUS_VARIANT: Record<IssueStatus, BadgeVariantType> = {
292
+ open: 'soft-gray',
293
+ 'in-progress': 'soft-blue',
294
+ blocked: 'soft-red',
295
+ done: 'soft-green',
296
+ };
297
+ export const PRIORITY_VARIANT: Record<IssuePriority, BadgeVariantType> = {
298
+ high: 'soft-amber',
299
+ normal: 'secondary',
300
+ low: 'outline',
301
+ };
302
+
303
+ /**
304
+ * `id: null` is the real "Unassigned" option, not an absence. The assignee is
305
+ * stored on the row as the whole member, so a row's badge always labels
306
+ * itself from its own data — no client-side directory cache, and the trigger
307
+ * never depends on the picker having loaded.
308
+ */
309
+ export const UNASSIGNED: Member = { id: null, name: 'Unassigned' };
310
+
311
+ /**
312
+ * ONE query provider shared by every assignee picker on the page — each
313
+ * row's cell, the peek's cell, the rail pill and the bulk-assign picker.
314
+ * Providers are lazy, so a row nobody opens costs nothing. Contract
315
+ * (fetch-items-playbook): component-initiated calls (`prefill === true`) and
316
+ * an empty query return the whole team — six people, one cheap request — so
317
+ * the current selection always stays resolvable; typed queries search.
318
+ */
319
+ export const searchMembers = async (
320
+ query: string,
321
+ prefill: boolean
322
+ ): Promise<Member[]> => {
323
+ const q = query.trim();
324
+ const members = await $fetch<Member[]>('/api/members', {
325
+ query: prefill || !q ? {} : { search: q },
326
+ });
327
+ return [UNASSIGNED, ...members];
328
+ };
329
+
330
+ export interface BacklogWorkspaceContext {
331
+ // -- Coopted contexts ------------------------------------------------------
332
+ shell: PageShellContext<PeekItem>;
333
+ table: BbTableContext;
334
+ // -- Page-owned state (URL-synced) -------------------------------------------
335
+ filters: BacklogFilters;
336
+ hasActiveFilters: ComputedRef<boolean>;
337
+ tab: Ref<SprintTab>;
338
+ tabCounts: ComputedRef<Record<SprintTab, number>>;
339
+ // -- The autosave overlay (§6.8) --------------------------------------------
340
+ /**
341
+ * Optimistic values per row PER FIELD, held until the server's own data
342
+ * carries them. Reactive. Rung 3 on purpose: the cells, the peek and
343
+ * the fetch's transform all read it. Cells never touch it directly —
344
+ * they go through `valueOf` / `isSaving`.
345
+ */
346
+ pending: Record<string, IssuePatch>;
347
+ /** Fields whose last save failed, keyed `${id}:${field}`. */
348
+ failed: Readonly<Ref<Set<string>>>;
349
+ /** Read-through: the overlay wins, the row is the fallback. */
350
+ valueOf: <K extends EditableKey>(issue: Issue, key: K) => Issue[K];
351
+ /** Whether THIS field of THIS row has a save in flight. */
352
+ isSaving: (issue: Issue, key: EditableKey) => boolean;
353
+ /** The one write path every cell commits through. */
354
+ persistField: <K extends EditableKey>(
355
+ issue: Issue,
356
+ key: K,
357
+ value: Issue[K]
358
+ ) => Promise<void>;
359
+ // -- Data (URL-driven; the fetch's transform retires the overlay) ------------
360
+ issues: ComputedRef<Issue[]>;
361
+ issuesPending: Ref<boolean>;
362
+ // -- Peek ------------------------------------------------------------------
363
+ peekIssue: (id: string) => void;
364
+ // -- Actions (complete: API + refresh + toast) ------------------------------
365
+ clearFilters: () => void;
366
+ duplicateIssue: (issue: Issue) => Promise<void>;
367
+ moveToNextSprint: (issue: Issue) => Promise<void>;
368
+ deleteIssue: (issue: Issue) => Promise<void>;
369
+ bulkStatus: (status: IssueStatus) => Promise<void>;
370
+ bulkAssign: (assignee: Member) => Promise<void>;
371
+ bulkMoveToNextSprint: () => Promise<void>;
372
+ }
373
+
374
+ const key: InjectionKey<BacklogWorkspaceContext> = Symbol('backlog-workspace');
375
+
376
+ /** Comma-joined query value → string[] (or null when absent). */
377
+ const toArray = (value: unknown): string[] | null => {
378
+ if (value == null || value === '') return null;
379
+ return Array.isArray(value) ? value.map(String) : String(value).split(',');
380
+ };
381
+
382
+ export function provideBacklogWorkspace(): BacklogWorkspaceContext {
383
+ const { toast } = useToast();
384
+ const { confirm } = useConfirm();
385
+ const route = useRoute();
386
+
387
+ // -- Coopt the specific contexts: once, here, for the whole page. ----------
388
+ const shell = usePageShellContext<PeekItem>();
389
+ const table = useBbTableContext('backlog-table', { perPage: 25 });
390
+
391
+ // -- Filters + tab: seeded from the URL, the single source of truth. -------
392
+ const filters = reactive<BacklogFilters>({
393
+ search: (route.query.search as string) ?? '',
394
+ status: (toArray(route.query.status) ?? []) as IssueStatus[],
395
+ priority: (toArray(route.query.priority) ?? []) as IssuePriority[],
396
+ assignee: null, // resolved from the URL just below
397
+ });
398
+ const tab = ref<SprintTab>((route.query.tab as SprintTab) ?? 'current');
399
+
400
+ // The URL carries the assignee as an id (`none` = the real Unassigned
401
+ // option, whose id is null). Rows store the whole member, so this one-time
402
+ // resolution exists only so a deep link into a filtered view can label the
403
+ // pill — nothing else on the page ever resolves an id to a name.
404
+ if (route.query.assignee === 'none') {
405
+ filters.assignee = UNASSIGNED;
406
+ } else if (route.query.assignee) {
407
+ $fetch<Member>(`/api/members/${route.query.assignee}`).then((member) => {
408
+ filters.assignee = member;
409
+ });
410
+ }
411
+
412
+ const hasActiveFilters = computed(
413
+ () =>
414
+ filters.search !== '' ||
415
+ filters.status.length > 0 ||
416
+ filters.priority.length > 0 ||
417
+ filters.assignee !== null
418
+ );
419
+
420
+ const clearFilters = () => {
421
+ filters.search = '';
422
+ filters.status = [];
423
+ filters.priority = [];
424
+ filters.assignee = null;
425
+ };
426
+
427
+ // Every filter/tab change mirrors into the query string; `useAsyncData`
428
+ // below watches `route.query`, so this is the whole refetch trigger.
429
+ const syncQuery = () =>
430
+ navigateTo({
431
+ query: {
432
+ search: filters.search || undefined,
433
+ status: filters.status.length ? filters.status.join(',') : undefined,
434
+ priority: filters.priority.length
435
+ ? filters.priority.join(',')
436
+ : undefined,
437
+ assignee:
438
+ filters.assignee === null
439
+ ? undefined
440
+ : (filters.assignee.id ?? 'none'),
441
+ tab: tab.value,
442
+ },
443
+ });
444
+ watchDebounced(filters, syncQuery, { deep: true, debounce: 300 });
445
+ watch(tab, () => {
446
+ table.page.value = 1;
447
+ syncQuery();
448
+ });
449
+
450
+ // -- The autosave overlay -----------------------------------------------------
451
+ const pending = reactive<Record<string, IssuePatch>>({});
452
+ const failed = ref(new Set<string>());
453
+
454
+ const valueOf = <K extends EditableKey>(issue: Issue, key: K): Issue[K] => {
455
+ const patch = pending[issue.id];
456
+ // `key in patch`, not `patch[key] ?? issue[key]`: null is a legitimate
457
+ // committed value here (a cleared estimate), and `??` would drop that
458
+ // overlay and show the stale row value while the save runs.
459
+ return patch && key in patch ? (patch[key] as Issue[K]) : issue[key];
460
+ };
461
+
462
+ const isSaving = (issue: Issue, key: EditableKey): boolean => {
463
+ const patch = pending[issue.id];
464
+ return patch !== undefined && key in patch;
465
+ };
466
+
467
+ // -- Data ---------------------------------------------------------------------
468
+ // The one place the list loads. `route.query` is the single watch source —
469
+ // filters, tab and page changes all funnel through the URL first. The
470
+ // overlay owns the name `pending` on this page, so the fetch's own flag
471
+ // lands as `issuesPending`.
472
+ const {
473
+ data,
474
+ pending: issuesPending,
475
+ refresh,
476
+ } = useAsyncData<IssueListResponse>(
477
+ 'issues',
478
+ () =>
479
+ $fetch<IssueListResponse>('/api/issues', {
480
+ query: {
481
+ search: filters.search || undefined,
482
+ status: filters.status,
483
+ priority: filters.priority,
484
+ assignee:
485
+ filters.assignee === null
486
+ ? undefined
487
+ : (filters.assignee.id ?? 'none'),
488
+ tab: tab.value,
489
+ page: table.page.value,
490
+ perPage: table.perPage.value,
491
+ },
492
+ }),
493
+ {
494
+ watch: [() => route.query, table.page],
495
+ // Retire the overlay HERE — in the transform, where the fresh rows
496
+ // materialize — not when a save resolves, and only the fields this
497
+ // response actually CONFIRMS. Between a save landing and this
498
+ // reload arriving, the table still holds the OLD row; clearing the
499
+ // overlay early makes the cell revert to the stale value for the
500
+ // whole reload — visibly, new → old → new. A field still in flight
501
+ // (the response doesn't carry its value yet) is left alone.
502
+ transform: (response: IssueListResponse) => {
503
+ for (const issue of response.data) {
504
+ const patch = pending[issue.id];
505
+ if (!patch) continue;
506
+ for (const field of Object.keys(patch) as EditableKey[]) {
507
+ if (JSON.stringify(patch[field]) === JSON.stringify(issue[field])) {
508
+ delete patch[field]; // the server's own data carries it now
509
+ }
510
+ }
511
+ if (!Object.keys(patch).length) delete pending[issue.id];
512
+ }
513
+ return response;
514
+ },
515
+ }
516
+ );
517
+ const issues = computed(() => data.value?.data ?? []);
518
+ const tabCounts = computed(
519
+ () => data.value?.tabCounts ?? { backlog: 0, current: 0, done: 0 }
520
+ );
521
+ // Paging totals come back on every fetch and land in the table context.
522
+ watch(
523
+ data,
524
+ (response) => {
525
+ if (response) table.total.value = response.total;
526
+ },
527
+ { immediate: true }
528
+ );
529
+
530
+ /**
531
+ * The complete autosave action, one per commit, for every control kind:
532
+ * no-op guard → optimistic set → single-field PATCH → refetch. On failure
533
+ * it deletes JUST this field from the overlay (the cell snaps back to the
534
+ * row's value — a second field of the same row still in flight is
535
+ * untouched) and toasts destructive. Success does NOT toast: a page where
536
+ * every blur saves would toast constantly — the spinner resolving is the
537
+ * confirmation, failure is the exception worth announcing.
538
+ */
539
+ const persistField = async <K extends EditableKey>(
540
+ issue: Issue,
541
+ key: K,
542
+ value: Issue[K]
543
+ ): Promise<void> => {
544
+ // No-op-commit guard — against what the user SEES (the overlay when one
545
+ // is in flight, the row otherwise): a blur without a change, or
546
+ // re-picking the on-screen value, must not fire a request.
547
+ if (JSON.stringify(value) === JSON.stringify(valueOf(issue, key))) return;
548
+
549
+ const flag = `${issue.id}:${key}`;
550
+ (pending[issue.id] ??= {})[key] = value; // optimistic: the UI moves NOW
551
+ failed.value.delete(flag);
552
+ try {
553
+ await $fetch(`/api/issues/${issue.id}`, {
554
+ method: 'PATCH',
555
+ body: { [key]: value } as IssuePatch,
556
+ });
557
+ // Reload — but do NOT retire the overlay here. The useAsyncData
558
+ // transform drops it once the server's own data carries the value
559
+ // (see above).
560
+ await refresh();
561
+ } catch {
562
+ // Rollback: drop just this field.
563
+ const patch = pending[issue.id];
564
+ if (patch) {
565
+ delete patch[key];
566
+ if (!Object.keys(patch).length) delete pending[issue.id];
567
+ }
568
+ failed.value.add(flag);
569
+ toast({
570
+ title: `Couldn't save the ${key} of ${issue.ref} — reverted.`,
571
+ variant: 'destructive',
572
+ });
573
+ }
574
+ };
575
+
576
+ // -- Peek ------------------------------------------------------------------------
577
+ // One record type on this page, so the grammar is one verb: fresh stack.
578
+ const peekIssue = (id: string) => shell.push({ type: 'issue', id }, true);
579
+
580
+ // -- Discrete actions (row `…`, bulk bar) -------------------------------------
581
+ // These are ordinary complete actions, records-workspace style: they
582
+ // mutate whole rows, not single fields, so they bypass the overlay and
583
+ // simply `refresh()` — and being discrete (not a blur), they DO toast
584
+ // success.
585
+ const duplicateIssue = async (issue: Issue) => {
586
+ const copy = await $fetch<Issue>(`/api/issues/${issue.id}/duplicate`, {
587
+ method: 'POST',
588
+ });
589
+ await refresh();
590
+ toast({ title: `Duplicated as ${copy.ref}.`, variant: 'success' });
591
+ };
592
+
593
+ const moveToNextSprint = async (issue: Issue) => {
594
+ await $fetch('/api/issues/move-to-next-sprint', {
595
+ method: 'POST',
596
+ body: { ids: [issue.id] },
597
+ });
598
+ await refresh();
599
+ toast({ title: `${issue.ref} moved to Sprint 25.`, variant: 'success' });
600
+ };
601
+
602
+ const deleteIssue = async (issue: Issue) => {
603
+ const ok = await confirm({
604
+ variant: 'destructive',
605
+ title: 'Delete issue',
606
+ text: `Delete ${issue.ref} — “${issue.title}”? This cannot be undone.`,
607
+ yes: 'Delete',
608
+ no: 'Cancel',
609
+ });
610
+ if (!ok) return;
611
+ await $fetch(`/api/issues/${issue.id}`, { method: 'DELETE' });
612
+ await refresh();
613
+ toast({ title: `${issue.ref} deleted.`, variant: 'success' });
614
+ };
615
+
616
+ // Bulk actions read and clear the coopted table context themselves.
617
+ const bulkIds = (): string[] => table.selected.value;
618
+ const clearSelection = () => {
619
+ table.selected.value = [];
620
+ };
621
+
622
+ const bulkStatus = async (status: IssueStatus) => {
623
+ const ids = bulkIds();
624
+ await $fetch('/api/issues/bulk', {
625
+ method: 'PATCH',
626
+ body: { ids, patch: { status } },
627
+ });
628
+ clearSelection();
629
+ await refresh();
630
+ const label = STATUS_OPTIONS.find((o) => o.value === status)?.label;
631
+ toast({
632
+ title: `${ids.length} issues moved to ${label}.`,
633
+ variant: 'success',
634
+ });
635
+ };
636
+
637
+ const bulkAssign = async (assignee: Member) => {
638
+ const ids = bulkIds();
639
+ await $fetch('/api/issues/bulk', {
640
+ method: 'PATCH',
641
+ body: { ids, patch: { assignee } },
642
+ });
643
+ clearSelection();
644
+ await refresh();
645
+ toast({
646
+ title: `${ids.length} issues assigned to ${assignee.name}.`,
647
+ variant: 'success',
648
+ });
649
+ };
650
+
651
+ const bulkMoveToNextSprint = async () => {
652
+ const ids = bulkIds();
653
+ await $fetch('/api/issues/move-to-next-sprint', {
654
+ method: 'POST',
655
+ body: { ids },
656
+ });
657
+ clearSelection();
658
+ await refresh();
659
+ toast({
660
+ title: `${ids.length} issues moved to Sprint 25.`,
661
+ variant: 'success',
662
+ });
663
+ };
664
+
665
+ const ctx: BacklogWorkspaceContext = {
666
+ shell,
667
+ table,
668
+ filters,
669
+ hasActiveFilters,
670
+ tab,
671
+ tabCounts,
672
+ pending,
673
+ failed,
674
+ valueOf,
675
+ isSaving,
676
+ persistField,
677
+ issues,
678
+ issuesPending,
679
+ peekIssue,
680
+ clearFilters,
681
+ duplicateIssue,
682
+ moveToNextSprint,
683
+ deleteIssue,
684
+ bulkStatus,
685
+ bulkAssign,
686
+ bulkMoveToNextSprint,
687
+ };
688
+ provide(key, ctx);
689
+ return ctx;
690
+ }
691
+
692
+ export function useBacklogWorkspace(): BacklogWorkspaceContext {
693
+ const ctx = inject(key);
694
+ if (!ctx)
695
+ throw new Error('useBacklogWorkspace() called outside BacklogWorkspace');
696
+ return ctx;
697
+ }
698
+ ```
699
+
700
+ ### Index.vue — the assembly
701
+
702
+ ```vue
703
+ <!-- BacklogWorkspace/Index.vue -->
704
+ <template>
705
+ <PageShell>
706
+ <!-- Topbar: breadcrumbs left, page search + primary action right. -->
707
+ <template #topbar>
708
+ <div class="flex items-center justify-between gap-4 border-b px-4 py-2">
709
+ <!-- Breadcrumbs take the row's slack on a stable basis (min-w-0 flex-auto);
710
+ without it their overflow recompute fights the flex layout every frame. -->
711
+ <BbBreadcrumbs
712
+ class="min-w-0 flex-auto"
713
+ :items="[
714
+ { key: 'product', text: 'Product', to: '/product' },
715
+ { key: 'sprints', text: 'Sprints', to: '/sprints' },
716
+ { key: 'sprint-24', text: 'Sprint 24' },
717
+ ]"
718
+ />
719
+ <div class="flex shrink-0 items-center gap-2">
720
+ <!-- `label` is required across the input family; `hide-label`
721
+ keeps the accessible name while hiding it visually. -->
722
+ <BbTextInput
723
+ v-model="ctx.filters.search"
724
+ autocomplete="off"
725
+ clearable
726
+ compact
727
+ hide-label
728
+ label="Search issues"
729
+ placeholder="Search ref or title…"
730
+ prepend:icon="lucide:search"
731
+ />
732
+ <BbButton
733
+ prepend:icon="lucide:plus"
734
+ to="/issues/new"
735
+ variant="primary"
736
+ >
737
+ New issue
738
+ </BbButton>
739
+ </div>
740
+ </div>
741
+ </template>
742
+
743
+ <div class="flex flex-col gap-3 p-4">
744
+ <FilterRail />
745
+
746
+ <!-- Tabs as URL filters: href updates the query, the key feeds the
747
+ fetch. Counts come back from the server on every fetch. -->
748
+ <BbTabs
749
+ v-model="ctx.tab.value"
750
+ compact
751
+ :items="[
752
+ {
753
+ key: 'backlog',
754
+ label: `Backlog · ${ctx.tabCounts.value.backlog}`,
755
+ href: '?tab=backlog',
756
+ },
757
+ {
758
+ key: 'current',
759
+ label: `Current sprint · ${ctx.tabCounts.value.current}`,
760
+ href: '?tab=current',
761
+ },
762
+ {
763
+ key: 'done',
764
+ label: `Done · ${ctx.tabCounts.value.done}`,
765
+ href: '?tab=done',
766
+ },
767
+ ]"
768
+ />
769
+
770
+ <BbTable
771
+ id="backlog-table"
772
+ v-model:highlighted="highlightedIssue"
773
+ actions
774
+ caption="Sprint 24 backlog"
775
+ :columns="columns"
776
+ compact
777
+ item-value="id"
778
+ :items="ctx.issues.value"
779
+ legend="Sprint 24 backlog issues"
780
+ :loading="ctx.issuesPending.value"
781
+ loading-text="Loading issues…"
782
+ :row-class="rowClass"
783
+ selectable
784
+ >
785
+ <!-- The ref is the peek handle — the title can't be, it's an input.
786
+ `.plain-link` is the project-owned inline-link helper
787
+ (design-language.md § Guide helper), not a BbButton variant. -->
788
+ <template #ref="{ item, content }">
789
+ <BbBaseButton
790
+ class="plain-link font-semibold"
791
+ @click="() => ctx.peekIssue(item.id)"
792
+ >
793
+ {{ content }}
794
+ </BbBaseButton>
795
+ </template>
796
+
797
+ <!-- Five self-persisting cells, three control kinds, one leaf each. -->
798
+ <template #title="{ item }">
799
+ <EditableTitleCell :issue="item" />
800
+ </template>
801
+
802
+ <template #estimate="{ item }">
803
+ <EstimateCell :issue="item" />
804
+ </template>
805
+
806
+ <template #status="{ item }">
807
+ <StatusCell :issue="item" />
808
+ </template>
809
+
810
+ <template #priority="{ item }">
811
+ <PriorityCell :issue="item" />
812
+ </template>
813
+
814
+ <template #assignee="{ item }">
815
+ <AssigneeCell :issue="item" />
816
+ </template>
817
+
818
+ <template #actions="{ item }">
819
+ <RowActions :issue="item" />
820
+ </template>
821
+
822
+ <template #no-data>
823
+ <div class="flex flex-col items-center gap-2 p-6 text-center">
824
+ <p class="text-sm text-[color:var(--bb-text-muted)]">
825
+ No issues match
826
+ {{
827
+ ctx.hasActiveFilters.value ? 'the current filters' : 'this tab'
828
+ }}.
829
+ </p>
830
+ <BbButton
831
+ v-if="ctx.hasActiveFilters.value"
832
+ variant="ghost"
833
+ @click="ctx.clearFilters"
834
+ >
835
+ Clear filters
836
+ </BbButton>
837
+ </div>
838
+ </template>
839
+ </BbTable>
840
+
841
+ <!-- Joins the table context by id: no page/totalPages wiring at all. -->
842
+ <BbPagination table-id="backlog-table" />
843
+ </div>
844
+
845
+ <SelectionBar />
846
+
847
+ <!-- Peek sidebar: the shell owns close; we render by type. -->
848
+ <template #sidebar>
849
+ <IssuePeek
850
+ v-if="ctx.shell.current.value?.type === 'issue'"
851
+ :issue-id="ctx.shell.current.value.id"
852
+ />
853
+ </template>
854
+
855
+ <!-- Deliberately no #dialogs content: every mutation on this page is
856
+ inline. The grid is the form. -->
857
+ </PageShell>
858
+ </template>
859
+
860
+ <script setup lang="ts">
861
+ import { computed } from 'vue';
862
+ import {
863
+ BbBaseButton,
864
+ BbBreadcrumbs,
865
+ BbButton,
866
+ BbPagination,
867
+ BbTable,
868
+ BbTabs,
869
+ BbTextInput,
870
+ } from 'bitboss-ui';
871
+ import PageShell from '@/components/layout/PageShell.vue';
872
+ import { provideBacklogWorkspace } from './context';
873
+ import AssigneeCell from './AssigneeCell.vue';
874
+ import EditableTitleCell from './EditableTitleCell.vue';
875
+ import EstimateCell from './EstimateCell.vue';
876
+ import FilterRail from './FilterRail.vue';
877
+ import IssuePeek from './IssuePeek.vue';
878
+ import PriorityCell from './PriorityCell.vue';
879
+ import RowActions from './RowActions.vue';
880
+ import SelectionBar from './SelectionBar.vue';
881
+ import StatusCell from './StatusCell.vue';
882
+ import type { Issue } from '@/types';
883
+
884
+ const ctx = provideBacklogWorkspace();
885
+
886
+ // Row highlight tracks the open peek — the peeked row stays marked, and
887
+ // highlighting a row opens its peek; clearing the highlight closes it.
888
+ const highlightedIssue = computed<string | null>({
889
+ get: () =>
890
+ ctx.shell.current.value?.type === 'issue'
891
+ ? ctx.shell.current.value.id
892
+ : null,
893
+ set: (id) => {
894
+ if (id == null) ctx.shell.close();
895
+ else ctx.peekIssue(id);
896
+ },
897
+ });
898
+
899
+ const columns = [
900
+ { key: 'ref', label: 'Ref', width: 90 },
901
+ { key: 'title', label: 'Title' },
902
+ { key: 'estimate', label: 'Est.', width: 90 },
903
+ { key: 'status', label: 'Status', width: 170 },
904
+ { key: 'priority', label: 'Priority', width: 140 },
905
+ { key: 'assignee', label: 'Assignee', width: 200 },
906
+ ];
907
+
908
+ // Blocked rows get a tinted background — public row-class API, no internals.
909
+ // Even the tint reads THROUGH the overlay: unblock an issue and the row
910
+ // clears the moment the pick commits, not when the refetch lands.
911
+ const rowClass = (item: Issue) =>
912
+ ctx.valueOf(item, 'status') === 'blocked'
913
+ ? 'bg-red-50 dark:bg-red-950/20'
914
+ : undefined;
915
+ </script>
916
+ ```
917
+
918
+ ### FilterRail.vue
919
+
920
+ ```vue
921
+ <!-- BacklogWorkspace/FilterRail.vue -->
922
+ <template>
923
+ <div class="flex flex-wrap items-center gap-2">
924
+ <!-- Status: multi-select pill over the same static catalog the cells use.
925
+ `disable-writing` means there's no search field to host an in-popover
926
+ clear, so these tiny fixed-list filters clear from a rail-level chip
927
+ (×) instead — the searchable filter below clears from inside the
928
+ popover. -->
929
+ <div class="inline-flex items-center gap-1">
930
+ <BbSelectPopover
931
+ v-model="ctx.filters.status"
932
+ disable-writing
933
+ item-text="label"
934
+ item-value="value"
935
+ :items="STATUS_OPTIONS"
936
+ multiple
937
+ >
938
+ <template #activator="{ props }">
939
+ <BbButton
940
+ v-bind="props"
941
+ append:icon="lucide:chevron-down"
942
+ size="sm"
943
+ variant="outline"
944
+ >
945
+ Status{{
946
+ ctx.filters.status.length ? ` · ${ctx.filters.status.length}` : ''
947
+ }}
948
+ </BbButton>
949
+ </template>
950
+ </BbSelectPopover>
951
+ <BbButton
952
+ v-if="ctx.filters.status.length"
953
+ aria-label="Clear status filter"
954
+ prepend:icon="lucide:x"
955
+ size="sm"
956
+ variant="ghost"
957
+ @click="ctx.filters.status = []"
958
+ />
959
+ </div>
960
+
961
+ <!-- Priority: same shape, three options. -->
962
+ <div class="inline-flex items-center gap-1">
963
+ <BbSelectPopover
964
+ v-model="ctx.filters.priority"
965
+ disable-writing
966
+ item-text="label"
967
+ item-value="value"
968
+ :items="PRIORITY_OPTIONS"
969
+ multiple
970
+ >
971
+ <template #activator="{ props }">
972
+ <BbButton
973
+ v-bind="props"
974
+ append:icon="lucide:chevron-down"
975
+ size="sm"
976
+ variant="outline"
977
+ >
978
+ Priority{{
979
+ ctx.filters.priority.length
980
+ ? ` · ${ctx.filters.priority.length}`
981
+ : ''
982
+ }}
983
+ </BbButton>
984
+ </template>
985
+ </BbSelectPopover>
986
+ <BbButton
987
+ v-if="ctx.filters.priority.length"
988
+ aria-label="Clear priority filter"
989
+ prepend:icon="lucide:x"
990
+ size="sm"
991
+ variant="ghost"
992
+ @click="ctx.filters.priority = []"
993
+ />
994
+ </div>
995
+
996
+ <!-- Assignee: the SAME shared provider as every assignee cell. The whole
997
+ member is the value, so the pill labels itself from page state with
998
+ zero fetches — no watchEffect-to-resolve-a-name here. Query-aware
999
+ (searchable), so the filter clears from inside the popover search. -->
1000
+ <BbSelectPopover
1001
+ v-model="ctx.filters.assignee"
1002
+ clearable
1003
+ item-text="name"
1004
+ :items="searchMembers"
1005
+ >
1006
+ <template #activator="{ props }">
1007
+ <BbButton
1008
+ v-bind="props"
1009
+ append:icon="lucide:chevron-down"
1010
+ size="sm"
1011
+ variant="outline"
1012
+ >
1013
+ {{ ctx.filters.assignee?.name ?? 'Assignee' }}
1014
+ </BbButton>
1015
+ </template>
1016
+ </BbSelectPopover>
1017
+
1018
+ <!-- Clear-all renders only while something is active. -->
1019
+ <BbButton
1020
+ v-if="ctx.hasActiveFilters.value"
1021
+ class="ml-auto"
1022
+ prepend:icon="lucide:x"
1023
+ size="sm"
1024
+ variant="ghost"
1025
+ @click="ctx.clearFilters"
1026
+ >
1027
+ Clear filters
1028
+ </BbButton>
1029
+ </div>
1030
+ </template>
1031
+
1032
+ <script setup lang="ts">
1033
+ import { BbButton, BbSelectPopover } from 'bitboss-ui';
1034
+ import {
1035
+ PRIORITY_OPTIONS,
1036
+ STATUS_OPTIONS,
1037
+ searchMembers,
1038
+ useBacklogWorkspace,
1039
+ } from './context';
1040
+
1041
+ const ctx = useBacklogWorkspace();
1042
+ </script>
1043
+ ```
1044
+
1045
+ ### EditableTitleCell.vue
1046
+
1047
+ ```vue
1048
+ <!-- BacklogWorkspace/EditableTitleCell.vue -->
1049
+ <template>
1050
+ <!-- Commit on @change (blur/Enter), NEVER v-model: a v-model autosave is
1051
+ one request per keystroke. `:model-value` binds the read-through value
1052
+ down; the user's in-progress typing lives in the DOM until blur commits
1053
+ it. A failed save marks the field until the next commit attempt. -->
1054
+ <BbTextInput
1055
+ compact
1056
+ :has-errors="ctx.failed.value.has(`${issue.id}:title`)"
1057
+ hide-label
1058
+ label="Issue title"
1059
+ :loading="ctx.isSaving(issue, 'title')"
1060
+ :model-value="ctx.valueOf(issue, 'title')"
1061
+ @change="commit"
1062
+ />
1063
+ </template>
1064
+
1065
+ <script setup lang="ts">
1066
+ import { BbTextInput } from 'bitboss-ui';
1067
+ import { useBacklogWorkspace } from './context';
1068
+ import type { Issue } from '@/types';
1069
+
1070
+ const props = defineProps<{ issue: Issue }>();
1071
+
1072
+ const ctx = useBacklogWorkspace();
1073
+
1074
+ // `@change` is the native event; the committed text is on the target.
1075
+ const commit = (event: Event) =>
1076
+ ctx.persistField(
1077
+ props.issue,
1078
+ 'title',
1079
+ (event.target as HTMLInputElement).value
1080
+ );
1081
+ </script>
1082
+ ```
1083
+
1084
+ ### EstimateCell.vue
1085
+
1086
+ ```vue
1087
+ <!-- BacklogWorkspace/EstimateCell.vue -->
1088
+ <template>
1089
+ <BbNumberInput
1090
+ compact
1091
+ :has-errors="ctx.failed.value.has(`${issue.id}:estimate`)"
1092
+ hide-label
1093
+ label="Estimate"
1094
+ :loading="ctx.isSaving(issue, 'estimate')"
1095
+ :min="0"
1096
+ :model-value="ctx.valueOf(issue, 'estimate')"
1097
+ placeholder="—"
1098
+ @change="commit"
1099
+ />
1100
+ </template>
1101
+
1102
+ <script setup lang="ts">
1103
+ import { BbNumberInput } from 'bitboss-ui';
1104
+ import { useBacklogWorkspace } from './context';
1105
+ import type { Issue } from '@/types';
1106
+
1107
+ const props = defineProps<{ issue: Issue }>();
1108
+
1109
+ const ctx = useBacklogWorkspace();
1110
+
1111
+ // A number input's `change` carries the RAW STRING; '' means cleared. A
1112
+ // cleared estimate is a real commit (estimate: null), not a no-op — which is
1113
+ // exactly why the context's valueOf checks `key in patch` instead of `??`.
1114
+ const commit = (event: Event) => {
1115
+ const raw = (event.target as HTMLInputElement).value;
1116
+ ctx.persistField(props.issue, 'estimate', raw === '' ? null : Number(raw));
1117
+ };
1118
+ </script>
1119
+ ```
1120
+
1121
+ ### StatusCell.vue
1122
+
1123
+ ```vue
1124
+ <!-- BacklogWorkspace/StatusCell.vue -->
1125
+ <template>
1126
+ <BbSelectPopover
1127
+ compact
1128
+ disable-writing
1129
+ item-text="label"
1130
+ item-value="value"
1131
+ :items="STATUS_OPTIONS"
1132
+ :model-value="status"
1133
+ width="180px"
1134
+ @update:model-value="
1135
+ (next) => ctx.persistField(issue, 'status', next as IssueStatus)
1136
+ "
1137
+ >
1138
+ <template #activator="{ props: activatorProps, shown }">
1139
+ <!-- The badge IS the trigger: BbBadgeButton turns the badge's own
1140
+ body into the button, so the pill is the hit target and draws its own
1141
+ focus ring — no wrapper element, no chrome class. The internal
1142
+ trailing chevron says "this can change" and sits inside the button
1143
+ with the label; while THIS field's save runs the badge's `loading`
1144
+ swaps the spinner into the chevron's place — same size, nothing
1145
+ shifts. Unlike the one-shot §6.1 cell there is no local `saving` ref:
1146
+ the flag comes from the context overlay, because in an autosave grid
1147
+ the fetch must also know what's in flight. -->
1148
+ <BbBadge
1149
+ append:icon="lucide:chevron-down"
1150
+ :class="{ 'status-cell--open': shown }"
1151
+ :loading="ctx.isSaving(issue, 'status')"
1152
+ :variant="STATUS_VARIANT[status]"
1153
+ >
1154
+ <BbBadgeButton v-bind="activatorProps">{{ label }}</BbBadgeButton>
1155
+ </BbBadge>
1156
+ </template>
1157
+ </BbSelectPopover>
1158
+ </template>
1159
+
1160
+ <script setup lang="ts">
1161
+ import { computed } from 'vue';
1162
+ import { BbBadge, BbBadgeButton, BbSelectPopover } from 'bitboss-ui';
1163
+ import { STATUS_OPTIONS, STATUS_VARIANT, useBacklogWorkspace } from './context';
1164
+ import type { Issue, IssueStatus } from '@/types';
1165
+
1166
+ const props = defineProps<{ issue: Issue }>();
1167
+
1168
+ const ctx = useBacklogWorkspace();
1169
+
1170
+ // Read through the overlay, so the badge moves the instant a pick commits —
1171
+ // color and label both.
1172
+ const status = computed(() => ctx.valueOf(props.issue, 'status'));
1173
+ const label = computed(
1174
+ () =>
1175
+ STATUS_OPTIONS.find((option) => option.value === status.value)?.label ??
1176
+ status.value
1177
+ );
1178
+ </script>
1179
+
1180
+ <style scoped>
1181
+ /* Open = the badge's own hue, deepened, plus its variant ring — derived from
1182
+ the badge's --color/--ring tokens so every status keeps its identity
1183
+ instead of washing out to a neutral. */
1184
+ .status-cell--open {
1185
+ --bg: color-mix(in oklab, var(--color) 24%, var(--bb-panel));
1186
+ --border-color: color-mix(in oklab, var(--color) 45%, var(--bb-panel));
1187
+ box-shadow: 0 0 0 var(--bb-ring-size) var(--ring);
1188
+ }
1189
+ </style>
1190
+ ```
1191
+
1192
+ ### PriorityCell.vue
1193
+
1194
+ ```vue
1195
+ <!-- BacklogWorkspace/PriorityCell.vue -->
1196
+ <template>
1197
+ <!-- Same grammar as StatusCell, its OWN leaf (§6.3): one `EditableCell`
1198
+ with a `type` prop growing a renderer switch is the API-monster seed. The
1199
+ sixty percent that repeats is cheaper than the prop that accumulates. -->
1200
+ <BbSelectPopover
1201
+ compact
1202
+ disable-writing
1203
+ item-text="label"
1204
+ item-value="value"
1205
+ :items="PRIORITY_OPTIONS"
1206
+ :model-value="priority"
1207
+ width="160px"
1208
+ @update:model-value="
1209
+ (next) => ctx.persistField(issue, 'priority', next as IssuePriority)
1210
+ "
1211
+ >
1212
+ <template #activator="{ props: activatorProps, shown }">
1213
+ <BbBadge
1214
+ append:icon="lucide:chevron-down"
1215
+ :class="{ 'priority-cell--open': shown }"
1216
+ :loading="ctx.isSaving(issue, 'priority')"
1217
+ :variant="PRIORITY_VARIANT[priority]"
1218
+ >
1219
+ <BbBadgeButton v-bind="activatorProps">{{ label }}</BbBadgeButton>
1220
+ </BbBadge>
1221
+ </template>
1222
+ </BbSelectPopover>
1223
+ </template>
1224
+
1225
+ <script setup lang="ts">
1226
+ import { computed } from 'vue';
1227
+ import { BbBadge, BbBadgeButton, BbSelectPopover } from 'bitboss-ui';
1228
+ import {
1229
+ PRIORITY_OPTIONS,
1230
+ PRIORITY_VARIANT,
1231
+ useBacklogWorkspace,
1232
+ } from './context';
1233
+ import type { Issue, IssuePriority } from '@/types';
1234
+
1235
+ const props = defineProps<{ issue: Issue }>();
1236
+
1237
+ const ctx = useBacklogWorkspace();
1238
+
1239
+ const priority = computed(() => ctx.valueOf(props.issue, 'priority'));
1240
+ const label = computed(
1241
+ () =>
1242
+ PRIORITY_OPTIONS.find((option) => option.value === priority.value)?.label ??
1243
+ priority.value
1244
+ );
1245
+ </script>
1246
+
1247
+ <style scoped>
1248
+ /* Open = the badge's own hue, deepened, plus its variant ring (see
1249
+ StatusCell). */
1250
+ .priority-cell--open {
1251
+ --bg: color-mix(in oklab, var(--color) 24%, var(--bb-panel));
1252
+ --border-color: color-mix(in oklab, var(--color) 45%, var(--bb-panel));
1253
+ box-shadow: 0 0 0 var(--bb-ring-size) var(--ring);
1254
+ }
1255
+ </style>
1256
+ ```
1257
+
1258
+ ### AssigneeCell.vue
1259
+
1260
+ ```vue
1261
+ <!-- BacklogWorkspace/AssigneeCell.vue -->
1262
+ <template>
1263
+ <!-- Provider-backed people picker. The provider is the ONE shared
1264
+ `searchMembers` — lazy per instance, so a row nobody opens never fetches.
1265
+ The whole member is the value (no item-value), matching how the row
1266
+ stores it. -->
1267
+ <BbSelectPopover
1268
+ compact
1269
+ item-text="name"
1270
+ :items="searchMembers"
1271
+ :model-value="assignee"
1272
+ width="220px"
1273
+ @update:model-value="
1274
+ (next) => ctx.persistField(issue, 'assignee', next as Member)
1275
+ "
1276
+ >
1277
+ <template #activator="{ props: activatorProps, shown }">
1278
+ <!-- Labelled from the ROW (through the overlay), never from the
1279
+ popover's `text`: a lazy provider has no items until first open, so
1280
+ `text` is empty — and the rows nobody opens must still read right on
1281
+ first paint. An assignee is a person, not a semantic status, so the
1282
+ badge stays neutral (`secondary`), no soft accent. -->
1283
+ <BbBadge
1284
+ append:icon="lucide:chevron-down"
1285
+ :class="{ 'assignee-cell--open': shown }"
1286
+ :loading="ctx.isSaving(issue, 'assignee')"
1287
+ variant="secondary"
1288
+ >
1289
+ <BbBadgeButton v-bind="activatorProps">{{
1290
+ assignee.name
1291
+ }}</BbBadgeButton>
1292
+ </BbBadge>
1293
+ </template>
1294
+ </BbSelectPopover>
1295
+ </template>
1296
+
1297
+ <script setup lang="ts">
1298
+ import { computed } from 'vue';
1299
+ import { BbBadge, BbBadgeButton, BbSelectPopover } from 'bitboss-ui';
1300
+ import { searchMembers, useBacklogWorkspace } from './context';
1301
+ import type { Issue, Member } from '@/types';
1302
+
1303
+ const props = defineProps<{ issue: Issue }>();
1304
+
1305
+ const ctx = useBacklogWorkspace();
1306
+
1307
+ const assignee = computed(() => ctx.valueOf(props.issue, 'assignee'));
1308
+ </script>
1309
+
1310
+ <style scoped>
1311
+ /* Open = the badge's own hue, deepened, plus its variant ring (see
1312
+ StatusCell). */
1313
+ .assignee-cell--open {
1314
+ --bg: color-mix(in oklab, var(--color) 24%, var(--bb-panel));
1315
+ --border-color: color-mix(in oklab, var(--color) 45%, var(--bb-panel));
1316
+ box-shadow: 0 0 0 var(--bb-ring-size) var(--ring);
1317
+ }
1318
+ </style>
1319
+ ```
1320
+
1321
+ ### RowActions.vue
1322
+
1323
+ ```vue
1324
+ <!-- BacklogWorkspace/RowActions.vue -->
1325
+ <template>
1326
+ <BbDropdown
1327
+ :items="[
1328
+ {
1329
+ key: 'duplicate',
1330
+ text: 'Duplicate',
1331
+ 'prepend:icon': 'lucide:copy',
1332
+ onClick: () => ctx.duplicateIssue(issue),
1333
+ },
1334
+ {
1335
+ key: 'next-sprint',
1336
+ text: 'Move to next sprint',
1337
+ 'prepend:icon': 'lucide:arrow-right',
1338
+ onClick: () => ctx.moveToNextSprint(issue),
1339
+ },
1340
+ {
1341
+ key: 'delete',
1342
+ text: 'Delete',
1343
+ 'prepend:icon': 'lucide:trash-2',
1344
+ variant: 'destructive',
1345
+ onClick: () => ctx.deleteIssue(issue),
1346
+ },
1347
+ ]"
1348
+ >
1349
+ <template #activator="{ props }">
1350
+ <BbButton v-bind="props" icon="lucide:ellipsis" size="sm" variant="ghost">
1351
+ Issue actions
1352
+ </BbButton>
1353
+ </template>
1354
+ </BbDropdown>
1355
+ </template>
1356
+
1357
+ <script setup lang="ts">
1358
+ import { BbButton, BbDropdown } from 'bitboss-ui';
1359
+ import { useBacklogWorkspace } from './context';
1360
+ import type { Issue } from '@/types';
1361
+
1362
+ defineProps<{ issue: Issue }>();
1363
+
1364
+ const ctx = useBacklogWorkspace();
1365
+ </script>
1366
+ ```
1367
+
1368
+ ### SelectionBar.vue
1369
+
1370
+ ```vue
1371
+ <!-- BacklogWorkspace/SelectionBar.vue -->
1372
+ <template>
1373
+ <FloatingBottomPanel :open="selectedCount > 0">
1374
+ <span class="px-2 text-sm">{{ selectedCount }} selected</span>
1375
+
1376
+ <!-- Bulk pickers are DISPATCHERS, not fields: model stays null, every
1377
+ pick fires the bulk action and the popover closes. The bar holds no
1378
+ state of its own. `placement="top"` because the bar hugs the viewport
1379
+ bottom — open upward instead of flipping — with an 8px `offset` so the
1380
+ menu clears the bar. -->
1381
+ <BbSelectPopover
1382
+ disable-writing
1383
+ item-text="label"
1384
+ item-value="value"
1385
+ :items="STATUS_OPTIONS"
1386
+ :model-value="null"
1387
+ :offset="8"
1388
+ placement="top"
1389
+ width="180px"
1390
+ @update:model-value="(next) => ctx.bulkStatus(next as IssueStatus)"
1391
+ >
1392
+ <template #activator="{ props }">
1393
+ <BbButton
1394
+ v-bind="props"
1395
+ append:icon="lucide:chevron-up"
1396
+ size="sm"
1397
+ variant="ghost"
1398
+ >
1399
+ Set status
1400
+ </BbButton>
1401
+ </template>
1402
+ </BbSelectPopover>
1403
+
1404
+ <BbSelectPopover
1405
+ item-text="name"
1406
+ :items="searchMembers"
1407
+ :model-value="null"
1408
+ :offset="8"
1409
+ placement="top"
1410
+ width="220px"
1411
+ @update:model-value="(next) => ctx.bulkAssign(next as Member)"
1412
+ >
1413
+ <template #activator="{ props }">
1414
+ <BbButton
1415
+ v-bind="props"
1416
+ append:icon="lucide:chevron-up"
1417
+ size="sm"
1418
+ variant="ghost"
1419
+ >
1420
+ Assign
1421
+ </BbButton>
1422
+ </template>
1423
+ </BbSelectPopover>
1424
+
1425
+ <BbButton
1426
+ prepend:icon="lucide:arrow-right"
1427
+ size="sm"
1428
+ variant="ghost"
1429
+ @click="ctx.bulkMoveToNextSprint"
1430
+ >
1431
+ Next sprint
1432
+ </BbButton>
1433
+
1434
+ <div class="floating-bottom-panel__right flex items-center gap-1">
1435
+ <BbButton
1436
+ aria-label="Clear selection"
1437
+ icon="lucide:x"
1438
+ size="sm"
1439
+ variant="ghost"
1440
+ @click="clearSelection"
1441
+ />
1442
+ </div>
1443
+ </FloatingBottomPanel>
1444
+ </template>
1445
+
1446
+ <script setup lang="ts">
1447
+ import { computed } from 'vue';
1448
+ import { BbButton, BbSelectPopover } from 'bitboss-ui';
1449
+ import FloatingBottomPanel from '@/components/layout/FloatingBottomPanel.vue';
1450
+ import { STATUS_OPTIONS, searchMembers, useBacklogWorkspace } from './context';
1451
+ import type { IssueStatus, Member } from '@/types';
1452
+
1453
+ const ctx = useBacklogWorkspace();
1454
+
1455
+ const selectedCount = computed(() => ctx.table.selected.value?.length ?? 0);
1456
+ const clearSelection = () => {
1457
+ ctx.table.selected.value = [];
1458
+ };
1459
+ </script>
1460
+ ```
1461
+
1462
+ ### IssuePeek.vue
1463
+
1464
+ ```vue
1465
+ <!-- BacklogWorkspace/IssuePeek.vue -->
1466
+ <template>
1467
+ <div v-if="issue" class="flex flex-col gap-4 text-sm">
1468
+ <!-- Identity header. -->
1469
+ <header class="flex flex-col gap-1">
1470
+ <p class="text-xs font-medium text-[color:var(--bb-text-muted)]">
1471
+ {{ issue.ref }}
1472
+ </p>
1473
+ <h2 class="text-base font-semibold">{{ issue.title }}</h2>
1474
+ </header>
1475
+
1476
+ <!-- Properties: the SAME editable cells as the grid — one leaf, two
1477
+ call sites. Change the status here and the grid's badge (and even the
1478
+ blocked-row tint) moves in the same tick, because both surfaces read
1479
+ the same overlay; the spinner shows in both places at once. -->
1480
+ <dl class="grid grid-cols-[auto_1fr] items-center gap-x-4 gap-y-2">
1481
+ <dt class="text-[color:var(--bb-text-muted)]">Status</dt>
1482
+ <dd><StatusCell :issue="issue" /></dd>
1483
+ <dt class="text-[color:var(--bb-text-muted)]">Priority</dt>
1484
+ <dd><PriorityCell :issue="issue" /></dd>
1485
+ <dt class="text-[color:var(--bb-text-muted)]">Assignee</dt>
1486
+ <dd><AssigneeCell :issue="issue" /></dd>
1487
+ <dt class="text-[color:var(--bb-text-muted)]">Estimate</dt>
1488
+ <dd>
1489
+ {{
1490
+ ctx.valueOf(issue, 'estimate') === null
1491
+ ? 'Unestimated'
1492
+ : `${ctx.valueOf(issue, 'estimate')} points`
1493
+ }}
1494
+ </dd>
1495
+ <dt class="text-[color:var(--bb-text-muted)]">Sprint</dt>
1496
+ <dd>{{ issue.sprint }}</dd>
1497
+ </dl>
1498
+
1499
+ <!-- Description. -->
1500
+ <section class="flex flex-col gap-1.5">
1501
+ <h3
1502
+ class="text-xs font-semibold uppercase tracking-wide text-[color:var(--bb-text-muted)]"
1503
+ >
1504
+ Description
1505
+ </h3>
1506
+ <p class="whitespace-pre-line text-[color:var(--bb-text-muted)]">
1507
+ {{ issue.description }}
1508
+ </p>
1509
+ </section>
1510
+
1511
+ <!-- Activity feed. -->
1512
+ <section class="flex flex-col gap-1.5">
1513
+ <h3
1514
+ class="text-xs font-semibold uppercase tracking-wide text-[color:var(--bb-text-muted)]"
1515
+ >
1516
+ Activity
1517
+ </h3>
1518
+ <ul class="flex flex-col gap-2">
1519
+ <li v-for="entry in issue.activity" :key="entry.id" class="flex gap-2">
1520
+ <BbIcon
1521
+ class="mt-0.5 shrink-0 text-[color:var(--bb-text-muted)]"
1522
+ :icon="entry.icon"
1523
+ size="14"
1524
+ />
1525
+ <div class="flex flex-col">
1526
+ <span>{{ entry.text }}</span>
1527
+ <span class="text-xs text-[color:var(--bb-text-muted)]"
1528
+ >{{ entry.actor }} · {{ longDate(entry.at) }}</span
1529
+ >
1530
+ </div>
1531
+ </li>
1532
+ </ul>
1533
+ </section>
1534
+
1535
+ <!-- Peek is a workbench: act here, or leave for the full page. -->
1536
+ <footer class="mt-2 flex items-center gap-2 border-t pt-3">
1537
+ <BbButton
1538
+ prepend:icon="lucide:arrow-right"
1539
+ size="sm"
1540
+ variant="secondary"
1541
+ @click="() => ctx.moveToNextSprint(issue!)"
1542
+ >
1543
+ Next sprint
1544
+ </BbButton>
1545
+ <BbButton
1546
+ size="sm"
1547
+ variant="destructive"
1548
+ @click="() => ctx.deleteIssue(issue!)"
1549
+ >
1550
+ Delete
1551
+ </BbButton>
1552
+ <BbButton
1553
+ append:icon="lucide:arrow-up-right"
1554
+ size="sm"
1555
+ :to="`/issues/${issue.id}`"
1556
+ variant="ghost"
1557
+ >
1558
+ Open full page
1559
+ </BbButton>
1560
+ </footer>
1561
+ </div>
1562
+
1563
+ <div v-else class="flex justify-center p-8">
1564
+ <BbSpinner />
1565
+ </div>
1566
+ </template>
1567
+
1568
+ <script setup lang="ts">
1569
+ import { ref, watchEffect } from 'vue';
1570
+ import { BbButton, BbIcon, BbSpinner } from 'bitboss-ui';
1571
+ import AssigneeCell from './AssigneeCell.vue';
1572
+ import PriorityCell from './PriorityCell.vue';
1573
+ import StatusCell from './StatusCell.vue';
1574
+ import { useBacklogWorkspace } from './context';
1575
+ import type { IssueDetail } from '@/types';
1576
+
1577
+ const props = defineProps<{ issueId: string }>();
1578
+
1579
+ const ctx = useBacklogWorkspace();
1580
+
1581
+ // Re-fetches whenever the stack shows a different issue; reading `ctx.issues`
1582
+ // makes every commit (from the grid OR from this panel) — each of which ends
1583
+ // in the list's `refresh()` — reflect here immediately. The cells inside
1584
+ // don't flash across that reload either — they read the overlay, and the
1585
+ // overlay only retires when the fresh data confirms it.
1586
+ const issue = ref<IssueDetail | null>(null);
1587
+ watchEffect(async () => {
1588
+ void ctx.issues.value;
1589
+ issue.value = await $fetch<IssueDetail>(`/api/issues/${props.issueId}`);
1590
+ });
1591
+
1592
+ const longDate = (value: string) =>
1593
+ new Date(value).toLocaleDateString('en-US', {
1594
+ month: 'short',
1595
+ day: 'numeric',
1596
+ year: 'numeric',
1597
+ });
1598
+ </script>
1599
+ ```
1600
+
1601
+ ## Why it is built this way
1602
+
1603
+ - **`pending` sits on rung 3, and the recipe's whole shape follows from
1604
+ that.** Three consumers force it up the ladder: the cells read it to render
1605
+ optimistically, the peek reads it so the second call site of every cell
1606
+ agrees with the first, and the `useAsyncData` transform reads it to retire
1607
+ confirmed fields. Contrast the records workspace's §6.1 status cell, where
1608
+ `saving` is a rung-1 local `ref` around one awaited action — correct
1609
+ **there** because nothing but that one cell ever cares. Here the fetch must
1610
+ know what's in flight, so a local flag physically cannot work; that is why
1611
+ the picker cells bind `:loading="ctx.isSaving(issue, 'status')"` instead of
1612
+ owning a `saving` ref.
1613
+ - **`persistField` is one complete action for every control kind.** Text,
1614
+ number, and three pickers all commit through the same guard → optimistic
1615
+ set → PATCH → refetch pipeline, so the failure story (drop one field,
1616
+ destructive toast) and the no-op story (blur without change costs nothing)
1617
+ are written once. The guard compares against `valueOf`, not the raw row —
1618
+ what the user _sees_ is the value they are re-committing.
1619
+ - **Retirement lives in the fetch's `transform` because that is when the
1620
+ truth changes.** A resolved PATCH proves the server accepted the value, not
1621
+ that the table shows it — the rows in memory are still old until the
1622
+ refetch lands. Retiring per-field (only values the response confirms) means
1623
+ a slow title save survives a fast status save's reload untouched. The
1624
+ comment on the `transform` ships with the recipe on purpose: this is the
1625
+ §6.8 bug everyone writes once.
1626
+ - **The URL is the filter store, `useAsyncData` is the fetch.** Filters and
1627
+ tab are seeded from `route.query` once at setup, mirrored back with
1628
+ `navigateTo` on every change (debounced for free text), and
1629
+ `useAsyncData('issues', …, { watch: [() => route.query, table.page] })` is
1630
+ the single refetch trigger — there is exactly one place data loads, which
1631
+ is also the only place the overlay retires. The assignee pill is the one
1632
+ URL nuance: rows store the whole member, but a deep link carries only an
1633
+ id, so the context resolves it to a member once at setup.
1634
+ - **`valueOf` checks `key in patch`, not `??`.** A cleared estimate commits
1635
+ `null`, and `null ?? row.estimate` would silently un-render the overlay
1636
+ while the save runs. The one-line comment in the context is load-bearing.
1637
+ - **No dirty ring anywhere, no success toasts for cell commits.** Autosave
1638
+ has no "changed but unsaved" state, so the ring (the draft-map pattern's
1639
+ grammar) would lie; and a page where every blur saves would toast
1640
+ constantly. The spinner in the chevron's place is the feedback; failure is
1641
+ the exception worth announcing (destructive toast + `has-errors` on the
1642
+ text/number cells via the `failed` set; badge cells announce by visibly
1643
+ snapping back). Discrete actions — duplicate, move, delete, bulk — _do_
1644
+ toast success: they are events, not keystrokes.
1645
+ - **Five cells, five leaves.** `EditableTitleCell`, `EstimateCell`,
1646
+ `StatusCell`, `PriorityCell`, `AssigneeCell` — never one `EditableCell`
1647
+ with a `type` prop growing a renderer switch (§6.3/§4). Each takes exactly
1648
+ one data prop (`issue`) and gets its behavior from the context.
1649
+ - **Typed inputs commit on `@change`; pickers commit on pick.** The text and
1650
+ number cells bind `:model-value` down and read the committed value from the
1651
+ native event (`event.target`); the number cell's change carries the raw
1652
+ string where `''` means cleared. No debounce machinery — blur/Enter and
1653
+ pick are natural commit points, so the request count equals the commit
1654
+ count.
1655
+ - **Options resolve once.** Status and priority are module-level catalogs
1656
+ shared by the cells, the rail pills and the bulk picker — zero requests.
1657
+ The assignee is genuinely query-driven, so it gets the one exception: a
1658
+ **single** shared provider (`searchMembers`), lazy per instance, keeping
1659
+ unopened rows free; prefill calls return the whole six-person team so the
1660
+ current selection always resolves. Rows store the whole member, so every
1661
+ badge and the filter pill label themselves from data they already hold —
1662
+ no `watchEffect`-to-resolve-a-name anywhere on this page; the only
1663
+ directory lookup is the one-time deep-link resolution of `?assignee=` at
1664
+ setup.
1665
+ - **Internal links use `to`, not `href`.** `to` renders a real Vue Router
1666
+ link (client-side navigation); a raw `href` would force a full page reload.
1667
+ The `New issue` primary and the peek's `Open full page` link use `to`; the
1668
+ tabs keep `href` (`?tab=…`) because their client-side pushState is what
1669
+ keeps `route.query.tab` in sync — the URL-filter grammar itself.
1670
+ - **The ref cell is the peek handle** because the title — the "name" of an
1671
+ issue — is an input here, and a click that sometimes edits and sometimes
1672
+ navigates is a broken affordance. One record type also collapses the stack
1673
+ grammar to a single verb (`peekIssue`, fresh stack).
1674
+ - **The peek reuses the grid's cells verbatim** — one leaf, two call sites.
1675
+ Both read the same overlay, so a status change made in the panel updates
1676
+ the grid row (badge, tint, spinner) in the same tick, and vice versa.
1677
+ - **Sizing:** topbar follows `md`-first (`compact` inputs at 28px flush
1678
+ beside the default buttons); `sm` appears exactly where the doctrine
1679
+ allows — rail pills, row actions, the bulk bar, the peek footer. Cell
1680
+ inputs are `compact`.
1681
+ - **One `variant="primary"`** (New issue). The only irreversible action
1682
+ (delete — row menu and peek footer) rides `useConfirm`; moving between
1683
+ sprints is reversible, so it deliberately does not.
1684
+
1685
+ ## Variations
1686
+
1687
+ - **Keyboard triage**: add `keyboard-navigation` to the table —
1688
+ `v-model:highlighted` already drives the peek — the approvals-inbox recipe
1689
+ is the full treatment; the overlay needs no changes, since it never cared
1690
+ how a commit was triggered.
1691
+ - **Review-before-save domains**: if the product wants a batch the user
1692
+ confirms (accounting lines, permissions), swap the overlay for the
1693
+ draft-map pattern — dirty ring, dirty-gated Save — per the
1694
+ [Inline Edit Playbook](../../guides/inline-edit-playbook.md); the
1695
+ record-form recipe's line-item editor assembles it. Never mix both
1696
+ grammars on one table.
1697
+ - **Undo instead of confirm**: for softer destructive-ish moves (Done →
1698
+ reopened), a success toast with an Undo action that PATCHes the old value
1699
+ back is more Linear than a confirm dialog.
1700
+ - **Live board**: because refetches retire the overlay per confirmed field,
1701
+ a polling `refresh()` call (or a websocket-triggered one) is safe — a
1702
+ poll landing mid-save cannot destroy an in-flight edit, which is exactly
1703
+ the property the write-back anti-pattern lacks.