From 65b45f0f2d42bb66a9042a023d026d595dda8c65 Mon Sep 17 00:00:00 2001 From: osmarks Date: Fri, 25 Oct 2024 17:13:38 +0100 Subject: [PATCH] Front page and typographical redesign --- assets/iosevka.woff2 | Bin 0 -> 13844 bytes src/fts.mjs | 5 ++++ src/index.js | 11 +++----- src/openring.html | 2 +- src/style.sass | 52 ++++++++++++++++++++++++-------------- templates/activitypub.pug | 4 +-- templates/index.pug | 4 +-- 7 files changed, 47 insertions(+), 31 deletions(-) create mode 100644 assets/iosevka.woff2 diff --git a/assets/iosevka.woff2 b/assets/iosevka.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..a4b67c5d2260ffe27f27a205ab9d0d2bf48d7cef GIT binary patch literal 13844 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

qIb~l(i;;eo~Om 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 literal 0 HcmV?d00001 diff --git a/src/fts.mjs b/src/fts.mjs index ebee6dd..7bb63f7 100644 --- a/src/fts.mjs +++ b/src/fts.mjs @@ -3,9 +3,11 @@ import * as htmlToText from "html-to-text" import * as binaryFuseFilter from "binary-fuse-filter" import { xxHash32 as hash } from "js-xxhash" import * as msgpack from "msgpackr" +import * as fs from "fs" import { BIGRAM_SEPARATOR, FREQUENCY_SEPARATOR, FREQUENCY_THRESHOLDS, tokenize } from "./fts_common.mjs" const index = [] +const recordStrings = [] const BIGRAM_INCLUSION = 0.3 const URL = /https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)/g @@ -22,6 +24,7 @@ export const pushEntry = (sourceType, entry) => { const { html, url, timestamp, title, description, ignoreDescription } = entry // TODO: this puts URLs inline, maybe do something with that const text = (title ?? "") + " " + (!ignoreDescription ? (description && stripHTML(description)) ?? "" : "") + " " + stripHTML(html) + recordStrings.push(text) const words = tokenize(text) const counts = {} for (const word of words) { @@ -43,6 +46,8 @@ export const pushEntry = (sourceType, entry) => { } export const build = () => { + fs.writeFileSync("strings.json", JSON.stringify(recordStrings)) + let totalTerms = 0 let totalBigrams = 0 const totalBigramCounts = {} diff --git a/src/index.js b/src/index.js index a626a55..af341e8 100644 --- a/src/index.js +++ b/src/index.js @@ -73,11 +73,10 @@ function hslToRgb(h, s, l) { return `#${hexPad(r * 255)}${hexPad(g * 255)}${hexPad(b * 255)}` } -const hashBG = (cls, i) => { +const hashBG = (cls, i, hue) => { const buf = crypto.createHash("md5").update(cls).digest() - const base = (buf[0] + 256 * buf[1]) % 360 - const hue = (base + i * 37) % 360 - return `background: ${hslToRgb(hue / 360, 1, 0.9)}; background: hsl(${hue}deg, var(--autocol-saturation), var(--autocol-lightness))` + const base = buf[0] + 256 * buf[1] + return `background: ${hslToRgb(hue / 360, 0.85, 0.65)}; background: hsl(${hue}deg, var(--autocol-saturation), var(--autocol-lightness)); border: 4px solid black; border-color: hsl(${hue}deg, 80%, var(--autocol-border))` } globalData.hashBG = hashBG @@ -470,10 +469,8 @@ const compileServiceWorkerJSTask = async () => { }) } -const copyAsset = subpath => fse.copy(path.join(assetsDir, subpath), path.join(outAssets, subpath)) - const doImages = async () => { - await Promise.all(["images", "titillium-web.woff2", "titillium-web-semibold.woff2", "miracode.woff2", "misc"].map(subpath => fse.copy(path.join(assetsDir, subpath), path.join(outAssets, subpath)))) + await Promise.all(["images", "titillium-web.woff2", "titillium-web-semibold.woff2", "iosevka.woff2", "misc"].map(subpath => fse.copy(path.join(assetsDir, subpath), path.join(outAssets, subpath)))) await fse.copy(path.join(nodeModules, "katex", "dist", "fonts"), path.join(outAssets, "fonts")) await fse.copy(path.join(nodeModules, "katex", "dist", "katex.min.css"), path.join(outAssets, "katex.min.css")) diff --git a/src/openring.html b/src/openring.html index 83d9a70..984f6d1 100644 --- a/src/openring.html +++ b/src/openring.html @@ -1,4 +1,4 @@ -

From other blogs

+

From other blogs

{{range .Articles}}
diff --git a/src/style.sass b/src/style.sass index 8518928..ce11878 100644 --- a/src/style.sass +++ b/src/style.sass @@ -7,8 +7,9 @@ $navbar-width: 20rem box-sizing: border-box :root - --autocol-lightness: 80% - --autocol-saturation: 100% + --autocol-lightness: 65% + --autocol-saturation: 85% + --autocol-border: 0% @font-face font-family: 'Titillium Web' @@ -27,26 +28,29 @@ $navbar-width: 20rem unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD @font-face - font-family: 'Miracode' + font-family: 'Iosevka' font-style: normal font-weight: 400 font-display: swap - src: url(/assets/miracode.woff2) format('woff2') - unicode-range: U+0000-00A0, U+A2-A9, U+AC-AE, U+00D7, U+00F7, U+FEFF, U+FFFD + src: url(/assets/iosevka.woff2) format('woff2') + unicode-range: U+0000-00C0, U+A2-A9, U+AC-AE, U+00D7, U+00F7, U+FEFF, U+FFFD + +$headers: "Iosevka", "Titillium Web", "Fira Sans", sans-serif +$monospace: "Iosevka", "Fira Code", monospace +$body: "Titillium Web", "Fira Sans", sans-serif body margin: 0 - font-family: 'Titillium Web', 'Fira Sans', sans-serif + font-family: $body line-height: 1.5 .footnote-ref line-height: 1 pre, code, .deemph - font-family: 'Miracode', monospace - font-size: 0.9em + font-family: $monospace line-height: 1.3 - vertical-align: bottom + font-size: 0.9em a text-decoration: none @@ -54,16 +58,17 @@ a .blog-post a, .sidenotes a text-decoration: underline - nav display: flex align-items: center - padding: 1em + padding: 1rem margin-bottom: 0.5em background: black overflow-x: auto - font-size: 1.1em + font-size: 1.25em + + font-family: $headers .logo width: 1.5rem @@ -76,7 +81,6 @@ nav align-items: center font-style: italic color: white - font-size: 1.25em a, img, picture margin-right: 0.5em @@ -88,6 +92,7 @@ nav h1, h2, h3, h4, h5, h6 margin: 0 font-weight: 600 + font-family: $headers a color: inherit text-decoration: none !important @@ -116,10 +121,12 @@ main margin-bottom: 0 display: flex flex-wrap: wrap + text-align: left + > div min-width: 20em background: #eee - padding: 1em + padding: 12px flex: 1 1 20% .microblog > div @@ -152,6 +159,7 @@ button, select, input, textarea, .textarea .title font-weight: 500 + font-family: $headers .conditions font-style: italic @@ -177,10 +185,8 @@ button, select, input, textarea, .textarea img, picture padding-right: 1em width: 8em - - .title - font-size: 1.1em - font-weight: 600 + height: 8em + margin-bottom: auto .caption background: lightgray @@ -296,6 +302,7 @@ $hl-border: 3px :root --autocol-lightness: 10% --autocol-saturation: 50% + --autocol-border: 35% nav .logocont color: white @@ -391,4 +398,11 @@ table padding: 0.5em margin: 0.5em .description - font-style: italic \ No newline at end of file + font-style: italic + +.autocol + margin: 4px + .title + font-size: 1.1em + font-family: $headers + font-weight: 600 \ No newline at end of file diff --git a/templates/activitypub.pug b/templates/activitypub.pug index 4047fac..2185fe0 100644 --- a/templates/activitypub.pug +++ b/templates/activitypub.pug @@ -1,4 +1,4 @@ -div.autocol(style=hashBG("microblog", i)) +div.autocol(style=hashBG("microblog", i, 300)) div - a(href=permalink)= renderDate(date) + a.title(href=permalink)= renderDate(date) div!= content \ No newline at end of file diff --git a/templates/index.pug b/templates/index.pug index f9266e1..c7a7c2c 100644 --- a/templates/index.pug +++ b/templates/index.pug @@ -7,7 +7,7 @@ block content Read my opinions via the internet. div.blog each post, i in posts - .autocol.imbox(style=hashBG("blog", i)) + .autocol.imbox(style=hashBG("blog", i, 180)) if images.hasOwnProperty(post.slug) +image(images[post.slug]) div @@ -28,7 +28,7 @@ block content Various web projects I have put together over many years. Made with at least four different JS frameworks. Some of them are bad. div.experiments each experiment, i in experiments - .autocol.imbox(style=hashBG("experiments", i)) + .autocol.imbox(style=hashBG("experiments", i, 120)) if images.hasOwnProperty(experiment.slug) +image(images[experiment.slug]) div