Simulator console browser build

The shipped console targets Safari 9 on OS X 10.11. It retains the current npm versions of xterm and noVNC. Actual Safari 9 qualification still requires an OS X 10.11 machine; ES5 parsing and browser fallback tests do not replace that gate.

Run npm ci --ignore-scripts, then:

Vite's development server requires a modern browser. Use the built preview for Safari 9; the production build does not require ES modules or a module loader.

Styles

src/styles/main.scss composes the palette, base layout, controls, and workspace feature styles. Sass resolves both appearance palettes into ordinary CSS; Autoprefixer targets Safari 9. Layout uses Flexbox without flex gap or CSS Grid. Open-panel layout state comes from the workspace feature, without :has(). Static Geist, Geist Mono, and Space Grotesk fonts include WOFF files.

Mojave remains the primary design reference. The default appearance is light; dark appearance is an explicit saved choice, independent of OS preferences.

The console applies the captured Mojave HIG to its workspace controls:

Machine lifecycle controls follow the last successful controller status and stay disabled during a pending machine operation. Failed status refreshes mark the displayed state unavailable until a successful refresh. These UI checks supplement the controller's validation; they do not replace it.

These are browser adaptations of the source guidance, not native AppKit controls or a claim of complete HIG conformance. The project's font stack and manual theme selection remain deliberate project choices.

JavaScript and browser services

Vite emits one classic app.js; Babel transforms the application and dependencies to ES5. Acorn rejects incompatible syntax during every build. Polyfills are bundled locally for language features, fetch, abort signals, text encoding, resize observation, pointer events, and DOM operations. Event listener adaptation preserves once, capture, removal, and abort cleanup on older WebKit. SHA-256 verification does not depend on WebCrypto availability.

The noVNC build uses an exact-integer JSBI adapter and negotiates ordinary VNC encodings instead of WebCodecs H.264. The adapter and guarded build transform live in the repository; installed dependencies are not edited. Guest pixels are not modified by these adaptations.

The build also guards Zod's unused BigInt range initialization. The JSON control protocol does not use bigint schemas. Dependency transforms fail when their expected source changes, so package upgrades require an explicit compatibility review.

WebGL falls back to the standard terminal renderer. Inline terminal images need WebAssembly and are explicitly unavailable when the browser lacks it. On browsers without the download attribute, completed exports provide a link to open the file and save it through the browser's File menu.

Qualification

Run python tests/simulator/test_web_demo.py after building the demo and the controller tests in tests/simulator/test_runtime.py after building the live UI. Fallback tests deliberately remove newer browser APIs. They test compatibility paths, not the rendering engine or security behavior of Safari 9 itself.

On an actual OS X 10.11 installation, verify both appearances, terminal input and resize, reconnect, VNC rendering and input, file import/export, keyboard navigation, and narrow layouts. Record the exact Safari version and any unsupported optional capabilities. Do not mark this platform qualified from a user-agent override or a current Playwright WebKit run.

Source document