design/arc

4 min de leitura 1030 palavras
design/arc screenshot

Arc Browser: Reimaginando a Interface do Navegador

“O navegador é o sistema operacional agora. Então por que ele ainda parece software de 2008?” — Josh Miller, The Browser Company

O Arc questionou cada suposição sobre navegadores, desde o posicionamento das abas até o gerenciamento de janelas. O resultado é um navegador que parece mais uma ferramenta criativa do que um aplicativo utilitário.


Principais Conclusões

  1. Barra lateral vertical supera abas horizontais - Os títulos das abas permanecem legíveis, e o espaço vertical é abundante em monitores widescreen modernos
  2. Spaces separam contextos mentais - Abas de trabalho, pessoais e de projetos nunca se misturam, reduzindo a fricção cognitiva
  3. Barra de Comando > barra de URL - Busca universal entre abas, histórico e ações elimina a necessidade de organização perfeita
  4. Personalização do usuário gera fidelidade - Boosts permitem que usuários corrijam sites irritantes por conta própria, criando investimento pessoal
  5. Adeque o peso da interface à tarefa - O Little Arc prova que nem toda tarefa precisa da interface completa do navegador

Por Que o Arc é Importante

O Arc provou que até as interfaces mais estabelecidas podem ser reimaginadas. Chrome, Firefox, Safari todos seguem o mesmo layout básico estabelecido há décadas. O Arc se libertou tratando o navegador como um espaço de trabalho, não um gerenciador de janelas.

Principais conquistas: - Eliminou completamente a barra de abas tradicional - Fez a interface do navegador parecer nativa do macOS - Criou separação significativa entre pessoal e trabalho - Pioneiro na personalização de sites no nível do navegador - Construído para navegação com teclado em primeiro lugar


Princípios Fundamentais de Design

1. A Revolução da Barra Lateral

A inovação mais visível do Arc: substituir abas horizontais por uma barra lateral vertical que organiza conteúdo por contexto, não por recência.

BARRA DE ABAS TRADICIONAL:
┌──────────────────────────────────────────────────────────────┐
│ [←][→][↻] │ Aba 1 │ Aba 2 │ Aba 3 │ Aba 4 │ Aba 5 │ ... │ + │
├──────────────────────────────────────────────────────────────┤
│                                                              │
│                    Conteúdo da Página                        │
│                                                              │
└──────────────────────────────────────────────────────────────┘
 Problemas: Abas encolhem até ficarem ilegíveis, sem organização, linha infinita

MODELO DE BARRA LATERAL DO ARC:
┌────────────────┬─────────────────────────────────────────────┐
│  [*] Space     │                                             │
│  ───────────── │                                             │
│  Fixadas       │                                             │
│    Gmail       │                                             │
│    Calendário  │          Conteúdo da Página                 │
│    Notion      │          (largura total)                    │
│                │                                             │
│  ───────────── │                                             │
│  Hoje          │                                             │
│    Aba 1       │                                             │
│    Aba 2       │                                             │
│    Aba 3       │                                             │
│                │                                             │
│  [+ Nova Aba]  │                                             │
└────────────────┴─────────────────────────────────────────────┘
 Benefícios: Títulos legíveis, favoritos fixados, organizado por propósito

O Insight Principal: Espaço horizontal é premium; espaço vertical é abundante. Usar a barra lateral permite que os títulos das abas respirem.

Padrão CSS (Barra Lateral Colapsável):

.sidebar {
  --sidebar-width: 240px;
  --sidebar-collapsed: 48px;

  width: var(--sidebar-width);
  height: 100vh;
  display: flex;
  flex-direction: column;
  background: var(--surface-1);
  transition: width 0.2s ease-out;
}

.sidebar.collapsed {
  width: var(--sidebar-collapsed);
}

.sidebar.collapsed .tab-title {
  opacity: 0;
  pointer-events: none;
}

/* Hover para espiar */
.sidebar.collapsed:hover {
  width: var(--sidebar-width);
}

.sidebar.collapsed:hover .tab-title {
  opacity: 1;
  transition: opacity 0.15s ease-in 0.1s; /* Delay para revelação suave */
}

Padrão SwiftUI:

struct SidebarView: View {
    @State private var isCollapsed = false
    @State private var isHovering = false

    private var effectiveWidth: CGFloat {
        isCollapsed && !isHovering ? 48 : 240
    }

    var body: some View {
        VStack(alignment: .leading, spacing: 0) {
            PinnedSection()
            Divider()
            TodaySection()
            Spacer()
            NewTabButton()
        }
        .frame(width: effectiveWidth)
        .animation(.easeOut(duration: 0.2), value: effectiveWidth)
        .onHover { isHovering = $0 }
    }
}

2. Spaces: Organização Baseada em Contexto

Spaces separam trabalho de pessoal, projeto de projeto. Cada Space é um contexto completo de navegador com suas próprias abas, sites fixados e até tema.

ARQUITETURA DE SPACES:

┌─────────────────────────────────────────────────────────────┐
│                        Arc Browser                          │
├───────────┬───────────┬───────────┬─────────────────────────┤
│  Trabalho │  Pessoal  │  Projeto  │                         │
│  Space    │  Space    │  Space    │    Área de Conteúdo     │
│  ─────    │  ─────    │  ─────    │                         │
│  • Slack  │  • Gmail  │  • GitHub │                         │
│  • Docs   │  • Reddit │  • Figma  │                         │
│  • Jira   │  • Netflix│  • Notion │                         │
└───────────┴───────────┴───────────┴─────────────────────────┘

Cada Space tem:
├── Abas fixadas únicas
├── Abas "Hoje" separadas
├── Tema/gradiente de cor próprio
├── Contexto de navegação isolado
└── Atalho de teclado (Cmd+1, Cmd+2, etc.)

O Insight Principal: Contextos mentais não devem vazar. Abas de trabalho aparecendo durante o tempo pessoal cria fricção cognitiva.

Modelo de Dados:

interface Space {
  id: string;
  name: string;
  icon?: string;
  gradient: {
    from: string;
    to: string;
    angle: number;
  };
  pinnedTabs: Tab[];
  todayTabs: Tab[];
  archivedTabs: Tab[];
  profile?: BrowserProfile; // Cookies, histórico diferentes, etc.
}

interface Tab {
  id: string;
  url: string;
  title: string;
  favicon?: string;
  isPinned: boolean;
  lastAccessed: Date;
  parentFolderId?: string;
}

Implementação SwiftUI:

struct SpaceSwitcher: View {
    @Binding var currentSpace: Space
    let spaces: [Space]

    var body: some View {
        HStack(spacing: 8) {
            ForEach(spaces) { space in
                SpaceButton(
                    space: space,
                    isActive: space.id == currentSpace.id
                ) {
                    withAnimation(.spring(response: 0.3, dampingFraction: 0.7)) {
                        currentSpace = space
                    }
                }
            }
        }
        .padding(.horizontal, 12)
    }
}

struct SpaceButton: View {
    let space: Space
    let isActive: Bool
    let action: () -> Void

    var body: some View {
        Button(action: action) {
            Circle()
                .fill(
                    LinearGradient(
                        colors: [space.gradient.from, space.gradient.to],
                        startPoint: .topLeading,
                        endPoint: .bottomTrailing
                    )
                )
                .frame(width: 24, height: 24)
                .overlay {
                    if isActive {
                        Circle()
                            .strokeBorder(.white, lineWidth: 2)
                    }
                }
        }
        .buttonStyle(.plain)
        .keyboardShortcut(space.keyboardShortcut)
    }
}

3. Barra de Comando: Spotlight para o Navegador

A Barra de Comando do Arc (Cmd+T) é mais do que uma barra de URL. Ela fornece busca universal entre abas, histórico, favoritos e ações.

INTERAÇÃO DA BARRA DE COMANDO:

┌─────────────────────────────────────────────────────────────┐
│  > Buscar abas, histórico ou digitar uma URL...             │
├─────────────────────────────────────────────────────────────┤
│  ABAS ABERTAS                                               │
│    [doc] Notion - Planejamento de Projeto     Cmd+1         │
│    [doc] GitHub - Pull Request #123                         │
│                                                             │
│  HISTÓRICO                                                  │
│    [>] Figma - Design System (2 horas atrás)                │
│    [>] MDN - Guia CSS Grid (ontem)                          │
│                                                             │
│  AÇÕES                                                      │
│    [*] Nova Nota                              Cmd+Shift+N   │
│    [*] Visualização Dividida                  Cmd+Shift+\   │
│    [*] Copiar URL                             Cmd+Shift+C   │
└─────────────────────────────────────────────────────────────┘

O Insight Principal: Encontrar deve ser mais rápido do que organizar. Uma boa busca elimina a necessidade de organização perfeita.

Padrão CSS:

.command-bar {
  --bar-width: min(600px, 90vw);

  position: fixed;
  top: 20%;
  left: 50%;
  transform: translateX(-50%);
  width: var(--bar-width);
  background: var(--surface-elevated);
  border-radius: var(--radius-lg);
  box-shadow:
    0 4px 24px rgba(0, 0, 0, 0.2),
    0 0 0 1px rgba(255, 255, 255, 0.1);
  overflow: hidden;
}

.command-input {
  width: 100%;
  padding: 16px 20px;
  font-size: 18px;
  background: transparent;
  border: none;
  color: var(--text-primary);
}

.command-results {
  max-height: 400px;
  overflow-y: auto;
  border-top: 1px solid var(--border-subtle);
}

.command-result {
  display: flex;
  align-items: center;
  gap: 12px;
  padding: 10px 20px;
  cursor: pointer;
}

.command-result:hover,
.command-result.selected {
  background: var(--surface-hover);
}

.command-result-shortcut {
  margin-left: auto;
  font-size: 12px;
  color: var(--text-secondary);
  font-family: var(--font-mono);
}

4. Boosts: Personalização a Nível do Usuário

Boosts permitem que usuários injetem CSS e JavaScript personalizados em qualquer site: modos escuros pessoais, interfaces simplificadas ou funcionalidades aprimoradas.

CONCEITO DO BOOST:

Sem Boost:                        Com Boost:
┌─────────────────────┐          ┌─────────────────────┐
│ [Cabeçalho]         │          │                     │
│ [Navegação]         │          │                     │
│ [Sidebar] [Conteúdo]│    →     │     [Conteúdo]      │
│ [Rodapé]            │          │     (limpo, focado) │
│ [Banner de Cookies] │          │                     │
└─────────────────────┘          └─────────────────────┘

CSS criado pelo usuário:
- Ocultar elementos distrativos
- Mudar cores/fontes
- Melhorar legibilidade

O Insight Principal: Todo usuário tem sites que visita diariamente mas gostaria que funcionassem diferente. Dê a eles o controle.

Padrão de Implementação:

interface Boost {
  id: string;
  name: string;
  domain: string; // "github.com" ou "*.google.com"
  enabled: boolean;
  css?: string;
  js?: string;
  createdAt: Date;
}

// Exemplo de Boost: YouTube Limpo
const youtubeBoost: Boost = {
  id: 'youtube-clean',
  name: 'YouTube Limpo',
  domain: 'youtube.com',
  enabled: true,
  css: `
    /* Ocultar recomendações */
    #secondary,
    ytd-browse[page-subtype="home"] ytd-rich-grid-renderer {
      display: none !important;
    }

    /* Ocultar comentários */
    #comments {
      display: none !important;
    }

    /* Expandir vídeo */
    #primary {
      max-width: 100% !important;
    }
  `
};

Editor de Boost em SwiftUI:

struct BoostEditor: View {
    @Binding var boost: Boost
    @State private var activeTab: BoostTab = .css

    enum BoostTab: String, CaseIterable {
        case css = "CSS"
        case javascript = "JavaScript"
    }

    var body: some View {
        VStack(spacing: 0) {
            // Seletor de domínio
            HStack {
                Image(systemName: "globe")
                TextField("Domínio (ex: github.com)", text: $boost.domain)
                    .textFieldStyle(.plain)
            }
            .padding()
            .background(.ultraThinMaterial)

            // Seletor de aba
            Picker("", selection: $activeTab) {
                ForEach(BoostTab.allCases, id: \.self) { tab in
                    Text(tab.rawValue).tag(tab)
                }
            }
            .pickerStyle(.segmented)
            .padding()

            // Editor de código
            CodeEditor(
                text: activeTab == .css ? $boost.css : $boost.js,
                language: activeTab == .css ? .css : .javascript
            )
        }
    }
}

5. Little Arc: Minimalista por Design

O Little Arc é uma janela separada e minimalista para tarefas rápidas: uma aba, sem interface extra, livre de distrações.

ARC COMPLETO:                     LITTLE ARC:
┌────────┬────────────────┐      ┌────────────────────────┐
│Sidebar │                │      │ ← google.com/search... │
│        │    Conteúdo    │      ├────────────────────────┤
│        │                │      │                        │
│        │                │  →   │    Resultados da Busca │
│        │                │      │    (só o conteúdo)     │
└────────┴────────────────┘      └────────────────────────┘

Casos de uso:
- Busca rápida
- Verificar uma coisa
- Abrir links de outros apps

O Insight Principal: Nem toda tarefa precisa do navegador completo. Adeque a interface ao peso da tarefa.

Padrão CSS (Interface Mínima):

.mini-browser {
  --chrome-height: 36px;

  border-radius: var(--radius-lg);
  overflow: hidden;
  box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3);
}

.mini-chrome {
  height: var(--chrome-height);
  display: flex;
  align-items: center;
  padding: 0 12px;
  background: var(--surface-1);
  gap: 8px;
}

.mini-url-bar {
  flex: 1;
  padding: 4px 8px;
  font-size: 13px;
  background: var(--surface-2);
  border-radius: var(--radius-sm);
  color: var(--text-secondary);
}

.mini-content {
  height: calc(100% - var(--chrome-height));
}

Padrões Transferíveis

Padrão 1: Efêmero vs. Persistente

A seção "Hoje" do Arc arquiva automaticamente abas após 12 horas. Itens persistentes devem ser explicitamente fixados.

interface EphemeralityConfig {
  defaultLifetime: number; // milissegundos
  onExpire: 'archive' | 'close' | 'prompt';
  exceptions: string[]; // domínios que nunca expiram
}

function shouldArchive(tab: Tab, config: EphemeralityConfig): boolean {
  const age = Date.now() - tab.lastAccessed.getTime();
  if (config.exceptions.includes(new URL(tab.url).hostname)) {
    return false;
  }
  return age > config.defaultLifetime;
}

Padrão 2: Visualização Dividida

Navegação lado a lado sem gerenciar janelas separadas.

struct SplitView: View {
    @State private var splitRatio: CGFloat = 0.5
    let leftTab: Tab
    let rightTab: Tab

    var body: some View {
        GeometryReader { geometry in
            HStack(spacing: 1) {
                WebView(tab: leftTab)
                    .frame(width: geometry.size.width * splitRatio)

                // Divisor arrastável
                Rectangle()
                    .fill(.quaternary)
                    .frame(width: 4)
                    .gesture(
                        DragGesture()
                            .onChanged { value in
                                let newRatio = value.location.x / geometry.size.width
                                splitRatio = max(0.2, min(0.8, newRatio))
                            }
                    )

                WebView(tab: rightTab)
            }
        }
    }
}

Padrão 3: Identidades por Gradiente

Cada Space tem um gradiente único que fornece reconhecimento visual instantâneo.

.space-gradient {
  --gradient-work: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
  --gradient-personal: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);
  --gradient-project: linear-gradient(135deg, #4facfe 0%, #00f2fe 100%);
}

.space-indicator {
  width: 100%;
  height: 4px;
  background: var(--current-gradient);
}

.space-badge {
  width: 28px;
  height: 28px;
  border-radius: 50%;
  background: var(--current-gradient);
  display: flex;
  align-items: center;
  justify-content: center;
}

Lições de Design

  1. Questione suposições: A barra de abas não é sagrada; nada é
  2. Separação de contexto: Tarefas diferentes merecem ambientes diferentes
  3. Teclado em primeiro lugar: Usuários avançados navegam sem mouse
  4. Complexidade progressiva: Simples por padrão, poderoso quando necessário
  5. Personalização do usuário: Deixe as pessoas fazerem o software ser delas
  6. Peso apropriado: Adeque a complexidade da interface à complexidade da tarefa

Perguntas Frequentes

Por que o Arc usou uma barra lateral vertical em vez de abas horizontais?

Abas horizontais encolhem até larguras ilegíveis quando você abre muitas páginas. Barras laterais verticais usam a altura abundante da tela em monitores widescreen modernos, mantendo os títulos das abas totalmente visíveis. A barra lateral também permite recursos de organização como seções fixadas e pastas que não funcionam bem horizontalmente.

Como os Spaces do Arc diferem de perfis de navegador?

Spaces são mais leves do que perfis completos de navegador. Enquanto perfis criam instâncias de navegador completamente separadas (diferentes cookies, histórico, extensões), Spaces compartilham sua configuração do navegador mas organizam abas por contexto. Você pode alternar Spaces instantaneamente com atalhos de teclado, enquanto alternar perfis requer reiniciar ou abrir novas janelas.

O que acontece com as abas na seção "Hoje" do Arc?

Abas na seção Hoje são arquivadas automaticamente após 12 horas de inatividade. Elas não são excluídas, mas movidas para um arquivo pesquisável. Isso previne o acúmulo de abas mantendo o conteúdo recuperável. Abas fixadas nunca são arquivadas automaticamente.

Posso usar os padrões de design do Arc no meu próprio app?

Sim. Os padrões documentados aqui (barra lateral colapsável, paleta de comandos, arquitetura de Spaces, sistema de Boost) são conceitos transferíveis. Os exemplos de código mostram implementações em CSS, SwiftUI e TypeScript que você pode adaptar. Os padrões de barra lateral e barra de comando funcionam particularmente bem para qualquer aplicativo com muito conteúdo.

Como a Barra de Comando do Arc melhora em relação às barras de URL tradicionais?

Barras de URL tradicionais pesquisam histórico e sugerem URLs. A Barra de Comando do Arc pesquisa abas abertas, histórico, favoritos e ações disponíveis a partir de uma única entrada. Você pode encontrar uma aba aberta, executar um comando ou navegar para algum lugar novo sem trocar de contexto ou lembrar onde algo está.


Referências