bitboss-ui 3.0.0-beta.48 → 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 +115 -13
- package/dist/ai/BbAvatar.md +1 -1
- package/dist/ai/BbBreadcrumbs.md +65 -65
- package/dist/ai/BbButton.md +16 -5
- package/dist/ai/BbCheckbox.md +0 -2
- package/dist/ai/BbCheckboxGroup.md +13 -20
- 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 +4 -2
- package/dist/ai/BbNumberInput.md +88 -21
- package/dist/ai/BbPopover.md +29 -23
- 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 +106 -105
- package/dist/ai/BbTabsList.md +2 -2
- package/dist/ai/BbTabsPanels.md +1 -1
- package/dist/ai/BbTabsRoot.md +2 -2
- package/dist/ai/BbTooltip.md +24 -10
- package/dist/ai/BbTree.md +14 -11
- package/dist/ai/changelog.json +256 -5
- package/dist/ai/components.json +36 -34
- 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 +43 -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 +114 -17
- 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 +2 -2
- 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/BbBreadcrumbs.json +10 -6
- package/dist/ai/manifest/components/BbBreadcrumbs.tree.json +1 -1
- package/dist/ai/manifest/components/BbButton.json +1 -1
- package/dist/ai/manifest/components/BbCheckboxGroup.json +2 -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/BbNumberInput.json +6 -1
- package/dist/ai/manifest/components/BbNumberInput.tree.json +2 -1
- package/dist/ai/manifest/components/BbPopover.json +1 -0
- 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/BbSelectPopover.json +2 -2
- package/dist/ai/manifest/components/BbSwitchGroup.json +2 -2
- package/dist/ai/manifest/components/BbTabs.json +7 -6
- 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 +5 -4
- package/dist/ai/manifest/components/BbTooltip.json +1 -1
- package/dist/ai/manifest/index.json +2 -2
- package/dist/ai/manifest/meta.json +2 -0
- package/dist/ai/manifest/types.advanced.json +10 -9
- package/dist/ai/manifest/types.api.json +5 -4
- 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 +2 -2
- package/dist/ai/source/BbBadgeButton.md +5 -4
- 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 +71 -33
- 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/BbColorInput.md +10 -9
- package/dist/ai/source/BbConfirm.md +1 -1
- package/dist/ai/source/BbConfirmPortal.md +1 -1
- 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 +230 -158
- package/dist/ai/source/BbDropdownButton.md +19 -12
- package/dist/ai/source/BbDropdownGroup.md +126 -93
- package/dist/ai/source/BbForm.md +25 -1
- 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 +152 -8
- package/dist/ai/source/BbPopoverPortal.md +11 -0
- 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 +27 -23
- package/dist/ai/source/BbTabsList.md +26 -22
- package/dist/ai/source/BbTabsPanels.md +26 -22
- package/dist/ai/source/BbTabsRoot.md +25 -21
- 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 +54 -8
- 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 +6 -0
- 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 +84 -71
- package/dist/components/BbButton/toggleRoving.d.ts +6 -0
- package/dist/components/BbButton/toggleRoving.js +45 -0
- package/dist/components/BbButton/types.d.ts +4 -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/BbColorInput/BbColorInput.vue_vue_type_script_setup_true_lang.js +69 -69
- 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 +119 -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/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 -164
- package/dist/components/BbPopover/types.d.ts +11 -0
- 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 +25 -21
- 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 +102 -97
- package/dist/components/BbTooltip/tooltipWarmup.d.ts +23 -0
- package/dist/components/BbTooltip/tooltipWarmup.js +7 -0
- package/dist/components/BbTooltip/types.d.ts +7 -2
- 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/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/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 +1 -1
- package/dist/index.js +4 -4
- package/dist/llms-full.txt +1785 -1637
- package/dist/llms-medium.txt +74 -46
- package/dist/llms.txt +7 -7
- package/dist/locale-blueprint.json +16 -13
- package/dist/styles.css +2 -2
- package/dist/types/ptComponentMap.d.ts +1 -1
- 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 +12 -4
- package/scripts/lib/eslint-plugin.d.ts +5 -1
- package/scripts/lib/eslint-plugin.mjs +187 -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/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/validate-bb-markup.mjs +123 -56
- package/dist/i18n/index.js +0 -27
|
@@ -33,9 +33,8 @@ Sibling recipes: [Vue](../vue/ownership-atlas.md) ·
|
|
|
33
33
|
the peek stack, the close semantics and the sidebar's out-of-flow
|
|
34
34
|
behaviour are all load-bearing here.
|
|
35
35
|
- `<BbToast />` mounted once in the `createInertiaApp` render root — never in a page.
|
|
36
|
-
- From the [Inertia Helpers](../../guides/inertia-helpers.md) toolkit
|
|
37
|
-
`
|
|
38
|
-
`useProp` / `useQuery` prop-and-URL helpers).
|
|
36
|
+
- From the [Inertia Helpers](../../guides/inertia-helpers.md) toolkit, installed with
|
|
37
|
+
`npx bitboss-ui add useProp useQuery useQueryObject useResourceContext useTableContext`.
|
|
39
38
|
- Controller: `Inertia::render('OwnershipAtlas/Index', ['owners' =>
|
|
40
39
|
OwnerPaginator::make(...), 'tabCounts' => [...], 'ownerOptions' => [...]])` —
|
|
41
40
|
`owners` is a standard Laravel paginator (`PaginatedResponse<Owner>`) whose
|
|
@@ -188,10 +187,10 @@ import {
|
|
|
188
187
|
import {
|
|
189
188
|
useTableContext,
|
|
190
189
|
type TableContext,
|
|
191
|
-
} from '@/composables/useTableContext';
|
|
192
|
-
import { useQueryObject } from '@/composables/useQueryObject';
|
|
193
|
-
import { useProp } from '@/composables/useProp';
|
|
194
|
-
import { useQuery } from '@/composables/useQuery';
|
|
190
|
+
} from '@/composables/inertia-helpers/useTableContext';
|
|
191
|
+
import { useQueryObject } from '@/composables/inertia-helpers/useQueryObject';
|
|
192
|
+
import { useProp } from '@/composables/inertia-helpers/useProp';
|
|
193
|
+
import { useQuery } from '@/composables/inertia-helpers/useQuery';
|
|
195
194
|
import type {
|
|
196
195
|
HoldingKind,
|
|
197
196
|
HoldingStatus,
|
|
@@ -462,9 +461,9 @@ export function useOwnershipAtlas(): OwnershipAtlasContext {
|
|
|
462
461
|
<BbBreadcrumbs
|
|
463
462
|
class="min-w-0 flex-auto"
|
|
464
463
|
:items="[
|
|
465
|
-
{
|
|
466
|
-
{
|
|
467
|
-
{
|
|
464
|
+
{ value: 'admin', label: 'Admin', href: '/admin' },
|
|
465
|
+
{ value: 'access', label: 'Access', href: '/access' },
|
|
466
|
+
{ value: 'ownership', label: 'Ownership' },
|
|
468
467
|
]"
|
|
469
468
|
/>
|
|
470
469
|
<div class="flex shrink-0 items-center gap-2">
|
|
@@ -517,28 +516,28 @@ export function useOwnershipAtlas(): OwnershipAtlasContext {
|
|
|
517
516
|
compact
|
|
518
517
|
:items="[
|
|
519
518
|
{
|
|
520
|
-
|
|
519
|
+
value: 'all',
|
|
521
520
|
label: `All · ${ctx.tabCounts.value.all}`,
|
|
522
521
|
href: tabHref('all'),
|
|
523
522
|
server: true,
|
|
524
523
|
only: ['owners', 'tabCounts'],
|
|
525
524
|
},
|
|
526
525
|
{
|
|
527
|
-
|
|
526
|
+
value: 'americas',
|
|
528
527
|
label: `Americas · ${ctx.tabCounts.value.americas}`,
|
|
529
528
|
href: tabHref('americas'),
|
|
530
529
|
server: true,
|
|
531
530
|
only: ['owners', 'tabCounts'],
|
|
532
531
|
},
|
|
533
532
|
{
|
|
534
|
-
|
|
533
|
+
value: 'emea',
|
|
535
534
|
label: `EMEA · ${ctx.tabCounts.value.emea}`,
|
|
536
535
|
href: tabHref('emea'),
|
|
537
536
|
server: true,
|
|
538
537
|
only: ['owners', 'tabCounts'],
|
|
539
538
|
},
|
|
540
539
|
{
|
|
541
|
-
|
|
540
|
+
value: 'apac',
|
|
542
541
|
label: `APAC · ${ctx.tabCounts.value.apac}`,
|
|
543
542
|
href: tabHref('apac'),
|
|
544
543
|
server: true,
|
|
@@ -707,7 +706,7 @@ import {
|
|
|
707
706
|
} from 'bitboss-ui';
|
|
708
707
|
import qs from 'query-string';
|
|
709
708
|
import PageShell from '@/components/layout/PageShell.vue';
|
|
710
|
-
import { useQuery } from '@/composables/useQuery';
|
|
709
|
+
import { useQuery } from '@/composables/inertia-helpers/useQuery';
|
|
711
710
|
import {
|
|
712
711
|
provideOwnershipAtlas,
|
|
713
712
|
REGION_LABEL,
|
|
@@ -946,8 +945,6 @@ const monthLabel = (value: string) =>
|
|
|
946
945
|
<BbSelectPopover
|
|
947
946
|
v-model="ctx.filters.kinds"
|
|
948
947
|
clearable
|
|
949
|
-
item-text="label"
|
|
950
|
-
item-value="value"
|
|
951
948
|
:items="kindOptions"
|
|
952
949
|
multiple
|
|
953
950
|
>
|
|
@@ -1193,7 +1190,7 @@ const onTransfer = (value: unknown) => {
|
|
|
1193
1190
|
<script setup lang="ts">
|
|
1194
1191
|
import { watch } from 'vue';
|
|
1195
1192
|
import { BbBadge, BbButton, BbSpinner } from 'bitboss-ui';
|
|
1196
|
-
import { useResourceContext } from '@/composables/useResourceContext';
|
|
1193
|
+
import { useResourceContext } from '@/composables/inertia-helpers/useResourceContext';
|
|
1197
1194
|
import {
|
|
1198
1195
|
KIND_LABEL,
|
|
1199
1196
|
REGION_LABEL,
|
|
@@ -30,8 +30,8 @@ Sibling recipes: [Vue](../vue/record-form.md) ·
|
|
|
30
30
|
the peek stack, the close semantics and the sidebar's out-of-flow
|
|
31
31
|
behaviour are all load-bearing here.
|
|
32
32
|
- `<BbConfirm />` and `<BbToast />` mounted once in the `createInertiaApp` render root — never in a page.
|
|
33
|
-
- From the [Inertia Helpers](../../guides/inertia-helpers.md) toolkit
|
|
34
|
-
`
|
|
33
|
+
- From the [Inertia Helpers](../../guides/inertia-helpers.md) toolkit, installed with
|
|
34
|
+
`npx bitboss-ui add useConfirmOnRouteLeave usePromiseForm useProp useResourceContext`.
|
|
35
35
|
- Controller: `Inertia::render('InvoiceForm/Index', ['invoice' => $invoice])`
|
|
36
36
|
— `invoice` is `null` on the create route and the full record (including
|
|
37
37
|
`lineItems`) on the edit route. Standard Laravel validation; on failure
|
|
@@ -243,9 +243,9 @@ import {
|
|
|
243
243
|
usePageShellContext,
|
|
244
244
|
type PageShellContext,
|
|
245
245
|
} from '@/components/layout/usePageShellContext';
|
|
246
|
-
import { usePromiseForm } from '@/composables/usePromiseForm';
|
|
247
|
-
import { useConfirmOnRouteLeave } from '@/composables/useConfirmOnRouteLeave';
|
|
248
|
-
import { useProp } from '@/composables/useProp';
|
|
246
|
+
import { usePromiseForm } from '@/composables/inertia-helpers/usePromiseForm';
|
|
247
|
+
import { useConfirmOnRouteLeave } from '@/composables/inertia-helpers/useConfirmOnRouteLeave';
|
|
248
|
+
import { useProp } from '@/composables/inertia-helpers/useProp';
|
|
249
249
|
import type {
|
|
250
250
|
Customer,
|
|
251
251
|
CustomerDetail,
|
|
@@ -730,12 +730,12 @@ const ctx = provideInvoiceForm();
|
|
|
730
730
|
|
|
731
731
|
// A real trail, ≥ 2 linked levels; the current page carries no target.
|
|
732
732
|
const trail = computed(() => [
|
|
733
|
-
{
|
|
734
|
-
{
|
|
735
|
-
{
|
|
733
|
+
{ value: 'dashboard', label: 'Dashboard', href: '/dashboard' },
|
|
734
|
+
{ value: 'billing', label: 'Billing', href: '/billing' },
|
|
735
|
+
{ value: 'invoices', label: 'Invoices', href: '/invoices' },
|
|
736
736
|
{
|
|
737
|
-
|
|
738
|
-
|
|
737
|
+
value: 'invoice',
|
|
738
|
+
label:
|
|
739
739
|
ctx.mode === 'edit'
|
|
740
740
|
? (ctx.invoiceNumber.value ?? 'Invoice')
|
|
741
741
|
: 'New invoice',
|
|
@@ -1533,7 +1533,7 @@ import {
|
|
|
1533
1533
|
BbButton,
|
|
1534
1534
|
BbSpinner,
|
|
1535
1535
|
} from 'bitboss-ui';
|
|
1536
|
-
import { useResourceContext } from '@/composables/useResourceContext';
|
|
1536
|
+
import { useResourceContext } from '@/composables/inertia-helpers/useResourceContext';
|
|
1537
1537
|
import { INVOICE_STATUS_LABEL, useInvoiceForm } from './context';
|
|
1538
1538
|
import type { CustomerDetail } from '@/types';
|
|
1539
1539
|
|
|
@@ -32,9 +32,8 @@ Sibling recipes: [Vue](../vue/records-workspace.md) ·
|
|
|
32
32
|
`soft-green`, `soft-amber`, `soft-red`) — the status badges wear them; see
|
|
33
33
|
[design-language](../../guides/design-language.md) § Getting soft
|
|
34
34
|
semantic badges.
|
|
35
|
-
- From the [Inertia Helpers](../../guides/inertia-helpers.md) toolkit
|
|
36
|
-
`
|
|
37
|
-
`useResourceContext`.
|
|
35
|
+
- From the [Inertia Helpers](../../guides/inertia-helpers.md) toolkit, installed with
|
|
36
|
+
`npx bitboss-ui add useProp useQuery useQueryObject useResourceContext useTableContext`.
|
|
38
37
|
- Controller: `Inertia::render('InvoicesWorkspace/Index', ['invoices' =>
|
|
39
38
|
InvoicePaginator::make(...), 'tabCounts' => [...]])` — `invoices` is a
|
|
40
39
|
standard Laravel paginator (`PaginatedResponse<Invoice>`) and `tabCounts`
|
|
@@ -182,10 +181,10 @@ import {
|
|
|
182
181
|
import {
|
|
183
182
|
useTableContext,
|
|
184
183
|
type TableContext,
|
|
185
|
-
} from '@/composables/useTableContext';
|
|
186
|
-
import { useQueryObject } from '@/composables/useQueryObject';
|
|
187
|
-
import { useProp } from '@/composables/useProp';
|
|
188
|
-
import { useQuery } from '@/composables/useQuery';
|
|
184
|
+
} from '@/composables/inertia-helpers/useTableContext';
|
|
185
|
+
import { useQueryObject } from '@/composables/inertia-helpers/useQueryObject';
|
|
186
|
+
import { useProp } from '@/composables/inertia-helpers/useProp';
|
|
187
|
+
import { useQuery } from '@/composables/inertia-helpers/useQuery';
|
|
189
188
|
import type { Invoice, InvoiceStatus, PaymentDraft } from '@/types';
|
|
190
189
|
|
|
191
190
|
/**
|
|
@@ -574,9 +573,9 @@ export function useInvoicesWorkspace(): InvoicesWorkspaceContext {
|
|
|
574
573
|
<BbBreadcrumbs
|
|
575
574
|
class="min-w-0 flex-auto"
|
|
576
575
|
:items="[
|
|
577
|
-
{
|
|
578
|
-
{
|
|
579
|
-
{
|
|
576
|
+
{ value: 'dashboard', label: 'Dashboard', href: '/dashboard' },
|
|
577
|
+
{ value: 'billing', label: 'Billing', href: '/billing' },
|
|
578
|
+
{ value: 'invoices', label: 'Invoices' },
|
|
580
579
|
]"
|
|
581
580
|
/>
|
|
582
581
|
<div class="flex shrink-0 items-center gap-2">
|
|
@@ -621,28 +620,28 @@ export function useInvoicesWorkspace(): InvoicesWorkspaceContext {
|
|
|
621
620
|
compact
|
|
622
621
|
:items="[
|
|
623
622
|
{
|
|
624
|
-
|
|
623
|
+
value: 'all',
|
|
625
624
|
label: `All · ${ctx.tabCounts.value.all}`,
|
|
626
625
|
href: tabHref('all'),
|
|
627
626
|
server: true,
|
|
628
627
|
only: ['invoices', 'tabCounts'],
|
|
629
628
|
},
|
|
630
629
|
{
|
|
631
|
-
|
|
630
|
+
value: 'outstanding',
|
|
632
631
|
label: `Outstanding · ${ctx.tabCounts.value.outstanding}`,
|
|
633
632
|
href: tabHref('outstanding'),
|
|
634
633
|
server: true,
|
|
635
634
|
only: ['invoices', 'tabCounts'],
|
|
636
635
|
},
|
|
637
636
|
{
|
|
638
|
-
|
|
637
|
+
value: 'paid',
|
|
639
638
|
label: `Paid · ${ctx.tabCounts.value.paid}`,
|
|
640
639
|
href: tabHref('paid'),
|
|
641
640
|
server: true,
|
|
642
641
|
only: ['invoices', 'tabCounts'],
|
|
643
642
|
},
|
|
644
643
|
{
|
|
645
|
-
|
|
644
|
+
value: 'archived',
|
|
646
645
|
label: `Archived · ${ctx.tabCounts.value.archived}`,
|
|
647
646
|
href: tabHref('archived'),
|
|
648
647
|
server: true,
|
|
@@ -779,7 +778,7 @@ import {
|
|
|
779
778
|
} from 'bitboss-ui';
|
|
780
779
|
import qs from 'query-string';
|
|
781
780
|
import PageShell from '@/components/layout/PageShell.vue';
|
|
782
|
-
import { useQuery } from '@/composables/useQuery';
|
|
781
|
+
import { useQuery } from '@/composables/inertia-helpers/useQuery';
|
|
783
782
|
import { provideInvoicesWorkspace, type WorkspaceTab } from './context';
|
|
784
783
|
import CustomerPeek from './CustomerPeek.vue';
|
|
785
784
|
import DueDateCell from './DueDateCell.vue';
|
|
@@ -983,16 +982,16 @@ const searchCustomers = async ({
|
|
|
983
982
|
// Static enum facet: item text resolves synchronously, so its chip reads
|
|
984
983
|
// `useBbDropdownContext` (in FilterChip.vue) with zero extra fetch.
|
|
985
984
|
const statusGroup: BbDropdownItem = {
|
|
986
|
-
|
|
985
|
+
id: 'status',
|
|
987
986
|
label: 'Status',
|
|
988
987
|
hideLabel: true,
|
|
989
988
|
selectable: true,
|
|
990
989
|
multiple: true,
|
|
991
990
|
items: [
|
|
992
|
-
{
|
|
993
|
-
{
|
|
994
|
-
{
|
|
995
|
-
{
|
|
991
|
+
{ value: 'draft', label: INVOICE_STATUS_LABEL.draft },
|
|
992
|
+
{ value: 'pending', label: INVOICE_STATUS_LABEL.pending },
|
|
993
|
+
{ value: 'paid', label: INVOICE_STATUS_LABEL.paid },
|
|
994
|
+
{ value: 'overdue', label: INVOICE_STATUS_LABEL.overdue },
|
|
996
995
|
],
|
|
997
996
|
};
|
|
998
997
|
|
|
@@ -1004,7 +1003,7 @@ const statusGroup: BbDropdownItem = {
|
|
|
1004
1003
|
// redeclaring `prefill: true` would fetch every seeded facet twice on page
|
|
1005
1004
|
// load for nothing.
|
|
1006
1005
|
const customerGroup: BbDropdownItem = {
|
|
1007
|
-
|
|
1006
|
+
id: 'customer',
|
|
1008
1007
|
label: 'Customer',
|
|
1009
1008
|
hideLabel: true,
|
|
1010
1009
|
selectable: true,
|
|
@@ -1021,14 +1020,14 @@ const customerGroup: BbDropdownItem = {
|
|
|
1021
1020
|
// the category row already names the facet.
|
|
1022
1021
|
const menu = computed<BbDropdownItem[]>(() => [
|
|
1023
1022
|
{
|
|
1024
|
-
|
|
1025
|
-
|
|
1023
|
+
value: 'status-category',
|
|
1024
|
+
label: 'Status',
|
|
1026
1025
|
'prepend:icon': 'lucide:circle-dot',
|
|
1027
1026
|
items: [statusGroup],
|
|
1028
1027
|
},
|
|
1029
1028
|
{
|
|
1030
|
-
|
|
1031
|
-
|
|
1029
|
+
value: 'customer-category',
|
|
1030
|
+
label: 'Customer',
|
|
1032
1031
|
'prepend:icon': 'lucide:building-2',
|
|
1033
1032
|
items: [customerGroup],
|
|
1034
1033
|
},
|
|
@@ -1078,7 +1077,7 @@ import {
|
|
|
1078
1077
|
import type { BbDropdownItem } from 'bitboss-ui';
|
|
1079
1078
|
|
|
1080
1079
|
const props = defineProps<{
|
|
1081
|
-
/** Matches the group's `
|
|
1080
|
+
/** Matches the group's `id` in the Filters menu, and its entry in
|
|
1082
1081
|
* `useBbDropdownContext('invoice-filters').groups`. */
|
|
1083
1082
|
groupKey: string;
|
|
1084
1083
|
/** Static fallback/prefix text — the group itself sets `hideLabel`. */
|
|
@@ -1115,7 +1114,7 @@ const chipText = computed(() => {
|
|
|
1115
1114
|
dropdownFilters.groups.value[props.groupKey]?.selectedOptions ?? [];
|
|
1116
1115
|
if (!options.length) return props.label;
|
|
1117
1116
|
return `${props.label}: ${options
|
|
1118
|
-
.map((option) => option.
|
|
1117
|
+
.map((option) => option.label ?? String(option.value))
|
|
1119
1118
|
.join(', ')}`;
|
|
1120
1119
|
});
|
|
1121
1120
|
|
|
@@ -1131,7 +1130,6 @@ const onClear = () =>
|
|
|
1131
1130
|
<template>
|
|
1132
1131
|
<BbSelectPopover
|
|
1133
1132
|
item-text="text"
|
|
1134
|
-
item-value="value"
|
|
1135
1133
|
:items="INVOICE_STATUS_OPTIONS"
|
|
1136
1134
|
:model-value="invoice.status"
|
|
1137
1135
|
width="180"
|
|
@@ -1347,32 +1345,32 @@ const pillLabel = computed(() =>
|
|
|
1347
1345
|
:boundary="boundary"
|
|
1348
1346
|
:items="[
|
|
1349
1347
|
{
|
|
1350
|
-
|
|
1351
|
-
|
|
1348
|
+
value: 'edit',
|
|
1349
|
+
label: 'Edit',
|
|
1352
1350
|
'prepend:icon': 'lucide:pencil',
|
|
1353
1351
|
href: `/invoices/${invoice.id}/edit`,
|
|
1354
1352
|
},
|
|
1355
1353
|
{
|
|
1356
|
-
|
|
1357
|
-
|
|
1354
|
+
value: 'duplicate',
|
|
1355
|
+
label: 'Duplicate',
|
|
1358
1356
|
'prepend:icon': 'lucide:copy',
|
|
1359
1357
|
onClick: () => ctx.duplicateInvoice(invoice),
|
|
1360
1358
|
},
|
|
1361
1359
|
{
|
|
1362
|
-
|
|
1363
|
-
|
|
1360
|
+
value: 'payment',
|
|
1361
|
+
label: 'Record payment',
|
|
1364
1362
|
'prepend:icon': 'lucide:banknote',
|
|
1365
1363
|
onClick: () => (ctx.dialogs.recordPayment.value = invoice),
|
|
1366
1364
|
},
|
|
1367
1365
|
{
|
|
1368
|
-
|
|
1369
|
-
|
|
1366
|
+
value: 'archive',
|
|
1367
|
+
label: 'Archive',
|
|
1370
1368
|
'prepend:icon': 'lucide:archive',
|
|
1371
1369
|
onClick: () => ctx.archiveInvoice(invoice),
|
|
1372
1370
|
},
|
|
1373
1371
|
{
|
|
1374
|
-
|
|
1375
|
-
|
|
1372
|
+
value: 'delete',
|
|
1373
|
+
label: 'Delete',
|
|
1376
1374
|
'prepend:icon': 'lucide:trash-2',
|
|
1377
1375
|
variant: 'destructive',
|
|
1378
1376
|
onClick: () => ctx.deleteInvoice(invoice),
|
|
@@ -1605,7 +1603,7 @@ const ctx = useInvoicesWorkspace();
|
|
|
1605
1603
|
<script setup lang="ts">
|
|
1606
1604
|
import { ref, watch } from 'vue';
|
|
1607
1605
|
import { BbBaseButton, BbButton, BbIcon, BbSpinner, BbTable } from 'bitboss-ui';
|
|
1608
|
-
import { useResourceContext } from '@/composables/useResourceContext';
|
|
1606
|
+
import { useResourceContext } from '@/composables/inertia-helpers/useResourceContext';
|
|
1609
1607
|
import StatusCell from './StatusCell.vue';
|
|
1610
1608
|
import { useInvoicesWorkspace } from './context';
|
|
1611
1609
|
import type { InvoiceDetail } from '@/types';
|
|
@@ -1756,7 +1754,7 @@ import {
|
|
|
1756
1754
|
BbButton,
|
|
1757
1755
|
BbSpinner,
|
|
1758
1756
|
} from 'bitboss-ui';
|
|
1759
|
-
import { useResourceContext } from '@/composables/useResourceContext';
|
|
1757
|
+
import { useResourceContext } from '@/composables/inertia-helpers/useResourceContext';
|
|
1760
1758
|
import {
|
|
1761
1759
|
INVOICE_STATUS_LABEL,
|
|
1762
1760
|
INVOICE_STATUS_VARIANT,
|
|
@@ -1828,7 +1826,6 @@ const currency = new Intl.NumberFormat('en-US', {
|
|
|
1828
1826
|
<BbSelect
|
|
1829
1827
|
v-model="draft.method"
|
|
1830
1828
|
item-text="text"
|
|
1831
|
-
item-value="value"
|
|
1832
1829
|
:items="PAYMENT_METHOD_OPTIONS"
|
|
1833
1830
|
label="Method"
|
|
1834
1831
|
label-mode="outside"
|
|
@@ -32,8 +32,8 @@ Sibling recipes: [Vue](../vue/settings-workspace.md) · [Nuxt](../nuxt/settings-
|
|
|
32
32
|
`DELETE /settings/api-keys/{id}`, `POST /settings/workspace/delete`
|
|
33
33
|
(redirects to `/`). A refusal only the server can know (Slack's expired
|
|
34
34
|
token) comes back as a validation error on `channels`.
|
|
35
|
-
-
|
|
36
|
-
`
|
|
35
|
+
- From the [Inertia Helpers](../../guides/inertia-helpers.md) toolkit, installed with
|
|
36
|
+
`npx bitboss-ui add useConfirmOnRouteLeave useProp`.
|
|
37
37
|
|
|
38
38
|
## Key ideas
|
|
39
39
|
|
|
@@ -84,7 +84,7 @@ per field, and never mix both inside one card.
|
|
|
84
84
|
| ---------------- | ---------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------- |
|
|
85
85
|
| What it is | Typed text, several fields that belong together | One discrete choice: a switch, a checkbox, a role, a file |
|
|
86
86
|
| Commit | A **Save** button in the card footer, disabled until something changed | The change itself. No button anywhere |
|
|
87
|
-
| While saving | The button spins
|
|
87
|
+
| 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 |
|
|
88
88
|
| On success | A toast; the dirty state rebaselines to what was saved | A quiet toast (`Delivery channels saved.`) |
|
|
89
89
|
| 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…`) |
|
|
90
90
|
| Leaving | Unsaved work raises a dot on the section tab, and leaving asks first | Nothing can be unsaved, so nothing asks |
|
|
@@ -232,8 +232,8 @@ import {
|
|
|
232
232
|
useConfirm,
|
|
233
233
|
useToast,
|
|
234
234
|
} from 'bitboss-ui';
|
|
235
|
-
import { useConfirmOnRouteLeave } from '@/composables/useConfirmOnRouteLeave';
|
|
236
|
-
import { useProp } from '@/composables/useProp';
|
|
235
|
+
import { useConfirmOnRouteLeave } from '@/composables/inertia-helpers/useConfirmOnRouteLeave';
|
|
236
|
+
import { useProp } from '@/composables/inertia-helpers/useProp';
|
|
237
237
|
import type {
|
|
238
238
|
ApiKey,
|
|
239
239
|
ApiKeyDraft,
|
|
@@ -848,9 +848,9 @@ export function useSettingsWorkspace(): SettingsWorkspaceContext {
|
|
|
848
848
|
<BbBreadcrumbs
|
|
849
849
|
class="min-w-0"
|
|
850
850
|
:items="[
|
|
851
|
-
{
|
|
852
|
-
{
|
|
853
|
-
{
|
|
851
|
+
{ value: 'workspace', label: 'Fennel & Hart', href: '/' },
|
|
852
|
+
{ value: 'settings', label: 'Settings', href: '/settings' },
|
|
853
|
+
{ value: 'section', label: currentLabel },
|
|
854
854
|
]"
|
|
855
855
|
style="--flex-grow: 1"
|
|
856
856
|
/>
|
|
@@ -890,7 +890,7 @@ export function useSettingsWorkspace(): SettingsWorkspaceContext {
|
|
|
890
890
|
replace
|
|
891
891
|
variant="none"
|
|
892
892
|
>
|
|
893
|
-
<template #label="{ value,
|
|
893
|
+
<template #label="{ value, label }">
|
|
894
894
|
<!-- In the side column every label is one width, so the counts line
|
|
895
895
|
up on the right edge. -->
|
|
896
896
|
<span
|
|
@@ -898,7 +898,7 @@ export function useSettingsWorkspace(): SettingsWorkspaceContext {
|
|
|
898
898
|
:class="{ 'min-w-[11.5rem]': !isMobile }"
|
|
899
899
|
>
|
|
900
900
|
<BbIcon aria-hidden="true" :icon="SECTION_ICONS[value]" size="16" />
|
|
901
|
-
<span>{{
|
|
901
|
+
<span>{{ label }}</span>
|
|
902
902
|
<!-- Unsaved marker: a dot, not a word, so the label does not jump. -->
|
|
903
903
|
<span
|
|
904
904
|
v-if="value === 'profile' && ctx.profileDirty.value"
|
|
@@ -959,12 +959,12 @@ const { isMobile } = useMobile();
|
|
|
959
959
|
|
|
960
960
|
// `eager` on Profile: a half-edited draft must survive a look at Billing.
|
|
961
961
|
const sections: Array<BbTabsItem<SettingsSection>> = [
|
|
962
|
-
{
|
|
963
|
-
{
|
|
964
|
-
{
|
|
965
|
-
{
|
|
966
|
-
{
|
|
967
|
-
{
|
|
962
|
+
{ value: 'profile', label: 'Profile', eager: true },
|
|
963
|
+
{ value: 'notifications', label: 'Notifications' },
|
|
964
|
+
{ value: 'members', label: 'Members' },
|
|
965
|
+
{ value: 'billing', label: 'Billing' },
|
|
966
|
+
{ value: 'api-keys', label: 'API keys' },
|
|
967
|
+
{ value: 'danger-zone', label: 'Danger zone' },
|
|
968
968
|
];
|
|
969
969
|
|
|
970
970
|
// Full literals: the production icon scanner only bundles names it can see.
|
|
@@ -1146,7 +1146,6 @@ The explicit-save section: Zod schema, 422s, dirty footer.
|
|
|
1146
1146
|
not "differs from the values this form mounted with". -->
|
|
1147
1147
|
<BbForm
|
|
1148
1148
|
:id="PROFILE_FORM"
|
|
1149
|
-
v-slot="{ isSubmitting }"
|
|
1150
1149
|
:field-errors="ctx.serverErrors.profile.value"
|
|
1151
1150
|
:model="ctx.profileDraft"
|
|
1152
1151
|
:schema="profileSchema"
|
|
@@ -1176,8 +1175,6 @@ The explicit-save section: Zod schema, 422s, dirty footer.
|
|
|
1176
1175
|
/>
|
|
1177
1176
|
<BbSelect
|
|
1178
1177
|
description="Due dates and reminders follow this zone."
|
|
1179
|
-
item-text="label"
|
|
1180
|
-
item-value="value"
|
|
1181
1178
|
:items="TIMEZONES"
|
|
1182
1179
|
label="Time zone"
|
|
1183
1180
|
name="timezone"
|
|
@@ -1211,7 +1208,6 @@ The explicit-save section: Zod schema, 422s, dirty footer.
|
|
|
1211
1208
|
it says why, so the state is never a mystery. -->
|
|
1212
1209
|
<BbButton
|
|
1213
1210
|
:disabled="!ctx.profileDirty.value"
|
|
1214
|
-
:loading="isSubmitting"
|
|
1215
1211
|
type="submit"
|
|
1216
1212
|
variant="primary"
|
|
1217
1213
|
>
|
|
@@ -1855,8 +1851,6 @@ One-click role picker (BbSelectPopover).
|
|
|
1855
1851
|
<BbSelectPopover
|
|
1856
1852
|
v-else
|
|
1857
1853
|
:item-props="{ description: 'description' }"
|
|
1858
|
-
item-text="label"
|
|
1859
|
-
item-value="value"
|
|
1860
1854
|
:items="ROLE_OPTIONS"
|
|
1861
1855
|
:model-value="member.role"
|
|
1862
1856
|
width="280"
|
|
@@ -1941,21 +1935,21 @@ const items = computed<BbDropdownItem[]>(() => {
|
|
|
1941
1935
|
if (m.status === 'invited')
|
|
1942
1936
|
return [
|
|
1943
1937
|
{
|
|
1944
|
-
|
|
1945
|
-
|
|
1938
|
+
value: 'resend',
|
|
1939
|
+
label: 'Resend invitation',
|
|
1946
1940
|
'prepend:icon': 'lucide:send',
|
|
1947
1941
|
onClick: () => ctx.resendInvite(m),
|
|
1948
1942
|
},
|
|
1949
1943
|
{
|
|
1950
|
-
|
|
1951
|
-
|
|
1944
|
+
value: 'copy',
|
|
1945
|
+
label: 'Copy email',
|
|
1952
1946
|
'prepend:icon': 'lucide:copy',
|
|
1953
1947
|
onClick: () => ctx.copy(m.email, 'Email address'),
|
|
1954
1948
|
},
|
|
1955
1949
|
[
|
|
1956
1950
|
{
|
|
1957
|
-
|
|
1958
|
-
|
|
1951
|
+
value: 'revoke',
|
|
1952
|
+
label: 'Revoke invitation',
|
|
1959
1953
|
'prepend:icon': 'lucide:user-x',
|
|
1960
1954
|
variant: 'destructive',
|
|
1961
1955
|
onClick: () => ctx.removeMember(m),
|
|
@@ -1964,15 +1958,15 @@ const items = computed<BbDropdownItem[]>(() => {
|
|
|
1964
1958
|
];
|
|
1965
1959
|
return [
|
|
1966
1960
|
{
|
|
1967
|
-
|
|
1968
|
-
|
|
1961
|
+
value: 'copy',
|
|
1962
|
+
label: 'Copy email',
|
|
1969
1963
|
'prepend:icon': 'lucide:copy',
|
|
1970
1964
|
onClick: () => ctx.copy(m.email, 'Email address'),
|
|
1971
1965
|
},
|
|
1972
1966
|
[
|
|
1973
1967
|
{
|
|
1974
|
-
|
|
1975
|
-
|
|
1968
|
+
value: 'remove',
|
|
1969
|
+
label: 'Remove from workspace',
|
|
1976
1970
|
'prepend:icon': 'lucide:user-minus',
|
|
1977
1971
|
variant: 'destructive',
|
|
1978
1972
|
onClick: () => ctx.removeMember(m),
|
|
@@ -2018,8 +2012,6 @@ Invite by email: BbTag + role radios, footer submits from outside.
|
|
|
2018
2012
|
/>
|
|
2019
2013
|
<BbRadioGroup
|
|
2020
2014
|
:item-props="{ description: 'description' }"
|
|
2021
|
-
item-text="label"
|
|
2022
|
-
item-value="value"
|
|
2023
2015
|
:items="ROLE_OPTIONS"
|
|
2024
2016
|
legend="Role"
|
|
2025
2017
|
list-layout="vertical"
|
|
@@ -2484,8 +2476,6 @@ Create, then reveal once (persistent while shown).
|
|
|
2484
2476
|
<BbTextInput label="Name" name="name" placeholder="Production server" />
|
|
2485
2477
|
<BbRadioGroup
|
|
2486
2478
|
:item-props="{ description: 'description' }"
|
|
2487
|
-
item-text="label"
|
|
2488
|
-
item-value="value"
|
|
2489
2479
|
:items="SCOPES"
|
|
2490
2480
|
legend="Access"
|
|
2491
2481
|
list-layout="vertical"
|
|
@@ -2493,8 +2483,6 @@ Create, then reveal once (persistent while shown).
|
|
|
2493
2483
|
/>
|
|
2494
2484
|
<BbSelect
|
|
2495
2485
|
description="Short-lived keys limit the damage of a leak."
|
|
2496
|
-
item-text="label"
|
|
2497
|
-
item-value="value"
|
|
2498
2486
|
:items="EXPIRIES"
|
|
2499
2487
|
label="Expires"
|
|
2500
2488
|
name="expiresIn"
|