diff --git a/serverAppConfigs-docs/Infrastructure/Homepage.md b/serverAppConfigs-docs/Infrastructure/Homepage.md index ed84a15..4f555b9 100644 --- a/serverAppConfigs-docs/Infrastructure/Homepage.md +++ b/serverAppConfigs-docs/Infrastructure/Homepage.md @@ -205,6 +205,17 @@ systemd services keep the `frank-primary`/`frank-large`/ `frank-secondary` names. Homepage, docs page and harness now agree on one name per model. +**Console polish (2026-10-08, eighth wave):** five fixes — octagon +clip-paths replaced with `border-radius` (the clipped corners read as +gaps in the 1px border); section-title diamonds moved from absolute +positioning to a fixed-width inline glyph (aligned, wrap-safe); closed +WIP items grey out (dim type, desaturated art, muted border via +`:has(.badge.wip-closed)`); the Dragoon tagline is one spliced track +(`sfx/dragoon-tagline.ogg` — loudnorm-matched, silence-trimmed, 350 ms +beat; the two SC2 source oggs are trashed); privacy notes render as +full inline text — the hover-tooltip pattern was unreachable on touch +devices. + ## Design decision — 2026-08-22 The live up/down check runs server-side. A checker on Dankclaw probes each backend and writes a same-origin `status.json`. The page fetches only that file and renders the badges. The browser never calls a backend directly. The checker runs as a systemd timer every 3 minutes. diff --git a/shared/homepage/app.js b/shared/homepage/app.js index d14c639..3f9ad8c 100644 --- a/shared/homepage/app.js +++ b/shared/homepage/app.js @@ -96,8 +96,8 @@ function miCard(svc, state) { if (m.compaction) parts.push('
⚡ ' + esc(m.compaction) + '
'); if (m.supervision) parts.push('
' + esc(m.supervision) + '
'); if (m.permission) parts.push('
⚠ ' + esc(m.permission) + '
'); - if (m.warn) parts.push('
' + - '⚠ ' + esc(m.warn.split(':')[0]) + ' \u2014 hover to read
'); + if (m.warn) parts.push('
' + + '⚠ ' + esc(m.warn) + '
'); const card = document.createElement('article'); card.className = 'mi-card mi-' + esc(m.unit); card.innerHTML = parts.join(''); @@ -132,7 +132,7 @@ function renderPanel(svc, state) { const art = svc.art ? '' : ''; const warn = svc.warn - ? '
⚠ privacy note \u2014 hover to read
' + ? '
⚠ ' + esc(svc.warn) + '
' : ''; panel.innerHTML = '
' + art + diff --git a/shared/homepage/services.json b/shared/homepage/services.json index ee12276..fd5b57b 100644 --- a/shared/homepage/services.json +++ b/shared/homepage/services.json @@ -334,8 +334,7 @@ "hf": "https://huggingface.co/Quat3rnion/halogen-swift1.5-qwen3.8-flash-next-v2-abliterated", "tagline": "I have returned — make use of me.", "sfx": [ - "dragoon-returned.ogg", - "dragoon-makeuse.ogg" + "dragoon-tagline.ogg" ], "equiv": "Equivalent to Claude Sonnet 5 / OpenAI-Luna (Summer 2026 frontier intelligence).", "spec": "Qwen3.8-Flash-Next v2 Swift1.5 abliterated (halogen flash-server, ~62 GiB) on the Strix Halo iGPU — 200k-token context, two submissions at a time; sees images.", diff --git a/shared/homepage/sfx/dragoon-makeuse.ogg b/shared/homepage/sfx/dragoon-makeuse.ogg deleted file mode 100644 index f08b185..0000000 Binary files a/shared/homepage/sfx/dragoon-makeuse.ogg and /dev/null differ diff --git a/shared/homepage/sfx/dragoon-returned.ogg b/shared/homepage/sfx/dragoon-returned.ogg deleted file mode 100644 index 962e091..0000000 Binary files a/shared/homepage/sfx/dragoon-returned.ogg and /dev/null differ diff --git a/shared/homepage/sfx/dragoon-tagline.ogg b/shared/homepage/sfx/dragoon-tagline.ogg new file mode 100644 index 0000000..ebc4e4f Binary files /dev/null and b/shared/homepage/sfx/dragoon-tagline.ogg differ diff --git a/shared/homepage/style.css b/shared/homepage/style.css index 2bcf6f9..8ec8023 100644 --- a/shared/homepage/style.css +++ b/shared/homepage/style.css @@ -1,6 +1,6 @@ /* The homepage theme: StarCraft Protoss console — flat deep-space navy, warp-blue/cyan accents used sparingly, Share Tech Mono body with - Rajdhani headings (Google Fonts CDN), octagon-cut panels on crisp + Rajdhani headings (Google Fonts CDN), soft-radius panels on crisp 1px steel borders, quiet section headers. Motion is reserved for state (speaking voice). A ?bare=1 toggle strips the page to bare, unstyled HTML (Q27). The page never sets a custom or hidden cursor, @@ -71,8 +71,8 @@ body::after { position: relative; border-bottom: 1px solid var(--border); } -.section-title::before { content: "\25C7"; position: absolute; left: 3px; top: 50%; - transform: translateY(-55%); color: var(--proto-cyan); } +.section-title::before { content: "\25C7"; display: inline-block; width: 18px; + margin-left: -24px; color: var(--proto-cyan); } .grid { display: grid; @@ -81,7 +81,7 @@ body::after { } .panel { border: 1px solid var(--border); background: var(--panel); padding: 12px 14px; - clip-path: polygon(14px 0, calc(100% - 14px) 0, 100% 14px, 100% calc(100% - 14px), calc(100% - 14px) 100%, 14px 100%, 0 calc(100% - 14px), 0 14px); } + border-radius: 6px; } .panel.clickable { cursor: pointer; transition: border-color 0.15s, filter 0.15s, transform 0.15s; } .panel.clickable:hover { border-color: var(--proto-cyan); @@ -113,11 +113,19 @@ body::after { } .name { color: var(--head); } .badge { border: 1px solid currentColor; padding: 0 6px; font-size: 12px; - clip-path: polygon(4px 0, calc(100% - 4px) 0, 100% 4px, 100% calc(100% - 4px), calc(100% - 4px) 100%, 4px 100%, 0 calc(100% - 4px), 0 4px); } + border-radius: 3px; } .badge.up { color: var(--fg); } .badge.down { color: var(--down); } .badge.wip-open { color: var(--wip); } .badge.wip-closed { color: var(--dim); } +/* Closed WIP items grey out: darker type, desaturated art. */ +.panel:has(.badge.wip-closed) { border-color: color-mix(in srgb, var(--dim) 45%, var(--border)); } +.panel:has(.badge.wip-closed) .name, +.panel:has(.badge.wip-closed) .desc, +.panel:has(.badge.wip-closed) .desc-role, +.panel:has(.badge.wip-closed) .desc-spec, +.panel:has(.badge.wip-closed) .desc-use { color: var(--dim); } +.panel:has(.badge.wip-closed) .app-art { filter: grayscale(0.75) brightness(0.7); } .badge.wip-down { color: var(--down); } .desc { color: var(--fg); margin: 8px 0; } .desc-role { color: var(--dim); font-weight: bold; } @@ -144,7 +152,7 @@ body::after { padding: 2px 14px; text-transform: uppercase; letter-spacing: 1px; - clip-path: polygon(8px 0, calc(100% - 8px) 0, 100% 8px, 100% calc(100% - 8px), calc(100% - 8px) 100%, 8px 100%, 0 calc(100% - 8px), 0 8px); + border-radius: 4px; } .foot-btn:hover { background: color-mix(in srgb, var(--link) 14%, transparent); @@ -179,7 +187,7 @@ html[data-bare="1"] .desc-role, html[data-bare="1"] .desc-spec, html[data-bare=" html[data-bare="1"] .section-title { border-color: #000; padding: 0 0 6px 2px; } html[data-bare="1"] .links a, html[data-bare="1"] .toggle, html[data-bare="1"] .foot a { color: #000; } html[data-bare="1"] .foot-btn { border-color: #000; text-shadow: none; } -html[data-bare="1"] .panel, html[data-bare="1"] .mi-card, html[data-bare="1"] .badge, html[data-bare="1"] .foot-btn, html[data-bare="1"] .model-info { clip-path: none; filter: none; animation: none; box-shadow: none; } +html[data-bare="1"] .panel, html[data-bare="1"] .mi-card, html[data-bare="1"] .badge, html[data-bare="1"] .foot-btn, html[data-bare="1"] .model-info { clip-path: none; border-radius: 0; filter: none; animation: none; box-shadow: none; } html[data-bare="1"] body::after { display: none; } html[data-bare="1"] .section-title::before, html[data-bare="1"] .section-title::after, html[data-bare="1"] .title::after { content: none; } html[data-bare="1"] .top { border-image: none; } @@ -191,7 +199,7 @@ html[data-bare="1"] .top { border-image: none; } grid-column: 1 / -1; background: var(--panel); box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--proto-cyan) 25%, transparent); - clip-path: polygon(16px 0, calc(100% - 16px) 0, 100% 16px, 100% calc(100% - 16px), calc(100% - 16px) 100%, 16px 100%, 0 calc(100% - 16px), 0 16px); + border-radius: 8px; } .mi-title { color: var(--proto-cyan); @@ -211,7 +219,7 @@ html[data-bare="1"] .top { border-image: none; } line-height: 1.35; border: 1px solid var(--mi); padding: 10px 12px; - clip-path: polygon(12px 0, calc(100% - 12px) 0, 100% 12px, 100% calc(100% - 12px), calc(100% - 12px) 100%, 12px 100%, 0 calc(100% - 12px), 0 12px); + border-radius: 6px; background: linear-gradient(160deg, color-mix(in srgb, var(--mi) 5%, var(--panel)), var(--panel) 60%); } .mi-zealot { --mi: #4fb4ff; } /* Zealot: Khai's blue blades */ @@ -253,15 +261,14 @@ html[data-bare="1"] .top { border-image: none; } .mi-inputs { color: var(--dim); } .mi-use { color: var(--fg); margin-top: 4px; } .mi-super { color: var(--link); margin-top: 6px; } -.mi-warn { color: var(--down); margin-top: 4px; cursor: help; - text-decoration: underline dotted color-mix(in srgb, var(--down) 60%, transparent); } +.mi-warn { color: var(--down); margin-top: 4px; } .mi-perm { margin-top: 8px; padding: 6px 8px; border: 1px solid var(--down); color: var(--down); font-weight: bold; - clip-path: polygon(6px 0, calc(100% - 6px) 0, 100% 6px, 100% calc(100% - 6px), calc(100% - 6px) 100%, 6px 100%, 0 calc(100% - 6px), 0 6px); + border-radius: 4px; } .mi-comp { margin-top: 8px; @@ -269,10 +276,9 @@ html[data-bare="1"] .top { border-image: none; } border: 1px solid var(--head); color: var(--head); background: color-mix(in srgb, var(--head) 8%, transparent); - clip-path: polygon(6px 0, calc(100% - 6px) 0, 100% 6px, 100% calc(100% - 6px), calc(100% - 6px) 100%, 6px 100%, 0 calc(100% - 6px), 0 6px); + border-radius: 4px; } -.svc-warn { color: var(--down); margin-top: 6px; cursor: help; - text-decoration: underline dotted color-mix(in srgb, var(--down) 60%, transparent); } +.svc-warn { color: var(--down); margin-top: 6px; } /* Bare mode strips the model component to plain prose too. */ html[data-bare="1"] .mi-card { border-color: #000; box-shadow: none; background: none; }