Make it yours
Where to change the text, the projects, prices, images, colours, fonts, sections, links, the contact form and the search engine details.
Text
Every visible word, every button label and alt text, and the page's title and description are in messages/en.json and messages/ar.json. Change the value, keep the key, and change both files.
| Part of the page | Key in the message files |
|---|---|
| Page title, description, site name | metadata |
| Brand name in the logo | common.brand |
| Navbar and mobile menu | navigation |
| Hero | hero |
| Features | features |
| Work | work |
| Process | process |
| Testimonials | testimonials |
| Pricing | pricing |
| Contact, the form and the address | contact |
| Footer | footer |
- Words in curly braces, such as
{year}infooter.copyright, are filled in by the page. Keep them as they are in both languages. - Each plan's features are a list: add or remove lines in
pricing.plans.basic.features(andstandard,premium) in both files.
Projects, features, steps, testimonials and plans
Each of these is a list in its section's constants/ folder. An entry's key names its text in the message files.
| List | File | Besides the key |
|---|---|---|
| Projects | src/features/home/Work/constants/projectItems.ts | image, year |
| Features | src/features/home/Features/constants/featureItems.ts | icon, a Lucide icon |
| Process steps | src/features/home/Process/constants/processSteps.ts | number |
| Testimonials | src/features/home/Testimonials/constants/testimonialItems.ts | Nothing |
| Plans | src/features/home/Pricing/constants/pricingPlans.ts | monthlyPrice, annualPrice, popular |
To add one, add an entry with a new key, then add that key's text in both message files. A new project with the key atlas needs work.projects.atlas.title and work.projects.atlas.subtitle.
Prices and currency
The amounts are plain numbers, monthlyPrice and annualPrice, in pricingPlans.ts. The currency is set once, currency: "USD", in src/features/home/Pricing/components/PricingCard.tsx: change it to another currency code such as EUR. Prices are formatted for the page's language.
The "Save 20%" label is text, pricing.save. Update it when your annual discount changes.
Images
| Image | File |
|---|---|
| Projects, shown in 4:3 frames | public/works/1.webp to 4.webp, listed in projectItems.ts |
| Social preview card, 1200 by 630 | public/image.png |
| Browser and home screen icons | public/favicon.ico, favicon.svg, favicon-96x96.png, apple-touch-icon.png, web-app-manifest-192x192.png, web-app-manifest-512x512.png |
Keep a file's name to replace it without touching the code, or change its path in projectItems.ts. The project images show in greyscale until the pointer is over them.
Colours
The palette is the list of CSS variables at the top of src/styles/globals.css, such as --background, --foreground, --primary and --border, written as HSL numbers and used by tailwind.config.ts. --radius is 0rem, which keeps every corner square.
Many sections also use Tailwind's black, white and neutral classes directly, such as bg-black and text-white/70. A new colour scheme means changing those classes in the sections' files too.
The site is dark only: the layout sets the dark class, and the theme does not follow the visitor's system.
Fonts
src/app/[locale]/layout.tsx loads Inter for English and Noto Sans Arabic for Arabic with next/font/google, and the page's text uses the one for its language.
Inter is also published as the CSS variable --font-inter, which the headings (h1 to h6) use in src/styles/globals.css, in every language but Arabic. To change the English font, import another family from next/font/google in the layout and keep variable: "--font-inter" on it, so the headings follow.
Sections
src/app/[locale]/page.tsx lists the sections in order. Move a line to reorder them, or delete one to remove its section. Each section lives in src/features/home/, in a folder of its own.
When you remove a section, also remove its link from src/layouts/constants/sectionLinks.ts, so the navbar and the footer do not point at it.
Links and buttons
| Links | File |
|---|---|
Navbar and footer section links (#features, #work, #process, #pricing) | src/layouts/constants/sectionLinks.ts |
| Footer social icons | src/layouts/Footer/constants/socialLinks.ts |
| Privacy and terms links | src/layouts/Footer/constants/legalLinks.ts |
| Contact section social links | src/features/home/Contact/constants/contactSocials.ts |
| Contact email and phone | src/features/home/Contact/constants/contactDetails.ts |
The social and legal links ship as #: put your own address in each href. The template has no privacy or terms page of its own.
Buttons without a destination
The Contact button in the navbar and the mobile menu, the hero's two buttons, View All Work, the pricing buttons and the project cards do not link anywhere yet. Make each one a link to where you want it, such as #contact, in src/layouts/Navbar/components/DesktopNav.tsx and MobileMenu.tsx, src/features/home/Hero/components/HeroButtons.tsx, src/features/home/Work/index.tsx and components/ProjectCard.tsx, and src/features/home/Pricing/components/PricingCard.tsx.
The contact form
The form checks the name, the email and the message in the browser before it sends; the error texts are under contact.form.validation. Where it sends depends on NEXT_PUBLIC_API_BASE_URL:
- Empty, the default: nothing is sent. After a short pause the form shows its success message, so you can try it.
- Set: the form sends
POSTto your API's/contactpath with the JSON body{ name, email, message }. A 2xx answer shows the success message, unless its JSON says"success": false; any other answer shows the error message.
The visitor's browser sends the request, so your API must accept requests from your site's address (CORS). The call is in src/lib/api/contact.ts. The value is written in at build time: build again after you set it.
Search engines and social cards
The page title, the description, the site name and the preview image's alt text are under metadata in each message file. NEXT_PUBLIC_SITE_URL sets the canonical link, the en and ar language links and the address in the social preview cards, which show public/image.png.
generatorinsrc/app/[locale]/layout.tsxnames the template's author in the page head. Put your own name there, or remove the line.public/site.webmanifestnames the siteMonofor phones that add it to the home screen. Put your site's name there.- The template ships no
robots.txtand no sitemap. Addsrc/app/robots.tsandsrc/app/sitemap.tsif you want them.
The custom cursor
On screens 768 pixels wide and more, the page hides the system pointer and draws its own dot and ring, from src/components/FloatingCursor/. To keep the normal pointer, remove <FloatingCursor /> from src/app/[locale]/layout.tsx and the cursor: none rules near the top of src/styles/globals.css.