Frozen Grid Corner
Data grid frozen on both axes at once — the header row sticks to the top, the metric column sticks to the left, and the corner cell carries both offsets with a higher stacking order so it never slips under either.
- lines of CSS
- 58lines of CSS
- dependencies
- 0dependencies
- baseline browsers
- Newlybaseline browsers
- no motion at all
- Noneno motion at all
Vue, Svelte, styled-components and Tailwind exports are part of Pro. HTML, CSS and React are free forever.
.fx-v14-sc-frozen-15900 {
width: 254px;
height: 146px;
overflow: auto;
border-radius: 0.55rem;
background: #0f1626;
border: 1px solid #253049;
font-family: system-ui, sans-serif;
scrollbar-width: thin;
scrollbar-color: #38bdf8 rgba(148,163,184,0.14);
}
.fx-v14-sc-frozen-15900::-webkit-scrollbar { width: 6px; height: 6px; }
.fx-v14-sc-frozen-15900::-webkit-scrollbar-thumb { background: #38bdf8; border-radius: 3px; }
.fx-v14-sc-frozen-15900::-webkit-scrollbar-track { background: rgba(148,163,184,0.14); }
.fx-v14-sc-frozen-15900 .gr {
display: grid;
grid-template-columns: 74px repeat(5, 62px);
width: max-content;
}
.fx-v14-sc-frozen-15900 .ce {
height: 26px;
padding: 0 0.5rem;
display: flex;
align-items: center;
font-size: 0.6rem;
color: #cbd5e1;
font-variant-numeric: tabular-nums;
border-bottom: 1px solid #1a2437;
white-space: nowrap;
}
.fx-v14-sc-frozen-15900 .hd {
position: sticky;
top: 0;
z-index: 2;
font-weight: 600;
color: #7dd3fc;
background: #16223c;
box-shadow: 0 1px 0 #2c3a58;
}
.fx-v14-sc-frozen-15900 .lb {
position: sticky;
left: 0;
z-index: 1;
font-weight: 600;
color: #e2e8f0;
background: #131d33;
box-shadow: 1px 0 0 #2c3a58;
}
.fx-v14-sc-frozen-15900 .cn {
position: sticky;
top: 0;
left: 0;
z-index: 3;
font-weight: 600;
color: #7dd3fc;
background: #1b2a49;
box-shadow: 1px 0 0 #2c3a58, 0 1px 0 #2c3a58;
}<div class="fx-v14-sc-frozen-15900">
<div class="gr">
<div class="ce cn">Metric</div>
<div class="ce hd">Jan</div>
<div class="ce hd">Feb</div>
<div class="ce hd">Mar</div>
<div class="ce hd">Apr</div>
<div class="ce hd">May</div>
<div class="ce lb">Sessions</div>
<div class="ce">137</div>
<div class="ce">178</div>
<div class="ce">219</div>
<div class="ce">260</div>
<div class="ce">301</div>
<div class="ce lb">Signups</div>
<div class="ce">274</div>
<div class="ce">315</div>
<div class="ce">356</div>
<div class="ce">397</div>
<div class="ce">438</div>
<div class="ce lb">Trials</div>
<div class="ce">411</div>
<div class="ce">452</div>
<div class="ce">493</div>
<div class="ce">534</div>
<div class="ce">575</div>
<div class="ce lb">Paid</div>
<div class="ce">548</div>
<div class="ce">589</div>
<div class="ce">630</div>
<div class="ce">671</div>
<div class="ce">712</div>
<div class="ce lb">Churn</div>
<div class="ce">685</div>
<div class="ce">726</div>
<div class="ce">767</div>
<div class="ce">808</div>
<div class="ce">849</div>
<div class="ce lb">MRR</div>
<div class="ce">822</div>
<div class="ce">863</div>
<div class="ce">904</div>
<div class="ce">945</div>
<div class="ce">986</div>
<div class="ce lb">Refunds</div>
<div class="ce">959</div>
<div class="ce">1000</div>
<div class="ce">1041</div>
<div class="ce">1082</div>
<div class="ce">1123</div>
<div class="ce lb">Tickets</div>
<div class="ce">1096</div>
<div class="ce">1137</div>
<div class="ce">1178</div>
<div class="ce">1219</div>
<div class="ce">1260</div>
</div>
</div>What do I do with this?
- Put
frozen-grid-corner-15901.cssanywhere your page already loads CSS from — in Next.js that isapp/globals.css, or any stylesheet with a<link>in your HTML. - Then put the class on the element you want it on:
<button class="fx-v14-sc-frozen-15900">. The CSS does nothing until a class name in it matches something on the page.
- Link the stylesheet, then paste the markup wherever you need it.
npx hoverlab add frozen-grid-corner-15901What's included
- The markup and the stylesheet, in whichever framework you pick
- No runtime dependencies
Works with
- React
- Vue
- Svelte
- Tailwind
- styled-components
- Plain CSS
npx hoverlab add frozen-grid-corner-15901
Or over MCP, from your editor's agent — no account needed.
License
Free to read, copy and install, for personal and non-commercial projects. Shipping it in client work or a paid product needs Pro ($79 once). The source lands in your repo and stops being ours — no attribution, nothing to upgrade.
Motion safety
Static estimate, read from the CSS
- Reduced motion
- Nothing animates
No animation or transition, so there is nothing to switch off.
- What it animates
- Nothing
No property is animated.
- Flashing (WCAG 2.3.1)
- No flashing found
No repeating change in opacity, colour or brightness large enough to count as a flash.
- Layout shift (CLS)
- No shift expected
Nothing it animates moves or resizes the box in flow. A category from the CSS, not a measurement for this effect.
Every row is read from the shipped CSS. Only a figure marked measured came from a browser. Customizing the speed changes the timing, so recheck a customized copy. How it is computed
30 more effects in Scroll & Sticky
All of them free to read, copy and install — no account, no locked tiles, no watermarked preview. The whole catalog is open, and so are the API and the CLI.
Browse Scroll & StickyShipping one commercially
Copying the code is free. Putting it in client work or a paid product is what Pro is for — the licence, not the access.
- A commercial licence for everything in the catalog
- Unlimited bundle exports, in Vue, Svelte and Tailwind
- One payment — no subscription, nothing to renew
7 variations of Frozen Grid Corner
Finished looks, each one a position in the customizer above. Copy any of them, or open it and keep moving the sliders.