Design Specification — ihatepdf.cv — Free Online PDF Editor, No Watermark, No Upload
| Field | Value |
| Site / Project | https://ihatepdf.cv |
| Analyzed on | 2026-10-30 |
| Analysis mode | Automated code extraction (no AI) |
Overview
This design system was extracted programmatically from the source page. It is built on a light canvas (#F7F5F0), ink text (#1C1916), a vivid accent (#FB2C36). All type is set in var(--font-sans). Detected font weights: 500, 600, 700, 800, 900. Detected style signatures: gradient-rich / aurora; technical / mono accents.
Logo asset(s): https://ihatepdf.cv/favicon.svg
Color System
Detected palette (by frequency)
| Hex | RGB | HSL | Count |
#FFFFFF | 255, 255, 255 | 0° 0% 100% | 567 |
#1C1916 | 28, 25, 22 | 30° 12% 10% | 286 |
#000000 | 0, 0, 0 | 0° 0% 0% | 255 |
#F5F5F5 | 245, 245, 245 | 0° 0% 96% | 107 |
#E5E5E5 | 229, 229, 229 | 0° 0% 90% | 107 |
#D4D4D4 | 212, 212, 212 | 0° 0% 83% | 73 |
#262626 | 38, 38, 38 | 0° 0% 15% | 73 |
#262421 | 38, 36, 33 | 36° 7% 14% | 45 |
#D3D2CD | 211, 210, 205 | 50° 6% 82% | 45 |
#171717 | 23, 23, 23 | 0° 0% 9% | 44 |
#FAFAFA | 250, 250, 250 | 0° 0% 98% | 40 |
#A3A3A3 | 163, 163, 163 | 0° 0% 64% | 39 |
#1A1A1A | 26, 26, 26 | 0° 0% 10% | 37 |
#FDFDFB | 253, 253, 251 | 60° 33% 99% | 37 |
#E2E1DC | 226, 225, 220 | 50° 9% 87% | 36 |
#0F0F0F | 15, 15, 15 | 0° 0% 6% | 34 |
#27272A | 39, 39, 42 | 240° 4% 16% | 28 |
#767472 | 118, 116, 114 | 30° 2% 45% | 27 |
#18181B | 24, 24, 27 | 240° 6% 10% | 19 |
#F7F5F0 | 247, 245, 240 | 43° 30% 95% | 18 |
Assigned roles
Roles are taken from the page's own semantic CSS custom properties when present, otherwise inferred from usage frequency + luminance/saturation.
| Token | Hex | RGB | HSL |
--color-background | #F7F5F0 | 247, 245, 240 | 43° 30% 95% |
--color-primary | #F99C00 | 249, 156, 0 | 38° 100% 49% |
--color-accent | #FB2C36 | 251, 44, 54 | 357° 96% 58% |
--color-surface | #F5F5F5 | 245, 245, 245 | 0° 0% 96% |
--color-text-primary | #1C1916 | 28, 25, 22 | 30° 12% 10% |
--color-secondary | #1C1916 | 28, 25, 22 | 30° 12% 10% |
--color-text-secondary | #E5E5E5 | 229, 229, 229 | 0° 0% 90% |
--color-border | #D4D4D4 | 212, 212, 212 | 0° 0% 83% |
--color-on-primary | #1C1916 | 28, 25, 22 | 30° 12% 10% |
--color-on-secondary | #FFFFFF | 255, 255, 255 | 0° 0% 100% |
--color-on-accent | #FFFFFF | 255, 255, 255 | 0° 0% 100% |
Surface ramp (derived from detected light neutrals)
| Token | Hex |
--color-surface-container-lowest | #FFFFFF |
--color-surface-container-low | #FDFDFB |
--color-surface-container | #FCFBF9 |
--color-surface-container-high | #FAFAFA |
--color-surface-container-highest | #F7F5F0 |
Gradients
conic-gradient(#2a2a2a 0% 25%,#222 0% 50%)
conic-gradient(#e4e4e7 0 25%,#fafafa 0 50%)
linear-gradient(90deg,#000 92%,#0000)
linear-gradient(#fdfcf9,#fdfcf966)
linear-gradient(90deg,#0000,#e5e4df,#0000)
> 1 additional gradient definitions were framework utility templates (unresolvable var(--tw-gradient-stops)) and were omitted.
Typography
Primary typeface: var(--font-sans) — stack: var(--font-sans)
Font stacks (most used first)
var(--font-sans)
var(--font-mono)
ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif
var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji")
var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace)
Derived type scale
| Token | Size |
| headline-md | 24px |
| title-lg | 22.4px |
| body-lg | 18px |
| body-md | 16px |
| label-md | 14px |
| label-sm | 12px |
Font sizes (by frequency)
| Size | Count |
| 0.95rem | 4 |
| 24px | 3 |
| 15px | 3 |
| 12px | 3 |
| 14px | 2 |
| 0.82rem | 2 |
| 18px | 2 |
| 13px | 2 |
| 10px | 2 |
| 11.5px | 2 |
| 11px | 2 |
| 1.1rem | 1 |
| 1rem | 1 |
| 1.4rem | 1 |
| 1em | 1 |
| .72rem | 1 |
| 7px | 1 |
| 8px | 1 |
| 9px | 1 |
| 10.5px | 1 |
Weights in use: 500, 600, 700, 800, 900
Line heights (by frequency)
| Value | Count |
| 1.2 | 2 |
| 1.6 | 2 |
| 1.4 | 2 |
| 1.5 | 2 |
| 1 | 2 |
| 1.7 | 1 |
| 1.25 | 1 |
| 1.35 | 1 |
| 0 | 1 |
| 1.05 | 1 |
Letter spacing (by frequency)
| Value | Count |
| -.03em | 2 |
| -.02em | 2 |
| -.01em | 2 |
| 0.08em | 1 |
| 0 | 1 |
| -.04em | 1 |
| .1em | 1 |
| .12em | 1 |
Spacing
Derived spacing scale
| Token | Value |
| unit | 4px |
| xs | 6px |
| sm | 8px |
| md | 16px |
| lg | 40px |
| xl | 64px |
Raw values (by frequency)
| Value | Count |
| 16px | 2 |
| 6px | 2 |
| 40px | 1 |
| 64px | 1 |
| 10px | 1 |
| 12px | 1 |
| 20px | 1 |
| 8px | 1 |
| 24px | 1 |
| 1px | 1 |
Borders & Radius
Derived radius tokens
| Token | Value |
| sm | 4px |
| md | 8px |
| lg | 16px |
| pill | 50% |
Raw values (resolved, by frequency)
| Radius | Count |
0 | 3 |
50% | 2 |
8px | 2 |
12px | 2 |
10px | 2 |
999px | 1 |
16px | 1 |
.25rem | 1 |
Shadows
Derived elevation
| Token | Value |
| sm | 0 0 #6366f180 |
| md | 0 0 #6366f100 |
| lg | inset 0 1px #ffffffb3,0 1px 2px #1c19150d,0 12px 32px -16px #1c191529 |
All detected shadows
0 0 #6366f180
0 0 0 8px #6366f100
0 0 #6366f100
inset 0 1px #ffffffb3,0 1px 2px #1c19150d,0 12px 32px -16px #1c191529
inset 0 1px 2px #1c19150f
Layout
Container max-width: 780px
Grid columns (largest detected grid): 6
Breakpoints
- 480px
- 40rem
- 48rem
- 64rem
- 80rem
- 96rem
Animation & Motion
Easing curves
cubic-bezier(0,0,.2,1)
cubic-bezier(.4,0,.2,1)
cubic-bezier(.4,0,.6,1)
cubic-bezier(.4,0,.2,1)
var(--tw-ease,var(--default-transition-timing-function))
var(--ease-in-out)
var(--ease-out)
cubic-bezier(.8,0,1,1)
Keyframes
@keyframes ihp-spin { to { transform: rotate(360deg); } }
@keyframes previewPing { 0%{box-shadow:0 0 #6366f180}70%{box-shadow:0 0 0 8px #6366f100}to{box-shadow:0 0 #6366f100} }
@keyframes spin { to{transform:rotate(360deg)} }
@keyframes ping { 75%,to{opacity:0;transform:scale(2)} }
@keyframes pulse { 50%{opacity:.5} }
@keyframes bounce { 0%,to{animation-timing-function:cubic-bezier(.8,0,1,1);transform:translateY(-25%)}50%{animation-timing-function:cubic-bezier(0,0,.2,1);transform:none} }
Animations
ihp-spin 0.8s linear infinite
var(--animate-bounce)
var(--animate-ping)
var(--animate-pulse)
var(--animate-spin)
none
Source Design Tokens (CSS custom properties)
:root {
--color-red-50: #f5f5f5;
--color-red-100: #e5e5e5;
--color-red-200: #d4d4d4;
--color-red-300: #a3a3a3;
--color-red-400: #262626;
--color-red-500: #000000;
--color-red-600: #000000;
--color-red-700: #171717;
--color-red-800: #000000;
--color-red-900: #000000;
--color-red-950: #000000;
--color-orange-50: #f5f5f5;
--color-orange-100: #e5e5e5;
--color-orange-200: #d4d4d4;
--color-orange-300: #a3a3a3;
--color-orange-400: #262626;
--color-orange-500: #000000;
--color-orange-600: #000000;
--color-orange-700: #171717;
--color-orange-800: #000000;
--color-orange-900: #000000;
--color-orange-950: #000000;
--color-amber-50: #f5f5f5;
--color-amber-100: #e5e5e5;
--color-amber-200: #d4d4d4;
--color-amber-300: #a3a3a3;
--color-amber-400: #262626;
--color-amber-500: #000000;
--color-amber-600: #000000;
--color-amber-700: #171717;
--color-amber-800: #000000;
--color-amber-900: #000000;
--color-amber-950: #000000;
--color-yellow-50: #f5f5f5;
--color-yellow-100: #e5e5e5;
--color-yellow-200: #d4d4d4;
--color-yellow-300: #a3a3a3;
--color-yellow-400: #262626;
--color-yellow-500: #000000;
--color-yellow-600: #000000;
--color-yellow-700: #171717;
--color-yellow-800: #000000;
--color-yellow-900: #000000;
--color-yellow-950: #000000;
--color-lime-50: #f5f5f5;
--color-lime-100: #e5e5e5;
--color-lime-200: #d4d4d4;
--color-lime-300: #a3a3a3;
--color-lime-400: #262626;
--color-lime-500: #000000;
--color-lime-600: #000000;
--color-lime-700: #171717;
--color-lime-800: #000000;
--color-lime-900: #000000;
--color-lime-950: #000000;
--color-green-50: #f5f5f5;
--color-green-100: #e5e5e5;
--color-green-200: #d4d4d4;
--color-green-300: #a3a3a3;
--color-green-400: #262626;
}
Do's and Don'ts
Do
- Do reserve the accent
#FB2C36 for interactive highlights and key moments — it is used sparingly on the source page.
- Do keep the canvas at
#F7F5F0; surfaces should stay within the detected neutral ramp.
- Do stick to the detected font weight(s): 500, 600, 700, 800, 900.
- Do align spacing to the 4px base unit derived from the page.
Don't
- Don't introduce colors outside the detected palette — every hue above was found in the source.
Design Tokens (copy-paste)
:root {
--color-background: #F7F5F0;
--color-primary: #F99C00;
--color-accent: #FB2C36;
--color-surface: #F5F5F5;
--color-text-primary: #1C1916;
--color-secondary: #1C1916;
--color-text-secondary: #E5E5E5;
--color-border: #D4D4D4;
--color-on-primary: #1C1916;
--color-on-secondary: #FFFFFF;
--color-on-accent: #FFFFFF;
--color-surface-container-lowest: #FFFFFF;
--color-surface-container-low: #FDFDFB;
--color-surface-container: #FCFBF9;
--color-surface-container-high: #FAFAFA;
--color-surface-container-highest: #F7F5F0;
--font-sans: var(--font-sans);
--font-size-headline-md: 24px;
--font-size-title-lg: 22.4px;
--font-size-body-lg: 18px;
--font-size-body-md: 16px;
--font-size-label-md: 14px;
--font-size-label-sm: 12px;
--radius-sm: 4px;
--radius-md: 8px;
--radius-lg: 16px;
--radius-pill: 50%;
--shadow-sm: 0 0 #6366f180;
--shadow-md: 0 0 #6366f100;
--shadow-lg: inset 0 1px #ffffffb3,0 1px 2px #1c19150d,0 12px 32px -16px #1c191529;
--space-xs: 6px;
--space-sm: 8px;
--space-md: 16px;
--space-lg: 40px;
--space-xl: 64px;
--tracking-display: -.03em;
--tracking-label: 0.08em;
--container-max: 780px;
}