Skip to content
Docs
Open Promoeyes
keyboard-type

keyboard-type

KEYBOARD-TYPE — a macro on the MacBook's keyboard types "Promo", Return starts a render, and the camera pulls out to the whole machine on a desk at night. One shot, 9 s. 1 unit = 1 mm. Preview: http://localhost:4444/runtime?project=promos/primitives/devices/keyboard-type/keyboard-type.promo

Read the rig's notes
THE LAPTOP — <laptop> loads macbook_parts.glb (scripts/device-models/macbook.mts). Its keycaps
are MERGED meshes (one per legend texture box), so no single key can move on its own. A typed
key is therefore an OVERLAY: a keycap of our own, 0.1 mm larger than the real cap on every side
so it hides it completely, with its own legend on top. The overlay rests 0.4 mm proud of the
real cap top and presses down to 0.03 mm above it — a 0.37 mm stroke. It cannot start flush:
an overlay pushed below the real cap's top would let the real cap show through, so
"unpressed" has to be the raised state. At 0.6 mm the resting hero keys read as popped out of
the row in the macro; 0.4 keeps the step under the bevel highlight while the stroke still
shows, and the flash carries the rest. (0.03 mm is clean at the macro's ~160 mm; the keys
are only ever pressed in the macro.)

WHERE THE KEYS ARE — macbook.mts lays the keyboard out in model mm (KX0 −136.15, pitch 18.95,
caps 16.46 × 15.96, row centres ROW_Y, cap top KZ1 = 3.49, web plate top 2.45; BASE() maps
its X/Y/Z to world x/−z/y). The <laptop> fit scales by 237.8 / 237.7795 (≈ 1) and recentres;
with anchor=bottom the rig origin is the feet, so model (x, y, z) → rig (x, y + 10.651,
z + 44.577). Rig space, laptop at the origin, rotation 0:
  cap top y 14.141 · web plate top y 13.101
  R  x −42.645  z −6.498        O  x 52.105  z −6.498        P  x 71.055  z −6.498
  M  x  28.418  z 30.407        Return  x 120.80  z 11.957  (30.67 wide)
  screen centre (0, 128.04, −125.27), facing (0, 0.342, 0.940) — the lid leans back 20°
Overlay cap: extruded-rounded-rect 15.96 × 15.46 r 1.45 + 0.35 bevel (outer 16.66 × 16.16),
1.42 tall, centre y 13.83 at rest (top 14.541) and 13.46 pressed (top 14.17).

A KEYSTROKE — down 45 ms (easeInQuad), held 45 ms, back up 120 ms (easeOutCubic); Return holds
longer and travels the same 0.37 mm. At the bottom of each stroke (t0 + 0.045):
  · the legend's emissive flashes to 2.4 and settles to a 0.55 glow (typed keys stay lit)
  · a backlight halo — a flat plate on the web, wider than the cap — flashes in the gaps
  · a small point light INSIDE the overlay lights the neighbours' walls and the web only
    (their tops face away from it), which is how light leaks out of a backlit keyboard
  · the screen's typewriter steps one character (hold keys: 0.2 / 0.4 / 0.6 / 0.8 / 0.95,
    since the caret only draws while 0 < p < 1; Return takes it to 1 and drops the caret)
Strokes: P 0.95 · r 1.21 · o 1.45 · m 1.66 · o 1.89 · Return 2.45.

THE CAMERA — a low (24°) macro, 15° off square, from in front of the right half: R at the
left edge 46 mm behind focus (soft, but its flash reads), M left of centre, O and P centre
right; it trucks right while typing so Return is whole for its stroke, then from 2.62 pulls
straight back and up to the hero three-quarter (5.75), racking focus from the keys (~175 mm)
to the screen (853 mm), and drifts left to the end.
dof_pass=three.

THE SET — a walnut desk against a wall at night: felt mat under the laptop, a white mug and
a stack of books back left, a notebook and pen back right. The desk lamp is off frame upper
left: its spot is the warm key, and a second, wider spot is its spill on the wall behind. A
cool area rim behind right, and an area light ON the screen (its size, facing out of it) so
the display spills onto the keys.

UI SOURCE — keyboard-type.screens.html (Tailwind only), converted by
`npx tsx scripts/html-screens.mts keyboard-type.screens.html keyboard-type.sections.json
keyboard-type.screens.json`. The converted card is dropped in under the screen overlay; the
only hand edits are ids on the few text nodes the converter leaves unnamed and the animation
channels.
Topic
devices
Scenes
1
Kind
reference rig
//
    KEYBOARD-TYPE — a macro on the MacBook's keyboard types "Promo", Return starts a render,
    and the camera pulls out to the whole machine on a desk at night. One shot, 9 s.
    1 unit = 1 mm. Preview:
    http://localhost:4444/runtime?project=promos/primitives/devices/keyboard-type/keyboard-type.promo

    THE LAPTOP — <laptop> loads macbook_parts.glb (scripts/device-models/macbook.mts). Its keycaps
    are MERGED meshes (one per legend texture box), so no single key can move on its own. A typed
    key is therefore an OVERLAY: a keycap of our own, 0.1 mm larger than the real cap on every side
    so it hides it completely, with its own legend on top. The overlay rests 0.4 mm proud of the
    real cap top and presses down to 0.03 mm above it — a 0.37 mm stroke. It cannot start flush:
    an overlay pushed below the real cap's top would let the real cap show through, so
    "unpressed" has to be the raised state. At 0.6 mm the resting hero keys read as popped out of
    the row in the macro; 0.4 keeps the step under the bevel highlight while the stroke still
    shows, and the flash carries the rest. (0.03 mm is clean at the macro's ~160 mm; the keys
    are only ever pressed in the macro.)

    WHERE THE KEYS ARE — macbook.mts lays the keyboard out in model mm (KX0 −136.15, pitch 18.95,
    caps 16.46 × 15.96, row centres ROW_Y, cap top KZ1 = 3.49, web plate top 2.45; BASE() maps
    its X/Y/Z to world x/−z/y). The <laptop> fit scales by 237.8 / 237.7795 (≈ 1) and recentres;
    with anchor=bottom the rig origin is the feet, so model (x, y, z) → rig (x, y + 10.651,
    z + 44.577). Rig space, laptop at the origin, rotation 0:
      cap top y 14.141 · web plate top y 13.101
      R  x −42.645  z −6.498        O  x 52.105  z −6.498        P  x 71.055  z −6.498
      M  x  28.418  z 30.407        Return  x 120.80  z 11.957  (30.67 wide)
      screen centre (0, 128.04, −125.27), facing (0, 0.342, 0.940) — the lid leans back 20°
    Overlay cap: extruded-rounded-rect 15.96 × 15.46 r 1.45 + 0.35 bevel (outer 16.66 × 16.16),
    1.42 tall, centre y 13.83 at rest (top 14.541) and 13.46 pressed (top 14.17).

    A KEYSTROKE — down 45 ms (easeInQuad), held 45 ms, back up 120 ms (easeOutCubic); Return holds
    longer and travels the same 0.37 mm. At the bottom of each stroke (t0 + 0.045):
      · the legend's emissive flashes to 2.4 and settles to a 0.55 glow (typed keys stay lit)
      · a backlight halo — a flat plate on the web, wider than the cap — flashes in the gaps
      · a small point light INSIDE the overlay lights the neighbours' walls and the web only
        (their tops face away from it), which is how light leaks out of a backlit keyboard
      · the screen's typewriter steps one character (hold keys: 0.2 / 0.4 / 0.6 / 0.8 / 0.95,
        since the caret only draws while 0 < p < 1; Return takes it to 1 and drops the caret)
    Strokes: P 0.95 · r 1.21 · o 1.45 · m 1.66 · o 1.89 · Return 2.45.

    THE CAMERA — a low (24°) macro, 15° off square, from in front of the right half: R at the
    left edge 46 mm behind focus (soft, but its flash reads), M left of centre, O and P centre
    right; it trucks right while typing so Return is whole for its stroke, then from 2.62 pulls
    straight back and up to the hero three-quarter (5.75), racking focus from the keys (~175 mm)
    to the screen (853 mm), and drifts left to the end.
    dof_pass=three.

    THE SET — a walnut desk against a wall at night: felt mat under the laptop, a white mug and
    a stack of books back left, a notebook and pen back right. The desk lamp is off frame upper
    left: its spot is the warm key, and a second, wider spot is its spill on the wall behind. A
    cool area rim behind right, and an area light ON the screen (its size, facing out of it) so
    the display spills onto the keys.

    UI SOURCE — keyboard-type.screens.html (Tailwind only), converted by
    `npx tsx scripts/html-screens.mts keyboard-type.screens.html keyboard-type.section