Skip to content

feat(frontend): marketing landing page - #654

Merged
LucasSantana-Dev merged 6 commits into
mainfrom
feature/landing-page
Apr 16, 2026
Merged

LucasSantana-Dev merged 6 commits into
mainfrom
feature/landing-page

Conversation

@LucasSantana-Dev

@LucasSantana-Dev LucasSantana-Dev commented Apr 15, 2026 •

Copy link
Copy Markdown
Owner

Implements Phases 1-6 of .claude/plans/landing-page.md — hero, feature grid, stats strip (placeholder), FAQ, footer, SEO meta. Existing login moved to /login.

Changes

  • Phase 1: Route split — / → Landing, /login → Login, updated App.tsx redirect logic
  • Phase 2: Hero section with dark gradient, purple/indigo accents, CTAs (Add to Discord, Open Dashboard)
  • Phase 3: Feature grid with 6 cards (Music, Auto-mod, Custom Commands, Dashboard, Embed Builder, Artist Preferences)
  • Phase 4: Stats strip (placeholder hardcoded: 50+ servers, 10k+ tracks, 99.9% uptime)
  • Phase 5: FAQ accordion (6 questions) + footer with links
  • Phase 6: SEO meta tags (title, description, OG tags, Twitter card, JSON-LD SoftwareApplication schema)

Testing

  • Build: ✓ npm run build
  • Tests: ✓ 530 passed (updated App.authRoutes.test.tsx for new routing)
  • Mobile responsive (dark theme, purple/indigo accents match dashboard)

Summary by CodeRabbit

  • New Features

    • Public landing page at / with product overview, feature highlights, FAQ, stats, and Discord bot invite; “Open Dashboard” button to sign in.
    • Explicit /login route for unauthenticated access.
    • Updated page title, description, Open Graph/Twitter metadata and JSON-LD for richer sharing/previews.
  • Tests

    • Expanded tests covering auth routing, landing page UI/behavior, loader during auth checks, and legal page access.

@vercel

vercel Bot commented Apr 15, 2026 •

Copy link
Copy Markdown
Contributor

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

Project Deployment Actions Updated (UTC)
lucky Ready Ready Preview, Comment Apr 16, 2026 4:02pm

Request Review

@LucasSantana-Dev
LucasSantana-Dev enabled auto-merge (squash) April 15, 2026 23:53
@coderabbitai

coderabbitai Bot commented Apr 15, 2026 •

Copy link
Copy Markdown

Warning

Rate limit exceeded

@LucasSantana-Dev has exceeded the limit for the number of commits that can be reviewed per hour. Please wait 47 minutes and 14 seconds before requesting another review.

Your organization is not enrolled in usage-based pricing. Contact your admin to enable usage-based pricing to continue reviews beyond the rate limit, or try again in 47 minutes and 14 seconds.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: ed6e72d6-44aa-40ff-acd1-06e8f22b5b35

📥 Commits

Reviewing files that changed from the base of the PR and between 303e845 and 00298b7.

📒 Files selected for processing (3)
  • packages/frontend/index.html
  • packages/frontend/src/App.authRoutes.test.tsx
  • packages/frontend/src/pages/Landing.tsx
📝 Walkthrough

Walkthrough

Adds a new unauthenticated Landing page served at /, updates routing to add an explicit /login route, enriches HTML metadata in index.html, and introduces comprehensive tests covering routing and the new Landing UI and behaviors.

Changes

Cohort / File(s) Summary
HTML Metadata
packages/frontend/index.html
Replaced <title> and added meta description, Open Graph, Twitter Card tags, and JSON-LD SoftwareApplication schema for share/SEO metadata.
Landing Page
packages/frontend/src/pages/Landing.tsx, packages/frontend/src/pages/Landing.test.tsx
New Landing React component (hero, CTA buttons, feature grid, stats, FAQ, footer). Integrates with useAuthStore for login and opens Discord OAuth in a new tab. Comprehensive unit tests verify rendering, interactions, links, and metadata calls.
Routing & Auth Tests
packages/frontend/src/App.tsx, packages/frontend/src/App.authRoutes.test.tsx
Routing updated: lazy-loaded Landing at /, explicit /login for LoginPage. Auth-route tests expanded to assert Landing rendering for unauthenticated flows, authenticated layout rendering, loading state, and legal-route behavior.

Sequence Diagram(s)

sequenceDiagram
  autonumber
  participant User as User (Browser)
  participant Router as Router
  participant Landing as Landing Component
  participant Auth as Auth Store
  participant OAuth as Discord OAuth (External)
  participant Meta as Page Metadata

  rect rgba(100,149,237,0.5)
    User->>Router: navigate to "/"
    Router->>Landing: render
    Landing->>Meta: usePageMetadata(title, description)
  end

  rect rgba(60,179,113,0.5)
    User->>Landing: click "Open Dashboard"
    Landing->>Auth: call login()
    Auth-->>Router: set authenticated -> navigate to app layout
  end

  rect rgba(255,165,0,0.5)
    User->>Landing: click "Add to Discord"
    Landing->>OAuth: window.open(oauthAuthorizeUrl)
  end
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title 'feat(frontend): marketing landing page' directly and accurately describes the main change—implementing a new marketing landing page in the frontend.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feature/landing-page

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 and usage tips.

@github-actions

github-actions Bot commented Apr 15, 2026 •

Copy link
Copy Markdown

Size Change: +2.8 kB (+0.85%)

Total Size: 333 kB

📦 View Changed
Filename Size Change
packages/frontend/dist/assets/index-BGOPVClQ.css 0 B -14.8 kB (removed) 🏆
packages/frontend/dist/assets/index-Bxa6kgeV.js 0 B -11.9 kB (removed) 🏆
packages/frontend/dist/assets/index-CLMjjSb8.css 15.4 kB +15.4 kB (new file) 🆕
packages/frontend/dist/assets/index-ClUA_J_T.js 11.9 kB +11.9 kB (new file) 🆕
packages/frontend/dist/assets/Landing-BbFpXC19.js 2.21 kB +2.21 kB (new file) 🆕
packages/frontend/dist/assets/LastFm-B3lGYALN.js 0 B -1.74 kB (removed) 🏆
packages/frontend/dist/assets/LastFm-BWyHZkBM.js 1.74 kB +1.74 kB (new file) 🆕
packages/frontend/dist/assets/Levels-Do79jmsP.js 2.65 kB +2.65 kB (new file) 🆕
packages/frontend/dist/assets/Levels-DqImChfS.js 0 B -2.65 kB (removed) 🏆
packages/frontend/dist/assets/Login-CuNSCN8Y.js 0 B -2.54 kB (removed) 🏆
packages/frontend/dist/assets/Login-DBb9ERYE.js 2.54 kB +2.54 kB (new file) 🆕
packages/frontend/dist/assets/Lyrics-DHvUld3W.js 1.34 kB +1.34 kB (new file) 🆕
packages/frontend/dist/assets/Lyrics-DU05ma4X.js 0 B -1.33 kB (removed) 🏆
packages/frontend/dist/assets/Moderation-CcKBlpcd.js 3.86 kB +3.86 kB (new file) 🆕
packages/frontend/dist/assets/Moderation-CXgDBdaa.js 0 B -3.86 kB (removed) 🏆
packages/frontend/dist/assets/Music-Bo98MjSQ.js 0 B -6.19 kB (removed) 🏆
packages/frontend/dist/assets/Music-D-_nhui0.js 6.19 kB +6.19 kB (new file) 🆕
packages/frontend/dist/assets/PreferredArtists-BO6PLjul.js 3.54 kB +3.54 kB (new file) 🆕
packages/frontend/dist/assets/PreferredArtists-jGWOtf4Y.js 0 B -3.54 kB (removed) 🏆
packages/frontend/dist/assets/PrivacyPolicy-CxciQwB_.js 1.38 kB +1.38 kB (new file) 🆕
packages/frontend/dist/assets/PrivacyPolicy-D6bsnWOd.js 0 B -1.38 kB (removed) 🏆
packages/frontend/dist/assets/ReactionRoles-DiKv4vO2.js 1.91 kB +1.91 kB (new file) 🆕
packages/frontend/dist/assets/ReactionRoles-DiLP2-h3.js 0 B -1.9 kB (removed) 🏆
packages/frontend/dist/assets/ServerLogs-CEqN3x4v.js 0 B -2.91 kB (removed) 🏆
packages/frontend/dist/assets/ServerLogs-DVqrk_Nd.js 2.91 kB +2.91 kB (new file) 🆕
packages/frontend/dist/assets/ServerSettings-B-ZEPbNH.js 4.21 kB +4.21 kB (new file) 🆕
packages/frontend/dist/assets/ServerSettings-D_L3CD_I.js 0 B -4.21 kB (removed) 🏆
packages/frontend/dist/assets/ServersPage-C8WysKZY.js 2.96 kB +2.96 kB (new file) 🆕
packages/frontend/dist/assets/ServersPage-CBnChwdY.js 0 B -2.95 kB (removed) 🏆
packages/frontend/dist/assets/Spotify-9FKXkZeC.js 1.75 kB +1.75 kB (new file) 🆕
packages/frontend/dist/assets/Spotify-DLPyglVm.js 0 B -1.75 kB (removed) 🏆
packages/frontend/dist/assets/Starboard-BYAYgIoT.js 2.1 kB +2.1 kB (new file) 🆕
packages/frontend/dist/assets/Starboard-s3gYSCGj.js 0 B -2.1 kB (removed) 🏆
packages/frontend/dist/assets/TermsOfService-B5dZHvi1.js 0 B -1.37 kB (removed) 🏆
packages/frontend/dist/assets/TermsOfService-rj3qloRR.js 1.36 kB +1.36 kB (new file) 🆕
packages/frontend/dist/assets/TrackHistory-CIf9eKp3.js 0 B -2.18 kB (removed) 🏆
packages/frontend/dist/assets/TrackHistory-DYBYt6wE.js 2.18 kB +2.18 kB (new file) 🆕
packages/frontend/dist/assets/TwitchNotifications-BBG6jI0C.js 0 B -2.44 kB (removed) 🏆
packages/frontend/dist/assets/TwitchNotifications-C_Ya4YRf.js 2.44 kB +2.44 kB (new file) 🆕
ℹ️ View Unchanged
Filename Size
packages/frontend/dist/assets/ActionPanel-DxbYjZOV.js 400 B
packages/frontend/dist/assets/api-H186oZXk.js 3.33 kB
packages/frontend/dist/assets/authStore-tSKkRBou.js 559 B
packages/frontend/dist/assets/AutoMessages-CYmuG5IF.js 2.69 kB
packages/frontend/dist/assets/AutoMod-vIE5u-ti.js 4.09 kB
packages/frontend/dist/assets/avatar-B8wmY8_z.js 1.79 kB
packages/frontend/dist/assets/badge-Di6G1o1C.js 498 B
packages/frontend/dist/assets/Button-DNJBdlDI.js 761 B
packages/frontend/dist/assets/Card-BZdEz3Em.js 456 B
packages/frontend/dist/assets/chunk-QFMPRPBF-B0_TipZB.js 14.8 kB
packages/frontend/dist/assets/CommandsConfig-tl3v4ZyO.js 1.48 kB
packages/frontend/dist/assets/Config-DG7Q7nNU.js 1.74 kB
packages/frontend/dist/assets/CustomCommands-D-naimKu.js 2.15 kB
packages/frontend/dist/assets/DashboardOverview-hpzvoZFu.js 3.43 kB
packages/frontend/dist/assets/dialog-nNJN7xxV.js 947 B
packages/frontend/dist/assets/dist-BYvsGl5s.js 414 B
packages/frontend/dist/assets/EmbedBuilder-DZq8cuuv.js 3.36 kB
packages/frontend/dist/assets/EmptyState-SHSbVkpR.js 430 B
packages/frontend/dist/assets/Features-CnVQcHmk.js 2.86 kB
packages/frontend/dist/assets/GuildAutomation-JSNooz4w.js 2.94 kB
packages/frontend/dist/assets/guildStore-BlNqzL3F.js 795 B
packages/frontend/dist/assets/input-ChG24niz.js 463 B
packages/frontend/dist/assets/label-q_xFnvVW.js 485 B
packages/frontend/dist/assets/MusicConfig-D4Y24JVs.js 1.62 kB
packages/frontend/dist/assets/rbac-BN1DzQHh.js 152 B
packages/frontend/dist/assets/rolldown-runtime-COnpUsM8.js 467 B
packages/frontend/dist/assets/scroll-area-C108baTt.js 519 B
packages/frontend/dist/assets/SectionHeader-CQJKLDod.js 383 B
packages/frontend/dist/assets/select-DphAEnHz.js 1.22 kB
packages/frontend/dist/assets/Skeleton-C5XSiOK9.js 235 B
packages/frontend/dist/assets/StatTile-BL59Oosl.js 603 B
packages/frontend/dist/assets/switch-C3IautHz.js 541 B
packages/frontend/dist/assets/useGuildSelection-CQhZakkP.js 490 B
packages/frontend/dist/assets/usePageMetadata-B513X5D1.js 328 B
packages/frontend/dist/assets/utils-DhIi5ktf.js 147 B
packages/frontend/dist/assets/vendor-forms-B7m4p2yU.js 25.4 kB
packages/frontend/dist/assets/vendor-radix-CqxcePto.js 33.5 kB
packages/frontend/dist/assets/vendor-react-DRFstzzV.js 55.6 kB
packages/frontend/dist/assets/vendor-state-C5KtdxzA.js 22.2 kB
packages/frontend/dist/assets/vendor-ui-DqvmPbZd.js 64.4 kB

compressed-size-action

coderabbitai[bot]
coderabbitai Bot previously requested changes Apr 16, 2026

@coderabbitai coderabbitai 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.

Actionable comments posted: 5

🧹 Nitpick comments (3)
packages/frontend/src/App.authRoutes.test.tsx (1)

334-342: Duplicate test cases.

  • Lines 334-342 (renders landing page for unauthenticated / with verified content) duplicates lines 125-130 with only a redundant toBeVisible() check.
  • Lines 370-376 (/login route is accessible when unauthenticated) duplicates lines 132-137 exactly.

Consider removing the duplicates or consolidating into single, more comprehensive tests.

Also applies to: 370-376

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@packages/frontend/src/App.authRoutes.test.tsx` around lines 334 - 342, The
test suite contains duplicate tests: remove or consolidate the redundant test
titled "renders landing page for unauthenticated / with verified content" (lines
duplicating the earlier test that checks the landing heading and its visibility)
and the duplicate "/login route is accessible when unauthenticated" test; locate
the duplicate test blocks by their test names in App.authRoutes.test.tsx and
either delete the later duplicates or merge assertions (e.g., keep one "renders
landing page..." test that asserts presence and visibility and one "/login route
is accessible..." test) to avoid repeated coverage.
packages/frontend/src/pages/Landing.test.tsx (1)

37-46: Test for reduced motion doesn't verify actual behavior difference.

Since the implementation in Landing.tsx has identical containerClass for both motion preference values, this test only verifies the component renders — not that reduced motion is actually handled. Either update the test when the feature is implemented, or remove it until then.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@packages/frontend/src/pages/Landing.test.tsx` around lines 37 - 46, The test
"respects prefers-reduced-motion preference" in Landing.test.tsx is not
asserting any behavioral difference because Landing.tsx currently uses the same
containerClass for both motion preferences; either update the test to assert the
actual reduced-motion behavior once Landing.tsx implements it (e.g., assert
different class name or presence/absence of motion-related attribute/state) or
remove/skip this test until the feature exists; locate the test by its title and
the Landing component reference and adjust or remove the test accordingly so it
verifies a real difference rather than only rendering.
packages/frontend/src/pages/Landing.tsx (1)

6-7: Hardcoded CLIENT_ID and overly broad permissions=8 (Administrator).

  1. The Discord Client ID should be sourced from environment configuration rather than hardcoded, to support different environments (dev/staging/prod).
  2. permissions=8 grants Administrator, which is far broader than necessary for music/moderation features. Consider requesting only the specific permissions needed.
Proposed fix
-const CLIENT_ID = '999088926074396732'
-const BOT_INVITE_URL = `https://discord.com/oauth2/authorize?client_id=${CLIENT_ID}&scope=bot%20applications.commands&permissions=8`
+const CLIENT_ID = import.meta.env.VITE_DISCORD_CLIENT_ID ?? '999088926074396732'
+// Consider reducing permissions to only what's needed (e.g., SEND_MESSAGES, MANAGE_MESSAGES, CONNECT, SPEAK)
+const BOT_INVITE_URL = `https://discord.com/oauth2/authorize?client_id=${CLIENT_ID}&scope=bot%20applications.commands&permissions=8`
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@packages/frontend/src/pages/Landing.tsx` around lines 6 - 7, Replace the
hardcoded Discord client id and admin-permissions invite URL by reading
CLIENT_ID from configuration/env (replace the constant CLIENT_ID usage) and
build BOT_INVITE_URL using that env value; also change the permissions query
param on BOT_INVITE_URL from the broad "8" (Administrator) to a minimal
permission set required for your app (e.g., specific permission integers or a
computed permissions mask for bot actions like SEND_MESSAGES, CONNECT, SPEAK,
MANAGE_MESSAGES, etc.) so the invite only requests necessary scopes; update
references to CLIENT_ID and BOT_INVITE_URL in Landing.tsx to use the new
env/config variable and the narrower permissions string.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@packages/frontend/index.html`:
- Around line 37-41: The JSON-LD block contains a hardcoded "aggregateRating"
object (@"aggregateRating", "@type": "AggregateRating") with static values
("ratingValue": "4.8", "ratingCount": "50") which can be misleading; remove the
entire "aggregateRating" block from the JSON-LD in index.html (or replace it
with code that populates it dynamically from real review data) so schema only
exposes real ratings, ensuring you locate and modify the "aggregateRating"
object in the existing JSON-LD snippet.
- Line 14: Create the missing og-image.png asset in the frontend public assets
(recommended 1200×630px) and update the meta tags that reference it: replace the
meta property="og:image" and the meta name="twitter:image" values so they use an
absolute URL (e.g. https://your-domain.com/og-image.png) instead of a relative
path; ensure both meta tags point to the same absolute image URL and that the
file name is exactly og-image.png.

In `@packages/frontend/src/App.authRoutes.test.tsx`:
- Around line 362-368: Rename the test case whose title string currently reads
"redirects unauthenticated user accessing /dashboard to /login" to reflect the
actual behavior (e.g., "redirects unauthenticated user accessing /dashboard to
Landing Page") so the title matches the assertion that awaits
screen.findByRole('heading', { name: 'Landing Page' }) after calling
renderAt('/dashboard'); no other logic changes are required—just update the test
name text in the test definition.

In `@packages/frontend/src/pages/Landing.tsx`:
- Line 186: The "Terms of Service" anchor in the Landing component (the <a
href='/terms'> element) lacks the 'block' utility class causing inconsistent
vertical stacking with the other footer links; update that anchor's className to
include 'block' (e.g., change className='text-sm text-gray-400
hover:text-gray-200' to include 'block') so it matches the subsequent links'
styling.
- Around line 18-20: The prefersReducedMotion check in Landing.tsx is a no-op
because containerClass is assigned the same string in both ternary branches;
either remove the prefersReducedMotion hook and simplify containerClass to a
single constant, or implement the intended differentiation by returning a
different class when prefersReducedMotion is true (for example use a class that
disables animations like "no-anim" or omit animation-related classes) — update
the assignment of containerClass and any related CSS to reflect the chosen
behavior and remove unused prefersReducedMotion imports/variables if you
simplify.

---

Nitpick comments:
In `@packages/frontend/src/App.authRoutes.test.tsx`:
- Around line 334-342: The test suite contains duplicate tests: remove or
consolidate the redundant test titled "renders landing page for unauthenticated
/ with verified content" (lines duplicating the earlier test that checks the
landing heading and its visibility) and the duplicate "/login route is
accessible when unauthenticated" test; locate the duplicate test blocks by their
test names in App.authRoutes.test.tsx and either delete the later duplicates or
merge assertions (e.g., keep one "renders landing page..." test that asserts
presence and visibility and one "/login route is accessible..." test) to avoid
repeated coverage.

In `@packages/frontend/src/pages/Landing.test.tsx`:
- Around line 37-46: The test "respects prefers-reduced-motion preference" in
Landing.test.tsx is not asserting any behavioral difference because Landing.tsx
currently uses the same containerClass for both motion preferences; either
update the test to assert the actual reduced-motion behavior once Landing.tsx
implements it (e.g., assert different class name or presence/absence of
motion-related attribute/state) or remove/skip this test until the feature
exists; locate the test by its title and the Landing component reference and
adjust or remove the test accordingly so it verifies a real difference rather
than only rendering.

In `@packages/frontend/src/pages/Landing.tsx`:
- Around line 6-7: Replace the hardcoded Discord client id and admin-permissions
invite URL by reading CLIENT_ID from configuration/env (replace the constant
CLIENT_ID usage) and build BOT_INVITE_URL using that env value; also change the
permissions query param on BOT_INVITE_URL from the broad "8" (Administrator) to
a minimal permission set required for your app (e.g., specific permission
integers or a computed permissions mask for bot actions like SEND_MESSAGES,
CONNECT, SPEAK, MANAGE_MESSAGES, etc.) so the invite only requests necessary
scopes; update references to CLIENT_ID and BOT_INVITE_URL in Landing.tsx to use
the new env/config variable and the narrower permissions string.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 9c9ddc93-a284-4c1c-a556-b43c722f5ef5

📥 Commits

Reviewing files that changed from the base of the PR and between 9699b19 and e00e82b.

⛔ Files ignored due to path filters (1)
  • package-lock.json is excluded by !**/package-lock.json
📒 Files selected for processing (5)
  • packages/frontend/index.html
  • packages/frontend/src/App.authRoutes.test.tsx
  • packages/frontend/src/App.tsx
  • packages/frontend/src/pages/Landing.test.tsx
  • packages/frontend/src/pages/Landing.tsx
📜 Review details
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (3)
  • GitHub Check: Quality Gates
  • GitHub Check: compressed-size
  • GitHub Check: SonarCloud Scan
🔇 Additional comments (8)
packages/frontend/src/App.tsx (2)

20-21: LGTM!

The lazy import for LandingPage is correctly added alongside other lazy-loaded pages.


269-276: LGTM!

The unauthenticated routing structure is clean and correct:

  • / serves the new Landing page
  • /login provides explicit access to the login page
  • Wildcard redirects to / for unknown routes
packages/frontend/src/pages/Landing.tsx (1)

109-127: Stats strip uses hardcoded placeholder values.

Per the PR description, this is Phase 4 placeholder data. Consider adding a comment or TODO indicating these should be fetched dynamically in a future iteration.

packages/frontend/src/App.authRoutes.test.tsx (2)

19-21: LGTM!

Landing page mock correctly added to support the new routing tests.


125-154: LGTM!

Good coverage for:

  • Unauthenticated root route rendering Landing
  • Login route accessibility
  • Auth check rejection gracefully falling back to Landing
  • Unauthenticated access to authenticated routes redirecting to Landing
  • Auth check errors during initialization

Also applies to: 378-400

packages/frontend/src/pages/Landing.test.tsx (3)

167-184: LGTM!

Good test coverage for the "Add to Discord" button behavior, correctly spying on window.open and verifying the OAuth URL is called.


186-206: LGTM!

Proper testing of the login CTA and page metadata initialization. Good use of userEvent for simulating user interaction.


48-134: LGTM!

Comprehensive test coverage for:

  • Hero section with headline and CTA buttons
  • Feature grid with all 6 feature cards
  • Stats strip counters
  • FAQ accordion structure and content

Comment thread packages/frontend/index.html Outdated
Comment thread packages/frontend/index.html Outdated
Comment thread packages/frontend/src/App.authRoutes.test.tsx Outdated
Comment thread packages/frontend/src/pages/Landing.tsx Outdated
Comment thread packages/frontend/src/pages/Landing.tsx Outdated
@sonarqubecloud

Copy link
Copy Markdown

@LucasSantana-Dev
LucasSantana-Dev merged commit 4247c30 into main Apr 16, 2026
13 checks passed
LucasSantana-Dev added a commit that referenced this pull request May 13, 2026
* feat(frontend): marketing landing page at /

* test: add comprehensive Landing page and routing tests for SonarCloud coverage

* fix: cast checkAuth mock to Promise<void> type

* fix(landing): remove dead ternary, add animated gradient for non-reduced-motion

* fix(landing): address coderabbit review (drop fake rating, og fallback, footer class, test rename)

This branch was successfully deployed

1 active deployment
Preview — 00298b79 Deployed Apr 16, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dependencies Pull requests that update a dependency file frontend size/xl

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant