From 5e87ee387a852e8b4f620e516c3ef913ad7a1540 Mon Sep 17 00:00:00 2001 From: Implementer Date: Wed, 14 Oct 2026 13:22:45 +0200 Subject: [PATCH] blust.ch installs from a phone's home screen with bars in its ground Added to a phone's home screen, blust.ch opened as a browser tab with a white navigation bar under a dark page, because it declared no web app manifest and no theme-color. A manifest now opens it standalone, with icons drawn from the header's rb plate, and every page declares theme-color with dark's ground and viewport-fit=cover, so Android takes the page's own ground for its bars and the page can draw under the bottom one. The design re-pin to v0.157.0 brings the theme block that keeps theme-color on the ground of the theme shown, and the footer that keeps clear of the bottom bar. Verified: the lockfile resolves @robertblust/design to the tag's commit; npm run design, pages, pictures, pages, og and sitemap ran; every command of pins.json's verify list passed locally; conventions-check and conventions-format pass. Process: Delivery Phase: Implement Track: Code Co-Authored-By: Claude Opus 5.5 --- blog/deciding-well-solved/index.html | 4 +++- blog/deciding-well-solved/og.sha | 2 +- blog/index.html | 4 +++- blog/og.sha | 2 +- blog/one-question-answered/index.html | 4 +++- blog/one-question-answered/og.sha | 2 +- deck.js | 22 +++++++++++++++++++++- icon-192.png | Bin 0 -> 5435 bytes icon-512.png | Bin 0 -> 15416 bytes icon-maskable-512.png | Bin 0 -> 8547 bytes ideas/index.html | 4 +++- ideas/og.sha | 2 +- index.html | 4 +++- manifest.webmanifest | 14 ++++++++++++++ model/index.html | 4 +++- model/og.sha | 2 +- og.sha | 2 +- package-lock.json | 6 +++--- package.json | 2 +- page.css | 4 ++-- page.js | 22 +++++++++++++++++++++- principles/index.html | 4 +++- principles/og.sha | 2 +- privacy/index.html | 4 +++- privacy/og.sha | 2 +- processes/index.html | 4 +++- processes/og.sha | 2 +- surfaces/index.html | 4 +++- surfaces/og.sha | 2 +- talks/deciding-well/cost/index.html | 4 +++- talks/deciding-well/cost/og.sha | 2 +- talks/deciding-well/index.html | 4 +++- talks/deciding-well/og.sha | 2 +- talks/essential-complexity/index.html | 4 +++- talks/essential-complexity/og.sha | 2 +- talks/index.html | 4 +++- talks/mental-model/index.html | 4 +++- talks/mental-model/og.sha | 2 +- talks/og.sha | 2 +- timeline/index.html | 4 +++- timeline/og.sha | 2 +- 41 files changed, 126 insertions(+), 40 deletions(-) create mode 100644 icon-192.png create mode 100644 icon-512.png create mode 100644 icon-maskable-512.png create mode 100644 manifest.webmanifest diff --git a/blog/deciding-well-solved/index.html b/blog/deciding-well-solved/index.html index 1de19b4c..a615f3d3 100644 --- a/blog/deciding-well-solved/index.html +++ b/blog/deciding-well-solved/index.html @@ -2,8 +2,10 @@ - + + + Deciding well is solved. For me. · Robert Blust diff --git a/blog/deciding-well-solved/og.sha b/blog/deciding-well-solved/og.sha index 622307c7..c33016cb 100644 --- a/blog/deciding-well-solved/og.sha +++ b/blog/deciding-well-solved/og.sha @@ -1 +1 @@ -bd374b662595438d2a64b876e5b5be50461e7bead089ad51c80660101ab023c8 +3274f855772bd4fcf795724a133bd0d12b2b2b4556527921387f8e7605796e79 diff --git a/blog/index.html b/blog/index.html index 76edc191..a90c229e 100644 --- a/blog/index.html +++ b/blog/index.html @@ -2,8 +2,10 @@ - + + + Robert Blust — blog diff --git a/blog/og.sha b/blog/og.sha index 11d4d35a..d1ddfae9 100644 --- a/blog/og.sha +++ b/blog/og.sha @@ -1 +1 @@ -159693450fffd0499d27c4771bd1fef9d4fdea78dc8132077fc431dd9e2fe1e0 +fce80270adc14503fff77ff3140a56d4424a989109ba53c5629e536a19157a34 diff --git a/blog/one-question-answered/index.html b/blog/one-question-answered/index.html index 4cd8892a..65be049c 100644 --- a/blog/one-question-answered/index.html +++ b/blog/one-question-answered/index.html @@ -2,8 +2,10 @@ - + + + One question answered. One still open. · Robert Blust diff --git a/blog/one-question-answered/og.sha b/blog/one-question-answered/og.sha index cca29a24..06060c98 100644 --- a/blog/one-question-answered/og.sha +++ b/blog/one-question-answered/og.sha @@ -1 +1 @@ -fc05950ec498af33cfe68fe0052ac42617ff4bcb4967ec3071eb751ec45d8b5a +4a6701b8391793f15187417f7bc9ce80cdcf5e222cf1fba5c2ca7b25d24da434 diff --git a/deck.js b/deck.js index 4be611b6..3749037c 100644 --- a/deck.js +++ b/deck.js @@ -1,4 +1,4 @@ -// @robertblust/design — deck.js, assembled from the shared blocks: theme v5 · runtime v10 · +// @robertblust/design — deck.js, assembled from the shared blocks: theme v6 · runtime v10 · // fit v1. // Editing this file in a site does nothing: the next npm run design overwrites it. @@ -58,6 +58,26 @@ function applyTheme(){ } function setTheme(v){ theme = v; themeRemember(v); applyTheme(); } +/* A page opened from a phone's home screen has Android paint its system bars from the page's + `theme-color`. A page declares that meta with dark's ground, the default, and this keeps it + on the ground of the theme the visitor actually sees. It watches `data-theme` rather than + hooking `applyTheme`, because a page may switch the theme with a copy of its own — blust.ch's + pages do — and the attribute is the one thing every switch sets. The color is read from the + tokens rather than restated here, so a re-picked ground moves the bars with it. A page + without the meta is left as it is. */ +function themeColor(){ + try { + var tc = document.querySelector('meta[name="theme-color"]'); + if (!tc) return; + var g = getComputedStyle(document.documentElement).getPropertyValue("--ground").trim(); + if (g) tc.setAttribute("content", g); + } catch (e) {} +} +themeColor(); +try { + new MutationObserver(themeColor).observe(document.documentElement, { attributes: true, attributeFilter: ["data-theme"] }); +} catch (e) {} + var slides = Array.prototype.slice.call(document.querySelectorAll('.slide')); // slide numbering is zero-based everywhere the viewer can see it: the kicker on each // slide, the transport's display window, and the audio filenames all say the same number. diff --git a/icon-192.png b/icon-192.png new file mode 100644 index 0000000000000000000000000000000000000000..1932484a25fcd33974ffc4bae25da523aa9992e5 GIT binary patch literal 5435 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 literal 0 HcmV?d00001 diff --git a/ideas/index.html b/ideas/index.html index 4a601394..eb2edd25 100644 --- a/ideas/index.html +++ b/ideas/index.html @@ -2,8 +2,10 @@ - + + + Ideas — Robert Blust diff --git a/ideas/og.sha b/ideas/og.sha index 5f31ed91..49926a75 100644 --- a/ideas/og.sha +++ b/ideas/og.sha @@ -1 +1 @@ -efb34d150fee15baedbebc1ae578fd7171fdea4e0357534de1d7c80f90ab93d5 +01393f5591b97b8fe31f4d3092560989eca74e4f77b1f307ee2daa1b7a7bcda0 diff --git a/index.html b/index.html index 86892876..b236914c 100644 --- a/index.html +++ b/index.html @@ -2,8 +2,10 @@ - + + + Robert Blust — Software Engineer & Architect diff --git a/manifest.webmanifest b/manifest.webmanifest new file mode 100644 index 00000000..19cbeab3 --- /dev/null +++ b/manifest.webmanifest @@ -0,0 +1,14 @@ +{ + "name": "Robert Blust", + "short_name": "Robert Blust", + "start_url": "/", + "scope": "/", + "display": "standalone", + "background_color": "#0C0E13", + "theme_color": "#0C0E13", + "icons": [ + { "src": "/icon-192.png", "sizes": "192x192", "type": "image/png" }, + { "src": "/icon-512.png", "sizes": "512x512", "type": "image/png" }, + { "src": "/icon-maskable-512.png", "sizes": "512x512", "type": "image/png", "purpose": "maskable" } + ] +} diff --git a/model/index.html b/model/index.html index babeb4b0..e2622892 100644 --- a/model/index.html +++ b/model/index.html @@ -2,10 +2,12 @@ - + Model — Robert Blust + + diff --git a/model/og.sha b/model/og.sha index 61045ad2..fad55d8d 100644 --- a/model/og.sha +++ b/model/og.sha @@ -1 +1 @@ -f5d058c57b8eaf551a82868e0f800b4f484bf1605c84eb216c34b46ba7f0292f +70aad435ddd178da2c75362f76faa0bf9d1d434f544194fd9c36f33e47b6ec5a diff --git a/og.sha b/og.sha index 9a574890..b6c58dd2 100644 --- a/og.sha +++ b/og.sha @@ -1 +1 @@ -49b0520b27bf571c8eafd5d34fc33f6a0014f6e543df2de49437efdb31b82c0b +65d2597f4e1a5d9e3a3e455b344da59db0e410054728e59858f8db33db1c4b83 diff --git a/package-lock.json b/package-lock.json index 04e167a0..8f3f7025 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,7 @@ "companygraph-meta-model": "github:companygraph/meta-model#v0.94.0" }, "devDependencies": { - "@robertblust/design": "github:robertblust/design#v0.156.0", + "@robertblust/design": "github:robertblust/design#v0.157.0", "companygraph-mcp-server": "github:companygraph/mcp-server#v0.69.0", "pdf-lib": "^1.17.1", "playwright": "^1.63.0" @@ -95,8 +95,8 @@ } }, "node_modules/@robertblust/design": { - "version": "0.156.0", - "resolved": "git+ssh://git@github.com/robertblust/design.git#e9ae31386c3af4f16cd1f83faa0df5514ff56f6a", + "version": "0.157.0", + "resolved": "git+ssh://git@github.com/robertblust/design.git#fcd879fa7b86610fad28217bafb7df2aa7d1ee05", "dev": true, "license": "Apache-2.0", "bin": { diff --git a/package.json b/package.json index 9bd061e4..84fe180a 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "pin:check": "node pin-check.mjs" }, "devDependencies": { - "@robertblust/design": "github:robertblust/design#v0.156.0", + "@robertblust/design": "github:robertblust/design#v0.157.0", "companygraph-mcp-server": "github:companygraph/mcp-server#v0.69.0", "pdf-lib": "^1.17.1", "playwright": "^1.63.0" diff --git a/page.css b/page.css index ee7c5f1d..e6498dd4 100644 --- a/page.css +++ b/page.css @@ -1,5 +1,5 @@ /* @robertblust/design — page.css, assembled from the shared blocks: reset v3 · link v1 · - header v18 · title v2 · lines v3 · footer v3 · principles v1 · processes v1 · surfaces v2 · + header v18 · title v2 · lines v3 · footer v4 · principles v1 · processes v1 · surfaces v2 · index v2 · home v1. Editing this file in a site does nothing: the next npm run design overwrites it. */ @@ -241,7 +241,7 @@ nav a[aria-current="page"]{color:var(--c-firm)} .keyline{margin:.6rem 0 1.4rem; max-width:54ch; font-size:1.2rem; font-weight:500; line-height:1.45; color:var(--c-firm); text-wrap:balance} -footer{padding:0 0 2rem; display:flex; flex-wrap:wrap; gap:.9rem 2.6rem; align-items:center; +footer{padding:0 0 calc(2rem + env(safe-area-inset-bottom)); display:flex; flex-wrap:wrap; gap:.9rem 2.6rem; align-items:center; font-family:"Plex Mono",monospace; font-size:.76rem; letter-spacing:.08em; color:var(--dim)} footer a[aria-current="page"]{color:var(--c-firm)} diff --git a/page.js b/page.js index 1ade9c2a..a030d9bd 100644 --- a/page.js +++ b/page.js @@ -1,4 +1,4 @@ -// @robertblust/design — page.js, assembled from the shared blocks: lang v5 · theme v5 · +// @robertblust/design — page.js, assembled from the shared blocks: lang v5 · theme v6 · // navFit v3. // Editing this file in a site does nothing: the next npm run design overwrites it. @@ -136,6 +136,26 @@ function applyTheme(){ } function setTheme(v){ theme = v; themeRemember(v); applyTheme(); } +/* A page opened from a phone's home screen has Android paint its system bars from the page's + `theme-color`. A page declares that meta with dark's ground, the default, and this keeps it + on the ground of the theme the visitor actually sees. It watches `data-theme` rather than + hooking `applyTheme`, because a page may switch the theme with a copy of its own — blust.ch's + pages do — and the attribute is the one thing every switch sets. The color is read from the + tokens rather than restated here, so a re-picked ground moves the bars with it. A page + without the meta is left as it is. */ +function themeColor(){ + try { + var tc = document.querySelector('meta[name="theme-color"]'); + if (!tc) return; + var g = getComputedStyle(document.documentElement).getPropertyValue("--ground").trim(); + if (g) tc.setAttribute("content", g); + } catch (e) {} +} +themeColor(); +try { + new MutationObserver(themeColor).observe(document.documentElement, { attributes: true, attributeFilter: ["data-theme"] }); +} catch (e) {} + (function(){ var root = document.documentElement, bar = document.querySelector(".bar"); // Loud, because the quiet version cost an afternoon. This fence belongs at the end of the diff --git a/principles/index.html b/principles/index.html index b5c2a9dc..16ca570b 100644 --- a/principles/index.html +++ b/principles/index.html @@ -2,10 +2,12 @@ - + Principles — Robert Blust + + diff --git a/principles/og.sha b/principles/og.sha index dd361e8a..577878e5 100644 --- a/principles/og.sha +++ b/principles/og.sha @@ -1 +1 @@ -f45905b861b5f56bb3f0ac6491144203cc73a6e6b237d8c6dfafad7bfd84e0b1 +f40876c7addb3c12b0bfa968bc158e23ff76d73830c227b55ce241847e4f81e6 diff --git a/privacy/index.html b/privacy/index.html index e60c0b8c..0bd417b7 100644 --- a/privacy/index.html +++ b/privacy/index.html @@ -2,10 +2,12 @@ - + Privacy — Robert Blust + + diff --git a/privacy/og.sha b/privacy/og.sha index bafcb975..c83e7719 100644 --- a/privacy/og.sha +++ b/privacy/og.sha @@ -1 +1 @@ -7fe64499c47835e939288df92bc1f361a7b5a82b1457756966280895300c5b4a +7e299a2a5f93af2981aa4d3955986d0ee0d75a413853dca0cb089a0aec247bf9 diff --git a/processes/index.html b/processes/index.html index 688bf29d..66c7efae 100644 --- a/processes/index.html +++ b/processes/index.html @@ -2,10 +2,12 @@ - + Processes — Robert Blust + + diff --git a/processes/og.sha b/processes/og.sha index e644e884..07a939bd 100644 --- a/processes/og.sha +++ b/processes/og.sha @@ -1 +1 @@ -2221bcc0b19df3bb7b73174860ea24a8e7861b5b9dffe65abf28cb8d5189b4de +4afce114c4e16545b9b288a7597f85bb60fd08a7e1ff8f08f36b2f91c5f27622 diff --git a/surfaces/index.html b/surfaces/index.html index 207c7918..766130de 100644 --- a/surfaces/index.html +++ b/surfaces/index.html @@ -2,10 +2,12 @@ - + Surfaces — Robert Blust + + diff --git a/surfaces/og.sha b/surfaces/og.sha index 73cd911e..4ed149ea 100644 --- a/surfaces/og.sha +++ b/surfaces/og.sha @@ -1 +1 @@ -b592f2a14943bcebe661077b4f365787d797a668f19e444d5e5fb3ab5ba7fc36 +c67f6848cca0ce229f405efd5626842b7052fa3f821fe4f0db62861a6d70de05 diff --git a/talks/deciding-well/cost/index.html b/talks/deciding-well/cost/index.html index be1074fe..37ea6515 100644 --- a/talks/deciding-well/cost/index.html +++ b/talks/deciding-well/cost/index.html @@ -2,10 +2,12 @@ - + What a team would have cost — Robert Blust + + diff --git a/talks/deciding-well/cost/og.sha b/talks/deciding-well/cost/og.sha index f195badb..84d3b81c 100644 --- a/talks/deciding-well/cost/og.sha +++ b/talks/deciding-well/cost/og.sha @@ -1 +1 @@ -3b333865ff23a1a27ef5efa792624358fa0ab9c0638c5f215f6de31c8d962b5c +8bec185abb822e06c7f172a220a6cda8df6d65852a00fa57268b3c3f4ece6b53 diff --git a/talks/deciding-well/index.html b/talks/deciding-well/index.html index af02275e..96259400 100644 --- a/talks/deciding-well/index.html +++ b/talks/deciding-well/index.html @@ -2,8 +2,10 @@ - + + +