fix(ui): kiosk map animates again + paints on resize; gloss scoped; icons get intrinsic size
Demo images / Build & push demo images (push) Successful in 3m42s

- NetworkMap3D: kiosks keep static PLACEMENT (the rAF-fragile intro was
  the blank-screen cause) but re-attach the half-rate ticker — the calm
  orbit is back; and measure() now renders explicitly when no ticker runs,
  so resizes repaint instead of leaving a stale/blank/mis-scaled
  projection (also fixes reduced-motion users on any screen).
- Gloss v3 scoped to .logo-gloss opt-in (screensaver, intro, login,
  splash tap-logo) — it had leaked onto every logo-gradient-border user,
  including the dashboard header, via AnimatedLogo's default border.
- normalize-app-icon.py output now carries intrinsic 512x512 dimensions:
  a viewBox-only SVG collapses to nothing in auto-sized tiles (the
  'transparent icon in My Apps' report); both app icons regenerated.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
archipelago
2026-08-14 05:11:54 -04:00
co-authored by Claude Fable 5
parent 2b7e92e770
commit b5e33784e6
8 changed files with 27 additions and 18 deletions
+1 -1
View File
@@ -1,5 +1,5 @@
<template>
<div class="logo-gradient-border screensaver-logo-cycle relative w-48 h-48 sm:w-64 sm:h-64 md:w-80 md:h-80 flex items-center justify-center overflow-hidden">
<div class="logo-gradient-border logo-gloss screensaver-logo-cycle relative w-48 h-48 sm:w-64 sm:h-64 md:w-80 md:h-80 flex items-center justify-center overflow-hidden">
<!-- Squares logo -->
<div class="screensaver-logo-squares absolute inset-[3px] flex items-center justify-center">
<AnimatedLogo size="xl" no-border fit />
@@ -878,7 +878,9 @@ function tick(_time: number, deltaMS: number) {
}
function attachTicker() {
if (tickerAttached || staticMode) return
// Kiosks run staticMode for PLACEMENT (instant, intro-free) but still get
// the calm orbit — half-rate via the kioskLowPower frame-skip in tick().
if (tickerAttached || (staticMode && !kioskLowPower)) return
gsap.ticker.add(tick)
tickerAttached = true
}
@@ -1179,17 +1181,19 @@ function measure() {
}
// Resize: snap to the current mode's fit (no tween — tracks the drag)
applyMode(viewMode.value, false)
// No ticker (reduced-motion) means nobody repaints after this resize —
// without an explicit render the map keeps its stale (possibly zero-size)
// projection: the "loads blank / wrong scale until refresh" bug.
if (built && !tickerAttached) render()
}
function initialBuild() {
// Kiosk TVs get the fully static map: no entrance animation, no ticker.
// The GSAP intro needs healthy rAF delivery to ever reach opacity 1 — on
// a paint-starved kiosk it stalls and the screen reads as BLANK until a
// lucky refresh (framework-pt, 2026-08-14). Half-rate ticking (below)
// helped but any continuous SVG animation is still the single biggest
// load on the kiosk's compositor, and at TV distance the still map loses
// nothing. Everything lands in place immediately, graph updates apply
// instantly, and the 2D/3D toggle still works.
// Kiosk TVs take the static PLACEMENT path (the GSAP entrance intro needs
// healthy rAF delivery to reach opacity 1 — on a paint-starved kiosk it
// stalls and the screen reads as BLANK until a lucky refresh,
// framework-pt 2026-08-14) but keep the calm orbital motion: the ticker
// re-attaches below at half rate. Fully-static-everything was tried and
// rejected — it also killed the animation on screens that could carry it.
staticMode = prefersReducedMotion() || kioskLowPower
built = true
applyGraph()
@@ -1208,6 +1212,8 @@ function initialBuild() {
if (staticMode) {
introPlayed = true
playIntro() // static branch: everything lands in place
attachTicker() // no-op for reduced-motion; kiosks resume the calm orbit
render() // paint the landed state now — nothing else repaints until a tick
return
}
attachTicker()