blacktrigram 0.7.44 → 0.7.45
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/audio/AudioManager.d.ts +26 -0
- package/lib/audio/AudioManager.d.ts.map +1 -1
- package/lib/audio/AudioManager.js +26 -0
- package/lib/audio/AudioManager.js.map +1 -1
- package/lib/audio/index.d.ts.map +1 -1
- package/lib/audio/index.js.map +1 -1
- package/lib/audio/types.d.ts +18 -2
- package/lib/audio/types.d.ts.map +1 -1
- package/lib/audio/types.js +1 -0
- package/lib/audio/types.js.map +1 -1
- package/lib/components/effects/WindParticles3D.d.ts.map +1 -1
- package/lib/components/index.d.ts.map +1 -1
- package/lib/components/index.js.map +1 -1
- package/lib/components/screens/combat/CombatScreen3D.d.ts.map +1 -1
- package/lib/components/screens/combat/CombatScreen3D.js.map +1 -1
- package/lib/components/screens/combat/components/controls/KeyboardHints.d.ts +0 -1
- package/lib/components/screens/combat/components/controls/KeyboardHints.d.ts.map +1 -1
- package/lib/components/screens/combat/components/controls/KeyboardHints.js +0 -1
- package/lib/components/screens/combat/components/controls/KeyboardHints.js.map +1 -1
- package/lib/components/screens/combat/components/controls/PauseMenu.d.ts.map +1 -1
- package/lib/components/screens/combat/components/controls/PauseMenu.js.map +1 -1
- package/lib/components/screens/combat/components/effects/ArterialSpray3D.d.ts.map +1 -1
- package/lib/components/screens/combat/components/effects/BloodDecals3D.d.ts.map +1 -1
- package/lib/components/screens/combat/components/effects/BloodDecals3D.js.map +1 -1
- package/lib/components/screens/combat/components/effects/BloodLossOverlayHtml.d.ts.map +1 -1
- package/lib/components/screens/combat/components/effects/BloodLossOverlayHtml.js.map +1 -1
- package/lib/components/screens/combat/components/effects/BloodParticles3D.d.ts.map +1 -1
- package/lib/components/screens/combat/components/effects/BloodParticles3D.js.map +1 -1
- package/lib/components/screens/combat/components/effects/BloodViscosity3D.d.ts.map +1 -1
- package/lib/components/screens/combat/components/effects/BloodViscosity3D.js.map +1 -1
- package/lib/components/screens/combat/components/effects/BoneCrackParticles3D.d.ts.map +1 -1
- package/lib/components/screens/combat/components/effects/CombatParticleEffects3D.d.ts.map +1 -1
- package/lib/components/screens/combat/components/effects/CombatParticleEffects3D.js.map +1 -1
- package/lib/components/screens/combat/components/effects/ConsciousnessBlur.d.ts.map +1 -1
- package/lib/components/screens/combat/components/effects/ConsciousnessBlur.js.map +1 -1
- package/lib/components/screens/combat/components/effects/DustClouds3D.d.ts.map +1 -1
- package/lib/components/screens/combat/components/effects/EarthCrackEffect3D.d.ts.map +1 -1
- package/lib/components/screens/combat/components/effects/EarthHealingEffect3D.d.ts.map +1 -1
- package/lib/components/screens/combat/components/effects/ImpactSparks3D.d.ts.map +1 -1
- package/lib/components/screens/combat/components/effects/InternalDamage3D.d.ts.map +1 -1
- package/lib/components/screens/combat/components/effects/InternalDamage3D.js.map +1 -1
- package/lib/components/screens/combat/components/effects/LiPrecisionTargetingOverlay.d.ts.map +1 -1
- package/lib/components/screens/combat/components/effects/NerveStrikeParticles3D.d.ts.map +1 -1
- package/lib/components/screens/combat/components/effects/PainVignette.d.ts.map +1 -1
- package/lib/components/screens/combat/components/effects/PainVignette.js.map +1 -1
- package/lib/components/screens/combat/components/effects/ParticleAudio3D.d.ts.map +1 -1
- package/lib/components/screens/combat/components/effects/ParticleAudio3D.js.map +1 -1
- package/lib/components/screens/combat/components/effects/TraumaOverlay3D.d.ts.map +1 -1
- package/lib/components/screens/combat/components/effects/TraumaOverlay3D.js.map +1 -1
- package/lib/components/screens/combat/components/effects/WaterRipple3D.d.ts.map +1 -1
- package/lib/components/screens/combat/components/effects/WaterWave3D.d.ts.map +1 -1
- package/lib/components/screens/combat/components/effects/index.d.ts.map +1 -1
- package/lib/components/screens/combat/components/feedback/MatchCountdown.d.ts.map +1 -1
- package/lib/components/screens/combat/components/feedback/MatchCountdown.js.map +1 -1
- package/lib/components/screens/combat/components/feedback/RoundAnnouncementOverlayHtml.d.ts.map +1 -1
- package/lib/components/screens/combat/components/feedback/RoundAnnouncementOverlayHtml.js.map +1 -1
- package/lib/components/screens/combat/components/feedback/RoundStartAnnouncementOverlayHtml.d.ts.map +1 -1
- package/lib/components/screens/combat/components/feedback/RoundStartAnnouncementOverlayHtml.js.map +1 -1
- package/lib/components/screens/combat/components/hud/CombatBottomHUD.d.ts.map +1 -1
- package/lib/components/screens/combat/components/hud/CombatBottomHUD.js.map +1 -1
- package/lib/components/screens/combat/components/hud/CombatLeftHUD.d.ts.map +1 -1
- package/lib/components/screens/combat/components/hud/CombatLeftHUD.js.map +1 -1
- package/lib/components/screens/combat/components/hud/CombatPortraitStatusStrip.d.ts.map +1 -1
- package/lib/components/screens/combat/components/hud/CombatPortraitStatusStrip.js.map +1 -1
- package/lib/components/screens/combat/components/hud/CombatRightHUD.d.ts.map +1 -1
- package/lib/components/screens/combat/components/hud/CombatRightHUD.js.map +1 -1
- package/lib/components/screens/combat/components/hud/CombatTopHUD.d.ts.map +1 -1
- package/lib/components/screens/combat/components/hud/CombatTopHUD.js.map +1 -1
- package/lib/components/screens/combat/components/hud/DifficultyIndicator.d.ts.map +1 -1
- package/lib/components/screens/combat/components/hud/DifficultyIndicator.js.map +1 -1
- package/lib/components/screens/combat/components/hud/FPSMonitor.d.ts.map +1 -1
- package/lib/components/screens/combat/components/hud/FPSMonitor.js.map +1 -1
- package/lib/components/screens/combat/components/hud/PlayerStateOverlayHtml.d.ts.map +1 -1
- package/lib/components/screens/combat/components/hud/PlayerStateOverlayHtml.js.map +1 -1
- package/lib/components/screens/combat/components/indicators/BalanceIndicator.d.ts.map +1 -1
- package/lib/components/screens/combat/components/indicators/BalanceIndicator.js.map +1 -1
- package/lib/components/screens/combat/components/indicators/InputBufferDisplay.d.ts +0 -1
- package/lib/components/screens/combat/components/indicators/InputBufferDisplay.d.ts.map +1 -1
- package/lib/components/screens/combat/components/indicators/InputBufferDisplay.js +0 -1
- package/lib/components/screens/combat/components/indicators/InputBufferDisplay.js.map +1 -1
- package/lib/components/screens/combat/components/indicators/StaminaWarning.d.ts.map +1 -1
- package/lib/components/screens/combat/components/indicators/StaminaWarning.js.map +1 -1
- package/lib/components/screens/combat/components/indicators/TechniqueNameDisplay.d.ts +0 -2
- package/lib/components/screens/combat/components/indicators/TechniqueNameDisplay.d.ts.map +1 -1
- package/lib/components/screens/combat/components/indicators/TechniqueNameDisplay.js +0 -1
- package/lib/components/screens/combat/components/indicators/TechniqueNameDisplay.js.map +1 -1
- package/lib/components/screens/combat/helpers/AnimationUpdater.d.ts.map +1 -1
- package/lib/components/screens/combat/helpers/AnimationUpdater.js.map +1 -1
- package/lib/components/screens/combat/helpers/combatHelpers.d.ts.map +1 -1
- package/lib/components/screens/combat/helpers/combatHelpers.js.map +1 -1
- package/lib/components/screens/combat/hooks/useAICombat.d.ts.map +1 -1
- package/lib/components/screens/combat/hooks/useAICombat.js.map +1 -1
- package/lib/components/screens/combat/hooks/useCombatActions.d.ts.map +1 -1
- package/lib/components/screens/combat/hooks/useCombatActions.js.map +1 -1
- package/lib/components/screens/combat/hooks/useCombatAttackMovement.d.ts.map +1 -1
- package/lib/components/screens/combat/hooks/useCombatAttackMovement.js.map +1 -1
- package/lib/components/screens/combat/hooks/useCombatAudio.d.ts.map +1 -1
- package/lib/components/screens/combat/hooks/useCombatAudio.js.map +1 -1
- package/lib/components/screens/combat/hooks/useCombatLayout.d.ts.map +1 -1
- package/lib/components/screens/combat/hooks/useCombatLayout.js.map +1 -1
- package/lib/components/screens/combat/hooks/useCombatState.d.ts.map +1 -1
- package/lib/components/screens/combat/hooks/useCombatState.js.map +1 -1
- package/lib/components/screens/combat/hooks/useGrapplingAudio.d.ts.map +1 -1
- package/lib/components/screens/combat/hooks/usePreloadCombatAudio.d.ts.map +1 -1
- package/lib/components/screens/controls/ControlsScreen3D.d.ts.map +1 -1
- package/lib/components/screens/controls/ControlsScreen3D.js.map +1 -1
- package/lib/components/screens/controls/components/ControlBindingsOverlayHtml.d.ts.map +1 -1
- package/lib/components/screens/controls/components/ControlBindingsOverlayHtml.js.map +1 -1
- package/lib/components/screens/controls/components/GamepadVisualization3D.d.ts.map +1 -1
- package/lib/components/screens/controls/components/GamepadVisualization3D.js.map +1 -1
- package/lib/components/screens/controls/components/InteractiveControlDemoOverlayHtml.d.ts.map +1 -1
- package/lib/components/screens/controls/components/InteractiveControlDemoOverlayHtml.js.map +1 -1
- package/lib/components/screens/controls/components/Key3D.d.ts.map +1 -1
- package/lib/components/screens/controls/components/Key3D.js.map +1 -1
- package/lib/components/screens/controls/components/VisualKeyboard3D.d.ts.map +1 -1
- package/lib/components/screens/controls/components/VisualKeyboard3D.js.map +1 -1
- package/lib/components/screens/controls/constants/ControlsConstants.d.ts.map +1 -1
- package/lib/components/screens/controls/constants/ControlsConstants.js.map +1 -1
- package/lib/components/screens/controls/hooks/useControlsState.d.ts.map +1 -1
- package/lib/components/screens/controls/hooks/useControlsState.js.map +1 -1
- package/lib/components/screens/endscreen/EndScreen3D.d.ts.map +1 -1
- package/lib/components/screens/endscreen/EndScreen3D.js.map +1 -1
- package/lib/components/screens/endscreen/components/DefeatAnimation3D.d.ts.map +1 -1
- package/lib/components/screens/endscreen/components/DefeatAnimation3D.js.map +1 -1
- package/lib/components/screens/endscreen/components/NavigationButtonsOverlayHtml.d.ts.map +1 -1
- package/lib/components/screens/endscreen/components/NavigationButtonsOverlayHtml.js.map +1 -1
- package/lib/components/screens/endscreen/components/PerformanceBreakdownOverlayHtml.d.ts.map +1 -1
- package/lib/components/screens/endscreen/components/PerformanceBreakdownOverlayHtml.js.map +1 -1
- package/lib/components/screens/endscreen/components/PerformanceRatingOverlayHtml.d.ts.map +1 -1
- package/lib/components/screens/endscreen/components/PerformanceRatingOverlayHtml.js.map +1 -1
- package/lib/components/screens/endscreen/components/VictoryAnimation3D.d.ts.map +1 -1
- package/lib/components/screens/endscreen/components/VictoryAnimation3D.js.map +1 -1
- package/lib/components/screens/endscreen/components/WinnerDisplayOverlayHtml.d.ts.map +1 -1
- package/lib/components/screens/endscreen/components/WinnerDisplayOverlayHtml.js.map +1 -1
- package/lib/components/screens/endscreen/components/index.d.ts.map +1 -1
- package/lib/components/screens/endscreen/index.d.ts.map +1 -1
- package/lib/components/screens/intro/IntroScreen3D.d.ts.map +1 -1
- package/lib/components/screens/intro/IntroScreen3D.js +1 -1
- package/lib/components/screens/intro/IntroScreen3D.js.map +1 -1
- package/lib/components/screens/intro/components/AbilityListOverlayHtml.d.ts.map +1 -1
- package/lib/components/screens/intro/components/AbilityListOverlayHtml.js.map +1 -1
- package/lib/components/screens/intro/components/ArchetypeCardGridOverlayHtml.d.ts.map +1 -1
- package/lib/components/screens/intro/components/ArchetypeCardGridOverlayHtml.js.map +1 -1
- package/lib/components/screens/intro/components/ArchetypeCardOverlayHtml.d.ts.map +1 -1
- package/lib/components/screens/intro/components/ArchetypeCardOverlayHtml.js.map +1 -1
- package/lib/components/screens/intro/components/ArchetypeDisplayOverlayHtml.d.ts.map +1 -1
- package/lib/components/screens/intro/components/ArchetypeDisplayOverlayHtml.js.map +1 -1
- package/lib/components/screens/intro/components/EnhancedArchetypeDisplayOverlayHtml.d.ts.map +1 -1
- package/lib/components/screens/intro/components/EnhancedArchetypeDisplayOverlayHtml.js.map +1 -1
- package/lib/components/screens/intro/components/MenuButtonsOverlayHtml.d.ts.map +1 -1
- package/lib/components/screens/intro/components/MenuButtonsOverlayHtml.js.map +1 -1
- package/lib/components/screens/intro/components/MenuSectionOverlayHtml.d.ts.map +1 -1
- package/lib/components/screens/intro/components/MenuSectionOverlayHtml.js.map +1 -1
- package/lib/components/screens/intro/components/StatBarOverlayHtml.d.ts.map +1 -1
- package/lib/components/screens/intro/components/StatBarOverlayHtml.js.map +1 -1
- package/lib/components/screens/philosophy/PhilosophyScreen3D.d.ts.map +1 -1
- package/lib/components/screens/philosophy/PhilosophyScreen3D.js.map +1 -1
- package/lib/components/screens/philosophy/components/InteractiveTrigramGridOverlayHtml.d.ts +0 -1
- package/lib/components/screens/philosophy/components/InteractiveTrigramGridOverlayHtml.d.ts.map +1 -1
- package/lib/components/screens/philosophy/components/PhilosophyNavigationOverlayHtml.d.ts +0 -1
- package/lib/components/screens/philosophy/components/PhilosophyNavigationOverlayHtml.d.ts.map +1 -1
- package/lib/components/screens/philosophy/components/PhilosophySectionOverlayHtml.d.ts +0 -1
- package/lib/components/screens/philosophy/components/PhilosophySectionOverlayHtml.d.ts.map +1 -1
- package/lib/components/screens/philosophy/components/PhilosophyTextOverlayHtml.d.ts +0 -1
- package/lib/components/screens/philosophy/components/PhilosophyTextOverlayHtml.d.ts.map +1 -1
- package/lib/components/screens/philosophy/components/TrigramSymbol3D.d.ts +0 -1
- package/lib/components/screens/philosophy/components/TrigramSymbol3D.d.ts.map +1 -1
- package/lib/components/screens/philosophy/components/TrigramVisualization3D.d.ts +0 -1
- package/lib/components/screens/philosophy/components/TrigramVisualization3D.d.ts.map +1 -1
- package/lib/components/screens/philosophy/hooks/usePhilosophyState.d.ts +0 -1
- package/lib/components/screens/philosophy/hooks/usePhilosophyState.d.ts.map +1 -1
- package/lib/components/screens/training/TrainingScreen3D.d.ts.map +1 -1
- package/lib/components/screens/training/TrainingScreen3D.js.map +1 -1
- package/lib/components/screens/training/components/AnatomyControlsOverlayHtml.d.ts.map +1 -1
- package/lib/components/screens/training/components/AnatomyControlsOverlayHtml.js.map +1 -1
- package/lib/components/screens/training/components/AnatomyOverlay3D.d.ts.map +1 -1
- package/lib/components/screens/training/components/AnatomyOverlay3D.js.map +1 -1
- package/lib/components/screens/training/components/DamageNumber3D.d.ts.map +1 -1
- package/lib/components/screens/training/components/FootPlacementMarkers3D.d.ts.map +1 -1
- package/lib/components/screens/training/components/FootPlacementMarkers3D.js.map +1 -1
- package/lib/components/screens/training/components/FootworkDrillsOverlayHtml.d.ts.map +1 -1
- package/lib/components/screens/training/components/FootworkDrillsOverlayHtml.js.map +1 -1
- package/lib/components/screens/training/components/HitFeedbackEffect3D.d.ts.map +1 -1
- package/lib/components/screens/training/components/HitFeedbackEffect3D.js.map +1 -1
- package/lib/components/screens/training/components/TrainingAICharacter3D.d.ts.map +1 -1
- package/lib/components/screens/training/components/TrainingArena3D.d.ts.map +1 -1
- package/lib/components/screens/training/components/TrainingControlsOverlayHtml.d.ts.map +1 -1
- package/lib/components/screens/training/components/TrainingControlsOverlayHtml.js.map +1 -1
- package/lib/components/screens/training/components/TrainingDummy3D.d.ts.map +1 -1
- package/lib/components/screens/training/components/TrainingDummy3D.js.map +1 -1
- package/lib/components/screens/training/components/TrainingFeedbackOverlayHtml.d.ts.map +1 -1
- package/lib/components/screens/training/components/TrainingFeedbackOverlayHtml.js.map +1 -1
- package/lib/components/screens/training/components/TrainingHitEffects3D.d.ts.map +1 -1
- package/lib/components/screens/training/components/TrainingModeSelectorOverlayHtml.d.ts.map +1 -1
- package/lib/components/screens/training/components/TrainingModeSelectorOverlayHtml.js.map +1 -1
- package/lib/components/screens/training/components/TrainingStatsOverlayHtml.d.ts.map +1 -1
- package/lib/components/screens/training/components/TrainingStatsOverlayHtml.js.map +1 -1
- package/lib/components/screens/training/components/VitalPointMarker3D.d.ts.map +1 -1
- package/lib/components/screens/training/components/VitalPointMarker3D.js.map +1 -1
- package/lib/components/screens/training/components/VitalPointTrainingOverlayHtml.d.ts.map +1 -1
- package/lib/components/screens/training/components/VitalPointTrainingOverlayHtml.js.map +1 -1
- package/lib/components/screens/training/components/hud/TrainingBottomHUD.d.ts.map +1 -1
- package/lib/components/screens/training/components/hud/TrainingBottomHUD.js.map +1 -1
- package/lib/components/screens/training/components/hud/TrainingLeftHUD.d.ts.map +1 -1
- package/lib/components/screens/training/components/hud/TrainingLeftHUD.js.map +1 -1
- package/lib/components/screens/training/components/hud/TrainingRightHUD.d.ts.map +1 -1
- package/lib/components/screens/training/components/hud/TrainingRightHUD.js.map +1 -1
- package/lib/components/screens/training/components/hud/TrainingTopHUD.d.ts.map +1 -1
- package/lib/components/screens/training/components/hud/TrainingTopHUD.js.map +1 -1
- package/lib/components/screens/training/components/index.d.ts.map +1 -1
- package/lib/components/screens/training/hooks/useAttackMovement.d.ts.map +1 -1
- package/lib/components/screens/training/hooks/useAttackMovement.js.map +1 -1
- package/lib/components/screens/training/hooks/useTrainingActions.d.ts.map +1 -1
- package/lib/components/screens/training/hooks/useTrainingActions.js.map +1 -1
- package/lib/components/screens/training/hooks/useTrainingLayout.d.ts.map +1 -1
- package/lib/components/screens/training/hooks/useTrainingLayout.js.map +1 -1
- package/lib/components/screens/training/hooks/useTrainingState.d.ts.map +1 -1
- package/lib/components/screens/training/hooks/useTrainingState.js.map +1 -1
- package/lib/components/shared/base/AccessibilityProvider.d.ts.map +1 -1
- package/lib/components/shared/base/BaseButton.d.ts.map +1 -1
- package/lib/components/shared/base/BaseButton.js.map +1 -1
- package/lib/components/shared/base/BaseButtonOverlayHtml.d.ts.map +1 -1
- package/lib/components/shared/base/BaseButtonOverlayHtml.js.map +1 -1
- package/lib/components/shared/base/BasePanel.d.ts.map +1 -1
- package/lib/components/shared/base/BasePanel.js.map +1 -1
- package/lib/components/shared/base/BaseText.d.ts.map +1 -1
- package/lib/components/shared/base/BaseText.js.map +1 -1
- package/lib/components/shared/base/ResponsiveContainer.d.ts.map +1 -1
- package/lib/components/shared/base/index.d.ts.map +1 -1
- package/lib/components/shared/base/useKoreanTheme.d.ts.map +1 -1
- package/lib/components/shared/base/useKoreanTheme.js.map +1 -1
- package/lib/components/shared/debug/PerformanceDebugOverlayHtml.d.ts.map +1 -1
- package/lib/components/shared/debug/PerformanceDebugOverlayHtml.js.map +1 -1
- package/lib/components/shared/effects/ScreenFlash.d.ts.map +1 -1
- package/lib/components/shared/mobile/ActionButtons.d.ts.map +1 -1
- package/lib/components/shared/mobile/ActionButtons.js +0 -1
- package/lib/components/shared/mobile/ActionButtons.js.map +1 -1
- package/lib/components/shared/mobile/GestureRecognizerPure.d.ts +0 -1
- package/lib/components/shared/mobile/GestureRecognizerPure.d.ts.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.d.ts +0 -13
- package/lib/components/shared/mobile/HapticController.d.ts.map +1 -1
- package/lib/components/shared/mobile/HapticController.js +0 -10
- package/lib/components/shared/mobile/HapticController.js.map +1 -1
- package/lib/components/shared/mobile/MobileControlsPure.d.ts.map +1 -1
- package/lib/components/shared/mobile/MobileControlsPure.js.map +1 -1
- package/lib/components/shared/mobile/PerformanceMonitor.d.ts +0 -15
- package/lib/components/shared/mobile/PerformanceMonitor.d.ts.map +1 -1
- package/lib/components/shared/mobile/StanceWheelPure.d.ts +0 -1
- package/lib/components/shared/mobile/StanceWheelPure.d.ts.map +1 -1
- package/lib/components/shared/mobile/StanceWheelPure.js +0 -1
- package/lib/components/shared/mobile/StanceWheelPure.js.map +1 -1
- package/lib/components/shared/mobile/TouchOptimizer.d.ts +0 -4
- package/lib/components/shared/mobile/TouchOptimizer.d.ts.map +1 -1
- package/lib/components/shared/mobile/TouchOptimizer.js +0 -3
- package/lib/components/shared/mobile/TouchOptimizer.js.map +1 -1
- package/lib/components/shared/mobile/VirtualDPad.d.ts.map +1 -1
- package/lib/components/shared/mobile/VirtualDPad.js +0 -1
- package/lib/components/shared/mobile/VirtualDPad.js.map +1 -1
- package/lib/components/shared/mobile/index.d.ts.map +1 -1
- package/lib/components/shared/three/anatomy/BodySurface.d.ts.map +1 -1
- package/lib/components/shared/three/anatomy/BodySurface.js.map +1 -1
- package/lib/components/shared/three/anatomy/BoneAttachedMuscles.d.ts.map +1 -1
- package/lib/components/shared/three/anatomy/BoneAttachedMuscles.js.map +1 -1
- package/lib/components/shared/three/anatomy/BoneClothing.d.ts.map +1 -1
- package/lib/components/shared/three/anatomy/BoneClothing.js.map +1 -1
- package/lib/components/shared/three/anatomy/BoneRenderer.d.ts +0 -1
- package/lib/components/shared/three/anatomy/BoneRenderer.d.ts.map +1 -1
- package/lib/components/shared/three/anatomy/BoneRenderer.js.map +1 -1
- package/lib/components/shared/three/anatomy/Face3D.d.ts.map +1 -1
- package/lib/components/shared/three/anatomy/Face3D.js.map +1 -1
- package/lib/components/shared/three/anatomy/Foot3D.d.ts +0 -1
- package/lib/components/shared/three/anatomy/Foot3D.d.ts.map +1 -1
- package/lib/components/shared/three/anatomy/Foot3D.js.map +1 -1
- package/lib/components/shared/three/anatomy/Hand3D.d.ts +0 -1
- package/lib/components/shared/three/anatomy/Hand3D.d.ts.map +1 -1
- package/lib/components/shared/three/anatomy/Hand3D.js.map +1 -1
- package/lib/components/shared/three/effects/ActionFeedback.d.ts.map +1 -1
- package/lib/components/shared/three/effects/ActionFeedback.js.map +1 -1
- package/lib/components/shared/three/effects/DamageNumbers.d.ts.map +1 -1
- package/lib/components/shared/three/effects/DamageNumbers.js.map +1 -1
- package/lib/components/shared/three/effects/ExplosiveBurstEffect3D.d.ts.map +1 -1
- package/lib/components/shared/three/effects/GrapplingIndicator3D.d.ts.map +1 -1
- package/lib/components/shared/three/effects/HitEffects3D.d.ts.map +1 -1
- package/lib/components/shared/three/effects/HitEffects3D.js.map +1 -1
- package/lib/components/shared/three/effects/LimbExposureIndicator3D.d.ts.map +1 -1
- package/lib/components/shared/three/effects/NerveDisruptionEffect3D.d.ts.map +1 -1
- package/lib/components/shared/three/effects/PlayerStateIndicators.d.ts.map +1 -1
- package/lib/components/shared/three/effects/PlayerStateIndicators.js.map +1 -1
- package/lib/components/shared/three/effects/StanceSymbol3D.d.ts.map +1 -1
- package/lib/components/shared/three/effects/StanceSymbol3D.js.map +1 -1
- package/lib/components/shared/three/effects/StanceTransitionEffect.d.ts.map +1 -1
- package/lib/components/shared/three/effects/StanceTransitionEffect.js.map +1 -1
- package/lib/components/shared/three/effects/ThunderEffect3D.d.ts.map +1 -1
- package/lib/components/shared/three/effects/VitalPointMarkers3D.d.ts.map +1 -1
- package/lib/components/shared/three/effects/VitalPointMarkers3D.js.map +1 -1
- package/lib/components/shared/three/index.d.ts.map +1 -1
- package/lib/components/shared/three/indicators/ElementalColorSystem.d.ts +0 -6
- package/lib/components/shared/three/indicators/ElementalColorSystem.d.ts.map +1 -1
- package/lib/components/shared/three/indicators/ElementalColorSystem.js +0 -4
- package/lib/components/shared/three/indicators/ElementalColorSystem.js.map +1 -1
- package/lib/components/shared/three/indicators/GuardIndicator.d.ts +0 -1
- package/lib/components/shared/three/indicators/GuardIndicator.d.ts.map +1 -1
- package/lib/components/shared/three/indicators/GuardIndicator.js +0 -1
- package/lib/components/shared/three/indicators/GuardIndicator.js.map +1 -1
- package/lib/components/shared/three/indicators/HapticFeedback.d.ts +0 -7
- package/lib/components/shared/three/indicators/HapticFeedback.d.ts.map +1 -1
- package/lib/components/shared/three/indicators/HapticFeedback.js +0 -2
- package/lib/components/shared/three/indicators/HapticFeedback.js.map +1 -1
- package/lib/components/shared/three/indicators/StanceChangeIndicator.d.ts +0 -1
- package/lib/components/shared/three/indicators/StanceChangeIndicator.d.ts.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/indicators/TrigramSymbol3D.d.ts +0 -1
- package/lib/components/shared/three/indicators/TrigramSymbol3D.d.ts.map +1 -1
- package/lib/components/shared/three/models/Player3DWithTransitions.d.ts.map +1 -1
- package/lib/components/shared/three/models/Player3DWithTransitions.js.map +1 -1
- package/lib/components/shared/three/models/SkeletalPlayer3D.d.ts.map +1 -1
- package/lib/components/shared/three/models/SkeletalPlayer3D.js.map +1 -1
- package/lib/components/shared/three/optimization/AdaptiveQuality.d.ts.map +1 -1
- package/lib/components/shared/three/optimization/AdaptiveQuality.js.map +1 -1
- package/lib/components/shared/three/optimization/InstancedGeometry.d.ts.map +1 -1
- package/lib/components/shared/three/optimization/LODSystem.d.ts.map +1 -1
- package/lib/components/shared/three/scene/AtmosphericParticles3D.d.ts.map +1 -1
- package/lib/components/shared/three/scene/AtmosphericParticles3D.js.map +1 -1
- package/lib/components/shared/three/scene/BackgroundScene3D.d.ts.map +1 -1
- package/lib/components/shared/three/scene/BackgroundScene3D.js.map +1 -1
- package/lib/components/shared/three/scene/CombatArena3D.d.ts.map +1 -1
- package/lib/components/shared/three/scene/CombatArena3D.js.map +1 -1
- package/lib/components/shared/three/scene/DebugCollision.d.ts +0 -2
- package/lib/components/shared/three/scene/DebugCollision.d.ts.map +1 -1
- package/lib/components/shared/three/scene/KoreanSignage3D.d.ts.map +1 -1
- package/lib/components/shared/three/scene/KoreanSignage3D.js.map +1 -1
- package/lib/components/shared/three/ui/ArchetypeCard.d.ts.map +1 -1
- package/lib/components/shared/three/ui/ArchetypeCard.js.map +1 -1
- package/lib/components/shared/three/ui/BodyPartHealthDisplay.d.ts.map +1 -1
- package/lib/components/shared/three/ui/BodyPartHealthDisplay.js.map +1 -1
- package/lib/components/shared/three/ui/BreathingIndicator.d.ts.map +1 -1
- package/lib/components/shared/three/ui/BreathingIndicator2.js.map +1 -1
- package/lib/components/shared/three/ui/CombatReadinessBar.d.ts.map +1 -1
- package/lib/components/shared/three/ui/CombatReadinessBar.js.map +1 -1
- package/lib/components/shared/three/ui/ComboCounter.d.ts.map +1 -1
- package/lib/components/shared/three/ui/ComboCounter.js.map +1 -1
- package/lib/components/shared/three/ui/HealthBar.d.ts.map +1 -1
- package/lib/components/shared/three/ui/HealthBar.js.map +1 -1
- package/lib/components/shared/three/ui/KoreanButton.d.ts.map +1 -1
- package/lib/components/shared/three/ui/KoreanButton.js.map +1 -1
- package/lib/components/shared/three/ui/KoreanPanel.d.ts.map +1 -1
- package/lib/components/shared/three/ui/KoreanPanel.js.map +1 -1
- package/lib/components/shared/three/ui/KoreanText.d.ts.map +1 -1
- package/lib/components/shared/three/ui/KoreanText.js.map +1 -1
- package/lib/components/shared/three/ui/MenuList.d.ts.map +1 -1
- package/lib/components/shared/three/ui/MenuList.js.map +1 -1
- package/lib/components/shared/three/ui/PlayerHUD.d.ts.map +1 -1
- package/lib/components/shared/three/ui/PlayerHUD.js.map +1 -1
- package/lib/components/shared/three/ui/ProgressBar.d.ts.map +1 -1
- package/lib/components/shared/three/ui/ProgressBar.js.map +1 -1
- package/lib/components/shared/three/ui/SpeedIndicatorHUD.d.ts +0 -1
- package/lib/components/shared/three/ui/SpeedIndicatorHUD.d.ts.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.d.ts.map +1 -1
- package/lib/components/shared/three/ui/StaminaBar.js.map +1 -1
- package/lib/components/shared/three/ui/TechniqueBar.d.ts.map +1 -1
- package/lib/components/shared/three/ui/TechniqueBar.js.map +1 -1
- package/lib/components/shared/three/ui/TechniqueBarContainer.d.ts.map +1 -1
- package/lib/components/shared/three/ui/TechniqueCard.d.ts.map +1 -1
- 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.map +1 -1
- package/lib/components/shared/three/ui/VulnerabilityWindowHUD.d.ts.map +1 -1
- package/lib/components/shared/ui/BaseHUDContainer.d.ts.map +1 -1
- package/lib/components/shared/ui/BaseHUDContainer.js.map +1 -1
- package/lib/components/shared/ui/CombatTimer.d.ts.map +1 -1
- package/lib/components/shared/ui/CombatTimer.js.map +1 -1
- package/lib/components/shared/ui/ErrorBoundary.d.ts.map +1 -1
- package/lib/components/shared/ui/ErrorModal.d.ts.map +1 -1
- package/lib/components/shared/ui/ErrorModal.js.map +1 -1
- package/lib/components/shared/ui/HUDSection.d.ts.map +1 -1
- package/lib/components/shared/ui/LoadingState.d.ts.map +1 -1
- package/lib/components/shared/ui/LoadingState.js.map +1 -1
- package/lib/components/shared/ui/MobileHUDLayout.d.ts +0 -1
- package/lib/components/shared/ui/MobileHUDLayout.d.ts.map +1 -1
- package/lib/components/shared/ui/ResponsiveContainer.d.ts +0 -1
- package/lib/components/shared/ui/ResponsiveContainer.d.ts.map +1 -1
- package/lib/components/shared/ui/SplashScreen.d.ts.map +1 -1
- package/lib/components/shared/ui/SplashScreen.js +2 -2
- package/lib/components/shared/ui/SplashScreen.js.map +1 -1
- package/lib/components/shared/ui/StyledHUDPanel.d.ts.map +1 -1
- package/lib/components/shared/ui/VitalPointOverlayControlsPure.d.ts.map +1 -1
- package/lib/components/shared/ui/VitalPointOverlayControlsPure.js.map +1 -1
- package/lib/components/shared/ui/VolumeControl.d.ts.map +1 -1
- package/lib/components/shared/ui/VolumeControl.js.map +1 -1
- package/lib/components/shared/ui/shared/ConfirmDialog.d.ts.map +1 -1
- package/lib/components/shared/ui/shared/ConfirmDialog.js.map +1 -1
- package/lib/components/test/Hello3D.d.ts.map +1 -1
- package/lib/components/ui/combat/BalanceIndicatorOverlayHtml.d.ts.map +1 -1
- package/lib/components/ui/combat/BalanceIndicatorOverlayHtml.js.map +1 -1
- package/lib/components/ui/combat/ComboCounter.d.ts.map +1 -1
- package/lib/components/ui/combat/PressureMeter.d.ts.map +1 -1
- package/lib/systems/CombatSystem.d.ts +0 -6
- package/lib/systems/CombatSystem.d.ts.map +1 -1
- package/lib/systems/CombatSystem.js +0 -6
- package/lib/systems/CombatSystem.js.map +1 -1
- package/lib/systems/EffectCalculator.d.ts +0 -7
- package/lib/systems/EffectCalculator.d.ts.map +1 -1
- package/lib/systems/EffectCalculator.js +0 -4
- package/lib/systems/EffectCalculator.js.map +1 -1
- package/lib/systems/LayoutSystem.d.ts +0 -1
- package/lib/systems/LayoutSystem.d.ts.map +1 -1
- package/lib/systems/LayoutSystem.js +0 -1
- package/lib/systems/LayoutSystem.js.map +1 -1
- package/lib/systems/PlayerEffectManager.d.ts +0 -10
- package/lib/systems/PlayerEffectManager.d.ts.map +1 -1
- package/lib/systems/PlayerEffectManager.js +0 -3
- package/lib/systems/PlayerEffectManager.js.map +1 -1
- package/lib/systems/ResponsiveScaling.d.ts +0 -12
- package/lib/systems/ResponsiveScaling.d.ts.map +1 -1
- package/lib/systems/ResponsiveScaling.js +0 -12
- package/lib/systems/ResponsiveScaling.js.map +1 -1
- package/lib/systems/TrigramSystem.d.ts +0 -13
- package/lib/systems/TrigramSystem.d.ts.map +1 -1
- package/lib/systems/TrigramSystem.js +0 -13
- package/lib/systems/TrigramSystem.js.map +1 -1
- package/lib/systems/VitalPointSystem.d.ts +0 -10
- package/lib/systems/VitalPointSystem.d.ts.map +1 -1
- package/lib/systems/VitalPointSystem.js +0 -10
- package/lib/systems/VitalPointSystem.js.map +1 -1
- package/lib/systems/animation/builders/KeyframeInterpolation.d.ts +0 -4
- package/lib/systems/animation/builders/KeyframeInterpolation.d.ts.map +1 -1
- package/lib/systems/animation/builders/KeyframeInterpolation.js +0 -1
- package/lib/systems/animation/builders/KeyframeInterpolation.js.map +1 -1
- package/lib/systems/animation/builders/SkeletonRig.d.ts +0 -4
- package/lib/systems/animation/builders/SkeletonRig.d.ts.map +1 -1
- package/lib/systems/animation/builders/SkeletonRig.js +0 -3
- package/lib/systems/animation/builders/SkeletonRig.js.map +1 -1
- package/lib/systems/animation/catalogs/RecoveryAnimations.d.ts +0 -5
- package/lib/systems/animation/catalogs/RecoveryAnimations.d.ts.map +1 -1
- package/lib/systems/animation/catalogs/RecoveryAnimations.js +0 -5
- package/lib/systems/animation/catalogs/RecoveryAnimations.js.map +1 -1
- package/lib/systems/animation/core/AnimationHitTiming.d.ts +0 -6
- package/lib/systems/animation/core/AnimationHitTiming.d.ts.map +1 -1
- package/lib/systems/animation/core/AnimationHitTiming.js +0 -4
- package/lib/systems/animation/core/AnimationHitTiming.js.map +1 -1
- package/lib/systems/animation/core/AnimationTransitions.d.ts +0 -3
- package/lib/systems/animation/core/AnimationTransitions.d.ts.map +1 -1
- package/lib/systems/animation/core/AnimationTransitions.js.map +1 -1
- package/lib/systems/animation/core/LateralityTransform.d.ts +0 -3
- package/lib/systems/animation/core/LateralityTransform.d.ts.map +1 -1
- package/lib/systems/animation/core/LateralityTransform.js +0 -1
- package/lib/systems/animation/core/LateralityTransform.js.map +1 -1
- package/lib/systems/animation/core/RecoveryPhaseEnhancer.d.ts +0 -1
- package/lib/systems/animation/core/RecoveryPhaseEnhancer.d.ts.map +1 -1
- package/lib/systems/animation/core/RecoveryPhaseEnhancer.js.map +1 -1
- package/lib/systems/animation/core/TechniqueAnimationMapper.d.ts +0 -10
- package/lib/systems/animation/core/TechniqueAnimationMapper.d.ts.map +1 -1
- package/lib/systems/animation/core/TechniqueAnimationMapper.js +0 -8
- package/lib/systems/animation/core/TechniqueAnimationMapper.js.map +1 -1
- package/lib/systems/animation/core/TrigramAnimationMapping.d.ts +0 -10
- package/lib/systems/animation/core/TrigramAnimationMapping.d.ts.map +1 -1
- package/lib/systems/animation/core/TrigramStanceTransitions.d.ts +0 -2
- package/lib/systems/animation/core/TrigramStanceTransitions.d.ts.map +1 -1
- package/lib/systems/animation/core/types.d.ts +0 -39
- package/lib/systems/animation/core/types.d.ts.map +1 -1
- package/lib/systems/animation/core/types.js +0 -9
- package/lib/systems/animation/core/types.js.map +1 -1
- package/lib/systems/animation/systems/AdvancedJointMovements.d.ts +0 -27
- package/lib/systems/animation/systems/AdvancedJointMovements.d.ts.map +1 -1
- package/lib/systems/animation/systems/AdvancedJointMovements.js +0 -1
- package/lib/systems/animation/systems/AdvancedJointMovements.js.map +1 -1
- package/lib/systems/animation/systems/BodyFacingSystem.d.ts +0 -19
- package/lib/systems/animation/systems/BodyFacingSystem.d.ts.map +1 -1
- package/lib/systems/animation/systems/BodyFacingSystem.js +0 -14
- package/lib/systems/animation/systems/BodyFacingSystem.js.map +1 -1
- package/lib/systems/animation/systems/FacialExpressions.d.ts +0 -10
- package/lib/systems/animation/systems/FacialExpressions.d.ts.map +1 -1
- package/lib/systems/animation/systems/FacialExpressions.js +0 -2
- package/lib/systems/animation/systems/FacialExpressions.js.map +1 -1
- package/lib/systems/animation/systems/FallAnimations.d.ts +0 -4
- package/lib/systems/animation/systems/FallAnimations.d.ts.map +1 -1
- package/lib/systems/animation/systems/FallAnimations.js +0 -2
- package/lib/systems/animation/systems/FallAnimations.js.map +1 -1
- package/lib/systems/animation/systems/HeadMovements.d.ts +0 -10
- package/lib/systems/animation/systems/HeadMovements.d.ts.map +1 -1
- package/lib/systems/bodypart/BodyPartDamageIntegration.d.ts +0 -7
- package/lib/systems/bodypart/BodyPartDamageIntegration.d.ts.map +1 -1
- package/lib/systems/bodypart/BodyPartDamageIntegration.js +0 -7
- package/lib/systems/bodypart/BodyPartDamageIntegration.js.map +1 -1
- package/lib/systems/bodypart/BodyPartHealthSystem.d.ts +0 -13
- package/lib/systems/bodypart/BodyPartHealthSystem.d.ts.map +1 -1
- package/lib/systems/bodypart/BodyPartHealthSystem.js +0 -13
- package/lib/systems/bodypart/BodyPartHealthSystem.js.map +1 -1
- package/lib/systems/bodypart/BodyPartPositionMapping.d.ts +0 -6
- package/lib/systems/bodypart/BodyPartPositionMapping.d.ts.map +1 -1
- package/lib/systems/bodypart/BodyPartPositionMapping.js +0 -6
- package/lib/systems/bodypart/BodyPartPositionMapping.js.map +1 -1
- package/lib/systems/bodypart/CombatInjuryIntegration.d.ts +0 -10
- package/lib/systems/bodypart/CombatInjuryIntegration.d.ts.map +1 -1
- package/lib/systems/bodypart/CombatInjuryIntegration.js +0 -8
- package/lib/systems/bodypart/CombatInjuryIntegration.js.map +1 -1
- package/lib/systems/bodypart/InjuryIntegration.d.ts +0 -2
- package/lib/systems/bodypart/InjuryIntegration.d.ts.map +1 -1
- package/lib/systems/bodypart/InjuryIntegration.js +0 -2
- package/lib/systems/bodypart/InjuryIntegration.js.map +1 -1
- package/lib/systems/bodypart/InjuryTracker.d.ts +0 -14
- package/lib/systems/bodypart/InjuryTracker.d.ts.map +1 -1
- package/lib/systems/bodypart/InjuryTracker.js +0 -12
- package/lib/systems/bodypart/InjuryTracker.js.map +1 -1
- package/lib/systems/bodypart/MovementPenaltySystem.d.ts +0 -8
- package/lib/systems/bodypart/MovementPenaltySystem.d.ts.map +1 -1
- package/lib/systems/bodypart/MovementPenaltySystem.js +0 -8
- package/lib/systems/bodypart/MovementPenaltySystem.js.map +1 -1
- package/lib/systems/bodypart/PlayerInjuryTrackingManager.d.ts +0 -8
- package/lib/systems/bodypart/PlayerInjuryTrackingManager.d.ts.map +1 -1
- package/lib/systems/bodypart/PlayerInjuryTrackingManager.js +0 -8
- package/lib/systems/bodypart/PlayerInjuryTrackingManager.js.map +1 -1
- package/lib/systems/bodypart/types.d.ts +0 -13
- package/lib/systems/bodypart/types.d.ts.map +1 -1
- package/lib/systems/bodypart/types.js +0 -5
- package/lib/systems/bodypart/types.js.map +1 -1
- package/lib/systems/breathing/BreathingDisruptionSystem.d.ts +0 -3
- package/lib/systems/breathing/BreathingDisruptionSystem.d.ts.map +1 -1
- package/lib/systems/breathing/BreathingDisruptionSystem.js +0 -2
- package/lib/systems/breathing/BreathingDisruptionSystem.js.map +1 -1
- package/lib/systems/combat/BalanceSystem.d.ts +0 -25
- package/lib/systems/combat/BalanceSystem.d.ts.map +1 -1
- package/lib/systems/combat/BalanceSystem.js +0 -25
- package/lib/systems/combat/BalanceSystem.js.map +1 -1
- package/lib/systems/combat/BreakingStatusEffects.d.ts +0 -4
- package/lib/systems/combat/BreakingStatusEffects.d.ts.map +1 -1
- package/lib/systems/combat/BreakingStatusEffects.js +0 -3
- package/lib/systems/combat/BreakingStatusEffects.js.map +1 -1
- package/lib/systems/combat/CombatStateSystem.d.ts +0 -9
- package/lib/systems/combat/CombatStateSystem.d.ts.map +1 -1
- package/lib/systems/combat/CombatStateSystem.js +0 -9
- package/lib/systems/combat/CombatStateSystem.js.map +1 -1
- package/lib/systems/combat/ConsciousnessSystem.d.ts +0 -16
- package/lib/systems/combat/ConsciousnessSystem.d.ts.map +1 -1
- package/lib/systems/combat/ConsciousnessSystem.js +0 -16
- package/lib/systems/combat/ConsciousnessSystem.js.map +1 -1
- package/lib/systems/combat/FallIntegration.d.ts +0 -3
- package/lib/systems/combat/FallIntegration.d.ts.map +1 -1
- package/lib/systems/combat/FallIntegration.js +0 -3
- package/lib/systems/combat/FallIntegration.js.map +1 -1
- package/lib/systems/combat/GrappleSystem.d.ts +0 -2
- package/lib/systems/combat/GrappleSystem.d.ts.map +1 -1
- package/lib/systems/combat/GrappleSystem.js +0 -2
- package/lib/systems/combat/GrappleSystem.js.map +1 -1
- package/lib/systems/combat/LimbExposureSystem.d.ts +0 -7
- package/lib/systems/combat/LimbExposureSystem.d.ts.map +1 -1
- package/lib/systems/combat/LimbExposureSystem.js +0 -7
- package/lib/systems/combat/LimbExposureSystem.js.map +1 -1
- package/lib/systems/combat/PainResponseSystem.d.ts +0 -11
- package/lib/systems/combat/PainResponseSystem.d.ts.map +1 -1
- package/lib/systems/combat/PainResponseSystem.js +0 -11
- package/lib/systems/combat/PainResponseSystem.js.map +1 -1
- package/lib/systems/combat/painConsciousnessUtils.d.ts +0 -7
- package/lib/systems/combat/painConsciousnessUtils.d.ts.map +1 -1
- package/lib/systems/combat/painConsciousnessUtils.js +0 -7
- package/lib/systems/combat/painConsciousnessUtils.js.map +1 -1
- package/lib/systems/effects.d.ts +11 -0
- package/lib/systems/effects.d.ts.map +1 -1
- package/lib/systems/effects.js +10 -0
- package/lib/systems/effects.js.map +1 -1
- package/lib/systems/game.d.ts +16 -0
- package/lib/systems/game.d.ts.map +1 -1
- package/lib/systems/game.js +1 -0
- package/lib/systems/game.js.map +1 -1
- package/lib/systems/index.d.ts +5 -1
- package/lib/systems/index.d.ts.map +1 -1
- package/lib/systems/index.js.map +1 -1
- package/lib/systems/movement/InjuryMovementModifier.d.ts +0 -10
- package/lib/systems/movement/InjuryMovementModifier.d.ts.map +1 -1
- package/lib/systems/movement/InjuryMovementModifier.js +0 -7
- package/lib/systems/movement/InjuryMovementModifier.js.map +1 -1
- package/lib/systems/movement/integration.d.ts +0 -3
- package/lib/systems/movement/integration.d.ts.map +1 -1
- package/lib/systems/movement/integration.js +0 -3
- package/lib/systems/movement/integration.js.map +1 -1
- package/lib/systems/physics/AttackMovementPhysics.d.ts +0 -9
- package/lib/systems/physics/AttackMovementPhysics.d.ts.map +1 -1
- package/lib/systems/physics/AttackMovementPhysics.js +0 -7
- package/lib/systems/physics/AttackMovementPhysics.js.map +1 -1
- package/lib/systems/physics/CollisionDetection.d.ts +0 -6
- package/lib/systems/physics/CollisionDetection.d.ts.map +1 -1
- package/lib/systems/physics/CollisionDetection.js +0 -6
- package/lib/systems/physics/CollisionDetection.js.map +1 -1
- package/lib/systems/physics/CoordinateMapper.d.ts +0 -1
- package/lib/systems/physics/CoordinateMapper.d.ts.map +1 -1
- package/lib/systems/physics/CoordinateMapper.js +0 -1
- package/lib/systems/physics/CoordinateMapper.js.map +1 -1
- package/lib/systems/physics/KnockbackPhysics.d.ts +0 -11
- package/lib/systems/physics/KnockbackPhysics.d.ts.map +1 -1
- package/lib/systems/physics/KnockbackPhysics.js +0 -8
- package/lib/systems/physics/KnockbackPhysics.js.map +1 -1
- package/lib/systems/physics/MovementPhysics.d.ts +0 -10
- package/lib/systems/physics/MovementPhysics.d.ts.map +1 -1
- package/lib/systems/physics/MovementPhysics.js +0 -8
- package/lib/systems/physics/MovementPhysics.js.map +1 -1
- package/lib/systems/physics/PhysicalReachCalculator.d.ts +0 -6
- package/lib/systems/physics/PhysicalReachCalculator.d.ts.map +1 -1
- package/lib/systems/physics/PhysicalReachCalculator.js +0 -5
- package/lib/systems/physics/PhysicalReachCalculator.js.map +1 -1
- package/lib/systems/physics/SpeedModifierSystem.d.ts +0 -5
- package/lib/systems/physics/SpeedModifierSystem.d.ts.map +1 -1
- package/lib/systems/physics/SpeedModifierSystem.js +0 -4
- package/lib/systems/physics/SpeedModifierSystem.js.map +1 -1
- package/lib/systems/player.d.ts +0 -5
- package/lib/systems/player.d.ts.map +1 -1
- package/lib/systems/trigram/TrigramCalculator.d.ts +0 -1
- package/lib/systems/trigram/TrigramCalculator.d.ts.map +1 -1
- package/lib/systems/trigram/TrigramCalculator.js +0 -1
- package/lib/systems/trigram/TrigramCalculator.js.map +1 -1
- package/lib/systems/trigram/types.d.ts +0 -4
- package/lib/systems/trigram/types.d.ts.map +1 -1
- package/lib/systems/trigram/types.js +0 -2
- package/lib/systems/trigram/types.js.map +1 -1
- package/lib/systems/types.d.ts +7 -2
- package/lib/systems/types.d.ts.map +1 -1
- package/lib/systems/types.js.map +1 -1
- package/lib/systems/vitalpoint/DamageCalculator.d.ts +0 -3
- package/lib/systems/vitalpoint/DamageCalculator.d.ts.map +1 -1
- package/lib/systems/vitalpoint/DamageCalculator.js +0 -3
- package/lib/systems/vitalpoint/DamageCalculator.js.map +1 -1
- package/lib/systems/vitalpoint/KoreanVitalPoints.d.ts +0 -8
- package/lib/systems/vitalpoint/KoreanVitalPoints.d.ts.map +1 -1
- package/lib/systems/vitalpoint/KoreanVitalPoints.js +0 -8
- package/lib/systems/vitalpoint/KoreanVitalPoints.js.map +1 -1
- package/lib/systems/vitalpoint/VitalPointsData.d.ts +0 -3
- package/lib/systems/vitalpoint/VitalPointsData.d.ts.map +1 -1
- package/lib/systems/vitalpoint/VitalPointsData.js +0 -1
- package/lib/systems/vitalpoint/VitalPointsData.js.map +1 -1
- package/lib/types/PhysicsTypes.d.ts +21 -78
- package/lib/types/PhysicsTypes.d.ts.map +1 -1
- package/lib/types/PhysicsTypes.js +17 -63
- package/lib/types/PhysicsTypes.js.map +1 -1
- package/lib/types/clothing.d.ts +0 -9
- package/lib/types/clothing.d.ts.map +1 -1
- package/lib/types/constants/animations.d.ts +35 -1
- package/lib/types/constants/animations.d.ts.map +1 -1
- package/lib/types/constants/animations.js +12 -1
- package/lib/types/constants/animations.js.map +1 -1
- package/lib/types/constants/colors.d.ts +28 -2
- package/lib/types/constants/colors.d.ts.map +1 -1
- package/lib/types/constants/colors.js +30 -4
- package/lib/types/constants/colors.js.map +1 -1
- package/lib/types/constants/index.d.ts +5 -1
- package/lib/types/constants/index.d.ts.map +1 -1
- package/lib/types/constants/index.js.map +1 -1
- package/lib/types/constants/performance.d.ts +0 -2
- package/lib/types/constants/performance.d.ts.map +1 -1
- package/lib/types/constants/performance.js +0 -2
- package/lib/types/constants/performance.js.map +1 -1
- package/lib/types/constants/typography.d.ts +40 -2
- package/lib/types/constants/typography.d.ts.map +1 -1
- package/lib/types/constants/typography.js +40 -2
- package/lib/types/constants/typography.js.map +1 -1
- package/lib/types/constants/ui.d.ts +89 -1
- package/lib/types/constants/ui.d.ts.map +1 -1
- package/lib/types/constants/ui.js +33 -1
- package/lib/types/constants/ui.js.map +1 -1
- package/lib/types/facial.d.ts +0 -15
- package/lib/types/facial.d.ts.map +1 -1
- package/lib/types/facial.js +0 -8
- package/lib/types/facial.js.map +1 -1
- package/lib/types/hand-animation.d.ts +34 -147
- package/lib/types/hand-animation.d.ts.map +1 -1
- package/lib/types/hand-animation.js +0 -2
- package/lib/types/hand-animation.js.map +1 -1
- package/lib/types/injury.d.ts +0 -2
- package/lib/types/injury.d.ts.map +1 -1
- package/lib/types/injury.js +0 -1
- package/lib/types/injury.js.map +1 -1
- package/lib/types/physics.d.ts +0 -21
- package/lib/types/physics.d.ts.map +1 -1
- package/lib/types/physics.js +0 -6
- package/lib/types/physics.js.map +1 -1
- package/lib/types/physicsConstants.d.ts +0 -12
- package/lib/types/physicsConstants.d.ts.map +1 -1
- package/lib/types/physicsConstants.js +0 -12
- package/lib/types/physicsConstants.js.map +1 -1
- package/lib/types/player-visual.d.ts +45 -189
- package/lib/types/player-visual.d.ts.map +1 -1
- package/lib/types/technique.d.ts +1 -5
- package/lib/types/technique.d.ts.map +1 -1
- package/lib/types/techniqueId.d.ts +0 -1
- package/lib/types/techniqueId.d.ts.map +1 -1
- package/lib/types/techniqueId.js +0 -1
- package/lib/types/techniqueId.js.map +1 -1
- package/lib/utils/arenaWorldDimensions.d.ts +0 -11
- package/lib/utils/arenaWorldDimensions.d.ts.map +1 -1
- package/lib/utils/arenaWorldDimensions.js +0 -6
- package/lib/utils/arenaWorldDimensions.js.map +1 -1
- package/lib/utils/controlMapping.d.ts +3 -4
- package/lib/utils/controlMapping.d.ts.map +1 -1
- package/lib/utils/controlMapping.js +1 -2
- package/lib/utils/controlMapping.js.map +1 -1
- package/lib/utils/deviceDetection.d.ts +0 -5
- package/lib/utils/deviceDetection.d.ts.map +1 -1
- package/lib/utils/deviceDetection.js +0 -5
- package/lib/utils/deviceDetection.js.map +1 -1
- package/lib/utils/hapticFeedback.d.ts +23 -95
- package/lib/utils/hapticFeedback.d.ts.map +1 -1
- package/lib/utils/hapticFeedback.js +9 -39
- package/lib/utils/hapticFeedback.js.map +1 -1
- package/lib/utils/haptics.d.ts +0 -3
- package/lib/utils/haptics.d.ts.map +1 -1
- package/lib/utils/haptics.js +0 -1
- package/lib/utils/haptics.js.map +1 -1
- package/lib/utils/math.d.ts +0 -3
- package/lib/utils/math.d.ts.map +1 -1
- package/lib/utils/math.js +0 -2
- package/lib/utils/math.js.map +1 -1
- package/lib/utils/mobileLayoutHelpers.d.ts +0 -3
- package/lib/utils/mobileLayoutHelpers.d.ts.map +1 -1
- package/lib/utils/mobileLayoutHelpers.js +0 -1
- package/lib/utils/mobileLayoutHelpers.js.map +1 -1
- package/lib/utils/mobileUIUtils.d.ts +5 -100
- package/lib/utils/mobileUIUtils.d.ts.map +1 -1
- package/lib/utils/mobileUIUtils.js +0 -9
- package/lib/utils/mobileUIUtils.js.map +1 -1
- package/lib/utils/physicalAttributeValidation.d.ts.map +1 -1
- package/lib/utils/player3DHelpers.d.ts.map +1 -1
- package/lib/utils/player3DHelpers.js.map +1 -1
- package/lib/utils/responsiveLayoutHelpers.d.ts +0 -65
- package/lib/utils/responsiveLayoutHelpers.d.ts.map +1 -1
- package/lib/utils/responsiveLayoutHelpers.js +0 -65
- package/lib/utils/responsiveLayoutHelpers.js.map +1 -1
- package/lib/utils/responsiveOrientationConstants.d.ts +0 -7
- package/lib/utils/responsiveOrientationConstants.d.ts.map +1 -1
- package/lib/utils/responsiveOrientationConstants.js +0 -7
- package/lib/utils/responsiveOrientationConstants.js.map +1 -1
- package/lib/utils/safeAreaUtils.d.ts +0 -6
- package/lib/utils/safeAreaUtils.d.ts.map +1 -1
- package/lib/utils/safeAreaUtils.js +0 -2
- package/lib/utils/safeAreaUtils.js.map +1 -1
- package/lib/utils/sharedPhysicsConfig.d.ts +0 -4
- package/lib/utils/sharedPhysicsConfig.d.ts.map +1 -1
- package/lib/utils/sharedPhysicsConfig.js +0 -2
- package/lib/utils/sharedPhysicsConfig.js.map +1 -1
- package/lib/utils/skeletonScaling.d.ts +0 -9
- package/lib/utils/skeletonScaling.d.ts.map +1 -1
- package/lib/utils/skeletonScaling.js +0 -1
- package/lib/utils/skeletonScaling.js.map +1 -1
- package/package.json +7 -7
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*
|
|
5
5
|
* @module utils/controlMapping
|
|
6
6
|
* @category Input System
|
|
7
|
-
* @korean
|
|
7
|
+
* @korean 콘트롤 매핑 시스템
|
|
8
8
|
*/
|
|
9
9
|
import { TrigramStance } from "../types/common";
|
|
10
10
|
/**
|
|
@@ -12,7 +12,7 @@ import { TrigramStance } from "../types/common";
|
|
|
12
12
|
* Maps game actions to keyboard keys
|
|
13
13
|
*
|
|
14
14
|
* @category Input System
|
|
15
|
-
* @korean
|
|
15
|
+
* @korean 콘트롤 바인딩
|
|
16
16
|
*/
|
|
17
17
|
export interface ControlBinding {
|
|
18
18
|
/** Stance selection keys (1-8 by default) */
|
|
@@ -55,8 +55,7 @@ export interface ControlBinding {
|
|
|
55
55
|
* });
|
|
56
56
|
* ```
|
|
57
57
|
*
|
|
58
|
-
* @
|
|
59
|
-
* @korean 컨트롤매퍼
|
|
58
|
+
* @korean 콘트롤매퍼
|
|
60
59
|
*/
|
|
61
60
|
export declare class ControlMapper {
|
|
62
61
|
private bindings;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"controlMapping.d.ts","sourceRoot":"","sources":["../../src/utils/controlMapping.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAGhD;;;;;;GAMG;AACH,MAAM,WAAW,cAAc;IAC7B,6CAA6C;IAC7C,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,gEAAgE;IAChE,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,wBAAwB;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,6BAA6B;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,oBAAoB;IACpB,QAAQ,CAAC,QAAQ,EAAE;QACjB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;KACxB,CAAC;IACF,sCAAsC;IACtC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,+CAA+C;IAC/C,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,sBAAsB;IACtB,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;CACnC;AAkCD
|
|
1
|
+
{"version":3,"file":"controlMapping.d.ts","sourceRoot":"","sources":["../../src/utils/controlMapping.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAGhD;;;;;;GAMG;AACH,MAAM,WAAW,cAAc;IAC7B,6CAA6C;IAC7C,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,gEAAgE;IAChE,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,wBAAwB;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,6BAA6B;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,oBAAoB;IACpB,QAAQ,CAAC,QAAQ,EAAE;QACjB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;KACxB,CAAC;IACF,sCAAsC;IACtC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,+CAA+C;IAC/C,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,sBAAsB;IACtB,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;CACnC;AAkCD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAiB;IAEjC;;;OAGG;;IAKH;;;;;;OAMG;IACH,YAAY,IAAI,cAAc;IAgB9B;;;;;OAKG;IACH,YAAY,CAAC,QAAQ,EAAE,cAAc,GAAG,IAAI;IAc5C;;;;;OAKG;IACH,kBAAkB,IAAI,cAAc;IAIpC;;;;;OAKG;IACH,WAAW,IAAI,cAAc;IAI7B;;;;OAIG;IACH,eAAe,IAAI,IAAI;IAIvB;;;;;;;OAOG;IACH,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAQ3C;;;;;;OAMG;IACH,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAOnD;;;;;;OAMG;IACH,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI;IAMzD;;;;;;OAMG;IACH,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAM9C;;;;;;OAMG;IACH,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAOhD;;;;;;OAMG;IACH,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAwC3C;;;;;;;OAOG;IACH,OAAO,CAAC,gBAAgB;IA2CxB;;;;;;;OAOG;IACH,YAAY,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM,EAAE;CA8BjD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"controlMapping.js","names":[],"sources":["../../src/utils/controlMapping.ts"],"sourcesContent":["/**\n * Control Mapping System for Black Trigram\n * Manages keyboard control bindings with localStorage persistence\n * \n * @module utils/controlMapping\n * @category Input System\n * @korean 컨트롤 매핑 시스템\n */\n\nimport { TrigramStance } from \"../types/common\";\nimport { TRIGRAM_STANCES_ORDER } from \"../systems/trigram/types\";\n\n/**\n * Control binding configuration\n * Maps game actions to keyboard keys\n * \n * @category Input System\n * @korean 컨트롤 바인딩\n */\nexport interface ControlBinding {\n /** Stance selection keys (1-8 by default) */\n readonly stances: readonly string[];\n /** Technique execution keys (Q-E-R-T-Y-F-G-Z-X-C by default) */\n readonly techniques: readonly string[];\n /** Attack action key */\n readonly attack: string;\n /** Block/Guard action key */\n readonly block: string;\n /** Movement keys */\n readonly movement: {\n readonly up: string;\n readonly down: string;\n readonly left: string;\n readonly right: string;\n };\n /** Vital points overlay toggle key */\n readonly vitalPointsOverlay: string;\n /** Stance side switch key (swap front foot) */\n readonly stanceSideSwitch?: string;\n /** Pause/Menu keys */\n readonly pause: readonly string[];\n}\n\n/**\n * Storage key for localStorage persistence\n */\nconst STORAGE_KEY = \"blacktrigram_controls\";\n\n/**\n * Default control bindings following game design specifications\n * NEW: Conflict-free control scheme with Q-E-R-T-Y-F-G-Z-X-C for techniques\n * \n * Uses keys around WASD that are easy to reach with left hand\n * No conflicts with movement, browser shortcuts, or function keys\n * \n * All keys stored in lowercase for consistent comparison\n * \n * @see CONTROLS.md for complete documentation\n */\nconst DEFAULT_BINDINGS: ControlBinding = {\n stances: [\"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\"],\n techniques: [\"q\", \"e\", \"r\", \"t\", \"y\", \"f\", \"g\", \"z\", \"x\", \"c\"],\n attack: \" \", // Spacebar\n block: \"b\",\n movement: {\n up: \"w\",\n down: \"s\",\n left: \"a\",\n right: \"d\",\n },\n vitalPointsOverlay: \"v\",\n stanceSideSwitch: \"h\", // H key for switching front foot\n pause: [\"escape\", \"m\"],\n};\n\n/**\n * Control Mapper class for managing keyboard bindings\n * Handles loading, saving, and querying control mappings\n * \n * @example\n * ```typescript\n * const mapper = new ControlMapper();\n * \n * // Get stance for key press\n * const stance = mapper.getStanceForKey(\"3\"); // Returns 2 (0-indexed)\n * \n * // Update bindings\n * mapper.saveBindings({\n * ...mapper.getBindings(),\n * stances: ['q', 'w', 'e', 'r', 'a', 's', 'd', 'f']\n * });\n * ```\n * \n * @public\n * @korean 컨트롤매퍼\n */\nexport class ControlMapper {\n private bindings: ControlBinding;\n\n /**\n * Creates a new ControlMapper instance\n * Automatically loads bindings from localStorage\n */\n constructor() {\n this.bindings = this.loadBindings();\n }\n\n /**\n * Load bindings from localStorage\n * Returns default bindings if none exist\n * \n * @returns Control bindings from storage or defaults\n * @korean 바인딩 로드\n */\n loadBindings(): ControlBinding {\n try {\n const saved = localStorage.getItem(STORAGE_KEY);\n if (saved) {\n const parsed = JSON.parse(saved) as ControlBinding;\n // Validate loaded bindings\n if (this.validateBindings(parsed)) {\n return parsed;\n }\n }\n } catch (error) {\n console.warn(\"Failed to load control bindings:\", error);\n }\n return this.getDefaultBindings();\n }\n\n /**\n * Save bindings to localStorage\n * \n * @param bindings - Control bindings to save\n * @korean 바인딩 저장\n */\n saveBindings(bindings: ControlBinding): void {\n if (!this.validateBindings(bindings)) {\n console.error(\"Invalid control bindings, not saving\");\n return;\n }\n\n try {\n localStorage.setItem(STORAGE_KEY, JSON.stringify(bindings));\n this.bindings = bindings;\n } catch (error) {\n console.error(\"Failed to save control bindings:\", error);\n }\n }\n\n /**\n * Get default control bindings\n * \n * @returns Default control configuration\n * @korean 기본 바인딩\n */\n getDefaultBindings(): ControlBinding {\n return { ...DEFAULT_BINDINGS };\n }\n\n /**\n * Get current control bindings\n * \n * @returns Current control configuration\n * @korean 현재 바인딩\n */\n getBindings(): ControlBinding {\n return { ...this.bindings };\n }\n\n /**\n * Reset bindings to default\n * \n * @korean 기본값으로 리셋\n */\n resetToDefaults(): void {\n this.saveBindings(this.getDefaultBindings());\n }\n\n /**\n * Get stance index for a given key\n * Returns null if key is not bound to a stance\n * \n * @param key - Keyboard key to check\n * @returns Stance index (0-7) or null\n * @korean 키에 대한 자세 조회\n */\n getStanceForKey(key: string): number | null {\n const normalizedKey = key.toLowerCase();\n const index = this.bindings.stances.findIndex(\n (k) => k.toLowerCase() === normalizedKey\n );\n return index >= 0 ? index : null;\n }\n\n /**\n * Get key for a given stance index\n * \n * @param stanceIndex - Stance index (0-7)\n * @returns Key bound to that stance\n * @korean 자세에 대한 키 조회\n */\n getKeyForStance(stanceIndex: number): string | null {\n if (stanceIndex < 0 || stanceIndex >= this.bindings.stances.length) {\n return null;\n }\n return this.bindings.stances[stanceIndex];\n }\n\n /**\n * Get TrigramStance enum for a given key\n * \n * @param key - Keyboard key to check\n * @returns TrigramStance or null\n * @korean 키에 대한 팔괘 자세\n */\n getTrigramStanceForKey(key: string): TrigramStance | null {\n const index = this.getStanceForKey(key);\n if (index === null) return null;\n return TRIGRAM_STANCES_ORDER[index] ?? null;\n }\n\n /**\n * Get technique index for a key\n * \n * @param key - Keyboard key\n * @returns Technique index (0-9) or null\n * @korean 기술 키 확인\n */\n getTechniqueForKey(key: string): number | null {\n const normalizedKey = key.toLowerCase();\n const index = this.bindings.techniques.indexOf(normalizedKey);\n return index >= 0 ? index : null;\n }\n\n /**\n * Get key for technique index\n * \n * @param index - Technique index (0-9)\n * @returns Key or null\n * @korean 기술 인덱스로 키 조회\n */\n getKeyForTechnique(index: number): string | null {\n if (index < 0 || index >= this.bindings.techniques.length) {\n return null;\n }\n return this.bindings.techniques[index];\n }\n\n /**\n * Check if a key is bound to an action\n * \n * @param key - Keyboard key to check\n * @returns Action name or null\n * @korean 키 바인딩 확인\n */\n getActionForKey(key: string): string | null {\n const normalizedKey = key.toLowerCase();\n\n // Check stance keys\n if (this.getStanceForKey(key) !== null) {\n return \"stance\";\n }\n\n // Check other actions\n if (normalizedKey === this.bindings.attack.toLowerCase()) return \"attack\";\n if (normalizedKey === this.bindings.block.toLowerCase()) return \"block\";\n\n // Check movement\n const movement = this.bindings.movement;\n if (normalizedKey === movement.up.toLowerCase()) return \"move_up\";\n if (normalizedKey === movement.down.toLowerCase()) return \"move_down\";\n if (normalizedKey === movement.left.toLowerCase()) return \"move_left\";\n if (normalizedKey === movement.right.toLowerCase()) return \"move_right\";\n\n // Check vital points overlay\n if (normalizedKey === this.bindings.vitalPointsOverlay.toLowerCase())\n return \"vital_points_overlay\";\n\n // Check stance side switch\n if (\n normalizedKey === this.bindings.stanceSideSwitch?.toLowerCase()\n ) {\n return \"stance_side_switch\";\n }\n\n // Check pause keys\n if (\n this.bindings.pause.some((k) => k.toLowerCase() === normalizedKey)\n ) {\n return \"pause\";\n }\n\n return null;\n }\n\n /**\n * Validate control bindings\n * Ensures no duplicate keys and all required keys are present\n * \n * @param bindings - Bindings to validate\n * @returns True if valid\n * @korean 바인딩 검증\n */\n private validateBindings(bindings: ControlBinding): boolean {\n // Check that stances array has exactly 8 entries\n if (\n !bindings.stances ||\n !Array.isArray(bindings.stances) ||\n bindings.stances.length !== 8\n ) {\n return false;\n }\n\n // Check that techniques array has up to 10 entries\n if (\n !bindings.techniques ||\n !Array.isArray(bindings.techniques) ||\n bindings.techniques.length === 0 ||\n bindings.techniques.length > 10\n ) {\n return false;\n }\n\n // Check for duplicate keys\n const allKeys = [\n ...bindings.stances,\n ...bindings.techniques,\n bindings.attack,\n bindings.block,\n bindings.movement.up,\n bindings.movement.down,\n bindings.movement.left,\n bindings.movement.right,\n bindings.vitalPointsOverlay,\n ...bindings.pause,\n ];\n\n const uniqueKeys = new Set(allKeys.map((k) => k.toLowerCase()));\n if (uniqueKeys.size !== allKeys.length) {\n // Duplicate keys found\n return false;\n }\n\n return true;\n }\n\n /**\n * Check if bindings have conflicts\n * Returns array of conflicting keys\n * \n * @param bindings - Bindings to check\n * @returns Array of duplicate keys\n * @korean 바인딩 충돌 확인\n */\n getConflicts(bindings: ControlBinding): string[] {\n const keyCount = new Map<string, number>();\n const conflicts: string[] = [];\n\n const allKeys = [\n ...bindings.stances,\n ...bindings.techniques,\n bindings.attack,\n bindings.block,\n bindings.movement.up,\n bindings.movement.down,\n bindings.movement.left,\n bindings.movement.right,\n bindings.vitalPointsOverlay,\n ...bindings.pause,\n ];\n\n allKeys.forEach((key) => {\n const normalized = key.toLowerCase();\n keyCount.set(normalized, (keyCount.get(normalized) ?? 0) + 1);\n });\n\n keyCount.forEach((count, key) => {\n if (count > 1) {\n conflicts.push(key);\n }\n });\n\n return conflicts;\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"controlMapping.js","names":[],"sources":["../../src/utils/controlMapping.ts"],"sourcesContent":["/**\n * Control Mapping System for Black Trigram\n * Manages keyboard control bindings with localStorage persistence\n * \n * @module utils/controlMapping\n * @category Input System\n * @korean 콘트롤 매핑 시스템\n */\n\nimport { TrigramStance } from \"../types/common\";\nimport { TRIGRAM_STANCES_ORDER } from \"../systems/trigram/types\";\n\n/**\n * Control binding configuration\n * Maps game actions to keyboard keys\n * \n * @category Input System\n * @korean 콘트롤 바인딩\n */\nexport interface ControlBinding {\n /** Stance selection keys (1-8 by default) */\n readonly stances: readonly string[];\n /** Technique execution keys (Q-E-R-T-Y-F-G-Z-X-C by default) */\n readonly techniques: readonly string[];\n /** Attack action key */\n readonly attack: string;\n /** Block/Guard action key */\n readonly block: string;\n /** Movement keys */\n readonly movement: {\n readonly up: string;\n readonly down: string;\n readonly left: string;\n readonly right: string;\n };\n /** Vital points overlay toggle key */\n readonly vitalPointsOverlay: string;\n /** Stance side switch key (swap front foot) */\n readonly stanceSideSwitch?: string;\n /** Pause/Menu keys */\n readonly pause: readonly string[];\n}\n\n/**\n * Storage key for localStorage persistence\n */\nconst STORAGE_KEY = \"blacktrigram_controls\";\n\n/**\n * Default control bindings following game design specifications\n * NEW: Conflict-free control scheme with Q-E-R-T-Y-F-G-Z-X-C for techniques\n * \n * Uses keys around WASD that are easy to reach with left hand\n * No conflicts with movement, browser shortcuts, or function keys\n * \n * All keys stored in lowercase for consistent comparison\n * \n * @see CONTROLS.md for complete documentation\n */\nconst DEFAULT_BINDINGS: ControlBinding = {\n stances: [\"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\"],\n techniques: [\"q\", \"e\", \"r\", \"t\", \"y\", \"f\", \"g\", \"z\", \"x\", \"c\"],\n attack: \" \", // Spacebar\n block: \"b\",\n movement: {\n up: \"w\",\n down: \"s\",\n left: \"a\",\n right: \"d\",\n },\n vitalPointsOverlay: \"v\",\n stanceSideSwitch: \"h\", // H key for switching front foot\n pause: [\"escape\", \"m\"],\n};\n\n/**\n * Control Mapper class for managing keyboard bindings\n * Handles loading, saving, and querying control mappings\n * \n * @example\n * ```typescript\n * const mapper = new ControlMapper();\n * \n * // Get stance for key press\n * const stance = mapper.getStanceForKey(\"3\"); // Returns 2 (0-indexed)\n * \n * // Update bindings\n * mapper.saveBindings({\n * ...mapper.getBindings(),\n * stances: ['q', 'w', 'e', 'r', 'a', 's', 'd', 'f']\n * });\n * ```\n * \n * @korean 콘트롤매퍼\n */\nexport class ControlMapper {\n private bindings: ControlBinding;\n\n /**\n * Creates a new ControlMapper instance\n * Automatically loads bindings from localStorage\n */\n constructor() {\n this.bindings = this.loadBindings();\n }\n\n /**\n * Load bindings from localStorage\n * Returns default bindings if none exist\n * \n * @returns Control bindings from storage or defaults\n * @korean 바인딩 로드\n */\n loadBindings(): ControlBinding {\n try {\n const saved = localStorage.getItem(STORAGE_KEY);\n if (saved) {\n const parsed = JSON.parse(saved) as ControlBinding;\n // Validate loaded bindings\n if (this.validateBindings(parsed)) {\n return parsed;\n }\n }\n } catch (error) {\n console.warn(\"Failed to load control bindings:\", error);\n }\n return this.getDefaultBindings();\n }\n\n /**\n * Save bindings to localStorage\n * \n * @param bindings - Control bindings to save\n * @korean 바인딩 저장\n */\n saveBindings(bindings: ControlBinding): void {\n if (!this.validateBindings(bindings)) {\n console.error(\"Invalid control bindings, not saving\");\n return;\n }\n\n try {\n localStorage.setItem(STORAGE_KEY, JSON.stringify(bindings));\n this.bindings = bindings;\n } catch (error) {\n console.error(\"Failed to save control bindings:\", error);\n }\n }\n\n /**\n * Get default control bindings\n * \n * @returns Default control configuration\n * @korean 기본 바인딩\n */\n getDefaultBindings(): ControlBinding {\n return { ...DEFAULT_BINDINGS };\n }\n\n /**\n * Get current control bindings\n * \n * @returns Current control configuration\n * @korean 현재 바인딩\n */\n getBindings(): ControlBinding {\n return { ...this.bindings };\n }\n\n /**\n * Reset bindings to default\n * \n * @korean 기본값으로 리셋\n */\n resetToDefaults(): void {\n this.saveBindings(this.getDefaultBindings());\n }\n\n /**\n * Get stance index for a given key\n * Returns null if key is not bound to a stance\n * \n * @param key - Keyboard key to check\n * @returns Stance index (0-7) or null\n * @korean 키에 대한 자세 조회\n */\n getStanceForKey(key: string): number | null {\n const normalizedKey = key.toLowerCase();\n const index = this.bindings.stances.findIndex(\n (k) => k.toLowerCase() === normalizedKey\n );\n return index >= 0 ? index : null;\n }\n\n /**\n * Get key for a given stance index\n * \n * @param stanceIndex - Stance index (0-7)\n * @returns Key bound to that stance\n * @korean 자세에 대한 키 조회\n */\n getKeyForStance(stanceIndex: number): string | null {\n if (stanceIndex < 0 || stanceIndex >= this.bindings.stances.length) {\n return null;\n }\n return this.bindings.stances[stanceIndex];\n }\n\n /**\n * Get TrigramStance enum for a given key\n * \n * @param key - Keyboard key to check\n * @returns TrigramStance or null\n * @korean 키에 대한 팔괘 자세\n */\n getTrigramStanceForKey(key: string): TrigramStance | null {\n const index = this.getStanceForKey(key);\n if (index === null) return null;\n return TRIGRAM_STANCES_ORDER[index] ?? null;\n }\n\n /**\n * Get technique index for a key\n * \n * @param key - Keyboard key\n * @returns Technique index (0-9) or null\n * @korean 기술 키 확인\n */\n getTechniqueForKey(key: string): number | null {\n const normalizedKey = key.toLowerCase();\n const index = this.bindings.techniques.indexOf(normalizedKey);\n return index >= 0 ? index : null;\n }\n\n /**\n * Get key for technique index\n * \n * @param index - Technique index (0-9)\n * @returns Key or null\n * @korean 기술 인덱스로 키 조회\n */\n getKeyForTechnique(index: number): string | null {\n if (index < 0 || index >= this.bindings.techniques.length) {\n return null;\n }\n return this.bindings.techniques[index];\n }\n\n /**\n * Check if a key is bound to an action\n * \n * @param key - Keyboard key to check\n * @returns Action name or null\n * @korean 키 바인딩 확인\n */\n getActionForKey(key: string): string | null {\n const normalizedKey = key.toLowerCase();\n\n // Check stance keys\n if (this.getStanceForKey(key) !== null) {\n return \"stance\";\n }\n\n // Check other actions\n if (normalizedKey === this.bindings.attack.toLowerCase()) return \"attack\";\n if (normalizedKey === this.bindings.block.toLowerCase()) return \"block\";\n\n // Check movement\n const movement = this.bindings.movement;\n if (normalizedKey === movement.up.toLowerCase()) return \"move_up\";\n if (normalizedKey === movement.down.toLowerCase()) return \"move_down\";\n if (normalizedKey === movement.left.toLowerCase()) return \"move_left\";\n if (normalizedKey === movement.right.toLowerCase()) return \"move_right\";\n\n // Check vital points overlay\n if (normalizedKey === this.bindings.vitalPointsOverlay.toLowerCase())\n return \"vital_points_overlay\";\n\n // Check stance side switch\n if (\n normalizedKey === this.bindings.stanceSideSwitch?.toLowerCase()\n ) {\n return \"stance_side_switch\";\n }\n\n // Check pause keys\n if (\n this.bindings.pause.some((k) => k.toLowerCase() === normalizedKey)\n ) {\n return \"pause\";\n }\n\n return null;\n }\n\n /**\n * Validate control bindings\n * Ensures no duplicate keys and all required keys are present\n * \n * @param bindings - Bindings to validate\n * @returns True if valid\n * @korean 바인딩 검증\n */\n private validateBindings(bindings: ControlBinding): boolean {\n // Check that stances array has exactly 8 entries\n if (\n !bindings.stances ||\n !Array.isArray(bindings.stances) ||\n bindings.stances.length !== 8\n ) {\n return false;\n }\n\n // Check that techniques array has up to 10 entries\n if (\n !bindings.techniques ||\n !Array.isArray(bindings.techniques) ||\n bindings.techniques.length === 0 ||\n bindings.techniques.length > 10\n ) {\n return false;\n }\n\n // Check for duplicate keys\n const allKeys = [\n ...bindings.stances,\n ...bindings.techniques,\n bindings.attack,\n bindings.block,\n bindings.movement.up,\n bindings.movement.down,\n bindings.movement.left,\n bindings.movement.right,\n bindings.vitalPointsOverlay,\n ...bindings.pause,\n ];\n\n const uniqueKeys = new Set(allKeys.map((k) => k.toLowerCase()));\n if (uniqueKeys.size !== allKeys.length) {\n // Duplicate keys found\n return false;\n }\n\n return true;\n }\n\n /**\n * Check if bindings have conflicts\n * Returns array of conflicting keys\n * \n * @param bindings - Bindings to check\n * @returns Array of duplicate keys\n * @korean 바인딩 충돌 확인\n */\n getConflicts(bindings: ControlBinding): string[] {\n const keyCount = new Map<string, number>();\n const conflicts: string[] = [];\n\n const allKeys = [\n ...bindings.stances,\n ...bindings.techniques,\n bindings.attack,\n bindings.block,\n bindings.movement.up,\n bindings.movement.down,\n bindings.movement.left,\n bindings.movement.right,\n bindings.vitalPointsOverlay,\n ...bindings.pause,\n ];\n\n allKeys.forEach((key) => {\n const normalized = key.toLowerCase();\n keyCount.set(normalized, (keyCount.get(normalized) ?? 0) + 1);\n });\n\n keyCount.forEach((count, key) => {\n if (count > 1) {\n conflicts.push(key);\n }\n });\n\n return conflicts;\n }\n}\n"],"mappings":"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"}
|
|
@@ -60,7 +60,6 @@ export declare const TABLET_BREAKPOINT = 1024;
|
|
|
60
60
|
* Useful when window is resized or device emulation changes
|
|
61
61
|
* Also clears CSS environment variable cache
|
|
62
62
|
*
|
|
63
|
-
* @public
|
|
64
63
|
*/
|
|
65
64
|
export declare function clearPlatformCache(): void;
|
|
66
65
|
/**
|
|
@@ -96,7 +95,6 @@ export declare function clearPlatformCache(): void;
|
|
|
96
95
|
* }
|
|
97
96
|
* ```
|
|
98
97
|
*
|
|
99
|
-
* @public
|
|
100
98
|
* @korean 플랫폼감지
|
|
101
99
|
*/
|
|
102
100
|
export declare function detectPlatform(): PlatformInfo;
|
|
@@ -106,7 +104,6 @@ export declare function detectPlatform(): PlatformInfo;
|
|
|
106
104
|
*
|
|
107
105
|
* @returns True if device is mobile or tablet
|
|
108
106
|
*
|
|
109
|
-
* @public
|
|
110
107
|
* @korean 모바일확인
|
|
111
108
|
*/
|
|
112
109
|
export declare function isMobileDevice(): boolean;
|
|
@@ -134,7 +131,6 @@ export declare function isMobileDevice(): boolean;
|
|
|
134
131
|
* }
|
|
135
132
|
* ```
|
|
136
133
|
*
|
|
137
|
-
* @public
|
|
138
134
|
* @korean 모바일컨트롤사용
|
|
139
135
|
*/
|
|
140
136
|
export declare function shouldUseMobileControls(): boolean;
|
|
@@ -147,7 +143,6 @@ export declare function shouldUseMobileControls(): boolean;
|
|
|
147
143
|
*
|
|
148
144
|
* @returns Safe area insets in pixels
|
|
149
145
|
*
|
|
150
|
-
* @public
|
|
151
146
|
* @korean 안전영역인셋
|
|
152
147
|
*/
|
|
153
148
|
export declare function getSafeAreaInsets(): {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deviceDetection.d.ts","sourceRoot":"","sources":["../../src/utils/deviceDetection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH;;GAEG;AACH,oBAAY,UAAU;IACpB,iCAAiC;IACjC,OAAO,YAAY;IACnB,wCAAwC;IACxC,MAAM,WAAW;IACjB,4CAA4C;IAC5C,MAAM,WAAW;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,4BAA4B;IAC5B,QAAQ,CAAC,EAAE,EAAE,KAAK,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,OAAO,GAAG,SAAS,CAAC;IAC3E,iCAAiC;IACjC,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAChC,0CAA0C;IAC1C,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,qCAAqC;IACrC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,+BAA+B;IAC/B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,gCAAgC;IAChC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,6BAA6B;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,8BAA8B;IAC9B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B;
|
|
1
|
+
{"version":3,"file":"deviceDetection.d.ts","sourceRoot":"","sources":["../../src/utils/deviceDetection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH;;GAEG;AACH,oBAAY,UAAU;IACpB,iCAAiC;IACjC,OAAO,YAAY;IACnB,wCAAwC;IACxC,MAAM,WAAW;IACjB,4CAA4C;IAC5C,MAAM,WAAW;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,4BAA4B;IAC5B,QAAQ,CAAC,EAAE,EAAE,KAAK,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,OAAO,GAAG,SAAS,CAAC;IAC3E,iCAAiC;IACjC,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAChC,0CAA0C;IAC1C,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,qCAAqC;IACrC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,+BAA+B;IAC/B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,gCAAgC;IAChC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,6BAA6B;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,8BAA8B;IAC9B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B;AA8GD;;;GAGG;AACH,eAAO,MAAM,iBAAiB,MAAM,CAAC;AAErC;;;GAGG;AACH,eAAO,MAAM,iBAAiB,OAAO,CAAC;AA8CtC;;;;;GAKG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CAKzC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAgB,cAAc,IAAI,YAAY,CAkE7C;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,IAAI,OAAO,CAGxC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,uBAAuB,IAAI,OAAO,CAoBjD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB;;;;;EA4DhC"}
|
|
@@ -133,7 +133,6 @@ var cachedScreenHeight = 0;
|
|
|
133
133
|
* Useful when window is resized or device emulation changes
|
|
134
134
|
* Also clears CSS environment variable cache
|
|
135
135
|
*
|
|
136
|
-
* @public
|
|
137
136
|
*/
|
|
138
137
|
function clearPlatformCache() {
|
|
139
138
|
cachedPlatform = null;
|
|
@@ -174,7 +173,6 @@ function clearPlatformCache() {
|
|
|
174
173
|
* }
|
|
175
174
|
* ```
|
|
176
175
|
*
|
|
177
|
-
* @public
|
|
178
176
|
* @korean 플랫폼감지
|
|
179
177
|
*/
|
|
180
178
|
function detectPlatform() {
|
|
@@ -234,7 +232,6 @@ function detectPlatform() {
|
|
|
234
232
|
*
|
|
235
233
|
* @returns True if device is mobile or tablet
|
|
236
234
|
*
|
|
237
|
-
* @public
|
|
238
235
|
* @korean 모바일확인
|
|
239
236
|
*/
|
|
240
237
|
function isMobileDevice() {
|
|
@@ -265,7 +262,6 @@ function isMobileDevice() {
|
|
|
265
262
|
* }
|
|
266
263
|
* ```
|
|
267
264
|
*
|
|
268
|
-
* @public
|
|
269
265
|
* @korean 모바일컨트롤사용
|
|
270
266
|
*/
|
|
271
267
|
function shouldUseMobileControls() {
|
|
@@ -285,7 +281,6 @@ function shouldUseMobileControls() {
|
|
|
285
281
|
*
|
|
286
282
|
* @returns Safe area insets in pixels
|
|
287
283
|
*
|
|
288
|
-
* @public
|
|
289
284
|
* @korean 안전영역인셋
|
|
290
285
|
*/
|
|
291
286
|
function getSafeAreaInsets() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deviceDetection.js","names":[],"sources":["../../src/utils/deviceDetection.ts"],"sourcesContent":["/**\n * Device Detection Utility\n *\n * Provides robust mobile device detection combining:\n * - User-agent string analysis\n * - Screen size detection\n * - Touch capability detection\n *\n * This ensures mobile controls are shown on all mobile devices,\n * including high-resolution phones that exceed typical mobile breakpoints.\n *\n * @module utils/deviceDetection\n * @category Mobile\n * @korean 기기감지유틸리티\n */\n\n/**\n * Device type classification\n */\nexport enum DeviceType {\n /** Desktop computer or laptop */\n DESKTOP = \"desktop\",\n /** Mobile phone (iOS, Android, etc.) */\n MOBILE = \"mobile\",\n /** Tablet device (iPad, Android tablets) */\n TABLET = \"tablet\",\n}\n\n/**\n * Platform detection results\n */\nexport interface PlatformInfo {\n /** Operating system type */\n readonly os: \"ios\" | \"android\" | \"windows\" | \"macos\" | \"linux\" | \"unknown\";\n /** Device type classification */\n readonly deviceType: DeviceType;\n /** Whether device has touch capability */\n readonly hasTouch: boolean;\n /** Whether device is mobile phone */\n readonly isMobile: boolean;\n /** Whether device is tablet */\n readonly isTablet: boolean;\n /** Whether device is desktop */\n readonly isDesktop: boolean;\n /** Screen width in pixels */\n readonly screenWidth: number;\n /** Screen height in pixels */\n readonly screenHeight: number;\n}\n\n/**\n * Detect if user-agent indicates a mobile device\n * Checks for common mobile device identifiers in user-agent string\n *\n * @param userAgent - Browser user-agent string\n * @returns True if user-agent indicates mobile device\n */\nfunction isMobileUserAgent(userAgent: string): boolean {\n const mobileKeywords = [\n \"Android\",\n \"webOS\",\n \"iPhone\",\n // 'iPad' is handled separately in isTabletUserAgent\n \"iPod\",\n \"BlackBerry\",\n \"IEMobile\",\n \"Opera Mini\",\n \"Mobile\",\n \"mobile\",\n ];\n\n return mobileKeywords.some((keyword) => userAgent.includes(keyword));\n}\n\n/**\n * Detect if user-agent indicates a tablet device\n *\n * @param userAgent - Browser user-agent string\n * @returns True if user-agent indicates tablet\n */\nfunction isTabletUserAgent(userAgent: string): boolean {\n // iPad is always a tablet\n if (userAgent.includes(\"iPad\")) {\n return true;\n }\n\n // Android tablets typically include \"Tablet\" or have Mobile absent\n if (userAgent.includes(\"Android\")) {\n return userAgent.includes(\"Tablet\") || !userAgent.includes(\"Mobile\");\n }\n\n return false;\n}\n\n/**\n * Detect operating system from user-agent\n *\n * @param userAgent - Browser user-agent string\n * @returns Operating system identifier\n */\nfunction detectOS(userAgent: string): PlatformInfo[\"os\"] {\n if (\n userAgent.includes(\"iPhone\") ||\n userAgent.includes(\"iPad\") ||\n userAgent.includes(\"iPod\")\n ) {\n return \"ios\";\n }\n if (userAgent.includes(\"Android\")) {\n return \"android\";\n }\n if (userAgent.includes(\"Windows\")) {\n return \"windows\";\n }\n if (userAgent.includes(\"Mac\")) {\n // Handle iPadOS 13+ in desktop mode, which reports a Mac-like user agent\n // e.g. \"Macintosh; Intel Mac OS X\" but still has touch support\n const isLikelyIPadOSDesktop =\n typeof navigator !== \"undefined\" &&\n typeof navigator.maxTouchPoints === \"number\" &&\n navigator.maxTouchPoints > 1 &&\n userAgent.includes(\"Macintosh\");\n\n if (isLikelyIPadOSDesktop) {\n return \"ios\";\n }\n return \"macos\";\n }\n if (userAgent.includes(\"Linux\")) {\n return \"linux\";\n }\n return \"unknown\";\n}\n\n/**\n * Detect if device has touch capability\n * Uses multiple methods for reliability\n *\n * @returns True if touch is supported\n */\nfunction hasTouchSupport(): boolean {\n // Check for touch events support\n if (\"ontouchstart\" in window) {\n return true;\n }\n\n // Check for touch points (must be defined and > 0)\n if (\n typeof navigator !== \"undefined\" &&\n typeof navigator.maxTouchPoints !== \"undefined\" &&\n navigator.maxTouchPoints > 0\n ) {\n return true;\n }\n\n // Check for pointer events with touch\n if (\n typeof window !== \"undefined\" &&\n window.matchMedia?.(\"(pointer: coarse)\")?.matches\n ) {\n return true;\n }\n\n return false;\n}\n\n/**\n * Mobile screen size breakpoint\n * Devices with width <= this value are considered mobile by size\n */\nexport const MOBILE_BREAKPOINT = 768;\n\n/**\n * Tablet screen size breakpoint\n * Devices with width > MOBILE_BREAKPOINT and <= TABLET_BREAKPOINT are tablets\n */\nexport const TABLET_BREAKPOINT = 1024;\n\n/**\n * Cached CSS environment variable insets\n */\nlet cachedCSSEnvInsets: { top: number; bottom: number } | null = null;\n\n/**\n * Read CSS environment variables for safe area insets\n * Results are cached as they don't change during a session\n */\nfunction readCSSEnvInsets(): { top: number; bottom: number } | null {\n if (cachedCSSEnvInsets !== null) {\n return cachedCSSEnvInsets;\n }\n\n if (typeof window !== \"undefined\" && typeof getComputedStyle === \"function\") {\n try {\n const root = document.documentElement;\n const style = getComputedStyle(root);\n const topEnv = style.getPropertyValue(\"env(safe-area-inset-top)\");\n const bottomEnv = style.getPropertyValue(\"env(safe-area-inset-bottom)\");\n\n if (topEnv || bottomEnv) {\n const result = {\n top: parseInt(topEnv || \"0\", 10) || 0,\n bottom: parseInt(bottomEnv || \"0\", 10) || 0,\n };\n cachedCSSEnvInsets = result;\n return result;\n }\n } catch {\n // Fall through to null\n }\n }\n\n return null;\n}\n\n/**\n * Cached platform information to avoid re-parsing user-agent on every call\n */\nlet cachedPlatform: PlatformInfo | null = null;\nlet cachedScreenWidth = 0;\nlet cachedScreenHeight = 0;\n\n/**\n * Clear the cached platform information\n * Useful when window is resized or device emulation changes\n * Also clears CSS environment variable cache\n *\n * @public\n */\nexport function clearPlatformCache(): void {\n cachedPlatform = null;\n cachedScreenWidth = 0;\n cachedScreenHeight = 0;\n cachedCSSEnvInsets = null;\n}\n\n/**\n * Detect device type and platform information\n *\n * Combines multiple detection methods for reliability:\n * 1. User-agent string analysis (most reliable for device type)\n * 2. Screen dimensions\n * 3. Touch capability\n *\n * This ensures mobile controls are shown on:\n * - Standard mobile phones (< 768px width)\n * - High-resolution phones (>= 768px width but mobile user-agent)\n * - Android 15/16 devices with 2K/4K resolutions (1200px+, 1440px+)\n * - Tablets (user preference via touch support)\n *\n * **User-agent detection takes priority over screen size**, ensuring that\n * high-end Android phones with desktop-class resolutions (e.g., Galaxy S23 Ultra,\n * Pixel 9 Pro) are correctly identified as mobile devices.\n *\n * Results are cached to avoid re-parsing user-agent on every call.\n * Cache is invalidated when screen dimensions change.\n *\n * @returns Complete platform information\n *\n * @example\n * ```typescript\n * const platform = detectPlatform();\n *\n * if (platform.isMobile) {\n * // Show mobile controls even on 4K Android phones\n * return <MobileControls />;\n * }\n * ```\n *\n * @public\n * @korean 플랫폼감지\n */\nexport function detectPlatform(): PlatformInfo {\n const userAgent = typeof navigator !== \"undefined\" ? navigator.userAgent : \"\";\n const screenWidth = typeof window !== \"undefined\" ? window.innerWidth : 1920;\n const screenHeight =\n typeof window !== \"undefined\" ? window.innerHeight : 1080;\n\n // Return cached result if screen dimensions haven't changed\n if (\n cachedPlatform !== null &&\n cachedScreenWidth === screenWidth &&\n cachedScreenHeight === screenHeight\n ) {\n return cachedPlatform;\n }\n\n // Detect OS\n const os = detectOS(userAgent);\n\n // Detect touch capability\n const hasTouch = hasTouchSupport();\n\n // Detect if mobile by user-agent (most reliable method)\n const isMobileUA = isMobileUserAgent(userAgent);\n\n // Detect if tablet by user-agent\n const isTabletUA = isTabletUserAgent(userAgent);\n\n // Detect by screen size (fallback method)\n const isMobileBySize = screenWidth <= MOBILE_BREAKPOINT;\n const isTabletBySize =\n screenWidth > MOBILE_BREAKPOINT && screenWidth <= TABLET_BREAKPOINT;\n\n // Determine device type\n // Priority: User-agent > Screen size\n let deviceType: DeviceType;\n let isMobile: boolean;\n let isTablet: boolean;\n\n if (isMobileUA && !isTabletUA) {\n // User-agent indicates phone\n deviceType = DeviceType.MOBILE;\n isMobile = true;\n isTablet = false;\n } else if (isTabletUA) {\n // User-agent indicates tablet\n deviceType = DeviceType.TABLET;\n isMobile = false;\n isTablet = true;\n } else if (isMobileBySize) {\n // Small screen, assume mobile\n deviceType = DeviceType.MOBILE;\n isMobile = true;\n isTablet = false;\n } else if (isTabletBySize && hasTouch) {\n // Medium screen with touch, assume tablet\n deviceType = DeviceType.TABLET;\n isMobile = false;\n isTablet = true;\n } else {\n // Desktop\n deviceType = DeviceType.DESKTOP;\n isMobile = false;\n isTablet = false;\n }\n\n const isDesktop = deviceType === DeviceType.DESKTOP;\n\n const result: PlatformInfo = {\n os,\n deviceType,\n hasTouch,\n isMobile,\n isTablet,\n isDesktop,\n screenWidth,\n screenHeight,\n };\n\n // Cache the result along with screen dimensions\n cachedPlatform = result;\n cachedScreenWidth = screenWidth;\n cachedScreenHeight = screenHeight;\n\n return result;\n}\n\n/**\n * Simple mobile check for backward compatibility\n * Returns true for both mobile phones and tablets\n *\n * @returns True if device is mobile or tablet\n *\n * @public\n * @korean 모바일확인\n */\nexport function isMobileDevice(): boolean {\n const platform = detectPlatform();\n return platform.isMobile || platform.isTablet;\n}\n\n/**\n * Check if device should use mobile controls\n * Takes into account device type, screen size, and touch capability\n *\n * Uses user-agent detection to correctly identify mobile devices regardless\n * of screen resolution. This ensures high-end Android 15/16 phones with\n * 2K/4K displays (1200px+, 1440px+) show mobile controls.\n *\n * Also ensures tablets and touch-enabled devices always show mobile controls\n * regardless of resolution, for better UX on touch devices.\n *\n * @returns True if mobile controls should be shown\n *\n * @example\n * ```typescript\n * // High-res Android phone (1440x3168) → returns true via user-agent\n * // Desktop with 1440px screen → returns false (no mobile user-agent)\n * // iPad Pro 12.9\" (1024x1366) → returns true (tablet user-agent)\n * // Surface Pro in tablet mode → returns true (touch + tablet size)\n * if (shouldUseMobileControls()) {\n * return <VirtualDPad />; // Touch-optimized controls\n * }\n * ```\n *\n * @public\n * @korean 모바일컨트롤사용\n */\nexport function shouldUseMobileControls(): boolean {\n const platform = detectPlatform();\n\n // Always use mobile controls on phones\n if (platform.isMobile) {\n return true;\n }\n\n // Use mobile controls on tablets (better touch experience)\n if (platform.isTablet) {\n return true;\n }\n\n // Use mobile controls on any touch-enabled device up to tablet breakpoint\n // This catches Windows tablets, Chromebooks in tablet mode, etc.\n if (platform.hasTouch && platform.screenWidth <= TABLET_BREAKPOINT) {\n return true;\n }\n\n // Use mobile controls on small desktop screens with touch\n if (platform.screenWidth <= MOBILE_BREAKPOINT && platform.hasTouch) {\n return true;\n }\n\n return false;\n}\n\n/**\n * Get safe area insets for device\n * Returns appropriate values based on device type and OS\n *\n * For iOS devices, attempts to detect if device has a notch by checking\n * screen dimensions. Falls back to CSS environment variables if available.\n *\n * @returns Safe area insets in pixels\n *\n * @public\n * @korean 안전영역인셋\n */\nexport function getSafeAreaInsets() {\n const platform = detectPlatform();\n\n // iOS devices - distinguish between notched and non-notched\n if (platform.os === \"ios\" && platform.isMobile) {\n // Try to read CSS environment variables first (most accurate)\n const cssEnvInsets = readCSSEnvInsets();\n if (cssEnvInsets) {\n return {\n top: cssEnvInsets.top,\n bottom: cssEnvInsets.bottom,\n left: 0,\n right: 0,\n };\n }\n\n // Detect orientation\n const isLandscape = platform.screenWidth > platform.screenHeight;\n\n // Heuristic: iPhone X and later have notches and specific screen dimensions\n // iPhone X/XS/11 Pro: 375x812, iPhone XR/11: 414x896, iPhone 12/13/14: 390x844, etc.\n // Only devices with height >= 812 (portrait) or width >= 812 (landscape) have notches\n const hasNotch =\n platform.screenHeight >= 812 || platform.screenWidth >= 812;\n\n if (hasNotch) {\n if (isLandscape) {\n // In landscape, notch is on the side\n return {\n top: 0,\n bottom: 21, // Home indicator\n left: 44, // Notch side\n right: 44, // Opposite side for symmetry\n };\n } else {\n // In portrait, notch is at top\n return {\n top: 44,\n bottom: 34,\n left: 0,\n right: 0,\n };\n }\n } else {\n // Older iPhones without notch (iPhone 8, SE, etc.)\n return {\n top: 20, // Status bar height\n bottom: 0,\n left: 0,\n right: 0,\n };\n }\n }\n\n // Android devices (standard status bar)\n if (platform.os === \"android\" && platform.isMobile) {\n return {\n top: 24,\n bottom: 0,\n left: 0,\n right: 0,\n };\n }\n\n // Tablets and desktop - no safe area needed\n return {\n top: 0,\n bottom: 0,\n left: 0,\n right: 0,\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"deviceDetection.js","names":[],"sources":["../../src/utils/deviceDetection.ts"],"sourcesContent":["/**\n * Device Detection Utility\n *\n * Provides robust mobile device detection combining:\n * - User-agent string analysis\n * - Screen size detection\n * - Touch capability detection\n *\n * This ensures mobile controls are shown on all mobile devices,\n * including high-resolution phones that exceed typical mobile breakpoints.\n *\n * @module utils/deviceDetection\n * @category Mobile\n * @korean 기기감지유틸리티\n */\n\n/**\n * Device type classification\n */\nexport enum DeviceType {\n /** Desktop computer or laptop */\n DESKTOP = \"desktop\",\n /** Mobile phone (iOS, Android, etc.) */\n MOBILE = \"mobile\",\n /** Tablet device (iPad, Android tablets) */\n TABLET = \"tablet\",\n}\n\n/**\n * Platform detection results\n */\nexport interface PlatformInfo {\n /** Operating system type */\n readonly os: \"ios\" | \"android\" | \"windows\" | \"macos\" | \"linux\" | \"unknown\";\n /** Device type classification */\n readonly deviceType: DeviceType;\n /** Whether device has touch capability */\n readonly hasTouch: boolean;\n /** Whether device is mobile phone */\n readonly isMobile: boolean;\n /** Whether device is tablet */\n readonly isTablet: boolean;\n /** Whether device is desktop */\n readonly isDesktop: boolean;\n /** Screen width in pixels */\n readonly screenWidth: number;\n /** Screen height in pixels */\n readonly screenHeight: number;\n}\n\n/**\n * Detect if user-agent indicates a mobile device\n * Checks for common mobile device identifiers in user-agent string\n *\n * @param userAgent - Browser user-agent string\n * @returns True if user-agent indicates mobile device\n */\nfunction isMobileUserAgent(userAgent: string): boolean {\n const mobileKeywords = [\n \"Android\",\n \"webOS\",\n \"iPhone\",\n \"iPod\",\n \"BlackBerry\",\n \"IEMobile\",\n \"Opera Mini\",\n \"Mobile\",\n \"mobile\",\n ];\n\n return mobileKeywords.some((keyword) => userAgent.includes(keyword));\n}\n\n/**\n * Detect if user-agent indicates a tablet device\n *\n * @param userAgent - Browser user-agent string\n * @returns True if user-agent indicates tablet\n */\nfunction isTabletUserAgent(userAgent: string): boolean {\n if (userAgent.includes(\"iPad\")) {\n return true;\n }\n\n if (userAgent.includes(\"Android\")) {\n return userAgent.includes(\"Tablet\") || !userAgent.includes(\"Mobile\");\n }\n\n return false;\n}\n\n/**\n * Detect operating system from user-agent\n *\n * @param userAgent - Browser user-agent string\n * @returns Operating system identifier\n */\nfunction detectOS(userAgent: string): PlatformInfo[\"os\"] {\n if (\n userAgent.includes(\"iPhone\") ||\n userAgent.includes(\"iPad\") ||\n userAgent.includes(\"iPod\")\n ) {\n return \"ios\";\n }\n if (userAgent.includes(\"Android\")) {\n return \"android\";\n }\n if (userAgent.includes(\"Windows\")) {\n return \"windows\";\n }\n if (userAgent.includes(\"Mac\")) {\n const isLikelyIPadOSDesktop =\n typeof navigator !== \"undefined\" &&\n typeof navigator.maxTouchPoints === \"number\" &&\n navigator.maxTouchPoints > 1 &&\n userAgent.includes(\"Macintosh\");\n\n if (isLikelyIPadOSDesktop) {\n return \"ios\";\n }\n return \"macos\";\n }\n if (userAgent.includes(\"Linux\")) {\n return \"linux\";\n }\n return \"unknown\";\n}\n\n/**\n * Detect if device has touch capability\n * Uses multiple methods for reliability\n *\n * @returns True if touch is supported\n */\nfunction hasTouchSupport(): boolean {\n if (\"ontouchstart\" in window) {\n return true;\n }\n\n if (\n typeof navigator !== \"undefined\" &&\n typeof navigator.maxTouchPoints !== \"undefined\" &&\n navigator.maxTouchPoints > 0\n ) {\n return true;\n }\n\n if (\n typeof window !== \"undefined\" &&\n window.matchMedia?.(\"(pointer: coarse)\")?.matches\n ) {\n return true;\n }\n\n return false;\n}\n\n/**\n * Mobile screen size breakpoint\n * Devices with width <= this value are considered mobile by size\n */\nexport const MOBILE_BREAKPOINT = 768;\n\n/**\n * Tablet screen size breakpoint\n * Devices with width > MOBILE_BREAKPOINT and <= TABLET_BREAKPOINT are tablets\n */\nexport const TABLET_BREAKPOINT = 1024;\n\n/**\n * Cached CSS environment variable insets\n */\nlet cachedCSSEnvInsets: { top: number; bottom: number } | null = null;\n\n/**\n * Read CSS environment variables for safe area insets\n * Results are cached as they don't change during a session\n */\nfunction readCSSEnvInsets(): { top: number; bottom: number } | null {\n if (cachedCSSEnvInsets !== null) {\n return cachedCSSEnvInsets;\n }\n\n if (typeof window !== \"undefined\" && typeof getComputedStyle === \"function\") {\n try {\n const root = document.documentElement;\n const style = getComputedStyle(root);\n const topEnv = style.getPropertyValue(\"env(safe-area-inset-top)\");\n const bottomEnv = style.getPropertyValue(\"env(safe-area-inset-bottom)\");\n\n if (topEnv || bottomEnv) {\n const result = {\n top: parseInt(topEnv || \"0\", 10) || 0,\n bottom: parseInt(bottomEnv || \"0\", 10) || 0,\n };\n cachedCSSEnvInsets = result;\n return result;\n }\n } catch {\n // intentional: fall through to null\n }\n }\n\n return null;\n}\n\n/**\n * Cached platform information to avoid re-parsing user-agent on every call\n */\nlet cachedPlatform: PlatformInfo | null = null;\nlet cachedScreenWidth = 0;\nlet cachedScreenHeight = 0;\n\n/**\n * Clear the cached platform information\n * Useful when window is resized or device emulation changes\n * Also clears CSS environment variable cache\n *\n */\nexport function clearPlatformCache(): void {\n cachedPlatform = null;\n cachedScreenWidth = 0;\n cachedScreenHeight = 0;\n cachedCSSEnvInsets = null;\n}\n\n/**\n * Detect device type and platform information\n *\n * Combines multiple detection methods for reliability:\n * 1. User-agent string analysis (most reliable for device type)\n * 2. Screen dimensions\n * 3. Touch capability\n *\n * This ensures mobile controls are shown on:\n * - Standard mobile phones (< 768px width)\n * - High-resolution phones (>= 768px width but mobile user-agent)\n * - Android 15/16 devices with 2K/4K resolutions (1200px+, 1440px+)\n * - Tablets (user preference via touch support)\n *\n * **User-agent detection takes priority over screen size**, ensuring that\n * high-end Android phones with desktop-class resolutions (e.g., Galaxy S23 Ultra,\n * Pixel 9 Pro) are correctly identified as mobile devices.\n *\n * Results are cached to avoid re-parsing user-agent on every call.\n * Cache is invalidated when screen dimensions change.\n *\n * @returns Complete platform information\n *\n * @example\n * ```typescript\n * const platform = detectPlatform();\n *\n * if (platform.isMobile) {\n * // Show mobile controls even on 4K Android phones\n * return <MobileControls />;\n * }\n * ```\n *\n * @korean 플랫폼감지\n */\nexport function detectPlatform(): PlatformInfo {\n const userAgent = typeof navigator !== \"undefined\" ? navigator.userAgent : \"\";\n const screenWidth = typeof window !== \"undefined\" ? window.innerWidth : 1920;\n const screenHeight =\n typeof window !== \"undefined\" ? window.innerHeight : 1080;\n\n if (\n cachedPlatform !== null &&\n cachedScreenWidth === screenWidth &&\n cachedScreenHeight === screenHeight\n ) {\n return cachedPlatform;\n }\n\n const os = detectOS(userAgent);\n const hasTouch = hasTouchSupport();\n const isMobileUA = isMobileUserAgent(userAgent);\n const isTabletUA = isTabletUserAgent(userAgent);\n const isMobileBySize = screenWidth <= MOBILE_BREAKPOINT;\n const isTabletBySize =\n screenWidth > MOBILE_BREAKPOINT && screenWidth <= TABLET_BREAKPOINT;\n\n let deviceType: DeviceType;\n let isMobile: boolean;\n let isTablet: boolean;\n\n if (isMobileUA && !isTabletUA) {\n deviceType = DeviceType.MOBILE;\n isMobile = true;\n isTablet = false;\n } else if (isTabletUA) {\n deviceType = DeviceType.TABLET;\n isMobile = false;\n isTablet = true;\n } else if (isMobileBySize) {\n deviceType = DeviceType.MOBILE;\n isMobile = true;\n isTablet = false;\n } else if (isTabletBySize && hasTouch) {\n deviceType = DeviceType.TABLET;\n isMobile = false;\n isTablet = true;\n } else {\n deviceType = DeviceType.DESKTOP;\n isMobile = false;\n isTablet = false;\n }\n\n const isDesktop = deviceType === DeviceType.DESKTOP;\n\n const result: PlatformInfo = {\n os,\n deviceType,\n hasTouch,\n isMobile,\n isTablet,\n isDesktop,\n screenWidth,\n screenHeight,\n };\n\n cachedPlatform = result;\n cachedScreenWidth = screenWidth;\n cachedScreenHeight = screenHeight;\n\n return result;\n}\n\n/**\n * Simple mobile check for backward compatibility\n * Returns true for both mobile phones and tablets\n *\n * @returns True if device is mobile or tablet\n *\n * @korean 모바일확인\n */\nexport function isMobileDevice(): boolean {\n const platform = detectPlatform();\n return platform.isMobile || platform.isTablet;\n}\n\n/**\n * Check if device should use mobile controls\n * Takes into account device type, screen size, and touch capability\n *\n * Uses user-agent detection to correctly identify mobile devices regardless\n * of screen resolution. This ensures high-end Android 15/16 phones with\n * 2K/4K displays (1200px+, 1440px+) show mobile controls.\n *\n * Also ensures tablets and touch-enabled devices always show mobile controls\n * regardless of resolution, for better UX on touch devices.\n *\n * @returns True if mobile controls should be shown\n *\n * @example\n * ```typescript\n * // High-res Android phone (1440x3168) → returns true via user-agent\n * // Desktop with 1440px screen → returns false (no mobile user-agent)\n * // iPad Pro 12.9\" (1024x1366) → returns true (tablet user-agent)\n * // Surface Pro in tablet mode → returns true (touch + tablet size)\n * if (shouldUseMobileControls()) {\n * return <VirtualDPad />; // Touch-optimized controls\n * }\n * ```\n *\n * @korean 모바일컨트롤사용\n */\nexport function shouldUseMobileControls(): boolean {\n const platform = detectPlatform();\n\n if (platform.isMobile) {\n return true;\n }\n\n if (platform.isTablet) {\n return true;\n }\n\n if (platform.hasTouch && platform.screenWidth <= TABLET_BREAKPOINT) {\n return true;\n }\n\n if (platform.screenWidth <= MOBILE_BREAKPOINT && platform.hasTouch) {\n return true;\n }\n\n return false;\n}\n\n/**\n * Get safe area insets for device\n * Returns appropriate values based on device type and OS\n *\n * For iOS devices, attempts to detect if device has a notch by checking\n * screen dimensions. Falls back to CSS environment variables if available.\n *\n * @returns Safe area insets in pixels\n *\n * @korean 안전영역인셋\n */\nexport function getSafeAreaInsets() {\n const platform = detectPlatform();\n\n if (platform.os === \"ios\" && platform.isMobile) {\n const cssEnvInsets = readCSSEnvInsets();\n if (cssEnvInsets) {\n return {\n top: cssEnvInsets.top,\n bottom: cssEnvInsets.bottom,\n left: 0,\n right: 0,\n };\n }\n\n const isLandscape = platform.screenWidth > platform.screenHeight;\n\n const hasNotch =\n platform.screenHeight >= 812 || platform.screenWidth >= 812;\n\n if (hasNotch) {\n if (isLandscape) {\n return {\n top: 0,\n bottom: 21,\n left: 44,\n right: 44,\n };\n } else {\n return {\n top: 44,\n bottom: 34,\n left: 0,\n right: 0,\n };\n }\n } else {\n return {\n top: 20,\n bottom: 0,\n left: 0,\n right: 0,\n };\n }\n }\n\n if (platform.os === \"android\" && platform.isMobile) {\n return {\n top: 24,\n bottom: 0,\n left: 0,\n right: 0,\n };\n }\n\n return {\n top: 0,\n bottom: 0,\n left: 0,\n right: 0,\n };\n}\n"],"mappings":"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"}
|
|
@@ -31,7 +31,6 @@ export type HapticIntensity = "light" | "medium" | "heavy";
|
|
|
31
31
|
* }
|
|
32
32
|
* ```
|
|
33
33
|
*
|
|
34
|
-
* @public
|
|
35
34
|
* @korean 햅틱지원여부
|
|
36
35
|
*/
|
|
37
36
|
export declare function isHapticSupported(): boolean;
|
|
@@ -53,7 +52,6 @@ export declare function isHapticSupported(): boolean;
|
|
|
53
52
|
* triggerHapticFeedback('heavy');
|
|
54
53
|
* ```
|
|
55
54
|
*
|
|
56
|
-
* @public
|
|
57
55
|
* @korean 햅틱피드백트리거
|
|
58
56
|
*/
|
|
59
57
|
export declare function triggerHapticFeedback(intensity: HapticIntensity): boolean;
|
|
@@ -70,7 +68,6 @@ export declare function triggerHapticFeedback(intensity: HapticIntensity): boole
|
|
|
70
68
|
* triggerHapticPattern([50, 50, 50]);
|
|
71
69
|
* ```
|
|
72
70
|
*
|
|
73
|
-
* @public
|
|
74
71
|
* @korean 햅틱패턴트리거
|
|
75
72
|
*/
|
|
76
73
|
export declare function triggerHapticPattern(pattern: readonly number[]): boolean;
|
|
@@ -82,50 +79,23 @@ export declare function triggerHapticPattern(pattern: readonly number[]): boolea
|
|
|
82
79
|
* @korean UI햅틱피드백
|
|
83
80
|
*/
|
|
84
81
|
export declare const UIHaptics: {
|
|
85
|
-
/**
|
|
86
|
-
* Button tap feedback
|
|
87
|
-
* @korean 버튼탭피드백
|
|
88
|
-
*/
|
|
82
|
+
/** Button tap feedback @korean 버튼탭피드백 */
|
|
89
83
|
readonly buttonTap: () => boolean;
|
|
90
|
-
/**
|
|
91
|
-
* Menu hover/navigation feedback
|
|
92
|
-
* @korean 메뉴호버피드백
|
|
93
|
-
*/
|
|
84
|
+
/** Menu hover/navigation feedback @korean 메뉴호버피드백 */
|
|
94
85
|
readonly menuHover: () => boolean;
|
|
95
|
-
/**
|
|
96
|
-
* Stance change feedback
|
|
97
|
-
* @korean 자세변경피드백
|
|
98
|
-
*/
|
|
86
|
+
/** Stance change feedback @korean 자세변경피드백 */
|
|
99
87
|
readonly stanceChange: () => boolean;
|
|
100
|
-
/**
|
|
101
|
-
* Attack execution feedback
|
|
102
|
-
* @korean 공격실행피드백
|
|
103
|
-
*/
|
|
88
|
+
/** Attack execution feedback @korean 공격실행피드백 */
|
|
104
89
|
readonly attackExecution: () => boolean;
|
|
105
|
-
/**
|
|
106
|
-
* Critical hit feedback
|
|
107
|
-
* @korean 치명타피드백
|
|
108
|
-
*/
|
|
90
|
+
/** Critical hit feedback @korean 치명타피드백 */
|
|
109
91
|
readonly criticalHit: () => boolean;
|
|
110
|
-
/**
|
|
111
|
-
* Vital point strike feedback
|
|
112
|
-
* @korean 급소타격피드백
|
|
113
|
-
*/
|
|
92
|
+
/** Vital point strike feedback @korean 급소타격피드백 */
|
|
114
93
|
readonly vitalPointStrike: () => boolean;
|
|
115
|
-
/**
|
|
116
|
-
* Block/defend feedback
|
|
117
|
-
* @korean 방어피드백
|
|
118
|
-
*/
|
|
94
|
+
/** Block/defend feedback @korean 방어피드백 */
|
|
119
95
|
readonly blockDefend: () => boolean;
|
|
120
|
-
/**
|
|
121
|
-
* Error/invalid action feedback
|
|
122
|
-
* @korean 오류피드백
|
|
123
|
-
*/
|
|
96
|
+
/** Error/invalid action feedback @korean 오류피드백 */
|
|
124
97
|
readonly error: () => boolean;
|
|
125
|
-
/**
|
|
126
|
-
* Success/achievement feedback
|
|
127
|
-
* @korean 성공피드백
|
|
128
|
-
*/
|
|
98
|
+
/** Success/achievement feedback @korean 성공피드백 */
|
|
129
99
|
readonly success: () => boolean;
|
|
130
100
|
};
|
|
131
101
|
/**
|
|
@@ -136,55 +106,28 @@ export declare const UIHaptics: {
|
|
|
136
106
|
* @korean 전투햅틱피드백
|
|
137
107
|
*/
|
|
138
108
|
export declare const CombatHaptics: {
|
|
139
|
-
/**
|
|
140
|
-
* Normal hit feedback
|
|
141
|
-
* @korean 일반타격피드백
|
|
142
|
-
*/
|
|
109
|
+
/** Normal hit feedback @korean 일반타격피드백 */
|
|
143
110
|
readonly normalHit: () => boolean;
|
|
144
|
-
/**
|
|
145
|
-
* Critical hit feedback with double pulse
|
|
146
|
-
* @korean 치명타피드백
|
|
147
|
-
*/
|
|
111
|
+
/** Critical hit feedback with double pulse @korean 치명타피드백 */
|
|
148
112
|
readonly criticalHit: () => boolean;
|
|
149
|
-
/**
|
|
150
|
-
* Perfect strike feedback (triple pulse)
|
|
151
|
-
* @korean 완벽타격피드백
|
|
152
|
-
*/
|
|
113
|
+
/** Perfect strike feedback (triple pulse) @korean 완벽타격피드백 */
|
|
153
114
|
readonly perfectStrike: () => boolean;
|
|
154
|
-
/**
|
|
155
|
-
* Vital point strike feedback (intense pattern)
|
|
156
|
-
* @korean 급소타격피드백
|
|
157
|
-
*/
|
|
115
|
+
/** Vital point strike feedback (intense pattern) @korean 급소타격피드백 */
|
|
158
116
|
readonly vitalPointHit: () => boolean;
|
|
159
|
-
/**
|
|
160
|
-
* Blocked attack feedback (sharp double pulse)
|
|
161
|
-
* @korean 방어성공피드백
|
|
162
|
-
*/
|
|
117
|
+
/** Blocked attack feedback (sharp double pulse) @korean 방어성공피드백 */
|
|
163
118
|
readonly attackBlocked: () => boolean;
|
|
164
|
-
/**
|
|
165
|
-
* Miss feedback (quick light pulse)
|
|
166
|
-
* @korean 빗나감피드백
|
|
167
|
-
*/
|
|
119
|
+
/** Miss feedback (quick light pulse) @korean 빗나감피드백 */
|
|
168
120
|
readonly attackMissed: () => boolean;
|
|
169
|
-
/**
|
|
170
|
-
* Counter-attack feedback (building intensity)
|
|
171
|
-
* @korean 반격피드백
|
|
172
|
-
*/
|
|
121
|
+
/** Counter-attack feedback (building intensity) @korean 반격피드백 */
|
|
173
122
|
readonly counterAttack: () => boolean;
|
|
174
123
|
/**
|
|
175
124
|
* Combo hit feedback (rhythmic pattern)
|
|
176
125
|
* @korean 콤보타격피드백
|
|
177
126
|
*/
|
|
178
127
|
readonly comboHit: (comboCount: number) => boolean;
|
|
179
|
-
/**
|
|
180
|
-
* Heavy damage taken feedback (long intense pulse)
|
|
181
|
-
* @korean 큰피해피드백
|
|
182
|
-
*/
|
|
128
|
+
/** Heavy damage taken feedback (long intense pulse) @korean 큰피해피드백 */
|
|
183
129
|
readonly heavyDamage: () => boolean;
|
|
184
|
-
/**
|
|
185
|
-
* Knockout feedback (dramatic pattern)
|
|
186
|
-
* @korean 녹다운피드백
|
|
187
|
-
*/
|
|
130
|
+
/** Knockout feedback (dramatic pattern) @korean 녹다운피드백 */
|
|
188
131
|
readonly knockout: () => boolean;
|
|
189
132
|
};
|
|
190
133
|
/**
|
|
@@ -195,30 +138,15 @@ export declare const CombatHaptics: {
|
|
|
195
138
|
* @korean 훈련햅틱피드백
|
|
196
139
|
*/
|
|
197
140
|
export declare const TrainingHaptics: {
|
|
198
|
-
/**
|
|
199
|
-
* Correct technique feedback
|
|
200
|
-
* @korean 정확한기술피드백
|
|
201
|
-
*/
|
|
141
|
+
/** Correct technique feedback @korean 정확한기술피드백 */
|
|
202
142
|
readonly correctTechnique: () => boolean;
|
|
203
|
-
/**
|
|
204
|
-
* Incorrect technique feedback
|
|
205
|
-
* @korean 부정확한기술피드백
|
|
206
|
-
*/
|
|
143
|
+
/** Incorrect technique feedback @korean 부정확한기술피드백 */
|
|
207
144
|
readonly incorrectTechnique: () => boolean;
|
|
208
|
-
/**
|
|
209
|
-
* Target hit feedback
|
|
210
|
-
* @korean 표적명중피드백
|
|
211
|
-
*/
|
|
145
|
+
/** Target hit feedback @korean 표적명중피드백 */
|
|
212
146
|
readonly targetHit: () => boolean;
|
|
213
|
-
/**
|
|
214
|
-
* Perfect timing feedback
|
|
215
|
-
* @korean 완벽한타이밍피드백
|
|
216
|
-
*/
|
|
147
|
+
/** Perfect timing feedback @korean 완벽한타이밍피드백 */
|
|
217
148
|
readonly perfectTiming: () => boolean;
|
|
218
|
-
/**
|
|
219
|
-
* New skill unlocked feedback
|
|
220
|
-
* @korean 새기술해금피드백
|
|
221
|
-
*/
|
|
149
|
+
/** New skill unlocked feedback @korean 새기술해금피드백 */
|
|
222
150
|
readonly skillUnlocked: () => boolean;
|
|
223
151
|
};
|
|
224
152
|
//# sourceMappingURL=hapticFeedback.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hapticFeedback.d.ts","sourceRoot":"","sources":["../../src/utils/hapticFeedback.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH;;;;;GAKG;AACH,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;AAkC3D
|
|
1
|
+
{"version":3,"file":"hapticFeedback.d.ts","sourceRoot":"","sources":["../../src/utils/hapticFeedback.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH;;;;;GAKG;AACH,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;AAkC3D;;;;;;;;;;;;;GAaG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAQ3C;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,eAAe,GAAG,OAAO,CAyBzE;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAoBxE;AAED;;;;;;GAMG;AACH,eAAO,MAAM,SAAS;IACpB,yCAAyC;;IAEzC,qDAAqD;;IAErD,6CAA6C;;IAE7C,gDAAgD;;IAEhD,2CAA2C;;IAE3C,kDAAkD;;IAElD,0CAA0C;;IAE1C,kDAAkD;;IAElD,iDAAiD;;CAEzC,CAAC;AAEX;;;;;;GAMG;AACH,eAAO,MAAM,aAAa;IACxB,0CAA0C;;IAE1C,6DAA6D;;IAE7D,6DAA6D;;IAE7D,oEAAoE;;IAEpE,mEAAmE;;IAEnE,uDAAuD;;IAEvD,iEAAiE;;IAEjE;;;OAGG;oCACoB,MAAM;IAO7B,sEAAsE;;IAEtE,0DAA0D;;CAElD,CAAC;AAEX;;;;;;GAMG;AACH,eAAO,MAAM,eAAe;IAC1B,kDAAkD;;IAElD,qDAAqD;;IAErD,0CAA0C;;IAE1C,gDAAgD;;IAEhD,mDAAmD;;CAE3C,CAAC"}
|
|
@@ -31,7 +31,6 @@ var HAPTIC_PATTERNS = {
|
|
|
31
31
|
* }
|
|
32
32
|
* ```
|
|
33
33
|
*
|
|
34
|
-
* @public
|
|
35
34
|
* @korean 햅틱지원여부
|
|
36
35
|
*/
|
|
37
36
|
function isHapticSupported() {
|
|
@@ -57,7 +56,6 @@ function isHapticSupported() {
|
|
|
57
56
|
* triggerHapticFeedback('heavy');
|
|
58
57
|
* ```
|
|
59
58
|
*
|
|
60
|
-
* @public
|
|
61
59
|
* @korean 햅틱피드백트리거
|
|
62
60
|
*/
|
|
63
61
|
function triggerHapticFeedback(intensity) {
|
|
@@ -85,7 +83,6 @@ function triggerHapticFeedback(intensity) {
|
|
|
85
83
|
* triggerHapticPattern([50, 50, 50]);
|
|
86
84
|
* ```
|
|
87
85
|
*
|
|
88
|
-
* @public
|
|
89
86
|
* @korean 햅틱패턴트리거
|
|
90
87
|
*/
|
|
91
88
|
function triggerHapticPattern(pattern) {
|
|
@@ -107,39 +104,21 @@ function triggerHapticPattern(pattern) {
|
|
|
107
104
|
* @korean UI햅틱피드백
|
|
108
105
|
*/
|
|
109
106
|
var UIHaptics = {
|
|
110
|
-
/**
|
|
111
|
-
* Button tap feedback
|
|
112
|
-
* @korean 버튼탭피드백
|
|
113
|
-
*/
|
|
107
|
+
/** Button tap feedback @korean 버튼탭피드백 */
|
|
114
108
|
buttonTap: () => triggerHapticFeedback("medium"),
|
|
115
|
-
/**
|
|
116
|
-
* Menu hover/navigation feedback
|
|
117
|
-
* @korean 메뉴호버피드백
|
|
118
|
-
*/
|
|
109
|
+
/** Menu hover/navigation feedback @korean 메뉴호버피드백 */
|
|
119
110
|
menuHover: () => triggerHapticFeedback("light"),
|
|
120
|
-
/**
|
|
121
|
-
* Stance change feedback
|
|
122
|
-
* @korean 자세변경피드백
|
|
123
|
-
*/
|
|
111
|
+
/** Stance change feedback @korean 자세변경피드백 */
|
|
124
112
|
stanceChange: () => triggerHapticFeedback("light"),
|
|
125
|
-
/**
|
|
126
|
-
* Attack execution feedback
|
|
127
|
-
* @korean 공격실행피드백
|
|
128
|
-
*/
|
|
113
|
+
/** Attack execution feedback @korean 공격실행피드백 */
|
|
129
114
|
attackExecution: () => triggerHapticFeedback("medium"),
|
|
130
|
-
/**
|
|
131
|
-
* Critical hit feedback
|
|
132
|
-
* @korean 치명타피드백
|
|
133
|
-
*/
|
|
115
|
+
/** Critical hit feedback @korean 치명타피드백 */
|
|
134
116
|
criticalHit: () => triggerHapticPattern([
|
|
135
117
|
50,
|
|
136
118
|
30,
|
|
137
119
|
100
|
|
138
120
|
]),
|
|
139
|
-
/**
|
|
140
|
-
* Vital point strike feedback
|
|
141
|
-
* @korean 급소타격피드백
|
|
142
|
-
*/
|
|
121
|
+
/** Vital point strike feedback @korean 급소타격피드백 */
|
|
143
122
|
vitalPointStrike: () => triggerHapticPattern([
|
|
144
123
|
100,
|
|
145
124
|
50,
|
|
@@ -147,24 +126,15 @@ var UIHaptics = {
|
|
|
147
126
|
50,
|
|
148
127
|
100
|
|
149
128
|
]),
|
|
150
|
-
/**
|
|
151
|
-
* Block/defend feedback
|
|
152
|
-
* @korean 방어피드백
|
|
153
|
-
*/
|
|
129
|
+
/** Block/defend feedback @korean 방어피드백 */
|
|
154
130
|
blockDefend: () => triggerHapticFeedback("medium"),
|
|
155
|
-
/**
|
|
156
|
-
* Error/invalid action feedback
|
|
157
|
-
* @korean 오류피드백
|
|
158
|
-
*/
|
|
131
|
+
/** Error/invalid action feedback @korean 오류피드백 */
|
|
159
132
|
error: () => triggerHapticPattern([
|
|
160
133
|
50,
|
|
161
134
|
50,
|
|
162
135
|
50
|
|
163
136
|
]),
|
|
164
|
-
/**
|
|
165
|
-
* Success/achievement feedback
|
|
166
|
-
* @korean 성공피드백
|
|
167
|
-
*/
|
|
137
|
+
/** Success/achievement feedback @korean 성공피드백 */
|
|
168
138
|
success: () => triggerHapticPattern([
|
|
169
139
|
30,
|
|
170
140
|
30,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hapticFeedback.js","names":[],"sources":["../../src/utils/hapticFeedback.ts"],"sourcesContent":["/**\n * Haptic feedback utilities for mobile touch interactions\n * \n * Provides vibration feedback for button presses and combat actions\n * with support for different intensity levels on iOS and Android.\n * \n * This module provides an enhanced haptic feedback API with typed intensity levels\n * and pattern support. For legacy compatibility with basic vibration patterns,\n * see src/utils/haptics.ts\n * \n * @module utils/hapticFeedback\n * @category Mobile Utilities\n * @korean 햅틱피드백유틸리티\n */\n\n/**\n * Haptic feedback intensity levels\n * \n * @category Haptic Feedback\n * @korean 햅틱강도\n */\nexport type HapticIntensity = \"light\" | \"medium\" | \"heavy\";\n\n/**\n * Haptic feedback pattern configuration\n * \n * @category Haptic Feedback\n * @korean 햅틱패턴설정\n */\ninterface HapticPattern {\n readonly duration: number; // Duration in milliseconds\n readonly pattern?: readonly number[]; // For Android pattern vibration\n}\n\n/**\n * Haptic patterns for different intensities\n * \n * @category Haptic Feedback\n * @korean 햅틱패턴\n */\nconst HAPTIC_PATTERNS: Record<HapticIntensity, HapticPattern> = {\n light: {\n duration: 10,\n pattern: [10],\n },\n medium: {\n duration: 50,\n pattern: [50],\n },\n heavy: {\n duration: 100,\n pattern: [100],\n },\n};\n\n/**\n * Check if haptic feedback is supported\n * \n * @returns Whether haptic feedback is available\n * \n * @example\n * ```typescript\n * if (isHapticSupported()) {\n * triggerHapticFeedback('medium');\n * }\n * ```\n * \n * @
|
|
1
|
+
{"version":3,"file":"hapticFeedback.js","names":[],"sources":["../../src/utils/hapticFeedback.ts"],"sourcesContent":["/**\n * Haptic feedback utilities for mobile touch interactions\n * \n * Provides vibration feedback for button presses and combat actions\n * with support for different intensity levels on iOS and Android.\n * \n * This module provides an enhanced haptic feedback API with typed intensity levels\n * and pattern support. For legacy compatibility with basic vibration patterns,\n * see src/utils/haptics.ts\n * \n * @module utils/hapticFeedback\n * @category Mobile Utilities\n * @korean 햅틱피드백유틸리티\n */\n\n/**\n * Haptic feedback intensity levels\n * \n * @category Haptic Feedback\n * @korean 햅틱강도\n */\nexport type HapticIntensity = \"light\" | \"medium\" | \"heavy\";\n\n/**\n * Haptic feedback pattern configuration\n * \n * @category Haptic Feedback\n * @korean 햅틱패턴설정\n */\ninterface HapticPattern {\n readonly duration: number; // Duration in milliseconds\n readonly pattern?: readonly number[]; // For Android pattern vibration\n}\n\n/**\n * Haptic patterns for different intensities\n * \n * @category Haptic Feedback\n * @korean 햅틱패턴\n */\nconst HAPTIC_PATTERNS: Record<HapticIntensity, HapticPattern> = {\n light: {\n duration: 10,\n pattern: [10],\n },\n medium: {\n duration: 50,\n pattern: [50],\n },\n heavy: {\n duration: 100,\n pattern: [100],\n },\n};\n\n/**\n * Check if haptic feedback is supported\n * \n * @returns Whether haptic feedback is available\n * \n * @example\n * ```typescript\n * if (isHapticSupported()) {\n * triggerHapticFeedback('medium');\n * }\n * ```\n * \n * @korean 햅틱지원여부\n */\nexport function isHapticSupported(): boolean {\n if (typeof navigator === \"undefined\") {\n return false;\n }\n \n // Check for modern vibrate API or webkit prefixed version\n const nav = navigator as Navigator & { webkitVibrate?: (pattern: number | number[]) => boolean };\n return \"vibrate\" in navigator || !!nav.webkitVibrate;\n}\n\n/**\n * Trigger haptic feedback with specified intensity\n * \n * @param intensity - Feedback intensity level\n * @returns Whether feedback was triggered successfully\n * \n * @example\n * ```typescript\n * // Light feedback for menu navigation\n * triggerHapticFeedback('light');\n * \n * // Medium feedback for button press\n * triggerHapticFeedback('medium');\n * \n * // Heavy feedback for critical hit\n * triggerHapticFeedback('heavy');\n * ```\n * \n * @korean 햅틱피드백트리거\n */\nexport function triggerHapticFeedback(intensity: HapticIntensity): boolean {\n if (!isHapticSupported()) {\n return false;\n }\n\n const pattern = HAPTIC_PATTERNS[intensity];\n\n try {\n // Try modern Vibration API\n if (\"vibrate\" in navigator) {\n return navigator.vibrate(pattern.duration);\n }\n\n // Try webkit prefixed version for older devices\n const nav = navigator as Navigator & { webkitVibrate?: (pattern: number | number[]) => boolean };\n if (nav.webkitVibrate) {\n return nav.webkitVibrate(pattern.duration);\n }\n } catch (error) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn(\"Haptic feedback failed:\", error);\n }\n }\n\n return false;\n}\n\n/**\n * Trigger custom haptic pattern\n * Useful for complex feedback sequences\n * \n * @param pattern - Array of vibration durations and pauses (ms)\n * @returns Whether pattern was triggered successfully\n * \n * @example\n * ```typescript\n * // Double tap feedback: vibrate 50ms, pause 50ms, vibrate 50ms\n * triggerHapticPattern([50, 50, 50]);\n * ```\n * \n * @korean 햅틱패턴트리거\n */\nexport function triggerHapticPattern(pattern: readonly number[]): boolean {\n if (!isHapticSupported()) {\n return false;\n }\n\n try {\n if (\"vibrate\" in navigator) {\n return navigator.vibrate(pattern as number[]);\n }\n\n // Try webkit prefixed version for older devices\n const nav = navigator as Navigator & { webkitVibrate?: (pattern: number | number[]) => boolean };\n if (nav.webkitVibrate) {\n return nav.webkitVibrate(pattern as number[]);\n }\n } catch (error) {\n console.warn(\"Haptic pattern failed:\", error);\n }\n\n return false;\n}\n\n/**\n * Haptic feedback for UI interactions\n * Pre-configured patterns for common UI elements\n * \n * @category Haptic Feedback\n * @korean UI햅틱피드백\n */\nexport const UIHaptics = {\n /** Button tap feedback @korean 버튼탭피드백 */\n buttonTap: () => triggerHapticFeedback(\"medium\"),\n /** Menu hover/navigation feedback @korean 메뉴호버피드백 */\n menuHover: () => triggerHapticFeedback(\"light\"),\n /** Stance change feedback @korean 자세변경피드백 */\n stanceChange: () => triggerHapticFeedback(\"light\"),\n /** Attack execution feedback @korean 공격실행피드백 */\n attackExecution: () => triggerHapticFeedback(\"medium\"),\n /** Critical hit feedback @korean 치명타피드백 */\n criticalHit: () => triggerHapticPattern([50, 30, 100]),\n /** Vital point strike feedback @korean 급소타격피드백 */\n vitalPointStrike: () => triggerHapticPattern([100, 50, 100, 50, 100]),\n /** Block/defend feedback @korean 방어피드백 */\n blockDefend: () => triggerHapticFeedback(\"medium\"),\n /** Error/invalid action feedback @korean 오류피드백 */\n error: () => triggerHapticPattern([50, 50, 50]),\n /** Success/achievement feedback @korean 성공피드백 */\n success: () => triggerHapticPattern([30, 30, 30, 30, 100]),\n} as const;\n\n/**\n * Combat haptic feedback manager\n * Provides context-aware haptic feedback for combat actions\n * \n * @category Haptic Feedback\n * @korean 전투햅틱피드백\n */\nexport const CombatHaptics = {\n /** Normal hit feedback @korean 일반타격피드백 */\n normalHit: () => triggerHapticFeedback(\"medium\"),\n /** Critical hit feedback with double pulse @korean 치명타피드백 */\n criticalHit: () => triggerHapticPattern([50, 30, 100]),\n /** Perfect strike feedback (triple pulse) @korean 완벽타격피드백 */\n perfectStrike: () => triggerHapticPattern([30, 30, 30, 30, 100]),\n /** Vital point strike feedback (intense pattern) @korean 급소타격피드백 */\n vitalPointHit: () => triggerHapticPattern([100, 50, 100, 50, 100]),\n /** Blocked attack feedback (sharp double pulse) @korean 방어성공피드백 */\n attackBlocked: () => triggerHapticPattern([30, 30, 30]),\n /** Miss feedback (quick light pulse) @korean 빗나감피드백 */\n attackMissed: () => triggerHapticFeedback(\"light\"),\n /** Counter-attack feedback (building intensity) @korean 반격피드백 */\n counterAttack: () => triggerHapticPattern([30, 20, 50, 20, 100]),\n /**\n * Combo hit feedback (rhythmic pattern)\n * @korean 콤보타격피드백\n */\n comboHit: (comboCount: number) => {\n const pattern = Array(Math.min(comboCount, 5))\n .fill(null)\n .flatMap(() => [30, 20]);\n pattern.push(50); // Final pulse\n return triggerHapticPattern(pattern);\n },\n /** Heavy damage taken feedback (long intense pulse) @korean 큰피해피드백 */\n heavyDamage: () => triggerHapticPattern([150, 50, 150]),\n /** Knockout feedback (dramatic pattern) @korean 녹다운피드백 */\n knockout: () => triggerHapticPattern([100, 50, 100, 50, 200]),\n} as const;\n\n/**\n * Training mode haptic feedback\n * Provides feedback for training exercises\n * \n * @category Haptic Feedback\n * @korean 훈련햅틱피드백\n */\nexport const TrainingHaptics = {\n /** Correct technique feedback @korean 정확한기술피드백 */\n correctTechnique: () => triggerHapticPattern([30, 30, 100]),\n /** Incorrect technique feedback @korean 부정확한기술피드백 */\n incorrectTechnique: () => triggerHapticPattern([50, 50, 50]),\n /** Target hit feedback @korean 표적명중피드백 */\n targetHit: () => triggerHapticFeedback(\"medium\"),\n /** Perfect timing feedback @korean 완벽한타이밍피드백 */\n perfectTiming: () => triggerHapticPattern([20, 20, 20, 20, 80]),\n /** New skill unlocked feedback @korean 새기술해금피드백 */\n skillUnlocked: () => triggerHapticPattern([50, 30, 50, 30, 50, 30, 150]),\n} as const;\n"],"mappings":";;;;;;;AAwCA,IAAM,kBAA0D;CAC9D,OAAO;EACL,UAAU;EACV,SAAS,CAAC,GAAG;EACd;CACD,QAAQ;EACN,UAAU;EACV,SAAS,CAAC,GAAG;EACd;CACD,OAAO;EACL,UAAU;EACV,SAAS,CAAC,IAAI;EACf;CACF;;;;;;;;;;;;;;;AAgBD,SAAgB,oBAA6B;CAC3C,IAAI,OAAO,cAAc,aACvB,OAAO;CAIT,MAAM,MAAM;CACZ,OAAO,aAAa,aAAa,CAAC,CAAC,IAAI;;;;;;;;;;;;;;;;;;;;;;AAuBzC,SAAgB,sBAAsB,WAAqC;CACzE,IAAI,CAAC,mBAAmB,EACtB,OAAO;CAGT,MAAM,UAAU,gBAAgB;CAEhC,IAAI;EAEF,IAAI,aAAa,WACf,OAAO,UAAU,QAAQ,QAAQ,SAAS;EAI5C,MAAM,MAAM;EACZ,IAAI,IAAI,eACN,OAAO,IAAI,cAAc,QAAQ,SAAS;UAErC,OAAO;EACd,IAAA,QAAA,IAAA,aAA6B,cAC3B,QAAQ,KAAK,2BAA2B,MAAM;;CAIlD,OAAO;;;;;;;;;;;;;;;;;AAkBT,SAAgB,qBAAqB,SAAqC;CACxE,IAAI,CAAC,mBAAmB,EACtB,OAAO;CAGT,IAAI;EACF,IAAI,aAAa,WACf,OAAO,UAAU,QAAQ,QAAoB;EAI/C,MAAM,MAAM;EACZ,IAAI,IAAI,eACN,OAAO,IAAI,cAAc,QAAoB;UAExC,OAAO;EACd,QAAQ,KAAK,0BAA0B,MAAM;;CAG/C,OAAO;;;;;;;;;AAUT,IAAa,YAAY;;CAEvB,iBAAiB,sBAAsB,SAAS;;CAEhD,iBAAiB,sBAAsB,QAAQ;;CAE/C,oBAAoB,sBAAsB,QAAQ;;CAElD,uBAAuB,sBAAsB,SAAS;;CAEtD,mBAAmB,qBAAqB;EAAC;EAAI;EAAI;EAAI,CAAC;;CAEtD,wBAAwB,qBAAqB;EAAC;EAAK;EAAI;EAAK;EAAI;EAAI,CAAC;;CAErE,mBAAmB,sBAAsB,SAAS;;CAElD,aAAa,qBAAqB;EAAC;EAAI;EAAI;EAAG,CAAC;;CAE/C,eAAe,qBAAqB;EAAC;EAAI;EAAI;EAAI;EAAI;EAAI,CAAC;CAC3D"}
|