---
name: symbol-axis-regen
description: chip-fetcher's side of the default-symbol 3D outline — re-render the symbol axis-aware when the user switches the up-axis, and the non-blocking SYM-tile spinner while it regenerates. The symbol-DEFAULT behavior (compositing the white outline + lasered name, the outline contract) lives in adom-symbol's docs/default-symbol-3d-outline.md, not here. Trigger words — axis switch regenerate symbol, chosen_up_axis symbol, sym tile spinner, orientation regen, set-as-up regenerate.
---

# Symbol axis-regen + SYM-tile spinner (chip-fetcher side)

> The DEFAULT symbol layout — compositing the **white 3D-chip outline + lasered
> name**, why it must be natively white, and the outline contract — is
> **adom-symbol's** behavior. See `adom-symbol/docs/default-symbol-3d-outline.md`.
> This playbook is only chip-fetcher's orchestration: keeping that outline in the
> right ORIENTATION and showing progress.

## Axis-aware regeneration

chip-thumbnailer honors `info.json.chosen_up_axis` when it renders the outline, so
when the user switches the up-axis on a card the symbol's embedded chip must
re-render to match. `POST /api/orientation {mpn, axis}`
(`src/serve.rs::set_orientation`):

1. Persist `chosen_up_axis`.
2. **Off-thread** (so the click returns instantly): `adom-chip-thumbnailer
   rerender <mpn> --kind outline` — the LIGHT path that regenerates just the
   vector outline at the new axis (one OCCT pass, not the whole shaded-iso family).
3. Then `adom-symbol render` recomposites the canonical symbol with the new
   outline. Response includes `"regen":"outline+symbol"`.

## Non-blocking SYM-tile spinner

While that regen runs, overlay a **lightweight** spinner on the SYM tile so the
user knows it's refreshing — without blocking the rest of the dashboard:

- Pure-CSS ring, `pointer-events:none`, only that one tile dims. Everything else
  stays interactive.
- **Data-driven, not a transient DOM node** — the dashboard re-renders on a poll
  and would wipe a hand-added spinner. Drive it from state keyed on `sym_rev`
  (the `<mpn>-symbol.svg` mtime): record `sym_rev` at click-time; the spinner
  clears the instant a newer `sym_rev` arrives (regen done), with a ~95s safety
  cap so a failed regen can't spin forever.
- Show it instantly on click (before the round-trip), then poll just until it
  clears.

Reference: `src/serve.rs::set_orientation`; `src/ui/index.html` — `SYM_REFRESHING`
map, `isSymRefreshing`, `renderThumb` spinner inject, `setOrientation`.
