thetwistedpixie commited on
Commit
e68daf6
·
verified ·
1 Parent(s): d42ddd6

Make it better

Browse files
Files changed (4) hide show
  1. README.md +8 -5
  2. index.html +245 -19
  3. script.js +440 -0
  4. style.css +252 -18
README.md CHANGED
@@ -1,10 +1,13 @@
1
  ---
2
- title: Neonnexus Agency
3
- emoji: 🐠
4
- colorFrom: blue
5
- colorTo: yellow
6
  sdk: static
7
  pinned: false
 
 
8
  ---
9
 
10
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
 
1
  ---
2
+ title: NeonNexus Agency 🚀
3
+ colorFrom: red
4
+ colorTo: green
5
+ emoji: 🐳
6
  sdk: static
7
  pinned: false
8
+ tags:
9
+ - deepsite-v3
10
  ---
11
 
12
+ # Welcome to your new DeepSite project!
13
+ This project was created with [DeepSite](https://huggingface.co/deepsite).
index.html CHANGED
@@ -1,19 +1,245 @@
1
- <!doctype html>
2
- <html>
3
- <head>
4
- <meta charset="utf-8" />
5
- <meta name="viewport" content="width=device-width" />
6
- <title>My static Space</title>
7
- <link rel="stylesheet" href="style.css" />
8
- </head>
9
- <body>
10
- <div class="card">
11
- <h1>Welcome to your static Space!</h1>
12
- <p>You can modify this app directly by editing <i>index.html</i> in the Files and versions tab.</p>
13
- <p>
14
- Also don't forget to check the
15
- <a href="https://huggingface.co/docs/hub/spaces" target="_blank">Spaces documentation</a>.
16
- </p>
17
- </div>
18
- </body>
19
- </html>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en" class="scroll-smooth">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>NeonNexus Agency - Digital Alchemists</title>
7
+ <link rel="icon" type="image/x-icon" href="/static/favicon.ico">
8
+ <link rel="stylesheet" href="style.css">
9
+ <script src="https://cdn.tailwindcss.com"></script>
10
+ <script src="https://cdn.jsdelivr.net/npm/feather-icons/dist/feather.min.js"></script>
11
+ <script>
12
+ tailwind.config = {
13
+ theme: {
14
+ extend: {
15
+ colors: {
16
+ primary: {
17
+ 50: '#f5f3ff',
18
+ 100: '#ede9fe',
19
+ 200: '#ddd6fe',
20
+ 300: '#c4b5fd',
21
+ 400: '#a78bfa',
22
+ 500: '#8b5cf6',
23
+ 600: '#7c3aed',
24
+ 700: '#6d28d9',
25
+ 800: '#5b21b6',
26
+ 900: '#4c1d95',
27
+ },
28
+ secondary: {
29
+ 50: '#f0fdfa',
30
+ 100: '#ccfbf1',
31
+ 200: '#99f6e4',
32
+ 300: '#5eead4',
33
+ 400: '#2dd4bf',
34
+ 500: '#14b8a6',
35
+ 600: '#0d9488',
36
+ 700: '#0f766e',
37
+ 800: '#115e59',
38
+ 900: '#134e4a',
39
+ }
40
+ },
41
+ animation: {
42
+ 'float': 'float 6s ease-in-out infinite',
43
+ 'glow': 'glow 2s ease-in-out infinite alternate',
44
+ 'slide-up': 'slideUp 0.6s ease-out forwards',
45
+ 'slide-down': 'slideDown 0.6s ease-out forwards',
46
+ 'fade-in': 'fadeIn 0.8s ease-out forwards',
47
+ }
48
+ }
49
+ }
50
+ }
51
+ </script>
52
+ </head>
53
+ <body class="bg-gray-900 text-white transition-colors duration-300 dark-mode">
54
+ <!-- Loading Screen -->
55
+ <div id="loading-screen" class="fixed inset-0 bg-gray-900 z-50 flex items-center justify-center transition-opacity duration-500">
56
+ <div class="w-16 h-16 border-4 border-primary-500 border-t-transparent rounded-full animate-spin"></div>
57
+ </div>
58
+
59
+ <!-- Theme Toggle -->
60
+ <button id="theme-toggle" class="fixed top-4 right-4 z-40 p-3 bg-gray-800 rounded-full shadow-lg hover:bg-gray-700 transition-colors duration-300">
61
+ <i data-feather="sun" class="w-5 h-5 text-yellow-400 dark-icon hidden"></i>
62
+ <i data-feather="moon" class="w-5 h-5 text-primary-400 light-icon"></i>
63
+ </button>
64
+
65
+ <!-- Navigation -->
66
+ <nav-bar></nav-bar>
67
+
68
+ <!-- Hero Section -->
69
+ <section class="min-h-screen flex items-center justify-center relative overflow-hidden px-4 pt-20">
70
+ <div class="absolute inset-0 bg-gradient-to-br from-primary-900/20 via-transparent to-secondary-900/20"></div>
71
+ <div class="absolute top-20 left-10 w-72 h-72 bg-primary-500 rounded-full filter blur-3xl opacity-20 animate-float"></div>
72
+ <div class="absolute bottom-20 right-10 w-96 h-96 bg-secondary-500 rounded-full filter blur-3xl opacity-20 animate-float" style="animation-delay: -3s;"></div>
73
+
74
+ <div class="container mx-auto max-w-6xl relative z-10">
75
+ <div class="text-center space-y-8">
76
+ <h1 class="text-5xl md:text-7xl font-bold leading-tight">
77
+ <span class="block text-transparent bg-clip-text bg-gradient-to-r from-primary-400 to-secondary-400 animate-glow">
78
+ Digital Alchemists
79
+ </span>
80
+ <span class="block text-gray-300 mt-2">Crafting Tomorrow</span>
81
+ </h1>
82
+ <p class="text-xl md:text-2xl text-gray-400 max-w-3xl mx-auto leading-relaxed">
83
+ We transform pixels into experiences, code into art, and ideas into digital masterpieces that captivate and convert.
84
+ </p>
85
+ <div class="flex flex-wrap justify-center gap-4 pt-8">
86
+ <a href="#portfolio" class="px-8 py-4 bg-primary-600 hover:bg-primary-500 rounded-full font-semibold transition-all duration-300 transform hover:scale-105 hover:-translate-y-1 shadow-lg hover:shadow-primary-500/25">
87
+ View Our Work
88
+ </a>
89
+ <a href="#contact" class="px-8 py-4 border-2 border-primary-500 hover:bg-primary-500 rounded-full font-semibold transition-all duration-300 transform hover:scale-105 hover:-translate-y-1">
90
+ Start Project
91
+ </a>
92
+ </div>
93
+ </div>
94
+ </div>
95
+
96
+ <div class="absolute bottom-10 left-1/2 transform -translate-x-1/2 animate-bounce">
97
+ <i data-feather="chevron-down" class="w-8 h-8 text-primary-400"></i>
98
+ </div>
99
+ </section>
100
+
101
+ <!-- Services Section -->
102
+ <section id="services" class="py-20 px-4">
103
+ <div class="container mx-auto max-w-6xl">
104
+ <div class="text-center mb-16">
105
+ <h2 class="text-4xl md:text-5xl font-bold mb-4">
106
+ <span class="text-transparent bg-clip-text bg-gradient-to-r from-primary-400 to-secondary-400">
107
+ Our Services
108
+ </span>
109
+ </h2>
110
+ <p class="text-gray-400 text-lg max-w-2xl mx-auto">
111
+ Full-spectrum digital solutions tailored to elevate your brand
112
+ </p>
113
+ </div>
114
+
115
+ <div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8">
116
+ <service-card
117
+ icon="code"
118
+ title="Web Development"
119
+ description="Custom-built, performant websites with cutting-edge technologies and pixel-perfect implementation."
120
+ ></service-card>
121
+ <service-card
122
+ icon="layout"
123
+ title="UI/UX Design"
124
+ description="Intuitive interfaces that delight users and drive engagement through thoughtful design systems."
125
+ ></service-card>
126
+ <service-card
127
+ icon="smartphone"
128
+ title="Mobile Apps"
129
+ description="Native and cross-platform mobile applications that deliver seamless user experiences."
130
+ ></service-card>
131
+ <service-card
132
+ icon="zap"
133
+ title="Brand Strategy"
134
+ description="Comprehensive brand identity development that resonates with your target audience."
135
+ ></service-card>
136
+ <service-card
137
+ icon="trending-up"
138
+ title="Digital Marketing"
139
+ description="Data-driven campaigns that amplify your reach and maximize ROI across all channels."
140
+ ></service-card>
141
+ <service-card
142
+ icon="shield"
143
+ title="Cybersecurity"
144
+ description="Enterprise-grade security solutions to protect your digital assets and user data."
145
+ ></service-card>
146
+ </div>
147
+ </div>
148
+ </section>
149
+
150
+ <!-- Portfolio Section -->
151
+ <section id="portfolio" class="py-20 px-4 bg-gray-800/50">
152
+ <div class="container mx-auto max-w-6xl">
153
+ <div class="text-center mb-16">
154
+ <h2 class="text-4xl md:text-5xl font-bold mb-4">
155
+ <span class="text-transparent bg-clip-text bg-gradient-to-r from-primary-400 to-secondary-400">
156
+ Featured Work
157
+ </span>
158
+ </h2>
159
+ <p class="text-gray-400 text-lg max-w-2xl mx-auto">
160
+ A curated selection of our recent digital masterpieces
161
+ </p>
162
+ </div>
163
+
164
+ <div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8" id="portfolio-grid">
165
+ <!-- Portfolio items will be injected here -->
166
+ </div>
167
+ </div>
168
+ </section>
169
+
170
+ <!-- Testimonials Section -->
171
+ <section id="testimonials" class="py-20 px-4">
172
+ <div class="container mx-auto max-w-4xl">
173
+ <div class="text-center mb-16">
174
+ <h2 class="text-4xl md:text-5xl font-bold mb-4">
175
+ <span class="text-transparent bg-clip-text bg-gradient-to-r from-primary-400 to-secondary-400">
176
+ Client Testimonials
177
+ </span>
178
+ </h2>
179
+ <p class="text-gray-400 text-lg">
180
+ What our clients say about working with us
181
+ </p>
182
+ </div>
183
+
184
+ <div class="relative" id="testimonials-slider">
185
+ <!-- Testimonials will be injected here -->
186
+ </div>
187
+ </div>
188
+ </section>
189
+
190
+ <!-- Contact Section -->
191
+ <section id="contact" class="py-20 px-4 bg-gray-800/50">
192
+ <div class="container mx-auto max-w-4xl">
193
+ <div class="text-center mb-16">
194
+ <h2 class="text-4xl md:text-5xl font-bold mb-4">
195
+ <span class="text-transparent bg-clip-text bg-gradient-to-r from-primary-400 to-secondary-400">
196
+ Let's Create Magic
197
+ </span>
198
+ </h2>
199
+ <p class="text-gray-400 text-lg">
200
+ Ready to transform your vision into reality? Get in touch.
201
+ </p>
202
+ </div>
203
+
204
+ <form id="contact-form" class="space-y-6">
205
+ <div class="grid grid-cols-1 md:grid-cols-2 gap-6">
206
+ <div>
207
+ <input type="text" placeholder="Your Name" required
208
+ class="w-full px-6 py-4 bg-gray-800 border border-gray-700 rounded-lg focus:outline-none focus:border-primary-500 transition-colors duration-300">
209
+ </div>
210
+ <div>
211
+ <input type="email" placeholder="Your Email" required
212
+ class="w-full px-6 py-4 bg-gray-800 border border-gray-700 rounded-lg focus:outline-none focus:border-primary-500 transition-colors duration-300">
213
+ </div>
214
+ </div>
215
+ <div>
216
+ <input type="text" placeholder="Project Type"
217
+ class="w-full px-6 py-4 bg-gray-800 border border-gray-700 rounded-lg focus:outline-none focus:border-primary-500 transition-colors duration-300">
218
+ </div>
219
+ <div>
220
+ <textarea rows="6" placeholder="Tell us about your project" required
221
+ class="w-full px-6 py-4 bg-gray-800 border border-gray-700 rounded-lg focus:outline-none focus:border-primary-500 transition-colors duration-300 resize-none"></textarea>
222
+ </div>
223
+ <div class="text-center">
224
+ <button type="submit"
225
+ class="px-12 py-4 bg-primary-600 hover:bg-primary-500 rounded-full font-semibold transition-all duration-300 transform hover:scale-105 hover:-translate-y-1 shadow-lg hover:shadow-primary-500/25">
226
+ Send Message
227
+ </button>
228
+ </div>
229
+ </form>
230
+ </div>
231
+ </section>
232
+
233
+ <!-- Footer -->
234
+ <site-footer></site-footer>
235
+
236
+ <!-- Scripts -->
237
+ <script src="components/navbar.js"></script>
238
+ <script src="components/footer.js"></script>
239
+ <script src="components/service-card.js"></script>
240
+ <script src="components/portfolio-item.js"></script>
241
+ <script src="script.js"></script>
242
+ <script>feather.replace();</script>
243
+ <script src="https://huggingface.co/deepsite/deepsite-badge.js"></script>
244
+ </body>
245
+ </html>
script.js ADDED
@@ -0,0 +1,440 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // Theme Management
2
+ class ThemeManager {
3
+ constructor() {
4
+ this.themeToggle = document.getElementById('theme-toggle');
5
+ this.htmlElement = document.documentElement;
6
+ this.currentTheme = localStorage.getItem('theme') || 'dark';
7
+ this.init();
8
+ }
9
+
10
+ init() {
11
+ this.applyTheme(this.currentTheme);
12
+ this.themeToggle.addEventListener('click', () => this.toggleTheme());
13
+ }
14
+
15
+ applyTheme(theme) {
16
+ if (theme === 'light') {
17
+ this.htmlElement.classList.remove('dark-mode');
18
+ this.htmlElement.classList.add('light-mode');
19
+ document.body.classList.add('light-mode');
20
+ } else {
21
+ this.htmlElement.classList.remove('light-mode');
22
+ this.htmlElement.classList.add('dark-mode');
23
+ document.body.classList.remove('light-mode');
24
+ }
25
+ localStorage.setItem('theme', theme);
26
+ this.updateIcons(theme);
27
+ }
28
+
29
+ toggleTheme() {
30
+ const newTheme = this.currentTheme === 'dark' ? 'light' : 'dark';
31
+ this.currentTheme = newTheme;
32
+ this.applyTheme(newTheme);
33
+ this.themeToggle.classList.add('animate-pulse-custom');
34
+ setTimeout(() => this.themeToggle.classList.remove('animate-pulse-custom'), 500);
35
+ }
36
+
37
+ updateIcons(theme) {
38
+ const darkIcon = this.themeToggle.querySelector('.dark-icon');
39
+ const lightIcon = this.themeToggle.querySelector('.light-icon');
40
+
41
+ if (theme === 'light') {
42
+ darkIcon.classList.remove('hidden');
43
+ lightIcon.classList.add('hidden');
44
+ } else {
45
+ darkIcon.classList.add('hidden');
46
+ lightIcon.classList.remove('hidden');
47
+ }
48
+ }
49
+ }
50
+
51
+ // Loading Screen
52
+ class LoadingManager {
53
+ constructor() {
54
+ this.loadingScreen = document.getElementById('loading-screen');
55
+ this.init();
56
+ }
57
+
58
+ init() {
59
+ window.addEventListener('load', () => {
60
+ setTimeout(() => {
61
+ this.loadingScreen.style.opacity = '0';
62
+ setTimeout(() => {
63
+ this.loadingScreen.style.display = 'none';
64
+ }, 500);
65
+ }, 1000);
66
+ });
67
+ }
68
+ }
69
+
70
+ // Smooth Scrolling
71
+ class SmoothScroll {
72
+ constructor() {
73
+ this.links = document.querySelectorAll('a[href^="#"]');
74
+ this.init();
75
+ }
76
+
77
+ init() {
78
+ this.links.forEach(link => {
79
+ link.addEventListener('click', (e) => {
80
+ e.preventDefault();
81
+ const targetId = link.getAttribute('href');
82
+ const targetSection = document.querySelector(targetId);
83
+
84
+ if (targetSection) {
85
+ targetSection.scrollIntoView({
86
+ behavior: 'smooth',
87
+ block: 'start'
88
+ });
89
+ }
90
+ });
91
+ });
92
+ }
93
+ }
94
+
95
+ // Intersection Observer for Animations
96
+ class ScrollAnimations {
97
+ constructor() {
98
+ this.sections = document.querySelectorAll('section');
99
+ this.init();
100
+ }
101
+
102
+ init() {
103
+ const observer = new IntersectionObserver((entries) => {
104
+ entries.forEach(entry => {
105
+ if (entry.isIntersecting) {
106
+ entry.target.classList.add('section-visible');
107
+ entry.target.classList.remove('section-hidden');
108
+ }
109
+ });
110
+ }, {
111
+ threshold: 0.15,
112
+ rootMargin: '0px 0px -100px 0px'
113
+ });
114
+
115
+ this.sections.forEach(section => {
116
+ section.classList.add('section-hidden');
117
+ observer.observe(section);
118
+ });
119
+ }
120
+ }
121
+
122
+ // Contact Form Handler
123
+ class ContactForm {
124
+ constructor() {
125
+ this.form = document.getElementById('contact-form');
126
+ this.init();
127
+ }
128
+
129
+ init() {
130
+ if (this.form) {
131
+ this.form.addEventListener('submit', (e) => {
132
+ e.preventDefault();
133
+ this.handleSubmit();
134
+ });
135
+ }
136
+ }
137
+
138
+ async handleSubmit() {
139
+ const formData = new FormData(this.form);
140
+ const data = Object.fromEntries(formData);
141
+
142
+ // Show loading state
143
+ const submitButton = this.form.querySelector('button[type="submit"]');
144
+ const originalText = submitButton.innerHTML;
145
+ submitButton.innerHTML = '<i data-feather="loader" class="w-5 h-5 animate-spin inline-block"></i> Sending...';
146
+ feather.replace();
147
+
148
+ try {
149
+ // Simulate API call
150
+ await new Promise(resolve => setTimeout(resolve, 2000));
151
+
152
+ // Show success message
153
+ this.showSuccess();
154
+ this.form.reset();
155
+ } catch (error) {
156
+ console.error('Form submission error:', error);
157
+ } finally {
158
+ submitButton.innerHTML = originalText;
159
+ }
160
+ }
161
+
162
+ showSuccess() {
163
+ const successDiv = document.createElement('div');
164
+ successDiv.className = 'success-message show';
165
+ successDiv.innerHTML = '🎉 Message sent successfully! We\'ll get back to you soon.';
166
+ this.form.appendChild(successDiv);
167
+
168
+ setTimeout(() => {
169
+ successDiv.classList.remove('show');
170
+ setTimeout(() => successDiv.remove(), 300);
171
+ }, 5000);
172
+ }
173
+ }
174
+
175
+ // Portfolio Data Loader
176
+ class PortfolioLoader {
177
+ constructor() {
178
+ this.grid = document.getElementById('portfolio-grid');
179
+ this.init();
180
+ }
181
+
182
+ init() {
183
+ // Using static.photos for consistent placeholder images
184
+ const portfolioItems = [
185
+ {
186
+ title: "E-Commerce Revolution",
187
+ category: "Web Development",
188
+ image: "http://static.photos/technology/640x360/42",
189
+ description: "Built a scalable e-commerce platform with 300% conversion increase"
190
+ },
191
+ {
192
+ title: "Brand Identity Suite",
193
+ category: "Design",
194
+ image: "http://static.photos/workspace/640x360/133",
195
+ description: "Complete brand redesign for a Fortune 500 company"
196
+ },
197
+ {
198
+ title: "Mobile Banking App",
199
+ category: "Mobile Development",
200
+ image: "http://static.photos/abstract/640x360/99",
201
+ description: "Secure, intuitive banking app with biometric authentication"
202
+ },
203
+ {
204
+ title: "AI Dashboard",
205
+ category: "Data Visualization",
206
+ image: "http://static.photos/industry/640x360/77",
207
+ description: "Real-time analytics dashboard powered by machine learning"
208
+ },
209
+ {
210
+ title: "Social Campaign",
211
+ category: "Marketing",
212
+ image: "http://static.photos/people/640x360/21",
213
+ description: "Viral marketing campaign reaching 10M+ impressions"
214
+ },
215
+ {
216
+ title: "Secure Cloud Migration",
217
+ category: "Cybersecurity",
218
+ image: "http://static.photos/network/640x360/55",
219
+ description: "Zero-downtime migration with enhanced security protocols"
220
+ }
221
+ ];
222
+
223
+ this.renderPortfolio(portfolioItems);
224
+ }
225
+
226
+ renderPortfolio(items) {
227
+ items.forEach((item, index) => {
228
+ const portfolioElement = document.createElement('portfolio-item');
229
+ portfolioElement.setAttribute('title', item.title);
230
+ portfolioElement.setAttribute('category', item.category);
231
+ portfolioElement.setAttribute('image', item.image);
232
+ portfolioElement.setAttribute('description', item.description);
233
+
234
+ // Stagger animation
235
+ setTimeout(() => {
236
+ this.grid.appendChild(portfolioElement);
237
+ }, index * 100);
238
+ });
239
+ }
240
+ }
241
+
242
+ // Testimonials Loader
243
+ class TestimonialsLoader {
244
+ constructor() {
245
+ this.container = document.getElementById('testimonials-slider');
246
+ this.currentIndex = 0;
247
+ this.testimonials = [];
248
+ this.init();
249
+ }
250
+
251
+ async init() {
252
+ try {
253
+ // Fetch real testimonials from JSONPlaceholder
254
+ const response = await fetch('https://jsonplaceholder.typicode.com/comments?_limit=5');
255
+ const data = await response.json();
256
+
257
+ this.testimonials = data.slice(0, 5).map(comment => ({
258
+ name: comment.name.split(' ').map(word =>
259
+ word.charAt(0).toUpperCase() + word.slice(1)
260
+ ).join(' '),
261
+ text: comment.body.charAt(0).toUpperCase() + comment.body.slice(1),
262
+ role: ['CEO', 'Founder', 'CTO', 'Director', 'Product Manager'][Math.floor(Math.random() * 5)],
263
+ company: ['TechCorp', 'StartupX', 'Digital Dreams', 'FutureLabs', 'Innovate Inc'][Math.floor(Math.random() * 5)]
264
+ }));
265
+
266
+ this.renderTestimonials();
267
+ this.startAutoSlide();
268
+ } catch (error) {
269
+ console.error('Failed to load testimonials:', error);
270
+ this.renderFallbackTestimonials();
271
+ }
272
+ }
273
+
274
+ renderTestimonials() {
275
+ const testimonialHTML = this.testimonials.map((t, index) => `
276
+ <div class="testimonial-slide ${index === 0 ? 'active' : ''} bg-gray-800 p-8 rounded-2xl shadow-xl">
277
+ <div class="flex items-center mb-6">
278
+ <div class="w-16 h-16 bg-gradient-to-br from-primary-500 to-secondary-500 rounded-full flex items-center justify-center text-white font-bold text-xl mr-4">
279
+ ${t.name.split(' ').map(n => n[0]).join('')}
280
+ </div>
281
+ <div>
282
+ <h4 class="font-bold text-lg">${t.name}</h4>
283
+ <p class="text-primary-400 text-sm">${t.role} at ${t.company}</p>
284
+ </div>
285
+ </div>
286
+ <blockquote class="text-gray-300 text-lg italic">
287
+ <i data-feather="quote" class="w-8 h-8 text-primary-500 mb-4"></i>
288
+ "${t.text}"
289
+ </blockquote>
290
+ <div class="flex mt-6">
291
+ ${Array(5).fill().map(() => '<i data-feather="star" class="w-5 h-5 text-yellow-400 fill-current"></i>').join('')}
292
+ </div>
293
+ </div>
294
+ `).join('');
295
+
296
+ this.container.innerHTML = `
297
+ <div class="relative">
298
+ ${testimonialHTML}
299
+ <div class="flex justify-center mt-8 space-x-4">
300
+ ${this.testimonials.map((_, index) => `
301
+ <button class="testimonial-dot w-4 h-4 rounded-full transition-all duration-300 ${index === 0 ? 'bg-primary-500' : 'bg-gray-600 hover:bg-gray-500'}" data-index="${index}"></button>
302
+ `).join('')}
303
+ </div>
304
+ </div>
305
+ `;
306
+
307
+ this.attachDotListeners();
308
+ feather.replace();
309
+ }
310
+
311
+ renderFallbackTestimonials() {
312
+ const fallback = [
313
+ {
314
+ name: "Sarah Johnson",
315
+ role: "CEO",
316
+ company: "TechVenture",
317
+ text: "NeonNexus transformed our digital presence completely. The results exceeded all expectations!"
318
+ }
319
+ ];
320
+
321
+ this.testimonials = fallback;
322
+ this.renderTestimonials();
323
+ }
324
+
325
+ attachDotListeners() {
326
+ const dots = this.container.querySelectorAll('.testimonial-dot');
327
+ dots.forEach(dot => {
328
+ dot.addEventListener('click', (e) => {
329
+ this.showTestimonial(parseInt(e.target.dataset.index));
330
+ });
331
+ });
332
+ }
333
+
334
+ showTestimonial(index) {
335
+ const slides = this.container.querySelectorAll('.testimonial-slide');
336
+ const dots = this.container.querySelectorAll('.testimonial-dot');
337
+
338
+ slides.forEach(slide => slide.classList.remove('active'));
339
+ dots.forEach(dot => {
340
+ dot.classList.remove('bg-primary-500');
341
+ dot.classList.add('bg-gray-600');
342
+ });
343
+
344
+ slides[index].classList.add('active');
345
+ dots[index].classList.remove('bg-gray-600');
346
+ dots[index].classList.add('bg-primary-500');
347
+
348
+ this.currentIndex = index;
349
+ }
350
+
351
+ startAutoSlide() {
352
+ setInterval(() => {
353
+ this.currentIndex = (this.currentIndex + 1) % this.testimonials.length;
354
+ this.showTestimonial(this.currentIndex);
355
+ }, 5000);
356
+ }
357
+ }
358
+
359
+ // Mobile Menu Handler
360
+ class MobileMenuHandler {
361
+ constructor() {
362
+ this.isOpen = false;
363
+ this.init();
364
+ }
365
+
366
+ init() {
367
+ // This will be called from the navbar component
368
+ window.addEventListener('mobile-menu-toggle', (e) => {
369
+ this.isOpen = e.detail.isOpen;
370
+ document.body.style.overflow = this.isOpen ? 'hidden' : '';
371
+ });
372
+ }
373
+ }
374
+
375
+ // Custom Cursor
376
+ class CustomCursor {
377
+ constructor() {
378
+ this.cursor = document.createElement('div');
379
+ this.cursor.className = 'custom-cursor';
380
+ this.init();
381
+ }
382
+
383
+ init() {
384
+ document.body.appendChild(this.cursor);
385
+
386
+ document.addEventListener('mousemove', (e) => {
387
+ this.cursor.style.left = e.clientX + 'px';
388
+ this.cursor.style.top = e.clientY + 'px';
389
+ });
390
+
391
+ document.addEventListener('mousedown', () => {
392
+ this.cursor.style.transform = 'scale(0.8)';
393
+ });
394
+
395
+ document.addEventListener('mouseup', () => {
396
+ this.cursor.style.transform = 'scale(1)';
397
+ });
398
+
399
+ // Hide on touch devices
400
+ if ('ontouchstart' in window) {
401
+ this.cursor.style.display = 'none';
402
+ }
403
+ }
404
+ }
405
+
406
+ // Initialize everything when DOM is loaded
407
+ document.addEventListener('DOMContentLoaded', () => {
408
+ // Core managers
409
+ new ThemeManager();
410
+ new LoadingManager();
411
+ new SmoothScroll();
412
+ new ScrollAnimations();
413
+ new ContactForm();
414
+ new MobileMenuHandler();
415
+
416
+ // Data loaders
417
+ new PortfolioLoader();
418
+ new TestimonialsLoader();
419
+
420
+ // Optional features
421
+ new CustomCursor();
422
+
423
+ // Add some interactive elements
424
+ initializeInteractiveEffects();
425
+ });
426
+
427
+ function initializeInteractiveEffects() {
428
+ // Add parallax effect to hero elements
429
+ window.addEventListener('scroll', () => {
430
+ const scrolled = window.pageYOffset;
431
+ const parallaxElements = document.querySelectorAll('.animate-float');
432
+
433
+ parallaxElements.forEach((element, index) => {
434
+ const speed = 0.5 + (index * 0.1);
435
+ element.style.transform = `translateY(${scrolled * speed}px) rotate(${scrolled * 0.05}deg)`;
436
+ });
437
+ });
438
+
439
+ // Add click ripple effect to buttons
440
+ document.querySelectorAll('button, .btn-primary').forEach
style.css CHANGED
@@ -1,28 +1,262 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  body {
2
- padding: 2rem;
3
- font-family: -apple-system, BlinkMacSystemFont, "Arial", sans-serif;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4
  }
5
 
6
- h1 {
7
- font-size: 16px;
8
- margin-top: 0;
9
  }
10
 
11
- p {
12
- color: rgb(107, 114, 128);
13
- font-size: 15px;
14
- margin-bottom: 10px;
15
- margin-top: 5px;
16
  }
17
 
18
- .card {
19
- max-width: 620px;
20
- margin: 0 auto;
21
- padding: 16px;
22
- border: 1px solid lightgray;
23
- border-radius: 16px;
24
  }
25
 
26
- .card p:last-child {
27
- margin-bottom: 0;
 
28
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* Custom CSS Variables for Theme Management */
2
+ :root {
3
+ --primary-500: #8b5cf6;
4
+ --secondary-500: #14b8a6;
5
+ --bg-primary: #111827;
6
+ --bg-secondary: #1f2937;
7
+ --text-primary: #ffffff;
8
+ --text-secondary: #9ca3af;
9
+ }
10
+
11
+ :root.light-mode {
12
+ --bg-primary: #f9fafb;
13
+ --bg-secondary: #ffffff;
14
+ --text-primary: #111827;
15
+ --text-secondary: #6b7280;
16
+ }
17
+
18
+ /* Base Styles */
19
+ * {
20
+ margin: 0;
21
+ padding: 0;
22
+ box-sizing: border-box;
23
+ }
24
+
25
  body {
26
+ font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, sans-serif;
27
+ background-color: var(--bg-primary);
28
+ color: var(--text-primary);
29
+ transition: background-color 0.3s ease, color 0.3s ease;
30
+ overflow-x: hidden;
31
+ }
32
+
33
+ /* Custom Scrollbar */
34
+ ::-webkit-scrollbar {
35
+ width: 10px;
36
+ }
37
+
38
+ ::-webkit-scrollbar-track {
39
+ background: var(--bg-secondary);
40
+ }
41
+
42
+ ::-webkit-scrollbar-thumb {
43
+ background: var(--primary-500);
44
+ border-radius: 5px;
45
+ }
46
+
47
+ ::-webkit-scrollbar-thumb:hover {
48
+ background: var(--secondary-500);
49
+ }
50
+
51
+ /* Keyframe Animations */
52
+ @keyframes float {
53
+ 0%, 100% {
54
+ transform: translateY(0) rotate(0deg);
55
+ }
56
+ 50% {
57
+ transform: translateY(-20px) rotate(180deg);
58
+ }
59
+ }
60
+
61
+ @keyframes glow {
62
+ 0% {
63
+ filter: drop-shadow(0 0 10px var(--primary-500));
64
+ }
65
+ 100% {
66
+ filter: drop-shadow(0 0 20px var(--secondary-500));
67
+ }
68
+ }
69
+
70
+ @keyframes slideUp {
71
+ from {
72
+ opacity: 0;
73
+ transform: translateY(30px);
74
+ }
75
+ to {
76
+ opacity: 1;
77
+ transform: translateY(0);
78
+ }
79
+ }
80
+
81
+ @keyframes slideDown {
82
+ from {
83
+ opacity: 0;
84
+ transform: translateY(-30px);
85
+ }
86
+ to {
87
+ opacity: 1;
88
+ transform: translateY(0);
89
+ }
90
+ }
91
+
92
+ @keyframes fadeIn {
93
+ from {
94
+ opacity: 0;
95
+ }
96
+ to {
97
+ opacity: 1;
98
+ }
99
+ }
100
+
101
+ @keyframes pulse {
102
+ 0%, 100% {
103
+ transform: scale(1);
104
+ }
105
+ 50% {
106
+ transform: scale(1.05);
107
+ }
108
+ }
109
+
110
+ /* Animation Classes */
111
+ .animate-float {
112
+ animation: float 6s ease-in-out infinite;
113
+ }
114
+
115
+ .animate-glow {
116
+ animation: glow 2s ease-in-out infinite alternate;
117
+ }
118
+
119
+ .animate-pulse-custom {
120
+ animation: pulse 0.5s ease-in-out;
121
+ }
122
+
123
+ /* Glassmorphism Effect */
124
+ .glass {
125
+ background: rgba(31, 41, 55, 0.4);
126
+ backdrop-filter: blur(10px);
127
+ border: 1px solid rgba(139, 92, 246, 0.2);
128
  }
129
 
130
+ .light-mode .glass {
131
+ background: rgba(255, 255, 255, 0.6);
132
+ border: 1px solid rgba(139, 92, 246, 0.1);
133
  }
134
 
135
+ /* Gradient Overlay */
136
+ .gradient-overlay {
137
+ position: absolute;
138
+ inset: 0;
139
+ background: linear-gradient(135deg, rgba(139, 92, 246, 0.1) 0%, rgba(20, 184, 166, 0.1) 100%);
140
  }
141
 
142
+ /* Hover Effects */
143
+ .hover-lift {
144
+ transition: transform 0.3s ease, box-shadow 0.3s ease;
 
 
 
145
  }
146
 
147
+ .hover-lift:hover {
148
+ transform: translateY(-10px) rotateX(5deg);
149
+ box-shadow: 0 20px 40px rgba(139, 92, 246, 0.2);
150
  }
151
+
152
+ /* Custom Cursor */
153
+ .custom-cursor {
154
+ width: 20px;
155
+ height: 20px;
156
+ border: 2px solid var(--primary-500);
157
+ border-radius: 50%;
158
+ position: fixed;
159
+ pointer-events: none;
160
+ z-index: 9999;
161
+ transition: transform 0.1s ease;
162
+ mix-blend-mode: difference;
163
+ }
164
+
165
+ /* Section Animations */
166
+ .section-hidden {
167
+ opacity: 0;
168
+ transform: translateY(50px);
169
+ transition: opacity 0.8s ease, transform 0.8s ease;
170
+ }
171
+
172
+ .section-visible {
173
+ opacity: 1;
174
+ transform: translateY(0);
175
+ }
176
+
177
+ /* Form Styles */
178
+ input, textarea {
179
+ transition: border-color 0.3s ease, box-shadow 0.3s ease;
180
+ }
181
+
182
+ input:focus, textarea:focus {
183
+ box-shadow: 0 0 0 3px rgba(139, 92, 246, 0.1);
184
+ }
185
+
186
+ /* Button Styles */
187
+ .btn-primary {
188
+ background: linear-gradient(135deg, var(--primary-500), var(--secondary-500));
189
+ border: none;
190
+ color: white;
191
+ padding: 12px 32px;
192
+ border-radius: 50px;
193
+ font-weight: 600;
194
+ cursor: pointer;
195
+ transition: transform 0.3s ease, box-shadow 0.3s ease;
196
+ }
197
+
198
+ .btn-primary:hover {
199
+ transform: translateY(-2px);
200
+ box-shadow: 0 10px 25px rgba(139, 92, 246, 0.3);
201
+ }
202
+
203
+ /* Responsive Typography */
204
+ @media (max-width: 768px) {
205
+ h1 {
206
+ font-size: 2.5rem !important;
207
+ }
208
+ h2 {
209
+ font-size: 2rem !important;
210
+ }
211
+ }
212
+
213
+ /* Light Mode Specific Styles */
214
+ .light-mode {
215
+ background-color: #f9fafb;
216
+ color: #111827;
217
+ }
218
+
219
+ .light-mode .bg-gray-800 {
220
+ background-color: #ffffff !important;
221
+ }
222
+
223
+ .light-mode .bg-gray-900 {
224
+ background-color: #f3f4f6 !important;
225
+ }
226
+
227
+ .light-mode .text-gray-400 {
228
+ color: #4b5563 !important;
229
+ }
230
+
231
+ .light-mode .border-gray-700 {
232
+ border-color: #e5e7eb !important;
233
+ }
234
+
235
+ /* Contact Form Success Message */
236
+ .success-message {
237
+ background: linear-gradient(135deg, #10b981, #14b8a6);
238
+ color: white;
239
+ padding: 12px 24px;
240
+ border-radius: 8px;
241
+ margin-top: 16px;
242
+ opacity: 0;
243
+ transform: translateY(-10px);
244
+ transition: opacity 0.3s ease, transform 0.3s ease;
245
+ }
246
+
247
+ .success-message.show {
248
+ opacity: 1;
249
+ transform: translateY(0);
250
+ }
251
+
252
+ /* Portfolio Grid Animation */
253
+ .portfolio-item-enter {
254
+ opacity: 0;
255
+ transform: scale(0.9) rotateY(10deg);
256
+ }
257
+
258
+ .portfolio-item-enter-active {
259
+ opacity: 1;
260
+ transform: scale(1) rotateY(0);
261
+ transition: opacity 0.6s ease, transform 0.6s ease;
262
+ }