The Guestbook page recreates one of the most distinctively 90s features of personal homepages: the public sign-in board where visitors left their handle, a brief message, and their presence was permanently recorded for all to see. In Digital Domain this feature is fully interactive — new entries are submitted through a Win98-styled form, added to the top of the list in real time, and assigned a randomly selected emoji avatar. The page is routed atDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/apursley2012/digital-domain/llms.txt
Use this file to discover all available pages before exploring further.
/testimonials in the React Router config.
Layout
The page uses a responsive three-column grid:md and above, the entries list occupies two-thirds of the width and the sign form occupies one third — a layout that matches classic guestbook pages of the era.
Guestbook Header
The entries column opens with a header bar:Visual appearance: A black panel with the full Win98 raised-border treatment (~ MY GUESTBOOK ~” renders in VT323 at size 4xl in bright retro yellow — the tildes and asterisks are part of the text string, not separate elements, replicating the decorative ASCII embellishments that surrounded headings on 90s personal pages.
border-4 border-win-gray shadow-win-out). The title ”Pre-Seeded Entries
Three starter entries are defined in the initial state value (Me in the compiled source):
useState:
Entry Card Rendering
Each guestbook entry is rendered as a horizontal flex card:Visual appearance: Each card is a white Win98 raised-border panel. The left column (80px minimum width) contains a 48×48px square avatar box with an inset-shadow border (
shadow-win-in) displaying the emoji at text-2xl, and the handle below it in font-vt323 text-sm. The right column shows a dashed-border date header in grey text-xs, and the message body in font-comic text-sm. New entries prepended to the top of the list appear above the original three entries.max-h-[60vh] overflow-y-auto pr-2 — a maximum height of 60% of the viewport with vertical scroll and a small right padding to offset the scrollbar.
Sign Form
The right-column sign form is wrapped in aWindow component:
Visual appearance: The form window title bar displays a
UserPlus icon alongside “Sign_Guestbook.exe”. Inside, two fields and a submit button are stacked vertically with space-y-4. Both inputs use the standard Win98 inset-shadow field styling (border-2 border-win-gray shadow-win-in p-1 text-sm focus:outline-none focus:bg-yellow-50).Handle/Name Input
name state variable. A maxLength={20} attribute enforces a username length limit.
Message Textarea
message state variable.
Submit Button
BeveledButton using the Lucide BookOpen icon.
Form Submission Handler
ThehandleSubmit function validates, creates a new entry, and prepends it to the list:
Form validation uses an early
return guard for empty fields rather than relying solely on the required HTML attribute. If either name or message is falsy, the function exits without adding an entry or clearing the fields. The Date.now() call generates a unique numeric ID for the new entry’s React key prop.Random Avatar Assignment
When a new entry is submitted, one of five emoji is selected at random:State Summary
| State Variable | Initial Value | Updated By |
|---|---|---|
entries | initialEntries (3 items) | handleSubmit (prepend new entry) |
name | "" | Handle input onChange |
message | "" | Message textarea onChange |
Component Dependencies
| Component | Source | Usage |
|---|---|---|
Window (p) | components/Window.js | Sign_Guestbook.exe form frame |
BeveledButton (d) | components/BeveledButton.js | ”Sign It!” submit button |
user-plus (Lucide) | lucide-react | Window title bar icon |
book-open (Lucide) | lucide-react | ”Sign It!” button icon |
useState | React 18 | Entries list + form field state |