PG Gonni

Design Engineer based in Montréal, QC

CurrentlyHead of Design at Tato
PreviouslyHead of Design at Planned
Design Engineer at Metafy
Product Designer at Metalab.

UI Experiments
Writing
Courses

Profile menu

motion
useMeasure
Base UI
tailwind
react

I wanted to improve upon our profile menu at Tato. When I joined, it was a standard shadcn/ui dropdown, the one that ships with the sidebar component. While the original dropdown did its job, I wanted to build something with a bit more flair. Inspired by liquid glass's shifting forms, I wanted to create something that felt fluid and part of a single morphin surface.

I've also been using Base UI more frequently over Radix, and I've been loving the interface and the DX improvements the creators have made. In particular, I really love the render function which provides easy access to properties and state of the component.

Dynamic island

motion
Motion+ Ticker
useMeasure
tailwind
react

Click the island or swipe down with two fingers to smoothly expand it. You can interact with the media controls within there. Leave the island to smoothly collapse it.
Note: This behaves awkwardly on the home page because the two finger gesture is also a scroll.


A media player interface inspired by Alcove, a clean and beautiful little app to add Dynamic Island like funcitonality to your Mac's notch. It also uses Motion+ Ticker to animate the podcast title with a smoothly masked marquee.

Transaction status button

motion
layout
tailwind
react

Based on Family by Benji TaylorIn my first attempt the text had a "jelly" effect, particularly when animating between the "Analyzing" and "Success" states.
Thankfully I had recently read about how Motion's "magic" layout property works, which made it clear that this was caused by the text trying to transform from one string to the next.
The fix was simply to add a unique key to the text for each state, which ensures only the button magically transforms between states, while the label simply translates on the x axis and fades in and out.

Detachable island

motion
useDragControls
useMeasure
tailwind
react

Drag the island outside of the container to detach it. Let go before detaching to snap back.
Turn on debug to view the drag constraints and drag handle affordance.


I've been infatuated with islands, as they provide a great, malleable surface.
They allow AI to live in a layer above the rest of the application, making them ideal for ever present, omnipotent agents.
In this case, I wanted to experiment with a draggable island, snapping, and morphing.

In Rauno's course Devouring Details I also learned the importance of ergonomic affordances, so the drag handle uses after:content-[''] to increase its draggable area.

Vertical icon switch

motion
clip-path
useTransform
tailwind
react

Based on this Threads postby Ozan Öztaskiran.The original example was a more typical switch, with a checkmark icon that moves up and down based on the selection.
I left a comment suggesting that the switch use a specific icon for each direction for added clarity.
I also wanted to use this as an opportunity to make use of clip-path, which I learned about in one of the earlier modules of Emil Kowalski's Animations for the Web, while also trying to learn to use Motion's useTransform function.
Finally, I decided to animate the icons when the state switches, which added complexity to the code but also a nice little flair.While I like the final effect, I'm not super happy with all the magic numbers I'm using to make the clip-path move smoothly between the two states.