Design System

Work in progress. I'm adding components as I go, following patterns from what's already documented. Nothing here is set in stone yet.

Animations

anime.js timelines triggered by IntersectionObserver or the event bus. Elastic easing, staggered entrances.

RevealText

Atom

Composable text reveal that self-animates when its trigger event fires.

Wave (default)

Expériences
<RevealText text="Expériences" trigger="my-event" />

Slide

Mes projets

<RevealText text="Mes projets" as="h2" animation="slide" trigger="my-event" />

Props

PropTypeDefaultDescription
textstringrequiredText content to reveal
asstring"span"HTML tag to render
animation"wave" | "slide""wave"Animation variant
triggerstring-Event name that starts the animation
classstring-CSS class forwarded to the root element

Header Animation

Foundation

Staggered entrance for header elements. Title, nav items, and menu slide up with elastic easing.

Preview

kinoo.devExpériencesFormationsRéalisationsDiscutons ensemble

Timeline

TargetPropertyValueTiming
.title-wrappertranslateY-1.2em → 0delay: 0
.navbar litranslateY-1.2em → 0stagger: 30ms
.header-menuopacity0 → 1with translateY

Easing: outElastic(1, .5) · Duration: 800ms · Triggered after hero or immediately on non-hero pages.

Usage

import { animateHeader } from "@/lib/animations/headerAnime";

animateHeader();
animateHeader({ delay: 300 });

Section Reveal

Foundation

IntersectionObserver-based fade-in for page sections. Fires a reveal event per section so child components can react.

Preview

Section content

Behavior

PropertyValue
TriggerIntersectionObserver (10% threshold)
translateY20px → 0
opacity0 → 1
Duration600ms
Root margin (mobile)0px 0px 50px 0px
Root margin (desktop)0px 0px -100px 0px

Each revealed section emits reveal:section:{id} via the event bus, letting child components (RevealText, tags) animate in response.

Usage

import { revealSections } from "@/lib/animations/revealSection";

const cleanup = revealSections();

// Mark sections in markup:
<section id="experiences" data-animate-section>...</section>

Card Reveal

Foundation

IntersectionObserver-based card entrance with scale and staggered children. Adapts to mobile.

Preview

TitleDescriptionTags

Desktop Timeline

StepTargetPropertiesTiming
1Cardopacity 0→1, translateY 50→0, scale 0.8→1600ms elastic
2[data-animate-elem]opacity 0→1, translateX -20→0800ms stagger 200ms

Mobile Timeline

StepTargetPropertiesTiming
1Cardopacity 0→1, translateY 20→0500ms cubic
2[data-animate-elem]opacity 0→1, translateY 10→0400ms stagger 80ms

Mobile breakpoint: 900px. Cards in viewport on load are triggered immediately to handle tall elements that don't meet the 10% threshold.

Usage

import { revealCards } from "@/lib/animations/revealCard";

const cleanup = revealCards();

// Mark cards and their animated children:
<div data-animate-card>
  <h3 data-animate-elem>Title</h3>
  <p data-animate-elem>Content</p>
</div>

kinoo.dev · Design System