Dark Fantasy is a brooding, mythical aesthetic that fuses medieval sword-and-sorcery imagery with gothic horror sensibilities. Its roots stretch back to 18th-century Gothic literature and Romantic-era painting, but it surged into mainstream visual culture through video games like Dark Souls, Elden Ring, and The Witcher, as well as film and television adaptations such as Game of Thrones and Pan’s Labyrinth. Visually, the aesthetic is defined by permanently foreboding atmospheres: mist-shrouded landscapes, crumbling stone fortresses, enchanted forests choked with shadow, and the faint glow of runes or torchlight piercing the darkness. In web and UI design, Dark Fantasy translates to deeply saturated dark backgrounds, ornate metallic accents in gold and silver, weathered textures reminiscent of parchment, stone, and hammered iron, and typography drawn from medieval manuscripts and Roman inscriptions. The goal is to immerse the viewer in a world where danger lurks in every shadow, magic carries a terrible price, and beauty is always intertwined with decay.
| Swatch | Hex | Role / Usage |
|---|---|---|
| Void Black | #0A0A0F |
Primary background, deepest layer |
| Dungeon Stone | #1A1A24 |
Card backgrounds, elevated surfaces |
| Fortress Grey | #2A2A38 |
Secondary surfaces, input fields |
| Smoke | #4A4A5A |
Muted text, disabled states, borders |
| Ash | #8A8A9A |
Secondary body text, captions |
| Bone White | #D4D0C8 |
Primary body text |
| Parchment Light | #E8E2D6 |
High-emphasis text, headings |
| Antique Gold | #C8A84E |
Primary accent, headings, key interactive elements |
| Molten Gold | #E8C84E |
Hover states, highlighted accents, glow effects |
| Dragon Crimson | #8B1A1A |
Danger, emphasis, call-to-action backgrounds |
| Blood Red | #C43030 |
Active states, important alerts, decorative accents |
| Abyssal Purple | #2E1A3E |
Atmospheric tints, magical glow undertones |
| Mystic Violet | #6B3FA0 |
Tertiary accent, arcane decorative elements |
| Enchanted Emerald | #1A4A2E |
Success states, nature-related accents |
| Tarnished Silver | #7A7A88 |
Metallic borders, secondary decorative elements |
:root {
--df-void: #0A0A0F;
--df-stone: #1A1A24;
--df-fortress: #2A2A38;
--df-smoke: #4A4A5A;
--df-ash: #8A8A9A;
--df-bone: #D4D0C8;
--df-parchment: #E8E2D6;
--df-gold: #C8A84E;
--df-gold-bright: #E8C84E;
--df-crimson: #8B1A1A;
--df-blood: #C43030;
--df-purple: #2E1A3E;
--df-violet: #6B3FA0;
--df-emerald: #1A4A2E;
--df-silver: #7A7A88;
/* Semantic tokens */
--df-bg-primary: var(--df-void);
--df-bg-surface: var(--df-stone);
--df-bg-elevated: var(--df-fortress);
--df-text-primary: var(--df-bone);
--df-text-heading: var(--df-parchment);
--df-text-muted: var(--df-ash);
--df-accent-primary: var(--df-gold);
--df-accent-danger: var(--df-crimson);
--df-border: rgba(200, 168, 78, 0.15);
}
| Font | Weight(s) | Usage | Link |
|---|---|---|---|
| MedievalSharp | 400 | Display titles; spiky, engraved forms evoking swords and sorcery | MedievalSharp |
| Cinzel Decorative | 400, 700, 900 | Hero titles; grand Roman-inscribed capitals with ornate flourishes | Cinzel Decorative |
| Cinzel | 400, 500, 600, 700 | Section headings and nav links; stately Roman inscription letterforms | Cinzel |
| Uncial Antiqua | 400 | Decorative accents and labels; monastic uncial script evoking ancient manuscripts | Uncial Antiqua |
| Cormorant | 300, 400, 500, 600, 700 | Subheadings and pull quotes; elegant, high-contrast serif with a literary quality | Cormorant |
| EB Garamond | 400, 500, 600, 700 | Body text; classical old-style Garamond for extended reading | EB Garamond |
| Spectral | 300, 400, 500, 600, 700 | Long-form body text; designed for screen legibility in serif contexts | Spectral |
| Playfair Display | 400, 500, 600, 700, 900 | Alternate headings; high-contrast transitional serif with dramatic weight | Playfair Display |
| Heading | Body | Vibe |
|---|---|---|
| Cinzel Decorative 700 | EB Garamond 400 | Regal inscription titles over classical literary prose; formal and commanding |
| MedievalSharp 400 | Spectral 400 | Raw sword-and-sorcery headers with clean, readable body text; adventurous and grounded |
| Cinzel 600 | Cormorant 400 | Stately Roman capitals paired with elegant serif body; refined dark court atmosphere |
| Playfair Display 700 | EB Garamond 400 | Dramatic editorial headings with old-style body; sophisticated and brooding |
| Uncial Antiqua 400 | Spectral 400 | Ancient manuscript accent titles with modern-readable body; mystical and accessible |
@import url('https://fonts.googleapis.com/css2?family=Cinzel+Decorative:wght@400;700;900&family=Cinzel:wght@400;600;700&family=EB+Garamond:wght@400;500;600&family=MedievalSharp&family=Cormorant:wght@400;500;600&display=swap');
body {
font-family: 'EB Garamond', 'Georgia', serif;
font-size: 1.1rem;
line-height: 1.8;
color: var(--df-bone);
-webkit-font-smoothing: antialiased;
}
h1, h2, h3 {
font-family: 'Cinzel', 'Times New Roman', serif;
font-weight: 600;
letter-spacing: 0.04em;
color: var(--df-parchment);
}
.display-title {
font-family: 'Cinzel Decorative', serif;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.08em;
color: var(--df-gold);
text-shadow: 0 0 40px rgba(200, 168, 78, 0.2);
}
.rune-label {
font-family: 'MedievalSharp', cursive;
font-size: 0.9rem;
letter-spacing: 0.15em;
text-transform: uppercase;
color: var(--df-gold);
}
.quote-text {
font-family: 'Cormorant', serif;
font-weight: 500;
font-size: 1.3rem;
font-style: italic;
color: var(--df-ash);
line-height: 1.7;
}
.df-card {
background: var(--df-stone);
border: 1px solid rgba(200, 168, 78, 0.15);
border-radius: 2px;
padding: 32px;
position: relative;
box-shadow:
0 4px 24px rgba(0, 0, 0, 0.6),
inset 0 1px 0 rgba(200, 168, 78, 0.08);
transition: border-color 0.4s ease, box-shadow 0.4s ease;
}
.df-card:hover {
border-color: rgba(200, 168, 78, 0.3);
box-shadow:
0 8px 32px rgba(0, 0, 0, 0.7),
0 0 60px rgba(200, 168, 78, 0.05),
inset 0 1px 0 rgba(200, 168, 78, 0.12);
}
/* Inner decorative frame */
.df-card::before {
content: '';
position: absolute;
top: 6px;
left: 6px;
right: 6px;
bottom: 6px;
border: 1px solid rgba(200, 168, 78, 0.08);
pointer-events: none;
}
/* Corner ornament accents */
.df-card::after {
content: '';
position: absolute;
top: 3px;
left: 3px;
width: 16px;
height: 16px;
border-top: 2px solid rgba(200, 168, 78, 0.3);
border-left: 2px solid rgba(200, 168, 78, 0.3);
pointer-events: none;
}
.df-button {
display: inline-block;
background: linear-gradient(180deg, rgba(200, 168, 78, 0.12) 0%, rgba(200, 168, 78, 0.04) 100%);
color: var(--df-gold);
border: 1px solid rgba(200, 168, 78, 0.4);
border-radius: 2px;
padding: 14px 36px;
font-family: 'Cinzel', serif;
font-size: 0.8rem;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.14em;
text-decoration: none;
cursor: pointer;
position: relative;
overflow: hidden;
transition: all 0.4s ease;
}
.df-button:hover {
background: linear-gradient(180deg, var(--df-gold) 0%, #A8883E 100%);
color: var(--df-void);
border-color: var(--df-gold);
box-shadow:
0 0 24px rgba(200, 168, 78, 0.3),
0 0 60px rgba(200, 168, 78, 0.1);
text-shadow: none;
}
/* Metallic sheen sweep on hover */
.df-button::after {
content: '';
position: absolute;
top: -50%;
left: -60%;
width: 40%;
height: 200%;
background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.12), transparent);
transform: skewX(-20deg);
transition: left 0.6s ease;
}
.df-button:hover::after {
left: 120%;
}
/* Crimson danger variant */
.df-button--danger {
border-color: rgba(196, 48, 48, 0.5);
color: var(--df-blood);
background: linear-gradient(180deg, rgba(139, 26, 26, 0.15) 0%, rgba(139, 26, 26, 0.05) 100%);
}
.df-button--danger:hover {
background: linear-gradient(180deg, var(--df-blood) 0%, var(--df-crimson) 100%);
color: var(--df-parchment);
border-color: var(--df-blood);
box-shadow: 0 0 24px rgba(196, 48, 48, 0.3);
}
.df-nav {
background: rgba(10, 10, 15, 0.95);
backdrop-filter: blur(12px);
border-bottom: 1px solid rgba(200, 168, 78, 0.12);
padding: 0 40px;
display: flex;
align-items: center;
justify-content: space-between;
height: 64px;
position: sticky;
top: 0;
z-index: 100;
}
.df-nav__brand {
font-family: 'Cinzel Decorative', serif;
font-size: 1.1rem;
font-weight: 700;
color: var(--df-gold);
text-decoration: none;
letter-spacing: 0.06em;
}
.df-nav__links {
display: flex;
gap: 8px;
list-style: none;
margin: 0;
padding: 0;
}
.df-nav__links a {
font-family: 'Cinzel', serif;
font-size: 0.75rem;
color: var(--df-ash);
text-decoration: none;
text-transform: uppercase;
letter-spacing: 0.1em;
padding: 8px 16px;
border-radius: 2px;
transition: color 0.3s ease, background 0.3s ease;
}
.df-nav__links a:hover,
.df-nav__links a.active {
color: var(--df-gold);
background: rgba(200, 168, 78, 0.08);
}
/* Decorative separator between nav items */
.df-nav__links li + li::before {
content: '\2022';
color: rgba(200, 168, 78, 0.2);
margin-right: 8px;
font-size: 0.5rem;
vertical-align: middle;
}
.df-hero {
min-height: 100vh;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
text-align: center;
padding: 120px 40px 80px;
position: relative;
overflow: hidden;
background: var(--df-void);
}
/* Atmospheric fog layer */
.df-hero::before {
content: '';
position: absolute;
inset: 0;
background:
radial-gradient(ellipse at 50% 80%, rgba(46, 26, 62, 0.2) 0%, transparent 60%),
radial-gradient(ellipse at 20% 20%, rgba(139, 26, 26, 0.06) 0%, transparent 40%),
radial-gradient(ellipse at 80% 30%, rgba(200, 168, 78, 0.04) 0%, transparent 40%);
pointer-events: none;
}
/* Bottom fade to content */
.df-hero::after {
content: '';
position: absolute;
bottom: 0;
left: 0;
right: 0;
height: 200px;
background: linear-gradient(to top, var(--df-void) 0%, transparent 100%);
pointer-events: none;
}
.df-hero__label {
font-family: 'MedievalSharp', cursive;
font-size: 0.85rem;
text-transform: uppercase;
letter-spacing: 0.25em;
color: var(--df-gold);
margin-bottom: 24px;
position: relative;
z-index: 1;
}
.df-hero__title {
font-family: 'Cinzel Decorative', serif;
font-size: clamp(2.4rem, 6vw, 4.5rem);
font-weight: 700;
color: var(--df-parchment);
text-shadow: 0 0 80px rgba(200, 168, 78, 0.15);
margin-bottom: 24px;
position: relative;
z-index: 1;
max-width: 800px;
}
.df-hero__subtitle {
font-family: 'Cormorant', serif;
font-size: 1.25rem;
font-style: italic;
color: var(--df-ash);
max-width: 560px;
line-height: 1.8;
margin-bottom: 40px;
position: relative;
z-index: 1;
}
.df-rune-border {
position: relative;
padding: 40px;
border: 1px solid rgba(200, 168, 78, 0.2);
}
/* Rune symbols along the top edge */
.df-rune-border::before {
content: '\16A0 \00a0 \16A2 \00a0 \16A6 \00a0 \16B1 \00a0 \16B7 \00a0 \16C1 \00a0 \16C7 \00a0 \16D2';
position: absolute;
top: -10px;
left: 50%;
transform: translateX(-50%);
background: var(--df-void);
padding: 0 20px;
font-size: 0.85rem;
letter-spacing: 0.3em;
color: rgba(200, 168, 78, 0.4);
}
/* Corner embellishments */
.df-rune-border::after {
content: '';
position: absolute;
inset: 4px;
border: 1px solid rgba(200, 168, 78, 0.06);
pointer-events: none;
}
/* Apply to all four corners with extra elements if needed */
.df-rune-border .corner-tl,
.df-rune-border .corner-tr,
.df-rune-border .corner-bl,
.df-rune-border .corner-br {
position: absolute;
width: 20px;
height: 20px;
border-color: rgba(200, 168, 78, 0.35);
border-style: solid;
border-width: 0;
}
.df-rune-border .corner-tl { top: 2px; left: 2px; border-top-width: 2px; border-left-width: 2px; }
.df-rune-border .corner-tr { top: 2px; right: 2px; border-top-width: 2px; border-right-width: 2px; }
.df-rune-border .corner-bl { bottom: 2px; left: 2px; border-bottom-width: 2px; border-left-width: 2px; }
.df-rune-border .corner-br { bottom: 2px; right: 2px; border-bottom-width: 2px; border-right-width: 2px; }
.df-parchment {
background:
linear-gradient(135deg, rgba(200, 168, 78, 0.03) 0%, transparent 50%),
linear-gradient(225deg, rgba(139, 26, 26, 0.02) 0%, transparent 50%),
var(--df-stone);
border: 1px solid rgba(200, 168, 78, 0.12);
border-radius: 2px;
padding: 40px;
position: relative;
overflow: hidden;
}
/* Subtle noise texture overlay */
.df-parchment::before {
content: '';
position: absolute;
inset: 0;
background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noise'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noise)' opacity='0.03'/%3E%3C/svg%3E");
background-size: 200px 200px;
opacity: 0.5;
pointer-events: none;
}
/* Burnt-edge vignette */
.df-parchment::after {
content: '';
position: absolute;
inset: 0;
box-shadow: inset 0 0 60px rgba(0, 0, 0, 0.4);
pointer-events: none;
}
.df-parchment__text {
position: relative;
z-index: 1;
font-family: 'EB Garamond', serif;
color: var(--df-bone);
line-height: 1.9;
}
.df-divider {
display: flex;
align-items: center;
justify-content: center;
margin: 56px 0;
gap: 16px;
}
.df-divider::before,
.df-divider::after {
content: '';
flex: 1;
max-width: 200px;
height: 1px;
background: linear-gradient(90deg, transparent, rgba(200, 168, 78, 0.35), transparent);
}
.df-divider__symbol {
color: var(--df-gold);
font-size: 1.4rem;
line-height: 1;
opacity: 0.7;
}
/* Variant: Sword divider using CSS shapes */
.df-divider--sword::before,
.df-divider--sword::after {
max-width: 160px;
}
.df-divider--sword .df-divider__symbol {
display: inline-block;
width: 24px;
height: 2px;
background: var(--df-gold);
position: relative;
opacity: 0.5;
}
.df-divider--sword .df-divider__symbol::before {
content: '';
position: absolute;
top: -3px;
left: 50%;
transform: translateX(-50%);
width: 8px;
height: 8px;
border: 1px solid var(--df-gold);
transform: translateX(-50%) rotate(45deg);
}
.df-ember-text {
font-family: 'Cinzel Decorative', serif;
font-weight: 700;
font-size: 3rem;
color: var(--df-gold);
text-shadow:
0 0 10px rgba(200, 168, 78, 0.4),
0 0 40px rgba(200, 168, 78, 0.15),
0 0 80px rgba(139, 26, 26, 0.1);
animation: ember-flicker 4s ease-in-out infinite alternate;
}
@keyframes ember-flicker {
0% {
text-shadow:
0 0 10px rgba(200, 168, 78, 0.4),
0 0 40px rgba(200, 168, 78, 0.15),
0 0 80px rgba(139, 26, 26, 0.1);
}
50% {
text-shadow:
0 0 14px rgba(200, 168, 78, 0.5),
0 0 50px rgba(200, 168, 78, 0.2),
0 0 100px rgba(139, 26, 26, 0.15);
}
100% {
text-shadow:
0 0 8px rgba(200, 168, 78, 0.35),
0 0 35px rgba(200, 168, 78, 0.12),
0 0 70px rgba(139, 26, 26, 0.08);
}
}
.df-tooltip {
position: relative;
display: inline-block;
border-bottom: 1px dotted rgba(200, 168, 78, 0.3);
cursor: help;
}
.df-tooltip__content {
visibility: hidden;
opacity: 0;
position: absolute;
bottom: calc(100% + 12px);
left: 50%;
transform: translateX(-50%) translateY(4px);
background: var(--df-fortress);
border: 1px solid rgba(200, 168, 78, 0.25);
border-radius: 2px;
padding: 16px 20px;
min-width: 240px;
max-width: 320px;
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.6);
transition: all 0.3s ease;
z-index: 50;
}
.df-tooltip__content::after {
content: '';
position: absolute;
top: 100%;
left: 50%;
transform: translateX(-50%);
border: 6px solid transparent;
border-top-color: rgba(200, 168, 78, 0.25);
}
.df-tooltip:hover .df-tooltip__content {
visibility: visible;
opacity: 1;
transform: translateX(-50%) translateY(0);
}
.df-tooltip__content h4 {
font-family: 'Cinzel', serif;
font-size: 0.8rem;
color: var(--df-gold);
text-transform: uppercase;
letter-spacing: 0.08em;
margin-bottom: 8px;
}
.df-tooltip__content p {
font-family: 'EB Garamond', serif;
font-size: 0.9rem;
color: var(--df-ash);
line-height: 1.6;
}
#FFFFFF) text; prefer warm off-whites and bone tones for a candlelit feel| Aesthetic | Relationship |
|---|---|
| Dark Academia | Shares the dark palette, classical typography, and love of aged textures, but Dark Academia is scholarly and earthly while Dark Fantasy is mythical and supernatural |
| Gothic | Close sibling; both draw from medieval architecture and somber moods, but Gothic leans toward horror and religious iconography while Dark Fantasy emphasizes sword-and-sorcery and magic |
| Medievalcore | Overlapping interest in medieval imagery, armor, and castles, but Medievalcore is more historically grounded while Dark Fantasy embraces the supernatural |
| Cyberpunk | Both use dark backgrounds with vivid accents, but Cyberpunk is neon-lit and technological while Dark Fantasy is fire-lit and arcane |
| Baroque | Shared love of ornate detail and dramatic contrast, but Baroque is opulent and gilded while Dark Fantasy is weathered and foreboding |
| Industrial Gothic | Both feature dark, heavy aesthetics with metal textures, but Industrial Gothic is mechanical and urban while Dark Fantasy is organic and ancient |
| Goblincore | Overlapping interest in forest settings, moss, and earthy materials, but Goblincore is whimsical and cozy while Dark Fantasy is threatening and grand |
| Whimsigothic | Both blend gothic and fantastical elements, but Whimsigothic is playful and eclectic while Dark Fantasy is serious and immersive |
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Dark Fantasy Layout</title>
<link href="https://fonts.googleapis.com/css2?family=Cinzel+Decorative:wght@400;700;900&family=Cinzel:wght@400;600;700&family=EB+Garamond:wght@400;500;600&family=MedievalSharp&family=Cormorant:ital,wght@0,400;0,600;1,400&display=swap" rel="stylesheet">
<style>
*, *::before, *::after { margin: 0; padding: 0; box-sizing: border-box; }
:root {
--df-void: #0A0A0F;
--df-stone: #1A1A24;
--df-fortress: #2A2A38;
--df-smoke: #4A4A5A;
--df-ash: #8A8A9A;
--df-bone: #D4D0C8;
--df-parchment: #E8E2D6;
--df-gold: #C8A84E;
--df-gold-bright: #E8C84E;
--df-crimson: #8B1A1A;
--df-blood: #C43030;
--df-purple: #2E1A3E;
--df-violet: #6B3FA0;
--df-silver: #7A7A88;
}
body {
font-family: 'EB Garamond', Georgia, serif;
font-size: 1.1rem;
line-height: 1.8;
color: var(--df-bone);
background: var(--df-void);
min-height: 100vh;
-webkit-font-smoothing: antialiased;
}
/* ---- Navigation ---- */
nav {
background: rgba(10, 10, 15, 0.95);
backdrop-filter: blur(12px);
border-bottom: 1px solid rgba(200, 168, 78, 0.12);
padding: 0 40px;
display: flex;
align-items: center;
justify-content: space-between;
height: 60px;
position: sticky;
top: 0;
z-index: 100;
}
nav .brand {
font-family: 'Cinzel Decorative', serif;
font-size: 1rem;
font-weight: 700;
color: var(--df-gold);
text-decoration: none;
letter-spacing: 0.06em;
}
nav .links {
display: flex;
gap: 4px;
list-style: none;
}
nav .links a {
font-family: 'Cinzel', serif;
font-size: 0.7rem;
color: var(--df-ash);
text-decoration: none;
text-transform: uppercase;
letter-spacing: 0.1em;
padding: 8px 14px;
border-radius: 2px;
transition: color 0.3s, background 0.3s;
}
nav .links a:hover { color: var(--df-gold); background: rgba(200,168,78,0.08); }
/* ---- Hero ---- */
.hero {
min-height: 100vh;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
text-align: center;
padding: 120px 24px 100px;
position: relative;
overflow: hidden;
}
.hero::before {
content: '';
position: absolute;
inset: 0;
background:
radial-gradient(ellipse at 50% 85%, rgba(46, 26, 62, 0.25) 0%, transparent 55%),
radial-gradient(ellipse at 20% 20%, rgba(139, 26, 26, 0.07) 0%, transparent 40%),
radial-gradient(ellipse at 80% 30%, rgba(200, 168, 78, 0.05) 0%, transparent 40%);
pointer-events: none;
}
.hero::after {
content: '';
position: absolute;
bottom: 0;
left: 0;
right: 0;
height: 200px;
background: linear-gradient(to top, var(--df-void), transparent);
pointer-events: none;
}
.hero .label {
font-family: 'MedievalSharp', cursive;
font-size: 0.85rem;
text-transform: uppercase;
letter-spacing: 0.25em;
color: var(--df-gold);
margin-bottom: 20px;
position: relative;
z-index: 1;
}
.hero h1 {
font-family: 'Cinzel Decorative', serif;
font-size: clamp(2.2rem, 5.5vw, 4rem);
font-weight: 700;
color: var(--df-parchment);
text-shadow: 0 0 80px rgba(200, 168, 78, 0.15);
margin-bottom: 20px;
position: relative;
z-index: 1;
max-width: 750px;
}
.hero .tagline {
font-family: 'Cormorant', serif;
font-size: 1.2rem;
font-style: italic;
color: var(--df-ash);
max-width: 500px;
line-height: 1.7;
margin-bottom: 36px;
position: relative;
z-index: 1;
}
/* ---- Buttons ---- */
.btn {
display: inline-block;
background: linear-gradient(180deg, rgba(200,168,78,0.12), rgba(200,168,78,0.04));
color: var(--df-gold);
border: 1px solid rgba(200, 168, 78, 0.4);
border-radius: 2px;
padding: 14px 36px;
font-family: 'Cinzel', serif;
font-size: 0.78rem;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.14em;
text-decoration: none;
cursor: pointer;
position: relative;
z-index: 1;
overflow: hidden;
transition: all 0.4s ease;
}
.btn:hover {
background: linear-gradient(180deg, var(--df-gold), #A8883E);
color: var(--df-void);
border-color: var(--df-gold);
box-shadow: 0 0 24px rgba(200,168,78,0.3), 0 0 60px rgba(200,168,78,0.1);
}
.btn--crimson {
border-color: rgba(196, 48, 48, 0.5);
color: var(--df-blood);
background: linear-gradient(180deg, rgba(139,26,26,0.15), rgba(139,26,26,0.05));
}
.btn--crimson:hover {
background: linear-gradient(180deg, var(--df-blood), var(--df-crimson));
color: var(--df-parchment);
border-color: var(--df-blood);
box-shadow: 0 0 24px rgba(196,48,48,0.3);
}
/* ---- Divider ---- */
.divider {
display: flex;
align-items: center;
justify-content: center;
margin: 56px auto;
max-width: 500px;
gap: 16px;
}
.divider::before, .divider::after {
content: '';
flex: 1;
height: 1px;
background: linear-gradient(90deg, transparent, rgba(200,168,78,0.3), transparent);
}
.divider span {
color: var(--df-gold);
font-size: 1.3rem;
opacity: 0.7;
line-height: 1;
}
/* ---- Content Container ---- */
.container {
max-width: 820px;
margin: 0 auto;
padding: 0 24px 80px;
}
/* ---- Section Title ---- */
.section-title {
font-family: 'Cinzel', serif;
font-size: 0.75rem;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.2em;
color: var(--df-gold);
margin-bottom: 32px;
text-align: center;
}
/* ---- Cards Grid ---- */
.cards {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 24px;
margin-bottom: 48px;
}
.card {
background: var(--df-stone);
border: 1px solid rgba(200, 168, 78, 0.15);
border-radius: 2px;
padding: 32px;
position: relative;
box-shadow: 0 4px 24px rgba(0,0,0,0.5), inset 0 1px 0 rgba(200,168,78,0.08);
transition: border-color 0.4s, box-shadow 0.4s;
}
.card:hover {
border-color: rgba(200,168,78,0.3);
box-shadow: 0 8px 32px rgba(0,0,0,0.6), 0 0 60px rgba(200,168,78,0.04);
}
.card::before {
content: '';
position: absolute;
top: 6px; left: 6px; right: 6px; bottom: 6px;
border: 1px solid rgba(200,168,78,0.06);
pointer-events: none;
}
.card h3 {
font-family: 'Cinzel', serif;
font-size: 1.15rem;
font-weight: 600;
color: var(--df-parchment);
margin-bottom: 12px;
}
.card .card-label {
font-family: 'MedievalSharp', cursive;
font-size: 0.7rem;
text-transform: uppercase;
letter-spacing: 0.18em;
color: var(--df-gold);
opacity: 0.7;
margin-bottom: 8px;
}
.card p {
color: var(--df-ash);
font-size: 1rem;
line-height: 1.75;
}
/* ---- Rune Border Section ---- */
.rune-section {
position: relative;
border: 1px solid rgba(200, 168, 78, 0.18);
padding: 48px 36px;
margin-bottom: 48px;
}
.rune-section::before {
content: '\16A0 \00a0 \16A2 \00a0 \16A6 \00a0 \16B1 \00a0 \16B7 \00a0 \16C1';
position: absolute;
top: -10px;
left: 50%;
transform: translateX(-50%);
background: var(--df-void);
padding: 0 16px;
font-size: 0.8rem;
letter-spacing: 0.3em;
color: rgba(200, 168, 78, 0.35);
}
.rune-section .corner {
position: absolute;
width: 18px;
height: 18px;
}
.rune-section .corner--tl { top: 2px; left: 2px; border-top: 2px solid rgba(200,168,78,0.35); border-left: 2px solid rgba(200,168,78,0.35); }
.rune-section .corner--tr { top: 2px; right: 2px; border-top: 2px solid rgba(200,168,78,0.35); border-right: 2px solid rgba(200,168,78,0.35); }
.rune-section .corner--bl { bottom: 2px; left: 2px; border-bottom: 2px solid rgba(200,168,78,0.35); border-left: 2px solid rgba(200,168,78,0.35); }
.rune-section .corner--br { bottom: 2px; right: 2px; border-bottom: 2px solid rgba(200,168,78,0.35); border-right: 2px solid rgba(200,168,78,0.35); }
.rune-section h2 {
font-family: 'Cinzel Decorative', serif;
font-size: 1.6rem;
font-weight: 700;
color: var(--df-parchment);
text-align: center;
margin-bottom: 16px;
}
.rune-section p {
text-align: center;
max-width: 560px;
margin: 0 auto;
color: var(--df-ash);
line-height: 1.85;
}
/* ---- Parchment Panel ---- */
.parchment {
background:
linear-gradient(135deg, rgba(200,168,78,0.03), transparent 50%),
linear-gradient(225deg, rgba(139,26,26,0.02), transparent 50%),
var(--df-stone);
border: 1px solid rgba(200, 168, 78, 0.12);
border-radius: 2px;
padding: 40px;
position: relative;
overflow: hidden;
margin-bottom: 48px;
}
.parchment::after {
content: '';
position: absolute;
inset: 0;
box-shadow: inset 0 0 60px rgba(0,0,0,0.35);
pointer-events: none;
}
.parchment blockquote {
font-family: 'Cormorant', serif;
font-size: 1.25rem;
font-style: italic;
color: var(--df-bone);
line-height: 1.8;
text-align: center;
position: relative;
z-index: 1;
}
.parchment .attribution {
font-family: 'Cinzel', serif;
font-size: 0.7rem;
text-transform: uppercase;
letter-spacing: 0.15em;
color: var(--df-smoke);
text-align: center;
margin-top: 16px;
position: relative;
z-index: 1;
}
/* ---- Ember Glow Title ---- */
.ember-glow {
font-family: 'Cinzel Decorative', serif;
font-weight: 700;
color: var(--df-gold);
text-align: center;
text-shadow:
0 0 10px rgba(200,168,78,0.4),
0 0 40px rgba(200,168,78,0.15),
0 0 80px rgba(139,26,26,0.1);
animation: ember 4s ease-in-out infinite alternate;
}
@keyframes ember {
0% { text-shadow: 0 0 10px rgba(200,168,78,0.4), 0 0 40px rgba(200,168,78,0.15), 0 0 80px rgba(139,26,26,0.1); }
50% { text-shadow: 0 0 14px rgba(200,168,78,0.5), 0 0 50px rgba(200,168,78,0.2), 0 0 100px rgba(139,26,26,0.15); }
100% { text-shadow: 0 0 8px rgba(200,168,78,0.35), 0 0 35px rgba(200,168,78,0.12), 0 0 70px rgba(139,26,26,0.08); }
}
/* ---- Footer ---- */
footer {
border-top: 1px solid rgba(200, 168, 78, 0.1);
padding: 40px 24px;
text-align: center;
}
footer p {
font-family: 'Cinzel', serif;
font-size: 0.7rem;
text-transform: uppercase;
letter-spacing: 0.15em;
color: var(--df-smoke);
}
/* ---- Responsive ---- */
@media (max-width: 640px) {
nav { padding: 0 16px; }
nav .links { gap: 0; }
nav .links a { padding: 8px 8px; font-size: 0.65rem; }
.hero { padding: 80px 16px 60px; }
.hero h1 { font-size: 2rem; }
.cards { grid-template-columns: 1fr; }
.rune-section { padding: 32px 20px; }
.rune-section::before { font-size: 0.65rem; }
.parchment { padding: 28px 20px; }
}
</style>
</head>
<body>
<!-- Navigation -->
<nav>
<a href="#" class="brand">Shadowkeep</a>
<ul class="links">
<li><a href="#">Realms</a></li>
<li><a href="#">Bestiary</a></li>
<li><a href="#">Grimoire</a></li>
<li><a href="#">Chronicles</a></li>
</ul>
</nav>
<!-- Hero Section -->
<section class="hero">
<p class="label">From the Ashen Throne</p>
<h1>Where Darkness Reigns and Legends Are Forged</h1>
<p class="tagline">Beyond the mist-shrouded mountains, ancient evils stir in crumbling keeps,
and only those who dare the abyss may claim the crown of fire.</p>
<div style="display: flex; gap: 16px; flex-wrap: wrap; justify-content: center;">
<a href="#" class="btn">Begin the Quest</a>
<a href="#" class="btn btn--crimson">Enter the Abyss</a>
</div>
</section>
<!-- Divider -->
<div class="divider"><span>✶</span></div>
<!-- Content -->
<div class="container">
<p class="section-title">Tales from the Ruined Kingdoms</p>
<!-- Card Grid -->
<div class="cards">
<div class="card">
<p class="card-label">Chapter I</p>
<h3>The Hollow Knight</h3>
<p>In the depths of the Undercrypt, a knight clad in corroded armor stands vigil over a throne no king has claimed in a thousand years. His sword hums with a forgotten enchantment.</p>
</div>
<div class="card">
<p class="card-label">Chapter II</p>
<h3>The Witch of Thornveil</h3>
<p>Deep in the Thornveil Forest, where the canopy swallows all light, an ancient sorceress weaves spells from moonlight and memory. Her price is always more than coin.</p>
</div>
<div class="card">
<p class="card-label">Chapter III</p>
<h3>The Dragon's Tithe</h3>
<p>Each harvest moon, the village of Ashenmere sends tribute to the peak of Mount Dreadfire. What dwells there has not been seen in living memory, only felt in tremors and flame.</p>
</div>
<div class="card">
<p class="card-label">Chapter IV</p>
<h3>The Shattered Covenant</h3>
<p>Once, five orders stood united against the encroaching void. Now their towers lie broken, their banners torn, and the seals they forged grow weaker with each passing eclipse.</p>
</div>
</div>
<!-- Divider -->
<div class="divider"><span>⚔</span></div>
<!-- Rune Border Section -->
<div class="rune-section">
<span class="corner corner--tl"></span>
<span class="corner corner--tr"></span>
<span class="corner corner--bl"></span>
<span class="corner corner--br"></span>
<h2>The Grimoire</h2>
<p>Herein lie the collected incantations, sigils, and forbidden knowledge gathered by the Order of the Obsidian Quill across ten centuries of arcane study. Read at your own peril.</p>
</div>
<!-- Parchment Quote -->
<div class="parchment">
<blockquote>
"The flame does not ask permission to consume. It simply burns, and in its wake, leaves only ash and the terrible clarity of what remains."
</blockquote>
<p class="attribution">Inscription on the Wall of the First Pyre</p>
</div>
<!-- Ember Glow Title -->
<p class="ember-glow" style="font-size: 2rem; margin-bottom: 48px;">Finis Coronat Opus</p>
<!-- Final CTA -->
<div style="text-align: center;">
<a href="#" class="btn">Claim Your Destiny</a>
</div>
</div>
<!-- Footer -->
<footer>
<p>Forged in shadow • Anno Tenebris MMXXVI</p>
</footer>
</body>
</html>