Style Guide

The foundations, components, and sections this portfolio is designed and coded with.

atom

Colors

NameCSS VariableValueSwatchUsage
Background--color-bg#f7f7f7
Page background
White--color-white#ffffff
Cards, inputs
Black--color-black#000000
Display / H1 headings (Neutral Darkest)
Coal--color-coal#0c0c0c
Primary text, buttons
Foreground--color-fg#0c0c0c
Body text (alias of coal)
Neutral Darker--color-neutral-darker#222222
Secondary headings, eyebrows
Neutral Dark--color-neutral-dark#444444
Emphasised body text
Neutral--color-neutral#666666
Secondary text
Muted--color-muted#6f6f6f
Secondary text, labels
Neutral Light--color-neutral-light#8e8e8e
Tertiary text, placeholders
Subtle--color-subtle#999999
Tertiary text, placeholders
Border--color-border#6f6f6f
Default borders
Neutral Lighter--color-neutral-lighter#e6e6e6
Light dividers, subtle borders
Border Subtle--color-border-subtle#e5e5e5
Light dividers
Neutral Lightest--color-neutral-lightest#f7f7f7
Subtle fills, hover backgrounds
Green--color-green#8cee6f
Checkmarks, availability
Yellow--color-yellow#ffc609
Checkmarks, accents
atom

Typography

NameFontMobileDesktopWeightLine HeightTrackingSample
Display / H1Instrument Sans56px92px5001-0.05emBuild in code.
Heading 2Instrument Sans28px36px5001.2-0.03emSection Heading
Heading 3Instrument Sans28px40px5001.2-0.03emSubsection
Heading 4Instrument Sans24px28px5001.2-0.03emSub-subsection
Heading 5Instrument Sans20px24px5001.2-0.03emMinor heading
BodyInstrument Sans16px16px4001.4-0.02emBody text for regular content and descriptions.
LeadInstrument Sans18px18px4001.4-0.02emLead paragraph text for introductions.
SmallInstrument Sans14px14px4001.40Small text for footers and disclaimers.
MutedInstrument Sans16px16px4001.4-0.02emMuted text for secondary info.
Tag / LabelInconsolata16px16px40010.05emUPPERCASE LABEL

Font Families

NameFamilyCSS VariableUsage
SansInstrument Sans--font-sansBody text, headings, UI
MonoInconsolata--font-monoLabels, tags, company names
atom

Spacing

TokenRemPixelsPreview
10.25rem4px
20.5rem8px
30.75rem12px
41rem16px
51.25rem20px
61.5rem24px
82rem32px
102.5rem40px
123rem48px
164rem64px
atom

Border Radius

NameValuePreview
sm0.375rem (6px)
md0.5rem (8px)
lg0.75rem (12px)
xl1rem (16px)
2xl1.5rem (24px)
card-img12px
card-md16px
card-sm20px
card24px
full9999px
atom

Shadows

NameCSS ValuePreview
Nav pill0 2px 8px 2px rgba(0,0,0,0.1), inset 2px 2px 0.5px -2px rgba(160,160,160,0.25)
atom

Transitions & Animations

NameDurationEasingPreview
fast150msease
normal200msease
slow300msease
fade-in600mscubic-bezier(0.16, 1, 0.3, 1)

Entrance animations use .fade-in-ready / .fade-in-visible classes via ScrollReveal and FadeIn components. Entrance fades and the hero star play identically on every device, including phones in Low Power Mode (which reports prefers-reduced-motion); image shimmer still respects the preference.

molecule

Buttons

VariantSizeDefaultHoverActiveDisabled
primarysmallLabelLabel
primarydefaultLabelLabel
secondarysmallLabelLabel
secondarydefaultLabelLabel
ghostsmallLabelLabel
ghostdefaultLabelLabel

Button Props

PropTypeDefaultDescription
variantprimary | secondary | ghostprimaryVisual style
sizesmall | defaultdefaultSize preset
hrefstring-Renders as Link or anchor
externalbooleanfalseOpens in new tab

Text links share the site's hover language: an animated underline, or the FlipText slide. External links add a trailing arrow icon; section “more” links add a nudging arrow. Ghost buttons reuse the same FlipText hover.

VariantClassesUsage
Text linkhover-underlineBreadcrumbs, inline links, footer credit
Flip linkgroup/flip + FlipTextContact links, nav, ghost buttons
External linkFlipText + ExternalIcon (new tab)Off-site links (LinkedIn, Notion)
“More” linknudging → + FlipTextSection headers (See all work)
Live Preview — Links (hover them)
Text linkRead more
External linkLinkedIn
molecule

Cards

Cards use an inline pattern. There is no Card component.

PatternClasses
Base cardbg-white border border-coal/40 rounded-card p-[40px]
Stat cardbg-white rounded-[8px] p-6 md:p-[28px] flex flex-col gap-6
Project cardbg-white border border-coal/40 rounded-card-md md:rounded-card overflow-hidden flex flex-col
Live Preview

Card Title

Card description text goes here.

molecule

Badges & Tags

VariantPreview
Filter tag (inactive)
Filter tag (active)
Capability tag (static, non-interactive)Design systems
molecule

Checkmarks

VariantColorSizeUsagePreview
yellow#ffc60918x18pxHero stat highlights
green#8cee6f18x18pxHero stat highlights, availability indicator
outline#0c0c0c (border)16x16pxProject card highlights
molecule

Form Inputs

StatePreview
Default
Filled
Disabled
Textarea
Live Preview — Form Inputs
molecule

Interaction States

Global Focus Ring

All interactive elements use outline: 2px solid coal with outline-offset: 2px on :focus-visible.

::selection

Text selection uses bg-coal text-white. Try selecting this text to see it.

Hover Effects System

Three reusable CSS classes define all hover interactions. Each uses cubic-bezier(0.16, 1, 0.3, 1) for a snappy, minimalist feel.

ClassEffectUsed On
hover-underlineAnimated underline slides in from left (0.3s)Text links, breadcrumbs, ghost buttons
hover-lifttranslateY(-2px) + subtle shadow (0.3s)Primary buttons, CTA buttons
hover-lift-cardtranslateY(-4px) + larger shadow (0.3s)Article cards, interactive cards
hover-floattransition transform 0.3s → tile-float keyframes on hoverLogo link and each header nav item
FlipText (group/flip)Label is clipped to one line; on hover it slides up while an identical copy slides up from below (0.45s)Header & mobile nav links
Live Preview — Hover Effects
.hover-underlineText link example
.hover-lift
.hover-lift-card

Card hover

Hover to lift

Nav Link States

StateStylesPreview
Defaulttext-muted, 14px, hover:text-coal hover:bg-white/90 hover:border-coal/10 hover:shadow-[0_2px_6px_rgba(0,0,0,0.05)]Work
Activetext-coal bg-yellow border-yellow shadow-smWork

Filter Tag States

StateStylesPreview
Inactiveborder-border-subtle, text-neutral-dark, rounded-mdTag
Inactive + Hovertext-coal, border-border, bg-whiteTag
Activebg-coal, text-whiteTag
Live Preview — Filter (Platform / Industry / Focus)
Platform
Industry
Focus
Live Preview — Buttons (all variants)
primary
secondary
ghost
PropertyValueDescription
positionsticky top-0Sticks to viewport top on scroll
z-index50Above all content
nav itemsWork, About, Articles, ContactOn the home page Work / About / Articles anchor to in-page sections (#work, #about, #articles); Contact scrolls to the CTA
logomd:h-10 w-10 (18×14 mark)Compact 40px logo on desktop (56px tap target on mobile), 6px gap to the nav links
font size14pxNav link text size
active statebg-yellow border-yellowYellow pill for the active link; on the home page a scroll-spy highlights the section currently in view
scroll transitionIntersectionObserver, 80px sentinel, 700msLogo + links collapse together into one frosted white/80 + backdrop-blur-md pill with a subtle border & shadow on scroll
mobile menubg-white/95 border shadow-smHamburger with animated bars → X morph
Live Preview
Raygar
WorkAboutArticlesContact
PropertyValueDescription
layoutSingle row, wrapped in ScrollRevealCredit line left, copyright pinned right (flex, md:justify-between)
credit12px, text-muted, tracking-[-0.02em]“Designed & built from scratch with Claude Code↑, using Notion↑ as the CMS. View the Style Guide” — external + internal links
copyright12px, text-muted, tracking-[-0.02em]© Raygar He, {year}. All rights reserved — dynamic year via Date()
Live Preview

This website was designed and built from scratch with Claude Code, using Notion as the CMS. View the Style Guide.

© Raygar He, 2026. All rights reserved

organism

Hero Section

ElementDescription
Avatar140px mobile / 212px desktop circle, with ~40/53px star badge overlay
Name + Title40px mobile / 56px name; below it a 20px medium title line and a 14px muted location line
Stat Cards3-column grid: "0→1" (1 col) + "8+ years" (2 cols) with logos. Borderless bg-white rounded-[8px] cards
HighlightsCheckmark items with yellow/green variants
AnimationsFadeIn (avatar) + FadeInWords (name/title) with staggered delays
Live Preview

Raygar He

Senior Product Designer (AI, Web & Mobile Apps)

Based in Queensland, Australia — working globally

0 → 1

Lead end-to-end product design

Solve complex system problems
Set design direction & drive measurable impact
Define growth & retention strategy

8+ years

Across startups and enterprises

Banking, fintech, e-commerce & more
Data-informed design for 2M+ users
AI-powered design & product innovation
ANZ
Suncorp Bank
Suncorp
Jumbo
Oz Lotteries
Optimise
QUT
Adelaide
Savvy
organism

Case Tile

Vertical case-study card (shares the article-card shape): a cover screenshot on top at a 7:5 aspect (object-top), then a meta line (company · timeline), the project tagline, a short description, and a “View summary” link. Used in the home Work grid. Falls back to a mint gradient placeholder when no cover is set.

PropTypeDescription
companystringMeta line, first item (14px, muted)
timelinestring?Optional second meta item, ·-separated (from CMS)
taglinestringProject title (16px medium, coal)
descriptionstring?Body copy (14px, muted)
coverstring?Cover image (7:5, object-top); CMS page cover
ctastring?Link label, falls back to “View summary”
hrefstring?Card link target
Live Preview
Suncorp Bank2023 — 2024

Building the systems to drive conversion.

Driving home loan conversion through a design system, experimentation practice, and research-led page experience.

organism

Section Heading

The reusable heading that introduces the Work, About, and Articles sections on the home page.

PropertyValueDescription
eyebrowfont-mono 14px uppercase tracking-[0.8px]Mono label above the section (SectionHeading title)
headline28px / 48px medium, tracking-[-0.03em]Optional large statement below the eyebrow
more link→ label, bottom-rightOptional trailing link (arrow nudges, label underlines on hover); non-sticky, revealed via ScrollReveal
organism

Experience & Education

Résumé-style listing rendered inside a white card (rounded-[8px], p-7). Each row is a responsive grid divided by hairlines (divide-y divide-border-subtle); below xl the columns stack. In Experience, each position is a three-column row — role + tags, then the company, then period · location (right-aligned). The company name is shown once per company, so multiple roles at the same company read as a grouped block.

ElementStyleDescription
company / institution14px regular, blackLeft column, emphasised proper noun
location12px regular, neutralFollows the period on the same line (Experience); under the degree (Education)
title / degree14px regular, neutral-darkPosition title or qualification (right column)
period12px regular, neutral, rightDate range per position, shown as “period · location” (Experience only)
tagscapability tag — 12px, bg-neutral-lighter, rounded-mdSpecialisation chips under each position (Experience only)
Live Preview

Experience

Senior UX DesignerDigital Accessibility

ANZ

2026–Present·Brisbane

Senior UX DesignerPersonalised CommsApp Design SystemMobile Banking

2024–Present·Brisbane

MentorUX/UIProduct Design

ADPList

2024–Present·Remote

UX DesignerIdentity & AuthApp Design System

Suncorp Group

2023–2024·Brisbane

UX DesignerGrowthWeb Design System

2023–2024·Brisbane

App DesignerFinance

Savvy

2021–2024·Adelaide

Product Designer — Oz LotteriesGrowthE-comDesign System

Jumbo Interactive

2022–2023·Brisbane

UX/UI DesignerAgency

The Distillery

2021·Adelaide

UI/UX DesignerE-learning

JR Academy

2019–2020·Brisbane & Adelaide

UX/UI DesignerFashion E-commerce

Dogstar

2018–2019·Brisbane

Graphic Designer

Guangdong University of Foreign Studies

2014–2016·Guangzhou

Education

MSc Computer Science

University of Adelaide

Adelaide, Australia

BSc Interactive and Visual Design

Queensland University of Technology

Brisbane, Australia

Art & Design (Illustration)

Sheffield Hallam University

Sheffield, United Kingdom

Art (Graphic Design)

Guangdong University of Foreign Studies

Guangzhou, China

Digital Accessibility Certificates

DesignDevelopmentTestingWCAG 2.2Web & Mobile app

Intopia

Online

organism

CTA Section (ContactSection)

PropertyValueDescription
heading40px / 64px“Let's connect.” — medium, white, responsive
cardbg-neutral-darker rounded-[8px]Solid dark card, min-h-[360px] md:min-h-[520px], p-8 md:p-14
CTAsText links (FlipText)LinkedIn, Resume, Copy my email & Book a mentorship — 16px white/80 links, each wrapped in FlipText. A hairline divider sets Book a mentorship apart as the primary CTA
copy my emailclipboard actionCopies raygarhoo@gmail.com; swaps to “Email copied ✓” for 2s (aria-live). No external indicator
external indicatortrailing ExternalIcon + sr-onlyTrailing ExternalIcon and “(opens in new tab)” on each external CTA — LinkedIn, Resume, mentorship (WCAG)
animationScrollRevealScroll-triggered entrance animation
visibilityHidden on /styleguideAlso hidden on the 404 page; anchored at #contact (Header Contact link scrolls here)
organism

Quick Nav

Sticky sidebar navigation used on About, Work detail, Article detail, and Styleguide pages. Highlights the active section as the user scrolls.

PropertyValueDescription
positionsticky top-24Fixed in viewport while scrolling
active indicatorborder-l-2 border-coalLeft border highlights the active section
guide lineborder-l border-border-subtleSubtle vertical line connecting all items
heading10px / uppercase / tracking-widest / mb-4“On this page” label
item text12pxH2 link size; H3 sub-items are 11px, pl-7, prefixed with a “↳” glyph
itemsOverview + headingsFirst item is always Overview; the rest are the case study's H2/H3 headings
widthw-[200px]Fixed sidebar width
scroll offsetscroll-margin-top: 100pxPrevents sticky header from covering section headings
visibilityhidden md:blockOnly visible on medium and larger screens
Preview

On this page

  • Overview
  • Context
  • Problem framing
  • Process
  • Outcome
organism

Password Modal

Clicking a password-protected case study opens this prompt as an overlay on the current page — no navigation. A correct password unlocks the case study (the unlock is remembered for the tab); Close, Escape, or a backdrop click dismisses it and leaves the user exactly where they were. The same PasswordPromptForm is reused by the inline gate shown on direct visits.

PropertyValueDescription
overlayfixed inset-0 z-[100]Portal to body; backdrop bg-coal/40 + 2px blur, click to close
panelmax-w-sm rounded-card-md p-8White card, border-coal/40, soft drop shadow
motionfade + scale 0.96→1cubic-bezier(0.16, 1, 0.3, 1); fade-only under reduced motion
dismissClose ✕ / Esc / backdropStays on the same page; no route change
a11yrole="dialog" aria-modalAutofocus input, focus trap, scroll lock, focus restored on close
Preview

Protected project

Enter the password to view this case study.

Enter password