Interactive Reflexology Chart
This project was initiated in response to a client’s request to explore converting their existing print-based learning materials into an interactive digital format.
The client’s primary requirement was to make certain image-linked content and filtering options editable after deployment. To address this, I designed an architecture that integrates with the client’s existing CMS, allowing the main content and filter criteria to be managed through custom post types and custom fields.
Since the client did not have a concrete vision of the final product, I first built a prototype to illustrate potential UI and functionality, which helped refine the scope through discussion. The final deliverable was a browser-based single-page application featuring bidirectional interaction between image areas and labels, filter-based view switching, and responsive layouts.
While the demo was well received, the client decided to further evaluate the business implications before moving forward with full-scale implementation. My involvement concluded with the delivery of both a GitHub repository and a standalone static viewer version for browser access.
Due to the use of client-owned illustrations, the demo application and source code are not publicly available.
As this is an interactive application with a UI that heavily relies on those illustrations, screenshots cannot be shared, and some feature descriptions have been omitted as they would be difficult to explain without visuals.
What I Learned
- Integrated WordPress with Next.js for the first time using the REST API.
- Implemented image access restrictions per client request: avoided storing images in the public directory, served them through API Routes as Base64-encoded data, and rendered them via <canvas> to reduce downloadability. However, with ~60 images, these transformations caused noticeable performance issues. I explained to the client that, due to the nature of web applications, it is not possible to fully prevent image downloads, and suggested considering desktop or mobile app development if stricter content protection was a priority.
- Used the Context API for global state management to synchronize selection and highlighting between multiple components displaying related images and labels.
- Created precise hit areas from raster images by tracing them in Affinity Designer, exporting SVG paths, and rendering them with <svg>, <rect>, and <path> elements.
- Applied window.matchMedia for responsive behavior, storing separate label/line coordinates for PC and mobile layouts.
- Designed a data schema to handle complex one-to-many relationships between images and labels, allowing consistent bidirectional highlighting (e.g., selecting an image highlights multiple labels, and selecting a label highlights the related image).
- Addressed an iOS Safari quirk where overflow: hidden on body does not prevent background scrolling on already-scrolled pages, by fixing body position and restoring scrollY after closing overlays.
Tech Stack
Frontend |
Next.js
TypeScript
Tailwind CSS
CSS Modules
|
---|---|
Backend |
WordPress
|
Code Quality |
ESLint
Prettier
Husky
|
Deployment |
Vercel
|