You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
What this is: A personal portfolio presented as a messaging interface. Visitors explore Arun Sharma's work, skills, education, projects, and contact paths through a chat-style thread rather than a conventional portfolio grid.
Who it is for: Recruiters, founders, operators, and peers who need to quickly understand Arun's strategy, growth, Chief of Staff, GTM, fundraising, and 0-to-1 operating experience.
Space: Personal executive/operator portfolio. Competitive research showed most developer portfolios converge on proof grids, cards, and polished gallery layouts. This product should win by sharpening the chat metaphor instead.
Project type: Static single-page web app, implemented in index.html with no build step.
Memorable thing: This should feel like an operator channel: private, high-signal, decisive, and credible.
Non-Negotiables
The interface stays a chat UI.
Preserve the single focused chat thread, profile/header bar, persona chips, topic buttons, chat bubbles, typing states, seen receipts, KPI toggle, timeline scrubber, light/dark toggle, and topic reveal behavior.
Do not convert the page into a landing page, card grid, bento layout, resume page, or generic SaaS dashboard.
Do not add decorative effects that compete with the conversation.
Aesthetic Direction
Direction: Executive darkroom.
Mood: Private, precise, and outcome-oriented. It should feel like entering a serious operator thread, not browsing a playful developer showcase.
Decoration level: Ambient texture.
Decoration rules:
Keep subtle grain, blur, controlled glow, and depth.
Use atmosphere to support the chat shell, not as the main visual event.
Avoid decorative blob/orb systems as the primary identity.
Rule: The dark operator shell remains stable. Only active states, reply rails, highlighted bubbles, focus outlines, metric chips, and small glows shift by topic.
Do not: Use random color, time-based full-page color shifts, or high-saturation backgrounds.
Base Tokens
Token
Dark
Light
Usage
--bg
#090806
#faf7f0
Page background
--surface
#12100c
#ffffff
Bubbles and raised surfaces
--surface-2
#19150f
#f5efe4
Header and nested surfaces
--text-primary
#f7f1e8
#17130d
Main text
--text-secondary
#b5a489
#6d5d45
Secondary text
--text-muted
rgba(247,241,232,0.38)
rgba(23,19,13,0.42)
Receipts, labels, hints
--border-soft
rgba(255,255,255,0.08)
rgba(23,19,13,0.08)
Neutral borders
--shadow-deep
rgba(0,0,0,0.34)
rgba(49,39,24,0.12)
Surface depth
Topic Accent Tokens
Each topic should define RGB plus solid, hover, soft background, border, and glow tokens. Keep saturation restrained.
Topic
Solid
RGB
Soft background
Border
Glow
Meaning
Work
#d99a2b
217,154,43
rgba(217,154,43,0.10)
rgba(217,154,43,0.34)
rgba(217,154,43,0.18)
Commercial proof and outcomes
Skills
#6f9ecb
111,158,203
rgba(111,158,203,0.10)
rgba(111,158,203,0.34)
rgba(111,158,203,0.16)
Capability and precision
Education
#8aa77a
138,167,122
rgba(138,167,122,0.10)
rgba(138,167,122,0.34)
rgba(138,167,122,0.15)
Foundation and range
About
#b8754a
184,117,74
rgba(184,117,74,0.10)
rgba(184,117,74,0.34)
rgba(184,117,74,0.15)
Personal warmth
Built
#4fa66f
79,166,111
rgba(79,166,111,0.10)
rgba(79,166,111,0.34)
rgba(79,166,111,0.16)
Shipping and momentum
Contact
#6ca8d8
108,168,216
rgba(108,168,216,0.10)
rgba(108,168,216,0.34)
rgba(108,168,216,0.16)
Clear action
Semantic Tokens
Token
Value
Usage
--success
#4fa66f
Contact availability and positive states
--warning
#d99a2b
Important but non-error emphasis
--error
#d45f5f
Validation or broken state only
--info
#6ca8d8
Neutral informational states
Dynamic Color Contract
Future UI implementation should introduce a topic-aware token layer without changing the page structure.
Implementation rule: openTopic(topic, event) may set document.documentElement.dataset.activeTopic = topic. Closing all topics should fall back to work or remove the attribute. Do not use color changes that obscure which content is active.
Spacing
Base unit: 4px.
Density: Compact but breathable.
Principle: The page should feel like an efficient conversation, not a padded marketing layout.
Token
Value
Usage
--space-2xs
2px
Hairline separations
--space-xs
4px
Micro gaps
--space-sm
8px
Button groups, inline chips
--space-md
12px
Message gaps
--space-lg
16px
Bubble padding, grouped controls
--space-xl
24px
Header to first message
--space-2xl
32px
Major reply sections
--space-3xl
48px
Top page padding
Layout
Approach: Focused column.
Primary width: 640px max for the chat thread.
Desktop: Center the chat column. Avoid side panels unless a later feature explicitly needs persistent context.
Mobile: Full-width thread with 16px side padding and no horizontal overflow.
Bubbles: Use asymmetric chat radii to preserve message identity.
Cards: Avoid card-in-card composition. Repeated content should still read as nested chat content, not separate dashboard cards.
Radius Scale
Token
Value
Usage
--radius-xs
4px
Focus outlines, tiny badges
--radius-sm
8px
Metric chips, nested elements
--radius-md
12px
Avatar, header controls
--radius-lg
16px
Header shell
--radius-chat
4px 18px 18px 18px
Incoming chat bubbles and typing
--radius-pill
999px
Pills only
Motion
Approach: Fast, precise.
Goal: Motion should make state changes legible and responsive, not theatrical.
Token
Value
Usage
--ease-enter
cubic-bezier(0.16, 1, 0.3, 1)
Message and topic entrance
--ease-exit
cubic-bezier(0.7, 0, 0.84, 0)
Collapse and fade out
--ease-standard
cubic-bezier(0.2, 0, 0, 1)
Hover and state changes
--duration-micro
80ms
Button press feedback
--duration-short
160ms
Hover and active state
--duration-medium
260ms
Typing fade, bubble reveal
--duration-long
420ms
Initial staggered intro
Motion Rules
Keep initial intro message stagger.
Keep typing indicators before reply reveal.
Keep seen receipts after message groups.
Keep topic button active feedback.
Reduce or remove decorative background motion.
Honor prefers-reduced-motion: reduce by disabling nonessential transitions and animations.
Component Usage Rules
Header: The header should feel like a contact card inside a messaging app. Keep profile photo, name, availability, call action, and theme toggle visible.
Persona chips: Use as shortcuts into intent-specific threads. Active persona may influence selected topic but should not fully restyle the page.
Topic buttons: Keep right-aligned message-app action chips. Active topic should use the current topic accent.
Reply rail: The left rail marks the active conversation branch. It should use --topic-accent-border.
Highlighted bubbles: Use for proof and major claims. Do not highlight every bubble.
Metrics: Use Geist Mono and topic accent backgrounds. Numbers should feel like evidence, not decoration.
Timeline scrubber: Keep compact. Color changes should reinforce the selected year or active topic without turning the page into a full atmospheric color shift.
Conversation Agent Controls
Keep the conversation agent as a promoted dock anchored to the main chat column, not as a separate side app or inline rebuild.
Use an icon-led speaker toggle for assistant voice replies. The control should keep aria-pressed, aria-label, and title aligned with the current voice reply state.
Show one Stop control only while agent work is active: recording, waiting on chat, fetching TTS, or playing audio. Stop should cancel active work silently, reset controls, and avoid adding a cancellation error bubble.
Accessibility
Maintain visible focus states on all interactive controls.
Preserve text contrast in dark and light themes.
Do not rely on color alone for active state; keep active borders, weight, or shadow.
Ensure touch targets are at least 36px high where practical.
Respect reduced-motion preferences.
Implementation Notes
index.html should load Geist and Geist Mono from Google Fonts.
index.html should use base tokens plus topic-aware tokens instead of amber-only component styling.
html should default to data-active-topic="work".
openTopic(topic, event) should update document.documentElement.dataset.activeTopic = topic.
Keep all existing topic IDs and interaction functions unless a later plan explicitly changes behavior.
Do not introduce a build step or dependency.
Decisions Log
Date
Decision
Rationale
2026-05-07
Created initial design system
Competitive research showed portfolio grids are table stakes; Arun ChatUI should stay chat-first and sharpen the operator-channel metaphor.
2026-05-07
Chose Executive darkroom
Fits strategy/growth credibility while avoiding generic developer portfolio polish.
2026-05-07
Kept chat UI as hard constraint
The messaging interface is the product's memorable advantage.
2026-05-07
Chose subtle contextual topic color
Delivers dynamic color without distracting from the conversation.
2026-05-07
Chose Geist family
User selected Geist for crisp executive typography.
2026-05-07
Applied design system to index.html
Added Geist loading, topic-aware tokens, and the data-active-topic interaction hook while preserving the chat UI.