ODIN ADMIN Docs v1.0
Basics

Theming

Colours, corners, shadows and sizes are CSS variables in one file, css/base/variables.css. Change a variable and every component that uses it follows.

How theming works

All variables are set on :root in css/base/variables.css. You can edit that file directly, but it's better to keep your changes in a file of your own, so a template update doesn't overwrite them:

  1. Create css/custom.css and set only the variables you want to change.
  2. Link it on every page, right after css/style.css, so its values win.
Every page — <head>
<link rel="stylesheet" href="css/style.css">
<link rel="stylesheet" href="css/custom.css">
css/custom.css
:root {
  --primary: #4F46E5;
  --radius-xl: 10px;
}

The rest of this page lists the variables by group.

Brand colour

The template's brand colour is teal. It colours primary buttons, links, active menu items, focus rings, checked inputs and charts.

--primary#00B4D8
--primary-hover#0096C7
--primary-softteal at 10%
--primary-bg#E0F7FB
--primary-text#0E7490
VariableUsed for
--primaryThe brand colour itself: buttons, icons, active states, charts
--primary-hoverHover state of filled buttons; solid badges and alerts
--primary-softLight tints — hover backgrounds, focus rings, selected items
--primary-bgSoft fills of badges and alerts
--primary-textText on --primary-bg — darker, so it stays readable
--shadow-tealThe coloured glow under primary buttons and the logo box

Changing the brand colour

Set all six together, so hover states, tints and text stay in tune. An indigo theme, for example:

css/custom.css
:root {
  --primary:       #4F46E5;
  --primary-hover: #4338CA;
  --primary-soft:  rgba(79, 70, 229, .10);
  --primary-bg:    #EEF2FF;
  --primary-text:  #4338CA;
  --shadow-teal:   0 6px 16px -4px rgba(79, 70, 229, .45);
}

Places with a fixed teal

A few gradients, tints and chart colours are written as fixed values instead of variables, so they keep the teal after you change --primary. To match your colour everywhere, search the template for #00B4D8, #0077B6 and rgba(0, 180, 216 (also written rgba(0,180,216) and replace them:

FileWhat
css/layout/sidebar.cssLogo box and user avatar gradients (#0077B6), the active menu item's tint
css/layout/topbar.cssProfile avatar gradient
css/components/dropdowns.cssAvatar gradient in the profile menu
css/components/lists.cssTeal avatar colours (.av-sm.c2, .act-av.c3)
css/components/forms.cssThe tint of a checked option card
css/components/tables.cssHover tint of selected rows
css/components/charts.cssThe glow on the highlighted bar of small bar charts (.spark)
css/pages/file-manager.cssSelected file in list view
css/vendor/fullcalendar.cssToday's background and the selection tint
index.html, index-analytics.html, index-crm.htmlLine colour and gradient of the SVG charts (stroke, stop-color)

Bootstrap's own colour classes — .btn-primary, .text-primary, .bg-primary and a plain .form-check-input — keep Bootstrap's blue. The template's pages don't use them; use the template's classes instead (.btn-brand, .check-soft, …), which follow --primary.

The sidebar has its own dark palette:

--sidebar-bg#0B132B
--sidebar-bg-hover#1C2541
--sidebar-bg-active#3A506B
--sidebar-text#8D99AE
--sidebar-text-active#FFFFFF
--sidebar-borderlines, 12%
VariableUsed for
--sidebar-bgBackground of the sidebar
--sidebar-bg-hoverA menu link under the mouse
--sidebar-bg-activeThe user block under the mouse
--sidebar-textMenu links and the user's role
--sidebar-text-activeThe current page's link
--sidebar-borderLines under the logo and above the user block

The current page's link gets a teal tint from the brand colour (see fixed teal). A charcoal sidebar instead of navy, for example:

css/custom.css
:root {
  --sidebar-bg:        #111827;
  --sidebar-bg-hover:  #1F2937;
  --sidebar-bg-active: #374151;
  --sidebar-text:      #9CA3AF;
}

The sidebar is designed for a dark background — some hover text and the logo are light. For a white sidebar, change the variables and those light colours in css/layout/sidebar.css.

Status colours

Alerts, toasts, badges, some buttons and modal icons share one set of status colours. Each colour has four values: the base, a darker shade for solid fills, a soft background and a text colour for that background.

ColourBaseSolidSoft backgroundText on softLooks like
primary--primary--primary-hover--primary-bg--primary-textPrimary
success--success--success-hover--success-bg--success-textSuccess
warning--warning--warning (text --warning-on)--warning-bg--warning-textWarning
danger--danger--danger-hover--danger-bg--danger-textDanger
info--info--info-hover--info-bg--info-textInfo
violet--violet--violet-hover--violet-bg--violet-textViolet
light / muted--light-bg, --light-text, --light-borderLight
dark--dark, --dark-text, --dark-soft-bg, --dark-soft-textDark

Using a status colour

A component takes the primary colour by default. Add a colour class to switch it — the same class works on every component in the set:

Colour classes
<span class="badge-soft">New</span>              <!-- primary -->
<span class="badge-soft success">Paid</span>
<span class="badge-soft danger">Overdue</span>
<div class="alert-soft warning">…</div>

The classes are .success, .danger, .warning, .info, .violet, .light, .muted and .dark. Task statuses have their own: .st-assigned (violet), .st-progress (primary), .st-review (warning) and .st-completed (success).

How it works: css/base/palette.css turns each colour class into a few short variables — --c (base), --c-solid, --c-on, --c-bg, --c-text and --c-line — and the components only read those.

Adding a colour

Add the values to your custom.css and one rule that maps them, like the existing ones in palette.css:

css/custom.css
:root {
  --pink: #EC4899;  --pink-hover: #DB2777;
  --pink-bg: #FCE7F3; --pink-text: #BE185D;
}
.pink { --c: var(--pink); --c-solid: var(--pink-hover); --c-bg: var(--pink-bg); --c-text: var(--pink-text); }

Now <span class="badge-soft pink"> works, and so does every other component in the set.

Text, surfaces and borders

--text-dark#0F172A
--text-body#334155
--text-muted#64748B
--bg-body#F8F9FA
--bg-card#FFFFFF
--neutral-soft#F1F5F9
--border#E2E8F0
--border-strong#CBD5E1

--text-dark is for titles, --text-body for normal text and --text-muted for hints and labels. --bg-body is the page background, --bg-card the background of cards and menus, and --neutral-soft the light grey of read-only fields, chart tracks and small hover backgrounds.

Corners

Six radius variables set how round the corners are. The template is fairly square by default:

VariableDefaultMostly used for
--radius-xs4pxBadges, tooltips, tabs, checkboxes
--radius-sm5pxSmall buttons, pagination, dropdown items
--radius-md6pxButtons, inputs, dropdowns
--radius-lg6pxModals, tables, drop zones, task cards
--radius-xl6pxCards and alerts
--radius-pill100pxRound pills, chips and switches
css/custom.css — softer corners
:root {
  --radius-md: 8px;
  --radius-lg: 10px;
  --radius-xl: 12px;
}

Shadows

VariableUsed for
--shadow-cardThe very light shadow under cards
--shadow-dropDropdowns, pop-overs and anything that floats above the page
--shadow-tealThe coloured glow under primary buttons — set it to your brand colour (see above)

For a completely flat look, set --shadow-card: none;.

Fonts

The template uses Inter from Google Fonts, at 14px for body text. Two places set it:

  • the Google Fonts <link> in each page's <head>, which loads the font;
  • css/base/base.css, which applies it: * { font-family: 'Inter', system-ui, -apple-system, sans-serif; }.

To use another font, change both — load it in the <head> and override the rule in your custom.css:

Every page — <head>
<link href="https://fonts.googleapis.com/css2?family=Manrope:wght@400;500;600;700;800&display=swap" rel="stylesheet">
css/custom.css
* { font-family: 'Manrope', system-ui, -apple-system, sans-serif; }

Load the weights the template uses — 400, 500, 600, 700 and 800 — or bold text falls back to the nearest one. Icons are unaffected: Font Awesome sets its own font on the icon elements.

ODIN ADMIN v1.0 · Documentation Last updated October 18, 2026