Repository navigation
Archive Rendering Printer Config
Carried over from the earlier enumeratio, and never fully built even there. Written for a pg-backed table/Properties UI that no longer exists, but the core idea — presenting a property is printer config (naming, linking, target environment), not one fixed rendering — is still open. It partly overlaps current Rendering Environments (the environment-capability record); per-column printer config and link/history-as-config are not built.
Design note settling the printer-config model behind a property's presentation. Thesis: how a property is named and whether it links in a table/Properties cell is not a fixed rendering — it is config for the printer that renders that property, alongside the visual axes. Ties the render axes (representation × format × medium × alphabet, see Render Assets) to a broader "printer config" that also covers naming, linking, and the target environment. Unblocks the per-column context menu (#62).
A cell in the elements table or the Properties inspector shows some property of a resource — a stat, a map image, the element itself, later any collection/carrier/element reference. There is no single "right" way to show it: a permutation can print as a word, a cycle notation, a one-line title, or a link to its own explorer page. Every one of those is the same property data run through a printer with different config. The render axes already say this for the visual form (which space, which medium, which alphabet); this note extends the same framing to two more knobs — naming and linking — and to the environment the printer targets.
So the full config for presenting one property is three groups:
| group | what it configures |
|---|---|
| visual | the existing render axes — representation (line / page / scene), format, medium (ascii · unicode · latex), alphabet (radix, balanced, symbol set). One category among several, not the whole story. |
| name | how the property identifies itself — by id, title, notation, or a derived form. |
| link | whether the value is a link, where it points, and the browsing semantics of following it. |
All three resolve against the target environment's capabilities (below).
A property needs a label (its column header, its inspector row) and, for reference-valued properties (a map image, a sibling collection), the value itself needs a name too. Four naming modes, in rising specificity:
-
id — the raw handle (
major_index,permutations). Always available, never ambiguous, ugly. -
title — a human title.
title/descriptionare polymorphic helpers: already present on meta-collection elements; for math elements, concocted from notation ⊕ fiber-notation; an explicit per-element property where set. This is the default display name where one exists. - notation — the rendered mathematical notation (the visual axes applied to a textual medium). The natural name for an element value.
- derived — a computed label (title ⊕ notation, a stat's value formatted, a codomain-qualified name). The escape hatch for "name it like this specific thing."
The header label and the value name are the same choice at two scopes; a column config picks a naming mode for each.
A referenced concept (a map's codomain collection, a sibling, later any element address) can render as plain text or as a link. When it links, three further knobs — and this is where "printer config" reaches past pure visuals:
-
whether — link or plain. Default: link when the value has a resolvable target (a map codomain, a findstat id,
an element address); plain otherwise. Already the
showLinkflag on a property row. -
target — in-place vs new session. In-place: navigate this explorer to the referenced resource (today
mapHref→/explorer/<codomain>, sibling →?c=&n=). New session: fork a fresh explorer (new tab) so the current view is preserved — the right default for cross-collection jumps a user wants to keep alongside. -
history — push vs replace. A real browsing step is
pushState(back returns to where you were); an in-place mutation of the current view isreplaceState(no new history entry). This is the same push/replace discipline the Query-Model already uses for view state: a settled view funnels into the URL viareplaceState; a genuine navigation to another resource is apushStatestep. Following a reference is navigation → push; retargeting the same view (changingn, toggling a column) is mutation → replace. -
relation + anchor state — link rel, external-vs-internal (findstat/OEIS open
target="_blank", internal stay), and any other state that renders into the anchor.
Links are why this is printer config in the broad sense, not just visual config: the same property, in a link-incapable environment, degrades to spelled-out text (below).
The visual/name/link groups are one category of config. The other axis is the rendering environment, and each has different capabilities — so the printer config is resolved per environment, enabling progressive enhancement: author the richest form, degrade to what the target can do.
| environment | capabilities | degradation / notes |
|---|---|---|
| web | full — live links, SVG/scene, hover/selection, push/replace history | the reference target; everything else degrades from here |
| tiered. PDF: live links + vector figures. Paper: no links → spell the href out (footnote/appendix), figures rasterize, color may drop | the clearest case that "link" is config, not a fixed thing | |
| terminal | color + OSC-8 hyperlinks; two modes — plain stream vs a full curses TUI that can host its own explorer with its own browsing history | plain stream ≈ print-paper (spell links); TUI ≈ web (in-place nav, push/replace) |
| mobile | links + touch, but a different notification / share model, constrained width, new-session semantics differ | take stock; not solved now |
The insight: general visual options are just one config category; "per environment" is the other, and the two compose. A property's presentation = (visual ⊕ name ⊕ link) config, resolved against an environment's capability set, with progressive enhancement filling the gap. Don't build all four environments now — but the config schema must let a single property definition target any of them without a rewrite.
Near-term deliverable — the per-column context menu (#62)
This model exists to unblock #62: a context menu on a table column header to configure that column's printer
config. Most of the plumbing is already there — a property row (PropRow) already carries format, name (header
override), width, and showLink, and the Properties pane already has a per-row config popover (format · header ·
width · link). #62 is that same config set, surfaced on the column header (right-click / caret) instead of only in
the Properties list, so a column is configurable in place.
What a column context menu should expose, scoped to what exists today (web environment only for now):
- name — header label: id | title | notation | derived (default: the def's label).
-
visual / format — the property's
formats(e.g.plain|grouped); later the medium (ascii · unicode · latex) and alphabet where the property is notation-valued. -
link — on/off (
showLink); when on and the target supports it: in-place vs new session, and (follow = push) history semantics. Only shown when the value has a resolvable target (map codomain / findstat / address). -
width / visibility / order — min-width, the eye toggle (drop from
SELECT), position — already row config, mirrored onto the header menu.
Because a column IS a projection in the Query-Model SELECT list, the context menu is an editor for that
projection's printer config — the same object the Properties pane edits, reached from the header. One config
source, two surfaces.
- The non-web environments (print/terminal-TUI/mobile) — schema must accommodate them; renderers come later.
- Element-address references as first-class link targets (needs the address/
unranklink scheme). - The environment-capability resolution layer (progressive-enhancement engine) — a printer picks the richest form its environment supports.
Related: Render Assets (figures as data, the render axes + styling hooks), Query-Model (the column IS a
SELECT projection; push/replace URL state), Sort-and-Filter.