--> Versão em Inglês
Resumo
Esse artigo contém os FUNDAMENTOS para desenvolver interfaces menos confusas. Nada aqui é uma "verdade absoluta". Mas considero leitura obrigatória para quem quiser começar a pensar sobre User Interfaces.
Start
Em uma interface 2D, tudo o que você vê existe dentro de uma hierarquia.
Cada nível contém o próximo, como caixas aninhadas.
Nível 0: Window — O Observador
O que é: A janela de visualização do navegador. O espaço de visualização do seu monitor.
Distinção crítica: Window não faz parte da estrutura da interface. Window é o meio pelo qual você observa a interface.
Analogia: Livro vs. Olho
- Livro completo = Pages (pode ter 100 páginas de conteúdo)
- Seu campo de visão = Window (vê 2 páginas por vez)
- Virar a página = scroll
A relação:
- Page com 3000px de altura
- Window com 800px de altura
- Você vê ~27% da Page de uma só vez
- Scroll revela a parte invisível
Lembre-se: Window ≠ Page
Nível 1: Page — O Universo
O que é: A maior unidade indivisível. O espaço total de conteúdo.
Propriedade principal: Uma Page é indivisível como entidade. Você não "divide uma Página em duas Páginas". Você organiza uma Page usando Regions (Regiões).
<div class="page-home">
<!-- Tudo aqui é A Página -->
<!-- Não "duas páginas", mas UMA página com divisões -->
</div>
Distinções importantes:
Estrutural (delimitado por HTML):
<div class="page-home">
<!-- Estrutura explícita na marcação -->
</div>
Conceitual (delimitado por CSS):
.page-home {
display: grid;
grid-template-columns: 1fr 1fr; /* a divisão esquerda/direita existe apenas em CSS */
}
Ambas são válidas. Uma é explícita (estrutural), a outra é implícita (conceitual).
Camadas de índice Z:
Page (z-index: 0) ← Camada base,
Page (z-index: 1) ← Sobreposição (modal, foreground)
Page (z-index: -1) ← Camada de fundo, background
Uma Page pode possuir vários Layers, camadas.
Pense nelas como folhas transparentes empilhadas umas sobre as outras.
Page é a combinação desses layers quando existir mais de um.
Nível 2: Region — Divisões Espaciais
O que é: Uma Page contém Regions. As Regions organizam o espaço, não substituem a Page.
O princípio da divisibilidade:
❌ Pensamento errado:
"Uma Page se divide em esquerda e direita, criando duas novas Pages"
✅ Pensamento correto:
"Uma Page contém a Region Left e a Region right"
Exemplo:
<div class="page-home">
<div class="region-top"></div> <!-- Região 1 -->
<div class="region-bottom"></div> <!-- Região 2 -->
</div>
Estrutural vs. Conceitual:
Estrutural:
<div class="region-left">
<!-- Elemento HTML explícito -->
</div>
Conceitual:
.page-home {
display: flex;
/* A "região" da esquerda são os primeiros 300px, a "região" da direita é o espaço restante */
/* Não há elementos HTML explícitos, mas as regiões existem conceitualmente */
}
Espaço entre Regiões:
<div class="page">
<div class="region-top"></div>
<div class="region-bottom" style="margin-top: 30px"></div>
<!-- O espaço de 30px é PARTE DA PÁGINA, não uma terceira região -->
</div>
O espaço disponível não é uma região. Ele pode ser ocupado por uma região
Nível 3: Section — Divisões Funcionais
O que é: Uma Region contém Sections. As sections são organizadas por propósito/função.
Diferença:
- Region = organização espacial ("onde na tela": superior, esquerda, direita, inferior)
- Section = organização funcional ("o que faz": cabeçalho, navegação, conteúdo)
Exemplo:
<div class="page-home">
<div class="region-top">
<div class="section-header">Conteúdo do cabeçalho</div>
</div>
<div class="region-bottom">
<div class="section-left">Navegação da barra lateral</div>
<div class="section-right">Conteúdo principal</div>
</div>
</div>
Estrutural vs. Conceitual:
Estrutural:
<div class="section-navigation">
<!-- Elemento explícito -->
</div>
Conceitual:
.region-sidebar {
display: flex;
flex-direction: column;
/* Os 100px superiores são conceitualmente "seção de navegação" */
/* O espaço restante é conceitualmente "seção de conteúdo" */
/* Sem HTML explícito, mas as seções existem conceitualmente */
}
Nível 4: Component — A Parte Complexa
O que é: Uma Section exibe Components. Components são unidades operacionais que podem ter estado e comportamento.
<div class="section-header">
<app-header>Componente de Cabeçalho</app-header>
</div>
Tipos de Components
É aqui que fica interessante. Existem várias maneiras de classificar Componentes:
Classificação 1: Por Divisão Espacial
Componente Simples:
<div class="card">
<img /> <!-- Element -->
<h3></h3> <!-- Element -->
<p></p> <!-- Element -->
</div>
Sem divisões espaciais. Apenas um conjunto de Elements.
Component Formal (Micro Pages / Fractal Pages):
<div class="card-complex">
<div class="region-header"> <!-- Possui Regiões -->
<div class="section-title"> <!-- Possui Seções -->
<h3></h3> <!-- Possui Elementos -->
</div>
</div>
<div class="region-content">
<!-- ... -->
</div>
</div>
Contém a estrutura completa: Regions → Sections → Elements (em vez de Componentes).
Essa classificação é contextual e dinâmica, não fixa.
Classificação 2: Por Composição
Composite Component (componente composto):
<div class="user-profile">
<app-avatar /> <!-- Subcomponente -->
<app-user-info /> <!-- Subcomponente -->
<app-actions /> <!-- Subcomponente -->
</div>
Composto por outros Componentes (Subcomponents).
Subcomponent: Qualquer Component exibido dentro de outro Component.
Classificação 3: Por Utilização
Composite Component (componente composto):
<div class="sidebar">
<app-button name="home" /> <!-- Subcomponente -->
</div>
<div class="menu">
<app-button name="options" /> <!-- Subcomponente -->
</div>
<app-button name="start" /> <!-- Element -->
Quando um elemento é utilizado em diversos components ele pode ser considerado um Element
E pertencer a uma lib de elements, não de components
Classificação 4: Por Complexidade
Complex Component:
<div class="data-table">
<app-table-header /> <!-- Subcomponente -->
<app-table-body /> <!-- Subcomponente -->
<app-pagination /> <!-- Subcomponente -->
<!-- Cada subcomponente também é um componente complexo -->
</div>
Formado por vários subcomponentes que trabalham juntos.
Nível 5: Element — O Átomo
O que é: A menor unidade funcional.
Exemplos:
-
<button>
— um botão -
<input>
— um campo de entrada -
<a>
— um link -
<img>
— uma imagem
Importante: Os elementos também podem ser Simples ou Formais.
Elemento Simples
<button>Clique aqui</button>
Apenas texto. Sem estrutura interna.
Elemento Formal
<button class="complex-button">
<div class="section-left">
<svg class="icon"></svg> <!-- Subelement: icon -->
</div>
<div class="section-center">
<span class="text">Click</span> <!-- Subelement: text -->
</div>
<div class="section-right">
<svg class="dropdown"></svg> <!-- Subelement: dropdown icon -->
</div>
</button>
Possui Regions e Sections estruturais ou conceituais.
A mudança de classificação:
Quando um item deixa de ser um Element e se torna um Subelement ou Component?
O contexto determina:
<button>Clique aqui</button> <!-- Element -->
<button class="icon-button"> <!-- Element -->
<span>Texto</span> <!-- Subelement -->
</button>
Este é um Element (unidade de interação atômica).
Quando exibe um menu:
<button class="dropdown-button" @click="showMenu">
<svg></svg>
<span>Texto</span>
<svg class="arrow"></svg>
</button>
<div class="dropdown-menu" v-if="menuVisible">
<!-- Itens de menu -->
</div>
Agora é um Component (tem estado, comportamento e gerencia subelements).
Quando usado dentro de outro component:
<div class="toolbar"> <!-- Component -->
<icon-button /> <!-- Agora é um Subcomponente -->
<icon-button />
<icon-button />
</div>
Agora é um Subcomponent (Component dentro de Component).
A Natureza Dinâmica da Classificação
Exemplo: Evolução do Botão Ícone
Estágio 1 - Simple Element:
<button>
<svg></svg>
</button>
Classificação: Element
Motivo: Unidade atômica, sem divisões internas
Estágio 2 - Formal Element:
<button>
<div class="section-left"><svg></svg></div>
<div class="section-center"><span>Texto</span></div>
<div class="section-right"><svg></svg></div>
</button>
Classificação: Element (ainda) ou Component (depende do contexto)
Motivo: Possui estrutura interna, mas ainda é uma unidade funcional
Estágio 3 - Simple Component:
<icon-button icon="search" text="Search" />
Classificação: Component
Motivo: pode ser decomposto em mais de uma funcionalidade
Etapa 4 - Subcomponent:
<div class="search-bar">
<icon-button icon="search" /> <!-- Este -->
<input />
<icon-button icon="clear" />
</div>
Classificação: Subcomponente
Motivo: Component usado dentro de outro component
Etapa 5 - Complex Component:
<icon-button-with-dropdown
icon="more"
@click="toggleMenu"
>
<dropdown-menu v-if="open">
<menu-item />
<menu-item />
</dropdown-menu>
</icon-button-with-dropdown>
Classificação: Complex Component
Motivo: Gerencia estado, possui subcomponentes, comportamento complexo
Controle de Visibilidade
Todas categorias podem ser hide and show:
// Ocultar Região
page.regions.top.hide()
// Ocultar Seção
page.regions.main.sections.sidebar.hide()
// Ocultar Componente
page.regions.main.sections.content.components.userCard.hide()
// Ocultar Elemento
page.regions.header.sections.nav.components.menu.elements.loginButton.hide()
Exemplo:
<div class="page">
<div class="region-top" v-if="showHeader"> <!-- Pode ocultar Região inteira -->
<div class="section-nav" v-if="showNav"> <!-- Pode ocultar Seção -->
<app-menu v-if="isLoggedIn"> <!-- Pode ocultar Componente -->
<button v-if="canEdit">Editar</button> <!-- Pode ocultar o Elemento -->
</app-menu>
</div>
</div>
</div>
Hierarquia Completa com Exemplos
Window (janela de visualização do navegador: 1920×1080)
↓ observa
Page (conteúdo total: 1920×3000)
↓ contém
Region (superior: 1920×100, principal: 1920×2800, rodapé: 1920×100)
↓ contém
Section (na região principal: barra lateral esquerda: 300×2800, conteúdo: 1620×2800)
↓ contém
Component (na barra lateral: componente do menu de navegação)
↓ contém
Sub-components (menu dropdown)
↓ contém
Elements (botões, inputs)
↓ contém
Sub-Elements (svg, text)
Modulos e Sub-modules — Agrupamento Funcional
O que é: Um eixo de classificação diferente. Enquanto a classificação espacial hierárquica se refere à contenção espacial (o que está dentro do quê), os Módulos se referem à coesão funcional (o que funciona em conjunto).
Insight principal: Os components podem ser separados espacialmente, mas unidos funcionalmente.
A Natureza Transversal
A classificação espacial hierárquica diz: "Este Component está dentro desta Section"
Module diz: "Estes Components, onde quer que estejam, pertencem a mesma Feature (recurso)"
Exemplo: Module Editor de Código
<div class="page">
<div class="region-left">
<div class="section-sidebar">
<file-tree /> <!-- Parte do Module Editor -->
<search-panel /> <!-- Parte do Module Editor -->
</div>
</div>
<div class="region-right">
<div class="section-main">
<code-editor /> <!-- Parte do Module Editor -->
<status-bar /> <!-- Parte do Module Editor -->
</div>
</div>
<div class="region-bottom">
<div class="section-terminal">
<terminal-panel /> <!-- Parte do Module Editor -->
</div>
</div>
</div>
Todos esses Components são espacialmente separados (diferentes Regions/Sections), mas funcionalmente unidos (Módulo Editor).
Definição de Module
Um Module é:
- Uma coleção de Components que trabalham juntos
- Pode abranger várias Regions/Sections
- Compartilha estado, dados ou comportamento
- Implementa um recurso/funcionalidade completo
Sub-modules
O que é: Modules podem conter Sub-modules para maior granularidade funcional.
Exemplo: Module Editor com Sub-modules
Editor Module
├─ File Management Sub-module
│ ├─ file-tree (in left sidebar)
│ ├─ file-tabs (in top bar)
│ └─ file-actions (in context menu)
│
├─ Code Editing Sub-module
│ ├─ code-editor (in main area)
│ ├─ syntax-highlighter (inside editor)
│ └─ autocomplete (overlay)
│
└─ Debugging Sub-module
├─ breakpoint-gutter (in editor margin)
├─ debug-toolbar (in top bar)
└─ variables-panel (in right sidebar)
Todos os components no "Sub-module de Gerenciamento de Arquivos" compartilham o estado:
- Abrir um arquivo em
file-tree
atualizafile-tabs
- Fechar uma aba em
file-tabs
atualiza a seleção defile-tree
-
file-actions
opera no estado de ambos
Distinção de Outras Classificações
Component vs. Module:
Component | Module |
---|---|
Um único item de UI | Vários items de UI |
Um lugar na hierarquia | Pode abranger vários lugares |
Contido em Section | Atravessa Sections |
Exemplo: <button>
|
Exemplo: Recurso "Autenticação" |
Exemplo: Module de Autenticação
<!-- Spatially: different locations -->
<!-- In top-right Region -->
<user-avatar /> <!-- Auth Module Component -->
<!-- In dropdown overlay -->
<login-form /> <!-- Auth Module Component -->
<!-- In settings Section -->
<account-settings /> <!-- Auth Module Component -->
<!-- In modal -->
<change-password /> <!-- Auth Module Component -->
Todos esses components pertencem ao Module de Autenticação, apesar de estarem em partes completamente diferentes da interface.
Comunicação de Modules
Modules podem:
- Compartilhar estado global
- Comunicar-se por meio de eventos
- Acessar serviços compartilhados
- Coordenar comportamentos
Exemplo:
// Editor Module components communicate
fileTree.onSelect(file => {
codeEditor.open(file) // Different Component, same Module
statusBar.update(file.path) // Different Component, same Module
terminal.setContext(file.dir) // Different Component, same Module
})
Hierarquia de Module vs. Component
São conceitos ortogonais:
Hierarquia Espacial:
Page → Region → Section → Component
Agrupamento Funcional:
Modulo → Sub-module → Component
Um Component existe em AMBOS:
<file-tree />
Spatial location:
Page → region-left → section-sidebar → file-tree
Functional membership:
Editor Module → File Management Sub-module → file-tree
Guia Prático de Decisões
Ao construir uma interface, pergunte-se:
É um Componente ou Elemento?
É um Element se:
- Ponto de interação único
- Não pode ser dividido significativamente
- Sem gerenciamento de estado interno
- Pode ser utilizado por outros componentes
- Exemplo:
<button>
,<input>
,<a>
É um Component se:
- Possui estrutura interna
- Gerencia estado ou comportamento
- Exemplo:
<search-bar>
,<user-card>
,<data-table>
É uma Region ou Section?
É uma Região se:
- Divisão principalmente espacial
- Responde "onde?" (superior, esquerda, direita, inferior)
- Focado no layout
É uma Section se:
- Divisão principalmente funcional
- Responde "o quê?" (navegação, conteúdo, cabeçalho)
- Focado no propósito
É estrutural ou conceitual?
Estrutural:
<div class="region-sidebar">
<!-- Explícito em HTML -->
</div>
Conceitual:
.page {
display: grid;
grid-template-columns: 300px 1fr;
/* A área esquerda é conceitualmente "region-sidebar" */
/* Nenhum elemento HTML explícito necessário */
}
Princípios-chave
Window define o espaço, não o conteúdo
Window ≠ Page. A window exibe a Page.Indivisibilidade significa integridade da entidade
Uma Page não se divide em duas páginas. Uma Page contém Regions.A classificação é contextual
Um mesmo item pode ser Element, Sub-element, Component ou Sub-component, dependendo do uso.A estrutura pode ser explícita ou implícita
A estrutura HTML ou o layout CSS criam divisões válidas.Existe fractalidade
Os components podem conter uma estrutura completa semelhante à de uma Page (Regions → Sections → Elements).A visibilidade é hierárquica
Ocultar uma região → todas as suas seções/componentes/elementos também são ocultados.
Erros Comuns
❌ "Minha página tem duas páginas: esquerda e direita"
✅ "Minha página tem duas regiões: esquerda e direita"
❌ "Janela é o contêiner da página"
✅ "Janela é a janela de visualização que observa a página"
❌ "Este botão é sempre um elemento"
✅ "Este botão é um elemento neste contexto, componente em outro"
❌ "Todas as divisões devem estar em HTML"
✅ "As divisões podem ser estruturais (HTML) ou conceituais (CSS)"
❌ "Componentes não podem conter regiões"
✅ "Componentes formais são micropáginas com estrutura completa"
Lista de Verificação Final
Criando uma interface? Verifique:
- [ ] Window: Quais tamanhos de janela de visualização eu suporto?
- [ ] Page: O conteúdo cabe? Precisa de rolagem? Várias camadas de índice z?
- [ ] Region:** Como divido o espaço? (Estrutural ou conceitual?)
- [ ] Section: Quais áreas funcionais existem em cada região?
- [ ] Component: O que é reutilizável? Simples ou formal? Composto?
- [ ] Element: Quais são os pontos de interação atômicos?
- [ ] Classificação: Minha nomenclatura está contextualmente correta?
Fim. Agora você entende a estrutura completa de uma interface 2D, da janela de visualização ao átomo.
Referências:
PARNAS, David L. On the Criteria To Be Used in Decomposing Systems into Modules. Communications of the ACM, Vol. 15, No. 12, pp. 1053 – 1058, 1972.
DESCARTES, René. Discurso do método. 2. ed. São Paulo: Martins Fontes, 2001. 102 p.
(“Dividir cada uma das dificuldades que eu examinasse em tantas parcelas quantas possíveis e quantas necessárias fossem para melhor resolvê-las”)
Top comments (0)