magma-portfolio is a one-page portfolio website for Jassinta Roid Triniti, a Social Media Specialist, Content Creator, Videographer, and Graphic Designer. The site presents her personal brand and body of work — writing samples, a cassette disc, content marketing strategy, campus projects, a podcast, and an archive of locker items — as a single long, non-reloading page that is ready to deploy to Vercel as a static build.
The product intent is a playful, girly, textured portfolio that feels like a school locker, paper, stickers, a magazine, and a scrapbook: elegant yet cheerful. It is built for a Portfolio Visitor (a recruiter, client, or collaborator evaluating her work) and serves the Portfolio Owner by faithfully presenting her identity and work and by receiving inbound contact.
All website-facing text is in English. Specific work or article titles that are originally Indonesian are displayed as-is. All code, variable names, component names, and code comments are in English.
magma-portfolio is a client-only static web application. It is a single long page with no page reload; navigation between sections uses smooth scroll plus a table of contents. Locker-item "pop-up" views (Participation, Achievement, etc.) are full-screen overlays, not new routes, with a close button, Esc key support, and browser Back button support via hashes such as #/participation.
The site is built with React 18 + Vite + TypeScript + Tailwind CSS, animated with Framer Motion (or GSAP + ScrollTrigger where better suited to scroll-driven work, choosing one consistent approach per need), with Lenis (or equivalent) for smooth/inertial scroll that can be disabled during the Opening scroll-lock and while an overlay is open. The flipbook uses page-flip (StPageFlip) or react-pageflip, rendering PDFs with pdfjs-dist. The 3D locker uses CSS 3D transforms (perspective, transform-style: preserve-3d) and not Three.js, to stay light on phones. Fonts come from Fontshare (Sentient) and Google Fonts (the rest). The build outputs a static dist/ folder deployable to Vercel without a server.
There are no API keys on the client side and the website requires no API.
The entire accepted portfolio experience is delivered as one first-party, anonymously reachable long page. There is no account, no sign-in, and no server-side component: the visitor lands, scrolls, opens overlays, flips the flipbook, and reaches out through the Contact section. The Portfolio Owner does not operate a separate authenticated surface in the current scope; her role is the source of the portfolio content and the recipient of inbound contact.
Everything described in this document is current scope. No future-horizon features were accepted in the authoritative requirement thread; nothing in this document is deferred.
The only authoritative external reference is the Fontshare Sentient stylesheet (https://api.fontshare.com/v2/css?f[]=sentient@300,301,400,401,500,501,700,701&display=swap), used as a brand source. Verified facts:
font-display: swap; intended use is with preconnect for minimal layout shift.The single long page. It is anonymously reachable and owns every accepted portfolio responsibility, organized as full-bleed colour bands separated by blob curves, with a floating capsule table-of-contents rail at desktop that collapses to a bottom pill dock on mobile.
#/participation), Esc and browser Back handling.font-display: swap, preconnect, and fallbacks; no large layout shift./assets/...) show a tidy themed fallback per each section's rules — never a broken icon or error text.Each requirement is a distinct story point with provenance, lifecycle facts, and observable acceptance.
FR-1 — One-page portfolio delivery. As a Portfolio Visitor, I should land on a single long page that never reloads, so that I can browse Jassinta's work continuously.
FR-2 — Smooth scroll with table of contents. As a Portfolio Visitor, I should navigate between sections using smooth scroll and a table of contents, so that I can jump to the work I care about.
FR-3 — Locker-item overlays. As a Portfolio Visitor, I should open locker items (Participation, Achievement, etc.) as full-screen overlays, so that I can inspect an item without leaving the page.
#/participation.FR-4 — Overlay close, Esc, and browser Back. As a Portfolio Visitor, I should close an overlay with a close button, the Esc key, or the browser Back button, so that closing behaves the way I expect.
FR-5 — Opening scroll-lock and unlock. As a Portfolio Visitor, I should see a locked Opening stage until I open the locker, so that the first screen is a deliberate moment.
prefers-reduced-motion, the door opens without the morph and the page still unlocks.FR-6 — Lenis disable during lock and overlays. As a Portfolio Visitor, I should have smooth scroll disabled while the Opening is locked or an overlay is open, so that the locked stage and overlays behave correctly.
FR-7 — Flipbook with PDF rendering. As a Portfolio Visitor, I should flip through a PDF flipbook, so that I can read the document as a physical-feeling object.
FR-8 — CSS 3D locker. As a Portfolio Visitor, I should see the locker rendered in CSS 3D, so that it feels dimensional without being heavy on my phone.
perspective and transform-style: preserve-3d; the door swings on a 900ms cubic-bezier(0.2, 0.9, 0.1, 1) with the hot-pink glow seam brightening through the arc.prefers-reduced-motion, the morphs stop and the glow freezes.FR-9 — Section colour map. As a Portfolio Visitor, I should see each section in its specified colour band, so that the page reads as a designed object.
FR-10 — Personal Brand pure-white canvas. As a Portfolio Visitor, I should see the Personal Brand section on a pure-white canvas, so that the giant type reads as embossed paper.
--pure-white #FFFFFF; the giant Anton headline is set in pure white on pure white paper with only a cherry-red hairline underline.FR-11 — Fluid typography. As a Portfolio Visitor, I should see headlines and narration at the specified fluid sizes, so that text is readable at every viewport.
clamp(2.1rem, 1.2rem + 3.6vw, 4.125rem) with line-height 1.02, letter-spacing -0.01em, text-wrap: balance; narration uses clamp(1rem, 0.85rem + 0.7vw, 1.556rem) in Poppins italic with line-height 1.5, text-wrap: pretty, max width ~58ch; the gap token --headline-narration-gap: 1.5rem separates narration from headline.FR-12 — Font loading. As a Portfolio Visitor, I should see the intended typefaces without layout shift, so that the page feels stable.
font-display: swap, preconnect, and fallbacks; other fonts load from Google Fonts.'Fraunces', Georgia, serif, system-ui, sans-serif, etc.) render if a font fails.FR-13 — Asset fallbacks. As a Portfolio Visitor, I should see a tidy themed fallback when an asset is missing, so that the page never shows a broken icon or error text.
/assets/... fails to load.FR-14 — Contact. As a Portfolio Visitor, I should reach out through the Contact section, so that I can start a conversation with Jassinta.
FR-15 — Modular architecture. As the Portfolio Owner, I should have content data separated from components, so that I can update the portfolio without touching component code.
src/data/*.ts.FR-16 — Static Vercel build. As the Portfolio Owner, I should get a static dist/ build, so that I can deploy to Vercel without a server.
dist/ folder.FR-17 — No client-side API keys. As the Portfolio Owner, I should have no API keys on the client side, so that the site requires no API and stays safe.
FR-18 — English-only UI and code. As a Portfolio Visitor, I should read all website text in English, so that the portfolio is internationally legible.
FR-19 — Staged workflow and summaries. As the Portfolio Owner, I should receive a short summary after each stage, so that I know what was built, what remains TODO, and how to test it.
FR-20 — Literal, complete implementation. As the Portfolio Owner, I should have the specification followed literally and completely, so that no feature is silently dropped.
// TODO: comment rather than silently removing it.// TODO: comment is the recovery.FR-21 — Ambiguity resolution and DECISIONS.md. As the Portfolio Owner, I should have ambiguous decisions recorded, so that the reasoning is traceable.
DECISIONS.md.FR-22 — Stage isolation. As the Portfolio Owner, I should have other section files untouched during a stage, so that work stays contained.
A recruiter, client, or collaborator who lands on the one-page portfolio to evaluate Jassinta Roid Triniti's work across social media, content creation, videography, and graphic design. They arrive anonymously, often on a phone, and their primary goal is a complete, non-reloading browse of the portfolio that ends in a contact action.
Their distinct accepted responsibilities: scrolling through the sections via the table of contents and smooth scroll; opening the full-screen locker overlays (Participation, Achievement, etc.) to inspect individual items; flipping through the PDF flipbook; and finishing by using the Contact section to reach out. Their relevant inputs and decisions are which sections to visit, which locker items to open, and which contact channel to use. They interact with the Portfolio Owner only indirectly — through the content she authored and through the contact action they take. Their observable success is a complete browse that ends in a contact action.
What makes this role's work different: they are the sole active human actor in the running product. Every accepted interaction — the Opening lock, the overlays, the flipbook, the contact action — is theirs to initiate and complete.
The Social Media Specialist, Content Creator, Videographer, and Graphic Designer whose personal brand the site presents. She is the source of the portfolio content — writing samples, cassette disc, content marketing strategy, campus projects, podcast, and archive items — and the recipient of inbound contact.
Her primary goal is a deployed Vercel site that faithfully presents her work and identity in the playful, girly, textured theme. Her distinct accepted responsibilities are authoring the content data in src/data/*.ts, defining the section colour map and typography, and receiving inbound contact. Her relevant inputs and decisions are the content itself, the ambiguity decisions recorded in DECISIONS.md, and the staged build order. She interacts with the Portfolio Visitor only through the content she authored and the contact she receives. Her observable success is a static dist/ build deployed to Vercel that presents her work faithfully.
What makes this role's work different: she does not operate a running surface in the current scope. Her work is authoring and shipping, not browsing.
cubic-bezier(0.2, 0.9, 0.1, 1) with the hot-pink glow seam brightening through the arc; the locker body becomes candy-pink, the interior berry, the shelves blush. The page unlocks and Lenis re-enables.#/participation; Lenis is disabled./assets/... is missing, a tidy themed fallback per that section's rules is shown — never a broken icon or error text. If an overlay hash is invalid, the page stays usable. With prefers-reduced-motion, the morphs stop, the glow freezes, and marquee items wrap into rows.src/data/*.ts — writing samples, cassette disc, content marketing strategy, campus projects, podcast, and archive items — keeping content out of components.DECISIONS.md.dist/ folder.dist/ to Vercel without a server.// TODO: comment rather than silently removing it.The creative direction is Sensual pop minimalism after Karim Rashid — glossy candy colour, organic curves, optimism as a material. The muse is Karim Rashid. The brief's own palette is Rashid's: bubblegum, candy-pink, lilac, mint, glossy surfaces, plum-night as the dark ground. His language of organic capsule shapes, blob forms and liquid morphing is exactly the "playful, girly, textured" register the client asked for.
Headline: Optimism as a material — a glossy candy pop world that still reads as a designed object.
Pink (primary girly palette)
| Token | Hex | Role |
|---|---|---|
--hot-pink | #FF2E93 | Primary CTA, glow reveal, strong accent (inspired by the Elle reference) |
--barbie-pink | #E91E8C | Button hover, accent text, sticker |
--raspberry | #D81B72 | Accent lines, icons |
--bubblegum | #FF8DC7 | Highlight blocks, badges |
--candy-pink | #FFB3D9 | Open locker body, sticker |
--blush | #FFD6E8 | Soft section background, highlight blocks |
--rose-quartz | #F7CAD0 | Cards, paper |
--powder-pink | #FDE4EC | Bright section background |
--dusty-rose | #E8A5B8 | Coloured shadows, details |
--cherry-red | #E5173F | Italic headline red (The Campus, The Story, The Microphone), staple, pin |
--lipstick-red | #C8102E | Magazine elements (lips, ribbon) |
--coral-pop | #FF6F6F | Playful accent |
--peach-fizz | #FFB38A | Highlight blocks, labels |
--apricot | #FFD3B0 | Soft highlight |
Purple / Lavender
| Token | Hex | Role |
|---|---|---|
--lavender | #BFA8E5 | Envelope, cards, locker |
--lilac | #D4C1F5 | Section background, highlight blocks |
--wisteria | #A98BDA | Secondary accent |
--orchid | #DA9AF2 | Glow, gradient |
--grape-soda | #7B4FB8 | Text on pastels |
--berry | #7A2E5C | Open locker interior, warm dark panel |
--aubergine | #4B1D4F | Dark gradient |
--plum-night | #2A0F2E | Main dark background ("plum night gradient") |
Mint / Green / Pastel Blue
| Token | Hex | Role |
|---|---|---|
--mint-cream | #D4F2E4 | Soft background |
--pastel-mint | #A8E6CF | Highlight blocks, camera, cards |
--matcha | #B7D9A8 | Plant/detail accents |
--sage | #A9C4A0 | Neutral accent |
--baby-blue | #BFE3F5 | Highlight blocks, icons |
--sky-pastel | #A7D8F5 | Accent |
--periwinkle | #B8C4F2 | Accent |
--notebook-blue | #8FB8E8 | Ruled paper lines |
--steel-lilac | #B9B8CC | Closed locker (grey-lavender metal) |
Yellow / Cream / Paper
| Token | Hex | Role |
|---|---|---|
--butter | #FFF1A8 | Highlight blocks, sticky note |
--lemon-chiffon | #FFF6C9 | Soft highlight |
--vanilla | #FFF8EE | Warm cream background |
--aged-paper | #F3E3B8 | Yellowed paper (photo pin board) |
--honey | #F6D76B | Accent |
--milk-white | #FFFDF9 | White paper, text on dark |
--pure-white | #FFFFFF | Personal Brand canvas (mandatory pure white) |
Neutrals & Metals
| Token | Hex | Role |
|---|---|---|
--ink | #1B1017 | Primary text |
--espresso | #2B1B17 | Text on paper |
--cocoa | #5A3A2E | Wood/brown detail |
--walnut | #7A4A32 | Umbrella handle, wooden shelves |
--pearl | #F4EFF1 | Light neutral |
--warm-grey | #D9D3D6 | Lines, shadows |
--chrome | #C9CCD5 | Metal (handles, keys, vents) |
--gold | #D4A64A | Frames, trophies |
--champagne | #EBD08C | Gold highlight |
--staple-red | #D7263D | Staple/pin on paper |
--grad-plum-night: linear-gradient(160deg, #2A0F2E 0%, #4B1D4F 55%, #7A2E5C 100%)--grad-cotton-candy: linear-gradient(135deg, #FFD6E8 0%, #E3D4FA 50%, #CDEBF8 100%)--grad-bubblegum: linear-gradient(135deg, #FF8DC7 0%, #FF2E93 100%)--grad-lilac-mint: linear-gradient(135deg, #D4C1F5 0%, #D4F2E4 100%)Light mode (Opening wall, Personal Brand, Writing Portfolio, Project Campus): ground #F4EFF1 → #D9D3D6 wall; surfaces #FFB3D9 candy locker / #B9B8CC steel-lilac / #FFFDF9 milk-white paper; ink text #1B1017; primary #FF2E93 hot-pink; cherry-red #E5173F as the italic headline accent; mint #A8E6CF and butter #FFF1A8 as small candy blocks.
Dark mode (Content Marketing, Archive, Contact, video reveal): ground #2A0F2E plum-night → #4B1D4F aubergine → #7A2E5C berry; milk-white #FFFDF9 text; accent #DA9AF2 orchid glow behind #FF2E93 hot-pink; surfaces #7A2E5C berry with #BFA8E5 lavender hairlines.
Proportion: 70% ground, 20% pastel surface blocks, 8% ink/milk text, 2% hot-pink. Hot-pink is a signal, never a wash — it appears only on the primary CTA, the locker glow seam, and one accent word per headline.
| Section | Background | Text | Accent |
|---|---|---|---|
| Opening (closed) | Wall --pearl→--warm-grey; locker --steel-lilac | --ink | Multi-colour word blocks, --hot-pink button |
| Opening (open) | Locker --candy-pink; interior --berry; shelves --blush | --ink / --milk-white | --hot-pink |
| Personal Brand | --pure-white | --ink | --cherry-red, white document paper |
| Writing Portfolio hero | --powder-pink + grain | --ink | --hot-pink |
| Cassette disc | --blush→--lilac + grain | --ink | --hot-pink |
| Content Marketing | --grad-plum-night + film grain | --milk-white | --hot-pink glow |
| Example Strategy hero | --lilac + grain | --ink | --hot-pink |
| Example Strategy video reveal | --grad-plum-night, pink-checker floor | --milk-white | --hot-pink |
| Project Campus | --vanilla + --walnut wooden shelves | --ink | --cherry-red |
| Podcast | --blush | --ink | --cherry-red |
| Archive | --grad-plum-night | --milk-white | --hot-pink |
| Contact | --grad-plum-night + glow | --milk-white | --bubblegum |
| Role | Font | Fallback |
|---|---|---|
| Display / headline serif | Sentient (Fontshare) — Regular, Italic, Bold, Bold Italic | 'Fraunces', Georgia, serif |
| Body / narration | Poppins italic for narration (max 24.9px), Poppins regular 400/500/600 for UI | system-ui, sans-serif |
| Giant sans (Personal Brand) | Anton (ultra-bold condensed) | 'Archivo Black', Impact, sans-serif |
| Handwriting (letters) | Caveat (clearly legible) | 'Patrick Hand', cursive |
| Script "Fashion" (magazine) | Pinyon Script | 'Great Vibes', cursive |
| VOGUE elegant | Bodoni Moda 700–900 (or Playfair Display) | serif |
| OOTD bold | Bebas Neue | Oswald, Impact, sans-serif |
| Label / typewriter (archive cards, tags, credits) | DM Mono / Special Elite | monospace |
| Polaroid caption | Permanent Marker or Caveat | cursive |
Sentient is loaded via Fontshare at https://api.fontshare.com/v2/css?f[]=sentient@300,301,400,401,500,501,700,701&display=swap with font-display: swap, preconnect, and fallbacks to avoid layout shift. Odd-numbered variants (301, 401, 501, 701) are italics.
Type scale: 1.25 modular with a 66px display ceiling. Steps: 66 / 48 / 34 / 24.9 / 18 / 16 / 13. Labels and archive text: 13px DM Mono, uppercase, letter-spacing 0.12em.
Fluid rules:
font-size: clamp(2.1rem, 1.2rem + 3.6vw, 4.125rem); line-height: 1.02; letter-spacing: -0.01em; text-wrap: balance;font-size: clamp(1rem, 0.85rem + 0.7vw, 1.556rem); Poppins italic; line-height: 1.5; text-wrap: pretty; max width ~58ch.--headline-narration-gap: 1.5rem.Organic pop geometry. Capsules and pill buttons with fully rounded ends, blob section dividers that bulge into the next band, glossy capsule cards with a soft top highlight, curved locker-door edges rather than hard rectangles, and one continuous "liquid" SVG curve that runs down the page edge as a spine. Corners are either fully round (999px) or deliberately sharp — never a timid 8px. The locker is a rounded capsule volume in CSS 3D with a chrome handle and a hot-pink glow seam that widens as the door swings.
Full-bleed colour bands separated by bulbous blob curves rather than straight edges. Content sits in a 7-of-12 column with a floating capsule table-of-contents on the right at desktop, collapsing to a bottom pill dock on mobile.
Glossy 3D props and candy-coloured objects shot as if lit in a softbox: a lipstick, a cassette, a polaroid stack, a chrome key, a pair of headphones — all rendered as flat-illustrated glossy shapes with a single specular highlight, never stock photography. Real work imagery (thumbnail grids, video stills, magazine spreads) sits inside capsule frames with a hard pastel offset shadow. The locker interior is berry #7A2E5C with blush #FFD6E8 shelves and small glossy objects on each shelf. Textures: film grain over plum-night bands, subtle paper grain over powder-pink bands, nothing else.
The public entry is a scroll-locked CSS-3D capsule locker that is the entire first screen.
A pearl-to-warm-grey corridor wall fills the viewport. Dead centre sits a single steel-lilac capsule locker at roughly 60% of viewport height, rendered in CSS 3D with perspective on the stage and transform-style: preserve-3d on the door. The door is slightly ajar, and a hot-pink glow seam bleeds out of the gap. Around the locker, five flat candy word-blocks — SOCIAL, CONTENT, VIDEO, DESIGN, STORY — in bubblegum, butter, pastel-mint, baby-blue and lilac, each a rounded capsule, orbit the locker on a slow 20s float, never overlapping the name or the CTA. Below the locker, left-aligned on a 7-column measure, the name JASSINTA ROID TRINITI in Sentient at clamp(2.1rem, 1.2rem + 3.6vw, 4.125rem) with "Triniti" in cherry-red italic, and a single hot-pink capsule button "Open the locker" pinned beneath it.
There is no centred stack, no gradient blob, no blue button — the locker is the hero, the type sits beside it, and the whole stage is scroll-locked until the door opens. Activating the button swings the door on a 900ms cubic-bezier(0.2, 0.9, 0.1, 1) with the hot-pink glow seam brightening through the arc, the chrome handle rotating with the hinge, before the page unlocks and the band scrolls away.
This concept only recomposes accepted content, states and controls: the locker, the word-blocks, the name, the CTA, and the scroll-lock are all specified in the authoritative requirements.
Interaction Model: Animated Motion Tempo: expressive Hero Dimensionality: dimensional_css
cubic-bezier(0.2, 0.9, 0.1, 1) with the hot-pink glow seam brightening through the arc and the chrome handle rotating with the hinge → the page unlocks and the band scrolls away into the Personal Brand section.prefers-reduced-motion stops the morphs, freezes the glow, and shows all marquee items wrapped in rows. The door opens without the morph and the page still unlocks.NFR-1 — Performance. 60fps on a mid-range laptop. Provenance: explicit. Rationale: the brief's quality principles.
NFR-2 — No unintended horizontal scrollbar. No unintended horizontal scrollbar at any viewport. Provenance: explicit. Rationale: the brief's quality principles.
NFR-3 — No container overflow. No elements escape their container. Provenance: explicit. Rationale: the brief's quality principles.
NFR-4 — No large layout shifts. No large layout shifts; fonts load with font-display: swap, preconnect, and fallbacks. Provenance: explicit. Rationale: the brief's quality principles.
NFR-5 — Readable text and controls stay whole. Headlines, wordmarks, labels, numbers, cards' text and controls stay entirely inside the viewport and their container at 375px, 768px and 1280px, wrapping or scaling (for example font-size: clamp(...) with its mobile size) to fit, and no other element covers any part of them. Imagery, decoration and motion may be cropped, bled off an edge, rotated, overlapped or cut as the direction asks, as long as it covers no readable text or control. Moving and scrollable content (marquees, tickers, carousels, horizontally scrollable rows) may cross the viewport or container edge by design; with prefers-reduced-motion it stops and shows whole items, wrapping into rows or sitting in a horizontally scrollable row (overflow-x: auto). Provenance: explicit (creative direction). Rationale: accessibility and legibility.
NFR-6 — Static deployability. The build outputs a static dist/ folder deployable to Vercel without a server. Provenance: explicit. Rationale: the brief's deployment requirement.
NFR-7 — No client-side API keys. No API keys on the client side; the website requires no API. Provenance: explicit. Rationale: the brief's security constraint.
NFR-8 — CSS 3D only for the locker. The 3D locker uses CSS 3D transforms (perspective, transform-style: preserve-3d), not Three.js, to stay light on phones. Provenance: explicit. Rationale: the brief's performance constraint.
NFR-9 — Lenis disableability. Lenis (or equivalent) must be disableable during the Opening scroll-lock and while an overlay is open. Provenance: explicit. Rationale: the brief's scroll constraint.
NFR-10 — English-only UI and code. All website-facing text is fully in English; all code, variable names, component names, and code comments are in English. Specific work/article titles that are originally Indonesian are displayed as-is. Provenance: explicit. Rationale: the brief's language constraint.
NFR-11 — Content data separation. Content data lives in src/data/*.ts, not inside components. Provenance: explicit. Rationale: the brief's modular architecture constraint.
NFR-12 — Asset path and fallback. Assets (images/videos/PDFs) are referenced via /assets/... paths; when a file is missing, a tidy fallback is shown (not a broken icon, not error text) per each section's rules. Provenance: explicit. Rationale: the brief's asset constraint.
NFR-13 — No forbidden display typefaces. Nothing is set in Inter, Roboto, Arial, Helvetica, Open Sans, Lato, Poppins-as-heading, or system-ui for any display type. Provenance: explicit (creative direction). Rationale: the direction's typography rule.
NFR-14 — No blue/indigo primary or accent. Blue or indigo must not appear as a primary or accent; baby-blue and periwinkle may appear only as 1-of-5 candy blocks, never as a CTA or link colour. The generic indigo/blue-on-white SaaS template is forbidden. Provenance: explicit (creative direction). Rationale: the direction's palette rule.
NFR-15 — Flat offset shadows only. Shadows are always flat offset capsules in a named pastel, never soft blurred drop shadows. Provenance: explicit (creative direction). Rationale: the direction's shape language.
NFR-16 — No glassmorphism. Translucency is done with flat pastel at 60% opacity and hairline lavender borders, not backdrop-filter. Provenance: explicit (creative direction). Rationale: the direction's surface rule.
perspective, transform-style: preserve-3d), not Three.js. (explicit)dist/ folder, deployable to Vercel without a server. (explicit)dist/ build deploys to Vercel without a server. (required_inference: the explicit static-deployment constraint makes container orchestration unnecessary.)Assumptions
DECISIONS.md. [Assumption — explicit rule.]Constraints
src/data/*.ts, not inside components. (explicit)/assets/... paths; missing files must show a tidy fallback, not a broken icon or error text. (explicit)dist/ folder deployable to Vercel without a server. (explicit)// TODO: comment rather than silently removing it. (explicit)--pure-white #FFFFFF). (explicit)backdrop-filter. (explicit — creative direction)#/participation).#2A0F2E, used in the --grad-plum-night gradient.font-display: swap, preconnect, and fallbacks.No completed page designs yet.
Completed design pages will appear here when they are ready to preview.
No completed page designs yet.
Completed design pages will appear here when they are ready to preview.
No comments yet. Be the first!