Conversation
- 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
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
This was referenced Jun 17, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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 重點)
fix(circle-sunset)重新關閉個人頁 / 側欄圍爐入口(fix(circle-sunset): re-hide circle entry reopened by carbon-badge commit #5972)🔥feat/campaign-discussion活動討論板(含 CommentType 拓寬處理)feat/quote-image-generator、feat/quote-wallfix/moments等6.11.1,依慣例需chore(bump)到6.11.2後再 merge(避免 Create Release 重複 v6.11.1)。buildcheck 須綠(develop 本身 build 已綠,預期通過)。🤖 Generated with Claude Code