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.
Files changed (746) hide show
  1. package/lib/audio/AudioManager.d.ts +26 -0
  2. package/lib/audio/AudioManager.d.ts.map +1 -1
  3. package/lib/audio/AudioManager.js +26 -0
  4. package/lib/audio/AudioManager.js.map +1 -1
  5. package/lib/audio/index.d.ts.map +1 -1
  6. package/lib/audio/index.js.map +1 -1
  7. package/lib/audio/types.d.ts +18 -2
  8. package/lib/audio/types.d.ts.map +1 -1
  9. package/lib/audio/types.js +1 -0
  10. package/lib/audio/types.js.map +1 -1
  11. package/lib/components/effects/WindParticles3D.d.ts.map +1 -1
  12. package/lib/components/index.d.ts.map +1 -1
  13. package/lib/components/index.js.map +1 -1
  14. package/lib/components/screens/combat/CombatScreen3D.d.ts.map +1 -1
  15. package/lib/components/screens/combat/CombatScreen3D.js.map +1 -1
  16. package/lib/components/screens/combat/components/controls/KeyboardHints.d.ts +0 -1
  17. package/lib/components/screens/combat/components/controls/KeyboardHints.d.ts.map +1 -1
  18. package/lib/components/screens/combat/components/controls/KeyboardHints.js +0 -1
  19. package/lib/components/screens/combat/components/controls/KeyboardHints.js.map +1 -1
  20. package/lib/components/screens/combat/components/controls/PauseMenu.d.ts.map +1 -1
  21. package/lib/components/screens/combat/components/controls/PauseMenu.js.map +1 -1
  22. package/lib/components/screens/combat/components/effects/ArterialSpray3D.d.ts.map +1 -1
  23. package/lib/components/screens/combat/components/effects/BloodDecals3D.d.ts.map +1 -1
  24. package/lib/components/screens/combat/components/effects/BloodDecals3D.js.map +1 -1
  25. package/lib/components/screens/combat/components/effects/BloodLossOverlayHtml.d.ts.map +1 -1
  26. package/lib/components/screens/combat/components/effects/BloodLossOverlayHtml.js.map +1 -1
  27. package/lib/components/screens/combat/components/effects/BloodParticles3D.d.ts.map +1 -1
  28. package/lib/components/screens/combat/components/effects/BloodParticles3D.js.map +1 -1
  29. package/lib/components/screens/combat/components/effects/BloodViscosity3D.d.ts.map +1 -1
  30. package/lib/components/screens/combat/components/effects/BloodViscosity3D.js.map +1 -1
  31. package/lib/components/screens/combat/components/effects/BoneCrackParticles3D.d.ts.map +1 -1
  32. package/lib/components/screens/combat/components/effects/CombatParticleEffects3D.d.ts.map +1 -1
  33. package/lib/components/screens/combat/components/effects/CombatParticleEffects3D.js.map +1 -1
  34. package/lib/components/screens/combat/components/effects/ConsciousnessBlur.d.ts.map +1 -1
  35. package/lib/components/screens/combat/components/effects/ConsciousnessBlur.js.map +1 -1
  36. package/lib/components/screens/combat/components/effects/DustClouds3D.d.ts.map +1 -1
  37. package/lib/components/screens/combat/components/effects/EarthCrackEffect3D.d.ts.map +1 -1
  38. package/lib/components/screens/combat/components/effects/EarthHealingEffect3D.d.ts.map +1 -1
  39. package/lib/components/screens/combat/components/effects/ImpactSparks3D.d.ts.map +1 -1
  40. package/lib/components/screens/combat/components/effects/InternalDamage3D.d.ts.map +1 -1
  41. package/lib/components/screens/combat/components/effects/InternalDamage3D.js.map +1 -1
  42. package/lib/components/screens/combat/components/effects/LiPrecisionTargetingOverlay.d.ts.map +1 -1
  43. package/lib/components/screens/combat/components/effects/NerveStrikeParticles3D.d.ts.map +1 -1
  44. package/lib/components/screens/combat/components/effects/PainVignette.d.ts.map +1 -1
  45. package/lib/components/screens/combat/components/effects/PainVignette.js.map +1 -1
  46. package/lib/components/screens/combat/components/effects/ParticleAudio3D.d.ts.map +1 -1
  47. package/lib/components/screens/combat/components/effects/ParticleAudio3D.js.map +1 -1
  48. package/lib/components/screens/combat/components/effects/TraumaOverlay3D.d.ts.map +1 -1
  49. package/lib/components/screens/combat/components/effects/TraumaOverlay3D.js.map +1 -1
  50. package/lib/components/screens/combat/components/effects/WaterRipple3D.d.ts.map +1 -1
  51. package/lib/components/screens/combat/components/effects/WaterWave3D.d.ts.map +1 -1
  52. package/lib/components/screens/combat/components/effects/index.d.ts.map +1 -1
  53. package/lib/components/screens/combat/components/feedback/MatchCountdown.d.ts.map +1 -1
  54. package/lib/components/screens/combat/components/feedback/MatchCountdown.js.map +1 -1
  55. package/lib/components/screens/combat/components/feedback/RoundAnnouncementOverlayHtml.d.ts.map +1 -1
  56. package/lib/components/screens/combat/components/feedback/RoundAnnouncementOverlayHtml.js.map +1 -1
  57. package/lib/components/screens/combat/components/feedback/RoundStartAnnouncementOverlayHtml.d.ts.map +1 -1
  58. package/lib/components/screens/combat/components/feedback/RoundStartAnnouncementOverlayHtml.js.map +1 -1
  59. package/lib/components/screens/combat/components/hud/CombatBottomHUD.d.ts.map +1 -1
  60. package/lib/components/screens/combat/components/hud/CombatBottomHUD.js.map +1 -1
  61. package/lib/components/screens/combat/components/hud/CombatLeftHUD.d.ts.map +1 -1
  62. package/lib/components/screens/combat/components/hud/CombatLeftHUD.js.map +1 -1
  63. package/lib/components/screens/combat/components/hud/CombatPortraitStatusStrip.d.ts.map +1 -1
  64. package/lib/components/screens/combat/components/hud/CombatPortraitStatusStrip.js.map +1 -1
  65. package/lib/components/screens/combat/components/hud/CombatRightHUD.d.ts.map +1 -1
  66. package/lib/components/screens/combat/components/hud/CombatRightHUD.js.map +1 -1
  67. package/lib/components/screens/combat/components/hud/CombatTopHUD.d.ts.map +1 -1
  68. package/lib/components/screens/combat/components/hud/CombatTopHUD.js.map +1 -1
  69. package/lib/components/screens/combat/components/hud/DifficultyIndicator.d.ts.map +1 -1
  70. package/lib/components/screens/combat/components/hud/DifficultyIndicator.js.map +1 -1
  71. package/lib/components/screens/combat/components/hud/FPSMonitor.d.ts.map +1 -1
  72. package/lib/components/screens/combat/components/hud/FPSMonitor.js.map +1 -1
  73. package/lib/components/screens/combat/components/hud/PlayerStateOverlayHtml.d.ts.map +1 -1
  74. package/lib/components/screens/combat/components/hud/PlayerStateOverlayHtml.js.map +1 -1
  75. package/lib/components/screens/combat/components/indicators/BalanceIndicator.d.ts.map +1 -1
  76. package/lib/components/screens/combat/components/indicators/BalanceIndicator.js.map +1 -1
  77. package/lib/components/screens/combat/components/indicators/InputBufferDisplay.d.ts +0 -1
  78. package/lib/components/screens/combat/components/indicators/InputBufferDisplay.d.ts.map +1 -1
  79. package/lib/components/screens/combat/components/indicators/InputBufferDisplay.js +0 -1
  80. package/lib/components/screens/combat/components/indicators/InputBufferDisplay.js.map +1 -1
  81. package/lib/components/screens/combat/components/indicators/StaminaWarning.d.ts.map +1 -1
  82. package/lib/components/screens/combat/components/indicators/StaminaWarning.js.map +1 -1
  83. package/lib/components/screens/combat/components/indicators/TechniqueNameDisplay.d.ts +0 -2
  84. package/lib/components/screens/combat/components/indicators/TechniqueNameDisplay.d.ts.map +1 -1
  85. package/lib/components/screens/combat/components/indicators/TechniqueNameDisplay.js +0 -1
  86. package/lib/components/screens/combat/components/indicators/TechniqueNameDisplay.js.map +1 -1
  87. package/lib/components/screens/combat/helpers/AnimationUpdater.d.ts.map +1 -1
  88. package/lib/components/screens/combat/helpers/AnimationUpdater.js.map +1 -1
  89. package/lib/components/screens/combat/helpers/combatHelpers.d.ts.map +1 -1
  90. package/lib/components/screens/combat/helpers/combatHelpers.js.map +1 -1
  91. package/lib/components/screens/combat/hooks/useAICombat.d.ts.map +1 -1
  92. package/lib/components/screens/combat/hooks/useAICombat.js.map +1 -1
  93. package/lib/components/screens/combat/hooks/useCombatActions.d.ts.map +1 -1
  94. package/lib/components/screens/combat/hooks/useCombatActions.js.map +1 -1
  95. package/lib/components/screens/combat/hooks/useCombatAttackMovement.d.ts.map +1 -1
  96. package/lib/components/screens/combat/hooks/useCombatAttackMovement.js.map +1 -1
  97. package/lib/components/screens/combat/hooks/useCombatAudio.d.ts.map +1 -1
  98. package/lib/components/screens/combat/hooks/useCombatAudio.js.map +1 -1
  99. package/lib/components/screens/combat/hooks/useCombatLayout.d.ts.map +1 -1
  100. package/lib/components/screens/combat/hooks/useCombatLayout.js.map +1 -1
  101. package/lib/components/screens/combat/hooks/useCombatState.d.ts.map +1 -1
  102. package/lib/components/screens/combat/hooks/useCombatState.js.map +1 -1
  103. package/lib/components/screens/combat/hooks/useGrapplingAudio.d.ts.map +1 -1
  104. package/lib/components/screens/combat/hooks/usePreloadCombatAudio.d.ts.map +1 -1
  105. package/lib/components/screens/controls/ControlsScreen3D.d.ts.map +1 -1
  106. package/lib/components/screens/controls/ControlsScreen3D.js.map +1 -1
  107. package/lib/components/screens/controls/components/ControlBindingsOverlayHtml.d.ts.map +1 -1
  108. package/lib/components/screens/controls/components/ControlBindingsOverlayHtml.js.map +1 -1
  109. package/lib/components/screens/controls/components/GamepadVisualization3D.d.ts.map +1 -1
  110. package/lib/components/screens/controls/components/GamepadVisualization3D.js.map +1 -1
  111. package/lib/components/screens/controls/components/InteractiveControlDemoOverlayHtml.d.ts.map +1 -1
  112. package/lib/components/screens/controls/components/InteractiveControlDemoOverlayHtml.js.map +1 -1
  113. package/lib/components/screens/controls/components/Key3D.d.ts.map +1 -1
  114. package/lib/components/screens/controls/components/Key3D.js.map +1 -1
  115. package/lib/components/screens/controls/components/VisualKeyboard3D.d.ts.map +1 -1
  116. package/lib/components/screens/controls/components/VisualKeyboard3D.js.map +1 -1
  117. package/lib/components/screens/controls/constants/ControlsConstants.d.ts.map +1 -1
  118. package/lib/components/screens/controls/constants/ControlsConstants.js.map +1 -1
  119. package/lib/components/screens/controls/hooks/useControlsState.d.ts.map +1 -1
  120. package/lib/components/screens/controls/hooks/useControlsState.js.map +1 -1
  121. package/lib/components/screens/endscreen/EndScreen3D.d.ts.map +1 -1
  122. package/lib/components/screens/endscreen/EndScreen3D.js.map +1 -1
  123. package/lib/components/screens/endscreen/components/DefeatAnimation3D.d.ts.map +1 -1
  124. package/lib/components/screens/endscreen/components/DefeatAnimation3D.js.map +1 -1
  125. package/lib/components/screens/endscreen/components/NavigationButtonsOverlayHtml.d.ts.map +1 -1
  126. package/lib/components/screens/endscreen/components/NavigationButtonsOverlayHtml.js.map +1 -1
  127. package/lib/components/screens/endscreen/components/PerformanceBreakdownOverlayHtml.d.ts.map +1 -1
  128. package/lib/components/screens/endscreen/components/PerformanceBreakdownOverlayHtml.js.map +1 -1
  129. package/lib/components/screens/endscreen/components/PerformanceRatingOverlayHtml.d.ts.map +1 -1
  130. package/lib/components/screens/endscreen/components/PerformanceRatingOverlayHtml.js.map +1 -1
  131. package/lib/components/screens/endscreen/components/VictoryAnimation3D.d.ts.map +1 -1
  132. package/lib/components/screens/endscreen/components/VictoryAnimation3D.js.map +1 -1
  133. package/lib/components/screens/endscreen/components/WinnerDisplayOverlayHtml.d.ts.map +1 -1
  134. package/lib/components/screens/endscreen/components/WinnerDisplayOverlayHtml.js.map +1 -1
  135. package/lib/components/screens/endscreen/components/index.d.ts.map +1 -1
  136. package/lib/components/screens/endscreen/index.d.ts.map +1 -1
  137. package/lib/components/screens/intro/IntroScreen3D.d.ts.map +1 -1
  138. package/lib/components/screens/intro/IntroScreen3D.js +1 -1
  139. package/lib/components/screens/intro/IntroScreen3D.js.map +1 -1
  140. package/lib/components/screens/intro/components/AbilityListOverlayHtml.d.ts.map +1 -1
  141. package/lib/components/screens/intro/components/AbilityListOverlayHtml.js.map +1 -1
  142. package/lib/components/screens/intro/components/ArchetypeCardGridOverlayHtml.d.ts.map +1 -1
  143. package/lib/components/screens/intro/components/ArchetypeCardGridOverlayHtml.js.map +1 -1
  144. package/lib/components/screens/intro/components/ArchetypeCardOverlayHtml.d.ts.map +1 -1
  145. package/lib/components/screens/intro/components/ArchetypeCardOverlayHtml.js.map +1 -1
  146. package/lib/components/screens/intro/components/ArchetypeDisplayOverlayHtml.d.ts.map +1 -1
  147. package/lib/components/screens/intro/components/ArchetypeDisplayOverlayHtml.js.map +1 -1
  148. package/lib/components/screens/intro/components/EnhancedArchetypeDisplayOverlayHtml.d.ts.map +1 -1
  149. package/lib/components/screens/intro/components/EnhancedArchetypeDisplayOverlayHtml.js.map +1 -1
  150. package/lib/components/screens/intro/components/MenuButtonsOverlayHtml.d.ts.map +1 -1
  151. package/lib/components/screens/intro/components/MenuButtonsOverlayHtml.js.map +1 -1
  152. package/lib/components/screens/intro/components/MenuSectionOverlayHtml.d.ts.map +1 -1
  153. package/lib/components/screens/intro/components/MenuSectionOverlayHtml.js.map +1 -1
  154. package/lib/components/screens/intro/components/StatBarOverlayHtml.d.ts.map +1 -1
  155. package/lib/components/screens/intro/components/StatBarOverlayHtml.js.map +1 -1
  156. package/lib/components/screens/philosophy/PhilosophyScreen3D.d.ts.map +1 -1
  157. package/lib/components/screens/philosophy/PhilosophyScreen3D.js.map +1 -1
  158. package/lib/components/screens/philosophy/components/InteractiveTrigramGridOverlayHtml.d.ts +0 -1
  159. package/lib/components/screens/philosophy/components/InteractiveTrigramGridOverlayHtml.d.ts.map +1 -1
  160. package/lib/components/screens/philosophy/components/PhilosophyNavigationOverlayHtml.d.ts +0 -1
  161. package/lib/components/screens/philosophy/components/PhilosophyNavigationOverlayHtml.d.ts.map +1 -1
  162. package/lib/components/screens/philosophy/components/PhilosophySectionOverlayHtml.d.ts +0 -1
  163. package/lib/components/screens/philosophy/components/PhilosophySectionOverlayHtml.d.ts.map +1 -1
  164. package/lib/components/screens/philosophy/components/PhilosophyTextOverlayHtml.d.ts +0 -1
  165. package/lib/components/screens/philosophy/components/PhilosophyTextOverlayHtml.d.ts.map +1 -1
  166. package/lib/components/screens/philosophy/components/TrigramSymbol3D.d.ts +0 -1
  167. package/lib/components/screens/philosophy/components/TrigramSymbol3D.d.ts.map +1 -1
  168. package/lib/components/screens/philosophy/components/TrigramVisualization3D.d.ts +0 -1
  169. package/lib/components/screens/philosophy/components/TrigramVisualization3D.d.ts.map +1 -1
  170. package/lib/components/screens/philosophy/hooks/usePhilosophyState.d.ts +0 -1
  171. package/lib/components/screens/philosophy/hooks/usePhilosophyState.d.ts.map +1 -1
  172. package/lib/components/screens/training/TrainingScreen3D.d.ts.map +1 -1
  173. package/lib/components/screens/training/TrainingScreen3D.js.map +1 -1
  174. package/lib/components/screens/training/components/AnatomyControlsOverlayHtml.d.ts.map +1 -1
  175. package/lib/components/screens/training/components/AnatomyControlsOverlayHtml.js.map +1 -1
  176. package/lib/components/screens/training/components/AnatomyOverlay3D.d.ts.map +1 -1
  177. package/lib/components/screens/training/components/AnatomyOverlay3D.js.map +1 -1
  178. package/lib/components/screens/training/components/DamageNumber3D.d.ts.map +1 -1
  179. package/lib/components/screens/training/components/FootPlacementMarkers3D.d.ts.map +1 -1
  180. package/lib/components/screens/training/components/FootPlacementMarkers3D.js.map +1 -1
  181. package/lib/components/screens/training/components/FootworkDrillsOverlayHtml.d.ts.map +1 -1
  182. package/lib/components/screens/training/components/FootworkDrillsOverlayHtml.js.map +1 -1
  183. package/lib/components/screens/training/components/HitFeedbackEffect3D.d.ts.map +1 -1
  184. package/lib/components/screens/training/components/HitFeedbackEffect3D.js.map +1 -1
  185. package/lib/components/screens/training/components/TrainingAICharacter3D.d.ts.map +1 -1
  186. package/lib/components/screens/training/components/TrainingArena3D.d.ts.map +1 -1
  187. package/lib/components/screens/training/components/TrainingControlsOverlayHtml.d.ts.map +1 -1
  188. package/lib/components/screens/training/components/TrainingControlsOverlayHtml.js.map +1 -1
  189. package/lib/components/screens/training/components/TrainingDummy3D.d.ts.map +1 -1
  190. package/lib/components/screens/training/components/TrainingDummy3D.js.map +1 -1
  191. package/lib/components/screens/training/components/TrainingFeedbackOverlayHtml.d.ts.map +1 -1
  192. package/lib/components/screens/training/components/TrainingFeedbackOverlayHtml.js.map +1 -1
  193. package/lib/components/screens/training/components/TrainingHitEffects3D.d.ts.map +1 -1
  194. package/lib/components/screens/training/components/TrainingModeSelectorOverlayHtml.d.ts.map +1 -1
  195. package/lib/components/screens/training/components/TrainingModeSelectorOverlayHtml.js.map +1 -1
  196. package/lib/components/screens/training/components/TrainingStatsOverlayHtml.d.ts.map +1 -1
  197. package/lib/components/screens/training/components/TrainingStatsOverlayHtml.js.map +1 -1
  198. package/lib/components/screens/training/components/VitalPointMarker3D.d.ts.map +1 -1
  199. package/lib/components/screens/training/components/VitalPointMarker3D.js.map +1 -1
  200. package/lib/components/screens/training/components/VitalPointTrainingOverlayHtml.d.ts.map +1 -1
  201. package/lib/components/screens/training/components/VitalPointTrainingOverlayHtml.js.map +1 -1
  202. package/lib/components/screens/training/components/hud/TrainingBottomHUD.d.ts.map +1 -1
  203. package/lib/components/screens/training/components/hud/TrainingBottomHUD.js.map +1 -1
  204. package/lib/components/screens/training/components/hud/TrainingLeftHUD.d.ts.map +1 -1
  205. package/lib/components/screens/training/components/hud/TrainingLeftHUD.js.map +1 -1
  206. package/lib/components/screens/training/components/hud/TrainingRightHUD.d.ts.map +1 -1
  207. package/lib/components/screens/training/components/hud/TrainingRightHUD.js.map +1 -1
  208. package/lib/components/screens/training/components/hud/TrainingTopHUD.d.ts.map +1 -1
  209. package/lib/components/screens/training/components/hud/TrainingTopHUD.js.map +1 -1
  210. package/lib/components/screens/training/components/index.d.ts.map +1 -1
  211. package/lib/components/screens/training/hooks/useAttackMovement.d.ts.map +1 -1
  212. package/lib/components/screens/training/hooks/useAttackMovement.js.map +1 -1
  213. package/lib/components/screens/training/hooks/useTrainingActions.d.ts.map +1 -1
  214. package/lib/components/screens/training/hooks/useTrainingActions.js.map +1 -1
  215. package/lib/components/screens/training/hooks/useTrainingLayout.d.ts.map +1 -1
  216. package/lib/components/screens/training/hooks/useTrainingLayout.js.map +1 -1
  217. package/lib/components/screens/training/hooks/useTrainingState.d.ts.map +1 -1
  218. package/lib/components/screens/training/hooks/useTrainingState.js.map +1 -1
  219. package/lib/components/shared/base/AccessibilityProvider.d.ts.map +1 -1
  220. package/lib/components/shared/base/BaseButton.d.ts.map +1 -1
  221. package/lib/components/shared/base/BaseButton.js.map +1 -1
  222. package/lib/components/shared/base/BaseButtonOverlayHtml.d.ts.map +1 -1
  223. package/lib/components/shared/base/BaseButtonOverlayHtml.js.map +1 -1
  224. package/lib/components/shared/base/BasePanel.d.ts.map +1 -1
  225. package/lib/components/shared/base/BasePanel.js.map +1 -1
  226. package/lib/components/shared/base/BaseText.d.ts.map +1 -1
  227. package/lib/components/shared/base/BaseText.js.map +1 -1
  228. package/lib/components/shared/base/ResponsiveContainer.d.ts.map +1 -1
  229. package/lib/components/shared/base/index.d.ts.map +1 -1
  230. package/lib/components/shared/base/useKoreanTheme.d.ts.map +1 -1
  231. package/lib/components/shared/base/useKoreanTheme.js.map +1 -1
  232. package/lib/components/shared/debug/PerformanceDebugOverlayHtml.d.ts.map +1 -1
  233. package/lib/components/shared/debug/PerformanceDebugOverlayHtml.js.map +1 -1
  234. package/lib/components/shared/effects/ScreenFlash.d.ts.map +1 -1
  235. package/lib/components/shared/mobile/ActionButtons.d.ts.map +1 -1
  236. package/lib/components/shared/mobile/ActionButtons.js +0 -1
  237. package/lib/components/shared/mobile/ActionButtons.js.map +1 -1
  238. package/lib/components/shared/mobile/GestureRecognizerPure.d.ts +0 -1
  239. package/lib/components/shared/mobile/GestureRecognizerPure.d.ts.map +1 -1
  240. package/lib/components/shared/mobile/GestureRecognizerPure.js +0 -1
  241. package/lib/components/shared/mobile/GestureRecognizerPure.js.map +1 -1
  242. package/lib/components/shared/mobile/HapticController.d.ts +0 -13
  243. package/lib/components/shared/mobile/HapticController.d.ts.map +1 -1
  244. package/lib/components/shared/mobile/HapticController.js +0 -10
  245. package/lib/components/shared/mobile/HapticController.js.map +1 -1
  246. package/lib/components/shared/mobile/MobileControlsPure.d.ts.map +1 -1
  247. package/lib/components/shared/mobile/MobileControlsPure.js.map +1 -1
  248. package/lib/components/shared/mobile/PerformanceMonitor.d.ts +0 -15
  249. package/lib/components/shared/mobile/PerformanceMonitor.d.ts.map +1 -1
  250. package/lib/components/shared/mobile/StanceWheelPure.d.ts +0 -1
  251. package/lib/components/shared/mobile/StanceWheelPure.d.ts.map +1 -1
  252. package/lib/components/shared/mobile/StanceWheelPure.js +0 -1
  253. package/lib/components/shared/mobile/StanceWheelPure.js.map +1 -1
  254. package/lib/components/shared/mobile/TouchOptimizer.d.ts +0 -4
  255. package/lib/components/shared/mobile/TouchOptimizer.d.ts.map +1 -1
  256. package/lib/components/shared/mobile/TouchOptimizer.js +0 -3
  257. package/lib/components/shared/mobile/TouchOptimizer.js.map +1 -1
  258. package/lib/components/shared/mobile/VirtualDPad.d.ts.map +1 -1
  259. package/lib/components/shared/mobile/VirtualDPad.js +0 -1
  260. package/lib/components/shared/mobile/VirtualDPad.js.map +1 -1
  261. package/lib/components/shared/mobile/index.d.ts.map +1 -1
  262. package/lib/components/shared/three/anatomy/BodySurface.d.ts.map +1 -1
  263. package/lib/components/shared/three/anatomy/BodySurface.js.map +1 -1
  264. package/lib/components/shared/three/anatomy/BoneAttachedMuscles.d.ts.map +1 -1
  265. package/lib/components/shared/three/anatomy/BoneAttachedMuscles.js.map +1 -1
  266. package/lib/components/shared/three/anatomy/BoneClothing.d.ts.map +1 -1
  267. package/lib/components/shared/three/anatomy/BoneClothing.js.map +1 -1
  268. package/lib/components/shared/three/anatomy/BoneRenderer.d.ts +0 -1
  269. package/lib/components/shared/three/anatomy/BoneRenderer.d.ts.map +1 -1
  270. package/lib/components/shared/three/anatomy/BoneRenderer.js.map +1 -1
  271. package/lib/components/shared/three/anatomy/Face3D.d.ts.map +1 -1
  272. package/lib/components/shared/three/anatomy/Face3D.js.map +1 -1
  273. package/lib/components/shared/three/anatomy/Foot3D.d.ts +0 -1
  274. package/lib/components/shared/three/anatomy/Foot3D.d.ts.map +1 -1
  275. package/lib/components/shared/three/anatomy/Foot3D.js.map +1 -1
  276. package/lib/components/shared/three/anatomy/Hand3D.d.ts +0 -1
  277. package/lib/components/shared/three/anatomy/Hand3D.d.ts.map +1 -1
  278. package/lib/components/shared/three/anatomy/Hand3D.js.map +1 -1
  279. package/lib/components/shared/three/effects/ActionFeedback.d.ts.map +1 -1
  280. package/lib/components/shared/three/effects/ActionFeedback.js.map +1 -1
  281. package/lib/components/shared/three/effects/DamageNumbers.d.ts.map +1 -1
  282. package/lib/components/shared/three/effects/DamageNumbers.js.map +1 -1
  283. package/lib/components/shared/three/effects/ExplosiveBurstEffect3D.d.ts.map +1 -1
  284. package/lib/components/shared/three/effects/GrapplingIndicator3D.d.ts.map +1 -1
  285. package/lib/components/shared/three/effects/HitEffects3D.d.ts.map +1 -1
  286. package/lib/components/shared/three/effects/HitEffects3D.js.map +1 -1
  287. package/lib/components/shared/three/effects/LimbExposureIndicator3D.d.ts.map +1 -1
  288. package/lib/components/shared/three/effects/NerveDisruptionEffect3D.d.ts.map +1 -1
  289. package/lib/components/shared/three/effects/PlayerStateIndicators.d.ts.map +1 -1
  290. package/lib/components/shared/three/effects/PlayerStateIndicators.js.map +1 -1
  291. package/lib/components/shared/three/effects/StanceSymbol3D.d.ts.map +1 -1
  292. package/lib/components/shared/three/effects/StanceSymbol3D.js.map +1 -1
  293. package/lib/components/shared/three/effects/StanceTransitionEffect.d.ts.map +1 -1
  294. package/lib/components/shared/three/effects/StanceTransitionEffect.js.map +1 -1
  295. package/lib/components/shared/three/effects/ThunderEffect3D.d.ts.map +1 -1
  296. package/lib/components/shared/three/effects/VitalPointMarkers3D.d.ts.map +1 -1
  297. package/lib/components/shared/three/effects/VitalPointMarkers3D.js.map +1 -1
  298. package/lib/components/shared/three/index.d.ts.map +1 -1
  299. package/lib/components/shared/three/indicators/ElementalColorSystem.d.ts +0 -6
  300. package/lib/components/shared/three/indicators/ElementalColorSystem.d.ts.map +1 -1
  301. package/lib/components/shared/three/indicators/ElementalColorSystem.js +0 -4
  302. package/lib/components/shared/three/indicators/ElementalColorSystem.js.map +1 -1
  303. package/lib/components/shared/three/indicators/GuardIndicator.d.ts +0 -1
  304. package/lib/components/shared/three/indicators/GuardIndicator.d.ts.map +1 -1
  305. package/lib/components/shared/three/indicators/GuardIndicator.js +0 -1
  306. package/lib/components/shared/three/indicators/GuardIndicator.js.map +1 -1
  307. package/lib/components/shared/three/indicators/HapticFeedback.d.ts +0 -7
  308. package/lib/components/shared/three/indicators/HapticFeedback.d.ts.map +1 -1
  309. package/lib/components/shared/three/indicators/HapticFeedback.js +0 -2
  310. package/lib/components/shared/three/indicators/HapticFeedback.js.map +1 -1
  311. package/lib/components/shared/three/indicators/StanceChangeIndicator.d.ts +0 -1
  312. package/lib/components/shared/three/indicators/StanceChangeIndicator.d.ts.map +1 -1
  313. package/lib/components/shared/three/indicators/StanceChangeIndicator.js +0 -1
  314. package/lib/components/shared/three/indicators/StanceChangeIndicator.js.map +1 -1
  315. package/lib/components/shared/three/indicators/TrigramSymbol3D.d.ts +0 -1
  316. package/lib/components/shared/three/indicators/TrigramSymbol3D.d.ts.map +1 -1
  317. package/lib/components/shared/three/models/Player3DWithTransitions.d.ts.map +1 -1
  318. package/lib/components/shared/three/models/Player3DWithTransitions.js.map +1 -1
  319. package/lib/components/shared/three/models/SkeletalPlayer3D.d.ts.map +1 -1
  320. package/lib/components/shared/three/models/SkeletalPlayer3D.js.map +1 -1
  321. package/lib/components/shared/three/optimization/AdaptiveQuality.d.ts.map +1 -1
  322. package/lib/components/shared/three/optimization/AdaptiveQuality.js.map +1 -1
  323. package/lib/components/shared/three/optimization/InstancedGeometry.d.ts.map +1 -1
  324. package/lib/components/shared/three/optimization/LODSystem.d.ts.map +1 -1
  325. package/lib/components/shared/three/scene/AtmosphericParticles3D.d.ts.map +1 -1
  326. package/lib/components/shared/three/scene/AtmosphericParticles3D.js.map +1 -1
  327. package/lib/components/shared/three/scene/BackgroundScene3D.d.ts.map +1 -1
  328. package/lib/components/shared/three/scene/BackgroundScene3D.js.map +1 -1
  329. package/lib/components/shared/three/scene/CombatArena3D.d.ts.map +1 -1
  330. package/lib/components/shared/three/scene/CombatArena3D.js.map +1 -1
  331. package/lib/components/shared/three/scene/DebugCollision.d.ts +0 -2
  332. package/lib/components/shared/three/scene/DebugCollision.d.ts.map +1 -1
  333. package/lib/components/shared/three/scene/KoreanSignage3D.d.ts.map +1 -1
  334. package/lib/components/shared/three/scene/KoreanSignage3D.js.map +1 -1
  335. package/lib/components/shared/three/ui/ArchetypeCard.d.ts.map +1 -1
  336. package/lib/components/shared/three/ui/ArchetypeCard.js.map +1 -1
  337. package/lib/components/shared/three/ui/BodyPartHealthDisplay.d.ts.map +1 -1
  338. package/lib/components/shared/three/ui/BodyPartHealthDisplay.js.map +1 -1
  339. package/lib/components/shared/three/ui/BreathingIndicator.d.ts.map +1 -1
  340. package/lib/components/shared/three/ui/BreathingIndicator2.js.map +1 -1
  341. package/lib/components/shared/three/ui/CombatReadinessBar.d.ts.map +1 -1
  342. package/lib/components/shared/three/ui/CombatReadinessBar.js.map +1 -1
  343. package/lib/components/shared/three/ui/ComboCounter.d.ts.map +1 -1
  344. package/lib/components/shared/three/ui/ComboCounter.js.map +1 -1
  345. package/lib/components/shared/three/ui/HealthBar.d.ts.map +1 -1
  346. package/lib/components/shared/three/ui/HealthBar.js.map +1 -1
  347. package/lib/components/shared/three/ui/KoreanButton.d.ts.map +1 -1
  348. package/lib/components/shared/three/ui/KoreanButton.js.map +1 -1
  349. package/lib/components/shared/three/ui/KoreanPanel.d.ts.map +1 -1
  350. package/lib/components/shared/three/ui/KoreanPanel.js.map +1 -1
  351. package/lib/components/shared/three/ui/KoreanText.d.ts.map +1 -1
  352. package/lib/components/shared/three/ui/KoreanText.js.map +1 -1
  353. package/lib/components/shared/three/ui/MenuList.d.ts.map +1 -1
  354. package/lib/components/shared/three/ui/MenuList.js.map +1 -1
  355. package/lib/components/shared/three/ui/PlayerHUD.d.ts.map +1 -1
  356. package/lib/components/shared/three/ui/PlayerHUD.js.map +1 -1
  357. package/lib/components/shared/three/ui/ProgressBar.d.ts.map +1 -1
  358. package/lib/components/shared/three/ui/ProgressBar.js.map +1 -1
  359. package/lib/components/shared/three/ui/SpeedIndicatorHUD.d.ts +0 -1
  360. package/lib/components/shared/three/ui/SpeedIndicatorHUD.d.ts.map +1 -1
  361. package/lib/components/shared/three/ui/SpeedIndicatorHUD.js +0 -1
  362. package/lib/components/shared/three/ui/SpeedIndicatorHUD.js.map +1 -1
  363. package/lib/components/shared/three/ui/StaminaBar.d.ts.map +1 -1
  364. package/lib/components/shared/three/ui/StaminaBar.js.map +1 -1
  365. package/lib/components/shared/three/ui/TechniqueBar.d.ts.map +1 -1
  366. package/lib/components/shared/three/ui/TechniqueBar.js.map +1 -1
  367. package/lib/components/shared/three/ui/TechniqueBarContainer.d.ts.map +1 -1
  368. package/lib/components/shared/three/ui/TechniqueCard.d.ts.map +1 -1
  369. package/lib/components/shared/three/ui/TechniqueCard.js.map +1 -1
  370. package/lib/components/shared/three/ui/VitalPointOverlayControlsHtml.d.ts.map +1 -1
  371. package/lib/components/shared/three/ui/VitalPointOverlayControlsHtml.js.map +1 -1
  372. package/lib/components/shared/three/ui/VulnerabilityWindowHUD.d.ts.map +1 -1
  373. package/lib/components/shared/ui/BaseHUDContainer.d.ts.map +1 -1
  374. package/lib/components/shared/ui/BaseHUDContainer.js.map +1 -1
  375. package/lib/components/shared/ui/CombatTimer.d.ts.map +1 -1
  376. package/lib/components/shared/ui/CombatTimer.js.map +1 -1
  377. package/lib/components/shared/ui/ErrorBoundary.d.ts.map +1 -1
  378. package/lib/components/shared/ui/ErrorModal.d.ts.map +1 -1
  379. package/lib/components/shared/ui/ErrorModal.js.map +1 -1
  380. package/lib/components/shared/ui/HUDSection.d.ts.map +1 -1
  381. package/lib/components/shared/ui/LoadingState.d.ts.map +1 -1
  382. package/lib/components/shared/ui/LoadingState.js.map +1 -1
  383. package/lib/components/shared/ui/MobileHUDLayout.d.ts +0 -1
  384. package/lib/components/shared/ui/MobileHUDLayout.d.ts.map +1 -1
  385. package/lib/components/shared/ui/ResponsiveContainer.d.ts +0 -1
  386. package/lib/components/shared/ui/ResponsiveContainer.d.ts.map +1 -1
  387. package/lib/components/shared/ui/SplashScreen.d.ts.map +1 -1
  388. package/lib/components/shared/ui/SplashScreen.js +2 -2
  389. package/lib/components/shared/ui/SplashScreen.js.map +1 -1
  390. package/lib/components/shared/ui/StyledHUDPanel.d.ts.map +1 -1
  391. package/lib/components/shared/ui/VitalPointOverlayControlsPure.d.ts.map +1 -1
  392. package/lib/components/shared/ui/VitalPointOverlayControlsPure.js.map +1 -1
  393. package/lib/components/shared/ui/VolumeControl.d.ts.map +1 -1
  394. package/lib/components/shared/ui/VolumeControl.js.map +1 -1
  395. package/lib/components/shared/ui/shared/ConfirmDialog.d.ts.map +1 -1
  396. package/lib/components/shared/ui/shared/ConfirmDialog.js.map +1 -1
  397. package/lib/components/test/Hello3D.d.ts.map +1 -1
  398. package/lib/components/ui/combat/BalanceIndicatorOverlayHtml.d.ts.map +1 -1
  399. package/lib/components/ui/combat/BalanceIndicatorOverlayHtml.js.map +1 -1
  400. package/lib/components/ui/combat/ComboCounter.d.ts.map +1 -1
  401. package/lib/components/ui/combat/PressureMeter.d.ts.map +1 -1
  402. package/lib/systems/CombatSystem.d.ts +0 -6
  403. package/lib/systems/CombatSystem.d.ts.map +1 -1
  404. package/lib/systems/CombatSystem.js +0 -6
  405. package/lib/systems/CombatSystem.js.map +1 -1
  406. package/lib/systems/EffectCalculator.d.ts +0 -7
  407. package/lib/systems/EffectCalculator.d.ts.map +1 -1
  408. package/lib/systems/EffectCalculator.js +0 -4
  409. package/lib/systems/EffectCalculator.js.map +1 -1
  410. package/lib/systems/LayoutSystem.d.ts +0 -1
  411. package/lib/systems/LayoutSystem.d.ts.map +1 -1
  412. package/lib/systems/LayoutSystem.js +0 -1
  413. package/lib/systems/LayoutSystem.js.map +1 -1
  414. package/lib/systems/PlayerEffectManager.d.ts +0 -10
  415. package/lib/systems/PlayerEffectManager.d.ts.map +1 -1
  416. package/lib/systems/PlayerEffectManager.js +0 -3
  417. package/lib/systems/PlayerEffectManager.js.map +1 -1
  418. package/lib/systems/ResponsiveScaling.d.ts +0 -12
  419. package/lib/systems/ResponsiveScaling.d.ts.map +1 -1
  420. package/lib/systems/ResponsiveScaling.js +0 -12
  421. package/lib/systems/ResponsiveScaling.js.map +1 -1
  422. package/lib/systems/TrigramSystem.d.ts +0 -13
  423. package/lib/systems/TrigramSystem.d.ts.map +1 -1
  424. package/lib/systems/TrigramSystem.js +0 -13
  425. package/lib/systems/TrigramSystem.js.map +1 -1
  426. package/lib/systems/VitalPointSystem.d.ts +0 -10
  427. package/lib/systems/VitalPointSystem.d.ts.map +1 -1
  428. package/lib/systems/VitalPointSystem.js +0 -10
  429. package/lib/systems/VitalPointSystem.js.map +1 -1
  430. package/lib/systems/animation/builders/KeyframeInterpolation.d.ts +0 -4
  431. package/lib/systems/animation/builders/KeyframeInterpolation.d.ts.map +1 -1
  432. package/lib/systems/animation/builders/KeyframeInterpolation.js +0 -1
  433. package/lib/systems/animation/builders/KeyframeInterpolation.js.map +1 -1
  434. package/lib/systems/animation/builders/SkeletonRig.d.ts +0 -4
  435. package/lib/systems/animation/builders/SkeletonRig.d.ts.map +1 -1
  436. package/lib/systems/animation/builders/SkeletonRig.js +0 -3
  437. package/lib/systems/animation/builders/SkeletonRig.js.map +1 -1
  438. package/lib/systems/animation/catalogs/RecoveryAnimations.d.ts +0 -5
  439. package/lib/systems/animation/catalogs/RecoveryAnimations.d.ts.map +1 -1
  440. package/lib/systems/animation/catalogs/RecoveryAnimations.js +0 -5
  441. package/lib/systems/animation/catalogs/RecoveryAnimations.js.map +1 -1
  442. package/lib/systems/animation/core/AnimationHitTiming.d.ts +0 -6
  443. package/lib/systems/animation/core/AnimationHitTiming.d.ts.map +1 -1
  444. package/lib/systems/animation/core/AnimationHitTiming.js +0 -4
  445. package/lib/systems/animation/core/AnimationHitTiming.js.map +1 -1
  446. package/lib/systems/animation/core/AnimationTransitions.d.ts +0 -3
  447. package/lib/systems/animation/core/AnimationTransitions.d.ts.map +1 -1
  448. package/lib/systems/animation/core/AnimationTransitions.js.map +1 -1
  449. package/lib/systems/animation/core/LateralityTransform.d.ts +0 -3
  450. package/lib/systems/animation/core/LateralityTransform.d.ts.map +1 -1
  451. package/lib/systems/animation/core/LateralityTransform.js +0 -1
  452. package/lib/systems/animation/core/LateralityTransform.js.map +1 -1
  453. package/lib/systems/animation/core/RecoveryPhaseEnhancer.d.ts +0 -1
  454. package/lib/systems/animation/core/RecoveryPhaseEnhancer.d.ts.map +1 -1
  455. package/lib/systems/animation/core/RecoveryPhaseEnhancer.js.map +1 -1
  456. package/lib/systems/animation/core/TechniqueAnimationMapper.d.ts +0 -10
  457. package/lib/systems/animation/core/TechniqueAnimationMapper.d.ts.map +1 -1
  458. package/lib/systems/animation/core/TechniqueAnimationMapper.js +0 -8
  459. package/lib/systems/animation/core/TechniqueAnimationMapper.js.map +1 -1
  460. package/lib/systems/animation/core/TrigramAnimationMapping.d.ts +0 -10
  461. package/lib/systems/animation/core/TrigramAnimationMapping.d.ts.map +1 -1
  462. package/lib/systems/animation/core/TrigramStanceTransitions.d.ts +0 -2
  463. package/lib/systems/animation/core/TrigramStanceTransitions.d.ts.map +1 -1
  464. package/lib/systems/animation/core/types.d.ts +0 -39
  465. package/lib/systems/animation/core/types.d.ts.map +1 -1
  466. package/lib/systems/animation/core/types.js +0 -9
  467. package/lib/systems/animation/core/types.js.map +1 -1
  468. package/lib/systems/animation/systems/AdvancedJointMovements.d.ts +0 -27
  469. package/lib/systems/animation/systems/AdvancedJointMovements.d.ts.map +1 -1
  470. package/lib/systems/animation/systems/AdvancedJointMovements.js +0 -1
  471. package/lib/systems/animation/systems/AdvancedJointMovements.js.map +1 -1
  472. package/lib/systems/animation/systems/BodyFacingSystem.d.ts +0 -19
  473. package/lib/systems/animation/systems/BodyFacingSystem.d.ts.map +1 -1
  474. package/lib/systems/animation/systems/BodyFacingSystem.js +0 -14
  475. package/lib/systems/animation/systems/BodyFacingSystem.js.map +1 -1
  476. package/lib/systems/animation/systems/FacialExpressions.d.ts +0 -10
  477. package/lib/systems/animation/systems/FacialExpressions.d.ts.map +1 -1
  478. package/lib/systems/animation/systems/FacialExpressions.js +0 -2
  479. package/lib/systems/animation/systems/FacialExpressions.js.map +1 -1
  480. package/lib/systems/animation/systems/FallAnimations.d.ts +0 -4
  481. package/lib/systems/animation/systems/FallAnimations.d.ts.map +1 -1
  482. package/lib/systems/animation/systems/FallAnimations.js +0 -2
  483. package/lib/systems/animation/systems/FallAnimations.js.map +1 -1
  484. package/lib/systems/animation/systems/HeadMovements.d.ts +0 -10
  485. package/lib/systems/animation/systems/HeadMovements.d.ts.map +1 -1
  486. package/lib/systems/bodypart/BodyPartDamageIntegration.d.ts +0 -7
  487. package/lib/systems/bodypart/BodyPartDamageIntegration.d.ts.map +1 -1
  488. package/lib/systems/bodypart/BodyPartDamageIntegration.js +0 -7
  489. package/lib/systems/bodypart/BodyPartDamageIntegration.js.map +1 -1
  490. package/lib/systems/bodypart/BodyPartHealthSystem.d.ts +0 -13
  491. package/lib/systems/bodypart/BodyPartHealthSystem.d.ts.map +1 -1
  492. package/lib/systems/bodypart/BodyPartHealthSystem.js +0 -13
  493. package/lib/systems/bodypart/BodyPartHealthSystem.js.map +1 -1
  494. package/lib/systems/bodypart/BodyPartPositionMapping.d.ts +0 -6
  495. package/lib/systems/bodypart/BodyPartPositionMapping.d.ts.map +1 -1
  496. package/lib/systems/bodypart/BodyPartPositionMapping.js +0 -6
  497. package/lib/systems/bodypart/BodyPartPositionMapping.js.map +1 -1
  498. package/lib/systems/bodypart/CombatInjuryIntegration.d.ts +0 -10
  499. package/lib/systems/bodypart/CombatInjuryIntegration.d.ts.map +1 -1
  500. package/lib/systems/bodypart/CombatInjuryIntegration.js +0 -8
  501. package/lib/systems/bodypart/CombatInjuryIntegration.js.map +1 -1
  502. package/lib/systems/bodypart/InjuryIntegration.d.ts +0 -2
  503. package/lib/systems/bodypart/InjuryIntegration.d.ts.map +1 -1
  504. package/lib/systems/bodypart/InjuryIntegration.js +0 -2
  505. package/lib/systems/bodypart/InjuryIntegration.js.map +1 -1
  506. package/lib/systems/bodypart/InjuryTracker.d.ts +0 -14
  507. package/lib/systems/bodypart/InjuryTracker.d.ts.map +1 -1
  508. package/lib/systems/bodypart/InjuryTracker.js +0 -12
  509. package/lib/systems/bodypart/InjuryTracker.js.map +1 -1
  510. package/lib/systems/bodypart/MovementPenaltySystem.d.ts +0 -8
  511. package/lib/systems/bodypart/MovementPenaltySystem.d.ts.map +1 -1
  512. package/lib/systems/bodypart/MovementPenaltySystem.js +0 -8
  513. package/lib/systems/bodypart/MovementPenaltySystem.js.map +1 -1
  514. package/lib/systems/bodypart/PlayerInjuryTrackingManager.d.ts +0 -8
  515. package/lib/systems/bodypart/PlayerInjuryTrackingManager.d.ts.map +1 -1
  516. package/lib/systems/bodypart/PlayerInjuryTrackingManager.js +0 -8
  517. package/lib/systems/bodypart/PlayerInjuryTrackingManager.js.map +1 -1
  518. package/lib/systems/bodypart/types.d.ts +0 -13
  519. package/lib/systems/bodypart/types.d.ts.map +1 -1
  520. package/lib/systems/bodypart/types.js +0 -5
  521. package/lib/systems/bodypart/types.js.map +1 -1
  522. package/lib/systems/breathing/BreathingDisruptionSystem.d.ts +0 -3
  523. package/lib/systems/breathing/BreathingDisruptionSystem.d.ts.map +1 -1
  524. package/lib/systems/breathing/BreathingDisruptionSystem.js +0 -2
  525. package/lib/systems/breathing/BreathingDisruptionSystem.js.map +1 -1
  526. package/lib/systems/combat/BalanceSystem.d.ts +0 -25
  527. package/lib/systems/combat/BalanceSystem.d.ts.map +1 -1
  528. package/lib/systems/combat/BalanceSystem.js +0 -25
  529. package/lib/systems/combat/BalanceSystem.js.map +1 -1
  530. package/lib/systems/combat/BreakingStatusEffects.d.ts +0 -4
  531. package/lib/systems/combat/BreakingStatusEffects.d.ts.map +1 -1
  532. package/lib/systems/combat/BreakingStatusEffects.js +0 -3
  533. package/lib/systems/combat/BreakingStatusEffects.js.map +1 -1
  534. package/lib/systems/combat/CombatStateSystem.d.ts +0 -9
  535. package/lib/systems/combat/CombatStateSystem.d.ts.map +1 -1
  536. package/lib/systems/combat/CombatStateSystem.js +0 -9
  537. package/lib/systems/combat/CombatStateSystem.js.map +1 -1
  538. package/lib/systems/combat/ConsciousnessSystem.d.ts +0 -16
  539. package/lib/systems/combat/ConsciousnessSystem.d.ts.map +1 -1
  540. package/lib/systems/combat/ConsciousnessSystem.js +0 -16
  541. package/lib/systems/combat/ConsciousnessSystem.js.map +1 -1
  542. package/lib/systems/combat/FallIntegration.d.ts +0 -3
  543. package/lib/systems/combat/FallIntegration.d.ts.map +1 -1
  544. package/lib/systems/combat/FallIntegration.js +0 -3
  545. package/lib/systems/combat/FallIntegration.js.map +1 -1
  546. package/lib/systems/combat/GrappleSystem.d.ts +0 -2
  547. package/lib/systems/combat/GrappleSystem.d.ts.map +1 -1
  548. package/lib/systems/combat/GrappleSystem.js +0 -2
  549. package/lib/systems/combat/GrappleSystem.js.map +1 -1
  550. package/lib/systems/combat/LimbExposureSystem.d.ts +0 -7
  551. package/lib/systems/combat/LimbExposureSystem.d.ts.map +1 -1
  552. package/lib/systems/combat/LimbExposureSystem.js +0 -7
  553. package/lib/systems/combat/LimbExposureSystem.js.map +1 -1
  554. package/lib/systems/combat/PainResponseSystem.d.ts +0 -11
  555. package/lib/systems/combat/PainResponseSystem.d.ts.map +1 -1
  556. package/lib/systems/combat/PainResponseSystem.js +0 -11
  557. package/lib/systems/combat/PainResponseSystem.js.map +1 -1
  558. package/lib/systems/combat/painConsciousnessUtils.d.ts +0 -7
  559. package/lib/systems/combat/painConsciousnessUtils.d.ts.map +1 -1
  560. package/lib/systems/combat/painConsciousnessUtils.js +0 -7
  561. package/lib/systems/combat/painConsciousnessUtils.js.map +1 -1
  562. package/lib/systems/effects.d.ts +11 -0
  563. package/lib/systems/effects.d.ts.map +1 -1
  564. package/lib/systems/effects.js +10 -0
  565. package/lib/systems/effects.js.map +1 -1
  566. package/lib/systems/game.d.ts +16 -0
  567. package/lib/systems/game.d.ts.map +1 -1
  568. package/lib/systems/game.js +1 -0
  569. package/lib/systems/game.js.map +1 -1
  570. package/lib/systems/index.d.ts +5 -1
  571. package/lib/systems/index.d.ts.map +1 -1
  572. package/lib/systems/index.js.map +1 -1
  573. package/lib/systems/movement/InjuryMovementModifier.d.ts +0 -10
  574. package/lib/systems/movement/InjuryMovementModifier.d.ts.map +1 -1
  575. package/lib/systems/movement/InjuryMovementModifier.js +0 -7
  576. package/lib/systems/movement/InjuryMovementModifier.js.map +1 -1
  577. package/lib/systems/movement/integration.d.ts +0 -3
  578. package/lib/systems/movement/integration.d.ts.map +1 -1
  579. package/lib/systems/movement/integration.js +0 -3
  580. package/lib/systems/movement/integration.js.map +1 -1
  581. package/lib/systems/physics/AttackMovementPhysics.d.ts +0 -9
  582. package/lib/systems/physics/AttackMovementPhysics.d.ts.map +1 -1
  583. package/lib/systems/physics/AttackMovementPhysics.js +0 -7
  584. package/lib/systems/physics/AttackMovementPhysics.js.map +1 -1
  585. package/lib/systems/physics/CollisionDetection.d.ts +0 -6
  586. package/lib/systems/physics/CollisionDetection.d.ts.map +1 -1
  587. package/lib/systems/physics/CollisionDetection.js +0 -6
  588. package/lib/systems/physics/CollisionDetection.js.map +1 -1
  589. package/lib/systems/physics/CoordinateMapper.d.ts +0 -1
  590. package/lib/systems/physics/CoordinateMapper.d.ts.map +1 -1
  591. package/lib/systems/physics/CoordinateMapper.js +0 -1
  592. package/lib/systems/physics/CoordinateMapper.js.map +1 -1
  593. package/lib/systems/physics/KnockbackPhysics.d.ts +0 -11
  594. package/lib/systems/physics/KnockbackPhysics.d.ts.map +1 -1
  595. package/lib/systems/physics/KnockbackPhysics.js +0 -8
  596. package/lib/systems/physics/KnockbackPhysics.js.map +1 -1
  597. package/lib/systems/physics/MovementPhysics.d.ts +0 -10
  598. package/lib/systems/physics/MovementPhysics.d.ts.map +1 -1
  599. package/lib/systems/physics/MovementPhysics.js +0 -8
  600. package/lib/systems/physics/MovementPhysics.js.map +1 -1
  601. package/lib/systems/physics/PhysicalReachCalculator.d.ts +0 -6
  602. package/lib/systems/physics/PhysicalReachCalculator.d.ts.map +1 -1
  603. package/lib/systems/physics/PhysicalReachCalculator.js +0 -5
  604. package/lib/systems/physics/PhysicalReachCalculator.js.map +1 -1
  605. package/lib/systems/physics/SpeedModifierSystem.d.ts +0 -5
  606. package/lib/systems/physics/SpeedModifierSystem.d.ts.map +1 -1
  607. package/lib/systems/physics/SpeedModifierSystem.js +0 -4
  608. package/lib/systems/physics/SpeedModifierSystem.js.map +1 -1
  609. package/lib/systems/player.d.ts +0 -5
  610. package/lib/systems/player.d.ts.map +1 -1
  611. package/lib/systems/trigram/TrigramCalculator.d.ts +0 -1
  612. package/lib/systems/trigram/TrigramCalculator.d.ts.map +1 -1
  613. package/lib/systems/trigram/TrigramCalculator.js +0 -1
  614. package/lib/systems/trigram/TrigramCalculator.js.map +1 -1
  615. package/lib/systems/trigram/types.d.ts +0 -4
  616. package/lib/systems/trigram/types.d.ts.map +1 -1
  617. package/lib/systems/trigram/types.js +0 -2
  618. package/lib/systems/trigram/types.js.map +1 -1
  619. package/lib/systems/types.d.ts +7 -2
  620. package/lib/systems/types.d.ts.map +1 -1
  621. package/lib/systems/types.js.map +1 -1
  622. package/lib/systems/vitalpoint/DamageCalculator.d.ts +0 -3
  623. package/lib/systems/vitalpoint/DamageCalculator.d.ts.map +1 -1
  624. package/lib/systems/vitalpoint/DamageCalculator.js +0 -3
  625. package/lib/systems/vitalpoint/DamageCalculator.js.map +1 -1
  626. package/lib/systems/vitalpoint/KoreanVitalPoints.d.ts +0 -8
  627. package/lib/systems/vitalpoint/KoreanVitalPoints.d.ts.map +1 -1
  628. package/lib/systems/vitalpoint/KoreanVitalPoints.js +0 -8
  629. package/lib/systems/vitalpoint/KoreanVitalPoints.js.map +1 -1
  630. package/lib/systems/vitalpoint/VitalPointsData.d.ts +0 -3
  631. package/lib/systems/vitalpoint/VitalPointsData.d.ts.map +1 -1
  632. package/lib/systems/vitalpoint/VitalPointsData.js +0 -1
  633. package/lib/systems/vitalpoint/VitalPointsData.js.map +1 -1
  634. package/lib/types/PhysicsTypes.d.ts +21 -78
  635. package/lib/types/PhysicsTypes.d.ts.map +1 -1
  636. package/lib/types/PhysicsTypes.js +17 -63
  637. package/lib/types/PhysicsTypes.js.map +1 -1
  638. package/lib/types/clothing.d.ts +0 -9
  639. package/lib/types/clothing.d.ts.map +1 -1
  640. package/lib/types/constants/animations.d.ts +35 -1
  641. package/lib/types/constants/animations.d.ts.map +1 -1
  642. package/lib/types/constants/animations.js +12 -1
  643. package/lib/types/constants/animations.js.map +1 -1
  644. package/lib/types/constants/colors.d.ts +28 -2
  645. package/lib/types/constants/colors.d.ts.map +1 -1
  646. package/lib/types/constants/colors.js +30 -4
  647. package/lib/types/constants/colors.js.map +1 -1
  648. package/lib/types/constants/index.d.ts +5 -1
  649. package/lib/types/constants/index.d.ts.map +1 -1
  650. package/lib/types/constants/index.js.map +1 -1
  651. package/lib/types/constants/performance.d.ts +0 -2
  652. package/lib/types/constants/performance.d.ts.map +1 -1
  653. package/lib/types/constants/performance.js +0 -2
  654. package/lib/types/constants/performance.js.map +1 -1
  655. package/lib/types/constants/typography.d.ts +40 -2
  656. package/lib/types/constants/typography.d.ts.map +1 -1
  657. package/lib/types/constants/typography.js +40 -2
  658. package/lib/types/constants/typography.js.map +1 -1
  659. package/lib/types/constants/ui.d.ts +89 -1
  660. package/lib/types/constants/ui.d.ts.map +1 -1
  661. package/lib/types/constants/ui.js +33 -1
  662. package/lib/types/constants/ui.js.map +1 -1
  663. package/lib/types/facial.d.ts +0 -15
  664. package/lib/types/facial.d.ts.map +1 -1
  665. package/lib/types/facial.js +0 -8
  666. package/lib/types/facial.js.map +1 -1
  667. package/lib/types/hand-animation.d.ts +34 -147
  668. package/lib/types/hand-animation.d.ts.map +1 -1
  669. package/lib/types/hand-animation.js +0 -2
  670. package/lib/types/hand-animation.js.map +1 -1
  671. package/lib/types/injury.d.ts +0 -2
  672. package/lib/types/injury.d.ts.map +1 -1
  673. package/lib/types/injury.js +0 -1
  674. package/lib/types/injury.js.map +1 -1
  675. package/lib/types/physics.d.ts +0 -21
  676. package/lib/types/physics.d.ts.map +1 -1
  677. package/lib/types/physics.js +0 -6
  678. package/lib/types/physics.js.map +1 -1
  679. package/lib/types/physicsConstants.d.ts +0 -12
  680. package/lib/types/physicsConstants.d.ts.map +1 -1
  681. package/lib/types/physicsConstants.js +0 -12
  682. package/lib/types/physicsConstants.js.map +1 -1
  683. package/lib/types/player-visual.d.ts +45 -189
  684. package/lib/types/player-visual.d.ts.map +1 -1
  685. package/lib/types/technique.d.ts +1 -5
  686. package/lib/types/technique.d.ts.map +1 -1
  687. package/lib/types/techniqueId.d.ts +0 -1
  688. package/lib/types/techniqueId.d.ts.map +1 -1
  689. package/lib/types/techniqueId.js +0 -1
  690. package/lib/types/techniqueId.js.map +1 -1
  691. package/lib/utils/arenaWorldDimensions.d.ts +0 -11
  692. package/lib/utils/arenaWorldDimensions.d.ts.map +1 -1
  693. package/lib/utils/arenaWorldDimensions.js +0 -6
  694. package/lib/utils/arenaWorldDimensions.js.map +1 -1
  695. package/lib/utils/controlMapping.d.ts +3 -4
  696. package/lib/utils/controlMapping.d.ts.map +1 -1
  697. package/lib/utils/controlMapping.js +1 -2
  698. package/lib/utils/controlMapping.js.map +1 -1
  699. package/lib/utils/deviceDetection.d.ts +0 -5
  700. package/lib/utils/deviceDetection.d.ts.map +1 -1
  701. package/lib/utils/deviceDetection.js +0 -5
  702. package/lib/utils/deviceDetection.js.map +1 -1
  703. package/lib/utils/hapticFeedback.d.ts +23 -95
  704. package/lib/utils/hapticFeedback.d.ts.map +1 -1
  705. package/lib/utils/hapticFeedback.js +9 -39
  706. package/lib/utils/hapticFeedback.js.map +1 -1
  707. package/lib/utils/haptics.d.ts +0 -3
  708. package/lib/utils/haptics.d.ts.map +1 -1
  709. package/lib/utils/haptics.js +0 -1
  710. package/lib/utils/haptics.js.map +1 -1
  711. package/lib/utils/math.d.ts +0 -3
  712. package/lib/utils/math.d.ts.map +1 -1
  713. package/lib/utils/math.js +0 -2
  714. package/lib/utils/math.js.map +1 -1
  715. package/lib/utils/mobileLayoutHelpers.d.ts +0 -3
  716. package/lib/utils/mobileLayoutHelpers.d.ts.map +1 -1
  717. package/lib/utils/mobileLayoutHelpers.js +0 -1
  718. package/lib/utils/mobileLayoutHelpers.js.map +1 -1
  719. package/lib/utils/mobileUIUtils.d.ts +5 -100
  720. package/lib/utils/mobileUIUtils.d.ts.map +1 -1
  721. package/lib/utils/mobileUIUtils.js +0 -9
  722. package/lib/utils/mobileUIUtils.js.map +1 -1
  723. package/lib/utils/physicalAttributeValidation.d.ts.map +1 -1
  724. package/lib/utils/player3DHelpers.d.ts.map +1 -1
  725. package/lib/utils/player3DHelpers.js.map +1 -1
  726. package/lib/utils/responsiveLayoutHelpers.d.ts +0 -65
  727. package/lib/utils/responsiveLayoutHelpers.d.ts.map +1 -1
  728. package/lib/utils/responsiveLayoutHelpers.js +0 -65
  729. package/lib/utils/responsiveLayoutHelpers.js.map +1 -1
  730. package/lib/utils/responsiveOrientationConstants.d.ts +0 -7
  731. package/lib/utils/responsiveOrientationConstants.d.ts.map +1 -1
  732. package/lib/utils/responsiveOrientationConstants.js +0 -7
  733. package/lib/utils/responsiveOrientationConstants.js.map +1 -1
  734. package/lib/utils/safeAreaUtils.d.ts +0 -6
  735. package/lib/utils/safeAreaUtils.d.ts.map +1 -1
  736. package/lib/utils/safeAreaUtils.js +0 -2
  737. package/lib/utils/safeAreaUtils.js.map +1 -1
  738. package/lib/utils/sharedPhysicsConfig.d.ts +0 -4
  739. package/lib/utils/sharedPhysicsConfig.d.ts.map +1 -1
  740. package/lib/utils/sharedPhysicsConfig.js +0 -2
  741. package/lib/utils/sharedPhysicsConfig.js.map +1 -1
  742. package/lib/utils/skeletonScaling.d.ts +0 -9
  743. package/lib/utils/skeletonScaling.d.ts.map +1 -1
  744. package/lib/utils/skeletonScaling.js +0 -1
  745. package/lib/utils/skeletonScaling.js.map +1 -1
  746. 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
- * @public
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;;;;;;;;;;;;;;;;;;;;GAoBG;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
+ {"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"}
@@ -68,8 +68,7 @@ var DEFAULT_BINDINGS = {
68
68
  * });
69
69
  * ```
70
70
  *
71
- * @public
72
- * @korean 컨트롤매퍼
71
+ * @korean 콘트롤매퍼
73
72
  */
74
73
  var ControlMapper = class {
75
74
  bindings;
@@ -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;AAsHD;;;GAGG;AACH,eAAO,MAAM,iBAAiB,MAAM,CAAC;AAErC;;;GAGG;AACH,eAAO,MAAM,iBAAiB,OAAO,CAAC;AA8CtC;;;;;;GAMG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CAKzC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,wBAAgB,cAAc,IAAI,YAAY,CAoF7C;AAED;;;;;;;;GAQG;AACH,wBAAgB,cAAc,IAAI,OAAO,CAGxC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,uBAAuB,IAAI,OAAO,CAyBjD;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,iBAAiB;;;;;EAuEhC"}
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;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAQ3C;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,eAAe,GAAG,OAAO,CAyBzE;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAoBxE;AAED;;;;;;GAMG;AACH,eAAO,MAAM,SAAS;IACpB;;;OAGG;;IAGH;;;OAGG;;IAGH;;;OAGG;;IAGH;;;OAGG;;IAGH;;;OAGG;;IAGH;;;OAGG;;IAGH;;;OAGG;;IAGH;;;OAGG;;IAGH;;;OAGG;;CAEK,CAAC;AAEX;;;;;;GAMG;AACH,eAAO,MAAM,aAAa;IACxB;;;OAGG;;IAGH;;;OAGG;;IAGH;;;OAGG;;IAGH;;;OAGG;;IAGH;;;OAGG;;IAGH;;;OAGG;;IAGH;;;OAGG;;IAGH;;;OAGG;oCACoB,MAAM;IAQ7B;;;OAGG;;IAGH;;;OAGG;;CAEK,CAAC;AAEX;;;;;;GAMG;AACH,eAAO,MAAM,eAAe;IAC1B;;;OAGG;;IAGH;;;OAGG;;IAGH;;;OAGG;;IAGH;;;OAGG;;IAGH;;;OAGG;;CAEK,CAAC"}
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 * @public\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 * @public\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 * @public\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 /**\n * Button tap feedback\n * @korean 버튼탭피드백\n */\n buttonTap: () => triggerHapticFeedback(\"medium\"),\n\n /**\n * Menu hover/navigation feedback\n * @korean 메뉴호버피드백\n */\n menuHover: () => triggerHapticFeedback(\"light\"),\n\n /**\n * Stance change feedback\n * @korean 자세변경피드백\n */\n stanceChange: () => triggerHapticFeedback(\"light\"),\n\n /**\n * Attack execution feedback\n * @korean 공격실행피드백\n */\n attackExecution: () => triggerHapticFeedback(\"medium\"),\n\n /**\n * Critical hit feedback\n * @korean 치명타피드백\n */\n criticalHit: () => triggerHapticPattern([50, 30, 100]),\n\n /**\n * Vital point strike feedback\n * @korean 급소타격피드백\n */\n vitalPointStrike: () => triggerHapticPattern([100, 50, 100, 50, 100]),\n\n /**\n * Block/defend feedback\n * @korean 방어피드백\n */\n blockDefend: () => triggerHapticFeedback(\"medium\"),\n\n /**\n * Error/invalid action feedback\n * @korean 오류피드백\n */\n error: () => triggerHapticPattern([50, 50, 50]),\n\n /**\n * Success/achievement feedback\n * @korean 성공피드백\n */\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 /**\n * Normal hit feedback\n * @korean 일반타격피드백\n */\n normalHit: () => triggerHapticFeedback(\"medium\"),\n\n /**\n * Critical hit feedback with double pulse\n * @korean 치명타피드백\n */\n criticalHit: () => triggerHapticPattern([50, 30, 100]),\n\n /**\n * Perfect strike feedback (triple pulse)\n * @korean 완벽타격피드백\n */\n perfectStrike: () => triggerHapticPattern([30, 30, 30, 30, 100]),\n\n /**\n * Vital point strike feedback (intense pattern)\n * @korean 급소타격피드백\n */\n vitalPointHit: () => triggerHapticPattern([100, 50, 100, 50, 100]),\n\n /**\n * Blocked attack feedback (sharp double pulse)\n * @korean 방어성공피드백\n */\n attackBlocked: () => triggerHapticPattern([30, 30, 30]),\n\n /**\n * Miss feedback (quick light pulse)\n * @korean 빗나감피드백\n */\n attackMissed: () => triggerHapticFeedback(\"light\"),\n\n /**\n * Counter-attack feedback (building intensity)\n * @korean 반격피드백\n */\n counterAttack: () => triggerHapticPattern([30, 20, 50, 20, 100]),\n\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\n /**\n * Heavy damage taken feedback (long intense pulse)\n * @korean 큰피해피드백\n */\n heavyDamage: () => triggerHapticPattern([150, 50, 150]),\n\n /**\n * Knockout feedback (dramatic pattern)\n * @korean 녹다운피드백\n */\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 /**\n * Correct technique feedback\n * @korean 정확한기술피드백\n */\n correctTechnique: () => triggerHapticPattern([30, 30, 100]),\n\n /**\n * Incorrect technique feedback\n * @korean 부정확한기술피드백\n */\n incorrectTechnique: () => triggerHapticPattern([50, 50, 50]),\n\n /**\n * Target hit feedback\n * @korean 표적명중피드백\n */\n targetHit: () => triggerHapticFeedback(\"medium\"),\n\n /**\n * Perfect timing feedback\n * @korean 완벽한타이밍피드백\n */\n perfectTiming: () => triggerHapticPattern([20, 20, 20, 20, 80]),\n\n /**\n * New skill unlocked feedback\n * @korean 새기술해금피드백\n */\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;;;;;;;;;;;;;;;;AAiBD,SAAgB,oBAA6B;CAC3C,IAAI,OAAO,cAAc,aACvB,OAAO;CAIT,MAAM,MAAM;CACZ,OAAO,aAAa,aAAa,CAAC,CAAC,IAAI;;;;;;;;;;;;;;;;;;;;;;;AAwBzC,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;;;;;;;;;;;;;;;;;;AAmBT,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;;;;;CAKvB,iBAAiB,sBAAsB,SAAS;;;;;CAMhD,iBAAiB,sBAAsB,QAAQ;;;;;CAM/C,oBAAoB,sBAAsB,QAAQ;;;;;CAMlD,uBAAuB,sBAAsB,SAAS;;;;;CAMtD,mBAAmB,qBAAqB;EAAC;EAAI;EAAI;EAAI,CAAC;;;;;CAMtD,wBAAwB,qBAAqB;EAAC;EAAK;EAAI;EAAK;EAAI;EAAI,CAAC;;;;;CAMrE,mBAAmB,sBAAsB,SAAS;;;;;CAMlD,aAAa,qBAAqB;EAAC;EAAI;EAAI;EAAG,CAAC;;;;;CAM/C,eAAe,qBAAqB;EAAC;EAAI;EAAI;EAAI;EAAI;EAAI,CAAC;CAC3D"}
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"}