John2121 commited on
Commit
d390af3
·
verified ·
1 Parent(s): e96f79f

i dont want it to be called 'quantum' rabbit hole just rabbithole. i want the theme to be alot less dark at first but not over bearing, i want it to clearly say what the site is and the rabbit hole is and what swiping either direction does, also i want to do a little animated gilf between the swipes were an animated rabbit does something interesting/clever/cute kinda thing. that way it will be fast too to let the rest of the stuff load

Browse files
components/auth-modal.js CHANGED
@@ -39,19 +39,17 @@ class AuthModal extends HTMLElement {
39
  text-align: center;
40
  margin-bottom: 2rem;
41
  }
42
-
43
  .modal-title {
44
- color: var(--quantum-accent);
45
  font-size: 1.5rem;
46
  margin: 0 0 0.5rem 0;
47
  }
48
 
49
  .modal-subtitle {
50
- color: var(--quantum-muted);
51
  font-size: 0.9rem;
52
  }
53
-
54
- .form-actions {
55
  display: flex;
56
  gap: 1rem;
57
  justify-content: space-between;
@@ -91,30 +89,28 @@ class AuthModal extends HTMLElement {
91
  gap: 1rem;
92
  margin-bottom: 1.5rem;
93
  }
94
-
95
  .auth-provider-btn {
96
  display: flex;
97
  align-items: center;
98
  justify-content: center;
99
  gap: 0.75rem;
100
  padding: 1rem;
101
- border: 2px solid rgba(79, 209, 197, 0.3);
102
  border-radius: 0.75rem;
103
- background: rgba(14, 15, 17, 0.8);
104
- color: var(--quantum-fg);
105
  font-size: 1rem;
106
  font-weight: 500;
107
  cursor: pointer;
108
- transition: all 0.3s var(--quantum-easing);
109
  }
110
 
111
  .auth-provider-btn:hover {
112
- border-color: var(--quantum-accent);
113
  transform: translateY(-2px);
114
- box-shadow: 0 0 20px var(--quantum-glow);
115
  }
116
-
117
- .provider-icon {
118
  width: 24px;
119
  height: 24px;
120
  }
 
39
  text-align: center;
40
  margin-bottom: 2rem;
41
  }
 
42
  .modal-title {
43
+ color: var(--rabbithole-accent);
44
  font-size: 1.5rem;
45
  margin: 0 0 0.5rem 0;
46
  }
47
 
48
  .modal-subtitle {
49
+ color: var(--rabbithole-muted);
50
  font-size: 0.9rem;
51
  }
52
+ .form-actions {
 
53
  display: flex;
54
  gap: 1rem;
55
  justify-content: space-between;
 
89
  gap: 1rem;
90
  margin-bottom: 1.5rem;
91
  }
 
92
  .auth-provider-btn {
93
  display: flex;
94
  align-items: center;
95
  justify-content: center;
96
  gap: 0.75rem;
97
  padding: 1rem;
98
+ border: 2px solid rgba(59, 130, 246, 0.3);
99
  border-radius: 0.75rem;
100
+ background: rgba(255, 255, 255, 0.8);
101
+ color: var(--rabbithole-fg);
102
  font-size: 1rem;
103
  font-weight: 500;
104
  cursor: pointer;
105
+ transition: all 0.3s var(--rabbithole-easing);
106
  }
107
 
108
  .auth-provider-btn:hover {
109
+ border-color: var(--rabbithole-accent);
110
  transform: translateY(-2px);
111
+ box-shadow: 0 0 20px var(--rabbithole-glow);
112
  }
113
+ .provider-icon {
 
114
  width: 24px;
115
  height: 24px;
116
  }
components/history-modal.js CHANGED
@@ -63,33 +63,31 @@ class HistoryModal extends HTMLElement {
63
  flex-direction: column;
64
  gap: 0.5rem;
65
  }
66
-
67
  .history-item {
68
- background: rgba(14, 15, 17, 0.5);
69
  padding: 1rem;
70
  border-radius: 0.5rem;
71
- border-left: 3px solid var(--quantum-accent);
72
  cursor: pointer;
73
  transition: all 0.3s;
74
  }
75
 
76
  .history-item:hover {
77
- background: rgba(79, 209, 197, 0.1);
78
  transform: translateX(5px);
79
  }
80
 
81
  .history-title {
82
- color: var(--quantum-fg);
83
  margin: 0 0 0.5rem 0;
84
  font-size: 1rem;
85
  }
86
 
87
  .history-date {
88
- color: var(--quantum-muted);
89
  font-size: 0.8rem;
90
  }
91
-
92
- .empty-state {
93
  text-align: center;
94
  color: var(--quantum-muted);
95
  padding: 2rem;
 
63
  flex-direction: column;
64
  gap: 0.5rem;
65
  }
 
66
  .history-item {
67
+ background: rgba(248, 250, 252, 0.8);
68
  padding: 1rem;
69
  border-radius: 0.5rem;
70
+ border-left: 3px solid var(--rabbithole-accent);
71
  cursor: pointer;
72
  transition: all 0.3s;
73
  }
74
 
75
  .history-item:hover {
76
+ background: rgba(59, 130, 246, 0.1);
77
  transform: translateX(5px);
78
  }
79
 
80
  .history-title {
81
+ color: var(--rabbithole-fg);
82
  margin: 0 0 0.5rem 0;
83
  font-size: 1rem;
84
  }
85
 
86
  .history-date {
87
+ color: var(--rabbithole-muted);
88
  font-size: 0.8rem;
89
  }
90
+ .empty-state {
 
91
  text-align: center;
92
  color: var(--quantum-muted);
93
  padding: 2rem;
components/user-profile.js CHANGED
@@ -25,41 +25,40 @@ class UserProfile extends HTMLElement {
25
  right: 1rem;
26
  z-index: 100;
27
  }
28
-
29
  .profile-btn {
30
  width: 48px;
31
  height: 48px;
32
  border-radius: 50%;
33
- background: var(--quantum-accent);
34
  border: none;
35
- color: var(--quantum-bg);
36
  font-weight: bold;
37
  cursor: pointer;
38
  display: flex;
39
  align-items: center;
40
  justify-content: center;
41
- transition: all 0.3s var(--quantum-easing);
42
  }
43
 
44
  .profile-btn:hover {
45
  transform: scale(1.1);
46
- box-shadow: 0 0 20px var(--quantum-glow);
47
  }
48
 
49
  .profile-menu {
50
  position: absolute;
51
  top: 100%;
52
  right: 0;
53
- background: #1a1c20;
54
- border: 2px solid var(--quantum-accent);
55
  border-radius: 0.75rem;
56
  padding: 1rem;
57
  margin-top: 0.5rem;
58
  min-width: 200px;
59
  display: none;
 
60
  }
61
-
62
- .profile-menu.show {
63
  display: block;
64
  animation: slideDown 0.3s var(--quantum-easing);
65
  }
@@ -89,15 +88,14 @@ class UserProfile extends HTMLElement {
89
  font-weight: bold;
90
  margin: 0 auto 0.5rem;
91
  }
92
-
93
  .user-name {
94
- color: var(--quantum-fg);
95
  margin: 0;
96
  font-size: 1rem;
97
  }
98
 
99
  .user-email {
100
- color: var(--quantum-muted);
101
  font-size: 0.8rem;
102
  margin: 0.25rem 0 0 0;
103
  }
@@ -108,7 +106,7 @@ class UserProfile extends HTMLElement {
108
  padding: 0.75rem;
109
  border: none;
110
  background: transparent;
111
- color: var(--quantum-fg);
112
  text-align: left;
113
  cursor: pointer;
114
  border-radius: 0.5rem;
@@ -116,14 +114,14 @@ class UserProfile extends HTMLElement {
116
  }
117
 
118
  .menu-item:hover {
119
- background: rgba(79, 209, 197, 0.1);
120
  }
121
 
122
  .logout-btn {
123
- color: #ff6b6b;
124
  margin-top: 0.5rem;
125
  }
126
- </style>
127
 
128
  <div class="profile-container">
129
  <button class="profile-btn" id="profile-toggle">
 
25
  right: 1rem;
26
  z-index: 100;
27
  }
 
28
  .profile-btn {
29
  width: 48px;
30
  height: 48px;
31
  border-radius: 50%;
32
+ background: var(--rabbithole-accent);
33
  border: none;
34
+ color: white;
35
  font-weight: bold;
36
  cursor: pointer;
37
  display: flex;
38
  align-items: center;
39
  justify-content: center;
40
+ transition: all 0.3s var(--rabbithole-easing);
41
  }
42
 
43
  .profile-btn:hover {
44
  transform: scale(1.1);
45
+ box-shadow: 0 0 20px var(--rabbithole-glow);
46
  }
47
 
48
  .profile-menu {
49
  position: absolute;
50
  top: 100%;
51
  right: 0;
52
+ background: white;
53
+ border: 2px solid var(--rabbithole-accent);
54
  border-radius: 0.75rem;
55
  padding: 1rem;
56
  margin-top: 0.5rem;
57
  min-width: 200px;
58
  display: none;
59
+ box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1);
60
  }
61
+ .profile-menu.show {
 
62
  display: block;
63
  animation: slideDown 0.3s var(--quantum-easing);
64
  }
 
88
  font-weight: bold;
89
  margin: 0 auto 0.5rem;
90
  }
 
91
  .user-name {
92
+ color: var(--rabbithole-fg);
93
  margin: 0;
94
  font-size: 1rem;
95
  }
96
 
97
  .user-email {
98
+ color: var(--rabbithole-muted);
99
  font-size: 0.8rem;
100
  margin: 0.25rem 0 0 0;
101
  }
 
106
  padding: 0.75rem;
107
  border: none;
108
  background: transparent;
109
+ color: var(--rabbithole-fg);
110
  text-align: left;
111
  cursor: pointer;
112
  border-radius: 0.5rem;
 
114
  }
115
 
116
  .menu-item:hover {
117
+ background: rgba(59, 130, 246, 0.1);
118
  }
119
 
120
  .logout-btn {
121
+ color: #ef4444;
122
  margin-top: 0.5rem;
123
  }
124
+ </style>
125
 
126
  <div class="profile-container">
127
  <button class="profile-btn" id="profile-toggle">
index.html CHANGED
@@ -6,12 +6,10 @@
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">
@@ -38,59 +36,68 @@
38
  <body>
39
 
40
  <user-profile></user-profile>
41
-
42
- <div class="quantum-gradient"></div>
43
  <div class="particles-container" id="particles"></div>
44
- <article class="quantum-card" id="card" data-state="welcome">
45
- <div class="quantum-header">
46
- <h1 id="title">Welcome to QuantumRabbitHole Explorer 🐇</h1>
47
- <div class="quantum-progress" id="progress">
 
 
 
48
  <div class="progress-bar" id="progress-bar"></div>
49
  </div>
50
  </div>
51
 
52
- <div class="quantum-content">
53
- <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>
54
- <div class="quantum-meta" id="meta">
 
 
 
 
 
 
 
 
 
 
 
 
 
 
55
  <span class="meta-tag">🔒 Zero Tracking</span>
56
  <span class="meta-tag">🚀 Instant Loading</span>
57
  <span class="meta-tag">📱 Mobile-First</span>
58
- <span class="meta-tag">🌐 Client-Side</span>
59
  </div>
60
- <div class="quantum-error" id="error"></div>
61
  </div>
62
 
63
- <div class="quantum-actions">
64
- <button id="enter" class="quantum-btn quantum-btn-primary">
65
- <span class="btn-content">Launch Quantum Explorer</span>
66
- <div class="quantum-sparkle"></div>
67
  </button>
68
- <a href="#share" class="quantum-btn quantum-btn-secondary" id="share-btn">
69
  Share Experience
70
  </a>
71
  </div>
72
  </article>
73
-
74
- <div class="quantum-nav-arrows" aria-hidden="true">
75
- <div class="quantum-arrow quantum-arrow-left" id="arrow-left">
76
  <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
77
  <path d="M19 12H5M12 19l-7-7 7-7"/>
78
  </svg>
79
  </div>
80
- <div class="quantum-arrow quantum-arrow-right" id="arrow-right">
81
  <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
82
  <path d="M5 12h14M12 5l7 7-7 7"/>
83
  </svg>
84
  </div>
85
  </div>
86
 
87
- <div class="quantum-hint">
88
- <span class="hint-icon">👆</span>
89
- <span>Swipe → dive deeper · Swipe ← quantum jump · Tap to explore</span>
90
- </div>
91
-
92
- <div class="quantum-footer">
93
- <span>Powered by Wikipedia API · Built with Quantum Technology</span>
94
  </div>
95
  <script>
96
  const titleEl = document.getElementById('title');
 
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>RabbitHole Explorer 🐇</title>
10
+ <!-- RabbitHole: Client-only Wikipedia-powered knowledge exploration -->
11
+ <!-- Mobile-first immersive browsing experience -->
12
+ <link rel="stylesheet" href="style.css">
 
 
13
  <link rel="preconnect" href="https://fonts.googleapis.com">
14
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
15
  <link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap" rel="stylesheet">
 
36
  <body>
37
 
38
  <user-profile></user-profile>
39
+ <div class="rabbithole-gradient"></div>
 
40
  <div class="particles-container" id="particles"></div>
41
+ <div class="rabbit-animation" id="rabbit-animation" style="display: none;">
42
+ <div class="rabbit">🐇</div>
43
+ </div>
44
+ <article class="rabbithole-card" id="card" data-state="welcome">
45
+ <div class="rabbithole-header">
46
+ <h1 id="title">Welcome to RabbitHole Explorer 🐇</h1>
47
+ <div class="rabbithole-progress" id="progress">
48
  <div class="progress-bar" id="progress-bar"></div>
49
  </div>
50
  </div>
51
 
52
+ <div class="rabbithole-content">
53
+ <p id="extract">Discover Wikipedia articles through an intuitive swipe-based interface. Dive deeper into topics by swiping right, or jump to random articles by swiping left.</p>
54
+ <div class="rabbithole-guide">
55
+ <div class="guide-item">
56
+ <span class="guide-icon">👉</span>
57
+ <span>Swipe right → follow links to related articles</span>
58
+ </div>
59
+ <div class="guide-item">
60
+ <span class="guide-icon">👈</span>
61
+ <span>Swipe left ← jump to random articles</span>
62
+ </div>
63
+ <div class="guide-item">
64
+ <span class="guide-icon">👆</span>
65
+ <span>Tap to explore more options</span>
66
+ </div>
67
+ </div>
68
+ <div class="rabbithole-meta" id="meta">
69
  <span class="meta-tag">🔒 Zero Tracking</span>
70
  <span class="meta-tag">🚀 Instant Loading</span>
71
  <span class="meta-tag">📱 Mobile-First</span>
 
72
  </div>
73
+ <div class="rabbithole-error" id="error"></div>
74
  </div>
75
 
76
+ <div class="rabbithole-actions">
77
+ <button id="enter" class="rabbithole-btn rabbithole-btn-primary">
78
+ <span class="btn-content">Start Exploring</span>
79
+ <div class="rabbithole-sparkle"></div>
80
  </button>
81
+ <a href="#share" class="rabbithole-btn rabbithole-btn-secondary" id="share-btn">
82
  Share Experience
83
  </a>
84
  </div>
85
  </article>
86
+ <div class="rabbithole-nav-arrows" aria-hidden="true">
87
+ <div class="rabbithole-arrow rabbithole-arrow-left" id="arrow-left">
 
88
  <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
89
  <path d="M19 12H5M12 19l-7-7 7-7"/>
90
  </svg>
91
  </div>
92
+ <div class="rabbithole-arrow rabbithole-arrow-right" id="arrow-right">
93
  <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
94
  <path d="M5 12h14M12 5l7 7-7 7"/>
95
  </svg>
96
  </div>
97
  </div>
98
 
99
+ <div class="rabbithole-footer">
100
+ <span>Powered by Wikipedia API · Built for curious minds</span>
 
 
 
 
 
101
  </div>
102
  <script>
103
  const titleEl = document.getElementById('title');
script.js CHANGED
@@ -1,6 +1,6 @@
1
 
2
- class QuantumRabbitHole {
3
- constructor() {
4
  this.titleEl = document.getElementById('title');
5
  this.extractEl = document.getElementById('extract');
6
  this.metaEl = document.getElementById('meta');
@@ -102,11 +102,11 @@ createParticles() {
102
  clearError() {
103
  this.errorEl.textContent = '';
104
  }
105
-
106
  async fetchRandomArticle() {
107
  try {
108
  this.setLoading(true);
109
  this.clearError();
 
110
  const res = await fetch(
111
  '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'
112
  );
@@ -117,7 +117,7 @@ createParticles() {
117
  this.addToHistory(page);
118
  this.animateContent('slide-in-left');
119
  } catch (e) {
120
- this.showError('Quantum connection unstable. Try again.');
121
  } finally {
122
  this.setLoading(false);
123
  }
@@ -129,6 +129,7 @@ createParticles() {
129
  try {
130
  this.setLoading(true);
131
  this.clearError();
 
132
  const res = await fetch(
133
  `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`
134
  );
@@ -139,13 +140,12 @@ createParticles() {
139
  this.addToHistory(page);
140
  this.animateContent('slide-in-right');
141
  } catch (e) {
142
- this.showError('Quantum tunnel collapsed. Try again.');
143
  } finally {
144
  this.setLoading(false);
145
  }
146
  }
147
-
148
- async fetchLinks(title) {
149
  try {
150
  const url = `https://en.wikipedia.org/w/api.php?action=query&format=json&origin=*&prop=links&pllimit=50&titles=${encodeURIComponent(title)}`;
151
  const res = await fetch(url);
@@ -232,6 +232,16 @@ updateProgress() {
232
  }, 2000);
233
  }
234
  }
 
 
 
 
 
 
 
 
 
 
235
  handleArrowRight() {
236
  if (!this.started) this.startExperience();
237
  else this.fetchLinkedArticle();
@@ -366,7 +376,7 @@ document.addEventListener('DOMContentLoaded', () => {
366
  quantumApp.showError('Logged out successfully');
367
  });
368
  });
369
- // Initialize the quantum experience
370
  document.addEventListener('DOMContentLoaded', () => {
371
- new QuantumRabbitHole();
372
- });
 
1
 
2
+ class RabbitHole {
3
+ constructor() {
4
  this.titleEl = document.getElementById('title');
5
  this.extractEl = document.getElementById('extract');
6
  this.metaEl = document.getElementById('meta');
 
102
  clearError() {
103
  this.errorEl.textContent = '';
104
  }
 
105
  async fetchRandomArticle() {
106
  try {
107
  this.setLoading(true);
108
  this.clearError();
109
+ this.showRabbitAnimation();
110
  const res = await fetch(
111
  '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'
112
  );
 
117
  this.addToHistory(page);
118
  this.animateContent('slide-in-left');
119
  } catch (e) {
120
+ this.showError('Connection unstable. Try again.');
121
  } finally {
122
  this.setLoading(false);
123
  }
 
129
  try {
130
  this.setLoading(true);
131
  this.clearError();
132
+ this.showRabbitAnimation();
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
  );
 
140
  this.addToHistory(page);
141
  this.animateContent('slide-in-right');
142
  } catch (e) {
143
+ this.showError('Failed to follow link. Try again.');
144
  } finally {
145
  this.setLoading(false);
146
  }
147
  }
148
+ async fetchLinks(title) {
 
149
  try {
150
  const url = `https://en.wikipedia.org/w/api.php?action=query&format=json&origin=*&prop=links&pllimit=50&titles=${encodeURIComponent(title)}`;
151
  const res = await fetch(url);
 
232
  }, 2000);
233
  }
234
  }
235
+
236
+ showRabbitAnimation() {
237
+ const rabbitAnim = document.getElementById('rabbit-animation');
238
+ rabbitAnim.style.display = 'block';
239
+
240
+ // Remove the animation after it completes
241
+ setTimeout(() => {
242
+ rabbitAnim.style.display = 'none';
243
+ }, 800);
244
+ }
245
  handleArrowRight() {
246
  if (!this.started) this.startExperience();
247
  else this.fetchLinkedArticle();
 
376
  quantumApp.showError('Logged out successfully');
377
  });
378
  });
379
+ // Initialize the rabbit hole experience
380
  document.addEventListener('DOMContentLoaded', () => {
381
+ new RabbitHole();
382
+ });
style.css CHANGED
@@ -1,14 +1,14 @@
 
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;
@@ -25,24 +25,23 @@ html, body {
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;
@@ -52,15 +51,35 @@ body {
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); }
@@ -68,8 +87,7 @@ body {
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;
@@ -82,39 +100,63 @@ body {
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;
@@ -124,12 +166,12 @@ h1 {
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;
@@ -138,22 +180,22 @@ p {
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;
@@ -161,42 +203,42 @@ p {
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;
@@ -207,11 +249,11 @@ p {
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;
@@ -224,62 +266,42 @@ p {
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 {
@@ -337,7 +359,7 @@ p {
337
  }
338
  /* Animation classes */
339
  .fade-in {
340
- animation: fadeIn 0.5s var(--quantum-easing);
341
  }
342
 
343
  @keyframes fadeIn {
@@ -346,7 +368,7 @@ p {
346
  }
347
 
348
  .slide-in-right {
349
- animation: slideInRight 0.4s var(--quantum-easing);
350
  }
351
 
352
  @keyframes slideInRight {
@@ -355,7 +377,7 @@ p {
355
  }
356
 
357
  .slide-in-left {
358
- animation: slideInLeft 0.4s var(--quantum-easing);
359
  }
360
 
361
  @keyframes slideInLeft {
@@ -389,7 +411,7 @@ history-modal {
389
  width: 20px;
390
  height: 20px;
391
  margin: -10px 0 0 -10px;
392
- border: 2px solid var(--quantum-accent);
393
  border-radius: 50%;
394
  border-top-color: transparent;
395
  animation: spin 1s linear infinite;
@@ -397,4 +419,4 @@ history-modal {
397
 
398
  @keyframes spin {
399
  to { transform: rotate(360deg); }
400
- }
 
1
+
2
  :root {
3
+ --rabbithole-bg: #f8fafc;
4
+ --rabbithole-fg: #1e293b;
5
+ --rabbithole-muted: #64748b;
6
+ --rabbithole-accent: #3b82f6;
7
+ --rabbithole-glow: #3b82f640;
8
+ --rabbithole-pulse: #3b82f620;
9
+ --rabbithole-easing: cubic-bezier(0.4, 0, 0.2, 1);
10
+ --rabbithole-duration: 0.3s;
11
  }
 
12
  * {
13
  box-sizing: border-box;
14
  -webkit-tap-highlight-color: transparent;
 
25
  font-weight: 400;
26
  line-height: 1.6;
27
  }
 
28
  body {
29
  display: flex;
30
  align-items: center;
31
  justify-content: center;
32
  position: relative;
33
+ background: var(--rabbithole-bg);
34
  }
35
 
36
+ .rabbithole-gradient {
37
  position: fixed;
38
  top: 0;
39
  left: 0;
40
  width: 100%;
41
  height: 100%;
42
+ background: radial-gradient(circle at 50% 50%, #e2e8f0 0%, var(--rabbithole-bg) 70%);
43
  z-index: -2;
44
  }
 
45
  .particles-container {
46
  position: fixed;
47
  top: 0;
 
51
  z-index: -1;
52
  pointer-events: none;
53
  }
 
54
  .particle {
55
  position: absolute;
56
+ background: var(--rabbithole-accent);
57
  border-radius: 50%;
58
+ opacity: 0.2;
59
  animation: float 20s infinite linear;
60
  }
61
 
62
+ .rabbit-animation {
63
+ position: fixed;
64
+ top: 50%;
65
+ left: 50%;
66
+ transform: translate(-50%, -50%);
67
+ z-index: 999;
68
+ pointer-events: none;
69
+ }
70
+
71
+ .rabbit {
72
+ font-size: 4rem;
73
+ animation: hop 0.8s ease-in-out;
74
+ }
75
+
76
+ @keyframes hop {
77
+ 0% { transform: translateY(0) rotate(0deg); }
78
+ 25% { transform: translateY(-30px) rotate(-5deg); }
79
+ 50% { transform: translateY(-60px) rotate(0deg); }
80
+ 75% { transform: translateY(-30px) rotate(5deg); }
81
+ 100% { transform: translateY(0) rotate(0deg); }
82
+ }
83
  @keyframes float {
84
  0% { transform: translateY(0) translateX(0); }
85
  25% { transform: translateY(-20px) translateX(10px); }
 
87
  75% { transform: translateY(-20px) translateX(-10px); }
88
  100% { transform: translateY(0) translateX(0); }
89
  }
90
+ .rabbithole-card {
 
91
  width: 100vw;
92
  height: 100vh;
93
  padding: env(safe-area-inset-top) 1.5rem env(safe-area-inset-bottom) 1.5rem;
 
100
  z-index: 1;
101
  max-width: 600px;
102
  margin: 0 auto;
103
+ background: rgba(255, 255, 255, 0.95);
104
+ backdrop-filter: blur(10px);
105
+ border-radius: 1rem;
106
+ box-shadow: 0 10px 40px rgba(0, 0, 0, 0.1);
107
  }
108
 
109
+ .rabbithole-header {
110
  text-align: center;
111
  }
112
 
113
+ .rabbithole-progress {
114
  width: 100%;
115
  height: 2px;
116
+ background: rgba(0,0,0,0.1);
117
  border-radius: 1px;
118
  margin: 1rem 0;
119
  overflow: hidden;
120
  }
 
121
  .progress-bar {
122
  height: 100%;
123
+ background: var(--rabbithole-accent);
124
  width: 0%;
125
+ transition: width 0.3s var(--rabbithole-easing);
126
  border-radius: 1px;
127
  }
128
 
129
+ .rabbithole-content {
130
  text-align: center;
131
  }
132
 
133
+ .rabbithole-guide {
134
+ display: flex;
135
+ flex-direction: column;
136
+ gap: 0.75rem;
137
+ margin: 1.5rem 0;
138
+ }
139
+
140
+ .guide-item {
141
+ display: flex;
142
+ align-items: center;
143
+ gap: 0.75rem;
144
+ padding: 0.75rem;
145
+ background: rgba(59, 130, 246, 0.05);
146
+ border-radius: 0.5rem;
147
+ font-size: 0.9rem;
148
+ color: var(--rabbithole-fg);
149
+ }
150
+
151
+ .guide-icon {
152
+ font-size: 1.2rem;
153
+ }
154
  h1 {
155
  font-size: 2rem;
156
  margin: 0;
157
  letter-spacing: -0.02em;
158
  font-weight: 700;
159
+ background: linear-gradient(135deg, var(--rabbithole-accent), #60a5fa);
160
  -webkit-background-clip: text;
161
  -webkit-text-fill-color: transparent;
162
  background-clip: text;
 
166
  p {
167
  margin: 0;
168
  line-height: 1.6;
169
+ color: var(--rabbithole-fg);
170
  font-size: 1.1rem;
171
+ font-weight: 400;
172
  }
173
 
174
+ .rabbithole-meta {
175
  display: flex;
176
  flex-wrap: wrap;
177
  gap: 0.5rem;
 
180
  }
181
 
182
  .meta-tag {
183
+ background: rgba(59, 130, 246, 0.1);
184
  padding: 0.25rem 0.75rem;
185
  border-radius: 1rem;
186
  font-size: 0.8rem;
187
+ color: var(--rabbithole-accent);
188
+ border: 1px solid var(--rabbithole-glow);
189
  }
190
 
191
+ .rabbithole-error {
192
+ color: #ef4444;
193
  font-size: 0.9rem;
194
  margin-top: 1rem;
195
  font-weight: 400;
196
  }
197
 
198
+ .rabbithole-actions {
199
  display: flex;
200
  flex-direction: column;
201
  gap: 0.75rem;
 
203
  align-items: center;
204
  }
205
 
206
+ .rabbithole-btn {
207
  position: relative;
208
  background: transparent;
209
+ color: var(--rabbithole-accent);
210
+ border: 2px solid var(--rabbithole-accent);
211
  padding: 1rem 2rem;
212
  border-radius: 0.75rem;
213
  font-size: 1rem;
214
  text-decoration: none;
215
  font-weight: 500;
216
+ transition: all 0.3s var(--rabbithole-easing);
217
  overflow: hidden;
218
  min-width: 200px;
219
  text-align: center;
220
  }
221
 
222
+ .rabbithole-btn-primary {
223
+ background: var(--rabbithole-pulse);
224
+ box-shadow: 0 0 20px var(--rabbithole-glow);
225
  }
226
 
227
+ .rabbithole-btn-primary:hover {
228
  transform: translateY(-2px);
229
+ box-shadow: 0 0 30px var(--rabbithole-glow);
230
  }
231
 
232
+ .rabbithole-btn-secondary {
233
  opacity: 0.8;
234
  }
235
 
236
+ .rabbithole-btn-secondary:hover {
237
  opacity: 1;
238
  transform: translateY(-1px);
239
  }
240
 
241
+ .rabbithole-sparkle {
242
  position: absolute;
243
  top: 0;
244
  left: 0;
 
249
  transition: opacity 0.3s;
250
  }
251
 
252
+ .rabbithole-btn:hover .rabbithole-sparkle {
253
  opacity: 1;
254
  }
255
 
256
+ .rabbithole-nav-arrows {
257
  position: fixed;
258
  top: 50%;
259
  left: 0;
 
266
  z-index: 2;
267
  }
268
 
269
+ .rabbithole-arrow {
270
  pointer-events: auto;
271
  width: 56px;
272
  height: 56px;
273
  border-radius: 50%;
274
+ border: 2px solid var(--rabbithole-accent);
275
+ color: var(--rabbithole-accent);
276
+ background: rgba(255, 255, 255, 0.9);
277
  display: flex;
278
  align-items: center;
279
  justify-content: center;
280
  font-size: 1.2rem;
281
  user-select: none;
282
+ transition: all 0.3s var(--rabbithole-easing);
283
  backdrop-filter: blur(10px);
284
  cursor: pointer;
285
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
286
  }
287
 
288
+ .rabbithole-arrow:hover {
289
  transform: scale(1.1);
290
+ box-shadow: 0 0 20px var(--rabbithole-glow);
291
  }
292
 
293
+ .rabbithole-footer {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
294
  position: fixed;
295
  bottom: 0.5rem;
296
  left: 0;
297
  right: 0;
298
  text-align: center;
299
  font-size: 0.7rem;
300
+ color: var(--rabbithole-muted);
301
  opacity: 0.6;
302
  padding-bottom: env(safe-area-inset-bottom);
303
  z-index: 2;
304
  }
 
305
  /* Mobile optimizations */
306
  @media (max-width: 768px) {
307
  .quantum-card {
 
359
  }
360
  /* Animation classes */
361
  .fade-in {
362
+ animation: fadeIn 0.5s var(--rabbithole-easing);
363
  }
364
 
365
  @keyframes fadeIn {
 
368
  }
369
 
370
  .slide-in-right {
371
+ animation: slideInRight 0.4s var(--rabbithole-easing);
372
  }
373
 
374
  @keyframes slideInRight {
 
377
  }
378
 
379
  .slide-in-left {
380
+ animation: slideInLeft 0.4s var(--rabbithole-easing);
381
  }
382
 
383
  @keyframes slideInLeft {
 
411
  width: 20px;
412
  height: 20px;
413
  margin: -10px 0 0 -10px;
414
+ border: 2px solid var(--rabbithole-accent);
415
  border-radius: 50%;
416
  border-top-color: transparent;
417
  animation: spin 1s linear infinite;
 
419
 
420
  @keyframes spin {
421
  to { transform: rotate(360deg); }
422
+ }