302 lines
15 KiB
JavaScript
302 lines
15 KiB
JavaScript
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 {
|
|
BEST_PRACTICES,
|
|
COMMON_MISTAKES,
|
|
COMPARISON_COLUMNS,
|
|
COMPARISON_ROWS,
|
|
CREATION_STEPS,
|
|
FAQ_ITEMS,
|
|
FORMAT_SIGNAL_ITEMS,
|
|
HERO_METRICS,
|
|
OWNERSHIP_BULLETS,
|
|
OWNERSHIP_ITEMS,
|
|
RELATED_HELP_ITEMS,
|
|
SECTION_ITEMS,
|
|
TROUBLESHOOTING_ITEMS,
|
|
WHAT_CARDS_ARE_ITEMS,
|
|
WORKFLOW_EXAMPLES,
|
|
} from './cardsHelpContent'
|
|
|
|
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 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 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 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 CardsHelpPage() {
|
|
const { props } = usePage()
|
|
const links = props.links || {}
|
|
|
|
const jsonLd = [
|
|
{
|
|
'@context': 'https://schema.org',
|
|
'@type': 'Article',
|
|
headline: 'Cards Help',
|
|
description: props.description,
|
|
url: props.seo?.canonical,
|
|
author: {
|
|
'@type': 'Organization',
|
|
name: 'Skinbase',
|
|
},
|
|
about: ['Cards', 'Studio', 'Publishing', 'Visual communication', 'Group workflows'],
|
|
},
|
|
{
|
|
'@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(250,204,21,0.14),_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">Cards help</p>
|
|
<h1 className="mt-3 max-w-4xl text-4xl font-semibold tracking-[-0.04em] text-white md:text-5xl xl:text-6xl">Cards are for ideas that need design, presentation, and message to work together.</h1>
|
|
<p className="mt-5 max-w-3xl text-base leading-8 text-slate-300 md:text-lg">This page explains what Cards are on Skinbase, how they differ from artworks, posts, and collections, how to create and publish them, and how to use them well in both personal and Group workflows.</p>
|
|
<div className="mt-6 flex flex-wrap gap-3">
|
|
<a href={links.create_card} 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 Card</a>
|
|
<a href={links.studio_cards} 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 Cards workspace</a>
|
|
<a href={links.cards_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 Cards</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="Cards help sections" selectLabel="Jump to Cards help section" />
|
|
|
|
<div className="space-y-6">
|
|
<DocsSection
|
|
id="what-cards-are"
|
|
eyebrow="Foundations"
|
|
title="What Cards are"
|
|
summary="Cards are a creative format for visual communication. They are made for ideas that need design, layout, and message to land together in one polished public-facing unit."
|
|
>
|
|
<div className="grid gap-4 xl:grid-cols-3">
|
|
{WHAT_CARDS_ARE_ITEMS.map((item) => (
|
|
<InsightCard key={item.title} item={item} />
|
|
))}
|
|
</div>
|
|
|
|
<div className="mt-6">
|
|
<BulletGrid items={FORMAT_SIGNAL_ITEMS} tone="emerald" />
|
|
</div>
|
|
|
|
<div className="mt-6">
|
|
<DocsCallout tone="note" title="The simplest way to think about Cards">
|
|
Cards are not “smaller artworks” and they are not just decorated posts. They are a format for concise, designed visual communication.
|
|
</DocsCallout>
|
|
</div>
|
|
</DocsSection>
|
|
|
|
<DocsSection
|
|
id="cards-vs-other-formats"
|
|
eyebrow="Format choice"
|
|
title="Cards vs artworks vs posts vs collections"
|
|
summary="Choose the format based on what the audience needs to experience. The right choice makes the content feel natural. The wrong choice creates friction immediately."
|
|
>
|
|
<DocsComparisonTable columns={COMPARISON_COLUMNS} rows={COMPARISON_ROWS} caption="Comparison between Cards, artworks, posts, and collections" />
|
|
|
|
<div className="mt-6 grid gap-4 md:grid-cols-2">
|
|
<DocsCallout tone="tip" title="Choose Cards when presentation is part of the point">
|
|
If the message needs typography, composition, or a designed editorial feel to work properly, Cards are usually the right format.
|
|
</DocsCallout>
|
|
<DocsCallout tone="warning" title="Do not force every idea into Cards">
|
|
If the content is really an artwork, keep it as an artwork. If it is really an update, keep it as a post. Better format choices create clearer public experiences.
|
|
</DocsCallout>
|
|
</div>
|
|
</DocsSection>
|
|
|
|
<DocsSection
|
|
id="how-to-create"
|
|
eyebrow="Workflow"
|
|
title="How to create a Card"
|
|
summary="The creation flow should feel deliberate: enter Studio, open the Cards workflow, shape the idea clearly, preview the result, and publish only when the final presentation feels intentional."
|
|
>
|
|
<DocsStepList items={CREATION_STEPS} />
|
|
</DocsSection>
|
|
|
|
<DocsSection
|
|
id="publishing-and-ownership"
|
|
eyebrow="Ownership"
|
|
title="Publishing and ownership"
|
|
summary="Cards can be personal or Group-owned depending on the context. Before you publish, confirm whose identity the Card represents and whether any shared authorship should be made clear."
|
|
>
|
|
<div className="grid gap-4 md:grid-cols-2">
|
|
{OWNERSHIP_ITEMS.map((item) => (
|
|
<InsightCard key={item.title} item={item} />
|
|
))}
|
|
</div>
|
|
|
|
<div className="mt-6">
|
|
<BulletGrid items={OWNERSHIP_BULLETS} tone="sky" />
|
|
</div>
|
|
|
|
<div className="mt-6">
|
|
<DocsCallout tone="practice" title="Publishing context is part of quality">
|
|
A polished Card published under the wrong identity is still a bad result. Treat ownership checks as part of the final review, not as cleanup after the fact.
|
|
</DocsCallout>
|
|
</div>
|
|
</DocsSection>
|
|
|
|
<DocsSection
|
|
id="personal-and-group-workflows"
|
|
eyebrow="Use cases"
|
|
title="Using Cards in personal and Group workflows"
|
|
summary="Cards become easier to understand once they are attached to real use cases. They are useful when you want a compact, designed surface for communication, mood, or presentation."
|
|
>
|
|
<div className="grid gap-4 xl:grid-cols-2">
|
|
{WORKFLOW_EXAMPLES.map((item) => (
|
|
<InsightCard key={item.title} item={item} />
|
|
))}
|
|
</div>
|
|
</DocsSection>
|
|
|
|
<DocsSection
|
|
id="best-practices"
|
|
eyebrow="Quality habits"
|
|
title="Best practices"
|
|
summary="Strong Cards feel focused, readable, and intentional. They communicate one idea clearly instead of fighting for attention with too many competing elements."
|
|
>
|
|
<BulletGrid items={BEST_PRACTICES} tone="emerald" />
|
|
</DocsSection>
|
|
|
|
<DocsSection
|
|
id="common-mistakes"
|
|
eyebrow="Avoid this"
|
|
title="Common mistakes"
|
|
summary="Most Card problems come from using the wrong format, overloading the design, or ignoring publishing context until after the public result already exists."
|
|
>
|
|
<BulletGrid items={COMMON_MISTAKES} tone="amber" />
|
|
</DocsSection>
|
|
|
|
<DocsSection
|
|
id="faq"
|
|
eyebrow="FAQ"
|
|
title="Cards FAQ"
|
|
summary="These answers cover the core questions people ask when they are deciding whether Cards fit the idea they want to publish."
|
|
>
|
|
<DocsFaqAccordion items={FAQ_ITEMS} />
|
|
</DocsSection>
|
|
|
|
<DocsSection
|
|
id="troubleshooting"
|
|
eyebrow="Troubleshooting"
|
|
title="Troubleshooting"
|
|
summary="Use these shortcuts when the Cards workflow feels unclear, the format choice feels wrong, or the result is not behaving the way you expected."
|
|
>
|
|
<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 the Cards format is clear and you need the next layer of help around Studio, Group workflows, uploads, or creator identity."
|
|
>
|
|
<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_card} 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 Card</a>
|
|
<a href={links.studio_cards} 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 Cards workspace</a>
|
|
<a href={links.cards_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 Cards</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-amber-300/20 bg-amber-400/10 p-4 text-amber-50">
|
|
<div className="text-[11px] font-semibold uppercase tracking-[0.16em] text-amber-100/80">Fast reminder</div>
|
|
<p className="mt-2 text-sm leading-6 text-amber-50/85">If the content feels unclear, ask one question first: is this a Card, an artwork, a post, or a collection? The answer usually fixes the workflow too.</p>
|
|
</div>
|
|
</div>
|
|
</aside>
|
|
</div>
|
|
</div>
|
|
</main>
|
|
)
|
|
} |