Visual Language
The design system for "Gil Is Awful" - a Black Mirror-inspired presentation about AI personas. This document captures the visual language, motion principles, and component patterns used throughout the production.
PRISMO Corporate Brand
Official brand colors for internal training materials
Primary: #ff6b35 (Prismo Orange)
Secondary: #ff8c5a (Light Orange)
Accent: #fbbf24 (Amber)
All Jan Eriksen training materials follow Prismo brand guidelines. The warm orange palette conveys professionalism, approachability, and engineering excellence. Partner branding (VYSA) uses complementary colors.
Warm Palette (Prismo Theme)
Used for Jan's sections. Creates trust, warmth, and approachability. The audience should feel comfortable.
Cold Palette
Used after the reveal. Colder, more clinical. The audience should feel the shift.
Glitch / Title Sequence
Black Mirror aesthetic. Used only for title sequence and reveal moment. High contrast, chromatic aberration.
Accent / Netflix
The signature red. Used sparingly for featured badges and key moments.
Playfair Display
Used for titles, section headers, and dramatic moments. Elegant, editorial feel.
Gil Is Awful
The Reveal
"Jan doesn't exist."
Inter
Primary text font. Clean, professional, highly readable. Used for body copy and UI elements.
Senior Software Engineer. 15 years in the game.
I've seen things. Fixed things. Broken things.
Today I'm going to show you how I fix a bug.
JetBrains Mono
For code blocks, terminal output, and technical elements. Monospace with ligatures.
$ npm test
const fixedDate = new Date(dateString).toISOString();
// I've seen this before.
Type Scale
The Contrast Rule
"The reveal only works if they trust what came before."
The entire visual strategy hinges on this principle. Jan's sections must feel completely normal - clean, professional, trustworthy. The audience should forget about the creepy title sequence. Only then does the reveal have impact.
Act 1: Title
Black Mirror aesthetic
- Glitch effects
- Chromatic aberration
- Static noise
- Unsettling, sets tone
Act 2: Jan
Clean & Professional
- NO glitch effects
- Smooth transitions
- Warm colors
- Trust-building
Act 3: Reveal
Return of glitch
- Screen tear transition
- Color temp shifts cold
- Stark, minimal slides
- Flicker on "2027"
- Title sequence (opening)
- The reveal transition (when Jan says goodbye)
- "Jan doesn't exist" card
- Ending sequence ("2027")
- Credits text
- Jan's introduction (Sections 1-6)
- All bug fix tutorial content
- Code demonstrations
- PR creation
- Any slide where Jan is "speaking"
Glitch / Chromatic Aberration
The signature Black Mirror effect. Red/cyan text shadows offset with jitter animation.
@keyframes glitch { 0%, 100% { transform: translate(0); text-shadow: 2px 0 #ff0040, -2px 0 #00f0ff; } 20% { transform: translate(-3px, 2px); text-shadow: -2px 0 #ff0040, 2px 0 #00f0ff; } 40% { transform: translate(2px, -2px); text-shadow: 3px 0 #ff0040, -3px 0 #00f0ff; } /* ... continues */ } .glitch-text { animation: glitch 0.5s infinite; }
Screen Tear Transition
Used at the moment of reveal. Horizontal slices with offset. VHS malfunction feel.
@keyframes screen-tear { 0% { clip-path: inset(0 0 0 0); } 10% { clip-path: inset(20% 0 30% 0); transform: translateX(-5px); } 20% { clip-path: inset(50% 0 10% 0); transform: translateX(5px); } 30% { clip-path: inset(10% 0 60% 0); transform: translateX(-3px); } 40% { clip-path: inset(40% 0 20% 0); transform: translateX(3px); } 50%, 100% { clip-path: inset(0 0 0 0); transform: translateX(0); } }
Flicker Effect
Subtle opacity flicker. Used for the ominous "2027" ending card. Creates unease.
@keyframes flicker { 0%, 100% { opacity: 1; } 92% { opacity: 1; } 93% { opacity: 0.7; } 94% { opacity: 1; } 96% { opacity: 0.8; } 97% { opacity: 1; } } .flicker-text { animation: flicker 2s infinite; }
Static Noise
SVG-based fractal noise as background overlay. Very subtle (0.03-0.05 opacity). Adds texture.
.static-bg { background-image: url("data:image/svg+xml, %3Csvg viewBox='0 0 256 256' xmlns='...'%3E %3Cfilter id='noise'%3E %3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E %3C/filter%3E %3Crect width='100%' height='100%' filter='url(%23noise)'/%3E %3C/svg%3E"); opacity: 0.03; pointer-events: none; mix-blend-mode: overlay; }
Introduction cards for characters. Warm gradient border, avatar with initials or image.
Jan Eriksen
Senior Software Engineer
15 years in the game. Seven mechanical keyboards. Bonsai trees on the windowsill.
<div class="persona-card"> <div class="persona-avatar">JE</div> <div> <h4 class="persona-name">Jan Eriksen</h4> <p class="persona-role">Senior Software Engineer</p> <p class="persona-bio">...</p> </div> </div>
Code and command output. Large, readable. Traffic light dots in header. Green text for output.
.terminal { background: #0d0d0d; border: 1px solid #262626; border-radius: 8px; font-family: 'JetBrains Mono', monospace; font-size: 1.15rem; padding: 1.5rem 2rem; }
For Jan's memorable lines. Left border accent, subtle quote mark decoration.
"Carry less, go further. Works for backpacks. Works for code."
- Jan Eriksen
.quote-card { position: relative; padding: 1.5rem 2rem; background: #161616; border-left: 3px solid #ff6b35; font-style: italic; } .quote-card::before { content: '"'; position: absolute; top: 0.5rem; left: 0.75rem; font-size: 3rem; color: #ff6b35; opacity: 0.2; }
Numbered indicators for process steps. Warm gradient for Jan sections, cold for reveal.
.step-badge { display: inline-flex; align-items: center; justify-content: center; width: 2rem; height: 2rem; border-radius: 50%; font-weight: 700; font-size: 0.875rem; } .step-badge--warm { background: linear-gradient(135deg, #ff6b35, #fbbf24); } .step-badge--cold { background: linear-gradient(135deg, #3b82f6, #06b6d4); }