Skip to content

feat(apprendista): template esercizi Volume 4 - #11

Merged
marcofarina merged 10 commits into
mainfrom
feat/exercise-template
Jun 23, 2026
Merged

feat(apprendista): template esercizi Volume 4#11
marcofarina merged 10 commits into
mainfrom
feat/exercise-template

Conversation

@marcofarina

Copy link
Copy Markdown
Owner

Sintesi

Introduce il template degli esercizi per il Volume 4 (Biblioteca dell'Apprendista): componenti, demo, sidebar e tutte le rifiniture visive successive.

Cosa include

  • Template esercizi Volume 4: componenti <Exercise> / <ExerciseLink>, pagina demo e voce in sidebar.
  • Accento per-tipo a livello pagina: il Vol. 4 non è blu, ogni tipo di esercizio porta il proprio accento.
  • Briciole ancorate al volume corrente, con volume-sorgente reso come «Vol. N».
  • Auto-backlink esercizi↔lezioni dai frontmatter.
  • Soluzione a tieni-premuto-per-rivelare, con cross-fade dell'icona.
  • Rifiniture icone (questo giro):
    • la soluzione usa la tessera di puzzle (FA 7.1.0 duotone) come icona a riposo, ingrandita per pareggiare l'altezza di label + hint;
    • la tile del tipo di esercizio nella card è ora quadrata e centrata, non più rettangolare stirata a tutta l'altezza.

Versione

Bump minor → 0.8.0.

🤖 Generated with Claude Code

marcofarina and others added 10 commits June 22, 2026 13:11
…debar)

Infrastruttura per gli esercizi della Biblioteca dell'Apprendista (Vol. 4):

- <ExerciseLink>: card-link lato lezione per gli «Esercizi assegnati».
- <LessonMeta>/<Exercise>/<Solution>: pagina-esercizio con provenienza,
  esercizi numerati e soluzioni in PyRunner readonly. Card di provenienza
  con lo stile del redesign Claude Design (ancora icona+numero, breadcrumb,
  teoria), riadattata a token/font/icone del progetto. Niente bordo-accento
  sinistro.
- Modello ibrido: lezione = pagina singola se ha solo esercizi rapidi,
  categoria se ha anche esercizi dedicati/laboratori. Badge tipo pagina
  (rapidi/esercizio/laboratorio) con icone duotone (dumbbell/pen/flask).
- Sidebar apprendista ristrutturata (volume-sorgente aperto, resto chiuso).
- Pagine demo segnaposto + _esercizio-template.mdx (escluso dal build).
- Linking solo on-site (doc id/permalink), mai paideia_id.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Ogni pagina-esercizio della Biblioteca dell'Apprendista è monocroma nel colore
del suo tipo — rapidi=ambra, esercizio=viola, laboratorio=teal — così il Vol.4
si stacca visivamente dagli altri 3 (che restano blu). La card non-blu era già
arrivata; ora il colore si propaga a titolo, chip-numero, bottoni PyRunner,
icone e link in prosa.

Meccanismo:
- frontmatter `exercise_kind` (rapidi|esercizio|laboratorio);
- swizzle DocItem/Content imposta `data-exercise-kind` sul solo wrapper del
  contenuto (sidebar e briciole escluse);
- custom.css: blocco [data-exercise-kind] che deriva l'intera famiglia
  --ifm-color-primary, --at-accent e il gradiente titolo --at-grad-accent da
  due variabili --ex-pa/--ex-pa-soft (per-tipo, light+dark).
- <LessonMeta> non ha più colori hardcoded: eredita l'accento di pagina.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Swizzle di DocBreadcrumbs: dopo la casetta (che punta alla home del sito)
inserisce una briciola col nome del volume corrente, linkata all'indice del
volume. In Biblioteca dell'Apprendista le briciole erano fuorvianti — la prima
voce era il volume-sorgente (es. «Manuale del Programmatore») e sembrava di
essere nel Vol.1 invece che negli esercizi del Vol.4. Ora:

  🏠 › Biblioteca dell'Apprendista › Manuale del Programmatore › Le basi › …

Vale per tutti i volumi (pluginId → nome leggibile). Copia fedele
dell'originale a parte la briciola del volume: da ricontrollare agli upgrade.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Il link esercizio↔lezione era scritto a mano in due punti (LessonMeta
sull'esercizio + ExerciseLink sulla lezione), da tenere allineati a mano.
Ora la fonte di verità è una sola: il frontmatter dell'esercizio
(assigned_in/theory). Provenienza e backlink si derivano e si validano
a build-time, e gli autori scrivono solo frontmatter + corpo.

- plugins/exercise-graph/index.js: nuovo plugin (modello pyrunner) che
  cammina i 4 volumi, parsa il frontmatter via @docusaurus/utils
  (parseMarkdownFile + DEFAULT_PARSE_FRONT_MATTER, niente nuova dep),
  costruisce exercises/byLesson/lessons e li espone via setGlobalData.
  Validazione strict: assigned_in/theory che non risolvono → throw.
  Esclude i file con prefisso _/. come content-docs.
- src/lib/docResolve.ts: VOLUME_LABELS condiviso (estratto da
  DocBreadcrumbs) + resolvePermalink via useAllDocsData/versions.current
  + tipi del global data.
- LessonMeta: rifattorizzato propless/derivato; AssignedExercises: nuovo
  componente che riusa ExerciseLink.
- Auto-injection: LessonMeta prepend in DocItem/Content; nuovo wrapper
  swizzle DocItem/Footer che appende AssignedExercises.
- Demo + template migrati al modello solo-frontmatter.

Capitolo della lezione-sorgente non mostrato: non derivabile a
build-time coi volumi flat (crumb Volume › Lezione).

Verificato: typecheck/lint/build verdi; backlink bidirezionali presenti
nell'HTML SSR sia sulla lezione sia sull'esercizio.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Il box <Solution> non si apre più al click (rischio spoiler da misclick):
ora richiede una pressione continua di 3s. Feedback durante l'hold: barra
di avanzamento che riempie il pulsante e cross-fade dell'icona da faccina
(face-awesome) a mano-che-preme (hand-pointer); al rilascio anticipato
tutto rientra. Una volta rivelata, il pulsante diventa un normale toggle.

- progress guidato da requestAnimationFrame inline (resta visibile anche
  con prefers-reduced-motion, dove le transition globali sono azzerate)
- soppressione del click sintetico post-gesto per non richiudere subito
- attivazione da tastiera (Enter/Space) deliberata, senza hold
- accento legato a --at-accent: ambra su rapidi, viola su esercizio,
  teal su laboratorio
- icone face-awesome + hand-pointer da Font Awesome 7.1.0 duotone

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Nella Biblioteca dell'Apprendista le briciole affiancavano due titoli di
libro interi — «Biblioteca dell'Apprendista» (volume corrente) e il
volume-sorgente «Manuale del Programmatore» — dando l'impressione di
navigare fra due libri. Ora la prima briciola della sidebar (il
volume-sorgente) è accorciata a «Vol. N»: si legge come una sezione, non
come un libro concorrente, e conserva la provenienza.

  🏠 › Biblioteca dell'Apprendista › Vol. 1 › Le basi › …

Rietichetta solo client-side e limitata a pluginId 'apprendista'; la
sidebar resta col nome lungo. Mappa corta VOLUME_SHORT + helper
volumeShortByLabel in docResolve (lookup inverso nome-lungo → Vol. N).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017qp2CZ92ExM3WsDzuVQXRC
Le cifre del numero non hanno discendenti: lo spazio vuoto del descender
dell'em-box si accumulava sotto l'inchiostro (≈3,8px), rendendo il chip
basso-pesante. line-height:1 + padding verticale asimmetrico in em
(0.3em sopra / 0.14em sotto) ricentra; in em scala col font.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017qp2CZ92ExM3WsDzuVQXRC
- soluzione: tessera di puzzle (FA 7.1.0 duotone) al posto della faccina
  come icona "a riposo", ingrandita (32px) per pareggiare l'altezza di
  label + hint
- card esercizio: la tile del tipo ora è quadrata (46px) e centrata,
  non più rettangolare stirata a tutta l'altezza della card
- bump 0.8.0

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017qp2CZ92ExM3WsDzuVQXRC
Rilievi della review della PR #11, tutti pulizia (nessun cambio a runtime):

- Icon: rimossa l'icona morta `face-awesome` (tipo + glifo duotone): la
  soluzione a riposo usa `puzzle`, `face-awesome` non era mai referenziata.
- ExerciseLink: riusa il tipo `Difficulty` da src/lib/docResolve invece di
  ridichiararlo (una sola fonte per la union).
- exercise-graph: `loadContent` non espone piu `lessons` nel global data
  (serve solo internamente alla validazione; i client usano exercises/byLesson).
  Tipo `ExerciseGraphData` allineato.
- Commenti: aggiornati i riferimenti all'icona a riposo da «faccina»/«lampadina»
  a «tessera-di-puzzle» (Exercise/index.tsx e styles).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019kfksKgmzWoiSuMLCgFdQb
# Conflicts:
#	package-lock.json
#	package.json
@marcofarina
marcofarina merged commit 4905ad8 into main Jun 23, 2026
@marcofarina
marcofarina deleted the feat/exercise-template branch June 23, 2026 07:20
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