Hover me
This card uses .glass-hover — the background becomes translucent with a 12px backdrop blur on hover.
The visual grammar of the site: tokens, components, and motion.
This page documents every design decision used on eldev.fr. Each token is click-to-copy.
The CSS tokens that define color, typography, and spacing.
A 200×200 SVG fractalNoise grain is layered on body::before with mix-blend-mode: overlay and opacity: 0.06. Adapts to dark/light, neutralized on interactive elements via pointer-events: none.
The interface elements reused across the site.
Classes: .btn.btn-primary, .btn.btn-outline. Both carry a glow that follows the cursor inside the button. The primary variant is also magnetic: it shifts slightly toward the cursor on hover.
Class: .cta-link. Underline slides in, the icon translates, and the link is magnetic: it leans toward the cursor on hover.
Classes: .label (tracked uppercase), .num (accent tabular digits), .card-line (30% accent bar).
This card uses .glass-hover — the background becomes translucent with a 12px backdrop blur on hover.
Same layout, no glass effect — for comparison.
Class: .glass-hover. Pairs with .num + .card-line.
Class: .toast.visible with a .success or .error modifier. Rendered statically here for reference — in production they animate in from the right.
.grid combined with .grid-2 through .grid-5. Above 1100px, .grid-5 collapses to 4 columns; under 900px everything drops to 2 columns; under 640px everything stacks to 1 column.
Here is a paragraph with an inline link. Used in FAQ answers, the Contact page intro, and the legal notices. On hover the underline grows more opaque — another example to show the effect.
Class: .rich-text. Adds a semi-transparent accent underline on <a> elements with text-underline-offset: 2px.
Class: .social-link. 32×32px, --text-muted at rest, --accent on hover. The --codeur and --malt variants use fill: var(--bg) for the inner glyph.
Class: .highlight. Applies color: var(--accent) and font-family: var(--font-serif) in italic, to emphasize a word inside a title.
10 areas of expertise: web development, e-commerce, mobile apps, AI, UI/UX design, WordPress, desktop apps, hosting, maintenance, ERP consulting.
A marketing site: 2–4 weeks. A custom application: 6–12 weeks depending on scope.
Yes, all source code is versioned in Git and handed over at delivery. No proprietary lock-in.
Uses native <details> / <summary>. The aria-expanded attribute is synced in JS on toggle. Icon rotates 45° when open. In production in FaqSection.astro under .faq-item / .faq-question.
Input fields used on the Contact page.
The live form uses the same styles in src/components/ContactPage.astro. Animated validation: accent check on valid (.field-valid), red pulse on error (.field-invalid). Textarea auto-resizes up to 12 lines. A pre-filled service via ?service= triggers an accent flash (.field-prefilled-flash).
.field-invalidThe field gets .field-invalid and aria-invalid="true". The .field-error message is rendered below the field via aria-live="polite".
Entrance and reveal animations. Respects `prefers-reduced-motion`.
.stagger.reveal-textfadeUp keyframesHeader, footer and language switcher, present on every page. All use --glass-bg for their translucent background effect.
.headerFixed at the top, translucent blurred. The hamburger menu kicks in below 768px with focus trap and keyboard close (Escape).
.footerSticky at the bottom, exposes theme / splash cursor toggles and the language switcher.