30 / 30
All 30 in 30 Tailwind CSS Grid Layouts
- 01Tailwind Full-Bleed Article Layout for Long-Form Editorial
- 02Tailwind Docs Layout with Sticky Table of Contents
- 03Tailwind Photo Gallery Grid with auto-fill and Real Images
- 04Tailwind Holy Grail Page Layout for a News Site
- 05Tailwind Data Table with Subgrid Rows and Status Pills
- 06Tailwind Overlapping Card Hero for a Case Study
- 07Tailwind Help Center Layout with Fixed Sidebars
- 08Tailwind 12 Column Grid System for Marketing Pages
- 09Tailwind Bento Grid for a Product Feature Section
- 10Tailwind Magazine Spread Layout with Overlapping Headline
- 11Tailwind Responsive Card Grid for an Integrations Directory
- 12Tailwind CMS Category Grid that Compacts Itself with has()
- 13Tailwind Masonry Layout for a Saved Ideas Board
- 14Tailwind Hexagon Team Grid with clip-path Avatars
- 15Tailwind Subgrid Cards with Perfectly Aligned Buttons
- 16Tailwind Analytics Dashboard Layout with Grid App Shell
- 17Tailwind Pricing Table with Subgrid and a Featured Plan
- 18Tailwind Kanban Board with Scroll Snap Columns
- 19Tailwind Video Thumbnail Grid with Zero Layout Shift
- 20Tailwind Container Query Card for Reusable Article Teasers
- 21Tailwind Diagonal Section Band with skewY Counter-Skew
- 22Tailwind Asymmetric Poster Hero with Layered Grid Regions
- 23Tailwind Mosaic Photo Wall with a Designed Span Sequence
- 24Tailwind Dense Grid Packing for a Mixed-Size Asset Library
- 25Tailwind Onboarding Stepper with CSS Counters
- 26Tailwind macOS Window Layout with Vibrancy Sidebar
- 27Tailwind Scroll Snap Carousel with Peeking Slides
- 28Tailwind Status Map UI with Grid Coordinate Pins
- 29Tailwind Logo Wall with 1px Gap Hairline Dividers
- 30Tailwind Periodic Table Layout with Grid Coordinates
Tailwind Periodic Table Layout with Grid Coordinates
The final boss of grid placement: a real 18-column periodic table where hydrogen sits at 1/1, helium jumps to column 18 and the d-block gap appears because elements are PLACED, not flowed. Two explicit placements per period draw the whole silhouette.
Untitled UI Pro: 5,000+ React + Tailwind CSS v4 components · from $349 one-time
Untitled UI React · Affiliate link
The code
<section class="tgx-30 w-full min-h-svh bg-tgx30-bg font-tgx30-sans p-6">
<header class="flex items-end justify-between gap-4 flex-wrap mb-4">
<div class="flex flex-col gap-1">
<p class="text-[0.66rem] tracking-[0.18em] uppercase text-tgx30-note">Elements · reference</p>
<h2 class="text-[1.25rem] font-semibold text-white tracking-[-0.01em]">Periods 1–4</h2>
</div>
<ul class="list-none flex gap-3 flex-wrap text-[0.7rem] text-tgx30-note m-0 p-0">
<li class="flex items-center gap-1.5"><span class="size-2 rounded-[3px] bg-[oklch(0.75_0.16_25)]"></span>Alkali</li>
<li class="flex items-center gap-1.5"><span class="size-2 rounded-[3px] bg-[oklch(0.78_0.14_150)]"></span>Nonmetal</li>
<li class="flex items-center gap-1.5"><span class="size-2 rounded-[3px] bg-[oklch(0.78_0.1_240)]"></span>Transition</li>
<li class="flex items-center gap-1.5"><span class="size-2 rounded-[3px] bg-[oklch(0.78_0.12_300)]"></span>Noble gas</li>
</ul>
</header>
<div class="overflow-x-auto pb-2">
<div role="group" aria-label="Periodic table, periods 1 to 4 sample" class="grid grid-cols-18 gap-1 min-w-[640px] *:aspect-[1/1.3] *:grid *:grid-rows-[auto_1fr_auto] *:px-1 *:py-[3px] *:rounded-md *:cursor-pointer *:border *:transition *:duration-200">
<button type="button" style="--c:oklch(0.78 0.14 150)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">1</i><b class="text-[0.78rem] leading-none text-white place-self-center">H</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">hydrogen</span></button>
<button type="button" style="--c:oklch(0.78 0.12 300)" class="col-start-18 bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">2</i><b class="text-[0.78rem] leading-none text-white place-self-center">He</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">helium</span></button>
<button type="button" style="--c:oklch(0.75 0.16 25)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">3</i><b class="text-[0.78rem] leading-none text-white place-self-center">Li</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">lithium</span></button>
<button type="button" style="--c:oklch(0.8 0.13 85)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">4</i><b class="text-[0.78rem] leading-none text-white place-self-center">Be</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">beryllium</span></button>
<button type="button" style="--c:oklch(0.76 0.12 200)" class="col-start-13 bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">5</i><b class="text-[0.78rem] leading-none text-white place-self-center">B</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">boron</span></button>
<button type="button" style="--c:oklch(0.78 0.14 150)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">6</i><b class="text-[0.78rem] leading-none text-white place-self-center">C</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">carbon</span></button>
<button type="button" style="--c:oklch(0.78 0.14 150)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">7</i><b class="text-[0.78rem] leading-none text-white place-self-center">N</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">nitrogen</span></button>
<button type="button" style="--c:oklch(0.78 0.14 150)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">8</i><b class="text-[0.78rem] leading-none text-white place-self-center">O</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">oxygen</span></button>
<button type="button" style="--c:oklch(0.74 0.15 350)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">9</i><b class="text-[0.78rem] leading-none text-white place-self-center">F</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">fluorine</span></button>
<button type="button" style="--c:oklch(0.78 0.12 300)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">10</i><b class="text-[0.78rem] leading-none text-white place-self-center">Ne</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">neon</span></button>
<button type="button" style="--c:oklch(0.75 0.16 25)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">11</i><b class="text-[0.78rem] leading-none text-white place-self-center">Na</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">sodium</span></button>
<button type="button" style="--c:oklch(0.8 0.13 85)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">12</i><b class="text-[0.78rem] leading-none text-white place-self-center">Mg</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">magnesium</span></button>
<button type="button" style="--c:oklch(0.76 0.12 200)" class="col-start-13 bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">13</i><b class="text-[0.78rem] leading-none text-white place-self-center">Al</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">aluminium</span></button>
<button type="button" style="--c:oklch(0.76 0.12 200)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">14</i><b class="text-[0.78rem] leading-none text-white place-self-center">Si</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">silicon</span></button>
<button type="button" style="--c:oklch(0.78 0.14 150)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">15</i><b class="text-[0.78rem] leading-none text-white place-self-center">P</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">phosphorus</span></button>
<button type="button" style="--c:oklch(0.78 0.14 150)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">16</i><b class="text-[0.78rem] leading-none text-white place-self-center">S</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">sulfur</span></button>
<button type="button" style="--c:oklch(0.74 0.15 350)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">17</i><b class="text-[0.78rem] leading-none text-white place-self-center">Cl</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">chlorine</span></button>
<button type="button" style="--c:oklch(0.78 0.12 300)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">18</i><b class="text-[0.78rem] leading-none text-white place-self-center">Ar</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">argon</span></button>
<button type="button" style="--c:oklch(0.75 0.16 25)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">19</i><b class="text-[0.78rem] leading-none text-white place-self-center">K</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">potassium</span></button>
<button type="button" style="--c:oklch(0.8 0.13 85)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">20</i><b class="text-[0.78rem] leading-none text-white place-self-center">Ca</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">calcium</span></button>
<button type="button" style="--c:oklch(0.78 0.1 240)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">21</i><b class="text-[0.78rem] leading-none text-white place-self-center">Sc</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">scandium</span></button>
<button type="button" style="--c:oklch(0.78 0.1 240)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">22</i><b class="text-[0.78rem] leading-none text-white place-self-center">Ti</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">titanium</span></button>
<button type="button" style="--c:oklch(0.78 0.1 240)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">23</i><b class="text-[0.78rem] leading-none text-white place-self-center">V</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">vanadium</span></button>
<button type="button" style="--c:oklch(0.78 0.1 240)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">24</i><b class="text-[0.78rem] leading-none text-white place-self-center">Cr</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">chromium</span></button>
<button type="button" style="--c:oklch(0.78 0.1 240)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">25</i><b class="text-[0.78rem] leading-none text-white place-self-center">Mn</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">manganese</span></button>
<button type="button" style="--c:oklch(0.78 0.1 240)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">26</i><b class="text-[0.78rem] leading-none text-white place-self-center">Fe</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">iron</span></button>
</div>
</div>
<p class="text-[0.72rem] text-tgx30-note mt-3">Helium and boron/aluminium are the only placed elements — <code class="text-white">col-start-18</code> and <code class="text-white">col-start-13</code>. Auto-flow draws the rest of the silhouette.</p>
</section><section class="tgx-30 w-full min-h-svh bg-tgx30-bg font-tgx30-sans p-6">
<header class="flex items-end justify-between gap-4 flex-wrap mb-4">
<div class="flex flex-col gap-1">
<p class="text-[0.66rem] tracking-[0.18em] uppercase text-tgx30-note">Elements · reference</p>
<h2 class="text-[1.25rem] font-semibold text-white tracking-[-0.01em]">Periods 1–4</h2>
</div>
<ul class="list-none flex gap-3 flex-wrap text-[0.7rem] text-tgx30-note m-0 p-0">
<li class="flex items-center gap-1.5"><span class="size-2 rounded-[3px] bg-[oklch(0.75_0.16_25)]"></span>Alkali</li>
<li class="flex items-center gap-1.5"><span class="size-2 rounded-[3px] bg-[oklch(0.78_0.14_150)]"></span>Nonmetal</li>
<li class="flex items-center gap-1.5"><span class="size-2 rounded-[3px] bg-[oklch(0.78_0.1_240)]"></span>Transition</li>
<li class="flex items-center gap-1.5"><span class="size-2 rounded-[3px] bg-[oklch(0.78_0.12_300)]"></span>Noble gas</li>
</ul>
</header>
<div class="overflow-x-auto pb-2">
<div role="group" aria-label="Periodic table, periods 1 to 4 sample" class="grid grid-cols-18 gap-1 min-w-[640px] *:aspect-[1/1.3] *:grid *:grid-rows-[auto_1fr_auto] *:px-1 *:py-[3px] *:rounded-md *:cursor-pointer *:border *:transition *:duration-200">
<button type="button" style="--c:oklch(0.78 0.14 150)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">1</i><b class="text-[0.78rem] leading-none text-white place-self-center">H</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">hydrogen</span></button>
<button type="button" style="--c:oklch(0.78 0.12 300)" class="col-start-18 bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">2</i><b class="text-[0.78rem] leading-none text-white place-self-center">He</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">helium</span></button>
<button type="button" style="--c:oklch(0.75 0.16 25)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">3</i><b class="text-[0.78rem] leading-none text-white place-self-center">Li</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">lithium</span></button>
<button type="button" style="--c:oklch(0.8 0.13 85)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">4</i><b class="text-[0.78rem] leading-none text-white place-self-center">Be</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">beryllium</span></button>
<button type="button" style="--c:oklch(0.76 0.12 200)" class="col-start-13 bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">5</i><b class="text-[0.78rem] leading-none text-white place-self-center">B</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">boron</span></button>
<button type="button" style="--c:oklch(0.78 0.14 150)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">6</i><b class="text-[0.78rem] leading-none text-white place-self-center">C</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">carbon</span></button>
<button type="button" style="--c:oklch(0.78 0.14 150)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">7</i><b class="text-[0.78rem] leading-none text-white place-self-center">N</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">nitrogen</span></button>
<button type="button" style="--c:oklch(0.78 0.14 150)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">8</i><b class="text-[0.78rem] leading-none text-white place-self-center">O</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">oxygen</span></button>
<button type="button" style="--c:oklch(0.74 0.15 350)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">9</i><b class="text-[0.78rem] leading-none text-white place-self-center">F</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">fluorine</span></button>
<button type="button" style="--c:oklch(0.78 0.12 300)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">10</i><b class="text-[0.78rem] leading-none text-white place-self-center">Ne</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">neon</span></button>
<button type="button" style="--c:oklch(0.75 0.16 25)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">11</i><b class="text-[0.78rem] leading-none text-white place-self-center">Na</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">sodium</span></button>
<button type="button" style="--c:oklch(0.8 0.13 85)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">12</i><b class="text-[0.78rem] leading-none text-white place-self-center">Mg</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">magnesium</span></button>
<button type="button" style="--c:oklch(0.76 0.12 200)" class="col-start-13 bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">13</i><b class="text-[0.78rem] leading-none text-white place-self-center">Al</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">aluminium</span></button>
<button type="button" style="--c:oklch(0.76 0.12 200)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">14</i><b class="text-[0.78rem] leading-none text-white place-self-center">Si</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">silicon</span></button>
<button type="button" style="--c:oklch(0.78 0.14 150)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">15</i><b class="text-[0.78rem] leading-none text-white place-self-center">P</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">phosphorus</span></button>
<button type="button" style="--c:oklch(0.78 0.14 150)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">16</i><b class="text-[0.78rem] leading-none text-white place-self-center">S</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">sulfur</span></button>
<button type="button" style="--c:oklch(0.74 0.15 350)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">17</i><b class="text-[0.78rem] leading-none text-white place-self-center">Cl</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">chlorine</span></button>
<button type="button" style="--c:oklch(0.78 0.12 300)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">18</i><b class="text-[0.78rem] leading-none text-white place-self-center">Ar</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">argon</span></button>
<button type="button" style="--c:oklch(0.75 0.16 25)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">19</i><b class="text-[0.78rem] leading-none text-white place-self-center">K</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">potassium</span></button>
<button type="button" style="--c:oklch(0.8 0.13 85)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">20</i><b class="text-[0.78rem] leading-none text-white place-self-center">Ca</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">calcium</span></button>
<button type="button" style="--c:oklch(0.78 0.1 240)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">21</i><b class="text-[0.78rem] leading-none text-white place-self-center">Sc</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">scandium</span></button>
<button type="button" style="--c:oklch(0.78 0.1 240)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">22</i><b class="text-[0.78rem] leading-none text-white place-self-center">Ti</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">titanium</span></button>
<button type="button" style="--c:oklch(0.78 0.1 240)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">23</i><b class="text-[0.78rem] leading-none text-white place-self-center">V</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">vanadium</span></button>
<button type="button" style="--c:oklch(0.78 0.1 240)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">24</i><b class="text-[0.78rem] leading-none text-white place-self-center">Cr</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">chromium</span></button>
<button type="button" style="--c:oklch(0.78 0.1 240)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">25</i><b class="text-[0.78rem] leading-none text-white place-self-center">Mn</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">manganese</span></button>
<button type="button" style="--c:oklch(0.78 0.1 240)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">26</i><b class="text-[0.78rem] leading-none text-white place-self-center">Fe</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">iron</span></button>
</div>
</div>
<p class="text-[0.72rem] text-tgx30-note mt-3">Helium and boron/aluminium are the only placed elements — <code class="text-white">col-start-18</code> and <code class="text-white">col-start-13</code>. Auto-flow draws the rest of the silhouette.</p>
</section>@import "tailwindcss";
@theme {
--color-tgx30-bg: #171a21;
--color-tgx30-bg: oklch(0.19 0.015 260);
--color-tgx30-note: #a4abb8;
--color-tgx30-note: oklch(0.74 0.015 260);
--font-tgx30-sans: 'Inter Tight', system-ui, sans-serif;
}
.tgx-30 {
width: 100%;
min-height: 100svh;
}@import "tailwindcss";
@theme {
--color-tgx30-bg: #171a21;
--color-tgx30-bg: oklch(0.19 0.015 260);
--color-tgx30-note: #a4abb8;
--color-tgx30-note: oklch(0.74 0.015 260);
--font-tgx30-sans: 'Inter Tight', system-ui, sans-serif;
}
.tgx-30 {
width: 100%;
min-height: 100svh;
}Setup — do this once per project
Skip this if your project already runs Tailwind v4.
<script src="https://cdn.jsdelivr.net/npm/@tailwindcss/browser@4"></script>
<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.
npm install tailwindcss @tailwindcss/vite
npm install tailwindcss @tailwindcss/vite// vite.config.js ("type": "module" in package.json)
import { defineConfig } from 'vite'
import tailwindcss from '@tailwindcss/vite'
export default defineConfig({
plugins: [tailwindcss()],
})// vite.config.js ("type": "module" in package.json)
import { defineConfig } from 'vite'
import tailwindcss from '@tailwindcss/vite'
export default defineConfig({
plugins: [tailwindcss()],
})Any v4 setup works — Vite, PostCSS or the CLI. Nothing in this demo is bundler-specific.
@import "tailwindcss";
@theme {
--color-tgx30-bg: #171a21;
--color-tgx30-bg: oklch(0.19 0.015 260);
--color-tgx30-note: #a4abb8;
--color-tgx30-note: oklch(0.74 0.015 260);
--font-tgx30-sans: 'Inter Tight', system-ui, sans-serif;
}
.tgx-30 {
width: 100%;
min-height: 100svh;
}@import "tailwindcss";
@theme {
--color-tgx30-bg: #171a21;
--color-tgx30-bg: oklch(0.19 0.015 260);
--color-tgx30-note: #a4abb8;
--color-tgx30-note: oklch(0.74 0.015 260);
--font-tgx30-sans: 'Inter Tight', system-ui, sans-serif;
}
.tgx-30 {
width: 100%;
min-height: 100svh;
}<link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter+Tight:wght@400;500;700&display=swap">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter+Tight:wght@400;500;700&display=swap">What changed in the port
Which parts became utilities, which stayed CSS, and why.
- A category legend above the table is what takes this from colour-coded decoration to an accessible reference: hue plus label, per WCAG 1.4.1.
grid-cols-18works because v4 generates column counts on demand — the one place in the collection where an unusual track count needs no arbitrary value.- Product upgrade: the table gained a header, a four-category legend and a caption naming the two placements that do all the work; tiles use
leading-noneand a 1/1.3 ratio so number, symbol and element name all fit at 18 columns.
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 Periodic Table Layout with Grid Coordinates
Source: https://codefronts.com/layouts/tailwind-css-grid-layouts/tailwind-periodic-table-layout-grid-coordinates/
The final boss of grid placement: a real 18-column periodic table where hydrogen sits at 1/1, helium jumps to column 18 and the d-block gap appears because elements are PLACED, not flowed. Two explicit placements per period draw the whole silhouette.
## HTML
```html
<section class="tgx-30 w-full min-h-svh bg-tgx30-bg font-tgx30-sans p-6">
<header class="flex items-end justify-between gap-4 flex-wrap mb-4">
<div class="flex flex-col gap-1">
<p class="text-[0.66rem] tracking-[0.18em] uppercase text-tgx30-note">Elements · reference</p>
<h2 class="text-[1.25rem] font-semibold text-white tracking-[-0.01em]">Periods 1–4</h2>
</div>
<ul class="list-none flex gap-3 flex-wrap text-[0.7rem] text-tgx30-note m-0 p-0">
<li class="flex items-center gap-1.5"><span class="size-2 rounded-[3px] bg-[oklch(0.75_0.16_25)]"></span>Alkali</li>
<li class="flex items-center gap-1.5"><span class="size-2 rounded-[3px] bg-[oklch(0.78_0.14_150)]"></span>Nonmetal</li>
<li class="flex items-center gap-1.5"><span class="size-2 rounded-[3px] bg-[oklch(0.78_0.1_240)]"></span>Transition</li>
<li class="flex items-center gap-1.5"><span class="size-2 rounded-[3px] bg-[oklch(0.78_0.12_300)]"></span>Noble gas</li>
</ul>
</header>
<div class="overflow-x-auto pb-2">
<div role="group" aria-label="Periodic table, periods 1 to 4 sample" class="grid grid-cols-18 gap-1 min-w-[640px] *:aspect-[1/1.3] *:grid *:grid-rows-[auto_1fr_auto] *:px-1 *:py-[3px] *:rounded-md *:cursor-pointer *:border *:transition *:duration-200">
<button type="button" style="--c:oklch(0.78 0.14 150)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">1</i><b class="text-[0.78rem] leading-none text-white place-self-center">H</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">hydrogen</span></button>
<button type="button" style="--c:oklch(0.78 0.12 300)" class="col-start-18 bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">2</i><b class="text-[0.78rem] leading-none text-white place-self-center">He</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">helium</span></button>
<button type="button" style="--c:oklch(0.75 0.16 25)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">3</i><b class="text-[0.78rem] leading-none text-white place-self-center">Li</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">lithium</span></button>
<button type="button" style="--c:oklch(0.8 0.13 85)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">4</i><b class="text-[0.78rem] leading-none text-white place-self-center">Be</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">beryllium</span></button>
<button type="button" style="--c:oklch(0.76 0.12 200)" class="col-start-13 bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">5</i><b class="text-[0.78rem] leading-none text-white place-self-center">B</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">boron</span></button>
<button type="button" style="--c:oklch(0.78 0.14 150)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">6</i><b class="text-[0.78rem] leading-none text-white place-self-center">C</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">carbon</span></button>
<button type="button" style="--c:oklch(0.78 0.14 150)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">7</i><b class="text-[0.78rem] leading-none text-white place-self-center">N</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">nitrogen</span></button>
<button type="button" style="--c:oklch(0.78 0.14 150)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">8</i><b class="text-[0.78rem] leading-none text-white place-self-center">O</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">oxygen</span></button>
<button type="button" style="--c:oklch(0.74 0.15 350)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">9</i><b class="text-[0.78rem] leading-none text-white place-self-center">F</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">fluorine</span></button>
<button type="button" style="--c:oklch(0.78 0.12 300)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">10</i><b class="text-[0.78rem] leading-none text-white place-self-center">Ne</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">neon</span></button>
<button type="button" style="--c:oklch(0.75 0.16 25)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">11</i><b class="text-[0.78rem] leading-none text-white place-self-center">Na</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">sodium</span></button>
<button type="button" style="--c:oklch(0.8 0.13 85)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">12</i><b class="text-[0.78rem] leading-none text-white place-self-center">Mg</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">magnesium</span></button>
<button type="button" style="--c:oklch(0.76 0.12 200)" class="col-start-13 bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">13</i><b class="text-[0.78rem] leading-none text-white place-self-center">Al</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">aluminium</span></button>
<button type="button" style="--c:oklch(0.76 0.12 200)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">14</i><b class="text-[0.78rem] leading-none text-white place-self-center">Si</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">silicon</span></button>
<button type="button" style="--c:oklch(0.78 0.14 150)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">15</i><b class="text-[0.78rem] leading-none text-white place-self-center">P</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">phosphorus</span></button>
<button type="button" style="--c:oklch(0.78 0.14 150)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">16</i><b class="text-[0.78rem] leading-none text-white place-self-center">S</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">sulfur</span></button>
<button type="button" style="--c:oklch(0.74 0.15 350)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">17</i><b class="text-[0.78rem] leading-none text-white place-self-center">Cl</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">chlorine</span></button>
<button type="button" style="--c:oklch(0.78 0.12 300)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">18</i><b class="text-[0.78rem] leading-none text-white place-self-center">Ar</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">argon</span></button>
<button type="button" style="--c:oklch(0.75 0.16 25)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">19</i><b class="text-[0.78rem] leading-none text-white place-self-center">K</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">potassium</span></button>
<button type="button" style="--c:oklch(0.8 0.13 85)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">20</i><b class="text-[0.78rem] leading-none text-white place-self-center">Ca</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">calcium</span></button>
<button type="button" style="--c:oklch(0.78 0.1 240)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">21</i><b class="text-[0.78rem] leading-none text-white place-self-center">Sc</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">scandium</span></button>
<button type="button" style="--c:oklch(0.78 0.1 240)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">22</i><b class="text-[0.78rem] leading-none text-white place-self-center">Ti</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">titanium</span></button>
<button type="button" style="--c:oklch(0.78 0.1 240)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">23</i><b class="text-[0.78rem] leading-none text-white place-self-center">V</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">vanadium</span></button>
<button type="button" style="--c:oklch(0.78 0.1 240)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">24</i><b class="text-[0.78rem] leading-none text-white place-self-center">Cr</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">chromium</span></button>
<button type="button" style="--c:oklch(0.78 0.1 240)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">25</i><b class="text-[0.78rem] leading-none text-white place-self-center">Mn</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">manganese</span></button>
<button type="button" style="--c:oklch(0.78 0.1 240)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">26</i><b class="text-[0.78rem] leading-none text-white place-self-center">Fe</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">iron</span></button>
</div>
</div>
<p class="text-[0.72rem] text-tgx30-note mt-3">Helium and boron/aluminium are the only placed elements — <code class="text-white">col-start-18</code> and <code class="text-white">col-start-13</code>. Auto-flow draws the rest of the silhouette.</p>
</section>
```
## CSS
```css
@import "tailwindcss";
@theme {
--color-tgx30-bg: #171a21;
--color-tgx30-bg: oklch(0.19 0.015 260);
--color-tgx30-note: #a4abb8;
--color-tgx30-note: oklch(0.74 0.015 260);
--font-tgx30-sans: 'Inter Tight', system-ui, sans-serif;
}
.tgx-30 {
width: 100%;
min-height: 100svh;
}
```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 Periodic Table Layout with Grid Coordinates
Source: https://codefronts.com/layouts/tailwind-css-grid-layouts/tailwind-periodic-table-layout-grid-coordinates/
The final boss of grid placement: a real 18-column periodic table where hydrogen sits at 1/1, helium jumps to column 18 and the d-block gap appears because elements are PLACED, not flowed. Two explicit placements per period draw the whole silhouette.
## HTML
```html
<section class="tgx-30 w-full min-h-svh bg-tgx30-bg font-tgx30-sans p-6">
<header class="flex items-end justify-between gap-4 flex-wrap mb-4">
<div class="flex flex-col gap-1">
<p class="text-[0.66rem] tracking-[0.18em] uppercase text-tgx30-note">Elements · reference</p>
<h2 class="text-[1.25rem] font-semibold text-white tracking-[-0.01em]">Periods 1–4</h2>
</div>
<ul class="list-none flex gap-3 flex-wrap text-[0.7rem] text-tgx30-note m-0 p-0">
<li class="flex items-center gap-1.5"><span class="size-2 rounded-[3px] bg-[oklch(0.75_0.16_25)]"></span>Alkali</li>
<li class="flex items-center gap-1.5"><span class="size-2 rounded-[3px] bg-[oklch(0.78_0.14_150)]"></span>Nonmetal</li>
<li class="flex items-center gap-1.5"><span class="size-2 rounded-[3px] bg-[oklch(0.78_0.1_240)]"></span>Transition</li>
<li class="flex items-center gap-1.5"><span class="size-2 rounded-[3px] bg-[oklch(0.78_0.12_300)]"></span>Noble gas</li>
</ul>
</header>
<div class="overflow-x-auto pb-2">
<div role="group" aria-label="Periodic table, periods 1 to 4 sample" class="grid grid-cols-18 gap-1 min-w-[640px] *:aspect-[1/1.3] *:grid *:grid-rows-[auto_1fr_auto] *:px-1 *:py-[3px] *:rounded-md *:cursor-pointer *:border *:transition *:duration-200">
<button type="button" style="--c:oklch(0.78 0.14 150)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">1</i><b class="text-[0.78rem] leading-none text-white place-self-center">H</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">hydrogen</span></button>
<button type="button" style="--c:oklch(0.78 0.12 300)" class="col-start-18 bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">2</i><b class="text-[0.78rem] leading-none text-white place-self-center">He</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">helium</span></button>
<button type="button" style="--c:oklch(0.75 0.16 25)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">3</i><b class="text-[0.78rem] leading-none text-white place-self-center">Li</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">lithium</span></button>
<button type="button" style="--c:oklch(0.8 0.13 85)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">4</i><b class="text-[0.78rem] leading-none text-white place-self-center">Be</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">beryllium</span></button>
<button type="button" style="--c:oklch(0.76 0.12 200)" class="col-start-13 bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">5</i><b class="text-[0.78rem] leading-none text-white place-self-center">B</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">boron</span></button>
<button type="button" style="--c:oklch(0.78 0.14 150)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">6</i><b class="text-[0.78rem] leading-none text-white place-self-center">C</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">carbon</span></button>
<button type="button" style="--c:oklch(0.78 0.14 150)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">7</i><b class="text-[0.78rem] leading-none text-white place-self-center">N</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">nitrogen</span></button>
<button type="button" style="--c:oklch(0.78 0.14 150)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">8</i><b class="text-[0.78rem] leading-none text-white place-self-center">O</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">oxygen</span></button>
<button type="button" style="--c:oklch(0.74 0.15 350)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">9</i><b class="text-[0.78rem] leading-none text-white place-self-center">F</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">fluorine</span></button>
<button type="button" style="--c:oklch(0.78 0.12 300)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">10</i><b class="text-[0.78rem] leading-none text-white place-self-center">Ne</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">neon</span></button>
<button type="button" style="--c:oklch(0.75 0.16 25)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">11</i><b class="text-[0.78rem] leading-none text-white place-self-center">Na</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">sodium</span></button>
<button type="button" style="--c:oklch(0.8 0.13 85)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">12</i><b class="text-[0.78rem] leading-none text-white place-self-center">Mg</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">magnesium</span></button>
<button type="button" style="--c:oklch(0.76 0.12 200)" class="col-start-13 bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">13</i><b class="text-[0.78rem] leading-none text-white place-self-center">Al</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">aluminium</span></button>
<button type="button" style="--c:oklch(0.76 0.12 200)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">14</i><b class="text-[0.78rem] leading-none text-white place-self-center">Si</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">silicon</span></button>
<button type="button" style="--c:oklch(0.78 0.14 150)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">15</i><b class="text-[0.78rem] leading-none text-white place-self-center">P</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">phosphorus</span></button>
<button type="button" style="--c:oklch(0.78 0.14 150)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">16</i><b class="text-[0.78rem] leading-none text-white place-self-center">S</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">sulfur</span></button>
<button type="button" style="--c:oklch(0.74 0.15 350)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">17</i><b class="text-[0.78rem] leading-none text-white place-self-center">Cl</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">chlorine</span></button>
<button type="button" style="--c:oklch(0.78 0.12 300)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">18</i><b class="text-[0.78rem] leading-none text-white place-self-center">Ar</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">argon</span></button>
<button type="button" style="--c:oklch(0.75 0.16 25)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">19</i><b class="text-[0.78rem] leading-none text-white place-self-center">K</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">potassium</span></button>
<button type="button" style="--c:oklch(0.8 0.13 85)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">20</i><b class="text-[0.78rem] leading-none text-white place-self-center">Ca</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">calcium</span></button>
<button type="button" style="--c:oklch(0.78 0.1 240)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">21</i><b class="text-[0.78rem] leading-none text-white place-self-center">Sc</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">scandium</span></button>
<button type="button" style="--c:oklch(0.78 0.1 240)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">22</i><b class="text-[0.78rem] leading-none text-white place-self-center">Ti</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">titanium</span></button>
<button type="button" style="--c:oklch(0.78 0.1 240)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">23</i><b class="text-[0.78rem] leading-none text-white place-self-center">V</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">vanadium</span></button>
<button type="button" style="--c:oklch(0.78 0.1 240)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">24</i><b class="text-[0.78rem] leading-none text-white place-self-center">Cr</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">chromium</span></button>
<button type="button" style="--c:oklch(0.78 0.1 240)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">25</i><b class="text-[0.78rem] leading-none text-white place-self-center">Mn</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">manganese</span></button>
<button type="button" style="--c:oklch(0.78 0.1 240)" class="bg-[color-mix(in_oklab,var(--c)_20%,var(--color-tgx30-bg))] border-[color-mix(in_oklab,var(--c)_45%,var(--color-tgx30-bg))] hover:bg-[color-mix(in_oklab,var(--c)_34%,var(--color-tgx30-bg))] hover:-translate-y-0.5 focus-visible:outline-2 focus-visible:outline-[var(--c)] focus-visible:outline-offset-2 motion-reduce:transition-none motion-reduce:hover:translate-y-0"><i class="not-italic text-[0.5rem] leading-none justify-self-start tabular-nums text-[color-mix(in_oklab,var(--c)_80%,white)]">26</i><b class="text-[0.78rem] leading-none text-white place-self-center">Fe</b><span class="text-[0.42rem] leading-[1.1] tracking-[0.02em] justify-self-center truncate max-w-full text-[color-mix(in_oklab,var(--c)_70%,white)]">iron</span></button>
</div>
</div>
<p class="text-[0.72rem] text-tgx30-note mt-3">Helium and boron/aluminium are the only placed elements — <code class="text-white">col-start-18</code> and <code class="text-white">col-start-13</code>. Auto-flow draws the rest of the silhouette.</p>
</section>
```
## CSS
```css
@import "tailwindcss";
@theme {
--color-tgx30-bg: #171a21;
--color-tgx30-bg: oklch(0.19 0.015 260);
--color-tgx30-note: #a4abb8;
--color-tgx30-note: oklch(0.74 0.015 260);
--font-tgx30-sans: 'Inter Tight', system-ui, sans-serif;
}
.tgx-30 {
width: 100%;
min-height: 100svh;
}
```How this works
The auto-placement cursor never backtracks. Order the HTML by atomic number, place helium at 18 and boron at 13, and every other element flows into the right cell.
Each tile is a nested grid — number top-left, symbol centred, name below — the same mini-grid discipline as the dashboard rail rows, at a much smaller scale.
Make it yours
- Complete the table with the same two-placements-per-period recipe through period 7.
- Category filter with
has-[:checked]on a legend checkbox — still no JavaScript. - Element pickers: drop the name line and shrink the tiles into a mini-map.
Gotchas — read before shipping
- Auto-placement moves FORWARD only; scramble the HTML order and elements pile into wrong periods.
- 18 columns need a scroll container below ~560px rather than crushed cells.
- Do not encode category by colour alone — pair the hue with the legend and the element name.
Browser support
| Chrome | Safari | Firefox | Edge |
|---|---|---|---|
| 111+ | 16.4+ | 128+ | 111+ |
Pure coordinate placement; color-mix theming needs 2023 evergreens.