Skip to content

feat(web): refine sprint landing page - #1996

Open
groupthinking wants to merge 5 commits into
mainfrom
feature/design-sprint-landing-page
Open

groupthinking wants to merge 5 commits into
mainfrom
feature/design-sprint-landing-page

Conversation

@groupthinking

Copy link
Copy Markdown
Owner

Canonical issue

Closes #1975

Outcome

This pull request gives a first-time visitor a clear, accessible YouTube URL-to-Studio path while retaining the existing hashed Video Pack handoff and Workflow Pro checkout integration.

Scope

  • Included: Home-page hierarchy and approved workflow copy; accessible input help, invalid state, and focus treatment; Workflow Pro cadence, checkout, and pricing-link focus treatment; source-level regression coverage; local responsive and keyboard browser coverage.
  • Explicitly excluded: Backend routes, authentication, billing configuration, Stripe products or checkout behavior, new product surfaces, live checkout submission, and deployment.

Risk

  • Risk level: low
  • Failure mode: Landing-page copy or focus treatment could obscure the existing conversion flow or make a selector ambiguous.
  • Rollback: Revert commit 6013b5ea.

Verification

Verified against commit 6013b5ea.

  • npx turbo run test --force — 127 test files passed; 1,215 tests passed and 27 skipped.
  • npm --workspaces --if-present run type-check
  • npm --workspace eventrelay-web run lint — passes with three pre-existing warnings in OneLoopStudio.tsx and VideoWorkflowStudio.tsx, outside this PR.
  • Local Playwright smoke and landing acceptance suite — 9 tests passed at 360 px and 1280 px, including invalid URL state, keyboard focusability, and Studio handoff.
  • Required CI
  • Review threads resolved — none at creation.

Production evidence

Not applicable. This draft intentionally includes no deployment, production checkout attempt, or live conversion claim. Browser verification used a local server and non-production Turnstile placeholder only.

Agent handoff

  • One canonical issue is linked.
  • No competing open pull request was found for [Agent] Design sprint landing page #1975.
  • Acceptance criteria are satisfied by local test and browser evidence.
  • Required local checks pass on the current head; CI remains pending.
  • No additional product, security, irreversible infrastructure, or production decision is requested.

Clarify the existing YouTube-to-Studio workflow, preserve the shared Workflow Pro checkout path, and add accessible local browser coverage.\n\nRefs #1975
@vercel

vercel Bot commented Sep 17, 2026

Copy link
Copy Markdown
Contributor

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

Project Deployment Actions Updated
v0-uvai Ready Ready Preview, v0 Sep 20, 2026 12:07pm UTC

@coderabbitai

coderabbitai Bot commented Sep 17, 2026

Copy link
Copy Markdown
Contributor

Important

  • 🔍 Trigger review

This repository does not receive automatic reviews because it has fewer than 10 stars.

⚙️ Run configuration

Configuration used: Repository: groupthinking/EventRelay/.coderabbit.yaml

Review profile: ASSERTIVE

Plan: Advanced

Run ID: f9b877c3-132c-41e0-b85f-6f7985fc1d72


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.

@github-actions github-actions Bot added javascript Pull requests that update javascript code tests labels Sep 17, 2026
@github-actions

github-actions Bot commented Sep 17, 2026

Copy link
Copy Markdown
Contributor

Dependency Review Summary

The full dependency review summary was too large to display here (13153KB, limit is 1024KB).

Please download the artifact named "dependency-review-summary" to view the complete report.

View full job summary

@groupthinking

Copy link
Copy Markdown
Owner Author

@copilot resolve the merge conflicts in this pull request

…-landing-page

# Conflicts:
#	apps/web/src/app/page.tsx
#	apps/web/src/components/billing/ProCheckoutButton.tsx
#	apps/web/src/components/home/HomePasteForm.tsx
#	apps/web/src/components/home/HomeProCheckout.tsx
#	apps/web/src/lib/__tests__/home-sell-surface.test.ts

Co-authored-by: groupthinking <154503486+groupthinking@users.noreply.github.com>
@groupthinking
groupthinking marked this pull request as ready for review September 18, 2026 21:04
Copilot AI balanced review requested due to automatic review settings September 18, 2026 21:04
Co-authored-by: groupthinking <154503486+groupthinking@users.noreply.github.com>

Copilot AI commented Sep 18, 2026

Copy link
Copy Markdown
Contributor

@copilot resolve the merge conflicts in this pull request

Resolved. I merged origin/main and fixed all conflicts in commit bbab3e1, then aligned one home-page source assertion in follow-up commit 355f5e9.

Comment thread apps/web/playwright/smoke.spec.ts Outdated
Comment thread apps/web/playwright/landing-page.spec.ts Outdated

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Warning

Copilot couldn't run its full agentic review because it didn't start before the timeout. Make sure your repository has a runner available, or add a copilot-code-review.yml file specifying one with the runs-on attribute. See the docs for more details.

Pull request overview

Refines the web landing page’s first-time visitor flow (YouTube URL → Studio), with additional accessibility/focus treatment and regression/acceptance coverage.

Changes:

  • Updated source-level regression assertions for landing page copy and accessibility/focus attributes.
  • Updated Playwright smoke coverage to match the revised landing-page conversion path and price display.
  • Added a new local-only Playwright landing-page acceptance spec (responsive + invalid URL + keyboard focus).

Reviewed changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated 5 comments.

File Description
apps/web/src/lib/tests/home-sell-surface.test.ts Expands source-level regression assertions for new landing copy and a11y/focus attributes.
apps/web/playwright/smoke.spec.ts Updates smoke assertions to align with the new landing-page hierarchy and price rendering.
apps/web/playwright/landing-page.spec.ts Adds local-only acceptance checks for layout overflow, invalid URL announcement, and keyboard focusability.

💡 Configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment on lines +9 to +10
test.skip(
!baseURL || !['localhost', '127.0.0.1', '[::1]'].includes(new URL(baseURL).hostname),
});

async function expectNoHorizontalOverflow(page: Page) {
expect(await page.evaluate(() => document.documentElement.scrollWidth <= window.innerWidth)).toBe(true);
test('Features and playground fold into Home', async ({ page }) => {
const features = await page.goto('/features');
expect(features?.status()).toBeLessThan(400);
await expect(page).toHaveURL(/\/(\?.*)?$/);
Comment on lines +23 to +25
expect(home).toContain('Paste a YouTube URL. Continue in Studio.');
expect(home).toContain('hashed Video Pack');
expect(home).toContain('transcript, event, and action outputs');
expect(home).toContain('HomeProCheckout');
expect(home).toContain('Get Pro');
expect(home).toContain('workflowProPriceLabel');
expect(home).not.toContain('Ship');
vercel Bot and others added 2 commits September 20, 2026 12:06
…a YouTube URL. Continue in Studio.", "Open Studio", "Review the outputs") that do not exist in the rendered home page, so the smoke suite fails against any deployment of this branch.

This commit fixes the issue reported at apps/web/playwright/smoke.spec.ts:61

## Bug

The `Homepage is a sell page...` test in `apps/web/playwright/smoke.spec.ts` asserts DOM content that does not exist on the current home page (`apps/web/src/app/page.tsx`):

- **Heading** — asserted `getByRole('heading', { name: /Paste a YouTube URL. Continue in Studio./i })`. The real `h1` (`id="home-heading"`) is:
  > Turn a YouTube URL into a hashed Video Pack in Studio.
  
  A grep for `Continue in Studio` across `apps/web/src` returns zero matches.

- **`getByText('Open Studio')`** — "Open Studio" only appears in `components/StructuredData.tsx` (JSON‑LD inside a `<script>`, not visible) and `app/opengraph-image.tsx` (an OG image, not DOM). No visible DOM text matches, so `.toBeVisible()` fails.

- **`getByText('Review the outputs')`** — this string does not appear anywhere in the source, so the locator resolves to nothing and the assertion fails.

- **`getByText(/Paste a YouTube URL/i).nth(1)`** — previously there were two visible occurrences (the old heading + the intro paragraph). With the heading changed, only the intro paragraph ("Paste a YouTube URL to open Studio and review...") remains, so index `1` no longer exists and `.toBeVisible()` fails.

### Trigger
Running the smoke suite (`Homepage is a sell page with paste action...`) against any real deployment of this branch. Each of the four assertions above resolves to a missing element and times out, failing the test. This is drift: the source-content test `home-sell-surface.test.ts` was aligned to the real string `Turn a YouTube URL into a hashed Video Pack in Studio.`, but the Playwright specs were not updated during the merge-conflict resolution.

## Fix

Aligned the assertions to actual visible copy rendered by `page.tsx` / `HomeProCheckout.tsx`:

- Heading → `/Turn a YouTube URL into a hashed Video Pack in Studio./i` (the real `h1`).
- `.nth(1)` → `.first()` for the single remaining "Paste a YouTube URL" paragraph.
- `Open Studio` → `/Start in Studio/i` (visible `h2` "Start in Studio, then choose the right level of support.").
- `Review the outputs` → `/transcript, event, and action outputs/i` (visible intro paragraph).

The other `h1` assertions in the file target the `/studio` workbench (whose `h1` is "Paste a YouTube URL") and are unaffected.

Co-authored-by: Vercel <vercel[bot]@users.noreply.github.com>
Co-authored-by: groupthinking <garveyht@gmail.com>
…is never rendered, so `.toBeVisible()` will fail.

This commit fixes the issue reported at apps/web/playwright/landing-page.spec.ts:24

## Bug

`apps/web/playwright/landing-page.spec.ts:24` asserts:

```ts
await expect(page.getByRole('heading', { name: 'Paste a YouTube URL. Continue in Studio.' })).toBeVisible();
```

But the actual `h1` (`id="home-heading"`) rendered in `apps/web/src/app/page.tsx` is:

```
Turn a YouTube URL into a hashed Video Pack in Studio.
```

A grep for `"Continue in Studio"` / `"Paste a YouTube URL. Continue"` across `apps/web/src` returns zero matches, so the asserted heading is never rendered. The exact-name role query resolves to no element and `.toBeVisible()` fails.

## Trigger

Both landing-page acceptance tests (parametrized over the two viewports) run this assertion after `page.goto('/')`, so every run of the landing-page spec against a local `BASE_URL` fails on line 24.

## Fix

Realigned the assertion to the actual rendered `h1` text: `Turn a YouTube URL into a hashed Video Pack in Studio.`. This matches the source string, consistent with how the same PR updated `home-sell-surface.test.ts`.

Co-authored-by: Vercel <vercel[bot]@users.noreply.github.com>
Co-authored-by: groupthinking <garveyht@gmail.com>
@github-actions

Copy link
Copy Markdown
Contributor

✅ E2E Test Results: ALL TESTS PASSED

Metric Value
Status 🟢 GREEN
Total Tests
Passed 19
Failed
Deployment https://v0-uvai-8xm3qzqhx-garv1.vercel.app
Test Output
tdout�[2m | tests/e2e/pipeline.test.ts�[2m > �[22m�[2mEventRelay E2E — Live Deployment�[2m > �[22m�[2mSSE Pipeline Stream�[2m > �[22m�[2mSSE stream emits at least a pipeline_status:running event
�[22m�[39m[E2E] last pipeline_status: complete

 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mSSE Pipeline Stream�[2m > �[22mSSE stream emits at least a pipeline_status:running event�[33m 19691�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mSSE Pipeline Stream�[2m > �[22mSSE stream closes within 90 seconds (no 95% hang)�[33m 25661�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mSSE Pipeline Stream�[2m > �[22mSSE events fire in correct agent order�[33m 18742�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mCloudEvent Schema�[2m > �[22mSSE events contain valid timestamps�[33m 18086�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mCloudEvent Schema�[2m > �[22mterminal pipeline_status includes duration and stage progress�[33m 15256�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mError Handling�[2m > �[22mmissing URL returns 400, not a hang�[32m 97�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mError Handling�[2m > �[22minvalid URL returns error event or completes quickly, not a hang�[33m 14060�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mDashboard�[2m > �[22m/dashboard returns 200�[32m 226�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mDashboard�[2m > �[22m/dashboard contains agent or pipeline visualization markup�[33m 1584�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mAPI Health�[2m > �[22mGET /api returns a response (not 404)�[32m 287�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mAPI Health�[2m > �[22mPOST /api/pipeline/stream with no body returns 400�[32m 67�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mStatic Assets�[2m > �[22mhomepage has proper meta tags�[32m 69�[2mms�[22m�[39m
 �[32m✓�[39m tests/e2e/pipeline.test.ts�[2m > �[22mEventRelay E2E — Live Deployment�[2m > �[22mStatic Assets�[2m > �[22m/features page returns 200�[32m 94�[2mms�[22m�[39m

�[2m Test Files �[22m �[1m�[32m1 passed�[39m�[22m�[90m (1)�[39m
�[2m      Tests �[22m �[1m�[32m19 passed�[39m�[22m�[90m (19)�[39m
�[2m   Start at �[22m 12:08:16
�[2m   Duration �[22m 116.60s�[2m (transform 62ms, setup 0ms, import 77ms, tests 116.38s, environment 0ms)�[22m


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

Labels

javascript Pull requests that update javascript code tests

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Agent] Design sprint landing page

3 participants