---
version: alpha
name: jobirl.com
description: "Light product system built on #ffffff with #1b2888 as the primary CTA accent. Type anchored in Montserrat at 28.8px / weight 700. Extracted automatically from https://jobirl.com/ — rendered styles via getComputedStyle() + CSS custom properties (token-only values may not be painted)."
narrative: |
  jobirl.com is built on a pure-white canvas (rgb(255, 255, 255)).
  The system uses rgb(27, 40, 136) as the accent for primary actions and brand signals.
  Sharp 0px corners on CTAs — architectural restraint, engineering precision alongside Montserrat as the primary typeface.
  Montserrat is paired with Font Awesome 6 Free for secondary roles.
  A restrained elevation system (3 distinct shadows) — shadows reserved for the few elements that must lift off the page.
  Motion is a first-class concern — 22 keyframe animations plus transition-driven interactions.

colors:
  background: "#ffffff"
  surface-1: "#d5f3fb"
  surface-2: "#def6fe"
  ink: "#1b2888"
  ink-subtle: "#6c757d"
  primary: "#1b2888"
  on-primary: "#ffffff"
  primary-hover: "#ffd700"
  hairline: "#818181"
  primary-focus: "#818181"
  semantic-error: "#dc3545"
  semantic-success: "#28a745"
  semantic-warning: "#ffc107"
  semantic-info: "#17a2b8"

typography:
  display-xl:
    fontFamily: "Montserrat, 'SF Pro Display', system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif"
    fontSize: 35px
    fontWeight: 700
    lineHeight: 1.2
    letterSpacing: 0
  display-md:
    fontFamily: "Montserrat, 'SF Pro Display', system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif"
    fontSize: 28px
    fontWeight: 700
    lineHeight: 1.2
    letterSpacing: 0
  body:
    fontFamily: "Montserrat, 'SF Pro Display', system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif"
    fontSize: 10px
    fontWeight: 600
    lineHeight: 1.5
    letterSpacing: 0
  body-sm:
    fontFamily: "Montserrat, 'SF Pro Display', system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif"
    fontSize: 36px
    fontWeight: 400
    lineHeight: 1.5
    letterSpacing: 0
  caption:
    fontFamily: "Font Awesome 6 Brands, 'SF Pro Display', system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif"
    fontSize: 16px
    fontWeight: 400
    lineHeight: 1
    letterSpacing: 0
  button:
    fontFamily: "Montserrat, 'SF Pro Display', system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif"
    fontSize: 60px
    fontWeight: 400
    lineHeight: 1.5
    letterSpacing: 0

rounded:
  none: 0px
  xs: 4px
  sm: 10px
  md: 30px
  lg: 50px
  xl: 58px
  pill: 9999px

spacing:
  xxs: 2px
  xs: 4px
  sm: 8px
  md: 12px
  lg: 24px
  xl: 25px
  xxl: 50px

components:
  button-outline:
    backgroundColor: "transparent"
    textColor: "#000000"
    typography: "{typography.caption}"
    rounded: "{rounded.xs}"
    padding: 4px 12px
  button-ghost:
    backgroundColor: "transparent"
    textColor: "{colors.primary-focus}"
    typography: "{typography.button}"
    rounded: "{rounded.none}"
    padding: 8px
  button-ghost-2:
    backgroundColor: "transparent"
    textColor: "{colors.primary}"
    typography: "{typography.caption}"
    rounded: "{rounded.none}"
    padding: 8px
  input-text-input:
    backgroundColor: "transparent"
    textColor: "#495057"
    typography: "{typography.caption}"
    rounded: "{rounded.xs}"
    padding: 6px 12px
  navigation-main-nav:
    backgroundColor: "{colors.on-primary}"
    typography: "{typography.caption}"
    rounded: "{rounded.none}"
    padding: 8px 16px

extracted_at: "2026-06-11T06:11:15.805Z"
completeness: 69
scoreVersion: "v2"

---

# Design System — jobirl.com
> Extracted automatically by Prism from https://www.jobirl.com
> Date: 2026-06-11
> Viewport: Desktop 1440x900 + Mobile 390x844
> Values are extracted, not hand-written: rendered styles via getComputedStyle() + colors declared in CSS custom properties (token-only values are marked `(token)` and may not be painted).


## 0. Design DNA

**Density**: moderate &nbsp;|&nbsp; **Motion**: expressive &nbsp;|&nbsp; **Weight**: heavy &nbsp;|&nbsp; **Aesthetic**: soft-rounded

| Dimension | Value | Signal |
|---|---|---|
| Canvas | neutral | `#ffffff` |
| Type posture | sans-led (Montserrat) | "Découvre nos dernières" |
| Color assertion | dual-accent | #1b2888 |
| Whitespace | moderate | section rhythm 48px |
| Interaction | expressive | 22 keyframes, 8 transitions |
| Radius language | soft-pill | from token scale |

**Prism fingerprint**: `neutral-canvas · sans-display · dual-accent · soft-pill · expressive-motion`

> **🤖 TL;DR for AI agents** (read this first — saves you scanning the full doc):
>
> - **Canvas**: `rgb(255, 255, 255)` is the page background. Every component composits against this.
> - **Accent**: `rgb(27, 40, 136)` for primary CTAs ONLY. Never decorative.
> - **Body type**: 16px (token: `typography.body`). Default for ALL text not in a heading role.
> - **Section rhythm**: 48px between major bands. Card padding: 24px.
> - **Default radius**: 10px on buttons/inputs. Pills (`9999px`) only for icon-buttons or status chips.
>
> **Before generating UI**: import this DESIGN.md, scan §2 (Color Palette) + §4 (Components) + §10 (Agent Guide). Skip §11–12 unless extending.

## 1. Visual Theme & Atmosphere

**Signature:** a radial gradient glow in the hero. This is the brand's most recognizable visual — reproduce it, don't replace it with a generic card or flat panel.

jobirl.com uses a pure-white canvas (`#ffffff`), letting typography, color and imagery carry the visual weight. 

Typography is anchored in **Montserrat**. Headlines use weight 700 for confident, assertive presence — the brand wants to be heard. 

Body text reads in #1b2888 (`#1b2888`) — softened from pure black, a small but deliberate detail that lowers reading friction. **#1b2888** (`#1b2888`) is the single high-saturation color in the system — it earns its presence only on interactive elements, making CTAs and links the unmistakable focal points against the otherwise neutral palette. Elevation comes from a small, deliberate set of shadows (3 distinct), each a multi-layer stack — several blurred layers at varying offsets — used sparingly rather than across the whole UI. 
Motion design uses smooth easing curves for polished state transitions. 

**Key Characteristics:**
- Background: Pure White (`#ffffff`)
- Primary typeface: Montserrat
- Primary text: #1b2888 (`#1b2888`)
- Accent: #1b2888 (`#1b2888`)
- Shadow system: 3 distinct elevation levels
- Custom fonts loaded: Montserrat

## 2. Color Palette & Roles

### Background & Surface
- **Pure White** (`#ffffff`): Page background (primary)
- **Light Gray** (`#d5f3fb`): Surface / elevated background
- **Light Gray** (`#def6fe`): Surface / elevated background
- **Whitesmoke** (`#eaeaea`): Surface / elevated background

### Text & Content
- **#1b2888** (`#1b2888`): Primary body text
- **Pure Black** (`#000000`): Secondary text
- **Translucent Charcoal (50%)** (`rgba(47, 49, 64, 0.5)`): Secondary text
- **#0e0969** (`#0e0969`): Secondary text
- **Near-Black** (`#212529`): Secondary text

### Accent & Interactive
- **Gold** (`#ffd700`): Interactive / accent
- **#00cdfd** (`#00cdfd`): Interactive / accent

### Border & Divider
- **Light Grey** (`#cccccc`): Borders / dividers
- **Light Blue** (`#ced4da`): Borders / dividers

### Full Extracted Palette
**18 colors rendered on the page** + **12** more declared in design tokens (CSS custom properties — not necessarily painted). (13 categorized above + 17 additional below.)
Rendered values are read via `getComputedStyle()`; token values come from CSS variable declarations. Third-party logo colors are filtered out.

- `#818181` — Slate Grey
- `#6c757d` — Secondary
- `#495057` — Slate
- `#808080` — Slate Grey
- `#97989f` — Grey
- `#f8f9fa` — Off-White *(token)*
- `#ffc107` — Warning *(token)*
- `#28a745` — Success *(token)*
- `#e83e8c` — #e83e8c *(token)*
- `#20c997` — Emerald *(token)*
- `#343a40` — Dark Gray *(token)*
- `#dc3545` — Danger *(token)*
- `#17a2b8` — Info *(token)*
- `#6610f2` — #6610f2 *(token)*
- `#6f42c1` — Slate Blue *(token)*
- `#007bff` — Primary *(token)*
- `#fd7e14` — #fd7e14 *(token)*

### CSS Custom Properties (Design Tokens)

**Font Family Token**
- `--font-family-monospace`: `SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace`

**Other tokens**
- `--fa-font-regular`: `normal 400 1em/1 "Font Awesome 6 Free"`
- `--fa-font-brands`: `normal 400 1em/1 "Font Awesome 6 Brands"`
- `--primary`: `#007bff`
- `--fa-font-solid`: `normal 900 1em/1 "Font Awesome 6 Free"`

## 3. Typography Rules

### Font Families
- **Primary**: `Montserrat`
- **Secondary**: `Font Awesome 6 Brands`
- **Font 3**: `Font Awesome 6 Free`
- **Font 4**: `Font Awesome 5 Brands`
- **Font 5**: `Font Awesome 5 Free`

### Custom Fonts Loaded
- **Montserrat** weight 100 (italic)
- **Montserrat** weight 200 (italic)
- **Montserrat** weight 300 (italic)
- **Montserrat** weight 400 (italic)
- **Montserrat** weight 500 (italic)
- **Montserrat** weight 600 (italic)
- **Montserrat** weight 700 (italic)
- **Montserrat** weight 800 (italic)
- **Montserrat** weight 900 (italic)
- **Font Awesome 6 Brands** weight 400 (normal)
- **Font Awesome 6 Free** weight 400 (normal)
- **Font Awesome 6 Free** weight 900 (normal)
- **Font Awesome 5 Brands** weight 400 (normal)
- **Font Awesome 5 Free** weight 900 (normal)
- **Font Awesome 5 Free** weight 400 (normal)
- **FontAwesome** weight normal (normal)

### Typography Hierarchy

| Role | Font | Size | Weight | Line Height | Letter Spacing | Notes |
|------|------|------|--------|-------------|----------------|-------|
| Button Large | Montserrat | 60px | 400 | 1.5 | normal | Button label (60px) |
| Link Large | Montserrat | 36px | 400 | 1.5 | normal | Link (36px) — Decoration: none |
| Display Hero | Montserrat | 35px | 700 | 1.2 | normal | Main headline (h2) |
| Sub-heading | Montserrat | 28px | 700 | 1.2 | normal | Third-level heading (h3) |
| Button Large | Montserrat | 20px | 400 | 1 | normal | Button label (20px) |
| Card Title | Montserrat | 16px | 400 | 1.5 | normal | Card headings |
| Caption / Badge | Font Awesome 6 Brands | 16px | 400 | 1 | normal | small text (16px) |
| Button | Montserrat | 13px | 700 | 1.46 | normal | Button label (13px) |
| Link | Montserrat | 13px | 400 | 1.46 | normal | Link (13px) — Decoration: none |
| Button Small | Montserrat | 11px | 600 | 1.5 | normal | Button label (11px) |
| Button Small | Montserrat | 10px | 600 | 1.5 | normal | Button label (10px) |

### Full Font Size Scale

Sizes detected in the design (descending): `60px`, `40px`, `36px`, `35px`, `28.80px`, `28px`, `24px`, `20px`, `17px`, `16px`, `15px`, `14px`, `13px`, `12.80px`, `11px`, `10px`, `9.75px`

> 8 size(s) detected outside the sampled hierarchy (40px, 28.8px, 24px, 17px, 15px, 14px, 12.8px, 9.75px). These appear on elements not in the sampled set — likely additional display sizes, marketing-section overrides, or third-party-widget styles.

## 4. Component Stylings

### Buttons

**Outline**
- Background: `transparent`
- Text: `rgba(0, 0, 0, 0.5)`
- Padding: 4px 12px
- Radius: 4px
- Border: 1px solid rgba(0, 0, 0, 0.1)
- Font: 20px weight 400
- Use: Secondary action with border
- Focus: outline: `rgb(129, 129, 129) dotted 3px`

**Ghost**
- Background: `transparent`
- Text: `#818181` `{colors.primary-focus}`
- Padding: 8px
- Radius: 0px
- Font: 60px weight 400
- Use: Subtle action, toolbar, nav button
- Focus: outline: `rgb(129, 129, 129) dotted 3px`

**Ghost**
- Background: `transparent`
- Text: `#1b2888` `{colors.primary}`
- Padding: 8px
- Radius: 0px
- Font: 13px weight 700
- Use: Subtle action, toolbar, nav button
- Focus: outline: `rgb(129, 129, 129) dotted 3px`

**Pill**
- Background: `#1b2888` `{colors.primary}`
- Text: `#ffffff` `{colors.on-primary}`
- Padding: 10px 15px
- Radius: 30px
- Border: 1px solid rgb(27, 40, 136)
- Font: 10px weight 600
- Use: Status pills, tags, chips
- Focus: outline: `rgb(129, 129, 129) dotted 3px`

**Pill**
- Background: `#ffd700` `{colors.primary-hover}`
- Text: `#1b2888` `{colors.primary}`
- Padding: 10px 15px
- Radius: 30px
- Border: 1px solid rgb(255, 215, 0)
- Font: 11px weight 600
- Use: Status pills, tags, chips
- Focus: outline: `rgb(129, 129, 129) dotted 3px`

### Inputs & Forms

**Text Input**
- Background: `transparent`
- Text: `#495057`
- Padding: 6px 12px
- Radius: 4px
- Border: 0px none rgb(73, 80, 87)
- Font: 16px weight 400
- Use: Text fields, search inputs
- Focus: outline: `rgb(73, 80, 87) none 0px`

### Navigation

**Main Nav**
- Background: `#ffffff` `{colors.on-primary}`
- Padding: 8px 16px
- Radius: none
- Shadow: `rgba(0, 0, 0, 0.075) 0px 2px 4px 0px`
- Font: 16px weight 400
- Use: Fixed/sticky flex nav — N/A items
- Hover: outline: `rgba(0, 0, 0, 0.9) none 0px`


## 4b. Component Behaviors (State Matrix)

### Interaction State Narrative

- **Badge**:
  - **hover:** text #1b2888 → #0056b3, border changes

*State transitions extracted via Playwright simulation — exact values in the YAML matrix below.*

```yaml
component-behaviors:
  button:
    default:
      bg: "rgba(0, 0, 0, 0)"
      fg: "rgb(129, 129, 129)"
    focus:
      bg: "transparent"
      fg: "inherit"
  input:
    default:
      bg: "rgba(0, 0, 0, 0)"
      fg: "rgb(73, 80, 87)"
    focus:
      bg: "transparent"
      fg: "inherit"
  link:
    default:
      bg: "rgba(0, 0, 0, 0)"
      fg: "rgb(129, 129, 129)"
  card:
    default:
      bg: "rgba(0, 0, 0, 0)"
      fg: "rgb(27, 40, 136)"
  navLink:
    default:
      bg: "rgba(0, 0, 0, 0)"
      fg: "rgba(0, 0, 0, 0.9)"
    hover:
      bg: "transparent"
      fg: "inherit"
  badge:
    default:
      bg: "rgba(0, 0, 0, 0)"
      fg: "rgb(27, 40, 136)"
    hover:
      bg: "transparent"
      fg: "rgb(0, 86, 179)"
  footerLink:
    default:
      bg: "rgb(255, 215, 0)"
      fg: "rgb(27, 40, 136)"
      border: "1px solid rgba(0, 0, 0, 0)"
    hover:
      bg: "transparent"
      fg: "inherit"
```

**Agent usage**: Validate generated components against this matrix. If your output's `:hover` state changes properties not listed here, you are off-brand.


## 4c. Component Vocabulary (Closed System)

*This brand uses ONLY the following component vocabulary. Introducing new variants without justification breaks the system's tonal coherence.*

### Buttons
- **3 shape(s)** in this system: `Outline`, `Ghost`, `Pill`
- **DO NOT introduce new buttons variants** without justification

### Inputs & Forms
- **1 shape(s)** in this system: `Text Input`
- **DO NOT introduce new inputs & forms variants** without justification

### Navigation
- **1 shape(s)** in this system: `Main Nav`
- **DO NOT introduce new navigation variants** without justification

## 5. Layout Principles

### Layout Type
**top-nav + content**

### Grid
Single column, centered content

### Max Width
1200px

### Spacing System
Compact spacing — information density prioritized

| Token | Value |
|-------|-------|
| xxs | 2px |
| xs | 4px |
| sm | 8px |
| md | 12px |
| base | 16px |
| lg | 24px |
| xl | 25px |
| 2xl | 48px |
| 3xl | 50px |

### Border Radius Scale
| Name | Value | Use |
|------|-------|-----|
| None | 0px | No rounding |
| Xs | 4px | Tiny corners (badges, micro elements) |
| Sm | 10px | Buttons, inputs, small elements |
| Md | 30px | Cards, containers |
| Lg | 50px | Large rounded elements, pill segments |
| Xl | 58px | Category strips, featured containers |
| Full | 9999px | Pills, avatars, circular elements |

### Shape Language

| Component | Border Radius |
|-----------|---------------|
| Buttons | `4px` |
| Inputs & Forms | `4px` |
| Navigation | `none` |
| Page Body | `0px` |
| Primary Input | `4px` |

**Shape Personality**: Subtly Rounded — Minimal corner rounding (1–4px). Professional restraint.

**Full Radius Spectrum**: 0px, 3.8px, 4px, 4.8px, 5px, 10px, 30px, 50px (from `allBorderRadii` scan)


## 5b. Spacing Rhythm Names

**Measured section padding**: bands use ~24px internal vertical padding (up to 25px) — **compact**. (Distinct from the gap *between* sections above.) Reproduce this generous vertical breathing room; cramped spacing is the #1 tell of a cheap clone.

*Named spacing tokens with explicit use cases. Use these names in YOUR code instead of raw pixels for consistency.*

| Name | Value | Use case |
|------|-------|----------|
| **hero** | `50px` | Top/bottom of full-bleed hero sections |
| **section** | `25px` | Between major bands (color change, content shift) |
| **subsection** | `24px` | Within a section, between content groups |
| **card** | `12px` | Card padding, list-item spacing |
| **compact** | `8px` | Form fields, tight clusters, badge padding |
| **micro** | `4px` | Icon-text gap, tag inner padding |

**Agent rule**: NEVER hardcode raw pixel values for spacing in generated UI. Always reference these named tokens (`spacing-rhythm.section`, etc.).

## 5c. Widget & Structure Library

Structural patterns extracted from the page DOM — these are the **blueprints** an agent should follow to reproduce the page architecture (not just CSS values).

**4/8 structural patterns detected.**

### Hero Pattern

- **Composition:** left-aligned — 
- **Viewport coverage:** 500px tall (not full-viewport)
- **Heading:** "Le réseau social d'orientation" — 15px left-aligned
- **Subheading:** "Une occasion unique de découvrir la réalité des métiers et des formations, de mûrir ton projet d'orientation et d'élargir ton réseau."
- **CTAs:** 1 (primary: "Démarrer mon projet")
- **Clone instruction:** Reproduce the **left-aligned** layout. Use the heading font-size token at the documented size. Pair the centered text with the hero’s decorative visual (gradient / SVG / hero image — see §9b), not bare text.

### Navigation Pattern

- **Position:** fixed (stays visible during scroll)
- **Layout:** unknown — Layout not classified
- **Height:** 68px
- **Logo:** ✓ present
- **Nav links:** 5 primary items
- **CTAs in nav:** 2
- **Search:** ✓ search input visible in nav
- **Clone instruction:** Build a fixed unknown navigation. Reserve 2 slots for primary CTAs.

### Card Grid Pattern

- **Card count:** 3 cards detected
- **Columns (desktop):** 4-up grid
- **Card dimensions:** 380×300px (aspect 1.27:1)
- **Gap:** 0px between cards
- **Content:** ✗ no image
- **Clone instruction:** Build a 4-column grid (desktop) with cards at ~1.27:1 aspect ratio. Text/icon-only cards (no photography).

### Footer Pattern

- **Columns:** 1
- **Links:** 22 total
- **Height:** 354px
- **Includes:** ✗ no newsletter | ✓ social icons |  
- **Clone instruction:** Build a 1-column footer with ~22 links per column, social media links.

## 6. Depth & Elevation

| Level | Treatment | Use |
|-------|-----------|-----|
| Flat (Level 0) | No shadow | Page background, content blocks |
| Layered (Level 1) | <br>`rgba(0, 0, 0, 0.075) 0px 2px 4px 0px` | Cards, elevated surfaces |
| Layered (Level 2) | <br>`rgba(0, 0, 0, 0.15) 0px 3.2px 8px 0px` | Cards, elevated surfaces |
| Inset (Level 3) | <br>`rgb(88, 88, 88) -5px 0px 15px -6px inset` | Buttons, pressed-state elements |

**Shadow Philosophy**: Multi-layered shadow system creating natural, atmospheric depth. Each shadow level combines multiple layers for realistic elevation.

## 7. Motion & Interaction

### Dominant Easing Curves

| Curve | Semantic Name |
|-------|---------------|
| `ease` | CSS ease — Default |
| `ease-in-out` | Ease In-Out — Symmetric |
| `ease-in` | Ease In — Accelerating |

### Duration Scale

| Value | Tier | Typical Use |
|-------|------|-------------|
| `150ms` | Fast | Hover states, micro-interactions |
| `300ms` | Normal | Panel open/close, navigation |
| `500ms` | Slow | Hero animations, page transitions |

### Copy-Paste Transition Snippets

**Background**
```css
transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
```

**Border**
```css
transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
```

**Color / Background**
```css
transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in...;
```

**Opacity**
```css
transition: opacity 0.15s linear;
```

### Keyframe Animation Catalog

| Animation Name | Type | Animated Props | Use Hint |
|----------------|------|----------------|----------|
| `progress-bar-stripes` | Custom | background-position-x, background-position-y | UI transition |
| `spinner-border` | Rotate / Spin | transform | Loading indicator |
| `spinner-grow` | Fade + Move | transform, opacity | Loading indicator |
| `fadeOut` | Fade | opacity | Element exit |
| `slideDown` | Slide | transform | Panel / drawer enter |
| `slideUp` | Slide | transform | Panel / drawer enter |
| `slideLeft` | Slide | transform | UI transition |
| `slideRight` | Slide | transform | UI transition |
| `slideExpandUp` | Scale | transform | UI transition |
| `expandUp` | Scale | transform | UI transition |
| `fadeIn` | Fade + Move | transform, opacity | Element entrance |
| `expandOpen` | Scale | transform | UI transition |
| `bigEntrance` | Fade + Move | transform, opacity | UI transition |
| `hatch` | Rotate / Spin | transform | UI transition |
| `bounce` | Scale | transform | Playful feedback |
| `pulse` | Fade + Move | transform, opacity | Attention / status |
| `floating` | Slide | transform | UI transition |
| `tossing` | Rotate / Spin | transform | UI transition |
| `pullUp` | Scale | transform | UI transition |
| `pullDown` | Scale | transform | UI transition |

> *2 additional animations omitted (repetitive variants). See raw keyframes in `raw-css.json`.*

### Motion Fingerprint

- **Speed Character**: Deliberate & Calm (median duration: `300ms`)
- **Dominant Easing**: custom cubic-bezier curves
- **Animation Library**: 22 unique animations (22 total including variants)

> This design moves with deliberate & calm timing using custom cubic-bezier curves, creating a UI that feels calm and controlled.

## 8. Do's and Don'ts

### Do
- Use #1b2888 (`#1b2888`) for text — not pure black, it's warmer and more readable
- Use Montserrat as the primary typeface — it defines the brand personality
- Use the extracted shadow patterns for elevation — they are tuned to match the brand palette
- Use #1b2888 (`#1b2888`) as the primary accent — it's the brand's signature interactive color
- Use 30px border-radius on primary buttons — the brand uses generously-rounded CTAs
- Keep navigation fixed to the top — the design uses a persistent navigation pattern
- Maintain nav height at 68.0312px — consistent vertical space for the navigation bar
- Use a single primary CTA in the hero — the design intentionally avoids choice paralysis
- Make the navigation fixed — it stays visible during scroll, signaling content depth
- Include a search input directly in the nav — discoverability is a primary UX value here
- Use a 4-column grid on desktop — density matters for this content type

### Don't
- Don't use pure black (`#000000`) for text — the near-black adds warmth
- Don't substitute with generic sans-serif or serif — the custom font carries the brand
- Don't invent new shadow values — use only the extracted shadow levels
- Don't introduce additional saturated accent colors — the palette is intentionally controlled
- Don't use sharp-cornered or pill buttons — 30px is the CTA border-radius standard
- Don't collapse or hide the nav on scroll without an explicit scroll-triggered animation — the design uses fixed nav presence


## 7b. Enforceable Brand Rules

*Structured Do/Don't with reasoning and validation tests. Agents can programmatically verify generated UI.*

```yaml
rules:
  - id: brand-canvas-001
    type: do
    rule: "Always use the page background `rgb(255, 255, 255)` as the base canvas"
    why: "Every component is designed to composit against this exact tone"
    test: "document.body.style.backgroundColor === 'rgb(255, 255, 255)'"
  - id: brand-accent-001
    type: do
    rule: "Reserve `rgb(27, 40, 136)` for primary CTAs and brand-mark signals only"
    why: "Single chromatic assertion device — overuse dilutes meaning"
    test: "querySelectorAll('[style*=\"rgb(27, 40, 136)\"]').length <= 3 per fold"
```

## 9. Responsive Behavior

### Breakpoints
| Name | Width | Key Changes |
|------|-------|-------------|
| Mobile | 450px | Single column, compact spacing |
| Mobile Large | 576px | Expanded mobile layout |
| Mobile Large | 680px | Expanded mobile layout |
| Mobile Large | 750px | Expanded mobile layout |
| Tablet | 800px | Multi-column grids begin |
| Tablet | 991px | Multi-column grids begin |

### Token Diff — Desktop vs Mobile

| Element | Property | Desktop | Mobile |
|---------|----------|---------|--------|
| body | padding | `78px 0px 0px` | `70px 0px 0px` |
| button | width | `auto` | `56px` |
| card | width | `1140px` | `360px` |

### Collapsing Strategy
- Navigation: horizontal links → hamburger menu on mobile
- Cards: multi-column → stacked vertical on mobile
- Footer: multi-column → stacked single column on mobile

### Touch Targets
- Buttons: 4px 12px padding
- Navigation: adequate spacing between items
- Interactive elements: minimum 44px touch target recommended

### Collapsing Narrative

How the structural patterns adapt from desktop to mobile (extracted from both viewport extractions):

- **Hero collapses left-aligned → centered** — composition shifts (verify on actual mobile render).
- **Navigation collapses to hamburger** — 5 links visible on desktop, 0 on mobile (the rest hide behind a menu toggle).
- **Nav CTAs reduced** on mobile (2 → 0) — the design prioritizes content over conversion buttons at small sizes.
- **Card grid: 4-up → 1-up** — cards stack as viewport narrows, becoming a vertical list on mobile.

## 9b. Visual Tone & Photography

**Tone:** Mixed photography + illustration

A balanced mix of photographic content and vector graphics. Photos likely carry product/lifestyle context while SVG handles icons, logos, and decorative accents.

**Canonical Brand Image (OG):**
- https://www.jobirl.com/images/design/logo-jobirl-fb.png
  *This is the image shown when the site is shared on social media — represents the brand visual essence.*

**Hero Image (above-fold dominant visual):**
- Aspect: 0.82:1 (portrait / vertical)
- Rendered size: 445×540px
- Alt text: "Image Accueil"
- *Use this aspect ratio + composition for your clone's hero — mimicking the proportion preserves the visual hierarchy.*

**Aspect Ratio Distribution:**
- Landscape (1.15–2.3): 7 (58%)
- Portrait (<0.87): 4 (33%)
- Square (0.87–1.15): 0 (0%)
- Ultra-wide (>2.3): 1 (8%)

**Media Format Mix:**
- JPG: 6 (typically photographic content)
- PNG: 6 (logos, transparent UI elements, mockups)

**Average rendered image size:** 333×340px
**Above-fold image count:** 3 / 12

**Decorative Patterns Detected:**
- 1 multi-stop linear gradient (mesh-like, 3+ color stops) — the brand leans on rich color transitions for visual depth
- 1 radial gradient — circular color blooms used for spotlight/glow effects
- 5 background patterns (non-photo url() backgrounds) — textures/illustrations as backdrops

**Clone instruction for decorative work:** Decorative details are subtle — don't over-style; the design relies on restraint.

**Imagery Guidance for clones:**
- Mix photography and illustration intentionally: photos for product/context, vectors for icons + decorative accents.
- Respect the format split — replacing JPGs with illustrations (or vice versa) will shift the brand tone.

## 10. Agent Prompt Guide

### Quick Reference
- Background: Pure White (`#ffffff`)
- Primary text: #1b2888 (`#1b2888`)
- Accent: #1b2888 (`#1b2888`)
- Border: Slate Grey (`#818181`)
- Font: Montserrat
- Body: 16px weight 400

### Example Component Prompts
- "Create a hero section on Pure White background (#ffffff). Headline at 15px Montserrat weight 700, line-height 1.2, color #1b2888."
- "Create the primary CTA button: `#1b2888` background, `#ffffff` text, 30px border-radius, 10px 15px padding, 600 weight, Montserrat font."
- "Design a card on `transparent` background. Border: none. Radius: 0px. Shadow: none. Padding: 0px."
- "Build navigation: fixed on `#ffffff`. Montserrat 16px weight 400 for links."

### Iteration Guide
1. **Canvas**: Set the light canvas to Pure White (`#ffffff`) — every component is composited against this exact base.
2. **Typography**: All type in Montserrat, weight range 400–700. Never exceed 700 — heavier weights break the brand's tonal restraint.
3. **Accent**: #1b2888 (`#1b2888`) — one accent, applied consistently to CTAs, active states, and links. Never introduce a second saturated color.
4. **Shape**: CTAs at `0px`, cards at `0px`. Apply border-radius from the extracted scale only — don't invent intermediate values.
5. **Spacing**: Use the `--ca-space-*` token scale (4px–25px). All padding, margin, and gap values are multiples from this scale — no magic numbers.
6. **Tokens**: Import from §11 CSS Export (`--ca-*` vars). Never hardcode hex values — always reference a token so theming remains consistent.

## 11. CSS Design Tokens Raw Export

*Copy-paste ready `:root {}` block — all values extracted directly from the live site.*

```css
/* Colors */
:root {
  --ca-on-primary: #ffffff;
  --ca-surface-1: #d5f3fb;
  --ca-surface-2: #def6fe;
  --ca-primary: #1b2888;
  --ca-ink-subtle: #6c757d;
  --ca-primary-hover: #ffd700;
  --ca-primary-focus: #818181;
  --ca-semantic-error: #dc3545;
  --ca-semantic-success: #28a745;
  --ca-semantic-warning: #ffc107;
  --ca-semantic-info: #17a2b8;
}

/* Typography */
:root {
  --ca-font-primary: "Montserrat", system-ui, sans-serif;
  --ca-text-display: 35px;
  --ca-text-body: 10px;
  --ca-text-small: 36px;
  --ca-text-caption: 16px;
  --ca-text-button: 60px;
}

/* Spacing & Radius */
:root {
  --ca-space-xxs: 2px;
  --ca-space-xs: 4px;
  --ca-space-sm: 8px;
  --ca-space-md: 12px;
  --ca-space-base: 16px;
  --ca-space-lg: 24px;
  --ca-space-xl: 25px;
  --ca-space-2xl: 48px;
  --ca-space-3xl: 50px;
  --ca-radius-none: 0px;
  --ca-radius-xs: 4px;
  --ca-radius-sm: 10px;
  --ca-radius-md: 30px;
  --ca-radius-lg: 50px;
  --ca-radius-xl: 58px;
  --ca-radius-full: 9999px;
}
```


## 13. Page Structure Skeleton

*The actual layout the source site uses. Reproduce these sections in order to match the site structure.*

```yaml
page-skeleton:
  - section: hero
    tag: main
    height: 5379px
    width: full-bleed
    layout: block
    children: 7
  - section: content-section
    tag: div
    height: 100px
    width: full-bleed
    layout: block
    children: 2
  - section: unknown
    tag: div
    classes: ["container-fluid", "shadow-sm"]
    height: 100px
    width: full-bleed
    layout: block
    children: 1
    bg: "rgb(213, 243, 251)"
    padding: "0px 15px"
  - section: unknown
    tag: div
    classes: ["container", "nopadding"]
    height: 100px
    width: 1140px
    layout: block
    children: 1
    padding: "0px 15px"
  - section: feature-section
    tag: div
    classes: ["container-fluid", "mb-5"]
    height: 500px
    width: full-bleed
    layout: block
    children: 1
    bg-treatment: radial-gradient
    padding: "0px 15px"
  - section: feature-section
    tag: section
    classes: ["bg_main", "mb-5"]
    height: 3317px
    width: full-bleed
    layout: block
    children: 8
    bg-treatment: linear-gradient
  - section: feature-section
    tag: div
    classes: ["container"]
    height: 500px
    width: 1140px
    layout: block
    children: 1
    padding: "0px 15px"
  - section: feature-section
    tag: div
    classes: ["container"]
    height: 543px
    width: 1140px
    layout: block
    children: 1
    padding: "0px 15px"
  - section: feature-section
    tag: div
    classes: ["container", "mt-5"]
    height: 540px
    width: 1140px
    layout: block
    children: 1
    padding: "0px 15px"
  - section: feature-section
    tag: div
    classes: ["container", "mt-5"]
    height: 727px
    width: 1140px
    layout: block
    children: 1
    padding: "0px 15px"
  - section: feature-section
    tag: div
    classes: ["container", "mt-5", "mb-5"]
    height: 695px
    width: 1140px
    layout: block
    children: 1
    padding: "0px 15px"
  - section: feature-section
    tag: section
    height: 818px
    width: full-bleed
    layout: block
    children: 1
  - section: feature-section
    tag: div
    classes: ["container", "mb-5", "mt-5"]
    height: 818px
    width: 1140px
    layout: block
    children: 3
    padding: "0px 15px"
  - section: feature-section
    tag: section
    height: 407px
    width: full-bleed
    layout: block
    children: 1
  - section: feature-section
    tag: div
    classes: ["container", "mb-5"]
    height: 407px
    width: 1140px
    layout: block
    children: 2
    padding: "0px 15px"
  - section: content-section
    tag: section
    height: 500px
    width: full-bleed
    layout: block
    children: 1
  - section: content-section
    tag: div
    classes: ["container-fluid"]
    height: 500px
    width: full-bleed
    layout: block
    children: 1
    bg: "rgb(14, 9, 105)"
    tone: dark
    padding: "0px 15px"
  - section: content-section
    tag: div
    classes: ["container"]
    height: 500px
    width: 1140px
    layout: block
    children: 1
    padding: "0px 15px"
  - section: footer
    tag: footer
    height: 354px
    width: full-bleed
    layout: block
    children: 1
    bg: "rgb(234, 234, 234)"
    vertical-padding: ~25px
    padding: "0px 0px 50px"
  - section: content-section
    tag: section
    height: 304px
    width: full-bleed
    layout: block
    children: 1
    vertical-padding: ~24px
  - section: content-section
    tag: div
    classes: ["container", "pt-5"]
    height: 304px
    width: 1140px
    layout: block
    children: 1
    vertical-padding: ~24px
    padding: "48px 15px 0px"
```

**Agent rule**: rebuild sections in this order (sorted by vertical position). Match the layout primitive (grid N-col / flex direction / block).


## 14. Copy Library (Real Content from Source)

*Actual text content extracted from the live page. Use these strings verbatim when reproducing the site — they carry the brand voice.*

```yaml
copy:
  section-headings:
    - "Construis ton projet d'orientation en échangeant avec des pros et des étudiants !"
    - "Je trouve mon orientation"
    - "Je cherche un stage ou une alternance"
    - "Découvre nos dernières actualités"
    - "Explore nos communautés"
  sub-headings:
    - "Quels métiers sont faits pour toi ?"
    - "Dossiers, conseils : toutes les infos pour t'orienter sereinement !"
    - "Comment préparer un entretien de stage ou d’alternance ?"
    - "TOP 6 des secteurs où tu peux faire des métiers sans diplôme Mis à jour le..."
    - "Rencontres inspirantes avec les Compagnons du Tour de France"
    - "Métier d’agréeur : 24h avec Jérôme"
  ctas:
    - "Mon orientation"
    - "S’engager"
    - "S'inscrire"
    - "Démarrer mon projet"
    - "Voir plus d'actualités"
    - "Rejoindre la communauté"
  navigation:
    - "Mon orientation"
    - "Mentorat"
    - "Communauté d'entraide"
    - "Stages & alternance"
    - "Conseils & infos"
    - "S’engager"
    - "S'inscrire"
  footer-links:
    - "Rejoindre la communauté"
    - "Qui est JobIRL ?"
```

**Agent rule**: reuse these exact strings when generating UI. Do NOT translate or rephrase — brand voice is preserved through the original wording.


## 15. Asset Inventory (Image Roles & Ratios)

*Image inventory classified by role and aspect ratio. When reproducing the site, allocate this number of assets per role.*

```yaml
assets:
  logo:
    count: 3
    avg-ratio: 2.12
    common-aspect: "~16:9 landscape"
    sample-alts:
      - "Logo JobIRL"
      - "Stage et alternance mentorat"
  product:
    count: 4
    avg-ratio: 1.18
    common-aspect: "~1:1 square"
    sample-alts:
      - "Comment préparer un entretien de stage ou d’alternance ?"
      - "TOP 6 des secteurs où tu peux faire des métiers sans diplôme"
      - "Rencontres inspirantes avec les Compagnons du Tour de France"
  editorial:
    count: 1
    avg-ratio: 0.61
    common-aspect: "~9:16 portrait"
    sample-alts:
      - "Groupe 3"
  thumbnail:
    count: 5
    avg-ratio: 1.03
    common-aspect: "~1:1 square"
    sample-alts:
      - "Icon pouce"
      - "Icon caméra"
```

**Agent rule**: when generating placeholder images, match these counts and aspect ratios. Use neutral placeholder backgrounds for `product` (e.g. `#f5f5f5`), full-color photography hints for `hero` and `editorial`.


## 16. Component HTML Templates

*Suggested HTML markup for reproducing the key components — based on what was detected in the source DOM.*

### Button (primary action)
```html
<button class="btn btn-primary">
  ×
</button>
```
_Source pattern detected: padding `8px` · radius `0px` · weight `400`_

### Generic Card
```html
<div class="card">
  <!-- content -->
</div>
```
_Source pattern detected: padding `0px` · radius `0px` · shadow `none`_

**Agent rule**: use these markup skeletons as the structural baseline. Apply tokens from §2-3 for visual styling.


## 17. Content Architecture & Resources (Links by Purpose)

*The page's links classified by purpose — the information architecture to reproduce. Categories, featured images, devices and projects are extracted from the rendered DOM, not guessed.*

**By purpose:** **nav** 9 · **cta** 1 · **social** 4 · **footer** 18 · **other** 22

**Primary actions (conversion path):**
- Primary call-to-action — "Démarrer mon projet" (the conversion path) → `https://www.jobirl.com/mon-orientation/guide-orientation`

**Projects / case studies detected** (clustered by URL + featured image):

*Conseils-Infos* — medium confidence, 5 items:

| Title | Featured image | Link |
|---|---|---|
| Des live vidéos de pros qui te parlent de le | `camera.png` (ar 1.13) | https://www.jobirl.com/conseils-infos/metiers/live-metier |
| Des dossiers pour t'aider dans ton projet d' | `files.png` (ar 1) | https://www.jobirl.com/conseils-infos/conseils-orientation |
| Des conseils pratiques pour trouver ton stag | `newspaper.png` (ar 1) | https://www.jobirl.com/conseils-infos/stage-alternance |
| Voir plus d'actualités | — | https://www.jobirl.com/conseils-infos/nos-actualites |
| Espace presse | — | https://www.jobirl.com/conseils-infos/espace-presse |

*Conseils-Et-Infos* — medium confidence, 4 items:

| Title | Featured image | Link |
|---|---|---|
| Comment préparer un entretien de stage ou d’ | `apercu-petit-entretien.jpg` (ar 1.18) | https://www.jobirl.com/conseils-et-infos/preparer-entretien-stage-alternance |
| TOP 6 des secteurs où tu peux faire des méti | `dossier-grand-apercu.jpg` (ar 1.18) | https://www.jobirl.com/conseils-et-infos/dossier-metiers-sans-diplome |
| Rencontres inspirantes avec les Compagnons d | `compagnons-miniature.jpg` (ar 1.18) | https://www.jobirl.com/conseils-et-infos/rencontres-inspirantes-compagnons-du-tour-de-france |
| Métier d’agréeur : 24h avec Jérôme | `jerome-24h-avec.jpg` (ar 1.18) | https://www.jobirl.com/conseils-et-infos/metier-d-agreeur-24h-avec-jerome |

*Communaute-Entraide* — medium confidence, 3 items:

| Title | Featured image | Link |
|---|---|---|
| Les écoles | `card_house.png` (ar 1.07) | https://www.jobirl.com/communaute-entraide/ecoles |
| Les entreprises | `card_bag.png` (ar 1.07) | https://www.jobirl.com/communaute-entraide/entreprises |
| Les groupes | `card_bulbe.png` (ar 1.07) | https://www.jobirl.com/communaute-entraide/groupes-entraide |

**Signals:** 14/54 links carry a featured image · device mockups detected: laptop ×1 · dominant link roles: footer-link (22), content-card (12), inline-link (10).


---
## Extraction Completeness: 69/100 (C)

| Category | Score | Max | Detail |
|----------|-------|-----|--------|
| Colors & Palette | 18 | 25 | 13 named colors |
| Typography | 20 | 20 | 11 roles defined |
| Components | 12 | 20 | 3 specs extracted |
| Motion & Interaction | 12 | 15 | Keyframes |
| CSS Custom Properties | 2 | 10 | 33 vars |
| Responsive Breakpoints | 5 | 5 | 6 breakpoints |
| Variable Fonts | 0 | 5 | None detected |

## 12. Known Gaps & Confidence

Explicit list of what this extraction could NOT capture. Agents should not invent values for these — either skip the feature or use the documented baseline + heuristic fallback.

*Auto-detected extraction limitations — understand before building:*

- **Licensed web fonts (Font Awesome 6 Brands, Font Awesome 6 Free, Font Awesome 5 Brands)** — detected but not downloaded. Substitute with your licensed copy or a close fallback (see Typography section for metrics).
- **Sparse component extraction** — fewer than 5 component types detected. Highly dynamic sections (modals, datepickers, carousels) require interaction to render and are not captured in a static pass.

*✅ No critical extraction gaps detected — high-confidence reproduction expected.*

### Per-section confidence

| Section | Confidence | Reason |
|---------|------------|--------|
| §1 Visual Theme | High | Body bg extracted via getComputedStyle() |
| §2 Colors | Medium | 33 CSS vars (semantic naming requires ≥20 for high) |
| §3 Typography | High | 11 typography roles inferred |
| §4 Components | Medium | 3 component variants captured |
| §7 Motion | High | Keyframes + transitions |
| §8 Do's/Don'ts | High | 17 rules generated; design-decisions.json has evidence per rule |
| §9 Responsive | High | 6 breakpoints detected |
| §9b Photography | High | 12 images, hero present |

## 11.1 CSS Implementation Guide (CSS Interception Engine v2.15+)

*Ready-to-use CSS from Prism's CSS Interception Engine — intercepted directly from the site's CSS files (bypasses CORS). Copy-paste into your `<style>` block.*

### Font Loading

3 font file(s) captured (291KB total). When running `prism add`, fonts are saved to `extractions/jobirl.com/fonts/` and embedded as base64 in the output HTML.

**@font-face declarations to use:**
```css
@font-face {
  font-family: 'Font Awesome 6 Brands';
  /* src: url('/fonts/Font-Awesome-6-Brands.woff2') format('woff2'); */
  font-weight: 400;
  font-style: normal;
  font-display: block;
}
@font-face {
  font-family: 'Font Awesome 6 Free';
  /* src: url('/fonts/Font-Awesome-6-Free.woff2') format('woff2'); */
  font-weight: 400;
  font-style: normal;
  font-display: block;
}
@font-face {
  font-family: 'Font Awesome 6 Free';
  /* src: url('/fonts/Font-Awesome-6-Free.woff2') format('woff2'); */
  font-weight: 900;
  font-style: normal;
  font-display: block;
}
@font-face {
  font-family: 'Font Awesome 5 Brands';
  /* src: url('/fonts/Font-Awesome-5-Brands.woff2') format('woff2'); */
  font-weight: 400;
  font-style: normal;
  font-display: block;
}
@font-face {
  font-family: 'Font Awesome 5 Free';
  /* src: url('/fonts/Font-Awesome-5-Free.woff2') format('woff2'); */
  font-weight: 900;
  font-style: normal;
  font-display: block;
}
@font-face {
  font-family: 'Font Awesome 5 Free';
  /* src: url('/fonts/Font-Awesome-5-Free.woff2') format('woff2'); */
  font-weight: 400;
  font-style: normal;
  font-display: block;
}
@font-face {
  font-family: 'FontAwesome';
  /* src: url('/fonts/FontAwesome.woff2') format('woff2'); */
  font-weight: normal;
  font-style: normal;
  font-display: block;
}
```

### Keyframe Animations (Intercepted from CSS)

**33 @keyframes found** — these are the real animation definitions:

```
@keyframes fadeOut { ... }
@keyframes blinker { ... }
@keyframes progress-bar-stripes { ... }
@keyframes spinner-border { ... }
@keyframes spinner-grow { ... }
@keyframes highlightBg { ... }
@keyframes spinner { ... }
@keyframes move { ... }
@keyframes slideDown { ... }
@keyframes slideUp { ... }
@keyframes slideLeft { ... }
@keyframes slideRight { ... }
@keyframes slideExpandUp { ... }
@keyframes expandUp { ... }
@keyframes fadeIn { ... }
@keyframes expandOpen { ... }
@keyframes bigEntrance { ... }
@keyframes hatch { ... }
@keyframes bounce { ... }
@keyframes pulse { ... }
@keyframes floating { ... }
@keyframes tossing { ... }
@keyframes pullUp { ... }
@keyframes pullDown { ... }
@keyframes stretchLeft { ... }
@keyframes stretchRight { ... }
@keyframes fa-beat { ... }
@keyframes fa-bounce { ... }
@keyframes fa-fade { ... }
@keyframes fa-beat-fade { ... }
@keyframes fa-flip { ... }
@keyframes fa-shake { ... }
@keyframes fa-spin { ... }
```

<details><summary>Full keyframes CSS (33 animations)</summary>

```css
@keyframes fadeOut{0%{opacity:1}100%{opacity:0}}
@keyframes blinker{50%{opacity:0}}
@-webkit-keyframes progress-bar-stripes{from{background-position:1rem 0}
@-webkit-keyframes spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}
@-webkit-keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1;-webkit-transform:none;transform:none}}
@-webkit-keyframes highlightBg{0%,to{background:#fff}50%{background:#cbf0f2}}
@-webkit-keyframes spinner{0%{-webkit-transform:rotate(0);-moz-transform:rotate(0);-ms-transform:rotate(0);-o-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);-moz-transform:rotate(360deg);-ms-transform:rotate(360deg);-o-transform:rotate(360deg);transform:rotate(360deg)}}
@-webkit-keyframes move{0%{background-position:0 0}100%{background-position:50px 50px}}
@keyframes slideDown{0%{transform:translateY(-100%)}50%{transform:translateY(8%)}65%{transform:translateY(-4%)}80%{transform:translateY(4%)}95%{transform:translateY(-2%)}100%{transform:translateY(0)}}
@keyframes slideUp{0%{transform:translateY(100%)}50%{transform:translateY(-8%)}65%{transform:translateY(4%)}80%{transform:translateY(-4%)}95%{transform:translateY(2%)}100%{transform:translateY(0)}}
@keyframes slideLeft{0%{transform:translateX(150%)}50%{transform:translateX(-8%)}65%{transform:translateX(4%)}80%{transform:translateX(-4%)}95%{transform:translateX(2%)}100%{transform:translateX(0)}}
@keyframes slideRight{0%{transform:translateX(-150%)}50%{transform:translateX(8%)}65%{transform:translateX(-4%)}80%{transform:translateX(4%)}95%{transform:translateX(-2%)}100%{transform:translateX(0)}}
@keyframes slideExpandUp{0%{transform:translateY(100%) scaleX(.5)}30%{transform:translateY(-8%) scaleX(.5)}40%{transform:translateY(2%) scaleX(.5)}50%{transform:translateY(0) scaleX(1.1)}60%{transform:translateY(0) scaleX(.9)}70%{transform:translateY(0) scaleX(1.05)}80%{transform:translateY(0) scaleX(.95)}90%{transform:translateY(0) scaleX(1.02)}100%{transform:translateY(0) scaleX(1)}}
@keyframes expandUp{0%{transform:translateY(100%) scale(.6) scaleY(.5)}60%{transform:translateY(-7%) scaleY(1.12)}75%{transform:translateY(3%)}100%{transform:translateY(0) scale(1) scaleY(1)}}
@keyframes fadeIn{0%{transform:scale(0);opacity:0}60%{transform:scale(1.1)}80%{transform:scale(.9);opacity:1}100%{transform:scale(1);opacity:1}}
@keyframes expandOpen{0%{transform:scale(1.8)}50%{transform:scale(.95)}80%{transform:scale(1.05)}90%{transform:scale(.98)}100%{transform:scale(1)}}
@keyframes bigEntrance{0%{transform:scale(.3) rotate(6deg) translateX(-30%) translateY(30%);opacity:.2}30%{transform:scale(1.03) rotate(-2deg) translateX(2%) translateY(-2%);opacity:1}45%{transform:scale(.98) rotate(1deg) translateX(0) translateY(0);opacity:1}60%{transform:scale(1.01) rotate(-1deg) translateX(0) translateY(0);opacity:1}75%{transform:scale(.99) rotate(1deg) translateX(0) translateY(0);opacity:1}90%{transform:scale(1.01) rotate(0deg) translateX(0) translateY(0);opacity:1}100%{transform:scale(1) rotate(0deg) translateX(0) translateY(0);opacity:1}}
@keyframes hatch{0%{transform:rotate(0deg) scaleY(.6)}20%{transform:rotate(-2deg) scaleY(1.05)}35%{transform:rotate(2deg) scaleY(1)}50%{transform:rotate(-2deg)}65%{transform:rotate(1deg)}80%{transform:rotate(-1deg)}100%{transform:rotate(0deg)}}
@keyframes bounce{0%{transform:translateY(0) scaleY(.6)}60%{transform:translateY(-100%) scaleY(1.1)}70%{transform:translateY(0) scaleY(.95) scaleX(1.05)}80%{transform:translateY(0) scaleY(1.05) scaleX(1)}90%{transform:translateY(0) scaleY(.95) scaleX(1)}100%{transform:translateY(0) scaleY(1) scaleX(1)}}
@keyframes pulse{0%{transform:scale(.9);opacity:.7}50%{transform:scale(1);opacity:1}100%{transform:scale(.9);opacity:.7}}
@keyframes floating{0%{transform:translateY(0)}50%{transform:translateY(8%)}100%{transform:translateY(0)}}
@keyframes tossing{0%{transform:rotate(-4deg)}50%{transform:rotate(4deg)}100%{transform:rotate(-4deg)}}
@keyframes pullUp{0%{transform:scaleY(.1)}40%{transform:scaleY(1.02)}100%,60%{transform:scaleY(.98)}80%{transform:scaleY(1.01)}100%{transform:scaleY(1)}}
@keyframes pullDown{0%{transform:scaleY(.1)}40%{transform:scaleY(1.02)}100%,60%{transform:scaleY(.98)}80%{transform:scaleY(1.01)}100%{transform:scaleY(1)}}
@keyframes stretchLeft{0%{transform:scaleX(.3)}40%{transform:scaleX(1.02)}100%,60%{transform:scaleX(.98)}80%{transform:scaleX(1.01)}100%{transform:scaleX(1)}}
@keyframes stretchRight{0%{transform:scaleX(.3)}40%{transform:scaleX(1.02)}100%,60%{transform:scaleX(.98)}80%{transform:scaleX(1.01)}100%{transform:scaleX(1)}}
@-webkit-keyframes fa-beat{0%,90%{-webkit-transform:scale(1);transform:scale(1)}45%{-webkit-transform:scale(var(--fa-beat-scale,1.25));transform:scale(var(--fa-beat-scale,1.25))}}
@-webkit-keyframes fa-bounce{0%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}10%{-webkit-transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0);transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0)}30%{-webkit-transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em));transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em))}50%{-webkit-transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0);transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0)}57%{-webkit-transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em));transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em))}64%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}
@-webkit-keyframes fa-fade{50%{opacity:var(--fa-fade-opacity,.4)}}
@-webkit-keyframes fa-beat-fade{0%,to{opacity:var(--fa-beat-fade-opacity,.4);-webkit-transform:scale(1);transform:scale(1)}50%{
```
</details>

### Brand Gradient Palette

**3 complex gradients captured** from the site's CSS. The first few are the most prominent visual decorations:

```css
/* Gradient 1 */
background: radial-gradient(circle,#a0dff0 0,rgba(213,243,251,.7427171552214635);

/* Gradient 2 */
background: radial-gradient(circle,#071160 0,#071160 0,rgba(7,17,96,.8729691705783876);

/* Gradient 3 */
background: linear-gradient(360deg,#d5f3fb 0,rgba(213,243,251,.7427171552214635);

```

### Hover State CSS (Intercepted)

**33 hover rule lines** captured from CSS files. Key interactive transitions from real CSS (not inferred):

```css
.owl-carousel .owl-video-play-icon:hover{-ms-transform:scale(1.3,1.3);transform:scale(1.3,1.3)}

#menu .account:hover,#menu .btn_espace_pro:hover,#menu .btn_register:hover,.overlay a{text-decoration:none}

#menu li.nav-item.active>a,#menu li.nav-item:hover>a{color:#00cdfd!important}

#menu .account:hover{border:1px solid #caf4ff}

#menu .dropdown-item:hover,#menu .my_content.active,#menu .my_content:hover{background:#fff5bc!important;cursor:pointer}

.fileinput-button input:hover{cursor:pointer!important}

.overlay a:focus,.overlay a:hover{color:#f1f1f1}

#home_video_button:hover{cursor:pointer}

#social_icons a:hover{border:1px solid #333}

#home_dashboard #menu_top .sub_menu_dashboard a.active,#home_dashboard #menu_top .sub_menu_dashboard a:hover{color:#333;border-bottom:4px solid #fc0;transition-duration:.5s;cursor:pointer}

#home_dashboard #menu_top.pro .sub_menu_dashboard a.active,#home_dashboard #menu_top.pro .sub_menu_dashboard a:hover{color:rgba(47,49,64,.5);border-bottom:4px solid #00cdfd;transition-duration:.5s;cursor:pointer}

#full_secteur #les_metiers .filtres.active,#full_secteur #les_metiers .filtres:hover{transition-duration:.4s;background:#00cdfd;color:#fff}

.owl-theme .owl-nav [class*=owl-]:hover{background:#869791;color:#FFF;text-decoration:none}

.owl-theme .owl-dots .owl-dot.active span,.owl-theme .owl-dots .owl-dot:hover span{background:#869791}

a:hover{color:#0056b3;text-decoration:underline}

a:not([href]):not([class]):hover{color:inherit;text-decoration:none}
```

> **Note**: All values above are extracted from the live site's CSS files. The font files are saved locally by Prism and embedded in the output HTML. Use them as-is for maximum fidelity.

## 11.2 Measured Reality (CDP Engine)

Captured directly from Chrome's engine across **all 410 rendered nodes** — not a sample. These are the values the page *actually paints*, weighted by how often they appear.

### Real Responsive Breakpoints
**13 breakpoints** read from the live `@media` rules (not guessed):
`450px` · `479px` · `480px` · `576px` · `680px` · `750px` · `767px` · `768px` · `800px` · `991px` · `992px` · `1000px` · `1200px`

### Measured Design Scale
**Type scale by usage** (× = paint count): `16px`×217 · `13px`×61 · `12.8px`×30 · `28px`×28 · `35px`×16 · `14px`×14 · `15px`×12 · `28.8px`×9

**Radius scale** (× = paint count): `80px`×14 · `30px`×6 · `50%`×5 · `5px`×4 · `10px`×3 · `50px`×2 · `4px`×2

**Weights** (× = paint count): `400`×263 · `700`×122 · `600`×10 · `900`×6 · `500`×4

**Elevation (real shadows)**:
```css
rgba(0, 0, 0, 0.15) 0px 3.2px 8px 0px
rgba(0, 0, 0, 0.075) 0px 2px 4px 0px
```

### Provenance — measured styles on key elements
Read from the live CSSOM (includes runtime-injected CSS). This is *what actually styles the page*, by element:

```css
body { font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji"; font-size:1rem; font-weight:400; color:#212529; background-color:#fff }
@media screen body { color:#1b2888 }
@media screen body { font-family:Montserrat,sans-serif }
nav { box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important }
@media screen nav { background:#fff; background-color:rgb(255, 255, 255) }
h1 { font-size:2.5rem }
@media screen h1 { font-weight:700 }
@media screen h1 { font-size:2.4em }
@media screen h1 { font-size:2em }
@media screen h1 { font-size:15px; color:#00cdfd; font-weight:700 }
h2 { font-size:2rem }
@media screen h2 { font-weight:700 }
```

> Selectors normalised to their semantic element — source class names are often build-hashed (`.bgDIHX`) and not reusable. The declarations + CSS vars are the transferable part.

---
*Generated by Prism — automated Playwright extraction + design analysis.*
*Source: https://www.jobirl.com | 2026-06-11T06:11:15.825Z*
*Values extracted via getComputedStyle() (rendered) + CSS custom properties (tokens, marked `(token)`). Token-only values may not be painted — verify against the live site before shipping.*
