blacktrigram 0.7.85 → 0.7.87

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.
@@ -424,12 +424,15 @@
424
424
 
425
425
 
426
426
  /* Black Trigram - Korean Cyberpunk Martial Arts Styling */
427
+
427
428
  /* Note: CSS variables are now centralized in index.css */
429
+
428
430
  * {
429
431
  margin: 0;
430
432
  padding: 0;
431
433
  box-sizing: border-box;
432
434
  }
435
+
433
436
  body {
434
437
  font-family: var(--font-korean);
435
438
  background: linear-gradient(
@@ -441,6 +444,7 @@ body {
441
444
  overflow: hidden;
442
445
  user-select: none;
443
446
  }
447
+
444
448
  #root {
445
449
  width: 100vw;
446
450
  height: 100vh;
@@ -453,6 +457,7 @@ body {
453
457
  var(--color-bg-dark) 100%
454
458
  );
455
459
  }
460
+
456
461
  /* Korean Text Enhancement */
457
462
  .korean-text {
458
463
  font-family: var(--font-korean);
@@ -460,6 +465,7 @@ body {
460
465
  text-shadow: 0 0 8px var(--color-korean-east);
461
466
  letter-spacing: 0.02em;
462
467
  }
468
+
463
469
  .korean-title {
464
470
  font-family: var(--font-korean);
465
471
  font-weight: 700;
@@ -474,6 +480,7 @@ body {
474
480
  background-clip: text;
475
481
  text-shadow: 0 0 20px var(--color-accent-cyan);
476
482
  }
483
+
477
484
  .cyber-text {
478
485
  font-family: var(--font-cyber);
479
486
  color: var(--color-accent-cyan);
@@ -481,6 +488,7 @@ body {
481
488
  letter-spacing: 0.1em;
482
489
  text-shadow: 0 0 10px currentColor;
483
490
  }
491
+
484
492
  /* Cyberpunk UI Elements */
485
493
  .cyberpunk-border {
486
494
  border: 2px solid var(--color-accent-cyan);
@@ -494,6 +502,7 @@ body {
494
502
  box-shadow: 0 0 10px var(--color-accent-cyan),
495
503
  inset 0 0 10px color-mix(in srgb, var(--color-accent-cyan) 10%, transparent);
496
504
  }
505
+
497
506
  .cyberpunk-button {
498
507
  background: linear-gradient(
499
508
  135deg,
@@ -510,6 +519,7 @@ body {
510
519
  position: relative;
511
520
  overflow: hidden;
512
521
  }
522
+
513
523
  .cyberpunk-button:hover {
514
524
  background: linear-gradient(
515
525
  135deg,
@@ -519,6 +529,7 @@ body {
519
529
  box-shadow: 0 0 20px var(--color-accent-cyan);
520
530
  transform: translateY(-2px);
521
531
  }
532
+
522
533
  .cyberpunk-button:before {
523
534
  content: "";
524
535
  position: absolute;
@@ -534,9 +545,11 @@ body {
534
545
  );
535
546
  transition: left 0.5s;
536
547
  }
548
+
537
549
  .cyberpunk-button:hover:before {
538
550
  left: 100%;
539
551
  }
552
+
540
553
  /* Combat HUD Styling */
541
554
  .combat-hud {
542
555
  position: absolute;
@@ -551,6 +564,7 @@ body {
551
564
  padding: 1rem;
552
565
  border-bottom: 1px solid var(--color-accent-cyan);
553
566
  }
567
+
554
568
  .health-bar {
555
569
  background: var(--color-bg-dark);
556
570
  border: 1px solid var(--color-accent-cyan);
@@ -559,6 +573,7 @@ body {
559
573
  overflow: hidden;
560
574
  position: relative;
561
575
  }
576
+
562
577
  .health-bar-fill {
563
578
  background: linear-gradient(
564
579
  90deg,
@@ -570,6 +585,7 @@ body {
570
585
  transition: width 0.3s ease;
571
586
  box-shadow: 0 0 10px currentColor;
572
587
  }
588
+
573
589
  /* Animation Effects */
574
590
  @keyframes korean-glow {
575
591
  0%,
@@ -580,9 +596,11 @@ body {
580
596
  text-shadow: 0 0 20px var(--color-korean-east);
581
597
  }
582
598
  }
599
+
583
600
  .animate-glow {
584
601
  animation: korean-glow 2s ease-in-out infinite;
585
602
  }
603
+
586
604
  @keyframes combat-flash {
587
605
  0% {
588
606
  background-color: color-mix(in srgb, var(--color-danger) 10%, transparent);
@@ -594,9 +612,11 @@ body {
594
612
  background-color: color-mix(in srgb, var(--color-danger) 10%, transparent);
595
613
  }
596
614
  }
615
+
597
616
  .combat-flash {
598
617
  animation: combat-flash 0.2s ease-in-out;
599
618
  }
619
+
600
620
  /* Responsive Design */
601
621
  @media (max-width: 768px) {
602
622
  .korean-title {
@@ -637,6 +657,7 @@ body {
637
657
  z-index: 500;
638
658
  }
639
659
  }
660
+
640
661
  /* Tablet optimizations */
641
662
  @media (min-width: 768px) and (max-width: 1024px) {
642
663
  .app-container canvas {
@@ -644,6 +665,7 @@ body {
644
665
  height: 100vh !important;
645
666
  }
646
667
  }
668
+
647
669
  /* Desktop optimizations */
648
670
  @media (min-width: 1024px) {
649
671
  .app-container {
@@ -651,6 +673,7 @@ body {
651
673
  align-items: center;
652
674
  }
653
675
  }
676
+
654
677
  /* Loading and Error States */
655
678
  .loading-spinner {
656
679
  border: 2px solid var(--color-bg-medium);
@@ -661,6 +684,7 @@ body {
661
684
  animation: spin 1s linear infinite;
662
685
  margin: 0 auto;
663
686
  }
687
+
664
688
  @keyframes spin {
665
689
  0% {
666
690
  transform: rotate(0deg);
@@ -669,6 +693,7 @@ body {
669
693
  transform: rotate(360deg);
670
694
  }
671
695
  }
696
+
672
697
  .error-message {
673
698
  color: var(--color-danger);
674
699
  background: color-mix(in srgb, var(--color-danger) 10%, transparent);
@@ -678,6 +703,7 @@ body {
678
703
  margin: 1rem 0;
679
704
  font-family: var(--font-korean);
680
705
  }
706
+
681
707
  /* Accessibility */
682
708
  .sr-only {
683
709
  position: absolute;
@@ -690,6 +716,7 @@ body {
690
716
  white-space: nowrap;
691
717
  border: 0;
692
718
  }
719
+
693
720
  /* High contrast mode support - Comprehensive accessibility */
694
721
  @media (prefers-contrast: high) {
695
722
  :root {
@@ -716,6 +743,7 @@ body {
716
743
  border-width: 3px;
717
744
  }
718
745
  }
746
+
719
747
  /* Reduced motion support */
720
748
  @media (prefers-reduced-motion: reduce) {
721
749
  *,
@@ -726,6 +754,7 @@ body {
726
754
  transition-duration: 0.01ms !important;
727
755
  }
728
756
  }
757
+
729
758
  /* Reset default Vite styles */
730
759
  #root {
731
760
  width: 100vw;
@@ -734,6 +763,7 @@ body {
734
763
  padding: 0;
735
764
  overflow: hidden;
736
765
  }
766
+
737
767
  /* Full-screen game container */
738
768
  .app-container {
739
769
  position: fixed;
@@ -764,11 +794,13 @@ body {
764
794
  transform: translateZ(0);
765
795
  backface-visibility: hidden;
766
796
  }
797
+
767
798
  /* Hide any old game elements */
768
799
  .app-container h1,
769
800
  .app-container .instructions {
770
801
  display: none !important;
771
802
  }
803
+
772
804
  /* Korean typography support */
773
805
  /* NOTE: overflow: hidden on body prevents the page itself from scrolling.
774
806
  * This is intentional for a full-screen game. Individual screens that need
@@ -784,6 +816,7 @@ body {
784
816
  width: 100vw;
785
817
  height: 100vh;
786
818
  }
819
+
787
820
  /* Traditional Korean color scheme enhancements */
788
821
  .app-container::before {
789
822
  content: "";
@@ -800,12 +833,14 @@ body {
800
833
  pointer-events: none;
801
834
  z-index: -1;
802
835
  }
836
+
803
837
  /* Performance optimizations for WebGL */
804
838
  .app-container canvas {
805
839
  will-change: transform;
806
840
  transform: translateZ(0);
807
841
  backface-visibility: hidden;
808
842
  }
843
+
809
844
  /* Responsive adjustments for different screen sizes */
810
845
  @media (max-width: 768px) {
811
846
  .app-container {
@@ -818,6 +853,7 @@ body {
818
853
  height: 100vh !important;
819
854
  }
820
855
  }
856
+
821
857
  @media (max-width: 375px) {
822
858
  .app-container {
823
859
  width: 100vw !important;
@@ -829,17 +865,22 @@ body {
829
865
  height: 100vh !important;
830
866
  }
831
867
  }
868
+
832
869
  /* Remove any legacy Vite template styles that might interfere */
833
870
  .logo {
834
871
  display: none !important;
835
872
  }
873
+
836
874
  .card {
837
875
  display: none !important;
838
876
  }
877
+
839
878
  .read-the-docs {
840
879
  display: none !important;
841
880
  }
881
+
842
882
  /* Note: Theme variables are now centralized in index.css */
883
+
843
884
  /* Performance optimizations for mobile */
844
885
  @media (max-width: 768px) {
845
886
  .app-container {
@@ -851,6 +892,7 @@ body {
851
892
  overflow: hidden;
852
893
  }
853
894
  }
895
+
854
896
  /* High DPI display support */
855
897
  @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 2dppx) {
856
898
  .app-container canvas {
@@ -858,6 +900,7 @@ body {
858
900
  image-rendering: crisp-edges;
859
901
  }
860
902
  }
903
+
861
904
  .app {
862
905
  width: 100vw;
863
906
  height: 100vh;
@@ -871,6 +914,7 @@ body {
871
914
  * The game container is made focusable for keyboard input capture. */
872
915
  outline: none;
873
916
  }
917
+
874
918
  .app-header {
875
919
  padding: 1rem 2rem;
876
920
  background: color-mix(in srgb, var(--color-bg-dark) 90%, transparent);
@@ -880,30 +924,35 @@ body {
880
924
  align-items: center;
881
925
  box-shadow: 0 2px 10px color-mix(in srgb, var(--color-primary-gold) 30%, transparent);
882
926
  }
927
+
883
928
  .app-title {
884
929
  margin: 0;
885
930
  display: flex;
886
931
  flex-direction: column;
887
932
  gap: 0.25rem;
888
933
  }
934
+
889
935
  .korean-title {
890
936
  font-size: 1.8rem;
891
937
  font-weight: bold;
892
938
  color: var(--color-primary-gold);
893
939
  text-shadow: 2px 2px 4px color-mix(in srgb, var(--color-primary-black) 80%, transparent);
894
940
  }
941
+
895
942
  .english-title {
896
943
  font-size: 1rem;
897
944
  color: var(--color-info);
898
945
  font-style: italic;
899
946
  text-shadow: 1px 1px 2px color-mix(in srgb, var(--color-primary-black) 60%, transparent);
900
947
  }
948
+
901
949
  .app-status {
902
950
  display: flex;
903
951
  flex-direction: column;
904
952
  gap: 0.5rem;
905
953
  text-align: right;
906
954
  }
955
+
907
956
  .phase-indicator,
908
957
  .time-indicator {
909
958
  padding: 0.25rem 0.75rem;
@@ -911,16 +960,19 @@ body {
911
960
  font-size: 0.9rem;
912
961
  font-weight: bold;
913
962
  }
963
+
914
964
  .phase-indicator {
915
965
  background: color-mix(in srgb, var(--color-primary-gold) 20%, transparent);
916
966
  color: var(--color-primary-gold);
917
967
  border: 1px solid var(--color-primary-gold);
918
968
  }
969
+
919
970
  .time-indicator {
920
971
  background: color-mix(in srgb, var(--color-info) 20%, transparent);
921
972
  color: var(--color-info);
922
973
  border: 1px solid var(--color-info);
923
974
  }
975
+
924
976
  .app-main {
925
977
  flex: 1;
926
978
  display: flex;
@@ -928,6 +980,7 @@ body {
928
980
  align-items: center;
929
981
  overflow: hidden;
930
982
  }
983
+
931
984
  .app-debug {
932
985
  background: color-mix(in srgb, var(--color-primary-black) 80%, transparent);
933
986
  color: #00ff00;
@@ -936,18 +989,21 @@ body {
936
989
  max-height: 200px;
937
990
  overflow-y: auto;
938
991
  }
992
+
939
993
  .app-debug summary {
940
994
  padding: 0.5rem;
941
995
  cursor: pointer;
942
996
  background: color-mix(in srgb, var(--color-success) 10%, transparent);
943
997
  border-bottom: 1px solid #00ff00;
944
998
  }
999
+
945
1000
  .app-debug pre {
946
1001
  padding: 1rem;
947
1002
  margin: 0;
948
1003
  white-space: pre-wrap;
949
1004
  word-wrap: break-word;
950
1005
  }
1006
+
951
1007
  /* Responsive design */
952
1008
  @media (max-width: 768px) {
953
1009
  .app-header {
@@ -969,6 +1025,7 @@ body {
969
1025
  gap: 1rem;
970
1026
  }
971
1027
  }
1028
+
972
1029
  /* Korean traditional design elements */
973
1030
  .app::before {
974
1031
  content: "";
@@ -990,6 +1047,7 @@ body {
990
1047
  pointer-events: none;
991
1048
  z-index: -1;
992
1049
  }
1050
+
993
1051
  /* Loading screen styles */
994
1052
  .loading-screen {
995
1053
  display: flex;
@@ -1000,10 +1058,12 @@ body {
1000
1058
  color: #ffffff;
1001
1059
  font-family: "Noto Sans KR", Arial, sans-serif;
1002
1060
  }
1061
+
1003
1062
  .loading-content {
1004
1063
  text-align: center;
1005
1064
  animation: pulse 2s ease-in-out infinite;
1006
1065
  }
1066
+
1007
1067
  .korean-title {
1008
1068
  font-size: 2.5rem;
1009
1069
  font-weight: 700;
@@ -1011,12 +1071,14 @@ body {
1011
1071
  margin-bottom: 1rem;
1012
1072
  text-shadow: 0 0 20px color-mix(in srgb, var(--color-primary-gold) 50%, transparent);
1013
1073
  }
1074
+
1014
1075
  .english-subtitle {
1015
1076
  font-size: 1.2rem;
1016
1077
  font-weight: 300;
1017
1078
  color: #00ffff;
1018
1079
  margin: 0;
1019
1080
  }
1081
+
1020
1082
  /* Error state styles */
1021
1083
  .error-state {
1022
1084
  display: flex;
@@ -1029,10 +1091,12 @@ body {
1029
1091
  font-family: "Noto Sans KR", Arial, sans-serif;
1030
1092
  text-align: center;
1031
1093
  }
1094
+
1032
1095
  .error-state h1 {
1033
1096
  color: #ff4444;
1034
1097
  margin-bottom: 2rem;
1035
1098
  }
1099
+
1036
1100
  .error-state button {
1037
1101
  padding: 1rem 2rem;
1038
1102
  background: #ffd700;
@@ -1043,9 +1107,11 @@ body {
1043
1107
  cursor: pointer;
1044
1108
  transition: background-color 0.3s ease;
1045
1109
  }
1110
+
1046
1111
  .error-state button:hover {
1047
1112
  background: #ffed4e;
1048
1113
  }
1114
+
1049
1115
  @keyframes pulse {
1050
1116
  0%,
1051
1117
  100% {
@@ -1055,18 +1121,22 @@ body {
1055
1121
  opacity: 0.7;
1056
1122
  }
1057
1123
  }
1124
+
1058
1125
  /* App-specific styles for Black Trigram */
1126
+
1059
1127
  .app-container {
1060
1128
  width: 100%;
1061
1129
  height: 100%;
1062
1130
  position: relative;
1063
1131
  background: linear-gradient(45deg, #0a0a0a, #1a1a1e);
1064
1132
  }
1133
+
1065
1134
  .game-canvas {
1066
1135
  width: 100%;
1067
1136
  height: 100%;
1068
1137
  display: block;
1069
1138
  }
1139
+
1070
1140
  .loading-screen {
1071
1141
  position: absolute;
1072
1142
  top: 50%;
@@ -1075,6 +1145,7 @@ body {
1075
1145
  text-align: center;
1076
1146
  color: var(--color-primary-cyan);
1077
1147
  }
1148
+
1078
1149
  .error-screen {
1079
1150
  position: absolute;
1080
1151
  top: 50%;
@@ -1086,6 +1157,7 @@ body {
1086
1157
  border: 1px solid #ff4136;
1087
1158
  background: color-mix(in srgb, var(--color-danger) 10%, transparent);
1088
1159
  }
1160
+
1089
1161
  /* Fix UI overlay positioning to not interfere with canvas visibility */
1090
1162
  .test-overlay {
1091
1163
  pointer-events: none;
@@ -1097,12 +1169,14 @@ body {
1097
1169
  z-index: 100; /* Reduced from 500 to ensure canvas visibility */
1098
1170
  background: transparent;
1099
1171
  }
1172
+
1100
1173
  /* Fix button z-index to be lower than canvas but still interactive */
1101
1174
  .test-overlay button {
1102
1175
  z-index: 50 !important; /* Reduced from 400 */
1103
1176
  pointer-events: auto;
1104
1177
  position: absolute;
1105
1178
  }
1179
+
1106
1180
  /* Ensure buttons don't cover the center of the canvas */
1107
1181
  .training-button {
1108
1182
  top: 60% !important; /* Move down from 50% */
@@ -1111,6 +1185,7 @@ body {
1111
1185
  width: auto !important;
1112
1186
  max-width: 200px !important;
1113
1187
  }
1188
+
1114
1189
  .combat-button {
1115
1190
  top: 70% !important; /* Move down from 60% */
1116
1191
  left: 5% !important;
@@ -1118,6 +1193,7 @@ body {
1118
1193
  width: auto !important;
1119
1194
  max-width: 200px !important;
1120
1195
  }
1196
+
1121
1197
  /* Mobile specific adjustments */
1122
1198
  @media (max-width: 768px) {
1123
1199
  .training-button {
@@ -1138,6 +1214,7 @@ body {
1138
1214
  padding: 10px 16px;
1139
1215
  }
1140
1216
  }
1217
+
1141
1218
  @media (max-width: 375px) {
1142
1219
  .training-button {
1143
1220
  top: 70% !important;
@@ -21,7 +21,7 @@ import { useCallback, useEffect, useMemo, useRef, useState } from "react";
21
21
  import { jsx, jsxs } from "react/jsx-runtime";
22
22
  import { Canvas } from "@react-three/fiber";
23
23
  //#region src/components/screens/intro/IntroScreen3D.tsx
24
- var APP_VERSION = "0.7.85";
24
+ var APP_VERSION = "0.7.87";
25
25
  var MENU_ITEMS = [
26
26
  {
27
27
  mode: GameMode.VERSUS,
@@ -183,7 +183,7 @@ var SplashScreen = ({ onStart, width, height }) => {
183
183
  }),
184
184
  /* @__PURE__ */ jsxs("div", {
185
185
  role: "contentinfo",
186
- "aria-label": `Application version 0.7.85`,
186
+ "aria-label": `Application version 0.7.87`,
187
187
  style: {
188
188
  position: "absolute",
189
189
  bottom: "20px",
@@ -192,7 +192,7 @@ var SplashScreen = ({ onStart, width, height }) => {
192
192
  fontSize: "10px",
193
193
  zIndex: 1
194
194
  },
195
- children: ["v", "0.7.85"]
195
+ children: ["v", "0.7.87"]
196
196
  })
197
197
  ]
198
198
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "blacktrigram",
3
- "version": "0.7.85",
3
+ "version": "0.7.87",
4
4
  "description": "Black Trigram (흑괘) - Korean Martial Arts Combat Simulator. Reusable game systems, combat mechanics, animation framework, and Korean martial arts data built with React, Three.js, and TypeScript.",
5
5
  "type": "module",
6
6
  "main": "./lib/index.js",
@@ -189,7 +189,7 @@
189
189
  "three": "0.185.1"
190
190
  },
191
191
  "devDependencies": {
192
- "@aws-sdk/client-bedrock-runtime": "3.1086.0",
192
+ "@aws-sdk/client-bedrock-runtime": "3.1088.0",
193
193
  "@eslint/js": "10.0.1",
194
194
  "@react-three/drei": "10.7.7",
195
195
  "@react-three/fiber": "9.6.1",
@@ -217,14 +217,14 @@
217
217
  "globals": "17.7.0",
218
218
  "jest-axe": "10.0.0",
219
219
  "jsdom": "29.1.1",
220
- "knip": "6.26.0",
220
+ "knip": "6.27.0",
221
221
  "license-compliance": "3.0.1",
222
222
  "mermaid": "11.16.0",
223
223
  "mocha-junit-reporter": "2.2.1",
224
224
  "mochawesome": "7.1.4",
225
225
  "mochawesome-merge": "5.1.1",
226
226
  "mochawesome-report-generator": "6.3.2",
227
- "openai": "6.46.0",
227
+ "openai": "6.47.0",
228
228
  "playwright": "1.61.1",
229
229
  "postprocessing": "6.39.2",
230
230
  "react": "19.2.7",
@@ -242,7 +242,7 @@
242
242
  "typescript": "npm:@typescript/typescript6@6.0.2",
243
243
  "typescript-7": "npm:typescript@7.0.1-rc",
244
244
  "typescript-eslint": "8.64.0",
245
- "vite": "8.1.4",
245
+ "vite": "8.1.5",
246
246
  "vite-bundle-analyzer": "1.3.9",
247
247
  "vite-tsconfig-paths": "6.1.1",
248
248
  "vitest": "4.1.10"