chore(release): v0.10.0 (#400)

Photo Essay mode, client proofing, studio-modern preset, admin panel overhaul, watermark, cookieless analytics, subpage toggle, SEO title templates. Analytics API now admin-only, Trivy scan on publish. Album order mirrors the Immich timeline; map theme, admin status panel, lightbox counter and Docker health check fixed.

See CHANGELOG.md for the full list and the health-check upgrade note.
This commit is contained in:
Ralksta
2026-08-10 09:56:20 +02:00
committed by GitHub
parent c9036fdc94
commit 2318409e75
78 changed files with 3848 additions and 553 deletions

View File

@@ -10,8 +10,15 @@
padding: 2rem var(--page-padding, 2rem) 1rem;
}
/* Kicker + meta block are rendered for every preset but stay hidden
unless a preset opts in (studio-modern uses both). */
.map-page__kicker,
.map-page__meta {
display: none;
}
.map-page__title {
font-family: var(--font-heading);
font-family: var(--font-serif);
font-size: clamp(1.5rem, 4vw, 2.5rem);
font-weight: 600;
margin: 0.5rem 0 0.25rem;
@@ -19,7 +26,7 @@
}
.map-page__subtitle {
font-family: var(--font-body);
font-family: var(--font-sans);
font-size: 0.875rem;
color: var(--text-secondary);
margin: 0;
@@ -31,9 +38,9 @@
flex: 1;
min-height: 500px;
margin: 0 var(--page-padding, 2rem) 2rem;
border-radius: var(--radius, 0);
border-radius: var(--radius-sm, 0);
overflow: hidden;
border: 1px solid var(--border-color, rgba(128, 128, 128, 0.15));
border: 1px solid var(--border-subtle, rgba(128, 128, 128, 0.15));
}
.map-container__loading {
@@ -42,7 +49,7 @@
justify-content: center;
height: 500px;
color: var(--text-secondary);
font-family: var(--font-body);
font-family: var(--font-sans);
font-size: 0.875rem;
}
@@ -51,16 +58,16 @@
.leaflet-popup-content-wrapper {
background: var(--bg-primary, #1a1a1a) !important;
color: var(--text-primary, #fff) !important;
border-radius: var(--radius, 4px) !important;
border-radius: var(--radius-md, 4px) !important;
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.4) !important;
border: 1px solid var(--border-color, rgba(128, 128, 128, 0.15)) !important;
border: 1px solid var(--border-subtle, rgba(128, 128, 128, 0.15)) !important;
padding: 0 !important;
overflow: hidden;
}
.leaflet-popup-tip {
background: var(--bg-primary, #1a1a1a) !important;
border: 1px solid var(--border-color, rgba(128, 128, 128, 0.15)) !important;
border: 1px solid var(--border-subtle, rgba(128, 128, 128, 0.15)) !important;
border-top: none !important;
border-left: none !important;
}
@@ -71,7 +78,7 @@
}
.map-popup {
font-family: var(--font-body);
font-family: var(--font-sans);
}
.map-popup__cover {
@@ -86,7 +93,7 @@
}
.map-popup__city {
font-family: var(--font-heading);
font-family: var(--font-serif);
font-size: 0.9375rem;
font-weight: 600;
margin: 0 0 0.125rem;
@@ -166,7 +173,7 @@
.leaflet-control-zoom a {
background: var(--bg-primary, #1a1a1a) !important;
color: var(--text-primary, #fff) !important;
border-color: var(--border-color, rgba(128, 128, 128, 0.15)) !important;
border-color: var(--border-subtle, rgba(128, 128, 128, 0.15)) !important;
}
.leaflet-control-zoom a:hover {

View File

@@ -23,6 +23,12 @@ export default function MapPage() {
notFound();
}
const enabledSubpages = config.subpages.filter((sp) => sp.enabled !== false);
const collectionCount = enabledSubpages.length;
const albumCount =
enabledSubpages.reduce((sum, sp) => sum + sp.albumIds.length, 0) +
config.standaloneAlbums.length;
return (
<>
{/* Leaflet CSS from CDN */}
@@ -35,9 +41,18 @@ export default function MapPage() {
/>
<div className="map-page">
<div className="map-page__header">
<BackLink href="/" label="Back to Gallery" />
<h1 className="map-page__title">Map</h1>
<p className="map-page__subtitle">Where the photos were taken</p>
<div className="map-page__header-main">
<BackLink href="/" label="Back to Gallery" />
<p className="map-page__kicker" aria-hidden="true">
Where
</p>
<h1 className="map-page__title">Map</h1>
<p className="map-page__subtitle">Where the photos were taken</p>
</div>
<p className="map-page__meta" aria-hidden="true">
{collectionCount} {collectionCount === 1 ? 'collection' : 'collections'} · {albumCount}{' '}
{albumCount === 1 ? 'album' : 'albums'}
</p>
</div>
<MapView />
</div>