Remove unused authentication components and settings

Due to design changes, removed old authentication components and related configuration settings in .idea and .vscode folders. Changes include elimination of subscription input, email input, login and register modals, and user interface blocks. All changes aim to clean up the codebase and eliminate unused or unnecessary code.
This commit is contained in:
Emil Gulamov 2024-02-14 05:47:32 +04:00
parent 829d87be7c
commit 443597b15d
36 changed files with 185 additions and 554 deletions

2
.gitignore vendored
View file

@ -2,6 +2,8 @@
dist/
# generated types
.astro/
.idea/
.vscode/
# dependencies
node_modules/

5
.idea/.gitignore generated vendored
View file

@ -1,5 +0,0 @@
# Default ignored files
/shelf/
/workspace.xml
# Editor-based HTTP Client requests
/httpRequests/

12
.idea/ScrewFast.iml generated
View file

@ -1,12 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="WEB_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$">
<excludeFolder url="file://$MODULE_DIR$/.tmp" />
<excludeFolder url="file://$MODULE_DIR$/temp" />
<excludeFolder url="file://$MODULE_DIR$/tmp" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

8
.idea/modules.xml generated
View file

@ -1,8 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/ScrewFast.iml" filepath="$PROJECT_DIR$/.idea/ScrewFast.iml" />
</modules>
</component>
</project>

6
.idea/vcs.xml generated
View file

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>

View file

@ -1,4 +0,0 @@
{
"recommendations": ["astro-build.astro-vscode"],
"unwantedRecommendations": []
}

11
.vscode/launch.json vendored
View file

@ -1,11 +0,0 @@
{
"version": "0.2.0",
"configurations": [
{
"command": "./node_modules/.bin/astro dev",
"name": "Development server",
"request": "launch",
"type": "node-terminal"
}
]
}

View file

@ -1,8 +1,8 @@
---
// Import the necessary dependencies from individual component files
import LoginModal from "./ui/authentication/LoginModal.astro";
import RegisterModal from "./ui/authentication/RegisterModal.astro";
import RecoverModal from "./ui/authentication/RecoverModal.astro";
import LoginModal from "./ui/forms/LoginModal.astro";
import RegisterModal from "./ui/forms/RegisterModal.astro";
import RecoverModal from "./ui/forms/RecoverModal.astro";
import LoginBtn from "./ui/buttons/LoginBtn.astro";
---

View file

@ -14,12 +14,12 @@ const subTitle: string =
<!-- Title and description -->
<div class="mx-auto mb-6 w-2/3 space-y-1 text-center sm:w-1/2 lg:w-1/3">
<h2
class="text-balance text-xl font-semibold text-neutral-800 dark:text-neutral-200 md:text-2xl md:leading-tight"
class="text-balance text-xl font-bold text-neutral-800 dark:text-neutral-200 md:text-2xl leading-tight"
>
{title}
</h2>
<p class="text-pretty text-neutral-600 dark:text-neutral-400">
<p class="text-pretty text-neutral-600 dark:text-neutral-400 leading-tight">
{subTitle}
</p>
</div>

View file

@ -58,7 +58,7 @@ const faqs = [
];
---
<div class="mx-auto max-w-[85rem] px-4 py-10 sm:px-6 lg:px-8 lg:py-14">
<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="grid gap-10 md:grid-cols-5">
<div class="md:col-span-2">
<div class="max-w-xs">

View file

@ -1,7 +1,7 @@
---
// Import the necessary dependencies from individual component files
import FooterSocialLink from "./ui/links/FooterSocialLink.astro";
import EmailFooterInput from "./ui/authentication/input/EmailFooterInput.astro";
import EmailFooterInput from "./ui/forms/input/EmailFooterInput.astro";
// Footer Section Names
const sectionOne: string = "Product";
@ -56,14 +56,11 @@ const company: Links[] = [
---
<footer class="w-full bg-neutral-300 dark:bg-neutral-900">
<div class="mx-auto w-full max-w-[85rem] px-4 py-10 sm:px-6 lg:px-8 lg:pt-20">
<div
class="mx-auto w-full max-w-[85rem] px-4 py-10 sm:px-6 lg:px-16 lg:pt-20 2xl:max-w-screen-2xl"
>
<div class="grid grid-cols-2 gap-6 md:grid-cols-4 lg:grid-cols-5">
<div class="col-span-full lg:col-span-1">
<a
class="flex-none rounded-lg text-xl font-semibold outline-none ring-zinc-500 focus-visible:ring dark:ring-zinc-200 dark:focus:outline-none"
href="/"
aria-label="Brand"
>
<!-- Brand Logo -->
<svg class="h-auto w-32" viewBox="0 0 521 226" fill="none">
<rect
@ -118,11 +115,10 @@ const company: Links[] = [
d="M56.064 163.616H26.24V212H8.832V110.624h47.232v14.848H26.24v20.096h29.824v18.048ZM147.389 212h-18.304l-3.712-9.984c-6.827 8.021-15.531 12.032-26.112 12.032-9.557 0-17.664-3.328-24.32-9.984-6.57-6.656-9.856-14.72-9.856-24.192 0-7.253 2.048-13.781 6.144-19.584 4.096-5.888 9.557-10.069 16.384-12.544 4.01-1.451 7.936-2.176 11.776-2.176 7.253 0 13.781 2.091 19.584 6.272 5.888 4.096 10.069 9.557 12.544 16.384L147.389 212Zm-31.104-32.128c0-5.973-2.432-10.624-7.296-13.952-2.816-1.963-6.059-2.944-9.728-2.944-5.973 0-10.581 2.389-13.824 7.168-2.048 2.987-3.072 6.229-3.072 9.728 0 5.888 2.432 10.496 7.296 13.824 2.987 2.048 6.187 3.072 9.6 3.072 4.693 0 8.704-1.621 12.032-4.864 3.328-3.328 4.992-7.339 4.992-12.032Zm92.015 12.544c0 4.096-1.365 7.808-4.096 11.136-5.461 6.656-13.227 9.856-23.296 9.6-4.011-.085-8.405-.981-13.184-2.688-4.693-1.707-8.533-3.84-11.52-6.4l9.6-12.416c4.608 4.352 9.515 6.528 14.72 6.528h.384c2.133 0 4.053-.384 5.76-1.152 2.219-1.024 3.328-2.475 3.328-4.352v-.512c-.256-1.963-1.579-3.371-3.968-4.224-.939-.171-2.944-.555-6.016-1.152-3.84-.768-7.083-1.707-9.728-2.816-7.765-3.328-11.648-9.173-11.648-17.536 0-8.021 3.968-14.037 11.904-18.048 3.499-1.792 7.296-2.731 11.392-2.816 4.267-.085 8.704.64 13.312 2.176 5.291 1.792 9.045 4.139 11.264 7.04l-11.52 10.368c-2.987-2.987-6.229-4.48-9.728-4.48-5.461 0-8.192 1.792-8.192 5.376v.256c0 1.707 2.219 3.157 6.656 4.352.341.085 3.157.64 8.448 1.664 10.752 2.048 16.128 8.619 16.128 19.712v.384ZM251.511 212c-9.557 0-17.664-3.285-24.32-9.856-6.656-6.656-9.984-14.763-9.984-24.32v-67.2h17.28v34.944h17.024v14.72h-17.024v17.536c0 4.693 1.664 8.704 4.992 12.032 3.328 3.243 7.339 4.864 12.032 4.864V212Z"
></path>
</svg>
</a>
</div>
<div class="col-span-1">
<h4 class="font-semibold text-neutral-800 dark:text-neutral-200">
<h4 class="font-bold text-neutral-800 dark:text-neutral-200">
{sectionOne}
</h4>
@ -131,7 +127,7 @@ const company: Links[] = [
product.map((item) => (
<p>
<a
class="inline-flex gap-x-2 text-neutral-600 outline-none ring-zinc-500 transition duration-300 hover:text-neutral-500 focus-visible:ring dark:text-neutral-400 dark:ring-zinc-200 dark:hover:text-neutral-300 dark:focus:outline-none dark:focus:ring-1"
class="inline-flex gap-x-2 rounded-lg text-neutral-600 outline-none ring-zinc-500 transition duration-300 hover:text-neutral-500 focus-visible:ring dark:text-neutral-400 dark:ring-zinc-200 dark:hover:text-neutral-300 dark:focus:outline-none dark:focus:ring-1"
href={item.url}
>
{item.title}
@ -143,7 +139,7 @@ const company: Links[] = [
</div>
<div class="col-span-1">
<h4 class="font-semibold text-neutral-800 dark:text-neutral-200">
<h4 class="font-bold text-neutral-800 dark:text-neutral-200">
{sectionTwo}
</h4>
@ -152,7 +148,7 @@ const company: Links[] = [
company.map((item, index) => (
<p>
<a
class="inline-flex gap-x-2 text-neutral-600 outline-none ring-zinc-500 transition duration-300 hover:text-neutral-500 focus-visible:ring dark:text-neutral-400 dark:ring-zinc-200 dark:hover:text-neutral-300 dark:focus:outline-none dark:focus:ring-1"
class="inline-flex gap-x-2 rounded-lg text-neutral-600 outline-none ring-zinc-500 transition duration-300 hover:text-neutral-500 focus-visible:ring dark:text-neutral-400 dark:ring-zinc-200 dark:hover:text-neutral-300 dark:focus:outline-none dark:focus:ring-1"
href={item.url}
>
{item.title}
@ -169,7 +165,7 @@ const company: Links[] = [
</div>
<div class="col-span-2">
<h4 class="font-semibold text-neutral-800 dark:text-neutral-200">
<h4 class="font-bold text-neutral-800 dark:text-neutral-200">
{sectionThree}
</h4>

View file

@ -8,15 +8,16 @@ import Avatar from "./ui/avatars/Avatar.astro";
import FullStar from "./ui/stars/FullStar.astro";
import HalfStar from "./ui/stars/HalfStar.astro";
/* `title` variable used to customise the main heading. */
// Variables for customization of the HeroSection Component
// Main heading
const title:string = `Equip Your Projects with <span
class="text-yellow-500 dark:text-yellow-400">ScrewFast</span>`;
/* `subTitle` variable used to customise the sub-heading text. */
// Main heading
const subTitle:string =
"Top-quality hardware tools and expert construction services for every project need.";
/* `primaryBtn` and `primaryBtnURL` variables used to customise the text and target link of the primary button. */
// Sub-heading text
const primaryBtn:string = "Start Exploring";
const primaryBtnURL:string = "/products";
@ -33,9 +34,6 @@ const starCount:number = 4;
/* `reviews` variable used to customise the number of reviews. */
const reviews:string = "12.8k";
/*
In the above, the title, subTitle, primaryBtn, primaryBtnURL, secondaryBtn, secondaryBtnURL, rating, starCount, reviews, and imageSource attributes are variables part of the HeroSection component.
*/
---
<div

View file

@ -2,7 +2,7 @@
// Import the necessary dependencies from individual component files
import GithubBtn from "./ui/buttons/GithubBtn.astro";
// Variables for customization of the LoginModal Component
// Variables for customization of the HeroSection2 Component
// Main heading
const title: string = "Let's Build Together";

View file

@ -5,6 +5,7 @@ const title: string = "ScrewFast"; // Replace with your website 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 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 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
---
@ -19,7 +20,7 @@ const socialImage:string = "https://screw-fast.vercel.app/social.png"; // Replac
}
</script>
<meta charset="utf-8" />
<meta
content={description}
name="description"
@ -35,7 +36,7 @@ const socialImage:string = "https://screw-fast.vercel.app/social.png"; // Replac
<meta property="og:type" content="website">
<meta property="og:title" content={ogTitle}>
<meta property="og:site_name" content={title}/>
<meta property="og:description" content={description}>
<meta property="og:description" content={ogDescription}>
<meta property="og:image" content={socialImage}>
<meta content="1200" property="og:image:width"/>
<meta content="600" property="og:image:height"/>
@ -46,7 +47,7 @@ const socialImage:string = "https://screw-fast.vercel.app/social.png"; // Replac
<meta property="twitter:domain" content={URL}>
<meta property="twitter:url" content={URL}>
<meta name="twitter:title" content={ogTitle}>
<meta name="twitter:description" content={description}>
<meta name="twitter:description" content={ogDescription}>
<meta name="twitter:image" content={socialImage}>
<link rel="manifest" href="/manifest.webmanifest" />

View file

@ -14,7 +14,7 @@ import Authentication from "./Authentication.astro";
>
<div class="flex items-center justify-between">
<a
class="flex-none text-xl outline-none rounded-lg font-semibold dark:focus:outline-none ring-zinc-500 focus-visible:ring dark:ring-zinc-200"
class="flex-none text-xl outline-none rounded-lg font-bold dark:focus:outline-none ring-zinc-500 focus-visible:ring dark:ring-zinc-200"
href="/"
aria-label="Brand"
>
@ -76,7 +76,7 @@ import Authentication from "./Authentication.astro";
<div class="ml-auto mr-5 md:hidden">
<button
type="button"
class="hs-collapse-toggle flex h-8 w-8 items-center justify-center rounded-full text-sm font-semibold text-neutral-600 transition duration-300 hover:bg-neutral-200 disabled:pointer-events-none disabled:opacity-50 dark:text-neutral-400 dark:hover:bg-neutral-700 dark:focus:outline-none"
class="hs-collapse-toggle flex h-8 w-8 items-center justify-center rounded-full text-sm font-bold text-neutral-600 transition duration-300 hover:bg-neutral-200 disabled:pointer-events-none disabled:opacity-50 dark:text-neutral-400 dark:hover:bg-neutral-700 dark:focus:outline-none"
data-hs-collapse="#navbar-collapse-with-animation"
aria-controls="navbar-collapse-with-animation"
aria-label="Toggle navigation"

View file

@ -25,7 +25,7 @@ type Product = {
const starterKit: Product = {
name: "Starter Kit",
description: "Best option for DIY projects",
price: "$29",
price: "$49",
cents: ".00",
billingFrequency: "USD / monthly",
features: [
@ -40,7 +40,7 @@ const starterKit: Product = {
const professionalToolbox: Product = {
name: "Professional Toolbox",
description: "Best for large scale uses",
price: "$49",
price: "$89",
cents: ".00",
billingFrequency: "USD / monthly",
features: [
@ -75,7 +75,7 @@ const professionalToolbox: Product = {
class="w-full rounded-xl bg-gray-800 p-6 sm:w-1/2 sm:rounded-r-none sm:p-8 lg:w-1/3"
>
<div class="mb-4">
<h3 class="text-2xl font-semibold text-neutral-100 sm:text-3xl">
<h3 class="text-2xl font-bold text-neutral-100 sm:text-3xl">
{starterKit.name}
</h3>
<p class="text-indigo-300">{starterKit.description}</p>
@ -117,7 +117,7 @@ const professionalToolbox: Product = {
<!-- CTA for purchasing the product -->
<a
href={starterKit.purchaseLink}
class="block rounded-lg bg-gray-500 px-8 py-3 text-center text-sm font-semibold text-gray-100 outline-none ring-indigo-300 transition duration-100 hover:bg-gray-600 focus-visible:ring active:text-gray-300 md:text-base"
class="block rounded-lg bg-gray-500 px-8 py-3 text-center text-sm font-bold text-gray-100 outline-none ring-indigo-300 transition duration-100 hover:bg-gray-600 focus-visible:ring active:text-gray-300 md:text-base"
>{starterKit.purchaseBtnTitle}</a
>
</div>
@ -129,14 +129,14 @@ const professionalToolbox: Product = {
class="mb-4 flex flex-col items-start justify-between gap-4 lg:flex-row"
>
<div>
<h3 class="text-2xl font-semibold text-neutral-100 sm:text-3xl">
<h3 class="text-2xl font-bold text-neutral-100 sm:text-3xl">
{professionalToolbox.name}
</h3>
<p class="text-orange-200">{professionalToolbox.description}</p>
</div>
<span
class="order-first inline-block rounded-full bg-orange-200 bg-opacity-50 px-3 py-1 text-xs font-semibold uppercase tracking-wider text-orange-600 lg:order-none"
class="order-first inline-block rounded-full bg-orange-200 bg-opacity-50 px-3 py-1 text-xs font-bold uppercase tracking-wider text-orange-600 lg:order-none"
>Best value</span
>
</div>
@ -177,7 +177,7 @@ const professionalToolbox: Product = {
<!-- CTA for purchasing the product -->
<a
href={professionalToolbox.purchaseLink}
class="block rounded-lg bg-orange-200 bg-opacity-50 px-8 py-3 text-center text-sm font-semibold text-neutral-100 outline-none ring-orange-300 transition duration-100 hover:bg-orange-300 hover:bg-opacity-50 focus-visible:ring active:bg-orange-400 md:text-base"
class="block rounded-lg bg-orange-200 bg-opacity-50 px-8 py-3 text-center text-sm font-bold text-neutral-100 outline-none ring-orange-300 transition duration-100 hover:bg-orange-300 hover:bg-opacity-50 focus-visible:ring active:bg-orange-400 md:text-base"
>{professionalToolbox.purchaseBtnTitle}</a
>
</div>

View file

@ -55,7 +55,7 @@ const statistics: StatProps[] = [
];
---
<div class="mx-auto max-w-[85rem] px-4 py-10 sm:px-6 lg:px-8 lg:py-14">
<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="lg:grid lg:grid-cols-12 lg:items-center lg:justify-between lg:gap-16"
>
@ -106,7 +106,7 @@ const statistics: StatProps[] = [
/>
</div>
<div class="ms-4 grow">
<div class="font-semibold text-neutral-800 dark:text-neutral-200">
<div class="font-bold text-neutral-800 dark:text-neutral-200">
{testimonial.author}
</div>
<div class="text-xs text-neutral-500">{testimonial.role}</div>

View file

@ -1,83 +0,0 @@
---
// Import the necessary dependencies from individual component files
import GoogleBtn from "../buttons/GoogleBtn.astro";
import AuthBtn from "../buttons/AuthBtn.astro";
import EmailInput from "./input/EmailInput.astro";
import PasswordInput from "./input/PasswordInput.astro";
import Checkbox from "./input/Checkbox.astro";
// Variables for customization of the LoginModal Component
// Modal identifier
const id = "hs-toggle-between-modals-login-modal";
// Main heading
const title: string = "Sign in";
// Sub-heading text
const subTitle: string = "Don't have an account yet?";
// Text for registration button
const registerBtn: string = "Sign up here";
// Target link for registration button
const registerBtnDataHS: string = "#hs-toggle-between-modals-register-modal";
---
<div
id={id}
class="hs-overlay hs-overlay-backdrop-open:bg-neutral-900/90 absolute start-0 top-0 z-50 hidden h-full w-full"
>
<div
class="m-3 mt-0 opacity-0 transition-all ease-out hs-overlay-open:mt-7 hs-overlay-open:opacity-100 hs-overlay-open:duration-500 sm:mx-auto sm:w-full sm:max-w-lg"
>
<div class="mx-auto w-full max-w-md p-6">
<div
class="mt-7 rounded-xl border border-neutral-200 bg-neutral-100 shadow-sm dark:border-neutral-700 dark:bg-neutral-800"
>
<div class="p-4 sm:p-7">
<div class="text-center">
<h1
class="block text-2xl font-bold text-neutral-800 dark:text-neutral-200"
>
{title}
</h1>
<p class="mt-2 text-sm text-neutral-600 dark:text-neutral-400">
{subTitle}
<button
class="rounded-lg p-1 font-medium text-[#fa5a15] decoration-2 outline-none ring-zinc-500 hover:underline focus-visible:ring dark:text-[#fa5a15] dark:ring-zinc-200 dark:focus:outline-none"
data-hs-overlay={registerBtnDataHS}
>
{registerBtn}
</button>
</p>
</div>
<div class="mt-5">
<GoogleBtn title="Sign in with Google" />
<div
class="flex items-center py-3 text-xs uppercase text-neutral-400 before:me-6 before:flex-[1_1_0%] before:border-t before:border-neutral-200 after:ms-6 after:flex-[1_1_0%] after:border-t after:border-neutral-200 dark:text-neutral-500 dark:before:border-neutral-600 dark:after:border-neutral-600"
>
Or
</div>
<form>
<div class="grid gap-y-4">
<EmailInput />
<PasswordInput
forgot={true}
id="password-error"
content="8+ characters required"
/>
<Checkbox id="remember-me" />
<AuthBtn title="Sign in" />
</div>
</form>
</div>
</div>
</div>
</div>
</div>
</div>

View file

@ -1,64 +0,0 @@
---
// Import the necessary dependencies from individual component files
import AuthBtn from "../buttons/AuthBtn.astro";
import EmailInput from "./input/EmailInput.astro";
// Variables to customize the RecoverModal Component
// Modal identifier
const id = "hs-toggle-between-modals-recover-modal";
// Main heading
const title: string = "Forgot password?";
// Sub-heading text
const subTitle: string = "Remember your password?";
// Text and target link for the login button
const loginBtn: string = "Sign in here";
const loginBtnDataHS: string = "#hs-toggle-between-modals-login-modal";
---
<div
id={id}
class="hs-overlay absolute start-0 top-0 z-50 hidden h-full w-full hs-overlay-backdrop-open:bg-neutral-900/90"
>
<div
class="m-3 mt-0 opacity-0 transition-all ease-out hs-overlay-open:mt-7 hs-overlay-open:opacity-100 hs-overlay-open:duration-500 sm:mx-auto sm:w-full sm:max-w-lg"
>
<div class="mx-auto w-full max-w-md p-6">
<div
class="mt-7 rounded-xl border border-neutral-200 bg-neutral-100 shadow-sm dark:border-neutral-700 dark:bg-neutral-800"
>
<div class="p-4 sm:p-7">
<div class="text-center">
<h1
class="block text-2xl font-bold text-neutral-800 dark:text-neutral-200"
>
{title}
</h1>
<p class="mt-2 text-sm text-neutral-600 dark:text-neutral-400">
{subTitle}
<button
class="rounded-lg p-1 font-medium text-[#fa5a15] decoration-2 outline-none ring-zinc-500 hover:underline focus-visible:ring dark:text-[#fa5a15] dark:ring-zinc-200 dark:focus:outline-none"
data-hs-overlay={loginBtnDataHS}
>
{loginBtn}
</button>
</p>
</div>
<div class="mt-5">
<!-- Form -->
<form>
<div class="grid gap-y-4">
<EmailInput />
<AuthBtn title="Reset password" />
</div>
</form>
</div>
</div>
</div>
</div>
</div>
</div>

View file

@ -1,92 +0,0 @@
---
// Import the necessary dependencies from individual component files
import GoogleBtn from "../buttons/GoogleBtn.astro";
import AuthBtn from "../buttons/AuthBtn.astro";
import EmailInput from "./input/EmailInput.astro";
import PasswordInput from "./input/PasswordInput.astro";
import Checkbox from "./input/Checkbox.astro";
// Variables to customize the RegisterModal Component
// Modal identifier
const id = "hs-toggle-between-modals-register-modal";
// Main title
const title: string = "Sign up";
// Subtitle text
const subTitle: string = "Already have an account?";
// Text and target link for the login button
const loginBtn: string = "Sign in here";
const loginBtnDataHS: string = "#hs-toggle-between-modals-login-modal";
---
<div
id={id}
class="hs-overlay hs-overlay-backdrop-open:bg-neutral-900/90 absolute start-0 top-0 z-50 hidden h-full w-full"
>
<div
class="m-3 mt-0 opacity-0 transition-all ease-out hs-overlay-open:mt-7 hs-overlay-open:opacity-100 hs-overlay-open:duration-500 sm:mx-auto sm:w-full sm:max-w-lg"
>
<div class="mx-auto w-full max-w-md p-6">
<div
class="mt-7 max-h-full overflow-hidden rounded-xl border border-neutral-200 bg-neutral-100 shadow-sm dark:border-neutral-700 dark:bg-neutral-800"
>
<div class="p-4 sm:p-7">
<div class="text-center">
<h1
class="block text-2xl font-bold text-neutral-800 dark:text-neutral-200"
>
{title}
</h1>
<p class="mt-2 text-sm text-neutral-600 dark:text-neutral-400">
{subTitle}
<button
class="rounded-lg p-1 font-medium text-[#fa5a15] decoration-2 outline-none ring-zinc-500 hover:underline focus-visible:ring dark:text-[#fa5a15] dark:ring-zinc-200 dark:focus:outline-none"
data-hs-overlay={loginBtnDataHS}
>
{loginBtn}
</button>
</p>
</div>
<div class="mt-5">
<GoogleBtn title="Sign up with Google" />
<div
class="flex items-center py-3 text-xs uppercase text-neutral-400 before:me-6 before:flex-[1_1_0%] before:border-t before:border-neutral-200 after:ms-6 after:flex-[1_1_0%] after:border-t after:border-neutral-200 dark:text-neutral-500 dark:before:border-neutral-600 dark:after:border-neutral-600"
>
Or
</div>
<form>
<div class="grid gap-y-4">
<EmailInput />
<PasswordInput
id="password-error"
content="8+ characters required"
/>
<PasswordInput
label="Confirm Password"
id="confirm-password-error"
aria="confirm-password-error"
content="Password does not match the password"
/>
<Checkbox label="I accept the " , id="terms-agree">
<a
class="font-medium text-[#fa5a15] decoration-2 hover:underline dark:text-[#fa5a15] dark:focus:outline-none"
href="#">Terms and Conditions</a
>
</Checkbox>
<AuthBtn title="Sign up" />
</div>
</form>
</div>
</div>
</div>
</div>
</div>
</div>

View file

@ -1,16 +0,0 @@
---
const { label = "Remember me", id } = Astro.props;
interface Props {
label?: string;
id?: string;
}
---
<div class="flex items-center">
<div class="flex">
<input id={id} name="remember-me" type="checkbox" class="shrink-0 mt-0.5 border-neutral-200 rounded text-neutral-600 pointer-events-none focus:ring-yellow-400 dark:bg-neutral-800 dark:border-neutral-700 dark:checked:bg-yellow-400 dark:checked:border-yellow-400 dark:focus:ring-offset-neutral-800">
</div>
<div class="ms-3">
<label for={id} class="text-sm text-neutral-800 dark:text-neutral-200">{label} <slot /> </label>
</div>
</div>

View file

@ -1,29 +0,0 @@
---
const { label = "Search", title = "Subscribe" } = Astro.props;
interface Props {
label?: string;
title?: string;
}
---
<div
class="mt-4 flex flex-col items-center gap-2 rounded-lg bg-neutral-200 p-2 dark:bg-neutral-800 sm:flex-row sm:gap-3"
>
<div class="w-full">
<label for="hero-input" class="sr-only">{label}</label>
<input
type="text"
id="hero-input"
name="hero-input"
class="block w-full rounded-lg border-transparent bg-neutral-100 px-4 py-3 text-sm text-neutral-600 focus:border-[#fa5a15] focus:ring-[#fa5a15] disabled:pointer-events-none disabled:opacity-50 dark:border-transparent dark:bg-neutral-700 dark:text-gray-300"
placeholder="Enter your email"
/>
</div>
<a
class="inline-flex w-full items-center justify-center gap-x-2 whitespace-nowrap rounded-lg border border-transparent bg-[#fa5a15] p-3 text-sm font-semibold text-neutral-50 outline-none ring-zinc-500 transition duration-300 hover:bg-[#e14d0b] focus-visible:ring disabled:pointer-events-none disabled:opacity-50 dark:ring-zinc-200 dark:focus:outline-none dark:focus:ring-1 sm:w-auto"
href="#"
>
{title}
</a>
</div>

View file

@ -1,42 +0,0 @@
---
const { label = "Email address" } = Astro.props;
interface Props {
label?: string;
}
---
<div>
<label
for="email"
class="mb-2 block text-sm text-neutral-800 dark:text-neutral-200"
>{label}</label
>
<div class="relative">
<input
type="email"
id="email"
name="email"
class="block w-full rounded-lg border border-neutral-200 bg-neutral-50 px-4 py-3 text-sm focus:outline-none focus:ring focus:ring-neutral-400 disabled:pointer-events-none disabled:opacity-50 dark:border-neutral-600 dark:bg-neutral-700/30 dark:focus:ring-1 dark:text-neutral-400"
required
aria-describedby="email-error"
/>
<div class="pointer-events-none absolute inset-y-0 end-0 hidden pe-3">
<svg
class="h-5 w-5 text-red-500"
width="16"
height="16"
fill="currentColor"
viewBox="0 0 16 16"
aria-hidden="true"
>
<path
d="M16 8A8 8 0 1 1 0 8a8 8 0 0 1 16 0zM8 4a.905.905 0 0 0-.9.995l.35 3.507a.552.552 0 0 0 1.1 0l.35-3.507A.905.905 0 0 0 8 4zm.002 6a1 1 0 1 0 0 2 1 1 0 0 0 0-2z"
></path>
</svg>
</div>
</div>
<p class="mt-2 hidden text-xs text-red-600" id="email-error">
Please include a valid email address so we can get back to you
</p>
</div>

View file

@ -1,66 +0,0 @@
---
const {
label = "Password",
forgot,
id,
content,
aria = "password-error",
} = Astro.props;
interface Props {
label?: string;
forgot?: boolean;
id?: string;
content?: string;
aria?: string;
}
---
<div>
<div class="flex items-center justify-between">
<label
for="password"
class="mb-2 block text-sm text-neutral-800 dark:text-neutral-200"
>{label}</label
>
{
forgot ? (
<button
class="text-sm font-medium text-[#fa5a15] decoration-2 hover:underline dark:text-[#fa5a15] dark:focus:outline-none dark:focus:ring-1 focus-visible:ring outline-none ring-zinc-500 dark:ring-zinc-200"
data-hs-overlay="#hs-toggle-between-modals-recover-modal"
>
Forgot password?
</button>
) : (
""
)
}
</div>
<div class="relative">
<input
type="password"
id="password"
name="password"
class="block w-full rounded-lg border border-neutral-200 bg-neutral-50 px-4 py-3 text-sm focus:outline-none focus:ring focus:ring-neutral-400 disabled:pointer-events-none disabled:opacity-50 dark:border-neutral-600 dark:bg-neutral-700/30 dark:focus:ring-1 dark:text-neutral-400"
required
aria-describedby={aria}
/>
<div class="pointer-events-none absolute inset-y-0 end-0 hidden pe-3">
<svg
class="h-5 w-5 text-red-500"
width="16"
height="16"
fill="currentColor"
viewBox="0 0 16 16"
aria-hidden="true"
>
<path
d="M16 8A8 8 0 1 1 0 8a8 8 0 0 1 16 0zM8 4a.905.905 0 0 0-.9.995l.35 3.507a.552.552 0 0 0 1.1 0l.35-3.507A.905.905 0 0 0 8 4zm.002 6a1 1 0 1 0 0 2 1 1 0 0 0 0-2z"
></path>
</svg>
</div>
</div>
<p class="mt-2 hidden text-xs text-red-600" id={id}>
{content}
</p>
</div>

View file

@ -15,7 +15,7 @@ interface Props {
id={id}
>
<button
class="hs-accordion-toggle group inline-flex w-full items-center justify-between gap-x-3 text-balance rounded-lg pb-3 text-start font-semibold text-neutral-800 outline-none ring-zinc-500 transition hover:text-neutral-500 focus-visible:ring dark:text-neutral-200 dark:ring-zinc-200 dark:hover:text-neutral-400 dark:focus:outline-none md:text-lg"
class="hs-accordion-toggle group inline-flex w-full items-center justify-between gap-x-3 text-balance rounded-lg pb-3 text-start font-bold text-neutral-800 outline-none ring-zinc-500 transition hover:text-neutral-500 focus-visible:ring dark:text-neutral-200 dark:ring-zinc-200 dark:hover:text-neutral-400 dark:focus:outline-none md:text-lg"
aria-controls={collapseId}
>
{heading}

View file

@ -11,7 +11,7 @@ interface Props {
<slot />
<div class="grow">
<h3
class="text-balance text-lg font-semibold text-gray-800 dark:text-neutral-200"
class="text-balance text-lg font-bold text-gray-800 dark:text-neutral-200"
>
{heading}
</h3>

View file

@ -32,7 +32,7 @@ Example:
<slot />
<span class="ms-6 grow">
<span
class="block text-lg font-semibold text-neutral-800 hs-tab-active:text-[#fa5a15] dark:text-neutral-200 dark:hs-tab-active:text-[#fb713b]"
class="block text-lg font-bold text-neutral-800 hs-tab-active:text-[#fa5a15] dark:text-neutral-200 dark:hs-tab-active:text-[#fb713b]"
>{heading}</span
>
<span

View file

@ -8,6 +8,6 @@ interface Props {
<button
type="submit"
class="inline-flex w-full items-center justify-center gap-x-2 rounded-lg border border-transparent bg-yellow-400 px-4 py-3 text-sm font-semibold text-neutral-700 hover:bg-yellow-500 disabled:pointer-events-none disabled:opacity-50 dark:focus:outline-none 2xl:text-base focus-visible:ring outline-none ring-zinc-500 dark:ring-zinc-200 transition duration-300"
class="inline-flex w-full items-center justify-center gap-x-2 rounded-lg border border-transparent bg-yellow-400 px-4 py-3 text-sm font-bold text-neutral-700 hover:bg-yellow-500 disabled:pointer-events-none disabled:opacity-50 dark:focus:outline-none 2xl:text-base focus-visible:ring outline-none ring-zinc-500 dark:ring-zinc-200 transition duration-300"
>{title}</button
>

View file

@ -8,7 +8,7 @@ interface Props {
<button
type="button"
class="flex items-center gap-x-2 font-medium text-neutral-600 outline-none ring-zinc-500 transition duration-300 hover:text-[#fa5a15] focus-visible:ring dark:border-neutral-700 dark:text-neutral-400 dark:ring-zinc-200 dark:hover:text-[#fb713b] dark:focus:outline-none md:my-6 md:border-s md:border-neutral-300 md:ps-6 2xl:text-base"
class="flex items-center gap-x-2 text-base md:text-sm font-medium text-neutral-600 outline-none ring-zinc-500 transition duration-300 hover:text-[#fa5a15] focus-visible:ring dark:border-neutral-700 dark:text-neutral-400 dark:ring-zinc-200 dark:hover:text-[#fb713b] dark:focus:outline-none md:my-6 md:border-s md:border-neutral-300 md:ps-6 2xl:text-base"
data-hs-overlay="#hs-toggle-between-modals-login-modal"
>
<svg

View file

@ -7,7 +7,7 @@ interface Props {
---
<a
class="inline-flex h-10 w-10 items-center justify-center gap-x-2 rounded-lg border border-transparent text-sm font-semibold 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}
target="_blank"
>

View file

@ -16,7 +16,7 @@ If URL is '/' (home page), assign ID as 'home'
<a
id={url === "/" ? "home" : url.split("/")[1]}
href={url}
class="rounded-lg font-medium text-neutral-600 outline-none ring-zinc-500 hover:text-neutral-500 focus-visible:ring dark:text-neutral-400 dark:ring-zinc-200 dark:hover:text-neutral-500 dark:focus:outline-none md:py-3 2xl:text-base"
class="rounded-lg text-base font-medium text-neutral-600 outline-none ring-zinc-500 hover:text-neutral-500 focus-visible:ring dark:text-neutral-400 dark:ring-zinc-200 dark:hover:text-neutral-500 dark:focus:outline-none md:py-3 md:text-sm 2xl:text-base"
>
{name}
</a>
@ -34,7 +34,7 @@ If URL is '/' (home page), assign ID as 'home'
"hover:text-neutral-500",
"dark:hover:text-neutral-500",
);
nav.classList.add("text-[#fa5a15]", "dark:text-[#fa5a15]");
nav.classList.add("text-[#fa5a15]", "dark:text-[#fb713b]");
nav.setAttribute("aria-current", "page");
}
};

View file

@ -12,13 +12,10 @@ interface Props {
<html lang="en" class="scrollbar-hide">
<head>
<meta charset="utf-8" />
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
<meta name="viewport" content="width=device-width" />
<title>{title}</title>
<Meta />
<title>{title}</title>
<script is:inline>
// This script is to handle theme according to user preference or system setting
// This script is to handle theme according to user preference
if (
localStorage.getItem("hs_theme") === "dark" ||
(!("hs_theme" in localStorage) &&
@ -71,14 +68,13 @@ interface Props {
<script is:inline src="/assets/vendor/lenis/lenis.js"></script>
<script is:inline>
// This script is to handle lenis library settings and behaviors, like the smooth scrolling
const lenis = new Lenis();
lenis.on("scroll", (e) => {
console.log(e);
});
const lenis = new Lenis({ smooth: true, smoothTouch: false });
function raf(time) {
lenis.raf(time);
requestAnimationFrame(raf);
}
requestAnimationFrame(raf);
</script>
<script is:inline src="/assets/vendor/preline/preline.js"></script>

View file

@ -1,10 +1,10 @@
---
// Import section components
import MainLayout from "../layouts/MainLayout.astro";
import Navbar from "../components/Navbar.astro";
import ContactSection from "../components/ContactSection.astro";
---
<MainLayout>
<Navbar />
<ContactSection />
</MainLayout>

View file

@ -1,4 +1,5 @@
---
// Import section components
import MainLayout from "../layouts/MainLayout.astro";
import HeroSection from "../components/HeroSection.astro";
import HeroSection2 from "../components/HeroSection2.astro";

View file

@ -0,0 +1,75 @@
---
// Import section components
import MainLayout from "../layouts/MainLayout.astro";
import MainSection from "../components/ui/blocks/MainSection.astro";
import LeftSection from "../components/ui/blocks/LeftSection.astro";
import RightSection from "../components/ui/blocks/RightSection.astro";
import FeaturesStats from "../components/FeaturesStats.astro";
import blueprints from "../images/blueprints-image.avif";
import personWorking from "../images/person-working.avif";
import beforeAfter from "../images/before-after.avif";
import constructionWorkers from "../images/construction-workers.avif";
import aerialView from "../images/aerial-view.avif";
import usingTools from "../images/using-tools.avif";
import progressBuilding from "../images/progress-building.avif";
import underConstruction from "../images/under-construction.avif";
---
<MainLayout>
<MainSection
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."
btn={true}
btnTitle="Schedule a Consultation"
btnURL="#"
/>
<RightSection
title="Delivering Expert Guidance"
subTitle="Embarking on a construction project can be overwhelming. With our professional consultation services, we guide you through every stage, ensuring you make informed decisions. Whether you are a DIY enthusiast or a skilled contractor, our experts are on hand to offer tailored advice on product selection, project scope, and compliance with local regulations."
imgOne={blueprints}
imgOneAlt={"Blueprints and digital tablet with construction plans."}
imgTwo={personWorking}
imgTwoAlt={"Person working in the office"}
/>
<LeftSection
title="Transforming Designs into Reality"
subTitle="Our skilled craftsmen bring precision and excellence to every construction project. From minor installations to substantial structural work, ScrewFast offers reliable construction services to turn your plans into tangible outcomes. We ensure the highest standards of safety and workmanship, utilizing top-quality tools and materials from our extensive inventory."
btn={true}
btnTitle="Learn More"
btnURL="#"
img={beforeAfter}
imgAlt={"Construction site before and after"}
/>
<RightSection
title="Navigating Projects with Professional Oversight"
subTitle="Effective project management is at the heart of any successful build. ScrewFast provides thorough planning and robust management services that keep your project on time and within budget. Let us handle the complexities of workflow coordination, resource allocation, and stakeholder communication while you focus on your vision."
imgOne={constructionWorkers}
imgOneAlt={"Construction workers orchestrating a project"}
imgTwo={aerialView}
imgTwoAlt={"Aerial view of managed construction"}
/>
<LeftSection
title="Ensuring Long-lasting Performance"
subTitle="Our commitment to your project doesn't end at completion. ScrewFast offers ongoing maintenance and support services to ensure your construction's longevity and performance. From regular check-ups to emergency assistance, our responsive team is there to provide seamless support."
img={usingTools}
imgAlt={"Man in orange and black vest wearing white helmet holding yellow and black power tool"}
/>
<RightSection
title="Crafting Bespoke Strategies for Unique Challenges"
subTitle="For our larger enterprise clients, ScrewFast offers custom solutions designed to meet specific industry challenges. By understanding your unique needs, we engineer tailored strategies aimed at optimizing your operations, enhancing efficiency, and driving your business forward."
btn={true}
btnTitle="Read more"
btnURL="#"
imgOne={progressBuilding}
imgOneAlt={"In progress building structure"}
imgTwo={underConstruction}
imgTwoAlt={"Brown and gray building under construction"}
/>
<FeaturesStats
title="By the Numbers"
subTitle="Our commitment to quality and reliability is evident in every project we undertake. At ScrewFast, we are dedicated to delivering industry-leading services that ensure your construction projects are built to last."
/>
</MainLayout>