mukul-chauhan-methdai Claude Opus 4.7 commited on
Commit
bbafb94
·
1 Parent(s): 53c0e3e

Restore Reachy Mini app Space landing page

Browse files

Per the official Pollen Robotics 'Make and publish your Reachy Mini App'
guide, index.html + style.css at repo root are the Space's landing page
(not Gradio app files). I incorrectly removed them in 9b1f90c as 'fork
artifacts' — they're actually a required part of the Reachy Mini app
template. Restored from history and rebranded:

- Footer: 'Built by MethdAI' (was 'by Toon Beerten')
- Brand block: shows MethdAI logo + 'MethdAI Receptionist' text
- Page title: 'MethdAI Receptionist - Reachy Mini App'

README frontmatter:
- sdk: gradio -> sdk: static (HF should serve the landing page, not try
to build a Gradio app that needs hardware — was producing the red
'Runtime error' badge on the Space)
- Drop app_file (not needed for static)
- Add tags: reachy-mini / robotics / receptionist for discoverability

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

Files changed (3) hide show
  1. README.md +5 -2
  2. index.html +142 -0
  3. style.css +437 -0
README.md CHANGED
@@ -3,11 +3,14 @@ title: MethdAI Receptionist
3
  emoji: 🤖
4
  colorFrom: indigo
5
  colorTo: purple
6
- sdk: gradio
7
- app_file: src/reachy_mini_receptionist/main.py
8
  pinned: false
9
  license: apache-2.0
10
  short_description: Voice + face recognition receptionist for Reachy Mini
 
 
 
 
11
  ---
12
 
13
  # MethdAI Receptionist
 
3
  emoji: 🤖
4
  colorFrom: indigo
5
  colorTo: purple
6
+ sdk: static
 
7
  pinned: false
8
  license: apache-2.0
9
  short_description: Voice + face recognition receptionist for Reachy Mini
10
+ tags:
11
+ - reachy-mini
12
+ - robotics
13
+ - receptionist
14
  ---
15
 
16
  # MethdAI Receptionist
index.html ADDED
@@ -0,0 +1,142 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!doctype html>
2
+ <html>
3
+
4
+ <head>
5
+ <meta charset="utf-8" />
6
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
7
+ <title>MethdAI Receptionist — Reachy Mini App</title>
8
+ <link rel="preconnect" href="https://fonts.googleapis.com">
9
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
10
+ <link href="https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@400;500;600;700&family=Manrope:wght@400;500;600&display=swap" rel="stylesheet">
11
+ <link rel="stylesheet" href="style.css" />
12
+ </head>
13
+
14
+ <body>
15
+ <header class="hero">
16
+ <div class="topline">
17
+ <div class="brand">
18
+ <img src="src/reachy_mini_receptionist/static/logo.png" alt="MethdAI" class="brand-logo" onerror="this.style.display='none'; this.nextElementSibling.style.display='inline';" />
19
+ <span class="logo" style="display:none">🤖</span>
20
+ <span class="brand-name">MethdAI Receptionist</span>
21
+ </div>
22
+ <div class="pill">Realtime voice · Vision aware · Expressive motion</div>
23
+ </div>
24
+ <div class="hero-grid">
25
+ <div class="hero-copy">
26
+ <p class="eyebrow">AI Receptionist</p>
27
+ <h1>
28
+ Face-aware receptionist with tool-calling automation.
29
+ <a class="live-demo-badge" href="#live-demo">Live demo</a>
30
+ </h1>
31
+ <p class="lede">
32
+ A camera-aware front-desk assistant for Reachy Mini. Greet visitors naturally, register guests, check appointments, and log handoff actions from a single dashboard.
33
+ </p>
34
+ <p class="lede">
35
+ Built for reception workflows: realtime face detection to know when someone is present, face recognition to personalize interactions, and structured tool calls so the AI can register guests, query appointments, and trigger handoff actions reliably.
36
+ </p>
37
+ <div class="hero-actions">
38
+ <a class="btn primary" href="#highlights">Explore features</a>
39
+ <a class="btn ghost" href="#story">See how it feels</a>
40
+ </div>
41
+ <div class="hero-badges">
42
+ <span>Realtime face detection</span>
43
+ <span>Visitor face recognition</span>
44
+ <span>Model tool-calling workflows</span>
45
+ <span>Low-latency voice + dashboard ops</span>
46
+ </div>
47
+ </div>
48
+ <div class="hero-visual">
49
+ <div class="glass-card">
50
+ <img src="screenshot.png" alt="Reachy Mini AI Receptionist screenshot" class="hero-gif">
51
+ <p class="caption">Reachy Mini can greet, identify, and assist visitors with receptionist-specific context.</p>
52
+ <div class="video-embed-wrapper" id="live-demo">
53
+ <iframe
54
+ src="https://www.youtube.com/embed/4U9uj5b9p2Y"
55
+ title="Reachy Mini AI Receptionist live demo"
56
+ loading="lazy"
57
+ allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
58
+ allowfullscreen>
59
+ </iframe>
60
+ </div>
61
+ <p class="video-link"><a href="https://youtu.be/4U9uj5b9p2Y" target="_blank" rel="noopener">Watch on YouTube</a></p>
62
+ </div>
63
+ </div>
64
+ </div>
65
+ </header>
66
+
67
+ <section id="highlights" class="section features">
68
+ <div class="section-header">
69
+ <p class="eyebrow">What’s inside</p>
70
+ <h2>All-in-one receptionist layer for your robot</h2>
71
+ <p class="intro">
72
+ The app blends realtime speech, vision, and workflow tools so Reachy Mini can run a front desk flow.
73
+ </p>
74
+ </div>
75
+ <div class="feature-grid">
76
+ <div class="feature-card">
77
+ <span class="icon">🎤</span>
78
+ <h3>Natural voice chat</h3>
79
+ <p>Talk freely and get fast, high-quality replies powered by realtime models.</p>
80
+ </div>
81
+ <div class="feature-card">
82
+ <span class="icon">🎥</span>
83
+ <h3>Face-aware onboarding</h3>
84
+ <p>Recognize known visitors, register new guests, and keep the latest face context synced with the conversation.</p>
85
+ </div>
86
+ <div class="feature-card">
87
+ <span class="icon">💃</span>
88
+ <h3>Expressive motion</h3>
89
+ <p>Use subtle head and antenna gestures during welcome and registration interactions.</p>
90
+ </div>
91
+ <div class="feature-card">
92
+ <span class="icon">🧠</span>
93
+ <h3>Calendar-aware assistance</h3>
94
+ <p>Use appointment context to welcome guests on time and guide follow-up actions.</p>
95
+ </div>
96
+ <div class="feature-card">
97
+ <span class="icon">🌐</span>
98
+ <h3>Ready for your setup</h3>
99
+ <p>Works in console mode or web mode with dashboard APIs for quick operator visibility.</p>
100
+ </div>
101
+ </div>
102
+ </section>
103
+
104
+ <section id="story" class="section story">
105
+ <div class="story-grid">
106
+ <div class="story-card">
107
+ <p class="eyebrow">How it feels</p>
108
+ <h3>From greeting to handoff in seconds</h3>
109
+ <ul class="story-list">
110
+ <li><span>👋</span> Greet visitors naturally with low-latency voice conversation.</li>
111
+ <li><span>👀</span> Use camera context to identify known guests or register new ones.</li>
112
+ <li><span>📅</span> Check appointment context and respond with relevant timing cues.</li>
113
+ <li><span>📨</span> Log handoff actions in the outbox for host follow-up.</li>
114
+ </ul>
115
+ </div>
116
+ <div class="story-card secondary">
117
+ <p class="eyebrow">Where it shines</p>
118
+ <h3>Great for offices, demos, and guided reception flows</h3>
119
+ <p class="story-text">
120
+ Show how Reachy Mini can handle repeatable visitor workflows while staying expressive and conversational. It is ideal for front-desk demos, events, and product showcases.
121
+ </p>
122
+ <div class="chips">
123
+ <span class="chip">Guest recognition</span>
124
+ <span class="chip">Calendar check</span>
125
+ <span class="chip">Outbox logging</span>
126
+ <span class="chip">Dashboard APIs</span>
127
+ <span class="chip">Realtime conversation</span>
128
+ </div>
129
+ </div>
130
+ </div>
131
+ </section>
132
+
133
+ <footer class="footer">
134
+ <p>
135
+ Built by <a href="https://methdai.com" target="_blank" rel="noopener">MethdAI</a>, based on the Reachy Mini conversation app by <a href="https://github.com/pollen-robotics" target="_blank" rel="noopener">Pollen Robotics</a>.
136
+ Explore more apps on <a href="https://huggingface.co/spaces/pollen-robotics/Reachy_Mini_Apps" target="_blank" rel="noopener">Hugging Face Spaces</a>.
137
+ </p>
138
+ </footer>
139
+
140
+ </body>
141
+
142
+ </html>
style.css ADDED
@@ -0,0 +1,437 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ :root {
2
+ --bg: #060c1d;
3
+ --panel: #0c172b;
4
+ --glass: rgba(17, 27, 48, 0.7);
5
+ --card: rgba(255, 255, 255, 0.04);
6
+ --accent: #7af5c4;
7
+ --accent-2: #f6c452;
8
+ --text: #e8edf7;
9
+ --muted: #9fb3ce;
10
+ --border: rgba(255, 255, 255, 0.08);
11
+ --shadow: 0 25px 70px rgba(0, 0, 0, 0.45);
12
+ font-family: "Space Grotesk", "Manrope", system-ui, -apple-system, sans-serif;
13
+ }
14
+
15
+ * {
16
+ margin: 0;
17
+ padding: 0;
18
+ box-sizing: border-box;
19
+ }
20
+
21
+ body {
22
+ background: radial-gradient(circle at 20% 20%, rgba(122, 245, 196, 0.12), transparent 30%),
23
+ radial-gradient(circle at 80% 0%, rgba(246, 196, 82, 0.14), transparent 32%),
24
+ radial-gradient(circle at 50% 70%, rgba(124, 142, 255, 0.1), transparent 30%),
25
+ var(--bg);
26
+ color: var(--text);
27
+ min-height: 100vh;
28
+ line-height: 1.6;
29
+ padding-bottom: 3rem;
30
+ }
31
+
32
+ a {
33
+ color: inherit;
34
+ text-decoration: none;
35
+ }
36
+
37
+ .hero {
38
+ padding: 3.5rem clamp(1.5rem, 3vw, 3rem) 2.5rem;
39
+ position: relative;
40
+ overflow: hidden;
41
+ }
42
+
43
+ .hero::after {
44
+ content: "";
45
+ position: absolute;
46
+ inset: 0;
47
+ background: linear-gradient(120deg, rgba(122, 245, 196, 0.12), rgba(246, 196, 82, 0.08), transparent);
48
+ pointer-events: none;
49
+ }
50
+
51
+ .topline {
52
+ display: flex;
53
+ align-items: center;
54
+ justify-content: space-between;
55
+ max-width: 1200px;
56
+ margin: 0 auto 2rem;
57
+ position: relative;
58
+ z-index: 2;
59
+ }
60
+
61
+ .brand {
62
+ display: flex;
63
+ align-items: center;
64
+ gap: 0.5rem;
65
+ font-weight: 700;
66
+ letter-spacing: 0.5px;
67
+ color: var(--text);
68
+ }
69
+
70
+ .logo {
71
+ display: inline-flex;
72
+ align-items: center;
73
+ justify-content: center;
74
+ width: 2.2rem;
75
+ height: 2.2rem;
76
+ border-radius: 10px;
77
+ background: linear-gradient(145deg, rgba(122, 245, 196, 0.15), rgba(124, 142, 255, 0.15));
78
+ box-shadow: 0 10px 30px rgba(0, 0, 0, 0.25);
79
+ }
80
+
81
+ .brand-name {
82
+ font-size: 1.1rem;
83
+ }
84
+
85
+ .pill {
86
+ background: rgba(255, 255, 255, 0.06);
87
+ border: 1px solid var(--border);
88
+ padding: 0.6rem 1rem;
89
+ border-radius: 999px;
90
+ color: var(--muted);
91
+ font-size: 0.9rem;
92
+ box-shadow: 0 12px 30px rgba(0, 0, 0, 0.2);
93
+ }
94
+
95
+ .hero-grid {
96
+ display: grid;
97
+ grid-template-columns: repeat(auto-fit, minmax(320px, 1fr));
98
+ gap: clamp(1.5rem, 2.5vw, 2.5rem);
99
+ max-width: 1200px;
100
+ margin: 0 auto;
101
+ position: relative;
102
+ z-index: 2;
103
+ align-items: center;
104
+ }
105
+
106
+ .hero-copy h1 {
107
+ font-size: clamp(2.6rem, 4vw, 3.6rem);
108
+ margin-bottom: 1rem;
109
+ line-height: 1.1;
110
+ letter-spacing: -0.5px;
111
+ }
112
+
113
+ .live-demo-badge {
114
+ display: inline-flex;
115
+ align-items: center;
116
+ margin-left: 0.65rem;
117
+ padding: 0.2rem 0.55rem;
118
+ font-size: 0.34em;
119
+ line-height: 1;
120
+ letter-spacing: 0.02em;
121
+ font-weight: 600;
122
+ border-radius: 999px;
123
+ border: 1px solid var(--border);
124
+ color: var(--muted);
125
+ background: rgba(255, 255, 255, 0.04);
126
+ vertical-align: middle;
127
+ }
128
+
129
+ .live-demo-badge:hover {
130
+ color: var(--text);
131
+ border-color: rgba(255, 255, 255, 0.22);
132
+ background: rgba(255, 255, 255, 0.07);
133
+ }
134
+
135
+ .eyebrow {
136
+ display: inline-flex;
137
+ align-items: center;
138
+ gap: 0.5rem;
139
+ text-transform: uppercase;
140
+ letter-spacing: 1px;
141
+ font-size: 0.8rem;
142
+ color: var(--muted);
143
+ margin-bottom: 0.75rem;
144
+ }
145
+
146
+ .eyebrow::before {
147
+ content: "";
148
+ display: inline-block;
149
+ width: 24px;
150
+ height: 2px;
151
+ background: linear-gradient(90deg, var(--accent), var(--accent-2));
152
+ border-radius: 999px;
153
+ }
154
+
155
+ .lede {
156
+ font-size: 1.1rem;
157
+ color: var(--muted);
158
+ max-width: 620px;
159
+ }
160
+
161
+ .hero-actions {
162
+ display: flex;
163
+ gap: 1rem;
164
+ align-items: center;
165
+ margin: 1.6rem 0 1.2rem;
166
+ flex-wrap: wrap;
167
+ }
168
+
169
+ .btn {
170
+ display: inline-flex;
171
+ align-items: center;
172
+ justify-content: center;
173
+ gap: 0.6rem;
174
+ padding: 0.85rem 1.4rem;
175
+ border-radius: 12px;
176
+ font-weight: 700;
177
+ border: 1px solid transparent;
178
+ cursor: pointer;
179
+ transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.2s ease, border-color 0.2s ease;
180
+ }
181
+
182
+ .btn.primary {
183
+ background: linear-gradient(135deg, #7af5c4, #7c8eff);
184
+ color: #0a0f1f;
185
+ box-shadow: 0 15px 30px rgba(122, 245, 196, 0.25);
186
+ }
187
+
188
+ .btn.primary:hover {
189
+ transform: translateY(-2px);
190
+ box-shadow: 0 25px 45px rgba(122, 245, 196, 0.35);
191
+ }
192
+
193
+ .btn.ghost {
194
+ background: rgba(255, 255, 255, 0.05);
195
+ border-color: var(--border);
196
+ color: var(--text);
197
+ }
198
+
199
+ .btn.ghost:hover {
200
+ border-color: rgba(255, 255, 255, 0.3);
201
+ transform: translateY(-2px);
202
+ }
203
+
204
+ .btn.wide {
205
+ width: 100%;
206
+ justify-content: center;
207
+ }
208
+
209
+ .hero-badges {
210
+ display: flex;
211
+ flex-wrap: wrap;
212
+ gap: 0.6rem;
213
+ color: var(--muted);
214
+ font-size: 0.9rem;
215
+ }
216
+
217
+ .hero-badges span {
218
+ padding: 0.5rem 0.8rem;
219
+ border-radius: 10px;
220
+ border: 1px solid var(--border);
221
+ background: rgba(255, 255, 255, 0.04);
222
+ }
223
+
224
+ .hero-visual .glass-card {
225
+ background: rgba(255, 255, 255, 0.03);
226
+ border: 1px solid var(--border);
227
+ border-radius: 18px;
228
+ padding: 1.2rem;
229
+ box-shadow: var(--shadow);
230
+ backdrop-filter: blur(10px);
231
+ }
232
+
233
+ .hero-gif {
234
+ width: 100%;
235
+ display: block;
236
+ border-radius: 14px;
237
+ border: 1px solid var(--border);
238
+ box-shadow: 0 12px 35px rgba(0, 0, 0, 0.35);
239
+ }
240
+
241
+ .caption {
242
+ margin-top: 0.75rem;
243
+ color: var(--muted);
244
+ font-size: 0.95rem;
245
+ }
246
+
247
+ .video-embed-wrapper {
248
+ margin-top: 0.9rem;
249
+ position: relative;
250
+ width: 100%;
251
+ aspect-ratio: 16 / 9;
252
+ border-radius: 12px;
253
+ overflow: hidden;
254
+ border: 1px solid var(--border);
255
+ background: rgba(0, 0, 0, 0.35);
256
+ }
257
+
258
+ .video-embed-wrapper iframe {
259
+ width: 100%;
260
+ height: 100%;
261
+ display: block;
262
+ border: 0;
263
+ }
264
+
265
+ .video-link {
266
+ margin-top: 0.55rem;
267
+ font-size: 0.85rem;
268
+ color: var(--muted);
269
+ }
270
+
271
+ .video-link a {
272
+ text-decoration: underline;
273
+ text-underline-offset: 2px;
274
+ }
275
+
276
+ .section {
277
+ max-width: 1200px;
278
+ margin: 0 auto;
279
+ padding: clamp(2rem, 4vw, 3.5rem) clamp(1.5rem, 3vw, 3rem);
280
+ }
281
+
282
+ .section-header {
283
+ text-align: center;
284
+ max-width: 780px;
285
+ margin: 0 auto 2rem;
286
+ }
287
+
288
+ .section-header h2 {
289
+ font-size: clamp(2rem, 3vw, 2.6rem);
290
+ margin-bottom: 0.5rem;
291
+ }
292
+
293
+ .intro {
294
+ color: var(--muted);
295
+ font-size: 1.05rem;
296
+ }
297
+
298
+ .feature-grid {
299
+ display: grid;
300
+ grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
301
+ gap: 1rem;
302
+ }
303
+
304
+ .feature-card {
305
+ background: rgba(255, 255, 255, 0.03);
306
+ border: 1px solid var(--border);
307
+ border-radius: 16px;
308
+ padding: 1.25rem;
309
+ box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2);
310
+ transition: transform 0.2s ease, border-color 0.2s ease, box-shadow 0.2s ease;
311
+ }
312
+
313
+ .feature-card:hover {
314
+ transform: translateY(-4px);
315
+ border-color: rgba(122, 245, 196, 0.3);
316
+ box-shadow: 0 18px 40px rgba(0, 0, 0, 0.3);
317
+ }
318
+
319
+ .feature-card .icon {
320
+ width: 48px;
321
+ height: 48px;
322
+ border-radius: 12px;
323
+ display: grid;
324
+ place-items: center;
325
+ background: rgba(122, 245, 196, 0.14);
326
+ margin-bottom: 0.8rem;
327
+ font-size: 1.4rem;
328
+ }
329
+
330
+ .feature-card h3 {
331
+ margin-bottom: 0.35rem;
332
+ }
333
+
334
+ .feature-card p {
335
+ color: var(--muted);
336
+ }
337
+
338
+ .story {
339
+ padding-top: 1rem;
340
+ }
341
+
342
+ .story-grid {
343
+ display: grid;
344
+ grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
345
+ gap: 1rem;
346
+ }
347
+
348
+ .story-card {
349
+ background: rgba(255, 255, 255, 0.03);
350
+ border: 1px solid var(--border);
351
+ border-radius: 18px;
352
+ padding: 1.5rem;
353
+ box-shadow: var(--shadow);
354
+ }
355
+
356
+ .story-card.secondary {
357
+ background: linear-gradient(145deg, rgba(124, 142, 255, 0.08), rgba(122, 245, 196, 0.06));
358
+ }
359
+
360
+ .story-card h3 {
361
+ margin-bottom: 0.8rem;
362
+ }
363
+
364
+ .story-list {
365
+ list-style: none;
366
+ display: grid;
367
+ gap: 0.7rem;
368
+ color: var(--muted);
369
+ font-size: 0.98rem;
370
+ }
371
+
372
+ .story-list li {
373
+ display: flex;
374
+ gap: 0.7rem;
375
+ align-items: flex-start;
376
+ }
377
+
378
+ .story-text {
379
+ color: var(--muted);
380
+ line-height: 1.7;
381
+ margin-bottom: 1rem;
382
+ }
383
+
384
+ .chips {
385
+ display: flex;
386
+ flex-wrap: wrap;
387
+ gap: 0.5rem;
388
+ }
389
+
390
+ .chip {
391
+ padding: 0.45rem 0.8rem;
392
+ border-radius: 12px;
393
+ background: rgba(0, 0, 0, 0.2);
394
+ border: 1px solid var(--border);
395
+ color: var(--text);
396
+ font-size: 0.9rem;
397
+ }
398
+
399
+ .footer {
400
+ text-align: center;
401
+ color: var(--muted);
402
+ padding: 2rem 1.5rem 0;
403
+ }
404
+
405
+ .footer a {
406
+ color: var(--text);
407
+ border-bottom: 1px solid transparent;
408
+ }
409
+
410
+ .footer a:hover {
411
+ border-color: rgba(255, 255, 255, 0.5);
412
+ }
413
+
414
+ @media (max-width: 768px) {
415
+ .hero {
416
+ padding-top: 2.5rem;
417
+ }
418
+
419
+ .topline {
420
+ flex-direction: column;
421
+ gap: 0.8rem;
422
+ align-items: flex-start;
423
+ }
424
+
425
+ .hero-actions {
426
+ width: 100%;
427
+ }
428
+
429
+ .btn {
430
+ width: 100%;
431
+ justify-content: center;
432
+ }
433
+
434
+ .hero-badges {
435
+ gap: 0.4rem;
436
+ }
437
+ }