blacktrigram 0.7.10 → 0.7.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.
- package/lib/App2.js +2 -3
- package/lib/App2.js.map +1 -1
- package/lib/assets/index.css +94 -94
- package/lib/components/index.d.ts +9 -0
- package/lib/components/index.d.ts.map +1 -1
- package/lib/components/index.js +8 -3
- package/lib/components/index.js.map +1 -1
- package/lib/components/screens/combat/CombatScreen3D.js +1 -9
- package/lib/components/screens/combat/CombatScreen3D.js.map +1 -1
- package/lib/components/screens/combat/components/controls/PauseMenu.js +1 -1
- package/lib/components/screens/combat/components/effects/BloodDecals3D.js +0 -1
- package/lib/components/screens/combat/components/effects/BloodDecals3D.js.map +1 -1
- package/lib/components/screens/combat/components/effects/BloodLossOverlayHtml.js +0 -1
- package/lib/components/screens/combat/components/effects/BloodLossOverlayHtml.js.map +1 -1
- package/lib/components/screens/combat/components/effects/BloodParticles3D.js +0 -1
- package/lib/components/screens/combat/components/effects/BloodParticles3D.js.map +1 -1
- package/lib/components/screens/combat/components/effects/PainVignette.js +0 -1
- package/lib/components/screens/combat/components/effects/PainVignette.js.map +1 -1
- package/lib/components/screens/combat/components/effects/TraumaOverlay3D.js +0 -1
- package/lib/components/screens/combat/components/effects/TraumaOverlay3D.js.map +1 -1
- package/lib/components/screens/combat/components/hud/DifficultyIndicator.js +0 -1
- package/lib/components/screens/combat/components/hud/DifficultyIndicator.js.map +1 -1
- package/lib/components/screens/combat/components/hud/MobileControlsWrapper.js +0 -1
- package/lib/components/screens/combat/components/hud/MobileControlsWrapper.js.map +1 -1
- package/lib/components/screens/combat/hooks/useAICombat.js +0 -3
- package/lib/components/screens/combat/hooks/useAICombat.js.map +1 -1
- package/lib/components/screens/combat/hooks/useCombatActions.js +2 -7
- package/lib/components/screens/combat/hooks/useCombatActions.js.map +1 -1
- package/lib/components/screens/combat/hooks/useCombatAttackMovement.js +0 -1
- package/lib/components/screens/combat/hooks/useCombatAttackMovement.js.map +1 -1
- package/lib/components/screens/controls/ControlsScreen3D.js +0 -3
- package/lib/components/screens/controls/ControlsScreen3D.js.map +1 -1
- package/lib/components/screens/controls/components/ControlBindingsOverlayHtml.js +0 -1
- package/lib/components/screens/controls/components/ControlBindingsOverlayHtml.js.map +1 -1
- package/lib/components/screens/controls/components/GamepadVisualization3D.js +0 -1
- package/lib/components/screens/controls/components/GamepadVisualization3D.js.map +1 -1
- package/lib/components/screens/controls/components/InteractiveControlDemoOverlayHtml.js +0 -1
- package/lib/components/screens/controls/components/InteractiveControlDemoOverlayHtml.js.map +1 -1
- package/lib/components/screens/controls/components/Key3D.js +0 -1
- package/lib/components/screens/controls/components/Key3D.js.map +1 -1
- package/lib/components/screens/endscreen/components/DefeatAnimation3D.js +0 -1
- package/lib/components/screens/endscreen/components/DefeatAnimation3D.js.map +1 -1
- package/lib/components/screens/endscreen/components/MatchStatisticsDisplayOverlayHtml.js +0 -1
- package/lib/components/screens/endscreen/components/MatchStatisticsDisplayOverlayHtml.js.map +1 -1
- package/lib/components/screens/endscreen/components/PerformanceBreakdownOverlayHtml.js +0 -1
- package/lib/components/screens/endscreen/components/PerformanceBreakdownOverlayHtml.js.map +1 -1
- package/lib/components/screens/endscreen/components/VictoryAnimation3D.js +0 -1
- package/lib/components/screens/endscreen/components/VictoryAnimation3D.js.map +1 -1
- package/lib/components/screens/intro/IntroScreen3D.js +1 -2
- package/lib/components/screens/intro/IntroScreen3D.js.map +1 -1
- package/lib/components/screens/intro/components/AbilityListOverlayHtml.js +0 -1
- package/lib/components/screens/intro/components/AbilityListOverlayHtml.js.map +1 -1
- package/lib/components/screens/intro/components/ArchetypeCardGridOverlayHtml.js +0 -1
- package/lib/components/screens/intro/components/ArchetypeCardGridOverlayHtml.js.map +1 -1
- package/lib/components/screens/intro/components/MenuButtonsOverlayHtml.js +0 -1
- package/lib/components/screens/intro/components/MenuButtonsOverlayHtml.js.map +1 -1
- package/lib/components/screens/intro/components/MenuSectionOverlayHtml.js +0 -1
- package/lib/components/screens/intro/components/MenuSectionOverlayHtml.js.map +1 -1
- package/lib/components/screens/intro/components/StatBarOverlayHtml.js +0 -1
- package/lib/components/screens/intro/components/StatBarOverlayHtml.js.map +1 -1
- package/lib/components/screens/philosophy/PhilosophyScreen3D.js +0 -2
- package/lib/components/screens/philosophy/PhilosophyScreen3D.js.map +1 -1
- package/lib/components/screens/training/TrainingScreen3D.js +1 -8
- package/lib/components/screens/training/TrainingScreen3D.js.map +1 -1
- package/lib/components/screens/training/components/AnatomyControlsOverlayHtml.js +0 -1
- package/lib/components/screens/training/components/AnatomyControlsOverlayHtml.js.map +1 -1
- package/lib/components/screens/training/components/AnatomyOverlay3D.js +0 -1
- package/lib/components/screens/training/components/AnatomyOverlay3D.js.map +1 -1
- package/lib/components/screens/training/components/FootPlacementMarkers3D.js +0 -1
- package/lib/components/screens/training/components/FootPlacementMarkers3D.js.map +1 -1
- package/lib/components/screens/training/components/FootworkDrillsOverlayHtml.js +0 -1
- package/lib/components/screens/training/components/FootworkDrillsOverlayHtml.js.map +1 -1
- package/lib/components/screens/training/components/HitFeedbackEffect3D.js +0 -1
- package/lib/components/screens/training/components/HitFeedbackEffect3D.js.map +1 -1
- package/lib/components/screens/training/components/TrainingControlsOverlayHtml.js +0 -1
- package/lib/components/screens/training/components/TrainingControlsOverlayHtml.js.map +1 -1
- package/lib/components/screens/training/components/TrainingDummy3D.js +0 -1
- package/lib/components/screens/training/components/TrainingDummy3D.js.map +1 -1
- package/lib/components/screens/training/components/TrainingFeedbackOverlayHtml.js +0 -1
- package/lib/components/screens/training/components/TrainingFeedbackOverlayHtml.js.map +1 -1
- package/lib/components/screens/training/components/TrainingModeSelectorOverlayHtml.js +0 -1
- package/lib/components/screens/training/components/TrainingModeSelectorOverlayHtml.js.map +1 -1
- package/lib/components/screens/training/components/TrainingStatsOverlayHtml.js +0 -1
- package/lib/components/screens/training/components/TrainingStatsOverlayHtml.js.map +1 -1
- package/lib/components/screens/training/components/VitalPointMarker3D.js +0 -1
- package/lib/components/screens/training/components/VitalPointMarker3D.js.map +1 -1
- package/lib/components/screens/training/components/VitalPointTrainingOverlayHtml.js +0 -1
- package/lib/components/screens/training/components/VitalPointTrainingOverlayHtml.js.map +1 -1
- package/lib/components/screens/training/hooks/useAttackMovement.js +0 -1
- package/lib/components/screens/training/hooks/useAttackMovement.js.map +1 -1
- package/lib/components/screens/training/hooks/useTrainingActions.js +1 -3
- package/lib/components/screens/training/hooks/useTrainingActions.js.map +1 -1
- package/lib/components/shared/base/BaseButton.js +0 -1
- package/lib/components/shared/base/BaseButton.js.map +1 -1
- package/lib/components/shared/base/BaseText.js +0 -1
- package/lib/components/shared/base/BaseText.js.map +1 -1
- package/lib/components/shared/base/useKoreanTheme.js +0 -1
- package/lib/components/shared/base/useKoreanTheme.js.map +1 -1
- package/lib/components/shared/debug/PerformanceDebugOverlayHtml.js +0 -2
- package/lib/components/shared/debug/PerformanceDebugOverlayHtml.js.map +1 -1
- package/lib/components/shared/mobile/ActionButtons.js +1 -2
- package/lib/components/shared/mobile/ActionButtons.js.map +1 -1
- package/lib/components/shared/mobile/GestureRecognizerPure.js +0 -1
- package/lib/components/shared/mobile/GestureRecognizerPure.js.map +1 -1
- package/lib/components/shared/mobile/HapticController.js +1 -1
- package/lib/components/shared/mobile/MobileControlsPure.js +0 -1
- package/lib/components/shared/mobile/MobileControlsPure.js.map +1 -1
- package/lib/components/shared/mobile/StanceWheelPure.js +1 -2
- package/lib/components/shared/mobile/StanceWheelPure.js.map +1 -1
- package/lib/components/shared/mobile/VirtualDPad.js +1 -2
- package/lib/components/shared/mobile/VirtualDPad.js.map +1 -1
- package/lib/components/shared/three/anatomy/BoneAttachedMuscles.js +1 -2
- package/lib/components/shared/three/anatomy/BoneAttachedMuscles.js.map +1 -1
- package/lib/components/shared/three/anatomy/BoneRenderer.js +0 -1
- package/lib/components/shared/three/anatomy/BoneRenderer.js.map +1 -1
- package/lib/components/shared/three/anatomy/Face3D.js +0 -1
- package/lib/components/shared/three/anatomy/Face3D.js.map +1 -1
- package/lib/components/shared/three/anatomy/Foot3D.js +0 -1
- package/lib/components/shared/three/anatomy/Foot3D.js.map +1 -1
- package/lib/components/shared/three/anatomy/Hand3D.js +0 -1
- package/lib/components/shared/three/anatomy/Hand3D.js.map +1 -1
- package/lib/components/shared/three/effects/ActionFeedback.js +0 -1
- package/lib/components/shared/three/effects/ActionFeedback.js.map +1 -1
- package/lib/components/shared/three/effects/DamageNumbers.js +0 -1
- package/lib/components/shared/three/effects/DamageNumbers.js.map +1 -1
- package/lib/components/shared/three/effects/HitEffects3D.js +1 -2
- package/lib/components/shared/three/effects/HitEffects3D.js.map +1 -1
- package/lib/components/shared/three/effects/PlayerStateIndicators.js +0 -1
- package/lib/components/shared/three/effects/PlayerStateIndicators.js.map +1 -1
- package/lib/components/shared/three/effects/StanceSymbol3D.js +0 -1
- package/lib/components/shared/three/effects/StanceSymbol3D.js.map +1 -1
- package/lib/components/shared/three/effects/StanceTransitionEffect.js +0 -1
- package/lib/components/shared/three/effects/StanceTransitionEffect.js.map +1 -1
- package/lib/components/shared/three/effects/VitalPointMarkers3D.js +0 -1
- package/lib/components/shared/three/effects/VitalPointMarkers3D.js.map +1 -1
- package/lib/components/shared/three/indicators/GuardIndicator.js +0 -2
- package/lib/components/shared/three/indicators/GuardIndicator.js.map +1 -1
- package/lib/components/shared/three/indicators/StanceChangeIndicator.js +0 -1
- package/lib/components/shared/three/indicators/StanceChangeIndicator.js.map +1 -1
- package/lib/components/shared/three/models/SkeletalPlayer3D.js +1 -3
- package/lib/components/shared/three/models/SkeletalPlayer3D.js.map +1 -1
- package/lib/components/shared/three/optimization/AdaptiveQuality.js +1 -1
- package/lib/components/shared/three/scene/BackgroundScene3D.js +0 -1
- package/lib/components/shared/three/scene/BackgroundScene3D.js.map +1 -1
- package/lib/components/shared/three/scene/CombatArena3D.js +0 -1
- package/lib/components/shared/three/scene/CombatArena3D.js.map +1 -1
- package/lib/components/shared/three/scene/KoreanSignage3D.js +0 -1
- package/lib/components/shared/three/scene/KoreanSignage3D.js.map +1 -1
- package/lib/components/shared/three/ui/ArchetypeCard.js +0 -1
- package/lib/components/shared/three/ui/ArchetypeCard.js.map +1 -1
- package/lib/components/shared/three/ui/BodyPartHealthDisplay.js +5 -6
- package/lib/components/shared/three/ui/BodyPartHealthDisplay.js.map +1 -1
- package/lib/components/shared/three/ui/BreathingIndicator2.js +3 -4
- package/lib/components/shared/three/ui/BreathingIndicator2.js.map +1 -1
- package/lib/components/shared/three/ui/CombatReadinessBar.js +0 -1
- package/lib/components/shared/three/ui/CombatReadinessBar.js.map +1 -1
- package/lib/components/shared/three/ui/ComboCounter.js +0 -1
- package/lib/components/shared/three/ui/ComboCounter.js.map +1 -1
- package/lib/components/shared/three/ui/HealthBar.js +0 -1
- package/lib/components/shared/three/ui/HealthBar.js.map +1 -1
- package/lib/components/shared/three/ui/KoreanButton.js +0 -1
- package/lib/components/shared/three/ui/KoreanButton.js.map +1 -1
- package/lib/components/shared/three/ui/KoreanPanel.js +0 -1
- package/lib/components/shared/three/ui/KoreanPanel.js.map +1 -1
- package/lib/components/shared/three/ui/KoreanText.js +0 -1
- package/lib/components/shared/three/ui/KoreanText.js.map +1 -1
- package/lib/components/shared/three/ui/MenuList.js +0 -1
- package/lib/components/shared/three/ui/MenuList.js.map +1 -1
- package/lib/components/shared/three/ui/ProgressBar.js +0 -1
- package/lib/components/shared/three/ui/ProgressBar.js.map +1 -1
- package/lib/components/shared/three/ui/SpeedIndicatorHUD.js +0 -1
- package/lib/components/shared/three/ui/SpeedIndicatorHUD.js.map +1 -1
- package/lib/components/shared/three/ui/StaminaBar.js +0 -1
- package/lib/components/shared/three/ui/StaminaBar.js.map +1 -1
- package/lib/components/shared/three/ui/TechniqueCard.d.ts.map +1 -1
- package/lib/components/shared/three/ui/TechniqueCard.js +27 -33
- package/lib/components/shared/three/ui/TechniqueCard.js.map +1 -1
- package/lib/components/shared/three/ui/VitalPointOverlayControlsHtml.d.ts.map +1 -1
- package/lib/components/shared/three/ui/VitalPointOverlayControlsHtml.js +57 -60
- package/lib/components/shared/three/ui/VitalPointOverlayControlsHtml.js.map +1 -1
- package/lib/components/shared/ui/BaseHUDContainer.js +0 -1
- package/lib/components/shared/ui/BaseHUDContainer.js.map +1 -1
- package/lib/components/shared/ui/CombatTimer.js +0 -1
- package/lib/components/shared/ui/CombatTimer.js.map +1 -1
- package/lib/components/shared/ui/ErrorModal.js +0 -2
- package/lib/components/shared/ui/ErrorModal.js.map +1 -1
- package/lib/components/shared/ui/SplashScreen.js +10 -11
- package/lib/components/shared/ui/SplashScreen.js.map +1 -1
- package/lib/components/shared/ui/VitalPointOverlayControlsPure.d.ts.map +1 -1
- package/lib/components/shared/ui/VitalPointOverlayControlsPure.js +57 -63
- package/lib/components/shared/ui/VitalPointOverlayControlsPure.js.map +1 -1
- package/lib/components/shared/ui/VolumeControl.js +7 -8
- package/lib/components/shared/ui/VolumeControl.js.map +1 -1
- package/lib/components/shared/ui/shared/ConfirmDialog.js +0 -2
- package/lib/components/shared/ui/shared/ConfirmDialog.js.map +1 -1
- package/lib/components/ui/combat/BalanceIndicatorOverlayHtml.js +0 -1
- package/lib/components/ui/combat/BalanceIndicatorOverlayHtml.js.map +1 -1
- package/lib/data/archetypeClothing.js +0 -1
- package/lib/data/archetypeClothing.js.map +1 -1
- package/lib/data/archetypePhysicalAttributes.js +0 -1
- package/lib/data/archetypePhysicalAttributes.js.map +1 -1
- package/lib/data/techniqueMappings.js +1 -1
- package/lib/data/techniques.js +0 -1
- package/lib/data/techniques.js.map +1 -1
- package/lib/hooks/index.js +1 -1
- package/lib/hooks/useHandPoseTransitions.js +0 -1
- package/lib/hooks/useHandPoseTransitions.js.map +1 -1
- package/lib/hooks/useMuscleActivation.js +1 -2
- package/lib/hooks/useMuscleActivation.js.map +1 -1
- package/lib/hooks/usePlayerAnimation.js +0 -1
- package/lib/hooks/usePlayerAnimation.js.map +1 -1
- package/lib/hooks/useSkeletalAnimation.js +0 -1
- package/lib/hooks/useSkeletalAnimation.js.map +1 -1
- package/lib/index.js +27 -1
- package/lib/systems/CombatSystem.js +1 -6
- package/lib/systems/CombatSystem.js.map +1 -1
- package/lib/systems/TrigramSystem.js +0 -1
- package/lib/systems/TrigramSystem.js.map +1 -1
- package/lib/systems/ai/AIPersonality.js +0 -1
- package/lib/systems/ai/AIPersonality.js.map +1 -1
- package/lib/systems/ai/ArchetypeEnforcer.js +0 -1
- package/lib/systems/ai/ArchetypeEnforcer.js.map +1 -1
- package/lib/systems/ai/ComboSystem.js +0 -2
- package/lib/systems/ai/ComboSystem.js.map +1 -1
- package/lib/systems/ai/DecisionTree.js +0 -1
- package/lib/systems/ai/DecisionTree.js.map +1 -1
- package/lib/systems/ai/TrainingAI.js +0 -1
- package/lib/systems/ai/TrainingAI.js.map +1 -1
- package/lib/systems/animation/builders/AnimationBuilder.js +0 -1
- package/lib/systems/animation/builders/AnimationBuilder.js.map +1 -1
- package/lib/systems/animation/builders/HandPoses.js +1 -1
- package/lib/systems/animation/builders/KoreanGuardPositions.js +157 -238
- package/lib/systems/animation/builders/KoreanGuardPositions.js.map +1 -1
- package/lib/systems/animation/builders/SkeletonRig.js +1 -1
- package/lib/systems/animation/catalogs/AttackAnimations.js +1 -1
- package/lib/systems/animation/catalogs/BasicAnimations.js +1 -1
- package/lib/systems/animation/catalogs/ComboAnimations.js +1 -1
- package/lib/systems/animation/catalogs/DarkOpsAnimations.js +1 -1
- package/lib/systems/animation/catalogs/DefensiveAnimations.js +1 -1
- package/lib/systems/animation/catalogs/ElbowKneeAnimations.js +1 -1
- package/lib/systems/animation/catalogs/FootworkSkeletalAnimations.js +1 -1
- package/lib/systems/animation/catalogs/GanStanceAnimations.js +1 -1
- package/lib/systems/animation/catalogs/GeonStanceAnimations.js +1 -1
- package/lib/systems/animation/catalogs/GrapplingAnimations.js +1 -1
- package/lib/systems/animation/catalogs/KickAnimations.js +1 -1
- package/lib/systems/animation/catalogs/LiStanceAnimations.js +0 -1
- package/lib/systems/animation/catalogs/LiStanceAnimations.js.map +1 -1
- package/lib/systems/animation/catalogs/MovementAnimations.js +1 -1
- package/lib/systems/animation/catalogs/PunchAnimations.js +1 -1
- package/lib/systems/animation/catalogs/RecoveryAnimations.js +1 -1
- package/lib/systems/animation/catalogs/StanceAnimations.js +1 -1
- package/lib/systems/animation/catalogs/StanceAttackAnimations.js +1 -1
- package/lib/systems/animation/catalogs/StanceIdleAnimations.js +1 -1
- package/lib/systems/animation/catalogs/StanceLocomotionAnimations.js +1 -1
- package/lib/systems/animation/catalogs/StepSkeletalAnimations.js +1 -1
- package/lib/systems/animation/catalogs/TaeStanceAnimations.js +1 -1
- package/lib/systems/animation/core/AnimationHitTiming.js +1 -2
- package/lib/systems/animation/core/AnimationHitTiming.js.map +1 -1
- package/lib/systems/animation/core/AnimationOptimizations.js +1 -1
- package/lib/systems/animation/core/AnimationPriority.js +1 -1
- package/lib/systems/animation/core/AnimationRegistry.js +0 -2
- package/lib/systems/animation/core/AnimationRegistry.js.map +1 -1
- package/lib/systems/animation/core/AnimationTransitions.js +1 -1
- package/lib/systems/animation/core/TechniqueAnimationMapper.js +1 -2
- package/lib/systems/animation/core/TechniqueAnimationMapper.js.map +1 -1
- package/lib/systems/animation/core/TechniqueAnimationMapping.js +0 -1
- package/lib/systems/animation/core/TechniqueAnimationMapping.js.map +1 -1
- package/lib/systems/animation/systems/AdvancedJointMovements.js +1 -1
- package/lib/systems/animation/systems/BodyFacingSystem.js +1 -1
- package/lib/systems/animation/systems/MuscleActivation.js +1 -1
- package/lib/systems/bodypart/BodyPartDamageIntegration.js +177 -2
- package/lib/systems/bodypart/BodyPartDamageIntegration.js.map +1 -1
- package/lib/systems/bodypart/BodyPartHealthSystem.js +0 -1
- package/lib/systems/bodypart/BodyPartHealthSystem.js.map +1 -1
- package/lib/systems/bodypart/BodyPartPositionMapping.js +50 -1
- package/lib/systems/bodypart/BodyPartPositionMapping.js.map +1 -1
- package/lib/systems/bodypart/CombatInjuryIntegration.js +15 -2
- package/lib/systems/bodypart/CombatInjuryIntegration.js.map +1 -1
- package/lib/systems/bodypart/InjuryIntegration.js +46 -0
- package/lib/systems/bodypart/InjuryIntegration.js.map +1 -0
- package/lib/systems/bodypart/InjuryTracker.js +27 -2
- package/lib/systems/bodypart/InjuryTracker.js.map +1 -1
- package/lib/systems/breathing/BreathingDisruptionSystem.js +0 -1
- package/lib/systems/breathing/BreathingDisruptionSystem.js.map +1 -1
- package/lib/systems/breathing/feedback.js +96 -3
- package/lib/systems/breathing/feedback.js.map +1 -1
- package/lib/systems/breathing/integration.js +38 -2
- package/lib/systems/breathing/integration.js.map +1 -1
- package/lib/systems/combat/BalanceSystem.js +0 -2
- package/lib/systems/combat/BalanceSystem.js.map +1 -1
- package/lib/systems/combat/ConsciousnessSystem.js +0 -2
- package/lib/systems/combat/ConsciousnessSystem.js.map +1 -1
- package/lib/systems/combat/GrappleSystem.js +0 -1
- package/lib/systems/combat/GrappleSystem.js.map +1 -1
- package/lib/systems/combat/PainResponseSystem.js +0 -1
- package/lib/systems/combat/PainResponseSystem.js.map +1 -1
- package/lib/systems/combat/painConsciousnessUtils.js +0 -1
- package/lib/systems/combat/painConsciousnessUtils.js.map +1 -1
- package/lib/systems/index.d.ts +3 -0
- package/lib/systems/index.d.ts.map +1 -1
- package/lib/systems/index.js +69 -5
- package/lib/systems/index.js.map +1 -1
- package/lib/systems/movement/InjuryMovementModifier.js +32 -4
- package/lib/systems/movement/InjuryMovementModifier.js.map +1 -1
- package/lib/systems/movement/integration.js +103 -0
- package/lib/systems/movement/integration.js.map +1 -0
- package/lib/systems/physics/AttackMovementPhysics.js +0 -1
- package/lib/systems/physics/AttackMovementPhysics.js.map +1 -1
- package/lib/systems/physics/MovementPhysics.js +1 -0
- package/lib/systems/physics/MovementPhysics.js.map +1 -1
- package/lib/systems/physics/PhysicalReachCalculator.js +1 -2
- package/lib/systems/physics/PhysicalReachCalculator.js.map +1 -1
- package/lib/systems/physics/SpeedModifierSystem.js +1 -0
- package/lib/systems/physics/SpeedModifierSystem.js.map +1 -1
- package/lib/systems/trigram/KoreanTechniques.js +0 -1
- package/lib/systems/trigram/KoreanTechniques.js.map +1 -1
- package/lib/systems/trigram/techniques/DarkOpsTechniques.js +0 -1
- package/lib/systems/trigram/techniques/DarkOpsTechniques.js.map +1 -1
- package/lib/systems/trigram/techniques/GamTechniques.js +0 -1
- package/lib/systems/trigram/techniques/GamTechniques.js.map +1 -1
- package/lib/systems/trigram/techniques/GanTechniques.js +0 -1
- package/lib/systems/trigram/techniques/GanTechniques.js.map +1 -1
- package/lib/systems/trigram/techniques/GeonTechniques.js +0 -1
- package/lib/systems/trigram/techniques/GeonTechniques.js.map +1 -1
- package/lib/systems/trigram/techniques/GonTechniques.js +0 -1
- package/lib/systems/trigram/techniques/GonTechniques.js.map +1 -1
- package/lib/systems/trigram/techniques/JinTechniques.js +0 -1
- package/lib/systems/trigram/techniques/JinTechniques.js.map +1 -1
- package/lib/systems/trigram/techniques/LiTechniques.js +0 -1
- package/lib/systems/trigram/techniques/LiTechniques.js.map +1 -1
- package/lib/systems/trigram/techniques/SonTechniques.js +0 -1
- package/lib/systems/trigram/techniques/SonTechniques.js.map +1 -1
- package/lib/systems/trigram/techniques/TaeTechniques.js +0 -1
- package/lib/systems/trigram/techniques/TaeTechniques.js.map +1 -1
- package/lib/systems/trigram/types.js +0 -1
- package/lib/systems/trigram/types.js.map +1 -1
- package/lib/systems/types.js +0 -1
- package/lib/systems/types.js.map +1 -1
- package/lib/systems/vitalpoint/DamageCalculator.js +0 -1
- package/lib/systems/vitalpoint/DamageCalculator.js.map +1 -1
- package/lib/systems/vitalpoint/KoreanAnatomy.js +0 -1
- package/lib/systems/vitalpoint/KoreanAnatomy.js.map +1 -1
- package/lib/systems/vitalpoint/VitalPointsData.js +0 -1
- package/lib/systems/vitalpoint/VitalPointsData.js.map +1 -1
- package/lib/types/AccessibilityTypes.js +28 -1
- package/lib/types/AccessibilityTypes.js.map +1 -1
- package/lib/types/PhysicsTypes.js +208 -2
- package/lib/types/PhysicsTypes.js.map +1 -1
- package/lib/types/facial.js +93 -4
- package/lib/types/facial.js.map +1 -1
- package/lib/types/index.d.ts +8 -0
- package/lib/types/index.d.ts.map +1 -1
- package/lib/types/index.js +42 -0
- package/lib/types/index.js.map +1 -1
- package/lib/types/physicsConstants.js +180 -1
- package/lib/types/physicsConstants.js.map +1 -1
- package/lib/utils/accessibility.js +0 -2
- package/lib/utils/accessibility.js.map +1 -1
- package/lib/utils/htmlOverlayHelpers.js +0 -1
- package/lib/utils/htmlOverlayHelpers.js.map +1 -1
- package/lib/utils/inputSystem.js +1 -2
- package/lib/utils/inputSystem.js.map +1 -1
- package/lib/utils/koreanThemeHelpers.js +0 -1
- package/lib/utils/koreanThemeHelpers.js.map +1 -1
- package/lib/utils/mobileUIUtils.js +0 -1
- package/lib/utils/mobileUIUtils.js.map +1 -1
- package/lib/utils/playerUtils.js +0 -2
- package/lib/utils/playerUtils.js.map +1 -1
- package/lib/utils/skeletonScaling.js +0 -1
- package/lib/utils/skeletonScaling.js.map +1 -1
- package/lib/utils/stanceHelpers.js +0 -1
- package/lib/utils/stanceHelpers.js.map +1 -1
- package/lib/utils/visualEffects.js +0 -1
- package/lib/utils/visualEffects.js.map +1 -1
- package/package.json +24 -11
- package/lib/components/screens/combat/components/hud/index.js +0 -4
- package/lib/components/screens/combat/components/index.js +0 -23
- package/lib/components/screens/combat/helpers/index.js +0 -2
- package/lib/components/screens/combat/index.js +0 -25
- package/lib/components/screens/endscreen/components/index.js +0 -8
- package/lib/components/screens/endscreen/index.js +0 -10
- package/lib/components/screens/training/components/DamageNumber3D.js +0 -6
- package/lib/components/screens/training/components/TrainingAICharacter3D.js +0 -6
- package/lib/components/screens/training/components/TrainingArena3D.js +0 -5
- package/lib/components/screens/training/components/TrainingHitEffects3D.js +0 -6
- package/lib/components/screens/training/components/hud/index.js +0 -4
- package/lib/components/screens/training/components/index.js +0 -19
- package/lib/components/screens/training/index.js +0 -16
- package/lib/components/shared/base/AccessibilityProvider.js +0 -71
- package/lib/components/shared/base/AccessibilityProvider.js.map +0 -1
- package/lib/components/shared/base/index.js +0 -6
- package/lib/components/shared/mobile/index.js +0 -7
- package/lib/components/shared/three/index.js +0 -9
- package/lib/components/shared/three/optimization/InstancedGeometry.js +0 -3
- package/lib/components/shared/three/optimization/LODSystem.js +0 -3
- package/lib/components/shared/three/optimization/index.js +0 -3
- package/lib/systems/ai/index.js +0 -7
- package/lib/systems/animation/builders/AnimationFactoryPresets.js +0 -234
- package/lib/systems/animation/builders/AnimationFactoryPresets.js.map +0 -1
- package/lib/systems/animation/builders/index.js +0 -13
- package/lib/systems/animation/catalogs/GamStanceAnimations.js +0 -9
- package/lib/systems/animation/catalogs/GamStanceAnimations.js.map +0 -1
- package/lib/systems/animation/catalogs/GonGuardPoses.js +0 -6
- package/lib/systems/animation/catalogs/GonGuardPoses.js.map +0 -1
- package/lib/systems/animation/catalogs/GonStanceAnimations.js +0 -9
- package/lib/systems/animation/catalogs/GonStanceAnimations.js.map +0 -1
- package/lib/systems/animation/catalogs/GonTechniqueAnimations.js +0 -13
- package/lib/systems/animation/catalogs/GonTechniqueAnimations.js.map +0 -1
- package/lib/systems/animation/catalogs/StepAnimations.js +0 -73
- package/lib/systems/animation/catalogs/StepAnimations.js.map +0 -1
- package/lib/systems/animation/catalogs/index.js +0 -36
- package/lib/systems/animation/core/TrigramAnimationMapping.js +0 -6
- package/lib/systems/animation/core/TrigramStanceTransitions.js +0 -8
- package/lib/systems/animation/core/TrigramStanceTransitions.js.map +0 -1
- package/lib/systems/animation/core/index.js +0 -16
- package/lib/systems/animation/index.js +0 -63
- package/lib/systems/animation/systems/HeadMovements.js +0 -2
- package/lib/systems/animation/systems/RecoveryVisualization.js +0 -1
- package/lib/systems/animation/systems/index.js +0 -7
- package/lib/systems/animation/utils/AnimationMirror.js +0 -30
- package/lib/systems/animation/utils/AnimationMirror.js.map +0 -1
- package/lib/systems/bodypart/index.js +0 -8
- package/lib/systems/breathing/index.js +0 -3
- package/lib/systems/combat/index.js +0 -10
- package/lib/systems/physics/index.js +0 -7
- package/lib/systems/trigram/index.js +0 -17
- package/lib/systems/vitalpoint/index.js +0 -5
- package/lib/utils/EventManager.js +0 -1
- package/lib/utils/eventConstants.js +0 -3
- package/lib/utils/eventConstants.js.map +0 -1
- package/lib/utils/performance/index.js +0 -3
package/lib/App2.js
CHANGED
|
@@ -3,12 +3,11 @@ import { GameMode, PlayerArchetype } from "./types/common.js";
|
|
|
3
3
|
import { createPlayerFromArchetype } from "./utils/playerUtils.js";
|
|
4
4
|
import { clearPlatformCache, detectPlatform } from "./utils/deviceDetection.js";
|
|
5
5
|
import CombatScreen3D from "./components/screens/combat/CombatScreen3D.js";
|
|
6
|
-
/* empty css */
|
|
7
|
-
import ControlsScreen3D from "./components/screens/controls/ControlsScreen3D.js";
|
|
8
6
|
import { EndScreen3D } from "./components/screens/endscreen/EndScreen3D.js";
|
|
9
|
-
import "./components/screens/
|
|
7
|
+
import ControlsScreen3D from "./components/screens/controls/ControlsScreen3D.js";
|
|
10
8
|
import IntroScreen3D from "./components/screens/intro/IntroScreen3D.js";
|
|
11
9
|
import PhilosophyScreen3D from "./components/screens/philosophy/PhilosophyScreen3D.js";
|
|
10
|
+
/* empty css */
|
|
12
11
|
import { PerformanceDebugOverlayHtml } from "./components/shared/debug/PerformanceDebugOverlayHtml.js";
|
|
13
12
|
import ErrorModal from "./components/shared/ui/ErrorModal.js";
|
|
14
13
|
import { LoadingState } from "./components/shared/ui/LoadingState.js";
|
package/lib/App2.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"App2.js","names":[],"sources":["../src/App.tsx"],"sourcesContent":["import {\n lazy,\n Suspense,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport \"./App.css\";\n// Main application component - manages game state and screen navigation\nimport { useAudio } from \"./audio/AudioProvider\";\nimport { CombatScreen3D as CombatScreen } from \"./components/screens/combat/CombatScreen3D\";\nimport { ControlsScreen3D as ControlsScreen } from \"./components/screens/controls/ControlsScreen3D\";\nimport { EndScreen3D } from \"./components/screens/endscreen\";\nimport { IntroScreen3D as IntroScreen } from \"./components/screens/intro/IntroScreen3D\";\nimport { PhilosophyScreen3D as PhilosophyScreen } from \"./components/screens/philosophy/PhilosophyScreen3D\";\nimport { PerformanceDebugOverlayHtml } from \"./components/shared/debug/PerformanceDebugOverlayHtml\";\nimport { ErrorModal } from \"./components/shared/ui/ErrorModal\";\nimport { LoadingState } from \"./components/shared/ui/LoadingState\";\nimport { SplashScreen } from \"./components/shared/ui/SplashScreen\";\nimport { PlayerState } from \"./systems\";\nimport { MatchStatistics } from \"./systems/combat\";\nimport { GameMode, PlayerArchetype } from \"./types/common\";\nimport { clearPlatformCache, detectPlatform } from \"./utils/deviceDetection\";\nimport { createPlayerFromArchetype } from \"./utils/playerUtils\";\n\n// Lazy load heavy screens\nconst TrainingScreen = lazy(() =>\n import(\"./components/screens/training/TrainingScreen3D\").then((m) => ({\n default: m.TrainingScreen3D,\n })),\n);\n\n// 150ms delay to allow WebGL context cleanup between full-screen 3D scene transitions\nconst SCREEN_TRANSITION_DELAY_MS = 150;\n// 100ms delay for lighter menu/UI transitions where WebGL teardown/re-init cost is lower\nconst MENU_TRANSITION_DELAY_MS = 100;\n\nfunction App() {\n const [gameMode, setGameMode] = useState<GameMode | null>(null);\n const [selectedArchetype, setSelectedArchetype] = useState<PlayerArchetype>(\n PlayerArchetype.MUSA,\n );\n const [isGameActive, setIsGameActive] = useState(false);\n const [gameWinner, setGameWinner] = useState<PlayerState | null>(null);\n const [matchStats, setMatchStats] = useState<MatchStatistics | null>(null);\n const [appReady, setAppReady] = useState(false);\n const [showSplash, setShowSplash] = useState(true);\n const [showAudioError, setShowAudioError] = useState(false);\n // Performance debug overlay toggle (P key in dev mode)\n const [showPerformanceDebug, setShowPerformanceDebug] = useState(false);\n // Transition state to allow WebGL cleanup between screens\n const [isTransitioning, setIsTransitioning] = useState(false);\n const pendingModeRef = useRef<{\n mode: GameMode;\n archetype?: PlayerArchetype;\n } | null>(null);\n\n // Combat players state - managed here so updates persist\n const [combatPlayers, setCombatPlayers] = useState<PlayerState[]>([]);\n\n const audio = useAudio();\n\n // Add responsive screen size detection with proper device detection\n // Uses user-agent detection first for high-res mobile devices\n const [screenSize, setScreenSize] = useState(() => {\n const platform = detectPlatform();\n return {\n width: window.innerWidth,\n height: window.innerHeight,\n isMobile: platform.isMobile,\n isTablet: platform.isTablet,\n isDesktop: platform.isDesktop,\n };\n });\n\n useEffect(() => {\n // Define handlers outside async function for proper cleanup\n const handleGlobalError = (e: ErrorEvent) => {\n console.error(\"Global error:\", e.error);\n };\n\n const handleUnhandledRejection = (e: PromiseRejectionEvent) => {\n console.error(\"Unhandled promise rejection:\", e.reason);\n if (\n e.reason?.message?.includes(\"Failed to load\") ||\n e.reason?.message?.includes(\"no supported source\")\n ) {\n e.preventDefault();\n }\n };\n\n const initializeApp = async () => {\n try {\n window.focus();\n\n window.addEventListener(\"error\", handleGlobalError);\n window.addEventListener(\"unhandledrejection\", handleUnhandledRejection);\n\n // PHASE 2: Performance optimization initialization\n console.log(\"🔧 Initializing animation performance optimizations...\");\n\n // 1. Prewarm object pools for animation optimization\n // This eliminates GC pressure from ~1,344 allocations per frame\n const { ThreeObjectPools } = await import(\"./utils/threeObjectPool\");\n ThreeObjectPools.prewarmAll();\n const poolStatus = ThreeObjectPools.getStatus();\n console.log(\" ✓ Object pools prewarmed:\", poolStatus);\n\n // 2. Precompute all animations for 90%+ cache hit rate\n const { precomputeAnimation } =\n await import(\"./systems/animation/core/AnimationOptimizations\");\n const { ALL_ANIMATIONS } =\n await import(\"./systems/animation/core/AnimationRegistry\");\n\n let precomputedCount = 0;\n ALL_ANIMATIONS.forEach((animation) => {\n // Precompute at 60fps for smooth playback\n // Use animation.name as the unique identifier\n precomputeAnimation(animation.name, animation, 60);\n precomputedCount++;\n });\n console.log(` ✓ Precomputed ${precomputedCount} animations at 60fps`);\n\n console.log(\n \"✅ Animation optimizations ready (expect <5ms frame time, 90%+ cache hit)\",\n );\n\n setAppReady(true);\n console.log(\"🎯 Black Trigram app initialized\");\n } catch (error) {\n console.error(\"Failed to initialize app:\", error);\n setAppReady(true);\n }\n };\n\n initializeApp();\n\n // Cleanup global event handlers to prevent memory leaks\n return () => {\n window.removeEventListener(\"error\", handleGlobalError);\n window.removeEventListener(\n \"unhandledrejection\",\n handleUnhandledRejection,\n );\n };\n }, []);\n\n // Shared audio initialization logic for splash and retry\n const initializeAudioWithRetry = useCallback(async () => {\n if (!appReady) {\n console.warn(\"App not ready yet, please wait...\");\n return false;\n }\n try {\n await audio.initializeAudio();\n console.log(\"🎵 Audio initialized\");\n return true;\n } catch (error) {\n console.error(\"Failed to initialize audio:\", error);\n return false;\n }\n }, [audio, appReady]);\n\n // Handle splash screen start - initialize audio on user gesture\n const handleSplashStart = useCallback(async () => {\n setShowAudioError(false);\n const success = await initializeAudioWithRetry();\n if (success) {\n setShowSplash(false);\n } else {\n setShowAudioError(true);\n }\n }, [initializeAudioWithRetry]);\n\n const handleAudioErrorRetry = useCallback(async () => {\n setShowAudioError(false);\n const success = await initializeAudioWithRetry();\n if (success) {\n setShowSplash(false);\n } else {\n setShowAudioError(true);\n }\n }, [initializeAudioWithRetry]);\n\n const handleAudioErrorContinue = useCallback(() => {\n // Continue without sound\n setShowAudioError(false);\n setShowSplash(false);\n console.log(\"Continuing without audio (silent mode)\");\n }, []);\n\n // ✅ SIMPLIFIED: Handle game mode selection directly\n const handleGameStart = useCallback(\n (mode: GameMode, archetype?: PlayerArchetype) => {\n console.log(\"🎮 Starting game mode:\", mode, \"with archetype:\", archetype);\n\n // Store pending mode and start transition to allow WebGL cleanup\n pendingModeRef.current = { mode, archetype };\n setIsTransitioning(true);\n\n // Clear current mode first (unmounts Canvas)\n setGameMode(null);\n setIsGameActive(false);\n\n // After brief delay, mount new screen\n // Increased delay to allow proper WebGL context cleanup\n setTimeout(() => {\n const pending = pendingModeRef.current;\n if (!pending) return;\n\n // ✅ NEW: Handle controls and philosophy as separate modes\n if (\n pending.mode === GameMode.CONTROLS ||\n pending.mode === GameMode.PHILOSOPHY\n ) {\n setGameMode(pending.mode);\n setIsGameActive(false); // These are not game modes, just screens\n } else {\n setGameMode(pending.mode);\n setIsGameActive(true);\n }\n\n setGameWinner(null);\n setMatchStats(null);\n if (pending.archetype) {\n setSelectedArchetype(pending.archetype);\n }\n\n setIsTransitioning(false);\n pendingModeRef.current = null;\n }, SCREEN_TRANSITION_DELAY_MS); // Delay for WebGL cleanup\n },\n [],\n );\n\n const handleGameEnd = useCallback(\n (winner: number) => {\n setIsGameActive(false);\n setGameWinner(createPlayerFromArchetype(selectedArchetype, winner));\n // Reset combat players for next match\n setCombatPlayers([]);\n\n setMatchStats({\n totalDamageDealt: 150,\n totalDamageTaken: 100,\n criticalHits: 3,\n vitalPointHits: 2,\n techniquesUsed: 8,\n perfectStrikes: 1,\n consecutiveWins: 1,\n matchDuration: 120,\n totalMatches: 1,\n maxRounds: 3,\n winner: winner,\n totalRounds: 2,\n currentRound: 2,\n timeRemaining: 0,\n combatEvents: [],\n finalScore: {\n player1: winner === 0 ? 2 : 0,\n player2: winner === 1 ? 2 : 0,\n },\n roundsWon: {\n player1: winner === 0 ? 2 : 0,\n player2: winner === 1 ? 2 : 0,\n },\n player1: {\n wins: winner === 0 ? 1 : 0,\n losses: winner === 0 ? 0 : 1,\n hitsTaken: 5,\n hitsLanded: 8,\n totalDamageDealt: winner === 0 ? 150 : 100,\n totalDamageReceived: winner === 0 ? 100 : 150,\n techniques: [\"천둥벽력\", \"유수연타\"],\n perfectStrikes: winner === 0 ? 1 : 0,\n vitalPointHits: winner === 0 ? 2 : 1,\n consecutiveWins: winner === 0 ? 1 : 0,\n matchDuration: 120,\n },\n player2: {\n wins: winner === 1 ? 1 : 0,\n losses: winner === 1 ? 0 : 1,\n hitsTaken: 8,\n hitsLanded: 5,\n totalDamageDealt: winner === 1 ? 150 : 100,\n totalDamageReceived: winner === 1 ? 100 : 150,\n techniques: [\"화염지창\", \"벽력일섬\"],\n perfectStrikes: winner === 1 ? 1 : 0,\n vitalPointHits: winner === 1 ? 2 : 1,\n consecutiveWins: winner === 1 ? 1 : 0,\n matchDuration: 120,\n },\n });\n },\n [selectedArchetype],\n );\n\n const handleReturnToMenu = useCallback(() => {\n // Use same transition logic for return to menu\n setIsTransitioning(true);\n setGameMode(null);\n setIsGameActive(false);\n setGameWinner(null);\n setMatchStats(null);\n // Reset combat players so they reinitialize next combat\n setCombatPlayers([]);\n setTimeout(() => setIsTransitioning(false), MENU_TRANSITION_DELAY_MS);\n }, []);\n\n const handleRematch = useCallback(() => {\n // Restart combat with same settings\n if (!gameMode) {\n console.error(\n \"Cannot rematch: gameMode is not set. This should not happen - EndScreen only renders when gameMode is set.\",\n { gameMode, isGameActive, gameWinner, matchStats }\n );\n return;\n }\n \n setIsTransitioning(true);\n setGameWinner(null);\n setMatchStats(null);\n // Reset combat players so they reinitialize for rematch\n setCombatPlayers([]);\n \n setTimeout(() => {\n setIsGameActive(true);\n setIsTransitioning(false);\n }, SCREEN_TRANSITION_DELAY_MS);\n // eslint-disable-next-line react-hooks/exhaustive-deps -- isGameActive, gameWinner, matchStats only used in error logging, not function logic\n }, [gameMode]);\n\n const handleViewTraining = useCallback(() => {\n // Navigate to training mode\n setIsTransitioning(true);\n setGameWinner(null);\n setMatchStats(null);\n setCombatPlayers([]);\n \n setTimeout(() => {\n setGameMode(GameMode.TRAINING);\n setIsGameActive(true);\n setIsTransitioning(false);\n }, SCREEN_TRANSITION_DELAY_MS);\n }, []);\n\n const renderCurrentScreen = () => {\n // Show loading during screen transitions\n if (isTransitioning) {\n return (\n <LoadingState\n progress={undefined}\n message=\"전환 중... | Transitioning...\"\n stage=\"assets\"\n />\n );\n }\n\n if (gameWinner && matchStats) {\n // ✅ NEW: Use EndScreen3D component\n return (\n <EndScreen3D\n winner={gameWinner}\n matchStats={matchStats}\n onReturnToMenu={handleReturnToMenu}\n onRematch={handleRematch}\n onViewReplay={handleViewTraining}\n width={screenSize.width}\n height={screenSize.height}\n />\n );\n }\n\n // ✅ NEW: Handle standalone screens first\n if (gameMode === GameMode.CONTROLS) {\n return (\n <ControlsScreen\n onReturnToMenu={handleReturnToMenu}\n width={screenSize.width}\n height={screenSize.height}\n />\n );\n }\n\n if (gameMode === GameMode.PHILOSOPHY) {\n return (\n <PhilosophyScreen\n onReturnToMenu={handleReturnToMenu}\n width={screenSize.width}\n height={screenSize.height}\n />\n );\n }\n\n // ✅ SIMPLIFIED: Only active game modes use isGameActive\n if (isGameActive && gameMode) {\n switch (gameMode) {\n case GameMode.TRAINING:\n return (\n <Suspense\n fallback={\n <LoadingState\n progress={undefined}\n message=\"훈련장 로딩 중... | Loading Training...\"\n stage=\"assets\"\n />\n }\n >\n <TrainingScreen\n onPlayerUpdate={(updates) => {\n console.log(\"Training player updated:\", updates);\n }}\n onReturnToMenu={handleReturnToMenu}\n width={screenSize.width}\n height={screenSize.height}\n initialArchetype={selectedArchetype}\n />\n </Suspense>\n );\n case GameMode.VERSUS:\n case GameMode.PRACTICE:\n // Initialize players if not already set\n if (combatPlayers.length === 0) {\n const player1 = createPlayerFromArchetype(selectedArchetype, 0);\n const player2 = createPlayerFromArchetype(\n PlayerArchetype.AMSALJA,\n 1,\n );\n // Use setTimeout to defer state update and avoid render-during-render\n setTimeout(() => setCombatPlayers([player1, player2]), 0);\n // Return loading state while players initialize\n return (\n <LoadingState\n progress={undefined}\n message=\"전투 준비 중... | Preparing Combat...\"\n stage=\"assets\"\n />\n );\n }\n\n return (\n <CombatScreen\n players={combatPlayers}\n currentRound={1}\n timeRemaining={180}\n isPaused={false}\n onPlayerUpdate={(playerIndex, updates) => {\n // Actually update the player state so damage persists!\n setCombatPlayers((prevPlayers) => {\n const newPlayers = [...prevPlayers];\n if (newPlayers[playerIndex]) {\n newPlayers[playerIndex] = {\n ...newPlayers[playerIndex],\n ...updates,\n };\n }\n return newPlayers;\n });\n }}\n onReturnToMenu={handleReturnToMenu}\n onGameEnd={handleGameEnd}\n gameMode={gameMode}\n width={screenSize.width}\n height={screenSize.height}\n />\n );\n default:\n return (\n <IntroScreen\n onMenuSelect={handleGameStart}\n onArchetypeSelect={setSelectedArchetype}\n selectedArchetype={selectedArchetype}\n width={screenSize.width}\n height={screenSize.height}\n />\n );\n }\n }\n\n // ✅ SIMPLIFIED: Default to intro screen\n return (\n <IntroScreen\n onMenuSelect={handleGameStart}\n onArchetypeSelect={setSelectedArchetype}\n selectedArchetype={selectedArchetype}\n width={screenSize.width}\n height={screenSize.height}\n />\n );\n };\n\n const containerRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n containerRef.current?.focus();\n }, [appReady]);\n\n useEffect(() => {\n const handleResize = () => {\n // Clear cached platform info to get fresh detection on resize\n clearPlatformCache();\n const platform = detectPlatform();\n setScreenSize({\n width: platform.screenWidth,\n height: platform.screenHeight,\n isMobile: platform.isMobile,\n isTablet: platform.isTablet,\n isDesktop: platform.isDesktop,\n });\n };\n\n window.addEventListener(\"resize\", handleResize);\n return () => window.removeEventListener(\"resize\", handleResize);\n }, []);\n\n // F9 key toggle for performance debug overlay (dev mode only)\n // Note: P key is reserved for Philosophy screen\n useEffect(() => {\n if (!import.meta.env.DEV) return;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === \"F9\") {\n e.preventDefault();\n setShowPerformanceDebug((prev) => !prev);\n }\n };\n\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => window.removeEventListener(\"keydown\", handleKeyDown);\n }, []);\n\n if (!appReady) {\n return (\n <div className=\"app loading\" data-testid=\"app-container\">\n <LoadingState\n progress={undefined}\n message=\"앱 초기화 중 | Initializing app...\"\n stage=\"initialization\"\n />\n </div>\n );\n }\n\n // Show splash screen first to get user gesture for audio\n if (showSplash) {\n return (\n <div className=\"app\" data-testid=\"app-container\">\n <SplashScreen\n onStart={handleSplashStart}\n width={screenSize.width}\n height={screenSize.height}\n />\n {showAudioError && (\n <ErrorModal\n message=\"오디오 초기화에 실패했습니다. 재시도하거나 소리 없이 계속할 수 있습니다. | Audio initialization failed. You can retry or continue without sound.\"\n onRetry={handleAudioErrorRetry}\n onContinue={handleAudioErrorContinue}\n />\n )}\n </div>\n );\n }\n\n return (\n <div\n className=\"app\"\n tabIndex={0}\n ref={containerRef}\n style={{\n outline: \"none\",\n width: \"100vw\",\n height: \"100vh\",\n overflow: \"hidden\",\n }}\n data-testid=\"app-container\"\n >\n {/* All screens now use Three.js or pure React/HTML */}\n {renderCurrentScreen()}\n\n {/* Performance debug overlay (dev mode only, toggle with P key) */}\n {showPerformanceDebug && <PerformanceDebugOverlayHtml />}\n </div>\n );\n}\n\nexport default App;\n"],"mappings":";;;;;;;;;;;;;;;;;;AA2BA,IAAM,iBAAiB,WACrB,OAAO,qDAAkD,MAAM,OAAO,EACpE,SAAS,EAAE,kBACZ,EAAE,CACJ;AAGD,IAAM,6BAA6B;AAEnC,IAAM,2BAA2B;AAEjC,SAAS,MAAM;CACb,MAAM,CAAC,UAAU,eAAe,SAA0B,KAAK;CAC/D,MAAM,CAAC,mBAAmB,wBAAwB,SAChD,gBAAgB,KACjB;CACD,MAAM,CAAC,cAAc,mBAAmB,SAAS,MAAM;CACvD,MAAM,CAAC,YAAY,iBAAiB,SAA6B,KAAK;CACtE,MAAM,CAAC,YAAY,iBAAiB,SAAiC,KAAK;CAC1E,MAAM,CAAC,UAAU,eAAe,SAAS,MAAM;CAC/C,MAAM,CAAC,YAAY,iBAAiB,SAAS,KAAK;CAClD,MAAM,CAAC,gBAAgB,qBAAqB,SAAS,MAAM;CAE3D,MAAM,CAAC,sBAAsB,2BAA2B,SAAS,MAAM;CAEvE,MAAM,CAAC,iBAAiB,sBAAsB,SAAS,MAAM;CAC7D,MAAM,iBAAiB,OAGb,KAAK;CAGf,MAAM,CAAC,eAAe,oBAAoB,SAAwB,EAAE,CAAC;CAErE,MAAM,QAAQ,UAAU;CAIxB,MAAM,CAAC,YAAY,iBAAiB,eAAe;EACjD,MAAM,WAAW,gBAAgB;AACjC,SAAO;GACL,OAAO,OAAO;GACd,QAAQ,OAAO;GACf,UAAU,SAAS;GACnB,UAAU,SAAS;GACnB,WAAW,SAAS;GACrB;GACD;AAEF,iBAAgB;EAEd,MAAM,qBAAqB,MAAkB;AAC3C,WAAQ,MAAM,iBAAiB,EAAE,MAAM;;EAGzC,MAAM,4BAA4B,MAA6B;AAC7D,WAAQ,MAAM,gCAAgC,EAAE,OAAO;AACvD,OACE,EAAE,QAAQ,SAAS,SAAS,iBAAiB,IAC7C,EAAE,QAAQ,SAAS,SAAS,sBAAsB,CAElD,GAAE,gBAAgB;;EAItB,MAAM,gBAAgB,YAAY;AAChC,OAAI;AACF,WAAO,OAAO;AAEd,WAAO,iBAAiB,SAAS,kBAAkB;AACnD,WAAO,iBAAiB,sBAAsB,yBAAyB;AAGvE,YAAQ,IAAI,yDAAyD;IAIrE,MAAM,EAAE,qBAAqB,MAAM,OAAO;AAC1C,qBAAiB,YAAY;IAC7B,MAAM,aAAa,iBAAiB,WAAW;AAC/C,YAAQ,IAAI,+BAA+B,WAAW;IAGtD,MAAM,EAAE,wBACN,MAAM,OAAO;IACf,MAAM,EAAE,mBACN,MAAM,OAAO;IAEf,IAAI,mBAAmB;AACvB,mBAAe,SAAS,cAAc;AAGpC,yBAAoB,UAAU,MAAM,WAAW,GAAG;AAClD;MACA;AACF,YAAQ,IAAI,mBAAmB,iBAAiB,sBAAsB;AAEtE,YAAQ,IACN,2EACD;AAED,gBAAY,KAAK;AACjB,YAAQ,IAAI,mCAAmC;YACxC,OAAO;AACd,YAAQ,MAAM,6BAA6B,MAAM;AACjD,gBAAY,KAAK;;;AAIrB,iBAAe;AAGf,eAAa;AACX,UAAO,oBAAoB,SAAS,kBAAkB;AACtD,UAAO,oBACL,sBACA,yBACD;;IAEF,EAAE,CAAC;CAGN,MAAM,2BAA2B,YAAY,YAAY;AACvD,MAAI,CAAC,UAAU;AACb,WAAQ,KAAK,oCAAoC;AACjD,UAAO;;AAET,MAAI;AACF,SAAM,MAAM,iBAAiB;AAC7B,WAAQ,IAAI,uBAAuB;AACnC,UAAO;WACA,OAAO;AACd,WAAQ,MAAM,+BAA+B,MAAM;AACnD,UAAO;;IAER,CAAC,OAAO,SAAS,CAAC;CAGrB,MAAM,oBAAoB,YAAY,YAAY;AAChD,oBAAkB,MAAM;AAExB,MADgB,MAAM,0BAA0B,CAE9C,eAAc,MAAM;MAEpB,mBAAkB,KAAK;IAExB,CAAC,yBAAyB,CAAC;CAE9B,MAAM,wBAAwB,YAAY,YAAY;AACpD,oBAAkB,MAAM;AAExB,MADgB,MAAM,0BAA0B,CAE9C,eAAc,MAAM;MAEpB,mBAAkB,KAAK;IAExB,CAAC,yBAAyB,CAAC;CAE9B,MAAM,2BAA2B,kBAAkB;AAEjD,oBAAkB,MAAM;AACxB,gBAAc,MAAM;AACpB,UAAQ,IAAI,yCAAyC;IACpD,EAAE,CAAC;CAGN,MAAM,kBAAkB,aACrB,MAAgB,cAAgC;AAC/C,UAAQ,IAAI,0BAA0B,MAAM,mBAAmB,UAAU;AAGzE,iBAAe,UAAU;GAAE;GAAM;GAAW;AAC5C,qBAAmB,KAAK;AAGxB,cAAY,KAAK;AACjB,kBAAgB,MAAM;AAItB,mBAAiB;GACf,MAAM,UAAU,eAAe;AAC/B,OAAI,CAAC,QAAS;AAGd,OACE,QAAQ,SAAS,SAAS,YAC1B,QAAQ,SAAS,SAAS,YAC1B;AACA,gBAAY,QAAQ,KAAK;AACzB,oBAAgB,MAAM;UACjB;AACL,gBAAY,QAAQ,KAAK;AACzB,oBAAgB,KAAK;;AAGvB,iBAAc,KAAK;AACnB,iBAAc,KAAK;AACnB,OAAI,QAAQ,UACV,sBAAqB,QAAQ,UAAU;AAGzC,sBAAmB,MAAM;AACzB,kBAAe,UAAU;KACxB,2BAA2B;IAEhC,EAAE,CACH;CAED,MAAM,gBAAgB,aACnB,WAAmB;AAClB,kBAAgB,MAAM;AACtB,gBAAc,0BAA0B,mBAAmB,OAAO,CAAC;AAEnE,mBAAiB,EAAE,CAAC;AAEpB,gBAAc;GACZ,kBAAkB;GAClB,kBAAkB;GAClB,cAAc;GACd,gBAAgB;GAChB,gBAAgB;GAChB,gBAAgB;GAChB,iBAAiB;GACjB,eAAe;GACf,cAAc;GACd,WAAW;GACH;GACR,aAAa;GACb,cAAc;GACd,eAAe;GACf,cAAc,EAAE;GAChB,YAAY;IACV,SAAS,WAAW,IAAI,IAAI;IAC5B,SAAS,WAAW,IAAI,IAAI;IAC7B;GACD,WAAW;IACT,SAAS,WAAW,IAAI,IAAI;IAC5B,SAAS,WAAW,IAAI,IAAI;IAC7B;GACD,SAAS;IACP,MAAM,WAAW,IAAI,IAAI;IACzB,QAAQ,WAAW,IAAI,IAAI;IAC3B,WAAW;IACX,YAAY;IACZ,kBAAkB,WAAW,IAAI,MAAM;IACvC,qBAAqB,WAAW,IAAI,MAAM;IAC1C,YAAY,CAAC,QAAQ,OAAO;IAC5B,gBAAgB,WAAW,IAAI,IAAI;IACnC,gBAAgB,WAAW,IAAI,IAAI;IACnC,iBAAiB,WAAW,IAAI,IAAI;IACpC,eAAe;IAChB;GACD,SAAS;IACP,MAAM,WAAW,IAAI,IAAI;IACzB,QAAQ,WAAW,IAAI,IAAI;IAC3B,WAAW;IACX,YAAY;IACZ,kBAAkB,WAAW,IAAI,MAAM;IACvC,qBAAqB,WAAW,IAAI,MAAM;IAC1C,YAAY,CAAC,QAAQ,OAAO;IAC5B,gBAAgB,WAAW,IAAI,IAAI;IACnC,gBAAgB,WAAW,IAAI,IAAI;IACnC,iBAAiB,WAAW,IAAI,IAAI;IACpC,eAAe;IAChB;GACF,CAAC;IAEJ,CAAC,kBAAkB,CACpB;CAED,MAAM,qBAAqB,kBAAkB;AAE3C,qBAAmB,KAAK;AACxB,cAAY,KAAK;AACjB,kBAAgB,MAAM;AACtB,gBAAc,KAAK;AACnB,gBAAc,KAAK;AAEnB,mBAAiB,EAAE,CAAC;AACpB,mBAAiB,mBAAmB,MAAM,EAAE,yBAAyB;IACpE,EAAE,CAAC;CAEN,MAAM,gBAAgB,kBAAkB;AAEtC,MAAI,CAAC,UAAU;AACb,WAAQ,MACN,8GACA;IAAE;IAAU;IAAc;IAAY;IAAY,CACnD;AACD;;AAGF,qBAAmB,KAAK;AACxB,gBAAc,KAAK;AACnB,gBAAc,KAAK;AAEnB,mBAAiB,EAAE,CAAC;AAEpB,mBAAiB;AACf,mBAAgB,KAAK;AACrB,sBAAmB,MAAM;KACxB,2BAA2B;IAE7B,CAAC,SAAS,CAAC;CAEd,MAAM,qBAAqB,kBAAkB;AAE3C,qBAAmB,KAAK;AACxB,gBAAc,KAAK;AACnB,gBAAc,KAAK;AACnB,mBAAiB,EAAE,CAAC;AAEpB,mBAAiB;AACf,eAAY,SAAS,SAAS;AAC9B,mBAAgB,KAAK;AACrB,sBAAmB,MAAM;KACxB,2BAA2B;IAC7B,EAAE,CAAC;CAEN,MAAM,4BAA4B;AAEhC,MAAI,gBACF,QACE,oBAAC,cAAD;GACE,UAAU,KAAA;GACV,SAAQ;GACR,OAAM;GACN,CAAA;AAIN,MAAI,cAAc,WAEhB,QACE,oBAAC,aAAD;GACE,QAAQ;GACI;GACZ,gBAAgB;GAChB,WAAW;GACX,cAAc;GACd,OAAO,WAAW;GAClB,QAAQ,WAAW;GACnB,CAAA;AAKN,MAAI,aAAa,SAAS,SACxB,QACE,oBAAC,kBAAD;GACE,gBAAgB;GAChB,OAAO,WAAW;GAClB,QAAQ,WAAW;GACnB,CAAA;AAIN,MAAI,aAAa,SAAS,WACxB,QACE,oBAAC,oBAAD;GACE,gBAAgB;GAChB,OAAO,WAAW;GAClB,QAAQ,WAAW;GACnB,CAAA;AAKN,MAAI,gBAAgB,SAClB,SAAQ,UAAR;GACE,KAAK,SAAS,SACZ,QACE,oBAAC,UAAD;IACE,UACE,oBAAC,cAAD;KACE,UAAU,KAAA;KACV,SAAQ;KACR,OAAM;KACN,CAAA;cAGJ,oBAAC,gBAAD;KACE,iBAAiB,YAAY;AAC3B,cAAQ,IAAI,4BAA4B,QAAQ;;KAElD,gBAAgB;KAChB,OAAO,WAAW;KAClB,QAAQ,WAAW;KACnB,kBAAkB;KAClB,CAAA;IACO,CAAA;GAEf,KAAK,SAAS;GACd,KAAK,SAAS;AAEZ,QAAI,cAAc,WAAW,GAAG;KAC9B,MAAM,UAAU,0BAA0B,mBAAmB,EAAE;KAC/D,MAAM,UAAU,0BACd,gBAAgB,SAChB,EACD;AAED,sBAAiB,iBAAiB,CAAC,SAAS,QAAQ,CAAC,EAAE,EAAE;AAEzD,YACE,oBAAC,cAAD;MACE,UAAU,KAAA;MACV,SAAQ;MACR,OAAM;MACN,CAAA;;AAIN,WACE,oBAAC,gBAAD;KACE,SAAS;KACT,cAAc;KACd,eAAe;KACf,UAAU;KACV,iBAAiB,aAAa,YAAY;AAExC,wBAAkB,gBAAgB;OAChC,MAAM,aAAa,CAAC,GAAG,YAAY;AACnC,WAAI,WAAW,aACb,YAAW,eAAe;QACxB,GAAG,WAAW;QACd,GAAG;QACJ;AAEH,cAAO;QACP;;KAEJ,gBAAgB;KAChB,WAAW;KACD;KACV,OAAO,WAAW;KAClB,QAAQ,WAAW;KACnB,CAAA;GAEN,QACE,QACE,oBAAC,eAAD;IACE,cAAc;IACd,mBAAmB;IACA;IACnB,OAAO,WAAW;IAClB,QAAQ,WAAW;IACnB,CAAA;;AAMV,SACE,oBAAC,eAAD;GACE,cAAc;GACd,mBAAmB;GACA;GACnB,OAAO,WAAW;GAClB,QAAQ,WAAW;GACnB,CAAA;;CAIN,MAAM,eAAe,OAAuB,KAAK;AAEjD,iBAAgB;AACd,eAAa,SAAS,OAAO;IAC5B,CAAC,SAAS,CAAC;AAEd,iBAAgB;EACd,MAAM,qBAAqB;AAEzB,uBAAoB;GACpB,MAAM,WAAW,gBAAgB;AACjC,iBAAc;IACZ,OAAO,SAAS;IAChB,QAAQ,SAAS;IACjB,UAAU,SAAS;IACnB,UAAU,SAAS;IACnB,WAAW,SAAS;IACrB,CAAC;;AAGJ,SAAO,iBAAiB,UAAU,aAAa;AAC/C,eAAa,OAAO,oBAAoB,UAAU,aAAa;IAC9D,EAAE,CAAC;AAIN,iBAAgB,IAYb,EAAE,CAAC;AAEN,KAAI,CAAC,SACH,QACE,oBAAC,OAAD;EAAK,WAAU;EAAc,eAAY;YACvC,oBAAC,cAAD;GACE,UAAU,KAAA;GACV,SAAQ;GACR,OAAM;GACN,CAAA;EACE,CAAA;AAKV,KAAI,WACF,QACE,qBAAC,OAAD;EAAK,WAAU;EAAM,eAAY;YAAjC,CACE,oBAAC,cAAD;GACE,SAAS;GACT,OAAO,WAAW;GAClB,QAAQ,WAAW;GACnB,CAAA,EACD,kBACC,oBAAC,YAAD;GACE,SAAQ;GACR,SAAS;GACT,YAAY;GACZ,CAAA,CAEA;;AAIV,QACE,qBAAC,OAAD;EACE,WAAU;EACV,UAAU;EACV,KAAK;EACL,OAAO;GACL,SAAS;GACT,OAAO;GACP,QAAQ;GACR,UAAU;GACX;EACD,eAAY;YAVd,CAaG,qBAAqB,EAGrB,wBAAwB,oBAAC,6BAAD,EAA+B,CAAA,CACpD"}
|
|
1
|
+
{"version":3,"file":"App2.js","names":[],"sources":["../src/App.tsx"],"sourcesContent":["import {\n lazy,\n Suspense,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport \"./App.css\";\n// Main application component - manages game state and screen navigation\nimport { useAudio } from \"./audio/AudioProvider\";\nimport { CombatScreen3D as CombatScreen } from \"./components/screens/combat/CombatScreen3D\";\nimport { ControlsScreen3D as ControlsScreen } from \"./components/screens/controls/ControlsScreen3D\";\nimport { EndScreen3D } from \"./components/screens/endscreen\";\nimport { IntroScreen3D as IntroScreen } from \"./components/screens/intro/IntroScreen3D\";\nimport { PhilosophyScreen3D as PhilosophyScreen } from \"./components/screens/philosophy/PhilosophyScreen3D\";\nimport { PerformanceDebugOverlayHtml } from \"./components/shared/debug/PerformanceDebugOverlayHtml\";\nimport { ErrorModal } from \"./components/shared/ui/ErrorModal\";\nimport { LoadingState } from \"./components/shared/ui/LoadingState\";\nimport { SplashScreen } from \"./components/shared/ui/SplashScreen\";\nimport { PlayerState } from \"./systems\";\nimport { MatchStatistics } from \"./systems/combat\";\nimport { GameMode, PlayerArchetype } from \"./types/common\";\nimport { clearPlatformCache, detectPlatform } from \"./utils/deviceDetection\";\nimport { createPlayerFromArchetype } from \"./utils/playerUtils\";\n\n// Lazy load heavy screens\nconst TrainingScreen = lazy(() =>\n import(\"./components/screens/training/TrainingScreen3D\").then((m) => ({\n default: m.TrainingScreen3D,\n })),\n);\n\n// 150ms delay to allow WebGL context cleanup between full-screen 3D scene transitions\nconst SCREEN_TRANSITION_DELAY_MS = 150;\n// 100ms delay for lighter menu/UI transitions where WebGL teardown/re-init cost is lower\nconst MENU_TRANSITION_DELAY_MS = 100;\n\nfunction App() {\n const [gameMode, setGameMode] = useState<GameMode | null>(null);\n const [selectedArchetype, setSelectedArchetype] = useState<PlayerArchetype>(\n PlayerArchetype.MUSA,\n );\n const [isGameActive, setIsGameActive] = useState(false);\n const [gameWinner, setGameWinner] = useState<PlayerState | null>(null);\n const [matchStats, setMatchStats] = useState<MatchStatistics | null>(null);\n const [appReady, setAppReady] = useState(false);\n const [showSplash, setShowSplash] = useState(true);\n const [showAudioError, setShowAudioError] = useState(false);\n // Performance debug overlay toggle (P key in dev mode)\n const [showPerformanceDebug, setShowPerformanceDebug] = useState(false);\n // Transition state to allow WebGL cleanup between screens\n const [isTransitioning, setIsTransitioning] = useState(false);\n const pendingModeRef = useRef<{\n mode: GameMode;\n archetype?: PlayerArchetype;\n } | null>(null);\n\n // Combat players state - managed here so updates persist\n const [combatPlayers, setCombatPlayers] = useState<PlayerState[]>([]);\n\n const audio = useAudio();\n\n // Add responsive screen size detection with proper device detection\n // Uses user-agent detection first for high-res mobile devices\n const [screenSize, setScreenSize] = useState(() => {\n const platform = detectPlatform();\n return {\n width: window.innerWidth,\n height: window.innerHeight,\n isMobile: platform.isMobile,\n isTablet: platform.isTablet,\n isDesktop: platform.isDesktop,\n };\n });\n\n useEffect(() => {\n // Define handlers outside async function for proper cleanup\n const handleGlobalError = (e: ErrorEvent) => {\n console.error(\"Global error:\", e.error);\n };\n\n const handleUnhandledRejection = (e: PromiseRejectionEvent) => {\n console.error(\"Unhandled promise rejection:\", e.reason);\n if (\n e.reason?.message?.includes(\"Failed to load\") ||\n e.reason?.message?.includes(\"no supported source\")\n ) {\n e.preventDefault();\n }\n };\n\n const initializeApp = async () => {\n try {\n window.focus();\n\n window.addEventListener(\"error\", handleGlobalError);\n window.addEventListener(\"unhandledrejection\", handleUnhandledRejection);\n\n // PHASE 2: Performance optimization initialization\n console.log(\"🔧 Initializing animation performance optimizations...\");\n\n // 1. Prewarm object pools for animation optimization\n // This eliminates GC pressure from ~1,344 allocations per frame\n const { ThreeObjectPools } = await import(\"./utils/threeObjectPool\");\n ThreeObjectPools.prewarmAll();\n const poolStatus = ThreeObjectPools.getStatus();\n console.log(\" ✓ Object pools prewarmed:\", poolStatus);\n\n // 2. Precompute all animations for 90%+ cache hit rate\n const { precomputeAnimation } =\n await import(\"./systems/animation/core/AnimationOptimizations\");\n const { ALL_ANIMATIONS } =\n await import(\"./systems/animation/core/AnimationRegistry\");\n\n let precomputedCount = 0;\n ALL_ANIMATIONS.forEach((animation) => {\n // Precompute at 60fps for smooth playback\n // Use animation.name as the unique identifier\n precomputeAnimation(animation.name, animation, 60);\n precomputedCount++;\n });\n console.log(` ✓ Precomputed ${precomputedCount} animations at 60fps`);\n\n console.log(\n \"✅ Animation optimizations ready (expect <5ms frame time, 90%+ cache hit)\",\n );\n\n setAppReady(true);\n console.log(\"🎯 Black Trigram app initialized\");\n } catch (error) {\n console.error(\"Failed to initialize app:\", error);\n setAppReady(true);\n }\n };\n\n initializeApp();\n\n // Cleanup global event handlers to prevent memory leaks\n return () => {\n window.removeEventListener(\"error\", handleGlobalError);\n window.removeEventListener(\n \"unhandledrejection\",\n handleUnhandledRejection,\n );\n };\n }, []);\n\n // Shared audio initialization logic for splash and retry\n const initializeAudioWithRetry = useCallback(async () => {\n if (!appReady) {\n console.warn(\"App not ready yet, please wait...\");\n return false;\n }\n try {\n await audio.initializeAudio();\n console.log(\"🎵 Audio initialized\");\n return true;\n } catch (error) {\n console.error(\"Failed to initialize audio:\", error);\n return false;\n }\n }, [audio, appReady]);\n\n // Handle splash screen start - initialize audio on user gesture\n const handleSplashStart = useCallback(async () => {\n setShowAudioError(false);\n const success = await initializeAudioWithRetry();\n if (success) {\n setShowSplash(false);\n } else {\n setShowAudioError(true);\n }\n }, [initializeAudioWithRetry]);\n\n const handleAudioErrorRetry = useCallback(async () => {\n setShowAudioError(false);\n const success = await initializeAudioWithRetry();\n if (success) {\n setShowSplash(false);\n } else {\n setShowAudioError(true);\n }\n }, [initializeAudioWithRetry]);\n\n const handleAudioErrorContinue = useCallback(() => {\n // Continue without sound\n setShowAudioError(false);\n setShowSplash(false);\n console.log(\"Continuing without audio (silent mode)\");\n }, []);\n\n // ✅ SIMPLIFIED: Handle game mode selection directly\n const handleGameStart = useCallback(\n (mode: GameMode, archetype?: PlayerArchetype) => {\n console.log(\"🎮 Starting game mode:\", mode, \"with archetype:\", archetype);\n\n // Store pending mode and start transition to allow WebGL cleanup\n pendingModeRef.current = { mode, archetype };\n setIsTransitioning(true);\n\n // Clear current mode first (unmounts Canvas)\n setGameMode(null);\n setIsGameActive(false);\n\n // After brief delay, mount new screen\n // Increased delay to allow proper WebGL context cleanup\n setTimeout(() => {\n const pending = pendingModeRef.current;\n if (!pending) return;\n\n // ✅ NEW: Handle controls and philosophy as separate modes\n if (\n pending.mode === GameMode.CONTROLS ||\n pending.mode === GameMode.PHILOSOPHY\n ) {\n setGameMode(pending.mode);\n setIsGameActive(false); // These are not game modes, just screens\n } else {\n setGameMode(pending.mode);\n setIsGameActive(true);\n }\n\n setGameWinner(null);\n setMatchStats(null);\n if (pending.archetype) {\n setSelectedArchetype(pending.archetype);\n }\n\n setIsTransitioning(false);\n pendingModeRef.current = null;\n }, SCREEN_TRANSITION_DELAY_MS); // Delay for WebGL cleanup\n },\n [],\n );\n\n const handleGameEnd = useCallback(\n (winner: number) => {\n setIsGameActive(false);\n setGameWinner(createPlayerFromArchetype(selectedArchetype, winner));\n // Reset combat players for next match\n setCombatPlayers([]);\n\n setMatchStats({\n totalDamageDealt: 150,\n totalDamageTaken: 100,\n criticalHits: 3,\n vitalPointHits: 2,\n techniquesUsed: 8,\n perfectStrikes: 1,\n consecutiveWins: 1,\n matchDuration: 120,\n totalMatches: 1,\n maxRounds: 3,\n winner: winner,\n totalRounds: 2,\n currentRound: 2,\n timeRemaining: 0,\n combatEvents: [],\n finalScore: {\n player1: winner === 0 ? 2 : 0,\n player2: winner === 1 ? 2 : 0,\n },\n roundsWon: {\n player1: winner === 0 ? 2 : 0,\n player2: winner === 1 ? 2 : 0,\n },\n player1: {\n wins: winner === 0 ? 1 : 0,\n losses: winner === 0 ? 0 : 1,\n hitsTaken: 5,\n hitsLanded: 8,\n totalDamageDealt: winner === 0 ? 150 : 100,\n totalDamageReceived: winner === 0 ? 100 : 150,\n techniques: [\"천둥벽력\", \"유수연타\"],\n perfectStrikes: winner === 0 ? 1 : 0,\n vitalPointHits: winner === 0 ? 2 : 1,\n consecutiveWins: winner === 0 ? 1 : 0,\n matchDuration: 120,\n },\n player2: {\n wins: winner === 1 ? 1 : 0,\n losses: winner === 1 ? 0 : 1,\n hitsTaken: 8,\n hitsLanded: 5,\n totalDamageDealt: winner === 1 ? 150 : 100,\n totalDamageReceived: winner === 1 ? 100 : 150,\n techniques: [\"화염지창\", \"벽력일섬\"],\n perfectStrikes: winner === 1 ? 1 : 0,\n vitalPointHits: winner === 1 ? 2 : 1,\n consecutiveWins: winner === 1 ? 1 : 0,\n matchDuration: 120,\n },\n });\n },\n [selectedArchetype],\n );\n\n const handleReturnToMenu = useCallback(() => {\n // Use same transition logic for return to menu\n setIsTransitioning(true);\n setGameMode(null);\n setIsGameActive(false);\n setGameWinner(null);\n setMatchStats(null);\n // Reset combat players so they reinitialize next combat\n setCombatPlayers([]);\n setTimeout(() => setIsTransitioning(false), MENU_TRANSITION_DELAY_MS);\n }, []);\n\n const handleRematch = useCallback(() => {\n // Restart combat with same settings\n if (!gameMode) {\n console.error(\n \"Cannot rematch: gameMode is not set. This should not happen - EndScreen only renders when gameMode is set.\",\n { gameMode, isGameActive, gameWinner, matchStats }\n );\n return;\n }\n \n setIsTransitioning(true);\n setGameWinner(null);\n setMatchStats(null);\n // Reset combat players so they reinitialize for rematch\n setCombatPlayers([]);\n \n setTimeout(() => {\n setIsGameActive(true);\n setIsTransitioning(false);\n }, SCREEN_TRANSITION_DELAY_MS);\n // eslint-disable-next-line react-hooks/exhaustive-deps -- isGameActive, gameWinner, matchStats only used in error logging, not function logic\n }, [gameMode]);\n\n const handleViewTraining = useCallback(() => {\n // Navigate to training mode\n setIsTransitioning(true);\n setGameWinner(null);\n setMatchStats(null);\n setCombatPlayers([]);\n \n setTimeout(() => {\n setGameMode(GameMode.TRAINING);\n setIsGameActive(true);\n setIsTransitioning(false);\n }, SCREEN_TRANSITION_DELAY_MS);\n }, []);\n\n const renderCurrentScreen = () => {\n // Show loading during screen transitions\n if (isTransitioning) {\n return (\n <LoadingState\n progress={undefined}\n message=\"전환 중... | Transitioning...\"\n stage=\"assets\"\n />\n );\n }\n\n if (gameWinner && matchStats) {\n // ✅ NEW: Use EndScreen3D component\n return (\n <EndScreen3D\n winner={gameWinner}\n matchStats={matchStats}\n onReturnToMenu={handleReturnToMenu}\n onRematch={handleRematch}\n onViewReplay={handleViewTraining}\n width={screenSize.width}\n height={screenSize.height}\n />\n );\n }\n\n // ✅ NEW: Handle standalone screens first\n if (gameMode === GameMode.CONTROLS) {\n return (\n <ControlsScreen\n onReturnToMenu={handleReturnToMenu}\n width={screenSize.width}\n height={screenSize.height}\n />\n );\n }\n\n if (gameMode === GameMode.PHILOSOPHY) {\n return (\n <PhilosophyScreen\n onReturnToMenu={handleReturnToMenu}\n width={screenSize.width}\n height={screenSize.height}\n />\n );\n }\n\n // ✅ SIMPLIFIED: Only active game modes use isGameActive\n if (isGameActive && gameMode) {\n switch (gameMode) {\n case GameMode.TRAINING:\n return (\n <Suspense\n fallback={\n <LoadingState\n progress={undefined}\n message=\"훈련장 로딩 중... | Loading Training...\"\n stage=\"assets\"\n />\n }\n >\n <TrainingScreen\n onPlayerUpdate={(updates) => {\n console.log(\"Training player updated:\", updates);\n }}\n onReturnToMenu={handleReturnToMenu}\n width={screenSize.width}\n height={screenSize.height}\n initialArchetype={selectedArchetype}\n />\n </Suspense>\n );\n case GameMode.VERSUS:\n case GameMode.PRACTICE:\n // Initialize players if not already set\n if (combatPlayers.length === 0) {\n const player1 = createPlayerFromArchetype(selectedArchetype, 0);\n const player2 = createPlayerFromArchetype(\n PlayerArchetype.AMSALJA,\n 1,\n );\n // Use setTimeout to defer state update and avoid render-during-render\n setTimeout(() => setCombatPlayers([player1, player2]), 0);\n // Return loading state while players initialize\n return (\n <LoadingState\n progress={undefined}\n message=\"전투 준비 중... | Preparing Combat...\"\n stage=\"assets\"\n />\n );\n }\n\n return (\n <CombatScreen\n players={combatPlayers}\n currentRound={1}\n timeRemaining={180}\n isPaused={false}\n onPlayerUpdate={(playerIndex, updates) => {\n // Actually update the player state so damage persists!\n setCombatPlayers((prevPlayers) => {\n const newPlayers = [...prevPlayers];\n if (newPlayers[playerIndex]) {\n newPlayers[playerIndex] = {\n ...newPlayers[playerIndex],\n ...updates,\n };\n }\n return newPlayers;\n });\n }}\n onReturnToMenu={handleReturnToMenu}\n onGameEnd={handleGameEnd}\n gameMode={gameMode}\n width={screenSize.width}\n height={screenSize.height}\n />\n );\n default:\n return (\n <IntroScreen\n onMenuSelect={handleGameStart}\n onArchetypeSelect={setSelectedArchetype}\n selectedArchetype={selectedArchetype}\n width={screenSize.width}\n height={screenSize.height}\n />\n );\n }\n }\n\n // ✅ SIMPLIFIED: Default to intro screen\n return (\n <IntroScreen\n onMenuSelect={handleGameStart}\n onArchetypeSelect={setSelectedArchetype}\n selectedArchetype={selectedArchetype}\n width={screenSize.width}\n height={screenSize.height}\n />\n );\n };\n\n const containerRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n containerRef.current?.focus();\n }, [appReady]);\n\n useEffect(() => {\n const handleResize = () => {\n // Clear cached platform info to get fresh detection on resize\n clearPlatformCache();\n const platform = detectPlatform();\n setScreenSize({\n width: platform.screenWidth,\n height: platform.screenHeight,\n isMobile: platform.isMobile,\n isTablet: platform.isTablet,\n isDesktop: platform.isDesktop,\n });\n };\n\n window.addEventListener(\"resize\", handleResize);\n return () => window.removeEventListener(\"resize\", handleResize);\n }, []);\n\n // F9 key toggle for performance debug overlay (dev mode only)\n // Note: P key is reserved for Philosophy screen\n useEffect(() => {\n if (!import.meta.env.DEV) return;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === \"F9\") {\n e.preventDefault();\n setShowPerformanceDebug((prev) => !prev);\n }\n };\n\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => window.removeEventListener(\"keydown\", handleKeyDown);\n }, []);\n\n if (!appReady) {\n return (\n <div className=\"app loading\" data-testid=\"app-container\">\n <LoadingState\n progress={undefined}\n message=\"앱 초기화 중 | Initializing app...\"\n stage=\"initialization\"\n />\n </div>\n );\n }\n\n // Show splash screen first to get user gesture for audio\n if (showSplash) {\n return (\n <div className=\"app\" data-testid=\"app-container\">\n <SplashScreen\n onStart={handleSplashStart}\n width={screenSize.width}\n height={screenSize.height}\n />\n {showAudioError && (\n <ErrorModal\n message=\"오디오 초기화에 실패했습니다. 재시도하거나 소리 없이 계속할 수 있습니다. | Audio initialization failed. You can retry or continue without sound.\"\n onRetry={handleAudioErrorRetry}\n onContinue={handleAudioErrorContinue}\n />\n )}\n </div>\n );\n }\n\n return (\n <div\n className=\"app\"\n tabIndex={0}\n ref={containerRef}\n style={{\n outline: \"none\",\n width: \"100vw\",\n height: \"100vh\",\n overflow: \"hidden\",\n }}\n data-testid=\"app-container\"\n >\n {/* All screens now use Three.js or pure React/HTML */}\n {renderCurrentScreen()}\n\n {/* Performance debug overlay (dev mode only, toggle with P key) */}\n {showPerformanceDebug && <PerformanceDebugOverlayHtml />}\n </div>\n );\n}\n\nexport default App;\n"],"mappings":";;;;;;;;;;;;;;;;;AA2BA,IAAM,iBAAiB,WACrB,OAAO,qDAAkD,MAAM,OAAO,EACpE,SAAS,EAAE,kBACZ,EAAE,CACJ;AAGD,IAAM,6BAA6B;AAEnC,IAAM,2BAA2B;AAEjC,SAAS,MAAM;CACb,MAAM,CAAC,UAAU,eAAe,SAA0B,KAAK;CAC/D,MAAM,CAAC,mBAAmB,wBAAwB,SAChD,gBAAgB,KACjB;CACD,MAAM,CAAC,cAAc,mBAAmB,SAAS,MAAM;CACvD,MAAM,CAAC,YAAY,iBAAiB,SAA6B,KAAK;CACtE,MAAM,CAAC,YAAY,iBAAiB,SAAiC,KAAK;CAC1E,MAAM,CAAC,UAAU,eAAe,SAAS,MAAM;CAC/C,MAAM,CAAC,YAAY,iBAAiB,SAAS,KAAK;CAClD,MAAM,CAAC,gBAAgB,qBAAqB,SAAS,MAAM;CAE3D,MAAM,CAAC,sBAAsB,2BAA2B,SAAS,MAAM;CAEvE,MAAM,CAAC,iBAAiB,sBAAsB,SAAS,MAAM;CAC7D,MAAM,iBAAiB,OAGb,KAAK;CAGf,MAAM,CAAC,eAAe,oBAAoB,SAAwB,EAAE,CAAC;CAErE,MAAM,QAAQ,UAAU;CAIxB,MAAM,CAAC,YAAY,iBAAiB,eAAe;EACjD,MAAM,WAAW,gBAAgB;AACjC,SAAO;GACL,OAAO,OAAO;GACd,QAAQ,OAAO;GACf,UAAU,SAAS;GACnB,UAAU,SAAS;GACnB,WAAW,SAAS;GACrB;GACD;AAEF,iBAAgB;EAEd,MAAM,qBAAqB,MAAkB;AAC3C,WAAQ,MAAM,iBAAiB,EAAE,MAAM;;EAGzC,MAAM,4BAA4B,MAA6B;AAC7D,WAAQ,MAAM,gCAAgC,EAAE,OAAO;AACvD,OACE,EAAE,QAAQ,SAAS,SAAS,iBAAiB,IAC7C,EAAE,QAAQ,SAAS,SAAS,sBAAsB,CAElD,GAAE,gBAAgB;;EAItB,MAAM,gBAAgB,YAAY;AAChC,OAAI;AACF,WAAO,OAAO;AAEd,WAAO,iBAAiB,SAAS,kBAAkB;AACnD,WAAO,iBAAiB,sBAAsB,yBAAyB;AAGvE,YAAQ,IAAI,yDAAyD;IAIrE,MAAM,EAAE,qBAAqB,MAAM,OAAO;AAC1C,qBAAiB,YAAY;IAC7B,MAAM,aAAa,iBAAiB,WAAW;AAC/C,YAAQ,IAAI,+BAA+B,WAAW;IAGtD,MAAM,EAAE,wBACN,MAAM,OAAO;IACf,MAAM,EAAE,mBACN,MAAM,OAAO;IAEf,IAAI,mBAAmB;AACvB,mBAAe,SAAS,cAAc;AAGpC,yBAAoB,UAAU,MAAM,WAAW,GAAG;AAClD;MACA;AACF,YAAQ,IAAI,mBAAmB,iBAAiB,sBAAsB;AAEtE,YAAQ,IACN,2EACD;AAED,gBAAY,KAAK;AACjB,YAAQ,IAAI,mCAAmC;YACxC,OAAO;AACd,YAAQ,MAAM,6BAA6B,MAAM;AACjD,gBAAY,KAAK;;;AAIrB,iBAAe;AAGf,eAAa;AACX,UAAO,oBAAoB,SAAS,kBAAkB;AACtD,UAAO,oBACL,sBACA,yBACD;;IAEF,EAAE,CAAC;CAGN,MAAM,2BAA2B,YAAY,YAAY;AACvD,MAAI,CAAC,UAAU;AACb,WAAQ,KAAK,oCAAoC;AACjD,UAAO;;AAET,MAAI;AACF,SAAM,MAAM,iBAAiB;AAC7B,WAAQ,IAAI,uBAAuB;AACnC,UAAO;WACA,OAAO;AACd,WAAQ,MAAM,+BAA+B,MAAM;AACnD,UAAO;;IAER,CAAC,OAAO,SAAS,CAAC;CAGrB,MAAM,oBAAoB,YAAY,YAAY;AAChD,oBAAkB,MAAM;AAExB,MADgB,MAAM,0BAA0B,CAE9C,eAAc,MAAM;MAEpB,mBAAkB,KAAK;IAExB,CAAC,yBAAyB,CAAC;CAE9B,MAAM,wBAAwB,YAAY,YAAY;AACpD,oBAAkB,MAAM;AAExB,MADgB,MAAM,0BAA0B,CAE9C,eAAc,MAAM;MAEpB,mBAAkB,KAAK;IAExB,CAAC,yBAAyB,CAAC;CAE9B,MAAM,2BAA2B,kBAAkB;AAEjD,oBAAkB,MAAM;AACxB,gBAAc,MAAM;AACpB,UAAQ,IAAI,yCAAyC;IACpD,EAAE,CAAC;CAGN,MAAM,kBAAkB,aACrB,MAAgB,cAAgC;AAC/C,UAAQ,IAAI,0BAA0B,MAAM,mBAAmB,UAAU;AAGzE,iBAAe,UAAU;GAAE;GAAM;GAAW;AAC5C,qBAAmB,KAAK;AAGxB,cAAY,KAAK;AACjB,kBAAgB,MAAM;AAItB,mBAAiB;GACf,MAAM,UAAU,eAAe;AAC/B,OAAI,CAAC,QAAS;AAGd,OACE,QAAQ,SAAS,SAAS,YAC1B,QAAQ,SAAS,SAAS,YAC1B;AACA,gBAAY,QAAQ,KAAK;AACzB,oBAAgB,MAAM;UACjB;AACL,gBAAY,QAAQ,KAAK;AACzB,oBAAgB,KAAK;;AAGvB,iBAAc,KAAK;AACnB,iBAAc,KAAK;AACnB,OAAI,QAAQ,UACV,sBAAqB,QAAQ,UAAU;AAGzC,sBAAmB,MAAM;AACzB,kBAAe,UAAU;KACxB,2BAA2B;IAEhC,EAAE,CACH;CAED,MAAM,gBAAgB,aACnB,WAAmB;AAClB,kBAAgB,MAAM;AACtB,gBAAc,0BAA0B,mBAAmB,OAAO,CAAC;AAEnE,mBAAiB,EAAE,CAAC;AAEpB,gBAAc;GACZ,kBAAkB;GAClB,kBAAkB;GAClB,cAAc;GACd,gBAAgB;GAChB,gBAAgB;GAChB,gBAAgB;GAChB,iBAAiB;GACjB,eAAe;GACf,cAAc;GACd,WAAW;GACH;GACR,aAAa;GACb,cAAc;GACd,eAAe;GACf,cAAc,EAAE;GAChB,YAAY;IACV,SAAS,WAAW,IAAI,IAAI;IAC5B,SAAS,WAAW,IAAI,IAAI;IAC7B;GACD,WAAW;IACT,SAAS,WAAW,IAAI,IAAI;IAC5B,SAAS,WAAW,IAAI,IAAI;IAC7B;GACD,SAAS;IACP,MAAM,WAAW,IAAI,IAAI;IACzB,QAAQ,WAAW,IAAI,IAAI;IAC3B,WAAW;IACX,YAAY;IACZ,kBAAkB,WAAW,IAAI,MAAM;IACvC,qBAAqB,WAAW,IAAI,MAAM;IAC1C,YAAY,CAAC,QAAQ,OAAO;IAC5B,gBAAgB,WAAW,IAAI,IAAI;IACnC,gBAAgB,WAAW,IAAI,IAAI;IACnC,iBAAiB,WAAW,IAAI,IAAI;IACpC,eAAe;IAChB;GACD,SAAS;IACP,MAAM,WAAW,IAAI,IAAI;IACzB,QAAQ,WAAW,IAAI,IAAI;IAC3B,WAAW;IACX,YAAY;IACZ,kBAAkB,WAAW,IAAI,MAAM;IACvC,qBAAqB,WAAW,IAAI,MAAM;IAC1C,YAAY,CAAC,QAAQ,OAAO;IAC5B,gBAAgB,WAAW,IAAI,IAAI;IACnC,gBAAgB,WAAW,IAAI,IAAI;IACnC,iBAAiB,WAAW,IAAI,IAAI;IACpC,eAAe;IAChB;GACF,CAAC;IAEJ,CAAC,kBAAkB,CACpB;CAED,MAAM,qBAAqB,kBAAkB;AAE3C,qBAAmB,KAAK;AACxB,cAAY,KAAK;AACjB,kBAAgB,MAAM;AACtB,gBAAc,KAAK;AACnB,gBAAc,KAAK;AAEnB,mBAAiB,EAAE,CAAC;AACpB,mBAAiB,mBAAmB,MAAM,EAAE,yBAAyB;IACpE,EAAE,CAAC;CAEN,MAAM,gBAAgB,kBAAkB;AAEtC,MAAI,CAAC,UAAU;AACb,WAAQ,MACN,8GACA;IAAE;IAAU;IAAc;IAAY;IAAY,CACnD;AACD;;AAGF,qBAAmB,KAAK;AACxB,gBAAc,KAAK;AACnB,gBAAc,KAAK;AAEnB,mBAAiB,EAAE,CAAC;AAEpB,mBAAiB;AACf,mBAAgB,KAAK;AACrB,sBAAmB,MAAM;KACxB,2BAA2B;IAE7B,CAAC,SAAS,CAAC;CAEd,MAAM,qBAAqB,kBAAkB;AAE3C,qBAAmB,KAAK;AACxB,gBAAc,KAAK;AACnB,gBAAc,KAAK;AACnB,mBAAiB,EAAE,CAAC;AAEpB,mBAAiB;AACf,eAAY,SAAS,SAAS;AAC9B,mBAAgB,KAAK;AACrB,sBAAmB,MAAM;KACxB,2BAA2B;IAC7B,EAAE,CAAC;CAEN,MAAM,4BAA4B;AAEhC,MAAI,gBACF,QACE,oBAAC,cAAD;GACE,UAAU,KAAA;GACV,SAAQ;GACR,OAAM;GACN,CAAA;AAIN,MAAI,cAAc,WAEhB,QACE,oBAAC,aAAD;GACE,QAAQ;GACI;GACZ,gBAAgB;GAChB,WAAW;GACX,cAAc;GACd,OAAO,WAAW;GAClB,QAAQ,WAAW;GACnB,CAAA;AAKN,MAAI,aAAa,SAAS,SACxB,QACE,oBAAC,kBAAD;GACE,gBAAgB;GAChB,OAAO,WAAW;GAClB,QAAQ,WAAW;GACnB,CAAA;AAIN,MAAI,aAAa,SAAS,WACxB,QACE,oBAAC,oBAAD;GACE,gBAAgB;GAChB,OAAO,WAAW;GAClB,QAAQ,WAAW;GACnB,CAAA;AAKN,MAAI,gBAAgB,SAClB,SAAQ,UAAR;GACE,KAAK,SAAS,SACZ,QACE,oBAAC,UAAD;IACE,UACE,oBAAC,cAAD;KACE,UAAU,KAAA;KACV,SAAQ;KACR,OAAM;KACN,CAAA;cAGJ,oBAAC,gBAAD;KACE,iBAAiB,YAAY;AAC3B,cAAQ,IAAI,4BAA4B,QAAQ;;KAElD,gBAAgB;KAChB,OAAO,WAAW;KAClB,QAAQ,WAAW;KACnB,kBAAkB;KAClB,CAAA;IACO,CAAA;GAEf,KAAK,SAAS;GACd,KAAK,SAAS;AAEZ,QAAI,cAAc,WAAW,GAAG;KAC9B,MAAM,UAAU,0BAA0B,mBAAmB,EAAE;KAC/D,MAAM,UAAU,0BACd,gBAAgB,SAChB,EACD;AAED,sBAAiB,iBAAiB,CAAC,SAAS,QAAQ,CAAC,EAAE,EAAE;AAEzD,YACE,oBAAC,cAAD;MACE,UAAU,KAAA;MACV,SAAQ;MACR,OAAM;MACN,CAAA;;AAIN,WACE,oBAAC,gBAAD;KACE,SAAS;KACT,cAAc;KACd,eAAe;KACf,UAAU;KACV,iBAAiB,aAAa,YAAY;AAExC,wBAAkB,gBAAgB;OAChC,MAAM,aAAa,CAAC,GAAG,YAAY;AACnC,WAAI,WAAW,aACb,YAAW,eAAe;QACxB,GAAG,WAAW;QACd,GAAG;QACJ;AAEH,cAAO;QACP;;KAEJ,gBAAgB;KAChB,WAAW;KACD;KACV,OAAO,WAAW;KAClB,QAAQ,WAAW;KACnB,CAAA;GAEN,QACE,QACE,oBAAC,eAAD;IACE,cAAc;IACd,mBAAmB;IACA;IACnB,OAAO,WAAW;IAClB,QAAQ,WAAW;IACnB,CAAA;;AAMV,SACE,oBAAC,eAAD;GACE,cAAc;GACd,mBAAmB;GACA;GACnB,OAAO,WAAW;GAClB,QAAQ,WAAW;GACnB,CAAA;;CAIN,MAAM,eAAe,OAAuB,KAAK;AAEjD,iBAAgB;AACd,eAAa,SAAS,OAAO;IAC5B,CAAC,SAAS,CAAC;AAEd,iBAAgB;EACd,MAAM,qBAAqB;AAEzB,uBAAoB;GACpB,MAAM,WAAW,gBAAgB;AACjC,iBAAc;IACZ,OAAO,SAAS;IAChB,QAAQ,SAAS;IACjB,UAAU,SAAS;IACnB,UAAU,SAAS;IACnB,WAAW,SAAS;IACrB,CAAC;;AAGJ,SAAO,iBAAiB,UAAU,aAAa;AAC/C,eAAa,OAAO,oBAAoB,UAAU,aAAa;IAC9D,EAAE,CAAC;AAIN,iBAAgB,IAYb,EAAE,CAAC;AAEN,KAAI,CAAC,SACH,QACE,oBAAC,OAAD;EAAK,WAAU;EAAc,eAAY;YACvC,oBAAC,cAAD;GACE,UAAU,KAAA;GACV,SAAQ;GACR,OAAM;GACN,CAAA;EACE,CAAA;AAKV,KAAI,WACF,QACE,qBAAC,OAAD;EAAK,WAAU;EAAM,eAAY;YAAjC,CACE,oBAAC,cAAD;GACE,SAAS;GACT,OAAO,WAAW;GAClB,QAAQ,WAAW;GACnB,CAAA,EACD,kBACC,oBAAC,YAAD;GACE,SAAQ;GACR,SAAS;GACT,YAAY;GACZ,CAAA,CAEA;;AAIV,QACE,qBAAC,OAAD;EACE,WAAU;EACV,UAAU;EACV,KAAK;EACL,OAAO;GACL,SAAS;GACT,OAAO;GACP,QAAQ;GACR,UAAU;GACX;EACD,eAAY;YAVd,CAaG,qBAAqB,EAGrB,wBAAwB,oBAAC,6BAAD,EAA+B,CAAA,CACpD"}
|
package/lib/assets/index.css
CHANGED
|
@@ -13,10 +13,10 @@ body {
|
|
|
13
13
|
font-family: var(--font-korean);
|
|
14
14
|
background: linear-gradient(
|
|
15
15
|
135deg,
|
|
16
|
-
var(--
|
|
17
|
-
var(--
|
|
16
|
+
var(--color-bg-dark) 0%,
|
|
17
|
+
var(--color-bg-medium) 100%
|
|
18
18
|
);
|
|
19
|
-
color: var(--
|
|
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(--
|
|
32
|
-
var(--
|
|
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-
|
|
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(--
|
|
49
|
-
var(--
|
|
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(--
|
|
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(--
|
|
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(--
|
|
65
|
+
border: 2px solid var(--color-accent-cyan);
|
|
66
66
|
border-image: linear-gradient(
|
|
67
67
|
45deg,
|
|
68
|
-
var(--
|
|
69
|
-
var(--
|
|
70
|
-
var(--
|
|
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(--
|
|
74
|
-
inset 0 0 10px
|
|
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
|
-
|
|
80
|
-
|
|
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(--
|
|
83
|
-
color: var(--
|
|
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
|
-
|
|
96
|
-
|
|
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(--
|
|
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
|
-
|
|
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
|
-
|
|
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(--
|
|
131
|
+
border-bottom: 1px solid var(--color-accent-cyan);
|
|
132
132
|
}
|
|
133
133
|
.health-bar {
|
|
134
|
-
background: var(--
|
|
135
|
-
border: 1px solid var(--
|
|
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(--
|
|
145
|
-
var(--
|
|
146
|
-
var(--korean-
|
|
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-
|
|
156
|
+
text-shadow: 0 0 5px var(--color-korean-east);
|
|
157
157
|
}
|
|
158
158
|
50% {
|
|
159
|
-
text-shadow: 0 0 20px var(--korean-
|
|
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:
|
|
167
|
+
background-color: color-mix(in srgb, var(--color-danger) 10%, transparent);
|
|
168
168
|
}
|
|
169
169
|
50% {
|
|
170
|
-
background-color:
|
|
170
|
+
background-color: color-mix(in srgb, var(--color-danger) 30%, transparent);
|
|
171
171
|
}
|
|
172
172
|
100% {
|
|
173
|
-
background-color:
|
|
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(--
|
|
236
|
-
border-top: 2px solid var(--
|
|
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(--
|
|
253
|
-
background:
|
|
254
|
-
border: 1px solid var(--
|
|
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;
|
|
@@ -368,8 +368,8 @@ body {
|
|
|
368
368
|
bottom: 0;
|
|
369
369
|
background: radial-gradient(
|
|
370
370
|
circle at center,
|
|
371
|
-
|
|
372
|
-
|
|
371
|
+
color-mix(in srgb, var(--color-korean-south) 10%, transparent) 0%,
|
|
372
|
+
var(--color-primary-black) 70%
|
|
373
373
|
);
|
|
374
374
|
pointer-events: none;
|
|
375
375
|
z-index: -1;
|
|
@@ -444,12 +444,12 @@ body {
|
|
|
444
444
|
}
|
|
445
445
|
.app-header {
|
|
446
446
|
padding: 1rem 2rem;
|
|
447
|
-
background:
|
|
448
|
-
border-bottom: 2px solid
|
|
447
|
+
background: color-mix(in srgb, var(--color-bg-dark) 90%, transparent);
|
|
448
|
+
border-bottom: 2px solid var(--color-primary-gold);
|
|
449
449
|
display: flex;
|
|
450
450
|
justify-content: space-between;
|
|
451
451
|
align-items: center;
|
|
452
|
-
box-shadow: 0 2px 10px
|
|
452
|
+
box-shadow: 0 2px 10px color-mix(in srgb, var(--color-primary-gold) 30%, transparent);
|
|
453
453
|
}
|
|
454
454
|
.app-title {
|
|
455
455
|
margin: 0;
|
|
@@ -460,14 +460,14 @@ body {
|
|
|
460
460
|
.korean-title {
|
|
461
461
|
font-size: 1.8rem;
|
|
462
462
|
font-weight: bold;
|
|
463
|
-
color:
|
|
464
|
-
text-shadow: 2px 2px 4px
|
|
463
|
+
color: var(--color-primary-gold);
|
|
464
|
+
text-shadow: 2px 2px 4px color-mix(in srgb, var(--color-primary-black) 80%, transparent);
|
|
465
465
|
}
|
|
466
466
|
.english-title {
|
|
467
467
|
font-size: 1rem;
|
|
468
|
-
color:
|
|
468
|
+
color: var(--color-info);
|
|
469
469
|
font-style: italic;
|
|
470
|
-
text-shadow: 1px 1px 2px
|
|
470
|
+
text-shadow: 1px 1px 2px color-mix(in srgb, var(--color-primary-black) 60%, transparent);
|
|
471
471
|
}
|
|
472
472
|
.app-status {
|
|
473
473
|
display: flex;
|
|
@@ -483,14 +483,14 @@ body {
|
|
|
483
483
|
font-weight: bold;
|
|
484
484
|
}
|
|
485
485
|
.phase-indicator {
|
|
486
|
-
background:
|
|
487
|
-
color:
|
|
488
|
-
border: 1px solid
|
|
486
|
+
background: color-mix(in srgb, var(--color-primary-gold) 20%, transparent);
|
|
487
|
+
color: var(--color-primary-gold);
|
|
488
|
+
border: 1px solid var(--color-primary-gold);
|
|
489
489
|
}
|
|
490
490
|
.time-indicator {
|
|
491
|
-
background:
|
|
492
|
-
color:
|
|
493
|
-
border: 1px solid
|
|
491
|
+
background: color-mix(in srgb, var(--color-info) 20%, transparent);
|
|
492
|
+
color: var(--color-info);
|
|
493
|
+
border: 1px solid var(--color-info);
|
|
494
494
|
}
|
|
495
495
|
.app-main {
|
|
496
496
|
flex: 1;
|
|
@@ -500,7 +500,7 @@ body {
|
|
|
500
500
|
overflow: hidden;
|
|
501
501
|
}
|
|
502
502
|
.app-debug {
|
|
503
|
-
background:
|
|
503
|
+
background: color-mix(in srgb, var(--color-primary-black) 80%, transparent);
|
|
504
504
|
color: #00ff00;
|
|
505
505
|
font-family: "Courier New", monospace;
|
|
506
506
|
font-size: 0.8rem;
|
|
@@ -510,7 +510,7 @@ body {
|
|
|
510
510
|
.app-debug summary {
|
|
511
511
|
padding: 0.5rem;
|
|
512
512
|
cursor: pointer;
|
|
513
|
-
background:
|
|
513
|
+
background: color-mix(in srgb, var(--color-success) 10%, transparent);
|
|
514
514
|
border-bottom: 1px solid #00ff00;
|
|
515
515
|
}
|
|
516
516
|
.app-debug pre {
|
|
@@ -550,12 +550,12 @@ body {
|
|
|
550
550
|
bottom: 0;
|
|
551
551
|
background-image: radial-gradient(
|
|
552
552
|
circle at 20% 20%,
|
|
553
|
-
|
|
553
|
+
color-mix(in srgb, var(--color-primary-gold) 5%, transparent) 0%,
|
|
554
554
|
transparent 50%
|
|
555
555
|
),
|
|
556
556
|
radial-gradient(
|
|
557
557
|
circle at 80% 80%,
|
|
558
|
-
|
|
558
|
+
color-mix(in srgb, var(--color-info) 5%, transparent) 0%,
|
|
559
559
|
transparent 50%
|
|
560
560
|
);
|
|
561
561
|
pointer-events: none;
|
|
@@ -580,7 +580,7 @@ body {
|
|
|
580
580
|
font-weight: 700;
|
|
581
581
|
color: #ffd700;
|
|
582
582
|
margin-bottom: 1rem;
|
|
583
|
-
text-shadow: 0 0 20px
|
|
583
|
+
text-shadow: 0 0 20px color-mix(in srgb, var(--color-primary-gold) 50%, transparent);
|
|
584
584
|
}
|
|
585
585
|
.english-subtitle {
|
|
586
586
|
font-size: 1.2rem;
|
|
@@ -644,7 +644,7 @@ body {
|
|
|
644
644
|
left: 50%;
|
|
645
645
|
transform: translate(-50%, -50%);
|
|
646
646
|
text-align: center;
|
|
647
|
-
color: var(--primary-cyan);
|
|
647
|
+
color: var(--color-primary-cyan);
|
|
648
648
|
}
|
|
649
649
|
.error-screen {
|
|
650
650
|
position: absolute;
|
|
@@ -655,7 +655,7 @@ body {
|
|
|
655
655
|
color: #ff4136;
|
|
656
656
|
padding: 2rem;
|
|
657
657
|
border: 1px solid #ff4136;
|
|
658
|
-
background:
|
|
658
|
+
background: color-mix(in srgb, var(--color-danger) 10%, transparent);
|
|
659
659
|
}
|
|
660
660
|
/* Fix UI overlay positioning to not interfere with canvas visibility */
|
|
661
661
|
.test-overlay {
|
|
@@ -823,14 +823,14 @@ body {
|
|
|
823
823
|
/* Timer Flash - Final seconds warning */
|
|
824
824
|
@keyframes timerFlash {
|
|
825
825
|
0%, 100% {
|
|
826
|
-
color:
|
|
827
|
-
text-shadow: 0 0 10px
|
|
828
|
-
0 0 20px
|
|
826
|
+
color: var(--color-korean-south);
|
|
827
|
+
text-shadow: 0 0 10px color-mix(in srgb, var(--color-korean-south) 80%, transparent),
|
|
828
|
+
0 0 20px color-mix(in srgb, var(--color-korean-south) 50%, transparent);
|
|
829
829
|
}
|
|
830
830
|
50% {
|
|
831
|
-
color:
|
|
832
|
-
text-shadow: 0 0 15px
|
|
833
|
-
0 0 30px
|
|
831
|
+
color: var(--color-korean-center);
|
|
832
|
+
text-shadow: 0 0 15px var(--color-korean-center),
|
|
833
|
+
0 0 30px color-mix(in srgb, var(--color-korean-center) 70%, transparent);
|
|
834
834
|
}
|
|
835
835
|
}
|
|
836
836
|
|
|
@@ -1006,9 +1006,9 @@ body {
|
|
|
1006
1006
|
.training-button {
|
|
1007
1007
|
width: 100%;
|
|
1008
1008
|
height: 40px;
|
|
1009
|
-
border: 2px solid
|
|
1009
|
+
border: 2px solid color-mix(in srgb, var(--color-text-primary) 80%, transparent);
|
|
1010
1010
|
border-radius: 8px;
|
|
1011
|
-
color:
|
|
1011
|
+
color: var(--color-text-primary);
|
|
1012
1012
|
font-weight: bold;
|
|
1013
1013
|
cursor: pointer;
|
|
1014
1014
|
display: flex;
|
|
@@ -1019,11 +1019,11 @@ body {
|
|
|
1019
1019
|
}
|
|
1020
1020
|
|
|
1021
1021
|
.training-button-start {
|
|
1022
|
-
background:
|
|
1022
|
+
background: var(--color-success);
|
|
1023
1023
|
}
|
|
1024
1024
|
|
|
1025
1025
|
.training-button-stop {
|
|
1026
|
-
background:
|
|
1026
|
+
background: var(--color-korean-south);
|
|
1027
1027
|
}
|
|
1028
1028
|
|
|
1029
1029
|
.training-button:hover {
|
|
@@ -1033,52 +1033,52 @@ body {
|
|
|
1033
1033
|
|
|
1034
1034
|
/* Training Mode Selector */
|
|
1035
1035
|
.mode-button {
|
|
1036
|
-
background:
|
|
1037
|
-
border: 2px solid
|
|
1036
|
+
background: color-mix(in srgb, var(--color-bg-light) 50%, transparent);
|
|
1037
|
+
border: 2px solid color-mix(in srgb, var(--color-primary-cyan) 40%, transparent);
|
|
1038
1038
|
border-radius: 8px;
|
|
1039
1039
|
padding: 10px;
|
|
1040
1040
|
cursor: pointer;
|
|
1041
1041
|
text-align: left;
|
|
1042
|
-
color:
|
|
1042
|
+
color: var(--color-text-primary);
|
|
1043
1043
|
transition: all 0.2s ease;
|
|
1044
1044
|
}
|
|
1045
1045
|
|
|
1046
1046
|
.mode-button.selected {
|
|
1047
|
-
background:
|
|
1048
|
-
border-color:
|
|
1049
|
-
box-shadow: 0 0 12px
|
|
1047
|
+
background: color-mix(in srgb, var(--color-primary-cyan) 25%, transparent);
|
|
1048
|
+
border-color: var(--color-primary-cyan);
|
|
1049
|
+
box-shadow: 0 0 12px color-mix(in srgb, var(--color-primary-cyan) 50%, transparent);
|
|
1050
1050
|
}
|
|
1051
1051
|
|
|
1052
1052
|
.mode-button:not(.selected):hover {
|
|
1053
|
-
background:
|
|
1054
|
-
border-color:
|
|
1053
|
+
background: color-mix(in srgb, var(--color-gray-300) 70%, transparent);
|
|
1054
|
+
border-color: var(--color-primary-cyan);
|
|
1055
1055
|
transform: scale(1.02);
|
|
1056
1056
|
}
|
|
1057
1057
|
|
|
1058
1058
|
.mode-button:focus-visible {
|
|
1059
|
-
outline: 2px solid
|
|
1059
|
+
outline: 2px solid var(--color-primary-cyan);
|
|
1060
1060
|
outline-offset: 2px;
|
|
1061
|
-
box-shadow: 0 0 12px
|
|
1061
|
+
box-shadow: 0 0 12px color-mix(in srgb, var(--color-primary-cyan) 80%, transparent);
|
|
1062
1062
|
}
|
|
1063
1063
|
|
|
1064
1064
|
/* Vital Point Button */
|
|
1065
1065
|
.vital-point-button {
|
|
1066
|
-
background:
|
|
1067
|
-
border: 2px solid
|
|
1066
|
+
background: color-mix(in srgb, var(--color-bg-light) 50%, transparent);
|
|
1067
|
+
border: 2px solid color-mix(in srgb, var(--color-korean-center) 50%, transparent);
|
|
1068
1068
|
border-radius: 8px;
|
|
1069
1069
|
padding: 8px;
|
|
1070
1070
|
cursor: pointer;
|
|
1071
1071
|
text-align: left;
|
|
1072
|
-
color:
|
|
1072
|
+
color: var(--color-text-primary);
|
|
1073
1073
|
transition: all 0.2s ease;
|
|
1074
1074
|
}
|
|
1075
1075
|
|
|
1076
1076
|
.vital-point-button.selected {
|
|
1077
|
-
background:
|
|
1077
|
+
background: color-mix(in srgb, var(--color-korean-center) 30%, transparent);
|
|
1078
1078
|
}
|
|
1079
1079
|
|
|
1080
1080
|
.vital-point-button:not(.selected):hover {
|
|
1081
|
-
background:
|
|
1081
|
+
background: color-mix(in srgb, var(--color-gray-300) 70%, transparent);
|
|
1082
1082
|
}
|
|
1083
1083
|
|
|
1084
1084
|
/* Training Feedback Animation - Fast and snappy */
|
|
@@ -1097,12 +1097,12 @@ body {
|
|
|
1097
1097
|
}
|
|
1098
1098
|
|
|
1099
1099
|
.training-feedback {
|
|
1100
|
-
background:
|
|
1101
|
-
border: 3px solid
|
|
1100
|
+
background: color-mix(in srgb, var(--color-primary-black) 90%, transparent);
|
|
1101
|
+
border: 3px solid var(--color-primary-gold);
|
|
1102
1102
|
border-radius: 16px;
|
|
1103
|
-
color:
|
|
1103
|
+
color: var(--color-primary-gold);
|
|
1104
1104
|
text-align: center;
|
|
1105
|
-
box-shadow: 0 0 30px
|
|
1105
|
+
box-shadow: 0 0 30px color-mix(in srgb, var(--color-primary-gold) 50%, transparent);
|
|
1106
1106
|
animation: feedbackPulse 0.4s ease-out;
|
|
1107
1107
|
min-width: 200px;
|
|
1108
1108
|
}
|
|
@@ -1133,7 +1133,7 @@ body {
|
|
|
1133
1133
|
width: 12px;
|
|
1134
1134
|
height: 12px;
|
|
1135
1135
|
border-radius: 50%;
|
|
1136
|
-
background:
|
|
1136
|
+
background: var(--color-success);
|
|
1137
1137
|
}
|
|
1138
1138
|
|
|
1139
1139
|
.status-indicator.active {
|
|
@@ -1141,6 +1141,6 @@ body {
|
|
|
1141
1141
|
}
|
|
1142
1142
|
|
|
1143
1143
|
.status-indicator.inactive {
|
|
1144
|
-
background:
|
|
1144
|
+
background: var(--color-gray-500);
|
|
1145
1145
|
}
|
|
1146
1146
|
/*$vite$:1*/
|
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
export * from "./screens/combat";
|
|
2
2
|
export { TrainingScreen3D } from "./screens/training";
|
|
3
|
+
export type { TrainingScreen3DProps } from "./screens/training";
|
|
4
|
+
export { EndScreen3D } from "./screens/endscreen";
|
|
5
|
+
export type { EndScreen3DProps } from "./screens/endscreen";
|
|
6
|
+
export { ControlsScreen3D } from "./screens/controls/ControlsScreen3D";
|
|
7
|
+
export type { ControlsScreen3DProps } from "./screens/controls/ControlsScreen3D";
|
|
8
|
+
export { IntroScreen3D } from "./screens/intro/IntroScreen3D";
|
|
9
|
+
export type { IntroScreen3DProps } from "./screens/intro/IntroScreen3D";
|
|
10
|
+
export { PhilosophyScreen3D } from "./screens/philosophy/PhilosophyScreen3D";
|
|
11
|
+
export type { PhilosophyScreen3DProps } from "./screens/philosophy/PhilosophyScreen3D";
|
|
3
12
|
export { ArchetypeCard, KoreanButton, KoreanPanel, KoreanText as KoreanText3D, MenuList, ProgressBar, } from "./shared/three";
|
|
4
13
|
export type { ArchetypeCardProps, KoreanButtonProps, KoreanPanelProps, KoreanTextProps, MenuItem, MenuListProps, ProgressBarProps, ProgressBarType, } from "./shared/three";
|
|
5
14
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AACA,cAAc,kBAAkB,CAAC;AACjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,YAAY,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,YAAY,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AACvE,YAAY,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AACjF,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,YAAY,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACxE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAC7E,YAAY,EAAE,uBAAuB,EAAE,MAAM,yCAAyC,CAAC;AAGvF,OAAO,EACL,aAAa,EACb,YAAY,EACZ,WAAW,EACX,UAAU,IAAI,YAAY,EAC1B,QAAQ,EACR,WAAW,GACZ,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACV,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EACf,QAAQ,EACR,aAAa,EACb,gBAAgB,EAChB,eAAe,GAChB,MAAM,gBAAgB,CAAC"}
|