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.
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
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).
Brand dùng ở đâu
Trạng thái chọn / bật
Chỉ báo focus
- 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 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ểu | Rest | Hover | Pressed | Thử |
|---|---|---|---|---|
| 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ử.
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" />- 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 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
- Đả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.
- 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ọ.
- 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ẫu | Cặp token | Tỉ 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 ·