Blog

Thoughts on code, design, and creativity

COMING SOON

January 15, 2026

The Art of Micro-Interactions

How small animations and subtle feedback can dramatically improve user experience and engagement in modern web applications.

UX Animation CSS

January 8, 2026

Building Performant WebGL Experiences

Techniques for optimizing 3D graphics in the browser without sacrificing visual quality or user experience.

WebGL Three.js Performance

December 28, 2025

Modern CSS Techniques I Use Daily

Exploring the latest CSS features like Container Queries, :has() selector, and CSS Grid that have transformed my workflow.

CSS Frontend Tips

December 15, 2025

From Figma to Code: My Workflow

A detailed look at my process for turning design files into clean, maintainable, and pixel-perfect code.

Workflow Figma Development
Back to articles

The Art of Micro-Interactions

In the world of web design, it's often the smallest details that make the biggest impact. Micro-interactions — those tiny animations and feedback moments — can transform a good user interface into a great one.

What Are Micro-Interactions?

Micro-interactions are contained product moments that accomplish a single task. They're the subtle animations when you hover over a button, the satisfying feedback when you complete a form, or the gentle shake when you enter an invalid password.

These small moments serve several crucial purposes:

  • Provide immediate feedback to user actions
  • Guide users through the interface
  • Communicate system status
  • Add personality and delight to the experience

The Psychology Behind It

Humans are wired to respond to movement and change. When an interface element moves or transforms in response to our actions, it creates a sense of direct manipulation — we feel more connected to the digital environment.

This connection isn't just aesthetic; it's functional. Studies show that well-designed micro-interactions can reduce user errors, increase completion rates, and improve overall satisfaction with a product.

Implementation Tips

When implementing micro-interactions, keep these principles in mind:

  • Keep them fast — most should be under 300ms
  • Make them purposeful — every animation should serve a function
  • Be consistent — similar actions should have similar feedback
  • Respect user preferences — always honor reduced motion settings

The best micro-interactions are the ones users don't consciously notice but would definitely miss if they were gone. They're the invisible threads that weave together a cohesive, delightful experience.

Back to articles

Building Performant WebGL Experiences

WebGL opens up incredible possibilities for creating immersive 3D experiences in the browser. But with great power comes great responsibility — especially when it comes to performance.

Understanding the Render Pipeline

Before optimizing, it's crucial to understand how WebGL renders content. The GPU processes vertices, applies shaders, and outputs pixels to the screen. Each step in this pipeline can become a bottleneck if not handled carefully.

Key Optimization Strategies

Here are the techniques I use to keep my WebGL projects running smoothly:

  • Geometry instancing for repeated objects
  • Level of detail (LOD) systems for complex scenes
  • Texture atlasing to reduce draw calls
  • Object pooling to minimize garbage collection
  • Frustum culling to skip off-screen objects

Measuring Performance

You can't optimize what you don't measure. I rely on browser developer tools, Three.js stats panels, and custom performance monitors to identify bottlenecks. The key metrics to watch are frame rate, draw calls, and memory usage.

Mobile Considerations

Mobile devices have less GPU power and thermal constraints. For mobile WebGL, I typically reduce polygon counts, simplify shaders, and implement aggressive LOD systems. Sometimes the best optimization is knowing when to fall back to a simpler 2D experience.

Remember: a smooth 30fps experience is always better than a stuttering 60fps one. Target consistency over peak performance.

Back to articles

Modern CSS Techniques I Use Daily

CSS has evolved dramatically in recent years. Features that once required JavaScript or complex workarounds are now possible with pure CSS. Here are the modern techniques I use in every project.

Container Queries

Container queries allow components to respond to their container's size rather than the viewport. This is a game-changer for creating truly reusable components.

@container (min-width: 400px) {
  .card {
    display: grid;
    grid-template-columns: 1fr 2fr;
  }
}

The :has() Selector

Often called the "parent selector," :has() lets you style elements based on their contents. This opens up possibilities we've wanted for years.

/* Style a card differently if it contains an image */
.card:has(img) {
  padding: 0;
}

/* Style labels when their input is focused */
label:has(+ input:focus) {
  color: var(--accent);
}

CSS Nesting

Native CSS nesting means we can write more organized, readable stylesheets without a preprocessor:

.nav {
  background: var(--bg);

  & a {
    color: var(--text);

    &:hover {
      color: var(--accent);
    }
  }
}

Subgrid

Subgrid allows nested grids to align with their parent grid tracks. This makes complex layouts much easier to maintain and keeps everything perfectly aligned.

These features aren't the future — they're the present. Browser support is excellent, and they're ready for production use today.

Back to articles

From Figma to Code: My Workflow

The gap between design and development has never been smaller. Here's my process for transforming Figma designs into clean, maintainable code.

Step 1: Analyze the Design System

Before writing any code, I spend time understanding the design system. I identify:

  • Color palette and their semantic meanings
  • Typography scale and font combinations
  • Spacing system (is it 4px, 8px based?)
  • Component patterns and their variants
  • Animation and interaction guidelines

Step 2: Set Up CSS Variables

I translate the design tokens into CSS custom properties. This creates a single source of truth and makes the design system programmatically accessible.

Step 3: Build Components Bottom-Up

I start with the smallest atomic components — buttons, inputs, badges — and work my way up to larger organisms. Each component is built in isolation before being composed into pages.

Step 4: Responsive Refinement

With the desktop version complete, I work on responsive behavior. I prefer to adjust the existing CSS rather than writing entirely new rules for each breakpoint.

Step 5: Animation Polish

Finally, I add micro-interactions and transitions. These are often underspecified in design files, so I collaborate closely with designers to ensure the motion feels right.

The key to a smooth handoff is communication. Regular check-ins with the design team catch issues early and result in a better final product.