Merge pull request #2 from yusuf-intern/main
Clean up UI components, remove unnecessary libs, improve navigation &…
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
import { Toaster } from "@/components/ui/toaster";
|
||||
import ScrollToTop from './components/ScrollToTop';
|
||||
import { Toaster as Sonner } from "@/components/ui/sonner";
|
||||
import { TooltipProvider } from "@/components/ui/tooltip";
|
||||
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
|
||||
@@ -23,6 +24,7 @@ const App = () => (
|
||||
<Toaster />
|
||||
<Sonner />
|
||||
<BrowserRouter>
|
||||
<ScrollToTop /> {/* component added to scroll to top of page */}
|
||||
<Routes>
|
||||
<Route path="/" element={<Index />} />
|
||||
<Route path="/about" element={<About />} />
|
||||
|
||||
@@ -121,12 +121,12 @@ const Footer = () => {
|
||||
info@openxpert.com
|
||||
</span>
|
||||
</li>
|
||||
<li className="flex items-start gap-2">
|
||||
{/* <li className="flex items-start gap-2">
|
||||
<Phone className="w-4 h-4 text-primary mt-0.5" />
|
||||
<span className="text-sm text-muted-foreground">
|
||||
+971 XXX XXXX
|
||||
</span>
|
||||
</li>
|
||||
</li> */}
|
||||
<li className="flex items-start gap-2">
|
||||
<MapPin className="w-4 h-4 text-primary mt-0.5" />
|
||||
<span className="text-sm text-muted-foreground">
|
||||
|
||||
@@ -67,7 +67,7 @@ const Navigation = () => {
|
||||
</button>
|
||||
|
||||
{isServicesOpen && (
|
||||
<div className="absolute top-full left-0 mt-2 w-64 glass-strong rounded-2xl overflow-hidden shadow-lg animate-slide-in-up">
|
||||
<div className="absolute top-full left-0 mt-0 w-64 glass-strong rounded-2xl overflow-hidden shadow-lg animate-slide-in-up"> {/*changed mt-2 to mt-0 to remove gap triggering leave*/}
|
||||
{services.map((service) => (
|
||||
<Link
|
||||
key={service.path}
|
||||
|
||||
@@ -46,10 +46,14 @@ export const ParticleField = () => {
|
||||
const drawParticles = () => {
|
||||
ctx.clearRect(0, 0, canvas.width, canvas.height);
|
||||
|
||||
const particleColor = getComputedStyle(document.documentElement) //added particle colour
|
||||
.getPropertyValue('--particle')
|
||||
.trim();
|
||||
|
||||
particles.forEach((particle) => {
|
||||
ctx.beginPath();
|
||||
ctx.arc(particle.x, particle.y, particle.size, 0, Math.PI * 2);
|
||||
ctx.fillStyle = `hsla(205, 100%, 88%, ${particle.opacity})`;
|
||||
ctx.fillStyle = `hsl(${particleColor} / ${particle.opacity})`;
|
||||
ctx.fill();
|
||||
|
||||
// Update position
|
||||
|
||||
12
src/components/ScrollToTop.tsx
Normal file
12
src/components/ScrollToTop.tsx
Normal file
@@ -0,0 +1,12 @@
|
||||
import { useEffect } from 'react';
|
||||
import { useLocation } from 'react-router-dom';
|
||||
//component added to scroll to top of page
|
||||
export default function ScrollToTop() {
|
||||
const { pathname } = useLocation();
|
||||
|
||||
useEffect(() => {
|
||||
window.scrollTo(0, 0);
|
||||
}, [pathname]);
|
||||
|
||||
return null;
|
||||
}
|
||||
@@ -9,7 +9,7 @@ const buttonVariants = cva(
|
||||
{
|
||||
variants: {
|
||||
variant: {
|
||||
default: "bg-primary text-primary-foreground hover:bg-primary/90",
|
||||
default: "bg-primary text-foreground hover:bg-primary/90", //changed text-primary-foreground to text-foreground
|
||||
destructive: "bg-destructive text-destructive-foreground hover:bg-destructive/90",
|
||||
outline: "border border-input bg-background hover:bg-accent hover:text-accent-foreground",
|
||||
secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80",
|
||||
|
||||
@@ -64,6 +64,8 @@ All colors MUST be HSL.
|
||||
--sidebar-accent-foreground: 240 5.9% 10%;
|
||||
--sidebar-border: 220 13% 91%;
|
||||
--sidebar-ring: 217.2 91.2% 59.8%;
|
||||
|
||||
--particle: 210 100% 18%;
|
||||
}
|
||||
|
||||
.dark {
|
||||
@@ -114,6 +116,8 @@ All colors MUST be HSL.
|
||||
--sidebar-accent-foreground: 240 4.8% 95.9%;
|
||||
--sidebar-border: 240 3.7% 15.9%;
|
||||
--sidebar-ring: 217.2 91.2% 59.8%;
|
||||
|
||||
--particle: 210 100% 88%; /* added particle colour */
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -52,12 +52,12 @@ const Contact = () => {
|
||||
<Input type="email" placeholder="john@example.com" className="glass-card" />
|
||||
</div>
|
||||
|
||||
<div>
|
||||
{/* <div>
|
||||
<label className="text-sm font-medium text-foreground mb-2 block">
|
||||
Phone
|
||||
</label>
|
||||
<Input type="tel" placeholder="+971 XXX XXXX" className="glass-card" />
|
||||
</div>
|
||||
</div> */}
|
||||
|
||||
<div>
|
||||
<label className="text-sm font-medium text-foreground mb-2 block">
|
||||
@@ -92,7 +92,7 @@ const Contact = () => {
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="flex items-start gap-4">
|
||||
{/* <div className="flex items-start gap-4">
|
||||
<div className="w-12 h-12 rounded-2xl bg-gradient-to-br from-primary/10 to-accent/20 flex items-center justify-center flex-shrink-0">
|
||||
<Phone className="w-5 h-5 text-primary" />
|
||||
</div>
|
||||
@@ -101,7 +101,7 @@ const Contact = () => {
|
||||
<p className="text-muted-foreground">+971 XXX XXXX</p>
|
||||
<p className="text-muted-foreground">+971 XXX XXXX</p>
|
||||
</div>
|
||||
</div>
|
||||
</div> */}
|
||||
|
||||
<div className="flex items-start gap-4">
|
||||
<div className="w-12 h-12 rounded-2xl bg-gradient-to-br from-primary/10 to-accent/20 flex items-center justify-center flex-shrink-0">
|
||||
|
||||
@@ -62,13 +62,13 @@ const Index = () => {
|
||||
{/* Hero Section */}
|
||||
<header className="text-center mb-32 animate-slide-in-up relative">
|
||||
{/* Floating sparkle effects */}
|
||||
<Sparkles className="absolute top-0 left-1/4 w-8 h-8 text-primary/30 animate-glow-pulse" style={{
|
||||
<Sparkles className="absolute top-0 left-1/4 w-8 h-8 text-primary/30 " style={{
|
||||
animationDelay: "0s"
|
||||
}} />
|
||||
<Sparkles className="absolute top-10 right-1/3 w-6 h-6 text-accent/40 animate-glow-pulse" style={{
|
||||
<Sparkles className="absolute top-10 right-1/3 w-6 h-6 text-accent/40 " style={{
|
||||
animationDelay: "1s"
|
||||
}} />
|
||||
<Sparkles className="absolute bottom-10 left-1/3 w-7 h-7 text-primary/20 animate-glow-pulse" style={{
|
||||
<Sparkles className="absolute bottom-10 left-1/3 w-7 h-7 text-primary/20 " style={{
|
||||
animationDelay: "2s"
|
||||
}} />
|
||||
|
||||
@@ -78,7 +78,7 @@ const Index = () => {
|
||||
|
||||
<h1 className="text-6xl md:text-7xl lg:text-8xl font-bold text-foreground mb-8 tracking-tight leading-none">
|
||||
Precision. Innovation.
|
||||
<span className="block mt-3 bg-gradient-to-r from-primary via-primary/80 to-accent bg-clip-text text-transparent animate-glow-pulse">
|
||||
<span className="block mt-3 bg-gradient-to-r from-primary via-primary/80 to-accent bg-clip-text text-transparent "> {/*removed css animate-glow-pulse*/}
|
||||
Open Solutions.
|
||||
</span>
|
||||
</h1>
|
||||
|
||||
@@ -79,9 +79,9 @@ const Portfolio = () => {
|
||||
<div className="absolute inset-0 bg-gradient-to-t from-background/80 to-transparent opacity-0 group-hover:opacity-100 transition-opacity duration-300" />
|
||||
|
||||
{/* Hover Icon */}
|
||||
<div className="absolute top-4 right-4 w-10 h-10 rounded-full glass-strong flex items-center justify-center opacity-0 group-hover:opacity-100 transition-opacity duration-300">
|
||||
{/* <div className="absolute top-4 right-4 w-10 h-10 rounded-full glass-strong flex items-center justify-center opacity-0 group-hover:opacity-100 transition-opacity duration-300">
|
||||
<ExternalLink className="w-5 h-5 text-primary" />
|
||||
</div>
|
||||
</div> */}
|
||||
</div>
|
||||
|
||||
{/* Content */}
|
||||
|
||||
@@ -168,7 +168,7 @@ const AmcSupport = () => {
|
||||
</div>
|
||||
|
||||
{/* Animated Support Visual */}
|
||||
<div className="glass-strong rounded-3xl p-8 max-w-5xl mx-auto mb-20 animate-slide-in-up" style={{ animationDelay: "200ms" }}>
|
||||
{/* <div className="glass-strong rounded-3xl p-8 max-w-5xl mx-auto mb-20 animate-slide-in-up" style={{ animationDelay: "200ms" }}>
|
||||
<div className="aspect-video glass-card rounded-2xl flex items-center justify-center relative overflow-hidden">
|
||||
<div className="relative">
|
||||
<HeadphonesIcon className="w-24 h-24 text-primary/30 animate-glow-pulse" />
|
||||
@@ -192,7 +192,7 @@ const AmcSupport = () => {
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</div> */}
|
||||
</section>
|
||||
|
||||
{/* Features Grid */}
|
||||
@@ -290,7 +290,7 @@ const AmcSupport = () => {
|
||||
</section>
|
||||
|
||||
{/* Pricing Tiers */}
|
||||
<section className="container mx-auto px-6 py-20">
|
||||
{/* <section className="container mx-auto px-6 py-20">
|
||||
<h2 className="text-4xl font-bold text-center text-foreground mb-4">
|
||||
Choose Your Support Plan
|
||||
</h2>
|
||||
@@ -338,10 +338,10 @@ const AmcSupport = () => {
|
||||
</Card>
|
||||
))}
|
||||
</div>
|
||||
</section>
|
||||
</section> */}
|
||||
|
||||
{/* Testimonials */}
|
||||
<section className="container mx-auto px-6 py-20">
|
||||
{/* <section className="container mx-auto px-6 py-20">
|
||||
<h2 className="text-4xl font-bold text-center text-foreground mb-16">
|
||||
What Our Clients Say
|
||||
</h2>
|
||||
@@ -365,7 +365,7 @@ const AmcSupport = () => {
|
||||
</Card>
|
||||
))}
|
||||
</div>
|
||||
</section>
|
||||
</section> */}
|
||||
|
||||
{/* CTA Section */}
|
||||
<section className="container mx-auto px-6 py-20">
|
||||
|
||||
@@ -125,7 +125,7 @@ const ECommerce = () => {
|
||||
</div>
|
||||
|
||||
{/* Animated Store Preview */}
|
||||
<div className="glass-strong rounded-3xl p-8 max-w-5xl mx-auto mb-20 animate-slide-in-up" style={{ animationDelay: "200ms" }}>
|
||||
{/*<div className="glass-strong rounded-3xl p-8 max-w-5xl mx-auto mb-20 animate-slide-in-up" style={{ animationDelay: "200ms" }}>
|
||||
<div className="aspect-video glass-card rounded-2xl flex items-center justify-center relative overflow-hidden">
|
||||
<ShoppingCart className="w-24 h-24 text-primary/30 animate-glow-pulse" />
|
||||
<div className="absolute top-4 right-4">
|
||||
@@ -147,7 +147,7 @@ const ECommerce = () => {
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</div>*/}
|
||||
</section>
|
||||
|
||||
{/* Features Grid */}
|
||||
@@ -180,7 +180,7 @@ const ECommerce = () => {
|
||||
</section>
|
||||
|
||||
{/* Theme Playground */}
|
||||
<section className="container mx-auto px-6 py-20">
|
||||
{/* <section className="container mx-auto px-6 py-20">
|
||||
<div className="glass-strong rounded-3xl p-8 md:p-12 max-w-5xl mx-auto">
|
||||
<h2 className="text-3xl md:text-4xl font-bold text-foreground mb-4 text-center">
|
||||
Live Theme Customizer
|
||||
@@ -213,7 +213,7 @@ const ECommerce = () => {
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</section> */}
|
||||
|
||||
{/* Conversion Features */}
|
||||
<section className="container mx-auto px-6 py-20">
|
||||
@@ -242,7 +242,7 @@ const ECommerce = () => {
|
||||
</section>
|
||||
|
||||
{/* Pricing Packages */}
|
||||
<section className="container mx-auto px-6 py-20">
|
||||
{/* <section className="container mx-auto px-6 py-20">
|
||||
<h2 className="text-4xl font-bold text-center text-foreground mb-4">
|
||||
Choose Your Package
|
||||
</h2>
|
||||
@@ -279,7 +279,7 @@ const ECommerce = () => {
|
||||
</Card>
|
||||
))}
|
||||
</div>
|
||||
</section>
|
||||
</section> */}
|
||||
|
||||
{/* CTA Section */}
|
||||
<section className="container mx-auto px-6 py-20">
|
||||
|
||||
@@ -104,7 +104,7 @@ const ErpSystems = () => {
|
||||
</div>
|
||||
|
||||
{/* Animated Dashboard Preview */}
|
||||
<div className="glass-strong rounded-3xl p-8 max-w-5xl mx-auto mb-20 animate-slide-in-up" style={{ animationDelay: "200ms" }}>
|
||||
{/*<div className="glass-strong rounded-3xl p-8 max-w-5xl mx-auto mb-20 animate-slide-in-up" style={{ animationDelay: "200ms" }}>
|
||||
<div className="grid grid-cols-2 md:grid-cols-4 gap-4 mb-6">
|
||||
{[
|
||||
{ label: "Revenue", value: "$2.4M", trend: "+12%" },
|
||||
@@ -122,7 +122,7 @@ const ErpSystems = () => {
|
||||
<div className="h-48 glass-card rounded-2xl flex items-center justify-center">
|
||||
<BarChart3 className="w-16 h-16 text-primary/30 animate-glow-pulse" />
|
||||
</div>
|
||||
</div>
|
||||
</div>*/}
|
||||
</section>
|
||||
|
||||
{/* Modules Section */}
|
||||
@@ -155,7 +155,7 @@ const ErpSystems = () => {
|
||||
</section>
|
||||
|
||||
{/* ROI Calculator */}
|
||||
<section className="container mx-auto px-6 py-20">
|
||||
{/* <section className="container mx-auto px-6 py-20">
|
||||
<div className="glass-strong rounded-3xl p-8 md:p-12 max-w-5xl mx-auto">
|
||||
<h2 className="text-3xl md:text-4xl font-bold text-foreground mb-4 text-center">
|
||||
Calculate Your ROI
|
||||
@@ -218,7 +218,7 @@ const ErpSystems = () => {
|
||||
</Button>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</section>*/}
|
||||
|
||||
{/* Features Comparison */}
|
||||
<section className="container mx-auto px-6 py-20">
|
||||
|
||||
@@ -126,7 +126,7 @@ const RmmServices = () => {
|
||||
<Navigation />
|
||||
|
||||
{/* Hero Section */}
|
||||
<section className="relative container mx-auto px-6 pt-32 pb-20">
|
||||
{/* <section className="relative container mx-auto px-6 pt-32 pb-20">
|
||||
<div className="text-center mb-16 animate-slide-in-up">
|
||||
<h1 className="text-5xl md:text-6xl font-bold text-foreground mb-6">
|
||||
RMM Services
|
||||
@@ -139,7 +139,7 @@ const RmmServices = () => {
|
||||
</p>
|
||||
</div>
|
||||
|
||||
{/* Animated Network Map */}
|
||||
|
||||
<div className="glass-strong rounded-3xl p-8 max-w-5xl mx-auto mb-20 animate-slide-in-up" style={{ animationDelay: "200ms" }}>
|
||||
<div className="aspect-video glass-card rounded-2xl flex items-center justify-center relative overflow-hidden">
|
||||
<div className="relative">
|
||||
@@ -168,7 +168,7 @@ const RmmServices = () => {
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</section> */}
|
||||
|
||||
{/* Features Grid */}
|
||||
<section className="container mx-auto px-6 py-20">
|
||||
@@ -200,7 +200,7 @@ const RmmServices = () => {
|
||||
</section>
|
||||
|
||||
{/* Live Status Simulation */}
|
||||
<section className="container mx-auto px-6 py-20">
|
||||
{/* <section className="container mx-auto px-6 py-20">
|
||||
<div className="glass-strong rounded-3xl p-8 md:p-12 max-w-5xl mx-auto">
|
||||
<h2 className="text-3xl md:text-4xl font-bold text-foreground mb-4 text-center">
|
||||
Live Dashboard Preview
|
||||
@@ -245,7 +245,7 @@ const RmmServices = () => {
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</section>
|
||||
</section> */}
|
||||
|
||||
{/* Benefits Stats */}
|
||||
<section className="container mx-auto px-6 py-20">
|
||||
@@ -270,7 +270,7 @@ const RmmServices = () => {
|
||||
</section>
|
||||
|
||||
{/* Pricing Tiers */}
|
||||
<section className="container mx-auto px-6 py-20">
|
||||
{/* <section className="container mx-auto px-6 py-20">
|
||||
<h2 className="text-4xl font-bold text-center text-foreground mb-4">
|
||||
Choose Your Monitoring Plan
|
||||
</h2>
|
||||
@@ -308,7 +308,7 @@ const RmmServices = () => {
|
||||
</Card>
|
||||
))}
|
||||
</div>
|
||||
</section>
|
||||
</section> */}
|
||||
|
||||
{/* CTA Section */}
|
||||
<section className="container mx-auto px-6 py-20">
|
||||
|
||||
Reference in New Issue
Block a user