UI Color System

Luna UI provides a theming system through the UIColor, UIColorName, and UIColorValue classes. This system generates USS class names for consistent color styling across your UI.

Overview

The UIColor system maps color names and values to USS class names following a utility-first approach similar to Tailwind CSS. It supports backgrounds, borders, text, and image tints.

UIColorName Enum

Available color names:

SemanticDescription
BASEBase theme color
PRIMARYPrimary accent color
SECONDARYSecondary accent color
Gray Scale
SLATEBlue-gray tones
GRAYNeutral gray
ZINCCool gray
NEUTRALTrue neutral
STONEWarm gray
Colors
REDRed
ORANGEOrange
AMBERAmber/Gold
YELLOWYellow
LIMELime green
GREENGreen
EMERALDEmerald green
TEALTeal
CYANCyan
SKYSky blue
BLUEBlue
INDIGOIndigo
VIOLETViolet
PURPLEPurple
FUCHSIAFuchsia/Magenta
PINKPink
ROSERose
Special
TRANSPARENTTransparent color

UIColorValue Enum

Color intensity values (50-950):

ValueDescription
V_50Lightest
V_100Very light
V_200Light
V_300Light-medium
V_400Medium-light
V_500Medium (default)
V_600Medium-dark
V_700Dark
V_800Very dark
V_900Darkest
V_950Near black

UIColor Class

Combines a color name and value to generate USS class names.

Constructor

csharp
public UIColor() // Default: SLATE-50 public UIColor(UIColorName name, UIColorValue value)

Methods

MethodReturnsExample Output
GetUssClassBG()Background classbg-blue-500
GetUssClassBorder()Border classborder-blue-500
GetUssClassText()Text classtext-blue-500
GetUssClassImageTint()Tint classtint-blue-500
GetColor(VisualElement)Unity ColorReads from USS variables

Basic Usage

csharp
using UnityEngine; using UnityEngine.UIElements; using CupkekGames.Luna; public class ColorExample : MonoBehaviour { [SerializeField] private UIColor _buttonColor = new UIColor(UIColorName.PRIMARY, UIColorValue.V_500); private void Start() { var button = _uiDocument.rootVisualElement.Q<Button>("MyButton"); // Apply background color class button.AddToClassList(_buttonColor.GetUssClassBG()); // Apply border color class button.AddToClassList(_buttonColor.GetUssClassBorder()); } }

Dynamic Color Changes

csharp
public void SetButtonState(Button button, bool isActive) { // Remove old classes button.RemoveFromClassList(_inactiveColor.GetUssClassBG()); button.RemoveFromClassList(_activeColor.GetUssClassBG()); // Add new class based on state var color = isActive ? _activeColor : _inactiveColor; button.AddToClassList(color.GetUssClassBG()); }

Getting Unity Color

To get the actual Unity Color value from USS variables:

csharp
UIColor myColor = new UIColor(UIColorName.BLUE, UIColorValue.V_500); // Element must be in the hierarchy for custom styles to be resolved Color actualColor = myColor.GetColor(myElement);

This reads from the USS custom property --color-{name}-{value}.

Generated USS Classes

The system generates classes following this pattern:

TypePatternExample
Backgroundbg-{name}-{value}bg-primary-500
Borderborder-{name}-{value}border-red-600
Texttext-{name}-{value}text-slate-100
Tinttint-{name}-{value}tint-green-400

For TRANSPARENT, the value is omitted:

  • bg-transparent
  • border-transparent
  • text-transparent
  • tint-transparent

USS Variables

Colors are defined as USS custom properties:

css
:root { /* Primary colors */ --color-primary-50: #eff6ff; --color-primary-100: #dbeafe; --color-primary-200: #bfdbfe; --color-primary-300: #93c5fd; --color-primary-400: #60a5fa; --color-primary-500: #3b82f6; --color-primary-600: #2563eb; --color-primary-700: #1d4ed8; --color-primary-800: #1e40af; --color-primary-900: #1e3a8a; --color-primary-950: #172554; /* Blue colors */ --color-blue-50: #eff6ff; /* ... */ } /* Background utility classes */ .bg-primary-500 { background-color: var(--color-primary-500); } .bg-blue-600 { background-color: var(--color-blue-600); } /* Border utility classes */ .border-red-500 { border-color: var(--color-red-500); } /* Text utility classes */ .text-slate-100 { color: var(--color-slate-100); } /* Image tint utility classes */ .tint-green-400 { -unity-background-image-tint-color: var(--color-green-400); }

Inspector Integration

UIColor is serializable and works in the Unity Inspector:

csharp
public class MyComponent : MonoBehaviour { [SerializeField] private UIColor _backgroundColor; [SerializeField] private UIColor _borderColor; [SerializeField] private UIColor _textColor; }

Example: Themed Button

csharp
using UnityEngine; using UnityEngine.UIElements; using CupkekGames.Luna; public class ThemedButton : MonoBehaviour { [SerializeField] private UIColor _normalBg = new UIColor(UIColorName.PRIMARY, UIColorValue.V_500); [SerializeField] private UIColor _hoverBg = new UIColor(UIColorName.PRIMARY, UIColorValue.V_600); [SerializeField] private UIColor _pressedBg = new UIColor(UIColorName.PRIMARY, UIColorValue.V_700); [SerializeField] private UIColor _textColor = new UIColor(UIColorName.SLATE, UIColorValue.V_50); private void Start() { var button = _uiDocument.rootVisualElement.Q<Button>("ThemedButton"); // Apply base styles button.AddToClassList(_normalBg.GetUssClassBG()); button.AddToClassList(_textColor.GetUssClassText()); // Handle hover/press states in USS or via events button.RegisterCallback<MouseEnterEvent>(e => { button.RemoveFromClassList(_normalBg.GetUssClassBG()); button.AddToClassList(_hoverBg.GetUssClassBG()); }); button.RegisterCallback<MouseLeaveEvent>(e => { button.RemoveFromClassList(_hoverBg.GetUssClassBG()); button.AddToClassList(_normalBg.GetUssClassBG()); }); } }

Tips

  • Use semantic colors (PRIMARY, SECONDARY, BASE) for theme-able elements
  • Use specific colors (BLUE, RED, etc.) for fixed-color elements
  • The 500 value is typically the "default" shade of each color
  • Lower values (50-400) are lighter, higher values (600-950) are darker
  • Refer to Colors for the full color reference

Settings

Theme

Light

Contrast

Material

Dark

Dim

Material Dark

System

Sidebar(Light & Contrast only)

Light
Dark

Font Family

DM Sans

Wix

Inclusive Sans

AR One Sans

Direction

LTR
RTL