This document specifies the production-ready, one-page portfolio website for Jassinta Roid Triniti — Social Media Specialist, Content Creator, Videographer, and Graphic Designer. The site presents her work across writing, content marketing, strategy, campus editorial, podcast, and a broad archive, wrapped in a playful, girly, textured, editorial scrapbook aesthetic with a school-locker opening scene and a custom 3D fashion-magazine editor.
The product intent is a single, self-contained static site that a brand-side marketer, creative recruiter, or collaborator can scroll in seconds and immediately judge craft: a handmade-feeling portfolio that is elegant but fun, built from paper, stickers, torn edges, staples, and real materials rather than a templated SaaS layout. The site must build cleanly (npm run build), run from dist/ via npm run preview, and deploy statically to Vercel.
The audience is:
Website UI copy is in English; original Indonesian work titles are allowed and are marked with lang="id".
The product is a one-page React 18 + Vite 5 + TypeScript 5 application styled with Tailwind CSS 3.4, animated with Framer Motion 11, smooth-scrolled with Lenis, and using CSS 3D for the locker and magazine. PDFs use page-flip + pdfjs-dist; the Magazine Art editor uses a custom CSS 3D flip. Output is a static dist/ bundle for Vercel.
The page is organized into nine ordered sections:
A single global Contents button / ToC follows the active section via IntersectionObserver and becomes active only after the Opening locker is opened. Locker items and strategy categories open as hash-routed overlays (#/participation, #/achievement, #/my-message, #/magazine-art, #/photography, #/my-strategy, #/notes, #/content/hard-selling, #/content/entertainment, #/content/education, #/content/fun). Opening an overlay pushes history; Close/Esc/Back closes via history.back() and returns focus to the trigger. Valid deep-link hashes open the overlay directly. While the Opening is closed, the locker scene is locked and the page cannot scroll.
All content lives in src/data/*.ts modules (ui, toc, lockerItems, achievements, message, strategySteps, notes, documents, writing, contentMarketing, strategyTypes, campus, podcast, archive, magazineAssets, credentials). All images, videos, and PDFs are resolved through a mediaUrl() helper with an optional VITE_MEDIA_BASE_URL; missing assets render a tidy fallback rather than a broken image.
Narrow exclusions (binding):
@google/genai, process.env, Three.js, or GSAP.page-flip is used only for PDFs; Magazine Art uses custom CSS 3D flip.contain/tiling/background only when needed for differing ratios.The site is a first-party, statically delivered, publicly reachable portfolio. There is no application-owned account, login, or private state: every section and every overlay is anonymously reachable, and the only durable state is the visitor's own in-session magazine composition (kept locally for the active session). External work is delegated to its accepted owners: Spotify hosts the two podcast embeds, and outbound contact actions hand off to the visitor's mail client, Instagram, and — only if a number exists in data — WhatsApp. The site itself owns the locker opening, the nine sections, the seven locker overlays, the four strategy overlays, the PDF flipbooks, the archive, and the magazine editor.
Current delivery is the full nine-section one-page site plus its overlays and editor. No future-horizon features are specified in the authoritative thread; anything not listed here is out of scope.
The following authoritative content assets are referenced by the accepted requirements and are resolved through mediaUrl() with an elegant fallback when absent.
Locker 3 intro video
intro_video.mp4 — 1080×1920, shown uncropped inside the locker 3 door card.Project Campus PDFs
comic_rush.pdf — RUSH 07, 89 pages.pandora_surat_kabar.pdf — PANDORA, 8 pages.Magazine Art / Photography photos
Vintage Cindy 1.jpg through Vintage Cindy 17.jpg — 17 photos, portrait ±3:4, shown uncropped in the Magazine Art tray and the Photography carousel.Participation certificates (src/data/credentials.ts, category participation)
| # | Title | Year | Size | File |
|---|---|---|---|---|
| 1 | Participation as an Intern — Indonesia Mengudara | 2025 | 1949×1276 | participation_1_indonesia_mengudara.jpg |
| 2 | Participation as an Intern — Ministry of Religious Affairs of the Republic of Indonesia | 2023–2024 | 1500×1097 | participation_2_kemenag_intern.jpg |
| 3 | Participation as a Trainee — Cyber News Writing Training | 2024 | 1500×1092 | participation_3_cyber_news_training.jpg |
| 4 | Participation as a Participant — Y20 Indonesia | 2022 | 1003×1500 | participation_4_y20_indonesia.jpg |
| 5 | Participation as General Treasurer Staff — Comic Club | 2021–2022 | 1512×1115 | participation_5_comic_club_treasurer.jpg |
Achievement awards (src/data/credentials.ts, category achievement)
| # | Title | Year | Size | File |
|---|---|---|---|---|
| 1 | ISTC Indonesia Award | 2018 | 1500×1105 | achievement_1_istc_indonesia.jpg |
| 2 | Best Kartini Radio Producer Award | 2025 | 717×892 | achievement_2_kartini_radio_producer.jpg |
| 3 | Best Kartini Radio Broadcast Team Award | 2025 | 1949×1276 | achievement_3_kartini_radio_team.jpg |
Podcast embeds and credit
5v0J711J5xyWvYZn8JWC764dfqcKbGRCaxuoztDsqu0dContact details
jassintaroidt@gmail.com@jassinta.roid — https://www.instagram.com/jassinta.roidMy Message text — preserved verbatim in the My Message overlay, including the italic *content*, the large editorial-serif bold-italic hot-pink line "Let's create something worth remembering", and the intentional short line breaks such as "Perhaps…" and "Behind every…".
#FF8DC7, that #BFE3F5, is #FFF1A8, Felt #D4C1F5, Shared #A8E6CF, Remembered #FFB38A. Container query / cqw sizing keeps "Remembered" always fitting. Door size 1090 × 2500 px; transform-style: preserve-3d with perspective ~1800px. Closed palette: steel-lilac #B9B8CC, milk-white, hot-pink/blush. Footer: 2026 / Jassinta Roid Triniti / Creative Portfolio.lockerItems, toc, ui.TornEdge (realistic torn edge between Opening and the next section), Overlay (host for the seven locker overlays), ContentsButton/ToC (activates after OPEN), SafeImage/SafeVideo for object media, ErrorBoundary.documents.ts.documents.SafeImage (cutout/photo), TornEdge, MediaCard, ErrorBoundary.writing.SafeImage, MediaCard, Overlay (lightbox), TornEdge, ErrorBoundary.contentMarketing.SafeVideo, SafeImage, MediaCard, PinboardCarousel, ErrorBoundary.#/content/hard-selling, #/content/entertainment, #/content/education, #/content/fun); play footage; read info/credit.strategyTypes, strategySteps.Overlay, SafeVideo, MediaCard, ErrorBoundary.comic_rush.pdf, 89 pages) and PANDORA (pandora_surat_kabar.pdf, 8 pages).campus.PDFFlipbook (page-flip + pdfjs-dist), ErrorBoundary.podcast.ErrorBoundary.archive.PinboardCarousel, MediaCard, SafeImage, SafeVideo, Overlay (preview), ErrorBoundary.ui.ErrorBoundary; outbound links.#/participation. Large title Participation in Sentient Bold Italic. Main area is a scrapbook carousel: each item is a certificate photo in a white shadow frame on --aged-paper (grain, lifted corners) with a <Pushpin> at the paper's end. Below the carousel: the active participation title and its small year. Data from src/data/credentials.ts (fields id, category, title, year, file, width, height, alt), category participation, in the order listed in §2b.credentials, lockerItems.Overlay, SafeImage, ErrorBoundary.#/achievement, with the same layout and interaction as Participation and the large title Achievement. Data from src/data/credentials.ts, category achievement, in the order listed in §2b.credentials, achievements.Overlay, SafeImage, ErrorBoundary.#/my-message. Clicking the lavender envelope opens the flap, the paper slides out and grows into the page. Notebook background: white paper, blue lines, pink margin, binder holes, paper grain. Title My Message. The message text is preserved exactly as supplied, with *content* italic, "Let's create something worth remembering" large editorial-serif bold italic in hot-pink, and short lines such as "Perhaps…" and "Behind every…" kept as intentional line breaks.message.Overlay, ErrorBoundary.#/magazine-art, titled "Let's put together a fashion magazine!". Custom 3D magazine collage editor with cover + back cover + spine, 4 blank sheets = 8 page sides, cream textured paper, pink cover and thick spine; desktop 2-page spread, mobile 1 page with Prev/Next; each page keeps its own collage state. Tray on desktop right, mobile bottom: Photos Vintage Cindy 1.jpg … Vintage Cindy 17.jpg shown uncropped; Text VOGUE (Bodoni Moda), Fashion (Pinyon Script), OOTD (Bebas Neue) with changeable text color; Elements 13 elegant/girly SVG elements including ribbon/bow, pastel camera, sparkle star, butterfly, red lips, perfume bottle, high heel, pearl strand, rose, washi tape, cherry pair, tiara/crown, and one additional elegant/girly element.magazineAssets.Overlay, SafeImage, ErrorBoundary; custom CSS 3D flip (not page-flip).#/photography, titled Photography. Horizontal scrapbook carousel of the 17 Vintage Cindy photos in white frames with shadow on an aged-paper background with pins. Desktop shows 3–4 photos, tablet 2–3, mobile 1.2–1.5. Credits: Model Chindy, Photograph Jassinta Roid Triniti, Editing Jassinta Roid Triniti.lockerItems, magazineAssets.Overlay, SafeImage, MediaCard, ErrorBoundary.#/my-strategy. Scrapbook cycle flow diagram with a pink dotted curved path, textured sticky-note cards, pastel SVG icons, and large numbers; an arrow runs from the last step back to the first. Intro line: "My strategy for managing social media content usually consists of several stages." Seven steps: 1 Define the Target Market (audience, needs, habits, platforms); 2 Define the Style Guide (fonts, tone, HEX color palette); 3 Build the Content Plan (content pillars, references, scripts, schedule); 4 Shoot & Record (filming/photography according to script); 5 Edit to the Style Guide (editing, color, typography, sound stay on-brand); 6 Post on Schedule (publish planned time slots); 7 Analyze & Optimize (review engagement, awareness, conversion, feed insights back to step 1). Step 7 chips: Engagement, Awareness, Conversion.strategySteps.Overlay, ErrorBoundary.#/notes. Clicking notes opens a spiral notebook with lined paper. Title Notes. Text: "The 3 Keys to Marketing & Content Success:" with Awareness, Engagement, Conversion. Doodles, highlights, stars, and pastel accents are added.notes.Overlay, ErrorBoundary.#/content/hard-selling.strategyTypes.Overlay, SafeVideo, ErrorBoundary.#/content/entertainment.strategyTypes.Overlay, SafeVideo, ErrorBoundary.#/content/education.strategyTypes.Overlay, SafeVideo, ErrorBoundary.#/content/fun.strategyTypes.Overlay, SafeVideo, ErrorBoundary.Each requirement is a distinct story point with provenance, lifecycle facts, and observable acceptance.
FR-01 — One-page portfolio delivery (explicit) As a Portfolio Owner, I should have a production-ready one-page portfolio website for Jassinta Roid Triniti (Social Media Specialist, Content Creator, Videographer, Graphic Designer) that is ready to deploy to Vercel, so that her work is publicly available.
npm run build succeeds; dist/ runs with npm run preview; static Vercel deploy works.FR-02 — English UI with Indonesian titles (explicit)
As a Portfolio Visitor, I should read all UI copy in English while original Indonesian work titles remain in their original language marked lang="id", so that the site reads naturally and titles stay authentic.
lang="id".FR-03 — Modular data separation (explicit)
As a Portfolio Owner, I should have all content/data separated into src/data/*.ts with no large hardcoded content in components, so that I can maintain content without touching components.
ui, toc, lockerItems, achievements, message, strategySteps, notes, documents, writing, contentMarketing, strategyTypes, campus, podcast, archive, magazineAssets, credentials exist as data modules.FR-04 — mediaUrl() helper with fallback (explicit)
As a Portfolio Visitor, I should have all images/videos/PDFs resolved through a mediaUrl() helper with optional VITE_MEDIA_BASE_URL, and missing assets replaced by a tidy fallback visual, so that I never see a broken image.
mediaUrl(); missing assets render the paper fallback card.FR-05 — Prohibited technologies (explicit)
As a Portfolio Owner, I should have no API, Gemini, @google/genai, process.env, Three.js, or GSAP in the project, so that the site stays static and dependency-light.
FR-06 — Ambiguity resolution log (explicit)
As a Portfolio Owner, I should have ambiguities resolved with the best theme-appropriate solution and recorded in DECISIONS.md, so that decisions are traceable.
DECISIONS.md exists with recorded decisions.FR-07 — No feature removal (explicit) As a Portfolio Owner, I should have every feature retained, with difficult features given a best implementation plus a clear TODO, so that nothing is silently dropped.
FR-08 — Stack (explicit)
As a Portfolio Owner, I should have the site built on React 18, Vite 5, TypeScript 5, Tailwind CSS 3.4, Framer Motion 11, Lenis, CSS 3D, and page-flip + pdfjs-dist, with page-flip only for PDFs and Magazine Art using custom CSS 3D flip, outputting dist/ for Vercel.
dist/ is produced.FR-09 — Visual concept (explicit) As a Portfolio Visitor, I should experience a playful, girly, textured, editorial, scrapbook, school-locker, paper, sticker, fashion-magazine aesthetic that is elegant but fun, with light grain/noise and SVG/CSS torn-paper edges sharp at all resolutions.
FR-10 — Palette and WCAG AA (explicit) As a Portfolio Visitor, I should see the specified palette — dark ink, white/milk-white, powder/blush pink, hot/barbie/bubblegum pink, cherry red, lilac, vanilla, plum-night (#2A0F2E→#4B1D4F→#7A2E5C), steel-lilac, candy-pink, berry, walnut — with WCAG AA contrast maintained.
FR-11 — Fonts (explicit) As a Portfolio Visitor, I should see Sentient for display serif, Anton for giant sans, Caveat for handwriting, Pinyon Script + Bodoni Moda + Bebas Neue for magazine surfaces, and DM Mono for labels, with system sans as UI/body fallback, and never Poppins or Sentinet.
FR-12 — Responsive perfection (explicit)
As a Portfolio Visitor, I should have the site render perfectly at phone 360/480, tablet 768/1024, desktop 1440/1920/2560, and 4K, with no horizontal overflow, no unnecessary crop/stretch, and no lost content, using fluid clamp(), svh/dvh/lvh, safe-area, and touch targets ≥44px.
FR-13 — Accessibility and performance (explicit)
As a Portfolio Visitor, I should have all interactions support mouse/touch/keyboard, good focus/ARIA, prefers-reduced-motion, lazy-loaded media, offscreen video pause, no layout shift, and smooth performance.
FR-14 — Section order (explicit) As a Portfolio Visitor, I should see the nine sections in order: 1 OPENING, 2 PERSONAL BRAND, 3 WRITING PORTFOLIO, 4 CONTENT MARKETING SPECIALIST, 5 EXAMPLE STRATEGY, 6 PROJECT CAMPUS, 7 PODCAST, 8 ARCHIVE, 9 CONTACT.
FR-15 — Navigation and ToC (explicit)
As a Portfolio Visitor, I should have smooth scroll plus a single global Contents button that follows the active section, with the ToC active only after Opening is opened, using IntersectionObserver.
FR-16 — Overlay hashes (explicit)
As a Portfolio Visitor, I should have locker item overlays addressed by hashes #/participation, #/achievement, #/my-message, #/magazine-art, #/photography, #/my-strategy, #/notes, #/content/hard-selling, #/content/entertainment, #/content/education, #/content/fun.
FR-17 — History, close, focus, deep-link, scroll-lock (explicit)
As a Portfolio Visitor, I should have Open add history; Close/Esc/Back close with history.back(); focus return to the trigger; valid deep-link hashes open the overlay directly; and the Opening closed state enforce scroll-lock.
FR-18 — Opening closed scene (explicit)
As a Portfolio Visitor, I should see a full-screen 100svh scene with five CSS-3D school lockers numbered 131–135, locker 3 as the focus carrying the quote "Content that is Felt, Shared, Remembered" in editorial serif with regular/bold-italic/bold/italic variation, per-word highlights Content #FF8DC7, that #BFE3F5, is #FFF1A8, Felt #D4C1F5, Shared #A8E6CF, Remembered #FFB38A, container query/cqw sizing so "Remembered" always fits, and a hot-pink glitter OPEN sticker with white text, wiggle, and hover shadow.
FR-19 — Locker 3D realism and parallax (explicit)
As a Portfolio Visitor, I should have the locker feel genuinely 3D — ceiling, side walls, shelves, frame, thick door, inset vents, handle, keyhole/latch, number plate, semi-gloss metal, grain, scratches, highlight and contact shadow — using CSS 3D transform-style: preserve-3d with perspective around 1800px and a door size of 1090 × 2500 px; desktop mouse parallax max ±3°, mobile very light idle sway, prefers-reduced-motion respected.
FR-20 — Closed palette and footer (explicit)
As a Portfolio Visitor, I should see the closed palette steel-lilac #B9B8CC, milk-white, and hot-pink/blush, with the footer reading 2026 / Jassinta Roid Triniti / Creative Portfolio.
FR-21 — OPEN press transition (explicit) As a Portfolio Visitor, I should have no swinging door animation on OPEN press; instead a full scene swap with confetti of max 24 elements plus a pink glitter/paper wipe of 500–700ms, then the open locker with staggered pop-in; afterwards scrolling unlocks and focus moves; reduced motion uses a ~250ms crossfade.
FR-22 — Open locker scene structure (explicit) As a Portfolio Visitor, I should see lockers 2 and 4 always open with no doors at all, and lockers 1, 3, 5 staying closed with full-door cards; door size 1090 × 2500 px.
FR-23 — Locker 1 card (explicit) As a Portfolio Visitor, I should see locker 1's card reading exactly "I Can Help You With:" followed by Social Media Manager, Social Media Strategy, SEO Writing, Video Content, Graphic Designer, Editorial Planning, Copywriting, etc.
FR-24 — Locker 5 card (explicit) As a Portfolio Visitor, I should see locker 5's card reading exactly "Platform I Am Proficient in:" followed by Instagram, TikTok, Facebook, Google Business Profile, Canva, CapCut, Adobe Suites.
FR-25 — Locker 3 intro video card (explicit)
As a Portfolio Visitor, I should see intro_video.mp4 (1080×1920) filling locker 3's card at its native ratio, never cropped, letterboxed in the card color if needed, with the component working for portrait or landscape by measuring videoWidth/videoHeight; sticker-style Mute/Unmute and Pause/Play controls; start muted + autoplay + loop (or paused with poster) with a clear "Tap for sound" hint; audio only after user interaction; and the video pausing automatically when the scene leaves the viewport.
FR-26 — Locker 2 contents (explicit) As a Portfolio Visitor, I should see locker 2's contents top to bottom: certificate on the top shelf, trophy to the right below it, magazine stack, camera on top of the magazine stack, and shoes on the bottom shelf.
FR-27 — Locker 4 contents (explicit) As a Portfolio Visitor, I should see locker 4's contents: polaroid/photo top-left, letter/envelope top-right, notes below the letter on the right, books left-middle on a shelf, umbrella leaning bottom-right, and bag on the bottom shelf.
FR-28 — Objects rest on shelves (explicit) As a Portfolio Visitor, I should have objects read as resting on shelves — contact shadows, leaning against the back wall, natural overlap; the umbrella leans on the wall; the bag and shoes stand on the bottom shelf.
FR-29 — Open scene colors (explicit)
As a Portfolio Visitor, I should see lockers 2 & 4 with --candy-pink exterior, --berry interior gradient to --aubergine in the corners, thick --blush shelves, and soft inner shadow; lockers 1/3/5 doors in --lilac / --candy-pink / --pastel-mint respectively with cream-white cards; room wall --powder-pink with grain; floor --rose-quartz with soft reflection; static light paper confetti and small stickers scattered on the wall; footer © 2026 · Jassinta Roid Triniti · TocInline; and the section bottom using TornEdge.
FR-30 — Door cards on lockers 1, 3, 5 (explicit) As a Portfolio Visitor, I should have each door card fill the entire door surface with nothing spilling outside; long text wraps; fluid text sizing via container query; paper texture, pin/washi tape, and thin shadow; card titles in Sentient Bold, lists in Poppins, and each bullet prefixed with a small pastel heart/star icon.
FR-31 — Object depth rules (explicit)
As a Portfolio Visitor, I should have flat objects (framed certificate, notes, envelope, magazines, polaroid) extruded with 4–10 stacked thin translateZ layers progressively darkened plus textured side edges, with magazines showing page-stack thickness and notes showing a protruding wire spiral; and volumetric objects (trophy, camera, bag, shoes, umbrella, books) with realistic contact shadow, rim-light, small mouse-tilt parallax, and reflected shadow on the shelf.
FR-32 — Silhouette hit-testing (explicit)
As a Portfolio Visitor, I should have the button shape equal the object shape: hit-testing follows the silhouette via an offscreen canvas alpha (>20) check or a clip-path/SVG silhouette path; click, hover, and focus outline follow the silhouette; and the keyboard focus outline is a glowing pink silhouette contour.
FR-33 — Hover and tap behavior (explicit)
As a Portfolio Visitor, I should have desktop hover on objects lift them 6–10px, scale 3%, add a soft pink rim-glow, and show a HoverLabel naming the destination page; on mobile, the first tap shows the label and highlight and the second tap opens the page.
FR-34 — Decorative-only objects (explicit) As a Portfolio Visitor, I should have the photo/polaroid, umbrella, bag, and shoes behave as light interactive decoration (wobble/sway on hover) with no button label and no destination.
FR-35 — Object-to-page mapping (explicit) As a Portfolio Visitor, I should have certificate → Participation, trophy → Achievement, magazine stack → Magazine Art, camera → Photography, letter/envelope → My Message, books → My Strategy, and notes → Notes.
FR-36 — Overlay shell (explicit) As a Portfolio Visitor, I should have all overlay pages be full-screen overlays with a Close sticker ("\xe2\x9c\x95"), Esc, hash route/deep-link, browser back, and focus management.
FR-37 — Participation page (explicit) As a Portfolio Visitor, I should see a large title "Participation" in Sentient Bold Italic and a scrapbook carousel of certificate photos in white shadow frames on aged-yellow paper with a pushpin; navigation via arrows, drag/swipe, keyboard ← →, and dot indicators; images never cropped with frames following each photo's native ratio; and the active participation title and small year shown below the carousel.
FR-38 — Participation data (explicit)
As a Portfolio Visitor, I should have Participation data in src/data/credentials.ts with fields id, category, title, year, file, width, height, alt: 1 Participation as an Intern — Indonesia Mengudara (2025, 1949×1276, participation_1_indonesia_mengudara.jpg); 2 Participation as an Intern — Ministry of Religious Affairs of the Republic of Indonesia (2023–2024, 1500×1097, participation_2_kemenag_intern.jpg); 3 Participation as a Trainee — Cyber News Writing Training (2024, 1500×1092, participation_3_cyber_news_training.jpg); 4 Participation as a Participant — Y20 Indonesia (2022, 1003×1500, participation_4_y20_indonesia.jpg); 5 Participation as General Treasurer Staff — Comic Club (2021–2022, 1512×1115, participation_5_comic_club_treasurer.jpg).
FR-39 — Achievement page (explicit)
As a Portfolio Visitor, I should see an Achievement page identical in layout and interaction to Participation with the large title "Achievement", and data: 1 ISTC Indonesia Award (2018, 1500×1105, achievement_1_istc_indonesia.jpg); 2 Best Kartini Radio Producer Award (2025, 717×892, achievement_2_kartini_radio_producer.jpg); 3 Best Kartini Radio Broadcast Team Award (2025, 1949×1276, achievement_3_kartini_radio_team.jpg).
FR-40 — My Message page (explicit)
As a Portfolio Visitor, I should have clicking the lavender envelope open the flap, slide the paper out, and grow it into the page; a notebook background with white paper, blue lines, pink margin, binder holes, and paper grain; a handwriting font kept highly legible at ≥22px desktop and ≥19px mobile with high contrast and line-height following the paper lines; content scrolling inside the paper; the title "My Message"; and the full message text preserved verbatim including the italic *content* formatting, the large editorial-serif bold-italic hot-pink line "Let's create something worth remembering", and the intentional short line breaks.
FR-41 — Magazine Art editor (explicit) As a Magazine Art Player, I should have a custom 3D magazine collage editor titled "Let's put together a fashion magazine!" with 4 blank sheets = 8 sides, cream textured paper, pink cover and thick spine; desktop 2-page spread, mobile 1 page with Prev/Next; and each page keeping its own collage state.
FR-42 — Magazine tray (explicit)
As a Magazine Art Player, I should have a tray with 17 photos Vintage Cindy 1.jpg through Vintage Cindy 17.jpg shown uncropped; text elements VOGUE (Bodoni Moda), Fashion (Pinyon Script), OOTD (Bebas Neue) with changeable text color; and 13 SVG decorative elements including ribbon/bow, pastel camera, sparkle star, butterfly, red lips, perfume bottle, high heel, pearl strand, rose, washi tape, cherry pair, tiara/crown, and one additional elegant/girly element.
FR-43 — Magazine interaction (explicit) As a Magazine Art Player, I should be able to click/tap a tray item to add it to the active page; drag with mouse/touch/pen; scale, rotate, delete, bring front/send back; have z-index rise while dragging; use mobile pinch zoom/rotate where possible; have objects clamped so they cannot be fully lost off the page; use keyboard support; and optionally Undo/Redo/Clear/Save image; text can scale and change color; photos are never cropped.
FR-44 — Photography page (explicit) As a Portfolio Visitor, I should see a page titled "Photography" with a horizontal scrapbook carousel of the 17 Vintage Cindy photos in white frames with shadow on an aged-paper background with pins; arrows, drag/swipe, and keyboard navigation; desktop showing 3–4 photos, tablet 2–3, mobile 1.2–1.5; and credits Model Chindy, Photograph Jassinta Roid Triniti, Editing Jassinta Roid Triniti.
FR-45 — My Strategy page (explicit) As a Portfolio Visitor, I should see a scrapbook cycle flow diagram with a pink dotted curved path, textured sticky-note cards, pastel SVG icons, and large numbers; micro-animation on scroll; an arrow from the last step back to the first; hover/tap showing detail; the intro line "My strategy for managing social media content usually consists of several stages."; and 7 steps: 1 Define the Target Market (audience, needs, habits, platforms); 2 Define the Style Guide (fonts, tone, HEX color palette); 3 Build the Content Plan (content pillars, references, scripts, schedule); 4 Shoot & Record (filming/photography according to script); 5 Edit to the Style Guide (editing, color, typography, sound stay on-brand); 6 Post on Schedule (publish planned time slots); 7 Analyze & Optimize (review engagement, awareness, conversion, feed insights back to step 1); with step 7 chips Engagement, Awareness, Conversion.
FR-46 — Notes page (explicit) As a Portfolio Visitor, I should have clicking notes open a spiral notebook with lined paper, titled "Notes", containing "The 3 Keys to Marketing & Content Success:" with Awareness, Engagement, Conversion, plus doodles, highlights, stars, and pastel accents.
FR-47 — Personal Brand (explicit)
As a Portfolio Visitor, I should see a white background with giant Anton typography and cutout/photo composition, and 10 document sheets as a stack with rotation, red staple, numbers 01/10; layered on desktop, 2-column on mobile with parallax disabled on touch; content from documents.ts.
FR-48 — Writing Portfolio (explicit) As a Portfolio Visitor, I should see an editorial hero plus cassette/disc 3D interaction, 11 works from data, media shown uncropped, link/lightbox where relevant, 6 image reveals, and a torn edge, in an editorial/fashion visual language.
FR-49 — Content Marketing Specialist (explicit) As a Portfolio Visitor, I should see a dark plum-night cinematic background with film grain/glow, a hero then a pinned horizontal runway/strip, 15 works and 6 main videos, categories beauty/travel/culinary, and Info/Credit, with horizontal interaction usable on touch and keyboard.
FR-50 — Example Strategy (explicit) As a Portfolio Visitor, I should see a hero plus 4 strategy categories (Hard Selling, Entertainment, Education, Fun), with video/footage, info, and credit, and a visual of a curved wall + floor with cinematic plum/pink atmosphere.
FR-51 — Project Campus (explicit)
As a Portfolio Visitor, I should see a hero without media plus a bookshelf, and two project PDFs — RUSH 07 (comic_rush.pdf, 89 pages) and PANDORA (pandora_surat_kabar.pdf, 8 pages) — using page-flip/pdfjs-dist, with desktop landscape showing 2 pages and mobile 1 page, and Prev/Next, keyboard, and touch controls.
FR-52 — Podcast (explicit) As a Portfolio Visitor, I should see two Spotify embeds (5v0J711J5xyWvYZn8JWC76 and 4dfqcKbGRCaxuoztDsqu0d) and the credit: Script Jassinta Roid Triniti, Hosts Tataq and Aqilah, Spotify Kartini Podcast.
FR-53 — Archive (explicit) As a Portfolio Visitor, I should see 34 works with categories/filters per data, a dynamic preview, order that may be shuffled each load, all media no-crop using contain/tiling/background only when needed for differing ratios, and stable resize.
FR-54 — Contact (explicit) As a Portfolio Visitor, I should see a full-screen cinematic ending with a 3-column responsive layout, email jassintaroidt@gmail.com, Instagram @jassinta.roid / https://www.instagram.com/jassinta.roid, and mailto, Instagram, and WhatsApp actions if a number is available in data.
FR-55 — Reusable components (explicit) As a Portfolio Owner, I should have reusable components SafeImage, SafeVideo, Overlay, ContentsButton/ToC, TornEdge, PinboardCarousel, PDFFlipbook, MediaCard, and ErrorBoundary.
FR-56 — ResizeObserver (explicit)
As a Portfolio Owner, I should have ResizeObserver used where layout/interaction depends on size.
FR-57 — Data modules (explicit)
As a Portfolio Owner, I should have all data stored in src/data/*.ts as ui, toc, lockerItems, achievements, message, strategySteps, notes, documents, writing, contentMarketing, strategyTypes, campus, podcast, archive, magazineAssets, credentials.
FR-58 — Asset filenames and fallbacks (explicit) As a Portfolio Owner, I should have asset filenames from data/spec used without renaming, and all media have an elegant fallback.
FR-59 — Footer (explicit) As a Portfolio Visitor, I should see a full-screen footer reading © 2026 | Jassinta Roid Triniti | section label/Contents in DM Mono.
FR-60 — Deploy and QA artifacts (explicit)
As a Portfolio Owner, I should have README, .gitignore, vercel.json, and DECISIONS.md prepared; npm install and npm run build run; and dist/ run with npm run preview.
FR-61 — Pre-completion checks (explicit) As a Portfolio Owner, I should have the pre-completion checklist verified: all 9 sections present and ordered; Opening lock/unlock and all 7 overlays work; hash/deep-link/Esc/Back/focus work; only one ToC with correct active state; no horizontal scrollbar from 360–2560px; media not cropped/stretched and fallbacks work; video/PDF/Spotify work; touch + keyboard + reduced motion; no API/Gemini/GSAP/Three.js/Poppins/Sentinet; clean TypeScript/Vite build.
FR-62 — Opening gate (required_inference) As a Portfolio Visitor, I should have the Opening locker opened before page scrolling and the Contents navigation become active, so that the accepted opening journey is executable.
FR-63 — Overlay navigation integrity (required_inference) As a Portfolio Visitor, I should have valid overlay hashes support direct entry, browser history, Escape/back closure, and focus restoration, so that overlay journeys are executable.
FR-64 — Media/PDF/embed fallback continuity (required_inference) As a Portfolio Visitor, I should have media, PDF, and external embed fallbacks preserve browsing when assets or providers are unavailable.
FR-65 — Magazine session state (required_inference) As a Magazine Art Player, I should have my magazine composition state remain available across its eight page sides during the active local-device session.
A recruiter, client, or collaborator who lands on the one-page portfolio, presses the OPEN sticker to unlock the locker scene, and browses the nine sections to evaluate Jassinta's work. They move between sections with the global Contents button and smooth scroll, open the seven locker overlays and four strategy overlays via hash deep-links, and read credits, info, and media previews. Their primary goal is to judge craft quickly and reach contact details. Their distinct responsibilities are opening the locker, navigating sections, opening overlays, moving through the Participation and Achievement certificate carousels, playing videos and flipping PDFs, filtering the archive, and using contact actions. Their inputs are the OPEN sticker, the ToC, silhouette-shaped locker objects, carousel arrows and dots, filters, and outbound links. They interact with the Portfolio Owner only indirectly (through the presented work) and with provider surfaces (Spotify, Instagram, mail client). Success means every work item, video, PDF flipbook, and Spotify embed is reachable without broken media and the contact details are reached.
A visitor who opens the #/magazine-art overlay to compose a fashion magazine in the custom CSS 3D editor. Their primary goal is to assemble a magazine spread from the tray. Their distinct responsibilities are flipping pages via Prev/Next, edge click, or keyboard (never drag-to-flip); adding photos, text, and SVG elements from the tray to the active page; dragging, resizing, rotating, deleting, and reordering objects with mouse, touch, or pen; and using undo/redo and clear-page controls. Their inputs are tray items and object manipulation gestures. They interact with the Portfolio Visitor role only in that both are anonymous visitors; they interact with no other persona. Success means each of the 8 page sides retains its own collage state during the session, with Undo/Redo and Clear page available and Save as PNG optional.
Jassinta Roid Triniti, the Social Media Specialist, Content Creator, Videographer, and Graphic Designer whose work the site presents. Her primary goal is to keep her portfolio live and accurate. Her distinct responsibilities are maintaining the content and media data in src/data/*.ts (ui, toc, lockerItems, achievements, message, strategySteps, notes, documents, writing, contentMarketing, strategyTypes, campus, podcast, archive, magazineAssets, credentials) and the asset filenames, and relying on the site building cleanly and deploying statically to Vercel. Her inputs are the data modules and asset files. She interacts with visitors only through the presented work; she does not interact with them in-app. Success means npm run build succeeds, dist/ runs with npm run preview, and the live site reflects her current work.
#/content/hard-selling) to view footage, info, and credit. Closing returns focus to the category trigger.intro_video.mp4 uncropped with sticker Mute/Unmute and Pause/Play controls and a "Tap for sound" hint.HoverLabel naming the destination page. On mobile, the first tap shows the label and highlight.#/participation (from the certificate object or a deep link). The overlay shows the large title Participation in Sentient Bold Italic and a scrapbook carousel of certificate photos in white shadow frames on aged-yellow paper with a pushpin.history.back() runs and focus returns to the certificate object.#/achievement and repeats the same interaction across the three awards: ISTC Indonesia Award (2018), Best Kartini Radio Producer Award (2025), Best Kartini Radio Broadcast Team Award (2025).#/participation or #/magazine-art).history.back() runs and focus returns to the trigger.#/magazine-art. The custom 3D magazine renders with cover + back cover + spine and 4 blank sheets = 8 page sides (desktop 2-page spread; mobile 1 page).Vintage Cindy 1.jpg through Vintage Cindy 17.jpg (uncropped), a text item (VOGUE in Bodoni Moda, Fashion in Pinyon Script, OOTD in Bebas Neue), or one of the 13 SVG elements — to add it to the active page.#/my-message by clicking the lavender envelope. The flap opens, the paper slides out and grows into the page over a notebook background with white paper, blue lines, pink margin, binder holes, and paper grain.*content*, the large editorial-serif bold-italic hot-pink line "Let's create something worth remembering", and the intentional short line breaks are preserved exactly.#/my-strategy by clicking the books. The scrapbook cycle flow diagram shows the intro line "My strategy for managing social media content usually consists of several stages." and seven sticky-note steps on a pink dotted curved path, with an arrow from step 7 back to step 1. Hovering or tapping a step reveals its detail; step 7 shows the chips Engagement, Awareness, Conversion.#/notes by clicking the notes. A spiral notebook with lined paper opens, titled Notes, showing "The 3 Keys to Marketing & Content Success:" with Awareness, Engagement, Conversion, plus doodles, highlights, stars, and pastel accents.src/data/*.ts — including credentials.ts for the Participation and Achievement entries — and adds asset files using the filenames from data/spec.npm install and npm run build; the TypeScript/Vite build completes cleanly.dist/ with npm run preview.dist/ statically to Vercel.The authoritative creative direction is Handmade provocation in hot pink, after Stefan Sagmeister. The muse is Stefan Sagmeister; the headline idea is that type and objects are built from physical stuff — imperfection on purpose, wit with edge — so torn paper, staples, tape, and the 3D locker read as authored art direction rather than decoration.
Color tokens (light mode):
#FBF6EF — default ground, ~55% of the page.#FFFFFF — reserved for sheets, cards, and magazine pages.#1A1014 — body copy and giant Anton headlines.#E62A6B — staples, OPEN button, active ToC dot, sticker fills, hover states; never more than ~8% of any viewport.#8E2A5C — deep secondary for the cinematic Content Marketing and Example Strategy sections.#7A6B72.#2A0F2E → #4B1D4F → #7A2E5C with #FBF6EF text at 12:1 contrast.#F6D9E4, lilac #C9A7E0, vanilla #F2E4B8, cherry #C81E3C, walnut #6B4A3A — tape, thread, sticker borders, torn-edge shadow only.Closed-locker and open-locker scene tokens:
#B9B8CC, milk-white, hot-pink/blush.#FF8DC7, that #BFE3F5, is #FFF1A8, Felt #D4C1F5, Shared #A8E6CF, Remembered #FFB38A.--candy-pink, interior --berry gradient to --aubergine in the corners, thick --blush shelves; lockers 1/3/5 doors --lilac / --candy-pink / --pastel-mint with cream-white cards; room wall --powder-pink with grain; floor --rose-quartz with soft reflection.--aged-paper with grain and lifted corners.Body text is always ink on milk-white or milk-white on plum-night, both above 7:1. Pink is never used as a text color on white at body size — only for display type ≥32px or as a background behind ink text.
Typography:
clamp()): display-1 Anton clamp(56px, 13vw, 190px); display-2 Anton clamp(40px, 8vw, 112px); h2 Sentient clamp(28px, 4.2vw, 56px); h3 Sentient clamp(20px, 2.4vw, 30px); body Sentient clamp(1.0625rem, 1.05vw, 1.1875rem); label DM Mono 11px → 12px; handwriting Caveat clamp(20px, 2.6vw, 34px).Shape language: Torn paper, tape, and staples. Hard-edged rectangles with irregular SVG-torn top and bottom edges (a real per-section path, not a repeated mask), rotated stickers and labels between -6° and +6°, kraft tape strips at 90° to the page flow, red staple marks pinning document sheets, thin 1px ink rules, and 2px die-cut sticker borders. Corners are sharp everywhere except stickers and tape, which get 2–4px radii. The locker is genuinely 3D: recessed louvre vents, raised handle, hinge shadow, painted steel panel with subtle brushed texture. Nothing is soft-rounded; nothing is glassy.
Layout: Asymmetric scrapbook grid on a 12-column bed with a deliberate 1-column bleed on the left for torn-paper and tape overlaps. Sections alternate physical grounds — milk-white paper, plum-night cinematic, white sheet — with a torn edge as the only transition, never a straight line or a gradient fade. Personal Brand stacks ten document sheets in a rotated fan on desktop and collapses to a 2-column sheet grid on touch with parallax off. Writing Portfolio runs an editorial two-column spread with a cassette/disc 3D object breaking the right gutter. Content Marketing pins a horizontal runway strip that scrolls on drag, wheel, and arrow keys. Archive is a masonry pinboard with a sticky filter rail. Contact is a full-bleed three-column ending on plum-night with the footer as a full-screen DM Mono plate. The open locker scene keeps the five-unit bank with lockers 2 and 4 doorless and 1, 3, 5 doored, and the section closes on a TornEdge.
Imagery: Photographed and collaged real materials — scanned paper, torn kraft, staples, thread, tape, magazine tears, film-grain photography of Jassinta's actual work. Portrait and 3:4 media is always shown whole with object-fit: contain on a paper mat — never cropped, never stretched. Missing assets fall back to a paper-textured card with a DM Mono filename label, a pink staple, and a hand-drawn Caveat note. The plum-night sections use high-contrast footage with a 6% grain overlay and a soft pink rim glow, never gradient blobs. Locker objects are transparent PNGs with depth layers; when a PNG is absent, an SVG/CSS fallback with the same shape and color is used.
Avoid: gradient-blob heroes and soft glassy panels; blue–indigo for any primary or accent; Inter, Roboto, Arial, Helvetica, Open Sans, Lato, Poppins, or system-ui for headings or body (system sans is fallback only, and Poppins is permitted only for the locker card lists as explicitly specified); a grid of identical hover-lift cards; cropping or stretching any work media; confetti or particle systems beyond a single paper-shard burst on the OPEN action; symmetrical, centered, template-shaped heroes; any motion that continues under prefers-reduced-motion; any drag-to-flip on the magazine.
The public entry is a full-viewport school locker bank occupying the entire first screen edge to edge, bleeding past the top and bottom on mobile so only three lockers are visible at once. Five units are numbered 131–135 in DM Mono on brushed steel. The dominant element is locker 133, dead center, one third of the viewport width, with a deep recessed louvre vent, a raised handle, and a padlock in hot pink #E62A6B.
Above the locker bank, Anton all-caps "Content that is Felt, Shared, Remembered" is set in three stacked lines at clamp(56px, 13vw, 190px), with the words FELT, SHARED, and REMEMBERED each punched onto its own torn paper strip that overlaps the lockers and shifts at different parallax rates. A pink OPEN button sits as a die-cut sticker taped to the lower-left corner of locker 133, rotated -4°, 56px tall.
The whole scene is locked (no scroll) until OPEN is pressed. There is no swinging door animation: the scene swaps fully with a confetti of at most 24 paper shards and a 500–700ms pink glitter/paper wipe, then the open locker appears with staggered pop-in — lockers 2 and 4 doorless with objects resting on their shelves, lockers 1, 3, 5 doored with full-door cards — and the milk-white paper ground of the next section tears in from the bottom edge. This concept only recomposes accepted content, states, and controls — it introduces no new behavior, page, or destination.
Interaction Model: Animated Motion Tempo: expressive Hero Dimensionality: layered_2d
Landing Hero Motion Brief
cubic-bezier(0.22, 0.61, 0.36, 1); no swinging door animation on OPEN; the confetti/glitter wipe is a 500–700ms frame-staggered burst of paper shards, not a particle system; section entrances are staggered paper-drop reveals (translateY 18px + rotate -1.5° → 0°) at 60ms intervals; hover on work items lifts the sheet 6px and deepens its shadow; locker objects lift 6–10px, scale 3%, and gain a pink rim-glow on hover; magazine page flips are a single 700ms CSS 3D rotateY on the spine; marquees and the runway strip move continuously and stop entirely under prefers-reduced-motion, wrapping to readable rows.clamp(), svh/dvh/lvh, and safe-area insets. Rationale: fluid layout is required for the responsive range.prefers-reduced-motion; no motion continues under it; the OPEN transition becomes a ~250ms crossfade. Rationale: accessibility and the creative direction.npm run build succeeds; dist/ runs with npm run preview. Rationale: the brief requires a clean build and static deploy.dist/ for static Vercel deploy. Rationale: the brief requires Vercel deployment.@google/genai, process.env, Three.js, or GSAP. Rationale: the brief forbids these.ResizeObserver where layout/interaction depends on size. Rationale: the brief requires stable resize behavior.clip-path/SVG silhouette path, with a shape-and-color SVG/CSS fallback when the PNG is absent. Rationale: the brief requires the button shape to equal the object shape.intro_video.mp4 starts muted with autoplay and loop (or paused with a poster), shows a clear "Tap for sound" hint, and only plays audio after user interaction; it pauses automatically when the scene leaves the viewport. Rationale: browser autoplay policy and the brief's explicit audio rule.dist/ for Vercel (explicit).src/data/*.ts; no backend or database (explicit).vercel.json provided (explicit).Assumptions
DECISIONS.md. (explicit)videoWidth/videoHeight and works for portrait or landscape. (explicit)Constraints
lang="id". (explicit)@google/genai, process.env, Three.js, or GSAP. (explicit)page-flip is used only for PDFs; Magazine Art uses custom CSS 3D flip. (explicit)prefers-reduced-motion respected. (explicit)dist/ for static Vercel deploy; npm run build must succeed and dist/ must run with npm run preview. (explicit)intro_video.mp4 (1080×1920) must never be cropped; audio plays only after user interaction; the video pauses when offscreen. (explicit)transform-style: preserve-3d with perspective around 1800px. (explicit)cqw so "Remembered" always fits. (explicit)*content* italic, "Let's create something worth remembering" large editorial-serif bold italic in hot-pink, and short lines such as "Perhaps…" and "Behind every…" kept as intentional line breaks. (explicit)prefers-reduced-motion. (explicit)IntersectionObserver and becomes active after Opening is opened.clip-path/SVG path.id, category, title, year, file, width, height, alt.VITE_MEDIA_BASE_URL and a tidy fallback for missing assets.#2A0F2E → #4B1D4F → #7A2E5C used for Content Marketing and Example Strategy.object-fit: contain on a paper mat, never cropped or stretched.

No comments yet. Be the first!