Remixes of portfolio.vynn.dev
Latest remixes
No public remixes yet. Be the first to make one.
Remix itLatest remixes
No public remixes yet. Be the first to make one.
Remix itSwitch between the rendered Visual preview and the Raw DESIGN.md.
version: alpha
name: Portfolio
description: |
VynDev's design system embodies a dark, minimalist technical aesthetic paired
with purposeful green accents that signal actionability and energy. The visual
language prioritizes deep blacks and near-black surfaces (#080808, #111111)
that recede into the background, allowing content and interaction points to
breathe. Typography is bold and confident—particularly the display sizes with
aggressive negative letter-spacing that creates visual tension and draws the
eye. The system favors stark contrast between text and background, coupled
with subtle micro-interactions (lift on hover, slight scale, drift) that
reward exploration without overwhelming. Every element feels purposefully
placed in a grid-based, spacious layout where whitespace is as much a design
decision as color. The brand accent green (#22C55E) punctuates the achromatic
palette, appearing as a status indicator and availability signal, reinforcing
a sense of activeness and readiness.
source:
url: "https://portfolio.vynn.dev"
pagesAnalyzed: 2
extractedAt: 2026-11-04
tokensMeasured: true
colors:
primary: "#FFFFFF"
accent: "#22C55E"
canvas: "#080808"
surface: "#111111"
on-primary: "#080808"
ink: "#FFFFFF"
body: "#A0A0A0"
muted: "#444444"
typography:
display-xxl:
fontFamily: Inter
fontSize: 128px
fontWeight: 800
lineHeight: 0.95
letterSpacing: -5.76px
display-xl:
fontFamily: Inter
fontSize: 48px
fontWeight: 700
lineHeight: 1.1
letterSpacing: -1.44px
heading-md:
fontFamily: Inter
fontSize: 35.2px
fontWeight: 800
lineHeight: 1
letterSpacing: -1.41px
heading-sm:
fontFamily: Inter
fontSize: 16.8px
fontWeight: 600
letterSpacing: -0.17px
body-xl:
fontFamily: Inter
fontSize: 21.6px
fontWeight: 400
letterSpacing: -0.22px
body-lg:
fontFamily: Inter
fontSize: 16px
fontWeight: 400
lineHeight: 1.8
letterSpacing: 0px
body-lg-strong:
fontFamily: Inter
fontSize: 16px
fontWeight: 700
letterSpacing: -0.32px
body-md:
fontFamily: Inter
fontSize: 13.6px
fontWeight: 400
lineHeight: 1.7
letterSpacing: 0px
body-md-strong:
fontFamily: Inter
fontSize: 13.6px
fontWeight: 500
letterSpacing: 0px
body-sm:
fontFamily: Inter
fontSize: 12.48px
fontWeight: 400
letterSpacing: 0px
button:
fontFamily: Inter
fontSize: 11.2px
fontWeight: 700
letterSpacing: 0.9px
caption-lg:
fontFamily: Inter
fontSize: 11.52px
fontWeight: 600
letterSpacing: 0.69px
textTransform: uppercase
caption-lg-strong:
fontFamily: Inter
fontSize: 11.52px
fontWeight: 700
letterSpacing: 0.69px
textTransform: uppercase
caption-md:
fontFamily: Inter
fontSize: 11.2px
fontWeight: 700
letterSpacing: 1.34px
textTransform: uppercase
caption-sm:
fontFamily: Inter
fontSize: 10.88px
fontWeight: 700
letterSpacing: 0.65px
textTransform: uppercase
caption-xs:
fontFamily: Inter
fontSize: 10.4px
fontWeight: 700
letterSpacing: 0.73px
textTransform: uppercase
rounded:
none: 0px
xs: 8px
sm: 12px
md: 18px
full: 9999px
spacing:
xxs: 4px
xs: 8px
sm: 12px
md: 16px
lg: 20px
xl: 24px
xxl: 36px
xxxl: 40px
section: 48px
band: 64px
borderWidths:
thin: 1px
elevationStrategy: color-blocking
themes:
derived: light # the other theme is the site's measured palette
light:
bg: "#F9FDFB"
surface: "#EFF3F1"
surfaceRaised: "#E8EBE9"
text: "#121A15"
textMuted: "#696F6C"
border: "#D6DAD8"
accent: "#167F3D"
accentFg: "#FFFFFF"
focusRing: "#1CA24D"
elevation: shadow
dark:
bg: "#080808"
surface: "#111111"
surfaceRaised: "#242424"
text: "#FFFFFF"
textMuted: "#A0A0A0"
border: "#262626"
accent: "#22C55E"
accentFg: "#080808"
focusRing: "#22C55E"
elevation: "border+surface"
components:
button-primary:
textColor: "{colors.on-primary}"
height: 39px
padding: "10px 20px 10px 20px"
fontSize: 14px
fontFamily: Inter
fontWeight: 500
rounded: "{rounded.sm}"
backgroundColor: "{colors.primary}"
button-primary-sm:
typography: "{typography.body-md-strong}"
textColor: "{colors.ink}"
height: 28px
padding: "6px 14px 6px 14px"
rounded: "{rounded.xs}"
backgroundColor: "rgba(255, 255, 255, 0.06)"
button-outline:
textColor: "{colors.body}"
border: "1px solid rgba(255, 255, 255, 0.07)"
height: 39px
padding: "10px 20px 10px 20px"
fontSize: 14px
fontFamily: Inter
fontWeight: 500
rounded: "{rounded.sm}"
button-outline-sm:
typography: "{typography.button}"
textColor: "{colors.body}"
border: "1px solid rgba(255, 255, 255, 0.07)"
height: 26px
padding: "5px 10px 5px 10px"
rounded: "{rounded.xs}"
card:
textColor: "{colors.ink}"
border: "1px solid rgba(255, 255, 255, 0.07)"
fontSize: 16px
fontFamily: Inter
fontWeight: 400
rounded: "{rounded.md}"
backgroundColor: "{colors.surface}"
card-sm:
textColor: "{colors.ink}"
fontSize: 16px
fontFamily: Inter
fontWeight: 400
backgroundColor: "rgb(14, 14, 14)"
badge-primary:
textColor: "{colors.body}"
border: "1px solid rgba(255, 255, 255, 0.07)"
height: 29px
padding: "6px 14px 6px 14px"
fontSize: 12.8px
fontFamily: Inter
fontWeight: 400
rounded: 100px
backgroundColor: "rgba(255, 255, 255, 0.04)"
badge-primary-sm:
typography: "{typography.caption-xs}"
textColor: "{colors.muted}"
border: "1px solid rgba(255, 255, 255, 0.07)"
height: 21px
padding: "3px 9px 3px 9px"
rounded: 100px
backgroundColor: "rgba(255, 255, 255, 0.04)"
navigation:
textColor: "{colors.ink}"
height: 60px
fontSize: 16px
fontFamily: Inter
fontWeight: 400
backgroundColor: "rgba(8, 8, 8, 0.82)"
footer:
textColor: "{colors.ink}"
border: "1px solid rgba(255, 255, 255, 0.07)"
padding: "36px 0px 36px 0px"
fontSize: 16px
fontFamily: Inter
fontWeight: 400
link:
typography: "{typography.body-md-strong}"
textColor: "{colors.body}"
padding: "6px 14px 6px 14px"
rounded: "{rounded.xs}"
link-sm:
typography: "{typography.body-lg-strong}"
textColor: "{colors.ink}"
states:
nav-hover:
target: nav
state: hover
opacity: 0.65
button-hover:
target: button
state: hover
backgroundColor: "rgba(255, 255, 255, 0.05)"
card-hover:
target: card
state: hover
transform: "translateY(-3px)"
link-hover:
target: link
state: hover
transform: "translateX(5px)"
input-focus:
target: input
state: focus
borderColor: "rgba(255, 255, 255, 0.28)"
breakpoints:
- width: 375
containerWidth: 375
gridColumns: 3
navLinksVisible: 4
menuToggleVisible: false
headingPx: 53
bodyPx: 16
sectionPaddingX: 0
- width: 768
containerWidth: 540
gridColumns: 6
navLinksVisible: 4
menuToggleVisible: false
headingPx: 72
bodyPx: 16
sectionPaddingX: 0
- width: 1024
containerWidth: 580
gridColumns: 6
navLinksVisible: 8
menuToggleVisible: false
headingPx: 92
bodyPx: 16
sectionPaddingX: 0
- width: 1280
containerWidth: 1160
gridColumns: 6
navLinksVisible: 8
menuToggleVisible: false
headingPx: 115
bodyPx: 16
sectionPaddingX: 0
- width: 1440
containerWidth: 1160
gridColumns: 6
navLinksVisible: 8
menuToggleVisible: false
headingPx: 128
bodyPx: 16
sectionPaddingX: 0
coverage:
statesFound: 18
gradientsFound: 0
rolesUnassigned: 0
archetypesUnnamed: 0
archetypesDetected: 0
responsiveMeasured: true
stylesheetsBlocked: true
semanticRampDeclared: false
VynDev's design system embodies a dark, minimalist technical aesthetic paired with purposeful green accents that signal actionability and energy. The visual language prioritizes deep blacks and near-black surfaces ({colors.canvas} — #080808, {colors.surface} — #111111) that recede into the background, allowing content and interaction points to breathe. Typography is bold and confident—particularly the display sizes with aggressive negative letter-spacing that creates visual tension and draws the eye. The system favors stark contrast between text and background, coupled with subtle micro-interactions (lift on hover, slight scale, drift) that reward exploration without overwhelming. Every element feels purposefully placed in a grid-based, spacious layout where whitespace is as much a design decision as color. The brand accent green ({colors.accent} — #22C55E) punctuates the achromatic palette, appearing as a status indicator and availability signal, reinforcing a sense of activeness and readiness.
Key Characteristics:
{rounded.full}) contrasted against sharp card corners{colors.primary} — #FFFFFF): Primary CTA fill, all primary headings, brand mark, high-contrast body text, and active/hover states on interactive elements. Delivers the system's main visual weight.{colors.accent} — #22C55E): Status indicator, availability signal, accent marks alongside neutral typography. Provides energy and signals live/active states.{colors.canvas} — #080808): Default page background. Creates the deep foundation upon which all cards and text sit.{colors.surface} — #111111): Card and panel backgrounds. Slightly elevated from canvas to create minimal visual separation.{colors.body} — #A0A0A0): Primary body copy text. Readable on dark backgrounds; sits between #FFFFFF and #444444 in the contrast ladder.{colors.muted} — #444444): Secondary text, captions, and labels. Used for reduced emphasis and hierarchical separation.font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif| Role | Font | Size | Weight | Line Height | Letter Spacing | Notes |
|---|---|---|---|---|---|---|
| Display XXL | Inter | 128px | 800 | 0.95 | -5.76px | Hero/main name. Extreme negative tracking creates visual drama. |
| Display XL | Inter | 48px | 700 | 1.1 | -1.44px | Section headings, hero subheadings. Bold tracking compression. |
| Heading MD | Inter | 35.2px | 800 | 1 | -1.41px | Large card or section titles. Tight, deliberate spacing. |
| Heading SM | Inter | 16.8px | 600 | not measured | -0.17px | Subsection titles, small headings. |
| Body XL | Inter | 21.6px | 400 | not measured | -0.22px | Larger body, intro text. Slight tracking adjustment. |
| Body LG Strong | Inter | 16px | 700 | not measured | -0.32px | Emphasized body copy, labels. |
| Body LG | Inter | 16px | 400 | 1.8 | 0px | Primary body copy. Generous line height for readability. |
| Body MD Strong | Inter | 13.6px | 500 | not measured | 0px | Links, emphasized smaller text. |
| Body MD | Inter | 13.6px | 400 | 1.7 | 0px | Secondary body copy, descriptions. |
| Body SM | Inter | 12.48px | 400 | not measured | 0px | Small body text, dense copy. |
| Button | Inter | 11.2px | 700 | not measured | 0.9px | Primary and secondary button text. All-caps styling in some contexts. |
| Caption LG Strong | Inter | 11.52px | 700 | not measured | 0.69px | Emphasis on small caps. Uppercase. |
| Caption LG | Inter | 11.52px | 600 | not measured | 0.69px | Elevated caption. Uppercase. |
| Caption MD | Inter | 11.2px | 700 | not measured | 1.34px | Wide-tracked small labels. Uppercase. |
| Caption SM | Inter | 10.88px | 700 | not measured | 0.65px | Smallest caption size. Uppercase. |
| Caption XS | Inter | 10.4px | 700 | not measured | 0.73px | Minimal label. Uppercase. |
{colors.primary} (#FFFFFF).Primary Button
{colors.primary} (#FFFFFF){colors.canvas} (#080808)10px 20px14px, weight 500{rounded.xs} (8px)176px, height: 39pxrgba(255, 255, 255, 0.88), box-shadow rgba(255, 255, 255, 0.1) 0px 8px 24px, transform translateY(-1px)Primary Button Small
rgba(255, 255, 255, 0.06){colors.primary} (#FFFFFF)6px 14px13.6px, weight 500{rounded.xs} (8px)66px, height: 28pxrgba(255, 255, 255, 0.05), transform translateY(-1px), box-shadow rgba(255, 255, 255, 0.08) 0px 6px 20pxOutline Button
transparent{colors.body} (#A0A0A0)10px 20px14px, weight 5001px solid rgba(255, 255, 255, 0.07){rounded.xs} (8px)154px, height: 39pxrgba(255, 255, 255, 0.05), border color updated, text color {colors.primary} (#FFFFFF), transform translateY(-1px)Outline Button Small
transparent{colors.body} (#A0A0A0)5px 10px11.2px, weight 7001px solid rgba(255, 255, 255, 0.07){rounded.xs} (8px)37.8px, height: 26px0.9pxrgba(255, 255, 255, 0.04), transform translateY(-1px)Card Default
{colors.surface} (#111111){colors.primary} (#FFFFFF)1px solid rgba(255, 255, 255, 0.07){rounded.md} (18px)0px (content handled internally)348px, height: 405px16px, weight 400translateY(-5px), border color brightened, box-shadow rgba(0, 0, 0, 0.55) 0px 24px 60px, filter grayscale(0) brightness(1), transform scale(1.08)Card Default Small
rgb(14, 14, 14){colors.primary} (#FFFFFF){rounded.none} (0px)0px346px, height: 170px16px, weight 400scale(1.05), filter grayscale(0) brightness(1)Badge Primary
rgba(255, 255, 255, 0.04){colors.body} (#A0A0A0)1px solid rgba(255, 255, 255, 0.07){rounded.full} (9999px)6px 14px12.8px, weight 400153px, height: 29pxBadge Primary Small
rgba(255, 255, 255, 0.04)rgb(68, 68, 68)1px solid rgba(255, 255, 255, 0.07){rounded.full} (9999px)3px 9px10.4px, weight 70094.3px, height: 21px0.73pxInput Focus State
rgba(255, 255, 255, 0.28) (on focus)rgba(255, 255, 255, 0.07)Navigation Default
rgba(8, 8, 8, 0.82) (semi-transparent canvas with slight opacity){colors.primary} (#FFFFFF)60px0px16px, weight 400{rounded.none} (0px)0.65, background rgba(255, 255, 255, 0.06), text color {colors.primary} (#FFFFFF)Link Default
transparent{colors.body} (#A0A0A0)6px 14px13.6px, weight 500{rounded.xs} (8px)81px, height: 28pxtranslateX(5px), color {colors.primary} (#FFFFFF), background rgba(255, 255, 255, 0.05)Link Default Small
transparent{colors.primary} (#FFFFFF)0px16px, weight 700{rounded.none} (0px)79.1px, height: 20pxtranslateX(-3px) or translateX(5px), border color updatedFooter Default
transparent{colors.primary} (#FFFFFF)1px solid rgba(255, 255, 255, 0.07) (top border){rounded.none} (0px)36px 0px103px16px, weight 400Base unit: 4px
{spacing.xxs} = 4px — Minimal internal gaps, tight component spacing{spacing.xs} = 8px — Small gaps between elements, tight padding{spacing.sm} = 12px — Button/badge padding, small margins{spacing.md} = 16px — Standard padding, common margin unit{spacing.lg} = 20px — Generous internal padding on cards{spacing.xl} = 24px — Section margin between content blocks{spacing.xxl} = 36px — Large gaps, nav/footer padding{spacing.xxxl} = 40px — Hero section internal spacing{spacing.section} = 48px — Page section spacing{spacing.band} = 64px — Extra-large vertical separationUsage Context:
{spacing.md} (16px) padding on content{spacing.band} (64px) vertically{spacing.xs} (8px) gaps{spacing.section} (48px) of breathing room1160px content column540px content column375px content column (full viewport width minus gutters if any)0px measured across all breakpoints (full-width sections with internal card margins)Cards in project gallery use 3-column layout on desktop, reflow on tablet, single column on mobile.
The system relies on whitespace as a primary design tool. Every section is separated by at least {spacing.section} (48px), and hero content is given {spacing.band} (64px) breathing room. Cards float on the canvas with 1px solid rgba(255, 255, 255, 0.07) borders that define their edges subtly, not aggressively. Between text and interactive elements, padding is generous ({spacing.lg} to {spacing.xxl}) to prevent cognitive crowding. This whitespace makes the content feel curated and premium rather than dense.
{rounded.none} = 0px — Sharp corners on cards, sections, footer (architectural edges){rounded.xs} = 8px — Buttons, small badges, input fields (interactive elements){rounded.sm} = 12px — Medium components (not widely used in measured data){rounded.md} = 18px — Primary card container (project gallery cards){rounded.full} = 9999px — Badges, status indicators (pill-shaped)Component radius mapping:
{rounded.xs} (8px){rounded.full} (9999px){rounded.md} (18px){rounded.none} (0px)1px — Used on all borders (buttons, cards, input fields, navigation underlines)All borders in the system use a single 1px stroke weight with semantic color rgba(255, 255, 255, 0.07) as the default hairline, brightening to rgba(255, 255, 255, 0.28) on interactive focus/hover states.
The system uses color-blocking elevation—depth is created through surface color changes rather than heavy shadows. The canvas (#080808) sits behind the surface (#111111), and cards float above with a hairline border. Interaction depth is achieved through micro-transforms (translateY, scale) and subtle shadow lifts, not layered shadow stacks.
| Level | Treatment | Use |
|---|---|---|
| Flat (Base) | No shadow, border only: 1px solid rgba(255, 255, 255, 0.07) | Cards at rest, inputs, badges |
| Elevated (Hover) | Box-shadow: rgba(255, 255, 255, 0.1) 0px 8px 24px, transform: translateY(-1px) | Primary button hover |
| High Lift (Card Hover) | Box-shadow: rgba(0, 0, 0, 0.55) 0px 24px 60px, transform: translateY(-5px) | Project gallery card on hover |
| Micro Lift | Box-shadow: rgba(255, 255, 255, 0.08) 0px 6px 20px, transform: translateY(-1px) | Small button hover |
Shadow Philosophy:
Shadows are reserved for hover states only. At rest, components are flat and rely on border and background color to define edges. On interaction, shadows emerge to signal lift and approachability. The dark shadow (rgba(0, 0, 0, 0.55)) is used sparingly on large cards to create dramatic depth; lighter shadows on buttons provide subtle feedback.
The system defines four opacity tiers:
Navigation uses 0.82 opacity (rgba(8, 8, 8, 0.82)) to create a frosted effect over the canvas. Buttons in hover states shift between 0.04 and 0.88 opacity for active feedback.
z-index: 1000 — Floating modals, dropdowns, and overlays sit atop all other contentThe system measures only one explicit z-index value, suggesting a simple layering model where modals and popovers are isolated on a high layer and everything else flows in document order.
{colors.primary} — #FFFFFF) as the primary text for all headings and key CTAs. It is the system's strongest signal.{colors.canvas} and {colors.surface}) to maintain WCAG AAA contrast.display-xl, display-xxl, heading-md) — this is a defining brand trait and should be preserved exactly as measured.{colors.accent} — #22C55E) for status indicators, availability badges, and brand mark accents only—not for all CTAs.{spacing.section} or {spacing.band} to create breathing room and premium feel.transform: translateY(-1px to -5px) and subtle shadows; avoid static hover states.rgba(255, 255, 255, 0.07) borders as the default hairline separator; brighten on focus/hover to rgba(255, 255, 255, 0.28).{rounded.full} for badges and {rounded.xs} for buttons; sharp corners for cards and sections.> 8px radius) unless specifically required; the system favors sharp (0px) or subtle (18px for large cards).{spacing.md} (16px) between major content sections; the system breathes.1000); use it as the ceiling for floating layers.| Breakpoint | Viewport Width | Content Column | Grid Columns | Nav Links Visible | Largest Heading Size | Body Text Size | Section Padding-X |
|---|---|---|---|---|---|---|---|
| Mobile | 375px | 375px | 3 | 4 | 53px | 16px | 0px |
| Tablet | 768px | 540px | 6 | 4 | 72px | 16px | 0px |
| Small Desktop | 1024px | 580px | 6 | 8 | 92px | 16px | 0px |
| Desktop | 1280px | 1160px | 6 | 8 | 115px | 16px | 0px |
| Large Desktop | 1440px | 1160px | 6 | 8 | 128px | 16px | 0px |
Key breakpoint behavior:
Minimum touch target size: 44px × 44px (inferred from button and interactive element sizing):
26px height (small variants), standard 39px height (primary)28–29px height60px height barRecommendation: Ensure all interactive elements meet or exceed 44px × 44px on mobile viewports for accessibility compliance.
375px (mobile) to 1160px (1280px+), scaling proportionally at intermediate breakpoints#FFFFFF) — use for buttons, main text, and brand marks#22C55E) — status indicators, availability badges, live markers only#080808) — default page backdrop#111111) — elevated content containers#A0A0A0) — primary copy, secondary emphasis#444444) — reduced emphasis, metadata, labelsrgba(255, 255, 255, 0.07) (default) → rgba(255, 255, 255, 0.28) (focus/hover){colors.primary} — #FFFFFF) to all primary headings and CTAs; use {colors.body} (#A0A0A0) for secondary copy.{colors.canvas} (#080808); surface cards and containers at {colors.surface} (#111111).1px solid rgba(255, 255, 255, 0.07); brighten on hover to rgba(255, 255, 255, 0.28).transform: translateY(-5px) and shadow rgba(0, 0, 0, 0.55) 0px 24px 60px; scale smaller cards with transform: scale(1.05) or scale(1.08).{spacing.section} (48px) or {spacing.band} (64px) between major sections; {spacing.md} (16px) for internal component padding.{rounded.full}) with rgba(255, 255, 255, 0.04) background and {colors.body} text; use green accent for live/active indicators.60px height, semi-transparent background rgba(8, 8, 8, 0.82), full-width at all breakpoints.0.5 opacity for disabled elements).150ms–200ms ease-out for snappy feel).translateY(-1px)). Multi-step animations or sequences are not documented.