├── .prettierrc
├── src
├── images
│ ├── icon.png
│ ├── social.png
│ ├── blog
│ │ ├── anna.avif
│ │ ├── brad.avif
│ │ ├── jacob.avif
│ │ ├── post-1.avif
│ │ ├── post-2.avif
│ │ └── post-3.avif
│ ├── hero-image.avif
│ ├── aerial-view.avif
│ ├── before-after.avif
│ ├── blueprint-1.avif
│ ├── blueprint-2.avif
│ ├── icon-maskable.png
│ ├── using-tools.avif
│ ├── automated-tools.avif
│ ├── dashboard-image.avif
│ ├── features-image.avif
│ ├── person-working.avif
│ ├── product-image-1.avif
│ ├── product-image-2.avif
│ ├── product-image-3.avif
│ ├── product-image-4.avif
│ ├── blueprints-image.avif
│ ├── construction-image.avif
│ ├── insights
│ │ ├── insight-1.avif
│ │ ├── insight-2.avif
│ │ └── insight-3.avif
│ ├── progress-building.avif
│ ├── under-construction.avif
│ ├── construction-workers.avif
│ ├── product-image-main-1.avif
│ ├── product-image-main-2.avif
│ ├── product-image-main-3.avif
│ ├── product-image-main-4.avif
│ └── icon.svg
├── utils
│ ├── ui.ts
│ ├── utils.ts
│ ├── fr
│ │ └── navigation.ts
│ └── navigation.ts
├── env.d.ts
├── assets
│ ├── scripts
│ │ └── lenisSmoothScroll.js
│ └── styles
│ │ └── lenis.css
├── components
│ ├── ui
│ │ ├── avatars
│ │ │ ├── AvatarTestimonialSection.astro
│ │ │ ├── Avatar.astro
│ │ │ ├── AvatarBlogLarge.astro
│ │ │ └── AvatarBlog.astro
│ │ ├── blocks
│ │ │ ├── StatsSmall.astro
│ │ │ ├── StatsBig.astro
│ │ │ ├── StatsGrid.astro
│ │ │ ├── IconBlock.astro
│ │ │ ├── MainSection.astro
│ │ │ ├── LeftSection.astro
│ │ │ ├── AccordionItem.astro
│ │ │ ├── TabNav.astro
│ │ │ ├── ReviewComponent.astro
│ │ │ ├── TabContent.astro
│ │ │ ├── ContactIconBlock.astro
│ │ │ └── RightSection.astro
│ │ ├── links
│ │ │ ├── FooterSocialLink.astro
│ │ │ └── NavLink.astro
│ │ ├── forms
│ │ │ ├── input
│ │ │ │ ├── TextInput.astro
│ │ │ │ ├── TextAreaInput.astro
│ │ │ │ ├── PhoneInput.astro
│ │ │ │ ├── Checkbox.astro
│ │ │ │ ├── EmailContactInput.astro
│ │ │ │ ├── EmailFooterInput.astro
│ │ │ │ ├── EmailInput.astro
│ │ │ │ └── PasswordInput.astro
│ │ │ └── RecoverModal.astro
│ │ ├── stars
│ │ │ ├── FullStar.astro
│ │ │ └── HalfStar.astro
│ │ ├── icons
│ │ │ └── Icon.astro
│ │ ├── buttons
│ │ │ ├── GithubBtn.astro
│ │ │ ├── AuthBtn.astro
│ │ │ ├── ProductTabBtn.astro
│ │ │ ├── Btn404.astro
│ │ │ ├── SecondaryCTA.astro
│ │ │ ├── PrimaryCTA.astro
│ │ │ ├── LoginBtn.astro
│ │ │ └── GoogleBtn.astro
│ │ ├── starlight
│ │ │ ├── Head.astro
│ │ │ ├── MobileMenuFooter.astro
│ │ │ └── SiteTitle.astro
│ │ ├── cards
│ │ │ ├── CardRelated.astro
│ │ │ ├── CardSmall.astro
│ │ │ ├── CardWide.astro
│ │ │ ├── CardInsight.astro
│ │ │ ├── CardBlog.astro
│ │ │ └── CardBlogRecent.astro
│ │ └── feedback
│ │ │ └── PostFeedback.astro
│ ├── sections
│ │ ├── misc
│ │ │ ├── Authentication.astro
│ │ │ └── FAQ.astro
│ │ ├── testimonials
│ │ │ ├── TestimonialItem.astro
│ │ │ ├── TestimonialsSection.astro
│ │ │ └── TestimonialsSectionAlt.astro
│ │ ├── landing
│ │ │ ├── ClientsSection.astro
│ │ │ └── HeroSection.astro
│ │ └── features
│ │ │ ├── FeaturesStatsAlt.astro
│ │ │ ├── FeaturesStats.astro
│ │ │ └── FeaturesGeneral.astro
│ └── ThemeIcon.astro
├── pages
│ ├── robots.txt.ts
│ ├── favicon.ico.ts
│ ├── contact.astro
│ ├── fr
│ │ └── contact.astro
│ ├── manifest.json.ts
│ └── 404.astro
├── content
│ ├── docs
│ │ ├── zh-cn
│ │ │ ├── guides
│ │ │ │ ├── intro.mdx
│ │ │ │ ├── first-project-checklist.mdx
│ │ │ │ └── getting-started.mdx
│ │ │ └── welcome-to-docs.mdx
│ │ ├── construction
│ │ │ ├── project-planning.mdx
│ │ │ ├── custom-solutions.mdx
│ │ │ ├── safety.mdx
│ │ │ └── service-overview.mdx
│ │ ├── ja
│ │ │ ├── guides
│ │ │ │ ├── intro.mdx
│ │ │ │ ├── first-project-checklist.mdx
│ │ │ │ └── getting-started.mdx
│ │ │ └── welcome-to-docs.mdx
│ │ ├── tools
│ │ │ ├── tool-guides.mdx
│ │ │ └── equipment-care.mdx
│ │ ├── fa
│ │ │ ├── guides
│ │ │ │ ├── intro.mdx
│ │ │ │ └── first-project-checklist.mdx
│ │ │ └── welcome-to-docs.mdx
│ │ ├── guides
│ │ │ ├── intro.mdx
│ │ │ └── first-project-checklist.mdx
│ │ ├── welcome-to-docs.mdx
│ │ ├── fr
│ │ │ ├── guides
│ │ │ │ ├── intro.mdx
│ │ │ │ └── first-project-checklist.mdx
│ │ │ └── welcome-to-docs.mdx
│ │ ├── es
│ │ │ ├── guides
│ │ │ │ ├── intro.mdx
│ │ │ │ └── first-project-checklist.mdx
│ │ │ └── welcome-to-docs.mdx
│ │ ├── de
│ │ │ ├── welcome-to-docs.mdx
│ │ │ └── guides
│ │ │ │ ├── intro.mdx
│ │ │ │ └── first-project-checklist.mdx
│ │ └── advanced
│ │ │ └── technical-specifications.mdx
│ ├── blog
│ │ ├── en
│ │ │ ├── post-3.md
│ │ │ ├── post-1.md
│ │ │ └── post-2.md
│ │ └── fr
│ │ │ ├── post-3.md
│ │ │ ├── post-1.md
│ │ │ └── post-2.md
│ └── products
│ │ ├── en
│ │ └── item-a765.md
│ │ └── fr
│ │ └── item-a765.md
├── data_files
│ ├── features.json
│ ├── pricing.json
│ ├── fr
│ │ ├── features.json
│ │ ├── pricing.json
│ │ └── faqs.json
│ ├── mega_link.ts
│ └── faqs.json
├── layouts
│ └── MainLayout.astro
└── content.config.ts
├── .gitignore
├── tsconfig.json
├── .github
├── dependabot.yml
└── FUNDING.yml
├── process-html.mjs
├── .vscode
└── settings.json
├── LICENSE
├── package.json
└── vercel.json
/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "plugins": ["prettier-plugin-tailwindcss"]
3 | }
4 |
--------------------------------------------------------------------------------
/src/images/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mearashadowfax/ScrewFast/HEAD/src/images/icon.png
--------------------------------------------------------------------------------
/src/utils/ui.ts:
--------------------------------------------------------------------------------
1 | export const languages = {
2 | en: "English",
3 | fr: "Français",
4 | };
--------------------------------------------------------------------------------
/src/images/social.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mearashadowfax/ScrewFast/HEAD/src/images/social.png
--------------------------------------------------------------------------------
/src/env.d.ts:
--------------------------------------------------------------------------------
1 | ///
{title}
14 |{subTitle}
15 |14 | {title} 15 |
16 |{subTitle}
17 |21 | {description} 22 |
23 |{content}
27 |16 |44 | -------------------------------------------------------------------------------- /src/data_files/pricing.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Simple, Transparent Pricing", 3 | "subTitle": "Boost efficiency with ScrewFast's clear, value-driven plans.", 4 | "badge": "Best value", 5 | "thirdOption": "Enterprise Solutions?", 6 | "btnText": "Get a Custom Quote", 7 | 8 | "starterKit": { 9 | "name": "Starter Kit", 10 | "description": "Best option for DIY projects", 11 | "price": "49", 12 | "cents": ".00", 13 | "billingFrequency": "USD / monthly", 14 | "features": [ 15 | "Key hardware tools", 16 | "Access to guides & tutorials", 17 | "Standard support" 18 | ], 19 | "purchaseBtnTitle": "Get the Starter Kit", 20 | "purchaseLink": "#" 21 | }, 22 | 23 | "professionalToolbox": { 24 | "name": "Professional Toolbox", 25 | "description": "Best for large scale uses", 26 | "price": "89", 27 | "cents": ".00", 28 | "billingFrequency": "USD / monthly", 29 | "features": [ 30 | "Premium tool selection", 31 | "Priority support", 32 | "Exclusive content & deals", 33 | "Bulk order discounts" 34 | ], 35 | "purchaseBtnTitle": "Get the Professional Toolbox", 36 | "purchaseLink": "#" 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/components/ui/buttons/ProductTabBtn.astro: -------------------------------------------------------------------------------- 1 | --- 2 | // Destructure the properties from Astro.props 3 | const { id, dataTab, title, first } = Astro.props; 4 | 5 | // Define TypeScript interface for the properties 6 | interface Props { 7 | id: string; 8 | dataTab: string; 9 | title: string; 10 | first?: boolean; 11 | } 12 | // Define constants for styling classes 13 | const BUTTON_CLASS = 14 | "flex w-full justify-center rounded-xl border border-transparent p-3 outline-hidden ring-zinc-500 transition duration-300 hover:bg-neutral-100 focus-visible:ring-3 dark:ring-zinc-200 dark:hover:bg-neutral-700 dark:focus:outline-hidden md:p-5"; 15 | 16 | const HEADING_CLASS = "block text-center font-bold"; 17 | const INACTIVE_HEADING_CLASS = "text-neutral-800 dark:text-neutral-200"; 18 | --- 19 | 20 | 21 | 35 | -------------------------------------------------------------------------------- /src/data_files/fr/features.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "heading": "Équipes dédiées", 4 | "content": "Bénéficiez de nos équipes engagées qui veillent à ce que votre réussite soit personnelle. Comptez sur un accompagnement expert et des résultats exceptionnels tout au long de votre parcours de projet.", 5 | "svg": "groups" 6 | }, 7 | { 8 | "heading": "Simplicité et accessibilité", 9 | "content": "Trouvez des solutions faciles à utiliser et abordables avec la gamme d'outils et d'équipements de ScrewFast. Nos produits simplifient l'approvisionnement et permettent de respecter les budgets de projet.", 10 | "svg": "verified" 11 | }, 12 | { 13 | "heading": "Documentation complète", 14 | "content": "Intégrez facilement grâce aux guides exhaustifs et aux bibliothèques de ScrewFast. Réalisez une adoption de produit sans faille avec notre ensemble complet de documentation conçu pour votre succès.", 15 | "svg": "books" 16 | }, 17 | { 18 | "heading": "Conception centrée sur l'utilisateur", 19 | "content": "Faites l'expérience de la différence avec la conception axée sur l'utilisateur de ScrewFast, où la fonctionnalité rencontre la praticité pour une expérience de travail améliorée.", 20 | "svg": "frame" 21 | } 22 | ] -------------------------------------------------------------------------------- /src/utils/navigation.ts: -------------------------------------------------------------------------------- 1 | // An array of links for navigation bar 2 | const navBarLinks = [ 3 | { name: "Home", url: "/" }, 4 | { name: "Products", url: "/products" }, 5 | { name: "Services", url: "/services" }, 6 | { name: "Blog", url: "/blog" }, 7 | { name: "Contact", url: "/contact" }, 8 | ]; 9 | // An array of links for footer 10 | const footerLinks = [ 11 | { 12 | section: "Ecosystem", 13 | links: [ 14 | { name: "Documentation", url: "/welcome-to-docs/" }, 15 | { name: "Tools & Equipment", url: "/products" }, 16 | { name: "Construction Services", url: "/services" }, 17 | ], 18 | }, 19 | { 20 | section: "Company", 21 | links: [ 22 | { name: "About us", url: "#" }, 23 | { name: "Blog", url: "/blog" }, 24 | { name: "Careers", url: "#" }, 25 | { name: "Customers", url: "#" }, 26 | ], 27 | }, 28 | ]; 29 | // An object of links for social icons 30 | const socialLinks = { 31 | facebook: "https://www.facebook.com/", 32 | x: "https://twitter.com/", 33 | github: "https://github.com/mearashadowfax/ScrewFast", 34 | google: "https://www.google.com/", 35 | slack: "https://slack.com/", 36 | }; 37 | 38 | export default { 39 | navBarLinks, 40 | footerLinks, 41 | socialLinks, 42 | }; -------------------------------------------------------------------------------- /src/components/ui/buttons/Btn404.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import Icon from "@components/ui/icons/Icon.astro"; 3 | // Destructure the properties from Astro.props 4 | const { title, id, noArrow } = Astro.props; 5 | // Define TypeScript interface for the properties 6 | interface Props { 7 | title?: string; 8 | id?: string; 9 | noArrow?: boolean; 10 | } 11 | // Define CSS classes for styling the button 12 | const baseClasses = 13 | "group inline-flex items-center justify-center gap-x-2 rounded-lg px-4 py-3 text-sm font-bold text-neutral-50 ring-zinc-500 transition duration-300 focus-visible:ring-3 outline-hidden"; 14 | const borderClasses = "border border-transparent"; 15 | const bgColorClasses = 16 | "bg-orange-400 hover:bg-orange-500 active:bg-orange-500 dark:focus:outline-hidden"; 17 | const disableClasses = "disabled:pointer-events-none disabled:opacity-50"; 18 | const fontSizeClasses = "2xl:text-base"; 19 | const ringClasses = "dark:ring-zinc-200"; 20 | --- 21 | 22 | 23 | 31 | -------------------------------------------------------------------------------- /src/components/ui/buttons/SecondaryCTA.astro: -------------------------------------------------------------------------------- 1 | --- 2 | // Destructure the properties from Astro.props 3 | const { title, url } = Astro.props; 4 | 5 | // Define TypeScript interface for the properties 6 | interface Props { 7 | title?: string; 8 | url?: string; 9 | } 10 | // Define CSS classes for the hyperlink button 11 | const baseClasses = 12 | "inline-flex items-center justify-center gap-x-2 rounded-lg px-4 py-3 text-center text-sm font-medium text-neutral-600 shadow-xs outline-hidden ring-zinc-500 focus-visible:ring-3 transition duration-300"; 13 | const borderClasses = "border border-neutral-200"; 14 | const bgColorClasses = "bg-neutral-300"; 15 | const hoverClasses = 16 | "hover:bg-neutral-400/50 hover:text-neutral-600 active:text-neutral-700"; 17 | const disableClasses = "disabled:pointer-events-none disabled:opacity-50"; 18 | const fontSizeClasses = "2xl:text-base"; 19 | const ringClasses = "ring-zinc-500"; 20 | 21 | const darkClasses = 22 | "dark:border-neutral-700 dark:bg-zinc-700 dark:text-neutral-300 dark:ring-zinc-200 dark:hover:bg-zinc-600 dark:focus:outline-hidden"; 23 | --- 24 | 25 | 26 | 30 | {title} 31 | 32 | -------------------------------------------------------------------------------- /src/components/ui/buttons/PrimaryCTA.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import Icon from "@components/ui/icons/Icon.astro"; 3 | // Destructure the properties from Astro.props 4 | const { title, url, noArrow } = Astro.props; 5 | // Define TypeScript interface for the properties 6 | interface Props { 7 | title?: string; 8 | url?: string; 9 | noArrow?: boolean; 10 | } 11 | // Define CSS classes for styling the button 12 | const baseClasses = 13 | "group inline-flex items-center justify-center gap-x-2 rounded-lg px-4 py-3 text-sm font-bold text-neutral-50 ring-zinc-500 transition duration-300 focus-visible:ring-3 outline-hidden"; 14 | const borderClasses = "border border-transparent"; 15 | const bgColorClasses = 16 | "bg-orange-400 hover:bg-orange-500 active:bg-orange-500 dark:focus:outline-hidden"; 17 | const disableClasses = "disabled:pointer-events-none disabled:opacity-50"; 18 | const fontSizeClasses = "2xl:text-base"; 19 | const ringClasses = "dark:ring-zinc-200"; 20 | --- 21 | 22 | 23 | 27 | {title} 28 | 29 | 30 | {noArrow ? null :17 | 18 | 19 |23 | 24 |20 | {content} 21 |
22 |25 |43 |26 |42 |27 |35 |34 | 36 |41 |37 | {author} 38 |39 |{role}40 |
32 | {subTitle} 33 |
34 | ) 35 | } 36 |32 | {subTitle} 33 |
34 | 35 | { 36 | btnExists ? ( 37 |38 | {formatDate(blogEntry.data.pubDate)} 39 |
40 |44 | {subTitle} 45 |
46 | 47 | {btnExists ?46 | {answer} 47 |
48 |38 | {subTitle} 39 |
40 | ) 41 | } 42 |38 | {subTitle} 39 |
40 | } 41 |
50 |
55 |
47 | {insightEntry.data.description} 48 |
49 | 50 |
53 | {label}
54 |
{content}
44 | 45 | { 46 | isAddressVisible ? ( 47 |{addressContent}
48 | ) : null 49 | } 50 | 52 | { 53 | isLinkVisible ? ( 54 | 58 | {linkTitle} 59 | {isArrowVisible ?57 | {subTitle} 58 |
59 | ) 60 | } 61 |51 | {subTitle} 52 |
53 | } 54 |47 | {subTitle} 48 |
49 | 50 | {btnExists ?46 | {testimonial.content} 47 |
48 |59 | {testimonial.author} 60 |
61 |62 | {testimonial.role} 63 |
64 |60 | {subTitle} 61 |
62 |66 | {content} 67 |
68 | 69 |51 | {formatDate(blogEntry.data.pubDate)} 52 |
53 |66 | {blogEntry.data.description} 67 |
68 |50 | {blogEntry.data.author} 51 |
52 |53 | {blogEntry.data.role} 54 |
55 |60 | {subTitle} 61 |
62 | } 63 | 64 |