Skip to content

feat(reveals): Redesign /reveals as an immersive six-ink set tracker + Set 13 data (#390)#392

Merged
Doberjohn merged 5 commits into
masterfrom
feature/390-reveals-redesign
Jun 27, 2026
Merged

feat(reveals): Redesign /reveals as an immersive six-ink set tracker + Set 13 data (#390)#392
Doberjohn merged 5 commits into
masterfrom
feature/390-reveals-redesign

Conversation

@Doberjohn

Copy link
Copy Markdown
Owner

Summary

Redesigns /reveals into an immersive six-ink set tracker for Set 13 (Attack of the Vine!), replacing the old franchise-grid view, and populates the set with 105 revealed cards and full art.

What changed

Tracker view (new default)

  • RevealHero: set logo over a countdown panel (days to pre-release, release date) and a revealed/total + new-franchises panel.
  • Six per-ink tracker tiles with conic progress rings; selecting one features that ink's board.
  • Featured ink board: a 38-slot diamond mosaic where each revealed card sits at its true collector-number slot (slot = number - ink base), leaving fallback glyphs for unrevealed numbers, with a "COLOR COMPLETE" ribbon at 34.
  • Live per-rarity breakdown (actual revealed counts, no hardcoded totals) and a "new franchises" section.

Franchise cards modal

  • Replaces the Tracker/Franchises toggle: clicking a franchise card opens a focused modal of that franchise's cards. Clicking a card opens the shared card-overview modal on top (layered one z-index below it).

Card-art pipeline

  • convert-preview-images auto-rotates landscape location scans 270deg before the portrait resize; the prod build's copyPreviewAvifs copies the AVIFs byte-for-byte, so the baked rotation carries to production.

Set 13 data

  • 105 preview cards with 100% art coverage, each placed at its real slot.
  • Promo cards remapped to main-set ids/numbers; data fixes (Gaston to Ruby, Pocahontas removed).

Cleanup

  • Removed dead Hero, FranchiseTier, ViewToggle, and scatter.

Testing

  • 278 engine + 642 web unit tests pass; typecheck clean.
  • reveals-page.spec.ts rewritten for the tracker + modal (5 desktop pass, 1 mobile runs on the mobile projects); E2E_TESTS.md updated.

Phases

Phase 0 (data layer) -> Phase 1 (visual primitives) -> Phase 2 (tracker view) -> Phase 3 (new-franchises) -> Phase 4 (this): wiring + Set 13 data.

Out of scope / follow-ups

  • "New this set" mechanics & tribes band (deferred, separate issue).
  • Floodborn-matters / Red Panda / Hunny synergy rules.

Closes #390.

Engine: add rarity to LorcanaCard + carry it through transformCard (web loader inherits it).

Reveals data: setComposition (204/34) + rarity config (real 12/9/8/3/2 split, 5 in-app rarities); useRevealProgress hook for real per-ink counts, rarity tallies and totals (dual-ink cards bucket to primary ink so the six 34-boards sum to 204); curated franchise->ink tint.

Data fix: set rarity on 7 late-revealed Set 13 cards, remove 3 promos (Buzz Lightyear, Vixey, Merlin) + their orphaned preview AVIFs.
inkTint helper (rgba/rgb ink tints derived from theme INK_COLORS). ProgressRing: conic sweep masked to a thin ring, ink symbol + count, size-driven desktop/mobile. RaritySymbol: real Lorcana rarity glyphs from vendored SVGs (common/uncommon vector, rare/super-rare/legendary detailed).

CardSlot: ink-art tile — bright + glowing with the real card image when revealed (opens the card modal on click), dimmer ink-symbol placeholder when not; no cost or rarity pips. Retired the geometric RarityGem; rarity config trimmed to {key,name,total}.

Add 5 rarity symbol assets; wire Storybook into .claude/launch.json for previews.
CardMosaic: diamond [4,6,7,7,6,4] of CardSlots with a deterministic per-ink scatter (scatter.ts). InkBoard: header (ink badge + name + fill-scaled glow + COLOR COMPLETE ribbon) wrapping the mosaic + rarity breakdown; reveals.css holds the float/shimmer keyframes (reduced-motion aware).

RarityBreakdown: the 5 real rarity symbols with capped revealed/total in a centered band (full-width divider). InkTrackerTile/Strip: six selectable progress-ring tiles with a buttery alpha-fade selection glow (symmetric shadow + constant border). RevealHero: set logo + countdown/stats panels, no intro or progress bar.
)

NewFranchises: three debut-franchise cards (real key art contained, not cropped) with ink-tinted bloom, NEW THIS SET pill, name and blurb; franchise.ts gains a blurb per franchise.

The 'new this set' mechanics/tribes band was cut from scope (rejected v1) and tracked separately in #391.
Wire RevealHero, InkTrackerStrip, InkBoard, and NewFranchises into RevealsPage; replace the Tracker/Franchises toggle with a per-franchise cards modal. Remove dead Hero, FranchiseTier, ViewToggle, and scatter.

Place each card at its true collector-number slot on a 38-slot diamond; rarity breakdown shows live per-rarity counts; auto-rotate landscape location scans 270deg in convert-preview-images (preserved into prod by copyPreviewAvifs).

Populate Set 13: 105 preview cards plus art; remap promo cards to main-set ids and numbers; remove Pocahontas. Rewrite reveals-page.spec.ts for the new tracker and franchise modal.
@vercel

vercel Bot commented Jun 27, 2026

Copy link
Copy Markdown

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

Project Deployment Actions Updated (UTC)
inkweave Ready Ready Preview, Comment Jun 27, 2026 6:52am

@github-actions

Copy link
Copy Markdown

🎨 Design-surface change detected

This PR touches files mirrored by the Inkweave design system project.
After merge, refresh the mirror so it doesn't drift out of sync.

What changed:

  • 🔷 Icons — ink / inkable SVGs

To refresh: open the design system Claude project and prompt:

Refresh against the latest of Doberjohn/inkweave@master. Focus on the files this PR touched: apps/web/src/assets/common.svg, apps/web/src/assets/legendary.svg, apps/web/src/assets/rare.svg, apps/web/src/assets/super_rare.svg, apps/web/src/assets/uncommon.svg

This is a reminder, not a blocker. Configured in .github/workflows/design-system-drift.yml.

@coderabbitai

coderabbitai Bot commented Jun 27, 2026

Copy link
Copy Markdown

Important

Review skipped

Too many files!

This PR contains 155 files, which is 5 over the limit of 150.

To get a review, narrow the scope:
• coderabbit review --type committed # exclude uncommitted changes
• coderabbit review --dir # limit to a subdirectory
• coderabbit review --base # compare against a closer base

Upgrade to a paid plan to raise the limit.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 84a0e022-21af-421f-8a5b-69793ca3cfe8

📥 Commits

Reviewing files that changed from the base of the PR and between dc787cf and c18d065.

⛔ Files ignored due to path filters (5)
  • apps/web/src/assets/common.svg is excluded by !**/*.svg
  • apps/web/src/assets/legendary.svg is excluded by !**/*.svg
  • apps/web/src/assets/rare.svg is excluded by !**/*.svg
  • apps/web/src/assets/super_rare.svg is excluded by !**/*.svg
  • apps/web/src/assets/uncommon.svg is excluded by !**/*.svg
📒 Files selected for processing (155)
  • .claude/launch.json
  • .gitignore
  • apps/web/e2e/E2E_TESTS.md
  • apps/web/e2e/tests/reveals-page.spec.ts
  • apps/web/public/card-images-preview/13001-sm.avif
  • apps/web/public/card-images-preview/13001.avif
  • apps/web/public/card-images-preview/13003-sm.avif
  • apps/web/public/card-images-preview/13003.avif
  • apps/web/public/card-images-preview/13032-sm.avif
  • apps/web/public/card-images-preview/13032.avif
  • apps/web/public/card-images-preview/13033-sm.avif
  • apps/web/public/card-images-preview/13033.avif
  • apps/web/public/card-images-preview/13035-sm.avif
  • apps/web/public/card-images-preview/13035.avif
  • apps/web/public/card-images-preview/13036-sm.avif
  • apps/web/public/card-images-preview/13036.avif
  • apps/web/public/card-images-preview/13037-sm.avif
  • apps/web/public/card-images-preview/13037.avif
  • apps/web/public/card-images-preview/13039-sm.avif
  • apps/web/public/card-images-preview/13039.avif
  • apps/web/public/card-images-preview/13041-sm.avif
  • apps/web/public/card-images-preview/13041.avif
  • apps/web/public/card-images-preview/13043-sm.avif
  • apps/web/public/card-images-preview/13043.avif
  • apps/web/public/card-images-preview/13048-sm.avif
  • apps/web/public/card-images-preview/13048.avif
  • apps/web/public/card-images-preview/13050-sm.avif
  • apps/web/public/card-images-preview/13050.avif
  • apps/web/public/card-images-preview/13057-sm.avif
  • apps/web/public/card-images-preview/13057.avif
  • apps/web/public/card-images-preview/13058-sm.avif
  • apps/web/public/card-images-preview/13058.avif
  • apps/web/public/card-images-preview/13064-sm.avif
  • apps/web/public/card-images-preview/13064.avif
  • apps/web/public/card-images-preview/13065-sm.avif
  • apps/web/public/card-images-preview/13065.avif
  • apps/web/public/card-images-preview/13066-sm.avif
  • apps/web/public/card-images-preview/13066.avif
  • apps/web/public/card-images-preview/13071-sm.avif
  • apps/web/public/card-images-preview/13071.avif
  • apps/web/public/card-images-preview/13084-sm.avif
  • apps/web/public/card-images-preview/13084.avif
  • apps/web/public/card-images-preview/13088-sm.avif
  • apps/web/public/card-images-preview/13088.avif
  • apps/web/public/card-images-preview/13092-sm.avif
  • apps/web/public/card-images-preview/13092.avif
  • apps/web/public/card-images-preview/13103-sm.avif
  • apps/web/public/card-images-preview/13103.avif
  • apps/web/public/card-images-preview/13106-sm.avif
  • apps/web/public/card-images-preview/13106.avif
  • apps/web/public/card-images-preview/13108-sm.avif
  • apps/web/public/card-images-preview/13108.avif
  • apps/web/public/card-images-preview/13119-sm.avif
  • apps/web/public/card-images-preview/13119.avif
  • apps/web/public/card-images-preview/13122-sm.avif
  • apps/web/public/card-images-preview/13122.avif
  • apps/web/public/card-images-preview/13128-sm.avif
  • apps/web/public/card-images-preview/13128.avif
  • apps/web/public/card-images-preview/13129-sm.avif
  • apps/web/public/card-images-preview/13129.avif
  • apps/web/public/card-images-preview/13130-sm.avif
  • apps/web/public/card-images-preview/13130.avif
  • apps/web/public/card-images-preview/13134-sm.avif
  • apps/web/public/card-images-preview/13134.avif
  • apps/web/public/card-images-preview/13142-sm.avif
  • apps/web/public/card-images-preview/13142.avif
  • apps/web/public/card-images-preview/13148-sm.avif
  • apps/web/public/card-images-preview/13148.avif
  • apps/web/public/card-images-preview/13151-sm.avif
  • apps/web/public/card-images-preview/13151.avif
  • apps/web/public/card-images-preview/13158-sm.avif
  • apps/web/public/card-images-preview/13158.avif
  • apps/web/public/card-images-preview/13161-sm.avif
  • apps/web/public/card-images-preview/13161.avif
  • apps/web/public/card-images-preview/13162-sm.avif
  • apps/web/public/card-images-preview/13162.avif
  • apps/web/public/card-images-preview/13169-sm.avif
  • apps/web/public/card-images-preview/13169.avif
  • apps/web/public/card-images-preview/13173-sm.avif
  • apps/web/public/card-images-preview/13173.avif
  • apps/web/public/card-images-preview/13174-sm.avif
  • apps/web/public/card-images-preview/13174.avif
  • apps/web/public/card-images-preview/13180-sm.avif
  • apps/web/public/card-images-preview/13180.avif
  • apps/web/public/card-images-preview/13186-sm.avif
  • apps/web/public/card-images-preview/13186.avif
  • apps/web/public/card-images-preview/13187-sm.avif
  • apps/web/public/card-images-preview/13187.avif
  • apps/web/public/card-images-preview/13195-sm.avif
  • apps/web/public/card-images-preview/13195.avif
  • apps/web/public/card-images-preview/13196-sm.avif
  • apps/web/public/card-images-preview/13196.avif
  • apps/web/public/card-images-preview/13203-sm.avif
  • apps/web/public/card-images-preview/13203.avif
  • apps/web/public/card-images-preview/13204-sm.avif
  • apps/web/public/card-images-preview/13204.avif
  • apps/web/public/card-images-preview/13900-sm.avif
  • apps/web/public/card-images-preview/13900.avif
  • apps/web/public/card-images-preview/13912-sm.avif
  • apps/web/public/card-images-preview/13912.avif
  • apps/web/public/card-images-preview/13914-sm.avif
  • apps/web/public/card-images-preview/13914.avif
  • apps/web/public/card-images-preview/13920-sm.avif
  • apps/web/public/card-images-preview/13920.avif
  • apps/web/public/card-images-preview/13926-sm.avif
  • apps/web/public/card-images-preview/13926.avif
  • apps/web/public/card-images-preview/13933-sm.avif
  • apps/web/public/card-images-preview/13933.avif
  • apps/web/public/card-images-preview/13948-sm.avif
  • apps/web/public/card-images-preview/13948.avif
  • apps/web/public/card-images-preview/13952-sm.avif
  • apps/web/public/card-images-preview/13952.avif
  • apps/web/public/card-images-preview/13975-sm.avif
  • apps/web/public/card-images-preview/13975.avif
  • apps/web/public/card-images-preview/13977-sm.avif
  • apps/web/public/card-images-preview/13977.avif
  • apps/web/public/data/previewCards.json
  • apps/web/src/features/reveals/CardMosaic.stories.tsx
  • apps/web/src/features/reveals/CardMosaic.tsx
  • apps/web/src/features/reveals/CardSlot.stories.tsx
  • apps/web/src/features/reveals/CardSlot.tsx
  • apps/web/src/features/reveals/FranchiseCardsModal.stories.tsx
  • apps/web/src/features/reveals/FranchiseCardsModal.tsx
  • apps/web/src/features/reveals/FranchiseTier.stories.tsx
  • apps/web/src/features/reveals/FranchiseTier.tsx
  • apps/web/src/features/reveals/Hero.stories.tsx
  • apps/web/src/features/reveals/Hero.tsx
  • apps/web/src/features/reveals/InkBoard.stories.tsx
  • apps/web/src/features/reveals/InkBoard.tsx
  • apps/web/src/features/reveals/InkTrackerStrip.stories.tsx
  • apps/web/src/features/reveals/InkTrackerStrip.tsx
  • apps/web/src/features/reveals/InkTrackerTile.stories.tsx
  • apps/web/src/features/reveals/InkTrackerTile.tsx
  • apps/web/src/features/reveals/NewFranchises.stories.tsx
  • apps/web/src/features/reveals/NewFranchises.tsx
  • apps/web/src/features/reveals/ProgressRing.stories.tsx
  • apps/web/src/features/reveals/ProgressRing.tsx
  • apps/web/src/features/reveals/RarityBreakdown.stories.tsx
  • apps/web/src/features/reveals/RarityBreakdown.tsx
  • apps/web/src/features/reveals/RaritySymbol.stories.tsx
  • apps/web/src/features/reveals/RaritySymbol.tsx
  • apps/web/src/features/reveals/RevealHero.stories.tsx
  • apps/web/src/features/reveals/RevealHero.tsx
  • apps/web/src/features/reveals/__tests__/useRevealProgress.test.ts
  • apps/web/src/features/reveals/franchise.ts
  • apps/web/src/features/reveals/index.ts
  • apps/web/src/features/reveals/inkTint.ts
  • apps/web/src/features/reveals/rarity.ts
  • apps/web/src/features/reveals/reveals.css
  • apps/web/src/features/reveals/setComposition.ts
  • apps/web/src/features/reveals/useRevealProgress.ts
  • apps/web/src/pages/RevealsPage.tsx
  • packages/synergy-engine/src/types/card.ts
  • packages/synergy-engine/src/utils/cardTransformer.ts
  • scripts/convert-preview-images.mjs

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feature/390-reveals-redesign

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@codescene-delta-analysis codescene-delta-analysis 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.

Code Health Improved (1 files improve in Code Health)

Our agent can fix these. Install it.

Gates Passed
6 Quality Gates Passed

View Improvements
File Code Health Impact Categories Improved
RevealsPage.tsx 9.69 → 10.00 Complex Method

Quality Gate Profile: Pay Down Tech Debt
Install CodeScene MCP: safeguard and uplift AI-generated code. Catch issues early with our IDE extension and CLI tool.

@github-actions

Copy link
Copy Markdown

⚡ Engine Benchmark Results

Benchmark Throughput Mean Margin vs. Base
SynergyEngine.findSynergies > 500 cards 5,868 ops/s 0.1704 ms ±0.79% ⚪ -1.6%
SynergyEngine.findSynergies > 1000 cards 2,986 ops/s 0.3349 ms ±0.43% ⚪ +5.4%
SynergyEngine.findSynergies > 1500 cards 1,908 ops/s 0.5242 ms ±0.32% ⚪ -0.8%
SynergyEngine.checkSynergy > single pair check 184,157 ops/s 0.0054 ms ±0.27% ⚪ -0.1%
SynergyEngine.getPairSynergies > bidirectional pair detail 113,430 ops/s 0.0088 ms ±0.27% ⚪ +1.4%
Rule initialization > getAllRules 14,654,851 ops/s 0.0001 ms ±0.11% ⚪ +1.1%

Compared against base branch. 🟢 >10% faster · ⚪ within 10% · 🔴 >10% slower · Fails at >70% regression.

@github-actions

Copy link
Copy Markdown

size-limit report 📦

Path Size
Total JS bundle 294.7 KB (+3.54% 🔺)
Card data JSON 321.95 KB (0%)

@github-actions

Copy link
Copy Markdown

⚡ Lighthouse Results

URL TBT LCP CLS FCP SI
/ 🟢 13ms 🔴 4818ms 🟢 0.072 🟠 1997ms 🟢 1997ms
/browse 🟢 22ms 🔴 6104ms 🟢 0.004 🔴 2379ms 🟢 2379ms
/card/957 🟢 8ms 🔴 5789ms 🟢 0.003 🟠 1916ms 🟢 1916ms
/card/957/synergies 🟢 10ms 🔴 5051ms 🟢 0.000 🟠 1921ms 🟢 1921ms
/playstyles 🟢 16ms 🔴 7010ms 🟢 0.000 🟠 2146ms 🟢 2146ms
/playstyles/lore-denial 🟢 24ms 🔴 5870ms 🟢 0.000 🔴 2374ms 🟢 2374ms
Threshold 🚫 500ms ⚠️ 3000ms 🚫 0.1 ⚠️ 2200ms ⚠️ 4000ms

Median of 3 runs. 🟢 ≤75% of limit · 🟠 within limit · 🔴 over limit · 🚫 merge-blocking · ⚠️ warning

@Doberjohn Doberjohn merged commit 2f5667d into master Jun 27, 2026
23 checks passed
@Doberjohn Doberjohn deleted the feature/390-reveals-redesign branch June 27, 2026 07:19
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.

Redesign reveals page: immersive six-ink set-tracker view with two-view toggle

1 participant