Live Clown Message Test

This live test loads the Clown bitmap glyph family directly from https://phosend.com/images/Clown/ and assembles a top-of-page message with plain vanilla JavaScript.

Pen Lettering

First generation Pen ยท 2026-04-10

This Pen captures the current understanding of the letter-based message display system for Intake. It is not the final renderer. It is the present doctrine: the observed control model, the intended object hierarchy, and the first practical rendering strategy.

Purpose

The message displayer is treated as a transparent, parent-bound lettering layer that lives above a moving video base. Each displayed character is not ordinary text. Each character is a visual object that samples the moving image beneath it and expresses a sense of buriedness through opacity and masking.

The emphasis here is on the lettering system itself, not on Reggie, broader scene choreography, or other stage behavior.

Core Observations

Identity Binding

The parent establishes a one-to-one relationship with the displayer through the fvent lane. The child drains that lane and learns which named branch of Parental belongs to it.

Parental.qaram = "DispA";
Parental.dommand = "Start";

var cmd = Parental("fvent");
if (cmd === "Start" && Parental.qaram === "DispA") {
  myId = "DispA";
}

Once the displayer knows it is DispA, it understands that its root branch is Parental.DispA and its ordinated children will be Parental.DispA01, Parental.DispA02, and so on.

Hierarchical Control Model

Parental -> DispA -> text -> opacity -> state -> count -> DispA01 -> text -> mode -> font -> opacityLocal -> DispA02 -> text -> mode -> font -> opacityLocal -> DispA09 -> text -> mode -> font -> opacityLocal

The root object carries the truth of the whole message. The ordinal children specialize individual letters. This keeps shared concerns at the group level and character-specific concerns at the leaf level.

Parental.DispA = {
  id: "DispA",
  text: "WELCOME HOME",
  opacity: 0.62,
  state: "Active",
  count: 12
};

Parental.DispA09 = {
  index: 9,
  text: "H",
  mode: "bitmap",
  font: "WeatheredRomanA",
  opacityLocal: 0.88
};

Letter Object Model

Each visible character is a composite object with two principal visual layers:

<div class="glyph">
  <img id="MsgD09" src="glyphs/H.png" alt="" />
  <canvas id="MsgC09"></canvas>
</div>

The image defines the visible glyph form. The canvas receives copied video pixels and is clipped to the glyph fill. The opacity of that canvas is used as the depth or buriedness signal.

Video Mixing Strategy

The parent page carries the base video layer. The displayer iframe remains transparent and occupies only the message region. Each glyph canvas samples the shared base video and applies a clipping operation so that moving content is visible only inside the bounds of the glyph.

ctx.drawImage(video, sx, sy, sw, sh, 0, 0, cw, ch);
ctx.globalCompositeOperation = "destination-in";
ctx.drawImage(glyphImage, 0, 0, cw, ch);
canvas.style.opacity = effectiveOpacity;

For a first test, direct access to the parent video element through parent.document is the most practical route. Later versions may publish crop metadata or frame state through Parental.

Transparency and Overlap

The iframe background should remain transparent. The message region can be a rectangular overlay that sits above the normal beach/video layer. Glyph objects may overlap slightly according to simple bitmap kerning rules.

.message-root {
  position: absolute;
  inset: 0;
  background: transparent;
}

.glyph {
  position: absolute;
}

.glyph img,
.glyph canvas {
  position: absolute;
  inset: 0;
}

Kerning and Ordination

The first implementation should use normal, restrained kerning. Each letter uses a two-digit ordinal suffix, which is sufficient for a 10 to 15 character message. Ordination is part of the control strategy, not just a display convenience.

Parental.DispA01
Parental.DispA02
Parental.DispA03
...
Parental.DispA09
Parental.DispA10

Width can come from the glyph image itself. Position can be determined by cumulative advance plus an optional local adjustment field such as xAdjust.

Effective Opacity Model

Group-level and letter-level control should multiply cleanly so that the whole message can be softened or buried together while still permitting local variation.

effectiveOpacity =
  (Parental.DispA.opacity ?? 1) *
  (Parental.DispA09.opacityLocal ?? 1);

Short Test Display

The best first proof is a short word rather than a full sentence. A word such as WELCOME, INTAKE, or ASHORE is enough to prove:

Current Strategy

Scope Boundary

It does establish the current doctrine clearly enough for follow-on conversations to reason from the same anchor.