Skip to content

Conversation

@MananTank
Copy link
Member

@MananTank MananTank commented Sep 3, 2025


PR-Codex overview

This PR introduces new OverviewPage components across various sections of the application, enhancing the presentation of feature cards related to AI, wallets, transactions, contracts, payments, insight, and account abstractions. It also refines styles and structure for better usability.

Detailed summary

  • Updated PromptInput styles in chat-container.tsx.
  • Added new OverviewPage components in:
    • page.tsx for AI, tokens, contracts, payments, wallets, transactions, and account abstraction.
  • Introduced FeatureCard and FeatureSection components for feature presentation.
  • Enhanced navigation links with new "Overview" entries.
  • Refactored the main Page component to utilize FeatureSection for better organization.

✨ Ask PR-Codex anything about this PR by commenting with /codex {your question}

Summary by CodeRabbit

  • New Features
    • Added overview pages: AI, Wallets, Headless Components, Transactions, Contracts, Payments, Tokens, Account Abstraction.
    • Introduced reusable OverviewPage and FeatureCard components.
    • Centralized feature-card metadata for multiple categories (AI, wallets, transactions, contracts, payments, insight, account abstractions, tokens, headless).
    • Updated sidebar to add Overview entries and renamed “AI SDK” → “AI SDK Integration”.
  • Refactor
    • Home page rewritten to a data-driven layout using shared components and metadata.
  • Style
    • Tweaked AI chat input borders and top-edge rounding.

@vercel
Copy link

vercel bot commented Sep 3, 2025

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

Project Deployment Preview Comments Updated (UTC)
thirdweb_playground Ready Ready Preview Comment Sep 4, 2025 6:08pm
4 Skipped Deployments
Project Deployment Preview Comments Updated (UTC)
docs-v2 Skipped Skipped Sep 4, 2025 6:08pm
nebula Skipped Skipped Sep 4, 2025 6:08pm
thirdweb-www Skipped Skipped Sep 4, 2025 6:08pm
wallet-ui Skipped Skipped Sep 4, 2025 6:08pm

@vercel vercel bot temporarily deployed to Preview – wallet-ui September 3, 2025 19:10 Inactive
@vercel vercel bot temporarily deployed to Preview – nebula September 3, 2025 19:10 Inactive
@vercel vercel bot temporarily deployed to Preview – docs-v2 September 3, 2025 19:10 Inactive
@vercel vercel bot temporarily deployed to Preview – thirdweb-www September 3, 2025 19:10 Inactive
@linear
Copy link

linear bot commented Sep 3, 2025

@changeset-bot
Copy link

changeset-bot bot commented Sep 3, 2025

⚠️ No Changeset found

Latest commit: 488a3af

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Sep 3, 2025

Note

Other AI code review bot(s) detected

CodeRabbit has detected other AI code review bot(s) in this pull request and will avoid duplicating their findings in the review comments. This may lead to a less comprehensive review.

Walkthrough

Adds centralized feature-card metadata, reusable OverviewPage and FeatureCard components, metadata-driven home and multiple new section overview pages with navigation updates, plus a small styling tweak to the AI chat input.

Changes

Cohort / File(s) Summary
Overview pages
apps/playground-web/src/app/ai/page.tsx, apps/playground-web/src/app/wallets/page.tsx, apps/playground-web/src/app/wallets/headless/page.tsx, apps/playground-web/src/app/contracts/page.tsx, apps/playground-web/src/app/tokens/page.tsx, apps/playground-web/src/app/payments/page.tsx, apps/playground-web/src/app/transactions/page.tsx, apps/playground-web/src/app/account-abstraction/page.tsx
New Next.js App Router pages exporting default Page that render OverviewPage with section-specific icon, title, description, and featureCards.
Shared UI components
apps/playground-web/src/components/blocks/OverviewPage.tsx, apps/playground-web/src/components/blocks/FeatureCard.tsx
New reusable OverviewPage and FeatureCard components with typed props; OverviewPage maps metadata to FeatureCard instances.
Feature metadata
apps/playground-web/src/app/data/pages-metadata.ts
New FeatureCardMetadata type and exported arrays: walletsFeatureCards, headlessComponentsFeatureCards, transactionsFeatureCards, contractsFeatureCards, paymentsFeatureCards, insightFeatureCards, accountAbstractionsFeatureCards, tokensFeatureCards, aiFeatureCards.
Home page refactor
apps/playground-web/src/app/page.tsx
Replaced hard-coded sections with a data-driven FeatureSection component that renders responsive grids of FeatureCards (slices to 6 cards per section) sourced from metadata.
Navigation updates
apps/playground-web/src/app/navLinks.ts
Added “Overview” links to multiple submenus (AI, Wallets, Headless, Contracts, Tokens, Account Abstraction, Payments, Transactions) and renamed “AI SDK” to “AI SDK Integration”.
AI chat CSS tweak
apps/playground-web/src/app/ai/ai-sdk/components/chat-container.tsx
Minor PromptInput className changes (border-x-0, border-b-0, rounded-t-none) adjusting input border/rounded styling.

Sequence Diagram(s)

sequenceDiagram
  autonumber
  participant User
  participant Router
  participant OverviewPage
  participant FeatureCard
  User->>Router: Navigate to /{section} (e.g., /wallets or /ai)
  Router->>OverviewPage: Render(icon, title, description, featureCards)
  OverviewPage->>FeatureCard: map featureCards -> render each card
  FeatureCard->>User: Display card with Link (href)
  User->>FeatureCard: Click card -> Router navigate to card.link
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Assessment against linked issues

Objective Addressed Explanation
Add overview pages for each section in playground (MNY-106)

Assessment against linked issues: Out-of-scope changes

Code Change Explanation
PromptInput CSS class adjustments (apps/playground-web/src/app/ai/ai-sdk/components/chat-container.tsx) Styling tweak unrelated to adding overview pages (MNY-106); changes only affect chat input classes.

Warning

Review ran into problems

🔥 Problems

Errors were encountered while retrieving linked issues.

Errors (1)
  • TEAM-0000: Entity not found: Issue - Could not find referenced Issue.
✨ Finishing Touches
  • 📝 Generate Docstrings
🧪 Generate unit tests
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch 09-04-_mny-106_playground_add_overview_pages_for_all_sections_in_sidebar

🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.

Support

Need help? Create a ticket on our support page for assistance with any issues or questions.

CodeRabbit Commands (Invoked using PR/Issue comments)

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

Other keywords and placeholders

  • Add @coderabbitai ignore or @coderabbit ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Status, Documentation and Community

  • Visit our Status Page to check the current availability of CodeRabbit.
  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

@MananTank MananTank marked this pull request as ready for review September 3, 2025 19:10
@MananTank MananTank requested review from a team as code owners September 3, 2025 19:10
@github-actions github-actions bot added the Playground Changes involving the Playground codebase. label Sep 3, 2025
Copy link
Member Author

MananTank commented Sep 3, 2025


How to use the Graphite Merge Queue

Add either label to this PR to merge it via the merge queue:

  • merge-queue - adds this PR to the back of the merge queue
  • hotfix - for urgent hot fixes, skip the queue and merge this PR next

You must have a Graphite account in order to use the merge queue. Sign up using this link.

An organization admin has enabled the Graphite Merge Queue in this repository.

Please do not merge from GitHub as this will restart CI on PRs being processed by the merge queue.

This stack of pull requests is managed by Graphite. Learn more about stacking.

@MananTank MananTank force-pushed the 09-04-_mny-106_playground_add_overview_pages_for_all_sections_in_sidebar branch from 4d34610 to 31a3f1b Compare September 3, 2025 19:12
@vercel vercel bot temporarily deployed to Preview – docs-v2 September 3, 2025 19:12 Inactive
@vercel vercel bot temporarily deployed to Preview – thirdweb-www September 3, 2025 19:12 Inactive
@vercel vercel bot temporarily deployed to Preview – wallet-ui September 3, 2025 19:12 Inactive
@vercel vercel bot temporarily deployed to Preview – nebula September 3, 2025 19:12 Inactive
@codecov
Copy link

codecov bot commented Sep 3, 2025

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 56.53%. Comparing base (8a29e36) to head (488a3af).
⚠️ Report is 1 commits behind head on main.

Additional details and impacted files
@@           Coverage Diff           @@
##             main    #7977   +/-   ##
=======================================
  Coverage   56.53%   56.53%           
=======================================
  Files         904      904           
  Lines       58626    58626           
  Branches     4146     4146           
=======================================
  Hits        33145    33145           
  Misses      25375    25375           
  Partials      106      106           
Flag Coverage Δ
packages 56.53% <ø> (ø)
🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@github-actions
Copy link
Contributor

github-actions bot commented Sep 3, 2025

size-limit report 📦

Path Size Loading time (3g) Running time (snapdragon) Total time
thirdweb (esm) 64.01 KB (0%) 1.3 s (0%) 266 ms (+130.43% 🔺) 1.6 s
thirdweb (cjs) 357.32 KB (0%) 7.2 s (0%) 891 ms (-2.64% 🔽) 8.1 s
thirdweb (minimal + tree-shaking) 5.73 KB (0%) 115 ms (0%) 90 ms (+1193.79% 🔺) 205 ms
thirdweb/chains (tree-shaking) 526 B (0%) 11 ms (0%) 45 ms (+2236.85% 🔺) 55 ms
thirdweb/react (minimal + tree-shaking) 19.15 KB (0%) 383 ms (0%) 53 ms (+225.29% 🔺) 436 ms

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

♻️ Duplicate comments (1)
apps/playground-web/src/app/data/pages-metadata.ts (1)

90-96: Differentiate Account vs Wallet component descriptions.

This mirrors a prior suggestion; applying it improves clarity.

   {
     icon: CircleUserIcon,
     title: "Account Components",
     link: "/wallets/headless/account-components",
-    description: "Components for rendering various wallet related information",
+    description: "Components for rendering user account information and account-related functionality",
   },
🧹 Nitpick comments (32)
apps/playground-web/src/app/ai/ai-sdk/components/chat-container.tsx (4)

99-99: Remove stray console.log.

Avoid shipping debug logs in the UI bundle.

-                        console.log("---sign_swap", part);

180-183: Use Tailwind classes instead of inline styles.

Repo guideline: Tailwind only; no inline styles in these apps.

-      <TransactionButton
-        style={{
-          width: "100%",
-        }}
+      <TransactionButton
+        className="w-full"

(repeat the same change for the second TransactionButton)

Also applies to: 251-253


202-205: Resolve tool call on errors to prevent stuck conversations.

If the AI runtime expects a tool result (success or error), also call addToolResult on failure so lastAssistantMessageIsCompleteWithToolCalls can progress.

-        onError={(error) => {
-          sendMessage({ text: `Transaction failed: ${error.message}` });
-        }}
+        onError={(error) => {
+          // mark tool call as completed with an error payload
+          addToolResult({
+            tool: "sign_transaction",
+            toolCallId,
+            output: { error: String(error?.message || error) },
+          });
+          sendMessage({ text: `Transaction failed: ${error.message}` });
+        }}
-        onError={(error) => {
-          sendMessage({ text: `Transaction failed: ${error.message}` });
-        }}
+        onError={(error) => {
+          addToolResult({
+            tool: "sign_swap",
+            toolCallId,
+            output: { error: String(error?.message || error) },
+          });
+          sendMessage({ text: `Transaction failed: ${error.message}` });
+        }}

Also applies to: 273-276


36-36: Add explicit return types to exported components.

Keeps TS intent clear and matches repo guideline for explicit returns.

-export function ChatContainer() {
+export function ChatContainer(): JSX.Element {
-const SignTransactionButton = (props: SignTransactionButtonProps) => {
+const SignTransactionButton = (props: SignTransactionButtonProps): JSX.Element => {
-const SignSwapButton = (props: SignSwapButtonProps) => {
+const SignSwapButton = (props: SignSwapButtonProps): JSX.Element => {

Also applies to: 156-156, 225-225

apps/playground-web/src/components/blocks/FeatureCard.tsx (3)

3-8: Define and export a named props type.

Improves reuse and discoverability across OverviewPage and other callers.

-export function FeatureCard(props: {
-  title: string;
-  description: string;
-  icon: React.FC<{ className?: string }>;
-  href: string;
-}) {
+export type FeatureCardProps = {
+  title: string;
+  description: string;
+  icon: React.FC<{ className?: string }>;
+  href: string;
+};
+
+export function FeatureCard(props: FeatureCardProps): JSX.Element {

10-24: Make the whole card a semantic link (optional).

Wrapping the card with Link improves focus/hover states and a11y versus a pseudo-element overlay.

-  return (
-    <div className="rounded-xl border bg-card p-4 hover:border-active-border relative">
+  return (
+    <Link href={props.href} className="block rounded-xl border bg-card p-4 hover:border-active-border focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring">
       <div className="flex mb-4">
         <div className="p-2 rounded-full border bg-background">
           <props.icon className="size-4 text-muted-foreground" />
         </div>
       </div>
       <h3 className="font-medium mb-0.5 text-lg tracking-tight">
-        <Link className="before:absolute before:inset-0" href={props.href}>
-          {props.title}
-        </Link>
+        {props.title}
       </h3>
       <p className="text-sm text-muted-foreground text-pretty">
         {props.description}
       </p>
-    </div>
+    </Link>
   );

1-1: Use NavLink for internal navigation
Swap the Link import in FeatureCard.tsx to the app’s NavLink component for internal routes to ensure consistent active-state behavior.

- import Link from "next/link";
+ import { NavLink } from "@/components/ui/NavLink";
apps/playground-web/src/app/tokens/page.tsx (2)

1-1: Mark as a Server Component.

Add the sentinel import to prevent accidental client-only deps.

+import "server-only";
 import { OverviewPage } from "@/components/blocks/OverviewPage";

5-14: Add explicit return type to the page component.

Aligns with repo’s TS guideline.

-export default function Page() {
+export default function Page(): JSX.Element {
apps/playground-web/src/app/wallets/headless/page.tsx (2)

1-1: Mark as a Server Component.

+import "server-only";
 import { BoxIcon } from "lucide-react";

5-14: Add explicit return type to the page component.

-export default function Page() {
+export default function Page(): JSX.Element {
apps/playground-web/src/app/contracts/page.tsx (2)

1-1: Mark as a Server Component.

+import "server-only";
 import { OverviewPage } from "@/components/blocks/OverviewPage";

5-14: Add explicit return type to the page component.

-export default function Page() {
+export default function Page(): JSX.Element {
apps/playground-web/src/app/ai/page.tsx (2)

5-5: Add explicit return type to align with TS guidelines

Annotate the component’s return type.

-export default function Page() {
+export default function Page(): JSX.Element {

3-3: Use path alias for consistency and resilience

Prefer "@/app/..." over relative path.

-import { aiFeatureCards } from "../data/pages-metadata";
+import { aiFeatureCards } from "@/app/data/pages-metadata";
apps/playground-web/src/app/account-abstraction/page.tsx (3)

5-5: Add explicit return type

Keep page components explicitly typed.

-export default function Page() {
+export default function Page(): JSX.Element {

2-3: Prefer alias imports over relative paths

Unify to "@/..." like other files.

-import { SmartAccountIcon } from "../../icons/SmartAccountIcon";
-import { accountAbstractionsFeatureCards } from "../data/pages-metadata";
+import { SmartAccountIcon } from "@/icons/SmartAccountIcon";
+import { accountAbstractionsFeatureCards } from "@/app/data/pages-metadata";

12-14: Nit: spell out EIPs consistently

Minor copy edit for clarity.

-          utilizing EIP-4337 and 7702 specs
+          utilizing EIP-4337 and EIP-7702 specs
apps/playground-web/src/app/wallets/page.tsx (2)

5-5: Add explicit return type

Annotate return type per codebase guidelines.

-export default function Page() {
+export default function Page(): JSX.Element {

2-3: Use "@/..." aliases for imports

Align with other pages for consistency.

-import { WalletProductIcon } from "../../icons/WalletProductIcon";
-import { walletsFeatureCards } from "../data/pages-metadata";
+import { WalletProductIcon } from "@/icons/WalletProductIcon";
+import { walletsFeatureCards } from "@/app/data/pages-metadata";
apps/playground-web/src/app/payments/page.tsx (2)

5-5: Add explicit return type

Annotate the component’s return type.

-export default function Page() {
+export default function Page(): JSX.Element {

2-3: Switch to alias imports

Consistent with project import style.

-import { PayIcon } from "../../icons/PayIcon";
-import { paymentsFeatureCards } from "../data/pages-metadata";
+import { PayIcon } from "@/icons/PayIcon";
+import { paymentsFeatureCards } from "@/app/data/pages-metadata";
apps/playground-web/src/app/transactions/page.tsx (2)

2-3: Unify to alias imports

Avoid brittle relative paths.

-import { OverviewPage } from "../../components/blocks/OverviewPage";
-import { transactionsFeatureCards } from "../data/pages-metadata";
+import { OverviewPage } from "@/components/blocks/OverviewPage";
+import { transactionsFeatureCards } from "@/app/data/pages-metadata";

5-5: Add explicit return type

Type the page component.

-export default function Page() {
+export default function Page(): JSX.Element {
apps/playground-web/src/components/blocks/OverviewPage.tsx (3)

4-9: Add explicit return type to comply with TS/TSX guidelines.

Declare the component’s return type.

-export function OverviewPage(props: {
+export function OverviewPage(props: {
   featureCards: FeatureCardMetadata[];
   title: string;
   description: React.ReactNode;
   icon: React.FC<{ className?: string }>;
-}) {
+}): JSX.Element {

28-35: Use a stable, unique key.

Titles can collide; the link is unique per card.

-          <FeatureCard
-            key={card.title}
+          <FeatureCard
+            key={card.link}
             description={card.description}
             href={card.link}
             icon={card.icon}
             title={card.title}
           />

15-17: Mark decorative icon as hidden from assistive tech.

Prevents noise for screen readers.

-              <props.icon className="size-6 text-muted-foreground" />
+              <props.icon aria-hidden="true" className="size-6 text-muted-foreground" />
apps/playground-web/src/app/data/pages-metadata.ts (2)

149-153: Normalize casing: “Pre-built Extensions” (match nav).

Keeps titles consistent across UI.

-    title: "Pre-Built Extensions",
+    title: "Pre-built Extensions",

110-117: Polish grammar for Airdrop description.

Small readability tweak.

-      "Airdrop any token with a few lines of code with gas sponsorship, optional.",
+      "Airdrop any token with a few lines of code, with optional gas sponsorship.",
apps/playground-web/src/app/page.tsx (3)

13-16: Mark as server-only per guideline.

This page is server by default; add the directive.

+import "server-only";
 import { FeatureCard } from "@/components/blocks/FeatureCard";
 import { ThirdwebIcon } from "../icons/ThirdwebMiniLogo";

13-15: Add explicit return type to Page().

Aligns with the TS guideline.

-export default function Page() {
+export default function Page(): JSX.Element {

59-62: Add explicit return type to FeatureSection and consider extracting it.

Keeps this file single‑responsibility and typed.

-function FeatureSection(props: {
+function FeatureSection(props: {
   featureCards: FeatureCardMetadata[];
   title: string;
-}) {
+}): JSX.Element {

If preferred, move FeatureSection to apps/playground-web/src/components/blocks/FeatureSection.tsx and export it there.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

💡 Knowledge Base configuration:

  • MCP integration is disabled by default for public repositories
  • Jira integration is disabled by default for public repositories
  • Linear integration is disabled by default for public repositories

You can enable these sources in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between dbb2614 and 31a3f1b.

📒 Files selected for processing (14)
  • apps/playground-web/src/app/account-abstraction/page.tsx (1 hunks)
  • apps/playground-web/src/app/ai/ai-sdk/components/chat-container.tsx (1 hunks)
  • apps/playground-web/src/app/ai/page.tsx (1 hunks)
  • apps/playground-web/src/app/contracts/page.tsx (1 hunks)
  • apps/playground-web/src/app/data/pages-metadata.ts (1 hunks)
  • apps/playground-web/src/app/navLinks.ts (8 hunks)
  • apps/playground-web/src/app/page.tsx (2 hunks)
  • apps/playground-web/src/app/payments/page.tsx (1 hunks)
  • apps/playground-web/src/app/tokens/page.tsx (1 hunks)
  • apps/playground-web/src/app/transactions/page.tsx (1 hunks)
  • apps/playground-web/src/app/wallets/headless/page.tsx (1 hunks)
  • apps/playground-web/src/app/wallets/page.tsx (1 hunks)
  • apps/playground-web/src/components/blocks/FeatureCard.tsx (1 hunks)
  • apps/playground-web/src/components/blocks/OverviewPage.tsx (1 hunks)
🧰 Additional context used
📓 Path-based instructions (3)
**/*.{ts,tsx}

📄 CodeRabbit inference engine (CLAUDE.md)

**/*.{ts,tsx}: Write idiomatic TypeScript with explicit function declarations and return types
Limit each file to one stateless, single-responsibility function for clarity
Re-use shared types from @/types or local types.ts barrels
Prefer type aliases over interface except for nominal shapes
Avoid any and unknown unless unavoidable; narrow generics when possible
Choose composition over inheritance; leverage utility types (Partial, Pick, etc.)
Comment only ambiguous logic; avoid restating TypeScript in prose

**/*.{ts,tsx}: Use explicit function declarations and explicit return types in TypeScript
Limit each file to one stateless, single‑responsibility function
Re‑use shared types from @/types where applicable
Prefer type aliases over interface except for nominal shapes
Avoid any and unknown unless unavoidable; narrow generics when possible
Prefer composition over inheritance; use utility types (Partial, Pick, etc.)
Lazy‑import optional features and avoid top‑level side‑effects to reduce bundle size

Files:

  • apps/playground-web/src/app/wallets/page.tsx
  • apps/playground-web/src/app/ai/ai-sdk/components/chat-container.tsx
  • apps/playground-web/src/app/contracts/page.tsx
  • apps/playground-web/src/app/wallets/headless/page.tsx
  • apps/playground-web/src/components/blocks/OverviewPage.tsx
  • apps/playground-web/src/app/transactions/page.tsx
  • apps/playground-web/src/app/payments/page.tsx
  • apps/playground-web/src/app/tokens/page.tsx
  • apps/playground-web/src/app/account-abstraction/page.tsx
  • apps/playground-web/src/app/ai/page.tsx
  • apps/playground-web/src/components/blocks/FeatureCard.tsx
  • apps/playground-web/src/app/navLinks.ts
  • apps/playground-web/src/app/data/pages-metadata.ts
  • apps/playground-web/src/app/page.tsx
**/*.{ts,tsx,js,jsx}

📄 CodeRabbit inference engine (CLAUDE.md)

Load heavy dependencies inside async paths to keep initial bundle lean (lazy loading)

Files:

  • apps/playground-web/src/app/wallets/page.tsx
  • apps/playground-web/src/app/ai/ai-sdk/components/chat-container.tsx
  • apps/playground-web/src/app/contracts/page.tsx
  • apps/playground-web/src/app/wallets/headless/page.tsx
  • apps/playground-web/src/components/blocks/OverviewPage.tsx
  • apps/playground-web/src/app/transactions/page.tsx
  • apps/playground-web/src/app/payments/page.tsx
  • apps/playground-web/src/app/tokens/page.tsx
  • apps/playground-web/src/app/account-abstraction/page.tsx
  • apps/playground-web/src/app/ai/page.tsx
  • apps/playground-web/src/components/blocks/FeatureCard.tsx
  • apps/playground-web/src/app/navLinks.ts
  • apps/playground-web/src/app/data/pages-metadata.ts
  • apps/playground-web/src/app/page.tsx
apps/{dashboard,playground-web}/**/*.{ts,tsx}

📄 CodeRabbit inference engine (CLAUDE.md)

apps/{dashboard,playground-web}/**/*.{ts,tsx}: Import UI primitives from @/components/ui/* (Button, Input, Select, Tabs, Card, Sidebar, Badge, Separator) in dashboard and playground apps
Use NavLink for internal navigation with automatic active states in dashboard and playground apps
Use Tailwind CSS only – no inline styles or CSS modules
Use cn() from @/lib/utils for conditional class logic
Use design system tokens (e.g., bg-card, border-border, text-muted-foreground)
Server Components (Node edge): Start files with import "server-only";
Client Components (browser): Begin files with 'use client';
Always call getAuthToken() to retrieve JWT from cookies on server side
Use Authorization: Bearer header – never embed tokens in URLs
Return typed results (e.g., Project[], User[]) – avoid any
Wrap client-side data fetching calls in React Query (@tanstack/react-query)
Use descriptive, stable queryKeys for React Query cache hits
Configure staleTime/cacheTime in React Query based on freshness (default ≥ 60s)
Keep tokens secret via internal API routes or server actions
Never import posthog-js in server components

Files:

  • apps/playground-web/src/app/wallets/page.tsx
  • apps/playground-web/src/app/ai/ai-sdk/components/chat-container.tsx
  • apps/playground-web/src/app/contracts/page.tsx
  • apps/playground-web/src/app/wallets/headless/page.tsx
  • apps/playground-web/src/components/blocks/OverviewPage.tsx
  • apps/playground-web/src/app/transactions/page.tsx
  • apps/playground-web/src/app/payments/page.tsx
  • apps/playground-web/src/app/tokens/page.tsx
  • apps/playground-web/src/app/account-abstraction/page.tsx
  • apps/playground-web/src/app/ai/page.tsx
  • apps/playground-web/src/components/blocks/FeatureCard.tsx
  • apps/playground-web/src/app/navLinks.ts
  • apps/playground-web/src/app/data/pages-metadata.ts
  • apps/playground-web/src/app/page.tsx
🧠 Learnings (9)
📚 Learning: 2025-08-29T23:44:47.512Z
Learnt from: MananTank
PR: thirdweb-dev/js#7951
File: apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/_layout/contract-page-layout.tsx:38-38
Timestamp: 2025-08-29T23:44:47.512Z
Learning: The ContractPageLayout component in apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/_layout/contract-page-layout.tsx is not the root layout - it's nested within the dashboard layout which already handles footer positioning with min-h-dvh and AppFooter placement. The ContractPageLayout needs flex flex-col grow to properly participate in the parent's flex layout.

Applied to files:

  • apps/playground-web/src/app/contracts/page.tsx
📚 Learning: 2025-07-18T19:19:55.613Z
Learnt from: CR
PR: thirdweb-dev/js#0
File: CLAUDE.md:0-0
Timestamp: 2025-07-18T19:19:55.613Z
Learning: Applies to apps/{dashboard,playground-web}/**/feature/components/** : Group feature-specific components under `feature/components/*` with barrel `index.ts`

Applied to files:

  • apps/playground-web/src/components/blocks/OverviewPage.tsx
  • apps/playground-web/src/components/blocks/FeatureCard.tsx
  • apps/playground-web/src/app/page.tsx
📚 Learning: 2025-08-20T10:35:18.543Z
Learnt from: jnsdls
PR: thirdweb-dev/js#7888
File: apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/payments/page.tsx:77-81
Timestamp: 2025-08-20T10:35:18.543Z
Learning: The webhooks/payments route exists at apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/webhooks/payments/page.tsx and was added as part of the unified project layout changes.

Applied to files:

  • apps/playground-web/src/app/payments/page.tsx
📚 Learning: 2025-08-20T10:35:18.543Z
Learnt from: jnsdls
PR: thirdweb-dev/js#7888
File: apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/payments/page.tsx:77-81
Timestamp: 2025-08-20T10:35:18.543Z
Learning: The webhooks/payments route exists at apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/webhooks/payments/page.tsx and was added as part of the unified project layout PR #7888.

Applied to files:

  • apps/playground-web/src/app/payments/page.tsx
📚 Learning: 2025-08-07T17:24:31.965Z
Learnt from: MananTank
PR: thirdweb-dev/js#7812
File: apps/dashboard/src/app/(app)/team/~/~project/[[...paths]]/page.tsx:1-11
Timestamp: 2025-08-07T17:24:31.965Z
Learning: In Next.js App Router, page components (page.tsx files) are server components by default and do not require the "server-only" import directive. The "server-only" directive is primarily used for utility functions, API helpers, and data access modules that should never be included in the client bundle.

Applied to files:

  • apps/playground-web/src/app/ai/page.tsx
📚 Learning: 2025-06-18T04:30:04.326Z
Learnt from: jnsdls
PR: thirdweb-dev/js#7365
File: apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/components/ProjectFTUX/ProjectFTUX.tsx:16-17
Timestamp: 2025-06-18T04:30:04.326Z
Learning: Next.js Link component fully supports both internal and external URLs and works appropriately with all standard anchor attributes including target="_blank", rel="noopener noreferrer", etc. Using Link for external URLs is completely appropriate and recommended.

Applied to files:

  • apps/playground-web/src/components/blocks/FeatureCard.tsx
📚 Learning: 2025-07-18T19:19:55.613Z
Learnt from: CR
PR: thirdweb-dev/js#0
File: CLAUDE.md:0-0
Timestamp: 2025-07-18T19:19:55.613Z
Learning: Applies to apps/{dashboard,playground-web}/**/*.{ts,tsx} : Use `NavLink` for internal navigation with automatic active states in dashboard and playground apps

Applied to files:

  • apps/playground-web/src/app/navLinks.ts
📚 Learning: 2025-08-07T20:43:21.864Z
Learnt from: MananTank
PR: thirdweb-dev/js#7812
File: apps/dashboard/src/app/(app)/(dashboard)/published-contract/components/token-banner.tsx:48-60
Timestamp: 2025-08-07T20:43:21.864Z
Learning: In the TokenBanner component at apps/dashboard/src/app/(app)/(dashboard)/published-contract/components/token-banner.tsx, the Link components use target="_blank" with internal application routes (starting with "/") to open pages in new tabs within the same application. These internal links do not require rel="noopener noreferrer" security attributes, which are only needed for external URLs.

Applied to files:

  • apps/playground-web/src/app/navLinks.ts
📚 Learning: 2025-07-18T19:20:32.530Z
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-07-18T19:20:32.530Z
Learning: Applies to dashboard/**/*.{tsx,jsx} : Icons come from `lucide-react` or the project-specific `…/icons` exports – never embed raw SVG.

Applied to files:

  • apps/playground-web/src/app/page.tsx
🧬 Code graph analysis (12)
apps/playground-web/src/app/wallets/page.tsx (2)
apps/playground-web/src/components/blocks/OverviewPage.tsx (1)
  • OverviewPage (4-40)
apps/playground-web/src/app/data/pages-metadata.ts (1)
  • walletsFeatureCards (36-87)
apps/playground-web/src/app/contracts/page.tsx (3)
apps/playground-web/src/components/blocks/OverviewPage.tsx (1)
  • OverviewPage (4-40)
apps/playground-web/src/app/data/pages-metadata.ts (1)
  • contractsFeatureCards (135-160)
apps/playground-web/src/icons/ContractIcon.tsx (1)
  • ContractIcon (1-21)
apps/playground-web/src/app/wallets/headless/page.tsx (2)
apps/playground-web/src/components/blocks/OverviewPage.tsx (1)
  • OverviewPage (4-40)
apps/playground-web/src/app/data/pages-metadata.ts (1)
  • headlessComponentsFeatureCards (89-108)
apps/playground-web/src/components/blocks/OverviewPage.tsx (2)
apps/playground-web/src/app/data/pages-metadata.ts (1)
  • FeatureCardMetadata (29-34)
apps/playground-web/src/components/blocks/FeatureCard.tsx (1)
  • FeatureCard (3-26)
apps/playground-web/src/app/transactions/page.tsx (2)
apps/playground-web/src/components/blocks/OverviewPage.tsx (1)
  • OverviewPage (4-40)
apps/playground-web/src/app/data/pages-metadata.ts (1)
  • transactionsFeatureCards (110-133)
apps/playground-web/src/app/payments/page.tsx (3)
apps/playground-web/src/components/blocks/OverviewPage.tsx (1)
  • OverviewPage (4-40)
apps/playground-web/src/icons/PayIcon.tsx (1)
  • PayIcon (1-21)
apps/playground-web/src/app/data/pages-metadata.ts (1)
  • paymentsFeatureCards (162-196)
apps/playground-web/src/app/tokens/page.tsx (2)
apps/playground-web/src/components/blocks/OverviewPage.tsx (1)
  • OverviewPage (4-40)
apps/playground-web/src/app/data/pages-metadata.ts (1)
  • tokensFeatureCards (268-282)
apps/playground-web/src/app/account-abstraction/page.tsx (3)
apps/playground-web/src/components/blocks/OverviewPage.tsx (1)
  • OverviewPage (4-40)
apps/playground-web/src/icons/SmartAccountIcon.tsx (1)
  • SmartAccountIcon (1-21)
apps/playground-web/src/app/data/pages-metadata.ts (1)
  • accountAbstractionsFeatureCards (238-266)
apps/playground-web/src/app/ai/page.tsx (2)
apps/playground-web/src/components/blocks/OverviewPage.tsx (1)
  • OverviewPage (4-40)
apps/playground-web/src/app/data/pages-metadata.ts (1)
  • aiFeatureCards (284-297)
apps/playground-web/src/components/blocks/FeatureCard.tsx (1)
packages/thirdweb/src/react/web/ui/components/text.tsx (1)
  • Link (44-62)
apps/playground-web/src/app/data/pages-metadata.ts (1)
apps/playground-web/src/icons/InsightIcon.tsx (1)
  • InsightIcon (1-21)
apps/playground-web/src/app/page.tsx (2)
apps/playground-web/src/app/data/pages-metadata.ts (7)
  • walletsFeatureCards (36-87)
  • transactionsFeatureCards (110-133)
  • contractsFeatureCards (135-160)
  • paymentsFeatureCards (162-196)
  • insightFeatureCards (198-236)
  • accountAbstractionsFeatureCards (238-266)
  • FeatureCardMetadata (29-34)
apps/playground-web/src/components/blocks/FeatureCard.tsx (1)
  • FeatureCard (3-26)
⏰ 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). (1)
  • GitHub Check: Size
🔇 Additional comments (8)
apps/playground-web/src/app/ai/ai-sdk/components/chat-container.tsx (1)

121-124: Styling tweak looks good.

The PromptInput border/rounding adjustments align with the parent bordered container and avoid double side/bottom borders.

apps/playground-web/src/app/ai/page.tsx (1)

7-17: LGTM: Clear composition with OverviewPage and metadata-driven cards

Matches the shared pattern and design tokens usage via the block component.

apps/playground-web/src/app/wallets/page.tsx (1)

7-17: LGTM

Good reuse of OverviewPage with walletsFeatureCards.

apps/playground-web/src/app/payments/page.tsx (1)

7-17: LGTM

Clear, concise Overview composition.

apps/playground-web/src/app/transactions/page.tsx (1)

7-12: LGTM

Consistent with the new metadata-driven pattern.

apps/playground-web/src/app/navLinks.ts (2)

19-23: LGTM: Overview entries added consistently across sections.

The structure and exactMatch usage look consistent with the new overview pages.

Also applies to: 41-45, 79-83, 107-111, 137-141, 159-163, 189-193, 223-227


19-23: All overview routes are present and export a default Page.

apps/playground-web/src/app/data/pages-metadata.ts (1)

51-56: Import and use SquircleDashed instead of SquircleDashedIcon
In apps/playground-web/src/app/data/pages-metadata.ts (lines 51–56), update the icon import and reference to match the exported component:

import { SquircleDashed } from "lucide-react";

  {
    icon: SquircleDashed,
    title: "Headless Connect",
    link: "/wallets/sign-in/headless",
    description: "Customizable wallet connection components using React hooks",
  },
⛔ Skipped due to learnings
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-07-18T19:20:32.530Z
Learning: Applies to dashboard/**/*.{tsx,jsx} : Icons come from `lucide-react` or the project-specific `…/icons` exports – never embed raw SVG.
Learnt from: saminacodes
PR: thirdweb-dev/js#7543
File: apps/portal/src/app/pay/page.mdx:4-4
Timestamp: 2025-07-07T21:21:47.488Z
Learning: In the thirdweb-dev/js repository, lucide-react icons must be imported with the "Icon" suffix (e.g., ExternalLinkIcon, RocketIcon) as required by the new linting rule, contrary to the typical lucide-react convention of importing without the suffix.
Learnt from: CR
PR: thirdweb-dev/js#0
File: CLAUDE.md:0-0
Timestamp: 2025-07-18T19:19:55.613Z
Learning: Applies to apps/{dashboard,playground-web}/**/*.{ts,tsx} : Import UI primitives from `@/components/ui/*` (Button, Input, Select, Tabs, Card, Sidebar, Badge, Separator) in dashboard and playground apps
Learnt from: CR
PR: thirdweb-dev/js#0
File: AGENTS.md:0-0
Timestamp: 2025-08-29T15:37:38.513Z
Learning: Applies to apps/{dashboard,playground}/**/*.{ts,tsx} : Import UI primitives from `@/components/ui/_` (e.g., Button, Input, Tabs, Card)
Learnt from: CR
PR: thirdweb-dev/js#0
File: CLAUDE.md:0-0
Timestamp: 2025-07-18T19:19:55.613Z
Learning: Applies to apps/{dashboard,playground-web}/**/*.{ts,tsx} : Use design system tokens (e.g., `bg-card`, `border-border`, `text-muted-foreground`)
Learnt from: CR
PR: thirdweb-dev/js#0
File: CLAUDE.md:0-0
Timestamp: 2025-07-18T19:19:55.613Z
Learning: Applies to apps/{dashboard,playground-web}/**/*.{ts,tsx} : Use `NavLink` for internal navigation with automatic active states in dashboard and playground apps
Learnt from: jnsdls
PR: thirdweb-dev/js#7888
File: apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/settings/wallets/page.tsx:1-1
Timestamp: 2025-08-20T10:37:10.123Z
Learning: In apps/dashboard, prefer importing UI components from "workspace/ui/components/*" where possible, as per jnsdls preference, rather than from "@/components/ui/*".
Learnt from: CR
PR: thirdweb-dev/js#0
File: AGENTS.md:0-0
Timestamp: 2025-08-29T15:37:38.513Z
Learning: Applies to apps/{dashboard,playground}/**/*.{ts,tsx} : Stick to design tokens (e.g., bg-card, border-border, text-muted-foreground)
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-07-18T19:20:32.530Z
Learning: Applies to dashboard/**/*.{tsx,jsx} : Prefer composable primitives over custom markup: `Button`, `Input`, `Select`, `Tabs`, `Card`, `Sidebar`, `Separator`, `Badge`.
Learnt from: CR
PR: thirdweb-dev/js#0
File: CLAUDE.md:0-0
Timestamp: 2025-07-18T19:19:55.613Z
Learning: Applies to apps/{dashboard,playground-web}/**/*.{ts,tsx} : Client Components (browser): Begin files with `'use client';`
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-07-18T19:20:32.530Z
Learning: Applies to dashboard/**/*client.tsx : Interactive UI that relies on hooks (`useState`, `useEffect`, React Query, wallet hooks).

@MananTank MananTank force-pushed the 09-04-_mny-106_playground_add_overview_pages_for_all_sections_in_sidebar branch from 31a3f1b to ed67ae9 Compare September 3, 2025 19:59
@vercel vercel bot temporarily deployed to Preview – docs-v2 September 3, 2025 19:59 Inactive
@vercel vercel bot temporarily deployed to Preview – wallet-ui September 3, 2025 19:59 Inactive
@vercel vercel bot temporarily deployed to Preview – thirdweb-www September 3, 2025 19:59 Inactive
@vercel vercel bot temporarily deployed to Preview – nebula September 3, 2025 19:59 Inactive
Copy link
Member

@joaquim-verges joaquim-verges left a comment

Choose a reason for hiding this comment

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

any way we can make the overview show up when clicking the category row instead of adding an overview entry to each section?

Copy link
Member

@joaquim-verges joaquim-verges left a comment

Choose a reason for hiding this comment

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

oh also @MananTank can you add an AI section in the main playground home page ? 🙏

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 3

🧹 Nitpick comments (3)
apps/playground-web/src/app/page.tsx (3)

39-53: Reduce duplication by mapping over a typed sections array

Drive these six sections from data to keep this file lean and consistent.

-        <FeatureSection featureCards={walletsFeatureCards} title="Wallets" />
-        <FeatureSection
-          featureCards={transactionsFeatureCards}
-          title="Transactions"
-        />
-        <FeatureSection
-          featureCards={contractsFeatureCards}
-          title="Contracts"
-        />
-        <FeatureSection featureCards={paymentsFeatureCards} title="Payments" />
-        <FeatureSection featureCards={insightFeatureCards} title="Insight" />
-        <FeatureSection
-          featureCards={accountAbstractionsFeatureCards}
-          title="Account Abstraction"
-        />
+        {sections.map((s) => (
+          <FeatureSection
+            key={s.title}
+            featureCards={s.cards}
+            title={s.title}
+          />
+        ))}

Add this just above the return inside Page:

const sections: ReadonlyArray<{ title: string; cards: FeatureCardMetadata[] }> = [
  { title: "Wallets", cards: walletsFeatureCards },
  { title: "Transactions", cards: transactionsFeatureCards },
  { title: "Contracts", cards: contractsFeatureCards },
  { title: "Payments", cards: paymentsFeatureCards },
  { title: "Insight", cards: insightFeatureCards },
  { title: "Account Abstraction", cards: accountAbstractionsFeatureCards },
];

59-81: Extract FeatureSection to a shared component and import it

One-component-per-file + reuse across overview pages.

Apply in this file:

+import { FeatureSection } from "@/components/blocks/FeatureSection";
@@
-function FeatureSection(props: {
-  featureCards: FeatureCardMetadata[];
-  title: string;
-}) {
-  return (
-    <section>
-      <h2 className="font-semibold text-xl text-foreground tracking-tight mb-2">
-        {props.title}
-      </h2>
-      <div className="grid gap-4 md:grid-cols-2 lg:grid-cols-3">
-        {props.featureCards.slice(0, 6).map((card) => (
-          <FeatureCard
-            key={card.title}
-            description={card.description}
-            href={card.link}
-            icon={card.icon}
-            title={card.title}
-          />
-        ))}
-      </div>
-    </section>
-  );
-}

New file: apps/playground-web/src/components/blocks/FeatureSection.tsx

import "server-only";
import { FeatureCard } from "@/components/blocks/FeatureCard";
import type { FeatureCardMetadata } from "@/app/data/pages-metadata";

export function FeatureSection(props: {
  featureCards: FeatureCardMetadata[];
  title: string;
  maxCards?: number;
}): JSX.Element {
  const { featureCards, title, maxCards = 6 } = props;
  return (
    <section>
      <h2 className="font-semibold text-xl text-foreground tracking-tight mb-2">
        {title}
      </h2>
      <div className="grid gap-4 md:grid-cols-2 lg:grid-cols-3">
        {featureCards.slice(0, maxCards).map((card) => (
          <FeatureCard
            key={card.link}
            description={card.description}
            href={card.link}
            icon={card.icon}
            title={card.title}
          />
        ))}
      </div>
    </section>
  );
}

Happy to open a follow-up PR if you want.


69-77: Use a stable, unique React key

title can change; link is more stable/unique.

-            key={card.title}
+            key={card.link}
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

💡 Knowledge Base configuration:

  • MCP integration is disabled by default for public repositories
  • Jira integration is disabled by default for public repositories
  • Linear integration is disabled by default for public repositories

You can enable these sources in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between 31a3f1b and ed67ae9.

📒 Files selected for processing (14)
  • apps/playground-web/src/app/account-abstraction/page.tsx (1 hunks)
  • apps/playground-web/src/app/ai/ai-sdk/components/chat-container.tsx (1 hunks)
  • apps/playground-web/src/app/ai/page.tsx (1 hunks)
  • apps/playground-web/src/app/contracts/page.tsx (1 hunks)
  • apps/playground-web/src/app/data/pages-metadata.ts (1 hunks)
  • apps/playground-web/src/app/navLinks.ts (8 hunks)
  • apps/playground-web/src/app/page.tsx (2 hunks)
  • apps/playground-web/src/app/payments/page.tsx (1 hunks)
  • apps/playground-web/src/app/tokens/page.tsx (1 hunks)
  • apps/playground-web/src/app/transactions/page.tsx (1 hunks)
  • apps/playground-web/src/app/wallets/headless/page.tsx (1 hunks)
  • apps/playground-web/src/app/wallets/page.tsx (1 hunks)
  • apps/playground-web/src/components/blocks/FeatureCard.tsx (1 hunks)
  • apps/playground-web/src/components/blocks/OverviewPage.tsx (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (13)
  • apps/playground-web/src/app/ai/ai-sdk/components/chat-container.tsx
  • apps/playground-web/src/app/transactions/page.tsx
  • apps/playground-web/src/app/data/pages-metadata.ts
  • apps/playground-web/src/components/blocks/FeatureCard.tsx
  • apps/playground-web/src/app/contracts/page.tsx
  • apps/playground-web/src/app/wallets/headless/page.tsx
  • apps/playground-web/src/components/blocks/OverviewPage.tsx
  • apps/playground-web/src/app/ai/page.tsx
  • apps/playground-web/src/app/account-abstraction/page.tsx
  • apps/playground-web/src/app/tokens/page.tsx
  • apps/playground-web/src/app/payments/page.tsx
  • apps/playground-web/src/app/wallets/page.tsx
  • apps/playground-web/src/app/navLinks.ts
🧰 Additional context used
📓 Path-based instructions (3)
**/*.{ts,tsx}

📄 CodeRabbit inference engine (CLAUDE.md)

**/*.{ts,tsx}: Write idiomatic TypeScript with explicit function declarations and return types
Limit each file to one stateless, single-responsibility function for clarity
Re-use shared types from @/types or local types.ts barrels
Prefer type aliases over interface except for nominal shapes
Avoid any and unknown unless unavoidable; narrow generics when possible
Choose composition over inheritance; leverage utility types (Partial, Pick, etc.)
Comment only ambiguous logic; avoid restating TypeScript in prose

**/*.{ts,tsx}: Use explicit function declarations and explicit return types in TypeScript
Limit each file to one stateless, single‑responsibility function
Re‑use shared types from @/types where applicable
Prefer type aliases over interface except for nominal shapes
Avoid any and unknown unless unavoidable; narrow generics when possible
Prefer composition over inheritance; use utility types (Partial, Pick, etc.)
Lazy‑import optional features and avoid top‑level side‑effects to reduce bundle size

Files:

  • apps/playground-web/src/app/page.tsx
**/*.{ts,tsx,js,jsx}

📄 CodeRabbit inference engine (CLAUDE.md)

Load heavy dependencies inside async paths to keep initial bundle lean (lazy loading)

Files:

  • apps/playground-web/src/app/page.tsx
apps/{dashboard,playground-web}/**/*.{ts,tsx}

📄 CodeRabbit inference engine (CLAUDE.md)

apps/{dashboard,playground-web}/**/*.{ts,tsx}: Import UI primitives from @/components/ui/* (Button, Input, Select, Tabs, Card, Sidebar, Badge, Separator) in dashboard and playground apps
Use NavLink for internal navigation with automatic active states in dashboard and playground apps
Use Tailwind CSS only – no inline styles or CSS modules
Use cn() from @/lib/utils for conditional class logic
Use design system tokens (e.g., bg-card, border-border, text-muted-foreground)
Server Components (Node edge): Start files with import "server-only";
Client Components (browser): Begin files with 'use client';
Always call getAuthToken() to retrieve JWT from cookies on server side
Use Authorization: Bearer header – never embed tokens in URLs
Return typed results (e.g., Project[], User[]) – avoid any
Wrap client-side data fetching calls in React Query (@tanstack/react-query)
Use descriptive, stable queryKeys for React Query cache hits
Configure staleTime/cacheTime in React Query based on freshness (default ≥ 60s)
Keep tokens secret via internal API routes or server actions
Never import posthog-js in server components

Files:

  • apps/playground-web/src/app/page.tsx
🧠 Learnings (1)
📚 Learning: 2025-07-18T19:20:32.530Z
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-07-18T19:20:32.530Z
Learning: Applies to dashboard/**/*.{tsx,jsx} : Icons come from `lucide-react` or the project-specific `…/icons` exports – never embed raw SVG.

Applied to files:

  • apps/playground-web/src/app/page.tsx
🧬 Code graph analysis (1)
apps/playground-web/src/app/page.tsx (2)
apps/playground-web/src/app/data/pages-metadata.ts (7)
  • walletsFeatureCards (36-87)
  • transactionsFeatureCards (110-133)
  • contractsFeatureCards (135-160)
  • paymentsFeatureCards (162-196)
  • insightFeatureCards (198-236)
  • accountAbstractionsFeatureCards (238-266)
  • FeatureCardMetadata (29-34)
apps/playground-web/src/components/blocks/FeatureCard.tsx (1)
  • FeatureCard (3-26)
⏰ 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). (7)
  • GitHub Check: E2E Tests (pnpm, vite)
  • GitHub Check: E2E Tests (pnpm, webpack)
  • GitHub Check: E2E Tests (pnpm, esbuild)
  • GitHub Check: Size
  • GitHub Check: Unit Tests
  • GitHub Check: Lint Packages
  • GitHub Check: Analyze (javascript)
🔇 Additional comments (1)
apps/playground-web/src/app/page.tsx (1)

64-68: LGTM: clear section heading semantics

Good use of h2 and design tokens.

@MananTank MananTank force-pushed the 09-04-_mny-106_playground_add_overview_pages_for_all_sections_in_sidebar branch from ed67ae9 to cd80067 Compare September 3, 2025 23:34
@vercel vercel bot temporarily deployed to Preview – nebula September 3, 2025 23:34 Inactive
@vercel vercel bot temporarily deployed to Preview – thirdweb-www September 3, 2025 23:34 Inactive
@vercel vercel bot temporarily deployed to Preview – wallet-ui September 3, 2025 23:34 Inactive
@vercel vercel bot temporarily deployed to Preview – docs-v2 September 3, 2025 23:34 Inactive
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

♻️ Duplicate comments (1)
apps/playground-web/src/app/page.tsx (1)

71-79: Ensure FeatureCard uses NavLink (repo guideline for internal nav).

FeatureCard currently imports Link from next/link; switch to NavLink for active-state handling.

Proposed change in apps/playground-web/src/components/blocks/FeatureCard.tsx:

-import Link from "next/link";
+import { NavLink } from "@/components/ui/NavLink";
@@
-      <h3 className="font-medium mb-0.5 text-lg tracking-tight">
-        <Link className="before:absolute before:inset-0" href={props.href}>
-          {props.title}
-        </Link>
-      </h3>
+      <h3 className="font-medium mb-0.5 text-lg tracking-tight">
+        <NavLink className="before:absolute before:inset-0" href={props.href}>
+          {props.title}
+        </NavLink>
+      </h3>
🧹 Nitpick comments (4)
apps/playground-web/src/app/page.tsx (4)

39-55: Deduplicate section rendering by mapping over a config array.

Minor readability/maintainability win and easier re-ordering.

Apply within this block:

-        <FeatureSection featureCards={aiFeatureCards} title="AI" />
-        <FeatureSection featureCards={walletsFeatureCards} title="Wallets" />
-        <FeatureSection
-          featureCards={transactionsFeatureCards}
-          title="Transactions"
-        />
-        <FeatureSection
-          featureCards={contractsFeatureCards}
-          title="Contracts"
-        />
-        <FeatureSection featureCards={paymentsFeatureCards} title="Payments" />
-        <FeatureSection featureCards={insightFeatureCards} title="Insight" />
-        <FeatureSection
-          featureCards={accountAbstractionsFeatureCards}
-          title="Account Abstraction"
-        />
+        {sections.map(({ title, cards }) => (
+          <FeatureSection key={title} featureCards={cards} title={title} />
+        ))}

Place this inside Page() before the return:

const sections = [
  { title: "AI", cards: aiFeatureCards },
  { title: "Wallets", cards: walletsFeatureCards },
  { title: "Transactions", cards: transactionsFeatureCards },
  { title: "Contracts", cards: contractsFeatureCards },
  { title: "Payments", cards: paymentsFeatureCards },
  { title: "Insight", cards: insightFeatureCards },
  { title: "Account Abstraction", cards: accountAbstractionsFeatureCards },
] as const;

71-79: Use a stable, unique React key.

card.title can collide; card.link is unique per item.

-          <FeatureCard
-            key={card.title}
+          <FeatureCard
+            key={card.link}
             description={card.description}
             href={card.link}
             icon={card.icon}
             title={card.title}
           />

71-72: Avoid the magic number; extract a constant.

Improves clarity and makes the limit easy to tweak.

-        {props.featureCards.slice(0, 6).map((card) => (
+        {props.featureCards.slice(0, CARDS_PER_SECTION).map((card) => (

Add near the top-level of this file (or alongside FeatureSection if extracted):

const CARDS_PER_SECTION = 6;

61-83: Extract FeatureSection into a reusable block component.

Keeps this page focused and makes the section reusable across the new overview pages introduced in this PR.

Remove this local component:

- function FeatureSection(props: {
-   featureCards: FeatureCardMetadata[];
-   title: string;
- }) {
-   return (
-     <section>
-       <h2 className="font-semibold text-xl text-foreground tracking-tight mb-2">
-         {props.title}
-       </h2>
-       <div className="grid gap-4 md:grid-cols-2 lg:grid-cols-3">
-         {props.featureCards.slice(0, 6).map((card) => (
-           <FeatureCard
-             key={card.title}
-             description={card.description}
-             href={card.link}
-             icon={card.icon}
-             title={card.title}
-           />
-         ))}
-       </div>
-     </section>
-   );
- }

Create apps/playground-web/src/components/blocks/FeatureSection.tsx:

import type { FeatureCardMetadata } from "@/app/data/pages-metadata";
import { FeatureCard } from "./FeatureCard";

type FeatureSectionProps = {
  featureCards: FeatureCardMetadata[];
  title: string;
};

export function FeatureSection({ featureCards, title }: FeatureSectionProps) {
  return (
    <section>
      <h2 className="font-semibold text-xl text-foreground tracking-tight mb-2">
        {title}
      </h2>
      <div className="grid gap-4 md:grid-cols-2 lg:grid-cols-3">
        {featureCards.slice(0, CARDS_PER_SECTION).map((card) => (
          <FeatureCard
            key={card.link}
            description={card.description}
            href={card.link}
            icon={card.icon}
            title={card.title}
          />
        ))}
      </div>
    </section>
  );
}

Then import it at the top of this page:

import { FeatureSection } from "@/components/blocks/FeatureSection";
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

💡 Knowledge Base configuration:

  • MCP integration is disabled by default for public repositories
  • Jira integration is disabled by default for public repositories
  • Linear integration is disabled by default for public repositories

You can enable these sources in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between ed67ae9 and cd80067.

📒 Files selected for processing (14)
  • apps/playground-web/src/app/account-abstraction/page.tsx (1 hunks)
  • apps/playground-web/src/app/ai/ai-sdk/components/chat-container.tsx (1 hunks)
  • apps/playground-web/src/app/ai/page.tsx (1 hunks)
  • apps/playground-web/src/app/contracts/page.tsx (1 hunks)
  • apps/playground-web/src/app/data/pages-metadata.ts (1 hunks)
  • apps/playground-web/src/app/navLinks.ts (8 hunks)
  • apps/playground-web/src/app/page.tsx (2 hunks)
  • apps/playground-web/src/app/payments/page.tsx (1 hunks)
  • apps/playground-web/src/app/tokens/page.tsx (1 hunks)
  • apps/playground-web/src/app/transactions/page.tsx (1 hunks)
  • apps/playground-web/src/app/wallets/headless/page.tsx (1 hunks)
  • apps/playground-web/src/app/wallets/page.tsx (1 hunks)
  • apps/playground-web/src/components/blocks/FeatureCard.tsx (1 hunks)
  • apps/playground-web/src/components/blocks/OverviewPage.tsx (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (13)
  • apps/playground-web/src/app/transactions/page.tsx
  • apps/playground-web/src/app/payments/page.tsx
  • apps/playground-web/src/app/account-abstraction/page.tsx
  • apps/playground-web/src/app/wallets/headless/page.tsx
  • apps/playground-web/src/app/wallets/page.tsx
  • apps/playground-web/src/app/data/pages-metadata.ts
  • apps/playground-web/src/app/contracts/page.tsx
  • apps/playground-web/src/app/tokens/page.tsx
  • apps/playground-web/src/components/blocks/FeatureCard.tsx
  • apps/playground-web/src/app/ai/ai-sdk/components/chat-container.tsx
  • apps/playground-web/src/app/ai/page.tsx
  • apps/playground-web/src/app/navLinks.ts
  • apps/playground-web/src/components/blocks/OverviewPage.tsx
🧰 Additional context used
📓 Path-based instructions (3)
**/*.{ts,tsx}

📄 CodeRabbit inference engine (CLAUDE.md)

**/*.{ts,tsx}: Write idiomatic TypeScript with explicit function declarations and return types
Limit each file to one stateless, single-responsibility function for clarity
Re-use shared types from @/types or local types.ts barrels
Prefer type aliases over interface except for nominal shapes
Avoid any and unknown unless unavoidable; narrow generics when possible
Choose composition over inheritance; leverage utility types (Partial, Pick, etc.)
Comment only ambiguous logic; avoid restating TypeScript in prose

**/*.{ts,tsx}: Use explicit function declarations and explicit return types in TypeScript
Limit each file to one stateless, single‑responsibility function
Re‑use shared types from @/types where applicable
Prefer type aliases over interface except for nominal shapes
Avoid any and unknown unless unavoidable; narrow generics when possible
Prefer composition over inheritance; use utility types (Partial, Pick, etc.)
Lazy‑import optional features and avoid top‑level side‑effects to reduce bundle size

Files:

  • apps/playground-web/src/app/page.tsx
**/*.{ts,tsx,js,jsx}

📄 CodeRabbit inference engine (CLAUDE.md)

Load heavy dependencies inside async paths to keep initial bundle lean (lazy loading)

Files:

  • apps/playground-web/src/app/page.tsx
apps/{dashboard,playground-web}/**/*.{ts,tsx}

📄 CodeRabbit inference engine (CLAUDE.md)

apps/{dashboard,playground-web}/**/*.{ts,tsx}: Import UI primitives from @/components/ui/* (Button, Input, Select, Tabs, Card, Sidebar, Badge, Separator) in dashboard and playground apps
Use NavLink for internal navigation with automatic active states in dashboard and playground apps
Use Tailwind CSS only – no inline styles or CSS modules
Use cn() from @/lib/utils for conditional class logic
Use design system tokens (e.g., bg-card, border-border, text-muted-foreground)
Server Components (Node edge): Start files with import "server-only";
Client Components (browser): Begin files with 'use client';
Always call getAuthToken() to retrieve JWT from cookies on server side
Use Authorization: Bearer header – never embed tokens in URLs
Return typed results (e.g., Project[], User[]) – avoid any
Wrap client-side data fetching calls in React Query (@tanstack/react-query)
Use descriptive, stable queryKeys for React Query cache hits
Configure staleTime/cacheTime in React Query based on freshness (default ≥ 60s)
Keep tokens secret via internal API routes or server actions
Never import posthog-js in server components

Files:

  • apps/playground-web/src/app/page.tsx
🧠 Learnings (16)
📚 Learning: 2025-07-18T19:19:55.613Z
Learnt from: CR
PR: thirdweb-dev/js#0
File: CLAUDE.md:0-0
Timestamp: 2025-07-18T19:19:55.613Z
Learning: Applies to apps/{dashboard,playground-web}/**/feature/components/** : Group feature-specific components under `feature/components/*` with barrel `index.ts`

Applied to files:

  • apps/playground-web/src/app/page.tsx
📚 Learning: 2025-08-29T15:37:38.513Z
Learnt from: CR
PR: thirdweb-dev/js#0
File: AGENTS.md:0-0
Timestamp: 2025-08-29T15:37:38.513Z
Learning: Applies to apps/{dashboard,playground}/**/*.{ts,tsx} : Server Components must start with `import "server-only"`; use `next/headers`, server‑only env, heavy data fetching, and `redirect()` where appropriate

Applied to files:

  • apps/playground-web/src/app/page.tsx
📚 Learning: 2025-08-07T17:24:31.965Z
Learnt from: MananTank
PR: thirdweb-dev/js#7812
File: apps/dashboard/src/app/(app)/team/~/~project/[[...paths]]/page.tsx:1-11
Timestamp: 2025-08-07T17:24:31.965Z
Learning: In Next.js App Router, page components (page.tsx files) are server components by default and do not require the "server-only" import directive. The "server-only" directive is primarily used for utility functions, API helpers, and data access modules that should never be included in the client bundle.

Applied to files:

  • apps/playground-web/src/app/page.tsx
📚 Learning: 2025-07-18T19:19:55.613Z
Learnt from: CR
PR: thirdweb-dev/js#0
File: CLAUDE.md:0-0
Timestamp: 2025-07-18T19:19:55.613Z
Learning: Applies to apps/{dashboard,playground-web}/**/*.{ts,tsx} : Server Components (Node edge): Start files with `import "server-only";`

Applied to files:

  • apps/playground-web/src/app/page.tsx
📚 Learning: 2025-05-26T16:29:54.317Z
Learnt from: MananTank
PR: thirdweb-dev/js#7152
File: apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/(marketplace)/direct-listings/shared-direct-listings-page.tsx:47-52
Timestamp: 2025-05-26T16:29:54.317Z
Learning: The `projectMeta` prop is not required for the server-rendered `ContractDirectListingsPage` component in the direct listings shared page, following the same pattern as other server components in the codebase where `projectMeta` is only needed for client components.

Applied to files:

  • apps/playground-web/src/app/page.tsx
📚 Learning: 2025-05-26T16:28:50.772Z
Learnt from: MananTank
PR: thirdweb-dev/js#7152
File: apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/tokens/shared-page.tsx:41-48
Timestamp: 2025-05-26T16:28:50.772Z
Learning: The `projectMeta` prop is not required for the server-rendered `ContractTokensPage` component in the tokens shared page, unlike some other shared pages where it's needed for consistency.

Applied to files:

  • apps/playground-web/src/app/page.tsx
📚 Learning: 2025-07-18T19:20:32.530Z
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-07-18T19:20:32.530Z
Learning: Applies to dashboard/**/*client.tsx : Interactive UI that relies on hooks (`useState`, `useEffect`, React Query, wallet hooks).

Applied to files:

  • apps/playground-web/src/app/page.tsx
📚 Learning: 2025-07-18T19:20:32.530Z
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-07-18T19:20:32.530Z
Learning: Applies to dashboard/**/*client.tsx : Pages requiring fast transitions where data is prefetched on the client.

Applied to files:

  • apps/playground-web/src/app/page.tsx
📚 Learning: 2025-09-03T23:35:50.455Z
Learnt from: MananTank
PR: thirdweb-dev/js#7977
File: apps/playground-web/src/app/page.tsx:61-65
Timestamp: 2025-09-03T23:35:50.455Z
Learning: In the thirdweb-dev/js codebase, specifically for React components in **/*.{ts,tsx} files, do not suggest adding explicit return types like `: JSX.Element` or `: React.ReactElement` to function components. The project maintainer MananTank has explicitly declined these suggestions.

Applied to files:

  • apps/playground-web/src/app/page.tsx
📚 Learning: 2025-08-29T15:37:38.513Z
Learnt from: CR
PR: thirdweb-dev/js#0
File: AGENTS.md:0-0
Timestamp: 2025-08-29T15:37:38.513Z
Learning: Applies to **/*.{ts,tsx} : Use explicit function declarations and explicit return types in TypeScript

Applied to files:

  • apps/playground-web/src/app/page.tsx
📚 Learning: 2025-07-18T19:19:55.613Z
Learnt from: CR
PR: thirdweb-dev/js#0
File: CLAUDE.md:0-0
Timestamp: 2025-07-18T19:19:55.613Z
Learning: Applies to **/*.{ts,tsx} : Write idiomatic TypeScript with explicit function declarations and return types

Applied to files:

  • apps/playground-web/src/app/page.tsx
📚 Learning: 2025-07-18T19:19:55.613Z
Learnt from: CR
PR: thirdweb-dev/js#0
File: CLAUDE.md:0-0
Timestamp: 2025-07-18T19:19:55.613Z
Learning: Applies to apps/{dashboard,playground-web}/**/*.{ts,tsx} : Use `NavLink` for internal navigation with automatic active states in dashboard and playground apps

Applied to files:

  • apps/playground-web/src/app/page.tsx
📚 Learning: 2025-08-29T15:37:38.513Z
Learnt from: CR
PR: thirdweb-dev/js#0
File: AGENTS.md:0-0
Timestamp: 2025-08-29T15:37:38.513Z
Learning: Applies to apps/{dashboard,playground}/**/*.{ts,tsx} : Use `NavLink` for internal navigation to get active state handling

Applied to files:

  • apps/playground-web/src/app/page.tsx
📚 Learning: 2025-07-18T19:20:32.530Z
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-07-18T19:20:32.530Z
Learning: Applies to dashboard/**/*.{tsx,jsx} : Use `NavLink` (`@/components/ui/NavLink`) for internal navigation so active states are handled automatically.

Applied to files:

  • apps/playground-web/src/app/page.tsx
📚 Learning: 2025-07-18T19:20:32.530Z
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-07-18T19:20:32.530Z
Learning: Applies to dashboard/**/*.{tsx,jsx} : Icons come from `lucide-react` or the project-specific `…/icons` exports – never embed raw SVG.

Applied to files:

  • apps/playground-web/src/app/page.tsx
📚 Learning: 2025-07-18T19:20:32.530Z
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-07-18T19:20:32.530Z
Learning: Applies to dashboard/**/layout.tsx : Building layout shells (`layout.tsx`) and top-level pages that mainly assemble data.

Applied to files:

  • apps/playground-web/src/app/page.tsx
🧬 Code graph analysis (1)
apps/playground-web/src/app/page.tsx (2)
apps/playground-web/src/app/data/pages-metadata.ts (8)
  • aiFeatureCards (284-297)
  • walletsFeatureCards (36-87)
  • transactionsFeatureCards (110-133)
  • contractsFeatureCards (135-160)
  • paymentsFeatureCards (162-196)
  • insightFeatureCards (198-236)
  • accountAbstractionsFeatureCards (238-266)
  • FeatureCardMetadata (29-34)
apps/playground-web/src/components/blocks/FeatureCard.tsx (1)
  • FeatureCard (3-26)
⏰ 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). (7)
  • GitHub Check: E2E Tests (pnpm, vite)
  • GitHub Check: E2E Tests (pnpm, webpack)
  • GitHub Check: E2E Tests (pnpm, esbuild)
  • GitHub Check: Size
  • GitHub Check: Unit Tests
  • GitHub Check: Lint Packages
  • GitHub Check: Analyze (javascript)
🔇 Additional comments (2)
apps/playground-web/src/app/page.tsx (2)

1-1: Keep page.tsx without server-only (App Router pages are server by default).

No need to add import "server-only"; here; maintainers have clarified it’s unnecessary for page.tsx. This is good as-is.


3-12: Type-only import is correct.

Using type import for FeatureCardMetadata keeps the client bundle lean and matches TS best practices.

@graphite-app
Copy link
Contributor

graphite-app bot commented Sep 4, 2025

Merge activity

…7977)

<!--

## title your PR with this format: "[SDK/Dashboard/Portal] Feature/Fix: Concise title for the changes"

If you did not copy the branch name from Linear, paste the issue tag here (format is TEAM-0000):

## Notes for the reviewer

Anything important to call out? Be sure to also clarify these in your comments.

## How to test

Unit tests, playground, etc.

-->

<!-- start pr-codex -->

---

## PR-Codex overview
This PR focuses on enhancing the UI components for various sections in a web application, particularly by introducing `OverviewPage` components for different features and updating the layout for better organization and presentation.

### Detailed summary
- Updated `className` for `PromptInput` in `chat-container.tsx`.
- Added `OverviewPage` components for `Tokens`, `AI`, `Contracts`, `Payments`, `Wallets`, `Transactions`, and `Account Abstraction`.
- Introduced `FeatureCard` metadata for various features in `pages-metadata.ts`.
- Refactored the main `Page` component to use `FeatureSection` for organized display.
- Removed hardcoded feature cards from the main `Page` component.

> ✨ Ask PR-Codex anything about this PR by commenting with `/codex {your question}`

<!-- end pr-codex -->

<!-- This is an auto-generated comment: release notes by coderabbit.ai -->
## Summary by CodeRabbit

- New Features
  - Added overview pages for AI, Wallets, Headless Components, Transactions, Contracts, Payments, Tokens, and Account Abstraction.
  - Introduced reusable OverviewPage and FeatureCard components.
  - Centralized feature-card metadata for all categories.
  - Updated navigation to add “Overview” entries and renamed “AI SDK” to “AI SDK Integration”.
- Refactor
  - Home page rewritten to a data-driven layout using shared components and metadata with consistent grid rendering.
- Style
  - Tweaked AI chat input borders and top-edge rounding.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
@graphite-app graphite-app bot force-pushed the 09-04-_mny-106_playground_add_overview_pages_for_all_sections_in_sidebar branch from cd80067 to 488a3af Compare September 4, 2025 17:50
@vercel vercel bot temporarily deployed to Preview – nebula September 4, 2025 17:50 Inactive
@vercel vercel bot temporarily deployed to Preview – docs-v2 September 4, 2025 17:50 Inactive
@vercel vercel bot temporarily deployed to Preview – thirdweb-www September 4, 2025 17:50 Inactive
@vercel vercel bot temporarily deployed to Preview – wallet-ui September 4, 2025 17:50 Inactive
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

🧹 Nitpick comments (3)
apps/playground-web/src/app/navLinks.ts (1)

189-193: Payments overview entry looks good; small naming nit

Overview is correct. Minor consistency nit: later in this section the item “Onchain Transaction” (Lines 207-209) differs from metadata label “Transactions”. Consider aligning names.

apps/playground-web/src/app/page.tsx (2)

39-56: Sections wired from metadata — consider adding Tokens (optional)

Great shift to data-driven sections. If you want parity with the sidebar, optionally include Tokens here too.

 import {
   accountAbstractionsFeatureCards,
   aiFeatureCards,
   contractsFeatureCards,
   type FeatureCardMetadata,
   insightFeatureCards,
   paymentsFeatureCards,
   transactionsFeatureCards,
   walletsFeatureCards,
+  // Optional: include Tokens on the landing page as well
+  // tokensFeatureCards,
 } from "./data/pages-metadata";
@@
-        <FeatureSection featureCards={walletsFeatureCards} title="Wallets" />
+        <FeatureSection featureCards={walletsFeatureCards} title="Wallets" />
+        {/*
+        Optional: uncomment to surface Tokens on the home page
+        <FeatureSection featureCards={tokensFeatureCards} title="Tokens" />
+        */}

61-82: Extract props type + destructure; use stable key

Small readability/robustness improvements: define a props type alias, destructure props, and key by link (titles can collide).

-function FeatureSection(props: {
-  featureCards: FeatureCardMetadata[];
-  title: string;
-}) {
+type FeatureSectionProps = {
+  featureCards: FeatureCardMetadata[];
+  title: string;
+};
+function FeatureSection({ featureCards, title }: FeatureSectionProps) {
   return (
-    <section>
-      <h2 className="font-semibold text-xl text-foreground tracking-tight mb-2">
-        {props.title}
-      </h2>
-      <div className="grid gap-4 md:grid-cols-2 lg:grid-cols-3">
-        {props.featureCards.slice(0, 6).map((card) => (
+    <section>
+      <h2 className="font-semibold text-xl text-foreground tracking-tight mb-2">
+        {title}
+      </h2>
+      <div className="grid gap-4 md:grid-cols-2 lg:grid-cols-3">
+        {featureCards.slice(0, 6).map((card) => (
           <FeatureCard
-            key={card.title}
+            key={card.link}
             description={card.description}
             href={card.link}
             icon={card.icon}
             title={card.title}
           />
         ))}
       </div>
     </section>
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

💡 Knowledge Base configuration:

  • MCP integration is disabled by default for public repositories
  • Jira integration is disabled by default for public repositories
  • Linear integration is disabled by default for public repositories

You can enable these sources in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between cd80067 and 488a3af.

📒 Files selected for processing (14)
  • apps/playground-web/src/app/account-abstraction/page.tsx (1 hunks)
  • apps/playground-web/src/app/ai/ai-sdk/components/chat-container.tsx (1 hunks)
  • apps/playground-web/src/app/ai/page.tsx (1 hunks)
  • apps/playground-web/src/app/contracts/page.tsx (1 hunks)
  • apps/playground-web/src/app/data/pages-metadata.ts (1 hunks)
  • apps/playground-web/src/app/navLinks.ts (8 hunks)
  • apps/playground-web/src/app/page.tsx (2 hunks)
  • apps/playground-web/src/app/payments/page.tsx (1 hunks)
  • apps/playground-web/src/app/tokens/page.tsx (1 hunks)
  • apps/playground-web/src/app/transactions/page.tsx (1 hunks)
  • apps/playground-web/src/app/wallets/headless/page.tsx (1 hunks)
  • apps/playground-web/src/app/wallets/page.tsx (1 hunks)
  • apps/playground-web/src/components/blocks/FeatureCard.tsx (1 hunks)
  • apps/playground-web/src/components/blocks/OverviewPage.tsx (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (12)
  • apps/playground-web/src/app/wallets/page.tsx
  • apps/playground-web/src/app/tokens/page.tsx
  • apps/playground-web/src/app/data/pages-metadata.ts
  • apps/playground-web/src/components/blocks/FeatureCard.tsx
  • apps/playground-web/src/app/transactions/page.tsx
  • apps/playground-web/src/app/contracts/page.tsx
  • apps/playground-web/src/app/account-abstraction/page.tsx
  • apps/playground-web/src/app/wallets/headless/page.tsx
  • apps/playground-web/src/components/blocks/OverviewPage.tsx
  • apps/playground-web/src/app/ai/page.tsx
  • apps/playground-web/src/app/payments/page.tsx
  • apps/playground-web/src/app/ai/ai-sdk/components/chat-container.tsx
🧰 Additional context used
📓 Path-based instructions (3)
**/*.{ts,tsx}

📄 CodeRabbit inference engine (CLAUDE.md)

**/*.{ts,tsx}: Write idiomatic TypeScript with explicit function declarations and return types
Limit each file to one stateless, single-responsibility function for clarity
Re-use shared types from @/types or local types.ts barrels
Prefer type aliases over interface except for nominal shapes
Avoid any and unknown unless unavoidable; narrow generics when possible
Choose composition over inheritance; leverage utility types (Partial, Pick, etc.)
Comment only ambiguous logic; avoid restating TypeScript in prose

**/*.{ts,tsx}: Use explicit function declarations and explicit return types in TypeScript
Limit each file to one stateless, single‑responsibility function
Re‑use shared types from @/types where applicable
Prefer type aliases over interface except for nominal shapes
Avoid any and unknown unless unavoidable; narrow generics when possible
Prefer composition over inheritance; use utility types (Partial, Pick, etc.)
Lazy‑import optional features and avoid top‑level side‑effects to reduce bundle size

Files:

  • apps/playground-web/src/app/navLinks.ts
  • apps/playground-web/src/app/page.tsx
**/*.{ts,tsx,js,jsx}

📄 CodeRabbit inference engine (CLAUDE.md)

Load heavy dependencies inside async paths to keep initial bundle lean (lazy loading)

Files:

  • apps/playground-web/src/app/navLinks.ts
  • apps/playground-web/src/app/page.tsx
apps/{dashboard,playground-web}/**/*.{ts,tsx}

📄 CodeRabbit inference engine (CLAUDE.md)

apps/{dashboard,playground-web}/**/*.{ts,tsx}: Import UI primitives from @/components/ui/* (Button, Input, Select, Tabs, Card, Sidebar, Badge, Separator) in dashboard and playground apps
Use NavLink for internal navigation with automatic active states in dashboard and playground apps
Use Tailwind CSS only – no inline styles or CSS modules
Use cn() from @/lib/utils for conditional class logic
Use design system tokens (e.g., bg-card, border-border, text-muted-foreground)
Server Components (Node edge): Start files with import "server-only";
Client Components (browser): Begin files with 'use client';
Always call getAuthToken() to retrieve JWT from cookies on server side
Use Authorization: Bearer header – never embed tokens in URLs
Return typed results (e.g., Project[], User[]) – avoid any
Wrap client-side data fetching calls in React Query (@tanstack/react-query)
Use descriptive, stable queryKeys for React Query cache hits
Configure staleTime/cacheTime in React Query based on freshness (default ≥ 60s)
Keep tokens secret via internal API routes or server actions
Never import posthog-js in server components

Files:

  • apps/playground-web/src/app/navLinks.ts
  • apps/playground-web/src/app/page.tsx
🧠 Learnings (18)
📚 Learning: 2025-07-18T19:19:55.613Z
Learnt from: CR
PR: thirdweb-dev/js#0
File: CLAUDE.md:0-0
Timestamp: 2025-07-18T19:19:55.613Z
Learning: Applies to apps/{dashboard,playground-web}/**/*.{ts,tsx} : Use `NavLink` for internal navigation with automatic active states in dashboard and playground apps

Applied to files:

  • apps/playground-web/src/app/navLinks.ts
  • apps/playground-web/src/app/page.tsx
📚 Learning: 2025-08-07T20:43:21.864Z
Learnt from: MananTank
PR: thirdweb-dev/js#7812
File: apps/dashboard/src/app/(app)/(dashboard)/published-contract/components/token-banner.tsx:48-60
Timestamp: 2025-08-07T20:43:21.864Z
Learning: In the TokenBanner component at apps/dashboard/src/app/(app)/(dashboard)/published-contract/components/token-banner.tsx, the Link components use target="_blank" with internal application routes (starting with "/") to open pages in new tabs within the same application. These internal links do not require rel="noopener noreferrer" security attributes, which are only needed for external URLs.

Applied to files:

  • apps/playground-web/src/app/navLinks.ts
  • apps/playground-web/src/app/page.tsx
📚 Learning: 2025-08-29T15:37:38.513Z
Learnt from: CR
PR: thirdweb-dev/js#0
File: AGENTS.md:0-0
Timestamp: 2025-08-29T15:37:38.513Z
Learning: Applies to apps/{dashboard,playground}/**/*.{ts,tsx} : Server Components must start with `import "server-only"`; use `next/headers`, server‑only env, heavy data fetching, and `redirect()` where appropriate

Applied to files:

  • apps/playground-web/src/app/page.tsx
📚 Learning: 2025-08-07T17:24:31.965Z
Learnt from: MananTank
PR: thirdweb-dev/js#7812
File: apps/dashboard/src/app/(app)/team/~/~project/[[...paths]]/page.tsx:1-11
Timestamp: 2025-08-07T17:24:31.965Z
Learning: In Next.js App Router, page components (page.tsx files) are server components by default and do not require the "server-only" import directive. The "server-only" directive is primarily used for utility functions, API helpers, and data access modules that should never be included in the client bundle.

Applied to files:

  • apps/playground-web/src/app/page.tsx
📚 Learning: 2025-07-18T19:19:55.613Z
Learnt from: CR
PR: thirdweb-dev/js#0
File: CLAUDE.md:0-0
Timestamp: 2025-07-18T19:19:55.613Z
Learning: Applies to apps/{dashboard,playground-web}/**/*.{ts,tsx} : Server Components (Node edge): Start files with `import "server-only";`

Applied to files:

  • apps/playground-web/src/app/page.tsx
📚 Learning: 2025-05-26T16:29:54.317Z
Learnt from: MananTank
PR: thirdweb-dev/js#7152
File: apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/(marketplace)/direct-listings/shared-direct-listings-page.tsx:47-52
Timestamp: 2025-05-26T16:29:54.317Z
Learning: The `projectMeta` prop is not required for the server-rendered `ContractDirectListingsPage` component in the direct listings shared page, following the same pattern as other server components in the codebase where `projectMeta` is only needed for client components.

Applied to files:

  • apps/playground-web/src/app/page.tsx
📚 Learning: 2025-05-26T16:28:50.772Z
Learnt from: MananTank
PR: thirdweb-dev/js#7152
File: apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/tokens/shared-page.tsx:41-48
Timestamp: 2025-05-26T16:28:50.772Z
Learning: The `projectMeta` prop is not required for the server-rendered `ContractTokensPage` component in the tokens shared page, unlike some other shared pages where it's needed for consistency.

Applied to files:

  • apps/playground-web/src/app/page.tsx
📚 Learning: 2025-07-18T19:20:32.530Z
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-07-18T19:20:32.530Z
Learning: Applies to dashboard/**/*client.tsx : Interactive UI that relies on hooks (`useState`, `useEffect`, React Query, wallet hooks).

Applied to files:

  • apps/playground-web/src/app/page.tsx
📚 Learning: 2025-07-18T19:20:32.530Z
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-07-18T19:20:32.530Z
Learning: Applies to dashboard/**/*client.tsx : Pages requiring fast transitions where data is prefetched on the client.

Applied to files:

  • apps/playground-web/src/app/page.tsx
📚 Learning: 2025-09-03T23:35:50.476Z
Learnt from: MananTank
PR: thirdweb-dev/js#7977
File: apps/playground-web/src/app/page.tsx:61-65
Timestamp: 2025-09-03T23:35:50.476Z
Learning: In the thirdweb-dev/js codebase, specifically for React components in **/*.{ts,tsx} files, do not suggest adding explicit return types like `: JSX.Element` or `: React.ReactElement` to function components. The project maintainer MananTank has explicitly declined these suggestions.

Applied to files:

  • apps/playground-web/src/app/page.tsx
📚 Learning: 2025-08-29T15:37:38.513Z
Learnt from: CR
PR: thirdweb-dev/js#0
File: AGENTS.md:0-0
Timestamp: 2025-08-29T15:37:38.513Z
Learning: Applies to **/*.{ts,tsx} : Use explicit function declarations and explicit return types in TypeScript

Applied to files:

  • apps/playground-web/src/app/page.tsx
📚 Learning: 2025-07-18T19:19:55.613Z
Learnt from: CR
PR: thirdweb-dev/js#0
File: CLAUDE.md:0-0
Timestamp: 2025-07-18T19:19:55.613Z
Learning: Applies to **/*.{ts,tsx} : Write idiomatic TypeScript with explicit function declarations and return types

Applied to files:

  • apps/playground-web/src/app/page.tsx
📚 Learning: 2025-08-29T15:37:38.513Z
Learnt from: CR
PR: thirdweb-dev/js#0
File: AGENTS.md:0-0
Timestamp: 2025-08-29T15:37:38.513Z
Learning: Applies to apps/{dashboard,playground}/**/*.{ts,tsx} : Use `NavLink` for internal navigation to get active state handling

Applied to files:

  • apps/playground-web/src/app/page.tsx
📚 Learning: 2025-07-18T19:20:32.530Z
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-07-18T19:20:32.530Z
Learning: Applies to dashboard/**/*.{tsx,jsx} : Use `NavLink` (`@/components/ui/NavLink`) for internal navigation so active states are handled automatically.

Applied to files:

  • apps/playground-web/src/app/page.tsx
📚 Learning: 2025-06-18T04:30:04.326Z
Learnt from: jnsdls
PR: thirdweb-dev/js#7365
File: apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/components/ProjectFTUX/ProjectFTUX.tsx:16-17
Timestamp: 2025-06-18T04:30:04.326Z
Learning: Next.js Link component fully supports both internal and external URLs and works appropriately with all standard anchor attributes including target="_blank", rel="noopener noreferrer", etc. Using Link for external URLs is completely appropriate and recommended.

Applied to files:

  • apps/playground-web/src/app/page.tsx
📚 Learning: 2025-06-18T04:27:16.172Z
Learnt from: jnsdls
PR: thirdweb-dev/js#7365
File: apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/components/ProjectFTUX/ProjectFTUX.tsx:16-17
Timestamp: 2025-06-18T04:27:16.172Z
Learning: Next.js Link component supports external URLs without throwing errors. When used with absolute URLs (like https://...), it behaves like a regular anchor tag without client-side routing, but does not cause runtime crashes or errors as previously believed.

Applied to files:

  • apps/playground-web/src/app/page.tsx
📚 Learning: 2025-07-18T19:20:32.530Z
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-07-18T19:20:32.530Z
Learning: Applies to dashboard/**/*.{tsx,jsx} : Icons come from `lucide-react` or the project-specific `…/icons` exports – never embed raw SVG.

Applied to files:

  • apps/playground-web/src/app/page.tsx
📚 Learning: 2025-07-18T19:20:32.530Z
Learnt from: CR
PR: thirdweb-dev/js#0
File: .cursor/rules/dashboard.mdc:0-0
Timestamp: 2025-07-18T19:20:32.530Z
Learning: Applies to dashboard/**/layout.tsx : Building layout shells (`layout.tsx`) and top-level pages that mainly assemble data.

Applied to files:

  • apps/playground-web/src/app/page.tsx
🧬 Code graph analysis (1)
apps/playground-web/src/app/page.tsx (2)
apps/playground-web/src/app/data/pages-metadata.ts (8)
  • aiFeatureCards (284-297)
  • walletsFeatureCards (36-87)
  • transactionsFeatureCards (110-133)
  • contractsFeatureCards (135-160)
  • paymentsFeatureCards (162-196)
  • insightFeatureCards (198-236)
  • accountAbstractionsFeatureCards (238-266)
  • FeatureCardMetadata (29-34)
apps/playground-web/src/components/blocks/FeatureCard.tsx (1)
  • FeatureCard (3-26)
⏰ 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). (4)
  • GitHub Check: Size
  • GitHub Check: E2E Tests (pnpm, vite)
  • GitHub Check: Lint Packages
  • GitHub Check: Analyze (javascript)
🔇 Additional comments (9)
apps/playground-web/src/app/navLinks.ts (8)

19-23: AI overview entry looks good

Adding the index route with exactMatch will ensure correct active state for /ai.


30-30: Label rename consistent

“AI SDK Integration” aligns with metadata and page copy. No action needed.


41-45: Wallets overview entry looks good

Correct placement at top and exactMatch=true for /wallets.


79-83: Headless Components overview added correctly

Nested overview with exactMatch=true will fix active state for /wallets/headless.


107-111: Contracts overview entry looks good

Index route + exactMatch=true is correct.


159-163: AA overview entry looks good

Matches new /account-abstraction overview page.


223-227: Transactions overview entry looks good

Index route present with exactMatch=true.


137-141: /tokens route confirmedapps/playground-web/src/app/tokens/page.tsx exists and tokensFeatureCards export in apps/playground-web/src/app/data/pages-metadata.ts is present.

apps/playground-web/src/app/page.tsx (1)

1-12: Metadata-driven imports LGTM

Type-only import for FeatureCardMetadata keeps client bundle lean; grouping feature card datasets is clean.

@graphite-app graphite-app bot merged commit 488a3af into main Sep 4, 2025
24 checks passed
@graphite-app graphite-app bot deleted the 09-04-_mny-106_playground_add_overview_pages_for_all_sections_in_sidebar branch September 4, 2025 18:09
@vercel vercel bot temporarily deployed to Production – nebula September 4, 2025 18:09 Inactive
@vercel vercel bot temporarily deployed to Production – wallet-ui September 4, 2025 18:09 Inactive
@vercel vercel bot temporarily deployed to Production – docs-v2 September 4, 2025 18:09 Inactive
@vercel vercel bot temporarily deployed to Production – thirdweb-www September 4, 2025 18:09 Inactive
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Playground Changes involving the Playground codebase.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants