Files
novaconium/public/css/main.css
T
code 15b32ed256 Make Docker bind mounts actually work; refresh homepage feature grid
App/, cache/, uploads/, and data/ are now bind-mounted by default, so
docker-entrypoint.sh seeds an empty App/ from a build-time backup and
re-chowns the mounted paths to http:http on every start (a bind mount
doesn't inherit a named volume's ownership or get seeded from the image
the way COPY does). Also fixes AllowOverride never actually being
enabled (the sed pattern didn't account for httpd.conf's indentation,
so only DirectoryIndex-served routes worked) and pins Apache/PHP/SQLite
to a dated Arch Linux Archive snapshot for reproducible builds.

Homepage's feature grid was six cards behind what's actually shipped;
brought it in line with the features blog post.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-17 02:43:03 +00:00

504 lines
8.4 KiB
CSS

:root {
--bg: #14181c;
--surface: #1b2126;
--text-color: #e7ebee;
--muted-color: #98a3ac;
--border-color: #2a3238;
--accent: #2dd4bf;
--accent-hover: #5eead4;
}
:root[data-theme=light] {
--bg: #ffffff;
--surface: #f1f4f6;
--text-color: #14181c;
--muted-color: #5b6570;
--border-color: #d8dee3;
--accent: #0f9488;
--accent-hover: #0c7a70;
}
body {
font-family: -apple-system, sans-serif;
background: var(--bg);
color: var(--text-color);
max-width: 40rem;
margin: 2rem auto;
padding: 0 1rem;
line-height: 1.6;
}
a {
color: var(--accent);
text-decoration: none;
}
a:hover {
color: var(--accent-hover);
text-decoration: underline;
}
h1, h2, h3, h4, h5, h6 {
color: var(--text-color);
line-height: 1.3;
}
blockquote {
margin: 1.5rem 0;
padding: 0.25rem 0 0.25rem 1rem;
border-left: 3px solid var(--accent);
color: var(--muted-color);
font-style: italic;
}
table {
width: 100%;
margin: 1.5rem 0;
border-collapse: collapse;
}
th, td {
padding: 0.5rem 0.75rem;
border: 1px solid var(--border-color);
text-align: left;
}
th {
color: var(--text-color);
font-weight: 600;
}
img {
max-width: 100%;
height: auto;
border-radius: 6px;
}
.icon {
flex-shrink: 0;
}
.icon-link {
display: inline-flex;
align-items: center;
gap: 0.35rem;
}
.icon-heading {
display: inline-flex;
align-items: center;
gap: 0.5rem;
}
nav {
margin-bottom: 2rem;
padding-bottom: 1rem;
border-bottom: 1px solid var(--border-color);
}
nav a {
display: inline-flex;
align-items: center;
gap: 0.35rem;
margin-right: 1rem;
font-weight: 600;
}
.theme-toggle {
background: none;
border: none;
color: inherit;
font-weight: normal;
padding: 0;
cursor: pointer;
}
.theme-toggle:hover {
background: none;
}
.theme-toggle .icon-moon {
display: none;
}
:root[data-theme=light] .theme-toggle .icon-sun {
display: none;
}
:root[data-theme=light] .theme-toggle .icon-moon {
display: inline;
}
code {
background: var(--surface);
color: var(--accent);
padding: 0.15em 0.4em;
border-radius: 4px;
font-size: 0.9em;
}
pre {
position: relative;
background: var(--surface);
border: 1px solid var(--border-color);
border-radius: 6px;
padding: 1rem;
overflow-x: auto;
}
pre code {
background: none;
padding: 0;
color: var(--text-color);
}
pre:hover .copy-code-button, pre .copy-code-button:focus-visible {
opacity: 1;
}
.copy-code-button {
position: absolute;
top: 0.5rem;
right: 0.5rem;
display: inline-flex;
align-items: center;
gap: 0.3rem;
background: var(--bg);
border: 1px solid var(--border-color);
border-radius: 4px;
color: var(--muted-color);
font-size: 0.75rem;
padding: 0.25rem 0.5rem;
cursor: pointer;
opacity: 0;
transition: opacity 0.15s ease;
}
.copy-code-button:hover {
background: var(--bg);
color: var(--text-color);
border-color: var(--accent);
}
.copy-code-button.copied {
color: var(--accent);
border-color: var(--accent);
}
.hljs {
background: transparent;
}
pre code.hljs {
padding: 0;
}
hr {
border: none;
border-top: 1px solid var(--border-color);
margin: 2rem 0;
}
ul, ol {
padding-left: 1.25rem;
}
label {
color: var(--muted-color);
}
small {
color: var(--muted-color);
}
footer {
display: flex;
align-items: center;
justify-content: space-between;
gap: 1rem;
flex-wrap: wrap;
}
.footer-menu {
display: flex;
gap: 1rem;
}
.hp-field {
position: absolute;
left: -9999px;
width: 1px;
height: 1px;
overflow: hidden;
}
button, select, textarea, input:not([type=radio]):not([type=checkbox]) {
font-family: inherit;
font-size: 1rem;
background: var(--surface);
color: var(--text-color);
border: 1px solid var(--border-color);
border-radius: 6px;
padding: 0.5rem 0.75rem;
}
select {
cursor: pointer;
}
input[type=radio], input[type=checkbox] {
accent-color: var(--accent);
margin-right: 0.35rem;
vertical-align: middle;
}
button {
background: var(--accent);
color: var(--bg);
border: none;
font-weight: 600;
cursor: pointer;
}
button:hover {
background: var(--accent-hover);
}
.blog-layout {
display: flex;
gap: 2rem;
}
.blog-layout aside {
color: var(--muted-color);
flex: 0 0 8rem;
}
.blog-layout article {
flex: 1;
}
@keyframes fade-in-up {
from {
opacity: 0;
transform: translateY(0.75rem);
}
to {
opacity: 1;
transform: translateY(0);
}
}
@keyframes glow-drift {
0% {
transform: translate(-50%, -50%) rotate(0deg);
}
100% {
transform: translate(-50%, -50%) rotate(360deg);
}
}
.hero {
position: relative;
padding: 3rem 0 2.5rem;
text-align: center;
overflow: hidden;
}
.hero::before {
content: "";
position: absolute;
top: 50%;
left: 50%;
width: 40rem;
height: 40rem;
background: conic-gradient(from 0deg, transparent 0deg, rgba(45, 212, 191, 0.16) 90deg, transparent 180deg);
animation: glow-drift 18s linear infinite;
pointer-events: none;
z-index: 0;
}
.hero > * {
position: relative;
z-index: 1;
animation: fade-in-up 0.6s ease-out both;
}
.hero h1 {
font-size: 2.5rem;
margin: 0.5rem 0 1rem;
animation-delay: 0.08s;
}
.hero .hero-lede {
animation-delay: 0.16s;
}
.hero .hero-actions {
animation-delay: 0.24s;
}
.hero .hero-badges {
animation-delay: 0.32s;
}
.hero-eyebrow {
display: inline-block;
color: var(--accent);
font-weight: 700;
letter-spacing: 0.08em;
text-transform: uppercase;
font-size: 0.85rem;
}
.hero-lede {
max-width: 36rem;
margin: 0 auto;
color: var(--muted-color);
font-size: 1.05rem;
}
.hero-actions {
display: flex;
justify-content: center;
gap: 1rem;
margin-top: 1.75rem;
}
.button-link {
display: inline-flex;
align-items: center;
gap: 0.4rem;
background: var(--accent);
color: var(--bg);
font-weight: 600;
border-radius: 6px;
padding: 0.65rem 1.25rem;
text-decoration: none;
}
.button-link:hover {
background: var(--accent-hover);
color: var(--bg);
text-decoration: none;
}
.button-link.button-link--ghost {
background: transparent;
color: var(--text-color);
border: 1px solid var(--border-color);
}
.button-link.button-link--ghost:hover {
background: var(--surface);
color: var(--text-color);
}
.hero-badges {
display: flex;
flex-wrap: wrap;
justify-content: center;
gap: 0.5rem;
margin: 1.5rem 0 0;
padding: 0;
list-style: none;
}
.badge {
background: var(--surface);
border: 1px solid var(--border-color);
color: var(--muted-color);
border-radius: 999px;
padding: 0.3rem 0.85rem;
font-size: 0.8rem;
font-weight: 600;
}
.feature-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(15rem, 1fr));
gap: 1.25rem;
margin: 2.5rem 0;
}
.feature-card {
background: var(--surface);
border: 1px solid var(--border-color);
border-radius: 8px;
padding: 1.25rem 1.5rem;
opacity: 0;
animation: fade-in-up 0.5s ease-out forwards;
}
.feature-card:nth-child(1) {
animation-delay: 0.36s;
}
.feature-card:nth-child(2) {
animation-delay: 0.42s;
}
.feature-card:nth-child(3) {
animation-delay: 0.48s;
}
.feature-card:nth-child(4) {
animation-delay: 0.54s;
}
.feature-card:nth-child(5) {
animation-delay: 0.6s;
}
.feature-card:nth-child(6) {
animation-delay: 0.66s;
}
.feature-card:nth-child(7) {
animation-delay: 0.72s;
}
.feature-card:nth-child(8) {
animation-delay: 0.78s;
}
.feature-card:nth-child(9) {
animation-delay: 0.84s;
}
.feature-card:nth-child(10) {
animation-delay: 0.9s;
}
.feature-card:nth-child(11) {
animation-delay: 0.96s;
}
.feature-card:nth-child(12) {
animation-delay: 1.02s;
}
.feature-card h2 {
font-size: 1.1rem;
margin: 0 0 0.5rem;
}
.feature-card p {
color: var(--muted-color);
margin: 0;
font-size: 0.95rem;
}
@media (prefers-reduced-motion: reduce) {
.hero::before {
animation: none;
}
.hero > *, .feature-card {
animation: none;
opacity: 1;
transform: none;
}
}
.next-steps {
border-top: 1px solid var(--border-color);
padding-top: 2rem;
margin-top: 1rem;
}
.next-steps ul {
padding-left: 1.25rem;
}
.post-list {
list-style: none;
padding: 0;
}
.post-list li {
padding: 1rem 0;
border-bottom: 1px solid var(--border-color);
}
.post-list li:last-child {
border-bottom: none;
}
.post-list h2 {
margin: 0 0 0.35rem;
font-size: 1.15rem;
}
.post-list p {
color: var(--muted-color);
margin: 0;
}
.footnotes {
border-top: 1px solid var(--border-color);
margin-top: 2.5rem;
padding-top: 1rem;
font-size: 0.9rem;
color: var(--muted-color);
}
.footnotes ol {
padding-left: 1.25rem;
}