@nice2dev/ui-graphics 1.0.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.
Files changed (511) hide show
  1. package/CHANGELOG.md +84 -0
  2. package/LICENSE +21 -0
  3. package/README.md +339 -0
  4. package/dist/cjs/animation/AnimatedPerson.js +153 -0
  5. package/dist/cjs/animation/AnimatedPerson.js.map +1 -0
  6. package/dist/cjs/animation/AnimationEditor.js +106 -0
  7. package/dist/cjs/animation/AnimationEditor.js.map +1 -0
  8. package/dist/cjs/animation/Audience.js +59 -0
  9. package/dist/cjs/animation/Audience.js.map +1 -0
  10. package/dist/cjs/animation/BodyRenderer.js +33 -0
  11. package/dist/cjs/animation/BodyRenderer.js.map +1 -0
  12. package/dist/cjs/animation/animationHelper.js +272 -0
  13. package/dist/cjs/animation/animationHelper.js.map +1 -0
  14. package/dist/cjs/animation/characterTypes.js +75 -0
  15. package/dist/cjs/animation/characterTypes.js.map +1 -0
  16. package/dist/cjs/animation/choreoDSL.js +190 -0
  17. package/dist/cjs/animation/choreoDSL.js.map +1 -0
  18. package/dist/cjs/animation/choreography.js +41 -0
  19. package/dist/cjs/animation/choreography.js.map +1 -0
  20. package/dist/cjs/animation/karaokeIntegration.js +98 -0
  21. package/dist/cjs/animation/karaokeIntegration.js.map +1 -0
  22. package/dist/cjs/animation/lottieExport.js +128 -0
  23. package/dist/cjs/animation/lottieExport.js.map +1 -0
  24. package/dist/cjs/animation/motionPath.js +196 -0
  25. package/dist/cjs/animation/motionPath.js.map +1 -0
  26. package/dist/cjs/animation/physics.js +201 -0
  27. package/dist/cjs/animation/physics.js.map +1 -0
  28. package/dist/cjs/animation/rig/RigPlayer.js +63 -0
  29. package/dist/cjs/animation/rig/RigPlayer.js.map +1 -0
  30. package/dist/cjs/animation/rig/RiggedBody.js +30 -0
  31. package/dist/cjs/animation/rig/RiggedBody.js.map +1 -0
  32. package/dist/cjs/animation/rig/choreoRigBridge.js +63 -0
  33. package/dist/cjs/animation/rig/choreoRigBridge.js.map +1 -0
  34. package/dist/cjs/animation/rig/ik.js +22 -0
  35. package/dist/cjs/animation/rig/ik.js.map +1 -0
  36. package/dist/cjs/animation/rig/poseOps.js +49 -0
  37. package/dist/cjs/animation/rig/poseOps.js.map +1 -0
  38. package/dist/cjs/animation/rig/presets.js +60 -0
  39. package/dist/cjs/animation/rig/presets.js.map +1 -0
  40. package/dist/cjs/animation/rig/rigMath.js +41 -0
  41. package/dist/cjs/animation/rig/rigMath.js.map +1 -0
  42. package/dist/cjs/animation/rig/rigTypes.js +44 -0
  43. package/dist/cjs/animation/rig/rigTypes.js.map +1 -0
  44. package/dist/cjs/animation/shapes/arms.js +15 -0
  45. package/dist/cjs/animation/shapes/arms.js.map +1 -0
  46. package/dist/cjs/animation/shapes/eyes.js +52 -0
  47. package/dist/cjs/animation/shapes/eyes.js.map +1 -0
  48. package/dist/cjs/animation/shapes/hair.js +55 -0
  49. package/dist/cjs/animation/shapes/hair.js.map +1 -0
  50. package/dist/cjs/animation/shapes/heads.js +62 -0
  51. package/dist/cjs/animation/shapes/heads.js.map +1 -0
  52. package/dist/cjs/animation/shapes/headwear.js +44 -0
  53. package/dist/cjs/animation/shapes/headwear.js.map +1 -0
  54. package/dist/cjs/animation/shapes/legs.js +15 -0
  55. package/dist/cjs/animation/shapes/legs.js.map +1 -0
  56. package/dist/cjs/animation/shapes/mouths.js +53 -0
  57. package/dist/cjs/animation/shapes/mouths.js.map +1 -0
  58. package/dist/cjs/animation/shapes/noses.js +31 -0
  59. package/dist/cjs/animation/shapes/noses.js.map +1 -0
  60. package/dist/cjs/animation/shapes/outfits.js +43 -0
  61. package/dist/cjs/animation/shapes/outfits.js.map +1 -0
  62. package/dist/cjs/animation/shapes/torsos.js +13 -0
  63. package/dist/cjs/animation/shapes/torsos.js.map +1 -0
  64. package/dist/cjs/animation/spineExport.js +132 -0
  65. package/dist/cjs/animation/spineExport.js.map +1 -0
  66. package/dist/cjs/core/LocalUI.js +54 -0
  67. package/dist/cjs/core/LocalUI.js.map +1 -0
  68. package/dist/cjs/core/collaboration.js +259 -0
  69. package/dist/cjs/core/collaboration.js.map +1 -0
  70. package/dist/cjs/core/colorBlindness.js +97 -0
  71. package/dist/cjs/core/colorBlindness.js.map +1 -0
  72. package/dist/cjs/core/dragDrop.js +168 -0
  73. package/dist/cjs/core/dragDrop.js.map +1 -0
  74. package/dist/cjs/core/fixes.js +185 -0
  75. package/dist/cjs/core/fixes.js.map +1 -0
  76. package/dist/cjs/core/gridGuides.js +245 -0
  77. package/dist/cjs/core/gridGuides.js.map +1 -0
  78. package/dist/cjs/core/historyVisual.js +124 -0
  79. package/dist/cjs/core/historyVisual.js.map +1 -0
  80. package/dist/cjs/core/i18n.js +16 -0
  81. package/dist/cjs/core/i18n.js.map +1 -0
  82. package/dist/cjs/core/integrations.js +261 -0
  83. package/dist/cjs/core/integrations.js.map +1 -0
  84. package/dist/cjs/core/minimap.js +142 -0
  85. package/dist/cjs/core/minimap.js.map +1 -0
  86. package/dist/cjs/core/plugins.js +129 -0
  87. package/dist/cjs/core/plugins.js.map +1 -0
  88. package/dist/cjs/core/rtl.js +102 -0
  89. package/dist/cjs/core/rtl.js.map +1 -0
  90. package/dist/cjs/core/shortcuts.js +205 -0
  91. package/dist/cjs/core/shortcuts.js.map +1 -0
  92. package/dist/cjs/core/theme.js +171 -0
  93. package/dist/cjs/core/theme.js.map +1 -0
  94. package/dist/cjs/font/NiceFontEditor.js +193 -0
  95. package/dist/cjs/font/NiceFontEditor.js.map +1 -0
  96. package/dist/cjs/game/GameAsset2dEditor.js +371 -0
  97. package/dist/cjs/game/GameAsset2dEditor.js.map +1 -0
  98. package/dist/cjs/game/GameAsset2dEditor.module.css.js +6 -0
  99. package/dist/cjs/game/GameAsset2dEditor.module.css.js.map +1 -0
  100. package/dist/cjs/game/gameAssetTypes.js +20 -0
  101. package/dist/cjs/game/gameAssetTypes.js.map +1 -0
  102. package/dist/cjs/game/gameAssetUtils.js +475 -0
  103. package/dist/cjs/game/gameAssetUtils.js.map +1 -0
  104. package/dist/cjs/game/useGameAssetEditor.js +761 -0
  105. package/dist/cjs/game/useGameAssetEditor.js.map +1 -0
  106. package/dist/cjs/icon/NiceIconEditor.js +249 -0
  107. package/dist/cjs/icon/NiceIconEditor.js.map +1 -0
  108. package/dist/cjs/index.js +264 -0
  109. package/dist/cjs/index.js.map +1 -0
  110. package/dist/cjs/nice2dev-ui/dist/index.js +32070 -0
  111. package/dist/cjs/nice2dev-ui/dist/index.js.map +1 -0
  112. package/dist/cjs/nice2dev-ui-graphics.css +1 -0
  113. package/dist/cjs/photo/FilterThumb.js +29 -0
  114. package/dist/cjs/photo/FilterThumb.js.map +1 -0
  115. package/dist/cjs/photo/PhotoEditor.js +20 -0
  116. package/dist/cjs/photo/PhotoEditor.js.map +1 -0
  117. package/dist/cjs/photo/PhotoEditor.module.css.js +6 -0
  118. package/dist/cjs/photo/PhotoEditor.module.css.js.map +1 -0
  119. package/dist/cjs/photo/PhotoEditorCanvas.js +59 -0
  120. package/dist/cjs/photo/PhotoEditorCanvas.js.map +1 -0
  121. package/dist/cjs/photo/PhotoEditorLeftPanel.js +174 -0
  122. package/dist/cjs/photo/PhotoEditorLeftPanel.js.map +1 -0
  123. package/dist/cjs/photo/PhotoEditorToolbar.js +15 -0
  124. package/dist/cjs/photo/PhotoEditorToolbar.js.map +1 -0
  125. package/dist/cjs/photo/photoEditorActions.js +80 -0
  126. package/dist/cjs/photo/photoEditorActions.js.map +1 -0
  127. package/dist/cjs/photo/photoEditorTypes.js +40 -0
  128. package/dist/cjs/photo/photoEditorTypes.js.map +1 -0
  129. package/dist/cjs/photo/photoFilters.js +880 -0
  130. package/dist/cjs/photo/photoFilters.js.map +1 -0
  131. package/dist/cjs/photo/photoOverlays.js +651 -0
  132. package/dist/cjs/photo/photoOverlays.js.map +1 -0
  133. package/dist/cjs/photo/photoSelection.js +547 -0
  134. package/dist/cjs/photo/photoSelection.js.map +1 -0
  135. package/dist/cjs/photo/usePhotoEditor.js +640 -0
  136. package/dist/cjs/photo/usePhotoEditor.js.map +1 -0
  137. package/dist/cjs/pixel/HSVPicker.js +173 -0
  138. package/dist/cjs/pixel/HSVPicker.js.map +1 -0
  139. package/dist/cjs/pixel/PixelEditor.js +28 -0
  140. package/dist/cjs/pixel/PixelEditor.js.map +1 -0
  141. package/dist/cjs/pixel/PixelEditor.module.css.js +6 -0
  142. package/dist/cjs/pixel/PixelEditor.module.css.js.map +1 -0
  143. package/dist/cjs/pixel/PixelEditorCanvas.js +15 -0
  144. package/dist/cjs/pixel/PixelEditorCanvas.js.map +1 -0
  145. package/dist/cjs/pixel/PixelEditorMenuBar.js +11 -0
  146. package/dist/cjs/pixel/PixelEditorMenuBar.js.map +1 -0
  147. package/dist/cjs/pixel/PixelEditorRightPanel.js +15 -0
  148. package/dist/cjs/pixel/PixelEditorRightPanel.js.map +1 -0
  149. package/dist/cjs/pixel/PixelEditorStatusBar.js +15 -0
  150. package/dist/cjs/pixel/PixelEditorStatusBar.js.map +1 -0
  151. package/dist/cjs/pixel/PixelEditorTimeline.js +11 -0
  152. package/dist/cjs/pixel/PixelEditorTimeline.js.map +1 -0
  153. package/dist/cjs/pixel/PixelEditorToolbar.js +16 -0
  154. package/dist/cjs/pixel/PixelEditorToolbar.js.map +1 -0
  155. package/dist/cjs/pixel/asepriteFormat.js +512 -0
  156. package/dist/cjs/pixel/asepriteFormat.js.map +1 -0
  157. package/dist/cjs/pixel/pixelEditorExports.js +471 -0
  158. package/dist/cjs/pixel/pixelEditorExports.js.map +1 -0
  159. package/dist/cjs/pixel/pixelEditorTypes.js +102 -0
  160. package/dist/cjs/pixel/pixelEditorTypes.js.map +1 -0
  161. package/dist/cjs/pixel/pixelEditorUtils.js +664 -0
  162. package/dist/cjs/pixel/pixelEditorUtils.js.map +1 -0
  163. package/dist/cjs/pixel/usePixelEditor.js +1112 -0
  164. package/dist/cjs/pixel/usePixelEditor.js.map +1 -0
  165. package/dist/cjs/texture/Nice3DTexturePainter.js +236 -0
  166. package/dist/cjs/texture/Nice3DTexturePainter.js.map +1 -0
  167. package/dist/cjs/ui/NiceUIDesigner.js +191 -0
  168. package/dist/cjs/ui/NiceUIDesigner.js.map +1 -0
  169. package/dist/cjs/vector/VectorEditor.js +31 -0
  170. package/dist/cjs/vector/VectorEditor.js.map +1 -0
  171. package/dist/cjs/vector/VectorEditor.module.css.js +6 -0
  172. package/dist/cjs/vector/VectorEditor.module.css.js.map +1 -0
  173. package/dist/cjs/vector/VectorEditorMenuBar.js +16 -0
  174. package/dist/cjs/vector/VectorEditorMenuBar.js.map +1 -0
  175. package/dist/cjs/vector/VectorEditorRightPanel.js +126 -0
  176. package/dist/cjs/vector/VectorEditorRightPanel.js.map +1 -0
  177. package/dist/cjs/vector/VectorEditorShapeRenderer.js +55 -0
  178. package/dist/cjs/vector/VectorEditorShapeRenderer.js.map +1 -0
  179. package/dist/cjs/vector/VectorEditorStatusBar.js +14 -0
  180. package/dist/cjs/vector/VectorEditorStatusBar.js.map +1 -0
  181. package/dist/cjs/vector/useVectorEditor.js +613 -0
  182. package/dist/cjs/vector/useVectorEditor.js.map +1 -0
  183. package/dist/cjs/vector/vectorBooleanOps.js +511 -0
  184. package/dist/cjs/vector/vectorBooleanOps.js.map +1 -0
  185. package/dist/cjs/vector/vectorEditorExport.js +159 -0
  186. package/dist/cjs/vector/vectorEditorExport.js.map +1 -0
  187. package/dist/cjs/vector/vectorEditorImport.js +150 -0
  188. package/dist/cjs/vector/vectorEditorImport.js.map +1 -0
  189. package/dist/cjs/vector/vectorEditorTypes.js +72 -0
  190. package/dist/cjs/vector/vectorEditorTypes.js.map +1 -0
  191. package/dist/cjs/vector/vectorGradients.js +201 -0
  192. package/dist/cjs/vector/vectorGradients.js.map +1 -0
  193. package/dist/esm/animation/AnimatedPerson.js +151 -0
  194. package/dist/esm/animation/AnimatedPerson.js.map +1 -0
  195. package/dist/esm/animation/AnimationEditor.js +104 -0
  196. package/dist/esm/animation/AnimationEditor.js.map +1 -0
  197. package/dist/esm/animation/Audience.js +57 -0
  198. package/dist/esm/animation/Audience.js.map +1 -0
  199. package/dist/esm/animation/BodyRenderer.js +28 -0
  200. package/dist/esm/animation/BodyRenderer.js.map +1 -0
  201. package/dist/esm/animation/animationHelper.js +268 -0
  202. package/dist/esm/animation/animationHelper.js.map +1 -0
  203. package/dist/esm/animation/characterTypes.js +70 -0
  204. package/dist/esm/animation/characterTypes.js.map +1 -0
  205. package/dist/esm/animation/choreoDSL.js +182 -0
  206. package/dist/esm/animation/choreoDSL.js.map +1 -0
  207. package/dist/esm/animation/choreography.js +36 -0
  208. package/dist/esm/animation/choreography.js.map +1 -0
  209. package/dist/esm/animation/karaokeIntegration.js +91 -0
  210. package/dist/esm/animation/karaokeIntegration.js.map +1 -0
  211. package/dist/esm/animation/lottieExport.js +123 -0
  212. package/dist/esm/animation/lottieExport.js.map +1 -0
  213. package/dist/esm/animation/motionPath.js +185 -0
  214. package/dist/esm/animation/motionPath.js.map +1 -0
  215. package/dist/esm/animation/physics.js +192 -0
  216. package/dist/esm/animation/physics.js.map +1 -0
  217. package/dist/esm/animation/rig/RigPlayer.js +61 -0
  218. package/dist/esm/animation/rig/RigPlayer.js.map +1 -0
  219. package/dist/esm/animation/rig/RiggedBody.js +28 -0
  220. package/dist/esm/animation/rig/RiggedBody.js.map +1 -0
  221. package/dist/esm/animation/rig/choreoRigBridge.js +60 -0
  222. package/dist/esm/animation/rig/choreoRigBridge.js.map +1 -0
  223. package/dist/esm/animation/rig/ik.js +20 -0
  224. package/dist/esm/animation/rig/ik.js.map +1 -0
  225. package/dist/esm/animation/rig/poseOps.js +45 -0
  226. package/dist/esm/animation/rig/poseOps.js.map +1 -0
  227. package/dist/esm/animation/rig/presets.js +53 -0
  228. package/dist/esm/animation/rig/presets.js.map +1 -0
  229. package/dist/esm/animation/rig/rigMath.js +37 -0
  230. package/dist/esm/animation/rig/rigMath.js.map +1 -0
  231. package/dist/esm/animation/rig/rigTypes.js +40 -0
  232. package/dist/esm/animation/rig/rigTypes.js.map +1 -0
  233. package/dist/esm/animation/shapes/arms.js +13 -0
  234. package/dist/esm/animation/shapes/arms.js.map +1 -0
  235. package/dist/esm/animation/shapes/eyes.js +45 -0
  236. package/dist/esm/animation/shapes/eyes.js.map +1 -0
  237. package/dist/esm/animation/shapes/hair.js +46 -0
  238. package/dist/esm/animation/shapes/hair.js.map +1 -0
  239. package/dist/esm/animation/shapes/heads.js +52 -0
  240. package/dist/esm/animation/shapes/heads.js.map +1 -0
  241. package/dist/esm/animation/shapes/headwear.js +36 -0
  242. package/dist/esm/animation/shapes/headwear.js.map +1 -0
  243. package/dist/esm/animation/shapes/legs.js +13 -0
  244. package/dist/esm/animation/shapes/legs.js.map +1 -0
  245. package/dist/esm/animation/shapes/mouths.js +45 -0
  246. package/dist/esm/animation/shapes/mouths.js.map +1 -0
  247. package/dist/esm/animation/shapes/noses.js +23 -0
  248. package/dist/esm/animation/shapes/noses.js.map +1 -0
  249. package/dist/esm/animation/shapes/outfits.js +37 -0
  250. package/dist/esm/animation/shapes/outfits.js.map +1 -0
  251. package/dist/esm/animation/shapes/torsos.js +11 -0
  252. package/dist/esm/animation/shapes/torsos.js.map +1 -0
  253. package/dist/esm/animation/spineExport.js +128 -0
  254. package/dist/esm/animation/spineExport.js.map +1 -0
  255. package/dist/esm/core/LocalUI.js +50 -0
  256. package/dist/esm/core/LocalUI.js.map +1 -0
  257. package/dist/esm/core/collaboration.js +252 -0
  258. package/dist/esm/core/collaboration.js.map +1 -0
  259. package/dist/esm/core/colorBlindness.js +90 -0
  260. package/dist/esm/core/colorBlindness.js.map +1 -0
  261. package/dist/esm/core/dragDrop.js +165 -0
  262. package/dist/esm/core/dragDrop.js.map +1 -0
  263. package/dist/esm/core/fixes.js +179 -0
  264. package/dist/esm/core/fixes.js.map +1 -0
  265. package/dist/esm/core/gridGuides.js +232 -0
  266. package/dist/esm/core/gridGuides.js.map +1 -0
  267. package/dist/esm/core/historyVisual.js +121 -0
  268. package/dist/esm/core/historyVisual.js.map +1 -0
  269. package/dist/esm/core/i18n.js +13 -0
  270. package/dist/esm/core/i18n.js.map +1 -0
  271. package/dist/esm/core/integrations.js +254 -0
  272. package/dist/esm/core/integrations.js.map +1 -0
  273. package/dist/esm/core/minimap.js +139 -0
  274. package/dist/esm/core/minimap.js.map +1 -0
  275. package/dist/esm/core/plugins.js +124 -0
  276. package/dist/esm/core/plugins.js.map +1 -0
  277. package/dist/esm/core/rtl.js +95 -0
  278. package/dist/esm/core/rtl.js.map +1 -0
  279. package/dist/esm/core/shortcuts.js +200 -0
  280. package/dist/esm/core/shortcuts.js.map +1 -0
  281. package/dist/esm/core/theme.js +162 -0
  282. package/dist/esm/core/theme.js.map +1 -0
  283. package/dist/esm/font/NiceFontEditor.js +189 -0
  284. package/dist/esm/font/NiceFontEditor.js.map +1 -0
  285. package/dist/esm/game/GameAsset2dEditor.js +369 -0
  286. package/dist/esm/game/GameAsset2dEditor.js.map +1 -0
  287. package/dist/esm/game/GameAsset2dEditor.module.css.js +4 -0
  288. package/dist/esm/game/GameAsset2dEditor.module.css.js.map +1 -0
  289. package/dist/esm/game/gameAssetTypes.js +18 -0
  290. package/dist/esm/game/gameAssetTypes.js.map +1 -0
  291. package/dist/esm/game/gameAssetUtils.js +456 -0
  292. package/dist/esm/game/gameAssetUtils.js.map +1 -0
  293. package/dist/esm/game/useGameAssetEditor.js +759 -0
  294. package/dist/esm/game/useGameAssetEditor.js.map +1 -0
  295. package/dist/esm/icon/NiceIconEditor.js +246 -0
  296. package/dist/esm/icon/NiceIconEditor.js.map +1 -0
  297. package/dist/esm/index.js +59 -0
  298. package/dist/esm/index.js.map +1 -0
  299. package/dist/esm/nice2dev-ui/dist/index.js +31720 -0
  300. package/dist/esm/nice2dev-ui/dist/index.js.map +1 -0
  301. package/dist/esm/nice2dev-ui-graphics.css +1 -0
  302. package/dist/esm/photo/FilterThumb.js +27 -0
  303. package/dist/esm/photo/FilterThumb.js.map +1 -0
  304. package/dist/esm/photo/PhotoEditor.js +18 -0
  305. package/dist/esm/photo/PhotoEditor.js.map +1 -0
  306. package/dist/esm/photo/PhotoEditor.module.css.js +4 -0
  307. package/dist/esm/photo/PhotoEditor.module.css.js.map +1 -0
  308. package/dist/esm/photo/PhotoEditorCanvas.js +57 -0
  309. package/dist/esm/photo/PhotoEditorCanvas.js.map +1 -0
  310. package/dist/esm/photo/PhotoEditorLeftPanel.js +172 -0
  311. package/dist/esm/photo/PhotoEditorLeftPanel.js.map +1 -0
  312. package/dist/esm/photo/PhotoEditorToolbar.js +13 -0
  313. package/dist/esm/photo/PhotoEditorToolbar.js.map +1 -0
  314. package/dist/esm/photo/photoEditorActions.js +75 -0
  315. package/dist/esm/photo/photoEditorActions.js.map +1 -0
  316. package/dist/esm/photo/photoEditorTypes.js +36 -0
  317. package/dist/esm/photo/photoEditorTypes.js.map +1 -0
  318. package/dist/esm/photo/photoFilters.js +871 -0
  319. package/dist/esm/photo/photoFilters.js.map +1 -0
  320. package/dist/esm/photo/photoOverlays.js +636 -0
  321. package/dist/esm/photo/photoOverlays.js.map +1 -0
  322. package/dist/esm/photo/photoSelection.js +535 -0
  323. package/dist/esm/photo/photoSelection.js.map +1 -0
  324. package/dist/esm/photo/usePhotoEditor.js +638 -0
  325. package/dist/esm/photo/usePhotoEditor.js.map +1 -0
  326. package/dist/esm/pixel/HSVPicker.js +171 -0
  327. package/dist/esm/pixel/HSVPicker.js.map +1 -0
  328. package/dist/esm/pixel/PixelEditor.js +26 -0
  329. package/dist/esm/pixel/PixelEditor.js.map +1 -0
  330. package/dist/esm/pixel/PixelEditor.module.css.js +4 -0
  331. package/dist/esm/pixel/PixelEditor.module.css.js.map +1 -0
  332. package/dist/esm/pixel/PixelEditorCanvas.js +13 -0
  333. package/dist/esm/pixel/PixelEditorCanvas.js.map +1 -0
  334. package/dist/esm/pixel/PixelEditorMenuBar.js +9 -0
  335. package/dist/esm/pixel/PixelEditorMenuBar.js.map +1 -0
  336. package/dist/esm/pixel/PixelEditorRightPanel.js +13 -0
  337. package/dist/esm/pixel/PixelEditorRightPanel.js.map +1 -0
  338. package/dist/esm/pixel/PixelEditorStatusBar.js +13 -0
  339. package/dist/esm/pixel/PixelEditorStatusBar.js.map +1 -0
  340. package/dist/esm/pixel/PixelEditorTimeline.js +9 -0
  341. package/dist/esm/pixel/PixelEditorTimeline.js.map +1 -0
  342. package/dist/esm/pixel/PixelEditorToolbar.js +14 -0
  343. package/dist/esm/pixel/PixelEditorToolbar.js.map +1 -0
  344. package/dist/esm/pixel/asepriteFormat.js +505 -0
  345. package/dist/esm/pixel/asepriteFormat.js.map +1 -0
  346. package/dist/esm/pixel/pixelEditorExports.js +461 -0
  347. package/dist/esm/pixel/pixelEditorExports.js.map +1 -0
  348. package/dist/esm/pixel/pixelEditorTypes.js +90 -0
  349. package/dist/esm/pixel/pixelEditorTypes.js.map +1 -0
  350. package/dist/esm/pixel/pixelEditorUtils.js +631 -0
  351. package/dist/esm/pixel/pixelEditorUtils.js.map +1 -0
  352. package/dist/esm/pixel/usePixelEditor.js +1110 -0
  353. package/dist/esm/pixel/usePixelEditor.js.map +1 -0
  354. package/dist/esm/texture/Nice3DTexturePainter.js +233 -0
  355. package/dist/esm/texture/Nice3DTexturePainter.js.map +1 -0
  356. package/dist/esm/ui/NiceUIDesigner.js +187 -0
  357. package/dist/esm/ui/NiceUIDesigner.js.map +1 -0
  358. package/dist/esm/vector/VectorEditor.js +29 -0
  359. package/dist/esm/vector/VectorEditor.js.map +1 -0
  360. package/dist/esm/vector/VectorEditor.module.css.js +4 -0
  361. package/dist/esm/vector/VectorEditor.module.css.js.map +1 -0
  362. package/dist/esm/vector/VectorEditorMenuBar.js +14 -0
  363. package/dist/esm/vector/VectorEditorMenuBar.js.map +1 -0
  364. package/dist/esm/vector/VectorEditorRightPanel.js +124 -0
  365. package/dist/esm/vector/VectorEditorRightPanel.js.map +1 -0
  366. package/dist/esm/vector/VectorEditorShapeRenderer.js +53 -0
  367. package/dist/esm/vector/VectorEditorShapeRenderer.js.map +1 -0
  368. package/dist/esm/vector/VectorEditorStatusBar.js +12 -0
  369. package/dist/esm/vector/VectorEditorStatusBar.js.map +1 -0
  370. package/dist/esm/vector/useVectorEditor.js +611 -0
  371. package/dist/esm/vector/useVectorEditor.js.map +1 -0
  372. package/dist/esm/vector/vectorBooleanOps.js +507 -0
  373. package/dist/esm/vector/vectorBooleanOps.js.map +1 -0
  374. package/dist/esm/vector/vectorEditorExport.js +152 -0
  375. package/dist/esm/vector/vectorEditorExport.js.map +1 -0
  376. package/dist/esm/vector/vectorEditorImport.js +148 -0
  377. package/dist/esm/vector/vectorEditorImport.js.map +1 -0
  378. package/dist/esm/vector/vectorEditorTypes.js +63 -0
  379. package/dist/esm/vector/vectorEditorTypes.js.map +1 -0
  380. package/dist/esm/vector/vectorGradients.js +193 -0
  381. package/dist/esm/vector/vectorGradients.js.map +1 -0
  382. package/dist/types/__benchmarks__/bench.d.ts +13 -0
  383. package/dist/types/__tests__/setup.d.ts +4 -0
  384. package/dist/types/animation/AnimatedPerson.d.ts +14 -0
  385. package/dist/types/animation/AnimationEditor.d.ts +20 -0
  386. package/dist/types/animation/Audience.d.ts +11 -0
  387. package/dist/types/animation/BodyRenderer.d.ts +12 -0
  388. package/dist/types/animation/animationHelper.d.ts +28 -0
  389. package/dist/types/animation/characterTypes.d.ts +37 -0
  390. package/dist/types/animation/choreoDSL.d.ts +88 -0
  391. package/dist/types/animation/choreography.d.ts +8 -0
  392. package/dist/types/animation/karaokeIntegration.d.ts +31 -0
  393. package/dist/types/animation/lottieExport.d.ts +77 -0
  394. package/dist/types/animation/motionPath.d.ts +60 -0
  395. package/dist/types/animation/physics.d.ts +73 -0
  396. package/dist/types/animation/rig/RigPlayer.d.ts +32 -0
  397. package/dist/types/animation/rig/RiggedBody.d.ts +19 -0
  398. package/dist/types/animation/rig/choreoRigBridge.d.ts +9 -0
  399. package/dist/types/animation/rig/ik.d.ts +8 -0
  400. package/dist/types/animation/rig/poseOps.d.ts +14 -0
  401. package/dist/types/animation/rig/presets.d.ts +13 -0
  402. package/dist/types/animation/rig/rigMath.d.ts +7 -0
  403. package/dist/types/animation/rig/rigTypes.d.ts +38 -0
  404. package/dist/types/animation/shapes/arms.d.ts +10 -0
  405. package/dist/types/animation/shapes/eyes.d.ts +17 -0
  406. package/dist/types/animation/shapes/hair.d.ts +17 -0
  407. package/dist/types/animation/shapes/heads.d.ts +18 -0
  408. package/dist/types/animation/shapes/headwear.d.ts +16 -0
  409. package/dist/types/animation/shapes/legs.d.ts +10 -0
  410. package/dist/types/animation/shapes/mouths.d.ts +17 -0
  411. package/dist/types/animation/shapes/noses.d.ts +17 -0
  412. package/dist/types/animation/shapes/outfits.d.ts +14 -0
  413. package/dist/types/animation/shapes/torsos.d.ts +9 -0
  414. package/dist/types/animation/spineExport.d.ts +66 -0
  415. package/dist/types/core/LocalUI.d.ts +21 -0
  416. package/dist/types/core/collaboration.d.ts +164 -0
  417. package/dist/types/core/colorBlindness.d.ts +24 -0
  418. package/dist/types/core/dragDrop.d.ts +46 -0
  419. package/dist/types/core/fixes.d.ts +80 -0
  420. package/dist/types/core/gridGuides.d.ts +70 -0
  421. package/dist/types/core/historyVisual.d.ts +915 -0
  422. package/dist/types/core/i18n.d.ts +27 -0
  423. package/dist/types/core/integrations.d.ts +103 -0
  424. package/dist/types/core/minimap.d.ts +49 -0
  425. package/dist/types/core/plugins.d.ts +111 -0
  426. package/dist/types/core/rtl.d.ts +32 -0
  427. package/dist/types/core/shortcuts.d.ts +150 -0
  428. package/dist/types/core/theme.d.ts +78 -0
  429. package/dist/types/core/useGamepad.d.ts +64 -0
  430. package/dist/types/core/usePointerPressure.d.ts +88 -0
  431. package/dist/types/font/NiceFontEditor.d.ts +62 -0
  432. package/dist/types/game/AnimationPreviewPlayer.d.ts +29 -0
  433. package/dist/types/game/CollisionEditor.d.ts +101 -0
  434. package/dist/types/game/GameAsset2dEditor.d.ts +17 -0
  435. package/dist/types/game/GameAssetExportPanel.d.ts +20 -0
  436. package/dist/types/game/IsometricEditor.d.ts +22 -0
  437. package/dist/types/game/IsometricTilePanel.d.ts +18 -0
  438. package/dist/types/game/gameAssetExport.d.ts +160 -0
  439. package/dist/types/game/gameAssetTypes.d.ts +238 -0
  440. package/dist/types/game/gameAssetUtils.d.ts +23 -0
  441. package/dist/types/game/index.d.ts +8 -0
  442. package/dist/types/game/isometricTiles.d.ts +250 -0
  443. package/dist/types/game/useAnimationPreview.d.ts +63 -0
  444. package/dist/types/game/useCollisionEditor.d.ts +96 -0
  445. package/dist/types/game/useGameAssetEditor.d.ts +79 -0
  446. package/dist/types/game/useGameAssetExport.d.ts +82 -0
  447. package/dist/types/icon/NiceIconEditor.d.ts +79 -0
  448. package/dist/types/index.d.ts +85 -0
  449. package/dist/types/photo/BatchProcessingPanel.d.ts +13 -0
  450. package/dist/types/photo/FaceDetectionPanel.d.ts +18 -0
  451. package/dist/types/photo/FilterThumb.d.ts +14 -0
  452. package/dist/types/photo/PerspectiveCorrectionPanel.d.ts +17 -0
  453. package/dist/types/photo/PhotoEditor.d.ts +2 -0
  454. package/dist/types/photo/PhotoEditorCanvas.d.ts +14 -0
  455. package/dist/types/photo/PhotoEditorLeftPanel.d.ts +13 -0
  456. package/dist/types/photo/PhotoEditorToolbar.d.ts +13 -0
  457. package/dist/types/photo/RawFilePanel.d.ts +14 -0
  458. package/dist/types/photo/StyleTransferPanel.d.ts +15 -0
  459. package/dist/types/photo/aiStyleTransfer.d.ts +58 -0
  460. package/dist/types/photo/batchProcessing.d.ts +95 -0
  461. package/dist/types/photo/faceDetection.d.ts +103 -0
  462. package/dist/types/photo/index.d.ts +17 -0
  463. package/dist/types/photo/perspectiveCorrection.d.ts +134 -0
  464. package/dist/types/photo/photoEditorActions.d.ts +40 -0
  465. package/dist/types/photo/photoEditorTypes.d.ts +34 -0
  466. package/dist/types/photo/photoFilters.d.ts +55 -0
  467. package/dist/types/photo/photoOverlays.d.ts +126 -0
  468. package/dist/types/photo/photoSelection.d.ts +56 -0
  469. package/dist/types/photo/rawFileSupport.d.ts +124 -0
  470. package/dist/types/photo/usePhotoEditor.d.ts +123 -0
  471. package/dist/types/pixel/HSVPicker.d.ts +11 -0
  472. package/dist/types/pixel/PaletteExtractorPanel.d.ts +16 -0
  473. package/dist/types/pixel/PixelEditor.d.ts +17 -0
  474. package/dist/types/pixel/PixelEditorCanvas.d.ts +10 -0
  475. package/dist/types/pixel/PixelEditorMenuBar.d.ts +11 -0
  476. package/dist/types/pixel/PixelEditorRightPanel.d.ts +11 -0
  477. package/dist/types/pixel/PixelEditorStatusBar.d.ts +11 -0
  478. package/dist/types/pixel/PixelEditorTimeline.d.ts +11 -0
  479. package/dist/types/pixel/PixelEditorToolbar.d.ts +11 -0
  480. package/dist/types/pixel/TileMapPanel.d.ts +14 -0
  481. package/dist/types/pixel/asepriteFormat.d.ts +62 -0
  482. package/dist/types/pixel/paletteExtractor.d.ts +73 -0
  483. package/dist/types/pixel/pixelEditorExports.d.ts +31 -0
  484. package/dist/types/pixel/pixelEditorTypes.d.ts +51 -0
  485. package/dist/types/pixel/pixelEditorUtils.d.ts +136 -0
  486. package/dist/types/pixel/tileMapMode.d.ts +122 -0
  487. package/dist/types/pixel/usePixelEditor.d.ts +114 -0
  488. package/dist/types/texture/Nice3DTexturePainter.d.ts +55 -0
  489. package/dist/types/ui/NiceUIDesigner.d.ts +43 -0
  490. package/dist/types/vector/PathSimplificationPanel.d.ts +15 -0
  491. package/dist/types/vector/PdfExportPanel.d.ts +20 -0
  492. package/dist/types/vector/TextOnPathPanel.d.ts +26 -0
  493. package/dist/types/vector/VectorEditor.d.ts +32 -0
  494. package/dist/types/vector/VectorEditorMenuBar.d.ts +8 -0
  495. package/dist/types/vector/VectorEditorRightPanel.d.ts +7 -0
  496. package/dist/types/vector/VectorEditorShapeRenderer.d.ts +9 -0
  497. package/dist/types/vector/VectorEditorStatusBar.d.ts +9 -0
  498. package/dist/types/vector/VectorFilterPanel.d.ts +19 -0
  499. package/dist/types/vector/VectorPatternPanel.d.ts +21 -0
  500. package/dist/types/vector/pathSimplification.d.ts +135 -0
  501. package/dist/types/vector/pdfExport.d.ts +65 -0
  502. package/dist/types/vector/textOnPath.d.ts +145 -0
  503. package/dist/types/vector/useVectorEditor.d.ts +90 -0
  504. package/dist/types/vector/vectorBooleanOps.d.ts +22 -0
  505. package/dist/types/vector/vectorEditorExport.d.ts +8 -0
  506. package/dist/types/vector/vectorEditorImport.d.ts +7 -0
  507. package/dist/types/vector/vectorEditorTypes.d.ts +47 -0
  508. package/dist/types/vector/vectorGradients.d.ts +64 -0
  509. package/dist/types/vector/vectorPatternFills.d.ts +101 -0
  510. package/dist/types/vector/vectorSvgFilters.d.ts +134 -0
  511. package/package.json +93 -0
@@ -0,0 +1,761 @@
1
+ 'use strict';
2
+
3
+ var React = require('react');
4
+ var gameAssetUtils = require('./gameAssetUtils.js');
5
+
6
+ /**
7
+ * useGameAssetEditor.ts — State and logic hook for GameAsset2dEditor
8
+ */
9
+ const DEFAULT_EDITOR_STATE = {
10
+ mode: 'tilemap',
11
+ tileMapTool: 'brush',
12
+ spriteSheetTool: 'select',
13
+ selectedTileId: null,
14
+ selectedFrameIds: [],
15
+ selectedStateId: null,
16
+ activeLayerId: null,
17
+ activeTileMapId: null,
18
+ activeSpriteSheetId: null,
19
+ activeStateMachineId: null,
20
+ zoom: 1,
21
+ panX: 0,
22
+ panY: 0,
23
+ showGrid: true,
24
+ showCollision: false,
25
+ snapToGrid: true,
26
+ };
27
+ const MAX_HISTORY = 50;
28
+ const useGameAssetEditor = (options = {}) => {
29
+ const { onSave, onExport } = options;
30
+ const [project, setProject] = React.useState(() => gameAssetUtils.createEmptyProject('Untitled'));
31
+ const [editorState, setEditorState] = React.useState(DEFAULT_EDITOR_STATE);
32
+ const [history, setHistory] = React.useState([]);
33
+ const [historyIndex, setHistoryIndex] = React.useState(-1);
34
+ const [currentEffects, setCurrentEffects] = React.useState([]);
35
+ const canvasRef = React.useRef(null);
36
+ const fileInputRef = React.useRef(null);
37
+ // ─────────────────────────────────────────────────────────────
38
+ // History management
39
+ // ─────────────────────────────────────────────────────────────
40
+ const pushHistory = React.useCallback((description) => {
41
+ const entry = {
42
+ id: gameAssetUtils.generateId('history'),
43
+ description,
44
+ timestamp: Date.now(),
45
+ snapshot: JSON.parse(JSON.stringify(project)),
46
+ };
47
+ setHistory(prev => {
48
+ const newHistory = prev.slice(0, historyIndex + 1);
49
+ newHistory.push(entry);
50
+ if (newHistory.length > MAX_HISTORY)
51
+ newHistory.shift();
52
+ return newHistory;
53
+ });
54
+ setHistoryIndex(prev => Math.min(prev + 1, MAX_HISTORY - 1));
55
+ }, [project, historyIndex]);
56
+ const undo = React.useCallback(() => {
57
+ if (historyIndex > 0) {
58
+ const entry = history[historyIndex - 1];
59
+ setProject(entry.snapshot);
60
+ setHistoryIndex(prev => prev - 1);
61
+ }
62
+ }, [history, historyIndex]);
63
+ const redo = React.useCallback(() => {
64
+ if (historyIndex < history.length - 1) {
65
+ const entry = history[historyIndex + 1];
66
+ setProject(entry.snapshot);
67
+ setHistoryIndex(prev => prev + 1);
68
+ }
69
+ }, [history, historyIndex]);
70
+ // ─────────────────────────────────────────────────────────────
71
+ // Project operations
72
+ // ─────────────────────────────────────────────────────────────
73
+ const newProject = React.useCallback((name) => {
74
+ const newProj = gameAssetUtils.createEmptyProject(name);
75
+ setProject(newProj);
76
+ setEditorState(DEFAULT_EDITOR_STATE);
77
+ setHistory([]);
78
+ setHistoryIndex(-1);
79
+ }, []);
80
+ const saveProject = React.useCallback(() => {
81
+ const data = gameAssetUtils.serializeProject(project);
82
+ gameAssetUtils.downloadJson(JSON.parse(data), `${project.name}.json`);
83
+ onSave === null || onSave === void 0 ? void 0 : onSave(project);
84
+ }, [project, onSave]);
85
+ const loadProject = React.useCallback(async (file) => {
86
+ const text = await file.text();
87
+ const loaded = await gameAssetUtils.deserializeProject(text);
88
+ setProject(loaded);
89
+ setEditorState(DEFAULT_EDITOR_STATE);
90
+ setHistory([]);
91
+ setHistoryIndex(-1);
92
+ }, []);
93
+ // ─────────────────────────────────────────────────────────────
94
+ // Editor state operations
95
+ // ─────────────────────────────────────────────────────────────
96
+ const setMode = React.useCallback((mode) => {
97
+ setEditorState(prev => ({ ...prev, mode }));
98
+ }, []);
99
+ const setTileMapTool = React.useCallback((tool) => {
100
+ setEditorState(prev => ({ ...prev, tileMapTool: tool }));
101
+ }, []);
102
+ const setSpriteSheetTool = React.useCallback((tool) => {
103
+ setEditorState(prev => ({ ...prev, spriteSheetTool: tool }));
104
+ }, []);
105
+ const setZoom = React.useCallback((zoom) => {
106
+ setEditorState(prev => ({ ...prev, zoom: Math.max(0.1, Math.min(10, zoom)) }));
107
+ }, []);
108
+ const setPan = React.useCallback((x, y) => {
109
+ setEditorState(prev => ({ ...prev, panX: x, panY: y }));
110
+ }, []);
111
+ const toggleGrid = React.useCallback(() => {
112
+ setEditorState(prev => ({ ...prev, showGrid: !prev.showGrid }));
113
+ }, []);
114
+ const toggleCollision = React.useCallback(() => {
115
+ setEditorState(prev => ({ ...prev, showCollision: !prev.showCollision }));
116
+ }, []);
117
+ const toggleSnap = React.useCallback(() => {
118
+ setEditorState(prev => ({ ...prev, snapToGrid: !prev.snapToGrid }));
119
+ }, []);
120
+ // ─────────────────────────────────────────────────────────────
121
+ // Tile set operations
122
+ // ─────────────────────────────────────────────────────────────
123
+ const addTile = React.useCallback((imageData, name) => {
124
+ const tile = gameAssetUtils.createTileFromImage(imageData, name);
125
+ setProject(prev => ({ ...prev, tileSets: [...prev.tileSets, tile] }));
126
+ pushHistory(`Add tile: ${name}`);
127
+ }, [pushHistory]);
128
+ const removeTile = React.useCallback((id) => {
129
+ setProject(prev => ({
130
+ ...prev,
131
+ tileSets: prev.tileSets.filter(t => t.id !== id),
132
+ }));
133
+ pushHistory('Remove tile');
134
+ }, [pushHistory]);
135
+ const selectTile = React.useCallback((id) => {
136
+ setEditorState(prev => ({ ...prev, selectedTileId: id }));
137
+ }, []);
138
+ const importTileSet = React.useCallback(async (file) => {
139
+ const dataUrl = await new Promise((resolve) => {
140
+ const reader = new FileReader();
141
+ reader.onload = () => resolve(reader.result);
142
+ reader.readAsDataURL(file);
143
+ });
144
+ const imageData = await gameAssetUtils.dataUrlToImageData(dataUrl);
145
+ const name = file.name.replace(/\.[^/.]+$/, '');
146
+ addTile(imageData, name);
147
+ }, [addTile]);
148
+ // ─────────────────────────────────────────────────────────────
149
+ // Tile map operations
150
+ // ─────────────────────────────────────────────────────────────
151
+ const createTileMap = React.useCallback((name, width, height) => {
152
+ const map = gameAssetUtils.createEmptyTileMap(name, width, height, project.settings.defaultTileWidth, project.settings.defaultTileHeight);
153
+ setProject(prev => ({ ...prev, tileMaps: [...prev.tileMaps, map] }));
154
+ setEditorState(prev => ({
155
+ ...prev,
156
+ activeTileMapId: map.id,
157
+ activeLayerId: map.layers[0].id,
158
+ }));
159
+ pushHistory(`Create tile map: ${name}`);
160
+ }, [project.settings, pushHistory]);
161
+ const removeTileMap = React.useCallback((id) => {
162
+ setProject(prev => ({
163
+ ...prev,
164
+ tileMaps: prev.tileMaps.filter(m => m.id !== id),
165
+ }));
166
+ pushHistory('Remove tile map');
167
+ }, [pushHistory]);
168
+ const selectTileMap = React.useCallback((id) => {
169
+ setEditorState(prev => {
170
+ var _a, _b;
171
+ const map = project.tileMaps.find(m => m.id === id);
172
+ return {
173
+ ...prev,
174
+ activeTileMapId: id,
175
+ activeLayerId: (_b = (_a = map === null || map === void 0 ? void 0 : map.layers[0]) === null || _a === void 0 ? void 0 : _a.id) !== null && _b !== void 0 ? _b : null,
176
+ };
177
+ });
178
+ }, [project.tileMaps]);
179
+ const setTile = React.useCallback((layerId, x, y, tileId) => {
180
+ setProject(prev => ({
181
+ ...prev,
182
+ tileMaps: prev.tileMaps.map(map => ({
183
+ ...map,
184
+ layers: map.layers.map(layer => {
185
+ if (layer.id !== layerId)
186
+ return layer;
187
+ const newTiles = layer.tiles.map(row => [...row]);
188
+ if (y >= 0 && y < newTiles.length && x >= 0 && x < newTiles[0].length) {
189
+ newTiles[y][x] = tileId;
190
+ }
191
+ return { ...layer, tiles: newTiles };
192
+ }),
193
+ })),
194
+ }));
195
+ }, []);
196
+ const fillTiles = React.useCallback((layerId, startX, startY, newTileId) => {
197
+ setProject(prev => {
198
+ var _a;
199
+ const map = prev.tileMaps.find(m => m.layers.some(l => l.id === layerId));
200
+ if (!map)
201
+ return prev;
202
+ const layer = map.layers.find(l => l.id === layerId);
203
+ if (!layer)
204
+ return prev;
205
+ const targetId = (_a = layer.tiles[startY]) === null || _a === void 0 ? void 0 : _a[startX];
206
+ if (targetId === newTileId)
207
+ return prev;
208
+ const newTiles = layer.tiles.map(row => [...row]);
209
+ const stack = [[startX, startY]];
210
+ const visited = new Set();
211
+ while (stack.length > 0) {
212
+ const [x, y] = stack.pop();
213
+ const key = `${x},${y}`;
214
+ if (visited.has(key))
215
+ continue;
216
+ if (y < 0 || y >= newTiles.length || x < 0 || x >= newTiles[0].length)
217
+ continue;
218
+ if (newTiles[y][x] !== targetId)
219
+ continue;
220
+ visited.add(key);
221
+ newTiles[y][x] = newTileId;
222
+ stack.push([x + 1, y], [x - 1, y], [x, y + 1], [x, y - 1]);
223
+ }
224
+ return {
225
+ ...prev,
226
+ tileMaps: prev.tileMaps.map(m => m.id === map.id
227
+ ? { ...m, layers: m.layers.map(l => (l.id === layerId ? { ...l, tiles: newTiles } : l)) }
228
+ : m),
229
+ };
230
+ });
231
+ pushHistory('Fill tiles');
232
+ }, [pushHistory]);
233
+ const addLayer = React.useCallback(() => {
234
+ const map = project.tileMaps.find(m => m.id === editorState.activeTileMapId);
235
+ if (!map)
236
+ return;
237
+ const newLayer = gameAssetUtils.createEmptyTileLayer(`Layer ${map.layers.length + 1}`, map.width, map.height);
238
+ setProject(prev => ({
239
+ ...prev,
240
+ tileMaps: prev.tileMaps.map(m => m.id === map.id ? { ...m, layers: [...m.layers, newLayer] } : m),
241
+ }));
242
+ setEditorState(prev => ({ ...prev, activeLayerId: newLayer.id }));
243
+ pushHistory('Add layer');
244
+ }, [project.tileMaps, editorState.activeTileMapId, pushHistory]);
245
+ const removeLayer = React.useCallback((id) => {
246
+ setProject(prev => ({
247
+ ...prev,
248
+ tileMaps: prev.tileMaps.map(m => ({
249
+ ...m,
250
+ layers: m.layers.filter(l => l.id !== id),
251
+ })),
252
+ }));
253
+ pushHistory('Remove layer');
254
+ }, [pushHistory]);
255
+ const selectLayer = React.useCallback((id) => {
256
+ setEditorState(prev => ({ ...prev, activeLayerId: id }));
257
+ }, []);
258
+ const toggleLayerVisibility = React.useCallback((id) => {
259
+ setProject(prev => ({
260
+ ...prev,
261
+ tileMaps: prev.tileMaps.map(m => ({
262
+ ...m,
263
+ layers: m.layers.map(l => (l.id === id ? { ...l, visible: !l.visible } : l)),
264
+ })),
265
+ }));
266
+ }, []);
267
+ const setLayerOpacity = React.useCallback((id, opacity) => {
268
+ setProject(prev => ({
269
+ ...prev,
270
+ tileMaps: prev.tileMaps.map(m => ({
271
+ ...m,
272
+ layers: m.layers.map(l => (l.id === id ? { ...l, opacity } : l)),
273
+ })),
274
+ }));
275
+ }, []);
276
+ const moveLayer = React.useCallback((id, direction) => {
277
+ setProject(prev => ({
278
+ ...prev,
279
+ tileMaps: prev.tileMaps.map(m => {
280
+ const idx = m.layers.findIndex(l => l.id === id);
281
+ if (idx === -1)
282
+ return m;
283
+ const newIdx = direction === 'up' ? idx - 1 : idx + 1;
284
+ if (newIdx < 0 || newIdx >= m.layers.length)
285
+ return m;
286
+ const newLayers = [...m.layers];
287
+ [newLayers[idx], newLayers[newIdx]] = [newLayers[newIdx], newLayers[idx]];
288
+ return { ...m, layers: newLayers };
289
+ }),
290
+ }));
291
+ pushHistory(`Move layer ${direction}`);
292
+ }, [pushHistory]);
293
+ // ─────────────────────────────────────────────────────────────
294
+ // Sprite sheet operations
295
+ // ─────────────────────────────────────────────────────────────
296
+ const importSpriteSheet = React.useCallback(async (file) => {
297
+ const dataUrl = await new Promise((resolve) => {
298
+ const reader = new FileReader();
299
+ reader.onload = () => resolve(reader.result);
300
+ reader.readAsDataURL(file);
301
+ });
302
+ const image = await gameAssetUtils.loadImage(dataUrl);
303
+ const canvas = document.createElement('canvas');
304
+ canvas.width = image.width;
305
+ canvas.height = image.height;
306
+ const ctx = canvas.getContext('2d');
307
+ ctx.drawImage(image, 0, 0);
308
+ const imageData = ctx.getImageData(0, 0, image.width, image.height);
309
+ const sheet = {
310
+ id: gameAssetUtils.generateId('sheet'),
311
+ name: file.name.replace(/\.[^/.]+$/, ''),
312
+ image,
313
+ imageData,
314
+ dataUrl,
315
+ width: image.width,
316
+ height: image.height,
317
+ frames: [],
318
+ animations: [],
319
+ };
320
+ setProject(prev => ({ ...prev, spriteSheets: [...prev.spriteSheets, sheet] }));
321
+ setEditorState(prev => ({ ...prev, activeSpriteSheetId: sheet.id }));
322
+ pushHistory(`Import sprite sheet: ${sheet.name}`);
323
+ }, [pushHistory]);
324
+ const removeSpriteSheet = React.useCallback((id) => {
325
+ setProject(prev => ({
326
+ ...prev,
327
+ spriteSheets: prev.spriteSheets.filter(s => s.id !== id),
328
+ }));
329
+ pushHistory('Remove sprite sheet');
330
+ }, [pushHistory]);
331
+ const selectSpriteSheet = React.useCallback((id) => {
332
+ setEditorState(prev => ({ ...prev, activeSpriteSheetId: id, selectedFrameIds: [] }));
333
+ }, []);
334
+ const autoSlice = React.useCallback((frameWidth, frameHeight) => {
335
+ const sheet = project.spriteSheets.find(s => s.id === editorState.activeSpriteSheetId);
336
+ if (!(sheet === null || sheet === void 0 ? void 0 : sheet.imageData))
337
+ return;
338
+ const frames = gameAssetUtils.autoSliceSpriteSheet(sheet.imageData, frameWidth, frameHeight);
339
+ setProject(prev => ({
340
+ ...prev,
341
+ spriteSheets: prev.spriteSheets.map(s => s.id === sheet.id ? { ...s, frames } : s),
342
+ }));
343
+ pushHistory('Auto-slice sprite sheet');
344
+ }, [project.spriteSheets, editorState.activeSpriteSheetId, pushHistory]);
345
+ const detectSprites = React.useCallback(() => {
346
+ const sheet = project.spriteSheets.find(s => s.id === editorState.activeSpriteSheetId);
347
+ if (!(sheet === null || sheet === void 0 ? void 0 : sheet.imageData))
348
+ return;
349
+ const frames = gameAssetUtils.detectFrames(sheet.imageData);
350
+ setProject(prev => ({
351
+ ...prev,
352
+ spriteSheets: prev.spriteSheets.map(s => s.id === sheet.id ? { ...s, frames } : s),
353
+ }));
354
+ pushHistory('Detect sprites');
355
+ }, [project.spriteSheets, editorState.activeSpriteSheetId, pushHistory]);
356
+ const addFrame = React.useCallback((frame) => {
357
+ const newFrame = { ...frame, id: gameAssetUtils.generateId('frame') };
358
+ setProject(prev => ({
359
+ ...prev,
360
+ spriteSheets: prev.spriteSheets.map(s => s.id === editorState.activeSpriteSheetId
361
+ ? { ...s, frames: [...s.frames, newFrame] }
362
+ : s),
363
+ }));
364
+ pushHistory('Add frame');
365
+ }, [editorState.activeSpriteSheetId, pushHistory]);
366
+ const updateFrame = React.useCallback((id, updates) => {
367
+ setProject(prev => ({
368
+ ...prev,
369
+ spriteSheets: prev.spriteSheets.map(s => ({
370
+ ...s,
371
+ frames: s.frames.map(f => (f.id === id ? { ...f, ...updates } : f)),
372
+ })),
373
+ }));
374
+ }, []);
375
+ const removeFrame = React.useCallback((id) => {
376
+ setProject(prev => ({
377
+ ...prev,
378
+ spriteSheets: prev.spriteSheets.map(s => ({
379
+ ...s,
380
+ frames: s.frames.filter(f => f.id !== id),
381
+ })),
382
+ }));
383
+ pushHistory('Remove frame');
384
+ }, [pushHistory]);
385
+ const selectFrames = React.useCallback((ids) => {
386
+ setEditorState(prev => ({ ...prev, selectedFrameIds: ids }));
387
+ }, []);
388
+ // ─────────────────────────────────────────────────────────────
389
+ // Animation operations
390
+ // ─────────────────────────────────────────────────────────────
391
+ const createAnimation = React.useCallback((name, frameIds) => {
392
+ const animation = gameAssetUtils.createSpriteAnimation(name, frameIds);
393
+ setProject(prev => ({
394
+ ...prev,
395
+ spriteSheets: prev.spriteSheets.map(s => s.id === editorState.activeSpriteSheetId
396
+ ? { ...s, animations: [...s.animations, animation] }
397
+ : s),
398
+ }));
399
+ pushHistory(`Create animation: ${name}`);
400
+ }, [editorState.activeSpriteSheetId, pushHistory]);
401
+ const removeAnimation = React.useCallback((id) => {
402
+ setProject(prev => ({
403
+ ...prev,
404
+ spriteSheets: prev.spriteSheets.map(s => ({
405
+ ...s,
406
+ animations: s.animations.filter(a => a.id !== id),
407
+ })),
408
+ }));
409
+ pushHistory('Remove animation');
410
+ }, [pushHistory]);
411
+ const updateAnimation = React.useCallback((id, updates) => {
412
+ setProject(prev => ({
413
+ ...prev,
414
+ spriteSheets: prev.spriteSheets.map(s => ({
415
+ ...s,
416
+ animations: s.animations.map(a => (a.id === id ? { ...a, ...updates } : a)),
417
+ })),
418
+ }));
419
+ }, []);
420
+ // ─────────────────────────────────────────────────────────────
421
+ // State machine operations
422
+ // ─────────────────────────────────────────────────────────────
423
+ const createStateMachine = React.useCallback((name) => {
424
+ const sm = {
425
+ id: gameAssetUtils.generateId('sm'),
426
+ name,
427
+ states: [],
428
+ transitions: [],
429
+ parameters: [],
430
+ entryStateId: '',
431
+ anyStateTransitions: [],
432
+ };
433
+ setProject(prev => ({ ...prev, stateMachines: [...prev.stateMachines, sm] }));
434
+ setEditorState(prev => ({ ...prev, activeStateMachineId: sm.id }));
435
+ pushHistory(`Create state machine: ${name}`);
436
+ }, [pushHistory]);
437
+ const removeStateMachine = React.useCallback((id) => {
438
+ setProject(prev => ({
439
+ ...prev,
440
+ stateMachines: prev.stateMachines.filter(sm => sm.id !== id),
441
+ }));
442
+ pushHistory('Remove state machine');
443
+ }, [pushHistory]);
444
+ const selectStateMachine = React.useCallback((id) => {
445
+ setEditorState(prev => ({ ...prev, activeStateMachineId: id, selectedStateId: null }));
446
+ }, []);
447
+ const addState = React.useCallback((name, animationId) => {
448
+ const state = {
449
+ id: gameAssetUtils.generateId('state'),
450
+ name,
451
+ animationId,
452
+ speed: 1,
453
+ loop: true,
454
+ position: { x: Math.random() * 400, y: Math.random() * 300 },
455
+ };
456
+ setProject(prev => ({
457
+ ...prev,
458
+ stateMachines: prev.stateMachines.map(sm => sm.id === editorState.activeStateMachineId
459
+ ? {
460
+ ...sm,
461
+ states: [...sm.states, state],
462
+ entryStateId: sm.entryStateId || state.id,
463
+ }
464
+ : sm),
465
+ }));
466
+ pushHistory(`Add state: ${name}`);
467
+ }, [editorState.activeStateMachineId, pushHistory]);
468
+ const removeState = React.useCallback((id) => {
469
+ setProject(prev => ({
470
+ ...prev,
471
+ stateMachines: prev.stateMachines.map(sm => ({
472
+ ...sm,
473
+ states: sm.states.filter(s => s.id !== id),
474
+ transitions: sm.transitions.filter(t => t.fromStateId !== id && t.toStateId !== id),
475
+ })),
476
+ }));
477
+ pushHistory('Remove state');
478
+ }, [pushHistory]);
479
+ const selectState = React.useCallback((id) => {
480
+ setEditorState(prev => ({ ...prev, selectedStateId: id }));
481
+ }, []);
482
+ const updateState = React.useCallback((id, updates) => {
483
+ setProject(prev => ({
484
+ ...prev,
485
+ stateMachines: prev.stateMachines.map(sm => ({
486
+ ...sm,
487
+ states: sm.states.map(s => (s.id === id ? { ...s, ...updates } : s)),
488
+ })),
489
+ }));
490
+ }, []);
491
+ const addTransition = React.useCallback((fromId, toId) => {
492
+ const transition = {
493
+ id: gameAssetUtils.generateId('trans'),
494
+ fromStateId: fromId,
495
+ toStateId: toId,
496
+ condition: { type: 'trigger', paramName: '' },
497
+ duration: 0.1,
498
+ priority: 0,
499
+ };
500
+ setProject(prev => ({
501
+ ...prev,
502
+ stateMachines: prev.stateMachines.map(sm => sm.id === editorState.activeStateMachineId
503
+ ? { ...sm, transitions: [...sm.transitions, transition] }
504
+ : sm),
505
+ }));
506
+ pushHistory('Add transition');
507
+ }, [editorState.activeStateMachineId, pushHistory]);
508
+ const removeTransition = React.useCallback((id) => {
509
+ setProject(prev => ({
510
+ ...prev,
511
+ stateMachines: prev.stateMachines.map(sm => ({
512
+ ...sm,
513
+ transitions: sm.transitions.filter(t => t.id !== id),
514
+ })),
515
+ }));
516
+ pushHistory('Remove transition');
517
+ }, [pushHistory]);
518
+ const addParameter = React.useCallback((name, type) => {
519
+ const param = {
520
+ id: gameAssetUtils.generateId('param'),
521
+ name,
522
+ type,
523
+ defaultValue: type === 'bool' ? false : 0,
524
+ };
525
+ setProject(prev => ({
526
+ ...prev,
527
+ stateMachines: prev.stateMachines.map(sm => sm.id === editorState.activeStateMachineId
528
+ ? { ...sm, parameters: [...sm.parameters, param] }
529
+ : sm),
530
+ }));
531
+ pushHistory(`Add parameter: ${name}`);
532
+ }, [editorState.activeStateMachineId, pushHistory]);
533
+ const removeParameter = React.useCallback((id) => {
534
+ setProject(prev => ({
535
+ ...prev,
536
+ stateMachines: prev.stateMachines.map(sm => ({
537
+ ...sm,
538
+ parameters: sm.parameters.filter(p => p.id !== id),
539
+ })),
540
+ }));
541
+ pushHistory('Remove parameter');
542
+ }, [pushHistory]);
543
+ // ─────────────────────────────────────────────────────────────
544
+ // Effects operations
545
+ // ─────────────────────────────────────────────────────────────
546
+ const addEffect = React.useCallback((type) => {
547
+ const defaultParams = {
548
+ 'outline': { color: '#000000', thickness: 1 },
549
+ 'shadow': { color: '#00000080', offsetX: 2, offsetY: 2, blur: 0 },
550
+ 'glow': { color: '#ffffff', size: 4, intensity: 0.8 },
551
+ 'palette-swap': { from: '#ffffff', to: '#ff0000' },
552
+ 'pixelate': { size: 4 },
553
+ 'blur': { radius: 2 },
554
+ 'brightness': { value: 0 },
555
+ 'contrast': { value: 0 },
556
+ 'saturation': { value: 0 },
557
+ 'hue-shift': { degrees: 0 },
558
+ 'invert': {},
559
+ 'tint': { color: '#ffffff', amount: 0.5 },
560
+ };
561
+ const effect = {
562
+ id: gameAssetUtils.generateId('effect'),
563
+ type,
564
+ enabled: true,
565
+ params: { ...defaultParams[type] },
566
+ };
567
+ setCurrentEffects(prev => [...prev, effect]);
568
+ }, []);
569
+ const removeEffect = React.useCallback((id) => {
570
+ setCurrentEffects(prev => prev.filter(e => e.id !== id));
571
+ }, []);
572
+ const updateEffect = React.useCallback((id, updates) => {
573
+ setCurrentEffects(prev => prev.map(e => (e.id === id ? { ...e, ...updates } : e)));
574
+ }, []);
575
+ const toggleEffect = React.useCallback((id) => {
576
+ setCurrentEffects(prev => prev.map(e => (e.id === id ? { ...e, enabled: !e.enabled } : e)));
577
+ }, []);
578
+ const saveEffectPreset = React.useCallback((name) => {
579
+ const preset = {
580
+ id: gameAssetUtils.generateId('preset'),
581
+ name,
582
+ effects: currentEffects.map(e => ({ ...e, id: gameAssetUtils.generateId('effect') })),
583
+ };
584
+ setProject(prev => ({ ...prev, effectPresets: [...prev.effectPresets, preset] }));
585
+ pushHistory(`Save effect preset: ${name}`);
586
+ }, [currentEffects, pushHistory]);
587
+ const loadEffectPreset = React.useCallback((id) => {
588
+ const preset = project.effectPresets.find(p => p.id === id);
589
+ if (preset) {
590
+ setCurrentEffects(preset.effects.map(e => ({ ...e, id: gameAssetUtils.generateId('effect') })));
591
+ }
592
+ }, [project.effectPresets]);
593
+ const previewEffects = React.useCallback((imageData) => {
594
+ return gameAssetUtils.applyEffects(imageData, currentEffects);
595
+ }, [currentEffects]);
596
+ // ─────────────────────────────────────────────────────────────
597
+ // Export operations
598
+ // ─────────────────────────────────────────────────────────────
599
+ const exportTileMap = React.useCallback((format) => {
600
+ var _a;
601
+ const map = project.tileMaps.find(m => m.id === editorState.activeTileMapId);
602
+ if (!map)
603
+ return;
604
+ if (format === 'json') {
605
+ gameAssetUtils.downloadJson(map, `${map.name}.json`);
606
+ }
607
+ else if (format === 'tiled-json') {
608
+ const tiledData = gameAssetUtils.exportToTiledJson(map, project.tileSets);
609
+ gameAssetUtils.downloadJson(tiledData, `${map.name}.tmj`);
610
+ }
611
+ else if (format === 'png') {
612
+ // Render map to canvas and export
613
+ const canvas = document.createElement('canvas');
614
+ canvas.width = map.width * map.tileWidth;
615
+ canvas.height = map.height * map.tileHeight;
616
+ const ctx = canvas.getContext('2d');
617
+ ctx.fillStyle = map.backgroundColor;
618
+ ctx.fillRect(0, 0, canvas.width, canvas.height);
619
+ for (const layer of map.layers.filter(l => l.visible)) {
620
+ ctx.globalAlpha = layer.opacity;
621
+ for (let y = 0; y < map.height; y++) {
622
+ for (let x = 0; x < map.width; x++) {
623
+ const tileId = (_a = layer.tiles[y]) === null || _a === void 0 ? void 0 : _a[x];
624
+ if (tileId) {
625
+ const tile = project.tileSets.find(t => t.id === tileId);
626
+ if (tile === null || tile === void 0 ? void 0 : tile.image) {
627
+ const tempCanvas = document.createElement('canvas');
628
+ tempCanvas.width = tile.image.width;
629
+ tempCanvas.height = tile.image.height;
630
+ tempCanvas.getContext('2d').putImageData(tile.image, 0, 0);
631
+ ctx.drawImage(tempCanvas, x * map.tileWidth, y * map.tileHeight);
632
+ }
633
+ }
634
+ }
635
+ }
636
+ }
637
+ gameAssetUtils.downloadPng(canvas, `${map.name}.png`);
638
+ }
639
+ onExport === null || onExport === void 0 ? void 0 : onExport(JSON.stringify(map), format);
640
+ }, [project, editorState.activeTileMapId, onExport]);
641
+ const exportSpriteSheet = React.useCallback((format) => {
642
+ const sheet = project.spriteSheets.find(s => s.id === editorState.activeSpriteSheetId);
643
+ if (!sheet)
644
+ return;
645
+ if (format === 'json') {
646
+ const exportData = {
647
+ name: sheet.name,
648
+ width: sheet.width,
649
+ height: sheet.height,
650
+ frames: sheet.frames,
651
+ animations: sheet.animations,
652
+ };
653
+ gameAssetUtils.downloadJson(exportData, `${sheet.name}.json`);
654
+ }
655
+ else if (format === 'atlas') {
656
+ // TexturePacker-compatible format
657
+ const framesObj = {};
658
+ for (const f of sheet.frames) {
659
+ framesObj[f.name] = {
660
+ frame: { x: f.x, y: f.y, w: f.width, h: f.height },
661
+ pivot: { x: f.pivotX, y: f.pivotY },
662
+ sourceSize: { w: f.width, h: f.height },
663
+ };
664
+ }
665
+ const atlas = {
666
+ frames: framesObj,
667
+ meta: {
668
+ app: 'GameAsset2dEditor',
669
+ version: '1.0',
670
+ image: `${sheet.name}.png`,
671
+ size: { w: sheet.width, h: sheet.height },
672
+ },
673
+ };
674
+ gameAssetUtils.downloadJson(atlas, `${sheet.name}.atlas.json`);
675
+ }
676
+ onExport === null || onExport === void 0 ? void 0 : onExport(JSON.stringify(sheet), format);
677
+ }, [project.spriteSheets, editorState.activeSpriteSheetId, onExport]);
678
+ const exportStateMachine = React.useCallback((format) => {
679
+ const sm = project.stateMachines.find(s => s.id === editorState.activeStateMachineId);
680
+ if (!sm)
681
+ return;
682
+ gameAssetUtils.downloadJson(sm, `${sm.name}.statemachine.json`);
683
+ onExport === null || onExport === void 0 ? void 0 : onExport(JSON.stringify(sm), format);
684
+ }, [project.stateMachines, editorState.activeStateMachineId, onExport]);
685
+ // ─────────────────────────────────────────────────────────────
686
+ // Return API
687
+ // ─────────────────────────────────────────────────────────────
688
+ return {
689
+ project,
690
+ setProject,
691
+ newProject,
692
+ saveProject,
693
+ loadProject,
694
+ editorState,
695
+ setMode,
696
+ setTileMapTool,
697
+ setSpriteSheetTool,
698
+ setZoom,
699
+ setPan,
700
+ toggleGrid,
701
+ toggleCollision,
702
+ toggleSnap,
703
+ addTile,
704
+ removeTile,
705
+ selectTile,
706
+ importTileSet,
707
+ createTileMap,
708
+ removeTileMap,
709
+ selectTileMap,
710
+ setTile,
711
+ fillTiles,
712
+ addLayer,
713
+ removeLayer,
714
+ selectLayer,
715
+ toggleLayerVisibility,
716
+ setLayerOpacity,
717
+ moveLayer,
718
+ importSpriteSheet,
719
+ removeSpriteSheet,
720
+ selectSpriteSheet,
721
+ autoSlice,
722
+ detectSprites,
723
+ addFrame,
724
+ updateFrame,
725
+ removeFrame,
726
+ selectFrames,
727
+ createAnimation,
728
+ removeAnimation,
729
+ updateAnimation,
730
+ createStateMachine,
731
+ removeStateMachine,
732
+ selectStateMachine,
733
+ addState,
734
+ removeState,
735
+ selectState,
736
+ updateState,
737
+ addTransition,
738
+ removeTransition,
739
+ addParameter,
740
+ removeParameter,
741
+ addEffect,
742
+ removeEffect,
743
+ updateEffect,
744
+ toggleEffect,
745
+ saveEffectPreset,
746
+ loadEffectPreset,
747
+ previewEffects,
748
+ undo,
749
+ redo,
750
+ canUndo: historyIndex > 0,
751
+ canRedo: historyIndex < history.length - 1,
752
+ exportTileMap,
753
+ exportSpriteSheet,
754
+ exportStateMachine,
755
+ canvasRef,
756
+ fileInputRef,
757
+ };
758
+ };
759
+
760
+ exports.useGameAssetEditor = useGameAssetEditor;
761
+ //# sourceMappingURL=useGameAssetEditor.js.map