import { Link, useLocation } from 'react-router-dom' import { useLayoutEffect, Fragment, useState, type ReactNode } from 'react' import { ChevronRightIcon } from '@heroicons/react/24/outline' import { BUILD_PHASE, EXPLORE_BUILD_ID, EXPLORE_CAUSES_ID, EXPLORE_FIND_HELP_ID, EXPLORE_PLAN_ID, EXPLORE_PRIMARY_NAV, EXPLORE_SECTION_SCROLL_MARGIN_CLASS, EXPLORE_TRACK_DECISIONS_ID, FIND_HELP_SECTION, LEGACY_EXPLORE_HASH_REDIRECT, PLAN_DEFINE_SUCCESS_BY_BRANCH, PLAN_IDENTIFY_ALLIES_BY_BRANCH, PLAN_PATH_BRANCH_OPTIONS, TRACK_DECISIONS_SECTION, explorePlanSubsectionId, type ExploreCard, type PlanPathBranchId, } from '../data/exploreActionPhases' import { CAUSES } from '../data/causes' import { flyoutIcons } from '../data/homeQuickNavFlyouts' const CARD_CTA = 'Take the next step →' const PLAN_BRANCH_TAG_CLASS: Record = { personal: 'rounded-full bg-sky-100 px-3 py-0.5 text-xs font-semibold text-sky-900 ring-1 ring-sky-200', macro: 'rounded-full bg-amber-50 px-3 py-0.5 text-xs font-semibold text-amber-900 ring-1 ring-amber-200', professional: 'rounded-full bg-violet-50 px-3 py-0.5 text-xs font-semibold text-violet-900 ring-1 ring-violet-200', } const PLAN_SUP_TAG_CLASS: Record<'allies' | 'success', string> = { allies: 'rounded-full bg-sky-100 px-3 py-0.5 text-xs font-semibold text-sky-900 ring-1 ring-sky-200', success: 'rounded-full bg-sky-100 px-3 py-0.5 text-xs font-semibold text-sky-900 ring-1 ring-sky-200', } function scrollToExploreTarget(targetId: string) { document.getElementById(targetId)?.scrollIntoView({ behavior: 'smooth', block: 'start' }) } function ActionCard({ option, cta = CARD_CTA }: { option: ExploreCard; cta?: string }): ReactNode { const Icon = option.icon const isExternal = option.path.startsWith('http') const inner = (

{option.title}

{option.stats ? (

{option.stats}

) : null}

{option.description}

{cta}
) if (isExternal) { return ( {inner} ) } return {inner} } const CAUSE_ACCENT = ['#354F52', '#52796F', '#84A98C', '#2f5d62', '#52796F', '#354F52'] as const function CauseEntryCard({ cause, color }: { cause: (typeof CAUSES)[number]; color: string }) { const icon = flyoutIcons[cause.iconKey]() const isExternal = cause.to.startsWith('http') const inner = (
{icon}

{cause.label}

{cause.desc}

{cause.tag} {cause.hot ? ' 🔥' : ''}
{CARD_CTA}
) if (isExternal) { return ( {inner} ) } return ( {inner} ) } export default function Explore() { const location = useLocation() const [planBranch, setPlanBranch] = useState(null) useLayoutEffect(() => { const raw = location.hash.replace(/^#/, '') if (!raw) { window.scrollTo({ top: 0, behavior: 'auto' }) return } const targetId = LEGACY_EXPLORE_HASH_REDIRECT[raw] ?? raw requestAnimationFrame(() => { document.getElementById(targetId)?.scrollIntoView({ behavior: 'smooth', block: 'start' }) }) }, [location.pathname, location.hash]) return (

Take action

From information to impact

Start by choosing a cause, make a plan (learn the record, decide who to work with, then show up), find help when someone needs direct support, track the decisions that matter, and build on open data.

{EXPLORE_PRIMARY_NAV.map((step, i) => { const Icon = step.Icon const next = EXPLORE_PRIMARY_NAV[i + 1] return ( {next ? ( ) : null} ) })}

Start

Choose a cause

Pick where you are starting — each card sends you to search, services, or a formal route that fits.

Start here if you are new
{CAUSES.map((cause, i) => ( ))}

Plan

Make a plan

Choose Personal Path, Macro Path, or Professional Path{' '} (one at a time). Your Identify Allies and Define Success steps update from that choice.

Plan · Step 1 of 4

Choose your path

Select one branch below. You can switch anytime; only the allies and success tools for that branch are shown.

{PLAN_PATH_BRANCH_OPTIONS.map((opt) => { const selected = planBranch === opt.branch return ( ) })}
{planBranch ? ( <> {(() => { const opt = PLAN_PATH_BRANCH_OPTIONS.find((o) => o.branch === planBranch) if (!opt) return null return ( <>

Plan · Step 2 of 4

{opt.title}

{opt.subtitle}

{opt.tag}

{opt.cards.map((option) => ( ))}
) })()} ) : (

Choose Personal Path, Macro Path, or{' '} Professional Path to see your path resources and the Identify Allies and Define Success steps.

)}
{planBranch ? ( <>

Plan · Step 3 of 4

Identify Allies

{PLAN_IDENTIFY_ALLIES_BY_BRANCH[planBranch].subtitle}

Strategy

{PLAN_IDENTIFY_ALLIES_BY_BRANCH[planBranch].cards.map((option) => ( ))}

Plan · Step 4 of 4

Define Success

{PLAN_DEFINE_SUCCESS_BY_BRANCH[planBranch].subtitle}

Outcomes

{PLAN_DEFINE_SUCCESS_BY_BRANCH[planBranch].cards.map((option) => ( ))}
) : null}

Find

{FIND_HELP_SECTION.title}

{FIND_HELP_SECTION.subtitle}

{FIND_HELP_SECTION.cards.map((option) => ( ))}

Track

{TRACK_DECISIONS_SECTION.title}

{TRACK_DECISIONS_SECTION.subtitle}

{TRACK_DECISIONS_SECTION.cards.map((option) => ( ))}

Build

{BUILD_PHASE.title}

{BUILD_PHASE.subtitle}

{BUILD_PHASE.cards.map((option) => ( ))}

Need the raw files?

Bulk tables, APIs, and documentation for teams building their own workflows on top of the same data.

← Back to Home
) }