Compare commits

..

1 Commits

Author SHA1 Message Date
nvrl 0bd27dd7ef modified blog posts
CI / frontend (pull_request) Successful in 36s
CI / backend (pull_request) Failing after 20s
2026-05-18 14:33:58 +02:00
6 changed files with 42 additions and 56 deletions
+14
View File
@@ -0,0 +1,14 @@
---
date: 2026-05-09
summary: A second placeholder — layout smoke test.
tags:
- intro
draft: false
---
# Second placeholder
A second placeholder so the salon-hang layout has room to breathe with more than one plate. Remove or replace from `/admin`.
![Placeholder plate](/uploads/placeholder.jpg "replace me")
> "The painter constructs, the photographer discloses." — Susan Sontag
+14
View File
@@ -0,0 +1,14 @@
---
date: 2026-05-09
summary: Opening note for the gallery — what's on the walls, why these pieces.
tags:
- intro
draft: false
---
# Welcome to the gallery
This room collects work made on paper, canvas, and elsewhere — finished pieces alongside the studies that didn't make it.
![Placeholder plate](/uploads/placeholder.jpg "replace with a real plate from /admin/assets")
Replace this entry with your first real work, or remove it from the catalogue via the admin dashboard.
+8 -8
View File
@@ -1,8 +1,8 @@
name: narlblog name: elas-atelier
services: services:
backend: backend:
container_name: narlblog-backend container_name: elas-atelier-backend
build: build:
context: ./backend context: ./backend
dockerfile: Dockerfile dockerfile: Dockerfile
@@ -20,7 +20,7 @@ services:
- RUST_LOG=${RUST_LOG:-info} - RUST_LOG=${RUST_LOG:-info}
restart: unless-stopped restart: unless-stopped
networks: networks:
- internal_net - atelier_net
healthcheck: healthcheck:
test: ["CMD", "curl", "-fsS", "http://localhost:3000/healthz"] test: ["CMD", "curl", "-fsS", "http://localhost:3000/healthz"]
interval: 15s interval: 15s
@@ -34,12 +34,12 @@ services:
max-file: "3" max-file: "3"
frontend: frontend:
container_name: narlblog-frontend container_name: elas-atelier-frontend
build: build:
context: ./frontend context: ./frontend
dockerfile: Dockerfile dockerfile: Dockerfile
ports: ports:
- "4321" - "4322:4321"
environment: environment:
- PUBLIC_API_URL=${PUBLIC_API_URL:-} - PUBLIC_API_URL=${PUBLIC_API_URL:-}
- SITE_MODE=${SITE_MODE:-atelier} - SITE_MODE=${SITE_MODE:-atelier}
@@ -48,7 +48,7 @@ services:
condition: service_healthy condition: service_healthy
restart: unless-stopped restart: unless-stopped
networks: networks:
- internal_net - atelier_net
logging: logging:
driver: json-file driver: json-file
options: options:
@@ -56,6 +56,6 @@ services:
max-file: "3" max-file: "3"
networks: networks:
internal_net: atelier_net:
name: narlblog-net name: elas-atelier-net
driver: bridge driver: bridge
Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 655 B

+6 -16
View File
@@ -78,7 +78,7 @@ const displayTitle = post ? (post.title || formatSlug(post.slug)) : 'Work';
image={post?.cover_image?.url} image={post?.cover_image?.url}
type="article" type="article"
> >
{post?.cover_image?.url && ( {!isBlog && post?.cover_image?.url && (
<Fragment slot="head"> <Fragment slot="head">
<link rel="preload" as="image" href={post.cover_image.url} fetchpriority="high" /> <link rel="preload" as="image" href={post.cover_image.url} fetchpriority="high" />
</Fragment> </Fragment>
@@ -113,20 +113,6 @@ const displayTitle = post ? (post.title || formatSlug(post.slug)) : 'Work';
)} )}
</div> </div>
{/* Blog mode: cover rides above the plaque as a lead image. In atelier
the cover is the index plate's job, not the post page's. */}
{isBlog && post.cover_image?.url && (
<div class="post-lead">
<img
src={post.cover_image.url}
alt={post.cover_image.alt || displayTitle}
width={post.cover_image.w}
height={post.cover_image.h}
fetchpriority="high"
/>
</div>
)}
{/* Plaque header */} {/* Plaque header */}
<header class="max-w-3xl mx-auto text-center mb-12 md:mb-16"> <header class="max-w-3xl mx-auto text-center mb-12 md:mb-16">
<h1 class="font-display italic font-semibold text-[var(--text)] text-4xl md:text-6xl lg:text-7xl leading-[1.08] tracking-tight mb-6"> <h1 class="font-display italic font-semibold text-[var(--text)] text-4xl md:text-6xl lg:text-7xl leading-[1.08] tracking-tight mb-6">
@@ -174,7 +160,11 @@ const displayTitle = post ? (post.title || formatSlug(post.slug)) : 'Work';
{/* Body — works on paper */} {/* Body — works on paper */}
<div id="post-content" class="prose" set:html={html} /> <div id="post-content" class="prose" set:html={html} />
{(neighbors.prev || neighbors.next) && ( {isBlog ? (
<div class="max-w-3xl mx-auto mt-20 md:mt-28 text-center">
<a href="/" class="btn btn--ghost">← {c.backHome}</a>
</div>
) : (neighbors.prev || neighbors.next) && (
<nav class="post-nav max-w-3xl mx-auto mt-20 md:mt-28 grid grid-cols-1 md:grid-cols-2 gap-6" aria-label="Post navigation"> <nav class="post-nav max-w-3xl mx-auto mt-20 md:mt-28 grid grid-cols-1 md:grid-cols-2 gap-6" aria-label="Post navigation">
{neighbors.prev && ( {neighbors.prev && (
<a href={`/posts/${encodeURIComponent(neighbors.prev.slug)}`} class="group glass p-6 hover:border-[var(--mauve)] transition-colors text-left"> <a href={`/posts/${encodeURIComponent(neighbors.prev.slug)}`} class="group glass p-6 hover:border-[var(--mauve)] transition-colors text-left">
-32
View File
@@ -174,35 +174,3 @@ html.mode-blog .post-row-draft {
aspect-ratio: 16 / 9; aspect-ratio: 16 / 9;
} }
} }
/* ── Post page (blog mode): cover as a lead image above the plaque ── */
html.mode-blog .post-lead {
position: relative;
max-width: 48rem;
margin: 0 auto 2.5rem;
overflow: hidden;
background: var(--mantle);
border: 1px solid var(--surface2);
border-radius: 2px;
box-shadow:
inset 0 0 0 1px color-mix(in srgb, var(--surface1) 50%, transparent),
0 26px 50px -30px rgba(20, 16, 12, 0.55);
}
html.salon-noir.mode-blog .post-lead,
html.gothic.mode-blog .post-lead {
box-shadow:
inset 0 0 0 1px color-mix(in srgb, var(--surface1) 50%, transparent),
0 26px 50px -30px rgba(0, 0, 0, 0.8);
}
html.breakcore.mode-blog .post-lead {
border-color: color-mix(in srgb, var(--mauve) 40%, var(--surface2));
box-shadow:
inset 0 0 0 1px color-mix(in srgb, var(--mauve) 28%, transparent),
0 0 34px -12px color-mix(in srgb, var(--mauve) 45%, transparent);
}
html.mode-blog .post-lead img {
display: block;
width: 100%;
height: auto;
filter: saturate(0.95) contrast(1.02);
}