/* ============================================================ Foundations — Cores, Tipografia, Ícones, Espaço, Raio, Sombra ============================================================ */ /* ---------- helper ---------- */ function SectionHead({ title, desc, eyebrow }) { return (
{eyebrow &&
{eyebrow}
}

{title}

{desc &&

{desc}

}
); } function Swatch({ name, token, hex, dark }) { const fg = dark ? "var(--sand-50)" : "var(--neutral-900)"; const secFg = dark ? "rgba(255,252,246,.65)" : "var(--neutral-500)"; return (
{name}
{hex}
{token}
); } function ColorScale({ title, name, scale, dark }) { return (
{title}
{scale.map(s => ( = 500} /> ))}
); } function ColorsSection() { const plum = [ { step: 50, hex: "#F7F2F7" },{ step: 100, hex: "#EDE2EE" },{ step: 200, hex: "#D6C2DA" },{ step: 300, hex: "#B597BC" },{ step: 400, hex: "#8B6892" }, { step: 500, hex: "#65466D" },{ step: 600, hex: "#4A2F52" },{ step: 700, hex: "#36213D" },{ step: 800, hex: "#2A1B2E" },{ step: 900, hex: "#1A0F1D" }, ]; const ember = [ { step: 50, hex: "#FEF4ED" },{ step: 100, hex: "#FDE5D2" },{ step: 200, hex: "#FBC79F" },{ step: 300, hex: "#F8A267" },{ step: 400, hex: "#F08544" }, { step: 500, hex: "#E8712A" },{ step: 600, hex: "#C95A1B" },{ step: 700, hex: "#A14716" },{ step: 800, hex: "#7B3613" },{ step: 900, hex: "#5C2810" }, ]; const sand = [ { step: 50, hex: "#FFFCF6" },{ step: 100, hex: "#FAF6EE" },{ step: 200, hex: "#F2EBDD" },{ step: 300, hex: "#E6DBC3" },{ step: 400, hex: "#D2C19E" }, ]; const neutral = [ { step: 50, hex: "#FAF8F5" },{ step: 100, hex: "#F1EEE9" },{ step: 200, hex: "#E1DCD3" },{ step: 300, hex: "#C9C2B6" },{ step: 400, hex: "#9B9389" }, { step: 500, hex: "#6D6760" },{ step: 600, hex: "#4D4944" },{ step: 700, hex: "#36332F" },{ step: 800, hex: "#211F1D" },{ step: 900, hex: "#100F0E" }, ]; const semantic = [ { name: "Success", token: "--success-500", hex: "#2D7A4F", bg: "#E8F3EC" }, { name: "Warning", token: "--warning-500", hex: "#C88A1F", bg: "#FBF1DE" }, { name: "Error", token: "--error-500", hex: "#B83A3A", bg: "#F8E3E3" }, { name: "Info", token: "--info-500", hex: "#2C5F87", bg: "#E3ECF3" }, ]; return ( <> {/* Razão da paleta */}

Lógica da paleta

O laranja da marca não domina — ele acende. A profundidade vem da ameixa.

Primário · Plum
Profundidade

Marca, headers, superfícies premium, fundos sérios. A cor que carrega autoridade e calma.

Spark · Ember
Ação

CTAs, badges de destaque, ícones-chave. Reservado — nunca preenche fundos amplos.

Suporte · Sand & Neutral
Respiro

Fundos, papéis e cinzas warm. O lugar onde a hierarquia descansa entre os destaques.

{/* Escalas */}

Escalas completas

50 = mais claro · 900 = mais escuro

{/* Semânticas */}

Cores semânticas

Feedback de sistema · sempre acompanhadas de fundo light para uso em toasts e alerts

{semantic.map(s => (
{s.name}
{s.hex}
bg · {s.bg}
))}
{/* Combinações */}

Combinações recomendadas

Pares testados de fundo + texto + acento

{[ { bg: "var(--sand-50)", fg: "var(--neutral-900)", accent: "var(--ember-500)", note: "Tela padrão · 80% do app" }, { bg: "var(--plum-800)", fg: "var(--sand-50)", accent: "var(--ember-400)", note: "Hero · cards premium · CTA reverse" }, { bg: "var(--bg-elevated)", fg: "var(--neutral-900)", accent: "var(--plum-800)", note: "Cards · listas · superfícies elevadas" }, { bg: "var(--ember-50)", fg: "var(--ember-700)", accent: "var(--ember-500)", note: "Highlight quente · notificação leve" }, ].map((c, i) => (
Encontre produtos cristãos perto de você.
{c.note}
))}
); } /* ---------- TYPOGRAPHY ---------- */ function TypeRow({ name, size, lh, weight, sample, fontFamily }) { return (
{name}
{size}px · lh {lh} · w{weight}
= 30 ? "-0.025em" : "-0.01em" }}>{sample}
); } function TypographySection() { return ( <>

Famílias

Display · Headings
Bricolage
400 · 500 · 600 · 700 · variable opsz

Personalidade serena com cantos firmes. Funciona em manchete e em rótulo. Use sentence case sempre que possível.

Body · UI
Inter Tight
400 · 500 · 600 · 700

Geométrica, neutra, calibrada para densidades baixas e médias. Usada em todo corpo, descrição de produto, navegação e formulários.

Escala tipográfica

Mobile-first · todos os tamanhos em px

Uso em contexto

DESTAQUE DA SEMANA

Comprar com quem compartilha o seu propósito.

Encontre produtos, serviços e empresas cristãs verificadas — perto de você, com o mesmo cuidado que você tem com sua família.

); } /* ---------- ICONS ---------- */ function IconCell({ name, size, weight }) { return (
{name}
); } function IconsSection() { const sample = ["house", "magnifying-glass", "storefront", "users-three", "user-circle", "heart", "shopping-bag", "wallet", "map-pin", "chat-circle", "bell", "tag", "package", "currency-circle-dollar", "hand-heart", "sparkle"]; return ( <>

Pesos

Use 'regular' em 90% dos casos · 'bold' em estados ativos · 'fill' em ações afirmativas e badges

{["thin", "light", "regular", "bold", "fill", "duotone"].map(w => (
{w}
))}

Tamanhos

16 · 20 · 24 · 32 · 48 px

{[16, 20, 24, 32, 48].map(s => (
{s}px
))}

Conjunto base

Ícones do MVP — navegação, ações e categorias

{sample.map(n => )}

Estados especiais

3
com badge
favorito ativo
verificado
destaque marca
); } /* ---------- SPACING & GRID ---------- */ function SpacingSection() { const scale = [ { token: "space-1", px: 4 },{ token: "space-2", px: 8 },{ token: "space-3", px: 12 },{ token: "space-4", px: 16 }, { token: "space-5", px: 20 },{ token: "space-6", px: 24 },{ token: "space-7", px: 32 },{ token: "space-8", px: 40 }, { token: "space-9", px: 48 },{ token: "space-10", px: 64 },{ token: "space-11", px: 80 },{ token: "space-12", px: 96 }, ]; return ( <>

Escala de espaçamento

Unidade base: 4px

{scale.map(s => (
--{s.token}
{s.px}px
))}

Grid Mobile (375px)

4 colunas · gutter 16 · margem 16

{[0,1,2,3].map(i => (
))}
375px · 16 / 16 / 16

Grid Desktop (1280px)

12 colunas · gutter 24 · margem 64 · container max 1200

{Array.from({length: 12}).map((_, i) => (
))}
1280px · margem 64 · 12 col · gap 24
); } /* ---------- RADIUS ---------- */ function RadiusSection() { const levels = [ { name: "none", token: "--radius-none", px: 0 }, { name: "sm", token: "--radius-sm", px: 6 }, { name: "md", token: "--radius-md", px: 10 }, { name: "lg", token: "--radius-lg", px: 16 }, { name: "xl", token: "--radius-xl", px: 24 }, { name: "full", token: "--radius-full", px: "9999" }, ]; return ( <>
{levels.map(l => (
{l.name}
{l.px}{l.px === "9999" ? "" : "px"}
))}
); } /* ---------- SHADOWS ---------- */ function ShadowsSection() { const levels = [ { name: "flat", token: "--shadow-flat", desc: "Sem elevação · inputs em repouso, áreas de fundo" }, { name: "low", token: "--shadow-low", desc: "1 px · separadores de cartão sutis" }, { name: "md", token: "--shadow-md", desc: "Cards em hover · destaques discretos" }, { name: "high", token: "--shadow-high", desc: "Bottom sheet · modais inline" }, { name: "overlay", token: "--shadow-overlay", desc: "Modais centrais · toasts no topo" }, ]; return ( <>
{levels.map(l => (
{l.name}
{l.token}
{l.desc}
))}
); } /* Export to window */ Object.assign(window, { SectionHead, ColorsSection, TypographySection, IconsSection, SpacingSection, RadiusSection, ShadowsSection });