Skip to content

feat: visualizzatore di algoritmi (Algorithm) — ordinamento e ricerca animati - #8

Merged
marcofarina merged 9 commits into
mainfrom
feat/algo-viz-mobile
Jun 15, 2026
Merged

feat: visualizzatore di algoritmi (Algorithm) — ordinamento e ricerca animati#8
marcofarina merged 9 commits into
mainfrom
feat/algo-viz-mobile

Conversation

@marcofarina

Copy link
Copy Markdown
Owner

In breve

Introduce <Algorithm>, il visualizzatore di algoritmi animati per il libro: barre interattive con player passo-passo, pannello pseudocodice sincronizzato e due preset d'autore (Studio e Lab). Coerente con lo stile dei runner esistenti (PyRunner/SQLRunner) e con i token Atmospheric.

Questa PR raccoglie l'intero filone feat/algo-viz-*: fase 1 (motore + generatori), il redesign con pannello codice, l'adattamento mobile e il polish finale di contrasto/usabilità.

Cosa contiene

Motore e architettura (src/components/Algorithm/)

  • Player generico (Player.tsx) con scrubber, transport, velocità, autoplay (Lab), avanzamento passo-passo (Studio).
  • ArrayScene.tsx: scena a barre con larghezza adattiva allo spazio disponibile (ResizeObserver), anelli semantici di stato, cursore di scansione, badge puntatori, graffe di range.
  • Stato puro e deterministico (applyStep.ts, types.ts) con trace pre-generata: SSR-safe, niente jitter di hydration.
  • Generatori pluggabili registrati in generators/index.ts.

6 algoritmi: bubble sort, selection sort, insertion sort, quicksort, ricerca lineare, ricerca binaria — ciascuno con pseudocodice Python, note passo-passo, complessità e blurb.

Due preset: Studio (spiegazioni passo-passo) e Lab (sperimentazione con autoplay e dati casuali), con toggle per pannello codice, spiegazioni e modalità colore (gradiente per valore / arcobaleno per identità).

Mobile: toolbar e pannello codice riflowano, barre e tap target adattivi, niente overflow di pagina.

Polish finale (ultimo commit)

  • Colori di stato per-tema: in tema chiaro l'anello «Ordinato» (prima bianco su bianco) e i colori Confronto/Scambio ora contrastano; il tema scuro è invariato.
  • Icone Studio/Lab allineate otticamente al testo.
  • Selection sort: «min» mostrato col cursore caret + etichetta, come la «j» del bubble sort (niente più badge stretto).
  • Stacco visivo tra parte ordinata e parte da ordinare in tutti gli ordinamenti.

Uso in MDX

<Algorithm> è registrato globalmente (nessun import). Esempio:

<Algorithm name="bubble-sort" />
<Algorithm name="binary-search" mode="lab" shuffle={9} />
<Algorithm name="selection-sort" data={[9, 5, 3, 1, 2, 8]} />

Verifica

  • npm run typecheck ✅ · npm run lint ✅ (solo warning preesistenti su altri file)
  • Smoke test browser su /docs/algorithm-test (pagina unlisted): tutti e 6 gli algoritmi, Studio + Lab, tema chiaro e scuro, casi limite (dati non ordinati, target assente, overflow a 12 elementi, algoritmo inesistente → box d'errore).

🤖 Generated with Claude Code

marcofarina and others added 9 commits June 13, 2026 02:04
…ec-algo-viz-fase1.md)

Componente <AlgoViz> con player passo-passo (study) e autoplay (lab):
- scena array DOM+CSS transitions: barre per identità, bilancia di
  confronto, badge puntatori, graffa range, chip target, esiti ricerca
- generatori: bubble/selection/insertion sort, quicksort (Lomuto),
  ricerca lineare e binaria, con note didattiche in italiano
- dati deterministici via mulberry32 (SSR/hydration safe), shuffle
  con «Rigenera», dark mode e prefers-reduced-motion
- pagina demo unlisted /docs/algoviz-test

Implementazione delegata (Opus) + review: rimosso «Indietro» dai
controlli lab e allineate le virgolette del box d'errore alla spec.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…ai runner

Rename del componente e riprogettazione visiva sulla scorta del feedback.

Rename
- AlgoViz → Algorithm (cartella, tipi, CSS vars --av- → --alg-,
  registrazione in MDXComponents). Prop `algo` → `name`.
- Pagina di test: docs/algoviz-test.mdx → docs/algorithm-test.mdx.

Stile (coerenza con PyRunner / SQLRunner)
- Tipografia tutta Monaspace: Argon (UI), Neon tabellare (numeri),
  Radon (didascalie/note).
- Icone: nuovo Icon.tsx con SVG duotone inline (da FA 7.1.0), al posto
  di react-fontawesome — due-toni veri, ~2 KB, prendono l'accent.
- Pallini macOS nell'header + pulsanti pill come .iconBtn dei runner.
- Dimensioni testi riportate alla scala dei runner.
- Progress bar minimale (2px) sulla linea di separazione body/footer.
- Scritte degli step centrate sotto le barre.
- Confronto: anello a 4 colori ciclico (stile «AI border» Google) al
  posto del box-shadow pieno e della bilancia (rimossa).
- Barre: gradiente verticale + ombra moderni; --alg-item-0 da grigio
  a indigo (niente più collisione col grigio «ordinato»).

Build, typecheck e lint verdi. La visualizzazione del confronto
(connettore tra le barre) resta da rifinire sugli screenshot di riferimento.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…b, indicatore di posizione

- CodePanel: pseudocodice con evidenziazione Python (highlightPy), colori
  allineati ai runner (--py-*), bottone copia con crossfade copia↔spunta;
  colonna statistiche (confronti/scambi) attivabile.
- Preset Studio/Lab che configurano i toggle (codice, spiegazione). Il toggle
  codice governa anche i controlli avanzati (shuffle, esegui, velocità):
  Studio = passo-passo guidato, Lab = tutto visibile. Toccare un toggle sgancia
  il preset, ripremerlo lo riapplica; default per blocco via prop `mode`.
- Toggle colore globale e persistito (gradiente/arcobaleno) via useAlgoPref;
  modalità e toggle codice/spiegazione restano locali al blocco.
- Indicatore di posizione corrente sotto le barre (campo `cursor` generico),
  con etichetta della variabile quando il codice è attivo; applicato al bubble sort.
- Icone duotone inline FA 7.1.0 (code, palette, copy, check, comment-lines).
- Selettore velocità con indicatore scorrevole; legenda dinamica (solo stati
  usati); colori stato scambio=verde / ordinato=bianco; corsia dimensionata
  sull'intera trace; note del bubble sort riscritte (ragionamento, non cronaca).
- Controls.tsx ed Explanation.tsx assorbiti in Player.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…orto

- Estrae pickSearchTarget in generators/pickTarget.ts: linearSearch e
  binarySearch ne condividevano una copia identica.
- Rimuove ALGO_IDS da generators/index.ts: esportato ma mai importato
  (era previsto per una pagina galleria non realizzata).

Nessun cambiamento di comportamento: stessa funzione, stesso ordine di
consumo del PRNG seeded (determinismo SSR invariato).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Sotto i ~430px la toolbar (.header, flex senza wrap) accavallava le 3
icone toggle sopra lo switch Studio/Lab, rendendolo incliccabile; il
pannello codice teneva la colonna statistiche fissa a 172px schiacciando
lo pseudocodice in overflow.

- @media (max-width: 480px): .header wrappa, headerRight scende su una
  seconda riga a tutta larghezza allineata a destra.
- @media (max-width: 560px): .codeGrid a una colonna, .stats in riga
  sotto il codice (soglia più alta: la colonna fissa soffoca già <480px).

Rif. pm/spec-algo-viz-mobile.md.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
BAR_W/GAP erano costanti (58px a elemento): a 360px un array da 8 usciva
dal viewport e andava trascinato. Ora ArrayScene misura .sceneWrap con un
ResizeObserver e ricava un passo adattivo (clamp tra MIN_UNIT 36 e
MAX_UNIT 58), così l'intero array entra senza scroll quando c'è spazio;
oltre, lo scroll orizzontale resta come fallback. Il font del valore
scala verso il basso nelle barre strette. x()/slotCenter() sono ora
closure sul passo misurato; nessun'altra parte conosce le coordinate.

Rif. pm/spec-algo-viz-mobile.md.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@media (max-width: 480px): padding orizzontale del .body da 24px a 12px
(più spazio per la scena) e tap target più comodi (.toggleBtn 30→36px,
.segBtn alto 24→34px). Applicato dopo il reflow della toolbar (P1) così
gli ingrandimenti non riaprono l'accavallamento.

Rif. pm/spec-algo-viz-mobile.md.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- ArrayScene: margine interno orizzontale (EDGE) così l'anello di
  selezione di prima/ultima barra non viene clippato dall'overflow.
- spiegazione ad altezza fissa: i pulsanti del footer non «saltano» tra
  uno step e l'altro. Su mobile nascondo la riga «fase» ripetuta e riduco
  l'altezza (il testo a capo arrivava a ~180px).
- Lab su mobile: pannello codice con max-height + scroll interno; la riga
  attiva si porta in vista da sola (auto-scroll che tocca solo lo scrollTop
  del pannello, mai la pagina). Così scena, codice e controlli stanno
  insieme senza scrollare.
- Studio: il pulsante avanti diventa «Step» esteso e primario.
- toolbar mobile: via pallini e nome file, switch Studio/Lab solo-icona,
  statistiche col numero accanto alla label, interlinea codice più stretta.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…e la j

- Colori di stato (anelli + pallini legenda) ora per-tema: in chiaro
  ambra/smeraldo/ardesia/viola più scuri e saturi, così «Ordinato» (prima
  bianco su bianco), «Confronto» e «Scambio» risaltano sia sullo sfondo chiaro
  sia sulle barre. Il tema scuro mantiene bianco e pastelli.
- Icone Studio/Lab rialzate di 1px: il centro ottico dell'icona coincide con
  quello del testo, prima cadeva più in basso.
- Selection sort: «min» non è più un badge stretto ma viaggia col cursore
  caret + etichetta, lo stesso linguaggio visivo della «j» del bubble sort.
- Stacco visivo tra parte ordinata e parte da ordinare: a ogni confine si apre
  un varco (vale per tutti gli ordinamenti, si adatta al lato giusto).
- Rimossa la logica minSlots ormai morta in ArrayScene.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@marcofarina
marcofarina merged commit 65a49e1 into main Jun 15, 2026
1 check passed
@marcofarina
marcofarina deleted the feat/algo-viz-mobile branch June 15, 2026 22:16
marcofarina added a commit that referenced this pull request Jun 15, 2026
Bump 0.4.0 → 0.5.0. La novità di rilievo è <Algorithm>, il visualizzatore di
algoritmi animati (ordinamento e ricerca) con player Studio/Lab e pseudocodice
sincronizzato (PR #8). README: badge versione, SQLRunner e Algorithm nello stack.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant