From 7a1c3ec7e46f12e3d2dd4e96de79a7de86143277 Mon Sep 17 00:00:00 2001 From: Stephen Shaw Date: Sat, 25 Apr 2026 02:00:23 -0600 Subject: [PATCH 1/2] configurator: TypeScript/Vite rewrite of the docker config generator MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replaces the existing inline ~1100-line index.html configurator with a proper TypeScript app under configurator/. Same user-facing surface (compose / docker run output, share-link round-trip, platform presets, advanced options), now with unit + e2e tests, type-checked code, and per-file modularity. Highlights: - src/generator.ts: pure Config → string spec/render split. Always emits ROON_INSTALL_BRANCH explicitly (resolves issue #12 — the configurator no longer omits the var for the production case, which was leaving users stranded when the entrypoint had sticky behavior). Quotes user: "0:0" to avoid YAML 1.1 sexagesimal parsing. Defense- in-depth YAML/shell quoting with positive + negative tests for every option. - public/platforms/: 6 presets (qnap, synology, unraid, truenas, linux, custom) as JSON files validated against schema.json. truenas.json uses userOverride: "0:0" to force root inside the container, working around TrueNAS Apps' UID 568 default. unraid.json's hint warns about the cache-only precondition before suggesting /mnt/cache/ — earlier wording risked DB corruption when Mover migrated the SQLite database mid-write. - src/main.ts: DOM orchestration. Single source of truth in DOM, with URL > localStorage > defaults precedence on init. Validation surfaces via aria-invalid + aria-describedby; output regen on every change. - WCAG 2.1 AA: skip link, focus-visible outlines, roving tabindex on the output mode tabs, contrast-tuned surface palette, prefers- reduced-motion + forced-colors handling. - Loading overlay: full-viewport icon (left half-moon + three audio bars pulsing out of phase, modeled on the desktop app's footer_loading animateddrawable). Fades out when the app marks itself ready; window 'load' listener is the failsafe;