Advanced Interactive Design / Final Thematic Website
25/6/2026 - 31/7/2026 (Week 10 - Week 15)
Chang Wing / 0367807
Advanced Interactive Design / Bachelors of Design (Honours) in Creative Media / Taylor's University
Final Thematic Website
TABLE OF CONTENTS
INSTRUCTIONS
Backup Changes at GitHub
I set up a GitHub repository to backup my website and keep track of different versions of the code. Since I used Antigravity as an AI coding assistant, the generated changes after each prompt could sometimes introduce errors / affect existing code. GitHub allows me to review previous versions and restore earlier codes if errors emerge after Antigravity made changes to the codes.
enforce GitHub security best practices, prevent exposing API keys, avoid committing sensitive files, check .gitignore
in Antigravity so it would follow these security practices whenever it generated, modified, or prepared code for Git commits and GitHub uploads.
I also prompted Antigravity to set up a .gitignore file to exclude unnecessary files, such as dependency folders, temporary files, system files and env. files containing sensitive information to reduce unnecessary storage.
To save tokens and avoid hitting the usage limit before it refreshes, I asked Gemini to generate markdown files whenever necessary for Antigravity. This helps me provide clearer instructions to Antigravity while reducing the number of prompts needed during the coding process.

Splash Screen
The code generated by AI was not always perfect, possibly due to limitations in my prompts or the AI's interpretation. I had to manually adjust the CSS styles to better align the UI with my Figma prototype and refine the animations. Figure 1.7 & 1.8 below show the splash screen before and after the manual CSS adjustments:
To help the AI identify the correct food, signboard and landmark SVGs more accurately while keeping the assets organised, I renamed all the files according to the names of the 14 states.
NOTE: I noticed that after submitting a new prompt, Antigravity would sometimes overwrite the manual CSS refinements I had already made by reverting parts of the code to an earlier generated version. To prevent this, I explicitly informed the AI about my manual changes and instructed it to inspect the latest style.css before making further modifications. This helped preserve my existing work while allowing Antigravity to build on the most up-to-date version of the project.
Example prompt: "I have updated style.css and index.html."
Pagination Bar (Food Page)
The bottom pagination bar was designed with several UX-friendly micro-interactions to create a ease navigation experience across all 14 Malaysian states. The active pagination indicator expands from a 12px circle into a 32px pill to provide clear visual feedback of the user's current position.
To prevent jittery transitions when users quickly move their cursor across multiple pagination dots, a 130ms hover debounce was implemented in JavaScript so that state transitions only occur when the cursor intentionally pauses over a target. When a pagination dot is hovered for 130ms or clicked, multiple interface elements are synchronised simultaneously:
- The carousel scrolls to the selected state card,
- The map location pin moves to the corresponding destination with a bounce animation
- The route scooter travels to the selected location and automatically flips direction based on its movement
- The active pagination indicator updates accordingly
Music Control Panel
-The currently playing song will automatically scroll into view when the hamburger menu is opened, ensuring it is always visible to the user
- When users click the pause button in the music control panel, the song pauses without turning off the BGM toggle, allowing them to resume the same song easily
I wanted users to hear "Terukir Di Bintang" by Yuna the first time they visit the website, as I felt it was the most suitable track for introducing the overall mood of the website. Using a consistent song for the first visit also gives users a more intentional introduction to the website rather than immediately introducing randomness.
After the first visit, the BGM is randomised from the 12-track playlist whenever users return to or reload the website, this adds an element of surprise so the experience feels slightly different each time instead of becoming repetitive, it also encourages users to discover the different songs included in the playlist.
Story Page
Summarised prompt gave to Antigravity:
3-Slide Story Selection Page (#story-screen)
Role & Architecture:
Acts as an independent intermediary selection screen between the main top navigation / side drawer menu and the detailed food origin stories.Full-Widescreen Stage Container (
.selection-stage-container):
Uses a100%viewport width stage with a300%width track (selection-carousel-track) so cards slide horizontally across the widescreen canvas without any pixel clipping or cut-offs.Pinned Navigation Controls:
Chevron arrow buttons (#selection-prev-btnand#selection-next-btn) remain pinned inside the visible screen bounds atleft: 60pxandright: 60px(z-index: 50).The 3 Carousel Selection Slides:
Slide 1 — Kuala Lumpur (Nasi Lemak):
Subtitle
"Kuala Lumpur"('Sniglet', 22px white) + Title"Nasi Lemak"('Lilita One', 60px white).Vector card graphic (
./assets/story-page/nasi-lemak-story.svg,440pxunclipped height).Interaction: Clicking Slide 1's card or title smoothly routes to the 8-Slide Nasi Lemak Story Page (
#story-detail-screen).Previous Arrow (
<) hidden on Slide 1.
Slide 2 — Terengganu (Keropok Lekor):
Subtitle
"Terengganu"+ Title"Keropok Lekor".Vector card graphic (
./assets/story-page/keropok-lekor-story.svg).Both Previous (
<) and Next (>) Arrows visible.
Slide 3 — Placeholder:
Display title
"More stories coming soon..."centered in white bold'Lilita One'font (52px).Next Arrow (
>) hidden on Slide 3.
2. 8-Slide Nasi Lemak Story Detail Page (#story-detail-screen)
Role & Stage Frame:
Dedicated narrative reader stage (900px × 500px) presenting the origin story of Nasi Lemak with top action bar controls (Back Arrow←and Hamburger Menu≡).Slide-by-Slide Narrative Content:
Slide 1:
./assets/story-page/story01.svg— Long ago, in a small village near Melaka, lived a kind widow named Mak Kuntum and her young daughter, Seri.Slide 2:
./assets/story-page/story02.svg— One morning, Seri decided to cook rice for lunch. She carefully measured everything, but just as she reached for the water...Slide 3:
./assets/story-page/story03.png— A bowl of creamy coconut milk tipped over and splashed into the pot!Slide 4:
./assets/story-page/story04.svg— The rice began to fill the house with a warm, sweet fragrance. Seri peeked into the pot. The rice looked soft, fluffy, and unlike anything she had ever cooked before.Slide 5:
./assets/story-page/story05.svg— When Mak Kuntum returned home, she immediately noticed the delicious smell. She smiled and asked,Slide 6:
./assets/story-page/story06.svg— "Apa kau masak ni, Seri?" ("What did you cook, Seri?")Slide 7:
./assets/story-page/story07.svg— Seri shyly replied, "Nasi le, Mak." ("Rice, Mother.")Slide 8 (Final Dish Celebration & CTA):
Image:
./assets/story-page/nasi-lemak-side-view.svg.Narrative concluding paragraphs detailing how the accidental coconut rice recipe evolved into Malaysia's iconic national dish served with sambal, anchovies, peanuts, cucumber, and egg.
CTA Button:
"Discover Where to Eat →"(#discover-where-to-eat-btn) featuring immediate visibility and subtle 2-bounce micro-interaction (bounceCtaBtnTwice) that opens the Recommended Eateries Guide Page (#guide-page).
3. Routing & Browser History Architecture
navigateToStory(pushHistory = true)mounts#story-screenand pushes{ screen: 'story-selection' }to history.navigateToStoryDetail(pushHistory = true)mounts#story-detail-screenand pushes{ screen: 'nasi-lemak-story' }to history.Complete browser Back / Forward popstate support allows seamless navigation back from Story Detail →→ Story Selection →→ Home Page.
Markdown prompt (AI-generated and revised by me) gave to Antigravity:

Figure 1.37 Final Featured Songs Page Page design
(Colours may vary slightly from the actual website)
Guide Page
Markdown prompt (AI-generated and revised by me) gave to Antigravity:
The Guide Page recommends places where users can find and try the featured dishes (especially for the foreigners). The page was intentionally kept simple, using short descriptions instead of overly promotional content to prevent it from feeling like advertisement. Links to each shop’s location, website, and social media are also provided for users who want to find out more.
Lastly, when users click on the food illustration at the bottom right of each card, they will be navigated back to the corresponding Food Detail Page.
*Note: The website currently includes the complete user flow for Kuala Lumpur’s featured food only. This means that on the Food Page, only the Kuala Lumpur food is clickable and has a completed Food Detail Page. On the Story Selection Page, only the Kuala Lumpur Nasi Lemak story is currently selectable. Similarly, on the Guide Page, only the Kuala Lumpur Nasi Lemak listing has completed location, website, and social media links.
The other states and their food content are included as part of the overall design.
REFLECTION
Throughout this module, it was probably the most interesting module for me this semester because I got to learn how to animate and build an interactive website using Adobe Animate. However, for the final project, I decided not to use Adobe Animate and instead tried a VS Code + Google Antigravity vibe coding approach because I have been seeing more designers starting to use vibe coding, so I wanted to explore this approach myself and see how it could fit into my own design workflow.
This approach was surprisingly useful and made me realise how capable AI can be when working with code. It allowed me to quickly debug issues without having to go through every file manually, and small things like typos in the codes could be fixed quickly with AI. It also helped me build and test interactions more quickly, which made the overall development process more efficient.
Of course, there were also quite a lot of challenges when vibe coding. I realised that I cannot simply tell AI what I want and expect it to generate exactly what I have in mind, the prompt has to be very specific, otherwise it might misunderstand my intention and generate something completely weird and different. A lot of my time was actually spent writing and refining prompts, reviewing the results and explaining to the AI what needed to be corrected.
I also still manually adjusted a lot of the CSS and code myself because for smaller visual changes, asking AI to fix every single thing was sometimes less efficient because it could fix one problem but accidentally change something else, so instead of relying on AI for everything, I found that it was faster to manually adjust certain parts when I already knew exactly what needed to be changed.
Overall, what I learnt from this project is that vibe coding is not about letting AI do everything for me, it works better as a tool that helps speed up my workflow, while I still need to make the design decisions, understand what the code is doing, and check whether the result actually matches my intention. I also learnt that knowing how to write a good prompt is becoming an important skill when working with AI. I think the biggest takeaway from this project is that I now have a better understanding of how I can combine my design skills with AI and coding in my future projects and use AI to support my workflow rather than relying on it to do everything for me.
.gif)








.gif)

























Comments
Post a Comment