{
  "$schema": "https://mian.ro/schema/v2/registry.json",
  "schemaVersion": "2.0.0",
  "generatedAt": "2026-10-02T13:14:06.957Z",
  "id": "bento",
  "name": "Bento grid",
  "category": "Sections",
  "description": "A grid of tiles in mixed sizes for showing several product details at once.",
  "tags": [
    "bento",
    "bento grid",
    "tiles",
    "mosaic",
    "features",
    "showcase",
    "dashboard tiles",
    "website"
  ],
  "requiresJs": false,
  "license": "LicenseRef-MIAN-1.0",
  "composition": {
    "role": "showcase",
    "intents": [
      "showcase product features",
      "show product capabilities",
      "portfolio highlights",
      "mixed size tiles",
      "product tour",
      "feature overview with visuals"
    ],
    "prominence": "high",
    "density": "high",
    "worksAfter": [
      "hero",
      "logo-cloud"
    ],
    "worksBefore": [
      "testimonial",
      "process",
      "cta",
      "figures"
    ],
    "alternatives": [
      "feature-grid",
      "work-grid",
      "media"
    ],
    "avoid": "Tiles with only an icon and a sentence. Each tile should show a real state of the product or a real piece of work. One bento per page."
  },
  "url": "https://mian.ro/components/bento",
  "markdownUrl": "https://mian.ro/ai/components/bento.md",
  "classes": [
    {
      "name": "mn-bento",
      "description": "The grid: one column, then two, then six tracks on wide sections."
    },
    {
      "name": "mn-tile",
      "description": "A tile. Add mn-card for the noodle’s surface. Spans 2 of 6 by default."
    },
    {
      "name": "mn-tile-half · mn-tile-wide · mn-tile-full",
      "description": "Span 3, 4 or 6 of 6 tracks."
    },
    {
      "name": "mn-tile-tall",
      "description": "Span two rows."
    },
    {
      "name": "mn-tile-title",
      "description": "Tile heading (<h3>)."
    },
    {
      "name": "mn-tile-media",
      "description": "Media pinned to the tile’s bottom edge, bleeding to the sides. mn-tile-media-flush removes its padding."
    },
    {
      "name": "mn-tile-figure",
      "description": "A very large number or word: the tile is the statistic."
    },
    {
      "name": "mn-tile-quote",
      "description": "A short quotation set large."
    },
    {
      "name": "mn-tile-fill",
      "description": "A tile filled with the primary colour. One per grid."
    },
    {
      "name": "mn-tile-end",
      "description": "Pushes its element to the bottom of the tile."
    },
    {
      "name": "mn-tile-arrow",
      "description": "On an <a class=\"mn-tile\">: an arrow in the corner that moves on hover."
    },
    {
      "name": "mn-bento-compact",
      "description": "Four equal tracks instead of six: tiles span one, mn-tile-wide two. For profile and link pages."
    },
    {
      "name": "mn-bento-rows",
      "description": "Gives every row a minimum height so small tiles stay square-ish."
    }
  ],
  "accessibility": [
    "Tiles read in source order: put them in the order you want them read, and let the grid place them.",
    "Keep one idea per tile with a real heading.",
    "Layout answers to the section’s own width (container queries), so it works the same in a page, a sidebar or a preview."
  ],
  "examples": [
    {
      "title": "Bento",
      "description": null,
      "html": "<section class=\"mn-section mn-section-sm\">\n  <div class=\"mn-container mn-bento\">\n    <article class=\"mn-card mn-tile mn-tile-wide\"><h3 class=\"mn-tile-title\">Close dashboard</h3><p>Every account, every entity, one progress bar.</p>\n      <div class=\"mn-tile-media\"><div class=\"mn-stats\"><div class=\"mn-stat\"><div class=\"mn-stat-label\">Matched</div><div class=\"mn-stat-value\">1,284</div></div><div class=\"mn-stat\"><div class=\"mn-stat-label\">Exceptions</div><div class=\"mn-stat-value\">7</div></div><div class=\"mn-stat\"><div class=\"mn-stat-label\">Days to close</div><div class=\"mn-stat-value\">3.5</div></div></div></div>\n    </article>\n    <article class=\"mn-card mn-tile mn-tile-tall\"><h3 class=\"mn-tile-title\">Approvals on the go</h3><p>Swipe to approve from your phone.</p><div class=\"mn-tile-media mn-tile-media-flush\"><div class=\"mn-media mn-media-flat\" style=\"--ratio:3/4\"><svg viewBox=\"0 0 600 450\" preserveAspectRatio=\"xMidYMid slice\" aria-hidden=\"true\" xmlns=\"http://www.w3.org/2000/svg\"><rect width=\"600\" height=\"450\" fill=\"var(--mn-surface)\"/><g fill=\"none\" stroke=\"var(--mn-fg)\" stroke-width=\"1.5\"><circle cx=\"300\" cy=\"225\" r=\"12\"/><circle cx=\"300\" cy=\"225\" r=\"26\"/><circle cx=\"300\" cy=\"225\" r=\"40\"/><circle cx=\"300\" cy=\"225\" r=\"54\"/><circle cx=\"300\" cy=\"225\" r=\"68\"/><circle cx=\"300\" cy=\"225\" r=\"82\"/><circle cx=\"300\" cy=\"225\" r=\"96\"/><circle cx=\"300\" cy=\"225\" r=\"110\"/><circle cx=\"300\" cy=\"225\" r=\"124\"/><circle cx=\"300\" cy=\"225\" r=\"138\"/><circle cx=\"300\" cy=\"225\" r=\"152\"/><circle cx=\"300\" cy=\"225\" r=\"166\"/><circle cx=\"300\" cy=\"225\" r=\"180\"/><circle cx=\"300\" cy=\"225\" r=\"194\"/></g><circle cx=\"300\" cy=\"225\" r=\"12\" fill=\"var(--mn-primary)\"/></svg></div></div></article>\n    <article class=\"mn-card mn-tile\"><h3 class=\"mn-tile-title\">32 currencies</h3><p>Revalued at month-end.</p></article>\n    <article class=\"mn-card mn-tile\"><h3 class=\"mn-tile-title\">SOC 2 Type II</h3><p>Audited every year.</p></article>\n  </div>\n</section>"
    },
    {
      "title": "Numbers, a quote and links",
      "description": "Tiles that are the content: a figure, a quotation, a filled tile and whole-tile links.",
      "html": "<section class=\"mn-section mn-section-sm\">\n  <div class=\"mn-container mn-bento mn-bento-rows\">\n    <article class=\"mn-card mn-tile mn-tile-half\"><p class=\"mn-tile-figure\">3.5 days</p><h3 class=\"mn-tile-title\">to close the month</h3><p>Down from eleven, measured across 140 finance teams in 2026.</p></article>\n    <article class=\"mn-card mn-tile mn-tile-half mn-tile-fill\"><h3 class=\"mn-tile-title\">Start with one entity</h3><p>Connect a bank feed and reconcile last month. It takes an afternoon.</p><span class=\"mn-tile-end\"><span class=\"mn-btn mn-btn-sm mn-secondary\">Book a walkthrough</span></span></article>\n    <figure class=\"mn-card mn-tile mn-tile-wide\" style=\"margin:0\"><blockquote class=\"mn-tile-quote\">“We stopped exporting to spreadsheets in the second week. Nobody asked for them back.”</blockquote><figcaption class=\"mn-tile-end mn-muted\">Example quote. Replace with a real, attributed one.</figcaption></figure>\n    <a class=\"mn-card mn-tile\" href=\"#\"><svg class=\"mn-tile-arrow\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M5 12h14M13 6l6 6-6 6\"/></svg><h3 class=\"mn-tile-title\">Changelog</h3><p>What shipped this month.</p></a>\n  </div>\n</section>"
    },
    {
      "title": "Compact: a profile page",
      "description": null,
      "html": "<section class=\"mn-section mn-section-sm\">\n  <div class=\"mn-container mn-bento mn-bento-compact mn-bento-rows\">\n    <article class=\"mn-card mn-tile mn-tile-wide\"><h3 class=\"mn-tile-title\">Noor Haddad</h3><p>Type designer in Rotterdam. I draw text faces for long reading and teach on Thursdays.</p><span class=\"mn-tile-end mn-row\"><span class=\"mn-badge mn-badge-soft mn-success\">Booking for 2027</span></span></article>\n    <a class=\"mn-card mn-tile\" href=\"#\"><svg class=\"mn-tile-arrow\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M5 12h14M13 6l6 6-6 6\"/></svg><h3 class=\"mn-tile-title\">Typefaces</h3><p>Seven families.</p></a>\n    <a class=\"mn-card mn-tile\" href=\"#\"><svg class=\"mn-tile-arrow\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M5 12h14M13 6l6 6-6 6\"/></svg><h3 class=\"mn-tile-title\">Writing</h3><p>Notes on spacing.</p></a>\n    <article class=\"mn-card mn-tile\"><p class=\"mn-tile-figure\">12</p><p>years drawing letters</p></article>\n    <article class=\"mn-card mn-tile mn-tile-wide\"><div class=\"mn-tile-media mn-tile-media-flush\" style=\"margin-top:calc(var(--_p) * -1)\"><div class=\"mn-media mn-media-flat\" style=\"--ratio:21/9\"><svg viewBox=\"0 0 600 450\" preserveAspectRatio=\"xMidYMid slice\" aria-hidden=\"true\" xmlns=\"http://www.w3.org/2000/svg\"><rect width=\"600\" height=\"450\" fill=\"var(--mn-fg)\"/><path d=\"M0 330 300 90l300 240Z\" fill=\"var(--mn-accent)\"/><circle cx=\"300\" cy=\"300\" r=\"40\" fill=\"var(--mn-bg)\"/></svg></div></div></article>\n    <a class=\"mn-card mn-tile mn-tile-fill\" href=\"#\"><svg class=\"mn-tile-arrow\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M5 12h14M13 6l6 6-6 6\"/></svg><h3 class=\"mn-tile-title\">Say hello</h3><p>Replies within two days.</p></a>\n  </div>\n</section>"
    }
  ],
  "css": ".mn-bento { display: grid; gap: var(--mn-gap, 1rem); grid-template-columns: minmax(0, 1fr); grid-auto-flow: dense; }\n.mn-tile { --_p: clamp(1.25rem, 2.6cqi, 1.9rem); display: flex; flex-direction: column; gap: .55rem; min-width: 0; padding: var(--_p); }\n.mn-tile > * { margin: 0; }\n.mn-tile-title { font: var(--mn-heading-weight) 1.125rem/1.3 var(--mn-font-heading); letter-spacing: -.012em; color: var(--mn-fg); }\n.mn-tile :where(p:not([class])) { color: var(--mn-muted); font-size: .9375rem; line-height: 1.6; }\n.mn-tile-media { margin: auto calc(var(--_p) * -1) calc(var(--_p) * -1); padding: var(--_p) var(--_p) 0; min-width: 0; }\n.mn-tile-media-flush { padding: 0; }\n@container mn (min-width: 40rem) {\n  .mn-bento { grid-template-columns: repeat(2, minmax(0, 1fr)); }\n  .mn-tile-wide, .mn-tile-full { grid-column: span 2; }\n}\n@container mn (min-width: 62rem) {\n  .mn-bento { grid-template-columns: repeat(6, minmax(0, 1fr)); }\n  .mn-tile { grid-column: span 2; }\n  .mn-tile-half { grid-column: span 3; }\n  .mn-tile-wide { grid-column: span 4; }\n  .mn-tile-full { grid-column: span 6; }\n  .mn-tile-tall { grid-row: span 2; }\n}\n.mn-tile-figure { font: 700 clamp(2.25rem, 7cqi, 3.5rem)/1 var(--mn-font-heading); letter-spacing: -.04em; font-variant-numeric: tabular-nums; color: var(--mn-fg); }\n.mn-tile-quote { margin: 0; font: 500 1.1875rem/1.45 var(--mn-font-heading); letter-spacing: -.01em; color: var(--mn-fg); text-wrap: pretty; }\n.mn-tile-end { margin-top: auto; }\na.mn-tile { position: relative; color: inherit; text-decoration: none; transition: border-color var(--mn-duration) var(--mn-ease), box-shadow var(--mn-duration) var(--mn-ease); }\na.mn-tile:hover { border-color: color-mix(in oklab, var(--mn-border), var(--mn-fg) 35%); }\na.mn-tile:focus-visible { outline: 2px solid var(--mn-ring); outline-offset: 2px; }\n.mn-tile-arrow { position: absolute; top: var(--_p); inset-inline-end: var(--_p); width: 1.1rem; height: 1.1rem; color: var(--mn-muted); rotate: -45deg; transition: translate var(--mn-dur, 200ms) var(--mn-ease-out, ease-out), color var(--mn-duration) var(--mn-ease); }\na.mn-tile:hover .mn-tile-arrow { translate: 2px -2px; color: currentColor; }\n.mn-bento-rows { grid-auto-rows: minmax(9.5rem, auto); }\n@container mn (min-width: 40rem) { .mn-bento-compact { grid-template-columns: repeat(2, minmax(0, 1fr)); } }\n@container mn (min-width: 62rem) {\n  .mn-bento-compact { grid-template-columns: repeat(4, minmax(0, 1fr)); }\n  .mn-bento-compact > .mn-tile { grid-column: span 1; }\n  .mn-bento-compact > :is(.mn-tile-half, .mn-tile-wide) { grid-column: span 2; }\n  .mn-bento-compact > .mn-tile-full { grid-column: span 4; }",
  "js": null,
  "install": {
    "css": "https://mian.ro/dist/mian.css",
    "js": null,
    "registryItem": "https://mian.ro/r/bento.json"
  }
}
