Skip to content

MediaGrid

The files of a folder as tiles or as a list, with selection for bulk actions, an action per file, drag to reorder and files dropped from the desktop. Pick it for any library view; use MediaTile alone for one file outside a list.

  • MediaGrid

PreviewLink to the section Preview

Live in all three themes. Everything here is interactive.

Light theme, MediaGrid

Hills over a calm bay at dawnwebp

harbour-at-dawn.webp

Image · 182 KB · 1920×1080

Green hills under a clear skywebp

meadow.webp

Image · 96 KB · 1600×900

webp

north-ridge-panorama-from-the-upper-hut-in-late-october-final-version-2.webp

Image · 410 KB · 2400×1000

No alt text
avif

dunes.avif

Image · 74 KB · 1200×800

Decorative
pdf

price-list-2026.pdf

PDF · 320 KB · 4 pages

mp4

intro.mp4

Video · 12.4 MB · 0:42

mp3

jingle.mp3

Audio · 1.1 MB · 0:18

Dark theme, MediaGrid

Hills over a calm bay at dawnwebp

harbour-at-dawn.webp

Image · 182 KB · 1920×1080

Green hills under a clear skywebp

meadow.webp

Image · 96 KB · 1600×900

webp

north-ridge-panorama-from-the-upper-hut-in-late-october-final-version-2.webp

Image · 410 KB · 2400×1000

No alt text
avif

dunes.avif

Image · 74 KB · 1200×800

Decorative
pdf

price-list-2026.pdf

PDF · 320 KB · 4 pages

mp4

intro.mp4

Video · 12.4 MB · 0:42

mp3

jingle.mp3

Audio · 1.1 MB · 0:18

High contrast theme, MediaGrid

Hills over a calm bay at dawnwebp

harbour-at-dawn.webp

Image · 182 KB · 1920×1080

Green hills under a clear skywebp

meadow.webp

Image · 96 KB · 1600×900

webp

north-ridge-panorama-from-the-upper-hut-in-late-october-final-version-2.webp

Image · 410 KB · 2400×1000

No alt text
avif

dunes.avif

Image · 74 KB · 1200×800

Decorative
pdf

price-list-2026.pdf

PDF · 320 KB · 4 pages

mp4

intro.mp4

Video · 12.4 MB · 0:42

mp3

jingle.mp3

Audio · 1.1 MB · 0:18

UsageLink to the section Usage

tsx
import { MediaGrid } from '@skribly/ui/media'
tsx
<MediaGrid aria-label="Files in Holidays" items={files} view="grid"
  selectionMode="multiple" selectedKeys={selected} onSelectionChange={setSelected}
  selectLabel="Select" onAction={openEditor}
  renderActions={(file) => <IconButton label={`Edit ${file.name}`} …/>}
  onMove={reorder} dragLabel={(file) => `Drag ${file.name}`}
  isLoading={loading} loadingLabel="Loading files"
  emptyState={<EmptyState title="This folder is empty" />} />

Every label is a prop, so the app passes its own words in its own language. See no built-in text.

AccessibilityLink to the section Accessibility

  • A React Aria grid with one tab stop.
  • Arrow keys move between tiles in both directions, typing a file name jumps to it, Space or the checkbox selects, Enter runs the action and Tab reaches the buttons inside the focused tile.
  • Checkboxes are read as "Select" plus the file name.
  • Dragging works with the pointer, with Enter on the drag handle and the arrow keys, and with screen readers.
  • Loading is a busy status with skeleton tiles, the empty state says why it is empty, notices such as a missing alt text carry a word and a glyph, and selected tiles get a border as well as a tint.
  • Tiles reflow from one column at 320px.

This demo runs through axe in all three themes on every test run. See what the tests check.

Search this site

Arrows move through the results, Enter opens one, Esc closes. Ctrl K /