diff --git a/deno.lock b/deno.lock index 1d63253..e736f75 100644 --- a/deno.lock +++ b/deno.lock @@ -666,7 +666,6 @@ "https://deno.land/x/lume@v3.0.2/deps/hex.ts": "828718f24a780ff3ade8d0a8a5b57497cb31c257560ef12af99b6eb1a31e3bbd", "https://deno.land/x/lume@v3.0.2/deps/highlight.ts": "e8f830a1137ff7e8246ce21518452b8cbf8089db409458c6d9c31040c11d8428", "https://deno.land/x/lume@v3.0.2/deps/http.ts": "6d9add7c6fe0c0381050aa773ae8590166ccc84c5115d2cde271320c315a110d", - "https://deno.land/x/lume@v3.0.2/deps/icons.ts": "4379e1443d982ab4f85237342d165ae54c981cdb7e06480c222d208999e21f15", "https://deno.land/x/lume@v3.0.2/deps/init.ts": "05d45af66ebdfe63e43540618f51ece8f99d98dc49de890f10eeb43abe9ed0f3", "https://deno.land/x/lume@v3.0.2/deps/jsonc.ts": "79f0eddc3c9e593310eb8e5918eb1506b1c7d7816e4ecb96894f634ecbe626ff", "https://deno.land/x/lume@v3.0.2/deps/lightningcss.ts": "5f5167c6eb306ef759f0043f8f33f2eaf63c69210aa1aa837505e990ee619c46", @@ -692,7 +691,6 @@ "https://deno.land/x/lume@v3.0.2/plugins/code_highlight.ts": "ac6327e688e9e8fbd7798bdcc5f76b46d27db3e22ea3b74f545dc3296e8a1261", "https://deno.land/x/lume@v3.0.2/plugins/extract_date.ts": "38af8e5960d66a74a72977eb19521da4353ab32d3941e97c1526aa3b91175a9e", "https://deno.land/x/lume@v3.0.2/plugins/feed.ts": "b07aed4cda270cfaacb26f9974dbb962f936dbfde4d770c53e478e4682c791e1", - "https://deno.land/x/lume@v3.0.2/plugins/icons.ts": "c69428254024d694eca34f9b5c4888aedf83d2d9b38f860533952c28cc814333", "https://deno.land/x/lume@v3.0.2/plugins/inline.ts": "737d7de09d196476b55ecbe7ddb0e651ba2d5d39ca5a418cb15ff48e124907c1", "https://deno.land/x/lume@v3.0.2/plugins/json.ts": "5c49499e56b919ec848d4118ec97dd4fe0a323a6cc4c648dc45ab55297614c12", "https://deno.land/x/lume@v3.0.2/plugins/lightningcss.ts": "6b5236cc78c1ae4af5b4a0037a0345797381f5043c667ae1ddeb4f67e445c7c4", diff --git a/site.ts b/site.ts index 89c4035..7b59c63 100644 --- a/site.ts +++ b/site.ts @@ -1,25 +1,25 @@ import lume from "lume/mod.ts"; -import extract_date from "lume/plugins/extract_date.ts"; -import code_highlight from "lume/plugins/code_highlight.ts"; +import extractDate from "lume/plugins/extract_date.ts"; +import codeHighlight from "lume/plugins/code_highlight.ts"; import redirects from "lume/plugins/redirects.ts"; import tailwindcss from "lume/plugins/tailwindcss.ts"; import lightningcss from "lume/plugins/lightningcss.ts"; -import resolve_urls from "lume/plugins/resolve_urls.ts"; -import slugify_urls from "lume/plugins/slugify_urls.ts"; -import check_urls from "lume/plugins/check_urls.ts"; +import resolveUrls from "lume/plugins/resolve_urls.ts"; +import slugifyUrls from "lume/plugins/slugify_urls.ts"; +import checkUrls from "lume/plugins/check_urls.ts"; import inline from "lume/plugins/inline.ts"; import feed from "lume/plugins/feed.ts"; import sitemap from "lume/plugins/sitemap.ts"; -import minify_html from "lume/plugins/minify_html.ts"; +import minifyHtml from "lume/plugins/minify_html.ts"; -const site_name = "RGBCube"; -const site_description = +const siteName = "RGBCube"; +const siteDescription = "The home directory and journal of RGBCube and his work."; const author = "RGBCube"; const color = "#00FFFF"; -const path_assets = "/assets"; +const pathAssets = "/assets"; const site = lume({ src: "./site", @@ -31,9 +31,9 @@ const site = lume({ site.data("layout", "default.vto"); -site.data("site_name", site_name); -site.data("title", site_name); -site.data("description", site_description); +site.data("site_name", siteName); +site.data("title", siteName); +site.data("description", siteDescription); site.data("author", author); site.data("color", color); @@ -69,20 +69,52 @@ site.process([".html"], (pages) => { element.parentNode!.insertBefore(wrapper, element); wrapper.appendChild(element); }); + + document + .querySelectorAll(".text-content :where(h1, h2, h3, h4, h5, h6)") + .forEach((header) => { + if (header.id || header.closest("a") || header.querySelector("a")) { + return; + } + + const textNormalized = header + .textContent! + .toLowerCase() + .replace(/[^a-z0-9\s-]/g, "") + .replace(/\s+/g, "-") + .replace(/-+/g, "-") + .trim(); + + let textUnique = textNormalized; + let counter = 1; + + while (document.getElementById(textUnique)) { + counter++; + textUnique = `${textNormalized}-${counter}`; + } + + header.id = textUnique; + + const link = document.createElement("a"); + link.setAttribute("href", "#" + textUnique); + + header.parentNode!.insertBefore(link, header); + link.appendChild(header); + }); }); }); -site.use(extract_date()); +site.use(extractDate()); site.use(redirects()); site.use(tailwindcss()); -site.use(code_highlight()); +site.use(codeHighlight()); -site.use(resolve_urls()); -site.use(slugify_urls({ +site.use(resolveUrls()); +site.use(slugifyUrls({ extensions: "*", })); -site.use(check_urls({ +site.use(checkUrls({ strict: true, throw: true, })); @@ -95,12 +127,12 @@ site.use(feed({ limit: Infinity, info: { - title: site_name, - description: site_description, + title: siteName, + description: siteDescription, authorName: author, - image: `${path_assets}/icons/icon.webp`, - icon: `${path_assets}/icons/icon.webp`, + image: `${pathAssets}/icons/icon.webp`, + icon: `${pathAssets}/icons/icon.webp`, color, @@ -122,7 +154,7 @@ site.use(sitemap({ site.use(lightningcss()); // TODO: LightningCSS doesn't handle inline styles. site.use(inline()); -site.use(minify_html({ +site.use(minifyHtml({ options: { // TODO: This breaks tailwind. // minify_css: true, diff --git a/site/404.vto b/site/404.vto index 209b2ad..62f4a22 100644 --- a/site/404.vto +++ b/site/404.vto @@ -4,10 +4,20 @@ prevent_zoom: true --- @@ -28,4 +38,6 @@ prevent_zoom: true {{ set cube_face_top = cube_face }} {{ set cube_face_bottom = cube_face }} +{{ set cube_size = "5rem" }} +{{ set cube_last = true }} {{ include "cube.vto" }} diff --git a/site/_includes/cube.vto b/site/_includes/cube.vto index 814701c..d88bc3d 100644 --- a/site/_includes/cube.vto +++ b/site/_includes/cube.vto @@ -1,44 +1,43 @@ - +{{ /if }} - {{> const style = ` - size-(--cube-width) absolute - flex items-center justify-center - ` }} - {{ cube_face_front }} - {{ cube_face_back }} - {{ cube_face_left }} - {{ cube_face_right }} - {{ cube_face_top }} - {{ cube_face_bottom }} + {{ cube_face_front }} + {{ cube_face_back }} + {{ cube_face_left }} + {{ cube_face_right }} + {{ cube_face_top }} + {{ cube_face_bottom }} +{{ if cube_last }} +{{ /if }} diff --git a/site/_includes/default.vto b/site/_includes/default.vto index d462484..0b0912e 100644 --- a/site/_includes/default.vto +++ b/site/_includes/default.vto @@ -7,7 +7,7 @@ layout: null - + diff --git a/site/_includes/rgbcube.vto b/site/_includes/rgbcube.vto new file mode 100644 index 0000000..9752f98 --- /dev/null +++ b/site/_includes/rgbcube.vto @@ -0,0 +1,72 @@ + + +{{ include "cube.vto" }} + diff --git a/site/_includes/text.vto b/site/_includes/text.vto index 554506e..ad7d090 100644 --- a/site/_includes/text.vto +++ b/site/_includes/text.vto @@ -2,8 +2,8 @@ layout: default.vto --- -
-
+
+
diff --git a/site/assets/css/default.css b/site/assets/css/default.css index 92eaf27..ce29112 100644 --- a/site/assets/css/default.css +++ b/site/assets/css/default.css @@ -125,6 +125,11 @@ } } +html, body { + height: 100dvh; + width: 100dvw; +} + .text-content { @apply space-y-3; @@ -160,19 +165,47 @@ } a { - @apply inline-block wrap-anywhere text-[red] dark:text-[yellow] px-1 pb-0.75 - border-2 border-[transparent] border-dashed; + @apply m-0; * { @apply wrap-anywhere; } - &:hover { - @apply border-[red] dark:border-[yellow]; + &:not(:has(> code:only-child)) { + @apply px-1; + + &:not(.font-mono) { + @apply pb-0.75; + } } - &:active { - @apply border-[fuchsia] dark:border-[springgreen] animate-to-the-future; + &:not(:has(h1, h2, h3, h4, h5, h6)) { + @apply inline-block wrap-anywhere text-[red] dark:text-[yellow] border-2 + border-[transparent] border-dashed; + + &:has(> code:only-child) { + @apply border-dotted; + } + + &:hover { + @apply border-[red] dark:border-[yellow]; + } + + &:active { + @apply border-[fuchsia] dark:border-[springgreen] animate-to-the-future; + } + } + + & :where(h1, h2, h3, h4, h5, h6) { + @apply before:underline before:underline-offset-4; + + * { + @apply inline-block; + } + + &:hover::before { + @apply italic text-[red] dark:text-[yellow]; + } } } @@ -194,12 +227,20 @@ @apply border-black dark:border-white; } + code:not(pre > code) { + @apply border-1 border-dotted px-2 py-0.5 border-black dark:border-white; + + a:hover &, a:active & { + @apply border-transparent; + } + } + pre code, pre code * { @apply whitespace-pre; } div:has(> pre code) { - @apply outline-1 outline-dotted outline-offset-1 outline-[#444] border-1 + @apply outline outline-dotted outline-offset-1 outline-[#444] border-1 border-black p-2 bg-[#eee] dark:outline-[#bbb] dark:border-white dark:bg-[#111]; } @@ -220,8 +261,7 @@ } hr { - @apply border-1 border-black dark:border-white - -mx-4; /* Keep in sync with p-N in text.vto. */ + @apply border-1 border-black dark:border-white; } blockquote { diff --git a/site/blog.vto b/site/blog.vto index 9f7465c..d524fc1 100644 --- a/site/blog.vto +++ b/site/blog.vto @@ -9,8 +9,8 @@ title: about:blog Blog Articles - rss - json + rss + json @@ -20,14 +20,183 @@ Blog Articles + + + + diff --git a/site/contact.md b/site/contact.md index 7cdd895..6e48916 100644 --- a/site/contact.md +++ b/site/contact.md @@ -35,5 +35,5 @@ Here are some other useful links as well: const element = document.getElementById("bot-block"); element.href = real; - element.children[0].innerHTML = real.substring(7); + element.children[0].textContent = real.substring(7); diff --git a/site/index.vto b/site/index.vto index d8b4cb0..2bbb4ff 100644 --- a/site/index.vto +++ b/site/index.vto @@ -3,68 +3,18 @@ prevent_zoom: true --- @@ -91,4 +41,6 @@ prevent_zoom: true blog {{ /set }} -{{ include "cube.vto" }} +{{ set cube_size = "5rem" }} +{{ set cube_last = true }} +{{ include "rgbcube.vto" }}