Update testimonials and improve code readability

Refactored the image URL in testimonials and reduced redundancy in the FeaturesStats and accordion components, enhancing code readability. Also, implemented dynamic id generation in the FAQ component, improving scalability and maintainability. Added new pages to the website and updated the meta information, improving SEO.
This commit is contained in:
Emil Gulamov 2024-02-14 22:56:43 +04:00
parent fbc2128cdb
commit a9b4e8c0dc
20 changed files with 168 additions and 87 deletions

View file

@ -1,55 +1,42 @@
--- ---
// import necessary dependencies
import AccordionItem from "./ui/blocks/AccordionItem.astro"; import AccordionItem from "./ui/blocks/AccordionItem.astro";
/* `subTitle` variable used to customise the sub-heading text. */
const subTitle: string = const subTitle: string =
"Ask us anything about our brand and products, and get factual responses."; "Ask us anything about our brand and products, and get factual responses.";
/* // Define a helper function to generate ids
In the above, the subTitle attribute is a variables part of the FAQ component. const makeId = (base, index) => `${base}${index + 1}`;
*/
const faqs = [ const faqs = [
{ {
id: "hs-basic-with-title-and-arrow-stretched-heading-one",
collapseId: "hs-basic-with-title-and-arrow-stretched-collapse-one",
heading: "What types of tools are included in the Starter Kit?", heading: "What types of tools are included in the Starter Kit?",
content: content:
"The Starter Kit features essential hand and power tools for diverse DIY projects, including hammers, drills, screwdrivers, and a variety of fasteners. It's a curated selection to help beginners and experienced DIYers alike tackle most home improvement tasks.", "The Starter Kit features essential hand and power tools for diverse DIY projects, including hammers, drills, screwdrivers, and a variety of fasteners. It's a curated selection to help beginners and experienced DIYers alike tackle most home improvement tasks.",
}, },
{ {
id: "hs-basic-with-title-and-arrow-stretched-heading-two",
collapseId: "hs-basic-with-title-and-arrow-stretched-collapse-two",
heading: "Can I upgrade from the Starter Kit to the Professional Toolbox?", heading: "Can I upgrade from the Starter Kit to the Professional Toolbox?",
content: content:
"Absolutely! You can upgrade to the Professional Toolbox at any time to access a wider range of high-quality tools, enjoy priority customer support, and receive exclusive content. Contact our support team for a seamless transition.", "Absolutely! You can upgrade to the Professional Toolbox at any time to access a wider range of high-quality tools, enjoy priority customer support, and receive exclusive content. Contact our support team for a seamless transition.",
}, },
{ {
id: "hs-basic-with-title-and-arrow-stretched-heading-three",
collapseId: "hs-basic-with-title-and-arrow-stretched-collapse-three",
heading: heading:
"What discounts are available for bulk orders through the Professional Toolbox plan?", "What discounts are available for bulk orders through the Professional Toolbox plan?",
content: content:
"Professional Toolbox members are entitled to exclusive discounts on bulk orders, the percentage of which may vary depending on the order volume. Get in touch with us to discuss your needs, and we'll provide a tailored discount structure.", "Professional Toolbox members are entitled to exclusive discounts on bulk orders, the percentage of which may vary depending on the order volume. Get in touch with us to discuss your needs, and we'll provide a tailored discount structure.",
}, },
{ {
id: "hs-basic-with-title-and-arrow-stretched-heading-four",
collapseId: "hs-basic-with-title-and-arrow-stretched-collapse-four",
heading: "What kind of customer support can I expect?", heading: "What kind of customer support can I expect?",
content: content:
"All our customers receive dedicated email support. With the Starter Kit, you'll receive our standard support, while the Professional Toolbox plan upgrades you to priority support, meaning faster response times and specialized assistance.", "All our customers receive dedicated email support. With the Starter Kit, you'll receive our standard support, while the Professional Toolbox plan upgrades you to priority support, meaning faster response times and specialized assistance.",
}, },
{ {
id: "hs-basic-with-title-and-arrow-stretched-heading-five",
collapseId: "hs-basic-with-title-and-arrow-stretched-collapse-five",
heading: "How current are the online resources and tutorials?", heading: "How current are the online resources and tutorials?",
content: content:
"We regularly update our online resources and tutorials to reflect the latest trends in DIY and construction, as well as introductions to new tools and techniques. Our material aims to be comprehensive and user-friendly for all skill levels.", "We regularly update our online resources and tutorials to reflect the latest trends in DIY and construction, as well as introductions to new tools and techniques. Our material aims to be comprehensive and user-friendly for all skill levels.",
}, },
{ {
id: "hs-basic-with-title-and-arrow-stretched-heading-six",
collapseId: "hs-basic-with-title-and-arrow-stretched-collapse-six",
heading: heading:
"Does ScrewFast offer services for large-scale construction projects?", "Does ScrewFast offer services for large-scale construction projects?",
content: content:
@ -77,7 +64,13 @@ const faqs = [
<div <div
class="hs-accordion-group divide-y divide-neutral-200 dark:divide-neutral-700" class="hs-accordion-group divide-y divide-neutral-200 dark:divide-neutral-700"
> >
{faqs.map((faq, i) => <AccordionItem {...faq} first={i === 0} />)} {faqs.map((question, i) => {
// Generate ids dynamically
let id = makeId("hs-basic-with-title-and-arrow-stretched-heading-", i);
let collapseId = makeId("hs-basic-with-title-and-arrow-stretched-collapse", i);
return <AccordionItem {...question} id={id} collapseId={collapseId} first={i === 0} />
})}
</div> </div>
</div> </div>
</div> </div>

View file

@ -53,7 +53,7 @@ const stats: Stat[] = [
title="96%" title="96%"
subTitle="of our clients rate their experience with ScrewFast as exceptional" subTitle="of our clients rate their experience with ScrewFast as exceptional"
/> />
</div>
<div <div
class="relative lg:col-span-8 lg:before:absolute lg:before:-start-12 lg:before:top-0 lg:before:h-full lg:before:w-px lg:before:bg-neutral-300 lg:before:dark:bg-neutral-700" class="relative lg:col-span-8 lg:before:absolute lg:before:-start-12 lg:before:top-0 lg:before:h-full lg:before:w-px lg:before:bg-neutral-300 lg:before:dark:bg-neutral-700"
> >
@ -68,5 +68,4 @@ const stats: Stat[] = [
</div> </div>
</div> </div>
</div> </div>
</div>
</div> </div>

View file

@ -9,11 +9,12 @@ const title: string = "Let's Build Together";
// Sub-heading text // Sub-heading text
const subTitle: string = const subTitle: string =
"ScrewFast is an open-source template, meticulously crafted with Astro, Tailwind CSS, and Preline UI frameworks."; "ScrewFast is an open-source template, meticulously crafted with Astro, Tailwind CSS, and Preline UI frameworks.";
--- ---
<div class="relative mx-auto max-w-[85rem] px-4 pb-24 pt-10 sm:px-6 lg:px-8"> <div class="relative mx-auto max-w-[85rem] px-4 pb-24 pt-10 sm:px-6 lg:px-8">
<div class="absolute top-[55%] left-0 md:top-[20%] xl:left-[10%] xl:top-[25%] scale-90"> <div
class="absolute left-0 top-[55%] scale-90 md:top-[20%] xl:left-[10%] xl:top-[25%]"
>
<svg <svg
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
width="64" width="64"
@ -85,7 +86,9 @@ const subTitle: string =
d="M10.5 19H9M15 19h-1.5"></path> d="M10.5 19H9M15 19h-1.5"></path>
</svg> </svg>
</div> </div>
<div class="absolute bottom-[5%] left-[60%] xl:bottom-[15%] xl:left-[35%] scale-[.6]"> <div
class="absolute bottom-[5%] left-[60%] scale-[.6] xl:bottom-[15%] xl:left-[35%]"
>
<svg <svg
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
width="64" width="64"
@ -119,7 +122,9 @@ const subTitle: string =
</div> </div>
<div class="mx-auto mt-5 max-w-3xl text-center"> <div class="mx-auto mt-5 max-w-3xl text-center">
<p class="text-lg text-neutral-600 dark:text-neutral-400">{subTitle}</p> <p class="text-pretty text-lg text-neutral-600 dark:text-neutral-400">
{subTitle}
</p>
</div> </div>
<div class="mt-8 flex justify-center gap-3"> <div class="mt-8 flex justify-center gap-3">

View file

@ -1,10 +1,18 @@
--- ---
// Assign a description using the `meta` prop passed from the parent component,
// `meta` is used as a variable on each individual page by passing it as a prop to this component.
// For example, you can pass a meta description to the MainLayout component like this: <MainLayout title="Page title" meta="Page description"/>
const { meta: description } = Astro.props;
interface Props {
meta?: string;
}
// Customize the following metadata for your landing page // Customize the following metadata for your landing page
const title: string = "ScrewFast"; // Replace with your website title const title: string = "ScrewFast"; // Replace with your website title
const ogTitle: string = "ScrewFast: Hardware Tools & Construction Services"; // Replace with your Open Graph title const ogTitle: string = "ScrewFast: Hardware Tools & Construction Services"; // Replace with your Open Graph title
const author:string = "Emil Gulamov" // Replace with the author's name const author:string = "Emil Gulamov" // Replace with the author's name
const description:string = "ScrewFast offers top-tier hardware tools and expert construction services to meet all your project needs. Start exploring and contact our sales team for superior quality and reliability."; // Replace with your site description
const ogDescription: string = "Equip your projects with ScrewFast's top-quality hardware tools and expert construction services. Trusted by industry leaders, ScrewFast offers simplicity, affordability, and reliability. Experience the difference with user-centric design and cutting-edge tools. Start exploring now!"; // Replace with your site description for social media const ogDescription: string = "Equip your projects with ScrewFast's top-quality hardware tools and expert construction services. Trusted by industry leaders, ScrewFast offers simplicity, affordability, and reliability. Experience the difference with user-centric design and cutting-edge tools. Start exploring now!"; // Replace with your site description for social media
const URL:string = "https://screw-fast.vercel.app"; // Replace with your website URL const URL:string = "https://screw-fast.vercel.app"; // Replace with your website URL
const socialImage:string = "https://screw-fast.vercel.app/social.png"; // Replace with the URL to your social media image const socialImage:string = "https://screw-fast.vercel.app/social.png"; // Replace with the URL to your social media image

View file

@ -23,7 +23,7 @@ const testimonials: Testimonial[] = [
author: "Samantha Ruiz", author: "Samantha Ruiz",
role: "Chief Operating Officer | ConstructIt Inc.", role: "Chief Operating Officer | ConstructIt Inc.",
avatarSrc: avatarSrc:
"https://images.unsplash.com/photo-1669837401587-f9a4cfe3126e?ixlib=rb-4.0.3&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=facearea&facepad=2&w=320&h=320&q=80", "https://images.unsplash.com/photo-1593104547489-5cfb3839a3b5?q=80&w=1453&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D8&auto=format&fit=facearea&facepad=2&w=320&h=320&q=80",
}, },
]; ];

View file

@ -1,9 +1,9 @@
--- ---
const { src, alt = "Image Description" } = Astro.props; const { src, alt } = Astro.props;
interface Props { interface Props {
src?: string; src: string;
alt?: string; alt: string;
} }
--- ---

View file

@ -8,10 +8,17 @@ interface Props {
content: string; content: string;
first?: boolean; first?: boolean;
} }
const ACCORDION_CLASS_DEFAULT = "hs-accordion pb-3 active";
const ACCORDION_CLASS_COLLAPSED = "hs-accordion pt-6 pb-3";
const ACCORDION_CONTENT_CLASS = "hs-accordion-content w-full overflow-hidden transition-[height] duration-300";
function getAccordionClass(first: boolean) {
return first ? ACCORDION_CLASS_DEFAULT : ACCORDION_CLASS_COLLAPSED;
}
const SVG_PARAMS = { width: "24", height: "24", viewBox: "0 0 24 24", fill: "none", "stroke": "currentColor", "stroke-width": "2", "stroke-linecap": "round", "stroke-linejoin": "round" };
--- ---
<div <div
class=`${first ? "hs-accordion pb-3 active" : "hs-accordion pt-6 pb-3"}` class={getAccordionClass(first)}
id={id} id={id}
> >
<button <button
@ -21,35 +28,19 @@ interface Props {
{heading} {heading}
<svg <svg
class="block h-5 w-5 flex-shrink-0 text-neutral-600 group-hover:text-neutral-500 hs-accordion-active:hidden dark:text-neutral-400" class="block h-5 w-5 flex-shrink-0 text-neutral-600 group-hover:text-neutral-500 hs-accordion-active:hidden dark:text-neutral-400"
width="24" {...SVG_PARAMS}
height="24" ><path d="m6 9 6 6 6-6"></path></svg
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"><path d="m6 9 6 6 6-6"></path></svg
> >
<svg <svg
class="hidden h-5 w-5 flex-shrink-0 text-neutral-600 group-hover:text-neutral-500 hs-accordion-active:block dark:text-neutral-400" class="hidden h-5 w-5 flex-shrink-0 text-neutral-600 group-hover:text-neutral-500 hs-accordion-active:block dark:text-neutral-400"
width="24" {...SVG_PARAMS}
height="24" ><path d="m18 15-6-6-6 6"></path></svg
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"><path d="m18 15-6-6-6 6"></path></svg
> >
</button> </button>
<div <div
aria-labelledby={id} aria-labelledby={id}
class=`${first class={`${first ? ACCORDION_CONTENT_CLASS : 'hidden ' + ACCORDION_CONTENT_CLASS}`}
? "hs-accordion-content w-full overflow-hidden transition-[height] duration-300"
: "hs-accordion-content hidden w-full overflow-hidden transition-[height] duration-300"}`
id={collapseId} id={collapseId}
class="hs-accordion-content w-full overflow-hidden transition-[height] duration-300"
aria-labelledby="hs-basic-with-title-and-arrow-stretched-heading-one"
> >
<p class="text-pretty text-neutral-600 dark:text-neutral-400"> <p class="text-pretty text-neutral-600 dark:text-neutral-400">
{content} {content}

View file

@ -20,9 +20,10 @@ interface Props {
class="mx-auto max-w-[85rem] items-center gap-8 px-4 py-10 sm:px-6 sm:py-16 md:grid md:grid-cols-2 lg:grid lg:grid-cols-2 lg:px-8 lg:py-14 xl:gap-16 2xl:max-w-full" class="mx-auto max-w-[85rem] items-center gap-8 px-4 py-10 sm:px-6 sm:py-16 md:grid md:grid-cols-2 lg:grid lg:grid-cols-2 lg:px-8 lg:py-14 xl:gap-16 2xl:max-w-full"
> >
<Image <Image
class="w-full rounded-lg" class="w-full rounded-xl"
src={img} src={img}
alt={imgAlt} alt={imgAlt}
draggable={"false"}
format={"avif"} format={"avif"}
/> />
<div class="mt-4 md:mt-0"> <div class="mt-4 md:mt-0">

View file

@ -58,15 +58,17 @@ interface Props {
) : ( ) : (
<div class="mt-8 grid grid-cols-2 gap-4"> <div class="mt-8 grid grid-cols-2 gap-4">
<Image <Image
class="w-full rounded-lg" class="w-full rounded-xl"
src={imgOne} src={imgOne}
alt={imgOneAlt} alt={imgOneAlt}
draggable={"false"}
format={"avif"} format={"avif"}
/> />
<Image <Image
class="mt-4 w-full rounded-lg lg:mt-10" class="mt-4 w-full rounded-xl lg:mt-10"
src={imgTwo} src={imgTwo}
alt={imgTwoAlt} alt={imgTwoAlt}
draggable={"false"}
format={"avif"} format={"avif"}
/> />
</div> </div>

View file

@ -9,7 +9,6 @@ interface Props {
<div class="lg:pe-6 xl:pe-12"> <div class="lg:pe-6 xl:pe-12">
<p class="text-6xl font-bold leading-10 text-[#fa5a15] dark:text-[#fb713b]"> <p class="text-6xl font-bold leading-10 text-[#fa5a15] dark:text-[#fb713b]">
{title} {title}
</p> </p>
<p class="mt-2 sm:mt-3 text-neutral-600 dark:text-neutral-400">{subTitle}</p> <p class="mt-2 sm:mt-3 text-neutral-600 dark:text-neutral-400">{subTitle}</p>
</div> </div>

View file

@ -6,7 +6,6 @@ interface Props {
subTitle: string; subTitle: string;
} }
--- ---
<div> <div>
<p class="text-3xl font-bold text-[#fa5a15] dark:text-[#fb713b]">{title}</p> <p class="text-3xl font-bold text-[#fa5a15] dark:text-[#fb713b]">{title}</p>
<p class="mt-1 text-neutral-600 dark:text-neutral-400">{subTitle}</p> <p class="mt-1 text-neutral-600 dark:text-neutral-400">{subTitle}</p>

View file

@ -11,6 +11,7 @@ interface Props {
class="group inline-flex items-center justify-center gap-x-3 rounded-full border border-transparent bg-yellow-400 px-4 py-3 text-center text-sm font-medium text-neutral-700 outline-none ring-zinc-500 transition duration-300 hover:shadow-2xl hover:shadow-yellow-500 focus-visible:ring dark:ring-zinc-200 dark:focus:outline-none 2xl:text-base" class="group inline-flex items-center justify-center gap-x-3 rounded-full border border-transparent bg-yellow-400 px-4 py-3 text-center text-sm font-medium text-neutral-700 outline-none ring-zinc-500 transition duration-300 hover:shadow-2xl hover:shadow-yellow-500 focus-visible:ring dark:ring-zinc-200 dark:focus:outline-none 2xl:text-base"
href={url} href={url}
target="_blank" target="_blank"
rel="noopener noreferrer"
> >
<svg <svg
class="w-4.5 h-4.5 tarnsition flex-shrink-0 text-neutral-700 duration-300 group-hover:-translate-y-1" class="w-4.5 h-4.5 tarnsition flex-shrink-0 text-neutral-700 duration-300 group-hover:-translate-y-1"

View file

@ -1,9 +1,10 @@
--- ---
const { title, url } = Astro.props; const { title, url, noArrow } = Astro.props;
interface Props { interface Props {
title?: string; title?: string;
url?: string; url?: string;
noArrow?: boolean;
} }
--- ---
@ -12,6 +13,7 @@ interface Props {
href={url} href={url}
> >
{title} {title}
{noArrow ? null : (
<svg <svg
class="h-4 w-4 flex-shrink-0 transition duration-300 group-hover:translate-x-1" class="h-4 w-4 flex-shrink-0 transition duration-300 group-hover:translate-x-1"
width="24" width="24"
@ -22,5 +24,5 @@ interface Props {
stroke-width="2" stroke-width="2"
stroke-linecap="round" stroke-linecap="round"
stroke-linejoin="round"><path d="m9 18 6-6-6-6"></path></svg stroke-linejoin="round"><path d="m9 18 6-6-6-6"></path></svg
> >) }
</a> </a>

View file

@ -10,6 +10,7 @@ interface Props {
class="inline-flex h-10 w-10 items-center justify-center gap-x-2 rounded-lg border border-transparent text-sm font-bold text-neutral-700 outline-none ring-zinc-500 hover:bg-neutral-500/10 focus:outline-none focus:ring-1 focus:ring-zinc-500 focus-visible:ring disabled:pointer-events-none disabled:opacity-50 dark:ring-zinc-200 dark:hover:bg-neutral-50/10 dark:focus:outline-none" class="inline-flex h-10 w-10 items-center justify-center gap-x-2 rounded-lg border border-transparent text-sm font-bold text-neutral-700 outline-none ring-zinc-500 hover:bg-neutral-500/10 focus:outline-none focus:ring-1 focus:ring-zinc-500 focus-visible:ring disabled:pointer-events-none disabled:opacity-50 dark:ring-zinc-200 dark:hover:bg-neutral-50/10 dark:focus:outline-none"
href={url} href={url}
target="_blank" target="_blank"
rel="noopener noreferrer"
> >
<slot /> <slot />
</a> </a>

View file

@ -3,16 +3,17 @@ import Meta from "../components/Meta.astro";
import Navbar from "../components/Navbar.astro"; import Navbar from "../components/Navbar.astro";
import FooterSection from "../components/FooterSection.astro"; import FooterSection from "../components/FooterSection.astro";
const { title = "ScrewFast" } = Astro.props; const { title = "ScrewFast", meta } = Astro.props;
interface Props { interface Props {
title?: string; title?: string;
meta?: string;
} }
--- ---
<html lang="en" class="scrollbar-hide"> <html lang="en" class="scrollbar-hide scroll-pt-16">
<head> <head>
<Meta /> <Meta meta={meta} />
<title>{title}</title> <title>{title}</title>
<script is:inline> <script is:inline>
// This script is to handle theme according to user preference // This script is to handle theme according to user preference

View file

@ -0,0 +1,7 @@
---
// Import section components
import MainLayout from "../layouts/MainLayout.astro";
---
<MainLayout title="Blog | ScrewFast">
</MainLayout>

View file

@ -5,6 +5,6 @@ import MainLayout from "../layouts/MainLayout.astro";
import ContactSection from "../components/ContactSection.astro"; import ContactSection from "../components/ContactSection.astro";
--- ---
<MainLayout> <MainLayout title="Contact | ScrewFast" meta="ScrewFast offers top-tier hardware tools and expert construction services to meet all your project needs. Start exploring and contact our sales team for superior quality and reliability.">
<ContactSection /> <ContactSection />
</MainLayout> </MainLayout>

View file

@ -11,7 +11,7 @@ import PricingSection from "../components/PricingSection.astro";
import FAQ from "../components/FAQ.astro"; import FAQ from "../components/FAQ.astro";
--- ---
<MainLayout> <MainLayout meta="ScrewFast offers top-tier hardware tools and expert construction services to meet all your project needs. Start exploring and contact our sales team for superior quality and reliability.">
<HeroSection /> <HeroSection />
<ClientsSection /> <ClientsSection />

View file

@ -0,0 +1,72 @@
---
// Import section components
import MainLayout from "../layouts/MainLayout.astro";
import PrimaryCTA from "../components/ui/buttons/PrimaryCTA.astro";
import ImgSmall from "../components/ui/images/ImgSmall.astro";
import ImgWide from "../components/ui/images/ImgWide.astro";
import FeaturesStats2 from "../components/FeaturesStats2.astro";
import TestimonialsSection2 from "../components/TestimonialsSection2.astro";
import product1 from "../images/product-image-1.avif";
import product2 from "../images/product-image-2.avif";
import product3 from "../images/product-image-3.avif";
import product4 from "../images/product-image-4.avif";
const title: string = "Products";
const subTitle: string =
"Explore the durability and precision of ScrewFast tools, designed for both professionals and enthusiasts. Each of our products is crafted with precision and built to last, ensuring you have the right tool for every job.";
---
<MainLayout title="Products | ScrewFast" meta="ScrewFast offers top-tier hardware tools and expert construction services to meet all your project needs. Start exploring and contact our sales team for superior quality and reliability.">
<div
class="mx-auto max-w-[85rem] px-4 py-10 sm:px-6 lg:px-8 lg:py-14 2xl:max-w-full"
>
<div class="mb-4 flex items-center justify-between gap-8 sm:mb-8 md:mb-12">
<div class="flex items-center gap-12">
<h1
class="text-balance text-2xl font-bold tracking-tight text-neutral-800 dark:text-neutral-200 md:text-4xl md:leading-tight"
>
{title}
</h1>
<p
class="hidden max-w-screen-sm text-pretty text-neutral-600 dark:text-neutral-400 md:block"
>
{subTitle}
</p>
</div>
<PrimaryCTA title="Customer Stories" url="#testimonials" noArrow={true} />
</div>
<div class="grid grid-cols-2 gap-4 sm:grid-cols-3 md:gap-6 xl:gap-8">
<ImgSmall
url="#"
title="Machine Screws"
src={product1}
alt="Mockup box of machine screws"
/>
<ImgWide
url="#"
title="Assorted Screw Set"
src={product2}
alt="Mockup box of assorted screw set"
/>
<ImgWide
url="#"
title="Tap Bolts and Nuts"
src={product3}
alt="Mockup box of tap bolts and nuts"
/>
<ImgSmall
url="#"
title="Hex Bolts"
src={product4}
alt="Mockup box of hex bolts"
/>
</div>
</div>
<FeaturesStats2 />
<TestimonialsSection2 />
</MainLayout>

View file

@ -16,7 +16,7 @@ import progressBuilding from "../images/progress-building.avif";
import underConstruction from "../images/under-construction.avif"; import underConstruction from "../images/under-construction.avif";
--- ---
<MainLayout> <MainLayout title="Services | ScrewFast" meta="ScrewFast offers top-tier hardware tools and expert construction services to meet all your project needs. Start exploring and contact our sales team for superior quality and reliability.">
<MainSection <MainSection
title="Uniting Expertise with Your Vision" title="Uniting Expertise with Your Vision"
subTitle="At ScrewFast, we take pride in providing comprehensive solutions and exceptional service in the hardware and construction industry. Our experienced team is dedicated to supporting your project from inception to completion with a range of specialized services." subTitle="At ScrewFast, we take pride in providing comprehensive solutions and exceptional service in the hardware and construction industry. Our experienced team is dedicated to supporting your project from inception to completion with a range of specialized services."