Skip to content

Component gallery

Buttons

buttonClass, size xs
buttonClass, size sm
buttonClass, size md
disabled
with icon, as a link

Icon buttons and toggles

sizes xs, sm, md, lg
active, danger, disabled
node icon, badge, render as link
IconToggle in a segment

Segments and tabs

Segmented md
Segmented sm, one disabled
TabPill + CountBadge in a track

Surfaces and empty states

Tray > Raised (the depth ladder)
A raised card in a tray
Raised live
Lifted one step while a run streams
track chip, well, fill
12.4k · $0.08
SectionLabel, Meta
3 files · 18ms
EmptyState
No sessions yet
Start one to see it here.
PanelEmpty, warn, loading
Nothing changed
Edits the agent makes show here.
Could not read the folder
Permission denied.

Floating surfaces

Popover (click)
HoverCard (hover)
Hover me
RowActionsMenu (3-dots)
Tooltip, inline and portaled

Dialogs and overlays

ConfirmDialog (static)
ConfirmDialog default
Overlay + zg-float dialog
Lightbox

Code, copy and keys

CodeFrame with caption
agent.ts
const agent = createAgent({ ...basic, provider })
await agent.run({ prompt: 'build a REST API' })
CodeFrame plain (copy on hover), long line
cat packages/server/src/handlers/very-long-folder-name/another-nested-directory/session-title-generator.ts | head -n 200 # a long line scrolls inside the frame
CodePanel
$ bun test
41 passed
CopyButton inline, Keycaps
Command KCommand Shift Returnesc

Forms

FormSection: rows
4 settings
Transcript density
Font size
14px
FormSection: cards
Office server
wss://zidane.example.com
A server with a long name that has to truncate somewhere sensible
packages/server/src/handlers/very-long-folder-name/another-nested-directory/session-title-generator.ts
Controls
mutedtextaccentsuccesswarndangerinfo
Notes
Installing…
Installed 3 skills.

List furniture

Breadcrumb (long path truncates left)
EditableTitle (double-click)
Rate limit the chat endpoint
DiffCounts, RowBadge, Highlighted
+14−2+120−8mergeddraft3 filessession-title.ts
SegmentSpinner
ZidaneMark
WorkingWorkingWorkingWorking

Motion

Crossfade (scale): spinner → check → x
Crossfade (text)
Running tests…
Presence
new
RollingText in SmoothWidth
HeldWidth
1s
SwapIcon

Wizard progress

Stepper as dots, where a done step goes back
Stepper, rail
Stepper, first step

Card choices

ChoiceCards, numbered, with a badge and a disabled card
ChoiceCards with previews
SwatchPicker as dots, with the color named under the row

Blue

SwatchPicker as tiles, with app icons and a note

Midnight blue

Shown in the Dock and in Finder.

Toggle cards

ToggleCard with badges
ToggleCard with a nested dependent
ToggleCard with a status
ToggleCard, disabled

Step pages and previews

StepFrame with a side pane, and StepActions

How much of the work do you see?

Pick a preset, then fine-tune. The preview is a real conversation.

The step's choices go here.

StepActions with Continue off, and the reason
Sign in to continue
PreviewWindow in its own theme (Catppuccin Latte)

A light theme inside the page's own.

Browser sign-in

BrowserSignIn, starting
Starting sign-in…
BrowserSignIn, page open, with paste-back
Finish signing in with Anthropic in your browser.Did the page not open? Open the sign-in page
BrowserSignIn, device code
Enter this code on bolt.new.WXYZ-8241Open the sign-in page
BrowserSignIn, a question
Which Google Cloud project bills the usage?
  1. 1. acme-prod
  2. 2. acme-lab
BrowserSignIn, progress
Exchanging the code…
BrowserSignIn, done
Signed in as me@acme.dev
BrowserSignIn, failed

Brand marks

Every logo at sm, md and lg, then the letter and icon fallbacks, in a dark theme (Default)
  • Anthropic
  • Arcee
  • Atlassian
  • Baseten
  • Braintrust
  • Cerebras
  • Claude
  • Claude Code
  • Cloudflare
  • Codex
  • Cursor
  • Git
  • GitHub
  • Google Cloud
  • Google Gemini
  • Hugging Face
  • Linear
  • LM Studio
  • Mistral AI
  • Neon
  • Notion
  • Ollama
  • OpenAI
  • OpenRouter
  • Sentry
  • Stripe
  • Supabase
  • vLLM
  • xAI
  • Z.ai
  • Playwright
  • Pi
  • Bolt
  • Goal
  • Local LLM
The same marks in a light theme (Light)
  • Anthropic
  • Arcee
  • Atlassian
  • Baseten
  • Braintrust
  • Cerebras
  • Claude
  • Claude Code
  • Cloudflare
  • Codex
  • Cursor
  • Git
  • GitHub
  • Google Cloud
  • Google Gemini
  • Hugging Face
  • Linear
  • LM Studio
  • Mistral AI
  • Neon
  • Notion
  • Ollama
  • OpenAI
  • OpenRouter
  • Sentry
  • Stripe
  • Supabase
  • vLLM
  • xAI
  • Z.ai
  • Playwright
  • Pi
  • Bolt
  • Goal
  • Local LLM

Setup: Welcome

A fresh install, with what zidane found and the two paths

Set up zidane

This takes about two minutes. You can change every choice later in Settings.

  • ANTHROPIC_API_KEY in your environmentUsed in Connect
  • Claude Code setupUsed in Bring your setup
  • Signed in to GitHub as @octocatUsed in Connectors
  • Ollama at http://localhost:11434/v1Used in Connect

Setup: Connect

The key found in the environment, tested

Choose an AI provider

The provider runs the model that answers you. Your keys stay on this computer, in a file that only you can read.

Connect a provider to continue

Setup: Connect alone

Opened from the composer's prompt, nothing set up yet

Choose an AI provider

The provider runs the model that answers you. Your keys stay on this computer, in a file that only you can read.

Connect a provider to continue

Setup: the Connect a provider card

After a send no provider could answer
Connect a providerzidane needs an AI provider to answer.
In a narrow composer
Connect a providerzidane needs an AI provider to answer.

Setup: Bring your setup

What an import from Claude Code copies

Use your setup from other agents

zidane copies what you pick. It does not change the files of the other agent.

Setup: Connectors

GitHub picked, with its token or the gh login

Connect your tools

The agent can read and change data in these services. Most of them ask you to sign in through your browser.

Setup: Skills

How skills work, then the recommended sources with their GitHub previews

Teach zidane how you work

A skill is a folder of instructions. The agent reads one when a task needs it.

Setup: Extensions

Goal picked. Linear names the connector that picking it adds

Add extensions

Extensions add commands and features. zidane installs them for you from its repository.

Setup: Look

Mode, a theme for each, an accent and the app icon, previewed

Choose how zidane looks

The preview shows each choice at once.

From the theme

Midnight blue, the default

Shown in the Dock and in Finder.

Setup: Conversation

Balanced, over the live preview

How much detail do you want to see?

Pick a preset. The preview shows a sample conversation with it. Then pick what happens to a message that you send while the agent works.

What happens to a message that you send while the agent works. Alt+Enter sends one message the other way.

Setup: Conversation, fine-tuned

Settings that match no preset, with the fine-tune list open

How much detail do you want to see?

Pick a preset. The preview shows a sample conversation with it. Then pick what happens to a message that you send while the agent works.

Custom
Transcript density
Full shows every step. Compact folds each exchange's work into one row.
Edit diff density
Show edits as a full diff or a short summary.
Tool calls display
Show tool calls as a summary, their full input, or not at all.

What happens to a message that you send while the agent works. Alt+Enter sends one message the other way.

Setup: Autonomy

Ask, a scene of each mode, and the spend limit of an API key

What can zidane do without asking?

Commands in your safelist always run, whatever you pick. Your safelist holds the commands that you allowed with Always allow.

Setup: Features

The desktop app's features, one full-width card each, with its demo beside it

Turn on what you want

You can change these, and more, in Settings.

Setup: Ready

The recap, and background work that is done, waits for a sign-in or failed

Connect your tools

The agent can read and change data in these services. Most of them ask you to sign in through your browser.

Skill sources

The compact version, as Settings › Skills shows it
The compact version with a source open, one skill picked
An open source with its GitHub card, two skills picked and one installed
A pack, where each skill names the repository it installs from
A folder of a repository
A source that loads, with skeleton rows at their final size
A source that did not load, with Retry
A narrow window, without the previews

Wizard tutorials

How connectors work: the tour, then each step of its scene
How skills work: the tour, then each step of its scene
How MCP servers work: the tour, then each step of its scene
How instructions work: the tour, then each step of its scene
How extensions work: the tour, then each step of its scene
How environments work: the tour, then each step of its scene
How files open: the tour, then each step of its scene
How accounts work: the tour, then each step of its scene
Run zidane on a server: the tour, then each step of its scene
How secrets work: the tour, then each step of its scene
A narrow window, with the scene above the steps

Conversation presets

Your settings, which match Balanced
Matches Balanced
Rate limit /chat to 20 requests a minute per IP, and tell clients how long to wait. The chart shows the spike from last night.
    • The route now checks a sliding window per IP:

      • 20 requests a minute for each IP
      • Over the limit, a 429 with a Retry-After header, so clients know how long to wait

      All 12 tests pass.

      Opus 5.521s4$0.049.8k640
    Settings that match no preset
    Custom
    Rate limit /chat to 20 requests a minute per IP, and tell clients how long to wait. The chart shows the spike from last night.
      • The route now checks a sliding window per IP:

        • 20 requests a minute for each IP
        • Over the limit, a 429 with a Retry-After header, so clients know how long to wait

        All 12 tests pass.

        Opus 5.521s4$0.049.8k640

      Wizard demos

      Codemode, on
      Codemode, off
      Inline autocomplete, on
      Inline autocomplete, off
      Session titles, on
      Session titles, off
      Time estimates, on
      Time estimates, off
      Spaces, on
      Spaces, off
      Updates, on
      Updates, off
      Plan usage, on
      Plan usage, off
      Background service, on
      Background service, off
      Browser tab, with the agent, on
      Browser tab, with the agent, off
      Terminal, with the agent, on
      Terminal, with the agent, off
      Notifications, with the sound, on
      Notifications, with the sound, off
      Project extensions, on
      Project extensions, off
      Secrets, on
      Secrets, off
      git-flow, on
      git-flow, off
      goal, on
      goal, off
      linear, on
      linear, off
      ai-autocomplete, on
      ai-autocomplete, off
      bolt, on
      bolt, off
      Ask, on
      Ask, off
      Model decision, on
      Model decision, off
      Full access, on
      Full access, off
      Sandbox, on
      Sandbox, off

      Session list

      SessionList: by project, search, new session
      SessionList: by date
      SessionList: empty

      Session rows and status

      SessionListRow states
      SessionGroupHeader, ShowMoreRow
      StatusDot states
      idle
      running
      pending
      attention
      attached
      completed
      error

      Transcript

      Transcript: full density, every row kind
      traffic.png
      Rate limit the chat endpoint: 20 requests a minute per IP, and say how long to wait when it trips.

      The chat route now takes a token from a per-IP bucket (20 a minute, bursts of 5). A request over the limit gets 429 with a Retry-After header:

      if (!verdict.ok) return tooMany(verdict.retryAfterMs);

      The server tests pass.

      Opus 5.541s5$0.0818k1.3k
      Document it, and keep the context small while you do.
      claude-opus-5-5 is overloaded; continuing on gpt-6.1-sol.
      Link check failed: /docs/limits does not exist.

      Documented under Limits in docs/server.mdx and committed.

      GPT 6.1 Sol +11m12s4$0.219.9k2.0k
      committed 83dfea7

      Transcript, compact

      Transcript: compact density, codemode
      Rate limit the chat endpoint: 20 requests a minute per IP, and tell clients how long to wait when it trips. The chart shows who hit it last night.
        • The chat route now takes a token from a per-IP bucket: 20 a minute, with bursts of 5. Over the limit it answers 429 with a Retry-After header, so clients know how long to wait.

          All 44 server tests pass.

          Opus 5.538s4$0.0717k1.1k
        Document it in docs/server.mdx, then commit.
          • Documented under Limits in docs/server.mdx and committed as 83dfea7.

            Opus 5.552s3$0.0912k980

          Transcript extras: chips, cards, badges, search

          Prose: file, branch, commit, issue and reference chips

          Moved the badges into badges.tsx and left README.md alone.

          Fixed on main in e32789e, tracked as ZID-42, see #128.

          useState and npm test stay code.

          A sent prompt's badges
          /review badges.tsx against zidane.dev/docs
          A chip's hover card
          ZID-42In Progress
          Move the transcript extras into the kit
          Kit
          Assignee
          Ada
          Changes
          +412−38831 files

          Chips, cards, the badge menu, search and turn actions move behind ChatHost.

          Earlier history, idle and loading
          Find in conversation (⌘F)

          The rate limiter now keys on the session, not the socket.

          A second limiter guards the upload route.

          Composer

          HostComposer: idle, with the model and reasoning pickers
          Composer: running (Enter steers, the button stops)
          Composer: with attachments
          Composer: disabled

          Composer badges

          Composer: badges in the tray (click one, drag one to reorder)
          Composer: a highlight and a status
          Goal 2/10
          ComposerBadges: past the width, the strip scrolls sideways

          Interactions

          InteractionCard: question
          2 questions
          InteractionCard: plan
          Rate limit the chat endpoint

          A token bucket per IP in front of /chat: 20 requests a minute, bursts of 5.

          1. 1.
            Add the limiter
            server/src/limits.ts, with tests
          2. 2.
            Guard the route
            Answer 429 with Retry-After when it trips
          3. 3.
            Document it

          Rich composer: the desktop composer on a fixture host

          New chat: type / or @ for the popovers
          A session's shared draft, from the host
          A run in flight: Send turns into Stop
          No folder picked yet

          Composer chrome: controls and status pills

          A session mid-run: the run chip, the context orb
          A session at rest
          A draft: the picks are the next chat's defaults

          Composer chrome: the dock and its banners

          A docked card
          Select a turn with ↑ / ↓
          Esc
          Waiting on you
          An archived session
          This session is archived. Unarchive it to continue.
          A draft's scope: no folder, a folder
          A draft on a server: its projects, the local project to clone, Select directory
          A stalled stream, retried
          retrying 2/5

          Composer chrome: a conversation's badges

          Queued messages, todos, an extension's badge and status

          Session: Todos panel

          A plan mid-task: rename, retry or cancel a step, add one, stop or drop the plan
          Stopped when the run ended: edit, resume or drop
          Closed: read-only
          Applying with no live run: may have been interrupted
          A host without plans.edit or plans.control: read-only
          No plan yet

          Session: todo list and changed files

          TodoListView and TodoTally (a todowrite call's list)
          • Read the session store
          • Add the archive column
          • Write the migration test
          • Update the changelog
          1 in progress1 done2 pending
          DiffFileTree: folders, a rename, findings; click a file
          DiffFileTree with a collapsed folder

          Session: Queue and Artifacts panels

          QueueTab: two queued messages, one with an attachment; click a row to edit it
          Nothing queued
          A message you send while the agent works waits here, then goes out when the run ends.
          ArtifactsPanel: a pull request, a branch and a commit; right-click a row
          QueueTab with nothing queued
          Nothing queued
          A message you send while the agent works waits here, then goes out when the run ends.
          ArtifactsPanel with nothing yet

          Session: dialogs

          SessionDetailsDialog: facts, folder, cache, compact and export
          TurnDetailsDialog: copy, fork, edit, delete
          RunningWorkDialog: a tool call and a background task
          UsagePanel: subscription windows and GitHub's limits

          Session: header and welcome screen

          SessionHeader: the folder, the title (click it to rename here), a toolbar slot
          WelcomeScreen: the greeting and the usage card (Overview, Models, ranges)

          Good morning

          Wednesday, January 15

          ProjectHome: the project, the composer, then its blocks (each card's menu moves or hides it)

          app

          /Users/ada/code/app
          Ask anything about app

          Session: Inbox and side chat

          InboxPanel: a plan at the head, a question behind it
          • Add a rate limiter to the API
            1. A token bucket per key.
            2. A 429 with Retry-After.
            3. Tests.
          InboxPanel with nothing waiting
          Nothing waiting on you
          SideChat before the first question
          Ask about this conversation
          The side chat sees the agent's work and never interrupts it.

          Session: Reminders panel

          RemindersPanel: yours, the agent's, a paused one; switch to All, add one, open a history
          Reminders off in Settings
          No reminders yet

          Command palette

          CommandPalette: actions, commands, files, settings, extensions
          CommandPalette: a query over the files and commands

          Palette app sources

          PaletteDialog: sessions, actions, panels, prefs (createPaletteRows)
          useConversationSearch: matches inside conversations

          App: the modal layer and error fallbacks

          ModalShell: title, back, body and footer

          Import from Claude Code

          Pick what to bring over.

          Skills, MCP servers and instructions found in ~/.claude.

          ErrorFallback: a region that threw
          Live: the slot and the stacked confirm layer

          Approval card

          ApprovalCard: a command, with what worried the decision model
          Allow Zidane to run shell?
          The decision model leaned toward blocking: it touches secrets or the network.
          git push --force-with-lease origin main
          cwd /work/apitimeout 30s
          ApprovalCard: tool input as JSON, without onResolve (read-only)
          Allow Zidane to run fetch_url?
          {
            "url": "https://api.example.com/v1/limits",
            "max_bytes": 20000
          }

          File-edit review

          FileEditApproval: one hunk
          FileEditApproval: three hunks from a subagent, one not in the file

          Safelist

          SafelistPanel
          SafelistPanel: empty

          Appearance: runtime theme

          Live: change the mode or the contrast
          Light
          Another dark theme with an accent override
          High contrast (160)
          Larger font sizes

          Keybindings: key hints and the catalog

          KeyHint: one chord, alternatives, punctuation
          Command KControl WorCommand WControl `Shift Command I
          FooterHint legends
          Up ArrowDown ArrowNavigateReturnOpenEscapeClose
          The catalog with two overrides (sidebar, new session)
          • paletteCommand K
          • sidebarCommand B
          • new sessionControl NorCommand N
          • close tabControl WorCommand W
          • terminalControl `orCommand J
          • keybindingsControl Y
          Live: the dispatcher fires on this page
          PressControl Y0 presses

          Keybindings: the key command registry

          Registered: one part always, the session actions while a session is open
            Live: a registered handler fires on this page
            PressControl Shift X0 presses

            Settings: shell and rows

            Rows pages and an app section (live)
            Settings

            General

            Sessions, updates, notifications and spaces.

            Settings: read-only and failed

            Read-only (a token without the admin scope)
            Failed read

            Settings: preference sections

            Appearance (live: themes this frame)
            Keybindings with two overrides
            • Send messageReturn
            • New lineShift Return
            • Previous history entryUp Arrow
            • Next history entryDown Arrow
            • Mention a file@
            • Use a skill/
            • New sessionControl NorCommand N
            • Back to the main sessionControl Shift M
            • Browse messagesControl S
            • Session detailsControl Shift X
            • Switch agentShift Command I
            • Switch modelControl M
            • Reasoning effortControl L
            • Todo listControl T
            • ArtifactsControl Shift A
            • Stop the current workControl K
            • Generate titleControl Shift T
            • Compact conversationControl Shift K
            • Export as MarkdownControl Shift E
            • Export as JSONControl Shift J
            • Copy session idControl Shift C
            • Add to or remove from favorites
            • Delete sessionControl Shift D
            • Next panelControl Shift ]
            • Previous panelControl Shift [
            • Next tab, file or terminal (else next space)Command Option Right Arrow
            • Previous tab, file or terminal (else previous space)Command Option Left Arrow
            • Close tab, file or terminalControl WorCommand W
            • Split the panel tab rightCommand \
            • Split the panel tab downOption Command \
            • Find in the file or diffs (in Files and Diffs)Command ForControl F
            • Search across files (in Files and Diffs)Command Shift ForControl Shift F
            • Show or hide the terminalControl `orCommand J
            • New terminalControl Shift `
            • Annotate the page (in the Browser tab)Command .
            • Command paletteCommand K
            • Show or hide the sidebarCommand B
            • Back to the previous conversationCommand Left ArroworCommand [
            • Forward to the next conversationCommand Right ArroworCommand ]
            • UsageControl P
            • SettingsCommand ,
            • KeybindingsControl Yor?
            • Zoom inCommand Plus
            • Zoom outCommand Minus
            • Reset zoomCommand 0
            Files & editor, language servers on

            Settings: catalog sections

            Skills (live: toggle, search, delete)
            No skills in .claude/skills or ~/.claude/skills.
            Extensions, one failed to load
            No extensions in .zidane/extensions or ~/.zidane/extensions.
            Plugins, one rejected
            Looking for plugins…
            Instructions of a session
            Environments

            Loading environments…

            Logs
            level ≥
            follow0 lines
            Nothing logged yet. Extension warnings, MCP diagnostics and host debug lines appear here.
            Performance (live: figures drift every 2 s)
            Measuring…
            Performance overlay
            Measuring…
            A server's skills

            box doesn't take installs from this app. Install on the server.

            Reading box's skills…

            Settings: accounts and MCP servers

            Accounts: keys, sign-ins, several credentials
            • Anthropic
              API keyOAuth
              Claude models. Sign in with your Claude plan, or use an API key.
              • workin 12 daysada@example.com(in use)
              • apikeycredentials.json
            • OpenAI
              GPT models. Sign in with your ChatGPT plan, or use an API key.
            • OpenRouter
              Hundreds of models behind one key.
            • Google Vertex AI
              Gemini on your Google Cloud project.
            A server's Accounts
            Anthropicconfigured
            in 12 dayscredentials.json
            • workin 12 daysada@example.com(in use)
            • apikeycredentials.json
            OpenAInot configured
            OpenRouterconfigured
            OPENROUTER_API_KEY
            Google Vertex AInot configured
            MCP servers of a folder
            • filesystemstdioshared · 23/3 tools
              npx -y @modelcontextprotocol/server-filesystem ~/work
              Connected (2h ago)
            • linearhttpNeeds sign-in
              https://mcp.linear.app/mcp
            • searchhttpKey refused
              https://search.example.com/mcp
              Check the headers in mcps.json. (1h ago)
            A server's enabled skills

            Can't list this server's catalog from here. Install and add skills on the server.

            Settings: model rows and extension options

            Defaults for new sessions (live: pick, Test)
            Helper models and tool approvals
            Extension options and actions (live: toggle, Run)

            No extension options. Enabled extensions add theirs here.

            Settings: create extension and Claude Code import

            Create extension

            Create extension

            Create a Zidane extension and open a session to write it.

            Scope
            ~/.zidane/extensions/<name>
            Import from Claude Code (live: Import)

            Import from Claude Code

            Copy conversations, MCP servers, skills, commands and subagents from ~/.claude. Zidane never changes your Claude Code setup and skips what it already imported.

            Looking for Claude Code…

            Machines: the composer notices

            ServerOfflineBanner: offline, with Retry
            Lab is offline. This session is read-only until it reconnects.
            ServerOfflineBanner: the server refused the token
            Attic refused this computer's token. Remove it in Settings › Accounts › Hosts, then add it again with a new token.
            MachineWaitingBanner: the run waits for an offline machine
            Waiting for desk… It is offline. The run continues when it reconnects.
            HostRemovedBanner and ComposerNotice
            Lab was removed. Its chat was closed.
            Box went offline before the chat was created.

            Machines: a server's settings and the daemon dot

            ServerCard: a saved server, with Test and a ⋯ menu (Rename, Change URL, Remove)
            Box
            server name box-1Zidane 1.4.2connected 5m ago
            ServerCard: a web app's own server (read-only, its token's scope)
            BoxAdmin access
            Zidane 1.4.2up 26 h 0 min
            AddServerForm
            ServerUpdatePanel: a release waits for runs to pause
            ServerMachinesPanel: shared, and the server's machines
            Share this computer with Box
            studioconnected/Users/me/code
            Use Box as a machine
            Run commands on Box. Chats stay here.
            Machines on Boxnone yet
            TokensPanel: list, create, revoke
            DaemonMenu: the dot (click for the menu)

            Machines: what a host can do

            CapabilitiesView: a server (tools, sandbox, environments, what it allows)
            Checking…
            CapabilitiesView: This computer (no allows)
            Checking…
            CapabilityTags: a host's row
            CapabilitiesView: an older server's partial answer
            Update the server for the full check.
            • DockerSessions can run here
            • E2BNot available
            • Installs from clientsAvailable
            • Lends itself as a machineAvailable
            • Settings syncMissing
            • Clones from clientsAvailable
            • New folders from clientsAvailable

            Machines: the Hosts page

            HostsSection: This computer and the saved servers (open one for its page)
            zidane server start

            Machines: a server's settings sync

            HostSyncPanel: keep in sync, API keys opted in one by one, a sign-in there
            SyncOutcomeBadge: complete, and partial (focus for what failed)
            Sync completePartial sync
            SyncMarker: synced from a device, and edited on the server since
            synced from laptop
            edited here, not synced from laptop

            Workspace: side panel

            Two groups: drag a tab between strips or onto a body's edge, drag the divider
            An extension panel with its badge, and a tab waiting on the user

            Workspace: empty and floating

            No tab open: + lists every panel
            Floating and slid away: the edge tab brings it back

            Workspace: extension panel content

            PanelContentView: rows with chips and details, facts, actions
            deploy: production
            passed
            main · 2 minutes ago
            #128+42−7
            failed
            fix/drawer-jumpflaky
            /srv/work/app/notes.md
            Runner
            linux-x64
            Cache
            warm
            PanelContentView: nothing yet
            Nothing yet
            PanelContentView: the load failed
            The CI token expired.

            Terminal: panel states and the drawer toggle

            Unavailable: the host says why
            Waiting for the daemon
            A shell that failed to start
            Header toggle: closed, open

            Git: the where menu, remote folders and the branch menu

            WherePicker: a worktree on this computer
            WhereMenu: places, isolation and the branch
            Empty uses the suggested name.
            RemoteFolderPicker: no folder picked yet
            RemoteFolderBrowser: a server's workspace roots
            BranchMenu: opens from the branch

            Git: the git bar and the repository import

            GitBar: one commit to push, the branch's pull request, uncommitted changes
            GitBar: a branch with no remote copy yet, to publish
            GitBar while the agent works: no switching, no syncing
            ImportRepoDialog: paste zidane-ai/zidane

            Import repository

            Paste a GitHub or git URL, or owner/repo.

            Clone into/Users/me/src

            Files: the tree, open files and the working-tree diff

            Files: the tree beside an open file
            Files: a changed file opens on its diff, tree hidden
            Files: no folder

            Files: the Diffs tab

            Diffs: the working tree against HEAD
            Diffs: a clean working tree