# `Minga.Extension.Panel`
[🔗](https://github.com/jsmestad/minga/blob/main/lib/minga/extension/panel.ex#L1)

ETS-backed registry for extension-owned panels in the editor.

Extensions register panels with structured content blocks (tables,
key-value pairs, text, trees, progress bars). The Layer 2 emit
pipeline reads this registry and encodes the content for the
frontend, which renders it with native widgets.

# `content_block`

```elixir
@type content_block() ::
  {:text, String.t()}
  | {:styled_text, [{String.t(), non_neg_integer(), keyword()}]}
  | {:table, map()}
  | {:key_value, [{String.t(), String.t()}]}
  | {:separator}
  | {:progress, map()}
  | {:tree, map()}
```

A content block in a panel.

# `entry`

```elixir
@type entry() :: %{
  extension: atom(),
  panel_id: term(),
  title: String.t(),
  position: position(),
  size: size(),
  visible: boolean(),
  content: [content_block()]
}
```

A registered panel entry.

# `position`

```elixir
@type position() :: :bottom | :right | :float
```

Panel position in the editor layout.

# `size`

```elixir
@type size() :: {:percent, 1..100} | {:lines, pos_integer()}
```

Panel size specification.

# `table`

```elixir
@type table() :: atom()
```

# `all`

```elixir
@spec all() :: [entry()]
```

# `all`

```elixir
@spec all(table()) :: [entry()]
```

# `empty?`

```elixir
@spec empty?() :: boolean()
```

# `empty?`

```elixir
@spec empty?(table()) :: boolean()
```

# `hide`

```elixir
@spec hide(atom(), term()) :: :ok
```

# `remove`

```elixir
@spec remove(atom(), term()) :: :ok
```

# `remove`

```elixir
@spec remove(table(), atom(), term()) :: :ok
```

# `remove_all`

```elixir
@spec remove_all(atom()) :: :ok
```

# `remove_all`

```elixir
@spec remove_all(table(), atom()) :: :ok
```

# `set`

```elixir
@spec set(atom(), term(), map()) :: :ok
```

# `set`

```elixir
@spec set(table(), atom(), term(), map()) :: :ok
```

# `show`

```elixir
@spec show(atom(), term()) :: :ok
```

# `start_link`

```elixir
@spec start_link(keyword()) :: GenServer.on_start()
```

# `unregister_source`

```elixir
@spec unregister_source(Minga.Extension.ContributionCleanup.contribution_source()) ::
  :ok
```

# `visible`

```elixir
@spec visible() :: [entry()]
```

# `visible`

```elixir
@spec visible(table()) :: [entry()]
```

---

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