Branding
Make the website and the dashboard yours: the name, the lockups and icons, the colours and type, the organiser's details and the search engine texts.
For the Full Stack package
Where the brand lives
| What | Website (storefront/) | Dashboard (admin-dashboard/) |
|---|---|---|
| Name, lockups, contact email, market | src/config/brand.config.ts | src/config/brand.config.ts |
| Colours, lines, shadows | src/styles/theme-variables.css | src/styles/theme-variables.css |
| Lockups, mark and icons | public/brand/, public/, src/app/ | public/brand/, public/, src/app/ |
| Decorations | public/decor/ | public/decor/ |
| Fonts | src/fonts/, loaded in src/app/[locale]/layout.tsx | src/fonts/, loaded in 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: "Ticketory", // the manifest and search engines' structured data
description: "...", // the installable app's description
mark: "/brand/mark.svg", // structured data for search engines
lockups: { en: {...}, ar: {...} }, // the header and footer logo, with each file's size
themeColor: { light: "#FFFBF0", dark: "#111111" }, // the browser bar
contactEmail: "support@example.test", // until the API's settings answer
market: {
currency: "USD", // money with no currency of its own
timeZone: "Europe/London", // dates with no time zone of their own
},
keywords: ["events", "tickets", ...],The name as each language writes it, used in tab titles and sharing cards, is meta.siteName in messages/layouts/en.json and ar.json. The product name also appears in sentences, in both languages: search messages/ for Ticketory and for its Arabic spelling, تيكيتوري, and rewrite those lines.
The website's lockups, icons and decorations
| File | Used for |
|---|---|
public/brand/lockup-en-light.webp, lockup-en-dark.webp | The English lockup (mark and name drawn together) on light and dark pages |
public/brand/lockup-ar-light.webp, lockup-ar-dark.webp | The Arabic lockup, the name in Arabic lettering with the mark on the right |
public/brand/mark.svg | The mark alone |
public/brand/og-card.png | The sharing card, 1200 by 630 |
src/app/icon.svg, src/app/apple-icon.png | The browser tab and home-screen icons |
public/web-app-manifest-192x192.png, public/web-app-manifest-512x512.png | The installable app's icons |
Each lockup is one finished image with a transparent background, trimmed to its content. Replace them with your own at any size and write each file's width and height into lockups in the brand config, so the header keeps its proportions.
The stars, waves, triangles, circles, dots and zigzags around the sections are the SVG files in public/decor/. Each section lists where its shapes sit in its feature's constants/ folder (the footer's in src/layouts/app/SiteFooter/constants/): delete a row to drop a shape, or put your own SVG in public/decor/ and add its file name to DecorAsset in src/components/Decorations/types.ts.
The website's colours and type
| Token | Light | Dark | Role |
|---|---|---|---|
--background | #FFFBF0 | #111111 | Page |
--surface | #FFFEF7 | #1B1B1B | Panels, cards, fields |
--text | #080808 | #FFFBF0 | Text |
--border | #111111 | #777777 | The 3px ink line on panels and controls |
--primaryColor | #FF3289 | #FF3289 | Primary buttons, the current page, the headline dot |
--accent-yellow, --accent-teal, --accent-blue | #FFDC32, #00C7B8, #244BFF | The same | Ticket colours |
--errorColor | #A51D4F | #FF6B9E | Errors and required marks |
Text on the pink, yellow and teal fills is black (--on-accent), on blue and ink it is cream. Check that text on your colours still reads at 4.5 to 1 in both themes. Each event also carries its own ticket colour, chosen in the event editor.
The font files ship in src/fonts/ of each app, so a build never downloads them: Archivo Black for headlines (Lalezar in Arabic) and DM Sans for text (Noto Sans Arabic), all under the SIL Open Font License in src/fonts/OFL.txt. To change one, put the .woff2 file in src/fonts/, point the localFont call at it, and add its licence to OFL.txt.
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.- The default title, description and sharing text are under
metainmessages/layouts; each page's own are undermetain its namespace ofmessages/. An event page uses the event's title and summary. - The sitemap lists the home, events, venues, organisers, pricing, FAQ, contact and legal pages, every public event, venue and organiser, each in both languages with its alternate. robots.txt keeps the account, checkout, order and sign-in pages out.
- Money is written the same way in both languages, the symbol first in Latin digits (
$41.20), bysrc/lib/format/formatMoney.ts.
Light, dark and system
Both apps offer System, Light and Dark. System follows the operating system and changes when it does. The choice is kept in the browser's localStorage (ticketory-theme on the website, ticketory-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 browser bar colours are themeColor on the website and theme in the dashboard's brand config.
The dashboard's name, lockups and colours
- Name:
nameinsrc/config/brand.config.ts, in English and Arabic (Ticketoryandتيكيتوري, also incompany,shortName, the logo's alternative text andmanifest), is the brand half of every page title (Events | Ticketory) and the lockup's alternative text;metaholds the default title, description and keywords and the sharing picture (public/og-image.jpg, 1200 by 630),domain.urlthe base of absolute metadata URLs (NEXT_PUBLIC_DASHBOARD_URLwins over it),manifestthe installable app. Each page's own title is undermeta.titlesin thedashboardandauthnamespaces ofmessages/. - Lockups and icons: replace the four
lockup-*.webpfiles andmark.svginpublic/brand/, keeping the names, or change the paths and sizes inBRAND_LOCKUPS. 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:
--background,--surfaceand--surface-elevated,--surface-hover,--surface-sunken,--text,--text-muted,--border,--primaryColor, the accents,--ink-buttonand--on-ink,--errorColor,--shadow-ink, and 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: DM Sans, Noto Sans Arabic, Archivo Black and Lalezar, loaded from
src/fonts/insrc/app/layout.tsxand assigned insrc/styles/base.css.
The organiser's own details
Each workspace's name, support email, currency (USD, EUR, GBP, SAR or AED), time zone and booking fee, which the attendee always pays at checkout, are settings, edited in the dashboard under Settings, General. The website reads them from GET /api/public/settings, with the seat hold length (ten minutes as seeded) and the payment methods on offer. Every event also carries its own time zone.
The brand lockups are not uploaded in the dashboard: they come from the files above.
Wording and the legal pages
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, terms and cancellation policy in messages/legal are sample texts: rewrite them for your business and your country before you sell real tickets.