- Our Board of Directors provides strategic guidance, ensures financial oversight,
- and maintains the foundation's commitment to transparency and community-first values.
-
+
+
+
+
+
+ Board of Directors
+
+
+ The Board provides strategic guidance, financial oversight, and a clear commitment
+ to transparent, community-first governance.
+
+
+
+
+
+ Our governance philosophy
+
+ The React Foundation operates with complete transparency and community accountability.
+ The Board keeps decisions focused on the ecosystem's best interests, with quarterly
+ reports, open financials, and active community feedback loops.
+
+
+ {philosophyValues.map((value) => (
+
+
+
{value.title}
+
{value.description}
-
-
- {/* Mission Statement */}
-
-
-
- Our Governance Philosophy
-
-
- The React Foundation operates with complete transparency and community accountability.
- Our Board ensures that every decision serves the ecosystem's best interests, with
- quarterly reports, open financials, and active community feedback loops.
-
-
-
-
-
-
-
Transparent
-
- All decisions and finances publicly documented
-
-
-
-
-
-
-
Accountable
-
- Regular reporting and community oversight
-
-
-
-
-
-
-
Community-First
-
- Decisions guided by ecosystem needs
-
-
-
-
-
-
- {/* Board Members Grid */}
-
-
-
-
- Meet the Board
-
-
- Leaders committed to building a sustainable future for React
-
+ ))}
+
+
+
+
+ Meet the board
+ Leaders committed to building a sustainable future for React.
+
We're building a sustainable future for the React ecosystem through
- community funding, transparent governance, and unwavering support for
- the maintainers who make it all possible.
+ community funding, transparent governance, and support for the
+ maintainers who make it all possible.
-
+
- {/* Executive Message */}
-
+
- {/* Mission */}
-
-
-
-
- Our Mission
-
-
- The React Foundation exists to ensure the React ecosystem thrives for
- generations to come. We provide direct financial support to maintainers,
- fund educational initiatives, and ensure accessibility for developers
- worldwide.
-
-
-
-
-
-
-
-
Sustainable Funding
-
- Creating reliable revenue streams that support open source maintainers
-
-
+
+ Our mission
+
+ The React Foundation exists to ensure the React ecosystem{" "}
+ thrives for generations to come. We
+ provide direct financial support to maintainers, fund educational
+ initiatives, and ensure accessibility for developers worldwide.
+
+
+ {MISSION_POINTS.map((point) => (
+
+
{point.title}
+
{point.description}
-
-
-
-
-
-
Full Transparency
-
- Quarterly reports showing exactly how funds are distributed
-
-
-
-
-
-
-
-
-
Community First
-
- Decisions driven by community needs and maintainer feedback
+ ))}
+
+
+
+
+ How it works
+
+ {HOW_IT_WORKS_STEPS.map((step, index) => (
+
+
+ {index + 1}
+
+
+
{step.title}
+
+ {step.description}
-
-
-
-
-
- {/* How It Works */}
-
-
-
-
- How It Works
-
-
-
-
- 1
-
-
- Contribute to the Ecosystem
-
-
- Submit code, documentation, RFCs, and bug reports to React and 54+
- ecosystem libraries. Your contributions directly improve the tools
- millions of developers use every day.
-
-
-
-
-
- 2
-
-
- Join the Community
-
-
- Organize meetups, create educational content, teach workshops, or
- help other developers learn React. Community organizers and educators
- are essential to ecosystem growth.
-
-
-
-
-
- 3
-
-
- Support Through the Store
-
-
- One way to fund the ecosystem is through our official merchandise store.
- 100% of profits support maintainers, educators, and community organizers
- based on transparent impact metrics.
-
-
-
-
-
- 4
-
-
- Transparent Impact
-
-
- Quarterly impact reports detail exactly how funds support maintainers,
- education, and accessibility initiatives. Full transparency in how
- contributions make a difference.
-
-
-
-
-
-
+ ))}
+
+
- {/* Founding Members */}
-
+
- {/* Ecosystem Libraries */}
-
-
+
+
- {/* Governance / Communities */}
-
-
-
-
- Transparent Governance
-
-
- The React Foundation operates with complete transparency. All funding
- decisions, impact reports, and financial details are published quarterly
- for community review and feedback.
-
-
+
+ Transparent governance
+
+ The React Foundation operates with complete transparency. All funding
+ decisions, impact reports, and financial details are published quarterly
+ for community review and feedback.
+
+
+ {GOVERNANCE_BODIES.map((body) => (
+
+
+
+
{body.title}
+
{body.subtitle}
+
+ {body.description}
+
-
- Our Board provides strategic guidance, ensures financial oversight, and
- maintains the foundation's commitment to transparency and community-first values.
-
-
-
-
+
+
+
+ ))}
+
+
+ {GOVERNANCE_PRINCIPLES.map((principle) => (
+
-
-
-
-
-
-
- Technical Steering Committee
-
-
- Technical Excellence · Innovation · Open Standards
-
-
-
-
-
- The TSC drives technical excellence across the React ecosystem, establishing
- standards, best practices, and supporting innovation in libraries and tools.
-
-
-
-
- {/* Governance Principles */}
-
-
-
Open Financials
-
- Every dollar tracked and reported publicly
-
+
{principle.title}
+
{principle.description}
-
-
Community Input
-
- Major decisions informed by maintainer feedback
-
-
-
-
Quarterly Reports
-
- Detailed impact metrics published every quarter
-
-
-
-
Open Source Values
-
- Built on the same principles as the ecosystem we support
-
-
-
-
-
-
+ ))}
+
+
- {/* Become a Contributor */}
-
-
+
-
- {/* CTA */}
-
-
-
- Ready to Make an Impact?
-
-
- Start supporting the React ecosystem today. Every contribution helps build
- a sustainable future for open source.
-
-
-
- Shop the Store
-
-
- View Our Impact
-
-
-
-
+
+ Ready to make an impact?
+
+ Start supporting the React ecosystem today. Every contribution helps build
+ a sustainable future for open source.
+
+
+
+ Shop the Store
+
+
+ View Our Impact
+
+
+
- {/* Table of Contents Sidebar */}
-
-
+
-
+
);
}
diff --git a/src/app/about/technical-steering-committee/page.tsx b/src/app/about/technical-steering-committee/page.tsx
index 595fd35..d0cfb24 100644
--- a/src/app/about/technical-steering-committee/page.tsx
+++ b/src/app/about/technical-steering-committee/page.tsx
@@ -1,8 +1,8 @@
import type { Metadata } from "next";
-import { ButtonLink } from "@/components/ui/button";
-import { Pill } from "@/components/ui/pill";
-import { ScrollReveal } from "@/components/ui/scroll-reveal";
-import { Footer } from "@/components/layout/footer";
+import { BadgeCheck, BookOpen, CircleUserRound, Code2, Globe2, Lightbulb, ShieldCheck, Wrench, Zap } from "lucide-react";
+
+import { OrbitMarks, Panel, PanelActions, PanelButton, PanelEyebrow, PanelSub, RowList } from "@/components/panels/panel";
+import { PanelsFooter } from "@/components/panels/panels-footer";
export const metadata: Metadata = {
title: "Technical Steering Committee | React Foundation",
@@ -76,328 +76,211 @@ const committeeMembers: CommitteeMember[] = [
},
];
+const missionValues = [
+ {
+ title: "Excellence",
+ description: "Maintaining high technical standards across all projects",
+ },
+ {
+ title: "Innovation",
+ description: "Supporting experimentation and emerging technologies",
+ },
+ {
+ title: "Collaboration",
+ description: "Fostering cooperation between ecosystem projects",
+ },
+];
+
+const responsibilities = [
+ {
+ icon: Code2,
+ title: "Technical Standards",
+ description:
+ "Establishing and maintaining technical standards, API design guidelines, and best practices for ecosystem libraries.",
+ },
+ {
+ icon: Lightbulb,
+ title: "Innovation Support",
+ description:
+ "Evaluating emerging technologies, experimental features, and new patterns that could benefit the React ecosystem.",
+ },
+ {
+ icon: BookOpen,
+ title: "Documentation & Education",
+ description:
+ "Ensuring comprehensive technical documentation, guides, and educational resources for the community.",
+ },
+ {
+ icon: Globe2,
+ title: "Ecosystem Coordination",
+ description:
+ "Facilitating collaboration between projects, resolving technical conflicts, and promoting interoperability.",
+ },
+ {
+ icon: ShieldCheck,
+ title: "Security & Quality",
+ description:
+ "Establishing security protocols, vulnerability response processes, and quality assurance standards.",
+ },
+ {
+ icon: Zap,
+ title: "Performance & Optimization",
+ description:
+ "Guiding performance optimization strategies, benchmarking practices, and establishing performance budgets.",
+ },
+];
+
+const workingGroups = [
+ {
+ title: "Framework Interop",
+ description: "Ensuring libraries work seamlessly across React frameworks",
+ },
+ {
+ title: "Testing Standards",
+ description: "Developing unified testing approaches and tools",
+ },
+ {
+ title: "Server Components",
+ description: "Exploring patterns for RSC adoption in libraries",
+ },
+ {
+ title: "Type Safety",
+ description: "Improving TypeScript integration across ecosystem",
+ },
+ {
+ title: "Accessibility",
+ description: "Establishing a11y standards and best practices",
+ },
+ {
+ title: "Build Tooling",
+ description: "Optimizing build systems and developer experience",
+ },
+];
+
export default function TechnicalSteeringCommitteePage() {
return (
-
- {/* Hero Gradient */}
-
-
-
+
+
+
+
+
+ Technical Steering Committee
+
+
+ The TSC drives technical excellence across React libraries, tools, and frameworks
+ through standards, best practices, and support for responsible innovation.
+
- Our Technical Steering Committee (TSC) drives technical excellence across the
- React ecosystem, establishing standards, best practices, and supporting innovation
- in libraries, tools, and frameworks.
-
+
+ Our technical mission
+
+ The TSC keeps technical decisions aligned with the ecosystem's long-term health:
+ maintainer guidance, interoperability standards, and innovation that preserves
+ stability and developer trust.
+
+
+ {missionValues.map((value) => (
+
+
+
{value.title}
+
{value.description}
-
+ ))}
+
+
- {/* Mission Statement */}
-
-
-
- Our Technical Mission
-
-
- The TSC ensures technical decisions align with the ecosystem's long-term health,
- supporting maintainers with guidance, establishing interoperability standards, and
- fostering innovation while maintaining stability and developer trust.
-
-
-
-
-
-
-
Excellence
-
- Maintaining high technical standards across all projects
-
-
-
-
-
-
-
Innovation
-
- Supporting experimentation and emerging technologies
-
-
-
-
-
-
-
Collaboration
-
- Fostering cooperation between ecosystem projects
-
-
+
+ Meet the committee
+ Technical experts dedicated to React ecosystem excellence.
+
+ {committeeMembers.map((member) => (
+
+
+
-
-
-
- {/* Committee Members Grid */}
-
-
-
-
- Meet the Committee
-
-
- Technical experts dedicated to React ecosystem excellence
-
+
+ Committee responsibilities
+ The committee supports standards, security, coordination, and performance across the ecosystem.
+
+ {responsibilities.map((responsibility) => (
+
+
+
+
{responsibility.title}
+
+ {responsibility.description}
+
-
-
+
+ ))}
+
+
- {/* Working Groups */}
-
-
-
- Technical Working Groups
-
-
- The TSC organizes focused working groups to tackle specific technical challenges,
- explore new patterns, and develop proposals for ecosystem-wide adoption.
-
-
-
-
Framework Interop
-
- Ensuring libraries work seamlessly across React frameworks
-
-
-
-
Testing Standards
-
- Developing unified testing approaches and tools
-
-
-
-
Server Components
-
- Exploring patterns for RSC adoption in libraries
-
-
-
-
Type Safety
-
- Improving TypeScript integration across ecosystem
-
-
-
-
Accessibility
-
- Establishing a11y standards and best practices
-
-
-
-
Build Tooling
-
- Optimizing build systems and developer experience
-
-
+
+ Technical working groups
+
+ The TSC organizes focused working groups to tackle technical challenges and develop ecosystem-wide proposals.
+
+
+ {workingGroups.map((group) => (
+
+
+
+
{group.title}
+
{group.description}
-
-
+
+ ))}
+
+
- {/* CTA Section */}
-
-
-
- Get Involved in Technical Discussions
-
-
- Join our technical discussions, propose new standards, and help shape the
- future of the React ecosystem.
-
-
-
- About the Foundation
-
-
- View Our Impact
-
-
-
-
-
-
+
+
+
+ Get involved in technical discussions
+
+ Join technical discussions, propose standards, and help shape the future of the React ecosystem.
+
+
+
+
+ About the Foundation
+
+
+ View Our Impact
+
+
+
+
-
+
);
}
diff --git a/src/app/auth/signin/page.tsx b/src/app/auth/signin/page.tsx
index b3328e8..592ec4a 100644
--- a/src/app/auth/signin/page.tsx
+++ b/src/app/auth/signin/page.tsx
@@ -5,94 +5,102 @@ import { useSearchParams } from "next/navigation";
import Image from "next/image";
import Link from "next/link";
-export default function SignInPage() {
- const searchParams = useSearchParams();
- const callbackUrl = searchParams?.get("callbackUrl") || "/";
+import { Panel } from "@/components/panels/panel";
+import { cn } from "@/lib/cn";
+
+const FOCUS_RING = cn(
+ "focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-solid focus-visible:outline-[#16181D]",
+);
- return (
-
+ );
}
diff --git a/src/app/become-a-member/page.tsx b/src/app/become-a-member/page.tsx
index 433f3f1..e1b60e9 100644
--- a/src/app/become-a-member/page.tsx
+++ b/src/app/become-a-member/page.tsx
@@ -1,213 +1,190 @@
import type { Metadata } from "next";
-import Link from "next/link";
-import { ButtonLink } from "@/components/ui/button";
-import { Pill } from "@/components/ui/pill";
-import { ScrollReveal } from "@/components/ui/scroll-reveal";
-import { Footer } from "@/components/layout/footer";
+
+import {
+ Panel,
+ PanelActions,
+ PanelButton,
+ PanelEyebrow,
+ PanelPlainLink,
+ PanelSub,
+ RowList,
+} from "@/components/panels/panel";
+import { PanelsFooter } from "@/components/panels/panels-footer";
const ENROLLMENT_URL =
- "https://enrollment.lfx.linuxfoundation.org/?project=react-foundation";
+ "https://enrollment.lfx.linuxfoundation.org/?project=react-foundation";
const memberReasons = [
- {
- title: "Sustain core infrastructure",
- description:
- "Help fund the maintainers, tooling, and shared services that millions of developers and teams rely on every day.",
- },
- {
- title: "Invest in ecosystem health",
- description:
- "Support programs that strengthen libraries, education, security, accessibility, and long-term project resilience.",
- },
- {
- title: "Shape responsible growth",
- description:
- "Join a member community aligned around transparent governance and a healthy future for React across companies and communities.",
- },
+ {
+ title: "Sustain core infrastructure",
+ description:
+ "Help fund the maintainers, tooling, and shared services that millions of developers and teams rely on every day.",
+ },
+ {
+ title: "Invest in ecosystem health",
+ description:
+ "Support programs that strengthen libraries, education, security, accessibility, and long-term project resilience.",
+ },
+ {
+ title: "Shape responsible growth",
+ description:
+ "Join a member community aligned around transparent governance and a healthy future for React across companies and communities.",
+ },
];
const membershipBenefits = [
- "Visible support for React's independent ecosystem stewardship",
- "Participation in foundation member conversations and priorities",
- "Opportunities to collaborate on ecosystem sustainability programs",
- "Connection with maintainers, educators, tool authors, and platform teams",
+ "Visible support for React's independent ecosystem stewardship",
+ "Participation in foundation member conversations and priorities",
+ "Opportunities to collaborate on ecosystem sustainability programs",
+ "Connection with maintainers, educators, tool authors, and platform teams",
];
const investmentAreas = [
- "Maintainer support",
- "Community education",
- "Ecosystem tooling",
- "Governance operations",
- "Accessibility and inclusion",
- "Long-term project resilience",
+ "Maintainer support",
+ "Community education",
+ "Ecosystem tooling",
+ "Governance operations",
+ "Accessibility and inclusion",
+ "Long-term project resilience",
];
export const metadata: Metadata = {
- title: "Become a Member | React Foundation",
- description:
- "Become a React Foundation member and help sustain the ecosystem, maintainers, and community programs that support React's future.",
+ title: "Become a Member | React Foundation",
+ description:
+ "Become a React Foundation member and help sustain the ecosystem, maintainers, and community programs that support React's future.",
};
export default function BecomeMemberPage() {
- return (
-
-
-
-
-
-
-
-
-
-
-
- Help sustain the future of React.
-
-
- React is more than a library. It is an ecosystem of maintainers,
- educators, tools, frameworks, and community spaces that help teams
- build for the web and beyond. Members help keep that
- ecosystem healthy, independent, and durable.
-
-
-
-
- Join as a member
-
-
- See what membership supports
-
-
-
-
-
-
-
-
-
-
-
- Members fund the shared work behind React.
-
-
- Your support helps the foundation invest where individual projects
- and volunteer maintainers should not have to carry the burden alone.
-
-
-
-
- {memberReasons.map((reason) => (
-
-
- {reason.title}
-
-
- {reason.description}
-
-
- ))}
-
-
-
-
-
-
-
- Member Value
-
- Built for organizations that depend on React.
-
-
- Membership is for companies, platforms, agencies, and teams who
- want React to remain a strong open ecosystem with clear stewardship
- and practical support for the people doing the work.
-
-
-
-
- {membershipBenefits.map((benefit) => (
-
- {benefit}
-
- ))}
-
-
-
-
-
-
-
-
- Practical support for a broad ecosystem.
-
-
- React Foundation membership helps create capacity for work that
- benefits the whole ecosystem, not just one product roadmap or one
- organization's priorities.
-
-
-
-
- {investmentAreas.map((area) => (
-
- {area}
-
- ))}
-
-
-
-
-
-
- Start Membership
-
- Join the organizations helping React stay healthy for everyone.
-
-
- Begin with the Linux Foundation enrollment form, or return to the
- foundation site to learn more about our mission and governance.
-
-
-
- Join now
-
-
- Learn about the foundation
-
-
-
-
-
-
-
-
-
- );
+ return (
+
+
+
+
+
+ Help sustain the future of React.
+
+
+ React is more than a library. It is an ecosystem of maintainers,
+ educators, tools, frameworks, and community spaces that help teams
+ build for the web and beyond. Members help keep that ecosystem
+ healthy, independent, and durable.
+
+
+
+ Join as a member
+
+
+ See what membership supports
+
+
+
+
+
+
+
+
+
+ Membership
+
+ Members fund the shared work behind React.
+
+
+ Your support helps the foundation invest where individual projects
+ and volunteer maintainers should not have to carry the burden alone.
+
+
+ {memberReasons.map((reason) => (
+
+
{reason.title}
+
+ {reason.description}
+
+
+ ))}
+
+
+
+
+
+
+ Member value
+
+ Built for organizations that depend on React.
+
+
+ Membership is for companies, platforms, agencies, and teams who
+ want React to remain a strong open ecosystem with clear stewardship
+ and practical support for the people doing the work.
+
+
+
+
+ {membershipBenefits.map((benefit) => (
+
+ {benefit}
+
+ ))}
+
+
+
+
+
+ Investment areas
+
+ Practical support for a broad ecosystem.
+
+
+ React Foundation membership helps create capacity for work that
+ benefits the whole ecosystem, not just one product roadmap or one
+ organization's priorities.
+
+
+ {investmentAreas.map((area) => (
+
+ {area}
+
+ ))}
+
+
+
+
+
+ Start membership
+
+ Join the organizations helping React stay healthy for everyone.
+
+
+ Begin with the Linux Foundation enrollment form, or return to the
+ foundation site to learn more about our mission and governance.
+
+ Connect with React developers through meetups, conferences, and
+ study groups around the world.
+
+
+
+ Explore Communities
+
+
+ Start a Community
+
+
-
-
- {/* Stats Bar - Dynamic from Redis */}
-
-
- }>
-
+
+
+
+ By the numbers
+ }>
+
+
+
+
+
+ Communities worldwide
+ Click any marker to learn more about a community
+
+ }>
+
-
+
+
+
+ {/*
+ * Not the Panel primitive: its overflow-hidden would defeat the sticky
+ * filters and clip the sort dropdown menus, so this section recreates the
+ * paper surface (and its tone variables) with overflow left visible.
+ */}
+
+ All communities
+
+
- {/* Map Section */}
-
-
-
-
- Communities Worldwide
-
-
- Click any marker to learn more about a community
-
-
+
+
+
+
-
- }>
-
+ }>
+
-
-
- {/* Add Community CTA */}
-
+
- {/* Main Content: Filters + List */}
-
-
-
- {/* Filters Sidebar */}
-
-
- {/* Community List */}
-
-
-
- All Communities
-
-
-
-
- }>
-
-
-
+
+
+
+
+ Don't See a Community Near You?
+
+
+ Starting a React community is easier than you think. We provide
+ resources, templates, and support to help you succeed.
+
+
+
+ Start Your Own Community
+
+
-
+
- {/* CTA Section */}
-
-
-
- Don't See a Community Near You?
-
-
- Starting a React community is easier than you think. We provide
- resources, templates, and support to help you succeed.
-
- Full transparency on how your support funds the React ecosystem. Every
- contribution is tracked and reported publicly.
-
-
-
-
- {/* Coming Soon */}
-
-
-
-
-
-
-
- First Report Coming Soon
-
-
- Our inaugural quarterly impact report will be published once the store
- launches. Each report will provide complete transparency into fund
- distribution.
+
+ First report coming soon
+
+ Our inaugural quarterly impact report will be published once the store
+ launches. Each report will provide complete transparency into fund
+ distribution.
+
+
+ {REPORT_CONTENTS.map((item) => (
+
+
+
+
{item.title}
+
+ {item.description}
+
+ ))}
+
+
-
-
-
💰
-
Revenue Details
-
- Total revenue generated from all sources
-
-
-
-
👥
-
Maintainer Funding
-
- Breakdown of funding by library and maintainer
-
-
-
-
📚
-
Education Initiatives
-
- Tutorials, docs, and learning resources supported
-
-
-
-
🌍
-
Accessibility
-
- Global accessibility improvements funded
-
-
-
-
📊
-
Impact Metrics
-
- Downloads, usage, and ecosystem growth data
-
-
-
-
💬
-
Community Feedback
-
- Testimonials from maintainers and contributors
-
-
-
-
-
-
- {/* Ecosystem Libraries */}
-
-
- {/* How Funds are Distributed */}
-
-
-
- How Funds are Distributed
-
-
- We use a transparent, metrics-based approach to ensure fair distribution
- of funds to maintainers across the React ecosystem.
-
-
-
-
-
- 1
-
-
- Contribution Tracking
-
-
- We track pull requests, issues, and commits across all 54 supported
- libraries using GitHub's GraphQL API.
-
-
-
-
-
- 2
-
-
Score Calculation
-
- Contributions are weighted (PRs × 8 + Issues × 3 + Commits × 1) to
- calculate fair distribution ratios.
-
-
+
-
-
- 3
-
-
Fund Distribution
-
- 100% of profits are distributed quarterly based on contribution scores
- and library impact metrics.
-
-
+
+ How funds are distributed
+
+ We use a transparent, metrics-based approach to ensure fair distribution of
+ funds to maintainers across the React ecosystem.
+
+
+ {DISTRIBUTION_STEPS.map((step, index) => (
+
+
+ {index + 1}
+
+
+
{step.title}
+
+ {step.description}
+
-
-
+
+ ))}
+
+
- {/* CTA */}
-
-
-
- Support the Ecosystem
-
-
- Every purchase directly supports React ecosystem maintainers. Shop the
- store to make an impact today.
-
-
-
- Shop the Store
-
-
- Learn More
-
-
-
-
-
-
+
+ Support the ecosystem
+
+ Every purchase directly supports React ecosystem maintainers. Shop the store
+ to make an impact today.
+
+
+
+ Shop the Store
+
+
+ Learn More
+
+
+
-
+
);
}
diff --git a/src/app/libraries/page.tsx b/src/app/libraries/page.tsx
index 1944bee..08f6937 100644
--- a/src/app/libraries/page.tsx
+++ b/src/app/libraries/page.tsx
@@ -12,13 +12,14 @@ import {
useCollectionStatus,
} from '@/lib/ris';
import { RISLibraryRankings } from '@/components/ris/ris-library-rankings';
-import { RFDS } from '@/components/rfds';
+import { Panel, PanelButton, PanelEyebrow, PanelPlainLink, PanelSub, RowList } from '@/components/panels/panel';
+import { PanelsFooter } from '@/components/panels/panels-footer';
import Link from 'next/link';
export default function LibrariesPage() {
// Try to fetch real data from API
const { allocation: realAllocation, isLoading, isError } = useRISAllocationFromAPI();
- const { lastUpdated, currentQuarter } = useCollectionStatus();
+ const { lastUpdated } = useCollectionStatus();
// Fall back to sample data if real data not available
const useSampleData = isError || !realAllocation;
@@ -31,28 +32,27 @@ export default function LibrariesPage() {
const avgRIS = allocation.libraries.reduce((sum, lib) => sum + lib.ris, 0) / totalLibraries;
return (
-
-
- {/* Header */}
-
-
-
- ← How Scoring Works
-
-
-
+
+
+
+
Library Impact Dashboard
-
- React ecosystem libraries ranked by their impact score
+
+ React ecosystem libraries ranked by their impact score.
Real RIS data not yet available. This dashboard shows sample data demonstrating
how the React Impact Score (RIS) system evaluates libraries across 5 key components.
To use real data, configure your GitHub PAT and Redis URL, then run data collection
- via POST /api/ris/collect
+ via POST /api/ris/collect
>
) : (
<>
-
Using Real Data
+
Using Real Data
This dashboard displays actual metrics collected from GitHub, NPM, CDN providers,
and OSSF Scorecard for {allocation.libraries.length} React ecosystem libraries.
{lastUpdated && (
-
+
Last updated: {new Date(lastUpdated).toLocaleString()}
)}
>
)}
-
+
Learn more about how scoring works →
- )}
+
+ )}
- {/* Library Rankings */}
-
-
-
- Library Rankings
-
-
- {totalLibraries} libraries · Total pool: ${allocation.total_pool_usd.toLocaleString()}
-
+
+
+
+ Library rankings
+ Scores and allocation estimates for the current RIS period.
+
+ {totalLibraries} libraries · Total pool: ${allocation.total_pool_usd.toLocaleString()}
+
+
+
+
- {/* Methodology Note */}
-
-
- Scores are calculated using winsorized normalization to reduce outlier impact,
- with EMA smoothing for quarter-to-quarter stability.
-
-
- All data is transparent and reproducible. See the{' '}
-
- scoring documentation
- {' '}
- for full methodology.
-
+
+
+
+ Methodology
+
+ Scores are calculated using winsorized normalization to reduce outlier impact,
+ with EMA smoothing for quarter-to-quarter stability.
+
+
+ All data is transparent and reproducible. See the scoring documentation for full methodology.
+
);
}
diff --git a/src/app/page.tsx b/src/app/page.tsx
index 4e3efbc..0d879d7 100644
--- a/src/app/page.tsx
+++ b/src/app/page.tsx
@@ -1,37 +1,30 @@
import type { Metadata } from "next";
-import { Footer } from "@/components/layout/footer";
-import { FoundationHero } from "@/components/home/foundation-hero";
-import { MissionStatement } from "@/components/home/mission-statement";
-import { ThreePillars } from "@/components/home/three-pillars";
-import { BecomeContributor } from "@/components/home/become-contributor";
-import { JoinMovementCTA } from "@/components/home/join-movement-cta";
-import { FoundingMembers } from "@/components/home/founding-members";
+
+import { PanelContribute } from "@/components/home/panels/panel-contribute";
+import { PanelHero } from "@/components/home/panels/panel-hero";
+import { PanelJoin } from "@/components/home/panels/panel-join";
+import { PanelMembers } from "@/components/home/panels/panel-members";
+import { PanelMetrics } from "@/components/home/panels/panel-metrics";
+import { PanelMission } from "@/components/home/panels/panel-mission";
+import { PanelPillars } from "@/components/home/panels/panel-pillars";
+import { PanelsFooter } from "@/components/panels/panels-footer";
export const metadata: Metadata = {
- title: "React Foundation",
- description: "Supporting the React ecosystem through community funding and governance.",
+ title: "React Foundation",
+ description: "Supporting the React ecosystem through community funding and governance.",
};
export default function FoundationHome() {
- return (
-
- {/* Background gradient */}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- );
+ return (
+
+
+
+
+
+
+
+
+
+
+ );
}
diff --git a/src/app/privacy/page.tsx b/src/app/privacy/page.tsx
index 8b4f69f..2f355a1 100644
--- a/src/app/privacy/page.tsx
+++ b/src/app/privacy/page.tsx
@@ -1,174 +1,173 @@
/* eslint-disable react/no-unescaped-entities */
import type { Metadata } from "next";
-import { Footer } from "@/components/layout/footer";
+
+import { Panel } from "@/components/panels/panel";
+import { PanelsFooter } from "@/components/panels/panels-footer";
export const metadata: Metadata = {
- title: "Privacy Policy",
- description: "Privacy Policy for React Foundation",
+ title: "Privacy Policy",
+ description: "Privacy Policy for React Foundation",
};
export default function PrivacyPage() {
- return (
-
-
-
-
-
-
-
-
Privacy Policy
-
- Last updated: October 21, 2025
-
-
-
-
-
1. Introduction
-
- React Foundation ("we", "our", or "us") is committed to protecting your privacy. This Privacy Policy explains how we collect, use, disclose, and safeguard your information when you visit our website and use our services.
-
-
- Please read this Privacy Policy carefully. If you do not agree with the terms of this Privacy Policy, please do not access the site.
-
-
-
-
-
2. Information We Collect
-
-
2.1 Personal Information
-
- When you authenticate using GitHub or GitLab OAuth, we collect:
-
-
-
Your name
-
Your email address
-
Your GitHub or GitLab username
-
Your public profile information from the respective platform
-
-
-
2.2 Local Storage
-
- We use browser local storage to save your contributor username preference for convenience. This data is stored only on your device and is not transmitted to our servers.
-
-
-
2.3 Session Data
-
- We use session cookies to maintain your authenticated state. These are essential for the functionality of the authentication system.
-
-
-
-
-
3. How We Use Your Information
-
- We use the information we collect in the following ways:
-
-
-
To provide, operate, and maintain our website
-
To authenticate and authorize your access to features
-
To display your contributor status and progress
-
To personalize your experience on our website
-
To communicate with you about updates and announcements
-
-
-
-
-
4. Data Sharing and Disclosure
-
- We do not share, sell, rent, or trade your personal information with third parties for their commercial purposes.
-
-
- We may share information only in the following limited circumstances:
-
-
-
Service Providers: We use third-party services (GitHub, GitLab for authentication; Shopify for e-commerce) that may have access to your information to perform tasks on our behalf.
-
Legal Requirements: We may disclose your information if required to do so by law or in response to valid requests by public authorities.
-
-
-
-
-
5. Third-Party Services
-
-
5.1 Authentication
-
- We use GitHub and GitLab OAuth for authentication. When you authenticate, you are subject to their respective privacy policies:
-
- Our online store is powered by Shopify. When you make a purchase, Shopify collects and processes your payment and shipping information. Please review Shopify's Privacy Policy for more information.
-
-
-
-
-
6. Tracking and Analytics
-
- We do not use any tracking technologies, analytics tools, or third-party advertising services. We do not track your browsing behavior across websites or collect data for advertising purposes.
-
-
-
-
-
7. Data Security
-
- We implement appropriate technical and organizational security measures to protect your personal information. However, please note that no method of transmission over the internet or method of electronic storage is 100% secure.
-
-
- Your authentication is handled by NextAuth.js, a secure authentication library, and we rely on GitHub and GitLab's OAuth implementations for secure authentication.
-
-
-
-
-
8. Data Retention
-
- We retain your personal information only for as long as necessary to provide you with our services and as described in this Privacy Policy. Session data is retained only for the duration of your authenticated session.
-
-
-
-
-
9. Your Rights
-
- You have the right to:
-
-
-
Access the personal information we hold about you
-
Request correction of inaccurate information
-
Request deletion of your personal information
-
Revoke OAuth access through your GitHub or GitLab account settings
-
Clear local storage data stored in your browser
-
-
-
-
-
10. Children's Privacy
-
- Our Service does not address anyone under the age of 13. We do not knowingly collect personally identifiable information from children under 13. If you are a parent or guardian and you are aware that your child has provided us with personal information, please contact us.
-
-
-
-
-
11. Changes to This Privacy Policy
-
- We may update our Privacy Policy from time to time. We will notify you of any changes by posting the new Privacy Policy on this page and updating the "Last updated" date at the top of this Privacy Policy.
-
-
- You are advised to review this Privacy Policy periodically for any changes. Changes to this Privacy Policy are effective when they are posted on this page.
-
-
-
-
-
12. Contact Us
-
- If you have any questions about this Privacy Policy, please contact us through our GitHub repository or official communication channels.
-
-
-
-
-
-
-
-
- );
+ return (
+
+
+
+ Privacy Policy
+
+
+ Last updated: October 21, 2025
+
+
+
+
1. Introduction
+
+ React Foundation ("we", "our", or "us") is committed to protecting your privacy. This Privacy Policy explains how we collect, use, disclose, and safeguard your information when you visit our website and use our services.
+
+
+ Please read this Privacy Policy carefully. If you do not agree with the terms of this Privacy Policy, please do not access the site.
+
+
+
+
+
2. Information We Collect
+
+
2.1 Personal Information
+
+ When you authenticate using GitHub or GitLab OAuth, we collect:
+
+
+
Your name
+
Your email address
+
Your GitHub or GitLab username
+
Your public profile information from the respective platform
+
+
+
2.2 Local Storage
+
+ We use browser local storage to save your contributor username preference for convenience. This data is stored only on your device and is not transmitted to our servers.
+
+
+
2.3 Session Data
+
+ We use session cookies to maintain your authenticated state. These are essential for the functionality of the authentication system.
+
+
+
+
+
3. How We Use Your Information
+
+ We use the information we collect in the following ways:
+
+
+
To provide, operate, and maintain our website
+
To authenticate and authorize your access to features
+
To display your contributor status and progress
+
To personalize your experience on our website
+
To communicate with you about updates and announcements
+
+
+
+
+
4. Data Sharing and Disclosure
+
+ We do not share, sell, rent, or trade your personal information with third parties for their commercial purposes.
+
+
+ We may share information only in the following limited circumstances:
+
+
+
Service Providers: We use third-party services (GitHub, GitLab for authentication; Shopify for e-commerce) that may have access to your information to perform tasks on our behalf.
+
Legal Requirements: We may disclose your information if required to do so by law or in response to valid requests by public authorities.
+
+
+
+
+
5. Third-Party Services
+
+
5.1 Authentication
+
+ We use GitHub and GitLab OAuth for authentication. When you authenticate, you are subject to their respective privacy policies:
+
+ Our online store is powered by Shopify. When you make a purchase, Shopify collects and processes your payment and shipping information. Please review Shopify's Privacy Policy for more information.
+
+
+
+
+
6. Tracking and Analytics
+
+ We do not use any tracking technologies, analytics tools, or third-party advertising services. We do not track your browsing behavior across websites or collect data for advertising purposes.
+
+
+
+
+
7. Data Security
+
+ We implement appropriate technical and organizational security measures to protect your personal information. However, please note that no method of transmission over the internet or method of electronic storage is 100% secure.
+
+
+ Your authentication is handled by NextAuth.js, a secure authentication library, and we rely on GitHub and GitLab's OAuth implementations for secure authentication.
+
+
+
+
+
8. Data Retention
+
+ We retain your personal information only for as long as necessary to provide you with our services and as described in this Privacy Policy. Session data is retained only for the duration of your authenticated session.
+
+
+
+
+
9. Your Rights
+
+ You have the right to:
+
+
+
Access the personal information we hold about you
+
Request correction of inaccurate information
+
Request deletion of your personal information
+
Revoke OAuth access through your GitHub or GitLab account settings
+
Clear local storage data stored in your browser
+
+
+
+
+
10. Children's Privacy
+
+ Our Service does not address anyone under the age of 13. We do not knowingly collect personally identifiable information from children under 13. If you are a parent or guardian and you are aware that your child has provided us with personal information, please contact us.
+
+
+
+
+
11. Changes to This Privacy Policy
+
+ We may update our Privacy Policy from time to time. We will notify you of any changes by posting the new Privacy Policy on this page and updating the "Last updated" date at the top of this Privacy Policy.
+
+
+ You are advised to review this Privacy Policy periodically for any changes. Changes to this Privacy Policy are effective when they are posted on this page.
+
+
+
+
+
12. Contact Us
+
+ If you have any questions about this Privacy Policy, please contact us through our GitHub repository or official communication channels.
+
+
+
+
+
+
+ );
}
diff --git a/src/app/terms/page.tsx b/src/app/terms/page.tsx
index 1392c53..316654f 100644
--- a/src/app/terms/page.tsx
+++ b/src/app/terms/page.tsx
@@ -1,114 +1,113 @@
/* eslint-disable react/no-unescaped-entities */
import type { Metadata } from "next";
-import { Footer } from "@/components/layout/footer";
+
+import { Panel } from "@/components/panels/panel";
+import { PanelsFooter } from "@/components/panels/panels-footer";
export const metadata: Metadata = {
- title: "Terms of Service",
- description: "Terms of Service for React Foundation",
+ title: "Terms of Service",
+ description: "Terms of Service for React Foundation",
};
export default function TermsPage() {
- return (
-
-
-
-
-
-
-
-
Terms of Service
-
- Last updated: October 21, 2025
-
+ return (
+
+
+
+ Terms of Service
+
+
+ Last updated: October 21, 2025
+
-
-
-
1. Acceptance of Terms
-
- By accessing and using the React Foundation website (the "Service"), you accept and agree to be bound by the terms and provision of this agreement. If you do not agree to these Terms of Service, please do not use the Service.
-
-
+
+
1. Acceptance of Terms
+
+ By accessing and using the React Foundation website (the "Service"), you accept and agree to be bound by the terms and provision of this agreement. If you do not agree to these Terms of Service, please do not use the Service.
+
+
-
-
2. Description of Service
-
- React Foundation provides a platform to support the React ecosystem through community funding, transparent governance, and official merchandise. The Service includes:
-
-
-
Information about React Foundation and its mission
-
An online store for official React Foundation merchandise
-
User authentication via GitHub and GitLab
-
Contributor progress tracking and status information
-
Community updates and announcements
-
-
+
+
2. Description of Service
+
+ React Foundation provides a platform to support the React ecosystem through community funding, transparent governance, and official merchandise. The Service includes:
+
+
+
Information about React Foundation and its mission
+
An online store for official React Foundation merchandise
+
User authentication via GitHub and GitLab
+
Contributor progress tracking and status information
+
Community updates and announcements
+
+
-
-
3. User Accounts
-
- To access certain features of the Service, you may be required to authenticate using your GitHub or GitLab account. You are responsible for maintaining the confidentiality of your account credentials and for all activities that occur under your account.
-
-
+
+
3. User Accounts
+
+ To access certain features of the Service, you may be required to authenticate using your GitHub or GitLab account. You are responsible for maintaining the confidentiality of your account credentials and for all activities that occur under your account.
+
+
-
-
4. Acceptable Use
-
- You agree to use the Service only for lawful purposes and in a way that does not infringe the rights of, restrict, or inhibit anyone else's use and enjoyment of the Service. Prohibited behavior includes:
-
-
-
Harassing or causing distress or inconvenience to any other user
-
Transmitting obscene or offensive content
-
Disrupting the normal flow of dialogue within the Service
-
Attempting to gain unauthorized access to the Service or its systems
-
-
+
+
4. Acceptable Use
+
+ You agree to use the Service only for lawful purposes and in a way that does not infringe the rights of, restrict, or inhibit anyone else's use and enjoyment of the Service. Prohibited behavior includes:
+
+
+
Harassing or causing distress or inconvenience to any other user
+
Transmitting obscene or offensive content
+
Disrupting the normal flow of dialogue within the Service
+
Attempting to gain unauthorized access to the Service or its systems
+
+
-
-
5. Intellectual Property
-
- The Service and its original content, features, and functionality are owned by React Foundation and are protected by international copyright, trademark, patent, trade secret, and other intellectual property laws. The React logo and other marks are trademarks of Meta Platforms, Inc., and are used with permission.
-
-
+
+
5. Intellectual Property
+
+ The Service and its original content, features, and functionality are owned by React Foundation and are protected by international copyright, trademark, patent, trade secret, and other intellectual property laws. The React logo and other marks are trademarks of Meta Platforms, Inc., and are used with permission.
+
+
-
-
6. Purchases and Payment
-
- If you wish to purchase any product or service made available through the Service, you may be asked to supply certain information relevant to your purchase. Payment processing is handled by third-party payment processors. We are not responsible for the security of payment information submitted to these third parties.
-
-
+
+
6. Purchases and Payment
+
+ If you wish to purchase any product or service made available through the Service, you may be asked to supply certain information relevant to your purchase. Payment processing is handled by third-party payment processors. We are not responsible for the security of payment information submitted to these third parties.
+
+
-
-
7. Limitation of Liability
-
- In no event shall React Foundation, nor its directors, employees, partners, agents, suppliers, or affiliates, be liable for any indirect, incidental, special, consequential, or punitive damages, including without limitation, loss of profits, data, use, goodwill, or other intangible losses, resulting from your access to or use of or inability to access or use the Service.
-
-
+
+
7. Limitation of Liability
+
+ In no event shall React Foundation, nor its directors, employees, partners, agents, suppliers, or affiliates, be liable for any indirect, incidental, special, consequential, or punitive damages, including without limitation, loss of profits, data, use, goodwill, or other intangible losses, resulting from your access to or use of or inability to access or use the Service.
+
+
-
-
8. Disclaimer
-
- Your use of the Service is at your sole risk. The Service is provided on an "AS IS" and "AS AVAILABLE" basis. The Service is provided without warranties of any kind, whether express or implied, including, but not limited to, implied warranties of merchantability, fitness for a particular purpose, non-infringement, or course of performance.
-
-
+
+
8. Disclaimer
+
+ Your use of the Service is at your sole risk. The Service is provided on an "AS IS" and "AS AVAILABLE" basis. The Service is provided without warranties of any kind, whether express or implied, including, but not limited to, implied warranties of merchantability, fitness for a particular purpose, non-infringement, or course of performance.
+
+
-
-
9. Changes to Terms
-
- We reserve the right, at our sole discretion, to modify or replace these Terms at any time. If a revision is material, we will provide at least 30 days' notice prior to any new terms taking effect. What constitutes a material change will be determined at our sole discretion.
-
-
+
+
9. Changes to Terms
+
+ We reserve the right, at our sole discretion, to modify or replace these Terms at any time. If a revision is material, we will provide at least 30 days' notice prior to any new terms taking effect. What constitutes a material change will be determined at our sole discretion.
+
+
-
-
10. Contact Information
-
- If you have any questions about these Terms of Service, please contact us through our GitHub repository or official communication channels.
-
-
-
-
-
+
+
10. Contact Information
+
+ If you have any questions about these Terms of Service, please contact us through our GitHub repository or official communication channels.
+
);
}
diff --git a/src/components/communities/CommunityList.tsx b/src/components/communities/CommunityList.tsx
index 8ab0392..6f57535 100644
--- a/src/components/communities/CommunityList.tsx
+++ b/src/components/communities/CommunityList.tsx
@@ -1,6 +1,6 @@
/**
* Community List Component
- * List view of communities with cards
+ * List view of communities with ruled rows
*/
'use client';
@@ -8,8 +8,8 @@
import useSWR from 'swr';
import Link from 'next/link';
import { useSearchParams } from 'next/navigation';
-import { getCommunityHostLabel } from '@/lib/community-host';
-import { VerificationBadge } from './VerificationBadge';
+import type { ReactNode } from 'react';
+import { RowArrow, RowList } from '@/components/panels/panel';
import type { Community } from '@/types/community';
// Fetcher for SWR
@@ -135,9 +135,9 @@ export function CommunityList() {
if (isLoading) {
return (
-
+
{[1, 2, 3].map((i) => (
-
+
))}
);
@@ -145,162 +145,116 @@ export function CommunityList() {
if (error) {
return (
-
);
}
-function CommunityCard({ community }: { community: Community }) {
- const tierBadge = getTierBadge(community.cois_tier);
-
+/*
+ * Not the shared Row: the row hosts secondary external links, and anchors
+ * cannot nest inside the Row anchor, so the hover surface is a div and the
+ * detail link wraps only the title block and the trailing arrow.
+ */
+function CommunityRow({ community }: { community: Community }) {
+ const detailHref = `/communities/${community.slug}`;
return (
-
- Join the movement to sustain and grow the React ecosystem. Contribute code,
- organize communities, create educational content, or support financially —
- every pathway helps build a stronger ecosystem.
-
-
+
+ Become a contributor
+
+ Contribute code, organize communities, create educational content, or support
+ financially. Every pathway helps sustain and grow the React ecosystem.
+
-
- You know, every so often, something comes along in software that changes not
- just how we build — but why we build.
-
-
-
React did that.
-
-
- It gave us more than a way to render UIs. It gave us a new way to think —
- about composition, about state, about expressing ideas. But even more than
- that, it gave us a new way to connect with one another.
-
-
-
- From the very beginning, React has been about people. About curiosity shared
- in the open. About mentorship that crosses companies, countries, and time
- zones. About a community that believes — deeply — that if we help others
- bring their ideas to life, ours will follow.
-
-
-
- That belief has powered one of the most influential movements in modern
- software history. React has shaped how the web is built, how mobile is built,
- even how we as developers think about creativity itself. And yet, for all its
- reach and impact, its heart has never changed: it's still about people
- building together.
-
-
-
That's why we created the React Foundation.
-
-
- The Foundation exists to make sure React's future is independent,
- community-driven, and open — forever. It's here to protect the culture
- that brought us all this way, and to nurture what comes next: the next
- generation of maintainers, educators, experimenters, and dreamers.
-
-
-
- We're doing that by working hand-in-hand with incredible partners —
- Meta, Microsoft, Amazon, Vercel, Expo, Callstack, Software Mansion, and many
- more — but more importantly, by working with you, the global community of
- developers who make React what it is.
-
-
-
-
- Because this isn't just about governance. It's about legacy.
-
- It's about ensuring that the ideas we build together endure.
-
-
-
-
- I've had the privilege of leading React at Meta for many years, and now,
- as the Executive Director of the React Foundation, I carry the same North Star
- that's guided me all along: helping others bring their ideas to life.
-
-
-
- If React has ever inspired you — to learn, to teach, to build, to share —
- then you are already part of this story. The Foundation is here to help that
- story grow, together.
-
-
-
- Thank you for everything you've built so far — and for everything
- you're about to.
-
-
-
- Let's make the next chapter one that lasts for generations.
-
-
-
-
-
-
Seth Webster
-
Executive Director, React Foundation
-
-
-
-
+
+ A message from our executive director
+
+
+
+
+
+
+ You know, every so often, something comes along in software that changes not
+ just how we build — but why we build.
+
+
+
+
React did that.
+
+
+ It gave us more than a way to render UIs. It gave us a new way to think —
+ about composition, about state, about expressing ideas. But even more than
+ that, it gave us a new way to connect with one another.
+
+
+
+ From the very beginning, React has been about people. About curiosity shared
+ in the open. About mentorship that crosses companies, countries, and time
+ zones. About a community that believes — deeply — that if we help others
+ bring their ideas to life, ours will follow.
+
+
+
+ That belief has powered one of the most influential movements in modern
+ software history. React has shaped how the web is built, how mobile is built,
+ even how we as developers think about creativity itself. And yet, for all its
+ reach and impact, its heart has never changed: it's still about people
+ building together.
+
+
+
That's why we created the React Foundation.
+
+
+ The Foundation exists to make sure React's future is independent,
+ community-driven, and open — forever. It's here to protect the culture
+ that brought us all this way, and to nurture what comes next: the next
+ generation of maintainers, educators, experimenters, and dreamers.
+
+
+
+ We're doing that by working hand-in-hand with incredible partners —
+ Meta, Microsoft, Amazon, Vercel, Expo, Callstack, Software Mansion, and many
+ more — but more importantly, by working with you, the global community of
+ developers who make React what it is.
+
+
+
+
+ Because this isn't just about governance. It's about legacy.
+
+ It's about ensuring that the ideas we build together endure.
+
+
+
+
+ I've had the privilege of leading React at Meta for many years, and now,
+ as the Executive Director of the React Foundation, I carry the same North Star
+ that's guided me all along: helping others bring their ideas to life.
+
+
+
+ If React has ever inspired you — to learn, to teach, to build, to share —
+ then you are already part of this story. The Foundation is here to help that
+ story grow, together.
+
+
+
+ Thank you for everything you've built so far — and for everything
+ you're about to.
+
+
+
+ Let's make the next chapter one that lasts for generations.
+
+
+ Founding members
+
+ We're grateful to our founding members who believe in sustaining the React
+ ecosystem and supporting open source maintainers.
+
+
+
+ The React Foundation funds the work that keeps React healthy: maintenance,
+ documentation, teaching, and the communities around it. Thousands of
+ contributors already pitch in. Join them.
+
+
+
+ Get Involved
+
+
+ Learn Our Story
+
+ Shop to Support
+
+
+ React now belongs to its community, not any single company. The foundation
+ exists to make that permanent: funded
+ maintainers, solid documentation, and places where the next generation of React
+ developers learns.
+
+
+ );
+}
diff --git a/src/components/home/panels/panel-pillars.tsx b/src/components/home/panels/panel-pillars.tsx
new file mode 100644
index 0000000..a856055
--- /dev/null
+++ b/src/components/home/panels/panel-pillars.tsx
@@ -0,0 +1,53 @@
+import { BookOpen, Globe, HandHeart } from "lucide-react";
+
+import { Panel, PanelEyebrow, PanelSub, Row, RowArrow, RowList, RowRight } from "@/components/panels/panel";
+import type { ContentRow } from "@/components/panels/types";
+
+const PILLARS: ContentRow[] = [
+ {
+ icon: HandHeart,
+ title: "Fund Maintainers",
+ description:
+ "Direct financial support for the developers who maintain the libraries you depend on every day.",
+ cta: { label: "See Impact", href: "/impact" },
+ },
+ {
+ icon: BookOpen,
+ title: "Education & Resources",
+ description:
+ "Tutorials, documentation, workshops, and learning materials that help developers master React.",
+ cta: { label: "Learn More", href: "/impact" },
+ },
+ {
+ icon: Globe,
+ title: "Global Accessibility",
+ description:
+ "React stays free and learnable for developers everywhere, regardless of location, background, or resources.",
+ cta: { label: "Our Commitment", href: "/impact" },
+ },
+];
+
+export function PanelPillars() {
+ return (
+
+ What we fund
+ Every contribution lands in one of three programs.
+
+ {PILLARS.map((pillar) => (
+
+
+
+
{pillar.title}
+
+ {pillar.description}
+
+
+
+ {pillar.cta.label}
+
+
+ ))}
+
+
+ );
+}
diff --git a/src/components/layout/header.tsx b/src/components/layout/header.tsx
index 6162f5e..ce0ff57 100644
--- a/src/components/layout/header.tsx
+++ b/src/components/layout/header.tsx
@@ -18,6 +18,23 @@ export function Header() {
const [isAdmin, setIsAdmin] = useState(false);
const isStorePage = pathname?.startsWith("/store");
const isComingSoonPage = pathname === "/coming-soon";
+ // Redesigned foundation routes render the header as a floating panel; store,
+ // admin, profile, and coming-soon keep the classic bar until their own pass.
+ const PANELS_ROUTE_PREFIXES = [
+ "/about",
+ "/impact",
+ "/libraries",
+ "/updates",
+ "/authors",
+ "/communities",
+ "/become-a-member",
+ "/privacy",
+ "/terms",
+ "/auth",
+ ];
+ const isPanelsRoute =
+ pathname === "/" ||
+ PANELS_ROUTE_PREFIXES.some((prefix) => pathname?.startsWith(prefix));
// Check admin status when user session changes
useEffect(() => {
@@ -45,33 +62,61 @@ export function Header() {
}, [session?.user?.email]);
return (
-
-
+
+
{/* Logo */}
-
-
-
+ {isPanelsRoute ? (
+
+
-
-
-
-
-
- React Foundation
-
-
- {isStorePage ? "Official Store" : "Supporting the Ecosystem"}
-
-
+
+
React Foundation
+
+ ) : (
+
+
+
+
+
+
+
+
+
+ React Foundation
+
+
+ {isStorePage ? "Official Store" : "Supporting the Ecosystem"}
+
+
+
-
+ )}
{/* Desktop Navigation (hidden on mobile) */}
@@ -79,29 +124,29 @@ export function Header() {
{isStorePage ? (
// Store navigation
<>
-
+
Collections
-
+
Limited Drops
-
+
Impact
>
) : (
// Foundation navigation
<>
-
+
About
-
+
Updates
-
+
Impact
-
+
Communities
{isAdmin && (
@@ -150,6 +195,14 @@ export function Header() {
href="/profile"
className="transition hover:border-primary/50 hover:shadow-lg hover:shadow-primary/20"
/>
+ ) : isPanelsRoute ? (
+ // Ink button per the panels language; `!` outranks the unlayered `a.inline-flex { color: currentColor }` rule.
+
+ Sign in
+
) : (
Sign in
diff --git a/src/components/panels/panel.tsx b/src/components/panels/panel.tsx
new file mode 100644
index 0000000..1a14398
--- /dev/null
+++ b/src/components/panels/panel.tsx
@@ -0,0 +1,236 @@
+import Link from "next/link";
+import type { ReactNode } from "react";
+
+import { cn } from "@/lib/cn";
+import type { PanelTone } from "./types";
+
+/*
+ * Panel surfaces keep constant colors in both themes; only the page gutter is
+ * theme-aware. Tone-specific row/eyebrow colors flow down as CSS variables so
+ * the row primitives stay tone-agnostic, mirroring the prototype's CSS.
+ */
+const TONE_CLASSES: Record = {
+ cyan: cn(
+ "bg-[#58C4DC]",
+ "[--panel-rule:rgba(22,24,29,0.2)]",
+ "[--panel-hover:rgba(255,255,255,0.25)]",
+ "[--panel-eyebrow:rgba(22,24,29,0.65)]",
+ "[--panel-sub:rgba(22,24,29,0.7)]",
+ ),
+ paper: cn(
+ "bg-[#F6F7F9]",
+ "[--panel-rule:#16181D]",
+ "[--panel-hover:#FFFFFF]",
+ "[--panel-eyebrow:#5E687E]",
+ "[--panel-sub:#5E687E]",
+ ),
+};
+
+const FOCUS_RING = cn(
+ "focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-solid focus-visible:outline-[#16181D]",
+);
+
+export function Panel({
+ tone,
+ id,
+ labelledBy,
+ compact = false,
+ className,
+ children,
+}: {
+ tone: PanelTone;
+ id?: string;
+ labelledBy: string;
+ compact?: boolean;
+ className?: string;
+ children: ReactNode;
+}) {
+ return (
+
+ {children}
+
+ );
+}
+
+export function PanelEyebrow({
+ id,
+ as: Tag = "h2",
+ children,
+}: {
+ id?: string;
+ as?: "h2" | "p";
+ children: ReactNode;
+}) {
+ return (
+
+ {children}
+
+ );
+}
+
+export function PanelSub({ children }: { children: ReactNode }) {
+ return
{children}
;
+}
+
+export function PanelActions({ children }: { children: ReactNode }) {
+ return