Yugen UI

Foundations

Màu sắc

Màu là công cụ để thể hiện phong cách, gợi cảm xúc và truyền đạt ý nghĩa. Bảng màu chuẩn hoá và cách dùng có chủ đích tạo nên trải nghiệm quen thuộc, dễ chịu và nhất quán.

Bảng màu Fluent

Fluent định nghĩa ba bảng màu: neutral, shared và brand. Mỗi bảng đảm nhận một vai trò riêng.

Neutral

Đen, trắng và xám — nền tảng cho bề mặt, chữ và bố cục.

Shared

Màu dùng chung toàn M365 cho avatar, lịch, badge và trạng thái.

Brand

Màu nhận diện sản phẩm cho hành động chính và trạng thái chọn.

Neutral

Bảng neutral gồm đen, trắng và các sắc xám làm nền tảng cho giao diện: bề mặt, chữ, bố cục. Trong component, neutral thường biểu thị thay đổi trạng thái.

W98969488827460442614B

Phân cấp thị giác bằng neutral

Dùng neutral sáng hơn cho bề mặt cần tập trung. Mắt người dùng sẽ được dẫn tới vùng quan trọng nhất mà không cần thêm màu.

bg-background-4 · nền ứng dụng

bg-background-2 · vùng nội dung

bg-background-1 + shadow-4

Bề mặt trọng tâm: Card, Dialog

Sáng nhất = quan trọng nhất

Tối dần về phía nền

Shared & semantic

Shared color đồng bộ trên toàn bộ M365, dùng trong component giá trị cao (avatar, lịch, badge) để người dùng nhận ra chức năng giữa các sản phẩm. Dùng tiết kiệm — chỉ để nhấn vào vùng quan trọng.

Shared color trong dark mode

Ở dark mode, shared color dịch chuyển độ bão hoà và độ sáng để giảm mỏi mắt và đảm bảo tương phản — không chỉ đảo ngược màu.

Màu ngữ nghĩa (semantic)

Một số shared color được dành riêng để truyền đạt phản hồi, trạng thái hoặc mức khẩn cấp, dựa trên liên tưởng thực tế: đỏ = nguy hiểm, vàng/cam = thận trọng, xanh lá = tích cực. Luôn đi kèm icon/chữ để giảm tải nhận thức.

Nên
  • Dùng màu ngữ nghĩa cho thông điệp quan trọng: lỗi, cảnh báo, thành công.
  • Luôn ghép với icon và chữ (MessageBar, Badge có nhãn).
  • Dùng nhất quán: cùng một trạng thái luôn cùng một màu.
Không nên
  • Không dùng màu ngữ nghĩa để trang trí (nút đỏ cho đẹp, tiêu đề xanh lá).
  • Không để màu là tín hiệu duy nhất (chỉ tô đỏ ô nhập mà không có thông báo).

Brand

Brand color tạo nhận diện tức thì cho sản phẩm. Áp dụng có chủ đích vào vùng cụ thể để tạo điểm nhấn và giữ người dùng định hướng. Mỗi brand là một ramp 16 bậc; đổi brand chỉ cần data-brand.

Brand mặc định của Yugen UI là Sakura 桜 #C2347A — hồng anh đào đậm, tương phản 5.16:1 với chữ trắng, và lệch hue ~30° so với đỏ danger để nút chính không bao giờ bị nhầm với hành động phá huỷ. Bậc nhạt 130–160 chính là sắc cánh hoa (#FFA7C9 → #FDEDF3).

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

Brand dùng ở đâu

Hành động chính (CTA)

Liên kết

Xem hướng dẫn màu

Trạng thái chọn / bật

Chỉ báo focus

Nên
  • Dùng brand cho nút/CTA chính, trạng thái chọn, bật, focus và liên kết.
  • Giữ brand ở diện tích nhỏ để nó luôn là điểm nhấn.
  • Dùng bậc tint (Background2) cho vùng chọn nhạt như nav item, badge tint.
Không nên
  • Không phủ brand lên diện tích lớn (header, sidebar, nền trang) — làm loãng phân cấp và khó điều hướng.
  • Không dùng brand cho chữ thân bài hoặc tiêu đề trang trí.
  • Không trộn hai brand trong cùng một vùng nội dung.
// index.html — đổi brand cho toàn ứng dụng
<html data-brand="web">

// Một vùng riêng (đặt kèm data-theme nếu nằm trong theme khác)
<section data-theme="light" data-brand="teams">...</section>

Trạng thái tương tác

Trên web, component đậm dần khi tương tác: sáng nhất khi nghỉ, đậm hơn khi hover, đậm nhất khi nhấn/chọn. (Windows làm ngược lại: control sáng dần khi tương tác.)

KiểuRestHoverPressedThử
Primary

colorBrandBackground

colorBrandBackgroundHover

colorBrandBackgroundPressed

Secondary

colorNeutralBackground1

colorNeutralBackground1Hover

colorNeutralBackground1Pressed

Subtle

transparent

colorSubtleBackgroundHover

colorSubtleBackgroundPressed

Selected (tint)

colorBrandBackground2

colorBrandBackground2Hover

colorBrandBackground2Pressed

Đang chọn

Trạng thái focus

Khi focus bằng bàn phím, màu control không đổi — thay vào đó khung ngoài có nét dày hơn (2px colorStrokeFocus2) để phân biệt tương tác bàn phím với chuột. Nhấn Tab để thử.

Bình thường
Cùng màu, thêm nét focus

Gradient

Gradient trong Fluent 2 là ngôn ngữ biểu cảm: xuất hiện ở minh hoạ, hero, trang giới thiệu — tạo cảm giác ánh sáng và chuyển động. Gradient không phải màu chức năng nên không bao giờ dùng cho control hay trạng thái.

Yugen UI

Sakura

bg-gradient-sakura · text-gradient-sakura

colorGradientSakura1 → 3 · chữ ký Yugen

Dusk

bg-gradient-dusk · text-gradient-dusk

colorGradientDusk1 → 3 · chạng vạng

Sunset

bg-gradient-sunset · text-gradient-sunset

colorGradientSunset1 → 3 · hoàng hôn

Aurora

bg-gradient-aurora · text-gradient-aurora

colorGradientAurora1 → 3 · tông lạnh

Brand

bg-gradient-brand · text-gradient-brand

gradientBrand (theo 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" />
Nên
  • Dùng cho hero, minh hoạ, onboarding, empty state, trang marketing.
  • Chữ gradient chỉ ở cỡ ≥ 28px (title2 trở lên) và mọi điểm màu đạt ≥ 3:1 với nền.
  • Tối đa một điểm nhấn gradient trong một khung nhìn.
  • Dùng token gradient có sẵn (có biến thể dark), không tự pha stop màu.
Không nên
  • Không dùng gradient cho Button, Input, nav, Badge trạng thái hay bất kỳ control nào.
  • Không dùng chữ gradient cho thân bài, nhãn, số liệu.
  • Không dùng gradient để biểu thị trạng thái (thành công/lỗi).
  • Không chạy animation gradient khi người dùng bật giảm chuyển động (prefers-reduced-motion).

Khả năng tiếp cận

  1. Đảm bảo tương phản đủ cho người thị lực kém hoặc mù màu: chữ ≥ 4.5:1 (chữ lớn ≥ 3:1), thành phần UI ≥ 3:1.
  2. Khi có thể, cho phép người dùng tự chọn bảng màu (light / dark / brand) phù hợp với họ.
  3. Không dùng màu làm cách truyền đạt duy nhất — luôn đi kèm chữ, icon hoặc hình dạng.

Bảng dưới đây được tính trực tiếp từ token đang áp dụng — đổi theme ở góc trên để kiểm tra dark mode.

MẫuCặp tokenTỉ lệWCAG AA
Aa

Chữ chính

colorNeutralForeground1 / colorNeutralBackground1

—Không đạt 4.5:1
Aa

Chữ phụ

colorNeutralForeground2 / colorNeutralBackground1

—Không đạt 4.5:1
Aa

Chữ mờ

colorNeutralForeground3 / colorNeutralBackground1

—Không đạt 4.5:1
Aa

Placeholder

colorNeutralForeground4 / colorNeutralBackground1

—Không đạt 4.5:1
Aa

Chữ trên nút primary

colorNeutralForegroundOnBrand / colorBrandBackground

—Không đạt 4.5:1
Aa

Liên kết

colorBrandForegroundLink / colorNeutralBackground1

—Không đạt 4.5:1
Aa

Chữ trên tint brand

colorBrandForeground2 / colorBrandBackground2

—Không đạt 4.5:1
Aa

Lỗi

colorStatusDangerForeground1 / colorStatusDangerBackground1

—Không đạt 4.5:1
Aa

Thành công

colorStatusSuccessForeground1 / colorStatusSuccessBackground1

—Không đạt 4.5:1
Aa

Cảnh báo

colorStatusWarningForeground1 / colorStatusWarningBackground1

—Không đạt 4.5:1
Aa

Viền control (checkbox, đáy input)

colorNeutralStrokeAccessible / colorNeutralBackground1

—Không đạt 3:1
Aa

Chỉ báo focus / chọn

colorCompoundBrandStroke / colorNeutralBackground1

—Không đạt 3:1
Aa

Viền trang trí

colorNeutralStroke1 / colorNeutralBackground1

—Không yêu cầu
Aa

Disabled

colorNeutralForegroundDisabled / colorNeutralBackground1

—Không yêu cầu

Color tokens

Mỗi giá trị trong bảng màu được lưu thành global token không ngữ cảnh. Alias token gắn ngữ cảnh để designer và developer chọn đúng màu mà không phải tra mã HEX. Component chỉ dùng utility map từ alias.

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 ·

Trạng thái

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 ·