diff --git a/README.md b/README.md index f329086b..0711721e 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,7 @@ Static rebuild of old-computers.com with [Hugo](https://gohugo.io/) (0.158 or ne | `data/forum.json`, `data/forum_pages.json` | machine → forum thread and news post → forum thread maps, written by the forum import and by `make forum-sync` | | `forum/` | forum extension, local test stack, install notes | | `content/_index.md`, `layouts/`, `assets/`, `hugo.toml`, `tools/` | written by hand | +| `themes/terminal/` | the [Terminal](https://github.com/panr/hugo-theme-terminal) theme (MIT), unmodified copy of v4.2.6; adapted by the project's `layouts/` (base, head, header, footer, posts) and `assets/css/museum.css`; palette in `assets/css/terminal.css` if overridden | | `build/`, `public/` | build output (`make build`, `hugo server`), not versioned | Content pages are Markdown with YAML front matter and can be corrected by hand, but a later diff --git a/assets/css/main.css b/assets/css/main.css deleted file mode 100644 index 5273e8d7..00000000 --- a/assets/css/main.css +++ /dev/null @@ -1,174 +0,0 @@ -:root { - --bg: #f6f3ea; - --panel: #fffdf7; - --text: #24221d; - --muted: #6b665a; - --line: #d9d2bf; - --accent: #9a3412; - --header: #2b2a26; - --header-text: #f6f3ea; -} -@media (prefers-color-scheme: dark) { - :root { - --bg: #1b1a17; - --panel: #24231f; - --text: #e8e4d8; - --muted: #a39d8d; - --line: #3b3932; - --accent: #f0a070; - --header: #111110; - --header-text: #e8e4d8; - } -} -* { box-sizing: border-box; } -body { - margin: 0; - background: var(--bg); - color: var(--text); - font: 16px/1.55 system-ui, -apple-system, "Segoe UI", sans-serif; -} -a { color: var(--accent); } -img { max-width: 100%; height: auto; } -main, .site-footer { max-width: 1000px; margin: 0 auto; padding: 16px; } -h1 { font-size: 1.7rem; line-height: 1.2; margin: 0.3em 0 0.6em; } -h2 { font-size: 1.2rem; margin: 1.6em 0 0.5em; border-bottom: 1px solid var(--line); padding-bottom: 4px; } -small, .meta, .note, .crumbs { color: var(--muted); } -.crumbs { font-size: 0.9rem; margin: 0; } - -.site-header { - background: var(--header); - color: var(--header-text); - display: flex; - flex-wrap: wrap; - gap: 8px 24px; - align-items: center; - padding: 10px 16px; -} -.site-header a { color: inherit; text-decoration: none; } -.brand { font-family: ui-monospace, "Courier New", monospace; font-weight: 700; letter-spacing: 1px; } -.brand span { opacity: 0.6; } -.site-header nav { display: flex; flex-wrap: wrap; gap: 4px 16px; } -.site-header nav a { opacity: 0.8; padding: 2px 0; border-bottom: 2px solid transparent; } -.site-header nav a:hover, .site-header nav a.active { opacity: 1; border-color: var(--accent); } -.site-footer { color: var(--muted); font-size: 0.85rem; border-top: 1px solid var(--line); margin-top: 32px; } - -.content { overflow-wrap: anywhere; } -.content table { max-width: 100%; } -.logo { max-height: 48px; width: auto; vertical-align: middle; margin-right: 12px; background: #fff; padding: 2px; } -.main-image { float: right; max-width: 45%; margin: 0 0 12px 16px; } -@media (max-width: 600px) { .main-image { float: none; max-width: 100%; margin: 0 0 12px; display: block; } } - -.tabs { display: flex; flex-wrap: wrap; gap: 4px; margin: 0 0 16px; border-bottom: 1px solid var(--line); } -.tabs a { - padding: 6px 12px; - text-decoration: none; - color: var(--text); - border: 1px solid transparent; - border-bottom: 0; - border-radius: 4px 4px 0 0; -} -.tabs a:hover { background: var(--panel); } -.tabs a.active { background: var(--panel); border-color: var(--line); font-weight: 600; margin-bottom: -1px; } - -table { border-collapse: collapse; } -.specs, .list { width: 100%; clear: both; margin: 16px 0; background: var(--panel); } -.specs th, .specs td, .list th, .list td { padding: 6px 10px; border: 1px solid var(--line); text-align: left; vertical-align: top; } -.specs th { width: 30%; font-size: 0.8rem; letter-spacing: 0.5px; color: var(--muted); } -.list { table-layout: fixed; } -.list :is(th, td):first-child { width: 45%; } -.list :is(th, td):nth-child(2) { width: 12%; } -.list :is(th, td):nth-child(4) { width: 15%; } -.list { font-size: 0.95rem; } -@media (max-width: 600px) { .list :is(th, td):nth-child(4) { display: none; } } -.list thead th { font-size: 0.8rem; letter-spacing: 0.5px; color: var(--muted); } -.content th { padding: 6px 10px; text-align: left; } -.sortable th { cursor: pointer; user-select: none; white-space: nowrap; } -.sortable th:hover, .sortable th:focus-visible { color: var(--text, inherit); text-decoration: underline; } -.sortable th::after { content: " ↕"; opacity: 0.4; } -.sortable th[aria-sort="ascending"]::after { content: " ↑"; opacity: 1; } -.sortable th[aria-sort="descending"]::after { content: " ↓"; opacity: 1; } - -.gallery { display: grid; grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); gap: 16px; } -.gallery figure, .thumbs a, .card, .comments li { - margin: 0; - background: var(--panel); - border: 1px solid var(--line); - border-radius: 4px; - padding: 10px; -} -.gallery img { display: block; margin: 0 auto 8px; } -.gallery figcaption strong, .gallery figcaption em { display: block; } -.gallery figcaption div { font-size: 0.9rem; margin-top: 6px; overflow-wrap: anywhere; } - -.thumbs, .cards { display: grid; grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); gap: 12px; } -.thumbs a, .card { text-decoration: none; color: var(--text); display: block; } -.thumbs img { display: block; width: 100%; height: 120px; object-fit: cover; margin-bottom: 6px; } -.thumbs span, .card span { font-size: 0.85rem; color: var(--muted); display: block; } -.card strong { display: block; color: var(--accent); } - -.browse, .letters { display: flex; flex-wrap: wrap; gap: 6px 14px; padding: 0; list-style: none; } -.columns { columns: 220px; padding-left: 18px; } -.links { padding-left: 18px; } -.entries dt { font-weight: 600; margin-top: 12px; } -.entries dd { margin: 2px 0 0; } -.timeline { list-style: none; padding: 0; } -.timeline li { padding: 6px 0; border-bottom: 1px solid var(--line); display: flex; flex-wrap: wrap; gap: 4px 12px; } -.timeline time { min-width: 130px; color: var(--muted); font-size: 0.85rem; text-transform: uppercase; } -.comments { list-style: none; padding: 0; } -.comments li { margin-bottom: 12px; overflow-wrap: anywhere; } -.comments .meta { margin: 0 0 6px; font-size: 0.9rem; } -.prev-next { display: flex; justify-content: space-between; gap: 16px; margin-top: 24px; } - -.posts { display: grid; gap: 16px; } -.post-summary { - display: grid; - grid-template-columns: minmax(0, 280px) 1fr; - gap: 16px; - background: var(--panel); - border: 1px solid var(--line); - border-radius: 4px; - padding: 12px; -} -.post-summary:not(:has(.post-image)) { grid-template-columns: 1fr; } -.post-summary .post-image img { display: block; width: 100%; aspect-ratio: 16 / 9; object-fit: cover; border-radius: 2px; } -.post-summary h3 { margin: 0 0 2px; font-size: 1.15rem; } -.post-summary .meta { margin: 0 0 8px; font-size: 0.85rem; } -.post-summary p:last-child { margin-bottom: 0; } -.post-banner { display: block; width: 100%; max-height: 420px; object-fit: cover; margin: 0 0 16px; border-radius: 4px; } -@media (max-width: 600px) { .post-summary { grid-template-columns: 1fr; } } - -.site-header .search { margin-left: auto; } -.site-header .search input { - width: 180px; - max-width: 100%; - padding: 4px 10px; - border: 1px solid transparent; - border-radius: 14px; - background: rgba(255, 255, 255, 0.12); - color: inherit; - font: inherit; - font-size: 0.9rem; -} -.site-header .search input::placeholder { color: inherit; opacity: 0.6; } -.site-header .search input:focus { outline: none; border-color: var(--accent); background: rgba(255, 255, 255, 0.2); } -/* Pagefind result list, in the site colours */ -#search { - --pagefind-ui-primary: var(--accent); - --pagefind-ui-text: var(--text); - --pagefind-ui-background: var(--panel); - --pagefind-ui-border: var(--line); - --pagefind-ui-tag: var(--bg); - --pagefind-ui-border-width: 1px; - --pagefind-ui-border-radius: 4px; - --pagefind-ui-image-border-radius: 2px; - --pagefind-ui-font: inherit; - --pagefind-ui-scale: 0.85; -} -#search mark { background: none; color: inherit; font-weight: 700; } - -.pager { display: flex; flex-wrap: wrap; justify-content: center; gap: 6px; margin: 24px 0 0; } -.pager a, .pager .current { padding: 4px 10px; border: 1px solid var(--line); border-radius: 4px; text-decoration: none; background: var(--panel); } -.pager .current { font-weight: 700; border-color: var(--accent); } - -.forum-thread { display: block; width: 100%; min-height: 400px; border: 0; } -.comments-section { clear: both; margin-top: 32px; } diff --git a/assets/css/museum.css b/assets/css/museum.css new file mode 100644 index 00000000..e1c0c448 --- /dev/null +++ b/assets/css/museum.css @@ -0,0 +1,135 @@ +/* Old-Computers.com on top of the Terminal theme (themes/terminal): the museum's own components, + drawn with the theme's three colours. Change the palette in assets/css/terminal.css. */ +:root { + --text: var(--foreground); + --bg: var(--background); + --panel: color-mix(in srgb, var(--foreground) 5%, transparent); + --line: color-mix(in srgb, var(--foreground) 22%, transparent); + --muted: color-mix(in srgb, var(--foreground) 65%, transparent); +} + +/* layout: wider than the theme's blog column, for the listing tables */ +.container.center { max-width: 1100px; } +@media (max-width: 684px) { .container { padding: 20px; } } +.page { flex: 1; width: 100%; } +.content { display: block; overflow-wrap: anywhere; } +.page > h1:first-child, .page > article > h1:first-child { margin-top: 10px; } +h2 { border-bottom: 1px dotted var(--accent); padding-bottom: 6px; margin-top: 40px; } +small, .meta, .note, .crumbs { color: var(--muted); } +.crumbs { font-size: 0.9rem; margin: 10px 0 0; } +.crumbs + h1 { margin-top: 10px; } + +/* header: active section, search box */ +.navigation-menu a { text-decoration: none; } +.navigation-menu a:hover { text-decoration: underline; } +.navigation-menu a.active { background: var(--accent); color: var(--background); padding: 2px 6px; } +.navigation-menu .search input { width: 16ch; padding: 2px 8px; border-color: var(--accent); } +.navigation-menu .search input::placeholder { color: var(--muted); } +.footer p { margin: 4px 0; white-space: normal; } +.footer .copyright { flex-direction: column; } + +/* images: the theme frames every image heavily; keep that for post covers only */ +img { height: auto; border-width: 1px; padding: 4px; border-color: var(--line); } +.post-cover { border: 8px solid var(--accent); padding: 8px; width: 100%; max-height: 420px; object-fit: cover; margin: 20px 0; } +.on-list .post-cover { max-height: 260px; } +.post-image { display: block; } +.content img { display: inline-block; vertical-align: middle; margin: 4px 0; } +.maker-logo { display: inline-block; max-height: 48px; width: auto; vertical-align: middle; margin: 0 12px 0 0; background: #fff; padding: 2px; } +.main-image { float: right; max-width: 45%; margin: 0 0 12px 16px; background: #fff; } +@media (max-width: 600px) { .main-image { float: none; max-width: 100%; margin: 0 0 12px; display: block; } } + +/* machine tabs */ +.tabs { display: flex; flex-wrap: wrap; gap: 4px 6px; margin: 0 0 20px; border-bottom: 1px solid var(--accent); } +.tabs a { padding: 4px 10px; text-decoration: none; } +.tabs a::before { content: "["; opacity: 0.5; } +.tabs a::after { content: "]"; opacity: 0.5; } +.tabs a:hover { background: var(--panel); } +.tabs a.active { background: var(--accent); color: var(--background); font-weight: bold; } + +/* tables */ +table, th, td { border-width: 1px; border-color: var(--line); padding: 6px 10px; } +.content table { max-width: 100%; } +.specs, .list { width: 100%; clear: both; margin: 16px 0; background: var(--panel); } +.specs th, .specs td, .list th, .list td { text-align: left; vertical-align: top; } +.specs th { width: 30%; font-size: 0.8rem; color: var(--accent); } +.list { table-layout: fixed; font-size: 0.9rem; } +.list :is(th, td):first-child { width: 42%; } +.list :is(th, td):nth-child(2) { width: 10%; } +.list :is(th, td):nth-child(4) { width: 17%; } +@media (max-width: 600px) { .list :is(th, td):nth-child(4) { display: none; } } +.list thead th { font-size: 0.8rem; color: var(--accent); } +.sortable th { cursor: pointer; user-select: none; white-space: nowrap; } +.sortable th:hover, .sortable th:focus-visible { text-decoration: underline; } +.sortable th::after { content: " ↕"; opacity: 0.4; } +.sortable th[aria-sort="ascending"]::after { content: " ↑"; opacity: 1; } +.sortable th[aria-sort="descending"]::after { content: " ↓"; opacity: 1; } + +/* galleries, thumbnails, cards */ +.gallery { display: grid; grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); gap: 16px; } +.gallery figure, .thumbs a, .card, .comments li { + margin: 0; + width: auto; + background: var(--panel); + border: 1px solid var(--line); + padding: 10px; +} +.gallery img { display: block; margin: 0 auto 8px; background: #fff; } +.gallery figure figcaption { background: none; color: inherit; text-align: left; margin: 0; padding: 0; font-size: 0.9rem; } +.gallery figcaption strong { display: block; color: var(--accent); } +.gallery figcaption em { display: block; } +.gallery figcaption div { margin-top: 6px; overflow-wrap: anywhere; } +.gallery figcaption p { margin: 6px 0; } + +.thumbs, .cards { display: grid; grid-template-columns: repeat(auto-fill, minmax(170px, 1fr)); gap: 12px; margin: 20px 0; } +.thumbs a, .card { text-decoration: none; color: var(--text); display: block; } +.thumbs a:hover, .card:hover { border-color: var(--accent); } +.thumbs img { display: block; width: 100%; height: 120px; object-fit: cover; margin: 0 0 6px; padding: 0; border: 0; background: #fff; } +.thumbs span, .card span { font-size: 0.85rem; color: var(--muted); display: block; } +.card strong { display: block; color: var(--accent); } +.card strong::before { content: "> "; } + +/* lists */ +.browse, .letters { display: flex; flex-wrap: wrap; gap: 6px 14px; margin: 20px 0; padding: 0; list-style: none; } +.letters a { text-decoration: none; } +.letters a::before { content: "["; opacity: 0.5; } +.letters a::after { content: "]"; opacity: 0.5; } +.columns { columns: 260px; margin-left: 0; padding-left: 2ch; list-style: none; } +.columns li::before, .links li::before { content: "-"; position: absolute; left: -2ch; color: var(--accent); } +.links { margin-left: 0; padding-left: 2ch; list-style: none; } +.entries dt { font-weight: bold; margin-top: 14px; color: var(--accent); } +.entries dd { margin: 2px 0 0; } +.timeline { list-style: none; margin-left: 0; padding: 0; } +.timeline li { padding: 6px 0; border-bottom: 1px solid var(--line); display: flex; flex-wrap: wrap; gap: 4px 12px; } +.timeline time { min-width: 130px; color: var(--muted); font-size: 0.85rem; text-transform: uppercase; } +.comments { list-style: none; margin-left: 0; padding: 0; } +.comments li { margin-bottom: 12px; overflow-wrap: anywhere; } +.comments .meta { margin: 0 0 6px; font-size: 0.9rem; } +.prev-next { display: flex; justify-content: space-between; gap: 16px; margin-top: 30px; } +.prev-next a { text-decoration: none; } + +/* posts: the theme's own markup; pagination with page numbers */ +.posts .post:first-child { padding-top: 10px; } +.post-author a { color: inherit; } +.pagination .current { color: var(--accent); font-weight: bold; } + +/* Pagefind result list, in the theme colours */ +#search { + --pagefind-ui-primary: var(--accent); + --pagefind-ui-text: var(--foreground); + --pagefind-ui-background: var(--background); + --pagefind-ui-border: var(--accent); + --pagefind-ui-tag: var(--panel); + --pagefind-ui-border-width: 1px; + --pagefind-ui-border-radius: 0; + --pagefind-ui-image-border-radius: 0; + --pagefind-ui-font: inherit; + --pagefind-ui-scale: 0.85; + margin-top: 20px; +} +#search mark { background: none; color: var(--accent); font-weight: bold; } +#search img { border: 0; padding: 0; margin: 0; } +#search ul, #search ol { margin: 0; } +#search button { border-width: 1px; } + +.forum-thread { display: block; width: 100%; min-height: 400px; border: 1px solid var(--line); } +.comments-section { clear: both; margin-top: 40px; } diff --git a/forum/extension/less/embed.less b/forum/extension/less/embed.less index 51f61a03..97a3bfd1 100644 --- a/forum/extension/less/embed.less +++ b/forum/extension/less/embed.less @@ -1,13 +1,15 @@ -// Embedded thread, as shown at the bottom of the museum pages: full width, on the -// light panel colour of the static site (--panel in its assets/css/main.css). -@oc-accent: #9a3412; -@oc-panel: #fffdf7; +// Embedded thread, as shown at the bottom of the museum pages: full width, in the colours and +// type of the static site's Terminal theme (--background, --accent in its stylesheet). The +// forum itself is set to its dark colour scheme (admin → Appearance), which gives the rest. +@oc-accent: #eec35e; +@oc-bg: #1a170f; +@oc-mono: "Fira Code", Monaco, Consolas, "Ubuntu Mono", monospace; -body, .App { background: @oc-panel; } +body, .App { background: @oc-bg; font-family: @oc-mono; } .Page-content { max-width: none; } .Post-body a, .PostUser-name a, .Button--link { color: @oc-accent; } -.Button--primary { background: @oc-accent; } -// The reply box follows the page while scrolling; the forum paints it in its header colour -// (dark when a coloured header is configured), which reads as a black block here. -.DiscussionPage-nav > ul { background: @oc-panel; } +.Button--primary { background: @oc-accent; color: @oc-bg; border-radius: 0; } +// The reply box follows the page while scrolling; the forum paints it in its header colour, +// which reads as a block of another colour here. +.DiscussionPage-nav > ul { background: @oc-bg; } .DiscussionPage-nav .item-scrubber, .DiscussionPage-nav a { color: inherit; } diff --git a/hugo.toml b/hugo.toml index 0e8c3728..f58460da 100644 --- a/hugo.toml +++ b/hugo.toml @@ -1,6 +1,8 @@ baseURL = "/" title = "Old-Computers.com" locale = "en" +# look: the Terminal theme (themes/terminal, unmodified), adapted in layouts/ and assets/css/museum.css +theme = "terminal" # relative URLs only: no absolute address is known at build time, so no feed or sitemap disableKinds = ["rss", "sitemap"] # pages keep working when the site is served from a sub-directory diff --git a/layouts/_partials/footer.html b/layouts/_partials/footer.html new file mode 100644 index 00000000..611628e6 --- /dev/null +++ b/layouts/_partials/footer.html @@ -0,0 +1,21 @@ + +{{ $menu := resources.Get "js/menu.js" | js.Build }} +{{ $code := resources.Get "js/code.js" | js.Build }} +{{ with slice $menu $code | resources.Concat "js/bundle.js" | minify | fingerprint }} + +{{ end }} diff --git a/layouts/_partials/head.html b/layouts/_partials/head.html new file mode 100644 index 00000000..257dcb83 --- /dev/null +++ b/layouts/_partials/head.html @@ -0,0 +1,16 @@ +{{/* replaces the theme's head: one stylesheet (theme files in order, then ours), relative addresses only */}} + + + +{{ $css := slice }} +{{ range slice "fonts" "main" "buttons" "header" "menu" "footer" "post" "pagination" "terms" "code" "syntax" "terminal" "museum" }} + {{ $css = $css | append (resources.Get (printf "css/%s.css" .)) }} +{{ end }} +{{ with $css | resources.Concat "css/site.css" | minify | fingerprint }} + +{{ end }} + + +{{ with resources.Get "js/sortTables.js" | minify | fingerprint }} + +{{ end }} diff --git a/layouts/_partials/header.html b/layouts/_partials/header.html new file mode 100644 index 00000000..69163cca --- /dev/null +++ b/layouts/_partials/header.html @@ -0,0 +1,33 @@ +{{/* the theme's header, with the active section, the forum link and the search box */}} +{{ $current := . }} +
+
+ + +
+ +
diff --git a/layouts/_partials/machine-header.html b/layouts/_partials/machine-header.html index 2e76cfc0..b5681fe5 100644 --- a/layouts/_partials/machine-header.html +++ b/layouts/_partials/machine-header.html @@ -7,7 +7,7 @@ {{ with $m.GetTerms "categories" }}{{ range first 1 . }} › {{ .LinkTitle }}{{ end }}{{ end }} {{ with $m.Params.company }}{{ with site.GetPage . }} › {{ .Title }}{{ end }}{{ end }}

-

{{ with $m.Params.logo }}{{ end }}{{ $m.Title }}

+

{{ with $m.Params.logo }}{{ end }}{{ $m.Title }}