Save workspace changes
This commit is contained in:
@@ -147,6 +147,7 @@ export default function HelpCenterPage() {
|
||||
<div className="mt-4 grid gap-3 sm:grid-cols-2 xl:grid-cols-1">
|
||||
<a href={links.studio_help} className="rounded-[22px] border border-white/10 bg-white/[0.04] px-4 py-4 text-sm font-semibold text-white transition hover:border-white/20 hover:bg-white/[0.07]">Studio help</a>
|
||||
<a href={links.upload_help} className="rounded-[22px] border border-white/10 bg-white/[0.04] px-4 py-4 text-sm font-semibold text-white transition hover:border-white/20 hover:bg-white/[0.07]">Upload help</a>
|
||||
<a href={links.help_worlds} className="rounded-[22px] border border-white/10 bg-white/[0.04] px-4 py-4 text-sm font-semibold text-white transition hover:border-white/20 hover:bg-white/[0.07]">Worlds help</a>
|
||||
<a href={links.help_cards} className="rounded-[22px] border border-white/10 bg-white/[0.04] px-4 py-4 text-sm font-semibold text-white transition hover:border-white/20 hover:bg-white/[0.07]">Cards help</a>
|
||||
<a href={links.help_profile} className="rounded-[22px] border border-white/10 bg-white/[0.04] px-4 py-4 text-sm font-semibold text-white transition hover:border-white/20 hover:bg-white/[0.07]">Profile help</a>
|
||||
<a href={links.help_auth} className="rounded-[22px] border border-white/10 bg-white/[0.04] px-4 py-4 text-sm font-semibold text-white transition hover:border-white/20 hover:bg-white/[0.07]">Signup / Login help</a>
|
||||
|
||||
363
resources/js/Pages/Help/WorldsHelpPage.jsx
Normal file
363
resources/js/Pages/Help/WorldsHelpPage.jsx
Normal file
@@ -0,0 +1,363 @@
|
||||
import React from 'react'
|
||||
import { usePage } from '@inertiajs/react'
|
||||
import DocsCallout from '../../components/docs/DocsCallout'
|
||||
import DocsComparisonTable from '../../components/docs/DocsComparisonTable'
|
||||
import DocsFaqAccordion from '../../components/docs/DocsFaqAccordion'
|
||||
import DocsSection from '../../components/docs/DocsSection'
|
||||
import DocsSidebarNav from '../../components/docs/DocsSidebarNav'
|
||||
import DocsStepList from '../../components/docs/DocsStepList'
|
||||
import QuickstartNextSteps from '../../components/docs/QuickstartNextSteps'
|
||||
import SeoHead from '../../components/seo/SeoHead'
|
||||
import {
|
||||
ATTACHMENT_WORKFLOW_ITEMS,
|
||||
BEST_PRACTICES,
|
||||
BUILD_WORLD_STEPS,
|
||||
COMMON_MISTAKES,
|
||||
COMPARISON_COLUMNS,
|
||||
COMPARISON_ROWS,
|
||||
FAQ_ITEMS,
|
||||
HERO_METRICS,
|
||||
LIFECYCLE_ITEMS,
|
||||
MEDIA_AND_SEO_GUIDANCE,
|
||||
RECURRENCE_GUIDANCE,
|
||||
RELATED_HELP_ITEMS,
|
||||
RELATION_TYPE_ITEMS,
|
||||
SECTION_ITEMS,
|
||||
SECTION_ITEMS_DETAIL,
|
||||
TROUBLESHOOTING_ITEMS,
|
||||
WHAT_WORLDS_ARE_ITEMS,
|
||||
} from './worldsHelpContent'
|
||||
|
||||
function HeroMetric({ label, value, note }) {
|
||||
return (
|
||||
<div className="rounded-[24px] border border-white/10 bg-black/20 p-4">
|
||||
<div className="text-[11px] font-semibold uppercase tracking-[0.18em] text-slate-500">{label}</div>
|
||||
<div className="mt-2 text-lg font-semibold text-white">{value}</div>
|
||||
<p className="mt-2 text-sm leading-6 text-slate-400">{note}</p>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
function InsightCard({ item }) {
|
||||
return (
|
||||
<article className="rounded-[28px] border border-white/10 bg-black/20 p-5">
|
||||
<h3 className="text-lg font-semibold text-white">{item.title}</h3>
|
||||
<p className="mt-3 text-sm leading-7 text-slate-300">{item.body}</p>
|
||||
</article>
|
||||
)
|
||||
}
|
||||
|
||||
function BulletGrid({ items, tone = 'sky' }) {
|
||||
const dotColor = tone === 'amber' ? 'bg-amber-300' : tone === 'emerald' ? 'bg-emerald-300' : 'bg-sky-300'
|
||||
|
||||
return (
|
||||
<div className="grid gap-3 md:grid-cols-2">
|
||||
{items.map((item) => (
|
||||
<div key={item} className="rounded-[24px] border border-white/10 bg-black/20 p-4">
|
||||
<div className="flex gap-3 text-sm leading-6 text-slate-300">
|
||||
<span className={`mt-2 h-2 w-2 shrink-0 rounded-full ${dotColor}`} />
|
||||
<span>{item}</span>
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
function TroubleCard({ item, links }) {
|
||||
return (
|
||||
<a href={links[item.linkKey]} className="rounded-[28px] border border-white/10 bg-black/20 p-5 transition hover:border-white/20 hover:bg-white/[0.05]">
|
||||
<h3 className="text-lg font-semibold text-white">{item.title}</h3>
|
||||
<p className="mt-3 text-sm leading-7 text-slate-300">{item.body}</p>
|
||||
<div className="mt-4 flex items-center justify-between gap-3">
|
||||
<span className="text-sm font-semibold text-sky-200">{item.linkLabel}</span>
|
||||
<span className="text-slate-500">→</span>
|
||||
</div>
|
||||
</a>
|
||||
)
|
||||
}
|
||||
|
||||
export default function WorldsHelpPage() {
|
||||
const { props } = usePage()
|
||||
const links = props.links || {}
|
||||
|
||||
const jsonLd = [
|
||||
{
|
||||
'@context': 'https://schema.org',
|
||||
'@type': 'Article',
|
||||
headline: 'Worlds Help',
|
||||
description: props.description,
|
||||
url: props.seo?.canonical,
|
||||
author: {
|
||||
'@type': 'Organization',
|
||||
name: 'Skinbase',
|
||||
},
|
||||
about: ['Worlds', 'Seasonal campaigns', 'Editorial curation', 'Studio workflows', 'Homepage promotion'],
|
||||
},
|
||||
{
|
||||
'@context': 'https://schema.org',
|
||||
'@type': 'FAQPage',
|
||||
mainEntity: FAQ_ITEMS.map((item) => ({
|
||||
'@type': 'Question',
|
||||
name: item.question,
|
||||
acceptedAnswer: {
|
||||
'@type': 'Answer',
|
||||
text: item.answer,
|
||||
},
|
||||
})),
|
||||
},
|
||||
]
|
||||
|
||||
const relatedHelpItems = RELATED_HELP_ITEMS.map((item) => ({
|
||||
...item,
|
||||
href: links[item.linkKey],
|
||||
}))
|
||||
|
||||
return (
|
||||
<main className="min-h-screen bg-[radial-gradient(circle_at_top_left,_rgba(56,189,248,0.18),_transparent_23%),radial-gradient(circle_at_bottom_right,_rgba(249,115,22,0.16),_transparent_22%),linear-gradient(180deg,_#020617_0%,_#030712_100%)] px-4 py-8 sm:px-6 lg:px-8">
|
||||
<SeoHead seo={props.seo || {}} title={props.title} description={props.description} jsonLd={jsonLd} />
|
||||
|
||||
<div className="mx-auto max-w-[1500px]">
|
||||
<section id="introduction" className="rounded-[36px] border border-white/10 bg-[linear-gradient(135deg,rgba(15,23,42,0.92),rgba(15,23,42,0.72)),radial-gradient(circle_at_top_right,rgba(125,211,252,0.16),transparent_28%)] p-6 shadow-[0_30px_100px_rgba(2,6,23,0.35)] md:p-8 lg:p-10">
|
||||
<div className="grid gap-8 xl:grid-cols-[minmax(0,1fr)_360px]">
|
||||
<div>
|
||||
<p className="text-[11px] font-semibold uppercase tracking-[0.24em] text-sky-200/80">Worlds help</p>
|
||||
<h1 className="mt-3 max-w-4xl text-4xl font-semibold tracking-[-0.04em] text-white md:text-5xl xl:text-6xl">Worlds are where Skinbase Nova turns curated content into a live campaign surface.</h1>
|
||||
<p className="mt-5 max-w-3xl text-base leading-8 text-slate-300 md:text-lg">This guide explains what Worlds are, how attached content works, how section visibility and order shape the result, and how to preview, publish, promote, and reuse Worlds for recurring campaigns.</p>
|
||||
<div className="mt-6 flex flex-wrap gap-3">
|
||||
<a href={links.create_world} className="rounded-full border border-sky-300/25 bg-sky-300/12 px-5 py-3 text-sm font-semibold text-sky-100 transition hover:border-sky-300/40 hover:bg-sky-300/18">Create a World</a>
|
||||
<a href={links.studio_worlds} className="rounded-full border border-white/10 bg-white/[0.04] px-5 py-3 text-sm font-semibold text-white transition hover:border-white/20 hover:bg-white/[0.07]">Open Worlds workspace</a>
|
||||
<a href={links.worlds_index} className="rounded-full border border-white/10 bg-black/20 px-5 py-3 text-sm font-semibold text-slate-200 transition hover:border-white/20 hover:bg-white/[0.05]">Browse public Worlds</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="grid gap-3 sm:grid-cols-3 xl:grid-cols-1">
|
||||
{HERO_METRICS.map((metric) => (
|
||||
<HeroMetric key={metric.label} label={metric.label} value={metric.value} note={metric.note} />
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<div className="mt-8 grid gap-6 lg:grid-cols-[240px_minmax(0,1fr)] xl:grid-cols-[240px_minmax(0,1fr)_280px]">
|
||||
<DocsSidebarNav sections={SECTION_ITEMS} ariaLabel="Worlds help sections" selectLabel="Jump to Worlds help section" />
|
||||
|
||||
<div className="space-y-6">
|
||||
<DocsSection
|
||||
id="what-worlds-are"
|
||||
eyebrow="Foundations"
|
||||
title="What Worlds are"
|
||||
summary="Worlds are premium editorial destinations for campaign moments, not just another listing surface. They combine identity, structure, and curation into one public result."
|
||||
>
|
||||
<div className="grid gap-4 xl:grid-cols-3">
|
||||
{WHAT_WORLDS_ARE_ITEMS.map((item) => (
|
||||
<InsightCard key={item.title} item={item} />
|
||||
))}
|
||||
</div>
|
||||
|
||||
<div className="mt-6 grid gap-4 md:grid-cols-3">
|
||||
{LIFECYCLE_ITEMS.map((item) => (
|
||||
<InsightCard key={item.title} item={item} />
|
||||
))}
|
||||
</div>
|
||||
|
||||
<div className="mt-6">
|
||||
<DocsCallout tone="note" title="The shortest useful definition">
|
||||
A World is one hero, one short intro, one clear CTA, and a controlled set of attached modules arranged like an editorial campaign rather than a generic content pile.
|
||||
</DocsCallout>
|
||||
</div>
|
||||
</DocsSection>
|
||||
|
||||
<DocsSection
|
||||
id="worlds-vs-other-surfaces"
|
||||
eyebrow="Format choice"
|
||||
title="Worlds vs other public surfaces"
|
||||
summary="Use a World when the real need is a campaign hub. If the job is simpler, another surface may be a better fit."
|
||||
>
|
||||
<DocsComparisonTable columns={COMPARISON_COLUMNS} rows={COMPARISON_ROWS} caption="Comparison between Worlds, collections, and Group pages" />
|
||||
|
||||
<div className="mt-6 grid gap-4 md:grid-cols-2">
|
||||
<DocsCallout tone="tip" title="Choose a World when curation needs structure">
|
||||
If the page needs multiple content modules, campaign identity, timing, and possible homepage promotion, a World is usually the right answer.
|
||||
</DocsCallout>
|
||||
<DocsCallout tone="warning" title="Do not use Worlds when a simpler surface is enough">
|
||||
If the content only needs a list, collection, or shared identity page, using a World can make the workflow heavier than necessary.
|
||||
</DocsCallout>
|
||||
</div>
|
||||
</DocsSection>
|
||||
|
||||
<DocsSection
|
||||
id="building-a-world"
|
||||
eyebrow="Workflow"
|
||||
title="Building a World"
|
||||
summary="The editorial workflow is deliberate: define the campaign identity, attach the right content, check structure, preview the result, then publish only when the page reads clearly."
|
||||
>
|
||||
<DocsStepList items={BUILD_WORLD_STEPS} />
|
||||
</DocsSection>
|
||||
|
||||
<DocsSection
|
||||
id="attached-content-and-sections"
|
||||
eyebrow="Composition"
|
||||
title="Attached content and sections"
|
||||
summary="Attachments are the heart of the World system. They let editors compose a campaign hub out of explicit, curated relations instead of relying on vague automation."
|
||||
>
|
||||
<div className="grid gap-4 md:grid-cols-3">
|
||||
{ATTACHMENT_WORKFLOW_ITEMS.map((item) => (
|
||||
<InsightCard key={item.title} item={item} />
|
||||
))}
|
||||
</div>
|
||||
|
||||
<div className="mt-6">
|
||||
<p className="text-[11px] font-semibold uppercase tracking-[0.18em] text-sky-200/80">Supported attached entity types</p>
|
||||
<div className="mt-4">
|
||||
<BulletGrid items={RELATION_TYPE_ITEMS} tone="emerald" />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="mt-6">
|
||||
<p className="text-[11px] font-semibold uppercase tracking-[0.18em] text-sky-200/80">Built-in World sections</p>
|
||||
<div className="mt-4 grid gap-4 xl:grid-cols-3">
|
||||
{SECTION_ITEMS_DETAIL.map((item) => (
|
||||
<InsightCard key={item.title} item={item} />
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="mt-6 grid gap-4 md:grid-cols-2">
|
||||
<DocsCallout tone="practice" title="Section order and section presence are different controls">
|
||||
Reordering changes where a module appears. Visibility decides whether that module appears at all. Strong Worlds use both intentionally.
|
||||
</DocsCallout>
|
||||
<DocsCallout tone="note" title="Attached content can stay private to the editor layout">
|
||||
A section can remain disabled on the public page even if attached items exist for it. This is useful when editors are still shaping the campaign or intentionally trimming the public result.
|
||||
</DocsCallout>
|
||||
</div>
|
||||
</DocsSection>
|
||||
|
||||
<DocsSection
|
||||
id="preview-publishing-and-promotion"
|
||||
eyebrow="Confidence"
|
||||
title="Preview, publishing, and promotion"
|
||||
summary="Worlds are meant for real campaign operations, so lifecycle and promotion state need to be visible and understandable before anything goes public."
|
||||
>
|
||||
<div className="grid gap-4 md:grid-cols-3">
|
||||
{LIFECYCLE_ITEMS.map((item) => (
|
||||
<InsightCard key={item.title} item={item} />
|
||||
))}
|
||||
</div>
|
||||
|
||||
<div className="mt-6 grid gap-4 md:grid-cols-2">
|
||||
<DocsCallout tone="tip" title="Use preview as a safety check">
|
||||
Check the hero, cover, CTA, badge, section order, and attached content hierarchy before moving a World into a public or promoted lifecycle state.
|
||||
</DocsCallout>
|
||||
<DocsCallout tone="warning" title="Featured promotion is stronger than just publish">
|
||||
A World can be publicly visible at its own URL without also being ready for homepage or spotlight promotion. Treat those decisions separately.
|
||||
</DocsCallout>
|
||||
</div>
|
||||
</DocsSection>
|
||||
|
||||
<DocsSection
|
||||
id="recurrence-and-new-editions"
|
||||
eyebrow="Reuse"
|
||||
title="Recurrence and new editions"
|
||||
summary="Recurring campaigns should be easy to understand operationally. Worlds include recurrence fields and duplication actions so campaign families can evolve cleanly over time."
|
||||
>
|
||||
<BulletGrid items={RECURRENCE_GUIDANCE} tone="sky" />
|
||||
|
||||
<div className="mt-6">
|
||||
<DocsCallout tone="practice" title="Think in campaign families">
|
||||
“Halloween 2026” and “Halloween 2027” should feel like different editions of the same family, not like unrelated Worlds with manually repeated structure.
|
||||
</DocsCallout>
|
||||
</div>
|
||||
</DocsSection>
|
||||
|
||||
<DocsSection
|
||||
id="media-seo-and-theme-presets"
|
||||
eyebrow="Presentation"
|
||||
title="Media, SEO, and theme presets"
|
||||
summary="Worlds are visual and promotional. Theme presets accelerate setup, while media and SEO fields shape how the page reads inside the platform and when shared outward."
|
||||
>
|
||||
<BulletGrid items={MEDIA_AND_SEO_GUIDANCE} tone="amber" />
|
||||
|
||||
<div className="mt-6 grid gap-4 md:grid-cols-2">
|
||||
<DocsCallout tone="note" title="Current media workflow">
|
||||
Worlds currently use absolute URLs or CDN storage paths for cover and OG assets. The editor includes asset previews and is already prepared for a future shared media picker.
|
||||
</DocsCallout>
|
||||
<DocsCallout tone="tip" title="Use presets to move faster, not to stop thinking">
|
||||
Theme presets should give you a strong start. Editors should still adjust the result when the campaign needs a sharper, more specific identity.
|
||||
</DocsCallout>
|
||||
</div>
|
||||
</DocsSection>
|
||||
|
||||
<DocsSection
|
||||
id="best-practices"
|
||||
eyebrow="Quality habits"
|
||||
title="Best practices"
|
||||
summary="Strong Worlds feel editorially intentional. Every section, asset, and attached item should earn its place."
|
||||
>
|
||||
<BulletGrid items={BEST_PRACTICES} tone="emerald" />
|
||||
</DocsSection>
|
||||
|
||||
<DocsSection
|
||||
id="common-mistakes"
|
||||
eyebrow="Avoid this"
|
||||
title="Common mistakes"
|
||||
summary="Most Worlds problems are not technical. They come from weak curation, unclear promotion decisions, or using the wrong format for the job."
|
||||
>
|
||||
<BulletGrid items={COMMON_MISTAKES} tone="amber" />
|
||||
</DocsSection>
|
||||
|
||||
<DocsSection
|
||||
id="faq"
|
||||
eyebrow="FAQ"
|
||||
title="Worlds FAQ"
|
||||
summary="These answers cover the most common editorial and workflow questions about creating, attaching, and promoting Worlds."
|
||||
>
|
||||
<DocsFaqAccordion items={FAQ_ITEMS} />
|
||||
</DocsSection>
|
||||
|
||||
<DocsSection
|
||||
id="troubleshooting"
|
||||
eyebrow="Troubleshooting"
|
||||
title="Troubleshooting"
|
||||
summary="Use these routes when the problem is access, preview quality, format choice, publishing readiness, or an editor workflow issue."
|
||||
>
|
||||
<div className="grid gap-4 xl:grid-cols-2">
|
||||
{TROUBLESHOOTING_ITEMS.map((item) => (
|
||||
<TroubleCard key={item.title} item={item} links={links} />
|
||||
))}
|
||||
</div>
|
||||
</DocsSection>
|
||||
|
||||
<DocsSection
|
||||
id="related-help"
|
||||
eyebrow="Next steps"
|
||||
title="Related help"
|
||||
summary="Use these links when Worlds are understood and the next question is about adjacent workflows such as Studio, uploads, cards, or Group collaboration."
|
||||
>
|
||||
<QuickstartNextSteps items={relatedHelpItems} />
|
||||
</DocsSection>
|
||||
</div>
|
||||
|
||||
<aside className="hidden xl:block xl:sticky xl:top-24 xl:self-start">
|
||||
<div className="space-y-4 rounded-[28px] border border-white/10 bg-white/[0.03] p-5 shadow-[0_18px_50px_rgba(2,6,23,0.22)]">
|
||||
<div>
|
||||
<p className="text-[11px] font-semibold uppercase tracking-[0.18em] text-sky-200/80">Quick route map</p>
|
||||
<div className="mt-4 space-y-2">
|
||||
<a href={links.create_world} className="block rounded-2xl border border-white/10 bg-black/20 px-4 py-3 text-sm font-semibold text-white transition hover:border-white/20 hover:bg-white/[0.05]">Create a World</a>
|
||||
<a href={links.studio_worlds} className="block rounded-2xl border border-white/10 bg-black/20 px-4 py-3 text-sm font-semibold text-white transition hover:border-white/20 hover:bg-white/[0.05]">Open Worlds workspace</a>
|
||||
<a href={links.worlds_index} className="block rounded-2xl border border-white/10 bg-black/20 px-4 py-3 text-sm font-semibold text-white transition hover:border-white/20 hover:bg-white/[0.05]">Browse public Worlds</a>
|
||||
<a href={links.studio_help} className="block rounded-2xl border border-white/10 bg-black/20 px-4 py-3 text-sm font-semibold text-white transition hover:border-white/20 hover:bg-white/[0.05]">Read Studio help</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="rounded-[24px] border border-sky-300/20 bg-sky-400/10 p-4 text-sky-50">
|
||||
<div className="text-[11px] font-semibold uppercase tracking-[0.16em] text-sky-100/80">Fast reminder</div>
|
||||
<p className="mt-2 text-sm leading-6 text-sky-50/85">A World should feel like an editorial decision, not a container. If the page feels cluttered, the usual fix is stronger curation, fewer modules, and clearer promotion intent.</p>
|
||||
</div>
|
||||
</div>
|
||||
</aside>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
)
|
||||
}
|
||||
@@ -10,7 +10,11 @@ export const SEARCH_SUGGESTIONS = [
|
||||
'troubleshooting',
|
||||
'forgot password',
|
||||
'create card',
|
||||
'create world',
|
||||
'cards help',
|
||||
'worlds help',
|
||||
'seasonal world',
|
||||
'attached relations',
|
||||
'profile help',
|
||||
'profile bio',
|
||||
'publish artwork',
|
||||
@@ -54,6 +58,18 @@ export const HIGHLIGHTED_GUIDES = [
|
||||
secondaryLabel: 'Create a card',
|
||||
tags: ['cards', 'design', 'publishing'],
|
||||
},
|
||||
{
|
||||
eyebrow: 'Live now',
|
||||
title: 'Worlds help',
|
||||
description: 'A complete guide to building editorial Worlds, attaching curated content, controlling sections, previewing the result, and publishing with confidence.',
|
||||
status: 'Guide',
|
||||
tone: 'sky',
|
||||
primaryLinkKey: 'help_worlds',
|
||||
primaryLabel: 'Read Worlds help',
|
||||
secondaryLinkKey: 'create_world',
|
||||
secondaryLabel: 'Create a world',
|
||||
tags: ['worlds', 'campaigns', 'editorial', 'attached relations'],
|
||||
},
|
||||
{
|
||||
eyebrow: 'Live now',
|
||||
title: 'Profile help',
|
||||
@@ -173,6 +189,20 @@ export const FEATURED_GUIDES = [
|
||||
highlights: ['Now live as the dedicated Cards format guide', 'Explains format choice, ownership, and creator-friendly best practices'],
|
||||
tags: ['cards', 'design', 'editorial'],
|
||||
},
|
||||
{
|
||||
eyebrow: 'Priority topic',
|
||||
title: 'Worlds',
|
||||
description: 'Learn how to build seasonal, event, and campaign destinations with curated attachments, section control, preview workflows, and homepage promotion readiness.',
|
||||
status: 'Live now',
|
||||
tone: 'sky',
|
||||
plannedPath: '/help/worlds',
|
||||
primaryLinkKey: 'help_worlds',
|
||||
primaryLabel: 'Read Worlds help',
|
||||
secondaryLinkKey: 'worlds_index',
|
||||
secondaryLabel: 'Browse public Worlds',
|
||||
highlights: ['Now live as the dedicated Worlds editorial workflow guide', 'Explains attached content, recurrence, preview, and promotion clearly'],
|
||||
tags: ['worlds', 'campaigns', 'seasonal'],
|
||||
},
|
||||
{
|
||||
eyebrow: 'Priority topic',
|
||||
title: 'Profile',
|
||||
@@ -288,6 +318,18 @@ export const HELP_CATEGORIES = [
|
||||
secondaryLabel: 'Open upload',
|
||||
tags: ['upload', 'artwork', 'publish'],
|
||||
},
|
||||
{
|
||||
eyebrow: 'Portfolio',
|
||||
title: 'Worlds',
|
||||
description: 'Learn how to create and manage editorial Worlds with curated attachments, section visibility, preview, recurrence, and promotion workflows.',
|
||||
status: 'Live',
|
||||
plannedPath: '/help/worlds',
|
||||
primaryLinkKey: 'help_worlds',
|
||||
primaryLabel: 'Read Worlds help',
|
||||
secondaryLinkKey: 'studio_worlds',
|
||||
secondaryLabel: 'Open Worlds workspace',
|
||||
tags: ['worlds', 'editorial', 'campaigns'],
|
||||
},
|
||||
{
|
||||
eyebrow: 'Portfolio',
|
||||
title: 'Artworks',
|
||||
@@ -615,6 +657,12 @@ export const POPULAR_HELP_TOPICS = [
|
||||
linkKey: 'help_cards',
|
||||
tags: ['cards', 'guide', 'design'],
|
||||
},
|
||||
{
|
||||
title: 'How Worlds work',
|
||||
description: 'Read the Worlds guide to understand editorial purpose, attached content, preview, section control, recurrence, and homepage promotion.',
|
||||
linkKey: 'help_worlds',
|
||||
tags: ['worlds', 'campaigns', 'editorial'],
|
||||
},
|
||||
{
|
||||
title: 'How profiles work',
|
||||
description: 'Read the Profile guide to understand setup, identity clarity, presentation, and how personal presence fits beside Group activity.',
|
||||
|
||||
310
resources/js/Pages/Help/worldsHelpContent.js
Normal file
310
resources/js/Pages/Help/worldsHelpContent.js
Normal file
@@ -0,0 +1,310 @@
|
||||
export const SECTION_ITEMS = [
|
||||
{ id: 'what-worlds-are', label: 'What Worlds are' },
|
||||
{ id: 'worlds-vs-other-surfaces', label: 'Worlds vs other surfaces' },
|
||||
{ id: 'building-a-world', label: 'Building a World' },
|
||||
{ id: 'attached-content-and-sections', label: 'Attached content and sections' },
|
||||
{ id: 'preview-publishing-and-promotion', label: 'Preview, publishing, and promotion' },
|
||||
{ id: 'recurrence-and-new-editions', label: 'Recurrence and new editions' },
|
||||
{ id: 'media-seo-and-theme-presets', label: 'Media, SEO, and theme presets' },
|
||||
{ id: 'best-practices', label: 'Best practices' },
|
||||
{ id: 'common-mistakes', label: 'Common mistakes' },
|
||||
{ id: 'faq', label: 'FAQ' },
|
||||
{ id: 'troubleshooting', label: 'Troubleshooting' },
|
||||
{ id: 'related-help', label: 'Related help' },
|
||||
]
|
||||
|
||||
export const HERO_METRICS = [
|
||||
{
|
||||
label: 'Core purpose',
|
||||
value: 'Editorial campaign hub',
|
||||
note: 'A World is a curated destination for seasonal, event, tribute, or campaign storytelling across multiple content types.',
|
||||
},
|
||||
{
|
||||
label: 'Operational strength',
|
||||
value: 'Attached content with structure',
|
||||
note: 'Worlds are built from explicit attachments, section order, section visibility, and preview-first editorial review.',
|
||||
},
|
||||
{
|
||||
label: 'Golden rule',
|
||||
value: 'Curate, then publish',
|
||||
note: 'A World should feel intentional before it goes live. Treat preview, section checks, and promotion scope as part of the workflow.',
|
||||
},
|
||||
]
|
||||
|
||||
export const WHAT_WORLDS_ARE_ITEMS = [
|
||||
{
|
||||
title: 'Worlds are not filters',
|
||||
body: 'A World is not just a search result, category page, or tag landing page. It is an editorial surface shaped around a theme, moment, or campaign.',
|
||||
},
|
||||
{
|
||||
title: 'Worlds bundle multiple content types',
|
||||
body: 'A single World can attach artworks, collections, creators, groups, news, challenges, events, releases, and cards into one public-facing story.',
|
||||
},
|
||||
{
|
||||
title: 'Worlds are designed for reuse',
|
||||
body: 'Recurring campaigns such as Halloween, Pixel Week, or tribute weeks can be rolled forward into new editions instead of rebuilt from scratch.',
|
||||
},
|
||||
]
|
||||
|
||||
export const COMPARISON_COLUMNS = [
|
||||
{ key: 'topic', label: 'Topic' },
|
||||
{ key: 'world', label: 'World' },
|
||||
{ key: 'collection', label: 'Collection' },
|
||||
{ key: 'group', label: 'Group page' },
|
||||
]
|
||||
|
||||
export const COMPARISON_ROWS = [
|
||||
{
|
||||
id: 'purpose',
|
||||
topic: 'Primary purpose',
|
||||
world: 'Run a themed editorial or seasonal campaign with curated modules and promotion logic.',
|
||||
collection: 'Organize a set of items into a more focused list or presentation set.',
|
||||
group: 'Represent a shared identity, members, and collaboration activity under one collective surface.',
|
||||
},
|
||||
{
|
||||
id: 'composition',
|
||||
topic: 'How content is assembled',
|
||||
world: 'Explicit attachments are placed into named sections such as featured artworks, creators, events, and news.',
|
||||
collection: 'Items are gathered into a collection-first structure rather than a multi-module campaign layout.',
|
||||
group: 'Content is shaped by ownership, members, and shared publishing rather than editorial campaign modules.',
|
||||
},
|
||||
{
|
||||
id: 'public-output',
|
||||
topic: 'Public output',
|
||||
world: 'One hero, one intro, optional CTA and badge, then a controlled set of editorial modules.',
|
||||
collection: 'A more focused item grouping surface.',
|
||||
group: 'A public identity and activity surface for the collective itself.',
|
||||
},
|
||||
{
|
||||
id: 'promotion',
|
||||
topic: 'Promotion role',
|
||||
world: 'Can stand alone at its own URL or be promoted on Worlds surfaces and homepage spotlight areas.',
|
||||
collection: 'Usually promoted as a collection destination rather than a campaign system.',
|
||||
group: 'Promotion is about the Group and its output, not a dedicated campaign moment.',
|
||||
},
|
||||
{
|
||||
id: 'reuse',
|
||||
topic: 'Operational reuse',
|
||||
world: 'Supports duplication and next-edition workflows for recurring campaigns.',
|
||||
collection: 'Usually reused by copying or curating a new collection manually.',
|
||||
group: 'Persistent long-term identity, not a short-term edition workflow.',
|
||||
},
|
||||
]
|
||||
|
||||
export const BUILD_WORLD_STEPS = [
|
||||
{
|
||||
title: 'Choose the World type and title',
|
||||
description: 'Pick the clearest campaign framing first: seasonal, event, campaign, or tribute. Use a title that still reads well in preview, homepage spotlight, and archive contexts.',
|
||||
},
|
||||
{
|
||||
title: 'Select a theme preset',
|
||||
description: 'Theme presets can prefill accent colors, background motif, icon, related tags, and suggested badge or CTA labels, while still allowing manual overrides.',
|
||||
},
|
||||
{
|
||||
title: 'Write the intro and define the identity',
|
||||
description: 'Add tagline, summary, description, badge, CTA, and the visual identity needed to make the public page feel coherent.',
|
||||
},
|
||||
{
|
||||
title: 'Attach curated content',
|
||||
description: 'Use the relation picker to search supported entity types, assign them to sections, mark featured items, and add context labels when needed.',
|
||||
},
|
||||
{
|
||||
title: 'Adjust section order and visibility',
|
||||
description: 'Control both where modules appear and whether they appear at all. A World should show only the sections that help the campaign land cleanly.',
|
||||
},
|
||||
{
|
||||
title: 'Set lifecycle and recurrence',
|
||||
description: 'Define status, publish timing, campaign window, featured promotion state, and recurring edition metadata before the page goes live.',
|
||||
},
|
||||
{
|
||||
title: 'Preview before publish',
|
||||
description: 'Use the mini preview for in-editor confidence and the full preview page for a public-surface check before publishing or featuring the World.',
|
||||
},
|
||||
]
|
||||
|
||||
export const ATTACHMENT_WORKFLOW_ITEMS = [
|
||||
{
|
||||
title: 'The relation picker is the composition tool',
|
||||
body: 'Add relation opens a structured picker with entity type, search, result previews, section assignment, featured state, and optional context labels.',
|
||||
},
|
||||
{
|
||||
title: 'Attachments belong to specific sections',
|
||||
body: 'Each attached item is placed intentionally into a section such as featured artworks, curated collections, related events, or themed cards.',
|
||||
},
|
||||
{
|
||||
title: 'Attached rows stay editable',
|
||||
body: 'After attachment, relation cards support edit, remove, and reorder actions so the final World reads like deliberate editorial composition rather than a hidden data list.',
|
||||
},
|
||||
]
|
||||
|
||||
export const SECTION_ITEMS_DETAIL = [
|
||||
{ title: 'Featured artworks', body: 'Standout pieces curated for the World.' },
|
||||
{ title: 'Curated collections', body: 'Collections that deepen the theme and reward longer exploration.' },
|
||||
{ title: 'Featured creators', body: 'Creators shaping the atmosphere of the moment.' },
|
||||
{ title: 'Featured groups', body: 'Collectives, scenes, and crews connected to the campaign.' },
|
||||
{ title: 'Related news', body: 'Editorial context, announcements, and stories tied to the World.' },
|
||||
{ title: 'Challenge spotlight', body: 'Challenges attached to the campaign or recent participation around it.' },
|
||||
{ title: 'Related events', body: 'Upcoming or recent sessions, launches, and live moments.' },
|
||||
{ title: 'Release spotlights', body: 'Projects and releases that belong in the campaign space.' },
|
||||
{ title: 'Themed cards', body: 'Nova Cards that extend the World identity into designed communication surfaces.' },
|
||||
]
|
||||
|
||||
export const RELATION_TYPE_ITEMS = [
|
||||
'Artworks',
|
||||
'Collections',
|
||||
'Creators',
|
||||
'Groups',
|
||||
'News articles',
|
||||
'Challenges',
|
||||
'Events',
|
||||
'Releases',
|
||||
'Cards',
|
||||
]
|
||||
|
||||
export const LIFECYCLE_ITEMS = [
|
||||
{
|
||||
title: 'Draft, scheduled, live, and archived thinking',
|
||||
body: 'Worlds move through an editorial lifecycle. Drafts are private workspaces, published Worlds can be scheduled or already live, and archive state keeps past editions visible when the campaign has ended.',
|
||||
},
|
||||
{
|
||||
title: 'Featured promotion goes beyond the page itself',
|
||||
body: 'When a World is marked for homepage and Worlds spotlight treatment, it moves from a standalone public page into platform-level campaign promotion readiness.',
|
||||
},
|
||||
{
|
||||
title: 'The summary card is operational, not decorative',
|
||||
body: 'Use the editor summary to verify lifecycle state, campaign window, theme, recurrence, relation count, enabled sections, and current promotion scope at a glance.',
|
||||
},
|
||||
]
|
||||
|
||||
export const RECURRENCE_GUIDANCE = [
|
||||
'Turn on recurring mode when the World belongs to a repeatable campaign family such as halloween, retro-month, or pixel-week.',
|
||||
'The recurrence key identifies the campaign family. The edition year identifies the current edition within that family.',
|
||||
'Duplicate plus new-edition actions exist so editors can roll successful Worlds forward into the next campaign cycle more safely.',
|
||||
'Recurring Worlds should not reuse the same recurrence key and edition year pair. Each edition needs its own distinct year value.',
|
||||
]
|
||||
|
||||
export const MEDIA_AND_SEO_GUIDANCE = [
|
||||
'Theme presets are acceleration tools, not constraints. Editors can override autofilled colors, motif, icon, tags, badge label, and CTA label at any time.',
|
||||
'Cover and OG assets currently use absolute URLs or CDN storage paths. The editor already includes preview support and is prepared for a future shared media picker.',
|
||||
'CTA label and URL should represent the real campaign action: explore, join, enter, submit, discover, or a similar world-specific path.',
|
||||
'SEO title, SEO description, and OG image should describe the World as a public destination, not as an internal draft.',
|
||||
]
|
||||
|
||||
export const BEST_PRACTICES = [
|
||||
'Lead with one strong hero idea instead of trying to make the World cover every possible related surface.',
|
||||
'Attach only the content that sharpens the campaign. More relations do not automatically create a better World.',
|
||||
'Use section visibility deliberately so empty or weak modules do not dilute the page.',
|
||||
'Preview the World before publish, especially when promotion scope or homepage spotlight is involved.',
|
||||
'Use recurrence metadata and new-edition workflows for annual campaigns instead of rebuilding the structure manually each year.',
|
||||
'Keep CTA, badge, summary, and theme signals aligned so the World feels like one coherent editorial destination.',
|
||||
]
|
||||
|
||||
export const COMMON_MISTAKES = [
|
||||
'Treating a World like a generic dump of related content instead of an intentional editorial surface.',
|
||||
'Leaving sections enabled just because attachments exist, even when those modules do not strengthen the public story.',
|
||||
'Marking a World as featured without checking whether the campaign is truly ready for homepage or spotlight promotion.',
|
||||
'Ignoring recurrence fields until the next edition arrives and the campaign family becomes harder to manage.',
|
||||
'Using weak asset paths or unreviewed OG values that make the preview feel unfinished.',
|
||||
'Confusing Worlds with collections, group pages, or challenges when the real need is a different public surface.',
|
||||
]
|
||||
|
||||
export const FAQ_ITEMS = [
|
||||
{
|
||||
question: 'What is a World on Skinbase Nova?',
|
||||
answer: 'A World is a curated editorial destination for a seasonal moment, event, tribute, or campaign. It combines one strong hero with a controlled set of attached modules and optional promotion across public surfaces.',
|
||||
},
|
||||
{
|
||||
question: 'What can I attach to a World?',
|
||||
answer: 'Worlds can attach artworks, collections, creators, groups, news, challenges, events, releases, and cards. Each item is assigned to a specific section so the page stays structured.',
|
||||
},
|
||||
{
|
||||
question: 'Can I preview a World before publishing?',
|
||||
answer: 'Yes. The editor includes a mini preview for live confidence and a dedicated full preview page for saved Worlds so editors can check the public result before it goes live.',
|
||||
},
|
||||
{
|
||||
question: 'How is a World different from a collection?',
|
||||
answer: 'A collection groups content. A World is a larger editorial campaign surface with multiple module types, lifecycle controls, promotion readiness, and recurrence support.',
|
||||
},
|
||||
{
|
||||
question: 'What does featured promotion mean?',
|
||||
answer: 'Featured promotion means the World is eligible for promoted Worlds surfaces and homepage spotlight treatment once it is in the right lifecycle state.',
|
||||
},
|
||||
{
|
||||
question: 'How do recurring Worlds work?',
|
||||
answer: 'Recurring Worlds use a recurrence key to identify the campaign family and an edition year to identify the specific edition. Duplicate and new-edition actions help you roll the structure forward.',
|
||||
},
|
||||
{
|
||||
question: 'Can I hide sections even if attachments exist?',
|
||||
answer: 'Yes. Section visibility is explicit. A module can remain disabled on the public page even if attached relations exist for that section.',
|
||||
},
|
||||
]
|
||||
|
||||
export const TROUBLESHOOTING_ITEMS = [
|
||||
{
|
||||
title: 'I can’t find the Worlds workspace',
|
||||
body: 'Start from Studio and open the Worlds index. If you still do not have access, the issue may be permission-related rather than route-related.',
|
||||
linkKey: 'studio_worlds',
|
||||
linkLabel: 'Open Worlds workspace',
|
||||
},
|
||||
{
|
||||
title: 'My World does not look right in preview',
|
||||
body: 'Review hero copy, attached relations, section visibility, theme overrides, and cover or OG asset paths before publishing.',
|
||||
linkKey: 'create_world',
|
||||
linkLabel: 'Open create World flow',
|
||||
},
|
||||
{
|
||||
title: 'I’m not sure whether this should be a World',
|
||||
body: 'If the need is a multi-module campaign hub with editorial curation and promotion, use a World. If not, the better answer may be a collection, group surface, or another publishing format.',
|
||||
linkKey: 'help_cards',
|
||||
linkLabel: 'Compare with other creative formats',
|
||||
},
|
||||
{
|
||||
title: 'I can’t publish or feature the World',
|
||||
body: 'Check the lifecycle state, campaign dates, and whether the attached content and section controls are ready for a public or promoted surface.',
|
||||
linkKey: 'studio_help',
|
||||
linkLabel: 'Read Studio workflow help',
|
||||
},
|
||||
{
|
||||
title: 'The attached content feels messy',
|
||||
body: 'Trim the relation list, move items into clearer sections, and disable weak modules. Worlds work best when the page is curated, not crowded.',
|
||||
linkKey: 'worlds_index',
|
||||
linkLabel: 'Browse live Worlds for reference',
|
||||
},
|
||||
{
|
||||
title: 'A route or editor action feels broken',
|
||||
body: 'Use support or bug reporting when the problem is not editorial uncertainty but an actual platform issue with the workflow.',
|
||||
linkKey: 'report_issue',
|
||||
linkLabel: 'Report a problem',
|
||||
},
|
||||
]
|
||||
|
||||
export const RELATED_HELP_ITEMS = [
|
||||
{
|
||||
eyebrow: 'Live help',
|
||||
title: 'Studio help',
|
||||
body: 'Use the Studio guide when the real question is about workspace context, drafts, publishing behavior, or creator operations beyond Worlds.',
|
||||
linkKey: 'studio_help',
|
||||
tone: 'sky',
|
||||
},
|
||||
{
|
||||
eyebrow: 'Live help',
|
||||
title: 'Upload help',
|
||||
body: 'Use Upload help when the blocker is asset preparation, artwork metadata, or the publishing workflow feeding into a World.',
|
||||
linkKey: 'upload_help',
|
||||
tone: 'amber',
|
||||
},
|
||||
{
|
||||
eyebrow: 'Live help',
|
||||
title: 'Cards help',
|
||||
body: 'Use Cards help when the question is really about designed communication surfaces that may later be attached to a World.',
|
||||
linkKey: 'help_cards',
|
||||
tone: 'white',
|
||||
},
|
||||
{
|
||||
eyebrow: 'Live help',
|
||||
title: 'Groups help',
|
||||
body: 'Use Groups help when the campaign work is tied to shared identity, contributors, collaboration, or group-owned publishing.',
|
||||
linkKey: 'groups_help',
|
||||
tone: 'white',
|
||||
},
|
||||
]
|
||||
Reference in New Issue
Block a user