Yugen UI

Foundations

Color

Color sets the tone of an interface and carries meaning. A standard palette, used with intent, keeps the experience familiar and consistent.

Fluent palettes

Fluent defines three palettes, each with its own role: neutral, shared and brand.

Neutral

Black, white and grays: the base for surfaces, text and layout.

Shared

Colors shared across Microsoft 365 for avatars, calendars, badges and status.

Brand

The product's identity color, for primary actions and selected states.

Neutral

The neutral palette holds black, white and the grays that form the base of the interface: surfaces, text, layout. In components, neutrals usually show state changes.

W98969488827460442614B

Visual hierarchy with neutrals

Use lighter neutrals for surfaces that need attention. The eye goes to the most important area without any added color.

bg-background-4 · app background

bg-background-2 · content area

bg-background-1 + shadow-4

Focus surfaces: Card, Dialog

Lightest = most important

Darker toward the background

Shared & semantic

Shared colors are the same across Microsoft 365. High-value components (avatar, calendar, badge) use them so people recognize a function from one product to the next. Use them sparingly, only to highlight important areas.

Shared colors in dark mode

In dark mode, shared colors shift in saturation and lightness to reduce eye strain and keep enough contrast. They are not simply inverted.

Semantic colors

Some shared colors are reserved for feedback, status or urgency, based on real-world associations: red = danger, yellow/orange = caution, green = positive. Always pair them with an icon or text to reduce cognitive load.

Do
  • Use semantic colors for important messages: errors, warnings, success.
  • Always pair them with an icon and text (MessageBar, a Badge with a label).
  • Be consistent: the same status always gets the same color.
Don't
  • Don't use semantic colors for decoration (a red button for looks, a green heading).
  • Don't make color the only signal (a red input with no message).

Brand

The brand color makes a product recognizable at a glance. Apply it to specific areas to add emphasis and help people find their way. Each brand is a 16-step ramp; switching brands only takes data-brand.

The default Yugen UI brand is Sakura 桜 #C2347A, a deep cherry blossom pink. It reaches 5.16:1 with white text, and its hue sits about 30° away from danger red, so a primary button is never mistaken for a destructive action. The light steps 130–160 are the petal tones (#FFA7C9 → #FDEDF3).

10
20
30
40
50
60
70
80
90
100
110
120
130
140
150
160

Where the brand goes

Primary action (CTA)

Link

Read the color guide

Selected / on state

Focus indicator

Do
  • Use the brand for primary buttons and CTAs, selected and on states, focus and links.
  • Keep the brand to small areas so it stays an accent.
  • Use the tint step (Background2) for light selection areas such as nav items and tint badges.
Don't
  • Don't spread the brand over large areas (header, sidebar, page background). It weakens the hierarchy and makes navigation harder.
  • Don't use the brand for body text or decorative headings.
  • Don't mix two brands in the same content area.
// index.html: change the brand for the whole app
<html data-brand="web">

// One region only (also set data-theme if it sits inside a different theme)
<section data-theme="light" data-brand="teams">...</section>

Interaction states

On the web, components get darker as you interact: lightest at rest, darker on hover, darkest when pressed or selected. (Windows does the opposite: controls get lighter as you interact.)

AppearanceRestHoverPressedTry it
Primary

colorBrandBackground

colorBrandBackgroundHover

colorBrandBackgroundPressed

Secondary

colorNeutralBackground1

colorNeutralBackground1Hover

colorNeutralBackground1Pressed

Subtle

transparent

colorSubtleBackgroundHover

colorSubtleBackgroundPressed

Selected (tint)

colorBrandBackground2

colorBrandBackground2Hover

colorBrandBackground2Pressed

Selected

Focus state

With keyboard focus, the control color stays the same. Instead the control gets a thicker outline (2px colorStrokeFocus2), so keyboard interaction looks different from mouse interaction. Press Tab to try it.

Normal
Same color, plus the focus outline

Gradient

In Fluent 2, gradients are expressive: they appear in illustrations, heroes and landing pages to suggest light and movement. Gradients are not functional colors, so never use them for controls or states.

Yugen UI

Sakura

bg-gradient-sakura · text-gradient-sakura

colorGradientSakura1 → 3 · Yugen signature

Dusk

bg-gradient-dusk · text-gradient-dusk

colorGradientDusk1 → 3 · twilight

Sunset

bg-gradient-sunset · text-gradient-sunset

colorGradientSunset1 → 3 · sunset

Aurora

bg-gradient-aurora · text-gradient-aurora

colorGradientAurora1 → 3 · cool tones

Brand

bg-gradient-brand · text-gradient-brand

gradientBrand (follows data-brand)

import { GradientText, WavyUnderline, BloomArt } from "@/components/ui";

<h1 className="relative inline-block font-display text-display">
  <GradientText gradient="sakura">Yugen UI</GradientText>
  <WavyUnderline gradient="sakura" className="absolute inset-x-0 -bottom-4 h-5" />
</h1>

<div className="h-28 rounded-2xlarge bg-gradient-dusk" />
Do
  • Use them for heroes, illustrations, onboarding, empty states and marketing pages.
  • Use gradient text only at 28px or larger (title2 and up), with every color stop at 3:1 or more against the background.
  • Use at most one gradient accent per view.
  • Use the gradient tokens (they have dark variants) instead of mixing your own color stops.
Don't
  • Don't use gradients on Button, Input, nav, status Badge or any other control.
  • Don't use gradient text for body text, labels or numbers.
  • Don't use gradients to show status (success / error).
  • Don't animate gradients when the user has turned on reduced motion (prefers-reduced-motion).

Accessibility

  1. Keep enough contrast for people with low vision or color blindness: text ≥ 4.5:1 (large text ≥ 3:1), UI components ≥ 3:1.
  2. Where you can, let people pick the color scheme that suits them (light / dark / brand).
  3. Don't use color as the only way to convey meaning. Always add text, an icon or a shape.

The table below is computed live from the current tokens. Switch the theme at the top to check dark mode.

SampleToken pairRatioWCAG AA
Aa

Primary text

colorNeutralForeground1 / colorNeutralBackground1

—Fail 4.5:1
Aa

Secondary text

colorNeutralForeground2 / colorNeutralBackground1

—Fail 4.5:1
Aa

Muted text

colorNeutralForeground3 / colorNeutralBackground1

—Fail 4.5:1
Aa

Placeholder

colorNeutralForeground4 / colorNeutralBackground1

—Fail 4.5:1
Aa

Text on a primary button

colorNeutralForegroundOnBrand / colorBrandBackground

—Fail 4.5:1
Aa

Link

colorBrandForegroundLink / colorNeutralBackground1

—Fail 4.5:1
Aa

Text on the brand tint

colorBrandForeground2 / colorBrandBackground2

—Fail 4.5:1
Aa

Error

colorStatusDangerForeground1 / colorStatusDangerBackground1

—Fail 4.5:1
Aa

Success

colorStatusSuccessForeground1 / colorStatusSuccessBackground1

—Fail 4.5:1
Aa

Warning

colorStatusWarningForeground1 / colorStatusWarningBackground1

—Fail 4.5:1
Aa

Control border (checkbox, input underline)

colorNeutralStrokeAccessible / colorNeutralBackground1

—Fail 3:1
Aa

Focus / selection indicator

colorCompoundBrandStroke / colorNeutralBackground1

—Fail 3:1
Aa

Decorative border

colorNeutralStroke1 / colorNeutralBackground1

—Not required
Aa

Disabled

colorNeutralForegroundDisabled / colorNeutralBackground1

—Not required

Color tokens

Each palette value is stored as a context-free global token. Alias tokens add context, so designers and developers can pick the right color without looking up hex codes. Components only use utilities mapped from aliases.

Neutral

colorNeutralForeground1

text-foreground-1 ·

colorNeutralForeground2

text-foreground-2 ·

colorNeutralForeground3

text-foreground-3 ·

colorNeutralForegroundDisabled

text-foreground-disabled ·

colorNeutralBackground1

bg-background-1 ·

colorNeutralBackground2

bg-background-2 ·

colorNeutralBackground3

bg-background-3 ·

colorSubtleBackgroundHover

bg-subtle-hover ·

colorNeutralStroke1

border-stroke-1 ·

colorNeutralStroke2

border-stroke-2 ·

colorNeutralStrokeAccessible

border-stroke-accessible ·

colorStrokeFocus2

outline-stroke-focus ·

Brand

colorBrandBackground

bg-brand-background ·

colorBrandBackgroundHover

bg-brand-background-hover ·

colorBrandBackgroundPressed

bg-brand-background-pressed ·

colorBrandBackground2

bg-brand-background-2 ·

colorBrandBackground2Hover

bg-brand-background-2-hover ·

colorBrandForeground1

text-brand-foreground-1 ·

colorBrandForeground2

text-brand-foreground-2 ·

colorCompoundBrandStroke

border-brand-stroke ·

Status

colorStatusDangerBackground3

bg-danger-background-3 ·

colorStatusDangerBackground1

bg-danger-background-1 ·

colorStatusDangerForeground1

text-danger-foreground-1 ·

colorStatusSuccessBackground3

bg-success-background-3 ·

colorStatusSuccessBackground1

bg-success-background-1 ·

colorStatusSuccessForeground1

text-success-foreground-1 ·

colorStatusWarningBackground3

bg-warning-background-3 ·

colorStatusWarningBackground1

bg-warning-background-1 ·

colorStatusWarningForeground1

text-warning-foreground-1 ·