Refine SEO, uploads, and deploy handling

This commit is contained in:
2026-05-02 10:48:08 +02:00
parent b6be6ed2ac
commit a9dfa6ea11
97 changed files with 373 additions and 327 deletions

View File

@@ -66,7 +66,7 @@ export default function CollectionAnalytics() {
return (
<>
<Head>
<title>{seo.title || `${collection.title || 'Collection'} Analytics — Skinbase Nova`}</title>
<title>{seo.title || `${collection.title || 'Collection'} Analytics — Skinbase`}</title>
<meta name="description" content={seo.description || 'Collection analytics overview.'} />
{seo.canonical ? <link rel="canonical" href={seo.canonical} /> : null}
<meta name="robots" content={seo.robots || 'noindex,follow'} />

View File

@@ -527,7 +527,7 @@ export default function CollectionDashboard() {
return (
<>
<Head>
<title>{seo.title || 'Collections Dashboard — Skinbase Nova'}</title>
<title>{seo.title || 'Collections Dashboard — Skinbase'}</title>
<meta name="description" content={seo.description || 'Collection lifecycle and performance dashboard.'} />
{seo.canonical ? <link rel="canonical" href={seo.canonical} /> : null}
<meta name="robots" content={seo.robots || 'noindex,follow'} />

View File

@@ -255,7 +255,7 @@ export default function CollectionFeaturedIndex() {
const seo = props.seo || {}
const eyebrow = props.eyebrow || 'Discovery'
const title = props.title || 'Featured collections'
const description = props.description || 'A rotating set of standout galleries from across Skinbase Nova. Some are meticulously hand-sequenced. Others are smart collections that stay fresh as the creator publishes new work.'
const description = props.description || 'A rotating set of standout galleries from across Skinbase. Some are meticulously hand-sequenced. Others are smart collections that stay fresh as the creator publishes new work.'
const collections = Array.isArray(props.collections) ? props.collections : []
const communityCollections = Array.isArray(props.communityCollections) ? props.communityCollections : []
const editorialCollections = Array.isArray(props.editorialCollections) ? props.editorialCollections : []
@@ -288,7 +288,7 @@ export default function CollectionFeaturedIndex() {
return (
<>
<SeoHead seo={seo} title={seo?.title || `${title} — Skinbase Nova`} description={seo?.description || description} jsonLd={listSchema} />
<SeoHead seo={seo} title={seo?.title || `${title} — Skinbase`} description={seo?.description || description} jsonLd={listSchema} />
<div className="relative min-h-screen overflow-hidden pb-16">
<div

View File

@@ -88,7 +88,7 @@ export default function CollectionHistory() {
return (
<>
<Head>
<title>{seo.title || `${collection.title || 'Collection'} History — Skinbase Nova`}</title>
<title>{seo.title || `${collection.title || 'Collection'} History — Skinbase`}</title>
<meta name="description" content={seo.description || 'Collection audit history.'} />
{seo.canonical ? <link rel="canonical" href={seo.canonical} /> : null}
<meta name="robots" content={seo.robots || 'noindex,follow'} />

View File

@@ -1766,7 +1766,7 @@ export default function CollectionManage() {
return (
<>
<Head>
<title>{mode === 'create' ? 'Create Collection — Skinbase Nova' : `${collectionState?.title || 'Collection'} — Manage Collection`}</title>
<title>{mode === 'create' ? 'Create Collection — Skinbase' : `${collectionState?.title || 'Collection'} — Manage Collection`}</title>
<meta name="robots" content="noindex,nofollow" />
</Head>

View File

@@ -19,14 +19,14 @@ export default function CollectionSeriesShow() {
const { props } = usePage()
const seo = props.seo || {}
const title = props.title || `Collection Series: ${props.seriesKey || ''}`
const description = props.description || 'A connected sequence of public collections on Skinbase Nova.'
const description = props.description || 'A connected sequence of public collections on Skinbase.'
const collections = Array.isArray(props.collections) ? props.collections : []
const leadCollection = props.leadCollection || null
const stats = props.stats || {}
return (
<>
<SeoHead seo={seo} title={seo.title || `${title} — Skinbase Nova`} description={seo.description || description} />
<SeoHead seo={seo} title={seo.title || `${title} — Skinbase`} description={seo.description || description} />
<div className="relative min-h-screen overflow-hidden pb-16">
<div aria-hidden="true" className="pointer-events-none absolute inset-x-0 top-0 -z-10 h-[36rem] opacity-95" style={{ background: 'radial-gradient(circle at 10% 15%, rgba(59,130,246,0.18), transparent 28%), radial-gradient(circle at 84% 18%, rgba(34,197,94,0.16), transparent 24%), linear-gradient(180deg, #07101d 0%, #0a1220 42%, #08111f 100%)' }} />

View File

@@ -552,7 +552,7 @@ export default function CollectionShow() {
const enabledModuleKeys = new Set(enabledModules.map((module) => module?.key).filter(Boolean))
const showIntroBlock = enabledModuleKeys.size === 0 || enabledModuleKeys.has('intro_block')
const metaOwnerName = owner?.name || owner?.username || collection?.owner?.name || 'Skinbase Curator'
const metaTitle = seo?.title || `${collection?.title} — Skinbase Nova`
const metaTitle = seo?.title || `${collection?.title} — Skinbase`
const metaDescription = seo?.description || collection?.summary || collection?.description || ''
const collectionSchema = seo?.canonical ? {
'@context': 'https://schema.org',
@@ -563,7 +563,7 @@ export default function CollectionShow() {
image: seo?.og_image || collection?.cover_image || undefined,
isPartOf: {
'@type': 'WebSite',
name: 'Skinbase Nova',
name: 'Skinbase',
url: typeof window !== 'undefined' ? window.location.origin : undefined,
},
author: owner ? {
@@ -772,7 +772,7 @@ export default function CollectionShow() {
setCollection((current) => ({ ...current, shares_count: payload?.shares_count ?? current.shares_count }))
await share({
title: collection?.title,
text: collection?.summary || collection?.description || `Explore ${collection?.title} on Skinbase Nova.`,
text: collection?.summary || collection?.description || `Explore ${collection?.title} on Skinbase.`,
url: collection?.public_url,
})
} catch (error) {

View File

@@ -458,7 +458,7 @@ export default function CollectionStaffProgramming() {
return (
<>
<Head>
<title>{seo.title || 'Collection Programming — Skinbase Nova'}</title>
<title>{seo.title || 'Collection Programming — Skinbase'}</title>
<meta name="description" content={seo.description || 'Staff programming tools for collections.'} />
{seo.canonical ? <link rel="canonical" href={seo.canonical} /> : null}
<meta name="robots" content={seo.robots || 'noindex,follow'} />

View File

@@ -374,7 +374,7 @@ export default function CollectionStaffSurfaces() {
return (
<>
<Head>
<title>{seo.title || 'Collection Surfaces — Skinbase Nova'}</title>
<title>{seo.title || 'Collection Surfaces — Skinbase'}</title>
<meta name="description" content={seo.description || 'Staff tools for collection surfaces.'} />
{seo.canonical ? <link rel="canonical" href={seo.canonical} /> : null}
<meta name="robots" content={seo.robots || 'noindex,follow'} />

View File

@@ -144,7 +144,7 @@ export default function SavedCollections() {
'@context': 'https://schema.org',
'@type': 'CollectionPage',
name: 'Saved collections',
description: seo?.description || 'Your saved collections on Skinbase Nova.',
description: seo?.description || 'Your saved collections on Skinbase.',
url: seo.canonical,
mainEntity: {
'@type': 'ItemList',
@@ -328,7 +328,7 @@ export default function SavedCollections() {
return (
<>
<SeoHead seo={seo} title={seo?.title || 'Saved Collections — Skinbase Nova'} description={seo?.description || 'Your saved collections on Skinbase Nova.'} jsonLd={listSchema} />
<SeoHead seo={seo} title={seo?.title || 'Saved Collections — Skinbase'} description={seo?.description || 'Your saved collections on Skinbase.'} jsonLd={listSchema} />
<div className="relative min-h-screen overflow-hidden pb-16">
<div aria-hidden="true" className="pointer-events-none absolute inset-x-0 top-0 -z-10 h-[34rem] opacity-95" style={{ background: 'radial-gradient(circle at 15% 14%, rgba(245,158,11,0.16), transparent 26%), radial-gradient(circle at 82% 18%, rgba(56,189,248,0.16), transparent 24%), linear-gradient(180deg, #07101d 0%, #0a1220 42%, #08111f 100%)' }} />