@@ -0,0 +1,155 @@
1+import Head from "next/head";
2+import Link from "next/link";
3+import { getPage } from "../../lib/lib";
4+import { join } from "path";
5+import CopyLink from "../../components/CopyLink";
6+import Container from "../../components/Container";
7+import SingleColumn from "../../components/SingleColumn";
8+import Section from "../../components/Section";
9+import ob from "urbit-ob";
10+import Markdown from "../../components/Markdown";
11+import GatewayHeader from "../../components/gateway/GatewayHeader";
12+import Gateway404 from "../../components/gateway/Gateway404";
13+import MetadataBlock from "../../components/gateway/MetadataBlock";
14+import MetadataLink from "../../components/gateway/MetadataLink";
15+import Description from "../../components/gateway/Description";
17+const ApplicationPage = ({ data, markdown, params }) => {
18+ const { application } = params;
19+ if (!ob.isValidPatp(application[0])) {
20+ return <Gateway404 type="application" />;
22+ const image = `https://urbit-id-og-cards-7mdrgkd36-urbit.vercel.app/${
25+ data.image ? data.image : "https://media.urbit.org/logo/urbit-logo-card.png"
31+ <title>{data.title} • Applications • urbit.org</title>
32+ <link rel="icon" type="image/png" href="/images/favicon.ico" />
35+ content="summary_large_image"
40+ content={`${data.title} • Applications • urbit.org`}
44+ name="og:description"
47+ "View more about this application on urbit.org."
51+ <meta property="twitter:image" content={image} key="image" />
54+ <Section className="space-y-12" narrow>
58+ item="Urbit Application"
60+ <div className="flex flex-wrap md:flex-nowrap justify-between">
63+ content={data.license ? data.license : "Unknown"}
70+ data?.website ? data.website.replace(/^https?:\/\//, "") : ""
76+ content={data.developer ? data.developer : "Unknown"}
79+ className="basis-1/2 md:basis-auto"
80+ content={data.shortcode ? data.shortcode : data.title}
84+ description={data.description}
85+ fallback="An application on Urbit."
88+ <hr className="text-wall-200" />
89+ <div className="flex flex-col space-y-6">
91+ Urbit is a clean-slate, peer-to-peer operating system and network.
93+ <div className="flex flex-col space-y-4">
94+ <p className="text-sm font-semibold text-wall-400">
95+ Learn how to install an Urbit application
97+ {/* TODO: Joining groups guide. */}
98+ <button className="button-lg max-w-xs bg-green-400 text-white">
99+ Installing Urbit applications
103+ <hr className="text-wall-200" />
104+ <div className="flex flex-col space-y-1">
106+ Have an application you'd like to share publicly through
109+ {/* TODO Submission guide. */}
110+ <p className="type-ui text-green-400">
111+ Learn how to submit your application
115+ <a className="text-xl pt-8 block font-semibold">Urbit.org</a>
123+export const getServerSideProps = async ({ params, res }) => {
126+ "public, s-maxage=3600, stale-while-revalidate=604800"
129+ let { data, content } = getPage(
132+ "content/application",
133+ params.application?.join("/") || "/"
135+ ) || { data: {}, content: "" };
139+ title: params.application?.join("/"),
140+ description: "An application on Urbit.",
144+ const markdown = await Markdown({ post: { content: content } }, true);
155+export default ApplicationPage;