html
uisset 124× in templates and rigs
A real-HTML stage, the `ui` twin: its children are DOM markup and a `style(text=…)` child is the CSS, rendered to a texture with time pinned to the scene (CSS @keyframes are seeked). Inside a device it is the screen, standing alone a flat panel, under a material's `*_map_from` slot a texture source.
html#m22-emit-page-page(width=600 height=340 coords_width=1200 emit=8 position="-90 -20 -60" rotation="0 12 0")
Attributes
heightnumberThe stage's height, mm (a bare free-standing tag: 1080).124×widthnumberThe stage's width, mm (a bare free-standing tag: 1920).124×coords_widthnumberLays the page out this many CSS px wide and scales it onto the stage (390 puts a phone page on a 71 mm glass).117×fillcolour #rrggbbThe page's background colour.76×relieftextTurns the page into a height map for a displacement or bump slot: `luma` (lightness is height), `alpha` (coverage), `ao`, `depth` or `normal`.36×relief_blurnumberSoftens the relief's edges into a bevel, CSS px (default 0).19×relief_gammanumberGamma on the relief's heights (default 1).10×coords_heightnumberThe page's CSS px height (default: from `coords_width` and the stage's shape).9×relief_inverttrue / false`true` swaps high and low.9×xnumberA free-standing panel's x position, mm, when `position` is not given.7×ynumberA free-standing panel's y position, mm (y up), when `position` is not given.7×position"x y z"4×rotation"x y z"3×emitnumberMakes the page a light: an area light of its size, coloured by the page's mean colour, at this intensity × its mean brightness.1×relief_strengthnumberThe slope of a `normal` relief (default 2).1×Where it goes
Written under
Holds
Examples
html#m22-emit-page-pagein uis/html-mapsOpen and play →html#m22-emit-page-page(width=600 height=340 coords_width=1200 emit=8 position="-90 -20 -60" rotation="0 12 0")
style(text=".s{height:100%;background:#000;position:relative;overflow:hidden;font:900 120px system-ui;color:#fff;display:grid;place-items:center} .s::before{content:'';position:absolute;inset:-30%;background:conic-gradient(from 0deg,#ff6b6b,#ffb86b,#4ade80,#22d3ee,#5b8cff,#c14bff,#ff6b6b);filter:blur(30px);animation:spin 7s linear infinite} @keyframes spin{to{transform:rotate(360deg)}} .s b{position:relative;mix-blend-mode:overlay}")
div.s
b(text="EMIT")
html#s01-pagein uis/htmlOpen and play →html#s01-page(width=1920 height=1080 x=960 y=540)
opacity
0 0
0.7 easeOutCubic 1
style(text=".hero{height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:28px;font-family:system-ui,sans-serif} h1{font-size:170px;line-height:1;margin:0;font-weight:800;letter-spacing:-0.03em;background:linear-gradient(90deg,#35e0ff,#9b6bff 60%,#ff7ad9);-webkit-background-clip:text;background-clip:text;color:transparent} p{font-size:42px;color:#8ea3c8;margin:0} .bar{width:920px;height:16px;border-radius:8px;background:#14233a;overflow:hidden;box-shadow:inset 0 0 0 1px #1e4457} .bar i{display:block;height:100%;width:calc(var(--p,0)*100%);background:linear-gradient(90deg,#35e0ff,#9b6bff)} .row{display:flex;gap:18px} .chip{padding:14px 30px;border-radius:999px;background:#0d3a4d;color:#9ff0ff;font-size:30px;font-weight:700;border:1.5px solid #35e0ff;animation:pop .8s cubic-bezier(.2,.8,.2,1) both;animation-delay:calc(1s + var(--i)*.25s)} @keyframes pop{from{transform:translateY(40px) scale(.7);opacity:0}to{transform:none;opacity:1}}")
div.hero
h1(text="Hello, HTML")
p(text="markup in, texture out — flexbox, gradients and @keyframes are the runtime's")
div.bar
i
div.row
span.chip(style="--i:0" text="html")
span.chip(style="--i:1" text="html3d")
span.chip(style="--i:2" text="drawElementImage")
span.chip(style="--i:3" text="foreignObject")
html#s04-pagein uis/htmlOpen and play →html#s04-page(width=1920 height=1080 x=960 y=540)
style(text=".stage{height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:54px;font-family:system-ui,sans-serif;color:#e8eefc} .cards{display:flex;gap:26px} .card{width:250px;height:300px;border-radius:24px;background:linear-gradient(160deg,#0f1c30,#0a1220);border:1px solid #1e3550;box-shadow:0 30px 60px -28px #000d;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:14px;animation:rise .9s cubic-bezier(.2,.9,.2,1.1) both;animation-delay:calc(.3s + var(--i)*.22s)} .card b{font-size:56px;letter-spacing:-0.03em} .card small{color:#7f90b0;font-size:16px;letter-spacing:.14em;text-transform:uppercase} @keyframes rise{from{opacity:0;transform:translateY(120px) rotate(-6deg) scale(.8)}to{opacity:1;transform:none}} .ring{width:110px;height:110px;border-radius:50%;border:10px solid #14233a;border-top-color:#35e0ff;border-right-color:#9b6bff;animation:spin 1.6s linear infinite} @keyframes spin{to{transform:rotate(360deg)}} .row{display:flex;align-items:center;gap:40px} .pulse{width:24px;height:24px;border-radius:50%;background:#41e6a0;position:relative} .pulse::after{content:'';position:absolute;inset:-4px;border-radius:50%;border:3px solid #41e6a0;animation:ping 1.4s ease-out infinite} @keyframes ping{from{transform:scale(1);opacity:1}to{transform:scale(3);opacity:0}} .clock{font-variant-numeric:tabular-nums;font-size:34px;color:#8ea3c8} .clock b{color:#eaf6ff} .marquee{width:900px;overflow:hidden;white-space:nowrap;border-radius:14px;background:#0b1622;border:1px solid #1e3550;padding:14px 0} .marquee span{display:inline-block;padding-left:100%;font-size:26px;color:#9ff0ff;animation:slide 6s linear both} @keyframes slide{to{transform:translateX(-100%)}} .card:nth-child(1) b{color:#35e0ff} .card:nth-child(2) b{color:#9b6bff} .card:nth-child(3) b{color:#ff7ad9} .card:nth-child(4) b{color:#41e6a0}")
div.stage
div.cards
div.card(style="--i:0")
b(text="rise")
small(text="staggered entrance")
div.card(style="--i:1")
b(text="spin")
small(text="1.6s linear ∞")
div.ring
div.card(style="--i:2")
b(text="ping")
small(text="pseudo-element")
div.pulse
div.card(style="--i:3")
b(text="delay")
small(text="calc(var(--i) * .22s)")
div.row
div.clock
| scene time
b(text=" --t")
| ; capture, scrub and playback render the same frame
div.marquee
span(text="animation-play-state: paused · animation-delay: authored − t · the DOM sits still while the reel decides what time it is ·")