30 Tailwind CSS Grid Layouts
14 / 30

All 30 in 30 Tailwind CSS Grid Layouts

  1. 01Tailwind Full-Bleed Article Layout for Long-Form Editorial
  2. 02Tailwind Docs Layout with Sticky Table of Contents
  3. 03Tailwind Photo Gallery Grid with auto-fill and Real Images
  4. 04Tailwind Holy Grail Page Layout for a News Site
  5. 05Tailwind Data Table with Subgrid Rows and Status Pills
  6. 06Tailwind Overlapping Card Hero for a Case Study
  7. 07Tailwind Help Center Layout with Fixed Sidebars
  8. 08Tailwind 12 Column Grid System for Marketing Pages
  9. 09Tailwind Bento Grid for a Product Feature Section
  10. 10Tailwind Magazine Spread Layout with Overlapping Headline
  11. 11Tailwind Responsive Card Grid for an Integrations Directory
  12. 12Tailwind CMS Category Grid that Compacts Itself with has()
  13. 13Tailwind Masonry Layout for a Saved Ideas Board
  14. 14Tailwind Hexagon Team Grid with clip-path Avatars
  15. 15Tailwind Subgrid Cards with Perfectly Aligned Buttons
  16. 16Tailwind Analytics Dashboard Layout with Grid App Shell
  17. 17Tailwind Pricing Table with Subgrid and a Featured Plan
  18. 18Tailwind Kanban Board with Scroll Snap Columns
  19. 19Tailwind Video Thumbnail Grid with Zero Layout Shift
  20. 20Tailwind Container Query Card for Reusable Article Teasers
  21. 21Tailwind Diagonal Section Band with skewY Counter-Skew
  22. 22Tailwind Asymmetric Poster Hero with Layered Grid Regions
  23. 23Tailwind Mosaic Photo Wall with a Designed Span Sequence
  24. 24Tailwind Dense Grid Packing for a Mixed-Size Asset Library
  25. 25Tailwind Onboarding Stepper with CSS Counters
  26. 26Tailwind macOS Window Layout with Vibrancy Sidebar
  27. 27Tailwind Scroll Snap Carousel with Peeking Slides
  28. 28Tailwind Status Map UI with Grid Coordinate Pins
  29. 29Tailwind Logo Wall with 1px Gap Hairline Dividers
  30. 30Tailwind Periodic Table Layout with Grid Coordinates
Pure TailwindMIT licensed

Tailwind Hexagon Team Grid with clip-path Avatars

A team page as an interlocking honeycomb: ten hexagonal portraits that nest peak-into-notch, each revealing a name and role on hover or keyboard focus. The photo is clipped by the same polygon as the cell, so the comb stays a comb.

Live Demo
Plain CSSTailwind v4
Try it

Untitled UI Pro: 5,000+ React + Tailwind CSS v4 components · from $349 one-time

Untitled UI React · Affiliate link

Get Untitled UI Pro

The code

<section class="tgx-14 w-full min-h-svh bg-tgx14-bg font-tgx14-sans px-6 py-10 grid place-items-center gap-6">
  <header class="flex flex-col gap-1.5 text-center">
    <p class="text-[0.66rem] tracking-[0.2em] uppercase text-tgx14-honey">Hexlab · Studio</p>
    <h2 class="text-[1.5rem] font-semibold text-white tracking-[-0.015em]">Ten people, one comb</h2>
    <p class="text-[0.8rem] text-tgx14-dim max-w-[44ch]">Hover or tab through the team — each cell reveals a name and a role without moving its neighbours.</p>
  </header>
  <ul class="list-none flex flex-col items-start">
    <li class="flex gap-0">
      <a href="#0" class="group relative block w-[var(--hex)] aspect-[1/1.1547] no-underline [clip-path:polygon(50%_0,100%_25%,100%_75%,50%_100%,0_75%,0_25%)] bg-tgx14-cell transition duration-200 hover:scale-105 focus-visible:scale-105 focus-visible:outline-none motion-reduce:transition-none motion-reduce:hover:scale-100">
        <img src="https://images.unsplash.com/photo-1494790108377-be9c29b29330?w=260&h=300&q=80&auto=format&fit=crop" alt="" loading="lazy" class="absolute inset-0 w-full h-full object-cover [clip-path:polygon(50%_0,100%_25%,100%_75%,50%_100%,0_75%,0_25%)]">
        <span class="absolute inset-0 grid content-end gap-0.5 px-3 pb-4 bg-[linear-gradient(180deg,transparent_45%,oklch(0.18_0.03_65/0.9))] opacity-0 transition-opacity duration-200 group-hover:opacity-100 group-focus-visible:opacity-100 motion-reduce:transition-none"><strong class="text-[0.76rem] font-semibold text-white leading-tight">Ada N.</strong><span class="text-[0.62rem] text-tgx14-honey">Design lead</span></span>
      </a>
      <a href="#0" class="group relative block w-[var(--hex)] aspect-[1/1.1547] no-underline [clip-path:polygon(50%_0,100%_25%,100%_75%,50%_100%,0_75%,0_25%)] bg-tgx14-cell transition duration-200 hover:scale-105 focus-visible:scale-105 focus-visible:outline-none motion-reduce:transition-none motion-reduce:hover:scale-100">
        <img src="https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?w=260&h=300&q=80&auto=format&fit=crop" alt="" loading="lazy" class="absolute inset-0 w-full h-full object-cover [clip-path:polygon(50%_0,100%_25%,100%_75%,50%_100%,0_75%,0_25%)]">
        <span class="absolute inset-0 grid content-end gap-0.5 px-3 pb-4 bg-[linear-gradient(180deg,transparent_45%,oklch(0.18_0.03_65/0.9))] opacity-0 transition-opacity duration-200 group-hover:opacity-100 group-focus-visible:opacity-100 motion-reduce:transition-none"><strong class="text-[0.76rem] font-semibold text-white leading-tight">Tomás R.</strong><span class="text-[0.62rem] text-tgx14-honey">Engineering</span></span>
      </a>
      <a href="#0" class="group relative block w-[var(--hex)] aspect-[1/1.1547] no-underline [clip-path:polygon(50%_0,100%_25%,100%_75%,50%_100%,0_75%,0_25%)] bg-tgx14-cell transition duration-200 hover:scale-105 focus-visible:scale-105 focus-visible:outline-none motion-reduce:transition-none motion-reduce:hover:scale-100">
        <img src="https://images.unsplash.com/photo-1438761681033-6461ffad8d80?w=260&h=300&q=80&auto=format&fit=crop" alt="" loading="lazy" class="absolute inset-0 w-full h-full object-cover [clip-path:polygon(50%_0,100%_25%,100%_75%,50%_100%,0_75%,0_25%)]">
        <span class="absolute inset-0 grid content-end gap-0.5 px-3 pb-4 bg-[linear-gradient(180deg,transparent_45%,oklch(0.18_0.03_65/0.9))] opacity-0 transition-opacity duration-200 group-hover:opacity-100 group-focus-visible:opacity-100 motion-reduce:transition-none"><strong class="text-[0.76rem] font-semibold text-white leading-tight">Ines K.</strong><span class="text-[0.62rem] text-tgx14-honey">Research</span></span>
      </a>
      <a href="#0" class="group relative block w-[var(--hex)] aspect-[1/1.1547] no-underline [clip-path:polygon(50%_0,100%_25%,100%_75%,50%_100%,0_75%,0_25%)] bg-tgx14-cell transition duration-200 hover:scale-105 focus-visible:scale-105 focus-visible:outline-none motion-reduce:transition-none motion-reduce:hover:scale-100">
        <img src="https://images.unsplash.com/photo-1472099645785-5658abf4ff4e?w=260&h=300&q=80&auto=format&fit=crop" alt="" loading="lazy" class="absolute inset-0 w-full h-full object-cover [clip-path:polygon(50%_0,100%_25%,100%_75%,50%_100%,0_75%,0_25%)]">
        <span class="absolute inset-0 grid content-end gap-0.5 px-3 pb-4 bg-[linear-gradient(180deg,transparent_45%,oklch(0.18_0.03_65/0.9))] opacity-0 transition-opacity duration-200 group-hover:opacity-100 group-focus-visible:opacity-100 motion-reduce:transition-none"><strong class="text-[0.76rem] font-semibold text-white leading-tight">Sam B.</strong><span class="text-[0.62rem] text-tgx14-honey">Platform</span></span>
      </a>
    </li>
    <li class="flex gap-0 mt-[calc(var(--hex)*-0.3)] ml-[calc(var(--hex)/2)]">
      <a href="#0" class="group relative block w-[var(--hex)] aspect-[1/1.1547] no-underline [clip-path:polygon(50%_0,100%_25%,100%_75%,50%_100%,0_75%,0_25%)] bg-tgx14-cell transition duration-200 hover:scale-105 focus-visible:scale-105 focus-visible:outline-none motion-reduce:transition-none motion-reduce:hover:scale-100">
        <img src="https://images.unsplash.com/photo-1544005313-94ddf0286df2?w=260&h=300&q=80&auto=format&fit=crop" alt="" loading="lazy" class="absolute inset-0 w-full h-full object-cover [clip-path:polygon(50%_0,100%_25%,100%_75%,50%_100%,0_75%,0_25%)]">
        <span class="absolute inset-0 grid content-end gap-0.5 px-3 pb-4 bg-[linear-gradient(180deg,transparent_45%,oklch(0.18_0.03_65/0.9))] opacity-0 transition-opacity duration-200 group-hover:opacity-100 group-focus-visible:opacity-100 motion-reduce:transition-none"><strong class="text-[0.76rem] font-semibold text-white leading-tight">Noor A.</strong><span class="text-[0.62rem] text-tgx14-honey">Accessibility</span></span>
      </a>
      <a href="#0" class="group relative block w-[var(--hex)] aspect-[1/1.1547] no-underline [clip-path:polygon(50%_0,100%_25%,100%_75%,50%_100%,0_75%,0_25%)] bg-tgx14-cell transition duration-200 hover:scale-105 focus-visible:scale-105 focus-visible:outline-none motion-reduce:transition-none motion-reduce:hover:scale-100">
        <img src="https://images.unsplash.com/photo-1519085360753-af0119f7cbe7?w=260&h=300&q=80&auto=format&fit=crop" alt="" loading="lazy" class="absolute inset-0 w-full h-full object-cover [clip-path:polygon(50%_0,100%_25%,100%_75%,50%_100%,0_75%,0_25%)]">
        <span class="absolute inset-0 grid content-end gap-0.5 px-3 pb-4 bg-[linear-gradient(180deg,transparent_45%,oklch(0.18_0.03_65/0.9))] opacity-0 transition-opacity duration-200 group-hover:opacity-100 group-focus-visible:opacity-100 motion-reduce:transition-none"><strong class="text-[0.76rem] font-semibold text-white leading-tight">Jonas P.</strong><span class="text-[0.62rem] text-tgx14-honey">Performance</span></span>
      </a>
      <a href="#0" class="group relative block w-[var(--hex)] aspect-[1/1.1547] no-underline [clip-path:polygon(50%_0,100%_25%,100%_75%,50%_100%,0_75%,0_25%)] bg-tgx14-cell transition duration-200 hover:scale-105 focus-visible:scale-105 focus-visible:outline-none motion-reduce:transition-none motion-reduce:hover:scale-100">
        <img src="https://images.unsplash.com/photo-1524504388940-b1c1722653e1?w=260&h=300&q=80&auto=format&fit=crop" alt="" loading="lazy" class="absolute inset-0 w-full h-full object-cover [clip-path:polygon(50%_0,100%_25%,100%_75%,50%_100%,0_75%,0_25%)]">
        <span class="absolute inset-0 grid content-end gap-0.5 px-3 pb-4 bg-[linear-gradient(180deg,transparent_45%,oklch(0.18_0.03_65/0.9))] opacity-0 transition-opacity duration-200 group-hover:opacity-100 group-focus-visible:opacity-100 motion-reduce:transition-none"><strong class="text-[0.76rem] font-semibold text-white leading-tight">Mei L.</strong><span class="text-[0.62rem] text-tgx14-honey">Brand</span></span>
      </a>
    </li>
    <li class="flex gap-0 mt-[calc(var(--hex)*-0.3)]">
      <a href="#0" class="group relative block w-[var(--hex)] aspect-[1/1.1547] no-underline [clip-path:polygon(50%_0,100%_25%,100%_75%,50%_100%,0_75%,0_25%)] bg-tgx14-cell transition duration-200 hover:scale-105 focus-visible:scale-105 focus-visible:outline-none motion-reduce:transition-none motion-reduce:hover:scale-100">
        <img src="https://images.unsplash.com/photo-1534528741775-53994a69daeb?w=260&h=300&q=80&auto=format&fit=crop" alt="" loading="lazy" class="absolute inset-0 w-full h-full object-cover [clip-path:polygon(50%_0,100%_25%,100%_75%,50%_100%,0_75%,0_25%)]">
        <span class="absolute inset-0 grid content-end gap-0.5 px-3 pb-4 bg-[linear-gradient(180deg,transparent_45%,oklch(0.18_0.03_65/0.9))] opacity-0 transition-opacity duration-200 group-hover:opacity-100 group-focus-visible:opacity-100 motion-reduce:transition-none"><strong class="text-[0.76rem] font-semibold text-white leading-tight">Ruth O.</strong><span class="text-[0.62rem] text-tgx14-honey">Content</span></span>
      </a>
      <a href="#0" class="group relative block w-[var(--hex)] aspect-[1/1.1547] no-underline [clip-path:polygon(50%_0,100%_25%,100%_75%,50%_100%,0_75%,0_25%)] bg-tgx14-cell transition duration-200 hover:scale-105 focus-visible:scale-105 focus-visible:outline-none motion-reduce:transition-none motion-reduce:hover:scale-100">
        <img src="https://images.unsplash.com/photo-1487412720507-e7ab37603c6f?w=260&h=300&q=80&auto=format&fit=crop" alt="" loading="lazy" class="absolute inset-0 w-full h-full object-cover [clip-path:polygon(50%_0,100%_25%,100%_75%,50%_100%,0_75%,0_25%)]">
        <span class="absolute inset-0 grid content-end gap-0.5 px-3 pb-4 bg-[linear-gradient(180deg,transparent_45%,oklch(0.18_0.03_65/0.9))] opacity-0 transition-opacity duration-200 group-hover:opacity-100 group-focus-visible:opacity-100 motion-reduce:transition-none"><strong class="text-[0.76rem] font-semibold text-white leading-tight">Dev S.</strong><span class="text-[0.62rem] text-tgx14-honey">Data</span></span>
      </a>
      <a href="#0" class="group relative block w-[var(--hex)] aspect-[1/1.1547] no-underline [clip-path:polygon(50%_0,100%_25%,100%_75%,50%_100%,0_75%,0_25%)] bg-tgx14-cell transition duration-200 hover:scale-105 focus-visible:scale-105 focus-visible:outline-none motion-reduce:transition-none motion-reduce:hover:scale-100">
        <img src="https://images.unsplash.com/photo-1517841905240-472988babdf9?w=260&h=300&q=80&auto=format&fit=crop" alt="" loading="lazy" class="absolute inset-0 w-full h-full object-cover [clip-path:polygon(50%_0,100%_25%,100%_75%,50%_100%,0_75%,0_25%)]">
        <span class="absolute inset-0 grid content-end gap-0.5 px-3 pb-4 bg-[linear-gradient(180deg,transparent_45%,oklch(0.18_0.03_65/0.9))] opacity-0 transition-opacity duration-200 group-hover:opacity-100 group-focus-visible:opacity-100 motion-reduce:transition-none"><strong class="text-[0.76rem] font-semibold text-white leading-tight">Clara V.</strong><span class="text-[0.62rem] text-tgx14-honey">Ops</span></span>
      </a>
    </li>
  </ul>
</section>
@import "tailwindcss";

@theme {
  --color-tgx14-bg: #241a0f;
  --color-tgx14-bg: oklch(0.21 0.03 65);
  --color-tgx14-cell: #4a3a1c;
  --color-tgx14-cell: oklch(0.34 0.06 75);
  --color-tgx14-honey: #f0bd52;
  --color-tgx14-honey: oklch(0.82 0.15 80);
  --color-tgx14-dim: #cbbda6;
  --color-tgx14-dim: oklch(0.81 0.03 80);
  --font-tgx14-sans: 'Inter Tight', system-ui, sans-serif;
}

.tgx-14 {
  width: 100%;
  min-height: 100svh;
  --hex: 104px;
  background-image: radial-gradient(100% 120% at 50% 0%, oklch(0.28 0.05 70 / 0.9), transparent 60%);
}

Setup — do this once per project

Skip this if your project already runs Tailwind v4.

1Load Tailwind
<script src="https://cdn.jsdelivr.net/npm/@tailwindcss/browser@4"></script>

Compiles in the browser — perfect for a CodePen or a quick test, not for production.

2Add the stylesheetRequiredthe @theme block is what makes the custom utilities exist
@import "tailwindcss";

@theme {
  --color-tgx14-bg: #241a0f;
  --color-tgx14-bg: oklch(0.21 0.03 65);
  --color-tgx14-cell: #4a3a1c;
  --color-tgx14-cell: oklch(0.34 0.06 75);
  --color-tgx14-honey: #f0bd52;
  --color-tgx14-honey: oklch(0.82 0.15 80);
  --color-tgx14-dim: #cbbda6;
  --color-tgx14-dim: oklch(0.81 0.03 80);
  --font-tgx14-sans: 'Inter Tight', system-ui, sans-serif;
}

.tgx-14 {
  width: 100%;
  min-height: 100svh;
  --hex: 104px;
  background-image: radial-gradient(100% 120% at 50% 0%, oklch(0.28 0.05 70 / 0.9), transparent 60%);
}
3Fonts used by this demooptional — skip if you have your own type stack
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="preconnect" href="https://images.unsplash.com">
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter+Tight:wght@400;500;600;700&display=swap">

What changed in the port

Which parts became utilities, which stayed CSS, and why.

  • The portraits carry empty alt because the name is in the adjacent text — captioning a decorative crop twice is noise for a screen reader, and the link text is what matters.
  • Clipping the image with the same polygon as the cell (rather than relying on overflow-hidden) is what keeps the hex edges crisp when the tile scales on hover.
  • Product upgrade: abbreviation tiles (UI, UX, CSS) became a real team page with portraits, names and roles — and the hover state now reveals information instead of just changing colour.
Paste this into ChatGPT, Claude, Cursor, or any coding assistant. The block below is pre-framed with everything the AI needs to integrate this demo into your project — markup, styles, scoping notes, and the source URL. Hit Copy and paste straight into your chat.
Here's a working CSS demo from CodeFronts. Use it as-is or adapt to your framework. All classes are scoped under a unique prefix so the code won't collide with your existing styles. MIT licensed.
Demo: Tailwind Hexagon Team Grid with clip-path Avatars
Source: https://codefronts.com/layouts/tailwind-css-grid-layouts/tailwind-hexagon-team-grid-clip-path-avatars/

A team page as an interlocking honeycomb: ten hexagonal portraits that nest peak-into-notch, each revealing a name and role on hover or keyboard focus. The photo is clipped by the same polygon as the cell, so the comb stays a comb.
## HTML
```html
<section class="tgx-14 w-full min-h-svh bg-tgx14-bg font-tgx14-sans px-6 py-10 grid place-items-center gap-6">
  <header class="flex flex-col gap-1.5 text-center">
    <p class="text-[0.66rem] tracking-[0.2em] uppercase text-tgx14-honey">Hexlab · Studio</p>
    <h2 class="text-[1.5rem] font-semibold text-white tracking-[-0.015em]">Ten people, one comb</h2>
    <p class="text-[0.8rem] text-tgx14-dim max-w-[44ch]">Hover or tab through the team — each cell reveals a name and a role without moving its neighbours.</p>
  </header>
  <ul class="list-none flex flex-col items-start">
    <li class="flex gap-0">
      <a href="#0" class="group relative block w-[var(--hex)] aspect-[1/1.1547] no-underline [clip-path:polygon(50%_0,100%_25%,100%_75%,50%_100%,0_75%,0_25%)] bg-tgx14-cell transition duration-200 hover:scale-105 focus-visible:scale-105 focus-visible:outline-none motion-reduce:transition-none motion-reduce:hover:scale-100">
        <img src="https://images.unsplash.com/photo-1494790108377-be9c29b29330?w=260&h=300&q=80&auto=format&fit=crop" alt="" loading="lazy" class="absolute inset-0 w-full h-full object-cover [clip-path:polygon(50%_0,100%_25%,100%_75%,50%_100%,0_75%,0_25%)]">
        <span class="absolute inset-0 grid content-end gap-0.5 px-3 pb-4 bg-[linear-gradient(180deg,transparent_45%,oklch(0.18_0.03_65/0.9))] opacity-0 transition-opacity duration-200 group-hover:opacity-100 group-focus-visible:opacity-100 motion-reduce:transition-none"><strong class="text-[0.76rem] font-semibold text-white leading-tight">Ada N.</strong><span class="text-[0.62rem] text-tgx14-honey">Design lead</span></span>
      </a>
      <a href="#0" class="group relative block w-[var(--hex)] aspect-[1/1.1547] no-underline [clip-path:polygon(50%_0,100%_25%,100%_75%,50%_100%,0_75%,0_25%)] bg-tgx14-cell transition duration-200 hover:scale-105 focus-visible:scale-105 focus-visible:outline-none motion-reduce:transition-none motion-reduce:hover:scale-100">
        <img src="https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?w=260&h=300&q=80&auto=format&fit=crop" alt="" loading="lazy" class="absolute inset-0 w-full h-full object-cover [clip-path:polygon(50%_0,100%_25%,100%_75%,50%_100%,0_75%,0_25%)]">
        <span class="absolute inset-0 grid content-end gap-0.5 px-3 pb-4 bg-[linear-gradient(180deg,transparent_45%,oklch(0.18_0.03_65/0.9))] opacity-0 transition-opacity duration-200 group-hover:opacity-100 group-focus-visible:opacity-100 motion-reduce:transition-none"><strong class="text-[0.76rem] font-semibold text-white leading-tight">Tomás R.</strong><span class="text-[0.62rem] text-tgx14-honey">Engineering</span></span>
      </a>
      <a href="#0" class="group relative block w-[var(--hex)] aspect-[1/1.1547] no-underline [clip-path:polygon(50%_0,100%_25%,100%_75%,50%_100%,0_75%,0_25%)] bg-tgx14-cell transition duration-200 hover:scale-105 focus-visible:scale-105 focus-visible:outline-none motion-reduce:transition-none motion-reduce:hover:scale-100">
        <img src="https://images.unsplash.com/photo-1438761681033-6461ffad8d80?w=260&h=300&q=80&auto=format&fit=crop" alt="" loading="lazy" class="absolute inset-0 w-full h-full object-cover [clip-path:polygon(50%_0,100%_25%,100%_75%,50%_100%,0_75%,0_25%)]">
        <span class="absolute inset-0 grid content-end gap-0.5 px-3 pb-4 bg-[linear-gradient(180deg,transparent_45%,oklch(0.18_0.03_65/0.9))] opacity-0 transition-opacity duration-200 group-hover:opacity-100 group-focus-visible:opacity-100 motion-reduce:transition-none"><strong class="text-[0.76rem] font-semibold text-white leading-tight">Ines K.</strong><span class="text-[0.62rem] text-tgx14-honey">Research</span></span>
      </a>
      <a href="#0" class="group relative block w-[var(--hex)] aspect-[1/1.1547] no-underline [clip-path:polygon(50%_0,100%_25%,100%_75%,50%_100%,0_75%,0_25%)] bg-tgx14-cell transition duration-200 hover:scale-105 focus-visible:scale-105 focus-visible:outline-none motion-reduce:transition-none motion-reduce:hover:scale-100">
        <img src="https://images.unsplash.com/photo-1472099645785-5658abf4ff4e?w=260&h=300&q=80&auto=format&fit=crop" alt="" loading="lazy" class="absolute inset-0 w-full h-full object-cover [clip-path:polygon(50%_0,100%_25%,100%_75%,50%_100%,0_75%,0_25%)]">
        <span class="absolute inset-0 grid content-end gap-0.5 px-3 pb-4 bg-[linear-gradient(180deg,transparent_45%,oklch(0.18_0.03_65/0.9))] opacity-0 transition-opacity duration-200 group-hover:opacity-100 group-focus-visible:opacity-100 motion-reduce:transition-none"><strong class="text-[0.76rem] font-semibold text-white leading-tight">Sam B.</strong><span class="text-[0.62rem] text-tgx14-honey">Platform</span></span>
      </a>
    </li>
    <li class="flex gap-0 mt-[calc(var(--hex)*-0.3)] ml-[calc(var(--hex)/2)]">
      <a href="#0" class="group relative block w-[var(--hex)] aspect-[1/1.1547] no-underline [clip-path:polygon(50%_0,100%_25%,100%_75%,50%_100%,0_75%,0_25%)] bg-tgx14-cell transition duration-200 hover:scale-105 focus-visible:scale-105 focus-visible:outline-none motion-reduce:transition-none motion-reduce:hover:scale-100">
        <img src="https://images.unsplash.com/photo-1544005313-94ddf0286df2?w=260&h=300&q=80&auto=format&fit=crop" alt="" loading="lazy" class="absolute inset-0 w-full h-full object-cover [clip-path:polygon(50%_0,100%_25%,100%_75%,50%_100%,0_75%,0_25%)]">
        <span class="absolute inset-0 grid content-end gap-0.5 px-3 pb-4 bg-[linear-gradient(180deg,transparent_45%,oklch(0.18_0.03_65/0.9))] opacity-0 transition-opacity duration-200 group-hover:opacity-100 group-focus-visible:opacity-100 motion-reduce:transition-none"><strong class="text-[0.76rem] font-semibold text-white leading-tight">Noor A.</strong><span class="text-[0.62rem] text-tgx14-honey">Accessibility</span></span>
      </a>
      <a href="#0" class="group relative block w-[var(--hex)] aspect-[1/1.1547] no-underline [clip-path:polygon(50%_0,100%_25%,100%_75%,50%_100%,0_75%,0_25%)] bg-tgx14-cell transition duration-200 hover:scale-105 focus-visible:scale-105 focus-visible:outline-none motion-reduce:transition-none motion-reduce:hover:scale-100">
        <img src="https://images.unsplash.com/photo-1519085360753-af0119f7cbe7?w=260&h=300&q=80&auto=format&fit=crop" alt="" loading="lazy" class="absolute inset-0 w-full h-full object-cover [clip-path:polygon(50%_0,100%_25%,100%_75%,50%_100%,0_75%,0_25%)]">
        <span class="absolute inset-0 grid content-end gap-0.5 px-3 pb-4 bg-[linear-gradient(180deg,transparent_45%,oklch(0.18_0.03_65/0.9))] opacity-0 transition-opacity duration-200 group-hover:opacity-100 group-focus-visible:opacity-100 motion-reduce:transition-none"><strong class="text-[0.76rem] font-semibold text-white leading-tight">Jonas P.</strong><span class="text-[0.62rem] text-tgx14-honey">Performance</span></span>
      </a>
      <a href="#0" class="group relative block w-[var(--hex)] aspect-[1/1.1547] no-underline [clip-path:polygon(50%_0,100%_25%,100%_75%,50%_100%,0_75%,0_25%)] bg-tgx14-cell transition duration-200 hover:scale-105 focus-visible:scale-105 focus-visible:outline-none motion-reduce:transition-none motion-reduce:hover:scale-100">
        <img src="https://images.unsplash.com/photo-1524504388940-b1c1722653e1?w=260&h=300&q=80&auto=format&fit=crop" alt="" loading="lazy" class="absolute inset-0 w-full h-full object-cover [clip-path:polygon(50%_0,100%_25%,100%_75%,50%_100%,0_75%,0_25%)]">
        <span class="absolute inset-0 grid content-end gap-0.5 px-3 pb-4 bg-[linear-gradient(180deg,transparent_45%,oklch(0.18_0.03_65/0.9))] opacity-0 transition-opacity duration-200 group-hover:opacity-100 group-focus-visible:opacity-100 motion-reduce:transition-none"><strong class="text-[0.76rem] font-semibold text-white leading-tight">Mei L.</strong><span class="text-[0.62rem] text-tgx14-honey">Brand</span></span>
      </a>
    </li>
    <li class="flex gap-0 mt-[calc(var(--hex)*-0.3)]">
      <a href="#0" class="group relative block w-[var(--hex)] aspect-[1/1.1547] no-underline [clip-path:polygon(50%_0,100%_25%,100%_75%,50%_100%,0_75%,0_25%)] bg-tgx14-cell transition duration-200 hover:scale-105 focus-visible:scale-105 focus-visible:outline-none motion-reduce:transition-none motion-reduce:hover:scale-100">
        <img src="https://images.unsplash.com/photo-1534528741775-53994a69daeb?w=260&h=300&q=80&auto=format&fit=crop" alt="" loading="lazy" class="absolute inset-0 w-full h-full object-cover [clip-path:polygon(50%_0,100%_25%,100%_75%,50%_100%,0_75%,0_25%)]">
        <span class="absolute inset-0 grid content-end gap-0.5 px-3 pb-4 bg-[linear-gradient(180deg,transparent_45%,oklch(0.18_0.03_65/0.9))] opacity-0 transition-opacity duration-200 group-hover:opacity-100 group-focus-visible:opacity-100 motion-reduce:transition-none"><strong class="text-[0.76rem] font-semibold text-white leading-tight">Ruth O.</strong><span class="text-[0.62rem] text-tgx14-honey">Content</span></span>
      </a>
      <a href="#0" class="group relative block w-[var(--hex)] aspect-[1/1.1547] no-underline [clip-path:polygon(50%_0,100%_25%,100%_75%,50%_100%,0_75%,0_25%)] bg-tgx14-cell transition duration-200 hover:scale-105 focus-visible:scale-105 focus-visible:outline-none motion-reduce:transition-none motion-reduce:hover:scale-100">
        <img src="https://images.unsplash.com/photo-1487412720507-e7ab37603c6f?w=260&h=300&q=80&auto=format&fit=crop" alt="" loading="lazy" class="absolute inset-0 w-full h-full object-cover [clip-path:polygon(50%_0,100%_25%,100%_75%,50%_100%,0_75%,0_25%)]">
        <span class="absolute inset-0 grid content-end gap-0.5 px-3 pb-4 bg-[linear-gradient(180deg,transparent_45%,oklch(0.18_0.03_65/0.9))] opacity-0 transition-opacity duration-200 group-hover:opacity-100 group-focus-visible:opacity-100 motion-reduce:transition-none"><strong class="text-[0.76rem] font-semibold text-white leading-tight">Dev S.</strong><span class="text-[0.62rem] text-tgx14-honey">Data</span></span>
      </a>
      <a href="#0" class="group relative block w-[var(--hex)] aspect-[1/1.1547] no-underline [clip-path:polygon(50%_0,100%_25%,100%_75%,50%_100%,0_75%,0_25%)] bg-tgx14-cell transition duration-200 hover:scale-105 focus-visible:scale-105 focus-visible:outline-none motion-reduce:transition-none motion-reduce:hover:scale-100">
        <img src="https://images.unsplash.com/photo-1517841905240-472988babdf9?w=260&h=300&q=80&auto=format&fit=crop" alt="" loading="lazy" class="absolute inset-0 w-full h-full object-cover [clip-path:polygon(50%_0,100%_25%,100%_75%,50%_100%,0_75%,0_25%)]">
        <span class="absolute inset-0 grid content-end gap-0.5 px-3 pb-4 bg-[linear-gradient(180deg,transparent_45%,oklch(0.18_0.03_65/0.9))] opacity-0 transition-opacity duration-200 group-hover:opacity-100 group-focus-visible:opacity-100 motion-reduce:transition-none"><strong class="text-[0.76rem] font-semibold text-white leading-tight">Clara V.</strong><span class="text-[0.62rem] text-tgx14-honey">Ops</span></span>
      </a>
    </li>
  </ul>
</section>
```
## CSS
```css
@import "tailwindcss";

@theme {
  --color-tgx14-bg: #241a0f;
  --color-tgx14-bg: oklch(0.21 0.03 65);
  --color-tgx14-cell: #4a3a1c;
  --color-tgx14-cell: oklch(0.34 0.06 75);
  --color-tgx14-honey: #f0bd52;
  --color-tgx14-honey: oklch(0.82 0.15 80);
  --color-tgx14-dim: #cbbda6;
  --color-tgx14-dim: oklch(0.81 0.03 80);
  --font-tgx14-sans: 'Inter Tight', system-ui, sans-serif;
}

.tgx-14 {
  width: 100%;
  min-height: 100svh;
  --hex: 104px;
  background-image: radial-gradient(100% 120% at 50% 0%, oklch(0.28 0.05 70 / 0.9), transparent 60%);
}
```

How this works

Rows are flex, the comb is flex. Each visual row is its own container, which is how a 4-3-3 arrangement works where one grid template cannot. Rows after the first pull up 30% of hex width; alternate rows shift half a hex sideways so peaks land in the notches above.

The avatar is clipped twice. Cell and image share the polygon, so the portrait fills the hex exactly and object-cover keeps faces centred at any crop.

Make it yours

  • Resize the whole comb through --hex; every calculation derives from it.
  • Swap the overlay tint per department for a colour-coded org chart.
  • Add rows by adding a row <li>; offset rows just add the half-hex margin utility.

Gotchas — read before shipping

  • clip-path clips the focus ring — the overlay + scale IS the focus indicator here.
  • Rows must share a left edge (items-start), or auto-centring fights the offset and the middle row drifts.
  • Uniform tile size is mandatory; one different hex breaks the interlock instantly.

Browser support

ChromeSafariFirefoxEdge
111+16.4+128+111+

clip-path polygons universal since 2020, aspect-ratio since 2021.

Techniques used in this demo

Arbitraryneeds bracket syntax

Search CodeFronts

Loading…