Branding
Make the website and the dashboard yours: the name, the mark and icons, the colours and type, the agency's details and the search engine texts.
For the Full Stack package
Where the brand lives
| What | Website (storefront/) | Dashboard (admin-dashboard/) |
|---|---|---|
| Name, contact email, market | src/config/brand.config.ts | src/config/brand.config.ts |
| Colours, radius, shadows | src/styles/theme-variables.css | src/styles/theme-variables.css |
| Mark and icons | public/brand/, public/, src/app/ | public/brand/, public/, src/app/ |
| Fonts | src/app/[locale]/layout.tsx | src/app/layout.tsx |
| Wording | messages/ | messages/ |
Every colour is a token defined once for the light theme (:root) and once for the dark theme (:root[data-theme="dark"]). Components read tokens only, so a changed token reaches every page. Change a brand colour in both blocks, or one theme keeps the old one.
The website's name, contact email and market
In storefront/src/config/brand.config.ts:
name: { en: "Velra", ar: "فيلرا" }, // tab titles, sharing cards, the wordmark, the manifest
contactEmail: "hello@velra.example", // until the dashboard's settings answer
market: {
currency: "AED", // prices without a currency of their own, budget ranges, the footer
timeZone: "Asia/Dubai", // viewing slots and dates
utcOffset: "+04:00", // the offset a viewing's preferred time is sent in
areaServed: "Dubai", // the agency's structured data for search engines
},The wordmark beside the mark is live text, so it follows name. The name and the city also appear in sentences, in both languages: search messages/ for Velra and فيلرا, and for Dubai and دبي, and rewrite those lines. The time zone hint in messages/viewing says UTC+4.
The website's mark, icons and photos
| File | Used for |
|---|---|
public/brand/velra-mark.svg | The house mark in the light theme (header, footer) |
public/brand/velra-mark-white.svg | The house mark in the dark theme and on photographs |
src/app/icon.svg | The browser tab icon |
src/app/apple-icon.png | The home-screen icon on iPhone and iPad |
public/web-app-manifest-192x192.png, public/web-app-manifest-512x512.png | The installable app icons |
Replace the files and keep their names, or change mark.color and mark.white in the brand config. The agency's own photos (the studio, the reception, the buying and renting panels, the property type tiles) are served by the API from public/media/velra/site/ in the API's folder: replace them under the same names. agency-studio.webp is also the sharing image of every page that has no property of its own.
The website's colours and type
| Token | Light | Dark | Role |
|---|---|---|---|
--primaryColor | #236B79 | #5AAAB8 | Primary actions, selected controls, prices, focus ring |
--primaryColorHover | #194D59 | #77BFCA | Hover and pressed |
--primary-tint | #E9F3F4 | #1A3238 | Selected fills, quiet panels |
--background | #F5F7F8 | #0F1A1E | Page |
--surface | #FFFFFF | #16242A | Cards, header, footer, dialogs |
--text | #263F48 | #E6EEF0 | Headings and strong text |
--text-muted | #637780 | #A9BBC1 | Secondary text |
storefront/BRANDING.md lists every token. Check that text on your colours still reads at 4.5 to 1 in both themes. The fonts load with next/font/google, so they are served with the build: Manrope for Latin text, Noto Sans Arabic for Arabic text, and Cormorant Garamond and Noto Naskh Arabic for headings. The browser bar colours are themeColor.light and themeColor.dark in the brand config.
Search results, sharing and the domain
NEXT_PUBLIC_SITE_URLis the base of every canonical address, the language alternates, the sharing cards, robots.txt and the sitemap. Set it to your real address before you build.- Page titles and descriptions are under
metain each namespace ofmessages/(the home page's inmessages/home, the default inmessages/layouts). A property page uses the property's own SEO title and description, written in the editor, and its cover photo. - Prices are formatted in
src/lib/utils/formatPrice.tsas the currency code followed by the amount in Latin digits (AED 4,850,000); rentals add the period from the translations. The budget ranges in the search are insrc/constants/search/priceRanges.ts.
Light, dark and system
Both apps have a theme menu with System, Light and Dark. System follows the operating system and changes when it does. The choice is kept in the browser's localStorage (velra-theme on the website, velra-admin-theme in the dashboard), nothing is sent to the API, and a short script in the page head applies it before the first paint, so a reload never flashes the other theme.
The dashboard's name, mark and colours
- Name:
nameinsrc/config/brand.config.tsis the wordmark and the brand half of every page title (Properties | Velra);metaholds the default title, description and keywords,domain.urlthe base of absolute metadata URLs,manifestthe installable app. Each page's own title is undermeta.titlesin thedashboardandauthnamespaces ofmessages/. - Mark: replace
public/brand/velra-mark.svgandvelra-mark-white.svg, keeping the names. The browser tab icon issrc/app/icon0.svg, the iPhone iconsrc/app/apple-icon.png, and the installable app's icons the twoweb-app-manifestfiles inpublic/. - Colours:
--primaryColor,--primaryColorHover,--primary-foregroundand--primary-tint,--background,--surface,--text,--text-muted,--borderand--errorColor, plus the--tone-*pairs for status pills, insrc/styles/theme-variables.css, once per theme. Which status takes which tone is insrc/config/statusTones.ts. - Fonts: Manrope, Noto Sans Arabic, Cormorant Garamond and Noto Naskh Arabic, loaded in
src/app/layout.tsxand assigned insrc/styles/base.css.
The agency's own details
The agency's name, tagline, description, contact email and city are settings, edited in the dashboard under Settings, Agency, and read by the website from GET /api/settings/public. The seed stores them as agency_name, agency_tagline_en, agency_tagline_ar, agency_description_en, agency_description_ar, contact_email and agency_city. The homes the home page features, and the home whose staged room it shows, are set under Settings, Homepage.
The brand logo itself is not uploaded in the dashboard: it comes from the files above.
Wording and the privacy policy
Every visible sentence is in messages/, one folder per area with en.json and ar.json; amenity names are in messages/amenities. Rewrite the copy in both files. The privacy policy in messages/privacy is template copy written for a fictional agency and says so on the page: rewrite it for your agency and your country before you go live, then remove that note (the last paragraph of src/features/privacy/components/PrivacyHeader.tsx and its templateNote key in both files).