This repository was archived by the owner on Jul 6, 2026. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 144
Add Users page showcasing PolicyEngine user organizations #2717
Closed
Closed
Changes from 1 commit
Commits
Show all changes
13 commits
Select commit
Hold shift + click to select a range
387e57d
Add Users page showcasing PolicyEngine user organizations
MaxGhenis 60680e4
Add animated logo collage hero section to Users page
MaxGhenis deffd23
Add complete set of user organization logos
MaxGhenis 2eacef3
Fix logo display to show all 14 organizations and improve transparency
MaxGhenis e3eb183
Replace placeholder logos with actual organization logos
MaxGhenis 39c2cee
Complete overhaul of users page with all homepage organizations
MaxGhenis 6f9f5d9
Add Colorado Fiscal Institute and Gary Community Ventures, fix animat…
MaxGhenis 5379774
Use actual Colorado Fiscal Institute logo
MaxGhenis 334b7d2
Add University of Warwick and King's College London
MaxGhenis e525945
Add Institute of Economic Affairs (IEA)
MaxGhenis 0c8ceca
Fix formatting issues for CI
MaxGhenis 2f06057
Add Policy Simulation Library, Beeck Center, and Better Government Lab
MaxGhenis 0ecc15a
Update with actual logos for PSL, Beeck Center, and Better Government…
MaxGhenis File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,104 @@ | ||
| // User organizations that have used PolicyEngine for policy analysis and research | ||
|
|
||
| import NiskanenCenter from "../images/logos/users/niskanen-center.png"; | ||
| import JEC from "../images/logos/users/jec.png"; | ||
| import NBER from "../images/logos/users/nber.png"; | ||
| import Georgetown from "../images/logos/users/georgetown.png"; | ||
| import UMichigan from "../images/logos/users/umich.png"; | ||
| import USC from "../images/logos/users/usc.png"; | ||
| import UHawaii from "../images/logos/users/hawaii.png"; | ||
| import PN3Policy from "../images/logos/users/pn3policy.png"; | ||
| import NewYorkSenate from "../images/logos/users/ny-senate.png"; | ||
| import MarylandChildAlliance from "../images/logos/users/mca.jpg"; | ||
|
|
||
| export const users = [ | ||
| { | ||
| id: "niskanen-center", | ||
| name: "Niskanen Center", | ||
| logo: NiskanenCenter, | ||
| website: "https://www.niskanencenter.org/", | ||
| description: | ||
| "A center-right think tank focused on pragmatic policy solutions", | ||
| category: "think-tank", | ||
| }, | ||
| { | ||
| id: "joint-economic-committee", | ||
| name: "Joint Economic Committee", | ||
| logo: JEC, | ||
| website: "https://www.jec.senate.gov/", | ||
| description: "A bipartisan committee of the U.S. Congress", | ||
| category: "government", | ||
| }, | ||
| { | ||
| id: "nber", | ||
| name: "National Bureau of Economic Research", | ||
| logo: NBER, | ||
| website: "https://www.nber.org/", | ||
| description: "America's leading nonprofit economic research organization", | ||
| category: "research", | ||
| }, | ||
| { | ||
| id: "georgetown", | ||
| name: "Georgetown University", | ||
| logo: Georgetown, | ||
| website: "https://www.georgetown.edu/", | ||
| description: "Leading research university with expertise in public policy", | ||
| category: "academic", | ||
| }, | ||
| { | ||
| id: "university-michigan", | ||
| name: "University of Michigan", | ||
| logo: UMichigan, | ||
| website: "https://umich.edu/", | ||
| description: "Public research university with renowned economics programs", | ||
| category: "academic", | ||
| }, | ||
| { | ||
| id: "usc", | ||
| name: "University of Southern California", | ||
| logo: USC, | ||
| website: "https://www.usc.edu/", | ||
| description: "Private research university with strong policy programs", | ||
| category: "academic", | ||
| }, | ||
| { | ||
| id: "university-hawaii", | ||
| name: "University of Hawaii", | ||
| logo: UHawaii, | ||
| website: "https://www.hawaii.edu/", | ||
| description: "State university system focused on policy research", | ||
| category: "academic", | ||
| }, | ||
| { | ||
| id: "prenatal-to-3-policy-impact-center", | ||
| name: "Prenatal-to-3 Policy Impact Center", | ||
| logo: PN3Policy, | ||
| website: "https://pn3policy.org/", | ||
| description: "Research center focused on early childhood policy", | ||
| category: "research", | ||
| }, | ||
| { | ||
| id: "new-york-senate", | ||
| name: "New York Senate", | ||
| logo: NewYorkSenate, | ||
| website: "https://www.nysenate.gov/", | ||
| description: "Upper chamber of the New York State Legislature", | ||
| category: "government", | ||
| }, | ||
| { | ||
| id: "maryland-child-alliance", | ||
| name: "Maryland Child Alliance", | ||
| logo: MarylandChildAlliance, | ||
| website: "https://www.marylandchildalliance.org/", | ||
| description: "Advocacy organization for children and families in Maryland", | ||
| category: "advocacy", | ||
| }, | ||
| ]; | ||
|
|
||
| export const userCategories = { | ||
| government: "Government Agencies", | ||
| "think-tank": "Think Tanks", | ||
| research: "Research Organizations", | ||
| academic: "Academic Institutions", | ||
| advocacy: "Advocacy Organizations", | ||
| }; |
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| @@ -0,0 +1,200 @@ | ||||||||||||||||||||||||||||||||
| import Header from "../layout/Header.jsx"; | ||||||||||||||||||||||||||||||||
| import Footer from "../layout/Footer.jsx"; | ||||||||||||||||||||||||||||||||
| import Section from "../layout/Section.jsx"; | ||||||||||||||||||||||||||||||||
| import style from "../style/index.js"; | ||||||||||||||||||||||||||||||||
| import PageHeader from "../layout/PageHeader.jsx"; | ||||||||||||||||||||||||||||||||
| import { users, userCategories } from "../data/users.js"; | ||||||||||||||||||||||||||||||||
| import useDisplayCategory from "../hooks/useDisplayCategory.js"; | ||||||||||||||||||||||||||||||||
| import { Helmet } from "react-helmet"; | ||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||
| export default function Users() { | ||||||||||||||||||||||||||||||||
| // Group users by category | ||||||||||||||||||||||||||||||||
| const usersByCategory = users.reduce((acc, user) => { | ||||||||||||||||||||||||||||||||
| if (!acc[user.category]) { | ||||||||||||||||||||||||||||||||
| acc[user.category] = []; | ||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||
| acc[user.category].push(user); | ||||||||||||||||||||||||||||||||
| return acc; | ||||||||||||||||||||||||||||||||
| }, {}); | ||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||
| return ( | ||||||||||||||||||||||||||||||||
| <> | ||||||||||||||||||||||||||||||||
| <Helmet> | ||||||||||||||||||||||||||||||||
| <title>Our Users | PolicyEngine</title> | ||||||||||||||||||||||||||||||||
| <meta | ||||||||||||||||||||||||||||||||
| name="description" | ||||||||||||||||||||||||||||||||
| content="Organizations and institutions using PolicyEngine for policy analysis and research, including government agencies, think tanks, universities, and advocacy groups." | ||||||||||||||||||||||||||||||||
| /> | ||||||||||||||||||||||||||||||||
| </Helmet> | ||||||||||||||||||||||||||||||||
| <div> | ||||||||||||||||||||||||||||||||
| <Header /> | ||||||||||||||||||||||||||||||||
| <PageHeader title="Our users" backgroundColor={style.colors.BLUE_98}> | ||||||||||||||||||||||||||||||||
| <p style={{ margin: 0 }}> | ||||||||||||||||||||||||||||||||
| PolicyEngine is trusted by government agencies, think tanks, | ||||||||||||||||||||||||||||||||
| universities, and advocacy organizations to provide rigorous policy | ||||||||||||||||||||||||||||||||
| analysis and evidence-based research. | ||||||||||||||||||||||||||||||||
| </p> | ||||||||||||||||||||||||||||||||
| </PageHeader> | ||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||
| {/* Hero section with blended logos - placeholder for now */} | ||||||||||||||||||||||||||||||||
| <Section backgroundColor={style.colors.WHITE}> | ||||||||||||||||||||||||||||||||
| <div | ||||||||||||||||||||||||||||||||
| style={{ | ||||||||||||||||||||||||||||||||
| textAlign: "center", | ||||||||||||||||||||||||||||||||
| padding: "40px 0", | ||||||||||||||||||||||||||||||||
| backgroundColor: style.colors.LIGHT_GRAY_98, | ||||||||||||||||||||||||||||||||
| marginBottom: "40px", | ||||||||||||||||||||||||||||||||
| borderRadius: "8px", | ||||||||||||||||||||||||||||||||
| }} | ||||||||||||||||||||||||||||||||
| > | ||||||||||||||||||||||||||||||||
| <div | ||||||||||||||||||||||||||||||||
| style={{ | ||||||||||||||||||||||||||||||||
| height: "200px", | ||||||||||||||||||||||||||||||||
| display: "flex", | ||||||||||||||||||||||||||||||||
| alignItems: "center", | ||||||||||||||||||||||||||||||||
| justifyContent: "center", | ||||||||||||||||||||||||||||||||
| fontSize: "18px", | ||||||||||||||||||||||||||||||||
| color: style.colors.DARK_GRAY, | ||||||||||||||||||||||||||||||||
| }} | ||||||||||||||||||||||||||||||||
| > | ||||||||||||||||||||||||||||||||
| [Blended user logos will be displayed here] | ||||||||||||||||||||||||||||||||
| </div> | ||||||||||||||||||||||||||||||||
| </div> | ||||||||||||||||||||||||||||||||
| </Section> | ||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||
| {/* User categories */} | ||||||||||||||||||||||||||||||||
| {Object.entries(userCategories).map(([categoryKey, categoryName]) => { | ||||||||||||||||||||||||||||||||
| const categoryUsers = usersByCategory[categoryKey]; | ||||||||||||||||||||||||||||||||
| if (!categoryUsers || categoryUsers.length === 0) return null; | ||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||
| return ( | ||||||||||||||||||||||||||||||||
| <Section | ||||||||||||||||||||||||||||||||
| key={categoryKey} | ||||||||||||||||||||||||||||||||
| backgroundColor={ | ||||||||||||||||||||||||||||||||
| categoryKey === "government" | ||||||||||||||||||||||||||||||||
| ? style.colors.BLUE | ||||||||||||||||||||||||||||||||
| : style.colors.WHITE | ||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||
| > | ||||||||||||||||||||||||||||||||
| <h2 | ||||||||||||||||||||||||||||||||
| style={{ | ||||||||||||||||||||||||||||||||
| color: | ||||||||||||||||||||||||||||||||
| categoryKey === "government" | ||||||||||||||||||||||||||||||||
| ? style.colors.WHITE | ||||||||||||||||||||||||||||||||
| : style.colors.BLACK, | ||||||||||||||||||||||||||||||||
| marginBottom: "30px", | ||||||||||||||||||||||||||||||||
| }} | ||||||||||||||||||||||||||||||||
| > | ||||||||||||||||||||||||||||||||
| {categoryName} | ||||||||||||||||||||||||||||||||
| </h2> | ||||||||||||||||||||||||||||||||
| <div | ||||||||||||||||||||||||||||||||
| style={{ | ||||||||||||||||||||||||||||||||
| display: "grid", | ||||||||||||||||||||||||||||||||
| gridTemplateColumns: "repeat(auto-fit, minmax(300px, 1fr))", | ||||||||||||||||||||||||||||||||
| gap: "30px", | ||||||||||||||||||||||||||||||||
| }} | ||||||||||||||||||||||||||||||||
| > | ||||||||||||||||||||||||||||||||
| {categoryUsers.map((user) => ( | ||||||||||||||||||||||||||||||||
| <UserCard | ||||||||||||||||||||||||||||||||
| key={user.id} | ||||||||||||||||||||||||||||||||
| user={user} | ||||||||||||||||||||||||||||||||
| inverted={categoryKey === "government"} | ||||||||||||||||||||||||||||||||
| /> | ||||||||||||||||||||||||||||||||
| ))} | ||||||||||||||||||||||||||||||||
| </div> | ||||||||||||||||||||||||||||||||
| </Section> | ||||||||||||||||||||||||||||||||
| ); | ||||||||||||||||||||||||||||||||
| })} | ||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||
| <Footer /> | ||||||||||||||||||||||||||||||||
| </div> | ||||||||||||||||||||||||||||||||
| </> | ||||||||||||||||||||||||||||||||
| ); | ||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||
| function UserCard({ user, inverted = false }) { | ||||||||||||||||||||||||||||||||
| const displayCategory = useDisplayCategory(); | ||||||||||||||||||||||||||||||||
| const isMobile = displayCategory === "mobile"; | ||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||
| const cardStyle = { | ||||||||||||||||||||||||||||||||
| display: "flex", | ||||||||||||||||||||||||||||||||
| flexDirection: isMobile ? "column" : "row", | ||||||||||||||||||||||||||||||||
| alignItems: isMobile ? "center" : "flex-start", | ||||||||||||||||||||||||||||||||
| padding: "20px", | ||||||||||||||||||||||||||||||||
| backgroundColor: inverted ? style.colors.BLUE : style.colors.WHITE, | ||||||||||||||||||||||||||||||||
| border: inverted | ||||||||||||||||||||||||||||||||
| ? `1px solid ${style.colors.LIGHT_BLUE}` | ||||||||||||||||||||||||||||||||
| : `1px solid ${style.colors.LIGHT_GRAY}`, | ||||||||||||||||||||||||||||||||
| borderRadius: "8px", | ||||||||||||||||||||||||||||||||
| boxShadow: "0 2px 4px rgba(0,0,0,0.05)", | ||||||||||||||||||||||||||||||||
| textAlign: isMobile ? "center" : "left", | ||||||||||||||||||||||||||||||||
| }; | ||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||
| const logoStyle = { | ||||||||||||||||||||||||||||||||
| width: "120px", | ||||||||||||||||||||||||||||||||
| height: "80px", | ||||||||||||||||||||||||||||||||
| objectFit: "contain", | ||||||||||||||||||||||||||||||||
| marginRight: isMobile ? 0 : "20px", | ||||||||||||||||||||||||||||||||
| marginBottom: isMobile ? "15px" : 0, | ||||||||||||||||||||||||||||||||
| }; | ||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||
| const textStyle = { | ||||||||||||||||||||||||||||||||
| color: inverted ? style.colors.WHITE : style.colors.BLACK, | ||||||||||||||||||||||||||||||||
| }; | ||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||
| return ( | ||||||||||||||||||||||||||||||||
| <div style={cardStyle}> | ||||||||||||||||||||||||||||||||
| {user.logo && ( | ||||||||||||||||||||||||||||||||
| <a | ||||||||||||||||||||||||||||||||
| href={user.website} | ||||||||||||||||||||||||||||||||
| target="_blank" | ||||||||||||||||||||||||||||||||
| rel="noopener noreferrer" | ||||||||||||||||||||||||||||||||
| aria-label={`Visit ${user.name} website`} | ||||||||||||||||||||||||||||||||
| > | ||||||||||||||||||||||||||||||||
| <img src={user.logo} alt={`${user.name} logo`} style={logoStyle} /> | ||||||||||||||||||||||||||||||||
| </a> | ||||||||||||||||||||||||||||||||
| )} | ||||||||||||||||||||||||||||||||
| <div> | ||||||||||||||||||||||||||||||||
| <h3 | ||||||||||||||||||||||||||||||||
| style={{ | ||||||||||||||||||||||||||||||||
| ...textStyle, | ||||||||||||||||||||||||||||||||
| margin: "0 0 8px 0", | ||||||||||||||||||||||||||||||||
| fontSize: "18px", | ||||||||||||||||||||||||||||||||
| }} | ||||||||||||||||||||||||||||||||
| > | ||||||||||||||||||||||||||||||||
| {user.website ? ( | ||||||||||||||||||||||||||||||||
| <a | ||||||||||||||||||||||||||||||||
| href={user.website} | ||||||||||||||||||||||||||||||||
| target="_blank" | ||||||||||||||||||||||||||||||||
| rel="noopener noreferrer" | ||||||||||||||||||||||||||||||||
| style={{ | ||||||||||||||||||||||||||||||||
| color: inverted ? style.colors.WHITE : style.colors.BLUE, | ||||||||||||||||||||||||||||||||
| textDecoration: "none", | ||||||||||||||||||||||||||||||||
| }} | ||||||||||||||||||||||||||||||||
| onMouseEnter={(e) => { | ||||||||||||||||||||||||||||||||
| e.target.style.textDecoration = "underline"; | ||||||||||||||||||||||||||||||||
| }} | ||||||||||||||||||||||||||||||||
| onMouseLeave={(e) => { | ||||||||||||||||||||||||||||||||
| e.target.style.textDecoration = "none"; | ||||||||||||||||||||||||||||||||
| }} | ||||||||||||||||||||||||||||||||
|
Comment on lines
+150
to
+159
|
||||||||||||||||||||||||||||||||
| style={{ | |
| color: inverted ? style.colors.WHITE : style.colors.BLUE, | |
| textDecoration: "none", | |
| }} | |
| onMouseEnter={(e) => { | |
| e.target.style.textDecoration = "underline"; | |
| }} | |
| onMouseLeave={(e) => { | |
| e.target.style.textDecoration = "none"; | |
| }} | |
| className="user-link" | |
| style={{ | |
| color: inverted ? style.colors.WHITE : style.colors.BLUE, | |
| textDecoration: "none", | |
| }} |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The
useDisplayCategoryhook is imported but the componentUsersis not using it. Only theUserCardcomponent uses this hook. Consider moving this import to theUserCardcomponent or removing it from the top-level imports.