+
+ )
+}
diff --git a/web/package.json b/web/package.json
index ff28c54f..60ee1c77 100644
--- a/web/package.json
+++ b/web/package.json
@@ -34,6 +34,7 @@
},
"devDependencies": {
"@tailwindcss/forms": "0.4.0",
+ "@tailwindcss/line-clamp": "^0.3.1",
"@tailwindcss/typography": "^0.5.1",
"@types/lodash": "4.14.178",
"@types/node": "16.11.11",
diff --git a/web/pages/charity/[...slugs]/index.tsx b/web/pages/charity/[...slugs]/index.tsx
new file mode 100644
index 00000000..ba54e7f8
--- /dev/null
+++ b/web/pages/charity/[...slugs]/index.tsx
@@ -0,0 +1,168 @@
+import clsx from 'clsx'
+import { useEffect, useMemo, useRef, useState } from 'react'
+import { Charity } from '../../../components/charity/charity-card'
+import { Col } from '../../../components/layout/col'
+import { Row } from '../../../components/layout/row'
+import { Page } from '../../../components/page'
+import { Title } from '../../../components/title'
+import { BuyAmountInput } from '../../../components/amount-input'
+import { Spacer } from '../../../components/layout/spacer'
+import { User } from '../../../../common/user'
+import { useUser } from '../../../hooks/use-user'
+import { manaTo$ } from '../misc'
+import { Linkify } from '../../../components/linkify'
+
+// TODO: replace with props
+const data: Charity = {
+ name: 'QRI',
+ slug: 'qri',
+ website: 'https://www.google.com',
+ ein: '123456789',
+ photo: 'https://placekitten.com/200/200',
+ blurb:
+ 'Lorem Ipsum is simply dummy text of Lorem Ipsum is simply dummy text ofLorem Ipsum is simply dummy text ofLorem Ipsum is simply dLorem Ipsum is simply dummy text ofLorem Ipsum is simply dummy text ofLorem Ipsum is simply dummy text ofLorem Ipsum is simply dummy text ofLorem Ipsum is simply dummy text ofLorem Ipsum is simply dummy text ofLorem Ipsum is simply dummy text ofLorem Ipsum isLorem Ipsum is simply dummy text ofLorem Ipsum is simply dummy text of simply dummy text ofummy text of ',
+ raised: 23450,
+}
+
+export default function CharityPage() {
+ const { name, photo, blurb } = data
+
+ // TODO: why not just useUser inside Donation Box rather than passing in?
+ const user = useUser()
+
+ return (
+ }>
+
+
+
+ {/* TODO: donations over time chart */}
+
+ {photo && }
+
+
+
+ )
+}
diff --git a/web/pages/charity/index.tsx b/web/pages/charity/index.tsx
new file mode 100644
index 00000000..043376ad
--- /dev/null
+++ b/web/pages/charity/index.tsx
@@ -0,0 +1,70 @@
+import _ from 'lodash'
+import { useState, useMemo } from 'react'
+import Card from '../../components/charity/charity-card'
+import { Col } from '../../components/layout/col'
+import { Page } from '../../components/page'
+import { Title } from '../../components/title'
+
+const charities = [
+ 'QRI',
+ 'Redwood Research',
+ '._.',
+ 'Center for Effective Altruism',
+ 'AllFed',
+ 'Against Malaria Foundation',
+ 'Institution for Long Long Loooong Loquacious Language (ILL)',
+ 'American Red Cross',
+].map((name, i) => ({
+ name,
+ slug: name,
+ website: 'https://www.google.com',
+ ein: '123456789',
+ photo: i === 4 ? '' : 'https://placekitten.com/200/200',
+ blurb:
+ i === 2
+ ? 'short text'
+ : "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.",
+ raised: 4001,
+}))
+// TODO: actual data
+
+export default function Charity() {
+ const [query, setQuery] = useState('')
+ const debouncedQuery = _.debounce(setQuery, 50)
+
+ const filterCharities = useMemo(
+ () => charities.filter((charity) => charity.name.includes(query)),
+ [query]
+ )
+
+ return (
+
+
+
+
+
+ Exchange your $M for real dollars in the form of charity donations!
+