Back to the shelf
KJ VIDEONo. 004

Personal

夢 -ヴェイパーウェーブ- 2.0

A vaporwave-style simulated operating system that presents my résumé and work through a windowed interface.

Type
Frontend
Released
Sep 6, 2025
  • Nuxt
  • UnoCSS
  • Pinia
  • VueUse
  • anime.js
  • interact.js

HighlightsFeatures

  • Windowed interface

    Modeled on how an operating system works: every section is its own window you can interact with.

  • Radio

    A music player built on the browser’s native Audio API, with track controls so you can listen while you browse.

  • Three languages

    The system language switches between Traditional Chinese, Simplified Chinese and English.

Behind the ScenesChallenges

  1. Keeping windows inside the viewport

    The problem

    Dragging a window means working out its position against the screen edges so it can’t be dragged out of view.

    The fix

    Used AI to help derive the boundary math and tune the parameters, reducing the risk of calculation errors. interact.js handles the low-level dragging details that are easy to overlook.

  2. Windows misplaced after the browser is resized

    The problem

    When the browser is resized, windows that aren’t recalculated can’t position themselves correctly at the new size, which causes unpredictable errors while dragging.

    The fix

    A debounce waits until the user stops resizing, then :key recreates each window centered on screen so the user can drag it back. Users rarely keep resizing, so this is simpler and more reliable than scaling positions proportionally.

  3. Bringing the clicked window to the front

    The problem

    Like a real operating system, whichever window is clicked should move to the top.

    The fix

    Track the highest z-index in use and give a clicked window that value plus one. The z-index limit is 2147483647, which normal use will practically never reach.

A Kay Jen production

Directed by KAY JEN

© 2026 Kay Jen