From 46b7b8cfc557c2146cb233071731378bfd3dad1f Mon Sep 17 00:00:00 2001 From: Lanzhijiang Date: Sat, 13 Jun 2026 17:29:40 +0800 Subject: [PATCH 01/94] fix(frontend): wire design-web 0.4.0 primitives Upgrade the frontend to @partner-up-dev/design-web 0.4.0 and remove the local package-root type adapter so named imports resolve through the published package declarations. Migrate the first feedback/layout slice to package-backed primitives and restore footer padding on the scaffold footer surface. --- apps/frontend/package.json | 2 +- .../src/shared/ui/feedback/EmptyState.vue | 102 ++++-------------- .../shared/ui/feedback/LoadingIndicator.vue | 46 +++----- .../src/shared/ui/sections/PageFooter.vue | 29 ++++- .../src/types/design-web-runtime.d.ts | 12 --- apps/frontend/tsconfig.json | 3 - pnpm-lock.yaml | 10 +- 7 files changed, 65 insertions(+), 139 deletions(-) delete mode 100644 apps/frontend/src/types/design-web-runtime.d.ts diff --git a/apps/frontend/package.json b/apps/frontend/package.json index 0a3ea4795..469894a7e 100644 --- a/apps/frontend/package.json +++ b/apps/frontend/package.json @@ -13,7 +13,7 @@ "lint:tokens:strict": "node ./scripts/check-token-governance.mjs --strict" }, "dependencies": { - "@partner-up-dev/design-web": "0.2.0", + "@partner-up-dev/design-web": "0.4.0", "@tanstack/vue-query": "^5.60.0", "@unhead/vue": "^2.1.2", "@vee-validate/zod": "^4.15.1", diff --git a/apps/frontend/src/shared/ui/feedback/EmptyState.vue b/apps/frontend/src/shared/ui/feedback/EmptyState.vue index 587b55f65..d26a2f882 100644 --- a/apps/frontend/src/shared/ui/feedback/EmptyState.vue +++ b/apps/frontend/src/shared/ui/feedback/EmptyState.vue @@ -1,42 +1,33 @@ - - diff --git a/apps/frontend/src/shared/ui/feedback/LoadingIndicator.vue b/apps/frontend/src/shared/ui/feedback/LoadingIndicator.vue index 18418ed5d..eee8408a6 100644 --- a/apps/frontend/src/shared/ui/feedback/LoadingIndicator.vue +++ b/apps/frontend/src/shared/ui/feedback/LoadingIndicator.vue @@ -1,41 +1,21 @@ - - +const resolvedLabel = computed(() => props.message ?? t("common.loading")); + diff --git a/apps/frontend/src/shared/ui/sections/PageFooter.vue b/apps/frontend/src/shared/ui/sections/PageFooter.vue index f5cdea54b..fba890b55 100644 --- a/apps/frontend/src/shared/ui/sections/PageFooter.vue +++ b/apps/frontend/src/shared/ui/sections/PageFooter.vue @@ -127,6 +127,9 @@ const visibleFooterLinks = computed(() => .page-footer--minimal { margin-top: var(--sys-spacing-large); padding-top: var(--sys-spacing-small); + padding-right: calc(var(--sys-spacing-medium) + var(--pu-safe-right)); + padding-bottom: var(--sys-spacing-medium); + padding-left: calc(var(--sys-spacing-medium) + var(--pu-safe-left)); border-top: 1px solid var(--sys-color-outline-variant); .page-footer__nav { @@ -150,11 +153,29 @@ const visibleFooterLinks = computed(() => flex-direction: column; justify-content: flex-start; gap: var(--page-footer-gap); - padding-top: var(--page-footer-padding-top, 0); - padding-left: var(--page-footer-padding-inline-start, 0); - padding-right: var(--page-footer-padding-inline-end, 0); + padding-top: var( + --page-footer-padding-top, + var(--landing-section-padding-block, var(--sys-spacing-large)) + ); + padding-left: var( + --page-footer-padding-inline-start, + calc( + var(--landing-section-padding-inline-compact, var(--sys-spacing-medium)) + + var(--pu-safe-left) + ) + ); + padding-right: var( + --page-footer-padding-inline-end, + calc( + var(--landing-section-padding-inline-compact, var(--sys-spacing-medium)) + + var(--pu-safe-right) + ) + ); padding-bottom: calc( - var(--landing-section-padding-block) + var(--pu-safe-bottom) + var( + --page-footer-padding-bottom, + var(--landing-section-padding-block, var(--sys-spacing-large)) + ) + var(--pu-safe-bottom) ); animation-delay: 260ms; background-color: var(--sys-color-surface-container); diff --git a/apps/frontend/src/types/design-web-runtime.d.ts b/apps/frontend/src/types/design-web-runtime.d.ts deleted file mode 100644 index 5090eaaf4..000000000 --- a/apps/frontend/src/types/design-web-runtime.d.ts +++ /dev/null @@ -1,12 +0,0 @@ -import type { DefineComponent } from "vue"; - -type DesignWebComponent = DefineComponent< - Record, - Record, - unknown ->; - -export const PuCard: DesignWebComponent; -export const PuButton: DesignWebComponent; -export const PuInlineNotice: DesignWebComponent; -export const PuPageScaffold: DesignWebComponent; diff --git a/apps/frontend/tsconfig.json b/apps/frontend/tsconfig.json index ac48c5e98..fd9a45e43 100644 --- a/apps/frontend/tsconfig.json +++ b/apps/frontend/tsconfig.json @@ -22,9 +22,6 @@ "@/*": [ "./src/*" ], - "@partner-up-dev/design-web": [ - "./src/types/design-web-runtime.d.ts" - ], "@partner-up-dev/backend": [ "../backend/src/index.ts" ] diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 664da7a08..133437e2a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -122,8 +122,8 @@ importers: apps/frontend: dependencies: '@partner-up-dev/design-web': - specifier: 0.2.0 - version: 0.2.0(sass@1.97.3)(unocss@66.6.8(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(vite@6.4.1(@types/node@22.19.7)(jiti@2.7.0)(sass@1.97.3)(tsx@4.21.0)))(vue@3.5.35(typescript@6.0.3)) + specifier: 0.4.0 + version: 0.4.0(sass@1.97.3)(unocss@66.6.8(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(vite@6.4.1(@types/node@22.19.7)(jiti@2.7.0)(sass@1.97.3)(tsx@4.21.0)))(vue@3.5.35(typescript@6.0.3)) '@tanstack/vue-query': specifier: ^5.60.0 version: 5.92.9(vue@3.5.35(typescript@6.0.3)) @@ -1187,8 +1187,8 @@ packages: resolution: {integrity: sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==} engines: {node: '>= 10.0.0'} - '@partner-up-dev/design-web@0.2.0': - resolution: {integrity: sha512-nBHED6bde25iMIdedtpSgvz/XWSYEAq0YnRJw/ftpsE2EzzMgDWTLjDZ8JW2XiXYHqOdn8T9CK1biefrFENu6w==, tarball: https://npm.pkg.github.com/download/@partner-up-dev/design-web/0.2.0/a701a8a93ded45b19b50af8bbfe0fb876e387868} + '@partner-up-dev/design-web@0.4.0': + resolution: {integrity: sha512-LS1Sx+SmpecJQZaFTbuKOJc3rMU5TFCrk4oF4o5a/WvoWAV0VNhsmUr8OLid82Zg3nlAEKDaduUhI9cA+6IorA==, tarball: https://npm.pkg.github.com/download/@partner-up-dev/design-web/0.4.0/84e662924ef8d06aab22ad3ffd865ac9c0f5f99b} peerDependencies: sass: ^1.94.2 unocss: ^66.6.8 @@ -3379,7 +3379,7 @@ snapshots: '@parcel/watcher-win32-x64': 2.5.6 optional: true - '@partner-up-dev/design-web@0.2.0(sass@1.97.3)(unocss@66.6.8(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(vite@6.4.1(@types/node@22.19.7)(jiti@2.7.0)(sass@1.97.3)(tsx@4.21.0)))(vue@3.5.35(typescript@6.0.3))': + '@partner-up-dev/design-web@0.4.0(sass@1.97.3)(unocss@66.6.8(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(vite@6.4.1(@types/node@22.19.7)(jiti@2.7.0)(sass@1.97.3)(tsx@4.21.0)))(vue@3.5.35(typescript@6.0.3))': dependencies: sass: 1.97.3 unocss: 66.6.8(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(vite@6.4.1(@types/node@22.19.7)(jiti@2.7.0)(sass@1.97.3)(tsx@4.21.0)) From 43d8c8bedc2a540dfaf4818009e77c4590ea2587 Mon Sep 17 00:00:00 2001 From: Lanzhijiang Date: Sat, 13 Jun 2026 20:19:09 +0800 Subject: [PATCH 02/94] refactor(frontend): migrate design-web component slice --- .../ui/json-logic/JsonLogicRuleEditor.vue | 41 +- .../ui/pricing-rules/PricingRulesEditor.vue | 4 +- .../AdminCommerceCancellationPolicyEditor.vue | 4 +- .../AdminCommerceProductWorkspaceGate.vue | 4 +- .../sections/AdminCommerceSpuEditor.vue | 8 +- .../AnchorEventLandingRolloutEditor.vue | 4 +- .../AnchorEventPendingPreferenceTagList.vue | 4 +- .../components/AnchorEventPlacePoolEditor.vue | 42 +- .../AnchorEventPreferenceTagPoolEditor.vue | 4 +- .../sections/AnchorEventOtherSection.vue | 14 +- .../AnchorEventRouteApplicationsSection.vue | 16 +- .../admin/ui/layout/AdminPageScaffold.vue | 6 +- .../ui/poi/sections/PoiReviewSection.vue | 15 +- .../admin/ui/pr/views/AdminPRBasicView.vue | 4 +- .../admin/ui/pr/views/AdminPRMessagesView.vue | 4 +- .../ui/ordering/OrderingPageShell.vue | 6 +- .../ui/ordering/RentalOrderingForm.vue | 10 +- .../form-mode/FormModePreferenceControl.vue | 4 +- .../form-mode/FormModeTimeControl.vue | 6 +- .../ui/primitives/AnchorEventDemandCard.vue | 28 +- .../domains/event/ui/primitives/EventCard.vue | 88 +- .../landing/EventHighlightsSection.vue | 19 +- .../surfaces/AnchorEventFormModeSurface.vue | 4 +- .../feedback/ui/FeedbackQuestionnaireForm.vue | 17 +- .../location/ui/LocationPickerPanel.vue | 6 +- .../domains/pr/ui/composites/PRFactsCard.vue | 455 ++++++---- .../src/domains/pr/ui/forms/NLPRForm.vue | 15 +- .../src/domains/pr/ui/forms/PREditor.vue | 8 +- .../domains/pr/ui/forms/PRPlaceModeField.vue | 41 +- .../pr/ui/primitives/PRPreviewCardFrame.vue | 11 +- .../pr/ui/sections/PRDraftPublishNotice.vue | 6 +- .../domains/pr/ui/sections/PRJoinAction.vue | 6 +- .../pr/ui/sections/PRMessageThread.vue | 30 +- .../pr/ui/sections/PRPartnerSection.vue | 10 +- .../pr/ui/sections/PRWaitlistActions.vue | 6 +- .../ui/methods/xhs/ShareToXiaohongshu.vue | 3 +- apps/frontend/src/pages/AboutPage.vue | 6 +- .../frontend/src/pages/AdminAnalyticsPage.vue | 38 +- .../src/pages/AdminAnchorEventPage.vue | 4 +- .../pages/AdminCommerceFulfillmentPage.vue | 13 +- .../src/pages/AdminCommerceOfferPage.vue | 4 +- .../src/pages/AdminCommerceOrderBillPage.vue | 7 +- .../src/pages/AdminCommercePlacementPage.vue | 4 +- .../pages/AdminFeedbackQuestionnairesPage.vue | 4 +- apps/frontend/src/pages/AdminLoginPage.vue | 8 +- apps/frontend/src/pages/AdminPaymentPage.vue | 6 +- apps/frontend/src/pages/AdminPoisPage.vue | 4 +- .../src/pages/AdminRideHailingPage.vue | 4 +- .../src/pages/AnchorEventLandingPage.vue | 51 +- apps/frontend/src/pages/BIEntryPage.vue | 9 +- .../src/pages/CommerceBillDetailPage.vue | 14 +- .../src/pages/CommerceOrderDetailPage.vue | 20 +- apps/frontend/src/pages/ContactAuthorPage.vue | 9 +- .../frontend/src/pages/ContactSupportPage.vue | 17 +- apps/frontend/src/pages/EventPRSearchPage.vue | 23 +- apps/frontend/src/pages/EventPlazaPage.vue | 14 +- .../src/pages/LocationApplicationPage.vue | 35 +- .../frontend/src/pages/LocationPickerPage.vue | 6 +- apps/frontend/src/pages/MePage.vue | 53 +- apps/frontend/src/pages/MyPRsPage.vue | 11 +- .../src/pages/OrderingFromPlacementPage.vue | 6 +- apps/frontend/src/pages/PRCreatePage.vue | 6 +- apps/frontend/src/pages/PRMessagesPage.vue | 6 +- apps/frontend/src/pages/PRPage.vue | 12 +- apps/frontend/src/pages/PRPairingCodePage.vue | 4 +- .../src/pages/PaymentCheckoutPage.vue | 22 +- .../src/pages/RouteApplicationPage.vue | 35 +- .../src/pages/StudySprintPomodoroPage.vue | 13 +- apps/frontend/src/pages/UserProfilePage.vue | 32 +- .../src/pages/WeChatOAuthCallbackPage.vue | 10 +- apps/frontend/src/shared/ui/AGENTS.md | 24 +- .../shared/ui/controls/SegmentedControl.vue | 159 ---- apps/frontend/src/shared/ui/display/Cell.vue | 150 ---- apps/frontend/src/shared/ui/display/Chip.vue | 96 --- .../src/shared/ui/display/ChipGroup.vue | 58 -- .../src/shared/ui/display/FitChipGroup.vue | 226 ----- .../src/shared/ui/display/InfoRow.vue | 94 --- .../src/shared/ui/display/InfoRowAction.vue | 128 --- .../src/shared/ui/feedback/EmptyState.vue | 56 -- .../src/shared/ui/feedback/InlineNotice.vue | 45 - .../shared/ui/feedback/LoadingIndicator.vue | 21 - .../src/shared/ui/forms/FormField.vue | 86 -- .../src/shared/ui/forms/TextInput.vue | 89 -- .../src/shared/ui/forms/TextareaInput.vue | 111 --- .../src/shared/ui/forms/ToggleSwitch.vue | 125 --- .../src/shared/ui/forms/WheelPicker.vue | 791 ------------------ .../src/shared/ui/identity/Avatar.vue | 155 ---- .../shared/ui/layout/DesktopPageScaffold.vue | 27 - .../ui/layout/FooterRevealPageScaffold.vue | 35 - .../ui/layout/FullScreenPageScaffold.vue | 23 - .../src/shared/ui/layout/PageScaffold.vue | 9 - .../shared/ui/layout/PageScaffoldCentered.vue | 24 - .../src/shared/ui/layout/PageScaffoldFlow.vue | 24 - .../src/shared/upload/ImageUrlInput.vue | 6 +- .../component-migration/00-control-surface.md | 195 +++++ .../component-migration/10-slice-index.md | 94 +++ .../component-migration/90-discussion-log.md | 172 ++++ .../components/00-type-entry.md | 59 ++ .../components/_template.md | 38 + .../components/action-link.md | 33 + .../component-migration/components/avatar.md | 39 + .../components/bottom-drawer.md | 33 + .../component-migration/components/button.md | 56 ++ .../component-migration/components/cell.md | 37 + .../components/chip-group.md | 47 ++ .../component-migration/components/chip.md | 51 ++ .../components/choice-card.md | 32 + .../components/confirm-dialog.md | 32 + .../components/empty-state.md | 53 ++ .../components/error-toast.md | 31 + .../components/feedback-button.md | 30 + .../components/form-field.md | 47 ++ .../component-migration/components/form.md | 50 ++ .../component-migration/components/img.md | 64 ++ .../components/info-row.md | 48 ++ .../components/inline-notice.md | 50 ++ .../components/loading-indicator.md | 53 ++ .../component-migration/components/modal.md | 35 + .../components/page-footer.md | 47 ++ .../components/page-scaffold.md | 56 ++ .../components/segmented-control.md | 48 ++ .../component-migration/components/tag.md | 46 + .../components/text-input.md | 42 + .../components/textarea-input.md | 44 + .../components/toggle-switch.md | 38 + .../components/wheel-picker.md | 44 + .../component-migration/evidence/README.md | 109 +++ .../evidence/home-040-mobile.png | Bin 0 -> 127252 bytes .../evidence/home-footer-mobile.png | Bin 0 -> 135124 bytes .../evidence/pr-040-mobile.png | Bin 0 -> 6188 bytes .../evidence/pr-footer-mobile.png | Bin 0 -> 8160 bytes 131 files changed, 2686 insertions(+), 3192 deletions(-) delete mode 100644 apps/frontend/src/shared/ui/controls/SegmentedControl.vue delete mode 100644 apps/frontend/src/shared/ui/display/Cell.vue delete mode 100644 apps/frontend/src/shared/ui/display/Chip.vue delete mode 100644 apps/frontend/src/shared/ui/display/ChipGroup.vue delete mode 100644 apps/frontend/src/shared/ui/display/FitChipGroup.vue delete mode 100644 apps/frontend/src/shared/ui/display/InfoRow.vue delete mode 100644 apps/frontend/src/shared/ui/display/InfoRowAction.vue delete mode 100644 apps/frontend/src/shared/ui/feedback/EmptyState.vue delete mode 100644 apps/frontend/src/shared/ui/feedback/InlineNotice.vue delete mode 100644 apps/frontend/src/shared/ui/feedback/LoadingIndicator.vue delete mode 100644 apps/frontend/src/shared/ui/forms/FormField.vue delete mode 100644 apps/frontend/src/shared/ui/forms/TextInput.vue delete mode 100644 apps/frontend/src/shared/ui/forms/TextareaInput.vue delete mode 100644 apps/frontend/src/shared/ui/forms/ToggleSwitch.vue delete mode 100644 apps/frontend/src/shared/ui/forms/WheelPicker.vue delete mode 100644 apps/frontend/src/shared/ui/identity/Avatar.vue delete mode 100644 apps/frontend/src/shared/ui/layout/DesktopPageScaffold.vue delete mode 100644 apps/frontend/src/shared/ui/layout/FooterRevealPageScaffold.vue delete mode 100644 apps/frontend/src/shared/ui/layout/FullScreenPageScaffold.vue delete mode 100644 apps/frontend/src/shared/ui/layout/PageScaffold.vue delete mode 100644 apps/frontend/src/shared/ui/layout/PageScaffoldCentered.vue delete mode 100644 apps/frontend/src/shared/ui/layout/PageScaffoldFlow.vue create mode 100644 tasks/design-web-package-integration/component-migration/00-control-surface.md create mode 100644 tasks/design-web-package-integration/component-migration/10-slice-index.md create mode 100644 tasks/design-web-package-integration/component-migration/90-discussion-log.md create mode 100644 tasks/design-web-package-integration/component-migration/components/00-type-entry.md create mode 100644 tasks/design-web-package-integration/component-migration/components/_template.md create mode 100644 tasks/design-web-package-integration/component-migration/components/action-link.md create mode 100644 tasks/design-web-package-integration/component-migration/components/avatar.md create mode 100644 tasks/design-web-package-integration/component-migration/components/bottom-drawer.md create mode 100644 tasks/design-web-package-integration/component-migration/components/button.md create mode 100644 tasks/design-web-package-integration/component-migration/components/cell.md create mode 100644 tasks/design-web-package-integration/component-migration/components/chip-group.md create mode 100644 tasks/design-web-package-integration/component-migration/components/chip.md create mode 100644 tasks/design-web-package-integration/component-migration/components/choice-card.md create mode 100644 tasks/design-web-package-integration/component-migration/components/confirm-dialog.md create mode 100644 tasks/design-web-package-integration/component-migration/components/empty-state.md create mode 100644 tasks/design-web-package-integration/component-migration/components/error-toast.md create mode 100644 tasks/design-web-package-integration/component-migration/components/feedback-button.md create mode 100644 tasks/design-web-package-integration/component-migration/components/form-field.md create mode 100644 tasks/design-web-package-integration/component-migration/components/form.md create mode 100644 tasks/design-web-package-integration/component-migration/components/img.md create mode 100644 tasks/design-web-package-integration/component-migration/components/info-row.md create mode 100644 tasks/design-web-package-integration/component-migration/components/inline-notice.md create mode 100644 tasks/design-web-package-integration/component-migration/components/loading-indicator.md create mode 100644 tasks/design-web-package-integration/component-migration/components/modal.md create mode 100644 tasks/design-web-package-integration/component-migration/components/page-footer.md create mode 100644 tasks/design-web-package-integration/component-migration/components/page-scaffold.md create mode 100644 tasks/design-web-package-integration/component-migration/components/segmented-control.md create mode 100644 tasks/design-web-package-integration/component-migration/components/tag.md create mode 100644 tasks/design-web-package-integration/component-migration/components/text-input.md create mode 100644 tasks/design-web-package-integration/component-migration/components/textarea-input.md create mode 100644 tasks/design-web-package-integration/component-migration/components/toggle-switch.md create mode 100644 tasks/design-web-package-integration/component-migration/components/wheel-picker.md create mode 100644 tasks/design-web-package-integration/component-migration/evidence/README.md create mode 100644 tasks/design-web-package-integration/component-migration/evidence/home-040-mobile.png create mode 100644 tasks/design-web-package-integration/component-migration/evidence/home-footer-mobile.png create mode 100644 tasks/design-web-package-integration/component-migration/evidence/pr-040-mobile.png create mode 100644 tasks/design-web-package-integration/component-migration/evidence/pr-footer-mobile.png diff --git a/apps/frontend/src/domains/admin-commerce/ui/json-logic/JsonLogicRuleEditor.vue b/apps/frontend/src/domains/admin-commerce/ui/json-logic/JsonLogicRuleEditor.vue index 02f81242f..3aa0643d4 100644 --- a/apps/frontend/src/domains/admin-commerce/ui/json-logic/JsonLogicRuleEditor.vue +++ b/apps/frontend/src/domains/admin-commerce/ui/json-logic/JsonLogicRuleEditor.vue @@ -5,14 +5,26 @@

{{ description }}

- + > + + + +

{{ t("adminCommerceJsonLogic.customPreservedHint") }} @@ -25,7 +37,6 @@ @@ -136,6 +147,11 @@ diff --git a/apps/frontend/src/shared/ui/display/Cell.vue b/apps/frontend/src/shared/ui/display/Cell.vue deleted file mode 100644 index 99564f861..000000000 --- a/apps/frontend/src/shared/ui/display/Cell.vue +++ /dev/null @@ -1,150 +0,0 @@ - - - - - diff --git a/apps/frontend/src/shared/ui/display/Chip.vue b/apps/frontend/src/shared/ui/display/Chip.vue deleted file mode 100644 index 2bc6b3034..000000000 --- a/apps/frontend/src/shared/ui/display/Chip.vue +++ /dev/null @@ -1,96 +0,0 @@ - - - - - diff --git a/apps/frontend/src/shared/ui/display/ChipGroup.vue b/apps/frontend/src/shared/ui/display/ChipGroup.vue deleted file mode 100644 index f816bba63..000000000 --- a/apps/frontend/src/shared/ui/display/ChipGroup.vue +++ /dev/null @@ -1,58 +0,0 @@ - - - - - diff --git a/apps/frontend/src/shared/ui/display/FitChipGroup.vue b/apps/frontend/src/shared/ui/display/FitChipGroup.vue deleted file mode 100644 index 0a6cbbe3f..000000000 --- a/apps/frontend/src/shared/ui/display/FitChipGroup.vue +++ /dev/null @@ -1,226 +0,0 @@ - - - - - diff --git a/apps/frontend/src/shared/ui/display/InfoRow.vue b/apps/frontend/src/shared/ui/display/InfoRow.vue deleted file mode 100644 index 44e5e48c3..000000000 --- a/apps/frontend/src/shared/ui/display/InfoRow.vue +++ /dev/null @@ -1,94 +0,0 @@ - - - - - diff --git a/apps/frontend/src/shared/ui/display/InfoRowAction.vue b/apps/frontend/src/shared/ui/display/InfoRowAction.vue deleted file mode 100644 index eff2d48ef..000000000 --- a/apps/frontend/src/shared/ui/display/InfoRowAction.vue +++ /dev/null @@ -1,128 +0,0 @@ - - - - - diff --git a/apps/frontend/src/shared/ui/feedback/EmptyState.vue b/apps/frontend/src/shared/ui/feedback/EmptyState.vue deleted file mode 100644 index d26a2f882..000000000 --- a/apps/frontend/src/shared/ui/feedback/EmptyState.vue +++ /dev/null @@ -1,56 +0,0 @@ - - - diff --git a/apps/frontend/src/shared/ui/feedback/InlineNotice.vue b/apps/frontend/src/shared/ui/feedback/InlineNotice.vue deleted file mode 100644 index 447493be6..000000000 --- a/apps/frontend/src/shared/ui/feedback/InlineNotice.vue +++ /dev/null @@ -1,45 +0,0 @@ - - - diff --git a/apps/frontend/src/shared/ui/feedback/LoadingIndicator.vue b/apps/frontend/src/shared/ui/feedback/LoadingIndicator.vue deleted file mode 100644 index eee8408a6..000000000 --- a/apps/frontend/src/shared/ui/feedback/LoadingIndicator.vue +++ /dev/null @@ -1,21 +0,0 @@ - - - diff --git a/apps/frontend/src/shared/ui/forms/FormField.vue b/apps/frontend/src/shared/ui/forms/FormField.vue deleted file mode 100644 index 760d4c995..000000000 --- a/apps/frontend/src/shared/ui/forms/FormField.vue +++ /dev/null @@ -1,86 +0,0 @@ - - - - - diff --git a/apps/frontend/src/shared/ui/forms/TextInput.vue b/apps/frontend/src/shared/ui/forms/TextInput.vue deleted file mode 100644 index db07069d5..000000000 --- a/apps/frontend/src/shared/ui/forms/TextInput.vue +++ /dev/null @@ -1,89 +0,0 @@ - - - - - diff --git a/apps/frontend/src/shared/ui/forms/TextareaInput.vue b/apps/frontend/src/shared/ui/forms/TextareaInput.vue deleted file mode 100644 index 952242d96..000000000 --- a/apps/frontend/src/shared/ui/forms/TextareaInput.vue +++ /dev/null @@ -1,111 +0,0 @@ - + + - + > +

+ {{ + t("adminPR.deleteConfirmMessage", { + title: pendingDeletePRLabel, + }) + }} +

+ @@ -422,9 +458,7 @@ import { toIsoDateTime } from "@/domains/admin/use-cases/pr/prMutationInput"; import { useAdminPRFeedbackQuestionnaire } from "@/domains/admin/use-cases/pr/useAdminPRFeedbackQuestionnaire"; import { useSaveAdminPRBasic } from "@/domains/admin/use-cases/pr/useSaveAdminPRBasic"; import { useAdminAccess } from "@/domains/admin/use-cases/useAdminAccess"; -import { - useDeleteAdminPR, -} from "@/domains/admin/queries/useAdminPRManagement"; +import { useDeleteAdminPR } from "@/domains/admin/queries/useAdminPRManagement"; import { validateManualPartnerBounds } from "@/lib/validation"; import { clonePRRoute, @@ -435,13 +469,12 @@ import Button from "@/shared/ui/actions/Button.vue"; import ChoiceCard from "@/shared/ui/containers/ChoiceCard.vue"; import ErrorToast from "@/shared/ui/feedback/ErrorToast.vue"; import TimelinePolicyPicker from "@/shared/ui/forms/TimelinePolicyPicker.vue"; -import ConfirmDialog from "@/shared/ui/overlay/ConfirmDialog.vue"; import PRJoinGateConfigEditor from "@/domains/pr/ui/forms/PRJoinGateConfigEditor.vue"; import PRPlaceModeField, { type PRPlaceModeFieldValue, } from "@/domains/pr/ui/forms/PRPlaceModeField.vue"; import type { PRJoinGateConfig, PRRoute } from "@partner-up-dev/backend"; -import { PuLoadingState } from "@partner-up-dev/design-web"; +import { PuLoadingState, PuDialog } from "@partner-up-dev/design-web"; type PRForm = { title: string; @@ -569,8 +602,7 @@ const feedbackQuestionnaireTemplates = computed( () => workspace.value?.feedbackQuestionnaireTemplates ?? [], ); const pendingDeletePR = computed( - () => - prs.value.find((pr) => pr.prId === pendingDeletePRId.value) ?? null, + () => prs.value.find((pr) => pr.prId === pendingDeletePRId.value) ?? null, ); const pendingDeletePRLabel = computed(() => { const pr = pendingDeletePR.value; @@ -670,8 +702,7 @@ const timeValidationMessage = computed(() => { const prPolicyValue = computed({ get: () => ({ confirmationEnabled: prForm.value.confirmationEnabled, - confirmationStartOffsetMinutes: - prForm.value.confirmationStartOffsetMinutes, + confirmationStartOffsetMinutes: prForm.value.confirmationStartOffsetMinutes, confirmationEndOffsetMinutes: prForm.value.confirmationEndOffsetMinutes, joinLockOffsetMinutes: prForm.value.joinLockOffsetMinutes, }), @@ -748,30 +779,27 @@ watch( { immediate: true }, ); -watch( - [() => prForm.value.type, isCreatingPR], - ([type, creating]) => { - if (!creating) return; - const matched = typeOptions.value.find( - (option) => option.type === type.trim(), - ); - if (!matched || lastAppliedType.value === matched.type) { - return; - } - prForm.value = { - ...prForm.value, - minPartners: matched.defaultMinPartners, - maxPartners: matched.defaultMaxPartners, - confirmationStartOffsetMinutes: - matched.defaultConfirmationStartOffsetMinutes, - confirmationEnabled: matched.defaultConfirmationEnabled, - confirmationEndOffsetMinutes: matched.defaultConfirmationEndOffsetMinutes, - joinLockOffsetMinutes: matched.defaultJoinLockOffsetMinutes, - joinGateConfig: matched.joinGateConfig, - }; - lastAppliedType.value = matched.type; - }, -); +watch([() => prForm.value.type, isCreatingPR], ([type, creating]) => { + if (!creating) return; + const matched = typeOptions.value.find( + (option) => option.type === type.trim(), + ); + if (!matched || lastAppliedType.value === matched.type) { + return; + } + prForm.value = { + ...prForm.value, + minPartners: matched.defaultMinPartners, + maxPartners: matched.defaultMaxPartners, + confirmationStartOffsetMinutes: + matched.defaultConfirmationStartOffsetMinutes, + confirmationEnabled: matched.defaultConfirmationEnabled, + confirmationEndOffsetMinutes: matched.defaultConfirmationEndOffsetMinutes, + joinLockOffsetMinutes: matched.defaultJoinLockOffsetMinutes, + joinGateConfig: matched.joinGateConfig, + }; + lastAppliedType.value = matched.type; +}); const parseNullableId = (event: Event): number | null => { const target = event.target as HTMLSelectElement | null; @@ -851,12 +879,13 @@ const handleMaterializePRFeedbackQuestionnaireInstance = async () => { } try { - const result = - await prFeedbackQuestionnaireUseCase.materializeFromTemplate({ + const result = await prFeedbackQuestionnaireUseCase.materializeFromTemplate( + { prId: selectedPRId.value, feedbackQuestionnaireTemplateId: mountFeedbackQuestionnaireTemplateId.value, - }); + }, + ); if (!result) return; prForm.value = { ...prForm.value, @@ -894,8 +923,8 @@ const handleSavePR = async () => { current: { prId: selectedPRId.value, status: selectedPR.value.status as PRForm["status"], - visibilityStatus: - selectedPR.value.visibilityStatus as PRForm["visibilityStatus"], + visibilityStatus: selectedPR.value + .visibilityStatus as PRForm["visibilityStatus"], }, draft: prForm.value, }); diff --git a/apps/frontend/src/domains/commerce/ui/ordering/OrderingPriceDetailDrawer.vue b/apps/frontend/src/domains/commerce/ui/ordering/OrderingPriceDetailDrawer.vue index 161a2fa44..eaa678812 100644 --- a/apps/frontend/src/domains/commerce/ui/ordering/OrderingPriceDetailDrawer.vue +++ b/apps/frontend/src/domains/commerce/ui/ordering/OrderingPriceDetailDrawer.vue @@ -1,12 +1,15 @@ +} + +.event-pr-search-page__result-list { + display: flex; + flex-direction: column; + gap: var(--sys-spacing-small); +} + +.event-pr-search-page__footer-actions, +.event-pr-search-page__drawer-actions { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: var(--sys-spacing-small); +} + diff --git a/apps/frontend/src/pages/OrderingSupportPage.vue b/apps/frontend/src/pages/OrderingSupportPage.vue index 2d3f6390b..e1ae5399e 100644 --- a/apps/frontend/src/pages/OrderingSupportPage.vue +++ b/apps/frontend/src/pages/OrderingSupportPage.vue @@ -1,8 +1,5 @@ @@ -42,7 +46,10 @@ align="start" /> @@ -16,15 +22,19 @@ {{ t("adminCommercePlacementOffer.emptyOffers") }}
- #{{ offer.id }} · {{ offer.productType }} {{ offer.status }} - +
@@ -42,13 +52,19 @@ /> @@ -42,7 +46,10 @@ align="start" /> @@ -107,8 +126,11 @@ import { useAdminAccess } from "@/domains/admin/use-cases/useAdminAccess"; import { useAdminCommerceOrderBillWorkspace } from "@/domains/admin-commerce/queries/useAdminCommerce"; import { prettyJson } from "@/domains/admin-commerce/editor-json"; import ErrorToast from "@/shared/ui/feedback/ErrorToast.vue"; -import ChoiceCard from "@/shared/ui/containers/ChoiceCard.vue"; -import { PuEmptyState, PuLoadingState } from "@partner-up-dev/design-web"; +import { + PuCard, + PuEmptyState, + PuLoadingState, +} from "@partner-up-dev/design-web"; const { t } = useI18n(); const { isAdmin, logout } = useAdminAccess(); @@ -118,7 +140,9 @@ const selectedOrderIdRaw = ref(""); const orders = computed(() => workspaceQuery.data.value?.orders ?? []); const selectedOrderId = computed(() => selectedOrderIdRaw.value || null); const selectedOrderRecord = computed( - () => orders.value.find((record) => record.order.id === selectedOrderId.value) ?? null, + () => + orders.value.find((record) => record.order.id === selectedOrderId.value) ?? + null, ); const effectiveTotalFen = computed(() => { @@ -131,7 +155,9 @@ const effectiveTotalFen = computed(() => { watch( orders, (nextOrders) => { - if (!nextOrders.some((record) => record.order.id === selectedOrderIdRaw.value)) { + if ( + !nextOrders.some((record) => record.order.id === selectedOrderIdRaw.value) + ) { selectedOrderIdRaw.value = nextOrders[0]?.order.id ?? ""; } }, diff --git a/apps/frontend/src/pages/AdminCommercePlacementPage.vue b/apps/frontend/src/pages/AdminCommercePlacementPage.vue index b97f81b16..2b1ca1f20 100644 --- a/apps/frontend/src/pages/AdminCommercePlacementPage.vue +++ b/apps/frontend/src/pages/AdminCommercePlacementPage.vue @@ -5,7 +5,13 @@ @@ -16,15 +22,21 @@ {{ t("adminCommercePlacementOffer.emptyPlacements") }}
- #{{ placement.id }} · offer #{{ placement.offerId }} {{ placement.status }} · p{{ placement.priority }} - +
@@ -42,13 +54,19 @@ /> @@ -56,7 +63,11 @@
@@ -121,7 +132,9 @@
Instance Key - {{ derivedInstanceKey }} + {{ + derivedInstanceKey + }}
Instance Key
-
{{ selectedProvider?.instanceKey ?? "-" }}
+
+ {{ selectedProvider?.instanceKey ?? "-" }} +
API v3 Key
@@ -223,15 +238,25 @@
Charge Notify URL
-
{{ selectedProvider?.chargeNotifyUrl ?? "-" }}
+
+ {{ selectedProvider?.chargeNotifyUrl ?? "-" }} +
Refund Notify URL
-
{{ selectedProvider?.refundNotifyUrl ?? "-" }}
+
+ {{ selectedProvider?.refundNotifyUrl ?? "-" }} +
Updated At
-
{{ selectedProvider ? formatTimestamp(selectedProvider.updatedAt) : "-" }}
+
+ {{ + selectedProvider + ? formatTimestamp(selectedProvider.updatedAt) + : "-" + }} +
@@ -264,8 +289,7 @@ import { } from "@/domains/admin-payment/queries/useAdminPayment"; import ErrorToast from "@/shared/ui/feedback/ErrorToast.vue"; import Button from "@/shared/ui/actions/Button.vue"; -import ChoiceCard from "@/shared/ui/containers/ChoiceCard.vue"; -import { PuLoadingState } from "@partner-up-dev/design-web"; +import { PuCard, PuLoadingState } from "@partner-up-dev/design-web"; const CREATE_PROVIDER_ID = "__create__"; @@ -312,12 +336,16 @@ const selectedProvider = computed( (record) => record.id === selectedProviderId.value, ) ?? null, ); -const isCreateMode = computed(() => selectedProviderId.value === CREATE_PROVIDER_ID); +const isCreateMode = computed( + () => selectedProviderId.value === CREATE_PROVIDER_ID, +); const isSaving = computed( () => createMutation.isPending.value || updateMutation.isPending.value, ); const formTitle = computed(() => - isCreateMode.value ? "新建 Payment Provider Instance" : "编辑 Payment Provider Instance", + isCreateMode.value + ? "新建 Payment Provider Instance" + : "编辑 Payment Provider Instance", ); const derivedInstanceKey = computed(() => { const mchId = form.value.mchId.trim(); @@ -333,7 +361,9 @@ const optionalSecretPlaceholder = computed(() => ); const apiV3KeyStateLabel = computed(() => { if (isCreateMode.value) return "-"; - return selectedProvider.value?.config.apiV3KeyConfigured ? "已配置" : "未配置"; + return selectedProvider.value?.config.apiV3KeyConfigured + ? "已配置" + : "未配置"; }); const merchantPrivateKeyStateLabel = computed(() => { if (isCreateMode.value) return "-"; @@ -389,8 +419,7 @@ function formFromProvider(provider: ProviderInstance): ProviderForm { chargeMode: provider.config.chargeMode, endpointBaseUrl: provider.config.endpointBaseUrl ?? "", apiV3Key: "", - merchantCertificateSerialNo: - provider.config.merchantCertificate.serialNo, + merchantCertificateSerialNo: provider.config.merchantCertificate.serialNo, merchantPrivateKeyPem: "", merchantCertificatePem: "", }; @@ -412,7 +441,10 @@ const requireCreateSecret = (value: string, label: string): void => { const buildInput = (): AdminPaymentProviderInstanceInput => { requireCreateSecret(form.value.apiV3Key, "API v3 Key"); - requireCreateSecret(form.value.merchantPrivateKeyPem, "Merchant Private Key PEM"); + requireCreateSecret( + form.value.merchantPrivateKeyPem, + "Merchant Private Key PEM", + ); return { providerType: form.value.providerType, diff --git a/apps/frontend/src/pages/AdminRideHailingPage.vue b/apps/frontend/src/pages/AdminRideHailingPage.vue index 17783b8c8..3c3ec2759 100644 --- a/apps/frontend/src/pages/AdminRideHailingPage.vue +++ b/apps/frontend/src/pages/AdminRideHailingPage.vue @@ -22,19 +22,26 @@ 暂无 Provider Instance
- {{ record.displayName }} {{ record.providerType }} / {{ record.instanceKey }} - + {{ providerStatusLabel(record.status) }} - +
@@ -56,7 +63,11 @@
@@ -168,11 +179,19 @@
Callback URL
-
{{ selectedProvider?.callbackUrl ?? "-" }}
+
+ {{ selectedProvider?.callbackUrl ?? "-" }} +
Updated At
-
{{ selectedProvider ? formatTimestamp(selectedProvider.updatedAt) : "-" }}
+
+ {{ + selectedProvider + ? formatTimestamp(selectedProvider.updatedAt) + : "-" + }} +
@@ -205,8 +224,7 @@ import { } from "@/domains/admin-ride-hailing/queries/useAdminRideHailing"; import ErrorToast from "@/shared/ui/feedback/ErrorToast.vue"; import Button from "@/shared/ui/actions/Button.vue"; -import ChoiceCard from "@/shared/ui/containers/ChoiceCard.vue"; -import { PuLoadingState } from "@partner-up-dev/design-web"; +import { PuCard, PuLoadingState } from "@partner-up-dev/design-web"; const CREATE_PROVIDER_ID = "__create__"; @@ -250,7 +268,9 @@ const selectedProvider = computed( (record) => record.id === selectedProviderId.value, ) ?? null, ); -const isCreateMode = computed(() => selectedProviderId.value === CREATE_PROVIDER_ID); +const isCreateMode = computed( + () => selectedProviderId.value === CREATE_PROVIDER_ID, +); const isSaving = computed( () => createMutation.isPending.value || updateMutation.isPending.value, ); diff --git a/apps/frontend/src/pages/CommerceBillDetailPage.vue b/apps/frontend/src/pages/CommerceBillDetailPage.vue index f1357ac7f..2ba440ede 100644 --- a/apps/frontend/src/pages/CommerceBillDetailPage.vue +++ b/apps/frontend/src/pages/CommerceBillDetailPage.vue @@ -1,5 +1,9 @@