@@ -33,7 +33,7 @@ export default function Grants({ posts, categories, types, search }) {
3333 const router = useRouter();
3434 let { status, type, category } = router.query;
3535 if (status === undefined) {
36− status = "open";
36+ status = ["open", "wip"];
3737 }
3838
3939 function push(toQuery) {
@@ -82,8 +82,8 @@ export default function Grants({ posts, categories, types, search }) {
8282 const byStatus = (post) => {
8383 return (
8484 (isOrIsIn("open", status) ? post.status === "open" : false) ||
85− (isOrIsIn("complete", status) ? post.status === "completed" : false) ||
86− (isOrIsIn("wip", status) ? post.status === "wip" : false)
85+ (isOrIsIn("complete", status) ? post.status === "completed" : false) ||
86+ (isOrIsIn("wip", status) ? post.status === "wip" : false)
8787 );
8888 };
8989
@@ -91,10 +91,10 @@ export default function Grants({ posts, categories, types, search }) {
9191
9292 const filteredPosts = postsByStatus.filter((post) => {
9393 const hasCategory = category
94− ? isArray(category)
95− ? post.taxonomies.grant_category.some((cat) => category.includes(cat))
96− : post.taxonomies.grant_category.includes(category)
97− : true;
94+ ? isArray(category)
95+ ? post.taxonomies.grant_category.some((cat) => category.includes(cat))
96+ : post.taxonomies.grant_category.includes(category)
97+ : true;
9898
9999 const notCanceled = !post.extra.canceled;
100100 const hasType = type ? post.taxonomies.grant_type.includes(type) : true;
@@ -107,6 +107,9 @@ export default function Grants({ posts, categories, types, search }) {
107107 Bounty: postsByStatus.filter((post) =>
108108 post.taxonomies.grant_type.includes("Bounty")
109109 ).length,
110+ RFP: postsByStatus.filter((post) =>
111+ post.taxonomies.grant_type.includes("RFP")
112+ ).length,
110113 Apprenticeship: postsByStatus.filter((post) =>
111114 post.taxonomies.grant_type.includes("Apprenticeship")
112115 ).length,
@@ -122,7 +125,7 @@ export default function Grants({ posts, categories, types, search }) {
122125 {Meta({
123126 title: "Grants",
124127 description:
125− "Contribute to the Urbit project while earning address space.",
128+ "Contribute to the Urbit project while earning address space.",
126129 })}
127130 </Head>
128131 <IntraNav ourSite="https://urbit.org" search={search} />
@@ -157,11 +160,18 @@ export default function Grants({ posts, categories, types, search }) {
157160 fund all kinds projects, not strictly technical ones, so don't
158161 hesitate to pitch your idea!
159162 </p>
160− <Link href="/grants/proposals" passHref>
161− <a className="button-sm bg-blue-400 text-white mb-8 max-w-fit">
162− Submit a Proposal
163− </a>
164− </Link>
163+ <div className="flex flex-wrap mb-8">
164+ <Link href="/grants/proposals" passHref>
165+ <a className="button-sm bg-blue-400 text-white mb-8 max-w-fit mr-2">
166+ Submit a Proposal
167+ </a>
168+ </Link>
169+ <Link href="/grants?program=rfps&type=RFP#view-grants" passHref>
170+ <a className="button-sm bg-purple text-white mb-8 max-w-fit">
171+ Get Ideas
172+ </a>
173+ </Link>
174+ </div>
165175
166176 {/* Apprenticeships */}
167177 <h3>Apprenticeships</h3>
@@ -197,15 +207,7 @@ export default function Grants({ posts, categories, types, search }) {
197207 </a>
198208 </Link>
199209 </div>
200−
201−
202− {/* Approval */}
203− <h3>Approval</h3>
204− <p className="mb-4">
205− Grant applications and proposals are approved on a bi-weekly basis. The next deadlines are <b>March 14th & 28th</b>.
206− </p>
207− <p>If you any questions regarding grants, feel free to email grants@urbit.org.</p>
208− </div>
210+ </div>
209211 </div>
210212 </div>
211213 </Section>
@@ -235,6 +237,12 @@ export default function Grants({ posts, categories, types, search }) {
235237 by those that post them.
236238 </p>
237239 </li>
240+ <li className="mb-2">
241+ <p>
242+ <Link href="/grants/rfps">RFPs</Link>{" "}
243+ are suitable for people experienced with hoon development but who need some ideas on what to work on.
244+ </p>
245+ </li>
238246 <li className="mb-2">
239247 <p>
240248 <Link href="/grants/apprenticeships">Apprenticeships</Link>{" "}
@@ -248,9 +256,16 @@ export default function Grants({ posts, categories, types, search }) {
248256 <div className="md:basis-1/2">
249257 <p className="mb-8">
250258 Whether you're gearing up to submit your proposal or just
251− thinking about it, the best way to get started is to join the <Link href="/groups/~halbex-palheb/uf-public">Urbit Foundation</Link> group.
259+ thinking about it, the best way to get started is to join the <Link href="/groups/~halbex-palheb/uf-public">Urbit Foundation</Link> group, ask questions there or come find our grants office hours in the group.
260+ </p>
261+ <p className="mb-8">
262+ Feel free to contact <a href="/ids/~poldec-tonteg">~poldec-tonteg</a> with general questions or <a href="/ids/~marfun-pacpet">~marfun-pacpet</a> regarding administrative matters.
263+ </p>
264+ <p className="mb-8">
265+ <h4>Approval</h4>
266+ </p>
267+ <p className="mb-8">Grant applications and proposals are approved on a bi-weekly basis. The next deadlines are <b>March 14th & 28th</b>.
252268 </p>
253− <p className="mb-8">Feel free to contact <a href="/ids/~poldec-tonteg">~poldec-tonteg</a> with general questions or <a href="/ids/~marfun-pacpet">~marfun-pacpet</a> regarding administrative matters.</p>
254269 </div>
255270 </div>
256271 </Section>
@@ -272,17 +287,20 @@ export default function Grants({ posts, categories, types, search }) {
272287 {types.map((each) => {
273288 let activeBg;
274289 switch (each) {
275− case "Proposal":
276− activeBg = "bg-blue-400 text-white";
277− break;
278− case "Bounty":
279− activeBg = "bg-yellow-300 text-white";
280− break;
281− case "Apprenticeship":
282− activeBg = "bg-green-400 text-white";
283− break;
284− default:
285− activeBg = "bg-black";
290+ case "Proposal":
291+ activeBg = "bg-blue-400 text-white";
292+ break;
293+ case "Bounty":
294+ activeBg = "bg-yellow-300 text-white";
295+ break;
296+ case "RFP":
297+ activeBg = "bg-purple-400 text-white";
298+ break;
299+ case "Apprenticeship":
300+ activeBg = "bg-green-400 text-white";
301+ break;
302+ default:
303+ activeBg = "bg-black";
286304 }
287305 return (
288306 <a
@@ -302,8 +320,8 @@ export default function Grants({ posts, categories, types, search }) {
302320 <div className="flex flex-wrap mb-12">
303321 {categories.map((each) => {
304322 const active = isOrIsIn(each, category)
305− ? "bg-green-400 text-white"
306− : "bg-wall-100 text-wall-500";
323+ ? "bg-green-400 text-white"
324+ : "bg-wall-100 text-wall-500";
307325 const categoryQuery = pushOrDropQuery("category", category, each);
308326 return (
309327 <button
@@ -319,20 +337,20 @@ export default function Grants({ posts, categories, types, search }) {
319337 {["open", "complete", "wip"].map((each) => {
320338 let title;
321339 switch (each) {
322− case "open":
323− title = isOrIsIn(each, status)
324− ? "Exclude Open"
325− : "Include Open";
326− break;
327− case "complete":
328− title = isOrIsIn(each, status)
329− ? "Exclude Completed"
330− : "Include Completed";
331− break;
332− case "wip":
333− title = isOrIsIn(each, status)
334− ? "Exclude In Progress"
335− : "Include In Progress";
340+ case "open":
341+ title = isOrIsIn(each, status)
342+ ? "Exclude Open"
343+ : "Include Open";
344+ break;
345+ case "complete":
346+ title = isOrIsIn(each, status)
347+ ? "Exclude Completed"
348+ : "Include Completed";
349+ break;
350+ case "wip":
351+ title = isOrIsIn(each, status)
352+ ? "Exclude In Progress"
353+ : "Include In Progress";
336354 }
337355 const statusQuery = pushOrDropQuery("status", status, each);
338356 return (
@@ -371,7 +389,7 @@ export async function getStaticProps() {
371389 "date"
372390 )
373391 }).flat()
374− .sort((a, b) => new Date(b.date) - new Date(a.date));
392+ .sort((a, b) => new Date(b.date) - new Date(a.date));
375393
376394 return {
377395 props: {