Spaces:
Running
Running
Upload 19 files
Browse files- .env +5 -0
- app.js +270 -0
- dashboard-styles.css +180 -0
- dashboard.html +68 -0
- index.html +508 -0
- interative.js +170 -0
- nhostClient.js +9 -0
- package-lock.json +0 -0
- package.json +21 -0
- server.js +101 -0
- signin-styles.css +199 -0
- signin.html +43 -0
- signin.js +101 -0
- signup-styles.css +180 -0
- signup.html +50 -0
- signup.js +107 -0
- styles.css +1213 -0
- vbrowser.html +102 -0
- vercel.json +15 -0
.env
ADDED
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
HYPERBEAM_API_KEY=sk_live_vDMqARrgzFyPSbErH0E9Q9RV6__2CeLr3cGQPeT8igA
|
2 |
+
NHOST_BACKEND_URL=https://sypnrudbonrqtgacejcc.ap-south-1.nhost.run
|
3 |
+
NHOST_SUBDOMAIN=sypnrudbonrqtgacejcc
|
4 |
+
NHOST_REGION=ap-south-1
|
5 |
+
PORT=3000
|
app.js
ADDED
@@ -0,0 +1,270 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
class SakuraCyberDashboard {
|
2 |
+
constructor() {
|
3 |
+
this.consoleOutput = document.getElementById('console-output');
|
4 |
+
this.themeToggle = document.getElementById('theme-toggle');
|
5 |
+
this.currentTheme = 'sakura'; // Default theme
|
6 |
+
this.loadTheme();
|
7 |
+
this.themeToggle.addEventListener('click', () => this.toggleTheme());
|
8 |
+
}
|
9 |
+
|
10 |
+
log(message) {
|
11 |
+
const timestamp = new Date().toLocaleTimeString();
|
12 |
+
this.consoleOutput.innerHTML += `[${timestamp}] ${this.glitchText(message)}\n`;
|
13 |
+
this.consoleOutput.scrollTop = this.consoleOutput.scrollHeight;
|
14 |
+
}
|
15 |
+
|
16 |
+
glitchText(text) {
|
17 |
+
// Japanese-inspired glitch effect
|
18 |
+
const glitchChars = ['・', '◆', '◇', '■', '□'];
|
19 |
+
return text.split('').map(char =>
|
20 |
+
Math.random() > 0.9 ? glitchChars[Math.floor(Math.random() * glitchChars.length)] : char
|
21 |
+
).join('');
|
22 |
+
}
|
23 |
+
|
24 |
+
async launchVirtualBrowser() {
|
25 |
+
this.log('Initializing Virtual Browser...');
|
26 |
+
try {
|
27 |
+
// Check if user is signed in
|
28 |
+
const token = localStorage.getItem('authToken');
|
29 |
+
if (!token) {
|
30 |
+
// If not signed in, show sign in modal
|
31 |
+
this.showSignInModal();
|
32 |
+
return;
|
33 |
+
}
|
34 |
+
|
35 |
+
// User is signed in, open virtual browser in new window
|
36 |
+
const width = Math.min(1200, window.innerWidth * 0.9);
|
37 |
+
const height = width * (9/16); // 16:9 aspect ratio
|
38 |
+
const left = (window.innerWidth - width) / 2;
|
39 |
+
const top = (window.innerHeight - height) / 2;
|
40 |
+
|
41 |
+
window.open('vbrowser.html', 'Virtual Browser',
|
42 |
+
`width=${width},height=${height},left=${left},top=${top}`);
|
43 |
+
|
44 |
+
} catch (error) {
|
45 |
+
this.log(`Browser Launch Error: ${error.message}`);
|
46 |
+
}
|
47 |
+
}
|
48 |
+
|
49 |
+
async launchLiveStreamer() {
|
50 |
+
this.log('Connecting to Live Stream...');
|
51 |
+
try {
|
52 |
+
const response = await fetch('/launch/live-streamer', { method: 'POST' });
|
53 |
+
const data = await response.json();
|
54 |
+
this.log(`Live Stream Established: ${data.status}`);
|
55 |
+
} catch (error) {
|
56 |
+
this.log(`Stream Connection Error: ${error.message}`);
|
57 |
+
}
|
58 |
+
}
|
59 |
+
|
60 |
+
async launchLiveLogs() {
|
61 |
+
this.log('Starting Log Trace Algorithm...');
|
62 |
+
try {
|
63 |
+
const response = await fetch('/launch/live-logs', { method: 'POST' });
|
64 |
+
const data = await response.json();
|
65 |
+
this.log(`Log Trace Ready: ${data.status}`);
|
66 |
+
} catch (error) {
|
67 |
+
this.log(`Trace Protocol Failure: ${error.message}`);
|
68 |
+
}
|
69 |
+
}
|
70 |
+
|
71 |
+
toggleTheme() {
|
72 |
+
this.currentTheme = this.currentTheme === 'sakura' ? 'program' : 'sakura';
|
73 |
+
this.applyTheme();
|
74 |
+
localStorage.setItem('theme', this.currentTheme);
|
75 |
+
}
|
76 |
+
|
77 |
+
loadTheme() {
|
78 |
+
const storedTheme = localStorage.getItem('theme');
|
79 |
+
if (storedTheme) {
|
80 |
+
this.currentTheme = storedTheme;
|
81 |
+
}
|
82 |
+
this.applyTheme();
|
83 |
+
}
|
84 |
+
|
85 |
+
applyTheme() {
|
86 |
+
const body = document.body;
|
87 |
+
const root = document.documentElement;
|
88 |
+
if (this.currentTheme === 'sakura') {
|
89 |
+
// Sakura Theme
|
90 |
+
root.style.setProperty('--background-primary', 'rgba(255, 255, 255, 0.1)');
|
91 |
+
root.style.setProperty('--background-secondary', 'rgba(255, 255, 255, 0.05)');
|
92 |
+
root.style.setProperty('--text-primary', '#f0f0f0');
|
93 |
+
root.style.setProperty('--text-secondary', '#c0c0c0');
|
94 |
+
root.style.setProperty('--accent-color', '#ff6b6b');
|
95 |
+
root.style.setProperty('--border-color', 'rgba(255, 255, 255, 0.2)');
|
96 |
+
body.style.background = 'linear-gradient(135deg, #1a1a2e, #16213e)';
|
97 |
+
this.themeToggle.innerHTML = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="theme-icon"><circle cx="12" cy="12" r="5"/><path d="M12 1v2M12 21v2M4.22 4.22l1.42 1.42M18.36 18.36l1.42 1.42M1 12h2M21 12h2M4.22 19.78l1.42-1.42M18.36 5.64l1.42-1.42"/></svg>';
|
98 |
+
|
99 |
+
// Update card icons
|
100 |
+
this.updateCardIcons('sakura');
|
101 |
+
} else if (this.currentTheme === 'program') {
|
102 |
+
// Program Theme
|
103 |
+
root.style.setProperty('--background-primary', 'rgba(255, 255, 255, 0.2)');
|
104 |
+
root.style.setProperty('--background-secondary', 'rgba(255, 255, 255, 0.2)');
|
105 |
+
root.style.setProperty('--text-primary', '#fff');
|
106 |
+
root.style.setProperty('--text-secondary', '#fff');
|
107 |
+
root.style.setProperty('--accent-color', '#5D3FD3');
|
108 |
+
root.style.setProperty('--border-color', 'rgba(255, 255, 255, 0.3)');
|
109 |
+
body.style.background = 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)';
|
110 |
+
this.themeToggle.innerHTML = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="theme-icon"><path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"></path></svg>';
|
111 |
+
|
112 |
+
// Update card icons
|
113 |
+
this.updateCardIcons('program');
|
114 |
+
}
|
115 |
+
}
|
116 |
+
|
117 |
+
updateCardIcons(theme) {
|
118 |
+
const virtualBrowserIcon = document.querySelector('.virtual-browser-card .card-icon');
|
119 |
+
const liveStreamerIcon = document.querySelector('.live-streamer-card .card-icon');
|
120 |
+
const liveLogsIcon = document.querySelector('.live-logs-card .card-icon');
|
121 |
+
|
122 |
+
if (theme === 'sakura') {
|
123 |
+
virtualBrowserIcon.innerHTML = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" class="icon">
|
124 |
+
<path d="M4 8h16M4 16h16M3 12h18"></path>
|
125 |
+
</svg>`;
|
126 |
+
liveStreamerIcon.innerHTML = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" class="icon">
|
127 |
+
<path d="M23 7l-7 5 7 5V7z"></path>
|
128 |
+
<rect x="1" y="5" width="15" height="14" rx="2" ry="2"></rect>
|
129 |
+
</svg>`;
|
130 |
+
liveLogsIcon.innerHTML = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" class="icon">
|
131 |
+
<path d="M16 18l6-6-6-6"></path>
|
132 |
+
<path d="M2 12h20"></path>
|
133 |
+
</svg>`;
|
134 |
+
} else if (theme === 'program') {
|
135 |
+
virtualBrowserIcon.innerHTML = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" class="icon">
|
136 |
+
<path d="M4 8h16M4 16h16M3 12h18"></path>
|
137 |
+
</svg>`;
|
138 |
+
liveStreamerIcon.innerHTML = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" class="icon">
|
139 |
+
<path d="M23 7l-7 5 7 5V7z"></path>
|
140 |
+
<rect x="1" y="5" width="15" height="14" rx="2" ry="2"></rect>
|
141 |
+
</svg>`;
|
142 |
+
liveLogsIcon.innerHTML = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" class="icon">
|
143 |
+
<path d="M16 18l6-6-6-6"></path>
|
144 |
+
<path d="M2 12h20"></path>
|
145 |
+
</svg>`;
|
146 |
+
}
|
147 |
+
}
|
148 |
+
|
149 |
+
showSignInModal() {
|
150 |
+
const modal = document.createElement('div');
|
151 |
+
modal.innerHTML = `
|
152 |
+
<div id="signInModal" style="
|
153 |
+
position: fixed;
|
154 |
+
top: 0;
|
155 |
+
left: 0;
|
156 |
+
right: 0;
|
157 |
+
bottom: 0;
|
158 |
+
background: rgba(0,0,0,0.8);
|
159 |
+
display: flex;
|
160 |
+
align-items: center;
|
161 |
+
justify-content: center;
|
162 |
+
z-index: 1000;
|
163 |
+
">
|
164 |
+
<div style="
|
165 |
+
background: var(--background-primary);
|
166 |
+
padding: 2rem;
|
167 |
+
border-radius: 15px;
|
168 |
+
border: 1px solid var(--border-color);
|
169 |
+
width: 90%;
|
170 |
+
max-width: 400px;
|
171 |
+
">
|
172 |
+
<h2 style="margin-bottom: 1rem; color: var(--text-primary)">Sign In</h2>
|
173 |
+
<input type="email" id="email" placeholder="Email" style="
|
174 |
+
width: 100%;
|
175 |
+
padding: 0.5rem;
|
176 |
+
margin-bottom: 1rem;
|
177 |
+
border: 1px solid var(--border-color);
|
178 |
+
background: var(--background-secondary);
|
179 |
+
color: var(--text-primary);
|
180 |
+
border-radius: 5px;
|
181 |
+
">
|
182 |
+
<input type="password" id="password" placeholder="Password" style="
|
183 |
+
width: 100%;
|
184 |
+
padding: 0.5rem;
|
185 |
+
margin-bottom: 1rem;
|
186 |
+
border: 1px solid var(--border-color);
|
187 |
+
background: var(--background-secondary);
|
188 |
+
color: var(--text-primary);
|
189 |
+
border-radius: 5px;
|
190 |
+
">
|
191 |
+
<div style="display: flex; justify-content: space-between;">
|
192 |
+
<button id="signInBtn" class="glass-btn">Sign In</button>
|
193 |
+
<button id="signUpBtn" class="glass-btn">Sign Up</button>
|
194 |
+
</div>
|
195 |
+
<button id="closeModal" style="
|
196 |
+
position: absolute;
|
197 |
+
top: 1rem;
|
198 |
+
right: 1rem;
|
199 |
+
background: none;
|
200 |
+
border: none;
|
201 |
+
color: var(--text-primary);
|
202 |
+
cursor: pointer;
|
203 |
+
font-size: 1.5rem;
|
204 |
+
">×</button>
|
205 |
+
</div>
|
206 |
+
</div>
|
207 |
+
`;
|
208 |
+
|
209 |
+
document.body.appendChild(modal);
|
210 |
+
|
211 |
+
const closeModal = () => {
|
212 |
+
document.body.removeChild(modal);
|
213 |
+
};
|
214 |
+
|
215 |
+
document.getElementById('closeModal').onclick = closeModal;
|
216 |
+
document.getElementById('signInBtn').onclick = async () => {
|
217 |
+
const email = document.getElementById('email').value;
|
218 |
+
const password = document.getElementById('password').value;
|
219 |
+
|
220 |
+
try {
|
221 |
+
const response = await fetch('/signin', {
|
222 |
+
method: 'POST',
|
223 |
+
headers: {'Content-Type': 'application/json'},
|
224 |
+
body: JSON.stringify({email, password})
|
225 |
+
});
|
226 |
+
|
227 |
+
const data = await response.json();
|
228 |
+
if (data.token) {
|
229 |
+
localStorage.setItem('authToken', data.token);
|
230 |
+
closeModal();
|
231 |
+
this.launchVirtualBrowser();
|
232 |
+
} else {
|
233 |
+
alert(data.error || 'Sign in failed');
|
234 |
+
}
|
235 |
+
} catch (error) {
|
236 |
+
alert('Sign in failed: ' + error.message);
|
237 |
+
}
|
238 |
+
};
|
239 |
+
|
240 |
+
document.getElementById('signUpBtn').onclick = async () => {
|
241 |
+
const email = document.getElementById('email').value;
|
242 |
+
const password = document.getElementById('password').value;
|
243 |
+
|
244 |
+
try {
|
245 |
+
const response = await fetch('/signup', {
|
246 |
+
method: 'POST',
|
247 |
+
headers: {'Content-Type': 'application/json'},
|
248 |
+
body: JSON.stringify({email, password})
|
249 |
+
});
|
250 |
+
|
251 |
+
const data = await response.json();
|
252 |
+
if (response.ok) {
|
253 |
+
alert('Account created! Please sign in.');
|
254 |
+
} else {
|
255 |
+
alert(data.error || 'Sign up failed');
|
256 |
+
}
|
257 |
+
} catch (error) {
|
258 |
+
alert('Sign up failed: ' + error.message);
|
259 |
+
}
|
260 |
+
};
|
261 |
+
}
|
262 |
+
}
|
263 |
+
|
264 |
+
// Initialize the dashboard
|
265 |
+
const dashboard = new SakuraCyberDashboard();
|
266 |
+
|
267 |
+
// Attach global window functions
|
268 |
+
window.launchVirtualBrowser = () => dashboard.launchVirtualBrowser();
|
269 |
+
window.launchLiveStreamer = () => dashboard.launchLiveStreamer();
|
270 |
+
window.launchLiveLogs = () => dashboard.launchLiveLogs();
|
dashboard-styles.css
ADDED
@@ -0,0 +1,180 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
@import url('https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@300;400;700&display=swap');
|
2 |
+
|
3 |
+
:root {
|
4 |
+
--background-primary: rgba(255, 255, 255, 0.1);
|
5 |
+
--background-secondary: rgba(255, 255, 255, 0.05);
|
6 |
+
--text-primary: #f0f0f0;
|
7 |
+
--text-secondary: #c0c0c0;
|
8 |
+
--accent-color: #ff6b6b;
|
9 |
+
--border-color: rgba(255, 255, 255, 0.2);
|
10 |
+
}
|
11 |
+
|
12 |
+
* {
|
13 |
+
box-sizing: border-box;
|
14 |
+
margin: 0;
|
15 |
+
padding: 0;
|
16 |
+
}
|
17 |
+
|
18 |
+
body {
|
19 |
+
font-family: 'Noto Sans JP', sans-serif;
|
20 |
+
background: linear-gradient(135deg, #1a1a2e, #16213e);
|
21 |
+
color: var(--text-primary);
|
22 |
+
min-height: 100vh;
|
23 |
+
display: flex;
|
24 |
+
justify-content: center;
|
25 |
+
align-items: center;
|
26 |
+
perspective: 1000px;
|
27 |
+
overflow: hidden;
|
28 |
+
}
|
29 |
+
|
30 |
+
.cyber-dashboard {
|
31 |
+
width: 95vw;
|
32 |
+
max-width: 1200px;
|
33 |
+
background: var(--background-primary);
|
34 |
+
backdrop-filter: blur(15px);
|
35 |
+
border-radius: 20px;
|
36 |
+
border: 1px solid var(--border-color);
|
37 |
+
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2);
|
38 |
+
overflow: hidden;
|
39 |
+
}
|
40 |
+
|
41 |
+
.dashboard-header {
|
42 |
+
background: rgba(255, 255, 255, 0.05);
|
43 |
+
padding: 20px;
|
44 |
+
text-align: center;
|
45 |
+
}
|
46 |
+
|
47 |
+
.header-content {
|
48 |
+
display: flex;
|
49 |
+
flex-direction: column;
|
50 |
+
align-items: center;
|
51 |
+
}
|
52 |
+
|
53 |
+
.terminal-title {
|
54 |
+
font-size: 2.5rem;
|
55 |
+
color: var(--accent-color);
|
56 |
+
font-weight: 700;
|
57 |
+
letter-spacing: 2px;
|
58 |
+
}
|
59 |
+
|
60 |
+
.terminal-subtitle {
|
61 |
+
font-size: 1rem;
|
62 |
+
color: var(--text-secondary);
|
63 |
+
margin-top: 10px;
|
64 |
+
}
|
65 |
+
|
66 |
+
.dashboard-grid {
|
67 |
+
display: grid;
|
68 |
+
grid-template-columns: repeat(3, 1fr);
|
69 |
+
gap: 20px;
|
70 |
+
padding: 30px;
|
71 |
+
}
|
72 |
+
|
73 |
+
.dashboard-card {
|
74 |
+
position: relative;
|
75 |
+
background: var(--background-secondary);
|
76 |
+
border-radius: 15px;
|
77 |
+
overflow: hidden;
|
78 |
+
border: 1px solid var(--border-color);
|
79 |
+
transition: transform 0.3s ease;
|
80 |
+
}
|
81 |
+
|
82 |
+
.dashboard-card:hover {
|
83 |
+
transform: scale(1.05) rotateX(5deg);
|
84 |
+
}
|
85 |
+
|
86 |
+
.card-glass-overlay {
|
87 |
+
position: absolute;
|
88 |
+
top: 0;
|
89 |
+
left: 0;
|
90 |
+
right: 0;
|
91 |
+
bottom: 0;
|
92 |
+
background: rgba(255, 255, 255, 0.05);
|
93 |
+
backdrop-filter: blur(5px);
|
94 |
+
opacity: 0.3;
|
95 |
+
border-radius: inherit;
|
96 |
+
}
|
97 |
+
|
98 |
+
.card-content {
|
99 |
+
position: relative;
|
100 |
+
z-index: 1;
|
101 |
+
text-align: center;
|
102 |
+
padding: 30px 15px;
|
103 |
+
}
|
104 |
+
|
105 |
+
.card-icon {
|
106 |
+
width: 100px;
|
107 |
+
height: 100px;
|
108 |
+
margin: 0 auto 20px;
|
109 |
+
color: var(--accent-color);
|
110 |
+
}
|
111 |
+
|
112 |
+
.card-icon svg {
|
113 |
+
width: 100%;
|
114 |
+
height: 100%;
|
115 |
+
}
|
116 |
+
|
117 |
+
.dashboard-card h2 {
|
118 |
+
font-size: 1.5rem;
|
119 |
+
margin-bottom: 20px;
|
120 |
+
color: var(--text-primary);
|
121 |
+
letter-spacing: 2px;
|
122 |
+
}
|
123 |
+
|
124 |
+
.glass-btn {
|
125 |
+
background: rgba(255, 255, 255, 0.1);
|
126 |
+
border: 1px solid var(--border-color);
|
127 |
+
color: var(--text-primary);
|
128 |
+
padding: 10px 25px;
|
129 |
+
font-family: 'Noto Sans JP', sans-serif;
|
130 |
+
font-weight: bold;
|
131 |
+
letter-spacing: 2px;
|
132 |
+
cursor: pointer;
|
133 |
+
border-radius: 5px;
|
134 |
+
backdrop-filter: blur(5px);
|
135 |
+
transition: all 0.3s ease;
|
136 |
+
}
|
137 |
+
|
138 |
+
.glass-btn:hover {
|
139 |
+
background: rgba(255, 255, 255, 0.2);
|
140 |
+
border-color: var(--accent-color);
|
141 |
+
color: var(--accent-color);
|
142 |
+
}
|
143 |
+
|
144 |
+
.dashboard-console {
|
145 |
+
background: rgba(0, 0, 0, 0.3);
|
146 |
+
color: var(--text-primary);
|
147 |
+
font-family: 'Courier New', monospace;
|
148 |
+
padding: 20px;
|
149 |
+
max-height: 300px;
|
150 |
+
overflow-y: auto;
|
151 |
+
border-top: 1px solid var(--border-color);
|
152 |
+
white-space: pre-wrap;
|
153 |
+
}
|
154 |
+
|
155 |
+
.theme-toggle {
|
156 |
+
position: absolute;
|
157 |
+
top: 20px;
|
158 |
+
right: 20px;
|
159 |
+
background: rgba(255, 255, 255, 0.1);
|
160 |
+
border: 1px solid var(--border-color);
|
161 |
+
padding: 10px;
|
162 |
+
border-radius: 50%;
|
163 |
+
cursor: pointer;
|
164 |
+
display: flex;
|
165 |
+
justify-content: center;
|
166 |
+
align-items: center;
|
167 |
+
transition: all 0.3s ease;
|
168 |
+
backdrop-filter: blur(5px);
|
169 |
+
z-index: 2;
|
170 |
+
}
|
171 |
+
|
172 |
+
.theme-toggle:hover {
|
173 |
+
background: rgba(255, 255, 255, 0.2);
|
174 |
+
}
|
175 |
+
|
176 |
+
.theme-icon {
|
177 |
+
width: 20px;
|
178 |
+
height: 20px;
|
179 |
+
color: var(--text-primary);
|
180 |
+
}
|
dashboard.html
ADDED
@@ -0,0 +1,68 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<html lang="en">
|
2 |
+
<head>
|
3 |
+
<meta charset="UTF-8">
|
4 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
5 |
+
<title>Sakura Cyber Terminal</title>
|
6 |
+
<link rel="stylesheet" href="dashboard-styles.css">
|
7 |
+
</head>
|
8 |
+
<body>
|
9 |
+
<div class="cyber-dashboard">
|
10 |
+
<button id="theme-toggle" class="theme-toggle">
|
11 |
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="theme-icon"><circle cx="12" cy="12" r="5"/><path d="M12 1v2M12 21v2M4.22 4.22l1.42 1.42M18.36 18.36l1.42 1.42M1 12h2M21 12h2M4.22 19.78l1.42-1.42M18.36 5.64l1.42-1.42"/></svg>
|
12 |
+
</button>
|
13 |
+
<header class="dashboard-header">
|
14 |
+
<div class="header-content">
|
15 |
+
<h1 class="terminal-title">桜ネットワーク</h1>
|
16 |
+
<p class="terminal-subtitle">Sakura Network Terminal</p>
|
17 |
+
</div>
|
18 |
+
</header>
|
19 |
+
|
20 |
+
<main class="dashboard-grid">
|
21 |
+
<div class="dashboard-card virtual-browser-card">
|
22 |
+
<div class="card-glass-overlay"></div>
|
23 |
+
<div class="card-content">
|
24 |
+
<div class="card-icon">
|
25 |
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
|
26 |
+
<path d="M4 5h16v14H4V5zm2 2v10h12V7H6zm3 3a1 1 0 112 0 1 1 0 01-2 0zm3 0a1 1 0 112 0 1 1 0 01-2 0zm3 0a1 1 0 112 0 1 1 0 01-2 0z"/>
|
27 |
+
</svg>
|
28 |
+
</div>
|
29 |
+
<h2>Virtual Browser</h2>
|
30 |
+
<button onclick="launchVirtualBrowser()" class="glass-btn">Launch</button>
|
31 |
+
</div>
|
32 |
+
</div>
|
33 |
+
|
34 |
+
<div class="dashboard-card live-streamer-card">
|
35 |
+
<div class="card-glass-overlay"></div>
|
36 |
+
<div class="card-content">
|
37 |
+
<div class="card-icon">
|
38 |
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
|
39 |
+
<path d="M17 9.2l5-3.2v12l-5-3.2V19H3V5h14v4.2zm-2-1.2H5v10h10V8zM2 4v16h16V4H2zm19 2.2L17 9v6l4 2.8V6.2z"/>
|
40 |
+
</svg>
|
41 |
+
</div>
|
42 |
+
<h2>Live Streamer</h2>
|
43 |
+
<button onclick="launchLiveStreamer()" class="glass-btn">Start</button>
|
44 |
+
</div>
|
45 |
+
</div>
|
46 |
+
|
47 |
+
<div class="dashboard-card live-logs-card">
|
48 |
+
<div class="card-glass-overlay"></div>
|
49 |
+
<div class="card-content">
|
50 |
+
<div class="card-icon">
|
51 |
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
|
52 |
+
<path d="M20 2H4c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zM8 20H4v-4h4v4zm0-6H4v-4h4v4zm0-6H4V4h4v4zm6 12h-4v-4h4v4zm0-6h-4v-4h4v4zm0-6h-4V4h4v4zm6 12h-4v-4h4v4zm0-6h-4v-4h4v4zm0-6h-4V4h4v4z"/>
|
53 |
+
</svg>
|
54 |
+
</div>
|
55 |
+
<h2>Live Logs Bot</h2>
|
56 |
+
<button onclick="launchLiveLogs()" class="glass-btn">Trace</button>
|
57 |
+
</div>
|
58 |
+
</div>
|
59 |
+
</main>
|
60 |
+
|
61 |
+
<div id="console-output" class="dashboard-console"></div>
|
62 |
+
</div>
|
63 |
+
<script src="https://unpkg.com/react@18/umd/react.development.js"></script>
|
64 |
+
<script src="https://unpkg.com/react-dom@18/umd/react-dom.development.js"></script>
|
65 |
+
<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
|
66 |
+
<script src="app.js"></script>
|
67 |
+
</body>
|
68 |
+
</html>
|
index.html
ADDED
@@ -0,0 +1,508 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<html lang="en">
|
2 |
+
<head>
|
3 |
+
<meta charset="UTF-8">
|
4 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
5 |
+
<title>Kuro Browser - Secure Virtual Browsing</title>
|
6 |
+
<link rel="preconnect" href="https://fonts.googleapis.com">
|
7 |
+
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
8 |
+
<link href="https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@300;400;500;700&family=Noto+Sans+JP:wght@400;700&display=swap" rel="stylesheet">
|
9 |
+
<link rel="stylesheet" href="styles.css">
|
10 |
+
</head>
|
11 |
+
<body>
|
12 |
+
<nav class="navbar">
|
13 |
+
<div class="container">
|
14 |
+
<a href="#" class="logo">Kuro Browser</a>
|
15 |
+
<div class="nav-links">
|
16 |
+
<a href="#features">Features</a>
|
17 |
+
<a href="#security">Security</a>
|
18 |
+
<a href="#technology">Technology</a>
|
19 |
+
<a href="#launch-plans">Launch Plans</a>
|
20 |
+
<a href="#faq">FAQ</a>
|
21 |
+
<a href="#brainstorming">Brainstorming</a>
|
22 |
+
<a href="signin.html" class="sign-in-link">Sign In</a>
|
23 |
+
</div>
|
24 |
+
</div>
|
25 |
+
</nav>
|
26 |
+
|
27 |
+
<section class="hero">
|
28 |
+
<div class="animated-stars"></div>
|
29 |
+
<div class="hero-content container">
|
30 |
+
<div class="mission-badge">
|
31 |
+
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
32 |
+
<path d="M12 2L2 7l10 5 10-5-10-5zM2 17l10 5 10-5M2 12l10 5 10-5"/>
|
33 |
+
</svg>
|
34 |
+
Your Secure Gateway
|
35 |
+
</div>
|
36 |
+
<h1>Experience the Web, Reimagined</h1>
|
37 |
+
<p>Aetheria offers a secure, private, and personalized virtual browser accessible from any device. Protect your data and browse with complete peace of mind.</p>
|
38 |
+
<a href="#" class="cta-button">Start Browsing Securely
|
39 |
+
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
40 |
+
<path d="M5 12h14M12 5l7 7-7 7"/>
|
41 |
+
</svg>
|
42 |
+
</a>
|
43 |
+
</div>
|
44 |
+
</section>
|
45 |
+
|
46 |
+
<section class="features section" id="features">
|
47 |
+
<div class="container">
|
48 |
+
<div class="feature-card">
|
49 |
+
<div class="feature-icon">
|
50 |
+
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
51 |
+
<path d="M12 2L2 7l10 5 10-5-10-5zM2 17l10 5 10-5M2 12l10 5 10-5"/>
|
52 |
+
</svg>
|
53 |
+
</div>
|
54 |
+
<h3>Personalized Browsing</h3>
|
55 |
+
<p>Customize your browsing environment with themes, extensions, and settings, making it truly yours.</p>
|
56 |
+
</div>
|
57 |
+
<div class="feature-card">
|
58 |
+
<div class="feature-icon">
|
59 |
+
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
60 |
+
<path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"/>
|
61 |
+
</svg>
|
62 |
+
</div>
|
63 |
+
<h3>Cross-Device Access</h3>
|
64 |
+
<p>Access your virtual browser and settings from any device, ensuring a consistent browsing experience.</p>
|
65 |
+
</div>
|
66 |
+
<div class="feature-card">
|
67 |
+
<div class="feature-icon">
|
68 |
+
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
69 |
+
<circle cx="12" cy="12" r="3"/><path d="M19.4 15a1.65 1.65 0 00.33 1.82l.06.06a2 2 0 010 2.83 2 2 0 01-2.83 0l-.06-.06a1.65 1.65 0 00-1.82-.33 1.65 1.65 0 00-1 1.51V21a2 2 0 01-2 2 2 2 0 01-2-2v-.09A1.65 1.65 0 009 19.4a1.65 1.65 0 00-1.82.33l-.06.06a2 2 0 01-2.83 0 2 2 0 010-2.83l.06-.06a1.65 1.65 0 00.33-1.82 1.65 1.65 0 00-1.51-1H3a2 2 0 01-2-2 2 2 0 012-2h.09A1.65 1.65 0 004.6 9a1.65 1.65 0 00-.33-1.82l-.06-.06a2 2 0 010-2.83 2 2 0 012.83 0l.06.06a1.65 1.65 0 001.82.33H9a1.65 1.65 0 001-1.51V3a2 2 0 012-2 2 2 0 012 2v.09a1.65 1.65 0 001 1.51 1.65 1.65 0 001.82-.33l.06-.06a2 2 0 012.83 0 2 2 0 010 2.83l-.06.06a1.65 1.65 0 00-.33 1.82V9a1.65 1.65 0 001.51 1H21a2 2 0 012 2 2 2 0 01-2 2h-.09a1.65 1.65 0 00-1.51 1z"/>
|
70 |
+
</svg>
|
71 |
+
</div>
|
72 |
+
<h3>Enhanced Privacy</h3>
|
73 |
+
<p>Keep your browsing history and data private with our advanced security features and privacy options.</p>
|
74 |
+
</div>
|
75 |
+
<div class="feature-card">
|
76 |
+
<div class="feature-icon">
|
77 |
+
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
78 |
+
<path d="M19 21l-7-5-7 5V5a2 2 0 0 1 2-2h10a2 2 0 0 1 2 2z"/>
|
79 |
+
</svg>
|
80 |
+
</div>
|
81 |
+
<h3>Secure File Storage</h3>
|
82 |
+
<p>Store your important files securely within Aetheria, accessible from any device, any time.</p>
|
83 |
+
</div>
|
84 |
+
<div class="feature-card">
|
85 |
+
<div class="feature-icon">
|
86 |
+
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
87 |
+
<path d="M16 17l-4-4-4 4m0-8l4 4 4-4M21 3l-2.8 2.8c-.5.5-1.4.5-2 0L12 5l-3.2 1.8c-.5.5-1.4.5-2 0L3 3"/>
|
88 |
+
</svg>
|
89 |
+
</div>
|
90 |
+
<h3>Real-Time Threat Detection</h3>
|
91 |
+
<p>Our advanced system monitors and prevents threats in real-time, safeguarding your browsing experience.</p>
|
92 |
+
</div>
|
93 |
+
<div class="feature-card">
|
94 |
+
<div class="feature-icon">
|
95 |
+
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
96 |
+
<path d="M2 3h6a4 4 0 0 1 4 4v14a3 3 0 0 0-3-3H2z"/>
|
97 |
+
<path d="M22 3h-6a4 4 0 0 0-4 4v14a3 3 0 0 1 3-3h5z"/>
|
98 |
+
</svg>
|
99 |
+
</div>
|
100 |
+
<h3>Multiple Sessions</h3>
|
101 |
+
<p>Run multiple browsing sessions simultaneously, boosting your productivity and organization.</p>
|
102 |
+
</div>
|
103 |
+
</div>
|
104 |
+
</section>
|
105 |
+
|
106 |
+
<section class="security section" id="security">
|
107 |
+
<div class="container">
|
108 |
+
<h2>Interactive Exploration of Your Digital World</h2>
|
109 |
+
<p>Dive into a new dimension of control, privacy, and customization. Aetheria is not just a browser, it's your personal digital sanctuary.</p>
|
110 |
+
<div class="interactive-grid">
|
111 |
+
<div class="interactive-item" data-modal="data-encryption">
|
112 |
+
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
113 |
+
<path d="M12 15v6m-4-2h8M7 7h10a2 2 0 0 1 2 2v6a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V9a2 2 0 0 1 2-2z"/>
|
114 |
+
</svg>
|
115 |
+
<h3>Data Encryption</h3>
|
116 |
+
<p>Explore the advanced encryption protocols that protect your data.</p>
|
117 |
+
</div>
|
118 |
+
<div class="interactive-item" data-modal="anonymous-browsing">
|
119 |
+
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
120 |
+
<path d="M17.5 17.5a3.5 3.5 0 10-5-5 3.5 3.5 0 005 5z"/>
|
121 |
+
<path d="M2 12s4-8 10-8 10 8 10 8-4 8-10 8-10-8-10-8z"/>
|
122 |
+
</svg>
|
123 |
+
<h3>Anonymous Browsing</h3>
|
124 |
+
<p>Uncover how we mask your IP and prevent tracking.</p>
|
125 |
+
</div>
|
126 |
+
<div class="interactive-item" data-modal="sandboxed-environment">
|
127 |
+
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
128 |
+
<rect x="3" y="3" width="18" height="18" rx="2" ry="2"/><path d="M17 7v10M7 7v10"/>
|
129 |
+
</svg>
|
130 |
+
<h3>Sandboxed Environment</h3>
|
131 |
+
<p>Understand how our virtual environment safeguards your system.</p>
|
132 |
+
</div>
|
133 |
+
<div class="interactive-item" data-modal="realtime-threat-detection">
|
134 |
+
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
135 |
+
<path d="M16 17l-4-4-4 4m0-8l4 4 4-4M21 3l-2.8 2.8c-.5.5-1.4.5-2 0L12 5l-3.2 1.8c-.5.5-1.4.5-2 0L3 3"/>
|
136 |
+
</svg>
|
137 |
+
<h3>Real-time Threat Detection</h3>
|
138 |
+
<p>See how we continuously monitor and prevent security compromises.</p>
|
139 |
+
</div>
|
140 |
+
<div class="interactive-item" data-modal="personalized-themes">
|
141 |
+
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
142 |
+
<path d="M3 9l9-7 9 7-9 7-9-7zm0 5l9 7 9-7-9-7-9 7z"/>
|
143 |
+
</svg>
|
144 |
+
<h3>Personalized Themes</h3>
|
145 |
+
<p>Explore the array of themes that will allow you to tailor your browsing experience.</p>
|
146 |
+
</div>
|
147 |
+
<div class="interactive-item" data-modal="cross-device-access">
|
148 |
+
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
149 |
+
<path d="M22 12a10 10 0 0 1-10 10 10 10 0 0 1-10-10 10 10 0 0 1 10-10 10 10 0 0 1 10 10z"/>
|
150 |
+
<path d="M12 12v8"/>
|
151 |
+
<path d="M4 20a8 8 0 0 0 16 0"/>
|
152 |
+
</svg>
|
153 |
+
<h3>Cross-Device Access</h3>
|
154 |
+
<p>Learn how Aetheria seamlessly syncs across all your devices.</p>
|
155 |
+
</div>
|
156 |
+
</div>
|
157 |
+
</div>
|
158 |
+
</section>
|
159 |
+
|
160 |
+
<div class="interactive-modal" id="data-encryption">
|
161 |
+
<div class="interactive-modal-content">
|
162 |
+
<span class="interactive-modal-close">×</span>
|
163 |
+
<h2>Data Encryption</h2>
|
164 |
+
<p>Aetheria employs state-of-the-art encryption techniques to safeguard your data. All data transmitted and stored within Aetheria is encrypted, providing the highest level of protection. You can explore our protocols and learn more about how we prioritize your privacy. Your peace of mind is our priority.</p>
|
165 |
+
</div>
|
166 |
+
</div>
|
167 |
+
<div class="interactive-modal" id="anonymous-browsing">
|
168 |
+
<div class="interactive-modal-content">
|
169 |
+
<span class="interactive-modal-close">×</span>
|
170 |
+
<h2>Anonymous Browsing</h2>
|
171 |
+
<p>With Aetheria, you can browse the web without leaving a trace. Our advanced system masks your IP address and prevents tracking, ensuring your anonymity and privacy. You can delve into our anonymity protocols and understand how Aetheria keeps your browsing activity truly private. Explore freely without any worry.</p>
|
172 |
+
</div>
|
173 |
+
</div>
|
174 |
+
<div class="interactive-modal" id="sandboxed-environment">
|
175 |
+
<div class="interactive-modal-content">
|
176 |
+
<span class="interactive-modal-close">×</span>
|
177 |
+
<h2>Sandboxed Environment</h2>
|
178 |
+
<p>Aetheria's sandboxed environment isolates your browsing sessions, preventing malware and tracking cookies from affecting your system. This means you can explore the web without any fear of malicious software or intrusive tracking. It is your own virtual safe zone within the web.</p>
|
179 |
+
</div>
|
180 |
+
</div>
|
181 |
+
<div class="interactive-modal" id="realtime-threat-detection">
|
182 |
+
<div class="interactive-modal-content">
|
183 |
+
<span class="interactive-modal-close">×</span>
|
184 |
+
<h2>Real-time Threat Detection</h2>
|
185 |
+
<p>Aetheria continuously monitors your browsing activity in real-time to detect and prevent potential security threats, ensuring a safe and secure browsing experience.</p>
|
186 |
+
</div>
|
187 |
+
</div>
|
188 |
+
<div class="interactive-modal" id="personalized-themes">
|
189 |
+
<div class="interactive-modal-content">
|
190 |
+
<span class="interactive-modal-close">×</span>
|
191 |
+
<h2>Personalized Themes</h2>
|
192 |
+
<p>Aetheria offers a wide range of personalized themes, allowing you to customize your browsing experience to suit your preferences. From minimalistic designs to vibrant colors, you can choose the perfect theme to match your personality.</p>
|
193 |
+
</div>
|
194 |
+
</div>
|
195 |
+
<div class="interactive-modal" id="cross-device-access">
|
196 |
+
<div class="interactive-modal-content">
|
197 |
+
<span class="interactive-modal-close">×</span>
|
198 |
+
<h2>Cross-Device Access</h2>
|
199 |
+
<p>Aetheria allows you to access your virtual browser and settings from any device, ensuring a consistent browsing experience across all your devices. With Aetheria, you can start browsing on one device and pick up where you left off on another, seamlessly.</p>
|
200 |
+
</div>
|
201 |
+
</div>
|
202 |
+
<section class="user-experience section" id="user-experience">
|
203 |
+
<div class="container">
|
204 |
+
<h2>Reimagine Your Digital Journey</h2>
|
205 |
+
<p>Aetheria is more than a browser - it's a personalized digital ecosystem that adapts to your unique needs.</p>
|
206 |
+
|
207 |
+
<div class="experience-showcase">
|
208 |
+
<div class="experience-card">
|
209 |
+
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
210 |
+
<path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 16c-3.31 0-6-2.69-6-6s2.69-6 6-6 6 2.69 6 6-2.69 6-6 6z"/>
|
211 |
+
<path d="M13 9h-2v2h2V9zm0 4h-2v2h2v-2z"/>
|
212 |
+
</svg>
|
213 |
+
<h3>Adaptive Intelligence</h3>
|
214 |
+
<p>Our AI learns your browsing patterns, suggesting optimal experiences and privacy settings.</p>
|
215 |
+
<button class="learn-more-btn">How It Works</button>
|
216 |
+
</div>
|
217 |
+
|
218 |
+
<div class="experience-card">
|
219 |
+
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
220 |
+
<path d="M10 19l-7-7 7-7"/>
|
221 |
+
<path d="M19 19l-7-7 7-7"/>
|
222 |
+
</svg>
|
223 |
+
<h3>Seamless Transitions</h3>
|
224 |
+
<p>Switch between devices, workspaces, and browsing modes without losing context.</p>
|
225 |
+
<button class="learn-more-btn">Explore Transitions</button>
|
226 |
+
</div>
|
227 |
+
|
228 |
+
<div class="experience-card">
|
229 |
+
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
230 |
+
<circle cx="12" cy="12" r="10"/>
|
231 |
+
<path d="M9.09 9a3 3 0 015.83 1c0 2-3 3-3 3"/>
|
232 |
+
<line x1="12" y1="17" x2="12.01" y2="17"/>
|
233 |
+
</svg>
|
234 |
+
<h3>Contextual Privacy</h3>
|
235 |
+
<p>Intelligent privacy modes that automatically adjust based on your browsing context.</p>
|
236 |
+
<button class="learn-more-btn">Privacy Insights</button>
|
237 |
+
</div>
|
238 |
+
</div>
|
239 |
+
|
240 |
+
<div class="experience-testimonial">
|
241 |
+
<blockquote>
|
242 |
+
"Aetheria doesn't just protect my browsing - it transforms how I interact with the digital world."
|
243 |
+
<footer>— Alex Rodriguez, Tech Innovator</footer>
|
244 |
+
</blockquote>
|
245 |
+
</div>
|
246 |
+
</div>
|
247 |
+
</section>
|
248 |
+
|
249 |
+
<section class="advanced-features section" id="advanced-features">
|
250 |
+
<div class="container">
|
251 |
+
<h2>Beyond Boundaries: Advanced Features</h2>
|
252 |
+
<div class="features-grid">
|
253 |
+
<div class="advanced-feature">
|
254 |
+
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
255 |
+
<path d="M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2"/>
|
256 |
+
<circle cx="12" cy="7" r="4"/>
|
257 |
+
</svg>
|
258 |
+
<h3>Persona Management</h3>
|
259 |
+
<p>Create multiple digital personas for different contexts: work, personal, research.</p>
|
260 |
+
</div>
|
261 |
+
<div class="advanced-feature">
|
262 |
+
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
263 |
+
<path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"/>
|
264 |
+
<rect x="8" y="2" width="8" height="4" rx="1" ry="1"/>
|
265 |
+
</svg>
|
266 |
+
<h3>Dynamic Content Isolation</h3>
|
267 |
+
<p>Separate browsing contexts to prevent cross-site tracking and data leakage.</p>
|
268 |
+
</div>
|
269 |
+
<div class="advanced-feature">
|
270 |
+
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
271 |
+
<polygon points="12 2 2 7 12 12 22 7 12 2"/>
|
272 |
+
<polyline points="2 17 12 22 22 17"/>
|
273 |
+
<polyline points="2 12 12 17 22 12"/>
|
274 |
+
</svg>
|
275 |
+
<h3>Knowledge Layers</h3>
|
276 |
+
<p>Intelligent content categorization and smart bookmarking across browsing sessions.</p>
|
277 |
+
</div>
|
278 |
+
</div>
|
279 |
+
</div>
|
280 |
+
</section>
|
281 |
+
|
282 |
+
<section class="community-interaction section" id="community">
|
283 |
+
<div class="container">
|
284 |
+
<h2>Join the Aetheria Community</h2>
|
285 |
+
<div class="community-grid">
|
286 |
+
<div class="community-card">
|
287 |
+
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
288 |
+
<path d="M17 8h2a2 2 0 0 1 2 2v6a2 2 0 0 1-2 2h-2v4l-4-4H9a1.5 1.5 0 0 1-1.5-1.5v-6A1.5 1.5 0 0 1 9 8h8z"/>
|
289 |
+
<path d="M9 8V6a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v6a2 2 0 0 1-2 2h-2v4l-4-4H9a1.5 1.5 0 0 1-1.5-1.5v-6A1.5 1.5 0 0 1 9 8z"/>
|
290 |
+
</svg>
|
291 |
+
<h3>Community Forum</h3>
|
292 |
+
<p>Connect with other Aetheria users, share experiences, and get support.</p>
|
293 |
+
<button class="community-btn">Join Discussion</button>
|
294 |
+
</div>
|
295 |
+
<div class="community-card">
|
296 |
+
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
297 |
+
<path d="M21 11.5a8.38 8.38 0 0 1-.9 3.8 8.5 8.5 0 0 1-7.6 4.7 8.38 8.38 0 0 1-3.8-.9L3 21l1.9-5.7a8.38 8.38 0 0 1-.9-3.8 8.5 8.5 0 0 1 4.7-7.6 8.38 8.38 0 0 1 3.8-.9h.5a8.48 8.48 0 0 1 8 8v.5z"/>
|
298 |
+
</svg>
|
299 |
+
<h3>Beta Tester Program</h3>
|
300 |
+
<p>Help shape the future of Aetheria by becoming an early feedback contributor.</p>
|
301 |
+
<button class="community-btn">Apply Now</button>
|
302 |
+
</div>
|
303 |
+
<div class="community-card">
|
304 |
+
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
305 |
+
<rect x="3" y="3" width="18" height="18" rx="2"/>
|
306 |
+
<path d="M3 9h18M9 21V9"/>
|
307 |
+
</svg>
|
308 |
+
<h3>Roadmap Collaboration</h3>
|
309 |
+
<p>Vote on features and contribute to our product development roadmap.</p>
|
310 |
+
<button class="community-btn">Collaborate</button>
|
311 |
+
</div>
|
312 |
+
</div>
|
313 |
+
</div>
|
314 |
+
</section>
|
315 |
+
|
316 |
+
<section class="early-access section" id="early-access">
|
317 |
+
<div class="container">
|
318 |
+
<h2>Get Early Access</h2>
|
319 |
+
<form id="early-access-form" class="early-access-form">
|
320 |
+
<input type="email" placeholder="Enter your email" required>
|
321 |
+
<select required>
|
322 |
+
<option value="">Select Your Primary Use Case</option>
|
323 |
+
<option value="personal">Personal Browsing</option>
|
324 |
+
<option value="business">Business</option>
|
325 |
+
<option value="research">Research</option>
|
326 |
+
<option value="privacy">Privacy Focused</option>
|
327 |
+
</select>
|
328 |
+
<button type="submit">Request Invite</button>
|
329 |
+
</form>
|
330 |
+
</div>
|
331 |
+
</section>
|
332 |
+
|
333 |
+
<section class="innovation-journey section" id="innovation">
|
334 |
+
<div class="container">
|
335 |
+
<h2>Your Digital Innovation Journey</h2>
|
336 |
+
<div class="innovation-timeline">
|
337 |
+
<div class="timeline-item">
|
338 |
+
<div class="timeline-icon">🚀</div>
|
339 |
+
<div class="timeline-content">
|
340 |
+
<h3>Conceptualization</h3>
|
341 |
+
<p>Where groundbreaking ideas transform into revolutionary technology.</p>
|
342 |
+
</div>
|
343 |
+
</div>
|
344 |
+
<div class="timeline-item">
|
345 |
+
<div class="timeline-icon">🔬</div>
|
346 |
+
<div class="timeline-content">
|
347 |
+
<h3>Advanced Research</h3>
|
348 |
+
<p>Continuous exploration of cutting-edge privacy and security technologies.</p>
|
349 |
+
</div>
|
350 |
+
</div>
|
351 |
+
<div class="timeline-item">
|
352 |
+
<div class="timeline-icon">🌐</div>
|
353 |
+
<div class="timeline-content">
|
354 |
+
<h3>Global Integration</h3>
|
355 |
+
<p>Connecting innovators, researchers, and privacy enthusiasts worldwide.</p>
|
356 |
+
</div>
|
357 |
+
</div>
|
358 |
+
</div>
|
359 |
+
</div>
|
360 |
+
</section>
|
361 |
+
|
362 |
+
<section class="interactive-playground section" id="playground">
|
363 |
+
<div class="container">
|
364 |
+
<h2>Your Digital Playground</h2>
|
365 |
+
<p>Explore, experiment, and experience the future of browsing.</p>
|
366 |
+
<div class="playground-grid">
|
367 |
+
<div class="playground-card" data-tooltip="Customize your browsing environment">
|
368 |
+
<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" viewBox="0 0 24 24">
|
369 |
+
<path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 16c-3.31 0-6-2.69-6-6s2.69-6 6-6 6 2.69 6 6-2.69 6-6 6z"/>
|
370 |
+
</svg>
|
371 |
+
<h3>Personalization Hub</h3>
|
372 |
+
</div>
|
373 |
+
<div class="playground-card" data-tooltip="Experiment with privacy modes">
|
374 |
+
<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" viewBox="0 0 24 24">
|
375 |
+
<path d="M12 1L3 5v6c0 5.55 3.84 10.74 9 12 5.16-1.26 9-6.45 9-12V5l-9-4z"/>
|
376 |
+
</svg>
|
377 |
+
<h3>Privacy Laboratory</h3>
|
378 |
+
</div>
|
379 |
+
<div class="playground-card" data-tooltip="Discover new browsing paradigms">
|
380 |
+
<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" viewBox="0 0 24 24">
|
381 |
+
<path d="M9 21c0 .55.45 1 1 1h4c.55 0 1-.45 1-1v-1H9v1zm3-19C8.14 2 5 5.14 5 9c0 2.38 1.19 4.47 3 5.74V17c0 .55.45 1 1 1h6c.55 0 1-.45 1-1v-2.26c1.81-1.27 3-3.36 3-5.74 0-3.86-3.14-7-7-7zm2.85 11.1l-.85.6V16h-4v-2.3l-.85-.6A4.997 4.997 0 0 1 7 9c0-2.76 2.24-5 5-5s5 2.24 5 5c0 1.63-.8 3.16-2.15 4.1z"/>
|
382 |
+
</svg>
|
383 |
+
<h3>Innovation Arena</h3>
|
384 |
+
</div>
|
385 |
+
</div>
|
386 |
+
</div>
|
387 |
+
</section>
|
388 |
+
|
389 |
+
<section class="vision-exploration section" id="vision">
|
390 |
+
<div class="container">
|
391 |
+
<h2>Beyond Browsing: A Visionary Expedition</h2>
|
392 |
+
<div class="vision-cards">
|
393 |
+
<div class="vision-card" data-interaction="modal">
|
394 |
+
<h3>Future of Digital Privacy</h3>
|
395 |
+
<p>Explore how Aetheria is redefining digital sovereignty.</p>
|
396 |
+
<button class="vision-trigger">Discover More</button>
|
397 |
+
</div>
|
398 |
+
<div class="vision-card" data-interaction="modal">
|
399 |
+
<h3>Technological Frontiers</h3>
|
400 |
+
<p>Dive into the cutting-edge technologies powering Aetheria.</p>
|
401 |
+
<button class="vision-trigger">Explore Frontiers</button>
|
402 |
+
</div>
|
403 |
+
<div class="vision-card" data-interaction="modal">
|
404 |
+
<h3>Global Privacy Movement</h3>
|
405 |
+
<p>Join our mission to transform digital interactions.</p>
|
406 |
+
<button class="vision-trigger">Join Movement</button>
|
407 |
+
</div>
|
408 |
+
</div>
|
409 |
+
</div>
|
410 |
+
</section>
|
411 |
+
|
412 |
+
<div id="vision-modals" class="vision-modal-container">
|
413 |
+
<!-- Modals for Vision Sections -->
|
414 |
+
<div class="vision-modal" id="privacy-modal">
|
415 |
+
<div class="modal-content">
|
416 |
+
<h2>Digital Privacy Redefined</h2>
|
417 |
+
<p>Aetheria is not just a browser; it's a declaration of digital rights.</p>
|
418 |
+
<button class="modal-close">Close</button>
|
419 |
+
</div>
|
420 |
+
</div>
|
421 |
+
<!-- Similar modals for other vision cards -->
|
422 |
+
</div>
|
423 |
+
|
424 |
+
<section class="kuro-hero">
|
425 |
+
<div class="hero-content">
|
426 |
+
<h1>Secure Your Digital Journey</h1>
|
427 |
+
<p>Experience private, personalized browsing with Kuro Browser. Your virtual gateway to the web.</p>
|
428 |
+
<button class="cta-button">Get Started Now</button>
|
429 |
+
<div class="hero-animation-container">
|
430 |
+
<svg class="hero-svg" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 150 150">
|
431 |
+
<path class="sakura-path" d="M75 20 C70 2, 40 2, 25 30 S30 90 75 115, 120 90, 125 30, 80 2 75 20 Z" fill="none" stroke="#ffb6c1" stroke-width="2" stroke-linecap="round" />
|
432 |
+
<path class="sakura-path" d="M75 40 C60 10, 30 10, 15 40 S20 100 75 125, 130 100, 135 40, 90 10 75 40 Z" fill="none" stroke="#ffb6c1" stroke-width="2" stroke-linecap="round" />
|
433 |
+
</svg>
|
434 |
+
<div class="floating-kanji">
|
435 |
+
<div class="kanji" style="left: 20%; top: 10%;">私</div>
|
436 |
+
<div class="kanji" style="left: 80%; top: 25%;">安</div>
|
437 |
+
<div class="kanji" style="left: 10%; top: 40%;">全</div>
|
438 |
+
<div class="kanji" style="left: 60%; top: 60%;">専</div>
|
439 |
+
<div class="kanji" style="left: 30%; top: 70%;">用</div>
|
440 |
+
</div>
|
441 |
+
</div>
|
442 |
+
</div>
|
443 |
+
</section>
|
444 |
+
|
445 |
+
<footer class="enhanced-footer" style="background-image: url('https://deta.surf/footer-32-yesdither-nomatte.gif'); background-size: cover; background-position: center;">
|
446 |
+
<div class="container">
|
447 |
+
<div class="footer-grid">
|
448 |
+
<div class="footer-column">
|
449 |
+
<h4>Quick Links</h4>
|
450 |
+
<ul>
|
451 |
+
<li><a href="#features">Features</a></li>
|
452 |
+
<li><a href="#security">Security</a></li>
|
453 |
+
<li><a href="#innovation">Our Journey</a></li>
|
454 |
+
</ul>
|
455 |
+
</div>
|
456 |
+
<div class="footer-column">
|
457 |
+
<h4>Community</h4>
|
458 |
+
<ul>
|
459 |
+
<li><a href="#community">Forums</a></li>
|
460 |
+
<li><a href="#beta">Beta Program</a></li>
|
461 |
+
<li><a href="#roadmap">Roadmap</a></li>
|
462 |
+
</ul>
|
463 |
+
</div>
|
464 |
+
<div class="footer-social">
|
465 |
+
<h4>Connect</h4>
|
466 |
+
<div class="social-icons">
|
467 |
+
<a href="#" class="social-icon">Twitter</a>
|
468 |
+
<a href="#" class="social-icon">GitHub</a>
|
469 |
+
<a href="#" class="social-icon">Discord</a>
|
470 |
+
</div>
|
471 |
+
</div>
|
472 |
+
</div>
|
473 |
+
<div class="footer-bottom">
|
474 |
+
<p>© 2023 Kuro Browser. All Rights Reserved.</p>
|
475 |
+
</div>
|
476 |
+
</div>
|
477 |
+
</footer>
|
478 |
+
|
479 |
+
<script src="interactive.js"></script>
|
480 |
+
<script>
|
481 |
+
document.addEventListener('DOMContentLoaded', () => {
|
482 |
+
const ctaButton = document.querySelector('.cta-button');
|
483 |
+
if (ctaButton) {
|
484 |
+
ctaButton.addEventListener('click', () => {
|
485 |
+
alert('Starting your secure browsing experience!');
|
486 |
+
});
|
487 |
+
}
|
488 |
+
|
489 |
+
function getRandomPosition(element) {
|
490 |
+
const containerWidth = document.querySelector('.hero-animation-container').offsetWidth;
|
491 |
+
const containerHeight = document.querySelector('.hero-animation-container').offsetHeight;
|
492 |
+
const elementWidth = element.offsetWidth;
|
493 |
+
const elementHeight = element.offsetHeight;
|
494 |
+
const x = Math.random() * (containerWidth - elementWidth);
|
495 |
+
const y = Math.random() * (containerHeight - elementHeight);
|
496 |
+
return {x, y};
|
497 |
+
}
|
498 |
+
|
499 |
+
const kanjiElements = document.querySelectorAll('.kanji');
|
500 |
+
kanjiElements.forEach(kanji => {
|
501 |
+
const {x, y} = getRandomPosition(kanji);
|
502 |
+
kanji.style.left = `${x}px`;
|
503 |
+
kanji.style.top = `${y}px`;
|
504 |
+
});
|
505 |
+
});
|
506 |
+
</script>
|
507 |
+
</body>
|
508 |
+
</html>
|
interative.js
ADDED
@@ -0,0 +1,170 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
document.addEventListener('DOMContentLoaded', () => {
|
2 |
+
// Interactive Modals
|
3 |
+
const interactiveItems = document.querySelectorAll('.interactive-item');
|
4 |
+
const modals = document.querySelectorAll('.interactive-modal');
|
5 |
+
const interactiveModalCloseButtons = document.querySelectorAll('.interactive-modal-close');
|
6 |
+
|
7 |
+
interactiveItems.forEach(item => {
|
8 |
+
item.addEventListener('click', () => {
|
9 |
+
const modalId = item.getAttribute('data-modal');
|
10 |
+
const modal = document.getElementById(modalId);
|
11 |
+
if (modal) {
|
12 |
+
modal.classList.add('active');
|
13 |
+
}
|
14 |
+
});
|
15 |
+
});
|
16 |
+
|
17 |
+
interactiveModalCloseButtons.forEach(button => {
|
18 |
+
button.addEventListener('click', () => {
|
19 |
+
const modal = button.closest('.interactive-modal');
|
20 |
+
modal.classList.remove('active');
|
21 |
+
});
|
22 |
+
});
|
23 |
+
|
24 |
+
// Early Access Form
|
25 |
+
const earlyAccessForm = document.getElementById('early-access-form');
|
26 |
+
if (earlyAccessForm) {
|
27 |
+
earlyAccessForm.addEventListener('submit', (e) => {
|
28 |
+
e.preventDefault();
|
29 |
+
const email = e.target.querySelector('input').value;
|
30 |
+
const useCase = e.target.querySelector('select').value;
|
31 |
+
|
32 |
+
// Here you would typically send this data to a backend service
|
33 |
+
alert(`Thank you for your interest!\nEmail: ${email}\nUse Case: ${useCase}`);
|
34 |
+
});
|
35 |
+
}
|
36 |
+
|
37 |
+
// Learn More Button Interactions
|
38 |
+
const learnMoreButtons = document.querySelectorAll('.learn-more-btn');
|
39 |
+
learnMoreButtons.forEach(button => {
|
40 |
+
button.addEventListener('click', (e) => {
|
41 |
+
const parentCard = e.target.closest('.experience-card, .advanced-feature');
|
42 |
+
const cardTitle = parentCard.querySelector('h3').textContent;
|
43 |
+
alert(`You want to learn more about: ${cardTitle}. Detailed information coming soon!`);
|
44 |
+
});
|
45 |
+
});
|
46 |
+
|
47 |
+
// New Interactive Elements
|
48 |
+
const playgroundCards = document.querySelectorAll('.playground-card');
|
49 |
+
playgroundCards.forEach(card => {
|
50 |
+
card.addEventListener('mouseenter', () => {
|
51 |
+
const tooltip = card.getAttribute('data-tooltip');
|
52 |
+
const tooltipElement = document.createElement('div');
|
53 |
+
tooltipElement.classList.add('playground-tooltip');
|
54 |
+
tooltipElement.textContent = tooltip;
|
55 |
+
card.appendChild(tooltipElement);
|
56 |
+
});
|
57 |
+
|
58 |
+
card.addEventListener('mouseleave', () => {
|
59 |
+
const tooltip = card.querySelector('.playground-tooltip');
|
60 |
+
if (tooltip) {
|
61 |
+
card.removeChild(tooltip);
|
62 |
+
}
|
63 |
+
});
|
64 |
+
});
|
65 |
+
|
66 |
+
// Vision Section Modals
|
67 |
+
const visionTriggers = document.querySelectorAll('.vision-trigger');
|
68 |
+
const visionModalsContainer = document.getElementById('vision-modals');
|
69 |
+
const visionModalCloseButtons = document.querySelectorAll('.modal-close');
|
70 |
+
|
71 |
+
visionTriggers.forEach(trigger => {
|
72 |
+
trigger.addEventListener('click', (e) => {
|
73 |
+
const card = e.target.closest('.vision-card');
|
74 |
+
const modalId = card.getAttribute('data-modal-target');
|
75 |
+
const modal = document.getElementById(modalId);
|
76 |
+
|
77 |
+
if (modal) {
|
78 |
+
visionModalsContainer.classList.add('active');
|
79 |
+
modal.classList.add('active');
|
80 |
+
}
|
81 |
+
});
|
82 |
+
});
|
83 |
+
|
84 |
+
visionModalCloseButtons.forEach(button => {
|
85 |
+
button.addEventListener('click', () => {
|
86 |
+
visionModalsContainer.classList.remove('active');
|
87 |
+
const activeModal = document.querySelector('.vision-modal.active');
|
88 |
+
if (activeModal) {
|
89 |
+
activeModal.classList.remove('active');
|
90 |
+
}
|
91 |
+
});
|
92 |
+
});
|
93 |
+
|
94 |
+
// Dynamic Text Replacement Effect
|
95 |
+
const reimagineElement = document.querySelector('.hero h1');
|
96 |
+
if (reimagineElement) {
|
97 |
+
const words = ['Transformed', 'Revolutionized', 'Redefined', 'Elevated', 'Unleashed'];
|
98 |
+
let currentWordIndex = 0;
|
99 |
+
|
100 |
+
function animateTextReplacement() {
|
101 |
+
const originalText = 'Reimagined';
|
102 |
+
const targetWord = words[currentWordIndex];
|
103 |
+
const container = document.createElement('div');
|
104 |
+
container.style.display = 'inline-block';
|
105 |
+
container.style.position = 'relative';
|
106 |
+
|
107 |
+
// Create a wrapper for the static text
|
108 |
+
const staticTextSpan = document.createElement('span');
|
109 |
+
staticTextSpan.textContent = 'Experience the Web, ';
|
110 |
+
|
111 |
+
reimagineElement.innerHTML = '';
|
112 |
+
reimagineElement.appendChild(staticTextSpan);
|
113 |
+
reimagineElement.appendChild(container);
|
114 |
+
|
115 |
+
// Cursor effect
|
116 |
+
const cursor = document.createElement('span');
|
117 |
+
cursor.textContent = '_';
|
118 |
+
cursor.style.animation = 'blink 0.7s infinite';
|
119 |
+
cursor.style.marginLeft = '3px';
|
120 |
+
|
121 |
+
// Clear original text
|
122 |
+
function clearText(callback) {
|
123 |
+
let index = originalText.length;
|
124 |
+
const clearIntervalId = setInterval(() => {
|
125 |
+
container.textContent = originalText.slice(0, index);
|
126 |
+
index--;
|
127 |
+
if (index < 0) {
|
128 |
+
clearInterval(clearIntervalId);
|
129 |
+
callback();
|
130 |
+
}
|
131 |
+
}, 50);
|
132 |
+
}
|
133 |
+
|
134 |
+
// Type new text
|
135 |
+
function typeText() {
|
136 |
+
let index = 0;
|
137 |
+
const typeIntervalId = setInterval(() => {
|
138 |
+
container.textContent = targetWord.slice(0, index + 1);
|
139 |
+
index++;
|
140 |
+
|
141 |
+
if (index === targetWord.length) {
|
142 |
+
clearInterval(typeIntervalId);
|
143 |
+
container.appendChild(cursor);
|
144 |
+
|
145 |
+
// Prepare for next iteration
|
146 |
+
setTimeout(() => {
|
147 |
+
currentWordIndex = (currentWordIndex + 1) % words.length;
|
148 |
+
animateTextReplacement();
|
149 |
+
}, 2000);
|
150 |
+
}
|
151 |
+
}, 100);
|
152 |
+
}
|
153 |
+
|
154 |
+
clearText(typeText);
|
155 |
+
}
|
156 |
+
|
157 |
+
// Add style for cursor blinking
|
158 |
+
const style = document.createElement('style');
|
159 |
+
style.textContent = `
|
160 |
+
@keyframes blink {
|
161 |
+
0%, 100% { opacity: 1; }
|
162 |
+
50% { opacity: 0; }
|
163 |
+
}
|
164 |
+
`;
|
165 |
+
document.head.appendChild(style);
|
166 |
+
|
167 |
+
// Start the animation
|
168 |
+
animateTextReplacement();
|
169 |
+
}
|
170 |
+
});
|
nhostClient.js
ADDED
@@ -0,0 +1,9 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
//nhost import kiya
|
2 |
+
const { NhostClient } = require('@nhost/nhost-js');
|
3 |
+
|
4 |
+
const nhost = new NhostClient({
|
5 |
+
subdomain: process.env.NHOST_SUBDOMAIN, //domain name
|
6 |
+
region: process.env.NHOST_REGION, //region env se
|
7 |
+
});
|
8 |
+
|
9 |
+
module.exports = nhost; //isse export kiya ,isse script.js main import kar sake
|
package-lock.json
ADDED
The diff for this file is too large to render.
See raw diff
|
|
package.json
ADDED
@@ -0,0 +1,21 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"name": "hyperbeam-example",
|
3 |
+
"version": "1.0.0",
|
4 |
+
"scripts": {
|
5 |
+
"start": "node server/app.js",
|
6 |
+
"build": "netlify-lambda build functions"
|
7 |
+
},
|
8 |
+
"dependencies": {
|
9 |
+
"@nhost/nhost-js": "^3.2.4",
|
10 |
+
"body-parser": "^1.20.3",
|
11 |
+
"dotenv": "^10.0.0",
|
12 |
+
"express": "^4.21.2",
|
13 |
+
"express-session": "^1.18.1",
|
14 |
+
"node-fetch": "^2.6.7",
|
15 |
+
"serverless-http": "^3.0.0"
|
16 |
+
},
|
17 |
+
"devDependencies": {
|
18 |
+
"netlify-lambda": "^2.0.0",
|
19 |
+
"tailwindcss": "^4.0.1"
|
20 |
+
}
|
21 |
+
}
|
server.js
ADDED
@@ -0,0 +1,101 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
require('dotenv').config();
|
2 |
+
const express = require('express');
|
3 |
+
const fetch = require('node-fetch');
|
4 |
+
const path = require('path');
|
5 |
+
const nhost = require('./nhostClient');
|
6 |
+
|
7 |
+
const app = express();
|
8 |
+
const PORT = process.env.PORT || 3000;
|
9 |
+
|
10 |
+
app.use(express.json());
|
11 |
+
app.use(express.static(path.join(__dirname)));
|
12 |
+
|
13 |
+
async function fetchHyperbeamData() {
|
14 |
+
try {
|
15 |
+
const response = await fetch('https://engine.hyperbeam.com/v0/vm', {
|
16 |
+
method: 'POST',
|
17 |
+
headers: {
|
18 |
+
'Authorization': `Bearer ${process.env.HYPERBEAM_API_KEY}`,
|
19 |
+
'Content-Type': 'application/json'
|
20 |
+
},
|
21 |
+
body: JSON.stringify({})
|
22 |
+
});
|
23 |
+
|
24 |
+
if (!response.ok) {
|
25 |
+
throw new Error(`Failed to create browser: ${response.statusText}`);
|
26 |
+
}
|
27 |
+
|
28 |
+
const data = await response.json();
|
29 |
+
return data.embed_url;
|
30 |
+
} catch (error) {
|
31 |
+
console.error('Error fetching Hyperbeam data:', error);
|
32 |
+
throw error;
|
33 |
+
}
|
34 |
+
}
|
35 |
+
|
36 |
+
app.get('/embed-url', async (req, res) => {
|
37 |
+
try {
|
38 |
+
const token = req.headers.authorization?.split(' ')[1];
|
39 |
+
if (!token) {
|
40 |
+
return res.status(401).json({ error: 'Unauthorized' });
|
41 |
+
}
|
42 |
+
const embedURL = await fetchHyperbeamData();
|
43 |
+
res.json({ embedURL });
|
44 |
+
} catch (error) {
|
45 |
+
res.status(500).json({ error: 'Failed to fetch embed URL' });
|
46 |
+
}
|
47 |
+
});
|
48 |
+
|
49 |
+
app.post('/signup', async (req, res) => {
|
50 |
+
const { email, password } = req.body;
|
51 |
+
try {
|
52 |
+
const { user, error } = await nhost.auth.signUp({
|
53 |
+
email,
|
54 |
+
password,
|
55 |
+
});
|
56 |
+
|
57 |
+
if (error) {
|
58 |
+
return res.status(400).json({ error: error.message });
|
59 |
+
}
|
60 |
+
|
61 |
+
res.status(201).json({ message: 'Sign up successful', user });
|
62 |
+
} catch (error) {
|
63 |
+
res.status(500).json({ error: 'Internal server error' });
|
64 |
+
}
|
65 |
+
});
|
66 |
+
|
67 |
+
app.post('/signin', async (req, res) => {
|
68 |
+
const { email, password } = req.body;
|
69 |
+
try {
|
70 |
+
const { session, error } = await nhost.auth.signIn({
|
71 |
+
email,
|
72 |
+
password,
|
73 |
+
});
|
74 |
+
if (error || !session) {
|
75 |
+
return res.status(400).json({ error: error?.message || 'Sign in failed' });
|
76 |
+
}
|
77 |
+
res.status(200).json({ token: session.accessToken });
|
78 |
+
} catch (error) {
|
79 |
+
res.status(500).json({ error: 'Internal server error' });
|
80 |
+
}
|
81 |
+
});
|
82 |
+
|
83 |
+
app.post('/signout', async (req, res) => {
|
84 |
+
try {
|
85 |
+
const { error } = await nhost.auth.signOut();
|
86 |
+
if (error) {
|
87 |
+
return res.status(400).json({ error: error.message });
|
88 |
+
}
|
89 |
+
res.status(200).json({ message: 'Signed out successfully' });
|
90 |
+
} catch (error) {
|
91 |
+
res.status(500).json({ error: 'Internal server error' });
|
92 |
+
}
|
93 |
+
});
|
94 |
+
|
95 |
+
app.get('/', (req, res) => {
|
96 |
+
res.sendFile(path.join(__dirname, 'index.html'));
|
97 |
+
});
|
98 |
+
|
99 |
+
app.listen(PORT, () => {
|
100 |
+
console.log(`Server running on http://localhost:${PORT}`);
|
101 |
+
});
|
signin-styles.css
ADDED
@@ -0,0 +1,199 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
:root {
|
2 |
+
--zen-background: #f0f4f0;
|
3 |
+
--moss-green: #6b8e23;
|
4 |
+
--stone-gray: #8b8989;
|
5 |
+
--bamboo-text: #2c4b36;
|
6 |
+
--water-accent: #87ceeb;
|
7 |
+
}
|
8 |
+
|
9 |
+
* {
|
10 |
+
margin: 0;
|
11 |
+
padding: 0;
|
12 |
+
box-sizing: border-box;
|
13 |
+
}
|
14 |
+
|
15 |
+
body {
|
16 |
+
font-family: 'Noto Sans JP', sans-serif;
|
17 |
+
background-color: var(--zen-background);
|
18 |
+
display: flex;
|
19 |
+
justify-content: center;
|
20 |
+
align-items: center;
|
21 |
+
min-height: 100vh;
|
22 |
+
overflow: hidden;
|
23 |
+
perspective: 1000px;
|
24 |
+
}
|
25 |
+
|
26 |
+
.zen-container {
|
27 |
+
display: flex;
|
28 |
+
justify-content: center;
|
29 |
+
align-items: center;
|
30 |
+
width: 100%;
|
31 |
+
}
|
32 |
+
|
33 |
+
.signin-panel {
|
34 |
+
position: relative;
|
35 |
+
width: 400px;
|
36 |
+
height: 550px;
|
37 |
+
background-color: white;
|
38 |
+
border-radius: 15px;
|
39 |
+
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1);
|
40 |
+
overflow: hidden;
|
41 |
+
transition: all 0.3s ease;
|
42 |
+
}
|
43 |
+
|
44 |
+
.moss-layer {
|
45 |
+
position: absolute;
|
46 |
+
top: 0;
|
47 |
+
left: 0;
|
48 |
+
width: 100%;
|
49 |
+
height: 100%;
|
50 |
+
background: linear-gradient(135deg, rgba(107, 142, 35, 0.1), rgba(107, 142, 35, 0.03));
|
51 |
+
z-index: 1;
|
52 |
+
}
|
53 |
+
|
54 |
+
.signin-content {
|
55 |
+
position: relative;
|
56 |
+
z-index: 2;
|
57 |
+
padding: 40px;
|
58 |
+
text-align: center;
|
59 |
+
}
|
60 |
+
|
61 |
+
.stone-emblem {
|
62 |
+
width: 100px;
|
63 |
+
height: 100px;
|
64 |
+
margin: 0 auto 20px;
|
65 |
+
transition: transform 0.5s ease;
|
66 |
+
}
|
67 |
+
|
68 |
+
.stone-emblem:hover {
|
69 |
+
transform: rotate(10deg);
|
70 |
+
}
|
71 |
+
|
72 |
+
.stone-emblem svg {
|
73 |
+
width: 100%;
|
74 |
+
height: 100%;
|
75 |
+
}
|
76 |
+
|
77 |
+
h1 {
|
78 |
+
color: var(--bamboo-text);
|
79 |
+
margin-bottom: 30px;
|
80 |
+
font-weight: 300;
|
81 |
+
font-size: 1.2em;
|
82 |
+
line-height: 1.6;
|
83 |
+
}
|
84 |
+
|
85 |
+
.input-stone {
|
86 |
+
position: relative;
|
87 |
+
margin-bottom: 20px;
|
88 |
+
}
|
89 |
+
|
90 |
+
.input-stone input {
|
91 |
+
width: 100%;
|
92 |
+
padding: 15px 15px 15px 50px;
|
93 |
+
border: 1px solid var(--moss-green);
|
94 |
+
border-radius: 10px;
|
95 |
+
background-color: rgba(107, 142, 35, 0.05);
|
96 |
+
color: var(--bamboo-text);
|
97 |
+
outline: none;
|
98 |
+
transition: all 0.3s ease;
|
99 |
+
}
|
100 |
+
|
101 |
+
.input-stone input:focus {
|
102 |
+
box-shadow: 0 0 10px rgba(107, 142, 35, 0.3);
|
103 |
+
border-color: var(--water-accent);
|
104 |
+
}
|
105 |
+
|
106 |
+
.stone-icon {
|
107 |
+
position: absolute;
|
108 |
+
left: 15px;
|
109 |
+
top: 50%;
|
110 |
+
transform: translateY(-50%);
|
111 |
+
opacity: 0.6;
|
112 |
+
}
|
113 |
+
|
114 |
+
.enter-gate {
|
115 |
+
width: 100%;
|
116 |
+
padding: 15px;
|
117 |
+
border: 2px solid var(--moss-green);
|
118 |
+
border-radius: 10px;
|
119 |
+
background-color: transparent;
|
120 |
+
color: var(--bamboo-text);
|
121 |
+
cursor: pointer;
|
122 |
+
transition: all 0.3s ease;
|
123 |
+
text-transform: uppercase;
|
124 |
+
}
|
125 |
+
|
126 |
+
.enter-gate:hover {
|
127 |
+
background-color: var(--moss-green);
|
128 |
+
color: white;
|
129 |
+
}
|
130 |
+
|
131 |
+
.enter-gate:active {
|
132 |
+
transform: scale(0.95);
|
133 |
+
}
|
134 |
+
|
135 |
+
@keyframes shake {
|
136 |
+
0%, 100% { transform: translateX(0); }
|
137 |
+
25% { transform: translateX(-10px); }
|
138 |
+
75% { transform: translateX(10px); }
|
139 |
+
}
|
140 |
+
|
141 |
+
.error-message {
|
142 |
+
text-align: center;
|
143 |
+
margin-top: 10px;
|
144 |
+
color: #ff4444;
|
145 |
+
font-size: 0.9em;
|
146 |
+
}
|
147 |
+
|
148 |
+
.input-stone.error input {
|
149 |
+
border-color: #ff4444;
|
150 |
+
box-shadow: 0 0 10px rgba(255, 68, 68, 0.2);
|
151 |
+
}
|
152 |
+
|
153 |
+
.enter-gate.loading {
|
154 |
+
position: relative;
|
155 |
+
color: transparent;
|
156 |
+
}
|
157 |
+
|
158 |
+
.enter-gate.loading::after {
|
159 |
+
content: "";
|
160 |
+
position: absolute;
|
161 |
+
left: 50%;
|
162 |
+
top: 50%;
|
163 |
+
width: 20px;
|
164 |
+
height: 20px;
|
165 |
+
margin: -10px 0 0 -10px;
|
166 |
+
border: 2px solid #fff;
|
167 |
+
border-top-color: transparent;
|
168 |
+
border-radius: 50%;
|
169 |
+
animation: loading-spin 1s linear infinite;
|
170 |
+
}
|
171 |
+
|
172 |
+
@keyframes loading-spin {
|
173 |
+
to { transform: rotate(360deg); }
|
174 |
+
}
|
175 |
+
|
176 |
+
.zen-footer {
|
177 |
+
display: flex;
|
178 |
+
justify-content: space-between;
|
179 |
+
margin-top: 20px;
|
180 |
+
}
|
181 |
+
|
182 |
+
.zen-footer a {
|
183 |
+
color: var(--bamboo-text);
|
184 |
+
text-decoration: none;
|
185 |
+
font-size: 0.8em;
|
186 |
+
opacity: 0.7;
|
187 |
+
transition: color 0.3s ease;
|
188 |
+
}
|
189 |
+
|
190 |
+
.zen-footer a:hover {
|
191 |
+
color: var(--water-accent);
|
192 |
+
}
|
193 |
+
|
194 |
+
@media (max-width: 450px) {
|
195 |
+
.signin-panel {
|
196 |
+
width: 95%;
|
197 |
+
height: auto;
|
198 |
+
}
|
199 |
+
}
|
signin.html
ADDED
@@ -0,0 +1,43 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<!DOCTYPE html>
|
2 |
+
<html lang="en">
|
3 |
+
<head>
|
4 |
+
<meta charset="UTF-8">
|
5 |
+
<title>Zen Garden Access - Sign In</title>
|
6 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
7 |
+
<link href="https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@200;300;400&display=swap" rel="stylesheet">
|
8 |
+
<link rel="stylesheet" href="signin-styles.css">
|
9 |
+
</head>
|
10 |
+
<body>
|
11 |
+
<div class="zen-container">
|
12 |
+
<div class="signin-panel">
|
13 |
+
<div class="moss-layer"></div>
|
14 |
+
<div class="signin-content">
|
15 |
+
<div class="stone-emblem">
|
16 |
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
|
17 |
+
<path d="M50 10 L85 50 L50 90 L15 50 Z" fill="#4a7c59" stroke="#2c4b36" stroke-width="3"/>
|
18 |
+
<circle cx="50" cy="50" r="25" fill="#6b8e23" opacity="0.6"/>
|
19 |
+
</svg>
|
20 |
+
</div>
|
21 |
+
<h1>庭園の入り口 <br> Garden Passage</h1>
|
22 |
+
<form class="zen-form">
|
23 |
+
<div class="input-stone">
|
24 |
+
<input type="email" placeholder="Path Name (Email)" required autocomplete="username">
|
25 |
+
<div class="stone-icon">🍃</div>
|
26 |
+
</div>
|
27 |
+
<div class="input-stone">
|
28 |
+
<input type="password" placeholder="Secret Passage" required autocomplete="current-password">
|
29 |
+
<div class="stone-icon">🍂</div>
|
30 |
+
</div>
|
31 |
+
<button type="submit" class="enter-gate">Enter Sanctuary</button>
|
32 |
+
</form>
|
33 |
+
<div class="zen-footer">
|
34 |
+
<a href="#" class="forgotten-path">Forgotten Path?</a>
|
35 |
+
<a href="signup.html" class="new-journey">New Journey</a>
|
36 |
+
</div>
|
37 |
+
</div>
|
38 |
+
</div>
|
39 |
+
</div>
|
40 |
+
|
41 |
+
<script src="signin.js"></script>
|
42 |
+
</body>
|
43 |
+
</html>
|
signin.js
ADDED
@@ -0,0 +1,101 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
document.addEventListener('DOMContentLoaded', () => {
|
2 |
+
// Check if user is already signed in
|
3 |
+
const token = localStorage.getItem('authToken');
|
4 |
+
if (token) {
|
5 |
+
window.location.href = '/dashboard.html'; // Redirect to dashboard if already signed in
|
6 |
+
return;
|
7 |
+
}
|
8 |
+
|
9 |
+
const zenForm = document.querySelector('.zen-form');
|
10 |
+
const signinPanel = document.querySelector('.signin-panel');
|
11 |
+
const inputs = zenForm.querySelectorAll('input');
|
12 |
+
|
13 |
+
// Add input validation and interaction
|
14 |
+
inputs.forEach(input => {
|
15 |
+
input.addEventListener('focus', () => {
|
16 |
+
input.parentElement.classList.add('input-focus');
|
17 |
+
});
|
18 |
+
|
19 |
+
input.addEventListener('blur', () => {
|
20 |
+
input.parentElement.classList.remove('input-focus');
|
21 |
+
});
|
22 |
+
});
|
23 |
+
|
24 |
+
// Handle form submission
|
25 |
+
zenForm.addEventListener('submit', async (e) => {
|
26 |
+
e.preventDefault();
|
27 |
+
|
28 |
+
const email = inputs[0].value;
|
29 |
+
const password = inputs[1].value;
|
30 |
+
const submitButton = zenForm.querySelector('.enter-gate');
|
31 |
+
|
32 |
+
try {
|
33 |
+
// Show loading state
|
34 |
+
submitButton.textContent = 'Entering...';
|
35 |
+
submitButton.disabled = true;
|
36 |
+
|
37 |
+
const response = await fetch('/signin', {
|
38 |
+
method: 'POST',
|
39 |
+
headers: { 'Content-Type': 'application/json' },
|
40 |
+
body: JSON.stringify({ email, password }),
|
41 |
+
});
|
42 |
+
|
43 |
+
const data = await response.json();
|
44 |
+
|
45 |
+
if (response.ok) {
|
46 |
+
// Store authentication token
|
47 |
+
localStorage.setItem('authToken', data.token);
|
48 |
+
|
49 |
+
// Success animation
|
50 |
+
signinPanel.style.transform = 'rotateY(180deg)';
|
51 |
+
signinPanel.style.background = 'linear-gradient(135deg, #6b8e23, #87ceeb)';
|
52 |
+
|
53 |
+
setTimeout(() => {
|
54 |
+
window.location.href = '/dashboard.html'; // Redirect to dashboard
|
55 |
+
}, 1000);
|
56 |
+
} else {
|
57 |
+
// Show error message
|
58 |
+
const errorDisplay = document.createElement('div');
|
59 |
+
errorDisplay.className = 'error-message';
|
60 |
+
errorDisplay.textContent = data.error || 'Invalid credentials';
|
61 |
+
zenForm.appendChild(errorDisplay);
|
62 |
+
|
63 |
+
// Shake animation for error
|
64 |
+
signinPanel.style.animation = 'shake 0.5s ease-in-out';
|
65 |
+
|
66 |
+
// Remove error message after 3 seconds
|
67 |
+
setTimeout(() => {
|
68 |
+
errorDisplay.remove();
|
69 |
+
}, 3000);
|
70 |
+
}
|
71 |
+
} catch (error) {
|
72 |
+
console.error('Signin error:', error);
|
73 |
+
// Handle network errors or server being down
|
74 |
+
const errorDisplay = document.createElement('div');
|
75 |
+
errorDisplay.className = 'error-message';
|
76 |
+
errorDisplay.textContent = 'Unable to connect to server. Please try again later.';
|
77 |
+
zenForm.appendChild(errorDisplay);
|
78 |
+
|
79 |
+
setTimeout(() => {
|
80 |
+
errorDisplay.remove();
|
81 |
+
}, 3000);
|
82 |
+
} finally {
|
83 |
+
// Reset button state
|
84 |
+
submitButton.textContent = 'Enter Sanctuary';
|
85 |
+
submitButton.disabled = false;
|
86 |
+
}
|
87 |
+
});
|
88 |
+
});
|
89 |
+
|
90 |
+
// Helper function for authenticated requests
|
91 |
+
window.authenticatedFetch = async (url, options = {}) => {
|
92 |
+
const token = localStorage.getItem('authToken');
|
93 |
+
if (token) {
|
94 |
+
options.headers = {
|
95 |
+
...options.headers,
|
96 |
+
'Authorization': `Bearer ${token}`,
|
97 |
+
};
|
98 |
+
}
|
99 |
+
const response = await fetch(url, options);
|
100 |
+
return response;
|
101 |
+
};
|
signup-styles.css
ADDED
@@ -0,0 +1,180 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
:root {
|
2 |
+
--parchment-bg: #f4e4d0;
|
3 |
+
--ancient-text: #4a3f35;
|
4 |
+
--moss-green: #5d6d4e;
|
5 |
+
--mystical-gold: #c1a257;
|
6 |
+
--shadow-tone: rgba(74, 63, 53, 0.1);
|
7 |
+
}
|
8 |
+
|
9 |
+
* {
|
10 |
+
margin: 0;
|
11 |
+
padding: 0;
|
12 |
+
box-sizing: border-box;
|
13 |
+
}
|
14 |
+
|
15 |
+
body {
|
16 |
+
background: var(--parchment-bg);
|
17 |
+
font-family: 'Cormorant', serif;
|
18 |
+
color: var(--ancient-text);
|
19 |
+
overflow: hidden;
|
20 |
+
}
|
21 |
+
|
22 |
+
.mystical-login-container {
|
23 |
+
display: flex;
|
24 |
+
justify-content: center;
|
25 |
+
align-items: center;
|
26 |
+
min-height: 100vh;
|
27 |
+
position: relative;
|
28 |
+
}
|
29 |
+
|
30 |
+
.magical-background {
|
31 |
+
position: absolute;
|
32 |
+
top: 0;
|
33 |
+
left: 0;
|
34 |
+
width: 100%;
|
35 |
+
height: 100%;
|
36 |
+
background: linear-gradient(
|
37 |
+
135deg,
|
38 |
+
rgba(93, 109, 78, 0.1),
|
39 |
+
rgba(193, 162, 87, 0.05)
|
40 |
+
);
|
41 |
+
z-index: -1;
|
42 |
+
}
|
43 |
+
|
44 |
+
.magical-form-wrapper {
|
45 |
+
background: rgba(244, 228, 208, 0.8);
|
46 |
+
border-radius: 15px;
|
47 |
+
padding: 40px;
|
48 |
+
width: 400px;
|
49 |
+
box-shadow:
|
50 |
+
0 10px 30px var(--shadow-tone),
|
51 |
+
inset 0 0 20px rgba(193, 162, 87, 0.1);
|
52 |
+
position: relative;
|
53 |
+
overflow: hidden;
|
54 |
+
}
|
55 |
+
|
56 |
+
.rune-border {
|
57 |
+
position: absolute;
|
58 |
+
top: -5px;
|
59 |
+
left: -5px;
|
60 |
+
right: -5px;
|
61 |
+
bottom: -5px;
|
62 |
+
background: linear-gradient(
|
63 |
+
45deg,
|
64 |
+
var(--mystical-gold),
|
65 |
+
var(--moss-green)
|
66 |
+
);
|
67 |
+
z-index: -1;
|
68 |
+
filter: blur(5px);
|
69 |
+
opacity: 0.3;
|
70 |
+
}
|
71 |
+
|
72 |
+
.ancient-access-form h1 {
|
73 |
+
font-family: 'Cinzel', serif;
|
74 |
+
text-align: center;
|
75 |
+
color: var(--ancient-text);
|
76 |
+
letter-spacing: 3px;
|
77 |
+
margin-bottom: 30px;
|
78 |
+
}
|
79 |
+
|
80 |
+
.mystical-input-group input {
|
81 |
+
width: 100%;
|
82 |
+
padding: 12px 15px;
|
83 |
+
margin: 15px 0;
|
84 |
+
background: rgba(244, 228, 208, 0.5);
|
85 |
+
border: 1px solid var(--moss-green);
|
86 |
+
border-radius: 5px;
|
87 |
+
color: var(--ancient-text);
|
88 |
+
font-family: 'Cormorant', serif;
|
89 |
+
letter-spacing: 2px;
|
90 |
+
transition: all 0.3s ease;
|
91 |
+
}
|
92 |
+
|
93 |
+
.mystical-input-group input:focus {
|
94 |
+
outline: none;
|
95 |
+
border-color: var(--mystical-gold);
|
96 |
+
box-shadow: 0 0 10px rgba(193, 162, 87, 0.3);
|
97 |
+
}
|
98 |
+
|
99 |
+
.password-container {
|
100 |
+
position: relative;
|
101 |
+
width: 100%;
|
102 |
+
}
|
103 |
+
|
104 |
+
.toggle-password {
|
105 |
+
position: absolute;
|
106 |
+
right: 10px;
|
107 |
+
top: 50%;
|
108 |
+
transform: translateY(-50%);
|
109 |
+
background: none;
|
110 |
+
border: none;
|
111 |
+
cursor: pointer;
|
112 |
+
opacity: 0.6;
|
113 |
+
transition: opacity 0.3s ease;
|
114 |
+
}
|
115 |
+
|
116 |
+
.toggle-password:hover {
|
117 |
+
opacity: 1;
|
118 |
+
}
|
119 |
+
|
120 |
+
.toggle-password .eye-icon {
|
121 |
+
width: 20px;
|
122 |
+
height: 20px;
|
123 |
+
stroke: var(--ancient-text);
|
124 |
+
}
|
125 |
+
|
126 |
+
.password-container input {
|
127 |
+
padding-right: 40px;
|
128 |
+
}
|
129 |
+
|
130 |
+
.mystical-enter-btn {
|
131 |
+
width: 100%;
|
132 |
+
padding: 15px;
|
133 |
+
background: var(--moss-green);
|
134 |
+
color: var(--parchment-bg);
|
135 |
+
border: none;
|
136 |
+
border-radius: 5px;
|
137 |
+
font-family: 'Cinzel', serif;
|
138 |
+
letter-spacing: 3px;
|
139 |
+
cursor: pointer;
|
140 |
+
transition: background 0.3s ease;
|
141 |
+
}
|
142 |
+
|
143 |
+
.mystical-enter-btn:hover {
|
144 |
+
background: var(--mystical-gold);
|
145 |
+
}
|
146 |
+
|
147 |
+
.mystic-links {
|
148 |
+
display: flex;
|
149 |
+
justify-content: space-between;
|
150 |
+
margin-top: 20px;
|
151 |
+
}
|
152 |
+
|
153 |
+
.mystic-link {
|
154 |
+
color: var(--ancient-text);
|
155 |
+
text-decoration: none;
|
156 |
+
font-size: 0.9em;
|
157 |
+
letter-spacing: 1px;
|
158 |
+
position: relative;
|
159 |
+
opacity: 0.7;
|
160 |
+
transition: opacity 0.3s ease;
|
161 |
+
}
|
162 |
+
|
163 |
+
.mystic-link:hover {
|
164 |
+
opacity: 1;
|
165 |
+
}
|
166 |
+
|
167 |
+
.mystic-link::after {
|
168 |
+
content: '';
|
169 |
+
position: absolute;
|
170 |
+
bottom: -3px;
|
171 |
+
left: 0;
|
172 |
+
width: 0;
|
173 |
+
height: 1px;
|
174 |
+
background: var(--ancient-text);
|
175 |
+
transition: width 0.3s ease;
|
176 |
+
}
|
177 |
+
|
178 |
+
.mystic-link:hover::after {
|
179 |
+
width: 100%;
|
180 |
+
}
|
signup.html
ADDED
@@ -0,0 +1,50 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<!DOCTYPE html>
|
2 |
+
<html lang="en">
|
3 |
+
<head>
|
4 |
+
<meta charset="UTF-8">
|
5 |
+
<title>Sanctuary of Secrets - Sign Up</title>
|
6 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
7 |
+
<link href="https://fonts.googleapis.com/css2?family=Cinzel:wght@400;700&family=Cormorant:wght@300;400&display=swap" rel="stylesheet">
|
8 |
+
<link rel="stylesheet" href="signup-styles.css">
|
9 |
+
</head>
|
10 |
+
<body>
|
11 |
+
<div class="mystical-login-container">
|
12 |
+
<div class="magical-form-wrapper">
|
13 |
+
<div class="rune-border"></div>
|
14 |
+
<form class="ancient-access-form">
|
15 |
+
<h1>Create Your Realm</h1>
|
16 |
+
<div class="mystical-input-group">
|
17 |
+
<input type="text" placeholder="CHOSEN NAME" required>
|
18 |
+
<input type="email" placeholder="MYSTICAL EMAIL" required>
|
19 |
+
<div class="password-container">
|
20 |
+
<input type="password" placeholder="SACRED CIPHER" required>
|
21 |
+
<button type="button" class="toggle-password" aria-label="Toggle password visibility">
|
22 |
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="eye-icon">
|
23 |
+
<path d="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"></path>
|
24 |
+
<circle cx="12" cy="12" r="3"></circle>
|
25 |
+
</svg>
|
26 |
+
</button>
|
27 |
+
</div>
|
28 |
+
<div class="password-container">
|
29 |
+
<input type="password" placeholder="CONFIRM SACRED CIPHER" required>
|
30 |
+
<button type="button" class="toggle-password" aria-label="Toggle password visibility">
|
31 |
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="eye-icon">
|
32 |
+
<path d="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"></path>
|
33 |
+
<circle cx="12" cy="12" r="3"></circle>
|
34 |
+
</svg>
|
35 |
+
</button>
|
36 |
+
</div>
|
37 |
+
</div>
|
38 |
+
<button type="submit" class="mystical-enter-btn">Forge Destiny</button>
|
39 |
+
<div class="mystic-links">
|
40 |
+
<a href="signin.html" class="mystic-link">Already Initiated?</a>
|
41 |
+
<a href="#" class="mystic-link">Need Guidance</a>
|
42 |
+
</div>
|
43 |
+
</form>
|
44 |
+
</div>
|
45 |
+
<div class="magical-background"></div>
|
46 |
+
</div>
|
47 |
+
|
48 |
+
<script src="signup.js"></script>
|
49 |
+
</body>
|
50 |
+
</html>
|
signup.js
ADDED
@@ -0,0 +1,107 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
document.addEventListener('DOMContentLoaded', () => {
|
2 |
+
// Check if user is already signed in
|
3 |
+
const token = localStorage.getItem('authToken');
|
4 |
+
if (token) {
|
5 |
+
window.location.href = '/dashboard.html'; // Redirect to dashboard if already signed in
|
6 |
+
return;
|
7 |
+
}
|
8 |
+
|
9 |
+
const form = document.querySelector('.ancient-access-form');
|
10 |
+
const inputs = document.querySelectorAll('.mystical-input-group input');
|
11 |
+
const passwordInputs = document.querySelectorAll('input[type="password"]');
|
12 |
+
const passwordToggleButtons = document.querySelectorAll('.toggle-password');
|
13 |
+
|
14 |
+
// Input focus effects
|
15 |
+
inputs.forEach(input => {
|
16 |
+
input.addEventListener('focus', () => {
|
17 |
+
input.style.transform = 'scale(1.02)';
|
18 |
+
input.style.boxShadow = '0 0 15px rgba(193, 162, 87, 0.3)';
|
19 |
+
});
|
20 |
+
|
21 |
+
input.addEventListener('blur', () => {
|
22 |
+
input.style.transform = 'scale(1)';
|
23 |
+
input.style.boxShadow = 'none';
|
24 |
+
});
|
25 |
+
});
|
26 |
+
|
27 |
+
// Password visibility toggle
|
28 |
+
passwordToggleButtons.forEach((button, index) => {
|
29 |
+
button.addEventListener('click', () => {
|
30 |
+
const input = passwordInputs[index];
|
31 |
+
const eyeIcon = button.querySelector('.eye-icon');
|
32 |
+
|
33 |
+
if (input.type === 'password') {
|
34 |
+
input.type = 'text';
|
35 |
+
eyeIcon.innerHTML = `
|
36 |
+
<path d="M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19m-6.72-1.07a3 3 0 1 1-4.24-4.24"></path>
|
37 |
+
<line x1="1" y1="1" x2="23" y2="23"></line>
|
38 |
+
`;
|
39 |
+
} else {
|
40 |
+
input.type = 'password';
|
41 |
+
eyeIcon.innerHTML = `
|
42 |
+
<path d="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"></path>
|
43 |
+
<circle cx="12" cy="12" r="3"></circle>
|
44 |
+
`;
|
45 |
+
}
|
46 |
+
});
|
47 |
+
});
|
48 |
+
|
49 |
+
// Form submission with API integration
|
50 |
+
form.addEventListener('submit', async (e) => {
|
51 |
+
e.preventDefault();
|
52 |
+
|
53 |
+
// Password validation
|
54 |
+
const [password, confirmPassword] = passwordInputs;
|
55 |
+
if (password.value !== confirmPassword.value) {
|
56 |
+
alert('Sacred Ciphers must align');
|
57 |
+
return;
|
58 |
+
}
|
59 |
+
|
60 |
+
const email = form.querySelector('input[type="email"]').value;
|
61 |
+
const username = form.querySelector('input[type="text"]').value;
|
62 |
+
|
63 |
+
try {
|
64 |
+
const response = await fetch('/signup', {
|
65 |
+
method: 'POST',
|
66 |
+
headers: { 'Content-Type': 'application/json' },
|
67 |
+
body: JSON.stringify({
|
68 |
+
email,
|
69 |
+
password: password.value,
|
70 |
+
username
|
71 |
+
}),
|
72 |
+
});
|
73 |
+
|
74 |
+
const data = await response.json();
|
75 |
+
|
76 |
+
if (response.ok) {
|
77 |
+
// Create a magical reveal effect
|
78 |
+
const formWrapper = document.querySelector('.magical-form-wrapper');
|
79 |
+
formWrapper.style.transition = 'transform 0.5s ease, opacity 0.5s ease';
|
80 |
+
formWrapper.style.transform = 'scale(1.1)';
|
81 |
+
formWrapper.style.opacity = '0';
|
82 |
+
|
83 |
+
alert('Signup successful!');
|
84 |
+
alert('A confirmation email has been sent!');
|
85 |
+
|
86 |
+
setTimeout(() => {
|
87 |
+
window.location.href = 'signin.html';
|
88 |
+
}, 500);
|
89 |
+
} else {
|
90 |
+
const errorSpan = document.createElement('span');
|
91 |
+
errorSpan.style.color = 'red';
|
92 |
+
errorSpan.style.display = 'block';
|
93 |
+
errorSpan.style.textAlign = 'center';
|
94 |
+
errorSpan.style.marginTop = '10px';
|
95 |
+
errorSpan.innerText = data.error;
|
96 |
+
form.appendChild(errorSpan);
|
97 |
+
|
98 |
+
setTimeout(() => {
|
99 |
+
errorSpan.remove();
|
100 |
+
}, 3000);
|
101 |
+
}
|
102 |
+
} catch (error) {
|
103 |
+
console.error('Signup error:', error);
|
104 |
+
alert('A mystical disturbance occurred. Please try again.');
|
105 |
+
}
|
106 |
+
});
|
107 |
+
});
|
styles.css
ADDED
@@ -0,0 +1,1213 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
:root {
|
2 |
+
--space-blue: #0A192F;
|
3 |
+
--star-yellow: #FFD700;
|
4 |
+
--light-blue: #5390D9;
|
5 |
+
--lightest-blue: #97C2FC;
|
6 |
+
--white: #FFFFFF;
|
7 |
+
--text-light: #B3B3B3;
|
8 |
+
--gradient-bg: linear-gradient(135deg, var(--space-blue) 0%, #1E3A8A 100%);
|
9 |
+
--kuro-dark-text: #1a2b4a;
|
10 |
+
--kuro-text-accent: #2c3e50;
|
11 |
+
}
|
12 |
+
|
13 |
+
body {
|
14 |
+
font-family: 'Space Grotesk', sans-serif;
|
15 |
+
margin: 0;
|
16 |
+
padding: 0;
|
17 |
+
line-height: 1.7;
|
18 |
+
color: var(--white);
|
19 |
+
background: var(--space-blue);
|
20 |
+
overflow-x: hidden;
|
21 |
+
}
|
22 |
+
|
23 |
+
.container {
|
24 |
+
width: 90%;
|
25 |
+
max-width: 1200px;
|
26 |
+
margin: 0 auto;
|
27 |
+
}
|
28 |
+
|
29 |
+
.section {
|
30 |
+
padding: 4rem 0;
|
31 |
+
}
|
32 |
+
|
33 |
+
.navbar {
|
34 |
+
background: rgba(10, 25, 47, 0.7);
|
35 |
+
backdrop-filter: blur(10px);
|
36 |
+
position: fixed;
|
37 |
+
top: 0;
|
38 |
+
left: 0;
|
39 |
+
width: 100%;
|
40 |
+
z-index: 1000;
|
41 |
+
padding: 1rem 0;
|
42 |
+
}
|
43 |
+
|
44 |
+
.navbar .container {
|
45 |
+
display: flex;
|
46 |
+
justify-content: space-between;
|
47 |
+
align-items: center;
|
48 |
+
}
|
49 |
+
|
50 |
+
.logo {
|
51 |
+
font-size: 1.8rem;
|
52 |
+
font-weight: 700;
|
53 |
+
color: var(--star-yellow);
|
54 |
+
text-decoration: none;
|
55 |
+
letter-spacing: 1px;
|
56 |
+
transition: color 0.3s ease;
|
57 |
+
}
|
58 |
+
.logo:hover {
|
59 |
+
color: var(--light-blue);
|
60 |
+
}
|
61 |
+
|
62 |
+
|
63 |
+
.nav-links a {
|
64 |
+
text-decoration: none;
|
65 |
+
color: var(--text-light);
|
66 |
+
margin-left: 1.5rem;
|
67 |
+
font-weight: 500;
|
68 |
+
transition: color 0.3s ease;
|
69 |
+
}
|
70 |
+
|
71 |
+
.nav-links a:hover {
|
72 |
+
color: var(--light-blue);
|
73 |
+
}
|
74 |
+
|
75 |
+
.navbar .nav-links .sign-in-link {
|
76 |
+
color: var(--star-yellow);
|
77 |
+
text-decoration: underline;
|
78 |
+
font-weight: 600;
|
79 |
+
transition: opacity 0.3s ease;
|
80 |
+
}
|
81 |
+
|
82 |
+
.navbar .nav-links .sign-in-link:hover {
|
83 |
+
opacity: 0.8;
|
84 |
+
}
|
85 |
+
|
86 |
+
.hero {
|
87 |
+
background: var(--gradient-bg);
|
88 |
+
color: var(--white);
|
89 |
+
text-align: center;
|
90 |
+
padding: 8rem 0;
|
91 |
+
position: relative;
|
92 |
+
overflow: hidden;
|
93 |
+
}
|
94 |
+
|
95 |
+
.hero-content {
|
96 |
+
position: relative;
|
97 |
+
z-index: 1;
|
98 |
+
}
|
99 |
+
|
100 |
+
.hero h1 {
|
101 |
+
font-size: 3.8rem;
|
102 |
+
margin-bottom: 1.5rem;
|
103 |
+
line-height: 1.2;
|
104 |
+
}
|
105 |
+
|
106 |
+
.hero p {
|
107 |
+
font-size: 1.2rem;
|
108 |
+
margin-bottom: 2.5rem;
|
109 |
+
opacity: 0.8;
|
110 |
+
}
|
111 |
+
|
112 |
+
.cta-button {
|
113 |
+
display: inline-flex;
|
114 |
+
align-items: center;
|
115 |
+
padding: 1rem 2rem;
|
116 |
+
background: var(--star-yellow);
|
117 |
+
color: var(--space-blue);
|
118 |
+
border-radius: 50px;
|
119 |
+
text-decoration: none;
|
120 |
+
transition: background-color 0.3s ease, color 0.3s ease;
|
121 |
+
}
|
122 |
+
.cta-button:hover {
|
123 |
+
background: var(--light-blue);
|
124 |
+
color: var(--white);
|
125 |
+
}
|
126 |
+
|
127 |
+
.hero .mission-badge {
|
128 |
+
position: relative;
|
129 |
+
display: inline-block;
|
130 |
+
padding: 0.5rem 1rem;
|
131 |
+
background: rgba(255, 255, 255, 0.1);
|
132 |
+
border-radius: 30px;
|
133 |
+
margin-bottom: 1rem;
|
134 |
+
backdrop-filter: blur(5px);
|
135 |
+
color: var(--text-light);
|
136 |
+
}
|
137 |
+
|
138 |
+
.hero .mission-badge svg {
|
139 |
+
margin-right: 0.5rem;
|
140 |
+
width: 16px;
|
141 |
+
height: 16px;
|
142 |
+
vertical-align: middle;
|
143 |
+
}
|
144 |
+
|
145 |
+
.animated-stars {
|
146 |
+
position: absolute;
|
147 |
+
width: 100%;
|
148 |
+
height: 100%;
|
149 |
+
top: 0;
|
150 |
+
left: 0;
|
151 |
+
opacity: 0.2;
|
152 |
+
pointer-events: none;
|
153 |
+
background-image: url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 16 16' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='2' cy='2' r='0.5' fill='%23ffffff'/%3E%3Ccircle cx='10' cy='5' r='0.5' fill='%23ffffff'/%3E%3Ccircle cx='6' cy='12' r='0.5' fill='%23ffffff'/%3E%3Ccircle cx='14' cy='9' r='0.5' fill='%23ffffff'/%3E%3C/svg%3E");
|
154 |
+
animation: twinkle 60s linear infinite;
|
155 |
+
}
|
156 |
+
|
157 |
+
@keyframes twinkle {
|
158 |
+
0% { background-position: 0 0; }
|
159 |
+
100% { background-position: 100% 100%; }
|
160 |
+
}
|
161 |
+
|
162 |
+
.features {
|
163 |
+
background: var(--space-blue);
|
164 |
+
}
|
165 |
+
|
166 |
+
.features .container {
|
167 |
+
display: grid;
|
168 |
+
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
|
169 |
+
gap: 2rem;
|
170 |
+
text-align: center;
|
171 |
+
}
|
172 |
+
|
173 |
+
.feature-card {
|
174 |
+
background: rgba(255, 255, 255, 0.05);
|
175 |
+
padding: 2rem;
|
176 |
+
border-radius: 10px;
|
177 |
+
box-shadow: 0 4px 10px rgba(0, 0, 0, 0.1);
|
178 |
+
transition: transform 0.3s ease, box-shadow 0.3s ease;
|
179 |
+
}
|
180 |
+
|
181 |
+
.feature-card:hover {
|
182 |
+
transform: translateY(-5px);
|
183 |
+
box-shadow: 0 8px 20px rgba(0, 0, 0, 0.3);
|
184 |
+
}
|
185 |
+
|
186 |
+
.feature-icon {
|
187 |
+
width: 60px;
|
188 |
+
height: 60px;
|
189 |
+
margin: 0 auto 1rem;
|
190 |
+
background: var(--star-yellow);
|
191 |
+
border-radius: 50%;
|
192 |
+
display: flex;
|
193 |
+
align-items: center;
|
194 |
+
justify-content: center;
|
195 |
+
}
|
196 |
+
|
197 |
+
.feature-icon svg {
|
198 |
+
width: 30px;
|
199 |
+
height: 30px;
|
200 |
+
fill: var(--space-blue);
|
201 |
+
}
|
202 |
+
|
203 |
+
.security {
|
204 |
+
background: rgba(255, 255, 255, 0.05);
|
205 |
+
}
|
206 |
+
|
207 |
+
.security .container {
|
208 |
+
text-align: center;
|
209 |
+
}
|
210 |
+
|
211 |
+
.security h2 {
|
212 |
+
font-size: 2.5rem;
|
213 |
+
margin-bottom: 3rem;
|
214 |
+
}
|
215 |
+
|
216 |
+
.security-grid {
|
217 |
+
display: grid;
|
218 |
+
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
|
219 |
+
gap: 2rem;
|
220 |
+
margin-top: 2rem;
|
221 |
+
}
|
222 |
+
|
223 |
+
.security-card {
|
224 |
+
background: rgba(255, 255, 255, 0.05);
|
225 |
+
padding: 2rem;
|
226 |
+
border-radius: 10px;
|
227 |
+
box-shadow: 0 4px 10px rgba(0, 0, 0, 0.1);
|
228 |
+
display: flex;
|
229 |
+
flex-direction: column;
|
230 |
+
align-items: center;
|
231 |
+
transition: transform 0.3s ease, box-shadow 0.3s ease;
|
232 |
+
}
|
233 |
+
|
234 |
+
.security-card:hover {
|
235 |
+
transform: translateY(-5px);
|
236 |
+
box-shadow: 0 8px 20px rgba(0, 0, 0, 0.3);
|
237 |
+
}
|
238 |
+
|
239 |
+
.security-icon {
|
240 |
+
width: 50px;
|
241 |
+
height: 50px;
|
242 |
+
margin-bottom: 1rem;
|
243 |
+
background: var(--light-blue);
|
244 |
+
border-radius: 50%;
|
245 |
+
display: flex;
|
246 |
+
align-items: center;
|
247 |
+
justify-content: center;
|
248 |
+
}
|
249 |
+
|
250 |
+
.security-icon svg {
|
251 |
+
width: 24px;
|
252 |
+
height: 24px;
|
253 |
+
fill: var(--space-blue);
|
254 |
+
}
|
255 |
+
|
256 |
+
.technology-section {
|
257 |
+
background: var(--space-blue);
|
258 |
+
text-align: center;
|
259 |
+
}
|
260 |
+
|
261 |
+
.technology-section h2 {
|
262 |
+
font-size: 2.5rem;
|
263 |
+
margin-bottom: 2rem;
|
264 |
+
}
|
265 |
+
|
266 |
+
.technology-section p {
|
267 |
+
font-size: 1.2rem;
|
268 |
+
margin-bottom: 3rem;
|
269 |
+
opacity: 0.8;
|
270 |
+
}
|
271 |
+
|
272 |
+
.tech-features {
|
273 |
+
display: grid;
|
274 |
+
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
|
275 |
+
gap: 2rem;
|
276 |
+
margin-top: 3rem;
|
277 |
+
}
|
278 |
+
|
279 |
+
.tech-feature {
|
280 |
+
background: rgba(255, 255, 255, 0.05);
|
281 |
+
padding: 1.5rem;
|
282 |
+
border-radius: 10px;
|
283 |
+
transition: transform 0.3s ease, box-shadow 0.3s ease;
|
284 |
+
}
|
285 |
+
|
286 |
+
.tech-feature:hover {
|
287 |
+
transform: translateY(-5px);
|
288 |
+
box-shadow: 0 8px 20px rgba(0, 0, 0, 0.3);
|
289 |
+
}
|
290 |
+
|
291 |
+
.tech-feature svg {
|
292 |
+
width: 40px;
|
293 |
+
height: 40px;
|
294 |
+
margin-bottom: 1rem;
|
295 |
+
color: var(--star-yellow);
|
296 |
+
}
|
297 |
+
.launch-plans {
|
298 |
+
background: rgba(255, 255, 255, 0.05);
|
299 |
+
}
|
300 |
+
|
301 |
+
.launch-plans .container {
|
302 |
+
text-align: center;
|
303 |
+
}
|
304 |
+
.launch-plans h2 {
|
305 |
+
font-size: 2.5rem;
|
306 |
+
margin-bottom: 2rem;
|
307 |
+
}
|
308 |
+
|
309 |
+
.launch-plans p {
|
310 |
+
font-size: 1.2rem;
|
311 |
+
margin-bottom: 3rem;
|
312 |
+
opacity: 0.8;
|
313 |
+
}
|
314 |
+
|
315 |
+
.launch-cards {
|
316 |
+
display: grid;
|
317 |
+
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
|
318 |
+
gap: 2rem;
|
319 |
+
margin-top: 2rem;
|
320 |
+
}
|
321 |
+
|
322 |
+
.launch-card {
|
323 |
+
background: rgba(255, 255, 255, 0.05);
|
324 |
+
padding: 2rem;
|
325 |
+
border-radius: 10px;
|
326 |
+
box-shadow: 0 4px 10px rgba(0, 0, 0, 0.1);
|
327 |
+
transition: transform 0.3s ease, box-shadow 0.3s ease;
|
328 |
+
}
|
329 |
+
|
330 |
+
.launch-card:hover {
|
331 |
+
transform: translateY(-5px);
|
332 |
+
box-shadow: 0 8px 20px rgba(0, 0, 0, 0.3);
|
333 |
+
}
|
334 |
+
|
335 |
+
.launch-card h3 {
|
336 |
+
font-size: 1.5rem;
|
337 |
+
margin-bottom: 0.75rem;
|
338 |
+
}
|
339 |
+
|
340 |
+
.launch-card .price {
|
341 |
+
font-size: 2rem;
|
342 |
+
font-weight: 700;
|
343 |
+
color: var(--star-yellow);
|
344 |
+
margin-bottom: 1.5rem;
|
345 |
+
}
|
346 |
+
|
347 |
+
.launch-card .features-list {
|
348 |
+
margin-bottom: 1.5rem;
|
349 |
+
}
|
350 |
+
|
351 |
+
.launch-card .features-list li {
|
352 |
+
text-align: left;
|
353 |
+
margin-bottom: 0.5rem;
|
354 |
+
}
|
355 |
+
|
356 |
+
.launch-card .features-list li::before {
|
357 |
+
content: "✓ ";
|
358 |
+
color: var(--light-blue);
|
359 |
+
}
|
360 |
+
|
361 |
+
.launch-card a {
|
362 |
+
display: inline-flex;
|
363 |
+
align-items: center;
|
364 |
+
padding: 0.75rem 1.5rem;
|
365 |
+
font-size: 1rem;
|
366 |
+
background: var(--star-yellow);
|
367 |
+
color: var(--space-blue);
|
368 |
+
border-radius: 50px;
|
369 |
+
text-decoration: none;
|
370 |
+
transition: background-color 0.3s ease;
|
371 |
+
}
|
372 |
+
|
373 |
+
.launch-card a:hover {
|
374 |
+
background: var(--light-blue);
|
375 |
+
color: var(--white);
|
376 |
+
}
|
377 |
+
|
378 |
+
.faq-section {
|
379 |
+
background: var(--space-blue);
|
380 |
+
}
|
381 |
+
|
382 |
+
.faq-section .container {
|
383 |
+
text-align: center;
|
384 |
+
}
|
385 |
+
|
386 |
+
.faq-section h2 {
|
387 |
+
font-size: 2.5rem;
|
388 |
+
margin-bottom: 3rem;
|
389 |
+
}
|
390 |
+
|
391 |
+
.faq-item {
|
392 |
+
margin-bottom: 1.5rem;
|
393 |
+
border-bottom: 1px solid rgba(255, 255, 255, 0.1);
|
394 |
+
padding-bottom: 1.5rem;
|
395 |
+
cursor: pointer;
|
396 |
+
}
|
397 |
+
|
398 |
+
.faq-question {
|
399 |
+
font-size: 1.2rem;
|
400 |
+
font-weight: 600;
|
401 |
+
display: flex;
|
402 |
+
justify-content: space-between;
|
403 |
+
align-items: center;
|
404 |
+
}
|
405 |
+
|
406 |
+
.faq-question svg {
|
407 |
+
width: 20px;
|
408 |
+
height: 20px;
|
409 |
+
transition: transform 0.3s ease;
|
410 |
+
}
|
411 |
+
|
412 |
+
.faq-item.active .faq-question svg {
|
413 |
+
transform: rotate(180deg);
|
414 |
+
}
|
415 |
+
|
416 |
+
.faq-answer {
|
417 |
+
font-size: 1rem;
|
418 |
+
margin-top: 1rem;
|
419 |
+
display: none;
|
420 |
+
opacity: 0.8;
|
421 |
+
}
|
422 |
+
|
423 |
+
.faq-item.active .faq-answer {
|
424 |
+
display: block;
|
425 |
+
}
|
426 |
+
|
427 |
+
.footer {
|
428 |
+
background: var(--space-blue);
|
429 |
+
color: var(--text-light);
|
430 |
+
padding: 2rem 0;
|
431 |
+
text-align: center;
|
432 |
+
position: relative;
|
433 |
+
}
|
434 |
+
|
435 |
+
.footer::before {
|
436 |
+
content: '';
|
437 |
+
position: absolute;
|
438 |
+
top: 0;
|
439 |
+
left: 0;
|
440 |
+
right: 0;
|
441 |
+
height: 1px;
|
442 |
+
background: rgba(255, 255, 255, 0.1);
|
443 |
+
}
|
444 |
+
|
445 |
+
.footer p {
|
446 |
+
margin-bottom: 1rem;
|
447 |
+
}
|
448 |
+
|
449 |
+
.footer a {
|
450 |
+
color: var(--text-light);
|
451 |
+
text-decoration: none;
|
452 |
+
margin: 0 0.5rem;
|
453 |
+
}
|
454 |
+
|
455 |
+
@media (max-width: 768px) {
|
456 |
+
.hero h1 {
|
457 |
+
font-size: 2.8rem;
|
458 |
+
}
|
459 |
+
|
460 |
+
.hero p {
|
461 |
+
font-size: 1.1rem;
|
462 |
+
}
|
463 |
+
|
464 |
+
}
|
465 |
+
.brainstorming-ideas {
|
466 |
+
background: var(--space-blue);
|
467 |
+
padding: 4rem 0;
|
468 |
+
text-align: center;
|
469 |
+
}
|
470 |
+
.brainstorming-ideas h2 {
|
471 |
+
font-size: 2.5rem;
|
472 |
+
margin-bottom: 2rem;
|
473 |
+
}
|
474 |
+
|
475 |
+
.brainstorming-ideas ul {
|
476 |
+
text-align: left;
|
477 |
+
max-width: 800px;
|
478 |
+
margin: 2rem auto;
|
479 |
+
}
|
480 |
+
|
481 |
+
.brainstorming-ideas li {
|
482 |
+
margin-bottom: 0.75rem;
|
483 |
+
opacity: 0.8;
|
484 |
+
list-style: none;
|
485 |
+
position: relative;
|
486 |
+
padding-left: 1.5rem;
|
487 |
+
}
|
488 |
+
.brainstorming-ideas li::before {
|
489 |
+
content: "💡";
|
490 |
+
position: absolute;
|
491 |
+
left: 0;
|
492 |
+
color: var(--star-yellow);
|
493 |
+
}
|
494 |
+
|
495 |
+
.interactive-grid {
|
496 |
+
display: grid;
|
497 |
+
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
|
498 |
+
gap: 20px;
|
499 |
+
padding: 2rem 0;
|
500 |
+
}
|
501 |
+
|
502 |
+
.interactive-item {
|
503 |
+
background: rgba(255, 255, 255, 0.05);
|
504 |
+
padding: 2rem;
|
505 |
+
border-radius: 10px;
|
506 |
+
text-align: center;
|
507 |
+
cursor: pointer;
|
508 |
+
transition: transform 0.3s ease, box-shadow 0.3s ease;
|
509 |
+
position: relative;
|
510 |
+
overflow: hidden;
|
511 |
+
}
|
512 |
+
.interactive-item:hover {
|
513 |
+
transform: translateY(-5px);
|
514 |
+
box-shadow: 0 8px 20px rgba(0, 0, 0, 0.3);
|
515 |
+
}
|
516 |
+
|
517 |
+
.interactive-item::before {
|
518 |
+
content: '';
|
519 |
+
position: absolute;
|
520 |
+
top: 0;
|
521 |
+
left: 0;
|
522 |
+
right: 0;
|
523 |
+
height: 5px;
|
524 |
+
background: var(--star-yellow);
|
525 |
+
transform: scaleX(0);
|
526 |
+
transition: transform 0.4s ease-in-out;
|
527 |
+
}
|
528 |
+
.interactive-item:hover::before {
|
529 |
+
transform: scaleX(1);
|
530 |
+
}
|
531 |
+
|
532 |
+
.interactive-item h3 {
|
533 |
+
margin-bottom: 1rem;
|
534 |
+
font-size: 1.4rem;
|
535 |
+
}
|
536 |
+
|
537 |
+
.interactive-item p {
|
538 |
+
font-size: 1.1rem;
|
539 |
+
opacity: 0.8;
|
540 |
+
}
|
541 |
+
|
542 |
+
.interactive-item svg {
|
543 |
+
width: 50px;
|
544 |
+
height: 50px;
|
545 |
+
margin-bottom: 1rem;
|
546 |
+
fill: var(--star-yellow);
|
547 |
+
}
|
548 |
+
|
549 |
+
.interactive-modal {
|
550 |
+
display: none;
|
551 |
+
position: fixed;
|
552 |
+
top: 0;
|
553 |
+
left: 0;
|
554 |
+
width: 100%;
|
555 |
+
height: 100%;
|
556 |
+
background: rgba(0, 0, 0, 0.7);
|
557 |
+
justify-content: center;
|
558 |
+
align-items: center;
|
559 |
+
z-index: 1001;
|
560 |
+
}
|
561 |
+
|
562 |
+
.interactive-modal-content {
|
563 |
+
background: var(--space-blue);
|
564 |
+
padding: 2rem;
|
565 |
+
border-radius: 10px;
|
566 |
+
max-width: 700px;
|
567 |
+
position: relative;
|
568 |
+
}
|
569 |
+
.interactive-modal-content h2 {
|
570 |
+
font-size: 2rem;
|
571 |
+
margin-bottom: 1rem;
|
572 |
+
}
|
573 |
+
.interactive-modal-content p {
|
574 |
+
margin-bottom: 1.5rem;
|
575 |
+
line-height: 1.6;
|
576 |
+
opacity: 0.8;
|
577 |
+
}
|
578 |
+
.interactive-modal-close {
|
579 |
+
position: absolute;
|
580 |
+
top: 10px;
|
581 |
+
right: 10px;
|
582 |
+
font-size: 1.5rem;
|
583 |
+
cursor: pointer;
|
584 |
+
color: var(--text-light);
|
585 |
+
transition: color 0.3s ease;
|
586 |
+
}
|
587 |
+
.interactive-modal-close:hover {
|
588 |
+
color: var(--light-blue);
|
589 |
+
}
|
590 |
+
.interactive-modal.active {
|
591 |
+
display: flex;
|
592 |
+
}
|
593 |
+
|
594 |
+
.user-feedback {
|
595 |
+
background: rgba(255, 255, 255, 0.05);
|
596 |
+
padding: 4rem 0;
|
597 |
+
text-align: center;
|
598 |
+
position: relative;
|
599 |
+
overflow: hidden;
|
600 |
+
}
|
601 |
+
.user-feedback::before {
|
602 |
+
content: '';
|
603 |
+
position: absolute;
|
604 |
+
top: 0;
|
605 |
+
left: 0;
|
606 |
+
right: 0;
|
607 |
+
height: 1px;
|
608 |
+
background: rgba(255, 255, 255, 0.1);
|
609 |
+
}
|
610 |
+
|
611 |
+
.user-feedback h2 {
|
612 |
+
font-size: 2.5rem;
|
613 |
+
margin-bottom: 2rem;
|
614 |
+
}
|
615 |
+
.feedback-slider {
|
616 |
+
display: flex;
|
617 |
+
overflow-x: auto;
|
618 |
+
scroll-snap-type: x mandatory;
|
619 |
+
padding: 2rem 0;
|
620 |
+
}
|
621 |
+
.feedback-card {
|
622 |
+
background: rgba(255, 255, 255, 0.05);
|
623 |
+
padding: 2rem;
|
624 |
+
margin: 0 1rem;
|
625 |
+
border-radius: 10px;
|
626 |
+
box-shadow: 0 4px 10px rgba(0, 0, 0, 0.1);
|
627 |
+
min-width: 300px;
|
628 |
+
flex: none;
|
629 |
+
scroll-snap-align: start;
|
630 |
+
text-align: left;
|
631 |
+
}
|
632 |
+
|
633 |
+
.feedback-card p {
|
634 |
+
font-style: italic;
|
635 |
+
margin-bottom: 1rem;
|
636 |
+
opacity: 0.8;
|
637 |
+
}
|
638 |
+
.feedback-card .user-info {
|
639 |
+
display: flex;
|
640 |
+
align-items: center;
|
641 |
+
}
|
642 |
+
|
643 |
+
.feedback-card .user-avatar {
|
644 |
+
width: 40px;
|
645 |
+
height: 40px;
|
646 |
+
border-radius: 50%;
|
647 |
+
background: var(--light-blue);
|
648 |
+
margin-right: 1rem;
|
649 |
+
display: flex;
|
650 |
+
align-items: center;
|
651 |
+
justify-content: center;
|
652 |
+
}
|
653 |
+
.feedback-card .user-avatar svg {
|
654 |
+
width: 24px;
|
655 |
+
height: 24px;
|
656 |
+
fill: var(--space-blue);
|
657 |
+
}
|
658 |
+
.feedback-card .user-name {
|
659 |
+
font-weight: 600;
|
660 |
+
}
|
661 |
+
|
662 |
+
.community-interaction {
|
663 |
+
background: rgba(255, 255, 255, 0.05);
|
664 |
+
padding: 4rem 0;
|
665 |
+
}
|
666 |
+
|
667 |
+
.community-grid {
|
668 |
+
display: grid;
|
669 |
+
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
|
670 |
+
gap: 2rem;
|
671 |
+
}
|
672 |
+
|
673 |
+
.community-card {
|
674 |
+
background: rgba(255, 255, 255, 0.1);
|
675 |
+
padding: 2rem;
|
676 |
+
border-radius: 10px;
|
677 |
+
text-align: center;
|
678 |
+
transition: transform 0.3s ease, box-shadow 0.3s ease;
|
679 |
+
}
|
680 |
+
|
681 |
+
.community-card:hover {
|
682 |
+
transform: translateY(-10px);
|
683 |
+
box-shadow: 0 15px 30px rgba(0, 0, 0, 0.2);
|
684 |
+
}
|
685 |
+
|
686 |
+
.community-card svg {
|
687 |
+
width: 60px;
|
688 |
+
height: 60px;
|
689 |
+
margin-bottom: 1rem;
|
690 |
+
color: var(--star-yellow);
|
691 |
+
}
|
692 |
+
|
693 |
+
.community-btn {
|
694 |
+
background: var(--light-blue);
|
695 |
+
color: var(--white);
|
696 |
+
border: none;
|
697 |
+
padding: 0.75rem 1.5rem;
|
698 |
+
border-radius: 50px;
|
699 |
+
margin-top: 1rem;
|
700 |
+
cursor: pointer;
|
701 |
+
transition: background 0.3s ease;
|
702 |
+
}
|
703 |
+
|
704 |
+
.community-btn:hover {
|
705 |
+
background: var(--star-yellow);
|
706 |
+
}
|
707 |
+
|
708 |
+
.early-access {
|
709 |
+
background: var(--space-blue);
|
710 |
+
text-align: center;
|
711 |
+
}
|
712 |
+
|
713 |
+
.early-access-form {
|
714 |
+
max-width: 600px;
|
715 |
+
margin: 0 auto;
|
716 |
+
display: flex;
|
717 |
+
flex-direction: column;
|
718 |
+
gap: 1rem;
|
719 |
+
}
|
720 |
+
|
721 |
+
.early-access-form input,
|
722 |
+
.early-access-form select,
|
723 |
+
.early-access-form button {
|
724 |
+
padding: 1rem;
|
725 |
+
border-radius: 5px;
|
726 |
+
border: 1px solid rgba(255,255,255,0.1);
|
727 |
+
background: rgba(255,255,255,0.1);
|
728 |
+
color: var(--white);
|
729 |
+
}
|
730 |
+
|
731 |
+
.early-access-form button {
|
732 |
+
background: var(--star-yellow);
|
733 |
+
color: var(--space-blue);
|
734 |
+
cursor: pointer;
|
735 |
+
transition: background 0.3s ease;
|
736 |
+
}
|
737 |
+
|
738 |
+
.early-access-form button:hover {
|
739 |
+
background: var(--light-blue);
|
740 |
+
}
|
741 |
+
|
742 |
+
.user-experience {
|
743 |
+
background: rgba(255, 255, 255, 0.05);
|
744 |
+
text-align: center;
|
745 |
+
}
|
746 |
+
|
747 |
+
.experience-showcase {
|
748 |
+
display: flex;
|
749 |
+
justify-content: space-between;
|
750 |
+
margin-top: 3rem;
|
751 |
+
gap: 2rem;
|
752 |
+
}
|
753 |
+
|
754 |
+
.experience-card {
|
755 |
+
background: rgba(255, 255, 255, 0.1);
|
756 |
+
padding: 2rem;
|
757 |
+
border-radius: 10px;
|
758 |
+
transition: transform 0.3s ease;
|
759 |
+
}
|
760 |
+
|
761 |
+
.experience-card:hover {
|
762 |
+
transform: translateY(-10px);
|
763 |
+
}
|
764 |
+
|
765 |
+
.learn-more-btn {
|
766 |
+
background: var(--light-blue);
|
767 |
+
color: var(--white);
|
768 |
+
border: none;
|
769 |
+
padding: 0.75rem 1.5rem;
|
770 |
+
border-radius: 50px;
|
771 |
+
margin-top: 1rem;
|
772 |
+
cursor: pointer;
|
773 |
+
transition: background 0.3s ease;
|
774 |
+
}
|
775 |
+
|
776 |
+
.learn-more-btn:hover {
|
777 |
+
background: var(--star-yellow);
|
778 |
+
}
|
779 |
+
|
780 |
+
.experience-testimonial {
|
781 |
+
margin-top: 4rem;
|
782 |
+
font-style: italic;
|
783 |
+
max-width: 700px;
|
784 |
+
margin-left: auto;
|
785 |
+
margin-right: auto;
|
786 |
+
}
|
787 |
+
|
788 |
+
.advanced-features {
|
789 |
+
background: var(--space-blue);
|
790 |
+
}
|
791 |
+
|
792 |
+
.features-grid {
|
793 |
+
display: grid;
|
794 |
+
grid-template-columns: repeat(3, 1fr);
|
795 |
+
gap: 2rem;
|
796 |
+
margin-top: 3rem;
|
797 |
+
}
|
798 |
+
|
799 |
+
.advanced-feature {
|
800 |
+
background: rgba(255, 255, 255, 0.05);
|
801 |
+
padding: 2rem;
|
802 |
+
border-radius: 10px;
|
803 |
+
text-align: center;
|
804 |
+
transition: transform 0.3s ease;
|
805 |
+
}
|
806 |
+
|
807 |
+
.advanced-feature:hover {
|
808 |
+
transform: translateY(-10px);
|
809 |
+
}
|
810 |
+
|
811 |
+
.advanced-feature svg {
|
812 |
+
width: 50px;
|
813 |
+
height: 50px;
|
814 |
+
margin-bottom: 1rem;
|
815 |
+
color: var(--star-yellow);
|
816 |
+
}
|
817 |
+
|
818 |
+
.innovation-journey {
|
819 |
+
background: linear-gradient(135deg, var(--space-blue) 0%, #1A2B4A 100%);
|
820 |
+
text-align: center;
|
821 |
+
}
|
822 |
+
|
823 |
+
.innovation-timeline {
|
824 |
+
display: flex;
|
825 |
+
justify-content: space-between;
|
826 |
+
margin-top: 3rem;
|
827 |
+
}
|
828 |
+
|
829 |
+
.timeline-item {
|
830 |
+
flex: 1;
|
831 |
+
margin: 0 1rem;
|
832 |
+
background: rgba(255, 255, 255, 0.05);
|
833 |
+
padding: 2rem;
|
834 |
+
border-radius: 10px;
|
835 |
+
transition: transform 0.3s ease;
|
836 |
+
}
|
837 |
+
|
838 |
+
.timeline-item:hover {
|
839 |
+
transform: translateY(-10px);
|
840 |
+
}
|
841 |
+
|
842 |
+
.timeline-icon {
|
843 |
+
font-size: 3rem;
|
844 |
+
margin-bottom: 1rem;
|
845 |
+
}
|
846 |
+
|
847 |
+
.interactive-playground {
|
848 |
+
background: var(--space-blue);
|
849 |
+
}
|
850 |
+
|
851 |
+
.playground-grid {
|
852 |
+
display: flex;
|
853 |
+
justify-content: space-around;
|
854 |
+
margin-top: 3rem;
|
855 |
+
}
|
856 |
+
|
857 |
+
.playground-card {
|
858 |
+
text-align: center;
|
859 |
+
background: rgba(255, 255, 255, 0.05);
|
860 |
+
padding: 2rem;
|
861 |
+
border-radius: 10px;
|
862 |
+
cursor: pointer;
|
863 |
+
transition: transform 0.3s ease;
|
864 |
+
position: relative;
|
865 |
+
}
|
866 |
+
|
867 |
+
.playground-card:hover {
|
868 |
+
transform: scale(1.05);
|
869 |
+
}
|
870 |
+
|
871 |
+
.playground-tooltip {
|
872 |
+
position: absolute;
|
873 |
+
bottom: -40px;
|
874 |
+
left: 50%;
|
875 |
+
transform: translateX(-50%);
|
876 |
+
background: var(--star-yellow);
|
877 |
+
color: var(--space-blue);
|
878 |
+
padding: 0.5rem 1rem;
|
879 |
+
border-radius: 5px;
|
880 |
+
white-space: nowrap;
|
881 |
+
}
|
882 |
+
|
883 |
+
.vision-exploration {
|
884 |
+
background: rgba(255, 255, 255, 0.05);
|
885 |
+
}
|
886 |
+
|
887 |
+
.vision-cards {
|
888 |
+
display: flex;
|
889 |
+
justify-content: space-between;
|
890 |
+
}
|
891 |
+
|
892 |
+
.vision-card {
|
893 |
+
flex: 1;
|
894 |
+
margin: 0 1rem;
|
895 |
+
background: var(--space-blue);
|
896 |
+
padding: 2rem;
|
897 |
+
border-radius: 10px;
|
898 |
+
text-align: center;
|
899 |
+
}
|
900 |
+
|
901 |
+
.vision-card .vision-trigger {
|
902 |
+
display: inline-flex;
|
903 |
+
align-items: center;
|
904 |
+
justify-content: center;
|
905 |
+
padding: 0.75rem 1.5rem;
|
906 |
+
background: var(--star-yellow);
|
907 |
+
color: var(--space-blue);
|
908 |
+
border: none;
|
909 |
+
border-radius: 50px;
|
910 |
+
font-weight: 600;
|
911 |
+
text-transform: uppercase;
|
912 |
+
letter-spacing: 1px;
|
913 |
+
transition:
|
914 |
+
background-color 0.3s ease,
|
915 |
+
transform 0.2s ease,
|
916 |
+
box-shadow 0.3s ease;
|
917 |
+
margin-top: 1rem;
|
918 |
+
cursor: pointer;
|
919 |
+
position: relative;
|
920 |
+
overflow: hidden;
|
921 |
+
}
|
922 |
+
|
923 |
+
.vision-card .vision-trigger::before {
|
924 |
+
content: '';
|
925 |
+
position: absolute;
|
926 |
+
top: 0;
|
927 |
+
left: -100%;
|
928 |
+
width: 100%;
|
929 |
+
height: 100%;
|
930 |
+
background: linear-gradient(
|
931 |
+
120deg,
|
932 |
+
transparent,
|
933 |
+
rgba(255,255,255,0.3),
|
934 |
+
transparent
|
935 |
+
);
|
936 |
+
transition: all 0.5s ease;
|
937 |
+
}
|
938 |
+
|
939 |
+
.vision-card .vision-trigger:hover {
|
940 |
+
background: var(--light-blue);
|
941 |
+
color: var(--white);
|
942 |
+
transform: translateY(-3px);
|
943 |
+
box-shadow: 0 4px 15px rgba(0,0,0,0.2);
|
944 |
+
}
|
945 |
+
|
946 |
+
.vision-card .vision-trigger:hover::before {
|
947 |
+
left: 100%;
|
948 |
+
}
|
949 |
+
|
950 |
+
.vision-card .vision-trigger:active {
|
951 |
+
transform: translateY(1px);
|
952 |
+
box-shadow: 0 2px 8px rgba(0,0,0,0.1);
|
953 |
+
}
|
954 |
+
|
955 |
+
.vision-card .vision-trigger::after {
|
956 |
+
content: '→';
|
957 |
+
margin-left: 0.5rem;
|
958 |
+
opacity: 0;
|
959 |
+
transition: opacity 0.3s ease;
|
960 |
+
}
|
961 |
+
|
962 |
+
.vision-card .vision-trigger:hover::after {
|
963 |
+
opacity: 1;
|
964 |
+
}
|
965 |
+
|
966 |
+
.vision-modal-container {
|
967 |
+
display: none;
|
968 |
+
position: fixed;
|
969 |
+
top: 0;
|
970 |
+
left: 0;
|
971 |
+
width: 100%;
|
972 |
+
height: 100%;
|
973 |
+
background: rgba(0, 0, 0, 0.7);
|
974 |
+
z-index: 1000;
|
975 |
+
}
|
976 |
+
|
977 |
+
.vision-modal-container.active {
|
978 |
+
display: flex;
|
979 |
+
justify-content: center;
|
980 |
+
align-items: center;
|
981 |
+
}
|
982 |
+
|
983 |
+
.vision-modal {
|
984 |
+
display: none;
|
985 |
+
background: var(--space-blue);
|
986 |
+
padding: 2rem;
|
987 |
+
border-radius: 10px;
|
988 |
+
max-width: 500px;
|
989 |
+
text-align: center;
|
990 |
+
}
|
991 |
+
|
992 |
+
.vision-modal.active {
|
993 |
+
display: block;
|
994 |
+
}
|
995 |
+
|
996 |
+
.enhanced-footer {
|
997 |
+
background-image: url('https://deta.surf/footer-32-yesdither-nomatte.gif');
|
998 |
+
background-size: cover;
|
999 |
+
background-position: center bottom;
|
1000 |
+
padding-bottom: 6rem;
|
1001 |
+
background-color: #f0f4f8;
|
1002 |
+
color: #2c3e50;
|
1003 |
+
}
|
1004 |
+
|
1005 |
+
.enhanced-footer .container {
|
1006 |
+
position: relative;
|
1007 |
+
z-index: 2;
|
1008 |
+
}
|
1009 |
+
|
1010 |
+
.footer-grid {
|
1011 |
+
display: flex;
|
1012 |
+
justify-content: space-between;
|
1013 |
+
padding: 2rem 0;
|
1014 |
+
}
|
1015 |
+
|
1016 |
+
.footer-column {
|
1017 |
+
flex: 1;
|
1018 |
+
margin-right: 2rem;
|
1019 |
+
}
|
1020 |
+
|
1021 |
+
.footer-column h4 {
|
1022 |
+
color: #3498db;
|
1023 |
+
margin-bottom: 1rem;
|
1024 |
+
font-weight: 600;
|
1025 |
+
}
|
1026 |
+
|
1027 |
+
.footer-column ul {
|
1028 |
+
list-style: none;
|
1029 |
+
padding: 0;
|
1030 |
+
}
|
1031 |
+
|
1032 |
+
.footer-column ul li {
|
1033 |
+
margin-bottom: 0.5rem;
|
1034 |
+
}
|
1035 |
+
|
1036 |
+
.footer-column a {
|
1037 |
+
color: #34495e;
|
1038 |
+
text-decoration: none;
|
1039 |
+
transition: color 0.3s ease;
|
1040 |
+
}
|
1041 |
+
|
1042 |
+
.footer-column a:hover {
|
1043 |
+
color: #3498db;
|
1044 |
+
}
|
1045 |
+
|
1046 |
+
.footer-social {
|
1047 |
+
flex: 1;
|
1048 |
+
}
|
1049 |
+
|
1050 |
+
.social-icons {
|
1051 |
+
display: flex;
|
1052 |
+
gap: 1rem;
|
1053 |
+
}
|
1054 |
+
|
1055 |
+
.social-icon {
|
1056 |
+
display: inline-flex;
|
1057 |
+
align-items: center;
|
1058 |
+
padding: 0.5rem 1rem;
|
1059 |
+
background-color: #3498db;
|
1060 |
+
color: white;
|
1061 |
+
border-radius: 5px;
|
1062 |
+
transition: background-color 0.3s ease;
|
1063 |
+
}
|
1064 |
+
|
1065 |
+
.social-icon:hover {
|
1066 |
+
background-color: #2980b9;
|
1067 |
+
}
|
1068 |
+
|
1069 |
+
.footer-bottom {
|
1070 |
+
background-color: rgba(255, 255, 255, 0.9);
|
1071 |
+
padding: 1rem 0;
|
1072 |
+
text-align: center;
|
1073 |
+
color: #34495e;
|
1074 |
+
}
|
1075 |
+
|
1076 |
+
@media (max-width: 768px) {
|
1077 |
+
.footer-grid {
|
1078 |
+
flex-direction: column;
|
1079 |
+
}
|
1080 |
+
|
1081 |
+
.footer-column {
|
1082 |
+
margin-right: 0;
|
1083 |
+
margin-bottom: 1rem;
|
1084 |
+
}
|
1085 |
+
}
|
1086 |
+
|
1087 |
+
.kuro-hero {
|
1088 |
+
background-image: linear-gradient(120deg, #f0f9ff 0%, #cdebff 100%);
|
1089 |
+
padding: 4rem 5%;
|
1090 |
+
text-align: center;
|
1091 |
+
position: relative;
|
1092 |
+
overflow: hidden;
|
1093 |
+
color: var(--kuro-dark-text);
|
1094 |
+
}
|
1095 |
+
|
1096 |
+
.kuro-hero .hero-content {
|
1097 |
+
position: relative;
|
1098 |
+
z-index: 1;
|
1099 |
+
}
|
1100 |
+
|
1101 |
+
.kuro-hero h1 {
|
1102 |
+
font-size: 2.5rem;
|
1103 |
+
margin-bottom: 1rem;
|
1104 |
+
font-family: 'Noto Sans JP', sans-serif;
|
1105 |
+
color: var(--kuro-text-accent);
|
1106 |
+
}
|
1107 |
+
|
1108 |
+
.kuro-hero p {
|
1109 |
+
font-size: 1.2rem;
|
1110 |
+
margin-bottom: 2rem;
|
1111 |
+
color: var(--kuro-dark-text);
|
1112 |
+
opacity: 0.9;
|
1113 |
+
}
|
1114 |
+
|
1115 |
+
.kuro-hero .cta-button {
|
1116 |
+
background-color: #2980b9;
|
1117 |
+
color: white;
|
1118 |
+
border: none;
|
1119 |
+
padding: 12px 25px;
|
1120 |
+
border-radius: 5px;
|
1121 |
+
cursor: pointer;
|
1122 |
+
font-size: 1.1rem;
|
1123 |
+
transition: background-color 0.3s ease;
|
1124 |
+
}
|
1125 |
+
|
1126 |
+
.kuro-hero .cta-button:hover {
|
1127 |
+
background-color: #2980b9;
|
1128 |
+
}
|
1129 |
+
|
1130 |
+
.hero-animation-container {
|
1131 |
+
position: absolute;
|
1132 |
+
top: 0;
|
1133 |
+
left: 0;
|
1134 |
+
width: 100%;
|
1135 |
+
height: 100%;
|
1136 |
+
pointer-events: none;
|
1137 |
+
display: flex;
|
1138 |
+
align-items: center;
|
1139 |
+
justify-content: center;
|
1140 |
+
}
|
1141 |
+
|
1142 |
+
.hero-svg {
|
1143 |
+
position: absolute;
|
1144 |
+
width: 600px;
|
1145 |
+
height: 600px;
|
1146 |
+
z-index: 0;
|
1147 |
+
opacity: 0.5;
|
1148 |
+
animation: rotateSakura 20s linear infinite;
|
1149 |
+
overflow: visible;
|
1150 |
+
}
|
1151 |
+
|
1152 |
+
@keyframes rotateSakura {
|
1153 |
+
from {transform: rotate(0deg);}
|
1154 |
+
to {transform: rotate(360deg);}
|
1155 |
+
}
|
1156 |
+
|
1157 |
+
.sakura-path {
|
1158 |
+
animation: drawSakura 5s ease-in-out infinite alternate;
|
1159 |
+
stroke-dasharray: 1000;
|
1160 |
+
stroke-dashoffset: 1000;
|
1161 |
+
stroke: #ff7fab;
|
1162 |
+
}
|
1163 |
+
|
1164 |
+
@keyframes drawSakura {
|
1165 |
+
to { stroke-dashoffset: 0; }
|
1166 |
+
}
|
1167 |
+
|
1168 |
+
.floating-kanji {
|
1169 |
+
position: absolute;
|
1170 |
+
top: 0;
|
1171 |
+
left: 0;
|
1172 |
+
width: 100%;
|
1173 |
+
height: 100%;
|
1174 |
+
pointer-events: none;
|
1175 |
+
}
|
1176 |
+
|
1177 |
+
.floating-kanji .kanji {
|
1178 |
+
position: absolute;
|
1179 |
+
font-size: 3rem;
|
1180 |
+
color: rgba(0, 0, 0, 0.3);
|
1181 |
+
animation: floatKanji 10s linear infinite;
|
1182 |
+
}
|
1183 |
+
|
1184 |
+
@keyframes floatKanji {
|
1185 |
+
0% {transform: translateY(0) translateX(0);}
|
1186 |
+
50% {transform: translateY(20px) translateX(10px);}
|
1187 |
+
100% {transform: translateY(0) translateX(0);}
|
1188 |
+
}
|
1189 |
+
|
1190 |
+
/* Responsive adjustments */
|
1191 |
+
@media (max-width: 768px) {
|
1192 |
+
.kuro-hero h1 {
|
1193 |
+
font-size: 2rem;
|
1194 |
+
}
|
1195 |
+
|
1196 |
+
.kuro-hero p {
|
1197 |
+
font-size: 1rem;
|
1198 |
+
}
|
1199 |
+
|
1200 |
+
.hero-svg {
|
1201 |
+
width: 80%;
|
1202 |
+
height: 80%;
|
1203 |
+
}
|
1204 |
+
|
1205 |
+
.hero-animation-container {
|
1206 |
+
align-items: flex-start;
|
1207 |
+
justify-content: center;
|
1208 |
+
}
|
1209 |
+
|
1210 |
+
.floating-kanji {
|
1211 |
+
display: none;
|
1212 |
+
}
|
1213 |
+
}
|
vbrowser.html
ADDED
@@ -0,0 +1,102 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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>Virtual Browser</title>
|
7 |
+
<style>
|
8 |
+
html, body {
|
9 |
+
font-family: 'Noto Sans JP', sans-serif;
|
10 |
+
margin: 0;
|
11 |
+
padding: 0;
|
12 |
+
overflow: hidden;
|
13 |
+
background: linear-gradient(135deg, #1a1a2e, #16213e);
|
14 |
+
}
|
15 |
+
|
16 |
+
#container {
|
17 |
+
width: 100vw;
|
18 |
+
height: 100vh;
|
19 |
+
position: relative;
|
20 |
+
}
|
21 |
+
|
22 |
+
#browserFrame {
|
23 |
+
width: 100%;
|
24 |
+
height: 100%;
|
25 |
+
border: none;
|
26 |
+
}
|
27 |
+
|
28 |
+
.loading {
|
29 |
+
position: fixed;
|
30 |
+
top: 0;
|
31 |
+
left: 0;
|
32 |
+
right: 0;
|
33 |
+
bottom: 0;
|
34 |
+
background: rgba(0,0,0,0.8);
|
35 |
+
display: flex;
|
36 |
+
align-items: center;
|
37 |
+
justify-content: center;
|
38 |
+
color: #fff;
|
39 |
+
font-size: 1.2rem;
|
40 |
+
}
|
41 |
+
|
42 |
+
#signoutBtn {
|
43 |
+
position: fixed;
|
44 |
+
top: 1rem;
|
45 |
+
right: 1rem;
|
46 |
+
padding: 0.5rem 1rem;
|
47 |
+
background: var(--accent-color, #ff6b6b);
|
48 |
+
color: white;
|
49 |
+
border: none;
|
50 |
+
border-radius: 5px;
|
51 |
+
cursor: pointer;
|
52 |
+
z-index: 1000;
|
53 |
+
}
|
54 |
+
</style>
|
55 |
+
</head>
|
56 |
+
<body>
|
57 |
+
<div id="container">
|
58 |
+
<button id="signoutBtn">Sign Out</button>
|
59 |
+
</div>
|
60 |
+
<script>
|
61 |
+
// Check authentication
|
62 |
+
if (!localStorage.getItem('authToken')) {
|
63 |
+
window.close();
|
64 |
+
}
|
65 |
+
|
66 |
+
// Handle sign out
|
67 |
+
document.getElementById('signoutBtn').onclick = async () => {
|
68 |
+
try {
|
69 |
+
const response = await fetch('/signout', { method: 'POST' });
|
70 |
+
if (response.ok) {
|
71 |
+
localStorage.removeItem('authToken');
|
72 |
+
window.close();
|
73 |
+
}
|
74 |
+
} catch (error) {
|
75 |
+
console.error('Sign out failed:', error);
|
76 |
+
}
|
77 |
+
};
|
78 |
+
|
79 |
+
// Load browser content
|
80 |
+
(async function loadBrowser() {
|
81 |
+
try {
|
82 |
+
const token = localStorage.getItem('authToken');
|
83 |
+
const response = await fetch('/embed-url', {
|
84 |
+
headers: { 'Authorization': `Bearer ${token}` }
|
85 |
+
});
|
86 |
+
|
87 |
+
if (!response.ok) throw new Error('Failed to fetch browser URL');
|
88 |
+
|
89 |
+
const { embedURL } = await response.json();
|
90 |
+
const iframe = document.createElement('iframe');
|
91 |
+
iframe.id = 'browserFrame';
|
92 |
+
iframe.src = embedURL;
|
93 |
+
document.getElementById('container').appendChild(iframe);
|
94 |
+
} catch (error) {
|
95 |
+
console.error('Error loading browser:', error);
|
96 |
+
const container = document.getElementById('container');
|
97 |
+
container.innerHTML = `<div class="loading">Failed to load browser: ${error.message}</div>`;
|
98 |
+
}
|
99 |
+
})();
|
100 |
+
</script>
|
101 |
+
</body>
|
102 |
+
</html>
|
vercel.json
ADDED
@@ -0,0 +1,15 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"version": 2,
|
3 |
+
"builds": [
|
4 |
+
{
|
5 |
+
"src": "server.js",
|
6 |
+
"use": "@vercel/node"
|
7 |
+
}
|
8 |
+
],
|
9 |
+
"routes": [
|
10 |
+
{
|
11 |
+
"src": "/.*",
|
12 |
+
"dest": "server.js"
|
13 |
+
}
|
14 |
+
]
|
15 |
+
}
|