design/linear

4 min czytania 1008 słów
design/linear screenshot

Linear: Nowy standard projektowania oprogramowania

„Oprogramowanie powinno być zdecydowane i szybkie." — Karri Saarinen, CEO Linear

Linear to narzędzie do zarządzania projektami, które na nowo zdefiniowało, jak może wyglądać nowoczesne oprogramowanie. Uruchomione w 2019 roku przez byłych projektantów z Uber i Airbnb, dowodzi, że oprogramowanie B2B nie musi być brzydkie ani wolne.


Dlaczego Linear ma znaczenie

Linear stanowi manifest projektowy przeciwko rozdętemu oprogramowaniu korporacyjnemu projektowanemu przez komitety. Pokazuje, co się dzieje, gdy projektanci tworzą dla projektantów.

Kluczowe osiągnięcia: - Sprawił, że oprogramowanie dla firm zaczęło przypominać aplikacje konsumenckie - Udowodnił, że interfejsy zorientowane na klawiaturę mogą być piękne - Zademonstrował, że wydajność to funkcjonalność - Ustanowił nowy standard jakości produktów SaaS


Kluczowe wnioski

  1. Szybkość to funkcjonalność, nie metryka - Obsesyjna koncentracja Linear na interakcjach poniżej 100ms dowodzi, że postrzegana wydajność wywołuje emocjonalną reakcję
  2. Klawiatura na pierwszym miejscu oznacza zwycięstwo zaawansowanych użytkowników - Paleta poleceń (Cmd+K) i mnemoniczne skróty (S dla Status, P dla Priority) przyspieszają ekspertów bez blokowania początkujących
  3. Gęstość informacji wygrywa z białą przestrzenią - Pokaż więcej danych przy mniejszej ilości elementów interfejsu; ujawniaj szczegóły po najechaniu myszką zamiast ukrywać je za kliknięciami
  4. Tryb ciemny jako główne doświadczenie - Projektowanie najpierw w trybie ciemnym tworzy premium estetykę i zmniejsza zmęczenie oczu zaawansowanych użytkowników
  5. Optymistyczny UI eliminuje czekanie - Najpierw aktualizuj lokalnie, synchronizuj w tle i pokazuj błędy tylko wtedy, gdy faktycznie wystąpią

Podstawowe zasady projektowania

1. Szybkość jako funkcjonalność

Linear jest obsesyjnie szybki. Każda interakcja wydaje się natychmiastowa.

Jak to osiągają: - Optymistyczne aktualizacje UI (zakładaj sukces, cofnij przy niepowodzeniu) - Architektura local-first - Agresywne cache'owanie - Minimalna liczba żądań sieciowych

Wgląd w implementację:

// Optimistic update pattern
function updateIssue(id: string, changes: Partial<Issue>) {
  // 1. Update local state immediately
  localStore.update(id, changes)

  // 2. Show success state
  ui.showSaved()

  // 3. Sync with server in background
  api.updateIssue(id, changes).catch(() => {
    // 4. Rollback only on failure
    localStore.rollback(id)
    ui.showError()
  })
}

Zastosowanie w projektowaniu: - Stany ładowania powinny być niewidoczne, gdy to możliwe - Szkielety ekranów tylko gdy konieczne - Nigdy nie blokuj użytkownika przed wykonaniem kolejnej akcji


2. Klawiatura na pierwszym miejscu, mysz mile widziana

Linear jest zaprojektowany dla zaawansowanych użytkowników, ale przyjazny dla początkujących.

Paleta poleceń (Cmd+K): - Uniwersalny punkt wejścia dla wszystkich akcji - Wyszukiwanie rozmyte we wszystkim - Skróty klawiaturowe do odkrycia - Nigdy nie wymaga opuszczenia klawiatury

┌────────────────────────────────────────────────────────────┐
│ Cmd+K                                                      │
├────────────────────────────────────────────────────────────┤
│ > Search issues, projects, or commands...                  │
│                                                            │
│   Recent                                                   │
│   ├─ FE-123 Fix navigation animation              Cmd+O   │
│   ├─ BE-456 API rate limiting                     Cmd+O   │
│   └─ Create new issue                             C       │
│                                                            │
│   Commands                                                 │
│   ├─ Change status                                S       │
│   ├─ Assign issue                                 A       │
│   └─ Set priority                                 P       │
│                                                            │
└────────────────────────────────────────────────────────────┘

Zasady implementacji: - Każda akcja ma skrót klawiaturowy - Skróty są mnemoniczne (S dla Status, P dla Priority) - Mysz działa doskonale. Klawiatura jest szybsza - Pomoc jest zawsze o jedno naciśnięcie klawisza


3. Gęstość informacji zrobiona dobrze

Linear pokazuje dużo informacji bez poczucia zagracenia.

Jak równoważą gęstość:

ZAGRACONE (typowe korporacyjne):
┌────────────────────────────────────────────────────────────┐
│ [ ] * FE-123 | Fix bug | John | High | In Progress | 2d   │
│     Tags: frontend, urgent, sprint-12, reviewed           │
│     Created: Jan 1 | Updated: Jan 5 | Due: Jan 10         │
│     Comments: 5 | Attachments: 2 | Subtasks: 3/5          │
├────────────────────────────────────────────────────────────┤
│ [ ] * FE-124 | Another bug | Jane | Medium | Todo | 1d    │
│     ... (powtarzanie wszystkich metadanych)               │
└────────────────────────────────────────────────────────────┘

PODEJŚCIE LINEAR:
┌────────────────────────────────────────────────────────────┐
│ [x] FE-123  Fix navigation animation bug      ^  John  ** │
│ [ ] FE-124  Update user profile endpoint         Jane  *  │
│ [x] FE-125  Add dark mode toggle              ^  Alex  ***│
└────────────────────────────────────────────────────────────┘
                                                     ^    ^
                                          Priorytet Przypisany Szacunek
                                          (daszek)  (imię)    (kropki)

Zasady: - Pokaż tylko to, co potrzebne na każdym poziomie - Używaj ikon i symboli zamiast etykiet tekstowych - Ujawniaj szczegóły po najechaniu/zaznaczeniu - Stopniowe ujawnianie na żądanie


4. Spójny język wizualny

System projektowy Linear jest ścisły i spójny.

System kolorów:

/* Linear-inspired semantic colors */
:root {
  /* Status colors - highly saturated, distinct */
  --status-backlog: #6B7280;    /* Gray - not started */
  --status-todo: #3B82F6;       /* Blue - ready */
  --status-progress: #F59E0B;   /* Amber - in work */
  --status-done: #10B981;       /* Green - complete */
  --status-cancelled: #EF4444;  /* Red - cancelled */

  /* Priority - consistent hue shift */
  --priority-urgent: #EF4444;   /* Red */
  --priority-high: #F97316;     /* Orange */
  --priority-medium: #EAB308;   /* Yellow */
  --priority-low: #6B7280;      /* Gray */
  --priority-none: #374151;     /* Dark gray */

  /* Surface hierarchy */
  --bg-primary: #0D0D0D;        /* Main background */
  --bg-elevated: #141414;       /* Cards, panels */
  --bg-hover: #1F1F1F;          /* Hover states */
  --bg-active: #292929;         /* Active/selected */
}

Typografia:

/* Linear uses Inter for everything */
:root {
  --font-family: 'Inter', -apple-system, sans-serif;

  /* Tight scale, high readability */
  --text-xs: 11px;    /* Metadata */
  --text-sm: 12px;    /* Secondary */
  --text-base: 13px;  /* Body (smaller than typical) */
  --text-lg: 14px;    /* Emphasis */
  --text-xl: 16px;    /* Headings */
  --text-2xl: 20px;   /* Page titles */
}

5. Tryb ciemny domyślnie

Linear wybrał tryb ciemny jako główne doświadczenie.

Dlaczego to działa: - Zmniejsza zmęczenie oczu zaawansowanych użytkowników (długie godziny) - Tworzy premium, skupioną estetykę - Sprawia, że kolory statusów wyróżniają się - Współgra z estetyką narzędzi deweloperskich

Implementacja:

/* Dark-first design */
: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);
}

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

6. Mikrointerakcje, które zachwycają

Każda interakcja w Linear została przemyślana.

Przykłady: - Karty zadań lekko się unoszą po najechaniu - Zmiany statusu mają subtelne przejścia kolorów - Przeciąganie i upuszczanie ma płynny, oparty na fizyce ruch - Checkboxy mają satysfakcjonujące sprzężenie zwrotne przy kliknięciu

Zasady animacji:

/* Linear's motion */
: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;   /* Standard transitions */
  --duration-slow: 250ms;     /* Page transitions */
}

.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);
}

Wzorce projektowe do nauki

Paleta poleceń

Cmd+K Linear jest teraz oczekiwanym wzorcem w nowoczesnym oprogramowaniu.

Przewodnik implementacji:

<!-- Command palette structure -->
<dialog class="command-palette" aria-label="Command menu">
  <header>
    <input
      type="text"
      placeholder="Search issues or commands..."
      aria-describedby="command-hint"
    />
  </header>

  <nav aria-label="Command results">
    <section aria-label="Recent">
      <h3>Recent</h3>
      <ul role="listbox">
        <li role="option" tabindex="0">
          <span class="issue-id">FE-123</span>
          <span class="issue-title">Fix bug</span>
          <kbd>Cmd+O</kbd>
        </li>
      </ul>
    </section>

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

Menu kontekstowe

Menu po kliknięciu prawym przyciskiem, które pokazują dokładnie to, czego potrzebujesz.

Kliknięcie prawym przyciskiem na zadaniu:
┌────────────────────────────────┐
│  Open issue            Cmd+O  │
│  Open in new tab   Cmd+Shft+O │
├────────────────────────────────┤
│  Set status                S  │
│  Set priority              P  │
│  Assign                    A  │
├────────────────────────────────┤
│  Copy link             Cmd+C  │
│  Copy ID                      │
├────────────────────────────────┤
│  Delete              Backspace│
└────────────────────────────────┘

Edycja inline

Edytuj bez okien modalnych.

PRZED (kliknij aby edytować):
┌────────────────────────────────────────┐
│  Fix navigation bug          [Edit]   │
└────────────────────────────────────────┘

PO (edycja inline po kliknięciu):
┌────────────────────────────────────────┐
│  Fix navigation bug|                   │  ← Kursor pojawia się
│  ──────────────────                    │    w miejscu
└────────────────────────────────────────┘

Co warto zapożyczyć od Linear

Dla każdego projektu oprogramowania

  1. Szybkość jest niezbywalna - Optymalizuj postrzeganą i rzeczywistą wydajność
  2. Skróty klawiaturowe wszędzie - Ale nie wymagaj ich
  3. Paleta poleceń - Uniwersalny punkt dostępu
  4. Tryb ciemny zrobiony dobrze - Nie jako dodatek
  5. Gęstość informacji - Pokaż więcej przy mniejszym nakładzie
  6. Spójny język projektowy - Każdy element wydaje się powiązany

Konkretne techniki

Technika Jak zastosować
Optymistyczny UI Najpierw aktualizuj lokalnie, synchronizuj w tle
Wyszukiwanie rozmyte Użyj Fuse.js lub podobnego dla palety poleceń
Mnemoniczne skróty S dla Status, P dla Priority, A dla Assign
Subtelne unoszenie 1-2px podniesienie przy najechaniu, nie dramatyczne cienie
Semantyczne kolory Spójny system kolorów statusu/priorytetu
Zwarta typografia 13px tekst główny, gęsty ale czytelny

Kluczowe cytaty zespołu Linear

„Traktujemy szybkość jako funkcjonalność. Jeśli coś zajmuje 300ms, wydaje się zepsute."

„Każdy piksel powinien być celowy. Jeśli nie możesz wyjaśnić, dlaczego coś tam jest, usuń to."

„Klawiatura na pierwszym miejscu nie oznacza tylko klawiatury. Oznacza szacunek dla zaawansowanych użytkowników."


Najczęściej zadawane pytania

Co sprawia, że Linear jest szybszy od innych narzędzi do zarządzania projektami?

Linear używa optymistycznych aktualizacji UI, architektury local-first i agresywnego cache'owania. Gdy zmieniasz status zadania, UI aktualizuje się natychmiast, podczas gdy synchronizacja odbywa się w tle. Większość interakcji wydaje się natychmiastowa, ponieważ Linear zakłada sukces i pokazuje błędy tylko wtedy, gdy faktycznie wystąpią, zamiast blokować na żądaniach sieciowych.

Jak działa paleta poleceń (Cmd+K) w Linear?

Paleta poleceń to uniwersalny punkt wejścia, który używa wyszukiwania rozmytego w zadaniach, projektach i poleceniach. Obsługuje mnemoniczne skróty klawiaturowe (S dla Status, P dla Priority, A dla Assign), które użytkownicy mogą odkryć przez paletę, a następnie używać bezpośrednio bez jej otwierania. Tworzy to progresywną ścieżkę nauki od początkującego do zaawansowanego użytkownika.

Dlaczego Linear wybrał tryb ciemny jako domyślny?

Linear projektował dla zaawansowanych użytkowników, którzy spędzają długie godziny w aplikacji. Tryb ciemny zmniejsza zmęczenie oczu, tworzy premium estetykę wyróżniającą się od typowego oprogramowania korporacyjnego i sprawia, że kolory statusów są bardziej żywe. Tryb jasny istnieje jako nadpisanie, ale tryb ciemny jest głównym celem projektowym.

Jak Linear osiąga wysoką gęstość informacji bez poczucia zagracenia?

Linear używa symboli i ikon zamiast etykiet tekstowych, pokazuje tylko niezbędne metadane na poziomie listy i ujawnia szczegóły po najechaniu lub zaznaczeniu. Skala typografii jest bardziej zwarta niż typowa (13px tekst główny), a spójne odstępy tworzą wizualny rytm bez marnowania białej przestrzeni.

Jakie jest podejście Linear do skrótów klawiaturowych?

Każda akcja w Linear ma skrót klawiaturowy, a skróty są mnemoniczne (łatwe do zapamiętania). Paleta poleceń uczy skrótów, pokazując je obok każdej akcji. Oznacza to, że użytkownicy myszy mogą pracować doskonale, ale użytkownicy klawiatury mogą pracować znacznie szybciej. Filozofia projektowania to „klawiatura na pierwszym miejscu, mysz mile widziana".


Zasoby

  • Strona: linear.app
  • Changelog: Changelog Linear sam w sobie jest pięknie zaprojektowany
  • Blog: Wpisy o inżynierii i projektowaniu od zespołu
  • Twitter: @linear dla aktualizacji projektowych