Exemplos

Snippets prontos pra copiar

Cada bloco roda direto no seu cee dev — cola, salva, vê funcionando. Pulando a fricção da doc longa.

Partículas + Cursor + Page Effects do user

Drop-in que renderiza os 3 efeitos ambiente que o user configurou no dashboard (snow, CRT, trail, etc).

since 0.7.1
tsx
import { UserEffects, Card, Avatar, Name, Bio } from '@cee.bio/runtime';

export default function Profile() {
  return (
    <main className="min-h-screen flex items-center justify-center">
      <Card>
        <Avatar size={120} ring />
        <Name size="xl" gradient />
        <Bio italic />
      </Card>
      <UserEffects />
    </main>
  );
}

Overlay com animação configurada pelo user

Resolve enter/exit/card-enter animations do user.overlayConfig. Suporta framer-motion direto.

since 0.7.0
tsx
import { useState } from 'react';
import { motion, AnimatePresence } from 'framer-motion';
import { useOverlayAnimations, Card } from '@cee.bio/runtime';

export default function Profile() {
  const [showOverlay, setShowOverlay] = useState(true);
  const { overlay, card, duration } = useOverlayAnimations();

  return (
    <main>
      <AnimatePresence>
        {showOverlay && (
          <motion.div
            variants={overlay}
            initial="initial" animate="animate" exit="exit"
            transition={{ duration }}
            onClick={() => setShowOverlay(false)}
            className="fixed inset-0 z-50 bg-black/90 cursor-pointer
                       flex items-center justify-center text-white text-2xl"
          >
            click to enter
          </motion.div>
        )}
      </AnimatePresence>

      {!showOverlay && (
        <motion.div variants={card} initial="initial" animate="animate" transition={{ duration }}>
          <Card>...content...</Card>
        </motion.div>
      )}
    </main>
  );
}

Card com cardCover (imagem de fundo + opacity + blur)

Reproduz o comportamento do site oficial: imagem como bg do card, com filter:blur respeitando opacity/blur do user.

tsx
import { useCee, useUserCardStyle, Card, Avatar, Name } from '@cee.bio/runtime';

export default function Profile() {
  const { user } = useCee();
  const cardStyle = useUserCardStyle({ padding: 24, borderRadius: 16 });
  const adjustedBlur = Math.pow((user.cardBlur ?? 0) / 100, 0.5) * 20;

  return (
    <main>
      <Card style={{ ...cardStyle, position: 'relative', overflow: 'hidden' }}>
        {user.cardCover && (
          <div
            aria-hidden
            style={{
              position: 'absolute', inset: 0, borderRadius: 'inherit',
              overflow: 'hidden', pointerEvents: 'none',
              opacity: (user.cardOpacity ?? 100) / 100,
            }}
          >
            <div
              style={{
                position: 'absolute', inset: 0,
                backgroundImage: `url("${user.cardCover}")`,
                backgroundSize: 'cover', backgroundPosition: 'center',
                ...(adjustedBlur > 0 ? {
                  filter: `blur(${adjustedBlur}px)`,
                  transform: `scale(${1 + adjustedBlur / 60})`,
                } : {}),
              }}
            />
          </div>
        )}
        <Avatar size={96} />
        <Name />
      </Card>
    </main>
  );
}

defineDefaults — sugestões de tema do dev

Declara cores/fontes default do template que viram opt-in granular no modal de apply. User pode aceitar campo a campo.

since 0.6.0
tsx
import { defineDefaults } from '@cee.bio/runtime';

// Declarado no topo do arquivo (fora do componente).
// O CLI extrai via AST no `cee push`.
const defaults = defineDefaults({
  cardColor: '#0d0d0d',
  mainColor: '#6fe782',
  fontFamily: 'Plus Jakarta Sans',
  backgroundImage: 'https://cdn.cee.bio/templates/myslug/bg.jpg',
});

export default function Profile() {
  // No render normal — defineDefaults é só metadata.
  return <>...</>;
}

defineFields — campos custom preenchidos pelo user

Declara fields tipados (string, color, image, enum) que aparecem como inputs no modal de apply. Acesso via useFields().

tsx
import { defineFields, useFields, Card, Name } from '@cee.bio/runtime';

const fields = defineFields([
  { key: 'tagline', type: 'string', label: 'Tagline', default: 'hello world' },
  { key: 'accent', type: 'color', label: 'Cor principal', default: '#ff66cc' },
]);

export default function Profile() {
  const f = useFields<typeof fields>();
  return (
    <main style={{ background: f.accent + '20' }}>
      <Card>
        <Name />
        <p style={{ color: f.accent }}>{f.tagline}</p>
      </Card>
    </main>
  );
}

Badges do user (tester, premium, verified, etc)

Renderiza badges com ícone do Iconify CDN. badgeIconUrl resolve cor/efeito do user.

since 0.6.1
tsx
import { useCee, badgeIconUrl } from '@cee.bio/runtime';

export default function Profile() {
  const { user } = useCee();
  const badges = (user.badges ?? []).filter((b) => b.isVisible !== false);

  return (
    <div className="flex gap-2">
      {badges.map((b) => {
        const url = b.iconUrl ?? badgeIconUrl(b.id, { color: b.color });
        if (!url) return null;
        return <img key={b.id} src={url} alt={b.name} width={20} height={20} />;
      })}
    </div>
  );
}

Discord Widget — presença ao vivo

Mostra status do user no Discord (jogo, música, atividade) via WebSocket — ref-counted, sem polling.

tsx
import { DiscordWidget } from '@cee.bio/runtime';

export default function Profile() {
  return (
    <main>
      <DiscordWidget
        discordId="1421289705626013769"
        discordStyle="card"
        showActivity
      />
    </main>
  );
}

cee sync — puxar profile fresco pro JSON local

Comando do CLI pra atualizar src/.cee-user.json com o estado atual do dashboard. Útil pra testar mudanças sem reload manual.

since cli 0.5.3
shell
# Sync simples
cee sync

# Forçando invalidação do cache server-side (TwoLayerCache + paired)
cee sync --force

# Out path customizado
cee sync --out src/data/user.json

# Modo silent (sem logs, só errors)
cee sync --quiet

Publicar como Layout Community (admin)

Admin promove um template a layout — aparece no CardLayoutPicker de todos os users com preview do template.

shell
# 1) Publicar template via dashboard
#    /dashboard/templates  "Publicar"  preenche nome, descrição, preview

# 2) Admin promove via UI no template detail
#    /dashboard/templates/<id>  painel amarelo "Admin · Layout community"
#     digita slug (ex: neonpunk)  "Promover"

# 3) Auto-update via cee push
#    Qualquer 'cee push' do dono original propaga o source pros users
#    que escolheram esse layout no picker. Zero migration por user.

Faltou algum exemplo?

Manda issue ou DM — adicionamos aqui. Ou abre direto a doc principal pros casos avançados.