Communitygithub.com

anubhavg-icpl/vibe

Crie sites focados em conteúdo com Astro — zero JavaScript por padrão, arquitetura de ilhas, componentes multi-framework e suporte a Markdown/MDX. Use quando precisar de ajuda com Astro.

O que é vibe?

Esta skill capacita agentes de IA a construírem sites ricos em conteúdo utilizando o Astro Web Framework. O Astro é especializado em performance, entregando zero JavaScript por padrão e hidratando apenas componentes interativos através de sua inovadora **Arquitetura de Ilhas**. A skill guia o usuário em todo o processo: desde a configuração do projeto com `npm create astro@latest`, passando pela sintaxe de componentes `.astro`, roteamento baseado em arquivos, coleções de conteúdo com validação de tipos (Markdown/MDX), até o uso de diretivas `client:` para hidratação seletiva. Suporta múltiplos frameworks de UI (React, Vue, Svelte, Solid) no mesmo projeto, permite saída SSG (Geração de Site Estático) e SSR (Renderização no Servidor) via adaptadores como Vercel. É ideal para blogs, sites de documentação, portfólios e landing pages, onde performance e boas práticas de SEO são prioridades.

Funciona com✓Claude Code~Codex CLI✓Cursor✓Gemini CLI
npx skills add https://github.com/anubhavg-icpl/vibe/tree/HEAD/skills/ag-astro

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação

Astro Web Framework

Visão Geral

Astro é um framework web projetado para sites ricos em conteúdo — blogs, documentações, portfólios, sites de marketing e e-commerce. Sua inovação central é a Arquitetura de Ilhas: por padrão, o Astro envia zero JavaScript para o navegador. Componentes interativos são hidratados seletivamente como "ilhas" isoladas. Astro suporta React, Vue, Svelte, Solid e outros frameworks de UI simultaneamente no mesmo projeto, permitindo que você escolha a ferramenta certa para cada componente.

Quando Usar Esta Skill

  • Use ao construir um blog, site de documentação, página de marketing ou portfólio
  • Use quando performance e Core Web Vitals forem a prioridade máxima
  • Use quando o projeto for pesado em conteúdo com arquivos Markdown ou MDX
  • Use quando você quiser saída SSG (estática) com SSR opcional para rotas dinâmicas
  • Use quando o usuário perguntar sobre arquivos .astro, Astro.props, coleções de conteúdo ou diretivas client:

Como Funciona

Passo 1: Configuração do Projeto

npm create astro@latest meu-site
cd meu-site
npm install
npm run dev

Adicione integrações conforme necessário:

npx astro add tailwind        # Tailwind CSS
npx astro add react           # Suporte a componentes React
npx astro add mdx             # Suporte a MDX
npx astro add sitemap         # Auto sitemap.xml
npx astro add vercel          # Adaptador SSR para Vercel

Estrutura do projeto:

src/
  pages/          ← Roteamento baseado em arquivos (.astro, .md, .mdx)
  layouts/        ← Estruturas de página reutilizáveis
  components/     ← Componentes de UI (.astro, .tsx, .vue, etc.)
  content/        ← Coleções de conteúdo com segurança de tipos (Markdown/MDX)
  styles/         ← CSS global
public/           ← Ativos estáticos (copiados como estão)
astro.config.mjs  ← Configuração do framework

Passo 2: Sintaxe de Componentes Astro

Arquivos .astro possuem uma cerca de código no topo (apenas servidor) e um template abaixo:

---
// src/components/Card.astro
// Este bloco é executado APENAS no servidor — nunca no navegador
interface Props {
  title: string;
  href: string;
  description: string;
}

const { title, href, description } = Astro.props;
---

<article class="card">
  <h2><a href={href}>{title}</a></h2>
  <p>{description}</p>
</article>

<style>
  /* Escopado automaticamente a este componente */
  .card { border: 1px solid #eee; padding: 1rem; }
</style>

Passo 3: Páginas Baseadas em Arquivos e Roteamento

src/pages/index.astro          → /
src/pages/about.astro          → /about
src/pages/blog/[slug].astro    → /blog/:slug (dinâmico)
src/pages/blog/[...path].astro → /blog/* (coringa)

Rota dinâmica com getStaticPaths:

---
// src/pages/blog/[slug].astro
export async function getStaticPaths() {
  const posts = await getCollection('blog');
  return posts.map(post => ({
    params: { slug: post.slug },
    props: { post },
  }));
}

const { post } = Astro.props;
const { Content } = await post.render();
---

<h1>{post.data.title}</h1>
<Content />

Passo 4: Coleções de Conteúdo

Coleções de conteúdo fornecem acesso com segurança de tipos a arquivos Markdown e MDX:

// src/content/config.ts
import { z, defineCollection } from 'astro:content';

const blog = defineCollection({
  type: 'content',
  schema: z.object({
    title: z.string(),
    date: z.coerce.date(),
    tags: z.array(z.string()).default([]),
    draft: z.boolean().default(false),
  }),
});

export const collections = { blog };
---
// src/pages/blog/index.astro
import { getCollection } from 'astro:content';

const posts = (await getCollection('blog'))
  .filter(p => !p.data.draft)
  .sort((a, b) => b.data.date.valueOf() - a.data.date.valueOf());
---

<ul>
  {posts.map(post => (
    <li>
      <a href={`/blog/${post.slug}`}>{post.data.title}</a>
      <time>{post.data.date.toLocaleDateString()}</time>
    </li>
  ))}
</ul>

Passo 5: Ilhas — Hidratação Seletiva

Por padrão, componentes de frameworks de UI renderizam para HTML estático sem JS. Use diretivas client: para hidratar:

---
import Counter from '../components/Counter.tsx';  // Componente React
import VideoPlayer from '../components/VideoPlayer.svelte';
---

<!-- HTML estático — nenhum JavaScript enviado ao navegador -->
<Counter initialCount={0} />

<!-- Hidrata imediatamente no carregamento da página -->
<Counter initialCount={0} client:load />

<!-- Hidrata quando o componente entra na viewport -->
<VideoPlayer src="/demo.mp4" client:visible />

<!-- Hidrata apenas quando o navegador está ocioso -->
<Analytics client:idle />

<!-- Hidrata apenas em uma media query específica -->
<MobileMenu client:media="(max-width: 768px)" />

Passo 6: Layouts

---
// src/layouts/BaseLayout.astro
interface Props {
  title: string;
  description?: string;
}
const { title, description = 'Meu Site Astro' } = Astro.props;
---

<html lang="pt-BR">
  <head>
    <meta charset="utf-8" />
    <title>{title}</title>
    <meta name="description" content={description} />
  </head>
  <body>
    <nav>...</nav>
    <main>
      <slot />  <!-- o conteúdo da página é renderizado aqui -->
    </main>
    <footer>...</footer>
  </body>
</html>
---
// src/pages/about.astro
import BaseLayout from '../layouts/BaseLayout.astro';
---

<BaseLayout title="Sobre Nós">
  <h1>Sobre Nós</h1>
  <p>Bem-vindo à nossa empresa...</p>
</BaseLayout>

Passo 7: Modo SSR (Renderização Sob Demanda)

Ative SSR para páginas dinâmicas definindo um adaptador:

// astro.config.mjs
import { defineConfig } from 'astro/config';
import vercel from '@astrojs/vercel/serverless';

export default defineConfig({
  output: 'hybrid',  // 'static' | 'server' | 'hybrid'
  adapter: vercel(),
});

Opte páginas individuais para SSR com export const prerender = false.

Exemplos

Exemplo 1: Blog com Feed RSS

// src/pages/rss.xml.ts
import rss from '@astrojs/rss';
import { getCollection } from 'astro:content';

export async function GET(context) {
  const posts = await getCollection('blog');
  return rss({
    title: 'Meu Blog',
    description: 'Postagens recentes',
    site: context.site,
    items: posts.map(post => ({
      title: post.data.title,
      pubDate: post.data.date,
      link: `/blog/${post.slug}/`,
    })),
  });
}

Exemplo 2: Endpoint de API (SSR)

// src/pages/api/subscribe.ts
import type { APIRoute } from 'astro';

export const POST: APIRoute = async ({ request }) => {
  const { email } = await request.json();

  if (!email) {
    return new Response(JSON.stringify({ error: 'Email obrigatório' }), {
      status: 400,
      headers: { 'Content-Type': 'application/json' },
    });
  }

  await addToNewsletter(email);
  return new Response(JSON.stringify({ success: true }), { status: 200 });
};

Exemplo 3: Componente React como Ilha

// src/components/SearchBox.tsx
import { useState } from 'react';

export default function SearchBox() {
  const [query, setQuery] = useState('');
  const [results, setResults] = useState([]);

  async function search(e: React.FormEvent) {
    e.preventDefault();
    const data = await fetch(`/api/search?q=${query}`).then(r => r.json());
    setResults(data);
  }

  return (
    <form onSubmit={search}>
      <input value={query} onChange={e => setQuery(e.target.value)} />
      <button type="submit">Pesquisar</button>
      <ul>{results.map(r => <li key={r.id}>{r.title}</li>)}</ul>
    </form>
  );
}
---
import SearchBox from '../components/SearchBox.tsx';
---
<!-- Hidratado imediatamente — esta ilha é interativa -->
<SearchBox client:load />

Melhores Práticas

  • ✅ Mantenha a maioria dos componentes como arquivos .astro estáticos — hidrate apenas o que precisa ser interativo
  • ✅ Use coleções de conteúdo para todo conteúdo Markdown/MDX — você ganha segurança de tipos e validação automática
  • ✅ Prefira client:visible em vez de client:load para componentes abaixo da dobra para reduzir o JS inicial
  • ✅ Use import.meta.env para variáveis de ambiente — prefixe variáveis públicas com PUBLIC_
  • ✅ Adicione <ViewTransitions /> de astro:transitions para navegação suave entre páginas sem um SPA completo
  • ❌ Não use client:load em todos os componentes — isso anula a vantagem de desempenho do Astro
  • ❌ Não coloque segredos no frontmatter de arquivos .astro que sejam usados em templates expostos ao cliente
  • ❌ Não pule getStaticPaths para rotas dinâmicas no modo estático — as builds falharão

Notas de Segurança e Proteção

  • O código no frontmatter de arquivos .astro é executado apenas no servidor e nunca é exposto ao navegador.
  • Use import.meta.env.PUBLIC_* apenas para valores não sensíveis. Variáveis de ambiente privadas (sem prefixo PUBLIC_) nunca são enviadas ao cliente.
  • Ao usar modo SSR, valide todas as entradas de Astro.request antes de consultas ao banco de dados ou chamadas de API.
  • Sanitize qualquer conteúdo fornecido pelo usuário antes de renderizar com set:html — ele ignora o escape automático.

Problemas Comuns

  • Problema: JavaScript de um componente React/Vue não é executado no navegador Solução: Adicione uma diretiva client: (client:load, client:visible, etc.) — sem ela, os componentes renderizam apenas como HTML estático.

  • Problema: Dados de getStaticPaths estão desatualizados após atualizações de conteúdo durante o desenvolvimento Solução: O servidor de desenvolvimento do Astro monitora arquivos de conteúdo — reinicie se as alterações em content/config.ts não forem refletidas.

  • Problema: O tipo de Astro.props é any — sem autocomplete Solução: Defina uma interface ou tipo Props no frontmatter e o Astro a inferirá automaticamente.

  • Problema: O CSS de um componente .astro vaza para outros componentes Solução: Estilos em tags <style> de arquivos .astro são automaticamente escopados. Use :global() apenas quando intencionalmente direcionar filhos.

Skills Relacionadas

  • @sveltekit — Quando você precisa de um framework full-stack com UI reativa (em contraste com o foco em conteúdo do Astro)
  • @nextjs-app-router-patterns — Quando você precisa de um framework full-stack focado em React
  • @tailwind-patterns — Estilizando sites Astro com Tailwind CSS
  • @progressive-web-app — Adicionando capacidades PWA a um site Astro

Limitações

  • Use esta skill apenas quando a tarefa corresponder claramente ao escopo descrito acima.
  • Não trate a saída como substituta para validação específica de ambiente, testes ou revisão especializada.
  • Pare e peça esclarecimentos se entradas, permissões, limites de segurança ou critérios de sucesso necessários estiverem faltando.

Individual skills in this repo

This repo contains 20 individual skills — each has its own dedicated page.

anubhavg-icpl/vibe

|. Use when you need help with 8 bit orbit video template. Hyperframes-based video template for retro pixel deck motion design. Use when users want a high-fidelity, multi-scene HTML-to-video composition with advanced transitions, interactive preview controls, and ready-to-render default style.

anubhavg-icpl/vibe

Reference DESIGN.md for luxury automotive editorial that needs to feel engineered. White slabs, full-bleed performance photography, BMW corporate blue rising into a deeper blue at active states, restrained Helvetica-grade typography. Use when building UI components, applying design tokens, or implementing visual styles for cinematic bmw.

anubhavg-icpl/vibe

Reference DESIGN.md for enterprise-AI brands that need to feel premium, dark, and quietly futuristic. Ink canvas, Unica grotesque type, saturated coral-to-violet brand gradient deployed as backdrop and accent rule, full-pill buttons, gen. Use when building UI components, applying design tokens, or implementing visual styles for cinematic cohere.

anubhavg-icpl/vibe

Reference DESIGN.md for performance brands that need to feel theatrical. High-contrast black-and-white frames cut by Rosso Corsa red, sharp 0-radius components, FerrariSans across the entire page, photography that treats the car as sculp. Use when building UI components, applying design tokens, or implementing visual styles for cinematic ferrari.

anubhavg-icpl/vibe

Reference DESIGN.md for hyper-luxury that needs to feel forged. True-black canvas, oversized LamboType nameplates at 120px+, hexagonal angle motifs, single warm-gold accent for primary actions, photography lit like a vault. Use when building UI components, applying design tokens, or implementing visual styles for cinematic lamborghini.

anubhavg-icpl/vibe

Reference DESIGN.md for AI-lab cinematic: pure black canvas, neon-lime accent on charcoal chrome, geometric DM Sans / Outfit type, pill-shaped CTAs. Use when building UI components, applying design tokens, or implementing visual styles for cinematic minimax.

anubhavg-icpl/vibe

Reference DESIGN.md for GPU-vendor cinematic: chrome-black canvas, signature green action, video-led hero, hard-edged grotesque headlines. Use when building UI components, applying design tokens, or implementing visual styles for cinematic nvidia.

anubhavg-icpl/vibe

Skill for discovering and researching autonomous AI agents, tools, and ecosystems using the AgentFolio directory. Use when you need help with agentfolio.

anubhavg-icpl/vibe

Expert in building portfolios that actually land jobs and clients -. Use when you need help with interactive portfolio. not just showing work, but creating memorable experiences. Covers developer portfolios, designer portfolios, creative portfolios, and portfolios that convert visitors into opportunities.

anubhavg-icpl/vibe

Generates high-converting Next.js/React landing pages with Tailwind CSS. Uses PAS, AIDA, and BAB frameworks for optimized copy/components (Heroes, Features, Pricing). Focuses on Core Web Vitals/SEO. Use when you need help with landing page generator.

anubhavg-icpl/vibe

Generate walkthrough videos from Stitch projects using Remotion with smooth transitions, zooming, and text overlays. Use when you need help with remotion.

anubhavg-icpl/vibe

Writes complete, structured landing pages optimized for SEO ranking, AEO citation, and visitor conversion. Activate when the user wants to write or generate a landing page for a product, service, or offer.

anubhavg-icpl/vibe

Project scaffolding - generate boilerplate for common project types with best-practice defaults. Use for: scaffold, boilerplate, template, new project, init, create project, starter, setup, project structure, directory structure, monorepo, microservice, API template, web app template, CLI tool template, library template.

anubhavg-icpl/vibe

Automate Klipfolio tasks via Rube MCP (Composio). Always search tools first for current schemas. Use when you need help with klipfolio automation.

anubhavg-icpl/vibe

>. Use when you need help with kami landing. Produce a print-grade single-page kami (紙 / 纸) document — warm parchment canvas, ink-blue accent, serif at one weight, no italic, no cool grays. The output reads like a professional white paper or studio one-pager, not an app UI. Multilingual by design (EN · zh-CN · ja). One self-contained HTML file, zero dependencies.

anubhavg-icpl/vibe

>. Use when you need help with open design landing deck. Produce a single-file slide deck in the Atelier Zero visual language (warm-paper background, italic-serif emphasis spans, coral terminating dots, surreal collage plates) — Open Design's brand deck recipe. The deck uses **horizontal magazine-style swipe pagination** (←/→, wheel, swipe), a per-slide chrome strip with brand mark and slide counter, an ESC overview grid, a coral progress bar, and inherits the canonical stylesheet + 16-slot image library from the sister `open-design-landing` skill.

anubhavg-icpl/vibe

>. Use when you need help with open design landing. Produce a world-class single-page editorial landing site in the Atelier Zero visual language (Monocle / Apartamento / Études editorial collage) — the same aesthetic Open Design uses for its own marketing surface. The agent fills a typed `inputs.json` from a brand brief, optionally generates 16 collage assets via gpt-image-2, then runs a pure-function composer that emits a self-contained HTML file; a separate path can mirror the Astro marketing site in `apps/landing-page/`. Drop-in scroll-reveal motion and a Headroom-style sticky nav are wired automatically.

anubhavg-icpl/vibe

>. Use when building UI with epic design language and visual style. Build immersive, cinematic 2.5D interactive websites using scroll storytelling, parallax depth, text animations, and premium scroll effects — no WebGL required. Use this skill for any web design task: landing pages, product sites, hero sections, scroll animations, parallax, sticky sections, section overlaps, floating products between sections, clip-path reveals, text that flies in from sides, words that light up on scroll, curtain drops, iris opens, card stacks, bleed typography, and any site that should feel cinematic or premium. Trigger on phrases like "make it feel alive", "Apple-style animation", "sections that overlap", "product rises between sections", "immersive", "scrollytelling", or any scroll-driven visual effect. Covers 45+ techniques across 8 categories. Always inspects, judges, and plans assets before coding. Use aggressively for ANY web design task.

anubhavg-icpl/vibe

Generates high-converting landing pages as complete Next.js/React (TSX) components with Tailwind CSS. Creates hero sections, feature grids, pricing tables, FAQ accordions, testimonial blocks, and CTA sections using proven copy frameworks (PAS, AIDA, BAB). Outputs SEO meta tags, structured data, and performance-optimised code targeting Core Web Vitals (LCP < 1s, CLS < 0.1). Use when the user asks to create a landing page, marketing page, homepage, single-page site, lead capture page, campaign page, promo page, or conversion-optimised web page — or when they want to A/B test landing page variants or replace a static page with one designed to convert.

anubhavg-icpl/vibe

Generates a premium single-page HTML landing page with 3D CSS animations, GSAP scroll effects, and mouse-parallax depth. Forcing intake (product + elevator pitch, audience register, brand overrides, tone) locks down positioning before any copy or markup is written, so the page reflects the actual product rather than generic boilerplate. Use whenever the user says 'landing for X', 'create a landing page', 'build a landing page', 'make a landing page for X', 'I need a web page for Y', or provides product/service details and wants a polished website. Also triggers on 'promotional page', 'product page', 'one-pager', 'web presence', 'sales page'. Outputs a single self-contained HTML file (Claude Code) or HTML artifact (Claude.ai). Supports configurable brand colors via CSS custom property overrides.

Habilidades Relacionadas