@kawaijs/renderer-dom 0.1.10 → 0.1.12

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.
Files changed (107) hide show
  1. package/README.md +34 -12
  2. package/dist/asset-fallbacks.d.ts +13 -0
  3. package/dist/asset-fallbacks.d.ts.map +1 -0
  4. package/dist/asset-fallbacks.js +41 -0
  5. package/dist/asset-fallbacks.js.map +1 -0
  6. package/dist/components/choice-menu.d.ts +12 -0
  7. package/dist/components/choice-menu.d.ts.map +1 -0
  8. package/dist/components/choice-menu.js +44 -0
  9. package/dist/components/choice-menu.js.map +1 -0
  10. package/dist/components/dialogue-box.d.ts +29 -0
  11. package/dist/components/dialogue-box.d.ts.map +1 -0
  12. package/dist/components/dialogue-box.js +155 -0
  13. package/dist/components/dialogue-box.js.map +1 -0
  14. package/dist/components/hotspot-layer.d.ts +13 -0
  15. package/dist/components/hotspot-layer.d.ts.map +1 -0
  16. package/dist/components/hotspot-layer.js +47 -0
  17. package/dist/components/hotspot-layer.js.map +1 -0
  18. package/dist/components/main-menu.d.ts +36 -0
  19. package/dist/components/main-menu.d.ts.map +1 -0
  20. package/dist/components/main-menu.js +257 -0
  21. package/dist/components/main-menu.js.map +1 -0
  22. package/dist/components/quick-menu.d.ts +22 -0
  23. package/dist/components/quick-menu.d.ts.map +1 -0
  24. package/dist/components/quick-menu.js +59 -0
  25. package/dist/components/quick-menu.js.map +1 -0
  26. package/dist/components/stage-layer.d.ts +39 -0
  27. package/dist/components/stage-layer.d.ts.map +1 -0
  28. package/dist/components/stage-layer.js +253 -0
  29. package/dist/components/stage-layer.js.map +1 -0
  30. package/dist/components/vfx-layer.d.ts +28 -0
  31. package/dist/components/vfx-layer.d.ts.map +1 -0
  32. package/dist/components/vfx-layer.js +310 -0
  33. package/dist/components/vfx-layer.js.map +1 -0
  34. package/dist/embed.d.ts +5 -0
  35. package/dist/embed.d.ts.map +1 -0
  36. package/dist/embed.js +17 -0
  37. package/dist/embed.js.map +1 -0
  38. package/dist/icons.d.ts +31 -0
  39. package/dist/icons.d.ts.map +1 -0
  40. package/dist/icons.js +31 -0
  41. package/dist/icons.js.map +1 -0
  42. package/dist/index.d.ts +31 -1
  43. package/dist/index.d.ts.map +1 -1
  44. package/dist/index.js +69 -3
  45. package/dist/index.js.map +1 -1
  46. package/dist/layout/viewport-adapter.d.ts +52 -0
  47. package/dist/layout/viewport-adapter.d.ts.map +1 -0
  48. package/dist/layout/viewport-adapter.js +123 -0
  49. package/dist/layout/viewport-adapter.js.map +1 -0
  50. package/dist/modals/about-modal.d.ts +3 -0
  51. package/dist/modals/about-modal.d.ts.map +1 -0
  52. package/dist/modals/about-modal.js +59 -0
  53. package/dist/modals/about-modal.js.map +1 -0
  54. package/dist/modals/achievements-modal.d.ts +4 -0
  55. package/dist/modals/achievements-modal.d.ts.map +1 -0
  56. package/dist/modals/achievements-modal.js +103 -0
  57. package/dist/modals/achievements-modal.js.map +1 -0
  58. package/dist/modals/confirm-modal.d.ts +9 -0
  59. package/dist/modals/confirm-modal.d.ts.map +1 -0
  60. package/dist/modals/confirm-modal.js +80 -0
  61. package/dist/modals/confirm-modal.js.map +1 -0
  62. package/dist/modals/gallery-modal.d.ts +4 -0
  63. package/dist/modals/gallery-modal.d.ts.map +1 -0
  64. package/dist/modals/gallery-modal.js +128 -0
  65. package/dist/modals/gallery-modal.js.map +1 -0
  66. package/dist/modals/history-modal.d.ts +3 -0
  67. package/dist/modals/history-modal.d.ts.map +1 -0
  68. package/dist/modals/history-modal.js +66 -0
  69. package/dist/modals/history-modal.js.map +1 -0
  70. package/dist/modals/input-modal.d.ts +10 -0
  71. package/dist/modals/input-modal.d.ts.map +1 -0
  72. package/dist/modals/input-modal.js +62 -0
  73. package/dist/modals/input-modal.js.map +1 -0
  74. package/dist/modals/save-load-modal.d.ts +3 -0
  75. package/dist/modals/save-load-modal.d.ts.map +1 -0
  76. package/dist/modals/save-load-modal.js +262 -0
  77. package/dist/modals/save-load-modal.js.map +1 -0
  78. package/dist/modals/settings-modal.d.ts +14 -0
  79. package/dist/modals/settings-modal.d.ts.map +1 -0
  80. package/dist/modals/settings-modal.js +128 -0
  81. package/dist/modals/settings-modal.js.map +1 -0
  82. package/dist/renderer.d.ts +75 -34
  83. package/dist/renderer.d.ts.map +1 -1
  84. package/dist/renderer.js +763 -529
  85. package/dist/renderer.js.map +1 -1
  86. package/dist/share-meta.d.ts +27 -0
  87. package/dist/share-meta.d.ts.map +1 -0
  88. package/dist/share-meta.js +113 -0
  89. package/dist/share-meta.js.map +1 -0
  90. package/dist/touch.d.ts +16 -0
  91. package/dist/touch.d.ts.map +1 -0
  92. package/dist/touch.js +60 -0
  93. package/dist/touch.js.map +1 -0
  94. package/dist/types.d.ts +134 -0
  95. package/dist/types.d.ts.map +1 -0
  96. package/dist/types.js +60 -0
  97. package/dist/types.js.map +1 -0
  98. package/dist/utils/focus-trap.d.ts +6 -0
  99. package/dist/utils/focus-trap.d.ts.map +1 -0
  100. package/dist/utils/focus-trap.js +52 -0
  101. package/dist/utils/focus-trap.js.map +1 -0
  102. package/dist/utils/rich-text.d.ts +7 -0
  103. package/dist/utils/rich-text.d.ts.map +1 -0
  104. package/dist/utils/rich-text.js +31 -0
  105. package/dist/utils/rich-text.js.map +1 -0
  106. package/package.json +17 -3
  107. package/src/theme.css +1995 -523
package/src/theme.css CHANGED
@@ -1,523 +1,1995 @@
1
- :root {
2
- --kawa-font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;
3
- --kawa-bg-color: #0b0f19;
4
- --kawa-text-color: #f3f4f6;
5
- --kawa-primary-accent: #f43f5e;
6
- --kawa-dialogue-bg: rgba(15, 23, 42, 0.85);
7
- --kawa-dialogue-border: rgba(244, 63, 94, 0.3);
8
- --kawa-dialogue-radius: 12px;
9
- --kawa-dialogue-padding: 24px 32px;
10
- --kawa-speaker-bg: #f43f5e;
11
- --kawa-speaker-color: #ffffff;
12
- --kawa-speaker-radius: 6px;
13
- --kawa-choice-bg: rgba(30, 41, 59, 0.9);
14
- --kawa-choice-hover-bg: rgba(244, 63, 94, 0.85);
15
- --kawa-choice-color: #ffffff;
16
- --kawa-choice-border: 1px solid rgba(255, 255, 255, 0.15);
17
- --kawa-choice-radius: 8px;
18
- --kawa-choice-padding: 14px 28px;
19
- --kawa-menu-btn-bg: rgba(15, 23, 42, 0.6);
20
- --kawa-menu-btn-hover-bg: rgba(244, 63, 94, 0.8);
21
- --kawa-stage-aspect-ratio: 16 / 9;
22
- }
23
-
24
- /* Base Reset & Root Container */
25
- html, body {
26
- margin: 0;
27
- padding: 0;
28
- width: 100%;
29
- height: 100%;
30
- background: #030712;
31
- overflow: hidden;
32
- }
33
-
34
- .kawa-root {
35
- position: relative;
36
- width: 100vw;
37
- height: 100vh;
38
- background: radial-gradient(circle at 50% 50%, #0f172a 0%, #020617 100%);
39
- color: var(--kawa-text-color);
40
- font-family: var(--kawa-font-family);
41
- display: flex;
42
- align-items: center;
43
- justify-content: center;
44
- overflow: hidden;
45
- user-select: none;
46
- box-sizing: border-box;
47
- }
48
-
49
- .kawa-root * {
50
- box-sizing: border-box;
51
- }
52
-
53
- /* Stage & Aspect Ratio Box */
54
- .kawa-stage {
55
- position: relative;
56
- width: 100%;
57
- max-width: calc(100vh * (16 / 9));
58
- aspect-ratio: var(--kawa-stage-aspect-ratio);
59
- background: radial-gradient(ellipse at center, #1e293b 0%, #0f172a 100%);
60
- overflow: hidden;
61
- box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.8);
62
- }
63
-
64
- /* Screen Shake Effect */
65
- @keyframes kawa-screen-shake {
66
- 0%, 100% { transform: translate(0, 0); }
67
- 15% { transform: translate(-12px, 8px); }
68
- 30% { transform: translate(12px, -8px); }
69
- 45% { transform: translate(-8px, -6px); }
70
- 60% { transform: translate(8px, 6px); }
71
- 75% { transform: translate(-4px, 2px); }
72
- 90% { transform: translate(4px, -2px); }
73
- }
74
-
75
- .kawa-shake {
76
- animation: kawa-screen-shake 0.45s cubic-bezier(0.36, 0.07, 0.19, 0.97) both;
77
- }
78
-
79
- /* Screen Flash Effect */
80
- @keyframes kawa-screen-flash {
81
- 0% { opacity: 0; }
82
- 30% { opacity: 0.95; }
83
- 100% { opacity: 0; }
84
- }
85
-
86
- .kawa-flash-overlay {
87
- position: absolute;
88
- inset: 0;
89
- background: #ffffff;
90
- pointer-events: none;
91
- z-index: 50;
92
- animation: kawa-screen-flash 0.5s ease-out forwards;
93
- }
94
-
95
- /* Background Scene Layer with Crossfade Support */
96
- .kawa-background {
97
- position: absolute;
98
- inset: 0;
99
- z-index: 1;
100
- background: radial-gradient(ellipse at center, #1e293b 0%, #0f172a 100%);
101
- overflow: hidden;
102
- }
103
-
104
- .kawa-bg-layer {
105
- position: absolute;
106
- inset: 0;
107
- background-size: cover;
108
- background-position: center;
109
- background-repeat: no-repeat;
110
- transition: opacity 0.4s ease-in-out;
111
- opacity: 0;
112
- }
113
-
114
- .kawa-bg-layer.active {
115
- opacity: 1;
116
- }
117
-
118
- /* Characters Layer */
119
- .kawa-characters {
120
- position: absolute;
121
- inset: 0;
122
- pointer-events: none;
123
- z-index: 2;
124
- display: flex;
125
- align-items: flex-end;
126
- }
127
-
128
- .kawa-sprite {
129
- position: absolute;
130
- bottom: 0;
131
- height: 85%;
132
- transition: transform 0.35s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.35s ease;
133
- display: flex;
134
- align-items: flex-end;
135
- justify-content: center;
136
- }
137
-
138
- .kawa-sprite img {
139
- max-height: 100%;
140
- width: auto;
141
- object-fit: contain;
142
- filter: drop-shadow(0 10px 15px rgba(0, 0, 0, 0.5));
143
- }
144
-
145
- .kawa-sprite.kawa-pos-left {
146
- left: 15%;
147
- transform: translateX(-50%);
148
- }
149
-
150
- .kawa-sprite.kawa-pos-center {
151
- left: 50%;
152
- transform: translateX(-50%);
153
- }
154
-
155
- .kawa-sprite.kawa-pos-right {
156
- left: 85%;
157
- transform: translateX(-50%);
158
- }
159
-
160
- /* UI Overlay Layer */
161
- .kawa-ui-layer {
162
- position: absolute;
163
- inset: 0;
164
- z-index: 10;
165
- display: flex;
166
- flex-direction: column;
167
- justify-content: flex-end;
168
- padding: 32px 48px;
169
- pointer-events: none;
170
- }
171
-
172
- /* Dialogue Box */
173
- .kawa-dialogue-box {
174
- position: relative;
175
- width: 100%;
176
- min-height: 140px;
177
- background: var(--kawa-dialogue-bg);
178
- backdrop-filter: blur(12px);
179
- -webkit-backdrop-filter: blur(12px);
180
- border: 1px solid var(--kawa-dialogue-border);
181
- border-radius: var(--kawa-dialogue-radius);
182
- padding: var(--kawa-dialogue-padding);
183
- box-shadow: 0 10px 30px rgba(0, 0, 0, 0.4);
184
- pointer-events: auto;
185
- cursor: pointer;
186
- transition: transform 0.15s ease;
187
- }
188
-
189
- .kawa-dialogue-box:hover {
190
- transform: translateY(-2px);
191
- }
192
-
193
- .kawa-speaker-tag {
194
- display: inline-block;
195
- font-weight: 700;
196
- font-size: 1.1rem;
197
- letter-spacing: 0.03em;
198
- color: var(--kawa-speaker-color);
199
- background-color: var(--kawa-speaker-bg);
200
- padding: 4px 14px;
201
- border-radius: var(--kawa-speaker-radius);
202
- margin-bottom: 10px;
203
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);
204
- }
205
-
206
- .kawa-dialogue-text {
207
- font-size: 1.15rem;
208
- line-height: 1.65;
209
- color: var(--kawa-text-color);
210
- word-break: break-word;
211
- }
212
-
213
- .kawa-continue-indicator {
214
- position: absolute;
215
- right: 24px;
216
- bottom: 16px;
217
- font-size: 1rem;
218
- color: var(--kawa-primary-accent);
219
- animation: kawa-bounce 1.2s infinite ease-in-out;
220
- }
221
-
222
- @keyframes kawa-bounce {
223
- 0%, 100% { transform: translateY(0); }
224
- 50% { transform: translateY(4px); }
225
- }
226
-
227
- /* Choice Buttons Container */
228
- .kawa-choice-container {
229
- position: absolute;
230
- top: 45%;
231
- left: 50%;
232
- transform: translate(-50%, -50%);
233
- display: flex;
234
- flex-direction: column;
235
- gap: 14px;
236
- width: 80%;
237
- max-width: 500px;
238
- pointer-events: auto;
239
- z-index: 20;
240
- }
241
-
242
- .kawa-choice-btn {
243
- background: var(--kawa-choice-bg);
244
- backdrop-filter: blur(8px);
245
- color: var(--kawa-choice-color);
246
- border: var(--kawa-choice-border);
247
- border-radius: var(--kawa-choice-radius);
248
- padding: var(--kawa-choice-padding);
249
- font-size: 1.05rem;
250
- font-weight: 600;
251
- cursor: pointer;
252
- transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
253
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
254
- text-align: center;
255
- }
256
-
257
- .kawa-choice-btn:hover {
258
- background: var(--kawa-choice-hover-bg);
259
- transform: translateY(-2px) scale(1.02);
260
- box-shadow: 0 8px 20px rgba(244, 63, 94, 0.4);
261
- }
262
-
263
- .kawa-choice-btn:active {
264
- transform: translateY(0) scale(0.99);
265
- }
266
-
267
- /* Quick Menu Bar */
268
- .kawa-quick-menu {
269
- display: flex;
270
- gap: 10px;
271
- justify-content: flex-end;
272
- margin-top: 10px;
273
- pointer-events: auto;
274
- }
275
-
276
- .kawa-btn {
277
- background: var(--kawa-menu-btn-bg);
278
- color: #cbd5e1;
279
- border: 1px solid rgba(255, 255, 255, 0.1);
280
- border-radius: 4px;
281
- padding: 4px 12px;
282
- font-size: 0.85rem;
283
- font-weight: 500;
284
- cursor: pointer;
285
- transition: all 0.15s ease;
286
- }
287
-
288
- .kawa-btn:hover {
289
- background: var(--kawa-menu-btn-hover-bg);
290
- color: #ffffff;
291
- }
292
-
293
- .kawa-btn:disabled {
294
- opacity: 0.4;
295
- cursor: not-allowed;
296
- }
297
-
298
- /* Modals (History, Save/Load) */
299
- .kawa-modal-overlay {
300
- position: absolute;
301
- inset: 0;
302
- background: rgba(0, 0, 0, 0.82);
303
- backdrop-filter: blur(8px);
304
- z-index: 100;
305
- display: flex;
306
- align-items: center;
307
- justify-content: center;
308
- pointer-events: auto;
309
- animation: kawa-modal-fade 0.2s ease-out;
310
- }
311
-
312
- @keyframes kawa-modal-fade {
313
- from { opacity: 0; transform: scale(0.98); }
314
- to { opacity: 1; transform: scale(1); }
315
- }
316
-
317
- .kawa-modal-card {
318
- background: #1e293b;
319
- border: 1px solid rgba(255, 255, 255, 0.15);
320
- border-radius: 14px;
321
- width: 90%;
322
- max-width: 750px;
323
- max-height: 85%;
324
- display: flex;
325
- flex-direction: column;
326
- padding: 24px 28px;
327
- box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.8);
328
- }
329
-
330
- .kawa-modal-header {
331
- display: flex;
332
- justify-content: space-between;
333
- align-items: center;
334
- margin-bottom: 20px;
335
- border-bottom: 1px solid rgba(255, 255, 255, 0.1);
336
- padding-bottom: 12px;
337
- }
338
-
339
- .kawa-modal-title {
340
- font-size: 1.35rem;
341
- font-weight: 700;
342
- color: #ffffff;
343
- display: flex;
344
- align-items: center;
345
- gap: 8px;
346
- }
347
-
348
- .kawa-modal-body {
349
- overflow-y: auto;
350
- flex: 1;
351
- display: flex;
352
- flex-direction: column;
353
- gap: 12px;
354
- padding-right: 6px;
355
- }
356
-
357
- /* Slots Grid for Save/Load UI */
358
- .kawa-slots-grid {
359
- display: grid;
360
- grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
361
- gap: 16px;
362
- padding: 4px 0;
363
- }
364
-
365
- .kawa-slot-card {
366
- background: rgba(15, 23, 42, 0.7);
367
- border: 1px solid rgba(255, 255, 255, 0.1);
368
- border-radius: 10px;
369
- padding: 16px;
370
- display: flex;
371
- flex-direction: column;
372
- justify-content: space-between;
373
- min-height: 130px;
374
- transition: all 0.2s ease;
375
- }
376
-
377
- .kawa-slot-card:hover {
378
- border-color: var(--kawa-primary-accent);
379
- background: rgba(15, 23, 42, 0.9);
380
- transform: translateY(-2px);
381
- }
382
-
383
- .kawa-slot-header {
384
- display: flex;
385
- justify-content: space-between;
386
- align-items: center;
387
- margin-bottom: 8px;
388
- }
389
-
390
- .kawa-slot-badge {
391
- font-size: 0.8rem;
392
- font-weight: 700;
393
- background: var(--kawa-primary-accent);
394
- color: #fff;
395
- padding: 2px 8px;
396
- border-radius: 4px;
397
- }
398
-
399
- .kawa-slot-time {
400
- font-size: 0.75rem;
401
- color: #94a3b8;
402
- }
403
-
404
- .kawa-slot-preview {
405
- font-size: 0.85rem;
406
- color: #cbd5e1;
407
- line-height: 1.4;
408
- margin-bottom: 12px;
409
- word-break: break-word;
410
- max-height: 48px;
411
- overflow: hidden;
412
- }
413
-
414
- .kawa-slot-empty-text {
415
- color: #64748b;
416
- font-style: italic;
417
- font-size: 0.85rem;
418
- margin: auto 0;
419
- }
420
-
421
- .kawa-slot-actions {
422
- display: flex;
423
- gap: 8px;
424
- }
425
-
426
- .kawa-slot-btn {
427
- flex: 1;
428
- padding: 6px 10px;
429
- border-radius: 4px;
430
- border: none;
431
- font-size: 0.8rem;
432
- font-weight: 600;
433
- cursor: pointer;
434
- transition: all 0.15s ease;
435
- }
436
-
437
- .kawa-slot-btn-save {
438
- background: #3b82f6;
439
- color: #ffffff;
440
- }
441
- .kawa-slot-btn-save:hover { background: #2563eb; }
442
-
443
- .kawa-slot-btn-load {
444
- background: var(--kawa-primary-accent);
445
- color: #ffffff;
446
- }
447
- .kawa-slot-btn-load:hover { background: #e11d48; }
448
-
449
- .kawa-slot-btn-del {
450
- background: rgba(239, 68, 68, 0.2);
451
- color: #f87171;
452
- border: 1px solid rgba(239, 68, 68, 0.3);
453
- }
454
- .kawa-slot-btn-del:hover { background: rgba(239, 68, 68, 0.4); }
455
-
456
- .kawa-history-item {
457
- padding: 10px 14px;
458
- border-radius: 8px;
459
- background: rgba(15, 23, 42, 0.65);
460
- font-size: 0.95rem;
461
- border-left: 3px solid var(--kawa-primary-accent);
462
- }
463
-
464
- .kawa-history-speaker {
465
- font-weight: 700;
466
- color: var(--kawa-primary-accent);
467
- margin-bottom: 4px;
468
- }
469
-
470
- /* Ending Card Overlay */
471
- .kawa-ending-card {
472
- position: absolute;
473
- top: 50%;
474
- left: 50%;
475
- transform: translate(-50%, -50%);
476
- background: rgba(15, 23, 42, 0.9);
477
- backdrop-filter: blur(16px);
478
- border: 1px solid rgba(244, 63, 94, 0.4);
479
- border-radius: 16px;
480
- padding: 32px 48px;
481
- display: flex;
482
- flex-direction: column;
483
- align-items: center;
484
- text-align: center;
485
- box-shadow: 0 20px 50px rgba(0, 0, 0, 0.7), 0 0 30px rgba(244, 63, 94, 0.2);
486
- z-index: 50;
487
- animation: kawa-fade-in 0.6s ease-out;
488
- }
489
-
490
- .kawa-ending-title {
491
- font-size: 2rem;
492
- font-weight: 800;
493
- color: var(--kawa-primary-accent);
494
- margin-bottom: 8px;
495
- }
496
-
497
- .kawa-ending-subtitle {
498
- font-size: 1.1rem;
499
- color: #cbd5e1;
500
- margin-bottom: 16px;
501
- }
502
-
503
- /* Accessible Focus States */
504
- .kawa-btn:focus-visible,
505
- .kawa-choice-btn:focus-visible,
506
- .kawa-slot-btn:focus-visible,
507
- .kawa-dialogue-box:focus-visible {
508
- outline: 2px solid var(--kawa-primary-accent);
509
- outline-offset: 3px;
510
- }
511
-
512
- /* Reduced Motion Support */
513
- @media (prefers-reduced-motion: reduce) {
514
- *,
515
- *::before,
516
- *::after {
517
- animation-duration: 0.01ms !important;
518
- animation-iteration-count: 1 !important;
519
- transition-duration: 0.01ms !important;
520
- scroll-behavior: auto !important;
521
- }
522
- }
523
-
1
+ @import url('https://fonts.googleapis.com/css2?family=Outfit:wght@400;500;600;700;800;900&family=Plus+Jakarta+Sans:ital,wght@0,400;0,500;0,600;0,700;1,400;1,600&display=swap');
2
+
3
+ :root {
4
+ --kawa-font-heading: 'Outfit', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
5
+ --kawa-font-body: 'Plus Jakarta Sans', 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
6
+ --kawa-font-family: var(--kawa-font-body);
7
+ --kawa-bg-color: #080c16;
8
+ --kawa-text-color: #f8fafc;
9
+ --kawa-primary-accent: #f43f5e;
10
+ --kawa-primary-glow: rgba(244, 63, 94, 0.45);
11
+ --kawa-secondary-accent: #38bdf8;
12
+ --kawa-dialogue-bg: linear-gradient(180deg, rgba(17, 24, 39, 0.88) 0%, rgba(10, 15, 29, 0.95) 100%);
13
+ --kawa-dialogue-border: rgba(244, 63, 94, 0.35);
14
+ --kawa-dialogue-radius: 16px;
15
+ --kawa-dialogue-padding: clamp(16px, 2.5vh, 26px) clamp(20px, 3vw, 36px);
16
+ --kawa-speaker-bg: linear-gradient(135deg, #f43f5e 0%, #e11d48 100%);
17
+ --kawa-speaker-color: #ffffff;
18
+ --kawa-speaker-radius: 8px;
19
+ --kawa-choice-bg: linear-gradient(135deg, rgba(30, 41, 59, 0.88) 0%, rgba(15, 23, 42, 0.94) 100%);
20
+ --kawa-choice-hover-bg: linear-gradient(135deg, #f43f5e 0%, #e11d48 100%);
21
+ --kawa-choice-color: #ffffff;
22
+ --kawa-choice-border: 1px solid rgba(255, 255, 255, 0.14);
23
+ --kawa-choice-radius: 12px;
24
+ --kawa-choice-padding: clamp(12px, 1.8vh, 16px) clamp(20px, 3vw, 32px);
25
+ --kawa-menu-btn-bg: rgba(15, 23, 42, 0.6);
26
+ --kawa-menu-btn-hover-bg: rgba(244, 63, 94, 0.85);
27
+ --kawa-stage-aspect-ratio: 16 / 9;
28
+ --kawa-main-menu-bg: radial-gradient(circle at 50% 50%, rgba(15, 23, 42, 0.95) 0%, rgba(2, 6, 23, 0.98) 100%);
29
+ --kawa-main-menu-title-color: #f8fafc;
30
+ --kawa-main-menu-btn-bg: linear-gradient(135deg, rgba(30, 41, 59, 0.75) 0%, rgba(15, 23, 42, 0.88) 100%);
31
+ --kawa-main-menu-btn-hover-bg: linear-gradient(135deg, #f43f5e 0%, #e11d48 100%);
32
+ --kawa-main-menu-btn-color: #ffffff;
33
+ --kawa-main-menu-btn-radius: 12px;
34
+ --kawa-main-menu-btn-padding: clamp(8px, 1.4vh, 12px) 20px;
35
+ }
36
+
37
+ /* Base Reset & Root Container — scoped to avoid host-page pollution when embedding */
38
+ html.kawa-fullscreen,
39
+ body.kawa-fullscreen {
40
+ margin: 0;
41
+ padding: 0;
42
+ width: 100%;
43
+ height: 100%;
44
+ background: #030712;
45
+ overflow: hidden;
46
+ -webkit-font-smoothing: antialiased;
47
+ -moz-osx-font-smoothing: grayscale;
48
+ }
49
+
50
+ .kawa-root {
51
+ position: relative;
52
+ width: 100%;
53
+ height: 100%;
54
+ min-height: 100%;
55
+ background: radial-gradient(circle at 50% 50%, #0f172a 0%, #020617 100%);
56
+ color: var(--kawa-text-color);
57
+ font-family: var(--kawa-font-family);
58
+ display: flex;
59
+ align-items: center;
60
+ justify-content: center;
61
+ overflow: hidden;
62
+ user-select: none;
63
+ box-sizing: border-box;
64
+ -webkit-font-smoothing: antialiased;
65
+ -moz-osx-font-smoothing: grayscale;
66
+ }
67
+
68
+ .kawa-root * {
69
+ box-sizing: border-box;
70
+ }
71
+
72
+ /* Stage & Aspect Ratio Box */
73
+ .kawa-stage {
74
+ position: relative;
75
+ width: 100%;
76
+ max-width: calc(100vh * (16 / 9));
77
+ aspect-ratio: var(--kawa-stage-aspect-ratio);
78
+ background: radial-gradient(ellipse at center, #1e293b 0%, #0f172a 100%);
79
+ overflow: hidden;
80
+ border: 1px solid rgba(255, 255, 255, 0.08);
81
+ box-shadow: 0 25px 60px -10px rgba(0, 0, 0, 0.85), 0 0 50px rgba(244, 63, 94, 0.12);
82
+ }
83
+
84
+ /* Screen Shake Effect */
85
+ @keyframes kawa-screen-shake {
86
+ 0%, 100% { transform: translate(0, 0); }
87
+ 15% { transform: translate(-12px, 8px); }
88
+ 30% { transform: translate(12px, -8px); }
89
+ 45% { transform: translate(-8px, -6px); }
90
+ 60% { transform: translate(8px, 6px); }
91
+ 75% { transform: translate(-4px, 2px); }
92
+ 90% { transform: translate(4px, -2px); }
93
+ }
94
+
95
+ .kawa-shake {
96
+ animation: kawa-screen-shake 0.45s cubic-bezier(0.36, 0.07, 0.19, 0.97) both;
97
+ }
98
+
99
+ /* Screen Flash Effect */
100
+ @keyframes kawa-screen-flash {
101
+ 0% { opacity: 0; }
102
+ 30% { opacity: 0.95; }
103
+ 100% { opacity: 0; }
104
+ }
105
+
106
+ .kawa-flash-overlay {
107
+ position: absolute;
108
+ inset: 0;
109
+ background: #ffffff;
110
+ pointer-events: none;
111
+ z-index: 50;
112
+ animation: kawa-screen-flash 0.5s ease-out forwards;
113
+ }
114
+
115
+ /* Background Scene Layer with Crossfade Support */
116
+ .kawa-background {
117
+ position: absolute;
118
+ inset: 0;
119
+ z-index: 1;
120
+ background: radial-gradient(ellipse at center, #1e293b 0%, #0f172a 100%);
121
+ overflow: hidden;
122
+ }
123
+
124
+ .kawa-bg-layer {
125
+ position: absolute;
126
+ inset: 0;
127
+ background-size: cover;
128
+ background-position: center;
129
+ background-repeat: no-repeat;
130
+ transition: opacity 0.5s cubic-bezier(0.4, 0, 0.2, 1);
131
+ opacity: 0;
132
+ }
133
+
134
+ .kawa-bg-layer.active {
135
+ opacity: 1;
136
+ }
137
+
138
+ /* Slower crossfade for `with dissolve` */
139
+ .kawa-background[data-transition="dissolve"] .kawa-bg-layer {
140
+ transition: opacity 0.85s cubic-bezier(0.4, 0, 0.2, 1);
141
+ }
142
+
143
+ /* Directional wipe transitions */
144
+ .kawa-background[data-transition="wipeleft"] .kawa-bg-layer,
145
+ .kawa-background[data-transition="wiperight"] .kawa-bg-layer {
146
+ transition: opacity 0.55s ease, clip-path 0.55s cubic-bezier(0.4, 0, 0.2, 1);
147
+ }
148
+
149
+ .kawa-bg-layer.kawa-wipe-from-left {
150
+ clip-path: inset(0 100% 0 0);
151
+ }
152
+
153
+ .kawa-bg-layer.kawa-wipe-from-left.active {
154
+ clip-path: inset(0 0 0 0);
155
+ }
156
+
157
+ .kawa-bg-layer.kawa-wipe-from-right {
158
+ clip-path: inset(0 0 0 100%);
159
+ }
160
+
161
+ .kawa-bg-layer.kawa-wipe-from-right.active {
162
+ clip-path: inset(0 0 0 0);
163
+ }
164
+
165
+ /* Characters Layer */
166
+ .kawa-characters {
167
+ position: absolute;
168
+ inset: 0;
169
+ pointer-events: none;
170
+ z-index: 2;
171
+ display: flex;
172
+ align-items: flex-end;
173
+ }
174
+
175
+ @keyframes kawa-sprite-breathe {
176
+ 0%, 100% { transform: translateY(0); }
177
+ 50% { transform: translateY(-3px); }
178
+ }
179
+
180
+ .kawa-sprite {
181
+ position: absolute;
182
+ bottom: 0;
183
+ height: 85%;
184
+ transition: transform 0.4s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.35s ease;
185
+ display: flex;
186
+ align-items: flex-end;
187
+ justify-content: center;
188
+ }
189
+
190
+ .kawa-sprite img {
191
+ max-height: 100%;
192
+ width: auto;
193
+ object-fit: contain;
194
+ filter: drop-shadow(0 14px 28px rgba(0, 0, 0, 0.7));
195
+ animation: kawa-sprite-breathe 4s ease-in-out infinite;
196
+ }
197
+
198
+ .kawa-sprite.kawa-pos-left {
199
+ left: 15%;
200
+ transform: translateX(-50%);
201
+ }
202
+
203
+ .kawa-sprite.kawa-pos-center {
204
+ left: 50%;
205
+ transform: translateX(-50%);
206
+ }
207
+
208
+ .kawa-sprite.kawa-pos-right {
209
+ left: 85%;
210
+ transform: translateX(-50%);
211
+ }
212
+
213
+ /* UI Overlay Layer */
214
+ .kawa-ui-layer {
215
+ position: absolute;
216
+ inset: 0;
217
+ z-index: 10;
218
+ display: flex;
219
+ flex-direction: column;
220
+ justify-content: flex-end;
221
+ padding: clamp(20px, 3.5vh, 36px) clamp(24px, 4vw, 54px);
222
+ pointer-events: none;
223
+ }
224
+
225
+ /* Dialogue Box */
226
+ .kawa-dialogue-box {
227
+ position: relative;
228
+ width: 100%;
229
+ min-height: 140px;
230
+ background: var(--kawa-dialogue-bg);
231
+ backdrop-filter: blur(20px) saturate(180%);
232
+ -webkit-backdrop-filter: blur(20px) saturate(180%);
233
+ border: 1px solid var(--kawa-dialogue-border);
234
+ border-radius: var(--kawa-dialogue-radius);
235
+ padding: var(--kawa-dialogue-padding);
236
+ box-shadow: 0 20px 50px -10px rgba(0, 0, 0, 0.8), 0 0 25px rgba(244, 63, 94, 0.12), inset 0 1px 0 rgba(255, 255, 255, 0.15);
237
+ pointer-events: auto;
238
+ cursor: pointer;
239
+ transition: transform 0.2s cubic-bezier(0.4, 0, 0.2, 1), box-shadow 0.2s ease;
240
+ }
241
+
242
+ .kawa-dialogue-box:hover {
243
+ transform: translateY(-2px);
244
+ box-shadow: 0 24px 60px -10px rgba(0, 0, 0, 0.85), 0 0 35px rgba(244, 63, 94, 0.2), inset 0 1px 0 rgba(255, 255, 255, 0.25);
245
+ }
246
+
247
+ .kawa-speaker-tag {
248
+ display: inline-flex;
249
+ align-items: center;
250
+ font-family: var(--kawa-font-heading);
251
+ font-weight: 800;
252
+ font-size: 1.05rem;
253
+ letter-spacing: 0.05em;
254
+ text-transform: uppercase;
255
+ color: var(--kawa-speaker-color);
256
+ background: var(--kawa-speaker-bg);
257
+ padding: 5px 16px;
258
+ border-radius: var(--kawa-speaker-radius);
259
+ margin-bottom: 12px;
260
+ box-shadow: 0 4px 14px rgba(244, 63, 94, 0.4), inset 0 1px 0 rgba(255, 255, 255, 0.25);
261
+ border: 1px solid rgba(255, 255, 255, 0.2);
262
+ }
263
+
264
+ .kawa-dialogue-text {
265
+ font-family: var(--kawa-font-body);
266
+ font-size: clamp(1.05rem, 1.8vh, 1.25rem);
267
+ line-height: 1.75;
268
+ letter-spacing: 0.01em;
269
+ color: var(--kawa-text-color);
270
+ word-break: break-word;
271
+ text-shadow: 0 1px 3px rgba(0, 0, 0, 0.7);
272
+ }
273
+
274
+ .kawa-continue-indicator {
275
+ position: absolute;
276
+ right: 24px;
277
+ bottom: 16px;
278
+ display: inline-flex;
279
+ align-items: center;
280
+ justify-content: center;
281
+ width: 28px;
282
+ height: 28px;
283
+ border-radius: 50%;
284
+ background: rgba(244, 63, 94, 0.2);
285
+ border: 1px solid rgba(244, 63, 94, 0.5);
286
+ color: var(--kawa-primary-accent);
287
+ animation: kawa-indicator-pulse 1.4s infinite ease-in-out;
288
+ box-shadow: 0 0 12px rgba(244, 63, 94, 0.35);
289
+ }
290
+
291
+ @keyframes kawa-indicator-pulse {
292
+ 0%, 100% { transform: translateY(0) scale(1); box-shadow: 0 0 8px rgba(244, 63, 94, 0.3); }
293
+ 50% { transform: translateY(4px) scale(1.08); box-shadow: 0 0 16px rgba(244, 63, 94, 0.6); }
294
+ }
295
+
296
+ /* Choice Buttons Container */
297
+ .kawa-choice-container {
298
+ position: absolute;
299
+ top: 45%;
300
+ left: 50%;
301
+ transform: translate(-50%, -50%);
302
+ display: flex;
303
+ flex-direction: column;
304
+ gap: 14px;
305
+ width: 85%;
306
+ max-width: 520px;
307
+ pointer-events: auto;
308
+ z-index: 20;
309
+ animation: kawa-choice-appear 0.35s cubic-bezier(0.16, 1, 0.3, 1);
310
+ }
311
+
312
+ @keyframes kawa-choice-appear {
313
+ from { opacity: 0; transform: translate(-50%, -46%) scale(0.96); }
314
+ to { opacity: 1; transform: translate(-50%, -50%) scale(1); }
315
+ }
316
+
317
+ .kawa-choice-btn {
318
+ position: relative;
319
+ overflow: hidden;
320
+ background: var(--kawa-choice-bg);
321
+ backdrop-filter: blur(16px);
322
+ -webkit-backdrop-filter: blur(16px);
323
+ color: var(--kawa-choice-color);
324
+ border: var(--kawa-choice-border);
325
+ border-left: 4px solid var(--kawa-primary-accent);
326
+ border-radius: var(--kawa-choice-radius);
327
+ padding: var(--kawa-choice-padding);
328
+ font-family: var(--kawa-font-heading);
329
+ font-size: 1.08rem;
330
+ font-weight: 600;
331
+ letter-spacing: 0.02em;
332
+ cursor: pointer;
333
+ transition: all 0.25s cubic-bezier(0.34, 1.56, 0.64, 1);
334
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.45);
335
+ text-align: center;
336
+ }
337
+
338
+ .kawa-choice-btn::before {
339
+ content: '';
340
+ position: absolute;
341
+ top: 0;
342
+ left: -100%;
343
+ width: 100%;
344
+ height: 100%;
345
+ background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.18), transparent);
346
+ transition: left 0.5s ease;
347
+ }
348
+
349
+ .kawa-choice-btn:hover::before {
350
+ left: 100%;
351
+ }
352
+
353
+ .kawa-choice-btn:hover {
354
+ background: var(--kawa-choice-hover-bg);
355
+ border-color: rgba(255, 255, 255, 0.35);
356
+ border-left-color: #ffffff;
357
+ transform: translateY(-3px) scale(1.02);
358
+ box-shadow: 0 12px 30px rgba(244, 63, 94, 0.5), 0 0 20px rgba(244, 63, 94, 0.3);
359
+ }
360
+
361
+ .kawa-choice-btn:active {
362
+ transform: translateY(0) scale(0.99);
363
+ }
364
+
365
+ /* Quick Menu Bar */
366
+ .kawa-quick-menu {
367
+ display: inline-flex;
368
+ gap: 6px;
369
+ justify-content: flex-end;
370
+ margin-top: 12px;
371
+ pointer-events: auto;
372
+ align-items: center;
373
+ background: rgba(10, 15, 29, 0.72);
374
+ backdrop-filter: blur(16px);
375
+ -webkit-backdrop-filter: blur(16px);
376
+ padding: 4px 8px;
377
+ border-radius: 20px;
378
+ border: 1px solid rgba(255, 255, 255, 0.08);
379
+ box-shadow: 0 6px 20px rgba(0, 0, 0, 0.4);
380
+ align-self: flex-end;
381
+ }
382
+
383
+ .kawa-btn {
384
+ background: transparent;
385
+ color: #cbd5e1;
386
+ border: none;
387
+ border-radius: 12px;
388
+ padding: 6px 12px;
389
+ font-family: var(--kawa-font-heading);
390
+ font-size: 0.82rem;
391
+ font-weight: 600;
392
+ letter-spacing: 0.02em;
393
+ cursor: pointer;
394
+ transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
395
+ display: inline-flex;
396
+ align-items: center;
397
+ gap: 6px;
398
+ line-height: 1;
399
+ }
400
+
401
+ .kawa-btn svg {
402
+ display: inline-block;
403
+ vertical-align: middle;
404
+ flex-shrink: 0;
405
+ }
406
+
407
+ .kawa-btn:hover {
408
+ background: rgba(244, 63, 94, 0.2);
409
+ color: #ffffff;
410
+ transform: translateY(-1px);
411
+ }
412
+
413
+ .kawa-btn.active {
414
+ background: var(--kawa-primary-accent);
415
+ color: #ffffff;
416
+ box-shadow: 0 0 12px rgba(244, 63, 94, 0.55);
417
+ }
418
+
419
+ .kawa-btn:disabled {
420
+ opacity: 0.4;
421
+ cursor: not-allowed;
422
+ }
423
+
424
+ /* Floating Auto / Skip Status Badges */
425
+ .kawa-mode-badge {
426
+ position: absolute;
427
+ top: 24px;
428
+ right: 24px;
429
+ padding: 6px 14px;
430
+ border-radius: 8px;
431
+ font-weight: 800;
432
+ font-size: 0.9rem;
433
+ letter-spacing: 0.08em;
434
+ text-transform: uppercase;
435
+ z-index: 30;
436
+ display: flex;
437
+ align-items: center;
438
+ gap: 6px;
439
+ pointer-events: none;
440
+ animation: kawa-badge-pulse 1.2s infinite ease-in-out;
441
+ box-shadow: 0 4px 20px rgba(0, 0, 0, 0.5);
442
+ }
443
+
444
+ .kawa-mode-badge.kawa-badge-auto {
445
+ background: rgba(14, 165, 233, 0.9);
446
+ color: #ffffff;
447
+ border: 1px solid rgba(255, 255, 255, 0.3);
448
+ }
449
+
450
+ .kawa-mode-badge.kawa-badge-skip {
451
+ background: rgba(244, 63, 94, 0.95);
452
+ color: #ffffff;
453
+ border: 1px solid rgba(255, 255, 255, 0.3);
454
+ }
455
+
456
+ @keyframes kawa-badge-pulse {
457
+ 0%, 100% { opacity: 0.85; transform: scale(1); }
458
+ 50% { opacity: 1; transform: scale(1.04); }
459
+ }
460
+
461
+ /* Settings Modal UI */
462
+ .kawa-settings-group {
463
+ display: flex;
464
+ flex-direction: column;
465
+ gap: 16px;
466
+ padding: 8px 0;
467
+ }
468
+
469
+ .kawa-setting-row {
470
+ display: flex;
471
+ flex-direction: column;
472
+ gap: 6px;
473
+ background: rgba(15, 23, 42, 0.6);
474
+ padding: 12px 16px;
475
+ border-radius: 8px;
476
+ border: 1px solid rgba(255, 255, 255, 0.08);
477
+ }
478
+
479
+ .kawa-setting-header {
480
+ display: flex;
481
+ justify-content: space-between;
482
+ align-items: center;
483
+ font-size: 0.95rem;
484
+ font-weight: 600;
485
+ color: #e2e8f0;
486
+ }
487
+
488
+ .kawa-setting-value {
489
+ font-size: 0.85rem;
490
+ color: var(--kawa-primary-accent);
491
+ font-weight: 700;
492
+ }
493
+
494
+ .kawa-input-field {
495
+ width: 100%;
496
+ box-sizing: border-box;
497
+ padding: 12px 14px;
498
+ border-radius: 10px;
499
+ border: 1px solid rgba(255, 255, 255, 0.18);
500
+ background: rgba(15, 23, 42, 0.9);
501
+ color: #f8fafc;
502
+ font-size: 1.05rem;
503
+ font-family: inherit;
504
+ outline: none;
505
+ }
506
+
507
+ .kawa-input-field:focus {
508
+ border-color: var(--kawa-primary-accent);
509
+ box-shadow: 0 0 0 3px rgba(244, 63, 94, 0.25);
510
+ }
511
+
512
+ .kawa-slider {
513
+ -webkit-appearance: none;
514
+ appearance: none;
515
+ width: 100%;
516
+ height: 6px;
517
+ border-radius: 3px;
518
+ background: #334155;
519
+ outline: none;
520
+ cursor: pointer;
521
+ }
522
+
523
+ .kawa-slider::-webkit-slider-thumb {
524
+ -webkit-appearance: none;
525
+ appearance: none;
526
+ width: 16px;
527
+ height: 16px;
528
+ border-radius: 50%;
529
+ background: var(--kawa-primary-accent);
530
+ cursor: pointer;
531
+ box-shadow: 0 0 6px rgba(244, 63, 94, 0.6);
532
+ transition: transform 0.1s ease;
533
+ }
534
+
535
+ .kawa-slider::-webkit-slider-thumb:hover {
536
+ transform: scale(1.2);
537
+ }
538
+
539
+ .kawa-slider::-moz-range-thumb {
540
+ width: 16px;
541
+ height: 16px;
542
+ border-radius: 50%;
543
+ background: var(--kawa-primary-accent);
544
+ cursor: pointer;
545
+ box-shadow: 0 0 6px rgba(244, 63, 94, 0.6);
546
+ }
547
+
548
+ /* Rich Text & Inline Tag Styles */
549
+ .kawa-bold { font-weight: 700; }
550
+ .kawa-italic { font-style: italic; }
551
+
552
+ /* Camera Shake & Screen Effects */
553
+ @keyframes kawa-vpunch-anim {
554
+ 0%, 100% { transform: translateY(0); }
555
+ 20% { transform: translateY(-16px); }
556
+ 40% { transform: translateY(16px); }
557
+ 60% { transform: translateY(-8px); }
558
+ 80% { transform: translateY(8px); }
559
+ }
560
+
561
+ @keyframes kawa-hpunch-anim {
562
+ 0%, 100% { transform: translateX(0); }
563
+ 20% { transform: translateX(-16px); }
564
+ 40% { transform: translateX(16px); }
565
+ 60% { transform: translateX(-8px); }
566
+ 80% { transform: translateX(8px); }
567
+ }
568
+
569
+ .kawa-vpunch {
570
+ animation: kawa-vpunch-anim 0.4s cubic-bezier(0.36, 0.07, 0.19, 0.97) both;
571
+ }
572
+
573
+ .kawa-hpunch {
574
+ animation: kawa-hpunch-anim 0.4s cubic-bezier(0.36, 0.07, 0.19, 0.97) both;
575
+ }
576
+
577
+ /* Modals (History, Save/Load, Settings) */
578
+ .kawa-modal-overlay {
579
+ position: absolute;
580
+ inset: 0;
581
+ background: rgba(0, 0, 0, 0.84);
582
+ backdrop-filter: blur(12px);
583
+ -webkit-backdrop-filter: blur(12px);
584
+ z-index: 100;
585
+ display: flex;
586
+ align-items: center;
587
+ justify-content: center;
588
+ pointer-events: auto;
589
+ animation: kawa-modal-fade 0.2s ease-out;
590
+ }
591
+
592
+ @keyframes kawa-modal-fade {
593
+ from { opacity: 0; }
594
+ to { opacity: 1; }
595
+ }
596
+
597
+ @keyframes kawa-modal-pop {
598
+ 0% { opacity: 0; transform: scale(0.94) translateY(12px); }
599
+ 100% { opacity: 1; transform: scale(1) translateY(0); }
600
+ }
601
+
602
+ .kawa-modal-card {
603
+ background: linear-gradient(180deg, rgba(20, 28, 48, 0.95) 0%, rgba(10, 15, 29, 0.98) 100%);
604
+ backdrop-filter: blur(24px);
605
+ -webkit-backdrop-filter: blur(24px);
606
+ border: 1px solid rgba(255, 255, 255, 0.14);
607
+ border-radius: 18px;
608
+ width: 90%;
609
+ max-width: 760px;
610
+ max-height: 85%;
611
+ display: flex;
612
+ flex-direction: column;
613
+ padding: 26px 32px;
614
+ box-shadow: 0 30px 70px -15px rgba(0, 0, 0, 0.85), 0 0 40px rgba(244, 63, 94, 0.14), inset 0 1px 0 rgba(255, 255, 255, 0.18);
615
+ animation: kawa-modal-pop 0.3s cubic-bezier(0.16, 1, 0.3, 1);
616
+ }
617
+
618
+ .kawa-modal-header {
619
+ display: flex;
620
+ justify-content: space-between;
621
+ align-items: center;
622
+ margin-bottom: 20px;
623
+ border-bottom: 1px solid rgba(255, 255, 255, 0.1);
624
+ padding-bottom: 14px;
625
+ }
626
+
627
+ .kawa-modal-title {
628
+ font-family: var(--kawa-font-heading);
629
+ font-size: 1.4rem;
630
+ font-weight: 800;
631
+ letter-spacing: -0.01em;
632
+ color: #ffffff;
633
+ display: flex;
634
+ align-items: center;
635
+ gap: 10px;
636
+ }
637
+
638
+ .kawa-modal-body {
639
+ overflow-y: auto;
640
+ flex: 1;
641
+ display: flex;
642
+ flex-direction: column;
643
+ gap: 14px;
644
+ padding-right: 6px;
645
+ scrollbar-width: thin;
646
+ scrollbar-color: rgba(244, 63, 94, 0.4) transparent;
647
+ }
648
+
649
+ .kawa-modal-body::-webkit-scrollbar {
650
+ width: 4px;
651
+ }
652
+ .kawa-modal-body::-webkit-scrollbar-thumb {
653
+ background: rgba(244, 63, 94, 0.4);
654
+ border-radius: 4px;
655
+ }
656
+
657
+ /* Slots Grid for Save/Load UI */
658
+ .kawa-slots-grid {
659
+ display: grid;
660
+ grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
661
+ gap: 16px;
662
+ padding: 4px 0;
663
+ }
664
+
665
+ .kawa-slot-card {
666
+ position: relative;
667
+ background: linear-gradient(150deg, rgba(30, 41, 59, 0.6) 0%, rgba(15, 23, 42, 0.85) 100%);
668
+ backdrop-filter: blur(16px);
669
+ -webkit-backdrop-filter: blur(16px);
670
+ border: 1px solid rgba(255, 255, 255, 0.08);
671
+ border-radius: 14px;
672
+ padding: 16px;
673
+ display: flex;
674
+ flex-direction: column;
675
+ justify-content: space-between;
676
+ min-height: 160px;
677
+ gap: 10px;
678
+ transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);
679
+ box-shadow: 0 4px 20px -2px rgba(0, 0, 0, 0.45), inset 0 1px 0 rgba(255, 255, 255, 0.06);
680
+ }
681
+
682
+ .kawa-slot-card:hover {
683
+ border-color: rgba(244, 63, 94, 0.45);
684
+ background: linear-gradient(150deg, rgba(35, 48, 72, 0.7) 0%, rgba(20, 28, 48, 0.9) 100%);
685
+ transform: translateY(-2px);
686
+ box-shadow: 0 12px 28px -4px rgba(0, 0, 0, 0.6), 0 0 24px -2px rgba(244, 63, 94, 0.22), inset 0 1px 0 rgba(255, 255, 255, 0.12);
687
+ }
688
+
689
+ .kawa-slot-card.kawa-slot-empty {
690
+ background: linear-gradient(150deg, rgba(15, 23, 42, 0.45) 0%, rgba(10, 15, 29, 0.6) 100%);
691
+ border: 1px dashed rgba(255, 255, 255, 0.12);
692
+ }
693
+
694
+ .kawa-slot-card.kawa-slot-empty:hover {
695
+ border-style: solid;
696
+ border-color: rgba(56, 189, 248, 0.45);
697
+ box-shadow: 0 10px 24px -4px rgba(0, 0, 0, 0.45), 0 0 20px -2px rgba(56, 189, 248, 0.18);
698
+ }
699
+
700
+ .kawa-slot-header {
701
+ display: flex;
702
+ justify-content: space-between;
703
+ align-items: center;
704
+ gap: 8px;
705
+ }
706
+
707
+ .kawa-slot-badge {
708
+ display: inline-flex;
709
+ align-items: center;
710
+ gap: 5px;
711
+ font-family: var(--kawa-font-heading);
712
+ font-size: 0.74rem;
713
+ font-weight: 700;
714
+ letter-spacing: 0.03em;
715
+ padding: 3px 9px;
716
+ border-radius: 9999px;
717
+ transition: all 0.2s ease;
718
+ line-height: 1;
719
+ }
720
+
721
+ .kawa-slot-badge svg {
722
+ width: 12px;
723
+ height: 12px;
724
+ flex-shrink: 0;
725
+ }
726
+
727
+ .kawa-slot-badge-occupied {
728
+ background: rgba(244, 63, 94, 0.15);
729
+ color: #fda4af;
730
+ border: 1px solid rgba(244, 63, 94, 0.35);
731
+ box-shadow: 0 0 12px rgba(244, 63, 94, 0.15);
732
+ }
733
+
734
+ .kawa-slot-badge-empty {
735
+ background: rgba(148, 163, 184, 0.08);
736
+ color: #94a3b8;
737
+ border: 1px solid rgba(148, 163, 184, 0.16);
738
+ }
739
+
740
+ .kawa-slot-time {
741
+ display: inline-flex;
742
+ align-items: center;
743
+ gap: 5px;
744
+ font-size: 0.72rem;
745
+ color: #94a3b8;
746
+ font-weight: 500;
747
+ font-variant-numeric: tabular-nums;
748
+ white-space: nowrap;
749
+ }
750
+
751
+ .kawa-slot-time svg {
752
+ width: 12px;
753
+ height: 12px;
754
+ color: #64748b;
755
+ flex-shrink: 0;
756
+ }
757
+
758
+ .kawa-slot-preview {
759
+ display: flex;
760
+ align-items: flex-start;
761
+ gap: 8px;
762
+ background: rgba(15, 23, 42, 0.5);
763
+ border: 1px solid rgba(255, 255, 255, 0.06);
764
+ border-radius: 8px;
765
+ padding: 8px 10px;
766
+ min-height: 52px;
767
+ box-sizing: border-box;
768
+ margin: 2px 0 6px 0;
769
+ }
770
+
771
+ .kawa-slot-preview-icon {
772
+ flex-shrink: 0;
773
+ color: var(--kawa-primary-accent);
774
+ opacity: 0.85;
775
+ margin-top: 2px;
776
+ display: flex;
777
+ align-items: center;
778
+ }
779
+
780
+ .kawa-slot-preview-icon svg {
781
+ width: 13px;
782
+ height: 13px;
783
+ }
784
+
785
+ .kawa-slot-preview-text {
786
+ font-size: 0.82rem;
787
+ color: #cbd5e1;
788
+ line-height: 1.45;
789
+ word-break: break-word;
790
+ display: -webkit-box;
791
+ -webkit-line-clamp: 2;
792
+ -webkit-box-orient: vertical;
793
+ overflow: hidden;
794
+ text-overflow: ellipsis;
795
+ margin: 0;
796
+ }
797
+
798
+ .kawa-slot-empty-content {
799
+ display: flex;
800
+ flex-direction: column;
801
+ align-items: center;
802
+ justify-content: center;
803
+ gap: 6px;
804
+ min-height: 52px;
805
+ margin: 2px 0 6px 0;
806
+ padding: 8px;
807
+ background: rgba(15, 23, 42, 0.22);
808
+ border: 1px dashed rgba(255, 255, 255, 0.07);
809
+ border-radius: 8px;
810
+ color: #64748b;
811
+ box-sizing: border-box;
812
+ }
813
+
814
+ .kawa-slot-empty-icon {
815
+ opacity: 0.5;
816
+ display: flex;
817
+ align-items: center;
818
+ justify-content: center;
819
+ }
820
+
821
+ .kawa-slot-empty-icon svg {
822
+ width: 14px;
823
+ height: 14px;
824
+ }
825
+
826
+ .kawa-slot-empty-text {
827
+ font-size: 0.8rem;
828
+ font-style: italic;
829
+ margin: 0;
830
+ }
831
+
832
+ .kawa-slot-actions {
833
+ display: flex;
834
+ align-items: center;
835
+ gap: 8px;
836
+ margin-top: auto;
837
+ }
838
+
839
+ .kawa-slot-btn {
840
+ flex: 1;
841
+ height: 36px;
842
+ padding: 0 14px;
843
+ border-radius: 8px;
844
+ border: none;
845
+ font-family: var(--kawa-font-heading);
846
+ font-size: 0.82rem;
847
+ font-weight: 700;
848
+ letter-spacing: 0.02em;
849
+ cursor: pointer;
850
+ transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
851
+ display: inline-flex;
852
+ align-items: center;
853
+ justify-content: center;
854
+ gap: 6px;
855
+ outline: none;
856
+ user-select: none;
857
+ }
858
+
859
+ .kawa-slot-btn svg {
860
+ width: 14px;
861
+ height: 14px;
862
+ flex-shrink: 0;
863
+ }
864
+
865
+ .kawa-slot-btn-save {
866
+ background: linear-gradient(135deg, #2563eb 0%, #1d4ed8 100%);
867
+ border: 1px solid rgba(96, 165, 250, 0.35);
868
+ color: #ffffff;
869
+ box-shadow: 0 2px 10px rgba(37, 99, 235, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.2);
870
+ }
871
+
872
+ .kawa-slot-btn-save:hover {
873
+ background: linear-gradient(135deg, #3b82f6 0%, #2563eb 100%);
874
+ border-color: rgba(147, 197, 253, 0.5);
875
+ box-shadow: 0 4px 14px rgba(37, 99, 235, 0.45), inset 0 1px 0 rgba(255, 255, 255, 0.3);
876
+ transform: translateY(-1px);
877
+ }
878
+
879
+ .kawa-slot-btn-save:active {
880
+ transform: translateY(0);
881
+ box-shadow: 0 1px 4px rgba(37, 99, 235, 0.3);
882
+ }
883
+
884
+ .kawa-slot-btn-load {
885
+ background: linear-gradient(135deg, #f43f5e 0%, #e11d48 100%);
886
+ border: 1px solid rgba(251, 113, 133, 0.4);
887
+ color: #ffffff;
888
+ box-shadow: 0 2px 10px rgba(244, 63, 94, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.2);
889
+ }
890
+
891
+ .kawa-slot-btn-load:hover {
892
+ background: linear-gradient(135deg, #fb7185 0%, #f43f5e 100%);
893
+ border-color: rgba(254, 205, 211, 0.5);
894
+ box-shadow: 0 4px 14px rgba(244, 63, 94, 0.45), inset 0 1px 0 rgba(255, 255, 255, 0.3);
895
+ transform: translateY(-1px);
896
+ }
897
+
898
+ .kawa-slot-btn-load:active {
899
+ transform: translateY(0);
900
+ box-shadow: 0 1px 4px rgba(244, 63, 94, 0.3);
901
+ }
902
+
903
+ .kawa-slot-btn-disabled {
904
+ background: rgba(30, 41, 59, 0.35);
905
+ color: #64748b;
906
+ border: 1px solid rgba(255, 255, 255, 0.05);
907
+ cursor: not-allowed;
908
+ box-shadow: none;
909
+ }
910
+
911
+ .kawa-slot-btn-link {
912
+ flex: 1 1 auto;
913
+ min-height: 36px;
914
+ background: rgba(56, 189, 248, 0.12);
915
+ color: #7dd3fc;
916
+ border: 1px solid rgba(56, 189, 248, 0.28);
917
+ border-radius: 8px;
918
+ cursor: pointer;
919
+ }
920
+
921
+ .kawa-slot-btn-link:hover {
922
+ background: rgba(56, 189, 248, 0.25);
923
+ color: #ffffff;
924
+ border-color: rgba(125, 211, 252, 0.55);
925
+ }
926
+
927
+ .kawa-slot-btn-del {
928
+ flex: 0 0 36px;
929
+ width: 36px;
930
+ height: 36px;
931
+ padding: 0;
932
+ display: inline-flex;
933
+ align-items: center;
934
+ justify-content: center;
935
+ background: rgba(239, 68, 68, 0.1);
936
+ color: #f87171;
937
+ border: 1px solid rgba(239, 68, 68, 0.22);
938
+ border-radius: 8px;
939
+ transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
940
+ cursor: pointer;
941
+ }
942
+
943
+ .kawa-slot-btn-del:hover {
944
+ background: rgba(239, 68, 68, 0.25);
945
+ color: #ffffff;
946
+ border-color: rgba(239, 68, 68, 0.55);
947
+ box-shadow: 0 2px 10px rgba(239, 68, 68, 0.3);
948
+ transform: translateY(-1px);
949
+ }
950
+
951
+ .kawa-slot-btn-del:active {
952
+ transform: translateY(0);
953
+ box-shadow: none;
954
+ }
955
+
956
+ .kawa-history-item {
957
+ padding: 12px 16px;
958
+ border-radius: 10px;
959
+ background: rgba(15, 23, 42, 0.65);
960
+ font-size: 0.95rem;
961
+ line-height: 1.6;
962
+ border-left: 3px solid var(--kawa-primary-accent);
963
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);
964
+ }
965
+
966
+ .kawa-history-speaker {
967
+ font-family: var(--kawa-font-heading);
968
+ font-weight: 800;
969
+ font-size: 0.9rem;
970
+ letter-spacing: 0.04em;
971
+ text-transform: uppercase;
972
+ color: var(--kawa-primary-accent);
973
+ margin-bottom: 4px;
974
+ }
975
+
976
+ /* Ending Card Overlay — centered with inset/margin so pop animation
977
+ does not fight translate(-50%, -50%) (that caused a bottom→top jump). */
978
+ .kawa-ending-card {
979
+ position: absolute;
980
+ inset: 0;
981
+ margin: auto;
982
+ width: max-content;
983
+ max-width: min(90%, 440px);
984
+ height: max-content;
985
+ background: linear-gradient(180deg, rgba(20, 28, 48, 0.95) 0%, rgba(10, 15, 29, 0.98) 100%);
986
+ backdrop-filter: blur(24px);
987
+ -webkit-backdrop-filter: blur(24px);
988
+ border: 1px solid rgba(244, 63, 94, 0.45);
989
+ border-radius: 20px;
990
+ padding: 36px 54px;
991
+ display: flex;
992
+ flex-direction: column;
993
+ align-items: center;
994
+ text-align: center;
995
+ box-shadow: 0 25px 60px rgba(0, 0, 0, 0.85), 0 0 45px rgba(244, 63, 94, 0.25);
996
+ z-index: 50;
997
+ animation: kawa-ending-pop 0.35s cubic-bezier(0.16, 1, 0.3, 1) both;
998
+ }
999
+
1000
+ @keyframes kawa-ending-pop {
1001
+ 0% {
1002
+ opacity: 0;
1003
+ transform: scale(0.96) translateY(10px);
1004
+ }
1005
+ 100% {
1006
+ opacity: 1;
1007
+ transform: scale(1) translateY(0);
1008
+ }
1009
+ }
1010
+
1011
+ .kawa-ending-title {
1012
+ font-family: var(--kawa-font-heading);
1013
+ font-size: 2.3rem;
1014
+ font-weight: 900;
1015
+ letter-spacing: -0.02em;
1016
+ background: linear-gradient(135deg, #ffffff 0%, #fda4af 50%, var(--kawa-primary-accent) 100%);
1017
+ -webkit-background-clip: text;
1018
+ -webkit-text-fill-color: transparent;
1019
+ margin-bottom: 6px;
1020
+ filter: drop-shadow(0 4px 14px rgba(244, 63, 94, 0.4));
1021
+ }
1022
+
1023
+ .kawa-ending-subtitle {
1024
+ font-size: 1.05rem;
1025
+ color: #cbd5e1;
1026
+ margin-bottom: 20px;
1027
+ font-weight: 500;
1028
+ }
1029
+
1030
+ /* Accessible Focus States */
1031
+ .kawa-btn:focus-visible,
1032
+ .kawa-choice-btn:focus-visible,
1033
+ .kawa-slot-btn:focus-visible,
1034
+ .kawa-dialogue-box:focus-visible,
1035
+ .kawa-slider:focus-visible {
1036
+ outline: 2px solid var(--kawa-primary-accent);
1037
+ outline-offset: 3px;
1038
+ }
1039
+
1040
+ /* Reduced Motion Support */
1041
+ @media (prefers-reduced-motion: reduce) {
1042
+ *,
1043
+ *::before,
1044
+ *::after {
1045
+ animation-duration: 0.01ms !important;
1046
+ animation-iteration-count: 1 !important;
1047
+ transition-duration: 0.01ms !important;
1048
+ scroll-behavior: auto !important;
1049
+ }
1050
+ }
1051
+
1052
+ /* ==========================================================================
1053
+ Main Menu / Start Screen Component
1054
+ ========================================================================== */
1055
+
1056
+ .kawa-main-menu {
1057
+ position: absolute;
1058
+ inset: 0;
1059
+ z-index: 40;
1060
+ display: flex;
1061
+ align-items: center;
1062
+ justify-content: center;
1063
+ background: var(--kawa-main-menu-bg);
1064
+ background-size: cover;
1065
+ background-position: center;
1066
+ animation: kawa-fade-in 0.4s ease-out;
1067
+ user-select: none;
1068
+ }
1069
+
1070
+ .kawa-main-menu-backdrop {
1071
+ position: absolute;
1072
+ inset: 0;
1073
+ background: radial-gradient(ellipse at center, rgba(15, 23, 42, 0.45) 0%, rgba(2, 6, 23, 0.88) 100%);
1074
+ backdrop-filter: blur(8px);
1075
+ -webkit-backdrop-filter: blur(8px);
1076
+ z-index: 1;
1077
+ overflow: hidden;
1078
+ }
1079
+
1080
+ /* Floating ambient light motes / sakura drift */
1081
+ .kawa-main-menu-backdrop::after {
1082
+ content: '';
1083
+ position: absolute;
1084
+ inset: -60%;
1085
+ background-image:
1086
+ radial-gradient(2px 2px at 20% 30%, rgba(253, 164, 175, 0.6), transparent),
1087
+ radial-gradient(3px 3px at 40% 70%, rgba(244, 63, 94, 0.5), transparent),
1088
+ radial-gradient(2px 2px at 60% 20%, rgba(255, 255, 255, 0.7), transparent),
1089
+ radial-gradient(3px 3px at 80% 60%, rgba(251, 113, 133, 0.5), transparent),
1090
+ radial-gradient(2px 2px at 90% 90%, rgba(244, 63, 94, 0.6), transparent);
1091
+ background-size: 550px 550px;
1092
+ animation: kawa-ambient-drift 28s linear infinite;
1093
+ opacity: 0.7;
1094
+ pointer-events: none;
1095
+ }
1096
+
1097
+ @keyframes kawa-ambient-drift {
1098
+ 0% { transform: translateY(0) rotate(0deg); }
1099
+ 100% { transform: translateY(550px) rotate(15deg); }
1100
+ }
1101
+
1102
+ .kawa-main-menu-content {
1103
+ position: relative;
1104
+ z-index: 2;
1105
+ display: flex;
1106
+ flex-direction: column;
1107
+ align-items: center;
1108
+ justify-content: center;
1109
+ width: 90%;
1110
+ max-width: 600px;
1111
+ max-height: 96%;
1112
+ height: auto;
1113
+ text-align: center;
1114
+ padding: 12px 16px;
1115
+ overflow-y: auto;
1116
+ scrollbar-width: thin;
1117
+ scrollbar-color: rgba(244, 63, 94, 0.4) transparent;
1118
+ }
1119
+
1120
+ .kawa-main-menu-content::-webkit-scrollbar {
1121
+ width: 4px;
1122
+ }
1123
+ .kawa-main-menu-content::-webkit-scrollbar-thumb {
1124
+ background: rgba(244, 63, 94, 0.4);
1125
+ border-radius: 4px;
1126
+ }
1127
+
1128
+ .kawa-main-menu-header {
1129
+ display: flex;
1130
+ flex-direction: column;
1131
+ align-items: center;
1132
+ gap: 4px;
1133
+ }
1134
+
1135
+ .kawa-main-menu-logo {
1136
+ max-height: clamp(36px, 7vh, 60px);
1137
+ width: auto;
1138
+ object-fit: contain;
1139
+ filter: drop-shadow(0 8px 18px rgba(244, 63, 94, 0.5));
1140
+ }
1141
+
1142
+ .kawa-main-menu-title {
1143
+ margin: 0;
1144
+ font-family: var(--kawa-font-heading);
1145
+ font-size: clamp(2rem, 5vh, 2.8rem);
1146
+ font-weight: 900;
1147
+ letter-spacing: -0.03em;
1148
+ line-height: 1.15;
1149
+ background: linear-gradient(135deg, #ffffff 0%, #fecdd3 35%, var(--kawa-primary-accent) 75%, #fda4af 100%);
1150
+ -webkit-background-clip: text;
1151
+ -webkit-text-fill-color: transparent;
1152
+ filter: drop-shadow(0 4px 14px rgba(244, 63, 94, 0.4));
1153
+ }
1154
+
1155
+ .kawa-main-menu-subtitle {
1156
+ font-size: clamp(0.8rem, 1.6vh, 0.95rem);
1157
+ font-weight: 600;
1158
+ color: #94a3b8;
1159
+ letter-spacing: 0.08em;
1160
+ text-transform: uppercase;
1161
+ }
1162
+
1163
+ .kawa-main-menu-nav {
1164
+ display: flex;
1165
+ flex-direction: column;
1166
+ gap: clamp(6px, 1.2vh, 10px);
1167
+ width: 100%;
1168
+ max-width: 310px;
1169
+ margin: clamp(10px, 1.8vh, 18px) 0;
1170
+ }
1171
+
1172
+ .kawa-main-menu-btn {
1173
+ display: inline-flex;
1174
+ align-items: center;
1175
+ justify-content: center;
1176
+ gap: 10px;
1177
+ background: var(--kawa-main-menu-btn-bg);
1178
+ backdrop-filter: blur(14px);
1179
+ -webkit-backdrop-filter: blur(14px);
1180
+ color: var(--kawa-main-menu-btn-color);
1181
+ font-family: var(--kawa-font-heading);
1182
+ font-size: clamp(0.92rem, 1.7vh, 1.08rem);
1183
+ font-weight: 700;
1184
+ letter-spacing: 0.02em;
1185
+ padding: var(--kawa-main-menu-btn-padding);
1186
+ border-radius: var(--kawa-main-menu-btn-radius);
1187
+ border: 1px solid rgba(255, 255, 255, 0.12);
1188
+ cursor: pointer;
1189
+ transition: all 0.25s cubic-bezier(0.34, 1.56, 0.64, 1);
1190
+ box-shadow: 0 4px 16px rgba(0, 0, 0, 0.4), inset 0 1px 0 rgba(255, 255, 255, 0.1);
1191
+ }
1192
+
1193
+ .kawa-main-menu-btn:hover:not(.disabled) {
1194
+ background: var(--kawa-main-menu-btn-hover-bg);
1195
+ transform: translateY(-2px) scale(1.03);
1196
+ border-color: rgba(255, 255, 255, 0.35);
1197
+ box-shadow: 0 10px 28px rgba(244, 63, 94, 0.55), 0 0 20px rgba(244, 63, 94, 0.3);
1198
+ }
1199
+
1200
+ .kawa-main-menu-btn:active:not(.disabled) {
1201
+ transform: translateY(1px) scale(0.99);
1202
+ }
1203
+
1204
+ .kawa-main-menu-btn.disabled {
1205
+ opacity: 0.4;
1206
+ cursor: not-allowed;
1207
+ filter: grayscale(0.8);
1208
+ pointer-events: none;
1209
+ }
1210
+
1211
+ .kawa-main-menu-btn:focus-visible {
1212
+ outline: 2px solid var(--kawa-primary-accent);
1213
+ outline-offset: 3px;
1214
+ }
1215
+
1216
+ .kawa-main-menu-footer {
1217
+ font-size: clamp(0.75rem, 1.4vh, 0.85rem);
1218
+ color: #64748b;
1219
+ font-weight: 500;
1220
+ }
1221
+
1222
+ /* About Modal Styling */
1223
+ .kawa-about-body {
1224
+ padding: 24px;
1225
+ }
1226
+
1227
+ .kawa-about-content {
1228
+ display: flex;
1229
+ flex-direction: column;
1230
+ align-items: center;
1231
+ text-align: center;
1232
+ }
1233
+
1234
+ .kawa-about-logo-badge {
1235
+ font-size: 2.8rem;
1236
+ margin-bottom: 8px;
1237
+ filter: drop-shadow(0 4px 12px rgba(244, 63, 94, 0.5));
1238
+ }
1239
+
1240
+ .kawa-about-game-title {
1241
+ font-family: var(--kawa-font-heading);
1242
+ font-size: 1.7rem;
1243
+ font-weight: 800;
1244
+ margin: 0 0 4px 0;
1245
+ color: #ffffff;
1246
+ }
1247
+
1248
+ .kawa-about-game-sub {
1249
+ font-size: 0.95rem;
1250
+ color: #94a3b8;
1251
+ margin: 0 0 16px 0;
1252
+ }
1253
+
1254
+ .kawa-about-divider {
1255
+ width: 60px;
1256
+ height: 2px;
1257
+ background: var(--kawa-primary-accent);
1258
+ border-radius: 2px;
1259
+ margin-bottom: 16px;
1260
+ box-shadow: 0 0 10px rgba(244, 63, 94, 0.6);
1261
+ }
1262
+
1263
+ .kawa-about-info {
1264
+ font-size: 0.95rem;
1265
+ line-height: 1.6;
1266
+ color: #cbd5e1;
1267
+ margin: 0 0 16px 0;
1268
+ }
1269
+
1270
+ .kawa-about-footer-text {
1271
+ font-size: 0.85rem;
1272
+ color: #64748b;
1273
+ font-weight: 500;
1274
+ }
1275
+
1276
+ /* ==========================================================================
1277
+ VFX & Atmospheric Particle Layer
1278
+ ========================================================================== */
1279
+
1280
+ .kawa-vfx-layer {
1281
+ position: absolute;
1282
+ inset: 0;
1283
+ pointer-events: none;
1284
+ z-index: 5;
1285
+ overflow: hidden;
1286
+ }
1287
+
1288
+ .kawa-vfx-canvas {
1289
+ position: absolute;
1290
+ inset: 0;
1291
+ width: 100%;
1292
+ height: 100%;
1293
+ pointer-events: none;
1294
+ }
1295
+
1296
+ .kawa-vfx-tint {
1297
+ position: absolute;
1298
+ inset: 0;
1299
+ pointer-events: none;
1300
+ transition: background-color 0.5s ease-in-out;
1301
+ mix-blend-mode: multiply;
1302
+ }
1303
+
1304
+ .kawa-vfx-fog {
1305
+ position: absolute;
1306
+ inset: -50%;
1307
+ pointer-events: none;
1308
+ background: radial-gradient(circle at 50% 50%, rgba(255, 255, 255, 0.15) 0%, rgba(200, 220, 240, 0.05) 50%, transparent 80%);
1309
+ filter: blur(20px);
1310
+ animation: kawa-fog-drift 20s ease-in-out infinite alternate;
1311
+ }
1312
+
1313
+ @keyframes kawa-fog-drift {
1314
+ 0% { transform: translate(-5%, -5%) scale(1); }
1315
+ 50% { transform: translate(5%, 3%) scale(1.1); }
1316
+ 100% { transform: translate(-3%, 5%) scale(1); }
1317
+ }
1318
+
1319
+ /* ==========================================================================
1320
+ Fullscreen CG Layer
1321
+ ========================================================================== */
1322
+
1323
+ .kawa-cg-layer {
1324
+ position: absolute;
1325
+ inset: 0;
1326
+ z-index: 15;
1327
+ background-size: cover;
1328
+ background-position: center;
1329
+ background-repeat: no-repeat;
1330
+ animation: kawa-fade-in 0.5s cubic-bezier(0.16, 1, 0.3, 1);
1331
+ }
1332
+
1333
+ /* ==========================================================================
1334
+ Camera Shake, Flash & Stage Directives
1335
+ ========================================================================== */
1336
+
1337
+ .kawa-shake {
1338
+ animation: kawa-shake-anim 0.5s cubic-bezier(0.36, 0.07, 0.19, 0.97) both;
1339
+ }
1340
+
1341
+ .kawa-vpunch {
1342
+ animation: kawa-vpunch-anim 0.4s cubic-bezier(0.36, 0.07, 0.19, 0.97) both;
1343
+ }
1344
+
1345
+ .kawa-hpunch {
1346
+ animation: kawa-hpunch-anim 0.4s cubic-bezier(0.36, 0.07, 0.19, 0.97) both;
1347
+ }
1348
+
1349
+ @keyframes kawa-shake-anim {
1350
+ 10%, 90% { transform: translate3d(-3px, -2px, 0); }
1351
+ 20%, 80% { transform: translate3d(5px, 4px, 0); }
1352
+ 30%, 50%, 70% { transform: translate3d(-6px, -4px, 0); }
1353
+ 40%, 60% { transform: translate3d(6px, 3px, 0); }
1354
+ }
1355
+
1356
+ @keyframes kawa-vpunch-anim {
1357
+ 0%, 100% { transform: translateY(0); }
1358
+ 20%, 60% { transform: translateY(-16px); }
1359
+ 40%, 80% { transform: translateY(14px); }
1360
+ }
1361
+
1362
+ @keyframes kawa-hpunch-anim {
1363
+ 0%, 100% { transform: translateX(0); }
1364
+ 20%, 60% { transform: translateX(-18px); }
1365
+ 40%, 80% { transform: translateX(18px); }
1366
+ }
1367
+
1368
+ .kawa-flash-overlay {
1369
+ position: absolute;
1370
+ inset: 0;
1371
+ background: #ffffff;
1372
+ z-index: 50;
1373
+ pointer-events: none;
1374
+ animation: kawa-flash-anim 0.6s ease-out forwards;
1375
+ }
1376
+
1377
+ @keyframes kawa-flash-anim {
1378
+ 0% { opacity: 0.95; }
1379
+ 100% { opacity: 0; }
1380
+ }
1381
+
1382
+ /* ==========================================================================
1383
+ Character Sprite Animations
1384
+ ========================================================================== */
1385
+
1386
+ .kawa-anim-bounce {
1387
+ animation: kawa-sprite-bounce 0.6s cubic-bezier(0.34, 1.56, 0.64, 1) both;
1388
+ }
1389
+
1390
+ .kawa-anim-shake {
1391
+ animation: kawa-sprite-shake 0.4s ease-in-out both;
1392
+ }
1393
+
1394
+ .kawa-anim-nod {
1395
+ animation: kawa-sprite-nod 0.5s ease-in-out both;
1396
+ }
1397
+
1398
+ .kawa-anim-slideleft {
1399
+ animation: kawa-sprite-slide-left 0.5s cubic-bezier(0.16, 1, 0.3, 1) both;
1400
+ }
1401
+
1402
+ .kawa-anim-slideright {
1403
+ animation: kawa-sprite-slide-right 0.5s cubic-bezier(0.16, 1, 0.3, 1) both;
1404
+ }
1405
+
1406
+ .kawa-anim-dissolve {
1407
+ animation: kawa-fade-in 0.6s ease-out both;
1408
+ }
1409
+
1410
+ @keyframes kawa-sprite-bounce {
1411
+ 0%, 100% { transform: translateY(0); }
1412
+ 30% { transform: translateY(-30px) scaleY(1.04); }
1413
+ 60% { transform: translateY(8px) scaleY(0.96); }
1414
+ 80% { transform: translateY(-10px) scaleY(1.01); }
1415
+ }
1416
+
1417
+ @keyframes kawa-sprite-shake {
1418
+ 0%, 100% { transform: translateX(0); }
1419
+ 20% { transform: translateX(-12px) rotate(-1deg); }
1420
+ 40% { transform: translateX(12px) rotate(1deg); }
1421
+ 60% { transform: translateX(-8px) rotate(-0.5deg); }
1422
+ 80% { transform: translateX(8px) rotate(0.5deg); }
1423
+ }
1424
+
1425
+ @keyframes kawa-sprite-nod {
1426
+ 0%, 100% { transform: translateY(0) rotate(0deg); }
1427
+ 40% { transform: translateY(18px) rotate(2deg); }
1428
+ 70% { transform: translateY(-4px) rotate(-0.5deg); }
1429
+ }
1430
+
1431
+ @keyframes kawa-sprite-slide-left {
1432
+ 0% { transform: translateX(60px); opacity: 0; }
1433
+ 100% { transform: translateX(0); opacity: 1; }
1434
+ }
1435
+
1436
+ @keyframes kawa-sprite-slide-right {
1437
+ 0% { transform: translateX(-60px); opacity: 0; }
1438
+ 100% { transform: translateX(0); opacity: 1; }
1439
+ }
1440
+
1441
+ /* ==========================================================================
1442
+ CG Gallery Modal
1443
+ ========================================================================== */
1444
+
1445
+ .kawa-gallery-body {
1446
+ padding: 20px;
1447
+ max-height: 70vh;
1448
+ overflow-y: auto;
1449
+ }
1450
+
1451
+ .kawa-gallery-grid {
1452
+ display: grid;
1453
+ grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
1454
+ gap: 16px;
1455
+ }
1456
+
1457
+ .kawa-gallery-card {
1458
+ display: flex;
1459
+ flex-direction: column;
1460
+ background: rgba(15, 23, 42, 0.6);
1461
+ border: 1px solid rgba(255, 255, 255, 0.08);
1462
+ border-radius: 12px;
1463
+ overflow: hidden;
1464
+ transition: all 0.25s cubic-bezier(0.34, 1.56, 0.64, 1);
1465
+ box-shadow: 0 4px 16px rgba(0, 0, 0, 0.3);
1466
+ font: inherit;
1467
+ color: inherit;
1468
+ text-align: left;
1469
+ padding: 0;
1470
+ width: 100%;
1471
+ }
1472
+
1473
+ .kawa-gallery-card.unlocked {
1474
+ cursor: pointer;
1475
+ }
1476
+
1477
+ .kawa-gallery-card.unlocked:hover {
1478
+ transform: translateY(-4px) scale(1.02);
1479
+ border-color: rgba(244, 63, 94, 0.5);
1480
+ box-shadow: 0 12px 28px rgba(244, 63, 94, 0.35);
1481
+ }
1482
+
1483
+ .kawa-gallery-thumb-container {
1484
+ position: relative;
1485
+ width: 100%;
1486
+ aspect-ratio: 16 / 9;
1487
+ background: #020617;
1488
+ overflow: hidden;
1489
+ display: flex;
1490
+ align-items: center;
1491
+ justify-content: center;
1492
+ }
1493
+
1494
+ .kawa-gallery-thumb {
1495
+ width: 100%;
1496
+ height: 100%;
1497
+ object-fit: cover;
1498
+ transition: transform 0.4s ease;
1499
+ }
1500
+
1501
+ .kawa-gallery-card.unlocked:hover .kawa-gallery-thumb {
1502
+ transform: scale(1.08);
1503
+ }
1504
+
1505
+ .kawa-gallery-locked {
1506
+ display: flex;
1507
+ flex-direction: column;
1508
+ align-items: center;
1509
+ justify-content: center;
1510
+ gap: 6px;
1511
+ color: #64748b;
1512
+ font-size: 0.8rem;
1513
+ font-weight: 600;
1514
+ text-transform: uppercase;
1515
+ letter-spacing: 0.05em;
1516
+ }
1517
+
1518
+ .kawa-gallery-lock-icon svg {
1519
+ width: 24px;
1520
+ height: 24px;
1521
+ fill: currentColor;
1522
+ }
1523
+
1524
+ .kawa-gallery-info {
1525
+ padding: 10px 12px;
1526
+ display: flex;
1527
+ flex-direction: column;
1528
+ gap: 2px;
1529
+ }
1530
+
1531
+ .kawa-gallery-title {
1532
+ font-family: var(--kawa-font-heading);
1533
+ font-size: 0.9rem;
1534
+ font-weight: 700;
1535
+ color: #ffffff;
1536
+ white-space: nowrap;
1537
+ overflow: hidden;
1538
+ text-overflow: ellipsis;
1539
+ }
1540
+
1541
+ .kawa-gallery-desc {
1542
+ font-size: 0.75rem;
1543
+ color: #94a3b8;
1544
+ line-height: 1.3;
1545
+ }
1546
+
1547
+ .kawa-gallery-empty {
1548
+ text-align: center;
1549
+ padding: 40px 20px;
1550
+ color: #94a3b8;
1551
+ font-size: 1rem;
1552
+ }
1553
+
1554
+ .kawa-gallery-lightbox {
1555
+ position: fixed;
1556
+ inset: 0;
1557
+ z-index: 100;
1558
+ background: rgba(2, 6, 23, 0.94);
1559
+ backdrop-filter: blur(12px);
1560
+ display: flex;
1561
+ align-items: center;
1562
+ justify-content: center;
1563
+ padding: 24px;
1564
+ animation: kawa-fade-in 0.25s ease-out;
1565
+ cursor: pointer;
1566
+ }
1567
+
1568
+ .kawa-gallery-lightbox-content {
1569
+ position: relative;
1570
+ display: flex;
1571
+ flex-direction: column;
1572
+ align-items: center;
1573
+ justify-content: center;
1574
+ max-width: 95vw;
1575
+ max-height: 92vh;
1576
+ cursor: default;
1577
+ }
1578
+
1579
+ .kawa-gallery-lightbox-img {
1580
+ max-width: 90vw;
1581
+ max-height: 82vh;
1582
+ width: auto;
1583
+ height: auto;
1584
+ object-fit: contain;
1585
+ border-radius: 8px;
1586
+ box-shadow: 0 20px 50px rgba(0, 0, 0, 0.85);
1587
+ cursor: default;
1588
+ animation: kawa-pop-in 0.3s cubic-bezier(0.34, 1.56, 0.64, 1);
1589
+ }
1590
+
1591
+ .kawa-gallery-caption {
1592
+ margin-top: 12px;
1593
+ font-family: var(--kawa-font-heading);
1594
+ font-size: 1.1rem;
1595
+ font-weight: 700;
1596
+ color: #ffffff;
1597
+ text-shadow: 0 2px 8px rgba(0, 0, 0, 0.8);
1598
+ letter-spacing: 0.03em;
1599
+ }
1600
+
1601
+ .kawa-gallery-lightbox-close {
1602
+ position: absolute;
1603
+ top: -18px;
1604
+ right: -18px;
1605
+ background: rgba(15, 23, 42, 0.85);
1606
+ border: 1px solid rgba(255, 255, 255, 0.25);
1607
+ color: #ffffff;
1608
+ width: 40px;
1609
+ height: 40px;
1610
+ border-radius: 50%;
1611
+ display: flex;
1612
+ align-items: center;
1613
+ justify-content: center;
1614
+ cursor: pointer;
1615
+ transition: all 0.2s ease;
1616
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.5);
1617
+ }
1618
+
1619
+ .kawa-gallery-lightbox-close:hover {
1620
+ background: var(--kawa-primary-accent);
1621
+ transform: scale(1.1);
1622
+ }
1623
+
1624
+ /* ==========================================================================
1625
+ Asset Fallback & Sprite Error Handling
1626
+ ========================================================================== */
1627
+
1628
+ .kawa-sprite-placeholder {
1629
+ display: flex;
1630
+ flex-direction: column;
1631
+ align-items: center;
1632
+ justify-content: center;
1633
+ width: 140px;
1634
+ height: 240px;
1635
+ background: rgba(15, 23, 42, 0.7);
1636
+ border: 2px dashed rgba(244, 63, 94, 0.4);
1637
+ border-radius: 16px;
1638
+ backdrop-filter: blur(8px);
1639
+ color: #f8fafc;
1640
+ gap: 8px;
1641
+ animation: kawa-pop-in 0.3s cubic-bezier(0.34, 1.56, 0.64, 1);
1642
+ }
1643
+
1644
+ .kawa-sprite-placeholder-icon {
1645
+ font-size: 2.5rem;
1646
+ opacity: 0.8;
1647
+ }
1648
+
1649
+ .kawa-sprite-placeholder-name {
1650
+ font-family: var(--kawa-font-heading);
1651
+ font-size: 0.85rem;
1652
+ font-weight: 700;
1653
+ color: var(--kawa-primary-accent);
1654
+ text-align: center;
1655
+ text-transform: capitalize;
1656
+ }
1657
+
1658
+ /* ==========================================================================
1659
+ In-Game Error Boundary Card
1660
+ ========================================================================== */
1661
+
1662
+ .kawa-error-toast {
1663
+ position: absolute;
1664
+ top: 24px;
1665
+ left: 50%;
1666
+ transform: translateX(-50%);
1667
+ z-index: 1000;
1668
+ display: flex;
1669
+ align-items: center;
1670
+ gap: 12px;
1671
+ padding: 12px 20px;
1672
+ background: rgba(15, 23, 42, 0.92);
1673
+ border: 1px solid rgba(244, 63, 94, 0.6);
1674
+ border-radius: 12px;
1675
+ color: #ffffff;
1676
+ font-size: 0.9rem;
1677
+ box-shadow: 0 10px 30px rgba(0, 0, 0, 0.6), 0 0 20px rgba(244, 63, 94, 0.3);
1678
+ backdrop-filter: blur(12px);
1679
+ animation: kawa-slide-up 0.3s ease-out;
1680
+ }
1681
+
1682
+ .kawa-error-toast-msg {
1683
+ font-family: var(--kawa-font-body);
1684
+ font-weight: 600;
1685
+ }
1686
+
1687
+ .kawa-error-toast-close {
1688
+ background: transparent;
1689
+ border: none;
1690
+ color: #94a3b8;
1691
+ cursor: pointer;
1692
+ padding: 4px;
1693
+ display: flex;
1694
+ align-items: center;
1695
+ justify-content: center;
1696
+ }
1697
+
1698
+ .kawa-error-toast-close:hover {
1699
+ color: #ffffff;
1700
+ }
1701
+
1702
+ /* ── Theme tokens (`theme "noir"` → data-kawa-theme="noir") ── */
1703
+ .kawa-root[data-kawa-theme='noir'] {
1704
+ --kawa-primary-accent: #e2e8f0;
1705
+ --kawa-primary-glow: rgba(226, 232, 240, 0.35);
1706
+ --kawa-secondary-accent: #94a3b8;
1707
+ --kawa-dialogue-bg: linear-gradient(180deg, rgba(8, 8, 12, 0.92) 0%, rgba(2, 2, 6, 0.96) 100%);
1708
+ --kawa-dialogue-border: rgba(226, 232, 240, 0.22);
1709
+ --kawa-speaker-bg: linear-gradient(135deg, #334155 0%, #1e293b 100%);
1710
+ --kawa-choice-hover-bg: linear-gradient(135deg, #475569 0%, #1e293b 100%);
1711
+ --kawa-main-menu-btn-hover-bg: linear-gradient(135deg, #475569 0%, #1e293b 100%);
1712
+ }
1713
+
1714
+ .kawa-root[data-kawa-theme='sakura'] {
1715
+ --kawa-primary-accent: #fb7185;
1716
+ --kawa-primary-glow: rgba(251, 113, 133, 0.4);
1717
+ --kawa-secondary-accent: #fda4af;
1718
+ --kawa-dialogue-border: rgba(251, 113, 133, 0.4);
1719
+ --kawa-speaker-bg: linear-gradient(135deg, #fb7185 0%, #e11d48 100%);
1720
+ }
1721
+
1722
+ .kawa-root[data-kawa-theme='ocean'] {
1723
+ --kawa-primary-accent: #38bdf8;
1724
+ --kawa-primary-glow: rgba(56, 189, 248, 0.4);
1725
+ --kawa-secondary-accent: #7dd3fc;
1726
+ --kawa-dialogue-bg: linear-gradient(180deg, rgba(8, 28, 48, 0.9) 0%, rgba(2, 12, 28, 0.96) 100%);
1727
+ --kawa-dialogue-border: rgba(56, 189, 248, 0.35);
1728
+ --kawa-speaker-bg: linear-gradient(135deg, #0ea5e9 0%, #0369a1 100%);
1729
+ --kawa-choice-hover-bg: linear-gradient(135deg, #0284c7 0%, #0c4a6e 100%);
1730
+ }
1731
+
1732
+ .kawa-root[data-kawa-theme='dusk'] {
1733
+ --kawa-primary-accent: #fbbf24;
1734
+ --kawa-primary-glow: rgba(251, 191, 36, 0.35);
1735
+ --kawa-secondary-accent: #fdba74;
1736
+ --kawa-dialogue-bg: linear-gradient(180deg, rgba(42, 18, 12, 0.92) 0%, rgba(18, 8, 6, 0.97) 100%);
1737
+ --kawa-dialogue-border: rgba(251, 191, 36, 0.3);
1738
+ --kawa-speaker-bg: linear-gradient(135deg, #f59e0b 0%, #c2410c 100%);
1739
+ --kawa-choice-hover-bg: linear-gradient(135deg, #ea580c 0%, #7c2d12 100%);
1740
+ }
1741
+
1742
+ /* ── Style hooks (`style dialogue glass` → .kawa-style-dialogue-glass) ── */
1743
+ .kawa-root.kawa-style-dialogue-glass .kawa-dialogue-box {
1744
+ background: linear-gradient(180deg, rgba(255, 255, 255, 0.12) 0%, rgba(15, 23, 42, 0.55) 100%);
1745
+ backdrop-filter: blur(14px);
1746
+ -webkit-backdrop-filter: blur(14px);
1747
+ border-color: rgba(255, 255, 255, 0.28);
1748
+ }
1749
+
1750
+ .kawa-root.kawa-style-dialogue-solid .kawa-dialogue-box {
1751
+ background: #0f172a;
1752
+ backdrop-filter: none;
1753
+ -webkit-backdrop-filter: none;
1754
+ border-color: rgba(248, 250, 252, 0.18);
1755
+ box-shadow: 0 18px 40px rgba(0, 0, 0, 0.55);
1756
+ }
1757
+
1758
+ .kawa-root.kawa-style-dialogue-minimal .kawa-dialogue-box {
1759
+ background: transparent;
1760
+ border: none;
1761
+ box-shadow: none;
1762
+ backdrop-filter: none;
1763
+ -webkit-backdrop-filter: none;
1764
+ }
1765
+
1766
+ .kawa-root.kawa-style-dialogue-minimal .kawa-speaker-name {
1767
+ background: rgba(15, 23, 42, 0.75);
1768
+ }
1769
+
1770
+ .kawa-root.kawa-style-stage-dim .kawa-stage {
1771
+ filter: brightness(0.85) saturate(0.9);
1772
+ }
1773
+
1774
+ .kawa-root.kawa-style-stage-vignette .kawa-stage::after {
1775
+ content: '';
1776
+ position: absolute;
1777
+ inset: 0;
1778
+ pointer-events: none;
1779
+ z-index: 6;
1780
+ background: radial-gradient(ellipse at center, transparent 45%, rgba(0, 0, 0, 0.55) 100%);
1781
+ }
1782
+
1783
+ .kawa-root.kawa-style-choices-pill .kawa-choice-btn {
1784
+ border-radius: 999px;
1785
+ }
1786
+
1787
+ .kawa-root.kawa-style-choices-card .kawa-choice-btn {
1788
+ border-radius: 14px;
1789
+ min-width: min(420px, 86vw);
1790
+ text-align: left;
1791
+ padding: 0.9rem 1.15rem;
1792
+ box-shadow: 0 10px 28px rgba(0, 0, 0, 0.35);
1793
+ }
1794
+
1795
+ .kawa-root.kawa-style-choices-underline .kawa-choice-btn {
1796
+ background: transparent;
1797
+ border: none;
1798
+ border-bottom: 2px solid rgba(255, 255, 255, 0.35);
1799
+ border-radius: 0;
1800
+ box-shadow: none;
1801
+ }
1802
+
1803
+ .kawa-root.kawa-style-choices-underline .kawa-choice-btn:hover,
1804
+ .kawa-root.kawa-style-choices-underline .kawa-choice-btn:focus-visible {
1805
+ border-bottom-color: var(--kawa-primary-accent);
1806
+ transform: translateY(-1px);
1807
+ }
1808
+
1809
+ .kawa-root.kawa-style-quickmenu-hidden .kawa-quick-menu {
1810
+ display: none !important;
1811
+ }
1812
+
1813
+ /* Embed / iframe compact chrome (`?embed=1`) */
1814
+ .kawa-root.kawa-embed .kawa-quick-menu {
1815
+ display: none !important;
1816
+ }
1817
+
1818
+ .kawa-root.kawa-embed .kawa-dialogue-box {
1819
+ max-width: min(920px, 94%);
1820
+ }
1821
+
1822
+ .kawa-continue-link-btn {
1823
+ width: 100%;
1824
+ margin-bottom: 12px;
1825
+ justify-content: center;
1826
+ }
1827
+
1828
+ /* ── Hotspots (`hotspot id x y w h jump label`) ── */
1829
+ .kawa-hotspot-layer {
1830
+ position: absolute;
1831
+ inset: 0;
1832
+ z-index: 28;
1833
+ pointer-events: none;
1834
+ }
1835
+
1836
+ .kawa-hotspot {
1837
+ position: absolute;
1838
+ margin: 0;
1839
+ padding: 0;
1840
+ border: 2px solid rgba(248, 250, 252, 0.55);
1841
+ border-radius: 10px;
1842
+ background: rgba(56, 189, 248, 0.12);
1843
+ box-shadow: 0 0 0 1px rgba(15, 23, 42, 0.35), 0 0 18px rgba(56, 189, 248, 0.25);
1844
+ cursor: pointer;
1845
+ pointer-events: auto;
1846
+ transition: background 160ms ease, border-color 160ms ease, transform 160ms ease;
1847
+ }
1848
+
1849
+ .kawa-hotspot:hover,
1850
+ .kawa-hotspot:focus-visible {
1851
+ background: rgba(56, 189, 248, 0.28);
1852
+ border-color: rgba(255, 255, 255, 0.9);
1853
+ outline: none;
1854
+ transform: scale(1.02);
1855
+ }
1856
+
1857
+ /* ── Mobile / touch polish ── */
1858
+ .kawa-root {
1859
+ touch-action: manipulation;
1860
+ -webkit-tap-highlight-color: transparent;
1861
+ padding: env(safe-area-inset-top) env(safe-area-inset-right) env(safe-area-inset-bottom) env(safe-area-inset-left);
1862
+ box-sizing: border-box;
1863
+ }
1864
+
1865
+ @media (max-width: 768px), (pointer: coarse) {
1866
+ .kawa-choice-btn {
1867
+ min-height: 48px;
1868
+ padding: 0.85rem 1.1rem;
1869
+ font-size: 1rem;
1870
+ }
1871
+
1872
+ .kawa-quick-menu {
1873
+ gap: 4px;
1874
+ padding: 6px 8px;
1875
+ max-width: 100%;
1876
+ flex-wrap: wrap;
1877
+ justify-content: center;
1878
+ align-self: stretch;
1879
+ border-radius: 16px;
1880
+ }
1881
+
1882
+ .kawa-quick-menu .kawa-btn {
1883
+ min-height: 44px;
1884
+ min-width: 44px;
1885
+ padding: 8px 10px;
1886
+ font-size: 0.78rem;
1887
+ }
1888
+
1889
+ .kawa-quick-menu .kawa-btn span {
1890
+ display: none;
1891
+ }
1892
+
1893
+ .kawa-dialogue-box {
1894
+ padding-bottom: max(12px, env(safe-area-inset-bottom));
1895
+ }
1896
+
1897
+ .kawa-hotspot {
1898
+ min-width: 44px;
1899
+ min-height: 44px;
1900
+ }
1901
+
1902
+ .kawa-main-menu-btn {
1903
+ min-height: 48px;
1904
+ }
1905
+
1906
+ .kawa-slot-actions {
1907
+ flex-wrap: wrap;
1908
+ }
1909
+
1910
+ .kawa-slot-btn {
1911
+ min-height: 44px;
1912
+ }
1913
+ }
1914
+
1915
+
1916
+
1917
+ /* -- CSS-first animate (nimate yumia with slide-in) -- */
1918
+ @keyframes kawa-css-slide-in {
1919
+ from { opacity: 0; transform: translateX(-48px); }
1920
+ to { opacity: 1; transform: translateX(0); }
1921
+ }
1922
+ @keyframes kawa-css-slide-out {
1923
+ from { opacity: 1; transform: translateX(0); }
1924
+ to { opacity: 0; transform: translateX(48px); }
1925
+ }
1926
+ @keyframes kawa-css-fade-in {
1927
+ from { opacity: 0; }
1928
+ to { opacity: 1; }
1929
+ }
1930
+ @keyframes kawa-css-fade-out {
1931
+ from { opacity: 1; }
1932
+ to { opacity: 0; }
1933
+ }
1934
+ @keyframes kawa-css-pop {
1935
+ 0% { opacity: 0; transform: scale(0.86); }
1936
+ 70% { transform: scale(1.04); }
1937
+ 100% { opacity: 1; transform: scale(1); }
1938
+ }
1939
+ @keyframes kawa-css-pulse {
1940
+ 0%, 100% { transform: scale(1); }
1941
+ 50% { transform: scale(1.05); }
1942
+ }
1943
+
1944
+ .kawa-sprite.kawa-css-anim-slide-in { animation: kawa-css-slide-in 400ms ease both; }
1945
+ .kawa-sprite.kawa-css-anim-slide-out { animation: kawa-css-slide-out 400ms ease both; }
1946
+ .kawa-sprite.kawa-css-anim-fade-in { animation: kawa-css-fade-in 400ms ease both; }
1947
+ .kawa-sprite.kawa-css-anim-fade-out { animation: kawa-css-fade-out 400ms ease both; }
1948
+ .kawa-sprite.kawa-css-anim-pop { animation: kawa-css-pop 420ms cubic-bezier(0.34, 1.4, 0.64, 1) both; }
1949
+ .kawa-sprite.kawa-css-anim-pulse { animation: kawa-css-pulse 700ms ease-in-out 2; }
1950
+
1951
+ .kawa-characters {
1952
+ position: absolute;
1953
+ inset: 0;
1954
+ z-index: 10;
1955
+ pointer-events: none;
1956
+ }
1957
+
1958
+ .kawa-sprite {
1959
+ position: absolute;
1960
+ bottom: 0;
1961
+ z-index: 10;
1962
+ pointer-events: none;
1963
+ }
1964
+
1965
+ .kawa-achievements-list {
1966
+ display: flex;
1967
+ flex-direction: column;
1968
+ gap: 10px;
1969
+ max-height: min(50vh, 420px);
1970
+ overflow: auto;
1971
+ }
1972
+ .kawa-achievement-row {
1973
+ border: 1px solid rgba(255,255,255,0.1);
1974
+ border-radius: 12px;
1975
+ padding: 12px 14px;
1976
+ background: rgba(15, 23, 42, 0.55);
1977
+ }
1978
+ .kawa-achievement-row.locked {
1979
+ opacity: 0.55;
1980
+ filter: grayscale(0.4);
1981
+ }
1982
+ .kawa-achievement-title {
1983
+ font-weight: 700;
1984
+ color: #f8fafc;
1985
+ margin-bottom: 4px;
1986
+ }
1987
+ .kawa-achievement-desc {
1988
+ color: #94a3b8;
1989
+ font-size: 0.9rem;
1990
+ }
1991
+ .kawa-achievement-time {
1992
+ margin-top: 6px;
1993
+ font-size: 0.75rem;
1994
+ color: #64748b;
1995
+ }