lively-mascot 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,3115 @@
1
+ /* ============================================================
2
+ * lively-mascot · Base Styles (shared across all characters)
3
+ *
4
+ * Zero dependencies, pure CSS. Visual language: solid fill + 2px
5
+ * ink outline + hard-edge offset shadow (sticker / neo-brutalist).
6
+ *
7
+ * Theme vars (set via JS inline style or override):
8
+ * --lively-body Body fill, default #48ff42
9
+ * --lively-outline Outline / eyes / shadow ink, default #080808
10
+ * --lively-accent Blush accent, default #ff9fb6
11
+ *
12
+ * Structure (DOM):
13
+ * .lively-mascot (root, cursor-follow class)
14
+ * .lively-mascot__rig (JS applies tilt/translate via transform)
15
+ * .lively-body -> idle sway
16
+ * .lively-face-wrap > svg > .lively-face -> blink
17
+ * .lively__feet -> step / happy kick / hopping tuck
18
+ * ============================================================ */
19
+
20
+ /* --- Root --- */
21
+ .lively-mascot {
22
+ --lively-body: #48ff42;
23
+ --lively-outline: #080808;
24
+ --lively-accent: #ff9fb6;
25
+ --lively-depth-transform: rotateX(0deg) rotateY(0deg);
26
+ --lively-gloss-x: 25%;
27
+ --lively-gloss-y: 18%;
28
+ position: relative;
29
+ display: inline-block;
30
+ width: 106px;
31
+ height: 106px;
32
+ container-type: inline-size;
33
+ cursor: pointer;
34
+ user-select: none;
35
+ }
36
+
37
+ /* 2D view keeps the original flat, sticker-like rendering. */
38
+ .lively-mascot--2d {
39
+ perspective: none;
40
+ }
41
+
42
+ /* Lightweight depth treatment: the same SVG character gains a shallow
43
+ camera angle, layered parts, and directional shading without WebGL. */
44
+ .lively-mascot--3d {
45
+ --lively-depth-transform: rotateX(2deg) rotateY(-2.8deg);
46
+ perspective: 680px;
47
+ perspective-origin: 50% 50%;
48
+ }
49
+
50
+ .lively-mascot--3d .lively-mascot__rig,
51
+ .lively-mascot--3d .lively-mascot__gaze,
52
+ .lively-mascot.lively-mascot--3d .lively-body,
53
+ .lively-mascot--3d .lively-face-wrap {
54
+ transform-style: preserve-3d;
55
+ }
56
+
57
+ .lively-mascot--3d .lively-mascot__gaze {
58
+ transform-origin: 50% 58%;
59
+ }
60
+
61
+ .lively-mascot__gaze { transform: var(--lively-depth-transform); }
62
+
63
+ .lively-mascot.lively-mascot--3d .lively-body {
64
+ box-shadow:
65
+ 0 16px 24px rgba(15, 17, 18, .24),
66
+ 0 4px 7px rgba(15, 17, 18, .16),
67
+ inset -12px -14px 22px rgba(10, 15, 20, .22),
68
+ inset 7px 7px 14px rgba(255,255,255,.21);
69
+ filter: saturate(1.03) contrast(1.02);
70
+ backface-visibility: hidden;
71
+ }
72
+
73
+ .lively-mascot--3d .lively-body::before {
74
+ content: "";
75
+ position: absolute;
76
+ inset: 0;
77
+ border-radius: inherit;
78
+ background:
79
+ radial-gradient(ellipse at var(--lively-gloss-x) var(--lively-gloss-y), rgba(255,255,255,.34) 0%, rgba(255,255,255,.17) 16%, transparent 43%),
80
+ linear-gradient(145deg, rgba(255,255,255,.13) 0%, rgba(255,255,255,0) 43%),
81
+ linear-gradient(325deg, rgba(10,15,20,.20) 0%, rgba(10,15,20,0) 46%);
82
+ opacity: .92;
83
+ pointer-events: none;
84
+ transform: translateZ(6px);
85
+ filter: blur(.65px);
86
+ }
87
+
88
+ .lively-mascot--3d .lively-body::after {
89
+ content: "";
90
+ position: absolute;
91
+ inset: 2px;
92
+ border-radius: inherit;
93
+ border: 1px solid rgba(255,255,255,.13);
94
+ box-shadow: inset -4px -5px 7px rgba(8,13,18,.10), inset 2px 2px 5px rgba(255,255,255,.08);
95
+ pointer-events: none;
96
+ transform: translateZ(2px);
97
+ opacity: .82;
98
+ }
99
+
100
+ .lively-mascot--3d .lively-face-wrap {
101
+ transform: translateZ(11px);
102
+ filter: drop-shadow(0 3px 3px rgba(0,0,0,.14));
103
+ }
104
+ .lively-mascot--3d .lively__leaf,
105
+ .lively-mascot--3d .lively__ears,
106
+ .lively-mascot--3d .lively__antenna {
107
+ filter: drop-shadow(2px 4px 3px rgba(0,0,0,.18));
108
+ }
109
+ .lively-mascot--3d .lively__leaf svg,
110
+ .lively-mascot--3d .lively__ears svg,
111
+ .lively-mascot--3d .lively__antenna svg {
112
+ transform: translateZ(13px);
113
+ filter: drop-shadow(3px 5px 4px rgba(0,0,0,.19));
114
+ }
115
+
116
+ /* Solid accessories use their own depth planes so they do not read as flat decals. */
117
+ .lively-mascot--3d .lively__tail {
118
+ transform-style: preserve-3d;
119
+ filter: drop-shadow(2px 4px 3px rgba(0,0,0,.16));
120
+ }
121
+ .lively-mascot--3d .lively__tail svg { transform: translateZ(-3px); }
122
+ .lively-mascot--3d .lively__feet {
123
+ transform: translateZ(5px);
124
+ filter: var(--lively-state-filter, brightness(1)) drop-shadow(0 5px 4px rgba(0,0,0,.20));
125
+ }
126
+ .lively-mascot--3d .lively__foot svg {
127
+ transform: translateZ(10px);
128
+ filter: drop-shadow(1px 3px 3px rgba(0,0,0,.20));
129
+ }
130
+
131
+ /* Shared foot lighting: a softbox reflection sits on the upper-left of
132
+ every foot shape, including rectangular robot feet. */
133
+ .lively-mascot--3d .lively__foot::after {
134
+ content: "";
135
+ position: absolute;
136
+ left: 16%;
137
+ top: 13%;
138
+ width: 52%;
139
+ height: 30%;
140
+ border-radius: 50%;
141
+ background: radial-gradient(ellipse, rgba(255,255,255,.48) 0%, rgba(255,255,255,.16) 45%, transparent 76%);
142
+ filter: blur(.45px);
143
+ pointer-events: none;
144
+ z-index: 2;
145
+ }
146
+
147
+ @media (prefers-reduced-motion: reduce) {
148
+ .lively-mascot--3d .lively-body::before { transform: none; }
149
+ }
150
+
151
+ /* --- Static mode: no cursor-follow, no idle / loop animations ---
152
+ Used for thumbnail previews (e.g. the emotion gallery). The visible face is
153
+ still driven by the `is-emotion-XX` class; only motion is disabled. */
154
+ .lively-mascot--static {
155
+ cursor: default;
156
+ pointer-events: none;
157
+ }
158
+
159
+ .lively-mascot--static * {
160
+ animation: none !important;
161
+ }
162
+
163
+ /* --- Loading ring overlay (28) — shared by all characters ---
164
+ A bold, clearly-visible spinner for the live mascot; hidden in static
165
+ thumbnails so the emotion gallery stays purely iconic. */
166
+ .lively__loading-overlay {
167
+ display: none;
168
+ }
169
+
170
+ .lively-mascot.is-emotion-28 .lively__loading-overlay {
171
+ display: block;
172
+ position: absolute;
173
+ top: 50%;
174
+ left: 50%;
175
+ width: 50%;
176
+ height: 50%;
177
+ transform: translate(-50%, -50%);
178
+ box-sizing: border-box;
179
+ border-radius: 50%;
180
+ border: 2.5px solid color-mix(in srgb, var(--lively-outline) 22%, transparent);
181
+ pointer-events: none;
182
+ z-index: 10;
183
+ }
184
+
185
+ .lively-mascot.is-emotion-28 .lively__loading-overlay::before {
186
+ content: "";
187
+ position: absolute;
188
+ inset: -5px;
189
+ box-sizing: border-box;
190
+ border: 4px solid transparent;
191
+ border-top-color: var(--lively-outline);
192
+ border-right-color: var(--lively-outline);
193
+ border-radius: inherit;
194
+ filter: drop-shadow(0 0 3px color-mix(in srgb, var(--lively-outline) 35%, transparent));
195
+ animation: lively-loading-orbit 1s linear infinite;
196
+ }
197
+
198
+ /* Static thumbnails (emotion gallery) keep the same loading ring but frozen */
199
+ .lively-mascot--static.is-emotion-28 .lively__loading-overlay {
200
+ display: block;
201
+ width: 44%;
202
+ height: 44%;
203
+ border-width: 2px;
204
+ }
205
+
206
+ .lively-mascot--static.is-emotion-28 .lively__loading-overlay::before {
207
+ animation: none;
208
+ inset: -4px;
209
+ border-width: 3px;
210
+ /* freeze the arc at about 2 o'clock so it still reads as "loading" */
211
+ transform: rotate(45deg);
212
+ }
213
+
214
+ /* Rig layer: outer posture layer (hop / refresh rotation) */
215
+ .lively-mascot__rig {
216
+ position: absolute;
217
+ inset: 0;
218
+ will-change: transform;
219
+ }
220
+
221
+ /* Gaze layer: JS applies cursor-follow tilt; wraps all parts so the whole
222
+ face leans/turns together with the body posture. */
223
+ .lively-mascot__gaze {
224
+ position: absolute;
225
+ inset: 0;
226
+ will-change: transform;
227
+ }
228
+
229
+ /* ============================================================
230
+ * Body
231
+ * ============================================================ */
232
+ .lively-body {
233
+ position: absolute;
234
+ inset: 0;
235
+ border: 2px solid var(--lively-outline);
236
+ border-radius: 50%;
237
+ background: var(--lively-body);
238
+ box-shadow: 3px 3px 0 color-mix(in srgb, var(--lively-outline) 70%, transparent);
239
+ transform-origin: 50% 92%;
240
+ /* Default idle posture: body + nested face + ears sway together */
241
+ animation: lively-sway 3.6s ease-in-out infinite;
242
+ }
243
+
244
+ /* These characters read best when their head/body rests upright. They retain
245
+ a quiet idle lift, while their attached ears, leaf, and antenna keep their
246
+ own independent motion. */
247
+ .lively-mascot--sprout .lively-body,
248
+ .lively-mascot--cat .lively-body,
249
+ .lively-mascot--robot .lively-body {
250
+ animation-name: lively-upright-sway;
251
+ }
252
+
253
+ /* Immersive mode keeps internal facial detail readable while removing the
254
+ sticker-like silhouette ink from the body and exposed outer accessories. */
255
+ .lively-mascot.lively-mascot--outline-hidden .lively-body {
256
+ border-width: 0;
257
+ }
258
+
259
+ .lively-mascot.lively-mascot--2d.lively-mascot--outline-hidden .lively-body {
260
+ box-shadow: none;
261
+ }
262
+
263
+ /* With the ink geometry removed, the shared light pass fills the entire body
264
+ edge instead of forming a separate rim around the silhouette. */
265
+ .lively-mascot.lively-mascot--3d.lively-mascot--outline-hidden .lively-body::before {
266
+ inset: 0;
267
+ }
268
+
269
+ .lively-mascot.lively-mascot--3d.lively-mascot--outline-hidden .lively-body::after {
270
+ display: none;
271
+ }
272
+
273
+ .lively-mascot--outline-hidden .lively-sprout__leaf,
274
+ .lively-mascot--outline-hidden .lively__ear,
275
+ .lively-mascot--outline-hidden .lively-cat__tail-outline,
276
+ .lively-mascot--outline-hidden .lively-ghost__hem-stroke {
277
+ stroke-opacity: 0;
278
+ }
279
+
280
+ .lively-mascot.is-happy .lively-body {
281
+ animation: lively-squish 0.6s cubic-bezier(.3, 1.6, .4, 1);
282
+ }
283
+
284
+ /* ============================================================
285
+ * Face
286
+ * ============================================================ */
287
+ .lively-face-wrap {
288
+ position: absolute;
289
+ inset: 4px;
290
+ }
291
+
292
+ .lively-face-accessory {
293
+ visibility: hidden;
294
+ }
295
+
296
+ .lively-face-accessory.is-active {
297
+ visibility: visible;
298
+ }
299
+
300
+ .lively-face-wrap svg {
301
+ display: block;
302
+ width: 100%;
303
+ height: 100%;
304
+ overflow: visible;
305
+ transform-origin: 50% 50%;
306
+ animation: lively-breathe 3.8s ease-in-out infinite;
307
+ }
308
+
309
+ .lively-face {
310
+ transform-box: fill-box;
311
+ transform-origin: center;
312
+ }
313
+
314
+ /* --- Eyes --- */
315
+ .lively-face__eye {
316
+ transform-box: fill-box;
317
+ transform-origin: center;
318
+ transition: transform 90ms ease-out;
319
+ }
320
+
321
+ .lively-face__eye.is-blinking {
322
+ transform: scaleY(0.08);
323
+ }
324
+
325
+ .lively-face__eye>ellipse {
326
+ fill: #fff;
327
+ stroke: var(--lively-outline);
328
+ stroke-width: 2.4;
329
+ }
330
+
331
+ .lively-face__pupil {
332
+ fill: var(--lively-outline);
333
+ }
334
+
335
+ .lively-face__shine {
336
+ fill: #fff;
337
+ }
338
+
339
+ /* --- Blush --- */
340
+ .lively-face__blush {
341
+ fill: var(--lively-accent);
342
+ fill-opacity: 0.75;
343
+ }
344
+
345
+ /* --- Mouth variants --- */
346
+ .lively-face__mouth,
347
+ .lively-face__happy {
348
+ fill: none;
349
+ stroke: var(--lively-outline);
350
+ stroke-width: 2.6;
351
+ stroke-linecap: round;
352
+ }
353
+
354
+ .lively-face__happy-mouth {
355
+ fill: var(--lively-outline);
356
+ }
357
+
358
+ .lively-face__happy,
359
+ .lively-face__happy-mouth {
360
+ visibility: hidden;
361
+ }
362
+
363
+ .lively-mascot.is-happy .lively-face__eye>ellipse,
364
+ .lively-mascot.is-happy .lively-face__pupil,
365
+ .lively-mascot.is-happy .lively-face__shine,
366
+ .lively-mascot.is-happy .lively-face__mouth {
367
+ visibility: hidden;
368
+ }
369
+
370
+ .lively-mascot.is-happy .lively-face__happy,
371
+ .lively-mascot.is-happy .lively-face__happy-mouth {
372
+ visibility: visible;
373
+ }
374
+
375
+ /* --- Alt face elements: hidden by default --- */
376
+ .lively-face__sad-mouth,
377
+ .lively-face__open-mouth,
378
+ .lively-face__flat-mouth,
379
+ .lively-face__bored-mouth,
380
+ .lively-face__sleep-eye,
381
+ .lively-face__angry-brow,
382
+ .lively-face__x-eye,
383
+ .lively-face__heart-eye {
384
+ visibility: hidden;
385
+ }
386
+
387
+ .lively-face__sad-mouth,
388
+ .lively-face__flat-mouth,
389
+ .lively-face__bored-mouth {
390
+ fill: none;
391
+ stroke: var(--lively-outline);
392
+ stroke-width: 2.6;
393
+ stroke-linecap: round;
394
+ }
395
+
396
+ .lively-face__open-mouth {
397
+ fill: var(--lively-outline);
398
+ stroke: var(--lively-outline);
399
+ stroke-width: 1.5;
400
+ }
401
+
402
+ .lively-face__sleep-eye {
403
+ fill: none;
404
+ stroke: var(--lively-outline);
405
+ stroke-width: 2.4;
406
+ stroke-linecap: round;
407
+ }
408
+
409
+ .lively-face__angry-brow {
410
+ fill: none;
411
+ stroke: var(--lively-outline);
412
+ stroke-width: 2.8;
413
+ stroke-linecap: round;
414
+ }
415
+
416
+ .lively-face__x-eye line {
417
+ fill: none;
418
+ stroke: var(--lively-outline);
419
+ stroke-width: 2.6;
420
+ stroke-linecap: round;
421
+ }
422
+
423
+ .lively-face__heart-eye {
424
+ fill: var(--lively-accent);
425
+ stroke: var(--lively-outline);
426
+ stroke-width: 1.2;
427
+ }
428
+
429
+ /* ============================================================
430
+ * Emotion Face Behaviors (40 emotions)
431
+ * ============================================================ */
432
+
433
+ /* 00 Sleep */
434
+ .lively-mascot.is-emotion-00 .lively-face__eye>ellipse,
435
+ .lively-mascot.is-emotion-00 .lively-face__pupil,
436
+ .lively-mascot.is-emotion-00 .lively-face__shine,
437
+ .lively-mascot.is-emotion-00 .lively-face__mouth {
438
+ visibility: hidden;
439
+ }
440
+
441
+ .lively-mascot.is-emotion-00 .lively-face__sleep-eye {
442
+ visibility: visible;
443
+ }
444
+
445
+ .lively-mascot.is-emotion-00 .lively-face__flat-mouth {
446
+ visibility: visible;
447
+ }
448
+
449
+ .lively-mascot.is-emotion-00 .lively-face__blush {
450
+ fill-opacity: 0.3;
451
+ }
452
+
453
+ /* 01 Wake */
454
+ .lively-mascot.is-emotion-01 .lively-face__mouth {
455
+ visibility: hidden;
456
+ }
457
+
458
+ .lively-mascot.is-emotion-01 .lively-face__open-mouth {
459
+ visibility: visible;
460
+ rx: 3;
461
+ ry: 4;
462
+ }
463
+
464
+ /* 02 Idle: default face */
465
+
466
+ /* 03 Breathe: default face */
467
+
468
+ /* 04 Ready */
469
+ .lively-mascot.is-emotion-04 .lively-face__eye>ellipse {
470
+ ry: 13;
471
+ }
472
+
473
+ /* 05 Pause */
474
+ .lively-mascot.is-emotion-05 .lively-face__eye>ellipse {
475
+ ry: 5;
476
+ }
477
+
478
+ .lively-mascot.is-emotion-05 .lively-face__pupil,
479
+ .lively-mascot.is-emotion-05 .lively-face__shine {
480
+ visibility: hidden;
481
+ }
482
+
483
+ .lively-mascot.is-emotion-05 .lively-face__mouth {
484
+ visibility: hidden;
485
+ }
486
+
487
+ .lively-mascot.is-emotion-05 .lively-face__flat-mouth {
488
+ visibility: visible;
489
+ }
490
+
491
+ /* 06 Refresh: normal face */
492
+
493
+ /* 07 LowBattery */
494
+ .lively-mascot.is-emotion-07 .lively-face__eye {
495
+ transform: translateY(2px) scaleY(0.8);
496
+ }
497
+
498
+ .lively-mascot.is-emotion-07 .lively-face__mouth {
499
+ visibility: hidden;
500
+ }
501
+
502
+ .lively-mascot.is-emotion-07 .lively-face__sad-mouth {
503
+ visibility: visible;
504
+ }
505
+
506
+ .lively-mascot.is-emotion-07 .lively-face__blush {
507
+ fill-opacity: 0.3;
508
+ }
509
+
510
+ /* 08 Offline */
511
+ .lively-mascot.is-emotion-08 .lively-face__eye>ellipse,
512
+ .lively-mascot.is-emotion-08 .lively-face__pupil,
513
+ .lively-mascot.is-emotion-08 .lively-face__shine,
514
+ .lively-mascot.is-emotion-08 .lively-face__mouth {
515
+ visibility: hidden;
516
+ }
517
+
518
+ .lively-mascot.is-emotion-08 .lively-face__x-eye {
519
+ visibility: visible;
520
+ }
521
+
522
+ .lively-mascot.is-emotion-08 .lively-face__flat-mouth {
523
+ visibility: visible;
524
+ }
525
+
526
+ .lively-mascot.is-emotion-08 .lively-face__blush {
527
+ fill-opacity: 0;
528
+ }
529
+
530
+ /* 09 Boot */
531
+ .lively-mascot.is-emotion-09 .lively-face__eye>ellipse {
532
+ ry: 13;
533
+ rx: 11;
534
+ }
535
+
536
+ .lively-mascot.is-emotion-09 .lively-face__mouth {
537
+ visibility: hidden;
538
+ }
539
+
540
+ .lively-mascot.is-emotion-09 .lively-face__open-mouth {
541
+ visibility: visible;
542
+ }
543
+
544
+ /* 10 Happy */
545
+ .lively-mascot.is-emotion-10 .lively-face__eye>ellipse,
546
+ .lively-mascot.is-emotion-10 .lively-face__pupil,
547
+ .lively-mascot.is-emotion-10 .lively-face__shine,
548
+ .lively-mascot.is-emotion-10 .lively-face__mouth {
549
+ visibility: hidden;
550
+ }
551
+
552
+ .lively-mascot.is-emotion-10 .lively-face__happy {
553
+ visibility: visible;
554
+ }
555
+
556
+ .lively-mascot.is-emotion-10 .lively-face__happy-mouth {
557
+ visibility: visible;
558
+ }
559
+
560
+ .lively-mascot.is-emotion-10 .lively-face__blush {
561
+ fill-opacity: 1;
562
+ }
563
+
564
+ /* 11 Excited */
565
+ .lively-mascot.is-emotion-11 .lively-face__eye>ellipse,
566
+ .lively-mascot.is-emotion-11 .lively-face__pupil,
567
+ .lively-mascot.is-emotion-11 .lively-face__shine,
568
+ .lively-mascot.is-emotion-11 .lively-face__mouth {
569
+ visibility: hidden;
570
+ }
571
+
572
+ .lively-mascot.is-emotion-11 .lively-face__happy {
573
+ visibility: visible;
574
+ }
575
+
576
+ .lively-mascot.is-emotion-11 .lively-face__happy-mouth {
577
+ visibility: visible;
578
+ }
579
+
580
+ .lively-mascot.is-emotion-11 .lively-face__blush {
581
+ fill-opacity: 1;
582
+ rx: 9;
583
+ }
584
+
585
+ /* 12 Sad */
586
+ .lively-mascot.is-emotion-12 .lively-face__eye {
587
+ transform: translateY(2px) scaleY(0.85);
588
+ }
589
+
590
+ .lively-mascot.is-emotion-12 .lively-face__mouth {
591
+ visibility: hidden;
592
+ }
593
+
594
+ .lively-mascot.is-emotion-12 .lively-face__sad-mouth {
595
+ visibility: visible;
596
+ }
597
+
598
+ .lively-mascot.is-emotion-12 .lively-face__blush {
599
+ fill-opacity: 0.3;
600
+ }
601
+
602
+ /* 13 Angry */
603
+ .lively-mascot.is-emotion-13 .lively-face__eye>ellipse {
604
+ ry: 9;
605
+ }
606
+
607
+ .lively-mascot.is-emotion-13 .lively-face__mouth {
608
+ visibility: hidden;
609
+ }
610
+
611
+ .lively-mascot.is-emotion-13 .lively-face__sad-mouth {
612
+ visibility: visible;
613
+ }
614
+
615
+ .lively-mascot.is-emotion-13 .lively-face__angry-brow {
616
+ visibility: visible;
617
+ }
618
+
619
+ .lively-mascot.is-emotion-13 .lively-face__blush {
620
+ fill: #ff6b6b;
621
+ fill-opacity: 0.7;
622
+ }
623
+
624
+ /* 14 Surprised */
625
+ .lively-mascot.is-emotion-14 .lively-face__eye>ellipse {
626
+ ry: 14;
627
+ rx: 12;
628
+ }
629
+
630
+ .lively-mascot.is-emotion-14 .lively-face__mouth {
631
+ visibility: hidden;
632
+ }
633
+
634
+ .lively-mascot.is-emotion-14 .lively-face__open-mouth {
635
+ visibility: visible;
636
+ rx: 6;
637
+ ry: 7;
638
+ }
639
+
640
+ .lively-mascot.is-emotion-14 .lively-face__blush {
641
+ fill-opacity: 0.9;
642
+ }
643
+
644
+ /* 15 Shy */
645
+ .lively-mascot.is-emotion-15 .lively-face__eye {
646
+ transform: translateY(3px);
647
+ }
648
+
649
+ .lively-mascot.is-emotion-15 .lively-face__mouth {
650
+ visibility: hidden;
651
+ }
652
+
653
+ .lively-mascot.is-emotion-15 .lively-face__happy {
654
+ visibility: visible;
655
+ }
656
+
657
+ .lively-mascot.is-emotion-15 .lively-face__happy-mouth {
658
+ visibility: visible;
659
+ }
660
+
661
+ .lively-mascot.is-emotion-15 .lively-face__blush {
662
+ fill-opacity: 1;
663
+ rx: 9;
664
+ ry: 5;
665
+ }
666
+
667
+ /* 16 Love */
668
+ .lively-mascot.is-emotion-16 .lively-face__eye>ellipse,
669
+ .lively-mascot.is-emotion-16 .lively-face__pupil,
670
+ .lively-mascot.is-emotion-16 .lively-face__shine,
671
+ .lively-mascot.is-emotion-16 .lively-face__mouth {
672
+ visibility: hidden;
673
+ }
674
+
675
+ .lively-mascot.is-emotion-16 .lively-face__heart-eye {
676
+ visibility: visible;
677
+ }
678
+
679
+ .lively-mascot.is-emotion-16 .lively-face__happy-mouth {
680
+ visibility: visible;
681
+ }
682
+
683
+ .lively-mascot.is-emotion-16 .lively-face__blush {
684
+ fill-opacity: 1;
685
+ rx: 9;
686
+ }
687
+
688
+ /* 17 Confused */
689
+ .lively-mascot.is-emotion-17 .lively-face__mouth {
690
+ visibility: hidden;
691
+ }
692
+
693
+ .lively-mascot.is-emotion-17 .lively-face__sad-mouth {
694
+ visibility: visible;
695
+ }
696
+
697
+ .lively-mascot.is-emotion-17 .lively-face__blush {
698
+ fill-opacity: 0.4;
699
+ }
700
+
701
+ /* 18 Cool */
702
+ .lively-mascot.is-emotion-18 .lively-face__eye>ellipse {
703
+ ry: 6;
704
+ }
705
+
706
+ .lively-mascot.is-emotion-18 .lively-face__mouth {
707
+ visibility: hidden;
708
+ }
709
+
710
+ .lively-mascot.is-emotion-18 .lively-face__happy {
711
+ visibility: visible;
712
+ }
713
+
714
+ .lively-mascot.is-emotion-18 .lively-face__blush {
715
+ fill-opacity: 0.5;
716
+ }
717
+
718
+ /* 19 Smug */
719
+ .lively-mascot.is-emotion-19 .lively-face__eye>ellipse {
720
+ ry: 7;
721
+ }
722
+
723
+ .lively-mascot.is-emotion-19 .lively-face__mouth {
724
+ visibility: hidden;
725
+ }
726
+
727
+ .lively-mascot.is-emotion-19 .lively-face__happy {
728
+ visibility: visible;
729
+ }
730
+
731
+ .lively-mascot.is-emotion-19 .lively-face__happy-mouth {
732
+ visibility: visible;
733
+ }
734
+
735
+ /* 20 Thinking */
736
+ .lively-mascot.is-emotion-20 .lively-face__eye {
737
+ transform: translateY(-3px);
738
+ }
739
+
740
+ .lively-mascot.is-emotion-20 .lively-face__mouth {
741
+ visibility: hidden;
742
+ }
743
+
744
+ .lively-mascot.is-emotion-20 .lively-face__flat-mouth {
745
+ visibility: visible;
746
+ }
747
+
748
+ /* 21 Listening */
749
+ .lively-mascot.is-emotion-21 .lively-face__eye>ellipse {
750
+ ry: 13;
751
+ }
752
+
753
+ /* 22 Talking */
754
+ .lively-mascot.is-emotion-22 .lively-face__mouth {
755
+ visibility: hidden;
756
+ }
757
+
758
+ .lively-mascot.is-emotion-22 .lively-face__open-mouth {
759
+ visibility: visible;
760
+ rx: 4;
761
+ ry: 5;
762
+ }
763
+
764
+ /* 23 Searching: default face (JS gaze handles eye direction) */
765
+
766
+ /* 24 Reading */
767
+ .lively-mascot.is-emotion-24 .lively-face__eye {
768
+ transform: translateY(3px);
769
+ }
770
+
771
+ .lively-mascot.is-emotion-24 .lively-face__mouth {
772
+ visibility: hidden;
773
+ }
774
+
775
+ .lively-mascot.is-emotion-24 .lively-face__happy {
776
+ visibility: visible;
777
+ }
778
+
779
+ /* 25 Writing */
780
+ .lively-mascot.is-emotion-25 .lively-face__eye {
781
+ transform: translateY(2px) translateX(1px);
782
+ }
783
+
784
+ /* 26 Coding */
785
+ .lively-mascot.is-emotion-26 .lively-face__eye>ellipse {
786
+ ry: 8;
787
+ }
788
+
789
+ .lively-mascot.is-emotion-26 .lively-face__mouth {
790
+ visibility: hidden;
791
+ }
792
+
793
+ .lively-mascot.is-emotion-26 .lively-face__flat-mouth {
794
+ visibility: visible;
795
+ }
796
+
797
+ /* 27 Designing: default face */
798
+
799
+ /* 28 Loading */
800
+ .lively-mascot.is-emotion-28 .lively-face__eye {
801
+ animation: lively-loading-eye-drift 3s ease-in-out infinite;
802
+ }
803
+
804
+ .lively-mascot.is-emotion-28 .lively-face__mouth {
805
+ visibility: hidden;
806
+ }
807
+
808
+ .lively-mascot.is-emotion-28 .lively-face__flat-mouth {
809
+ visibility: visible;
810
+ }
811
+
812
+ /* 29 Processing */
813
+ .lively-mascot.is-emotion-29 .lively-face__eye>ellipse {
814
+ ry: 9;
815
+ }
816
+
817
+ .lively-mascot.is-emotion-29 .lively-face__mouth {
818
+ visibility: hidden;
819
+ }
820
+
821
+ .lively-mascot.is-emotion-29 .lively-face__flat-mouth {
822
+ visibility: visible;
823
+ }
824
+
825
+ /* 30 Success */
826
+ .lively-mascot.is-emotion-30 .lively-face__eye>ellipse,
827
+ .lively-mascot.is-emotion-30 .lively-face__pupil,
828
+ .lively-mascot.is-emotion-30 .lively-face__shine,
829
+ .lively-mascot.is-emotion-30 .lively-face__mouth {
830
+ visibility: hidden;
831
+ }
832
+
833
+ .lively-mascot.is-emotion-30 .lively-face__happy {
834
+ visibility: visible;
835
+ }
836
+
837
+ .lively-mascot.is-emotion-30 .lively-face__happy-mouth {
838
+ visibility: visible;
839
+ }
840
+
841
+ .lively-mascot.is-emotion-30 .lively-face__blush {
842
+ fill-opacity: 1;
843
+ }
844
+
845
+ /* 31 Error */
846
+ .lively-mascot.is-emotion-31 .lively-face__eye>ellipse,
847
+ .lively-mascot.is-emotion-31 .lively-face__pupil,
848
+ .lively-mascot.is-emotion-31 .lively-face__shine,
849
+ .lively-mascot.is-emotion-31 .lively-face__mouth {
850
+ visibility: hidden;
851
+ }
852
+
853
+ .lively-mascot.is-emotion-31 .lively-face__x-eye {
854
+ visibility: visible;
855
+ }
856
+
857
+ .lively-mascot.is-emotion-31 .lively-face__sad-mouth {
858
+ visibility: visible;
859
+ }
860
+
861
+ .lively-mascot.is-emotion-31 .lively-face__blush {
862
+ fill: #ff6b6b;
863
+ fill-opacity: 0.7;
864
+ }
865
+
866
+ /* 32 Grateful */
867
+ .lively-mascot.is-emotion-32 .lively-face__eye>ellipse,
868
+ .lively-mascot.is-emotion-32 .lively-face__pupil,
869
+ .lively-mascot.is-emotion-32 .lively-face__shine,
870
+ .lively-mascot.is-emotion-32 .lively-face__mouth {
871
+ visibility: hidden;
872
+ }
873
+
874
+ .lively-mascot.is-emotion-32 .lively-face__happy {
875
+ visibility: visible;
876
+ }
877
+
878
+ .lively-mascot.is-emotion-32 .lively-face__happy-mouth {
879
+ visibility: visible;
880
+ }
881
+
882
+ .lively-mascot.is-emotion-32 .lively-face__blush {
883
+ fill: #ffb37a;
884
+ fill-opacity: 0.85;
885
+ }
886
+
887
+ /* 33 Retrying */
888
+ .lively-mascot.is-emotion-33 .lively-face__pupil {
889
+ rx: 3;
890
+ ry: 4;
891
+ }
892
+
893
+ .lively-mascot.is-emotion-33 .lively-face__mouth {
894
+ d: path("M44 63 Q50 63 56 63");
895
+ }
896
+
897
+ /* 34 Cancelled */
898
+ .lively-mascot.is-emotion-34 .lively-face__pupil {
899
+ cy: 47;
900
+ ry: 3;
901
+ }
902
+
903
+ .lively-mascot.is-emotion-34 .lively-face__mouth {
904
+ visibility: hidden;
905
+ }
906
+
907
+ .lively-mascot.is-emotion-34 .lively-face__sad-mouth {
908
+ visibility: visible;
909
+ }
910
+
911
+ .lively-mascot.is-emotion-34 .lively-face__blush {
912
+ fill-opacity: 0.3;
913
+ }
914
+
915
+ /* 35 Crying */
916
+ .lively-mascot.is-emotion-35 .lively-face__eye>ellipse,
917
+ .lively-mascot.is-emotion-35 .lively-face__pupil,
918
+ .lively-mascot.is-emotion-35 .lively-face__shine,
919
+ .lively-mascot.is-emotion-35 .lively-face__mouth {
920
+ visibility: hidden;
921
+ }
922
+
923
+ .lively-mascot.is-emotion-35 .lively-face__cry-eye {
924
+ visibility: visible;
925
+ }
926
+
927
+ .lively-mascot.is-emotion-35 .lively-face__sad-mouth {
928
+ visibility: visible;
929
+ }
930
+
931
+ .lively-mascot.is-emotion-35 .lively-face__tear {
932
+ visibility: visible;
933
+ }
934
+
935
+ .lively-mascot.is-emotion-35 .lively-face__blush {
936
+ fill: #6ec7ff;
937
+ fill-opacity: 0.6;
938
+ }
939
+
940
+ /* 36 Bored */
941
+ .lively-mascot.is-emotion-36 .lively-face__eye {
942
+ transform: translateY(4px) scaleY(.5);
943
+ }
944
+
945
+ .lively-mascot.is-emotion-36 .lively-face__pupil,
946
+ .lively-mascot.is-emotion-36 .lively-face__shine {
947
+ transform: translateY(2px);
948
+ }
949
+
950
+ .lively-mascot.is-emotion-36 .lively-face__mouth {
951
+ visibility: hidden;
952
+ }
953
+
954
+ .lively-mascot.is-emotion-36 .lively-face__bored-mouth {
955
+ visibility: visible;
956
+ }
957
+
958
+ .lively-mascot.is-emotion-36 .lively-face__blush {
959
+ fill-opacity: .36;
960
+ }
961
+
962
+ /* 37 Nervous */
963
+ .lively-mascot.is-emotion-37 .lively-face__sweat {
964
+ visibility: visible;
965
+ }
966
+
967
+ .lively-mascot.is-emotion-37 .lively-face__pupil {
968
+ animation: lively-nervous-eyes 0.4s ease-in-out infinite;
969
+ }
970
+
971
+ /* 38 Eureka */
972
+ .lively-mascot.is-emotion-38 .lively-face__eye>ellipse,
973
+ .lively-mascot.is-emotion-38 .lively-face__pupil,
974
+ .lively-mascot.is-emotion-38 .lively-face__shine,
975
+ .lively-mascot.is-emotion-38 .lively-face__mouth {
976
+ visibility: hidden;
977
+ }
978
+
979
+ .lively-mascot.is-emotion-38 .lively-face__star-eye {
980
+ visibility: visible;
981
+ }
982
+
983
+ .lively-mascot.is-emotion-38 .lively-face__happy {
984
+ visibility: visible;
985
+ }
986
+
987
+ .lively-mascot.is-emotion-38 .lively-face__happy-mouth {
988
+ visibility: visible;
989
+ }
990
+
991
+ .lively-mascot.is-emotion-38 .lively-face__sparkle {
992
+ visibility: visible;
993
+ }
994
+
995
+ /* 39 Waiting */
996
+ .lively-mascot.is-emotion-39 .lively-face__pupil {
997
+ cy: 47;
998
+ }
999
+
1000
+ .lively-mascot.is-emotion-39 .lively-face__mouth {
1001
+ d: path("M44 64 Q50 64 56 64");
1002
+ }
1003
+
1004
+ .lively-mascot.is-emotion-39 .lively-face__waiting-dots {
1005
+ visibility: visible;
1006
+ }
1007
+
1008
+ /* ============================================================
1009
+ * SVG Element Base Styles
1010
+ * ============================================================ */
1011
+
1012
+ /* --- Tear drops --- */
1013
+ .lively-face__tear {
1014
+ visibility: hidden;
1015
+ }
1016
+
1017
+ .lively-mascot.is-emotion-35 .lively-face__tear--l {
1018
+ animation: lively-tear-fall 0.8s ease-in infinite;
1019
+ }
1020
+
1021
+ .lively-mascot.is-emotion-35 .lively-face__tear--r {
1022
+ animation: lively-tear-fall 0.8s ease-in 0.3s infinite;
1023
+ }
1024
+
1025
+ @keyframes lively-tear-fall {
1026
+ 0% {
1027
+ transform: translate(var(--tx, 40px), 52px);
1028
+ opacity: 0.9;
1029
+ }
1030
+
1031
+ 100% {
1032
+ transform: translate(var(--tx, 40px), 72px);
1033
+ opacity: 0;
1034
+ }
1035
+ }
1036
+
1037
+ /* --- Sweat drop --- */
1038
+ .lively-face__sweat {
1039
+ visibility: hidden;
1040
+ }
1041
+
1042
+ .lively-mascot.is-emotion-37 .lively-face__sweat {
1043
+ animation: lively-sweat-drip 1.2s ease-in infinite;
1044
+ }
1045
+
1046
+ @keyframes lively-sweat-drip {
1047
+ 0% {
1048
+ transform: translate(82px, 30px);
1049
+ opacity: 0.8;
1050
+ }
1051
+
1052
+ 100% {
1053
+ transform: translate(82px, 48px);
1054
+ opacity: 0;
1055
+ }
1056
+ }
1057
+
1058
+ /* --- Star eyes --- */
1059
+ .lively-face__star-eye {
1060
+ visibility: hidden;
1061
+ }
1062
+
1063
+ .lively-mascot.is-emotion-38 .lively-face__star-eye {
1064
+ animation: lively-star-pulse 0.6s ease-in-out infinite;
1065
+ }
1066
+
1067
+ @keyframes lively-star-pulse {
1068
+
1069
+ 0%,
1070
+ 100% {
1071
+ transform: scale(1);
1072
+ }
1073
+
1074
+ 50% {
1075
+ transform: scale(1.2);
1076
+ }
1077
+ }
1078
+
1079
+ /* --- Sparkles --- */
1080
+ .lively-face__sparkle {
1081
+ visibility: hidden;
1082
+ }
1083
+
1084
+ .lively-mascot.is-emotion-38 .lively-face__sparkle--1 {
1085
+ animation: lively-sparkle-twinkle 0.8s ease-in-out infinite;
1086
+ }
1087
+
1088
+ .lively-mascot.is-emotion-38 .lively-face__sparkle--2 {
1089
+ animation: lively-sparkle-twinkle 0.8s ease-in-out 0.4s infinite;
1090
+ }
1091
+
1092
+ @keyframes lively-sparkle-twinkle {
1093
+
1094
+ 0%,
1095
+ 100% {
1096
+ opacity: 0;
1097
+ transform: scale(0.5);
1098
+ }
1099
+
1100
+ 50% {
1101
+ opacity: 1;
1102
+ transform: scale(1);
1103
+ }
1104
+ }
1105
+
1106
+ /* --- Cry eyes --- */
1107
+ .lively-face__cry-eye {
1108
+ visibility: hidden;
1109
+ }
1110
+
1111
+ /* --- Waiting dots --- */
1112
+ .lively-face__waiting-dots {
1113
+ visibility: hidden;
1114
+ }
1115
+
1116
+ .lively-mascot.is-emotion-39 .lively-face__waiting-dots circle:nth-child(1) {
1117
+ animation: lively-dot-bounce 1.2s ease-in-out infinite;
1118
+ }
1119
+
1120
+ .lively-mascot.is-emotion-39 .lively-face__waiting-dots circle:nth-child(2) {
1121
+ animation: lively-dot-bounce 1.2s ease-in-out 0.2s infinite;
1122
+ }
1123
+
1124
+ .lively-mascot.is-emotion-39 .lively-face__waiting-dots circle:nth-child(3) {
1125
+ animation: lively-dot-bounce 1.2s ease-in-out 0.4s infinite;
1126
+ }
1127
+
1128
+ @keyframes lively-dot-bounce {
1129
+
1130
+ 0%,
1131
+ 60%,
1132
+ 100% {
1133
+ transform: translateY(0);
1134
+ opacity: 0.4;
1135
+ }
1136
+
1137
+ 30% {
1138
+ transform: translateY(-4px);
1139
+ opacity: 1;
1140
+ }
1141
+ }
1142
+
1143
+ /* ============================================================
1144
+ * Feet
1145
+ * ============================================================ */
1146
+ .lively__feet {
1147
+ --lively-state-filter: brightness(1);
1148
+ position: absolute;
1149
+ bottom: -7cqw;
1150
+ left: 0;
1151
+ width: 100%;
1152
+ filter: var(--lively-state-filter);
1153
+ }
1154
+
1155
+ .lively__foot {
1156
+ position: absolute;
1157
+ bottom: 0;
1158
+ width: 22cqw;
1159
+ height: 16cqw;
1160
+ transform-origin: 50% 0;
1161
+ animation: lively-foot-tap 1.6s ease-in-out infinite;
1162
+ }
1163
+
1164
+ .lively__foot svg {
1165
+ display: block;
1166
+ width: 100%;
1167
+ height: 100%;
1168
+ overflow: visible;
1169
+ }
1170
+
1171
+ /* Default foot positions (characters override via their own CSS) */
1172
+ .lively__foot--l {
1173
+ left: 18cqw;
1174
+ }
1175
+
1176
+ .lively__foot--r {
1177
+ left: 60cqw;
1178
+ animation-delay: 0.8s;
1179
+ }
1180
+
1181
+ .lively-foot__body {
1182
+ fill: var(--lively-outline);
1183
+ stroke: var(--lively-outline);
1184
+ stroke-width: 1;
1185
+ filter: drop-shadow(1px 1px 0 rgba(0, 0, 0, 0.12));
1186
+ }
1187
+
1188
+ .lively-foot__shine {
1189
+ fill: #fff;
1190
+ opacity: 0.85;
1191
+ }
1192
+
1193
+ /* Happy foot kicks */
1194
+ .lively-mascot.is-happy .lively__foot--l {
1195
+ animation: lively-foot-kick-l 0.6s cubic-bezier(.3, 1.5, .5, 1);
1196
+ }
1197
+
1198
+ .lively-mascot.is-happy .lively__foot--r {
1199
+ animation: lively-foot-kick-r 0.6s cubic-bezier(.3, 1.5, .5, 1);
1200
+ }
1201
+
1202
+ /* Hopping: feet tuck */
1203
+ .lively-mascot.is-hopping .lively-mascot__rig {
1204
+ animation: lively-hop 0.9s cubic-bezier(.3, .7, .4, 1);
1205
+ }
1206
+
1207
+ .lively-mascot.is-hopping .lively__foot {
1208
+ animation: lively-foot-tuck 0.9s ease-in-out;
1209
+ }
1210
+
1211
+ /* ============================================================
1212
+ * Reduced Motion
1213
+ * ============================================================ */
1214
+ @media (prefers-reduced-motion: reduce) {
1215
+
1216
+ .lively-body,
1217
+ .lively__leaf,
1218
+ .lively__ears,
1219
+ .lively__antenna,
1220
+ .lively__tail,
1221
+ .lively-cat__whiskers,
1222
+ .lively-cat__whisker,
1223
+ .lively__foot,
1224
+ .lively__ghost-hem,
1225
+ .lively-face-wrap svg,
1226
+ .lively__loading-overlay::before {
1227
+ animation: none !important;
1228
+ }
1229
+ }
1230
+
1231
+ /* ============================================================
1232
+ * Keyframes: Base
1233
+ * ============================================================ */
1234
+ @keyframes lively-breathe {
1235
+
1236
+ 0%,
1237
+ 100% {
1238
+ transform: scale(1);
1239
+ }
1240
+
1241
+ 50% {
1242
+ transform: scale(1.035);
1243
+ }
1244
+ }
1245
+
1246
+ @keyframes lively-squish {
1247
+ 0% {
1248
+ transform: scale(1, 1);
1249
+ }
1250
+
1251
+ 30% {
1252
+ transform: scale(1.12, 0.86);
1253
+ }
1254
+
1255
+ 60% {
1256
+ transform: scale(0.94, 1.08);
1257
+ }
1258
+
1259
+ 100% {
1260
+ transform: scale(1, 1);
1261
+ }
1262
+ }
1263
+
1264
+ @keyframes lively-sway {
1265
+
1266
+ 0%,
1267
+ 100% {
1268
+ transform: rotate(6deg);
1269
+ }
1270
+
1271
+ 50% {
1272
+ transform: rotate(10deg) translateY(-2px);
1273
+ }
1274
+ }
1275
+
1276
+ @keyframes lively-upright-sway {
1277
+
1278
+ 0%,
1279
+ 100% {
1280
+ transform: translateY(0);
1281
+ }
1282
+
1283
+ 50% {
1284
+ transform: translateY(-2px);
1285
+ }
1286
+ }
1287
+
1288
+ @keyframes lively-hop {
1289
+ 0% {
1290
+ transform: translateY(0);
1291
+ }
1292
+
1293
+ 18% {
1294
+ transform: translateY(3px) scale(1.07, 0.88);
1295
+ }
1296
+
1297
+ 45% {
1298
+ transform: translateY(-13px) scale(0.95, 1.07);
1299
+ }
1300
+
1301
+ 72% {
1302
+ transform: translateY(0) scale(1.05, 0.93);
1303
+ }
1304
+
1305
+ 100% {
1306
+ transform: translateY(0);
1307
+ }
1308
+ }
1309
+
1310
+ @keyframes lively-leaf-sway {
1311
+
1312
+ 0%,
1313
+ 100% {
1314
+ transform: rotate(8deg);
1315
+ }
1316
+
1317
+ 50% {
1318
+ transform: rotate(20deg) translateY(-1px);
1319
+ }
1320
+ }
1321
+
1322
+ @keyframes lively-leaf-spin {
1323
+ 0% {
1324
+ transform: rotate(8deg);
1325
+ }
1326
+
1327
+ 100% {
1328
+ transform: rotate(368deg);
1329
+ }
1330
+ }
1331
+
1332
+ @keyframes lively-foot-tap {
1333
+
1334
+ 0%,
1335
+ 100% {
1336
+ transform: rotate(0deg) translateY(0);
1337
+ }
1338
+
1339
+ 30% {
1340
+ transform: rotate(-11deg) translateY(-2px);
1341
+ }
1342
+
1343
+ 60% {
1344
+ transform: rotate(5deg) translateY(0);
1345
+ }
1346
+ }
1347
+
1348
+ @keyframes lively-foot-kick-l {
1349
+
1350
+ 0%,
1351
+ 100% {
1352
+ transform: rotate(0deg) translateY(0);
1353
+ }
1354
+
1355
+ 40% {
1356
+ transform: rotate(-26deg) translateY(-5px);
1357
+ }
1358
+ }
1359
+
1360
+ @keyframes lively-foot-kick-r {
1361
+
1362
+ 0%,
1363
+ 100% {
1364
+ transform: rotate(0deg) translateY(0);
1365
+ }
1366
+
1367
+ 40% {
1368
+ transform: rotate(26deg) translateY(-5px);
1369
+ }
1370
+ }
1371
+
1372
+ @keyframes lively-foot-tuck {
1373
+
1374
+ 0%,
1375
+ 100% {
1376
+ transform: rotate(0deg) translateY(0);
1377
+ }
1378
+
1379
+ 40% {
1380
+ transform: rotate(0deg) translateY(-4px) scaleY(0.6);
1381
+ }
1382
+ }
1383
+
1384
+ /* ============================================================
1385
+ * Keyframes: Emotion Body Animations
1386
+ * ============================================================ */
1387
+
1388
+ /* --- Lifecycle --- */
1389
+ @keyframes lively-wake {
1390
+ 0% {
1391
+ transform: scale(0.9) rotate(-3deg);
1392
+ opacity: 0.6;
1393
+ }
1394
+
1395
+ 50% {
1396
+ transform: scale(1.05) rotate(2deg);
1397
+ opacity: 1;
1398
+ }
1399
+
1400
+ 100% {
1401
+ transform: scale(1) rotate(0);
1402
+ opacity: 1;
1403
+ }
1404
+ }
1405
+
1406
+ @keyframes lively-deep-breathe {
1407
+
1408
+ 0%,
1409
+ 100% {
1410
+ transform: scale(1);
1411
+ }
1412
+
1413
+ 50% {
1414
+ transform: scale(1.06);
1415
+ }
1416
+ }
1417
+
1418
+ @keyframes lively-ready {
1419
+
1420
+ 0%,
1421
+ 100% {
1422
+ transform: translateY(0);
1423
+ }
1424
+
1425
+ 50% {
1426
+ transform: translateY(-3px);
1427
+ }
1428
+ }
1429
+
1430
+ @keyframes lively-refresh {
1431
+ 0% {
1432
+ transform: rotate(0);
1433
+ }
1434
+
1435
+ 100% {
1436
+ transform: rotate(360deg);
1437
+ }
1438
+ }
1439
+
1440
+ @keyframes lively-lowbatt {
1441
+
1442
+ 0%,
1443
+ 100% {
1444
+ opacity: 1;
1445
+ }
1446
+
1447
+ 50% {
1448
+ opacity: 0.7;
1449
+ }
1450
+ }
1451
+
1452
+ @keyframes lively-boot {
1453
+ 0% {
1454
+ transform: scale(0.3);
1455
+ opacity: 0;
1456
+ }
1457
+
1458
+ 60% {
1459
+ transform: scale(1.1);
1460
+ opacity: 1;
1461
+ }
1462
+
1463
+ 100% {
1464
+ transform: scale(1);
1465
+ opacity: 1;
1466
+ }
1467
+ }
1468
+
1469
+ /* --- Reactions --- */
1470
+ @keyframes lively-happy-bounce {
1471
+ 0% {
1472
+ transform: translateY(0) scale(1);
1473
+ }
1474
+
1475
+ 30% {
1476
+ transform: translateY(-12px) scale(1.05, 0.95);
1477
+ }
1478
+
1479
+ 50% {
1480
+ transform: translateY(-16px) scale(0.95, 1.05);
1481
+ }
1482
+
1483
+ 80% {
1484
+ transform: translateY(2px) scale(1.02, 0.98);
1485
+ }
1486
+
1487
+ 100% {
1488
+ transform: translateY(0) scale(1);
1489
+ }
1490
+ }
1491
+
1492
+ @keyframes lively-excited {
1493
+
1494
+ 0%,
1495
+ 100% {
1496
+ transform: translateY(0) rotate(0);
1497
+ }
1498
+
1499
+ 25% {
1500
+ transform: translateY(-6px) rotate(-4deg);
1501
+ }
1502
+
1503
+ 75% {
1504
+ transform: translateY(-6px) rotate(4deg);
1505
+ }
1506
+ }
1507
+
1508
+ @keyframes lively-sad {
1509
+
1510
+ 0%,
1511
+ 100% {
1512
+ transform: translateY(0) rotate(0);
1513
+ }
1514
+
1515
+ 50% {
1516
+ transform: translateY(3px) rotate(-2deg);
1517
+ }
1518
+ }
1519
+
1520
+ @keyframes lively-bored {
1521
+
1522
+ 0%,
1523
+ 100% {
1524
+ transform: translateY(1px) rotate(-1deg) scale(1, .99);
1525
+ }
1526
+
1527
+ 50% {
1528
+ transform: translateY(4px) rotate(-2.2deg) scale(1.012, .972);
1529
+ }
1530
+ }
1531
+
1532
+ @keyframes lively-surprise {
1533
+ 0% {
1534
+ transform: scale(1);
1535
+ }
1536
+
1537
+ 30% {
1538
+ transform: scale(1.15, 0.88);
1539
+ }
1540
+
1541
+ 60% {
1542
+ transform: scale(0.92, 1.1);
1543
+ }
1544
+
1545
+ 100% {
1546
+ transform: scale(1);
1547
+ }
1548
+ }
1549
+
1550
+ @keyframes lively-love-pulse {
1551
+
1552
+ 0%,
1553
+ 100% {
1554
+ transform: scale(1);
1555
+ }
1556
+
1557
+ 50% {
1558
+ transform: scale(1.08);
1559
+ }
1560
+ }
1561
+
1562
+ @keyframes lively-confused {
1563
+
1564
+ 0%,
1565
+ 100% {
1566
+ transform: rotate(0);
1567
+ }
1568
+
1569
+ 25% {
1570
+ transform: rotate(-5deg);
1571
+ }
1572
+
1573
+ 75% {
1574
+ transform: rotate(5deg);
1575
+ }
1576
+ }
1577
+
1578
+ @keyframes lively-smug {
1579
+
1580
+ 0%,
1581
+ 100% {
1582
+ transform: translateY(0) rotate(0);
1583
+ }
1584
+
1585
+ 50% {
1586
+ transform: translateY(-2px) rotate(3deg);
1587
+ }
1588
+ }
1589
+
1590
+ @keyframes lively-shy {
1591
+
1592
+ 0%,
1593
+ 100% {
1594
+ transform: translateX(0) rotate(0);
1595
+ }
1596
+
1597
+ 30% {
1598
+ transform: translateX(3px) rotate(1deg);
1599
+ }
1600
+
1601
+ 70% {
1602
+ transform: translateX(-2px) rotate(-0.5deg);
1603
+ }
1604
+ }
1605
+
1606
+ /* --- Work States --- */
1607
+ @keyframes lively-thinking {
1608
+
1609
+ 0%,
1610
+ 100% {
1611
+ transform: translateY(0);
1612
+ }
1613
+
1614
+ 30% {
1615
+ transform: translateY(-4px);
1616
+ }
1617
+
1618
+ 60% {
1619
+ transform: translateY(-2px);
1620
+ }
1621
+ }
1622
+
1623
+ @keyframes lively-listening {
1624
+
1625
+ 0%,
1626
+ 100% {
1627
+ transform: scale(1);
1628
+ }
1629
+
1630
+ 50% {
1631
+ transform: scale(1.04, 0.96);
1632
+ }
1633
+ }
1634
+
1635
+ @keyframes lively-talking {
1636
+
1637
+ 0%,
1638
+ 100% {
1639
+ transform: scaleY(1);
1640
+ }
1641
+
1642
+ 50% {
1643
+ transform: scaleY(1.03);
1644
+ }
1645
+ }
1646
+
1647
+ @keyframes lively-searching {
1648
+
1649
+ 0%,
1650
+ 100% {
1651
+ transform: translateX(0);
1652
+ }
1653
+
1654
+ 25% {
1655
+ transform: translateX(-4px);
1656
+ }
1657
+
1658
+ 75% {
1659
+ transform: translateX(4px);
1660
+ }
1661
+ }
1662
+
1663
+ @keyframes lively-reading {
1664
+
1665
+ 0%,
1666
+ 100% {
1667
+ transform: translateY(0);
1668
+ }
1669
+
1670
+ 50% {
1671
+ transform: translateY(2px);
1672
+ }
1673
+ }
1674
+
1675
+ @keyframes lively-writing {
1676
+
1677
+ 0%,
1678
+ 100% {
1679
+ transform: translateX(0) rotate(0);
1680
+ }
1681
+
1682
+ 25% {
1683
+ transform: translateX(-2px) rotate(-1deg);
1684
+ }
1685
+
1686
+ 75% {
1687
+ transform: translateX(2px) rotate(1deg);
1688
+ }
1689
+ }
1690
+
1691
+ @keyframes lively-coding {
1692
+
1693
+ 0%,
1694
+ 100% {
1695
+ transform: translateY(0);
1696
+ }
1697
+
1698
+ 50% {
1699
+ transform: translateY(-2px);
1700
+ }
1701
+ }
1702
+
1703
+ @keyframes lively-designing {
1704
+
1705
+ 0%,
1706
+ 100% {
1707
+ transform: rotate(0);
1708
+ }
1709
+
1710
+ 33% {
1711
+ transform: rotate(-3deg);
1712
+ }
1713
+
1714
+ 66% {
1715
+ transform: rotate(3deg);
1716
+ }
1717
+ }
1718
+
1719
+ @keyframes lively-loading {
1720
+ 0% {
1721
+ transform: rotate(0);
1722
+ }
1723
+
1724
+ 100% {
1725
+ transform: rotate(360deg);
1726
+ }
1727
+ }
1728
+
1729
+ @keyframes lively-processing {
1730
+
1731
+ 0%,
1732
+ 100% {
1733
+ transform: scale(1);
1734
+ }
1735
+
1736
+ 50% {
1737
+ transform: scale(0.95);
1738
+ }
1739
+ }
1740
+
1741
+ @keyframes lively-success {
1742
+ 0% {
1743
+ transform: scale(1);
1744
+ }
1745
+
1746
+ 30% {
1747
+ transform: scale(1.12, 0.88);
1748
+ }
1749
+
1750
+ 60% {
1751
+ transform: scale(0.95, 1.08);
1752
+ }
1753
+
1754
+ 100% {
1755
+ transform: scale(1);
1756
+ }
1757
+ }
1758
+
1759
+ /* --- Loading keyframes --- */
1760
+ @keyframes lively-loading-eye-drift {
1761
+
1762
+ 0%,
1763
+ 100% {
1764
+ transform: translateX(0);
1765
+ }
1766
+
1767
+ 25% {
1768
+ transform: translateX(-2px);
1769
+ }
1770
+
1771
+ 75% {
1772
+ transform: translateX(2px);
1773
+ }
1774
+ }
1775
+
1776
+ @keyframes lively-leaf-spin-slow {
1777
+ 0% {
1778
+ transform: rotate(8deg) scale(1);
1779
+ }
1780
+
1781
+ 50% {
1782
+ transform: rotate(188deg) scale(1.08);
1783
+ }
1784
+
1785
+ 100% {
1786
+ transform: rotate(368deg) scale(1);
1787
+ }
1788
+ }
1789
+
1790
+ @keyframes lively-loading-orbit {
1791
+ from {
1792
+ transform: rotate(0deg);
1793
+ }
1794
+
1795
+ to {
1796
+ transform: rotate(360deg);
1797
+ }
1798
+ }
1799
+
1800
+ @keyframes lively-loading-bounce {
1801
+ 0%, 100% {
1802
+ transform: translateY(0);
1803
+ }
1804
+
1805
+ 50% {
1806
+ transform: translateY(-5px);
1807
+ }
1808
+ }
1809
+
1810
+ /* ============================================================
1811
+ * Keyframes: Leaf Emotion Animations
1812
+ * ============================================================ */
1813
+ @keyframes lively-leaf-sleep {
1814
+
1815
+ 0%,
1816
+ 100% {
1817
+ transform: rotate(8deg) scaleY(0.9);
1818
+ }
1819
+
1820
+ 50% {
1821
+ transform: rotate(12deg) scaleY(0.85);
1822
+ }
1823
+ }
1824
+
1825
+ @keyframes lively-leaf-wake {
1826
+ 0% {
1827
+ transform: rotate(5deg) scale(0.9);
1828
+ }
1829
+
1830
+ 50% {
1831
+ transform: rotate(25deg) scale(1.1);
1832
+ }
1833
+
1834
+ 100% {
1835
+ transform: rotate(10deg) scale(1);
1836
+ }
1837
+ }
1838
+
1839
+ @keyframes lively-leaf-breathe {
1840
+
1841
+ 0%,
1842
+ 100% {
1843
+ transform: rotate(8deg);
1844
+ }
1845
+
1846
+ 50% {
1847
+ transform: rotate(16deg) scaleY(1.05);
1848
+ }
1849
+ }
1850
+
1851
+ @keyframes lively-leaf-ready {
1852
+
1853
+ 0%,
1854
+ 100% {
1855
+ transform: rotate(10deg);
1856
+ }
1857
+
1858
+ 50% {
1859
+ transform: rotate(18deg) translateY(-2px);
1860
+ }
1861
+ }
1862
+
1863
+ @keyframes lively-leaf-pause {
1864
+
1865
+ 0%,
1866
+ 100% {
1867
+ transform: rotate(8deg);
1868
+ opacity: 0.6;
1869
+ }
1870
+
1871
+ 50% {
1872
+ transform: rotate(10deg);
1873
+ opacity: 0.5;
1874
+ }
1875
+ }
1876
+
1877
+ @keyframes lively-leaf-refresh {
1878
+ 0% {
1879
+ transform: rotate(8deg);
1880
+ }
1881
+
1882
+ 100% {
1883
+ transform: rotate(368deg);
1884
+ }
1885
+ }
1886
+
1887
+ @keyframes lively-leaf-droop {
1888
+
1889
+ 0%,
1890
+ 100% {
1891
+ transform: rotate(5deg) translateY(2px) scaleY(0.85);
1892
+ }
1893
+
1894
+ 50% {
1895
+ transform: rotate(3deg) translateY(4px) scaleY(0.8);
1896
+ }
1897
+ }
1898
+
1899
+ @keyframes lively-leaf-boot {
1900
+ 0% {
1901
+ transform: scale(0.5) rotate(0);
1902
+ }
1903
+
1904
+ 60% {
1905
+ transform: scale(1.15) rotate(15deg);
1906
+ }
1907
+
1908
+ 100% {
1909
+ transform: scale(1) rotate(10deg);
1910
+ }
1911
+ }
1912
+
1913
+ @keyframes lively-leaf-spin-fast {
1914
+ 0% {
1915
+ transform: rotate(8deg);
1916
+ }
1917
+
1918
+ 100% {
1919
+ transform: rotate(368deg);
1920
+ }
1921
+ }
1922
+
1923
+ @keyframes lively-leaf-flap {
1924
+
1925
+ 0%,
1926
+ 100% {
1927
+ transform: rotate(8deg);
1928
+ }
1929
+
1930
+ 25% {
1931
+ transform: rotate(28deg);
1932
+ }
1933
+
1934
+ 75% {
1935
+ transform: rotate(-10deg);
1936
+ }
1937
+ }
1938
+
1939
+ @keyframes lively-leaf-angry {
1940
+
1941
+ 0%,
1942
+ 100% {
1943
+ transform: rotate(8deg);
1944
+ }
1945
+
1946
+ 25% {
1947
+ transform: rotate(-5deg);
1948
+ }
1949
+
1950
+ 75% {
1951
+ transform: rotate(20deg);
1952
+ }
1953
+ }
1954
+
1955
+ @keyframes lively-leaf-jump {
1956
+ 0% {
1957
+ transform: rotate(8deg) translateY(0);
1958
+ }
1959
+
1960
+ 50% {
1961
+ transform: rotate(20deg) translateY(-6px);
1962
+ }
1963
+
1964
+ 100% {
1965
+ transform: rotate(8deg) translateY(0);
1966
+ }
1967
+ }
1968
+
1969
+ @keyframes lively-leaf-shy {
1970
+
1971
+ 0%,
1972
+ 100% {
1973
+ transform: rotate(12deg) scaleX(1);
1974
+ }
1975
+
1976
+ 50% {
1977
+ transform: rotate(6deg) scaleX(-1);
1978
+ }
1979
+ }
1980
+
1981
+ @keyframes lively-leaf-love {
1982
+
1983
+ 0%,
1984
+ 100% {
1985
+ transform: rotate(10deg) scale(1);
1986
+ }
1987
+
1988
+ 50% {
1989
+ transform: rotate(15deg) scale(1.15);
1990
+ }
1991
+ }
1992
+
1993
+ @keyframes lively-leaf-confused {
1994
+
1995
+ 0%,
1996
+ 100% {
1997
+ transform: rotate(8deg);
1998
+ }
1999
+
2000
+ 25% {
2001
+ transform: rotate(-8deg);
2002
+ }
2003
+
2004
+ 75% {
2005
+ transform: rotate(22deg);
2006
+ }
2007
+ }
2008
+
2009
+ @keyframes lively-leaf-cool {
2010
+
2011
+ 0%,
2012
+ 100% {
2013
+ transform: rotate(8deg);
2014
+ }
2015
+
2016
+ 50% {
2017
+ transform: rotate(14deg) translateY(-1px);
2018
+ }
2019
+ }
2020
+
2021
+ @keyframes lively-leaf-smug {
2022
+
2023
+ 0%,
2024
+ 100% {
2025
+ transform: rotate(8deg) translateY(0);
2026
+ }
2027
+
2028
+ 50% {
2029
+ transform: rotate(16deg) translateY(-2px);
2030
+ }
2031
+ }
2032
+
2033
+ @keyframes lively-leaf-think {
2034
+
2035
+ 0%,
2036
+ 100% {
2037
+ transform: rotate(8deg);
2038
+ }
2039
+
2040
+ 50% {
2041
+ transform: rotate(20deg) translateY(-2px);
2042
+ }
2043
+ }
2044
+
2045
+ @keyframes lively-leaf-perk {
2046
+
2047
+ 0%,
2048
+ 100% {
2049
+ transform: rotate(8deg) scaleY(1);
2050
+ }
2051
+
2052
+ 50% {
2053
+ transform: rotate(14deg) scaleY(1.1);
2054
+ }
2055
+ }
2056
+
2057
+ @keyframes lively-leaf-talk {
2058
+
2059
+ 0%,
2060
+ 100% {
2061
+ transform: rotate(10deg);
2062
+ }
2063
+
2064
+ 50% {
2065
+ transform: rotate(18deg);
2066
+ }
2067
+ }
2068
+
2069
+ @keyframes lively-leaf-search {
2070
+
2071
+ 0%,
2072
+ 100% {
2073
+ transform: rotate(5deg) translateX(0);
2074
+ }
2075
+
2076
+ 25% {
2077
+ transform: rotate(12deg) translateX(-3px);
2078
+ }
2079
+
2080
+ 75% {
2081
+ transform: rotate(12deg) translateX(3px);
2082
+ }
2083
+ }
2084
+
2085
+ @keyframes lively-leaf-read {
2086
+
2087
+ 0%,
2088
+ 100% {
2089
+ transform: rotate(6deg) translateY(0);
2090
+ }
2091
+
2092
+ 50% {
2093
+ transform: rotate(4deg) translateY(2px);
2094
+ }
2095
+ }
2096
+
2097
+ @keyframes lively-leaf-write {
2098
+
2099
+ 0%,
2100
+ 100% {
2101
+ transform: rotate(8deg) translateX(0);
2102
+ }
2103
+
2104
+ 25% {
2105
+ transform: rotate(5deg) translateX(-2px);
2106
+ }
2107
+
2108
+ 75% {
2109
+ transform: rotate(12deg) translateX(2px);
2110
+ }
2111
+ }
2112
+
2113
+ @keyframes lively-leaf-code {
2114
+
2115
+ 0%,
2116
+ 100% {
2117
+ transform: rotate(8deg);
2118
+ }
2119
+
2120
+ 50% {
2121
+ transform: rotate(16deg);
2122
+ }
2123
+ }
2124
+
2125
+ @keyframes lively-leaf-design {
2126
+
2127
+ 0%,
2128
+ 100% {
2129
+ transform: rotate(8deg);
2130
+ }
2131
+
2132
+ 33% {
2133
+ transform: rotate(4deg);
2134
+ }
2135
+
2136
+ 66% {
2137
+ transform: rotate(14deg);
2138
+ }
2139
+ }
2140
+
2141
+ @keyframes lively-leaf-pulse {
2142
+
2143
+ 0%,
2144
+ 100% {
2145
+ transform: rotate(8deg) scale(1);
2146
+ }
2147
+
2148
+ 50% {
2149
+ transform: rotate(8deg) scale(1.1);
2150
+ }
2151
+ }
2152
+
2153
+ @keyframes lively-leaf-celebrate {
2154
+ 0% {
2155
+ transform: rotate(8deg) scale(1);
2156
+ }
2157
+
2158
+ 30% {
2159
+ transform: rotate(25deg) scale(1.15);
2160
+ }
2161
+
2162
+ 60% {
2163
+ transform: rotate(-5deg) scale(1.05);
2164
+ }
2165
+
2166
+ 100% {
2167
+ transform: rotate(8deg) scale(1);
2168
+ }
2169
+ }
2170
+
2171
+ @keyframes lively-leaf-error {
2172
+
2173
+ 0%,
2174
+ 100% {
2175
+ transform: rotate(8deg);
2176
+ opacity: 1;
2177
+ }
2178
+
2179
+ 50% {
2180
+ transform: rotate(-3deg);
2181
+ opacity: 0.5;
2182
+ }
2183
+ }
2184
+
2185
+ /* ============================================================
2186
+ * Keyframes: Foot Emotion Animations
2187
+ * ============================================================ */
2188
+ @keyframes lively-foot-rest {
2189
+
2190
+ 0%,
2191
+ 100% {
2192
+ transform: rotate(0deg) translateY(0);
2193
+ }
2194
+
2195
+ 50% {
2196
+ transform: rotate(0deg) translateY(-1px);
2197
+ }
2198
+ }
2199
+
2200
+ @keyframes lively-foot-wake {
2201
+ 0% {
2202
+ transform: rotate(0deg) scaleY(0.6);
2203
+ }
2204
+
2205
+ 60% {
2206
+ transform: rotate(0deg) scaleY(1.1);
2207
+ }
2208
+
2209
+ 100% {
2210
+ transform: rotate(0deg) scaleY(1);
2211
+ }
2212
+ }
2213
+
2214
+ @keyframes lively-foot-ready {
2215
+
2216
+ 0%,
2217
+ 100% {
2218
+ transform: rotate(0deg) translateY(0);
2219
+ }
2220
+
2221
+ 50% {
2222
+ transform: rotate(0deg) translateY(-2px);
2223
+ }
2224
+ }
2225
+
2226
+ @keyframes lively-foot-boot {
2227
+ 0% {
2228
+ transform: rotate(0deg) scaleY(0.3);
2229
+ }
2230
+
2231
+ 60% {
2232
+ transform: rotate(0deg) scaleY(1.1);
2233
+ }
2234
+
2235
+ 100% {
2236
+ transform: rotate(0deg) scaleY(1);
2237
+ }
2238
+ }
2239
+
2240
+ @keyframes lively-foot-kick {
2241
+
2242
+ 0%,
2243
+ 100% {
2244
+ transform: rotate(0deg) translateY(0);
2245
+ }
2246
+
2247
+ 40% {
2248
+ transform: rotate(-30deg) translateY(-6px);
2249
+ }
2250
+ }
2251
+
2252
+ @keyframes lively-foot-jump {
2253
+
2254
+ 0%,
2255
+ 100% {
2256
+ transform: rotate(0deg) translateY(0) scaleY(1);
2257
+ }
2258
+
2259
+ 30% {
2260
+ transform: rotate(0deg) translateY(2px) scaleY(0.7);
2261
+ }
2262
+
2263
+ 50% {
2264
+ transform: rotate(0deg) translateY(-8px) scaleY(1);
2265
+ }
2266
+ }
2267
+
2268
+ @keyframes lively-foot-drag {
2269
+
2270
+ 0%,
2271
+ 100% {
2272
+ transform: rotate(0deg) translateY(0);
2273
+ }
2274
+
2275
+ 50% {
2276
+ transform: rotate(3deg) translateY(2px);
2277
+ }
2278
+ }
2279
+
2280
+ @keyframes lively-foot-stomp {
2281
+
2282
+ 0%,
2283
+ 100% {
2284
+ transform: rotate(0deg) translateY(0);
2285
+ }
2286
+
2287
+ 30% {
2288
+ transform: rotate(0deg) translateY(-3px);
2289
+ }
2290
+
2291
+ 60% {
2292
+ transform: rotate(0deg) translateY(2px);
2293
+ }
2294
+ }
2295
+
2296
+ @keyframes lively-foot-tap-slow {
2297
+
2298
+ 0%,
2299
+ 100% {
2300
+ transform: rotate(0deg) translateY(0);
2301
+ }
2302
+
2303
+ 50% {
2304
+ transform: rotate(-5deg) translateY(-1px);
2305
+ }
2306
+ }
2307
+
2308
+ @keyframes lively-foot-tap-fast {
2309
+
2310
+ 0%,
2311
+ 100% {
2312
+ transform: rotate(0deg) translateY(0);
2313
+ }
2314
+
2315
+ 30% {
2316
+ transform: rotate(-10deg) translateY(-2px);
2317
+ }
2318
+
2319
+ 60% {
2320
+ transform: rotate(6deg) translateY(0);
2321
+ }
2322
+ }
2323
+
2324
+ @keyframes lively-foot-cross {
2325
+
2326
+ 0%,
2327
+ 100% {
2328
+ transform: rotate(0deg) translateX(0);
2329
+ }
2330
+
2331
+ 50% {
2332
+ transform: rotate(0deg) translateX(4px);
2333
+ }
2334
+ }
2335
+
2336
+ @keyframes lively-foot-pose {
2337
+
2338
+ 0%,
2339
+ 100% {
2340
+ transform: rotate(0deg) translateY(0);
2341
+ }
2342
+
2343
+ 30% {
2344
+ transform: rotate(5deg) translateY(-2px);
2345
+ }
2346
+
2347
+ 70% {
2348
+ transform: rotate(-3deg) translateY(-1px);
2349
+ }
2350
+ }
2351
+
2352
+ @keyframes lively-foot-pace {
2353
+
2354
+ 0%,
2355
+ 100% {
2356
+ transform: rotate(0deg) translateY(0);
2357
+ }
2358
+
2359
+ 25% {
2360
+ transform: rotate(-6deg) translateY(-2px);
2361
+ }
2362
+
2363
+ 75% {
2364
+ transform: rotate(6deg) translateY(-2px);
2365
+ }
2366
+ }
2367
+
2368
+ /* ============================================================
2369
+ * Keyframes: Extended Emotions (35-39)
2370
+ * ============================================================ */
2371
+ @keyframes lively-nervous {
2372
+
2373
+ 0%,
2374
+ 100% {
2375
+ transform: translateX(0);
2376
+ }
2377
+
2378
+ 20% {
2379
+ transform: translateX(-1.5px);
2380
+ }
2381
+
2382
+ 40% {
2383
+ transform: translateX(1.5px);
2384
+ }
2385
+
2386
+ 60% {
2387
+ transform: translateX(-1px);
2388
+ }
2389
+
2390
+ 80% {
2391
+ transform: translateX(1px);
2392
+ }
2393
+ }
2394
+
2395
+ @keyframes lively-leaf-nervous {
2396
+
2397
+ 0%,
2398
+ 100% {
2399
+ transform: rotate(8deg);
2400
+ }
2401
+
2402
+ 25% {
2403
+ transform: rotate(2deg);
2404
+ }
2405
+
2406
+ 75% {
2407
+ transform: rotate(14deg);
2408
+ }
2409
+ }
2410
+
2411
+ @keyframes lively-foot-nervous {
2412
+
2413
+ 0%,
2414
+ 100% {
2415
+ transform: translateY(0);
2416
+ }
2417
+
2418
+ 50% {
2419
+ transform: translateY(-2px);
2420
+ }
2421
+ }
2422
+
2423
+ @keyframes lively-nervous-eyes {
2424
+
2425
+ 0%,
2426
+ 100% {
2427
+ transform: translateX(0);
2428
+ }
2429
+
2430
+ 25% {
2431
+ transform: translateX(-1.5px);
2432
+ }
2433
+
2434
+ 75% {
2435
+ transform: translateX(1.5px);
2436
+ }
2437
+ }
2438
+
2439
+ @keyframes lively-eureka {
2440
+ 0% {
2441
+ transform: scale(1);
2442
+ }
2443
+
2444
+ 20% {
2445
+ transform: scale(1.12, 0.9);
2446
+ }
2447
+
2448
+ 40% {
2449
+ transform: scale(0.95, 1.08);
2450
+ }
2451
+
2452
+ 60% {
2453
+ transform: scale(1.04, 0.97);
2454
+ }
2455
+
2456
+ 100% {
2457
+ transform: scale(1);
2458
+ }
2459
+ }
2460
+
2461
+ @keyframes lively-leaf-eureka {
2462
+ 0% {
2463
+ transform: rotate(8deg) scale(1);
2464
+ }
2465
+
2466
+ 50% {
2467
+ transform: rotate(35deg) scale(1.15);
2468
+ }
2469
+
2470
+ 100% {
2471
+ transform: rotate(10deg) scale(1);
2472
+ }
2473
+ }
2474
+
2475
+ @keyframes lively-waiting {
2476
+
2477
+ 0%,
2478
+ 100% {
2479
+ transform: translateX(0) rotate(0);
2480
+ }
2481
+
2482
+ 30% {
2483
+ transform: translateX(-2px) rotate(-1deg);
2484
+ }
2485
+
2486
+ 60% {
2487
+ transform: translateX(2px) rotate(1deg);
2488
+ }
2489
+ }
2490
+
2491
+ @keyframes lively-leaf-waiting {
2492
+
2493
+ 0%,
2494
+ 100% {
2495
+ transform: rotate(8deg);
2496
+ }
2497
+
2498
+ 50% {
2499
+ transform: rotate(14deg);
2500
+ }
2501
+ }
2502
+ /* ============================================================
2503
+ * lively-mascot · Sprout Character Styles
2504
+ *
2505
+ * The leafy sprout character: round body with a small plant
2506
+ * growing from the top of its head.
2507
+ * ============================================================ */
2508
+
2509
+ /* --- Body shape override --- */
2510
+ .lively-mascot--sprout .lively-body {
2511
+ border-radius: 50% 50% 46% 49%;
2512
+ }
2513
+
2514
+ /* --- Leaf: sits on top of the head --- */
2515
+ .lively__leaf {
2516
+ position: absolute;
2517
+ top: -34cqw;
2518
+ left: 50%;
2519
+ width: 37cqw;
2520
+ height: 40cqw;
2521
+ margin-left: -18.5cqw;
2522
+ transform-origin: 50% 100%;
2523
+ animation: lively-leaf-sway 2.6s ease-in-out infinite;
2524
+ }
2525
+
2526
+ .lively__leaf svg {
2527
+ display: block;
2528
+ width: 100%;
2529
+ height: 100%;
2530
+ overflow: visible;
2531
+ filter: drop-shadow(1.2cqw 1.4cqw 0 color-mix(in srgb, var(--lively-outline) 55%, transparent));
2532
+ }
2533
+
2534
+ .lively-sprout__stem {
2535
+ fill: none;
2536
+ stroke: var(--lively-outline);
2537
+ stroke-width: 3;
2538
+ stroke-linecap: round;
2539
+ }
2540
+
2541
+ .lively-sprout__leaf {
2542
+ fill: var(--lively-body);
2543
+ stroke: var(--lively-outline);
2544
+ stroke-width: 2;
2545
+ stroke-linejoin: round;
2546
+ }
2547
+
2548
+ .lively-sprout__vein {
2549
+ fill: none;
2550
+ stroke: var(--lively-outline);
2551
+ stroke-width: 1.6;
2552
+ stroke-linecap: round;
2553
+ }
2554
+
2555
+ .lively-sprout__shine {
2556
+ fill: none;
2557
+ stroke: #fff;
2558
+ stroke-width: 2.2;
2559
+ stroke-linecap: round;
2560
+ opacity: 0.9;
2561
+ }
2562
+
2563
+ /* Happy click: leaf spins */
2564
+ .lively-mascot.is-happy .lively__leaf {
2565
+ animation: lively-leaf-spin 0.7s cubic-bezier(.3, 1.4, .4, 1);
2566
+ }
2567
+
2568
+ /* --- Foot positioning for sprout --- */
2569
+ .lively-mascot--sprout .lively__foot--l { left: 18cqw; }
2570
+ .lively-mascot--sprout .lively__foot--r { left: 60cqw; animation-delay: 0.8s; }
2571
+ /* ============================================================
2572
+ * lively-mascot · Cat Character Styles
2573
+ *
2574
+ * An original charcoal cat with pointed ears, a curled tail, and floating whiskers.
2575
+ * ============================================================ */
2576
+
2577
+ /* --- Body shape: a compact feline head with a slightly tapered jaw --- */
2578
+ .lively-mascot--cat .lively-body {
2579
+ border-radius: 48% 48% 43% 43% / 45% 45% 55% 55%;
2580
+ }
2581
+
2582
+ /* A charcoal default gives the cat its own identity; inline themes still win. */
2583
+ .lively-mascot--cat {
2584
+ --lively-body: #3d4852;
2585
+ --lively-outline: #131a20;
2586
+ --lively-accent: #eeb3c1;
2587
+ }
2588
+
2589
+ /* --- Ears: pointed cat ears on top (nested inside body so they
2590
+ follow body bounce / squash / boot / wake animations) --- */
2591
+ .lively__ears {
2592
+ position: absolute;
2593
+ top: -17cqw;
2594
+ left: 50%;
2595
+ width: 66cqw;
2596
+ height: 29cqw;
2597
+ margin-left: -33cqw;
2598
+ z-index: 3;
2599
+ transform-origin: 50% 92%;
2600
+ }
2601
+
2602
+ /* Each ear splays slightly outward for a more natural arc */
2603
+ .lively__ear-left { transform-box: fill-box; transform-origin: 50% 100%; transform: rotate(-7deg); }
2604
+ .lively__ear-right { transform-box: fill-box; transform-origin: 50% 100%; transform: rotate(7deg); }
2605
+
2606
+ .lively__ears svg {
2607
+ display: block;
2608
+ width: 100%;
2609
+ height: 100%;
2610
+ overflow: visible;
2611
+ }
2612
+
2613
+ .lively__ear {
2614
+ fill: var(--lively-body);
2615
+ stroke: var(--lively-outline);
2616
+ stroke-width: 2.4;
2617
+ stroke-linejoin: round;
2618
+ stroke-linecap: round;
2619
+ }
2620
+
2621
+ .lively__ear--inner {
2622
+ fill: var(--lively-accent);
2623
+ stroke: none;
2624
+ opacity: 0.85;
2625
+ }
2626
+
2627
+ .lively-cat__muzzle {
2628
+ fill: #eee5d9;
2629
+ opacity: .82;
2630
+ }
2631
+
2632
+ .lively-cat__whiskers {
2633
+ position: absolute;
2634
+ inset: 0;
2635
+ z-index: 5;
2636
+ pointer-events: none;
2637
+ overflow: visible;
2638
+ animation: lively-cat-whiskers-float 3.8s ease-in-out infinite;
2639
+ }
2640
+
2641
+ .lively-cat__whiskers svg {
2642
+ display: block;
2643
+ width: 100%;
2644
+ height: 100%;
2645
+ overflow: visible;
2646
+ filter: drop-shadow(0 1px 1px rgba(0,0,0,.18));
2647
+ }
2648
+
2649
+ .lively-cat__whisker {
2650
+ fill: none;
2651
+ stroke: color-mix(in srgb, white 82%, var(--lively-outline));
2652
+ stroke-width: 1.15;
2653
+ stroke-linecap: round;
2654
+ opacity: .9;
2655
+ transform-box: fill-box;
2656
+ transform-origin: center;
2657
+ }
2658
+
2659
+ .lively-cat__whisker--l1,
2660
+ .lively-cat__whisker--r3 { animation: lively-cat-whisker-drift-a 3.2s ease-in-out infinite; }
2661
+ .lively-cat__whisker--l2,
2662
+ .lively-cat__whisker--r2 { animation: lively-cat-whisker-drift-b 3.8s ease-in-out .25s infinite; }
2663
+ .lively-cat__whisker--l3,
2664
+ .lively-cat__whisker--r1 { animation: lively-cat-whisker-drift-c 3.5s ease-in-out .5s infinite; }
2665
+
2666
+ /* Whiskers are a face accessory, so emotions can pose them independently. */
2667
+ .lively-mascot.is-emotion-00 .lively-cat__whiskers,
2668
+ .lively-mascot.is-emotion-12 .lively-cat__whiskers {
2669
+ animation: lively-cat-whiskers-droop 2.5s ease-in-out infinite;
2670
+ }
2671
+ .lively-mascot.is-emotion-10 .lively-cat__whiskers,
2672
+ .lively-mascot.is-emotion-11 .lively-cat__whiskers {
2673
+ animation: lively-cat-whiskers-alert .5s ease-in-out infinite alternate;
2674
+ }
2675
+ .lively-mascot.is-emotion-13 .lively-cat__whiskers {
2676
+ animation: lively-cat-whiskers-puff .34s ease-in-out infinite alternate;
2677
+ }
2678
+ .lively-mascot.is-emotion-14 .lively-cat__whiskers,
2679
+ .lively-mascot.is-emotion-37 .lively-cat__whiskers {
2680
+ animation: lively-cat-whiskers-twitch .42s ease-in-out infinite;
2681
+ }
2682
+
2683
+ /* Happy click: ears wiggle */
2684
+ .lively-mascot.is-happy .lively__ears {
2685
+ animation: lively-cat-ear-wiggle 0.5s ease-in-out;
2686
+ }
2687
+
2688
+ /* --- Tail: curved behind the body --- */
2689
+ .lively__tail {
2690
+ position: absolute;
2691
+ bottom: 3cqw;
2692
+ right: -14cqw;
2693
+ width: 37cqw;
2694
+ height: 42cqw;
2695
+ transform-origin: 10% 100%;
2696
+ animation: lively-cat-tail-sway 2.4s ease-in-out infinite;
2697
+ z-index: -1;
2698
+ }
2699
+
2700
+ .lively__tail svg {
2701
+ display: block;
2702
+ width: 100%;
2703
+ height: 100%;
2704
+ overflow: visible;
2705
+ }
2706
+
2707
+ /* The outer wrapper handles the broad wag; this inner motion lets the
2708
+ curved portion breathe and gives the tip a gentle vertical response. */
2709
+ .lively-cat__tail-motion {
2710
+ transform-box: fill-box;
2711
+ transform-origin: 4% 94%;
2712
+ animation: lively-cat-tail-ripple 2.4s ease-in-out infinite;
2713
+ }
2714
+
2715
+ .lively-cat__tail-path {
2716
+ fill: none;
2717
+ stroke: var(--lively-body);
2718
+ stroke-width: 6.6;
2719
+ stroke-linecap: round;
2720
+ stroke-linejoin: round;
2721
+ }
2722
+
2723
+ .lively-cat__tail-outline {
2724
+ fill: none;
2725
+ stroke: var(--lively-outline);
2726
+ stroke-width: 8.2;
2727
+ stroke-linecap: round;
2728
+ stroke-linejoin: round;
2729
+ opacity: 0.18;
2730
+ }
2731
+
2732
+ .lively-cat__tail-tip {
2733
+ fill: var(--lively-body);
2734
+ stroke: var(--lively-outline);
2735
+ stroke-width: 2;
2736
+ }
2737
+
2738
+ .lively-cat__toe-lines {
2739
+ fill: none;
2740
+ stroke: var(--lively-outline);
2741
+ stroke-width: .9;
2742
+ stroke-linecap: round;
2743
+ opacity: .72;
2744
+ }
2745
+
2746
+ /* Happy click: tail wags fast */
2747
+ .lively-mascot.is-happy .lively__tail {
2748
+ animation: lively-cat-tail-wag 0.3s ease-in-out 3;
2749
+ }
2750
+
2751
+ /* --- Whiskers: lines on the face --- */
2752
+ .lively-face__whisker {
2753
+ fill: none;
2754
+ stroke: var(--lively-outline);
2755
+ stroke-width: 1.2;
2756
+ stroke-linecap: round;
2757
+ opacity: 0.5;
2758
+ }
2759
+
2760
+ /* --- Nose: small triangle --- */
2761
+ .lively-face__cat-nose {
2762
+ fill: var(--lively-accent);
2763
+ stroke: var(--lively-outline);
2764
+ stroke-width: 1.2;
2765
+ stroke-linejoin: round;
2766
+ }
2767
+
2768
+ .lively-face__cat-nose-bridge {
2769
+ fill: none;
2770
+ stroke: var(--lively-outline);
2771
+ stroke-width: 1.1;
2772
+ stroke-linecap: round;
2773
+ opacity: .8;
2774
+ }
2775
+
2776
+ /* --- Foot positioning for cat --- */
2777
+ .lively-mascot--cat .lively__foot--l { left: 20cqw; }
2778
+ .lively-mascot--cat .lively__foot--r { left: 58cqw; animation-delay: 0.8s; }
2779
+
2780
+ /* Cat paw shape override */
2781
+ .lively-mascot--cat .lively-foot__body {
2782
+ rx: 8;
2783
+ ry: 5;
2784
+ fill: var(--lively-body);
2785
+ stroke: var(--lively-outline);
2786
+ stroke-width: 1.3;
2787
+ }
2788
+
2789
+ .lively-mascot--cat .lively-foot__shine { opacity: .62; }
2790
+
2791
+ @keyframes lively-cat-whiskers-float {
2792
+ 0%, 100% { transform: translateY(0); }
2793
+ 50% { transform: translateY(-1.5px); }
2794
+ }
2795
+
2796
+ @keyframes lively-cat-whisker-drift-a {
2797
+ 0%, 100% { transform: rotate(0deg) translateY(0); }
2798
+ 50% { transform: rotate(-2deg) translateY(-1px); }
2799
+ }
2800
+
2801
+ @keyframes lively-cat-whisker-drift-b {
2802
+ 0%, 100% { transform: rotate(0deg) translateY(0); }
2803
+ 50% { transform: rotate(1.5deg) translateY(1px); }
2804
+ }
2805
+
2806
+ @keyframes lively-cat-whisker-drift-c {
2807
+ 0%, 100% { transform: rotate(0deg) translateY(0); }
2808
+ 50% { transform: rotate(-1deg) translateY(1.5px); }
2809
+ }
2810
+
2811
+ @keyframes lively-cat-whiskers-droop {
2812
+ 0%, 100% { transform: translateY(1px) rotate(0deg); }
2813
+ 50% { transform: translateY(3px) rotate(2deg); }
2814
+ }
2815
+
2816
+ @keyframes lively-cat-whiskers-alert {
2817
+ from { transform: translateY(0) scale(1); }
2818
+ to { transform: translateY(-1px) scale(1.035); }
2819
+ }
2820
+
2821
+ @keyframes lively-cat-whiskers-puff {
2822
+ from { transform: translateX(0) scale(1); }
2823
+ to { transform: translateX(-1px) scale(1.06, 1.02); }
2824
+ }
2825
+
2826
+ @keyframes lively-cat-whiskers-twitch {
2827
+ 0%, 100% { transform: rotate(0deg); }
2828
+ 35% { transform: rotate(-2deg); }
2829
+ 70% { transform: rotate(1.5deg); }
2830
+ }
2831
+
2832
+ /* --- Cat-specific ear emotion animations --- */
2833
+ .lively-mascot.is-emotion-11 .lively__ears { animation: lively-cat-ear-perk 0.6s ease-in-out infinite; }
2834
+ .lively-mascot.is-emotion-13 .lively__ears { animation: lively-cat-ear-flatten 0.3s ease-in-out infinite; }
2835
+ .lively-mascot.is-emotion-37 .lively__ears { animation: lively-cat-ear-nervous 0.4s ease-in-out infinite; }
2836
+ .lively-mascot.is-emotion-00 .lively__ears { animation: lively-cat-ear-relax 4s ease-in-out infinite; }
2837
+
2838
+ /* --- Cat-specific tail emotion animations --- */
2839
+ .lively-mascot.is-emotion-12 .lively__tail { animation: lively-cat-tail-droop 3s ease-in-out infinite; }
2840
+ .lively-mascot.is-emotion-13 .lively__tail { animation: lively-cat-tail-puff 0.5s ease-in-out infinite; }
2841
+ .lively-mascot.is-emotion-37 .lively__tail { animation: lively-cat-tail-tuck 0.6s ease-in-out infinite; }
2842
+
2843
+ /* --- Cat ear keyframes --- */
2844
+ @keyframes lively-cat-ear-wiggle {
2845
+ 0%, 100% { transform: rotate(0); }
2846
+ 25% { transform: rotate(-4deg) translateY(-2px); }
2847
+ 75% { transform: rotate(4deg) translateY(-2px); }
2848
+ }
2849
+
2850
+ @keyframes lively-cat-ear-perk {
2851
+ 0%, 100% { transform: translateY(0) scaleY(1); }
2852
+ 50% { transform: translateY(-3px) scaleY(1.1); }
2853
+ }
2854
+
2855
+ @keyframes lively-cat-ear-flatten {
2856
+ 0%, 100% { transform: scaleY(1) rotate(0); }
2857
+ 50% { transform: scaleY(0.6) rotate(-5deg); }
2858
+ }
2859
+
2860
+ @keyframes lively-cat-ear-nervous {
2861
+ 0%, 100% { transform: rotate(0); }
2862
+ 25% { transform: rotate(-3deg); }
2863
+ 75% { transform: rotate(3deg); }
2864
+ }
2865
+
2866
+ @keyframes lively-cat-ear-relax {
2867
+ 0%, 100% { transform: rotate(0) scaleY(1); }
2868
+ 50% { transform: rotate(2deg) scaleY(0.9); }
2869
+ }
2870
+
2871
+ /* --- Cat tail keyframes --- */
2872
+ @keyframes lively-cat-tail-sway {
2873
+ 0%, 100% { transform: rotate(-5deg) translateY(0); }
2874
+ 50% { transform: rotate(10deg) translateY(-1px); }
2875
+ }
2876
+
2877
+ @keyframes lively-cat-tail-ripple {
2878
+ 0%, 100% { transform: rotate(0deg) scaleY(1); }
2879
+ 42% { transform: rotate(2.2deg) translateY(-1px) scaleY(.965); }
2880
+ 68% { transform: rotate(-1.1deg) translateY(.5px) scaleY(1.012); }
2881
+ }
2882
+
2883
+ @keyframes lively-cat-tail-wag {
2884
+ 0%, 100% { transform: rotate(-5deg); }
2885
+ 50% { transform: rotate(15deg); }
2886
+ }
2887
+
2888
+ @keyframes lively-cat-tail-droop {
2889
+ 0%, 100% { transform: rotate(0deg) translateY(0); }
2890
+ 50% { transform: rotate(-8deg) translateY(3px); }
2891
+ }
2892
+
2893
+ @keyframes lively-cat-tail-puff {
2894
+ 0%, 100% { transform: rotate(-5deg) scaleY(1); }
2895
+ 50% { transform: rotate(10deg) scaleY(1.3); }
2896
+ }
2897
+
2898
+ @keyframes lively-cat-tail-tuck {
2899
+ 0%, 100% { transform: rotate(0deg); }
2900
+ 50% { transform: rotate(-15deg) translateX(-4px); }
2901
+ }
2902
+ /* ============================================================
2903
+ * lively-mascot · Robot Character
2904
+ * Square head + antenna (tech / mechanical vibe)
2905
+ * ============================================================ */
2906
+
2907
+ /* --- Body (square head) --- */
2908
+ .lively-mascot--robot .lively-body {
2909
+ border-radius: 26%;
2910
+ background:
2911
+ linear-gradient(150deg, rgba(255,255,255,0.28), rgba(255,255,255,0) 55%),
2912
+ var(--lively-body);
2913
+ box-shadow: 3px 3px 0 color-mix(in srgb, var(--lively-outline) 70%, transparent), inset 0 0 0 3px rgba(255,255,255,0.10);
2914
+ }
2915
+
2916
+ /* subtle screen seam so it reads as a robot face panel */
2917
+ .lively-mascot--robot .lively-face-wrap {
2918
+ border-radius: 18%;
2919
+ box-shadow: inset 0 0 0 2px rgba(0,0,0,0.07), inset 0 4px 10px rgba(0,0,0,0.07);
2920
+ background: rgba(0,0,0,0.04);
2921
+ }
2922
+ .lively-mascot--robot .lively-face-wrap svg {
2923
+ filter: drop-shadow(0 0 1px rgba(0,0,0,0.05));
2924
+ }
2925
+
2926
+ /* Keep robot cheeks warmer and quieter than the cyan antenna accent. */
2927
+ .lively-mascot--robot .lively-face__blush {
2928
+ fill: #e7ad76;
2929
+ fill-opacity: .58;
2930
+ filter: drop-shadow(0 1px 1px rgba(0,0,0,.12));
2931
+ }
2932
+
2933
+ /* --- Antenna (leaf channel, CSS-driven) --- */
2934
+ .lively__antenna {
2935
+ position: absolute;
2936
+ top: -22cqw;
2937
+ left: 50%;
2938
+ width: 32cqw;
2939
+ height: 29cqw;
2940
+ margin-left: -16cqw;
2941
+ z-index: 3;
2942
+ transform-origin: 50% 100%;
2943
+ animation: lively-robot-antenna 2.6s ease-in-out infinite;
2944
+ }
2945
+ .lively__antenna svg { display: block; width: 100%; height: 100%; overflow: visible; }
2946
+ .lively-robot__antenna-stalk {
2947
+ fill: none;
2948
+ stroke: var(--lively-outline);
2949
+ stroke-width: 3;
2950
+ stroke-linecap: round;
2951
+ }
2952
+ .lively-robot__antenna-ball {
2953
+ fill: var(--lively-accent);
2954
+ stroke: var(--lively-outline);
2955
+ stroke-width: 2;
2956
+ animation: lively-robot-blink 1.8s ease-in-out infinite;
2957
+ }
2958
+ @keyframes lively-robot-antenna {
2959
+ 0%, 100% { transform: rotate(-4deg); }
2960
+ 50% { transform: rotate(4deg); }
2961
+ }
2962
+ @keyframes lively-robot-blink {
2963
+ 0%, 100% { fill: var(--lively-accent); }
2964
+ 50% { fill: #fff; }
2965
+ }
2966
+
2967
+ /* --- Feet (mechanical blocks) --- */
2968
+ .lively__feet--robot .lively__foot svg { overflow: visible; }
2969
+ .lively-robot__foot {
2970
+ fill: var(--lively-outline);
2971
+ stroke: var(--lively-outline);
2972
+ stroke-width: 1;
2973
+ }
2974
+ .lively-robot__foot-line { fill: rgba(255,255,255,0.5); }
2975
+
2976
+ /* Antenna emotion reactions (top decoration reacts to state) */
2977
+ .lively-mascot.is-emotion-13 .lively__antenna { animation: lively-robot-antenna-fast 0.3s ease-in-out infinite; }
2978
+ .lively-mascot.is-emotion-13 .lively-robot__antenna-ball { fill: #ff6b6b; }
2979
+ .lively-mascot.is-emotion-31 .lively-robot__antenna-ball { fill: #ff6b6b; }
2980
+ .lively-mascot.is-emotion-38 .lively-robot__antenna-ball { fill: #ffd23f; }
2981
+ @keyframes lively-robot-antenna-fast {
2982
+ 0%, 100% { transform: rotate(-3deg); }
2983
+ 50% { transform: rotate(-14deg); }
2984
+ }
2985
+ /* ============================================================
2986
+ * lively-mascot · Ghost Character
2987
+ * Floating, semi-transparent spirit. No feet — the foot channel
2988
+ * becomes a wavy hem. Simplest character in the set.
2989
+ * ============================================================ */
2990
+
2991
+ .lively-mascot--ghost {
2992
+ /* a little extra room for the floating motion + hem */
2993
+ overflow: visible;
2994
+ }
2995
+
2996
+ /* --- Body (soft transparent blob) ---
2997
+ Domed top with straight-ish sides so the body flows into the wavy hem
2998
+ below — a classic ghost silhouette rather than a ball with hanging legs. */
2999
+ .lively-mascot--ghost .lively-body {
3000
+ border-radius: 50% 50% 0 0 / 62% 62% 0 0;
3001
+ background: color-mix(in srgb, var(--lively-body) 72%, white);
3002
+ border-color: var(--lively-outline);
3003
+ border-bottom-width: 0;
3004
+ box-shadow: 0 8px 18px rgba(0,0,0,0.12);
3005
+ /* One shallow three-lobed silhouette in both outline states. */
3006
+ -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100' preserveAspectRatio='none'%3E%3Cpath fill='white' d='M0 0H100V94C88.9 100 77.8 100 66.7 94C55.6 100 44.4 100 33.3 94C22.2 100 11.1 100 0 94Z'/%3E%3C/svg%3E");
3007
+ -webkit-mask-repeat: no-repeat;
3008
+ -webkit-mask-size: 100% 100%;
3009
+ mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100' preserveAspectRatio='none'%3E%3Cpath fill='white' d='M0 0H100V94C88.9 100 77.8 100 66.7 94C55.6 100 44.4 100 33.3 94C22.2 100 11.1 100 0 94Z'/%3E%3C/svg%3E");
3010
+ mask-repeat: no-repeat;
3011
+ mask-size: 100% 100%;
3012
+ /* float instead of the default sway */
3013
+ animation: lively-ghost-float 3.4s ease-in-out infinite;
3014
+ }
3015
+ .lively-mascot--ghost.is-happy .lively-body {
3016
+ animation: lively-ghost-float 3.4s ease-in-out infinite, lively-squish 0.6s cubic-bezier(.3,1.6,.4,1);
3017
+ }
3018
+
3019
+ @keyframes lively-ghost-float {
3020
+ 0%, 100% { transform: translateY(0) rotate(0); }
3021
+ 50% { transform: translateY(-7px) rotate(-2deg); }
3022
+ }
3023
+
3024
+ /* no hard hop for a ghost */
3025
+ .lively-mascot--ghost.is-hopping .lively-mascot__rig { animation: none; }
3026
+
3027
+ /* The SVG only supplies the optional bottom ink. The body itself owns the
3028
+ filled wavy silhouette, so there is never a second colour layer to join. */
3029
+ .lively__ghost-hem {
3030
+ position: absolute;
3031
+ left: 0;
3032
+ bottom: 0;
3033
+ width: 100%;
3034
+ height: 6cqw;
3035
+ line-height: 0;
3036
+ z-index: 1;
3037
+ pointer-events: none;
3038
+ }
3039
+ .lively__ghost-hem svg {
3040
+ display: block;
3041
+ width: 100%;
3042
+ height: 100%;
3043
+ overflow: visible;
3044
+ }
3045
+ .lively-ghost__hem-stroke {
3046
+ fill: none;
3047
+ stroke: var(--lively-outline);
3048
+ stroke-width: 2.4;
3049
+ stroke-linejoin: round;
3050
+ stroke-linecap: round;
3051
+ vector-effect: non-scaling-stroke;
3052
+ }
3053
+
3054
+ .lively-mascot--ghost.lively-mascot--outline-hidden .lively__ghost-hem {
3055
+ display: none;
3056
+ }
3057
+
3058
+ /* The shared rectangular inner rim cannot follow the custom lower contour. */
3059
+ .lively-mascot--ghost .lively-body::after {
3060
+ display: none;
3061
+ }
3062
+ /* ============================================================
3063
+ * lively-mascot · Jelly Character
3064
+ * Pure jelly blob: no leaf, no feet. Q-bouncy squash-stretch.
3065
+ * ============================================================ */
3066
+
3067
+ .lively-mascot--jelly {
3068
+ overflow: visible;
3069
+ }
3070
+
3071
+ /* --- Body (translucent jelly) --- */
3072
+ .lively-mascot--jelly .lively-body {
3073
+ border-radius: 46% 46% 48% 48% / 52% 52% 50% 50%;
3074
+ background:
3075
+ radial-gradient(ellipse at 38% 30%, rgba(255,255,255,0.55), rgba(255,255,255,0) 45%),
3076
+ color-mix(in srgb, var(--lively-body) 68%, white);
3077
+ border-color: var(--lively-outline);
3078
+ box-shadow: 0 8px 16px rgba(0,0,0,0.10), inset 0 -8px 14px rgba(0,0,0,0.06);
3079
+ /* jiggly idle squash */
3080
+ animation: lively-jelly-idle 2.8s ease-in-out infinite;
3081
+ }
3082
+ .lively-mascot--jelly.is-happy .lively-body {
3083
+ animation: lively-jelly-idle 2.8s ease-in-out infinite, lively-squish 0.6s cubic-bezier(.3,1.6,.4,1);
3084
+ }
3085
+
3086
+ @keyframes lively-jelly-idle {
3087
+ 0%, 100% { transform: scale(1, 1); border-radius: 46% 46% 48% 48% / 52% 52% 50% 50%; }
3088
+ 25% { transform: scale(1.06, 0.94); border-radius: 44% 44% 50% 50% / 50% 50% 52% 52%; }
3089
+ 50% { transform: scale(0.95, 1.06); border-radius: 50% 50% 44% 44% / 54% 54% 46% 46%; }
3090
+ 75% { transform: scale(1.03, 0.97); border-radius: 44% 44% 50% 50% / 50% 50% 52% 52%; }
3091
+ }
3092
+
3093
+ /* jelly never hops (no feet) */
3094
+ .lively-mascot--jelly.is-hopping .lively-mascot__rig { animation: none; }
3095
+
3096
+ /* a couple of emotion-driven jelly reactions on top of face changes */
3097
+ .lively-mascot--jelly.is-emotion-10 .lively-body,
3098
+ .lively-mascot--jelly.is-emotion-30 .lively-body,
3099
+ .lively-mascot--jelly.is-emotion-38 .lively-body {
3100
+ animation: lively-jelly-bounce 0.7s cubic-bezier(.3,1.5,.5,1);
3101
+ }
3102
+ .lively-mascot--jelly.is-emotion-12 .lively-body,
3103
+ .lively-mascot--jelly.is-emotion-35 .lively-body {
3104
+ animation: lively-jelly-sad 3s ease-in-out infinite;
3105
+ }
3106
+ @keyframes lively-jelly-bounce {
3107
+ 0% { transform: scale(1,1); }
3108
+ 30% { transform: translateY(-10px) scale(1.08, 0.9); }
3109
+ 60% { transform: translateY(0) scale(0.94, 1.08); }
3110
+ 100% { transform: scale(1,1); }
3111
+ }
3112
+ @keyframes lively-jelly-sad {
3113
+ 0%, 100% { transform: scale(1, 1) translateY(2px); }
3114
+ 50% { transform: scale(1.04, 0.96) translateY(4px); }
3115
+ }