This content originally appeared on DEV Community and was authored by Gurigraphics
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”)
This content originally appeared on DEV Community and was authored by Gurigraphics