Meshal Theme Prompt
Meshal Theme Prompt
Source: meshal-theme-prompt.md (ingested 2026-04-15)
meshal.ai — Implementation Prompt & Design System
Paste this file as context when working on meshal.ai in your IDE or CLI. It contains: implementation intent, design token definitions, component patterns, and the ninja character system.
1 · Implementation Intent
You are implementing the frontend for meshal.ai, the personal portfolio of Meshal Alawein. The site is a portfolio + technical CV hybrid built in React + Vite + TypeScript + Tailwind CSS.
Primary goal: Every design decision should communicate technical precision and editorial calm. The aesthetic is a dark, near-black base with a single warm gold accent, subtle ambient background effects, and Newsreader serif for content. Nothing should feel loud or decorative for its own sake.
What this is not: A SaaS landing page. No hero gradients on the name. No glowing colored pills everywhere. No sections competing for attention with different accent colors.
2 · Design Token System
Define these as CSS custom properties on :root. All components must reference tokens — no raw hex values in component code.
2.1 Color Tokens
:root {
/* ── Backgrounds (darkest → lightest) ── */
--color-bg-base: #0d0c12; /* page background */
--color-bg-raised: #131220; /* cards, panels */
--color-bg-elevated: #1e1c2e; /* hover states, active */
/* ── Borders ── */
--color-border-subtle: #28273a; /* default card borders */
--color-border-default: #3c3a52; /* hover borders */
/* ── Gold (primary accent — ALL interactive chrome) ── */
--color-gold: #c9a55a;
--color-gold-dim: #a08040;
--color-gold-muted: rgba(201, 165, 90, 0.09); /* bg tint */
--color-gold-border: rgba(201, 165, 90, 0.28); /* border tint */
/* ── Text ── */
--color-text-primary: #f0ece2; /* headings, primary content */
--color-text-secondary: #878294; /* body copy, descriptions */
--color-text-tertiary: #4c4960; /* labels, metadata, dimmed */
/* ── Semantic status (minimal use) ── */
--color-status-ok: #00c870; /* availability dot, tagline cursor */
/* ── Category accents (2px borders + 5px dots ONLY — not text) ── */
--color-cat-a: rgba(74, 136, 155, 0.55); /* teal — AI/agent */
--color-cat-b: rgba(138, 80, 108, 0.55); /* mauve — ML/research */
--color-cat-c: rgba(138, 122, 56, 0.55); /* amber — product */
--color-cat-d: rgba( 74, 120, 90, 0.55); /* sage — delivery */
/* ── Ninja logo colors (fixed — do not theme these) ── */
--ninja-body: #1a1a2e;
--ninja-band: #ff00ff;
--ninja-eye: #00f0ff;
--ninja-blade: #f0f000;
}
2.2 Typography Tokens
:root {
--font-sans: 'DM Sans', 'Helvetica Neue', sans-serif;
--font-serif: 'Newsreader', Georgia, serif;
--font-mono: 'JetBrains Mono','Courier New', monospace;
/* ── Scale ── */
--text-xs: 0.625rem; /* 10px — nav links, tags, labels */
--text-sm: 0.6875rem; /* 11px — secondary labels */
--text-base: 0.75rem; /* 12px — body small, descriptions */
--text-md: 0.875rem; /* 14px — body default */
--text-lg: 1rem; /* 16px — body large, bios */
--text-xl: 1.125rem; /* 18px — card titles */
--text-2xl: clamp(1.75rem, 3.5vw, 2.625rem); /* section titles */
--text-hero: clamp(3rem, 8vw, 5.5rem); /* hero name */
/* ── Line heights ── */
--leading-tight: 0.95;
--leading-snug: 1.15;
--leading-normal: 1.6;
--leading-relaxed:1.88;
/* ── Letter spacing ── */
--tracking-tight: -0.03em;
--tracking-normal: 0;
--tracking-wide: 0.1em;
--tracking-wider: 0.14em;
--tracking-widest: 0.22em;
}
2.3 Spacing & Radius Tokens
:root {
--space-1: 4px;
--space-2: 8px;
--space-3: 12px;
--space-4: 16px;
--space-5: 20px;
--space-6: 24px;
--space-8: 32px;
--space-10: 40px;
--space-12: 48px;
--space-18: 72px;
--radius-sm: 3px; /* buttons */
--radius-md: 5px; /* cards, inputs */
--radius-lg: 7px; /* panels, larger cards */
--radius-xl: 10px; /* ninja panel */
--radius-pill:99px; /* tags, status badges */
--max-w-content: 1200px;
--nav-h: 54px;
}
2.4 Effect Tokens
:root {
--shadow-gold-sm: 0 0 12px rgba(201, 165, 90, 0.12);
--shadow-gold-md: 0 0 24px rgba(201, 165, 90, 0.18);
--glow-ninja-logo: drop-shadow(0 0 7px rgba(0, 240, 255, 0.22));
--blur-nav: blur(20px) saturate(1.4);
--transition-fast: all 0.15s ease;
}
3 · Theme Variants
The site supports a single base theme plus two alternate themes switchable via data-theme on <html>. All variants use the same token names — only values change.
3.1 data-theme="default" — Gold/Dark (production)
As defined above. Gold primary, Newsreader serif body, near-black base.
3.2 data-theme="monochrome" — Platinum
[data-theme="monochrome"] {
--color-gold: #d0ccc4;
--color-gold-dim: #a0a09a;
--color-gold-muted: rgba(208, 204, 196, 0.08);
--color-gold-border: rgba(208, 204, 196, 0.22);
--color-bg-base: #0e0e10;
--color-bg-raised: #141416;
--color-bg-elevated: #1e1e22;
--color-border-subtle: #262628;
--color-border-default: #3a3a3e;
--color-text-primary: #f4f0ec;
--color-text-secondary: #808080;
--color-text-tertiary: #484848;
}
3.3 data-theme="cold" — Cyan/Dark
[data-theme="cold"] {
--color-gold: #00c8d4;
--color-gold-dim: #008a94;
--color-gold-muted: rgba(0, 200, 212, 0.08);
--color-gold-border: rgba(0, 200, 212, 0.25);
--color-bg-base: #080d12;
--color-bg-raised: #0e141c;
--color-bg-elevated: #181f2a;
--color-border-subtle: #1a2030;
--color-border-default: #283040;
--color-text-primary: #e4eef4;
--color-text-secondary: #7a8898;
--color-text-tertiary: #485060;
}
4 · Component Patterns
Button system (three tiers, gold-only)
// Primary — filled gold
<button className="btn btn-fill">View Project Index</button>
// Secondary — gold outline
<button className="btn btn-line">Explore Services</button>
// Tertiary — neutral ghost
<button className="btn btn-ghost">Start a Conversation</button>
.btn {
font-family: var(--font-mono);
font-size: var(--text-xs);
font-weight: 600;
letter-spacing: var(--tracking-wide);
text-transform: uppercase;
padding: 9px 18px;
border-radius: var(--radius-sm);
border: 1px solid;
transition: var(--transition-fast);
}
.btn-fill { color: var(--color-bg-base); background: var(--color-gold); border-color: var(--color-gold); }
.btn-line { color: var(--color-gold); background: transparent; border-color: var(--color-gold-border); }
.btn-ghost { color: var(--color-text-secondary); background: transparent; border-color: var(--color-border-subtle); }
Section anatomy
Every section follows this structure:
<section id="slug" className="csec">
<p className="s-tag">01 · Label</p> {/* mono, gold, uppercase */}
<h2 className="s-title">Heading<br /><em>italic subline</em></h2>
{/* content */}
</section>
Card hover pattern
.card {
background: var(--color-bg-raised);
border: 1px solid var(--color-border-subtle);
border-radius: var(--radius-lg);
transition: var(--transition-fast);
}
.card:hover {
border-color: var(--color-gold-border);
transform: translateY(-2px);
}
5 · Ninja Character System
The nav logo and arena ninjas share the same 8×12 pixel grid. Characters differ only in their color map. The pixel value keys are fixed:
| Value | Semantic role |
|---|---|
| 0 | transparent |
| 1 | body |
| 2 | headband / accent band |
| 3 | eyes |
| 4 | katana / weapon |
The arena uses two opposing ninjas: A faces right (original grid), B faces left (mirrored). Choose one character per slot from the table below, or use the defaults.
5.1 Character Roster
| ID | Name | Headband [2] | Eyes [3] | Blade [4] | Body [1] | Personality |
|---|---|---|---|---|---|---|
| shogun | Shogun (default logo) | #ff00ff magenta | #00f0ff cyan | #f0f000 yellow | #1a1a2e | Balanced. The original. Named after a math concept. |
| crimson | Crimson | #cc1500 blood red | #ff3535 flame | #ff7a00 molten | #1e1c32 | Aggressive. Deploys pain to prod. |
| void | Void | #6600bb purple | #99ff28 acid green | #44aaff ice | #141220 | Cold and calculating. Returns errors, doesn't throw. |
| gold | Aurum | #c9a55a gold | #f0e080 warm | #e8e8e8 silver | #1a1620 | Morphism-aligned. Governance-first. |
| ghost | Ghost | #888899 slate | #ffffff white | #aabbdd pale blue | #28283a | Silent. No banter. Just converges. |
| oni | Oni | #00c870 green | #ff4488 pink | #ffaa00 amber | #1a0e14 | Chaotic good. Prefers dark mode. Light attracts bugs. |
| rust | Rust | #dd6622 rust | #ffcc44 yellow | #cc3344 crimson | #1c1410 | Memory-safe. Owns everything by move. |
| teal | Ghost Protocol | #22bbaa teal | #88ffee mint | #ffffff white | #0e1818 | Recon only. Never fights first. |
5.2 Usage
// In your arena config — pick two characters
const arenaA: NinjaCharacter = NINJA_CHARS['crimson']; // faces right
const arenaB: NinjaCharacter = NINJA_CHARS['void']; // faces left (mirrored)
// Nav logo is always 'shogun' — do not change
// types
type NinjaColors = { body: string; band: string; eyes: string; blade: string };
type NinjaCharacter = { id: string; name: string; colors: NinjaColors };
const NINJA_CHARS: Record<string, NinjaCharacter> = {
shogun: { id:'shogun', name:'Shogun', colors:{ body:'#1a1a2e', band:'#ff00ff', eyes:'#00f0ff', blade:'#f0f000' }},
crimson: { id:'crimson', name:'Crimson', colors:{ body:'#1e1c32', band:'#cc1500', eyes:'#ff3535', blade:'#ff7a00' }},
void: { id:'void', name:'Void', colors:{ body:'#141220', band:'#6600bb', eyes:'#99ff28', blade:'#44aaff' }},
gold: { id:'gold', name:'Aurum', colors:{ body:'#1a1620', band:'#c9a55a', eyes:'#f0e080', blade:'#e8e8e8' }},
ghost: { id:'ghost', name:'Ghost', colors:{ body:'#28283a', band:'#888899', eyes:'#ffffff', blade:'#aabbdd' }},
oni: { id:'oni', name:'Oni', colors:{ body:'#1a0e14', band:'#00c870', eyes:'#ff4488', blade:'#ffaa00' }},
rust: { id:'rust', name:'Rust', colors:{ body:'#1c1410', band:'#dd6622', eyes:'#ffcc44', blade:'#cc3344' }},
teal: { id:'teal', name:'Ghost Protocol', colors:{ body:'#0e1818', band:'#22bbaa', eyes:'#88ffee', blade:'#ffffff' }},
};
5.3 Banter personality guide
Each character has a default banter style. When implementing the speech bubble system, pull lines from the character's pool:
| Character | Tone | Sample lines |
|---|---|---|
| Shogun | Dry / precise | "I converge. You diverge." · "DFT converged. ur move." |
| Crimson | Aggressive / hot | "deploying pain to prod." · "Skill issue. (╯°□°)╯" |
| Void | Cold / calculated | "try { win() } catch(e) {}" · "undefined behavior incoming" |
| Aurum | Formal / governance | "READ → VERIFY → EXECUTE." · "κ < 1. you lose." |
| Ghost | Silent | (no speech bubbles — just floats) |
| Oni | Chaotic | "light attracts bugs." · "¯\\_(ツ)_/¯" |
| Rust | Ownership metaphors | "I own this fight. By move." · "borrow checker says no." |
| Ghost Protocol | Tactical | "recon complete." · "exfiltrating." |
6 · Page Structure (canonical routes)
| Route | Title | Sections |
|---|---|---|
| / | Home | Hero · Background · Experience · Capabilities · Selected Work · Services · Work with Me · Contact |
| /projects | Projects | Index header · stats · project grid · CTA to services |
| /services | AI Systems Services | 6-card service grid · CTA to engagements |
| /engagements | Engagement Models | 3-tier pricing · FAQ · custom scope CTA |
| /cv | CV | Summary · Experience timeline · Education · Technical Skills · Publications |
The homepage consolidates all pages into one scrollable document. Sub-pages (/projects, /services, /engagements, /cv) are standalone deep-links for sharing and direct access. They should share nav, footer, and all design tokens. Do not duplicate content — each sub-page should expand its section with more detail than the homepage snapshot.
7 · Background System
Three layered canvases, all pointer-events:none, stacked under z-index:3 content:
| Layer | z-index | Opacity | Description |
|---|---|---|---|
| city-bg | 0 | 0.065 | Procedural Tokyo skyline: 3 building depth layers, twinkling amber windows, moon, horizon glow |
| bg-rain | 1 | 0.10 | Sparse gold-dominant code rain (λ Σ ∫ ∂ ∇ …) with slow large ambient floaters rising upward |
| (CSS) | 2 | — | body::before film grain (SVG feTurbulence, 0.028 opacity) + body::after edge vignette |
The city background uses pixel-art image-rendering:pixelated. Window flicker is driven by per-window tick counters, not CSS animations.
8 · Copy Rules (enforced in all components)
- Section number prefix:
01 ·,02 ·etc — mono, gold, uppercase - Section titles: Newsreader 300, sentence case, never all-caps
- All labels, tags, metadata: JetBrains Mono
- Avoid: "passionate about", "leveraging", "innovative", "I'm excited to"
- Tagline rotation prefix:
//in--color-text-tertiary, text in--color-status-ok - Inline comments (CV timeline notes):
// lowercase. dry.in--color-text-tertiary - Hero bio: Newsreader italic. Max 2 sentences. First-person. No fluff.