--- name: mudblazor-theming description: 'Apply consistent Material Design UI theming in Egroo using MudBlazor. Use for: adding or updating colors, typography, elevation; ensuring new components follow the orange-on-dark palette; fixing visual inconsistencies; new MudBlazor components that need correct Color/Variant/Elevation props; CSS scoped overrides for theme-integrated layout. Covers the Egroo dark palette, component usage patterns, and the rules for keeping CSS and MudTheme in sync.' argument-hint: 'Describe the component or UI area to style (e.g. "agent card grid", "nav active state", "new dialog form")' --- # MudBlazor Theming — Egroo Design System ## When to Use - Adding a new Razor component and unsure which MudBlazor `Color`, `Variant`, or `Elevation` to use - Fixing a component whose colors clash with the dark palette - Updating scoped `.razor.css` overrides so they match theme colors - Choosing typography (`Typo.*`) for new text elements - Defining a new elevation tier for a new surface type --- ## Palette Reference Theme defined in [`src/Egroo.UI/Constants/Theme.cs`](../../../src/Egroo.UI/Constants/Theme.cs) — always edit that file for colour changes, never hardcode hex values in `.razor` files. | Token | Value | Use on | |---|---|---| | `Primary` | `#F25922` | CTAs, active states, accent icons | | `PrimaryContrastText` | `#FFFFFF` | Text/icons on Primary-colored surfaces | | `Secondary` | `#F2B591` | Subtle highlights, badges, chips | | `SecondaryContrastText` | `#1a1a1a` | Text on Secondary-colored surfaces | | `Background` | `#32333d` | Page background | | `Surface` | `#1e1e1e` | Cards, drawers, appbar | | `DrawerBackground` | `#1e1e1e` | Left sidebar | | `AppbarBackground` | `#1e1e1e` | Top navigation bar | | `TextPrimary` | `rgba(255,255,255,0.90)` | Main readable text | | `TextSecondary` | `rgba(255,255,255,0.70)` | Supporting/label text | | `DrawerText` / `DrawerIcon` | `rgba(255,255,255,0.50)` | Inactive nav items | | `Divider` | `rgba(255,255,255,0.12)` | Horizontal rules, borders | | `LinesInputs` | `rgba(255,255,255,0.30)` | Text field underlines | | `ActionDisabled` | `rgba(255,255,255,0.26)` | Disabled control icons | > **CSS in `.razor.css` files**: Use the exact hex/rgba values from this table. Never invent new brand colors. > **Sidebar/drawer** background = `#1e1e1e`. **Active nav link**: `rgba(242,89,34,0.20)` bg + `#F25922` text. --- ## Component Patterns ### Buttons ```razor @* Primary CTA (filled orange) *@ Save @* Secondary action *@ Cancel @* Destructive *@ Delete @* Ghost/low-emphasis *@ Close ``` **Rule**: Always specify both `Variant` and `Color`. Never leave either at default when intent matters. ### Text Fields / Forms ```razor ``` Use `Variant.Outlined` throughout for consistency with the `LinesInputs` border color. `Margin.Dense` for inline/card forms. ### Cards & Surfaces | Surface type | Elevation | Variant | |---|---|---| | Page section container | `0` | — | | Standard card | `2` | — | | Prominent card (agent) | `4` | — | | Floating dialog card | `8` | — | | Auth/login card | `25` | — | | Clickable list item | `0` + `.clickable-paper` CSS class | `Outlined` | ```razor ... ``` ### Typography Scale | `Typo.*` | Intent | |---|---| | `h5` | Page/section title (FontWeight 600) | | `h6` | Card heading, dialog title (FontWeight 600) | | `body1` | Message bubbles, main content | | `body2` | Form labels, secondary info | | `caption` | Timestamps, metadata, helper text | | `button` | Not used directly — MudButton handles it | ```razor Agent Name @description ``` ### Chips / Status Badges ```razor @* Active *@ Active @* Inactive *@ Inactive @* Provider tag *@ @provider ``` ### Icons Use `Color.Primary` for action icons, `Color.Inherit` inside buttons, `Color.Default` for decorative icons. ```razor ``` ### AppBar / Drawer Already set by theme palette. In `.razor` files use: ```razor @* AppbarBackground from theme *@ ``` `Elevation="0"` on both — depth comes from `Divider` border, not shadow. --- ## CSS Scoped Override Rules When a `.razor.css` override is **unavoidable** (MudBlazor doesn't expose a theme token for that element), follow these rules: 1. **Use only values from the Palette Reference table above** — no new hex codes. 2. Always target via `::deep` for child component styles. 3. Group overrides by component in the comment header. ```css /* === Nav: active link === */ .nav-item ::deep a.active { background-color: rgba(242,89,34,0.20); /* Primary @20% opacity */ color: #F25922; /* Primary */ } ``` **Never override** in global `site.css` for component-specific rules — use scoped `.razor.css`. --- ## Elevation & Depth System | Level | `Elevation=` | Usage | |---|---|---| | Flat | `0` | App bars, drawers, nav panels | | Raised | `2` | Content cards, papers | | Prominent | `4–8` | Agent/feature cards, dialogs | | Modal | `25` | Auth forms, login cards | --- ## Adding a New Component — Checklist - [ ] Colors use `Color.*` enum — no inline hex in `.razor` markup - [ ] Typography uses `Typo.*` enum on `` - [ ] Elevation matches the tier table above - [ ] Buttons have explicit `Variant` + `Color` - [ ] Forms use `Variant.Outlined` text fields with `Margin.Dense` - [ ] Any CSS overrides in `.razor.css` use only palette values - [ ] No new brand colors introduced outside `Theme.cs` --- ## Theme File See [`./references/theme-tokens.md`](./references/theme-tokens.md) for a one-page token cheat-sheet and MudBlazor docs links.