Skip to contentLudovic Li
Ready to relocate

Ludovic Li · Frontend Engineer · Paris

I build interfaces that work for everyone, in every language.

Element
Heading level 1
Typeface
Font size
Contrast

Every detail on this page can be measured.

Design systems, booking flows and content tools at Perfectstay, shipped in 13 languages, right to left included.

See the projects

Projects

Recreated previews, no real data.

  1. Booking flow

    Search filters that never make you wait

    Result: 7 times faster filtering page freeze cut from 5.8 s to 0.76 s

    A rebuild of the search filters on airline holiday sites, where the search drives the bookings.

    1. Native fieldset and legend, checkboxes accessible by keyboard and screen readers.
    2. In-house calculations replace immfacet and produce these counts.
    3. Lazy loading: offers load as you scroll, instead of all at once.
  2. Design system

    A design system, built with the designers

    Result: minus 50% QA feedback tickets between 2024 and 2026

    One component library shared by design and code: launched with the whole design team, documented in Storybook, with the core migrated to TypeScript and CSS Modules.

    1. Colour, type and spacing decided once, shared by design and code.
    2. Components typed with TypeScript and CSS Modules.
    3. Every component documented in Storybook.
  3. Accessibility, RTL

    Components that read both ways

    Result: 13languages Arabic included

    One component base for every site: full keyboard navigation, reduced motion support and Arabic layouts.

    1. Logical properties flip the layout, with no second stylesheet.
    2. The arrow follows the reading direction.
    3. Radix UI primitives, full keyboard navigation in both directions.
  4. Experimentation

    Pay in instalments, tested on real traffic

    Result: plus 8% conversion over 3 months

    Built the pay-in-instalments display, A/B tested in a team of 3 designers and 4 developers.

    1. The current version is the control.
    2. The variant shows pay in instalments.
    3. The numbers decide, not taste.
  5. Performance

    A carousel that keeps up with you

    Result: 6 out of 6 clicks registered vs 1/6 before, when browsing fast

    A full rewrite of the image carousel: no more ignored clicks, animated position dots, and keyboard navigation.

    1. Every click counts: the old one ignored any landing during its 300 ms animation.
    2. Position dots that shrink at the edges, instead of being cut off while moving.
    3. Real, named buttons you can use with a keyboard, instead of plain <div>s.

About

I care about the details people notice without naming: a filter that answers instantly, a site that works as well with a keyboard as with a mouse, a layout that holds in every language.

Lately I’ve been building with AI agents like Claude Code: time saved, standards raised.

Away from the keyboard

  • Running, including the Paris Marathon
  • Singing pop and R&B
  • Cooking, with a class taken in Japan
  • Skiing in Les Deux Alpes
  • Hiking through the mountain rice terraces of Vietnam