diff --git a/src/components/FeaturesStats2.astro b/src/components/FeaturesStats2.astro new file mode 100644 index 0000000..db7d2c9 --- /dev/null +++ b/src/components/FeaturesStats2.astro @@ -0,0 +1,56 @@ +--- +import { Image } from "astro:assets"; + +import product5 from "../images/features-image.avif"; + +const title: string = "Why Choose ScrewFast?"; + +const subTitle: string = + "Transform your ideas into tangible results with ScrewFast tools. Whether you're starting with a sketch on a napkin or diving into a comprehensive construction project, our tools are engineered to help you build with confidence."; + +const benefits: string[] = [ + "Robust and reliable tools for long-lasting performance.", + "Innovative solutions tailored to modern construction needs.", + "Customer support dedicated to your project's success.", +]; + +const ListItemMarker:string = ``; +--- + +
+ +
+
+ Mockup of floating boxes +
+
+
+
+

+ {title} +

+

+ {subTitle} +

+
+
    + { + benefits.map((item) => ( +
  • + + + + {item} + +
  • + )) + } +
+
+
+
+
diff --git a/src/components/TestimonialsSection2.astro b/src/components/TestimonialsSection2.astro new file mode 100644 index 0000000..8bceb65 --- /dev/null +++ b/src/components/TestimonialsSection2.astro @@ -0,0 +1,94 @@ +--- +// Import the necessary dependencies from individual component files +import AvatarTestimonialSection2 from "./ui/avatars/AvatarTestimonialSection2.astro"; + +// Variables for customization of the LoginModal Component +// Main heading +const title: string = "What Our Customers Say"; + +/* TypeScript type for product. */ +type Testimonial = { + content: string; + author: string; + role: string; + avatarSrc: string; + avatarAlt: string; +}; + +const testimonials: Testimonial[] = [ + { + content: + " \"Since switching to ScrewFast's hardware tools, the efficiency on our construction sites has skyrocketed. The durability of the hex bolts and precision of the machine screws are simply unmatched. It's refreshing to work with a company that truly understands the daily demands of the industry.\" ", + author: "Jason Clark", + role: "Site Foreman | TopBuild", + avatarSrc: + "https://images.unsplash.com/photo-1500648767791-00dcc994a43e?q=80&w=1374&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=facearea&facepad=2&w=320&h=320&q=80", + avatarAlt: "Image Description", + }, + { + content: + " \"As an interior designer, I'm always looking for high-quality materials and tools that help bring my visions to life. ScrewFast's mixed screws assortment has been a game-changer for my projects, providing the perfect blend of quality and variety. The outstanding customer support was just the cherry on top!\" ", + author: "Maria Gonzalez", + role: "Interior Designer | Creative Spaces", + avatarSrc: + "https://images.unsplash.com/photo-1544005313-94ddf0286df2?q=80&w=1376&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", + avatarAlt: "Image Description", + }, + { + content: + " \"I’ve been a professional carpenter for over 15 years, and I can sincerely say that ScrewFast’s tap bolts and nuts are some of the best I've used. They grip like no other, and I have full confidence in every joint and fixture. Plus, the service is impeccable – they truly care about my project's success.\" ", + author: "Richard Kim", + role: "Master Carpenter | WoodWright", + avatarSrc: + "https://images.unsplash.com/photo-1474176857210-7287d38d27c6?q=80&w=1470&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", + avatarAlt: "Image Description", + }, +]; +--- + +
+
+

+ {title} +

+
+ +
+ { + testimonials.map((testimonial) => ( +
+
+
+

+ {testimonial.content} +

+
+ +
+
+ + +
+

+ {testimonial.author} +

+

+ {testimonial.role} +

+
+
+
+
+
+ )) + } +
+
diff --git a/src/components/ui/avatars/AvatarTestimonialSection2.astro b/src/components/ui/avatars/AvatarTestimonialSection2.astro new file mode 100644 index 0000000..2ad43bf --- /dev/null +++ b/src/components/ui/avatars/AvatarTestimonialSection2.astro @@ -0,0 +1,16 @@ +--- +const { src, alt } = Astro.props; + +interface Props { + src: string; + alt: string; +} +--- + +
+ {alt} +
diff --git a/src/components/ui/images/ImgSmall.astro b/src/components/ui/images/ImgSmall.astro new file mode 100644 index 0000000..43cea23 --- /dev/null +++ b/src/components/ui/images/ImgSmall.astro @@ -0,0 +1,41 @@ +--- +import { Image } from "astro:assets"; +const { title, src, alt, url } = Astro.props; + +interface Props { + title?: string; + src: any; + alt: string; + url: string; +} + +const imageClass = "absolute inset-0 h-full w-full object-cover object-center transition duration-[600ms] ease-[cubic-bezier(0.45,0,0.55,1)] group-hover:scale-110"; +const AnchorSVG = ` + + + `; +--- + + + {alt} + +
+
+ + {title} + +
diff --git a/src/components/ui/images/ImgWide.astro b/src/components/ui/images/ImgWide.astro new file mode 100644 index 0000000..5560a1e --- /dev/null +++ b/src/components/ui/images/ImgWide.astro @@ -0,0 +1,39 @@ +--- +import { Image } from "astro:assets"; +const { title, src, alt, url } = Astro.props; + +interface Props { + title?: string; + src: any; + alt: string; + url: string; +} + +const imageClass = "absolute inset-0 h-full w-full object-cover object-center transition duration-[600ms] ease-[cubic-bezier(0.45,0,0.55,1)] group-hover:scale-110"; +const AnchorSVG = ` + + + `; +--- + + + {alt} + +
+
+ + {title} +
diff --git a/src/images/product-image-1.avif b/src/images/product-image-1.avif new file mode 100644 index 0000000..8cb252b Binary files /dev/null and b/src/images/product-image-1.avif differ diff --git a/src/images/product-image-2.avif b/src/images/product-image-2.avif new file mode 100644 index 0000000..4084832 Binary files /dev/null and b/src/images/product-image-2.avif differ diff --git a/src/images/product-image-3.avif b/src/images/product-image-3.avif new file mode 100644 index 0000000..0dd368b Binary files /dev/null and b/src/images/product-image-3.avif differ diff --git a/src/images/product-image-4.avif b/src/images/product-image-4.avif new file mode 100644 index 0000000..57a60e7 Binary files /dev/null and b/src/images/product-image-4.avif differ diff --git a/vercel.json b/vercel.json new file mode 100644 index 0000000..395d6f2 --- /dev/null +++ b/vercel.json @@ -0,0 +1,41 @@ +{ + "headers": [ + { + "source": "/(.*)", + "headers": [ + { + "key": "Content-Security-Policy", + "value": "default-src 'self'; base-uri 'self'; form-action 'self'; frame-src 'self'; frame-ancestors 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; connect-src 'self'; object-src 'none'; upgrade-insecure-requests; block-all-mixed-content" + }, + { + "key": "Permissions-Policy", + "value": "interest-cohort=()" + }, + { + "key": "Referrer-Policy", + "value": "no-referrer-when-downgrade" + }, + { + "key": "X-Content-Type-Options", + "value": "nosniff" + }, + { + "key": "X-Frame-Options", + "value": "SAMEORIGIN" + }, + { + "key": "X-XSS-Protection", + "value": "1; mode=block" + }, + { + "key": "Cache-Control", + "value": "public, max-age=0, must-revalidate" + }, + { + "key": "Strict-Transport-Security", + "value": "max-age=31536000; includeSubDomains; preload" + } + ] + } + ] + } \ No newline at end of file