Objetivo: Fornecer convenções de estilo de código para o desenvolvimento do Save Money, uma aplicação web SPA (Single Page Application) para gestão financeira.
📁 docs/
├── core/ # Núcleo da aplicação SPA
│ ├── components/ # Componentes reutilizáveis
│ │ ├── common/ # Componentes comuns
│ │ │ ├── avatar.js # Componente de avatar
│ │ │ ├── button.js # Componente de botão
│ │ │ ├── darkmode.js # Componente de tema escuro
│ │ │ ├── icon.js # Componente de ícone
│ │ │ ├── input.js # Componente de input
│ │ │ ├── logo.js # Componente de logo
│ │ │ ├── modal.js # Componente de modal
│ │ │ └── toast.js # Componente de notificação
│ │ └── layout/ # Componentes de layout
│ │ ├── header.js # Componente de cabeçalho
│ │ ├── navbar.js # Componente de navegação
│ │ └── router.js # Componente de roteamento
│ ├── pages/ # Páginas da aplicação
│ │ ├── home/ # Página inicial
│ │ ├── login/ # Página de login
│ │ ├── registration/ # Página de registro
│ │ ├── investimentos/ # Página de investimentos
│ │ ├── profile/ # Página de perfil
│ │ ├── remember/ # Página de recuperação
│ │ ├── user-edit/ # Página de edição de usuário
│ │ ├── testes/ # Páginas de teste
│ │ └── notfound.js # Página 404
│ ├── services/ # Serviços e APIs
│ │ ├── auth.js # Serviço de autenticação
│ │ ├── crypto.js # Serviço de criptografia
│ │ ├── secure-storage.js # Serviço de armazenamento seguro
│ │ └── toast.js # Serviço de notificações
│ ├── store/ # Gerenciamento de estado
│ │ ├── investimentos.js # Store de investimentos
│ │ ├── navbarStore.js # Store da navegação
│ │ └── visibilityStore.js # Store de visibilidade
│ ├── utils/ # Funções utilitárias
│ │ ├── currency.js # Utilitários de moeda
│ │ ├── date.js # Utilitários de data
│ │ └── route.js # Utilitários de rota
│ ├── index.js # Ponto de entrada
│ └── initPageExternal.js # Inicialização externa
├── assets/ # Recursos estáticos
├── styles/ # Arquivos CSS
│ ├── global.css # Estilos globais e variáveis CSS
│ └── reset.css # Reset de estilos padrão
└── index.html # Página principal
✅ Web Components com Shadow DOM:
// Exemplo de componente com Shadow DOM
export class BaseComponent extends HTMLElement {
constructor() {
super();
this.attachShadow({ mode: 'open' });
}
connectedCallback() {
this.render();
}
render() {
this.shadowRoot.innerHTML = `
<style>
:host {
display: block;
}
/* Estilos encapsulados */
</style>
<div class="component-container">
<!-- Template do componente -->
</div>
`;
}
}✅ Sistema de rotas com hash e lazy loading:
// core/routes/index.js
export const routes = {
'#/': {
component: 'home-page',
showHeader: true,
protected: true,
load: () => import('../pages/home/page.js'),
},
'#/login': {
component: 'login-page',
showHeader: false,
load: () => import('../pages/login/page.js'),
},
'#/investimentos': {
component: 'investments-page',
showHeader: true,
protected: true,
load: () => import('../pages/investimentos/page.js'),
}
};app-header: Cabeçalho da aplicaçãoapp-navbar: Barra de navegaçãoapp-router: Gerenciador de rotas
app-avatar: Componente de avatar do usuárioapp-button: Botão personalizadoapp-darkmode: Controle de tema escuroapp-icon: Componente de íconesapp-input: Campo de entradaapp-logo: Logo da aplicaçãoapp-modal: Modal para diálogosapp-toast: Notificações toast
home-page: Página iniciallogin-page: Página de loginregistration-page: Página de registroinvestments-page: Página de investimentosprofile-page: Página de perfilnot-found-page: Página 404
O projeto utiliza dois arquivos principais para estilos:
- Remove estilos padrão do navegador
- Normaliza o comportamento entre diferentes navegadores
- Define valores base para elementos HTML
Contém as variáveis CSS para suporte a temas light e dark mode:
/* Light Mode */
body.light-mode {
/* Cores básicas */
--color-primary: #0056b3;
--color-secondary: #28a745;
--color-background: #f8f9fa;
--color-text: #333;
/* ... outras cores ... */
/* Gradientes */
--gradient-primary: linear-gradient(90deg, #add8b5 0%, #5b725f 100%);
--gradient-secondary: linear-gradient(90deg, #e0e0e0 0%, #b0b0b0 100%);
/* ... outros gradientes ... */
/* Componentes */
--button-primary-bg: var(--gradient-primary);
--button-primary-text-color: var(--color-white);
--input-background-color: var(--color-white);
--input-text-color: var(--color-black);
/* ... outras variáveis de componentes ... */
}
/* Dark Mode */
body.dark-mode {
/* Cores básicas */
--color-primary: #4dabf7;
--color-secondary: #51cf66;
--color-background: #121212;
--color-text: #f1f3f5;
/* ... outras cores ... */
/* Gradientes */
--gradient-primary: linear-gradient(90deg, #3a765a 0%, #1f4037 100%);
--gradient-secondary: linear-gradient(90deg, #495057 0%, #343a40 100%);
/* ... outros gradientes ... */
/* Componentes */
--button-primary-bg: var(--gradient-primary);
--button-primary-text-color: var(--color-white);
--input-background-color: #1e1e1e;
--input-text-color: var(--color-white);
/* ... outras variáveis de componentes ... */
}As variáveis CSS são organizadas em categorias:
- Cores básicas: Definições de cores primárias, secundárias e estados
- Gradientes: Combinações de cores para efeitos visuais
- Backgrounds: Cores de fundo para diferentes contextos
- Text Colors: Cores para textos e estados
- Componentes: Variáveis específicas para cada componente:
- Header
- InvestmentCard
- Toast
- Input
- Button
- Logo
- Navbar
Para usar as variáveis em componentes:
class CustomComponent extends HTMLElement {
constructor() {
super();
this.attachShadow({ mode: 'open' });
}
render() {
this.shadowRoot.innerHTML = `
<style>
:host {
display: block;
}
.container {
background: var(--background-card-color);
color: var(--text-color);
padding: 1rem;
border-radius: var(--button-border-radius);
box-shadow: var(--header-box-shadow);
}
.button {
background: var(--button-primary-bg);
color: var(--button-primary-text-color);
border: var(--button-primary-border);
border-radius: var(--button-border-radius);
padding: var(--button-md-padding);
font-size: var(--button-md-font-size);
}
.button:hover {
background: var(--button-primary-hover-bg);
}
.input {
background: var(--input-background-color);
color: var(--input-text-color);
border: 1px solid var(--input-border-color);
}
.input:disabled {
background: var(--input-disabled-background-color);
color: var(--input-disabled-text-color);
border-color: var(--input-disabled-border-color);
}
</style>
<div class="container">
<input class="input" type="text">
<button class="button">Clique aqui</button>
</div>
`;
}
}- Componentes independentes
- Roteamento client-side
- Lazy loading de módulos
- Code splitting
- Lazy loading de rotas
- Otimização de assets
- Cache de componentes
- Código modular
- Padrão de projeto consistente
- Documentação de componentes
- ARIA labels
- Navegação por teclado
- Contraste adequado
- Feedback visual
✅ Padrão de nomenclatura para componentes:
- Prefixo
app-para todos os componentes - Nome em kebab-case
- Sufixo indicando o tipo de componente
// Componentes comuns
customElements.define('app-button', ButtonComponent);
customElements.define('app-input', InputComponent);
customElements.define('app-toast', ToastComponent);
// Componentes de layout
customElements.define('app-header', HeaderComponent);
customElements.define('app-navbar', NavbarComponent);
customElements.define('app-router', RouterComponent);
// Páginas
customElements.define('home-page', HomePage);
customElements.define('login-page', LoginPage);
customElements.define('investments-page', InvestmentsPage);✅ Padrão de nomenclatura para variáveis CSS:
- Prefixo
--para todas as variáveis - Agrupamento por contexto
- Nomes descritivos em kebab-case
/* Cores básicas */
--color-primary
--color-secondary
--color-background
/* Componentes */
--button-primary-bg
--button-primary-text-color
--input-background-color
--input-text-color
/* Estados */
--button-hover-bg
--input-disabled-bg
--toast-error-bg✅ Padrão de nomenclatura para rotas:
- Uso de hash (#) para navegação
- Nomes em português para rotas públicas
- Estrutura clara e hierárquica
const routes = {
'#/': {
component: 'home-page',
showHeader: true,
protected: true
},
'#/login': {
component: 'login-page',
showHeader: false
},
'#/investimentos': {
component: 'investments-page',
showHeader: true,
protected: true
}
};✅ Padrão de nomenclatura para páginas:
- Sufixo
-pagepara componentes de página - Nomes em inglês para arquivos
- Estrutura de diretórios organizada
pages/
├── home/ # Página inicial
│ ├── page.js # Componente principal
│ └── styles.css # Estilos específicos
├── login/ # Página de login
│ ├── page.js
│ └── styles.css
└── investimentos/ # Página de investimentos
├── page.js
└── styles.css
✅ Padrão de nomenclatura para arquivos:
- Nomes em camelCase
- Sufixo indicando o tipo de arquivo
- Nomes descritivos e concisos
services/
├── auth.js # Serviço de autenticação
├── crypto.js # Serviço de criptografia
└── secure-storage.js # Serviço de armazenamento
utils/
├── currency.js # Utilitários de moeda
├── date.js # Utilitários de data
└── route.js # Utilitários de rota
✅ Padrão de nomenclatura para classes e métodos:
- Classes em PascalCase
- Métodos em camelCase
- Nomes descritivos e em inglês
class BaseComponent extends HTMLElement {
constructor() {
super();
this.attachShadow({ mode: 'open' });
}
connectedCallback() {
this.render();
this.setupEventListeners();
}
render() {
// Implementação do render
}
setupEventListeners() {
// Configuração de eventos
}
}