From 819f2e4acaca1ecb47c4cc8b0db4f4ed6651ef32 Mon Sep 17 00:00:00 2001 From: Mikkel Svartveit Date: Fri, 20 Oct 2023 00:57:09 -0700 Subject: [PATCH 1/5] Build article page --- src/assets/images/lorempicsum.jpeg | Bin 0 -> 46659 bytes src/components/Navbar.svelte | 2 +- src/content/blog/lorem-2.md | 21 ++++++++++ src/content/blog/lorem-3.md | 21 ++++++++++ src/content/blog/lorem.md | 21 ++++++++++ src/content/config.ts | 11 ++++++ src/pages/articles/[article].astro | 43 +++++++++++++++++++++ src/pages/articles/index.astro | 60 +++++++++++++++++++++++++++++ src/pages/index.astro | 58 ++++++++++++++++++++++++---- src/pages/photography/index.astro | 1 - src/pages/programming/index.astro | 2 +- 11 files changed, 230 insertions(+), 10 deletions(-) create mode 100644 src/assets/images/lorempicsum.jpeg create mode 100644 src/content/blog/lorem-2.md create mode 100644 src/content/blog/lorem-3.md create mode 100644 src/content/blog/lorem.md create mode 100644 src/pages/articles/[article].astro create mode 100644 src/pages/articles/index.astro diff --git a/src/assets/images/lorempicsum.jpeg b/src/assets/images/lorempicsum.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..dd02c8e0e29374746e8fc773d21c604c6e462f8a GIT binary patch literal 46659 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 literal 0 HcmV?d00001 diff --git a/src/components/Navbar.svelte b/src/components/Navbar.svelte index d13bcc4..b8b9167 100644 --- a/src/components/Navbar.svelte +++ b/src/components/Navbar.svelte @@ -9,9 +9,9 @@ $: isScrolled = scrollPosition > 0; const navbarContent = [ + { name: "📝 Articles", href: "/articles" }, { name: "👨‍💻 Projects", href: "/programming" }, { name: "📷 Photography", href: "/photography" }, - // { name: "📝 Articles", href: "/articles" }, ]; let collapsed = true; diff --git a/src/content/blog/lorem-2.md b/src/content/blog/lorem-2.md new file mode 100644 index 0000000..fc9075a --- /dev/null +++ b/src/content/blog/lorem-2.md @@ -0,0 +1,21 @@ +--- +intro: "Nunc at ex consequat, tincidunt est eu, pellentesque tellus. Sed sodales massa et condimentum pharetra. Curabitur euismod ac arcu id dapibus." +image: "@assets/images/lorempicsum.jpeg" +date: 2023-10-19 +--- + +# Lorem ipsum dolor sit amet, consectetur adipiscing elit + +## Heading 2 + +### Heading 3 + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc at ex consequat, tincidunt est eu, pellentesque tellus. Sed sodales massa et condimentum pharetra. Curabitur euismod ac arcu id dapibus. Aliquam viverra tellus quis sem interdum commodo. Vivamus vel porttitor massa. Fusce vitae risus quis lacus blandit tincidunt. Phasellus pretium condimentum eleifend. Ut sit amet ligula eget sapien luctus bibendum eu in neque. Praesent at commodo augue. Sed a aliquet nibh. Praesent venenatis massa sit amet tempor volutpat. Praesent porttitor ultricies dui, non rutrum tortor eleifend et. Ut et massa a massa bibendum ornare vitae non massa. Donec lacus lacus, tempor id mollis ac, commodo et tortor. + +Donec malesuada, mauris id viverra viverra, velit velit finibus nulla, quis elementum orci elit non mauris. Phasellus odio neque, lobortis in dignissim at, aliquet in quam. Nullam et sodales nibh. Integer vulputate lacinia ultrices. Cras pharetra tincidunt vehicula. Maecenas sit amet eleifend dolor, sed accumsan magna. Mauris sed mi quis magna molestie molestie. + +Integer dui sem, imperdiet sit amet pretium nec, interdum sit amet justo. Praesent imperdiet ante urna, ac commodo nisl luctus quis. Aenean sit amet pretium dolor. Maecenas efficitur augue eget ipsum vulputate, quis dapibus nulla egestas. Nunc et ullamcorper risus. Morbi mauris neque, malesuada sit amet dictum et, fringilla vel velit. Suspendisse tincidunt neque vitae orci pharetra, vel rhoncus justo maximus. Quisque lacinia feugiat vulputate. Donec quis nunc felis. Donec rhoncus tempor ex sit amet tristique. Integer a ex velit. Nunc nec sapien sit amet massa pretium elementum eget vitae tellus. Curabitur et ligula sit amet turpis viverra convallis. Interdum et malesuada fames ac ante ipsum primis in faucibus. + +Curabitur at ex facilisis, tincidunt risus lacinia, maximus arcu. Suspendisse lobortis id orci at laoreet. Donec luctus urna ac condimentum aliquet. Nulla ac libero lacus. Vestibulum fermentum, augue at faucibus laoreet, leo libero blandit mi, et porta libero justo non risus. Etiam sollicitudin facilisis condimentum. Proin a gravida velit, quis pulvinar odio. Nam vehicula risus in nisi euismod, in hendrerit est fermentum. Morbi fermentum elementum urna, non rhoncus libero sodales eget. Curabitur sed felis sit amet dolor facilisis elementum et vitae dolor. + +Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Etiam quis tempor lorem. Sed bibendum pulvinar nibh eget feugiat. Sed at vehicula odio. Vivamus porttitor magna tortor, sit amet venenatis sapien lobortis at. Nam placerat condimentum purus in pellentesque. Quisque gravida tincidunt tincidunt. Duis varius, est ac molestie posuere, nisl mauris lacinia ex, tincidunt hendrerit enim eros eget turpis. Nulla facilisi. diff --git a/src/content/blog/lorem-3.md b/src/content/blog/lorem-3.md new file mode 100644 index 0000000..fc9075a --- /dev/null +++ b/src/content/blog/lorem-3.md @@ -0,0 +1,21 @@ +--- +intro: "Nunc at ex consequat, tincidunt est eu, pellentesque tellus. Sed sodales massa et condimentum pharetra. Curabitur euismod ac arcu id dapibus." +image: "@assets/images/lorempicsum.jpeg" +date: 2023-10-19 +--- + +# Lorem ipsum dolor sit amet, consectetur adipiscing elit + +## Heading 2 + +### Heading 3 + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc at ex consequat, tincidunt est eu, pellentesque tellus. Sed sodales massa et condimentum pharetra. Curabitur euismod ac arcu id dapibus. Aliquam viverra tellus quis sem interdum commodo. Vivamus vel porttitor massa. Fusce vitae risus quis lacus blandit tincidunt. Phasellus pretium condimentum eleifend. Ut sit amet ligula eget sapien luctus bibendum eu in neque. Praesent at commodo augue. Sed a aliquet nibh. Praesent venenatis massa sit amet tempor volutpat. Praesent porttitor ultricies dui, non rutrum tortor eleifend et. Ut et massa a massa bibendum ornare vitae non massa. Donec lacus lacus, tempor id mollis ac, commodo et tortor. + +Donec malesuada, mauris id viverra viverra, velit velit finibus nulla, quis elementum orci elit non mauris. Phasellus odio neque, lobortis in dignissim at, aliquet in quam. Nullam et sodales nibh. Integer vulputate lacinia ultrices. Cras pharetra tincidunt vehicula. Maecenas sit amet eleifend dolor, sed accumsan magna. Mauris sed mi quis magna molestie molestie. + +Integer dui sem, imperdiet sit amet pretium nec, interdum sit amet justo. Praesent imperdiet ante urna, ac commodo nisl luctus quis. Aenean sit amet pretium dolor. Maecenas efficitur augue eget ipsum vulputate, quis dapibus nulla egestas. Nunc et ullamcorper risus. Morbi mauris neque, malesuada sit amet dictum et, fringilla vel velit. Suspendisse tincidunt neque vitae orci pharetra, vel rhoncus justo maximus. Quisque lacinia feugiat vulputate. Donec quis nunc felis. Donec rhoncus tempor ex sit amet tristique. Integer a ex velit. Nunc nec sapien sit amet massa pretium elementum eget vitae tellus. Curabitur et ligula sit amet turpis viverra convallis. Interdum et malesuada fames ac ante ipsum primis in faucibus. + +Curabitur at ex facilisis, tincidunt risus lacinia, maximus arcu. Suspendisse lobortis id orci at laoreet. Donec luctus urna ac condimentum aliquet. Nulla ac libero lacus. Vestibulum fermentum, augue at faucibus laoreet, leo libero blandit mi, et porta libero justo non risus. Etiam sollicitudin facilisis condimentum. Proin a gravida velit, quis pulvinar odio. Nam vehicula risus in nisi euismod, in hendrerit est fermentum. Morbi fermentum elementum urna, non rhoncus libero sodales eget. Curabitur sed felis sit amet dolor facilisis elementum et vitae dolor. + +Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Etiam quis tempor lorem. Sed bibendum pulvinar nibh eget feugiat. Sed at vehicula odio. Vivamus porttitor magna tortor, sit amet venenatis sapien lobortis at. Nam placerat condimentum purus in pellentesque. Quisque gravida tincidunt tincidunt. Duis varius, est ac molestie posuere, nisl mauris lacinia ex, tincidunt hendrerit enim eros eget turpis. Nulla facilisi. diff --git a/src/content/blog/lorem.md b/src/content/blog/lorem.md new file mode 100644 index 0000000..fc9075a --- /dev/null +++ b/src/content/blog/lorem.md @@ -0,0 +1,21 @@ +--- +intro: "Nunc at ex consequat, tincidunt est eu, pellentesque tellus. Sed sodales massa et condimentum pharetra. Curabitur euismod ac arcu id dapibus." +image: "@assets/images/lorempicsum.jpeg" +date: 2023-10-19 +--- + +# Lorem ipsum dolor sit amet, consectetur adipiscing elit + +## Heading 2 + +### Heading 3 + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc at ex consequat, tincidunt est eu, pellentesque tellus. Sed sodales massa et condimentum pharetra. Curabitur euismod ac arcu id dapibus. Aliquam viverra tellus quis sem interdum commodo. Vivamus vel porttitor massa. Fusce vitae risus quis lacus blandit tincidunt. Phasellus pretium condimentum eleifend. Ut sit amet ligula eget sapien luctus bibendum eu in neque. Praesent at commodo augue. Sed a aliquet nibh. Praesent venenatis massa sit amet tempor volutpat. Praesent porttitor ultricies dui, non rutrum tortor eleifend et. Ut et massa a massa bibendum ornare vitae non massa. Donec lacus lacus, tempor id mollis ac, commodo et tortor. + +Donec malesuada, mauris id viverra viverra, velit velit finibus nulla, quis elementum orci elit non mauris. Phasellus odio neque, lobortis in dignissim at, aliquet in quam. Nullam et sodales nibh. Integer vulputate lacinia ultrices. Cras pharetra tincidunt vehicula. Maecenas sit amet eleifend dolor, sed accumsan magna. Mauris sed mi quis magna molestie molestie. + +Integer dui sem, imperdiet sit amet pretium nec, interdum sit amet justo. Praesent imperdiet ante urna, ac commodo nisl luctus quis. Aenean sit amet pretium dolor. Maecenas efficitur augue eget ipsum vulputate, quis dapibus nulla egestas. Nunc et ullamcorper risus. Morbi mauris neque, malesuada sit amet dictum et, fringilla vel velit. Suspendisse tincidunt neque vitae orci pharetra, vel rhoncus justo maximus. Quisque lacinia feugiat vulputate. Donec quis nunc felis. Donec rhoncus tempor ex sit amet tristique. Integer a ex velit. Nunc nec sapien sit amet massa pretium elementum eget vitae tellus. Curabitur et ligula sit amet turpis viverra convallis. Interdum et malesuada fames ac ante ipsum primis in faucibus. + +Curabitur at ex facilisis, tincidunt risus lacinia, maximus arcu. Suspendisse lobortis id orci at laoreet. Donec luctus urna ac condimentum aliquet. Nulla ac libero lacus. Vestibulum fermentum, augue at faucibus laoreet, leo libero blandit mi, et porta libero justo non risus. Etiam sollicitudin facilisis condimentum. Proin a gravida velit, quis pulvinar odio. Nam vehicula risus in nisi euismod, in hendrerit est fermentum. Morbi fermentum elementum urna, non rhoncus libero sodales eget. Curabitur sed felis sit amet dolor facilisis elementum et vitae dolor. + +Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Etiam quis tempor lorem. Sed bibendum pulvinar nibh eget feugiat. Sed at vehicula odio. Vivamus porttitor magna tortor, sit amet venenatis sapien lobortis at. Nam placerat condimentum purus in pellentesque. Quisque gravida tincidunt tincidunt. Duis varius, est ac molestie posuere, nisl mauris lacinia ex, tincidunt hendrerit enim eros eget turpis. Nulla facilisi. diff --git a/src/content/config.ts b/src/content/config.ts index 29b21e1..074dd74 100644 --- a/src/content/config.ts +++ b/src/content/config.ts @@ -14,6 +14,17 @@ const programmingCollection = defineCollection({ }), }); +const blogCollection = defineCollection({ + type: "content", + schema: ({ image }) => + z.object({ + image: image(), + intro: z.string(), + date: z.date(), + }), +}); + export const collections = { programming: programmingCollection, + blog: blogCollection, }; diff --git a/src/pages/articles/[article].astro b/src/pages/articles/[article].astro new file mode 100644 index 0000000..cd18f57 --- /dev/null +++ b/src/pages/articles/[article].astro @@ -0,0 +1,43 @@ +--- +import ContainerLayout from "@layouts/ContainerLayout.astro"; +import BaseLayout from "@layouts/BaseLayout.astro"; +import TextContentLayout from "@layouts/TextContentLayout.astro"; +import type { GetStaticPaths } from "astro"; +import { getCollection } from "astro:content"; + +export const getStaticPaths = (async () => { + const blogCollection = await getCollection("blog"); + return blogCollection.map((entry) => ({ + params: { + article: entry.slug, + }, + props: { entry }, + })); +}) satisfies GetStaticPaths; + +const project = Astro.props.entry; +const { Content } = await project.render(); +const { title, date } = project.data; +--- + + + + +

+ { + new Date(date).toLocaleDateString("en-US", { + month: "long", + day: "numeric", + year: "numeric", + }) + } +

+ +
+ +
+
+
+
diff --git a/src/pages/articles/index.astro b/src/pages/articles/index.astro new file mode 100644 index 0000000..e210c1e --- /dev/null +++ b/src/pages/articles/index.astro @@ -0,0 +1,60 @@ +--- +import { Image } from "astro:assets"; +import Paragraph from "@components/Paragraph.astro"; +import ContainerLayout from "@layouts/ContainerLayout.astro"; +import BaseLayout from "@layouts/BaseLayout.astro"; +import TextContentLayout from "@layouts/TextContentLayout.astro"; +import { getCollection } from "astro:content"; + +const articles = await getCollection("blog"); +--- + + + + +

+ Articles +

+ + + Sometimes I write about technology, programming, software, productivity + or other things that interests me. + + +
+ { + articles + .sort((p2, p1) => p1.data.date.getTime() - p2.data.date.getTime()) + .map(async (article) => { + const { slug, data } = article; + const { image, intro } = data; + const { headings } = await article.render(); + const title = headings[0].text; + return ( + + {title} + +
+

+ {title} +

+ +

{intro}

+
+
+ ); + }) + } +
+
+
+
diff --git a/src/pages/index.astro b/src/pages/index.astro index d6ba41e..743336b 100644 --- a/src/pages/index.astro +++ b/src/pages/index.astro @@ -1,18 +1,26 @@ --- +import { getCollection } from "astro:content"; import { Image } from "astro:assets"; import BaseLayout from "../layouts/BaseLayout.astro"; import Link from "@components/Link.astro"; import Paragraph from "@components/Paragraph.astro"; import SocialIcons from "@components/SocialIcons.astro"; - import portraitImage from "@assets/images/portrait.jpg"; + +const articles = await getCollection("blog"); +const latestArticle = articles.sort( + (p2, p1) => p1.data.date.getTime() - p2.data.date.getTime(), +)[0]; +const latestArticleSlug = latestArticle.slug; +const latestArticleTitle = (await latestArticle.render()).headings[0].text; +const latestArticleImage = latestArticle.data.image; ---
-
+

@@ -26,9 +34,10 @@ import portraitImage from "@assets/images/portrait.jpg"; Here you will find some - programming projects, and a small + programming projects, a small collection of photos - I'm proud of. + I'm proud of, and even a few + articles I've written. @@ -41,7 +50,7 @@ import portraitImage from "@assets/images/portrait.jpg";

-
+
-
+

Latest article

-

Latest article

-
- -

{latestArticleTitle}

+ +

{latestArticleTitle}

diff --git a/tailwind.config.mjs b/tailwind.config.mjs index 5a674a0..0ecd4e1 100644 --- a/tailwind.config.mjs +++ b/tailwind.config.mjs @@ -7,7 +7,7 @@ export default { fontFamily: { sans: ["'Nunito'", ...defaultTheme.fontFamily.sans], serif: ["'Source Serif Pro'", ...defaultTheme.fontFamily.serif], - mono: [...defaultTheme.fontFamily.mono], + mono: ["'Source Code Pro'", ...defaultTheme.fontFamily.mono], }, extend: {}, }, From b64833e0a031c787571523d1953e603e934c52cb Mon Sep 17 00:00:00 2001 From: Mikkel Svartveit Date: Wed, 25 Oct 2023 10:11:54 -0700 Subject: [PATCH 4/5] Tweak text styles --- src/components/Link.astro | 2 +- src/content/blog/lorem-2.md | 21 ------- src/content/blog/lorem-3.md | 21 ------- src/content/blog/lorem.md | 21 ------- src/layouts/ProjectLayout.astro | 83 --------------------------- src/layouts/ProseLayout.astro | 5 ++ src/pages/articles/[article].astro | 7 +-- src/pages/index.astro | 41 +++++-------- src/pages/programming/[project].astro | 8 +-- 9 files changed, 28 insertions(+), 181 deletions(-) delete mode 100644 src/content/blog/lorem-2.md delete mode 100644 src/content/blog/lorem-3.md delete mode 100644 src/content/blog/lorem.md delete mode 100644 src/layouts/ProjectLayout.astro create mode 100644 src/layouts/ProseLayout.astro diff --git a/src/components/Link.astro b/src/components/Link.astro index 41dfe37..5a5e81a 100644 --- a/src/components/Link.astro +++ b/src/components/Link.astro @@ -8,7 +8,7 @@ const { href, class: className, ...attributes } = Astro.props; --- ; - -const { title, website, repository, technologies, date } = - Astro.props.frontmatter; ---- - - - - -

- {title} -

- -

- { - new Date(date).toLocaleDateString("en-US", { - month: "long", - year: "numeric", - }) - } -

- -
- { - technologies - .split(",") - .map((technology) => ( - - {technology} - - )) - } -
- -
-
- -
- - - diff --git a/src/layouts/ProseLayout.astro b/src/layouts/ProseLayout.astro new file mode 100644 index 0000000..014720b --- /dev/null +++ b/src/layouts/ProseLayout.astro @@ -0,0 +1,5 @@ +
+ +
diff --git a/src/pages/articles/[article].astro b/src/pages/articles/[article].astro index fe45210..f8ff802 100644 --- a/src/pages/articles/[article].astro +++ b/src/pages/articles/[article].astro @@ -4,6 +4,7 @@ import BaseLayout from "@layouts/BaseLayout.astro"; import TextContentLayout from "@layouts/TextContentLayout.astro"; import type { GetStaticPaths } from "astro"; import { getCollection } from "astro:content"; +import ProseLayout from "@layouts/ProseLayout.astro"; export const getStaticPaths = (async () => { const blogCollection = await getCollection("blog"); @@ -33,11 +34,9 @@ const { title, date } = project.data; }

-
+ -
+ diff --git a/src/pages/index.astro b/src/pages/index.astro index a1f3595..5f79ab9 100644 --- a/src/pages/index.astro +++ b/src/pages/index.astro @@ -42,7 +42,7 @@ const latestArticleImage = latestArticle.data.image; Want to get in touch? - Contact me. + Contact me.
@@ -72,37 +72,26 @@ const latestArticleImage = latestArticle.data.image; class="flex bg-white shadow transition hover:shadow-md hover:underline underline-offset-4 rounded-lg overflow-hidden items-center" > -

{latestArticleTitle}

+

+ {latestArticleTitle} +

- - - - - - - - - - - - - - - - - - - - - diff --git a/src/pages/programming/[project].astro b/src/pages/programming/[project].astro index f10f6a6..f42215d 100644 --- a/src/pages/programming/[project].astro +++ b/src/pages/programming/[project].astro @@ -4,6 +4,7 @@ import BaseLayout from "@layouts/BaseLayout.astro"; import TextContentLayout from "@layouts/TextContentLayout.astro"; import type { GetStaticPaths } from "astro"; import { getCollection } from "astro:content"; +import ProseLayout from "@layouts/ProseLayout.astro"; export const getStaticPaths = (async () => { const programmingEntries = await getCollection("programming"); @@ -73,11 +74,10 @@ const { title, date, technologies, website, repository } = project.data; ) } -
+ + -
+ From 9b59d68ea58fdd10b6c1f6ec360f2fa57ee4ff9e Mon Sep 17 00:00:00 2001 From: Mikkel Svartveit Date: Mon, 30 Oct 2023 22:39:16 -0700 Subject: [PATCH 5/5] Finish blog post --- src/content/blog/astro-welcome.md | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/content/blog/astro-welcome.md b/src/content/blog/astro-welcome.md index e9b5a31..7e85ca4 100644 --- a/src/content/blog/astro-welcome.md +++ b/src/content/blog/astro-welcome.md @@ -1,7 +1,7 @@ --- intro: "How I built this website, why I picked the Astro framework, and the reason Tailwind is the best way to write CSS in 2023!" image: "@assets/images/rocket.png" -date: 2023-10-20 +date: 2023-10-30 --- # Welcome to My New Personal Website! @@ -50,5 +50,19 @@ I decided to actually give Tailwind a try, and now I would honestly call Tailwin - There is no need to come up with HTML classes yourself anymore. This is a surprisingly delightful feature. Coming up with good class names selectors is hard, especially on a project where you collaborate with people that might have a different coding style than you. And all those hours wasted figuring out which CSS selectors gets the highest priority? Tailwind solves it. Your Tailwind classes determine how your element is styled, and there’s no need to think about anything more than that. - It reduces decision fatigue. As an overly perfectionist developer, I used to find myself making micro-adjustments to my styles that no one but myself would ever notice. I would frequently think “this color should probably be 2% darker”, or “this `div` for sure deserves one more pixel of bottom padding”. Tailwind mitigates this by providing a perfectly balanced style system, where the possible values are spaced apart in a way that limits your choices _just_ enough to reduce overthinking, while giving you the granularity you need. - Speaking of colors: instead of spending hours in a color picker trying to find the perfect hex value, Tailwind provides 22 base colors with 10 shades for each of them referenced in the format of `blue-400` and `amber-800`. This makes it super easy to keep a consistent color scheme but use different shades for stuff like hover effects. This color selection is so nice that in project where I don’t have Tailwind, I actually [reference the Tailwind colors from their docs](https://tailwindcss.com/docs/customizing-colors). -- Each style is tightly coupled to a single element. This is great for a couple of reasons. First, if you decide to delete some HTML or JSX code down the line, you can be sure that the styling gets deleted with it. A lot of large projects have leftovers in the CSS filel because the developers didn’t realize that style is not in use anymore. On the flip side, you never have to worry about breaking something else when changing a style in Tailwind, because the style is only in use for that one element in the first place. +- Each style is tightly coupled to a single element. This is great for a couple of reasons. First, if you decide to delete some HTML or JSX code down the line, you can be sure that the styling gets deleted with it. A lot of large projects have leftovers in the CSS file because the developers didn’t realize that style is not in use anymore. On the flip side, you never have to worry about breaking something else when changing a style in Tailwind, because the style is only in use for that one element in the first place. - And, like my coworker suggested, building websites with Tailwind is _so_ fast. Not having to constantly context switch between HTML and CSS files is a relief I didn’t realize I needed. + +However, my favorite feature of Tailwind is what it is not: a component library. Contrary to many developers I know, I actually like CSS and the flexibility it gives me, and for this reason I am not usually a fan of component libraries. These tend to lock the developer into pre-established styles, and once you try to move outside these constraints, things start to feel hacky really fast. Tailwind, though, is not a component library. It is CSS, just packaged in a better way. Yes, the HTML gets ugly (and that is probably the strongest criticism I have against Tailwind), but this is a tradeoff I’m very willing to make at this point. + +## Cloudflare Pages + +The final piece of the puzzle is my hosting platform, Cloudflare Pages. Their free tier is unbelievably good. For $0, they give you unlimited sites, unlimited requests (including commercial use!), unlimited bandwidth, 500 builds per month, and automatic deployments every time you push to any branch in your GitHub repository. + +In contrast to GitHub Pages, Cloudflare’s edge runtime (called Workers) allow you to easily enable server-side rendering features for frameworks like Next.js, Remix, SvelteKit, and Astro. I don’t use SSR for this site (it is statically rendered at build time), but I am for [Snipcast.io](https://snipcast.io). This is a SvelteKit app with some static routes, some server-rendered routes, and a bunch of API endpoints with JWT authentication and everything. Cloudflare Pages handles it all really well and was dead easy to set up. + +Oh, and it’s also straightforward to connect your custom domain. You can even buy a domain through Cloudflare (which, by the way, has the cheapest prices of any registrar), in which case they care of all the DNS stuff for you when you add it to your Pages project. + +## Conclusion + +I’m very happy with my choice of tools for this site. Astro, Svelte, Tailwind, and Cloudflare Pages give me complexity when I want, but gets out of my way when I don’t. I get the feeling that with this current setup, I can build pretty much whatever I want, scale it to almost any amount of traffic, while still being able to quickly iterate and add new content. Let’s cross our fingers that the site lasts for at least a few months before a new Javascript framework launches and I get tempted to rewrite again :D