Ryadg commited on
Commit
353a1ba
Β·
1 Parent(s): dbd761b

feat: full-height library side panels with animated robots

Browse files
Files changed (1) hide show
  1. ui/index.html +220 -127
ui/index.html CHANGED
@@ -217,58 +217,125 @@
217
  .prof-arm.right { right: -12px; transform: rotate(-14deg); }
218
  .professor:hover .prof-arm.right { animation: prof-wave .8s ease-in-out infinite; }
219
 
220
- /* ── Library side panels ──────────────────────────────────────────────── */
221
  .library {
222
- position: absolute; top: 12px; z-index: 0;
223
- width: 180px; height: 380px;
224
- border-radius: var(--r);
225
- border: 1px solid var(--border);
226
  background:
227
- radial-gradient(ellipse 90% 30% at 50% -6%, rgba(167,139,250,.10), transparent 60%),
228
- linear-gradient(180deg, #0B1126 0%, #0A0F1E 60%, #0C1226 100%);
229
- box-shadow: 0 8px 32px rgba(0,0,0,.45), 0 1px 0 rgba(255,255,255,.04) inset;
230
  overflow: hidden;
231
  animation: fadeIn .8s .35s ease both;
232
  }
233
- .library-left { left: -196px; }
234
- .library-right { right: -196px; }
 
235
 
236
  /* bookshelf rows β€” books bottom-align on a wood plank */
237
  .lib-shelf {
238
- position: absolute; left: 14px; right: 14px; height: 64px;
239
- display: flex; align-items: flex-end; gap: 3px; padding: 0 6px;
240
- border-bottom: 6px solid #3B2D23;
241
- box-shadow: 0 8px 10px -6px rgba(0,0,0,.6);
242
  }
243
- .lib-shelf:nth-of-type(1) { top: 26px; }
244
- .lib-shelf:nth-of-type(2) { top: 118px; }
245
- .lib-shelf:nth-of-type(3) { top: 210px; }
246
 
247
  .bk {
248
  display: block; flex-shrink: 0;
249
- width: 10px; height: var(--h, 36px);
250
  background: var(--c, #4C3D8F);
251
  border-radius: 2px 2px 0 0;
252
  box-shadow: inset -2px 0 0 rgba(0,0,0,.35), inset 0 2px 0 rgba(255,255,255,.18);
253
  }
 
 
254
  .bk.lean {
255
  transform: rotate(-9deg);
256
  transform-origin: bottom right;
257
  margin-left: -2px;
258
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
259
 
260
- /* ladder leaning against the shelves (left panel) */
261
  .lib-ladder {
262
- position: absolute; bottom: 8px; right: 16px;
263
- width: 32px; height: 122px;
264
- transform: rotate(9deg); transform-origin: bottom center;
265
  border-left: 4px solid #4A372A; border-right: 4px solid #4A372A;
266
  background: repeating-linear-gradient(180deg, transparent 0 15px, #4A372A 15px 19px);
267
  border-radius: 3px; opacity: .9;
268
  }
269
 
270
- /* potted plant on the middle shelf (right panel β€” sleeper owns the top one) */
271
- .lib-plant { position: absolute; top: 142px; right: 24px; width: 20px; height: 34px; }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
272
  .lib-plant::before {
273
  content: ''; position: absolute; bottom: 9px; left: 50%; margin-left: -10px;
274
  width: 20px; height: 20px;
@@ -284,15 +351,18 @@
284
  border-radius: 2px;
285
  }
286
 
 
 
 
287
  /* ── Mini robots ──────────────────────────────────────────────────────── */
288
  .mini-bot {
289
- position: absolute; width: 40px;
290
  filter: drop-shadow(0 4px 6px rgba(0,0,0,.5));
291
  }
292
  .mini-head {
293
- width: 26px; height: 20px; margin: 0 auto; position: relative;
294
- display: flex; align-items: center; justify-content: center; gap: 4px;
295
- border-radius: 8px;
296
  background: linear-gradient(145deg, #262C4F, #161B36);
297
  border: 1px solid rgba(167,139,250,.45);
298
  }
@@ -309,45 +379,46 @@
309
  }
310
  .mini-eye { width: 5px; height: 6px; border-radius: 50%; background: #EAF2FF; }
311
  .mini-body {
312
- width: 20px; height: 13px; margin: -2px auto 0;
313
  border-radius: 6px;
314
  background: linear-gradient(160deg, #2E2553, #173A52);
315
  border: 1px solid rgba(103,232,249,.35);
316
  }
317
 
318
  /* walking patrol along the floor, flipping at each end */
319
- .bot-walker { bottom: 8px; left: 12px; animation: bot-walk 10s ease-in-out infinite; }
320
- .bot-carrier { bottom: 8px; left: 14px; animation: bot-walk 13s ease-in-out -4s infinite; }
321
- .bot-walker .mini-head, .bot-carrier .mini-head { animation: mini-bob .6s ease-in-out infinite; }
 
322
 
323
  /* stack of books carried in front */
324
  .bot-stack {
325
- position: absolute; bottom: 2px; left: 50%; margin-left: -12px;
326
- width: 24px; z-index: 2;
327
  }
328
  .bot-stack i {
329
  display: block; height: 6px; margin-top: 2px; border-radius: 2px;
330
  box-shadow: inset 0 1px 0 rgba(255,255,255,.25), 0 1px 2px rgba(0,0,0,.4);
331
  }
332
 
333
- /* sitting + reading, gentle rocking, book held in front */
334
  .bot-reader {
335
- top: 145px; left: 20px;
336
  transform-origin: bottom center;
337
  animation: bot-read 3.4s ease-in-out infinite;
338
  }
339
  .bot-reader::after {
340
- content: ''; position: absolute; bottom: 1px; left: 50%; margin-left: -11px;
341
- width: 22px; height: 12px;
342
  background: linear-gradient(90deg, var(--purple) 0 47%, #E2E8F0 47% 53%, var(--cyan) 53% 100%);
343
  border-radius: 2px 2px 5px 5px;
344
  transform: perspective(40px) rotateX(28deg);
345
  box-shadow: 0 2px 4px rgba(0,0,0,.45);
346
  }
347
 
348
- /* dozing on the top shelf β€” closed eyes, breathing pulse, floating zzz */
349
  .bot-sleeper {
350
- top: 53px; right: 22px;
351
  transform-origin: bottom center;
352
  animation: bot-sleep 3.8s ease-in-out infinite;
353
  }
@@ -361,7 +432,24 @@
361
  .zz:nth-of-type(2) { animation-delay: .9s; font-size: 12px; }
362
  .zz:nth-of-type(3) { animation-delay: 1.8s; font-size: 14px; }
363
 
364
- @media (max-width: 1180px) { .library { display: none; } }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
365
 
366
  /* ── Hero text overlay ────────────────────────────────────────────────── */
367
  .hero-overlay {
@@ -697,11 +785,21 @@
697
  50% { transform: rotate(-115deg); }
698
  }
699
  @keyframes bot-walk {
700
- 0% { transform: translateX(0) scaleX(1); }
701
- 44% { transform: translateX(104px) scaleX(1); }
702
- 50% { transform: translateX(104px) scaleX(-1); }
703
- 94% { transform: translateX(0) scaleX(-1); }
704
- 100% { transform: translateX(0) scaleX(1); }
 
 
 
 
 
 
 
 
 
 
705
  }
706
  @keyframes mini-bob { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(-1.5px); } }
707
  @keyframes bot-read { 0%, 100% { transform: rotate(-2deg); } 50% { transform: rotate(2.5deg); } }
@@ -777,92 +875,87 @@
777
  </style>
778
  <canvas id="particles"></canvas>
779
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
780
  <div id="app">
781
  <!-- Hero β€” cinematic amphitheater with AI professor -->
782
  <header class="hero">
783
 
784
  <!-- Library wing β€” left (decorative) -->
785
- <div class="library library-left" aria-hidden="true">
786
- <div class="lib-shelf">
787
- <i class="bk" style="--h:40px;--c:#7C3AED"></i>
788
- <i class="bk" style="--h:32px;--c:#67E8F9"></i>
789
- <i class="bk" style="--h:44px;--c:#4C3D8F"></i>
790
- <i class="bk" style="--h:28px;--c:#E2E8F0"></i>
791
- <i class="bk" style="--h:38px;--c:#06B6D4"></i>
792
- <i class="bk lean" style="--h:34px;--c:#A78BFA"></i>
793
- <i class="bk" style="--h:42px;--c:#2E2553"></i>
794
- <i class="bk" style="--h:30px;--c:#1E6F8F"></i>
795
- </div>
796
- <div class="lib-shelf" style="justify-content:flex-end">
797
- <i class="bk" style="--h:36px;--c:#06B6D4"></i>
798
- <i class="bk" style="--h:44px;--c:#A78BFA"></i>
799
- <i class="bk lean" style="--h:30px;--c:#E2E8F0"></i>
800
- <i class="bk" style="--h:40px;--c:#4C3D8F"></i>
801
- <i class="bk" style="--h:34px;--c:#67E8F9"></i>
802
- </div>
803
- <div class="lib-shelf">
804
- <i class="bk" style="--h:42px;--c:#2E2553"></i>
805
- <i class="bk" style="--h:30px;--c:#7C3AED"></i>
806
- <i class="bk" style="--h:38px;--c:#E2E8F0"></i>
807
- <i class="bk lean" style="--h:32px;--c:#06B6D4"></i>
808
- <i class="bk" style="--h:44px;--c:#A78BFA"></i>
809
- <i class="bk" style="--h:28px;--c:#1E6F8F"></i>
810
- <i class="bk" style="--h:36px;--c:#4C3D8F"></i>
811
- </div>
812
- <div class="lib-ladder"></div>
813
- <div class="mini-bot bot-reader">
814
- <div class="mini-head"><span class="mini-eye"></span><span class="mini-eye"></span></div>
815
- <div class="mini-body"></div>
816
- </div>
817
- <div class="mini-bot bot-walker">
818
- <div class="mini-head"><span class="mini-eye"></span><span class="mini-eye"></span></div>
819
- <div class="mini-body"></div>
820
- </div>
821
- </div>
822
-
823
- <!-- Library wing β€” right (decorative) -->
824
- <div class="library library-right" aria-hidden="true">
825
- <div class="lib-shelf">
826
- <i class="bk" style="--h:38px;--c:#A78BFA"></i>
827
- <i class="bk" style="--h:44px;--c:#06B6D4"></i>
828
- <i class="bk lean" style="--h:30px;--c:#E2E8F0"></i>
829
- <i class="bk" style="--h:34px;--c:#4C3D8F"></i>
830
- <i class="bk" style="--h:40px;--c:#7C3AED"></i>
831
- </div>
832
- <div class="lib-shelf">
833
- <i class="bk" style="--h:34px;--c:#1E6F8F"></i>
834
- <i class="bk" style="--h:42px;--c:#7C3AED"></i>
835
- <i class="bk" style="--h:28px;--c:#67E8F9"></i>
836
- <i class="bk lean" style="--h:36px;--c:#2E2553"></i>
837
- <i class="bk" style="--h:44px;--c:#E2E8F0"></i>
838
- <i class="bk" style="--h:32px;--c:#A78BFA"></i>
839
- <i class="bk" style="--h:38px;--c:#06B6D4"></i>
840
- </div>
841
- <div class="lib-shelf" style="justify-content:flex-end">
842
- <i class="bk" style="--h:40px;--c:#4C3D8F"></i>
843
- <i class="bk" style="--h:30px;--c:#06B6D4"></i>
844
- <i class="bk" style="--h:44px;--c:#A78BFA"></i>
845
- <i class="bk lean" style="--h:34px;--c:#1E6F8F"></i>
846
- <i class="bk" style="--h:38px;--c:#E2E8F0"></i>
847
- <i class="bk" style="--h:28px;--c:#7C3AED"></i>
848
- </div>
849
- <div class="lib-plant"></div>
850
- <div class="mini-bot bot-sleeper">
851
- <div class="mini-head"><span class="mini-eye"></span><span class="mini-eye"></span></div>
852
- <div class="mini-body"></div>
853
- <span class="zz">z</span><span class="zz">z</span><span class="zz">z</span>
854
- </div>
855
- <div class="mini-bot bot-carrier">
856
- <div class="bot-stack">
857
- <i style="background:#7C3AED"></i>
858
- <i style="background:#67E8F9"></i>
859
- <i style="background:#E2E8F0"></i>
860
- </div>
861
- <div class="mini-head"><span class="mini-eye"></span><span class="mini-eye"></span></div>
862
- <div class="mini-body"></div>
863
- </div>
864
- </div>
865
-
866
  <div class="amphitheater" id="amphitheater">
867
  <div class="amphi-beam"></div>
868
 
 
217
  .prof-arm.right { right: -12px; transform: rotate(-14deg); }
218
  .professor:hover .prof-arm.right { animation: prof-wave .8s ease-in-out infinite; }
219
 
220
+ /* ── Library wings β€” full-height public-library decor on both edges ──── */
221
  .library {
222
+ position: fixed; top: 0; bottom: 0; z-index: 0;
223
+ width: clamp(190px, calc((100vw - 850px) / 2), 340px);
224
+ display: flex; flex-direction: column; justify-content: space-between;
225
+ gap: 12px; padding: 26px 18px 0;
226
  background:
227
+ radial-gradient(ellipse 90% 16% at 50% -3%, rgba(167,139,250,.10), transparent 60%),
228
+ linear-gradient(180deg, #0B1126 0%, #0A0F1E 55%, #0C1226 100%);
 
229
  overflow: hidden;
230
  animation: fadeIn .8s .35s ease both;
231
  }
232
+ .library-left { left: 0; border-right: 1px solid var(--border); box-shadow: 18px 0 40px -20px rgba(0,0,0,.6); }
233
+ .library-right { right: 0; border-left: 1px solid var(--border); box-shadow: -18px 0 40px -20px rgba(0,0,0,.6); }
234
+ @media (max-width: 1240px) { .library { display: none; } }
235
 
236
  /* bookshelf rows β€” books bottom-align on a wood plank */
237
  .lib-shelf {
238
+ position: relative; height: 76px; flex-shrink: 0;
239
+ display: flex; align-items: flex-end; gap: 4px; padding: 0 8px;
240
+ border-bottom: 7px solid #3B2D23;
241
+ box-shadow: 0 9px 12px -7px rgba(0,0,0,.6);
242
  }
 
 
 
243
 
244
  .bk {
245
  display: block; flex-shrink: 0;
246
+ width: 12px; height: var(--h, 40px);
247
  background: var(--c, #4C3D8F);
248
  border-radius: 2px 2px 0 0;
249
  box-shadow: inset -2px 0 0 rgba(0,0,0,.35), inset 0 2px 0 rgba(255,255,255,.18);
250
  }
251
+ .bk.slim { width: 9px; }
252
+ .bk.wide { width: 16px; }
253
  .bk.lean {
254
  transform: rotate(-9deg);
255
  transform-origin: bottom right;
256
  margin-left: -2px;
257
  }
258
+ .b1 { --c: #7C3AED; } .b2 { --c: #A78BFA; } .b3 { --c: #06B6D4; } .b4 { --c: #67E8F9; }
259
+ .b5 { --c: #E2E8F0; } .b6 { --c: #4C3D8F; } .b7 { --c: #1E6F8F; } .b8 { --c: #2E2553; }
260
+
261
+ /* aisle β€” perspective corridor between two shelf walls */
262
+ .lib-aisle {
263
+ position: relative; flex: 0 1 150px; min-height: 96px;
264
+ border-radius: 10px; border: 1px solid var(--border);
265
+ background: linear-gradient(180deg, #0A0F1E, #10172E);
266
+ overflow: hidden;
267
+ }
268
+ .lib-aisle::before, .lib-aisle::after {
269
+ content: ''; position: absolute; top: 0; bottom: 0; width: 50%;
270
+ background:
271
+ repeating-linear-gradient(0deg, rgba(59,45,35,.95) 0 5px, transparent 5px 26px),
272
+ repeating-linear-gradient(90deg,
273
+ #4C3D8F 0 6px, #06B6D4 6px 10px, #2E2553 10px 17px,
274
+ #A78BFA 17px 21px, #1E2240 21px 30px);
275
+ }
276
+ .lib-aisle::before { left: 0; transform: perspective(240px) rotateY(50deg); transform-origin: left center; }
277
+ .lib-aisle::after { right: 0; transform: perspective(240px) rotateY(-50deg); transform-origin: right center; }
278
+ .aisle-end { /* glowing far end + floor */
279
+ position: absolute; inset: 0; pointer-events: none;
280
+ background:
281
+ radial-gradient(ellipse 26% 40% at 50% 46%, rgba(167,139,250,.30), transparent 70%),
282
+ linear-gradient(180deg, transparent 58%, rgba(20,26,51,.9) 60%, #141A33 100%);
283
+ }
284
+ .aisle-bot { /* tiny robot deep in the corridor */
285
+ position: absolute; bottom: 26%; left: 50%; margin-left: -6px;
286
+ width: 12px; height: 17px; border-radius: 4px 4px 3px 3px;
287
+ background: linear-gradient(180deg, #262C4F 0 45%, #173A52 45% 100%);
288
+ border: 1px solid rgba(167,139,250,.4);
289
+ animation: aisle-walk 9s ease-in-out infinite;
290
+ }
291
+ .aisle-bot::before { /* visor */
292
+ content: ''; position: absolute; top: 4px; left: 2px; right: 2px; height: 3px;
293
+ border-radius: 2px; background: rgba(234,242,255,.85);
294
+ }
295
+
296
+ /* tall section β€” shelf with room below for ladder / fetching robot */
297
+ .lib-tall { position: relative; flex: 0 1 200px; min-height: 150px; }
298
+ .lib-tall .lib-shelf { position: absolute; top: 0; left: 0; right: 0; }
299
 
 
300
  .lib-ladder {
301
+ position: absolute; bottom: 4px; right: 24px;
302
+ width: 32px; height: 126px;
303
+ transform: rotate(7deg); transform-origin: bottom center;
304
  border-left: 4px solid #4A372A; border-right: 4px solid #4A372A;
305
  background: repeating-linear-gradient(180deg, transparent 0 15px, #4A372A 15px 19px);
306
  border-radius: 3px; opacity: .9;
307
  }
308
 
309
+ /* study desk β€” robot working behind it */
310
+ .lib-desk { position: relative; height: 92px; flex-shrink: 0; }
311
+ .desk-table { position: absolute; bottom: 6px; left: 14%; right: 14%; height: 36px; }
312
+ .desk-table::before { /* wood top */
313
+ content: ''; position: absolute; top: 0; left: 0; right: 0; height: 7px;
314
+ background: linear-gradient(180deg, #4A372A, #33261D);
315
+ border-radius: 3px;
316
+ box-shadow: 0 3px 6px rgba(0,0,0,.45);
317
+ }
318
+ .desk-table::after { /* front panel */
319
+ content: ''; position: absolute; top: 7px; left: 7px; right: 7px; bottom: 0;
320
+ background: linear-gradient(180deg, #2A2019, #1C1612);
321
+ border-radius: 0 0 4px 4px;
322
+ }
323
+ .desk-screen {
324
+ position: absolute; bottom: 48px; left: 58%;
325
+ width: 17px; height: 12px; transform: skewX(-6deg);
326
+ background: linear-gradient(180deg, #67E8F9, #0E7490);
327
+ border-radius: 2px 2px 1px 1px;
328
+ box-shadow: 0 0 10px rgba(103,232,249,.55);
329
+ animation: pulse 1.7s ease-in-out infinite;
330
+ }
331
+ .desk-pile { position: absolute; bottom: 48px; left: 58%; width: 20px; }
332
+ .desk-pile i {
333
+ display: block; height: 5px; margin-top: 2px; border-radius: 2px;
334
+ box-shadow: inset 0 1px 0 rgba(255,255,255,.25);
335
+ }
336
+
337
+ /* potted plant on a shelf */
338
+ .lib-plant { position: absolute; bottom: 0; right: 14px; width: 20px; height: 34px; }
339
  .lib-plant::before {
340
  content: ''; position: absolute; bottom: 9px; left: 50%; margin-left: -10px;
341
  width: 20px; height: 20px;
 
351
  border-radius: 2px;
352
  }
353
 
354
+ /* open floor at the bottom β€” patrol area */
355
+ .lib-floor { position: relative; flex: 1 0 96px; }
356
+
357
  /* ── Mini robots ──────────────────────────────────────────────────────── */
358
  .mini-bot {
359
+ position: absolute; width: 44px;
360
  filter: drop-shadow(0 4px 6px rgba(0,0,0,.5));
361
  }
362
  .mini-head {
363
+ width: 28px; height: 21px; margin: 0 auto; position: relative;
364
+ display: flex; align-items: center; justify-content: center; gap: 5px;
365
+ border-radius: 9px;
366
  background: linear-gradient(145deg, #262C4F, #161B36);
367
  border: 1px solid rgba(167,139,250,.45);
368
  }
 
379
  }
380
  .mini-eye { width: 5px; height: 6px; border-radius: 50%; background: #EAF2FF; }
381
  .mini-body {
382
+ width: 22px; height: 14px; margin: -2px auto 0;
383
  border-radius: 6px;
384
  background: linear-gradient(160deg, #2E2553, #173A52);
385
  border: 1px solid rgba(103,232,249,.35);
386
  }
387
 
388
  /* walking patrol along the floor, flipping at each end */
389
+ .bot-walker { bottom: 10px; animation: bot-walk 14s ease-in-out infinite; }
390
+ .bot-carrier { bottom: 10px; animation: bot-walk 18s ease-in-out -6s infinite; }
391
+ .bot-walker .mini-head, .bot-carrier .mini-head,
392
+ .bot-worker .mini-head { animation: mini-bob .6s ease-in-out infinite; }
393
 
394
  /* stack of books carried in front */
395
  .bot-stack {
396
+ position: absolute; bottom: 2px; left: 50%; margin-left: -13px;
397
+ width: 26px; z-index: 2;
398
  }
399
  .bot-stack i {
400
  display: block; height: 6px; margin-top: 2px; border-radius: 2px;
401
  box-shadow: inset 0 1px 0 rgba(255,255,255,.25), 0 1px 2px rgba(0,0,0,.4);
402
  }
403
 
404
+ /* sitting on a shelf, reading β€” gentle rocking, book held in front */
405
  .bot-reader {
406
+ bottom: 0; left: 10px;
407
  transform-origin: bottom center;
408
  animation: bot-read 3.4s ease-in-out infinite;
409
  }
410
  .bot-reader::after {
411
+ content: ''; position: absolute; bottom: 1px; left: 50%; margin-left: -12px;
412
+ width: 24px; height: 13px;
413
  background: linear-gradient(90deg, var(--purple) 0 47%, #E2E8F0 47% 53%, var(--cyan) 53% 100%);
414
  border-radius: 2px 2px 5px 5px;
415
  transform: perspective(40px) rotateX(28deg);
416
  box-shadow: 0 2px 4px rgba(0,0,0,.45);
417
  }
418
 
419
+ /* dozing on a shelf β€” closed eyes, breathing pulse, floating zzz */
420
  .bot-sleeper {
421
+ bottom: 0; right: 12px;
422
  transform-origin: bottom center;
423
  animation: bot-sleep 3.8s ease-in-out infinite;
424
  }
 
432
  .zz:nth-of-type(2) { animation-delay: .9s; font-size: 12px; }
433
  .zz:nth-of-type(3) { animation-delay: 1.8s; font-size: 14px; }
434
 
435
+ /* climbing the ladder to fetch a book */
436
+ .bot-climber { right: 22px; bottom: 6px; animation: bot-climb 8s ease-in-out infinite; }
437
+
438
+ /* on tiptoes, pulling a book down from the shelf above */
439
+ .bot-fetcher {
440
+ left: 18px; bottom: 6px;
441
+ transform-origin: bottom center;
442
+ animation: bot-fetch 4.6s ease-in-out infinite;
443
+ }
444
+ .bot-fetcher::before { /* the coveted book */
445
+ content: ''; position: absolute; top: -13px; left: 50%; margin-left: -9px;
446
+ width: 18px; height: 6px; border-radius: 2px;
447
+ background: var(--purple);
448
+ box-shadow: inset 0 1px 0 rgba(255,255,255,.25), 0 1px 3px rgba(0,0,0,.4);
449
+ }
450
+
451
+ /* seated at the desk, body hidden behind the front panel */
452
+ .bot-worker { left: 26%; bottom: 30px; }
453
 
454
  /* ── Hero text overlay ────────────────────────────────────────────────── */
455
  .hero-overlay {
 
785
  50% { transform: rotate(-115deg); }
786
  }
787
  @keyframes bot-walk {
788
+ 0% { left: 10px; transform: scaleX(1); }
789
+ 44% { left: calc(100% - 56px); transform: scaleX(1); }
790
+ 50% { left: calc(100% - 56px); transform: scaleX(-1); }
791
+ 94% { left: 10px; transform: scaleX(-1); }
792
+ 100% { left: 10px; transform: scaleX(1); }
793
+ }
794
+ @keyframes bot-climb {
795
+ 0%, 12% { transform: translate(0, 0); }
796
+ 42%, 58% { transform: translate(-13px, -88px); }
797
+ 88%, 100% { transform: translate(0, 0); }
798
+ }
799
+ @keyframes bot-fetch { 0%, 100% { transform: scaleY(1); } 45%, 60% { transform: scaleY(1.13); } }
800
+ @keyframes aisle-walk {
801
+ 0%, 100% { transform: translateX(-9px) scale(.92); }
802
+ 50% { transform: translateX(9px) scale(1); }
803
  }
804
  @keyframes mini-bob { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(-1.5px); } }
805
  @keyframes bot-read { 0%, 100% { transform: rotate(-2deg); } 50% { transform: rotate(2.5deg); } }
 
875
  </style>
876
  <canvas id="particles"></canvas>
877
 
878
+ <!-- ── Library wings β€” full-height decor flanking the app (decorative) ──── -->
879
+ <div class="library library-left" aria-hidden="true">
880
+ <div class="lib-shelf">
881
+ <i class="bk b1" style="--h:48px"></i><i class="bk b4 slim" style="--h:34px"></i>
882
+ <i class="bk b6" style="--h:52px"></i><i class="bk b5" style="--h:30px"></i>
883
+ <i class="bk b3 wide" style="--h:44px"></i><i class="bk b2 lean" style="--h:38px"></i>
884
+ <i class="bk b8" style="--h:54px"></i><i class="bk b7 slim" style="--h:36px"></i>
885
+ <i class="bk b1" style="--h:46px"></i><i class="bk b4" style="--h:32px"></i>
886
+ <i class="bk b5 slim" style="--h:42px"></i>
887
+ </div>
888
+ <div class="lib-shelf" style="justify-content:flex-end">
889
+ <i class="bk b3" style="--h:42px"></i><i class="bk b2 wide" style="--h:50px"></i>
890
+ <i class="bk b5 lean" style="--h:32px"></i><i class="bk b6" style="--h:46px"></i>
891
+ <i class="bk b4 slim" style="--h:36px"></i><i class="bk b1" style="--h:52px"></i>
892
+ <i class="bk b7" style="--h:38px"></i>
893
+ <div class="mini-bot bot-reader"><div class="mini-head"><span class="mini-eye"></span><span class="mini-eye"></span></div><div class="mini-body"></div></div>
894
+ </div>
895
+ <div class="lib-aisle"><div class="aisle-end"></div><span class="aisle-bot"></span></div>
896
+ <div class="lib-tall">
897
+ <div class="lib-shelf">
898
+ <i class="bk b8" style="--h:50px"></i><i class="bk b1 slim" style="--h:34px"></i>
899
+ <i class="bk b5" style="--h:42px"></i><i class="bk b3 lean" style="--h:36px"></i>
900
+ <i class="bk b2" style="--h:52px"></i><i class="bk b7 slim" style="--h:30px"></i>
901
+ <i class="bk b6 wide" style="--h:44px"></i>
902
+ </div>
903
+ <div class="lib-ladder"></div>
904
+ <div class="mini-bot bot-climber"><div class="mini-head"><span class="mini-eye"></span><span class="mini-eye"></span></div><div class="mini-body"></div></div>
905
+ </div>
906
+ <div class="lib-desk">
907
+ <div class="mini-bot bot-worker"><div class="mini-head"><span class="mini-eye"></span><span class="mini-eye"></span></div><div class="mini-body"></div></div>
908
+ <div class="desk-table"></div>
909
+ <div class="desk-screen"></div>
910
+ </div>
911
+ <div class="lib-floor">
912
+ <div class="mini-bot bot-walker"><div class="mini-head"><span class="mini-eye"></span><span class="mini-eye"></span></div><div class="mini-body"></div></div>
913
+ </div>
914
+ </div>
915
+
916
+ <div class="library library-right" aria-hidden="true">
917
+ <div class="lib-shelf">
918
+ <i class="bk b2" style="--h:46px"></i><i class="bk b3 wide" style="--h:52px"></i>
919
+ <i class="bk b5 lean" style="--h:32px"></i><i class="bk b6" style="--h:40px"></i>
920
+ <i class="bk b1 slim" style="--h:48px"></i><i class="bk b4" style="--h:34px"></i>
921
+ <i class="bk b8" style="--h:44px"></i>
922
+ <div class="mini-bot bot-sleeper"><div class="mini-head"><span class="mini-eye"></span><span class="mini-eye"></span></div><div class="mini-body"></div><span class="zz">z</span><span class="zz">z</span><span class="zz">z</span></div>
923
+ </div>
924
+ <div class="lib-shelf">
925
+ <i class="bk b7" style="--h:38px"></i><i class="bk b1 wide" style="--h:50px"></i>
926
+ <i class="bk b4 slim" style="--h:30px"></i><i class="bk b8 lean" style="--h:40px"></i>
927
+ <i class="bk b5" style="--h:52px"></i><i class="bk b2 slim" style="--h:34px"></i>
928
+ <i class="bk b3" style="--h:44px"></i><i class="bk b6" style="--h:36px"></i>
929
+ <div class="lib-plant"></div>
930
+ </div>
931
+ <div class="lib-aisle"><div class="aisle-end"></div><span class="aisle-bot" style="animation-delay:-4s"></span></div>
932
+ <div class="lib-tall">
933
+ <div class="lib-shelf" style="justify-content:flex-end">
934
+ <i class="bk b6" style="--h:44px"></i><i class="bk b4 slim" style="--h:30px"></i>
935
+ <i class="bk b1" style="--h:52px"></i><i class="bk b5 lean" style="--h:36px"></i>
936
+ <i class="bk b3 wide" style="--h:42px"></i><i class="bk b2" style="--h:34px"></i>
937
+ </div>
938
+ <div class="mini-bot bot-fetcher"><div class="mini-head"><span class="mini-eye"></span><span class="mini-eye"></span></div><div class="mini-body"></div></div>
939
+ </div>
940
+ <div class="lib-desk">
941
+ <div class="mini-bot bot-worker"><div class="mini-head"><span class="mini-eye"></span><span class="mini-eye"></span></div><div class="mini-body"></div></div>
942
+ <div class="desk-table"></div>
943
+ <div class="desk-pile"><i style="background:#06B6D4"></i><i style="background:#A78BFA"></i><i style="background:#E2E8F0"></i></div>
944
+ </div>
945
+ <div class="lib-floor">
946
+ <div class="mini-bot bot-carrier">
947
+ <div class="bot-stack"><i style="background:#7C3AED"></i><i style="background:#67E8F9"></i><i style="background:#E2E8F0"></i></div>
948
+ <div class="mini-head"><span class="mini-eye"></span><span class="mini-eye"></span></div><div class="mini-body"></div>
949
+ </div>
950
+ </div>
951
+ </div>
952
+
953
+
954
  <div id="app">
955
  <!-- Hero β€” cinematic amphitheater with AI professor -->
956
  <header class="hero">
957
 
958
  <!-- Library wing β€” left (decorative) -->
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
959
  <div class="amphitheater" id="amphitheater">
960
  <div class="amphi-beam"></div>
961