
jhey ʕ•ᴥ•ʔ
@jh3yy • 146,040 subscribers
designing interfaces. engineering experiences. many can build it. few can explain it. @shopify brand design studio 💎 playbook waitlist → https://t.co/DtDQ0KB5hQ
Shorts
Videos

product spotlight cards 🔦 w/ depth map lighting + css scroll tricks
jhey ʕ•ᴥ•ʔ132,805 views • 23 days ago

had to try CSS filter + SVG glass displacement on webcam input – crank saturation for cheap gold ✨
jhey ʕ•ᴥ•ʔ782,437 views • 11 months ago

responsive CSS pinned sidebar transition 📌 .layout:has(:popover-open) { grid-template-columns: var(--sidebar-width) 1fr; } aside:popover-open { translate: 0 var(--ctrl); height: var(--extend); } actual zero JS for the layout transition here so many details to play with! 🧑🍳
jhey ʕ•ᴥ•ʔ386,131 views • 7 months ago

CSS card parallax with pointermove + custom props 🧑🍳 <div class=ring style="--i: 2"> .ring { translate: calc(var(--px) * (var(--i) * -2rem)) calc(var(--py) * (var(--i) * 2rem)); } trick: pointer mapping to rotate card in 3D + translate rings 2D for the illusion 🤙 check it 👇
jhey ʕ•ᴥ•ʔ305,162 views • 6 months ago

CSS Tip! 🤙 You can use mask-composite and some JavaScript to create this pointer proximity following glow border ✨ .glow { mask-composite: intersect; mask-clip: padding-box, border-box; mask: linear-gradient(#0000, #0000), conic-gradient(#0000 0deg, #fff, #0000 45deg); } The trick is to mask a background-image with a combination of mask layers. mask-composite: intersect; means the mask used will be the intersection of the layers 🔥 use source-in, xor; in browsers that don't support intersect; In this demo, you can use pseudoelements and rely on scoped custom properties to do a lot of the heavy lifting for you 🙌 Once you've masked the background, you need to update the starting angle of the conic-gradient on pointermove 👆 You can work that out by getting the center point of each card and then calculating the angle between that and the pointer with Math.atan2 🤓 let ANGLE = Math.atan2( event?.y - CARD_CENTER[1], event?.x - CARD_CENTER[0] ) * 180 / Math.PI ANGLE = ANGLE < 0 ? ANGLE + 360 : ANGLE; CARD.style.setProperty('--start', ANGLE + 90) You plug that into your conic-gradient mask as a custom property accounting for --spread ⚡️ conic-gradient(from calc((var(--angle) - (var(--spread) * 0.5)) * 1deg), #000 0deg, #fff, #0000 calc(var(--spread) * 1deg)); To get the blur, you apply a blur to the glow container on each card 🤙 .glows { filter: blur(calc(var(--blur) * 1px); } That's it! Layers of masks that are clipped and composited before being blurred 😎 The added trick is to fade each one in when the pointer is in the defined proximity of the card. For example, don't show unless within 100px of a card. You can see that in the video. Check out the JavaScript code for that 🫶 Couldn't resist making this one 😁 CodePen.IO link below! 👇
jhey ʕ•ᴥ•ʔ1,179,179 views • 2 years ago

easing is everything use different CSS timing functions per axis for custom motion paths 👨🍳 .p { animation: x .8s var(--x-time), y .8s var(--y-time); animation-composition: accumulate; } @keyframes x { to { translate: var(--x) 0 } @keyframes y { to { translate: 0 var(--y) }
jhey ʕ•ᴥ•ʔ270,277 views • 7 months ago

you can do this one with css grid, position: sticky, and some scroll animation 👨🍳
jhey ʕ•ᴥ•ʔ206,779 views • 6 months ago

What if the scrollbar went around the corner? 👀 CSS could do that ✨
jhey ʕ•ᴥ•ʔ846,813 views • 2 years ago