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.htmlSYM_REFRESHING map, isSymRefreshing, renderThumb spinner inject, setOrientation.