Solvo Solvo 2.0

Themes and branding

For everyone: light, dark and colour themes

Every signed-in user has a theme menu (the palette icon in the top bar). It offers:

The choice is saved to the user's account, so it follows them to any device. Public pages (marketing site, school websites, sign-in) have a sun/moon button and remember the visitor's choice in a cookie.

On phones

Below 900px wide, dashboards switch to an app layout: the menu becomes a drawer and a tab bar along the bottom holds each role's four most-used pages (for example Home, Students, Fees and Chat for a School Admin; Home, Fees, Results and Messages for a parent) with live unread badges, plus More to open the full menu. The tab bar respects iPhone and Android safe areas, and Solvo can be installed to the home screen and opens full-screen, which is also how the future Android/iOS apps will show it. The tabs per role are set in core/Layout.php (BOTTOM_NAV); a tab only appears if that role's menu has the page.

Super Admin → Appearance

The look everyone gets by default:

Logos

Upload two versions of each logo:

Variant Use it for Where it appears
Light-background logo Dark-coloured artwork on a transparent background Light mode, white email headers, documents
Dark-background logo White or light artwork on a transparent background Dark mode, brand-coloured sidebar and email banners

Solvo picks the right one automatically for each screen and each email header. If only one is uploaded, it is used everywhere.

School colours

School Admin → Brand colours sets the school's primary and accent colours, with a live preview of an email and a button. They are used:

Use platform colours removes them again.

For developers: how the stylesheets work

Solvo has exactly two stylesheets, both built from the same design tokens:

File Loaded by
public/assets/css/solvo-app.css Every signed-in dashboard (all roles)
public/assets/css/solvo-site.css Marketing site, school websites, sign-in pages, legal pages, installer, docs
public/assets/css/solvo-chat.css Only the chat bubble when embedded on another website (generated)

Colours are CSS custom properties. Use the semantic tokens, never raw hex values, and light/dark and every theme work automatically:

.my-panel {
  background: var(--c-surface);
  color: var(--c-text);
  border: 1px solid var(--c-border);
}
.my-panel a { color: var(--c-accent-text); }

Key tokens: --c-bg, --c-surface, --c-surface-2, --c-surface-3, --c-border, --c-border-strong, --c-text, --c-text-2, --c-text-3, --c-primary, --c-accent, --c-accent-hover, --c-accent-text, --c-success, --c-warning, --c-danger, --c-info (each with a -text and -soft variant), --shadow-s/m/l, --radius-s/m/l, --font-sans.

1.x variable names (--navy, --orange, --muted …) still work and follow the active theme, so any custom CSS you wrote for 1.x keeps working.

The <html> element carries data-mode (light, dark, system), data-theme (solvo, a preset name, or custom) and data-chrome (brand or light). Custom colours are injected as --brand-primary and --brand-accent; everything else is derived from those two with color-mix().

Each page's <body> has a class such as pg-school-admin-students-index, so a page-specific rule can be scoped without affecting anything else.