Um aplicativo web moderno para técnicas de respiração, construído com Svelte 5, TypeScript e Vite. O aplicativo implementa a técnica de respiração 4-7-8, conhecida por ajudar a reduzir ansiedade e melhorar o sono.
Este projeto utiliza Svelte 5, que introduz várias melhorias significativas em relação às versões anteriores:
Reativos com $state
, $derived
e $effect
<!-- Exemplo de uso -->
<script lang="ts">
let count = $state(0);
let doubled = $derived(count * 2);
$effect(() => {
console.log(`Count mudou para ${count}, dobrado é ${doubled}`);
});
</script>
Sistema de "snippets" para conteúdo reutilizável
<!-- Em ThemeToggle.svelte -->
{#snippet activeChild()}
<IconSun size="24" />
{/snippet}
Melhor desempenho com compilador otimizado e atualizações granulares
Integração TypeScript aprimorada com inferência de tipos mais precisa
O arquivo svelte.config.js
configura o pré-processador Svelte:
import { vitePreprocess } from '@sveltejs/vite-plugin-svelte'
export default {
preprocess: vitePreprocess(),
}
Esta configuração permite:
📦 breathing-app-svelte
├── 📂 public/
│ ├── 📂 sounds/ # Arquivos de áudio para respiração e música de fundo
│ └── favicon.ico
├── 📂 src/
│ ├── 📂 components/ # Componentes reutilizáveis
│ │ ├── AudioPlayer.svelte
│ │ ├── BlobAnimation.svelte
│ │ ├── BreathingCycle.svelte
│ │ ├── LanguageSelector.svelte
│ │ ├── NavMenu.svelte
│ │ ├── PageLayout.svelte
│ │ ├── Settings.svelte
│ │ └── ThemeToggle.svelte
│ ├── 📂 lib/ # Bibliotecas e utilidades
│ │ ├── 📂 locales/ # Arquivos de tradução
│ │ │ ├── ar.ts # Árabe
│ │ │ ├── en.ts # Inglês
│ │ │ ├── es.ts # Espanhol
│ │ │ ├── fr.ts # Francês
│ │ │ ├── hi.ts # Hindi
│ │ │ ├── pt.ts # Português
│ │ │ └── zh.ts # Chinês
│ │ └── i18n.ts # Configuração de internacionalização
│ ├── 📂 routes/ # Componentes de página
│ │ ├── About.svelte
│ │ ├── Copyright.svelte
│ │ └── Home.svelte
│ ├── 📂 stores/ # Gerenciamento de estado
│ │ ├── audioStore.ts
│ │ └── breathingStore.ts
│ ├── 📂 styles/ # Estilos globais
│ │ └── global.css
│ ├── App.svelte # Componente raiz
│ └── main.ts # Ponto de entrada da aplicação
└── ... (arquivos de configuração)
O projeto está configurado para deploy automático no GitHub Pages usando GitHub Actions. O workflow realiza as seguintes etapas:
O arquivo .github/workflows/deploy.yml
define o processo automatizado:
name: Deploy Svelte App to GitHub Pages
on:
push:
branches:
- main
workflow_dispatch:
permissions:
contents: read
pages: write
id-token: write
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
- name: Install and Build
run: |
npm ci
npm run build
- name: Create .nojekyll
run: touch dist/.nojekyll
- name: Upload Artifact
uses: actions/upload-pages-artifact@v3
with:
path: dist
deploy:
needs: build
runs-on: ubuntu-latest
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
steps:
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v4
Para que o aplicativo funcione corretamente no GitHub Pages, o arquivo vite.config.ts
inclui uma configuração especial para o caminho base:
export default defineConfig({
plugins: [
tailwindcss(),
svelte(),
],
base: process.env.NODE_ENV === 'production' ? '/weboasis/' : './',
});
Isso garante que os caminhos dos recursos (JavaScript, CSS, imagens, etc.) sejam gerados corretamente:
/weboasis/
Adicionalmente, o arquivo 404.html
está configurado para redirecionar corretamente as solicitações em caso de atualização da página ou acesso direto a uma rota:
<script>
// Redirect to index.html with hash routing
const path = window.location.pathname;
const repo = '/weboasis/';
// Extract the path after the repo name to convert to hash route
let route = '';
if (path.indexOf(repo) !== -1) {
route = path.slice(path.indexOf(repo) + repo.length);
if (route.startsWith('/')) route = route.substring(1);
}
// Redirect to home with the hash route
window.location.href = window.location.origin + repo + (route ? '#/' + route : '');
</script>
Para realizar um deploy manual do projeto:
# Compila o projeto para produção
npm run build
# Publica no GitHub Pages usando gh-pages
npm run deploy
O script deploy
está configurado no package.json para utilizar o pacote gh-pages
:
"scripts": {
"predeploy": "npm run build",
"deploy": "gh-pages -d dist"
}
Este aplicativo implementa a técnica de respiração 4-7-8, desenvolvida pelo Dr. Andrew Weil:
Esta técnica simples pode ajudar a:
Este projeto implementa uma estratégia de testes abrangente, utilizando diferentes níveis de testes para garantir a qualidade e robustez do aplicativo:
Os testes unitários são implementados com Vitest e @testing-library/svelte, focando em componentes individuais e lógica de negócio isoladamente.
# Executar testes unitários em modo observador
npm test
# Executar testes unitários uma única vez
npm run test:run
# Gerar relatório de cobertura
npm run test:coverage
Arquivos relevantes:
vitest.config.ts
- Configuração do Vitestsrc/test/setup.ts
- Configuração global dos testes**/*.test.ts
- Arquivos de teste distribuídos ao lado dos componentesOs testes E2E são implementados com Playwright, simulando interações de usuário reais no aplicativo.
# Executar testes E2E
npm run e2e
# Executar testes E2E com interface visual
npm run e2e:ui
# Visualizar relatório de testes E2E
npm run e2e:report
Arquivos relevantes:
playwright.config.ts
- Configuração do Playwrighte2e-tests/
- Diretório contendo os testes E2EOs testes são executados automaticamente no pipeline de CI/CD a cada push ou pull request:
.github/workflows/test-coverage.yml
Para testes mais eficientes e isolados, utilizamos diferentes estratégias de mocking:
# Desenvolvimento
npm run dev # Inicia servidor de desenvolvimento
# Build para produção
npm run build # Gera versão otimizada para produção
# Preview
npm run preview # Visualiza a versão de produção localmente
# Verifica tipos TypeScript
npm run check # Executa verificação de tipos
# Deploy para GitHub Pages
npm run deploy # Publica no GitHub Pages
# Testes
npm test # Executa testes unitários em modo observador
npm run test:run # Executa testes unitários uma única vez
npm run test:coverage # Gera relatório de cobertura
npm run e2e # Executa testes E2E
npm run e2e:ui # Executa testes E2E com interface visual
npm run e2e:report # Visualiza relatório de testes E2E
npm run test:all # Executa testes unitários e E2E sequencialmente
Clone o repositório
git clone https://github.com/seu-usuario/breathing-app-svelte.git
cd breathing-app-svelte
Instale as dependências
npm install
Inicie o servidor de desenvolvimento
npm run dev
Acesse o projeto
O aplicativo estará disponível em http://localhost:5173
O aplicativo está configurado para deploy automático no GitHub Pages usando GitHub Actions.
Cada push para a branch main
aciona uma build e deploy automático.
Este projeto está licenciado sob a licença MIT - veja o arquivo LICENSE para detalhes.