on master help sign in
removing content
commit23ab85aa18177d98f3bc3def372e147f422e7c92 authorGordon <gordon@hey.com> dateMon 25 Jul 2022, 16:55 (4 years ago) parent8adb6b06009620
22 files changed+368−319
components/Header.js+17−13 components/PostPreview.js+11−33 components/ecosystem/IndexCard.js+2−2 components/ecosystem/Post.js+25−13 content/ecosystem/spotlight/june-2022.md−5 content/getting-started/joining-groups.md+1−1 content/grants/eyre-scry.md+17 content/podcasts/2022-01-21_the-most-beautiful-computer.md+1−1 content/podcasts/2022-01-26_the-only-dignified-computer.md+1−1 content/podcasts/2022-02-01_100-year-computer.md+1−1 content/podcasts/2022-02-15_building-web3-products.md+1−1 content/podcasts/2022-02-21_most-correct-computer.md+1−1 content/podcasts/2022-03-02_theory-of-the-egirl.md+1−1 content/podcasts/2022-03-08_urbit-blockchains.md+1−1 content/podcasts/2022-03-13_alien-invasions.md+1−1 content/podcasts/2022-03-18_politics-of-urbit-governance.md+1−1 content/podcasts/2022-03-23_quantum-computing.md+1−1 package-lock.json+150−179 pages/applications/[[...application]].js+37−16 pages/blog/[slug].js+2−6 pages/ecosystem/index.js+43−28 pages/index.js+53−13
components/Header.js+17−13
@@ -66,15 +66,16 @@ export default function Header(props) {
6666 <ActiveLink
6767 currentPath={currentPath}
6868 className="mr-5 type-ui"
69− href="/ecosystem">
69+ href="/ecosystem"
70+ >
7071 Ecosystem
7172 </ActiveLink>
7273
7374 <ActiveLink
7475 currentPath={currentPath}
7576 className="mr-5 type-ui"
76− href="/grants">
77−
77+ href="/grants"
78+ >
7879 Grants
7980 </ActiveLink>
8081
@@ -115,29 +116,33 @@ export default function Header(props) {
115116
116117 <ActiveLink
117118 currentPath={currentPath}
118− className="mr-5 mb-4 text-green-400"
119+ className="mr-5 mt-4 mb-4 text-green-400"
119120 href="/getting-started"
120121 >
121122 Get Started
122123 </ActiveLink>
123124
124−
125125 <ActiveLink
126126 currentPath={currentPath}
127127 className="mr-5 mb-4"
128− href="/ecosystem">
129−
130− Ecosystem
128+ href="/overview"
129+ >
130+ Overview
131131 </ActiveLink>
132132
133133 <ActiveLink
134134 currentPath={currentPath}
135135 className="mr-5 mb-4"
136− href="/overview">
137− Overview
136+ href="/ecosystem"
137+ >
138+ Ecosystem
138139 </ActiveLink>
139140
140− <ActiveLink currentPath={currentPath} className="mr-5 mb-4" href="/grants">
141+ <ActiveLink
142+ currentPath={currentPath}
143+ className="mr-5 mb-4"
144+ href="/grants"
145+ >
141146 Grants
142147 </ActiveLink>
143148
@@ -148,7 +153,7 @@ export default function Header(props) {
148153 >
149154 Events
150155 </ActiveLink>
151−
156+
152157 <ActiveLink
153158 currentPath={currentPath}
154159 className="mr-5 mb-4"
@@ -156,7 +161,6 @@ export default function Header(props) {
156161 >
157162 Blog
158163 </ActiveLink>
159−
160164 </MenuTray>
161165 </header>
162166 );
components/PostPreview.js+11−33
@@ -1,5 +1,5 @@
11import Link from "next/link";
2−import BackgroundImage from "./BackgroundImage";
2+import { Card } from "foundation-design-system";
33import { formatDate, generateDisplayDate } from "../lib/lib";
44
55export default function PostPreview(props) {
@@ -7,38 +7,16 @@ export default function PostPreview(props) {
77
88 const date = generateDisplayDate(props.post.date);
99 return (
10− <div className={`cursor-pointer ${props.className}`}>
11− {props.title ? <h3 className="mb-2">{props.title}</h3> : null}
12−
13− <Link
14− href={`/${section}/${props.post.slug}`}
15− key={`post-${props.post.slug}`}
16− >
17− <div>
18− <BackgroundImage
19− className="aspect-w-5 aspect-h-4 rounded-lg"
20− src={props.post.extra.image || ""}
21− />
22−
23− <h4 className="mt-2">{props.post.title}</h4>
24− <div className="flex items-baseline mt-1">
25− {props.post.extra.author ? (
26− <div className="type-sub-bold mr-2">
27− {props.post.extra.author}
28− </div>
29− ) : null}
30− {props.post.extra.ship ? (
31− <Link href={`/ids/${props.post.extra.ship}`} passHref>
32− <a className="type-sub-bold text-wall-500 font-mono">
33− {props.post.extra.ship}
34− </a>
35− </Link>
36− ) : null}
37− </div>
38− <div className="text-wall-500 type-sub mt-1">{formatDate(date)}</div>
39− </div>
40− </Link>
41− </div>
10+ <Card
11+ slug={`/${section}/${props.post.slug}`}
12+ image={props.post.extra.image}
13+ title={props?.title || props.post?.title || ""}
14+ author={props.post?.extra?.author || ""}
15+ ship={props.post?.extra?.ship || ""}
16+ content={
17+ <div className="text-wall-500 type-sub mt-1">{formatDate(date)}</div>
18+ }
19+ />
4220 );
4321}
4422
components/ecosystem/IndexCard.js+2−2
@@ -3,7 +3,7 @@ import classnames from "classnames";
33export default function IndexCard({ slug, feat }) {
44 return (
55 <Link href={slug}>
6− <div className="cursor-pointer bg-wall-100 rounded-xl basis-1/3 h-full">
6+ <div className="cursor-pointer bg-wall-100 rounded-xl min-h-0 flex-1">
77 <div className="flex flex-col p-4 justify-between items-between h-full relative">
88 {feat.image ? (
99 <img
@@ -36,7 +36,7 @@ const badge = (type) => {
3636 {
3737 "bg-[#B37ED7]": type === "Organization",
3838 "bg-[#83b2d4]": type === "Application",
39− "bg-[#8dd5b1]": type === "Podcast",
39+ "bg-[#333333]": type === "Podcast",
4040 "bg-[#8dd5b1]": type === "Marketplace",
4141 }
4242 )}
components/ecosystem/Post.js+25−13
@@ -3,22 +3,34 @@ import classnames from "classnames";
33import Link from "next/link";
44export default function Post({ post }) {
55 return ["featured-1", "featured-2", "featured-3"].map((feat) => {
6+ const childPath =
7+ post[feat] && post[feat]?.matchedPost?.type === "Application"
8+ ? `${post[feat]?.matchedPost.ship}/${post[feat].matchedPost.slug}`
9+ : `${post[feat].matchedPost?.slug}`;
10+ const href = post[feat]?.matchedPost
11+ ? `/${post[feat].matchedPost.type.toLowerCase()}s/${childPath}`
12+ : null;
613 return post?.[feat] ? (
7− <div className="mt-8 mb-24">
8− <div className="flex space-x-4 items-center">
9− <img
10− className="rounded-xl w-24 object-cover"
11− src={post[feat].image}
12− />
13− <div className="flex flex-col">
14− <h4 className="text-xl pb-1 font-bold">{post?.[feat].title}</h4>
15− {badge(post[feat].type)}
14+ <Link href={href || "#"}>
15+ <div
16+ className="mt-8 mb-24 cursor-pointer"
17+ id={post?.[feat].title.toLowerCase().replace(/ /, "-")}
18+ >
19+ <div className="flex space-x-4 items-center">
20+ <img
21+ className="rounded-xl w-24 object-cover"
22+ src={post[feat].image}
23+ />
24+ <div className="flex flex-col">
25+ <h4 className="text-xl pb-1 font-bold">{post?.[feat].title}</h4>
26+ {badge(post[feat].type)}
27+ </div>
28+ </div>
29+ <div className="markdown mt-8">
30+ <Markdown.render content={JSON.parse(post[feat].content)} />
1631 </div>
1732 </div>
18− <div className="markdown mt-8">
19− <Markdown.render content={JSON.parse(post[feat].content)} />
20− </div>
21− </div>
33+ </Link>
2234 ) : null;
2335 });
2436}
content/ecosystem/spotlight/june-2022.md−5
@@ -5,7 +5,6 @@ date = "2022-06-01"
55[featured-1]
66title = "Other Life #193"
77description = "Professor Neal Davis Discusses why Urbit computers have souls, Shinto philosophy, and more"
8−type = "Podcast"
98image = "https://s3.us-east-1.amazonaws.com/haddefsigwen1/reciprocal/2022.5.20..19.52.50-B137D4AA-DA9E-4B07-98CE-C001C576C7CA_1_201_a.jpeg"
109URL = "https://urbit.live"
1110content = """
@@ -14,8 +13,6 @@ Urbit Foundation’s Technical Director Neal Davis discusses the philosophy of d
1413[featured-2]
1514title = "Studio"
1615description = "One line about the thing"
17−type = "Application"
18−image = "https://media.urbit.org/site/ecosystem/podcasts/full_1639502000-artwork.jpg"
1916URL = "https://reciprocal.ltd"
2017content = """
2118Studio is an application from Tirrel Corporation which enables Urbit users to turn a Groups notebook into a public blog with just a few clicks.
@@ -33,8 +30,6 @@ Check out more from Tirrel at tirrel.io and install Studio from ~tirrel/studio.
3330[featured-3]
3431title = "Reciprocal Ltd."
3532description = "One line about the thing"
36−type = "Organization"
37−image = "https://media.urbit.org/site/ecosystem/podcasts/full_1639502000-artwork.jpg"
3833URL = "https://reciprocal.ltd"
3934content = """
4035A design consultancy and friend network.
content/getting-started/joining-groups.md+1−1
@@ -6,7 +6,7 @@ weight = 2
66
77### 1. Get on the network
88
9−First, you’ll need to get on Urbit. You can quickly check out the network by [downloading the Port application](https://github.com/urbit/port) and booting up a comet–a temporary Urbit ID.
9+First, you’ll need to get on Urbit. You can quickly check out the network by [downloading the Port application]([https://github.com/urbit/port](https://urbit.org/getting-started/desktop) and booting up a comet–a temporary Urbit ID.
1010
1111For long-term use, you’ll want to get a permanent Urbit ID and consider a running your urbit in the cloud or on a hosted service.
1212
content/grants/eyre-scry.md+17
@@ -55,4 +55,21 @@ A %warp request to clay is maintained for each clay file in the map in order to
5555be notified about changes to them. When notified about said changes, Eyre will
5656give a %gift to the runtime.
5757
58+### Milestone 1: 3 stars
59+
60+Have a complete pass-through interface inside Eyre for catching GET requests and
61+bypassing the normal flow to do a scry instead. Fully implement the Clay request
62+flow and subscription for keeping track of all scry paths in the map. Milestone
63+is considered complete once the code is to spec and has been tested by
64+~tacryt-socryp.
65+
66+### Milestone 2: 2 stars
67+
68+Have a complete modification to Arvo for issuing a new runtime %gift to notify
69+the interpreter that content in the Eyre scry map has changed, and test that it
70+is sent upon %born events and when content changes. This milestone is considered
71+complete once the code is to spec, it has been tested by ~tacryt-socryp, and one
72+or more reviewers from the core team has approved the code, but not necessarily
73+merged it.
74+
5875reward: 5 stars
content/podcasts/2022-01-21_the-most-beautiful-computer.md+1−1
@@ -1,7 +1,7 @@
11+++
22title = "The Most Beautiful Computer with Édouard Urcades | The Urbit Series"
33podcast = "Other Life"
4−date = "January 21, 2022"
4+date = "2022-01-21"
55URL = "https://podcast.otherlife.co/episodes/quantum-computing-and-anarcho-communist-swarm-intelligence-with-jonathan-paprocki-the-urbit-series"
66image = "https://media.urbit.org/site/ecosystem/podcasts/full_1639502000-artwork.jpg"
77+++
content/podcasts/2022-01-26_the-only-dignified-computer.md+1−1
@@ -1,7 +1,7 @@
11+++
22title = "The Only Dignified Computer with Tirrel Corporation | The Urbit Series"
33podcast = "Other Life"
4−date = "January 26, 2022"
4+date = "2022-01-26"
55URL = "https://podcast.otherlife.co/episodes/urbit-blockchains-and-the-next-billion-users-with-ted-blackman-engineer-at-tlon-the-urbit-series"
66image = "https://media.urbit.org/site/ecosystem/podcasts/full_1639502000-artwork.jpg"
77+++
content/podcasts/2022-02-01_100-year-computer.md+1−1
@@ -1,7 +1,7 @@
11+++
22title = "The 100-Year Computer with Galen Wolfe-Pauly | The Urbit Series"
33podcast = "Other Life"
4−date = "February 1, 2022"
4+date = "2022-02-01"
55URL = "https://www.youtube.com/watch?v=YWOsBWBQAnQ"
66image = "https://media.urbit.org/site/ecosystem/podcasts/full_1639502000-artwork.jpg"
77+++
content/podcasts/2022-02-15_building-web3-products.md+1−1
@@ -1,7 +1,7 @@
11+++
22title = "Building Web3 Products on Urbit with Nico Arqueros of dcSpark | The Urbit Series"
33podcast = "Other Life"
4−date = "February 14, 2022"
4+date = "2022-02-14"
55URL = "https://podcast.otherlife.co/episodes/building-web3-products-on-urbit-with-nico-arqueros-of-dcspark-the-urbit-series"
66image = "https://media.urbit.org/site/ecosystem/podcasts/full_1639502000-artwork.jpg"
77+++
content/podcasts/2022-02-21_most-correct-computer.md+1−1
@@ -1,7 +1,7 @@
11+++
22title = "The Most Correct Computer (How Urbit Wins) with Philip Monk, CTO of Tlon | The Urbit Series"
33podcast = "Other Life"
4−date = "February 21, 2022"
4+date = "2022-02-21"
55URL = "https://podcast.otherlife.co/episodes/the-most-correct-computer-how-urbit-wins-with-philip-monk-cto-of-tlon-the-urbit-series"
66image = "https://media.urbit.org/site/ecosystem/podcasts/full_1639502000-artwork.jpg"
77+++
content/podcasts/2022-03-02_theory-of-the-egirl.md+1−1
@@ -1,7 +1,7 @@
11+++
22title = "Materials for a Theory of the E-Girl with Soph and **** of Remilia Collective | The Urbit Series"
33podcast = "Other Life"
4−date = "March 2, 2022"
4+date = "2022-03-02"
55URL = "https://podcast.otherlife.co/episodes/materials-for-a-theory-of-the-e-girl-with-soph-and-of-remilia-collective-the-urbit-series"
66image = "https://media.urbit.org/site/ecosystem/podcasts/full_1639502000-artwork.jpg"
77+++
content/podcasts/2022-03-08_urbit-blockchains.md+1−1
@@ -1,7 +1,7 @@
11+++
22title = "Urbit, Blockchains, and the Next Billion Users with Ted Blackman, Engineer at Tlon | The Urbit Series"
33podcast = "Other Life"
4−date = "March 8, 2022"
4+date = "2022-03-08"
55URL = "https://podcast.otherlife.co/episodes/urbit-blockchains-and-the-next-billion-users-with-ted-blackman-engineer-at-tlon-the-urbit-series"
66image = "https://media.urbit.org/site/ecosystem/podcasts/full_1639502000-artwork.jpg"
77+++
content/podcasts/2022-03-13_alien-invasions.md+1−1
@@ -1,7 +1,7 @@
11+++
22title = "Alien Invasions From the Future with Sam Frank, Writer and Galaxy Owner | The Urbit Series"
33podcast = "Other Life"
4−date = "March 13, 2022"
4+date = "2022-03-12"
55URL = "https://podcast.otherlife.co/episodes/alien-invasions-from-the-future-with-sam-frank-writer-and-galaxy-owner-the-urbit-series"
66image = "https://media.urbit.org/site/ecosystem/podcasts/full_1639502000-artwork.jpg"
77
content/podcasts/2022-03-18_politics-of-urbit-governance.md+1−1
@@ -1,7 +1,7 @@
11+++
22title = "Demystifying the Politics of Urbit Governance with Anthony Arroyo of The Combine | The Urbit Series"
33podcast = "Other Life"
4−date = "March 18, 2022"
4+date = "2022-03-18"
55URL = "https://podcast.otherlife.co/episodes/demystifying-the-politics-of-urbit-governance-with-anthony-arroyo-of-the-combine-the-urbit-series"
66image = "https://media.urbit.org/site/ecosystem/podcasts/full_1639502000-artwork.jpg"
77+++
content/podcasts/2022-03-23_quantum-computing.md+1−1
@@ -1,7 +1,7 @@
11+++
22title = "Quantum Computing and Anarcho-Communist Swarm Intelligence with Jonathan Paprocki | The Urbit Series"
33podcast = "Other Life"
4−date = "March 23, 2022"
4+date = "2022-03-23"
55URL = "https://podcast.otherlife.co/episodes/quantum-computing-and-anarcho-communist-swarm-intelligence-with-jonathan-paprocki-the-urbit-series"
66image = "https://media.urbit.org/site/ecosystem/podcasts/full_1639502000-artwork.jpg"
77+++
package-lock.json+150−179
@@ -69,14 +69,14 @@
6969 }
7070 },
7171 "node_modules/@next/env": {
72− "version": "12.2.2",
73− "resolved": "https://registry.npmjs.org/@next/env/-/env-12.2.2.tgz",
74− "integrity": "sha512-BqDwE4gDl1F608TpnNxZqrCn6g48MBjvmWFEmeX5wEXDXh3IkAOw6ASKUgjT8H4OUePYFqghDFUss5ZhnbOUjw=="
72+ "version": "12.2.3",
73+ "resolved": "https://registry.npmjs.org/@next/env/-/env-12.2.3.tgz",
74+ "integrity": "sha512-2lWKP5Xcvnor70NaaROZXBvU8z9mFReePCG8NhZw6NyNGnPvC+8s+Cre/63LAB1LKzWw/e9bZJnQUg0gYFRb2Q=="
7575 },
7676 "node_modules/@next/swc-android-arm-eabi": {
77− "version": "12.2.2",
78− "resolved": "https://registry.npmjs.org/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-12.2.2.tgz",
79− "integrity": "sha512-VHjuCHeq9qCprUZbsRxxM/VqSW8MmsUtqB5nEpGEgUNnQi/BTm/2aK8tl7R4D0twGKRh6g1AAeFuWtXzk9Z/vQ==",
77+ "version": "12.2.3",
78+ "resolved": "https://registry.npmjs.org/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-12.2.3.tgz",
79+ "integrity": "sha512-JxmCW9XB5PYnkGE67BdnBTdqW0SW6oMCiPMHLdjeRi4T3U4JJKJGnjQld99+6TPOfPWigtw3W7Cijp5gc+vJ/w==",
8080 "cpu": [
8181 "arm"
8282 ],
@@ -89,9 +89,9 @@
8989 }
9090 },
9191 "node_modules/@next/swc-android-arm64": {
92− "version": "12.2.2",
93− "resolved": "https://registry.npmjs.org/@next/swc-android-arm64/-/swc-android-arm64-12.2.2.tgz",
94− "integrity": "sha512-v5EYzXUOSv0r9mO/2PX6mOcF53k8ndlu9yeFHVAWW1Dhw2jaJcvTRcCAwYYN8Q3tDg0nH3NbEltJDLKmcJOuVA==",
92+ "version": "12.2.3",
93+ "resolved": "https://registry.npmjs.org/@next/swc-android-arm64/-/swc-android-arm64-12.2.3.tgz",
94+ "integrity": "sha512-3l4zXpWnzy0fqoedsFRxzMy/eGlMMqn6IwPEuBmtEQ4h7srmQFHyT+Bk+eVHb0o1RQ7/TloAa+mu8JX5tz/5tA==",
9595 "cpu": [
9696 "arm64"
9797 ],
@@ -104,9 +104,9 @@
104104 }
105105 },
106106 "node_modules/@next/swc-darwin-arm64": {
107− "version": "12.2.2",
108− "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-12.2.2.tgz",
109− "integrity": "sha512-JCoGySHKGt+YBk7xRTFGx1QjrnCcwYxIo3yGepcOq64MoiocTM3yllQWeOAJU2/k9MH0+B5E9WUSme4rOCBbpA==",
107+ "version": "12.2.3",
108+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-12.2.3.tgz",
109+ "integrity": "sha512-eutDO/RH6pf7+8zHo3i2GKLhF0qaMtxWpY8k3Oa1k+CyrcJ0IxwkfH/x3f75jTMeCrThn6Uu8j3WeZOxvhto1Q==",
110110 "cpu": [
111111 "arm64"
112112 ],
@@ -119,9 +119,9 @@
119119 }
120120 },
121121 "node_modules/@next/swc-darwin-x64": {
122− "version": "12.2.2",
123− "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-12.2.2.tgz",
124− "integrity": "sha512-dztDtvfkhUqiqpXvrWVccfGhLe44yQ5tQ7B4tBfnsOR6vxzI9DNPHTlEOgRN9qDqTAcFyPxvg86mn4l8bB9Jcw==",
122+ "version": "12.2.3",
123+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-12.2.3.tgz",
124+ "integrity": "sha512-lve+lnTiddXbcT3Lh2ujOFywQSEycTYQhuf6j6JrPu9oLQGS01kjIqqSj3/KMmSoppEnXo3BxkgYu+g2+ecHkA==",
125125 "cpu": [
126126 "x64"
127127 ],
@@ -134,9 +134,9 @@
134134 }
135135 },
136136 "node_modules/@next/swc-freebsd-x64": {
137− "version": "12.2.2",
138− "resolved": "https://registry.npmjs.org/@next/swc-freebsd-x64/-/swc-freebsd-x64-12.2.2.tgz",
139− "integrity": "sha512-JUnXB+2xfxqsAvhFLPJpU1NeyDsvJrKoOjpV7g3Dxbno2Riu4tDKn3kKF886yleAuD/1qNTUCpqubTvbbT2VoA==",
137+ "version": "12.2.3",
138+ "resolved": "https://registry.npmjs.org/@next/swc-freebsd-x64/-/swc-freebsd-x64-12.2.3.tgz",
139+ "integrity": "sha512-V4bZU1qBFkULTPW53phY8ypioh3EERzHu9YKAasm9RxU4dj+8c/4s60y+kbFkFEEpIUgEU6yNuYZRR4lHHbUGA==",
140140 "cpu": [
141141 "x64"
142142 ],
@@ -149,9 +149,9 @@
149149 }
150150 },
151151 "node_modules/@next/swc-linux-arm-gnueabihf": {
152− "version": "12.2.2",
153− "resolved": "https://registry.npmjs.org/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-12.2.2.tgz",
154− "integrity": "sha512-XeYC/qqPLz58R4pjkb+x8sUUxuGLnx9QruC7/IGkK68yW4G17PHwKI/1njFYVfXTXUukpWjcfBuauWwxp9ke7Q==",
152+ "version": "12.2.3",
153+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-12.2.3.tgz",
154+ "integrity": "sha512-MWxS/i+XSEKdQE0ZmdYkPPrWKBi4JwMVaXdOW9J/T/sZJsHsLlSC9ErBcNolKAJEVka+tnw9oPRyRCKOj+q0sw==",
155155 "cpu": [
156156 "arm"
157157 ],
@@ -164,9 +164,9 @@
164164 }
165165 },
166166 "node_modules/@next/swc-linux-arm64-gnu": {
167− "version": "12.2.2",
168− "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-12.2.2.tgz",
169− "integrity": "sha512-d6jT8xgfKYFkzR7J0OHo2D+kFvY/6W8qEo6/hmdrTt6AKAqxs//rbbcdoyn3YQq1x6FVUUd39zzpezZntg9Naw==",
167+ "version": "12.2.3",
168+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-12.2.3.tgz",
169+ "integrity": "sha512-ikXkqAmvEcWTzIQFDdmrUHLWzdDAF5s2pVsSpQn9rk/gK1i9webH1GRQd2bSM7JLuPBZSaYrNGvDTyHZdSEYlg==",
170170 "cpu": [
171171 "arm64"
172172 ],
@@ -179,9 +179,9 @@
179179 }
180180 },
181181 "node_modules/@next/swc-linux-arm64-musl": {
182− "version": "12.2.2",
183− "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-12.2.2.tgz",
184− "integrity": "sha512-rIZRFxI9N/502auJT1i7coas0HTHUM+HaXMyJiCpnY8Rimbo0495ir24tzzHo3nQqJwcflcPTwEh/DV17sdv9A==",
182+ "version": "12.2.3",
183+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-12.2.3.tgz",
184+ "integrity": "sha512-wE45gGFkeLLLnCoveKaBrdpYkkypl3qwNF2YhnfvfVK7etuu1O679LwClhCWinDVBr+KOkmyHok00Z+0uI1ycg==",
185185 "cpu": [
186186 "arm64"
187187 ],
@@ -194,9 +194,9 @@
194194 }
195195 },
196196 "node_modules/@next/swc-linux-x64-gnu": {
197− "version": "12.2.2",
198− "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-12.2.2.tgz",
199− "integrity": "sha512-ir1vNadlUDj7eQk15AvfhG5BjVizuCHks9uZwBfUgT5jyeDCeRvaDCo1+Q6+0CLOAnYDR/nqSCvBgzG2UdFh9A==",
197+ "version": "12.2.3",
198+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-12.2.3.tgz",
199+ "integrity": "sha512-MbFI6413VSXiREzHwYD8YAJLTknBaC+bmjXgdHEEdloeOuBFQGE3NWn3izOCTy8kV+s98VDQO8au7EKKs+bW0g==",
200200 "cpu": [
201201 "x64"
202202 ],
@@ -209,9 +209,9 @@
209209 }
210210 },
211211 "node_modules/@next/swc-linux-x64-musl": {
212− "version": "12.2.2",
213− "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-12.2.2.tgz",
214− "integrity": "sha512-bte5n2GzLN3O8JdSFYWZzMgEgDHZmRz5wiispiiDssj4ik3l8E7wq/czNi8RmIF+ioj2sYVokUNa/ekLzrESWw==",
212+ "version": "12.2.3",
213+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-12.2.3.tgz",
214+ "integrity": "sha512-jMBD0Va6fInbPih/dNySlNY2RpjkK6MXS+UGVEvuTswl1MZr+iahvurmshwGKpjaRwVU4DSFMD8+gfWxsTFs1Q==",
215215 "cpu": [
216216 "x64"
217217 ],
@@ -224,9 +224,9 @@
224224 }
225225 },
226226 "node_modules/@next/swc-win32-arm64-msvc": {
227− "version": "12.2.2",
228− "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-12.2.2.tgz",
229− "integrity": "sha512-ZUGCmcDmdPVSAlwJ/aD+1F9lYW8vttseiv4n2+VCDv5JloxiX9aY32kYZaJJO7hmTLNrprvXkb4OvNuHdN22Jg==",
227+ "version": "12.2.3",
228+ "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-12.2.3.tgz",
229+ "integrity": "sha512-Cq8ToPdc0jQP2C7pjChYctAsEe7+lO/B826ZCK5xFzobuHPiCyJ2Mzx/nEQwCY4SpYkeJQtCbwlCz5iyGW5zGg==",
230230 "cpu": [
231231 "arm64"
232232 ],
@@ -239,9 +239,9 @@
239239 }
240240 },
241241 "node_modules/@next/swc-win32-ia32-msvc": {
242− "version": "12.2.2",
243− "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-12.2.2.tgz",
244− "integrity": "sha512-v7ykeEDbr9eXiblGSZiEYYkWoig6sRhAbLKHUHQtk8vEWWVEqeXFcxmw6LRrKu5rCN1DY357UlYWToCGPQPCRA==",
242+ "version": "12.2.3",
243+ "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-12.2.3.tgz",
244+ "integrity": "sha512-BtFq4c8IpeB0sDhJMHJFgm86rPkOvmYI8k3De8Y2kgNVWSeLQ0Q929PWf7e+GqcX1015ei/gEB41ZH8Iw49NzA==",
245245 "cpu": [
246246 "ia32"
247247 ],
@@ -254,9 +254,9 @@
254254 }
255255 },
256256 "node_modules/@next/swc-win32-x64-msvc": {
257− "version": "12.2.2",
258− "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-12.2.2.tgz",
259− "integrity": "sha512-2D2iinWUL6xx8D9LYVZ5qi7FP6uLAoWymt8m8aaG2Ld/Ka8/k723fJfiklfuAcwOxfufPJI+nRbT5VcgHGzHAQ==",
257+ "version": "12.2.3",
258+ "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-12.2.3.tgz",
259+ "integrity": "sha512-huSNb98KSG77Kl96CoPgCwom28aamuUsPpRmn/4s9L0RNbbHVSkp9E6HA4yOAykZCEuWcdNsRLbVVuAbt8rtIw==",
260260 "cpu": [
261261 "x64"
262262 ],
@@ -309,9 +309,9 @@
309309 }
310310 },
311311 "node_modules/@swc/helpers": {
312− "version": "0.4.2",
313− "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.4.2.tgz",
314− "integrity": "sha512-556Az0VX7WR6UdoTn4htt/l3zPQ7bsQWK+HqdG4swV7beUCxo/BqmvbOpUkTIm/9ih86LIf1qsUnywNL3obGHw==",
312+ "version": "0.4.3",
313+ "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.4.3.tgz",
314+ "integrity": "sha512-6JrF+fdUK2zbGpJIlN7G3v966PQjyx/dPt1T9km2wj+EUBqgrxCk3uX4Kct16MIm9gGxfKRcfax2hVf5jvlTzA==",
315315 "dependencies": {
316316 "tslib": "^2.4.0"
317317 }
@@ -596,9 +596,9 @@
596596 }
597597 },
598598 "node_modules/caniuse-lite": {
599− "version": "1.0.30001367",
600− "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001367.tgz",
601− "integrity": "sha512-XDgbeOHfifWV3GEES2B8rtsrADx4Jf+juKX2SICJcaUhjYBO3bR96kvEIHa15VU6ohtOhBZuPGGYGbXMRn0NCw==",
599+ "version": "1.0.30001370",
600+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001370.tgz",
601+ "integrity": "sha512-3PDmaP56wz/qz7G508xzjx8C+MC2qEm4SYhSEzC9IBROo+dGXFWRuaXkWti0A9tuI00g+toiriVqxtWMgl350g==",
602602 "funding": [
603603 {
604604 "type": "opencollective",
@@ -856,9 +856,9 @@
856856 }
857857 },
858858 "node_modules/electron-to-chromium": {
859− "version": "1.4.194",
860− "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.194.tgz",
861− "integrity": "sha512-ola5UH0xAP1oYY0FFUsPvwtucEzCQHucXnT7PQ1zjHJMccZhCDktEugI++JUR3YuIs7Ff7afz+OVEhVAIMhLAQ=="
859+ "version": "1.4.200",
860+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.200.tgz",
861+ "integrity": "sha512-nPyI7oHc8T64oSqRXrAt99gNMpk0SAgPHw/o+hkNKyb5+bcdnFtZcSO9FUJES5cVkVZvo8u4qiZ1gQILl8UXsA=="
862862 },
863863 "node_modules/end-of-stream": {
864864 "version": "1.4.4",
@@ -1116,7 +1116,7 @@
11161116 },
11171117 "node_modules/foundation-design-system": {
11181118 "version": "0.0.0",
1119− "resolved": "git+ssh://git@github.com/urbit/foundation-design-system.git#a873bc83cf7fa92e0a54429c0be79a1c0157896c",
1119+ "resolved": "git+ssh://git@github.com/urbit/foundation-design-system.git#961fa52e770ed93c5d939621cd3e184ef9dc94dd",
11201120 "license": "MIT",
11211121 "dependencies": {
11221122 "@markdoc/markdoc": "0.1.3",
@@ -1755,16 +1755,16 @@
17551755 }
17561756 },
17571757 "node_modules/next": {
1758− "version": "12.2.2",
1759− "resolved": "https://registry.npmjs.org/next/-/next-12.2.2.tgz",
1760− "integrity": "sha512-zAYFY45aBry/PlKONqtlloRFqU/We3zWYdn2NoGvDZkoYUYQSJC8WMcalS5C19MxbCZLUVCX7D7a6gTGgl2yLg==",
1758+ "version": "12.2.3",
1759+ "resolved": "https://registry.npmjs.org/next/-/next-12.2.3.tgz",
1760+ "integrity": "sha512-TA0tmSA6Dk6S6kfvCNbF7CWYW8468gZUxr/3/30z4KvAQbXnl2ASYZElVe7q/hBW/1F1ee0tSBlHa4/sn+ZIBw==",
17611761 "dependencies": {
1762− "@next/env": "12.2.2",
1763− "@swc/helpers": "0.4.2",
1762+ "@next/env": "12.2.3",
1763+ "@swc/helpers": "0.4.3",
17641764 "caniuse-lite": "^1.0.30001332",
1765− "postcss": "8.4.5",
1765+ "postcss": "8.4.14",
17661766 "styled-jsx": "5.0.2",
1767− "use-sync-external-store": "1.1.0"
1767+ "use-sync-external-store": "1.2.0"
17681768 },
17691769 "bin": {
17701770 "next": "dist/bin/next"
@@ -1773,19 +1773,19 @@
17731773 "node": ">=12.22.0"
17741774 },
17751775 "optionalDependencies": {
1776− "@next/swc-android-arm-eabi": "12.2.2",
1777− "@next/swc-android-arm64": "12.2.2",
1778− "@next/swc-darwin-arm64": "12.2.2",
1779− "@next/swc-darwin-x64": "12.2.2",
1780− "@next/swc-freebsd-x64": "12.2.2",
1781− "@next/swc-linux-arm-gnueabihf": "12.2.2",
1782− "@next/swc-linux-arm64-gnu": "12.2.2",
1783− "@next/swc-linux-arm64-musl": "12.2.2",
1784− "@next/swc-linux-x64-gnu": "12.2.2",
1785− "@next/swc-linux-x64-musl": "12.2.2",
1786− "@next/swc-win32-arm64-msvc": "12.2.2",
1787− "@next/swc-win32-ia32-msvc": "12.2.2",
1788− "@next/swc-win32-x64-msvc": "12.2.2"
1776+ "@next/swc-android-arm-eabi": "12.2.3",
1777+ "@next/swc-android-arm64": "12.2.3",
1778+ "@next/swc-darwin-arm64": "12.2.3",
1779+ "@next/swc-darwin-x64": "12.2.3",
1780+ "@next/swc-freebsd-x64": "12.2.3",
1781+ "@next/swc-linux-arm-gnueabihf": "12.2.3",
1782+ "@next/swc-linux-arm64-gnu": "12.2.3",
1783+ "@next/swc-linux-arm64-musl": "12.2.3",
1784+ "@next/swc-linux-x64-gnu": "12.2.3",
1785+ "@next/swc-linux-x64-musl": "12.2.3",
1786+ "@next/swc-win32-arm64-msvc": "12.2.3",
1787+ "@next/swc-win32-ia32-msvc": "12.2.3",
1788+ "@next/swc-win32-x64-msvc": "12.2.3"
17891789 },
17901790 "peerDependencies": {
17911791 "fibers": ">= 3.1.0",
@@ -1815,23 +1815,6 @@
18151815 "escalade": "^3.1.1"
18161816 }
18171817 },
1818− "node_modules/next/node_modules/postcss": {
1819− "version": "8.4.5",
1820− "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.5.tgz",
1821− "integrity": "sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg==",
1822− "dependencies": {
1823− "nanoid": "^3.1.30",
1824− "picocolors": "^1.0.0",
1825− "source-map-js": "^1.0.1"
1826− },
1827− "engines": {
1828− "node": "^10 || ^12 || >=14"
1829− },
1830− "funding": {
1831− "type": "opencollective",
1832− "url": "https://opencollective.com/postcss/"
1833− }
1834− },
18351818 "node_modules/nice-try": {
18361819 "version": "1.0.5",
18371820 "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
@@ -2883,9 +2866,9 @@
28832866 }
28842867 },
28852868 "node_modules/use-sync-external-store": {
2886− "version": "1.1.0",
2887− "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.1.0.tgz",
2888− "integrity": "sha512-SEnieB2FPKEVne66NpXPd1Np4R1lTNKfjuy3XdIoPQKYBAFdzbzSZlSn1KJZUiihQLQC5Znot4SBz1EOTBwQAQ==",
2869+ "version": "1.2.0",
2870+ "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz",
2871+ "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==",
28892872 "peerDependencies": {
28902873 "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
28912874 }
@@ -2976,86 +2959,86 @@
29762959 "integrity": "sha512-4n2cobUSeOob+237wZhpNiOEHCSfOydlQnKHTFdRY6ug/DupXGaxkkkszJYQxRftiMs8jmb10XvVO1svEYD43Q=="
29772960 },
29782961 "@next/env": {
2979− "version": "12.2.2",
2980− "resolved": "https://registry.npmjs.org/@next/env/-/env-12.2.2.tgz",
2981− "integrity": "sha512-BqDwE4gDl1F608TpnNxZqrCn6g48MBjvmWFEmeX5wEXDXh3IkAOw6ASKUgjT8H4OUePYFqghDFUss5ZhnbOUjw=="
2962+ "version": "12.2.3",
2963+ "resolved": "https://registry.npmjs.org/@next/env/-/env-12.2.3.tgz",
2964+ "integrity": "sha512-2lWKP5Xcvnor70NaaROZXBvU8z9mFReePCG8NhZw6NyNGnPvC+8s+Cre/63LAB1LKzWw/e9bZJnQUg0gYFRb2Q=="
29822965 },
29832966 "@next/swc-android-arm-eabi": {
2984− "version": "12.2.2",
2985− "resolved": "https://registry.npmjs.org/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-12.2.2.tgz",
2986− "integrity": "sha512-VHjuCHeq9qCprUZbsRxxM/VqSW8MmsUtqB5nEpGEgUNnQi/BTm/2aK8tl7R4D0twGKRh6g1AAeFuWtXzk9Z/vQ==",
2967+ "version": "12.2.3",
2968+ "resolved": "https://registry.npmjs.org/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-12.2.3.tgz",
2969+ "integrity": "sha512-JxmCW9XB5PYnkGE67BdnBTdqW0SW6oMCiPMHLdjeRi4T3U4JJKJGnjQld99+6TPOfPWigtw3W7Cijp5gc+vJ/w==",
29872970 "optional": true
29882971 },
29892972 "@next/swc-android-arm64": {
2990− "version": "12.2.2",
2991− "resolved": "https://registry.npmjs.org/@next/swc-android-arm64/-/swc-android-arm64-12.2.2.tgz",
2992− "integrity": "sha512-v5EYzXUOSv0r9mO/2PX6mOcF53k8ndlu9yeFHVAWW1Dhw2jaJcvTRcCAwYYN8Q3tDg0nH3NbEltJDLKmcJOuVA==",
2973+ "version": "12.2.3",
2974+ "resolved": "https://registry.npmjs.org/@next/swc-android-arm64/-/swc-android-arm64-12.2.3.tgz",
2975+ "integrity": "sha512-3l4zXpWnzy0fqoedsFRxzMy/eGlMMqn6IwPEuBmtEQ4h7srmQFHyT+Bk+eVHb0o1RQ7/TloAa+mu8JX5tz/5tA==",
29932976 "optional": true
29942977 },
29952978 "@next/swc-darwin-arm64": {
2996− "version": "12.2.2",
2997− "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-12.2.2.tgz",
2998− "integrity": "sha512-JCoGySHKGt+YBk7xRTFGx1QjrnCcwYxIo3yGepcOq64MoiocTM3yllQWeOAJU2/k9MH0+B5E9WUSme4rOCBbpA==",
2979+ "version": "12.2.3",
2980+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-12.2.3.tgz",
2981+ "integrity": "sha512-eutDO/RH6pf7+8zHo3i2GKLhF0qaMtxWpY8k3Oa1k+CyrcJ0IxwkfH/x3f75jTMeCrThn6Uu8j3WeZOxvhto1Q==",
29992982 "optional": true
30002983 },
30012984 "@next/swc-darwin-x64": {
3002− "version": "12.2.2",
3003− "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-12.2.2.tgz",
3004− "integrity": "sha512-dztDtvfkhUqiqpXvrWVccfGhLe44yQ5tQ7B4tBfnsOR6vxzI9DNPHTlEOgRN9qDqTAcFyPxvg86mn4l8bB9Jcw==",
2985+ "version": "12.2.3",
2986+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-12.2.3.tgz",
2987+ "integrity": "sha512-lve+lnTiddXbcT3Lh2ujOFywQSEycTYQhuf6j6JrPu9oLQGS01kjIqqSj3/KMmSoppEnXo3BxkgYu+g2+ecHkA==",
30052988 "optional": true
30062989 },
30072990 "@next/swc-freebsd-x64": {
3008− "version": "12.2.2",
3009− "resolved": "https://registry.npmjs.org/@next/swc-freebsd-x64/-/swc-freebsd-x64-12.2.2.tgz",
3010− "integrity": "sha512-JUnXB+2xfxqsAvhFLPJpU1NeyDsvJrKoOjpV7g3Dxbno2Riu4tDKn3kKF886yleAuD/1qNTUCpqubTvbbT2VoA==",
2991+ "version": "12.2.3",
2992+ "resolved": "https://registry.npmjs.org/@next/swc-freebsd-x64/-/swc-freebsd-x64-12.2.3.tgz",
2993+ "integrity": "sha512-V4bZU1qBFkULTPW53phY8ypioh3EERzHu9YKAasm9RxU4dj+8c/4s60y+kbFkFEEpIUgEU6yNuYZRR4lHHbUGA==",
30112994 "optional": true
30122995 },
30132996 "@next/swc-linux-arm-gnueabihf": {
3014− "version": "12.2.2",
3015− "resolved": "https://registry.npmjs.org/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-12.2.2.tgz",
3016− "integrity": "sha512-XeYC/qqPLz58R4pjkb+x8sUUxuGLnx9QruC7/IGkK68yW4G17PHwKI/1njFYVfXTXUukpWjcfBuauWwxp9ke7Q==",
2997+ "version": "12.2.3",
2998+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-12.2.3.tgz",
2999+ "integrity": "sha512-MWxS/i+XSEKdQE0ZmdYkPPrWKBi4JwMVaXdOW9J/T/sZJsHsLlSC9ErBcNolKAJEVka+tnw9oPRyRCKOj+q0sw==",
30173000 "optional": true
30183001 },
30193002 "@next/swc-linux-arm64-gnu": {
3020− "version": "12.2.2",
3021− "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-12.2.2.tgz",
3022− "integrity": "sha512-d6jT8xgfKYFkzR7J0OHo2D+kFvY/6W8qEo6/hmdrTt6AKAqxs//rbbcdoyn3YQq1x6FVUUd39zzpezZntg9Naw==",
3003+ "version": "12.2.3",
3004+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-12.2.3.tgz",
3005+ "integrity": "sha512-ikXkqAmvEcWTzIQFDdmrUHLWzdDAF5s2pVsSpQn9rk/gK1i9webH1GRQd2bSM7JLuPBZSaYrNGvDTyHZdSEYlg==",
30233006 "optional": true
30243007 },
30253008 "@next/swc-linux-arm64-musl": {
3026− "version": "12.2.2",
3027− "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-12.2.2.tgz",
3028− "integrity": "sha512-rIZRFxI9N/502auJT1i7coas0HTHUM+HaXMyJiCpnY8Rimbo0495ir24tzzHo3nQqJwcflcPTwEh/DV17sdv9A==",
3009+ "version": "12.2.3",
3010+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-12.2.3.tgz",
3011+ "integrity": "sha512-wE45gGFkeLLLnCoveKaBrdpYkkypl3qwNF2YhnfvfVK7etuu1O679LwClhCWinDVBr+KOkmyHok00Z+0uI1ycg==",
30293012 "optional": true
30303013 },
30313014 "@next/swc-linux-x64-gnu": {
3032− "version": "12.2.2",
3033− "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-12.2.2.tgz",
3034− "integrity": "sha512-ir1vNadlUDj7eQk15AvfhG5BjVizuCHks9uZwBfUgT5jyeDCeRvaDCo1+Q6+0CLOAnYDR/nqSCvBgzG2UdFh9A==",
3015+ "version": "12.2.3",
3016+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-12.2.3.tgz",
3017+ "integrity": "sha512-MbFI6413VSXiREzHwYD8YAJLTknBaC+bmjXgdHEEdloeOuBFQGE3NWn3izOCTy8kV+s98VDQO8au7EKKs+bW0g==",
30353018 "optional": true
30363019 },
30373020 "@next/swc-linux-x64-musl": {
3038− "version": "12.2.2",
3039− "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-12.2.2.tgz",
3040− "integrity": "sha512-bte5n2GzLN3O8JdSFYWZzMgEgDHZmRz5wiispiiDssj4ik3l8E7wq/czNi8RmIF+ioj2sYVokUNa/ekLzrESWw==",
3021+ "version": "12.2.3",
3022+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-12.2.3.tgz",
3023+ "integrity": "sha512-jMBD0Va6fInbPih/dNySlNY2RpjkK6MXS+UGVEvuTswl1MZr+iahvurmshwGKpjaRwVU4DSFMD8+gfWxsTFs1Q==",
30413024 "optional": true
30423025 },
30433026 "@next/swc-win32-arm64-msvc": {
3044− "version": "12.2.2",
3045− "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-12.2.2.tgz",
3046− "integrity": "sha512-ZUGCmcDmdPVSAlwJ/aD+1F9lYW8vttseiv4n2+VCDv5JloxiX9aY32kYZaJJO7hmTLNrprvXkb4OvNuHdN22Jg==",
3027+ "version": "12.2.3",
3028+ "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-12.2.3.tgz",
3029+ "integrity": "sha512-Cq8ToPdc0jQP2C7pjChYctAsEe7+lO/B826ZCK5xFzobuHPiCyJ2Mzx/nEQwCY4SpYkeJQtCbwlCz5iyGW5zGg==",
30473030 "optional": true
30483031 },
30493032 "@next/swc-win32-ia32-msvc": {
3050− "version": "12.2.2",
3051− "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-12.2.2.tgz",
3052− "integrity": "sha512-v7ykeEDbr9eXiblGSZiEYYkWoig6sRhAbLKHUHQtk8vEWWVEqeXFcxmw6LRrKu5rCN1DY357UlYWToCGPQPCRA==",
3033+ "version": "12.2.3",
3034+ "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-12.2.3.tgz",
3035+ "integrity": "sha512-BtFq4c8IpeB0sDhJMHJFgm86rPkOvmYI8k3De8Y2kgNVWSeLQ0Q929PWf7e+GqcX1015ei/gEB41ZH8Iw49NzA==",
30533036 "optional": true
30543037 },
30553038 "@next/swc-win32-x64-msvc": {
3056− "version": "12.2.2",
3057− "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-12.2.2.tgz",
3058− "integrity": "sha512-2D2iinWUL6xx8D9LYVZ5qi7FP6uLAoWymt8m8aaG2Ld/Ka8/k723fJfiklfuAcwOxfufPJI+nRbT5VcgHGzHAQ==",
3039+ "version": "12.2.3",
3040+ "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-12.2.3.tgz",
3041+ "integrity": "sha512-huSNb98KSG77Kl96CoPgCwom28aamuUsPpRmn/4s9L0RNbbHVSkp9E6HA4yOAykZCEuWcdNsRLbVVuAbt8rtIw==",
30593042 "optional": true
30603043 },
30613044 "@nodelib/fs.scandir": {
@@ -3088,9 +3071,9 @@
30883071 "requires": {}
30893072 },
30903073 "@swc/helpers": {
3091− "version": "0.4.2",
3092− "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.4.2.tgz",
3093− "integrity": "sha512-556Az0VX7WR6UdoTn4htt/l3zPQ7bsQWK+HqdG4swV7beUCxo/BqmvbOpUkTIm/9ih86LIf1qsUnywNL3obGHw==",
3074+ "version": "0.4.3",
3075+ "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.4.3.tgz",
3076+ "integrity": "sha512-6JrF+fdUK2zbGpJIlN7G3v966PQjyx/dPt1T9km2wj+EUBqgrxCk3uX4Kct16MIm9gGxfKRcfax2hVf5jvlTzA==",
30943077 "requires": {
30953078 "tslib": "^2.4.0"
30963079 }
@@ -3274,9 +3257,9 @@
32743257 "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA=="
32753258 },
32763259 "caniuse-lite": {
3277− "version": "1.0.30001367",
3278− "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001367.tgz",
3279− "integrity": "sha512-XDgbeOHfifWV3GEES2B8rtsrADx4Jf+juKX2SICJcaUhjYBO3bR96kvEIHa15VU6ohtOhBZuPGGYGbXMRn0NCw=="
3260+ "version": "1.0.30001370",
3261+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001370.tgz",
3262+ "integrity": "sha512-3PDmaP56wz/qz7G508xzjx8C+MC2qEm4SYhSEzC9IBROo+dGXFWRuaXkWti0A9tuI00g+toiriVqxtWMgl350g=="
32803263 },
32813264 "chalk": {
32823265 "version": "2.4.2",
@@ -3465,9 +3448,9 @@
34653448 }
34663449 },
34673450 "electron-to-chromium": {
3468− "version": "1.4.194",
3469− "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.194.tgz",
3470− "integrity": "sha512-ola5UH0xAP1oYY0FFUsPvwtucEzCQHucXnT7PQ1zjHJMccZhCDktEugI++JUR3YuIs7Ff7afz+OVEhVAIMhLAQ=="
3451+ "version": "1.4.200",
3452+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.200.tgz",
3453+ "integrity": "sha512-nPyI7oHc8T64oSqRXrAt99gNMpk0SAgPHw/o+hkNKyb5+bcdnFtZcSO9FUJES5cVkVZvo8u4qiZ1gQILl8UXsA=="
34713454 },
34723455 "end-of-stream": {
34733456 "version": "1.4.4",
@@ -3650,7 +3633,7 @@
36503633 "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA=="
36513634 },
36523635 "foundation-design-system": {
3653− "version": "git+ssh://git@github.com/urbit/foundation-design-system.git#a873bc83cf7fa92e0a54429c0be79a1c0157896c",
3636+ "version": "git+ssh://git@github.com/urbit/foundation-design-system.git#961fa52e770ed93c5d939621cd3e184ef9dc94dd",
36543637 "from": "foundation-design-system@github:urbit/foundation-design-system",
36553638 "requires": {
36563639 "@markdoc/markdoc": "0.1.3",
@@ -4108,41 +4091,29 @@
41084091 "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw=="
41094092 },
41104093 "next": {
4111− "version": "12.2.2",
4112− "resolved": "https://registry.npmjs.org/next/-/next-12.2.2.tgz",
4113− "integrity": "sha512-zAYFY45aBry/PlKONqtlloRFqU/We3zWYdn2NoGvDZkoYUYQSJC8WMcalS5C19MxbCZLUVCX7D7a6gTGgl2yLg==",
4094+ "version": "12.2.3",
4095+ "resolved": "https://registry.npmjs.org/next/-/next-12.2.3.tgz",
4096+ "integrity": "sha512-TA0tmSA6Dk6S6kfvCNbF7CWYW8468gZUxr/3/30z4KvAQbXnl2ASYZElVe7q/hBW/1F1ee0tSBlHa4/sn+ZIBw==",
41144097 "requires": {
4115− "@next/env": "12.2.2",
4116− "@next/swc-android-arm-eabi": "12.2.2",
4117− "@next/swc-android-arm64": "12.2.2",
4118− "@next/swc-darwin-arm64": "12.2.2",
4119− "@next/swc-darwin-x64": "12.2.2",
4120− "@next/swc-freebsd-x64": "12.2.2",
4121− "@next/swc-linux-arm-gnueabihf": "12.2.2",
4122− "@next/swc-linux-arm64-gnu": "12.2.2",
4123− "@next/swc-linux-arm64-musl": "12.2.2",
4124− "@next/swc-linux-x64-gnu": "12.2.2",
4125− "@next/swc-linux-x64-musl": "12.2.2",
4126− "@next/swc-win32-arm64-msvc": "12.2.2",
4127− "@next/swc-win32-ia32-msvc": "12.2.2",
4128− "@next/swc-win32-x64-msvc": "12.2.2",
4129− "@swc/helpers": "0.4.2",
4098+ "@next/env": "12.2.3",
4099+ "@next/swc-android-arm-eabi": "12.2.3",
4100+ "@next/swc-android-arm64": "12.2.3",
4101+ "@next/swc-darwin-arm64": "12.2.3",
4102+ "@next/swc-darwin-x64": "12.2.3",
4103+ "@next/swc-freebsd-x64": "12.2.3",
4104+ "@next/swc-linux-arm-gnueabihf": "12.2.3",
4105+ "@next/swc-linux-arm64-gnu": "12.2.3",
4106+ "@next/swc-linux-arm64-musl": "12.2.3",
4107+ "@next/swc-linux-x64-gnu": "12.2.3",
4108+ "@next/swc-linux-x64-musl": "12.2.3",
4109+ "@next/swc-win32-arm64-msvc": "12.2.3",
4110+ "@next/swc-win32-ia32-msvc": "12.2.3",
4111+ "@next/swc-win32-x64-msvc": "12.2.3",
4112+ "@swc/helpers": "0.4.3",
41304113 "caniuse-lite": "^1.0.30001332",
4131− "postcss": "8.4.5",
4114+ "postcss": "8.4.14",
41324115 "styled-jsx": "5.0.2",
4133− "use-sync-external-store": "1.1.0"
4134− },
4135− "dependencies": {
4136− "postcss": {
4137− "version": "8.4.5",
4138− "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.5.tgz",
4139− "integrity": "sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg==",
4140− "requires": {
4141− "nanoid": "^3.1.30",
4142− "picocolors": "^1.0.0",
4143− "source-map-js": "^1.0.1"
4144− }
4145− }
4116+ "use-sync-external-store": "1.2.0"
41464117 }
41474118 },
41484119 "next-transpile-modules": {
@@ -4866,9 +4837,9 @@
48664837 }
48674838 },
48684839 "use-sync-external-store": {
4869− "version": "1.1.0",
4870− "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.1.0.tgz",
4871− "integrity": "sha512-SEnieB2FPKEVne66NpXPd1Np4R1lTNKfjuy3XdIoPQKYBAFdzbzSZlSn1KJZUiihQLQC5Znot4SBz1EOTBwQAQ==",
4840+ "version": "1.2.0",
4841+ "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz",
4842+ "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==",
48724843 "requires": {}
48734844 },
48744845 "util-deprecate": {
pages/applications/[[...application]].js+37−16
@@ -1,6 +1,6 @@
11import Head from "next/head";
22import Link from "next/link";
3−import { getPage } from "../../lib/lib";
3+import { getPage, getAllPosts } from "../../lib/lib";
44import { join } from "path";
55import CopyLink from "../../components/CopyLink";
66import {
@@ -16,7 +16,7 @@ import MetadataBlock from "../../components/gateway/MetadataBlock";
1616import MetadataLink from "../../components/gateway/MetadataLink";
1717import Description from "../../components/gateway/Description";
1818
19−const ApplicationPage = ({ data, markdown, params }) => {
19+const ApplicationPage = ({ data, markdown, organisation, params }) => {
2020 const { application } = params;
2121 if (!ob.isValidPatp(application[0])) {
2222 return <Gateway404 type="application" />;
@@ -29,6 +29,31 @@ const ApplicationPage = ({ data, markdown, params }) => {
2929 data.title
3030 }.png?${reqParams.join("&")}`;
3131
32+ let devLink;
33+
34+ if (organisation) {
35+ devLink = (
36+ <MetadataLink
37+ title="Developer"
38+ href={`/organizations/${organisation.slug}`}
39+ content={organisation.title}
40+ />
41+ );
42+ } else {
43+ devLink =
44+ ob.isValidPatp(data?.developer || "") && data?.developer.length <= 14 ? (
45+ <MetadataLink
46+ title="Developer"
47+ href={`/ids/${data.developer}`}
48+ content={data.developer}
49+ />
50+ ) : (
51+ <MetadataBlock
52+ title="Developer"
53+ content={data.developer ? data.developer : "Unknown"}
54+ />
55+ );
56+ }
3257 return (
3358 <Container>
3459 <Head>
@@ -76,19 +101,7 @@ const ApplicationPage = ({ data, markdown, params }) => {
76101 }
77102 />
78103 )}
79− {ob.isValidPatp(data?.developer || "") &&
80− data?.developer.length <= 14 ? (
81− <MetadataLink
82− title="Developer"
83− href={`/ids/${data.developer}`}
84− content={data.developer}
85− />
86− ) : (
87− <MetadataBlock
88− title="Developer"
89− content={data.developer ? data.developer : "Unknown"}
90− />
91− )}
104+ {devLink}
92105 <CopyLink
93106 className="basis-1/2 sm:basis-1/4"
94107 content={data.shortcode ? data.shortcode : data.title}
@@ -119,7 +132,9 @@ const ApplicationPage = ({ data, markdown, params }) => {
119132 urbit.org?
120133 </p>
121134 <Link href="/applications/submit" passHref>
122− <a className="font-bold text-green-400">Submit your application</a>
135+ <a className="font-bold text-green-400">
136+ Submit your application
137+ </a>
123138 </Link>
124139 </div>
125140 <Link href="/" passHref>
@@ -145,6 +160,11 @@ export const getServerSideProps = async ({ params, res }) => {
145160 )
146161 ) || { data: {}, content: "" };
147162
163+ const organisation =
164+ getAllPosts(["title", "slug", "ships"], "organizations").filter((e) =>
165+ e.ships.includes(params.application?.[0])
166+ )[0] || null;
167+
148168 const markdown =
149169 content !== ""
150170 ? JSON.stringify(Markdown.parse({ post: { content } }))
@@ -161,6 +181,7 @@ export const getServerSideProps = async ({ params, res }) => {
161181 props: {
162182 data,
163183 markdown,
184+ organisation,
164185 params,
165186 },
166187 };
pages/blog/[slug].js+2−6
@@ -68,12 +68,8 @@ export default function Post({
6868 </Section>
6969 <Section wide className="flex">
7070 <TwoUp>
71− {nextPost ? (
72− <PostPreview title="Next Post" post={nextPost} />
73− ) : null}
74− {previousPost ? (
75− <PostPreview title="Previous Post" post={previousPost} />
76− ) : null}
71+ {nextPost ? <PostPreview post={nextPost} /> : null}
72+ {previousPost ? <PostPreview post={previousPost} /> : null}
7773 </TwoUp>
7874 </Section>
7975 </SingleColumn>
pages/ecosystem/index.js+43−28
@@ -1,6 +1,3 @@
1−// All sections in one template
2−// Grid-columns-three
3−// Get content from content/ecosystem/spotlight, content/applications, content/marketplaces, content/organizations, content/podcasts, content/groups
41import { useRouter } from "next/router";
52import Head from "next/head";
63import Meta from "../../components/Meta";
@@ -100,9 +97,12 @@ export default function Ecosystem({
10097 </a>
10198 </Link>
10299
103− <div className="pt-36">
100+ <div className="pt-36">
104101 <h3 className="pb-2">Urbit Monthly</h3>
105− <p className="pb-8">Get the Spotlight in your inbox along with updates on everything Urbit.</p>
102+ <p className="pb-8">
103+ Get the Spotlight in your inbox along with updates on
104+ everything Urbit.
105+ </p>
106106 <Contact emphasize className="w-full" />
107107 </div>
108108 </>
@@ -111,15 +111,14 @@ export default function Ecosystem({
111111 className={classnames("grid gap-12 w-full", {
112112 "grid-cols-2 md:grid-cols-3": type !== "podcasts",
113113 "grid-cols-1": type === "podcasts",
114− "grid-cols-1 md:grid-cols-1": type === "applications",
114+ "grid-cols-1 md:grid-cols-2": type === "applications",
115115 hidden: type === undefined,
116116 })}
117117 >
118−
119118 {type === "organizations" &&
120119 organizations.map((org) => (
121120 <Link href={`/organizations/${org.slug}`}>
122− <div className="flex flex-col space-y-4 justify-center items-center cursor-pointer">
121+ <div className="flex flex-col space-y-4 justify-center items-center cursor-pointer hover:opacity-90">
123122 <img className="w-36" src={org.image} />
124123 <p className="text-center font-bold">{org.title}</p>
125124 </div>
@@ -128,20 +127,25 @@ export default function Ecosystem({
128127 {type === "applications" &&
129128 applications.map((app) => (
130129 <Link href={`/applications/${app.ship}/${app.slug}`}>
131− <div className="flex space-x-4 items-center cursor-pointer ">
130+ <div className="flex space-x-4 items-center cursor-pointer hover:opacity-90">
132131 <div
133− className="h-36 w-36 rounded-xl items-center justify-center"
132+ className="h-36 w-36 rounded-xl items-center justify-center shrink-0 overflow-hidden"
134133 style={{
135134 backgroundColor: app?.bgColor || "rgba(0,0,0,0)",
136135 }}
137136 >
138137 {app?.image && (
139− <img className="items-center" src={app.image} />
138+ <img
139+ className="items-center h-36 w-36"
140+ src={app.image}
141+ />
140142 )}
141143 </div>
142144 <div className="">
143− <p className="text-left font-bold">{app.title}</p>
144− <p className="text-left text-wall-400 font-light">{app.description}</p>
145+ <p className="text-left font-bold">{app.title}</p>
146+ <p className="text-left text-wall-400 font-light">
147+ {app.description}
148+ </p>
145149 </div>
146150 </div>
147151 </Link>
@@ -149,7 +153,7 @@ export default function Ecosystem({
149153 {type === "marketplaces" &&
150154 marketplaces.map((market) => (
151155 <Link href={`/marketplaces/${market.slug}`}>
152− <div className="flex flex-col space-y-4 justify-center items-center cursor-pointer">
156+ <div className="flex flex-col space-y-4 justify-center items-center cursor-pointer hover:opacity-90">
153157 <img className="w-36" src={market.image} />
154158 <p className="text-center font-bold">{market.title}</p>
155159 </div>
@@ -158,14 +162,16 @@ export default function Ecosystem({
158162 {type === "podcasts" &&
159163 podcasts.map((pod) => (
160164 <Link href={`/podcasts/${pod.slug}`}>
161− <div className="flex cursor-pointer space-x-4 items-center">
165+ <div className="flex cursor-pointer space-x-4 items-center hover:opacity-90">
162166 <img className="w-28" src={pod.image} />
163167 <div className="flex flex-col space-y-2 min-w-0">
164168 <p className="font-bold">{pod.podcast}</p>
165169 <p className="min-w-0 min-h-0 leading-5 ">
166170 {pod.title}
167171 </p>
168− <p className="text-wall-400">{pod.date}</p>
172+ <p className="text-wall-400">
173+ {formatDate(generateDisplayDate(pod.date))}
174+ </p>
169175 </div>
170176 </div>
171177 </Link>
@@ -173,8 +179,6 @@ export default function Ecosystem({
173179 </div>
174180 </div>
175181 </div>
176−
177−
178182 </Section>
179183 </SingleColumn>
180184 <Footer />
@@ -312,19 +316,11 @@ export async function getStaticProps({}) {
312316 "ecosystem/spotlight",
313317 "date"
314318 )[0];
315− ["featured-1", "featured-2", "featured-3"].forEach((feat) => {
316− if (post?.[feat]) {
317− post[feat].content = JSON.stringify(
318− Markdown.parse({
319− post: { content: post[feat].content },
320− })
321− );
322− }
323− });
324319 const marketplaces = getAllPosts(["title", "image", "slug"], "marketplaces");
325320 const podcasts = getAllPosts(
326321 ["title", "image", "date", "podcast", "slug"],
327− "podcasts"
322+ "podcasts",
323+ "date"
328324 );
329325 const organizations = getAllPosts(
330326 ["title", "image", "slug"],
@@ -350,6 +346,25 @@ export async function getStaticProps({}) {
350346 return nameA < nameB ? -1 : 1;
351347 });
352348
349+ ["featured-1", "featured-2", "featured-3"].forEach((feat) => {
350+ if (post?.[feat]) {
351+ const matchedPost = [
352+ ...applications.map((e) => ({ ...e, type: "Application" })),
353+ ...organizations.map((e) => ({ ...e, type: "Organization" })),
354+ ...podcasts.map((e) => ({ ...e, type: "Podcast" })),
355+ ...marketplaces.map((e) => ({ ...e, type: "Marketplace" })),
356+ ].filter((e) => e.title === post[feat].title)?.[0];
357+ post[feat].image = post[feat].image || matchedPost?.image;
358+ post[feat].type = matchedPost?.type || "Podcast";
359+ post[feat].matchedPost = matchedPost || null;
360+ post[feat].content = JSON.stringify(
361+ Markdown.parse({
362+ post: { content: post[feat].content },
363+ })
364+ );
365+ }
366+ });
367+
353368 return {
354369 props: { posts, post, applications, marketplaces, podcasts, organizations },
355370 };
pages/index.js+53−13
@@ -17,7 +17,8 @@ import TwoUp from "../components/TwoUp";
1717import { getAllPosts, getAllEvents, generateRealtimeDate } from "../lib/lib";
1818import { eventKeys } from "../lib/constants";
1919import IndexCard from "../components/ecosystem/IndexCard";
20−
20+import fs from "fs";
21+import path from "path";
2122
2223export default function Home({
2324 posts,
@@ -101,11 +102,9 @@ export default function Home({
101102 if (ecosystem?.[feat]) {
102103 return (
103104 <IndexCard
104− slug={
105− ecosystem[feat].type === "Application"
106− ? `/ids/${ecosystem[feat].URL}`
107− : ecosystem[feat].URL
108− }
105+ slug={`/ecosystem/#${ecosystem[feat]?.title
106+ .toLowerCase()
107+ .replace(/ /, "-")}`}
109108 feat={ecosystem[feat]}
110109 />
111110 );
@@ -228,7 +227,7 @@ export default function Home({
228227 </TwoUp>
229228
230229 <Link href="/blog" passHref>
231− <a className="button-lg max-w-fit type-ui text-white bg-green-400">
230+ <a className="button-lg max-w-fit type-ui text-white bg-green-400 z-10">
232231 See More
233232 </a>
234233 </Link>
@@ -254,17 +253,12 @@ export default function Home({
254253 </Link>
255254 </Section>
256255
257−
258256 <Section narrow>
259−
260257 <h3 className="pb-2">Urbit Monthly</h3>
261258 <p className="pb-8">Get monthly email updates on all things Urbit.</p>
262259
263−
264260 <Contact emphasize />
265261 </Section>
266−
267−
268262 </SingleColumn>
269263 <Footer />
270264 </Container>
@@ -272,20 +266,64 @@ export default function Home({
272266}
273267
274268export async function getStaticProps() {
269+ // Latest blog posts
275270 const posts = getAllPosts(
276271 ["title", "slug", "date", "description", "extra"],
277272 "blog",
278273 "date"
279274 );
280275
276+ // Pull all latest ecosystem information
281277 const ecosystem = getAllPosts(
282278 ["featured-1", "featured-2", "featured-3"],
283279 "ecosystem/spotlight",
284280 "date"
285281 )[0];
286282
287− const events = getAllEvents(eventKeys, "events");
283+ const marketplaces = getAllPosts(["title", "image", "slug"], "marketplaces");
284+ const podcasts = getAllPosts(
285+ ["title", "image", "date", "podcast", "slug"],
286+ "podcasts",
287+ "date"
288+ );
289+ const organizations = getAllPosts(
290+ ["title", "image", "slug"],
291+ "organizations"
292+ );
293+ const applications = fs
294+ .readdirSync(path.join(process.cwd(), "content/applications"), {
295+ withFileTypes: true,
296+ })
297+ .filter((f) => f.isDirectory())
298+ .map((dir) =>
299+ getAllPosts(
300+ ["title", "bgColor", "image", "slug", "description"],
301+ `applications/${dir.name}`
302+ )
303+ .map((e) => ({ ...e, ship: dir.name }))
304+ .flat()
305+ )
306+ .flat()
307+ .sort((a, b) => {
308+ const nameA = a.title.toLowerCase();
309+ const nameB = b.title.toLowerCase();
310+ return nameA < nameB ? -1 : 1;
311+ });
312+
313+ ["featured-1", "featured-2", "featured-3"].forEach((feat) => {
314+ if (ecosystem?.[feat]) {
315+ const matchedPost = [
316+ ...applications.map((e) => ({ ...e, type: "Application" })),
317+ ...organizations.map((e) => ({ ...e, type: "Organization" })),
318+ ...podcasts.map((e) => ({ ...e, type: "Podcast" })),
319+ ...marketplaces.map((e) => ({ ...e, type: "Marketplace" })),
320+ ].filter((e) => e.title === ecosystem[feat].title)?.[0];
321+ ecosystem[feat].image = ecosystem[feat].image || matchedPost?.image;
322+ ecosystem[feat].type = matchedPost?.type || "Podcast";
323+ }
324+ });
288325
326+ // Latest grants
289327 const grants = getAllPosts(["extra", "taxonomies"], "grants", "date");
290328
291329 const grantNumbers = {
@@ -308,6 +346,8 @@ export async function getStaticProps() {
308346 ).length,
309347 };
310348
349+ // Latest events
350+ const events = getAllEvents(eventKeys, "events");
311351 const now = DateTime.now();
312352
313353 const pastEvents = events.filter((event) => {