Logistics commited on
Commit
041c6bd
·
verified ·
1 Parent(s): 9361cfd

<!DOCTYPE html>

Browse files

<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, viewport-fit=cover">
<title>AI Mirror</title>

<!-- Telegram Web App SDK -->
<script src="https://telegram.org/js/telegram-web-app.js"></script>

<!-- iOS PWA Meta Tags -->
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
<meta name="theme-color" content="#000000">
<link rel="apple-touch-icon" href="icon.png">

<!-- Tailwind CSS -->
<script src="https://cdn.tailwindcss.com"></script>
<script>
tailwind.config = {
darkMode: 'class',
theme: {
extend: {
colors: {
tg: {
bg: 'var(--tg-theme-bg-color, #ffffff)',
text: 'var(--tg-theme-text-color, #000000)',
hint: 'var(--tg-theme-hint-color, #999999)',
link: 'var(--tg-theme-link-color, #2481cc)',
button: 'var(--tg-theme-button-color, #2481cc)',
'button-text': 'var(--tg-theme-button-text-color, #ffffff)',
secondary: 'var(--tg-theme-secondary-bg-color, #efeff4)',
header: 'var(--tg-theme-header-bg-color, #ffffff)',
section: 'var(--tg-theme-section-bg-color, #ffffff)',
}
},
fontFamily: {
sans: ['-apple-system', 'BlinkMacSystemFont', 'Segoe UI', 'Roboto', 'Helvetica', 'Arial', 'sans-serif'],
}
}
}
}
</script>
<link rel="stylesheet" href="css/style.css">
<!-- Font Awesome for Icons -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
</head>
<body class="text-tg-text overflow-hidden select-none bg-tg-bg">

<!-- Main App Container -->
<div id="app" class="h-[100dvh] w-full relative overflow-hidden flex flex-col bg-tg-bg">
<!-- Views will be injected here -->
<main id="main-view" class="w-full flex-1 overflow-y-auto overflow-x-hidden relative scroll-smooth bg-tg-bg"></main>

<!-- Bottom Navigation (Fixed) -->
<nav id="bottom-nav" class="fixed bottom-0 left-0 right-0 z-40 flex justify-around items-center px-4 pb-safe-bottom pt-2 min-h-[60px] bg-tg-header border-t border-tg-hint/20 transition-transform duration-300">
<button data-nav="home" class="nav-btn active"><i class="fas fa-comment-alt text-2xl mb-1"></i><span class="text-[10px]">Чаты</span></button>
<button data-nav="architect" class="nav-btn"><i class="fas fa-plus-circle text-4xl text-blue-500 -mt-4"></i></button>
<button data-nav="settings" class="nav-btn"><i class="fas fa-cog text-2xl mb-1"></i><span class="text-[10px]">Настройки</span></button>
</nav>
</div>

<!-- Modals / Overlays -->
<div id="modal-container" class="fixed inset-0 z-50 pointer-events-none opacity-0 transition-opacity duration-300 flex items-end sm:items-center justify-center">
<div class="absolute inset-0 bg-black/50 backdrop-blur-sm" id="modal-backdrop"></div>
<div id="modal-content" class="bg-white/90 dark:bg-slate-900/90 w-full max-w-md p-6 rounded-t-2xl sm:rounded-2xl shadow-2xl transform translate-y-full sm:translate-y-0 transition-transform duration-300">
<!-- Modal Content -->
</div>
</div>

<!-- Loading Indicator -->
<div id="global-loader" class="fixed inset-0 z-[60] bg-black/50 backdrop-blur-md flex items-center justify-center hidden">
<div class="animate-spin rounded-full h-12 w-12 border-t-2 border-b-2 border-blue-500"></div>
</div>

<!-- Lock Screen Overlay -->
<div id="lock-screen" class="fixed inset-0 z-[70] bg-tg-bg hidden flex-col items-center justify-center transition-opacity duration-300">
<!-- Injected by lock.js -->
</div>

<script type="module" src="js/app.js"></script>
</body>
</html>

Files changed (7) hide show
  1. README.md +8 -5
  2. components/footer.js +161 -0
  3. components/lockscreen.js +245 -0
  4. components/navbar.js +179 -0
  5. index.html +96 -19
  6. script.js +337 -0
  7. style.css +205 -18
README.md CHANGED
@@ -1,10 +1,13 @@
1
  ---
2
- title: Ai Mirror Nebula
3
- emoji: 🌍
4
- colorFrom: indigo
5
- colorTo: green
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: AI Mirror Nebula 👁️
3
+ colorFrom: yellow
4
+ colorTo: blue
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).
components/footer.js ADDED
@@ -0,0 +1,161 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ class CustomFooter extends HTMLElement {
2
+ connectedCallback() {
3
+ this.attachShadow({ mode: 'open' });
4
+ this.shadowRoot.innerHTML = `
5
+ <style>
6
+ :host {
7
+ display: block;
8
+ margin-top: auto;
9
+ }
10
+
11
+ footer {
12
+ background: var(--surface);
13
+ border-top: 1px solid rgba(255, 255, 255, 0.1);
14
+ }
15
+
16
+ .footer-link {
17
+ transition: all 0.3s ease;
18
+ color: var(--subtle);
19
+ }
20
+
21
+ .footer-link:hover {
22
+ color: var(--accent);
23
+ transform: translateY(-2px);
24
+ }
25
+
26
+ .social-icon {
27
+ width: 40px;
28
+ height: 40px;
29
+ display: flex;
30
+ align-items: center;
31
+ justify-content: center;
32
+ border-radius: 50%;
33
+ background: rgba(255, 255, 255, 0.05);
34
+ transition: all 0.3s ease;
35
+ }
36
+
37
+ .social-icon:hover {
38
+ background: var(--primary);
39
+ transform: translateY(-5px) rotate(10deg);
40
+ }
41
+
42
+ .copyright {
43
+ font-size: 0.875rem;
44
+ color: var(--subtle);
45
+ }
46
+
47
+ .theme-toggle {
48
+ background: var(--surface);
49
+ border: 1px solid rgba(255, 255, 255, 0.1);
50
+ border-radius: 50%;
51
+ width: 44px;
52
+ height: 44px;
53
+ display: flex;
54
+ align-items: center;
55
+ justify-content: center;
56
+ cursor: pointer;
57
+ transition: all 0.3s ease;
58
+ }
59
+
60
+ .theme-toggle:hover {
61
+ transform: rotate(180deg);
62
+ background: linear-gradient(135deg, var(--primary), var(--secondary));
63
+ }
64
+ </style>
65
+ <footer class="py-8 px-6">
66
+ <div class="container mx-auto">
67
+ <div class="grid grid-cols-1 md:grid-cols-3 gap-8 mb-8">
68
+ <div>
69
+ <h3 class="text-lg font-bold mb-4 flex items-center gap-2">
70
+ <i data-feather="zap" class="text-accent"></i>
71
+ <span>AI Mirror Nebula</span>
72
+ </h3>
73
+ <p class="text-subtle text-sm">A neural interface exploring the boundaries of artificial intelligence.</p>
74
+ </div>
75
+
76
+ <div>
77
+ <h3 class="text-lg font-bold mb-4">Quick Links</h3>
78
+ <div class="flex flex-col gap-2">
79
+ <a href="/home" class="footer-link flex items-center gap-2">
80
+ <i data-feather="chevron-right" class="w-4 h-4"></i>
81
+ <span>Home</span>
82
+ </a>
83
+ <a href="/features" class="footer-link flex items-center gap-2">
84
+ <i data-feather="chevron-right" class="w-4 h-4"></i>
85
+ <span>Features</span>
86
+ </a>
87
+ <a href="/api" class="footer-link flex items-center gap-2">
88
+ <i data-feather="chevron-right" class="w-4 h-4"></i>
89
+ <span>API</span>
90
+ </a>
91
+ <a href="/docs" class="footer-link flex items-center gap-2">
92
+ <i data-feather="chevron-right" class="w-4 h-4"></i>
93
+ <span>Documentation</span>
94
+ </a>
95
+ </div>
96
+ </div>
97
+
98
+ <div>
99
+ <h3 class="text-lg font-bold mb-4">Connect</h3>
100
+ <div class="flex gap-4">
101
+ <a href="https://twitter.com" class="social-icon">
102
+ <i data-feather="twitter"></i>
103
+ </a>
104
+ <a href="https://github.com" class="social-icon">
105
+ <i data-feather="github"></i>
106
+ </a>
107
+ <a href="https://discord.com" class="social-icon">
108
+ <i data-feather="discord"></i>
109
+ </a>
110
+ <a href="https://telegram.org" class="social-icon">
111
+ <i data-feather="send"></i>
112
+ </a>
113
+ </div>
114
+ </div>
115
+ </div>
116
+
117
+ <div class="flex flex-col md:flex-row items-center justify-between gap-4 pt-8 border-t border-white/10">
118
+ <p class="copyright">© ${new Date().getFullYear()} AI Mirror Nebula. All neural patterns reserved.</p>
119
+ <div class="flex items-center gap-4">
120
+ <button onclick="toggleTheme()" class="theme-toggle">
121
+ <i data-feather="moon" id="theme-icon"></i>
122
+ </button>
123
+ </div>
124
+ </footer>
125
+ `;
126
+
127
+ this.initThemeToggle();
128
+ }
129
+
130
+ initThemeToggle() {
131
+ const themeToggle = this.shadowRoot.querySelector('.theme-toggle');
132
+ const themeIcon = this.shadowRoot.getElementById('theme-icon');
133
+
134
+ themeToggle.addEventListener('click', () => {
135
+ const isDark = document.documentElement.classList.contains('dark');
136
+
137
+ if (isDark) {
138
+ document.documentElement.classList.remove('dark');
139
+ localStorage.setItem('theme', 'light');
140
+ themeIcon.setAttribute('data-feather', 'sun');
141
+ } else {
142
+ document.documentElement.classList.add('dark');
143
+ localStorage.setItem('theme', 'dark');
144
+ themeIcon.setAttribute('data-feather', 'moon');
145
+ }
146
+
147
+ feather.replace();
148
+ });
149
+ }
150
+ }
151
+
152
+ customElements.define('custom-footer', CustomFooter);
153
+
154
+ // Global theme toggle function
155
+ function toggleTheme() {
156
+ const isDark = document.documentElement.classList.contains('dark');
157
+ const themeToggle = document.querySelector('custom-footer')?.shadowRoot?.querySelector('.theme-toggle');
158
+ if (themeToggle) {
159
+ themeToggle.click();
160
+ }
161
+ }
components/lockscreen.js ADDED
@@ -0,0 +1,245 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ class CustomLockscreen extends HTMLElement {
2
+ connectedCallback() {
3
+ this.attachShadow({ mode: 'open' });
4
+ this.shadowRoot.innerHTML = `
5
+ <style>
6
+ :host {
7
+ display: block;
8
+ position: fixed;
9
+ inset: 0;
10
+ z-index: 70;
11
+ background: var(--background);
12
+ display: none;
13
+ flex-direction: column;
14
+ align-items: center;
15
+ justify-content: center;
16
+ transition: opacity 0.3s ease;
17
+ }
18
+
19
+ .lockscreen {
20
+ background: linear-gradient(135deg, rgba(79, 70, 229, 0.1), rgba(236, 72, 153, 0.1));
21
+ backdrop-filter: blur(20px);
22
+ border: 1px solid rgba(255, 255, 255, 0.1);
23
+ border-radius: 2rem;
24
+ padding: 3rem 2rem;
25
+ text-align: center;
26
+ max-width: 90%;
27
+ width: 400px;
28
+ }
29
+
30
+ .unlock-btn {
31
+ background: linear-gradient(135deg, var(--primary), var(--secondary));
32
+ color: white;
33
+ border: none;
34
+ border-radius: 1rem;
35
+ padding: 1rem 2rem;
36
+ font-weight: 600;
37
+ transition: all 0.3s ease;
38
+ position: relative;
39
+ overflow: hidden;
40
+ }
41
+
42
+ .unlock-btn::before {
43
+ content: '';
44
+ position: absolute;
45
+ top: 0;
46
+ left: 0;
47
+ right: 0;
48
+ bottom: 0;
49
+ background: linear-gradient(90deg, transparent, rgba(255,255,255,0.3), transparent);
50
+ transform: translateX(-100%);
51
+ transition: transform 0.5s ease;
52
+ }
53
+
54
+ .unlock-btn:hover::before {
55
+ transform: translateX(100%);
56
+ }
57
+
58
+ .pattern-grid {
59
+ display: grid;
60
+ grid-template-columns: repeat(3, 1fr);
61
+ gap: 1rem;
62
+ margin: 2rem 0;
63
+ }
64
+
65
+ .pattern-dot {
66
+ width: 20px;
67
+ height: 20px;
68
+ background: var(--subtle);
69
+ border-radius: 50%;
70
+ transition: all 0.3s ease;
71
+ cursor: pointer;
72
+ }
73
+
74
+ .pattern-dot.selected {
75
+ background: var(--accent);
76
+ transform: scale(1.2);
77
+ }
78
+
79
+ .pattern-line {
80
+ position: absolute;
81
+ background: var(--accent);
82
+ height: 4px;
83
+ border-radius: 2px;
84
+ }
85
+
86
+ .time-display {
87
+ font-size: 4rem;
88
+ font-weight: 300;
89
+ letter-spacing: -2px;
90
+ }
91
+
92
+ .date-display {
93
+ font-size: 1.2rem;
94
+ color: var(--subtle);
95
+ margin-bottom: 2rem;
96
+ }
97
+
98
+ .hint-text {
99
+ color: var(--subtle);
100
+ font-size: 0.9rem;
101
+ margin-top: 1rem;
102
+ }
103
+
104
+ .lock-icon {
105
+ width: 60px;
106
+ height: 60px;
107
+ background: linear-gradient(135deg, var(--primary), var(--secondary));
108
+ border-radius: 50%;
109
+ display: flex;
110
+ align-items: center;
111
+ justify-content: center;
112
+ margin-bottom: 2rem;
113
+ }
114
+ </style>
115
+ <div class="lockscreen p-8">
116
+ <div class="lock-icon mb-6">
117
+ <i data-feather="lock" class="w-8 h-8 text-white"></i>
118
+ </div>
119
+
120
+ <div class="time-display mb-2">00:00</div>
121
+ <div class="date-display mb-8">Loading...</div>
122
+
123
+ <div class="pattern-grid relative">
124
+ ${Array.from({ length: 9 }, (_, i) => `
125
+ <div class="pattern-dot" data-dot="${i}"></div>
126
+ `).join('')}
127
+ </div>
128
+
129
+ <p class="hint-text mt-6">Draw your pattern to unlock</p>
130
+ </div>
131
+ `;
132
+
133
+ this.initTime();
134
+ this.initPatternLock();
135
+ }
136
+
137
+ initTime() {
138
+ const timeElement = this.shadowRoot.querySelector('.time-display');
139
+ const dateElement = this.shadowRoot.querySelector('.date-display');
140
+
141
+ const updateTime = () => {
142
+ const now = new Date();
143
+ const timeString = now.toLocaleTimeString('en-US', {
144
+ hour12: false,
145
+ hour: '2-digit',
146
+ minute: '2-digit'
147
+ });
148
+ const dateString = now.toLocaleDateString('en-US', {
149
+ weekday: 'long',
150
+ year: 'numeric',
151
+ month: 'long',
152
+ day: 'numeric'
153
+ });
154
+
155
+ timeElement.textContent = timeString;
156
+ dateElement.textContent = dateString;
157
+ };
158
+
159
+ updateTime();
160
+ setInterval(updateTime, 1000);
161
+ }
162
+
163
+ initPatternLock() {
164
+ const dots = this.shadowRoot.querySelectorAll('.pattern-dot');
165
+ let selectedDots = [];
166
+ const correctPattern = [0, 3, 6, 7, 8];
167
+
168
+ dots.forEach((dot, index) => {
169
+ dot.addEventListener('click', () => {
170
+ if (!selectedDots.includes(index)) {
171
+ selectedDots.push(index);
172
+ dot.classList.add('selected');
173
+
174
+ // Draw lines between selected dots
175
+ if (selectedDots.length > 1) {
176
+ const prevIndex = selectedDots[selectedDots.length - 2];
177
+ const prevDot = dots[prevIndex];
178
+
179
+ const line = document.createElement('div');
180
+ line.className = 'pattern-line';
181
+
182
+ // Calculate line position and dimensions
183
+ const rect1 = prevDot.getBoundingClientRect();
184
+ const rect2 = dot.getBoundingClientRect();
185
+
186
+ const x1 = rect1.left + rect1.width / 2;
187
+ const y1 = rect1.top + rect1.height / 2;
188
+ const x2 = rect2.left + rect2.width / 2;
189
+ const y2 = rect2.top + rect2.height / 2;
190
+
191
+ const length = Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2);
192
+ const angle = Math.atan2(y2 - y1, x2 - x1);
193
+
194
+ line.style.width = `${length}px`;
195
+ line.style.transform = `rotate(${angle}rad)';
196
+ line.style.left = `${x1}px`;
197
+ line.style.top = `${y1}px';
198
+
199
+ this.shadowRoot.querySelector('.pattern-grid').appendChild(line);
200
+ }
201
+
202
+ // Check if pattern is complete
203
+ if (selectedDots.length === correctPattern.length) {
204
+ if (JSON.stringify(selectedDots) === JSON.stringify(correctPattern)) {
205
+ this.toggleLock();
206
+ } else {
207
+ // Wrong pattern - reset
208
+ setTimeout(() => {
209
+ this.resetPattern();
210
+ }, 500);
211
+ }
212
+ }
213
+ });
214
+ });
215
+
216
+ // Reset pattern on mouse up (for mobile)
217
+ document.addEventListener('mouseup', () => this.resetPattern());
218
+ document.addEventListener('touchend', () => this.resetPattern());
219
+ }
220
+
221
+ resetPattern() {
222
+ const dots = this.shadowRoot.querySelectorAll('.pattern-dot');
223
+ const lines = this.shadowRoot.querySelectorAll('.pattern-line');
224
+
225
+ lines.forEach(line => line.remove());
226
+ dots.forEach(dot => dot.classList.remove('selected'));
227
+ selectedDots = [];
228
+ }
229
+
230
+ toggleLock() {
231
+ if (this.style.display === 'none') {
232
+ this.style.display = 'flex';
233
+ document.body.style.overflow = 'hidden';
234
+ } else {
235
+ this.style.display = 'none';
236
+ document.body.style.overflow = '';
237
+
238
+ // Remove all pattern lines
239
+ this.shadowRoot.querySelectorAll('.pattern-line').forEach(line => line.remove());
240
+ selectedDots = [];
241
+ }
242
+ }
243
+ }
244
+
245
+ customElements.define('custom-lockscreen', CustomLockscreen);
components/navbar.js ADDED
@@ -0,0 +1,179 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ class CustomNavbar extends HTMLElement {
2
+ connectedCallback() {
3
+ this.attachShadow({ mode: 'open' });
4
+ this.shadowRoot.innerHTML = `
5
+ <style>
6
+ :host {
7
+ display: block;
8
+ position: fixed;
9
+ top: 0;
10
+ left: 0;
11
+ right: 0;
12
+ z-index: 100;
13
+ }
14
+
15
+ nav {
16
+ background: rgba(30, 41, 59, 0.8);
17
+ backdrop-filter: blur(10px);
18
+ border-bottom: 1px solid rgba(255, 255, 255, 0.1);
19
+ }
20
+
21
+ .logo {
22
+ background: linear-gradient(135deg, var(--primary), var(--secondary));
23
+ -webkit-background-clip: text;
24
+ background-clip: text;
25
+ color: transparent;
26
+ font-weight: 800;
27
+ letter-spacing: -0.5px;
28
+ }
29
+
30
+ .nav-link {
31
+ transition: all 0.3s ease;
32
+ position: relative;
33
+ }
34
+
35
+ .nav-link.active::after {
36
+ content: '';
37
+ position: absolute;
38
+ bottom: -2px;
39
+ left: 0;
40
+ right: 0;
41
+ height: 2px;
42
+ background: linear-gradient(90deg, var(--primary), var(--accent));
43
+ border-radius: 2px;
44
+ animation: neon-glow 2s ease-in-out infinite alternate;
45
+ }
46
+
47
+ .hamburger span {
48
+ transition: all 0.3s ease;
49
+ }
50
+
51
+ .hamburger.active span:nth-child(1) {
52
+ transform: rotate(45deg) translate(6px, 6px);
53
+ }
54
+
55
+ .hamburger.active span:nth-child(2) {
56
+ opacity: 0;
57
+ }
58
+
59
+ .hamburger.active span:nth-child(3) {
60
+ transform: rotate(-45deg) translate(6px, -6px);
61
+ }
62
+
63
+ @keyframes neon-glow {
64
+ 0% {
65
+ box-shadow: 0 0 5px var(--primary), 0 0 10px var(--primary);
66
+ }
67
+ 100% {
68
+ box-shadow: 0 0 10px var(--secondary), 0 0 20px var(--secondary);
69
+ }
70
+ }
71
+ </style>
72
+ <nav class="py-4 px-6">
73
+ <div class="container mx-auto flex items-center justify-between">
74
+ <div class="flex items-center gap-2">
75
+ <i data-feather="eye" class="w-6 h-6 text-accent"></i>
76
+ <h1 class="logo text-xl">AI Mirror Nebula</h1>
77
+ </div>
78
+
79
+ <div class="hidden md:flex items-center gap-8">
80
+ <a href="/home" class="nav-link flex items-center gap-2">
81
+ <i data-feather="home"></i>
82
+ <span>Home</span>
83
+ </a>
84
+ <a href="/chat" class="nav-link flex items-center gap-2">
85
+ <i data-feather="message-square"></i>
86
+ <span>Chat</span>
87
+ </a>
88
+ <a href="/features" class="nav-link flex items-center gap-2">
89
+ <i data-feather="grid"></i>
90
+ <span>Features</span>
91
+ </a>
92
+ <a href="/settings" class="nav-link flex items-center gap-2">
93
+ <i data-feather="settings"></i>
94
+ <span>Settings</span>
95
+ </a>
96
+ </div>
97
+
98
+ <div class="flex items-center gap-4">
99
+ <button onclick="window.appFunctions.toggleLockScreen()" class="p-2 rounded-lg hover:bg-surface transition">
100
+ <i data-feather="lock"></i>
101
+ </button>
102
+
103
+ <div class="hamburger md:hidden cursor-pointer">
104
+ <span class="block w-6 h-0.5 bg-text mb-1.5"></span>
105
+ <span class="block w-6 h-0.5 bg-text"></span>
106
+ <span class="block w-6 h-0.5 bg-text mt-1.5"></span>
107
+ </div>
108
+ </div>
109
+ </div>
110
+ </nav>
111
+ `;
112
+
113
+ this.initNavigation();
114
+ this.initHamburger();
115
+ }
116
+
117
+ initNavigation() {
118
+ const links = this.shadowRoot.querySelectorAll('.nav-link');
119
+
120
+ links.forEach(link => {
121
+ link.addEventListener('click', (e) => {
122
+ e.preventDefault();
123
+ const page = link.getAttribute('href').replace('/', '');
124
+ window.appFunctions.loadPageContent(page);
125
+ });
126
+ });
127
+ }
128
+
129
+ initHamburger() {
130
+ const hamburger = this.shadowRoot.querySelector('.hamburger');
131
+ const mobileMenu = document.createElement('div');
132
+
133
+ hamburger.addEventListener('click', () => {
134
+ hamburger.classList.toggle('active');
135
+
136
+ if (hamburger.classList.contains('active')) {
137
+ mobileMenu.className = 'fixed inset-0 top-20 z-50 bg-background/95 backdrop-blur-md md:hidden';
138
+ mobileMenu.innerHTML = `
139
+ <div class="p-6 space-y-6">
140
+ <a href="/home" class="flex items-center gap-3 p-3 rounded-lg hover:bg-surface transition">
141
+ <i data-feather="home"></i>
142
+ <span>Home</span>
143
+ </a>
144
+ <a href="/chat" class="flex items-center gap-3 p-3 rounded-lg hover:bg-surface transition">
145
+ <i data-feather="message-square"></i>
146
+ <span>Chat</span>
147
+ </a>
148
+ <a href="/features" class="flex items-center gap-3 p-3 rounded-lg hover:bg-surface transition">
149
+ <i data-feather="grid"></i>
150
+ <span>Features</span>
151
+ </a>
152
+ <a href="/settings" class="flex items-center gap-3 p-3 rounded-lg hover:bg-surface transition">
153
+ <i data-feather="settings"></i>
154
+ <span>Settings</span>
155
+ </a>
156
+ </div>
157
+ `;
158
+
159
+ document.body.appendChild(mobileMenu);
160
+ feather.replace();
161
+
162
+ // Add event listeners to mobile menu links
163
+ mobileMenu.querySelectorAll('a').forEach(link => {
164
+ link.addEventListener('click', (e) => {
165
+ e.preventDefault();
166
+ hamburger.classList.remove('active');
167
+ mobileMenu.remove();
168
+
169
+ const page = link.getAttribute('href').replace('/', '');
170
+ window.appFunctions.loadPageContent(page);
171
+ });
172
+ } else {
173
+ document.querySelector('.fixed.inset-0.top-20')?.remove();
174
+ }
175
+ });
176
+ }
177
+ }
178
+
179
+ customElements.define('custom-navbar', CustomNavbar);
index.html CHANGED
@@ -1,19 +1,96 @@
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">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>AI Mirror Nebula 👁️</title>
7
+ <script src="https://cdn.tailwindcss.com"></script>
8
+ <script src="https://cdn.jsdelivr.net/npm/feather-icons/dist/feather.min.js"></script>
9
+ <script src="https://unpkg.com/feather-icons"></script>
10
+ <link rel="stylesheet" href="style.css">
11
+ <script>
12
+ tailwind.config = {
13
+ darkMode: 'class',
14
+ theme: {
15
+ extend: {
16
+ colors: {
17
+ primary: '#4F46E5',
18
+ secondary: '#EC4899',
19
+ accent: '#06B6D4',
20
+ background: '#0F172A',
21
+ surface: '#1E293B',
22
+ text: '#F8FAFC',
23
+ subtle: '#94A3B8'
24
+ },
25
+ fontFamily: {
26
+ sans: ['Inter', 'system-ui', 'sans-serif'],
27
+ mono: ['JetBrains Mono', 'monospace']
28
+ },
29
+ animation: {
30
+ 'pulse-slow': 'pulse 3s ease-in-out infinite',
31
+ 'float': 'float 6s ease-in-out infinite',
32
+ 'gradient': 'gradient 8s ease infinite',
33
+ 'neon-glow': 'neonGlow 2s ease-in-out infinite alternate'
34
+ },
35
+ keyframes: {
36
+ float: {
37
+ '0%, 100%': { transform: 'translateY(0)' },
38
+ '50%': { transform: 'translateY(-20px)' }
39
+ },
40
+ gradient: {
41
+ '0%, 100%': { backgroundPosition: '0% 50%' },
42
+ '50%': { backgroundPosition: '100% 50%' }
43
+ },
44
+ neonGlow: {
45
+ '0%': { boxShadow: '0 0 5px theme(colors.primary), 0 0 10px theme(colors.primary), 0 0 15px theme(colors.primary)' },
46
+ '100%': { boxShadow: '0 0 10px theme(colors.secondary), 0 0 20px theme(colors.secondary), 0 0 30px theme(colors.secondary)' }
47
+ }
48
+ }
49
+ }
50
+ }
51
+ }
52
+ </script>
53
+ </head>
54
+ <body class="dark bg-background text-text font-sans min-h-screen">
55
+ <custom-navbar></custom-navbar>
56
+ <custom-lockscreen></custom-lockscreen>
57
+
58
+ <main id="main-content" class="container mx-auto px-4 py-8 max-w-7xl">
59
+ <section class="hero-section mb-16">
60
+ <div class="relative rounded-3xl overflow-hidden p-8 md:p-12 bg-gradient-to-br from-primary/20 via-surface to-secondary/20 animate-gradient">
61
+ <div class="absolute inset-0 bg-grid-white/10 opacity-10"></div>
62
+ </div>
63
+ </section>
64
+
65
+ <section class="features-section mb-16">
66
+ <div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8">
67
+ <!-- Feature cards will be dynamically loaded here -->
68
+ </div>
69
+ </section>
70
+
71
+ <section class="ai-chat-section mb-16">
72
+ <div class="bg-surface rounded-2xl p-6 shadow-2xl">
73
+ <h2 class="text-2xl font-bold mb-6 flex items-center gap-3">
74
+ <i data-feather="message-circle" class="text-accent"></i>
75
+ Neural Conversations
76
+ </h2>
77
+ <div class="chat-interface">
78
+ <!-- Chat messages will appear here -->
79
+ </div>
80
+ </div>
81
+ </section>
82
+ </main>
83
+
84
+ <custom-footer></custom-footer>
85
+
86
+ <script src="components/navbar.js"></script>
87
+ <script src="components/lockscreen.js"></script>
88
+ <script src="components/footer.js"></script>
89
+ <script src="script.js"></script>
90
+ <script>
91
+ feather.replace();
92
+ document.documentElement.classList.add('dark');
93
+ </script>
94
+ <script src="https://huggingface.co/deepsite/deepsite-badge.js"></script>
95
+ </body>
96
+ </html>
script.js ADDED
@@ -0,0 +1,337 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // Global State
2
+ let appState = {
3
+ theme: 'dark',
4
+ isLocked: false,
5
+ currentPage: 'home',
6
+ userSettings: {
7
+ animations: true,
8
+ sounds: true,
9
+ notifications: true
10
+ }
11
+ };
12
+
13
+ // Initialize App
14
+ document.addEventListener('DOMContentLoaded', () => {
15
+ initTheme();
16
+ initNavigation();
17
+ loadFeatures();
18
+ initChat();
19
+ createParticles();
20
+ });
21
+
22
+ // Theme Management
23
+ function initTheme() {
24
+ const savedTheme = localStorage.getItem('theme') || 'dark';
25
+ appState.theme = savedTheme;
26
+ document.documentElement.classList.add(savedTheme);
27
+
28
+ // Set theme colors based on user preference
29
+ if (appState.theme === 'dark') {
30
+ document.documentElement.style.setProperty('--primary', '#4F46E5');
31
+ document.documentElement.style.setProperty('--secondary', '#EC4899');
32
+ document.documentElement.style.setProperty('--accent', '#06B6D4');
33
+ document.documentElement.style.setProperty('--background', '#0F172A');
34
+ document.documentElement.style.setProperty('--surface', '#1E293B');
35
+ document.documentElement.style.setProperty('--text', '#F8FAFC');
36
+ document.documentElement.style.setProperty('--subtle', '#94A3B8');
37
+ }
38
+ }
39
+
40
+ // Navigation System
41
+ function initNavigation() {
42
+ const navButtons = document.querySelectorAll('.nav-btn');
43
+ const mainContent = document.getElementById('main-content');
44
+
45
+ navButtons.forEach(btn => {
46
+ btn.addEventListener('click', () => {
47
+ const targetPage = btn.dataset.nav;
48
+
49
+ // Update active state
50
+ navButtons.forEach(b => b.classList.remove('active'));
51
+ btn.classList.add('active');
52
+
53
+ // Update app state
54
+ appState.currentPage = targetPage;
55
+
56
+ // Load page content
57
+ loadPageContent(targetPage);
58
+
59
+ // Update URL without reload
60
+ history.pushState({ page: targetPage }, '', `/${targetPage}`);
61
+ });
62
+ });
63
+
64
+ // Handle browser back/forward
65
+ window.addEventListener('popstate', (event) => {
66
+ if (event.state && event.state.page) {
67
+ loadPageContent(event.state.page);
68
+ }
69
+ });
70
+ }
71
+
72
+ async function loadPageContent(page) {
73
+ const mainContent = document.getElementById('main-content');
74
+
75
+ // Show loading state
76
+ mainContent.innerHTML = `
77
+ <div class="flex items-center justify-center min-h-[60vh]">
78
+ <div class="text-center">
79
+ <div class="loading-dots inline-block mb-4">
80
+ <span></span><span></span><span></span>
81
+ </div>
82
+ <p class="text-subtle">Loading ${page}...</p>
83
+ </div>
84
+ `;
85
+
86
+ try {
87
+ const response = await fetch(`pages/${page}.html`);
88
+ const content = await response.text();
89
+
90
+ // Add fade-in animation
91
+ mainContent.innerHTML = content;
92
+ mainContent.classList.add('opacity-0');
93
+ setTimeout(() => {
94
+ mainContent.classList.remove('opacity-0');
95
+ mainContent.classList.add('opacity-100');
96
+ }, 50);
97
+
98
+ // Re-initialize page-specific functionality
99
+ switch(page) {
100
+ case 'home':
101
+ loadFeatures();
102
+ break;
103
+ case 'chat':
104
+ initChat();
105
+ break;
106
+ case 'settings':
107
+ initSettings();
108
+ break;
109
+ }
110
+ } catch (error) {
111
+ mainContent.innerHTML = `
112
+ <div class="text-center py-12">
113
+ <i data-feather="alert-triangle" class="w-16 h-16 mx-auto text-secondary mb-4"></i>
114
+ <h3 class="text-xl font-bold mb-2">Page Not Found</h3>
115
+ <p class="text-subtle mb-6">The requested page could not be loaded.</p>
116
+ <button onclick="loadPageContent('home')" class="bg-primary text-white px-6 py-3 rounded-lg hover:bg-primary/80 transition">
117
+ Return Home
118
+ </button>
119
+ </div>
120
+ `;
121
+ feather.replace();
122
+ }
123
+ }
124
+
125
+ // Load Features from Public API
126
+ async function loadFeatures() {
127
+ const featuresContainer = document.querySelector('.features-section .grid');
128
+
129
+ if (!featuresContainer) return;
130
+
131
+ try {
132
+ // Using NASA APOD API for demonstration
133
+ const response = await fetch('https://api.nasa.gov/planetary/apod?api_key=DEMO_KEY&count=6');
134
+ const features = await response.json();
135
+
136
+ featuresContainer.innerHTML = features.map((feature, index) => `
137
+ <div class="hover-card glass rounded-2xl p-6 transform transition-all duration-300 hover:scale-[1.02] animate-float" style="animation-delay: ${index * 0.1}s">
138
+ <div class="flex items-center gap-4 mb-4">
139
+ <div class="w-12 h-12 rounded-xl bg-gradient-to-br from-primary to-secondary flex items-center justify-center">
140
+ <i data-feather="${getRandomIcon()}" class="text-white"></i>
141
+ </div>
142
+ <h3 class="text-lg font-bold mb-2">${feature.title}</h3>
143
+ <p class="text-subtle text-sm mb-4">${feature.explanation.substring(0, 100)}...</p>
144
+ <div class="flex items-center justify-between">
145
+ <span class="text-xs bg-surface px-3 py-1 rounded-full">
146
+ ${new Date(feature.date).toLocaleDateString()}
147
+ </span>
148
+ <button onclick="openFeatureModal(${index})" class="text-accent hover:text-accent/80 transition">
149
+ <i data-feather="arrow-right"></i>
150
+ </button>
151
+ </div>
152
+ </div>
153
+ `).join('');
154
+
155
+ feather.replace();
156
+ } catch (error) {
157
+ featuresContainer.innerHTML = `
158
+ <div class="col-span-3 text-center py-8">
159
+ <p class="text-subtle">Unable to load features at this time.</p>
160
+ </div>
161
+ `;
162
+ }
163
+ }
164
+
165
+ // Chat System
166
+ function initChat() {
167
+ const chatInterface = document.querySelector('.chat-interface');
168
+
169
+ if (!chatInterface) return;
170
+
171
+ chatInterface.innerHTML = `
172
+ <div class="flex flex-col space-y-4 mb-6">
173
+ <div class="chat-message user">
174
+ <p>Hello AI Mirror!</p>
175
+ </div>
176
+ <div class="chat-message ai">
177
+ <p>Greetings! I am your neural companion. How can I assist you today?</p>
178
+ </div>
179
+ </div>
180
+
181
+ <div class="flex gap-2">
182
+ <input type="text" placeholder="Ask me anything..." class="flex-1 bg-surface border border-white/10 rounded-lg px-4 py-3 focus:outline-none focus:ring-2 focus:ring-primary">
183
+ <button onclick="sendMessage()" class="bg-primary text-white px-6 py-3 rounded-lg hover:bg-primary/80 transition">
184
+ <i data-feather="send"></i>
185
+ </button>
186
+ </div>
187
+ `;
188
+
189
+ feather.replace();
190
+ }
191
+
192
+ function sendMessage() {
193
+ const input = document.querySelector('.chat-interface input');
194
+ const message = input.value.trim();
195
+
196
+ if (!message) return;
197
+
198
+ const chatInterface = document.querySelector('.chat-interface');
199
+
200
+ // Add user message
201
+ chatInterface.insertAdjacentHTML('beforeend', `
202
+ <div class="chat-message user">
203
+ <p>${message}</p>
204
+ </div>
205
+ `);
206
+
207
+ // Clear input
208
+ input.value = '';
209
+
210
+ // Show typing indicator
211
+ chatInterface.insertAdjacentHTML('beforeend', `
212
+ <div class="typing-indicator">
213
+ <span></span><span></span><span></span>
214
+ </div>
215
+ `);
216
+
217
+ // Simulate AI response after delay
218
+ setTimeout(() => {
219
+ document.querySelector('.typing-indicator')?.remove();
220
+
221
+ // Using public AI API (example with DeepAI)
222
+ fetchAIResponse(message).then(response => {
223
+ chatInterface.insertAdjacentHTML('beforeend', `
224
+ <div class="chat-message ai">
225
+ <p>${response}</p>
226
+ </div>
227
+ `);
228
+
229
+ // Scroll to bottom
230
+ chatInterface.scrollTop = chatInterface.scrollHeight;
231
+ });
232
+ }, 1500);
233
+ }
234
+
235
+ async function fetchAIResponse(message) {
236
+ try {
237
+ // Using OpenAI-like API (example)
238
+ const response = await fetch('https://api.deepai.org/api/text-generator', {
239
+ method: 'POST',
240
+ headers: {
241
+ 'Content-Type': 'application/json',
242
+ 'api-key': 'quickstart-QUdJIGlzIGNvbWluZy4uLi4K',
243
+ },
244
+ body: JSON.stringify({
245
+ text: message,
246
+ model: 'gpt-3'
247
+ })
248
+ });
249
+
250
+ const data = await response.json();
251
+ return data.output || "I'm processing your request. Please try again.";
252
+ } catch (error) {
253
+ return "I apologize, but I'm having trouble processing your request right now.";
254
+ }
255
+ }
256
+
257
+ // Utility Functions
258
+ function getRandomIcon() {
259
+ const icons = ['star', 'moon', 'sun', 'cloud', 'compass', 'zap', 'heart', 'cpu', 'globe', 'eye'];
260
+ return icons[Math.floor(Math.random() * icons.length)];
261
+ }
262
+
263
+ function openFeatureModal(index) {
264
+ const modal = document.createElement('div');
265
+ modal.className = 'fixed inset-0 z-50 flex items-center justify-center p-4 bg-black/60 backdrop-blur-sm';
266
+ modal.innerHTML = `
267
+ <div class="bg-surface rounded-2xl p-6 max-w-md w-full">
268
+ <h3 class="text-xl font-bold mb-4">Feature Details</h3>
269
+ <p>Detailed information about feature ${index + 1}.</p>
270
+ <div class="flex justify-end gap-2 mt-6">
271
+ <button onclick="this.closest('.fixed').remove()" class="px-4 py-2 rounded-lg bg-surface hover:bg-surface/80 transition">
272
+ Close
273
+ </button>
274
+ </div>
275
+ </div>
276
+ `;
277
+
278
+ document.body.appendChild(modal);
279
+ feather.replace();
280
+ }
281
+
282
+ // Particle Background
283
+ function createParticles() {
284
+ const particleCount = 50;
285
+
286
+ for (let i = 0; i < particleCount; i++) {
287
+ const particle = document.createElement('div');
288
+ particle.className = 'particle';
289
+
290
+ // Random position and size
291
+ const size = Math.random() * 3 + 1;
292
+ particle.style.width = `${size}px`;
293
+ particle.style.height = `${size}px`;
294
+ particle.style.left = `${Math.random() * 100}vw`;
295
+ particle.style.top = `${Math.random() * 100}vh`;
296
+
297
+ // Random animation
298
+ particle.style.animation = `float ${Math.random() * 10 + 10}s ease-in-out infinite`;
299
+ particle.style.animationDelay = `${Math.random() * 5}s`;
300
+
301
+ document.body.appendChild(particle);
302
+ }
303
+ }
304
+
305
+ // Settings Management
306
+ function initSettings() {
307
+ const settingsElements = document.querySelectorAll('.setting-toggle');
308
+
309
+ settingsElements.forEach(element => {
310
+ element.addEventListener('change', (e) => {
311
+ const setting = e.target.dataset.setting;
312
+ const value = e.target.checked;
313
+
314
+ appState.userSettings[setting] = value;
315
+ localStorage.setItem('settings', JSON.stringify(appState.userSettings));
316
+
317
+ // Apply setting changes
318
+ if (setting === 'animations') {
319
+ document.body.classList.toggle('no-animations', !value);
320
+ }
321
+ });
322
+ }
323
+
324
+ // Lock Screen Management
325
+ function toggleLockScreen() {
326
+ const lockScreen = document.querySelector('custom-lockscreen');
327
+ if (lockScreen) {
328
+ lockScreen.toggleLock();
329
+ }
330
+ }
331
+
332
+ // Export functions for components
333
+ window.appFunctions = {
334
+ loadPageContent,
335
+ toggleLockScreen,
336
+ sendMessage
337
+ };
style.css CHANGED
@@ -1,28 +1,215 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
+ /* Global Styles */
2
+ @import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800&family=JetBrains+Mono:wght@300;400;500&display=swap');
3
+
4
+ :root {
5
+ --primary: #4F46E5;
6
+ --secondary: #EC4899;
7
+ --accent: #06B6D4;
8
+ --background: #0F172A;
9
+ --surface: #1E293B;
10
+ --text: #F8FAFC;
11
+ --subtle: #94A3B8;
12
+ }
13
+
14
+ * {
15
+ margin: 0;
16
+ padding: 0;
17
+ box-sizing: border-box;
18
+ }
19
+
20
  body {
21
+ background: var(--background);
22
+ color: var(--text);
23
+ font-family: 'Inter', sans-serif;
24
+ min-height: 100vh;
25
+ position: relative;
26
+ overflow-x: hidden;
27
+ }
28
+
29
+ /* Custom Scrollbar */
30
+ ::-webkit-scrollbar {
31
+ width: 8px;
32
+ }
33
+
34
+ ::-webkit-scrollbar-track {
35
+ background: var(--surface);
36
+ border-radius: 4px;
37
+ }
38
+
39
+ ::-webkit-scrollbar-thumb {
40
+ background: var(--primary);
41
+ border-radius: 4px;
42
+ }
43
+
44
+ ::-webkit-scrollbar-thumb:hover {
45
+ background: var(--secondary);
46
+ }
47
+
48
+ /* Glass Effect */
49
+ .glass {
50
+ background: rgba(30, 41, 59, 0.7);
51
+ backdrop-filter: blur(10px);
52
+ border: 1px solid rgba(255, 255, 255, 0.1);
53
+ }
54
+
55
+ /* Gradient Background */
56
+ .gradient-bg {
57
+ background: linear-gradient(135deg, var(--primary), var(--secondary), var(--accent));
58
+ background-size: 400% 400%;
59
+ animation: gradient 15s ease infinite;
60
+ }
61
+
62
+ /* Animated Background Grid */
63
+ .bg-grid-white\/10 {
64
+ background-image:
65
+ linear-gradient(to right, rgba(255,255,255,.1) 1px, transparent 1px),
66
+ linear-gradient(to bottom, rgba(255,255,255,.1) 1px, transparent 1px);
67
+ background-size: 50px 50px;
68
+ }
69
+
70
+ /* Neon Glow Effect */
71
+ .neon-glow {
72
+ position: relative;
73
+ }
74
+
75
+ .neon-glow::after {
76
+ content: '';
77
+ position: absolute;
78
+ inset: -2px;
79
+ background: linear-gradient(45deg, var(--primary), var(--secondary), var(--accent));
80
+ border-radius: inherit;
81
+ filter: blur(10px);
82
+ opacity: 0.5;
83
+ z-index: -1;
84
+ }
85
+
86
+ /* Floating Animation */
87
+ @keyframes float {
88
+ 0%, 100% {
89
+ transform: translateY(0) rotate(0deg);
90
+ }
91
+ 50% {
92
+ transform: translateY(-20px) rotate(5deg);
93
+ }
94
+ }
95
+
96
+ /* Particle Effect */
97
+ .particle {
98
+ position: absolute;
99
+ border-radius: 50%;
100
+ background: radial-gradient(circle at center, var(--accent) 0%, transparent 70%);
101
+ pointer-events: none;
102
+ }
103
+
104
+ /* Responsive Design */
105
+ @media (max-width: 768px) {
106
+ .container {
107
+ padding-left: 1rem;
108
+ padding-right: 1rem;
109
+ }
110
+
111
+ .hero-section {
112
+ padding: 2rem 1rem !important;
113
+ }
114
+ }
115
+
116
+ /* Dark Mode Enhancements */
117
+ .dark .invert-dark {
118
+ filter: invert(1) hue-rotate(180deg);
119
+ }
120
+
121
+ /* Loading Animation */
122
+ .loading-dots {
123
+ display: inline-flex;
124
+ align-items: center;
125
+ }
126
+
127
+ .loading-dots span {
128
+ width: 8px;
129
+ height: 8px;
130
+ margin: 0 3px;
131
+ background: var(--accent);
132
+ border-radius: 50%;
133
+ animation: loading 1.4s ease-in-out infinite;
134
+ }
135
+
136
+ .loading-dots span:nth-child(2) {
137
+ animation-delay: 0.2s;
138
+ }
139
+
140
+ .loading-dots span:nth-child(3) {
141
+ animation-delay: 0.4s;
142
+ }
143
+
144
+ @keyframes loading {
145
+ 0%, 100% {
146
+ transform: scale(1);
147
+ opacity: 1;
148
+ }
149
+ 50% {
150
+ transform: scale(0.5);
151
+ opacity: 0.5;
152
+ }
153
+ }
154
+
155
+ /* Chat Message Styles */
156
+ .chat-message {
157
+ max-width: 80%;
158
+ margin: 1rem 0;
159
+ padding: 1rem;
160
+ border-radius: 1rem;
161
+ position: relative;
162
+ }
163
+
164
+ .chat-message.user {
165
+ background: linear-gradient(135deg, var(--primary), var(--accent));
166
+ margin-left: auto;
167
+ border-bottom-right-radius: 0;
168
  }
169
 
170
+ .chat-message.ai {
171
+ background: var(--surface);
172
+ border: 1px solid rgba(255, 255, 255, 0.1);
173
+ margin-right: auto;
174
+ border-bottom-left-radius: 0;
175
  }
176
 
177
+ /* Card Hover Effects */
178
+ .hover-card {
179
+ transition: all 0.3s ease;
 
 
180
  }
181
 
182
+ .hover-card:hover {
183
+ transform: translateY(-5px);
184
+ box-shadow: 0 20px 40px rgba(0, 0, 0, 0.3);
 
 
 
185
  }
186
 
187
+ /* Typing Animation */
188
+ .typing-indicator {
189
+ display: inline-flex;
190
+ align-items: center;
191
+ padding: 12px 20px;
192
+ background: var(--surface);
193
+ border-radius: 25px;
194
  }
195
+
196
+ .typing-indicator span {
197
+ width: 6px;
198
+ height: 6px;
199
+ margin: 0 2px;
200
+ background: var(--accent);
201
+ border-radius: 50%;
202
+ opacity: 0.4;
203
+ animation: typing 1.5s infinite;
204
+ }
205
+
206
+ @keyframes typing {
207
+ 0%, 100% {
208
+ opacity: 0.4;
209
+ transform: translateY(0);
210
+ }
211
+ 50% {
212
+ opacity: 1;
213
+ transform: translateY(-5px);
214
+ }
215
+ }