Skip to content

feat(staging): quadrics-as-template plinth layout finalization (v1.0) #271

Description

@bradleypmartin

Surfaced from #225 PR3 (#269 / #252) headset-smoke prep (Brad, 2026-05-23). Umbrella for the layout-finalization work the post-#260 / post-#269 plinth now needs — multiple quadrics-specific UI elements still don't have a satisfying home on the plinth, and the cluster's most-complex exhibit is also the one that defines the template for the rest.

The meta-insight

Quadrics has the most interactive elements of any cluster exhibit by a clear margin — four coefficient sliders, a 4-element vertical rack (canonical-forms heading + 3 SectionTabs), an equation readout, a WorldAxes indicator, an 8-button canonical-forms preset grid (when that section is active), and cross-sections toggles (when that section is active). Tangent-planes / gradient-levels / saddle-extrema each have a strict subset of those affordance types.

"if we figure out exactly how we want all this stuff laid out for v1.0, it SHOULD be easy to fit the other exhibits' interactive elements into the same-ish paradigm." — Brad

So solving the quadrics plinth holistically gives us a layout template the other three exhibits inherit cheaply (each is a strictly smaller layout problem). The other direction — solving each exhibit independently — risks divergent layout vocabularies across the cluster.

What's already homed on the plinth (post-#260, post-#269)

What's NOT yet homed (the open observations)

(A) Canonical-forms 8-preset grid floats in mid-air when enabled

When the user taps the "Canonical forms" section in the vertical rack, 8 preset buttons appear (ellipsoid, hyperboloid 1-sheet, hyperboloid 2-sheets, etc.). Per the #255 plan §3.3 mid-air carve-out, these sit at slot-Y 0.83/0.94 — above the plinth's back edge in mid-air, not on the working surface. Reads as a step backward from the post-plinth "knobs and dials sit on the surface" semantic the rest of the cluster's interactive UI has converged on.

Layout questions to resolve:

  • Does the preset grid relocate ONTO the working surface (perhaps to the right of the slider rack, replacing whatever currently sits in that space, or below the rack)?
  • Does it stay above the plinth but on a clear "preset shelf" that reads as deliberately separate ("here's the menu, distinct from the controls")?
  • Does the 8-button arrangement stay as a single dense grid, or split into two rows of 4 / four rows of 2 / etc.?
  • Per-section visibility: presets are only visible when the canonical-forms section is active — does the slot they occupy go BACK to empty when another section is active, or get repurposed for that section's affordances?

(B) Cross-sections toggles smoosh into the vertical rack's realm when enabled

When the user taps the "Cross sections" section, additional toggles appear (planar cross-section toggles — XY / YZ / XZ planes, the live cross-sections cluster). Currently these end up crowded into the same left-edge area where the vertical rack lives, competing visually with the SectionTab + canonical-forms stack.

Layout questions to resolve:

  • Where do per-section conditional affordances live in general? The vertical rack's left-edge area is the section's BIO (the navigation), not its content area — content needs its own home.
  • Is the right answer a dedicated "section content area" on the plinth (e.g., a right-edge column at slot-X +0.32 that swaps content per active section), or per-section dispersed across the surface?
  • How does this generalize to the other three cluster exhibits? Tangent-planes / gradient-levels / saddle-extrema don't have a sections model today, but the layout choice here ("dedicated section-content area" vs "section-dispersed") informs whether they ever could.

Adjacent / related issues — what's NOT in scope for this umbrella

Template payoff for the other cluster exhibits

Once this umbrella resolves quadrics's full UI inventory on the plinth, the three sibling exhibits inherit cheaply:

  • Tangent-planes — 2 sliders (θ, φ) + 1 readout. Strict subset of quadrics' inventory.
  • Gradient-levels — 3 sliders (k + point) + 1 readout. Strict subset.
  • Saddle-extrema — 2 sliders (CP-snap) + 5 presets + 1 readout. Closest in shape to quadrics (it has a preset row), so its preset-placement decision is directly informed by quadrics's (A).

So whatever pattern (A) lands on becomes the canonical "preset row placement" answer for saddle-extrema's preset row at slot-Y 0.55 (currently flagged in #255 §6 as a smoke-watch item for proximity to the back edge).

Sequencing

Likely a multi-PR plan-doc once the layout direction is locked, mirroring #225 / #255's sub-epic shape:

  1. Plan doc (_private/plans/2XX-quadrics-plinth-layout-final.md) — run /roundtable-plan-review per the foundational-work memory.
  2. Inventory pass — concrete code-anchored list of every quadrics UI element + its current slot or floating position.
  3. Layout proposal — one canonical layout that homes every element, with explicit per-section visibility rules for the canonical-forms preset grid and cross-sections toggles.
  4. Implementation PR(s) — likely 2 PRs: (A) preset grid relocation, (B) section-content area + cross-sections toggle home.
  5. Template propagation — apply the same layout vocabulary to the three sibling exhibits in a follow-up.

Code anchors

  • Quadrics index + slot manifest: src/exhibits/quadrics/index.ts (PLINTH_* slot constants at file top).
  • Preset grid construction: src/exhibits/quadrics/index.ts (preset buttons array around the canonical-forms section).
  • Section content visibility: quadrics SectionTab onChange handlers in index.ts.
  • Plinth slot model: src/scaffold/staging/Plinth.ts (PlinthSlot interface; createPlinth reparents).
  • Sister scene preset rows (for the template implication): src/exhibits/saddle-extrema/index.ts preset row at slot-Y 0.55.

Refs

🤖 Generated with Claude Code

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions