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.
Projects
Recreated previews, no real data.
Booking flow
Search filters that never make you wait
Star rating
1,007 offers
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.
- Native fieldset and legend, checkboxes accessible by keyboard and screen readers.
- In-house calculations replace immfacet and produce these counts.
- Lazy loading: offers load as you scroll, instead of all at once.
Design system
A design system, built with the designers
- --space-4: 1em
- --radius-md: 0.625rem
Button, primaryStorybook
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.
- Colour, type and spacing decided once, shared by design and code.
- Components typed with TypeScript and CSS Modules.
- Every component documented in Storybook.
Accessibility, RTL
Components that read both ways
Stay in Lisbon
إقامة في لشبونة
One component, two reading directions.
Result: 13languages Arabic included
One component base for every site: full keyboard navigation, reduced motion support and Arabic layouts.
- Logical properties flip the layout, with no second stylesheet.
- The arrow follows the reading direction.
- Radix UI primitives, full keyboard navigation in both directions.
Experimentation
Pay in instalments, tested on real traffic
A
€840
Control
B
€840
or 3 × €280
+8%
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.
- The current version is the control.
- The variant shows pay in instalments.
- The numbers decide, not taste.
Performance
A carousel that keeps up with you
Before2/6
After1/6
6 quick clicks
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.
- Every click counts: the old one ignored any landing during its 300 ms animation.
- Position dots that shrink at the edges, instead of being cut off while moving.
- 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