Bem-vindo ao Svelte Portfolio & Blog, um site de portfólio pessoal e blog construído com SvelteKit. Este projeto combina um design moderno e responsivo com funcionalidades práticas, como suporte a temas (light/dark mode) e um blog baseado em Markdown. É um exemplo de como utilizar SvelteKit para criar uma aplicação web performática e amigável.
- Portfólio Pessoal: Exiba seus projetos e habilidades em um layout elegante e otimizado.
- Blog Integrado: Escreva e publique posts usando Markdown, com suporte a categorias e tags para organização.
- Temas Dinâmicos: Alterne entre os modos claro e escuro com um clique.
- Design Responsivo: Totalmente adaptado para dispositivos móveis e desktops.
- Otimização de Desempenho: Imagens com lazy loading e carregamento eficiente de conteúdo.
- SvelteKit: Framework principal para construção do site.
- TailwindCSS: Estilização rápida e responsiva.
- Markdown: Para criação e renderização dos posts do blog.
- Node.js (versão 16 ou superior)
- npm ou yarn
- Clone o repositório:
git clone https://github.com/patrickcmserrano/svelte-portfolio-blog.git
- Entre no diretório:
cd svelte-portfolio-blog - Instale as dependências:
npm install
- Inicie o servidor de desenvolvimento:
npm run dev
- Abra o navegador em
http://localhost:5173.
Sinta-se à vontade para abrir issues ou enviar pull requests com sugestões de melhorias!
Este projeto está sob a licença MIT.
- Desenvolvimento local usando Docker ou npm
- Push para a branch
skeletondispara o GitHub Actions - GitHub Actions executa o build no container Docker
- Arquivos de build são extraídos e publicados na branch gh-pages
- GitHub Pages serve a aplicação a partir da branch gh-pages
- Container Docker usa multi-stage build:
base: Configuração inicial e dependênciasdevelopment: Ambiente de desenvolvimentobuilder: Gera os arquivos estáticosproduction: Imagem final otimizada
Container (/app/build) -> GitHub Actions Runner (./build) -> Branch gh-pages (/) -> GitHub Pages
- SvelteKit: Usa adapter-static e configura base path
- GitHub Pages: Deploy via branch (não via Actions)
- GitHub Actions: Copia arquivos do container e faz deploy
- Base path correto para GitHub Pages (
/svelte-portfolio-blog) - Extração correta dos arquivos de build do container
- Configuração do GitHub Pages via branch gh-pages
- Página 404.html para gerenciamento de rotas
Este projeto é um blog/portfolio construído com SvelteKit, Docker e GitHub Actions para CI/CD.
- SvelteKit com adapter-static para geração de páginas estáticas
- Docker para containerização
- GitHub Actions para CI/CD
- TailwindCSS para estilização
- GitHub Pages para hospedagem
- ESLint e Prettier para padronização do código
Para rodar o projeto localmente:
# Desenvolvimento com Docker
docker-compose up
# Desenvolvimento sem Docker
npm install
npm run devO projeto utiliza GitHub Actions para automatizar o build e deploy. O pipeline inclui:
- Build do container Docker
- Geração dos arquivos estáticos
- Deploy automático para GitHub Pages
Inicialmente, tentamos configurar o GitHub Pages usando o método de "Actions" nas configurações do repositório:
- Settings > Pages > Build and deployment > Source > GitHub Actions
- Isso causou conflitos com o SvelteKit e Vite, pois:
- O GitHub Actions tentava servir os arquivos diretamente
- O base path do SvelteKit não era respeitado
- As rotas não funcionavam corretamente
Mudamos para o método tradicional de deploy via branch:
- Settings > Pages > Build and deployment > Source > Deploy from a branch
- Branch: gh-pages / folder: / (root)
- Configuramos o workflow para:
- Fazer build no container Docker
- Extrair os arquivos de build
- Fazer push para a branch gh-pages
Esta abordagem funcionou porque:
- Mantém a compatibilidade com o SvelteKit
- Respeita o base path configurado
- Permite o uso correto do adapter-static
# Multi-stage build para otimização
FROM node:20-alpine AS base
WORKDIR /app
COPY package*.json ./
# Development stage
FROM base AS development
RUN npm install
COPY . .
EXPOSE 3000
CMD ["sh", "-c", "npx svelte-kit sync && npm run dev -- --host 0.0.0.0"]
# Build stage
FROM base AS builder
RUN npm install
COPY . .
ENV NODE_ENV=production
RUN set -ex && \
npx svelte-kit sync && \
npx vite build --debug
# Production stage
FROM node:20-alpine AS production
WORKDIR /app
COPY --from=builder /app/build ./build
COPY package*.json ./
RUN npm install --production
RUN npm install -g serve
EXPOSE 3000
CMD ["serve", "-s", "build", "-l", "3000"]Este projeto utiliza PostCSS para processar o CSS, integrando o TailwindCSS para estilização e o Svelte para construção da aplicação. A configuração do PostCSS está definida no arquivo postcss.config.cjs.
src/app.css: Arquivo principal de estilos, onde são importadas as diretivas do TailwindCSS (@tailwind base;,@tailwind components;,@tailwind utilities;).src/app.postcss: Arquivo adicional de estilos, aplicando utilitários do TailwindCSS e variantes.
-
Adicionar Estilos Globais:
- Edite o arquivo
src/app.csspara adicionar ou sobrescrever estilos globais utilizando as diretivas do TailwindCSS.
- Edite o arquivo
-
Adicionar Estilos Específicos:
- Utilize classes utilitárias do TailwindCSS diretamente nos componentes Svelte para aplicar estilos específicos.
-
Configurar TailwindCSS:
- Edite o arquivo
tailwind.config.tspara adicionar configurações personalizadas, como temas, plugins e extensões de estilos.
- Edite o arquivo
// filepath: c:\dev\portifolio-blog\skeleton-portifolio-blog\postcss.config.cjs
module.exports = {
plugins: {
tailwindcss: {},
autoprefixer: {}
}
};/* filepath: c:\dev\portifolio-blog\skeleton-portifolio-blog\src\app.css */
@tailwind base;
@tailwind components;
@tailwind utilities;
/* Sobrescrevendo a regra anterior (h1 strong) */
.prose :where(h1 strong):not(:where([class~='not-prose'], [class~='not-prose'] *)) {
font-weight: 900;
color: rgb(229 231 235); /* Cor personalizada */
}
/* Sobrescrevendo a nova regra (strong) */
.prose :where(strong):not(:where([class~='not-prose'], [class~='not-prose'] *)) {
font-weight: 600; /* Mantém o peso original */
color: rgb(229 231 235); /* Substitui var(--tw-prose-bold) por uma cor fixa, ex.: cinza escuro */
}// filepath: c:\dev\portifolio-blog\skeleton-portifolio-blog\src\app.postcss
@tailwind base;
@tailwind components;
@tailwind utilities;
@tailwind variants;
html,
body {
@apply h-full overflow-hidden;
}Para futuras edições em CSS, siga os passos acima para adicionar ou modificar estilos globais e específicos. Utilize as classes utilitárias do TailwindCSS para manter a consistência e a eficiência dos estilos aplicados.
O projeto utiliza ESLint e Prettier para garantir a qualidade e consistência do código. A configuração do ESLint pode ser encontrada no arquivo eslint.config.js. O Prettier está integrado ao ESLint para formatação automática.
O projeto utiliza Vitest para testes unitários e Playwright para testes de integração. Os testes podem ser executados com o seguinte comando:
npm run test- Multi-stage build do Docker para diferentes ambientes
- Uso do adapter-static do SvelteKit para geração de páginas estáticas
- Pipeline de CI/CD com GitHub Actions
- Extração correta dos arquivos de build do container Docker
- Configuração adequada de permissões no GitHub Actions
- Deploy via branch gh-pages ao invés do método Actions
- Problema com o comando Vite no container Docker
- Solução: Uso do
npxpara garantir execução correta
- Solução: Uso do
- Extração dos arquivos de build
- Solução: Uso de
docker cpao invés de volumes
- Solução: Uso de
- Permissões do GitHub Actions
- Solução: Configuração explícita de permissões no workflow
- GitHub Pages servindo README ao invés da aplicação
- Solução: Configuração correta do workflow com
force_orphane verificação do conteúdo do build
- Solução: Configuração correta do workflow com
- Conflito entre GitHub Actions e SvelteKit
- Solução: Mudança para deploy via branch gh-pages ao invés do método Actions
- Configuração correta do base path no SvelteKit e Vite
- SvelteKit (svelte.config.js):
kit: {
adapter: adapter({
pages: 'build',
assets: 'build',
fallback: '404.html'
}),
paths: {
base: '/svelte-portfolio-blog'
}
}- Vite (vite.config.ts):
export default defineConfig({
base: '/svelte-portfolio-blog/'
// ... outras configurações
});- 404.html para Redirecionamento:
- Implementado para garantir que rotas diretas funcionem corretamente
- Mantém o estado da aplicação mesmo em refresh
- Gerencia corretamente o base path do GitHub Pages
# Desenvolvimento
npm run dev
# Build
npm run build
# Preview do build
npm run preview
# Lint
npm run lint
# Testes
npm run test.
├── src/ # Código fonte
├── static/ # Arquivos estáticos
├── tests/ # Testes
├── Dockerfile # Configuração Docker
├── docker-compose.yml # Configuração Docker Compose
└── .github/workflows # Configurações CI/CD
- Faça um fork do projeto
- Crie uma branch para sua feature (
git checkout -b feature/AmazingFeature) - Commit suas mudanças (
git commit -m 'Add some AmazingFeature') - Push para a branch (
git push origin feature/AmazingFeature) - Abra um Pull Request
Este projeto está sob a licença MIT. Veja o arquivo LICENSE para mais detalhes.