jhey ʕ•ᴥ•ʔ's banner
jhey ʕ•ᴥ•ʔ's profile picture

jhey ʕ•ᴥ•ʔ

@jh3yy • 147,809 subscribers

designing interfaces. engineering experiences. many can build it. few can explain it. @shopify brand design studio 💎 ex @google @vercel

Shorts

reminder: ease your gradients ✨ crisper details, softer fades adds a subtle bit of polish to overlays, masks, etc. same endpoints, extra eased stops in between 🧑‍🍳

reminder: ease your gradients ✨ crisper details, softer fades adds a subtle bit of polish to overlays, masks, etc. same endpoints, extra eased stops in between 🧑‍🍳

251,935 Aufrufe

one does not simply reveal a password 👁️

one does not simply reveal a password 👁️

197,087 Aufrufe

magnetic bento hover effect w/ css anchor positioning .bento { li:hover article { anchor-name: --a; } .indicator { position-anchor: --a; inset: anchor(inside); transition: inset var(--dur) var(--ease); } }

magnetic bento hover effect w/ css anchor positioning .bento { li:hover article { anchor-name: --a; } .indicator { position-anchor: --a; inset: anchor(inside); transition: inset var(--dur) var(--ease); } }

85,921 Aufrufe

slop grenade™

slop grenade™

122,634 Aufrufe

this progressive blur effect interaction for the new iphone over on apple's site is pretty neat

this progressive blur effect interaction for the new iphone over on apple's site is pretty neat

153,228 Aufrufe

this could've jus' been a checkbox, but they added a slider with a little friction at either end that reflects the physical behavior tiny details, thoughtfully considered

this could've jus' been a checkbox, but they added a slider with a little friction at either end that reflects the physical behavior tiny details, thoughtfully considered

94,945 Aufrufe

`field-sizing: content` lets you autosize textareas in css but what if you want the height to transition instead of snap? wrap it and sync the wrapper height with a ResizeObserver ↓

`field-sizing: content` lets you autosize textareas in css but what if you want the height to transition instead of snap? wrap it and sync the wrapper height with a ResizeObserver ↓

41,562 Aufrufe

you will learn a lot about animation by scrubbing things frame-by-frame make it a habit for example ↓ notice how apple transitions the lines in and out differently there's usually a reason 🤙

you will learn a lot about animation by scrubbing things frame-by-frame make it a habit for example ↓ notice how apple transitions the lines in and out differently there's usually a reason 🤙

224,554 Aufrufe

one way: clip-path: shape() in css single element, draw outline, scoop corner no stitched-together pieces/mask gymnastics 🧙

one way: clip-path: shape() in css single element, draw outline, scoop corner no stitched-together pieces/mask gymnastics 🧙

101,755 Aufrufe

if you’re dynamically masking a scroll container with css, consider leaving room for the scrollbar instead of masking it too 🧑‍🍳 mask-repeat: no-repeat; mask-size: calc(100% - 10px) 100px;

if you’re dynamically masking a scroll container with css, consider leaving room for the scrollbar instead of masking it too 🧑‍🍳 mask-repeat: no-repeat; mask-size: calc(100% - 10px) 100px;

213,001 Aufrufe

one way w/ css 🪄 stack an image 2x filter 1st, unclip 2nd on :hover 🤙 a img { grid-area: 1 / 1; } img:first-of-type { filter: grayscale(1) invert(1); } img:last-of-type { clip-path: circle(0); transition: clip-path; } a:hover img:last-of-type { clip-path: circle(100%); }

one way w/ css 🪄 stack an image 2x filter 1st, unclip 2nd on :hover 🤙 a img { grid-area: 1 / 1; } img:first-of-type { filter: grayscale(1) invert(1); } img:last-of-type { clip-path: circle(0); transition: clip-path; } a:hover img:last-of-type { clip-path: circle(100%); }

326,445 Aufrufe

if you build animated interfaces for the web, this is essential reading a clear, practical look at the main thread and the real cost of animation in javascript and css the difference isn't just measurable, it's something you feel ↓ 🔗

if you build animated interfaces for the web, this is essential reading a clear, practical look at the main thread and the real cost of animation in javascript and css the difference isn't just measurable, it's something you feel ↓ 🔗

46,709 Aufrufe

this is a good keyboard gonna hack the led matrix to show agent status 🧑‍🍳

this is a good keyboard gonna hack the led matrix to show agent status 🧑‍🍳

37,362 Aufrufe

had some requests for the code and a better angle of the folding shader in action 🤙 - ⌃⌘L to toggle - re-anchors on stop - pin + blur tidied uses the macbook lid angle sensor, combined with screencapturekit and a metal shader repo w/ app →

had some requests for the code and a better angle of the folding shader in action 🤙 - ⌃⌘L to toggle - re-anchors on stop - pin + blur tidied uses the macbook lid angle sensor, combined with screencapturekit and a metal shader repo w/ app →

44,365 Aufrufe

you can totally do it with css 🧑‍🍳 use a border mask, layers + overflow: hidden, or other tricks skip animating the gradient though, jus' spin a 1:1 gradient layer 🤙

you can totally do it with css 🧑‍🍳 use a border mask, layers + overflow: hidden, or other tricks skip animating the gradient though, jus' spin a 1:1 gradient layer 🤙

286,798 Aufrufe

turn it to eleven 🔊 gesture enhanced input[type=range]

turn it to eleven 🔊 gesture enhanced input[type=range]

23,662 Aufrufe

turned the lights down and played with the shader a little 🔥👁️🔥

turned the lights down and played with the shader a little 🔥👁️🔥

36,049 Aufrufe

Parallax cards with masked blurs 😷 Tweak that CSS until you get something you're happy with 🤙

Parallax cards with masked blurs 😷 Tweak that CSS until you get something you're happy with 🤙

583,216 Aufrufe

using css pow() you can create runtime-configurable fluid typography that responds to viewport or container size 😉 for example, "minimum of 14px at 375px and scale to maximum 24px at 1500px" all powered by pow() and custom properties

using css pow() you can create runtime-configurable fluid typography that responds to viewport or container size 😉 for example, "minimum of 14px at 375px and scale to maximum 24px at 1500px" all powered by pow() and custom properties

118,288 Aufrufe

css trick for the "shine" border 🧑‍🍳 take a pseudoelement position + give it an inset box-shadow mask it off at an angle with a linear-gradient 🤙 bonus: use corner-shape: squircle + rotate on pointer move

css trick for the "shine" border 🧑‍🍳 take a pseudoelement position + give it an inset box-shadow mask it off at an angle with a linear-gradient 🤙 bonus: use corner-shape: squircle + rotate on pointer move

200,156 Aufrufe

Videos

jh3yy's profile picture

trans<form>er

jhey ʕ•ᴥ•ʔ

81,878 Aufrufe • vor 18 Tagen

jh3yy's profile picture

loading=lazy 🧑‍🎨

jhey ʕ•ᴥ•ʔ

54,184 Aufrufe • vor 24 Tagen

jh3yy's profile picture

/effort 🧠⚡

jhey ʕ•ᴥ•ʔ

20,665 Aufrufe • vor 11 Tagen

jh3yy's profile picture

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,180,786 Aufrufe • vor 2 Jahren