Skip to the article
Aniq-UI

HollinaBranding

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

WhatWebsite (storefront/)Dashboard (admin-dashboard/)
Name and metadatasrc/config/brand.config.tssrc/config/brand.config.ts
Time zone and currency fallbackssrc/config/booking.config.tsThe company settings
Colours, radius, shadowssrc/styles/theme-variables.csssrc/styles/theme-variables.css
Mark and iconspublic/brand/, public/, src/app/public/brand/, public/, src/app/
Fontssrc/app/[locale]/layout.tsx, files in src/fonts/src/app/layout.tsx, files in src/fonts/
Wordingmessages/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:

storefront/src/config
// 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 own

The 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.

FileUsed for
public/brand/hollina-mark.svgThe mark in the light theme (header, footer)
public/brand/hollina-mark-white.svgThe mark in the dark theme
src/app/icon.svgThe browser tab icon
src/app/apple-icon.pngThe home-screen icon on iPhone and iPad
public/web-app-manifest-192x192.png, public/web-app-manifest-512x512.pngThe installable app icons
public/icons/stay-types/type-*.svgThe six stay-type marks, drawn in currentColor
public/icons/flags/us.svg, sa.svgThe 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

TokenLightDarkRole
--primaryColor#3F5B38#AEC79FPrimary actions, selected controls, prices, the double frame, focus ring
--primaryColorHover#30472B#C1D6B5Hover and pressed
--primary-tint#E2E9D8#2B3B2ASelected fills, the selected nights on a calendar, quiet panels
--background#F4F5EE#171D17Page
--surface#FFFFFF#222B22Cards, header, footer, dialogs
--text#263128#F0F3EBHeadings and strong text
--text-muted#586454#BEC8B7Secondary 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_URL is 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 meta in each namespace of messages/ (the home page's in messages/home, the default in messages/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 by src/components/PriceDisplay. A nightly rate adds its period from the translations (/ night, common.stay.perNight in messages/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: name in src/config/brand.config.ts is the wordmark and the brand half of every page title (Bookings | Hollina); meta holds the default title, description, keywords and author, domain.url the base of absolute metadata URLs, manifest the installable app. Each page's own title is under meta.titles in the dashboard and auth namespaces of messages/, and the label beside the header's wordmark is header.workspace in messages/dashboard.
  • Mark: replace public/brand/hollina-mark.svg and hollina-mark-white.svg, keeping the names; BrandMark paints them from the --logo-bg-image token in src/styles/theme-variables.css. The browser tab icon is src/app/icon0.svg, the iPhone icon src/app/apple-icon.png, and the installable app's icons the two web-app-manifest files in public/.
  • Colours: --primaryColor, --primaryColorHover, --on-primary, --primary-tint, --background, --surface, --text, --text-muted, --border and --errorColor, plus the --tone-* pairs for status pills, in src/styles/theme-variables.css, once per theme. Which status takes which tone is in src/config/statusTones.ts.
  • Fonts: Outfit and Noto Sans Arabic, shipped in src/fonts/, loaded in src/app/layout.tsx and assigned in src/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.

TabSettings
Companycompany_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
Homepagehome_hero_stay_reference (the stay in the hero) and home_featured_references (the featured stays, in order)
Paymentsallow_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.

Stuck on a step?

Find a fix before you start over.

Troubleshooting

Cookie Preferences

We use cookies to enhance your browsing experience, analyze site traffic, and personalize content. By clicking "Accept All", you consent to our use of cookies for analytics and personalized advertising.