GitHub Actions commited on
Commit
30c2a3b
·
1 Parent(s): a190f73

feat: easter egg enhancements - ticker at top + agent modal on 'a' key

Browse files

Changes:
1. Moved ticker from bottom to top of page (now slides down from top)
- Changed from 'bottom: -100px' to 'top: -100px'
- Updated animations and shadows accordingly

2. Added agent modal popup (press 'a' to open/close)
- Displays browser agent at http://127.0.0.1:8099/index.html in modal
- Semi-transparent overlay with fade animation
- Close button (×) in top-right corner
- Click overlay to close or press 'a' again
- Beautiful rounded modal with shadow

Keyboard controls:
- Press 'e': toggle ⚡ LIVE ticker at top
- Press 'a': toggle agent browser modal
- Guards against INPUT/TEXTAREA to prevent triggering while typing

Tests: All passing ✓

hearthnet/ui/__pycache__/app.cpython-313.pyc CHANGED
Binary files a/hearthnet/ui/__pycache__/app.cpython-313.pyc and b/hearthnet/ui/__pycache__/app.cpython-313.pyc differ
 
hearthnet/ui/app.py CHANGED
@@ -25,12 +25,12 @@ _EASTER_EGG_CSS = """
25
  }
26
  .egg-ticker {
27
  position: fixed;
28
- bottom: -100px;
29
  left: 0;
30
  right: 0;
31
  height: 60px;
32
  background: linear-gradient(90deg, #1a1a1a, #2a2a2a);
33
- border-top: 2px solid #ff6b35;
34
  color: #fff;
35
  font-size: 14px;
36
  overflow: hidden;
@@ -38,11 +38,11 @@ _EASTER_EGG_CSS = """
38
  display: flex;
39
  align-items: center;
40
  padding: 0 20px;
41
- transition: bottom 0.3s ease;
42
- box-shadow: 0 -2px 10px rgba(0,0,0,0.5);
43
  }
44
  .egg-ticker.active {
45
- bottom: 0;
46
  }
47
  .egg-label {
48
  white-space: nowrap;
@@ -69,10 +69,72 @@ _EASTER_EGG_CSS = """
69
  color: #ff6b35;
70
  font-weight: bold;
71
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
72
  @keyframes scroll {
73
  0% { transform: translateX(0); }
74
  100% { transform: translateX(-100%); }
75
  }
 
 
 
 
76
  </style>
77
  <div id="egg-ticker" class="egg-ticker">
78
  <div class="egg-label">⚡ LIVE</div>
@@ -84,6 +146,12 @@ _EASTER_EGG_CSS = """
84
  <span class="etk"><b>AP News</b> Top Stories</span>
85
  </div>
86
  </div>
 
 
 
 
 
 
87
  """
88
 
89
  # Easter egg script - injected via Blocks head parameter
@@ -91,10 +159,14 @@ _EASTER_EGG_SCRIPT = """
91
  <script>
92
  (function() {
93
  let eggOpen = false;
 
94
 
95
  function initEasterEgg() {
96
  const ticker = document.getElementById('egg-ticker');
97
- if (!ticker) {
 
 
 
98
  setTimeout(initEasterEgg, 100);
99
  return;
100
  }
@@ -103,12 +175,34 @@ _EASTER_EGG_SCRIPT = """
103
  eggOpen = !eggOpen;
104
  ticker.classList.toggle('active', eggOpen);
105
  };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
106
 
107
  document.addEventListener('keydown', function(evt) {
108
- if ((evt.key === 'e' || evt.key === 'E') &&
109
- document.activeElement &&
110
- !['INPUT', 'TEXTAREA'].includes(document.activeElement.tagName)) {
 
 
 
111
  window.toggleEasterEgg();
 
 
112
  }
113
  });
114
  }
 
25
  }
26
  .egg-ticker {
27
  position: fixed;
28
+ top: -100px;
29
  left: 0;
30
  right: 0;
31
  height: 60px;
32
  background: linear-gradient(90deg, #1a1a1a, #2a2a2a);
33
+ border-bottom: 2px solid #ff6b35;
34
  color: #fff;
35
  font-size: 14px;
36
  overflow: hidden;
 
38
  display: flex;
39
  align-items: center;
40
  padding: 0 20px;
41
+ transition: top 0.3s ease;
42
+ box-shadow: 0 2px 10px rgba(0,0,0,0.5);
43
  }
44
  .egg-ticker.active {
45
+ top: 0;
46
  }
47
  .egg-label {
48
  white-space: nowrap;
 
69
  color: #ff6b35;
70
  font-weight: bold;
71
  }
72
+
73
+ /* Modal for agent page */
74
+ .egg-modal-overlay {
75
+ display: none;
76
+ position: fixed;
77
+ top: 0;
78
+ left: 0;
79
+ right: 0;
80
+ bottom: 0;
81
+ background: rgba(0, 0, 0, 0.8);
82
+ z-index: 10000;
83
+ animation: fadeIn 0.3s ease;
84
+ }
85
+ .egg-modal-overlay.active {
86
+ display: flex;
87
+ align-items: center;
88
+ justify-content: center;
89
+ }
90
+ .egg-modal-content {
91
+ background: #fff;
92
+ border-radius: 8px;
93
+ width: 90%;
94
+ height: 90%;
95
+ max-width: 1200px;
96
+ max-height: 900px;
97
+ overflow: auto;
98
+ position: relative;
99
+ box-shadow: 0 10px 40px rgba(0, 0, 0, 0.3);
100
+ }
101
+ .egg-modal-close {
102
+ position: absolute;
103
+ top: 10px;
104
+ right: 15px;
105
+ font-size: 28px;
106
+ font-weight: bold;
107
+ color: #999;
108
+ cursor: pointer;
109
+ z-index: 10001;
110
+ background: #fff;
111
+ width: 35px;
112
+ height: 35px;
113
+ border-radius: 50%;
114
+ display: flex;
115
+ align-items: center;
116
+ justify-content: center;
117
+ border: 1px solid #ddd;
118
+ }
119
+ .egg-modal-close:hover {
120
+ color: #000;
121
+ background: #f0f0f0;
122
+ }
123
+ .egg-modal-iframe {
124
+ width: 100%;
125
+ height: 100%;
126
+ border: none;
127
+ border-radius: 8px;
128
+ }
129
+
130
  @keyframes scroll {
131
  0% { transform: translateX(0); }
132
  100% { transform: translateX(-100%); }
133
  }
134
+ @keyframes fadeIn {
135
+ from { opacity: 0; }
136
+ to { opacity: 1; }
137
+ }
138
  </style>
139
  <div id="egg-ticker" class="egg-ticker">
140
  <div class="egg-label">⚡ LIVE</div>
 
146
  <span class="etk"><b>AP News</b> Top Stories</span>
147
  </div>
148
  </div>
149
+ <div id="egg-modal-overlay" class="egg-modal-overlay">
150
+ <div class="egg-modal-content">
151
+ <span id="egg-modal-close" class="egg-modal-close">×</span>
152
+ <iframe id="egg-modal-iframe" class="egg-modal-iframe" src="http://127.0.0.1:8099/index.html"></iframe>
153
+ </div>
154
+ </div>
155
  """
156
 
157
  # Easter egg script - injected via Blocks head parameter
 
159
  <script>
160
  (function() {
161
  let eggOpen = false;
162
+ let modalOpen = false;
163
 
164
  function initEasterEgg() {
165
  const ticker = document.getElementById('egg-ticker');
166
+ const modalOverlay = document.getElementById('egg-modal-overlay');
167
+ const modalClose = document.getElementById('egg-modal-close');
168
+
169
+ if (!ticker || !modalOverlay) {
170
  setTimeout(initEasterEgg, 100);
171
  return;
172
  }
 
175
  eggOpen = !eggOpen;
176
  ticker.classList.toggle('active', eggOpen);
177
  };
178
+
179
+ window.toggleAgentModal = function() {
180
+ modalOpen = !modalOpen;
181
+ modalOverlay.classList.toggle('active', modalOpen);
182
+ };
183
+
184
+ // Close modal when close button clicked
185
+ modalClose.addEventListener('click', function() {
186
+ window.toggleAgentModal();
187
+ });
188
+
189
+ // Close modal when overlay (not content) clicked
190
+ modalOverlay.addEventListener('click', function(e) {
191
+ if (e.target === modalOverlay) {
192
+ window.toggleAgentModal();
193
+ }
194
+ });
195
 
196
  document.addEventListener('keydown', function(evt) {
197
+ if (document.activeElement &&
198
+ ['INPUT', 'TEXTAREA'].includes(document.activeElement.tagName)) {
199
+ return;
200
+ }
201
+
202
+ if (evt.key === 'e' || evt.key === 'E') {
203
  window.toggleEasterEgg();
204
+ } else if (evt.key === 'a' || evt.key === 'A') {
205
+ window.toggleAgentModal();
206
  }
207
  });
208
  }