Compare commits

..

3 Commits

Author SHA1 Message Date
nvrl 39bbd9e925 changed ports
CI / frontend (push) Successful in 38s
CI / backend (push) Failing after 19s
2026-05-18 14:24:51 +02:00
nvrl 72c09a2ff2 merged 2026-05-18 14:16:48 +02:00
nvrl aec2bf66fd Merge pull request 'init elas atelier' (#1) from ela into main
CI / frontend (push) Successful in 37s
CI / backend (push) Failing after 18s
Reviewed-on: #1
2026-05-18 13:55:41 +02:00
6 changed files with 56 additions and 42 deletions
-14
View File
@@ -1,14 +0,0 @@
---
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
@@ -1,14 +0,0 @@
---
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: elas-atelier name: narlblog
services: services:
backend: backend:
container_name: elas-atelier-backend container_name: narlblog-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:
- atelier_net - internal_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: elas-atelier-frontend container_name: narlblog-frontend
build: build:
context: ./frontend context: ./frontend
dockerfile: Dockerfile dockerfile: Dockerfile
ports: ports:
- "4322:4321" - "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:
- atelier_net - internal_net
logging: logging:
driver: json-file driver: json-file
options: options:
@@ -56,6 +56,6 @@ services:
max-file: "3" max-file: "3"
networks: networks:
atelier_net: internal_net:
name: elas-atelier-net name: narlblog-net
driver: bridge driver: bridge
Binary file not shown.

Before

Width:  |  Height:  |  Size: 655 B

After

Width:  |  Height:  |  Size: 17 KiB

+16 -6
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"
> >
{!isBlog && post?.cover_image?.url && ( {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,6 +113,20 @@ 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">
@@ -160,11 +174,7 @@ 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} />
{isBlog ? ( {(neighbors.prev || neighbors.next) && (
<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,3 +174,35 @@ 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);
}