I design enterprise products and build their UI, from a working prototype to merged code.
Twelve years designing internal platforms, CRM and operations software. On Hanlun’s DSE practice platform I built the working Next.js prototype, then contributed frontend code to the production React and TypeScript apps through pull requests merged by the team’s engineers.
Three merged changes in Hanlun’s production apps
The passing rate an attempt was judged at
- Problem
- Teachers can change a quiz’s passing rate, and earlier attempts keep the rate they were judged at. Both apps needed to show that rate with each attempt, the same way for students and teachers.
- I implemented
- Another engineer stores each attempt’s rate at submission. I exposed that stored rate to both apps and placed it beside every attempt: an always-visible pass or fail pill, with the rate next to the submission time, for students and teachers alike.
- Behaviour
- History stays correct. A new rate only applies to attempts submitted after it, and a unit test pins attempts to their stored rate, not today’s.
Reconstructed demo · synthetic data
- Attempt 1Fail45%
- Attempt 2Pass55%
{ score: 55, passRateAtSubmit: 50 } — the latest attempt as both views receive it. Future attempts are judged at 50%; earlier ones keep their own rate.
Problem On iPad, a resting hand or Scribble could interfere with handwriting on the answer and marking pages.
I implemented An iPad check, including iPadOS Safari that reports itself as a Mac, and a shared reminder used on both pages, in two languages.
Behaviour Dismissal lasts for the browser session. The pull request calls it an interim fix: a device setting, not a canvas change.
Problem Each subject has its own brand colour, and a student or teacher can switch between courses.
I implemented A theme provider driven by the course’s subject, seven palettes on shared CSS variables, and Storybook stories that check text contrast.
Behaviour A subject with no mapping falls back to the default theme; one palette was adjusted to meet WCAG AA.
Design to code
How a new feature reached Hanlun’s production codebase, and which code lived where.
- MeDesignflows and screens in Figma
- MePrototypea working Next.js app, Cursor-assisted
- MeBuildUI and states as Storybook stories and in the apps
- MePull requestopened by me, with screenshots
- TeamReviewscreens reviewed in the thread
- EngineerMergeafter CI passes
Product design case studies
These open the product-design portfolio: the rules, roles and workflows behind the interfaces.