Current section

Files

Jump to
mishka_chelekom usage-rules components indicator.md
Raw

usage-rules/components/indicator.md

# Indicator Component
Visual indicator dots for notifications, status updates, and highlighting elements. Always wrap the indicator's parent in `class="relative inline-block"` (or similar `relative` container) so absolute positioning works.
**Documentation**: https://mishka.tools/chelekom/docs/indicator
> **For LLM Agents**: If you need more details, examples, or edge cases not covered here, fetch the full documentation from the URL above.
## Generate
```bash
# Generate with all options
mix mishka.ui.gen.component indicator
# Generate with specific options
mix mishka.ui.gen.component indicator --color primary,danger,success --size small,medium
# Generate with custom module name
mix mishka.ui.gen.component indicator --module MyAppWeb.Components.CustomIndicator
```
## Dependencies
| Type | Components |
|------|------------|
| **Necessary** | None |
| **Optional** | None |
| **JavaScript** | None |
## Attributes
| Attribute | Type | Default | Description |
|-----------|------|---------|-------------|
| `id` | `:string` | `nil` | Unique identifier |
| `color` | `:string` | `"base"` | Color theme |
| `size` | `:string` | `"small"` | Indicator size |
| `position` | `:string` | `"top_right"` | Position relative to parent |
| `ping` | `:boolean` | `false` | Enable ping animation |
| `class` | `:any` | `nil` | Custom CSS class |
## Slots
- `inner_block` — content to display inside the indicator (e.g. a number badge).
## Available Options
| Option | Values |
|--------|--------|
| Colors | `base`, `natural`, `white`, `primary`, `secondary`, `dark`, `success`, `warning`, `danger`, `info`, `silver`, `misc`, `dawn` |
| Sizes | `extra_small`, `small`, `medium`, `large`, `extra_large` |
| Positions | `top_left`, `top_center`, `top_right`, `middle_left`, `middle_right`, `bottom_left`, `bottom_center`, `bottom_right` |
## Usage Examples
### Basic + Positions
```heex
<div class="relative inline-block">
<.icon name="hero-bell" class="size-6" />
<.indicator color="danger" />
</div>
<div class="relative inline-block">
<.icon name="hero-bell" class="size-8" />
<.indicator position="bottom_left" color="danger" />
</div>
```
### Colors and Sizes
```heex
<.indicator color="primary" />
<.indicator color="success" />
<.indicator color="warning" />
<.indicator color="danger" />
<.indicator color="info" />
<.indicator size="extra_small" color="danger" />
<.indicator size="small" color="danger" />
<.indicator size="medium" color="danger" />
<.indicator size="large" color="danger" />
<.indicator size="extra_large" color="danger" />
```
### Ping Animation + Conditional Render (Notification Bell)
```heex
<button class="relative p-2 hover:bg-gray-100 rounded-lg">
<.icon name="hero-bell" class="size-6" />
<.indicator :if={@unread_count > 0} color="danger" ping />
</button>
```
### Content (Badge Number)
```heex
<div class="relative inline-block">
<.icon name="hero-inbox" class="size-6" />
<.indicator color="danger" size="medium">5</.indicator>
</div>
<a href="/inbox" class="relative inline-flex items-center gap-2">
<.icon name="hero-inbox" class="size-6" />
<span>Messages</span>
<.indicator :if={@message_count > 0} color="primary" size="medium" position="top_right">
{min(@message_count, 99)}
</.indicator>
</a>
<.button_link navigate={~p"/cart"} variant="transparent" class="relative">
<.icon name="hero-shopping-cart" class="size-6" />
<.indicator :if={@cart_count > 0} color="primary" size="small">
{@cart_count}
</.indicator>
</.button_link>
```
### On Avatar / Dynamic Status Color
```heex
<div class="flex items-center gap-3">
<div class="relative">
<.avatar src={@user.avatar} size="medium" rounded="full" />
<.indicator
color={status_color(@user.status)}
position="bottom_right"
size="small"
/>
</div>
<div>
<p class="font-medium">{@user.name}</p>
<p class="text-sm text-gray-500">{format_status(@user.status)}</p>
</div>
</div>
```
```elixir
defp status_color(:online), do: "success"
defp status_color(:away), do: "warning"
defp status_color(:busy), do: "danger"
defp status_color(_), do: "natural"
```
### Color-Only Status Dots (Task / Connection)
```heex
<div :for={task <- @tasks} class="flex items-center gap-3 p-3 border rounded">
<.indicator color={task_status_color(task.status)} size="small" />
<span class="flex-1">{task.title}</span>
<span class="text-sm text-gray-500">{task.due_date}</span>
</div>
<div class="flex items-center gap-2">
<.indicator color={if @connected, do: "success", else: "danger"} size="extra_small" />
<span class="text-sm">
{if @connected, do: "Connected", else: "Disconnected"}
</span>
</div>
```