bitboss-ui 3.0.0-beta.47 → 3.0.0-beta.49
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 +24 -7
- package/bin/bitboss-ui-mcp.mjs +15 -3
- package/bin/bitboss-ui.mjs +167 -14
- package/dist/ai/BbAccordion.md +1 -1
- package/dist/ai/BbAvatar.md +1 -1
- package/dist/ai/BbBreadcrumbs.md +65 -65
- package/dist/ai/BbButton.md +28 -8
- package/dist/ai/BbCheckbox.md +0 -2
- package/dist/ai/BbCheckboxGroup.md +13 -20
- package/dist/ai/BbCollapsible.md +1 -1
- package/dist/ai/BbColorPalette.md +1 -1
- package/dist/ai/BbConfirm.md +8 -0
- package/dist/ai/BbConfirmPortal.md +1 -1
- package/dist/ai/BbDatePickerInput.md +4 -2
- package/dist/ai/BbDialog.md +1 -8
- package/dist/ai/BbDropdown.md +231 -220
- package/dist/ai/BbDropdownButton.md +65 -65
- package/dist/ai/BbDropdownGroup.md +2 -2
- package/dist/ai/BbDropzone.md +10 -10
- package/dist/ai/BbForm.md +43 -52
- package/dist/ai/BbHoverCard.md +19 -7
- package/dist/ai/BbHoverCardPortal.md +1 -1
- package/dist/ai/BbNumberInput.md +88 -21
- package/dist/ai/BbPopover.md +47 -40
- package/dist/ai/BbPopoverPortal.md +1 -1
- package/dist/ai/BbProgress.md +48 -22
- package/dist/ai/BbRadioGroup.md +13 -19
- package/dist/ai/BbSelect.md +16 -36
- package/dist/ai/BbSelectPopover.md +14 -30
- package/dist/ai/BbSmoothHeight.md +0 -2
- package/dist/ai/BbSwitchGroup.md +13 -20
- package/dist/ai/BbTable.md +11 -10
- package/dist/ai/BbTabs.md +107 -106
- package/dist/ai/BbTabsList.md +2 -2
- package/dist/ai/BbTabsPanels.md +1 -1
- package/dist/ai/BbTabsRoot.md +3 -3
- package/dist/ai/BbTooltip.md +29 -13
- package/dist/ai/BbTree.md +14 -11
- package/dist/ai/CommonPopover.md +1 -1
- package/dist/ai/changelog.json +297 -6
- package/dist/ai/components.json +50 -45
- package/dist/ai/composables/useBbDropdownContext.md +16 -16
- package/dist/ai/composables/useBbFormField.md +5 -1
- package/dist/ai/composables/useBbTabsContext.md +14 -14
- package/dist/ai/guides/agent-contract.md +27 -27
- package/dist/ai/guides/ai-router.md +1 -1
- package/dist/ai/guides/component-picker.md +3 -3
- package/dist/ai/guides/fetch-items-playbook.md +1 -1
- package/dist/ai/guides/icons-policy.md +10 -10
- package/dist/ai/guides/inertia-helpers.md +120 -67
- package/dist/ai/guides/installation-and-plugin-setup.md +45 -15
- package/dist/ai/guides/migration/components/bb-breadcrumbs.md +3 -2
- package/dist/ai/guides/migration/components/bb-checkbox-group.md +16 -16
- package/dist/ai/guides/migration/components/bb-dropdown-button.md +9 -8
- package/dist/ai/guides/migration/components/bb-dropdown.md +15 -14
- package/dist/ai/guides/migration/components/bb-radio-group.md +2 -1
- package/dist/ai/guides/migration/components/bb-select-popover.md +6 -1
- package/dist/ai/guides/migration/components/bb-select.md +10 -2
- package/dist/ai/guides/migration/components/bb-switch-group.md +2 -1
- package/dist/ai/guides/migration/components/bb-tabs.md +9 -8
- package/dist/ai/guides/migration/components/bb-tooltip.md +1 -1
- package/dist/ai/guides/migration/v2-to-v3.md +143 -28
- package/dist/ai/guides/migration/v3-beta-css-classes.md +29 -27
- package/dist/ai/guides/migration/v3-beta-tooling.md +11 -0
- package/dist/ai/guides/options-items-playbook.md +30 -24
- package/dist/ai/guides/passthrough.md +4 -4
- package/dist/ai/guides/preset-components.md +18 -3
- package/dist/ai/guides/typescript-generic-components.md +1 -1
- package/dist/ai/guides/validated-forms.md +11 -22
- package/dist/ai/guides/validation-providers.md +4 -3
- 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 +6 -6
- package/dist/ai/manifest/components/BbAccordion.json +1 -1
- package/dist/ai/manifest/components/BbBreadcrumbs.json +10 -6
- package/dist/ai/manifest/components/BbBreadcrumbs.tree.json +1 -1
- package/dist/ai/manifest/components/BbButton.json +2 -1
- package/dist/ai/manifest/components/BbButton.tree.json +1 -1
- package/dist/ai/manifest/components/BbCheckboxGroup.json +2 -2
- package/dist/ai/manifest/components/BbCollapsible.json +1 -1
- package/dist/ai/manifest/components/BbColorPalette.json +1 -1
- package/dist/ai/manifest/components/BbConfirmPortal.json +5 -2
- package/dist/ai/manifest/components/BbDropdown.json +23 -20
- package/dist/ai/manifest/components/BbDropdown.tree.json +2 -2
- package/dist/ai/manifest/components/BbDropdownButton.json +22 -19
- package/dist/ai/manifest/components/BbDropdownButton.tree.json +1 -1
- package/dist/ai/manifest/components/BbDropdownGroup.json +2 -2
- package/dist/ai/manifest/components/BbForm.json +1 -0
- package/dist/ai/manifest/components/BbHoverCard.json +1 -1
- package/dist/ai/manifest/components/BbHoverCardPortal.json +2 -2
- package/dist/ai/manifest/components/BbNumberInput.json +6 -1
- package/dist/ai/manifest/components/BbNumberInput.tree.json +2 -1
- package/dist/ai/manifest/components/BbPopover.json +2 -1
- package/dist/ai/manifest/components/BbPopoverPortal.json +2 -2
- package/dist/ai/manifest/components/BbProgress.json +6 -6
- package/dist/ai/manifest/components/BbProgress.tree.json +1 -0
- package/dist/ai/manifest/components/BbRadioGroup.json +2 -2
- package/dist/ai/manifest/components/BbSelect.json +2 -2
- package/dist/ai/manifest/components/BbSelect.tree.json +2 -2
- package/dist/ai/manifest/components/BbSelectPopover.json +2 -2
- package/dist/ai/manifest/components/BbSelectPopover.tree.json +1 -1
- package/dist/ai/manifest/components/BbSwitchGroup.json +2 -2
- package/dist/ai/manifest/components/BbTabs.json +8 -7
- package/dist/ai/manifest/components/BbTabsList.json +3 -3
- package/dist/ai/manifest/components/BbTabsPanels.json +1 -1
- package/dist/ai/manifest/components/BbTabsRoot.json +6 -5
- package/dist/ai/manifest/components/BbTag.tree.json +1 -1
- package/dist/ai/manifest/components/BbTooltip.json +2 -2
- package/dist/ai/manifest/components/ChipsBox.tree.json +1 -1
- package/dist/ai/manifest/components/CommonPopover.json +1 -1
- package/dist/ai/manifest/index.json +2 -2
- package/dist/ai/manifest/meta.json +5 -0
- package/dist/ai/manifest/types.advanced.json +10 -9
- package/dist/ai/manifest/types.api.json +8 -5
- package/dist/ai/manifest/types.wrapper.json +1 -0
- package/dist/ai/recipes/inertia/approvals-inbox.md +16 -18
- package/dist/ai/recipes/inertia/inline-edit-workspace.md +23 -33
- package/dist/ai/recipes/inertia/layout-scaffold.md +16 -16
- package/dist/ai/recipes/inertia/onboarding.md +6 -10
- package/dist/ai/recipes/inertia/ownership-atlas.md +15 -18
- package/dist/ai/recipes/inertia/record-form.md +11 -11
- package/dist/ai/recipes/inertia/records-workspace.md +38 -41
- package/dist/ai/recipes/inertia/settings-workspace.md +26 -38
- package/dist/ai/recipes/inertia/upload-center.md +31 -39
- package/dist/ai/recipes/inertia/wizard-form.md +10 -19
- package/dist/ai/recipes/nuxt/approvals-inbox.md +7 -8
- package/dist/ai/recipes/nuxt/inline-edit-workspace.md +14 -24
- package/dist/ai/recipes/nuxt/layout-scaffold.md +16 -16
- package/dist/ai/recipes/nuxt/onboarding.md +2 -6
- package/dist/ai/recipes/nuxt/ownership-atlas.md +7 -9
- package/dist/ai/recipes/nuxt/record-form.md +5 -5
- package/dist/ai/recipes/nuxt/records-workspace.md +29 -31
- package/dist/ai/recipes/nuxt/settings-workspace.md +22 -34
- package/dist/ai/recipes/nuxt/upload-center.md +22 -29
- package/dist/ai/recipes/nuxt/wizard-form.md +3 -11
- package/dist/ai/recipes/vue/approvals-inbox.md +7 -8
- package/dist/ai/recipes/vue/inline-edit-workspace.md +14 -24
- package/dist/ai/recipes/vue/layout-scaffold.md +16 -16
- package/dist/ai/recipes/vue/onboarding.md +2 -6
- package/dist/ai/recipes/vue/ownership-atlas.md +7 -9
- package/dist/ai/recipes/vue/record-form.md +5 -5
- package/dist/ai/recipes/vue/records-workspace.md +29 -31
- package/dist/ai/recipes/vue/settings-workspace.md +22 -34
- package/dist/ai/recipes/vue/upload-center.md +22 -29
- package/dist/ai/recipes/vue/wizard-form.md +3 -11
- package/dist/ai/source/BbAccordion.md +1 -1
- package/dist/ai/source/BbAlert.md +3 -3
- package/dist/ai/source/BbBadge.md +14 -10
- package/dist/ai/source/BbBadgeButton.md +17 -12
- package/dist/ai/source/BbBaseButton.md +1 -1
- package/dist/ai/source/BbBaseRadioIcon.md +1 -0
- package/dist/ai/source/BbBaseSwitchIcon.md +1 -0
- package/dist/ai/source/BbBreadcrumbs.md +63 -42
- package/dist/ai/source/BbButton.md +84 -38
- package/dist/ai/source/BbCalendar.md +17 -16
- package/dist/ai/source/BbCheckbox.md +3 -2
- package/dist/ai/source/BbCheckboxGroup.md +11 -4
- package/dist/ai/source/BbCollapsible.md +2 -1
- package/dist/ai/source/BbColorInput.md +10 -9
- package/dist/ai/source/BbColorPalette.md +2 -1
- package/dist/ai/source/BbConfirm.md +18 -1
- package/dist/ai/source/BbConfirmPortal.md +20 -6
- package/dist/ai/source/BbDatePicker.md +2 -2
- package/dist/ai/source/BbDatePickerInput.md +47 -20
- package/dist/ai/source/BbDialog.md +5 -5
- package/dist/ai/source/BbDropdown.md +231 -158
- package/dist/ai/source/BbDropdownButton.md +19 -12
- package/dist/ai/source/BbDropdownGroup.md +127 -93
- package/dist/ai/source/BbForm.md +25 -1
- package/dist/ai/source/BbHoverCard.md +30 -3
- package/dist/ai/source/BbHoverCardPortal.md +18 -3
- package/dist/ai/source/BbIndicator.md +4 -0
- package/dist/ai/source/BbNumberInput.md +855 -19
- package/dist/ai/source/BbOffCanvas.md +27 -11
- package/dist/ai/source/BbPagination.md +3 -3
- package/dist/ai/source/BbPopover.md +185 -12
- package/dist/ai/source/BbPopoverPortal.md +30 -3
- package/dist/ai/source/BbProgress.md +82 -18
- package/dist/ai/source/BbRadioGroup.md +12 -5
- package/dist/ai/source/BbRating.md +11 -9
- package/dist/ai/source/BbSelect.md +16 -10
- package/dist/ai/source/BbSelectPopover.md +29 -23
- package/dist/ai/source/BbSlider.md +12 -6
- package/dist/ai/source/BbSwitch.md +3 -2
- package/dist/ai/source/BbSwitchGroup.md +5 -2
- package/dist/ai/source/BbTable.md +102 -18
- package/dist/ai/source/BbTabs.md +30 -24
- package/dist/ai/source/BbTabsList.md +29 -23
- package/dist/ai/source/BbTabsPanels.md +29 -23
- package/dist/ai/source/BbTabsRoot.md +28 -22
- package/dist/ai/source/BbTag.md +10 -9
- package/dist/ai/source/BbTextInput.md +5 -4
- package/dist/ai/source/BbTextarea.md +6 -5
- package/dist/ai/source/BbTimePicker.md +1 -1
- package/dist/ai/source/BbTimePickerInput.md +46 -9
- package/dist/ai/source/BbToast.md +10 -7
- package/dist/ai/source/BbToastPortal.md +10 -7
- package/dist/ai/source/BbTooltip.md +88 -11
- package/dist/ai/source/BbTree.md +21 -3
- package/dist/ai/source/CommonField.md +6 -4
- package/dist/ai/source/CommonFieldInput.md +15 -10
- package/dist/ai/source/CommonPopover.md +8 -1
- package/dist/ai/source/CommonTimeSelector.md +5 -4
- package/dist/components/BbBadge/BbBadgeButton.vue_vue_type_script_setup_true_lang.js +10 -8
- package/dist/components/BbBaseButton/BbBaseButton.vue_vue_type_script_setup_true_lang.js +8 -8
- package/dist/components/BbBreadcrumbs/BbBreadcrumbs.vue_vue_type_script_setup_true_lang.js +45 -45
- package/dist/components/BbBreadcrumbs/types.d.ts +25 -17
- package/dist/components/BbButton/BbButton.vue_vue_type_script_setup_true_lang.js +88 -70
- package/dist/components/BbButton/toggleRoving.d.ts +6 -0
- package/dist/components/BbButton/toggleRoving.js +45 -0
- package/dist/components/BbButton/types.d.ts +12 -4
- package/dist/components/BbButton/types.js +5 -1
- package/dist/components/BbCalendar/BbCalendar.vue_vue_type_script_setup_true_lang.js +178 -178
- package/dist/components/BbCalendar/CalendarMonthPanel.vue_vue_type_script_setup_true_lang.js +15 -15
- package/dist/components/BbCalendar/CalendarYearPanel.vue_vue_type_script_setup_true_lang.js +28 -28
- package/dist/components/BbCalendar/useCalendarGrid.js +141 -139
- package/dist/components/BbCalendar/useDayjsLocale.d.ts +38 -15
- package/dist/components/BbCalendar/useDayjsLocale.js +31 -30
- package/dist/components/BbCheckbox/BbCheckbox.vue_vue_type_script_setup_true_lang.js +48 -48
- package/dist/components/BbCheckboxGroup/BbCheckboxGroup.vue_vue_type_script_setup_true_lang.js +81 -80
- package/dist/components/BbCheckboxGroup/types.d.ts +6 -2
- package/dist/components/BbCollapsible/types.d.ts +2 -1
- package/dist/components/BbColorInput/BbColorInput.vue_vue_type_script_setup_true_lang.js +69 -69
- package/dist/components/BbColorPalette/types.d.ts +2 -1
- package/dist/components/BbConfirm/BbConfirmPortal.vue.d.ts +2 -5
- package/dist/components/BbConfirm/types.d.ts +15 -0
- package/dist/components/BbDatePickerInput/BbDatePickerInput.vue_vue_type_script_setup_true_lang.js +363 -349
- package/dist/components/BbDropdown/AdaptiveDropdown.vue_vue_type_script_setup_true_lang.js +91 -86
- package/dist/components/BbDropdown/BbDropdown.vue_vue_type_script_setup_true_lang.js +298 -289
- package/dist/components/BbDropdown/BbDropdownList.vue_vue_type_script_setup_true_lang.js +322 -356
- package/dist/components/BbDropdown/DropdownPipelineResolver.vue_vue_type_script_setup_true_lang.js +17 -15
- 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 +60 -46
- package/dist/components/BbDropdown/types.d.ts +120 -88
- package/dist/components/BbDropdownButton/BbDropdownButton.vue_vue_type_script_setup_true_lang.js +11 -2
- package/dist/components/BbDropdownButton/types.d.ts +2 -2
- package/dist/components/BbForm/BbForm.vue.d.ts +9 -0
- package/dist/components/BbForm/BbForm.vue_vue_type_script_setup_true_lang.js +114 -105
- package/dist/components/BbForm/BbFormCustomField.js +1 -1
- package/dist/components/BbForm/bindFormField.js +2 -1
- package/dist/components/BbForm/formFields.d.ts +5 -0
- package/dist/components/BbHoverCard/BbHoverCard.vue_vue_type_script_setup_true_lang.js +145 -142
- package/dist/components/BbHoverCard/BbHoverCardPortal.vue.d.ts +2 -2
- package/dist/components/BbHoverCard/types.d.ts +14 -1
- package/dist/components/BbNumberInput/BbNumberInput.vue.d.ts +0 -1
- package/dist/components/BbNumberInput/BbNumberInput.vue_vue_type_script_setup_true_lang.js +452 -125
- package/dist/components/BbNumberInput/numberDisplay.d.ts +256 -0
- package/dist/components/BbNumberInput/numberDisplay.js +499 -0
- package/dist/components/BbNumberInput/types.d.ts +54 -1
- 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/BbPagination/BbPagination.vue_vue_type_script_setup_true_lang.js +7 -7
- package/dist/components/BbPopover/BbPopover.vue.d.ts +1 -0
- package/dist/components/BbPopover/BbPopover.vue_vue_type_script_setup_true_lang.js +207 -162
- package/dist/components/BbPopover/BbPopoverPortal.vue.d.ts +2 -2
- package/dist/components/BbPopover/types.d.ts +26 -1
- package/dist/components/BbProgress/BbProgress.vue_vue_type_script_setup_true_lang.js +15 -7
- package/dist/components/BbProgress/types.d.ts +23 -7
- package/dist/components/BbProgress/types.js +1 -1
- package/dist/components/BbRadioGroup/BbRadioGroup.vue_vue_type_script_setup_true_lang.js +102 -101
- package/dist/components/BbRadioGroup/types.d.ts +6 -2
- package/dist/components/BbRating/BbRating.vue_vue_type_script_setup_true_lang.js +63 -63
- package/dist/components/BbSelect/BbSelect.vue_vue_type_script_setup_true_lang.js +156 -154
- package/dist/components/BbSelect/types.d.ts +6 -2
- package/dist/components/BbSelectPopover/BbSelectPopover.vue_vue_type_script_setup_true_lang.js +2 -1
- package/dist/components/BbSelectPopover/types.d.ts +6 -2
- package/dist/components/BbSlider/BbSlider.vue_vue_type_script_setup_true_lang.js +153 -153
- package/dist/components/BbSwitch/BbSwitch.vue_vue_type_script_setup_true_lang.js +62 -62
- package/dist/components/BbSwitchGroup/BbSwitchGroup.vue_vue_type_script_setup_true_lang.js +131 -130
- package/dist/components/BbTable/BbTable.vue_vue_type_script_setup_true_lang.js +711 -676
- package/dist/components/BbTabs/BbTabs.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/components/BbTabs/BbTabsList.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/components/BbTabs/types.d.ts +28 -22
- package/dist/components/BbTag/BbTag.vue_vue_type_script_setup_true_lang.js +76 -76
- package/dist/components/BbTextInput/BbTextInput.vue_vue_type_script_setup_true_lang.js +58 -58
- package/dist/components/BbTextarea/BbTextarea.vue_vue_type_script_setup_true_lang.js +82 -82
- package/dist/components/BbTimePickerInput/BbTimePickerInput.vue_vue_type_script_setup_true_lang.js +246 -236
- package/dist/components/BbTooltip/BbTooltip.vue_vue_type_script_setup_true_lang.js +99 -86
- package/dist/components/BbTooltip/tooltipWarmup.d.ts +23 -0
- package/dist/components/BbTooltip/tooltipWarmup.js +7 -0
- package/dist/components/BbTooltip/types.d.ts +10 -3
- package/dist/components/BbTree/BbTree.vue_vue_type_script_setup_true_lang.js +29 -21
- package/dist/components/BbTree/BbTreeLevel.vue_vue_type_script_setup_true_lang.js +10 -7
- package/dist/components/CommonFieldInput/CommonFieldInput.vue_vue_type_script_setup_true_lang.js +37 -36
- package/dist/components/CommonPopover/types.d.ts +2 -1
- package/dist/components/CommonTimeSelector/CommonTimeSelector.vue_vue_type_script_setup_true_lang.js +9 -9
- package/dist/composables/formSubmitLock.d.ts +6 -0
- package/dist/composables/formSubmitLock.js +4 -0
- package/dist/composables/useBaseOptions.d.ts +7 -1
- package/dist/composables/useBaseOptions.js +32 -32
- package/dist/composables/useBbDropdownContext.d.ts +8 -8
- package/dist/composables/useBbFormField.d.ts +9 -0
- package/dist/composables/useBbFormField.js +5 -3
- package/dist/composables/useBbTabsContext.d.ts +10 -10
- package/dist/composables/useBbTabsContext.js +18 -18
- package/dist/composables/useFormBinding.d.ts +11 -0
- package/dist/composables/useFormBinding.js +15 -13
- 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/useLocale.js +10 -9
- package/dist/deprecation/ai-deprecations.json.d.ts +130 -0
- package/dist/deprecation/ai-deprecations.json.js +1 -1
- package/dist/deprecation/removedProps.js +1 -1
- package/dist/directives/bbDropdown.js +1 -1
- package/dist/directives/directivePortal.d.ts +13 -7
- package/dist/directives/directivePortal.js +1 -4
- package/dist/i18n/index.d.ts +7 -12
- package/dist/i18n/locales/cs.json +11 -14
- package/dist/i18n/locales/da.json +13 -16
- package/dist/i18n/locales/de-CH.json +137 -0
- package/dist/i18n/locales/de.json +14 -17
- package/dist/i18n/locales/el.json +10 -13
- package/dist/i18n/locales/en-GB.json +137 -0
- package/dist/i18n/locales/en.json +8 -11
- package/dist/i18n/locales/es-MX.json +137 -0
- package/dist/i18n/locales/es.json +16 -19
- package/dist/i18n/locales/fi.json +8 -11
- package/dist/i18n/locales/fr.json +23 -26
- package/dist/i18n/locales/hu.json +8 -11
- package/dist/i18n/locales/it.json +12 -15
- package/dist/i18n/locales/ja.json +13 -16
- package/dist/i18n/locales/ko.json +10 -13
- package/dist/i18n/locales/nb.json +13 -16
- package/dist/i18n/locales/nl.json +21 -24
- package/dist/i18n/locales/pl.json +10 -13
- package/dist/i18n/locales/{pt.json → pt-BR.json} +19 -22
- package/dist/i18n/locales/pt-PT.json +137 -0
- package/dist/i18n/locales/ro.json +22 -25
- package/dist/i18n/locales/ru.json +11 -14
- package/dist/i18n/locales/sv.json +16 -19
- package/dist/i18n/locales/tr.json +14 -17
- package/dist/i18n/locales/uk.json +11 -14
- package/dist/i18n/locales/{zh-cn.json → zh-CN.json} +10 -13
- 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/index.d.ts +4 -4
- package/dist/index.js +4 -4
- package/dist/llms-full.txt +1914 -1714
- package/dist/llms-medium.txt +76 -46
- package/dist/llms.txt +7 -7
- package/dist/locale-blueprint.json +16 -13
- package/dist/styles.css +2 -2
- package/dist/types/passthrough.d.ts +1 -1
- package/dist/types/ptComponentMap.d.ts +2 -2
- package/dist/utilities/functions/slotKey.d.ts +2 -2
- package/dist/utils/versionCheck.js +1 -1
- package/dist/vite-plugin.d.ts +22 -19
- package/dist/vite.js +309 -297
- package/llms.txt +7 -7
- package/package.json +5 -3
- package/scripts/lib/agent-manifest.mjs +2 -1
- package/scripts/lib/eslint-disable.mjs +17 -4
- package/scripts/lib/eslint-plugin.d.ts +9 -1
- package/scripts/lib/eslint-plugin.mjs +256 -6
- package/scripts/lib/helper-canon.mjs +176 -0
- package/scripts/lib/helpers-add.mjs +1303 -0
- package/scripts/lib/local-components.mjs +33 -4
- package/scripts/lib/locale-check.mjs +165 -0
- package/scripts/lib/portal-names.mjs +458 -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 +2 -2
- package/scripts/lib/slot-renames.mjs +1 -1
- package/scripts/lib/unimported-components.mjs +5 -2
- package/scripts/lib/validate-bb-markup.mjs +123 -56
- package/dist/i18n/index.js +0 -27
|
@@ -587,36 +587,36 @@ const warehouseId = ref('denver');
|
|
|
587
587
|
|
|
588
588
|
const accountMenuItems: BbDropdownItem[] = [
|
|
589
589
|
{
|
|
590
|
-
|
|
591
|
-
|
|
590
|
+
value: 'theme',
|
|
591
|
+
label: 'Theme',
|
|
592
592
|
'prepend:icon': 'lucide:sun-moon',
|
|
593
593
|
// A submenu opener (`items`) whose own `items` is one selectable
|
|
594
594
|
// group — `selectable: true` gives single-choice radio semantics and a
|
|
595
595
|
// check on the picked row, with no bordered field anywhere.
|
|
596
596
|
items: [
|
|
597
597
|
{
|
|
598
|
-
|
|
598
|
+
id: 'theme-opts',
|
|
599
599
|
selectable: true,
|
|
600
600
|
items: [
|
|
601
|
-
{
|
|
602
|
-
{
|
|
603
|
-
{
|
|
601
|
+
{ value: 'system', label: 'System' },
|
|
602
|
+
{ value: 'light', label: 'Light' },
|
|
603
|
+
{ value: 'dark', label: 'Dark' },
|
|
604
604
|
],
|
|
605
605
|
},
|
|
606
606
|
],
|
|
607
607
|
},
|
|
608
608
|
{
|
|
609
|
-
|
|
610
|
-
|
|
609
|
+
value: 'warehouse',
|
|
610
|
+
label: 'Warehouse',
|
|
611
611
|
'prepend:icon': 'lucide:warehouse',
|
|
612
612
|
items: [
|
|
613
613
|
{
|
|
614
|
-
|
|
614
|
+
id: 'warehouse-opts',
|
|
615
615
|
selectable: true,
|
|
616
616
|
items: [
|
|
617
|
-
{
|
|
618
|
-
{
|
|
619
|
-
{
|
|
617
|
+
{ value: 'denver', label: 'Denver DC' },
|
|
618
|
+
{ value: 'reno', label: 'Reno DC' },
|
|
619
|
+
{ value: 'columbus', label: 'Columbus DC' },
|
|
620
620
|
],
|
|
621
621
|
},
|
|
622
622
|
],
|
|
@@ -624,14 +624,14 @@ const accountMenuItems: BbDropdownItem[] = [
|
|
|
624
624
|
// A trailing separator section (a nested array) for plain navigation rows.
|
|
625
625
|
[
|
|
626
626
|
{
|
|
627
|
-
|
|
628
|
-
|
|
627
|
+
value: 'settings',
|
|
628
|
+
label: 'Settings',
|
|
629
629
|
'prepend:icon': 'lucide:settings',
|
|
630
630
|
href: '/settings',
|
|
631
631
|
},
|
|
632
632
|
{
|
|
633
|
-
|
|
634
|
-
|
|
633
|
+
value: 'signout',
|
|
634
|
+
label: 'Sign out',
|
|
635
635
|
'prepend:icon': 'lucide:log-out',
|
|
636
636
|
href: '/logout',
|
|
637
637
|
method: 'post',
|
|
@@ -627,8 +627,8 @@ export function useOnboardingWorkspace(): OnboardingWorkspaceContext {
|
|
|
627
627
|
<BbBreadcrumbs
|
|
628
628
|
class="min-w-0 flex-auto"
|
|
629
629
|
:items="[
|
|
630
|
-
{
|
|
631
|
-
{
|
|
630
|
+
{ value: 'dashboard', label: 'Dashboard', to: '/dashboard' },
|
|
631
|
+
{ value: 'getting-started', label: 'Getting started' },
|
|
632
632
|
]"
|
|
633
633
|
/>
|
|
634
634
|
<BbButton
|
|
@@ -993,8 +993,6 @@ const ctx = useOnboardingWorkspace();
|
|
|
993
993
|
v-model="role"
|
|
994
994
|
class="w-44"
|
|
995
995
|
compact
|
|
996
|
-
item-text="label"
|
|
997
|
-
item-value="value"
|
|
998
996
|
:items="roles"
|
|
999
997
|
label="Role"
|
|
1000
998
|
label-mode="outside"
|
|
@@ -1337,8 +1335,6 @@ import { BbButton } from 'bitboss-ui';
|
|
|
1337
1335
|
v-if="ctx.reminders.enabled"
|
|
1338
1336
|
class="max-w-72"
|
|
1339
1337
|
compact
|
|
1340
|
-
item-text="label"
|
|
1341
|
-
item-value="value"
|
|
1342
1338
|
:items="cadences"
|
|
1343
1339
|
label="Reminder schedule"
|
|
1344
1340
|
label-mode="outside"
|
|
@@ -495,9 +495,9 @@ export function useOwnershipAtlas(): OwnershipAtlasContext {
|
|
|
495
495
|
<BbBreadcrumbs
|
|
496
496
|
class="min-w-0 flex-auto"
|
|
497
497
|
:items="[
|
|
498
|
-
{
|
|
499
|
-
{
|
|
500
|
-
{
|
|
498
|
+
{ value: 'admin', label: 'Admin', to: '/admin' },
|
|
499
|
+
{ value: 'access', label: 'Access', to: '/access' },
|
|
500
|
+
{ value: 'ownership', label: 'Ownership' },
|
|
501
501
|
]"
|
|
502
502
|
/>
|
|
503
503
|
<div class="flex shrink-0 items-center gap-2">
|
|
@@ -543,13 +543,13 @@ export function useOwnershipAtlas(): OwnershipAtlasContext {
|
|
|
543
543
|
v-model="ctx.tab.value"
|
|
544
544
|
compact
|
|
545
545
|
:items="[
|
|
546
|
-
{
|
|
546
|
+
{ value: 'all', label: `All · ${ctx.tabCounts.value.all}` },
|
|
547
547
|
{
|
|
548
|
-
|
|
548
|
+
value: 'americas',
|
|
549
549
|
label: `Americas · ${ctx.tabCounts.value.americas}`,
|
|
550
550
|
},
|
|
551
|
-
{
|
|
552
|
-
{
|
|
551
|
+
{ value: 'emea', label: `EMEA · ${ctx.tabCounts.value.emea}` },
|
|
552
|
+
{ value: 'apac', label: `APAC · ${ctx.tabCounts.value.apac}` },
|
|
553
553
|
]"
|
|
554
554
|
/>
|
|
555
555
|
|
|
@@ -916,8 +916,6 @@ const monthLabel = (value: string) =>
|
|
|
916
916
|
<BbSelectPopover
|
|
917
917
|
v-model="ctx.filters.kinds"
|
|
918
918
|
clearable
|
|
919
|
-
item-text="label"
|
|
920
|
-
item-value="value"
|
|
921
919
|
:items="kindOptions"
|
|
922
920
|
multiple
|
|
923
921
|
>
|
|
@@ -779,12 +779,12 @@ const ctx = provideInvoiceForm();
|
|
|
779
779
|
|
|
780
780
|
// A real trail, ≥ 2 linked levels; the current page carries no target.
|
|
781
781
|
const trail = computed(() => [
|
|
782
|
-
{
|
|
783
|
-
{
|
|
784
|
-
{
|
|
782
|
+
{ value: 'dashboard', label: 'Dashboard', to: '/dashboard' },
|
|
783
|
+
{ value: 'billing', label: 'Billing', to: '/billing' },
|
|
784
|
+
{ value: 'invoices', label: 'Invoices', to: '/invoices' },
|
|
785
785
|
{
|
|
786
|
-
|
|
787
|
-
|
|
786
|
+
value: 'invoice',
|
|
787
|
+
label:
|
|
788
788
|
ctx.mode === 'edit'
|
|
789
789
|
? (ctx.invoiceNumber.value ?? 'Invoice')
|
|
790
790
|
: 'New invoice',
|
|
@@ -567,9 +567,9 @@ export function useInvoicesWorkspace(): InvoicesWorkspaceContext {
|
|
|
567
567
|
<BbBreadcrumbs
|
|
568
568
|
class="min-w-0 flex-auto"
|
|
569
569
|
:items="[
|
|
570
|
-
{
|
|
571
|
-
{
|
|
572
|
-
{
|
|
570
|
+
{ value: 'dashboard', label: 'Dashboard', to: '/dashboard' },
|
|
571
|
+
{ value: 'billing', label: 'Billing', to: '/billing' },
|
|
572
|
+
{ value: 'invoices', label: 'Invoices' },
|
|
573
573
|
]"
|
|
574
574
|
/>
|
|
575
575
|
<div class="flex shrink-0 items-center gap-2">
|
|
@@ -604,22 +604,22 @@ export function useInvoicesWorkspace(): InvoicesWorkspaceContext {
|
|
|
604
604
|
compact
|
|
605
605
|
:items="[
|
|
606
606
|
{
|
|
607
|
-
|
|
607
|
+
value: 'all',
|
|
608
608
|
label: `All · ${ctx.tabCounts.value.all}`,
|
|
609
609
|
href: '?tab=all',
|
|
610
610
|
},
|
|
611
611
|
{
|
|
612
|
-
|
|
612
|
+
value: 'outstanding',
|
|
613
613
|
label: `Outstanding · ${ctx.tabCounts.value.outstanding}`,
|
|
614
614
|
href: '?tab=outstanding',
|
|
615
615
|
},
|
|
616
616
|
{
|
|
617
|
-
|
|
617
|
+
value: 'paid',
|
|
618
618
|
label: `Paid · ${ctx.tabCounts.value.paid}`,
|
|
619
619
|
href: '?tab=paid',
|
|
620
620
|
},
|
|
621
621
|
{
|
|
622
|
-
|
|
622
|
+
value: 'archived',
|
|
623
623
|
label: `Archived · ${ctx.tabCounts.value.archived}`,
|
|
624
624
|
href: '?tab=archived',
|
|
625
625
|
},
|
|
@@ -938,16 +938,16 @@ const searchCustomers = async ({
|
|
|
938
938
|
// Static enum facet: item text resolves synchronously, so its chip reads
|
|
939
939
|
// `useBbDropdownContext` (in FilterChip.vue) with zero extra fetch.
|
|
940
940
|
const statusGroup: BbDropdownItem = {
|
|
941
|
-
|
|
941
|
+
id: 'status',
|
|
942
942
|
label: 'Status',
|
|
943
943
|
hideLabel: true,
|
|
944
944
|
selectable: true,
|
|
945
945
|
multiple: true,
|
|
946
946
|
items: [
|
|
947
|
-
{
|
|
948
|
-
{
|
|
949
|
-
{
|
|
950
|
-
{
|
|
947
|
+
{ value: 'draft', label: INVOICE_STATUS_LABEL.draft },
|
|
948
|
+
{ value: 'pending', label: INVOICE_STATUS_LABEL.pending },
|
|
949
|
+
{ value: 'paid', label: INVOICE_STATUS_LABEL.paid },
|
|
950
|
+
{ value: 'overdue', label: INVOICE_STATUS_LABEL.overdue },
|
|
951
951
|
],
|
|
952
952
|
};
|
|
953
953
|
|
|
@@ -959,7 +959,7 @@ const statusGroup: BbDropdownItem = {
|
|
|
959
959
|
// redeclaring `prefill: true` would fetch every seeded facet twice on page
|
|
960
960
|
// load for nothing.
|
|
961
961
|
const customerGroup: BbDropdownItem = {
|
|
962
|
-
|
|
962
|
+
id: 'customer',
|
|
963
963
|
label: 'Customer',
|
|
964
964
|
hideLabel: true,
|
|
965
965
|
selectable: true,
|
|
@@ -976,14 +976,14 @@ const customerGroup: BbDropdownItem = {
|
|
|
976
976
|
// the category row already names the facet.
|
|
977
977
|
const menu = computed<BbDropdownItem[]>(() => [
|
|
978
978
|
{
|
|
979
|
-
|
|
980
|
-
|
|
979
|
+
value: 'status-category',
|
|
980
|
+
label: 'Status',
|
|
981
981
|
'prepend:icon': 'lucide:circle-dot',
|
|
982
982
|
items: [statusGroup],
|
|
983
983
|
},
|
|
984
984
|
{
|
|
985
|
-
|
|
986
|
-
|
|
985
|
+
value: 'customer-category',
|
|
986
|
+
label: 'Customer',
|
|
987
987
|
'prepend:icon': 'lucide:building-2',
|
|
988
988
|
items: [customerGroup],
|
|
989
989
|
},
|
|
@@ -1033,7 +1033,7 @@ import {
|
|
|
1033
1033
|
import type { BbDropdownItem } from 'bitboss-ui';
|
|
1034
1034
|
|
|
1035
1035
|
const props = defineProps<{
|
|
1036
|
-
/** Matches the group's `
|
|
1036
|
+
/** Matches the group's `id` in the Filters menu, and its entry in
|
|
1037
1037
|
* `useBbDropdownContext('invoice-filters').groups`. */
|
|
1038
1038
|
groupKey: string;
|
|
1039
1039
|
/** Static fallback/prefix text — the group itself sets `hideLabel`. */
|
|
@@ -1070,7 +1070,7 @@ const chipText = computed(() => {
|
|
|
1070
1070
|
dropdownFilters.groups.value[props.groupKey]?.selectedOptions ?? [];
|
|
1071
1071
|
if (!options.length) return props.label;
|
|
1072
1072
|
return `${props.label}: ${options
|
|
1073
|
-
.map((option) => option.
|
|
1073
|
+
.map((option) => option.label ?? String(option.value))
|
|
1074
1074
|
.join(', ')}`;
|
|
1075
1075
|
});
|
|
1076
1076
|
|
|
@@ -1086,7 +1086,6 @@ const onClear = () =>
|
|
|
1086
1086
|
<template>
|
|
1087
1087
|
<BbSelectPopover
|
|
1088
1088
|
item-text="text"
|
|
1089
|
-
item-value="value"
|
|
1090
1089
|
:items="INVOICE_STATUS_OPTIONS"
|
|
1091
1090
|
:model-value="invoice.status"
|
|
1092
1091
|
width="180"
|
|
@@ -1302,32 +1301,32 @@ const pillLabel = computed(() =>
|
|
|
1302
1301
|
:boundary="boundary"
|
|
1303
1302
|
:items="[
|
|
1304
1303
|
{
|
|
1305
|
-
|
|
1306
|
-
|
|
1304
|
+
value: 'edit',
|
|
1305
|
+
label: 'Edit',
|
|
1307
1306
|
'prepend:icon': 'lucide:pencil',
|
|
1308
1307
|
to: `/invoices/${invoice.id}/edit`,
|
|
1309
1308
|
},
|
|
1310
1309
|
{
|
|
1311
|
-
|
|
1312
|
-
|
|
1310
|
+
value: 'duplicate',
|
|
1311
|
+
label: 'Duplicate',
|
|
1313
1312
|
'prepend:icon': 'lucide:copy',
|
|
1314
1313
|
onClick: () => ctx.duplicateInvoice(invoice),
|
|
1315
1314
|
},
|
|
1316
1315
|
{
|
|
1317
|
-
|
|
1318
|
-
|
|
1316
|
+
value: 'payment',
|
|
1317
|
+
label: 'Record payment',
|
|
1319
1318
|
'prepend:icon': 'lucide:banknote',
|
|
1320
1319
|
onClick: () => (ctx.dialogs.recordPayment.value = invoice),
|
|
1321
1320
|
},
|
|
1322
1321
|
{
|
|
1323
|
-
|
|
1324
|
-
|
|
1322
|
+
value: 'archive',
|
|
1323
|
+
label: 'Archive',
|
|
1325
1324
|
'prepend:icon': 'lucide:archive',
|
|
1326
1325
|
onClick: () => ctx.archiveInvoice(invoice),
|
|
1327
1326
|
},
|
|
1328
1327
|
{
|
|
1329
|
-
|
|
1330
|
-
|
|
1328
|
+
value: 'delete',
|
|
1329
|
+
label: 'Delete',
|
|
1331
1330
|
'prepend:icon': 'lucide:trash-2',
|
|
1332
1331
|
variant: 'destructive',
|
|
1333
1332
|
onClick: () => ctx.deleteInvoice(invoice),
|
|
@@ -1732,7 +1731,6 @@ const currency = new Intl.NumberFormat('en-US', {
|
|
|
1732
1731
|
<BbSelect
|
|
1733
1732
|
v-model="draft.method"
|
|
1734
1733
|
item-text="text"
|
|
1735
|
-
item-value="value"
|
|
1736
1734
|
:items="PAYMENT_METHOD_OPTIONS"
|
|
1737
1735
|
label="Method"
|
|
1738
1736
|
label-mode="outside"
|
|
@@ -77,7 +77,7 @@ per field, and never mix both inside one card.
|
|
|
77
77
|
| ---------------- | ---------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------- |
|
|
78
78
|
| What it is | Typed text, several fields that belong together | One discrete choice: a switch, a checkbox, a role, a file |
|
|
79
79
|
| Commit | A **Save** button in the card footer, disabled until something changed | The change itself. No button anywhere |
|
|
80
|
-
| While saving | The button spins
|
|
80
|
+
| While saving | The button spins and the fields go read-only until the save settles (the form's save lock) | The control goes `readonly` so a second flip cannot race the first |
|
|
81
81
|
| On success | A toast; the dirty state rebaselines to what was saved | A quiet toast (`Delivery channels saved.`) |
|
|
82
82
|
| On failure | Server messages land on their fields (`field-errors`); focus moves to the first one; nothing is lost | The control **snaps back** and the toast says why (`Slack needs reconnecting…`) |
|
|
83
83
|
| Leaving | Unsaved work raises a dot on the section tab, and leaving asks first | Nothing can be unsaved, so nothing asks |
|
|
@@ -880,9 +880,9 @@ export function useSettingsWorkspace(): SettingsWorkspaceContext {
|
|
|
880
880
|
<BbBreadcrumbs
|
|
881
881
|
class="min-w-0"
|
|
882
882
|
:items="[
|
|
883
|
-
{
|
|
884
|
-
{
|
|
885
|
-
{
|
|
883
|
+
{ value: 'workspace', label: 'Fennel & Hart', to: '/' },
|
|
884
|
+
{ value: 'settings', label: 'Settings', to: '/settings' },
|
|
885
|
+
{ value: 'section', label: currentLabel },
|
|
886
886
|
]"
|
|
887
887
|
style="--flex-grow: 1"
|
|
888
888
|
/>
|
|
@@ -922,7 +922,7 @@ export function useSettingsWorkspace(): SettingsWorkspaceContext {
|
|
|
922
922
|
replace
|
|
923
923
|
variant="none"
|
|
924
924
|
>
|
|
925
|
-
<template #label="{ value,
|
|
925
|
+
<template #label="{ value, label }">
|
|
926
926
|
<!-- In the side column every label is one width, so the counts line
|
|
927
927
|
up on the right edge. -->
|
|
928
928
|
<span
|
|
@@ -930,7 +930,7 @@ export function useSettingsWorkspace(): SettingsWorkspaceContext {
|
|
|
930
930
|
:class="{ 'min-w-[11.5rem]': !isMobile }"
|
|
931
931
|
>
|
|
932
932
|
<BbIcon aria-hidden="true" :icon="SECTION_ICONS[value]" size="16" />
|
|
933
|
-
<span>{{
|
|
933
|
+
<span>{{ label }}</span>
|
|
934
934
|
<!-- Unsaved marker: a dot, not a word, so the label does not jump. -->
|
|
935
935
|
<span
|
|
936
936
|
v-if="value === 'profile' && ctx.profileDirty.value"
|
|
@@ -991,12 +991,12 @@ const { isMobile } = useMobile();
|
|
|
991
991
|
|
|
992
992
|
// `eager` on Profile: a half-edited draft must survive a look at Billing.
|
|
993
993
|
const sections: Array<BbTabsItem<SettingsSection>> = [
|
|
994
|
-
{
|
|
995
|
-
{
|
|
996
|
-
{
|
|
997
|
-
{
|
|
998
|
-
{
|
|
999
|
-
{
|
|
994
|
+
{ value: 'profile', label: 'Profile', eager: true },
|
|
995
|
+
{ value: 'notifications', label: 'Notifications' },
|
|
996
|
+
{ value: 'members', label: 'Members' },
|
|
997
|
+
{ value: 'billing', label: 'Billing' },
|
|
998
|
+
{ value: 'api-keys', label: 'API keys' },
|
|
999
|
+
{ value: 'danger-zone', label: 'Danger zone' },
|
|
1000
1000
|
];
|
|
1001
1001
|
|
|
1002
1002
|
// Full literals: the production icon scanner only bundles names it can see.
|
|
@@ -1178,7 +1178,6 @@ The explicit-save section: Zod schema, 422s, dirty footer.
|
|
|
1178
1178
|
not "differs from the values this form mounted with". -->
|
|
1179
1179
|
<BbForm
|
|
1180
1180
|
:id="PROFILE_FORM"
|
|
1181
|
-
v-slot="{ isSubmitting }"
|
|
1182
1181
|
:field-errors="ctx.serverErrors.profile.value"
|
|
1183
1182
|
:model="ctx.profileDraft"
|
|
1184
1183
|
:schema="profileSchema"
|
|
@@ -1208,8 +1207,6 @@ The explicit-save section: Zod schema, 422s, dirty footer.
|
|
|
1208
1207
|
/>
|
|
1209
1208
|
<BbSelect
|
|
1210
1209
|
description="Due dates and reminders follow this zone."
|
|
1211
|
-
item-text="label"
|
|
1212
|
-
item-value="value"
|
|
1213
1210
|
:items="TIMEZONES"
|
|
1214
1211
|
label="Time zone"
|
|
1215
1212
|
name="timezone"
|
|
@@ -1243,7 +1240,6 @@ The explicit-save section: Zod schema, 422s, dirty footer.
|
|
|
1243
1240
|
it says why, so the state is never a mystery. -->
|
|
1244
1241
|
<BbButton
|
|
1245
1242
|
:disabled="!ctx.profileDirty.value"
|
|
1246
|
-
:loading="isSubmitting"
|
|
1247
1243
|
type="submit"
|
|
1248
1244
|
variant="primary"
|
|
1249
1245
|
>
|
|
@@ -1887,8 +1883,6 @@ One-click role picker (BbSelectPopover).
|
|
|
1887
1883
|
<BbSelectPopover
|
|
1888
1884
|
v-else
|
|
1889
1885
|
:item-props="{ description: 'description' }"
|
|
1890
|
-
item-text="label"
|
|
1891
|
-
item-value="value"
|
|
1892
1886
|
:items="ROLE_OPTIONS"
|
|
1893
1887
|
:model-value="member.role"
|
|
1894
1888
|
width="280"
|
|
@@ -1973,21 +1967,21 @@ const items = computed<BbDropdownItem[]>(() => {
|
|
|
1973
1967
|
if (m.status === 'invited')
|
|
1974
1968
|
return [
|
|
1975
1969
|
{
|
|
1976
|
-
|
|
1977
|
-
|
|
1970
|
+
value: 'resend',
|
|
1971
|
+
label: 'Resend invitation',
|
|
1978
1972
|
'prepend:icon': 'lucide:send',
|
|
1979
1973
|
onClick: () => ctx.resendInvite(m),
|
|
1980
1974
|
},
|
|
1981
1975
|
{
|
|
1982
|
-
|
|
1983
|
-
|
|
1976
|
+
value: 'copy',
|
|
1977
|
+
label: 'Copy email',
|
|
1984
1978
|
'prepend:icon': 'lucide:copy',
|
|
1985
1979
|
onClick: () => ctx.copy(m.email, 'Email address'),
|
|
1986
1980
|
},
|
|
1987
1981
|
[
|
|
1988
1982
|
{
|
|
1989
|
-
|
|
1990
|
-
|
|
1983
|
+
value: 'revoke',
|
|
1984
|
+
label: 'Revoke invitation',
|
|
1991
1985
|
'prepend:icon': 'lucide:user-x',
|
|
1992
1986
|
variant: 'destructive',
|
|
1993
1987
|
onClick: () => ctx.removeMember(m),
|
|
@@ -1996,15 +1990,15 @@ const items = computed<BbDropdownItem[]>(() => {
|
|
|
1996
1990
|
];
|
|
1997
1991
|
return [
|
|
1998
1992
|
{
|
|
1999
|
-
|
|
2000
|
-
|
|
1993
|
+
value: 'copy',
|
|
1994
|
+
label: 'Copy email',
|
|
2001
1995
|
'prepend:icon': 'lucide:copy',
|
|
2002
1996
|
onClick: () => ctx.copy(m.email, 'Email address'),
|
|
2003
1997
|
},
|
|
2004
1998
|
[
|
|
2005
1999
|
{
|
|
2006
|
-
|
|
2007
|
-
|
|
2000
|
+
value: 'remove',
|
|
2001
|
+
label: 'Remove from workspace',
|
|
2008
2002
|
'prepend:icon': 'lucide:user-minus',
|
|
2009
2003
|
variant: 'destructive',
|
|
2010
2004
|
onClick: () => ctx.removeMember(m),
|
|
@@ -2050,8 +2044,6 @@ Invite by email: BbTag + role radios, footer submits from outside.
|
|
|
2050
2044
|
/>
|
|
2051
2045
|
<BbRadioGroup
|
|
2052
2046
|
:item-props="{ description: 'description' }"
|
|
2053
|
-
item-text="label"
|
|
2054
|
-
item-value="value"
|
|
2055
2047
|
:items="ROLE_OPTIONS"
|
|
2056
2048
|
legend="Role"
|
|
2057
2049
|
list-layout="vertical"
|
|
@@ -2516,8 +2508,6 @@ Create, then reveal once (persistent while shown).
|
|
|
2516
2508
|
<BbTextInput label="Name" name="name" placeholder="Production server" />
|
|
2517
2509
|
<BbRadioGroup
|
|
2518
2510
|
:item-props="{ description: 'description' }"
|
|
2519
|
-
item-text="label"
|
|
2520
|
-
item-value="value"
|
|
2521
2511
|
:items="SCOPES"
|
|
2522
2512
|
legend="Access"
|
|
2523
2513
|
list-layout="vertical"
|
|
@@ -2525,8 +2515,6 @@ Create, then reveal once (persistent while shown).
|
|
|
2525
2515
|
/>
|
|
2526
2516
|
<BbSelect
|
|
2527
2517
|
description="Short-lived keys limit the damage of a leak."
|
|
2528
|
-
item-text="label"
|
|
2529
|
-
item-value="value"
|
|
2530
2518
|
:items="EXPIRIES"
|
|
2531
2519
|
label="Expires"
|
|
2532
2520
|
name="expiresIn"
|
|
@@ -605,9 +605,9 @@ export function useUploadCenter(): UploadCenterContext {
|
|
|
605
605
|
<BbBreadcrumbs
|
|
606
606
|
class="min-w-0 flex-auto"
|
|
607
607
|
:items="[
|
|
608
|
-
{
|
|
609
|
-
{
|
|
610
|
-
{
|
|
608
|
+
{ value: 'dashboard', label: 'Dashboard', to: '/dashboard' },
|
|
609
|
+
{ value: 'expenses', label: 'Expenses', to: '/expenses' },
|
|
610
|
+
{ value: 'receipts', label: 'Receipts' },
|
|
611
611
|
]"
|
|
612
612
|
/>
|
|
613
613
|
<div class="flex shrink-0 items-center gap-2">
|
|
@@ -649,17 +649,17 @@ export function useUploadCenter(): UploadCenterContext {
|
|
|
649
649
|
compact
|
|
650
650
|
:items="[
|
|
651
651
|
{
|
|
652
|
-
|
|
652
|
+
value: 'drafts',
|
|
653
653
|
label: `Drafts · ${ctx.tabCounts.value.drafts}`,
|
|
654
654
|
href: '?tab=drafts',
|
|
655
655
|
},
|
|
656
656
|
{
|
|
657
|
-
|
|
657
|
+
value: 'submitted',
|
|
658
658
|
label: `Submitted · ${ctx.tabCounts.value.submitted}`,
|
|
659
659
|
href: '?tab=submitted',
|
|
660
660
|
},
|
|
661
661
|
{
|
|
662
|
-
|
|
662
|
+
value: 'reimbursed',
|
|
663
663
|
label: `Reimbursed · ${ctx.tabCounts.value.reimbursed}`,
|
|
664
664
|
href: '?tab=reimbursed',
|
|
665
665
|
},
|
|
@@ -1309,6 +1309,7 @@ const categoryName = computed(
|
|
|
1309
1309
|
label="Amount"
|
|
1310
1310
|
:max-precision="2"
|
|
1311
1311
|
:min="0"
|
|
1312
|
+
:min-precision="2"
|
|
1312
1313
|
placeholder="0.00"
|
|
1313
1314
|
variant="ghost"
|
|
1314
1315
|
@change="commit"
|
|
@@ -1328,32 +1329,24 @@ const props = defineProps<{ receipt: Receipt }>();
|
|
|
1328
1329
|
|
|
1329
1330
|
const ctx = useUploadCenter();
|
|
1330
1331
|
|
|
1331
|
-
|
|
1332
|
-
|
|
1333
|
-
|
|
1334
|
-
|
|
1335
|
-
|
|
1336
|
-
// commit on @change, not @blur + @keydown.enter (see MerchantCell.vue).
|
|
1337
|
-
const draft = ref<number | string | null>(formatMoney(props.receipt.amount));
|
|
1332
|
+
// Money cells always show two decimals (`min-precision`), so the column
|
|
1333
|
+
// optically aligns. Same commit/revert contract as the merchant cell, on the
|
|
1334
|
+
// number model — commit on @change, not @blur + @keydown.enter (see
|
|
1335
|
+
// MerchantCell.vue).
|
|
1336
|
+
const draft = ref<number | null>(props.receipt.amount);
|
|
1338
1337
|
watch(
|
|
1339
1338
|
() => props.receipt.amount,
|
|
1340
1339
|
(value) => {
|
|
1341
|
-
draft.value =
|
|
1340
|
+
draft.value = value;
|
|
1342
1341
|
}
|
|
1343
1342
|
);
|
|
1344
1343
|
|
|
1345
1344
|
const commit = () => {
|
|
1346
|
-
|
|
1347
|
-
|
|
1348
|
-
if (amount === props.receipt.amount) {
|
|
1349
|
-
draft.value = formatMoney(props.receipt.amount);
|
|
1350
|
-
return;
|
|
1351
|
-
}
|
|
1352
|
-
void ctx.updateReceipt(props.receipt, { amount });
|
|
1353
|
-
draft.value = formatMoney(amount);
|
|
1345
|
+
if (draft.value === props.receipt.amount) return;
|
|
1346
|
+
void ctx.updateReceipt(props.receipt, { amount: draft.value });
|
|
1354
1347
|
};
|
|
1355
1348
|
const revert = () => {
|
|
1356
|
-
draft.value =
|
|
1349
|
+
draft.value = props.receipt.amount;
|
|
1357
1350
|
};
|
|
1358
1351
|
</script>
|
|
1359
1352
|
```
|
|
@@ -1436,24 +1429,24 @@ const items = computed(() => {
|
|
|
1436
1429
|
...(isDraft
|
|
1437
1430
|
? [
|
|
1438
1431
|
{
|
|
1439
|
-
|
|
1440
|
-
|
|
1432
|
+
value: 'submit',
|
|
1433
|
+
label: 'Submit for approval',
|
|
1441
1434
|
'prepend:icon': 'lucide:send',
|
|
1442
1435
|
onClick: () => ctx.submitReceipt(receipt),
|
|
1443
1436
|
},
|
|
1444
1437
|
]
|
|
1445
1438
|
: []),
|
|
1446
1439
|
{
|
|
1447
|
-
|
|
1448
|
-
|
|
1440
|
+
value: 'download',
|
|
1441
|
+
label: 'Download original',
|
|
1449
1442
|
'prepend:icon': 'lucide:download',
|
|
1450
1443
|
href: `/receipts/${receipt.id}/file`,
|
|
1451
1444
|
},
|
|
1452
1445
|
...(isDraft
|
|
1453
1446
|
? [
|
|
1454
1447
|
{
|
|
1455
|
-
|
|
1456
|
-
|
|
1448
|
+
value: 'remove',
|
|
1449
|
+
label: 'Remove',
|
|
1457
1450
|
'prepend:icon': 'lucide:trash-2',
|
|
1458
1451
|
variant: 'destructive' as const,
|
|
1459
1452
|
onClick: () => ctx.deleteReceipt(receipt),
|
|
@@ -704,9 +704,9 @@ onMounted(() => {
|
|
|
704
704
|
});
|
|
705
705
|
|
|
706
706
|
const crumbs = computed(() => [
|
|
707
|
-
{
|
|
708
|
-
{
|
|
709
|
-
{
|
|
707
|
+
{ value: 'dashboard', label: 'Dashboard', to: '/dashboard' },
|
|
708
|
+
{ value: 'campaigns', label: 'Campaigns', to: '/campaigns' },
|
|
709
|
+
{ value: 'setup', label: ctx.campaign.value?.name ?? 'New campaign' },
|
|
710
710
|
]);
|
|
711
711
|
|
|
712
712
|
// The summary shows only the CURRENT step's issues, and only once the user
|
|
@@ -850,8 +850,6 @@ const status = (key: StepKey) => ctx.stepStatus(key);
|
|
|
850
850
|
|
|
851
851
|
<BbSelect
|
|
852
852
|
v-model="ctx.draft.countries"
|
|
853
|
-
item-text="label"
|
|
854
|
-
item-value="value"
|
|
855
853
|
:items="COUNTRIES"
|
|
856
854
|
label="Limit to countries"
|
|
857
855
|
label-mode="outside"
|
|
@@ -1015,8 +1013,6 @@ const errorsFor = (field: string) => ctx.fieldErrors('content', field);
|
|
|
1015
1013
|
|
|
1016
1014
|
<BbRadioGroup
|
|
1017
1015
|
v-model="ctx.draft.sendMode"
|
|
1018
|
-
item-text="label"
|
|
1019
|
-
item-value="value"
|
|
1020
1016
|
:items="[
|
|
1021
1017
|
{
|
|
1022
1018
|
label: 'Send now — goes out as soon as you confirm on Review',
|
|
@@ -1046,8 +1042,6 @@ const errorsFor = (field: string) => ctx.fieldErrors('content', field);
|
|
|
1046
1042
|
<BbSelect
|
|
1047
1043
|
v-model="ctx.draft.timezone"
|
|
1048
1044
|
:errors="errorsFor('timezone')"
|
|
1049
|
-
item-text="label"
|
|
1050
|
-
item-value="value"
|
|
1051
1045
|
:items="TIMEZONES"
|
|
1052
1046
|
label="Timezone"
|
|
1053
1047
|
label-mode="outside"
|
|
@@ -1533,8 +1527,6 @@ the file is unchanged, plus `BbCalendar` in its import):
|
|
|
1533
1527
|
<BbSelect
|
|
1534
1528
|
v-model="ctx.draft.timezone"
|
|
1535
1529
|
:errors="errorsFor('timezone')"
|
|
1536
|
-
item-text="label"
|
|
1537
|
-
item-value="value"
|
|
1538
1530
|
:items="TIMEZONES"
|
|
1539
1531
|
label="Timezone"
|
|
1540
1532
|
label-mode="outside"
|