@kawaijs/renderer-dom 0.1.13 → 0.1.15

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.
package/src/theme.css CHANGED
@@ -140,16 +140,25 @@ body.kawa-fullscreen {
140
140
  transition: opacity 0.85s cubic-bezier(0.4, 0, 0.2, 1);
141
141
  }
142
142
 
143
- /* Directional wipe transitions */
143
+ /* Directional wipe & push & zoom transitions */
144
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);
145
+ .kawa-background[data-transition="wiperight"] .kawa-bg-layer,
146
+ .kawa-background[data-transition="wipeup"] .kawa-bg-layer,
147
+ .kawa-background[data-transition="wipedown"] .kawa-bg-layer,
148
+ .kawa-background[data-transition="circlewipe"] .kawa-bg-layer,
149
+ .kawa-background[data-transition="iris"] .kawa-bg-layer,
150
+ .kawa-background[data-transition="pushleft"] .kawa-bg-layer,
151
+ .kawa-background[data-transition="pushright"] .kawa-bg-layer,
152
+ .kawa-background[data-transition="pushup"] .kawa-bg-layer,
153
+ .kawa-background[data-transition="pushdown"] .kawa-bg-layer,
154
+ .kawa-background[data-transition="zoom"] .kawa-bg-layer,
155
+ .kawa-background[data-transition="blur"] .kawa-bg-layer {
156
+ transition: opacity 0.55s ease, clip-path 0.55s cubic-bezier(0.4, 0, 0.2, 1), transform 0.55s cubic-bezier(0.4, 0, 0.2, 1), filter 0.55s ease;
147
157
  }
148
158
 
149
159
  .kawa-bg-layer.kawa-wipe-from-left {
150
160
  clip-path: inset(0 100% 0 0);
151
161
  }
152
-
153
162
  .kawa-bg-layer.kawa-wipe-from-left.active {
154
163
  clip-path: inset(0 0 0 0);
155
164
  }
@@ -157,11 +166,205 @@ body.kawa-fullscreen {
157
166
  .kawa-bg-layer.kawa-wipe-from-right {
158
167
  clip-path: inset(0 0 0 100%);
159
168
  }
160
-
161
169
  .kawa-bg-layer.kawa-wipe-from-right.active {
162
170
  clip-path: inset(0 0 0 0);
163
171
  }
164
172
 
173
+ .kawa-bg-layer.kawa-wipe-from-up {
174
+ clip-path: inset(0 0 100% 0);
175
+ }
176
+ .kawa-bg-layer.kawa-wipe-from-up.active {
177
+ clip-path: inset(0 0 0 0);
178
+ }
179
+
180
+ .kawa-bg-layer.kawa-wipe-from-down {
181
+ clip-path: inset(100% 0 0 0);
182
+ }
183
+ .kawa-bg-layer.kawa-wipe-from-down.active {
184
+ clip-path: inset(0 0 0 0);
185
+ }
186
+
187
+ .kawa-bg-layer.kawa-wipe-circle {
188
+ clip-path: circle(0% at 50% 50%);
189
+ }
190
+ .kawa-bg-layer.kawa-wipe-circle.active {
191
+ clip-path: circle(120% at 50% 50%);
192
+ }
193
+
194
+ .kawa-bg-layer.kawa-push-from-left {
195
+ transform: translateX(-100%);
196
+ }
197
+ .kawa-bg-layer.kawa-push-from-left.active {
198
+ transform: translateX(0);
199
+ }
200
+
201
+ .kawa-bg-layer.kawa-push-from-right {
202
+ transform: translateX(100%);
203
+ }
204
+ .kawa-bg-layer.kawa-push-from-right.active {
205
+ transform: translateX(0);
206
+ }
207
+
208
+ .kawa-bg-layer.kawa-push-from-up {
209
+ transform: translateY(-100%);
210
+ }
211
+ .kawa-bg-layer.kawa-push-from-up.active {
212
+ transform: translateY(0);
213
+ }
214
+
215
+ .kawa-bg-layer.kawa-push-from-down {
216
+ transform: translateY(100%);
217
+ }
218
+ .kawa-bg-layer.kawa-push-from-down.active {
219
+ transform: translateY(0);
220
+ }
221
+
222
+ .kawa-bg-layer.kawa-zoom-in {
223
+ transform: scale(1.15);
224
+ filter: blur(8px);
225
+ }
226
+ .kawa-bg-layer.kawa-zoom-in.active {
227
+ transform: scale(1);
228
+ filter: blur(0px);
229
+ }
230
+
231
+ .kawa-bg-layer.kawa-blur-transition {
232
+ filter: blur(16px);
233
+ }
234
+ .kawa-bg-layer.kawa-blur-transition.active {
235
+ filter: blur(0px);
236
+ }
237
+
238
+ /* Scene Glitch / Corrupt Transition */
239
+ @keyframes kawa-scene-glitch {
240
+ 0% {
241
+ filter: none;
242
+ transform: scale(1) skewX(0deg);
243
+ }
244
+ 20% {
245
+ filter: invert(0.8) hue-rotate(90deg) contrast(200%);
246
+ transform: scale(1.05) skewX(4deg);
247
+ clip-path: polygon(0 0, 100% 0, 100% 45%, 0 45%, 0 60%, 100% 60%, 100% 100%, 0 100%);
248
+ }
249
+ 40% {
250
+ filter: saturate(300%) contrast(150%);
251
+ transform: scale(0.98) skewX(-3deg);
252
+ }
253
+ 60% {
254
+ filter: invert(0.3) drop-shadow(-8px 0 #ef4444) drop-shadow(8px 0 #06b6d4);
255
+ transform: scale(1.02) skewX(2deg);
256
+ }
257
+ 80% {
258
+ filter: contrast(180%) brightness(120%);
259
+ transform: scale(1) skewX(-1deg);
260
+ }
261
+ 100% {
262
+ filter: none;
263
+ transform: scale(1) skewX(0deg);
264
+ }
265
+ }
266
+
267
+ .kawa-bg-layer.kawa-glitch-transition {
268
+ animation: kawa-scene-glitch 0.6s ease-in-out forwards;
269
+ }
270
+ .kawa-bg-layer.kawa-glitch-transition.active {
271
+ animation: kawa-scene-glitch 0.6s ease-in-out forwards;
272
+ }
273
+
274
+ /* Animated Rich Text Effects: Glitch, Shake, Rainbow, Corrupt */
275
+ @keyframes kawa-glitch-anim {
276
+ 0% {
277
+ transform: translate(0);
278
+ text-shadow: -2px 0 #ef4444, 2px 0 #06b6d4;
279
+ }
280
+ 20% {
281
+ transform: translate(-2px, 2px);
282
+ text-shadow: 2px 0 #ef4444, -2px 0 #06b6d4;
283
+ }
284
+ 40% {
285
+ transform: translate(-2px, -2px);
286
+ text-shadow: -2px 0 #ec4899, 2px 0 #10b981;
287
+ }
288
+ 60% {
289
+ transform: translate(2px, 2px);
290
+ text-shadow: 2px 0 #3b82f6, -2px 0 #f59e0b;
291
+ }
292
+ 80% {
293
+ transform: translate(2px, -2px);
294
+ text-shadow: -2px 0 #ef4444, 2px 0 #06b6d4;
295
+ }
296
+ 100% {
297
+ transform: translate(0);
298
+ text-shadow: 0 0 transparent;
299
+ }
300
+ }
301
+
302
+ .kawa-text-glitch {
303
+ display: inline-block;
304
+ position: relative;
305
+ color: #f8fafc;
306
+ font-weight: 700;
307
+ animation: kawa-glitch-anim 0.35s infinite steps(2, start);
308
+ }
309
+
310
+ @keyframes kawa-shake-anim {
311
+ 0% { transform: translate(1px, 1px) rotate(0deg); }
312
+ 10% { transform: translate(-1px, -2px) rotate(-1deg); }
313
+ 20% { transform: translate(-3px, 0px) rotate(1deg); }
314
+ 30% { transform: translate(3px, 2px) rotate(0deg); }
315
+ 40% { transform: translate(1px, -1px) rotate(1deg); }
316
+ 50% { transform: translate(-1px, 2px) rotate(-1deg); }
317
+ 60% { transform: translate(-3px, 1px) rotate(0deg); }
318
+ 70% { transform: translate(3px, 1px) rotate(-1deg); }
319
+ 80% { transform: translate(-1px, -1px) rotate(1deg); }
320
+ 90% { transform: translate(1px, 2px) rotate(0deg); }
321
+ 100% { transform: translate(1px, -2px) rotate(-1deg); }
322
+ }
323
+
324
+ .kawa-text-shake {
325
+ display: inline-block;
326
+ animation: kawa-shake-anim 0.2s infinite ease-in-out;
327
+ color: #f43f5e;
328
+ }
329
+
330
+ @keyframes kawa-rainbow-anim {
331
+ 0% { filter: hue-rotate(0deg); }
332
+ 100% { filter: hue-rotate(360deg); }
333
+ }
334
+
335
+ .kawa-text-rainbow {
336
+ display: inline-block;
337
+ background: linear-gradient(90deg, #ff007f, #ffaa00, #00ff66, #00f0ff, #aa00ff, #ff007f);
338
+ background-size: 200% auto;
339
+ -webkit-background-clip: text;
340
+ -webkit-text-fill-color: transparent;
341
+ animation: kawa-rainbow-anim 3s linear infinite;
342
+ font-weight: bold;
343
+ }
344
+
345
+ .kawa-text-corrupt {
346
+ display: inline-block;
347
+ font-family: monospace;
348
+ letter-spacing: 0.15em;
349
+ color: #ef4444;
350
+ text-shadow: 0 0 8px rgba(239, 68, 68, 0.8), 2px 2px 0 rgba(0, 0, 0, 0.9);
351
+ animation: kawa-glitch-anim 0.2s infinite;
352
+ }
353
+
354
+ /* Sprite Meta/Horror Glitch Effects */
355
+ .kawa-sprite.kawa-glitch img {
356
+ animation: kawa-glitch-anim 0.25s infinite steps(2, start);
357
+ filter: drop-shadow(-4px 0 #ef4444) drop-shadow(4px 0 #06b6d4) contrast(140%);
358
+ }
359
+
360
+ .kawa-sprite.kawa-invert img {
361
+ filter: invert(1) hue-rotate(180deg) drop-shadow(0 0 16px rgba(255, 255, 255, 0.8));
362
+ }
363
+
364
+ .kawa-sprite.kawa-vhs img {
365
+ filter: saturate(180%) contrast(130%) brightness(110%);
366
+ }
367
+
165
368
  /* Characters Layer */
166
369
  .kawa-characters {
167
370
  position: absolute;
@@ -1330,6 +1533,17 @@ body.kawa-fullscreen {
1330
1533
  animation: kawa-fade-in 0.5s cubic-bezier(0.16, 1, 0.3, 1);
1331
1534
  }
1332
1535
 
1536
+ .kawa-bg-video,
1537
+ .kawa-cg-video {
1538
+ position: absolute;
1539
+ inset: 0;
1540
+ width: 100%;
1541
+ height: 100%;
1542
+ object-fit: cover;
1543
+ pointer-events: none;
1544
+ z-index: 1;
1545
+ }
1546
+
1333
1547
  /* ==========================================================================
1334
1548
  Camera Shake, Flash & Stage Directives
1335
1549
  ========================================================================== */
@@ -1810,13 +2024,55 @@ body.kawa-fullscreen {
1810
2024
  display: none !important;
1811
2025
  }
1812
2026
 
1813
- /* Embed / iframe compact chrome (`?embed=1`) */
1814
- .kawa-root.kawa-embed .kawa-quick-menu {
1815
- display: none !important;
2027
+ /* Embed: always letterbox 16:9 — never inherit full-page mobile fill sizing. */
2028
+ .kawa-root.kawa-embed {
2029
+ min-height: 0 !important;
2030
+ height: 100% !important;
2031
+ max-height: 100% !important;
2032
+ }
2033
+
2034
+ .kawa-root.kawa-embed .kawa-stage {
2035
+ max-width: 100% !important;
2036
+ max-height: 100% !important;
2037
+ border-radius: 0;
2038
+ box-shadow: none;
2039
+ }
2040
+
2041
+ .kawa-root.kawa-embed .kawa-ui-layer {
2042
+ padding: clamp(8px, 2.2vh, 16px) clamp(10px, 2.5vw, 18px);
1816
2043
  }
1817
2044
 
1818
2045
  .kawa-root.kawa-embed .kawa-dialogue-box {
2046
+ min-height: 0;
1819
2047
  max-width: min(920px, 94%);
2048
+ padding: clamp(10px, 1.8vh, 16px) clamp(12px, 2.5vw, 20px);
2049
+ }
2050
+
2051
+ .kawa-root.kawa-embed .kawa-dialogue-text {
2052
+ font-size: clamp(0.88rem, 2.6vw, 1.05rem);
2053
+ line-height: 1.45;
2054
+ }
2055
+
2056
+ .kawa-root.kawa-embed .kawa-choice-container {
2057
+ width: min(92%, 440px);
2058
+ gap: 8px;
2059
+ top: 48%;
2060
+ }
2061
+
2062
+ .kawa-root.kawa-embed .kawa-choice-btn {
2063
+ font-size: clamp(0.82rem, 2.4vw, 1rem);
2064
+ padding: 0.65rem 0.9rem;
2065
+ min-height: 42px;
2066
+ box-shadow: 0 4px 14px rgba(0, 0, 0, 0.4);
2067
+ }
2068
+
2069
+ .kawa-root.kawa-embed .kawa-choice-btn:hover,
2070
+ .kawa-root.kawa-embed .kawa-choice-btn:focus-visible {
2071
+ transform: none;
2072
+ }
2073
+
2074
+ .kawa-root.kawa-embed .kawa-quick-menu {
2075
+ display: none !important;
1820
2076
  }
1821
2077
 
1822
2078
  .kawa-continue-link-btn {
@@ -1863,13 +2119,14 @@ body.kawa-fullscreen {
1863
2119
  }
1864
2120
 
1865
2121
  @media (max-width: 768px), (pointer: coarse) {
1866
- .kawa-root {
2122
+ /* Full-page player only — never blow up embedded previews (playground / iframe). */
2123
+ .kawa-root:not(.kawa-embed) {
1867
2124
  /* Use dynamic viewport so mobile browser chrome doesn't clip the stage */
1868
2125
  min-height: 100dvh;
1869
2126
  height: 100dvh;
1870
2127
  }
1871
2128
 
1872
- .kawa-stage {
2129
+ .kawa-root:not(.kawa-embed) .kawa-stage {
1873
2130
  width: 100% !important;
1874
2131
  max-width: none;
1875
2132
  max-height: none;
@@ -1880,7 +2137,7 @@ body.kawa-fullscreen {
1880
2137
  }
1881
2138
 
1882
2139
  @media (orientation: portrait) {
1883
- .kawa-stage {
2140
+ .kawa-root:not(.kawa-embed) .kawa-stage {
1884
2141
  height: 100% !important;
1885
2142
  aspect-ratio: auto;
1886
2143
  }
@@ -2079,3 +2336,109 @@ body.kawa-fullscreen {
2079
2336
  font-size: 0.75rem;
2080
2337
  color: #64748b;
2081
2338
  }
2339
+
2340
+ /* ==========================================================================
2341
+ Accessibility & Themes (A11y, Dyslexia Font & High Contrast)
2342
+ ========================================================================== */
2343
+
2344
+ .kawa-dyslexia-font,
2345
+ .kawa-dyslexia-font .kawa-dialogue-text,
2346
+ .kawa-dyslexia-font .kawa-speaker-tag,
2347
+ .kawa-dyslexia-font .kawa-choice-btn,
2348
+ .kawa-dyslexia-font .kawa-modal-card {
2349
+ font-family: 'OpenDyslexic', 'Comic Sans MS', sans-serif !important;
2350
+ letter-spacing: 0.05em !important;
2351
+ word-spacing: 0.12em !important;
2352
+ line-height: 1.7 !important;
2353
+ }
2354
+
2355
+ .kawa-high-contrast .kawa-dialogue-box {
2356
+ background: #000000 !important;
2357
+ border: 3px solid #ffffff !important;
2358
+ box-shadow: 0 0 0 2px #000000 !important;
2359
+ }
2360
+
2361
+ .kawa-high-contrast .kawa-dialogue-text {
2362
+ color: #ffffff !important;
2363
+ font-weight: 700 !important;
2364
+ text-shadow: none !important;
2365
+ }
2366
+
2367
+ .kawa-high-contrast .kawa-speaker-tag {
2368
+ background: #ffff00 !important;
2369
+ color: #000000 !important;
2370
+ border: 2px solid #ffffff !important;
2371
+ font-weight: 900 !important;
2372
+ }
2373
+
2374
+ .kawa-high-contrast .kawa-choice-btn {
2375
+ background: #000000 !important;
2376
+ color: #ffffff !important;
2377
+ border: 2px solid #ffff00 !important;
2378
+ font-weight: 700 !important;
2379
+ }
2380
+
2381
+ .kawa-high-contrast .kawa-choice-btn:hover,
2382
+ .kawa-high-contrast .kawa-choice-btn:focus-visible {
2383
+ background: #ffff00 !important;
2384
+ color: #000000 !important;
2385
+ }
2386
+
2387
+ .kawa-setting-section {
2388
+ margin-top: 14px;
2389
+ padding-top: 12px;
2390
+ border-top: 1px solid rgba(255, 255, 255, 0.12);
2391
+ display: flex;
2392
+ flex-direction: column;
2393
+ gap: 10px;
2394
+ }
2395
+
2396
+ .kawa-setting-section-title {
2397
+ font-size: 0.95rem;
2398
+ font-weight: 700;
2399
+ color: #f8fafc;
2400
+ margin-bottom: 2px;
2401
+ }
2402
+
2403
+ .kawa-toggle-label {
2404
+ display: flex;
2405
+ align-items: center;
2406
+ gap: 10px;
2407
+ font-size: 0.9rem;
2408
+ color: #cbd5e1;
2409
+ cursor: pointer;
2410
+ }
2411
+
2412
+ .kawa-toggle-label input[type="checkbox"] {
2413
+ width: 18px;
2414
+ height: 18px;
2415
+ accent-color: var(--kawa-primary-accent, #f43f5e);
2416
+ cursor: pointer;
2417
+ }
2418
+
2419
+ .kawa-select {
2420
+ width: 100%;
2421
+ padding: 8px 12px;
2422
+ border-radius: 8px;
2423
+ background: rgba(15, 23, 42, 0.8);
2424
+ color: #f8fafc;
2425
+ border: 1px solid rgba(255, 255, 255, 0.2);
2426
+ font-size: 0.95rem;
2427
+ cursor: pointer;
2428
+ outline: none;
2429
+ }
2430
+
2431
+ .kawa-select:focus {
2432
+ border-color: var(--kawa-primary-accent, #f43f5e);
2433
+ }
2434
+
2435
+ .kawa-sprite.kawa-speaking {
2436
+ animation: kawa-sprite-lip-sync 0.35s ease-in-out infinite alternate;
2437
+ }
2438
+
2439
+ @keyframes kawa-sprite-lip-sync {
2440
+ 0% { transform: translateY(0) scale(1); }
2441
+ 100% { transform: translateY(-3px) scale(1.015); }
2442
+ }
2443
+
2444
+