diff --git a/package.json b/package.json index 55502cd..3bbb6e4 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "siteforge", "private": true, - "version": "2.0.30", + "version": "2.0.31", "type": "module", "scripts": { "dev": "vite", diff --git a/src/AdminPage.tsx b/src/AdminPage.tsx index 52e8b5c..e3a946f 100644 --- a/src/AdminPage.tsx +++ b/src/AdminPage.tsx @@ -4190,6 +4190,10 @@ async function handleAssetUpload(event: ChangeEvent) { setForm(f => ({ ...f, finishedBooks: (f.finishedBooks ?? []).map(b => b.id === book.id ? { ...b, season: parseInt(e.target.value) || 1 } : b) }))} /> +
+ + setForm(f => ({ ...f, finishedBooks: (f.finishedBooks ?? []).map(b => b.id === book.id ? { ...b, downloadUrl: e.target.value } : b) }))} /> +
diff --git a/src/App.css b/src/App.css index 77f8d75..2ef35ff 100644 --- a/src/App.css +++ b/src/App.css @@ -9801,6 +9801,141 @@ flex-shrink: 0; } +/* ── CD disc artwork ── */ +.finished-series-cd { + flex-shrink: 0; + width: 180px; + height: 180px; + position: relative; +} + +.finished-series-cd-disc { + width: 180px; + height: 180px; + border-radius: 50%; + overflow: hidden; + position: relative; + box-shadow: + 0 12px 40px rgba(0, 0, 0, 0.7), + 0 2px 8px rgba(0, 0, 0, 0.5), + inset 0 0 0 3px rgba(201, 168, 76, 0.12); +} + +.finished-series-cd-img { + width: 100%; + height: 100%; + object-fit: cover; + display: block; +} + +.finished-series-cd-sheen { + position: absolute; + inset: 0; + border-radius: 50%; + background: conic-gradient( + from 20deg, + transparent 0%, + rgba(255, 255, 255, 0.06) 8%, + transparent 16%, + rgba(255, 255, 255, 0.09) 28%, + transparent 38%, + rgba(255, 255, 255, 0.04) 52%, + transparent 60%, + rgba(255, 255, 255, 0.07) 74%, + transparent 84%, + rgba(255, 255, 255, 0.05) 94%, + transparent 100% + ); + pointer-events: none; + z-index: 1; +} + +.finished-series-cd-hole { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: 30px; + height: 30px; + border-radius: 50%; + background: radial-gradient(circle, #0e0e09 60%, rgba(201, 168, 76, 0.15) 100%); + border: 1.5px solid rgba(201, 168, 76, 0.25); + box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.9); + z-index: 2; +} + +/* ── Series action buttons ── */ +.finished-series-actions { + display: flex; + gap: 0.75rem; + margin-top: 1.25rem; + flex-wrap: wrap; +} + +.finished-series-btn-stream { + display: inline-flex; + align-items: center; + gap: 0.4em; + padding: 0.5rem 1.1rem; + border-radius: 6px; + font-size: 0.88rem; + font-weight: 600; + letter-spacing: 0.03em; + text-decoration: none; + border: 1px solid rgba(201, 168, 76, 0.4); + color: var(--brand-gold); + background: transparent; + transition: background 150ms, border-color 150ms; +} + +.finished-series-btn-stream:hover { + background: rgba(201, 168, 76, 0.08); + border-color: rgba(201, 168, 76, 0.7); +} + +.finished-series-btn-download { + display: inline-flex; + align-items: center; + gap: 0.4em; + padding: 0.5rem 1.1rem; + border-radius: 6px; + font-size: 0.88rem; + font-weight: 600; + letter-spacing: 0.03em; + text-decoration: none; + background: var(--brand-gold); + color: #0e0e09; + border: 1px solid var(--brand-gold); + transition: opacity 150ms, transform 150ms; +} + +.finished-series-btn-download:hover { + opacity: 0.88; + transform: translateY(-1px); +} + +/* ── Download badge on grid cards ── */ +.finished-book-card-img-wrap { + position: relative; +} + +.finished-book-card-dl-badge { + position: absolute; + top: 0.5rem; + right: 0.5rem; + background: var(--brand-gold); + color: #0e0e09; + font-size: 0.72rem; + font-weight: 700; + width: 1.6rem; + height: 1.6rem; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + box-shadow: 0 2px 6px rgba(0, 0, 0, 0.5); +} + .finished-series-title { font-family: var(--brand-font-heading); font-size: 2rem; @@ -10006,6 +10141,16 @@ width: 120px; height: 120px; } + + .finished-series-cd { + width: 140px; + height: 140px; + } + + .finished-series-cd-disc { + width: 140px; + height: 140px; + } } /* ── Finished Books page section ── */ diff --git a/src/App.tsx b/src/App.tsx index 31d4da9..82f8ec2 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1617,7 +1617,12 @@ function FinishedBooksPage({ content }: { content: SiteContent }) {
{books.map(book => ( - {book.imageUrl && {book.title}} + {book.imageUrl && ( +
+ {book.title} + {book.downloadUrl && ⬇} +
+ )}

Season {book.season}

{book.title}

@@ -1668,14 +1673,35 @@ function FinishedSeriesPage({ content }: { content: SiteContent }) { {book.title}
- {book.imageUrl && {book.title}} + {book.imageUrl && ( +