Este repositório é um esqueleto (skeleton) opinativo para iniciar projetos React modernos com Vite, TypeScript e Tailwind — pensado para ser usado como template/base em novos projetos.
Ele já vem com várias conveniências e boas práticas configuradas para acelerar o desenvolvimento e manter consistência entre projetos.
- Stack: React (18+/19), TypeScript, Vite, Tailwind CSS
- Sistema de componentes locais (
src/shadcn) seguindo primitives de layout e tipografia - Ferramentas de qualidade: ESLint (config flat), Prettier, Husky, lint-staged, commitlint
- Conveniências devops/dev: Makefile com targets úteis, scripts CLI para gerar componentes/páginas/ganchos
- Estrutura modular com exemplos de
pages,layoutse componentes reutilizáveis - Sistema de tema centralizado com ThemeProvider e cores padrão globais
- Scripts de automação para criação de páginas, limpeza de componentes não utilizados e análise de bundle
Este repositório foi projetado para ser copiado ou usado como base — você pode clonar e adaptar, ou transformar em um template de repositório (ex.: GitHub Template) para iniciar novos projetos a partir daqui.
├── cli/ # Scripts de automação
│ ├── create-page.sh # Cria novas páginas com rotas
│ ├── create-component.sh # Cria componentes
│ ├── create-hook.sh # Cria hooks customizados
│ ├── clean-shadcn.sh # Remove componentes shadcn não utilizados
│ ├── analyze-bundle.sh # Análise de tamanho do bundle
│ ├── check-deps.sh # Verifica dependências desatualizadas
│ ├── generate-icons.sh # Gera tipos para ícones Lucide
│ ├── git-stats.sh # Estatísticas do repositório
│ └── health-check.sh # Verificações de saúde do projeto
├── scripts/
│ └── normalize-classnames.cjs # Normaliza classes Tailwind
├── src/
│ ├── contexts/
│ │ └── ThemeContext.tsx # Provider de tema (light/dark)
│ ├── layouts/
│ │ ├── AppContainer.tsx # Container principal da aplicação
│ │ └── MainLayout.tsx # Layout base com navegação
│ ├── pages/
│ │ ├── Home/
│ │ │ └── Home.tsx # Página inicial
│ │ ├── NotFound/
│ │ │ └── NotFound.tsx # Página 404
│ │ └── index.ts # Exports das páginas
│ ├── shadcn/
│ │ ├── components/ui/ # Componentes UI reutilizáveis
│ │ └── lib/utils.ts # Funções utilitárias
│ ├── App.tsx # App principal com roteamento
│ ├── index.css # Estilos globais + cores padrão
│ └── main.tsx # Ponto de entrada
├── .vscode/
│ └── settings.json # Configurações do VS Code
├── tailwind.config.cjs # Configuração Tailwind
├── tsconfig.json # Configuração TypeScript
├── eslint.config.js # Configuração ESLint
├── postcss.config.cjs # Configuração PostCSS
├── vite.config.ts # Configuração Vite
├── package.json # Dependências e scripts
└── Makefile # Comandos de automação
- ThemeProvider centralizado que gerencia tema light/dark
- Cores padrão globais definidas no
@layer basedo CSS - Persistência do tema no localStorage
- Cores padrão: texto
gray-700(light) /gray-300(dark), fundowhite/gray-950
- 60+ componentes prontos para uso (Button, Card, Dialog, Form, etc.)
- Sistema de design consistente com tokens Tailwind
- Script de limpeza (
clean-shadcn.sh) para remover componentes não utilizados - Organização modular em
src/shadcn/components/ui/
git clone https://github.com/GabrielCirqueira/React-Skeleleton my-app
cd my-appnpm installnpm run devnpm run buildnpm run lint
npm run formatO tema é gerenciado automaticamente. Para alternar entre light/dark:
import { useTheme } from "@/contexts";
function MyComponent() {
const { theme, toggleTheme } = useTheme();
return <button onClick={toggleTheme}>Tema atual: {theme}</button>;
}Cores padrão globais: Todo texto herda automaticamente gray-700 no light e gray-300 no dark. Fundo padrão: white / gray-950.
Para cores específicas (brand, estados especiais), use classes dark::
<p className="text-brand-600 dark:text-brand-400">Texto brand</p>Use o script CLI para criar páginas automaticamente:
# Página simples
./cli/create-page.sh About
# Página com rota específica
./cli/create-page.sh UserProfile /profile
# Modo interativo
./cli/create-page.shO script:
- Cria
src/pages/PageName/PageName.tsxcom template padrão - Adiciona export em
src/pages/index.ts - Insere rota lazy em
src/App.tsx
./cli/create-component.sh MyButtonCria componente em src/shadcn/components/ui/my-button.tsx com template básico.
./cli/create-hook.sh useLocalStorageCria hook customizado em src/hooks/use-local-storage.ts.
O projeto tem múltiplas camadas de formatação:
- Formatação automática ao salvar (VS Code)
- Scripts:
npm run format,npm run format:check - Configurado com
prettier-plugin-tailwindcss
- Remove espaços extras e duplicatas em
className - Executado automaticamente ao salvar (
.vscode/settings.json) - Script:
./scripts/normalize-classnames.cjs - Pula strings com template literals (
${...})
- Regras opinativas para qualidade de código
- Auto-fix ao salvar
- Scripts:
npm run lint,npm run lint:fix
Ao final do desenvolvimento, remova componentes não utilizados:
# Verificar o que seria removido (dry-run)
./cli/clean-shadcn.sh
# Remover componentes não utilizados
./cli/clean-shadcn.sh --yes
# Proteger componentes específicos
./cli/clean-shadcn.sh --keep button --keep card --yesO script:
- Detecta imports
@shadcn/component - Move componentes não utilizados para
.shadcn-backup/ - Preserva backup para restauração
./cli/analyze-bundle.shAnalisa tamanho do bundle de produção e dependências.
./cli/check-deps.sh # Verifica dependências desatualizadas
./cli/generate-icons.sh # Gera tipos para ícones Lucide
./cli/git-stats.sh # Estatísticas do repositório
./cli/health-check.sh # Verificações gerais de saúde| Comando | Descrição |
|---|---|
npm run dev |
Servidor de desenvolvimento Vite |
npm run build |
Build de produção |
npm run preview |
Preview do build |
npm run lint |
Executa ESLint |
npm run lint:fix |
Executa ESLint com auto-fix |
npm run format |
Formata com Prettier |
npm run format:check |
Verifica formatação |
npm run type-check |
Verifica tipos TypeScript |
npm run validate |
Validações combinadas |
- Configure tokens em
tailwind.config.cjs - Cores padrão globais em
src/index.css(@layer base) - Adicione utilitários conforme seu design system
src/shadcn/components/ui/contém componentes reutilizáveis- Estenda ou modifique conforme seu design system
- Use o script
clean-shadcn.shpara manter apenas o necessário
- Componentes em
src/shadcn/components/ui/typography/ Title,Text,Code,Spanetc.- Configure tamanhos e pesos em
tailwind.config.cjs
@/→src/@layouts→src/layouts/@pages→src/pages/@shadcn→src/shadcn/@contexts→src/contexts/
- Husky + lint-staged garantem qualidade
- Commitlint padroniza mensagens
- ESLint e Prettier rodam automaticamente
src/
├── components/ # Componentes específicos da aplicação
├── contexts/ # Contextos React (Theme, Auth, etc.)
├── hooks/ # Hooks customizados
├── layouts/ # Layouts e containers
├── pages/ # Páginas por rota
├── shadcn/ # Sistema de design (componentes base)
│ ├── components/ui/ # Componentes primitivos
│ └── lib/ # Utilitários
└── utils/ # Funções utilitárias
- Instale extensão "Run on Save"
- Configurações já incluídas em
.vscode/settings.json - Formatação automática ao salvar
- Normalização de classes opcional
Seguimos Conventional Commits:
feat: add user authentication
fix: resolve button hover state
docs: update README
refactor: simplify component logic
Pronto para integração com:
- GitHub Actions
- Azure Pipelines
- Outros providers
- Novos componentes exemplares
- Templates de CI/CD
- Mais hooks utilitários
- Exemplos de testes
- Documentação adicional
- Fork o repositório
- Crie uma branch:
git checkout -b feature/nova-feature - Commit suas mudanças:
git commit -m 'feat: add nova feature' - Push para a branch:
git push origin feature/nova-feature - Abra um Pull Request
Este projeto é distribuído sob a licença MIT — veja o arquivo LICENSE para os termos completos.
P: Como adicionar novas cores ao tema?
R: Edite tailwind.config.cjs na seção colors e use no @layer base de src/index.css.
P: Os componentes shadcn são obrigatórios?
R: Não, você pode removê-los com ./cli/clean-shadcn.sh --yes e usar outros sistemas.
P: Como desabilitar a normalização de classes?
R: Remova a configuração emeraldwalk.runonsave do .vscode/settings.json.
P: Como adicionar novas rotas?
R: Use ./cli/create-page.sh ou edite manualmente src/App.tsx e src/pages/index.ts.
Template mantido por Gabriel Cirqueira - PRs e sugestões bem-vindas! 🚀
