diff --git a/frontend/src/app/features/best-practices/best-practices.component.html b/frontend/src/app/features/best-practices/best-practices.component.html index 44d35b5..3fa7a9f 100644 --- a/frontend/src/app/features/best-practices/best-practices.component.html +++ b/frontend/src/app/features/best-practices/best-practices.component.html @@ -10,6 +10,7 @@
Une bonne revue ne traque pas les fautes : elle fait grandir le code et ceux qui l'écrivent. diff --git a/frontend/src/app/features/best-practices/best-practices.component.scss b/frontend/src/app/features/best-practices/best-practices.component.scss index 5f247df..37e7153 100644 --- a/frontend/src/app/features/best-practices/best-practices.component.scss +++ b/frontend/src/app/features/best-practices/best-practices.component.scss @@ -28,6 +28,9 @@ /* Hero — donne le ton festif (framboise → violet) */ .hero { + position: relative; + z-index: 0; // contexte d'empilement pour les confettis décoratifs + overflow: hidden; background: var(--cc-gradient-festive); color: var(--cc-on-primary); border-radius: var(--cc-radius-lg); diff --git a/frontend/src/app/features/best-practices/best-practices.component.ts b/frontend/src/app/features/best-practices/best-practices.component.ts index b3b6aba..557f2ed 100644 --- a/frontend/src/app/features/best-practices/best-practices.component.ts +++ b/frontend/src/app/features/best-practices/best-practices.component.ts @@ -10,6 +10,7 @@ import { BreadcrumbComponent, BreadcrumbItem, } from '../../shared/components/breadcrumb/breadcrumb.component'; +import { ConfettiComponent } from '../../shared/components/confetti/confetti.component'; /** * Page pédagogique « Les bonnes pratiques de la Code Review ». @@ -23,6 +24,7 @@ import { imports: [ RouterLink, BreadcrumbComponent, + ConfettiComponent, MatCardModule, MatIconModule, MatButtonModule, diff --git a/frontend/src/app/features/claude-code-setup/claude-code-setup.component.html b/frontend/src/app/features/claude-code-setup/claude-code-setup.component.html index 9275680..5442caf 100644 --- a/frontend/src/app/features/claude-code-setup/claude-code-setup.component.html +++ b/frontend/src/app/features/claude-code-setup/claude-code-setup.component.html @@ -11,6 +11,7 @@
Bien configuré, Claude Code connaît ton projet, respecte tes conventions et automatise le répétitif. diff --git a/frontend/src/app/features/claude-code-setup/claude-code-setup.component.scss b/frontend/src/app/features/claude-code-setup/claude-code-setup.component.scss index 7528d47..451a99a 100644 --- a/frontend/src/app/features/claude-code-setup/claude-code-setup.component.scss +++ b/frontend/src/app/features/claude-code-setup/claude-code-setup.component.scss @@ -28,6 +28,9 @@ /* Hero — donne le ton festif (framboise → violet) */ .hero { + position: relative; + z-index: 0; // contexte d'empilement pour les confettis décoratifs + overflow: hidden; background: var(--cc-gradient-festive); color: var(--cc-on-primary); border-radius: var(--cc-radius-lg); diff --git a/frontend/src/app/features/claude-code-setup/claude-code-setup.component.ts b/frontend/src/app/features/claude-code-setup/claude-code-setup.component.ts index 70207cf..6308210 100644 --- a/frontend/src/app/features/claude-code-setup/claude-code-setup.component.ts +++ b/frontend/src/app/features/claude-code-setup/claude-code-setup.component.ts @@ -9,6 +9,7 @@ import { BreadcrumbComponent, BreadcrumbItem, } from '../../shared/components/breadcrumb/breadcrumb.component'; +import { ConfettiComponent } from '../../shared/components/confetti/confetti.component'; /** * Page pédagogique « Mettre en place Claude Code ». @@ -20,7 +21,13 @@ import { */ @Component({ selector: 'app-claude-code-setup', - imports: [RouterLink, BreadcrumbComponent, MatCardModule, MatIconModule], + imports: [ + RouterLink, + BreadcrumbComponent, + ConfettiComponent, + MatCardModule, + MatIconModule, + ], templateUrl: './claude-code-setup.component.html', styleUrl: './claude-code-setup.component.scss', }) diff --git a/frontend/src/app/features/design-patterns/design-patterns.component.html b/frontend/src/app/features/design-patterns/design-patterns.component.html index 88d262b..5be79cb 100644 --- a/frontend/src/app/features/design-patterns/design-patterns.component.html +++ b/frontend/src/app/features/design-patterns/design-patterns.component.html @@ -11,6 +11,7 @@
Un design pattern n'est pas un bout de code à copier : c'est un vocabulaire
partagé pour résoudre un problème de conception.
diff --git a/frontend/src/app/features/design-patterns/design-patterns.component.scss b/frontend/src/app/features/design-patterns/design-patterns.component.scss
index 21a6fad..8899296 100644
--- a/frontend/src/app/features/design-patterns/design-patterns.component.scss
+++ b/frontend/src/app/features/design-patterns/design-patterns.component.scss
@@ -28,6 +28,9 @@
/* Hero — donne le ton festif (framboise → violet) */
.hero {
+ position: relative;
+ z-index: 0; // contexte d'empilement pour les confettis décoratifs
+ overflow: hidden;
background: var(--cc-gradient-festive);
color: var(--cc-on-primary);
border-radius: var(--cc-radius-lg);
diff --git a/frontend/src/app/features/design-patterns/design-patterns.component.ts b/frontend/src/app/features/design-patterns/design-patterns.component.ts
index 1e436d4..d45c700 100644
--- a/frontend/src/app/features/design-patterns/design-patterns.component.ts
+++ b/frontend/src/app/features/design-patterns/design-patterns.component.ts
@@ -12,6 +12,7 @@ import {
BreadcrumbComponent,
BreadcrumbItem,
} from '../../shared/components/breadcrumb/breadcrumb.component';
+import { ConfettiComponent } from '../../shared/components/confetti/confetti.component';
/** Une famille de patrons et ses cartes, pour l'affichage groupé du hub. */
interface PatternGroup {
@@ -36,7 +37,13 @@ const CATEGORY_ORDER: DesignPatternCategory[] = [
*/
@Component({
selector: 'app-design-patterns',
- imports: [RouterLink, BreadcrumbComponent, MatCardModule, MatIconModule],
+ imports: [
+ RouterLink,
+ BreadcrumbComponent,
+ ConfettiComponent,
+ MatCardModule,
+ MatIconModule,
+ ],
templateUrl: './design-patterns.component.html',
styleUrl: './design-patterns.component.scss',
})
diff --git a/frontend/src/app/features/home/home.component.html b/frontend/src/app/features/home/home.component.html
index 70f018d..4c6e0a8 100644
--- a/frontend/src/app/features/home/home.component.html
+++ b/frontend/src/app/features/home/home.component.html
@@ -1,4 +1,5 @@
Des outils pédagogiques pour écrire et relire du meilleur code.Vos outils de développeur, au même endroit
SOLID n'est pas un dogme : c'est une boussole pour limiter le coût du changement. diff --git a/frontend/src/app/features/solid/solid.component.scss b/frontend/src/app/features/solid/solid.component.scss index 051ec75..1048b77 100644 --- a/frontend/src/app/features/solid/solid.component.scss +++ b/frontend/src/app/features/solid/solid.component.scss @@ -28,6 +28,9 @@ /* Hero — donne le ton festif (framboise → violet) */ .hero { + position: relative; + z-index: 0; // contexte d'empilement pour les confettis décoratifs + overflow: hidden; background: var(--cc-gradient-festive); color: var(--cc-on-primary); border-radius: var(--cc-radius-lg); diff --git a/frontend/src/app/features/solid/solid.component.ts b/frontend/src/app/features/solid/solid.component.ts index 86dab41..e4b52e5 100644 --- a/frontend/src/app/features/solid/solid.component.ts +++ b/frontend/src/app/features/solid/solid.component.ts @@ -9,6 +9,7 @@ import { BreadcrumbComponent, BreadcrumbItem, } from '../../shared/components/breadcrumb/breadcrumb.component'; +import { ConfettiComponent } from '../../shared/components/confetti/confetti.component'; /** * Page pédagogique « Principes SOLID ». @@ -19,7 +20,13 @@ import { */ @Component({ selector: 'app-solid', - imports: [RouterLink, BreadcrumbComponent, MatCardModule, MatIconModule], + imports: [ + RouterLink, + BreadcrumbComponent, + ConfettiComponent, + MatCardModule, + MatIconModule, + ], templateUrl: './solid.component.html', styleUrl: './solid.component.scss', }) diff --git a/frontend/src/app/shared/components/confetti/confetti.component.html b/frontend/src/app/shared/components/confetti/confetti.component.html new file mode 100644 index 0000000..1ac09cf --- /dev/null +++ b/frontend/src/app/shared/components/confetti/confetti.component.html @@ -0,0 +1,30 @@ + diff --git a/frontend/src/app/shared/components/confetti/confetti.component.scss b/frontend/src/app/shared/components/confetti/confetti.component.scss new file mode 100644 index 0000000..acbaafc --- /dev/null +++ b/frontend/src/app/shared/components/confetti/confetti.component.scss @@ -0,0 +1,76 @@ +// Calque positionné derrière le contenu du héros (qui doit être un contexte +// d'empilement : `position: relative; z-index: 0`). +:host { + position: absolute; + inset: 0; + z-index: -1; + display: block; + pointer-events: none; +} + +.confetti__svg { + width: 100%; + height: 100%; +} + +// Apparition en cascade : un « pop » (scale, sans toucher l'opacité — on +// préserve ainsi la translucidité de la variante sombre). Décalage croissant. +.confetti__bit { + transform-box: fill-box; + transform-origin: center; + animation: cc-pop var(--cc-dur) var(--cc-ease-bounce) both; +} + +@for $i from 1 through 8 { + .confetti__bit--#{$i} { + animation-delay: calc(var(--cc-stagger) * #{$i - 1}); + } +} + +// Variante claire (accueil, fond doux) : multicolore de marque. +.confetti__bit--1 { + fill: var(--cc-primary); +} +.confetti__bit--2 { + fill: var(--cc-role-auteur); +} +.confetti__bit--3 { + fill: var(--cc-accent); +} +.confetti__bit--4 { + fill: var(--cc-accent); +} +.confetti__bit--5 { + fill: var(--cc-role-relecteur); +} +.confetti__bit--6 { + fill: var(--cc-primary); +} +.confetti__bit--7 { + fill: var(--cc-success); +} +.confetti__bit--8 { + fill: var(--cc-role-auteur); +} + +// Variante sombre (héros des hubs, dégradé festif) : confettis clairs et +// translucides, lisibles sur le dégradé sans voler la vedette au texte. +:host(.confetti--dark) { + .confetti__bit { + fill: var(--cc-on-primary); + } + .confetti__bit--1, + .confetti__bit--6 { + opacity: 0.8; + } + .confetti__bit--2, + .confetti__bit--5, + .confetti__bit--8 { + opacity: 0.55; + } + .confetti__bit--3, + .confetti__bit--4, + .confetti__bit--7 { + opacity: 0.4; + } +} diff --git a/frontend/src/app/shared/components/confetti/confetti.component.ts b/frontend/src/app/shared/components/confetti/confetti.component.ts new file mode 100644 index 0000000..6d7ffe7 --- /dev/null +++ b/frontend/src/app/shared/components/confetti/confetti.component.ts @@ -0,0 +1,30 @@ +import { Component, Input } from '@angular/core'; + +/** Adapte la palette des confettis au fond du bandeau qui les accueille. */ +export type ConfettiTone = 'light' | 'dark'; + +/** + * Calque décoratif de confettis (SVG inline tokenisé), à poser dans un bandeau + * héros (`position: relative; z-index: 0; overflow: hidden`). Purement + * décoratif (`aria-hidden`), positionné en absolu derrière le contenu. + * + * `tone` adapte la palette au fond : + * - `light` (défaut) : multicolore de marque, sur fond clair (accueil) ; + * - `dark` : confettis clairs et translucides, sur le dégradé festif des hubs. + * + * Les pièces apparaissent en cascade (keyframe globale `cc-pop`, décalage + * `--cc-stagger`) — neutralisée par `prefers-reduced-motion`. + */ +@Component({ + selector: 'app-confetti', + templateUrl: './confetti.component.html', + styleUrl: './confetti.component.scss', + host: { + class: 'confetti', + '[class.confetti--dark]': "tone === 'dark'", + 'aria-hidden': 'true', + }, +}) +export class ConfettiComponent { + @Input() tone: ConfettiTone = 'light'; +}