17 Tailwind CSS Dashboard Layouts

13 Pure Tailwind4 Tailwind + JSPublished

17 Tailwind CSS dashboard layouts for SaaS admin panels, e-commerce back-offices, analytics walls, and inbox apps — spanning collapsible and nested sidebars, off-canvas drawers, bento and KPI stat grids, master-detail split views, sticky data tables, container-query cards, dark-mode toggles, and full-screen shells. Scoped under .tdl-NN for no-collision pasting, prefers-reduced-motion guarded, framework-agnostic.

Related17 CSS Dashboard Layouts22 Tailwind CSS Headers12 Tailwind CSS Full Page Sections21 Tailwind CSS Pricing Sections

Premium template pickPartner: Cruip

Affiliate link

Building the whole admin dashboard, not just this layout?

You just browsed 17 Tailwind dashboard layouts. Mosaic by Cruip is a complete Tailwind CSS admin dashboard template, coded in HTML, React, Next.js, Vue and Laravel, with a Figma version too. It costs $69.

View Mosaic dashboard

Mosaic by Cruip. We may earn a commission, at no extra cost to you.

01. Tailwind CSS Bento Grid Dashboard Layout (opens in a new tab)

Published

Pure Tailwind
A dark, Vercel-generation bento that now fills the viewport and packs perfectly: hero MRR tile at 2×2, a full-height activity rail, a 30-day uptime strip and a 12-week traffic chart, laid out with col-span-2 row-span-2 on a grid-cols-4 auto-rows-[minmax(8rem,1fr)] board. Hover a tile and one arbitrary :has() variant on the board dims its neighbours; the board re-packs to two columns with @max-[44rem]/page:.

02. Tailwind CSS Collapsible Sidebar Admin Dashboard (opens in a new tab)

Published

Tailwind + JS
The canonical SaaS shell: top bar, a sidebar that folds from 236px to a 68px icon rail, and a fluid main area. The fold is w-59 → group-data-collapsed/shell:w-17, labels fade with group-data-collapsed/shell:opacity-0, and rail tooltips are generated by after:content-[attr(data-label)]. The script sets one attribute — it never touches a class — and now remembers the choice and answers the <kbd>[</kbd> shortcut.

03. Tailwind CSS Dashboard KPI Stat Cards Grid (opens in a new tab)

Published

Pure Tailwind
Four KPI cards that flow 4 → 2 → 1 columns from the width of their own container (@min-[34rem]/kpi:grid-cols-2 @min-[60rem]/kpi:grid-cols-4) — never the orphaned 3 + 1 row that auto-fit produces. New in the port: a working 7d / 28d / 90d range switch built from a radio group, where group-has-[#tdl03-7:checked]/kpi:inline swaps every value, delta and sparkline with zero JavaScript.

04. Tailwind CSS Master-Detail Split View Inbox Layout (opens in a new tab)

Published

Pure Tailwind
The inbox trinity — folder rail, scrollable conversation list, fluid detail pane — as one grid-cols-[13.5rem_20rem_minmax(0,1fr)] row. Selection is a native radio group: has-checked: highlights the row, group-has-[#tdl04-r2:checked]/split:flex swaps the pane, and the pane now fades in with starting:opacity-0. Arrow keys work out of the box, and the reply box is a real labelled textarea.

05. Tailwind CSS Fixed Header Dashboard with Independent Scroll Panels (opens in a new tab)

Published

Pure Tailwind
The app-shell scroll model in utilities: the frame never moves, the page scrollbar is dead, and the activity feed and deploy table scroll on their own with sticky, blurred section headers. It is still three load-bearing ideas — grid-rows-[3.5rem_minmax(0,1fr)], min-h-0 down the chain, overflow-y-auto overscroll-contain on the scroller — now each a class you can point at.

06. Tailwind CSS Grid Template Areas Dashboard Layout (opens in a new tab)

Published

Pure Tailwind
Tailwind has no grid-areas utility — and this demo shows you do not need one. The whole header / sidebar / main / aside / footer shell is an arbitrary property, [grid-template-areas:'header_header_header'_'sidebar_main_aside'_'footer_footer_footer'], re-drawn under @max-[41rem]/stage:. Drag the stage edge and a live badge reports which template is active.
Newsletter

Enjoying these demos? Get new ones by email.

A short email when a new collection ships. Unsubscribe any time.

at

Almost there: check your inbox to confirm.Manage

07. Tailwind CSS Responsive Off-Canvas Sidebar Drawer Dashboard (opens in a new tab)

Published

Tailwind + JS
One markup, two behaviours, side by side: in a wide panel the sidebar sits in-flow; in the phone frame @max-[35rem]/app: turns it into an off-canvas drawer with a blurred click-to-close backdrop. One data-open attribute drives the slide (group-data-open/app:translate-x-0). The script now does what the CSS original only promised in a comment: inert on the closed drawer, focus moved in on open and restored on close, plus Esc and a close button.

08. Tailwind CSS Container Query Responsive Dashboard Cards (opens in a new tab)

Published

Pure Tailwind
The same widget markup in three slots — a narrow card, a medium card and one you drag — renders three layouts: stacked, value-beside-chart, and full analytics with a legend rail. In v4, container queries are built in: @container/w on the slot, @min-[21.25rem]/w: and @min-[32.5rem]/w: on the widget. A live badge on every card names the layout it is currently in.

09. Tailwind CSS E-commerce Admin Dashboard with Bulk Actions (opens in a new tab)

Published

Pure Tailwind
Merchant-panel density with zero JavaScript: a stat strip, an orders table and a quick-action rail. Tick any order and a bulk-actions bar slides up via group-has-[tbody_input:checked]/card:translate-y-0 — and now it counts your selection with a CSS counter and the filter tabs really filter, each row hiding itself with group-has-[#tdl09-unpaid:checked]/card:hidden.

10. Tailwind CSS Dark Mode Dashboard with Light / Dark / System Toggle (opens in a new tab)

Published

Pure Tailwind
Dark mode as a data change, not a redesign. Components use semantic utilities only (bg-tdl10-card, text-tdl10-ink); @theme inline maps those to runtime variables; and the app root flips the variables with has-[#tdl10-dark:checked]:[--tdl10-bg:…]. New in the port: a Light / Dark / System segmented switch, where System follows the OS through the built-in dark: variant.

11. Tailwind CSS Multi-Level Nested Sidebar Navigation Layout (opens in a new tab)

Published

Pure Tailwind
The cloud-console pattern: a dark icon rail, a secondary drawer whose links swap with the rail selection, and the work area. Rail selection is a radio group — group-has-[#tdl11-r2:checked]/console:flex swaps the sub-nav, the breadcrumb and the page heading — and a checkbox folds the drawer by animating grid-template-columns from 14.25rem to 0rem. Zero JavaScript.

13. Tailwind CSS AI Copilot Chat Sidebar Dashboard Layout (opens in a new tab)

Published

Tailwind + JS
Your data on the left, a resident AI copilot docked on the right. The panel folds by animating grid-cols-[minmax(0,1fr)_21.25rem] to group-data-closed/split:grid-cols-[minmax(0,1fr)_0rem], so the dashboard reflows in the same motion. New in the port: the copilot actually talks — the pending answer streams in word by word, suggestion chips and the composer send real messages, and <kbd>Esc</kbd> closes the panel.

14. Tailwind CSS Data Table with Sticky Header and Sticky First Column (opens in a new tab)

Published

Pure Tailwind
The spreadsheet contract in utilities: a 10-column positions table scrolls both ways inside its panel while the header row pins to the top, the ticker column freezes to the left, and the corner cell wins both fights with a three-step z-10 / z-20 / z-30 ladder. New in the port: a sticky totals row pinned to the bottom with sticky bottom-0, and a Compact rows toggle that re-pads every cell through has-[#tdl14-dense:checked]:.
Newsletter

Enjoying these demos? Get new ones by email.

A short email when a new collection ships. Unsubscribe any time.

at

Almost there: check your inbox to confirm.Manage

15. Tailwind CSS Masonry Grid Dashboard Layout (Columns vs Grid Dense) (opens in a new tab)

Published

Pure Tailwind
Eight numbered widgets, two packing engines, one switch. Engine A is columns-[3_15rem] + break-inside-avoid: true masonry, but it reads down each column. Engine B is grid-flow-dense auto-rows-2 with row-span-(--rows): left-to-right order with holes backfilled, heights quantised to an 8px beat. The numbers on the cards make the trade-off obvious in two seconds; the switch is a radio pair read by group-has-[#tdl15-grid:checked]/board:.

16. Tailwind CSS Full-Screen Analytics Dashboard (100vh, No Scroll) (opens in a new tab)

Published

Tailwind + JS
The NOC-wall contract: every pixel of the viewport, zero scrollbars. Status bar, KPI strip, chart grid and incident ticker are rows of grid-rows-[2.75rem_auto_minmax(0,1fr)_2.25rem] on an h-svh overflow-hidden frame, type rides clamp(), and gauges sweep in on a registered @property angle. New in the port: the clock actually ticks, and the ticker has a pause button (WCAG 2.2.2) driven by has-checked:.

17. Tailwind CSS Top Navigation Bar Dashboard Layout with Tabs (opens in a new tab)

Published

Pure Tailwind
The GitHub / Stripe school: no sidebar — a global top bar, a sticky tab strip with an animated underline, and content in a centred w-[min(100%_-_3rem,57.5rem)] column. Tabs are radios: group-has-[#tdl17-t2:checked]/page:grid swaps the panes and has-checked:after:scale-x-100 slides each underline in. New in the port: panes fade in with starting:, the tab strip scrolls horizontally on phones, and invoices and plans gained real status and “Current” affordances.
FAQ

Frequently asked questions

How do I build a collapsible sidebar admin dashboard in Tailwind?
Demo 02 is the canonical shell: a two-column frame where the sidebar track animates between a full 236px rail and a 68px icon-only rail, with the main area staying fluid and reclaiming the freed pixels. Put the transition on the sidebar column width at the shell level, not on every child — one animation runs cleanly instead of each item fighting its own timing. Keep the icon and the text label as separate children inside each link so the label can fade out while the icon stays centred when the rail narrows; never collapse the whole <a> element or you lose the click target and the tooltip anchor. Toggle the collapsed state by flipping one class on the outer grid with a button, and let the grid-template-columns value swap do the work. Because the main pane is just the second track, nothing inside it has to know the sidebar moved.
How do I make dashboard cards respond to their own width instead of the viewport?
Use container queries, which demos 03 and 08 are built on. Mark the wrapper as a query container with @container and give it a name, then size children with container variants like @min-[34rem]/kpi:grid-cols-4 instead of the viewport-based md: / lg: prefixes. In demo 03 the four KPI cards flow 4 to 2 to 1 columns purely from the width of their own grid, so the same component behaves correctly in a full-width page and in a narrow sidebar slot. Demo 08 proves the point by dropping one widget markup into three slots — narrow, medium, and a resizable one — and each renders a different layout at the same instant. The common mistake is forgetting to declare the container on the parent: the @min-[...] variants then silently never match, and the card falls back to its base layout with no error. Name your containers so nested queries resolve against the right ancestor.
Why does my full-screen dashboard still scroll after I set h-screen?
A single h-screen on the outer frame is not enough — demos 16 and 05 show the real contract. The frame must be h-screen and overflow-hidden, every row inside it needs an explicit height or a min-h-0 so flex and grid children can shrink below their content, and only the one panel that is meant to scroll gets overflow-auto. The usual bug is a flex or grid child that refuses to shrink: by default it has min-height: auto, so its content forces the whole frame taller than the viewport and a page scrollbar appears. Add min-h-0 (and min-w-0 for horizontal cases) to that child. Demo 05 keeps the header and rails fixed while an inner activity feed scrolls independently; demo 16 kills every scrollbar for a wall display. If a stray bar persists, walk down the tree and find the row missing its min-h-0.
Tailwind has no grid-template-areas utility — how do I build a named-area dashboard layout?
You do not need one, which is the whole point of demo 06. Define a normal grid with explicit column and row tracks using grid-cols-[...] and grid-rows-[...] on the shell, then place each region with col-span / row-span or the explicit col-start / row-start line utilities. The header spans the full top row, the sidebar takes the first column down the remaining rows, and the main and aside fill what is left — all addressed by grid lines rather than named strings. The advantage over real grid-template-areas is that you can re-place a region at a breakpoint by changing only its start/span utilities, with no second ASCII-art template to keep in sync. If you genuinely want named areas, use an arbitrary property like [grid-template-areas:...], but for a fixed header-sidebar-main shell the line-based approach reads more clearly and survives responsive changes better.
How do I make a data table with both a sticky header and a sticky first column in Tailwind?
Demo 14 is the spreadsheet contract: the 10-column table scrolls both ways inside its panel while row one and column one stay pinned. Put overflow-auto on the panel wrapper, not the table. Give the header cells sticky top-0 and the first-column cells sticky left-0, and raise their z-index so they paint above the scrolling body — the top-left corner cell needs the highest z of all because it must sit above both the sticky row and the sticky column. The frequent bug is a transparent sticky cell: once the body scrolls under it you see both layers overlap, so every pinned cell needs a solid bg- utility matching the surface. Also give sticky cells a fixed width so the two axes agree on where the frozen column ends. sticky fails entirely if any ancestor has overflow: hidden on the wrong axis — the scroll container must be the direct overflow-auto parent.
How do I add a light / dark / system theme toggle to a Tailwind dashboard?
Demo 10 treats dark mode as a data change, not a redesign. Every component uses semantic utilities only — tokens like bg-tdl10-card and a matching text token — so one attribute flip restyles the whole shell with no per-component dark variants scattered through the markup. The three-way control writes the choice: Light and Dark set an explicit attribute on the root, while System removes it and lets a prefers-color-scheme media query decide. The classic bug is a flash of the wrong theme on load because the attribute is applied after paint; set it from a tiny inline script in the document head before the body renders, reading the stored preference first. Persist the selection so a reload keeps it, and make sure System actually clears the override rather than hard-coding a value — otherwise the OS switching between light and dark at dusk does nothing. Build on tokens and you never touch a component when the palette changes.
Is an off-canvas sidebar drawer keyboard accessible, and how do I make it so?
Demo 07 shows one markup with two behaviours — in a wide panel the sidebar sits in-flow, in the phone frame it slides in as an off-canvas drawer — but the slide alone is not accessibility. The toggle must be a real <button> with aria-expanded reflecting open state and aria-controls pointing at the drawer, not a bare <div> with a click handler. When open on a narrow screen the drawer should trap focus so Tab cycles inside it, Esc should close it and return focus to the trigger, and the dimmed backdrop should be clickable to dismiss. Hide the off-screen drawer from the tab order when closed — a drawer translated off-canvas but still focusable lets keyboard users tab into invisible links. If you drive the whole thing with a checkbox for the zero-JS version, pair it with a <label> that is itself focusable and announce the state, because a raw checkbox hack gives screen readers no open/closed context.
When should I use a top-navigation dashboard instead of a sidebar layout?
Reach for demo 17, the top-bar-with-tabs pattern, when your app is shallow — a handful of primary sections rather than a deep tree. The GitHub and Stripe school drops the sidebar entirely: a global top bar plus a sticky tab strip with an animated underline gives every horizontal pixel to content, which suits reading-heavy and table-heavy pages. Prefer a sidebar (demos 02 and 11) once navigation grows past roughly seven destinations or needs nested groups, because a tab strip wraps or scrolls badly beyond that and multi-level nesting has nowhere to live. The off-canvas approach in demo 07 is the bridge for phone widths regardless of which you pick. Also avoid top-nav when you need persistent context — filters, a folder rail, a conversation list like the master-detail inbox in demo 04 — since those want a column that stays put. Match the chrome to the depth of the information architecture, not to a visual preference.

Related collections

15 CSS Aspect Ratio Demos preview

15 CSS Aspect Ratio Demos

15 hand-coded CSS aspect-ratio demos for video embeds, product galleries, IAB ad slots, native dialogs, and CLS-safe placeholders: 16:9 iframe YouTube embed with click-to-load facade + up-next rail, 21:9 full-screen hero video with min-height/max-height:100svh guardrails + Ken Burns drift, 1:1 Instagram-style square grid with 2×2 feature tile, 4:3 magazine card image cover, 9:16 vertical stories rail (TikTok/Reels/Shorts pattern) with scroll-snap + segment bars, 4:5 apparel product image gallery with radio-driven state + 1:1 thumbnails, 1:1 zoom thumbnail carousel with pointer-tracked --zx/--zy magnifier, prevent-layout-shift placeholder with live PerformanceObserver CLS meter (before/after side-by-side lab), dynamic content fallback with three policies (bend/strict/auto) via :has() toggle, IAB ad banner slots (728×90 leaderboard, 300×250 medium rectangle, 300×600 half-page, 320×50 mobile) with skeletons + container-query mobile swap, responsive modal dialog sized min(92vw, 88svh×16/9, 1080px) with @starting-style animation, responsive OpenStreetMap iframe wrapper with 16:9 → 1:1 container-query narrow swap, media query orientation live HUD + resize:both container-ratio playground, object-fit logo cloud with contain/cover/fill switcher via :has(), and side-by-side padding-top hack (height:0 + padding-top:56.25%) → modern aspect-ratio migration comparison with live ratio picker. 11 truly Pure CSS + 4 with a tiny optional vanilla JS snippet (facade swap, pointer magnifier, CLS meter, native dialog). Every demo is scoped under a unique .car-NN prefix so it drops into any project without CSS collisions, ships prefers-reduced-motion guards, and is framework-agnostic (works as-is in React, Vue, Svelte, Astro, Next.js, Remix, or plain HTML).

6 CSS Bento Grid Layouts preview

6 CSS Bento Grid Layouts

6 production CSS bento grid layouts with 12 hand-coded designs — Apple-style product showcase, SaaS feature value-prop matrix, analytics dashboard overview, creative portfolio, e-commerce category hub, and link-in-bio social hub. Each topic ships 2 sub-variants side-by-side so visitors see both a keynote aesthetic and a paper-doc variant at once. Container queries, CSS Grid, zero dependencies, copy-paste ready.

20 CSS Blog Layouts preview

20 CSS Blog Layouts

20 hand-coded CSS blog and editorial layouts for magazine homepages, news sites, personal archives, newsletter back-issues, recipe and podcast blogs, developer tutorials, and long-form journalism. Covers a magazine homepage with hero plus editor-picks rail, a news homepage with breaking-news ticker, blog archives with sticky year separators, Substack-style issue-numbered archives, recipe card grids with prep-time badges, podcast episode lists with waveforms, long-form articles with scroll-driven reading progress, drop caps and floated pull quotes via first-letter, Medium-style 65ch centred reader layouts, dev tutorials with a sticky code panel beside prose, interview transcripts with alternating speakers, case-study pages with stat counters, video blogs with an episode rail, full-bleed photo essays, news articles with sticky related-stories sidebars, documentation pages with prev/next chapter nav, a standalone blog post card, a scroll-snap category filter bar, an inline newsletter callout that breaks out of the prose column, and a horizontal featured-post rail. 12 are pure CSS with zero JavaScript. Every layout is scoped under a .bl-NN prefix for no-collision pasting, guards prefers-reduced-motion, and ports unchanged to React, Vue, Svelte, Astro, Next.js and Tailwind.

Search CodeFronts

Loading…