diff --git a/src/app/globals.css b/src/app/globals.css index 6cf72ed..c21e930 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -48,71 +48,71 @@ :root { --radius: 0.625rem; - --background: oklch(1 0 0); - --foreground: oklch(0.145 0 0); + --background: oklch(0.98 0.01 195); + --foreground: oklch(0.145 0.02 195); --card: oklch(1 0 0); - --card-foreground: oklch(0.145 0 0); + --card-foreground: oklch(0.145 0.02 195); --popover: oklch(1 0 0); - --popover-foreground: oklch(0.145 0 0); - --primary: oklch(0.205 0 0); - --primary-foreground: oklch(0.985 0 0); - --secondary: oklch(0.97 0 0); - --secondary-foreground: oklch(0.205 0 0); - --muted: oklch(0.97 0 0); - --muted-foreground: oklch(0.556 0 0); - --accent: oklch(0.97 0 0); - --accent-foreground: oklch(0.205 0 0); + --popover-foreground: oklch(0.145 0.02 195); + --primary: oklch(0.65 0.18 195); + --primary-foreground: oklch(0.98 0 0); + --secondary: oklch(0.85 0.08 280); + --secondary-foreground: oklch(0.2 0.02 280); + --muted: oklch(0.95 0.02 195); + --muted-foreground: oklch(0.45 0.05 195); + --accent: oklch(0.75 0.15 145); + --accent-foreground: oklch(0.15 0.02 145); --destructive: oklch(0.577 0.245 27.325); - --border: oklch(0.922 0 0); - --input: oklch(0.922 0 0); - --ring: oklch(0.708 0 0); - --chart-1: oklch(0.646 0.222 41.116); - --chart-2: oklch(0.6 0.118 184.704); - --chart-3: oklch(0.398 0.07 227.392); - --chart-4: oklch(0.828 0.189 84.429); - --chart-5: oklch(0.769 0.188 70.08); - --sidebar: oklch(0.985 0 0); - --sidebar-foreground: oklch(0.145 0 0); - --sidebar-primary: oklch(0.205 0 0); - --sidebar-primary-foreground: oklch(0.985 0 0); - --sidebar-accent: oklch(0.97 0 0); - --sidebar-accent-foreground: oklch(0.205 0 0); - --sidebar-border: oklch(0.922 0 0); - --sidebar-ring: oklch(0.708 0 0); + --border: oklch(0.88 0.04 195); + --input: oklch(0.92 0.02 195); + --ring: oklch(0.65 0.18 195); + --chart-1: oklch(0.65 0.18 195); + --chart-2: oklch(0.7 0.15 145); + --chart-3: oklch(0.65 0.12 280); + --chart-4: oklch(0.75 0.18 85); + --chart-5: oklch(0.7 0.2 30); + --sidebar: oklch(0.98 0.01 195); + --sidebar-foreground: oklch(0.145 0.02 195); + --sidebar-primary: oklch(0.65 0.18 195); + --sidebar-primary-foreground: oklch(0.98 0 0); + --sidebar-accent: oklch(0.92 0.04 195); + --sidebar-accent-foreground: oklch(0.2 0.02 195); + --sidebar-border: oklch(0.88 0.04 195); + --sidebar-ring: oklch(0.65 0.18 195); } .dark { - --background: oklch(0.145 0 0); - --foreground: oklch(0.985 0 0); - --card: oklch(0.205 0 0); - --card-foreground: oklch(0.985 0 0); - --popover: oklch(0.205 0 0); - --popover-foreground: oklch(0.985 0 0); - --primary: oklch(0.922 0 0); - --primary-foreground: oklch(0.205 0 0); - --secondary: oklch(0.269 0 0); - --secondary-foreground: oklch(0.985 0 0); - --muted: oklch(0.269 0 0); - --muted-foreground: oklch(0.708 0 0); - --accent: oklch(0.269 0 0); - --accent-foreground: oklch(0.985 0 0); + --background: oklch(0.12 0.02 195); + --foreground: oklch(0.95 0.01 195); + --card: oklch(0.18 0.02 195); + --card-foreground: oklch(0.95 0.01 195); + --popover: oklch(0.18 0.02 195); + --popover-foreground: oklch(0.95 0.01 195); + --primary: oklch(0.75 0.18 195); + --primary-foreground: oklch(0.12 0.02 195); + --secondary: oklch(0.35 0.08 280); + --secondary-foreground: oklch(0.95 0.01 280); + --muted: oklch(0.25 0.02 195); + --muted-foreground: oklch(0.65 0.05 195); + --accent: oklch(0.6 0.15 145); + --accent-foreground: oklch(0.95 0.01 145); --destructive: oklch(0.704 0.191 22.216); - --border: oklch(1 0 0 / 10%); - --input: oklch(1 0 0 / 15%); - --ring: oklch(0.556 0 0); - --chart-1: oklch(0.488 0.243 264.376); - --chart-2: oklch(0.696 0.17 162.48); - --chart-3: oklch(0.769 0.188 70.08); - --chart-4: oklch(0.627 0.265 303.9); - --chart-5: oklch(0.645 0.246 16.439); - --sidebar: oklch(0.205 0 0); - --sidebar-foreground: oklch(0.985 0 0); - --sidebar-primary: oklch(0.488 0.243 264.376); - --sidebar-primary-foreground: oklch(0.985 0 0); - --sidebar-accent: oklch(0.269 0 0); - --sidebar-accent-foreground: oklch(0.985 0 0); - --sidebar-border: oklch(1 0 0 / 10%); - --sidebar-ring: oklch(0.556 0 0); + --border: oklch(0.3 0.04 195); + --input: oklch(0.25 0.02 195); + --ring: oklch(0.75 0.18 195); + --chart-1: oklch(0.75 0.18 195); + --chart-2: oklch(0.7 0.15 145); + --chart-3: oklch(0.65 0.12 280); + --chart-4: oklch(0.75 0.18 85); + --chart-5: oklch(0.7 0.2 30); + --sidebar: oklch(0.15 0.02 195); + --sidebar-foreground: oklch(0.95 0.01 195); + --sidebar-primary: oklch(0.75 0.18 195); + --sidebar-primary-foreground: oklch(0.12 0.02 195); + --sidebar-accent: oklch(0.25 0.04 195); + --sidebar-accent-foreground: oklch(0.95 0.01 195); + --sidebar-border: oklch(0.3 0.04 195); + --sidebar-ring: oklch(0.75 0.18 195); } @layer base { diff --git a/src/app/page.tsx b/src/app/page.tsx index f4f94f3..a1a5979 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -19,6 +19,9 @@ import { CheckCircle, Shield, Play, + ListOrdered, + Target, + Layers, } from "lucide-react"; export default async function HomePage() { @@ -76,85 +79,92 @@ export default async function HomePage() { return (
{/* Hero section */} -
- - Quadratic Voting for Communities +
+
+
+
+ + + Part of the rSpace Ecosystem

- Democratic Governance,{" "} - Reimagined + Democratic Backlog{" "} + Prioritization

- rVote uses quadratic voting to give every voice weight while preventing - any single actor from dominating. Proposals are ranked by the community, - and the best ideas rise to the top. + rVote uses quadratic ranking to let your community democratically + prioritize proposals. The best ideas rise to the top through collective intelligence, + then advance to final voting.

- {!session?.user ? ( - ) : ( - )}
- {/* What is Quadratic Voting */} + {/* What is Quadratic Ranking */}
-

What is Quadratic Voting?

+ The Core Concept +

What is Quadratic Ranking?

- A voting system where the cost of each additional vote increases - quadratically, making it expensive to dominate but cheap to participate. + A system where expressing strong preference costs progressively more, + creating a fair and balanced priority list that reflects true community consensus.

- + - - The Problem with Traditional Voting + + The Problem

- In traditional systems, those with more resources (time, money, - influence) can easily dominate outcomes. + Traditional priority systems let those with more time, resources, or influence + dominate what gets attention.

    -
  • One vote per person ignores intensity of preference
  • -
  • Unlimited voting lets whales control results
  • -
  • Small voices get drowned out
  • +
  • Loudest voices set the agenda
  • +
  • Important but less flashy ideas get buried
  • +
  • No way to express intensity of preference
  • +
  • Backlogs become political battlegrounds
- + - The Quadratic Solution + The Solution: Quadratic Ranking

- Quadratic voting balances participation and conviction by making + Quadratic ranking balances participation and conviction by making additional votes progressively more expensive.

    -
  • 1 vote = 1 credit, 2 votes = 4 credits, 3 = 9
  • +
  • 1 vote = 1 credit, 2 votes = 4, 3 = 9
  • +
  • Everyone can participate meaningfully
  • Express strong opinions, but at a cost
  • -
  • More voices, more balanced outcomes
  • +
  • Naturally surfaces community consensus
@@ -169,73 +179,77 @@ export default async function HomePage() { {[1, 2, 3, 4, 5].map((votes) => (
{votes}
vote{votes > 1 ? "s" : ""}
-
{votes * votes}
+
{votes * votes}
credits
))}

- It's more efficient to spread votes across proposals you support - than to concentrate them on one. + Spreading votes across proposals you support is more efficient than concentrating on one.

- {/* How it works - 2 stages */} -
+ {/* How it creates a democratic backlog */} +
-

Two-Stage Voting Process

+ How It Works +

From Chaos to Consensus

- Proposals go through ranking before reaching a final vote, ensuring - only well-supported ideas get full consideration. + Transform your community's ideas into a democratically prioritized backlog + through two simple stages.

- +
-
- 1 +
+
- Stage 1 - Ranking + Stage 1 + Quadratic Ranking
  • - - Proposals start here + + All proposals enter the ranking pool
  • - + Upvote/downvote with quadratic cost
  • - + Votes decay over 30-60 days
  • +
  • + + Creates a living priority queue +
- +
-
- +
+
- + Threshold Score +100 @@ -244,44 +258,48 @@ export default async function HomePage() {

- When a proposal reaches a score of +100, it + When a proposal reaches a score of +100, it automatically advances to the final voting stage.

This ensures only proposals with genuine community support move - forward. + forward for implementation decisions.

- +
-
- 2 +
+
- + Stage 2 - Pass/Fail + Pass/Fail Vote
  • - + Yes / No / Abstain voting
  • - + One member = one vote
  • - + 7-day voting period
  • +
  • + + Majority decides implementation +
@@ -291,14 +309,15 @@ export default async function HomePage() { {/* Features */}
-

Built for Fair Governance

+

Built for Fair Prioritization

+

Everything you need for democratic backlog management

- + -
- +
+

Earn Credits Daily

@@ -307,10 +326,10 @@ export default async function HomePage() { - + -

- +
+

Vote Decay

@@ -319,10 +338,10 @@ export default async function HomePage() { - + -

- +
+

Sybil Resistant

@@ -331,10 +350,10 @@ export default async function HomePage() { - + -

- +
+

Auto Promotion

@@ -349,27 +368,27 @@ export default async function HomePage() { {(rankingCount > 0 || userCount > 1) && (

- + -
{userCount}
+
{userCount}

Members

- + -
{rankingCount}
+
{rankingCount}

Being Ranked

- + -
{votingCount}
+
{votingCount}

In Voting

- + -
{passedCount}
+
{passedCount}

Passed

@@ -382,7 +401,7 @@ export default async function HomePage() {

Active Proposals

- {!session?.user && ( -