feat: ship creator journey v2 and profile updates

This commit is contained in:
2026-04-12 21:42:07 +02:00
parent a2457f4e49
commit d5cff21ea2
335 changed files with 20147 additions and 1545 deletions

View File

@@ -15,6 +15,7 @@ function normalizeRelated(item) {
url: item.url,
thumb: item.thumb || null,
thumbSrcSet: item.thumb_srcset || null,
maturity: item.maturity || null,
}
}
@@ -28,6 +29,7 @@ function normalizeSimilar(item) {
url: item.url,
thumb: item.thumb || null,
thumbSrcSet: item.thumb_srcset || null,
maturity: item.maturity || null,
}
}
@@ -42,12 +44,14 @@ function normalizeRankItem(item) {
url,
thumb: item.thumbnail_url || item.thumb || null,
thumbSrcSet: null,
maturity: item.maturity || null,
}
}
function dedupeByUrl(items) {
const seen = new Set()
return items.filter((item) => {
if (item?.maturity?.should_hide) return false
if (!item?.url || seen.has(item.url)) return false
seen.add(item.url)
return true
@@ -57,6 +61,9 @@ function dedupeByUrl(items) {
/* ── Large art card (matches homepage style) ─────────────────── */
function RailCard({ item }) {
const shouldBlur = Boolean(item?.maturity?.should_blur)
const isMature = Boolean(item?.maturity?.is_mature_effective)
return (
<article className="w-[240px] shrink-0 snap-start sm:w-[220px] lg:w-[200px] xl:w-[210px] 2xl:w-[220px]">
<a
@@ -72,11 +79,13 @@ function RailCard({ item }) {
srcSet={item.thumbSrcSet || undefined}
sizes="220px"
alt={item.title || 'Artwork'}
className="h-full w-full object-cover transition-[transform,filter] duration-300 ease-out group-hover:scale-[1.04]"
className={`h-full w-full object-cover transition-[transform,filter] duration-300 ease-out group-hover:scale-[1.04] ${shouldBlur ? 'scale-[1.02] blur-xl' : ''}`}
loading="lazy"
decoding="async"
onError={(e) => { e.currentTarget.src = FALLBACK }}
/>
{isMature ? <div className="absolute left-3 top-3 z-20 rounded-full border border-amber-300/20 bg-black/60 px-3 py-1 text-[10px] font-semibold uppercase tracking-[0.16em] text-amber-100">Mature</div> : null}
{shouldBlur ? <div className="absolute inset-x-3 bottom-3 z-20 rounded-full border border-amber-300/20 bg-black/60 px-3 py-1 text-[10px] font-semibold uppercase tracking-[0.16em] text-amber-100">Blurred by your settings</div> : null}
{/* Bottom info overlay */}
<div className="pointer-events-none absolute inset-x-0 bottom-0 z-20 bg-gradient-to-t from-black/80 via-black/40 to-transparent p-3 backdrop-blur-[2px] opacity-100 transition-opacity duration-200 md:opacity-0 md:group-hover:opacity-100 md:group-focus-visible:opacity-100">