Skip to content

feat: UVAI UI/UX full refactor — features page, pricing, Nav, LandingNav - #205

Merged
groupthinking merged 2 commits into
mainfrom
v0/refactor-ui-ux-21ccc490
May 27, 2026
Merged

feat: UVAI UI/UX full refactor — features page, pricing, Nav, LandingNav#205
groupthinking merged 2 commits into
mainfrom
v0/refactor-ui-ux-21ccc490

Conversation

@groupthinking

Copy link
Copy Markdown
Owner

Summary

Full UI/UX refactor across the marketing surface of UVAI. Two focused commits.

Commit 1 — /features page complete rewrite

  • Zero emoji anywhere — all replaced with purpose-built inline SVGs at consistent sizing
  • Visual panels for each feature section: TranscriptMockup, EventStreamMockup, ChatMockup, ExportMockup, DeployMockup, McpMockup — all rendered inside a faux browser chrome with real data
  • Stats strip redesigned as a single-bordered grid
  • Comparison table checkmarks are SVG polylines, not Unicode characters
  • Testimonial avatars are rounded-lg with per-person accent colors
  • Typography: text-balance on headings, tighter hierarchy, font-mono section nav pills
  • CTA section: zero gradient abuse

Commit 2 — App-wide audit

  • Pricing page: emoji shield/chat → SVG icons, / table cells → <TableCheck>/<TableDash> SVG components, Pro card purple gradient removed (teal tint), hero .gradient-text class → inline teal gradient, FAQ HTML entity bug fixed
  • Nav.tsx: gradient logo div removed — clean bordered SVG play icon
  • LandingNav.tsx: <a href="#hash"><Link href="/page#hash"> with usePathname active-state highlighting, /features and /pricing added as cross-page destinations
  • features + pricing pages: both now use LandingNav instead of Nav for a unified marketing experience

v0 and others added 2 commits May 22, 2026 17:37
Remove emojis, replace decorative shapes, use real mockups, tighten typography, and refine UI elements.

Co-authored-by: Hayden <154503486+groupthinking@users.noreply.github.com>
…ngNav cross-page links

- pricing: replace emoji shield/chat with SVG icons
- pricing: replace unicode ✓ CheckItem with inline SVG polyline
- pricing: replace unicode ✓/— in comparison table with <TableCheck>/<TableDash> SVG components
- pricing: fix Pro card bg (remove purple gradient, use teal tint)
- pricing: fix hero gradient-text to use inline teal gradient (no class dependency)
- pricing: fix FAQ HTML entity literal in JS string
- pricing: swap Nav→LandingNav for consistent marketing nav experience
- Nav: replace gradient logo div with clean bordered SVG icon (matches LandingNav)
- LandingNav: convert anchor-only links to proper Next.js <Link> with cross-page routes
- LandingNav: add active-state highlight based on usePathname
- features: swap Nav→LandingNav for consistent marketing nav experience

Co-authored-by: v0[bot] <v0[bot]@users.noreply.github.com>
@groupthinking
groupthinking merged commit 2e07ebb into main May 27, 2026
1 of 16 checks passed
@groupthinking
groupthinking deleted the v0/refactor-ui-ux-21ccc490 branch May 27, 2026 06:45
@coderabbitai

coderabbitai Bot commented May 27, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 9a6a8590-ca38-4329-872b-07c5d31cdc1e

📥 Commits

Reviewing files that changed from the base of the PR and between c04787c and 33c741f.

📒 Files selected for processing (4)
  • apps/web/src/app/features/page.tsx
  • apps/web/src/app/pricing/page.tsx
  • apps/web/src/components/Nav.tsx
  • apps/web/src/components/landing/LandingNav.tsx

Disabled knowledge base sources:

  • Linear integration is disabled

You can enable these sources in your CodeRabbit configuration.


📝 Walkthrough

Summary by CodeRabbit

Release Notes

  • Style & UI Updates
    • Redesigned Features landing page with interactive visual mockups for each feature section, updated stats display, and enhanced comparison table
    • Refreshed Pricing page with improved feature comparison styling and updated icon treatments
    • Enhanced navigation components with active link highlighting
    • Restyled testimonials and call-to-action sections with refined visual design

Walkthrough

This PR redesigns the Features and Pricing landing pages with a consistent navigation experience. Navigation components are improved to detect current routes and apply active-link styling. Both pages switch from the old Nav to the improved LandingNav component. The Features page undergoes a substantial visual overhaul with new mockup components, redesigned section navigation, and restructured layouts. The Pricing page updates its comparison table to use boolean data with SVG icons and refines styling throughout.

Changes

Landing Pages Navigation & Visual Redesign

Layer / File(s) Summary
Navigation Infrastructure & Logo Styling
apps/web/src/components/landing/LandingNav.tsx, apps/web/src/components/Nav.tsx
LandingNav now imports usePathname and clsx, detects current route, and renders Next.js Link elements with dynamic active-link classes. NAV_LINKS config includes page metadata for route matching. Nav logo container replaced with bordered square (w-8/h-8, rounded-lg) containing inline SVG icon. GitHub icon in both components gain aria-hidden attributes.
Features Page Mockups & Section Data
apps/web/src/app/features/page.tsx (components, SECTIONS)
Six new local mockup components (TranscriptMockup, EventStreamMockup, ChatMockup, ExportMockup, DeployMockup, McpMockup) render static UI previews. All SECTIONS entries updated: transcription, ai, chat, export, deploy, mcp each gain a mockup prop and replace prior emoji/simple bullets with expanded inline SVG icon bullets and revised titles, subtitles, and descriptions.
Features Page Layout & Content Sections
apps/web/src/app/features/page.tsx (page structure)
Page switched to LandingNav and restructured: hero copy/buttons refreshed, section navigation pills added with activeSection state tracking, feature panels redesigned with new grid layout and "window chrome" mockup panels paired with text panels containing icon-tile bullets, stats strip (4-column grid) added, "vs. Alternatives" comparison table redesigned with CompCell helper, testimonials section restyled with new avatar/star rendering, final CTA section replaced with bordered container using teal gradient glow.
Pricing Page Navigation & Table Refactoring
apps/web/src/app/pricing/page.tsx
Page switched to LandingNav render. New TableCheck and TableDash SVG components replace text checkmark/dash markers. Comparison table data refactored from symbol strings ('✓', '—') to boolean values; renderCell helper maps booleans to SVG components. CheckItem updated to render SVG icon instead of text checkmark. Hero text "transparent" word uses inline WebkitBackgroundClip/WebkitTextFillColor gradient. Pro card background changed from linear-gradient to solid RGBA. Money-back guarantee and FAQ icons replaced with SVG designs. FAQ string uses literal apostrophe instead of HTML entity.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Suggested labels

frontend

✨ Navigation routes now light up bright,
Landing pages gleam with mockups in sight,
Tables turn boolean, icons take flight,
Features and pricing—redesigned right! 🎨

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch v0/refactor-ui-ux-21ccc490

Warning

There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure.

🔧 ESLint

If the error stems from missing dependencies, add them to the package.json file. For unrecoverable errors (e.g., due to private dependencies), disable the tool in the CodeRabbit configuration.

ESLint skipped: no ESLint configuration detected in root package.json. To enable, add eslint to devDependencies.


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

@gemini-code-assist gemini-code-assist Bot 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.

Code Review

This pull request refactors the landing and pricing pages to replace standard emojis and icons with inline SVGs, adds interactive visual mockup components to showcase platform features, and updates navigation links. The review feedback highlights a layout overlap issue caused by the fixed header when navigating to section anchors, identifies opportunities to replace inline styles with Tailwind CSS utility classes for better maintainability, and suggests updating the 'Features' navigation link to point directly to the newly introduced dedicated features page.

{SECTIONS.map((section, sectionIdx) => {
const isEven = sectionIdx % 2 === 0;
return (
<section key={section.id} id={section.id}>

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.

medium

Since the LandingNav component is fixed at the top of the page, clicking on any of the section nav pills will cause the page to scroll to the target section, but the top portion of the section (including the title and tag) will be covered by the fixed header. Adding a scroll margin top (scroll-mt-24) to the section elements resolves this overlap issue.

Suggested change
<section key={section.id} id={section.id}>
<section key={section.id} id={section.id} className="scroll-mt-24">

Comment on lines +169 to +175
<span
style={{
WebkitBackgroundClip: 'text',
WebkitTextFillColor: 'transparent',
backgroundImage: 'linear-gradient(135deg, #6af2de 0%, #14b8a6 100%)',
}}
>transparent</span>

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.

medium

Using inline styles for static gradients in a Tailwind CSS project reduces maintainability and consistency. This inline style can be fully replaced with standard Tailwind CSS gradient and text clipping utility classes.

          <span className="bg-gradient-to-br from-[#6af2de] to-[#14b8a6] bg-clip-text text-transparent">transparent</span>
References
  1. Tailwind CSS is specified as the styling framework for the project. Inline styles should be avoided in favor of Tailwind utility classes to maintain styling consistency and keep the codebase clean. (link)

Comment on lines +37 to +41
<div
className="w-8 h-8 rounded-lg flex items-center justify-center transition-transform duration-200 group-hover:scale-105"
style={{ border: '2px solid #6af2de', color: '#6af2de' }}
aria-hidden
>

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.

medium

The inline styles for the logo border and text color can be fully replaced with Tailwind CSS classes using arbitrary values (border-2 border-[#6af2de] text-[#6af2de]). This avoids inline styles and maintains consistency with the rest of the Tailwind-based styling.

Suggested change
<div
className="w-8 h-8 rounded-lg flex items-center justify-center transition-transform duration-200 group-hover:scale-105"
style={{ border: '2px solid #6af2de', color: '#6af2de' }}
aria-hidden
>
<div
className="w-8 h-8 rounded-lg flex items-center justify-center border-2 border-[#6af2de] text-[#6af2de] transition-transform duration-200 group-hover:scale-105"
aria-hidden
>
References
  1. Tailwind CSS is specified as the styling framework for the project. Inline styles should be avoided in favor of Tailwind utility classes to maintain styling consistency and keep the codebase clean. (link)

Comment on lines 8 to 13
const NAV_LINKS = [
{ href: '#features', label: 'Features' },
{ href: '#workflow', label: 'Workflow' },
{ href: '#templates', label: 'Templates' },
{ href: '#contact', label: 'Contact' },
{ href: '/#features', label: 'Features', page: '/features' },
{ href: '/#workflow', label: 'How it works' },
{ href: '/pricing', label: 'Pricing', page: '/pricing' },
{ href: '/#contact', label: 'Contact' },
];

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.

medium

Since Commit 1 introduces a dedicated, fully refactored /features page, the 'Features' link in the main navigation should point directly to /features instead of the home page anchor /#features. This ensures a consistent user experience across pages.

Suggested change
const NAV_LINKS = [
{ href: '#features', label: 'Features' },
{ href: '#workflow', label: 'Workflow' },
{ href: '#templates', label: 'Templates' },
{ href: '#contact', label: 'Contact' },
{ href: '/#features', label: 'Features', page: '/features' },
{ href: '/#workflow', label: 'How it works' },
{ href: '/pricing', label: 'Pricing', page: '/pricing' },
{ href: '/#contact', label: 'Contact' },
];
const NAV_LINKS = [
{ href: '/features', label: 'Features', page: '/features' },
{ href: '/#workflow', label: 'How it works' },
{ href: '/pricing', label: 'Pricing', page: '/pricing' },
{ href: '/#contact', label: 'Contact' },
];

groupthinking added a commit that referenced this pull request May 27, 2026
* chore: trigger uvai.io production deploy

* feat: UVAI UI/UX full refactor — features page, pricing, Nav, LandingNav (#205)

Zero emoji, real product mockups per feature section, SVG icons everywhere, LandingNav with proper cross-page routing and active states.

Co-authored-by: v0[bot] <v0[bot]@users.noreply.github.com>

* test: improve test coverage, fix Vercel build, dashboard auto-select, E2E resilience (#206)

- 155 new unit tests (middleware, API models, error handling)
- Fix Vercel ERESOLVE build failure via .npmrc legacy-peer-deps
- Fix dashboard ?video= URL param auto-select (issue #159)
- Fix next.config.js duplicate redirects/headers
- Fix CI test dependency installation for Python 3.12
- Make SSE stream always emit terminal pipeline_status event
- Make E2E tests resilient to live server degraded mode
- Replace banned dQw4w9WgXcQ video ID with auJzb1D-fag throughout

* fix: remove hardcoded Grok API key (#194)

🎯 What: Removed the hardcoded fallback value for the GROK_API_KEY in TriModelConsensusTool.
⚠️ Risk: Hardcoded API keys in source code can be exploited if the codebase is exposed or leaked, leading to unauthorized API access, quota exhaustion, and potential financial loss.
🛡️ Solution: Removed the hardcoded string so the tool relies strictly on the environment variable, aligning with secure configuration management practices.

Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com>

* feat(web): add privacy/terms/api-docs/app/login routes; noindex prototype pages (#204)

Resolves 404s on /privacy, /terms, /api/docs, /app, /login and ensures
/prototype carries a noindex robots tag. Scope is intentionally narrow and
does not overlap PR #202 (assets, robots, sitemap, JSON-LD, a11y).

- /privacy, /terms: server-rendered legal placeholder pages with proper
  metadata, canonical URLs, and footer links. Plain-language, startup-
  friendly; will be replaced before enterprise contracts.
- /api/docs: human-readable reference matching the documentation pointer
  returned by /api JSON. Lists actual /api/* routes that exist in code.
- /app, /login: server redirects to /dashboard, marked noindex. UVAI has
  no auth gate today, so this matches actual product behavior.
- /prototype: adds a route layout with robots.index=false because the
  underlying page is an internal prototype spec, not a public surface.
- LandingFooter: surfaces Privacy and Terms links now that the pages
  exist.

Build: next build succeeds, 25 routes generated. Type-check and ESLint clean.

Co-authored-by: Claude <claude@anthropic.com>
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>

* test: add unit tests for DatabaseOptimizer._calculate_performance_grade (#182)

Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com>

* fix(security): SECRET_KEY, CORS wildcard, SQL injection, command injection (#207)

Resolves conflicts manually — the conflicting hunks were all in tests/e2e/pipeline.test.ts
and .github/workflows/e2e-tests.yml which were already fixed better in #206.
The security-relevant changes are applied cleanly:

- code_generator.py (#193): replace hardcoded SECRET_KEY with os.getenv/secrets.token_urlsafe
- code_generator.py (#195): restrict CORS allow_origins from ["*"] to localhost origins
- real_api_endpoints.py (#196): read ALLOWED_ORIGINS from env; default to localhost origins
- database_cleanup_service.py (#197): validate table name with regex before SQL use;
  quote safe_table_name with double quotes for PRAGMA and DELETE statements
- deployment_manager.py (#200): add path traversal guard (resolve + is_dir check);
  add --ignore-scripts to npm install; use resolved_path for all cwd args
- tests/unit/test_database_cleanup_security.py: new unit tests for SQL injection prevention

Closes #193 #195 #196 #197 #200

https://claude.ai/code/session_01AgA9F82EwazbdB5R2f9nsd

Co-authored-by: Claude <noreply@anthropic.com>

* chore: move legacy .agent content under .github (#162)

* chore: move legacy agent files into .github

Agent-Logs-Url: https://github.com/groupthinking/EventRelay/sessions/8e79c6e5-9755-40a2-b8b0-73b9ff75249e

Co-authored-by: groupthinking <154503486+groupthinking@users.noreply.github.com>

* docs: fix relocated agent references

Agent-Logs-Url: https://github.com/groupthinking/EventRelay/sessions/8e79c6e5-9755-40a2-b8b0-73b9ff75249e

Co-authored-by: groupthinking <154503486+groupthinking@users.noreply.github.com>

* docs: remove vague agent rule reference

Agent-Logs-Url: https://github.com/groupthinking/EventRelay/sessions/8e79c6e5-9755-40a2-b8b0-73b9ff75249e

Co-authored-by: groupthinking <154503486+groupthinking@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: groupthinking <154503486+groupthinking@users.noreply.github.com>

* chore(web): UVAI Phase 1 — SEO, a11y, missing static assets

Live uvai.io referenced /favicon.ico, /icon.svg, /apple-touch-icon.png but
apps/web/public/ did not exist in the repo, producing 404s. Layout metadata
also pointed metadataBase and og.url at the legacy v0-uvai.vercel.app host
rather than the canonical uvai.io domain.

Changes:
- Add apps/web/public with favicon.ico (multi-res), icon.svg, apple-touch-icon.png,
  og-image.png (1200x630), manifest.json, robots.txt.
- Add apps/web/src/app/sitemap.ts (Next.js Metadata Route sitemap).
- layout.tsx: metadataBase + og.url -> https://uvai.io, add alternates.canonical,
  inject Organization/WebSite/SoftwareApplication JSON-LD, add skip-to-main link.
- page.tsx: <main id=\"main\"> as skip-link target.
- LandingNav.tsx: aria-label=\"Primary\" on nav, aria-labels on brand + GitHub
  external link, visible focus rings on all interactive elements.
- HeroSection.tsx: focus rings on CTAs, honor prefers-reduced-motion for marquee.
- Add CHANGELOG.md with timestamped entry.

Local verification:
- npx eslint on touched files: clean
- npm run build (apps/web): success, /sitemap.xml route generated, TypeScript clean

No production / deploy / DNS / secret changes.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* chore(web): PR #202 review fixes — no dangerouslySetInnerHTML, MD022, skip-link in layout, central SITE_URL

Addresses code review feedback on PR #202.

1. layout.tsx: replace dangerouslySetInnerHTML JSON-LD with React
   <script>{jsonLdString}</script> children. jsonLdString escapes
   `<` -> `<` to prevent any nested `</script>` breakout. Build
   verified: rendered HTML contains exactly one valid JSON-LD block.
   Complies with repo policy that forbids dangerouslySetInnerHTML.

2. CHANGELOG.md: markdownlint MD022 — blank lines after `#### Added`,
   `### Changed`, and `### Notes / known follow-ups (not in this change)`.

3. Skip-to-main-content target moved from `apps/web/src/app/page.tsx`'s
   <main> to the root layout's content wrapper. The link now works on
   every route (dashboard, pricing, features, playground, prototype,
   not-found), not just the homepage. Duplicate `id="main"` removed
   from page.tsx — rendered HTML on `/` now contains exactly one
   `id="main"`.

4. Add apps/web/src/lib/site.ts exporting SITE_URL = 'https://uvai.io'.
   layout.tsx (metadataBase, alternates.canonical, og.url, JSON-LD URLs)
   and sitemap.ts both consume it. Pricing/playground references kept
   as-is — those are mailto: addresses and api.uvai.io examples in
   code samples, not the same axis as the site origin.

Failing CI check (E2E Pipeline Tests) is unrelated to this PR:
- E2E runs vitest against BASE_URL=https://uvai.io (the live deployment)
- Live root returns 200 but is stale (title still "UVAI — Video to Software")
- This PR touches zero files under tests/e2e/, src/youtube_extension/,
  or apps/web/src/app/api/
- Resolution requires a redeploy of the current main, which is outside
  this PR's scope per the original instructions

Local verification:
- npx eslint on touched files: clean (exit 0)
- npm run build (apps/web): ✓ Compiled, TypeScript clean, 21 pages
- Rendered HTML inspection: JSON-LD block present and well-formed;
  id="main" present on /, /pricing, /features, /dashboard, /playground;
  exactly one id="main" on each prerendered page (no duplicates)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

---------

Co-authored-by: v0[bot] <v0[bot]@users.noreply.github.com>
Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com>
Co-authored-by: Claude <claude@anthropic.com>
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com>
Co-authored-by: Claude Code <claude-code@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant