on master help sign in
clean up and componentize
commit2e60c6c16e921f6e4a9b689050944d30940ebc1b authorGavin Atkinson <gvnatknsn@protonmail.com> dateWed 16 Jun 2021, 10:52 (5 years ago) parent948799e
7 files changed+455−349
README.md+6−2 components/NewletterSignup.js+38 components/PostPreview.js+26 pages/blog/[slug].js+48−43 pages/index.js+157−140 styles/globals.css+110−97 styles/markdown.module.css+70−67
README.md+6−2
@@ -2,7 +2,7 @@ The website for Urbit.
22
33## Getting Started
44
5−First, pull docs as a submodule
5+First, pull docs as a submodule:
66
77```bash
88git submodule init
@@ -22,13 +22,17 @@ yarn dev
2222
2323Finally, open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
2424
25−## Learn More
25+## Framework and Library Documentation
2626
2727To learn more about Next.js, take a look at the following resources:
2828
2929- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API.
3030- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.
3131
32+To learn more about Tailwind CSS, take a look at the docs:
33+
34+- [Tailwind CSS Docs](https://tailwindcss.com/docs) - Docs
35+
3236## Deployment
3337
3438WIP
components/NewletterSignup.jsnew file+38
@@ -0,0 +1,38 @@
1+export default function NewsletterSignup(props) {
2+ return (
3+ <form
4+ action="https://urbit.us11.list-manage.com/subscribe/post?u=972a03db9e0c6c25bb58de8c8&amp;amp;id=be143888d2"
5+ method="post"
6+ id="mc-embedded-subscribe-form"
7+ name="mc-embedded-subscribe-form"
8+ className="validate form max-w-screen-sm"
9+ target="_blank"
10+ novalidate
11+ >
12+ <div className="input-group" id="mc_embed_signup_scroll">
13+ <div className="mc-field-group w-full relative">
14+ <input
15+ className={`text-gray type-ui black border-${
16+ props.color || "green"
17+ } border-4 px-3 w-full mb-2 h-16 rounded-xl`}
18+ type="email"
19+ name="EMAIL"
20+ id="mce-EMAIL"
21+ placeholder="your@email.com"
22+ />
23+ <div className="flex h-16 items-center justify-center absolute top-0 right-6">
24+ <button
25+ id="mc-embedded-subscribe"
26+ className="type-ui text-gray bg-transparent"
27+ type="submit"
28+ name="subscribe"
29+ >
30+ {/* onClick={() => _paq.push(['trackEvent', 'Mailing List', 'Subscribe'])}> */}
31+ Sign Up
32+ </button>
33+ </div>
34+ </div>
35+ </div>
36+ </form>
37+ );
38+}
components/PostPreview.jsnew file+26
@@ -0,0 +1,26 @@
1+import Link from "next/link";
2+import BackgroundImage from "./BackgroundImage";
3+import { formatDate } from "../lib/lib";
4+
5+export default function PostPreview(props) {
6+ return (
7+ <div className={`cursor-pointer ${props.className}`}>
8+ {props.title ? <h3 className="mb-2">{props.title}</h3> : null}
9+
10+ <Link href={`/blog/ ${props.post.slug}`} key={`post-${props.post.slug}`}>
11+ <div>
12+ <BackgroundImage
13+ className="w-full h-80 rounded-lg"
14+ src={props.post.extra.image || ""}
15+ />
16+ <p className="text-black mt-2">{props.post.title}</p>
17+ <p className="text-gray">{formatDate(new Date(props.post.date))}</p>
18+ </div>
19+ </Link>
20+ </div>
21+ );
22+}
23+
24+PostPreview.defaultProps = {
25+ className: "",
26+};
pages/blog/[slug].js+48−43
@@ -15,8 +15,9 @@ import Header from "../../components/Header";
1515import Footer from "../../components/Footer";
1616import BackgroundImage from "../../components/BackgroundImage";
1717import SingleColumn from "../../components/SingleColumn";
18−
19−import { name } from "../../lib/constants";
18+import NewsletterSignup from "../../components/NewletterSignup";
19+import PostPreview from "../../components/PostPreview";
20+import { name, contact } from "../../lib/constants";
2021
2122export default function Post({ post, nextPost, previousPost }) {
2223 const router = useRouter();
@@ -43,53 +44,57 @@ export default function Post({ post, nextPost, previousPost }) {
4344 <article className="flex justify-center pt-12">
4445 <Markdown post={post} />
4546 </article>
47+ <section className="layout-narrow pt-24">
48+ <div className="measure">
49+ <h4 className="pb-6">
50+ If you’d like to follow our progress, we send monthly updates via
51+ email:
52+ </h4>
53+ </div>
54+ <NewsletterSignup color="black" />
55+ <h4 className="mt-12 text-gray">
56+ Follow us on{" "}
57+ <a className="text-black" href={contact.twitter}>
58+ Twitter
59+ </a>
60+ </h4>
61+ <h4 className="mt-6 text-gray">
62+ Explore code on{" "}
63+ <a className="text-black" href={contact.github}>
64+ Github
65+ </a>
66+ </h4>
67+ <h4 className="mt-6 text-gray">
68+ Ask questions in our{" "}
69+ <a className="text-black" href={contact.discord}>
70+ Discord
71+ </a>
72+ </h4>
73+ <h4 className="mt-6 text-gray">
74+ Boot Urbit and join{" "}
75+ <code className="bg-wall p-2 rounded-lg">
76+ {contact.urbitCommunity}
77+ </code>
78+ </h4>
79+ </section>
4680 <section className="layout-wide pt-24 flex">
4781 {previousPost === null ? (
48− <div className={`w-1/2 mr-4`} />
82+ <div className={"w-1/2 mr-4"} />
4983 ) : (
50− <div
51− className={`cursor-pointer w-1/2 mr-4`}
52− key={previousPost.slug}
53− >
54− <Link
55− href={"/blog/" + previousPost.slug}
56− key={`post-${previousPost.slug}`}
57− >
58− <div>
59− <h3>Previous Post</h3>
60− <BackgroundImage
61− className="w-full h-80 rounded-lg"
62− src={previousPost.extra.image || ""}
63− />
64− <p className="text-black mt-2">{previousPost.title || ""}</p>
65− <p className="text-gray">
66− {formatDate(new Date(previousPost.date))}
67− </p>
68− </div>
69− </Link>
70− </div>
84+ <PostPreview
85+ title="Previous Post"
86+ post={previousPost}
87+ className="mr-4 w-1/2"
88+ />
7189 )}
7290 {nextPost === null ? (
73− <div className={`w-1/2 ml-4`} />
91+ <div className={"w-1/2 ml-4"} />
7492 ) : (
75− <div className={`cursor-pointer w-1/2 ml-4`}>
76− <Link
77− href={"/blog/" + nextPost.slug}
78− key={`post-${nextPost.slug}`}
79− >
80− <div>
81− <h3>Next Post</h3>
82− <BackgroundImage
83− className="w-full h-80 rounded-lg"
84− src={nextPost.extra.image || ""}
85− />
86− <p className="text-black mt-2">{nextPost.title || ""}</p>
87− <p className="text-gray">
88− {formatDate(new Date(nextPost.date))}
89− </p>
90− </div>
91− </Link>
92− </div>
93+ <PostPreview
94+ title="Next Post"
95+ post={nextPost}
96+ className="ml-4 w-1/2"
97+ />
9398 )}
9499 </section>
95100 </SingleColumn>
pages/index.js+157−140
@@ -1,54 +1,65 @@
1−import Head from 'next/head'
2−import Link from 'next/link'
3−import { useState } from 'react';
4−import Container from '../components/Container'
5−import SingleColumn from '../components/SingleColumn'
6−import Header from '../components/Header'
7−import Footer from '../components/Footer'
8−import BackgroundImage from '../components/BackgroundImage'
9−import TabCarousel from '../components/TabCarousel'
10−import { getAllPosts, formatDate } from '../lib/lib'
11−import { contact } from '../lib/constants'
1+import Head from "next/head";
2+import Link from "next/link";
3+import { useState } from "react";
4+import Container from "../components/Container";
5+import SingleColumn from "../components/SingleColumn";
6+import Header from "../components/Header";
7+import Footer from "../components/Footer";
8+import BackgroundImage from "../components/BackgroundImage";
9+import TabCarousel from "../components/TabCarousel";
10+import NewsletterSignup from "../components/NewletterSignup";
11+import PostPreview from "../components/PostPreview";
12+import { getAllPosts, formatDate } from "../lib/lib";
13+import { contact } from "../lib/constants";
1214
1315export default function Home({ posts, events }) {
14−
15− const [tab, setTab] = useState(0)
16−
16+ const [tab, setTab] = useState(0);
17+
1718 return (
1819 <Container>
1920 <SingleColumn>
2021 <Header />
21−
22+
2223 <section className="layout-narrow pt-48">
2324 <h1>A general-purpose,</h1>
2425 <h1>peer-to-peer,</h1>
2526 <h1>personal computing system.</h1>
2627 </section>
27−
28+
2829 <section className="layout-wide pt-48">
2930 <div className="bg-wall w-11/12 hero-card-height rounded-3xl flex">
3031 <div className="pt-20 pl-12 w-7/12">
3132 <div className="pb-8">
32− <h2 className="p-0 m-0 pb-2">Introducing</h2><h2 className="text-green p-0 m-0">Port</h2>
33+ <h2 className="p-0 m-0 pb-2">Introducing</h2>
34+ <h2 className="text-green p-0 m-0">Port</h2>
3335 </div>
3436 <h3 className="pb-8">The Urbit client, now in beta.</h3>
35− <p className="pb-24">Getting into Urbit is now as simple as installing an app on your computer.</p>
36− <button className="button-lg type-ui mb-5 bg-green text-white">Download For Mac</button>
37+ <p className="pb-24">
38+ Getting into Urbit is now as simple as installing an app on your
39+ computer.
40+ </p>
41+ <button className="button-lg type-ui mb-5 bg-green text-white">
42+ Download For Mac
43+ </button>
3744 <a className="type-ui text-gray">View on GitHub</a>
3845 </div>
3946 <div className="bg-black w-full rounded-xl hero-image-height hero-image mt-8" />
4047 </div>
4148 </section>
42−
49+
4350 <section className="layout-narrow pt-48">
44− <div className='flex items-center measure pb-12'>
51+ <div className="flex items-center measure pb-12">
4552 <h2 className="m-0 p-0 mr-4">Urbit Grants</h2>
46− <button className="flex bg-green text-white type-ui px-4 items-center justify-center h-12 rounded-full">32 Open</button>
53+ <button className="flex bg-green text-white type-ui px-4 items-center justify-center h-12 rounded-full">
54+ 32 Open
55+ </button>
4756 </div>
4857 <div className="flex w-full items-center bg-washedGreen px-8 py-8 rounded-xl">
4958 <div className="flex items-center flex-col p-4 w-full">
5059 <h2 className="text-green">200+</h2>
51− <h3 className="text-green text-center pt-2">Urbit stars awarded</h3>
60+ <h3 className="text-green text-center pt-2">
61+ Urbit stars awarded
62+ </h3>
5263 </div>
5364 <div className="h-24 w-4 bg-lightGreen" />
5465 <div className="flex items-center flex-col p-4 w-full">
@@ -61,152 +72,158 @@ export default function Home({ posts, events }) {
6172 <h3 className="text-green text-center pt-2">Grants completed</h3>
6273 </div>
6374 </div>
64− <div className='measure py-12'>
65− <p className="pb-12">We regularly give away address space to reward community contributions, including education, promotion, and development.</p>
66− <button className="button-lg bg-green text-white">View Grants</button>
75+ <div className="measure py-12">
76+ <p className="pb-12">
77+ We regularly give away address space to reward community
78+ contributions, including education, promotion, and development.
79+ </p>
80+ <button className="button-lg bg-green text-white">
81+ View Grants
82+ </button>
6783 </div>
6884 </section>
69−
85+
7086 <section className="layout-narrow pt-48">
71− <div className='measure'>
72− <h2 className="pb-12">Build on Urbit</h2>
73− <h3 className="pb-12">
74− Urbit is a personal OS designed from scratch to run peer-to-peer applications.
75− </h3>
76− <p className="pb-12">
77− It solves the hard problems of implementing a peer-to-peer network (including identity, NAT traversal, and exactly-once delivery) in the kernel so app developers can focus on business logic.
78− </p>
79− <p className="pb-12">
80− The entire OS is a <Link href=''><a>single pure function</a></Link> that provides application developers with strong guarantees: automated persistence and memory management, repeatable builds, and support for hot code reloading.
81− </p>
82− <p className="pb-12">
83− You can get started learning how to <Link href=''><a>contribute to the project</a></Link>, or view a variety of <Link href=''><a>libraries</a></Link> for building on Urbit using the languages you already know.
84− </p>
85− <button className="button-lg type-ui text-white bg-black">Read the Developer Docs</button>
86− </div>
87− </section>
88−
89−
87+ <div className="measure">
88+ <h2 className="pb-12">Build on Urbit</h2>
89+ <h3 className="pb-12">
90+ Urbit is a personal OS designed from scratch to run peer-to-peer
91+ applications.
92+ </h3>
93+ <p className="pb-12">
94+ It solves the hard problems of implementing a peer-to-peer network
95+ (including identity, NAT traversal, and exactly-once delivery) in
96+ the kernel so app developers can focus on business logic.
97+ </p>
98+ <p className="pb-12">
99+ The entire OS is a{" "}
100+ <Link href="">
101+ <a>single pure function</a>
102+ </Link>{" "}
103+ that provides application developers with strong guarantees:
104+ automated persistence and memory management, repeatable builds,
105+ and support for hot code reloading.
106+ </p>
107+ <p className="pb-12">
108+ You can get started learning how to{" "}
109+ <Link href="">
110+ <a>contribute to the project</a>
111+ </Link>
112+ , or view a variety of{" "}
113+ <Link href="">
114+ <a>libraries</a>
115+ </Link>{" "}
116+ for building on Urbit using the languages you already know.
117+ </p>
118+ <button className="button-lg type-ui text-white bg-black">
119+ Read the Developer Docs
120+ </button>
121+ </div>
122+ </section>
123+
90124 <section className="layout-narrow pt-48">
91− <div className='flex items-center measure pb-12'>
92− <button
93− onClick={() => setTab(0)}
94− className={`tab-button-lg mr-6 ${tab === 0 ? 'text-black' : 'text-gray'}`}>
125+ <div className="flex items-center measure pb-12">
126+ <button
127+ onClick={() => setTab(0)}
128+ className={`tab-button-lg mr-6 ${
129+ tab === 0 ? "text-black" : "text-gray"
130+ }`}
131+ >
95132 Blog
96133 </button>
97− <button
134+ <button
98135 onClick={() => setTab(1)}
99− className={`tab-button-lg ${tab === 1 ? 'text-black' : 'text-gray'}`}>
136+ className={`tab-button-lg ${
137+ tab === 1 ? "text-black" : "text-gray"
138+ }`}
139+ >
100140 Events
101141 </button>
102142 </div>
103−
143+
104144 <TabCarousel index={tab}>
105145 <div className="blog-grid">
106− {
107− posts.slice(0, 4).map((post, i) => {
108− return (
109− <div className={`border-black cursor-pointer blog-grid-${i}`} key={post.slug}>
110− <Link href={'/blog/' + post.slug} key={`post-${post.slug}`}>
111− <div>
112− <BackgroundImage className="w-full h-80 rounded" src={post.extra.image || ''} />
113− <p className='text-black type-h3 mt-2'>{post.title}</p>
114− <p className='text-black mt-2'>{post.extra.author}</p>
115− <p className='text-gray mt-2'>{formatDate(new Date(post.date))}</p>
116− </div>
117− </Link>
118− </div>
119− )
120− })
121− }
146+ {posts.slice(0, 4).map((post, i) => {
147+ return (
148+ <PostPreview
149+ post={post}
150+ className={`blog-grid-${i}`}
151+ key={post.slug}
152+ />
153+ );
154+ })}
122155 <div>
123− <Link href="/blog"><button className="button-lg type-ui">Read More</button></Link>
156+ <Link href="/blog">
157+ <button className="button-lg type-ui text-white bg-black">
158+ Read More
159+ </button>
160+ </Link>
124161 </div>
125162 </div>
126163 <div className="blog-grid">
127− {
128− events.slice(0, 4).map((event, i) => {
129− return (
130− <div className={`border-black cursor-pointer blog-grid-${i}`} key={event.slug}>
131− <Link href={'/events/' + event.slug} key={`post-${event.slug}`}>
132− <div>
133− <BackgroundImage className="w-full h-80 rounded-lg" src={event.extra.image || ''} />
134− <p className='text-black mt-2'>{event.title || ''}</p>
135− <p className='text-gray'>{formatDate(new Date(event.date))}</p>
136− </div>
137− </Link>
138− </div>
139− )
140− })
141− }
164+ {events.slice(0, 4).map((event, i) => {
165+ return (
166+ <PostPreview
167+ post={event}
168+ className={`blog-grid-${i}`}
169+ key={event.slug}
170+ />
171+ );
172+ })}
142173 </div>
143174 </TabCarousel>
144175 </section>
145−
176+
146177 <section className="layout-narrow pt-48">
147− <div className='measure'>
178+ <div className="measure">
148179 <h2 className="m-0 p-0 mr-4 pb-12">Stay In Touch</h2>
149− <p className='pb-12'>We send monthly emails on system improvements, upcoming events, and community spotlights.</p>
180+ <p className="pb-6">
181+ We send monthly emails on system improvements, upcoming events,
182+ and community spotlights.
183+ </p>
150184 </div>
151− <form
152− action="https://urbit.us11.list-manage.com/subscribe/post?u=972a03db9e0c6c25bb58de8c8&amp;amp;id=be143888d2"
153− method="post" id="mc-embedded-subscribe-form"
154− name="mc-embedded-subscribe-form"
155− className="validate form max-w-screen-sm"
156− target="_blank"
157− novalidate>
158− <div className="input-group" id="mc_embed_signup_scroll">
159− <div className="mc-field-group w-full relative">
160− <input
161− className="text-gray type-ui black border-green border-4 px-3 w-full mb-2 h-16 rounded-xl"
162− type="email"
163− name="EMAIL"
164− id="mce-EMAIL"
165− placeholder="your@email.com" />
166− <div className="flex h-16 items-center justify-center absolute top-0 right-6">
167− <button
168− id="mc-embedded-subscribe"
169− className="type-ui text-gray bg-transparent"
170− type="submit"
171− name="subscribe">
172− {/* onClick={() => _paq.push(['trackEvent', 'Mailing List', 'Subscribe'])}> */}
173− Sign Up
174− </button>
175− </div>
176− </div>
177− </div>
178− </form>
179− <h3 className="mt-8">Follow us on <a className="text-green" href={contact.twitter}>Twitter</a></h3>
180− <h3 className="mt-8">Explore code on <a className="text-green" href={contact.github}>Github</a></h3>
181− <h3 className="mt-8">Ask questions in our <a className="text-green" href={contact.discord}>Discord</a></h3>
182− <h3 className="mt-8">Boot Urbit and join <code className="bg-wall p-2 rounded-lg">{contact.urbitCommunity}</code></h3>
185+ <NewsletterSignup />
186+ <h4 className="mt-12">
187+ Follow us on{" "}
188+ <a className="text-green" href={contact.twitter}>
189+ Twitter
190+ </a>
191+ </h4>
192+ <h4 className="mt-6">
193+ Explore code on{" "}
194+ <a className="text-green" href={contact.github}>
195+ Github
196+ </a>
197+ </h4>
198+ <h4 className="mt-6">
199+ Ask questions in our{" "}
200+ <a className="text-green" href={contact.discord}>
201+ Discord
202+ </a>
203+ </h4>
204+ <h4 className="mt-6">
205+ Boot Urbit and join{" "}
206+ <code className="bg-wall p-2 rounded-lg">
207+ {contact.urbitCommunity}
208+ </code>
209+ </h4>
183210 </section>
184−
185211 </SingleColumn>
186−
187− <Footer/>
188−
212+
213+ <Footer />
189214 </Container>
190− )
215+ );
191216}
192217
193218export async function getStaticProps() {
194− const posts = getAllPosts([
195− 'title',
196− 'slug',
197− 'date',
198− 'description',
199− 'extra',
200− ], 'blog')
201−
202− const events = getAllPosts([
203− 'title',
204− 'slug',
205− 'date',
206− 'extra',
207− ], 'events')
219+ const posts = getAllPosts(
220+ ["title", "slug", "date", "description", "extra"],
221+ "blog"
222+ );
223+
224+ const events = getAllPosts(["title", "slug", "date", "extra"], "events");
208225
209226 return {
210227 props: { posts, events },
211− }
228+ };
212229}
styles/globals.css+110−97
@@ -2,8 +2,8 @@
22 font-size:16px;
33} */
44
5−@import url('https://fonts.googleapis.com/css2?family=Source+Code+Pro:wght@400;500;600;700&display=swap');
6−@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Source+Code+Pro:wght@400;500;600;700&display=swap');
5+@import url("https://fonts.googleapis.com/css2?family=Source+Code+Pro:wght@400;500;600;700&display=swap");
6+@import url("https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Source+Code+Pro:wght@400;500;600;700&display=swap");
77
88html,
99body {
@@ -26,110 +26,123 @@ p a {
2626}
2727
2828.layout-narrow {
29− @apply w-8/12;
29+ @apply w-8/12;
3030}
3131
3232.layout-wide {
3333 @apply w-10/12;
3434}
3535
36−h1, .type-h1 {
37− @apply text-6xl leading-tight tracking-tight font-bold;
38− }
39−
40−h2, .type-h2 {
41− @apply text-5xl font-bold;
42−}
43−
44−h3, .type-h3 {
45− @apply text-2xl font-semibold;
46−}
47−
48− .type-ui {
49− @apply text-lg font-semibold;
50− }
51−
52− p, .type-p {
53− @apply text-lg;
54− }
55−
56− caption, .type-caption {
57− @apply text-base font-medium block text-left;
58− }
59−
60− code .type-code {
61− @apply bg-wall p-4 font-mono;
62− }
63−
64− .button-sm {
65− @apply flex px-4 py-1 rounded type-ui;
66− border:none;
67− }
68−
69− .button-lg {
70− @apply flex px-6 py-2 rounded-lg h-16 flex-center type-ui;
71− border:none;
72− }
73−
74− .tab-button-lg {
75− @apply type-h2 h-16;
76− overflow: visible;
77− }
78−
79− .button-sm:hover {
80− opacity: 0.66;
81− }
82−
83− .button-lg:hover {
84− opacity: 0.66;
85− }
86−
87− a:hover {
88− opacity: 0.66;
89− }
90−
91− .hero-card-height {
92− height: 750px;
93− }
94−
95− .hero-image-height {
96− height: 686px;
97− }
98−
99− .hero-image {
100− transform: translateX(8%);
101− }
102−
103− .measure {
104− max-width: 34rem;
105− }
106−
107− .flex-center {
108− display: flex;
109− align-items: center;
110− justify-content: center;
111− }
112−
113− .blog-grid {
114− width: 100%;
115− display: grid;
116− gap: 3rem;
117− grid-template-columns: 1fr 1fr;
118− grid-template-rows: 1fr 1fr;
119− grid-template-areas:
120− "blog-grid-0 blog-grid-1"
121− "blog-grid-2 blog-grid-3"
122− }
123−
124− .blog-grid-0 { grid-area: blog-grid-0; }
125− .blog-grid-1 { grid-area: blog-grid-1; }
126− .blog-grid-2 { grid-area: blog-grid-2; }
127− .blog-grid-3 { grid-area: blog-grid-3; }
128−
36+h1,
37+.type-h1 {
38+ @apply text-6xl leading-tight tracking-tight font-bold;
39+}
40+
41+h2,
42+.type-h2 {
43+ @apply text-5xl font-bold;
44+}
45+
46+h3,
47+.type-h3 {
48+ @apply text-2xl font-semibold;
49+}
50+
51+h4,
52+.type-ui {
53+ @apply text-xl font-semibold;
54+}
55+
56+p,
57+.type-p {
58+ @apply text-xl;
59+}
60+
61+caption,
62+.type-caption {
63+ @apply text-base font-medium block text-left;
64+}
65+
66+code .type-code {
67+ @apply bg-wall p-4 font-mono;
68+}
69+
70+.button-sm {
71+ @apply flex px-4 py-1 rounded type-ui;
72+ border: none;
73+}
74+
75+.button-lg {
76+ @apply flex px-6 py-2 rounded-lg h-16 flex-center type-ui;
77+ border: none;
78+}
79+
80+.tab-button-lg {
81+ @apply type-h2 h-16;
82+ overflow: visible;
83+}
84+
85+.button-sm:hover {
86+ opacity: 0.66;
87+}
88+
89+.button-lg:hover {
90+ opacity: 0.66;
91+}
92+
93+a:hover {
94+ opacity: 0.66;
95+}
96+
97+.hero-card-height {
98+ height: 750px;
99+}
100+
101+.hero-image-height {
102+ height: 686px;
103+}
104+
105+.hero-image {
106+ transform: translateX(8%);
107+}
108+
109+.measure {
110+ max-width: 34rem;
111+}
112+
113+.flex-center {
114+ display: flex;
115+ align-items: center;
116+ justify-content: center;
117+}
118+
119+.blog-grid {
120+ width: 100%;
121+ display: grid;
122+ gap: 3rem;
123+ grid-template-columns: 1fr 1fr;
124+ grid-template-rows: 1fr 1fr;
125+ grid-template-areas:
126+ "blog-grid-0 blog-grid-1"
127+ "blog-grid-2 blog-grid-3";
128+}
129+
130+.blog-grid-0 {
131+ grid-area: blog-grid-0;
132+}
133+.blog-grid-1 {
134+ grid-area: blog-grid-1;
135+}
136+.blog-grid-2 {
137+ grid-area: blog-grid-2;
138+}
139+.blog-grid-3 {
140+ grid-area: blog-grid-3;
141+}
142+
129143.bg-img {
130144 background: silver;
131145 background-repeat: no-repeat;
132146 background-size: cover;
133147 background-position: center center;
134148}
135−
styles/markdown.module.css+70−67
@@ -1,74 +1,77 @@
11.markdown {
2− /* @apply leading-relaxed; */
2+ /* @apply leading-relaxed; */
33 /* max-width: ; */
44 @apply w-8/12;
55}
6−
7− .markdown p,
8− .markdown ul,
9− .markdown ol,
10− .markdown blockquote {
11− @apply my-8;
12− }
136
14− .markdown h1 {
15− @apply text-5xl font-bold mt-24 mb-12;
16− }
17−
18− .markdown h2 {
19− @apply text-4xl font-bold mt-16 mb-12;
20− }
21−
22− .markdown h3 {
23− @apply text-2xl font-semibold mt-8 mb-8;
24− }
25−
26−
27− .markdown h4 {
28− @apply text-xl font-semibold mt-4 mb-4;
29− }
30−
31− .markdown p {
32− //styleName: P;
33− font-family: Inter;
34− font-size: 20px;
35− font-style: normal;
36− font-weight: 400;
37− line-height: 32px;
38− letter-spacing: -0.011em;
39− text-align: left;
40− }
7+.markdown *:last-child {
8+ padding-bottom: 0px;
9+ margin-bottom: 0px;
10+}
11+
12+.markdown p,
13+.markdown ul,
14+.markdown ol,
15+.markdown blockquote {
16+ @apply my-8;
17+}
4118
42− .markdown img {
43− width: 100%;
44− height: auto;
45− @apply rounded-lg;
46− }
47−
48− .markdown figure {
49− position: relative;
50− width: 125%;
51− left: -12.5%;
52− @apply mt-12 mb-12;
53− }
54−
55− .markdown pre {
56− @apply p-8 bg-wall rounded-lg;
57− }
58−
59− .markdown code {
60− @apply px-2 py-0.5 bg-wall rounded-lg;
61− }
62−
63− .markdown ul {
64− list-style-type: disc;
65− }
66−
67− .markdown ol {
68− }
69−
70− .markdown li {
71− font-size: 20px;
72− @apply py-2 ml-6;
73− }
19+.markdown h1 {
20+ @apply text-5xl font-bold mt-24 mb-12;
21+}
7422
23+.markdown h2 {
24+ @apply text-4xl font-bold mt-16 mb-12;
25+}
26+
27+.markdown h3 {
28+ @apply text-2xl font-semibold mt-8 mb-8;
29+}
30+
31+.markdown h4 {
32+ @apply text-xl font-semibold mt-4 mb-4;
33+}
34+
35+.markdown p {
36+ //styleName: P;
37+ font-family: Inter;
38+ font-size: 20px;
39+ font-style: normal;
40+ font-weight: 400;
41+ line-height: 32px;
42+ letter-spacing: -0.011em;
43+ text-align: left;
44+}
45+
46+.markdown img {
47+ width: 100%;
48+ height: auto;
49+ @apply rounded-lg;
50+}
51+
52+.markdown figure {
53+ position: relative;
54+ width: 125%;
55+ left: -12.5%;
56+ @apply mt-12 mb-12;
57+}
58+
59+.markdown pre {
60+ @apply p-8 bg-wall rounded-lg;
61+}
62+
63+.markdown code {
64+ @apply px-2 py-0.5 bg-wall rounded-lg;
65+}
66+
67+.markdown ul {
68+ list-style-type: disc;
69+}
70+
71+.markdown ol {
72+}
73+
74+.markdown li {
75+ font-size: 20px;
76+ @apply py-2 ml-6;
77+}