Files
nginx-serve/server_root/static/zenburn.css
Edward Langley a4a838ad3b Consolidate examples into unified production config with static CSS
- New sqlite_serve.conf: all features on single port 8080
- New zenburn.css: hex color palette, all styles in one cacheable file
- New Zenburn templates: header/footer/card partials
- New start.sh: unified launcher with all endpoint docs
- Removed 3 separate example configs and start scripts

15 files changed, 980 insertions(+), 258 deletions(-)
2025-11-15 16:42:05 -08:00

510 lines
8.9 KiB
CSS

/* Zenburn theme for sqlite-serve */
/* Generated palette via: zenburn -j -e oklab */
:root {
--fg-plus-2: #FFFFEF;
--fg-plus-1: #F5F5D6;
--fg: #DCDCCC;
--fg-1: #A6A689;
--fg-2: #656555;
--black: #000000;
--bg-2: #000000;
--bg-1: #111112;
--bg-05: #383838;
--bg: #2A2B2E;
--bg-plus-05: #494949;
--bg-plus-1: #4F4F4F;
--bg-plus-2: #5F5F5F;
--bg-plus-3: #6F6F6F;
--red-plus-2: #ECB3B3;
--red-plus-1: #DCA3A3;
--red: #CC9393;
--red-1: #BC8383;
--red-2: #AC7373;
--red-3: #9C6363;
--red-4: #8C5353;
--red-5: #7C4343;
--red-6: #6C3333;
--orange: #DFAF8F;
--yellow: #F0DFAF;
--yellow-1: #E0CF9F;
--yellow-2: #D0BF8F;
--green-5: #2F4F2F;
--green-4: #3F5F3F;
--green-3: #4F6F4F;
--green-2: #5F7F5F;
--green-1: #6F8F6F;
--green: #7F9F7F;
--green-plus-1: #8FB28F;
--green-plus-2: #9FC59F;
--green-plus-3: #AFD8AF;
--green-plus-4: #BFEBBF;
--cyan: #93E0E3;
--blue-plus-3: #BDE0F3;
--blue-plus-2: #ACE0E3;
--blue-plus-1: #94BFF3;
--blue: #8CD0D3;
--blue-1: #7CB8BB;
--blue-2: #6CA0A3;
--blue-3: #5C888B;
--blue-4: #4C7073;
--blue-5: #366060;
--magenta: #DC8CC3;
}
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: 'Monaco', 'Menlo', 'Consolas', monospace;
line-height: 1.6;
color: var(--fg);
background: var(--bg);
min-height: 100vh;
}
.container {
max-width: 1400px;
margin: 0 auto;
}
/* Header */
header {
background: var(--bg-1);
border-bottom: 2px solid var(--blue-1);
padding: 1.5rem 2rem;
box-shadow: 0 2px 8px oklab(0.000% 0.000 0.000 / 0.5);
}
.header-content {
max-width: 1400px;
margin: 0 auto;
}
header h1 {
color: var(--yellow);
font-size: 1.8rem;
margin-bottom: 0.5rem;
font-weight: 600;
}
header p {
color: var(--fg-1);
font-size: 0.95rem;
}
/* Navigation */
nav {
background: var(--bg-plus-1);
padding: 0.75rem 2rem;
border-bottom: 1px solid var(--bg-1);
position: sticky;
top: 0;
z-index: 100;
box-shadow: 0 2px 4px oklab(0.000% 0.000 0.000 / 0.3);
}
.nav-content {
max-width: 1400px;
margin: 0 auto;
display: flex;
flex-wrap: wrap;
gap: 1.5rem;
align-items: center;
}
nav a {
color: var(--blue-1);
text-decoration: none;
font-weight: 500;
transition: color 0.2s;
font-size: 0.95rem;
}
nav a:hover {
color: var(--green-plus-1);
}
nav a.active {
color: var(--yellow);
}
.search-form {
margin-left: auto;
display: flex;
gap: 0.5rem;
}
.search-form input {
background: var(--bg);
border: 1px solid var(--fg-2);
color: var(--fg);
padding: 0.4rem 0.8rem;
border-radius: 4px;
font-family: inherit;
font-size: 0.9rem;
}
.search-form input:focus {
outline: none;
border-color: var(--blue-1);
}
.search-form button {
background: var(--blue-1);
color: var(--bg-1);
border: none;
padding: 0.4rem 1rem;
border-radius: 4px;
cursor: pointer;
font-weight: 600;
font-size: 0.9rem;
transition: background 0.2s;
}
.search-form button:hover {
background: var(--green-plus-1);
}
/* Main content */
main {
padding: 2rem;
max-width: 1400px;
margin: 0 auto;
}
/* Footer */
footer {
background: var(--bg-1);
padding: 2rem;
text-align: center;
border-top: 2px solid var(--blue-1);
margin-top: 3rem;
}
footer p {
margin-top: 0.5rem;
}
footer p:first-child {
color: var(--yellow);
font-weight: 600;
margin-top: 0;
}
footer p:not(:first-child) {
color: var(--fg-1);
font-size: 0.9rem;
}
/* Page header */
.page-header {
background: var(--bg-plus-1);
border: 1px solid var(--bg-1);
border-left: 3px solid var(--green-plus-1);
border-radius: 6px;
padding: 2rem;
margin-bottom: 2rem;
}
.page-header h2 {
color: var(--yellow);
font-size: 2rem;
margin-bottom: 0.5rem;
}
.page-header p {
color: var(--fg-1);
font-size: 1.05rem;
}
/* Stats grid */
.stats-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: 1rem;
margin-bottom: 2rem;
}
.stat-card {
background: var(--bg-plus-1);
border: 1px solid var(--bg-1);
border-radius: 6px;
padding: 1.5rem;
text-align: center;
}
.stat-value {
color: var(--orange);
font-size: 2.5rem;
font-weight: 700;
display: block;
margin-bottom: 0.5rem;
}
.stat-label {
color: var(--fg-1);
font-size: 0.9rem;
text-transform: uppercase;
letter-spacing: 0.05em;
}
/* Book grid and cards */
.book-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(380px, 1fr));
gap: 1.5rem;
}
.book-card {
background: var(--bg-plus-1);
border: 1px solid var(--bg-1);
border-left: 3px solid var(--blue-1);
border-radius: 6px;
padding: 1.5rem;
transition: all 0.3s ease;
display: flex;
flex-direction: column;
gap: 0.75rem;
}
.book-card:hover {
border-left-color: var(--green-plus-1);
box-shadow: 0 4px 12px oklab(0.000% 0.000 0.000 / 0.5);
transform: translateY(-2px);
}
.book-header {
display: flex;
justify-content: space-between;
align-items: start;
gap: 1rem;
}
.book-title {
color: var(--yellow);
font-size: 1.15rem;
font-weight: 600;
line-height: 1.3;
}
.book-rating {
background: var(--bg-1);
color: var(--orange);
padding: 0.25rem 0.75rem;
border-radius: 12px;
font-size: 0.85rem;
font-weight: 700;
white-space: nowrap;
flex-shrink: 0;
}
.book-author {
color: var(--blue-1);
font-weight: 500;
font-size: 0.95rem;
}
.book-description {
color: var(--fg-1);
line-height: 1.5;
font-size: 0.9rem;
}
.book-meta {
display: flex;
flex-wrap: wrap;
gap: 0.5rem;
font-size: 0.85rem;
}
.genre-badge {
background: var(--green);
color: var(--bg-1);
padding: 0.25rem 0.75rem;
border-radius: 4px;
font-weight: 600;
}
.year-badge {
background: var(--bg-1);
color: var(--fg-1);
padding: 0.25rem 0.75rem;
border-radius: 4px;
}
.isbn {
color: var(--fg-1);
font-family: monospace;
font-size: 0.8rem;
}
.detail-link {
color: var(--blue-1);
text-decoration: none;
font-weight: 500;
font-size: 0.9rem;
margin-top: 0.5rem;
align-self: flex-start;
transition: color 0.2s;
}
.detail-link:hover {
color: var(--green-plus-1);
}
/* Empty state */
.empty-state {
text-align: center;
padding: 4rem 2rem;
color: var(--fg-1);
}
.empty-state h3 {
color: var(--orange);
font-size: 1.5rem;
margin-bottom: 1rem;
}
.empty-state a {
color: var(--blue-1);
text-decoration: none;
font-weight: 600;
}
.empty-state a:hover {
color: var(--green-plus-1);
}
/* Book detail page */
.detail-container {
max-width: 900px;
margin: 0 auto;
}
.breadcrumb {
color: var(--fg-1);
margin-bottom: 1.5rem;
font-size: 0.9rem;
}
.breadcrumb a {
color: var(--blue-1);
text-decoration: none;
}
.breadcrumb a:hover {
color: var(--green-plus-1);
}
.book-hero {
background: var(--bg-plus-1);
border: 1px solid var(--bg-1);
border-left: 4px solid var(--orange);
border-radius: 6px;
padding: 2rem;
margin-bottom: 2rem;
}
.book-hero-title {
color: var(--yellow);
font-size: 2.5rem;
font-weight: 700;
margin-bottom: 0.75rem;
line-height: 1.2;
}
.book-hero-author {
color: var(--blue-1);
font-size: 1.3rem;
font-weight: 500;
margin-bottom: 1.5rem;
}
.meta-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: 1.5rem;
margin-bottom: 2rem;
}
.meta-item {
background: var(--bg-1);
padding: 1.25rem;
border-radius: 6px;
border-left: 3px solid var(--blue-1);
}
.meta-label {
color: var(--fg-1);
font-size: 0.8rem;
text-transform: uppercase;
letter-spacing: 0.05em;
margin-bottom: 0.5rem;
}
.meta-value {
color: var(--yellow);
font-size: 1.4rem;
font-weight: 700;
}
.meta-value.rating {
color: var(--orange);
}
.description-section {
background: var(--bg-plus-1);
border: 1px solid var(--bg-1);
border-radius: 6px;
padding: 2rem;
margin-bottom: 2rem;
}
.description-section h3 {
color: var(--green-plus-1);
font-size: 1.3rem;
margin-bottom: 1rem;
}
.description-text {
color: var(--fg);
line-height: 1.8;
font-size: 1.05rem;
}
.back-button {
display: inline-block;
background: var(--blue-1);
color: var(--bg-1);
padding: 0.75rem 1.5rem;
border-radius: 6px;
text-decoration: none;
font-weight: 600;
transition: all 0.2s;
}
.back-button:hover {
background: var(--green-plus-1);
transform: translateX(-4px);
}
.not-found {
text-align: center;
padding: 4rem 2rem;
}
.not-found h2 {
color: var(--red);
font-size: 2rem;
margin-bottom: 1rem;
}
.not-found p {
color: var(--fg-1);
margin-bottom: 2rem;
}