# `MingaEditor.Shell.Traditional.State`
[🔗](https://github.com/jsmestad/minga/blob/main/lib/minga_editor/shell/traditional/state.ex#L1)

Presentation state for the traditional tab-based editor shell.

These fields are presentation concerns: they control how the editor
looks and behaves visually, but have no effect on the core editing
model. Each field was migrated from `MingaEditor.State` as part of
Phase F of the Core/Shell separation.

All `set_X`/`get_X` methods that operate on shell fields live here.
`MingaEditor.State` retains thin wrappers that delegate through
`update_shell_state/2` for backward compatibility.

# `t`

```elixir
@type t() :: %MingaEditor.Shell.Traditional.State{
  agent: MingaEditor.State.Agent.t(),
  bottom_panel: MingaEditor.BottomPanel.t(),
  dashboard: MingaEditor.Dashboard.state() | nil,
  git_status_panel: MingaEditor.Frontend.Protocol.GUI.git_status_data() | nil,
  hover_popup: MingaEditor.HoverPopup.t() | nil,
  modeline_click_regions: [
    MingaEditor.Shell.Traditional.Modeline.click_region()
  ],
  nav_flash: MingaEditor.NavFlash.t() | nil,
  picker_ui: MingaEditor.State.Picker.t(),
  prompt_ui: MingaEditor.State.Prompt.t(),
  signature_help: MingaEditor.SignatureHelp.t() | nil,
  status_msg: String.t() | nil,
  suppress_tool_prompts: boolean(),
  tab_bar: MingaEditor.State.TabBar.t() | nil,
  tab_bar_click_regions: [
    MingaEditor.Shell.Traditional.TabBarRenderer.click_region()
  ],
  tool_declined: MapSet.t(),
  tool_prompt_queue: [atom()],
  warning_popup_timer: reference() | nil,
  whichkey: MingaEditor.State.WhichKey.t()
}
```

# `agent`

```elixir
@spec agent(t()) :: MingaEditor.State.Agent.t()
```

Returns the agent session lifecycle state.

# `bottom_panel`

```elixir
@spec bottom_panel(t()) :: MingaEditor.BottomPanel.t()
```

Returns the bottom panel state.

# `cancel_nav_flash`

```elixir
@spec cancel_nav_flash(t()) :: t()
```

Cancels the nav flash animation.

# `clear_status`

```elixir
@spec clear_status(t()) :: t()
```

Clears the transient status message.

# `close_dashboard`

```elixir
@spec close_dashboard(t()) :: t()
```

Closes the dashboard home screen.

# `close_git_status_panel`

```elixir
@spec close_git_status_panel(t()) :: t()
```

Clears the git status panel.

# `dashboard`

```elixir
@spec dashboard(t()) :: MingaEditor.Dashboard.state() | nil
```

Returns the dashboard home screen state, or nil.

# `dismiss_hover_popup`

```elixir
@spec dismiss_hover_popup(t()) :: t()
```

Dismisses the hover popup.

# `git_status_panel`

```elixir
@spec git_status_panel(t()) ::
  MingaEditor.Frontend.Protocol.GUI.git_status_data() | nil
```

Returns the git status panel data, or nil.

# `hover_popup`

```elixir
@spec hover_popup(t()) :: MingaEditor.HoverPopup.t() | nil
```

Returns the hover popup state, or nil when not showing.

# `nav_flash`

```elixir
@spec nav_flash(t()) :: MingaEditor.NavFlash.t() | nil
```

Returns the nav flash state, or nil when inactive.

# `picker_ui`

```elixir
@spec picker_ui(t()) :: MingaEditor.State.Picker.t()
```

Returns the picker UI state.

# `prompt_ui`

```elixir
@spec prompt_ui(t()) :: MingaEditor.State.Prompt.t()
```

Returns the prompt UI state.

# `set_agent`

```elixir
@spec set_agent(t(), MingaEditor.State.Agent.t()) :: t()
```

Replaces the agent session lifecycle state.

# `set_bottom_panel`

```elixir
@spec set_bottom_panel(t(), MingaEditor.BottomPanel.t()) :: t()
```

Replaces the bottom panel state.

# `set_dashboard`

```elixir
@spec set_dashboard(t(), MingaEditor.Dashboard.state()) :: t()
```

Sets the dashboard home screen state.

# `set_git_status_panel`

```elixir
@spec set_git_status_panel(t(), map() | nil) :: t()
```

Sets the git status panel data.

# `set_hover_popup`

```elixir
@spec set_hover_popup(t(), MingaEditor.HoverPopup.t()) :: t()
```

Sets the hover popup state.

# `set_nav_flash`

```elixir
@spec set_nav_flash(t(), MingaEditor.NavFlash.t()) :: t()
```

Sets the nav flash state.

# `set_picker_ui`

```elixir
@spec set_picker_ui(t(), MingaEditor.State.Picker.t()) :: t()
```

Replaces the picker UI state.

# `set_prompt_ui`

```elixir
@spec set_prompt_ui(t(), MingaEditor.State.Prompt.t()) :: t()
```

Replaces the prompt UI state.

# `set_status`

```elixir
@spec set_status(t(), String.t()) :: t()
```

Sets the transient status message shown in the modeline.

# `set_tab_bar`

```elixir
@spec set_tab_bar(t(), MingaEditor.State.TabBar.t() | nil) :: t()
```

Replaces the tab bar state.

# `set_whichkey`

```elixir
@spec set_whichkey(t(), MingaEditor.State.WhichKey.t()) :: t()
```

Replaces the which-key popup state.

# `skip_tool_prompt?`

```elixir
@spec skip_tool_prompt?(t(), atom()) :: boolean()
```

Returns true if the given tool should NOT be prompted for installation.

A tool is skipped when it's already declined this session, already
installed, currently being installed, or already in the prompt queue.

# `status_msg`

```elixir
@spec status_msg(t()) :: String.t() | nil
```

Returns the transient status message, or nil.

# `tab_bar`

```elixir
@spec tab_bar(t()) :: MingaEditor.State.TabBar.t() | nil
```

Returns the tab bar state, or nil.

# `update_picker_ui`

```elixir
@spec update_picker_ui(t(), (MingaEditor.State.Picker.t() -&gt;
                         MingaEditor.State.Picker.t())) :: t()
```

Applies a function to the picker UI state.

# `whichkey`

```elixir
@spec whichkey(t()) :: MingaEditor.State.WhichKey.t()
```

Returns the which-key popup state.

---

*Consult [api-reference.md](api-reference.md) for complete listing*
