README.md

# Livestrap

Bootstrap 5 components for Phoenix LiveView.

All components are prefixed with `bs_` to avoid naming conflicts with Phoenix builtins or your own components.

## Installation

Add `livestrap` to your dependencies in `mix.exs`:

```elixir
def deps do
  [
    {:livestrap, "~> 0.1.0"}
  ]
end
```

## Setup

Add `use Livestrap` to your app's HTML helpers so all components are available in your templates:

```elixir
defmodule MyAppWeb do
  def html do
    quote do
      use Phoenix.Component
      use Livestrap
      # ...
    end
  end
end
```

Or import individual component modules where needed:

```elixir
import Livestrap.Components.Button
import Livestrap.Components.Table
```

Make sure Bootstrap 5 CSS and JS are loaded in your layout (via CDN or your asset pipeline):

```html
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>
```

## Components

### Button

```heex
<.bs_button variant="primary">Click me</.bs_button>
<.bs_button variant="danger" outline>Delete</.bs_button>
<.bs_button variant="success" size="lg" type="submit">Save</.bs_button>
```

Attrs: `variant`, `outline`, `size` (sm/lg), `type`, `disabled`, `active`

### Alert

```heex
<.bs_alert variant="success">Saved successfully!</.bs_alert>
<.bs_alert variant="warning" dismissible>Watch out!</.bs_alert>
<.bs_alert variant="info">
  <:heading>Heads up!</:heading>
  Here is some additional info.
</.bs_alert>
```

Attrs: `variant`, `dismissible` | Slots: `inner_block`, `heading`

### Badge

```heex
<.bs_badge variant="primary">New</.bs_badge>
<.bs_badge variant="danger" pill>99+</.bs_badge>
```

Attrs: `variant`, `pill`

### Spinner

```heex
<.bs_spinner />
<.bs_spinner type="grow" variant="success" />
<.bs_spinner size="sm" label="Please wait..." />
```

Attrs: `type` (border/grow), `variant`, `size` (sm), `label`

### Progress

```heex
<.bs_progress value={75} />
<.bs_progress value={60} variant="success" striped animated label="60%" />
```

Attrs: `value`, `min`, `max`, `label`, `variant`, `striped`, `animated`

### Breadcrumb

```heex
<.bs_breadcrumb>
  <:item href="/">Home</:item>
  <:item href="/users">Users</:item>
  <:item active>Profile</:item>
</.bs_breadcrumb>
```

Attrs: `label`, `divider` | Slot: `item` (attrs: `href`, `active`)

### Pagination

```heex
<.bs_pagination>
  <:item href="#" disabled>Previous</:item>
  <:item href="/page/1">1</:item>
  <:item href="/page/2" active>2</:item>
  <:item href="/page/3">3</:item>
  <:item href="#">Next</:item>
</.bs_pagination>
```

Attrs: `label`, `size` (sm/lg), `align` (center/end) | Slot: `item` (attrs: `href`, `active`, `disabled`)

### Card

```heex
<.bs_card img_top="/photo.jpg" img_alt="A photo">
  <:header>Featured</:header>
  <:body title="Card title" subtitle="Subtitle">
    Some content here.
  </:body>
  <:footer>2 days ago</:footer>
</.bs_card>
```

Attrs: `img_top`, `img_bottom`, `img_alt` | Slots: `header`, `body` (attrs: `title`, `subtitle`), `footer`, `inner_block`

### Accordion

```heex
<.bs_accordion id="faq">
  <:item heading="Question 1" open>Answer 1</:item>
  <:item heading="Question 2">Answer 2</:item>
</.bs_accordion>
```

Attrs: `id`, `flush`, `always_open` | Slot: `item` (attrs: `heading`, `open`)

### Modal

```heex
<.bs_modal id="confirm" title="Are you sure?" centered>
  This action cannot be undone.
  <:footer>
    <.bs_button variant="secondary" data-bs-dismiss="modal">Cancel</.bs_button>
    <.bs_button variant="danger">Delete</.bs_button>
  </:footer>
</.bs_modal>
```

Attrs: `id`, `title`, `size` (sm/lg/xl), `centered`, `scrollable`, `static_backdrop`, `fullscreen` | Slots: `inner_block`, `footer`

### Table

```heex
<.bs_table id="users" rows={@users} striped hover>
  <:col :let={user} label="ID">{user.id}</:col>
  <:col :let={user} label="Name">{user.name}</:col>
  <:action :let={user}>
    <a href={"/users/#{user.id}/edit"}>Edit</a>
  </:action>
</.bs_table>
```

Attrs: `id`, `rows`, `row_id`, `row_click`, `row_item`, `variant`, `striped`, `striped_columns`, `hover`, `bordered`, `borderless`, `small`, `responsive`, `caption_top` | Slots: `col` (attr: `label`), `action`

Supports Phoenix LiveView streams via `phx-update="stream"`.

## Global Attributes

All components accept arbitrary HTML attributes via Phoenix's `:global` pattern:

```heex
<.bs_button variant="primary" phx-click="save" class="mt-3">Save</.bs_button>
<.bs_alert variant="info" id="notice" data-testid="alert">Info</.bs_alert>
```

## Development

Start the live_capture preview server:

```bash
iex -S mix
```

Visit http://localhost:4002 to browse all components with their variations.

## License

MIT

## Background

This code was generated using an LLM.