{
  "$schema": "https://mian.ro/schema/v2/registry.json",
  "schemaVersion": "2.0.0",
  "generatedAt": "2026-10-02T13:14:06.957Z",
  "id": "dashboard",
  "name": "Dashboard grid",
  "category": "Layout & utilities",
  "description": "A twelve-track grid for dashboards and a widget frame: title, period, body, footer. It lays out for the width it gets, so it works beside a sidebar.",
  "tags": [
    "dashboard",
    "dashboard layout",
    "widget",
    "panel",
    "admin layout",
    "analytics page",
    "grid",
    "overview page"
  ],
  "requiresJs": false,
  "license": "LicenseRef-MIAN-1.0",
  "composition": {
    "role": null,
    "intents": [
      "dashboard layout",
      "dashboard grid",
      "widget panel",
      "admin overview page",
      "analytics overview"
    ],
    "prominence": null,
    "density": null,
    "worksAfter": [],
    "worksBefore": [],
    "alternatives": [
      "app-shell",
      "bento"
    ],
    "avoid": null
  },
  "url": "https://mian.ro/components/dashboard",
  "markdownUrl": "https://mian.ro/ai/components/dashboard.md",
  "classes": [
    {
      "name": "mn-dash",
      "description": "The grid: one column, then halves, then twelve tracks."
    },
    {
      "name": "mn-dash-3 · -4 · -5 · -6 · -7 · -8 · -9",
      "description": "How many of twelve tracks a child spans on wide containers. Without one, a child spans the full row."
    },
    {
      "name": "mn-widget",
      "description": "A panel. Add mn-card for the surface."
    },
    {
      "name": "mn-widget-head",
      "description": "Title on the left, a control (period, menu) on the right."
    },
    {
      "name": "mn-widget-title · mn-widget-sub",
      "description": "Heading and one line under it."
    },
    {
      "name": "mn-widget-body",
      "description": "Content. mn-widget-flush on the widget removes the side padding (tables, lists)."
    },
    {
      "name": "mn-widget-foot",
      "description": "A footer line: a link to the full report, or when the data was updated."
    }
  ],
  "accessibility": [
    "Each widget is a <section> with a real heading, so it appears in the page outline.",
    "Order widgets in the source by importance; the grid only changes how wide they are.",
    "Say when the data was last updated, in text."
  ],
  "examples": [
    {
      "title": "Overview",
      "description": null,
      "html": "<div class=\"mn-dash\">\n  <section class=\"mn-card mn-widget mn-dash-8\" aria-labelledby=\"dw-1\"><div class=\"mn-widget-head\"><div><h3 class=\"mn-widget-title\" id=\"dw-1\">Orders</h3><p class=\"mn-widget-sub\">Last 12 weeks</p></div><select class=\"mn-select mn-input-sm\" aria-label=\"Period\" style=\"width:auto\"><option>12 weeks</option><option>6 months</option></select></div>\n    <div class=\"mn-widget-body\"><svg class=\"mn-chart-line\" style=\"--h:9rem\" data-values=\"212,240,231,268,254,290,301,288,322,340,331,362\" data-labels=\"W27,W28,W29,W30,W31,W32,W33,W34,W35,W36,W37,W38\" data-names=\"Orders\" role=\"img\" aria-label=\"Orders per week, rising from 212 to 362\"></svg></div>\n    <div class=\"mn-widget-foot\"><span>Updated 4 minutes ago</span><a class=\"mn-link\" href=\"#\">Full report</a></div></section>\n  <section class=\"mn-card mn-widget mn-dash-4\" aria-labelledby=\"dw-2\"><div class=\"mn-widget-head\"><h3 class=\"mn-widget-title\" id=\"dw-2\">Fulfilment</h3></div>\n    <div class=\"mn-widget-body\" style=\"display:grid;justify-items:center;gap:.25rem\"><div class=\"mn-gauge mn-success\" role=\"meter\" aria-label=\"Orders shipped within 24 hours\" aria-valuemin=\"0\" aria-valuemax=\"100\" aria-valuenow=\"86\" style=\"--v:86\"><span class=\"mn-gauge-value\">86%</span></div><p class=\"mn-kpi-foot\">shipped within 24 hours · target 90%</p></div></section>\n  <section class=\"mn-card mn-widget mn-widget-flush mn-dash-7\" aria-labelledby=\"dw-3\"><div class=\"mn-widget-head\"><h3 class=\"mn-widget-title\" id=\"dw-3\">Needs attention</h3><span class=\"mn-badge mn-badge-soft mn-warning\">3</span></div>\n    <div class=\"mn-widget-body\"><table class=\"mn-table mn-table-compact\"><thead><tr><th scope=\"col\">Order</th><th scope=\"col\">Issue</th><th scope=\"col\" class=\"mn-num\">Age</th></tr></thead><tbody><tr><td>#48213</td><td>Address not found</td><td class=\"mn-num\">2 d</td></tr><tr><td>#48190</td><td>Payment review</td><td class=\"mn-num\">1 d</td></tr><tr><td>#48177</td><td>Out of stock: 1 item</td><td class=\"mn-num\">6 h</td></tr></tbody></table></div></section>\n  <section class=\"mn-card mn-widget mn-dash-5\" aria-labelledby=\"dw-4\"><div class=\"mn-widget-head\"><h3 class=\"mn-widget-title\" id=\"dw-4\">Sales by channel</h3></div>\n    <div class=\"mn-widget-body\"><div class=\"mn-breakdown\"><div class=\"mn-breakdown-bar\" role=\"img\" aria-label=\"Shop 54%, marketplace 27%, wholesale 13%, other 6%\"><i style=\"--v:54\"></i><i style=\"--v:27\"></i><i style=\"--v:13\"></i><i style=\"--v:6\"></i></div>\n      <ul class=\"mn-breakdown-list\"><li><span>Own shop</span><b>€26,030</b><small>54%</small></li><li><span>Marketplace</span><b>€13,020</b><small>27%</small></li><li><span>Wholesale</span><b>€6,270</b><small>13%</small></li><li><span>Other</span><b>€2,890</b><small>6%</small></li></ul></div></div></section>\n</div>"
    }
  ],
  "css": ".mn-dash { container: mn-dash / inline-size; display: grid; grid-template-columns: repeat(12, minmax(0, 1fr)); gap: var(--mn-gap, 1rem); }\n.mn-dash > * { grid-column: span 12; min-width: 0; }\n@container mn-dash (min-width: 38rem) {\n  .mn-dash > :is(.mn-dash-3, .mn-dash-4, .mn-dash-6) { grid-column: span 6; }\n}\n@container mn-dash (min-width: 62rem) {\n  .mn-dash > .mn-dash-3 { grid-column: span 3; }\n  .mn-dash > .mn-dash-4 { grid-column: span 4; }\n  .mn-dash > .mn-dash-5 { grid-column: span 5; }\n  .mn-dash > .mn-dash-7 { grid-column: span 7; }\n  .mn-dash > .mn-dash-8 { grid-column: span 8; }\n  .mn-dash > .mn-dash-9 { grid-column: span 9; }\n}\n.mn-widget { display: flex; flex-direction: column; min-width: 0; }\n.mn-widget-head { display: flex; align-items: flex-start; justify-content: space-between; gap: .75rem; padding: .95rem 1.15rem .2rem; }\n.mn-widget-title { margin: 0; font: 600 .9375rem/1.35 var(--mn-font); color: var(--mn-fg); }\n.mn-widget-sub { margin: .1rem 0 0; color: var(--mn-muted); font-size: .8125rem; }\n.mn-widget-body { flex: 1; min-width: 0; padding: .8rem 1.15rem 1.15rem; }\n.mn-widget-flush > .mn-widget-body { padding: .5rem 0 0; }\n.mn-widget-foot { display: flex; align-items: center; justify-content: space-between; gap: .5rem; padding: .6rem 1.15rem; border-top: var(--mn-border-w) solid var(--mn-border); color: var(--mn-muted); font-size: var(--mn-text-sm); }",
  "js": null,
  "install": {
    "css": "https://mian.ro/dist/mian.css",
    "js": null,
    "registryItem": "https://mian.ro/r/dashboard.json"
  }
}
