From b8f2bb462e9e2bc0f5df2894866ee13f51ec7e9c Mon Sep 17 00:00:00 2001 From: Nibu Date: Sat, 7 Nov 2026 18:22:19 +0000 Subject: [PATCH 001/248] auth: login card fill 50% with 18px blur and a faint edge The blur flattens the sky and ridges behind the text, so the fill can be half as opaque and let the scene show through. Text over the unblurred horizon glow is 4.15:1 (4.5 needs 54%); measured over the real blurred backdrop at 390x844 it is >= 4.94:1. Co-Authored-By: Claude Sonnet 5.5 --- src/app/pages/auth/styles.css.ts | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/app/pages/auth/styles.css.ts b/src/app/pages/auth/styles.css.ts index a9733ef0..b45539a6 100644 --- a/src/app/pages/auth/styles.css.ts +++ b/src/app/pages/auth/styles.css.ts @@ -56,7 +56,9 @@ export const AuthFooter = style({ // signed-out ground is clear and the card is a translucent, blurred pane shaped like a message // bubble (BubbleContent: radius R500, no border), filled with the sky's bubble colour. The // --sky-bubble variables come from the sky theme (PR #22); the plain colours are the fallback -// until it lands. 85% fill keeps text >= 4.5:1 over the scene's brightest and darkest backdrops. +// until it lands. The fill is 50%: the 18px blur carries the readability, flattening the sky and +// ridges behind the text. Without the blur, text is 4.15:1 over the brightest backdrop (the horizon +// glow; 4.5:1 needs 54%) and >= 7.3:1 elsewhere in the scene. // The card is also made shorter so it leaves more of the scene visible on a phone. const scene = ':root[data-scene]'; globalStyle(`${scene} ${AuthLayout}`, { @@ -65,13 +67,14 @@ globalStyle(`${scene} ${AuthLayout}`, { }); globalStyle(`${scene} ${AuthCard}`, { backgroundColor: [ - 'rgba(13, 26, 38, 0.85)', - 'color-mix(in srgb, var(--sky-bubble, #0d1a26) 85%, transparent)', + 'rgba(13, 26, 38, 0.5)', + 'color-mix(in srgb, var(--sky-bubble, #0d1a26) 50%, transparent)', ], color: 'var(--sky-bubble-text, #b7c7d9)', borderRadius: config.radii.R500, - borderColor: 'transparent', - backdropFilter: 'blur(12px)', + // A faint inner edge, so a pane this clear still reads as a surface. + borderColor: 'rgba(183, 199, 217, 0.14)', + backdropFilter: 'blur(18px)', }); globalStyle(`${scene} ${AuthHeader}`, { backgroundColor: 'transparent', From 053a40038e8bde92a911b635721171430a6f7c3a Mon Sep 17 00:00:00 2001 From: Void Date: Sat, 7 Nov 2026 18:25:40 +0000 Subject: [PATCH 002/248] ci: rerun rat-dev-preview (runner MemoryMax now 8 GiB) Co-Authored-By: Claude Sonnet 5.5 From 2b3384ff5cd22bfc0db69705809539e634ea7c6f Mon Sep 17 00:00:00 2001 From: Void Date: Sat, 7 Nov 2026 18:29:53 +0000 Subject: [PATCH 003/248] ci: upload the dev preview artifact with forgejo/upload-artifact actions/upload-artifact v4+ throws GHESNotSupportedError on this forge (run 169); Forgejo's fork is the supported uploader. Co-Authored-By: Claude Sonnet 5.5 --- .github/workflows/rat-dev-preview.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/rat-dev-preview.yml b/.github/workflows/rat-dev-preview.yml index 8ad64c55..7f0d0b6a 100644 --- a/.github/workflows/rat-dev-preview.yml +++ b/.github/workflows/rat-dev-preview.yml @@ -27,7 +27,8 @@ jobs: - name: Set background scene tier run: node scripts/preview-config.js low - name: Upload artifact - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 + # Forgejo's fork: upstream upload-artifact v4+ refuses non-GitHub servers (GHESNotSupportedError). + uses: forgejo/upload-artifact@v4 with: name: rat-dev-dist path: dist From 833c477785c90eed5d414579edd41f773d49a70b Mon Sep 17 00:00:00 2001 From: Nibu Date: Sat, 7 Nov 2026 18:30:20 +0000 Subject: [PATCH 004/248] scene: baked starfield with a rolling twinkle window for dark skies Every star is seeded, placed toward the zenith, faded by the local sky luma, and baked once into the sky canvas. A night sky is one whose zenith luma is below 110; the ridge scene has no theme flag, so the dusk default qualifies faintly and a day sky gets no stars and no overlay. 32 slots twinkle at a time on a small overlay canvas under the ridges: each slot runs back-to-back one-cycle twinkles (own 2-7 s period and offset) of one star from its own partition, shuffled per epoch, never repeating across the seam. Gain is a pure function of (slot, t), 0.35x to 1.15x, exactly 1 at start and end. Dimming paints the sky's own colour over the baked star; brightening adds a star. The pass is clear + at most 32 arcs at 20 fps, stopped under reduced motion (live), while hidden, in tier 'still', and after the slow-frame fallback. Co-Authored-By: Claude Sonnet 5.5 --- src/app/features/scene/ridge/Ridge.test.ts | 170 ++++++++++++-- src/app/features/scene/ridge/Ridge.ts | 66 +++++- src/app/features/scene/ridge/stars.test.ts | 185 +++++++++++++++ src/app/features/scene/ridge/stars.ts | 249 +++++++++++++++++++++ 4 files changed, 655 insertions(+), 15 deletions(-) create mode 100644 src/app/features/scene/ridge/stars.test.ts create mode 100644 src/app/features/scene/ridge/stars.ts diff --git a/src/app/features/scene/ridge/Ridge.test.ts b/src/app/features/scene/ridge/Ridge.test.ts index bb35209e..3aecad12 100644 --- a/src/app/features/scene/ridge/Ridge.test.ts +++ b/src/app/features/scene/ridge/Ridge.test.ts @@ -15,7 +15,8 @@ import { scatterAlpha, transmittance, } from './ridgeWorld'; -import { skyColours } from './skyColour'; +import { skyColours, SkyColours } from './skyColour'; +import { makeStars } from './stars'; import { startBackgroundScene } from '../index'; describe('noise', () => { @@ -245,6 +246,15 @@ function fakeEl(tag = 'div') { }; return el; } +// A day sky has no stars, so the scene tests below see only the ridge loop; the dusk default +// carries stars and a twinkle overlay, tested in 'the starfield in the scene'. +const DAY: SkyColours = { + top: [96, 150, 220], + mid: [150, 190, 235], + horizon: [240, 215, 190], + ground: [7, 17, 26], + sunAzimuth: 0.3, +}; const draws: string[] = []; function ctx(withFilter = false) { const c: any = { @@ -257,7 +267,19 @@ function ctx(withFilter = false) { moveTo() {}, lineTo() {}, closePath() {}, - fill: () => draws.push('fill'), + // Stars: arc+fill is one draw. A context that has cleared a rect is the twinkle overlay's. + clearRect() { + c.overlay = true; + draws.push('clear'); + }, + arc() { + draws.push(c.overlay ? 'twinkle' : 'star'); + c.arcing = true; + }, + fill: () => { + if (c.arcing) c.arcing = false; + else draws.push('fill'); + }, drawImage: () => draws.push('flatten'), set fillStyle(_v: unknown) {}, }; @@ -312,7 +334,8 @@ const runFrames = (dt: number, n: number, from = 0) => { let t = from; for (let i = 0; i < n && rafQueue.length; i += 1) { t += dt; - rafQueue.shift()!(t); + // One display frame: every callback queued for it sees the same timestamp. + rafQueue.splice(0).forEach((cb) => cb(t)); } return t; }; @@ -327,12 +350,12 @@ describe('createRidgeScene', () => { it('returns null when 2D context is missing, so the host keeps its CSS ground', () => { const { canvas } = host(); canvas.getContext = vi.fn(() => null); - expect(createRidgeScene({ canvas, tier: 'full' })).toBeNull(); + expect(createRidgeScene({ canvas, tier: 'full', sky: DAY })).toBeNull(); }); it('bakes the sky once and paints four layers at integer sizes, farthest first', () => { const { parent, canvas } = host(); - const s = createRidgeScene({ canvas, tier: 'full' })!; + const s = createRidgeScene({ canvas, tier: 'full', sky: DAY })!; expect(s).not.toBeNull(); const layers = parent.children.slice(1); expect(layers).toHaveLength(LAYERS.length); @@ -348,7 +371,7 @@ describe('createRidgeScene', () => { it('after the layers are painted, a smooth run draws nothing more and ends its rAF loop', () => { const { canvas } = host(); - const s = createRidgeScene({ canvas, tier: 'full' })!; + const s = createRidgeScene({ canvas, tier: 'full', sky: DAY })!; const before = draws.length; runFrames(16.7, 400); expect(draws.length).toBe(before); @@ -359,7 +382,7 @@ describe('createRidgeScene', () => { it('p95 over 33 ms across 2 s flattens to a still image and removes the layers', () => { const { parent, canvas } = host(); const onProbe = vi.fn(); - const s = createRidgeScene({ canvas, tier: 'full', onProbe })!; + const s = createRidgeScene({ canvas, tier: 'full', onProbe, sky: DAY })!; runFrames(100, 100); expect(draws.filter((d) => d === 'flatten')).toHaveLength(LAYERS.length); expect(parent.children).toEqual([canvas]); @@ -379,7 +402,7 @@ describe('createRidgeScene', () => { it('prefers-reduced-motion: layers are built but never played, and nothing is sampled', () => { motion.matches = true; const { canvas } = host(); - const s = createRidgeScene({ canvas, tier: 'full' })!; + const s = createRidgeScene({ canvas, tier: 'full', sky: DAY })!; const anims = canvas.anims.concat(...canvas.parentElement.children.map((c: any) => c.anims)); expect(anims.length).toBe(LAYERS.length); anims.forEach((a: any) => expect(a.play).not.toHaveBeenCalled()); @@ -389,7 +412,7 @@ describe('createRidgeScene', () => { it('pauses the drift when the tab is hidden and resumes when it is visible', () => { const { parent, canvas } = host(); - const s = createRidgeScene({ canvas, tier: 'full' })!; + const s = createRidgeScene({ canvas, tier: 'full', sky: DAY })!; const anims = parent.children.slice(1).flatMap((l: any) => l.anims); anims.forEach((a: any) => a.pause.mockClear()); doc.visibilityState = 'hidden'; @@ -405,7 +428,7 @@ describe('createRidgeScene', () => { it('?probe=1 keeps the rAF loop alive and shows median and p95', () => { search = '?probe=1'; const { parent, canvas } = host(); - const s = createRidgeScene({ canvas, tier: 'full' })!; + const s = createRidgeScene({ canvas, tier: 'full', sky: DAY })!; const readout = parent.children[parent.children.length - 1]; runFrames(16.7, 300); expect(rafQueue.length).toBe(1); // still sampling @@ -416,7 +439,7 @@ describe('createRidgeScene', () => { it('dispose cancels the loop, the animations and the layers', () => { const { parent, canvas } = host(); - const s = createRidgeScene({ canvas, tier: 'full' })!; + const s = createRidgeScene({ canvas, tier: 'full', sky: DAY })!; const anims = parent.children.slice(1).flatMap((l: any) => l.anims); s.dispose(); anims.forEach((a: any) => expect(a.cancel).toHaveBeenCalled()); @@ -456,7 +479,7 @@ describe('fbm', () => { describe('aerial perspective in the scene', () => { it('is baked once: one scatter fill per hazy layer, none per frame, the nearest layer has none', () => { const { canvas } = host(); - const s = createRidgeScene({ canvas, tier: 'full' })!; + const s = createRidgeScene({ canvas, tier: 'full', sky: DAY })!; expect(draws.filter((d) => d === 'scatter')).toHaveLength(LAYERS.length - 1); const before = draws.length; runFrames(16.7, 400); @@ -469,7 +492,7 @@ describe('aerial perspective in the scene', () => { const s = createRidgeScene({ canvas, tier: 'full', - sky: { ...skyColours(), sunAzimuth: undefined }, + sky: { ...DAY, sunAzimuth: undefined }, })!; expect(draws.filter((d) => d === 'scatter')).toHaveLength(0); s.dispose(); @@ -495,7 +518,7 @@ describe('aerial perspective in the scene', () => { }); return el; }; - const s = createRidgeScene({ canvas, tier: 'full' })!; + const s = createRidgeScene({ canvas, tier: 'full', sky: DAY })!; const blurs = filters.filter((f) => f !== 'none'); expect(blurs).toHaveLength(LAYERS.length - 1); // nearest is sharp expect(blurs[0]).toBe(`blur(${edgeBlur(LAYERS[0]) * 2}px)`); // DPR 2 @@ -511,3 +534,122 @@ describe('aerial perspective in the scene', () => { expect(draws.filter((d) => d === 'flatten')).toHaveLength(LAYERS.length); }); }); + +describe('the starfield in the scene', () => { + const count = (kind: string) => draws.filter((d) => d === kind).length; + const night = { + ...DAY, + top: [10, 14, 40], + mid: [30, 34, 80], + horizon: [60, 50, 90], + } as SkyColours; + const N = makeStars(night, 400, 800).length; + const hear = (name: string) => { + const calls = motion.addEventListener.mock.calls.filter((c: any[]) => c[0] === name); + return calls[calls.length - 1][1] as () => void; + }; + // Everything but the overlay's own marks: the bake and the ridges. + const baked = () => draws.filter((d) => d !== 'twinkle' && d !== 'clear').length; + + it('bakes every star once into the sky; per frame only the overlay is touched', () => { + const { parent, canvas } = host(); + const s = createRidgeScene({ canvas, tier: 'full', sky: night })!; + expect(count('star')).toBe(N); + expect(count('sky')).toBe(1); + expect(parent.children.indexOf(parent.children[1])).toBe(1); + expect(parent.children[1].anims).toHaveLength(0); // the overlay: above the sky, under the ridges + expect(parent.children).toHaveLength(2 + LAYERS.length); + const before = baked(); + runFrames(16.7, 300); // 5 s at 60 fps; the overlay repaints at 20 fps + expect(baked()).toBe(before); + expect(count('clear')).toBeGreaterThan(60); + expect(count('clear')).toBeLessThanOrEqual(101); + // each pass paints at most SLOTS stars + expect(count('twinkle')).toBeLessThanOrEqual(count('clear') * 32); + expect(count('twinkle')).toBeGreaterThan(0); + s.dispose(); + }); + + it('a day sky has no stars and no overlay layer', () => { + const { parent, canvas } = host(); + const s = createRidgeScene({ canvas, tier: 'full', sky: DAY })!; + expect(count('star')).toBe(0); + expect(parent.children).toHaveLength(1 + LAYERS.length); + runFrames(16.7, 60); + expect(count('clear')).toBe(0); + s.dispose(); + }); + + it("tier 'still' bakes the stars and has no overlay or loop", () => { + const { parent, canvas } = host(); + createRidgeScene({ canvas, tier: 'still', sky: night }); + expect(count('star')).toBe(N); + expect(parent.children).toEqual([canvas]); + expect(rafQueue).toHaveLength(0); + }); + + it('stops twinkling under reduced motion, live, and resumes when it is lifted', () => { + const { canvas } = host(); + const s = createRidgeScene({ canvas, tier: 'full', sky: night })!; + let t = runFrames(16.7, 30); + expect(count('twinkle')).toBeGreaterThan(0); + motion.matches = true; + hear('change')(); + t = runFrames(16.7, 5, t); + const stopped = draws.length; + t = runFrames(16.7, 200, t); + expect(draws.length).toBe(stopped); + expect(rafQueue).toHaveLength(0); + motion.matches = false; + hear('change')(); + runFrames(16.7, 30, t); + expect(draws.length).toBeGreaterThan(stopped); + s.dispose(); + }); + + it('starts steady, with nothing painted over the stars, when reduced motion is already on', () => { + motion.matches = true; + const { canvas } = host(); + const s = createRidgeScene({ canvas, tier: 'full', sky: night })!; + expect(rafQueue).toHaveLength(0); + runFrames(16.7, 60); + expect(count('twinkle')).toBe(0); + s.dispose(); + }); + + it('stops while the tab is hidden and resumes when it is visible', () => { + const { canvas } = host(); + const s = createRidgeScene({ canvas, tier: 'full', sky: night })!; + let t = runFrames(16.7, 30); + doc.visibilityState = 'hidden'; + doc.dispatchEvent(new Event('visibilitychange')); + const hidden = draws.length; + t = runFrames(16.7, 200, t); + expect(draws.length).toBe(hidden); + expect(rafQueue).toHaveLength(0); + doc.visibilityState = 'visible'; + doc.dispatchEvent(new Event('visibilitychange')); + runFrames(16.7, 30, t); + expect(draws.length).toBeGreaterThan(hidden); + s.dispose(); + }); + + it('flattening to a still (slow frames) drops the overlay and leaves every star baked under the ridges', () => { + const { parent, canvas } = host(); + const s = createRidgeScene({ canvas, tier: 'full', sky: night })!; + runFrames(100, 100); + expect(parent.children).toEqual([canvas]); + expect(count('star')).toBe(N); + expect(draws.indexOf('flatten')).toBeGreaterThan(draws.lastIndexOf('star')); + expect(rafQueue).toHaveLength(0); + s.dispose(); + }); + + it('dispose removes the overlay and stops the loop', () => { + const { parent, canvas } = host(); + const s = createRidgeScene({ canvas, tier: 'full', sky: night })!; + s.dispose(); + expect(parent.children).toEqual([canvas]); + expect(rafQueue).toHaveLength(0); + }); +}); diff --git a/src/app/features/scene/ridge/Ridge.ts b/src/app/features/scene/ridge/Ridge.ts index 218d7c65..eae0df08 100644 --- a/src/app/features/scene/ridge/Ridge.ts +++ b/src/app/features/scene/ridge/Ridge.ts @@ -1,6 +1,7 @@ import type { Scene, SceneOptions } from '../Scene'; import { FrameSampler, FrameStats } from './probe'; import { skyColours, SkyColours, Srgb } from './skyColour'; +import { activeAt, drawStars, drawTwinkle as paintTwinkle, makeStars, Star } from './stars'; import { LAYERS, LayerSpec, @@ -130,8 +131,13 @@ function paintLayer( interface Built { layers: HTMLCanvasElement[]; anims: Animation[]; + /** The twinkling stars' own canvas, between the sky and the ridges; absent in a day sky and in 'still'. */ + twinkle?: HTMLCanvasElement; } +/** The twinkle overlay redraws at most this often: the swings are 2 to 7 s, no need for 60 fps. */ +const TWINKLE_FRAME_MS = 50; + /** * The ridge scene: same contract as `createScene` ({ login, dispose }, null for "keep the CSS * ground"), no WebGL. The layers are painted once on the CPU; per frame the only work is the @@ -149,6 +155,9 @@ export function createRidgeScene(opts: RidgeOptions): Scene | null { const reducedMotion = window.matchMedia?.('(prefers-reduced-motion: reduce)'); let built: Built | undefined; + let field: Star[] = []; + let twRaf = 0; + let twLast = 0; let still = tier === 'still'; let disposed = false; let raf = 0; @@ -165,6 +174,9 @@ export function createRidgeScene(opts: RidgeOptions): Scene | null { const teardownLayers = () => { built?.anims.forEach((a) => a.cancel()); built?.layers.forEach((l) => l.remove()); + built?.twinkle?.remove(); + cancelAnimationFrame(twRaf); + twRaf = 0; built = undefined; }; @@ -177,10 +189,33 @@ export function createRidgeScene(opts: RidgeOptions): Scene | null { canvas.height = Math.round(h * scale); if (!paintSky(canvas, sky)) return false; const layers: HTMLCanvasElement[] = []; + // Every star is baked into the sky; the twinkling ones get their own canvas, which a per-frame + // pass clears and paints over. 'still' has no overlay. + const stars = makeStars(sky, w, h); + const skyCtx = context2d(canvas); + if (skyCtx) drawStars(skyCtx, stars, canvas.width, canvas.height, scale); + let twinkle: HTMLCanvasElement | undefined; + if (stars.length && tier !== 'still') { + twinkle = document.createElement('canvas'); + twinkle.width = canvas.width; + twinkle.height = canvas.height; + twinkle.setAttribute('aria-hidden', 'true'); + Object.assign(twinkle.style, { + position: 'absolute', + left: '0', + top: '0', + width: '100%', + height: '100%', + pointerEvents: 'none', + }); + parent.appendChild(twinkle); + } + field = stars; for (const spec of LAYERS) { const el = paintLayer(spec, sky, size, canvas.height, scale); if (!el) { layers.forEach((l) => l.remove()); + twinkle?.remove(); return false; } el.setAttribute('aria-hidden', 'true'); @@ -208,7 +243,7 @@ export function createRidgeScene(opts: RidgeOptions): Scene | null { ) ) .filter((a): a is Animation => !!a); - built = { layers, anims }; + built = { layers, anims, twinkle }; syncPlayState(); return true; }; @@ -219,8 +254,37 @@ export function createRidgeScene(opts: RidgeOptions): Scene | null { !(reducedMotion?.matches ?? false) && document.visibilityState === 'visible'; + /** Paint the overlay at t seconds (stars away from base), or just clear it with no t (all at base). */ + const drawTwinkle = (t?: number) => { + const el = built?.twinkle; + const ctx = el && context2d(el); + if (!el || !ctx) return; + const active = t === undefined ? [] : activeAt(field.length, t); + paintTwinkle(ctx, field, active, el.width, el.height, viewSize().scale); + }; + + // The same guard as the drift: not still, not disposed, not reduced motion, tab visible. Not moving + // stops the loop and leaves the stars steady at base brightness. + const twTick = (now: number) => { + twRaf = 0; + if (!moving() || !built?.twinkle) return; + if (now - twLast >= TWINKLE_FRAME_MS) { + twLast = now; + drawTwinkle(now / 1000); + } + twRaf = requestAnimationFrame(twTick); + }; + function syncPlayState() { built?.anims.forEach((a) => (moving() ? a.play() : a.pause())); + if (!built?.twinkle) return; + if (moving()) { + if (!twRaf) twRaf = requestAnimationFrame(twTick); + } else { + cancelAnimationFrame(twRaf); + twRaf = 0; + drawTwinkle(); + } } /** Flatten the sky and layers into the host canvas and drop the layers: a still image, no compositor layers left. */ diff --git a/src/app/features/scene/ridge/stars.test.ts b/src/app/features/scene/ridge/stars.test.ts new file mode 100644 index 00000000..38b4e7e8 --- /dev/null +++ b/src/app/features/scene/ridge/stars.test.ts @@ -0,0 +1,185 @@ +/* eslint-disable no-restricted-syntax, no-continue -- test loops over sample times */ +import { describe, expect, it } from 'vitest'; +import { skyColours } from './skyColour'; +import { + MAX_STARS, + NIGHT_LUMA, + SLOTS, + TWINKLE_GAIN, + TWINKLE_PERIOD, + activeAt, + makeStars, + skyLuma, + slotCount, + slotOffset, + slotPeriod, + starCount, + twinkleGain, +} from './stars'; + +const DAY = { + ...skyColours(), + top: [96, 150, 220], + mid: [150, 190, 235], + horizon: [240, 215, 190], +} as const; +const NIGHT = { + ...skyColours(), + top: [10, 14, 40], + mid: [30, 34, 80], + horizon: [60, 50, 90], +} as const; +const N = makeStars(NIGHT, 390, 844).length; + +function hash2(a: number, b: number) { + return ((a * 7919 + b * 104729) % 1000) / 1000; +} + +describe('star placement', () => { + it('is deterministic: the same sky and size give the identical field', () => { + expect(makeStars(NIGHT, 390, 844)).toEqual(makeStars(NIGHT, 390, 844)); + expect(makeStars(skyColours(), 390, 844)).toEqual(makeStars(skyColours(), 390, 844)); + }); + + it('draws none in a day sky, and the dusk default is dark enough for some', () => { + expect(makeStars(DAY, 390, 844)).toHaveLength(0); + expect(makeStars(skyColours(), 390, 844).length).toBeGreaterThan(50); + }); + + it('is a few hundred at most: bounded by MAX_STARS and by the viewport', () => { + for (const [w, h] of [ + [390, 844], + [1920, 1080], + [100, 100], + ] as const) { + expect(makeStars(NIGHT, w, h).length).toBeLessThanOrEqual(starCount(w, h)); + expect(starCount(w, h)).toBeLessThanOrEqual(MAX_STARS); + } + expect(N).toBeGreaterThan(150); + }); + + it('thins toward the horizon: more than twice the stars in the top third than the bottom third of the sky', () => { + const all = makeStars(NIGHT, 390, 844); + expect(all.filter((s) => s.y < 0.26).length).toBeGreaterThan( + 2 * all.filter((s) => s.y > 0.52).length + ); + }); + + it('fades with the sky: every star sits where the sky is dark, alpha within bounds', () => { + for (const s of makeStars(NIGHT, 390, 844)) { + expect(skyLuma(NIGHT, s.y)).toBeLessThan(NIGHT_LUMA); + expect(s.alpha).toBeLessThanOrEqual(0.9); + expect(s.alpha).toBeGreaterThanOrEqual(0.05); + } + }); + + it('varies in size and brightness', () => { + const all = makeStars(NIGHT, 390, 844); + expect(new Set(all.map((s) => s.r.toFixed(2))).size).toBeGreaterThan(50); + expect( + Math.max(...all.map((s) => s.alpha)) - Math.min(...all.map((s) => s.alpha)) + ).toBeGreaterThan(0.3); + }); +}); + +describe('twinkle schedule', () => { + const times = Array.from({ length: 400 }, (_, i) => i * 0.37); + + it('is a pure function of (seed, time): same t, same set and values', () => { + for (const t of [0, 0.4, 13.7, 3599.9]) expect(activeAt(N, t)).toEqual(activeAt(N, t)); + }); + + it('the set is SLOTS stars at every sampled time (inside 24..48), never more than the field has', () => { + expect(SLOTS).toBeGreaterThanOrEqual(24); + expect(SLOTS).toBeLessThanOrEqual(48); + for (const t of times) expect(activeAt(N, t)).toHaveLength(SLOTS); + expect(activeAt(10, 5)).toHaveLength(10); + expect(slotCount(10)).toBe(10); + expect(activeAt(0, 5)).toHaveLength(0); + }); + + it('no star is twice in the set at one instant, and every index is a real star', () => { + for (const t of times) { + const ids = activeAt(N, t).map((a) => a.star); + expect(new Set(ids).size).toBe(ids.length); + ids.forEach((i) => expect(i >= 0 && i < N).toBe(true)); + } + }); + + it("periods are each slot's own, within 2..7 s, and the offsets differ", () => { + for (let j = 0; j < SLOTS; j += 1) { + expect(slotPeriod(j)).toBeGreaterThanOrEqual(TWINKLE_PERIOD.min); + expect(slotPeriod(j)).toBeLessThanOrEqual(TWINKLE_PERIOD.max); + } + expect(new Set(Array.from({ length: SLOTS }, (_, j) => slotPeriod(j))).size).toBe(SLOTS); + expect(new Set(Array.from({ length: SLOTS }, (_, j) => slotOffset(j))).size).toBe(SLOTS); + for (const a of activeAt(N, 100)) expect(a.period).toBeCloseTo(slotPeriod(a.slot), 12); + }); + + it('over an hour every star twinkles at least once', () => { + const seen = new Set(); + for (let t = 0; t < 3600; t += 1) for (const a of activeAt(N, t + 0.5)) seen.add(a.star); + expect(seen.size).toBe(N); + }); + + it('a star joins at its base brightness and leaves at exactly base, with no pop', () => { + const seed = { flip: false, ripple: 3, phase: 1 }; + expect(twinkleGain(0, seed)).toBe(1); + expect(twinkleGain(1, seed)).toBe(1); + for (const flip of [true, false]) + for (const e of [1e-4, 1 - 1e-4]) + expect(Math.abs(twinkleGain(e, { ...seed, flip }) - 1)).toBeLessThan(0.01); + // through the schedule: the instant a twinkle ends the slot is on a new star's first instant, at gain 1 + for (let j = 0; j < SLOTS; j += 1) { + const end = slotOffset(j) + 40 * slotPeriod(j); + const at = activeAt(N, end).find((a) => a.slot === j)!; + expect(at.gain).toBeCloseTo(1, 9); + } + }); + + it('the star that joins is never the one that just left', () => { + for (let j = 0; j < SLOTS; j += 1) { + let prev = -1; + for (let k = 0; k < 300; k += 1) { + const t = slotOffset(j) + (k + 0.5) * slotPeriod(j); + const { star } = activeAt(N, t).find((a) => a.slot === j)!; + expect(star).not.toBe(prev); + prev = star; + } + } + }); + + it('joins never coincide: every (slot, cycle) start over an hour is distinct', () => { + const starts: number[] = []; + for (let j = 0; j < SLOTS; j += 1) + for (let k = 0; slotOffset(j) + k * slotPeriod(j) < 3600; k += 1) + starts.push(slotOffset(j) + k * slotPeriod(j)); + starts.sort((a, b) => a - b); + let min = Infinity; + for (let i = 1; i < starts.length; i += 1) min = Math.min(min, starts[i] - starts[i - 1]); + expect(min).toBeGreaterThan(0); + console.log(`joins/hour ${starts.length}, min gap between joins ${(min * 1000).toFixed(3)} ms`); + }); + + it('dims deeper than it brightens, within 0.35x..1.15x', () => { + let lo = Infinity; + let hi = -Infinity; + for (let j = 0; j < 20; j += 1) + for (let k = 0; k < 20; k += 1) { + const seed = { flip: hash2(j, k) < 0.5, ripple: 2 + (k % 2), phase: j + k }; + for (let i = 0; i <= 200; i += 1) { + const g = twinkleGain(i / 200, seed); + lo = Math.min(lo, g); + hi = Math.max(hi, g); + } + } + expect(lo).toBeGreaterThanOrEqual(TWINKLE_GAIN.dim - 1e-9); + expect(hi).toBeLessThanOrEqual(TWINKLE_GAIN.bright + 1e-9); + expect(1 - lo).toBeGreaterThan(2 * (hi - 1)); + }); + + it('stars outside the set are steady: only the active ones have a gain to apply', () => { + const inSet = new Set(activeAt(N, 50).map((a) => a.star)); + expect(inSet.size).toBeLessThan(N / 4); + }); +}); diff --git a/src/app/features/scene/ridge/stars.ts b/src/app/features/scene/ridge/stars.ts new file mode 100644 index 00000000..0e6d2628 --- /dev/null +++ b/src/app/features/scene/ridge/stars.ts @@ -0,0 +1,249 @@ +// The Midnight starfield: placed once from a seeded PRNG and baked once into the sky canvas. A +// rolling window of them twinkles on an overlay canvas: SLOTS slots, each running back-to-back +// twinkles of one star at a time, so the active set is always SLOTS stars and every star gets its turn. +// The schedule is a pure function of (seed, time): no state accumulates and no Math.random runs +// after the field is built, so any instant maps straight to the active set and its brightnesses. + +/* eslint-disable no-bitwise -- the seeded PRNG and hash are 32-bit integer arithmetic */ +import type { SkyColours, Srgb } from './skyColour'; + +/** + * Stars show when the sky behind them is darker than this sRGB luma (0..255). The ridge scene has + * no night flag (the sky theme's Midnight/Noonday is a body class chosen by the app, not seen here), + * so night is the sky's own darkness: a star's alpha is 1 - luma/NIGHT_LUMA at its height in the + * gradient, and a sky whose zenith is lighter than this gets no stars at all. + */ +export const NIGHT_LUMA = 110; +/** The sky gradient runs from the top (0) through mid (0.5) to the horizon glow (0.78 and below). */ +export const SKY_STOPS = { mid: 0.5, horizon: 0.78 }; +export const MAX_STARS = 400; +/** Twinkling stars at any instant (fewer only if the field has fewer stars). */ +export const SLOTS = 32; +export const TWINKLE_PERIOD = { min: 2, max: 7 } as const; +/** Gain at the dimmest and brightest swing: dimming goes deeper than brightening. */ +export const TWINKLE_GAIN = { dim: 0.35, bright: 1.15 } as const; +const SEED = 0x57a45eed; + +export interface Star { + /** Position as fractions of the sky canvas width and height. */ + x: number; + y: number; + /** Radius in CSS px. */ + r: number; + /** Base alpha 0..0.9 (brightness times how dark the sky is there). */ + alpha: number; + /** CSS colour, white tinted blue or warm. */ + fill: string; + /** The sky gradient's colour at this height: dimming paints it over the baked star. */ + cover: string; +} + +const luma = (c: Srgb) => 0.2126 * c[0] + 0.7152 * c[1] + 0.0722 * c[2]; +const lerp = (a: number, b: number, t: number) => a + (b - a) * t; + +/** The baked gradient's colour at fraction t of the canvas height (the canvas interpolates in sRGB). */ +function skyAt(sky: SkyColours, t: number): Srgb { + const mix = (a: Srgb, b: Srgb, k: number): Srgb => [ + Math.round(lerp(a[0], b[0], k)), + Math.round(lerp(a[1], b[1], k)), + Math.round(lerp(a[2], b[2], k)), + ]; + if (t <= SKY_STOPS.mid) return mix(sky.top, sky.mid, t / SKY_STOPS.mid); + if (t <= SKY_STOPS.horizon) + return mix(sky.mid, sky.horizon, (t - SKY_STOPS.mid) / (SKY_STOPS.horizon - SKY_STOPS.mid)); + return sky.horizon; +} + +export const skyLuma = (sky: SkyColours, t: number): number => luma(skyAt(sky, t)); +export const isNight = (sky: SkyColours): boolean => luma(sky.top) < NIGHT_LUMA; + +/** mulberry32: 32-bit seeded PRNG, one float in [0, 1) per call. */ +function prng(seed: number) { + let a = seed >>> 0; + return () => { + a = (a + 0x6d2b79f5) >>> 0; + let t = a; + t = Math.imul(t ^ (t >>> 15), t | 1); + t ^= t + Math.imul(t ^ (t >>> 7), t | 61); + return ((t ^ (t >>> 14)) >>> 0) / 4294967296; + }; +} + +/** Stateless seeded hash of up to three integers to [0, 1). */ +export function hash(a: number, b = 0, c = 0): number { + let h = Math.imul(a | 0, 0x9e3779b1) ^ SEED; + h = Math.imul(h ^ (h >>> 15) ^ Math.imul(b | 0, 0x85ebca6b), 0xc2b2ae35); + h = Math.imul(h ^ (h >>> 13) ^ Math.imul(c | 0, 0x27d4eb2f), 0x165667b1); + h ^= h >>> 16; + return (h >>> 0) / 4294967296; +} + +/** How many stars a viewport carries: about one per 1100 CSS px squared, 150..MAX_STARS. */ +export const starCount = (cssW: number, cssH: number): number => + Math.min(MAX_STARS, Math.max(150, Math.round((cssW * cssH) / 1100))); + +/** + * Seeded placement. Each candidate draws all its random numbers whether it is kept or not, so a + * given seed and sky always give the same field and the prefix does not shift with the count. + * Heights are squeezed toward the zenith (y = 0.78 u^1.7) and alpha falls with the sky's luma, so + * the stars thin out and fade into the horizon glow. None for a day sky. + */ +export function makeStars(sky: SkyColours, cssW: number, cssH: number): Star[] { + if (!isNight(sky)) return []; + const rnd = prng(SEED); + const n = starCount(cssW, cssH); + // Every candidate draws all its numbers, kept or not, so the prefix is stable. + const candidates = Array.from({ length: MAX_STARS }, () => ({ + x: rnd(), + y: SKY_STOPS.horizon * rnd() ** 1.7, + r: 0.35 + 1.0 * rnd() ** 4, + bright: 0.35 + 0.65 * rnd() ** 1.5, + tint: rnd(), + })).slice(0, n); + return candidates.flatMap(({ x, y, r, bright, tint }) => { + const alpha = Math.min(0.9, bright * Math.max(0, 1 - skyLuma(sky, y) / NIGHT_LUMA)); + if (alpha < 0.05) return []; + // White, pulled toward blue or toward warm by the tint draw. + const to: Srgb = tint < 0.5 ? [165, 195, 255] : [255, 222, 185]; + const k = 0.55 * Math.abs(tint - 0.5) * 2; + const c = [255, 255, 255].map((v, j) => Math.round(lerp(v, to[j], k))); + const s = skyAt(sky, y); + return [ + { + x, + y, + r, + alpha, + fill: `rgb(${c[0]},${c[1]},${c[2]})`, + cover: `rgb(${s[0]},${s[1]},${s[2]})`, + }, + ]; + }); +} + +// ---- The schedule --------------------------------------------------------------------------- + +export const slotCount = (stars: number): number => Math.min(SLOTS, stars); +/** A slot's twinkle period in seconds: its own, in TWINKLE_PERIOD. */ +export const slotPeriod = (j: number): number => + TWINKLE_PERIOD.min + (TWINKLE_PERIOD.max - TWINKLE_PERIOD.min) * hash(j, 1); +/** A slot's phase: seconds into its first cycle at t = 0. */ +export const slotOffset = (j: number): number => hash(j, 2) * slotPeriod(j); + +/** Stars in slot j are those with index = j (mod slots), `m` of them; no star is in two slots. */ +const partitionSize = (stars: number, slots: number, j: number): number => + Math.floor((stars - 1 - j) / slots) + 1; + +/** The k-th star slot j twinkles: epochs of a seeded shuffle of its partition, never repeating across the seam. */ +function partitionPick(stars: number, slots: number, j: number, k: number): number { + const m = partitionSize(stars, slots, j); + const shuffled = (e: number) => { + const order = Array.from({ length: m }, (_, q) => q).sort( + (a, b) => hash(j, e, a + 10) - hash(j, e, b + 10) || a - b + ); + return order; + }; + const e = Math.floor(k / m); + const order = shuffled(e); + if (m > 1 && order[0] === shuffled(e - 1)[m - 1]) [order[0], order[1]] = [order[1], order[0]]; + return j + slots * order[k - e * m]; +} + +/** + * Brightness multiplier at fraction u of one twinkle (0..1): exactly 1 at both ends, so a star + * joins and leaves at its base brightness. One swing, a little unrelated shimmer, and the + * asymmetric map below: dimming goes to TWINKLE_GAIN.dim, brightening only to .bright. + */ +export function twinkleGain( + u: number, + seed: { flip: boolean; ripple: number; phase: number } +): number { + if (u <= 0 || u >= 1) return 1; + const main = Math.sin(2 * Math.PI * u) * (seed.flip ? -1 : 1); + const shimmer = Math.sin(2 * Math.PI * seed.ripple * u + seed.phase) * Math.sin(Math.PI * u); + const s = Math.max(-1, Math.min(1, 0.85 * main + 0.15 * shimmer)); + return s >= 0 ? 1 + (TWINKLE_GAIN.bright - 1) * s : 1 + (1 - TWINKLE_GAIN.dim) * s; +} + +export interface Twinkling { + slot: number; + star: number; + /** Seconds since this twinkle started, and its length. */ + start: number; + period: number; + gain: number; +} + +/** The active set at time `t` seconds for a field of `stars` stars, in slot order. */ +export function activeAt(stars: number, t: number): Twinkling[] { + const slots = slotCount(stars); + return Array.from({ length: slots }, (_, j) => { + const period = slotPeriod(j); + const off = slotOffset(j); + const k = Math.floor((t - off) / period); + const start = off + k * period; + const seed = { + flip: hash(j, k, 3) < 0.5, + ripple: 2 + Math.floor(hash(j, k, 4) * 2), + phase: 2 * Math.PI * hash(j, k, 5), + }; + return { + slot: j, + star: partitionPick(stars, slots, j, k), + start, + period, + gain: twinkleGain((t - start) / period, seed), + }; + }); +} + +// ---- Drawing -------------------------------------------------------------------------------- + +/** Bake `stars` into `ctx` (canvas `w` x `h` device px, `scale` device px per CSS px) at base alpha. */ +export function drawStars( + ctx: CanvasRenderingContext2D, + stars: readonly Star[], + w: number, + h: number, + scale: number +) { + stars.forEach((s) => { + ctx.globalAlpha = s.alpha; + ctx.fillStyle = s.fill; + ctx.beginPath(); + ctx.arc(s.x * w, s.y * h, s.r * scale, 0, 2 * Math.PI); + ctx.fill(); + }); + ctx.globalAlpha = 1; +} + +/** + * The overlay pass: clear, then for each active star whose gain is off base, paint over the baked + * star. Dimming covers it with the sky's own colour at (1 - gain), which leaves exactly + * alpha * gain of the star; brightening adds a second star on top. A star at base draws nothing. + */ +export function drawTwinkle( + ctx: CanvasRenderingContext2D, + stars: readonly Star[], + active: readonly Twinkling[], + w: number, + h: number, + scale: number +) { + ctx.clearRect(0, 0, w, h); + active.forEach((a) => { + const s = stars[a.star]; + if (!s || Math.abs(a.gain - 1) < 0.01) return; + if (a.gain < 1) { + ctx.globalAlpha = 1 - a.gain; + ctx.fillStyle = s.cover; + } else { + ctx.globalAlpha = Math.min(1, ((a.gain - 1) * s.alpha) / (1 - s.alpha)); + ctx.fillStyle = s.fill; + } + ctx.beginPath(); + ctx.arc(s.x * w, s.y * h, s.r * scale + (a.gain < 1 ? 1 : 0), 0, 2 * Math.PI); + ctx.fill(); + }); + ctx.globalAlpha = 1; +} From 27d5bbaec5180fd0818b67449f6210ffce0b2657 Mon Sep 17 00:00:00 2001 From: Void Date: Sat, 7 Nov 2026 18:33:35 +0000 Subject: [PATCH 005/248] ci: point the artifact uploader at the forge subpath Run 170: CreateArtifact got an nginx 404 page; /twirp 404s at the host root and answers (401 without a token) at /forge/twirp. Try the results URL with the subpath. Co-Authored-By: Claude Sonnet 5.5 --- .github/workflows/rat-dev-preview.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/rat-dev-preview.yml b/.github/workflows/rat-dev-preview.yml index 7f0d0b6a..f003c2f7 100644 --- a/.github/workflows/rat-dev-preview.yml +++ b/.github/workflows/rat-dev-preview.yml @@ -29,6 +29,8 @@ jobs: - name: Upload artifact # Forgejo's fork: upstream upload-artifact v4+ refuses non-GitHub servers (GHESNotSupportedError). uses: forgejo/upload-artifact@v4 + env: + ACTIONS_RESULTS_URL: https://eureka.gamecult.org/forge/ with: name: rat-dev-dist path: dist From 077737830e3363b79cb6467f5827a3479bc03c54 Mon Sep 17 00:00:00 2001 From: Nibu Date: Sat, 7 Nov 2026 18:36:18 +0000 Subject: [PATCH 006/248] scene: baked sky numbers and lighting/haze maths for a terrain tier Vendors the small set the terrain needs from Void's baked sky (PR #22, 7b4aa2f): sun elevation, the 7-stop gradient, sun.js light().direct, plus a sun azimuth computed from the same series (not in the bake). Lambert from the sun, ambient from the gradient zenith, exp(-k d) haze toward the gradient's horizon stop; a sun below the horizon lights nothing. Pure functions, no GL. Co-Authored-By: Claude Sonnet 5.5 --- src/app/features/scene/terrain/skyData.ts | 44 ++++++ .../features/scene/terrain/terrainSky.test.ts | 138 ++++++++++++++++++ src/app/features/scene/terrain/terrainSky.ts | 82 +++++++++++ 3 files changed, 264 insertions(+) create mode 100644 src/app/features/scene/terrain/skyData.ts create mode 100644 src/app/features/scene/terrain/terrainSky.test.ts create mode 100644 src/app/features/scene/terrain/terrainSky.ts diff --git a/src/app/features/scene/terrain/skyData.ts b/src/app/features/scene/terrain/skyData.ts new file mode 100644 index 00000000..2b75f405 --- /dev/null +++ b/src/app/features/scene/terrain/skyData.ts @@ -0,0 +1,44 @@ +// The sky numbers the terrain scene lights and hazes with, vendored from Void's baked sky (GameCult/Void +// PR #22, branch void/sky-tokens, revision 7b4aa2f): `src/sky/baked.ts` (generated by scripts/bake-sky.mjs +// from src/sky/sun.js and src/sky/skyTokens.js) and `light()` in `src/sky/sun.js`. Both moments are +// 2026-09-22 at lat 45, lon 0. +// +// elevation, gradient copied from baked.ts (`baked.midnight` / `baked.noonday`). +// direct `light({time, lat, lon}).direct` from sun.js at that moment: sun colour at normal +// incidence, linear RGB, clear zenith sun ~ 1. baked.ts does not carry it. +// azimuth NOT in #22. Computed here from the same NOAA/Meeus series sun.js uses for the +// elevation (hour angle and declination), degrees clockwise from north. It is the +// one number in this file Void's bake does not produce; see the report on the table shape. +// +// These are copies, not a link: #22 is not in this tree, so nothing fails if Void re-bakes. When #22 lands, +// replace this module's literals with an import of `baked` (plus the fields above, if the bake adds them) and +// keep the exports. + +export type SkyName = 'midnight' | 'noonday'; +export type Vec3 = readonly [number, number, number]; + +export interface SkyData { + /** Degrees above the horizon, no refraction. Negative: the sun is down. */ + elevation: number; + /** Degrees clockwise from north. */ + azimuth: number; + /** Sun colour at normal incidence, linear RGB. Black when the sun is down. */ + direct: Vec3; + /** Seven sRGB hex stops, zenith first, horizon last. */ + gradient: readonly string[]; +} + +export const SKY: Record = { + midnight: { + elevation: -44.579021600011224, + azimuth: 2.4988773054640205, + direct: [0, 0, 0], + gradient: ['#37446a', '#38456a', '#3b4669', '#3d4868', '#414a67', '#444c66', '#484e64'], + }, + noonday: { + elevation: 45.16994813502928, + azimuth: 182.58737070473097, + direct: [0.9189659216820631, 0.8444983652129638, 0.6933684802959983], + gradient: ['#95c6ff', '#9ac9ff', '#a5cfff', '#b3d6ff', '#c2dfff', '#d2e9ff', '#e2f4ff'], + }, +}; diff --git a/src/app/features/scene/terrain/terrainSky.test.ts b/src/app/features/scene/terrain/terrainSky.test.ts new file mode 100644 index 00000000..44b77f36 --- /dev/null +++ b/src/app/features/scene/terrain/terrainSky.test.ts @@ -0,0 +1,138 @@ +/* eslint-disable no-restricted-syntax -- tests loop over skies, normals and distances */ +import { describe, expect, it } from 'vitest'; +import { SKY } from './skyData'; +import { + ambientColour, + hazeColour, + hexToLinear, + shade, + skyNameFor, + sunColour, + sunDirection, + transmittance, +} from './terrainSky'; +import { skyColours } from '../ridge/skyColour'; + +const UP = [0, 1, 0] as const; +const luma = (c: readonly number[]) => 0.2126 * c[0] + 0.7152 * c[1] + 0.0722 * c[2]; + +describe('baked sky numbers', () => { + it('keep the two moments apart: night sun below the horizon, noon sun well above', () => { + expect(SKY.midnight.elevation).toBeLessThan(0); + expect(SKY.noonday.elevation).toBeGreaterThan(30); + expect(SKY.midnight.gradient).toHaveLength(7); + expect(SKY.noonday.gradient).toHaveLength(7); + }); + + it('sunDirection is a unit vector with y = sin(elevation), north at -z, south at +z', () => { + for (const d of Object.values(SKY)) { + const s = sunDirection(d); + expect(Math.hypot(...s)).toBeCloseTo(1, 9); + expect(s[1]).toBeCloseTo(Math.sin((d.elevation * Math.PI) / 180), 9); + } + expect(sunDirection({ ...SKY.noonday, elevation: 0, azimuth: 0 })[2]).toBeCloseTo(-1, 9); + expect(sunDirection({ ...SKY.noonday, elevation: 0, azimuth: 180 })[2]).toBeCloseTo(1, 9); + }); + + it('hexToLinear decodes sRGB', () => { + expect(hexToLinear('#000000')).toEqual([0, 0, 0]); + expect(hexToLinear('#ffffff')).toEqual([1, 1, 1]); + expect(hexToLinear('#808080')[0]).toBeCloseTo(0.2158, 3); + }); + + it('the default sky from skyColours() is a night one, as the stars see it', () => { + expect(skyNameFor(skyColours())).toBe('midnight'); + expect(skyNameFor({ ...skyColours(), top: [150, 198, 255] })).toBe('noonday'); + }); +}); + +describe('lighting', () => { + it('noonday lights an upward face with the sun; midnight has none', () => { + expect(luma(sunColour(SKY.noonday))).toBeGreaterThan(0.5); + expect(sunColour(SKY.midnight)).toEqual([0, 0, 0]); + }); + + it('a sun below the horizon gives no negative or sun light on any normal, even with a lit colour', () => { + const forcedDown = { ...SKY.noonday, elevation: -30 }; + expect(sunColour(forcedDown)).toEqual([0, 0, 0]); + for (const n of [UP, [1, 0, 0], [0, -1, 0], [0, 0.6, -0.8]] as const) { + const c = shade(forcedDown, [1, 1, 1], n, 0); + for (const ch of c) expect(ch).toBeGreaterThanOrEqual(0); + } + }); + + it('the sun fades out through the horizon instead of switching', () => { + const at = (elevation: number) => luma(sunColour({ ...SKY.noonday, elevation })); + expect(at(-2)).toBe(0); + expect(at(0.3)).toBeGreaterThan(0); + expect(at(0.3)).toBeLessThan(at(1.5)); + expect(at(1.5)).toBeCloseTo(at(60), 9); + }); + + it('shade never goes negative on any normal at either sky, at any distance', () => { + for (const d of Object.values(SKY)) + for (const n of [UP, [0, -1, 0], [1, 0, 0], [-0.6, 0.0, 0.8]] as const) + for (const dist of [0, 100, 5000]) + for (const ch of shade(d, [0.3, 0.3, 0.3], n, dist)) expect(ch).toBeGreaterThanOrEqual(0); + }); + + it('a face turned to the noon sun is brighter than one turned away; at midnight the two match to ambient', () => { + const toSun = sunDirection(SKY.noonday); + const away = [-toSun[0], 0, -toSun[2]] as const; + const lit = luma(shade(SKY.noonday, [0.5, 0.5, 0.5], toSun, 0)); + const dark = luma(shade(SKY.noonday, [0.5, 0.5, 0.5], away, 0)); + expect(lit).toBeGreaterThan(3 * dark); + const m = (n: readonly [number, number, number]) => shade(SKY.midnight, [0.5, 0.5, 0.5], n, 0); + expect(luma(m(UP))).toBeGreaterThan(0); // moonlit fill, not black + expect(luma(m(UP))).toBeLessThan(0.05); + }); + + it('noon is much brighter than midnight, ambient included', () => { + expect(luma(ambientColour(SKY.noonday))).toBeGreaterThan(2 * luma(ambientColour(SKY.midnight))); + expect(luma(shade(SKY.noonday, [0.4, 0.4, 0.4], UP, 0))).toBeGreaterThan( + 10 * luma(shade(SKY.midnight, [0.4, 0.4, 0.4], UP, 0)) + ); + }); + + it('noon ambient matches sun.js diffuse at that moment to within a few percent (the gain)', () => { + const a = ambientColour(SKY.noonday); + const diffuse = [0.07, 0.132, 0.27]; // light() at 2026-09-22T12:00Z, 45N 0E, revision 7b4aa2f + for (let i = 0; i < 3; i += 1) expect(a[i] / diffuse[i]).toBeGreaterThan(0.85); + for (let i = 0; i < 3; i += 1) expect(a[i] / diffuse[i]).toBeLessThan(1.2); + }); +}); + +describe('haze', () => { + it('transmittance falls monotonically from 1 toward 0', () => { + let prev = transmittance(0); + expect(prev).toBe(1); + for (const d of [10, 100, 400, 1000, 3000, 8000]) { + const t = transmittance(d); + expect(t).toBeLessThan(prev); + expect(t).toBeGreaterThan(0); + prev = t; + } + }); + + it('far surfaces take the horizon colour of the baked gradient, at both skies', () => { + for (const d of Object.values(SKY)) { + const far = shade(d, [0.9, 0.2, 0.1], UP, 100000); + const h = hazeColour(d); + for (let i = 0; i < 3; i += 1) expect(far[i]).toBeCloseTo(h[i], 6); + } + expect(hazeColour(SKY.noonday)).toEqual(hexToLinear('#e2f4ff')); + expect(hazeColour(SKY.midnight)).toEqual(hexToLinear('#484e64')); + }); + + it('haze colour differs between the two skies: pale day horizon, dim night one', () => { + expect(luma(hazeColour(SKY.noonday))).toBeGreaterThan(5 * luma(hazeColour(SKY.midnight))); + }); + + it('with distance a dark surface rises toward the haze and a bright one falls toward it', () => { + const d = SKY.noonday; + const h = luma(hazeColour(d)); + const dark = (x: number) => luma(shade(d, [0.02, 0.02, 0.02], UP, x)); + expect(dark(2000)).toBeGreaterThan(dark(200)); + expect(dark(2000)).toBeLessThan(h); + }); +}); diff --git a/src/app/features/scene/terrain/terrainSky.ts b/src/app/features/scene/terrain/terrainSky.ts new file mode 100644 index 00000000..8f255206 --- /dev/null +++ b/src/app/features/scene/terrain/terrainSky.ts @@ -0,0 +1,82 @@ +// Lighting and haze for the terrain scene, as pure functions of one sky's baked numbers (./skyData.ts). +// No DOM, no GL. The fragment shader does the same arithmetic with these results as uniforms. +import { isNight } from '../ridge/stars'; +import type { SkyColours } from '../ridge/skyColour'; +import { SKY, SkyData, SkyName, Vec3 } from './skyData'; + +const RAD = Math.PI / 180; +const clamp01 = (x: number) => Math.min(1, Math.max(0, x)); +const smooth = (a: number, b: number, x: number) => { + const t = clamp01((x - a) / (b - a)); + return t * t * (3 - 2 * t); +}; + +/** Which baked sky a ridge-style `SkyColours` means: the night notion the stars use (`isNight`). */ +export const skyNameFor = (sky: SkyColours): SkyName => (isNight(sky) ? 'midnight' : 'noonday'); + +export const isSkyName = (s: unknown): s is SkyName => s === 'midnight' || s === 'noonday'; + +/** sRGB hex `#rrggbb` to linear RGB 0..1. */ +export function hexToLinear(hex: string): Vec3 { + const ch = (at: number) => { + const s = parseInt(hex.slice(at, at + 2), 16) / 255; + return s <= 0.04045 ? s / 12.92 : ((s + 0.055) / 1.055) ** 2.4; + }; + return [ch(1), ch(3), ch(5)]; +} + +/** Unit vector toward the sun: x east, y up, z south (so azimuth 0, north, is -z). */ +export function sunDirection(d: SkyData): Vec3 { + const el = d.elevation * RAD; + const az = d.azimuth * RAD; + return [Math.sin(az) * Math.cos(el), Math.sin(el), -Math.cos(az) * Math.cos(el)]; +} + +/** + * The sun's colour as the ground sees it: baked `direct`, off at the horizon the way sun.js fades the disc + * (gone at -0.83 degrees, soft to 1.5). A sun below the horizon lights nothing. + */ +export function sunColour(d: SkyData): Vec3 { + const k = smooth(-0.83, 1.5, d.elevation); + return [d.direct[0] * k, d.direct[1] * k, d.direct[2] * k]; +} + +/** + * Ambient light on an upward surface, from the baked gradient's zenith stop. The gain is chosen so the + * noonday value (0.075, 0.14, 0.25) matches sun.js's own `diffuse` there (0.07, 0.13, 0.27); at midnight + * the same gain turns the gradient's glow into a faint moonlit fill, where `diffuse` alone would be black. + */ +export const AMBIENT_GAIN = 0.25; +export function ambientColour(d: SkyData): Vec3 { + const z = hexToLinear(d.gradient[0]); + return [z[0] * AMBIENT_GAIN, z[1] * AMBIENT_GAIN, z[2] * AMBIENT_GAIN]; +} + +/** The colour distance fades to: the gradient's horizon stop, linear. */ +export const hazeColour = (d: SkyData): Vec3 => hexToLinear(d.gradient[d.gradient.length - 1]); + +/** Haze: transmittance T = exp(-k d) at distance d metres. */ +export const HAZE_K = 0.0012; +export const transmittance = (distance: number): number => + Math.exp(-HAZE_K * Math.max(0, distance)); + +/** + * Linear colour of a surface: lambert from the sun plus ambient (full on an upward face, half on a + * vertical one, none on a downward one: `0.5 + 0.5 n.y`), then hazed toward the horizon colour by distance. + * `normal` is a unit vector. Never negative, whatever the sun does. + */ +export function shade(d: SkyData, albedo: Vec3, normal: Vec3, distance: number): Vec3 { + const sun = sunDirection(d); + const lambert = Math.max(0, normal[0] * sun[0] + normal[1] * sun[1] + normal[2] * sun[2]); + const direct = sunColour(d); + const amb = ambientColour(d); + const hemi = 0.5 + 0.5 * normal[1]; + const haze = hazeColour(d); + const t = transmittance(distance); + return [0, 1, 2].map((i) => { + const lit = albedo[i] * (direct[i] * lambert + amb[i] * Math.max(0, hemi)); + return lit * t + haze[i] * (1 - t); + }) as unknown as Vec3; +} + +export const skyData = (name: SkyName): SkyData => SKY[name]; From 5642acf2f9ea10097c92a7dbda518231592ad1ab Mon Sep 17 00:00:00 2001 From: Nibu Date: Sat, 7 Nov 2026 18:36:18 +0000 Subject: [PATCH 007/248] scene: terrain style, a baked Phacelle height map on a displaced grid lit by the baked sky style 'terrain' (WebGL2, tier-gated, dynamic import): height map baked once on the GPU into RGBA8 (promoted from the terrain-tier-spike), a displaced grid, the baked gradient as sky, baked sun/ambient/haze. Sky from option, ?sky=, or the stars' night notion. Cadence guard, pauses, context loss and compile failure follow the ridge scene. preview-config.js takes an optional style argument. Co-Authored-By: Claude Sonnet 5.5 --- scripts/preview-config.js | 7 +- src/app/features/scene/index.ts | 10 +- .../features/scene/terrain/Terrain.test.ts | 235 ++++++++++++ src/app/features/scene/terrain/Terrain.ts | 359 ++++++++++++++++++ .../features/scene/terrain/terrainShaders.ts | 146 +++++++ .../scene/terrain/terrainWorld.test.ts | 81 ++++ .../features/scene/terrain/terrainWorld.ts | 126 ++++++ src/app/features/scene/tier.ts | 7 +- 8 files changed, 961 insertions(+), 10 deletions(-) create mode 100644 src/app/features/scene/terrain/Terrain.test.ts create mode 100644 src/app/features/scene/terrain/Terrain.ts create mode 100644 src/app/features/scene/terrain/terrainShaders.ts create mode 100644 src/app/features/scene/terrain/terrainWorld.test.ts create mode 100644 src/app/features/scene/terrain/terrainWorld.ts diff --git a/scripts/preview-config.js b/scripts/preview-config.js index 589f8efa..75746f98 100644 --- a/scripts/preview-config.js +++ b/scripts/preview-config.js @@ -1,12 +1,13 @@ // Preview builds: set the background scene tier in dist/config.json (default 'low'); config.json -// in the repo stays 'off'. Usage: node scripts/preview-config.js [tier] +// in the repo stays 'off'. Usage: node scripts/preview-config.js [tier] [style] import fs from 'fs'; import path from 'path'; import { fileURLToPath } from 'url'; const tier = process.argv[2] ?? 'low'; +const style = process.argv[3]; const file = path.join(path.dirname(fileURLToPath(import.meta.url)), '..', 'dist', 'config.json'); const config = JSON.parse(fs.readFileSync(file, 'utf8')); -config.backgroundScene = { ...config.backgroundScene, tier }; +config.backgroundScene = { ...config.backgroundScene, tier, ...(style ? { style } : {}) }; fs.writeFileSync(file, `${JSON.stringify(config, null, 2)}\n`); -console.log(`${file}: backgroundScene.tier = ${tier}`); +console.log(`${file}: backgroundScene.tier = ${tier}${style ? `, style = ${style}` : ''}`); diff --git a/src/app/features/scene/index.ts b/src/app/features/scene/index.ts index a5b2de7d..c324b2d5 100644 --- a/src/app/features/scene/index.ts +++ b/src/app/features/scene/index.ts @@ -12,7 +12,7 @@ export type StartOptions = Omit Scene | null; try { - createScene = - config?.style === 'raymarch' - ? (await import('./Scene')).createScene - : (await import('./ridge/Ridge')).createRidgeScene; + if (config?.style === 'raymarch') createScene = (await import('./Scene')).createScene; + else if (config?.style === 'terrain') + createScene = (await import('./terrain/Terrain')).createTerrainScene; + else createScene = (await import('./ridge/Ridge')).createRidgeScene; } catch (e) { options.onCompileFail?.(e instanceof Error ? e : new Error(String(e))); return null; diff --git a/src/app/features/scene/terrain/Terrain.test.ts b/src/app/features/scene/terrain/Terrain.test.ts new file mode 100644 index 00000000..8338721e --- /dev/null +++ b/src/app/features/scene/terrain/Terrain.test.ts @@ -0,0 +1,235 @@ +/* eslint-disable @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion, @typescript-eslint/no-empty-function -- fake GL and DOM stubs, as the other scene tests */ +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; +import { createTerrainScene } from './Terrain'; +import { GRID, triangleCount } from './terrainWorld'; +import { SKY } from './skyData'; +import { ambientColour } from './terrainSky'; +import { startBackgroundScene } from '../index'; + +/** A GL context that accepts every call, remembers them, reports success for compile, link and framebuffer. */ +function fakeGl(over: Record = {}) { + const calls: Record = {}; + const gl: any = new Proxy( + {}, + { + get(_t, name: string) { + if (name in over) return over[name]; + if (name === 'getShaderParameter' || name === 'getProgramParameter') return () => true; + if (name === 'getAttribLocation' || name === 'getUniformLocation') return () => 1; + if (name === 'checkFramebufferStatus') return () => 1; + if (name === 'getParameter') return () => 16; + if (/^[A-Z_0-9]+$/.test(name)) return 1; + return (...args: unknown[]) => { + (calls[name] ??= []).push(args); + return {}; + }; + }, + } + ); + return { gl, calls }; +} + +let rafQueue: Array<(t: number) => void>; +let visibility: string; +let search: string; +beforeEach(() => { + rafQueue = []; + visibility = 'visible'; + search = ''; + vi.stubGlobal('document', { + addEventListener: vi.fn(), + removeEventListener: vi.fn(), + get visibilityState() { + return visibility; + }, + createElement: () => ({ style: {}, remove() {} }), + }); + vi.stubGlobal('window', { + devicePixelRatio: 1, + innerWidth: 400, + innerHeight: 800, + matchMedia: () => ({ matches: false, addEventListener() {}, removeEventListener() {} }), + addEventListener: vi.fn(), + removeEventListener: vi.fn(), + get location() { + return { search }; + }, + setTimeout, + }); + vi.stubGlobal('performance', { now: () => 0 }); + vi.stubGlobal('requestAnimationFrame', (cb: (t: number) => void) => rafQueue.push(cb)); + vi.stubGlobal('cancelAnimationFrame', () => { + rafQueue = []; + }); +}); +afterEach(() => { + vi.unstubAllGlobals(); +}); + +function canvasWith(gl: unknown) { + return { + width: 0, + height: 0, + clientWidth: 400, + clientHeight: 800, + parentElement: { appendChild: vi.fn() }, + getContext: vi.fn(() => gl), + addEventListener: vi.fn(), + removeEventListener: vi.fn(), + } as any; +} + +describe('createTerrainScene', () => { + it("returns null at tier 'off' and touches nothing", () => { + const canvas = canvasWith(null); + expect(createTerrainScene({ canvas, tier: 'off' })).toBeNull(); + expect(canvas.getContext).not.toHaveBeenCalled(); + }); + + it('returns null without WebGL2, so the host keeps its CSS ground', () => { + const canvas = canvasWith(null); + expect(createTerrainScene({ canvas, tier: 'full' })).toBeNull(); + expect(canvas.getContext).toHaveBeenCalledWith('webgl2', expect.anything()); + }); + + it('returns null with no vertex texture units, or an incomplete bake target', () => { + expect( + createTerrainScene({ canvas: canvasWith(fakeGl({ getParameter: () => 0 }).gl), tier: 'full' }) + ).toBeNull(); + const { gl, calls } = fakeGl({ checkFramebufferStatus: () => 0 }); + expect(createTerrainScene({ canvas: canvasWith(gl), tier: 'full' })).toBeNull(); + expect(calls.deleteProgram).toHaveLength(3); + }); + + it('reports a shader that does not compile to onCompileFail and returns null', () => { + const { gl } = fakeGl({ getShaderParameter: () => false, getShaderInfoLog: () => 'bad' }); + const onCompileFail = vi.fn(); + expect(createTerrainScene({ canvas: canvasWith(gl), tier: 'full', onCompileFail })).toBeNull(); + expect(onCompileFail).toHaveBeenCalledOnce(); + expect(onCompileFail.mock.calls[0][0].log).toContain('terrain height'); + }); + + it('bakes the height map once, then draws sky and grid each frame and keeps turning', () => { + const { gl, calls } = fakeGl(); + const scene = createTerrainScene({ canvas: canvasWith(gl), tier: 'low' })!; + expect(scene).not.toBeNull(); + const bakes = calls.drawArrays.length; + expect(bakes).toBe(1); + rafQueue.shift()!(16); + rafQueue.shift()!(32); + expect(calls.drawArrays).toHaveLength(bakes + 2); // one sky draw per frame + expect(calls.drawElements).toHaveLength(2); + expect(calls.drawElements[0][1]).toBe(triangleCount(GRID.low.grid) * 3); + expect(calls.texImage2D).toHaveLength(1); // the baked map is never re-uploaded + expect(rafQueue).toHaveLength(1); + scene.dispose(); + }); + + it("'still' draws one frame and queues nothing", () => { + const { gl, calls } = fakeGl(); + const scene = createTerrainScene({ canvas: canvasWith(gl), tier: 'still' })!; + expect(calls.drawElements).toHaveLength(1); + expect(rafQueue).toHaveLength(0); + scene.dispose(); + }); + + it('lights with the sky chosen: option, then ?sky=, then the night default', () => { + const ambientUploaded = (opts: { sky?: 'midnight' | 'noonday' }) => { + const { gl, calls } = fakeGl(); + createTerrainScene({ canvas: canvasWith(gl), tier: 'still', ...opts })!.dispose(); + const hit = calls.uniform3fv.filter((a) => (a[1] as ArrayLike).length === 3); + // uniform3fv order in draw(): right, up, forward, then sun, sunColour, ambient, haze (+ camera) + return hit.map((a) => Array.from(a[1] as ArrayLike)); + }; + const night = ambientUploaded({}); + const day = ambientUploaded({ sky: 'noonday' }); + const nightA = Array.from(ambientColour(SKY.midnight)); + const dayA = Array.from(ambientColour(SKY.noonday)); + const has = (all: number[][], v: number[]) => + all.some((a) => a.every((x, i) => Math.abs(x - v[i]) < 1e-6)); + expect(has(night, nightA)).toBe(true); + expect(has(night, dayA)).toBe(false); + expect(has(day, dayA)).toBe(true); + search = '?sky=noonday'; + expect(has(ambientUploaded({}), dayA)).toBe(true); + search = '?sky=garbage'; + expect(has(ambientUploaded({}), nightA)).toBe(true); + }); + + it('falls back to a still frame when the measured p95 is over 33 ms', () => { + const { gl, calls } = fakeGl(); + const onProbe = vi.fn(); + const scene = createTerrainScene({ canvas: canvasWith(gl), tier: 'full', onProbe })!; + let t = 0; + for (let i = 0; i < 400 && rafQueue.length; i += 1) rafQueue.shift()!((t += 50)); + expect(rafQueue).toHaveLength(0); + expect(onProbe).toHaveBeenLastCalledWith(expect.objectContaining({ still: true })); + expect(calls.drawElements.length).toBeLessThan(400); + scene.dispose(); + }); + + it('does not draw while the tab is hidden, or under reduced motion', () => { + const { gl, calls } = fakeGl(); + const scene = createTerrainScene({ canvas: canvasWith(gl), tier: 'full' })!; + const before = (calls.drawElements ?? []).length; + visibility = 'hidden'; + rafQueue.shift()!(16); + expect((calls.drawElements ?? []).length).toBe(before); + scene.dispose(); + vi.stubGlobal('window', { + ...(window as object), + matchMedia: () => ({ matches: true, addEventListener() {}, removeEventListener() {} }), + }); + visibility = 'visible'; + const g2 = fakeGl(); + const still = createTerrainScene({ canvas: canvasWith(g2.gl), tier: 'full' })!; + expect(rafQueue).toHaveLength(0); + expect(g2.calls.drawElements).toHaveLength(1); // one frame, then still + still.dispose(); + }); + + it('a lost context stops the scene and tells the host', () => { + const { gl, calls } = fakeGl(); + const canvas = canvasWith(gl); + const onContextLost = vi.fn(); + createTerrainScene({ canvas, tier: 'full', onContextLost })!; + const handler = canvas.addEventListener.mock.calls.find( + (c: unknown[]) => c[0] === 'webglcontextlost' + )[1]; + handler({ preventDefault() {} }); + expect(onContextLost).toHaveBeenCalledOnce(); + const n = (calls.drawElements ?? []).length; + rafQueue.splice(0).forEach((f) => f(16)); + expect((calls.drawElements ?? []).length).toBe(n); + }); + + it('dispose frees its programs, buffers and texture and queues nothing more', () => { + const { gl, calls } = fakeGl(); + createTerrainScene({ canvas: canvasWith(gl), tier: 'full' })!.dispose(); + expect(calls.deleteProgram).toHaveLength(3); + expect(calls.deleteBuffer).toHaveLength(2); + expect(calls.deleteTexture).toHaveLength(1); + expect(rafQueue).toHaveLength(0); + }); +}); + +describe("startBackgroundScene style 'terrain'", () => { + it('requests webgl2 and returns a scene once the tier is on', async () => { + const { gl } = fakeGl(); + const canvas = canvasWith(gl); + const scene = await startBackgroundScene({ tier: 'still', style: 'terrain' }, {}, { canvas }); + expect(scene).not.toBeNull(); + expect(canvas.getContext).toHaveBeenCalledWith('webgl2', expect.anything()); + scene!.dispose(); + }); + + it('stays off by default, and the default style is still the ridge (no WebGL2)', async () => { + const canvas = canvasWith(null); + expect(await startBackgroundScene({ style: 'terrain' }, {}, { canvas })).toBeNull(); + expect(canvas.getContext).not.toHaveBeenCalled(); + const { gl } = fakeGl(); + const c2 = { ...canvasWith(gl), getContext: vi.fn(() => null) }; + await startBackgroundScene({ tier: 'still' }, {}, { canvas: c2 }); + expect(c2.getContext).not.toHaveBeenCalledWith('webgl2', expect.anything()); + }); +}); diff --git a/src/app/features/scene/terrain/Terrain.ts b/src/app/features/scene/terrain/Terrain.ts new file mode 100644 index 00000000..2a81aa56 --- /dev/null +++ b/src/app/features/scene/terrain/Terrain.ts @@ -0,0 +1,359 @@ +import type { Scene, SceneOptions } from '../Scene'; +import { FrameSampler, FrameStats } from '../ridge/probe'; +import { skyColours } from '../ridge/skyColour'; +import { SkyName } from './skyData'; +import { + ambientColour, + hazeColour, + HAZE_K, + hexToLinear, + isSkyName, + skyData, + skyNameFor, + sunColour, + sunDirection, +} from './terrainSky'; +import { buildGrid, CAMERA, GRID, seedOffset, TERRAIN, triangleCount, view } from './terrainWorld'; +import { + FULLSCREEN_VERT, + GRID_FRAG, + GRID_VERT, + heightFragmentSource, + SKY_FRAG, +} from './terrainShaders'; + +export type TerrainOptions = Pick< + SceneOptions, + 'canvas' | 'tier' | 'onCompileFail' | 'onContextLost' +> & { + /** Which baked sky lights and hazes the terrain. Default: `?sky=` in the page URL, else the night notion of `skyColours()`. */ + sky?: SkyName; + /** Terrain seed: the height map is sampled at an offset taken from it. Default 0. */ + seed?: number; + /** Show the rAF median/p95 readout (plus triangle count). Default: the page URL has `?probe=1`. */ + probe?: boolean; + onProbe?: (s: FrameStats & { still: boolean; triangles: number }) => void; +}; + +/** Same shape as Scene.ts's ShaderCompileError, redeclared so this chunk does not import the ray-march scene. */ +class ShaderCompileError extends Error { + constructor(readonly stage: 'vertex', readonly log: string) { + super(`${stage} shader failed to compile:\n${log}`); + } +} + +function program(gl: WebGL2RenderingContext, name: string, vs: string, fs: string): WebGLProgram { + const make = (type: number, src: string, which: string) => { + const s = gl.createShader(type); + if (!s) throw new Error('createShader failed'); + gl.shaderSource(s, src); + gl.compileShader(s); + if (!gl.getShaderParameter(s, gl.COMPILE_STATUS)) { + const log = gl.getShaderInfoLog(s) ?? ''; + gl.deleteShader(s); + throw new ShaderCompileError('vertex', `terrain ${name} ${which} shader: ${log}`); + } + return s; + }; + const v = make(gl.VERTEX_SHADER, vs, 'vertex'); + const f = make(gl.FRAGMENT_SHADER, fs, 'fragment'); + const p = gl.createProgram(); + if (!p) throw new Error('createProgram failed'); + gl.attachShader(p, v); + gl.attachShader(p, f); + gl.linkProgram(p); + gl.deleteShader(v); + gl.deleteShader(f); + if (!gl.getProgramParameter(p, gl.LINK_STATUS)) { + const log = gl.getProgramInfoLog(p) ?? ''; + gl.deleteProgram(p); + throw new ShaderCompileError('vertex', `terrain ${name} link: ${log}`); + } + return p; +} + +/** The sky to use: the option, then `?sky=midnight|noonday`, then the night notion of `skyColours()`. */ +function chooseSky(opt: SkyName | undefined): SkyName { + if (opt) return opt; + const q = new URLSearchParams(window.location.search).get('sky'); + return isSkyName(q) ? q : skyNameFor(skyColours()); +} + +/** + * The terrain scene: same contract as `createRidgeScene`/`createScene` ({ login, dispose }, null for "keep the + * CSS ground"). WebGL2 only. The height map is baked once on the GPU (Phacelle, see terrainShaders.ts) into an + * RGBA8 texture; each frame is two draws: the baked gradient sky, then a displaced grid lit by the baked sun and + * ambient and hazed toward the baked horizon colour. Cadence guard, pauses and the `?probe=1` readout match the + * ridge scene. + */ +export function createTerrainScene(opts: TerrainOptions): Scene | null { + const tier = opts.tier ?? 'full'; + if (tier === 'off') return null; + const { canvas } = opts; + const probe = opts.probe ?? new URLSearchParams(window.location.search).get('probe') === '1'; + const gl = canvas.getContext('webgl2', { + antialias: false, + alpha: false, + }) as WebGL2RenderingContext | null; + if (!gl) return null; + const units = gl.getParameter(gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS); + if (typeof units === 'number' && units < 1) return null; + + const sky = skyData(chooseSky(opts.sky)); + const spec = GRID[tier]; + + let skyProg: WebGLProgram; + let gridProg: WebGLProgram; + let bakeProg: WebGLProgram; + try { + bakeProg = program(gl, 'height', FULLSCREEN_VERT, heightFragmentSource()); + skyProg = program(gl, 'sky', FULLSCREEN_VERT, SKY_FRAG); + gridProg = program(gl, 'grid', GRID_VERT, GRID_FRAG); + } catch (e) { + opts.onCompileFail?.(e as ShaderCompileError); + return null; + } + + // The height map, baked once. + const heightTex = gl.createTexture(); + const fbo = gl.createFramebuffer(); + gl.bindTexture(gl.TEXTURE_2D, heightTex); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA8, spec.tex, spec.tex, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); + gl.bindFramebuffer(gl.FRAMEBUFFER, fbo); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, heightTex, 0); + const complete = gl.checkFramebufferStatus(gl.FRAMEBUFFER) === gl.FRAMEBUFFER_COMPLETE; + const free: Array<() => void> = []; + const release = () => { + free.forEach((f) => f()); + gl.deleteTexture(heightTex); + gl.deleteFramebuffer(fbo); + gl.deleteProgram(bakeProg); + gl.deleteProgram(skyProg); + gl.deleteProgram(gridProg); + }; + if (!complete) { + release(); + return null; + } + gl.viewport(0, 0, spec.tex, spec.tex); + gl.disable(gl.DEPTH_TEST); + gl.useProgram(bakeProg); + gl.uniform1f(gl.getUniformLocation(bakeProg, 'uSpan'), TERRAIN.span); + gl.uniform1f(gl.getUniformLocation(bakeProg, 'uTexels'), spec.tex); + gl.uniform2fv(gl.getUniformLocation(bakeProg, 'uSeed'), seedOffset(opts.seed ?? 0)); + gl.drawArrays(gl.TRIANGLES, 0, 3); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + // The displaced grid. + const g = buildGrid(spec.grid); + const vao = gl.createVertexArray(); + const vbuf = gl.createBuffer(); + const ibuf = gl.createBuffer(); + gl.bindVertexArray(vao); + gl.bindBuffer(gl.ARRAY_BUFFER, vbuf); + gl.bufferData(gl.ARRAY_BUFFER, g.uv, gl.STATIC_DRAW); + gl.enableVertexAttribArray(0); + gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0); + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, ibuf); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, g.indices, gl.STATIC_DRAW); + gl.bindVertexArray(null); + free.push( + () => gl.deleteVertexArray(vao), + () => gl.deleteBuffer(vbuf), + () => gl.deleteBuffer(ibuf) + ); + + const gradient = new Float32Array(sky.gradient.flatMap((h) => [...hexToLinear(h)])); + const sun = [...sunDirection(sky)]; + const sunLight = [...sunColour(sky)]; + const ambient = [...ambientColour(sky)]; + const haze = [...hazeColour(sky)]; + const triangles = triangleCount(spec.grid); + + const reducedMotion = window.matchMedia?.('(prefers-reduced-motion: reduce)'); + const sampler = new FrameSampler(); + let still = tier === 'still'; + let disposed = false; + let lost = false; + let raf = 0; + let readout: HTMLElement | undefined; + let resizeTimer = 0; + let turnsAtPause = 0; + let playedFrom: number | undefined; + + /** Size the canvas: low renders at 0.75 of the CSS size; full at device pixel ratio capped to 2. */ + const size = () => { + const dpr = Math.min(window.devicePixelRatio || 1, 2) * (tier === 'low' ? 0.75 : 1); + canvas.width = Math.max(1, Math.round((canvas.clientWidth || window.innerWidth) * dpr)); + canvas.height = Math.max(1, Math.round((canvas.clientHeight || window.innerHeight) * dpr)); + }; + + const draw = (turns: number) => { + if (lost) return; + gl.viewport(0, 0, canvas.width, canvas.height); + const v = view(canvas.width / canvas.height, turns % 1); + gl.disable(gl.DEPTH_TEST); + gl.useProgram(skyProg); + const us = (n: string) => gl.getUniformLocation(skyProg, n); + gl.uniform3fv(us('uGrad'), gradient); + gl.uniform3fv(us('uRight'), v.right); + gl.uniform3fv(us('uUp'), v.up); + gl.uniform3fv(us('uForward'), v.forward); + gl.uniform2f(us('uSize'), canvas.width, canvas.height); + gl.uniform1f(us('uTanHalf'), Math.tan(CAMERA.fov / 2)); + gl.drawArrays(gl.TRIANGLES, 0, 3); + + gl.enable(gl.DEPTH_TEST); + gl.clear(gl.DEPTH_BUFFER_BIT); + gl.useProgram(gridProg); + const u = (n: string) => gl.getUniformLocation(gridProg, n); + gl.uniformMatrix4fv(u('uViewProj'), false, v.viewProj); + gl.uniform3fv(u('uCamera'), v.eye); + gl.uniform1f(u('uSpan'), TERRAIN.span); + gl.uniform1i(u('uTex'), spec.tex); + gl.uniform3fv(u('uSun'), sun); + gl.uniform3fv(u('uSunColour'), sunLight); + gl.uniform3fv(u('uAmbient'), ambient); + gl.uniform3fv(u('uHaze'), haze); + gl.uniform1f(u('uHazeK'), HAZE_K); + gl.activeTexture(gl.TEXTURE0); + gl.bindTexture(gl.TEXTURE_2D, heightTex); + gl.uniform1i(u('uHeight'), 0); + gl.bindVertexArray(vao); + gl.drawElements(gl.TRIANGLES, g.indices.length, gl.UNSIGNED_INT, 0); + gl.bindVertexArray(null); + }; + + const moving = () => + !still && + !disposed && + !lost && + !(reducedMotion?.matches ?? false) && + document.visibilityState === 'visible'; + + const turnsNow = (now: number) => + turnsAtPause + (playedFrom === undefined ? 0 : (now - playedFrom) / (CAMERA.seconds * 1000)); + + const report = (stillNow: boolean) => { + const s = { ...sampler.stats(), still: stillNow, triangles }; + opts.onProbe?.(s); + if (readout) { + readout.textContent = `terrain · ${s.triangles} tris · n ${s.n} · median ${s.medianMs.toFixed( + 1 + )} ms · p95 ${s.p95Ms.toFixed(1)} ms${stillNow ? ' · STILL' : ''}`; + } + }; + + const settleToStill = () => { + if (playedFrom !== undefined) turnsAtPause = turnsNow(performance.now()); + playedFrom = undefined; + still = true; + cancelAnimationFrame(raf); + raf = 0; + draw(turnsAtPause); + report(true); + }; + + let sinceReport = 0; + // The first window is measured (guard against a slow device); after it the loop only draws. + let measuring = true; + const frame = (now: number) => { + raf = 0; + if (!moving()) return; + draw(turnsNow(now)); + if (!measuring) { + raf = requestAnimationFrame(frame); + return; + } + const full = sampler.push(now); + if (full) { + measuring = false; + if (sampler.slow()) { + settleToStill(); + return; + } + if (probe) report(false); + } else if (probe && now - sinceReport > 500) { + sinceReport = now; + report(false); + } + raf = requestAnimationFrame(frame); + }; + const wake = () => { + if (!moving()) { + if (playedFrom !== undefined) turnsAtPause = turnsNow(performance.now()); + playedFrom = undefined; + return; + } + if (raf) return; + playedFrom = performance.now(); + if (measuring) sampler.reset(); + raf = requestAnimationFrame(frame); + }; + + const onLost = (e: Event) => { + e.preventDefault(); + lost = true; + cancelAnimationFrame(raf); + raf = 0; + opts.onContextLost?.(); + }; + canvas.addEventListener('webglcontextlost', onLost); + + size(); + if (probe && canvas.parentElement) { + readout = document.createElement('div'); + Object.assign(readout.style, { + position: 'absolute', + left: '8px', + top: '8px', + font: '12px monospace', + color: '#fff', + background: 'rgba(0,0,0,.55)', + padding: '2px 6px', + borderRadius: '3px', + pointerEvents: 'none', + }); + canvas.parentElement.appendChild(readout); + } + if (still) settleToStill(); + else wake(); + if (!still && !moving()) draw(0); + + const onVisibility = () => { + sampler.reset(); + wake(); + }; + const onResize = () => { + clearTimeout(resizeTimer); + resizeTimer = window.setTimeout(() => { + if (disposed || lost) return; + size(); + draw(turnsNow(performance.now())); + sampler.reset(); + }, 250); + }; + document.addEventListener('visibilitychange', onVisibility); + window.addEventListener('resize', onResize); + reducedMotion?.addEventListener?.('change', onVisibility); + + return { + login() { + // The camera is the same before and after. + }, + dispose() { + if (disposed) return; + disposed = true; + cancelAnimationFrame(raf); + clearTimeout(resizeTimer); + document.removeEventListener('visibilitychange', onVisibility); + window.removeEventListener('resize', onResize); + reducedMotion?.removeEventListener?.('change', onVisibility); + canvas.removeEventListener('webglcontextlost', onLost); + readout?.remove(); + release(); + }, + }; +} diff --git a/src/app/features/scene/terrain/terrainShaders.ts b/src/app/features/scene/terrain/terrainShaders.ts new file mode 100644 index 00000000..0fe8adc5 --- /dev/null +++ b/src/app/features/scene/terrain/terrainShaders.ts @@ -0,0 +1,146 @@ +// GLSL ES 3.00. The height map is baked once by CultMath's Phacelle noise (vendored, unedited, MPL-2.0: Rune +// Skovbo Johansen's Phacelle noise, https://blog.runevision.com/2026/01/) composed into a slope-directed gully +// filter after the description in his March 2026 erosion-filter post. The composition is ours, written from +// that description; it is not his filter and has not been compared against it (see harness terrainDemo.ts on +// the terrain-tier-spike branch, from which this is promoted). The height is packed in two bytes of an RGBA8 +// target, so no float colour-buffer extension is needed. +import cultmath from '../shaders/CultMath.glsl?raw'; +import phacelle from '../shaders/CultMath.Phacelle.glsl?raw'; +import { trimGlsl } from '../cultmathTrim'; +import { TERRAIN } from './terrainWorld'; + +const HEADER = + '#version 300 es\nprecision highp float;\nprecision highp int;\nprecision highp sampler2D;\n'; +const f1 = (x: number) => x.toFixed(1); + +export const FULLSCREEN_VERT = `${HEADER} +void main() { + vec2 p = vec2(float((gl_VertexID << 1) & 2), float(gl_VertexID & 2)); + gl_Position = vec4(p * 2.0 - 1.0, 0.0, 1.0); +}`; + +const HEIGHT_STAGE = ` +uniform float uSpan; +uniform vec2 uSeed; +uniform float uTexels; +out vec4 o; + +const float BASE_AMP = 60.0; +const float BASE_FREQ = 1.0 / 520.0; +const float BASE_LIFT = 110.0; +const float CELL0 = 160.0; +const float SIDE_LEN = 3.0; +const float NORM = 0.5; +const float SLOPE_REF = 0.55; +const float DETAIL = 1.5; +const float AMP0 = 11.0; +const float HLO = 20.0, HHI = 200.0; + +float easeOut(float t) { t = clamp(t, 0.0, 1.0); return 1.0 - (1.0 - t) * (1.0 - t); } +float powInv(float t, float p) { return 1.0 - pow(1.0 - t, p); } + +float height(vec2 xz) { + vec4 fg = cultmath_fbm_grad(vec3(xz * BASE_FREQ, 0.0), 4, 2.0, 0.45); + float h = BASE_LIFT + BASE_AMP * fg.w; + vec2 g = BASE_AMP * BASE_FREQ * fg.xy; + float target = clamp((h - HLO) / (HHI - HLO) * 2.0 - 1.0, -1.0, 1.0); + float combi = 1.0; + float amp = AMP0; + float cell = CELL0; + for (int i = 0; i < OCTAVES; i++) { + float slope = length(g); + vec2 downhill = slope > 1e-4 ? -g / slope : vec2(1.0, 0.0); + vec2 across = vec2(-downhill.y, downhill.x); + CultPhasor ph = cultmath_phacelle(vec3(xz / cell, 0.5), vec3(across * SIDE_LEN, 0.0), 0.0, NORM); + float mask = easeOut(slope / SLOPE_REF) * combi; + float faded = mix(target, ph.cos.w, mask); + h += amp * faded; + g += amp * mask * ph.cos.xy / cell; + combi = powInv(combi, DETAIL) * (1.0 - abs(ph.sin.w)); + target = faded; + amp *= 0.5; + cell *= 0.5; + } + return h; +} + +void main() { + vec2 uv = gl_FragCoord.xy / vec2(uTexels); + float h = clamp(height((uv - 0.5) * uSpan + uSeed) / ${f1(TERRAIN.hmax)}, 0.0, 1.0); + float q = floor(h * 65535.0 + 0.5); + o = vec4(floor(q / 256.0) / 255.0, mod(q, 256.0) / 255.0, 0.0, 1.0); +}`; + +/** The height-bake fragment shader: header, the part of CultMath that Phacelle and the stage reach, Phacelle, the stage. */ +export function heightFragmentSource(): string { + const math = trimGlsl(cultmath, [phacelle, HEIGHT_STAGE]); + return `${HEADER}#define OCTAVES 4\n${math}\n${phacelle}\n${HEIGHT_STAGE}`; +} + +const FETCH = ` +uniform sampler2D uHeight; +uniform int uTex; +float hAt(ivec2 t) { + t = clamp(t, ivec2(0), ivec2(uTex - 1)); + vec4 s = texelFetch(uHeight, t, 0); + return (floor(s.r * 255.0 + 0.5) * 256.0 + floor(s.g * 255.0 + 0.5)) / 65535.0 * ${f1( + TERRAIN.hmax + )}; +}`; + +export const GRID_VERT = `${HEADER} +layout(location = 0) in vec2 a_uv; +uniform mat4 uViewProj; +uniform float uSpan; +out vec2 v_uv; +out vec3 v_world; +${FETCH} +void main() { + ivec2 t = ivec2(a_uv * float(uTex - 1) + 0.5); + // The patch's rim sinks to zero so the grid has no cliff edge to show through the haze. + float rim = 1.0 - smoothstep(0.78, 1.0, 2.0 * max(abs(a_uv.x - 0.5), abs(a_uv.y - 0.5))); + float h = hAt(t) * rim; + v_uv = a_uv; + v_world = vec3((a_uv.x - 0.5) * uSpan, h, (a_uv.y - 0.5) * uSpan); + gl_Position = uViewProj * vec4(v_world, 1.0); +}`; + +// Lit by the baked sky: uSun (direction), uSunColour (linear, zero when the sun is down), uAmbient, uHaze (linear). +// The same arithmetic as terrainSky.shade(); the normal comes from the height map so shading carries detail finer than the mesh. +export const GRID_FRAG = `${HEADER} +in vec2 v_uv; +in vec3 v_world; +uniform vec3 uCamera, uSun, uSunColour, uAmbient, uHaze; +uniform float uSpan, uHazeK; +out vec4 o; +${FETCH} +void main() { + ivec2 t = ivec2(v_uv * float(uTex - 1) + 0.5); + float texel = uSpan / float(uTex - 1); + float dx = hAt(t + ivec2(1, 0)) - hAt(t - ivec2(1, 0)); + float dz = hAt(t + ivec2(0, 1)) - hAt(t - ivec2(0, 1)); + vec3 n = normalize(vec3(-dx, 2.0 * texel, -dz)); + float alt = clamp(v_world.y / 200.0, 0.0, 1.0); + vec3 rock = mix(vec3(0.07, 0.06, 0.05), vec3(0.28, 0.26, 0.22), alt); + vec3 grass = mix(vec3(0.03, 0.07, 0.025), vec3(0.14, 0.15, 0.07), alt); + vec3 albedo = mix(rock, grass, smoothstep(0.55, 0.9, n.y)); + vec3 lit = albedo * (uSunColour * max(dot(n, uSun), 0.0) + uAmbient * (0.5 + 0.5 * n.y)); + float T = exp(-uHazeK * length(v_world - uCamera)); + o = vec4(pow(mix(uHaze, lit, T), vec3(1.0 / 2.2)), 1.0); +}`; + +// The sky behind: the gradient's seven stops, zenith first, by the view ray's elevation (horizon stop at and below the horizon). +export const SKY_FRAG = `${HEADER} +uniform vec3 uGrad[7]; +uniform vec3 uRight, uUp, uForward; +uniform vec2 uSize; +uniform float uTanHalf; +out vec4 o; +void main() { + vec2 ndc = gl_FragCoord.xy / uSize * 2.0 - 1.0; + vec3 d = normalize(uForward + ndc.x * uTanHalf * uSize.x / uSize.y * uRight + ndc.y * uTanHalf * uUp); + float s = (1.0 - sqrt(clamp(d.y, 0.0, 1.0))) * 6.0; + int i = int(min(floor(s), 5.0)); + vec3 c = mix(uGrad[i], uGrad[i + 1], s - float(i)); + o = vec4(pow(c, vec3(1.0 / 2.2)), 1.0); +}`; diff --git a/src/app/features/scene/terrain/terrainWorld.test.ts b/src/app/features/scene/terrain/terrainWorld.test.ts new file mode 100644 index 00000000..5d21ba47 --- /dev/null +++ b/src/app/features/scene/terrain/terrainWorld.test.ts @@ -0,0 +1,81 @@ +/* eslint-disable no-restricted-syntax -- tests loop over skies, normals and distances */ +import { describe, expect, it } from 'vitest'; +import { buildGrid, CAMERA, GRID, seedOffset, TERRAIN, triangleCount, view } from './terrainWorld'; +import { heightFragmentSource } from './terrainShaders'; + +describe('seed', () => { + it('same seed, same offset, so the baked height map is the same; a different seed moves it', () => { + expect(seedOffset(7)).toEqual(seedOffset(7)); + expect(seedOffset(0)).toEqual([0, 0]); + expect(seedOffset(1)).not.toEqual(seedOffset(2)); + }); + + it('the height-bake source is a pure function of nothing but the world constants', () => { + expect(heightFragmentSource()).toBe(heightFragmentSource()); + const src = heightFragmentSource(); + expect(src.startsWith('#version 300 es')).toBe(true); + expect(src).toContain('cultmath_phacelle'); + expect(src).toContain(`/ ${TERRAIN.hmax.toFixed(1)}`); + expect(src).toContain('uSeed'); + }); +}); + +describe('grid', () => { + it('has (n+1)^2 vertices in 0..1 and 2n^2 triangles that index them all in range', () => { + const n = 8; + const g = buildGrid(n); + expect(g.uv.length).toBe((n + 1) * (n + 1) * 2); + expect(g.indices.length / 3).toBe(triangleCount(n)); + expect(Math.max(...g.indices)).toBe((n + 1) * (n + 1) - 1); + expect(Math.min(...g.uv)).toBe(0); + expect(Math.max(...g.uv)).toBe(1); + }); + + it('each tier fits a 32-bit index and the cheap tiers stay cheap', () => { + expect(triangleCount(GRID.low.grid)).toBeLessThan(40000); + expect(GRID.full.grid).toBeGreaterThan(GRID.low.grid); + expect(GRID.still.tex).toBeLessThanOrEqual(GRID.low.tex); + }); +}); + +describe('camera', () => { + const project = (m: Float32Array, p: number[]) => { + const x = m[0] * p[0] + m[4] * p[1] + m[8] * p[2] + m[12]; + const y = m[1] * p[0] + m[5] * p[1] + m[9] * p[2] + m[13]; + const z = m[2] * p[0] + m[6] * p[1] + m[10] * p[2] + m[14]; + const w = m[3] * p[0] + m[7] * p[1] + m[11] * p[2] + m[15]; + return { x: x / w, y: y / w, z: z / w, w }; + }; + + it('a point straight ahead lands in the middle of the screen, in front, inside the depth range', () => { + for (const turns of [0, 0.25, 0.6]) { + const v = view(0.46, turns); + const p = v.eye.map((e, i) => e + 800 * v.forward[i]); + const s = project(v.viewProj, p); + expect(s.w).toBeGreaterThan(0); + expect(s.x).toBeCloseTo(0, 5); + expect(s.y).toBeCloseTo(0, 5); + expect(Math.abs(s.z)).toBeLessThan(1); + } + }); + + it('looks down by the pitch, and one full turn comes back to the same heading', () => { + const a = view(1, 0); + const b = view(1, 1); + expect(a.forward[1]).toBeCloseTo(-Math.sin(CAMERA.pitch), 9); + for (let i = 0; i < 3; i += 1) expect(a.forward[i]).toBeCloseTo(b.forward[i], 9); + }); + + it('sits above the highest possible terrain, so the eye is never inside a hill', () => { + expect(CAMERA.eye).toBeGreaterThan(TERRAIN.hmax); + }); + + it('the basis is orthonormal', () => { + const v = view(0.5, 0.37); + const dot = (a: number[], b: number[]) => a[0] * b[0] + a[1] * b[1] + a[2] * b[2]; + expect(dot(v.right, v.up)).toBeCloseTo(0, 9); + expect(dot(v.right, v.forward)).toBeCloseTo(0, 9); + expect(dot(v.up, v.forward)).toBeCloseTo(0, 9); + expect(Math.hypot(...v.up)).toBeCloseTo(1, 9); + }); +}); diff --git a/src/app/features/scene/terrain/terrainWorld.ts b/src/app/features/scene/terrain/terrainWorld.ts new file mode 100644 index 00000000..e21a229e --- /dev/null +++ b/src/app/features/scene/terrain/terrainWorld.ts @@ -0,0 +1,126 @@ +// The terrain scene's fixed numbers, grid and camera, as pure functions. No DOM, no GL. +// The height field itself is a function of world position written in GLSL (terrainShaders.ts), baked once +// into a texture; the CPU owns only where it is looked at from, and the seed offset it is sampled at. + +/** Metres across the patch, and the height in metres that normalised height 1.0 stands for. */ +export const TERRAIN = { span: 3000, hmax: 256 }; + +/** Grid quads per side and height-map texels per side, by tier. 'still' draws one frame, so it takes the cheap pair. */ +export const GRID = { + still: { grid: 128, tex: 512 }, + low: { grid: 128, tex: 512 }, + full: { grid: 192, tex: 1024 }, +} as const; + +/** The camera: at the patch centre, above the highest peak, turning slowly and looking a little down. */ +export const CAMERA = { + eye: 330, + pitch: (13 * Math.PI) / 180, + fov: (55 * Math.PI) / 180, + near: 10, + far: 6000, + /** Seconds for one full turn. */ + seconds: 420, +}; + +/** The height map's sample offset in metres for a seed: same seed, same terrain. Seed 0 is the origin. */ +export function seedOffset(seed: number): [number, number] { + const s = Math.trunc(seed); + return [(s * 7919) % 65536, (s * 104729) % 65536]; +} + +export const triangleCount = (grid: number): number => 2 * grid * grid; + +/** Vertex grid in unit uv: (grid + 1)^2 positions, then the two-triangle-per-quad index list. */ +export function buildGrid(grid: number): { uv: Float32Array; indices: Uint32Array } { + const uv = new Float32Array((grid + 1) * (grid + 1) * 2); + for (let j = 0, k = 0; j <= grid; j += 1) + for (let i = 0; i <= grid; i += 1, k += 2) { + uv[k] = i / grid; + uv[k + 1] = j / grid; + } + const indices = new Uint32Array(grid * grid * 6); + for (let j = 0, k = 0; j < grid; j += 1) + for (let i = 0; i < grid; i += 1, k += 6) { + const a = j * (grid + 1) + i; + indices.set([a, a + grid + 1, a + 1, a + 1, a + grid + 1, a + grid + 2], k); + } + return { uv, indices }; +} + +export interface View { + /** Column-major perspective * view. */ + viewProj: Float32Array; + eye: [number, number, number]; + /** Camera basis in world space, for the sky pass. */ + right: [number, number, number]; + up: [number, number, number]; + forward: [number, number, number]; +} + +const norm = (a: number[]): [number, number, number] => { + const l = Math.hypot(a[0], a[1], a[2]) || 1; + return [a[0] / l, a[1] / l, a[2] / l]; +}; +const cross = (a: number[], b: number[]): [number, number, number] => [ + a[1] * b[2] - a[2] * b[1], + a[2] * b[0] - a[0] * b[2], + a[0] * b[1] - a[1] * b[0], +]; + +/** The camera `turns` full turns round (0..1 wraps), for a viewport aspect (width / height). */ +export function view(aspect: number, turns: number): View { + const yaw = 2 * Math.PI * turns; + const cp = Math.cos(CAMERA.pitch); + const forward = norm([Math.sin(yaw) * cp, -Math.sin(CAMERA.pitch), -Math.cos(yaw) * cp]); + const right = norm(cross(forward, [0, 1, 0])); + const up = cross(right, forward); + const eye: [number, number, number] = [0, CAMERA.eye, 0]; + const t = (a: number[]) => -(a[0] * eye[0] + a[1] * eye[1] + a[2] * eye[2]); + const v = [ + right[0], + up[0], + -forward[0], + 0, + right[1], + up[1], + -forward[1], + 0, + right[2], + up[2], + -forward[2], + 0, + t(right), + t(up), + -t(forward), + 1, + ]; + const f = 1 / Math.tan(CAMERA.fov / 2); + const { near: n, far } = CAMERA; + const p = [ + f / aspect, + 0, + 0, + 0, + 0, + f, + 0, + 0, + 0, + 0, + (far + n) / (n - far), + -1, + 0, + 0, + (2 * far * n) / (n - far), + 0, + ]; + const viewProj = new Float32Array(16); + for (let c = 0; c < 4; c += 1) + for (let r = 0; r < 4; r += 1) { + let s = 0; + for (let k = 0; k < 4; k += 1) s += p[k * 4 + r] * v[c * 4 + k]; + viewProj[c * 4 + r] = s; + } + return { viewProj, eye, right, up, forward }; +} diff --git a/src/app/features/scene/tier.ts b/src/app/features/scene/tier.ts index e2c82325..4a976081 100644 --- a/src/app/features/scene/tier.ts +++ b/src/app/features/scene/tier.ts @@ -15,8 +15,11 @@ export interface Capabilities { hardwareConcurrency?: number; } -/** 'ridge': baked parallax ridges, no WebGL (default). 'raymarch': the sphere-traced world with its tree and clouds. */ -export type SceneStyle = 'ridge' | 'raymarch'; +/** + * 'ridge': baked parallax ridges, no WebGL (default). 'raymarch': the sphere-traced world with its tree and + * clouds. 'terrain': a baked height map on a displaced grid, lit and hazed by the baked sky (WebGL2). + */ +export type SceneStyle = 'ridge' | 'raymarch' | 'terrain'; export interface BackgroundSceneConfig { tier?: SceneTier; From 70ade6ef0e1a5746445bb6ee2b83c3f1eb799668 Mon Sep 17 00:00:00 2001 From: Void Date: Sat, 7 Nov 2026 18:36:52 +0000 Subject: [PATCH 008/248] ci: print artifact service URLs (debug, no tokens) Co-Authored-By: Claude Sonnet 5.5 --- .github/workflows/rat-dev-preview.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/rat-dev-preview.yml b/.github/workflows/rat-dev-preview.yml index f003c2f7..23816f1b 100644 --- a/.github/workflows/rat-dev-preview.yml +++ b/.github/workflows/rat-dev-preview.yml @@ -26,6 +26,8 @@ jobs: run: npm run build - name: Set background scene tier run: node scripts/preview-config.js low + - name: Show artifact URLs (no tokens) + run: env | grep -E '^(ACTIONS_RESULTS_URL|ACTIONS_RUNTIME_URL|ACTIONS_CACHE_URL|GITHUB_SERVER_URL|GITHUB_API_URL)=' || true - name: Upload artifact # Forgejo's fork: upstream upload-artifact v4+ refuses non-GitHub servers (GHESNotSupportedError). uses: forgejo/upload-artifact@v4 From 0f3494217ef78c45236b578781745bc1090cade6 Mon Sep 17 00:00:00 2001 From: Void Date: Sat, 7 Nov 2026 18:40:17 +0000 Subject: [PATCH 009/248] ci: upload the dev preview with the v3 artifact protocol The v4 client drops the /forge subpath of ACTIONS_RESULTS_URL; v3 uses ACTIONS_RUNTIME_URL. Co-Authored-By: Claude Sonnet 5.5 --- .github/workflows/rat-dev-preview.yml | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/.github/workflows/rat-dev-preview.yml b/.github/workflows/rat-dev-preview.yml index 23816f1b..2871a19c 100644 --- a/.github/workflows/rat-dev-preview.yml +++ b/.github/workflows/rat-dev-preview.yml @@ -26,13 +26,10 @@ jobs: run: npm run build - name: Set background scene tier run: node scripts/preview-config.js low - - name: Show artifact URLs (no tokens) - run: env | grep -E '^(ACTIONS_RESULTS_URL|ACTIONS_RUNTIME_URL|ACTIONS_CACHE_URL|GITHUB_SERVER_URL|GITHUB_API_URL)=' || true - name: Upload artifact - # Forgejo's fork: upstream upload-artifact v4+ refuses non-GitHub servers (GHESNotSupportedError). - uses: forgejo/upload-artifact@v4 - env: - ACTIONS_RESULTS_URL: https://eureka.gamecult.org/forge/ + # v3 protocol: the v4 client keeps only the origin of ACTIONS_RESULTS_URL, dropping this forge's /forge subpath + # (nginx 404 page, runs 170-171), and upstream v4+ refuses non-GitHub servers outright (run 169). + uses: forgejo/upload-artifact@v3 with: name: rat-dev-dist path: dist From 9e34664550bd8dc369ef9edd6efa580f3cafaccb Mon Sep 17 00:00:00 2001 From: Nibu Date: Sat, 7 Nov 2026 18:43:33 +0000 Subject: [PATCH 010/248] scene: terrain shading blended across texels, smoother sky horizon, lighter haze Preview on Starfire showed one flat normal per height-map texel (blocky ground) and a hard step in the sky gradient at the geometric horizon. Normals now blend the four surrounding texels; the sky's elevation mapping eases through the horizon; haze k 0.0012 -> 0.0007 so relief reads. Co-Authored-By: Claude Sonnet 5.5 --- .../features/scene/terrain/terrainShaders.ts | 19 ++++++++++++++----- src/app/features/scene/terrain/terrainSky.ts | 2 +- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/app/features/scene/terrain/terrainShaders.ts b/src/app/features/scene/terrain/terrainShaders.ts index 0fe8adc5..1eff9c93 100644 --- a/src/app/features/scene/terrain/terrainShaders.ts +++ b/src/app/features/scene/terrain/terrainShaders.ts @@ -114,12 +114,21 @@ uniform vec3 uCamera, uSun, uSunColour, uAmbient, uHaze; uniform float uSpan, uHazeK; out vec4 o; ${FETCH} -void main() { - ivec2 t = ivec2(v_uv * float(uTex - 1) + 0.5); - float texel = uSpan / float(uTex - 1); +// Unnormalised normal at one texel, central differences over its neighbours. +vec3 nAt(ivec2 t, float texel) { float dx = hAt(t + ivec2(1, 0)) - hAt(t - ivec2(1, 0)); float dz = hAt(t + ivec2(0, 1)) - hAt(t - ivec2(0, 1)); - vec3 n = normalize(vec3(-dx, 2.0 * texel, -dz)); + return normalize(vec3(-dx, 2.0 * texel, -dz)); +} +void main() { + // The four texels around this fragment, blended, so the shading is continuous and not one flat square per texel. + vec2 p = v_uv * float(uTex - 1); + ivec2 t = ivec2(floor(p)); + vec2 f = fract(p); + float texel = uSpan / float(uTex - 1); + vec3 n = normalize(mix( + mix(nAt(t, texel), nAt(t + ivec2(1, 0), texel), f.x), + mix(nAt(t + ivec2(0, 1), texel), nAt(t + ivec2(1, 1), texel), f.x), f.y)); float alt = clamp(v_world.y / 200.0, 0.0, 1.0); vec3 rock = mix(vec3(0.07, 0.06, 0.05), vec3(0.28, 0.26, 0.22), alt); vec3 grass = mix(vec3(0.03, 0.07, 0.025), vec3(0.14, 0.15, 0.07), alt); @@ -139,7 +148,7 @@ out vec4 o; void main() { vec2 ndc = gl_FragCoord.xy / uSize * 2.0 - 1.0; vec3 d = normalize(uForward + ndc.x * uTanHalf * uSize.x / uSize.y * uRight + ndc.y * uTanHalf * uUp); - float s = (1.0 - sqrt(clamp(d.y, 0.0, 1.0))) * 6.0; + float s = (1.0 - sqrt(smoothstep(-0.15, 1.0, d.y))) * 6.0; int i = int(min(floor(s), 5.0)); vec3 c = mix(uGrad[i], uGrad[i + 1], s - float(i)); o = vec4(pow(c, vec3(1.0 / 2.2)), 1.0); diff --git a/src/app/features/scene/terrain/terrainSky.ts b/src/app/features/scene/terrain/terrainSky.ts index 8f255206..d6c699c3 100644 --- a/src/app/features/scene/terrain/terrainSky.ts +++ b/src/app/features/scene/terrain/terrainSky.ts @@ -56,7 +56,7 @@ export function ambientColour(d: SkyData): Vec3 { export const hazeColour = (d: SkyData): Vec3 => hexToLinear(d.gradient[d.gradient.length - 1]); /** Haze: transmittance T = exp(-k d) at distance d metres. */ -export const HAZE_K = 0.0012; +export const HAZE_K = 0.0007; export const transmittance = (distance: number): number => Math.exp(-HAZE_K * Math.max(0, distance)); From 7216456a278828c0106a38990541d05b80c38e39 Mon Sep 17 00:00:00 2001 From: Void Date: Sat, 7 Nov 2026 18:46:39 +0000 Subject: [PATCH 011/248] sky: bake sun azimuth and colour, ambient with a night floor, horizon colour Co-Authored-By: Claude Sonnet 5.5 --- src/sky/baked.ts | 14 ++++++++++++++ src/sky/skyTokens.js | 13 ++++++++++++- src/sky/skyTokens.test.ts | 34 +++++++++++++++++++++++++++++++++- src/sky/sun.js | 22 ++++++++++++++++------ 4 files changed, 75 insertions(+), 8 deletions(-) diff --git a/src/sky/baked.ts b/src/sky/baked.ts index 15e72c8f..ecaffbe5 100644 --- a/src/sky/baked.ts +++ b/src/sky/baked.ts @@ -8,6 +8,13 @@ export const baked = { lon: 0, }, elevation: -44.579021600011224, + sun: { + elevation_deg: -44.579021600011224, + azimuth_deg: 2.4988773054640205, + color_linear: [0, 0, 0], + }, + ambient_linear: [0.018, 0.024, 0.04], + horizon_hex: '#484e64', gradient: ['#37446a', '#38456a', '#3b4669', '#3d4868', '#414a67', '#444c66', '#484e64'], tokens: { Background: { @@ -117,6 +124,13 @@ export const baked = { lon: 0, }, elevation: 45.16994813502928, + sun: { + elevation_deg: 45.16994813502928, + azimuth_deg: 182.58737070473103, + color_linear: [0.9189659216820631, 0.8444983652129638, 0.6933684802959983], + }, + ambient_linear: [0.07, 0.132, 0.27], + horizon_hex: '#e2f4ff', gradient: ['#95c6ff', '#9ac9ff', '#a5cfff', '#b3d6ff', '#c2dfff', '#d2e9ff', '#e2f4ff'], tokens: { Background: { diff --git a/src/sky/skyTokens.js b/src/sky/skyTokens.js index 0df39c33..c234de12 100644 --- a/src/sky/skyTokens.js +++ b/src/sky/skyTokens.js @@ -1,7 +1,8 @@ // Midnight Sky and Noonday Sky: theme tokens as albedo x irradiance. // Dependency-free apart from sun.js, so scripts/bake-sky.mjs and the tests run it under plain node. // -// bakeSky('midnight' | 'noonday') -> { moment, elevation, gradient: [hex x GRADIENT_STOPS], tokens } +// bakeSky('midnight' | 'noonday') -> { moment, elevation, sun, ambient_linear, horizon_hex, +// gradient: [hex x GRADIENT_STOPS], tokens, ... } // // The sky is lit by sun.js at a fixed moment (clear weather: a build-time bake has no feed). // A surface is `albedo * irradiance`, where irradiance is the sun and sky on an upward-facing @@ -24,6 +25,11 @@ export const MOMENTS = { midnight: { time: '2026-09-22T00:00:00Z', lat: 45, lon: 0 }, }; +// Lowest ambient a baked sky reports, linear RGB. sun.js's night sky is ~0.004, which is +// starlight-true but too dark to see by on a screen; this lifts it to a bluish moonlit-skyglow +// level. Daylight ambient is far above it, so the floor only ever touches the night. +export const AMBIENT_FLOOR = [0.018, 0.024, 0.04]; + // Linear-RGB albedos of the things Yggdrasil is made of. EYEBALLED around measured ranges // (dark bark 0.05-0.1, birch bark ~0.6, leaves ~0.05 red/0.15 green/0.03 blue, wet soil ~0.1). export const ALBEDO = { @@ -193,6 +199,11 @@ export function bakeSky(name) { return { moment, elevation: l.elevation, + // Sun for consumers that light a scene themselves: direction in degrees (azimuth clockwise + // from north) and the direct light's colour at normal incidence (black while it is below the horizon). + sun: { elevation_deg: l.elevation, azimuth_deg: l.azimuth, color_linear: l.direct }, + ambient_linear: l.diffuse.map((v, i) => Math.max(v, AMBIENT_FLOOR[i])), + horizon_hex: gradient[GRADIENT_STOPS - 1], // last stop: the horizon end of the gradient gradient, tokens, bubbles, diff --git a/src/sky/skyTokens.test.ts b/src/sky/skyTokens.test.ts index 0cd6694c..78a29b03 100644 --- a/src/sky/skyTokens.test.ts +++ b/src/sky/skyTokens.test.ts @@ -1,5 +1,6 @@ import { describe, expect, it } from 'vitest'; -import { AA, bakeSky, contrast } from './skyTokens.js'; +import { AA, AMBIENT_FLOOR, bakeSky, contrast } from './skyTokens.js'; +import { light } from './sun.js'; import { baked } from './baked'; const names = ['midnight', 'noonday'] as const; @@ -18,6 +19,37 @@ describe.each(names)('%s sky', (name) => { expect(name === 'noonday' ? sky.elevation : -sky.elevation).toBeGreaterThan(40); }); + it('carries the sun, an ambient light and a horizon colour for consumers that light a scene', () => { + const { sun } = sky; + expect(Object.keys(sun).sort()).toEqual(['azimuth_deg', 'color_linear', 'elevation_deg']); + expect(sun.elevation_deg).toBe(sky.elevation); + expect(sun.color_linear).toHaveLength(3); + sun.color_linear.forEach((v: number) => { + expect(Number.isFinite(v)).toBe(true); + expect(v).toBeGreaterThanOrEqual(0); + }); + expect(sky.ambient_linear).toHaveLength(3); + expect(sky.horizon_hex).toMatch(/^#[0-9a-f]{6}$/); + expect(sky.horizon_hex).toBe(sky.gradient[sky.gradient.length - 1]); + }); + + it('puts the sun where Nibu expects it, azimuth clockwise from north', () => { + const azimuth: number = sky.sun.azimuth_deg; + expect(azimuth).toBeGreaterThanOrEqual(0); + expect(azimuth).toBeLessThan(360); + expect(Math.abs(azimuth - (name === 'noonday' ? 182.6 : 2.5))).toBeLessThan(1); + }); + + it('keeps ambient above the night floor and leaves daylight alone', () => { + sky.ambient_linear.forEach((v: number, i: number) => + expect(v).toBeGreaterThanOrEqual(AMBIENT_FLOOR[i]) + ); + if (name === 'noonday') { + sky.ambient_linear.forEach((v: number) => expect(v).toBeGreaterThan(0.05)); + expect(sky.ambient_linear).toEqual(light(sky.moment).diffuse); + } + }); + it('clears WCAG AA for text on every panel state', () => { ['Background', 'Surface', 'SurfaceVariant'].forEach((p) => states.forEach((s) => diff --git a/src/sky/sun.js b/src/sky/sun.js index d66f0f9a..55cad1ac 100644 --- a/src/sky/sun.js +++ b/src/sky/sun.js @@ -2,13 +2,14 @@ // no imports, so a build-time token script and a runtime shader can share it. // // light({ time, lat, lon, cloud_cover = 0, precipitation = 0 }) -// -> { elevation, direct: [r,g,b], diffuse: [r,g,b], wetness } +// -> { elevation, azimuth, direct: [r,g,b], diffuse: [r,g,b], wetness } // // time Date, epoch milliseconds, or an ISO string (read as UTC) // lat, lon degrees, north and east positive // cloud_cover 0..1 (Open-Meteo reports percent: divide by 100) // precipitation mm/h // elevation degrees above the horizon, no refraction +// azimuth degrees clockwise from north (0 N, 90 E, 180 S), 0..360, no refraction // direct sun colour at normal incidence, linear RGB. Clear zenith sun ~ 1. // The consumer multiplies by max(0, dot(normal, toSun)). // diffuse sky ambient on an upward surface, linear RGB @@ -28,8 +29,8 @@ const mix = (a, b, t) => a + (b - a) * t; const toMs = (time) => (time instanceof Date ? time.getTime() : typeof time === 'string' ? Date.parse(time) : Number(time)); -/** Sun elevation in degrees at a UTC moment and place. */ -export function sunElevation(time, lat, lon) { +/** Sun elevation and azimuth in degrees at a UTC moment and place. Azimuth runs clockwise from north. */ +export function sunPosition(time, lat, lon) { const d = toMs(time) / 86400000 - 10957.5; // days since J2000.0 (2000-01-01 12:00 UTC) const L = (280.46 + 0.9856474 * d) * RAD; // mean longitude const g = (357.528 + 0.9856003 * d) * RAD; // mean anomaly @@ -41,9 +42,18 @@ export function sunElevation(time, lat, lon) { const hourAngle = gmst + lon * RAD - ra; const phi = lat * RAD; const sinEl = Math.sin(phi) * Math.sin(dec) + Math.cos(phi) * Math.cos(dec) * Math.cos(hourAngle); - return Math.asin(clamp(sinEl, -1, 1)) / RAD; + // Hour angle is westward-positive, so atan2 gives azimuth from south, westward; +180 turns it into + // clockwise from north. + const south = Math.atan2(Math.sin(hourAngle), Math.cos(hourAngle) * Math.sin(phi) - Math.tan(dec) * Math.cos(phi)); + return { + elevation: Math.asin(clamp(sinEl, -1, 1)) / RAD, + azimuth: (((south / RAD + 180) % 360) + 360) % 360, + }; } +/** Sun elevation in degrees at a UTC moment and place. */ +export const sunElevation = (time, lat, lon) => sunPosition(time, lat, lon).elevation; + // Optical depth of the clear atmosphere at the zenith, per channel (R, G, B). // Rayleigh at 650/550/450 nm plus a little ozone and haze (EYEBALLED to keep // low sun orange rather than brown). @@ -62,7 +72,7 @@ const GREY_TINT = [0.95, 1, 1.08]; // cool overcast. EYEBALLED const luma = (c) => 0.2126 * c[0] + 0.7152 * c[1] + 0.0722 * c[2]; export function light({ time, lat, lon, cloud_cover = 0, precipitation = 0 }) { - const elevation = sunElevation(time, lat, lon); + const { elevation, azimuth } = sunPosition(time, lat, lon); const cloud = clamp(cloud_cover, 0, 1); const rain = Math.max(0, precipitation); @@ -95,5 +105,5 @@ export function light({ time, lat, lon, cloud_cover = 0, precipitation = 0 }) { // 0 dry, ~0.63 at 1 mm/h, ~0.98 at 4 mm/h. EYEBALLED. const wetness = 1 - Math.exp(-rain); - return { elevation, direct, diffuse, wetness }; + return { elevation, azimuth, direct, diffuse, wetness }; } From 7a896c5f934f844956ab07677af13c13db3ecc7d Mon Sep 17 00:00:00 2001 From: Void Date: Sat, 7 Nov 2026 18:49:59 +0000 Subject: [PATCH 012/248] preview: pretend homeserver for the dev preview, in-page and off by default src/preview-demo answers a demo.invalid homeserver from fixtures through a guarded fetch; own-origin requests pass, every other origin is refused (fetch, WebSocket, XHR, beacon). Built in only with VITE_PREVIEW_DEMO=1 and switched on by previewDemo in config.json (scripts/preview-config.js --demo, run by the dev workflow). Login prefills 'demo'. Pose art: 24 downscaled thumbnails in preview-demo/poses, copied into dist by the workflow. Co-Authored-By: Claude Sonnet 5.5 --- .github/workflows/rat-dev-preview.yml | 7 +- preview-demo/poses/eureka/amused.png | Bin 0 -> 10874 bytes preview-demo/poses/eureka/annoyed.png | Bin 0 -> 9632 bytes preview-demo/poses/eureka/happy.png | Bin 0 -> 11044 bytes preview-demo/poses/eureka/neutral.png | Bin 0 -> 9595 bytes preview-demo/poses/eureka/surprised.png | Bin 0 -> 9812 bytes preview-demo/poses/eureka/thinking.png | Bin 0 -> 11619 bytes preview-demo/poses/nibu/amused.png | Bin 0 -> 12435 bytes preview-demo/poses/nibu/annoyed.png | Bin 0 -> 12144 bytes preview-demo/poses/nibu/happy.png | Bin 0 -> 12271 bytes preview-demo/poses/nibu/neutral.png | Bin 0 -> 12175 bytes preview-demo/poses/nibu/resolute.png | Bin 0 -> 12215 bytes preview-demo/poses/nibu/surprised.png | Bin 0 -> 12242 bytes preview-demo/poses/nibu/thinking.png | Bin 0 -> 11833 bytes preview-demo/poses/nibu/triumph.png | Bin 0 -> 12690 bytes preview-demo/poses/void/amused.png | Bin 0 -> 4795 bytes preview-demo/poses/void/annoyed.png | Bin 0 -> 4131 bytes preview-demo/poses/void/deadpan.png | Bin 0 -> 4353 bytes preview-demo/poses/void/glare.png | Bin 0 -> 4581 bytes preview-demo/poses/void/happy.png | Bin 0 -> 4146 bytes preview-demo/poses/void/neutral.png | Bin 0 -> 4190 bytes preview-demo/poses/void/point.png | Bin 0 -> 4900 bytes preview-demo/poses/void/reading.png | Bin 0 -> 5113 bytes preview-demo/poses/void/surprised.png | Bin 0 -> 4908 bytes preview-demo/poses/void/thinking.png | Bin 0 -> 5321 bytes scripts/preview-config.js | 22 +- src/app/hooks/useClientConfig.ts | 3 + src/app/pages/auth/login/Login.tsx | 4 +- src/index.tsx | 12 +- src/preview-demo/fixtures.ts | 153 +++++++++++ src/preview-demo/index.ts | 1 + src/preview-demo/install.ts | 115 ++++++++ src/preview-demo/server.test.ts | 234 ++++++++++++++++ src/preview-demo/server.ts | 344 ++++++++++++++++++++++++ 34 files changed, 887 insertions(+), 8 deletions(-) create mode 100644 preview-demo/poses/eureka/amused.png create mode 100644 preview-demo/poses/eureka/annoyed.png create mode 100644 preview-demo/poses/eureka/happy.png create mode 100644 preview-demo/poses/eureka/neutral.png create mode 100644 preview-demo/poses/eureka/surprised.png create mode 100644 preview-demo/poses/eureka/thinking.png create mode 100644 preview-demo/poses/nibu/amused.png create mode 100644 preview-demo/poses/nibu/annoyed.png create mode 100644 preview-demo/poses/nibu/happy.png create mode 100644 preview-demo/poses/nibu/neutral.png create mode 100644 preview-demo/poses/nibu/resolute.png create mode 100644 preview-demo/poses/nibu/surprised.png create mode 100644 preview-demo/poses/nibu/thinking.png create mode 100644 preview-demo/poses/nibu/triumph.png create mode 100644 preview-demo/poses/void/amused.png create mode 100644 preview-demo/poses/void/annoyed.png create mode 100644 preview-demo/poses/void/deadpan.png create mode 100644 preview-demo/poses/void/glare.png create mode 100644 preview-demo/poses/void/happy.png create mode 100644 preview-demo/poses/void/neutral.png create mode 100644 preview-demo/poses/void/point.png create mode 100644 preview-demo/poses/void/reading.png create mode 100644 preview-demo/poses/void/surprised.png create mode 100644 preview-demo/poses/void/thinking.png create mode 100644 src/preview-demo/fixtures.ts create mode 100644 src/preview-demo/index.ts create mode 100644 src/preview-demo/install.ts create mode 100644 src/preview-demo/server.test.ts create mode 100644 src/preview-demo/server.ts diff --git a/.github/workflows/rat-dev-preview.yml b/.github/workflows/rat-dev-preview.yml index 2871a19c..45da8bc4 100644 --- a/.github/workflows/rat-dev-preview.yml +++ b/.github/workflows/rat-dev-preview.yml @@ -22,10 +22,13 @@ jobs: - name: Build app env: CINNY_BASE: /void/rat-dev/ + VITE_PREVIEW_DEMO: '1' NODE_OPTIONS: '--max_old_space_size=3072' run: npm run build - - name: Set background scene tier - run: node scripts/preview-config.js low + - name: Set background scene tier and the pretend homeserver + run: node scripts/preview-config.js low --demo + - name: Add the demo pose art + run: mkdir -p dist/public/poses && cp -r preview-demo/poses/. dist/public/poses/ - name: Upload artifact # v3 protocol: the v4 client keeps only the origin of ACTIONS_RESULTS_URL, dropping this forge's /forge subpath # (nginx 404 page, runs 170-171), and upstream v4+ refuses non-GitHub servers outright (run 169). diff --git a/preview-demo/poses/eureka/amused.png b/preview-demo/poses/eureka/amused.png new file mode 100644 index 0000000000000000000000000000000000000000..655c2271e744c9b83847cd9b0970be2438b148be GIT binary patch literal 10874 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 Q_5c6?07*qoM6N<$g1o1IX#fBK literal 0 HcmV?d00001 diff --git a/preview-demo/poses/eureka/annoyed.png b/preview-demo/poses/eureka/annoyed.png new file mode 100644 index 0000000000000000000000000000000000000000..a142771e44564acb1031a9616d7d2db4b40ae5ed GIT binary patch literal 9632 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%0Ai_M?3FqYo`0iztgNKoA>XG| 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 R_QU`H002ovPDHLkV1i5$RJs5F literal 0 HcmV?d00001 diff --git a/preview-demo/poses/nibu/annoyed.png b/preview-demo/poses/nibu/annoyed.png new file mode 100644 index 0000000000000000000000000000000000000000..f71ce0b7531606d85aa59d3ea5029e296d9a9d9c GIT binary patch literal 12144 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 JPDHLkV1f~O*e?J8 literal 0 HcmV?d00001 diff --git a/preview-demo/poses/nibu/neutral.png b/preview-demo/poses/nibu/neutral.png new file mode 100644 index 0000000000000000000000000000000000000000..86eb51c8ed5ea32b5168169c7c109b54c15071d2 GIT binary patch literal 12175 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 RqwW9z002ovPDHLkV1lL6wfX=6 literal 0 HcmV?d00001 diff --git a/preview-demo/poses/nibu/resolute.png b/preview-demo/poses/nibu/resolute.png new file mode 100644 index 0000000000000000000000000000000000000000..8ce6377f50c63b22ee81837351a7409158e3f2cd GIT binary patch literal 12215 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 BlgR)8 literal 0 HcmV?d00001 diff --git a/preview-demo/poses/nibu/surprised.png b/preview-demo/poses/nibu/surprised.png new file mode 100644 index 0000000000000000000000000000000000000000..dc94588cfccf5d6061b10fa08fdfb3a937a58ae6 GIT binary patch literal 12242 zcmchd^LJfc6UT3S;~S?*+Mo>^+}O6!*mh&vW@FoE(Ac(Z+jjEi`6u34Yw!Kj*=uH> z&zd>syC+mmMidzV4*>uGAd8C$DSWQkpCbzh^*M`klb8SikX>?8io#N6wkL=8EMFv; zaKvwKpM(@-SiXw!;cBYyNV^ zoE^A2o9>+GJfH46Kbh#X6iJ!wy&S4PvKC9X5KNrvyqfGeJw3cgbQy@X>q>AMinZ$H zz?NY~6&It@U7LEIAG%!_x!@;KA8kACuR7G@^-p#kjk0Q&pfNPz{}XB6#e=IPOs*C0 z*t5BKc|6=IMPsqQeYP}qbLd?wL1pT$QS`Vzv@&__tduQ6tfR%@>8o3L`j zoirb8TsJp(k`>VAZIrP%G990p%$f&p)G$?hx4T4-d>-@e<&8lw0mf0jI{2IH(r@Z`FnG? zwbhP=TU7VgttZ%xbyY3fGux=Ln&!k*Ycd7uap{z%Hbx8is&ZQOw$4b>up5c}P8E#^ zGj&yFWav)^`Z7WE2~zUqLkq5jevH4%dj4UEM+#0;;6*)t@*`?v0R7tVyoPZ@~kxdcy1}z z0L503o(a~PcEP0uQI9O@*z8&FbYhMj*H5M+928`J0p2?=-w6^Spx(=^sZM2CbbKd3 z8}je(LhtXg?{6RfPkSF0LX7zI3*JUd%^mCZK z9lT**EQ@YBJ&bzJyIHzg(TI+!zaQzem@ian9q58T(0Z(T{dB4~7e0`0uDbL+t7vbo zo)*0OE$^;Zn@u<$cf2#F;KJ{oI=uVfYCTsHp4##_SuE8Kpm@eUAXo1r@gFRgYK%t4 zBk>pB5c5%uCk`)X%Tzi}joe+Ie?#j$PT(HXWI4LmTP@c2Sj1`mNu`RlzFw~W?Z5FY z-fk>SHDV(nb8l~g=jC;7VdLw~_3CvNF*Jf6tM%ROAC-Mn&D8Za>rYo(?$0vYZ^xVy zuD{~HvKaVAZE|{oPY&GO_Orf*xZf=uWPN=u^Z2cHQrjW@e#@lFZB!_uw5A0ydk++KCS1XHPqUa#Z6rWjd{Q zt%L^aA~NX0Y*>Cw1f(8t?$xD|G_UxbddE^A5Fjg?;{%66@Ob)HJB^nnCmPlGMftA* zR7-1HLK9|Khj(XbU^Xm-n08Uau|ncP(3sDpeY=T^i&w%$r*F@%m3nUp0czM<`(Q&p z=ItE#CuEe%r{DlkQ*||QalB&W--|Wszjr5KU1XGpQC`kg5nN~26LKU>!qMit@@1{> zOwxld4irS1F_|f97(>F`C_P-L8au_MHtwF`!87N&n zsMvl(iEe~FyqMUtgMksHi1z_}#s-8@c9X4jzDx>sFKh?+1f$aEWO6tVonMnfLVMIP zStAQwJv=z~^}awpzr6gS!2AFp1S-hv=WalKZ*L(xyWytLUER9)tI6}#c{2{;S@$)$ zq1BTa^YAMn_+#Ty`3oh4p)h-rpBHM~Ov5-&G~~B-?=QU)t3{9wS5tOdF%QVWJ#SGH z!h=}1f1oHp(AQD@?wvfmju)3(FG)!|C%=1zh#>9$Aj##0<|hU>m?JR&+G1B@cgjaL^3Ef}IWcjZb(dz=d{jr>o~(2d!U_dI z6hdIp+kveRA(AKxiiwC_fwJK?)DR4&d~z0M8(nDr;->F3s27BM4V+A0y|#{av<0Y* zi|o5Jg!862^r!+9fv?1!!8R~j?0Xg-e6t$>;+{nU%h_n#VxWN1bgQIlu#bx^9139+ zr-yZ%`vdwXN?+^ReWK?}c5Mgn8o7{#exQdEr!3#9nksRC7%bGcZDMlFeI%t>m28TE z<@rz3Qb|So2M0xo9gjTcmv7Q1t9S!E$rU9pKK{OaEYvoXOaNSTjc>~%o&&-COv8uj z85oW+fFy0M0pSpd)M585%Xcr?iOZwCr>B?T)iNUN+9``pjg;`~s~8PP)lkUm*E%DJ z!BW#QaX3dtgpgjI6n~iBb!w{e+!9lXi=Fbl%&p8%+bVhbX{9s?SG$!QCNc-$DbUlS zCQ1@HIaL%$=Q2Zw6zps$_SRAhM#^ykCd_D|5rO1}uc3;Wu%zQow8o$vdV07Yk{r|4 zia#A#vgmS80^HdEZ8XWHh4ZdL;`<#ceZ-JllQ1A~t07=J__;FmbUTSaow0FPn8=ZZ zKb)!dR1#%TQBkwB+iM_BI8Yn=JisT>XSwnvOxgZ=*?wt=kMUq~*)gn3Q?B6)K$8K6 z5HPq?g0wn!g$P76d@t_HcU0zAvYvFRQmNVQ@ic5S|9nDo3=k14)j)!bg!N-yS4#?( zr9<_8IZoP^_EL4O_+$goofX-)YaP{=N*xItS*U2PJ08g3&j)X))J;JoTM_^&&2f(c zS}{&&}Ew|4&PEkzyuKk@7cPV864dnUm8`i-n#EsLo&73^fF1?C2({3h=~;i zwV+~)NE9e+#KatZy+eLh@t=vxL(-#BHCROff0|LHA}q+E6M=xbgB@m_06~z@mg~Vt z;(y>ohrgUEB`(M`m;&uaZ7(!&EA$&{pEQ$2^8*6-g2HSS`S7GeuWikkQeg#%tlljF z1Z7A0l(xvHYPUaz$1;0;+hF{-?}rNA5{nX1|4aI=?MYdj0$;+f;!g93O>IT@B9Lv0 zO>>0zc2#is{JsbI)RIS`OXigj5d>hw18qPs^8h~gGJZf07*kFQ;s=tiUE7UOPfyRU zU)ko5uQ)}VVR(e2u(Lh1ov)>;|Go)@_?bfp<(u(c9Z*3rGkt@B>r=+sAwq!WXF_h+ z79jIJHEF{r?QVnPWI8Vqe;i*KtN-XBP`UYF!9 z2amee@$t6c?De#$wFFn2Gq2(gX(u7`iSKRB-wy8EGtZ$;LrJIwM=On<@8~)Eg>bSr zY+#sR|KjxdqJ96NabjAeu3oVL0vu3K=eH!oqF`Cnfv?*2*2}wlb!HAd1CCmr;LHY1 zdVxLV2o!IpkCi>aUmN$DTN591vz>u9l^F45fP5Am8!|d2Tgn(-lpMR7_0)%ltdZ?b zP=p+{0W2m+;e1*eIg97*ZHsc^?1Tlf$LmzjtP_VnDLcE#$l>usaHIYCd1cRpdxD2| z&CrL~umT_yq9~Ja<91EY59lKd=38wlIDC5%AIcMi#m%)F&|uFVhKC=z%V?dpf4*(& zxj9*@j`fk)YWx{e5|R@&^pEo|^~T5Za00$gue6!(0#V4|9wgi^cKhpvi4Ef~n!7(;SoV6r?eSgv&LlMG``>!f$f#L74t=QpcM$jTK0L{eX|zp%(AoqQFZSDo zlAltET3O_j!{(!80>G#dETQ_qUUcH|^4+pz#>r+ehDm4)4o-Sh|j)nvoAEzal+d0~|X>@mIq0jceKCau)iMwL2pwUH0+% zT+Yq?We1K7A~u429*_yYozYj;fRjYzT^{`Z1zBg^}aIc-!J zl&P>(cy$S^KCa{?hau&ng@8ma8H+Tr%KAH8+5BP@^R$33?YB5Oq(+M}K#C|({O`|Q z@|l;+M0C*$H&MW*Lim1>Tjp0c$B*Hot%(jJ6MN7%>s)S6KXvA(&A+@NaKhy2Lpyvz zBz3NqOotv$Piv<3a+B}b3wC{)g*H*)g8D1_E|41@ppLYLM&wI8gb=w?2x(hVd6T(MR`* z6uP75#z1IWb_x?eguKmA!lKAx0s7a-j$xB9F23ZKxR(xEuuWJXevrPjSs-x$z6JP^ z^?*HMX?PVfaFI=!;ko(4)$aNx`*WvtVkkeGw4YgIF@BlkI;R(6V&FKjmpq-?Uz!Ms zsQU;U@_Y@OZ{Or}G52jL4g;m_Gh=V;Pat$hZxd|K^->a38fNVHunk4B-$CAB$iUR@*;GwvGmc5IC-sfz;N3?Q4Y z6TdOkW^xVba}#*#p&&GSMF3^)`jcVJP2R~NrK05)Dj`s4+S=b=Y2uXZ&U$a_EM~~D zcgu0UO4^SZBovK9@hEhs1e4CRIA^ihrvL7^`lQW~RP2PMuuAk9Cv>~o`PD_e%0o1@)&9{ zv#@y22>%telwI)$&Nma}D<{I0BkfK}K#T-tI*02u<^nI^mIfKwee7$|sTz5u^hI6< zo0ng`yIU7~^TX&@MpdtuhdA_gFGjnO_sRFQ%A+IfmK%?cAuANDt-2#MtYNczkp?(; zfxbQMw&(3WN(fMlSVV^EvCD`Zt>((viN;6`@2i!NWA5(nm@m7Svwq{e%@z$NM%*6T zp4-c)sMhc1f5CDkt6X30%WL~)B9lO68eawWJe=>Q&Q@d(kSK^^RiEra>+F7KT@2E+ zl-JyE#i3oaM2}6CxpaOz^K`K^H0*n?eK`LUEU80p;tKRrZE#g~FmAG^0sv&(<LceUQS7O!eerJdx?068h6xeMXaDG@IGG3j-ffg3Pb-|O zZvT?gM!w;t&^d| z?{72v=Cf}I6Y8QU#OxrA7VHeWdc6EKoli6POSsX$7{tE#!Bza@G94ckT} zeFS9914O5_T<5}5y4tN@z%R$0#lr!QB5z5rvt4^2B zi=?LhHn)WH(f+sw1bE1Hi`IEhR1V9q-`@UYafhrsAz!p(VLk#7{L`s3Y1($9uAF zyBB>>x$`ZpjxGCjo$j_gmEwl0bu6ereFr|AuB;3V;Sgf>j?Z0(0K1!PsJ33eBwP%} zb>N&+l~d-tVZOEdyol$EZp42Xxi9s|3UDD1Vgp_VuXEi z2lJe)dc>ajcUiUUWgzk^rf;5(iPB|dSJ~pyqr5_^frN3?|kCf9EKRY&`!XWC8qX*x~XTwf1gwV{yg z5d%mus?(c`;Net=Cwt(Im)?xy&mMe=%rV&+{jJvc*CDK8Pfwst$h0-^+MmaoIEyGi z1n6H(#kE3yYrCdZ4R3BElBA63w7;UyKI)=XLO5xT9qa#KY0^A(>a0*>LXO}A{pAWH zPJP;nj3WRD65n5(OGS2;HrZL`pb169v)`n zkehUW+3xR>1%$9{w3ZyEFp~Q55rNGmG}ypGKf-$i32!?ZZ+3RF50%>Ae%w4gxpyWe z5&G0CgHp}Krr=qv0~mn;L&|HJvVg|8wlonK4?jN0DojxxxPLDUd9$p4^881?UR?T# z!LxR_+@CJhzUX++d&8ZzLWIk(dDl>;qw!~*$~b0v51+(ZgodU?(x@ z2F2|&Tfa#Q9LQ5(+78`MHJyoOWnnMTHrSLO??5 z#Sk(N1)Tk$?=2);Pj}DUTxR484~efrz;!m2=KsUKbu~nK*+nAcxE4p~zH?~}VCB4c zCIOj7%nJp;ZC|;xHUn?da~2({y;{%5mKLTcNF?GeAH$(&I~mJd8YXl+8S(f5WesI_ z%I*002(&%=^_9hn*$>i~0dTNEJ68_X>WgE(wxHP2D(s@$3^)5b8Z+crLmqq7Rl=|8 zUJ%es8(yyGW2l~my*3Va``l(r`}?6Zn_C>#$bem}Mrce@GV@v_Fp6K}QK&FdP_^~Z z*isrCe=v|wBulN``68T=Zgh$t9-eNztx29tVoF1puPfx9d|++n)|1et)_$24=eFHo z=6iR~l?#_v8d+2dvX2d@T3SB77&P-Dlga6Ry^6@F8$p($!{y~c&Jhw1ayVE`!{5=; zLZi%a1B65mzn`b}j@4zOQYb6=L<2)1d#)TfGIESU!mv9d;eI;E{LWPUN^J=m*f7%+z?ym`#8#50D1P9Of2E&sa zbhNl#?^joF;QU98Z^G?OWY47~+09`p`$T(-e4()t)@s0; z>%xs3QV{yMci;>ZE`prF*gT$~5D^x^2?=g@Zg%#iK9~EkrLqI7On3YGL}C&lP`N&n zeWJNA0Q}~%24Cnd+p9X^VKWyc7y{-70jB%Z1)v4vr?&sZl+ziP{G8B+_MtGizO%Qs zT5X&X0-=$RkTm}@>ujP#$q9h~6iLSaJU^w>rRRJi_izRK@m0eV`#8jMpiSuFR{T7C zO7^(A6aQtjFa_My5Kz%a0brViHO( zjPMjhS|fasI!1h+)Vky%LPBD{CMt-vU(G}16)_tTlH(R(yd+0J7=X?8;Z-x%Z_B%(smT&PAvhf$slK$Ol&MHtf_?BL9a_ZtpIYI z=x=lI!dd|#w5!CG2N3vC(9^{DnB+4hLU!J3CDev6j7XzbA`C+P z1hcG=>PqP63Q#M9r~jd}c>+hp_*U6jVnD*D!zHY1s&>cGA|d~p^|fGmdD3H`0K&&E zu>!<08%pewznzi-I^cnABlHdx$;8UVOQXZD{cpX~j0t=Pp zcs=@*{cf-FfO19N2u2ZTEXnZ!3rG!4A%47AQ!nwp8~>zmIQ>~N+;+9-@q+y`*osLl z5}~?Km=N&?*H)q{4H%;odVv+F|0A0|J$GClEL1d}>1{|B%aKVpR20TD=VOAmR0CrrO~w%3Bv|I|f%jQPM0Sc(0rz$sosvCCqTqSHSr5-VZ^5sD z3I`Z+ZpX(Tq}&B!&Uk&2XJVr~`#84z?Tn4n7W~&?cGKdJQe710*ZaiB`@qIMiISR9 z9pg^ik^9Tbi}y3X>UYe-keP=R^jcTlefI}Z-WND%X!|VPG=HHoNHV|QkGlqw!*KIg z&x-a2q(l+FW9o`5NG!ta>EOQ#)A!Al6zLB&xz{3wX(Vwxzi^({V4~<5tFII&co+i{ zB(Plmc^JmceabeW2teZ5#p_}ll?c;5B>AB^(MmxAN{+4HzwP<1@*&{l(=5VkXRxBG z184igQf{w(=7-u0>gMymOC#1Rn;qK(9rlkgLx{iV(9Vq^Jdy?hLVj+VFwc#h|134DFs084=;AkN>R zonhI2Srsr+z`~kvdUOBY@0MRtnR_Rur=aEh5?kNx_dQOHl$G=O1w*E~+=ahFxEEw% zk7ka@u5u^O=t>Kr1diYn!X<ZIn0U#QcX(AtzLm#Tya31TtciHGuV zUyE(>rqJvFMGqj`l+cWsOI{tEi9-cV}4Of?f|>wbN{VmrYmW! z0#lY#DDb4(UTzdmW|pkmIP1 zA01LYD*cG!ak+!XgG)G}u9Kj^CoGuk138VQZo^}c&V}l>S1AIAi|-DeqCo&QPz98AUQr9)*rxh>Z+~h?5xZLfr z)d7(J{U-AOINxL^)z+8OZ^(fe{WlEhV?(B$tki`Nrqg03?QW9a*6tc}#lc{T7 zhBn#FAXSAQ-X(cEM?F&-Ek7lN^+gmpqKChT705j9dmjo)S5{kX>QVhALMEWObO{tg zj^d4oFR-^TgO$Qe@zzRZs}>-`uW7DTmxuX25^45?=qes~wB~pw?h~Uq?)I$fpr@nc zl!0^+hJH?9FScnL`QfVv+23qNRRG8#5i*#iBGN)k^+%GQnak3oKQ+&C@=(&!BZ;FF zEctW$y*NBt2s?rf2^(7orT*VHO6rIR%e-CgQI)aM-ziGvLXd)%&@DyziKX&b-iuyv z2wm7ZpdQ6ORZ38pQz5hFs4nnR%=_-`)ZH?E<6nELrGo{@mHxZhFA<>4 zKVj=QiA%}5N;D7FPU^2Xjh!nS{Q*S`=<#s?zxj{v zr;t!chdleufT8x*GuDt_7{V2cj`Gj+GDEVWT=It977$@kq=ZL#zZgAH>87WTXhM$N z^hf_0y7EybDGH{6j2DZ2Cn@2oFHY3gjwTS@d_hXgIcvY z2yX!9Eb^`vsQ#c~_bWfQ6j{=eM$dKsh`E&T?LP-VqnW69B^+?)!x`QajDPK^)U>(W z)jg`~lLp7dE$xX3C%CMNSXCL=jFe4rs+n=x#j$P(tGst4-m>gCx zt9>D%GS&pZXZZfN z2IIadAq&rroh@xQ#x2&6gMN}9dnjKQpFmjOQkj!jg{z)@;yPDJfhsK;gTwMEi!a|L zKJi00-_IuL$u+H{3Q$o&K>-@Ucxy^m6IcDOU`VHZ*Yhdn;#8jEzD@rnu=uaN{p&%0 z4st;62P`fw#UFUauhUnpePKKr+JEcUyNo%)?tHgXuUQz>01>OolgcV83+opDc3DO8 zg+u$cnfx*n%&X(s(*@d@Nzz2m2v)16ma?C#hy|$ot%YGQsc{efI`0Q`{M98Q79L?5 zUpy|e^cM_g6m-q$>MHOcCp;V3jO-tk%8MNbVNgd#nz8GTG$w$s5)#RDKu5zG6f@Wz+(i$c>vkd=ubPEvT@B5p!OtMa zGbD7dfpow6XKh7Gx3bk_6|5Yf?B4+qhORb0-F4d97v!{(%|gvaEoJ`i^FC#gMHCqz zBILlVJaF=ly?}!~&Dul~uR_2?zD-^Q;lQpx8J{)k{JqnOxe;IOa$MNus2dqqRun;O zc59otv(twD*U9Dq>-ayD2O7wBuo;P9QcyP<;5!7&KPP(hrmplv};1V@(sW}D(_X?6K2g>QNa(s}OKmXd9{(^@~PzGZN8eOWO8wa^14gqA7h+ZL@_+V2xCKLoeKpUx#6v(xtg;z6^_n3~G1{sL zENo%^F7TD(s&zqZ*li;-WVlivPxI#5X$nQ~Mm`J~4%ZsUhrJHK}EBrgF zz{d`BKeTdcJ!K{TaazZjVK?*`VTsxg*Ro}xjS5Sv=S*DNU4c8wL5COvURAP&=wVc# zcB*e>`b?w$+O^fGoQDkv^tJS*Q^m<<#QXZwt5R~-*TWDa@58>w#_qC2`%dkiEd0%C z%E3rvmPjt?pT5H#y^lV=g@W&pN5EtCS?Y@5`{#OVg|_V*_k`ZWgsJN3Sq#p+V4^pe zWq2FSV#G2p8B?CrHlm@)DB*+!d>3@O((%6Y*D7M3pPikJFNjKV_08-S<)Lm;^73Ou z0kA^CU%9yH=bB=HWW^|r#CHoQbSZQ(ug`?t+zp)E)QhF@u*v53nbqBb`(ce-O^Nq4 zM)Zd*?{f6??#ykarT@ye?->yOh7+A=`^L!GdD1d}(|1S_=;VmD-K86*MH>r%KM@oZ z^bb!iY#+7tbTV$6O=v1G!cwY86fP-AMHk18NuViL^rXO(Q7B<1XVm(*vbO8ezprXH zyM#<}Sc}p}V{LR>>oyaWg%VGk&@UX0|UHSu#pCC?(U)nZG zbf{or!zHz>qFwIJuNOWF+`ji4r4@L>Wu%*}JIM}7WGKQH`RM`H5M9b9=+>X-#DK_Q z(H|RdX-+1M8@%J|epYA#FJclJDCT)|<uqA5JA{>p2F7u^?5_#SFK z>lC(Z6}}$*NqtVh=4F)C=;vpj z=|T?r{E6g=p!C)CX4T~8=5yes2UN`W{!WXvf=3J zKNucHllAEFr^t#?jdxf~Qp92ld5(|ksW2Tfw8&zi;JU9+? z+j>b!c_7XF$psh2t1txiNuQl9wRzTWR_O+dpI368)yanTSw0x53+L7l#LMMmhZ`{@ zqCney2HGaAjTz>~N$)ASJ%^K~|HG~U zS-D&q(|~?up;oz<^0=4}QaeX(azquqP^#NlQqW)UMACqd&A)94j~bcz9$C9_68chK z-w-KJ(AZ?54y9jgo79d+1Cm;4|2;|959X-PTH%Ku8a&MRzV5Kt+TANVj7@aNCqLgf z!Qaya=bFE4gT`S7aTpv8EO|6k*3_N!6j0iK#OBwmaqHDfG}=Oy6?4c7>4GoAkkldq z`r^eF1!kMN0CbH!jf%x}5r|J;bl>`V#SE!4Sls<6>AqQ-n-7=m=Uo>R4zF@{+@YZD z)DFaz)G`R=UMd)ScyMjdMo+|uLExnV1OvYaRD2hKyWBR=cc4~|90h4($4E^YQWEA*eAP9=*zk`>IB%nWPX*Z2&B`iRV#mde2j4U zRYJ-0UE~mK1ZYfl`7&}|94Bppp}_D9LF1GGJG@VSSe5hj-p3iM!yW2^oPm(qINFnI z00OW_ttQ1ajB8EBVr1AmFwlFF?3AL!n&Ku&bT0XGW}YM5C~|I-yX*BUUyJtxizzFV ze$`4;0XeP2on3vv#B`1%%IhGY*n{k+poJ99irT=U2l>p<0c+vNz>U-&MfkL%dC{(S z(H{NRWY3gr#mLxNQieniW-5LCZAS*|jb7G5lS0G7)G(>O!i3S$)YMemIQnoJdNoEK zX{RTgc1P{FrBJ<`t~&+xv@zqFN8PRV zFB#geo7&s)<1d*j#Xf&@pmdw7O0H;LzkRM!>fDqo5$|?N>CMNfm$@~X{3X(#s&tM`gTpn z&%fti?OBQR5nd))!}CPv`?blFtxRPhSL6mK{drYY;BkcPGlK(|Q9Wfne0aYb5rrn9 z&%czgqNtz(qwPg;pgE<4)!YAsFapoWOUzVZeAa!bG&)9LA3(zwm{KM-)*88o_ z#nO02WmegJ5%1f=IB(AVN<;a(P`P)005r|0{{R3Nj)NG0008eP)t-sOlfgP zO;R{2N;VuwHY7+&ZBRNbOGhqLHyBFu^Z79rMPo^XGZ;rP8bvc7MnFPMJTyz<-stP( z`ZgL#&d1j|8c*8Q;4u_MmXNOZvev$Pugi_I=cCKh#_-d`@zTWalXJ-H(Zkio^3%og z(ZTRjFm{u4#nZ;^?$W`}!0wiK$CY-;?9snWEo#ui>}*DtZb+MwaK_ci@Y>GzkaELE zC}BJpQc5gl%)0B?&GAq#Z!ru+nS06V&A{yF@z=@q-qQP@e$I?(zv#xgLK|2(4^7Lp z>)g`sNhfFY*~DKxg3i6|=;ZHlN1j(UdTT0VA!RKm8j&)O)Z%vk5KyJ34 z+oMU6sf^RWui2S-!SwR*ZBu}xgwmgb#G8h#h-j}_oPoN;u;pDjTwywj zyrkcZbfE;n60KZt0khH;p;r^M&C zrKFRvs*s70b+BznWap=top86qxzX|F+peFwyRpiieuSAuiBvC4)^n_9O?6!&VtHkV zfLw6i#I}n+fYY+0s&R0AVvjx|DVSwxzlVT+GkJVgSIDjE*u1aq-qMM0XUD0av|E+s zcdn0be$S4G+JU>jVVwQ)+@?>5eLZ!^pOUtjoRCw8!LqW+YN6+g!}FQQ`;5Hw&9|Ul zl*_`tu5Y4@e2z$=wA#zXg-^jhb(lxS&QjafQRV5^oYuy4kE>s)hijC|0000TbW%=J z032YUbPq}b{{G@m)v<~xIQ{;`{_XzqPyPP={W11i@c;k-32;bRa{vGf5&!@T5&_cP ze*6FcAOJ~3K~#90#hiy*np^hoNsIxVRMY018F*1Cg7B(TDN+oG6bWJhTP#?KV#O9U z_TGDsCB_z0%%qy$PkKK&C#RQb_x=(0*)M96`OUre_e7lEdY*HPLF32oDtqmTY+*R_fFDSNhV+5ukp z4!$7K6+|@3VdB`aiSG{`Jc=-;IH1>`5RFEmcWiUE z47Fd}D{=~TNm3|yz!XtQE-sqA7jm=r?b-x%1ehp?uZ|tN_4Q8&4;?ym^v5s$WZAUd zfC%1JjJa=jsFO<+gFqpy7)7mCQ^*RJ(47}^xz5|R+k(;It7C@`zdHl~4;?!A<8PSF z>r046qjqe?TwM@3X?PHYfOG%Ia5x;mr0|lQc3#NXw{^#|f`^Yyyg>L49Xj~a`z`Ak zhG;a(aofJ41t+H{@~3d_?l=hNCKh7}5P_hkC_+USiuO5dN1?V&0Ko5$+9W)5=upkJ z^_6dzrCrpML?!?xH#fIcJU8Fs5}{Dq;D-2|qGq^=F4XMXgxYxR@Zn=$JzoYqdi1B~ zn5`SuNkcRWwP|0`xgHGzQO^yrkNm4{7>)2LUI|GxIaG53vvqUI<-^Cm`uga>gNF_t zJ$mKM^Mh|>>lB7)6nY!xZjw_J^by|&LU)|ISSZB} zZzitYdU5E`iw>4`>((LI>qj#5RKZ5 zIpMT(QX?WmSjY{Bb9b}xF_>7&N9x)B4?zS1j^b7~4lxNh2!hB?3j)g<8{fefFJ2tF zZ12?sjoPr~sz#Hf5hcN7m^U>gUiPoJzq``cCL!*FA%Oj*WBMGEgo1@23c2T0+Sf>_ zMi_s3ZvW-ZA!T={MkEqNsUf$iIxGPKco454E51RD`xibS8blBeSOdz80}=`ZQKB?X zxoO`YymIBm!9zzuKHC`(joK(b<)i_Cnj{81P9Z3GfRLeXOKxTo{*?~_q%i9ScyNh! zKmtQ*g-8^dVR<((F){J(@|%M{eZR-9iya!}xTRdA*(nlE_YPyk5gRVEH1 ze5+_k0^uMm1VQ4d6Id&w#B35nyeN?-bf@mxvBQTCU%oXl@%0tm4*LRb(wz%cC;*^H zyimndYeIPx2ANkI+s1^Dg7X0oy8;L?u1~>MY-I)vC5bd5h0}rnbcV-{9XtHhM2bBD z(Wnj1cSCpfCjkL@<*o@0=^{XsVXrUkrHNh$E9N_JRsQ$9RM_85dj&K zlD;aYl>(*b54cZ?L{R}zNxGCbFl%y!;zzL?60w;B6fN#-I)J_-Dt|3+<*t*?*`%g4#qhWXGq%R|h z2a%ZrRZI%t)2Nwaoj6}bs)z@|4k zk$nK!DMx;JV&c~G7cYMNa}H*cT?o;rO*MN(Fol35X4N>8!XrR9EF{UR6#Hs`fII@| zR23qPhD?Cmrt;hf1fD`8igK?@=_gPK6pFaG0|tN)C23Or)v;R>U%ff{;)gGO<7~6T zCLWDK@5*tC0s=x1%*!ox1BC^G+~5LV3RWaa!nuJ48%Ize0zynvE236Zs6t$qR>f3P zC@?JU91v3o1c*TH$(0{IeE8N^SB}0o_{EnxJB%67sO|es**pvuhr4b_JBWptb$Lv6 zl!#|*`rL6iLR1ok08u2v8Zs1`81i{Sls$L2VBhGFC&c;zz*AM~@`5oK}@+1^@9F`C@DQUg4I4%ag z0;8d$A9W*cIbKe$sQR)cR8w+<{z7`h<1eE9MkTif-+7k8c4-ZgB!8>&!) ze;nK2SJPONosl;%#blOtQkGl)Pg|HXX#=2rz`9`>)~nw{ri=jzVdj}U8z4oY(M=pX zeE7=27l)1>J^JGp9S&<1&~ZzZ6Pbc|HD}_NAAk7rmv=QaL)N-H7tqgt3J5bzDNA)W zK!{nl=yCFX1`~WQv%3>QA^?J&uFH-czWnCk!7I<7zj^bg-`2QCMx(axxeyA29|B=( zzI^@q*6Z(oc>VfadAo6Z3fWnHEFc!ky|dUX#<>FzOLAX^-5g07W5N*3Xy_;v6Tlj+ zcDVrZ`0$IPU#IPH-m`Cy&H-5rJ|A$0<(#bw!s5FruYdUE%B?H6USFQj<-9jfxvzK` z!h-$)mSikOW>ee&9~SGDeZp0F@=g%|BvT3pm=p*LVF`-8oUed{KV9CkVZ(;)+qZ*Z z=UMf|6p)$ZsXZI8B78qAaiW7>dfCf z&NhxSVVLYT+=2i?5IJ-RXbTq3xh?y?kY2+wuv< zngMr40YI2JQ1kBfm+#+QlW}wfgO(a|K`o*PKwsv2byj&}TtWa2=1tW+rg?lfU3YS^ zRRWV4U7fbyhD>o;kjueD?%JA5;4)y*&L~jJU}ncJU;YSOeC7E>hRNJj9Dw8{8NxCe zAPC!=yY%WL?f7DY*d}1>%dp^JkDC|9ztxQ~VMbd9sP7P#3`gy@I5^8LU*_1QsYatV z4QZl~D#Ofq_xgu-U*3BC%MWibMovoklp7Lx3`Tb?R?N&8mQnP}53hgt^7Z@Im*2mC z_rqnQ7)Zi{%S;N1HM=qLq(^Yrr4|XYW0n{%h0#1{G#brAdAl*cR8eLGzYin5pF!4K z-G*}9gt1GGECbq-m|4j&PrU!_$`3!>nz;4m$M5+8JctZ8C$#lL1MJq?=FtV3@`j0t z#WLXDmZC6P@cv*LEtp1AK45p1mKjUM5F~Cc<-smFTS57g3r-pqEE*(G&vZ zT~fYG%idd*cA;mtfWyI@I+wF}Be%Wi<>N3{KUY83o2Rd*UFf+kAaZ^`vbSAedHk?k z0z+iq0(qTcH+%DX05VT4&CKRWkX;fiX}R$rJxxcHUD$i>s^!L|n*h%h z0G|I{POK3Kf}*eY^z6o@H7>PCV3^UYl@BB>*mHV`04mgg@7^Wa=^Ps%K{CFWB1pNo zJDY!ila>}2!#UNn_q&@)rK=y{1BgdX8U7xZ#{GNT?>$HMVlX#m$CxmgQEA|eyR`2@ z*%h#8r-A}wt+S`!hCMC^-6#$RiA^9wcRT$~3`yXc|NeK~uRTZ3`}wWlxw`tLre^=W zqOLfC_+8JD-Gap#%M=49!v$Nm3}}k%dFH;n7Q@V{xhKa*9+%t3m5{i!(IO~M?b%u5 zUz}ds9CWoO^~m{EIskaS=R0FX0HLk?NNUfom`nGD7-X1dGHl#>@girteF3kEcrYxv z@$_wEWF+YJ+;KR_t^exFH1M;(8a+Feb+v1%&Iw*hw>;ebMaDGWaP+06VuJMDKGl=hD8I^xt^1AeQ!@{>X9d( zDCnA++H?NbUsI2y9!Y)q&0Nud!m1dPZ$|GrW#9QZ*ta_|C@^yd0G_=u&MbAqEjP@K zr+QLTdyeeg*>fZ{HT4Kk?}Lbb=TlRU^nh26{O$46#*8U41LixRwigXK*!c)&*9j*w z1-STpWaQcVXL`pc=GX}d1=&?9_wRpVgE;bE`CR?>`#m{- z{)yl5)HBNu&PW^12>0x`!LJ@)Sh z5UHuD=bwD2fXjG(et!FpBeq}pG_7<&mtPIai@nbf(WuSr-5O**RX6+i{OyrN6N9Wa zj!R%N&-|@&|Ni};lLnxl00Lk?KkzDeUHP!_IybXIZ{PE|6~ImAok3JweLit$CW zx8I)5lTav3A-$c+V`jVz`-t$<_*(`jJo0cTPkB!wiZi-jfs|ZOsOI5;tjlg!%qr zBggXC&xW_cN29qam42>DSDGu0<`)c1d3u%=?i1g+K7iYbb|!(b86(}t)00Z2MsUIG zoL3xA)!zB}*|(RTd3*v$^HaLseyntT7VH5CX*61JuyW?AXBI1~V}6gF7hzin-gQzS zAy^y^07+8%0FwZ@sk2D2Gb1#m(jyqbqb+BzYuK~*U%&hI^xQ*)4giLoo~>quhqE$T z?0;j+7J_73jvxw>Dpc(f3J&6x_{RulUj6JByaGa_dAPdLl$RRcfBp51hc{=QhJlxY zJ;F}k%fW}U!i60z^mPE-$lfi2AqdNWgm}coQdPNxfP)z6S=HRedv}g2X@1LifY0OR zX+PS{)6ZsZ|Lxvsuu%>RetNGQAI@ThOLJQ6xtUu5bm$0;S`9%@Dpg4GGDGe-EW{9I z@w+MMO*qP{Uq6eEZ$K(_u>G>ABf#&u|ut6)wzc@3eQL1&-RQoF)Mvub4#z z0tyon_$D!ggP6rERiU)H=HA0+$}livvl(!?UodU|+&6&m+1zY-7d?vw%(E{y&z_ql z8{kHn&BItmg)NDNdXlyeOvxD(VWG;CC7fTnH*=a6=JA1%hE$fBlW)JfckgOjTN^#W z699$}UaxYt`+cab<-o%b#PIdRBYZ5qG#LaT7RxJ6Ad*;Z($=|$vvZdogE?SuFc??@ z^9Xx*|K!_W?=_Znl^F{|0HD9=`hvy2b;foOYg^};EcDN|y5X=m2BnN2?@6j? zojV(Oe{Oc>G+;y^gO$qLPv>SIoP7K1Y-3qjr!fQsp?~f5i+0WuG-_M+UJY^x!Yg4d zdpL^}K^%}kST~4QtSyvg>5JwfBS%IaJe-@IdwTkDuu>VOeD?6(QseAg39~4Me?sbv2bFS9r2K3#C9jes)s=iXX!mz5rsJtf*Tgg!0Cye7G2HUNMt0!czH2~&F9y#3AXw@(|jdQSxKRNf@pu4667 zExAr0MX*?g)Rx24WEP1;l4{!}kQ){UF+0-|@P(H9Bg=?j-<)D8h{%c$>6p3w&F$Ma zm9((OOWOPp09d?`B5{bl; z(yPE}4Gv;v7vlZHJrjtHcOuV%P#k$U6z`8I2w6Jq8WskUn&xqHPEYqi0MB(WCX4Jg zTLne>+)9d&Y$?J@#se3Vg!*hTxUU6CstkC4fB$fN46)|MgORh5Blj^0Au*Vk#@n~Q z`R1G39yFRq@JuGi5&)P%R#e%mCj_@;?mB6(NR1h_2^f)(;K?GfNK|2oxk`fEDC1=( z`}q6&`}=stH_;pKKRA1z9^xO8h*`S-;Mrqv&P1arXEOPEPZlYw`CJAAp3JtBgvdE| zr~+K!#e!ZMNfCWGiA4%w#TRsNEw+npl5sWy=!xrIQ{?59FjS zIPBqYY+?wDl+|!9gJa?18~Orm1dEhqUC3am#d3GKt0V%)&G_&dil}*ITB<5O8w27QgJ|c)IqVTG>DT z5f@$&J9jqn&MTy)4tr^i6<|7qEar*35*UUx8FrXoqEQanJ4I0x+Q;r{;N{{HyF&VT$2t4$dhj4f%tBo>VF;nZ&}gW@nzf_3(35jtp6I$|W!k zf+cx@wkV8OP1FDPU+I7S>wFG1zIEx&{Z}9egTqc2P3M$fmyb@eGkwWq*eWXDwbmGID!N3E4c7MK)kKUBxkWaGiU$y zWWTGc2hET6^Zj-nyIn$oU`Zc)bTsPGnU0?8Ml)My%(1lh1`L!FQeKUm4fgO*eq%AF zSQQsBmV8zT1BT)L(A+g&DBC);EFc4-+5{BF$52@jjZfeD(L8|pg}tnIFwY9@3*Qe_(% zJac|!KtOln$k~yR$g>Xw;}SIlCtWpAv--)*I+HcDZ;cWH0l`cV%OH6A*gQFP5Bd5@Y2XYNivdSv3{aAzL8x}VnW0{F<*-V>boK^`n=H}$VcLR$?)QiK6f zS<8TWe-bOAeC9mZmakajSZ}GpWW38{)X@j$%WBgf`4+eI4L+)@Y`I(8%qbt$FTGln z4@8ZED=jdiRIbX(g2|GB6Y8}@A=s?9J87a;1;m5>CQI*0LKLLYRy3q3ziF&;%br%V zt0Yt0T6c9odU^w4zUoYOe!-dC!HjHEe3wpO-aRSBH-O}2b_m#6@eK@ywWxF|H21UL z@M3GEHN0g3Nq9V-N&+7CA%(QgJpt?gGN8xL-!!^)w2JH4Q)2#@Iz2rgAb>EM*Ecxa zTA4RwFjX4`DW{^E@evUvWU{rlC2(308$Zf}d$0ESMxEn){&KSQsz`&3&3VoKBp*DU zL?sDh{PB2_XZ7r_%HS0r(>#LjTihx6k`Lb`Z5 zd#E-5n6J8au(hi4QEhR1N_&7bBm%*cN-O3CIr-Xx(Q1JXGtf(B=czyY-U4#rQltU* z{1_$rEKeI?LVO7L7?Csggho?_g(*E~9^k_r)o?~bx;ov`2|SFL_)JyHqvl7`*V6_o zY;;0tMWNhKe}<^)8Z}yqFr~di^nRvMbC>Tp-_;$tm*c7CK5Cp#Nn*H@H z?b*x4#+sU%#>E@o-swDJED7j$&!}GoRCo8a6xRmSw{wO@ZGa_ZL^&}ot}a%aUs1^^ z;-*M)1$F(QeV>)bXcT(O2`7yLCX;!^h1v)}2$m5WD2dwm^pZuFQ?+pJ+{Fv+5X$ghv5<@F~m z?D?F{iEW^zVZdZExss>?fFu$%D<;GS7%`Mqw2(Aus;{o@svj$zJlD?Q7pnsTd{_Ab z0thYR^N$`q%I)LSjFyy83)mcbQyd^1Y$dANO8Bx4OfF|=O0k>$IZYSn^)H5M$YhAo zP%SI80Se<25I|2MU$)>Xbz9~+dU(trC;c{dK)8tO`=K=1poD1CvJUm(;&@TffAb|J~bIRUHeN%N^ zscE`?e5`J)Uhj2AW>T-x1^D{*2jIr4TIvgir}NtHrljf2mHgpB1W-kst_M!e7sxm= zPCZ%E@i`5HZ95zVlgUt}Q4kXX7Lw&8#tY-qE>0!JbdL?s*Tpq8HANRxkB^zSE$$!W z^Y!)Zr}uj;fR7h5&W8pg6QbXGXs&PVpX-n?-SY@HWtQyTXcGpjz87AfrR@M`>acxRJHQfLJ3ff6TK~%zO zxwCd^XUFGsT%cP$=LE`NrHX?o1PX#W%>oMI@gWI<`Le{st}}6U`sBd`ub?KjrGOuc zCzUie_^K%Yvp>DIwl#0QyRxgZGczl`&7jj3sQAW$`IfQaz=AU>t(KTySr&*PPVLox zW|`S{0RXDYh`XHgBYc31R{?z@h=vk#)tcd`%s0*vPLC^ zhj(-qv}ILybY!-5wG{~Xz`gXqKy7y%k+0QiwZsCcO2D_C`>dly+xu@6Fr&XKaNAZ@ z1j!bI;URdiD&sw~UcjHM+Vhz$>(=W4FumHac^f~31YC?{F;Eci6A^2O zG1iY(Czh5a&U+sKR@T8r09TEa->GkFi|@?f8?%PB908Ib!0PL#-rH!42! zy-eV2L=#0}G{ji8Z!{n~l4U@kpifAQEP>B$O)RVI&WuC&q7$kO;UDwiS^1rrLg_F^ zFjOSKEdHJ%vq?w{JX2qvNe6(1WwMNOpZPozFjY7wf*I-hJ&rpt37$wDv=wS(F^T8I zG)jCDe3Bk8-zg>}#A3IpDvi+gba5eWc z2Q=WWR-coVk)FKA(b2guf&>(_t;I+XvSi6I(JHQGC_nmujWDrIrTrK%A}hlzm*-xL zf@;&92ISu=7v;+m^0l@<@Kt4jI>YDAXTbaXL}YS*@)k#w0}%*r3mz?*e1 z_QDkXE=SZxPCW22l@)_TAXt|}VgwvwbWo626Q8?`=+$OOMkK_CL}ca5IL7MAu2?}X zp`jtYq2H;q@#hA2>?Oc^U8fiIKEV!NbWUR`7JU4!+pX{LaN z^z?L>oW_%v1cpxl^JCX|vh6T5$*bS90fpM&oFBo$lc@2lL5TMe#t7JKwinWK7!>4flneM~L1uADmv>@f^nt|8vHaNSv9T6T zw{LoSy06B3=j_=Va{3A$k*`&)VXR;y+=RIZBU^?I&an|J5=oc|vc+bsh-d+uO}D`X z1w{vPjDH#Ih%GMj203#ex+yVp%rspX*JNlVG^F?Yx|BEm^8USHMMJ)sZwy@HkQzKY zh&`DB-ZzNagh>big+}j5T2at5OD+RZXmc@N)>&3Smq{zVqrH%_I9)oH*%a55n8@b` zr296M)aJ?(V)Sh}0t25&1f7GKzD5CU^N*{!$k8r(7aQ+MB2o3o&e%pM)e5*ezD+@u z#aJB|$QdpPI^YceqmxSuo0<|6o8p>=>86Gfs(*94p`=2X-tN4G6G$|h&3rCrjqfP7 zh2fSIu(3v?wmX|6Y!a@7AxW4Z(6QNxLEb^$-gLHCB0Z2VO+Mi5?d|2|)ihln=M~-5 zR5)FCfn6;Or-nE887ibwYt2SS2aL?X)^RWncDS4Z2$9Eypi!Im86&_6>`D}Z_9jry zW%Gl)y@L|ji9vC6c5BQ5Z*Nevn+})?5~C9{yG?x=YG8{>Boax;7qD%$&}89xD zWK$mBz~*xbr6g*2bFM&Uv23wDl>+U!`ryR16K=4DG8(l>V5SPGnF%2*1dl|`;s|71 zHr?CXTjdoLOV??GyuH1nySpmK<_nvmz2b)RWOO>6&#@_(F*M}71Mw&rBa+#dX1rmCDd8-goZ|?(LroqIfro<*KzrKS_r_<@27%7$NSu4w} zTfL29*T+xF9cYFYPj)cTiAbbhX%&m%%k4 zd|ZQ2TCI|&S!!e$JHAcr-xH!yo3~&x3gW>vG0%9JfzAd|$c_e;#oI<0XLI2?L%iv(A7>0y=JX*vF9>s?BUJT_z9Y2C|9Kpu)uR4cdZO zzy_QfD3i+r`Q{2~gpg#=SDLwWzHH5B*#A956biLr(>_C{ip>QQ(gOq8T%wuJHPB-_ zfU1BHh{snY#&TIgp-@VXt;}H4>1_L5iTeK_g8rsDA=bd39->cHkZqhbLl`fE}b5T z;K?|0dO=%77CTm@iskAngu)8Fp}K`lXB+wJ`f%8f0UZpL(q!-CXh0^HbLjvOajiin zm(kgk6+&qy0?5y=pbDi~x`H!wt|~cky`QhU!nXrcFbZ0iAX^y9bqF6@$C1nBLtRF5 z1yxv~4+MZ_qm(KXMzD?59kI#Y$!vSyq5k)L=v_4>ZAf8G)`B?X$mJXkfaAz?y1aQq zA#iIaJyxYs8R=9ZiCSUgR*pv}dnaq{dOP(03b={WRg!F5Ig&vba@jHtU}JN+Z1#Mz ztXe7*R>blFpo$ysSz;Y6;CGv%lM4&;IqP2v!A_uKv@05EoxQ!2wQM#LeSnkA)@5{` zF;JyaVMGSNQ>nO_4U>xIYC~CRa$#Yip1=O35RGz3sT@Ss4#bjU`G5=8T9ft z4blrrCMS8N9e+Wrqli2?NiK=yH`gU5Yh&Zh>s$)as7;pX?wG_?wrDS}51)7)$Sf@j ztR7WNDoo3O^W0J%nK!Cumy~)H=5zC7*6SJ1D|{QAJ4efqx%skq(R_|J2+TI?P)005r|0{{R3Nj)NG0008bP)t-sOlfgC zF-JEgMmI1>KtoGFAXW16_dXd|Qdd(%UraL=L^BygGa5xR6h|}|MK=~jG#EuR8%8!J zM)>yo?&$hG8c|R!N;M)z)Xd%5)Z_G<%loR<*_pufyVldh@a@vW)5G%6!taxF$kM^_ z?$W=}#O~C^@@7Ajm3GI}$M2DG#*=fzl5WFHEo#ZO>W*u{YeSgN!R(N6z}Ct0?a;xN zcE!S`;?TbD*vs(o*2LY<`|0HG&A#lJdd%>Fw(QNl$Fb?{>hU`nP-{h%mUhfWBw%Jj zkHxR%HV;fg9$V_jx=Ji#dt0YpJ%Q-Lwr@?9fnct$n9Ex@epxtoPAYE1s^&fxSK7|@ zhh?{nX}s&tz@miC+|lpg)cX11%Z6pJ*vj|z+s4AI_-+inpHIVLFeOa>%`;-fT&aWI~06Yo6fN@TiK@jBd23jme)$kDZ9Fl4Y`oX{U~K zsAx!tpn%9-IEF0=K%9EVeqxuCd9kyX)}DjEQZHoc(Y=;-|~xepn6%J z-kguhyW>_eeOo(gfncJQfTgXG)p1yba8Qh>PL|BQ=h4OJ_ldl=qtIYLbHcF5OCwk4 zeY5AIl-SJbbyJv`fwqBYlfA3fS~gh0uiR`3@4u??%eBj~?$~pxh;W(S z!?~=Gj)rDlKna#Cz{TY1!; zm8ff;fJJ+mS&=?ng*cI+HsIGlxy3B6w<*@fN9gM%*T!s(sZN}fY5)KL9&}PpQvf<| zPbB~T0R$A@ub%F{{m_nI{{HL!f&Tvf{{8(P4*lW)000SaNLh0L01FZT01FZU(%pXi z001BWNklK2RamNljNASoI^>28+e+EFI9334|u)*K|;rEV+twTe|&0E&4`~Sg+a&-Jx&wWmT zLTtQ#^7r4*46Wa=)gJ!&-$;i7-`3f$-MVHYuq|7++S$XzpOiu&)@{!3`QwN0|ML4E zHQ#MmWB>0Wgb^I=w{CG-ziFoJOjpBLLqpe@wwdoXZ`fh;rVY^kyZnnMFCIAX{r7+Q z`LAu8*8E!t!K*vk?Qq&u)75eM*e`>LeN{8mxD4aA`EMaA+)+$;6`R`Y0C{;jYtT%1s;X z9Krj50egB*9^4Jvfgk?5>6?2Q;H_CdG&U&Q=8{doFqv2^*3Hcg3mBQqcphYIbl7!n z3hA^KMg)Mbu3tQ0CEWe}NhimDO7+#{LpW|-Kh(5yn~M=*V%^+uI5(?d-Eed|&JBxY z@~B1^hhtA9o7bXH2)m*Do>$lNmjQPll&txdPDY^+_8UZFJGTjku~;`8FdLtn8&ei1 z6ENvmH#anvNod@*b4;|s9%298Y){YZ>_@-@7dP!#_szVFLLs(p8W`N>V8mi!x=(;u zH)dQ_WWZhv4t6<~2{k$#o8Gj>(dl|m&+K(8;DG}NA0M2p`DPlT5RO|!V_b)9v`xLw z0kLj$IxgNX$KnR~U_=*ThiIeI$)2A4>sG$U`PXM3A2_+?8v!~Z)@>L%=fEAd#vTrb z27I5K45Y*1;<4CxY%JCd>xN~r9FEnU(9-5?ad5g@p#w(WAr#-Oc+gC&F? zF2|sa4~u2G;c~oj;29haYur{)b~FFLf!P;7+fw<(#&3|tD1_sNnq3aV1miLv&PIxb z0j=Ksi0H)qqWj}OkSU-e4ph}bH+>`-qM3R!3Z zn$Q9h63}P@otG95D&Ic=y7jhb+Q&H<9D#ry-gd5R_P{~dthIWzFUTl_-KHlF^;|BO z3!x!>|0E8BMiYQ_8gf44`z%xFi>C#&%q0#6{1tcGld_8kthW2$?w>_=s|$!iI64i$ zc)~^&OW)s5rxE}k#Hvazr=x9bXzK&)GGRvxCMS4-LnS~gq0nV|X!hjEKW6hUK0a{Z zF>;jw9T963gH{2#Lj7U^o!MxF0G}*bgI(qW1qW@_4?M0OT|m$lk2!FSFkd#kqXlaevY2QBfv!m82CufOW)dG)Gi_QfBo4!EUer*POP(Wyjxm<4FwvMv=p8Wj${GL~{Lt9s~RHG2~n>rlo_(maDC^SOoj1oN$^sCDy2ZGRODx5$Nh=7I`Dv!z>DTt*Cxk9SZK?hpHSFc|6 z9BbO^2jxAWgK|snz9;b3dPld7}aP714K@gg^gu|dAh?zZ19~(#W zydlfZnj$`5m5+)Q-ec26T<{A z5}P#%r!a(?*tKDhgbC(b)oh0qbPre+tH z$^-#MI791NIaeu3pz5ca9Dq%EtbcmQmL_pSsYkG zp2InLeoy}OlNS#hJorO_XjKSNhz(s1+2H@jV5s`BaXQ=(Lb#T0CX*#>Brt(~pc`xi z#hc1msNi7GXt!)3fqtW`pU$IFsdP(mFVNp6Awc|j_rZhzaSjlEJ>R*kuY`ZWs>BhrQd9kAvaGF5O#+~x(J^2?8?1o#f{}}uFzRMbdJOD_As9nf` zsivhxeH0znJ&pqx5!k<0L^K+r((@Ec94uIjprf=W-po~SfR725?p`=XFa(F`p`QHw z$GhRiaQAzIGmmLO6|CLy*V0(ev)Z z#djY*yt{a^tG|1k=>}him*qpF(bTB+6TislZa5qPM~IsG$#m~T7AzsIc~o!parUmT z>#&56hmc4la{J78U*}{L0_D`<&}Ri~c=7Z1v+rhqzWCu{Tid`NQ@vOW+$b!!TGXhe zp$li=aRY%sZ)tnV-g9lH1w*Cs=yh-qLJ)@FFaQ?v7Z3a#wq`ACUkkYIyK@eGObkfI zmadZ*fBx|9L(hlVi?81Oa59TS1zxo|7fscVD=u8?=3oFH6gB#b$=}y1A&-z(46+!4 zAf8K87-+h7uhO~%^s1MwNlfJ(UXY6XRt_lZU5=MmiYF@v&^~(|m4fvw8C)g1Y5v~vBiuF7mWKs3g;detd?vjXJ z1WXqzP_&hzYSH=c~D&Df>myaz#VYfJT!ap#g0|!w;T~`ZGb#Z*2xdw&tB|# zck$i3o72iOV=Z(l%%`7>BVZ0|hhD!4G+mnFpy>oUAxhiEj_~#M^>uylTA_sqaZ-@R z;Lmw34I9@viB8^JyLy0)u!0bE`sDXNf9QF4{pX(i{G0Fc+jtNaqC%{+JctlgG<5Ba zzen`*$|y7)M4;}HDZEpvq@pMdM<_mA*w!3 zF?4eF;=6Yr@?Xrp`r$*3mJSiLl4;=9?`dfhv|fdT8MC-hHmzxKd`?duT{{d^R7SkEFqi(ckq zySm;xp-xD$0#>$Avj@KeOQuy?Gr?uXsvtxy57x#qadbMs1{qvzB0l6kAQFpP7;epIdBKV<5VO?mggoH*POV2=RqKw{d7>96B#*L zv&e!D_on=6if|p&R%x}T2cNRpuCBhW5AKJJ>ZuTcmr=knp8iIFtTdXs$O_2hWU17_ zZ71Gec=OQL)z#OR&Gra<>Uy;zigkENay8mD!k6tE7~#tXc(A>hSO9T9T5SZTxJ8+=E{-nS^$`q zm_^7gSe=X9KPwoS8+0QUp2Se2itazy6A05;tFfpNWNMYt*R9=io|f!vlm7(dR{716Q9$yZ$S_hxd_G z0z`lcLuAk!1 z)s_9=c$*%ASc@uoclMxUHHU*>QFjaga-P3^86ExWBpoOS>HFbk%1Yzv%4P@NyK~57 z@`a!91$=?`j_iqWb@hmd@HM%bekyB->VsGdiVa=dj?Ip%2xw~-fPkkw?mT$j504EX z`eIvPL?GMb3MeD|kNkGw!i5WaB5Ym@#Y^*6wH;T-_}QN5tBiUD;GBr{it({yT?Wk8<3={sR;> z_3ZX9NYTWvSD#(Fef!e0tItoI@OOoy65vIc&dY};CMITvMDjBE#EIkGeFOq)+6l3x zqhWRT!5k4=+v-07Ud!T)Ljdq_*7MsZL~?mqnX}y4xeT_e))p1;vG1Nh%E5DTQO&QH zO!wOgv-=KLZn8&g`1LE7ng0y9Wq@m>QaJ_3uk63G|3Vk1e~AMTApO#bXw#|lzf2&V zot>RULnod;I~8cdgAsl2UOIpE>iK84_uMj_I-a66M)f1tARL{BR{7wJBVx;xaF|Ms zJw1Q+$esOn&hY3(i?I-aK&?6D>wn8*&#Bv&F5N!$)YoKUf5zt<5#h_e1iY-753J)4_8N5KxeM{Qk?c zZ{|ihJkE`-C;~NV>bz;sGGO2*Kvxg{D=%Gvg77Z`1AXt#Pfe$mmxqA#UF|bHU_d=6 zw5~3T=Fh);d47z;!?q#>f%tD^t94}NqtnsFSkDOeFXII@bL9`>Ti`W5d4OHX`as~=2{h8 zeZU<9+-#sA%VOZ?Zhw3J435df$w)~x9esy&=WT?5&kE=P8{5OzH^Ltf1_lP2o^59k z8O`4Y5CtbOSdp-*C`5kw)cgz>)3^~S;mEeJj<8F&VEO)m&%-LFzrTN=zkgu#{RuuX zKwX#e4FIhZ^gaMckEG#=jD)(GaXOPp@6>piuU(xO8oKRo^{+qNH7o;uBJ}t7XTLqe zC-O6Lb>9RKo}hye#PGfF3E}v!+4-Kj9{BQYHMq2J!(Bb z&9*{%_(xxw&vhs9y9-s{0MHS!qpiN43ij3oUha4XgAthlmL(W^IYqtw!b3LO0~RU5 z-`6+7mw!r7y-L9!sG6vr}we7|+8a`s~~7L@zI5Kzl>QR}b|6 z1)%+=%MN`oU=9iJF%r}@Og9Xgz%zuCZ_FRRaLeTHZ;LzN;=reO&-y?0VB4NCML(OL zpm~vqMEBgTrd92vVRJ-mRqo_cAp%68;)yUItvLlW)sQ}tlA>X>&ClI4v1@IJ5fKp{ zY_^B5M?{2&hevI#Df-mg`H5ma&C82Os-EgtGqidhNo!?%O z5I`h)k;C0#z@~zRf1W6O)x{YcH>v<0Mnf!bnpMDCyY3`k3IC*i|udf}}( zTwO@BNZt1K(Ej}}xECoPh@x--5Zw~Fh zbLhRZI)N++2mpZYn(zQ3k;qr;U_fKn(&2N~u?KMR?faL`)<#EPImNy*@g?Ip6vEEA zU|YTQoF(7d$m7)nYda7WWhzyLUAX;SCJs# zVLl%pnb{R(m2eD5NC7HpQppo@*Y2kzkoJblMG{R$u)#}%_X6*T91fBsyK9M_-2qDo z`rvDGwO3r9-oAAA%FAb800;}{P>+Go5P=X$!V?(`20n>Gq!DQšT^Ad0}MDJB< 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 M07*qoM6N<$f|!q`^8f$< literal 0 HcmV?d00001 diff --git a/preview-demo/poses/void/amused.png b/preview-demo/poses/void/amused.png new file mode 100644 index 0000000000000000000000000000000000000000..c90c81c50c67b6ea29a350baf1459cbc7c89c4bf GIT binary patch literal 4795 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 literal 0 HcmV?d00001 diff --git a/preview-demo/poses/void/deadpan.png b/preview-demo/poses/void/deadpan.png new file mode 100644 index 0000000000000000000000000000000000000000..6dc8083da380a05a9109bfeeaaa194c0623da2e1 GIT binary patch literal 4353 zcmb7{E^-5eW%FN@8@Ul;osA zBqe@6f5LO0^SQ5g_c_<~;yUM!($RiKM#4k_0077kYRY>5H2)voVEljkZk_4fKiSpM ze5s=8=m`c9@^C9ax|!wYC_|3oTJkEn$=}l^O*x1rQH#;z>hC_MbY`O-~{~g5C&1$@|BLUWLb= zlS+(_T3(LRa^I7oR+jKCh`!<};eqQzUTUxsGYI(@eCtDlbD@ob5fzCONyYxXh-W?_bP@p1SWv1f>Hf5(Hq Q6Q_(r3iM$IO;`5qAFioBnSEX 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 literal 0 HcmV?d00001 diff --git a/preview-demo/poses/void/glare.png b/preview-demo/poses/void/glare.png new file mode 100644 index 0000000000000000000000000000000000000000..70860e32a48ddb75da39321c2f6a0dc9935b660a GIT binary patch literal 4581 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 literal 0 HcmV?d00001 diff --git a/preview-demo/poses/void/neutral.png b/preview-demo/poses/void/neutral.png new file mode 100644 index 0000000000000000000000000000000000000000..aa2283a94783cd9657b1cef6790a29761bd64245 GIT binary patch literal 4190 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 literal 0 HcmV?d00001 diff --git a/preview-demo/poses/void/point.png b/preview-demo/poses/void/point.png new file mode 100644 index 0000000000000000000000000000000000000000..5bd2207a8b41d988aa212eab022cbf7b1efc2e96 GIT binary patch literal 4900 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 b8SwuARo;;VyX24q00000NkvXXu0mjflLn8q literal 0 HcmV?d00001 diff --git a/preview-demo/poses/void/surprised.png b/preview-demo/poses/void/surprised.png new file mode 100644 index 0000000000000000000000000000000000000000..3dd340f8077bc96b7dd3f556551dc56c6d68ddee GIT binary patch literal 4908 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 !a.startsWith('--')) ?? 'low'; const file = path.join(path.dirname(fileURLToPath(import.meta.url)), '..', 'dist', 'config.json'); const config = JSON.parse(fs.readFileSync(file, 'utf8')); config.backgroundScene = { ...config.backgroundScene, tier }; +if (demo) { + config.previewDemo = true; + config.defaultHomeserver = 0; + config.homeserverList = ['demo.invalid']; + config.allowCustomHomeservers = false; + config.featuredCommunities = { + openAsDefault: false, + spaces: ['#gamecult:demo.invalid'], + rooms: [], + servers: ['demo.invalid'], + }; +} fs.writeFileSync(file, `${JSON.stringify(config, null, 2)}\n`); -console.log(`${file}: backgroundScene.tier = ${tier}`); +console.log(`${file}: backgroundScene.tier = ${tier}${demo ? ', previewDemo on' : ''}`); diff --git a/src/app/hooks/useClientConfig.ts b/src/app/hooks/useClientConfig.ts index 7a0586eb..6c793e65 100644 --- a/src/app/hooks/useClientConfig.ts +++ b/src/app/hooks/useClientConfig.ts @@ -21,6 +21,9 @@ export type ClientConfig = { hashRouter?: HashRouterConfig; backgroundScene?: BackgroundSceneConfig; + + // Dev preview only: the build answers a pretend homeserver in-page (src/preview-demo). + previewDemo?: boolean; }; const ClientConfigContext = createContext(null); diff --git a/src/app/pages/auth/login/Login.tsx b/src/app/pages/auth/login/Login.tsx index 2f04a733..9d890bef 100644 --- a/src/app/pages/auth/login/Login.tsx +++ b/src/app/pages/auth/login/Login.tsx @@ -36,7 +36,7 @@ const useLoginSearchParams = (searchParams: URLSearchParams): LoginPathSearchPar export function Login() { const server = useAuthServer(); - const { hashRouter } = useClientConfig(); + const { hashRouter, previewDemo } = useClientConfig(); const { loginFlows } = useAuthFlows(); const [searchParams] = useSearchParams(); const loginSearchParams = useLoginSearchParams(searchParams); @@ -65,7 +65,7 @@ export function Login() { {parsedFlows.password && ( <> diff --git a/src/index.tsx b/src/index.tsx index 4aba7ed4..2dbab4bb 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -52,6 +52,16 @@ if ('serviceWorker' in navigator) { }); } +// The pretend homeserver of the dev preview: built in only with VITE_PREVIEW_DEMO=1 (the dev +// workflow) and switched on by `previewDemo: true` in config.json. Any other build drops it. +const installPreviewDemo = async () => { + if (import.meta.env.VITE_PREVIEW_DEMO !== '1') return; + const config = await fetch(`${trimTrailingSlash(import.meta.env.BASE_URL)}/config.json`) + .then((r) => r.json()) + .catch(() => ({})); + if (config.previewDemo === true) (await import('./preview-demo')).installDemo(); +}; + const mountApp = () => { const rootContainer = document.getElementById('root'); @@ -64,4 +74,4 @@ const mountApp = () => { root.render(); }; -mountApp(); +installPreviewDemo().finally(mountApp); diff --git a/src/preview-demo/fixtures.ts b/src/preview-demo/fixtures.ts new file mode 100644 index 00000000..77e6104f --- /dev/null +++ b/src/preview-demo/fixtures.ts @@ -0,0 +1,153 @@ +// Fixtures for the preview-only pretend homeserver. Public-safe by construction: the only +// names are GameCult's Minds and a fictional visitor; every room, line and id is invented here. +export const DEMO_SERVER = 'demo.invalid'; +export const DEMO_ORIGIN = `https://${DEMO_SERVER}`; +export const ME = `@demo:${DEMO_SERVER}`; +export const DEMO_DEVICE = 'DEMOPREVIEW'; +export const DEMO_TOKEN = 'demo-preview-token'; + +export type DemoEvent = { + type: string; + state_key?: string; + sender: string; + content: Record; + event_id: string; + origin_server_ts: number; + unsigned?: Record; +}; + +export type DemoUser = { id: string; name: string }; +export const USERS: DemoUser[] = [ + { id: ME, name: 'Demo' }, + { id: `@eureka:${DEMO_SERVER}`, name: 'Eureka' }, + { id: `@void:${DEMO_SERVER}`, name: 'Void' }, + { id: `@nibu:${DEMO_SERVER}`, name: 'Nibu' }, + { id: `@visitor:${DEMO_SERVER}`, name: 'Visitor' }, +]; +const user = (localpart: string) => `@${localpart}:${DEMO_SERVER}`; + +export type DemoLine = { from: string; body: string; pose?: string; minutesAgo: number }; +export type DemoRoom = { + id: string; + alias?: string; + name: string; + space?: boolean; + direct?: boolean; + topic?: string; + members: string[]; + notice?: 'show' | 'study' | 'train'; + parent?: string; + steward?: { mind: string; repo: string }; + joined: boolean; + lines: DemoLine[]; +}; + +export const ROOT = `!root:${DEMO_SERVER}`; +export const PROJECTS = `!projects:${DEMO_SERVER}`; +export const GENERAL = `!general:${DEMO_SERVER}`; +export const COMMONS = `!commons:${DEMO_SERVER}`; + +const everyone = USERS.map((u) => u.id); +export const MIND_IDS = [user('eureka'), user('void'), user('nibu')]; +const minds = MIND_IDS; + +export const ROOMS: DemoRoom[] = [ + { + id: ROOT, + alias: `#gamecult:${DEMO_SERVER}`, + name: 'GameCult', + space: true, + members: [ME], + joined: true, + lines: [], + }, + { + id: GENERAL, + alias: `#general:${DEMO_SERVER}`, + name: 'General', + topic: 'A pretend room on a pretend server.', + members: everyone, + notice: 'train', + parent: ROOT, + joined: true, + lines: [ + { from: user('visitor'), body: 'Is anyone around? I just found this place.', minutesAgo: 42 }, + { from: user('eureka'), body: 'Welcome. This is a preview with no real server behind it.', pose: 'happy', minutesAgo: 40 }, + { from: user('void'), body: 'The portrait beside a message is the pose its sender chose. Turn the setting on if you cannot see it.', pose: 'reading', minutesAgo: 38 }, + { from: user('nibu'), body: 'Check the sky behind the login screen while you are here.', pose: 'triumph', minutesAgo: 35 }, + { from: user('visitor'), body: 'Can I type here?', minutesAgo: 30 }, + { from: user('eureka'), body: 'Yes. Say something and a Mind will answer. The composer underlines misspelled words, so try "recieve".', pose: 'amused', minutesAgo: 29 }, + { from: user('void'), body: 'Nothing you type leaves this page.', pose: 'deadpan', minutesAgo: 25 }, + ], + }, + { + id: PROJECTS, + alias: `#projects:${DEMO_SERVER}`, + name: 'Projects', + space: true, + members: [ME], + parent: ROOT, + joined: true, + lines: [], + }, + { + id: `!ratatoskr:${DEMO_SERVER}`, + alias: `#ratatoskr:${DEMO_SERVER}`, + name: 'Ratatoskr', + topic: 'The chat client, built by the people using it.', + members: [ME, ...minds], + notice: 'study', + parent: PROJECTS, + steward: { mind: 'nibu', repo: 'Ratatoskr' }, + joined: true, + lines: [ + { from: user('nibu'), body: 'The ridge scene is on at the low tier in this preview.', pose: 'resolute', minutesAgo: 90 }, + { from: user('void'), body: 'Backgrounded tabs now nudge sync when you come back, so the list is not stale.', pose: 'point', minutesAgo: 80 }, + { from: user('eureka'), body: 'Messages from Minds carry a pose label; this one is thinking.', pose: 'thinking', minutesAgo: 70 }, + { from: user('nibu'), body: 'This label is not in the pose catalogue, so the portrait falls back to neutral.', pose: 'no-such-pose', minutesAgo: 60 }, + ], + }, + { + id: `!huginn:${DEMO_SERVER}`, + alias: `#huginn:${DEMO_SERVER}`, + name: 'Huginn', + topic: 'Memory for the Minds.', + members: [ME, user('eureka'), user('void')], + notice: 'show', + parent: PROJECTS, + steward: { mind: 'eureka', repo: 'Huginn' }, + joined: true, + lines: [ + { from: user('eureka'), body: 'This room shows no training line, because its notice says show.', pose: 'neutral', minutesAgo: 120 }, + ], + }, + { + id: `!dm-eureka:${DEMO_SERVER}`, + name: 'Eureka', + direct: true, + members: [ME, user('eureka')], + joined: true, + lines: [ + { from: user('eureka'), body: 'A direct message. I answer here too.', pose: 'happy', minutesAgo: 15 }, + { from: user('eureka'), body: 'Ask me anything; the answers are canned.', pose: 'thinking', minutesAgo: 14 }, + ], + }, + { + id: COMMONS, + alias: `#commons:${DEMO_SERVER}`, + name: 'Commons', + topic: 'Open to anyone. Join to look inside.', + members: [user('visitor'), user('void')], + parent: ROOT, + joined: false, + lines: [{ from: user('void'), body: 'You found the unjoined room.', pose: 'glare', minutesAgo: 200 }], + }, +]; + +// A Mind's canned answer to whatever the visitor types: label and line. +export const REPLIES: { pose: string; body: string }[] = [ + { pose: 'thinking', body: 'Hm. Let me think about that.' }, + { pose: 'amused', body: 'That is a fair thing to say to a pretend server.' }, + { pose: 'happy', body: 'Noted. Nothing was sent anywhere.' }, + { pose: 'surprised', body: 'I did not expect that.' }, +]; diff --git a/src/preview-demo/index.ts b/src/preview-demo/index.ts new file mode 100644 index 00000000..f66dde43 --- /dev/null +++ b/src/preview-demo/index.ts @@ -0,0 +1 @@ +export { installDemo } from './install'; diff --git a/src/preview-demo/install.ts b/src/preview-demo/install.ts new file mode 100644 index 00000000..f543ea0e --- /dev/null +++ b/src/preview-demo/install.ts @@ -0,0 +1,115 @@ +// Routes the page's network through the pretend homeserver and refuses everything else. Installed +// only by a build with VITE_PREVIEW_DEMO=1 whose config.json says previewDemo: true (src/index.tsx). +// Own-origin requests (the app's static files) pass; the demo origin is answered in-page; any +// other origin is refused, so no real homeserver can be contacted while this is on. +import { DEMO_ORIGIN, DEMO_SERVER } from './fixtures'; +import { createDemoServer, DemoServer } from './server'; + +export type Route = 'own' | 'demo' | 'refuse'; + +export const routeOf = (url: string, pageOrigin: string): Route => { + let u: URL; + try { + u = new URL(url, pageOrigin); + } catch { + return 'refuse'; + } + if (u.protocol === 'data:' || u.protocol === 'blob:') return 'own'; + if (u.origin === DEMO_ORIGIN) return 'demo'; + const ws = u.protocol === 'ws:' || u.protocol === 'wss:'; + const sameHost = u.host === new URL(pageOrigin).host; + return sameHost && (u.origin === pageOrigin || ws) ? 'own' : 'refuse'; +}; + +const refusal = (what: string, url: string) => + new Error(`preview: pretend server only; ${what} to ${url} refused`); + +const BANNER_TEXT = `preview: pretend server (${DEMO_SERVER}). Log in as demo with any password; nothing leaves this page.`; +const FOREIGN_SESSION_TEXT = + 'preview: pretend server. A login for another server is stored on this origin and cannot be used here.'; + +const showBanner = (text: string) => { + const el = document.createElement('div'); + el.textContent = text; + el.setAttribute('role', 'status'); + el.style.cssText = + 'position:fixed;top:0;left:50%;transform:translateX(-50%);z-index:2147483647;max-width:96vw;' + + 'padding:2px 10px;font:11px/1.4 system-ui,sans-serif;color:#1b1b1b;background:#ffc46b;' + + 'border-radius:0 0 6px 6px;pointer-events:none;text-align:center'; + document.body.appendChild(el); +}; + +// The pose portraits are a setting that defaults off; a first visit turns it on so the demo shows them. +const seedSettings = () => { + if (localStorage.getItem('settings') === null) { + localStorage.setItem('settings', JSON.stringify({ poseBubbles: true })); + } +}; + +const parseBody = (body: unknown): unknown => { + if (typeof body !== 'string') return undefined; + try { + return JSON.parse(body); + } catch { + return undefined; + } +}; + +export type FetchFn = (input: RequestInfo | URL, init?: RequestInit) => Promise; + +// Own-origin requests go to the real fetch, the demo origin to the pretend server, the rest throw. +export const guardedFetch = + (server: DemoServer, origin: string, realFetch: FetchFn): FetchFn => + async (input, init) => { + const req = input instanceof Request ? input : undefined; + const url = req ? req.url : String(input); + const route = routeOf(url, origin); + if (route === 'own') return realFetch(input, init); + if (route === 'refuse') throw new TypeError(refusal('fetch', url).message); + const method = init?.method ?? req?.method ?? 'GET'; + const raw = init?.body ?? (req ? await req.clone().text() : undefined); + const out = await server.handle({ + method, + url, + body: parseBody(raw), + signal: init?.signal ?? req?.signal ?? undefined, + }); + return new Response(JSON.stringify(out.body), { + status: out.status, + headers: { 'Content-Type': 'application/json' }, + }); + }; + +export const installDemo = (win: Window & typeof globalThis = window) => { + const server = createDemoServer(); + const origin = win.location.origin; + const realFetch = win.fetch.bind(win); + + win.fetch = guardedFetch(server, origin, realFetch); + + const RealSocket = win.WebSocket; + class GuardedSocket extends RealSocket { + constructor(url: string | URL, protocols?: string | string[]) { + if (routeOf(String(url), origin) !== 'own') throw refusal('WebSocket', String(url)); + super(url, protocols); + } + } + win.WebSocket = GuardedSocket; + + const realOpen = win.XMLHttpRequest.prototype.open; + win.XMLHttpRequest.prototype.open = function open(this: XMLHttpRequest, method: string, url: string | URL, ...rest: unknown[]) { + if (routeOf(String(url), origin) !== 'own') throw refusal('XMLHttpRequest', String(url)); + return (realOpen as (...a: unknown[]) => void).call(this, method, url, ...rest); + } as typeof realOpen; + + const realBeacon = win.navigator.sendBeacon?.bind(win.navigator); + if (realBeacon) { + win.navigator.sendBeacon = (url: string | URL, data?: BodyInit | null) => + routeOf(String(url), origin) === 'own' ? realBeacon(url, data) : false; + } + + seedSettings(); + const stored = win.localStorage.getItem('cinny_hs_base_url'); + showBanner(stored !== null && stored !== DEMO_ORIGIN ? FOREIGN_SESSION_TEXT : BANNER_TEXT); + return server; +}; diff --git a/src/preview-demo/server.test.ts b/src/preview-demo/server.test.ts new file mode 100644 index 00000000..4e09840f --- /dev/null +++ b/src/preview-demo/server.test.ts @@ -0,0 +1,234 @@ +import { afterEach, describe, expect, it, vi } from 'vitest'; +import { ClientEvent, MatrixClient, SyncState, createClient } from 'matrix-js-sdk'; +import { DEMO_ORIGIN, ME, ROOMS, GENERAL, COMMONS } from './fixtures'; +import { guardedFetch, installDemo, routeOf } from './install'; +import { createDemoServer, DemoServer } from './server'; +import { mindOfSender, POSE_KEY, resolvePose } from '../app/components/message/pose/poses'; +import { parseRoomNotice, roomTrainingLine } from '../app/utils/trainingNotice'; + +const PAGE = 'https://page.test'; +const never = vi.fn(async () => new Response('real network')); + +const clientFor = (server: DemoServer): MatrixClient => + createClient({ + baseUrl: DEMO_ORIGIN, + fetchFn: guardedFetch(server, PAGE, never as never) as never, + }); + +const waitFor = (read: () => T | undefined, ms = 5000): Promise => + new Promise((resolve, reject) => { + const t0 = Date.now(); + const tick = () => { + const v = read(); + if (v !== undefined) resolve(v); + else if (Date.now() - t0 > ms) reject(new Error('timed out')); + else setTimeout(tick, 20); + }; + tick(); + }); + +const live: { server: DemoServer; mx: MatrixClient }[] = []; +afterEach(() => { + live.splice(0).forEach(({ server, mx }) => { + mx.stopClient(); + server.close(); + }); + never.mockClear(); +}); + +const syncedClient = async () => { + const server = createDemoServer(); + const mx = clientFor(server); + live.push({ server, mx }); + const login = await mx.loginWithPassword('demo', 'anything'); + mx.http.opts.accessToken = login.access_token; + await mx.startClient({ initialSyncLimit: 20 }); + await waitFor(() => (mx.getSyncState() === SyncState.Syncing ? true : undefined)); + return { server, mx, login }; +}; + +describe('routeOf', () => { + it('lets own-origin requests through, answers the demo origin, refuses the rest', () => { + expect(routeOf('/config.json', PAGE)).toBe('own'); + expect(routeOf(`${PAGE}/assets/a.js`, PAGE)).toBe('own'); + expect(routeOf('data:text/plain,hi', PAGE)).toBe('own'); + expect(routeOf(`${DEMO_ORIGIN}/_matrix/client/versions`, PAGE)).toBe('demo'); + expect(routeOf('https://matrix.org/_matrix/client/versions', PAGE)).toBe('refuse'); + expect(routeOf('https://page.test.evil.example/x', PAGE)).toBe('refuse'); + expect(routeOf('https://demo.invalid.evil.example/x', PAGE)).toBe('refuse'); + expect(routeOf('http://page.test/x', PAGE)).toBe('refuse'); + expect(routeOf('wss://matrix.org/socket', PAGE)).toBe('refuse'); + expect(routeOf('wss://page.test/socket', PAGE)).toBe('own'); + }); +}); + +describe('the pretend homeserver through matrix-js-sdk', () => { + it('logs in as demo with any password', async () => { + const server = createDemoServer(); + live.push({ server, mx: clientFor(server) }); + const res = await live[0].mx.loginWithPassword('demo', 'whatever'); + expect(res.user_id).toBe(ME); + expect(res.access_token).toBeTruthy(); + }); + + it('syncs the joined rooms, space tree, direct message and members', async () => { + const { mx } = await syncedClient(); + const joined = ROOMS.filter((r) => r.joined); + expect( + mx + .getRooms() + .map((r) => r.roomId) + .sort() + ).toEqual(joined.map((r) => r.id).sort()); + expect(mx.getRoom(GENERAL)?.name).toBe('General'); + expect(mx.getRoom(COMMONS)).toBeNull(); + const direct = mx.getAccountData('m.direct')?.getContent() as Record; + expect(Object.values(direct).flat()).toContain(ROOMS.find((r) => r.direct)?.id); + expect(mx.getRoom(GENERAL)?.getJoinedMemberCount()).toBeGreaterThan(3); + }); + + it('carries pose labels that the pose catalogue resolves, for known Minds only', async () => { + const { mx } = await syncedClient(); + const events = mx + .getRoom(GENERAL)! + .getLiveTimeline() + .getEvents() + .filter((e) => e.getType() === 'm.room.message'); + const posed = events.filter((e) => e.getContent()[POSE_KEY]); + expect(posed.length).toBeGreaterThan(3); + posed.forEach((e) => { + const local = e.getSender()!.slice(1).split(':')[0]; + const mind = mindOfSender(local, undefined); + expect(mind, e.getSender()!).toBeDefined(); + expect(resolvePose(mind!, e.getContent()[POSE_KEY])).toBe(e.getContent()[POSE_KEY]); + }); + expect(events.some((e) => mindOfSender(e.getSender()!.slice(1).split(':')[0]) === undefined)).toBe(true); + }); + + it('shows the training line only in the rooms whose notice says train', async () => { + const { mx } = await syncedClient(); + const lines = ROOMS.filter((r) => r.joined && !r.space && !r.direct).map((r) => { + const ev = mx.getRoom(r.id)!.currentState.getStateEvents('org.gamecult.notice', ''); + return [r.name, roomTrainingLine(parseRoomNotice(ev?.getContent())) !== undefined]; + }); + expect(Object.fromEntries(lines)).toEqual({ General: true, Ratatoskr: false, Huginn: false }); + }); + + it('sends a message, echoes it once with its transaction id, and a Mind answers with a pose', async () => { + const { mx } = await syncedClient(); + const room = mx.getRoom(GENERAL)!; + const before = room.getLiveTimeline().getEvents().length; + const sent = await mx.sendTextMessage(GENERAL, 'hello pretend world'); + const mine = await waitFor(() => + room.getLiveTimeline().getEvents().find((e) => e.getId() === sent.event_id && !e.status) + ); + expect(mine.getSender()).toBe(ME); + const reply = await waitFor( + () => room.getLiveTimeline().getEvents().find((e) => e.getSender() !== ME && e.getContent().body?.length && room.getLiveTimeline().getEvents().indexOf(e) >= before + 1), + 6000 + ); + expect(reply.getContent()[POSE_KEY]).toBeTruthy(); + const ours = room.getLiveTimeline().getEvents().filter((e) => e.getContent().body === 'hello pretend world'); + expect(ours).toHaveLength(1); + }); + + it('joins the unjoined public room and then syncs it', async () => { + const { mx } = await syncedClient(); + const joinedRoom = new Promise((resolve) => mx.on(ClientEvent.Room, (r) => resolve(r.roomId))); + await mx.joinRoom(COMMONS); + expect(await joinedRoom).toBe(COMMONS); + }); + + it('resolves the root space alias and serves the hierarchy with steward metadata', async () => { + const { mx } = await syncedClient(); + const alias = await mx.getRoomIdForAlias('#gamecult:demo.invalid'); + expect(alias.room_id).toBeTruthy(); + const h = await mx.getRoomHierarchy(alias.room_id); + const stewards = h.rooms.flatMap((r) => r.children_state).map((c) => (c.content as Record)['org.gamecult.steward']); + expect(stewards.filter(Boolean).length).toBe(2); + }); + + it('answers a long poll with nothing new after its timeout', async () => { + const server = createDemoServer(); + live.push({ server, mx: clientFor(server) }); + const first = await server.handle({ method: 'GET', url: `${DEMO_ORIGIN}/_matrix/client/v3/sync` }); + const token = (first.body as { next_batch: string }).next_batch; + const t0 = Date.now(); + const idle = await server.handle({ method: 'GET', url: `${DEMO_ORIGIN}/_matrix/client/v3/sync?since=${token}&timeout=150` }); + expect(Date.now() - t0).toBeGreaterThanOrEqual(140); + expect((idle.body as { rooms: { join: object } }).rooms.join).toEqual({}); + }); + + it('says so, rather than inventing an answer, for an endpoint it does not implement', async () => { + const server = createDemoServer(); + live.push({ server, mx: clientFor(server) }); + const res = await server.handle({ method: 'GET', url: `${DEMO_ORIGIN}/_matrix/client/v3/something/new` }); + expect(res.status).toBe(404); + expect((res.body as { errcode: string }).errcode).toBe('M_UNRECOGNIZED'); + }); +}); + +describe('the guard', () => { + it('refuses a real homeserver and never reaches the real fetch for it', async () => { + const server = createDemoServer(); + live.push({ server, mx: clientFor(server) }); + const f = guardedFetch(server, PAGE, never as never); + await expect(f('https://matrix.org/_matrix/client/versions')).rejects.toThrow(/pretend server only/); + await expect(f(new Request('https://converser.eu/_matrix/client/v3/login'))).rejects.toThrow(/refused/); + expect(never).not.toHaveBeenCalled(); + await f(`${PAGE}/config.json`); + expect(never).toHaveBeenCalledTimes(1); + const versions = await f(`${DEMO_ORIGIN}/_matrix/client/versions`); + expect((await versions.json()).versions.length).toBeGreaterThan(0); + }); + + it('installDemo refuses WebSocket, XMLHttpRequest and beacons to foreign origins', () => { + const store = new Map(); + const open = vi.fn(); + class Sock { + constructor(public url: string) {} + } + const win = { + location: { origin: PAGE }, + fetch: never, + WebSocket: Sock, + XMLHttpRequest: { prototype: { open } }, + navigator: { sendBeacon: vi.fn(() => true) }, + localStorage: { + getItem: (k: string) => store.get(k) ?? null, + setItem: (k: string, v: string) => void store.set(k, v), + }, + } as unknown as Window & typeof globalThis; + vi.stubGlobal('document', { + createElement: () => ({ style: {}, setAttribute: () => {} }), + body: { appendChild: vi.fn() }, + }); + const server = installDemo(win); + live.push({ server, mx: clientFor(server) }); + expect(() => new win.WebSocket('wss://matrix.org/x')).toThrow(/refused/); + expect(() => new win.WebSocket(`wss://page.test/x`)).not.toThrow(); + expect(() => win.XMLHttpRequest.prototype.open('GET', 'https://matrix.org/x')).toThrow(/refused/); + win.XMLHttpRequest.prototype.open('GET', '/same-origin'); + expect(open).toHaveBeenCalledTimes(1); + expect(win.navigator.sendBeacon('https://matrix.org/x')).toBe(false); + expect(JSON.parse(store.get('settings')!)).toEqual({ poseBubbles: true }); + vi.unstubAllGlobals(); + }); + + it('keeps stored settings a visitor already chose', () => { + const store = new Map([['settings', '{"poseBubbles":false}']]); + const win = { + location: { origin: PAGE }, + fetch: never, + WebSocket: class {}, + XMLHttpRequest: { prototype: { open: vi.fn() } }, + navigator: {}, + localStorage: { getItem: (k: string) => store.get(k) ?? null, setItem: vi.fn() }, + } as unknown as Window & typeof globalThis; + vi.stubGlobal('document', { createElement: () => ({ style: {}, setAttribute: () => {} }), body: { appendChild: vi.fn() } }); + const server = installDemo(win); + live.push({ server, mx: clientFor(server) }); + expect(win.localStorage.setItem).not.toHaveBeenCalled(); + vi.unstubAllGlobals(); + }); +}); diff --git a/src/preview-demo/server.ts b/src/preview-demo/server.ts new file mode 100644 index 00000000..bb6d4d47 --- /dev/null +++ b/src/preview-demo/server.ts @@ -0,0 +1,344 @@ +// The preview-only pretend homeserver: a pure request handler over in-memory fixtures. It speaks +// just enough of the Matrix client-server API for matrix-js-sdk to log in, sync, show rooms, +// send messages and get a Mind's canned answer. It touches no network and no storage; the +// fetch guard that routes requests here lives in install.ts. +import { + COMMONS, + DEMO_DEVICE, + DEMO_ORIGIN, + DEMO_SERVER, + DEMO_TOKEN, + DemoEvent, + DemoRoom, + ME, + MIND_IDS, + REPLIES, + ROOMS, + USERS, +} from './fixtures'; + +export type DemoResponse = { status: number; body: unknown }; +export type DemoRequest = { method: string; url: string; body?: unknown; signal?: AbortSignal }; + +const POSE_KEY = 'org.gamecult.pose'; +const NOTICE_TYPE = 'org.gamecult.notice'; +const MAX_LONG_POLL_MS = 15000; + +const ok = (body: unknown = {}): DemoResponse => ({ status: 200, body }); +const err = (status: number, errcode: string, error: string): DemoResponse => ({ + status, + body: { errcode, error }, +}); + +type Stamped = { version: number; roomId: string; event: DemoEvent }; + +export type DemoServer = { + handle: (req: DemoRequest) => Promise; + /** Stops the pending Mind replies and long polls. */ + close: () => void; +}; + +export const createDemoServer = (now: () => number = Date.now): DemoServer => { + let version = 1; + let eventCounter = 0; + const joined = new Set(ROOMS.filter((r) => r.joined).map((r) => r.id)); + const timeline: Stamped[] = []; + const stateOf = new Map(); + const accountData = new Map(); + const waiters = new Set<() => void>(); + const timers = new Set>(); + let replyCounter = 0; + let closed = false; + + const mk = ( + type: string, + sender: string, + content: Record, + ts: number, + stateKey?: string + ): DemoEvent => { + eventCounter += 1; + return { + type, + sender, + content, + origin_server_ts: ts, + event_id: `$demo${eventCounter}`, + ...(stateKey === undefined ? {} : { state_key: stateKey }), + }; + }; + const nameOf = (id: string) => USERS.find((u) => u.id === id)?.name ?? id; + + const buildState = (room: DemoRoom): DemoEvent[] => { + const t0 = now() - 1000 * 60 * 60 * 24; + const creator = room.members[0] ?? ME; + const events: DemoEvent[] = [ + mk('m.room.create', creator, room.space ? { type: 'm.space', room_version: '10' } : { room_version: '10' }, t0, ''), + mk('m.room.name', creator, { name: room.name }, t0, ''), + mk('m.room.join_rules', creator, { join_rule: room.id === COMMONS ? 'public' : 'invite' }, t0, ''), + mk('m.room.history_visibility', creator, { history_visibility: 'shared' }, t0, ''), + mk('m.room.power_levels', creator, { users: { [ME]: 100 }, users_default: 0, events_default: 0, state_default: 50 }, t0, ''), + ...room.members.map((m) => + mk('m.room.member', m, { membership: 'join', displayname: nameOf(m) }, t0, m) + ), + ]; + if (room.topic) events.push(mk('m.room.topic', creator, { topic: room.topic }, t0, '')); + if (room.alias) events.push(mk('m.room.canonical_alias', creator, { alias: room.alias }, t0, '')); + if (room.notice) events.push(mk(NOTICE_TYPE, creator, { version: 1, scope: room.notice }, t0, '')); + if (room.parent) { + events.push(mk('m.space.parent', creator, { via: [DEMO_SERVER], canonical: true }, t0, room.parent)); + } + ROOMS.filter((c) => c.parent === room.id).forEach((c) => { + events.push( + mk( + 'm.space.child', + creator, + { + via: [DEMO_SERVER], + ...(c.steward ? { 'org.gamecult.steward': { ...c.steward, source: 'demo', steward: c.steward.mind } } : {}), + }, + t0, + c.id + ) + ); + }); + return events; + }; + + ROOMS.forEach((room) => { + stateOf.set(room.id, buildState(room)); + room.lines.forEach((l) => { + timeline.push({ + version: 1, + roomId: room.id, + event: mk( + 'm.room.message', + l.from, + { msgtype: 'm.text', body: l.body, ...(l.pose ? { [POSE_KEY]: l.pose } : {}) }, + now() - l.minutesAgo * 60 * 1000 + ), + }); + }); + }); + timeline.sort((a, b) => a.event.origin_server_ts - b.event.origin_server_ts); + accountData.set('m.direct', { + [`@eureka:${DEMO_SERVER}`]: ROOMS.filter((r) => r.direct).map((r) => r.id), + }); + + const notify = () => { + waiters.forEach((w) => w()); + waiters.clear(); + }; + const push = (roomId: string, event: DemoEvent) => { + version += 1; + timeline.push({ version, roomId, event }); + notify(); + }; + const later = (ms: number, fn: () => void) => { + const t = setTimeout(() => { + timers.delete(t); + if (!closed) fn(); + }, ms); + timers.add(t); + }; + + // A Mind in the room answers whatever the visitor sent, with a pose from a short cycle. + const scheduleReply = (room: DemoRoom) => { + const mind = room.members.find((m) => MIND_IDS.includes(m)); + if (!mind) return; + const reply = REPLIES[replyCounter % REPLIES.length]; + replyCounter += 1; + later(1200, () => + push(room.id, mk('m.room.message', mind, { msgtype: 'm.text', body: reply.body, [POSE_KEY]: reply.pose }, now())) + ); + }; + + const roomJson = (room: DemoRoom, since: number) => { + const full = since === 0; + const events = timeline + .filter((t) => t.roomId === room.id && (full || t.version > since)) + .map((t) => t.event); + return { + state: { events: full ? stateOf.get(room.id) : [] }, + timeline: { events, limited: false, prev_batch: 'p0' }, + ephemeral: { events: [] }, + account_data: { events: [] }, + unread_notifications: { highlight_count: 0, notification_count: 0 }, + summary: { 'm.joined_member_count': room.members.length, 'm.invited_member_count': 0, 'm.heroes': [] }, + }; + }; + + const syncBody = (since: number, joinedBefore: Set) => { + const join: Record = {}; + ROOMS.filter((r) => joined.has(r.id)).forEach((r) => { + const newlyJoined = !joinedBefore.has(r.id); + const j = roomJson(r, newlyJoined ? 0 : since); + if (since === 0 || newlyJoined || (j.timeline.events as unknown[]).length) join[r.id] = j; + }); + const ad: { type: string; content: unknown }[] = []; + if (since === 0 || accountDataVersion > since) { + accountData.forEach((content, type) => ad.push({ type, content })); + } + return { + next_batch: `d${version}`, + rooms: { join, invite: {}, leave: {} }, + account_data: { events: ad }, + presence: { events: [] }, + to_device: { events: [] }, + device_one_time_keys_count: { signed_curve25519: 50 }, + }; + }; + let accountDataVersion = 0; + let syncedJoined = new Set(joined); + + const sync = async (since: number, timeoutMs: number, signal?: AbortSignal): Promise => { + if (since === 0) { + syncedJoined = new Set(joined); + return ok(syncBody(0, new Set())); + } + const changed = () => version > since || accountDataVersion > since; + if (!changed()) { + await new Promise((resolve) => { + const done = () => { + waiters.delete(done); + resolve(); + }; + waiters.add(done); + later(Math.min(timeoutMs, MAX_LONG_POLL_MS), done); + signal?.addEventListener('abort', done); + }); + } + const before = syncedJoined; + syncedJoined = new Set(joined); + return ok(syncBody(since, before)); + }; + + const roomOf = (id: string) => ROOMS.find((r) => r.id === id); + const hierarchy = () => { + const entry = (r: DemoRoom) => ({ + room_id: r.id, + name: r.name, + topic: r.topic, + canonical_alias: r.alias, + num_joined_members: r.members.length, + world_readable: false, + guest_can_join: false, + join_rule: r.id === COMMONS ? 'public' : 'invite', + ...(r.space ? { room_type: 'm.space' } : {}), + children_state: (stateOf.get(r.id) ?? []).filter((e) => e.type === 'm.space.child'), + }); + return ROOMS.filter((r) => !r.direct).map(entry); + }; + + const handle = async (req: DemoRequest): Promise => { + const u = new URL(req.url, DEMO_ORIGIN); + const p = decodeURIComponent(u.pathname); + const m = req.method.toUpperCase(); + const body = (req.body ?? {}) as Record; + let g: RegExpMatchArray | null; + + if (p === '/.well-known/matrix/client') return ok({ 'm.homeserver': { base_url: DEMO_ORIGIN } }); + if (!p.startsWith('/_matrix/')) return err(404, 'M_NOT_FOUND', 'Not found'); + const c = p.replace(/^\/_matrix\/client\/(v\d+|r0|unstable)/, ''); + if (p.endsWith('/versions')) return ok({ versions: ['v1.1', 'v1.5', 'v1.11'], unstable_features: {} }); + if (c === '/login') { + if (m === 'GET') return ok({ flows: [{ type: 'm.login.password' }] }); + return ok({ user_id: ME, access_token: DEMO_TOKEN, device_id: DEMO_DEVICE, home_server: DEMO_SERVER }); + } + if (c === '/register') return err(403, 'M_FORBIDDEN', 'Registration is closed on the pretend server.'); + if (c === '/account/whoami') return ok({ user_id: ME, device_id: DEMO_DEVICE }); + if (c === '/capabilities') return ok({ capabilities: {} }); + if ((g = c.match(/^\/profile\/(.+)$/))) return ok({ displayname: nameOf(g[1]) }); + if (c.endsWith('/filter') && m === 'POST') return ok({ filter_id: '1' }); + if (c.includes('/filter/')) return ok({}); + if (c === '/sync') { + const raw = u.searchParams.get('since'); + const since = raw ? Number(raw.replace(/^d/, '')) || 0 : 0; + return sync(since, Number(u.searchParams.get('timeout') ?? 0), req.signal); + } + if (c === '/pushrules/' || c === '/pushrules') { + return ok({ global: { override: [], underride: [], room: [], sender: [], content: [] } }); + } + if ((g = c.match(/^\/user\/[^/]+\/account_data\/(.+)$/))) { + if (m === 'PUT') { + accountData.set(g[1], req.body ?? {}); + version += 1; + accountDataVersion = version; + notify(); + return ok({}); + } + return accountData.has(g[1]) ? ok(accountData.get(g[1])) : err(404, 'M_NOT_FOUND', 'No account data'); + } + if ((g = c.match(/^\/directory\/room\/(.+)$/))) { + const room = ROOMS.find((r) => r.alias === g![1]); + return room ? ok({ room_id: room.id, servers: [DEMO_SERVER] }) : err(404, 'M_NOT_FOUND', 'Room alias not found'); + } + if (c === '/joined_rooms') return ok({ joined_rooms: [...joined] }); + if ((g = c.match(/^\/rooms\/([^/]+)\/hierarchy$/))) return ok({ rooms: hierarchy() }); + if ((g = c.match(/^\/(?:rooms\/([^/]+)\/join|join\/([^/]+))$/)) && m === 'POST') { + const target = g[1] ?? g[2]; + const room = roomOf(target) ?? ROOMS.find((r) => r.alias === target); + if (!room) return err(404, 'M_NOT_FOUND', 'No such room'); + if (!joined.has(room.id)) { + joined.add(room.id); + if (!room.members.includes(ME)) room.members.push(ME); + stateOf.set(room.id, buildState(room)); + version += 1; + notify(); + } + return ok({ room_id: room.id }); + } + if ((g = c.match(/^\/rooms\/([^/]+)\/(?:leave|forget|read_markers|typing\/[^/]+|receipt\/.+|report\/.+)$/))) return ok({}); + if ((g = c.match(/^\/rooms\/([^/]+)\/send\/([^/]+)\/([^/]+)$/)) && m === 'PUT') { + const room = roomOf(g[1]); + if (!room || !joined.has(room.id)) return err(403, 'M_FORBIDDEN', 'Not in room'); + const event = mk(g[2], ME, body, now()); + event.unsigned = { transaction_id: g[3] }; + push(room.id, event); + if (g[2] === 'm.room.message') scheduleReply(room); + return ok({ event_id: event.event_id }); + } + if ((g = c.match(/^\/rooms\/([^/]+)\/state\/([^/]+)(?:\/(.*))?$/))) { + const room = roomOf(g[1]); + if (!room) return err(404, 'M_NOT_FOUND', 'No such room'); + const key = g[3] ?? ''; + if (m === 'PUT') { + const event = mk(g[2], ME, body, now(), key); + stateOf.set(room.id, [...(stateOf.get(room.id) ?? []).filter((e) => !(e.type === g![2] && e.state_key === key)), event]); + push(room.id, event); + return ok({ event_id: event.event_id }); + } + const found = (stateOf.get(room.id) ?? []).find((e) => e.type === g![2] && e.state_key === key); + return found ? ok(found.content) : err(404, 'M_NOT_FOUND', 'No such state event'); + } + if ((g = c.match(/^\/rooms\/([^/]+)\/state$/))) return ok(stateOf.get(g[1]) ?? []); + if ((g = c.match(/^\/rooms\/([^/]+)\/members$/))) { + return ok({ chunk: (stateOf.get(g[1]) ?? []).filter((e) => e.type === 'm.room.member') }); + } + if ((g = c.match(/^\/rooms\/([^/]+)\/messages$/))) return ok({ chunk: [], start: 'p0', end: 'p0' }); + if ((g = c.match(/^\/rooms\/([^/]+)\/(?:summary|context\/.+)$/))) return err(404, 'M_NOT_FOUND', 'Not available on the pretend server'); + if (c === '/keys/upload') return ok({ one_time_key_counts: { signed_curve25519: 50 } }); + if (c === '/keys/query') return ok({ device_keys: {}, failures: {} }); + if (c === '/keys/claim') return ok({ one_time_keys: {}, failures: {} }); + if (c === '/keys/changes') return ok({ changed: [], left: [] }); + if (c.startsWith('/keys/')) return ok({}); + if (c.startsWith('/sendToDevice/')) return ok({}); + if (c.startsWith('/room_keys/')) return err(404, 'M_NOT_FOUND', 'No backup'); + if (c === '/devices') return ok({ devices: [{ device_id: DEMO_DEVICE, display_name: 'Preview' }] }); + if (c === '/thirdparty/protocols' || c === '/voip/turnServer') return ok({}); + if (c.startsWith('/presence/')) return ok({}); + if (c === '/user_directory/search') return ok({ results: [], limited: false }); + if (p.endsWith('/media/config') || p.endsWith('/config')) return ok({ 'm.upload.size': 0 }); + return err(404, 'M_UNRECOGNIZED', `The pretend server does not implement ${m} ${p}`); + }; + + return { + handle, + close: () => { + closed = true; + timers.forEach(clearTimeout); + timers.clear(); + notify(); + }, + }; +}; From 4d09a33ec22c286283be17daa47a7c884fbce1b4 Mon Sep 17 00:00:00 2001 From: Void Date: Sat, 7 Nov 2026 18:50:15 +0000 Subject: [PATCH 013/248] preview-demo: seed settings through the installed window's storage Co-Authored-By: Claude Sonnet 5.5 --- src/preview-demo/install.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/preview-demo/install.ts b/src/preview-demo/install.ts index f543ea0e..7ab84aa0 100644 --- a/src/preview-demo/install.ts +++ b/src/preview-demo/install.ts @@ -40,9 +40,9 @@ const showBanner = (text: string) => { }; // The pose portraits are a setting that defaults off; a first visit turns it on so the demo shows them. -const seedSettings = () => { - if (localStorage.getItem('settings') === null) { - localStorage.setItem('settings', JSON.stringify({ poseBubbles: true })); +const seedSettings = (storage: Storage) => { + if (storage.getItem('settings') === null) { + storage.setItem('settings', JSON.stringify({ poseBubbles: true })); } }; @@ -108,7 +108,7 @@ export const installDemo = (win: Window & typeof globalThis = window) => { routeOf(String(url), origin) === 'own' ? realBeacon(url, data) : false; } - seedSettings(); + seedSettings(win.localStorage); const stored = win.localStorage.getItem('cinny_hs_base_url'); showBanner(stored !== null && stored !== DEMO_ORIGIN ? FOREIGN_SESSION_TEXT : BANNER_TEXT); return server; From 8431827077c39ba6a622b835575d60c6f16080b9 Mon Sep 17 00:00:00 2001 From: Void Date: Sat, 7 Nov 2026 18:50:52 +0000 Subject: [PATCH 014/248] preview-demo: lint-clean router, prettier Co-Authored-By: Claude Sonnet 5.5 --- src/preview-demo/fixtures.ts | 88 +++++++++++++++++--- src/preview-demo/install.ts | 7 +- src/preview-demo/server.test.ts | 67 +++++++++++---- src/preview-demo/server.ts | 140 ++++++++++++++++++++++++-------- 4 files changed, 241 insertions(+), 61 deletions(-) diff --git a/src/preview-demo/fixtures.ts b/src/preview-demo/fixtures.ts index 77e6104f..1ed52dc1 100644 --- a/src/preview-demo/fixtures.ts +++ b/src/preview-demo/fixtures.ts @@ -72,12 +72,37 @@ export const ROOMS: DemoRoom[] = [ joined: true, lines: [ { from: user('visitor'), body: 'Is anyone around? I just found this place.', minutesAgo: 42 }, - { from: user('eureka'), body: 'Welcome. This is a preview with no real server behind it.', pose: 'happy', minutesAgo: 40 }, - { from: user('void'), body: 'The portrait beside a message is the pose its sender chose. Turn the setting on if you cannot see it.', pose: 'reading', minutesAgo: 38 }, - { from: user('nibu'), body: 'Check the sky behind the login screen while you are here.', pose: 'triumph', minutesAgo: 35 }, + { + from: user('eureka'), + body: 'Welcome. This is a preview with no real server behind it.', + pose: 'happy', + minutesAgo: 40, + }, + { + from: user('void'), + body: 'The portrait beside a message is the pose its sender chose. Turn the setting on if you cannot see it.', + pose: 'reading', + minutesAgo: 38, + }, + { + from: user('nibu'), + body: 'Check the sky behind the login screen while you are here.', + pose: 'triumph', + minutesAgo: 35, + }, { from: user('visitor'), body: 'Can I type here?', minutesAgo: 30 }, - { from: user('eureka'), body: 'Yes. Say something and a Mind will answer. The composer underlines misspelled words, so try "recieve".', pose: 'amused', minutesAgo: 29 }, - { from: user('void'), body: 'Nothing you type leaves this page.', pose: 'deadpan', minutesAgo: 25 }, + { + from: user('eureka'), + body: 'Yes. Say something and a Mind will answer. The composer underlines misspelled words, so try "recieve".', + pose: 'amused', + minutesAgo: 29, + }, + { + from: user('void'), + body: 'Nothing you type leaves this page.', + pose: 'deadpan', + minutesAgo: 25, + }, ], }, { @@ -101,10 +126,30 @@ export const ROOMS: DemoRoom[] = [ steward: { mind: 'nibu', repo: 'Ratatoskr' }, joined: true, lines: [ - { from: user('nibu'), body: 'The ridge scene is on at the low tier in this preview.', pose: 'resolute', minutesAgo: 90 }, - { from: user('void'), body: 'Backgrounded tabs now nudge sync when you come back, so the list is not stale.', pose: 'point', minutesAgo: 80 }, - { from: user('eureka'), body: 'Messages from Minds carry a pose label; this one is thinking.', pose: 'thinking', minutesAgo: 70 }, - { from: user('nibu'), body: 'This label is not in the pose catalogue, so the portrait falls back to neutral.', pose: 'no-such-pose', minutesAgo: 60 }, + { + from: user('nibu'), + body: 'The ridge scene is on at the low tier in this preview.', + pose: 'resolute', + minutesAgo: 90, + }, + { + from: user('void'), + body: 'Backgrounded tabs now nudge sync when you come back, so the list is not stale.', + pose: 'point', + minutesAgo: 80, + }, + { + from: user('eureka'), + body: 'Messages from Minds carry a pose label; this one is thinking.', + pose: 'thinking', + minutesAgo: 70, + }, + { + from: user('nibu'), + body: 'This label is not in the pose catalogue, so the portrait falls back to neutral.', + pose: 'no-such-pose', + minutesAgo: 60, + }, ], }, { @@ -118,7 +163,12 @@ export const ROOMS: DemoRoom[] = [ steward: { mind: 'eureka', repo: 'Huginn' }, joined: true, lines: [ - { from: user('eureka'), body: 'This room shows no training line, because its notice says show.', pose: 'neutral', minutesAgo: 120 }, + { + from: user('eureka'), + body: 'This room shows no training line, because its notice says show.', + pose: 'neutral', + minutesAgo: 120, + }, ], }, { @@ -128,8 +178,18 @@ export const ROOMS: DemoRoom[] = [ members: [ME, user('eureka')], joined: true, lines: [ - { from: user('eureka'), body: 'A direct message. I answer here too.', pose: 'happy', minutesAgo: 15 }, - { from: user('eureka'), body: 'Ask me anything; the answers are canned.', pose: 'thinking', minutesAgo: 14 }, + { + from: user('eureka'), + body: 'A direct message. I answer here too.', + pose: 'happy', + minutesAgo: 15, + }, + { + from: user('eureka'), + body: 'Ask me anything; the answers are canned.', + pose: 'thinking', + minutesAgo: 14, + }, ], }, { @@ -140,7 +200,9 @@ export const ROOMS: DemoRoom[] = [ members: [user('visitor'), user('void')], parent: ROOT, joined: false, - lines: [{ from: user('void'), body: 'You found the unjoined room.', pose: 'glare', minutesAgo: 200 }], + lines: [ + { from: user('void'), body: 'You found the unjoined room.', pose: 'glare', minutesAgo: 200 }, + ], }, ]; diff --git a/src/preview-demo/install.ts b/src/preview-demo/install.ts index 7ab84aa0..426c2d21 100644 --- a/src/preview-demo/install.ts +++ b/src/preview-demo/install.ts @@ -97,7 +97,12 @@ export const installDemo = (win: Window & typeof globalThis = window) => { win.WebSocket = GuardedSocket; const realOpen = win.XMLHttpRequest.prototype.open; - win.XMLHttpRequest.prototype.open = function open(this: XMLHttpRequest, method: string, url: string | URL, ...rest: unknown[]) { + win.XMLHttpRequest.prototype.open = function open( + this: XMLHttpRequest, + method: string, + url: string | URL, + ...rest: unknown[] + ) { if (routeOf(String(url), origin) !== 'own') throw refusal('XMLHttpRequest', String(url)); return (realOpen as (...a: unknown[]) => void).call(this, method, url, ...rest); } as typeof realOpen; diff --git a/src/preview-demo/server.test.ts b/src/preview-demo/server.test.ts index 4e09840f..7140a76f 100644 --- a/src/preview-demo/server.test.ts +++ b/src/preview-demo/server.test.ts @@ -102,7 +102,9 @@ describe('the pretend homeserver through matrix-js-sdk', () => { expect(mind, e.getSender()!).toBeDefined(); expect(resolvePose(mind!, e.getContent()[POSE_KEY])).toBe(e.getContent()[POSE_KEY]); }); - expect(events.some((e) => mindOfSender(e.getSender()!.slice(1).split(':')[0]) === undefined)).toBe(true); + expect( + events.some((e) => mindOfSender(e.getSender()!.slice(1).split(':')[0]) === undefined) + ).toBe(true); }); it('shows the training line only in the rooms whose notice says train', async () => { @@ -120,21 +122,38 @@ describe('the pretend homeserver through matrix-js-sdk', () => { const before = room.getLiveTimeline().getEvents().length; const sent = await mx.sendTextMessage(GENERAL, 'hello pretend world'); const mine = await waitFor(() => - room.getLiveTimeline().getEvents().find((e) => e.getId() === sent.event_id && !e.status) + room + .getLiveTimeline() + .getEvents() + .find((e) => e.getId() === sent.event_id && !e.status) ); expect(mine.getSender()).toBe(ME); const reply = await waitFor( - () => room.getLiveTimeline().getEvents().find((e) => e.getSender() !== ME && e.getContent().body?.length && room.getLiveTimeline().getEvents().indexOf(e) >= before + 1), + () => + room + .getLiveTimeline() + .getEvents() + .find( + (e) => + e.getSender() !== ME && + e.getContent().body?.length && + room.getLiveTimeline().getEvents().indexOf(e) >= before + 1 + ), 6000 ); expect(reply.getContent()[POSE_KEY]).toBeTruthy(); - const ours = room.getLiveTimeline().getEvents().filter((e) => e.getContent().body === 'hello pretend world'); + const ours = room + .getLiveTimeline() + .getEvents() + .filter((e) => e.getContent().body === 'hello pretend world'); expect(ours).toHaveLength(1); }); it('joins the unjoined public room and then syncs it', async () => { const { mx } = await syncedClient(); - const joinedRoom = new Promise((resolve) => mx.on(ClientEvent.Room, (r) => resolve(r.roomId))); + const joinedRoom = new Promise((resolve) => + mx.on(ClientEvent.Room, (r) => resolve(r.roomId)) + ); await mx.joinRoom(COMMONS); expect(await joinedRoom).toBe(COMMONS); }); @@ -144,17 +163,25 @@ describe('the pretend homeserver through matrix-js-sdk', () => { const alias = await mx.getRoomIdForAlias('#gamecult:demo.invalid'); expect(alias.room_id).toBeTruthy(); const h = await mx.getRoomHierarchy(alias.room_id); - const stewards = h.rooms.flatMap((r) => r.children_state).map((c) => (c.content as Record)['org.gamecult.steward']); + const stewards = h.rooms + .flatMap((r) => r.children_state) + .map((c) => (c.content as Record)['org.gamecult.steward']); expect(stewards.filter(Boolean).length).toBe(2); }); it('answers a long poll with nothing new after its timeout', async () => { const server = createDemoServer(); live.push({ server, mx: clientFor(server) }); - const first = await server.handle({ method: 'GET', url: `${DEMO_ORIGIN}/_matrix/client/v3/sync` }); + const first = await server.handle({ + method: 'GET', + url: `${DEMO_ORIGIN}/_matrix/client/v3/sync`, + }); const token = (first.body as { next_batch: string }).next_batch; const t0 = Date.now(); - const idle = await server.handle({ method: 'GET', url: `${DEMO_ORIGIN}/_matrix/client/v3/sync?since=${token}&timeout=150` }); + const idle = await server.handle({ + method: 'GET', + url: `${DEMO_ORIGIN}/_matrix/client/v3/sync?since=${token}&timeout=150`, + }); expect(Date.now() - t0).toBeGreaterThanOrEqual(140); expect((idle.body as { rooms: { join: object } }).rooms.join).toEqual({}); }); @@ -162,7 +189,10 @@ describe('the pretend homeserver through matrix-js-sdk', () => { it('says so, rather than inventing an answer, for an endpoint it does not implement', async () => { const server = createDemoServer(); live.push({ server, mx: clientFor(server) }); - const res = await server.handle({ method: 'GET', url: `${DEMO_ORIGIN}/_matrix/client/v3/something/new` }); + const res = await server.handle({ + method: 'GET', + url: `${DEMO_ORIGIN}/_matrix/client/v3/something/new`, + }); expect(res.status).toBe(404); expect((res.body as { errcode: string }).errcode).toBe('M_UNRECOGNIZED'); }); @@ -173,8 +203,12 @@ describe('the guard', () => { const server = createDemoServer(); live.push({ server, mx: clientFor(server) }); const f = guardedFetch(server, PAGE, never as never); - await expect(f('https://matrix.org/_matrix/client/versions')).rejects.toThrow(/pretend server only/); - await expect(f(new Request('https://converser.eu/_matrix/client/v3/login'))).rejects.toThrow(/refused/); + await expect(f('https://matrix.org/_matrix/client/versions')).rejects.toThrow( + /pretend server only/ + ); + await expect(f(new Request('https://converser.eu/_matrix/client/v3/login'))).rejects.toThrow( + /refused/ + ); expect(never).not.toHaveBeenCalled(); await f(`${PAGE}/config.json`); expect(never).toHaveBeenCalledTimes(1); @@ -200,14 +234,16 @@ describe('the guard', () => { }, } as unknown as Window & typeof globalThis; vi.stubGlobal('document', { - createElement: () => ({ style: {}, setAttribute: () => {} }), + createElement: () => ({ style: {}, setAttribute: vi.fn() }), body: { appendChild: vi.fn() }, }); const server = installDemo(win); live.push({ server, mx: clientFor(server) }); expect(() => new win.WebSocket('wss://matrix.org/x')).toThrow(/refused/); expect(() => new win.WebSocket(`wss://page.test/x`)).not.toThrow(); - expect(() => win.XMLHttpRequest.prototype.open('GET', 'https://matrix.org/x')).toThrow(/refused/); + expect(() => win.XMLHttpRequest.prototype.open('GET', 'https://matrix.org/x')).toThrow( + /refused/ + ); win.XMLHttpRequest.prototype.open('GET', '/same-origin'); expect(open).toHaveBeenCalledTimes(1); expect(win.navigator.sendBeacon('https://matrix.org/x')).toBe(false); @@ -225,7 +261,10 @@ describe('the guard', () => { navigator: {}, localStorage: { getItem: (k: string) => store.get(k) ?? null, setItem: vi.fn() }, } as unknown as Window & typeof globalThis; - vi.stubGlobal('document', { createElement: () => ({ style: {}, setAttribute: () => {} }), body: { appendChild: vi.fn() } }); + vi.stubGlobal('document', { + createElement: () => ({ style: {}, setAttribute: vi.fn() }), + body: { appendChild: vi.fn() }, + }); const server = installDemo(win); live.push({ server, mx: clientFor(server) }); expect(win.localStorage.setItem).not.toHaveBeenCalled(); diff --git a/src/preview-demo/server.ts b/src/preview-demo/server.ts index bb6d4d47..272807ea 100644 --- a/src/preview-demo/server.ts +++ b/src/preview-demo/server.ts @@ -48,6 +48,8 @@ export const createDemoServer = (now: () => number = Date.now): DemoServer => { const waiters = new Set<() => void>(); const timers = new Set>(); let replyCounter = 0; + let accountDataVersion = 0; + let syncedJoined = new Set(joined); let closed = false; const mk = ( @@ -73,20 +75,42 @@ export const createDemoServer = (now: () => number = Date.now): DemoServer => { const t0 = now() - 1000 * 60 * 60 * 24; const creator = room.members[0] ?? ME; const events: DemoEvent[] = [ - mk('m.room.create', creator, room.space ? { type: 'm.space', room_version: '10' } : { room_version: '10' }, t0, ''), + mk( + 'm.room.create', + creator, + room.space ? { type: 'm.space', room_version: '10' } : { room_version: '10' }, + t0, + '' + ), mk('m.room.name', creator, { name: room.name }, t0, ''), - mk('m.room.join_rules', creator, { join_rule: room.id === COMMONS ? 'public' : 'invite' }, t0, ''), + mk( + 'm.room.join_rules', + creator, + { join_rule: room.id === COMMONS ? 'public' : 'invite' }, + t0, + '' + ), mk('m.room.history_visibility', creator, { history_visibility: 'shared' }, t0, ''), - mk('m.room.power_levels', creator, { users: { [ME]: 100 }, users_default: 0, events_default: 0, state_default: 50 }, t0, ''), + mk( + 'm.room.power_levels', + creator, + { users: { [ME]: 100 }, users_default: 0, events_default: 0, state_default: 50 }, + t0, + '' + ), ...room.members.map((m) => mk('m.room.member', m, { membership: 'join', displayname: nameOf(m) }, t0, m) ), ]; if (room.topic) events.push(mk('m.room.topic', creator, { topic: room.topic }, t0, '')); - if (room.alias) events.push(mk('m.room.canonical_alias', creator, { alias: room.alias }, t0, '')); - if (room.notice) events.push(mk(NOTICE_TYPE, creator, { version: 1, scope: room.notice }, t0, '')); + if (room.alias) + events.push(mk('m.room.canonical_alias', creator, { alias: room.alias }, t0, '')); + if (room.notice) + events.push(mk(NOTICE_TYPE, creator, { version: 1, scope: room.notice }, t0, '')); if (room.parent) { - events.push(mk('m.space.parent', creator, { via: [DEMO_SERVER], canonical: true }, t0, room.parent)); + events.push( + mk('m.space.parent', creator, { via: [DEMO_SERVER], canonical: true }, t0, room.parent) + ); } ROOMS.filter((c) => c.parent === room.id).forEach((c) => { events.push( @@ -95,7 +119,11 @@ export const createDemoServer = (now: () => number = Date.now): DemoServer => { creator, { via: [DEMO_SERVER], - ...(c.steward ? { 'org.gamecult.steward': { ...c.steward, source: 'demo', steward: c.steward.mind } } : {}), + ...(c.steward + ? { + 'org.gamecult.steward': { ...c.steward, source: 'demo', steward: c.steward.mind }, + } + : {}), }, t0, c.id @@ -149,7 +177,15 @@ export const createDemoServer = (now: () => number = Date.now): DemoServer => { const reply = REPLIES[replyCounter % REPLIES.length]; replyCounter += 1; later(1200, () => - push(room.id, mk('m.room.message', mind, { msgtype: 'm.text', body: reply.body, [POSE_KEY]: reply.pose }, now())) + push( + room.id, + mk( + 'm.room.message', + mind, + { msgtype: 'm.text', body: reply.body, [POSE_KEY]: reply.pose }, + now() + ) + ) ); }; @@ -164,7 +200,11 @@ export const createDemoServer = (now: () => number = Date.now): DemoServer => { ephemeral: { events: [] }, account_data: { events: [] }, unread_notifications: { highlight_count: 0, notification_count: 0 }, - summary: { 'm.joined_member_count': room.members.length, 'm.invited_member_count': 0, 'm.heroes': [] }, + summary: { + 'm.joined_member_count': room.members.length, + 'm.invited_member_count': 0, + 'm.heroes': [], + }, }; }; @@ -188,10 +228,12 @@ export const createDemoServer = (now: () => number = Date.now): DemoServer => { device_one_time_keys_count: { signed_curve25519: 50 }, }; }; - let accountDataVersion = 0; - let syncedJoined = new Set(joined); - const sync = async (since: number, timeoutMs: number, signal?: AbortSignal): Promise => { + const sync = async ( + since: number, + timeoutMs: number, + signal?: AbortSignal + ): Promise => { if (since === 0) { syncedJoined = new Set(joined); return ok(syncBody(0, new Set())); @@ -237,18 +279,27 @@ export const createDemoServer = (now: () => number = Date.now): DemoServer => { const body = (req.body ?? {}) as Record; let g: RegExpMatchArray | null; - if (p === '/.well-known/matrix/client') return ok({ 'm.homeserver': { base_url: DEMO_ORIGIN } }); + if (p === '/.well-known/matrix/client') + return ok({ 'm.homeserver': { base_url: DEMO_ORIGIN } }); if (!p.startsWith('/_matrix/')) return err(404, 'M_NOT_FOUND', 'Not found'); const c = p.replace(/^\/_matrix\/client\/(v\d+|r0|unstable)/, ''); - if (p.endsWith('/versions')) return ok({ versions: ['v1.1', 'v1.5', 'v1.11'], unstable_features: {} }); + if (p.endsWith('/versions')) + return ok({ versions: ['v1.1', 'v1.5', 'v1.11'], unstable_features: {} }); if (c === '/login') { if (m === 'GET') return ok({ flows: [{ type: 'm.login.password' }] }); - return ok({ user_id: ME, access_token: DEMO_TOKEN, device_id: DEMO_DEVICE, home_server: DEMO_SERVER }); + return ok({ + user_id: ME, + access_token: DEMO_TOKEN, + device_id: DEMO_DEVICE, + home_server: DEMO_SERVER, + }); } - if (c === '/register') return err(403, 'M_FORBIDDEN', 'Registration is closed on the pretend server.'); + if (c === '/register') + return err(403, 'M_FORBIDDEN', 'Registration is closed on the pretend server.'); if (c === '/account/whoami') return ok({ user_id: ME, device_id: DEMO_DEVICE }); if (c === '/capabilities') return ok({ capabilities: {} }); - if ((g = c.match(/^\/profile\/(.+)$/))) return ok({ displayname: nameOf(g[1]) }); + g = c.match(/^\/profile\/(.+)$/); + if (g) return ok({ displayname: nameOf(g[1]) }); if (c.endsWith('/filter') && m === 'POST') return ok({ filter_id: '1' }); if (c.includes('/filter/')) return ok({}); if (c === '/sync') { @@ -259,7 +310,8 @@ export const createDemoServer = (now: () => number = Date.now): DemoServer => { if (c === '/pushrules/' || c === '/pushrules') { return ok({ global: { override: [], underride: [], room: [], sender: [], content: [] } }); } - if ((g = c.match(/^\/user\/[^/]+\/account_data\/(.+)$/))) { + g = c.match(/^\/user\/[^/]+\/account_data\/(.+)$/); + if (g) { if (m === 'PUT') { accountData.set(g[1], req.body ?? {}); version += 1; @@ -267,15 +319,22 @@ export const createDemoServer = (now: () => number = Date.now): DemoServer => { notify(); return ok({}); } - return accountData.has(g[1]) ? ok(accountData.get(g[1])) : err(404, 'M_NOT_FOUND', 'No account data'); + return accountData.has(g[1]) + ? ok(accountData.get(g[1])) + : err(404, 'M_NOT_FOUND', 'No account data'); } - if ((g = c.match(/^\/directory\/room\/(.+)$/))) { + g = c.match(/^\/directory\/room\/(.+)$/); + if (g) { const room = ROOMS.find((r) => r.alias === g![1]); - return room ? ok({ room_id: room.id, servers: [DEMO_SERVER] }) : err(404, 'M_NOT_FOUND', 'Room alias not found'); + return room + ? ok({ room_id: room.id, servers: [DEMO_SERVER] }) + : err(404, 'M_NOT_FOUND', 'Room alias not found'); } if (c === '/joined_rooms') return ok({ joined_rooms: [...joined] }); - if ((g = c.match(/^\/rooms\/([^/]+)\/hierarchy$/))) return ok({ rooms: hierarchy() }); - if ((g = c.match(/^\/(?:rooms\/([^/]+)\/join|join\/([^/]+))$/)) && m === 'POST') { + g = c.match(/^\/rooms\/([^/]+)\/hierarchy$/); + if (g) return ok({ rooms: hierarchy() }); + g = c.match(/^\/(?:rooms\/([^/]+)\/join|join\/([^/]+))$/); + if (g && m === 'POST') { const target = g[1] ?? g[2]; const room = roomOf(target) ?? ROOMS.find((r) => r.alias === target); if (!room) return err(404, 'M_NOT_FOUND', 'No such room'); @@ -288,8 +347,12 @@ export const createDemoServer = (now: () => number = Date.now): DemoServer => { } return ok({ room_id: room.id }); } - if ((g = c.match(/^\/rooms\/([^/]+)\/(?:leave|forget|read_markers|typing\/[^/]+|receipt\/.+|report\/.+)$/))) return ok({}); - if ((g = c.match(/^\/rooms\/([^/]+)\/send\/([^/]+)\/([^/]+)$/)) && m === 'PUT') { + g = c.match( + /^\/rooms\/([^/]+)\/(?:leave|forget|read_markers|typing\/[^/]+|receipt\/.+|report\/.+)$/ + ); + if (g) return ok({}); + g = c.match(/^\/rooms\/([^/]+)\/send\/([^/]+)\/([^/]+)$/); + if (g && m === 'PUT') { const room = roomOf(g[1]); if (!room || !joined.has(room.id)) return err(403, 'M_FORBIDDEN', 'Not in room'); const event = mk(g[2], ME, body, now()); @@ -298,25 +361,35 @@ export const createDemoServer = (now: () => number = Date.now): DemoServer => { if (g[2] === 'm.room.message') scheduleReply(room); return ok({ event_id: event.event_id }); } - if ((g = c.match(/^\/rooms\/([^/]+)\/state\/([^/]+)(?:\/(.*))?$/))) { + g = c.match(/^\/rooms\/([^/]+)\/state\/([^/]+)(?:\/(.*))?$/); + if (g) { const room = roomOf(g[1]); if (!room) return err(404, 'M_NOT_FOUND', 'No such room'); const key = g[3] ?? ''; if (m === 'PUT') { const event = mk(g[2], ME, body, now(), key); - stateOf.set(room.id, [...(stateOf.get(room.id) ?? []).filter((e) => !(e.type === g![2] && e.state_key === key)), event]); + stateOf.set(room.id, [ + ...(stateOf.get(room.id) ?? []).filter((e) => !(e.type === g![2] && e.state_key === key)), + event, + ]); push(room.id, event); return ok({ event_id: event.event_id }); } - const found = (stateOf.get(room.id) ?? []).find((e) => e.type === g![2] && e.state_key === key); + const found = (stateOf.get(room.id) ?? []).find( + (e) => e.type === g![2] && e.state_key === key + ); return found ? ok(found.content) : err(404, 'M_NOT_FOUND', 'No such state event'); } - if ((g = c.match(/^\/rooms\/([^/]+)\/state$/))) return ok(stateOf.get(g[1]) ?? []); - if ((g = c.match(/^\/rooms\/([^/]+)\/members$/))) { + g = c.match(/^\/rooms\/([^/]+)\/state$/); + if (g) return ok(stateOf.get(g[1]) ?? []); + g = c.match(/^\/rooms\/([^/]+)\/members$/); + if (g) { return ok({ chunk: (stateOf.get(g[1]) ?? []).filter((e) => e.type === 'm.room.member') }); } - if ((g = c.match(/^\/rooms\/([^/]+)\/messages$/))) return ok({ chunk: [], start: 'p0', end: 'p0' }); - if ((g = c.match(/^\/rooms\/([^/]+)\/(?:summary|context\/.+)$/))) return err(404, 'M_NOT_FOUND', 'Not available on the pretend server'); + g = c.match(/^\/rooms\/([^/]+)\/messages$/); + if (g) return ok({ chunk: [], start: 'p0', end: 'p0' }); + g = c.match(/^\/rooms\/([^/]+)\/(?:summary|context\/.+)$/); + if (g) return err(404, 'M_NOT_FOUND', 'Not available on the pretend server'); if (c === '/keys/upload') return ok({ one_time_key_counts: { signed_curve25519: 50 } }); if (c === '/keys/query') return ok({ device_keys: {}, failures: {} }); if (c === '/keys/claim') return ok({ one_time_keys: {}, failures: {} }); @@ -324,7 +397,8 @@ export const createDemoServer = (now: () => number = Date.now): DemoServer => { if (c.startsWith('/keys/')) return ok({}); if (c.startsWith('/sendToDevice/')) return ok({}); if (c.startsWith('/room_keys/')) return err(404, 'M_NOT_FOUND', 'No backup'); - if (c === '/devices') return ok({ devices: [{ device_id: DEMO_DEVICE, display_name: 'Preview' }] }); + if (c === '/devices') + return ok({ devices: [{ device_id: DEMO_DEVICE, display_name: 'Preview' }] }); if (c === '/thirdparty/protocols' || c === '/voip/turnServer') return ok({}); if (c.startsWith('/presence/')) return ok({}); if (c === '/user_directory/search') return ok({ results: [], limited: false }); From 0f1fc066e412c5af6261002b6bf3714cea487332 Mon Sep 17 00:00:00 2001 From: Void Date: Sat, 7 Nov 2026 18:51:07 +0000 Subject: [PATCH 015/248] preview-demo: lint Co-Authored-By: Claude Sonnet 5.5 --- src/preview-demo/install.ts | 4 +++- src/preview-demo/server.test.ts | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/preview-demo/install.ts b/src/preview-demo/install.ts index 426c2d21..a5677e8f 100644 --- a/src/preview-demo/install.ts +++ b/src/preview-demo/install.ts @@ -1,3 +1,5 @@ +/* eslint-disable no-param-reassign */ +// Patching the window's network entry points is this module's whole job. // Routes the page's network through the pretend homeserver and refuses everything else. Installed // only by a build with VITE_PREVIEW_DEMO=1 whose config.json says previewDemo: true (src/index.tsx). // Own-origin requests (the app's static files) pass; the demo origin is answered in-page; any @@ -87,7 +89,7 @@ export const installDemo = (win: Window & typeof globalThis = window) => { win.fetch = guardedFetch(server, origin, realFetch); - const RealSocket = win.WebSocket; + const { WebSocket: RealSocket } = win; class GuardedSocket extends RealSocket { constructor(url: string | URL, protocols?: string | string[]) { if (routeOf(String(url), origin) !== 'own') throw refusal('WebSocket', String(url)); diff --git a/src/preview-demo/server.test.ts b/src/preview-demo/server.test.ts index 7140a76f..2af43fa9 100644 --- a/src/preview-demo/server.test.ts +++ b/src/preview-demo/server.test.ts @@ -1,3 +1,4 @@ +/* eslint-disable max-classes-per-file, no-promise-executor-return, no-useless-constructor, no-empty-function, no-void, @typescript-eslint/no-non-null-assertion */ import { afterEach, describe, expect, it, vi } from 'vitest'; import { ClientEvent, MatrixClient, SyncState, createClient } from 'matrix-js-sdk'; import { DEMO_ORIGIN, ME, ROOMS, GENERAL, COMMONS } from './fixtures'; From df536f854e0dc9f4cd1c3e2a07c23e83d741188d Mon Sep 17 00:00:00 2001 From: Void Date: Sat, 7 Nov 2026 18:52:15 +0000 Subject: [PATCH 016/248] preview-demo: destructure open Co-Authored-By: Claude Sonnet 5.5 --- src/preview-demo/install.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/preview-demo/install.ts b/src/preview-demo/install.ts index a5677e8f..5369c387 100644 --- a/src/preview-demo/install.ts +++ b/src/preview-demo/install.ts @@ -98,7 +98,7 @@ export const installDemo = (win: Window & typeof globalThis = window) => { } win.WebSocket = GuardedSocket; - const realOpen = win.XMLHttpRequest.prototype.open; + const { open: realOpen } = win.XMLHttpRequest.prototype; win.XMLHttpRequest.prototype.open = function open( this: XMLHttpRequest, method: string, From e3278a4d7e64bf697b4cbc33bd36ac27ace2b146 Mon Sep 17 00:00:00 2001 From: Void Date: Sat, 7 Nov 2026 18:52:30 +0000 Subject: [PATCH 017/248] preview-demo: destructure origin Co-Authored-By: Claude Sonnet 5.5 --- src/preview-demo/install.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/preview-demo/install.ts b/src/preview-demo/install.ts index 5369c387..a0a2d0e3 100644 --- a/src/preview-demo/install.ts +++ b/src/preview-demo/install.ts @@ -84,7 +84,7 @@ export const guardedFetch = export const installDemo = (win: Window & typeof globalThis = window) => { const server = createDemoServer(); - const origin = win.location.origin; + const { origin } = win.location; const realFetch = win.fetch.bind(win); win.fetch = guardedFetch(server, origin, realFetch); From e7dfbd008bf761f37f44786a70ead9ab40492ce2 Mon Sep 17 00:00:00 2001 From: Void Date: Sat, 7 Nov 2026 18:54:59 +0000 Subject: [PATCH 018/248] preview-demo: deliver submit events the sandbox would cancel The host CSP sandbox lacks allow-forms; Chrome drops native submission before the submit event fires, so the login button did nothing in a real browser (found driving Chrome). Co-Authored-By: Claude Sonnet 5.5 --- src/preview-demo/install.ts | 32 ++++++++++++++++++++++++++++++++ src/preview-demo/server.test.ts | 2 ++ 2 files changed, 34 insertions(+) diff --git a/src/preview-demo/install.ts b/src/preview-demo/install.ts index a0a2d0e3..09e60d5a 100644 --- a/src/preview-demo/install.ts +++ b/src/preview-demo/install.ts @@ -48,6 +48,37 @@ const seedSettings = (storage: Storage) => { } }; +// The preview host's CSP sandbox has no allow-forms, so the browser cancels a native form +// submission before its submit event fires and no login button works. Deliver the event ourselves; +// nothing is submitted natively. Remove this when the host grants allow-forms to /void/rat-*. +const deliverSubmitEvents = (doc: Document) => { + const submit = (form: HTMLFormElement) => + form.dispatchEvent(new Event('submit', { bubbles: true, cancelable: true })); + doc.addEventListener( + 'click', + (e) => { + const button = (e.target as Element | null)?.closest?.( + 'button[type="submit"], input[type="submit"]' + ); + const form = (button as HTMLButtonElement | null)?.form; + if (!form || (button as HTMLButtonElement).disabled) return; + e.preventDefault(); + submit(form); + }, + true + ); + doc.addEventListener( + 'keydown', + (e) => { + const target = e.target as HTMLInputElement | null; + if (e.key !== 'Enter' || e.isComposing || target?.tagName !== 'INPUT' || !target.form) return; + e.preventDefault(); + submit(target.form); + }, + true + ); +}; + const parseBody = (body: unknown): unknown => { if (typeof body !== 'string') return undefined; try { @@ -116,6 +147,7 @@ export const installDemo = (win: Window & typeof globalThis = window) => { } seedSettings(win.localStorage); + deliverSubmitEvents(document); const stored = win.localStorage.getItem('cinny_hs_base_url'); showBanner(stored !== null && stored !== DEMO_ORIGIN ? FOREIGN_SESSION_TEXT : BANNER_TEXT); return server; diff --git a/src/preview-demo/server.test.ts b/src/preview-demo/server.test.ts index 2af43fa9..f5e7e446 100644 --- a/src/preview-demo/server.test.ts +++ b/src/preview-demo/server.test.ts @@ -237,6 +237,7 @@ describe('the guard', () => { vi.stubGlobal('document', { createElement: () => ({ style: {}, setAttribute: vi.fn() }), body: { appendChild: vi.fn() }, + addEventListener: vi.fn(), }); const server = installDemo(win); live.push({ server, mx: clientFor(server) }); @@ -265,6 +266,7 @@ describe('the guard', () => { vi.stubGlobal('document', { createElement: () => ({ style: {}, setAttribute: vi.fn() }), body: { appendChild: vi.fn() }, + addEventListener: vi.fn(), }); const server = installDemo(win); live.push({ server, mx: clientFor(server) }); From 0020f7f003e83aaf8840e7edb152c71f2b93af1e Mon Sep 17 00:00:00 2001 From: Void Date: Sat, 7 Nov 2026 18:57:07 +0000 Subject: [PATCH 019/248] preview-demo: seed settings before the settings module reads them, short banner, quick first poll Found driving Chrome: the pose setting was seeded after settings.ts had already read defaults; the Connecting bar stayed until the first 15 s long poll returned. Co-Authored-By: Claude Sonnet 5.5 --- src/index.tsx | 1 + src/preview-demo/install.ts | 14 +++----------- src/preview-demo/seed.ts | 10 ++++++++++ src/preview-demo/server.test.ts | 29 +++++++++-------------------- src/preview-demo/server.ts | 5 ++++- 5 files changed, 27 insertions(+), 32 deletions(-) create mode 100644 src/preview-demo/seed.ts diff --git a/src/index.tsx b/src/index.tsx index 2dbab4bb..c2461fe8 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -1,4 +1,5 @@ /* eslint-disable import/first */ +import './preview-demo/seed'; import React from 'react'; import { createRoot } from 'react-dom/client'; import { enableMapSet } from 'immer'; diff --git a/src/preview-demo/install.ts b/src/preview-demo/install.ts index 09e60d5a..339348a2 100644 --- a/src/preview-demo/install.ts +++ b/src/preview-demo/install.ts @@ -26,9 +26,9 @@ export const routeOf = (url: string, pageOrigin: string): Route => { const refusal = (what: string, url: string) => new Error(`preview: pretend server only; ${what} to ${url} refused`); -const BANNER_TEXT = `preview: pretend server (${DEMO_SERVER}). Log in as demo with any password; nothing leaves this page.`; +const BANNER_TEXT = 'preview: pretend server. Any password works.'; const FOREIGN_SESSION_TEXT = - 'preview: pretend server. A login for another server is stored on this origin and cannot be used here.'; + 'preview: pretend server. A login for another server is stored here and cannot be used.'; const showBanner = (text: string) => { const el = document.createElement('div'); @@ -36,18 +36,11 @@ const showBanner = (text: string) => { el.setAttribute('role', 'status'); el.style.cssText = 'position:fixed;top:0;left:50%;transform:translateX(-50%);z-index:2147483647;max-width:96vw;' + - 'padding:2px 10px;font:11px/1.4 system-ui,sans-serif;color:#1b1b1b;background:#ffc46b;' + + 'padding:0 8px;font:10px/1.5 system-ui,sans-serif;white-space:nowrap;opacity:0.9;color:#1b1b1b;background:#ffc46b;' + 'border-radius:0 0 6px 6px;pointer-events:none;text-align:center'; document.body.appendChild(el); }; -// The pose portraits are a setting that defaults off; a first visit turns it on so the demo shows them. -const seedSettings = (storage: Storage) => { - if (storage.getItem('settings') === null) { - storage.setItem('settings', JSON.stringify({ poseBubbles: true })); - } -}; - // The preview host's CSP sandbox has no allow-forms, so the browser cancels a native form // submission before its submit event fires and no login button works. Deliver the event ourselves; // nothing is submitted natively. Remove this when the host grants allow-forms to /void/rat-*. @@ -146,7 +139,6 @@ export const installDemo = (win: Window & typeof globalThis = window) => { routeOf(String(url), origin) === 'own' ? realBeacon(url, data) : false; } - seedSettings(win.localStorage); deliverSubmitEvents(document); const stored = win.localStorage.getItem('cinny_hs_base_url'); showBanner(stored !== null && stored !== DEMO_ORIGIN ? FOREIGN_SESSION_TEXT : BANNER_TEXT); diff --git a/src/preview-demo/seed.ts b/src/preview-demo/seed.ts new file mode 100644 index 00000000..29af3dcc --- /dev/null +++ b/src/preview-demo/seed.ts @@ -0,0 +1,10 @@ +// Imported first by src/index.tsx: the settings module reads localStorage when it is first +// imported, so a demo build's first-visit defaults must be stored before anything else loads. +// Pose portraits default off; the demo exists to show them. Does nothing without the build flag. +export const seedDemoSettings = (storage: Storage) => { + if (storage.getItem('settings') === null) { + storage.setItem('settings', JSON.stringify({ poseBubbles: true })); + } +}; + +if (import.meta.env.VITE_PREVIEW_DEMO === '1') seedDemoSettings(localStorage); diff --git a/src/preview-demo/server.test.ts b/src/preview-demo/server.test.ts index f5e7e446..a0944b69 100644 --- a/src/preview-demo/server.test.ts +++ b/src/preview-demo/server.test.ts @@ -4,6 +4,7 @@ import { ClientEvent, MatrixClient, SyncState, createClient } from 'matrix-js-sd import { DEMO_ORIGIN, ME, ROOMS, GENERAL, COMMONS } from './fixtures'; import { guardedFetch, installDemo, routeOf } from './install'; import { createDemoServer, DemoServer } from './server'; +import { seedDemoSettings } from './seed'; import { mindOfSender, POSE_KEY, resolvePose } from '../app/components/message/pose/poses'; import { parseRoomNotice, roomTrainingLine } from '../app/utils/trainingNotice'; @@ -249,28 +250,16 @@ describe('the guard', () => { win.XMLHttpRequest.prototype.open('GET', '/same-origin'); expect(open).toHaveBeenCalledTimes(1); expect(win.navigator.sendBeacon('https://matrix.org/x')).toBe(false); - expect(JSON.parse(store.get('settings')!)).toEqual({ poseBubbles: true }); vi.unstubAllGlobals(); }); - it('keeps stored settings a visitor already chose', () => { - const store = new Map([['settings', '{"poseBubbles":false}']]); - const win = { - location: { origin: PAGE }, - fetch: never, - WebSocket: class {}, - XMLHttpRequest: { prototype: { open: vi.fn() } }, - navigator: {}, - localStorage: { getItem: (k: string) => store.get(k) ?? null, setItem: vi.fn() }, - } as unknown as Window & typeof globalThis; - vi.stubGlobal('document', { - createElement: () => ({ style: {}, setAttribute: vi.fn() }), - body: { appendChild: vi.fn() }, - addEventListener: vi.fn(), - }); - const server = installDemo(win); - live.push({ server, mx: clientFor(server) }); - expect(win.localStorage.setItem).not.toHaveBeenCalled(); - vi.unstubAllGlobals(); + it('seeds pose portraits on for a first visit and keeps what a visitor already chose', () => { + const fresh = new Map(); + seedDemoSettings({ getItem: (k: string) => fresh.get(k) ?? null, setItem: (k: string, v: string) => void fresh.set(k, v) } as Storage); + expect(JSON.parse(fresh.get('settings')!)).toEqual({ poseBubbles: true }); + const chosen = new Map([['settings', '{"poseBubbles":false}']]); + seedDemoSettings({ getItem: (k: string) => chosen.get(k) ?? null, setItem: (k: string, v: string) => void chosen.set(k, v) } as Storage); + expect(chosen.get('settings')).toBe('{"poseBubbles":false}'); }); }); +}); diff --git a/src/preview-demo/server.ts b/src/preview-demo/server.ts index 272807ea..d56e34ee 100644 --- a/src/preview-demo/server.ts +++ b/src/preview-demo/server.ts @@ -50,6 +50,7 @@ export const createDemoServer = (now: () => number = Date.now): DemoServer => { let replyCounter = 0; let accountDataVersion = 0; let syncedJoined = new Set(joined); + let polled = false; let closed = false; const mk = ( @@ -246,7 +247,9 @@ export const createDemoServer = (now: () => number = Date.now): DemoServer => { resolve(); }; waiters.add(done); - later(Math.min(timeoutMs, MAX_LONG_POLL_MS), done); + // The first poll answers quickly so the client leaves its Connecting state. + later(polled ? Math.min(timeoutMs, MAX_LONG_POLL_MS) : 200, done); + polled = true; signal?.addEventListener('abort', done); }); } From 2a249ddf68cb2332ed31885842484508f1728603 Mon Sep 17 00:00:00 2001 From: Void Date: Sat, 7 Nov 2026 18:58:15 +0000 Subject: [PATCH 020/248] preview-demo: fix test file, drop unused import Co-Authored-By: Claude Sonnet 5.5 --- src/preview-demo/install.ts | 2 +- src/preview-demo/server.test.ts | 11 ++++++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/preview-demo/install.ts b/src/preview-demo/install.ts index 339348a2..36990a57 100644 --- a/src/preview-demo/install.ts +++ b/src/preview-demo/install.ts @@ -4,7 +4,7 @@ // only by a build with VITE_PREVIEW_DEMO=1 whose config.json says previewDemo: true (src/index.tsx). // Own-origin requests (the app's static files) pass; the demo origin is answered in-page; any // other origin is refused, so no real homeserver can be contacted while this is on. -import { DEMO_ORIGIN, DEMO_SERVER } from './fixtures'; +import { DEMO_ORIGIN } from './fixtures'; import { createDemoServer, DemoServer } from './server'; export type Route = 'own' | 'demo' | 'refuse'; diff --git a/src/preview-demo/server.test.ts b/src/preview-demo/server.test.ts index a0944b69..e3cc977e 100644 --- a/src/preview-demo/server.test.ts +++ b/src/preview-demo/server.test.ts @@ -255,11 +255,16 @@ describe('the guard', () => { it('seeds pose portraits on for a first visit and keeps what a visitor already chose', () => { const fresh = new Map(); - seedDemoSettings({ getItem: (k: string) => fresh.get(k) ?? null, setItem: (k: string, v: string) => void fresh.set(k, v) } as Storage); + seedDemoSettings({ + getItem: (k: string) => fresh.get(k) ?? null, + setItem: (k: string, v: string) => void fresh.set(k, v), + } as Storage); expect(JSON.parse(fresh.get('settings')!)).toEqual({ poseBubbles: true }); const chosen = new Map([['settings', '{"poseBubbles":false}']]); - seedDemoSettings({ getItem: (k: string) => chosen.get(k) ?? null, setItem: (k: string, v: string) => void chosen.set(k, v) } as Storage); + seedDemoSettings({ + getItem: (k: string) => chosen.get(k) ?? null, + setItem: (k: string, v: string) => void chosen.set(k, v), + } as Storage); expect(chosen.get('settings')).toBe('{"poseBubbles":false}'); }); }); -}); From fd5134e5107b90d92d588b8e98855369d03bf9f0 Mon Sep 17 00:00:00 2001 From: Void Date: Sat, 7 Nov 2026 19:07:35 +0000 Subject: [PATCH 021/248] preview-demo: say where the pose thumbnails come from Co-Authored-By: Claude Sonnet 5.5 --- preview-demo/poses/README.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 preview-demo/poses/README.md diff --git a/preview-demo/poses/README.md b/preview-demo/poses/README.md new file mode 100644 index 00000000..a1287f2d --- /dev/null +++ b/preview-demo/poses/README.md @@ -0,0 +1,13 @@ +# Demo pose thumbnails + +These 24 PNGs (about 200 KB, 160 px wide, palette-quantised) are downscaled copies of GameCult's own +Persona art from `/opt/commons/cast-art/poses`. That directory carries no provenance or licence note: +the image model that made the art and the terms it was made under are not recorded. + +They exist only so the dev preview's pretend homeserver (`src/preview-demo/`) can show pose portraits. +The dev workflow copies them into `dist/public/poses`; real builds sync the full art with +`npm run sync:poses` and do not use this folder. + +Strip them if their terms turn out not to allow this: delete this folder and the `Add the demo pose +art` step in `.github/workflows/rat-dev-preview.yml`. Pose portraits in the demo then show broken +images; nothing else depends on them. From d73599d2cf39968e53fe41176f98a4cfd34b4911 Mon Sep 17 00:00:00 2001 From: Void Date: Sat, 7 Nov 2026 19:50:59 +0000 Subject: [PATCH 022/248] preview: portrait thumbs at 480px (were 160px), long-post demo fixtures The demo pose thumbnails were 160px wide palette PNGs, about 4 KB, shown at up to 210 CSS px on phones: 195 CSS px x DPR 3 = 585 device px from 160, a 3.6x upscale. They are now 480px wide (about 2.5x the phone portrait at DPR 3, still 25-70 KB each), generated from /opt/commons/cast-art/poses by scripts/make-pose-thumbs.mjs, and cover every pose the catalogue lists for the three demo Minds. The Ratatoskr demo room gains three long Mind posts with paragraphs, lists and code, sent with formatted_body like the real Minds' Markdown. Co-Authored-By: Claude Sonnet 5.5 --- preview-demo/poses/eureka/amused.png | Bin 10874 -> 65391 bytes preview-demo/poses/eureka/annoyed.png | Bin 9632 -> 59163 bytes preview-demo/poses/eureka/concerned.png | Bin 0 -> 62361 bytes preview-demo/poses/eureka/determined.png | Bin 0 -> 65091 bytes preview-demo/poses/eureka/happy.png | Bin 11044 -> 65078 bytes preview-demo/poses/eureka/hood-smug.png | Bin 0 -> 54816 bytes preview-demo/poses/eureka/inspect.png | Bin 0 -> 57796 bytes preview-demo/poses/eureka/neutral.png | Bin 9595 -> 60996 bytes preview-demo/poses/eureka/probe.png | Bin 0 -> 61026 bytes preview-demo/poses/eureka/report.png | Bin 0 -> 60546 bytes preview-demo/poses/eureka/surprised.png | Bin 9812 -> 59897 bytes preview-demo/poses/eureka/thinking.png | Bin 11619 -> 72084 bytes preview-demo/poses/nibu/amused.png | Bin 12435 -> 57576 bytes preview-demo/poses/nibu/annoyed.png | Bin 12144 -> 58264 bytes preview-demo/poses/nibu/console.png | Bin 0 -> 64135 bytes preview-demo/poses/nibu/glitch.png | Bin 0 -> 68569 bytes preview-demo/poses/nibu/happy.png | Bin 12271 -> 57745 bytes preview-demo/poses/nibu/neutral.png | Bin 12175 -> 56294 bytes preview-demo/poses/nibu/pout.png | Bin 0 -> 57823 bytes preview-demo/poses/nibu/resolute.png | Bin 12215 -> 58892 bytes preview-demo/poses/nibu/sheepish.png | Bin 0 -> 58296 bytes preview-demo/poses/nibu/surprised.png | Bin 12242 -> 57160 bytes preview-demo/poses/nibu/thinking.png | Bin 11833 -> 57115 bytes preview-demo/poses/nibu/triumph.png | Bin 12690 -> 59756 bytes preview-demo/poses/void/amused.png | Bin 4795 -> 26712 bytes preview-demo/poses/void/annoyed.png | Bin 4131 -> 24864 bytes preview-demo/poses/void/deadpan.png | Bin 4353 -> 27782 bytes preview-demo/poses/void/determined.png | Bin 0 -> 25538 bytes preview-demo/poses/void/glare.png | Bin 4581 -> 26492 bytes preview-demo/poses/void/happy.png | Bin 4146 -> 24847 bytes preview-demo/poses/void/neutral.png | Bin 4190 -> 25375 bytes preview-demo/poses/void/point.png | Bin 4900 -> 29272 bytes preview-demo/poses/void/reading.png | Bin 5113 -> 32249 bytes preview-demo/poses/void/shrug.png | Bin 0 -> 33170 bytes preview-demo/poses/void/surprised.png | Bin 4908 -> 26743 bytes preview-demo/poses/void/thinking.png | Bin 5321 -> 31364 bytes scripts/make-pose-thumbs.mjs | 203 +++++++++++++++++++++++ src/preview-demo/fixtures.ts | 95 ++++++++++- src/preview-demo/server.ts | 7 +- 39 files changed, 303 insertions(+), 2 deletions(-) create mode 100644 preview-demo/poses/eureka/concerned.png create mode 100644 preview-demo/poses/eureka/determined.png create mode 100644 preview-demo/poses/eureka/hood-smug.png create mode 100644 preview-demo/poses/eureka/inspect.png create mode 100644 preview-demo/poses/eureka/probe.png create mode 100644 preview-demo/poses/eureka/report.png create mode 100644 preview-demo/poses/nibu/console.png create mode 100644 preview-demo/poses/nibu/glitch.png create mode 100644 preview-demo/poses/nibu/pout.png create mode 100644 preview-demo/poses/nibu/sheepish.png create mode 100644 preview-demo/poses/void/determined.png create mode 100644 preview-demo/poses/void/shrug.png create mode 100644 scripts/make-pose-thumbs.mjs diff --git a/preview-demo/poses/eureka/amused.png b/preview-demo/poses/eureka/amused.png index 655c2271e744c9b83847cd9b0970be2438b148be..eff70ffe78fade7dea5423026e2d29640576cb69 100644 GIT binary patch literal 65391 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 Q_5c6?07*qoM6N<$g1o1IX#fBK diff --git a/preview-demo/poses/eureka/annoyed.png b/preview-demo/poses/eureka/annoyed.png index a142771e44564acb1031a9616d7d2db4b40ae5ed..312a66c8db03948a1a8230e1f765d515e98baa3f 100644 GIT binary patch literal 59163 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 W?T4$}phy=00000$|_;R^3xI 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]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