Skip to content

feat(design): Preview 长字段扩样 + 微动画 polish(§11.1 中优先级两项) - #93

Merged
sweetcornna merged 1 commit into
mainfrom
polish/preview-motion
Jul 26, 2026
Merged

feat(design): Preview 长字段扩样 + 微动画 polish(§11.1 中优先级两项)#93
sweetcornna merged 1 commit into
mainfrom
polish/preview-motion

Conversation

@sweetcornna

Copy link
Copy Markdown
Owner

概要

路线图 §11.1 中优先级两项一次落地。

Preview 扩样

PhotoCard / NegativeCard / CapsuleRow 各补「长题 + 长地名」变体(全宽与 contact-sheet 半宽两列)——lineLimit(2) 的换行数学以后改片基排版时在 Preview 里直接可见,不用等真机。

微动画

  • 设计系统新增 PressableCardStyle.buttonStyle(.pressableCard)):按下轻沉 + 松手回弹;样片墙两形态与圈列表行统一换装,替换零反馈的 .plain
  • contact-sheet:搜索收敛时 bucket 段落淡入 + 自顶轻移;滚动进出视口轻降透明/缩放(.scrollTransition
  • bucket 段落抽成 bucketSection(),contactSheetGrid 结构更平

契约确认

  • XCUI cells.count 契约不动:List 行仍是 NavigationLink cell,仅按钮样式变化;结构性改动都在 contactSheet 路径
  • .pressableCard.plain 一样移除系统默认高亮,chevron 行为不变

回归

  • swift test 141 通过;run-sim.sh --build-only SUCCEEDED
  • shelf / shelf-grid / circles 三屏 dark 截图复核,静态布局无回归

Preview 扩样(lineLimit(2) 数学回归靠 Preview 抓):
- PhotoCard / NegativeCard:新增「长题长 meta · 全宽 / 半宽两列」变体,
  占位声纹抽 previewWaveform 复用
- CapsuleRow:补全 Preview —— 真实数据路径(metaLine 拼接整串)的
  列表全宽 + contact-sheet 半宽长字段变体

微动画(暗房手感语言:轻、短、物质性):
- 新增 PressableCardStyle(.pressableCard):按下 0.98 缩放 + 0.96 透明度,
  spring(0.28/0.8) 快起快落 —— 相纸被指尖按住的实感
- 样片墙 List 行 / contact-sheet 格 / 圈列表行统一换装(原裸 .plain 零反馈)
- contact-sheet:bucket 段落抽 bucketSection();搜索收敛时段落
  淡入+自顶轻移(.animation value: query),滚动进出视口轻降透明/缩放
  (.scrollTransition)

回归:swift test 141 通过、run-sim.sh --build-only SUCCEEDED、
shelf/shelf-grid/circles 三屏 dark 截图复核无布局回归。
@sweetcornna
sweetcornna merged commit ff8fcb6 into main Jul 26, 2026
1 check failed
@sweetcornna
sweetcornna deleted the polish/preview-motion branch July 26, 2026 15:22

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

https://github.com/sweetcornna/voxule/blob/fddbd2779c4d580b3df41ef664a399e3e5d85b3c/voxule/CapsuleRow.swift#L97-L98
P2 Badge Populate the field that CapsuleRow actually displays

These place-lock samples put the long name only inside capsule.lock, but CapsuleRow.metaLine reads capsule.placeName, a separate property that the Capsule initializer leaves nil. Consequently all three new CapsuleRow previews render only the lock label and duration, so they never exercise the long-location wrapping regression they claim to cover; construct the sample and set its placeName before passing it to the row.

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +372 to +375
.scrollTransition(axis: .vertical) { content, phase in
content
.opacity(phase.isIdentity ? 1 : 0.75)
.scaleEffect(phase.isIdentity ? 1 : 0.98)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Honor Reduce Motion for scrolling effects

When a user enables Reduce Motion, this transition still continuously scales each bucket as it crosses the viewport, and the query-driven .move(edge: .top) transition remains animated as well. This bypasses the accessibility behavior already used by SealStamp; read accessibilityReduceMotion here and disable the scaling/movement (or use an identity/opacity-only effect) for that setting.

Useful? React with 👍 / 👎.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant