Cobb: 'more gothic somehow.' Pushed in concrete elements: - Drop cap on h1 page titles (first letter 1.5em in witch-purple with deep glow; lowercase rest) — illuminated-manuscript feel - h1 also lowercase + serif italic for the .accent span (blood-wine color) - Drop cap on recipe-card .rname (first letter in blood-wine, jumps to glow on hover) - Panels now have gilt 18px corner brackets (top-left + top-right) via ::before/::after — very thin gothic frame, brightens on hover - Inset 1px highlight on top edge for stone-and-glaze depth - Three panel variants: .green (gilt brackets stay gold), .purple, .blood - Panel h2 prefixed with ✦ in blood color (decorative bullet) - New CSS vars: --blood (#7a2c4a aged bordeaux), --blood-bright (#a83d62), --gilt (#8a6e3a aged brass), --gilt-bright (#c0a058) - Brand mark Cauldron now flanked by ✦ in blood color - Crumb breadcrumbs prefixed with ❧ (heart-petal) in gilt - Lede italic with leading curly quote in gilt - HR is now a custom SVG flourish divider (gilt curlicue with blood center dot) instead of a plain line - Top-of-page-head 60px gilt fade rule - Body bg replaced pentagram tile with a more atmospheric cross-and-vine glyph plus a subtle full-page corner vignette darkening (NOT cWHO scanlines, just radial darken) - Brand letter-spacing bumped to .22em for that ceremonial feel
375 lines
15 KiB
HTML
375 lines
15 KiB
HTML
<!doctype html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
|
|
<meta name="color-scheme" content="dark">
|
|
<meta name="theme-color" content="#0a0a0c">
|
|
<title>{% block title %}Cauldron{% endblock %}</title>
|
|
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500;600&family=Cinzel:wght@500;600;700&display=swap" rel="stylesheet">
|
|
<style>
|
|
:root {
|
|
--bg: #0a0a0c;
|
|
--bg-2: #0f0c14;
|
|
--surface: #14101a;
|
|
--surface-2: #1d1828;
|
|
--surface-3: #251f33;
|
|
--line: #2a223a;
|
|
--line-soft: #1f1a2a;
|
|
|
|
--green: #6ea848;
|
|
--green-bright: #88c060;
|
|
--green-dim: #4a7530;
|
|
--green-glow: rgba(110, 168, 72, .25);
|
|
|
|
--purple: #9b5fe8;
|
|
--purple-bright:#b878ff;
|
|
--purple-dim: #6b3fa0;
|
|
--purple-deep: #2d1d4a;
|
|
--purple-glow: rgba(155, 95, 232, .25);
|
|
|
|
--blood: #7a2c4a; /* old-blood / aged bordeaux */
|
|
--blood-bright: #a83d62;
|
|
--blood-dim: #4d1a30;
|
|
--blood-glow: rgba(168, 61, 98, .25);
|
|
|
|
--gilt: #8a6e3a; /* aged brass / gold-leaf */
|
|
--gilt-bright: #c0a058;
|
|
|
|
--bone: #e8e0c8;
|
|
--bone-dim: #a89d83;
|
|
--muted: #6e6478;
|
|
--warn: #d4a854;
|
|
--crit: #e8606a;
|
|
|
|
--sans: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
|
|
--serif: 'Cinzel', Georgia, serif;
|
|
--mono: 'JetBrains Mono', ui-monospace, Menlo, monospace;
|
|
}
|
|
|
|
* { box-sizing: border-box; -webkit-tap-highlight-color: transparent; }
|
|
html { scroll-behavior: smooth; -webkit-text-size-adjust: 100%; }
|
|
html, body {
|
|
margin: 0; padding: 0;
|
|
color: var(--bone);
|
|
font-family: var(--sans);
|
|
font-size: 15px; line-height: 1.6;
|
|
min-height: 100vh; min-height: 100dvh;
|
|
-webkit-font-smoothing: antialiased;
|
|
background: var(--bg);
|
|
}
|
|
body {
|
|
background-image:
|
|
radial-gradient(ellipse 80% 60% at 15% 0%, rgba(155, 95, 232, .07) 0%, transparent 60%),
|
|
radial-gradient(ellipse 80% 60% at 85% 100%, rgba(110, 168, 72, .05) 0%, transparent 60%);
|
|
/* atmospheric layered bg: top-corner candleglow, bottom moss, gothic
|
|
filigree tile (vines + crescent moon), and a corner-vignette darkening */
|
|
background-image:
|
|
radial-gradient(ellipse 70% 50% at 12% -5%, rgba(155, 95, 232, .09) 0%, transparent 55%),
|
|
radial-gradient(ellipse 60% 50% at 88% 105%, rgba(110, 168, 72, .06) 0%, transparent 55%),
|
|
radial-gradient(ellipse at center, transparent 55%, rgba(0,0,0,.55) 100%),
|
|
url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='120' height='120' viewBox='0 0 120 120'><g fill='none' stroke='%239b5fe8' stroke-width='.5' stroke-opacity='.06' stroke-linecap='round'><path d='M60 14 Q72 26 60 38 Q48 26 60 14 Z'/><path d='M60 14 L60 38'/><path d='M30 60 Q42 50 54 60'/><path d='M30 60 Q42 70 54 60'/><path d='M66 60 Q78 50 90 60'/><path d='M66 60 Q78 70 90 60'/><path d='M60 82 Q72 94 60 106 Q48 94 60 82 Z'/><path d='M60 82 L60 106'/><circle cx='60' cy='60' r='8'/><path d='M58 56 Q56 60 58 64' stroke-opacity='.10'/><path d='M62 56 Q64 60 62 64' stroke-opacity='.10'/></g></svg>");
|
|
background-attachment: fixed;
|
|
background-size: auto, auto, auto, 120px 120px;
|
|
}
|
|
|
|
::selection { background: rgba(155, 95, 232, .35); color: var(--bone); }
|
|
|
|
::-webkit-scrollbar { width: 8px; height: 8px; }
|
|
::-webkit-scrollbar-track { background: var(--bg-2); }
|
|
::-webkit-scrollbar-thumb { background: var(--surface-2); border-radius: 4px; }
|
|
::-webkit-scrollbar-thumb:hover { background: var(--purple-dim); }
|
|
|
|
/* Top bar */
|
|
header.topbar {
|
|
position: sticky; top: 0; z-index: 50;
|
|
display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap;
|
|
gap: 14px;
|
|
padding: 16px 22px;
|
|
border-bottom: 1px solid var(--line);
|
|
background: rgba(10, 10, 12, .85);
|
|
backdrop-filter: blur(10px);
|
|
-webkit-backdrop-filter: blur(10px);
|
|
}
|
|
.brand { display: flex; align-items: baseline; gap: 14px; min-width: 0; }
|
|
.brand-mark {
|
|
font-family: var(--serif); font-weight: 700;
|
|
color: var(--purple-bright); font-size: 24px;
|
|
letter-spacing: .22em; text-transform: uppercase;
|
|
text-shadow: 0 0 24px var(--purple-glow);
|
|
position: relative; padding: 0 .15em;
|
|
}
|
|
.brand-mark::before, .brand-mark::after {
|
|
content: "✦"; color: var(--blood); opacity: .65;
|
|
font-size: .55em; vertical-align: middle;
|
|
margin: 0 .35em; text-shadow: 0 0 8px var(--blood-glow);
|
|
}
|
|
.brand-sub { color: var(--muted); font-size: 11px; letter-spacing: .2em; text-transform: uppercase; font-family: var(--mono); }
|
|
nav.nav { display: flex; gap: 22px; flex-wrap: wrap; }
|
|
nav.nav a {
|
|
color: var(--bone-dim); text-decoration: none;
|
|
font-size: 12px; letter-spacing: .15em; text-transform: uppercase;
|
|
padding: 6px 0; position: relative; transition: color .2s;
|
|
}
|
|
nav.nav a:hover { color: var(--green-bright); }
|
|
nav.nav a.active { color: var(--purple-bright); }
|
|
nav.nav a.active::after {
|
|
content: ""; position: absolute; left: 0; right: 0; bottom: 0; height: 2px;
|
|
background: var(--purple-bright); box-shadow: 0 0 12px var(--purple-glow);
|
|
}
|
|
.topmeta {
|
|
color: var(--muted); font-size: 11px; letter-spacing: .15em; text-transform: uppercase;
|
|
font-family: var(--mono);
|
|
}
|
|
.topmeta .who { color: var(--green-bright); }
|
|
|
|
/* Main */
|
|
main {
|
|
max-width: 920px; margin: 0 auto; padding: 36px 22px 80px;
|
|
position: relative;
|
|
}
|
|
|
|
/* Page header — gothic vertical rhythm + drop cap */
|
|
.page-head { margin-bottom: 2em; animation: fadeIn .5s ease-out forwards; position: relative; }
|
|
.page-head::before {
|
|
content: ""; position: absolute; left: 0; top: -8px; width: 60px; height: 1px;
|
|
background: linear-gradient(90deg, var(--gilt), transparent);
|
|
opacity: .6;
|
|
}
|
|
.page-head .crumb {
|
|
color: var(--blood-bright); font-size: 11px; letter-spacing: .35em;
|
|
text-transform: uppercase; font-family: var(--mono); margin-bottom: .8em;
|
|
display: inline-block;
|
|
}
|
|
.page-head .crumb::before { content: "❧ "; color: var(--gilt); margin-right: .3em; opacity: .8; }
|
|
.page-head h1 {
|
|
margin: 0; color: var(--bone);
|
|
font-family: var(--serif); font-weight: 700;
|
|
font-size: 2.8em; letter-spacing: .06em; line-height: 1.05;
|
|
text-transform: lowercase;
|
|
}
|
|
.page-head h1::first-letter {
|
|
font-size: 1.5em; color: var(--purple-bright);
|
|
text-shadow: 0 0 28px var(--purple-glow), 2px 2px 0 var(--bg);
|
|
font-weight: 700; padding-right: .04em;
|
|
}
|
|
.page-head h1 .accent {
|
|
color: var(--blood-bright);
|
|
text-shadow: 0 0 24px var(--blood-glow);
|
|
font-style: italic;
|
|
}
|
|
.page-head .lede {
|
|
color: var(--bone-dim); font-size: 1em; margin-top: .8em; max-width: 60ch;
|
|
font-style: italic; letter-spacing: .015em;
|
|
}
|
|
.page-head .lede::before { content: "“"; color: var(--gilt); font-size: 1.4em; line-height: 0; vertical-align: -.2em; margin-right: .15em; opacity: .55; }
|
|
|
|
/* Panel — stone-and-iron card with gothic corner filigree */
|
|
.panel {
|
|
background:
|
|
linear-gradient(180deg, rgba(255,255,255,.012) 0%, transparent 30%),
|
|
var(--surface);
|
|
border: 1px solid var(--line);
|
|
border-radius: 4px;
|
|
padding: 22px 24px;
|
|
margin: 18px 0;
|
|
position: relative;
|
|
box-shadow:
|
|
0 0 28px -10px rgba(155, 95, 232, .12),
|
|
inset 0 1px 0 rgba(255, 255, 255, .015);
|
|
animation: fadeIn .5s ease-out forwards;
|
|
opacity: 0;
|
|
}
|
|
/* corner filigree — top-left + top-right thin gilt brackets */
|
|
.panel::before, .panel::after {
|
|
content: ""; position: absolute; top: -1px; width: 18px; height: 18px;
|
|
border: 1px solid var(--gilt); opacity: .4;
|
|
pointer-events: none;
|
|
}
|
|
.panel::before { left: -1px; border-right: none; border-bottom: none; }
|
|
.panel::after { right: -1px; border-left: none; border-bottom: none; }
|
|
.panel:nth-child(2) { animation-delay: .05s; }
|
|
.panel:nth-child(3) { animation-delay: .1s; }
|
|
.panel:nth-child(4) { animation-delay: .15s; }
|
|
.panel:hover { border-color: var(--surface-3); }
|
|
.panel:hover::before, .panel:hover::after { opacity: .6; border-color: var(--gilt-bright); }
|
|
.panel.green {
|
|
box-shadow:
|
|
0 0 28px -10px rgba(110, 168, 72, .14),
|
|
inset 0 1px 0 rgba(255, 255, 255, .015);
|
|
border-left: 2px solid var(--green-dim);
|
|
}
|
|
.panel.purple { border-left: 2px solid var(--purple-dim); }
|
|
.panel.blood {
|
|
border-left: 2px solid var(--blood-dim);
|
|
box-shadow:
|
|
0 0 28px -10px var(--blood-glow),
|
|
inset 0 1px 0 rgba(255, 255, 255, .015);
|
|
}
|
|
.panel-head {
|
|
display: flex; align-items: baseline; gap: 14px; flex-wrap: wrap;
|
|
margin-bottom: 14px; padding-bottom: 10px;
|
|
border-bottom: 1px solid var(--line-soft);
|
|
}
|
|
.panel-head h2 {
|
|
margin: 0; color: var(--purple-bright);
|
|
font-family: var(--serif); font-weight: 700;
|
|
font-size: 1.15em; letter-spacing: .22em; text-transform: uppercase;
|
|
position: relative;
|
|
}
|
|
.panel-head h2::before {
|
|
content: "✦"; color: var(--blood); opacity: .6;
|
|
font-size: .65em; margin-right: .55em; vertical-align: middle;
|
|
}
|
|
.panel.green .panel-head h2 { color: var(--green-bright); }
|
|
.panel.green .panel-head h2::before { color: var(--gilt); }
|
|
.panel.blood .panel-head h2 { color: var(--blood-bright); }
|
|
.panel.blood .panel-head h2::before { color: var(--purple); }
|
|
.panel-head .ctx { color: var(--muted); font-size: 11px; letter-spacing: .15em; text-transform: uppercase; margin-left: auto; font-family: var(--mono); }
|
|
|
|
/* Pill */
|
|
.pill {
|
|
display: inline-block; padding: 3px 10px; border: 1px solid;
|
|
border-radius: 4px; font-size: 10px; letter-spacing: .2em; text-transform: uppercase;
|
|
font-family: var(--mono); font-weight: 600;
|
|
}
|
|
.pill-ok { color: var(--green-bright); border-color: var(--green-dim); background: rgba(110, 168, 72, .08); }
|
|
.pill-warn { color: var(--warn); border-color: var(--warn); background: rgba(212, 168, 84, .08); }
|
|
.pill-crit { color: var(--crit); border-color: var(--crit); background: rgba(232, 96, 106, .08); }
|
|
.pill-mute { color: var(--bone-dim); border-color: var(--line); background: var(--bg-2); }
|
|
|
|
/* KV */
|
|
.kv { display: grid; grid-template-columns: max-content 1fr; gap: .5em 1.4em; margin: .6em 0; }
|
|
.kv dt { color: var(--purple); font-size: 11px; letter-spacing: .15em; text-transform: uppercase; font-family: var(--mono); padding-top: 3px; }
|
|
.kv dd { margin: 0; color: var(--bone); font-size: .95em; word-break: break-all; }
|
|
|
|
/* Buttons */
|
|
.btn {
|
|
display: inline-block; padding: .6em 1.4em;
|
|
background: var(--surface-2); color: var(--bone);
|
|
border: 1px solid var(--line);
|
|
border-radius: 5px;
|
|
font-family: var(--sans); font-weight: 500;
|
|
font-size: 13px; letter-spacing: .08em;
|
|
cursor: pointer; text-decoration: none;
|
|
transition: all .2s ease;
|
|
}
|
|
.btn:hover { background: var(--surface-3); border-color: var(--purple-dim); color: var(--bone); }
|
|
.btn-primary {
|
|
background: var(--green-dim); color: var(--bone);
|
|
border-color: var(--green); box-shadow: 0 0 20px -8px var(--green-glow);
|
|
}
|
|
.btn-primary:hover { background: var(--green); border-color: var(--green-bright); box-shadow: 0 0 24px -4px var(--green-glow); }
|
|
.btn-purple {
|
|
background: var(--purple-deep); color: var(--bone);
|
|
border-color: var(--purple-dim); box-shadow: 0 0 20px -8px var(--purple-glow);
|
|
}
|
|
.btn-purple:hover { background: var(--purple-dim); border-color: var(--purple); box-shadow: 0 0 24px -4px var(--purple-glow); }
|
|
.btn-row { display: flex; gap: 12px; flex-wrap: wrap; align-items: center; }
|
|
|
|
/* Forms */
|
|
input[type=text], input[type=password], textarea {
|
|
width: 100%; padding: .75em .9em;
|
|
background: var(--bg-2); border: 1px solid var(--line);
|
|
border-radius: 4px;
|
|
color: var(--bone); font-family: var(--mono); font-size: .92em;
|
|
transition: border-color .2s, box-shadow .2s;
|
|
}
|
|
input[type=text]:focus { outline: none; border-color: var(--purple); box-shadow: 0 0 0 3px rgba(155, 95, 232, .12); }
|
|
|
|
/* Misc */
|
|
a { color: var(--green-bright); text-decoration: none; transition: color .2s; }
|
|
a:hover { color: var(--purple-bright); }
|
|
.muted { color: var(--muted); font-size: .9em; }
|
|
.lede { color: var(--bone-dim); }
|
|
/* gothic flourish divider */
|
|
hr {
|
|
border: none; height: 28px; margin: 2.2em 0;
|
|
background: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 200 28' width='200' height='28'><g fill='none' stroke='%238a6e3a' stroke-width='1' stroke-linecap='round' stroke-opacity='.55'><path d='M10 14 L80 14'/><path d='M120 14 L190 14'/><path d='M85 14 Q92 8 100 14 Q108 20 115 14'/><circle cx='100' cy='14' r='2.5' fill='%237a2c4a' fill-opacity='.6' stroke='none'/></g></svg>") no-repeat center;
|
|
background-size: contain;
|
|
}
|
|
code {
|
|
background: var(--purple-deep); border: 1px solid var(--purple-dim);
|
|
color: var(--purple-bright);
|
|
padding: .12em .5em; border-radius: 3px;
|
|
font-family: var(--mono); font-size: .88em;
|
|
}
|
|
strong { color: var(--bone); font-weight: 600; }
|
|
ol, ul { padding-left: 1.4em; }
|
|
ol li, ul li { margin: .35em 0; }
|
|
|
|
/* Recipe grid */
|
|
.recipe-grid { display: grid; grid-template-columns: 1fr; gap: 10px; }
|
|
@media (min-width: 600px) { .recipe-grid { grid-template-columns: 1fr 1fr; } }
|
|
.recipe-card {
|
|
display: block; padding: 14px 16px;
|
|
border: 1px solid var(--line); background: var(--surface);
|
|
border-radius: 5px;
|
|
text-decoration: none; color: inherit;
|
|
position: relative; overflow: hidden;
|
|
transition: all .2s ease;
|
|
}
|
|
.recipe-card:hover {
|
|
border-color: var(--purple-dim); background: var(--surface-2);
|
|
transform: translateY(-1px);
|
|
box-shadow: 0 4px 24px -8px var(--purple-glow);
|
|
}
|
|
.recipe-card .rname {
|
|
color: var(--bone); font-family: var(--serif); font-weight: 600;
|
|
font-size: 1.1em; letter-spacing: .03em; text-transform: lowercase;
|
|
line-height: 1.2;
|
|
}
|
|
.recipe-card .rname::first-letter { color: var(--blood-bright); font-weight: 700; font-size: 1.15em; }
|
|
.recipe-card:hover .rname { color: var(--purple-bright); }
|
|
.recipe-card:hover .rname::first-letter { color: var(--blood-bright); text-shadow: 0 0 12px var(--blood-glow); }
|
|
.recipe-card .rmeta {
|
|
color: var(--muted); font-size: 10px; letter-spacing: .15em;
|
|
text-transform: uppercase; font-family: var(--mono); margin-top: 6px;
|
|
}
|
|
.recipe-card .rtags { display: flex; gap: 6px; flex-wrap: wrap; margin-top: 8px; }
|
|
.recipe-card .rtag {
|
|
color: var(--green-bright); border: 1px solid var(--green-dim);
|
|
background: rgba(110, 168, 72, .06);
|
|
padding: 1px 8px; border-radius: 3px;
|
|
font-size: 9px; letter-spacing: .15em; text-transform: uppercase;
|
|
font-family: var(--mono);
|
|
}
|
|
|
|
/* Animations */
|
|
@keyframes fadeIn {
|
|
from { opacity: 0; transform: translateY(8px); }
|
|
to { opacity: 1; transform: translateY(0); }
|
|
}
|
|
|
|
form { margin: 0; }
|
|
</style>
|
|
</head>
|
|
<body>
|
|
|
|
<header class="topbar">
|
|
<div class="brand">
|
|
<span class="brand-mark">Cauldron</span>
|
|
<span class="brand-sub">family · LAN</span>
|
|
</div>
|
|
{% if session.user %}
|
|
<nav class="nav">
|
|
<a href="/" class="{% if active == 'home' %}active{% endif %}">home</a>
|
|
<a href="/recipes" class="{% if active == 'recipes' %}active{% endif %}">recipes</a>
|
|
<a href="/plan" class="{% if active == 'plan' %}active{% endif %}">plan</a>
|
|
<a href="/list" class="{% if active == 'list' %}active{% endif %}">list</a>
|
|
<a href="/me" class="{% if active == 'me' %}active{% endif %}">me</a>
|
|
</nav>
|
|
<div class="topmeta">
|
|
<span class="who">{{ session.user.email }}</span>
|
|
</div>
|
|
{% endif %}
|
|
</header>
|
|
|
|
<main>
|
|
{% block content %}{% endblock %}
|
|
</main>
|
|
|
|
</body>
|
|
</html>
|