Branding
Make the website and the dashboard yours: the name, the mark and icons, the colours and type, the company's details and the search engine texts.
For the Full Stack package
Where the brand lives
| What | Website (storefront/) | Dashboard (admin-dashboard/) |
|---|---|---|
| Name and metadata | src/config/brand.config.ts | src/config/brand.config.ts |
| Time zone and currency fallbacks | src/config/booking.config.ts | The company settings |
| 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, files in src/fonts/ | src/app/layout.tsx, files in src/fonts/ |
| 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 and fallbacks
In storefront/src/config/brand.config.ts and storefront/src/config/booking.config.ts:
// brand.config.ts
name: { en: "Hollina", ar: "Hollina" }, // tab titles, sharing cards, the wordmark, the manifest
tagline: { en: "...", ar: "..." }, // until the dashboard's settings answer
description: { en: "...", ar: "..." }, // the installable app's description
contactEmail: "hello@example.com", // until the dashboard's settings answer
contactPhone: "+1 202 555 0147", // until the dashboard's settings answer
keywords: ["vacation rental", ...], // the meta keywords
// booking.config.ts
DEFAULT_TIMEZONE = "America/New_York"; // calendar days, "today", the i18n clock
DEFAULT_CURRENCY = "USD"; // prices without a currency of their ownThe wordmark beside the mark is live text set in Outfit (src/components/BrandMark.tsx), so it follows name. The company's name also appears in sentences, in both languages: search messages/ for Hollina and rewrite those lines. The reply time on the contact page and in the question dialog ("usually within a day") is copy in messages/contact and messages/inquiry.
The website's mark, icons and photographs
| File | Used for |
|---|---|
public/brand/hollina-mark.svg | The mark in the light theme (header, footer) |
public/brand/hollina-mark-white.svg | The mark in the dark theme |
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 |
public/icons/stay-types/type-*.svg | The six stay-type marks, drawn in currentColor |
public/icons/flags/us.svg, sa.svg | The flags in the language menu |
Replace the files and keep their names, or change mark.color and mark.white in the brand config. The company's own photographs are served by the API from public/media/hollina/site/ in the API's folder: 01-hero.webp (the sharing image of every page without a photograph of its own), how-dates.webp, how-pay.webp and how-arrive.webp (the three steps of "How it works") and host-desk.webp (the host team's card on the contact page). Replace them under the same names. Stay and destination photographs are uploaded in the dashboard.
The website's colours and type
| Token | Light | Dark | Role |
|---|---|---|---|
--primaryColor | #3F5B38 | #AEC79F | Primary actions, selected controls, prices, the double frame, focus ring |
--primaryColorHover | #30472B | #C1D6B5 | Hover and pressed |
--primary-tint | #E2E9D8 | #2B3B2A | Selected fills, the selected nights on a calendar, quiet panels |
--background | #F4F5EE | #171D17 | Page |
--surface | #FFFFFF | #222B22 | Cards, header, footer, dialogs |
--text | #263128 | #F0F3EB | Headings and strong text |
--text-muted | #586454 | #BEC8B7 | 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 font files ship in src/fonts/ and load with next/font/local, so a build never downloads them and the site makes no request to Google: Outfit for Latin text and the wordmark, Instrument Serif for the display headings, and Noto Sans Arabic for Arabic text, all under the SIL Open Font License. The map's area colour is STAY_AREA_COLOR in src/lib/map/mapConfig.ts, and the browser bar colours are themeColor.light and themeColor.dark in the brand config.
Search results, sharing, prices 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 stay page uses the stay's own SEO title and description, written in the editor, and its cover photograph. - Prices are formatted in one place,
src/lib/utils/formatPrice.ts, as the currency code followed by the amount in Latin digits (USD 240), and drawn bysrc/components/PriceDisplay. A nightly rate adds its period from the translations (/ night,common.stay.perNightinmessages/common).
Light, dark and system
Both apps have a theme control with System, Light and Dark. System follows the operating system and changes when it does. The choice is kept in the browser's localStorage (hollina-theme on the website, hollina-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 (Bookings | Hollina);metaholds the default title, description, keywords and author,domain.urlthe base of absolute metadata URLs,manifestthe installable app. Each page's own title is undermeta.titlesin thedashboardandauthnamespaces ofmessages/, and the label beside the header's wordmark isheader.workspaceinmessages/dashboard. - Mark: replace
public/brand/hollina-mark.svgandhollina-mark-white.svg, keeping the names;BrandMarkpaints them from the--logo-bg-imagetoken insrc/styles/theme-variables.css. 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,--on-primary,--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: Outfit and Noto Sans Arabic, shipped in
src/fonts/, loaded insrc/app/layout.tsxand assigned insrc/styles/base.css.
The company's own details
What guests read about the company is data, not code. It is edited in the dashboard's settings and read by the website from GET /api/settings/public, which falls back to the brand config only until it answers.
| Tab | Settings |
|---|---|
| Company | company_name, company_tagline and company_description in both languages, contact_email, contact_phone, contact_address_hint, currency, timezone, default_check_in_time, default_check_out_time, service_email_signature |
| Homepage | home_hero_stay_reference (the stay in the hero) and home_featured_references (the featured stays, in order) |
| Payments | allow_pay_on_arrival and the cancellation_policy guests read, in both languages |
The currency is USD and the time zone America/New_York, the only options the dashboard offers. 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. Rewrite the copy in both files. The privacy policy in messages/privacy is template copy and says so on the page: rewrite it for your company and your country before you go live, then remove that note (the framed panel in src/features/privacy/components/PrivacyHeader.tsx, and its templateNote key in both files). Its contact line shows the email from the dashboard's settings.