Targets · JavaScript · Naming considerations
A Program name nests to any depth — Ui.Button.Integer.Increment . This page is how that dotted name is carried into JavaScript.
How a Program becomes JavaScript, in parts. Start with the introduction, then follow each part into the rendered output and the runtime it links against.
JavaScript is the easy case: the dotted name is kept exactly as written. There is nothing to munge.
Left to itself, idiomatic JavaScript would reach for ES modules and named imports ( import { increment } from './ui/button/integer.js' ), which throws the dotted name away, or a flat bag of functions. Neither preserves the shape a Program author sees.
We do not need to fake it: JavaScript member access is dotted property access. The renderer emits each namespace segment as a nested plain object and hangs the leaf on it, so Ui.Button.Integer.Increment is a genuine property path resolved by the engine — not a string trick.
The objects are created once, up front, in dependency order. A record TYPE type is the leaf itself — a class ( Geometry.Point ) or, for a built-in value type, a native primitive ( Maths.Integer → number ).
Use the nested-object namespace directly — there is no compromise to make. Program's names survive into JavaScript with no renaming, no flattening, and no wrapper; the only identifiers ever rewritten are ordinary variables that collide with a reserved word . This is the target the others are measured against.