Brand the admin
The admin at /admin is Arc CMS's blue, with Arc CMS's name and logo at the top of its side panel, until you change them. Colours come from your stylesheet in the custom space, the name and logo from Settings, About or the custom space, and none of it is a core file.
Colours
Set these on :root in src/custom/styles.css, which loads after Arc CMS's styles. For a teal app:
:root {
--arc-admin-accent: #0d8478;
--arc-admin-accent-dark: #0a675e;
--arc-admin-button-background: #0d8478;
--arc-admin-button-hover-background: #0a675e;
--arc-admin-panel-background: linear-gradient(180deg, #0d8478, #063f39);
}
| Variable | Sets | Arc CMS's |
|---|---|---|
--arc-admin-accent | One solid colour for links, highlights, borders, focus rings, outline buttons, toggles, checkboxes and tabs | #3c76f5 |
--arc-admin-accent-dark | The darker end of gradients, and shadows | #1d47a3 |
--arc-admin-button-background | The main button, any CSS background | A gradient of the two above |
--arc-admin-button-hover-background | The main button under the pointer | The same as the button |
--arc-admin-panel-background | The side panel, and the setup wizard's panel, any CSS background | Arc CMS's blue gradients |
--arc-admin-panel-color | The side panel's text; its lines and the menu's dimmer text follow it | #fff |
--arc-admin-menu-active-background | The side panel's current item | A light veil of white |
--arc-admin-menu-hover-background | The side panel's item under the pointer | The same as the current item |
Lighter tints and shadows are mixed from the two accents, so two colours and a panel are usually all you set. They reach every admin page, the setup wizard and the dialogs, menus and toasts opened while they are on screen, including the Bootstrap and Material parts (links, toggles, checkboxes, tabs, spinners). Colours that mean something stay as they are: red for danger, green for success, the teal-blue of an information note, and a picture's own colours.
Set the variables on :root, not on a class: the gradient and the button follow the accents only where the accents are set. The admin's colours never reach the website or the sign-in page, which have their own (see Brand the sign-in page).
Name and logo
The top of the side panel, the sign-in page, the member area, every browser tab and the og:site_name of content pages show the same name and logo. Each is taken from the first of these that has one:
- Settings, About: the site name, and the logo URL (with Choose from media to pick it from the media library). An admin changes them there, with no code and no deploy; after saving, the panel shows them at once.
- The app's default:
nameinsrc/custom/brand.ts, and the logo filesrc/custom/logo.svg,logo.pngorlogo.webp. - Arc CMS's name and logo, only when nothing above gives a name or a logo. A name with no logo shows the name alone, never beside Arc CMS's logo.
import type { CustomBrand } from '../app/core/brand/site-brand';
export const CUSTOM_BRAND: CustomBrand = {
name: 'Acme Studio',
};
Nothing shows until Settings, About has loaded, so Arc CMS's name never flashes before yours.
Logo shapes
The panel looks at the logo's shape when it loads; an SVG's shape is read from its viewBox, else its width and height. A wordmark, at least twice as wide as it is tall, shows alone in the open panel (up to 150 pixels wide and 40 high), since it already carries the name. A square mark shows at 40 by 40 pixels beside the name. A name too long for the panel is cut short, so the button that collapses the panel always stays beside it. In the collapsed panel, 65 pixels wide, a square mark shows below that button and a wordmark does not. Search engines also read this logo (see Get found by search engines and AI) and prefer a square one of at least 112 by 112 pixels.
The browser tab
Every tab reads "Page | Site name", such as "Users | Acme Studio". Until the site name is in, the page's name stands alone; a page with no title shows the site name alone. Before the app starts, the tab shows the app's name from brand.ts, or "Loading" when it has none.
- Pages members see (sign in, profile, account, dashboard, payments, premium, notifications, no access, page not found) take their name from the member strings,
member.titles.*, in the reader's language. An app with its own member language translates them insrc/custom/i18n/{lang}.jsonlike any member string;npm run i18n:memberlists the ones missing, and the suite fails until they are there (see Member languages). - Admin pages stay in English, except Profile and Notifications, which members see too.
- A core page's own name: give it in
titlesinbrand.ts, by path. The site name is still added after it. - Your own pages: give the route a
title, and adata: { titleKey }for a translated one (see Add pages and routes).
export const CUSTOM_BRAND: CustomBrand = {
name: 'Acme Studio',
titles: { '/admin/users': 'Staff' },
};
A page that sets its own title once it has loaded, such as a content page, keeps it.
Next
Give your members their own area: Build the member area.