AkurAI Build
Menu

Public repository / master

AkurAI-Framework / site/content/docs/ai-media.md

Latest change 36f53e8d189d0609aaabc65e705cf9db9d497d14 - Port Media components as vanilla ES modules by Ólafur Búi Ólafsson

# Media Components

A collection of native HTML media components for rendering images, galleries, videos, and audio in the AI chat interface.

## Image

Renders a responsive image card with optional caption. Uses lazy loading and aspect-ratio preservation.

**Payload shape:**
```js
{
  src: string,        // Required. Image URL (sets directly to <img src>).
  alt?: string,       // Optional. Alt text for accessibility.
  caption?: string    // Optional. Caption text below the image.
}
```

**Example:**
```js
{
  src: "https://images.unsplash.com/photo-1506905925346-21bda4d32df4?w=800",
  alt: "Mountain landscape",
  caption: "A serene mountain landscape at sunset"
}
```

**Rendering:**
- Image wrapped in a `.card` container
- Responsive: 100% width, auto height
- Optional caption in muted gray text
- Lazy loading enabled (`loading="lazy"`)

---

## Image Gallery

Renders a responsive grid of thumbnails with a lightbox overlay. Click any image to enlarge it; press Esc or click the overlay to close.

**Payload shape:**
```js
{
  images: Array<{
    src: string,      // Required. Image URL.
    alt?: string      // Optional. Alt text for the thumbnail.
  }>
}
```

**Example:**
```js
{
  images: [
    { src: "https://example.com/photo1.jpg", alt: "Mountain" },
    { src: "https://example.com/photo2.jpg", alt: "Valley" },
    { src: "https://example.com/photo3.jpg", alt: "Lake" }
  ]
}
```

**Rendering:**
- Grid container with auto-fit columns (min 150px, max 1fr)
- Thumbnail hover effect: slight zoom on hover
- Click to open full-screen lightbox
- Lightbox has semi-transparent dark overlay
- Image-specific alt text shown in lightbox caption
- Esc key or click-outside to close

---

## Video

Renders a native `<video>` element with browser controls and optional caption.

**Payload shape:**
```js
{
  src: string,        // Required. Video URL (sets directly to <video src>).
  poster?: string,    // Optional. Poster image URL (preview frame).
  caption?: string    // Optional. Caption text below the video.
}
```

**Example:**
```js
{
  src: "https://commondatastorage.googleapis.com/gtv-videos-library/sample/big_buck_bunny.mp4",
  poster: "https://peach.blender.org/wp-content/uploads/image/poster_bunny.png",
  caption: "Sample video — Big Buck Bunny"
}
```

**Rendering:**
- Native `<video controls>` — full browser playback controls (play, pause, volume, fullscreen, etc.)
- Responsive: 100% width, auto height
- Poster image shown before play
- Optional caption in muted gray text
- Black background during playback

---

## Audio

Renders a native `<audio>` element with browser controls and optional title.

**Payload shape:**
```js
{
  src: string,      // Required. Audio URL (sets directly to <audio src>).
  title?: string    // Optional. Title text above the player.
}
```

**Example:**
```js
{
  src: "https://www.soundhelix.com/examples/mp3/SoundHelix-Song-1.mp3",
  title: "Sample audio track"
}
```

**Rendering:**
- Optional title in bold, full-color text
- Native `<audio controls>` — browser playback controls (play, pause, volume, seek, etc.)
- Responsive: 100% width
- Clean, minimal styling

---

## Design Notes

### Lazy Loading

Images and galleries use `loading="lazy"` to defer loading off-screen images until they're about to be scrolled into view. This speeds up initial page load, especially in long conversations.

### XSS Safety

All components safely set `src`, `alt`, `href`, and text content from the payload. No `innerHTML` is used. Text content is set via `textContent`, preventing injection.

### Native Elements

Components use browser-native `<img>`, `<video>`, and `<audio>` elements — no custom players, no libraries. Users get standard browser UI and full keyboard accessibility.

### Responsive Design

- Images and videos scale to 100% width, preserving aspect ratio
- Gallery grid uses `auto-fit` to responsively reflow columns
- All components work on mobile and desktop

### Styling

Components reuse the design system:
- `.card` class for consistent borders, padding, and background
- CSS custom properties for colors (e.g., `var(--fg)`, `var(--muted)`)
- Rounded corners (`border-radius: 10px` for media, `8px` for wrappers)
- Smooth transitions on hover

### Accessibility

- Images have `alt` text for screen readers
- Videos and audio use native controls (keyboard accessible)
- Lightbox closes with Esc key
- All text is semantic HTML (`<p>`, `<h3>`, etc.)