Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .claude/launch.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,12 @@
"runtimeExecutable": "cmd.exe",
"runtimeArgs": ["/c", "pnpm", "dev"],
"port": 5173
},
{
"name": "storybook",
"runtimeExecutable": "cmd.exe",
"runtimeArgs": ["/c", "pnpm", "--filter", "inkweave-web", "storybook"],
"port": 6006
}
]
}
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,8 @@ docs/reviews/

# Pre-code HTML/CSS design mockups — local-only design work, never committed
apps/web/public/mockups/
# Design handoff reference (Claude Design exports) — local-only, never committed
apps/web/reveals page redesign/

# Tool / plugin local state — managed by their installers, not tracked
.agents/
Expand Down
7 changes: 4 additions & 3 deletions apps/web/e2e/E2E_TESTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -192,15 +192,16 @@ Regression guard for issue #268 (skeleton-loading UI). Each test intercepts `/da
| VotePage renders pair + score picker skeleton while queue loads | CompactHeader visible; `[aria-label="Loading vote pair"]` visible |
| InDepthVotePage renders pair + form skeleton while pair data loads | CompactHeader visible; `[aria-label="Loading vote pair and form"]` visible |

## `reveals-page.spec.ts` — 5 tests (4 desktop, 1 mobile)
## `reveals-page.spec.ts` — 6 tests (5 desktop, 1 mobile)

| Test | What it verifies |
|---|---|
| renders hero and franchise tiers at /reveals | All 4 tier headings (Monsters, Inc., Up, Turning Red, Returning) render |
| renders the tracker: hero, six ink trackers, and franchise cards | sr-only `h1`, the "Attack of the Vine!" logo, 6 `ink-tracker-tile`s, the "Ink board" section, and the 3 "View … cards" franchise buttons all render |
| desktop nav shows Reveals entry with NEW badge | `/` has a Reveals link with a "NEW" badge child |
| mobile nav shows Reveals tab | On mobile, `/browse`'s bottom nav has a "Set 13 reveals" link |
| promo modal appears on landing page and not on /reveals | `role="complementary" name=/Set 13 reveals/` visible on `/`, absent on `/reveals` |
| tier card click opens the card overview modal | Clicking a card tile on `/reveals` opens the modal; URL stays `/reveals` |
| mosaic card click opens the card overview modal | Clicking a `reveal-card-slot` on `/reveals` opens the modal; URL stays `/reveals` |
| franchise card click opens the franchise cards modal | Clicking "View Monsters, Inc. cards" opens the `dialog`; a card-tile inside opens the overview modal on top |

## Patterns

Expand Down
65 changes: 51 additions & 14 deletions apps/web/e2e/tests/reveals-page.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,15 +35,25 @@ test.describe('Reveals page (flag on)', () => {
}
});

test('renders hero and franchise tiers at /reveals', async ({page}, testInfo) => {
test('renders the tracker: hero, six ink trackers, and franchise cards', async ({page}, testInfo) => {
if (testInfo.project.name.startsWith('mobile-')) test.skip();

await page.goto('/reveals');

await expect(page.getByRole('heading', {name: 'Monsters, Inc.', exact: true})).toBeVisible();
await expect(page.getByRole('heading', {name: 'Up', exact: true})).toBeVisible();
await expect(page.getByRole('heading', {name: 'Turning Red', exact: true})).toBeVisible();
await expect(page.getByRole('heading', {name: /Returning franchises/i})).toBeVisible();
// Page identity (the visible title is the set logo image; the h1 is sr-only).
await expect(page.getByRole('heading', {level: 1, name: /Attack of the Vine/i})).toHaveCount(1);
await expect(page.getByAltText('Attack of the Vine!')).toBeVisible();

// Six ink tracker tiles (one per ink).
await expect(page.getByTestId('ink-tracker-tile')).toHaveCount(6);

// The featured ink board.
await expect(page.getByText('Ink board', {exact: true})).toBeVisible();

// The three new-franchise cards (open their cards modal on click).
await expect(page.getByRole('button', {name: 'View Monsters, Inc. cards'})).toBeVisible();
await expect(page.getByRole('button', {name: 'View Up cards'})).toBeVisible();
await expect(page.getByRole('button', {name: 'View Turning Red cards'})).toBeVisible();
});

test('desktop nav shows Reveals entry with NEW badge', async ({page}, testInfo) => {
Expand Down Expand Up @@ -82,21 +92,48 @@ test.describe('Reveals page (flag on)', () => {
).toHaveCount(0);
});

test('tier card click opens the card overview modal', async ({page}, testInfo) => {
test('mosaic card click opens the card overview modal', async ({page}, testInfo) => {
if (testInfo.project.name.startsWith('mobile-')) test.skip();

await page.goto('/reveals');
// Early reveal season: previewCards.json may still have cards: [] (no tiles to
// click). Skip until at least one Set 13 card is curated, mirroring the
// season-ended skip in beforeEach so the suite stays green across the lifecycle.
const tileCount = await page.getByTestId('card-tile').count();
test.skip(tileCount === 0, 'No reveal cards curated yet (previewCards.json cards: []).');
const firstTile = page.getByTestId('card-tile').first();
await expect(firstTile).toBeVisible();
await firstTile.click();
// The mosaic renders after the card data loads (async), so wait for the first
// revealed slot rather than snapshotting the count. Early reveal season:
// previewCards.json may still have cards: [] (no slots) — skip then, mirroring
// the season-ended skip in beforeEach so the suite stays green across the lifecycle.
const firstSlot = page.getByTestId('reveal-card-slot').first();
const hasSlots = await firstSlot
.waitFor({state: 'visible', timeout: 10000})
.then(() => true)
.catch(() => false);
test.skip(!hasSlots, 'No reveal cards curated yet (previewCards.json cards: []).');
await firstSlot.click();
// Card click opens the global modal (URL stays at /reveals).
// Modal open = React mount + per-card synergy fetch + visibility transition; slow CI
// webkit can exceed 5s before the overlay-visible class settles.
await expect(page.getByTestId('card-overview-modal')).toBeVisible({timeout: 15000});
});

test('franchise card click opens the franchise cards modal', async ({page}, testInfo) => {
if (testInfo.project.name.startsWith('mobile-')) test.skip();

await page.goto('/reveals');
await page.getByRole('button', {name: 'View Monsters, Inc. cards'}).click();

const modal = page.getByRole('dialog', {name: 'Monsters, Inc. cards'});
await expect(modal).toBeVisible({timeout: 15000});

// A card inside the franchise modal opens the shared card overview modal on top.
// The grid renders a tick after the dialog opens, so wait for the first tile
// rather than snapshotting the count. If the franchise has no revealed cards
// yet (early season), the grid stays empty and we skip the card-click assertion.
const cardTiles = modal.getByTestId('card-tile');
const hasCards = await cardTiles
.first()
.waitFor({state: 'visible', timeout: 5000})
.then(() => true)
.catch(() => false);
test.skip(!hasCards, 'No cards revealed for this franchise yet.');
await cardTiles.first().click();
await expect(page.getByTestId('card-overview-modal')).toBeVisible({timeout: 15000});
});
});
Binary file added apps/web/public/card-images-preview/13001-sm.avif
Binary file not shown.
Binary file added apps/web/public/card-images-preview/13001.avif
Binary file not shown.
Binary file added apps/web/public/card-images-preview/13003-sm.avif
Binary file not shown.
Binary file added apps/web/public/card-images-preview/13003.avif
Binary file not shown.
Binary file added apps/web/public/card-images-preview/13032-sm.avif
Binary file not shown.
Binary file added apps/web/public/card-images-preview/13032.avif
Binary file not shown.
Binary file modified apps/web/public/card-images-preview/13033-sm.avif
Binary file not shown.
Binary file modified apps/web/public/card-images-preview/13033.avif
Binary file not shown.
Binary file added apps/web/public/card-images-preview/13035-sm.avif
Binary file not shown.
Binary file added apps/web/public/card-images-preview/13035.avif
Binary file not shown.
Binary file added apps/web/public/card-images-preview/13036-sm.avif
Binary file not shown.
Binary file added apps/web/public/card-images-preview/13036.avif
Binary file not shown.
Binary file modified apps/web/public/card-images-preview/13037-sm.avif
Binary file not shown.
Binary file modified apps/web/public/card-images-preview/13037.avif
Binary file not shown.
Binary file added apps/web/public/card-images-preview/13039-sm.avif
Binary file not shown.
Binary file added apps/web/public/card-images-preview/13039.avif
Binary file not shown.
Binary file added apps/web/public/card-images-preview/13041-sm.avif
Binary file not shown.
Binary file added apps/web/public/card-images-preview/13041.avif
Binary file not shown.
Binary file added apps/web/public/card-images-preview/13043-sm.avif
Binary file not shown.
Binary file added apps/web/public/card-images-preview/13043.avif
Binary file not shown.
Binary file added apps/web/public/card-images-preview/13048-sm.avif
Binary file not shown.
Binary file added apps/web/public/card-images-preview/13048.avif
Binary file not shown.
Binary file added apps/web/public/card-images-preview/13050-sm.avif
Binary file not shown.
Binary file added apps/web/public/card-images-preview/13050.avif
Binary file not shown.
Binary file added apps/web/public/card-images-preview/13057-sm.avif
Binary file not shown.
Binary file added apps/web/public/card-images-preview/13057.avif
Binary file not shown.
Binary file modified apps/web/public/card-images-preview/13058-sm.avif
Binary file not shown.
Binary file modified apps/web/public/card-images-preview/13058.avif
Binary file not shown.
Binary file added apps/web/public/card-images-preview/13064-sm.avif
Binary file not shown.
Binary file added apps/web/public/card-images-preview/13064.avif
Binary file not shown.
Binary file modified apps/web/public/card-images-preview/13065-sm.avif
Binary file not shown.
Binary file modified apps/web/public/card-images-preview/13065.avif
Binary file not shown.
Binary file added apps/web/public/card-images-preview/13066-sm.avif
Binary file not shown.
Binary file added apps/web/public/card-images-preview/13066.avif
Binary file not shown.
Binary file added apps/web/public/card-images-preview/13071-sm.avif
Binary file not shown.
Binary file added apps/web/public/card-images-preview/13071.avif
Binary file not shown.
Binary file added apps/web/public/card-images-preview/13084-sm.avif
Binary file not shown.
Binary file added apps/web/public/card-images-preview/13084.avif
Binary file not shown.
Binary file modified apps/web/public/card-images-preview/13088-sm.avif
Binary file not shown.
Binary file modified apps/web/public/card-images-preview/13088.avif
Binary file not shown.
Binary file added apps/web/public/card-images-preview/13092-sm.avif
Binary file not shown.
Binary file added apps/web/public/card-images-preview/13092.avif
Binary file not shown.
Binary file modified apps/web/public/card-images-preview/13103-sm.avif
Binary file not shown.
Binary file modified apps/web/public/card-images-preview/13103.avif
Binary file not shown.
Binary file added apps/web/public/card-images-preview/13106-sm.avif
Binary file not shown.
Binary file added apps/web/public/card-images-preview/13106.avif
Binary file not shown.
Binary file modified apps/web/public/card-images-preview/13108-sm.avif
Binary file not shown.
Binary file modified apps/web/public/card-images-preview/13108.avif
Binary file not shown.
Binary file modified apps/web/public/card-images-preview/13119-sm.avif
Binary file not shown.
Binary file modified apps/web/public/card-images-preview/13119.avif
Binary file not shown.
Binary file modified apps/web/public/card-images-preview/13122-sm.avif
Binary file not shown.
Binary file modified apps/web/public/card-images-preview/13122.avif
Binary file not shown.
Binary file modified apps/web/public/card-images-preview/13128-sm.avif
Binary file not shown.
Binary file modified apps/web/public/card-images-preview/13128.avif
Binary file not shown.
Binary file modified apps/web/public/card-images-preview/13129-sm.avif
Binary file not shown.
Binary file modified apps/web/public/card-images-preview/13129.avif
Binary file not shown.
Binary file added apps/web/public/card-images-preview/13130-sm.avif
Binary file not shown.
Binary file added apps/web/public/card-images-preview/13130.avif
Binary file not shown.
Binary file not shown.
Binary file added apps/web/public/card-images-preview/13134.avif
Binary file not shown.
Binary file modified apps/web/public/card-images-preview/13142-sm.avif
Binary file not shown.
Binary file modified apps/web/public/card-images-preview/13142.avif
Binary file not shown.
Binary file added apps/web/public/card-images-preview/13148-sm.avif
Binary file not shown.
Binary file added apps/web/public/card-images-preview/13148.avif
Binary file not shown.
Binary file added apps/web/public/card-images-preview/13151-sm.avif
Binary file not shown.
Binary file added apps/web/public/card-images-preview/13151.avif
Binary file not shown.
Binary file added apps/web/public/card-images-preview/13158-sm.avif
Binary file not shown.
Binary file added apps/web/public/card-images-preview/13158.avif
Binary file not shown.
Binary file modified apps/web/public/card-images-preview/13161-sm.avif
Binary file not shown.
Binary file modified apps/web/public/card-images-preview/13161.avif
Binary file not shown.
Binary file modified apps/web/public/card-images-preview/13162-sm.avif
Binary file not shown.
Binary file modified apps/web/public/card-images-preview/13162.avif
Binary file not shown.
Binary file modified apps/web/public/card-images-preview/13169-sm.avif
Binary file not shown.
Binary file modified apps/web/public/card-images-preview/13169.avif
Binary file not shown.
Binary file not shown.
Binary file added apps/web/public/card-images-preview/13173.avif
Binary file not shown.
Binary file modified apps/web/public/card-images-preview/13174-sm.avif
Binary file not shown.
Binary file modified apps/web/public/card-images-preview/13174.avif
Binary file not shown.
Binary file added apps/web/public/card-images-preview/13180-sm.avif
Binary file not shown.
Binary file added apps/web/public/card-images-preview/13180.avif
Binary file not shown.
Binary file added apps/web/public/card-images-preview/13186-sm.avif
Binary file not shown.
Binary file added apps/web/public/card-images-preview/13186.avif
Binary file not shown.
Binary file modified apps/web/public/card-images-preview/13187-sm.avif
Binary file not shown.
Binary file modified apps/web/public/card-images-preview/13187.avif
Binary file not shown.
Binary file added apps/web/public/card-images-preview/13195-sm.avif
Binary file not shown.
Binary file added apps/web/public/card-images-preview/13195.avif
Binary file not shown.
Binary file added apps/web/public/card-images-preview/13196-sm.avif
Binary file not shown.
Binary file added apps/web/public/card-images-preview/13196.avif
Binary file not shown.
Binary file added apps/web/public/card-images-preview/13203-sm.avif
Binary file not shown.
Binary file added apps/web/public/card-images-preview/13203.avif
Binary file not shown.
Binary file added apps/web/public/card-images-preview/13204-sm.avif
Binary file not shown.
Binary file added apps/web/public/card-images-preview/13204.avif
Binary file not shown.
Binary file removed apps/web/public/card-images-preview/13900-sm.avif
Binary file not shown.
Binary file removed apps/web/public/card-images-preview/13900.avif
Binary file not shown.
Binary file removed apps/web/public/card-images-preview/13912-sm.avif
Binary file not shown.
Binary file removed apps/web/public/card-images-preview/13912.avif
Binary file not shown.
Binary file removed apps/web/public/card-images-preview/13914-sm.avif
Binary file not shown.
Binary file removed apps/web/public/card-images-preview/13914.avif
Binary file not shown.
Binary file removed apps/web/public/card-images-preview/13920-sm.avif
Binary file not shown.
Binary file removed apps/web/public/card-images-preview/13920.avif
Binary file not shown.
Binary file removed apps/web/public/card-images-preview/13926-sm.avif
Binary file not shown.
Binary file removed apps/web/public/card-images-preview/13926.avif
Binary file not shown.
Binary file removed apps/web/public/card-images-preview/13933-sm.avif
Binary file not shown.
Binary file removed apps/web/public/card-images-preview/13933.avif
Binary file not shown.
Binary file removed apps/web/public/card-images-preview/13948-sm.avif
Binary file not shown.
Binary file removed apps/web/public/card-images-preview/13948.avif
Binary file not shown.
Binary file removed apps/web/public/card-images-preview/13952-sm.avif
Binary file not shown.
Binary file removed apps/web/public/card-images-preview/13952.avif
Binary file not shown.
Binary file removed apps/web/public/card-images-preview/13975-sm.avif
Binary file not shown.
Binary file removed apps/web/public/card-images-preview/13975.avif
Binary file not shown.
Binary file removed apps/web/public/card-images-preview/13977-sm.avif
Binary file not shown.
Binary file removed apps/web/public/card-images-preview/13977.avif
Binary file not shown.
Loading
Loading