- name
- uui-themes
- description
- Helps work with UUI themes including generating theme tokens from Figma, working with skin packages, and connecting external themes. Use when generating theme tokens, working with loveship/electric/promo themes, or connecting external themes.
# UUI Themes
UUI supports multiple themes (skins) and allows connecting external themes. Built-in themes include Loveship, Electric, and Promo.
## Built-in Theme Packages
UUI includes three styled theme packages:
- **`@epam/loveship`** — Loveship theme (light and dark modes)
- **`@epam/electric`** — Electric theme (light and dark modes)
- **`@epam/promo`** — Promo theme
These are located in:
- `loveship/` — Loveship theme package
- `epam-electric/` — Electric theme package
- `epam-promo/` — Promo theme package
## Generating Theme Tokens from Figma
Theme tokens are generated from Figma JSON exports.
### Process
1. **Obtain Theme.json from UX design team**
- Request the most recent `Theme.json` file exported from Figma
2. **Replace existing file**
- Place new `Theme.json` in `public/docs/figmaTokensGen/Theme.json`
- Replace the existing file
3. **Generate tokens**
```bash
yarn generate-theme-tokens
```
**Important:** Run from UUI monorepo root!
### Generated Files
The command generates:
- **`public/docs/figmaTokensGen/ThemeOutput.json`** — Original file with added CSS variable info:
```json
{
"codeSyntax": {
"WEB": "var(--uui-control-border-focus)"
}
}
```
This file should be sent back to UX designers to import into Figma.
- **`public/docs/figmaTokensGen/ThemeTokens.json`** — Normalized tokens with inheritance hierarchy in minimalistic format. Used for:
- Color palette documentation
- Token tables in sandbox
- **`epam-assets/theme/variables/tokens/*.scss`** — Theme-specific SCSS mixins with token variables
### Token Structure
Tokens include:
- **Modes** — Theme variants (e.g., Loveship-Light, Loveship-Dark, Promo, Electric-Light, Electric-Dark)
- **Exposed tokens** — CSS variables with values per theme
- **Value chains** — Token aliases and inheritance
Example token:
```json
{
"id": "core/controls/control-bg",
"type": "COLOR",
"cssVar": "--uui-control-bg",
"valueByTheme": {
"Loveship-Light": {
"value": "#FFFFFF",
"valueChain": {
"alias": [
{ "id": "core/surfaces/surface-main", "cssVar": "--uui-surface-main" }
]
}
}
}
}
```
## External Themes
Connect themes hosted outside the UUI repository.
### Setup
1. **Add theme URLs to localStorage:**
```javascript
localStorage.setItem('uui-custom-themes', JSON.stringify({
customThemes: [
"https://cdn.example.com/theme-1",
"https://cdn.example.com/theme-2"
]
}))
```
2. **Theme URL must serve `/theme-manifest.json`**
### Theme Manifest Structure
The theme URL must serve a `/theme-manifest.json` endpoint with this structure:
```typescript
interface IThemeManifest {
id: string; // Unique theme identifier
name: string; // Display name
css: string[]; // Array of CSS file URLs
settings?: string | null; // Optional settings URL
propsOverride?: { // Optional component prop overrides
[typeRef: string]: {
[propName: string]: IThemeManifestPropOverride
}
};
}
```
**Example manifest:**
```json
{
"id": "custom-theme",
"name": "Custom Theme",
"css": [
"https://cdn.example.com/theme-1/styles.css"
],
"settings": "https://cdn.example.com/theme-1/settings.json"
}
```
### CSS Variables and uui-* Classes
**CSS variables** use `--uui-*` prefix:
- `--uui-control-bg`, `--uui-control-border`, `--uui-text-primary`, etc.
- Defined in theme token SCSS files. Follow existing token structure for consistency.
**Global utility classes** use `uui-*` prefix for themeable props. These are applied by components via `applyMods`:
| Pattern | Purpose | Examples |
|---------|---------|----------|
| `uui-color-{value}` | Text/icon color | `uui-color-primary`, `uui-color-neutral`, `uui-color-error` |
| `uui-size-{value}` | Component size | `uui-size-24`, `uui-size-36`, `uui-size-48` |
| `uui-fill-{value}` | Button fill style | `uui-fill-solid`, `uui-fill-outline`, `uui-fill-ghost` |
| `uui-{component}` | Component root | `uui-button`, `uui-tab-button`, `uui-input-box` |
| `uui-{component}_{part}` | Component part | `uui-icon_button`, `uui-link_button` |
Skin packages (loveship, epam-electric, epam-promo) define styles for these classes. When adding new component mods, follow the same pattern so themes can style them.
## Working with Theme Tokens in Components
Components access theme tokens via CSS variables:
```scss
// Component.module.scss
.root {
background-color: var(--uui-control-bg);
border-color: var(--uui-control-border);
color: var(--uui-text-primary);
}
```
## Theme Settings
Components can access theme settings via the `settings` object:
```typescript
import { settings } from '../../settings';
// Access theme-specific icons, sizes, etc.
const icon = settings.button.icons.dropdownIcon;
const defaultSize = settings.button.sizes.default;
```
## Commands
**Generate theme tokens:**
```bash
yarn generate-theme-tokens
```
**Process icons** (if updating theme icons):
```bash
yarn process-icons
```
Place icons in `icons-source` folder first.
## References
- Theme tokens generation: `uui-build/ts/themeTokens.md`
- External themes: [.cursor/skills/documentation/SKILL.md](../documentation/SKILL.md) (External Themes section)
- Theme tokens output: `public/docs/figmaTokensGen/ThemeTokens.json`
- SCSS mixins: `epam-assets/theme/variables/tokens/`
GitHubで見る