1import lume from "lume/mod.ts";
2import brotli from "lume/plugins/brotli.ts";
3import code_highlight from "lume/plugins/code_highlight.ts";
4import feed from "lume/plugins/feed.ts";
5import lightningcss from "lume/plugins/lightningcss.ts";
6import icons from "lume/plugins/icons.ts";
7import inline from "lume/plugins/inline.ts";
8import metas from "lume/plugins/metas.ts";
9import minify_html from "lume/plugins/minify_html.ts";
10import nav from "lume/plugins/nav.ts";
11import og_images from "lume/plugins/og_images.ts";
12import pagefind from "lume/plugins/pagefind.ts";
13import picture from "lume/plugins/picture.ts";
14import postcss from "lume/plugins/postcss.ts";
15import purgecss from "lume/plugins/purgecss.ts";
16import relations from "lume/plugins/relations.ts";
17import robots from "lume/plugins/robots.ts";
18import sitemap from "lume/plugins/sitemap.ts";
19import slugify_urls from "lume/plugins/slugify_urls.ts";
20import source_maps from "lume/plugins/source_maps.ts";
21import sri from "lume/plugins/sri.ts";
22import svgo from "lume/plugins/svgo.ts";
23import tailwindcss from "lume/plugins/tailwindcss.ts";
24import toml from "lume/plugins/toml.ts";
25import transform_images from "lume/plugins/transform_images.ts";
26
27import catppuccin from "npm:@catppuccin/tailwindcss";
28
29const site = lume({
30 src: "./src",
31 location: new URL("https://blog.pyrox.dev"),
32});
33
34site.loadAssets([".css"]);
35site.copy([".woff2"]);
36
37site.use(code_highlight());
38site.use(icons());
39site.use(inline());
40site.use(metas());
41site.use(minify_html());
42site.use(nav());
43site.use(og_images());
44site.use(pagefind());
45site.use(picture());
46site.use(transform_images());
47site.use(relations());
48site.use(robots());
49site.use(sitemap());
50site.use(slugify_urls());
51site.use(sri());
52site.use(svgo());
53site.use(toml());
54
55// Tailwind CSS
56site.use(tailwindcss({
57 extensions: [".html", ".vto"],
58 options: {
59 plugins: [catppuccin],
60 safelist: ['latte']
61 }
62}))
63site.use(postcss())
64
65// RSS/JSON Feed Generation
66site.use(feed({
67 output: ["/blog.rss", "/blog.json"],
68 query: "type=blog",
69 sort: "date=desc",
70 info: {
71 title: "dish blog",
72 description: "dish's thoughts on many things",
73 published: new Date(),
74 lang: "en",
75 generator: true,
76 authorName: "dish",
77 authorUrl: "https://blog.pyrox.dev",
78 },
79 items: {
80 title: "=title",
81 description: "=summary",
82 published: "=published",
83 updated: "=updated || undefined",
84 content: "=children",
85 lang: "=lang",
86 image: "=banner",
87 authorName: "=author.name",
88 authorUrl: "=author.url",
89 },
90}));
91
92// CSS postprocessing
93site.use(purgecss())
94site.use(lightningcss({
95 options: {
96 minify: true,
97 bundle: false,
98 }
99}));
100
101// Source Map Generation
102site.use(source_maps());
103
104// Compress everything with Brotli
105site.use(brotli({
106 extensions: [
107 ".html",
108 ".css",
109 ".js",
110 ".mjs",
111 ".svg",
112 ".json",
113 ".xml",
114 ".txt",
115 ".rss",
116 ".map"
117 ]
118}));
119
120export default site;