chitrark commited on
Commit
b21fd1a
ยท
1 Parent(s): 67be16e

Sync local changes

Browse files
Files changed (1) hide show
  1. index.html.save +542 -0
index.html.save ADDED
@@ -0,0 +1,542 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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" />
6
+ <title>ReadingBuddy โ€ข Reachy Mini BookReader</title>
7
+
8
+ <style>
9
+ :root{
10
+ --bg0:#0b1020;
11
+ --bg1:#0f172a;
12
+ --card:rgba(255,255,255,.06);
13
+ --card2:rgba(255,255,255,.08);
14
+ --stroke:rgba(255,255,255,.10);
15
+ --text:#e5e7eb;
16
+ --muted:#a3aab8;
17
+ --muted2:#b6becc;
18
+
19
+ --brand:#818cf8; /* indigo */
20
+ --brand2:#22c55e; /* green */
21
+ --warn:#f59e0b; /* amber */
22
+
23
+ --shadow: 0 20px 60px rgba(0,0,0,.35);
24
+ --radius: 18px;
25
+ }
26
+
27
+ *{ box-sizing:border-box; }
28
+ html,body{ height:100%; }
29
+ body{
30
+ margin:0;
31
+ font-family: ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, "Apple Color Emoji","Segoe UI Emoji";
32
+ color:var(--text);
33
+ background:
34
+ radial-gradient(1200px 600px at 15% 0%, rgba(129,140,248,.25), transparent 60%),
35
+ radial-gradient(900px 500px at 85% 10%, rgba(34,197,94,.18), transparent 55%),
36
+ radial-gradient(700px 450px at 50% 95%, rgba(245,158,11,.16), transparent 55%),
37
+ linear-gradient(180deg, var(--bg0), var(--bg1));
38
+ line-height:1.6;
39
+ }
40
+
41
+ a{ color:#c7d2fe; text-decoration:none; }
42
+ a:hover{ text-decoration:underline; }
43
+
44
+ .container{
45
+ max-width: 980px;
46
+ margin: 0 auto;
47
+ padding: 28px 16px 64px;
48
+ }
49
+
50
+ /* Top mini-nav */
51
+ .topbar{
52
+ position: sticky;
53
+ top: 0;
54
+ z-index: 10;
55
+ margin: -12px 0 18px;
56
+ padding: 10px 0;
57
+ backdrop-filter: blur(10px);
58
+ background: linear-gradient(180deg, rgba(11,16,32,.72), rgba(11,16,32,.35));
59
+ border-bottom: 1px solid rgba(255,255,255,.06);
60
+ }
61
+ .topbar-inner{
62
+ display:flex;
63
+ align-items:center;
64
+ justify-content:space-between;
65
+ gap:12px;
66
+ max-width: 980px;
67
+ margin: 0 auto;
68
+ padding: 0 16px;
69
+ }
70
+ .brandline{
71
+ display:flex;
72
+ align-items:center;
73
+ gap:10px;
74
+ min-width: 200px;
75
+ }
76
+ .logo{
77
+ width:34px;
78
+ height:34px;
79
+ border-radius:12px;
80
+ background:
81
+ radial-gradient(circle at 30% 30%, rgba(129,140,248,.9), rgba(129,140,248,.25) 55%, transparent 60%),
82
+ radial-gradient(circle at 70% 70%, rgba(34,197,94,.65), rgba(34,197,94,.15) 58%, transparent 62%),
83
+ rgba(255,255,255,.06);
84
+ border: 1px solid rgba(255,255,255,.14);
85
+ box-shadow: 0 10px 24px rgba(0,0,0,.25);
86
+ display:grid;
87
+ place-items:center;
88
+ font-size: 16px;
89
+ }
90
+ .brandtext{
91
+ display:flex;
92
+ flex-direction:column;
93
+ line-height:1.15;
94
+ }
95
+ .brandtext strong{ font-size: 0.95rem; letter-spacing:.2px; }
96
+ .brandtext span{ font-size: 0.78rem; color: var(--muted); }
97
+
98
+ .navlinks{
99
+ display:flex;
100
+ flex-wrap:wrap;
101
+ gap:8px;
102
+ justify-content:flex-end;
103
+ }
104
+ .chiplink{
105
+ display:inline-flex;
106
+ align-items:center;
107
+ gap:6px;
108
+ padding: 7px 10px;
109
+ border-radius: 999px;
110
+ background: rgba(255,255,255,.06);
111
+ border: 1px solid rgba(255,255,255,.10);
112
+ color: var(--text);
113
+ font-size: 0.85rem;
114
+ white-space:nowrap;
115
+ }
116
+ .chiplink:hover{
117
+ background: rgba(255,255,255,.09);
118
+ text-decoration:none;
119
+ }
120
+
121
+ /* Hero */
122
+ header.hero{
123
+ margin-top: 14px;
124
+ padding: 22px 22px;
125
+ border-radius: var(--radius);
126
+ background: linear-gradient(135deg, rgba(255,255,255,.08), rgba(255,255,255,.03));
127
+ border: 1px solid rgba(255,255,255,.12);
128
+ box-shadow: var(--shadow);
129
+ overflow:hidden;
130
+ position:relative;
131
+ }
132
+ header.hero:before{
133
+ content:"";
134
+ position:absolute;
135
+ inset:-2px;
136
+ background:
137
+ radial-gradient(600px 200px at 18% 10%, rgba(129,140,248,.18), transparent 65%),
138
+ radial-gradient(500px 220px at 82% 0%, rgba(34,197,94,.16), transparent 68%);
139
+ pointer-events:none;
140
+ }
141
+ .hero-inner{
142
+ position:relative;
143
+ display:grid;
144
+ grid-template-columns: 1.2fr 0.8fr;
145
+ gap: 18px;
146
+ align-items:center;
147
+ }
148
+ @media (max-width: 860px){
149
+ .hero-inner{ grid-template-columns: 1fr; }
150
+ }
151
+
152
+ .badge{
153
+ display:inline-flex;
154
+ gap:8px;
155
+ align-items:center;
156
+ padding: 6px 10px;
157
+ border-radius: 999px;
158
+ background: rgba(129,140,248,.14);
159
+ border: 1px solid rgba(129,140,248,.26);
160
+ color: #e0e7ff;
161
+ font-size: 0.85rem;
162
+ width: fit-content;
163
+ }
164
+ h1{
165
+ margin: 10px 0 8px;
166
+ font-size: 2.25rem;
167
+ line-height: 1.15;
168
+ letter-spacing: -0.3px;
169
+ }
170
+ .sub{
171
+ margin: 0;
172
+ color: var(--muted2);
173
+ max-width: 62ch;
174
+ }
175
+
176
+ .hero-actions{
177
+ display:flex;
178
+ flex-direction:column;
179
+ gap:10px;
180
+ align-items:stretch;
181
+ justify-content:center;
182
+ }
183
+ .statrow{
184
+ display:grid;
185
+ grid-template-columns: 1fr 1fr;
186
+ gap: 10px;
187
+ }
188
+ .stat{
189
+ padding: 12px 12px;
190
+ border-radius: 14px;
191
+ background: rgba(255,255,255,.06);
192
+ border: 1px solid rgba(255,255,255,.10);
193
+ }
194
+ .stat .k{ color: var(--muted); font-size:.78rem; }
195
+ .stat .v{ font-size: 0.95rem; margin-top: 3px; }
196
+ .btnrow{
197
+ display:flex;
198
+ gap:10px;
199
+ flex-wrap:wrap;
200
+ }
201
+ .btn{
202
+ display:inline-flex;
203
+ align-items:center;
204
+ justify-content:center;
205
+ gap:8px;
206
+ padding: 10px 12px;
207
+ border-radius: 14px;
208
+ border: 1px solid rgba(255,255,255,.14);
209
+ background: rgba(255,255,255,.08);
210
+ color: var(--text);
211
+ font-weight: 600;
212
+ font-size: 0.92rem;
213
+ cursor: default;
214
+ user-select:none;
215
+ }
216
+ .btn.primary{
217
+ background: linear-gradient(135deg, rgba(129,140,248,.95), rgba(99,102,241,.70));
218
+ border: 1px solid rgba(129,140,248,.55);
219
+ color: #0b1020;
220
+ }
221
+ .btn small{ font-weight: 500; opacity:.9; }
222
+
223
+ /* Sections grid */
224
+ .grid{
225
+ display:grid;
226
+ grid-template-columns: 1fr 1fr;
227
+ gap: 14px;
228
+ margin-top: 14px;
229
+ }
230
+ @media (max-width: 860px){
231
+ .grid{ grid-template-columns: 1fr; }
232
+ }
233
+ .card{
234
+ padding: 18px 18px;
235
+ border-radius: var(--radius);
236
+ background: var(--card);
237
+ border: 1px solid var(--stroke);
238
+ box-shadow: 0 10px 30px rgba(0,0,0,.22);
239
+ }
240
+ .card.full{ grid-column: 1 / -1; }
241
+ .card h2{
242
+ margin: 0 0 10px;
243
+ font-size: 1.2rem;
244
+ letter-spacing:-0.2px;
245
+ display:flex;
246
+ gap:8px;
247
+ align-items:center;
248
+ }
249
+ .card p{ margin: 0 0 10px; color: var(--muted2); }
250
+ .card p:last-child{ margin-bottom:0; }
251
+
252
+ .list{
253
+ margin: 10px 0 0;
254
+ padding: 0;
255
+ list-style:none;
256
+ display:grid;
257
+ gap: 10px;
258
+ }
259
+ .li{
260
+ display:flex;
261
+ gap:10px;
262
+ align-items:flex-start;
263
+ padding: 12px 12px;
264
+ border-radius: 14px;
265
+ background: rgba(255,255,255,.05);
266
+ border: 1px solid rgba(255,255,255,.09);
267
+ }
268
+ .li .icon{
269
+ width: 34px;
270
+ height: 34px;
271
+ border-radius: 12px;
272
+ display:grid;
273
+ place-items:center;
274
+ background: rgba(255,255,255,.06);
275
+ border: 1px solid rgba(255,255,255,.10);
276
+ flex: 0 0 auto;
277
+ margin-top: 1px;
278
+ }
279
+ .li strong{ display:block; margin-bottom: 2px; }
280
+ .li span{ color: var(--muted2); font-size: 0.95rem; }
281
+
282
+ .pills{
283
+ display:flex;
284
+ gap:8px;
285
+ flex-wrap:wrap;
286
+ margin-top: 10px;
287
+ }
288
+ .pill{
289
+ display:inline-flex;
290
+ align-items:center;
291
+ gap:6px;
292
+ padding: 6px 10px;
293
+ border-radius: 999px;
294
+ background: rgba(255,255,255,.06);
295
+ border: 1px solid rgba(255,255,255,.10);
296
+ font-size: 0.85rem;
297
+ color: var(--text);
298
+ }
299
+ .pill.good{ border-color: rgba(34,197,94,.35); background: rgba(34,197,94,.12); }
300
+ .pill.info{ border-color: rgba(129,140,248,.35); background: rgba(129,140,248,.12); }
301
+ .pill.warn{ border-color: rgba(245,158,11,.35); background: rgba(245,158,11,.12); }
302
+
303
+ code{
304
+ background: rgba(255,255,255,.08);
305
+ border: 1px solid rgba(255,255,255,.10);
306
+ padding: 2px 8px;
307
+ border-radius: 10px;
308
+ font-size: 0.92em;
309
+ color: #e9edff;
310
+ word-break: break-word;
311
+ }
312
+
313
+ ol{
314
+ margin: 10px 0 0;
315
+ padding-left: 1.1rem;
316
+ color: var(--muted2);
317
+ }
318
+ ol li{ margin: 8px 0; }
319
+
320
+ .callout{
321
+ margin-top: 12px;
322
+ padding: 12px 12px;
323
+ border-radius: 16px;
324
+ background: rgba(34,197,94,.10);
325
+ border: 1px solid rgba(34,197,94,.22);
326
+ color: #d1fae5;
327
+ }
328
+ .callout strong{ color:#ecfdf5; }
329
+
330
+ .kbd{
331
+ display:inline-block;
332
+ padding: 2px 8px;
333
+ border-radius: 10px;
334
+ border: 1px solid rgba(255,255,255,.16);
335
+ background: rgba(255,255,255,.07);
336
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
337
+ font-size: 0.9em;
338
+ }
339
+
340
+ footer{
341
+ margin-top: 18px;
342
+ padding-top: 14px;
343
+ border-top: 1px solid rgba(255,255,255,.10);
344
+ color: var(--muted);
345
+ font-size: 0.92rem;
346
+ }
347
+ .fineprint{
348
+ display:flex;
349
+ flex-wrap:wrap;
350
+ gap:10px;
351
+ align-items:center;
352
+ justify-content:space-between;
353
+ }
354
+ .right{
355
+ opacity:.9;
356
+ }
357
+ </style>
358
+ </head>
359
+
360
+ <body>
361
+ <div class="topbar">
362
+ <div class="topbar-inner">
363
+ <div class="brandline">
364
+ <div class="logo">๐Ÿค–</div>
365
+ <div class="brandtext">
366
+ <strong>ReadingBuddy</strong>
367
+ <span>Reachy Mini BookReader</span>
368
+ </div>
369
+ </div>
370
+ <nav class="navlinks" aria-label="On-page navigation">
371
+ <a class="chiplink" href="#what">โœจ What it does</a>
372
+ <a class="chiplink" href="#install">๐Ÿš€ Install</a>
373
+ <a class="chiplink" href="#session">๐ŸŽฎ Session</a>
374
+ <a class="chiplink" href="#reqs">๐Ÿ“ฆ Requirements</a>
375
+ </nav>
376
+ </div>
377
+ </div>
378
+
379
+ <main class="container">
380
+ <header class="hero">
381
+ <div class="hero-inner">
382
+ <div>
383
+ <div class="badge">๐Ÿค–๐Ÿ“š Reachy Mini App โ€ข Kid-friendly reading companion</div>
384
+ <h1>ReadingBuddy</h1>
385
+ <p class="sub">
386
+ Turn your Reachy Mini into a book-reading buddy with fun voices, page memory,
387
+ and a simple camera-to-reading flow that kids can actually use.
388
+ </p>
389
+
390
+ <div class="pills" style="margin-top:14px;">
391
+ <span class="pill info">๐Ÿ“ธ OCR from camera</span>
392
+ <span class="pill info">๐ŸŽญ Character voices</span>
393
+ <span class="pill good">๐Ÿง  Resume by book</span>
394
+ <span class="pill warn">๐Ÿ”Š Hybrid TTS</span>
395
+ </div>
396
+ </div>
397
+
398
+ <div class="hero-actions" aria-label="Quick overview">
399
+ <div class="statrow">
400
+ <div class="stat">
401
+ <div class="k">Voices</div>
402
+ <div class="v">Tech Storyteller โ€ข Princess โ€ข Superhero โ€ข Robot Hero</div>
403
+ </div>
404
+ <div class="stat">
405
+ <div class="k">Best for</div>
406
+ <div class="v">Picture books + short pages kids follow along</div>
407
+ </div>
408
+ </div>
409
+ <div class="btnrow">
410
+ <div class="btn primary">โœ… Designed for demos <small>(fast + reliable)</small></div>
411
+ <div class="btn">๐Ÿงฉ Works with dashboard install</div>
412
+ </div>
413
+ </div>
414
+ </div>
415
+ </header>
416
+
417
+ <section id="what" class="grid" style="margin-top:16px;">
418
+ <div class="card full">
419
+ <h2>โœจ What ReadingBuddy does</h2>
420
+ <p>
421
+ <strong>ReadingBuddy turns your Reachy Mini into a book-reading companion.</strong>
422
+ Put a book in front of Reachy, choose a voice, capture a page, confirm the photo, and it reads out loud โ€”
423
+ while remembering where you stopped so kids can resume next time.
424
+ </p>
425
+ </div>
426
+
427
+ <div class="card">
428
+ <h2>Core features</h2>
429
+ <ul class="list">
430
+ <li class="li">
431
+ <div class="icon">๐Ÿ“ธ</div>
432
+ <div><strong>Smart OCR</strong><span>Capture a page from Reachyโ€™s camera and extract readable text.</span></div>
433
+ </li>
434
+ <li class="li">
435
+ <div class="icon">๐ŸŽญ</div>
436
+ <div><strong>4 character voices</strong><span>Tech Storyteller, Princess, Superhero, Robot Hero.</span></div>
437
+ </li>
438
+ <li class="li">
439
+ <div class="icon">๐Ÿง </div>
440
+ <div><strong>Page memory</strong><span>Saves your place per book for easy โ€œresumeโ€.</span></div>
441
+ </li>
442
+ </ul>
443
+ </div>
444
+
445
+ <div class="card">
446
+ <h2>Kid-friendly flow</h2>
447
+ <ul class="list">
448
+ <li class="li">
449
+ <div class="icon">โœ…</div>
450
+ <div><strong>Preview + confirm</strong><span>Kids can confirm the photo before OCR/reading starts.</span></div>
451
+ </li>
452
+ <li class="li">
453
+ <div class="icon">๐Ÿ“š</div>
454
+ <div><strong>Built-in stories</strong><span>Read preloaded public-domain stories without a camera.</span></div>
455
+ </li>
456
+ <li class="li">
457
+ <div class="icon">๐ŸŽฎ</div>
458
+ <div><strong>Simple controls</strong><span>Read, Retake, Next Page + Read, Again, Stop, hold-to-talk.</span></div>
459
+ </li>
460
+ </ul>
461
+ </div>
462
+ </section>
463
+
464
+ <section id="install" class="grid">
465
+ <div class="card full">
466
+ <h2>๐Ÿš€ How to install on Reachy Mini</h2>
467
+ <ol>
468
+ <li>Start the daemon (wireless version) and open the dashboard at <code>http://REACHY_MINI_IP:8000</code>.</li>
469
+ <li>Click <strong>Install from Hugging Face</strong>.</li>
470
+ <li>Search for <strong><code>reachy_mini_bookreader</code></strong> and click <strong>Install</strong>.</li>
471
+ <li>Open <strong>Applications</strong> โ†’ <strong>ReadingBuddy / BookReader</strong> โ†’ <strong>Run</strong>.</li>
472
+ <li>Click the <strong>โš™๏ธ</strong> settings icon on the app tile to open the full web UI.</li>
473
+ </ol>
474
+ <p style="margin-top:10px;">
475
+ Prefer CLI? You can publish/install via <span class="kbd">reachy-mini-app-assistant</span>.
476
+ </p>
477
+ </div>
478
+ </section>
479
+
480
+ <section id="session" class="grid">
481
+ <div class="card full">
482
+ <h2>๐ŸŽฎ How a reading session works</h2>
483
+ <ol>
484
+ <li>Enter a <strong>book title</strong> + page number (or resume saved progress).</li>
485
+ <li>Select a <strong>voice</strong> (optional: press <strong>Test Voice</strong>).</li>
486
+ <li>Press <strong>Read From Camera</strong> and hold the page steady in front of Reachy.</li>
487
+ <li>Confirm the captured photo in the preview modal.</li>
488
+ <li>Reachy runs OCR and reads the page aloud.</li>
489
+ <li>Use controls: <span class="pill info">Read</span> <span class="pill info">Retake</span> <span class="pill good">Next page</span> <span class="pill info">Again</span> <span class="pill warn">Stop</span></li>
490
+ </ol>
491
+
492
+ <div class="callout">
493
+ <strong>Tip:</strong> For glossy pages or low light, move the book slightly closer and keep it flat.
494
+ A tiny angle change can make OCR much cleaner.
495
+ </div>
496
+ </div>
497
+ </section>
498
+
499
+ <section id="reqs" class="grid">
500
+ <div class="card">
501
+ <h2>๐Ÿ“ฆ Requirements</h2>
502
+ <ul class="list">
503
+ <li class="li">
504
+ <div class="icon">๐Ÿค–</div>
505
+ <div><strong>Reachy Mini</strong><span>Wireless version recommended, with camera + audio working.</span></div>
506
+ </li>
507
+ <li class="li">
508
+ <div class="icon">๐Ÿงฉ</div>
509
+ <div><strong>SDK + dashboard</strong><span><code>reachy-mini</code> version โ‰ฅ <strong>1.2.13</strong>.</span></div>
510
+ </li>
511
+ <li class="li">
512
+ <div class="icon">๐Ÿ”Š</div>
513
+ <div><strong>Hybrid TTS</strong><span>Uses ElevenLabs when available, otherwise espeak-ng fallback.</span></div>
514
+ </li>
515
+ </ul>
516
+ </div>
517
+
518
+ <div class="card">
519
+ <h2>๐Ÿ” Optional env vars</h2>
520
+ <p>Set these if you want premium voice quality:</p>
521
+ <div class="pills">
522
+ <span class="pill warn"><strong>ELEVENLABS_API_KEY</strong></span>
523
+ </div>
524
+ <p style="margin-top:10px;">
525
+ If not set, the app automatically falls back to free TTS (so your demo still works).
526
+ </p>
527
+ </div>
528
+ </section>
529
+
530
+ <footer>
531
+ <div class="fineprint">
532
+ <div>
533
+ This is a Reachy Mini app โ€” it requires the robot hardware to run.
534
+ </div>
535
+ <div class="right">
536
+ Learn more: <a href="https://www.pollen-robotics.com/reachy-mini/" target="_blank" rel="noreferrer">Pollen Robotics โ€ข Reachy Mini</a>
537
+ </div>
538
+ </div>
539
+ </footer>
540
+ </main>
541
+ </body>
542
+ </html>