From bea50fd0a6826bea0be557227b34b0131ee36bab Mon Sep 17 00:00:00 2001 From: Implementer Date: Wed, 14 Oct 2026 13:51:12 +0200 Subject: [PATCH] guestgraph.io installs from a phone's home screen with bars in its ground Added to a phone's home screen, guestgraph.io opened as a browser tab with the system's own 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 mark on the plate blust.ch's icon uses, 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 --- api/index.html | 4 +++- api/og.sha | 2 +- billing/index.html | 4 +++- billing/og.sha | 2 +- deck.js | 22 +++++++++++++++++++++- icon-192.png | Bin 0 -> 8330 bytes icon-512.png | Bin 0 -> 23783 bytes icon-maskable-512.png | Bin 0 -> 13691 bytes 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 +- problems/index.html | 4 +++- problems/og.sha | 2 +- processes/index.html | 4 +++- processes/og.sha | 2 +- surfaces/index.html | 4 +++- surfaces/og.sha | 2 +- talks/index.html | 4 +++- talks/intro/index.html | 4 +++- talks/intro/og.sha | 2 +- talks/og.sha | 2 +- 31 files changed, 106 insertions(+), 30 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/api/index.html b/api/index.html index 6f1a37c..9ec1153 100644 --- a/api/index.html +++ b/api/index.html @@ -2,10 +2,12 @@ - + API — GuestGraph + + diff --git a/api/og.sha b/api/og.sha index 63d7424..50d955d 100644 --- a/api/og.sha +++ b/api/og.sha @@ -1 +1 @@ -02cbb467db5b72734f7a16c291a325c7600e54d5c9a270bd7fef59d01f3c6f68 +7f89701236e9f0dd971c0d4918f4fe8147cdaaf6d41f150ddffba01b168e8c57 diff --git a/billing/index.html b/billing/index.html index 51d63a1..11611ab 100644 --- a/billing/index.html +++ b/billing/index.html @@ -2,10 +2,12 @@ - + Billing — GuestGraph + + diff --git a/billing/og.sha b/billing/og.sha index 3c2dea6..a03d077 100644 --- a/billing/og.sha +++ b/billing/og.sha @@ -1 +1 @@ -0e20ece60c5ce29baca8d8bab674af671d82e1be872f622fafb614cccc114804 +1250801f73db9fda8d674e1db6b61b021aa5bc4d1fd75b2048aaa1c792e05415 diff --git a/deck.js b/deck.js index 4be611b..3749037 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..8aafb08496ddca95b1c76c0023905dd43737bce5 GIT binary patch literal 8330 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 wduG%7Se`{983aNku6x(Mft<8 literal 0 HcmV?d00001 diff --git a/icon-maskable-512.png b/icon-maskable-512.png new file mode 100644 index 0000000000000000000000000000000000000000..fbc8bc04f6a1e4f9eacdfad29ee7095ca4b00030 GIT binary patch literal 13691 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 A3;+NC literal 0 HcmV?d00001 diff --git a/index.html b/index.html index c2e837a..5b7a8b2 100644 --- a/index.html +++ b/index.html @@ -2,10 +2,12 @@ - + GuestGraph — the open-source guest identity graph + + diff --git a/manifest.webmanifest b/manifest.webmanifest new file mode 100644 index 0000000..a90af4d --- /dev/null +++ b/manifest.webmanifest @@ -0,0 +1,14 @@ +{ + "name": "GuestGraph", + "short_name": "GuestGraph", + "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 3c568ec..b6536e5 100644 --- a/model/index.html +++ b/model/index.html @@ -2,10 +2,12 @@ - + Model — GuestGraph + + diff --git a/model/og.sha b/model/og.sha index db9837a..4a1b432 100644 --- a/model/og.sha +++ b/model/og.sha @@ -1 +1 @@ -42a1b3d74a3ae0c49bef54f027e28ab85acd78c908104e68a2c2f0c2f222bb9f +16ba3c1bf9e5f3bd1e31826bb56a3be50992912d351fa50461fd66251ba06977 diff --git a/og.sha b/og.sha index d9f73a1..89576a9 100644 --- a/og.sha +++ b/og.sha @@ -1 +1 @@ -5bcf8837c4e2a0c81533477c7bbd6bf9ce7681e1064b75e1af372aa15f8e97a3 +cada76bf87f458158c3d785d1deaf9d79c2611b93cb90c8362e7a61fd530b44f diff --git a/package-lock.json b/package-lock.json index 72295b2..e2321be 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", @@ -96,8 +96,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 5cf3f7e..3e60cf2 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,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 f4dcf3a..1420e06 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 .credit{display:inline-flex; align-items:center; gap:.5em; vertical-align:-.25em; font-family:"Instrument Sans", ui-sans-serif, system-ui, sans-serif; diff --git a/page.js b/page.js index 1ade9c2..a030d9b 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 1247f14..cf43889 100644 --- a/principles/index.html +++ b/principles/index.html @@ -2,10 +2,12 @@ - + Principles — GuestGraph + + diff --git a/principles/og.sha b/principles/og.sha index 6ad7e72..c2c30c8 100644 --- a/principles/og.sha +++ b/principles/og.sha @@ -1 +1 @@ -5488e06d1a8ea72a2253c6cc5dfd17da50ea6ac6091c3d03544be3d10a135545 +fa8d76d1b655591c7806c94c7ad8983cb55969b0ac6eb4cfe1c1410c9459d3cd diff --git a/privacy/index.html b/privacy/index.html index 6edc3ea..839a6bd 100644 --- a/privacy/index.html +++ b/privacy/index.html @@ -2,10 +2,12 @@ - + Privacy — GuestGraph + + diff --git a/privacy/og.sha b/privacy/og.sha index 1b86839..82160f2 100644 --- a/privacy/og.sha +++ b/privacy/og.sha @@ -1 +1 @@ -2ea411a14fc97ab48ff05bbb4e573f24f3715d127fe2b1dd9b9c572ea6039653 +d19136ba2f21a6c690db6799d4b913d54d537a949e49087702f213698b695a72 diff --git a/problems/index.html b/problems/index.html index 8c36d81..6ebdc75 100644 --- a/problems/index.html +++ b/problems/index.html @@ -2,10 +2,12 @@ - + Problems — GuestGraph + + diff --git a/problems/og.sha b/problems/og.sha index ee0873d..2a5ba36 100644 --- a/problems/og.sha +++ b/problems/og.sha @@ -1 +1 @@ -1c1fd91883ecb85e5df984abdddec51c6579ea4dfaca9461695cc055f2912c99 +d52d08c4f6cdaabea8d3c4268a76d5a2697264811dc0cec6b699015f58abcef5 diff --git a/processes/index.html b/processes/index.html index 7eee019..d90e299 100644 --- a/processes/index.html +++ b/processes/index.html @@ -2,10 +2,12 @@ - + Processes — GuestGraph + + diff --git a/processes/og.sha b/processes/og.sha index 69b8de0..f99ec2f 100644 --- a/processes/og.sha +++ b/processes/og.sha @@ -1 +1 @@ -ec12a703b14f241bda2fd59bc411dc9718d035546647680052cf57628ab8862b +19923a20e8a741985e615962ecc597fca013c7791210b223a78098a15e2eed51 diff --git a/surfaces/index.html b/surfaces/index.html index 6ee009e..f3c05dc 100644 --- a/surfaces/index.html +++ b/surfaces/index.html @@ -2,10 +2,12 @@ - + Surfaces — GuestGraph + + diff --git a/surfaces/og.sha b/surfaces/og.sha index 7d73ab5..09e5bae 100644 --- a/surfaces/og.sha +++ b/surfaces/og.sha @@ -1 +1 @@ -3c5ad94ad402d5c2b49b9852a072e3c428ea26de34330e314c9d0cb181a32d9b +bfa578034b95bcbde96af762ed49055bd8818e8960331f0b54012ddf5a2bf46c diff --git a/talks/index.html b/talks/index.html index 6a4c849..b02c4e5 100644 --- a/talks/index.html +++ b/talks/index.html @@ -2,8 +2,10 @@ - + + +