Linear: O Novo Padrão para Design de Software

Como a Linear se tornou o padrão de design para software moderno: UX com foco no teclado, UI otimista, paleta de comandos e dark mode. Com padrões de implementação em CSS e TypeScript.

5 min de leitura 1123 palavras
Linear: O Novo Padrão para Design de Software screenshot

Linear: O Novo Padrão para Design de Software

“Software deve ser opinativo e rápido.” — Karri Saarinen, CEO da Linear

Linear é uma ferramenta de gerenciamento de projetos que redefiniu como o software moderno pode ser percebido. Lançada em 2019 por ex-designers do Uber e Airbnb, ela prova que software B2B não precisa ser feio ou lento.


Por Que a Linear Importa

Linear se posiciona como uma declaração de design contra software corporativo inchado e projetado por comitê. Ela mostra o que acontece quando designers constroem para designers.

Principais conquistas: - Fez software corporativo parecer software de consumo - Provou que interfaces keyboard-first podem ser bonitas - Demonstrou que performance é uma funcionalidade - Estabeleceu um novo padrão de qualidade para produtos SaaS


Principais Aprendizados

  1. Velocidade é uma funcionalidade, não uma métrica - O foco obsessivo da Linear em interações abaixo de 100ms prova que performance percebida cria resposta emocional
  2. Keyboard-first significa que usuários avançados ganham - Paleta de comandos (Cmd+K) e atalhos mnemônicos (S para Status, P para Prioridade) aceleram especialistas sem bloquear iniciantes
  3. Densidade de informação supera espaço em branco - Mostre mais dados com menos chrome; revele detalhes no hover em vez de esconder atrás de cliques
  4. Modo escuro como experiência primária - Projetar dark-first cria estética premium e reduz fadiga visual para usuários avançados
  5. UI otimista elimina espera - Atualize localmente primeiro, sincronize em segundo plano, e só mostre erros quando realmente acontecerem

Princípios Fundamentais de Design

1. Velocidade como Funcionalidade

Linear é obsessivamente rápida. Cada interação parece instantânea.

Como eles conseguem: - Atualizações de UI otimistas (assumir sucesso, reverter em falha) - Arquitetura local-first - Cache agressivo - Requisições de rede mínimas

Insight de implementação:

// Padrão de atualização otimista
function updateIssue(id: string, changes: Partial<Issue>) {
  // 1. Atualizar estado local imediatamente
  localStore.update(id, changes)

  // 2. Mostrar estado de sucesso
  ui.showSaved()

  // 3. Sincronizar com servidor em segundo plano
  api.updateIssue(id, changes).catch(() => {
    // 4. Reverter apenas em falha
    localStore.rollback(id)
    ui.showError()
  })
}

Aplicação no design: - Estados de carregamento devem ser invisíveis quando possível - Skeleton screens apenas quando necessário - Nunca bloqueie o usuário de sua próxima ação


2. Keyboard-First, Amigável ao Mouse

Linear é projetada para usuários avançados, mas acolhedora para iniciantes.

A paleta de comandos (Cmd+K): - Ponto de entrada universal para todas as ações - Busca fuzzy em tudo - Atalhos de teclado descobríveis - Nunca requer sair do teclado

┌────────────────────────────────────────────────────────────┐
│ Cmd+K                                                      │
├────────────────────────────────────────────────────────────┤
│ > Buscar issues, projetos ou comandos...                   │
│                                                            │
│   Recentes                                                 │
│   ├─ FE-123 Corrigir animação de navegação        Cmd+O   │
│   ├─ BE-456 Rate limiting da API                  Cmd+O   │
│   └─ Criar nova issue                             C       │
│                                                            │
│   Comandos                                                 │
│   ├─ Alterar status                               S       │
│   ├─ Atribuir issue                               A       │
│   └─ Definir prioridade                           P       │
│                                                            │
└────────────────────────────────────────────────────────────┘

Princípios de implementação: - Toda ação tem um atalho de teclado - Atalhos são mnemônicos (S para Status, P para Prioridade) - Mouse funciona perfeitamente. Teclado é mais rápido - Ajuda está sempre a uma tecla de distância


3. Densidade de Informação Bem Feita

Linear mostra muita informação sem parecer bagunçada.

Como eles equilibram densidade:

POLUÍDO (típico enterprise):
┌────────────────────────────────────────────────────────────┐
│ [ ] * FE-123 | Corrigir bug | João | Alta | Em Progresso | 2d   │
│     Tags: frontend, urgente, sprint-12, revisado          │
│     Criado: 1 Jan | Atualizado: 5 Jan | Prazo: 10 Jan     │
│     Comentários: 5 | Anexos: 2 | Subtarefas: 3/5          │
├────────────────────────────────────────────────────────────┤
│ [ ] * FE-124 | Outro bug | Maria | Média | A Fazer | 1d   │
│     ... (repetindo todos os metadados)                    │
└────────────────────────────────────────────────────────────┘

ABORDAGEM DA LINEAR:
┌────────────────────────────────────────────────────────────┐
│ [x] FE-123  Corrigir bug de animação de navegação ^  João  ** │
│ [ ] FE-124  Atualizar endpoint de perfil             Maria  *  │
│ [x] FE-125  Adicionar toggle de modo escuro       ^  Alex  ***│
└────────────────────────────────────────────────────────────┘
                                                     ^    ^
                                          Prioridade  Responsável  Estimativa
                                          (seta)      (nome)       (pontos)

Princípios: - Mostrar apenas o necessário em cada nível - Usar ícones e símbolos em vez de labels de texto - Revelar detalhes no hover/seleção - Divulgação progressiva sob demanda


4. Linguagem Visual Consistente

O design system da Linear é coeso e consistente.

Sistema de cores:

/* Cores semânticas inspiradas na Linear */
:root {
  /* Cores de status - altamente saturadas, distintas */
  --status-backlog: #6B7280;    /* Cinza - não iniciado */
  --status-todo: #3B82F6;       /* Azul - pronto */
  --status-progress: #F59E0B;   /* Âmbar - em trabalho */
  --status-done: #10B981;       /* Verde - completo */
  --status-cancelled: #EF4444;  /* Vermelho - cancelado */

  /* Prioridade - mudança consistente de matiz */
  --priority-urgent: #EF4444;   /* Vermelho */
  --priority-high: #F97316;     /* Laranja */
  --priority-medium: #EAB308;   /* Amarelo */
  --priority-low: #6B7280;      /* Cinza */
  --priority-none: #374151;     /* Cinza escuro */

  /* Hierarquia de superfícies */
  --bg-primary: #0D0D0D;        /* Fundo principal */
  --bg-elevated: #141414;       /* Cards, painéis */
  --bg-hover: #1F1F1F;          /* Estados de hover */
  --bg-active: #292929;         /* Ativo/selecionado */
}

Tipografia:

/* Linear usa Inter para tudo */
:root {
  --font-family: 'Inter', -apple-system, sans-serif;

  /* Escala compacta, alta legibilidade */
  --text-xs: 11px;    /* Metadados */
  --text-sm: 12px;    /* Secundário */
  --text-base: 13px;  /* Corpo (menor que o típico) */
  --text-lg: 14px;    /* Ênfase */
  --text-xl: 16px;    /* Títulos */
  --text-2xl: 20px;   /* Títulos de página */
}

5. Modo Escuro por Padrão

Linear escolheu o modo escuro como experiência primária.

Por que isso funciona: - Reduz fadiga visual para usuários avançados (longas horas) - Cria estética premium e focada - Faz as cores de status se destacarem - Alinha com a estética de ferramentas de desenvolvimento

Implementação:

/* Design dark-first */
:root {
  color-scheme: dark;

  --text-primary: rgba(255, 255, 255, 0.95);
  --text-secondary: rgba(255, 255, 255, 0.65);
  --text-tertiary: rgba(255, 255, 255, 0.45);

  --border-default: rgba(255, 255, 255, 0.08);
  --border-hover: rgba(255, 255, 255, 0.12);
}

/* Modo claro como override */
[data-theme="light"] {
  --text-primary: rgba(0, 0, 0, 0.90);
  --text-secondary: rgba(0, 0, 0, 0.60);
  /* ... */
}

6. Micro-Interações que Encantam

Cada interação na Linear foi considerada.

Exemplos: - Cards de issues se elevam levemente no hover - Mudanças de status têm transições sutis de cor - Arrastar e soltar tem movimento suave, baseado em física - Checkboxes têm feedback satisfatório de clique

Princípios de animação:

/* Movimento da Linear */
:root {
  --ease-out: cubic-bezier(0.16, 1, 0.3, 1);
  --ease-in-out: cubic-bezier(0.65, 0, 0.35, 1);

  --duration-fast: 100ms;     /* Micro feedback */
  --duration-normal: 150ms;   /* Transições padrão */
  --duration-slow: 250ms;     /* Transições de página */
}

.issue-card {
  transition:
    transform var(--duration-fast) var(--ease-out),
    box-shadow var(--duration-normal) var(--ease-out);
}

.issue-card:hover {
  transform: translateY(-1px);
  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
}

Padrões de Design para Aprender

A Paleta de Comandos

O Cmd+K da Linear agora é um padrão esperado em software moderno.

Guia de implementação:

<!-- Estrutura da paleta de comandos -->
<dialog class="command-palette" aria-label="Menu de comandos">
  <header>
    <input
      type="text"
      placeholder="Buscar issues ou comandos..."
      aria-describedby="command-hint"
    />
  </header>

  <nav aria-label="Resultados de comandos">
    <section aria-label="Recentes">
      <h3>Recentes</h3>
      <ul role="listbox">
        <li role="option" tabindex="0">
          <span class="issue-id">FE-123</span>
          <span class="issue-title">Corrigir bug</span>
          <kbd>Cmd+O</kbd>
        </li>
      </ul>
    </section>

    <section aria-label="Comandos">
      <h3>Comandos</h3>
      <!-- ... -->
    </section>
  </nav>
</dialog>

Menus Contextuais

Menus de clique direito que mostram exatamente o que você precisa.

Clique direito na issue:
┌────────────────────────────────┐
│  Abrir issue           Cmd+O  │
│  Abrir em nova aba Cmd+Shft+O │
├────────────────────────────────┤
│  Definir status            S  │
│  Definir prioridade        P  │
│  Atribuir                  A  │
├────────────────────────────────┤
│  Copiar link           Cmd+C  │
│  Copiar ID                    │
├────────────────────────────────┤
│  Excluir             Backspace│
└────────────────────────────────┘

Edição Inline

Editar sem diálogos modais.

ANTES (clique para editar):
┌────────────────────────────────────────┐
│  Corrigir bug de navegação   [Editar] │
└────────────────────────────────────────┘

DEPOIS (edição inline ao clicar):
┌────────────────────────────────────────┐
│  Corrigir bug de navegação|            │  ← Cursor aparece
│  ──────────────────────────            │    no lugar
└────────────────────────────────────────┘

O Que Copiar da Linear

Para Qualquer Projeto de Software

  1. Velocidade é inegociável - Otimize performance percebida e real
  2. Atalhos de teclado em todo lugar - Mas não os exija
  3. Paleta de comandos - Ponto de acesso universal
  4. Modo escuro bem feito - Não como pensamento tardio
  5. Densidade de informação - Mostrar mais com menos
  6. Linguagem de design consistente - Todo elemento parece relacionado

Técnicas Específicas

Técnica Como Aplicar
UI Otimista Atualizar localmente primeiro, sincronizar em segundo plano
Busca fuzzy Usar Fuse.js ou similar para paleta de comandos
Atalhos mnemônicos S para Status, P para Prioridade, A para Atribuir
Elevação sutil Elevação de 1-2px no hover, não sombras dramáticas
Cores semânticas Sistema consistente de cores de status/prioridade
Tipografia compacta Texto de corpo de 13px, denso mas legível

Citações-Chave da Equipe Linear

“Pensamos em velocidade como uma funcionalidade. Se algo leva 300ms, parece quebrado.”

“Cada pixel deve ser intencional. Se você não consegue explicar por que algo está lá, remova.”

“Keyboard-first não significa apenas teclado. Significa respeitar usuários avançados.”


Perguntas Frequentes

O que torna a Linear mais rápida que outras ferramentas de gerenciamento de projetos?

Linear usa atualizações de UI otimistas, arquitetura local-first e cache agressivo. Quando você muda o status de uma issue, a UI atualiza imediatamente enquanto a sincronização acontece em segundo plano. A maioria das interações parece instantânea porque Linear assume sucesso e só mostra erros quando eles ocorrem, em vez de bloquear em requisições de rede.

Como funciona a paleta de comandos (Cmd+K) da Linear?

A paleta de comandos é um ponto de entrada universal que usa busca fuzzy em issues, projetos e comandos. Ela suporta atalhos de teclado mnemônicos (S para Status, P para Prioridade, A para Atribuir) que os usuários podem descobrir através da paleta, e depois usar diretamente sem abri-la. Isso cria um caminho progressivo de aprendizado de iniciante a usuário avançado.

Por que a Linear escolheu o modo escuro como padrão?

Linear foi projetada para usuários avançados que passam longas horas no aplicativo. O modo escuro reduz fadiga visual, cria uma estética premium que diferencia do software corporativo típico, e torna as cores de status mais vibrantes. O modo claro existe como override, mas o modo escuro é o alvo principal do design.

Como a Linear alcança alta densidade de informação sem parecer bagunçada?

Linear usa símbolos e ícones em vez de labels de texto, mostra apenas metadados essenciais no nível de lista, e revela detalhes no hover ou seleção. A escala tipográfica é mais compacta que o típico (texto de corpo de 13px), e espaçamento consistente cria ritmo visual sem espaço em branco desperdiçado.

Qual é a abordagem da Linear para atalhos de teclado?

Toda ação na Linear tem um atalho de teclado, e os atalhos são mnemônicos (fáceis de lembrar). A paleta de comandos ensina atalhos mostrando-os ao lado de cada ação. Isso significa que usuários de mouse podem trabalhar perfeitamente bem, mas usuários de teclado podem trabalhar muito mais rápido. A filosofia de design é “keyboard-first, amigável ao mouse.”


Recursos

  • Site: linear.app
  • Changelog: O changelog da Linear é, por si só, lindamente projetado
  • Blog: Posts de engenharia e design da equipe
  • Twitter: @linear para atualizações de design