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 (
{label}
{value}

{note}

) } function InsightCard({ item }) { return (

{item.title}

{item.body}

) } function BulletGrid({ items, tone = 'sky' }) { const dotColor = tone === 'amber' ? 'bg-amber-300' : tone === 'emerald' ? 'bg-emerald-300' : 'bg-sky-300' return (
{items.map((item) => (
{item}
))}
) } function TroubleCard({ item, links }) { return (

{item.title}

{item.body}

{item.linkLabel}
) } 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 (

Worlds help

Worlds are where Skinbase Nova turns curated content into a live campaign surface.

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.

{HERO_METRICS.map((metric) => ( ))}
{WHAT_WORLDS_ARE_ITEMS.map((item) => ( ))}
{LIFECYCLE_ITEMS.map((item) => ( ))}
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.
If the page needs multiple content modules, campaign identity, timing, and possible homepage promotion, a World is usually the right answer. If the content only needs a list, collection, or shared identity page, using a World can make the workflow heavier than necessary.
{ATTACHMENT_WORKFLOW_ITEMS.map((item) => ( ))}

Supported attached entity types

Built-in World sections

{SECTION_ITEMS_DETAIL.map((item) => ( ))}
Reordering changes where a module appears. Visibility decides whether that module appears at all. Strong Worlds use both intentionally. 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.
{LIFECYCLE_ITEMS.map((item) => ( ))}
Check the hero, cover, CTA, badge, section order, and attached content hierarchy before moving a World into a public or promoted lifecycle state. A World can be publicly visible at its own URL without also being ready for homepage or spotlight promotion. Treat those decisions separately.
“Halloween 2026” and “Halloween 2027” should feel like different editions of the same family, not like unrelated Worlds with manually repeated structure.
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. Theme presets should give you a strong start. Editors should still adjust the result when the campaign needs a sharper, more specific identity.
{TROUBLESHOOTING_ITEMS.map((item) => ( ))}
) }