# 藏品详情页下拉放大卡片设计 > ★ **MVP 优先**:本次只引入一个独立放大组件承载下拉手势与放大态,不修改 `LenticularCard` / `ShareReportButtons` 等已有组件,不引入状态管理库。 ## 方案概述(必读) ### 要解决的问题 **业务问题** - 用户在藏品详情页希望“快速预览大图”,但不希望跳转到独立大图页后丢失返回上下文。 - 现有 `asset-detail.vue` 卡片是固定尺寸 352×552rpx,无法满足“看清细节”的诉求。 **技术问题** - `asset-detail.vue` 已承担卡片、光栅、贴纸、点赞、链上数据、举报/分享弹窗等职责,行数接近 1700。 - 直接在同一文件内继续堆触摸手势、放大态、CSS 状态类会让单文件接近 2000 行。 - App 端 `scroll-view` 顶部回弹事件不稳定,负 `scrollTop` 不可靠,无法仅凭 `scrollTop` 识别下拉意图。 - 现有 `LenticularCard` 通过陀螺仪/模拟输入控制光栅切换,不希望被外层 transform 重新渲染打乱。 ### 整体实现路径 1. 新建独立组件 `frontend/components/AssetCardPullExpand/AssetCardPullExpand.vue`,承担: - 触摸手势(`touchstart` / `touchmove` / `touchend` / `touchcancel`)。 - 放大态状态机(`isPullActive` / `isExpanded`)。 - 提示文案与点击背景收起。 2. 在 `asset-detail.vue` 中: - 沿用顶层 `v-if / v-else-if / scroll-view v-else` 链路,新增 `v-else-if="viewMode === 'expanded'"` 分支挂 ``。 - 正常态分支里的 `` 一字不改,性能与手感零回归。 - 引入 `viewMode: ref('normal' | 'expanded')`,由 `AssetCardPullExpand` 发出 `pull-expand-change` 事件后切换。 - 顶部 Header(返回键、`ShareReportButtons`)始终保留,不受 `viewMode` 影响。 3. H5 端降级:组件检测非 `APP-PLUS` 时整体不进入下拉态,仅做静态卡片展示。 预计工作量:1~1.5 小时(新建组件 + asset-detail 集成 + 手工联调)。 ### 关键决策 - **抽出独立组件**:避免 `asset-detail.vue` 进一步膨胀;同时让组件可复用(在星册页、铸造预览页等场景后续可直接挂上)。 - **数据全部由父级以 props 传入**:组件内部不调用任何 `utils/api.js` / `utils/task-api.js` / `utils/assetImageHelper.js`,不读 `uni.getStorageSync` / `getStoredUser()`,不直连 Vuex;不持有“自己的”藏品数据/光栅贴纸配置。卡片内容、角标、贴纸、`LenticularCard` 所需的 `lenticularLayers` / `layerTransforms` / `simulate` / `tiltHintText` / `shimmerMidOpacity` / `coverUrl` / `gradeBadgeUrl` 等全部从 `asset-detail.vue`(以及后续复用方)以 props 注入。这样保证 `AssetCardPullExpand` 是纯展示 + 手势容器,可在任何页面复用。 - **组件 DOM 与 class 必须与现有 `.card-wrapper` 区块一摸一样**:模板中原 `card-wrapper` 区域的 class 名(`card-wrapper` / `card-wrapper--lenticular` / `card-frame` / `card-image` / `card-badge` / `card-sticker` / `detail-lenticular-slot` / `detail-lenticular-card`)、DOM 嵌套顺序、属性名(`:src` / `:layers` / `:transforms` / `gyro-source` / `tilt-hint-text` / `:shimmer-mid-opacity` / `:simulate-tilt-from-normalized` / `@mode-change`)都**保持原样不动**;`AssetCardPullExpand.vue` 只是在这个原结构**外面**再包一层“手势容器 + 放大态容器”,内层卡片原封不动。禁止改 class 名前缀(如把 `card-` 改成 `pull-`),禁止删/调 DOM 顺序,禁止重命名 props。这样 `asset-detail.vue` 现有的 `.card-wrapper` / `.card-frame` 等样式无需修改即可继续生效。 - **`.card-wrapper` 的尺寸由组件本地显式声明**:虽然视觉样式不重写,但 `.card-wrapper` 的 `width: 352rpx; height: 552rpx; transform-origin: center center;` 这三条尺寸/变换相关属性**必须**出现在 `AssetCardPullExpand.vue` 的 `