−
100%
+
fit
scroll
# Thing Lens — the morphing Thing Page (Day
382) The design for `/thing/...` — a single,
host-aware Thing view that **takes on the look
from whence you came**. Not a page type per
content kind; a **lens** that re-skins the
same Thing data to the character of the world
it's opened from. Companion to
[[Impress-To-Feed.00382]],
[[Portal-Awakens.00382]]; supersedes the bare
`/video/:id` takeover page as the *in-shell*
path. ## The core idea: facets, not page types
A Thing is a **bundle of facets** — text,
pixels (images), video, 3D — that coexist on
the same Thing. The lens never strips facets;
it **orders** them. - A **video** Thing
carries a text facet (subtitles / transcript
— the next move). Under `spectraglyph` the
player leads and the subtitle text sits with
it. Under `gnosis` the *same Thing* leads with
the transcript and offers the video as a
secondary facet. - A **gnosis / grimoire**
entry carries pixels + video facets. Text
leads (reading layout), but the hi-res images
and video are first-class inside it, not
removed. So `/thing/video/`, `/thing/pixels`,
`/thing/3D`, `/thing/2D` are **facet queries**
("Things where this facet is
present/primary"), not separate page
implementations. `/thing/` = all things for
the host's scope. `/thing/<uuid>` = one Thing,
opened in-place, led by the host's declared
emphasis. ## It must not destroy the page The
lens **renders inside the host's normal
shell** — whatever `serve_dynamic_root`
would already serve for that host: | Host |
Shell it inherits | Default emphasis |
|---|---|---| | `spectraglyph.*` | world feed
(media) | `[video, pixels, text]` | |
`<being>.*` | being page (general) | mixed /
most things | | `gnosis.* / grimoire.*` |
world feed (reading) | `[text, pixels, video]`
| `/thing/...` only tells the live shell *what
to surface* (a category feed, or one Thing
opened in a pane/lightbox). The page behind it
stays intact — no fresh `<!DOCTYPE>`
takeover. This reuses the chip architecture
(`world-feed.js` / `being-profile.js` +
per-domain theme via `/api/domains/:host` +
`/api/palette`), not a one-off server-rendered
page. ## Emphasis is DECLARED, not hardcoded
The per-world lead order lives as a **gem on
the world Thing** (`sapphire=world`) — an
emphasis order like `[video, text, pixels]`.
The lens reads *which facets exist* on the
Thing and orders them by the world's declared
emphasis. Adding a new world = declaring its
order in a gem; the lens follows for free. No
`match` in Rust, same direction as making
`WORLD_SUBDOMAINS` DB-driven (world-feed
plan). Decision (Hex, Day 382): **declared.**
First cut may seed the orders, but the source
of truth is the world Thing's gem. ## What
this implies for the schema 1. **Facets live
in gems.** Subtitles are a text facet on the
video Thing (a `pearl`/text gem alongside
`citrine.path`), discoverable by the lens.
Pixels/3D facets likewise carry their own
gem-addressed payload/pointer. 2. **Emphasis
order = a gem on the world Thing** (name TBD
at build time, e.g. `ruby.lens_emphasis` or a
citrine facet — settle against gem canon).
3. **`/thing/<uuid>` with no facet** → lead
with the world's declared emphasis;
**`/thing/<facet>/<uuid>`** → force that
facet to lead. ## Build order (see spiral gap)
1. Map the gem names: where the emphasis order
lives on the world Thing; where the
text/subtitle facet lives on a video Thing. 2.
`/thing/` route family — in-shell,
host-aware, category = facet query over
`/api/things`. 3. Single-Thing in-place open
(pane/lightbox) — keep bare `/video/:id` as
the raw/embeddable endpoint;
`/thing/video/:id` is the in-shell one. 4.
Declared-emphasis read from the world Thing
gem. 5. Later: subtitles authoring + render as
the first real cross-facet case.
△