Skip to content

Release v6.11.2#5974

Merged
mashbean merged 17 commits into
masterfrom
develop
Jun 17, 2026
Merged

Release v6.11.2#5974
mashbean merged 17 commits into
masterfrom
develop

Conversation

@mashbean

Copy link
Copy Markdown
Contributor

Release develop → master

觸發原因(緊急)

線上圍爐(圍爐 / Circle)入口被意外重新打開(CTO 回報)。圍爐修復 #5972 已併入 develop,需透過正式 release 上 production。

為何走正式 release 而非單獨 master hotfix

master 的 build 目前已被 schema drift 弄壞(與圍爐無關):graphql.ts 不進 git、CI 對線上 schema 做 codegen,6/5 後線上 schema 長出 campaignDiscussion 等新 CommentType,master 缺 develop 上對應處理碼(59e1102f8 / c77e47c0b / e9c7745d8),導致任何針對 master 的 PR 都會 build 失敗(見已關閉的 #5973)。本 release 一併帶上這些修復,同時修好 master build

內容(develop 領先 master 17 commits 重點)

⚠️ Merge 前

  • 版號 bump:master / develop 皆為 6.11.1,依慣例需 chore(bump)6.11.2 後再 merge(避免 Create Release 重複 v6.11.1)。
  • Required build check 須綠(develop 本身 build 已綠,預期通過)。
  • 1 個 review approval。

🤖 Generated with Claude Code

yingshinlee and others added 17 commits June 11, 2026 22:14
- CampaignDetail/Discussion: compact module (desktop right aside) with input
  box + latest 3 comments + view-all dialog; mobile renders a one-line chip
  entry that opens the dialog
- reuse CircleComment family: CircleCommentForm/Dialog accept campaignId and
  type campaignDiscussion; ReplyButton/DropdownActions resolve campaign node
- 240-char cap with counter on campaign comments (matches moments)
- layout: cover height halved (23.26% -> 12%), side participants avatars
  trimmed 60 -> 12 to make room for the discussion module

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…mponents

Backend added `campaignDiscussion` to the GraphQL `CommentType` enum, widening
the codegen type. Propagate the new type through the hand-written comment
routing/UI so type-checking and build pass:

- route.ts: add `campaignDiscussion` to `CommentArgs.type` and resolve the
  comment link to the campaign detail page via the existing campaignDetail route
- CircleComment/CreatedAt: link campaign discussion comments to their campaign
- CampaignDetail/Discussion: fix discussion connection type (campaign field is
  no longer a union, so drop the never-yielding Extract)
- correct formatjs message ids and extract new i18n strings
- fix stylelint ordering/comment-spacing in new campaign styles

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The popover was gated on contentContainer.current in render; assigning a
ref does not trigger a re-render, so it only appeared after an unrelated
re-render (e.g. scroll). Gate on a mounted flag set in an effect instead.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
feat(campaign): discussion board on campaign detail page
Let readers select text in an article and generate a shareable quote
image (download as JPG / Web Share). Extends the existing
TextSelectionPopover with a second button next to "quote to comment".

- New component: src/components/QuoteImageDialog (Card / Content / presets / gql)
  - 6 neutral color presets + 3 sizes (1:1, 4:5, 9:16) with platform hints
  - auto font-scaling + 80-char cap so long selections never overflow
  - QR code (qrcode) links back to the article; rendered via html-to-image
  - 七日書 (WritingChallenge) articles automatically swap the Matters
    wordmark for the seven-day-book logo (silent detection via campaigns)
- TextSelectionPopover: add icon-only "金句圖" button, thread article in
- ArticleDetail/Content + gql: pass article + spread QuoteImageArticle fragment
- analytics: register quote_image_* click events
- deps: html-to-image, qrcode (+ @types/qrcode)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- TextSelectionPopover: new variant='bottomBar' for mobile — fixed bottom
  action bar (Quote / Quote card) so it never fights with the iOS/Android
  native selection menu; selection detected via debounced selectionchange
- mount bottomBar on ArticleDetail/Content under Media lessThan md
  (previously the feature was desktop-only)
- license gate: hide quote-card button when article license is ARR
  (all rights reserved) unless the viewer is the author; CC licenses pass
  (card already quotes faithfully with author + link attribution)
- add license to QuoteImageArticle fragment

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…Discussion

- route.ts: widen CommentArgs.type union and ToPathArgs.commentDetail with
  campaignDiscussion / campaign, and handle it in toPath, matching the
  generated CommentType enum (backend added campaignDiscussion)
- sync package-lock.json with html-to-image / qrcode / @types/qrcode deps
  introduced by this branch
- QuoteImageDialog: fix formatjs enforce-id hashes, stylelint property
  ordering / modern color notation, and use the wired closeDialog prop
- TextSelectionPopover: refresh formatjs enforce-id hashes
- regenerate extracted lang/*.json messages

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The popover was gated on contentContainer.current in render; assigning a
ref does not trigger a re-render, so it only appeared after an unrelated
re-render (e.g. scroll). Gate on a mounted flag set in an effect instead.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
feat(article): quote image generator with mobile bottom bar and license gate
- QuoteImageDialog: 'Post to wall' button (campaign articles only) via
  putQuote; gentle quota-reached toast on ACTION_LIMIT_EXCEEDED
- CampaignDetail/QuoteWall: compact module (desktop right aside) + chip
  entry (mobile) + full-wall dialog with shuffle (random refetch)
- QuoteCard: sticky-note card linking back to the source article; retract
  action for the poster or the source article's author (soft delete)
- museum link (freewriting.matters.town/memo-wall) in EXTERNAL_LINKS
- mount quote wall above discussion in the campaign aside / mobile chips

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- route.ts: support campaignDiscussion comment type (widened
  CommentType enum from backend) — add to CommentArgs union,
  add campaign field to commentDetail args, and resolve its href
- QuoteWall gql: type $first as first_Int_min_0_max_50 to match
  the schema's constrained scalar (codegen validation)
- QuoteWall/Discussion: drop Extract<..., WritingChallenge> wrapper
  that resolved to never (campaign is already the single fragment
  shape in generated types)
- analytics: add quote_post_to_wall click_button type
- ArticleDetail/gql: import QuoteImageDialog fragments from the leaf
  gql module instead of the React index, breaking a circular import
  that left UserDigest undefined and failed the unit test
- QuoteImageDialog: drop unused closeDialog prop destructuring
- regenerate i18n message ids (enforce-id) and apply lint/format

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
feat(quote-wall): post-to-wall + campaign quote wall
The circle widget entry on both the user profile and aside user profile
was accidentally re-enabled by 4acdd20 ("Display carbon based badge").
That Codex-generated commit rewrote these two files from a pre-sunset
view and un-commented the CircleWidget import / circles var / render,
reopening the circle (圍爐) entrance that the sunset series (ed1108c /
814c776) had intentionally hidden.

Re-apply the sunset comments to all three spots in both files while
keeping the CarbonBasedBadge additions intact. Present on both develop
and master, so this also needs to reach master.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
fix(circle-sunset): re-hide circle entry reopened by carbon-badge commit
@mashbean mashbean requested a review from a team as a code owner June 17, 2026 04:47
@vercel

vercel Bot commented Jun 17, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
matters-web Ready Ready Preview Jun 17, 2026 4:47am

Request Review

@mashbean mashbean merged commit d823aed into master Jun 17, 2026
4 checks passed
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.

2 participants