bitboss-ui 3.0.0-beta.5 → 3.0.0-beta.50
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.
- package/README.md +388 -99
- package/bin/bitboss-ui-mcp.mjs +2684 -124
- package/bin/bitboss-ui.mjs +1034 -80
- package/dist/ai/BbAccordion.md +202 -58
- package/dist/ai/BbAlert.md +150 -32
- package/dist/ai/BbAsterisk.md +65 -4
- package/dist/ai/BbAvatar.md +202 -56
- package/dist/ai/BbBadge.md +256 -50
- package/dist/ai/BbBadgeButton.md +77 -21
- package/dist/ai/BbBaseButton.md +132 -51
- package/dist/ai/BbBaseCheckboxIcon.md +118 -26
- package/dist/ai/BbBaseRadioIcon.md +115 -26
- package/dist/ai/BbBaseSwitchIcon.md +123 -28
- package/dist/ai/BbBreadcrumbs.md +280 -104
- package/dist/ai/BbButton.md +445 -111
- package/dist/ai/BbCalendar.md +686 -0
- package/dist/ai/BbCheckbox.md +258 -82
- package/dist/ai/BbCheckboxGroup.md +597 -83
- package/dist/ai/BbCollapsible.md +158 -39
- package/dist/ai/BbColorInput.md +327 -82
- package/dist/ai/BbColorPalette.md +273 -67
- package/dist/ai/BbConfirm.md +228 -51
- package/dist/ai/BbConfirmPortal.md +2 -2
- package/dist/ai/BbDatePicker.md +275 -40
- package/dist/ai/BbDatePickerInput.md +357 -111
- package/dist/ai/BbDialog.md +510 -108
- package/dist/ai/BbDropdown.md +1335 -206
- package/dist/ai/BbDropdownButton.md +290 -107
- package/dist/ai/BbDropdownGroup.md +6 -6
- package/dist/ai/BbDropzone.md +380 -72
- package/dist/ai/BbForm.md +1261 -46
- package/dist/ai/BbHoverCard.md +527 -0
- package/dist/ai/BbHoverCardPortal.md +29 -0
- package/dist/ai/BbIcon.md +125 -40
- package/dist/ai/BbIndicator.md +79 -12
- package/dist/ai/BbNumberInput.md +345 -100
- package/dist/ai/BbOffCanvas.md +403 -96
- package/dist/ai/BbPagination.md +204 -34
- package/dist/ai/BbPopover.md +360 -64
- package/dist/ai/BbPopoverPortal.md +29 -0
- package/dist/ai/BbProgress.md +182 -90
- package/dist/ai/BbPtScope.md +136 -0
- package/dist/ai/BbRadio.md +242 -43
- package/dist/ai/BbRadioGroup.md +550 -111
- package/dist/ai/BbRating.md +256 -62
- package/dist/ai/BbSelect.md +1121 -289
- package/dist/ai/BbSelectPopover.md +676 -192
- package/dist/ai/BbSlider.md +285 -80
- package/dist/ai/BbSmoothHeight.md +144 -37
- package/dist/ai/BbSpinner.md +179 -81
- package/dist/ai/BbSwitch.md +276 -63
- package/dist/ai/BbSwitchGroup.md +421 -87
- package/dist/ai/BbTable.md +1941 -296
- package/dist/ai/BbTabs.md +992 -231
- package/dist/ai/BbTabsList.md +81 -7
- package/dist/ai/BbTabsPanels.md +77 -0
- package/dist/ai/BbTabsRoot.md +18 -16
- package/dist/ai/BbTag.md +271 -80
- package/dist/ai/BbTextInput.md +535 -105
- package/dist/ai/BbTextarea.md +414 -138
- package/dist/ai/BbTimePicker.md +166 -27
- package/dist/ai/BbTimePickerInput.md +290 -49
- package/dist/ai/BbToast.md +287 -40
- package/dist/ai/BbToastPortal.md +3 -3
- package/dist/ai/BbTooltip.md +231 -46
- package/dist/ai/BbTree.md +272 -94
- package/dist/ai/ChipsBox.md +46 -2
- package/dist/ai/ClearableButton.md +12 -0
- package/dist/ai/CommaBox.md +2 -1
- package/dist/ai/CommonField.md +75 -0
- package/dist/ai/CommonFieldInput.md +91 -0
- package/dist/ai/CommonPopover.md +17 -12
- package/dist/ai/CommonTimeSelector.md +63 -0
- package/dist/ai/ErrorIcon.md +20 -0
- package/dist/ai/FlatListBox.md +42 -11
- package/dist/ai/GroupedListBox.md +43 -12
- package/dist/ai/ListBox.md +47 -11
- package/dist/ai/OptionsContainer.md +17 -10
- package/dist/ai/WarningIcon.md +20 -0
- package/dist/ai/changelog.json +5750 -141
- package/dist/ai/components.json +475 -16272
- package/dist/ai/composables/useBbConfig.md +72 -11
- package/dist/ai/composables/useBbDropdownContext.md +168 -0
- package/dist/ai/composables/useBbFormContext.md +51 -24
- package/dist/ai/composables/useBbFormField.md +149 -0
- package/dist/ai/composables/useBbTableContext.md +41 -19
- package/dist/ai/composables/useBbTabsContext.md +14 -14
- package/dist/ai/composables/useConfirm.md +16 -8
- package/dist/ai/composables/useCountdown.md +1 -1
- package/dist/ai/composables/useId.md +10 -10
- package/dist/ai/composables/useMobile.md +17 -10
- package/dist/ai/composables/useToast.md +25 -19
- package/dist/ai/design-tokens.json +967 -0
- package/dist/ai/design-tokens.manifest.yaml +175 -0
- package/dist/ai/guides/agent-contract.md +182 -23
- package/dist/ai/guides/ai-router.md +87 -43
- package/dist/ai/guides/app-layout.md +8 -4
- package/dist/ai/guides/coherence-playbook.md +25 -21
- package/dist/ai/guides/component-picker.md +60 -46
- package/dist/ai/guides/design-language.md +280 -99
- package/dist/ai/guides/design-tokens.md +600 -117
- package/dist/ai/guides/fetch-items-playbook.md +127 -81
- package/dist/ai/guides/icons-policy.md +75 -45
- package/dist/ai/guides/inertia-helpers.md +201 -82
- package/dist/ai/guides/inline-edit-playbook.md +13 -6
- package/dist/ai/guides/installation-and-plugin-setup.md +912 -91
- package/dist/ai/guides/migration/components/bb-accordion.md +37 -0
- package/dist/ai/guides/migration/components/bb-alert.md +2 -2
- package/dist/ai/guides/migration/components/bb-avatar.md +13 -14
- package/dist/ai/guides/migration/components/bb-badge.md +5 -5
- package/dist/ai/guides/migration/components/bb-breadcrumbs.md +13 -10
- package/dist/ai/guides/migration/components/bb-button.md +80 -20
- package/dist/ai/guides/migration/components/bb-checkbox-group.md +116 -29
- package/dist/ai/guides/migration/components/bb-checkbox.md +53 -10
- package/dist/ai/guides/migration/components/bb-chip.md +6 -6
- package/dist/ai/guides/migration/components/bb-collapsible.md +5 -5
- package/dist/ai/guides/migration/components/bb-color-input.md +5 -5
- package/dist/ai/guides/migration/components/bb-color-palette.md +16 -9
- package/dist/ai/guides/migration/components/bb-date-picker-input.md +51 -38
- package/dist/ai/guides/migration/components/bb-dialog.md +69 -36
- package/dist/ai/guides/migration/components/bb-dropdown-button.md +15 -8
- package/dist/ai/guides/migration/components/bb-dropdown.md +33 -9
- package/dist/ai/guides/migration/components/bb-dropzone.md +8 -0
- package/dist/ai/guides/migration/components/bb-icon.md +7 -7
- package/dist/ai/guides/migration/components/bb-intersection.md +1 -1
- package/dist/ai/guides/migration/components/bb-offcanvas.md +29 -31
- package/dist/ai/guides/migration/components/bb-pagination.md +10 -0
- package/dist/ai/guides/migration/components/bb-popover.md +19 -11
- package/dist/ai/guides/migration/components/bb-radio-group.md +15 -0
- package/dist/ai/guides/migration/components/bb-rating.md +61 -24
- package/dist/ai/guides/migration/components/bb-select-popover.md +20 -2
- package/dist/ai/guides/migration/components/bb-select.md +39 -8
- package/dist/ai/guides/migration/components/bb-slider.md +19 -6
- package/dist/ai/guides/migration/components/bb-switch-group.md +15 -0
- package/dist/ai/guides/migration/components/bb-table.md +586 -33
- package/dist/ai/guides/migration/components/bb-tabs.md +94 -43
- package/dist/ai/guides/migration/components/bb-tag.md +9 -7
- package/dist/ai/guides/migration/components/bb-text-input.md +12 -12
- package/dist/ai/guides/migration/components/bb-toast.md +2 -2
- package/dist/ai/guides/migration/components/bb-tooltip.md +19 -1
- package/dist/ai/guides/migration/components/bb-tree.md +11 -9
- package/dist/ai/guides/migration/components/use-confirm.md +9 -1
- package/dist/ai/guides/migration/v2-to-v3.md +1203 -277
- package/dist/ai/guides/migration/v3-beta-css-classes.md +753 -0
- package/dist/ai/guides/migration/v3-beta-tooling.md +208 -0
- package/dist/ai/guides/options-items-playbook.md +177 -22
- package/dist/ai/guides/page-shell.md +13 -7
- package/dist/ai/guides/passthrough.md +968 -0
- package/dist/ai/guides/preset-components.md +387 -0
- package/dist/ai/guides/ssr-prefill.md +150 -0
- package/dist/ai/guides/typescript-generic-components.md +87 -0
- package/dist/ai/guides/validated-forms.md +460 -55
- package/dist/ai/guides/validation-libraries.md +174 -0
- package/dist/ai/guides/validation-providers.md +127 -0
- package/dist/ai/helpers/inertia/manifest.json +636 -0
- package/dist/ai/helpers/inertia/types.ts +15 -0
- package/dist/ai/helpers/inertia/useAsyncFn.ts +110 -0
- package/dist/ai/helpers/inertia/useConfirmOnRouteLeave.ts +102 -0
- package/dist/ai/helpers/inertia/useDeleteCmd.ts +30 -0
- package/dist/ai/helpers/inertia/useHasChanged.ts +36 -0
- package/dist/ai/helpers/inertia/useIndexById.ts +23 -0
- package/dist/ai/helpers/inertia/useLazyProp.ts +148 -0
- package/dist/ai/helpers/inertia/useLazyPropGetter.ts +50 -0
- package/dist/ai/helpers/inertia/useLoading.ts +20 -0
- package/dist/ai/helpers/inertia/usePaginatedResponseContext.ts +88 -0
- package/dist/ai/helpers/inertia/usePromiseForm.ts +62 -0
- package/dist/ai/helpers/inertia/useProp.ts +63 -0
- package/dist/ai/helpers/inertia/useQuery.ts +19 -0
- package/dist/ai/helpers/inertia/useQueryObject.ts +116 -0
- package/dist/ai/helpers/inertia/useResourceContext.ts +69 -0
- package/dist/ai/helpers/inertia/useRouteQuery.ts +54 -0
- package/dist/ai/helpers/inertia/useScreenSizes.ts +23 -0
- package/dist/ai/helpers/inertia/useTableContext.ts +34 -0
- package/dist/ai/helpers/inertia/useTableSelectionContext.ts +48 -0
- package/dist/ai/helpers/inertia/useUntil.ts +33 -0
- package/dist/ai/helpers/inertia/utils.ts +24 -0
- package/dist/ai/index.md +61 -57
- package/dist/ai/manifest/components/BbAccordion.json +42 -0
- package/dist/ai/manifest/components/BbAccordion.tree.json +26 -0
- package/dist/ai/manifest/components/BbAlert.json +56 -0
- package/dist/ai/manifest/components/BbAlert.tree.json +80 -0
- package/dist/ai/manifest/components/BbAsterisk.json +26 -0
- package/dist/ai/manifest/components/BbAsterisk.tree.json +13 -0
- package/dist/ai/manifest/components/BbAvatar.json +38 -0
- package/dist/ai/manifest/components/BbAvatar.tree.json +39 -0
- package/dist/ai/manifest/components/BbBadge.json +50 -0
- package/dist/ai/manifest/components/BbBadge.tree.json +86 -0
- package/dist/ai/manifest/components/BbBadgeButton.json +67 -0
- package/dist/ai/manifest/components/BbBadgeButton.tree.json +32 -0
- package/dist/ai/manifest/components/BbBaseButton.json +69 -0
- package/dist/ai/manifest/components/BbBaseButton.tree.json +25 -0
- package/dist/ai/manifest/components/BbBaseCheckboxIcon.json +46 -0
- package/dist/ai/manifest/components/BbBaseCheckboxIcon.tree.json +41 -0
- package/dist/ai/manifest/components/BbBaseRadioIcon.json +44 -0
- package/dist/ai/manifest/components/BbBaseRadioIcon.tree.json +36 -0
- package/dist/ai/manifest/components/BbBaseSwitchIcon.json +46 -0
- package/dist/ai/manifest/components/BbBaseSwitchIcon.tree.json +44 -0
- package/dist/ai/manifest/components/BbBreadcrumbs.json +56 -0
- package/dist/ai/manifest/components/BbBreadcrumbs.tree.json +45 -0
- package/dist/ai/manifest/components/BbButton.json +102 -0
- package/dist/ai/manifest/components/BbButton.tree.json +206 -0
- package/dist/ai/manifest/components/BbCalendar.json +86 -0
- package/dist/ai/manifest/components/BbCalendar.tree.json +99 -0
- package/dist/ai/manifest/components/BbCheckbox.json +99 -0
- package/dist/ai/manifest/components/BbCheckbox.tree.json +22 -0
- package/dist/ai/manifest/components/BbCheckboxGroup.json +133 -0
- package/dist/ai/manifest/components/BbCheckboxGroup.tree.json +61 -0
- package/dist/ai/manifest/components/BbCollapsible.json +32 -0
- package/dist/ai/manifest/components/BbCollapsible.tree.json +17 -0
- package/dist/ai/manifest/components/BbColorInput.json +133 -0
- package/dist/ai/manifest/components/BbColorInput.tree.json +37 -0
- package/dist/ai/manifest/components/BbColorPalette.json +73 -0
- package/dist/ai/manifest/components/BbColorPalette.tree.json +55 -0
- package/dist/ai/manifest/components/BbConfirm.json +34 -0
- package/dist/ai/manifest/components/BbConfirm.tree.json +30 -0
- package/dist/ai/manifest/components/BbConfirmPortal.json +21 -0
- package/dist/ai/manifest/components/BbDatePicker.json +108 -0
- package/dist/ai/manifest/components/BbDatePicker.tree.json +54 -0
- package/dist/ai/manifest/components/BbDatePickerInput.json +167 -0
- package/dist/ai/manifest/components/BbDatePickerInput.tree.json +50 -0
- package/dist/ai/manifest/components/BbDialog.json +76 -0
- package/dist/ai/manifest/components/BbDialog.tree.json +74 -0
- package/dist/ai/manifest/components/BbDropdown.json +102 -0
- package/dist/ai/manifest/components/BbDropdown.tree.json +122 -0
- package/dist/ai/manifest/components/BbDropdownButton.json +107 -0
- package/dist/ai/manifest/components/BbDropdownButton.tree.json +28 -0
- package/dist/ai/manifest/components/BbDropdownGroup.json +25 -0
- package/dist/ai/manifest/components/BbDropzone.json +68 -0
- package/dist/ai/manifest/components/BbDropzone.tree.json +36 -0
- package/dist/ai/manifest/components/BbForm.json +42 -0
- package/dist/ai/manifest/components/BbHoverCard.json +63 -0
- package/dist/ai/manifest/components/BbHoverCard.tree.json +31 -0
- package/dist/ai/manifest/components/BbHoverCardPortal.json +21 -0
- package/dist/ai/manifest/components/BbIcon.json +33 -0
- package/dist/ai/manifest/components/BbIcon.tree.json +19 -0
- package/dist/ai/manifest/components/BbIndicator.json +39 -0
- package/dist/ai/manifest/components/BbIndicator.tree.json +67 -0
- package/dist/ai/manifest/components/BbNumberInput.json +128 -0
- package/dist/ai/manifest/components/BbNumberInput.tree.json +28 -0
- package/dist/ai/manifest/components/BbOffCanvas.json +72 -0
- package/dist/ai/manifest/components/BbOffCanvas.tree.json +115 -0
- package/dist/ai/manifest/components/BbPagination.json +61 -0
- package/dist/ai/manifest/components/BbPagination.tree.json +69 -0
- package/dist/ai/manifest/components/BbPopover.json +82 -0
- package/dist/ai/manifest/components/BbPopover.tree.json +36 -0
- package/dist/ai/manifest/components/BbPopoverPortal.json +21 -0
- package/dist/ai/manifest/components/BbProgress.json +31 -0
- package/dist/ai/manifest/components/BbProgress.tree.json +26 -0
- package/dist/ai/manifest/components/BbPtScope.json +21 -0
- package/dist/ai/manifest/components/BbRadio.json +88 -0
- package/dist/ai/manifest/components/BbRadio.tree.json +22 -0
- package/dist/ai/manifest/components/BbRadioGroup.json +132 -0
- package/dist/ai/manifest/components/BbRadioGroup.tree.json +61 -0
- package/dist/ai/manifest/components/BbRating.json +100 -0
- package/dist/ai/manifest/components/BbRating.tree.json +55 -0
- package/dist/ai/manifest/components/BbSelect.json +174 -0
- package/dist/ai/manifest/components/BbSelect.tree.json +53 -0
- package/dist/ai/manifest/components/BbSelectPopover.json +124 -0
- package/dist/ai/manifest/components/BbSelectPopover.tree.json +112 -0
- package/dist/ai/manifest/components/BbSlider.json +109 -0
- package/dist/ai/manifest/components/BbSlider.tree.json +89 -0
- package/dist/ai/manifest/components/BbSmoothHeight.json +31 -0
- package/dist/ai/manifest/components/BbSmoothHeight.tree.json +16 -0
- package/dist/ai/manifest/components/BbSpinner.json +31 -0
- package/dist/ai/manifest/components/BbSpinner.tree.json +31 -0
- package/dist/ai/manifest/components/BbSwitch.json +99 -0
- package/dist/ai/manifest/components/BbSwitch.tree.json +22 -0
- package/dist/ai/manifest/components/BbSwitchGroup.json +133 -0
- package/dist/ai/manifest/components/BbSwitchGroup.tree.json +61 -0
- package/dist/ai/manifest/components/BbTable.json +163 -0
- package/dist/ai/manifest/components/BbTable.tree.json +214 -0
- package/dist/ai/manifest/components/BbTabs.json +86 -0
- package/dist/ai/manifest/components/BbTabs.tree.json +88 -0
- package/dist/ai/manifest/components/BbTabsList.json +48 -0
- package/dist/ai/manifest/components/BbTabsList.tree.json +94 -0
- package/dist/ai/manifest/components/BbTabsPanels.json +32 -0
- package/dist/ai/manifest/components/BbTabsPanels.tree.json +69 -0
- package/dist/ai/manifest/components/BbTabsRoot.json +63 -0
- package/dist/ai/manifest/components/BbTag.json +130 -0
- package/dist/ai/manifest/components/BbTag.tree.json +40 -0
- package/dist/ai/manifest/components/BbTextInput.json +129 -0
- package/dist/ai/manifest/components/BbTextInput.tree.json +27 -0
- package/dist/ai/manifest/components/BbTextarea.json +124 -0
- package/dist/ai/manifest/components/BbTextarea.tree.json +37 -0
- package/dist/ai/manifest/components/BbTimePicker.json +76 -0
- package/dist/ai/manifest/components/BbTimePicker.tree.json +37 -0
- package/dist/ai/manifest/components/BbTimePickerInput.json +133 -0
- package/dist/ai/manifest/components/BbTimePickerInput.tree.json +44 -0
- package/dist/ai/manifest/components/BbToast.json +43 -0
- package/dist/ai/manifest/components/BbToast.tree.json +91 -0
- package/dist/ai/manifest/components/BbToastPortal.json +18 -0
- package/dist/ai/manifest/components/BbTooltip.json +60 -0
- package/dist/ai/manifest/components/BbTooltip.tree.json +41 -0
- package/dist/ai/manifest/components/BbTree.json +51 -0
- package/dist/ai/manifest/components/BbTree.tree.json +31 -0
- package/dist/ai/manifest/components/ChipsBox.json +32 -0
- package/dist/ai/manifest/components/ChipsBox.tree.json +11 -0
- package/dist/ai/manifest/components/ClearableButton.json +19 -0
- package/dist/ai/manifest/components/ClearableButton.tree.json +19 -0
- package/dist/ai/manifest/components/CommaBox.json +30 -0
- package/dist/ai/manifest/components/CommonField.json +56 -0
- package/dist/ai/manifest/components/CommonField.tree.json +110 -0
- package/dist/ai/manifest/components/CommonFieldInput.json +47 -0
- package/dist/ai/manifest/components/CommonFieldInput.tree.json +95 -0
- package/dist/ai/manifest/components/CommonPopover.json +44 -0
- package/dist/ai/manifest/components/CommonPopover.tree.json +26 -0
- package/dist/ai/manifest/components/CommonTimeSelector.json +31 -0
- package/dist/ai/manifest/components/CommonTimeSelector.tree.json +43 -0
- package/dist/ai/manifest/components/ErrorIcon.json +17 -0
- package/dist/ai/manifest/components/ErrorIcon.tree.json +22 -0
- package/dist/ai/manifest/components/FlatListBox.json +43 -0
- package/dist/ai/manifest/components/FlatListBox.tree.json +16 -0
- package/dist/ai/manifest/components/GroupedListBox.json +45 -0
- package/dist/ai/manifest/components/GroupedListBox.tree.json +16 -0
- package/dist/ai/manifest/components/GuidesComponent.json +17 -0
- package/dist/ai/manifest/components/ListBox.json +43 -0
- package/dist/ai/manifest/components/ListBox.tree.json +9 -0
- package/dist/ai/manifest/components/OptionsContainer.json +45 -0
- package/dist/ai/manifest/components/WarningIcon.json +17 -0
- package/dist/ai/manifest/components/WarningIcon.tree.json +22 -0
- package/dist/ai/manifest/index.json +121 -0
- package/dist/ai/manifest/meta.json +456 -0
- package/dist/ai/manifest/types.advanced.json +66 -0
- package/dist/ai/manifest/types.api.json +52 -0
- package/dist/ai/manifest/types.wrapper.json +119 -0
- package/dist/ai/recipes/inertia/approvals-inbox.md +206 -139
- package/dist/ai/recipes/inertia/inline-edit-workspace.md +218 -143
- package/dist/ai/recipes/inertia/layout-scaffold.md +93 -58
- package/dist/ai/recipes/inertia/onboarding.md +114 -87
- package/dist/ai/recipes/inertia/ownership-atlas.md +322 -322
- package/dist/ai/recipes/inertia/record-form.md +407 -218
- package/dist/ai/recipes/inertia/records-workspace.md +600 -219
- package/dist/ai/recipes/inertia/settings-workspace.md +3098 -0
- package/dist/ai/recipes/inertia/upload-center.md +189 -177
- package/dist/ai/recipes/inertia/wizard-form.md +233 -100
- package/dist/ai/recipes/nuxt/approvals-inbox.md +272 -158
- package/dist/ai/recipes/nuxt/inline-edit-workspace.md +298 -166
- package/dist/ai/recipes/nuxt/layout-scaffold.md +94 -59
- package/dist/ai/recipes/nuxt/onboarding.md +178 -117
- package/dist/ai/recipes/nuxt/ownership-atlas.md +1406 -0
- package/dist/ai/recipes/nuxt/record-form.md +506 -223
- package/dist/ai/recipes/nuxt/records-workspace.md +653 -206
- package/dist/ai/recipes/nuxt/settings-workspace.md +3189 -0
- package/dist/ai/recipes/nuxt/upload-center.md +282 -190
- package/dist/ai/recipes/nuxt/wizard-form.md +251 -102
- package/dist/ai/recipes/vue/approvals-inbox.md +248 -146
- package/dist/ai/recipes/vue/inline-edit-workspace.md +278 -157
- package/dist/ai/recipes/vue/layout-scaffold.md +93 -58
- package/dist/ai/recipes/vue/onboarding.md +112 -83
- package/dist/ai/recipes/vue/ownership-atlas.md +1360 -0
- package/dist/ai/recipes/vue/record-form.md +251 -130
- package/dist/ai/recipes/vue/records-workspace.md +609 -191
- package/dist/ai/recipes/vue/settings-workspace.md +3130 -0
- package/dist/ai/recipes/vue/upload-center.md +229 -176
- package/dist/ai/recipes/vue/wizard-form.md +190 -85
- package/dist/ai/source/BbAccordion.md +130 -32
- package/dist/ai/source/BbAlert.md +211 -64
- package/dist/ai/source/BbAsterisk.md +54 -4
- package/dist/ai/source/BbAvatar.md +73 -16
- package/dist/ai/source/BbBadge.md +305 -99
- package/dist/ai/source/BbBadgeButton.md +259 -81
- package/dist/ai/source/BbBaseButton.md +109 -13
- package/dist/ai/source/BbBaseCheckboxIcon.md +153 -36
- package/dist/ai/source/BbBaseRadioIcon.md +124 -18
- package/dist/ai/source/BbBaseSwitchIcon.md +146 -33
- package/dist/ai/source/BbBreadcrumbs.md +437 -95
- package/dist/ai/source/BbButton.md +695 -188
- package/dist/ai/source/BbCalendar.md +1884 -0
- package/dist/ai/source/BbCheckbox.md +509 -68
- package/dist/ai/source/BbCheckboxGroup.md +1132 -98
- package/dist/ai/source/BbCollapsible.md +99 -10
- package/dist/ai/source/BbColorInput.md +645 -68
- package/dist/ai/source/BbColorPalette.md +1337 -70
- package/dist/ai/source/BbConfirm.md +167 -8
- package/dist/ai/source/BbConfirmPortal.md +109 -9
- package/dist/ai/source/BbDatePicker.md +532 -383
- package/dist/ai/source/BbDatePickerInput.md +2166 -123
- package/dist/ai/source/BbDialog.md +557 -70
- package/dist/ai/source/BbDropdown.md +1320 -331
- package/dist/ai/source/BbDropdownButton.md +438 -93
- package/dist/ai/source/BbDropdownGroup.md +1023 -203
- package/dist/ai/source/BbDropzone.md +219 -38
- package/dist/ai/source/BbForm.md +1006 -18
- package/dist/ai/source/BbHoverCard.md +975 -0
- package/dist/ai/source/BbHoverCardPortal.md +314 -0
- package/dist/ai/source/BbIcon.md +139 -53
- package/dist/ai/source/BbIndicator.md +121 -60
- package/dist/ai/source/BbNumberInput.md +1571 -91
- package/dist/ai/source/BbOffCanvas.md +1057 -274
- package/dist/ai/source/BbPagination.md +231 -35
- package/dist/ai/source/BbPopover.md +491 -115
- package/dist/ai/source/BbPopoverPortal.md +387 -0
- package/dist/ai/source/BbProgress.md +156 -30
- package/dist/ai/source/BbPtScope.md +54 -0
- package/dist/ai/source/BbRadio.md +407 -58
- package/dist/ai/source/BbRadioGroup.md +1078 -112
- package/dist/ai/source/BbRating.md +775 -86
- package/dist/ai/source/BbSelect.md +1187 -104
- package/dist/ai/source/BbSelectPopover.md +1209 -205
- package/dist/ai/source/BbSlider.md +1422 -103
- package/dist/ai/source/BbSmoothHeight.md +59 -4
- package/dist/ai/source/BbSpinner.md +62 -6
- package/dist/ai/source/BbSwitch.md +322 -60
- package/dist/ai/source/BbSwitchGroup.md +834 -84
- package/dist/ai/source/BbTable.md +7684 -1945
- package/dist/ai/source/BbTabs.md +409 -124
- package/dist/ai/source/BbTabsList.md +538 -159
- package/dist/ai/source/BbTabsPanels.md +647 -0
- package/dist/ai/source/BbTabsRoot.md +360 -113
- package/dist/ai/source/BbTag.md +866 -89
- package/dist/ai/source/BbTextInput.md +615 -73
- package/dist/ai/source/BbTextarea.md +631 -70
- package/dist/ai/source/BbTimePicker.md +396 -70
- package/dist/ai/source/BbTimePickerInput.md +1353 -107
- package/dist/ai/source/BbToast.md +259 -80
- package/dist/ai/source/BbToastPortal.md +219 -72
- package/dist/ai/source/BbTooltip.md +303 -42
- package/dist/ai/source/BbTree.md +109 -14
- package/dist/ai/source/ChipsBox.md +25 -5
- package/dist/ai/source/CommaBox.md +21 -6
- package/dist/ai/source/CommonField.md +1707 -0
- package/dist/ai/source/CommonFieldInput.md +880 -0
- package/dist/ai/source/CommonPopover.md +141 -34
- package/dist/ai/source/CommonTimeSelector.md +744 -0
- package/dist/ai/source/ErrorIcon.md +2 -2
- package/dist/ai/source/FlatListBox.md +218 -18
- package/dist/ai/source/GroupedListBox.md +266 -45
- package/dist/ai/source/GuidesComponent.md +14 -7
- package/dist/ai/source/ListBox.md +57 -8
- package/dist/ai/source/OptionsContainer.md +346 -61
- package/dist/ai/source/WarningIcon.md +2 -2
- package/dist/assets/css/reset.css_inline.js +1 -1
- package/dist/assets/svgs/star.svg_raw.js +4 -0
- package/dist/components/BbAccordion/BbAccordion.vue_vue_type_script_setup_true_lang.js +59 -38
- package/dist/components/BbAccordion/types.d.ts +43 -3
- package/dist/components/BbAccordion/types.js +11 -0
- package/dist/components/BbAlert/BbAlert.vue.d.ts +1 -3
- package/dist/components/BbAlert/BbAlert.vue_vue_type_script_setup_true_lang.js +46 -30
- package/dist/components/BbAlert/types.d.ts +37 -3
- package/dist/components/BbAlert/types.js +13 -0
- package/dist/components/BbAsterisk/BbAsterisk.vue.d.ts +3 -1
- package/dist/components/BbAsterisk/BbAsterisk.vue_vue_type_script_setup_true_lang.js +23 -8
- package/dist/components/BbAsterisk/types.d.ts +18 -0
- package/dist/components/BbAsterisk/types.js +7 -0
- package/dist/components/BbAvatar/BbAvatar.vue.d.ts +2 -4
- package/dist/components/BbAvatar/BbAvatar.vue_vue_type_script_setup_true_lang.js +57 -44
- package/dist/components/BbAvatar/types.d.ts +23 -0
- package/dist/components/BbAvatar/types.js +7 -0
- package/dist/components/BbBadge/BadgeBodyContent.vue_vue_type_script_setup_true_lang.js +24 -18
- package/dist/components/BbBadge/BbBadge.vue_vue_type_script_setup_true_lang.js +96 -53
- package/dist/components/BbBadge/BbBadgeButton.vue_vue_type_script_setup_true_lang.js +32 -11
- package/dist/components/BbBadge/badgeButtonContext.d.ts +25 -8
- package/dist/components/BbBadge/types.d.ts +46 -3
- package/dist/components/BbBadge/types.js +13 -0
- package/dist/components/BbBaseButton/BbBaseButton.vue_vue_type_script_setup_true_lang.js +109 -96
- package/dist/components/BbBaseButton/RouterComponent.vue_vue_type_script_setup_true_lang.js +11 -11
- package/dist/components/BbBaseButton/types.d.ts +33 -3
- package/dist/components/BbBaseButton/types.js +9 -2
- package/dist/components/BbBaseCheckboxIcon/BbBaseCheckboxIcon.vue_vue_type_script_setup_true_lang.js +50 -18
- package/dist/components/BbBaseCheckboxIcon/types.d.ts +31 -2
- package/dist/components/BbBaseCheckboxIcon/types.js +8 -0
- package/dist/components/BbBaseRadioIcon/BbBaseRadioIcon.vue_vue_type_script_setup_true_lang.js +45 -15
- package/dist/components/BbBaseRadioIcon/types.d.ts +31 -2
- package/dist/components/BbBaseRadioIcon/types.js +8 -0
- package/dist/components/BbBaseSwitchIcon/BbBaseSwitchIcon.vue_vue_type_script_setup_true_lang.js +48 -16
- package/dist/components/BbBaseSwitchIcon/types.d.ts +31 -2
- package/dist/components/BbBaseSwitchIcon/types.js +8 -0
- package/dist/components/BbBreadcrumbs/BbBreadcrumbs.vue_vue_type_script_setup_true_lang.js +197 -140
- package/dist/components/BbBreadcrumbs/types.d.ts +62 -12
- package/dist/components/BbBreadcrumbs/types.js +12 -0
- package/dist/components/BbButton/BbButton.vue.d.ts +5 -0
- package/dist/components/BbButton/BbButton.vue_vue_type_script_setup_true_lang.js +145 -101
- package/dist/components/BbButton/toggleRoving.d.ts +6 -0
- package/dist/components/BbButton/toggleRoving.js +45 -0
- package/dist/components/BbButton/types.d.ts +122 -3
- package/dist/components/BbButton/types.js +16 -0
- package/dist/components/BbCalendar/BbCalendar.vue.d.ts +33 -0
- package/dist/components/BbCalendar/BbCalendar.vue.js +6 -0
- package/dist/components/BbCalendar/BbCalendar.vue_vue_type_script_setup_true_lang.js +614 -0
- package/dist/components/BbCalendar/CalendarMonthPanel.vue.js +5 -0
- package/dist/components/BbCalendar/CalendarMonthPanel.vue_vue_type_script_setup_true_lang.js +124 -0
- package/dist/components/BbCalendar/CalendarYearPanel.vue.js +5 -0
- package/dist/components/BbCalendar/CalendarYearPanel.vue_vue_type_script_setup_true_lang.js +129 -0
- package/dist/components/BbCalendar/calendarHost.d.ts +29 -0
- package/dist/components/BbCalendar/calendarHost.js +10 -0
- package/dist/components/BbCalendar/types.d.ts +231 -0
- package/dist/components/BbCalendar/types.js +29 -0
- package/dist/components/{BbBaseDatePicker/useDatePickerContext.d.ts → BbCalendar/useCalendarContext.d.ts} +10 -7
- package/dist/components/BbCalendar/useCalendarContext.js +11 -0
- package/dist/components/BbCalendar/useCalendarGrid.d.ts +211 -0
- package/dist/components/BbCalendar/useCalendarGrid.js +282 -0
- package/dist/components/BbCalendar/useDayGrid.d.ts +82 -0
- package/dist/components/BbCalendar/useDayGrid.js +246 -0
- package/dist/components/BbCalendar/useDayjsLocale.d.ts +64 -0
- package/dist/components/BbCalendar/useDayjsLocale.js +35 -0
- package/dist/components/BbCalendar/useToday.d.ts +23 -0
- package/dist/components/BbCalendar/useToday.js +21 -0
- package/dist/components/BbCheckbox/BbCheckbox.vue.d.ts +7 -7
- package/dist/components/BbCheckbox/BbCheckbox.vue_vue_type_script_setup_true_lang.js +224 -72
- package/dist/components/BbCheckbox/types.d.ts +192 -13
- package/dist/components/BbCheckbox/types.js +8 -0
- package/dist/components/BbCheckboxGroup/BbCheckboxGroup.vue.d.ts +15 -3
- package/dist/components/BbCheckboxGroup/BbCheckboxGroup.vue_vue_type_script_setup_true_lang.js +350 -106
- package/dist/components/BbCheckboxGroup/types.d.ts +256 -23
- package/dist/components/BbCheckboxGroup/types.js +10 -0
- package/dist/components/BbCollapsible/BbCollapsible.vue.d.ts +2 -1
- package/dist/components/BbCollapsible/BbCollapsible.vue_vue_type_script_setup_true_lang.js +41 -19
- package/dist/components/BbCollapsible/types.d.ts +46 -2
- package/dist/components/BbCollapsible/types.js +7 -0
- package/dist/components/BbColorInput/BbColorInput.vue.d.ts +17 -7
- package/dist/components/BbColorInput/BbColorInput.vue_vue_type_script_setup_true_lang.js +339 -87
- package/dist/components/BbColorInput/types.d.ts +242 -12
- package/dist/components/BbColorInput/types.js +24 -0
- package/dist/components/BbColorPalette/BbColorPalette.vue.d.ts +10 -2
- package/dist/components/BbColorPalette/BbColorPalette.vue_vue_type_script_setup_true_lang.js +530 -108
- package/dist/components/BbColorPalette/types.d.ts +88 -11
- package/dist/components/BbColorPalette/types.js +12 -0
- package/dist/components/BbConfirm/BbConfirm.vue.d.ts +2 -1
- package/dist/components/BbConfirm/BbConfirm.vue_vue_type_script_setup_true_lang.js +125 -76
- package/dist/components/BbConfirm/BbConfirmPortal.vue.d.ts +3 -5
- package/dist/components/BbConfirm/types.d.ts +64 -0
- package/dist/components/BbConfirm/types.js +17 -0
- package/dist/components/BbDatePicker/BbDatePicker.vue.d.ts +15 -10
- package/dist/components/BbDatePicker/BbDatePicker.vue_vue_type_script_setup_true_lang.js +324 -224
- package/dist/components/BbDatePicker/types.d.ts +114 -18
- package/dist/components/BbDatePicker/types.js +33 -0
- package/dist/components/BbDatePickerInput/BbDatePickerInput.vue.d.ts +16 -4
- package/dist/components/BbDatePickerInput/BbDatePickerInput.vue_vue_type_script_setup_true_lang.js +1225 -88
- package/dist/components/BbDatePickerInput/dateFieldLayout.d.ts +23 -0
- package/dist/components/BbDatePickerInput/dateFieldLayout.js +38 -0
- package/dist/components/BbDatePickerInput/types.d.ts +241 -21
- package/dist/components/BbDatePickerInput/types.js +39 -0
- package/dist/components/BbDialog/BbDialog.vue.d.ts +3 -3
- package/dist/components/BbDialog/BbDialog.vue_vue_type_script_setup_true_lang.js +230 -133
- package/dist/components/BbDialog/types.d.ts +98 -4
- package/dist/components/BbDialog/types.js +16 -0
- package/dist/components/BbDialog/useDialogStack.d.ts +12 -0
- package/dist/components/BbDialog/useDialogStack.js +9 -2
- package/dist/components/BbDropdown/AdaptiveDropdown.vue.d.ts +2 -0
- package/dist/components/BbDropdown/AdaptiveDropdown.vue_vue_type_script_setup_true_lang.js +132 -107
- package/dist/components/BbDropdown/BbDropdown.vue.d.ts +10 -2
- package/dist/components/BbDropdown/BbDropdown.vue_vue_type_script_setup_true_lang.js +448 -328
- package/dist/components/BbDropdown/BbDropdownGroup.vue.d.ts +16 -5
- package/dist/components/BbDropdown/BbDropdownGroup.vue_vue_type_script_setup_true_lang.js +48 -19
- package/dist/components/BbDropdown/BbDropdownList.vue.d.ts +8 -2
- package/dist/components/BbDropdown/BbDropdownList.vue_vue_type_script_setup_true_lang.js +396 -340
- package/dist/components/BbDropdown/DropdownPipelineResolver.vue_vue_type_script_setup_true_lang.js +152 -122
- package/dist/components/BbDropdown/DropdownRow.vue.d.ts +40 -0
- package/dist/components/BbDropdown/DropdownRow.vue.js +5 -0
- package/dist/components/BbDropdown/DropdownRow.vue_vue_type_script_setup_true_lang.js +60 -0
- package/dist/components/BbDropdown/normalizeGroups.d.ts +8 -2
- package/dist/components/BbDropdown/normalizeGroups.js +70 -32
- package/dist/components/BbDropdown/types.d.ts +437 -102
- package/dist/components/BbDropdown/types.js +21 -2
- package/dist/components/BbDropdown/useDropdownContext.d.ts +12 -4
- package/dist/components/BbDropdown/useDropdownGroupRegistry.d.ts +62 -0
- package/dist/components/BbDropdownButton/BbDropdownButton.vue.d.ts +18 -3
- package/dist/components/BbDropdownButton/BbDropdownButton.vue_vue_type_script_setup_true_lang.js +193 -43
- package/dist/components/BbDropdownButton/types.d.ts +139 -10
- package/dist/components/BbDropdownButton/types.js +35 -0
- package/dist/components/BbDropzone/BbDropzone.vue.d.ts +2 -2
- package/dist/components/BbDropzone/BbDropzone.vue_vue_type_script_setup_true_lang.js +211 -143
- package/dist/components/BbDropzone/types.d.ts +54 -5
- package/dist/components/BbDropzone/types.js +17 -0
- package/dist/components/BbForm/BbForm.vue.d.ts +121 -0
- package/dist/{validated → components/BbForm}/BbForm.vue.js +1 -1
- package/dist/components/BbForm/BbForm.vue_vue_type_script_setup_true_lang.js +360 -0
- package/dist/components/BbForm/BbFormCustomField.d.ts +14 -0
- package/dist/components/BbForm/BbFormCustomField.js +49 -0
- package/dist/components/BbForm/bindFormField.d.ts +43 -0
- package/dist/components/BbForm/bindFormField.js +88 -0
- package/dist/components/BbForm/formFields.d.ts +77 -0
- package/dist/components/BbForm/formFields.js +11 -0
- package/dist/components/BbForm/formSchema.d.ts +56 -0
- package/dist/components/BbForm/formSchema.js +196 -0
- package/dist/components/BbForm/standardSchema.d.ts +59 -0
- package/dist/components/BbHoverCard/BbHoverCard.vue.d.ts +43 -0
- package/dist/components/{BbBaseRadio/BbBaseRadio.vue.js → BbHoverCard/BbHoverCard.vue.js} +2 -2
- package/dist/components/BbHoverCard/BbHoverCard.vue_vue_type_script_setup_true_lang.js +300 -0
- package/dist/components/BbHoverCard/BbHoverCardPortal.vue.d.ts +23 -0
- package/dist/components/BbHoverCard/BbHoverCardPortal.vue.js +5 -0
- package/dist/components/BbHoverCard/BbHoverCardPortal.vue_vue_type_script_setup_true_lang.js +13 -0
- package/dist/components/BbHoverCard/hoverCardFocus.d.ts +29 -0
- package/dist/components/BbHoverCard/hoverCardFocus.js +29 -0
- package/dist/components/BbHoverCard/types.d.ts +188 -0
- package/dist/components/BbHoverCard/types.js +13 -0
- package/dist/components/BbIcon/BbIcon.vue.d.ts +1 -3
- package/dist/components/BbIcon/BbIcon.vue_vue_type_script_setup_true_lang.js +59 -48
- package/dist/components/BbIcon/iconCache.d.ts +63 -0
- package/dist/components/BbIcon/iconCache.js +35 -0
- package/dist/components/BbIcon/types.d.ts +22 -2
- package/dist/components/BbIcon/types.js +7 -0
- package/dist/components/BbIndicator/BbIndicator.vue_vue_type_script_setup_true_lang.js +34 -21
- package/dist/components/BbIndicator/types.d.ts +24 -0
- package/dist/components/BbIndicator/types.js +7 -0
- package/dist/components/BbNumberInput/BbNumberInput.vue.d.ts +11 -8
- package/dist/components/BbNumberInput/BbNumberInput.vue_vue_type_script_setup_true_lang.js +667 -87
- package/dist/components/BbNumberInput/numberDisplay.d.ts +256 -0
- package/dist/components/BbNumberInput/numberDisplay.js +499 -0
- package/dist/components/BbNumberInput/types.d.ts +268 -19
- package/dist/components/BbNumberInput/types.js +8 -0
- package/dist/components/BbNumberInput/warroom/corpus.d.ts +58 -0
- package/dist/components/BbNumberInput/warroom/currency-verify.rows.d.ts +28 -0
- package/dist/components/BbNumberInput/warroom/currency.rows.d.ts +2 -0
- package/dist/components/BbNumberInput/warroom/harness.d.ts +217 -0
- package/dist/components/BbNumberInput/warroom/oracle.d.ts +150 -0
- package/dist/components/BbOffCanvas/BbOffCanvas.vue.d.ts +4 -6
- package/dist/components/BbOffCanvas/BbOffCanvas.vue_vue_type_script_setup_true_lang.js +311 -204
- package/dist/components/BbOffCanvas/hostCloseLabel.d.ts +3 -0
- package/dist/components/BbOffCanvas/hostCloseLabel.js +8 -0
- package/dist/components/BbOffCanvas/types.d.ts +85 -7
- package/dist/components/BbOffCanvas/types.js +15 -0
- package/dist/components/BbPagination/BbPagination.vue.d.ts +2 -2
- package/dist/components/BbPagination/BbPagination.vue_vue_type_script_setup_true_lang.js +146 -110
- package/dist/components/BbPagination/types.d.ts +38 -0
- package/dist/components/BbPagination/types.js +13 -0
- package/dist/components/BbPopover/BbPopover.vue.d.ts +5 -4
- package/dist/components/BbPopover/BbPopover.vue_vue_type_script_setup_true_lang.js +285 -193
- package/dist/components/BbPopover/BbPopoverPortal.vue.d.ts +23 -0
- package/dist/components/BbPopover/BbPopoverPortal.vue.js +5 -0
- package/dist/components/BbPopover/BbPopoverPortal.vue_vue_type_script_setup_true_lang.js +13 -0
- package/dist/components/BbPopover/types.d.ts +77 -6
- package/dist/components/BbPopover/types.js +14 -0
- package/dist/components/BbProgress/BbProgress.vue_vue_type_script_setup_true_lang.js +38 -17
- package/dist/components/BbProgress/types.d.ts +41 -0
- package/dist/components/BbProgress/types.js +7 -0
- package/dist/components/BbPtScope/BbPtScope.vue.d.ts +12 -0
- package/dist/components/BbPtScope/BbPtScope.vue.js +5 -0
- package/dist/components/BbPtScope/BbPtScope.vue_vue_type_script_setup_true_lang.js +13 -0
- package/dist/components/BbPtScope/types.d.ts +15 -0
- package/dist/components/BbRadio/BbRadio.vue.d.ts +7 -7
- package/dist/components/BbRadio/BbRadio.vue_vue_type_script_setup_true_lang.js +178 -59
- package/dist/components/BbRadio/types.d.ts +164 -13
- package/dist/components/BbRadio/types.js +8 -0
- package/dist/components/BbRadioGroup/BbRadioGroup.vue.d.ts +14 -2
- package/dist/components/BbRadioGroup/BbRadioGroup.vue_vue_type_script_setup_true_lang.js +333 -108
- package/dist/components/BbRadioGroup/types.d.ts +258 -25
- package/dist/components/BbRadioGroup/types.js +10 -0
- package/dist/components/BbRating/BbRating.vue.d.ts +10 -8
- package/dist/components/BbRating/BbRating.vue_vue_type_script_setup_true_lang.js +269 -78
- package/dist/components/BbRating/types.d.ts +188 -13
- package/dist/components/BbRating/types.js +21 -0
- package/dist/components/BbSelect/BbSelect.vue.d.ts +17 -3
- package/dist/components/BbSelect/BbSelect.vue_vue_type_script_setup_true_lang.js +565 -108
- package/dist/components/BbSelect/types.d.ts +302 -23
- package/dist/components/BbSelect/types.js +41 -0
- package/dist/components/BbSelectPopover/BbSelectPopover.vue.d.ts +15 -1
- package/dist/components/BbSelectPopover/BbSelectPopover.vue_vue_type_script_setup_true_lang.js +587 -362
- package/dist/components/BbSelectPopover/sheetChipAttrs.d.ts +18 -0
- package/dist/components/BbSelectPopover/sheetChipAttrs.js +5 -0
- package/dist/components/BbSelectPopover/types.d.ts +177 -15
- package/dist/components/BbSelectPopover/types.js +24 -0
- package/dist/components/BbSlider/BbSlider.vue.d.ts +13 -8
- package/dist/components/BbSlider/BbSlider.vue_vue_type_script_setup_true_lang.js +477 -97
- package/dist/components/BbSlider/types.d.ts +214 -17
- package/dist/components/BbSlider/types.js +26 -0
- package/dist/components/BbSmoothHeight/BbSmoothHeight.vue.d.ts +1 -1
- package/dist/components/BbSmoothHeight/BbSmoothHeight.vue_vue_type_script_setup_true_lang.js +60 -48
- package/dist/components/BbSmoothHeight/types.d.ts +19 -0
- package/dist/components/BbSmoothHeight/types.js +7 -0
- package/dist/components/BbSpinner/BbSpinner.vue.d.ts +1 -3
- package/dist/components/BbSpinner/BbSpinner.vue_vue_type_script_setup_true_lang.js +27 -14
- package/dist/components/BbSpinner/types.d.ts +22 -1
- package/dist/components/BbSpinner/types.js +7 -0
- package/dist/components/BbSwitch/BbSwitch.vue.d.ts +7 -7
- package/dist/components/BbSwitch/BbSwitch.vue_vue_type_script_setup_true_lang.js +230 -78
- package/dist/components/BbSwitch/types.d.ts +25 -10
- package/dist/components/BbSwitch/types.js +5 -0
- package/dist/components/BbSwitchGroup/BbSwitchGroup.vue.d.ts +14 -2
- package/dist/components/BbSwitchGroup/BbSwitchGroup.vue_vue_type_script_setup_true_lang.js +350 -106
- package/dist/components/BbSwitchGroup/types.d.ts +36 -8
- package/dist/components/BbSwitchGroup/types.js +5 -0
- package/dist/components/BbTable/BbTable.vue.d.ts +31 -50
- package/dist/components/BbTable/BbTable.vue_vue_type_script_setup_true_lang.js +2217 -685
- package/dist/components/BbTable/BbTableDataRow.d.ts +198 -0
- package/dist/components/BbTable/BbTableDataRow.js +151 -0
- package/dist/components/BbTable/BbTableEdgeRow.d.ts +110 -0
- package/dist/components/BbTable/BbTableEdgeRow.js +65 -0
- package/dist/components/BbTable/BbTableExpandRow.d.ts +84 -0
- package/dist/components/BbTable/BbTableExpandRow.js +62 -0
- package/dist/components/BbTable/BbTableSelectToggle.d.ts +128 -0
- package/dist/components/BbTable/BbTableSelectToggle.js +131 -0
- package/dist/components/BbTable/gridWidgets.d.ts +30 -0
- package/dist/components/BbTable/gridWidgets.js +14 -0
- package/dist/components/BbTable/types.d.ts +571 -151
- package/dist/components/BbTable/types.js +33 -0
- package/dist/components/BbTable/utils.d.ts +145 -4
- package/dist/components/BbTable/utils.js +161 -37
- package/dist/components/BbTabs/BbTabs.vue.d.ts +3 -1
- package/dist/components/BbTabs/BbTabs.vue_vue_type_script_setup_true_lang.js +66 -26
- package/dist/components/BbTabs/BbTabsList.vue.d.ts +3 -10
- package/dist/components/BbTabs/BbTabsList.vue_vue_type_script_setup_true_lang.js +143 -81
- package/dist/components/BbTabs/BbTabsPanels.vue.d.ts +12 -0
- package/dist/components/{BbBaseSwitch/BbBaseSwitch.vue.js → BbTabs/BbTabsPanels.vue.js} +2 -2
- package/dist/components/BbTabs/BbTabsPanels.vue_vue_type_script_setup_true_lang.js +59 -0
- package/dist/components/BbTabs/BbTabsRoot.vue.d.ts +3 -1
- package/dist/components/BbTabs/BbTabsRoot.vue_vue_type_script_setup_true_lang.js +6 -1
- package/dist/components/BbTabs/types.d.ts +221 -39
- package/dist/components/BbTabs/types.js +34 -0
- package/dist/components/BbTag/BbTag.vue.d.ts +13 -10
- package/dist/components/BbTag/BbTag.vue_vue_type_script_setup_true_lang.js +404 -93
- package/dist/components/BbTag/types.d.ts +153 -15
- package/dist/components/BbTag/types.js +22 -0
- package/dist/components/BbTextInput/BbTextInput.vue.d.ts +31 -37
- package/dist/components/BbTextInput/BbTextInput.vue_vue_type_script_setup_true_lang.js +312 -107
- package/dist/components/BbTextInput/types.d.ts +204 -14
- package/dist/components/BbTextInput/types.js +12 -0
- package/dist/components/BbTextarea/BbTextarea.vue.d.ts +31 -37
- package/dist/components/BbTextarea/BbTextarea.vue_vue_type_script_setup_true_lang.js +342 -114
- package/dist/components/BbTextarea/types.d.ts +194 -15
- package/dist/components/BbTextarea/types.js +12 -0
- package/dist/components/BbTimePicker/BbTimePicker.vue.d.ts +12 -4
- package/dist/components/BbTimePicker/BbTimePicker.vue_vue_type_script_setup_true_lang.js +199 -122
- package/dist/components/BbTimePicker/types.d.ts +94 -7
- package/dist/components/BbTimePicker/types.js +18 -0
- package/dist/components/BbTimePickerInput/BbTimePickerInput.vue.d.ts +14 -4
- package/dist/components/BbTimePickerInput/BbTimePickerInput.vue_vue_type_script_setup_true_lang.js +779 -86
- package/dist/components/BbTimePickerInput/types.d.ts +183 -22
- package/dist/components/BbTimePickerInput/types.js +25 -0
- package/dist/components/BbToast/BbToast.vue_vue_type_script_setup_true_lang.js +63 -25
- package/dist/components/BbToast/BbToastMessage.vue.d.ts +4 -1
- package/dist/components/BbToast/BbToastMessage.vue_vue_type_script_setup_true_lang.js +79 -76
- package/dist/components/BbToast/BbToastPortal.vue.d.ts +1 -0
- package/dist/components/BbToast/BbToastRegion.vue.d.ts +4 -1
- package/dist/components/BbToast/BbToastRegion.vue_vue_type_script_setup_true_lang.js +72 -64
- package/dist/components/BbToast/types.d.ts +54 -1
- package/dist/components/BbToast/types.js +28 -0
- package/dist/components/BbTooltip/BbTooltip.vue_vue_type_script_setup_true_lang.js +127 -92
- package/dist/components/BbTooltip/tooltipWarmup.d.ts +23 -0
- package/dist/components/BbTooltip/tooltipWarmup.js +7 -0
- package/dist/components/BbTooltip/types.d.ts +50 -5
- package/dist/components/BbTooltip/types.js +7 -0
- package/dist/components/BbTree/BbTree.vue.d.ts +15 -3
- package/dist/components/BbTree/BbTree.vue_vue_type_script_setup_true_lang.js +57 -29
- package/dist/components/BbTree/BbTreeLevel.vue.d.ts +1 -1
- package/dist/components/BbTree/BbTreeLevel.vue_vue_type_script_setup_true_lang.js +24 -20
- package/dist/components/BbTree/context.d.ts +9 -1
- package/dist/components/BbTree/types.d.ts +40 -5
- package/dist/components/BbTree/types.js +7 -0
- package/dist/components/ChipsBox/ChipsBox.vue_vue_type_script_setup_true_lang.js +46 -44
- package/dist/components/ChipsBox/types.d.ts +7 -0
- package/dist/components/ClearableButton/ClearableButton.vue_vue_type_script_setup_true_lang.js +5 -5
- package/dist/components/CommaBox/CommaBox.vue_vue_type_script_setup_true_lang.js +11 -7
- package/dist/components/CommaBox/types.d.ts +7 -0
- package/dist/components/{BbBaseInputContainer/BbBaseInputContainer.vue.d.ts → CommonField/CommonField.vue.d.ts} +5 -5
- package/dist/components/{BbTabs/BbTabsPanes.vue.js → CommonField/CommonField.vue.js} +2 -2
- package/dist/components/CommonField/CommonField.vue_vue_type_script_setup_true_lang.js +231 -0
- package/dist/components/CommonField/messageHeightMatrix.d.ts +2 -0
- package/dist/components/{BbBaseInputContainer → CommonField}/types.d.ts +78 -16
- package/dist/components/{CommonInputWrapper/CommonInputWrapper.vue.d.ts → CommonFieldInput/CommonFieldInput.vue.d.ts} +5 -4
- package/dist/components/{BbBaseRadioGroup/BbBaseRadioGroup.vue.js → CommonFieldInput/CommonFieldInput.vue.js} +2 -2
- package/dist/components/CommonFieldInput/CommonFieldInput.vue_vue_type_script_setup_true_lang.js +121 -0
- package/dist/components/CommonFieldInput/boxBorderMatrix.d.ts +10 -0
- package/dist/components/{CommonInputWrapper → CommonFieldInput}/types.d.ts +27 -8
- package/dist/components/CommonPopover/CommonPopover.vue.d.ts +11 -2
- package/dist/components/CommonPopover/CommonPopover.vue_vue_type_script_setup_true_lang.js +80 -65
- package/dist/components/CommonPopover/types.d.ts +29 -9
- package/dist/components/CommonTimeSelector/CommonTimeSelector.vue.d.ts +49 -0
- package/dist/components/{BbBaseColorPalette/BbBaseColorPalette.vue.js → CommonTimeSelector/CommonTimeSelector.vue.js} +2 -2
- package/dist/components/CommonTimeSelector/CommonTimeSelector.vue_vue_type_script_setup_true_lang.js +241 -0
- package/dist/components/CommonTimeSelector/types.d.ts +6 -0
- package/dist/components/CommonTimeSelector/useMeridiem.d.ts +19 -0
- package/dist/components/CommonTimeSelector/useMeridiem.js +41 -0
- package/dist/components/FlatListBox/FlatListBox.vue.d.ts +5 -1
- package/dist/components/FlatListBox/FlatListBox.vue_vue_type_script_setup_true_lang.js +176 -98
- package/dist/components/FlatListBox/types.d.ts +33 -2
- package/dist/components/GroupedListBox/GroupedListBox.vue.d.ts +5 -1
- package/dist/components/GroupedListBox/GroupedListBox.vue_vue_type_script_setup_true_lang.js +237 -146
- package/dist/components/GroupedListBox/types.d.ts +33 -2
- package/dist/components/ListBox/ListBox.vue.d.ts +5 -1
- package/dist/components/ListBox/ListBox.vue_vue_type_script_setup_true_lang.js +100 -69
- package/dist/components/ListBox/types.d.ts +33 -2
- package/dist/components/OptionsContainer/OptionsContainer.vue.d.ts +1 -1
- package/dist/components/OptionsContainer/OptionsContainer.vue_vue_type_script_setup_true_lang.js +117 -37
- package/dist/components/OptionsContainer/types.d.ts +79 -10
- package/dist/components/Transitions/ScaleFade.vue_vue_type_script_setup_true_lang.js +8 -8
- package/dist/components/Transitions/Slide.vue.js +1 -1
- package/dist/composables/formSubmitLock.d.ts +8 -0
- package/dist/composables/formSubmitLock.js +4 -0
- package/dist/composables/ssrMarker.d.ts +15 -0
- package/dist/composables/ssrMarker.js +19 -0
- package/dist/composables/useBaseOptions.d.ts +18 -1
- package/dist/composables/useBaseOptions.js +83 -37
- package/dist/composables/useBbConfig.d.ts +27 -6
- package/dist/composables/useBbConfig.js +8 -2
- package/dist/composables/useBbDropdownContext.d.ts +13 -8
- package/dist/composables/useBbFormContext.d.ts +142 -8
- package/dist/composables/useBbFormContext.js +62 -30
- package/dist/composables/useBbFormField.d.ts +60 -0
- package/dist/composables/useBbFormField.js +57 -0
- package/dist/composables/useBbTableContext.d.ts +45 -1
- package/dist/composables/useBbTableContext.js +93 -87
- package/dist/composables/useBbTabsContext.d.ts +24 -18
- package/dist/composables/useBbTabsContext.js +154 -112
- package/dist/composables/useCharacterCounter.d.ts +33 -0
- package/dist/composables/useCharacterCounter.js +29 -0
- package/dist/composables/useClosingInert.d.ts +4 -4
- package/dist/composables/useCoarsePointer.js +7 -10
- package/dist/composables/useCoherence.js +1 -1
- package/dist/composables/useConfig.d.ts +59 -0
- package/dist/composables/useConfig.js +15 -0
- package/dist/composables/useConfirm.d.ts +39 -7
- package/dist/composables/useConfirm.js +50 -41
- package/dist/composables/useEscapeStackEntry.d.ts +13 -0
- package/dist/composables/useEscapeStackEntry.js +16 -0
- package/dist/composables/useFormBinding.d.ts +135 -0
- package/dist/composables/useFormBinding.js +46 -0
- package/dist/composables/useHydrated.d.ts +30 -0
- package/dist/composables/useHydrated.js +31 -7
- package/dist/composables/useId.d.ts +4 -3
- package/dist/composables/useId.js +1 -7
- package/dist/composables/useItemText.d.ts +5 -1
- package/dist/composables/useItemText.js +8 -3
- package/dist/composables/useItemValue.d.ts +5 -1
- package/dist/composables/useItemValue.js +8 -3
- package/dist/composables/useItemsGetter.d.ts +73 -2
- package/dist/composables/useItemsGetter.js +81 -21
- package/dist/composables/useKeyboardInset.d.ts +28 -0
- package/dist/composables/useKeyboardInset.js +32 -0
- package/dist/composables/useLocale.js +13 -9
- package/dist/composables/useMobile.js +7 -10
- package/dist/composables/useOverlayYield.d.ts +23 -0
- package/dist/composables/useOverlayYield.js +20 -0
- package/dist/composables/usePassthrough.d.ts +228 -0
- package/dist/composables/usePassthrough.js +247 -0
- package/dist/composables/usePrefill.d.ts +26 -5
- package/dist/composables/usePrefill.js +36 -19
- package/dist/composables/useSafeAreaInternal.js +1 -1
- package/dist/composables/useSegmentedFields.d.ts +2 -2
- package/dist/composables/useSegmentedFields.js +4 -4
- package/dist/composables/useServerPrefetch.d.ts +28 -0
- package/dist/composables/useServerPrefetch.js +9 -0
- package/dist/composables/useSsrState.d.ts +28 -0
- package/dist/composables/useSsrState.js +13 -0
- package/dist/composables/useTableWidthContext.d.ts +24 -4
- package/dist/composables/useTableWidthContext.js +31 -28
- package/dist/composables/useToast.d.ts +18 -1
- package/dist/composables/useToast.js +31 -18
- package/dist/composables/useToggleInput.d.ts +44 -0
- package/dist/composables/useToggleInput.js +39 -0
- package/dist/composables/useViewportWidth.d.ts +5 -25
- package/dist/composables/useViewportWidth.js +14 -7
- package/dist/deprecation/ai-deprecations.json.d.ts +2259 -263
- package/dist/deprecation/ai-deprecations.json.js +1 -1
- package/dist/deprecation/removedProps.js +9 -4
- package/dist/directives/bbDropdown.d.ts +15 -4
- package/dist/directives/bbDropdown.js +42 -10
- package/dist/directives/bbHoverCard.d.ts +59 -0
- package/dist/directives/bbHoverCard.js +33 -0
- package/dist/directives/bbPopover.d.ts +60 -0
- package/dist/directives/bbPopover.js +40 -0
- package/dist/directives/bbTooltip.d.ts +8 -0
- package/dist/directives/createPopoverDirective.d.ts +86 -0
- package/dist/directives/createPopoverDirective.js +111 -33
- package/dist/directives/directivePortal.d.ts +75 -0
- package/dist/directives/directivePortal.js +37 -0
- package/dist/directives/renderingInstance.d.ts +2 -0
- package/dist/directives/renderingInstance.js +25 -0
- package/dist/i18n/index.d.ts +14 -25
- package/dist/i18n/locales/cs.json +28 -18
- package/dist/i18n/locales/da.json +31 -21
- package/dist/i18n/locales/de-CH.json +137 -0
- package/dist/i18n/locales/de.json +30 -20
- package/dist/i18n/locales/el.json +28 -18
- package/dist/i18n/locales/en-GB.json +137 -0
- package/dist/i18n/locales/en.json +25 -15
- package/dist/i18n/locales/es-MX.json +137 -0
- package/dist/i18n/locales/es.json +34 -24
- package/dist/i18n/locales/fi.json +26 -16
- package/dist/i18n/locales/fr.json +36 -26
- package/dist/i18n/locales/hu.json +26 -16
- package/dist/i18n/locales/it.json +29 -19
- package/dist/i18n/locales/ja.json +31 -21
- package/dist/i18n/locales/ko.json +28 -18
- package/dist/i18n/locales/nb.json +31 -21
- package/dist/i18n/locales/nl.json +39 -29
- package/dist/i18n/locales/pl.json +27 -17
- package/dist/i18n/locales/{pt.json → pt-BR.json} +36 -26
- package/dist/i18n/locales/pt-PT.json +137 -0
- package/dist/i18n/locales/ro.json +40 -30
- package/dist/i18n/locales/ru.json +27 -17
- package/dist/i18n/locales/sv.json +34 -24
- package/dist/i18n/locales/tr.json +32 -22
- package/dist/i18n/locales/uk.json +27 -17
- package/dist/i18n/locales/{zh-cn.json → zh-CN.json} +28 -18
- package/dist/i18n/locales/zh-HK.json +137 -0
- package/dist/i18n/locales/zh-TW.json +137 -0
- package/dist/i18n/regionHints.d.ts +16 -0
- package/dist/i18n/regionHints.js +49 -0
- package/dist/i18n/regions.d.ts +286 -0
- package/dist/i18n/regions.js +265 -0
- package/dist/icon-scan.d.ts +276 -0
- package/dist/icon-scan.js +485 -0
- package/dist/icons-whitelist.d.ts +5 -4
- package/dist/index.d.ts +61 -23
- package/dist/index.js +84 -72
- package/dist/llms-full.txt +98740 -60296
- package/dist/llms-medium.txt +1617 -393
- package/dist/llms.txt +40 -23
- package/dist/locale-blueprint.json +33 -17
- package/dist/nuxt-auto-imports.d.ts +76 -0
- package/dist/nuxt-auto-imports.js +32 -0
- package/dist/nuxt-module.d.ts +30 -15
- package/dist/nuxt.js +35 -9
- package/dist/passthrough-deduper.js +5 -0
- package/dist/plugin.d.ts +10 -1
- package/dist/plugin.js +33 -19
- package/dist/project-dts.d.ts +92 -0
- package/dist/project-dts.js +173 -0
- package/dist/reset.css +1 -1
- package/dist/runtime/nuxt-plugin.js +36 -21
- package/dist/styles.css +3 -2
- package/dist/types/AlertVariant.d.ts +10 -1
- package/dist/types/BadgeVariant.d.ts +16 -5
- package/dist/types/ButtonVariant.d.ts +12 -1
- package/dist/types/ColumnName.d.ts +30 -3
- package/dist/types/CommonProps.d.ts +15 -5
- package/dist/types/Config.d.ts +112 -1
- package/dist/types/ConfirmVariant.d.ts +8 -1
- package/dist/types/DropdownItemVariant.d.ts +8 -1
- package/dist/types/FieldLayout.d.ts +39 -0
- package/dist/types/FieldLayout.js +8 -0
- package/dist/types/IndicatorVariant.d.ts +11 -1
- package/dist/types/InputVariant.d.ts +30 -0
- package/dist/types/ItemProps.d.ts +50 -0
- package/dist/types/ItemsProvider.d.ts +94 -0
- package/dist/types/Option.d.ts +6 -0
- package/dist/types/PtScope.d.ts +15 -0
- package/dist/types/RegistryKey.d.ts +10 -0
- package/dist/types/TabsVariant.d.ts +25 -0
- package/dist/types/ToastVariant.d.ts +12 -2
- package/dist/types/TooltipVariant.d.ts +8 -1
- package/dist/types/passthrough.d.ts +378 -0
- package/dist/types/passthrough.js +78 -0
- package/dist/types/ptComponentMap.d.ts +63 -0
- package/dist/utilities/functions/animationsSettled.d.ts +7 -0
- package/dist/utilities/functions/animationsSettled.js +6 -0
- package/dist/utilities/functions/elementLabel.d.ts +8 -0
- package/dist/utilities/functions/elementLabel.js +6 -0
- package/dist/utilities/functions/hasVnodeListener.d.ts +16 -0
- package/dist/utilities/functions/hasVnodeListener.js +12 -0
- package/dist/utilities/functions/isImeComposing.d.ts +7 -0
- package/dist/utilities/functions/isImeComposing.js +4 -0
- package/dist/utilities/functions/itemProps.d.ts +46 -0
- package/dist/utilities/functions/itemProps.js +47 -0
- package/dist/utilities/functions/parseSize.d.ts +2 -1
- package/dist/utilities/functions/readableValue.d.ts +6 -0
- package/dist/utilities/functions/readableValue.js +4 -0
- package/dist/utilities/functions/settlesVisible.d.ts +20 -0
- package/dist/utilities/functions/settlesVisible.js +18 -0
- package/dist/utilities/functions/slotKey.d.ts +13 -8
- package/dist/utilities/functions/slotKey.js +78 -2
- package/dist/utilities/functions/snapToStep.js +2 -1
- package/dist/utilities/functions/throttle.d.ts +1 -4
- package/dist/utilities/functions/throttle.js +1 -4
- package/dist/utilities/functions/toggleInput.d.ts +114 -0
- package/dist/utilities/functions/toggleInput.js +61 -0
- package/dist/utilities/functions/warnRemovedAttrs.d.ts +39 -1
- package/dist/utilities/functions/warnRemovedAttrs.js +85 -14
- package/dist/utilities/misc/listboxMetrics.d.ts +9 -3
- package/dist/utilities/misc/listboxMetrics.js +5 -2
- package/dist/utilities/misc/ssrStateInjectionKey.d.ts +47 -0
- package/dist/utilities/misc/ssrStateInjectionKey.js +4 -0
- package/dist/utilities/misc/ssrValue.d.ts +20 -0
- package/dist/utilities/misc/ssrValue.js +7 -0
- package/dist/utils/cssLayers.d.ts +91 -0
- package/dist/utils/cssLayers.js +43 -0
- package/dist/utils/injectLibraryStyles.d.ts +3 -1
- package/dist/utils/injectLibraryStyles.js +24 -23
- package/dist/utils/overlayEscapeStack.d.ts +39 -1
- package/dist/utils/overlayEscapeStack.js +19 -8
- package/dist/utils/passthrough.d.ts +67 -0
- package/dist/utils/passthrough.js +100 -0
- package/dist/utils/passthroughDeduper.d.ts +2 -0
- package/dist/utils/ptScope.d.ts +8 -0
- package/dist/utils/ptScope.js +4 -0
- package/dist/utils/versionCheck.d.ts +19 -0
- package/dist/utils/versionCheck.js +18 -0
- package/dist/vite-plugin.d.ts +324 -71
- package/dist/vite.js +577 -385
- package/llms.txt +41 -24
- package/package.json +74 -38
- package/scripts/README.md +35 -33
- package/scripts/lib/agent-manifest.mjs +510 -0
- package/scripts/lib/check-fix.mjs +129 -0
- package/scripts/lib/component-attr-targets.ts +123 -0
- package/scripts/lib/component-tree.ts +648 -0
- package/scripts/lib/css-class-check.mjs +329 -0
- package/scripts/lib/css-class-surface.mjs +292 -0
- package/scripts/lib/css-color-resolve.mjs +296 -0
- package/scripts/lib/css-local-check.mjs +432 -0
- package/scripts/lib/design-token-manifest.mjs +506 -0
- package/scripts/lib/doc-sections.mjs +250 -0
- package/scripts/lib/ensure-manifest.mjs +106 -10
- package/scripts/lib/eslint-disable.mjs +167 -0
- package/scripts/lib/eslint-plugin.d.ts +84 -1
- package/scripts/lib/eslint-plugin.mjs +2190 -33
- package/scripts/lib/example-checks.mjs +337 -0
- package/scripts/lib/form-v-model.mjs +190 -0
- package/scripts/lib/guide-claims.mjs +452 -0
- package/scripts/lib/hand-imported-styles.mjs +362 -0
- package/scripts/lib/hand-roll-hints.mjs +50 -6
- package/scripts/lib/helper-canon.mjs +176 -0
- package/scripts/lib/helpers-add.mjs +1303 -0
- package/scripts/lib/html-attributes.mjs +353 -0
- package/scripts/lib/items-provider-context.mjs +842 -0
- package/scripts/lib/linked-target.mjs +30 -0
- package/scripts/lib/local-components.mjs +206 -0
- package/scripts/lib/locale-check.mjs +182 -0
- package/scripts/lib/manifest-pointers.mjs +71 -0
- package/scripts/lib/mcp-config.mjs +93 -58
- package/scripts/lib/migrate-fix.mjs +62 -3
- package/scripts/lib/portal-names.mjs +458 -0
- package/scripts/lib/project-variant-dts.mjs +144 -0
- package/scripts/lib/public-type-exports.mjs +273 -0
- package/scripts/lib/reactive-v-model.mjs +221 -0
- package/scripts/lib/redundant-item-accessor.mjs +398 -0
- package/scripts/lib/renamed-item-field.mjs +343 -0
- package/scripts/lib/slot-key.mjs +147 -0
- package/scripts/lib/slot-renames.mjs +45 -0
- package/scripts/lib/squashed-slot-words.mjs +133 -0
- package/scripts/lib/text-null-value.mjs +260 -0
- package/scripts/lib/toolchain-check.mjs +217 -0
- package/scripts/lib/unimported-components.mjs +263 -0
- package/scripts/lib/validate-bb-markup.mjs +2932 -100
- package/scripts/lib/wrapper-props.mjs +188 -0
- package/dist/ai/BbBaseCheckbox.md +0 -49
- package/dist/ai/BbBaseCheckboxGroup.md +0 -64
- package/dist/ai/BbBaseColorInput.md +0 -65
- package/dist/ai/BbBaseColorPalette.md +0 -39
- package/dist/ai/BbBaseDatePicker.md +0 -43
- package/dist/ai/BbBaseDatePickerInput.md +0 -73
- package/dist/ai/BbBaseInputContainer.md +0 -48
- package/dist/ai/BbBaseNumberInput.md +0 -71
- package/dist/ai/BbBaseRadio.md +0 -46
- package/dist/ai/BbBaseRadioGroup.md +0 -64
- package/dist/ai/BbBaseRating.md +0 -52
- package/dist/ai/BbBaseSelect.md +0 -88
- package/dist/ai/BbBaseSlider.md +0 -56
- package/dist/ai/BbBaseSwitch.md +0 -49
- package/dist/ai/BbBaseSwitchGroup.md +0 -64
- package/dist/ai/BbBaseTag.md +0 -68
- package/dist/ai/BbBaseTextInput.md +0 -75
- package/dist/ai/BbBaseTextarea.md +0 -62
- package/dist/ai/BbBaseTimePickerInput.md +0 -62
- package/dist/ai/BbTabsPanes.md +0 -27
- package/dist/ai/CommonInputWrapper.md +0 -42
- package/dist/ai/recipes/inertia/command-palette.md +0 -311
- package/dist/ai/recipes/nuxt/command-palette.md +0 -300
- package/dist/ai/recipes/vue/command-palette.md +0 -297
- package/dist/ai/source/BbBaseCheckbox.md +0 -461
- package/dist/ai/source/BbBaseCheckboxGroup.md +0 -554
- package/dist/ai/source/BbBaseColorInput.md +0 -431
- package/dist/ai/source/BbBaseColorPalette.md +0 -942
- package/dist/ai/source/BbBaseDatePicker.md +0 -1448
- package/dist/ai/source/BbBaseDatePickerInput.md +0 -1940
- package/dist/ai/source/BbBaseInputContainer.md +0 -1211
- package/dist/ai/source/BbBaseNumberInput.md +0 -617
- package/dist/ai/source/BbBaseRadio.md +0 -381
- package/dist/ai/source/BbBaseRadioGroup.md +0 -539
- package/dist/ai/source/BbBaseRating.md +0 -607
- package/dist/ai/source/BbBaseSelect.md +0 -945
- package/dist/ai/source/BbBaseSlider.md +0 -1144
- package/dist/ai/source/BbBaseSwitch.md +0 -246
- package/dist/ai/source/BbBaseSwitchGroup.md +0 -302
- package/dist/ai/source/BbBaseTag.md +0 -694
- package/dist/ai/source/BbBaseTextInput.md +0 -511
- package/dist/ai/source/BbBaseTextarea.md +0 -504
- package/dist/ai/source/BbBaseTimePickerInput.md +0 -1037
- package/dist/ai/source/BbTabsPanes.md +0 -377
- package/dist/ai/source/CommonInputWrapper.md +0 -584
- package/dist/alert-variants.d.ts +0 -19
- package/dist/assets/svgs/sort.svg_raw.js +0 -4
- package/dist/badge-variants.d.ts +0 -19
- package/dist/button-variants.d.ts +0 -21
- package/dist/components/BbBadge/BadgeAppendIcon.vue.d.ts +0 -3
- package/dist/components/BbBadge/BadgeAppendIcon.vue.js +0 -5
- package/dist/components/BbBadge/BadgeAppendIcon.vue_vue_type_script_setup_true_lang.js +0 -22
- package/dist/components/BbBaseCheckbox/BbBaseCheckbox.vue.d.ts +0 -40
- package/dist/components/BbBaseCheckbox/BbBaseCheckbox.vue.js +0 -6
- package/dist/components/BbBaseCheckbox/BbBaseCheckbox.vue_vue_type_script_setup_true_lang.js +0 -145
- package/dist/components/BbBaseCheckbox/types.d.ts +0 -224
- package/dist/components/BbBaseCheckboxGroup/BbBaseCheckboxGroup.vue.d.ts +0 -19
- package/dist/components/BbBaseCheckboxGroup/BbBaseCheckboxGroup.vue.js +0 -6
- package/dist/components/BbBaseCheckboxGroup/BbBaseCheckboxGroup.vue_vue_type_script_setup_true_lang.js +0 -190
- package/dist/components/BbBaseCheckboxGroup/types.d.ts +0 -257
- package/dist/components/BbBaseColorInput/BbBaseColorInput.vue.d.ts +0 -43
- package/dist/components/BbBaseColorInput/BbBaseColorInput.vue.js +0 -6
- package/dist/components/BbBaseColorInput/BbBaseColorInput.vue_vue_type_script_setup_true_lang.js +0 -184
- package/dist/components/BbBaseColorInput/types.d.ts +0 -219
- package/dist/components/BbBaseColorPalette/BbBaseColorPalette.vue.d.ts +0 -13
- package/dist/components/BbBaseColorPalette/BbBaseColorPalette.vue_vue_type_script_setup_true_lang.js +0 -395
- package/dist/components/BbBaseColorPalette/types.d.ts +0 -40
- package/dist/components/BbBaseDatePicker/BbBaseDatePicker.vue.d.ts +0 -20
- package/dist/components/BbBaseDatePicker/BbBaseDatePicker.vue.js +0 -6
- package/dist/components/BbBaseDatePicker/BbBaseDatePicker.vue_vue_type_script_setup_true_lang.js +0 -407
- package/dist/components/BbBaseDatePicker/BbBaseDatePickerInputDaySelector.vue.d.ts +0 -47
- package/dist/components/BbBaseDatePicker/BbBaseDatePickerInputDaySelector.vue.js +0 -5
- package/dist/components/BbBaseDatePicker/BbBaseDatePickerInputDaySelector.vue_vue_type_script_setup_true_lang.js +0 -318
- package/dist/components/BbBaseDatePicker/BbBaseDatePickerMonthSelector.vue.js +0 -5
- package/dist/components/BbBaseDatePicker/BbBaseDatePickerMonthSelector.vue_vue_type_script_setup_true_lang.js +0 -115
- package/dist/components/BbBaseDatePicker/BbBaseDatePickerYearSelector.vue.js +0 -5
- package/dist/components/BbBaseDatePicker/BbBaseDatePickerYearSelector.vue_vue_type_script_setup_true_lang.js +0 -116
- package/dist/components/BbBaseDatePicker/types.d.ts +0 -108
- package/dist/components/BbBaseDatePicker/useDatePickerContext.js +0 -11
- package/dist/components/BbBaseDatePickerInput/BbBaseDatePickerInput.vue.d.ts +0 -31
- package/dist/components/BbBaseDatePickerInput/BbBaseDatePickerInput.vue.js +0 -6
- package/dist/components/BbBaseDatePickerInput/BbBaseDatePickerInput.vue_vue_type_script_setup_true_lang.js +0 -737
- package/dist/components/BbBaseDatePickerInput/BbBaseDatePickerTimeSelector.vue.d.ts +0 -30
- package/dist/components/BbBaseDatePickerInput/BbBaseDatePickerTimeSelector.vue.js +0 -6
- package/dist/components/BbBaseDatePickerInput/BbBaseDatePickerTimeSelector.vue_vue_type_script_setup_true_lang.js +0 -204
- package/dist/components/BbBaseDatePickerInput/types.d.ts +0 -325
- package/dist/components/BbBaseInputContainer/BbBaseInputContainer.vue.js +0 -6
- package/dist/components/BbBaseInputContainer/BbBaseInputContainer.vue_vue_type_script_setup_true_lang.js +0 -190
- package/dist/components/BbBaseNumberInput/BbBaseNumberInput.vue.d.ts +0 -52
- package/dist/components/BbBaseNumberInput/BbBaseNumberInput.vue.js +0 -6
- package/dist/components/BbBaseNumberInput/BbBaseNumberInput.vue_vue_type_script_setup_true_lang.js +0 -215
- package/dist/components/BbBaseNumberInput/types.d.ts +0 -211
- package/dist/components/BbBaseRadio/BbBaseRadio.vue.d.ts +0 -33
- package/dist/components/BbBaseRadio/BbBaseRadio.vue_vue_type_script_setup_true_lang.js +0 -113
- package/dist/components/BbBaseRadio/types.d.ts +0 -179
- package/dist/components/BbBaseRadioGroup/BbBaseRadioGroup.vue.d.ts +0 -19
- package/dist/components/BbBaseRadioGroup/BbBaseRadioGroup.vue_vue_type_script_setup_true_lang.js +0 -179
- package/dist/components/BbBaseRadioGroup/types.d.ts +0 -223
- package/dist/components/BbBaseRating/BbBaseRating.vue.d.ts +0 -38
- package/dist/components/BbBaseRating/BbBaseRating.vue.js +0 -6
- package/dist/components/BbBaseRating/BbBaseRating.vue_vue_type_script_setup_true_lang.js +0 -192
- package/dist/components/BbBaseRating/types.d.ts +0 -176
- package/dist/components/BbBaseSelect/BbBaseSelect.vue.d.ts +0 -19
- package/dist/components/BbBaseSelect/BbBaseSelect.vue.js +0 -6
- package/dist/components/BbBaseSelect/BbBaseSelect.vue_vue_type_script_setup_true_lang.js +0 -311
- package/dist/components/BbBaseSelect/types.d.ts +0 -297
- package/dist/components/BbBaseSlider/BbBaseSlider.vue.d.ts +0 -35
- package/dist/components/BbBaseSlider/BbBaseSlider.vue.js +0 -6
- package/dist/components/BbBaseSlider/BbBaseSlider.vue_vue_type_script_setup_true_lang.js +0 -340
- package/dist/components/BbBaseSlider/types.d.ts +0 -200
- package/dist/components/BbBaseSwitch/BbBaseSwitch.vue.d.ts +0 -35
- package/dist/components/BbBaseSwitch/BbBaseSwitch.vue_vue_type_script_setup_true_lang.js +0 -146
- package/dist/components/BbBaseSwitch/types.d.ts +0 -10
- package/dist/components/BbBaseSwitchGroup/BbBaseSwitchGroup.vue.d.ts +0 -19
- package/dist/components/BbBaseSwitchGroup/BbBaseSwitchGroup.vue.js +0 -6
- package/dist/components/BbBaseSwitchGroup/BbBaseSwitchGroup.vue_vue_type_script_setup_true_lang.js +0 -190
- package/dist/components/BbBaseSwitchGroup/types.d.ts +0 -8
- package/dist/components/BbBaseTag/BbBaseTag.vue.d.ts +0 -50
- package/dist/components/BbBaseTag/BbBaseTag.vue.js +0 -6
- package/dist/components/BbBaseTag/BbBaseTag.vue_vue_type_script_setup_true_lang.js +0 -266
- package/dist/components/BbBaseTag/types.d.ts +0 -160
- package/dist/components/BbBaseTextInput/BbBaseTextInput.vue.d.ts +0 -45
- package/dist/components/BbBaseTextInput/BbBaseTextInput.vue.js +0 -6
- package/dist/components/BbBaseTextInput/BbBaseTextInput.vue_vue_type_script_setup_true_lang.js +0 -200
- package/dist/components/BbBaseTextInput/types.d.ts +0 -209
- package/dist/components/BbBaseTextarea/BbBaseTextarea.vue.d.ts +0 -39
- package/dist/components/BbBaseTextarea/BbBaseTextarea.vue.js +0 -6
- package/dist/components/BbBaseTextarea/BbBaseTextarea.vue_vue_type_script_setup_true_lang.js +0 -187
- package/dist/components/BbBaseTextarea/types.d.ts +0 -170
- package/dist/components/BbBaseTimePickerInput/BbBaseTimePickerInput.vue.d.ts +0 -27
- package/dist/components/BbBaseTimePickerInput/BbBaseTimePickerInput.vue.js +0 -6
- package/dist/components/BbBaseTimePickerInput/BbBaseTimePickerInput.vue_vue_type_script_setup_true_lang.js +0 -519
- package/dist/components/BbBaseTimePickerInput/types.d.ts +0 -151
- package/dist/components/BbTabs/BbTabsPanes.vue.d.ts +0 -16
- package/dist/components/BbTabs/BbTabsPanes.vue_vue_type_script_setup_true_lang.js +0 -35
- package/dist/components/CommonInputWrapper/CommonInputWrapper.vue.js +0 -6
- package/dist/components/CommonInputWrapper/CommonInputWrapper.vue_vue_type_script_setup_true_lang.js +0 -107
- package/dist/confirm-variants.d.ts +0 -17
- package/dist/dropdown-item-variants.d.ts +0 -17
- package/dist/i18n/index.js +0 -27
- package/dist/indicator-variants.d.ts +0 -20
- package/dist/locale-registry.d.ts +0 -37
- package/dist/toast-variants.d.ts +0 -20
- package/dist/tooltip-variants.d.ts +0 -17
- package/dist/types/InputDirection.d.ts +0 -15
- package/dist/validated/BbCheckbox.vue.d.ts +0 -29
- package/dist/validated/BbCheckbox.vue.js +0 -5
- package/dist/validated/BbCheckbox.vue_vue_type_script_setup_true_lang.js +0 -75
- package/dist/validated/BbCheckboxGroup.vue.d.ts +0 -34
- package/dist/validated/BbCheckboxGroup.vue.js +0 -5
- package/dist/validated/BbCheckboxGroup.vue_vue_type_script_setup_true_lang.js +0 -82
- package/dist/validated/BbColorInput.vue.d.ts +0 -37
- package/dist/validated/BbColorInput.vue.js +0 -5
- package/dist/validated/BbColorInput.vue_vue_type_script_setup_true_lang.js +0 -75
- package/dist/validated/BbDatePickerInput.vue.d.ts +0 -41
- package/dist/validated/BbDatePickerInput.vue.js +0 -5
- package/dist/validated/BbDatePickerInput.vue_vue_type_script_setup_true_lang.js +0 -90
- package/dist/validated/BbDropzone.vue.d.ts +0 -24
- package/dist/validated/BbDropzone.vue.js +0 -5
- package/dist/validated/BbDropzone.vue_vue_type_script_setup_true_lang.js +0 -45
- package/dist/validated/BbForm.vue.d.ts +0 -28
- package/dist/validated/BbForm.vue_vue_type_script_setup_true_lang.js +0 -42
- package/dist/validated/BbNumberInput.vue.d.ts +0 -36
- package/dist/validated/BbNumberInput.vue.js +0 -5
- package/dist/validated/BbNumberInput.vue_vue_type_script_setup_true_lang.js +0 -72
- package/dist/validated/BbRadioGroup.vue.d.ts +0 -34
- package/dist/validated/BbRadioGroup.vue.js +0 -5
- package/dist/validated/BbRadioGroup.vue_vue_type_script_setup_true_lang.js +0 -78
- package/dist/validated/BbRating.vue.d.ts +0 -30
- package/dist/validated/BbRating.vue.js +0 -5
- package/dist/validated/BbRating.vue_vue_type_script_setup_true_lang.js +0 -63
- package/dist/validated/BbSelect.vue.d.ts +0 -46
- package/dist/validated/BbSelect.vue.js +0 -5
- package/dist/validated/BbSelect.vue_vue_type_script_setup_true_lang.js +0 -109
- package/dist/validated/BbSlider.vue.d.ts +0 -36
- package/dist/validated/BbSlider.vue.js +0 -5
- package/dist/validated/BbSlider.vue_vue_type_script_setup_true_lang.js +0 -69
- package/dist/validated/BbSwitch.vue.d.ts +0 -29
- package/dist/validated/BbSwitch.vue.js +0 -5
- package/dist/validated/BbSwitch.vue_vue_type_script_setup_true_lang.js +0 -75
- package/dist/validated/BbSwitchGroup.vue.d.ts +0 -34
- package/dist/validated/BbSwitchGroup.vue.js +0 -5
- package/dist/validated/BbSwitchGroup.vue_vue_type_script_setup_true_lang.js +0 -82
- package/dist/validated/BbTag.vue.d.ts +0 -36
- package/dist/validated/BbTag.vue.js +0 -5
- package/dist/validated/BbTag.vue_vue_type_script_setup_true_lang.js +0 -72
- package/dist/validated/BbTextInput.vue.d.ts +0 -36
- package/dist/validated/BbTextInput.vue.js +0 -5
- package/dist/validated/BbTextInput.vue_vue_type_script_setup_true_lang.js +0 -72
- package/dist/validated/BbTextarea.vue.d.ts +0 -36
- package/dist/validated/BbTextarea.vue.js +0 -5
- package/dist/validated/BbTextarea.vue_vue_type_script_setup_true_lang.js +0 -70
- package/dist/validated/BbTimePickerInput.vue.d.ts +0 -37
- package/dist/validated/BbTimePickerInput.vue.js +0 -5
- package/dist/validated/BbTimePickerInput.vue_vue_type_script_setup_true_lang.js +0 -81
- package/dist/validated/index.d.ts +0 -43
- package/dist/validated/useValidatedField.d.ts +0 -93
- package/dist/validated/useValidatedField.js +0 -51
- package/dist/validated.js +0 -21
- /package/dist/components/{BbBaseDatePicker/BbBaseDatePickerMonthSelector.vue.d.ts → BbCalendar/CalendarMonthPanel.vue.d.ts} +0 -0
- /package/dist/components/{BbBaseDatePicker/BbBaseDatePickerYearSelector.vue.d.ts → BbCalendar/CalendarYearPanel.vue.d.ts} +0 -0
- /package/dist/{components/BbBaseDatePicker/typeahead.d.ts → composables/useTypeahead.d.ts} +0 -0
- /package/dist/{components/BbBaseDatePicker/typeahead.js → composables/useTypeahead.js} +0 -0
|
@@ -36,8 +36,8 @@ Sibling recipes: [Vue](../vue/upload-center.md) ·
|
|
|
36
36
|
the peek stack, the close semantics and the sidebar's out-of-flow
|
|
37
37
|
behaviour are all load-bearing here.
|
|
38
38
|
- `<BbConfirm />` and `<BbToast />` mounted once in the `createInertiaApp` render root — never in a page.
|
|
39
|
-
- From the [Inertia Helpers](../../guides/inertia-helpers.md) toolkit
|
|
40
|
-
`
|
|
39
|
+
- From the [Inertia Helpers](../../guides/inertia-helpers.md) toolkit, installed with
|
|
40
|
+
`npx bitboss-ui add useProp useQuery useQueryObject useResourceContext useTableContext`.
|
|
41
41
|
- A `useCategoriesStore()` Pinia store exposing the shared expense-category
|
|
42
42
|
catalog (Travel, Meals & entertainment, Lodging, Rideshare & transit,
|
|
43
43
|
Software & subscriptions, Office supplies, Fuel, Client entertainment).
|
|
@@ -111,15 +111,15 @@ ReceiptPaginator::make(...), 'tabCounts' => [...], 'readyCount' => ...])` —
|
|
|
111
111
|
## Page anatomy
|
|
112
112
|
|
|
113
113
|
```
|
|
114
|
-
UploadCenter/
|
|
114
|
+
resources/js/pages/UploadCenter/
|
|
115
115
|
Index.vue ← assembly: PageShell slots, dropzone, tabs, table, pagination
|
|
116
116
|
context.ts ← coopting page context (shell + useTableContext + categories + URL filters + upload queue + actions)
|
|
117
117
|
ReceiptDropzone.vue ← multi-file capture, constraint errors mapped to messages
|
|
118
118
|
FilterRail.vue ← pill filters + clear-all
|
|
119
119
|
ReceiptFileCell.vue ← file icon + name (peek link) + size, both row kinds
|
|
120
120
|
UploadProgressCell.vue ← per-file BbProgress / failed state with inline retry
|
|
121
|
-
MerchantCell.vue ← inline text edit, commit on blur/Enter (
|
|
122
|
-
CategoryCell.vue ← one-click badge → BbSelectPopover (
|
|
121
|
+
MerchantCell.vue ← inline text edit, commit on blur/Enter (inline-editing table)
|
|
122
|
+
CategoryCell.vue ← one-click badge → BbSelectPopover (one-click status cell)
|
|
123
123
|
AmountCell.vue ← inline number edit with $ prefix
|
|
124
124
|
DateCell.vue ← date picker cell, commit on pick
|
|
125
125
|
RowActions.vue ← remove-from-queue / per-receipt "…" dropdown
|
|
@@ -134,35 +134,35 @@ Chrome assumed from the guides: [App Layout](../../guides/app-layout.md)
|
|
|
134
134
|
|
|
135
135
|
## Action inventory
|
|
136
136
|
|
|
137
|
-
| # | Action | Trigger | Mechanism
|
|
138
|
-
| --- | --------------------------------- | ---------------------------------- |
|
|
139
|
-
| 1 | Upload receipts | dropzone (drag, click, Browse) | `enqueueFiles()` → direct fetch/XHR upload + partial reload
|
|
140
|
-
| 2 | Retry a failed upload | inline in the progress cell | `retryUpload(id)` re-issues the same direct request
|
|
141
|
-
| 3 | Remove an in-flight upload | row actions (x) | `removeUpload(id)` aborts + drops the row
|
|
142
|
-
| 4 | Page search | topbar right | `filters.search` → `useQueryObject` partial visit
|
|
143
|
-
| 5 | Filter category / merchant / date | filter rail pills | `BbSelectPopover` multiple / query-aware / date range
|
|
144
|
-
| 6 | Clear filters | rail right (only when active) | context `clearFilters()`
|
|
145
|
-
| 7 | Switch tab | server-visit tabs with counts | `BbTabs` `href` + `server: true` visit
|
|
146
|
-
| 8 | Edit merchant inline | merchant cell | commit on blur/Enter → promise-wrapped visit, Esc reverts (
|
|
147
|
-
| 9 | Change category one-click | category badge in row & peek | `BbSelectPopover` on the badge (
|
|
148
|
-
| 10 | Edit amount inline | amount cell ($ prefix) | commit on blur/Enter → promise-wrapped visit, Esc reverts
|
|
149
|
-
| 11 | Edit expense date inline | date cell | commit on pick → promise-wrapped visit
|
|
150
|
-
| 12 | Submit one receipt | row `…`, peek footer | `submitReceipt()` (visit + refresh + toast)
|
|
151
|
-
| 13 | Submit all with count | topbar, the page's one `primary` | `submitAll()` — count from every fetch
|
|
152
|
-
| 14 | Remove a draft | row `…`, peek footer | destructive behind `useConfirm`
|
|
153
|
-
| 15 | Bulk categorize | floating bottom panel popover | `bulkCategorize()` on `table.selected`/`all`/`unselected`
|
|
154
|
-
| 16 | Bulk remove | floating bottom panel | destructive behind `useConfirm`, count in message
|
|
155
|
-
| 17 | Select rows / select all | table checkboxes (drafts only) | `useTableContext` selection (across pages)
|
|
156
|
-
| 18 | Peek receipt | filename cell / merchant peek list | `peekReceipt(id)` → shell stack, JSON fetch
|
|
157
|
-
| 19 | Peek merchant (stacked) | merchant name inside the peek | `stackMerchant(name)` → back arrow, JSON fetch
|
|
158
|
-
| 20 | Download original | row `…`, peek footer | navigation (`target="_blank"`, real file endpoint)
|
|
137
|
+
| # | Action | Trigger | Mechanism |
|
|
138
|
+
| --- | --------------------------------- | ---------------------------------- | -------------------------------------------------------------------------------- |
|
|
139
|
+
| 1 | Upload receipts | dropzone (drag, click, Browse) | `enqueueFiles()` → direct fetch/XHR upload + partial reload |
|
|
140
|
+
| 2 | Retry a failed upload | inline in the progress cell | `retryUpload(id)` re-issues the same direct request |
|
|
141
|
+
| 3 | Remove an in-flight upload | row actions (x) | `removeUpload(id)` aborts + drops the row |
|
|
142
|
+
| 4 | Page search | topbar right | `filters.search` → `useQueryObject` partial visit |
|
|
143
|
+
| 5 | Filter category / merchant / date | filter rail pills | `BbSelectPopover` multiple / query-aware / date range |
|
|
144
|
+
| 6 | Clear filters | rail right (only when active) | context `clearFilters()` |
|
|
145
|
+
| 7 | Switch tab | server-visit tabs with counts | `BbTabs` `href` + `server: true` visit |
|
|
146
|
+
| 8 | Edit merchant inline | merchant cell | commit on blur/Enter → promise-wrapped visit, Esc reverts (inline-editing table) |
|
|
147
|
+
| 9 | Change category one-click | category badge in row & peek | `BbSelectPopover` on the badge (one-click status cell) → promise-wrapped visit |
|
|
148
|
+
| 10 | Edit amount inline | amount cell ($ prefix) | commit on blur/Enter → promise-wrapped visit, Esc reverts |
|
|
149
|
+
| 11 | Edit expense date inline | date cell | commit on pick → promise-wrapped visit |
|
|
150
|
+
| 12 | Submit one receipt | row `…`, peek footer | `submitReceipt()` (visit + refresh + toast) |
|
|
151
|
+
| 13 | Submit all with count | topbar, the page's one `primary` | `submitAll()` — count from every fetch |
|
|
152
|
+
| 14 | Remove a draft | row `…`, peek footer | destructive behind `useConfirm` |
|
|
153
|
+
| 15 | Bulk categorize | floating bottom panel popover | `bulkCategorize()` on `table.selected`/`all`/`unselected` |
|
|
154
|
+
| 16 | Bulk remove | floating bottom panel | destructive behind `useConfirm`, count in message |
|
|
155
|
+
| 17 | Select rows / select all | table checkboxes (drafts only) | `useTableContext` selection (across pages) |
|
|
156
|
+
| 18 | Peek receipt | filename cell / merchant peek list | `peekReceipt(id)` → shell stack, JSON fetch |
|
|
157
|
+
| 19 | Peek merchant (stacked) | merchant name inside the peek | `stackMerchant(name)` → back arrow, JSON fetch |
|
|
158
|
+
| 20 | Download original | row `…`, peek footer | navigation (`target="_blank"`, real file endpoint) |
|
|
159
159
|
|
|
160
160
|
## The code
|
|
161
161
|
|
|
162
162
|
### context.ts
|
|
163
163
|
|
|
164
164
|
```ts
|
|
165
|
-
// UploadCenter/context.ts
|
|
165
|
+
// pages/UploadCenter/context.ts
|
|
166
166
|
import {
|
|
167
167
|
computed,
|
|
168
168
|
inject,
|
|
@@ -175,7 +175,12 @@ import {
|
|
|
175
175
|
} from 'vue';
|
|
176
176
|
import { router } from '@inertiajs/vue3';
|
|
177
177
|
import type { RequestPayload } from '@inertiajs/core';
|
|
178
|
-
import {
|
|
178
|
+
import {
|
|
179
|
+
useConfirm,
|
|
180
|
+
useToast,
|
|
181
|
+
type BadgeVariantType,
|
|
182
|
+
type BbSelectPopoverItemsContext,
|
|
183
|
+
} from 'bitboss-ui';
|
|
179
184
|
import {
|
|
180
185
|
usePageShellContext,
|
|
181
186
|
type PageShellContext,
|
|
@@ -183,18 +188,22 @@ import {
|
|
|
183
188
|
import {
|
|
184
189
|
useTableContext,
|
|
185
190
|
type TableContext,
|
|
186
|
-
} from '@/composables/useTableContext';
|
|
187
|
-
import { useQueryObject } from '@/composables/useQueryObject';
|
|
188
|
-
import { useProp } from '@/composables/useProp';
|
|
189
|
-
import { useQuery } from '@/composables/useQuery';
|
|
191
|
+
} from '@/composables/inertia-helpers/useTableContext';
|
|
192
|
+
import { useQueryObject } from '@/composables/inertia-helpers/useQueryObject';
|
|
193
|
+
import { useProp } from '@/composables/inertia-helpers/useProp';
|
|
194
|
+
import { useQuery } from '@/composables/inertia-helpers/useQuery';
|
|
190
195
|
import { useCategoriesStore } from '@/stores/categories';
|
|
191
196
|
import { api } from '@/api';
|
|
192
197
|
import type { Category, Receipt, ReceiptStatus } from '@/types';
|
|
193
198
|
|
|
194
|
-
/**
|
|
199
|
+
/**
|
|
200
|
+
* What the stacked sidebar can show. Clicking a name pushes one of these.
|
|
201
|
+
* `title` names the sidebar (`#sidebar-title`) before the record's own fetch
|
|
202
|
+
* has resolved: the caller passes the name it is rendering.
|
|
203
|
+
*/
|
|
195
204
|
export type PeekItem =
|
|
196
|
-
| { type: 'receipt'; id: string }
|
|
197
|
-
| { type: 'merchant'; name: string };
|
|
205
|
+
| { type: 'receipt'; id: string; title: string }
|
|
206
|
+
| { type: 'merchant'; name: string; title: string };
|
|
198
207
|
|
|
199
208
|
export type UploadCenterTab = 'drafts' | 'submitted' | 'reimbursed';
|
|
200
209
|
|
|
@@ -237,7 +246,7 @@ const RELOAD_PROPS = ['receipts', 'tabCounts', 'readyCount'] as const;
|
|
|
237
246
|
// -- Receipt-status badge maps: one closed set, mapped once for the whole page.
|
|
238
247
|
// The receipt lifecycle (table rows, the receipt peek header, the merchant
|
|
239
248
|
// peek's recent list) is a small closed set — the textbook case for the soft
|
|
240
|
-
// accents (design-language.md § Using color), registered
|
|
249
|
+
// accents (design-language.md § Using color), registered with the plugin's badgeVariants option.
|
|
241
250
|
// draft = idle/neutral, submitted = pending approval, reimbursed = done.
|
|
242
251
|
export const STATUS_LABEL: Record<ReceiptStatus, string> = {
|
|
243
252
|
draft: 'Draft',
|
|
@@ -270,10 +279,10 @@ export interface UploadCenterContext {
|
|
|
270
279
|
// -- Data --------------------------------------------------------------------
|
|
271
280
|
/** Drafts tab: queue rows first, then the fetched server page. */
|
|
272
281
|
rows: ComputedRef<UploadCenterRow[]>;
|
|
273
|
-
searchMerchants: (
|
|
282
|
+
searchMerchants: (context: BbSelectPopoverItemsContext) => Promise<string[]>;
|
|
274
283
|
// -- Peek grammar ----------------------------------------------------------
|
|
275
|
-
peekReceipt: (id: string) => void;
|
|
276
|
-
stackReceipt: (id: string) => void;
|
|
284
|
+
peekReceipt: (id: string, title: string) => void;
|
|
285
|
+
stackReceipt: (id: string, title: string) => void;
|
|
277
286
|
stackMerchant: (name: string) => void;
|
|
278
287
|
// -- Actions (complete: visit/reload + refresh + toast) ----------------------
|
|
279
288
|
clearFilters: () => void;
|
|
@@ -380,10 +389,21 @@ export function provideUploadCenter(): UploadCenterContext {
|
|
|
380
389
|
: serverRows;
|
|
381
390
|
});
|
|
382
391
|
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
392
|
+
// The merchant pill's provider: one context object, `query` is the typed
|
|
393
|
+
// text and `signal` cancels a request a newer keystroke supersedes. `fetch`
|
|
394
|
+
// resolves on a 4xx/5xx too, hence the `res.ok` check: a failed search
|
|
395
|
+
// throws, so the popover shows its failed state.
|
|
396
|
+
const searchMerchants = async ({
|
|
397
|
+
query,
|
|
398
|
+
signal,
|
|
399
|
+
}: BbSelectPopoverItemsContext): Promise<string[]> => {
|
|
400
|
+
const res = await fetch(
|
|
401
|
+
`/merchants/search?q=${encodeURIComponent(query)}`,
|
|
402
|
+
{ signal }
|
|
386
403
|
);
|
|
404
|
+
if (!res.ok) throw new Error(`Merchant search failed (${res.status})`);
|
|
405
|
+
return res.json();
|
|
406
|
+
};
|
|
387
407
|
|
|
388
408
|
// -- Upload machinery ----------------------------------------------------------
|
|
389
409
|
// Inertia visits cannot stream per-file progress for a background queue, so
|
|
@@ -456,10 +476,12 @@ export function provideUploadCenter(): UploadCenterContext {
|
|
|
456
476
|
|
|
457
477
|
// -- Peek grammar ----------------------------------------------------------------
|
|
458
478
|
// peekX opens a fresh stack (from the list); stackX drills down (from a peek).
|
|
459
|
-
const peekReceipt = (id: string
|
|
460
|
-
|
|
479
|
+
const peekReceipt = (id: string, title: string) =>
|
|
480
|
+
shell.peek({ type: 'receipt', id, title });
|
|
481
|
+
const stackReceipt = (id: string, title: string) =>
|
|
482
|
+
shell.stackItem({ type: 'receipt', id, title });
|
|
461
483
|
const stackMerchant = (name: string) =>
|
|
462
|
-
shell.
|
|
484
|
+
shell.stackItem({ type: 'merchant', name, title: name });
|
|
463
485
|
|
|
464
486
|
// -- Actions --------------------------------------------------------------------
|
|
465
487
|
const updateReceipt = async (receipt: Receipt, patch: ReceiptPatch) => {
|
|
@@ -471,6 +493,7 @@ export function provideUploadCenter(): UploadCenterContext {
|
|
|
471
493
|
toast({
|
|
472
494
|
title: `Could not save ${receipt.filename}. Changes were reverted.`,
|
|
473
495
|
variant: 'destructive',
|
|
496
|
+
icon: 'lucide:circle-x',
|
|
474
497
|
});
|
|
475
498
|
}
|
|
476
499
|
};
|
|
@@ -481,6 +504,7 @@ export function provideUploadCenter(): UploadCenterContext {
|
|
|
481
504
|
toast({
|
|
482
505
|
title: `${receipt.merchant ?? receipt.filename} submitted for approval.`,
|
|
483
506
|
variant: 'success',
|
|
507
|
+
icon: 'lucide:circle-check',
|
|
484
508
|
});
|
|
485
509
|
};
|
|
486
510
|
|
|
@@ -490,6 +514,7 @@ export function provideUploadCenter(): UploadCenterContext {
|
|
|
490
514
|
toast({
|
|
491
515
|
title: `${readyCount.value} receipts submitted for approval.`,
|
|
492
516
|
variant: 'success',
|
|
517
|
+
icon: 'lucide:circle-check',
|
|
493
518
|
});
|
|
494
519
|
};
|
|
495
520
|
|
|
@@ -504,7 +529,11 @@ export function provideUploadCenter(): UploadCenterContext {
|
|
|
504
529
|
if (!ok) return false;
|
|
505
530
|
await visit('delete', `/receipts/${receipt.id}`);
|
|
506
531
|
refresh();
|
|
507
|
-
toast({
|
|
532
|
+
toast({
|
|
533
|
+
title: `${receipt.filename} removed.`,
|
|
534
|
+
variant: 'success',
|
|
535
|
+
icon: 'lucide:circle-check',
|
|
536
|
+
});
|
|
508
537
|
return true;
|
|
509
538
|
};
|
|
510
539
|
|
|
@@ -532,6 +561,7 @@ export function provideUploadCenter(): UploadCenterContext {
|
|
|
532
561
|
toast({
|
|
533
562
|
title: `${count} receipts filed under ${category?.name ?? 'the selected category'}.`,
|
|
534
563
|
variant: 'success',
|
|
564
|
+
icon: 'lucide:circle-check',
|
|
535
565
|
});
|
|
536
566
|
};
|
|
537
567
|
|
|
@@ -548,7 +578,11 @@ export function provideUploadCenter(): UploadCenterContext {
|
|
|
548
578
|
await visit('post', '/receipts/bulk/delete', bulkPayload());
|
|
549
579
|
table.resetSelection();
|
|
550
580
|
refresh();
|
|
551
|
-
toast({
|
|
581
|
+
toast({
|
|
582
|
+
title: `${count} receipts removed.`,
|
|
583
|
+
variant: 'success',
|
|
584
|
+
icon: 'lucide:circle-check',
|
|
585
|
+
});
|
|
552
586
|
};
|
|
553
587
|
|
|
554
588
|
const ctx: UploadCenterContext = {
|
|
@@ -592,7 +626,7 @@ export function useUploadCenter(): UploadCenterContext {
|
|
|
592
626
|
### Index.vue — the assembly
|
|
593
627
|
|
|
594
628
|
```vue
|
|
595
|
-
<!-- UploadCenter/Index.vue -->
|
|
629
|
+
<!-- pages/UploadCenter/Index.vue -->
|
|
596
630
|
<template>
|
|
597
631
|
<PageShell>
|
|
598
632
|
<!-- Topbar: breadcrumbs left, page search + submit-all right. -->
|
|
@@ -603,9 +637,9 @@ export function useUploadCenter(): UploadCenterContext {
|
|
|
603
637
|
<BbBreadcrumbs
|
|
604
638
|
class="min-w-0 flex-auto"
|
|
605
639
|
:items="[
|
|
606
|
-
{
|
|
607
|
-
{
|
|
608
|
-
{
|
|
640
|
+
{ value: 'dashboard', label: 'Dashboard', href: '/dashboard' },
|
|
641
|
+
{ value: 'expenses', label: 'Expenses', href: '/expenses' },
|
|
642
|
+
{ value: 'receipts', label: 'Receipts' },
|
|
609
643
|
]"
|
|
610
644
|
/>
|
|
611
645
|
<div class="flex shrink-0 items-center gap-2">
|
|
@@ -651,33 +685,33 @@ export function useUploadCenter(): UploadCenterContext {
|
|
|
651
685
|
<BbTabs
|
|
652
686
|
v-model="ctx.tab.value"
|
|
653
687
|
compact
|
|
654
|
-
navigation
|
|
655
|
-
preserve-scroll
|
|
656
|
-
preserve-state
|
|
657
|
-
replace
|
|
658
688
|
:items="[
|
|
659
689
|
{
|
|
660
|
-
|
|
690
|
+
value: 'drafts',
|
|
661
691
|
label: `Drafts · ${ctx.tabCounts.value.drafts}`,
|
|
662
692
|
href: tabHref('drafts'),
|
|
663
693
|
server: true,
|
|
664
694
|
only: ['receipts', 'tabCounts', 'readyCount'],
|
|
665
695
|
},
|
|
666
696
|
{
|
|
667
|
-
|
|
697
|
+
value: 'submitted',
|
|
668
698
|
label: `Submitted · ${ctx.tabCounts.value.submitted}`,
|
|
669
699
|
href: tabHref('submitted'),
|
|
670
700
|
server: true,
|
|
671
701
|
only: ['receipts', 'tabCounts', 'readyCount'],
|
|
672
702
|
},
|
|
673
703
|
{
|
|
674
|
-
|
|
704
|
+
value: 'reimbursed',
|
|
675
705
|
label: `Reimbursed · ${ctx.tabCounts.value.reimbursed}`,
|
|
676
706
|
href: tabHref('reimbursed'),
|
|
677
707
|
server: true,
|
|
678
708
|
only: ['receipts', 'tabCounts', 'readyCount'],
|
|
679
709
|
},
|
|
680
710
|
]"
|
|
711
|
+
navigation
|
|
712
|
+
preserve-scroll
|
|
713
|
+
preserve-state
|
|
714
|
+
replace
|
|
681
715
|
/>
|
|
682
716
|
|
|
683
717
|
<!-- No dependencies/items-fn: `receipts` is a page prop, `rows` merges
|
|
@@ -687,7 +721,6 @@ export function useUploadCenter(): UploadCenterContext {
|
|
|
687
721
|
v-model="ctx.table.selected.value"
|
|
688
722
|
v-model:select-all="ctx.table.all.value"
|
|
689
723
|
v-model:unselected-items="ctx.table.unselected.value"
|
|
690
|
-
actions
|
|
691
724
|
caption="Expense receipts"
|
|
692
725
|
:columns="columns"
|
|
693
726
|
compact
|
|
@@ -708,18 +741,18 @@ export function useUploadCenter(): UploadCenterContext {
|
|
|
708
741
|
<MerchantCell v-if="isDraft(item)" :receipt="item" />
|
|
709
742
|
<span
|
|
710
743
|
v-else-if="item.kind === 'upload'"
|
|
711
|
-
class="text-
|
|
744
|
+
class="text-(--bb-text-muted)"
|
|
712
745
|
>—</span
|
|
713
746
|
>
|
|
714
747
|
<span v-else>{{ item.merchant ?? '—' }}</span>
|
|
715
748
|
</template>
|
|
716
749
|
|
|
717
750
|
<!-- Slot names are normalized: `categoryId` → `#categoryid`. -->
|
|
718
|
-
<template #
|
|
751
|
+
<template #category-id="{ item }">
|
|
719
752
|
<CategoryCell v-if="isDraft(item)" :receipt="item" />
|
|
720
753
|
<span
|
|
721
754
|
v-else-if="item.kind === 'upload'"
|
|
722
|
-
class="text-
|
|
755
|
+
class="text-(--bb-text-muted)"
|
|
723
756
|
>—</span
|
|
724
757
|
>
|
|
725
758
|
<span v-else>{{ categoryName(item.categoryId) }}</span>
|
|
@@ -729,7 +762,7 @@ export function useUploadCenter(): UploadCenterContext {
|
|
|
729
762
|
<AmountCell v-if="isDraft(item)" :receipt="item" />
|
|
730
763
|
<span
|
|
731
764
|
v-else-if="item.kind === 'upload'"
|
|
732
|
-
class="text-
|
|
765
|
+
class="text-(--bb-text-muted)"
|
|
733
766
|
>—</span
|
|
734
767
|
>
|
|
735
768
|
<span v-else>{{
|
|
@@ -741,7 +774,7 @@ export function useUploadCenter(): UploadCenterContext {
|
|
|
741
774
|
<DateCell v-if="isDraft(item)" :receipt="item" />
|
|
742
775
|
<span
|
|
743
776
|
v-else-if="item.kind === 'upload'"
|
|
744
|
-
class="text-
|
|
777
|
+
class="text-(--bb-text-muted)"
|
|
745
778
|
>—</span
|
|
746
779
|
>
|
|
747
780
|
<span v-else>{{ item.date ? shortDate(item.date) : '—' }}</span>
|
|
@@ -759,11 +792,11 @@ export function useUploadCenter(): UploadCenterContext {
|
|
|
759
792
|
<RowActions :row="item" />
|
|
760
793
|
</template>
|
|
761
794
|
|
|
762
|
-
<template #
|
|
795
|
+
<template #empty>
|
|
763
796
|
<div class="flex flex-col items-center gap-2 p-8 text-center">
|
|
764
797
|
<BbIcon
|
|
765
798
|
aria-hidden="true"
|
|
766
|
-
class="text-
|
|
799
|
+
class="text-(--bb-text-muted)"
|
|
767
800
|
:icon="
|
|
768
801
|
ctx.hasActiveFilters.value
|
|
769
802
|
? 'lucide:search-x'
|
|
@@ -780,7 +813,7 @@ export function useUploadCenter(): UploadCenterContext {
|
|
|
780
813
|
: 'Nothing in this tab yet'
|
|
781
814
|
}}
|
|
782
815
|
</p>
|
|
783
|
-
<p class="text-xs text-
|
|
816
|
+
<p class="text-xs text-(--bb-text-muted)">
|
|
784
817
|
{{
|
|
785
818
|
ctx.hasActiveFilters.value
|
|
786
819
|
? 'Loosen a filter above, or switch tabs to widen the view.'
|
|
@@ -812,6 +845,7 @@ export function useUploadCenter(): UploadCenterContext {
|
|
|
812
845
|
<SelectionBar />
|
|
813
846
|
|
|
814
847
|
<!-- Stacked peek sidebar: the shell owns back/close; we render by type. -->
|
|
848
|
+
<template #sidebar-title>{{ ctx.shell.current.value?.title }}</template>
|
|
815
849
|
<template #sidebar>
|
|
816
850
|
<ReceiptPeek
|
|
817
851
|
v-if="ctx.shell.current.value?.type === 'receipt'"
|
|
@@ -839,7 +873,7 @@ import {
|
|
|
839
873
|
} from 'bitboss-ui';
|
|
840
874
|
import qs from 'query-string';
|
|
841
875
|
import PageShell from '@/components/layout/PageShell.vue';
|
|
842
|
-
import { useQuery } from '@/composables/useQuery';
|
|
876
|
+
import { useQuery } from '@/composables/inertia-helpers/useQuery';
|
|
843
877
|
import {
|
|
844
878
|
provideUploadCenter,
|
|
845
879
|
STATUS_LABEL,
|
|
@@ -920,7 +954,7 @@ const submitLabel = computed(() =>
|
|
|
920
954
|
### ReceiptDropzone.vue
|
|
921
955
|
|
|
922
956
|
```vue
|
|
923
|
-
<!-- UploadCenter/ReceiptDropzone.vue -->
|
|
957
|
+
<!-- pages/UploadCenter/ReceiptDropzone.vue -->
|
|
924
958
|
<template>
|
|
925
959
|
<BbDropzone
|
|
926
960
|
v-model="pending"
|
|
@@ -933,21 +967,21 @@ const submitLabel = computed(() =>
|
|
|
933
967
|
>
|
|
934
968
|
<template #default="{ dragging, focused, open }">
|
|
935
969
|
<div
|
|
936
|
-
class="flex flex-col items-center gap-2 rounded-
|
|
970
|
+
class="flex flex-col items-center gap-2 rounded-(--bb-radius) border-2 border-dashed p-6 text-center transition-colors"
|
|
937
971
|
:class="[
|
|
938
|
-
dragging ? 'border-
|
|
939
|
-
focused ? 'ring-2 ring-
|
|
972
|
+
dragging ? 'border-(--bb-primary)' : 'border-(--bb-border)',
|
|
973
|
+
focused ? 'ring-2 ring-(--bb-primary) ring-offset-2' : '',
|
|
940
974
|
]"
|
|
941
975
|
>
|
|
942
976
|
<BbIcon
|
|
943
|
-
class="text-
|
|
977
|
+
class="text-(--bb-text-muted)"
|
|
944
978
|
icon="lucide:receipt"
|
|
945
979
|
size="lg"
|
|
946
980
|
/>
|
|
947
981
|
<p class="text-sm font-medium">
|
|
948
982
|
{{ dragging ? 'Drop to add receipts' : 'Drop receipts here' }}
|
|
949
983
|
</p>
|
|
950
|
-
<p class="text-xs text-
|
|
984
|
+
<p class="text-xs text-(--bb-text-muted)">
|
|
951
985
|
JPG, PNG, HEIC or PDF · up to 10 MB each · 20 files per drop
|
|
952
986
|
</p>
|
|
953
987
|
<BbButton
|
|
@@ -1018,7 +1052,7 @@ const onError = (error: DropZoneError) => {
|
|
|
1018
1052
|
### FilterRail.vue
|
|
1019
1053
|
|
|
1020
1054
|
```vue
|
|
1021
|
-
<!-- UploadCenter/FilterRail.vue -->
|
|
1055
|
+
<!-- pages/UploadCenter/FilterRail.vue -->
|
|
1022
1056
|
<template>
|
|
1023
1057
|
<div class="flex flex-wrap items-center gap-2">
|
|
1024
1058
|
<!-- Category: multi-select pill over the coopted catalog. Searchable, so
|
|
@@ -1035,8 +1069,8 @@ const onError = (error: DropZoneError) => {
|
|
|
1035
1069
|
<template #activator="{ props }">
|
|
1036
1070
|
<BbButton
|
|
1037
1071
|
v-bind="props"
|
|
1038
|
-
aria-label="Filter by category"
|
|
1039
1072
|
append:icon="lucide:chevron-down"
|
|
1073
|
+
aria-label="Filter by category"
|
|
1040
1074
|
size="sm"
|
|
1041
1075
|
variant="outline"
|
|
1042
1076
|
>
|
|
@@ -1063,8 +1097,8 @@ const onError = (error: DropZoneError) => {
|
|
|
1063
1097
|
<template #activator="{ props }">
|
|
1064
1098
|
<BbButton
|
|
1065
1099
|
v-bind="props"
|
|
1066
|
-
aria-label="Filter by merchant"
|
|
1067
1100
|
append:icon="lucide:chevron-down"
|
|
1101
|
+
aria-label="Filter by merchant"
|
|
1068
1102
|
size="sm"
|
|
1069
1103
|
variant="outline"
|
|
1070
1104
|
>
|
|
@@ -1110,36 +1144,35 @@ const ctx = useUploadCenter();
|
|
|
1110
1144
|
### ReceiptFileCell.vue
|
|
1111
1145
|
|
|
1112
1146
|
```vue
|
|
1113
|
-
<!-- UploadCenter/ReceiptFileCell.vue -->
|
|
1147
|
+
<!-- pages/UploadCenter/ReceiptFileCell.vue -->
|
|
1114
1148
|
<template>
|
|
1115
1149
|
<div class="flex items-center gap-2">
|
|
1116
1150
|
<BbIcon
|
|
1117
|
-
class="shrink-0 text-
|
|
1151
|
+
class="shrink-0 text-(--bb-text-muted)"
|
|
1118
1152
|
:icon="fileIcon"
|
|
1119
1153
|
size="16"
|
|
1120
1154
|
/>
|
|
1121
1155
|
<div class="flex min-w-0 flex-col">
|
|
1122
|
-
<!-- Server receipts peek on click; queue rows are not peekable yet.
|
|
1123
|
-
|
|
1156
|
+
<!-- Server receipts peek on click; queue rows are not peekable yet.
|
|
1157
|
+
The filename is an inline link, not a button: `BbBaseButton` has
|
|
1158
|
+
no padding, so the name starts on the same edge as the size
|
|
1159
|
+
under it, and `.plain-link` keeps wrapped lines left-aligned. -->
|
|
1160
|
+
<BbBaseButton
|
|
1124
1161
|
v-if="row.kind === 'receipt'"
|
|
1125
|
-
class="
|
|
1126
|
-
|
|
1127
|
-
variant="link"
|
|
1128
|
-
@click="() => ctx.peekReceipt(row.id)"
|
|
1162
|
+
class="plain-link text-sm"
|
|
1163
|
+
@click="() => ctx.peekReceipt(row.id, row.filename)"
|
|
1129
1164
|
>
|
|
1130
1165
|
{{ row.filename }}
|
|
1131
|
-
</
|
|
1166
|
+
</BbBaseButton>
|
|
1132
1167
|
<span v-else class="truncate text-sm">{{ row.filename }}</span>
|
|
1133
|
-
<span class="text-xs text-
|
|
1134
|
-
formattedSize
|
|
1135
|
-
}}</span>
|
|
1168
|
+
<span class="text-xs text-(--bb-text-muted)">{{ formattedSize }}</span>
|
|
1136
1169
|
</div>
|
|
1137
1170
|
</div>
|
|
1138
1171
|
</template>
|
|
1139
1172
|
|
|
1140
1173
|
<script setup lang="ts">
|
|
1141
1174
|
import { computed } from 'vue';
|
|
1142
|
-
import {
|
|
1175
|
+
import { BbBaseButton, BbIcon } from 'bitboss-ui';
|
|
1143
1176
|
import { useUploadCenter, type UploadCenterRow } from './context';
|
|
1144
1177
|
|
|
1145
1178
|
const props = defineProps<{ row: UploadCenterRow }>();
|
|
@@ -1165,7 +1198,7 @@ const formattedSize = computed(() => {
|
|
|
1165
1198
|
### UploadProgressCell.vue
|
|
1166
1199
|
|
|
1167
1200
|
```vue
|
|
1168
|
-
<!-- UploadCenter/UploadProgressCell.vue -->
|
|
1201
|
+
<!-- pages/UploadCenter/UploadProgressCell.vue -->
|
|
1169
1202
|
<template>
|
|
1170
1203
|
<!-- In flight: a live bar. `upload.progress` is a reactive field mutated
|
|
1171
1204
|
by the context's progress callback — no refetch per tick. -->
|
|
@@ -1175,7 +1208,7 @@ const formattedSize = computed(() => {
|
|
|
1175
1208
|
class="flex-1"
|
|
1176
1209
|
:model-value="upload.progress"
|
|
1177
1210
|
/>
|
|
1178
|
-
<span class="text-xs
|
|
1211
|
+
<span class="text-xs text-(--bb-text-muted) tabular-nums"
|
|
1179
1212
|
>{{ upload.progress }}%</span
|
|
1180
1213
|
>
|
|
1181
1214
|
</div>
|
|
@@ -1210,7 +1243,7 @@ const ctx = useUploadCenter();
|
|
|
1210
1243
|
### MerchantCell.vue
|
|
1211
1244
|
|
|
1212
1245
|
```vue
|
|
1213
|
-
<!-- UploadCenter/MerchantCell.vue -->
|
|
1246
|
+
<!-- pages/UploadCenter/MerchantCell.vue -->
|
|
1214
1247
|
<template>
|
|
1215
1248
|
<BbTextInput
|
|
1216
1249
|
v-model="draft"
|
|
@@ -1218,6 +1251,7 @@ const ctx = useUploadCenter();
|
|
|
1218
1251
|
hide-label
|
|
1219
1252
|
label="Merchant"
|
|
1220
1253
|
placeholder="Add merchant"
|
|
1254
|
+
variant="ghost"
|
|
1221
1255
|
@change="commit"
|
|
1222
1256
|
@keydown.esc="revert"
|
|
1223
1257
|
/>
|
|
@@ -1233,7 +1267,7 @@ const props = defineProps<{ receipt: Receipt }>();
|
|
|
1233
1267
|
|
|
1234
1268
|
const ctx = useUploadCenter();
|
|
1235
1269
|
|
|
1236
|
-
// Inline-edit doctrine
|
|
1270
|
+
// Inline-edit doctrine: a local draft, commit on @change — which
|
|
1237
1271
|
// fires once for the whole blur/Enter sequence, unlike binding @blur AND
|
|
1238
1272
|
// @keydown.enter separately (that double-fires: Enter commits, then the
|
|
1239
1273
|
// field still blurs right after). Revert on Esc. The server value re-seeds
|
|
@@ -1261,7 +1295,7 @@ const revert = () => {
|
|
|
1261
1295
|
### CategoryCell.vue
|
|
1262
1296
|
|
|
1263
1297
|
```vue
|
|
1264
|
-
<!-- UploadCenter/CategoryCell.vue -->
|
|
1298
|
+
<!-- pages/UploadCenter/CategoryCell.vue -->
|
|
1265
1299
|
<template>
|
|
1266
1300
|
<BbSelectPopover
|
|
1267
1301
|
compact
|
|
@@ -1273,8 +1307,8 @@ const revert = () => {
|
|
|
1273
1307
|
width="220px"
|
|
1274
1308
|
@update:model-value="(categoryId) => pick(categoryId as string)"
|
|
1275
1309
|
>
|
|
1276
|
-
<template #activator="{ props: activatorProps
|
|
1277
|
-
<!-- One-click pattern
|
|
1310
|
+
<template #activator="{ props: activatorProps }">
|
|
1311
|
+
<!-- One-click pattern: the badge is the focusable trigger —
|
|
1278
1312
|
BbBadgeButton takes over the badge body, the trailing chevron says
|
|
1279
1313
|
"this can change", and while the save runs `loading` swaps the
|
|
1280
1314
|
spinner into the chevron's place. A category is a label, not a
|
|
@@ -1283,7 +1317,6 @@ const revert = () => {
|
|
|
1283
1317
|
quieter to-dos, not values. -->
|
|
1284
1318
|
<BbBadge
|
|
1285
1319
|
append:icon="lucide:chevron-down"
|
|
1286
|
-
:class="{ 'category-cell--open': shown }"
|
|
1287
1320
|
:loading="saving"
|
|
1288
1321
|
:variant="receipt.categoryId ? 'secondary' : 'outline'"
|
|
1289
1322
|
>
|
|
@@ -1327,22 +1360,12 @@ const categoryName = computed(
|
|
|
1327
1360
|
)?.name ?? 'Set category'
|
|
1328
1361
|
);
|
|
1329
1362
|
</script>
|
|
1330
|
-
|
|
1331
|
-
<style scoped>
|
|
1332
|
-
/* Open = the badge's own hue, deepened, plus its variant ring — the same
|
|
1333
|
-
grammar as every badge-activator cell. */
|
|
1334
|
-
.category-cell--open {
|
|
1335
|
-
--bg: color-mix(in oklab, var(--color) 24%, var(--bb-panel));
|
|
1336
|
-
--border-color: color-mix(in oklab, var(--color) 45%, var(--bb-panel));
|
|
1337
|
-
box-shadow: 0 0 0 var(--bb-ring-size) var(--ring);
|
|
1338
|
-
}
|
|
1339
|
-
</style>
|
|
1340
1363
|
```
|
|
1341
1364
|
|
|
1342
1365
|
### AmountCell.vue
|
|
1343
1366
|
|
|
1344
1367
|
```vue
|
|
1345
|
-
<!-- UploadCenter/AmountCell.vue -->
|
|
1368
|
+
<!-- pages/UploadCenter/AmountCell.vue -->
|
|
1346
1369
|
<template>
|
|
1347
1370
|
<BbNumberInput
|
|
1348
1371
|
v-model="draft"
|
|
@@ -1351,7 +1374,9 @@ const categoryName = computed(
|
|
|
1351
1374
|
label="Amount"
|
|
1352
1375
|
:max-precision="2"
|
|
1353
1376
|
:min="0"
|
|
1377
|
+
:min-precision="2"
|
|
1354
1378
|
placeholder="0.00"
|
|
1379
|
+
variant="ghost"
|
|
1355
1380
|
@change="commit"
|
|
1356
1381
|
@keydown.esc="revert"
|
|
1357
1382
|
>
|
|
@@ -1369,32 +1394,24 @@ const props = defineProps<{ receipt: Receipt }>();
|
|
|
1369
1394
|
|
|
1370
1395
|
const ctx = useUploadCenter();
|
|
1371
1396
|
|
|
1372
|
-
|
|
1373
|
-
|
|
1374
|
-
|
|
1375
|
-
|
|
1376
|
-
|
|
1377
|
-
// commit on @change, not @blur + @keydown.enter (see MerchantCell.vue).
|
|
1378
|
-
const draft = ref<number | string | null>(formatMoney(props.receipt.amount));
|
|
1397
|
+
// Money cells always show two decimals (`min-precision`), so the column
|
|
1398
|
+
// optically aligns. Same commit/revert contract as the merchant cell, on the
|
|
1399
|
+
// number model — commit on @change, not @blur + @keydown.enter (see
|
|
1400
|
+
// MerchantCell.vue).
|
|
1401
|
+
const draft = ref<number | null>(props.receipt.amount);
|
|
1379
1402
|
watch(
|
|
1380
1403
|
() => props.receipt.amount,
|
|
1381
1404
|
(value) => {
|
|
1382
|
-
draft.value =
|
|
1405
|
+
draft.value = value;
|
|
1383
1406
|
}
|
|
1384
1407
|
);
|
|
1385
1408
|
|
|
1386
1409
|
const commit = () => {
|
|
1387
|
-
|
|
1388
|
-
|
|
1389
|
-
if (amount === props.receipt.amount) {
|
|
1390
|
-
draft.value = formatMoney(props.receipt.amount);
|
|
1391
|
-
return;
|
|
1392
|
-
}
|
|
1393
|
-
void ctx.updateReceipt(props.receipt, { amount });
|
|
1394
|
-
draft.value = formatMoney(amount);
|
|
1410
|
+
if (draft.value === props.receipt.amount) return;
|
|
1411
|
+
void ctx.updateReceipt(props.receipt, { amount: draft.value });
|
|
1395
1412
|
};
|
|
1396
1413
|
const revert = () => {
|
|
1397
|
-
draft.value =
|
|
1414
|
+
draft.value = props.receipt.amount;
|
|
1398
1415
|
};
|
|
1399
1416
|
</script>
|
|
1400
1417
|
```
|
|
@@ -1402,7 +1419,7 @@ const revert = () => {
|
|
|
1402
1419
|
### DateCell.vue
|
|
1403
1420
|
|
|
1404
1421
|
```vue
|
|
1405
|
-
<!-- UploadCenter/DateCell.vue -->
|
|
1422
|
+
<!-- pages/UploadCenter/DateCell.vue -->
|
|
1406
1423
|
<template>
|
|
1407
1424
|
<!-- Picking a date IS the commit — no blur dance for calendar input.
|
|
1408
1425
|
`floating` keeps the model a plain YYYY-MM-DD string. -->
|
|
@@ -1413,6 +1430,7 @@ const revert = () => {
|
|
|
1413
1430
|
label="Expense date"
|
|
1414
1431
|
:model-value="receipt.date"
|
|
1415
1432
|
placeholder="YYYY-MM-DD"
|
|
1433
|
+
variant="ghost"
|
|
1416
1434
|
@update:model-value="commit"
|
|
1417
1435
|
/>
|
|
1418
1436
|
</template>
|
|
@@ -1437,7 +1455,7 @@ const commit = (value: string | string[] | null) => {
|
|
|
1437
1455
|
### RowActions.vue
|
|
1438
1456
|
|
|
1439
1457
|
```vue
|
|
1440
|
-
<!-- UploadCenter/RowActions.vue -->
|
|
1458
|
+
<!-- pages/UploadCenter/RowActions.vue -->
|
|
1441
1459
|
<template>
|
|
1442
1460
|
<!-- Queue rows: one explicit remove (aborts the transfer). -->
|
|
1443
1461
|
<BbButton
|
|
@@ -1476,8 +1494,8 @@ const items = computed(() => {
|
|
|
1476
1494
|
...(isDraft
|
|
1477
1495
|
? [
|
|
1478
1496
|
{
|
|
1479
|
-
|
|
1480
|
-
|
|
1497
|
+
value: 'submit',
|
|
1498
|
+
label: 'Submit for approval',
|
|
1481
1499
|
'prepend:icon': 'lucide:send',
|
|
1482
1500
|
onClick: () => ctx.submitReceipt(receipt),
|
|
1483
1501
|
},
|
|
@@ -1488,8 +1506,8 @@ const items = computed(() => {
|
|
|
1488
1506
|
// BbButton to render a plain anchor instead of letting Inertia
|
|
1489
1507
|
// intercept this same-origin `href` as a visit (see BbBaseButton's
|
|
1490
1508
|
// routing rules).
|
|
1491
|
-
|
|
1492
|
-
|
|
1509
|
+
value: 'download',
|
|
1510
|
+
label: 'Download original',
|
|
1493
1511
|
'prepend:icon': 'lucide:download',
|
|
1494
1512
|
href: `/receipts/${receipt.id}/file`,
|
|
1495
1513
|
target: '_blank',
|
|
@@ -1497,8 +1515,8 @@ const items = computed(() => {
|
|
|
1497
1515
|
...(isDraft
|
|
1498
1516
|
? [
|
|
1499
1517
|
{
|
|
1500
|
-
|
|
1501
|
-
|
|
1518
|
+
value: 'remove',
|
|
1519
|
+
label: 'Remove',
|
|
1502
1520
|
'prepend:icon': 'lucide:trash-2',
|
|
1503
1521
|
variant: 'destructive' as const,
|
|
1504
1522
|
onClick: () => ctx.deleteReceipt(receipt),
|
|
@@ -1513,10 +1531,10 @@ const items = computed(() => {
|
|
|
1513
1531
|
### SelectionBar.vue
|
|
1514
1532
|
|
|
1515
1533
|
```vue
|
|
1516
|
-
<!-- UploadCenter/SelectionBar.vue -->
|
|
1534
|
+
<!-- pages/UploadCenter/SelectionBar.vue -->
|
|
1517
1535
|
<template>
|
|
1518
1536
|
<FloatingBottomPanel :open="selectedCount > 0">
|
|
1519
|
-
<span class="px-2 text-sm text-
|
|
1537
|
+
<span class="px-2 text-sm text-(--bb-text-muted)">
|
|
1520
1538
|
<span class="font-semibold tabular-nums">{{ selectedCount }}</span>
|
|
1521
1539
|
selected
|
|
1522
1540
|
</span>
|
|
@@ -1585,7 +1603,7 @@ const selectedCount = computed(() =>
|
|
|
1585
1603
|
### ReceiptPeek.vue
|
|
1586
1604
|
|
|
1587
1605
|
```vue
|
|
1588
|
-
<!-- UploadCenter/ReceiptPeek.vue -->
|
|
1606
|
+
<!-- pages/UploadCenter/ReceiptPeek.vue -->
|
|
1589
1607
|
<template>
|
|
1590
1608
|
<div v-if="receipt" class="flex flex-col gap-4 text-sm">
|
|
1591
1609
|
<!-- Header: merchant identity + amount + status. The merchant name
|
|
@@ -1600,9 +1618,7 @@ const selectedCount = computed(() =>
|
|
|
1600
1618
|
>
|
|
1601
1619
|
{{ receipt.merchant }}
|
|
1602
1620
|
</BbButton>
|
|
1603
|
-
<span v-else class="text-
|
|
1604
|
-
>No merchant yet</span
|
|
1605
|
-
>
|
|
1621
|
+
<span v-else class="text-(--bb-text-muted)">No merchant yet</span>
|
|
1606
1622
|
<BbBadge :variant="STATUS_VARIANT[receipt.status]">{{
|
|
1607
1623
|
STATUS_LABEL[receipt.status]
|
|
1608
1624
|
}}</BbBadge>
|
|
@@ -1614,7 +1630,7 @@ const selectedCount = computed(() =>
|
|
|
1614
1630
|
: currency.format(receipt.amount)
|
|
1615
1631
|
}}
|
|
1616
1632
|
</p>
|
|
1617
|
-
<p class="text-xs text-
|
|
1633
|
+
<p class="text-xs text-(--bb-text-muted)">
|
|
1618
1634
|
{{ receipt.filename }} · spent
|
|
1619
1635
|
{{ receipt.date ? longDate(receipt.date) : '—' }}
|
|
1620
1636
|
</p>
|
|
@@ -1622,7 +1638,7 @@ const selectedCount = computed(() =>
|
|
|
1622
1638
|
|
|
1623
1639
|
<!-- Preview placeholder: the real app renders the scanned image here. -->
|
|
1624
1640
|
<div
|
|
1625
|
-
class="flex h-44 flex-col items-center justify-center gap-1 rounded-
|
|
1641
|
+
class="flex h-44 flex-col items-center justify-center gap-1 rounded-(--bb-radius) border bg-(--bb-panel) text-(--bb-text-muted)"
|
|
1626
1642
|
>
|
|
1627
1643
|
<BbIcon icon="lucide:receipt" size="lg" />
|
|
1628
1644
|
<span class="text-xs">Receipt preview</span>
|
|
@@ -1632,7 +1648,7 @@ const selectedCount = computed(() =>
|
|
|
1632
1648
|
<section class="flex flex-col gap-1.5">
|
|
1633
1649
|
<div class="flex items-center justify-between">
|
|
1634
1650
|
<h3
|
|
1635
|
-
class="text-xs font-semibold
|
|
1651
|
+
class="text-xs font-semibold tracking-wide text-(--bb-text-muted) uppercase"
|
|
1636
1652
|
>
|
|
1637
1653
|
Extracted fields
|
|
1638
1654
|
</h3>
|
|
@@ -1641,9 +1657,9 @@ const selectedCount = computed(() =>
|
|
|
1641
1657
|
}}</BbBadge>
|
|
1642
1658
|
</div>
|
|
1643
1659
|
<dl class="grid grid-cols-[auto_1fr] gap-x-4 gap-y-1.5">
|
|
1644
|
-
<dt class="text-
|
|
1660
|
+
<dt class="text-(--bb-text-muted)">Merchant</dt>
|
|
1645
1661
|
<dd>{{ receipt.extracted.merchant ?? '—' }}</dd>
|
|
1646
|
-
<dt class="text-
|
|
1662
|
+
<dt class="text-(--bb-text-muted)">Total</dt>
|
|
1647
1663
|
<dd>
|
|
1648
1664
|
{{
|
|
1649
1665
|
receipt.extracted.total === null
|
|
@@ -1651,7 +1667,7 @@ const selectedCount = computed(() =>
|
|
|
1651
1667
|
: currency.format(receipt.extracted.total)
|
|
1652
1668
|
}}
|
|
1653
1669
|
</dd>
|
|
1654
|
-
<dt class="text-
|
|
1670
|
+
<dt class="text-(--bb-text-muted)">Tax</dt>
|
|
1655
1671
|
<dd>
|
|
1656
1672
|
{{
|
|
1657
1673
|
receipt.extracted.tax === null
|
|
@@ -1659,11 +1675,11 @@ const selectedCount = computed(() =>
|
|
|
1659
1675
|
: currency.format(receipt.extracted.tax)
|
|
1660
1676
|
}}
|
|
1661
1677
|
</dd>
|
|
1662
|
-
<dt class="text-
|
|
1678
|
+
<dt class="text-(--bb-text-muted)">Date</dt>
|
|
1663
1679
|
<dd>
|
|
1664
1680
|
{{ receipt.extracted.date ? longDate(receipt.extracted.date) : '—' }}
|
|
1665
1681
|
</dd>
|
|
1666
|
-
<dt class="text-
|
|
1682
|
+
<dt class="text-(--bb-text-muted)">Paid with</dt>
|
|
1667
1683
|
<dd>{{ receipt.extracted.paymentMethod ?? '—' }}</dd>
|
|
1668
1684
|
</dl>
|
|
1669
1685
|
</section>
|
|
@@ -1672,16 +1688,16 @@ const selectedCount = computed(() =>
|
|
|
1672
1688
|
one-click cell as in the table. -->
|
|
1673
1689
|
<section class="flex flex-col gap-1.5">
|
|
1674
1690
|
<h3
|
|
1675
|
-
class="text-xs font-semibold
|
|
1691
|
+
class="text-xs font-semibold tracking-wide text-(--bb-text-muted) uppercase"
|
|
1676
1692
|
>
|
|
1677
1693
|
Details
|
|
1678
1694
|
</h3>
|
|
1679
1695
|
<dl class="grid grid-cols-[auto_1fr] items-center gap-x-4 gap-y-1.5">
|
|
1680
|
-
<dt class="text-
|
|
1696
|
+
<dt class="text-(--bb-text-muted)">Category</dt>
|
|
1681
1697
|
<dd><CategoryCell :receipt="receipt" /></dd>
|
|
1682
|
-
<dt class="text-
|
|
1698
|
+
<dt class="text-(--bb-text-muted)">Uploaded</dt>
|
|
1683
1699
|
<dd>{{ longDate(receipt.uploadedAt) }}</dd>
|
|
1684
|
-
<dt class="text-
|
|
1700
|
+
<dt class="text-(--bb-text-muted)">Report</dt>
|
|
1685
1701
|
<dd>{{ receipt.reportName ?? 'Not on a report yet' }}</dd>
|
|
1686
1702
|
</dl>
|
|
1687
1703
|
</section>
|
|
@@ -1689,7 +1705,7 @@ const selectedCount = computed(() =>
|
|
|
1689
1705
|
<!-- Activity feed. -->
|
|
1690
1706
|
<section class="flex flex-col gap-1.5">
|
|
1691
1707
|
<h3
|
|
1692
|
-
class="text-xs font-semibold
|
|
1708
|
+
class="text-xs font-semibold tracking-wide text-(--bb-text-muted) uppercase"
|
|
1693
1709
|
>
|
|
1694
1710
|
Activity
|
|
1695
1711
|
</h3>
|
|
@@ -1700,13 +1716,13 @@ const selectedCount = computed(() =>
|
|
|
1700
1716
|
class="flex gap-2"
|
|
1701
1717
|
>
|
|
1702
1718
|
<BbIcon
|
|
1703
|
-
class="mt-0.5 shrink-0 text-
|
|
1719
|
+
class="mt-0.5 shrink-0 text-(--bb-text-muted)"
|
|
1704
1720
|
:icon="entry.icon"
|
|
1705
1721
|
size="14"
|
|
1706
1722
|
/>
|
|
1707
1723
|
<div class="flex flex-col">
|
|
1708
1724
|
<span>{{ entry.text }}</span>
|
|
1709
|
-
<span class="text-xs text-
|
|
1725
|
+
<span class="text-xs text-(--bb-text-muted)"
|
|
1710
1726
|
>{{ entry.actor }} · {{ longDate(entry.at) }}</span
|
|
1711
1727
|
>
|
|
1712
1728
|
</div>
|
|
@@ -1757,7 +1773,7 @@ const selectedCount = computed(() =>
|
|
|
1757
1773
|
<script setup lang="ts">
|
|
1758
1774
|
import { watch } from 'vue';
|
|
1759
1775
|
import { BbBadge, BbButton, BbIcon, BbSpinner } from 'bitboss-ui';
|
|
1760
|
-
import { useResourceContext } from '@/composables/useResourceContext';
|
|
1776
|
+
import { useResourceContext } from '@/composables/inertia-helpers/useResourceContext';
|
|
1761
1777
|
import CategoryCell from './CategoryCell.vue';
|
|
1762
1778
|
import { STATUS_LABEL, STATUS_VARIANT, useUploadCenter } from './context';
|
|
1763
1779
|
import type { ReceiptDetail } from '@/types';
|
|
@@ -1799,22 +1815,18 @@ const longDate = (value: string) =>
|
|
|
1799
1815
|
### MerchantPeek.vue
|
|
1800
1816
|
|
|
1801
1817
|
```vue
|
|
1802
|
-
<!-- UploadCenter/MerchantPeek.vue -->
|
|
1818
|
+
<!-- pages/UploadCenter/MerchantPeek.vue -->
|
|
1803
1819
|
<template>
|
|
1804
1820
|
<div v-if="merchant" class="flex flex-col gap-4 text-sm">
|
|
1805
1821
|
<header class="flex items-center gap-3">
|
|
1806
1822
|
<div
|
|
1807
|
-
class="grid h-9 w-9 shrink-0 place-items-center rounded-
|
|
1823
|
+
class="grid h-9 w-9 shrink-0 place-items-center rounded-(--bb-radius) border"
|
|
1808
1824
|
>
|
|
1809
|
-
<BbIcon
|
|
1810
|
-
class="text-[color:var(--bb-text-muted)]"
|
|
1811
|
-
icon="lucide:store"
|
|
1812
|
-
size="18"
|
|
1813
|
-
/>
|
|
1825
|
+
<BbIcon class="text-(--bb-text-muted)" icon="lucide:store" size="18" />
|
|
1814
1826
|
</div>
|
|
1815
1827
|
<div class="flex flex-col">
|
|
1816
1828
|
<h2 class="text-base font-semibold">{{ merchant.name }}</h2>
|
|
1817
|
-
<p class="text-xs text-
|
|
1829
|
+
<p class="text-xs text-(--bb-text-muted)">
|
|
1818
1830
|
{{ merchant.defaultCategoryName }} · this year
|
|
1819
1831
|
</p>
|
|
1820
1832
|
</div>
|
|
@@ -1822,16 +1834,16 @@ const longDate = (value: string) =>
|
|
|
1822
1834
|
|
|
1823
1835
|
<!-- Stat strip. -->
|
|
1824
1836
|
<div class="grid grid-cols-3 gap-2">
|
|
1825
|
-
<div class="rounded-
|
|
1826
|
-
<p class="text-xs text-
|
|
1837
|
+
<div class="rounded-(--bb-radius) border p-2">
|
|
1838
|
+
<p class="text-xs text-(--bb-text-muted)">Total spent</p>
|
|
1827
1839
|
<p class="font-semibold">{{ currency.format(merchant.totalSpent) }}</p>
|
|
1828
1840
|
</div>
|
|
1829
|
-
<div class="rounded-
|
|
1830
|
-
<p class="text-xs text-
|
|
1841
|
+
<div class="rounded-(--bb-radius) border p-2">
|
|
1842
|
+
<p class="text-xs text-(--bb-text-muted)">Receipts</p>
|
|
1831
1843
|
<p class="font-semibold">{{ merchant.receiptCount }}</p>
|
|
1832
1844
|
</div>
|
|
1833
|
-
<div class="rounded-
|
|
1834
|
-
<p class="text-xs text-
|
|
1845
|
+
<div class="rounded-(--bb-radius) border p-2">
|
|
1846
|
+
<p class="text-xs text-(--bb-text-muted)">Average</p>
|
|
1835
1847
|
<p class="font-semibold">
|
|
1836
1848
|
{{ currency.format(merchant.averageAmount) }}
|
|
1837
1849
|
</p>
|
|
@@ -1841,7 +1853,7 @@ const longDate = (value: string) =>
|
|
|
1841
1853
|
<!-- Recent receipts: names drill down again — the stack keeps growing. -->
|
|
1842
1854
|
<section class="flex flex-col gap-1.5">
|
|
1843
1855
|
<h3
|
|
1844
|
-
class="text-xs font-semibold
|
|
1856
|
+
class="text-xs font-semibold tracking-wide text-(--bb-text-muted) uppercase"
|
|
1845
1857
|
>
|
|
1846
1858
|
Recent receipts
|
|
1847
1859
|
</h3>
|
|
@@ -1854,14 +1866,14 @@ const longDate = (value: string) =>
|
|
|
1854
1866
|
<BbButton
|
|
1855
1867
|
size="sm"
|
|
1856
1868
|
variant="link"
|
|
1857
|
-
@click="() => ctx.stackReceipt(recent.id)"
|
|
1869
|
+
@click="() => ctx.stackReceipt(recent.id, recent.filename)"
|
|
1858
1870
|
>
|
|
1859
1871
|
{{ recent.filename }}
|
|
1860
1872
|
</BbButton>
|
|
1861
1873
|
<BbBadge :variant="STATUS_VARIANT[recent.status]">{{
|
|
1862
1874
|
STATUS_LABEL[recent.status]
|
|
1863
1875
|
}}</BbBadge>
|
|
1864
|
-
<span class="text-xs
|
|
1876
|
+
<span class="text-xs text-(--bb-text-muted) tabular-nums">
|
|
1865
1877
|
{{ currency.format(recent.amount) }}
|
|
1866
1878
|
</span>
|
|
1867
1879
|
</li>
|
|
@@ -1870,7 +1882,7 @@ const longDate = (value: string) =>
|
|
|
1870
1882
|
|
|
1871
1883
|
<footer class="mt-2 flex items-center gap-2 border-t pt-3">
|
|
1872
1884
|
<!-- An internal listing page — same-origin `href` auto-upgrades to an
|
|
1873
|
-
Inertia visit
|
|
1885
|
+
Inertia visit; no `target` needed here. -->
|
|
1874
1886
|
<BbButton
|
|
1875
1887
|
append:icon="lucide:arrow-up-right"
|
|
1876
1888
|
:href="`/expenses/receipts?merchant=${encodeURIComponent(merchant.name)}`"
|
|
@@ -1889,7 +1901,7 @@ const longDate = (value: string) =>
|
|
|
1889
1901
|
|
|
1890
1902
|
<script setup lang="ts">
|
|
1891
1903
|
import { BbBadge, BbButton, BbIcon, BbSpinner } from 'bitboss-ui';
|
|
1892
|
-
import { useResourceContext } from '@/composables/useResourceContext';
|
|
1904
|
+
import { useResourceContext } from '@/composables/inertia-helpers/useResourceContext';
|
|
1893
1905
|
import { STATUS_LABEL, STATUS_VARIANT, useUploadCenter } from './context';
|
|
1894
1906
|
import type { MerchantSummary } from '@/types';
|
|
1895
1907
|
|
|
@@ -1976,7 +1988,7 @@ function` — identical call sites to the Vue/Nuxt recipes,
|
|
|
1976
1988
|
stack.
|
|
1977
1989
|
- **Real file downloads set `target`, internal pages don't.** Inertia
|
|
1978
1990
|
auto-upgrades any same-origin `href` without a `target` into a visit
|
|
1979
|
-
|
|
1991
|
+
— correct for the merchant peek's "All receipts from…" link, but
|
|
1980
1992
|
wrong for "Download original": a raw file response fed through the
|
|
1981
1993
|
Inertia request cycle would never reach the browser as a download.
|
|
1982
1994
|
Setting `target="_blank"` makes `BbBaseButton` fall back to a plain
|