on master help sign in
events
aafeae5Gavin Atkinson
components/EventPreview.jsnew file+33
@@ -0,0 +1,33 @@
1+import Link from "next/link";
2+
3+export default function EventPreview({ event, className, title }) {
4+ // Event tiles have a 'dark mode' used when their background images are dark and white text is needed for legibility.
5+ const grayText = event.extra?.dark ? "text-midWhite" : "text-gray";
6+ const blackText = event.extra?.dark ? "text-white" : "text-black";
7+
8+ return (
9+ <div className={`cursor-pointer ${className}`}>
10+ {title ? <h3 className="mb-2">{title}</h3> : null}
11+ <div
12+ key={event.slug}
13+ className={`bg-wall rounded-xl h-96 bg-cover bg-center bg-no-repeat`}
14+ style={{ backgroundImage: `url(${event.extra?.image})` || "" }}
15+ >
16+ <Link href={`/events/${event.slug}`}>
17+ <div className="flex flex-col p-4 justify-between items-between h-full relative">
18+ <div className="flex-grow-1 flex flex-col justify-center h-full">
19+ <h4 className={`mb-4 ${blackText}`}>{event.title}</h4>
20+ <p className={grayText}>{event?.type}</p>
21+ </div>
22+ <div className="absolute p-4 left-0 bottom-0 w-full">
23+ <p className={`${grayText} type-ui-small`}>{event.extra.host}</p>
24+ <p className={`${grayText} type-ui-small`}>
25+ {event.extra.guests}
26+ </p>
27+ </div>
28+ </div>
29+ </Link>
30+ </div>
31+ </div>
32+ );
33+}
components/PostPreview.js+1−1
@@ -10,7 +10,7 @@ export default function PostPreview(props) {
10 <Link href={`/blog/${props.post.slug}`} key={`post-${props.post.slug}`}>
10 <Link href={`/blog/${props.post.slug}`} key={`post-${props.post.slug}`}>
11 <div>
11 <div>
12 <BackgroundImage
12 <BackgroundImage
13− className="w-full h-80 rounded-lg"
13+ className="w-full h-96 rounded-lg"
14 src={props.post.extra.image || ""}
14 src={props.post.extra.image || ""}
15 />
15 />
16 <p className="text-black mt-2">{props.post.title}</p>
16 <p className="text-black mt-2">{props.post.title}</p>
content/_index.mddeleted−3
@@ -1,3 +0,0 @@
1−+++
2−title = "Home"
3−+++
content/events/2021-03-18-developer-call-pressure-and-protolith.md+2−2
@@ -6,7 +6,7 @@ pinned = false
6host = "Urbit"
6host = "Urbit"
7time = "09:00 PST"
7time = "09:00 PST"
8location = "Online event"
8location = "Online event"
9−image = "https://secure.meetupstatic.com/photos/event/6/8/2/a/600_495146666.jpeg"
9+image = ""
10registration_url = "https://www.meetup.com/urbit-sf/events/276898246/"
10registration_url = "https://www.meetup.com/urbit-sf/events/276898246/"
11description = "Matilde Park, Landscape team lead, talks about the distinctions between the Landscape product and basic Urbit development, and the significance of building Landscape for Tlon."
11description = "Matilde Park, Landscape team lead, talks about the distinctions between the Landscape product and basic Urbit development, and the significance of building Landscape for Tlon."
12youtube = "XjIDZQUZZtE"
12youtube = "XjIDZQUZZtE"
@@ -16,4 +16,4 @@ Landscape was an experiment. Now it’s Tlon's flagship client for the Urbit pro
16
16
17Matilde Park, Landscape team lead, talks about the distinctions between the Landscape product and basic Urbit development, and the significance of building Landscape for Tlon — the role of “high-pressure experiments” in forcing our computer toward something rock-hard, diamond-perfect. With a few examples of ongoing deployments, she also outlines the problems being solved right now and the ones still a touch further out.
17Matilde Park, Landscape team lead, talks about the distinctions between the Landscape product and basic Urbit development, and the significance of building Landscape for Tlon — the role of “high-pressure experiments” in forcing our computer toward something rock-hard, diamond-perfect. With a few examples of ongoing deployments, she also outlines the problems being solved right now and the ones still a touch further out.
18
18
19−As usual, join us after the talk on the call to ask questions and hang out.
19+As usual, join us after the talk on the call to ask questions and hang out.
content/events/2021-04-01-developer-call-javascript-apps-on-urbit.md+1−1
@@ -6,7 +6,7 @@ pinned = false
6host = "Mike Osborne (~taller-ravnut)"
6host = "Mike Osborne (~taller-ravnut)"
7time = "09:00 PST"
7time = "09:00 PST"
8location = "Online Event"
8location = "Online Event"
9−image = "https://marpem-files.sfo2.digitaloceanspaces.com/radbur-sivmus/2021.4.05..15.41.17-urbit-javascript-diagram.png"
9+image = ""
10registration_url = "https://www.meetup.com/urbit-sf/events/277261928/"
10registration_url = "https://www.meetup.com/urbit-sf/events/277261928/"
11guests = "Tyler Brown Cifu Shuster (~radbur-sivmus)"
11guests = "Tyler Brown Cifu Shuster (~radbur-sivmus)"
12description = "In this talk, Tyler Brown Cifu Shuster (~radbur-sivmus) explains how to use Javascript tools to develop a client for Urbit."
12description = "In this talk, Tyler Brown Cifu Shuster (~radbur-sivmus) explains how to use Javascript tools to develop a client for Urbit."
content/events/2021-04-27-bitcoin-launch.md+1−1
@@ -6,7 +6,7 @@ pinned = false
6host = "Urbit Foundation"
6host = "Urbit Foundation"
7time = "12:00pm PDT"
7time = "12:00pm PDT"
8location = "Online Event"
8location = "Online Event"
9−image = "https://storage.googleapis.com/media.urbit.org/site/events/20210413-bitcoin-header.png"
9+image = "https://media.urbit.org/site/events/bitcoin-launch-event.png"
10registration_url = "https://www.meetup.com/urbit-sf/events/276741426/"
10registration_url = "https://www.meetup.com/urbit-sf/events/276741426/"
11youtube = "_aRnfacZPto"
11youtube = "_aRnfacZPto"
12guests = "Marty Bent"
12guests = "Marty Bent"
content/events/2021-05-27-town-hall.md+10−5
@@ -6,11 +6,12 @@ pinned = true
6host = "Josh Lehman (~wolref-podlex)"
6host = "Josh Lehman (~wolref-podlex)"
7time = "12:00 - 15:30 PDT"
7time = "12:00 - 15:30 PDT"
8location = "Online Event"
8location = "Online Event"
9−image = ""
9+image = "https://media.urbit.org/site/events/URBIT-TOWN-HALL.png"
10registration_url = "https://www.meetup.com/urbit-sf/events/278188361/"
10registration_url = "https://www.meetup.com/urbit-sf/events/278188361/"
11guests = "Hunter Miller (~nocsyx-lassul) and Justin Murphy (~hatryx-lastud)"
11guests = "Hunter Miller (~nocsyx-lassul) and Justin Murphy (~hatryx-lastud)"
12description = "A virtual mini-conference for the Urbit community featuring a special keynote talk from our friend Justin Murphy."
12description = "A virtual mini-conference for the Urbit community featuring a special keynote talk from our friend Justin Murphy."
13youtube = "8YSwt0vDPj0"
13youtube = "8YSwt0vDPj0"
14+dark=true
14+++
15+++
15
16
16The Urbit community has grown at a rapid clip throughout 2021. There are so many exciting things going on that it's hard to convey them all, even with Developer Calls happening every two weeks. This event will function as a virtual "mini-conference" where we'll give a series of important and exciting announcements, including both formal and informal talks from many members of our community.
17The Urbit community has grown at a rapid clip throughout 2021. There are so many exciting things going on that it's hard to convey them all, even with Developer Calls happening every two weeks. This event will function as a virtual "mini-conference" where we'll give a series of important and exciting announcements, including both formal and informal talks from many members of our community.
@@ -18,22 +19,26 @@ The Urbit community has grown at a rapid clip throughout 2021. There are so many
18Here's a rundown of what we'll be discussing:
19Here's a rundown of what we'll be discussing:
19
20
20## Introduction: State of the Network
21## Introduction: State of the Network
22+
21−*12:00 PDT, Josh Lehman*
23+_12:00 PDT, Josh Lehman_
22
24
23Urbit is under heavy, active development by both Tlon and a wide range of contributors. Josh Lehman will discuss some of the most important areas of work being undertaken, provide a picture of where Tlon and community efforts are going in the future, and even has a few exciting announcements to make.
25Urbit is under heavy, active development by both Tlon and a wide range of contributors. Josh Lehman will discuss some of the most important areas of work being undertaken, provide a picture of where Tlon and community efforts are going in the future, and even has a few exciting announcements to make.
24
26
25## Taisho, Urbit's Port City
27## Taisho, Urbit's Port City
28+
26−*~12:20 PDT, Hunter Miller*
29+_~12:20 PDT, Hunter Miller_
27
30
28Piloting an Urbit ship requires expertise that many lack. To achieve the rich and prosperous ecosystem we've all envisioned requires making that journey easier. In this talk, Hunter Miller introduces a new way for users to join the network with minimal effort.
31Piloting an Urbit ship requires expertise that many lack. To achieve the rich and prosperous ecosystem we've all envisioned requires making that journey easier. In this talk, Hunter Miller introduces a new way for users to join the network with minimal effort.
29
32
30## Keynote: The Revenge of Teleology
33## Keynote: The Revenge of Teleology
34+
31−*~13:00 PDT, Justin Murphy*
35+_~13:00 PDT, Justin Murphy_
32
36
33Teleology—or inquiry into ultimate ends—has been out of fashion since the seventeenth century, when Francis Bacon said that, “like a virgin consecrated to God,” it “produces nothing.” I argue that the digital revolution is inverting Bacon’s claim. Baconian instrumentalism is now suffering from diminishing returns—it is what the youth today call a Boomer Ideology. Rather, the greatest gains are going to individuals and communities with teleological attitudes. This talk will observe some examples and present a model consistent with the observations. Bitcoin inquires after the telos of money, the most winning independent “content creators” inquire after the telos of media, and Urbit inquires after the telos of personal computing.
37Teleology—or inquiry into ultimate ends—has been out of fashion since the seventeenth century, when Francis Bacon said that, “like a virgin consecrated to God,” it “produces nothing.” I argue that the digital revolution is inverting Bacon’s claim. Baconian instrumentalism is now suffering from diminishing returns—it is what the youth today call a Boomer Ideology. Rather, the greatest gains are going to individuals and communities with teleological attitudes. This talk will observe some examples and present a model consistent with the observations. Bitcoin inquires after the telos of money, the most winning independent “content creators” inquire after the telos of media, and Urbit inquires after the telos of personal computing.
34
38
35## Lightning Talks
39## Lightning Talks
40+
36−*14:00 PDT, you?*
41+_14:00 PDT, you?_
37
42
38After the scheduled talks we'll break out into a series of 30 minute talks led by community members. There will be up to three talks given in parallel at each of 14:00 PDT, 14:30 PDT and 15:00 PDT (so nine talks total).
43After the scheduled talks we'll break out into a series of 30 minute talks led by community members. There will be up to three talks given in parallel at each of 14:00 PDT, 14:30 PDT and 15:00 PDT (so nine talks total).
39
44
pages/404.js+1
@@ -1,3 +1,4 @@
1+import Head from "next/head";
1import Container from "../components/Container";
2import Container from "../components/Container";
2import SingleColumn from "../components/SingleColumn";
3import SingleColumn from "../components/SingleColumn";
3import Header from "../components/Header";
4import Header from "../components/Header";
pages/blog/[slug].js+1−1
@@ -89,7 +89,7 @@ export default function Post({
89 </code>
89 </code>
90 </h4>
90 </h4>
91 </Section>
91 </Section>
92− <Section className="flex">
92+ <Section wide className="flex">
93 {previousPost === null ? (
93 {previousPost === null ? (
94 <div className={"w-1/2 mr-4"} />
94 <div className={"w-1/2 mr-4"} />
95 ) : (
95 ) : (
pages/events.js+11−67
@@ -10,87 +10,31 @@ import Section from "../components/Section";
10import BackgroundImage from "../components/BackgroundImage";
10import BackgroundImage from "../components/BackgroundImage";
11import { getAllPosts, formatDate } from "../lib/lib";
11import { getAllPosts, formatDate } from "../lib/lib";
12
12
13−// function assignEventCard(event) {
14−// if (event.extra.youtube) {
15−// return (
16−// <img
17−// src={`http://img.youtube.com/vi/${event.extra.youtube}/maxresdefault.jpg`}
18−// className="w-full rounded-lg h-auto w-full"
19−// />
20−// );
21−// }
22−//
23−// if (event.extra.image) {
24−// return (
25−// <BackgroundImage
26−// src={event.extra.image}
27−// style={{ height: "620px" }}
28−// className="w-full rounded-lg"
29−// />
30−// );
31−// }
32−//
33−// return (
34−// <div
35−// className="w-full rounded-lg bg-wall"
36−// style={{ height: "620px" }}
37−// ></div>
38−// );
39−// }
40−//
41−// function EventCard(props) {
42−// return (
43−// <div key={props.event.slug} className="mb-24 cursor-pointer">
44−// <Link href={`/events/${props.event.slug}`}>
45−// <div>
46−// {assignEventCard(props.event)}
47−// <h3 className="mt-4">{props.event.title}</h3>
48−// <div className="flex items-baseline">
49−// {props.event.extra.author ? (
50−// <div className="type-ui text-gray mt-4">
51−// {props.event.extra.author}
52−// </div>
53−// ) : null}
54−// {props.event.extra.author && post.extra.ship ? (
55−// <div className="mx-1 text-gray">•</div>
56−// ) : null}
57−// {props.event.extra.ship ? (
58−// <div className="type-ui text-gray font-mono">
59−// {props.event.extra.ship}
60−// </div>
61−// ) : null}
62−// </div>
63−//
64−// <div className="type-ui text-gray mt-2">
65−// {formatDate(new Date(props.event.date))} - {props.event.extra.time}
66−// </div>
67−// </div>
68−// </Link>
69−// </div>
70−// );
71−// }
72−
73function EventCard({ event }) {
13function EventCard({ event }) {
14+ // Event tiles have a 'dark mode' used when their background images are dark and white text is needed for legibility.
15+ const grayText = event.extra?.dark ? "text-midWhite" : "text-gray";
16+ const blackText = event.extra?.dark ? "text-white" : "text-black";
17+
74 return (
18 return (
75 <div
19 <div
76 key={event.slug}
20 key={event.slug}
77− className="mb-24 cursor-pointer bg-wall rounded-xl tile-height"
21+ className="mb-24 cursor-pointer bg-wall rounded-xl tile-height bg-cover bg-center bg-no-repeat"
78− style={{ backgroundImage: event.extra?.image || "" }}
22+ style={{ backgroundImage: `url(${event.extra?.image})` || "" }}
79 >
23 >
80 <Link href={`/events/${event.slug}`}>
24 <Link href={`/events/${event.slug}`}>
81 <div className="flex flex-col p-8 justify-between items-between h-full relative">
25 <div className="flex flex-col p-8 justify-between items-between h-full relative">
82 <div className="flex-grow-1 flex flex-col justify-center h-full">
26 <div className="flex-grow-1 flex flex-col justify-center h-full">
83− <h3 className="mb-4">{event.title}</h3>
27+ <h3 className={`mb-4 ${blackText}`}>{event.title}</h3>
84− <h4 className="mt-4 type-gray">{event?.type}</h4>
28+ <h4 className={grayText}>{event?.type}</h4>
85 </div>
29 </div>
86 <div className="absolute left-8 bottom-8 w-full">
30 <div className="absolute left-8 bottom-8 w-full">
87− <p className="text-gray">{event.extra.host}</p>
31+ <p className={grayText}>{event.extra.host}</p>
88− <p className="text-gray">{event.extra.guests}</p>
32+ <p className={grayText}>{event.extra.guests}</p>
89 </div>
33 </div>
90 {event.extra.youtube ? (
34 {event.extra.youtube ? (
91 <a
35 <a
92 onClick={(e) => e.stopPropagation()}
36 onClick={(e) => e.stopPropagation()}
93− className="absolute w-16 h-16 right-8 bottom-8 bg-white flex items-center justify-center rounded-full bg-cover bg-center bg-no-repeat"
37+ className="absolute w-16 h-16 right-8 bottom-8 bg-white flex items-center justify-center rounded-full"
94 target="_blank"
38 target="_blank"
95 href={`https://www.youtube.com/watch?v=${event.extra.youtube}`}
39 href={`https://www.youtube.com/watch?v=${event.extra.youtube}`}
96 >
40 >
pages/events/[slug].js+8−8
@@ -16,7 +16,7 @@ import Footer from "../../components/Footer";
16import BackgroundImage from "../../components/BackgroundImage";
16import BackgroundImage from "../../components/BackgroundImage";
17import SingleColumn from "../../components/SingleColumn";
17import SingleColumn from "../../components/SingleColumn";
18import NewsletterSignup from "../../components/NewletterSignup";
18import NewsletterSignup from "../../components/NewletterSignup";
19−import PostPreview from "../../components/PostPreview";
19+import EventPreview from "../../components/EventPreview";
20import Section from "../../components/Section";
20import Section from "../../components/Section";
21import { name, contact } from "../../lib/constants";
21import { name, contact } from "../../lib/constants";
22import markdownStyles from "../../styles/markdown.module.css";
22import markdownStyles from "../../styles/markdown.module.css";
@@ -103,22 +103,22 @@ export default function Event({
103 </code>
103 </code>
104 </h4>
104 </h4>
105 </Section>
105 </Section>
106− <Section wide>
106+ <Section wide className="flex">
107 {previousPost === null ? (
107 {previousPost === null ? (
108 <div className={"w-1/2 mr-4"} />
108 <div className={"w-1/2 mr-4"} />
109 ) : (
109 ) : (
110− <PostPreview
110+ <EventPreview
111− title="Previous Post"
111+ title="Previous Event"
112− post={previousPost}
112+ event={previousPost}
113 className="mr-4 w-1/2"
113 className="mr-4 w-1/2"
114 />
114 />
115 )}
115 )}
116 {nextPost === null ? (
116 {nextPost === null ? (
117 <div className={"w-1/2 ml-4"} />
117 <div className={"w-1/2 ml-4"} />
118 ) : (
118 ) : (
119− <PostPreview
119+ <EventPreview
120− title="Next Post"
120+ title="Next Event"
121− post={nextPost}
121+ event={nextPost}
122 className="ml-4 w-1/2"
122 className="ml-4 w-1/2"
123 />
123 />
124 )}
124 )}
pages/index.js+9−8
@@ -10,6 +10,7 @@ import BackgroundImage from "../components/BackgroundImage";
10import TabCarousel from "../components/TabCarousel";
10import TabCarousel from "../components/TabCarousel";
11import NewsletterSignup from "../components/NewletterSignup";
11import NewsletterSignup from "../components/NewletterSignup";
12import PostPreview from "../components/PostPreview";
12import PostPreview from "../components/PostPreview";
13+import EventPreview from "../components/EventPreview";
13import { getAllPosts, formatDate, getOpenGrantsCount } from "../lib/lib";
14import { getAllPosts, formatDate, getOpenGrantsCount } from "../lib/lib";
14import { contact } from "../lib/constants";
15import { contact } from "../lib/constants";
15
16
@@ -232,23 +233,23 @@ export default function Home({ posts, events, openGrantsCount, search }) {
232 </div>
233 </div>
233 </div>
234 </div>
234 <div className="flex flex-wrap">
235 <div className="flex flex-wrap">
235− <PostPreview
236+ <EventPreview
236− post={events[0]}
237+ event={events[0]}
237 className={`w-full md:w-1/2 pr-0 pb-8 md:pr-4`}
238 className={`w-full md:w-1/2 pr-0 pb-8 md:pr-4`}
238 key={events[0].slug}
239 key={events[0].slug}
239 />
240 />
240− <PostPreview
241+ <EventPreview
241− post={events[1]}
242+ event={events[1]}
242 className={`w-full md:w-1/2 pl-0 pb-8 md:pl-4`}
243 className={`w-full md:w-1/2 pl-0 pb-8 md:pl-4`}
243 key={events[1].slug}
244 key={events[1].slug}
244 />
245 />
245− <PostPreview
246+ <EventPreview
246− post={events[3]}
247+ event={events[3]}
247 className={`w-full md:w-1/2 pr-0 pb-8 md:pr-4`}
248 className={`w-full md:w-1/2 pr-0 pb-8 md:pr-4`}
248 key={events[3].slug}
249 key={events[3].slug}
249 />
250 />
250− <PostPreview
251+ <EventPreview
251− post={events[4]}
252+ event={events[4]}
252 className={`w-full md:w-1/2 pl-0 pb-8 md:pl-4`}
253 className={`w-full md:w-1/2 pl-0 pb-8 md:pl-4`}
253 key={events[4].slug}
254 key={events[4].slug}
254 />
255 />
tailwind.config.js+1
@@ -24,6 +24,7 @@ module.exports = {
24 red: "#ff4136",
24 red: "#ff4136",
25 transparent: "rgba(0,0,0,0)",
25 transparent: "rgba(0,0,0,0)",
26 washedWhite: "rgba(255,255,255, 0.5)",
26 washedWhite: "rgba(255,255,255, 0.5)",
27+ midWhite: "rgba(255,255,255, 0.8)",
27 },
28 },
28 fontFamily: {
29 fontFamily: {
29 sans: ["Inter", "-apple-system", "sans-serif"],
30 sans: ["Inter", "-apple-system", "sans-serif"],