blacktrigram 0.7.11 → 0.7.13

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 (73) hide show
  1. package/DATA_MODEL.md +347 -0
  2. package/lib/App.d.ts.map +1 -1
  3. package/lib/App2.js +0 -6
  4. package/lib/App2.js.map +1 -1
  5. package/lib/assets/index.css +102 -94
  6. package/lib/components/screens/combat/CombatScreen3D.d.ts +1 -1
  7. package/lib/components/screens/combat/CombatScreen3D.js +2 -2
  8. package/lib/components/screens/combat/CombatScreen3D.js.map +1 -1
  9. package/lib/components/screens/combat/components/controls/CombatButtons.d.ts.map +1 -1
  10. package/lib/components/screens/combat/components/controls/CombatButtons.js +22 -7
  11. package/lib/components/screens/combat/components/controls/CombatButtons.js.map +1 -1
  12. package/lib/components/screens/combat/components/controls/CombatControlsPanel.d.ts +2 -0
  13. package/lib/components/screens/combat/components/controls/CombatControlsPanel.d.ts.map +1 -1
  14. package/lib/components/screens/combat/components/controls/CombatControlsPanel.js +7 -4
  15. package/lib/components/screens/combat/components/controls/CombatControlsPanel.js.map +1 -1
  16. package/lib/components/screens/combat/components/controls/PauseMenu.d.ts.map +1 -1
  17. package/lib/components/screens/combat/components/controls/PauseMenu.js +15 -5
  18. package/lib/components/screens/combat/components/controls/PauseMenu.js.map +1 -1
  19. package/lib/components/screens/combat/components/feedback/RoundAnnouncementOverlayHtml.js +15 -16
  20. package/lib/components/screens/combat/components/feedback/RoundAnnouncementOverlayHtml.js.map +1 -1
  21. package/lib/components/screens/combat/components/hud/DifficultyIndicator.js +1 -2
  22. package/lib/components/screens/combat/components/hud/DifficultyIndicator.js.map +1 -1
  23. package/lib/components/screens/combat/components/hud/PlayerStateOverlayHtml.js +28 -24
  24. package/lib/components/screens/combat/components/hud/PlayerStateOverlayHtml.js.map +1 -1
  25. package/lib/components/screens/combat/components/indicators/InputBufferDisplay.js +2 -4
  26. package/lib/components/screens/combat/components/indicators/InputBufferDisplay.js.map +1 -1
  27. package/lib/components/screens/controls/ControlsScreen3D.d.ts.map +1 -1
  28. package/lib/components/screens/controls/ControlsScreen3D.js +3 -2
  29. package/lib/components/screens/controls/ControlsScreen3D.js.map +1 -1
  30. package/lib/components/screens/controls/components/InteractiveControlDemoOverlayHtml.js +28 -30
  31. package/lib/components/screens/controls/components/InteractiveControlDemoOverlayHtml.js.map +1 -1
  32. package/lib/components/screens/controls/components/VisualKeyboard3D.d.ts.map +1 -1
  33. package/lib/components/screens/controls/components/VisualKeyboard3D.js +4 -3
  34. package/lib/components/screens/controls/components/VisualKeyboard3D.js.map +1 -1
  35. package/lib/components/screens/intro/IntroScreen3D.js +1 -1
  36. package/lib/components/screens/intro/components/MenuButtonsOverlayHtml.d.ts.map +1 -1
  37. package/lib/components/screens/intro/components/MenuButtonsOverlayHtml.js +5 -2
  38. package/lib/components/screens/intro/components/MenuButtonsOverlayHtml.js.map +1 -1
  39. package/lib/components/screens/philosophy/components/TrigramSymbol3D.d.ts.map +1 -1
  40. package/lib/components/screens/training/components/FootworkDrillsOverlayHtml.js +4 -4
  41. package/lib/components/screens/training/components/FootworkDrillsOverlayHtml.js.map +1 -1
  42. package/lib/components/screens/training/components/hud/TrainingTopHUD.js +1 -1
  43. package/lib/components/screens/training/components/hud/TrainingTopHUD.js.map +1 -1
  44. package/lib/components/shared/base/ResponsiveContainer.d.ts +6 -0
  45. package/lib/components/shared/base/ResponsiveContainer.d.ts.map +1 -1
  46. package/lib/components/shared/three/effects/ActionFeedback.js +1 -2
  47. package/lib/components/shared/three/effects/ActionFeedback.js.map +1 -1
  48. package/lib/components/shared/three/effects/DamageNumbers.js +1 -2
  49. package/lib/components/shared/three/effects/DamageNumbers.js.map +1 -1
  50. package/lib/components/shared/three/ui/BodyPartHealthDisplay.js +5 -5
  51. package/lib/components/shared/three/ui/BodyPartHealthDisplay.js.map +1 -1
  52. package/lib/components/shared/three/ui/BreathingIndicator2.js +3 -2
  53. package/lib/components/shared/three/ui/BreathingIndicator2.js.map +1 -1
  54. package/lib/components/shared/three/ui/TechniqueCard.d.ts.map +1 -1
  55. package/lib/components/shared/three/ui/TechniqueCard.js +27 -30
  56. package/lib/components/shared/three/ui/TechniqueCard.js.map +1 -1
  57. package/lib/components/shared/three/ui/VitalPointOverlayControlsHtml.d.ts.map +1 -1
  58. package/lib/components/shared/three/ui/VitalPointOverlayControlsHtml.js +57 -59
  59. package/lib/components/shared/three/ui/VitalPointOverlayControlsHtml.js.map +1 -1
  60. package/lib/components/shared/ui/BaseHUDContainer.d.ts +40 -0
  61. package/lib/components/shared/ui/BaseHUDContainer.d.ts.map +1 -1
  62. package/lib/components/shared/ui/BaseHUDContainer.js +40 -0
  63. package/lib/components/shared/ui/BaseHUDContainer.js.map +1 -1
  64. package/lib/components/shared/ui/MobileHUDLayout.d.ts +13 -0
  65. package/lib/components/shared/ui/MobileHUDLayout.d.ts.map +1 -1
  66. package/lib/components/shared/ui/SplashScreen.js +10 -10
  67. package/lib/components/shared/ui/SplashScreen.js.map +1 -1
  68. package/lib/components/shared/ui/VitalPointOverlayControlsPure.d.ts.map +1 -1
  69. package/lib/components/shared/ui/VitalPointOverlayControlsPure.js +57 -62
  70. package/lib/components/shared/ui/VitalPointOverlayControlsPure.js.map +1 -1
  71. package/lib/components/shared/ui/VolumeControl.js +7 -7
  72. package/lib/components/shared/ui/VolumeControl.js.map +1 -1
  73. package/package.json +9 -9
@@ -13,10 +13,10 @@ body {
13
13
  font-family: var(--font-korean);
14
14
  background: linear-gradient(
15
15
  135deg,
16
- var(--korean-bg-dark) 0%,
17
- var(--korean-bg-medium) 100%
16
+ var(--color-bg-dark) 0%,
17
+ var(--color-bg-medium) 100%
18
18
  );
19
- color: var(--korean-text-primary);
19
+ color: var(--color-text-primary);
20
20
  overflow: hidden;
21
21
  user-select: none;
22
22
  }
@@ -28,15 +28,15 @@ body {
28
28
  align-items: center;
29
29
  background: radial-gradient(
30
30
  ellipse at center,
31
- var(--korean-bg-medium) 0%,
32
- var(--korean-bg-dark) 100%
31
+ var(--color-bg-medium) 0%,
32
+ var(--color-bg-dark) 100%
33
33
  );
34
34
  }
35
35
  /* Korean Text Enhancement */
36
36
  .korean-text {
37
37
  font-family: var(--font-korean);
38
38
  font-weight: 400;
39
- text-shadow: 0 0 8px var(--korean-glow);
39
+ text-shadow: 0 0 8px var(--color-korean-east);
40
40
  letter-spacing: 0.02em;
41
41
  }
42
42
  .korean-title {
@@ -45,42 +45,42 @@ body {
45
45
  font-size: 3rem;
46
46
  background: linear-gradient(
47
47
  45deg,
48
- var(--korean-primary),
49
- var(--korean-accent)
48
+ var(--color-accent-cyan),
49
+ var(--color-warning)
50
50
  );
51
51
  -webkit-background-clip: text;
52
52
  -webkit-text-fill-color: transparent;
53
53
  background-clip: text;
54
- text-shadow: 0 0 20px var(--korean-primary);
54
+ text-shadow: 0 0 20px var(--color-accent-cyan);
55
55
  }
56
56
  .cyber-text {
57
57
  font-family: var(--font-cyber);
58
- color: var(--korean-primary);
58
+ color: var(--color-accent-cyan);
59
59
  text-transform: uppercase;
60
60
  letter-spacing: 0.1em;
61
61
  text-shadow: 0 0 10px currentColor;
62
62
  }
63
63
  /* Cyberpunk UI Elements */
64
64
  .cyberpunk-border {
65
- border: 2px solid var(--korean-primary);
65
+ border: 2px solid var(--color-accent-cyan);
66
66
  border-image: linear-gradient(
67
67
  45deg,
68
- var(--korean-primary),
69
- var(--korean-accent),
70
- var(--korean-primary)
68
+ var(--color-accent-cyan),
69
+ var(--color-warning),
70
+ var(--color-accent-cyan)
71
71
  )
72
72
  1;
73
- box-shadow: 0 0 10px var(--korean-primary),
74
- inset 0 0 10px rgba(0, 212, 255, 0.1);
73
+ box-shadow: 0 0 10px var(--color-accent-cyan),
74
+ inset 0 0 10px color-mix(in srgb, var(--color-accent-cyan) 10%, transparent);
75
75
  }
76
76
  .cyberpunk-button {
77
77
  background: linear-gradient(
78
78
  135deg,
79
- rgba(0, 212, 255, 0.1),
80
- rgba(255, 183, 0, 0.1)
79
+ color-mix(in srgb, var(--color-accent-cyan) 10%, transparent),
80
+ color-mix(in srgb, var(--color-warning) 10%, transparent)
81
81
  );
82
- border: 1px solid var(--korean-primary);
83
- color: var(--korean-text-primary);
82
+ border: 1px solid var(--color-accent-cyan);
83
+ color: var(--color-text-primary);
84
84
  padding: 0.8rem 1.5rem;
85
85
  cursor: pointer;
86
86
  transition: all 0.3s ease;
@@ -92,10 +92,10 @@ body {
92
92
  .cyberpunk-button:hover {
93
93
  background: linear-gradient(
94
94
  135deg,
95
- rgba(0, 212, 255, 0.2),
96
- rgba(255, 183, 0, 0.2)
95
+ color-mix(in srgb, var(--color-accent-cyan) 20%, transparent),
96
+ color-mix(in srgb, var(--color-warning) 20%, transparent)
97
97
  );
98
- box-shadow: 0 0 20px var(--korean-primary);
98
+ box-shadow: 0 0 20px var(--color-accent-cyan);
99
99
  transform: translateY(-2px);
100
100
  }
101
101
  .cyberpunk-button:before {
@@ -108,7 +108,7 @@ body {
108
108
  background: linear-gradient(
109
109
  90deg,
110
110
  transparent,
111
- rgba(255, 255, 255, 0.2),
111
+ color-mix(in srgb, var(--color-text-primary) 20%, transparent),
112
112
  transparent
113
113
  );
114
114
  transition: left 0.5s;
@@ -124,15 +124,15 @@ body {
124
124
  right: 0;
125
125
  background: linear-gradient(
126
126
  180deg,
127
- rgba(10, 10, 15, 0.9) 0%,
127
+ color-mix(in srgb, var(--color-bg-dark) 90%, transparent) 0%,
128
128
  transparent 100%
129
129
  );
130
130
  padding: 1rem;
131
- border-bottom: 1px solid var(--korean-primary);
131
+ border-bottom: 1px solid var(--color-accent-cyan);
132
132
  }
133
133
  .health-bar {
134
- background: var(--korean-bg-dark);
135
- border: 1px solid var(--korean-primary);
134
+ background: var(--color-bg-dark);
135
+ border: 1px solid var(--color-accent-cyan);
136
136
  height: 8px;
137
137
  border-radius: 4px;
138
138
  overflow: hidden;
@@ -141,9 +141,9 @@ body {
141
141
  .health-bar-fill {
142
142
  background: linear-gradient(
143
143
  90deg,
144
- var(--korean-danger) 0%,
145
- var(--korean-accent) 50%,
146
- var(--korean-glow) 100%
144
+ var(--color-danger) 0%,
145
+ var(--color-warning) 50%,
146
+ var(--color-korean-east) 100%
147
147
  );
148
148
  height: 100%;
149
149
  transition: width 0.3s ease;
@@ -153,10 +153,10 @@ body {
153
153
  @keyframes korean-glow {
154
154
  0%,
155
155
  100% {
156
- text-shadow: 0 0 5px var(--korean-glow);
156
+ text-shadow: 0 0 5px var(--color-korean-east);
157
157
  }
158
158
  50% {
159
- text-shadow: 0 0 20px var(--korean-glow);
159
+ text-shadow: 0 0 20px var(--color-korean-east);
160
160
  }
161
161
  }
162
162
  .animate-glow {
@@ -164,13 +164,13 @@ body {
164
164
  }
165
165
  @keyframes combat-flash {
166
166
  0% {
167
- background-color: rgba(255, 51, 102, 0.1);
167
+ background-color: color-mix(in srgb, var(--color-danger) 10%, transparent);
168
168
  }
169
169
  50% {
170
- background-color: rgba(255, 51, 102, 0.3);
170
+ background-color: color-mix(in srgb, var(--color-danger) 30%, transparent);
171
171
  }
172
172
  100% {
173
- background-color: rgba(255, 51, 102, 0.1);
173
+ background-color: color-mix(in srgb, var(--color-danger) 10%, transparent);
174
174
  }
175
175
  }
176
176
  .combat-flash {
@@ -232,8 +232,8 @@ body {
232
232
  }
233
233
  /* Loading and Error States */
234
234
  .loading-spinner {
235
- border: 2px solid var(--korean-bg-medium);
236
- border-top: 2px solid var(--korean-primary);
235
+ border: 2px solid var(--color-bg-medium);
236
+ border-top: 2px solid var(--color-accent-cyan);
237
237
  border-radius: 50%;
238
238
  width: 40px;
239
239
  height: 40px;
@@ -249,9 +249,9 @@ body {
249
249
  }
250
250
  }
251
251
  .error-message {
252
- color: var(--korean-danger);
253
- background: rgba(255, 51, 102, 0.1);
254
- border: 1px solid var(--korean-danger);
252
+ color: var(--color-danger);
253
+ background: color-mix(in srgb, var(--color-danger) 10%, transparent);
254
+ border: 1px solid var(--color-danger);
255
255
  padding: 1rem;
256
256
  border-radius: 4px;
257
257
  margin: 1rem 0;
@@ -349,6 +349,11 @@ body {
349
349
  display: none !important;
350
350
  }
351
351
  /* Korean typography support */
352
+ /* NOTE: overflow: hidden on body prevents the page itself from scrolling.
353
+ * This is intentional for a full-screen game. Individual screens that need
354
+ * scrollable content (Philosophy, Controls) use internal scrollable containers
355
+ * with overflowY: "auto" on their content areas, which works correctly
356
+ * because the content div has a fixed height within the viewport. */
352
357
  body {
353
358
  font-family: "Noto Sans KR", sans-serif;
354
359
  margin: 0;
@@ -368,8 +373,8 @@ body {
368
373
  bottom: 0;
369
374
  background: radial-gradient(
370
375
  circle at center,
371
- rgba(139, 0, 0, 0.1) 0%,
372
- rgba(0, 0, 0, 1) 70%
376
+ color-mix(in srgb, var(--color-korean-south) 10%, transparent) 0%,
377
+ var(--color-primary-black) 70%
373
378
  );
374
379
  pointer-events: none;
375
380
  z-index: -1;
@@ -441,15 +446,18 @@ body {
441
446
  color: #ffffff;
442
447
  font-family: "Noto Sans KR", Arial, sans-serif;
443
448
  overflow: hidden;
449
+ /* Remove focus outline when the app container is focused via tabIndex.
450
+ * The game container is made focusable for keyboard input capture. */
451
+ outline: none;
444
452
  }
445
453
  .app-header {
446
454
  padding: 1rem 2rem;
447
- background: rgba(0, 10, 18, 0.9);
448
- border-bottom: 2px solid #ffd700;
455
+ background: color-mix(in srgb, var(--color-bg-dark) 90%, transparent);
456
+ border-bottom: 2px solid var(--color-primary-gold);
449
457
  display: flex;
450
458
  justify-content: space-between;
451
459
  align-items: center;
452
- box-shadow: 0 2px 10px rgba(255, 215, 0, 0.3);
460
+ box-shadow: 0 2px 10px color-mix(in srgb, var(--color-primary-gold) 30%, transparent);
453
461
  }
454
462
  .app-title {
455
463
  margin: 0;
@@ -460,14 +468,14 @@ body {
460
468
  .korean-title {
461
469
  font-size: 1.8rem;
462
470
  font-weight: bold;
463
- color: #ffd700;
464
- text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.8);
471
+ color: var(--color-primary-gold);
472
+ text-shadow: 2px 2px 4px color-mix(in srgb, var(--color-primary-black) 80%, transparent);
465
473
  }
466
474
  .english-title {
467
475
  font-size: 1rem;
468
- color: #87ceeb;
476
+ color: var(--color-info);
469
477
  font-style: italic;
470
- text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.6);
478
+ text-shadow: 1px 1px 2px color-mix(in srgb, var(--color-primary-black) 60%, transparent);
471
479
  }
472
480
  .app-status {
473
481
  display: flex;
@@ -483,14 +491,14 @@ body {
483
491
  font-weight: bold;
484
492
  }
485
493
  .phase-indicator {
486
- background: rgba(255, 215, 0, 0.2);
487
- color: #ffd700;
488
- border: 1px solid #ffd700;
494
+ background: color-mix(in srgb, var(--color-primary-gold) 20%, transparent);
495
+ color: var(--color-primary-gold);
496
+ border: 1px solid var(--color-primary-gold);
489
497
  }
490
498
  .time-indicator {
491
- background: rgba(135, 206, 235, 0.2);
492
- color: #87ceeb;
493
- border: 1px solid #87ceeb;
499
+ background: color-mix(in srgb, var(--color-info) 20%, transparent);
500
+ color: var(--color-info);
501
+ border: 1px solid var(--color-info);
494
502
  }
495
503
  .app-main {
496
504
  flex: 1;
@@ -500,7 +508,7 @@ body {
500
508
  overflow: hidden;
501
509
  }
502
510
  .app-debug {
503
- background: rgba(0, 0, 0, 0.8);
511
+ background: color-mix(in srgb, var(--color-primary-black) 80%, transparent);
504
512
  color: #00ff00;
505
513
  font-family: "Courier New", monospace;
506
514
  font-size: 0.8rem;
@@ -510,7 +518,7 @@ body {
510
518
  .app-debug summary {
511
519
  padding: 0.5rem;
512
520
  cursor: pointer;
513
- background: rgba(0, 255, 0, 0.1);
521
+ background: color-mix(in srgb, var(--color-success) 10%, transparent);
514
522
  border-bottom: 1px solid #00ff00;
515
523
  }
516
524
  .app-debug pre {
@@ -550,12 +558,12 @@ body {
550
558
  bottom: 0;
551
559
  background-image: radial-gradient(
552
560
  circle at 20% 20%,
553
- rgba(255, 215, 0, 0.05) 0%,
561
+ color-mix(in srgb, var(--color-primary-gold) 5%, transparent) 0%,
554
562
  transparent 50%
555
563
  ),
556
564
  radial-gradient(
557
565
  circle at 80% 80%,
558
- rgba(135, 206, 235, 0.05) 0%,
566
+ color-mix(in srgb, var(--color-info) 5%, transparent) 0%,
559
567
  transparent 50%
560
568
  );
561
569
  pointer-events: none;
@@ -580,7 +588,7 @@ body {
580
588
  font-weight: 700;
581
589
  color: #ffd700;
582
590
  margin-bottom: 1rem;
583
- text-shadow: 0 0 20px rgba(255, 215, 0, 0.5);
591
+ text-shadow: 0 0 20px color-mix(in srgb, var(--color-primary-gold) 50%, transparent);
584
592
  }
585
593
  .english-subtitle {
586
594
  font-size: 1.2rem;
@@ -644,7 +652,7 @@ body {
644
652
  left: 50%;
645
653
  transform: translate(-50%, -50%);
646
654
  text-align: center;
647
- color: var(--primary-cyan);
655
+ color: var(--color-primary-cyan);
648
656
  }
649
657
  .error-screen {
650
658
  position: absolute;
@@ -655,7 +663,7 @@ body {
655
663
  color: #ff4136;
656
664
  padding: 2rem;
657
665
  border: 1px solid #ff4136;
658
- background: rgba(255, 65, 54, 0.1);
666
+ background: color-mix(in srgb, var(--color-danger) 10%, transparent);
659
667
  }
660
668
  /* Fix UI overlay positioning to not interfere with canvas visibility */
661
669
  .test-overlay {
@@ -823,14 +831,14 @@ body {
823
831
  /* Timer Flash - Final seconds warning */
824
832
  @keyframes timerFlash {
825
833
  0%, 100% {
826
- color: #ff4444;
827
- text-shadow: 0 0 10px rgba(255, 68, 68, 0.8),
828
- 0 0 20px rgba(255, 68, 68, 0.5);
834
+ color: var(--color-korean-south);
835
+ text-shadow: 0 0 10px color-mix(in srgb, var(--color-korean-south) 80%, transparent),
836
+ 0 0 20px color-mix(in srgb, var(--color-korean-south) 50%, transparent);
829
837
  }
830
838
  50% {
831
- color: #ffaa00;
832
- text-shadow: 0 0 15px rgba(255, 170, 0, 1),
833
- 0 0 30px rgba(255, 170, 0, 0.7);
839
+ color: var(--color-korean-center);
840
+ text-shadow: 0 0 15px var(--color-korean-center),
841
+ 0 0 30px color-mix(in srgb, var(--color-korean-center) 70%, transparent);
834
842
  }
835
843
  }
836
844
 
@@ -1006,9 +1014,9 @@ body {
1006
1014
  .training-button {
1007
1015
  width: 100%;
1008
1016
  height: 40px;
1009
- border: 2px solid rgba(255, 255, 255, 0.8);
1017
+ border: 2px solid color-mix(in srgb, var(--color-text-primary) 80%, transparent);
1010
1018
  border-radius: 8px;
1011
- color: #ffffff;
1019
+ color: var(--color-text-primary);
1012
1020
  font-weight: bold;
1013
1021
  cursor: pointer;
1014
1022
  display: flex;
@@ -1019,11 +1027,11 @@ body {
1019
1027
  }
1020
1028
 
1021
1029
  .training-button-start {
1022
- background: #00ff88;
1030
+ background: var(--color-success);
1023
1031
  }
1024
1032
 
1025
1033
  .training-button-stop {
1026
- background: #ff4444;
1034
+ background: var(--color-korean-south);
1027
1035
  }
1028
1036
 
1029
1037
  .training-button:hover {
@@ -1033,52 +1041,52 @@ body {
1033
1041
 
1034
1042
  /* Training Mode Selector */
1035
1043
  .mode-button {
1036
- background: rgba(45, 45, 45, 0.5);
1037
- border: 2px solid rgba(0, 255, 255, 0.4);
1044
+ background: color-mix(in srgb, var(--color-bg-light) 50%, transparent);
1045
+ border: 2px solid color-mix(in srgb, var(--color-primary-cyan) 40%, transparent);
1038
1046
  border-radius: 8px;
1039
1047
  padding: 10px;
1040
1048
  cursor: pointer;
1041
1049
  text-align: left;
1042
- color: #ffffff;
1050
+ color: var(--color-text-primary);
1043
1051
  transition: all 0.2s ease;
1044
1052
  }
1045
1053
 
1046
1054
  .mode-button.selected {
1047
- background: rgba(0, 255, 255, 0.25);
1048
- border-color: #00ffff;
1049
- box-shadow: 0 0 12px rgba(0, 255, 255, 0.5);
1055
+ background: color-mix(in srgb, var(--color-primary-cyan) 25%, transparent);
1056
+ border-color: var(--color-primary-cyan);
1057
+ box-shadow: 0 0 12px color-mix(in srgb, var(--color-primary-cyan) 50%, transparent);
1050
1058
  }
1051
1059
 
1052
1060
  .mode-button:not(.selected):hover {
1053
- background: rgba(64, 64, 64, 0.7);
1054
- border-color: #00ffff;
1061
+ background: color-mix(in srgb, var(--color-gray-300) 70%, transparent);
1062
+ border-color: var(--color-primary-cyan);
1055
1063
  transform: scale(1.02);
1056
1064
  }
1057
1065
 
1058
1066
  .mode-button:focus-visible {
1059
- outline: 2px solid #00ffff;
1067
+ outline: 2px solid var(--color-primary-cyan);
1060
1068
  outline-offset: 2px;
1061
- box-shadow: 0 0 12px rgba(0, 255, 255, 0.8);
1069
+ box-shadow: 0 0 12px color-mix(in srgb, var(--color-primary-cyan) 80%, transparent);
1062
1070
  }
1063
1071
 
1064
1072
  /* Vital Point Button */
1065
1073
  .vital-point-button {
1066
- background: rgba(45, 45, 45, 0.5);
1067
- border: 2px solid rgba(255, 170, 0, 0.5);
1074
+ background: color-mix(in srgb, var(--color-bg-light) 50%, transparent);
1075
+ border: 2px solid color-mix(in srgb, var(--color-korean-center) 50%, transparent);
1068
1076
  border-radius: 8px;
1069
1077
  padding: 8px;
1070
1078
  cursor: pointer;
1071
1079
  text-align: left;
1072
- color: #ffffff;
1080
+ color: var(--color-text-primary);
1073
1081
  transition: all 0.2s ease;
1074
1082
  }
1075
1083
 
1076
1084
  .vital-point-button.selected {
1077
- background: rgba(255, 170, 0, 0.3);
1085
+ background: color-mix(in srgb, var(--color-korean-center) 30%, transparent);
1078
1086
  }
1079
1087
 
1080
1088
  .vital-point-button:not(.selected):hover {
1081
- background: rgba(64, 64, 64, 0.7);
1089
+ background: color-mix(in srgb, var(--color-gray-300) 70%, transparent);
1082
1090
  }
1083
1091
 
1084
1092
  /* Training Feedback Animation - Fast and snappy */
@@ -1097,12 +1105,12 @@ body {
1097
1105
  }
1098
1106
 
1099
1107
  .training-feedback {
1100
- background: rgba(0, 0, 0, 0.9);
1101
- border: 3px solid #ffd700;
1108
+ background: color-mix(in srgb, var(--color-primary-black) 90%, transparent);
1109
+ border: 3px solid var(--color-primary-gold);
1102
1110
  border-radius: 16px;
1103
- color: #ffd700;
1111
+ color: var(--color-primary-gold);
1104
1112
  text-align: center;
1105
- box-shadow: 0 0 30px rgba(255, 215, 0, 0.5);
1113
+ box-shadow: 0 0 30px color-mix(in srgb, var(--color-primary-gold) 50%, transparent);
1106
1114
  animation: feedbackPulse 0.4s ease-out;
1107
1115
  min-width: 200px;
1108
1116
  }
@@ -1133,7 +1141,7 @@ body {
1133
1141
  width: 12px;
1134
1142
  height: 12px;
1135
1143
  border-radius: 50%;
1136
- background: #00ff88;
1144
+ background: var(--color-success);
1137
1145
  }
1138
1146
 
1139
1147
  .status-indicator.active {
@@ -1141,6 +1149,6 @@ body {
1141
1149
  }
1142
1150
 
1143
1151
  .status-indicator.inactive {
1144
- background: #888888;
1152
+ background: var(--color-gray-500);
1145
1153
  }
1146
1154
  /*$vite$:1*/
@@ -1,5 +1,5 @@
1
1
  /**
2
- * CombatScreen3D - Three.js-based combat screen
2
+ * CombatScreen3D - Three.js-based combat screen (Black Trigram 흑괘)
3
3
  *
4
4
  * Maintains all existing combat logic and state management
5
5
  * Uses Html overlays for UI and 3D meshes for game objects
@@ -78,7 +78,7 @@ import { Html } from "@react-three/drei";
78
78
  import { Bloom, EffectComposer, Noise, Vignette } from "@react-three/postprocessing";
79
79
  //#region src/components/screens/combat/CombatScreen3D.tsx
80
80
  /**
81
- * CombatScreen3D - Three.js-based combat screen
81
+ * CombatScreen3D - Three.js-based combat screen (Black Trigram 흑괘)
82
82
  *
83
83
  * Maintains all existing combat logic and state management
84
84
  * Uses Html overlays for UI and 3D meshes for game objects
@@ -1415,7 +1415,7 @@ var CombatScreen3D = ({ players, onPlayerUpdate, currentRound, timeRemaining, is
1415
1415
  width: `${width}px`,
1416
1416
  height: `${height}px`,
1417
1417
  position: "relative",
1418
- backgroundColor: "#0a0a0a",
1418
+ backgroundColor: toHexColor(KOREAN_COLORS.UI_BACKGROUND_DARK),
1419
1419
  overflow: "hidden"
1420
1420
  },
1421
1421
  "data-testid": "combat-screen",