@rb-games/core 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +488 -0
- package/dist/devtools/DraggableController.d.ts +10 -0
- package/dist/devtools/DraggableController.d.ts.map +1 -0
- package/dist/devtools/ResizableController.d.ts +19 -0
- package/dist/devtools/ResizableController.d.ts.map +1 -0
- package/dist/devtools/index.d.ts +7 -0
- package/dist/devtools/index.d.ts.map +1 -0
- package/dist/devtools/index.js +884 -0
- package/dist/devtools/index.js.map +1 -0
- package/dist/devtools/overlayPlugin.d.ts +3 -0
- package/dist/devtools/overlayPlugin.d.ts.map +1 -0
- package/dist/devtools/spinePropertiesPlugin.d.ts +3 -0
- package/dist/devtools/spinePropertiesPlugin.d.ts.map +1 -0
- package/dist/devtools/spriteTextPropertiesPlugin.d.ts +3 -0
- package/dist/devtools/spriteTextPropertiesPlugin.d.ts.map +1 -0
- package/dist/devtools/treePlugin.d.ts +7 -0
- package/dist/devtools/treePlugin.d.ts.map +1 -0
- package/dist/engine/PixiEngine.d.ts +404 -0
- package/dist/engine/PixiEngine.d.ts.map +1 -0
- package/dist/engine/index.d.ts +2 -0
- package/dist/engine/index.d.ts.map +1 -0
- package/dist/engine/index.js +1818 -0
- package/dist/engine/index.js.map +1 -0
- package/dist/filters/ChromaKeyFilter.d.ts +64 -0
- package/dist/filters/ChromaKeyFilter.d.ts.map +1 -0
- package/dist/filters/index.d.ts +2 -0
- package/dist/filters/index.d.ts.map +1 -0
- package/dist/filters/index.js +248 -0
- package/dist/filters/index.js.map +1 -0
- package/dist/helpers/AssetHelper.d.ts +117 -0
- package/dist/helpers/AssetHelper.d.ts.map +1 -0
- package/dist/helpers/SVGAssetHelper.d.ts +397 -0
- package/dist/helpers/SVGAssetHelper.d.ts.map +1 -0
- package/dist/helpers/SVGLoader.d.ts +46 -0
- package/dist/helpers/SVGLoader.d.ts.map +1 -0
- package/dist/helpers/SVGParser.d.ts +121 -0
- package/dist/helpers/SVGParser.d.ts.map +1 -0
- package/dist/helpers/eventBridge.d.ts +150 -0
- package/dist/helpers/eventBridge.d.ts.map +1 -0
- package/dist/helpers/index.d.ts +8 -0
- package/dist/helpers/index.d.ts.map +1 -0
- package/dist/helpers/index.js +702 -0
- package/dist/helpers/index.js.map +1 -0
- package/dist/helpers/mergeUtils.d.ts +21 -0
- package/dist/helpers/mergeUtils.d.ts.map +1 -0
- package/dist/helpers/resolvePublicPath.d.ts +6 -0
- package/dist/helpers/resolvePublicPath.d.ts.map +1 -0
- package/dist/i18n/index.d.ts +2 -0
- package/dist/i18n/index.d.ts.map +1 -0
- package/dist/i18n/index.js +527 -0
- package/dist/i18n/index.js.map +1 -0
- package/dist/i18n/sharedI18n.d.ts +11 -0
- package/dist/i18n/sharedI18n.d.ts.map +1 -0
- package/dist/layout/Align.d.ts +126 -0
- package/dist/layout/Align.d.ts.map +1 -0
- package/dist/layout/Bounds.d.ts +120 -0
- package/dist/layout/Bounds.d.ts.map +1 -0
- package/dist/layout/Distribute.d.ts +103 -0
- package/dist/layout/Distribute.d.ts.map +1 -0
- package/dist/layout/Flow.d.ts +213 -0
- package/dist/layout/Flow.d.ts.map +1 -0
- package/dist/layout/PositionUtils.d.ts +57 -0
- package/dist/layout/PositionUtils.d.ts.map +1 -0
- package/dist/layout/index.d.ts +6 -0
- package/dist/layout/index.d.ts.map +1 -0
- package/dist/layout/index.js +673 -0
- package/dist/layout/index.js.map +1 -0
- package/dist/particle/Emitter.d.ts +290 -0
- package/dist/particle/Emitter.d.ts.map +1 -0
- package/dist/particle/EmitterConfig.d.ts +228 -0
- package/dist/particle/EmitterConfig.d.ts.map +1 -0
- package/dist/particle/LinkedListContainer.d.ts +7 -0
- package/dist/particle/LinkedListContainer.d.ts.map +1 -0
- package/dist/particle/Particle.d.ts +63 -0
- package/dist/particle/Particle.d.ts.map +1 -0
- package/dist/particle/ParticleUtils.d.ts +97 -0
- package/dist/particle/ParticleUtils.d.ts.map +1 -0
- package/dist/particle/PropertyList.d.ts +40 -0
- package/dist/particle/PropertyList.d.ts.map +1 -0
- package/dist/particle/PropertyNode.d.ts +74 -0
- package/dist/particle/PropertyNode.d.ts.map +1 -0
- package/dist/particle/SpineEmitter.d.ts +55 -0
- package/dist/particle/SpineEmitter.d.ts.map +1 -0
- package/dist/particle/SpineParticle.d.ts +74 -0
- package/dist/particle/SpineParticle.d.ts.map +1 -0
- package/dist/particle/behaviors/AccelerationMovement.d.ts +62 -0
- package/dist/particle/behaviors/AccelerationMovement.d.ts.map +1 -0
- package/dist/particle/behaviors/Alpha.d.ts +60 -0
- package/dist/particle/behaviors/Alpha.d.ts.map +1 -0
- package/dist/particle/behaviors/AnimatedTexture.d.ts +111 -0
- package/dist/particle/behaviors/AnimatedTexture.d.ts.map +1 -0
- package/dist/particle/behaviors/Behaviors.d.ts +71 -0
- package/dist/particle/behaviors/Behaviors.d.ts.map +1 -0
- package/dist/particle/behaviors/BlendMode.d.ts +31 -0
- package/dist/particle/behaviors/BlendMode.d.ts.map +1 -0
- package/dist/particle/behaviors/BurstSpawn.d.ts +43 -0
- package/dist/particle/behaviors/BurstSpawn.d.ts.map +1 -0
- package/dist/particle/behaviors/Color.d.ts +60 -0
- package/dist/particle/behaviors/Color.d.ts.map +1 -0
- package/dist/particle/behaviors/MultiStateAnimatedTexture.d.ts +99 -0
- package/dist/particle/behaviors/MultiStateAnimatedTexture.d.ts.map +1 -0
- package/dist/particle/behaviors/OrderedTexture.d.ts +33 -0
- package/dist/particle/behaviors/OrderedTexture.d.ts.map +1 -0
- package/dist/particle/behaviors/PathMovement.d.ts +68 -0
- package/dist/particle/behaviors/PathMovement.d.ts.map +1 -0
- package/dist/particle/behaviors/PointSpawn.d.ts +21 -0
- package/dist/particle/behaviors/PointSpawn.d.ts.map +1 -0
- package/dist/particle/behaviors/RandomColor.d.ts +17 -0
- package/dist/particle/behaviors/RandomColor.d.ts.map +1 -0
- package/dist/particle/behaviors/RandomTexture.d.ts +32 -0
- package/dist/particle/behaviors/RandomTexture.d.ts.map +1 -0
- package/dist/particle/behaviors/Rotation.d.ts +114 -0
- package/dist/particle/behaviors/Rotation.d.ts.map +1 -0
- package/dist/particle/behaviors/Scale.d.ts +74 -0
- package/dist/particle/behaviors/Scale.d.ts.map +1 -0
- package/dist/particle/behaviors/ShapeSpawn.d.ts +58 -0
- package/dist/particle/behaviors/ShapeSpawn.d.ts.map +1 -0
- package/dist/particle/behaviors/SingleTexture.d.ts +32 -0
- package/dist/particle/behaviors/SingleTexture.d.ts.map +1 -0
- package/dist/particle/behaviors/SpeedMovement.d.ts +76 -0
- package/dist/particle/behaviors/SpeedMovement.d.ts.map +1 -0
- package/dist/particle/behaviors/SpineTexture.d.ts +173 -0
- package/dist/particle/behaviors/SpineTexture.d.ts.map +1 -0
- package/dist/particle/behaviors/ZindexBehavior.d.ts +16 -0
- package/dist/particle/behaviors/ZindexBehavior.d.ts.map +1 -0
- package/dist/particle/behaviors/editor/Types.d.ts +104 -0
- package/dist/particle/behaviors/editor/Types.d.ts.map +1 -0
- package/dist/particle/behaviors/editor/behaviors/AccelerationMovement.d.ts +2 -0
- package/dist/particle/behaviors/editor/behaviors/AccelerationMovement.d.ts.map +1 -0
- package/dist/particle/behaviors/editor/behaviors/Alpha.d.ts +2 -0
- package/dist/particle/behaviors/editor/behaviors/Alpha.d.ts.map +1 -0
- package/dist/particle/behaviors/editor/behaviors/AnimatedTexture.d.ts +2 -0
- package/dist/particle/behaviors/editor/behaviors/AnimatedTexture.d.ts.map +1 -0
- package/dist/particle/behaviors/editor/behaviors/BlendMode.d.ts +2 -0
- package/dist/particle/behaviors/editor/behaviors/BlendMode.d.ts.map +1 -0
- package/dist/particle/behaviors/editor/behaviors/BurstSpawn.d.ts +2 -0
- package/dist/particle/behaviors/editor/behaviors/BurstSpawn.d.ts.map +1 -0
- package/dist/particle/behaviors/editor/behaviors/Color.d.ts +2 -0
- package/dist/particle/behaviors/editor/behaviors/Color.d.ts.map +1 -0
- package/dist/particle/behaviors/editor/behaviors/OrderedTexture.d.ts +2 -0
- package/dist/particle/behaviors/editor/behaviors/OrderedTexture.d.ts.map +1 -0
- package/dist/particle/behaviors/editor/behaviors/PathMovement.d.ts +2 -0
- package/dist/particle/behaviors/editor/behaviors/PathMovement.d.ts.map +1 -0
- package/dist/particle/behaviors/editor/behaviors/PointSpawn.d.ts +2 -0
- package/dist/particle/behaviors/editor/behaviors/PointSpawn.d.ts.map +1 -0
- package/dist/particle/behaviors/editor/behaviors/RandomTexture.d.ts +2 -0
- package/dist/particle/behaviors/editor/behaviors/RandomTexture.d.ts.map +1 -0
- package/dist/particle/behaviors/editor/behaviors/Rotation.d.ts +2 -0
- package/dist/particle/behaviors/editor/behaviors/Rotation.d.ts.map +1 -0
- package/dist/particle/behaviors/editor/behaviors/Scale.d.ts +2 -0
- package/dist/particle/behaviors/editor/behaviors/Scale.d.ts.map +1 -0
- package/dist/particle/behaviors/editor/behaviors/ShapeSpawn.d.ts +2 -0
- package/dist/particle/behaviors/editor/behaviors/ShapeSpawn.d.ts.map +1 -0
- package/dist/particle/behaviors/editor/behaviors/SingleTexture.d.ts +2 -0
- package/dist/particle/behaviors/editor/behaviors/SingleTexture.d.ts.map +1 -0
- package/dist/particle/behaviors/editor/behaviors/SpeedMovement.d.ts +2 -0
- package/dist/particle/behaviors/editor/behaviors/SpeedMovement.d.ts.map +1 -0
- package/dist/particle/behaviors/editor/behaviors/index.d.ts +15 -0
- package/dist/particle/behaviors/editor/behaviors/index.d.ts.map +1 -0
- package/dist/particle/behaviors/editor/index.d.ts +5 -0
- package/dist/particle/behaviors/editor/index.d.ts.map +1 -0
- package/dist/particle/behaviors/editor/shapes/PolygonalChain.d.ts +2 -0
- package/dist/particle/behaviors/editor/shapes/PolygonalChain.d.ts.map +1 -0
- package/dist/particle/behaviors/editor/shapes/Rectangle.d.ts +2 -0
- package/dist/particle/behaviors/editor/shapes/Rectangle.d.ts.map +1 -0
- package/dist/particle/behaviors/editor/shapes/Torus.d.ts +2 -0
- package/dist/particle/behaviors/editor/shapes/Torus.d.ts.map +1 -0
- package/dist/particle/behaviors/index.d.ts +25 -0
- package/dist/particle/behaviors/index.d.ts.map +1 -0
- package/dist/particle/behaviors/shapes/PolygonalChain.d.ts +57 -0
- package/dist/particle/behaviors/shapes/PolygonalChain.d.ts.map +1 -0
- package/dist/particle/behaviors/shapes/Rectangle.d.ts +59 -0
- package/dist/particle/behaviors/shapes/Rectangle.d.ts.map +1 -0
- package/dist/particle/behaviors/shapes/SpawnShape.d.ts +32 -0
- package/dist/particle/behaviors/shapes/SpawnShape.d.ts.map +1 -0
- package/dist/particle/behaviors/shapes/Torus.d.ts +71 -0
- package/dist/particle/behaviors/shapes/Torus.d.ts.map +1 -0
- package/dist/particle/behaviors/shapes/index.d.ts +5 -0
- package/dist/particle/behaviors/shapes/index.d.ts.map +1 -0
- package/dist/particle/index.d.ts +11 -0
- package/dist/particle/index.d.ts.map +1 -0
- package/dist/particle/index.js +2845 -0
- package/dist/particle/index.js.map +1 -0
- package/dist/plugins/Plugin.types.d.ts +80 -0
- package/dist/plugins/Plugin.types.d.ts.map +1 -0
- package/dist/plugins/device/DeviceOptimizerPlugin.d.ts +187 -0
- package/dist/plugins/device/DeviceOptimizerPlugin.d.ts.map +1 -0
- package/dist/plugins/device/DeviceOptimizerPlugin.types.d.ts +134 -0
- package/dist/plugins/device/DeviceOptimizerPlugin.types.d.ts.map +1 -0
- package/dist/plugins/device/index.d.ts +3 -0
- package/dist/plugins/device/index.d.ts.map +1 -0
- package/dist/plugins/display/DisplayPlugin.d.ts +208 -0
- package/dist/plugins/display/DisplayPlugin.d.ts.map +1 -0
- package/dist/plugins/display/DisplayPlugin.types.d.ts +174 -0
- package/dist/plugins/display/DisplayPlugin.types.d.ts.map +1 -0
- package/dist/plugins/display/displayViewport.d.ts +10 -0
- package/dist/plugins/display/displayViewport.d.ts.map +1 -0
- package/dist/plugins/display/index.d.ts +4 -0
- package/dist/plugins/display/index.d.ts.map +1 -0
- package/dist/plugins/eventbus/EventBusPlugin.d.ts +21 -0
- package/dist/plugins/eventbus/EventBusPlugin.d.ts.map +1 -0
- package/dist/plugins/eventbus/EventBusPlugin.types.d.ts +24 -0
- package/dist/plugins/eventbus/EventBusPlugin.types.d.ts.map +1 -0
- package/dist/plugins/eventbus/index.d.ts +3 -0
- package/dist/plugins/eventbus/index.d.ts.map +1 -0
- package/dist/plugins/gsap/GsapPlugin.d.ts +307 -0
- package/dist/plugins/gsap/GsapPlugin.d.ts.map +1 -0
- package/dist/plugins/gsap/index.d.ts +2 -0
- package/dist/plugins/gsap/index.d.ts.map +1 -0
- package/dist/plugins/index.d.ts +13 -0
- package/dist/plugins/index.d.ts.map +1 -0
- package/dist/plugins/index.js +12806 -0
- package/dist/plugins/index.js.map +1 -0
- package/dist/plugins/input/InputPlugin.const.d.ts +80 -0
- package/dist/plugins/input/InputPlugin.const.d.ts.map +1 -0
- package/dist/plugins/input/InputPlugin.d.ts +141 -0
- package/dist/plugins/input/InputPlugin.d.ts.map +1 -0
- package/dist/plugins/input/InputPlugin.types.d.ts +41 -0
- package/dist/plugins/input/InputPlugin.types.d.ts.map +1 -0
- package/dist/plugins/input/KeyboardManager.d.ts +139 -0
- package/dist/plugins/input/KeyboardManager.d.ts.map +1 -0
- package/dist/plugins/input/KeyboardManager.types.d.ts +27 -0
- package/dist/plugins/input/KeyboardManager.types.d.ts.map +1 -0
- package/dist/plugins/input/index.d.ts +4 -0
- package/dist/plugins/input/index.d.ts.map +1 -0
- package/dist/plugins/language/I18NextPlugin.d.ts +30 -0
- package/dist/plugins/language/I18NextPlugin.d.ts.map +1 -0
- package/dist/plugins/language/I18NextPlugin.types.d.ts +29 -0
- package/dist/plugins/language/I18NextPlugin.types.d.ts.map +1 -0
- package/dist/plugins/language/index.d.ts +3 -0
- package/dist/plugins/language/index.d.ts.map +1 -0
- package/dist/plugins/resource/ResourcePlugin.d.ts +189 -0
- package/dist/plugins/resource/ResourcePlugin.d.ts.map +1 -0
- package/dist/plugins/resource/ResourcePlugin.types.d.ts +153 -0
- package/dist/plugins/resource/ResourcePlugin.types.d.ts.map +1 -0
- package/dist/plugins/resource/index.d.ts +3 -0
- package/dist/plugins/resource/index.d.ts.map +1 -0
- package/dist/plugins/scene/Scene.d.ts +203 -0
- package/dist/plugins/scene/Scene.d.ts.map +1 -0
- package/dist/plugins/scene/ScenePlugin.d.ts +162 -0
- package/dist/plugins/scene/ScenePlugin.d.ts.map +1 -0
- package/dist/plugins/scene/ScenePlugin.types.d.ts +35 -0
- package/dist/plugins/scene/ScenePlugin.types.d.ts.map +1 -0
- package/dist/plugins/scene/index.d.ts +4 -0
- package/dist/plugins/scene/index.d.ts.map +1 -0
- package/dist/plugins/sentry/SentryPlugin.d.ts +66 -0
- package/dist/plugins/sentry/SentryPlugin.d.ts.map +1 -0
- package/dist/plugins/sentry/SentryPlugin.types.d.ts +8 -0
- package/dist/plugins/sentry/SentryPlugin.types.d.ts.map +1 -0
- package/dist/plugins/sentry/index.d.ts +3 -0
- package/dist/plugins/sentry/index.d.ts.map +1 -0
- package/dist/plugins/service/ServiceAdapter.d.ts +88 -0
- package/dist/plugins/service/ServiceAdapter.d.ts.map +1 -0
- package/dist/plugins/service/ServiceEventHelper.d.ts +6 -0
- package/dist/plugins/service/ServiceEventHelper.d.ts.map +1 -0
- package/dist/plugins/service/ServicePlugin.d.ts +135 -0
- package/dist/plugins/service/ServicePlugin.d.ts.map +1 -0
- package/dist/plugins/service/ServicePlugin.types.d.ts +14 -0
- package/dist/plugins/service/ServicePlugin.types.d.ts.map +1 -0
- package/dist/plugins/service/adapters/DevAuthAdapter.d.ts +56 -0
- package/dist/plugins/service/adapters/DevAuthAdapter.d.ts.map +1 -0
- package/dist/plugins/service/adapters/RGSAdapter.d.ts +82 -0
- package/dist/plugins/service/adapters/RGSAdapter.d.ts.map +1 -0
- package/dist/plugins/service/adapters/index.d.ts +7 -0
- package/dist/plugins/service/adapters/index.d.ts.map +1 -0
- package/dist/plugins/service/adapters/resolvePublicIp.d.ts +10 -0
- package/dist/plugins/service/adapters/resolvePublicIp.d.ts.map +1 -0
- package/dist/plugins/service/index.d.ts +10 -0
- package/dist/plugins/service/index.d.ts.map +1 -0
- package/dist/plugins/service/types/api.types.d.ts +299 -0
- package/dist/plugins/service/types/api.types.d.ts.map +1 -0
- package/dist/plugins/service/types/index.d.ts +6 -0
- package/dist/plugins/service/types/index.d.ts.map +1 -0
- package/dist/plugins/skin/ISkin.d.ts +62 -0
- package/dist/plugins/skin/ISkin.d.ts.map +1 -0
- package/dist/plugins/skin/Skin.d.ts +155 -0
- package/dist/plugins/skin/Skin.d.ts.map +1 -0
- package/dist/plugins/skin/SkinPlugin.d.ts +285 -0
- package/dist/plugins/skin/SkinPlugin.d.ts.map +1 -0
- package/dist/plugins/skin/SkinPlugin.types.d.ts +56 -0
- package/dist/plugins/skin/SkinPlugin.types.d.ts.map +1 -0
- package/dist/plugins/skin/index.d.ts +5 -0
- package/dist/plugins/skin/index.d.ts.map +1 -0
- package/dist/plugins/sound/SoundPlugin.d.ts +319 -0
- package/dist/plugins/sound/SoundPlugin.d.ts.map +1 -0
- package/dist/plugins/sound/SoundPlugin.types.d.ts +102 -0
- package/dist/plugins/sound/SoundPlugin.types.d.ts.map +1 -0
- package/dist/plugins/sound/SoundTestGUI.d.ts +42 -0
- package/dist/plugins/sound/SoundTestGUI.d.ts.map +1 -0
- package/dist/plugins/sound/index.d.ts +4 -0
- package/dist/plugins/sound/index.d.ts.map +1 -0
- package/dist/state-machine/ConfigBuilder.d.ts +239 -0
- package/dist/state-machine/ConfigBuilder.d.ts.map +1 -0
- package/dist/state-machine/StateMachine.d.ts +251 -0
- package/dist/state-machine/StateMachine.d.ts.map +1 -0
- package/dist/state-machine/guards.d.ts +151 -0
- package/dist/state-machine/guards.d.ts.map +1 -0
- package/dist/state-machine/index.d.ts +5 -0
- package/dist/state-machine/index.d.ts.map +1 -0
- package/dist/state-machine/index.js +954 -0
- package/dist/state-machine/index.js.map +1 -0
- package/dist/state-machine/types.d.ts +65 -0
- package/dist/state-machine/types.d.ts.map +1 -0
- package/dist/store/DataStore.d.ts +167 -0
- package/dist/store/DataStore.d.ts.map +1 -0
- package/dist/store/index.d.ts +3 -0
- package/dist/store/index.d.ts.map +1 -0
- package/dist/store/index.js +197 -0
- package/dist/store/index.js.map +1 -0
- package/dist/ui/behaviors/ButtonBehavior.d.ts +245 -0
- package/dist/ui/behaviors/ButtonBehavior.d.ts.map +1 -0
- package/dist/ui/behaviors/InputBehavior.d.ts +169 -0
- package/dist/ui/behaviors/InputBehavior.d.ts.map +1 -0
- package/dist/ui/behaviors/ScrollbarBehavior.d.ts +371 -0
- package/dist/ui/behaviors/ScrollbarBehavior.d.ts.map +1 -0
- package/dist/ui/behaviors/index.d.ts +4 -0
- package/dist/ui/behaviors/index.d.ts.map +1 -0
- package/dist/ui/components/ButtonComp.d.ts +138 -0
- package/dist/ui/components/ButtonComp.d.ts.map +1 -0
- package/dist/ui/components/Comp.utils.d.ts +390 -0
- package/dist/ui/components/Comp.utils.d.ts.map +1 -0
- package/dist/ui/components/Component.types.d.ts +41 -0
- package/dist/ui/components/Component.types.d.ts.map +1 -0
- package/dist/ui/components/InputComp.d.ts +43 -0
- package/dist/ui/components/InputComp.d.ts.map +1 -0
- package/dist/ui/components/LabelBox.d.ts +49 -0
- package/dist/ui/components/LabelBox.d.ts.map +1 -0
- package/dist/ui/components/ListTableComp.d.ts +106 -0
- package/dist/ui/components/ListTableComp.d.ts.map +1 -0
- package/dist/ui/components/Skinable.d.ts +261 -0
- package/dist/ui/components/Skinable.d.ts.map +1 -0
- package/dist/ui/components/SliderComp.d.ts +60 -0
- package/dist/ui/components/SliderComp.d.ts.map +1 -0
- package/dist/ui/components/SpriteTextBBCode.d.ts +16 -0
- package/dist/ui/components/SpriteTextBBCode.d.ts.map +1 -0
- package/dist/ui/components/StepperComp.d.ts +89 -0
- package/dist/ui/components/StepperComp.d.ts.map +1 -0
- package/dist/ui/components/index.d.ts +12 -0
- package/dist/ui/components/index.d.ts.map +1 -0
- package/dist/ui/components/spriteText/SpriteText.d.ts +114 -0
- package/dist/ui/components/spriteText/SpriteText.d.ts.map +1 -0
- package/dist/ui/components/spriteText/SpriteText.types.d.ts +109 -0
- package/dist/ui/components/spriteText/SpriteText.types.d.ts.map +1 -0
- package/dist/ui/components/spriteText/SpriteTextAlignment.d.ts +25 -0
- package/dist/ui/components/spriteText/SpriteTextAlignment.d.ts.map +1 -0
- package/dist/ui/components/spriteText/SpriteTextBezier.d.ts +20 -0
- package/dist/ui/components/spriteText/SpriteTextBezier.d.ts.map +1 -0
- package/dist/ui/components/spriteText/SpriteTextCurve.d.ts +4 -0
- package/dist/ui/components/spriteText/SpriteTextCurve.d.ts.map +1 -0
- package/dist/ui/components/spriteText/SpriteTextKerning.d.ts +7 -0
- package/dist/ui/components/spriteText/SpriteTextKerning.d.ts.map +1 -0
- package/dist/ui/components/spriteText/SpriteTextTexture.d.ts +16 -0
- package/dist/ui/components/spriteText/SpriteTextTexture.d.ts.map +1 -0
- package/dist/ui/components/spriteText/SpriteTextWrap.d.ts +19 -0
- package/dist/ui/components/spriteText/SpriteTextWrap.d.ts.map +1 -0
- package/dist/ui/components/spriteText/index.d.ts +3 -0
- package/dist/ui/components/spriteText/index.d.ts.map +1 -0
- package/dist/ui/index.d.ts +3 -0
- package/dist/ui/index.d.ts.map +1 -0
- package/dist/ui/index.js +4778 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/utils/ArrayUtils.d.ts +24 -0
- package/dist/utils/ArrayUtils.d.ts.map +1 -0
- package/dist/utils/ColorUtils.d.ts +34 -0
- package/dist/utils/ColorUtils.d.ts.map +1 -0
- package/dist/utils/DataInjector.d.ts +67 -0
- package/dist/utils/DataInjector.d.ts.map +1 -0
- package/dist/utils/Logger.d.ts +332 -0
- package/dist/utils/Logger.d.ts.map +1 -0
- package/dist/utils/NumberFormatter.d.ts +126 -0
- package/dist/utils/NumberFormatter.d.ts.map +1 -0
- package/dist/utils/ObjectUtils.d.ts +64 -0
- package/dist/utils/ObjectUtils.d.ts.map +1 -0
- package/dist/utils/PixiUtils.d.ts +118 -0
- package/dist/utils/PixiUtils.d.ts.map +1 -0
- package/dist/utils/Throttle.d.ts +103 -0
- package/dist/utils/Throttle.d.ts.map +1 -0
- package/dist/utils/index.d.ts +9 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +899 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/vite/index.d.ts +3 -0
- package/dist/vite/index.d.ts.map +1 -0
- package/dist/vite/index.js +126 -0
- package/dist/vite/index.js.map +1 -0
- package/dist/vite/mergeLocalesPlugin.d.ts +22 -0
- package/dist/vite/mergeLocalesPlugin.d.ts.map +1 -0
- package/package.json +143 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../node_modules/eventemitter3/index.js","../../../../node_modules/eventemitter3/index.mjs","../../ui/behaviors/ButtonBehavior.ts","../../ui/behaviors/ScrollbarBehavior.ts","../../ui/behaviors/InputBehavior.ts","../../utils/ObjectUtils.ts","../../ui/components/Skinable.ts","../../ui/components/SpriteTextBBCode.ts","../../ui/components/spriteText/SpriteTextKerning.ts","../../ui/components/spriteText/SpriteTextTexture.ts","../../ui/components/spriteText/SpriteTextWrap.ts","../../ui/components/spriteText/SpriteTextBezier.ts","../../ui/components/spriteText/SpriteTextCurve.ts","../../ui/components/spriteText/SpriteTextAlignment.ts","../../ui/components/spriteText/SpriteText.ts","../../ui/components/ButtonComp.ts","../../ui/components/InputComp.ts","../../ui/components/SliderComp.ts","../../ui/components/Comp.utils.ts","../../layout/Bounds.ts","../../layout/Flow.ts","../../layout/Align.ts","../../ui/components/StepperComp.ts","../../ui/components/LabelBox.ts","../../ui/components/ListTableComp.ts"],"names":["EventEmitter","Texture","Container","merge","Sprite","Graphics","Text","Rectangle","parent"],"mappings":"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","file":"index.js","sourcesContent":["'use strict';\n\nvar has = Object.prototype.hasOwnProperty\n , prefix = '~';\n\n/**\n * Constructor to create a storage for our `EE` objects.\n * An `Events` instance is a plain object whose properties are event names.\n *\n * @constructor\n * @private\n */\nfunction Events() {}\n\n//\n// We try to not inherit from `Object.prototype`. In some engines creating an\n// instance in this way is faster than calling `Object.create(null)` directly.\n// If `Object.create(null)` is not supported we prefix the event names with a\n// character to make sure that the built-in object properties are not\n// overridden or used as an attack vector.\n//\nif (Object.create) {\n Events.prototype = Object.create(null);\n\n //\n // This hack is needed because the `__proto__` property is still inherited in\n // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.\n //\n if (!new Events().__proto__) prefix = false;\n}\n\n/**\n * Representation of a single event listener.\n *\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} [once=false] Specify if the listener is a one-time listener.\n * @constructor\n * @private\n */\nfunction EE(fn, context, once) {\n this.fn = fn;\n this.context = context;\n this.once = once || false;\n}\n\n/**\n * Add a listener for a given event.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} once Specify if the listener is a one-time listener.\n * @returns {EventEmitter}\n * @private\n */\nfunction addListener(emitter, event, fn, context, once) {\n if (typeof fn !== 'function') {\n throw new TypeError('The listener must be a function');\n }\n\n var listener = new EE(fn, context || emitter, once)\n , evt = prefix ? prefix + event : event;\n\n if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++;\n else if (!emitter._events[evt].fn) emitter._events[evt].push(listener);\n else emitter._events[evt] = [emitter._events[evt], listener];\n\n return emitter;\n}\n\n/**\n * Clear event by name.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} evt The Event name.\n * @private\n */\nfunction clearEvent(emitter, evt) {\n if (--emitter._eventsCount === 0) emitter._events = new Events();\n else delete emitter._events[evt];\n}\n\n/**\n * Minimal `EventEmitter` interface that is molded against the Node.js\n * `EventEmitter` interface.\n *\n * @constructor\n * @public\n */\nfunction EventEmitter() {\n this._events = new Events();\n this._eventsCount = 0;\n}\n\n/**\n * Return an array listing the events for which the emitter has registered\n * listeners.\n *\n * @returns {Array}\n * @public\n */\nEventEmitter.prototype.eventNames = function eventNames() {\n var names = []\n , events\n , name;\n\n if (this._eventsCount === 0) return names;\n\n for (name in (events = this._events)) {\n if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);\n }\n\n if (Object.getOwnPropertySymbols) {\n return names.concat(Object.getOwnPropertySymbols(events));\n }\n\n return names;\n};\n\n/**\n * Return the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Array} The registered listeners.\n * @public\n */\nEventEmitter.prototype.listeners = function listeners(event) {\n var evt = prefix ? prefix + event : event\n , handlers = this._events[evt];\n\n if (!handlers) return [];\n if (handlers.fn) return [handlers.fn];\n\n for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {\n ee[i] = handlers[i].fn;\n }\n\n return ee;\n};\n\n/**\n * Return the number of listeners listening to a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Number} The number of listeners.\n * @public\n */\nEventEmitter.prototype.listenerCount = function listenerCount(event) {\n var evt = prefix ? prefix + event : event\n , listeners = this._events[evt];\n\n if (!listeners) return 0;\n if (listeners.fn) return 1;\n return listeners.length;\n};\n\n/**\n * Calls each of the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Boolean} `true` if the event had listeners, else `false`.\n * @public\n */\nEventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return false;\n\n var listeners = this._events[evt]\n , len = arguments.length\n , args\n , i;\n\n if (listeners.fn) {\n if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);\n\n switch (len) {\n case 1: return listeners.fn.call(listeners.context), true;\n case 2: return listeners.fn.call(listeners.context, a1), true;\n case 3: return listeners.fn.call(listeners.context, a1, a2), true;\n case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;\n case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n }\n\n for (i = 1, args = new Array(len -1); i < len; i++) {\n args[i - 1] = arguments[i];\n }\n\n listeners.fn.apply(listeners.context, args);\n } else {\n var length = listeners.length\n , j;\n\n for (i = 0; i < length; i++) {\n if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);\n\n switch (len) {\n case 1: listeners[i].fn.call(listeners[i].context); break;\n case 2: listeners[i].fn.call(listeners[i].context, a1); break;\n case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;\n case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break;\n default:\n if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {\n args[j - 1] = arguments[j];\n }\n\n listeners[i].fn.apply(listeners[i].context, args);\n }\n }\n }\n\n return true;\n};\n\n/**\n * Add a listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.on = function on(event, fn, context) {\n return addListener(this, event, fn, context, false);\n};\n\n/**\n * Add a one-time listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.once = function once(event, fn, context) {\n return addListener(this, event, fn, context, true);\n};\n\n/**\n * Remove the listeners of a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn Only remove the listeners that match this function.\n * @param {*} context Only remove the listeners that have this context.\n * @param {Boolean} once Only remove one-time listeners.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return this;\n if (!fn) {\n clearEvent(this, evt);\n return this;\n }\n\n var listeners = this._events[evt];\n\n if (listeners.fn) {\n if (\n listeners.fn === fn &&\n (!once || listeners.once) &&\n (!context || listeners.context === context)\n ) {\n clearEvent(this, evt);\n }\n } else {\n for (var i = 0, events = [], length = listeners.length; i < length; i++) {\n if (\n listeners[i].fn !== fn ||\n (once && !listeners[i].once) ||\n (context && listeners[i].context !== context)\n ) {\n events.push(listeners[i]);\n }\n }\n\n //\n // Reset the array, or remove it completely if we have no more listeners.\n //\n if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;\n else clearEvent(this, evt);\n }\n\n return this;\n};\n\n/**\n * Remove all listeners, or those of the specified event.\n *\n * @param {(String|Symbol)} [event] The event name.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {\n var evt;\n\n if (event) {\n evt = prefix ? prefix + event : event;\n if (this._events[evt]) clearEvent(this, evt);\n } else {\n this._events = new Events();\n this._eventsCount = 0;\n }\n\n return this;\n};\n\n//\n// Alias methods names because people roll like that.\n//\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\nEventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n//\n// Expose the prefix.\n//\nEventEmitter.prefixed = prefix;\n\n//\n// Allow `EventEmitter` to be imported as module namespace.\n//\nEventEmitter.EventEmitter = EventEmitter;\n\n//\n// Expose the module.\n//\nif ('undefined' !== typeof module) {\n module.exports = EventEmitter;\n}\n","import EventEmitter from './index.js'\n\nexport { EventEmitter }\nexport default EventEmitter\n","import type { Container, FederatedPointerEvent, FederatedWheelEvent } from 'pixi.js';\nimport { EventEmitter } from 'eventemitter3';\n/**\n * Events emitted by ButtonBehavior.\n *\n * @public\n */\nexport interface ButtonEvents {\n click: () => void;\n down: (event: FederatedPointerEvent) => void;\n up: (event: FederatedPointerEvent) => void;\n over: (event: FederatedPointerEvent) => void;\n out: (event: FederatedPointerEvent) => void;\n wheel: (event: FederatedWheelEvent) => void;\n hold: () => void;\n holdStart: () => void;\n holdEnd: () => void;\n // Toggle events\n toggle: (selected: boolean) => void;\n select: () => void;\n deselect: () => void;\n // View state change events\n viewAttached: (view: Container) => void;\n viewDetached: (view: Container) => void;\n stateChanged: (state: ButtonState) => void;\n}\n\nexport type ButtonVisualState =\n | 'up'\n | 'down'\n | 'over'\n | 'disabled'\n | 'selected_up'\n | 'selected_down'\n | 'selected_over'\n | 'selected_disabled';\n\nexport interface ButtonState {\n enabled: boolean;\n pressed: boolean;\n holding: boolean;\n selected: boolean;\n cursor: string;\n over: boolean;\n state: ButtonVisualState; // 👈 type-safe state\n}\n\n/**\n * Hold detection mode for buttons.\n * - `'none'`: No hold detection, only click events (default)\n * - `'exclusive'`: Hold skips click — holdEnd emitted on release, click is NOT emitted\n * - `'clickThrough'`: Hold + click — holdEnd AND click both emitted on release\n */\nexport type HoldMode = 'none' | 'exclusive' | 'clickThrough';\n\nexport interface ButtonOptions {\n holdDelay?: number;\n holdInterval?: number;\n holdMode?: HoldMode;\n cursor?: string;\n // Toggle options\n isToggle?: boolean;\n selected?: boolean;\n allowHoldWhenToggle?: boolean; // Allow hold on toggle button?\n // Initial view\n view?: Container;\n}\n\n/**\n * Button interaction behavior for PixiJS containers.\n *\n * This module provides ButtonBehavior for complete button functionality including\n * click, hover, press states, hold/long-press detection, and toggle/checkbox mode.\n *\n * ## Features\n *\n * - **Multiple States**: up, down, over, disabled, selected variants\n * - **Hold Detection**: Configurable hold delay and interval\n * - **Toggle Mode**: Checkbox/radio button behavior\n * - **View Management**: Attach/detach views dynamically\n * - **Event-Driven**: Rich event system for all interactions\n *\n * @example\n * Basic button:\n * ```typescript\n * import { ButtonBehavior } from '@rb-games/core/ui/behaviors';\n *\n * const button = new ButtonBehavior();\n * button.attachView(myContainer);\n *\n * button.on('click', () => {\n * console.log('Button clicked!');\n * });\n *\n * button.on('stateChanged', (state) => {\n * if (state.state === 'down') {\n * myContainer.tint = 0xCCCCCC;\n * } else if (state.state === 'over') {\n * myContainer.tint = 0xFFFFFF;\n * }\n * });\n * ```\n *\n * @example\n * Toggle button (checkbox):\n * ```typescript\n * const checkbox = new ButtonBehavior({\n * isToggle: true,\n * selected: false\n * });\n * checkbox.attachView(checkboxContainer);\n *\n * checkbox.on('toggle', (selected) => {\n * console.log('Checkbox is now:', selected ? 'checked' : 'unchecked');\n * });\n *\n * checkbox.on('stateChanged', (state) => {\n * if (state.selected) {\n * checkboxContainer.texture = checkedTexture;\n * } else {\n * checkboxContainer.texture = uncheckedTexture;\n * }\n * });\n * ```\n *\n * @example\n * Hold button (long press):\n * ```typescript\n * const holdButton = new ButtonBehavior({\n * holdDelay: 500, // Start hold after 500ms\n * holdInterval: 100 // Emit hold event every 100ms\n * });\n * holdButton.attachView(buttonContainer);\n *\n * let count = 0;\n * holdButton.on('hold', () => {\n * count++;\n * console.log('Hold count:', count);\n * });\n *\n * holdButton.on('holdStart', () => {\n * console.log('Hold started');\n * });\n *\n * holdButton.on('holdEnd', () => {\n * console.log('Hold ended, total:', count);\n * count = 0;\n * });\n * ```\n *\n * @example\n * All button states:\n * ```typescript\n * const button = new ButtonBehavior({ isToggle: true });\n * button.attachView(container);\n *\n * button.on('stateChanged', (state) => {\n * // state.state can be:\n * // 'up', 'down', 'over', 'disabled'\n * // 'selected_up', 'selected_down', 'selected_over', 'selected_disabled'\n *\n * switch (state.state) {\n * case 'up':\n * container.texture = textures.up;\n * break;\n * case 'over':\n * container.texture = textures.over;\n * break;\n * case 'down':\n * container.texture = textures.down;\n * break;\n * case 'selected_up':\n * container.texture = textures.selected_up;\n * break;\n * }\n * });\n * ```\n *\n * @see {@link ButtonEvents} for available events\n * @see {@link ButtonOptions} for configuration options\n * @see {@link ButtonState} for state interface\n * @see {@link ButtonVisualState} for visual state types\n *\n * @category UI\n * @public\n */\nexport class ButtonBehavior extends EventEmitter<ButtonEvents> {\n private _view: Container | null = null;\n private _enabled: boolean = true;\n private _isPressed: boolean = false;\n private _isHolding: boolean = false;\n private _pointerDownOnThis: boolean = false;\n private _isOver: boolean = false; // 👈 isOver added\n\n private _holdTimer: NodeJS.Timeout | null = null;\n private _holdInterval: NodeJS.Timeout | null = null;\n private _holdDelay: number;\n private _holdIntervalTime: number;\n private _cursor: string = 'pointer';\n\n // Toggle properties\n private _isToggle: boolean = false;\n private _selected: boolean = false;\n private _allowHoldWhenToggle: boolean = false;\n private _holdMode: HoldMode;\n\n // Track if events are bound to current view\n private _eventsBound: boolean = false;\n\n // Static factory methods\n public static withView(view: Container, options: ButtonOptions = {}): ButtonBehavior {\n const button = new ButtonBehavior(options);\n button.attachView(view);\n return button;\n }\n\n // Method overloads - now only takes options\n constructor(options: ButtonOptions = {}) {\n super();\n\n this._holdDelay = options.holdDelay || 500;\n this._holdIntervalTime = options.holdInterval || 100;\n this._holdMode = options.holdMode ?? 'none';\n this._cursor = options.cursor || 'pointer';\n\n // Initialize toggle properties\n this._isToggle = options.isToggle || false;\n this._selected = options.selected || false;\n this._allowHoldWhenToggle = options.allowHoldWhenToggle || false;\n\n // If a view is provided, attach it\n if (options.view) {\n this.attachView(options.view);\n }\n }\n\n // View Management Methods\n public attachView(view: Container): void {\n if (this._view === view) return; // ✅ Do nothing if it's the same view\n\n // Detach current view if exists\n if (this._view) {\n this.detachView();\n }\n\n this._view = view;\n this._setupInteractivity();\n this._bindEvents();\n this._setupDestroyListener();\n this._eventsBound = true;\n\n this.emit('viewAttached', view);\n this._emitStateChange();\n }\n\n public detachView(): void {\n if (!this._view) return;\n\n const oldView = this._view;\n this._unbindEvents();\n this._view = null;\n this._eventsBound = false;\n\n // Reset state\n this._stopHoldTimer();\n this._isPressed = false;\n this._isHolding = false;\n this._pointerDownOnThis = false;\n this._isOver = false; // 👈 reset in detachView\n\n this.emit('viewDetached', oldView);\n }\n\n public get view(): Container | null {\n return this._view;\n }\n\n public get hasView(): boolean {\n return this._view !== null;\n }\n\n private _setupInteractivity(): void {\n if (!this._view) return;\n\n this._view.eventMode = 'static';\n this._view.cursor = this._cursor;\n }\n\n private _bindEvents(): void {\n if (!this._view) return;\n\n this._view.on('pointerdown', this._onPointerDown.bind(this));\n this._view.on('pointerup', this._onPointerUp.bind(this));\n this._view.on('pointerupoutside', this._onPointerUp.bind(this));\n this._view.on('pointerover', this._onPointerOver.bind(this));\n this._view.on('pointerout', this._onPointerOut.bind(this));\n this._view.on('wheel', this._onWheel.bind(this));\n }\n\n private _unbindEvents(): void {\n if (!this._view || !this._eventsBound) return;\n\n this._view.off('pointerdown', this._onPointerDown.bind(this));\n this._view.off('pointerup', this._onPointerUp.bind(this));\n this._view.off('pointerupoutside', this._onPointerUp.bind(this));\n this._view.off('pointerover', this._onPointerOver.bind(this));\n this._view.off('pointerout', this._onPointerOut.bind(this));\n this._view.off('wheel', this._onWheel.bind(this));\n this._view.off('destroyed', this._onViewDestroyed.bind(this));\n }\n\n private _setupDestroyListener(): void {\n if (!this._view) return;\n\n // Listen for view destruction\n this._view.on('destroyed', this._onViewDestroyed.bind(this));\n }\n\n private _emitStateChange(): void {\n const state: ButtonState = {\n enabled: this._enabled,\n pressed: this._isPressed,\n holding: this._isHolding,\n selected: this._selected,\n cursor: this._cursor,\n over: this._isOver,\n state: this._calculateStateString(), // type-safe\n };\n this.emit('stateChanged', state);\n }\n\n private _onViewDestroyed(): void {\n // Clean up when view is destroyed\n this._stopHoldTimer();\n this._isPressed = false;\n this._isHolding = false;\n this._pointerDownOnThis = false;\n this._isOver = false; // 👈 reset when destroyed\n\n // Remove all listeners\n this.removeAllListeners();\n }\n\n private _onPointerDown(event: FederatedPointerEvent): void {\n if (!this._enabled || !this._view) return;\n\n this._isPressed = true;\n this._pointerDownOnThis = true;\n\n // Start hold timer only if holdMode enables it\n if (this._holdMode !== 'none' && (!this._isToggle || this._allowHoldWhenToggle)) {\n this._startHoldTimer();\n }\n\n this.emit('down', event);\n this._emitStateChange();\n }\n\n private _onPointerUp(event: FederatedPointerEvent): void {\n if (!this._enabled || !this._view) return;\n\n // Only process if pointer down was initiated on this button\n if (!this._pointerDownOnThis) {\n return;\n }\n\n this._isPressed = false;\n this._pointerDownOnThis = false;\n this._stopHoldTimer();\n\n // Emit up event first\n this.emit('up', event);\n\n // Handle different behaviors based on button type\n if (this._isHolding) {\n this._isHolding = false;\n this.emit('holdEnd');\n // In clickThrough mode, also emit click after holdEnd\n if (this._holdMode === 'clickThrough') {\n if (this._isToggle) {\n this._handleToggle();\n } else {\n this.emit('click');\n }\n }\n } else if (this._enabled) {\n if (this._isToggle) {\n // Toggle behavior\n this._handleToggle();\n } else {\n // Regular button behavior\n this.emit('click');\n }\n }\n\n this._emitStateChange();\n }\n\n private _handleToggle(): void {\n this._selected = !this._selected;\n\n // Emit toggle event with new state\n this.emit('toggle', this._selected);\n\n // Emit specific select/deselect events\n if (this._selected) {\n this.emit('select');\n } else {\n this.emit('deselect');\n }\n\n // Also emit click for compatibility\n this.emit('click');\n }\n\n private _onPointerOver(event: FederatedPointerEvent): void {\n if (!this._enabled || !this._view) return;\n this._isOver = true; // 👈 over state updated\n this.emit('over', event);\n this._emitStateChange();\n }\n\n private _onPointerOut(event: FederatedPointerEvent): void {\n if (!this._enabled || !this._view) return;\n this._isOver = false; // 👈 over state updated\n // Don't end hold when mouse out occurs\n // Only emit out event\n this.emit('out', event);\n this._emitStateChange();\n }\n\n private _onWheel(event: FederatedWheelEvent): void {\n if (!this._enabled || !this._view) return;\n this.emit('wheel', event);\n }\n\n private _startHoldTimer(): void {\n this._stopHoldTimer();\n\n this._holdTimer = setTimeout(() => {\n if (this._isPressed && this._enabled) {\n this._isHolding = true;\n this.emit('holdStart');\n this.emit('hold');\n\n this._holdInterval = setInterval(() => {\n if (this._isHolding && this._enabled) {\n this.emit('hold');\n }\n }, this._holdIntervalTime);\n }\n }, this._holdDelay);\n }\n\n private _stopHoldTimer(): void {\n if (this._holdTimer) {\n clearTimeout(this._holdTimer);\n this._holdTimer = null;\n }\n\n if (this._holdInterval) {\n clearInterval(this._holdInterval);\n this._holdInterval = null;\n }\n }\n\n // Properties\n public get holdMode(): HoldMode {\n return this._holdMode;\n }\n\n public set holdMode(value: HoldMode) {\n this._holdMode = value;\n }\n\n public get isEnabled(): boolean {\n return this._enabled;\n }\n\n public set isEnabled(value: boolean) {\n this._enabled = value;\n\n if (this._view) {\n this._view.eventMode = value ? 'static' : 'none';\n this._view.cursor = value ? this._cursor : 'default';\n }\n\n if (!value) {\n this._stopHoldTimer();\n this._isPressed = false;\n this._isHolding = false;\n this._pointerDownOnThis = false;\n this._isOver = false; // 👈 reset on disable\n }\n\n this._emitStateChange();\n }\n\n public get isPressed(): boolean {\n return this._isPressed;\n }\n\n public get isHolding(): boolean {\n return this._isHolding;\n }\n\n // Toggle properties\n public get isToggle(): boolean {\n return this._isToggle;\n }\n\n public set isToggle(value: boolean) {\n this._isToggle = value;\n if (!value) {\n this._selected = false;\n }\n }\n\n public get isSelected(): boolean {\n return this._selected;\n }\n\n public set isSelected(value: boolean) {\n if (this._selected !== value) {\n this._selected = value;\n this.emit('toggle', this._selected);\n\n if (this._selected) {\n this.emit('select');\n } else {\n this.emit('deselect');\n }\n\n this._emitStateChange();\n }\n }\n\n public get allowHoldWhenToggle(): boolean {\n return this._allowHoldWhenToggle;\n }\n\n public set allowHoldWhenToggle(value: boolean) {\n this._allowHoldWhenToggle = value;\n }\n\n // Hold timing properties\n public get holdDelay(): number {\n return this._holdDelay;\n }\n\n public set holdDelay(value: number) {\n this._holdDelay = value;\n }\n\n public get holdInterval(): number {\n return this._holdIntervalTime;\n }\n\n public set holdInterval(value: number) {\n this._holdIntervalTime = value;\n }\n\n // Cursor property\n public get cursor(): string {\n return this._cursor;\n }\n\n public set cursor(value: string) {\n this._cursor = value;\n if (this._view && this._enabled) {\n this._view.cursor = value;\n }\n this._emitStateChange();\n }\n\n // Toggle methods\n public toggle(): void {\n if (this._isToggle) {\n this.isSelected = !this._selected;\n }\n }\n\n public select(): void {\n if (this._isToggle) {\n this.isSelected = true;\n }\n }\n\n public deselect(): void {\n if (this._isToggle) {\n this.isSelected = false;\n }\n }\n\n /**\n * Programmatically simulates a pointer down on this button.\n * Triggers press state, hold timer, and visual feedback — same as a real pointer down.\n * Does NOT emit the `down` event (which requires a FederatedPointerEvent).\n * Use together with `simulateUp()` for full keyboard/gamepad/test bindings.\n */\n public simulateDown(): void {\n if (!this._enabled) return;\n\n this._isPressed = true;\n this._pointerDownOnThis = true;\n\n if (this._holdMode !== 'none' && (!this._isToggle || this._allowHoldWhenToggle)) {\n this._startHoldTimer();\n }\n\n this._emitStateChange();\n }\n\n /**\n * Programmatically simulates a pointer up on this button.\n * Triggers click (or holdEnd/toggle) and visual feedback — same as a real pointer up.\n * Does NOT emit the `up` event (which requires a FederatedPointerEvent).\n * Use together with `simulateDown()` for full keyboard/gamepad/test bindings.\n */\n public simulateUp(): void {\n if (!this._enabled) return;\n if (!this._pointerDownOnThis) return;\n\n this._isPressed = false;\n this._pointerDownOnThis = false;\n this._stopHoldTimer();\n\n if (this._isHolding) {\n this._isHolding = false;\n this.emit('holdEnd');\n if (this._holdMode === 'clickThrough') {\n if (this._isToggle) {\n this._handleToggle();\n } else {\n this.emit('click');\n }\n }\n } else if (this._enabled) {\n if (this._isToggle) {\n this._handleToggle();\n } else {\n this.emit('click');\n }\n }\n\n this._emitStateChange();\n }\n\n public destroy(): void {\n this._stopHoldTimer();\n\n if (this._view) {\n this._unbindEvents();\n // We do not destroy the view, we only detach it\n // The lifecycle of the view is the responsibility of its owner\n }\n\n this._view = null;\n this._eventsBound = false;\n this.removeAllListeners();\n }\n\n private _calculateStateString(): ButtonVisualState {\n if (!this._enabled) {\n if (this._isToggle && this._selected) return 'selected_disabled';\n return 'disabled';\n }\n if (this._isToggle && this._selected) {\n if (this._isPressed) return 'selected_down';\n if (this._isOver) return 'selected_over';\n return 'selected_up';\n }\n if (this._isPressed) return 'down';\n if (this._isOver) return 'over';\n return 'up';\n }\n}\n","import {\n type Container,\n type FederatedPointerEvent,\n Rectangle,\n type FederatedWheelEvent,\n} from 'pixi.js';\nimport { EventEmitter } from 'eventemitter3';\n\nexport interface ScrollbarEvents {\n /** Fired when scrollbar value changes */\n scroll: (value: number, percentage: number) => void;\n /** Fired when scrolling starts */\n scrollStart: (value: number) => void;\n /** Fired when scrolling ends */\n scrollEnd: (value: number) => void;\n /** Fired when track is clicked */\n click: (clickPosition: { x: number; y: number }, percentage: number) => void;\n /** Fired when views are attached */\n viewAttached: (trackView: Container, knobView: Container) => void;\n /** Fired when views are detached */\n viewDetached: (trackView: Container, knobView: Container) => void;\n /** Fired when state changes */\n stateChanged: (state: ScrollbarState) => void;\n /** Fired when pointer enters knob */\n knobOver?: (event: FederatedPointerEvent) => void;\n /** Fired when pointer leaves knob */\n knobOut?: (event: FederatedPointerEvent) => void;\n /** Fired when knob is pressed */\n knobDown?: (event: FederatedPointerEvent) => void;\n /** Fired when knob is released */\n knobUp?: (event: FederatedPointerEvent) => void;\n /** Fired when knob is clicked */\n knobClick?: (event: FederatedPointerEvent) => void;\n /** Fired when pointer enters track */\n trackOver?: (event: FederatedPointerEvent) => void;\n /** Fired when pointer leaves track */\n trackOut?: (event: FederatedPointerEvent) => void;\n /** Fired when track is pressed */\n trackDown?: (event: FederatedPointerEvent) => void;\n /** Fired when track is released */\n trackUp?: (event: FederatedPointerEvent) => void;\n /** Fired when track is clicked */\n trackClick?: (event: FederatedPointerEvent) => void;\n}\n\nexport interface ScrollbarMargin {\n /** Left margin for horizontal, top margin for vertical */\n start?: number;\n /** Right margin for horizontal, bottom margin for vertical */\n end?: number;\n}\n\nexport interface ScrollbarOptions {\n /** Scrollbar orientation */\n orientation?: 'horizontal' | 'vertical';\n\n /** Minimum value */\n min?: number;\n /** Maximum value */\n max?: number;\n /** Current value */\n value?: number;\n /** Step size for value changes */\n step?: number;\n\n /** Mouse wheel step size */\n wheelStep?: number;\n /** Enable/disable wheel scrolling */\n enableWheel?: boolean;\n\n /** Margin for knob movement area */\n margin?: ScrollbarMargin;\n\n /** Cursor style for track */\n trackCursor?: string;\n\n /** Cursor style for knob */\n knobCursor?: string;\n}\n\nexport interface ScrollbarState {\n /** Whether scrollbar is enabled */\n enabled: boolean;\n /** Whether knob is being dragged */\n dragging: boolean;\n /** Current value */\n value: number;\n /** Current value as percentage (0-1) */\n percentage: number;\n /** Scrollbar orientation */\n orientation: 'horizontal' | 'vertical';\n /** Track size in pixels */\n trackSize: number;\n /** Track thickness in pixels */\n trackThickness: number;\n /** Knob size in pixels */\n knobSize: number;\n}\n\n/**\n * Scrollbar interaction behavior for PixiJS containers.\n *\n * This module provides ScrollbarBehavior for complete scrollbar functionality including\n * drag scrolling with knob, track click to jump, mouse wheel support, and configurable\n * horizontal/vertical orientation.\n *\n * ## Features\n *\n * - **Drag Scrolling**: Smooth knob dragging\n * - **Track Click**: Click track to jump to position\n * - **Mouse Wheel**: Scroll with mouse wheel\n * - **Orientation**: Horizontal or vertical\n * - **Margins**: Configurable start/end margins for knob movement\n * - **Step Values**: Snap to step increments\n * - **Event-Driven**: Rich event system for all interactions\n *\n * @example\n * Basic horizontal scrollbar:\n * ```typescript\n * import { ScrollbarBehavior } from '@rb-games/core/ui/behaviors';\n *\n * const scrollbar = new ScrollbarBehavior({\n * orientation: 'horizontal',\n * min: 0,\n * max: 100,\n * value: 0,\n * step: 1\n * });\n *\n * scrollbar.attachViews(trackContainer, knobContainer);\n *\n * scrollbar.on('scroll', (value, percentage) => {\n * console.log(`Scrolled to: ${value} (${percentage * 100}%)`);\n * contentContainer.x = -value * contentWidth;\n * });\n * ```\n *\n * @example\n * Vertical scrollbar with margins:\n * ```typescript\n * const scrollbar = new ScrollbarBehavior({\n * orientation: 'vertical',\n * min: 0,\n * max: 1000,\n * margin: { start: 10, end: 10 }, // 10px margin on top/bottom\n * wheelStep: 50 // Scroll 50 units per wheel tick\n * });\n *\n * scrollbar.attachViews(trackContainer, knobContainer);\n *\n * scrollbar.on('scroll', (value, percentage) => {\n * contentContainer.y = -value;\n * });\n * ```\n *\n * @example\n * Factory method with views:\n * ```typescript\n * const scrollbar = ScrollbarBehavior.withViews(\n * trackContainer,\n * knobContainer,\n * {\n * orientation: 'horizontal',\n * min: 0,\n * max: 500,\n * trackCursor: 'pointer',\n * knobCursor: 'grab'\n * }\n * );\n * ```\n *\n * @example\n * Listening to drag events:\n * ```typescript\n * scrollbar.on('scrollStart', (value) => {\n * console.log('Started dragging at:', value);\n * knobContainer.tint = 0xCCCCCC;\n * });\n *\n * scrollbar.on('scroll', (value, percentage) => {\n * updateContent(value);\n * });\n *\n * scrollbar.on('scrollEnd', (value) => {\n * console.log('Stopped dragging at:', value);\n * knobContainer.tint = 0xFFFFFF;\n * });\n * ```\n *\n * @example\n * Track click handling:\n * ```typescript\n * scrollbar.on('click', (clickPos, percentage) => {\n * console.log(`Clicked at ${clickPos.x}, ${clickPos.y}`);\n * console.log(`Jump to ${percentage * 100}%`);\n * });\n * ```\n *\n * @example\n * State-based visual updates:\n * ```typescript\n * scrollbar.on('stateChanged', (state) => {\n * if (state.dragging) {\n * knobContainer.tint = 0xFFFF00;\n * } else {\n * knobContainer.tint = 0xFFFFFF;\n * }\n *\n * console.log('Current value:', state.value);\n * console.log('Percentage:', state.percentage);\n * });\n * ```\n *\n * @example\n * Dynamic orientation change:\n * ```typescript\n * const scrollbar = new ScrollbarBehavior({\n * orientation: 'horizontal'\n * });\n * scrollbar.attachViews(trackContainer, knobContainer);\n *\n * // Later, switch to vertical\n * scrollbar.orientation = 'vertical';\n * scrollbar.refreshSizes(); // Update sizes after orientation change\n * ```\n *\n * @example\n * Knob and track UI events:\n * ```typescript\n * // Knob events\n * scrollbar.on('knobOver', () => {\n * knobContainer.tint = 0xFFFFAA;\n * });\n *\n * scrollbar.on('knobOut', () => {\n * knobContainer.tint = 0xFFFFFF;\n * });\n *\n * // Track events\n * scrollbar.on('trackOver', () => {\n * trackContainer.alpha = 1.0;\n * });\n *\n * scrollbar.on('trackOut', () => {\n * trackContainer.alpha = 0.8;\n * });\n * ```\n *\n * @example\n * Content scrolling with scrollbar:\n * ```typescript\n * const contentHeight = 2000;\n * const viewportHeight = 500;\n * const maxScroll = contentHeight - viewportHeight;\n *\n * const scrollbar = new ScrollbarBehavior({\n * orientation: 'vertical',\n * min: 0,\n * max: maxScroll,\n * value: 0,\n * wheelStep: 50\n * });\n *\n * scrollbar.attachViews(trackContainer, knobContainer);\n *\n * scrollbar.on('scroll', (value) => {\n * contentContainer.y = -value;\n * });\n *\n * // Update scrollbar when content size changes\n * function updateContentSize(newHeight: number) {\n * const newMaxScroll = newHeight - viewportHeight;\n * scrollbar.setRange(0, newMaxScroll);\n * scrollbar.refreshSizes();\n * }\n * ```\n *\n * @see {@link ScrollbarEvents} for available events\n * @see {@link ScrollbarOptions} for configuration options\n * @see {@link ScrollbarState} for state interface\n * @see {@link ScrollbarMargin} for margin configuration\n *\n * @category UI\n * @public\n */\nexport class ScrollbarBehavior extends EventEmitter<ScrollbarEvents> {\n private _trackView: Container | null = null;\n private _knobView: Container | null = null;\n\n private _enabled: boolean = true;\n private _isDragging: boolean = false;\n private _dragStartPosition: number = 0;\n private _dragStartValue: number = 0;\n private _dragOffset: number = 0;\n\n // Configuration\n private _orientation: 'horizontal' | 'vertical';\n private _min: number;\n private _max: number;\n private _value: number;\n private _step: number;\n private _margin: Required<ScrollbarMargin>;\n\n // Wheel options\n private _wheelStep: number;\n private _enableWheel: boolean;\n\n // Cursor options\n private _trackCursor: string;\n private _knobCursor: string;\n\n // Track if events are bound\n private _eventsBound: boolean = false;\n\n // Arrow function event handlers for proper cleanup\n private _onTrackPointerDown = (event: FederatedPointerEvent) =>\n this._handleTrackPointerDown(event);\n private _onKnobPointerDown = (event: FederatedPointerEvent) => this._handleKnobPointerDown(event);\n private _onKnobPointerUp = (event: FederatedPointerEvent) => this._handleKnobPointerUp(event);\n private _onKnobPointerUpOutside = (event: FederatedPointerEvent) =>\n this._handleKnobPointerUp(event);\n private _onGlobalPointerMove = (event: FederatedPointerEvent) =>\n this._handleGlobalPointerMove(event);\n private _onTrackWheel = (event: FederatedWheelEvent) => this._handleWheel(event);\n private _onKnobWheel = (event: FederatedWheelEvent) => this._handleWheel(event);\n\n // Static factory methods\n public static withViews(\n trackView: Container,\n knobView: Container,\n options: ScrollbarOptions = {},\n ): ScrollbarBehavior {\n const scrollbar = new ScrollbarBehavior(options);\n scrollbar.attachViews(trackView, knobView);\n return scrollbar;\n }\n\n constructor(options: ScrollbarOptions = {}) {\n super();\n\n // Initialize configuration\n this._orientation = options.orientation || 'horizontal';\n\n // Initialize margin\n this._margin = {\n start: options.margin?.start || 0,\n end: options.margin?.end || 0,\n };\n\n // Initialize value options\n this._min = options.min || 0;\n this._max = options.max || 100;\n this._value = options.value || 0;\n this._step = options.step || 1;\n\n // Initialize wheel options\n this._wheelStep = options.wheelStep || this._step;\n this._enableWheel = options.enableWheel !== false; // default true\n\n // Initialize cursor options\n this._trackCursor = options.trackCursor || 'pointer';\n this._knobCursor = options.knobCursor || 'grab';\n }\n\n // View Management Methods\n public attachTrackView(trackView: Container): void {\n // Skip if same view is already attached\n if (this._trackView === trackView) return;\n\n // Detach old track view if exists\n if (this._trackView) {\n this._unbindTrackEvents();\n }\n\n this._trackView = trackView;\n this._setupTrackInteractivity();\n this._bindTrackEvents();\n\n this._updateEventsBoundState();\n this._emitStateChange();\n }\n\n public attachKnobView(knobView: Container): void {\n // Skip if same view is already attached\n if (this._knobView === knobView) return;\n\n // Detach old knob view if exists\n if (this._knobView) {\n this._unbindKnobEvents();\n }\n\n this._knobView = knobView;\n this._setupKnobInteractivity();\n this._bindKnobEvents();\n\n // Update knob position if both views are available\n if (this.hasViews) {\n this._updateKnobPosition();\n }\n\n this._updateEventsBoundState();\n this._emitStateChange();\n }\n\n public attachViews(trackView: Container, knobView: Container): void {\n // Check if both views are already the same - no work needed\n if (this._trackView === trackView && this._knobView === knobView) return;\n\n const hadViews = this.hasViews;\n const trackChanged = this._trackView !== trackView;\n const knobChanged = this._knobView !== knobView;\n\n // Use individual methods to avoid duplicate work\n if (trackChanged) {\n this.attachTrackView(trackView);\n }\n\n if (knobChanged) {\n this.attachKnobView(knobView);\n }\n\n // Emit event only if both views are now attached and something changed\n if (this.hasViews && (trackChanged || knobChanged)) {\n this.emit('viewAttached', trackView, knobView);\n\n // Only emit state change once if we didn't have views before\n if (!hadViews) {\n this._emitStateChange();\n }\n }\n }\n\n public detachViews(): void {\n if (!this.hasViews) return;\n\n const oldTrackView = this._trackView;\n const oldKnobView = this._knobView;\n\n // Unbind all events\n this._unbindAllEvents();\n\n this._trackView = null;\n this._knobView = null;\n this._eventsBound = false;\n\n // Reset state\n this._isDragging = false;\n\n if (oldKnobView && oldTrackView) {\n this.emit('viewDetached', oldTrackView, oldKnobView);\n }\n\n this._emitStateChange();\n }\n\n public get trackView(): Container | null {\n return this._trackView;\n }\n\n public get knobView(): Container | null {\n return this._knobView;\n }\n\n public get hasViews(): boolean {\n return this._trackView !== null && this._knobView !== null;\n }\n\n private _setupTrackInteractivity(): void {\n if (!this._trackView) return;\n\n this._trackView.eventMode = 'static';\n this._trackView.cursor = this._trackCursor;\n\n // Set hitArea based on current size and orientation\n const trackSize = this._getTrackSize();\n const trackThickness = this._getTrackThickness();\n\n if (this._orientation === 'horizontal') {\n this._trackView.hitArea = new Rectangle(0, 0, trackSize, trackThickness);\n } else {\n this._trackView.hitArea = new Rectangle(0, 0, trackThickness, trackSize);\n }\n }\n\n private _setupKnobInteractivity(): void {\n if (!this._knobView) return;\n\n this._knobView.eventMode = 'static';\n this._knobView.cursor = this._knobCursor;\n }\n\n // --- Event binding section ---\n private _bindTrackEvents(): void {\n if (!this._trackView) return;\n this._trackView.on('pointerdown', this._onTrackPointerDown);\n this._trackView.on('pointerup', (e) => this.emit('trackUp', e));\n this._trackView.on('pointerover', (e) => this.emit('trackOver', e));\n this._trackView.on('pointerout', (e) => this.emit('trackOut', e));\n this._trackView.on('click', (e) => this.emit('trackClick', e));\n if (this._enableWheel) {\n this._trackView.on('wheel', this._onTrackWheel);\n }\n }\n\n private _unbindTrackEvents(): void {\n if (!this._trackView) return;\n\n this._trackView.off('pointerdown', this._onTrackPointerDown);\n this._trackView.off('wheel', this._onTrackWheel);\n }\n\n private _bindKnobEvents(): void {\n if (!this._knobView) return;\n\n this._knobView.on('pointerdown', this._onKnobPointerDown);\n this._knobView.on('pointerup', this._onKnobPointerUp);\n this._knobView.on('pointerupoutside', this._onKnobPointerUpOutside);\n this._knobView.on('pointerover', (e) => this.emit('knobOver', e));\n this._knobView.on('pointerout', (e) => this.emit('knobOut', e));\n this._knobView.on('click', (e) => this.emit('knobClick', e));\n this._knobView.on('pointerdown', (e) => this.emit('knobDown', e));\n this._knobView.on('pointerup', (e) => this.emit('knobUp', e));\n if (this._enableWheel) {\n this._knobView.on('wheel', this._onKnobWheel);\n }\n }\n\n private _unbindKnobEvents(): void {\n if (!this._knobView) return;\n\n this._knobView.off('pointerdown', this._onKnobPointerDown);\n this._knobView.off('pointerup', this._onKnobPointerUp);\n this._knobView.off('pointerupoutside', this._onKnobPointerUpOutside);\n this._knobView.off('wheel', this._onKnobWheel);\n this._knobView.off('globalpointermove', this._onGlobalPointerMove);\n }\n\n private _unbindAllEvents(): void {\n this._unbindTrackEvents();\n this._unbindKnobEvents();\n }\n\n private _updateEventsBoundState(): void {\n this._eventsBound = this.hasViews;\n }\n\n // Event Handlers\n private _handleTrackPointerDown(event: FederatedPointerEvent): void {\n if (!this._enabled || !this._trackView) return;\n\n const localPosition = event.getLocalPosition(this._trackView);\n const clickPosition = this._orientation === 'horizontal' ? localPosition.x : localPosition.y;\n\n // Calculate effective area considering margins\n const effectiveArea = this._getEffectiveTrackArea();\n const effectiveClickPosition = clickPosition - effectiveArea.start;\n\n // Calculate percentage within effective area\n const percentage = Math.max(0, Math.min(1, effectiveClickPosition / effectiveArea.size));\n const newValue = this._min + (this._max - this._min) * percentage;\n\n this.emit('click', { x: localPosition.x, y: localPosition.y }, percentage);\n this.value = newValue;\n this.emit('scroll', this._value, this.percentage);\n }\n\n private _handleKnobPointerDown(event: FederatedPointerEvent): void {\n if (!this._enabled || !this._knobView || !this._trackView) return;\n\n this._isDragging = true;\n this._knobView.cursor = 'grabbing';\n\n // Calculate the relative mouse position inside the knob\n const knobLocalPosition = event.getLocalPosition(this._knobView);\n this._dragOffset =\n this._orientation === 'horizontal' ? knobLocalPosition.x : knobLocalPosition.y;\n\n // Initial position relative to the track view\n const trackLocalPosition = event.getLocalPosition(this._trackView);\n this._dragStartPosition =\n this._orientation === 'horizontal' ? trackLocalPosition.x : trackLocalPosition.y;\n this._dragStartValue = this._value;\n\n // Global pointermove event'i ekle\n this._knobView.on('globalpointermove', this._onGlobalPointerMove);\n\n this.emit('scrollStart', this._value);\n this._emitStateChange();\n }\n\n private _handleKnobPointerUp(event: FederatedPointerEvent): void {\n if (!this._isDragging || !this._knobView) return;\n\n this._isDragging = false;\n this._knobView.cursor = this._knobCursor;\n\n // Remove the global pointermove event\n this._knobView.off('globalpointermove', this._onGlobalPointerMove);\n\n this.emit('scrollEnd', this._value);\n this._emitStateChange();\n }\n\n private _handleGlobalPointerMove(event: FederatedPointerEvent): void {\n if (!this._isDragging || !this._enabled || !this._trackView) return;\n\n // Convert global position to local position relative to the track view\n const localPosition = event.getLocalPosition(this._trackView);\n const currentPosition = this._orientation === 'horizontal' ? localPosition.x : localPosition.y;\n\n // Calculate the correct position taking the offset into account\n const adjustedPosition = currentPosition - this._dragOffset;\n const deltaPosition = adjustedPosition - (this._dragStartPosition - this._dragOffset);\n\n const effectiveArea = this._getEffectiveTrackArea();\n const deltaValue = (deltaPosition / effectiveArea.size) * (this._max - this._min);\n\n const newValue = this._dragStartValue + deltaValue;\n this.value = newValue;\n this.emit('scroll', this._value, this.percentage);\n }\n\n private _handleWheel(event: FederatedWheelEvent): void {\n if (!this._enabled) return;\n\n // Prevent default browser scrolling\n event.preventDefault();\n event.stopPropagation();\n\n // Get wheel delta - normalize across browsers\n const delta = (event as any).deltaY || (event as any).wheelDelta || (event as any).detail;\n\n // Determine scroll direction and amount\n let scrollAmount = 0;\n if (delta > 0) {\n scrollAmount = this._wheelStep;\n } else if (delta < 0) {\n scrollAmount = -this._wheelStep;\n }\n\n if (scrollAmount !== 0) {\n const newValue = this._value + scrollAmount;\n this.value = newValue;\n this.emit('scroll', this._value, this.percentage);\n }\n }\n\n // Size calculation methods\n private _getTrackSize(): number {\n if (!this._trackView) return 0;\n return this._orientation === 'horizontal' ? this._trackView.width : this._trackView.height;\n }\n\n private _getTrackThickness(): number {\n if (!this._trackView) return 0;\n return this._orientation === 'horizontal' ? this._trackView.height : this._trackView.width;\n }\n\n private _getKnobSize(): number {\n if (!this._knobView) return 0;\n const knobBoundingBox = this._knobView.getLocalBounds();\n return this._orientation === 'horizontal'\n ? knobBoundingBox.width + knobBoundingBox.x * 2\n : knobBoundingBox.height + knobBoundingBox.y * 2;\n }\n\n private _getEffectiveTrackArea(): { start: number; size: number } {\n const trackSize = this._getTrackSize();\n const knobSize = this._getKnobSize();\n const start = this._margin.start;\n const end = trackSize - this._margin.end;\n const availableSize = end - start - knobSize;\n return { start, size: Math.max(0, availableSize) };\n }\n\n private _updateKnobPosition(): void {\n if (!this._knobView || !this._trackView) return;\n\n const percentage = (this._value - this._min) / (this._max - this._min);\n const effectiveArea = this._getEffectiveTrackArea();\n const trackThickness = this._getTrackThickness();\n if (this._orientation === 'horizontal') {\n const knobX = effectiveArea.start + percentage * effectiveArea.size;\n this._knobView.x = knobX;\n this._knobView.y = trackThickness / 2;\n } else {\n const knobY = effectiveArea.start + percentage * effectiveArea.size;\n this._knobView.x = trackThickness / 2;\n this._knobView.y = knobY;\n }\n }\n\n private _emitStateChange(): void {\n const state: ScrollbarState = {\n enabled: this._enabled,\n dragging: this._isDragging,\n value: this._value,\n percentage: this.percentage,\n orientation: this._orientation,\n trackSize: this._getTrackSize(),\n trackThickness: this._getTrackThickness(),\n knobSize: this._getKnobSize(),\n };\n this.emit('stateChanged', state);\n }\n\n // Properties\n public get enabled(): boolean {\n return this._enabled;\n }\n\n public set enabled(value: boolean) {\n this._enabled = value;\n\n if (this._trackView) {\n this._trackView.eventMode = value ? 'static' : 'none';\n }\n\n if (this._knobView) {\n this._knobView.eventMode = value ? 'static' : 'none';\n }\n\n if (!value && this._isDragging) {\n this._isDragging = false;\n if (this._knobView) {\n this._knobView.cursor = this._knobCursor;\n this._knobView.off('globalpointermove', this._onGlobalPointerMove);\n }\n this.emit('scrollEnd', this._value);\n }\n\n this._emitStateChange();\n }\n\n public get isDragging(): boolean {\n return this._isDragging;\n }\n\n public get value(): number {\n return this._value;\n }\n\n public set value(newValue: number) {\n const clampedValue = Math.max(this._min, Math.min(this._max, newValue));\n const steppedValue = Math.round(clampedValue / this._step) * this._step;\n\n if (this._value !== steppedValue) {\n this._value = steppedValue;\n\n this._updateKnobPosition();\n this._emitStateChange();\n }\n }\n\n public get percentage(): number {\n return (this._value - this._min) / (this._max - this._min);\n }\n\n public get trackSize(): number {\n return this._getTrackSize();\n }\n\n public get trackThickness(): number {\n return this._getTrackThickness();\n }\n\n public get knobSize(): number {\n return this._getKnobSize();\n }\n\n public get orientation(): 'horizontal' | 'vertical' {\n return this._orientation;\n }\n\n public set orientation(value: 'horizontal' | 'vertical') {\n if (this._orientation !== value) {\n this._orientation = value;\n\n // Re-setup interactivity with new orientation\n this._setupTrackInteractivity();\n this._setupKnobInteractivity();\n this._updateKnobPosition();\n this._emitStateChange();\n }\n }\n\n public get margin(): ScrollbarMargin {\n return { ...this._margin };\n }\n\n public set margin(value: ScrollbarMargin) {\n this._margin = {\n start: value.start || 0,\n end: value.end || 0,\n };\n this._updateKnobPosition();\n this._emitStateChange();\n }\n\n public get wheelStep(): number {\n return this._wheelStep;\n }\n\n public set wheelStep(value: number) {\n this._wheelStep = value;\n }\n\n public get enableWheel(): boolean {\n return this._enableWheel;\n }\n\n public set enableWheel(value: boolean) {\n if (this._enableWheel !== value) {\n this._enableWheel = value;\n\n // Re-bind wheel events based on new setting\n if (this._trackView) {\n this._trackView.off('wheel', this._onTrackWheel);\n if (value) {\n this._trackView.on('wheel', this._onTrackWheel);\n }\n }\n\n if (this._knobView) {\n this._knobView.off('wheel', this._onKnobWheel);\n if (value) {\n this._knobView.on('wheel', this._onKnobWheel);\n }\n }\n }\n }\n\n public get step(): number {\n return this._step;\n }\n\n public set step(value: number) {\n this._step = value;\n // Re-clamp current value with new step\n this.value = this._value;\n }\n\n public get trackCursor(): string {\n return this._trackCursor;\n }\n\n public set trackCursor(value: string) {\n this._trackCursor = value;\n if (this._trackView && this._enabled) {\n this._trackView.cursor = value;\n }\n }\n\n public get knobCursor(): string {\n return this._knobCursor;\n }\n\n public set knobCursor(value: string) {\n this._knobCursor = value;\n if (this._knobView && this._enabled && !this._isDragging) {\n this._knobView.cursor = value;\n }\n }\n\n // Min property\n public get min(): number {\n return this._min;\n }\n public set min(value: number) {\n this._min = value;\n this.value = this._value; // Clamp value\n }\n\n // Max property\n public get max(): number {\n return this._max;\n }\n public set max(value: number) {\n this._max = value;\n this.value = this._value; // Clamp value\n }\n\n // Utility methods\n public getTrackBounds(): { x: number; y: number; width: number; height: number } {\n const trackSize = this._getTrackSize();\n const trackThickness = this._getTrackThickness();\n\n if (this._orientation === 'horizontal') {\n return { x: 0, y: 0, width: trackSize, height: trackThickness };\n } else {\n return { x: 0, y: 0, width: trackThickness, height: trackSize };\n }\n }\n\n public getEffectiveArea(): { x: number; y: number; width: number; height: number } {\n const area = this._getEffectiveTrackArea();\n if (this._orientation === 'horizontal') {\n return {\n x: area.start,\n y: 0,\n width: area.size,\n height: this._getTrackThickness(),\n };\n } else {\n return {\n x: 0,\n y: area.start,\n width: this._getTrackThickness(),\n height: area.size,\n };\n }\n }\n\n public refreshSizes(): void {\n // Re-setup interactivity based on current view sizes\n this._setupTrackInteractivity();\n this._setupKnobInteractivity();\n this._updateKnobPosition();\n this._emitStateChange();\n }\n\n public setRange(min: number, max: number): void {\n this._min = min;\n this._max = max;\n this.value = this._value; // Re-clamp current value\n }\n\n public destroy(): void {\n // Clean up global listeners if dragging\n if (this._isDragging && this._knobView) {\n this._knobView.off('globalpointermove', this._onGlobalPointerMove);\n }\n\n // Unbind all events\n this._unbindAllEvents();\n\n this._trackView = null;\n this._knobView = null;\n this._eventsBound = false;\n\n this.removeAllListeners();\n }\n}\n","import type { Container } from 'pixi.js';\nimport { EventEmitter } from 'eventemitter3';\n\n/**\n * Events emitted by InputBehavior.\n *\n * @public\n */\nexport interface InputEvents {\n focus: () => void;\n blur: () => void;\n input: (value: string) => void;\n change: (value: string) => void;\n enter: () => void;\n esc: () => void;\n stateChanged: (state: InputState) => void;\n}\n\n/**\n * Current state of the input field.\n *\n * @public\n */\nexport interface InputState {\n /** Current text value */\n value: string;\n /** Whether input is focused */\n focused: boolean;\n /** Whether input is enabled */\n enabled: boolean;\n /** Current text selection range */\n selection: { start: number; end: number };\n}\n\n/**\n * Configuration options for InputBehavior.\n *\n * @public\n */\nexport interface InputBehaviorOptions {\n type?: 'text' | 'password' | 'number';\n multiline?: boolean;\n placeholder?: string;\n maxLength?: number;\n enabled?: boolean;\n restricted?: RegExp;\n mask?: (val: string) => string;\n}\n\n/**\n * Text input behavior using DOM input elements.\n *\n * This module provides InputBehavior for text input functionality by creating hidden DOM input\n * elements that sync with PixiJS containers. This allows native keyboard input,\n * text selection, and mobile keyboard support.\n *\n * ## Features\n *\n * - **Native Input**: Uses real DOM input/textarea elements\n * - **Text Types**: text, password, number\n * - **Multiline**: Support for textarea\n * - **Validation**: Restrict input with regex patterns\n * - **Masking**: Transform input values (e.g., phone numbers)\n * - **Mobile Support**: Native mobile keyboard\n * - **Selection**: Text selection support\n *\n * @example\n * Basic text input:\n * ```typescript\n * import { InputBehavior } from '@rb-games/core/ui/behaviors';\n *\n * const input = new InputBehavior({\n * placeholder: 'Enter your name',\n * maxLength: 50\n * });\n *\n * input.attachView(inputContainer);\n *\n * input.on('input', (value) => {\n * textDisplay.text = value;\n * });\n *\n * input.on('enter', () => {\n * submitForm();\n * });\n * ```\n *\n * @example\n * Password input:\n * ```typescript\n * const passwordInput = new InputBehavior({\n * type: 'password',\n * placeholder: 'Enter password',\n * maxLength: 32\n * });\n *\n * passwordInput.attachView(passwordContainer);\n *\n * passwordInput.on('input', (value) => {\n * passwordDisplay.text = '•'.repeat(value.length);\n * });\n * ```\n *\n * @example\n * Input with masking (phone number):\n * ```typescript\n * const phoneInput = new InputBehavior({\n * placeholder: '(555) 123-4567',\n * restricted: /[^0-9]/g,\n * mask: (val) => {\n * const digits = val.replace(/\\D/g, '');\n * if (digits.length <= 3) return digits;\n * if (digits.length <= 6) return `(${digits.slice(0, 3)}) ${digits.slice(3)}`;\n * return `(${digits.slice(0, 3)}) ${digits.slice(3, 6)}-${digits.slice(6, 10)}`;\n * }\n * });\n * ```\n *\n * @example\n * Form validation:\n * ```typescript\n * const emailInput = new InputBehavior({\n * type: 'text',\n * placeholder: 'email@example.com'\n * });\n *\n * emailInput.attachView(emailContainer);\n *\n * let isValid = false;\n * emailInput.on('input', (value) => {\n * const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n * isValid = emailRegex.test(value);\n * border.tint = isValid ? 0x00FF00 : 0xFF0000;\n * });\n *\n * emailInput.on('enter', () => {\n * if (isValid) submitEmail(emailInput.value);\n * });\n * ```\n *\n * @see {@link InputEvents} for available events\n * @see {@link InputBehaviorOptions} for configuration options\n * @see {@link InputState} for state interface\n *\n * @category UI\n * @public\n */\nexport class InputBehavior extends EventEmitter<InputEvents> {\n private _domInput: HTMLInputElement | HTMLTextAreaElement;\n private _state: InputState;\n private _options: InputBehaviorOptions;\n private _view: Container | null = null;\n\n constructor(options: InputBehaviorOptions = {}) {\n super();\n this._options = options;\n // Generate GUID\n const guid = 'input-' + Math.random().toString(36).slice(2, 11);\n // Create DOM input\n if (options.multiline) {\n this._domInput = document.createElement('textarea');\n } else {\n this._domInput = document.createElement('input');\n this._domInput.type = options.type || 'text';\n }\n this._domInput.id = guid;\n this._domInput.name = guid;\n this._domInput.style.position = 'fixed';\n this._domInput.style.opacity = '0.000001';\n this._domInput.style.border = 'none';\n this._domInput.style.outline = 'none';\n this._domInput.placeholder = options.placeholder || '';\n if (options.maxLength) this._domInput.maxLength = options.maxLength;\n document.body.appendChild(this._domInput);\n this._state = {\n value: '',\n focused: false,\n enabled: options.enabled !== false,\n selection: { start: 0, end: 0 },\n };\n // DOM events\n this._domInput.addEventListener('focus', () => {\n this._state.focused = true;\n this.emit('focus');\n this.emit('stateChanged', this._state);\n });\n this._domInput.addEventListener('blur', () => {\n this._state.focused = false;\n this.emit('blur');\n this.emit('stateChanged', this._state);\n });\n this._domInput.addEventListener('input', () => {\n let val = this._domInput.value;\n if (options.restricted) {\n val = val.replace(options.restricted, '');\n this._domInput.value = val;\n }\n if (options.mask) {\n this._domInput.value = options.mask(val);\n }\n this._state.value = val;\n this.emit('input', val);\n this.emit('stateChanged', this._state);\n });\n this._domInput.addEventListener('change', () => {\n this.emit('change', this._domInput.value);\n });\n this._domInput.addEventListener('keydown', (e: Event) => {\n const ke = e as KeyboardEvent;\n if (ke.key === 'Enter') this.emit('enter');\n if (ke.key === 'Escape') this.emit('esc');\n });\n }\n\n public attachView(view: Container): void {\n if (this._view === view) return;\n if (this._view) {\n this._view.off('pointerdown', this._onViewPointerDown);\n }\n this._view = view;\n this._view.on('pointerdown', this._onViewPointerDown);\n this.updateDomPosition();\n }\n\n private _onViewPointerDown = () => {\n this.activateView();\n };\n\n public detachView(): void {\n if (this._view) {\n this._view.off('pointerdown', this._onViewPointerDown);\n }\n this._view = null;\n }\n\n public get hasView(): boolean {\n return !!this._view;\n }\n\n public get view(): Container | null {\n return this._view;\n }\n\n private focus(): void {\n this._domInput.focus();\n }\n\n private blur(): void {\n this._domInput.blur();\n }\n\n public setValue(val: string): void {\n if (this._options.restricted) {\n val = val.replace(this._options.restricted, '');\n }\n this._domInput.value = val;\n this._state.value = val;\n this.emit('stateChanged', this._state);\n }\n\n public get value(): string {\n return this._state.value;\n }\n\n public set enabled(val: boolean) {\n this._state.enabled = val;\n this._domInput.disabled = !val;\n this.emit('stateChanged', this._state);\n }\n\n public get enabled(): boolean {\n return this._state.enabled;\n }\n\n public setSelection(start: number, end: number): void {\n this._domInput.setSelectionRange(start, end);\n this._state.selection = { start, end };\n this.emit('stateChanged', this._state);\n }\n\n // Position the input according to the view coordinates\n public updateDomPosition(): void {\n if (!this._view) return;\n const bounds = this._view.getBounds();\n this._domInput.style.left = `${bounds.x}px`;\n this._domInput.style.top = `${bounds.y}px`;\n this._domInput.style.width = `${bounds.width}px`;\n this._domInput.style.height = `${bounds.height}px`;\n }\n\n public activateView(): void {\n this.updateDomPosition();\n this.focus();\n }\n\n public destroy(): void {\n this._domInput.remove();\n this.removeAllListeners();\n }\n}\n","/**\n * Utility functions for object manipulation and property access.\n */\n\n/**\n * Gets a nested property value from an object using a dot-separated path.\n * \n * @param obj - The source object\n * @param path - Dot-separated path to the nested property (e.g., 'user.profile.name')\n * @returns The value at the specified path, or undefined if any part of the path doesn't exist\n * \n * @example\n * ```typescript\n * const obj = { user: { profile: { name: 'John' } } };\n * const name = getNestedValue(obj, 'user.profile.name'); // Returns 'John'\n * const age = getNestedValue(obj, 'user.profile.age'); // Returns undefined\n * ```\n */\nexport function getNestedValue(obj: any, path: string): any {\n return path.split('.').reduce((current, key) => current?.[key], obj);\n}\n\n/**\n * Sets a nested property value in an object using a dot-separated path.\n * Creates intermediate objects if they don't exist.\n * \n * @param obj - The target object\n * @param path - Dot-separated path to the nested property (e.g., 'user.profile.name')\n * @param value - The value to set\n * \n * @example\n * ```typescript\n * const obj = {};\n * setNestedValue(obj, 'user.profile.name', 'John');\n * // Result: { user: { profile: { name: 'John' } } }\n * ```\n */\nexport function setNestedValue(obj: any, path: string, value: any): void {\n const keys = path.split('.');\n const lastKey = keys.pop()!;\n const target = keys.reduce((current, key) => {\n if (current[key] === undefined || current[key] === null) {\n current[key] = {};\n }\n return current[key];\n }, obj);\n target[lastKey] = value;\n}\n\n/**\n * Checks if a nested property exists in an object using a dot-separated path.\n * \n * @param obj - The object to check\n * @param path - Dot-separated path to the nested property\n * @returns true if the property exists, false otherwise\n * \n * @example\n * ```typescript\n * const obj = { user: { profile: { name: 'John' } } };\n * const hasName = hasNestedProperty(obj, 'user.profile.name'); // Returns true\n * const hasAge = hasNestedProperty(obj, 'user.profile.age'); // Returns false\n * ```\n */\nexport function hasNestedProperty(obj: any, path: string): boolean {\n return getNestedValue(obj, path) !== undefined;\n}\n\n/**\n * Deep clones an object using structured cloning.\n * \n * @param obj - The object to clone\n * @returns A deep copy of the object\n * \n * @example\n * ```typescript\n * const original = { user: { profile: { name: 'John' } } };\n * const cloned = deepClone(original);\n * cloned.user.profile.name = 'Jane'; // Doesn't affect original\n * ```\n */\nexport function deepClone<T>(obj: T): T {\n return structuredClone(obj);\n}","import { merge } from 'lodash';\nimport { getNestedValue } from '../../utils/ObjectUtils';\n\nexport type Constructor<T = {}> = new (...args: any[]) => T;\n\nconst SKIN = Symbol('skinData');\n\nexport function Skinable<TSkinData, TBase extends Constructor>(Base: TBase) {\n class SkinableClass extends Base {\n private [SKIN]: TSkinData | null = null;\n // Optional hook implementable by subclasses\n protected skinApply?: (skin: TSkinData | null) => void;\n\n // Overloads for better DX in consumers\n public setSkinData(data: TSkinData | null, opts?: { mergeWithExisting?: false }): void;\n public setSkinData(data: Partial<TSkinData> | null, opts: { mergeWithExisting: true }): void;\n public setSkinData(\n data: TSkinData | Partial<TSkinData> | null,\n opts: { mergeWithExisting?: boolean } = {},\n ): void {\n const { mergeWithExisting = false } = opts;\n\n if (data === null) {\n (this as any)[SKIN] = null;\n this.skinApply?.(null as any);\n return;\n }\n\n const current = (this as any)[SKIN] as TSkinData | null;\n if (mergeWithExisting && current) {\n (this as any)[SKIN] = merge({}, current, data as Partial<TSkinData>) as TSkinData;\n } else {\n (this as any)[SKIN] = merge({}, data as TSkinData) as TSkinData;\n }\n\n this.skinApply?.(((this as any)[SKIN] as TSkinData) ?? null);\n }\n\n protected getSkinData(): TSkinData | null {\n return (this as any)[SKIN] as TSkinData | null;\n }\n\n // Subclasses should implement:\n // protected skinApply?(skin: TSkinData | null): void\n }\n\n type SkinableMethods = {\n setSkinData: (\n data: TSkinData | Partial<TSkinData> | null,\n opts?: { mergeWithExisting?: boolean },\n ) => void;\n getSkinData: () => TSkinData | null;\n };\n\n return SkinableClass as unknown as new (\n ...args: ConstructorParameters<TBase>\n ) => InstanceType<TBase> & SkinableMethods;\n}\n\n/**\n * Deep merges two skin data objects, combining their properties recursively.\n *\n * This utility function is used to merge global skin data with component-specific\n * skin data, allowing components to override or extend global skin properties.\n *\n * The merge behavior:\n * - For primitive values and arrays: `b` overrides `a`\n * - For nested objects: recursively merges properties from both objects\n * - Properties only in `a` are preserved\n * - Properties only in `b` are added\n * - Properties in both are merged (objects) or overridden (primitives/arrays)\n *\n * @template A - Type of the first skin data object\n * @template B - Type of the second skin data object\n * @param a - Base skin data object (typically global skin)\n * @param b - Override skin data object (typically component-specific skin)\n * @returns Merged skin data with type `A & B`\n *\n * @example\n * Merging global and component-specific skin data:\n * ```typescript\n * const globalSkin = {\n * colors: { primary: 0xFF0000, secondary: 0x00FF00 },\n * sizes: { width: 100, height: 50 }\n * };\n *\n * const componentSkin = {\n * colors: { primary: 0x0000FF }, // Override primary color\n * padding: 10 // Add new property\n * };\n *\n * const merged = mergeSkins(globalSkin, componentSkin);\n * // Result: {\n * // colors: { primary: 0x0000FF, secondary: 0x00FF00 },\n * // sizes: { width: 100, height: 50 },\n * // padding: 10\n * // }\n * ```\n *\n * @example\n * Usage in component initialization:\n * ```typescript\n * const globalSkin = BaseReel.globalSkin() || null;\n * const effectiveSkin = options.skinData\n * ? globalSkin\n * ? mergeSkins(globalSkin, options.skinData)\n * : options.skinData\n * : globalSkin;\n * ```\n *\n * @public\n */\nexport const mergeSkins = <A extends Record<string, any>, B extends Record<string, any>>(\n a: A,\n b: B,\n): A & B => {\n const out: any = { ...a };\n for (const k of Object.keys(b)) {\n const av = (a as any)?.[k];\n const bv = (b as any)[k];\n if (\n av &&\n bv &&\n typeof av === 'object' &&\n !Array.isArray(av) &&\n typeof bv === 'object' &&\n !Array.isArray(bv)\n ) {\n out[k] = mergeSkins(av, bv);\n } else {\n out[k] = bv;\n }\n }\n return out as A & B;\n};\n\n/**\n * Creates a static global skin accessor function with getter/setter overloads.\n *\n * This factory function generates a closure-based global skin management system\n * for component classes. Each call creates an isolated state container that can\n * store and retrieve global skin data for a specific component type.\n *\n * The returned function supports two modes:\n * - **Getter mode** (no arguments): Returns the current global skin or null\n * - **Setter mode** (with argument): Sets the global skin to the provided value\n *\n * @template TSkinData - Type of the skin data object to be managed\n * @returns A function with getter/setter overloads for managing global skin state\n *\n * @example\n * Basic usage in a component class:\n * ```typescript\n * export class SlotSymbol extends Skinable<SlotSymbolSkinData, typeof Container>(Container) {\n * public static globalSkin = defineGlobalSkin<SlotSymbolSkinData>();\n *\n * constructor(options: SlotSymbolOptions = {}) {\n * super();\n * // Use the global skin in constructor\n * const effectiveSkin = mergeGlobalAndInstanceSkin(\n * () => SlotSymbol.globalSkin(),\n * options.skinData\n * );\n * this.setSkinData(effectiveSkin, { mergeWithExisting: false });\n * }\n * }\n * ```\n *\n * @example\n * Setting and getting global skin:\n * ```typescript\n * // Set global skin for all instances\n * SlotSymbol.globalSkin({\n * common: { fps: 24 },\n * bounds: { width: 200, height: 200 }\n * });\n *\n * // Get current global skin\n * const currentSkin = SlotSymbol.globalSkin();\n *\n * // Clear global skin\n * SlotSymbol.globalSkin(null);\n * ```\n *\n * @public\n */\nexport function defineGlobalSkin<TSkinData>() {\n let _globalSkin: TSkinData | null = null;\n\n function globalSkin(): TSkinData | null;\n function globalSkin(skin: TSkinData | null): void;\n function globalSkin(skin?: TSkinData | null): TSkinData | null | void {\n if (arguments.length === 0) return _globalSkin;\n _globalSkin = skin ?? null;\n }\n\n return globalSkin;\n}\n\n/**\n * Merges global skin data with instance-specific skin data.\n *\n * This utility function combines global and instance skin configurations,\n * giving priority to instance-specific values while preserving global defaults.\n * It handles three scenarios:\n * 1. Both global and instance skins exist: Deep merge them (instance overrides global)\n * 2. Only instance skin exists: Use instance skin\n * 3. Only global skin exists (or neither): Use global skin or null\n *\n * @template TSkinData - Type of the skin data object\n * @param globalSkinGetter - Function that returns the global skin (typically a static method reference)\n * @param instanceSkin - Optional instance-specific skin data to merge with global skin\n * @returns The effective skin data after merging, or null if no skin is available\n *\n * @example\n * Usage in component constructor:\n * ```typescript\n * constructor(options: SlotSymbolOptions = {}) {\n * super();\n *\n * // Merge global and instance skins\n * const effectiveSkin = mergeGlobalAndInstanceSkin(\n * () => SlotSymbol.globalSkin(),\n * options.skinData\n * );\n *\n * this.setSkinData(effectiveSkin, { mergeWithExisting: false });\n * }\n * ```\n *\n * @example\n * Behavior with different input combinations:\n * ```typescript\n * // Scenario 1: Both exist - deep merge\n * SlotSymbol.globalSkin({ common: { fps: 12 }, bounds: { width: 100, height: 100 } });\n * const skin1 = mergeGlobalAndInstanceSkin(\n * () => SlotSymbol.globalSkin(),\n * { common: { fps: 24 } }\n * );\n * // Result: { common: { fps: 24 }, bounds: { width: 100, height: 100 } }\n *\n * // Scenario 2: Only instance exists\n * SlotSymbol.globalSkin(null);\n * const skin2 = mergeGlobalAndInstanceSkin(\n * () => SlotSymbol.globalSkin(),\n * { common: { fps: 24 } }\n * );\n * // Result: { common: { fps: 24 } }\n *\n * // Scenario 3: Only global exists\n * SlotSymbol.globalSkin({ common: { fps: 12 } });\n * const skin3 = mergeGlobalAndInstanceSkin(\n * () => SlotSymbol.globalSkin(),\n * null\n * );\n * // Result: { common: { fps: 12 } }\n * ```\n *\n * @see {@link defineGlobalSkin} for creating global skin accessors\n * @see {@link mergeSkins} for the underlying deep merge implementation\n *\n * @public\n */\nexport function mergeGlobalAndInstanceSkin<TSkinData>(\n globalSkinGetter: () => TSkinData | null,\n instanceSkin?: TSkinData | null,\n): TSkinData | null {\n const globalSkin = globalSkinGetter() || null;\n const effectiveSkin = instanceSkin\n ? globalSkin\n ? mergeSkins(globalSkin, instanceSkin)\n : instanceSkin\n : globalSkin;\n return effectiveSkin || null;\n}\n\n/**\n * Helper function to apply layout mappings using property mapping approach.\n * Used in skinApply methods to reduce repetitive if statements.\n *\n * @param skin - The skin data object\n * @param mappings - Array of path-target mappings for layout properties\n *\n * @example\n * ```typescript\n * const layoutMappings = [\n * { path: 'section.layout', target: () => this.section },\n * { path: 'title.layout', target: () => this.title }\n * ];\n * applyLayoutMappings(skin, layoutMappings);\n * ```\n */\nexport function applyLayoutMappings<TSkinData>(\n skin: TSkinData,\n mappings: Array<{ path: string; target: () => any }>,\n): void {\n mappings.forEach(({ path, target }) => {\n const value = getNestedValue(skin, path);\n if (value !== undefined) {\n target().layout = value;\n }\n });\n}\n\n/**\n * Helper function to apply style mappings using property mapping approach.\n * Used in skinApply methods to reduce repetitive if statements.\n *\n * @param skin - The skin data object\n * @param mappings - Array of path-target mappings for style properties\n *\n * @example\n * ```typescript\n * const styleMappings = [\n * { path: 'title.textStyle', target: () => this.title },\n * { path: 'label.textStyle', target: () => this.label }\n * ];\n * applyStyleMappings(skin, styleMappings);\n * ```\n */\nexport function applyStyleMappings<TSkinData>(\n skin: TSkinData,\n mappings: Array<{ path: string; target: () => any }>,\n): void {\n mappings.forEach(({ path, target }) => {\n const value = getNestedValue(skin, path);\n if (value !== undefined) {\n target().style = value;\n }\n });\n}\n\n/**\n * Helper function to apply text mappings using property mapping approach.\n * Used in skinApply methods to reduce repetitive if statements.\n *\n * @param skin - The skin data object\n * @param mappings - Array of path-target mappings for text properties\n *\n * @example\n * ```typescript\n * const textMappings = [\n * { path: 'title.text', target: () => this.title },\n * { path: 'label.text', target: () => this.label }\n * ];\n * applyTextMappings(skin, textMappings);\n * ```\n */\nexport function applyTextMappings<TSkinData>(\n skin: TSkinData,\n mappings: Array<{ path: string; target: () => any }>,\n): void {\n mappings.forEach(({ path, target }) => {\n const value = getNestedValue(skin, path);\n if (value !== undefined) {\n target().text = value;\n }\n });\n}\n\n/**\n * Helper function to apply skin mappings using property mapping approach.\n * Used in skinApply methods to reduce repetitive if statements.\n *\n * @param skin - The skin data object\n * @param mappings - Array of path-target mappings for skin properties\n *\n * @example\n * ```typescript\n * const skinMappings = [\n * { path: 'buttonSkin', target: () => this.button },\n * { path: 'panelSkin', target: () => this.panel }\n * ];\n * applySkinMappings(skin, skinMappings);\n * ```\n */\nexport function applySkinMappings<TSkinData>(\n skin: TSkinData,\n mappings: Array<{ path: string; target: () => any }>,\n mergeWithExisting?: boolean\n): void {\n mappings.forEach(({ path, target }) => {\n const value = getNestedValue(skin, path);\n if (value !== undefined) {\n target().setSkinData(value, { mergeWithExisting: mergeWithExisting ?? false });\n }\n });\n}\n","export type TextRun = {\n text: string;\n fontIndex: number;\n tint?: number;\n scale?: number;\n};\n\nexport type BBCodeParseOptions = {\n defaultFontIndex?: number;\n aliases?: Record<string, number | string>;\n fonts?: string[];\n};\n\ntype RunStyle = {\n fontIndex: number;\n tint?: number;\n scale?: number;\n};\n\ntype ActiveTag = 'font' | 'tint' | 'scale';\n\nconst DEFAULT_STYLE = (defaultFontIndex: number): RunStyle => ({\n fontIndex: defaultFontIndex,\n});\n\nexport function parseColorValue(value: string): number | undefined {\n const trimmed = value.trim();\n if (trimmed.startsWith('#')) {\n const hex = trimmed.slice(1);\n if (hex.length === 3) {\n const r = parseInt(hex[0] + hex[0], 16);\n const g = parseInt(hex[1] + hex[1], 16);\n const b = parseInt(hex[2] + hex[2], 16);\n return (r << 16) + (g << 8) + b;\n }\n if (hex.length === 6) {\n return parseInt(hex, 16);\n }\n }\n if (trimmed.startsWith('0x') || trimmed.startsWith('0X')) {\n return parseInt(trimmed, 16);\n }\n return undefined;\n}\n\nexport function resolveFontIndex(\n value: string,\n options: BBCodeParseOptions,\n): number {\n const trimmed = value.trim();\n const fonts = options.fonts ?? [];\n const defaultIndex = options.defaultFontIndex ?? 0;\n\n const numericIndex = Number(trimmed);\n if (!Number.isNaN(numericIndex) && Number.isInteger(numericIndex)) {\n if (numericIndex >= 0 && numericIndex < fonts.length) {\n return numericIndex;\n }\n return defaultIndex;\n }\n\n const aliases = options.aliases ?? {};\n const aliasTarget = aliases[trimmed];\n if (aliasTarget !== undefined) {\n if (typeof aliasTarget === 'number') {\n if (aliasTarget >= 0 && aliasTarget < fonts.length) {\n return aliasTarget;\n }\n return defaultIndex;\n }\n const fontIndex = fonts.indexOf(aliasTarget);\n return fontIndex >= 0 ? fontIndex : defaultIndex;\n }\n\n const directIndex = fonts.indexOf(trimmed);\n return directIndex >= 0 ? directIndex : defaultIndex;\n}\n\nfunction parseFontAttributes(attrString: string, options: BBCodeParseOptions): RunStyle {\n const style: RunStyle = { fontIndex: options.defaultFontIndex ?? 0 };\n const tokens = attrString.trim().split(/\\s+/).filter(Boolean);\n let fontSet = false;\n\n for (const token of tokens) {\n const eqIdx = token.indexOf('=');\n if (eqIdx === -1) {\n if (!fontSet) {\n style.fontIndex = resolveFontIndex(token, options);\n fontSet = true;\n }\n continue;\n }\n\n const key = token.slice(0, eqIdx);\n const val = token.slice(eqIdx + 1);\n if (key === 'font') {\n style.fontIndex = resolveFontIndex(val, options);\n fontSet = true;\n } else if (key === 'tint') {\n style.tint = parseColorValue(val);\n } else if (key === 'scale') {\n const scale = parseFloat(val);\n if (!Number.isNaN(scale)) {\n style.scale = scale;\n }\n }\n }\n\n if (!fontSet && tokens.length === 1 && tokens[0].includes('=') === false) {\n style.fontIndex = resolveFontIndex(tokens[0], options);\n }\n\n return style;\n}\n\nfunction parseOpenTag(\n tagContent: string,\n options: BBCodeParseOptions,\n): { tagType: ActiveTag; style: RunStyle } | null {\n const defaultFontIndex = options.defaultFontIndex ?? 0;\n\n if (tagContent.startsWith('font=')) {\n return {\n tagType: 'font',\n style: parseFontAttributes(tagContent.slice(5), options),\n };\n }\n\n if (tagContent.startsWith('tint=')) {\n const tint = parseColorValue(tagContent.slice(5));\n return {\n tagType: 'tint',\n style: { fontIndex: defaultFontIndex, tint },\n };\n }\n\n if (tagContent.startsWith('scale=')) {\n const scale = parseFloat(tagContent.slice(6));\n return {\n tagType: 'scale',\n style: {\n fontIndex: defaultFontIndex,\n scale: Number.isNaN(scale) ? undefined : scale,\n },\n };\n }\n\n return null;\n}\n\nfunction mergeAdjacentRuns(runs: TextRun[]): TextRun[] {\n if (runs.length === 0) return runs;\n\n const merged: TextRun[] = [];\n let current = { ...runs[0] };\n\n for (let i = 1; i < runs.length; i++) {\n const next = runs[i];\n if (\n current.fontIndex === next.fontIndex &&\n current.tint === next.tint &&\n current.scale === next.scale\n ) {\n current.text += next.text;\n } else {\n merged.push(current);\n current = { ...next };\n }\n }\n\n merged.push(current);\n return merged;\n}\n\nexport function parseSpriteTextBBCode(input: string, options: BBCodeParseOptions = {}): TextRun[] {\n const defaultFontIndex = options.defaultFontIndex ?? 0;\n const runs: TextRun[] = [];\n let buffer = '';\n let currentStyle: RunStyle = DEFAULT_STYLE(defaultFontIndex);\n let activeTag: ActiveTag | null = null;\n\n const flush = (): void => {\n if (buffer.length === 0) return;\n runs.push({\n text: buffer,\n fontIndex: currentStyle.fontIndex,\n tint: currentStyle.tint,\n scale: currentStyle.scale,\n });\n buffer = '';\n };\n\n let i = 0;\n while (i < input.length) {\n if (input[i] === '\\\\' && input[i + 1] === '[') {\n buffer += '[';\n i += 2;\n continue;\n }\n\n if (input[i] !== '[') {\n buffer += input[i];\n i += 1;\n continue;\n }\n\n const closeIdx = input.indexOf(']', i);\n if (closeIdx === -1) {\n buffer += input[i];\n i += 1;\n continue;\n }\n\n const tagContent = input.slice(i + 1, closeIdx);\n\n if (tagContent.startsWith('/')) {\n const closeTag = tagContent.slice(1) as ActiveTag;\n if (activeTag !== null && closeTag === activeTag) {\n flush();\n activeTag = null;\n currentStyle = DEFAULT_STYLE(defaultFontIndex);\n } else {\n buffer += input.slice(i, closeIdx + 1);\n }\n } else {\n const parsed = parseOpenTag(tagContent, options);\n if (parsed) {\n flush();\n activeTag = parsed.tagType;\n currentStyle = parsed.style;\n } else {\n buffer += input.slice(i, closeIdx + 1);\n }\n }\n\n i = closeIdx + 1;\n }\n\n flush();\n return mergeAdjacentRuns(runs);\n}\n\nfunction isKnownBBCodeTag(tagContent: string): boolean {\n if (tagContent.startsWith('/')) {\n const closeTag = tagContent.slice(1);\n return closeTag === 'font' || closeTag === 'tint' || closeTag === 'scale';\n }\n\n return (\n tagContent.startsWith('font=') ||\n tagContent.startsWith('tint=') ||\n tagContent.startsWith('scale=')\n );\n}\n\nexport function stripSpriteTextBBCode(input: string): string {\n let result = '';\n let i = 0;\n\n while (i < input.length) {\n if (input[i] === '\\\\' && input[i + 1] === '[') {\n result += '[';\n i += 2;\n continue;\n }\n\n if (input[i] !== '[') {\n result += input[i];\n i += 1;\n continue;\n }\n\n const closeIdx = input.indexOf(']', i);\n if (closeIdx === -1) {\n result += input[i];\n i += 1;\n continue;\n }\n\n const tagContent = input.slice(i + 1, closeIdx);\n if (!isKnownBBCodeTag(tagContent)) {\n result += input.slice(i, closeIdx + 1);\n }\n\n i = closeIdx + 1;\n }\n\n return result;\n}\n","import type { KerningPair } from './SpriteText.types';\n\nexport function kerningKey(firstCode: number, secondCode: number): string {\n return `${firstCode}_${secondCode}`;\n}\n\nexport function charPairToKey(first: string, second: string): string {\n return kerningKey(first.charCodeAt(0), second.charCodeAt(0));\n}\n\nexport function codesToKey(first: number | string, second: number | string): string {\n const firstCode = typeof first === 'string' ? first.charCodeAt(0) : first;\n const secondCode = typeof second === 'string' ? second.charCodeAt(0) : second;\n return kerningKey(firstCode, secondCode);\n}\n\nexport function getKerningFromMap(\n map: Map<string, number>,\n first: string,\n second: string,\n): number {\n return map.get(charPairToKey(first, second)) ?? 0;\n}\n\nexport function applyKerningPairs(\n map: Map<string, number>,\n pairs: KerningPair[] | Record<string, number>,\n): void {\n map.clear();\n\n if (Array.isArray(pairs)) {\n for (const pair of pairs) {\n map.set(kerningKey(pair.first, pair.second), pair.amount);\n }\n return;\n }\n\n for (const [chars, amount] of Object.entries(pairs)) {\n if (chars.length === 2) {\n map.set(charPairToKey(chars[0], chars[1]), amount);\n }\n }\n}\n","import { Assets, Texture } from 'pixi.js';\nimport type { CharMeta, ResolvedFontStyle } from './SpriteText.types';\n\nexport type TextureResolverContext = {\n fonts: string[];\n glyphMap: Record<string, string>;\n fixedWidth: boolean | string | Record<string, string>;\n fontStyles: ResolvedFontStyle[];\n getFontStyle: (fontIndex: number) => ResolvedFontStyle | undefined;\n};\n\nexport function resolveCharTexture(\n char: string,\n fontIndex: number,\n ctx: TextureResolverContext,\n): Texture | null {\n try {\n if (char === '\\n' || char === '\\r' || char === '\\t') {\n return null;\n }\n\n const font = ctx.fonts[fontIndex] ?? ctx.fonts[0];\n if (!font) return null;\n\n const fontStyle = ctx.getFontStyle(fontIndex);\n const glyphMap = fontStyle?.glyphMap ?? ctx.glyphMap;\n\n let textureName: string;\n if (glyphMap[char]) {\n textureName = `${font}/${glyphMap[char]}`;\n } else {\n textureName = `${font}/${char.charCodeAt(0)}`;\n }\n\n const texture = Assets.get(textureName);\n if (!texture || texture === Texture.EMPTY) {\n return null;\n }\n\n return texture;\n } catch {\n return null;\n }\n}\n\nexport function resolveRefWidth(\n char: string,\n fontIndex: number,\n ctx: TextureResolverContext,\n): number {\n const fontStyle = ctx.getFontStyle(fontIndex);\n const fixedWidth = fontStyle?.fixedWidth ?? ctx.fixedWidth;\n\n if (fixedWidth === false) {\n return 0;\n }\n\n if (fixedWidth === true) {\n const refTexture = resolveCharTexture('0', fontIndex, ctx);\n return refTexture?.width ?? 0;\n }\n\n if (typeof fixedWidth === 'string') {\n const refTexture = resolveCharTexture(fixedWidth, fontIndex, ctx);\n return refTexture?.width ?? 0;\n }\n\n if (typeof fixedWidth === 'object' && fixedWidth !== null) {\n for (const [pattern, refChar] of Object.entries(fixedWidth)) {\n try {\n const regex = new RegExp(pattern);\n if (regex.test(char)) {\n const refTexture = resolveCharTexture(refChar, fontIndex, ctx);\n return refTexture?.width ?? 0;\n }\n } catch {\n continue;\n }\n }\n }\n\n return 0;\n}\n\nexport function measureCharMetaWidth(\n meta: CharMeta,\n ctx: TextureResolverContext & { glyphScale: number; spaceWidth: number },\n): number {\n const effectiveScale = ctx.glyphScale * meta.runScale;\n\n if (meta.char === ' ') {\n const refTexture = resolveCharTexture('0', meta.fontIndex, ctx);\n return (refTexture?.width ?? 0) * effectiveScale * ctx.spaceWidth;\n }\n\n if (meta.char === '\\n') {\n return 0;\n }\n\n if (meta.char === '\\t') {\n const refTexture = resolveCharTexture('0', meta.fontIndex, ctx);\n return (refTexture?.width ?? 0) * effectiveScale * ctx.spaceWidth * 4;\n }\n\n const texture = resolveCharTexture(meta.char, meta.fontIndex, ctx);\n if (!texture) return 0;\n\n const refWidth = resolveRefWidth(meta.char, meta.fontIndex, ctx);\n const width = refWidth > 0 ? refWidth : texture.width;\n return width * effectiveScale;\n}\n","import type { CharMeta } from './SpriteText.types';\n\nexport type WrapContext = {\n wordWrapWidth: number;\n scaleX: number;\n breakWord: boolean;\n getCharMetaWidth: (meta: CharMeta) => number;\n letterSpacing: number;\n glyphScale: number;\n kerningEnabled: boolean;\n getKerning: (first: string, second: string) => number;\n};\n\nexport function measureCharMetasWidth(metas: CharMeta[], ctx: WrapContext): number {\n let width = 0;\n\n for (let i = 0; i < metas.length; i++) {\n width += ctx.getCharMetaWidth(metas[i]);\n width += ctx.letterSpacing * ctx.glyphScale;\n\n if (ctx.kerningEnabled && i < metas.length - 1) {\n const current = metas[i];\n const next = metas[i + 1];\n if (current.fontIndex === next.fontIndex) {\n width += ctx.getKerning(current.char, next.char) * ctx.glyphScale;\n }\n }\n }\n\n return width;\n}\n\n// Re-export run helpers from same file structure - keep wrap file complete\nimport type { TextRun } from '../SpriteTextBBCode';\n\nexport function runsToMetas(runs: TextRun[]): CharMeta[] {\n const metas: CharMeta[] = [];\n\n for (const run of runs) {\n const runScale = run.scale ?? 1;\n for (const char of run.text) {\n metas.push({\n char,\n fontIndex: run.fontIndex,\n tint: run.tint,\n runScale,\n });\n }\n }\n\n return metas;\n}\n\nexport function metasToRuns(metas: CharMeta[]): TextRun[] {\n if (metas.length === 0) return [];\n\n const runs: TextRun[] = [];\n let current: TextRun = {\n text: metas[0].char,\n fontIndex: metas[0].fontIndex,\n tint: metas[0].tint,\n scale: metas[0].runScale,\n };\n\n for (let i = 1; i < metas.length; i++) {\n const meta = metas[i];\n if (\n current.fontIndex === meta.fontIndex &&\n current.tint === meta.tint &&\n current.scale === meta.runScale\n ) {\n current.text += meta.char;\n } else {\n runs.push(current);\n current = {\n text: meta.char,\n fontIndex: meta.fontIndex,\n tint: meta.tint,\n scale: meta.runScale,\n };\n }\n }\n\n runs.push(current);\n return runs;\n}\n\nexport function mergeRunLinesWithNewlines(lines: TextRun[][]): TextRun[] {\n const merged: TextRun[] = [];\n\n lines.forEach((line, lineIndex) => {\n if (lineIndex > 0) {\n merged.push({ text: '\\n', fontIndex: 0, scale: 1 });\n }\n merged.push(...line);\n });\n\n return merged;\n}\n\nexport function wrapCharMetas(metas: CharMeta[], ctx: WrapContext): CharMeta[][] {\n const lines: CharMeta[][] = [];\n let currentLine: CharMeta[] = [];\n let currentWord: CharMeta[] = [];\n\n const measureLine = (line: CharMeta[]) => measureCharMetasWidth(line, ctx);\n\n const flushWord = (): void => {\n if (currentWord.length === 0) return;\n\n const testLine = [...currentLine, ...currentWord];\n if (measureLine(testLine) > ctx.wordWrapWidth / ctx.scaleX && currentLine.length > 0) {\n lines.push(currentLine);\n currentLine = [...currentWord];\n } else {\n currentLine.push(...currentWord);\n }\n\n currentWord = [];\n };\n\n for (const meta of metas) {\n if (meta.char === '\\n') {\n flushWord();\n lines.push(currentLine);\n currentLine = [];\n continue;\n }\n\n if (meta.char === ' ') {\n flushWord();\n currentLine.push(meta);\n continue;\n }\n\n if (ctx.breakWord && currentWord.length === 0 && currentLine.length > 0) {\n const testWord = [meta];\n if (measureLine([...currentLine, ...testWord]) > ctx.wordWrapWidth / ctx.scaleX) {\n lines.push(currentLine);\n currentLine = [];\n }\n }\n\n currentWord.push(meta);\n\n if (ctx.breakWord && currentWord.length > 1) {\n const testLine = [...currentLine, ...currentWord];\n if (measureLine(testLine) > ctx.wordWrapWidth / ctx.scaleX) {\n const overflowChar = currentWord.pop();\n if (currentWord.length > 0) {\n flushWord();\n }\n if (overflowChar) {\n currentWord = [overflowChar];\n }\n }\n }\n }\n\n flushWord();\n if (currentLine.length > 0) {\n lines.push(currentLine);\n }\n\n return lines.length > 0 ? lines : [[]];\n}\n\nexport function wrapRuns(runs: TextRun[], ctx: WrapContext): TextRun[][] {\n const metas = runsToMetas(runs);\n const lines = wrapCharMetas(metas, ctx);\n return lines.map((line) => metasToRuns(line));\n}\n","export type Point2D = { x: number; y: number };\n\nexport type ArcLengthEntry = { t: number; length: number };\n\nexport function getBezierPoint(\n t: number,\n p0: Point2D,\n p1: Point2D,\n p2: Point2D,\n): Point2D {\n const mt = 1 - t;\n const mt2 = mt * mt;\n const t2 = t * t;\n\n return {\n x: mt2 * p0.x + 2 * mt * t * p1.x + t2 * p2.x,\n y: mt2 * p0.y + 2 * mt * t * p1.y + t2 * p2.y,\n };\n}\n\nexport function getBezierTangent(\n t: number,\n p0: Point2D,\n p1: Point2D,\n p2: Point2D,\n): number {\n const mt = 1 - t;\n\n const dx = 2 * mt * (p1.x - p0.x) + 2 * t * (p2.x - p1.x);\n const dy = 2 * mt * (p1.y - p0.y) + 2 * t * (p2.y - p1.y);\n\n return Math.atan2(dy, dx);\n}\n\nexport function buildBezierArcLengthTable(\n p0: Point2D,\n p1: Point2D,\n p2: Point2D,\n samples = 64,\n): ArcLengthEntry[] {\n const table: ArcLengthEntry[] = [{ t: 0, length: 0 }];\n let accum = 0;\n let prev = p0;\n\n for (let i = 1; i <= samples; i++) {\n const t = i / samples;\n const point = getBezierPoint(t, p0, p1, p2);\n accum += Math.hypot(point.x - prev.x, point.y - prev.y);\n table.push({ t, length: accum });\n prev = point;\n }\n\n return table;\n}\n\nexport const CURVE_WIDTH_BULGE_RATIO = 0.2;\nexport const CURVE_SPREAD_FACTOR = 0.65;\n\nexport function computeCurveBulge(\n lineWidth: number,\n lineHeight: number,\n controlYPercent: number,\n): number {\n const magnitude = Math.abs(controlYPercent);\n return Math.min(lineHeight * magnitude, lineWidth * magnitude * CURVE_WIDTH_BULGE_RATIO);\n}\n\nexport function computeCurveSpread(\n lineWidth: number,\n lineHeight: number,\n controlYPercent: number,\n): number {\n const bulge = computeCurveBulge(lineWidth, lineHeight, controlYPercent);\n const bulgeRatio = bulge / Math.max(lineWidth, 1);\n return 1 + bulgeRatio * CURVE_SPREAD_FACTOR;\n}\n\nexport function computeProportionalArcLength(\n centerFraction: number,\n totalArcLength: number,\n spread: number,\n): number {\n const spreadFraction = 0.5 + (centerFraction - 0.5) * spread;\n const clampedFraction = Math.min(Math.max(spreadFraction, 0), 1);\n return clampedFraction * totalArcLength;\n}\n\nexport function getRotatedOffset(\n localX: number,\n localY: number,\n rotation: number,\n): Point2D {\n const cos = Math.cos(rotation);\n const sin = Math.sin(rotation);\n\n return {\n x: localX * cos - localY * sin,\n y: localX * sin + localY * cos,\n };\n}\n\nexport function placeLocalPointOnCurve(\n curvePos: Point2D,\n tangent: number,\n localX: number,\n localY: number,\n): Point2D {\n const rotated = getRotatedOffset(localX, localY, tangent);\n\n return {\n x: curvePos.x - rotated.x,\n y: curvePos.y - rotated.y,\n };\n}\n\nexport function getBezierTForArcLength(table: ArcLengthEntry[], targetLength: number): number {\n if (table.length === 0) {\n return 0;\n }\n\n const totalLength = table[table.length - 1].length;\n if (targetLength <= 0) {\n return 0;\n }\n if (targetLength >= totalLength) {\n return 1;\n }\n\n let lo = 0;\n let hi = table.length - 1;\n\n while (lo < hi - 1) {\n const mid = Math.floor((lo + hi) / 2);\n if (table[mid].length < targetLength) {\n lo = mid;\n } else {\n hi = mid;\n }\n }\n\n const a = table[lo];\n const b = table[hi];\n const segmentLength = b.length - a.length;\n if (segmentLength <= 0) {\n return a.t;\n }\n\n const ratio = (targetLength - a.length) / segmentLength;\n return a.t + ratio * (b.t - a.t);\n}\n","import type { Glyph, CurveLineConfig, GlyphAxisBounds } from './SpriteText.types';\nimport {\n buildBezierArcLengthTable,\n computeCurveBulge,\n computeCurveSpread,\n computeProportionalArcLength,\n getBezierPoint,\n getBezierTangent,\n getBezierTForArcLength,\n placeLocalPointOnCurve,\n} from './SpriteTextBezier';\n\nexport function applyCurveToLine(glyphs: Glyph[], config: CurveLineConfig): void {\n const {\n lineIndex,\n lineWidth,\n lineHeight,\n lineAlignOffset,\n controlXPercent,\n controlYPercent,\n } = config;\n\n const lineCenterX = lineAlignOffset + lineWidth / 2;\n const curveHalfWidth = lineWidth / 2;\n const curveStartX = lineCenterX - curveHalfWidth;\n const curveEndX = lineCenterX + curveHalfWidth;\n const curveStartY = lineIndex * lineHeight;\n const curveControlX = lineCenterX + lineWidth * (controlXPercent - 0.5);\n const bulge = computeCurveBulge(lineWidth, lineHeight, controlYPercent);\n const verticalSign = controlYPercent < 0 ? -1 : controlYPercent > 0 ? 1 : 0;\n const curveControlY = curveStartY + verticalSign * bulge;\n const curveEndY = curveStartY;\n\n const p0 = { x: curveStartX, y: curveStartY };\n const p1 = { x: curveControlX, y: curveControlY };\n const p2 = { x: curveEndX, y: curveEndY };\n\n const arcTable =\n lineWidth > 0 ? buildBezierArcLengthTable(p0, p1, p2) : [{ t: 0, length: 0 }];\n const totalArcLength = arcTable[arcTable.length - 1]?.length ?? 0;\n const targetCenterX = lineAlignOffset + lineWidth / 2;\n const spread = computeCurveSpread(lineWidth, lineHeight, controlYPercent);\n\n glyphs.forEach((glyph) => {\n const bounds = glyph.getLocalBounds();\n const scaleX = glyph.scale.x;\n const scaleY = glyph.scale.y;\n const glyphWidth = bounds.width * scaleX;\n const glyphHeight = bounds.height * scaleY;\n const glyphLeft = glyph.x + bounds.x * scaleX;\n const centerFraction =\n lineWidth > 0 ? (glyphLeft + glyphWidth / 2) / lineWidth : 0;\n const trackingArc = computeProportionalArcLength(centerFraction, totalArcLength, spread);\n const t = totalArcLength > 0 ? getBezierTForArcLength(arcTable, trackingArc) : 0;\n\n const curvePos = getBezierPoint(t, p0, p1, p2);\n const curveTangent = getBezierTangent(t, p0, p1, p2);\n\n const localBottomCenterX = bounds.x * scaleX + glyphWidth / 2;\n const localBottomCenterY = bounds.y * scaleY + glyphHeight;\n const position = placeLocalPointOnCurve(\n curvePos,\n curveTangent,\n localBottomCenterX,\n localBottomCenterY,\n );\n\n glyph.x = position.x;\n glyph.y = position.y;\n glyph.rotation = curveTangent;\n });\n\n const curvedBounds = getGlyphsAxisBounds(glyphs);\n const offsetX = targetCenterX - curvedBounds.centerX;\n const offsetY = 0;\n\n glyphs.forEach((glyph) => {\n glyph.x += offsetX;\n glyph.y += offsetY;\n });\n}\n\nexport function getGlyphsAxisBounds(glyphs: Glyph[]): GlyphAxisBounds {\n let minX = Infinity;\n let maxX = -Infinity;\n let minY = Infinity;\n let maxY = -Infinity;\n\n glyphs.forEach((glyph) => {\n const bounds = glyph.getLocalBounds();\n const scaleX = glyph.scale.x;\n const scaleY = glyph.scale.y;\n const width = bounds.width * scaleX;\n const height = bounds.height * scaleY;\n const localCorners = [\n { x: bounds.x * scaleX, y: bounds.y * scaleY },\n { x: bounds.x * scaleX + width, y: bounds.y * scaleY },\n { x: bounds.x * scaleX + width, y: bounds.y * scaleY + height },\n { x: bounds.x * scaleX, y: bounds.y * scaleY + height },\n ];\n\n localCorners.forEach((corner) => {\n const cos = Math.cos(glyph.rotation);\n const sin = Math.sin(glyph.rotation);\n const x = glyph.x + (corner.x * cos - corner.y * sin);\n const y = glyph.y + (corner.x * sin + corner.y * cos);\n minX = Math.min(minX, x);\n maxX = Math.max(maxX, x);\n minY = Math.min(minY, y);\n maxY = Math.max(maxY, y);\n });\n });\n\n if (!Number.isFinite(minX)) {\n return { minX: 0, maxX: 0, minY: 0, maxY: 0, centerX: 0, centerY: 0 };\n }\n\n return {\n minX,\n maxX,\n minY,\n maxY,\n centerX: (minX + maxX) / 2,\n centerY: (minY + maxY) / 2,\n };\n}\n","import type { Container, Bounds } from 'pixi.js';\nimport type {\n AlignHorizontal,\n AlignVertical,\n Glyph,\n GlyphAxisBounds,\n} from './SpriteText.types';\nimport { applyCurveToLine } from './SpriteTextCurve';\n\nexport type LineLayoutResult = {\n lineWidths: number[];\n lineHeights: number[];\n};\n\nexport type AlignmentContext = {\n glyphs: Glyph[];\n lineAlign: AlignHorizontal;\n curveEnabled: boolean;\n curveControlXPercent: number;\n curveControlYPercent: number;\n letterSpacing: number;\n glyphScale: number;\n kerningEnabled: boolean;\n getKerning: (first: string, second: string) => number;\n pivotHorizontal: AlignHorizontal;\n pivotVertical: AlignVertical;\n};\n\nexport function splitGlyphsIntoLines(glyphs: Glyph[]): Glyph[][] {\n const lines: Glyph[][] = [];\n let currentLine: Glyph[] = [];\n\n glyphs.forEach((glyph) => {\n if (glyph.isLinebreak) {\n if (currentLine.length > 0) {\n lines.push(currentLine);\n currentLine = [];\n }\n } else {\n currentLine.push(glyph);\n }\n });\n\n if (currentLine.length > 0) {\n lines.push(currentLine);\n }\n\n return lines;\n}\n\nexport function layoutFlatLines(lines: Glyph[][], ctx: AlignmentContext): LineLayoutResult {\n const lineWidths: number[] = [];\n const lineHeights: number[] = [];\n\n lines.forEach((lineGlyphs, lineIndex) => {\n if (lineGlyphs.length === 0) {\n lineWidths.push(0);\n lineHeights.push(0);\n return;\n }\n\n let xCursor = 0;\n const lineHeight = Math.max(\n ...lineGlyphs.map((glyph) => glyph.height || glyph.getLocalBounds().height * glyph.scale.y),\n 0,\n );\n lineHeights.push(lineHeight);\n\n lineGlyphs.forEach((glyph, glyphIndex) => {\n glyph.x = xCursor - glyph.getLocalBounds().x * glyph.scale.x;\n glyph.y = lineIndex * lineHeight - glyph.getLocalBounds().y * glyph.scale.y;\n\n xCursor +=\n glyph.getLocalBounds().width * glyph.scale.x + ctx.letterSpacing * ctx.glyphScale;\n\n if (ctx.kerningEnabled && glyphIndex < lineGlyphs.length - 1) {\n const nextGlyph = lineGlyphs[glyphIndex + 1];\n if (glyph.fontIndex === nextGlyph.fontIndex) {\n xCursor += ctx.getKerning(glyph.char, nextGlyph.char) * ctx.glyphScale;\n }\n }\n });\n\n const lineWidth = xCursor - ctx.letterSpacing * ctx.glyphScale;\n lineWidths.push(lineWidth);\n });\n\n return { lineWidths, lineHeights };\n}\n\nexport function computeLineAlignOffset(\n lineAlign: AlignHorizontal,\n lineWidth: number,\n maxWidth: number,\n): number {\n switch (lineAlign) {\n case 'left':\n return 0;\n case 'center':\n return (maxWidth - lineWidth) / 2;\n case 'right':\n return maxWidth - lineWidth;\n }\n}\n\nexport function applyContainerPivot(\n container: Container,\n bounds: Bounds,\n pivotHorizontal: AlignHorizontal,\n pivotVertical: AlignVertical,\n): void {\n switch (pivotHorizontal) {\n case 'left':\n container.pivot.x = bounds.x;\n break;\n case 'center':\n container.pivot.x = bounds.x + bounds.width / 2;\n break;\n case 'right':\n container.pivot.x = bounds.x + bounds.width;\n break;\n }\n\n switch (pivotVertical) {\n case 'top':\n container.pivot.y = bounds.y;\n break;\n case 'middle':\n container.pivot.y = bounds.y + bounds.height / 2;\n break;\n case 'bottom':\n container.pivot.y = bounds.y + bounds.height;\n break;\n }\n}\n\nexport function resolveSpriteTextAlignment(container: Container, ctx: AlignmentContext): void {\n const lines = splitGlyphsIntoLines(ctx.glyphs);\n const { lineWidths, lineHeights } = layoutFlatLines(lines, ctx);\n const maxWidth = Math.max(...lineWidths, 0);\n\n lines.forEach((lineGlyphs, lineIndex) => {\n if (lineGlyphs.length === 0) return;\n\n const lineWidth = lineWidths[lineIndex];\n const lineHeight = lineHeights[lineIndex];\n const lineAlignOffset = computeLineAlignOffset(ctx.lineAlign, lineWidth, maxWidth);\n\n if (!ctx.curveEnabled) {\n lineGlyphs.forEach((glyph) => {\n glyph.x += lineAlignOffset;\n glyph.rotation = 0;\n });\n return;\n }\n\n applyCurveToLine(lineGlyphs, {\n lineIndex,\n lineWidth,\n lineHeight,\n lineAlignOffset,\n controlXPercent: ctx.curveControlXPercent,\n controlYPercent: ctx.curveControlYPercent,\n });\n });\n\n (container.boundsArea as any) = undefined;\n const bounds = container.getLocalBounds();\n applyContainerPivot(container, bounds, ctx.pivotHorizontal, ctx.pivotVertical);\n}\n","import {\n Container,\n Sprite,\n Texture,\n type PointData,\n type ColorSource,\n Color,\n} from 'pixi.js';\nimport { Skinable, defineGlobalSkin, mergeGlobalAndInstanceSkin } from '../Skinable';\nimport { getNestedValue } from '../../../utils/ObjectUtils';\nimport {\n parseSpriteTextBBCode,\n stripSpriteTextBBCode,\n type TextRun,\n} from '../SpriteTextBBCode';\nimport type {\n AlignHorizontal,\n AlignVertical,\n Glyph,\n CharMeta,\n ResolvedFontStyle,\n SpriteTextOptions,\n SpriteTextSkinData,\n} from './SpriteText.types';\nimport { applyKerningPairs, codesToKey, getKerningFromMap } from './SpriteTextKerning';\nimport {\n measureCharMetaWidth,\n resolveCharTexture,\n resolveRefWidth,\n type TextureResolverContext,\n} from './SpriteTextTexture';\nimport {\n mergeRunLinesWithNewlines,\n runsToMetas,\n wrapRuns,\n type WrapContext,\n} from './SpriteTextWrap';\nimport { resolveSpriteTextAlignment } from './SpriteTextAlignment';\n\nexport type {\n AlignHorizontal,\n AlignVertical,\n Glyph,\n KerningPair,\n SpriteTextFontStyle,\n SpriteTextOptions,\n SpriteTextSkinData,\n} from './SpriteText.types';\n\nexport class SpriteText extends Skinable<SpriteTextSkinData, typeof Container>(Container) {\n public static globalSkin = defineGlobalSkin<SpriteTextSkinData>();\n\n private _glyphs: Glyph[] = [];\n private _text: string = '';\n private _fonts: string[] = [];\n private _font: string = '';\n private _bbcodeEnabled: boolean = false;\n private _richTextExplicit: boolean | undefined;\n private _bbcodeAliases: Record<string, number | string> = {};\n private _fontStyles: ResolvedFontStyle[] = [];\n private _runsOverride: TextRun[] | null = null;\n private _tint: number = 0xffffff;\n private _pivotHorizontal: AlignHorizontal = 'center';\n private _pivotVertical: AlignVertical = 'middle';\n private _lineAlign: AlignHorizontal = 'left';\n private _letterSpacing: number = 0;\n private _spaceWidth: number = 0.5;\n private _wordWrap: boolean = false;\n private _wordWrapWidth: number = 100;\n private _breakWord: boolean = false;\n private _allowLineBreak: boolean = false;\n private _kerningEnabled: boolean = false;\n private _kerningMap: Map<string, number> = new Map();\n private _glyphAnchor: PointData = { x: 0, y: 0 };\n private _glyphMap: Record<string, string> = {};\n private _fixedWidth: boolean | string | Record<string, string> = false;\n private _glyphScale: number = 1;\n private _curveEnabled: boolean = false;\n private _curveControlXPercent: number = 0.5;\n private _curveControlYPercent: number = -0.5;\n\n constructor(options: SpriteTextOptions = {}) {\n super();\n\n if (options.text !== undefined) {\n this._text = options.text;\n }\n\n const effectiveSkin = mergeGlobalAndInstanceSkin(\n () => SpriteText.globalSkin(),\n options.skinData,\n );\n this.setSkinData(effectiveSkin, { mergeWithExisting: false });\n }\n\n protected skinApply(skin: SpriteTextSkinData | null): void {\n if (!skin) return;\n\n const propertyMap = {\n text: '_text',\n tint: '_tint',\n 'pivot.horizontal': '_pivotHorizontal',\n 'pivot.vertical': '_pivotVertical',\n lineAlign: '_lineAlign',\n 'spacing.letter': '_letterSpacing',\n 'spacing.space': '_spaceWidth',\n 'wordWrap.enabled': '_wordWrap',\n 'wordWrap.width': '_wordWrapWidth',\n 'wordWrap.breakWord': '_breakWord',\n 'lineBreak.enabled': '_allowLineBreak',\n 'kerning.enabled': '_kerningEnabled',\n 'kerning.pairs': null,\n 'glyph.anchor': '_glyphAnchor',\n 'glyph.map': '_glyphMap',\n 'glyph.fixedWidth': '_fixedWidth',\n 'glyph.scale': '_glyphScale',\n 'curve.enabled': '_curveEnabled',\n 'curve.controlXPercent': '_curveControlXPercent',\n 'curve.controlYPercent': '_curveControlYPercent',\n };\n\n Object.entries(propertyMap).forEach(([skinPath, instanceProperty]) => {\n const value = getNestedValue(skin, skinPath);\n if (value !== undefined) {\n if (skinPath === 'text' && this._text !== '') return;\n\n if (skinPath === 'kerning.pairs') {\n this.setKerningPairs(value);\n } else if (instanceProperty) {\n (this as any)[instanceProperty] = value;\n }\n }\n });\n\n this.applyLegacyAlignmentSkin(skin);\n\n if (skin.fonts !== undefined) {\n this._fonts = [...skin.fonts];\n } else if (skin.font !== undefined) {\n this._fonts = [skin.font];\n }\n\n this._font = this._fonts[0] ?? '';\n\n if (skin.richText !== undefined) {\n this._richTextExplicit = skin.richText.enabled;\n this._bbcodeAliases = skin.richText.aliases ?? {};\n }\n\n this._bbcodeEnabled = this._richTextExplicit ?? this._fonts.length > 1;\n\n if (skin.fontStyles !== undefined) {\n this._fontStyles = skin.fontStyles.map((fontStyle) => ({\n scale: fontStyle.scale ?? 1,\n tint:\n fontStyle.tint !== undefined\n ? Color.shared.setValue(fontStyle.tint).toNumber()\n : undefined,\n glyphMap: fontStyle.glyph?.map,\n fixedWidth: fontStyle.glyph?.fixedWidth,\n }));\n }\n\n this.generateText();\n }\n\n private applyLegacyAlignmentSkin(skin: SpriteTextSkinData): void {\n const legacy = skin.alignment;\n if (!legacy) return;\n\n if (skin.pivot?.horizontal === undefined && legacy.horizontal !== undefined) {\n this._pivotHorizontal = legacy.horizontal;\n }\n if (skin.pivot?.vertical === undefined && legacy.vertical !== undefined) {\n this._pivotVertical = legacy.vertical;\n }\n if (skin.lineAlign === undefined && legacy.lineAlign !== undefined) {\n this._lineAlign = legacy.lineAlign;\n }\n }\n\n private getTextureContext(): TextureResolverContext {\n return {\n fonts: this._fonts,\n glyphMap: this._glyphMap,\n fixedWidth: this._fixedWidth,\n fontStyles: this._fontStyles,\n getFontStyle: (fontIndex) => this.getFontStyle(fontIndex),\n };\n }\n\n private getWrapContext(): WrapContext {\n const textureCtx = this.getTextureContext();\n return {\n wordWrapWidth: this._wordWrapWidth,\n scaleX: this.scale.x,\n breakWord: this._breakWord,\n letterSpacing: this._letterSpacing,\n glyphScale: this._glyphScale,\n kerningEnabled: this._kerningEnabled,\n getKerning: (first, second) => this.getKerning(first, second),\n getCharMetaWidth: (meta) =>\n measureCharMetaWidth(meta, {\n ...textureCtx,\n glyphScale: this._glyphScale,\n spaceWidth: this._spaceWidth,\n }),\n };\n }\n\n private applyFontStyleDefaults(run: TextRun): TextRun {\n const fontStyle = this._fontStyles[run.fontIndex];\n const fontStyleScale = fontStyle?.scale ?? 1;\n\n return {\n text: run.text,\n fontIndex: run.fontIndex,\n tint: run.tint ?? fontStyle?.tint,\n scale: (run.scale ?? 1) * fontStyleScale,\n };\n }\n\n private resolveRuns(): TextRun[] {\n if (this._runsOverride) {\n return this._runsOverride;\n }\n\n const rawRuns = this._bbcodeEnabled\n ? parseSpriteTextBBCode(this._text, {\n defaultFontIndex: 0,\n aliases: this._bbcodeAliases,\n fonts: this._fonts,\n })\n : [{ text: this._text, fontIndex: 0 }];\n\n return rawRuns.map((run) => this.applyFontStyleDefaults(run));\n }\n\n private buildTextChunks(runs: TextRun[]): TextRun[][] {\n if (this._wordWrap) {\n const wrappedLines = wrapRuns(runs, this.getWrapContext()).filter((line) => line.length > 0);\n if (this._allowLineBreak) {\n return [mergeRunLinesWithNewlines(wrappedLines)];\n }\n return wrappedLines;\n }\n\n return [runs];\n }\n\n private generateText(): void {\n if (!this._font) return;\n\n const runs = this.resolveRuns();\n const textChunks = this.buildTextChunks(runs);\n let visibleTextLength = 0;\n const textureCtx = this.getTextureContext();\n\n textChunks.forEach((chunk) => {\n const metas = runsToMetas(chunk);\n\n for (const meta of metas) {\n const char = meta.char;\n let texture = resolveCharTexture(char, meta.fontIndex, textureCtx);\n const isSpace = texture === null && char === ' ';\n const isLineBreak = texture === null && char === '\\n';\n const isTab = texture === null && char === '\\t';\n\n if (isSpace || isLineBreak || isTab) {\n texture = Texture.WHITE;\n }\n\n if (texture !== null) {\n const effectiveScale = this._glyphScale * meta.runScale;\n const glyphTint = meta.tint ?? this._tint;\n\n if (this._glyphs[visibleTextLength]) {\n this._glyphs[visibleTextLength].texture = texture;\n this._glyphs[visibleTextLength].tint = glyphTint;\n this._glyphs[visibleTextLength].scale.set(effectiveScale, effectiveScale);\n } else {\n this._glyphs[visibleTextLength] = new Sprite() as Glyph;\n this._glyphs[visibleTextLength].anchor.set(this._glyphAnchor.x, this._glyphAnchor.y);\n this._glyphs[visibleTextLength].tint = glyphTint;\n this._glyphs[visibleTextLength].texture = texture;\n this._glyphs[visibleTextLength].scale.set(effectiveScale, effectiveScale);\n }\n\n this._glyphs[visibleTextLength].char = char;\n this._glyphs[visibleTextLength].charCode = char.charCodeAt(0);\n this._glyphs[visibleTextLength].fontIndex = meta.fontIndex;\n this._glyphs[visibleTextLength].runTint = meta.tint;\n this._glyphs[visibleTextLength].runScale = meta.runScale;\n this._glyphs[visibleTextLength].isLinebreak = isLineBreak;\n this._glyphs[visibleTextLength].isSpace = isSpace;\n this._glyphs[visibleTextLength].isTab = isTab;\n\n const ref0Texture = resolveCharTexture('0', meta.fontIndex, textureCtx);\n const ref0Width = (ref0Texture?.width ?? 0) * effectiveScale;\n const ref0Height = (ref0Texture?.height ?? 0) * effectiveScale;\n\n if (isSpace) {\n this._glyphs[visibleTextLength].width = ref0Width * this._spaceWidth;\n this._glyphs[visibleTextLength].height = ref0Height;\n this._glyphs[visibleTextLength].label = 'space';\n this._glyphs[visibleTextLength].alpha = 0;\n } else if (isTab) {\n this._glyphs[visibleTextLength].width = ref0Width * this._spaceWidth * 4;\n this._glyphs[visibleTextLength].height = ref0Height;\n this._glyphs[visibleTextLength].label = 'tab';\n this._glyphs[visibleTextLength].alpha = 0;\n } else if (isLineBreak) {\n this._glyphs[visibleTextLength].width = 0;\n this._glyphs[visibleTextLength].label = 'lineBreak';\n this._glyphs[visibleTextLength].height = ref0Height;\n this._glyphs[visibleTextLength].alpha = 0;\n } else {\n this._glyphs[visibleTextLength].alpha = 1;\n this._glyphs[visibleTextLength].label = char;\n\n const refWidth = resolveRefWidth(char, meta.fontIndex, textureCtx);\n if (refWidth > 0) {\n this._glyphs[visibleTextLength].width = refWidth * effectiveScale;\n } else {\n this._glyphs[visibleTextLength].width = (texture?.width ?? 0) * effectiveScale;\n }\n }\n\n visibleTextLength++;\n }\n }\n });\n\n if (this._glyphs.length > visibleTextLength) {\n const oldChars = this._glyphs.splice(\n visibleTextLength,\n this._glyphs.length - visibleTextLength,\n );\n for (let oIndex = 0; oIndex < oldChars.length; oIndex++) {\n oldChars[oIndex].destroy({ children: true });\n }\n }\n\n if (this._glyphs.length > 0) {\n this.addChild(...this._glyphs);\n }\n\n this.resolveAlignment();\n }\n\n private getFontStyle(fontIndex: number): ResolvedFontStyle | undefined {\n return this._fontStyles[fontIndex];\n }\n\n private resolveAlignment(): void {\n resolveSpriteTextAlignment(this, {\n glyphs: this._glyphs,\n lineAlign: this._lineAlign,\n curveEnabled: this._curveEnabled,\n curveControlXPercent: this._curveControlXPercent,\n curveControlYPercent: this._curveControlYPercent,\n letterSpacing: this._letterSpacing,\n glyphScale: this._glyphScale,\n kerningEnabled: this._kerningEnabled,\n getKerning: (first, second) => this.getKerning(first, second),\n pivotHorizontal: this._pivotHorizontal,\n pivotVertical: this._pivotVertical,\n });\n }\n\n public get text(): string {\n return this._text;\n }\n\n public set text(value: string) {\n if (this._text !== value) {\n this._text = value;\n this._runsOverride = null;\n this.generateText();\n }\n }\n\n public get plainText(): string {\n return this._bbcodeEnabled ? stripSpriteTextBBCode(this._text) : this._text;\n }\n\n public get font(): string {\n return this._font;\n }\n\n public set font(value: string) {\n if (this._font !== value) {\n this._fonts = [value];\n this._font = value;\n this._bbcodeEnabled = this._richTextExplicit ?? this._fonts.length > 1;\n this.generateText();\n }\n }\n\n public get fonts(): string[] {\n return [...this._fonts];\n }\n\n public set fonts(value: string[]) {\n this._fonts = [...value];\n this._font = value[0] ?? '';\n this._bbcodeEnabled = this._richTextExplicit ?? this._fonts.length > 1;\n this.generateText();\n }\n\n public get bbcodeEnabled(): boolean {\n return this._bbcodeEnabled;\n }\n\n public setRuns(runs: TextRun[]): void {\n this._runsOverride = runs.map((run) => this.applyFontStyleDefaults(run));\n this.generateText();\n }\n\n public get tint(): number {\n return this._tint;\n }\n\n public set tint(value: ColorSource) {\n const numericValue = Color.shared.setValue(value ?? 0xffffff).toNumber();\n if (this._tint !== numericValue) {\n this._tint = numericValue;\n for (let gIndex = 0; gIndex < this._glyphs.length; gIndex++) {\n if (this._glyphs[gIndex].runTint === undefined) {\n this._glyphs[gIndex].tint = this._tint;\n }\n }\n }\n }\n\n public get pivotHorizontal(): AlignHorizontal {\n return this._pivotHorizontal;\n }\n\n public set pivotHorizontal(value: AlignHorizontal) {\n if (this._pivotHorizontal !== value) {\n this._pivotHorizontal = value;\n this.resolveAlignment();\n }\n }\n\n public get pivotVertical(): AlignVertical {\n return this._pivotVertical;\n }\n\n public set pivotVertical(value: AlignVertical) {\n if (this._pivotVertical !== value) {\n this._pivotVertical = value;\n this.resolveAlignment();\n }\n }\n\n /** @deprecated Use pivotHorizontal */\n public get textHAlign(): AlignHorizontal {\n return this._pivotHorizontal;\n }\n\n /** @deprecated Use pivotHorizontal */\n public set textHAlign(value: AlignHorizontal) {\n this.pivotHorizontal = value;\n }\n\n /** @deprecated Use pivotVertical */\n public get textVAlign(): AlignVertical {\n return this._pivotVertical;\n }\n\n /** @deprecated Use pivotVertical */\n public set textVAlign(value: AlignVertical) {\n this.pivotVertical = value;\n }\n\n public get lineAlign(): AlignHorizontal {\n return this._lineAlign;\n }\n\n public set lineAlign(value: AlignHorizontal) {\n if (this._lineAlign !== value) {\n this._lineAlign = value;\n this.resolveAlignment();\n }\n }\n\n public get letterSpacing(): number {\n return this._letterSpacing;\n }\n\n public set letterSpacing(value: number) {\n if (this._letterSpacing !== value) {\n this._letterSpacing = value;\n this.resolveAlignment();\n }\n }\n\n public get spaceWidth(): number {\n return this._spaceWidth;\n }\n\n public set spaceWidth(value: number) {\n if (this._spaceWidth !== value) {\n this._spaceWidth = value;\n this.generateText();\n }\n }\n\n public get wordWrap(): boolean {\n return this._wordWrap;\n }\n\n public set wordWrap(value: boolean) {\n if (this._wordWrap !== value) {\n this._wordWrap = value;\n this.generateText();\n }\n }\n\n public get wordWrapWidth(): number {\n return this._wordWrapWidth;\n }\n\n public set wordWrapWidth(value: number) {\n if (this._wordWrapWidth !== value) {\n this._wordWrapWidth = value;\n this.generateText();\n }\n }\n\n public get breakWord(): boolean {\n return this._breakWord;\n }\n\n public set breakWord(value: boolean) {\n if (this._breakWord !== value) {\n this._breakWord = value;\n this.generateText();\n }\n }\n\n public get allowLineBreak(): boolean {\n return this._allowLineBreak;\n }\n\n public set allowLineBreak(value: boolean) {\n if (this._allowLineBreak !== value) {\n this._allowLineBreak = value;\n this.generateText();\n }\n }\n\n public getGlyphs(): Glyph[] {\n return this._glyphs;\n }\n\n public getGlyphAt(pos: number): Glyph | undefined {\n return this._glyphs[pos];\n }\n\n public get glyphCount(): number {\n return this._glyphs.length;\n }\n\n public get kerningEnabled(): boolean {\n return this._kerningEnabled;\n }\n\n public set kerningEnabled(value: boolean) {\n if (this._kerningEnabled !== value) {\n this._kerningEnabled = value;\n this.resolveAlignment();\n }\n }\n\n private getKerning(first: string, second: string): number {\n if (!this._kerningEnabled) return 0;\n return getKerningFromMap(this._kerningMap, first, second);\n }\n\n public setKerningPairs(pairs: import('./SpriteText.types').KerningPair[] | Record<string, number>): void {\n applyKerningPairs(this._kerningMap, pairs);\n if (this._kerningEnabled) {\n this.resolveAlignment();\n }\n }\n\n public setKerning(first: number | string, second: number | string, amount: number): void {\n this._kerningMap.set(codesToKey(first, second), amount);\n if (this._kerningEnabled) {\n this.resolveAlignment();\n }\n }\n\n public getKerningAmount(first: number | string, second: number | string): number {\n return this._kerningMap.get(codesToKey(first, second)) ?? 0;\n }\n\n public clearKerning(): void {\n this._kerningMap.clear();\n if (this._kerningEnabled) {\n this.resolveAlignment();\n }\n }\n\n public get glyphAnchor(): PointData {\n return { ...this._glyphAnchor };\n }\n\n public set glyphAnchor(value: PointData) {\n if (this._glyphAnchor.x !== value.x || this._glyphAnchor.y !== value.y) {\n this._glyphAnchor = { ...value };\n\n this._glyphs.forEach((glyph) => {\n if (!glyph.isSpace && !glyph.isLinebreak) {\n glyph.anchor.set(this._glyphAnchor.x, this._glyphAnchor.y);\n }\n });\n\n this.resolveAlignment();\n }\n }\n\n public setGlyphAnchor(x: number, y?: number): void {\n this.glyphAnchor = { x, y: y ?? x };\n }\n\n public get curveEnabled(): boolean {\n return this._curveEnabled;\n }\n\n public set curveEnabled(value: boolean) {\n if (this._curveEnabled !== value) {\n this._curveEnabled = value;\n this.resolveAlignment();\n }\n }\n\n public get curveControlXPercent(): number {\n return this._curveControlXPercent;\n }\n\n public set curveControlXPercent(value: number) {\n if (this._curveControlXPercent !== value) {\n this._curveControlXPercent = value;\n if (this._curveEnabled) {\n this.resolveAlignment();\n }\n }\n }\n\n public get curveControlYPercent(): number {\n return this._curveControlYPercent;\n }\n\n public set curveControlYPercent(value: number) {\n if (this._curveControlYPercent !== value) {\n this._curveControlYPercent = value;\n if (this._curveEnabled) {\n this.resolveAlignment();\n }\n }\n }\n\n public get fontSize(): number {\n return this._glyphScale;\n }\n\n public set fontSize(value: number) {\n if (this._glyphScale !== value) {\n this._glyphScale = value;\n this.generateText();\n }\n }\n}\n","import { Container, Graphics, Text, Sprite, Texture, TextStyleOptions, PointData } from 'pixi.js';\nimport { merge } from 'lodash';\nimport type { DeepPartial, GraphicsConfig, SpriteConfig } from './Component.types';\nimport { Skinable } from './Skinable';\nimport { SpriteText, type SpriteTextSkinData } from './spriteText';\nimport { ButtonBehavior, ButtonVisualState } from '../behaviors';\nimport type { LayoutStyles } from '@pixi/layout';\n\n// Discriminated union types for button text configuration\ntype PixiTextButtonConfig = {\n type: 'text';\n textStyle?: TextStyleOptions;\n spriteData?: never;\n layout?: boolean | LayoutStyles | null;\n anchor?: PointData;\n};\n\ntype SpriteTextButtonConfig = {\n type: 'sprite';\n textStyle?: never;\n spriteData: SpriteTextSkinData;\n layout?: boolean | LayoutStyles | null;\n anchor?: never;\n};\n\ntype ButtonTextConfig = PixiTextButtonConfig | SpriteTextButtonConfig;\n\nexport interface ButtonCompStateData {\n base?: string;\n background?: GraphicsConfig | SpriteConfig;\n textConfig?: ButtonTextConfig;\n icon?: GraphicsConfig | SpriteConfig;\n layout?: boolean | LayoutStyles | null;\n placeHolderLayout?: boolean | LayoutStyles | null;\n zIndex?: number;\n}\n\nexport type ButtonStateKey = ButtonVisualState;\n\nexport type IconTextureConfig = string | Partial<Record<ButtonStateKey, string>>;\n\nexport interface ButtonCompSkinData {\n up: ButtonCompStateData;\n down?: DeepPartial<ButtonCompStateData>;\n over?: DeepPartial<ButtonCompStateData>;\n disabled?: DeepPartial<ButtonCompStateData>;\n selected_up?: DeepPartial<ButtonCompStateData>;\n selected_down?: DeepPartial<ButtonCompStateData>;\n selected_over?: DeepPartial<ButtonCompStateData>;\n selected_disabled?: DeepPartial<ButtonCompStateData>;\n}\n\nexport interface ButtonCompOptions {\n text?: string;\n label?: string;\n icon?: string;\n skinData?: ButtonCompSkinData;\n enabled?: boolean;\n}\n\n/**\n * Button effect instance that can be attached to buttons.\n *\n * Created by {@link createButtonEffect} function.\n */\nexport interface ButtonEffect {\n /**\n * Unique name for the effect.\n */\n readonly name: string;\n\n /**\n * Internal attach handler.\n * @internal\n */\n _onAttach(button: ButtonComp, state: ButtonStateKey): void;\n\n /**\n * Internal detach handler.\n * @internal\n */\n _onDetach(): void;\n\n /**\n * Internal state change handler.\n * @internal\n */\n _onStateChange(button: ButtonComp, state: ButtonStateKey, previousState?: ButtonStateKey): void;\n\n /**\n * Internal destroy handler.\n * @internal\n */\n _onDestroy(): void;\n}\n\nexport class ButtonComp extends Skinable<ButtonCompSkinData, typeof Container>(Container) {\n private _buttonBehaviors: ButtonBehavior;\n private _background: Graphics | Sprite;\n private _placeHolder: Container;\n private _icon?: Graphics | Sprite;\n private _labelText: Text | SpriteText | null = null;\n private _buttonLabel: string = '';\n private _iconTextures: IconTextureConfig | null = null;\n private _currentState: keyof ButtonCompSkinData = 'up';\n private _enabled: boolean = true;\n private _effects: Map<string, ButtonEffect> = new Map();\n private _previousState?: keyof ButtonCompSkinData;\n private _stateDataCache: Map<ButtonStateKey, ButtonCompStateData> = new Map();\n\n constructor(options: ButtonCompOptions = {}) {\n super({ label: options.label });\n\n this.eventMode = 'static';\n\n this._background = new Graphics();\n this._placeHolder = new Container({ label: \"placeHolder\" });\n\n // Add children once - they will never be removed\n this.addChild(this._background);\n this.addChild(this._placeHolder);\n\n // Create ui.Button for interaction - attach this container as view\n this._buttonBehaviors = new ButtonBehavior();\n this._buttonBehaviors.attachView(this);\n\n // Setup event listeners\n this.setupEventListeners();\n\n // Set initial enabled state\n this.enabled = options.enabled !== false;\n\n // Set initial button label from options\n if (options.text) {\n this._buttonLabel = options.text;\n }\n\n if (options.icon) {\n this._iconTextures = options.icon;\n }\n\n // Initialize skin data via API (no merge on first set)\n this.setSkinData(options.skinData || null, { mergeWithExisting: false });\n }\n\n private setupEventListeners(): void {\n this._buttonBehaviors.on('stateChanged', (newState) => {\n if (this._enabled) {\n this.setState(newState.state as ButtonVisualState);\n }\n });\n }\n\n private setState(state: ButtonVisualState): void {\n this._previousState = this._currentState;\n this._currentState = state;\n this.updateVisualState();\n this.notifyEffectsStateChange();\n }\n\n private _lastLayout: boolean | LayoutStyles | null = null;\n private _lastPlaceHolderLayout: boolean | LayoutStyles | null = null;\n private _lastBackgroundConfig: GraphicsConfig | SpriteConfig | undefined;\n private _lastIconConfig: GraphicsConfig | SpriteConfig | undefined;\n private _lastTextConfig: ButtonTextConfig | undefined;\n private _lastZIndex: number | undefined;\n\n private updateVisualState(): void {\n const currentStateData = this.getCurrentStateData();\n if (!currentStateData) return;\n\n this.updateBackground(currentStateData);\n this.updateIcon(currentStateData);\n this.updateText(currentStateData);\n\n // Apply layout from state data\n if (JSON.stringify(this._lastLayout) !== JSON.stringify(currentStateData.layout)) {\n this.layout = currentStateData.layout ?? null;\n this._lastLayout = currentStateData.layout ?? null;\n }\n if (JSON.stringify(this._lastPlaceHolderLayout) !== JSON.stringify(currentStateData.placeHolderLayout)) {\n this._placeHolder.layout = currentStateData.placeHolderLayout ?? null;\n this._lastPlaceHolderLayout = currentStateData.placeHolderLayout ?? null;\n }\n\n if (this._lastZIndex !== currentStateData.zIndex) {\n this.zIndex = currentStateData.zIndex ?? 0;\n this._lastZIndex = currentStateData.zIndex;\n }\n\n }\n\n protected skinApply(skinData: ButtonCompSkinData | null): void {\n this._stateDataCache.clear();\n this._lastLayout = null;\n this._lastPlaceHolderLayout = null;\n this._lastBackgroundConfig = undefined;\n this._lastIconConfig = undefined;\n this._lastTextConfig = undefined;\n this._lastZIndex = undefined;\n\n if (skinData) {\n this.precomputeAllStates(skinData);\n }\n\n this.updateVisualState();\n }\n\n private precomputeAllStates(skin: ButtonCompSkinData): void {\n const allStates: ButtonStateKey[] = [\n 'up', 'over', 'down', 'disabled',\n 'selected_up', 'selected_over', 'selected_down', 'selected_disabled'\n ];\n\n for (const state of allStates) {\n const chain = ButtonComp.stateFallbackChain[state];\n\n // Property-level merge with reference preservation\n // If a property is not defined in current state, use previous state's reference\n let base: string = '';\n let background: GraphicsConfig | SpriteConfig | undefined;\n let textConfig: ButtonTextConfig | undefined;\n let icon: GraphicsConfig | SpriteConfig | undefined;\n let layout: boolean | LayoutStyles | null | undefined;\n let zIndex: number | undefined;\n let placeHolderLayout: boolean | LayoutStyles | null | undefined;\n\n for (const stateKey of chain) {\n const stateData = (skin as any)[stateKey] as ButtonCompStateData | undefined;\n if (stateData) {\n // For each property: merge if both exist, otherwise use new or keep old reference\n if (stateData.base !== undefined) {\n base = stateData.base;\n }\n if (stateData.background !== undefined) {\n background = background\n ? merge({}, background, stateData.background)\n : stateData.background;\n }\n if (stateData.textConfig !== undefined) {\n textConfig = textConfig\n ? merge({}, textConfig, stateData.textConfig)\n : stateData.textConfig;\n }\n if (stateData.icon !== undefined) {\n icon = icon\n ? merge({}, icon, stateData.icon)\n : stateData.icon;\n }\n if (stateData.layout !== undefined) {\n layout = stateData.layout;\n }\n if (stateData.placeHolderLayout !== undefined) {\n placeHolderLayout = stateData.placeHolderLayout;\n }\n if (stateData.zIndex !== undefined) {\n zIndex = stateData.zIndex;\n }\n }\n }\n\n this._stateDataCache.set(state, { base, background, textConfig, icon, layout, placeHolderLayout, zIndex });\n }\n }\n\n private static readonly stateFallbackChain: Record<ButtonStateKey, ButtonStateKey[]> = {\n // Normal flow: up -> over -> down\n up: ['up'],\n over: ['up', 'over'],\n down: ['up', 'over', 'down'],\n\n // Selected flow: selected_up -> selected_over -> selected_down\n selected_up: ['up', 'selected_up'],\n selected_over: ['up', 'selected_up', 'selected_over'],\n selected_down: ['up', 'selected_up', 'selected_over', 'selected_down'],\n\n // Disabled states\n disabled: ['up', 'disabled'],\n selected_disabled: ['up', 'selected_up', 'selected_disabled'],\n };\n\n private getCurrentStateData(): ButtonCompStateData | null {\n // All states are precomputed in skinApply, just return from cache\n return this._stateDataCache.get(this._currentState) ?? null;\n }\n\n private updateBackground(stateData: ButtonCompStateData): void {\n const bg = stateData.background;\n if (!bg) return;\n\n // Skip if config hasn't changed\n if (this._lastBackgroundConfig === bg) return;\n this._lastBackgroundConfig = bg;\n\n const base = stateData.base ?? '';\n const prevBackground = this._background;\n if ('texture' in bg) {\n this._background = this.drawSprite(this._background, bg, base);\n } else {\n this._background = this.drawGraphic(this._background, bg);\n }\n // Add to this if instance changed (e.g., Graphics -> Sprite)\n if (this._background !== prevBackground) {\n this.addChildAt(this._background, 0); // background always at bottom\n }\n }\n\n private updateIcon(stateData: ButtonCompStateData): void {\n const iconConfig = stateData.icon;\n\n // Skip if config hasn't changed (only when not using _iconTextures)\n if (!this._iconTextures && this._lastIconConfig === iconConfig) return;\n this._lastIconConfig = iconConfig;\n\n // Get texture from _iconTextures based on current state\n let textureToUse: string | null = null;\n\n if (this._iconTextures) {\n if (typeof this._iconTextures === 'string') {\n textureToUse = this._iconTextures;\n } else {\n textureToUse = this._iconTextures[this._currentState] || this._iconTextures.up || null;\n }\n }\n\n // If _iconTextures is set, it takes priority over skin data texture\n // but we still use skin's layout and other properties\n const base = stateData.base ?? '';\n if (textureToUse) {\n const skinIcon = iconConfig && 'texture' in iconConfig ? iconConfig : undefined;\n const spriteConfig: SpriteConfig = {\n texture: textureToUse,\n alpha: skinIcon?.alpha ?? 1,\n tint: skinIcon?.tint ?? 0xffffff,\n anchor: skinIcon?.anchor,\n layout: skinIcon?.layout,\n };\n const prevIcon = this._icon;\n this._icon = this.drawSprite(this._icon, spriteConfig, base);\n if (this._icon !== prevIcon) {\n this._placeHolder.addChild(this._icon);\n }\n return;\n }\n\n // Otherwise, use iconConfig from state data\n if (iconConfig) {\n const prevIcon = this._icon;\n if ('texture' in iconConfig) {\n this._icon = this.drawSprite(this._icon, iconConfig, base);\n } else {\n this._icon = this.drawGraphic(this._icon, iconConfig);\n }\n if (this._icon !== prevIcon) {\n this._placeHolder.addChild(this._icon);\n }\n return;\n }\n\n // No icon to display\n if (this._icon) {\n this._icon.destroy(); // destroy also removes from parent\n this._icon = undefined;\n }\n }\n\n private drawSprite(\n current: Graphics | Sprite | undefined,\n config: SpriteConfig,\n base: string = '',\n ): Sprite {\n let sprite: Sprite;\n\n if (current instanceof Sprite) {\n sprite = current;\n } else {\n if (current) {\n current.destroy(); // destroy also removes from parent\n }\n sprite = new Sprite();\n }\n\n const texturePath = base ? `${base}/${config.texture}` : config.texture;\n sprite.texture = Texture.from(texturePath);\n sprite.alpha = config.alpha ?? 1;\n sprite.tint = config.tint ?? 0xffffff;\n\n if (config.anchor) {\n sprite.anchor.set(config.anchor.x, config.anchor.y);\n }\n\n sprite.layout = config.layout ?? null;\n\n return sprite;\n }\n\n private drawGraphic(\n current: Graphics | Sprite | undefined,\n config: GraphicsConfig,\n ): Graphics {\n let graphics: Graphics;\n\n if (current instanceof Graphics) {\n graphics = current;\n } else {\n if (current) {\n current.destroy(); // destroy also removes from parent\n }\n graphics = new Graphics();\n }\n\n graphics.clear();\n\n // Draw shape based on config type\n if ('circle' in config) {\n graphics.circle(config.circle.radius, config.circle.radius, config.circle.radius);\n } else if ('rect' in config) {\n graphics.rect(0, 0, config.rect.width, config.rect.height);\n } else if ('roundRect' in config) {\n graphics.roundRect(\n 0,\n 0,\n config.roundRect.width,\n config.roundRect.height,\n config.roundRect.radius,\n );\n }\n\n // Apply fill if specified\n if (config.fill) {\n graphics.fill(config.fill);\n }\n\n // Apply stroke if specified\n if (config.stroke) {\n graphics.stroke(config.stroke);\n }\n\n graphics.layout = config.layout ?? null;\n\n return graphics;\n }\n\n private updateText(stateData: ButtonCompStateData): void {\n const textConfig = stateData.textConfig;\n const hasText = this._buttonLabel || textConfig;\n\n // Skip if config hasn't changed and text content is the same\n // if (JSON.stringify(this._lastTextConfig) === JSON.stringify(textConfig) && (this._labelText?.text ?? '') === this._buttonLabel) return;\n this._lastTextConfig = textConfig;\n\n // Destroy text instance if not needed\n if (!hasText) {\n if (this._labelText) {\n this._labelText.destroy(); // destroy also removes from parent\n this._labelText = null;\n }\n return;\n }\n\n // Determine if we need to recreate the text instance (type changed)\n const needsRecreate =\n this._labelText &&\n ((textConfig?.type === 'sprite' && !(this._labelText instanceof SpriteText)) ||\n (textConfig?.type === 'text' && this._labelText instanceof SpriteText) ||\n (!textConfig && this._labelText instanceof SpriteText));\n\n if (needsRecreate) {\n this._labelText!.destroy(); // destroy also removes from parent\n this._labelText = null;\n }\n\n // Create text instance lazily when needed\n if (!this._labelText) {\n if (textConfig?.type === 'sprite') {\n // Use SpriteText\n this._labelText = new SpriteText({\n text: this._buttonLabel,\n skinData: textConfig.spriteData,\n });\n } else {\n // Use Pixi Text (default)\n this._labelText = new Text({\n text: this._buttonLabel,\n style: textConfig?.textStyle\n });\n }\n // Add to placeHolder when created\n this._placeHolder.addChild(this._labelText);\n } else {\n // Update existing text content and style\n this._labelText.text = this._buttonLabel;\n\n if (this._labelText instanceof Text && textConfig?.textStyle) {\n this._labelText.style = textConfig.textStyle;\n }\n }\n\n // Apply text layout if specified in textConfig\n if (this._labelText && textConfig?.layout) {\n this._labelText.layout = textConfig.layout;\n }\n\n // Apply anchor if specified (only for Pixi Text, not SpriteText)\n if (this._labelText instanceof Text && textConfig?.anchor) {\n this._labelText.anchor.set(textConfig.anchor.x, textConfig.anchor.y);\n }\n }\n\n // Public API\n public get enabled(): boolean {\n return this._enabled;\n }\n\n public set enabled(value: boolean) {\n this._enabled = value;\n this._buttonBehaviors.isEnabled = value;\n\n if (!value) {\n this.setState('disabled');\n } else {\n this.setState('up');\n }\n }\n\n public get buttonLabel(): string {\n return this._buttonLabel;\n }\n\n public set buttonLabel(value: string) {\n this._buttonLabel = value;\n const currentStateData = this.getCurrentStateData();\n if (currentStateData) {\n this.updateText(currentStateData);\n }\n }\n\n public set iconTexture(iconTextures: IconTextureConfig | null) {\n this._iconTextures = iconTextures;\n const currentStateData = this.getCurrentStateData();\n if (currentStateData) {\n this.updateIcon(currentStateData);\n }\n }\n\n public get iconTexture(): IconTextureConfig | null {\n return this._iconTextures;\n }\n\n public get text(): Text | SpriteText | null {\n return this._labelText;\n }\n\n public get background(): Graphics | Sprite {\n return this._background;\n }\n\n public get icon(): Graphics | Sprite | undefined {\n return this._icon;\n }\n\n public get placeHolder(): Container {\n return this._placeHolder;\n }\n\n public get currentState(): keyof ButtonCompSkinData {\n return this._currentState;\n }\n\n public addButtonEffect(...effects: ButtonEffect[]): this {\n effects.forEach((effect) => {\n this._effects.set(effect.name, effect);\n effect._onAttach(this, this._currentState);\n });\n return this;\n }\n\n public removeButtonEffect(name: string): boolean {\n const effect = this._effects.get(name);\n if (effect) {\n effect._onDetach();\n return this._effects.delete(name);\n }\n return false;\n }\n\n public hasButtonEffect(name: string): boolean {\n return this._effects.has(name);\n }\n\n public getButtonEffect(name: string): ButtonEffect | undefined {\n return this._effects.get(name);\n }\n\n private notifyEffectsStateChange(): void {\n this._effects.forEach((effect) => {\n effect._onStateChange(this, this._currentState, this._previousState);\n });\n }\n\n public destroy(): void {\n this._effects.forEach((effect) => {\n effect._onDestroy();\n });\n this._effects.clear();\n this._buttonBehaviors.destroy();\n super.destroy();\n }\n\n public get behavior(): ButtonBehavior {\n return this._buttonBehaviors;\n }\n}\n","import { Container, Graphics, Sprite, Texture, Text, TextStyleOptions, Rectangle } from 'pixi.js';\nimport { merge } from 'lodash';\nimport { DeepPartial, GraphicsConfig, SpriteConfig } from './Component.types';\nimport { Skinable } from './Skinable';\nimport { InputBehavior, InputBehaviorOptions } from '../behaviors';\n\nexport interface InputCompStateData {\n background?: GraphicsConfig | SpriteConfig;\n textStyle?: TextStyleOptions;\n padding?: number;\n}\n\nexport interface InputCompSkinData {\n up: InputCompStateData;\n over?: DeepPartial<InputCompStateData>;\n focused?: DeepPartial<InputCompStateData>;\n disabled?: DeepPartial<InputCompStateData>;\n}\n\nexport interface InputCompOptions extends InputBehaviorOptions {\n skinData?: InputCompSkinData;\n}\n\nexport class InputComp extends Skinable<InputCompSkinData, typeof Container>(Container) {\n private _background: Graphics | Sprite;\n private _textMask: Graphics;\n private _textLabel: Text;\n private _behavior: InputBehavior;\n private _currentState: keyof InputCompSkinData = 'up';\n private _isFocused: boolean = false;\n\n constructor(options: InputCompOptions = {}) {\n super();\n this.eventMode = 'static';\n\n // visuals\n this._background = new Graphics();\n this._textLabel = new Text({\n text: '',\n style: { fontSize: 24, fill: 0xffffff },\n });\n this._textMask = new Graphics();\n this.addChild(this._background);\n this.addChild(this._textLabel);\n this.addChild(this._textMask);\n\n // behavior\n this._behavior = new InputBehavior({ ...options });\n this._behavior.attachView(this);\n\n // events\n this._behavior.on('input', (val) => {\n this._textLabel.text = val;\n });\n this._behavior.on('stateChanged', (state) => {\n this._isFocused = state.focused;\n // precedence: disabled > focused > up\n if (!state.enabled) {\n this.setState('disabled');\n } else if (state.focused) {\n this.setState('focused');\n } else {\n this.setState('up');\n }\n });\n\n // pointer over/out -> only when not focused and enabled\n this.eventMode = 'static';\n this.on('pointerover', () => {\n if (this._behavior.enabled && !this._isFocused) {\n this.setState('over');\n }\n });\n this.on('pointerout', () => {\n if (this._behavior.enabled && !this._isFocused) {\n this.setState('up');\n }\n });\n\n // initial skin\n this.setSkinData(options.skinData || null, { mergeWithExisting: false });\n }\n\n private setState(state: keyof InputCompSkinData): void {\n this._currentState = state;\n this.updateVisualState();\n }\n\n protected skinApply(_: InputCompSkinData | null): void {\n this.updateVisualState();\n }\n\n private updateVisualState(): void {\n const current = this.getCurrentStateData();\n if (!current) return;\n\n this.updateBackground(current);\n this.updateTextMask(current);\n\n if (current.textStyle) {\n this._textLabel.style = current.textStyle;\n }\n\n this._textLabel.position.set(\n current.padding || 0,\n (this._background.height - this._textLabel.height) / 2,\n );\n this._textLabel.mask = this._textMask;\n this._behavior.updateDomPosition();\n this.updateHitArea();\n }\n\n private updateTextMask(current: InputCompStateData) {\n this._textMask\n .clear()\n .rect(\n current.padding || 0,\n 0,\n this._background.width - (current.padding || 0) * 2,\n this._background.height,\n )\n .fill({ color: 0xffffff, alpha: 1 });\n }\n\n private getCurrentStateData(): InputCompStateData | null {\n const skin = this.getSkinData();\n if (!skin) return null;\n\n const baseData = skin.up;\n const stateData = (skin as any)[this._currentState] || {};\n return merge({}, baseData, stateData);\n }\n\n private updateBackground(stateData: InputCompStateData): void {\n const bg = stateData.background;\n if (!bg) return;\n\n if ('texture' in bg) {\n // sprite background\n if (this._background) {\n this.removeChild(this._background);\n this._background.destroy();\n }\n const texture = Texture.from(bg.texture);\n this._background = new Sprite(texture);\n if (bg.alpha !== undefined) this._background.alpha = bg.alpha;\n if (bg.tint !== undefined) this._background.tint = bg.tint;\n this.addChildAt(this._background, 0);\n } else {\n // graphics background\n if (!(this._background instanceof Graphics)) {\n if (this._background) {\n this.removeChild(this._background);\n this._background.destroy();\n }\n this._background = new Graphics();\n this.addChildAt(this._background, 0);\n }\n\n const graphics = this._background as Graphics;\n graphics.clear();\n\n // Draw shape based on config type\n if ('circle' in bg) {\n graphics.circle(0, 0, bg.circle.radius);\n } else if ('rect' in bg) {\n graphics.rect(0, 0, bg.rect.width, bg.rect.height);\n } else if ('roundRect' in bg) {\n graphics.roundRect(0, 0, bg.roundRect.width, bg.roundRect.height, bg.roundRect.radius);\n }\n\n // Apply fill if specified\n if (bg.fill) {\n graphics.fill(bg.fill);\n }\n\n // Apply stroke if specified\n if (bg.stroke) {\n graphics.stroke(bg.stroke);\n }\n }\n }\n\n private updateHitArea(): void {\n if (this._background) {\n this.hitArea = new Rectangle(0, 0, this._background.width, this._background.height);\n }\n }\n\n public get behavior(): InputBehavior {\n return this._behavior;\n }\n\n public destroy(): void {\n this._behavior.destroy();\n super.destroy();\n }\n}\n","import { Container, Graphics, Sprite, Texture, type FillInput, type StrokeInput } from 'pixi.js';\nimport { merge } from 'lodash';\nimport { DeepPartial, GraphicsConfig, SpriteConfig } from './Component.types';\nimport { Skinable } from './Skinable';\nimport { ScrollbarBehavior, ScrollbarOptions } from '../behaviors';\n\nexport interface SliderProgressConfig {\n fill?: FillInput;\n stroke?: StrokeInput;\n}\n\nexport interface SliderCompStateData {\n track?: GraphicsConfig | SpriteConfig;\n progress?: SliderProgressConfig;\n knob?: GraphicsConfig | SpriteConfig;\n scale?: number;\n margin?: { start?: number; end?: number };\n orientation?: 'horizontal' | 'vertical';\n}\n\nexport interface SliderCompSkinData {\n up: SliderCompStateData;\n down?: DeepPartial<SliderCompStateData>;\n over?: DeepPartial<SliderCompStateData>;\n disabled?: DeepPartial<SliderCompStateData>;\n}\n\nexport interface SliderCompOptions extends Omit<ScrollbarOptions, 'margin'> {\n skinData?: SliderCompSkinData;\n}\n\nexport class SliderComp extends Skinable<SliderCompSkinData, typeof Container>(Container) {\n private _slider: ScrollbarBehavior;\n private _trackContainer: Container;\n private _progressContainer: Container;\n private _knobContainer: Container;\n private _currentState: keyof SliderCompSkinData = 'up';\n private _progressGraphics: Graphics | null = null;\n private _progressConfig: SliderProgressConfig | null = null;\n\n constructor(options: SliderCompOptions = {}) {\n super();\n this.layout = true;\n this.eventMode = 'passive';\n\n // Create parent containers\n this._trackContainer = new Container();\n this._trackContainer.eventMode = 'static';\n this._progressContainer = new Container();\n this._progressContainer.eventMode = 'none';\n this._knobContainer = new Container();\n this._knobContainer.eventMode = 'static';\n this.addChild(this._trackContainer);\n this.addChild(this._progressContainer);\n this.addChild(this._knobContainer);\n\n // Create ScrollbarBehavior and attach containers\n this._slider = new ScrollbarBehavior({\n orientation: 'horizontal',\n min: 0,\n max: 100,\n step: 1,\n value: 0,\n ...options,\n });\n\n this._slider.attachViews(this._trackContainer, this._knobContainer);\n\n // Setup event listeners\n this.setupEventListeners();\n\n // Set initial value\n if (options.value !== undefined) {\n this._slider.value = options.value;\n }\n\n // Initialize skin data via API (no merge on first set)\n this.setSkinData(options.skinData || null, { mergeWithExisting: false });\n }\n\n private setupEventListeners(): void {\n // Knob events\n this._slider.on('knobOver', () => this.setState('over'));\n this._slider.on('knobDown', () => this.setState('down'));\n this._slider.on('knobUp', () => this.setState('up'));\n this._slider.on('knobOut', () => this.setState('up'));\n this._slider.on('knobClick', () => this.setState('up'));\n this._slider.on('trackOver', () => this.setState('over'));\n this._slider.on('trackDown', () => this.setState('down'));\n this._slider.on('trackUp', () => this.setState('up'));\n this._slider.on('trackOut', () => this.setState('up'));\n\n // Update progress bar width when value changes\n this._slider.on('scroll', (_value, percentage) => {\n this.updateProgressWidth(percentage);\n });\n }\n\n private setState(state: keyof SliderCompSkinData): void {\n this._currentState = state;\n this.updateVisualState();\n }\n\n private updateVisualState(): void {\n const currentStateData = this.getCurrentStateData();\n if (!currentStateData) return;\n\n // If orientation comes from skin data, update it\n if (currentStateData.orientation) {\n this._slider.orientation = currentStateData.orientation;\n }\n\n // Update track\n this.updateTrack(currentStateData);\n\n // Update progress bar\n this.updateProgress(currentStateData);\n\n // Update knob\n this.updateKnob(currentStateData);\n\n // Update margin from skin data\n if (currentStateData.margin !== undefined) {\n this._slider.margin = currentStateData.margin;\n }\n\n // Update scale\n if (currentStateData.scale !== undefined) {\n this.scale.set(currentStateData.scale);\n }\n\n this.boundsArea = this._trackContainer.getLocalBounds().rectangle;\n }\n\n protected skinApply(_: SliderCompSkinData | null): void {\n this.updateVisualState();\n }\n\n private getCurrentStateData(): SliderCompStateData | null {\n const skin = this.getSkinData();\n if (!skin) return null;\n\n const baseData = skin.up;\n const stateData = (skin as any)[this._currentState] || {};\n\n // Use lodash merge like merge({}, baseData, stateData)\n return merge({}, baseData, stateData);\n }\n\n private updateTrack(stateData: SliderCompStateData): void {\n const trackConfig = stateData.track;\n if (!trackConfig) return;\n\n this._trackContainer.removeChildren();\n\n let newTrack: Graphics | Sprite;\n\n if ('texture' in trackConfig) {\n newTrack = new Sprite(Texture.from(trackConfig.texture));\n\n if (trackConfig.alpha !== undefined) newTrack.alpha = trackConfig.alpha;\n if (trackConfig.tint !== undefined) newTrack.tint = trackConfig.tint;\n } else {\n newTrack = new Graphics();\n\n // Draw shape based on config type\n if ('circle' in trackConfig) {\n newTrack.circle(0, 0, trackConfig.circle.radius);\n } else if ('rect' in trackConfig) {\n newTrack.rect(0, 0, trackConfig.rect.width, trackConfig.rect.height);\n } else if ('roundRect' in trackConfig) {\n newTrack.roundRect(\n 0,\n 0,\n trackConfig.roundRect.width,\n trackConfig.roundRect.height,\n trackConfig.roundRect.radius,\n );\n }\n\n // Apply fill if specified\n if (trackConfig.fill) {\n newTrack.fill(trackConfig.fill);\n }\n\n // Apply stroke if specified\n if (trackConfig.stroke) {\n newTrack.stroke(trackConfig.stroke);\n }\n }\n\n this._trackContainer.addChild(newTrack);\n\n this._slider.refreshSizes?.();\n }\n\n private updateProgress(stateData: SliderCompStateData): void {\n const progressConfig = stateData.progress;\n this._progressContainer.removeChildren();\n\n if (!progressConfig) {\n this._progressGraphics = null;\n this._progressConfig = null;\n return;\n }\n\n this._progressConfig = progressConfig;\n this._progressGraphics = new Graphics();\n this._progressContainer.addChild(this._progressGraphics);\n\n // Draw initial progress at current percentage\n this.updateProgressWidth(this._slider.percentage);\n }\n\n private updateProgressWidth(percentage: number): void {\n if (!this._progressGraphics || !this._progressConfig) return;\n\n this._progressGraphics.clear();\n\n // Derive dimensions from track config\n const trackWidth = this.getTrackWidth();\n const trackHeight = this.getTrackHeight();\n const trackRadius = this.getTrackRadius();\n const progressWidth = trackWidth * percentage;\n\n if (progressWidth <= 0 || trackHeight <= 0) return;\n\n if (trackRadius > 0) {\n const radius = Math.min(trackRadius, progressWidth / 2);\n this._progressGraphics.roundRect(0, 0, progressWidth, trackHeight, radius);\n } else {\n this._progressGraphics.rect(0, 0, progressWidth, trackHeight);\n }\n\n if (this._progressConfig.fill) {\n this._progressGraphics.fill(this._progressConfig.fill);\n }\n if (this._progressConfig.stroke) {\n this._progressGraphics.stroke(this._progressConfig.stroke);\n }\n }\n\n private getTrackWidth(): number {\n const skin = this.getSkinData();\n if (!skin?.up?.track) return 0;\n const track = skin.up.track;\n if ('texture' in track) return this._trackContainer.width;\n if ('roundRect' in track) return track.roundRect.width;\n if ('rect' in track) return track.rect.width;\n return 0;\n }\n\n private getTrackHeight(): number {\n const skin = this.getSkinData();\n if (!skin?.up?.track) return 0;\n const track = skin.up.track;\n if ('texture' in track) return this._trackContainer.height;\n if ('roundRect' in track) return track.roundRect.height;\n if ('rect' in track) return track.rect.height;\n return 0;\n }\n\n private getTrackRadius(): number {\n const skin = this.getSkinData();\n if (!skin?.up?.track) return 0;\n const track = skin.up.track;\n if ('roundRect' in track) return track.roundRect.radius;\n return 0;\n }\n\n private updateKnob(stateData: SliderCompStateData): void {\n const knobConfig = stateData.knob;\n if (!knobConfig) return;\n\n this._knobContainer.removeChildren();\n\n let newKnob: Graphics | Sprite;\n\n if ('texture' in knobConfig) {\n newKnob = new Sprite(Texture.from(knobConfig.texture));\n if (knobConfig.alpha !== undefined) newKnob.alpha = knobConfig.alpha;\n if (knobConfig.tint !== undefined) newKnob.tint = knobConfig.tint;\n // Center it\n newKnob.anchor.set(0.5, 0.5);\n } else {\n newKnob = new Graphics();\n\n // Draw shape based on config type\n if ('circle' in knobConfig) {\n newKnob.circle(0, 0, knobConfig.circle.radius);\n } else if ('rect' in knobConfig) {\n newKnob.rect(0, 0, knobConfig.rect.width, knobConfig.rect.height);\n } else if ('roundRect' in knobConfig) {\n newKnob.roundRect(\n 0,\n 0,\n knobConfig.roundRect.width,\n knobConfig.roundRect.height,\n knobConfig.roundRect.radius,\n );\n }\n\n // Apply fill if specified\n if (knobConfig.fill) {\n newKnob.fill(knobConfig.fill);\n }\n\n // Apply stroke if specified\n if (knobConfig.stroke) {\n newKnob.stroke(knobConfig.stroke);\n }\n\n // Center it based on shape type\n if ('circle' in knobConfig) {\n newKnob.pivot.set(0, 0);\n } else if ('rect' in knobConfig) {\n newKnob.pivot.set(knobConfig.rect.width / 2, knobConfig.rect.height / 2);\n } else if ('roundRect' in knobConfig) {\n newKnob.pivot.set(knobConfig.roundRect.width / 2, knobConfig.roundRect.height / 2);\n }\n }\n\n this._knobContainer.addChild(newKnob);\n this._slider.refreshSizes?.();\n }\n\n // When the component is destroyed, clean up event listeners\n public destroy(): void {\n // Also destroy the Scrollbar behavior\n this._slider.destroy();\n\n super.destroy();\n }\n\n public get behavior(): ScrollbarBehavior {\n return this._slider;\n }\n\n // Refresh sizes (call when track/knob size changes)\n public refreshSizes(): void {\n this._slider.refreshSizes();\n }\n}\n","import { type TextStyleOptions, ColorMatrixFilter } from 'pixi.js';\nimport type {\n ButtonComp,\n ButtonCompSkinData,\n ButtonCompStateData,\n ButtonStateKey,\n ButtonEffect,\n} from './ButtonComp';\nimport type { SpriteConfig } from './Component.types';\n\n/**\n * Configuration interface for generating button skins with pattern-based texture naming.\n *\n * This interface allows you to define button skins using a base texture name and automatic\n * state suffix generation, reducing boilerplate code and bundle size.\n *\n * @example\n * ```typescript\n * const config: ButtonSkinGeneratorConfig = {\n * background: {\n * texture: 'btn_spin',\n * perState: true,\n * config: { anchor: { x: 0.5, y: 0.5 } }\n * },\n * icon: {\n * texture: 'icon_spin',\n * perState: false,\n * config: { anchor: { x: 0.5, y: 0.5 } }\n * }\n * };\n * ```\n */\nexport interface ButtonSkinGeneratorConfig {\n /**\n * Array of button states to generate.\n *\n * @default ['up', 'over', 'down', 'disabled']\n */\n states?: ButtonStateKey[];\n\n /**\n * Separator between base name and state suffix.\n *\n * @default '_'\n */\n separator?: string;\n\n /**\n * Background configuration for the button.\n */\n background?: {\n /**\n * Base texture name for the background.\n */\n texture: string;\n\n /**\n * Whether background texture changes per state.\n *\n * If true, generates 'btn_name_up', 'btn_name_over', etc.\n * If false, uses the same background texture for all states.\n *\n * @default true\n */\n perState?: boolean;\n\n /**\n * Additional sprite configuration for the background.\n */\n config?: Partial<SpriteConfig>;\n };\n\n /**\n * Icon configuration for the button.\n *\n * If provided, icons will be added to the button skin.\n */\n icon?: {\n /**\n * Base texture name for the icon.\n */\n texture: string;\n\n /**\n * Whether icon texture changes per state.\n *\n * If true, generates 'icon_name_up', 'icon_name_over', etc.\n * If false, uses the same icon texture for all states.\n *\n * @default false\n */\n perState?: boolean;\n\n /**\n * Additional sprite configuration for the icon.\n */\n config?: Partial<SpriteConfig>;\n };\n\n textStyle?: TextStyleOptions;\n}\n\n/**\n * Creates a ButtonCompSkinData object using pattern-based texture naming.\n *\n * This function generates button skin configurations by automatically creating\n * texture names for each state based on a base name and separator pattern.\n * Reduces repetitive code and bundle size compared to manually defining each state.\n *\n * @param config - Configuration object for button skin generation\n * @returns Complete ButtonCompSkinData object with all specified states\n *\n * @example\n * ```typescript\n * // Simple button with background only\n * const skin = createButtonSkin({\n * background: {\n * texture: 'btn_bet_plus',\n * perState: true\n * }\n * });\n * // Generates: btn_bet_plus_up, btn_bet_plus_over, btn_bet_plus_down, btn_bet_plus_disabled\n *\n * // Button with icon (icon doesn't change per state)\n * const spinSkin = createButtonSkin({\n * background: {\n * texture: 'btn_spin',\n * perState: true,\n * config: { anchor: { x: 0.5, y: 0.5 } }\n * },\n * icon: {\n * texture: 'icon_spin',\n * perState: false,\n * config: { anchor: { x: 0.5, y: 0.5 } }\n * }\n * });\n *\n * // Button with dynamic icon (icon changes per state)\n * const dynamicSkin = createButtonSkin({\n * background: {\n * texture: 'btn_action',\n * perState: true\n * },\n * icon: {\n * texture: 'icon_action',\n * perState: true\n * }\n * });\n * // Generates: icon_action_up, icon_action_over, icon_action_down, icon_action_disabled\n *\n * // Custom states and configuration\n * const customSkin = createButtonSkin({\n * background: {\n * texture: 'btn_custom',\n * perState: true,\n * config: { alpha: 0.9, tint: 0xFFFFFF }\n * },\n * states: ['up', 'over'],\n * separator: '-'\n * });\n * ```\n */\nexport function createSpriteButtonSkin(config: ButtonSkinGeneratorConfig): ButtonCompSkinData {\n const {\n states = ['up', 'over', 'down', 'disabled'],\n separator = '_',\n background,\n icon,\n textStyle,\n } = config;\n\n const skin: Partial<Record<ButtonStateKey, ButtonCompStateData>> = {};\n\n states.forEach((state) => {\n // Handle background\n\n if (background) {\n if (background.perState ?? true) {\n if (!skin[state]) skin[state] = {};\n skin[state]!.background = {\n texture: `${background.texture}${separator}${state}`,\n ...background.config,\n };\n } else if (state === 'up') {\n if (!skin[state]) skin[state] = {};\n skin[state]!.background = {\n texture: background.texture,\n ...background.config,\n };\n }\n }\n\n if (textStyle) {\n if (!skin[state]) skin[state] = {};\n skin[state]!.textConfig = { type: 'text', textStyle };\n }\n\n // Handle icon\n if (icon) {\n if (icon.perState) {\n if (!skin[state]) skin[state] = {};\n skin[state]!.icon = {\n texture: `${icon.texture}${separator}${state}`,\n ...icon.config,\n };\n } else if (state === 'up') {\n if (!skin[state]) skin[state] = {};\n skin[state]!.icon = {\n texture: icon.texture,\n ...icon.config,\n };\n }\n }\n });\n\n return skin as ButtonCompSkinData;\n}\n\n/**\n * Context object passed to effect handlers containing button parts and state information.\n *\n * Provides access to all visual elements of the button (background, icon, text)\n * and current state information for creating custom animations and behaviors.\n *\n * @example\n * ```typescript\n * const effect = createButtonEffect({\n * onStateChange: (ctx) => {\n * if (ctx.state === 'over' && ctx.icon) {\n * gsap.to(ctx.icon, { rotation: Math.PI * 2, duration: 1 });\n * }\n * }\n * });\n * ```\n */\nexport interface ButtonEffectContext {\n /**\n * Reference to the button instance.\n */\n button: ButtonComp;\n\n /**\n * Current button state.\n */\n state: ButtonStateKey;\n\n /**\n * Previous button state (undefined on first state change).\n */\n previousState?: ButtonStateKey;\n\n /**\n * Background sprite or graphics element.\n */\n background: ButtonComp['background'];\n\n /**\n * Icon sprite element (may be undefined if button has no icon).\n */\n icon: ButtonComp['icon'];\n\n /**\n * Text label element (may be null if button has no text).\n */\n text: ButtonComp['text'];\n\n /**\n *\n */\n placeHolder: ButtonComp['placeHolder'];\n}\n\n/**\n * Configuration for creating a button effect.\n *\n * Effects are composable behaviors that can be attached to buttons to add\n * animations, visual feedback, or custom logic triggered by state changes or updates.\n *\n * @example\n * ```typescript\n * // Simple hover glow effect\n * const glowEffect = createButtonEffect({\n * name: 'glow',\n * onStateChange: (ctx) => {\n * if (ctx.state === 'over') {\n * gsap.to(ctx.background, { alpha: 1.2, duration: 0.3 });\n * } else {\n * gsap.to(ctx.background, { alpha: 1, duration: 0.3 });\n * }\n * }\n * });\n *\n * // Continuous rotation effect\n * const rotateEffect = createButtonEffect({\n * name: 'rotate',\n * onAttach: (ctx) => {\n * if (ctx.icon) {\n * gsap.to(ctx.icon, {\n * rotation: Math.PI * 2,\n * duration: 2,\n * repeat: -1,\n * ease: 'none'\n * });\n * }\n * }\n * });\n * ```\n */\nexport interface ButtonEffectConfig {\n /**\n * Unique name for the effect.\n *\n * Used to identify and remove effects later.\n */\n name: string;\n\n /**\n * Called when the effect is attached to a button.\n *\n * Use this to initialize animations, store references, or set up initial state.\n *\n * @param ctx - Effect context with button parts and state\n */\n onAttach?(ctx: ButtonEffectContext): void;\n\n /**\n * Called when the effect is detached from a button.\n *\n * Use this to clean up animations, kill tweens, or remove event listeners.\n */\n onDetach?(): void;\n\n /**\n * Called when the button state changes.\n *\n * This is where you implement state-dependent animations and behaviors.\n *\n * @param ctx - Effect context with current and previous state\n *\n * @example\n * ```typescript\n * onStateChange: (ctx) => {\n * if (ctx.state === 'down') {\n * gsap.to(ctx.button.scale, { x: 0.95, y: 0.95, duration: 0.1 });\n * } else if (ctx.previousState === 'down') {\n * gsap.to(ctx.button.scale, { x: 1, y: 1, duration: 0.1 });\n * }\n * }\n * ```\n */\n onStateChange?(ctx: ButtonEffectContext): void;\n\n /**\n * Called when the button is destroyed.\n *\n * Final cleanup opportunity before the button is removed.\n */\n onDestroy?(): void;\n}\n\n/**\n * Creates a button effect from a configuration object.\n *\n * Button effects are reusable, composable behaviors that can be attached to any button\n * to add animations, visual feedback, or custom logic. Effects receive a context object\n * with access to all button parts (background, icon, text) and can respond to state changes\n * or frame updates.\n *\n * @param config - Effect configuration with lifecycle handlers\n * @returns ButtonEffect instance that can be attached to buttons\n *\n * @example\n * ```typescript\n * import gsap from 'gsap';\n *\n * // Create a spin effect for button icons\n * const spinEffect = createButtonEffect({\n * name: 'iconSpin',\n * onStateChange: (ctx) => {\n * if (!ctx.icon) return;\n *\n * if (ctx.state === 'over' || ctx.state === 'down') {\n * gsap.to(ctx.icon, {\n * rotation: Math.PI * 2,\n * duration: 1,\n * repeat: -1,\n * ease: 'none'\n * });\n * } else {\n * gsap.killTweensOf(ctx.icon);\n * gsap.to(ctx.icon, { rotation: 0, duration: 0.3 });\n * }\n * },\n * onDetach: () => {\n * // Cleanup is handled in onStateChange\n * }\n * });\n *\n * // Attach to button\n * const button = new ButtonComp();\n * button.addEffect(spinEffect);\n *\n * // Create a pulse effect\n * const pulseEffect = createButtonEffect({\n * name: 'pulse',\n * onAttach: (ctx) => {\n * gsap.to(ctx.button.scale, {\n * x: 1.05,\n * y: 1.05,\n * duration: 0.8,\n * repeat: -1,\n * yoyo: true,\n * ease: 'sine.inOut'\n * });\n * },\n * onDetach: () => {\n * // Tweens are automatically killed when button is destroyed\n * }\n * });\n *\n * // Create a custom update-based effect\n * let time = 0;\n * const waveEffect = createButtonEffect({\n * name: 'wave',\n * onUpdate: (deltaTime, ctx) => {\n * time += deltaTime;\n * if (ctx.icon) {\n * ctx.icon.y = Math.sin(time * 3) * 5;\n * }\n * }\n * });\n * ```\n */\nexport function createButtonEffect(config: ButtonEffectConfig): ButtonEffect {\n return {\n name: config.name,\n\n _onAttach(button: ButtonComp, state: ButtonStateKey): void {\n if (config.onAttach) {\n const ctx: ButtonEffectContext = {\n button,\n state,\n background: button.background,\n icon: button.icon,\n text: button.text,\n placeHolder: button.placeHolder,\n };\n config.onAttach(ctx);\n }\n },\n\n _onDetach(): void {\n config.onDetach?.();\n },\n\n _onStateChange(\n button: ButtonComp,\n state: ButtonStateKey,\n previousState?: ButtonStateKey,\n ): void {\n if (config.onStateChange) {\n const ctx: ButtonEffectContext = {\n button,\n state,\n previousState,\n background: button.background,\n icon: button.icon,\n text: button.text,\n placeHolder: button.placeHolder,\n };\n config.onStateChange(ctx);\n }\n },\n\n _onDestroy(): void {\n config.onDestroy?.();\n },\n };\n}\n\nexport interface ToggleIconSlideEffectOptions {\n duration?: number;\n ease?: string;\n offset?: number;\n}\n\nexport function createToggleIconSlideEffect(\n options?: ToggleIconSlideEffectOptions,\n): ButtonEffect {\n const { duration = 0.1, ease = 'expo.out', offset = 5 } = options ?? {};\n\n const updatePlaceholderPosition = (ctx: ButtonEffectContext, animDuration: number) => {\n if (!ctx.placeHolder || !ctx.background) return;\n\n const isSelected = ctx.state.startsWith('selected_');\n const bgWidth = ctx.background.width;\n const placeHolderBounds = ctx.placeHolder.getLocalBounds();\n\n if (ctx.icon) {\n const targetX = isSelected\n ? bgWidth - (placeHolderBounds.width + placeHolderBounds.x) - offset * 2\n : -placeHolderBounds.x + offset;\n\n import('gsap').then(({ default: gsap }) => {\n gsap.to(ctx.placeHolder, {\n x: targetX,\n duration: animDuration,\n ease,\n });\n });\n }\n };\n\n return createButtonEffect({\n name: 'toggleIconSlide',\n\n onAttach(ctx) {\n updatePlaceholderPosition(ctx, 0);\n },\n\n onStateChange(ctx) {\n updatePlaceholderPosition(ctx, duration);\n },\n\n onDetach() {\n // Cleanup handled by gsap automatically\n },\n });\n}\n\n/**\n * Options for the flat button effect.\n */\nexport interface FlatButtonEffectOptions {\n /** Background alpha on hover. @default 0.85 */\n overAlpha?: number;\n /** Scale factor on press. @default 0.95 */\n downScale?: number;\n /** Overall alpha on press. @default 0.9 */\n downAlpha?: number;\n /** Overall alpha when disabled. @default 0.5 */\n disabledAlpha?: number;\n /** Transition duration in seconds. @default 0.12 */\n duration?: number;\n /** GSAP ease string. @default 'power2.out' */\n ease?: string;\n}\n\n/**\n * Creates a flat button effect that provides code-driven visual feedback\n * for hover, press, and disabled states without requiring per-state textures.\n *\n * Automatically applied to every {@link ButtonComp} by default.\n * Opt-out via `button.removeButtonEffect('flatButton')`.\n *\n * @example\n * ```typescript\n * // Custom options\n * button.removeButtonEffect('flatButton');\n * button.addButtonEffect(createFlatButtonEffect({ downScale: 0.97 }));\n * ```\n */\nexport function createFlatButtonEffect(\n options?: FlatButtonEffectOptions,\n): ButtonEffect {\n const {\n overAlpha = 0.85,\n downScale = 0.95,\n downAlpha = 0.9,\n disabledAlpha = 0.5,\n duration = 0.12,\n ease = 'power2.out',\n } = options ?? {};\n\n let desatFilter: ColorMatrixFilter | null = null;\n\n const isOverState = (state: ButtonStateKey) =>\n state === 'over' || state === 'selected_over';\n\n const isDownState = (state: ButtonStateKey) =>\n state === 'down' || state === 'selected_down';\n\n const isDisabledState = (state: ButtonStateKey) =>\n state === 'disabled' || state === 'selected_disabled';\n\n const applyState = (ctx: ButtonEffectContext, animDuration: number) => {\n import('gsap').then(({ default: gsap }) => {\n // Kill any running effect tweens on relevant targets\n gsap.killTweensOf(ctx.button.scale);\n gsap.killTweensOf(ctx.button);\n\n if (isOverState(ctx.state)) {\n // Hover: slight background dim + brightness boost on icon or text\n gsap.to(ctx.button, { alpha: 1, duration: animDuration, ease });\n gsap.to(ctx.button.scale, { x: 1, y: 1, duration: animDuration, ease });\n gsap.to(ctx.background, { alpha: overAlpha, duration: animDuration, ease });\n\n // Brighten the content element (icon takes priority, fallback to text)\n const content = ctx.icon ?? ctx.text;\n if (content) {\n gsap.killTweensOf(content);\n gsap.to(content, { alpha: 1, duration: animDuration, ease });\n }\n\n removeDesatFilter(ctx);\n } else if (isDownState(ctx.state)) {\n // Press: scale down + alpha dim\n // gsap.to(ctx.button.scale, { x: downScale, y: downScale, duration: animDuration, ease });\n gsap.to(ctx.button, { alpha: downAlpha, duration: animDuration, ease });\n gsap.to(ctx.background, { alpha: 1, duration: animDuration, ease });\n\n const content = ctx.icon ?? ctx.text;\n if (content) {\n gsap.killTweensOf(content);\n gsap.to(content, { alpha: 1, duration: animDuration, ease });\n }\n\n removeDesatFilter(ctx);\n } else if (isDisabledState(ctx.state)) {\n // Disabled: desaturate + low alpha\n gsap.to(ctx.button, { alpha: disabledAlpha, duration: animDuration, ease });\n gsap.to(ctx.button.scale, { x: 1, y: 1, duration: animDuration, ease });\n gsap.to(ctx.background, { alpha: 1, duration: animDuration, ease });\n\n applyDesatFilter(ctx);\n } else {\n // Up / selected_up: reset everything\n gsap.to(ctx.button, { alpha: 1, duration: animDuration, ease });\n gsap.to(ctx.button.scale, { x: 1, y: 1, duration: animDuration, ease });\n gsap.to(ctx.background, { alpha: 1, duration: animDuration, ease });\n\n const content = ctx.icon ?? ctx.text;\n if (content) {\n gsap.killTweensOf(content);\n gsap.to(content, { alpha: 1, duration: animDuration, ease });\n }\n\n removeDesatFilter(ctx);\n }\n });\n };\n\n const applyDesatFilter = (ctx: ButtonEffectContext) => {\n if (!desatFilter) {\n desatFilter = new ColorMatrixFilter();\n }\n desatFilter.desaturate();\n\n const filters = ctx.button.filters ?? [];\n const arr = Array.isArray(filters) ? filters : [filters];\n if (!arr.includes(desatFilter)) {\n ctx.button.filters = [...arr, desatFilter];\n }\n };\n\n const removeDesatFilter = (ctx: ButtonEffectContext) => {\n if (!desatFilter) return;\n\n const filters = ctx.button.filters;\n if (filters) {\n const arr = Array.isArray(filters) ? filters : [filters];\n const idx = arr.indexOf(desatFilter);\n if (idx !== -1) {\n const next = arr.filter((f) => f !== desatFilter);\n ctx.button.filters = next.length > 0 ? next : null;\n }\n }\n };\n\n const cleanup = (button?: ButtonComp) => {\n import('gsap').then(({ default: gsap }) => {\n if (button) {\n gsap.killTweensOf(button.scale);\n gsap.killTweensOf(button);\n gsap.killTweensOf(button.background);\n const content = button.icon ?? button.text;\n if (content) gsap.killTweensOf(content);\n }\n });\n desatFilter = null;\n };\n\n let _button: ButtonComp | null = null;\n\n return createButtonEffect({\n name: 'flatButton',\n\n onAttach(ctx) {\n _button = ctx.button;\n applyState(ctx, 0);\n },\n\n onStateChange(ctx) {\n applyState(ctx, duration);\n },\n\n onDetach() {\n if (_button) {\n cleanup(_button);\n _button = null;\n }\n },\n\n onDestroy() {\n if (_button) {\n cleanup(_button);\n _button = null;\n }\n },\n });\n}\n","// Bounds.ts\nimport { Container, Point, Rectangle } from 'pixi.js';\n\n/**\n * Configuration options for alignment operations.\n *\n * @example\n * ```typescript\n * // Align to selection (default, no options needed)\n * Align.hCenter([sprite1, sprite2]);\n *\n * // Align to container\n * Align.left([sprite1, sprite2], { container: myContainer });\n *\n * // Align to rectangle\n * Align.hCenter([sprite1], { container: new Rectangle(0, 0, 1920, 1080) });\n *\n * // Align to key object\n * Align.top([sprite1, sprite2], { key: mainSprite });\n * ```\n */\nexport interface AlignOptions {\n key?: Container;\n container?: Container | Rectangle;\n}\n\nfunction rectToBoundsLike(r: Rectangle): BoundsLike {\n const left = r.x;\n const top = r.y;\n const width = r.width;\n const height = r.height;\n const right = left + width;\n const bottom = top + height;\n return {\n left,\n right,\n top,\n bottom,\n width,\n height,\n centerX: left + width / 2,\n centerY: top + height / 2,\n };\n}\n\n/**\n * Represents the bounding box of a container with convenient access to edges and center points.\n *\n * This interface provides a virtual container that describes the bounds of one or more\n * PixiJS containers, useful for alignment and layout calculations.\n *\n * @example\n * ```typescript\n * const bounds: BoundsLike = {\n * left: 0,\n * right: 100,\n * top: 0,\n * bottom: 50,\n * width: 100,\n * height: 50,\n * centerX: 50,\n * centerY: 25\n * };\n * ```\n */\nexport interface BoundsLike {\n /** Left edge X coordinate */\n left: number;\n /** Right edge X coordinate */\n right: number;\n /** Top edge Y coordinate */\n top: number;\n /** Bottom edge Y coordinate */\n bottom: number;\n /** Total width (right - left) */\n width: number;\n /** Total height (bottom - top) */\n height: number;\n /** Horizontal center X coordinate */\n centerX: number;\n /** Vertical center Y coordinate */\n centerY: number;\n}\n\n/**\n * Gets the common parent container of all items.\n *\n * All items must share the same parent, otherwise an error is thrown.\n * This is essential for coordinate transformations in alignment operations.\n *\n * @param items - Array of containers to check\n * @returns The common parent container\n * @throws {Error} If items don't have a parent or don't share the same parent\n *\n * @example\n * ```typescript\n * const parent = getCommonParent([sprite1, sprite2, sprite3]);\n * ```\n */\nexport function getCommonParent(items: Container[]): Container {\n const parent = items[0]?.parent as Container | undefined;\n if (!parent) throw new Error('Items must have a parent');\n for (const it of items) {\n if (it.parent !== parent) throw new Error('All items must share the same parent');\n }\n return parent;\n}\n\n/**\n * Calculates the bounds of a child container in its parent's coordinate space.\n *\n * This function handles coordinate transformations correctly, accounting for\n * rotation, scale, and skew of the child relative to the parent.\n *\n * @param child - The child container to measure\n * @param parent - The parent container (coordinate space reference)\n * @returns Bounds of the child in parent's local coordinates\n *\n * @example\n * ```typescript\n * const bounds = getLocalBoundsInParent(sprite, container);\n * console.log(`Width: ${bounds.width}, Height: ${bounds.height}`);\n * console.log(`Center: (${bounds.centerX}, ${bounds.centerY})`);\n * ```\n */\nexport function getLocalBoundsInParent(child: Container, parent: Container): BoundsLike {\n const world = child.getBounds();\n const topLeft = parent.toLocal(new Point(world.x, world.y));\n const bottomRight = parent.toLocal(new Point(world.x + world.width, world.y + world.height));\n const left = Math.min(topLeft.x, bottomRight.x);\n const right = Math.max(topLeft.x, bottomRight.x);\n const top = Math.min(topLeft.y, bottomRight.y);\n const bottom = Math.max(topLeft.y, bottomRight.y);\n const width = right - left;\n const height = bottom - top;\n return {\n left,\n right,\n top,\n bottom,\n width,\n height,\n centerX: left + width / 2,\n centerY: top + height / 2,\n };\n}\n\n/**\n * Calculates the combined bounding box of multiple containers.\n *\n * This creates a virtual container that encompasses all provided items,\n * similar to selecting multiple objects in Photoshop and seeing their combined bounds.\n *\n * @param items - Array of containers to measure\n * @param parent - Optional parent container for coordinate space (defaults to common parent)\n * @returns Combined bounds of all items\n *\n * @example\n * ```typescript\n * const bounds = getSelectionBounds([sprite1, sprite2, sprite3]);\n * console.log(`Selection size: ${bounds.width} x ${bounds.height}`);\n * console.log(`Selection center: (${bounds.centerX}, ${bounds.centerY})`);\n * ```\n */\nexport function getSelectionBounds(items: Container[], parent?: Container): BoundsLike {\n const p = parent ?? getCommonParent(items);\n let left = Infinity,\n right = -Infinity,\n top = Infinity,\n bottom = -Infinity;\n for (const it of items) {\n const b = getLocalBoundsInParent(it, p);\n left = Math.min(left, b.left);\n right = Math.max(right, b.right);\n top = Math.min(top, b.top);\n bottom = Math.max(bottom, b.bottom);\n }\n const width = right - left;\n const height = bottom - top;\n return {\n left,\n right,\n top,\n bottom,\n width,\n height,\n centerX: left + width / 2,\n centerY: top + height / 2,\n };\n}\n\nexport function getReferenceBounds(\n items: Container[],\n options?: AlignOptions,\n): { ref: BoundsLike; parent: Container } {\n if (options?.container) {\n const box = options.container;\n if (box instanceof Container) {\n const parent = box;\n const world = parent.getBounds();\n const topLeft = parent.toLocal(new Point(world.x, world.y));\n const bottomRight = parent.toLocal(new Point(world.x + world.width, world.y + world.height));\n const left = Math.min(topLeft.x, bottomRight.x);\n const right = Math.max(topLeft.x, bottomRight.x);\n const top = Math.min(topLeft.y, bottomRight.y);\n const bottom = Math.max(topLeft.y, bottomRight.y);\n const width = right - left;\n const height = bottom - top;\n return {\n ref: {\n left,\n right,\n top,\n bottom,\n width,\n height,\n centerX: left + width / 2,\n centerY: top + height / 2,\n },\n parent,\n };\n } else {\n const parent = getCommonParent(items);\n return { ref: rectToBoundsLike(box), parent };\n }\n }\n\n const parent = getCommonParent(items);\n if (options?.key) {\n if (options.key.parent !== parent) throw new Error('key and items must share the same parent');\n return { ref: getLocalBoundsInParent(options.key, parent), parent };\n }\n\n return { ref: getSelectionBounds(items, parent), parent };\n}\n\nexport function nudgeX(child: Container, dx: number) {\n child.x += dx;\n}\nexport function nudgeY(child: Container, dy: number) {\n child.y += dy;\n}\n","import { Container, Point, Rectangle } from 'pixi.js';\nimport {\n BoundsLike,\n getCommonParent,\n getLocalBoundsInParent,\n getSelectionBounds,\n nudgeX,\n nudgeY,\n} from './Bounds';\n\n/**\n * Flow direction for layout.\n * - `row`: Horizontal layout (left to right)\n * - `column`: Vertical layout (top to bottom)\n */\nexport type FlowDirection = 'row' | 'column';\n\n/**\n * Wrapping behavior for flow layout.\n * - `none`: No wrapping, single line/column\n * - `bounds`: Wrap when reaching bounds width/height\n * - `count`: Wrap after specific number of items\n */\nexport type FlowWrap = 'none' | 'bounds' | 'count';\n\n/**\n * Cross-axis alignment (perpendicular to flow direction).\n * - `start`: Align to start of line/column\n * - `center`: Center within line/column\n * - `end`: Align to end of line/column\n */\nexport type FlowAlign = 'start' | 'center' | 'end';\n\n/**\n * Main-axis justification (along flow direction).\n * - `start`: Pack items to start\n * - `center`: Center items\n * - `end`: Pack items to end\n * - `space-between`: Equal space between items\n * - `space-around`: Equal space around items\n * - `space-evenly`: Equal space including edges\n */\nexport type FlowJustify =\n | 'start'\n | 'center'\n | 'end'\n | 'space-between'\n | 'space-around'\n | 'space-evenly';\n\n/**\n * Individual item margin configuration.\n * Supports shorthand notations:\n * - `x`: Sets both left and right\n * - `y`: Sets both top and bottom\n * - Specific values (top, right, bottom, left) override shorthands\n */\nexport interface FlowItemMargin {\n left?: number;\n right?: number;\n top?: number;\n bottom?: number;\n x?: number;\n y?: number;\n}\n\n/**\n * Margin value for a single item.\n * - `number`: All sides get the same margin\n * - `FlowItemMargin`: Detailed control with optional shorthands\n * - `undefined`: No margin (all sides = 0)\n */\nexport type FlowItemMarginValue = number | FlowItemMargin | undefined;\n\n/**\n * Configuration options for flow layout.\n *\n * @example\n * ```typescript\n * const options: FlowOptions = {\n * direction: 'row',\n * wrap: 'bounds',\n * gap: 10,\n * justify: 'space-between',\n * align: 'center',\n * padding: 20,\n * margins: [10, 0, { y: 15 }]\n * };\n * ```\n */\nexport interface FlowOptions {\n direction?: FlowDirection;\n wrap?: FlowWrap;\n gap?: number | { h: number; v: number };\n rowGap?: number;\n columnGap?: number;\n justify?: FlowJustify;\n align?: FlowAlign;\n padding?: number | { top?: number; right?: number; bottom?: number; left?: number };\n bounds?: Container | Rectangle;\n rowCount?: number;\n columnCount?: number;\n order?: (a: Container, b: Container) => number;\n margins?: FlowItemMarginValue[];\n}\n\ntype HV = { h: number; v: number };\n\nfunction normalizeGap(opts: FlowOptions): HV {\n if (typeof opts.gap === 'number') return { h: opts.gap, v: opts.gap };\n if (typeof opts.gap === 'object' && opts.gap) return { h: opts.gap.h ?? 0, v: opts.gap.v ?? 0 };\n const h = opts.columnGap ?? 0;\n const v = opts.rowGap ?? 0;\n return { h, v };\n}\n\nfunction normalizePadding(\n p?: number | { top?: number; right?: number; bottom?: number; left?: number },\n) {\n if (typeof p === 'number') return { top: p, right: p, bottom: p, left: p };\n return { top: p?.top ?? 0, right: p?.right ?? 0, bottom: p?.bottom ?? 0, left: p?.left ?? 0 };\n}\n\nfunction normalizeMargin(value: FlowItemMarginValue): {\n top: number;\n right: number;\n bottom: number;\n left: number;\n} {\n if (value === undefined) {\n return { top: 0, right: 0, bottom: 0, left: 0 };\n }\n\n if (typeof value === 'number') {\n return { top: value, right: value, bottom: value, left: value };\n }\n\n const top = value.top ?? value.y ?? 0;\n const bottom = value.bottom ?? value.y ?? 0;\n const left = value.left ?? value.x ?? 0;\n const right = value.right ?? value.x ?? 0;\n\n return { top, right, bottom, left };\n}\n\nfunction getFlowBounds(items: Container[], opts: FlowOptions, parent: Container): Rectangle {\n const pad = normalizePadding(opts.padding);\n if (opts.wrap === 'bounds' && opts.bounds) {\n let r: Rectangle;\n if (opts.bounds instanceof Rectangle) {\n r = opts.bounds;\n } else {\n const b = getLocalBoundsInParent(opts.bounds, parent);\n r = new Rectangle(b.left, b.top, b.width, b.height);\n }\n return new Rectangle(\n r.x + pad.left,\n r.y + pad.top,\n Math.max(0, r.width - pad.left - pad.right),\n Math.max(0, r.height - pad.top - pad.bottom),\n );\n }\n const sel = getSelectionBounds(items, parent);\n return new Rectangle(\n // TODO Not sure side effects check this out latter\n /*sel.left +*/ pad.left,\n /*sel.top + */ pad.top,\n Math.max(0, sel.width - pad.left - pad.right),\n Math.max(0, sel.height - pad.top - pad.bottom),\n );\n}\n\n/**\n * Flexbox-like layout utility for arranging PixiJS containers in rows or columns.\n *\n * Flow provides a powerful layout system similar to CSS Flexbox, allowing you to\n * arrange containers horizontally or vertically with automatic wrapping, spacing,\n * alignment, and justification.\n *\n * ## Features\n *\n * - **Flexible Direction**: Row (horizontal) or column (vertical) layouts\n * - **Smart Wrapping**: No wrap, wrap by bounds, or wrap by count\n * - **Spacing Control**: Gaps between items, padding around container\n * - **Alignment**: Start, center, end alignment on cross-axis\n * - **Justification**: Start, center, end, space-between, space-around, space-evenly\n * - **Custom Sorting**: Optional custom order function\n *\n * ## Layout Modes\n *\n * ### Row Layout (Horizontal)\n * Items flow left to right, wrapping creates new rows below.\n * - Main axis: Horizontal (justify controls)\n * - Cross axis: Vertical (align controls)\n *\n * ### Column Layout (Vertical)\n * Items flow top to bottom, wrapping creates new columns to the right.\n * - Main axis: Vertical (justify controls)\n * - Cross axis: Horizontal (align controls)\n *\n * ## Wrapping Modes\n *\n * - **none**: Single line/column, no wrapping\n * - **bounds**: Wrap when reaching container bounds\n * - **count**: Wrap after specific number of items (rowCount/columnCount)\n *\n * @example\n * ```typescript\n * import { Flow } from '@rb-games/core/layout';\n * import { Container, Sprite } from 'pixi.js';\n *\n * // Create inventory grid\n * const items = Array.from({ length: 20 }, () => new Sprite());\n * const container = new Container();\n * container.addChild(...items);\n *\n * // Grid layout: 5 columns, wrap by count\n * Flow.layout(items, {\n * direction: 'row',\n * wrap: 'count',\n * columnCount: 5,\n * gap: 10,\n * padding: 20\n * });\n * ```\n *\n * @example\n * ```typescript\n * // Responsive horizontal menu with wrapping\n * const menuItems = [item1, item2, item3, item4, item5];\n *\n * Flow.layout(menuItems, {\n * direction: 'row',\n * wrap: 'bounds',\n * bounds: new Rectangle(0, 0, 800, 600),\n * gap: 15,\n * justify: 'space-between',\n * align: 'center',\n * padding: { top: 10, right: 20, bottom: 10, left: 20 }\n * });\n * ```\n *\n * @example\n * ```typescript\n * // Vertical button list\n * const buttons = [btn1, btn2, btn3];\n *\n * Flow.layout(buttons, {\n * direction: 'column',\n * wrap: 'none',\n * gap: 10,\n * align: 'center',\n * justify: 'start'\n * });\n * ```\n *\n * @public\n */\nexport class Flow {\n /**\n * Arranges containers in a flexbox-like layout.\n *\n * This method modifies container positions in-place to create the desired layout.\n * Items are sorted (if order function provided) and then arranged according to\n * direction, wrapping, alignment, and justification settings.\n *\n * @param items - Array of containers to layout\n * @param options - Layout configuration options\n *\n * @example\n * ```typescript\n * // Simple horizontal row\n * Flow.layout(items, { direction: 'row', gap: 10 });\n *\n * // Grid with 4 columns\n * Flow.layout(items, {\n * direction: 'row',\n * wrap: 'count',\n * columnCount: 4,\n * gap: { h: 10, v: 15 }\n * });\n *\n * // Centered vertical list\n * Flow.layout(items, {\n * direction: 'column',\n * align: 'center',\n * gap: 20\n * });\n * ```\n */\n static layout(items: Container[], options?: FlowOptions) {\n if (!items || items.length === 0) return;\n const opts: FlowOptions = {\n direction: 'row',\n wrap: 'none',\n gap: 0,\n justify: 'start',\n align: 'start',\n ...options,\n };\n\n const parent = getCommonParent(items);\n const gap = normalizeGap(opts);\n const dir = opts.direction ?? 'row';\n const wrap = opts.wrap ?? 'none';\n const ordered = opts.order ? [...items].sort(opts.order) : [...items];\n const area = getFlowBounds(ordered, opts, parent);\n\n if (wrap === 'count') {\n if (dir === 'row') {\n const cols =\n opts.columnCount ??\n (opts.rowCount ? Math.ceil(ordered.length / opts.rowCount) : ordered.length);\n const lines: Container[][] = [];\n for (let i = 0; i < ordered.length; i += cols) lines.push(ordered.slice(i, i + cols));\n layoutLinesRow(lines, parent, area, gap, opts.justify!, opts.align!, opts.margins);\n } else {\n const rows =\n opts.rowCount ??\n (opts.columnCount ? Math.ceil(ordered.length / opts.columnCount) : ordered.length);\n const columns: Container[][] = [];\n for (let i = 0; i < ordered.length; i += rows) columns.push(ordered.slice(i, i + rows));\n layoutLinesColumn(columns, parent, area, gap, opts.justify!, opts.align!, opts.margins);\n }\n return;\n }\n\n if (wrap === 'bounds') {\n if (dir === 'row') {\n const lines: Container[][] = [];\n let line: Container[] = [];\n let lineW = 0;\n for (const it of ordered) {\n const b = getLocalBoundsInParent(it, parent);\n const needed = line.length === 0 ? b.width : gap.h + b.width;\n if (line.length > 0 && lineW + needed > area.width) {\n lines.push(line);\n line = [it];\n lineW = b.width;\n } else {\n line.push(it);\n lineW += needed;\n }\n }\n if (line.length) lines.push(line);\n layoutLinesRow(lines, parent, area, gap, opts.justify!, opts.align!, opts.margins);\n } else {\n const columns: Container[][] = [];\n let col: Container[] = [];\n let colH = 0;\n for (const it of ordered) {\n const b = getLocalBoundsInParent(it, parent);\n const needed = col.length === 0 ? b.height : gap.v + b.height;\n if (col.length > 0 && colH + needed > area.height) {\n columns.push(col);\n col = [it];\n colH = b.height;\n } else {\n col.push(it);\n colH += needed;\n }\n }\n if (col.length) columns.push(col);\n layoutLinesColumn(columns, parent, area, gap, opts.justify!, opts.align!, opts.margins);\n }\n return;\n }\n\n if (wrap === 'none') {\n if (dir === 'row') {\n const lines = [ordered];\n layoutLinesRow(lines, parent, area, gap, opts.justify!, opts.align!, opts.margins);\n } else {\n const columns = [ordered];\n layoutLinesColumn(columns, parent, area, gap, opts.justify!, opts.align!, opts.margins);\n }\n }\n }\n}\n\nfunction layoutLinesRow(\n lines: Container[][],\n parent: Container,\n area: Rectangle,\n gap: HV,\n justify: FlowJustify,\n align: FlowAlign,\n margins?: FlowItemMarginValue[],\n) {\n let y = area.y;\n for (const line of lines) {\n let contentW = 0;\n let lineH = 0;\n const sizes = line.map((it) => {\n const b = getLocalBoundsInParent(it, parent);\n lineH = Math.max(lineH, b.height);\n return b;\n });\n if (line.length > 0) contentW = sizes.reduce((s, b, i) => s + b.width + (i > 0 ? gap.h : 0), 0);\n let x = area.x;\n if (justify === 'center') {\n x += Math.max(0, (area.width - contentW) / 2);\n } else if (justify === 'end') {\n x += Math.max(0, area.width - contentW);\n } else if (justify === 'space-between' && line.length > 1) {\n const free = Math.max(0, area.width - sizes.reduce((s, b) => s + b.width, 0));\n const g = free / (line.length - 1);\n positionRow(line, sizes, parent, x, y, lineH, { h: g, v: gap.v }, align, margins);\n y += lineH + gap.v;\n continue;\n } else if (justify === 'space-around' && line.length > 0) {\n const free = Math.max(0, area.width - sizes.reduce((s, b) => s + b.width, 0));\n const g = free / line.length;\n x += g / 2;\n positionRow(line, sizes, parent, x, y, lineH, { h: g, v: gap.v }, align, margins);\n y += lineH + gap.v;\n continue;\n } else if (justify === 'space-evenly' && line.length > 0) {\n const free = Math.max(0, area.width - sizes.reduce((s, b) => s + b.width, 0));\n const g = free / (line.length + 1);\n x += g;\n positionRow(line, sizes, parent, x, y, lineH, { h: g, v: gap.v }, align, margins);\n y += lineH + gap.v;\n continue;\n }\n positionRow(line, sizes, parent, x, y, lineH, gap, align, margins);\n y += lineH + gap.v;\n }\n}\n\nfunction positionRow(\n line: Container[],\n sizes: BoundsLike[],\n parent: Container,\n x: number,\n y: number,\n lineH: number,\n gap: HV,\n align: FlowAlign,\n margins?: FlowItemMarginValue[],\n) {\n let cursor = x;\n for (let i = 0; i < line.length; i++) {\n const it = line[i];\n const b = sizes[i];\n const margin = normalizeMargin(margins?.[i]);\n\n const dx = cursor + margin.left - b.left;\n let dy = 0;\n if (align === 'start') dy = y + margin.top - b.top;\n else if (align === 'center') dy = y + margin.top + (lineH - b.height) / 2 - b.top;\n else dy = y + margin.top + (lineH - b.height) - b.top;\n nudgeX(it, dx);\n nudgeY(it, dy);\n cursor += margin.left + b.width + margin.right + gap.h;\n }\n}\n\nfunction layoutLinesColumn(\n columns: Container[][],\n parent: Container,\n area: Rectangle,\n gap: HV,\n justify: FlowJustify,\n align: FlowAlign,\n margins?: FlowItemMarginValue[],\n) {\n let x = area.x;\n for (const col of columns) {\n let contentH = 0;\n let colW = 0;\n const sizes = col.map((it) => {\n const b = getLocalBoundsInParent(it, parent);\n colW = Math.max(colW, b.width);\n return b;\n });\n if (col.length > 0) contentH = sizes.reduce((s, b, i) => s + b.height + (i > 0 ? gap.v : 0), 0);\n let y = area.y;\n if (justify === 'center') {\n y += Math.max(0, (area.height - contentH) / 2);\n } else if (justify === 'end') {\n y += Math.max(0, area.height - contentH);\n } else if (justify === 'space-between' && col.length > 1) {\n const free = Math.max(0, area.height - sizes.reduce((s, b) => s + b.height, 0));\n const g = free / (col.length - 1);\n positionColumn(col, sizes, parent, x, y, colW, { h: gap.h, v: g }, align, margins);\n x += colW + gap.h;\n continue;\n } else if (justify === 'space-around' && col.length > 0) {\n const free = Math.max(0, area.height - sizes.reduce((s, b) => s + b.height, 0));\n const g = free / col.length;\n y += g / 2;\n positionColumn(col, sizes, parent, x, y, colW, { h: gap.h, v: g }, align, margins);\n x += colW + gap.h;\n continue;\n } else if (justify === 'space-evenly' && col.length > 0) {\n const free = Math.max(0, area.height - sizes.reduce((s, b) => s + b.height, 0));\n const g = free / (col.length + 1);\n y += g;\n positionColumn(col, sizes, parent, x, y, colW, { h: gap.h, v: g }, align, margins);\n x += colW + gap.h;\n continue;\n }\n positionColumn(col, sizes, parent, x, y, colW, gap, align, margins);\n x += colW + gap.h;\n }\n}\n\nfunction positionColumn(\n col: Container[],\n sizes: BoundsLike[],\n parent: Container,\n x: number,\n y: number,\n colW: number,\n gap: HV,\n align: FlowAlign,\n margins?: FlowItemMarginValue[],\n) {\n let cursor = y;\n for (let i = 0; i < col.length; i++) {\n const it = col[i];\n const b = sizes[i];\n const margin = normalizeMargin(margins?.[i]);\n\n let dx = 0;\n if (align === 'start') dx = x + margin.left - b.left;\n else if (align === 'center') dx = x + margin.left + (colW - b.width) / 2 - b.left;\n else dx = x + margin.left + (colW - b.width) - b.left;\n const dy = cursor + margin.top - b.top;\n nudgeX(it, dx);\n nudgeY(it, dy);\n cursor += margin.top + b.height + margin.bottom + gap.v;\n }\n}\n","// Align.ts\nimport { Container } from 'pixi.js';\nimport { AlignOptions, getReferenceBounds, getLocalBoundsInParent, nudgeX, nudgeY } from './Bounds';\n\n/**\n * Alignment utility for positioning PixiJS containers, similar to Photoshop's align tools.\n *\n * Provides methods to align multiple containers relative to each other or to a reference point.\n * All alignment operations modify the position of containers in-place.\n *\n * ## Features\n *\n * - **Horizontal Alignment**: Left, center, right\n * - **Vertical Alignment**: Top, center, bottom\n * - **Flexible Reference**: Align to selection bounds, specific container, or custom rectangle\n * - **Parent-aware**: Handles coordinate transformations correctly\n *\n * ## Alignment Modes\n *\n * The alignment reference can be controlled via {@link AlignOptions}:\n * - `selection` (default): Align to the bounding box of all selected items\n * - `container`: Align to a specific container's bounds\n * - `key`: Align to a specific key object\n * - `rectangle`: Align to a custom rectangle\n *\n * @example\n * ```typescript\n * import { Align } from '@rb-games/core/layout';\n * import { Container, Sprite } from 'pixi.js';\n *\n * // Create some sprites\n * const sprite1 = new Sprite();\n * const sprite2 = new Sprite();\n * const sprite3 = new Sprite();\n *\n * const container = new Container();\n * container.addChild(sprite1, sprite2, sprite3);\n *\n * // Align all sprites to the left edge of their selection\n * Align.left([sprite1, sprite2, sprite3]);\n *\n * // Align horizontally centered\n * Align.hCenter([sprite1, sprite2, sprite3]);\n *\n * // Align to a specific container\n * const bounds = new Container();\n * Align.left([sprite1, sprite2, sprite3], { container: bounds });\n * ```\n *\n * @example\n * ```typescript\n * // Align UI elements to screen center\n * const title = new Text('Game Title');\n * const button = new Sprite();\n * const logo = new Sprite();\n *\n * // Center all elements horizontally to screen bounds\n * Align.hCenter([title, button, logo], {\n * rect: new Rectangle(0, 0, 1920, 1080)\n * });\n *\n * // Align to top\n * Align.top([title, button, logo]);\n * ```\n *\n * @category Layout\n * @public\n */\nexport class Align {\n /**\n * Aligns containers to the left edge of the reference bounds.\n *\n * @param items - Array of containers to align\n * @param options - Alignment options to control the reference point\n *\n * @example\n * ```typescript\n * // Align to selection bounds (default)\n * Align.left([sprite1, sprite2, sprite3]);\n *\n * // Align to container\n * Align.left([sprite1, sprite2], { container: bounds });\n * ```\n */\n static left(items: Container[], options?: AlignOptions) {\n const { ref, parent } = getReferenceBounds(items, options);\n for (const it of items) {\n const b = getLocalBoundsInParent(it, parent);\n nudgeX(it, ref.left - b.left);\n }\n }\n /**\n * Aligns containers to the horizontal center of the reference bounds.\n *\n * @param items - Array of containers to align\n * @param options - Alignment options to control the reference point\n *\n * @example\n * ```typescript\n * // Center horizontally within selection\n * Align.hCenter([sprite1, sprite2, sprite3]);\n * ```\n */\n static hCenter(items: Container[], options?: AlignOptions) {\n const { ref, parent } = getReferenceBounds(items, options);\n for (const it of items) {\n const b = getLocalBoundsInParent(it, parent);\n nudgeX(it, ref.centerX - b.centerX);\n }\n }\n /**\n * Aligns containers to the right edge of the reference bounds.\n *\n * @param items - Array of containers to align\n * @param options - Alignment options to control the reference point\n */\n static right(items: Container[], options?: AlignOptions) {\n const { ref, parent } = getReferenceBounds(items, options);\n for (const it of items) {\n const b = getLocalBoundsInParent(it, parent);\n nudgeX(it, ref.right - b.right);\n }\n }\n /**\n * Aligns containers to the top edge of the reference bounds.\n *\n * @param items - Array of containers to align\n * @param options - Alignment options to control the reference point\n */\n static top(items: Container[], options?: AlignOptions) {\n const { ref, parent } = getReferenceBounds(items, options);\n for (const it of items) {\n const b = getLocalBoundsInParent(it, parent);\n nudgeY(it, ref.top - b.top);\n }\n }\n /**\n * Aligns containers to the vertical center of the reference bounds.\n *\n * @param items - Array of containers to align\n * @param options - Alignment options to control the reference point\n */\n static vCenter(items: Container[], options?: AlignOptions) {\n const { ref, parent } = getReferenceBounds(items, options);\n for (const it of items) {\n const b = getLocalBoundsInParent(it, parent);\n nudgeY(it, ref.centerY - b.centerY);\n }\n }\n /**\n * Aligns containers to the bottom edge of the reference bounds.\n *\n * @param items - Array of containers to align\n * @param options - Alignment options to control the reference point\n */\n static bottom(items: Container[], options?: AlignOptions) {\n const { ref, parent } = getReferenceBounds(items, options);\n for (const it of items) {\n const b = getLocalBoundsInParent(it, parent);\n nudgeY(it, ref.bottom - b.bottom);\n }\n }\n}\n","import { Container, Graphics, Sprite, Texture, Text, TextStyleOptions } from 'pixi.js';\nimport { merge } from 'lodash';\nimport { DeepPartial, GraphicsConfig, SpriteConfig } from './Component.types';\nimport { Skinable } from './Skinable';\nimport { ButtonComp, ButtonCompSkinData } from './ButtonComp';\nimport { Flow, FlowOptions } from '../../layout/Flow';\nimport { Align } from '../../layout';\n\nexport interface StepperCompStateData {\n base?: string;\n display?: GraphicsConfig | SpriteConfig;\n textStyle?: TextStyleOptions;\n minusButton?: ButtonCompSkinData;\n plusButton?: ButtonCompSkinData;\n flowOptions?: FlowOptions;\n holdEnabled?: boolean;\n holdDelay?: number;\n holdInterval?: number;\n}\n\nexport interface StepperCompSkinData {\n up: StepperCompStateData;\n over?: DeepPartial<StepperCompStateData>;\n disabled?: DeepPartial<StepperCompStateData>;\n}\n\nexport interface StepperCompOptions {\n value?: number;\n min?: number;\n max?: number;\n step?: number;\n formatFunction?: (value: number) => string;\n skinData?: StepperCompSkinData;\n enabled?: boolean;\n holdEnabled?: boolean;\n holdDelay?: number;\n holdInterval?: number;\n}\n\nexport class StepperComp extends Skinable<StepperCompSkinData, typeof Container>(Container) {\n private _minusButton: ButtonComp;\n private _plusButton: ButtonComp;\n private _displayContainer: Container;\n private _displayBackground: Graphics | Sprite;\n private _displayText: Text;\n\n private _value: number = 0;\n private _min: number = 0;\n private _max: number = 100;\n private _step: number = 1;\n private _formatFunction: (value: number) => string = (val) => val.toString();\n private _enabled: boolean = true;\n private _currentState: keyof StepperCompSkinData = 'up';\n private _holdEnabled: boolean = true;\n private _holdDelay: number = 500;\n private _holdInterval: number = 100;\n\n constructor(options: StepperCompOptions = {}) {\n super();\n this.layout = true;\n this.eventMode = 'passive';\n\n // Initialize values\n this._min = options.min ?? 0;\n this._max = options.max ?? 100;\n this._step = options.step ?? 1;\n this._value = options.value ?? this._min;\n if (options.formatFunction) {\n this._formatFunction = options.formatFunction;\n }\n this._holdEnabled = options.holdEnabled ?? true;\n this._holdDelay = options.holdDelay ?? 500;\n this._holdInterval = options.holdInterval ?? 100;\n\n // Create minus button\n this._minusButton = new ButtonComp();\n this._minusButton.eventMode = 'static';\n this._minusButton.behavior.holdDelay = this._holdDelay;\n this._minusButton.behavior.holdInterval = this._holdInterval;\n this.addChild(this._minusButton);\n\n // Create display container\n this._displayContainer = new Container();\n this._displayContainer.eventMode = 'passive';\n this._displayBackground = new Graphics();\n this._displayText = new Text({\n text: this._formatFunction(this._value),\n style: { fontSize: 24, fill: 0xffffff },\n });\n this._displayContainer.addChild(this._displayBackground);\n this._displayContainer.addChild(this._displayText);\n this.addChild(this._displayContainer);\n\n // Create plus button\n this._plusButton = new ButtonComp();\n this._plusButton.eventMode = 'static';\n this._plusButton.behavior.holdDelay = this._holdDelay;\n this._plusButton.behavior.holdInterval = this._holdInterval;\n this.addChild(this._plusButton);\n\n // Setup event listeners\n this.setupEventListeners();\n\n // Set initial enabled state\n this.enabled = options.enabled !== false;\n\n // Initialize skin data\n this.setSkinData(options.skinData || null, { mergeWithExisting: false });\n\n // Update button states based on initial value\n this.updateButtonStates();\n }\n\n private setupEventListeners(): void {\n // Click events\n this._minusButton.behavior.on('click', () => this.decrementValue());\n this._plusButton.behavior.on('click', () => this.incrementValue());\n\n // Hold events - set to min/max on hold\n this._minusButton.behavior.on('holdStart', () => {\n if (this._holdEnabled) {\n this.value = this._min;\n }\n });\n this._plusButton.behavior.on('holdStart', () => {\n if (this._holdEnabled) {\n this.value = this._max;\n }\n });\n\n // State changes for visual feedback\n this._minusButton.behavior.on('stateChanged', () => this.updateParentState());\n this._plusButton.behavior.on('stateChanged', () => this.updateParentState());\n }\n\n private updateParentState(): void {\n if (!this._enabled) {\n this.setState('disabled');\n return;\n }\n\n const minusState = this._minusButton.currentState;\n const plusState = this._plusButton.currentState;\n\n if (minusState === 'over' || plusState === 'over') {\n this.setState('over');\n } else {\n this.setState('up');\n }\n }\n\n private setState(state: keyof StepperCompSkinData): void {\n this._currentState = state;\n this.updateVisualState();\n }\n\n private decrementValue(): void {\n if (!this._enabled) return;\n\n const newValue = this._value - this._step;\n if (newValue >= this._min) {\n this.value = newValue;\n }\n }\n\n private incrementValue(): void {\n if (!this._enabled) return;\n\n const newValue = this._value + this._step;\n if (newValue <= this._max) {\n this.value = newValue;\n }\n }\n\n private updateButtonStates(): void {\n const atMin = this._value <= this._min;\n const atMax = this._value >= this._max;\n\n this._minusButton.enabled = this._enabled && !atMin;\n this._plusButton.enabled = this._enabled && !atMax;\n }\n\n private updateVisualState(): void {\n const currentStateData = this.getCurrentStateData();\n if (!currentStateData) return;\n\n this.updateDisplay(currentStateData);\n this.updateButtonSkins(currentStateData);\n this.updateHoldSettings(currentStateData);\n this.updateLayout(currentStateData);\n }\n\n protected skinApply(_: StepperCompSkinData | null): void {\n this.updateVisualState();\n }\n\n private getCurrentStateData(): StepperCompStateData | null {\n const skin = this.getSkinData();\n if (!skin) return null;\n\n const baseData = skin.up;\n const stateData = (skin as any)[this._currentState] || {};\n\n return merge({}, baseData, stateData);\n }\n\n private updateDisplay(stateData: StepperCompStateData): void {\n const displayConfig = stateData.display;\n if (!displayConfig) return;\n\n if ('texture' in displayConfig) {\n if (!(this._displayBackground instanceof Sprite)) {\n this._displayContainer.removeChild(this._displayBackground);\n this._displayBackground.destroy();\n this._displayBackground = new Sprite();\n this._displayContainer.addChildAt(this._displayBackground, 0);\n }\n\n const sprite = this._displayBackground as Sprite;\n const base = stateData.base ?? '';\n const texturePath = base ? `${base}/${displayConfig.texture}` : displayConfig.texture;\n sprite.texture = Texture.from(texturePath);\n sprite.alpha = displayConfig.alpha ?? 1;\n sprite.tint = displayConfig.tint ?? 0xffffff;\n\n if (displayConfig.anchor) {\n sprite.anchor.set(displayConfig.anchor.x, displayConfig.anchor.y);\n }\n } else {\n if (!(this._displayBackground instanceof Graphics)) {\n this._displayContainer.removeChild(this._displayBackground);\n this._displayBackground.destroy();\n this._displayBackground = new Graphics();\n this._displayContainer.addChildAt(this._displayBackground, 0);\n }\n\n const graphics = this._displayBackground as Graphics;\n graphics.clear();\n\n // Draw shape based on config type\n if ('circle' in displayConfig) {\n graphics.circle(0, 0, displayConfig.circle.radius);\n } else if ('rect' in displayConfig) {\n graphics.rect(0, 0, displayConfig.rect.width, displayConfig.rect.height);\n } else if ('roundRect' in displayConfig) {\n graphics.roundRect(\n 0,\n 0,\n displayConfig.roundRect.width,\n displayConfig.roundRect.height,\n displayConfig.roundRect.radius,\n );\n }\n\n // Apply fill if specified\n if (displayConfig.fill) {\n graphics.fill(displayConfig.fill);\n }\n\n // Apply stroke if specified\n if (displayConfig.stroke) {\n graphics.stroke(displayConfig.stroke);\n }\n }\n\n if (stateData.textStyle) {\n this._displayText.style = stateData.textStyle;\n }\n\n this._displayText.text = this._formatFunction(this._value);\n\n Align.hCenter([this._displayText], { container: this._displayContainer });\n Align.vCenter([this._displayText], { container: this._displayContainer });\n }\n\n private updateButtonSkins(stateData: StepperCompStateData): void {\n if (stateData.minusButton) {\n this._minusButton.setSkinData(stateData.minusButton, { mergeWithExisting: false });\n }\n\n if (stateData.plusButton) {\n this._plusButton.setSkinData(stateData.plusButton, { mergeWithExisting: false });\n }\n }\n\n private updateHoldSettings(stateData: StepperCompStateData): void {\n if (stateData.holdEnabled !== undefined) {\n this._holdEnabled = stateData.holdEnabled;\n }\n\n if (stateData.holdDelay !== undefined) {\n this._holdDelay = stateData.holdDelay;\n this._minusButton.behavior.holdDelay = this._holdDelay;\n this._plusButton.behavior.holdDelay = this._holdDelay;\n }\n\n if (stateData.holdInterval !== undefined) {\n this._holdInterval = stateData.holdInterval;\n this._minusButton.behavior.holdInterval = this._holdInterval;\n this._plusButton.behavior.holdInterval = this._holdInterval;\n }\n }\n\n private updateLayout(stateData: StepperCompStateData): void {\n const flowOptions: FlowOptions = stateData.flowOptions || {\n direction: 'row',\n wrap: 'none',\n gap: 10,\n align: 'center',\n };\n\n Flow.layout([this._minusButton, this._displayContainer, this._plusButton], flowOptions);\n }\n\n public get value(): number {\n return this._value;\n }\n\n public set value(val: number) {\n const clampedValue = Math.max(this._min, Math.min(this._max, val));\n if (this._value !== clampedValue) {\n this._value = clampedValue;\n this.updateButtonStates();\n this.updateDisplayText();\n this.emit('valueChanged', this._value);\n }\n }\n\n private updateDisplayText(): void {\n this._displayText.text = this._formatFunction(this._value);\n }\n\n public get min(): number {\n return this._min;\n }\n\n public set min(val: number) {\n this._min = val;\n if (this._value < this._min) {\n this.value = this._min;\n }\n this.updateButtonStates();\n }\n\n public get max(): number {\n return this._max;\n }\n\n public set max(val: number) {\n this._max = val;\n if (this._value > this._max) {\n this.value = this._max;\n }\n this.updateButtonStates();\n }\n\n public get step(): number {\n return this._step;\n }\n\n public set step(val: number) {\n this._step = val;\n }\n\n public get enabled(): boolean {\n return this._enabled;\n }\n\n public set enabled(val: boolean) {\n this._enabled = val;\n this.updateButtonStates();\n\n if (!val) {\n this.setState('disabled');\n } else {\n this.setState('up');\n }\n }\n\n public get formatFunction(): (value: number) => string {\n return this._formatFunction;\n }\n\n public set formatFunction(fn: (value: number) => string) {\n this._formatFunction = fn;\n this.updateDisplayText();\n }\n\n public get minusButton(): ButtonComp {\n return this._minusButton;\n }\n\n public get plusButton(): ButtonComp {\n return this._plusButton;\n }\n\n public get displayText(): Text {\n return this._displayText;\n }\n\n public get displayBackground(): Graphics | Sprite {\n return this._displayBackground;\n }\n\n public destroy(): void {\n this._minusButton.destroy();\n this._plusButton.destroy();\n super.destroy();\n }\n}\n","import { Container, Graphics, Text, TextStyleOptions } from 'pixi.js';\nimport { merge } from 'lodash';\nimport type { DeepPartial, GraphicsConfig } from './Component.types';\nimport { Skinable } from './Skinable';\nimport type { LayoutStyles } from '@pixi/layout';\n\nexport type LabelBoxState = 'default' | 'enabled' | 'disabled' | 'required' | 'success' | 'fail';\n\nexport interface LabelBoxStateData {\n background?: GraphicsConfig;\n textStyle?: TextStyleOptions;\n textLayout?: boolean | LayoutStyles | null;\n layout?: boolean | LayoutStyles | null;\n}\n\nexport interface LabelBoxSkinData {\n default: LabelBoxStateData;\n enabled?: DeepPartial<LabelBoxStateData>;\n disabled?: DeepPartial<LabelBoxStateData>;\n required?: DeepPartial<LabelBoxStateData>;\n success?: DeepPartial<LabelBoxStateData>;\n fail?: DeepPartial<LabelBoxStateData>;\n}\n\nexport interface LabelBoxOptions {\n text?: string;\n label?: string;\n state?: LabelBoxState;\n skinData?: LabelBoxSkinData;\n}\n\nexport class LabelBox extends Skinable<LabelBoxSkinData, typeof Container>(Container) {\n private _background: Graphics;\n private _text: Text;\n private _currentState: LabelBoxState = 'default';\n private _stateDataCache: Map<LabelBoxState, LabelBoxStateData> = new Map();\n\n constructor(options: LabelBoxOptions = {}) {\n super({ label: options.label });\n\n this.eventMode = 'passive';\n\n this._background = new Graphics();\n this._text = new Text({\n text: options.text ?? '',\n style: { fontSize: 24, fill: 0xffffff },\n });\n\n this.addChild(this._background);\n this.addChild(this._text);\n\n if (options.state) {\n this._currentState = options.state;\n }\n\n this.setSkinData(options.skinData || null, { mergeWithExisting: false });\n }\n\n public get text(): string {\n return this._text.text as string;\n }\n\n public set text(value: string) {\n this._text.text = value;\n }\n\n public get background(): Graphics {\n return this._background;\n }\n\n public get state(): LabelBoxState {\n return this._currentState;\n }\n\n public set state(value: LabelBoxState) {\n if (this._currentState === value) return;\n this._currentState = value;\n this.applyCurrentState();\n }\n\n private getStateData(state: LabelBoxState): LabelBoxStateData {\n const cached = this._stateDataCache.get(state);\n if (cached) return cached;\n\n const skin = this.getSkinData();\n if (!skin) return {};\n\n const baseState = skin.default;\n const stateOverride = skin[state];\n\n const merged = stateOverride ? merge({}, baseState, stateOverride) : baseState;\n this._stateDataCache.set(state, merged);\n return merged;\n }\n\n private applyCurrentState(): void {\n const stateData = this.getStateData(this._currentState);\n this.applyStateData(stateData);\n }\n\n private applyStateData(stateData: LabelBoxStateData): void {\n if (stateData.background) {\n this._background.clear();\n this.drawGraphics(stateData.background);\n }\n\n if (stateData.textStyle) {\n this._text.style = stateData.textStyle;\n }\n\n if (stateData.textLayout !== undefined) {\n this._text.layout = stateData.textLayout;\n }\n\n if (stateData.layout !== undefined) {\n this.layout = stateData.layout;\n }\n }\n\n private drawGraphics(config: GraphicsConfig): void {\n if ('circle' in config) {\n this._background.circle(config.circle.radius, config.circle.radius, config.circle.radius);\n } else if ('rect' in config) {\n this._background.rect(0, 0, config.rect.width, config.rect.height);\n } else if ('roundRect' in config) {\n this._background.roundRect(\n 0,\n 0,\n config.roundRect.width,\n config.roundRect.height,\n config.roundRect.radius,\n );\n }\n\n if (config.fill) {\n this._background.fill(config.fill);\n }\n\n if (config.stroke) {\n this._background.stroke(config.stroke);\n }\n\n if (config.layout !== undefined) {\n this._background.layout = config.layout;\n }\n }\n\n protected skinApply(skin: LabelBoxSkinData | null): void {\n this._stateDataCache.clear();\n\n if (!skin) {\n this._background.clear();\n return;\n }\n\n this.applyCurrentState();\n }\n}\n","import { Container, Graphics, Text, TextStyleOptions, FederatedWheelEvent, Rectangle } from 'pixi.js';\nimport { Skinable } from './Skinable';\nimport { GraphicsConfig } from './Component.types';\nimport { SliderComp, type SliderCompSkinData } from './SliderComp';\nimport { Flow, Align } from '../../layout';\n\nexport type CellRenderer<TData = Record<string, any>> = (data: TData, index: number, column: ListTableColumn) => Container;\n\nexport interface ListTableColumn<K extends string = string> {\n key: K;\n label: string;\n width: number;\n renderer?: CellRenderer;\n}\n\nexport interface ListTableSeparatorConfig {\n color?: number;\n alpha?: number;\n thickness?: number;\n}\n\nexport interface ListTableRowSkinData {\n textStyle?: TextStyleOptions;\n background?: GraphicsConfig;\n oddBackground?: GraphicsConfig;\n evenBackground?: GraphicsConfig;\n hoverBackground?: GraphicsConfig;\n}\n\nexport interface ListTableCompSkinData {\n header?: {\n textStyle?: TextStyleOptions;\n background?: GraphicsConfig;\n };\n row?: ListTableRowSkinData;\n cellStyles?: Record<string, {\n textStyle?: TextStyleOptions;\n }>;\n separator?: ListTableSeparatorConfig;\n scrollbar?: SliderCompSkinData;\n}\n\nexport interface ListTableOptions<TData extends Record<string, any> = Record<string, any>> {\n columns: ListTableColumn<keyof TData & string>[];\n tableWidth: number;\n tableHeight: number;\n rowHeight: number;\n headerHeight?: number;\n rowGap?: number;\n cellGap?: number;\n showHeader?: boolean;\n showScrollbar?: boolean;\n skinData?: ListTableCompSkinData;\n}\n\ninterface RowView {\n container: Container;\n background: Graphics;\n cells: Container[];\n}\n\nexport interface ListTableEvents {\n rowClick: [data: Record<string, any>, index: number];\n rowHover: [data: Record<string, any>, index: number];\n rowOut: [data: Record<string, any>, index: number];\n scroll: [value: number];\n}\n\nexport class ListTableComp<TData extends Record<string, any> = Record<string, any>> extends Skinable<ListTableCompSkinData, typeof Container>(Container) {\n private _columns: ListTableColumn<keyof TData & string>[];\n private _tableWidth: number;\n private _tableHeight: number;\n private _rowHeight: number;\n private _headerHeight: number;\n private _rowGap: number;\n private _cellGap: number;\n private _showHeader: boolean;\n private _showScrollbar: boolean;\n\n private _headerContainer: Container;\n private _headerCells: Container[] = [];\n private _listContainer: Container;\n private _listContent: Container;\n private _listMask: Graphics;\n private _scrollbar: SliderComp;\n\n private _data: TData[] = [];\n private _rowViews: RowView[] = [];\n private _hoveredRowIndex: number = -1;\n private _scrollValue: number = 0;\n\n constructor(options: ListTableOptions<TData>) {\n super();\n this.eventMode = 'static';\n\n this._columns = options.columns;\n this._tableWidth = options.tableWidth;\n this._tableHeight = options.tableHeight;\n this._rowHeight = options.rowHeight;\n this._headerHeight = options.headerHeight ?? 0; // 0 means auto-calculate\n this._rowGap = options.rowGap ?? 0;\n this._cellGap = options.cellGap ?? 0;\n this._showHeader = options.showHeader ?? true;\n this._showScrollbar = options.showScrollbar ?? true;\n\n // Create header container\n this._headerContainer = new Container({ label: 'header' });\n this._headerContainer.visible = this._showHeader;\n this.addChild(this._headerContainer);\n\n // Create list container (masked area)\n this._listContainer = new Container({ label: 'listContainer' });\n this._listContainer.eventMode = 'static';\n this.addChild(this._listContainer);\n\n // Create scrollable content\n this._listContent = new Container({ label: 'listContent' });\n this._listContainer.addChild(this._listContent);\n\n // Create mask\n this._listMask = new Graphics();\n this._listContainer.addChild(this._listMask);\n this._listContent.mask = this._listMask;\n\n // Create scrollbar\n this._scrollbar = new SliderComp({\n orientation: 'vertical',\n min: 0,\n max: 0,\n value: 0,\n });\n this._scrollbar.label = 'scrollbar';\n this._scrollbar.visible = this._showScrollbar;\n this.addChild(this._scrollbar);\n\n // Wire up scrollbar\n this._scrollbar.behavior.on('scroll', (value: number) => {\n this._scrollValue = value;\n this._listContent.y = -value;\n this.emit('scroll', value);\n });\n\n // Wire up wheel events\n this._listContainer.on('wheel', this.onWheel.bind(this));\n\n // Build header\n this.buildHeader();\n\n // Position elements\n this.updateLayout();\n\n // Apply initial skin\n if (options.skinData) {\n this.setSkinData(options.skinData, { mergeWithExisting: false });\n }\n }\n\n private buildHeader(): void {\n this._headerContainer.removeChildren();\n this._headerCells = [];\n\n for (const column of this._columns) {\n const headerCell = new Container({ label: `header_${column.key}` });\n // Set boundsArea for fixed width\n headerCell.boundsArea = new Rectangle(0, 0, column.width, this._rowHeight);\n const headerText = new Text({ text: column.label });\n headerCell.addChild(headerText);\n // Center content within cell bounds\n Align.hCenter([headerText], { container: headerCell.boundsArea });\n Align.vCenter([headerText], { container: headerCell.boundsArea });\n this._headerContainer.addChild(headerCell);\n this._headerCells.push(headerCell);\n }\n\n // Position header cells using Flow\n Flow.layout(this._headerCells, {\n direction: 'row',\n gap: this._cellGap,\n });\n\n // Calculate header height if not provided\n if (this._headerHeight === 0) {\n this._headerHeight = this._headerContainer.height;\n }\n }\n\n private updateLayout(): void {\n // Position list container below header\n const listY = this._showHeader ? this._headerHeight : 0;\n this._listContainer.y = listY;\n\n // Update mask\n this._listMask.clear();\n this._listMask.rect(0, 0, this._tableWidth, this._tableHeight);\n this._listMask.fill({ color: 0xffffff });\n\n // Position scrollbar\n this._scrollbar.x = this._tableWidth + 10;\n this._scrollbar.y = listY;\n }\n\n private updateScrollRange(): void {\n const contentHeight = this._rowViews.length * (this._rowHeight + this._rowGap);\n const maxScroll = Math.max(0, contentHeight - this._tableHeight);\n this._scrollbar.behavior.max = maxScroll;\n\n // Show/hide scrollbar based on content\n this._scrollbar.visible = this._showScrollbar && maxScroll > 0;\n }\n\n private onWheel(event: FederatedWheelEvent): void {\n const delta = event.deltaY;\n const newValue = Math.max(0, Math.min(this._scrollbar.behavior.max, this._scrollValue + delta));\n this._scrollbar.behavior.value = newValue;\n }\n\n public drawList(data: TData[]): void {\n this.clearList();\n this._data = data;\n\n const skin = this.getSkinData();\n\n for (let i = 0; i < data.length; i++) {\n this.createRow(i, data[i], skin);\n }\n\n // Position rows using Flow\n const rowContainers = this._rowViews.map(v => v.container);\n Flow.layout(rowContainers, {\n direction: 'column',\n gap: this._rowGap,\n });\n\n this.updateScrollRange();\n }\n\n private createRow(index: number, item: TData, skin: ListTableCompSkinData | null): void {\n const rowSkin = skin?.row;\n\n const container = new Container({ label: `row_${index}` });\n container.eventMode = 'static';\n container.cursor = 'pointer';\n\n // Create background\n const background = new Graphics();\n container.addChild(background);\n this.drawRowBackground(background, index, false, skin);\n\n // Create cells\n const cells: Container[] = [];\n for (const column of this._columns) {\n const cell = new Container({ label: column.key });\n // Set boundsArea for fixed width\n cell.boundsArea = new Rectangle(0, 0, column.width, this._rowHeight);\n\n // Use custom renderer if provided, otherwise create text\n if (column.renderer) {\n const customContent = column.renderer(item, index, column);\n cell.addChild(customContent);\n // Center custom content within cell bounds\n Align.hCenter([customContent], { container: cell.boundsArea });\n Align.vCenter([customContent], { container: cell.boundsArea });\n } else {\n const value = item[column.key];\n const text = new Text({ text: String(value ?? '') });\n\n // Apply text style\n const cellStyle = skin?.cellStyles?.[column.key];\n if (cellStyle?.textStyle) {\n text.style = cellStyle.textStyle;\n } else if (rowSkin?.textStyle) {\n text.style = rowSkin.textStyle;\n }\n\n cell.addChild(text);\n // Center text within cell bounds\n Align.hCenter([text], { container: cell.boundsArea });\n Align.vCenter([text], { container: cell.boundsArea });\n }\n\n container.addChild(cell);\n cells.push(cell);\n }\n\n // Position cells using Flow\n Flow.layout(cells, {\n direction: 'row',\n gap: this._cellGap,\n });\n\n // Row events\n container.on('pointerover', () => {\n this._hoveredRowIndex = index;\n this.drawRowBackground(background, index, true, skin);\n this.emit('rowHover', item, index);\n });\n\n container.on('pointerout', () => {\n this._hoveredRowIndex = -1;\n this.drawRowBackground(background, index, false, skin);\n this.emit('rowOut', item, index);\n });\n\n container.on('pointertap', () => {\n this.emit('rowClick', item, index);\n });\n\n this._listContent.addChild(container);\n this._rowViews.push({ container, background, cells });\n }\n\n private drawRowBackground(graphics: Graphics, index: number, isHovered: boolean, skin: ListTableCompSkinData | null): void {\n graphics.clear();\n\n const rowSkin = skin?.row;\n let bgConfig: GraphicsConfig | undefined;\n\n if (isHovered && rowSkin?.hoverBackground) {\n bgConfig = rowSkin.hoverBackground;\n } else if (index % 2 === 0 && rowSkin?.evenBackground) {\n bgConfig = rowSkin.evenBackground;\n } else if (index % 2 === 1 && rowSkin?.oddBackground) {\n bgConfig = rowSkin.oddBackground;\n } else if (rowSkin?.background) {\n bgConfig = rowSkin.background;\n }\n\n if (!bgConfig) {\n // Default background based on row dimensions\n graphics.rect(0, 0, this._tableWidth, this._rowHeight);\n graphics.fill({ color: index % 2 === 0 ? 0x1a1f3d : 0x0f1329, alpha: 0.5 });\n return;\n }\n\n if ('rect' in bgConfig) {\n graphics.rect(0, 0, bgConfig.rect.width, bgConfig.rect.height);\n } else if ('roundRect' in bgConfig) {\n graphics.roundRect(0, 0, bgConfig.roundRect.width, bgConfig.roundRect.height, bgConfig.roundRect.radius);\n } else if ('circle' in bgConfig) {\n graphics.circle(0, 0, bgConfig.circle.radius);\n }\n\n if (bgConfig.fill) {\n graphics.fill(bgConfig.fill);\n }\n if (bgConfig.stroke) {\n graphics.stroke(bgConfig.stroke);\n }\n }\n\n public clearList(): void {\n this._listContent.removeChildren();\n this._rowViews = [];\n this._data = [];\n this._hoveredRowIndex = -1;\n this._scrollValue = 0;\n this._listContent.y = 0;\n }\n\n public getRowAt(index: number): Container | null {\n return this._rowViews[index]?.container ?? null;\n }\n\n public scrollTo(index: number): void {\n const targetY = index * (this._rowHeight + this._rowGap);\n this._scrollbar.behavior.value = Math.min(targetY, this._scrollbar.behavior.max);\n }\n\n public get data(): TData[] {\n return this._data;\n }\n\n public get columns(): ListTableColumn<keyof TData & string>[] {\n return this._columns;\n }\n\n public get showHeader(): boolean {\n return this._showHeader;\n }\n\n public set showHeader(value: boolean) {\n this._showHeader = value;\n this._headerContainer.visible = value;\n this.updateLayout();\n }\n\n public get showScrollbar(): boolean {\n return this._showScrollbar;\n }\n\n public set showScrollbar(value: boolean) {\n this._showScrollbar = value;\n this.updateScrollRange();\n }\n\n public get scrollbar(): SliderComp {\n return this._scrollbar;\n }\n\n public get headerContainer(): Container {\n return this._headerContainer;\n }\n\n public get listContainer(): Container {\n return this._listContainer;\n }\n\n public get listContent(): Container {\n return this._listContent;\n }\n\n protected skinApply(skin: ListTableCompSkinData | null): void {\n if (!skin) return;\n\n // Apply header skin\n this.applyHeaderSkin(skin);\n\n // Apply scrollbar skin\n if (skin.scrollbar) {\n this._scrollbar.setSkinData(skin.scrollbar, { mergeWithExisting: false });\n }\n\n // Re-apply row skins if data exists\n if (this._data.length > 0) {\n this.applyRowSkins(skin);\n }\n }\n\n private applyHeaderSkin(skin: ListTableCompSkinData): void {\n const headerSkin = skin.header;\n if (!headerSkin) return;\n\n // Apply text styles to header cells\n for (let i = 0; i < this._headerCells.length; i++) {\n const cell = this._headerCells[i];\n const text = cell.children[0] as Text;\n if (text && headerSkin.textStyle) {\n text.style = headerSkin.textStyle;\n }\n }\n\n // Re-layout header after style changes\n Flow.layout(this._headerCells, {\n direction: 'row',\n gap: this._cellGap,\n });\n }\n\n private applyRowSkins(skin: ListTableCompSkinData): void {\n const rowSkin = skin.row;\n\n for (let i = 0; i < this._rowViews.length; i++) {\n const view = this._rowViews[i];\n\n // Redraw background\n const isHovered = this._hoveredRowIndex === i;\n this.drawRowBackground(view.background, i, isHovered, skin);\n\n // Apply cell text styles\n for (let j = 0; j < view.cells.length; j++) {\n const cell = view.cells[j];\n const column = this._columns[j];\n const cellStyle = skin.cellStyles?.[column.key];\n\n const text = cell.children[0] as Text;\n if (text && !(text instanceof Graphics)) {\n if (cellStyle?.textStyle) {\n text.style = cellStyle.textStyle;\n } else if (rowSkin?.textStyle) {\n text.style = rowSkin.textStyle;\n }\n }\n }\n\n // Re-layout cells\n Flow.layout(view.cells, {\n direction: 'row',\n gap: this._cellGap,\n });\n }\n\n // Re-layout rows\n const rowContainers = this._rowViews.map(v => v.container);\n Flow.layout(rowContainers, {\n direction: 'column',\n gap: this._rowGap,\n });\n }\n\n public destroy(): void {\n this._scrollbar.destroy();\n super.destroy();\n }\n}\n"]}
|