Initial commit

This commit is contained in:
vitalijmulika
2026-01-14 14:05:12 +02:00
commit 94ca398409
90 changed files with 2620 additions and 0 deletions

45
src/App.js Normal file
View File

@@ -0,0 +1,45 @@
import React, { useState } from 'react';
import Header from './components/Header';
import Hero from './components/Hero';
import Stats from './components/Stats';
import Services from './components/Services';
import CaseStudies from './components/CaseStudies';
import Testimonials from './components/Testimonials';
import Team from './components/Team';
import Contact from './components/Contact';
import Footer from './components/Footer';
import CookieBanner from './components/CookieBanner';
import MobileMenu from './components/MobileMenu';
function App() {
const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false);
const [showCookieBanner, setShowCookieBanner] = useState(true);
return (
<div className="App">
<Header
isMobileMenuOpen={isMobileMenuOpen}
setIsMobileMenuOpen={setIsMobileMenuOpen}
/>
<MobileMenu
isOpen={isMobileMenuOpen}
onClose={() => setIsMobileMenuOpen(false)}
/>
<main>
<Hero />
<Stats />
<Services />
<CaseStudies />
<Testimonials />
<Team />
<Contact />
</main>
<Footer />
{showCookieBanner && (
<CookieBanner onClose={() => setShowCookieBanner(false)} />
)}
</div>
);
}
export default App;

View File

@@ -0,0 +1,119 @@
import React from 'react';
import { motion, useReducedMotion } from 'framer-motion';
import { ExternalLink } from 'lucide-react';
const fadeUpPreset = (delay = 0, duration = 1.2) => ({
initial: { opacity: 0, y: 20 },
whileInView: { opacity: 1, y: 0 },
viewport: { once: true, amount: 0.2 },
transition: { delay, duration, ease: "easeOut" }
});
const CaseStudies = () => {
const shouldReduceMotion = useReducedMotion();
if (shouldReduceMotion) {
return (
<section className="section-padding bg-white">
<div className="container-custom">
<div className="text-center mb-16">
<h2 className="text-3xl lg:text-4xl font-bold text-gray-900 mb-4">
Case Studies
</h2>
</div>
<div className="case-study-card max-w-4xl mx-auto">
<div className="grid lg:grid-cols-2 gap-8 items-center">
<div>
<h3 className="text-3xl font-bold mb-4">Dios</h3>
<p className="text-blue-100 mb-6">
A comprehensive platform for managing digital assets and workflows with advanced AI integration.
</p>
<div className="flex items-center space-x-6 mb-6">
<div className="text-center">
<div className="text-2xl font-bold">$2,500</div>
<div className="text-blue-200 text-sm">Budget</div>
</div>
<div className="text-center">
<div className="text-2xl font-bold">12w</div>
<div className="text-blue-200 text-sm">Timeline</div>
</div>
</div>
<button className="flex items-center space-x-2 text-white hover:text-blue-100 transition-colors">
<span>View Case Study</span>
<ExternalLink className="w-4 h-4" />
</button>
</div>
<div className="bg-white/10 rounded-lg p-6 backdrop-blur-sm">
<div className="bg-white rounded-lg p-4">
<div className="h-32 bg-gradient-to-br from-gray-100 to-gray-200 rounded mb-4"></div>
<div className="space-y-2">
<div className="h-3 bg-gray-200 rounded w-3/4"></div>
<div className="h-3 bg-gray-200 rounded w-1/2"></div>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
);
}
return (
<motion.section
{...fadeUpPreset(0.1, 0.8)}
className="section-padding bg-white"
>
<div className="container-custom">
<motion.div
{...fadeUpPreset(0.2, 0.8)}
className="text-center mb-16"
>
<h2 className="text-3xl lg:text-4xl font-bold text-gray-900 mb-4">
Case Studies
</h2>
</motion.div>
<motion.div
{...fadeUpPreset(0.3, 0.8)}
className="case-study-card max-w-4xl mx-auto"
>
<div className="grid lg:grid-cols-2 gap-8 items-center">
<div>
<h3 className="text-3xl font-bold mb-4">Dios</h3>
<p className="text-blue-100 mb-6">
A comprehensive platform for managing digital assets and workflows with advanced AI integration.
</p>
<div className="flex items-center space-x-6 mb-6">
<div className="text-center">
<div className="text-2xl font-bold">$2,500</div>
<div className="text-blue-200 text-sm">Budget</div>
</div>
<div className="text-center">
<div className="text-2xl font-bold">12w</div>
<div className="text-blue-200 text-sm">Timeline</div>
</div>
</div>
<button className="flex items-center space-x-2 text-white hover:text-blue-100 transition-colors">
<span>View Case Study</span>
<ExternalLink className="w-4 h-4" />
</button>
</div>
<div className="bg-white/10 rounded-lg p-6 backdrop-blur-sm">
<div className="bg-white rounded-lg p-4">
<div className="h-32 bg-gradient-to-br from-gray-100 to-gray-200 rounded mb-4"></div>
<div className="space-y-2">
<div className="h-3 bg-gray-200 rounded w-3/4"></div>
<div className="h-3 bg-gray-200 rounded w-1/2"></div>
</div>
</div>
</div>
</div>
</motion.div>
</div>
</motion.section>
);
};
export default CaseStudies;

76
src/components/Contact.js Normal file
View File

@@ -0,0 +1,76 @@
import React from 'react';
import { motion, useReducedMotion } from 'framer-motion';
import { MessageCircle } from 'lucide-react';
const fadeUpPreset = (delay = 0, duration = 1.2) => ({
initial: { opacity: 0, y: 20 },
whileInView: { opacity: 1, y: 0 },
viewport: { once: true, amount: 0.2 },
transition: { delay, duration, ease: "easeOut" }
});
const Contact = () => {
const shouldReduceMotion = useReducedMotion();
if (shouldReduceMotion) {
return (
<section className="section-padding bg-gray-50">
<div className="container-custom">
<div className="max-w-4xl mx-auto text-center">
<div className="bg-white rounded-2xl p-8 lg:p-12 shadow-sm border border-gray-100">
<MessageCircle className="w-16 h-16 text-primary-600 mx-auto mb-6" />
<h2 className="text-3xl lg:text-4xl font-bold text-gray-900 mb-4">
How can we help? Let's talk
</h2>
<p className="text-gray-600 mb-8 text-lg">
Ready to start your next project? Get in touch with our team and let's discuss how we can bring your ideas to life.
</p>
<div className="flex flex-col sm:flex-row gap-4 justify-center">
<button className="btn-primary">
Schedule a Call
</button>
<button className="btn-secondary">
Send Message
</button>
</div>
</div>
</div>
</div>
</section>
);
}
return (
<motion.section
{...fadeUpPreset(0.1, 0.8)}
className="section-padding bg-gray-50"
>
<div className="container-custom">
<motion.div
{...fadeUpPreset(0.2, 0.8)}
className="max-w-4xl mx-auto text-center"
>
<div className="bg-white rounded-2xl p-8 lg:p-12 shadow-sm border border-gray-100">
<MessageCircle className="w-16 h-16 text-primary-600 mx-auto mb-6" />
<h2 className="text-3xl lg:text-4xl font-bold text-gray-900 mb-4">
How can we help? Let's talk
</h2>
<p className="text-gray-600 mb-8 text-lg">
Ready to start your next project? Get in touch with our team and let's discuss how we can bring your ideas to life.
</p>
<div className="flex flex-col sm:flex-row gap-4 justify-center">
<button className="btn-primary">
Schedule a Call
</button>
<button className="btn-secondary">
Send Message
</button>
</div>
</div>
</motion.div>
</div>
</motion.section>
);
};
export default Contact;

View File

@@ -0,0 +1,42 @@
import React from 'react';
import { X } from 'lucide-react';
const CookieBanner = ({ onClose }) => {
return (
<div className="fixed bottom-4 left-4 right-4 z-50 max-w-md mx-auto">
<div className="cookie-banner rounded-xl p-6 shadow-lg border border-gray-200">
<div className="flex items-start justify-between mb-4">
<h3 className="font-semibold text-gray-900">This site uses cookies</h3>
<button
onClick={onClose}
className="text-gray-400 hover:text-gray-600 transition-colors"
>
<X className="w-5 h-5" />
</button>
</div>
<p className="text-sm text-gray-600 mb-4">
We and selected third parties use cookies (or similar technologies) for technical purposes, to enhance and analyze site usage, to support our marketing efforts, and for other purposes described below.
</p>
<p className="text-sm text-gray-600 mb-6">
By clicking "Accept all", you agree to the storing of cookies on your device for these purposes.
</p>
<div className="flex gap-3">
<button
onClick={onClose}
className="flex-1 px-4 py-2 border border-gray-300 rounded-lg text-gray-700 hover:bg-gray-50 transition-colors text-sm font-medium"
>
Deny
</button>
<button
onClick={onClose}
className="flex-1 px-4 py-2 bg-gray-900 text-white rounded-lg hover:bg-gray-800 transition-colors text-sm font-medium"
>
Accept all
</button>
</div>
</div>
</div>
);
};
export default CookieBanner;

78
src/components/Footer.js Normal file
View File

@@ -0,0 +1,78 @@
import React from 'react';
import { Github, Linkedin, MessageCircle, Mail } from 'lucide-react';
const Footer = () => {
return (
<footer className="bg-gray-900 text-white">
<div className="container-custom py-12">
<div className="grid md:grid-cols-2 lg:grid-cols-4 gap-8">
{/* Logo & Description */}
<div className="lg:col-span-2">
<div className="flex items-center space-x-2 mb-4">
<div className="w-8 h-8 bg-gradient-to-br from-blue-500 to-blue-600 rounded-lg flex items-center justify-center">
<span className="text-white font-bold text-sm">S</span>
</div>
<span className="text-xl font-bold">Sargas</span>
</div>
<p className="text-gray-400 mb-6 max-w-md">
AI-powered web and mobile development solutions delivered in 12 weeks. We help businesses transform their ideas into reality.
</p>
<div className="flex items-center space-x-2 text-sm text-gray-400">
<MessageCircle className="w-4 h-4" />
<span>Feel free to drop us a note:</span>
<a href="mailto:contact@sargas.io" className="text-white hover:text-blue-400 transition-colors">
contact@sargas.io
</a>
</div>
</div>
{/* Services */}
<div>
<h3 className="font-semibold mb-4">Services</h3>
<ul className="space-y-2 text-gray-400">
<li><a href="#" className="hover:text-white transition-colors">Web Development</a></li>
<li><a href="#" className="hover:text-white transition-colors">Mobile Development</a></li>
<li><a href="#" className="hover:text-white transition-colors">Support and Maintenance</a></li>
</ul>
</div>
{/* Company */}
<div>
<h3 className="font-semibold mb-4">Company</h3>
<ul className="space-y-2 text-gray-400">
<li><a href="#" className="hover:text-white transition-colors">Case Studies</a></li>
<li><a href="#" className="hover:text-white transition-colors">Blog</a></li>
<li><a href="#" className="hover:text-white transition-colors">Contacts</a></li>
<li><a href="#" className="hover:text-white transition-colors">About Us</a></li>
<li><a href="#" className="hover:text-white transition-colors">FAQ</a></li>
</ul>
</div>
</div>
{/* Social Links */}
<div className="flex items-center justify-between pt-8 mt-8 border-t border-gray-800">
<div className="flex items-center space-x-4">
<a href="#" className="text-gray-400 hover:text-white transition-colors">
<Github className="w-5 h-5" />
</a>
<a href="#" className="text-gray-400 hover:text-white transition-colors">
<Linkedin className="w-5 h-5" />
</a>
<a href="#" className="text-gray-400 hover:text-white transition-colors">
<MessageCircle className="w-5 h-5" />
</a>
<a href="#" className="text-gray-400 hover:text-white transition-colors">
<Mail className="w-5 h-5" />
</a>
</div>
<div className="flex items-center space-x-6 text-sm text-gray-400">
<a href="#" className="hover:text-white transition-colors">Privacy Policy</a>
<a href="#" className="hover:text-white transition-colors">Terms of Use</a>
</div>
</div>
</div>
</footer>
);
};
export default Footer;

72
src/components/Header.js Normal file
View File

@@ -0,0 +1,72 @@
import React from 'react';
import { Menu, ChevronDown, Star } from 'lucide-react';
const Header = ({ isMobileMenuOpen, setIsMobileMenuOpen }) => {
return (
<header className="fixed top-0 left-0 right-0 z-50 bg-white border-b border-gray-100">
<div className="container-custom">
<div className="flex items-center justify-between h-16">
{/* Logo */}
<div className="flex items-center">
<div className="flex items-center space-x-2">
<div className="w-8 h-8 bg-gradient-to-br from-blue-500 to-blue-600 rounded-lg flex items-center justify-center">
<span className="text-white font-bold text-sm">S</span>
</div>
<span className="text-xl font-bold text-gray-900">Sargas</span>
</div>
</div>
{/* Desktop Navigation */}
<nav className="hidden lg:flex items-center space-x-8">
<div className="relative group">
<button className="flex items-center space-x-1 text-gray-700 hover:text-gray-900 transition-colors">
<span>Services</span>
<ChevronDown className="w-4 h-4" />
</button>
</div>
<a href="#portfolio" className="text-gray-700 hover:text-gray-900 transition-colors">
Portfolio
</a>
<a href="#about" className="text-gray-700 hover:text-gray-900 transition-colors">
About
</a>
<a href="#contacts" className="text-gray-700 hover:text-gray-900 transition-colors">
Contacts
</a>
</nav>
{/* Clutch Rating & CTA */}
<div className="hidden lg:flex items-center space-x-4">
<div className="flex items-center space-x-2 bg-gray-50 px-3 py-2 rounded-lg">
<div className="w-6 h-6 bg-gray-800 rounded-full flex items-center justify-center">
<span className="text-white text-xs font-bold">C</span>
</div>
<div className="flex items-center space-x-1">
<span className="text-sm font-semibold">4.9</span>
<div className="flex">
{[...Array(5)].map((_, i) => (
<Star key={i} className="w-3 h-3 fill-red-500 text-red-500" />
))}
</div>
</div>
<span className="text-xs text-gray-600">Based on 6 Clutch reviews</span>
</div>
<button className="btn-secondary">
Book a Call
</button>
</div>
{/* Mobile Menu Button */}
<button
className="lg:hidden p-2"
onClick={() => setIsMobileMenuOpen(!isMobileMenuOpen)}
>
<Menu className="w-6 h-6" />
</button>
</div>
</div>
</header>
);
};
export default Header;

145
src/components/Hero.js Normal file
View File

@@ -0,0 +1,145 @@
import React from 'react';
import { motion, useReducedMotion } from 'framer-motion';
import { Package } from 'lucide-react';
const fadeUpPreset = (delay = 0, duration = 1.2) => ({
initial: { opacity: 0, y: 20 },
whileInView: { opacity: 1, y: 0 },
viewport: { once: true, amount: 0.2 },
transition: { delay, duration, ease: "easeOut" }
});
const Hero = () => {
const shouldReduceMotion = useReducedMotion();
if (shouldReduceMotion) {
return (
<section className="hero-gradient pt-24 pb-16 lg:pt-32 lg:pb-24">
<div className="container-custom">
<div className="max-w-4xl">
<h1 className="text-4xl lg:text-6xl font-bold text-gray-900 mb-6">
<span className="text-primary-600">AI-powered</span><br />
web and mobile<br />
<span className="text-primary-600">in 12 weeks</span>
</h1>
<div className="flex items-center space-x-2 mb-8">
<span className="text-gray-600">Powered by</span>
<div className="flex items-center space-x-1">
<div className="flex space-x-1">
<div className="w-2 h-2 bg-red-500 rounded-full"></div>
<div className="w-2 h-2 bg-red-400 rounded-full"></div>
<div className="w-2 h-2 bg-red-300 rounded-full"></div>
</div>
<span className="font-semibold text-gray-900">n8n</span>
</div>
</div>
<div className="flex flex-col sm:flex-row gap-4 mb-12">
<button className="btn-primary">
Start Discovery
</button>
<button className="btn-secondary flex items-center space-x-2">
<Package className="w-5 h-5" />
<span>Portfolio Showcase</span>
</button>
</div>
{/* Tech Stack */}
<div className="flex flex-wrap gap-3">
{[
{ name: 'React', color: 'bg-blue-100 text-blue-700' },
{ name: 'Node.js', color: 'bg-green-100 text-green-700' },
{ name: 'NestJS', color: 'bg-red-100 text-red-700' },
{ name: 'MySQL', color: 'bg-orange-100 text-orange-700' },
{ name: 'MongoDB', color: 'bg-green-100 text-green-700' },
{ name: 'Nginx', color: 'bg-green-100 text-green-700' },
{ name: 'Redis', color: 'bg-red-100 text-red-700' },
{ name: 'TypeScript', color: 'bg-blue-100 text-blue-700' }
].map((tech, index) => (
<span key={tech.name} className={`tech-badge ${tech.color}`}>
#{tech.name.toLowerCase()}
</span>
))}
</div>
</div>
</div>
</section>
);
}
return (
<motion.section
{...fadeUpPreset(0.1, 0.8)}
className="hero-gradient pt-24 pb-16 lg:pt-32 lg:pb-24"
>
<div className="container-custom">
<div className="max-w-4xl">
<motion.h1
{...fadeUpPreset(0.2, 0.8)}
className="text-4xl lg:text-6xl font-bold text-gray-900 mb-6"
>
<span className="text-primary-600">AI-powered</span><br />
web and mobile<br />
<span className="text-primary-600">in 12 weeks</span>
</motion.h1>
<motion.div
{...fadeUpPreset(0.3, 0.8)}
className="flex items-center space-x-2 mb-8"
>
<span className="text-gray-600">Powered by</span>
<div className="flex items-center space-x-1">
<div className="flex space-x-1">
<div className="w-2 h-2 bg-red-500 rounded-full"></div>
<div className="w-2 h-2 bg-red-400 rounded-full"></div>
<div className="w-2 h-2 bg-red-300 rounded-full"></div>
</div>
<span className="font-semibold text-gray-900">n8n</span>
</div>
</motion.div>
<motion.div
{...fadeUpPreset(0.4, 0.8)}
className="flex flex-col sm:flex-row gap-4 mb-12"
>
<button className="btn-primary">
Start Discovery
</button>
<button className="btn-secondary flex items-center space-x-2">
<Package className="w-5 h-5" />
<span>Portfolio Showcase</span>
</button>
</motion.div>
{/* Tech Stack */}
<motion.div
{...fadeUpPreset(0.5, 0.8)}
className="flex flex-wrap gap-3"
>
{[
{ name: 'React', color: 'bg-blue-100 text-blue-700' },
{ name: 'Node.js', color: 'bg-green-100 text-green-700' },
{ name: 'NestJS', color: 'bg-red-100 text-red-700' },
{ name: 'MySQL', color: 'bg-orange-100 text-orange-700' },
{ name: 'MongoDB', color: 'bg-green-100 text-green-700' },
{ name: 'Nginx', color: 'bg-green-100 text-green-700' },
{ name: 'Redis', color: 'bg-red-100 text-red-700' },
{ name: 'TypeScript', color: 'bg-blue-100 text-blue-700' }
].map((tech, index) => (
<motion.span
key={tech.name}
{...fadeUpPreset(0.6 + index * 0.05, 0.6)}
className={`tech-badge ${tech.color}`}
>
#{tech.name.toLowerCase()}
</motion.span>
))}
</motion.div>
</div>
</div>
</motion.section>
);
};
export default Hero;

View File

@@ -0,0 +1,97 @@
import React from 'react';
import { motion, AnimatePresence } from 'framer-motion';
import { X, ChevronDown, MessageCircle, Github, Linkedin, Mail } from 'lucide-react';
const MobileMenu = ({ isOpen, onClose }) => {
return (
<AnimatePresence>
{isOpen && (
<motion.div
initial={{ opacity: 0 }}
animate={{ opacity: 1 }}
exit={{ opacity: 0 }}
className="fixed inset-0 z-50 lg:hidden"
>
<div className="fixed inset-0 bg-black/20" onClick={onClose} />
<motion.div
initial={{ x: '100%' }}
animate={{ x: 0 }}
exit={{ x: '100%' }}
transition={{ type: 'tween', duration: 0.3 }}
className="fixed right-0 top-0 h-full w-80 mobile-menu shadow-xl"
>
<div className="flex items-center justify-between p-6 border-b border-gray-200">
<span className="text-xl font-bold text-gray-900">Menu</span>
<button onClick={onClose} className="p-2">
<X className="w-6 h-6" />
</button>
</div>
<div className="p-6">
<div className="grid grid-cols-2 gap-8">
{/* Menu */}
<div>
<h3 className="font-semibold text-gray-900 mb-4">Menu</h3>
<ul className="space-y-3 text-gray-600">
<li><a href="#" className="hover:text-gray-900 transition-colors">Case Studies</a></li>
<li><a href="#" className="hover:text-gray-900 transition-colors">Blog</a></li>
<li><a href="#" className="hover:text-gray-900 transition-colors">Contacts</a></li>
<li><a href="#" className="hover:text-gray-900 transition-colors">About Us</a></li>
<li><a href="#" className="hover:text-gray-900 transition-colors">FAQ</a></li>
</ul>
</div>
{/* Services */}
<div>
<h3 className="font-semibold text-gray-900 mb-4">Services</h3>
<ul className="space-y-3 text-gray-600">
<li><a href="#" className="hover:text-gray-900 transition-colors">Web Development</a></li>
<li><a href="#" className="hover:text-gray-900 transition-colors">Mobile Development</a></li>
<li><a href="#" className="hover:text-gray-900 transition-colors">Support and Maintenance</a></li>
</ul>
</div>
</div>
{/* Contact Info */}
<div className="mt-8 pt-8 border-t border-gray-200">
<div className="flex items-center space-x-2 text-sm text-gray-600 mb-4">
<MessageCircle className="w-4 h-4" />
<span>Feel free to drop us a note:</span>
</div>
<a href="mailto:contact@sargas.io" className="text-gray-900 font-medium">
contact@sargas.io
</a>
</div>
{/* Social Links */}
<div className="flex items-center space-x-4 mt-6">
<a href="#" className="text-gray-400 hover:text-gray-600 transition-colors">
<Github className="w-5 h-5" />
</a>
<a href="#" className="text-gray-400 hover:text-gray-600 transition-colors">
<Linkedin className="w-5 h-5" />
</a>
<a href="#" className="text-gray-400 hover:text-gray-600 transition-colors">
<MessageCircle className="w-5 h-5" />
</a>
<a href="#" className="text-gray-400 hover:text-gray-600 transition-colors">
<Mail className="w-5 h-5" />
</a>
</div>
</div>
{/* Footer */}
<div className="absolute bottom-0 left-0 right-0 p-6 border-t border-gray-200">
<div className="flex items-center justify-between text-sm text-gray-500">
<a href="#" className="hover:text-gray-700 transition-colors">Privacy Policy</a>
<a href="#" className="hover:text-gray-700 transition-colors">Terms of Use</a>
</div>
</div>
</motion.div>
</motion.div>
)}
</AnimatePresence>
);
};
export default MobileMenu;

145
src/components/Services.js Normal file
View File

@@ -0,0 +1,145 @@
import React from 'react';
import { motion, useReducedMotion } from 'framer-motion';
import { Globe, Package } from 'lucide-react';
const fadeUpPreset = (delay = 0, duration = 1.2) => ({
initial: { opacity: 0, y: 20 },
whileInView: { opacity: 1, y: 0 },
viewport: { once: true, amount: 0.2 },
transition: { delay, duration, ease: "easeOut" }
});
const Services = () => {
const shouldReduceMotion = useReducedMotion();
if (shouldReduceMotion) {
return (
<section className="section-padding bg-gray-50">
<div className="container-custom">
<div className="text-center mb-16">
<h2 className="text-3xl lg:text-4xl font-bold text-gray-900 mb-4">
Explore our services
</h2>
</div>
<div className="grid lg:grid-cols-2 gap-12">
{/* Web Development */}
<div className="service-card">
<div className="flex items-center justify-between mb-6">
<h3 className="text-2xl font-bold text-gray-900">Web Development</h3>
<Globe className="w-8 h-8 text-primary-600" />
</div>
<p className="text-gray-600 mb-6">
Custom web applications built with modern technologies and best practices.
</p>
<div className="flex items-center space-x-2 text-primary-600">
<span className="text-sm font-medium">Learn more</span>
<div className="w-4 h-0.5 bg-primary-600"></div>
</div>
</div>
{/* Mobile Development */}
<div className="service-card">
<div className="flex items-center justify-between mb-6">
<h3 className="text-2xl font-bold text-gray-900">Mobile Development</h3>
<Package className="w-8 h-8 text-primary-600" />
</div>
<p className="text-gray-600 mb-6">
Native and cross-platform mobile applications for iOS and Android.
</p>
<div className="flex items-center space-x-2 text-primary-600">
<span className="text-sm font-medium">Learn more</span>
<div className="w-4 h-0.5 bg-primary-600"></div>
</div>
</div>
</div>
{/* CTA Section */}
<div className="mt-16 text-center">
<div className="bg-white rounded-2xl p-8 lg:p-12 shadow-sm border border-gray-100">
<h3 className="text-2xl lg:text-3xl font-bold text-gray-900 mb-4">
Get the same high-quality service for a smaller task
</h3>
<button className="btn-primary mt-6">
Start Your Project
</button>
</div>
</div>
</div>
</section>
);
}
return (
<motion.section
{...fadeUpPreset(0.1, 0.8)}
className="section-padding bg-gray-50"
>
<div className="container-custom">
<motion.div
{...fadeUpPreset(0.2, 0.8)}
className="text-center mb-16"
>
<h2 className="text-3xl lg:text-4xl font-bold text-gray-900 mb-4">
Explore our services
</h2>
</motion.div>
<div className="grid lg:grid-cols-2 gap-12">
{/* Web Development */}
<motion.div
{...fadeUpPreset(0.3, 0.8)}
className="service-card"
>
<div className="flex items-center justify-between mb-6">
<h3 className="text-2xl font-bold text-gray-900">Web Development</h3>
<Globe className="w-8 h-8 text-primary-600" />
</div>
<p className="text-gray-600 mb-6">
Custom web applications built with modern technologies and best practices.
</p>
<div className="flex items-center space-x-2 text-primary-600">
<span className="text-sm font-medium">Learn more</span>
<div className="w-4 h-0.5 bg-primary-600"></div>
</div>
</motion.div>
{/* Mobile Development */}
<motion.div
{...fadeUpPreset(0.4, 0.8)}
className="service-card"
>
<div className="flex items-center justify-between mb-6">
<h3 className="text-2xl font-bold text-gray-900">Mobile Development</h3>
<Package className="w-8 h-8 text-primary-600" />
</div>
<p className="text-gray-600 mb-6">
Native and cross-platform mobile applications for iOS and Android.
</p>
<div className="flex items-center space-x-2 text-primary-600">
<span className="text-sm font-medium">Learn more</span>
<div className="w-4 h-0.5 bg-primary-600"></div>
</div>
</motion.div>
</div>
{/* CTA Section */}
<motion.div
{...fadeUpPreset(0.5, 0.8)}
className="mt-16 text-center"
>
<div className="bg-white rounded-2xl p-8 lg:p-12 shadow-sm border border-gray-100">
<h3 className="text-2xl lg:text-3xl font-bold text-gray-900 mb-4">
Get the same high-quality service for a smaller task
</h3>
<button className="btn-primary mt-6">
Start Your Project
</button>
</div>
</motion.div>
</div>
</motion.section>
);
};
export default Services;

69
src/components/Stats.js Normal file
View File

@@ -0,0 +1,69 @@
import React from 'react';
import { motion, useReducedMotion } from 'framer-motion';
const fadeUpPreset = (delay = 0, duration = 1.2) => ({
initial: { opacity: 0, y: 20 },
whileInView: { opacity: 1, y: 0 },
viewport: { once: true, amount: 0.2 },
transition: { delay, duration, ease: "easeOut" }
});
const Stats = () => {
const shouldReduceMotion = useReducedMotion();
const stats = [
{ value: '92%', label: 'Client satisfaction rate' },
{ value: '50+', label: 'Completed projects' },
{ value: '30k+', label: 'Lines of code written' },
{ value: '100%', label: 'On-time delivery' }
];
if (shouldReduceMotion) {
return (
<section className="section-padding bg-white">
<div className="container-custom">
<div className="grid grid-cols-2 lg:grid-cols-4 gap-6">
{stats.map((stat, index) => (
<div key={index} className="stats-card text-center">
<div className="text-3xl lg:text-4xl font-bold text-gray-900 mb-2">
{stat.value}
</div>
<div className="text-gray-600 text-sm lg:text-base">
{stat.label}
</div>
</div>
))}
</div>
</div>
</section>
);
}
return (
<motion.section
{...fadeUpPreset(0.1, 0.8)}
className="section-padding bg-white"
>
<div className="container-custom">
<div className="grid grid-cols-2 lg:grid-cols-4 gap-6">
{stats.map((stat, index) => (
<motion.div
key={index}
{...fadeUpPreset(0.2 + index * 0.1, 0.8)}
className="stats-card text-center"
>
<div className="text-3xl lg:text-4xl font-bold text-gray-900 mb-2">
{stat.value}
</div>
<div className="text-gray-600 text-sm lg:text-base">
{stat.label}
</div>
</motion.div>
))}
</div>
</div>
</motion.section>
);
};
export default Stats;

80
src/components/Team.js Normal file
View File

@@ -0,0 +1,80 @@
import React from 'react';
import { motion, useReducedMotion } from 'framer-motion';
const fadeUpPreset = (delay = 0, duration = 1.2) => ({
initial: { opacity: 0, y: 20 },
whileInView: { opacity: 1, y: 0 },
viewport: { once: true, amount: 0.2 },
transition: { delay, duration, ease: "easeOut" }
});
const Team = () => {
const shouldReduceMotion = useReducedMotion();
if (shouldReduceMotion) {
return (
<section className="section-padding bg-white">
<div className="container-custom">
<div className="text-center mb-16">
<h2 className="text-3xl lg:text-4xl font-bold text-gray-900 mb-4">
Sargas Team
</h2>
</div>
<div className="max-w-4xl mx-auto">
<div className="bg-gray-50 rounded-2xl p-8 lg:p-12">
<div className="text-center">
<div className="w-24 h-24 bg-gray-200 rounded-full mx-auto mb-6"></div>
<h3 className="text-2xl font-bold text-gray-900 mb-2">Meet Our Team</h3>
<p className="text-gray-600 mb-8">
Our experienced team of developers, designers, and project managers are dedicated to delivering exceptional results.
</p>
<button className="btn-primary">
Get to Know Us
</button>
</div>
</div>
</div>
</div>
</section>
);
}
return (
<motion.section
{...fadeUpPreset(0.1, 0.8)}
className="section-padding bg-white"
>
<div className="container-custom">
<motion.div
{...fadeUpPreset(0.2, 0.8)}
className="text-center mb-16"
>
<h2 className="text-3xl lg:text-4xl font-bold text-gray-900 mb-4">
Sargas Team
</h2>
</motion.div>
<motion.div
{...fadeUpPreset(0.3, 0.8)}
className="max-w-4xl mx-auto"
>
<div className="bg-gray-50 rounded-2xl p-8 lg:p-12">
<div className="text-center">
<div className="w-24 h-24 bg-gray-200 rounded-full mx-auto mb-6"></div>
<h3 className="text-2xl font-bold text-gray-900 mb-2">Meet Our Team</h3>
<p className="text-gray-600 mb-8">
Our experienced team of developers, designers, and project managers are dedicated to delivering exceptional results.
</p>
<button className="btn-primary">
Get to Know Us
</button>
</div>
</div>
</motion.div>
</div>
</motion.section>
);
};
export default Team;

View File

@@ -0,0 +1,95 @@
import React from 'react';
import { motion, useReducedMotion } from 'framer-motion';
import { Star } from 'lucide-react';
const fadeUpPreset = (delay = 0, duration = 1.2) => ({
initial: { opacity: 0, y: 20 },
whileInView: { opacity: 1, y: 0 },
viewport: { once: true, amount: 0.2 },
transition: { delay, duration, ease: "easeOut" }
});
const Testimonials = () => {
const shouldReduceMotion = useReducedMotion();
if (shouldReduceMotion) {
return (
<section className="section-padding bg-gray-50">
<div className="container-custom">
<div className="text-center mb-16">
<h2 className="text-3xl lg:text-4xl font-bold text-gray-900 mb-4">
Testimonials
</h2>
</div>
<div className="max-w-4xl mx-auto">
<div className="bg-white rounded-2xl p-8 lg:p-12 shadow-sm border border-gray-100">
<div className="flex items-center mb-6">
<div className="flex">
{[...Array(5)].map((_, i) => (
<Star key={i} className="w-5 h-5 fill-yellow-400 text-yellow-400" />
))}
</div>
</div>
<blockquote className="text-xl lg:text-2xl text-gray-900 mb-8">
"Working with Sargas was an exceptional experience. They delivered our project on time and exceeded our expectations with their attention to detail and technical expertise."
</blockquote>
<div className="flex items-center">
<div className="w-12 h-12 bg-gray-200 rounded-full mr-4"></div>
<div>
<div className="font-semibold text-gray-900">Sarah Johnson</div>
<div className="text-gray-600">CEO, TechStart Inc.</div>
</div>
</div>
</div>
</div>
</div>
</section>
);
}
return (
<motion.section
{...fadeUpPreset(0.1, 0.8)}
className="section-padding bg-gray-50"
>
<div className="container-custom">
<motion.div
{...fadeUpPreset(0.2, 0.8)}
className="text-center mb-16"
>
<h2 className="text-3xl lg:text-4xl font-bold text-gray-900 mb-4">
Testimonials
</h2>
</motion.div>
<motion.div
{...fadeUpPreset(0.3, 0.8)}
className="max-w-4xl mx-auto"
>
<div className="bg-white rounded-2xl p-8 lg:p-12 shadow-sm border border-gray-100">
<div className="flex items-center mb-6">
<div className="flex">
{[...Array(5)].map((_, i) => (
<Star key={i} className="w-5 h-5 fill-yellow-400 text-yellow-400" />
))}
</div>
</div>
<blockquote className="text-xl lg:text-2xl text-gray-900 mb-8">
"Working with Sargas was an exceptional experience. They delivered our project on time and exceeded our expectations with their attention to detail and technical expertise."
</blockquote>
<div className="flex items-center">
<div className="w-12 h-12 bg-gray-200 rounded-full mr-4"></div>
<div>
<div className="font-semibold text-gray-900">Sarah Johnson</div>
<div className="text-gray-600">CEO, TechStart Inc.</div>
</div>
</div>
</div>
</motion.div>
</div>
</motion.section>
);
};
export default Testimonials;

65
src/index.css Normal file
View File

@@ -0,0 +1,65 @@
@tailwind base;
@tailwind components;
@tailwind utilities;
@layer base {
* {
@apply border-border;
}
body {
@apply bg-white text-gray-900 font-sans;
}
html {
scroll-behavior: smooth;
}
}
@layer components {
.btn-primary {
@apply bg-primary-600 hover:bg-primary-700 text-white px-6 py-3 rounded-lg font-medium transition-colors duration-200;
}
.btn-secondary {
@apply bg-gray-800 hover:bg-gray-900 text-white px-6 py-3 rounded-lg font-medium transition-colors duration-200;
}
.section-padding {
@apply py-16 lg:py-24;
}
.container-custom {
@apply max-w-7xl mx-auto px-4 sm:px-6 lg:px-8;
}
}
.cookie-banner {
backdrop-filter: blur(10px);
background: rgba(255, 255, 255, 0.95);
}
.mobile-menu {
backdrop-filter: blur(10px);
background: rgba(255, 255, 255, 0.98);
}
.tech-badge {
@apply inline-flex items-center px-3 py-1 rounded-full text-sm font-medium;
}
.hero-gradient {
background: linear-gradient(135deg, #f8fafc 0%, #e2e8f0 100%);
}
.stats-card {
@apply bg-white rounded-xl p-6 shadow-sm border border-gray-100;
}
.service-card {
@apply bg-white rounded-xl p-8 shadow-sm border border-gray-100 hover:shadow-md transition-shadow duration-300;
}
.case-study-card {
@apply bg-gradient-to-br from-blue-500 to-blue-600 rounded-xl p-8 text-white;
}

13
src/index.js Normal file
View File

@@ -0,0 +1,13 @@
import React from 'react';
import { createRoot } from 'react-dom/client';
import './index.css';
import App from './App';
const container = document.getElementById('root');
const root = createRoot(container);
root.render(
<React.StrictMode>
<App />
</React.StrictMode>
);