@nice2dev/ui-graphics 1.3.15 → 1.3.17

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 (294) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/cjs/animation/AnimatedPerson.js +470 -143
  3. package/dist/cjs/animation/AnimationEditor.js +289 -101
  4. package/dist/cjs/animation/Audience.js +83 -61
  5. package/dist/cjs/animation/BodyRenderer.js +69 -28
  6. package/dist/cjs/animation/animationHelper.js +281 -288
  7. package/dist/cjs/animation/characterTypes.js +200 -203
  8. package/dist/cjs/animation/choreoDSL.js +205 -219
  9. package/dist/cjs/animation/choreography.js +4 -32
  10. package/dist/cjs/animation/karaokeIntegration.js +68 -77
  11. package/dist/cjs/animation/lottieExport.js +108 -114
  12. package/dist/cjs/animation/motionPath.js +225 -248
  13. package/dist/cjs/animation/physics.js +227 -254
  14. package/dist/cjs/animation/rig/RigPlayer.js +53 -56
  15. package/dist/cjs/animation/rig/RiggedBody.js +71 -26
  16. package/dist/cjs/animation/rig/choreoRigBridge.js +72 -77
  17. package/dist/cjs/animation/rig/ik.js +13 -18
  18. package/dist/cjs/animation/rig/poseOps.js +34 -41
  19. package/dist/cjs/animation/rig/presets.js +64 -72
  20. package/dist/cjs/animation/rig/rigMath.js +25 -32
  21. package/dist/cjs/animation/rig/rigTypes.js +59 -63
  22. package/dist/cjs/animation/shapes/arms.js +31 -13
  23. package/dist/cjs/animation/shapes/eyes.js +129 -47
  24. package/dist/cjs/animation/shapes/hair.js +72 -45
  25. package/dist/cjs/animation/shapes/heads.js +131 -57
  26. package/dist/cjs/animation/shapes/headwear.js +47 -38
  27. package/dist/cjs/animation/shapes/legs.js +31 -13
  28. package/dist/cjs/animation/shapes/mouths.js +120 -44
  29. package/dist/cjs/animation/shapes/noses.js +80 -25
  30. package/dist/cjs/animation/shapes/outfits.js +101 -39
  31. package/dist/cjs/animation/shapes/torsos.js +15 -11
  32. package/dist/cjs/animation/spineExport.js +103 -121
  33. package/dist/cjs/core/LocalUI.js +108 -43
  34. package/dist/cjs/core/NiceBrushEngine.js +758 -552
  35. package/dist/cjs/core/collaboration.js +249 -251
  36. package/dist/cjs/core/colorBlindness.js +100 -115
  37. package/dist/cjs/core/dragDrop.js +155 -158
  38. package/dist/cjs/core/editorAsk.js +51 -41
  39. package/dist/cjs/core/fixes.js +140 -171
  40. package/dist/cjs/core/gridGuides.js +166 -201
  41. package/dist/cjs/core/historyVisual.js +156 -135
  42. package/dist/cjs/core/i18n.js +13 -14
  43. package/dist/cjs/core/integrations.js +238 -249
  44. package/dist/cjs/core/minimap.js +149 -151
  45. package/dist/cjs/core/plugins.js +98 -113
  46. package/dist/cjs/core/rtl.js +71 -83
  47. package/dist/cjs/core/shortcuts.js +196 -225
  48. package/dist/cjs/core/theme.js +142 -149
  49. package/dist/cjs/core/yjsCollaboration.js +232 -293
  50. package/dist/cjs/design/design-tools.js +12 -22
  51. package/dist/cjs/font/NiceFontEditor.js +877 -316
  52. package/dist/cjs/font/fontFormatUtils.js +388 -448
  53. package/dist/cjs/game/GameAsset2dEditor.js +1201 -392
  54. package/dist/cjs/game/GameAsset2dEditor.module.css.js +146 -5
  55. package/dist/cjs/game/gameAssetTypes.js +7 -16
  56. package/dist/cjs/game/gameAssetUtils.js +390 -413
  57. package/dist/cjs/game/useGameAssetEditor.js +820 -763
  58. package/dist/cjs/index.js +81 -84
  59. package/dist/cjs/nice2dev-ui-graphics.css +1 -1
  60. package/dist/cjs/node_modules/lib0/array.js +8 -70
  61. package/dist/cjs/node_modules/lib0/binary.js +3 -20
  62. package/dist/cjs/node_modules/lib0/broadcastchannel.js +24 -86
  63. package/dist/cjs/node_modules/lib0/buffer.js +15 -82
  64. package/dist/cjs/node_modules/lib0/conditions.js +3 -16
  65. package/dist/cjs/node_modules/lib0/decoding.js +108 -287
  66. package/dist/cjs/node_modules/lib0/dom.js +14 -44
  67. package/dist/cjs/node_modules/lib0/encoding.js +68 -418
  68. package/dist/cjs/node_modules/lib0/environment.js +26 -92
  69. package/dist/cjs/node_modules/lib0/error.js +5 -29
  70. package/dist/cjs/node_modules/lib0/function.js +27 -66
  71. package/dist/cjs/node_modules/lib0/iterator.js +8 -33
  72. package/dist/cjs/node_modules/lib0/logging.common.js +12 -22
  73. package/dist/cjs/node_modules/lib0/logging.js +32 -71
  74. package/dist/cjs/node_modules/lib0/map.js +16 -86
  75. package/dist/cjs/node_modules/lib0/math.js +3 -32
  76. package/dist/cjs/node_modules/lib0/number.js +4 -15
  77. package/dist/cjs/node_modules/lib0/object.js +14 -88
  78. package/dist/cjs/node_modules/lib0/observable.js +38 -78
  79. package/dist/cjs/node_modules/lib0/pair.js +3 -20
  80. package/dist/cjs/node_modules/lib0/prng.js +8 -77
  81. package/dist/cjs/node_modules/lib0/promise.js +6 -30
  82. package/dist/cjs/node_modules/lib0/random.js +8 -23
  83. package/dist/cjs/node_modules/lib0/schema.js +313 -687
  84. package/dist/cjs/node_modules/lib0/set.js +3 -10
  85. package/dist/cjs/node_modules/lib0/storage.js +20 -55
  86. package/dist/cjs/node_modules/lib0/string.js +17 -72
  87. package/dist/cjs/node_modules/lib0/symbol.js +2 -12
  88. package/dist/cjs/node_modules/lib0/time.js +2 -15
  89. package/dist/cjs/node_modules/lib0/trait/equality.js +3 -28
  90. package/dist/cjs/node_modules/lib0/url.js +4 -18
  91. package/dist/cjs/node_modules/lib0/webcrypto.js +2 -5
  92. package/dist/cjs/node_modules/y-protocols/auth.js +5 -19
  93. package/dist/cjs/node_modules/y-protocols/awareness.js +53 -116
  94. package/dist/cjs/node_modules/y-protocols/sync.js +16 -103
  95. package/dist/cjs/node_modules/y-websocket/src/y-websocket.js +77 -219
  96. package/dist/cjs/node_modules/yjs/dist/yjs.js +2128 -4868
  97. package/dist/cjs/photo/FilterThumb.js +37 -25
  98. package/dist/cjs/photo/NiceAITools.js +679 -467
  99. package/dist/cjs/photo/PhotoEditor.js +34 -20
  100. package/dist/cjs/photo/PhotoEditor.module.css.js +296 -5
  101. package/dist/cjs/photo/PhotoEditorCanvas.js +250 -91
  102. package/dist/cjs/photo/PhotoEditorLeftPanel.js +1086 -224
  103. package/dist/cjs/photo/PhotoEditorToolbar.js +135 -19
  104. package/dist/cjs/photo/photoEditorActions.js +89 -72
  105. package/dist/cjs/photo/photoEditorTypes.js +29 -32
  106. package/dist/cjs/photo/photoFilters.js +959 -985
  107. package/dist/cjs/photo/photoOverlays.js +899 -945
  108. package/dist/cjs/photo/photoSelection.js +427 -499
  109. package/dist/cjs/photo/usePhotoEditor.js +739 -741
  110. package/dist/cjs/pixel/HSVPicker.js +191 -175
  111. package/dist/cjs/pixel/PixelEditor.js +159 -48
  112. package/dist/cjs/pixel/PixelEditor.module.css.js +209 -5
  113. package/dist/cjs/pixel/PixelEditorCanvas.js +29 -16
  114. package/dist/cjs/pixel/PixelEditorMenuBar.js +160 -162
  115. package/dist/cjs/pixel/PixelEditorRightPanel.js +377 -45
  116. package/dist/cjs/pixel/PixelEditorStatusBar.js +47 -20
  117. package/dist/cjs/pixel/PixelEditorTimeline.js +106 -23
  118. package/dist/cjs/pixel/PixelEditorToolbar.js +99 -21
  119. package/dist/cjs/pixel/SpriteGeneratorPanel.js +483 -303
  120. package/dist/cjs/pixel/animalGeneratorPresets.js +776 -601
  121. package/dist/cjs/pixel/asepriteFormat.js +511 -560
  122. package/dist/cjs/pixel/buildingGeneratorPresets.js +693 -520
  123. package/dist/cjs/pixel/characterGeneratorPresets.js +644 -544
  124. package/dist/cjs/pixel/pixel-pro.js +52 -63
  125. package/dist/cjs/pixel/pixelEditorExports.js +388 -428
  126. package/dist/cjs/pixel/pixelEditorTypes.js +91 -108
  127. package/dist/cjs/pixel/pixelEditorUtils.js +519 -561
  128. package/dist/cjs/pixel/spriteGeneratorCore.js +206 -257
  129. package/dist/cjs/pixel/usePixelEditor.js +1321 -1343
  130. package/dist/cjs/texture/Nice3DTexturePainter.js +707 -440
  131. package/dist/cjs/ui/NiceUIDesigner.js +954 -527
  132. package/dist/cjs/vector/NiceSvgToCode.js +586 -446
  133. package/dist/cjs/vector/VectorEditor.js +290 -117
  134. package/dist/cjs/vector/VectorEditor.module.css.js +86 -5
  135. package/dist/cjs/vector/VectorEditorMenuBar.js +333 -275
  136. package/dist/cjs/vector/VectorEditorRightPanel.js +1094 -371
  137. package/dist/cjs/vector/VectorEditorShapeRenderer.js +198 -60
  138. package/dist/cjs/vector/VectorEditorStatusBar.js +39 -13
  139. package/dist/cjs/vector/useVectorEditor.js +848 -889
  140. package/dist/cjs/vector/vectorAnimation.js +110 -137
  141. package/dist/cjs/vector/vectorBooleanOps.js +398 -485
  142. package/dist/cjs/vector/vectorEditorExport.js +201 -203
  143. package/dist/cjs/vector/vectorEditorImport.js +173 -189
  144. package/dist/cjs/vector/vectorEditorTypes.js +42 -49
  145. package/dist/cjs/vector/vectorGradients.js +151 -174
  146. package/dist/cjs/vector/vectorIconExport.js +52 -59
  147. package/dist/cjs/vector/vectorIconImport.js +169 -219
  148. package/dist/esm/animation/AnimatedPerson.js +470 -141
  149. package/dist/esm/animation/AnimationEditor.js +290 -100
  150. package/dist/esm/animation/Audience.js +83 -59
  151. package/dist/esm/animation/BodyRenderer.js +71 -25
  152. package/dist/esm/animation/animationHelper.js +284 -287
  153. package/dist/esm/animation/characterTypes.js +204 -202
  154. package/dist/esm/animation/choreoDSL.js +212 -218
  155. package/dist/esm/animation/choreography.js +8 -31
  156. package/dist/esm/animation/karaokeIntegration.js +74 -76
  157. package/dist/esm/animation/lottieExport.js +112 -113
  158. package/dist/esm/animation/motionPath.js +235 -247
  159. package/dist/esm/animation/physics.js +235 -253
  160. package/dist/esm/animation/rig/RigPlayer.js +53 -54
  161. package/dist/esm/animation/rig/RiggedBody.js +71 -24
  162. package/dist/esm/animation/rig/choreoRigBridge.js +74 -76
  163. package/dist/esm/animation/rig/ik.js +14 -17
  164. package/dist/esm/animation/rig/poseOps.js +37 -40
  165. package/dist/esm/animation/rig/presets.js +70 -71
  166. package/dist/esm/animation/rig/rigMath.js +28 -31
  167. package/dist/esm/animation/rig/rigTypes.js +62 -62
  168. package/dist/esm/animation/shapes/arms.js +32 -12
  169. package/dist/esm/animation/shapes/eyes.js +135 -46
  170. package/dist/esm/animation/shapes/hair.js +80 -44
  171. package/dist/esm/animation/shapes/heads.js +140 -56
  172. package/dist/esm/animation/shapes/headwear.js +54 -37
  173. package/dist/esm/animation/shapes/legs.js +32 -12
  174. package/dist/esm/animation/shapes/mouths.js +127 -43
  175. package/dist/esm/animation/shapes/noses.js +87 -24
  176. package/dist/esm/animation/shapes/outfits.js +106 -38
  177. package/dist/esm/animation/shapes/torsos.js +16 -10
  178. package/dist/esm/animation/spineExport.js +106 -120
  179. package/dist/esm/core/LocalUI.js +111 -42
  180. package/dist/esm/core/NiceBrushEngine.js +761 -551
  181. package/dist/esm/core/collaboration.js +255 -250
  182. package/dist/esm/core/colorBlindness.js +106 -114
  183. package/dist/esm/core/dragDrop.js +157 -157
  184. package/dist/esm/core/editorAsk.js +53 -40
  185. package/dist/esm/core/fixes.js +145 -170
  186. package/dist/esm/core/gridGuides.js +178 -200
  187. package/dist/esm/core/historyVisual.js +158 -134
  188. package/dist/esm/core/i18n.js +15 -13
  189. package/dist/esm/core/integrations.js +244 -248
  190. package/dist/esm/core/minimap.js +151 -150
  191. package/dist/esm/core/plugins.js +102 -112
  192. package/dist/esm/core/rtl.js +77 -82
  193. package/dist/esm/core/shortcuts.js +200 -224
  194. package/dist/esm/core/theme.js +150 -148
  195. package/dist/esm/core/yjsCollaboration.js +240 -292
  196. package/dist/esm/design/design-tools.js +13 -21
  197. package/dist/esm/font/NiceFontEditor.js +880 -315
  198. package/dist/esm/font/fontFormatUtils.js +394 -447
  199. package/dist/esm/game/GameAsset2dEditor.js +1202 -391
  200. package/dist/esm/game/GameAsset2dEditor.module.css.js +146 -3
  201. package/dist/esm/game/gameAssetTypes.js +8 -15
  202. package/dist/esm/game/gameAssetUtils.js +408 -412
  203. package/dist/esm/game/useGameAssetEditor.js +821 -762
  204. package/dist/esm/index.js +332 -69
  205. package/dist/esm/nice2dev-ui-graphics.css +1 -1
  206. package/dist/esm/node_modules/lib0/array.js +15 -69
  207. package/dist/esm/node_modules/lib0/binary.js +14 -19
  208. package/dist/esm/node_modules/lib0/broadcastchannel.js +27 -85
  209. package/dist/esm/node_modules/lib0/buffer.js +20 -80
  210. package/dist/esm/node_modules/lib0/conditions.js +4 -15
  211. package/dist/esm/node_modules/lib0/decoding.js +128 -286
  212. package/dist/esm/node_modules/lib0/dom.js +20 -43
  213. package/dist/esm/node_modules/lib0/encoding.js +90 -415
  214. package/dist/esm/node_modules/lib0/environment.js +33 -91
  215. package/dist/esm/node_modules/lib0/error.js +8 -28
  216. package/dist/esm/node_modules/lib0/function.js +31 -65
  217. package/dist/esm/node_modules/lib0/iterator.js +11 -32
  218. package/dist/esm/node_modules/lib0/logging.common.js +22 -21
  219. package/dist/esm/node_modules/lib0/logging.js +44 -70
  220. package/dist/esm/node_modules/lib0/map.js +21 -85
  221. package/dist/esm/node_modules/lib0/math.js +9 -31
  222. package/dist/esm/node_modules/lib0/number.js +7 -14
  223. package/dist/esm/node_modules/lib0/object.js +26 -87
  224. package/dist/esm/node_modules/lib0/observable.js +40 -77
  225. package/dist/esm/node_modules/lib0/pair.js +5 -19
  226. package/dist/esm/node_modules/lib0/prng.js +15 -76
  227. package/dist/esm/node_modules/lib0/promise.js +7 -29
  228. package/dist/esm/node_modules/lib0/random.js +10 -22
  229. package/dist/esm/node_modules/lib0/schema.js +367 -686
  230. package/dist/esm/node_modules/lib0/set.js +4 -9
  231. package/dist/esm/node_modules/lib0/storage.js +23 -54
  232. package/dist/esm/node_modules/lib0/string.js +26 -71
  233. package/dist/esm/node_modules/lib0/symbol.js +3 -11
  234. package/dist/esm/node_modules/lib0/time.js +3 -14
  235. package/dist/esm/node_modules/lib0/trait/equality.js +5 -27
  236. package/dist/esm/node_modules/lib0/url.js +5 -17
  237. package/dist/esm/node_modules/lib0/webcrypto.js +3 -4
  238. package/dist/esm/node_modules/y-protocols/auth.js +7 -18
  239. package/dist/esm/node_modules/y-protocols/awareness.js +58 -115
  240. package/dist/esm/node_modules/y-protocols/sync.js +26 -102
  241. package/dist/esm/node_modules/y-websocket/src/y-websocket.js +82 -218
  242. package/dist/esm/node_modules/yjs/dist/yjs.js +2263 -4899
  243. package/dist/esm/photo/FilterThumb.js +37 -23
  244. package/dist/esm/photo/NiceAITools.js +685 -466
  245. package/dist/esm/photo/PhotoEditor.js +34 -18
  246. package/dist/esm/photo/PhotoEditor.module.css.js +296 -3
  247. package/dist/esm/photo/PhotoEditorCanvas.js +250 -89
  248. package/dist/esm/photo/PhotoEditorLeftPanel.js +1086 -222
  249. package/dist/esm/photo/PhotoEditorToolbar.js +135 -17
  250. package/dist/esm/photo/photoEditorActions.js +93 -71
  251. package/dist/esm/photo/photoEditorTypes.js +32 -31
  252. package/dist/esm/photo/photoFilters.js +967 -984
  253. package/dist/esm/photo/photoOverlays.js +913 -944
  254. package/dist/esm/photo/photoSelection.js +438 -498
  255. package/dist/esm/photo/usePhotoEditor.js +740 -740
  256. package/dist/esm/pixel/HSVPicker.js +192 -174
  257. package/dist/esm/pixel/PixelEditor.js +160 -47
  258. package/dist/esm/pixel/PixelEditor.module.css.js +209 -3
  259. package/dist/esm/pixel/PixelEditorCanvas.js +29 -14
  260. package/dist/esm/pixel/PixelEditorMenuBar.js +160 -160
  261. package/dist/esm/pixel/PixelEditorRightPanel.js +377 -43
  262. package/dist/esm/pixel/PixelEditorStatusBar.js +47 -18
  263. package/dist/esm/pixel/PixelEditorTimeline.js +106 -21
  264. package/dist/esm/pixel/PixelEditorToolbar.js +99 -19
  265. package/dist/esm/pixel/SpriteGeneratorPanel.js +483 -301
  266. package/dist/esm/pixel/animalGeneratorPresets.js +782 -600
  267. package/dist/esm/pixel/asepriteFormat.js +517 -559
  268. package/dist/esm/pixel/buildingGeneratorPresets.js +699 -519
  269. package/dist/esm/pixel/characterGeneratorPresets.js +650 -543
  270. package/dist/esm/pixel/pixel-pro.js +53 -62
  271. package/dist/esm/pixel/pixelEditorExports.js +397 -427
  272. package/dist/esm/pixel/pixelEditorTypes.js +103 -107
  273. package/dist/esm/pixel/pixelEditorUtils.js +551 -560
  274. package/dist/esm/pixel/spriteGeneratorCore.js +223 -256
  275. package/dist/esm/pixel/usePixelEditor.js +1322 -1342
  276. package/dist/esm/texture/Nice3DTexturePainter.js +709 -439
  277. package/dist/esm/ui/NiceUIDesigner.js +957 -526
  278. package/dist/esm/vector/NiceSvgToCode.js +589 -445
  279. package/dist/esm/vector/VectorEditor.js +291 -116
  280. package/dist/esm/vector/VectorEditor.module.css.js +86 -3
  281. package/dist/esm/vector/VectorEditorMenuBar.js +333 -273
  282. package/dist/esm/vector/VectorEditorRightPanel.js +1094 -369
  283. package/dist/esm/vector/VectorEditorShapeRenderer.js +199 -59
  284. package/dist/esm/vector/VectorEditorStatusBar.js +39 -11
  285. package/dist/esm/vector/useVectorEditor.js +849 -888
  286. package/dist/esm/vector/vectorAnimation.js +115 -136
  287. package/dist/esm/vector/vectorBooleanOps.js +401 -484
  288. package/dist/esm/vector/vectorEditorExport.js +207 -202
  289. package/dist/esm/vector/vectorEditorImport.js +174 -188
  290. package/dist/esm/vector/vectorEditorTypes.js +50 -48
  291. package/dist/esm/vector/vectorGradients.js +158 -173
  292. package/dist/esm/vector/vectorIconExport.js +53 -58
  293. package/dist/esm/vector/vectorIconImport.js +171 -218
  294. package/package.json +9 -15
@@ -1,321 +1,501 @@
1
- 'use strict';
2
-
3
- var jsxRuntime = require('react/jsx-runtime');
4
- var ui = require('@nice2dev/ui');
5
- var uiCore = require('@nice2dev/ui-core');
6
- var React = require('react');
7
- var i18n = require('../core/i18n.js');
8
- var animalGeneratorPresets = require('./animalGeneratorPresets.js');
9
- var buildingGeneratorPresets = require('./buildingGeneratorPresets.js');
10
- var characterGeneratorPresets = require('./characterGeneratorPresets.js');
11
- var PixelEditor_module = require('./PixelEditor.module.css.js');
12
- var spriteGeneratorCore = require('./spriteGeneratorCore.js');
13
-
14
- /* ════════════════════════════════════════════════════════════════
15
- INITIALIZATION
16
- ════════════════════════════════════════════════════════════════ */
1
+ "use strict";
2
+ Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
3
+ const jsxRuntime = require("react/jsx-runtime");
4
+ const ui = require("@nice2dev/ui");
5
+ const uiCore = require("@nice2dev/ui-core");
6
+ const React = require("react");
7
+ const i18n = require("../core/i18n.js");
8
+ const animalGeneratorPresets = require("./animalGeneratorPresets.js");
9
+ const buildingGeneratorPresets = require("./buildingGeneratorPresets.js");
10
+ const characterGeneratorPresets = require("./characterGeneratorPresets.js");
11
+ const PixelEditor_module = require("./PixelEditor.module.css.js");
12
+ const spriteGeneratorCore = require("./spriteGeneratorCore.js");
17
13
  let _initialized = false;
18
14
  function ensureInitialized() {
19
- if (_initialized) {
20
- return;
21
- }
22
- _initialized = true;
23
- characterGeneratorPresets.initCharacterParts();
24
- buildingGeneratorPresets.initBuildingParts();
25
- animalGeneratorPresets.initAnimalParts();
15
+ if (_initialized) {
16
+ return;
17
+ }
18
+ _initialized = true;
19
+ characterGeneratorPresets.initCharacterParts();
20
+ buildingGeneratorPresets.initBuildingParts();
21
+ animalGeneratorPresets.initAnimalParts();
26
22
  }
27
- /* ════════════════════════════════════════════════════════════════
28
- HELPERS
29
- ════════════════════════════════════════════════════════════════ */
30
23
  function palettesToOptions(palettes) {
31
- return Object.entries(palettes).map(([id, colors]) => ({
32
- id,
33
- name: id.replace(/_/g, ' ').replace(/\b\w/g, (c) => c.toUpperCase()),
34
- colors,
35
- }));
24
+ return Object.entries(palettes).map(([id, colors]) => ({
25
+ id,
26
+ name: id.replace(/_/g, " ").replace(/\b\w/g, (c) => c.toUpperCase()),
27
+ colors
28
+ }));
36
29
  }
37
30
  const CHAR_CATEGORIES = [
38
- 'head',
39
- 'hair',
40
- 'face',
41
- 'torso',
42
- 'arm',
43
- 'leg',
44
- 'hat',
45
- 'helmet',
46
- 'armor',
47
- 'cape',
48
- 'weapon',
49
- 'shield',
31
+ "head",
32
+ "hair",
33
+ "face",
34
+ "torso",
35
+ "arm",
36
+ "leg",
37
+ "hat",
38
+ "helmet",
39
+ "armor",
40
+ "cape",
41
+ "weapon",
42
+ "shield"
50
43
  ];
51
44
  const BUILDING_CATEGORIES = [
52
- 'foundation',
53
- 'wall',
54
- 'floor',
55
- 'roof',
56
- 'door',
57
- 'window',
58
- 'chimney',
59
- 'decoration',
45
+ "foundation",
46
+ "wall",
47
+ "floor",
48
+ "roof",
49
+ "door",
50
+ "window",
51
+ "chimney",
52
+ "decoration"
60
53
  ];
61
54
  const ANIMAL_CATEGORIES = [
62
- 'animalHead',
63
- 'animalBody',
64
- 'animalLeg',
65
- 'animalTail',
66
- 'animalWing',
67
- 'animalMane',
55
+ "animalHead",
56
+ "animalBody",
57
+ "animalLeg",
58
+ "animalTail",
59
+ "animalWing",
60
+ "animalMane"
68
61
  ];
69
- const NiceSpriteGeneratorPanel = ({ onSendToCanvas, onClose, mode,
70
- // presets and onGenerate are exposed for forward-compat; not currently consumed.
71
- }) => {
72
- const { t } = i18n.useNiceTranslation();
73
- ensureInitialized();
74
- /* ── State ── */
75
- const [tab, setTab] = React.useState(mode !== null && mode !== void 0 ? mode : 'character');
76
- const [selectedPresetIdx, setSelectedPresetIdx] = React.useState(0);
77
- const [selectedParts, setSelectedParts] = React.useState([]);
78
- const [canvasW, setCanvasW] = React.useState(32);
79
- const [canvasH, setCanvasH] = React.useState(32);
80
- const [direction, setDirection] = React.useState('S');
81
- const [projection, setProjection] = React.useState('topDown');
82
- const [generate8Dir, setGenerate8Dir] = React.useState(false);
83
- // Color overrides
84
- const [skinPalette, setSkinPalette] = React.useState('light');
85
- const [hairPalette, setHairPalette] = React.useState('brown');
86
- const [clothPalette, setClothPalette] = React.useState('leather');
87
- const [furPalette, setFurPalette] = React.useState('orange');
88
- const [wallPalette, setWallPalette] = React.useState('grey_stone');
89
- const [roofPalette, setRoofPalette] = React.useState('terracotta');
90
- const previewRef = React.useRef(null);
91
- const partsMapRef = React.useRef(new Map());
92
- /* ── Build parts map ── */
93
- React.useEffect(() => {
94
- const map = new Map();
95
- for (const p of spriteGeneratorCore.getAllParts()) {
96
- map.set(p.id, p);
97
- }
98
- partsMapRef.current = map;
99
- }, []);
100
- /* ── Get presets for current tab ── */
101
- const presets = React.useMemo(() => {
102
- switch (tab) {
103
- case 'character':
104
- return characterGeneratorPresets.CHARACTER_PRESETS;
105
- case 'building':
106
- return buildingGeneratorPresets.BUILDING_PRESETS;
107
- case 'animal':
108
- return animalGeneratorPresets.ANIMAL_PRESETS;
109
- }
110
- }, [tab]);
111
- /* ── Apply preset ── */
112
- const applyPreset = React.useCallback((presetIdx) => {
113
- setSelectedPresetIdx(presetIdx);
114
- const preset = presets[presetIdx];
115
- if (!preset) {
116
- return;
117
- }
118
- if (tab === 'building') {
119
- const bp = preset;
120
- const assembly = buildingGeneratorPresets.assembleBuildingFromConfig(bp.config);
121
- setSelectedParts(assembly.parts);
122
- setCanvasW(assembly.canvasWidth);
123
- setCanvasH(assembly.canvasHeight);
124
- }
125
- else {
126
- const cp = preset;
127
- const assembly = cp.assembly;
128
- setSelectedParts([...assembly.parts]);
129
- setCanvasW(assembly.canvasWidth);
130
- setCanvasH(assembly.canvasHeight);
131
- }
132
- }, [tab, presets]);
133
- /* ── Initial preset ── */
134
- React.useEffect(() => {
135
- applyPreset(0);
136
- }, [tab, applyPreset]);
137
- /* ── Build current assembly ── */
138
- const currentAssembly = React.useMemo(() => {
139
- var _a;
140
- return ({
141
- id: `gen_${tab}_${selectedPresetIdx}`,
142
- name: ((_a = presets[selectedPresetIdx]) === null || _a === void 0 ? void 0 : _a.name) || 'Custom',
143
- parts: selectedParts,
144
- canvasWidth: canvasW,
145
- canvasHeight: canvasH,
146
- projection,
147
- });
148
- }, [tab, selectedPresetIdx, selectedParts, canvasW, canvasH, projection, presets]);
149
- /* ── Render preview ── */
150
- React.useEffect(() => {
151
- const canvas = previewRef.current;
152
- if (!canvas) {
153
- return;
154
- }
155
- const img = spriteGeneratorCore.assembleSprite(currentAssembly, partsMapRef.current, direction);
156
- let finalImg = img;
157
- if (projection === 'iso25d') {
158
- finalImg = spriteGeneratorCore.applyIsometricProjection(img);
159
- }
160
- canvas.width = finalImg.width;
161
- canvas.height = finalImg.height;
162
- const ctx = canvas.getContext('2d');
163
- if (ctx) {
164
- ctx.clearRect(0, 0, canvas.width, canvas.height);
165
- ctx.putImageData(finalImg, 0, 0);
166
- }
167
- }, [currentAssembly, direction, projection]);
168
- /* ── Toggle part visibility ── */
169
- const togglePart = React.useCallback((partId) => {
170
- setSelectedParts((prev) => prev.map((p) => { var _a; return (p.partId === partId ? { ...p, visible: !((_a = p.visible) !== null && _a !== void 0 ? _a : true) } : p); }));
171
- }, []);
172
- /* ── Add part ── */
173
- const addPart = React.useCallback((partId) => {
174
- if (selectedParts.some((p) => p.partId === partId)) {
175
- return;
176
- }
177
- const part = spriteGeneratorCore.getPart(partId);
178
- if (!part) {
179
- return;
62
+ const NiceSpriteGeneratorPanel = ({
63
+ onSendToCanvas,
64
+ onClose,
65
+ mode
66
+ // presets and onGenerate are exposed for forward-compat; not currently consumed.
67
+ }) => {
68
+ const { t } = i18n.useNiceTranslation();
69
+ ensureInitialized();
70
+ const [tab, setTab] = React.useState(mode ?? "character");
71
+ const [selectedPresetIdx, setSelectedPresetIdx] = React.useState(0);
72
+ const [selectedParts, setSelectedParts] = React.useState([]);
73
+ const [canvasW, setCanvasW] = React.useState(32);
74
+ const [canvasH, setCanvasH] = React.useState(32);
75
+ const [direction, setDirection] = React.useState("S");
76
+ const [projection, setProjection] = React.useState("topDown");
77
+ const [generate8Dir, setGenerate8Dir] = React.useState(false);
78
+ const [skinPalette, setSkinPalette] = React.useState("light");
79
+ const [hairPalette, setHairPalette] = React.useState("brown");
80
+ const [clothPalette, setClothPalette] = React.useState("leather");
81
+ const [furPalette, setFurPalette] = React.useState("orange");
82
+ const [wallPalette, setWallPalette] = React.useState("grey_stone");
83
+ const [roofPalette, setRoofPalette] = React.useState("terracotta");
84
+ const previewRef = React.useRef(null);
85
+ const partsMapRef = React.useRef(/* @__PURE__ */ new Map());
86
+ React.useEffect(() => {
87
+ const map = /* @__PURE__ */ new Map();
88
+ for (const p of spriteGeneratorCore.getAllParts()) {
89
+ map.set(p.id, p);
90
+ }
91
+ partsMapRef.current = map;
92
+ }, []);
93
+ const presets = React.useMemo(() => {
94
+ switch (tab) {
95
+ case "character":
96
+ return characterGeneratorPresets.CHARACTER_PRESETS;
97
+ case "building":
98
+ return buildingGeneratorPresets.BUILDING_PRESETS;
99
+ case "animal":
100
+ return animalGeneratorPresets.ANIMAL_PRESETS;
101
+ }
102
+ }, [tab]);
103
+ const applyPreset = React.useCallback(
104
+ (presetIdx) => {
105
+ setSelectedPresetIdx(presetIdx);
106
+ const preset = presets[presetIdx];
107
+ if (!preset) {
108
+ return;
109
+ }
110
+ if (tab === "building") {
111
+ const bp = preset;
112
+ const assembly = buildingGeneratorPresets.assembleBuildingFromConfig(bp.config);
113
+ setSelectedParts(assembly.parts);
114
+ setCanvasW(assembly.canvasWidth);
115
+ setCanvasH(assembly.canvasHeight);
116
+ } else {
117
+ const cp = preset;
118
+ const assembly = cp.assembly;
119
+ setSelectedParts([...assembly.parts]);
120
+ setCanvasW(assembly.canvasWidth);
121
+ setCanvasH(assembly.canvasHeight);
122
+ }
123
+ },
124
+ [tab, presets]
125
+ );
126
+ React.useEffect(() => {
127
+ applyPreset(0);
128
+ }, [tab, applyPreset]);
129
+ const currentAssembly = React.useMemo(
130
+ () => ({
131
+ id: `gen_${tab}_${selectedPresetIdx}`,
132
+ name: presets[selectedPresetIdx]?.name || "Custom",
133
+ parts: selectedParts,
134
+ canvasWidth: canvasW,
135
+ canvasHeight: canvasH,
136
+ projection
137
+ }),
138
+ [tab, selectedPresetIdx, selectedParts, canvasW, canvasH, projection, presets]
139
+ );
140
+ React.useEffect(() => {
141
+ const canvas = previewRef.current;
142
+ if (!canvas) {
143
+ return;
144
+ }
145
+ const img = spriteGeneratorCore.assembleSprite(currentAssembly, partsMapRef.current, direction);
146
+ let finalImg = img;
147
+ if (projection === "iso25d") {
148
+ finalImg = spriteGeneratorCore.applyIsometricProjection(img);
149
+ }
150
+ canvas.width = finalImg.width;
151
+ canvas.height = finalImg.height;
152
+ const ctx = canvas.getContext("2d");
153
+ if (ctx) {
154
+ ctx.clearRect(0, 0, canvas.width, canvas.height);
155
+ ctx.putImageData(finalImg, 0, 0);
156
+ }
157
+ }, [currentAssembly, direction, projection]);
158
+ const togglePart = React.useCallback((partId) => {
159
+ setSelectedParts(
160
+ (prev) => prev.map((p) => p.partId === partId ? { ...p, visible: !(p.visible ?? true) } : p)
161
+ );
162
+ }, []);
163
+ const addPart = React.useCallback(
164
+ (partId) => {
165
+ if (selectedParts.some((p) => p.partId === partId)) {
166
+ return;
167
+ }
168
+ const part = spriteGeneratorCore.getPart(partId);
169
+ if (!part) {
170
+ return;
171
+ }
172
+ setSelectedParts((prev) => [
173
+ ...prev,
174
+ {
175
+ partId,
176
+ offsetX: Math.floor(canvasW / 2) - Math.floor((part.pixels.S?.width ?? 8) / 2),
177
+ offsetY: Math.floor(canvasH / 2) - Math.floor((part.pixels.S?.height ?? 8) / 2),
178
+ visible: true
180
179
  }
181
- setSelectedParts((prev) => {
182
- var _a, _b, _c, _d;
183
- return [
184
- ...prev,
180
+ ]);
181
+ },
182
+ [selectedParts, canvasW, canvasH]
183
+ );
184
+ const removePart = React.useCallback((partId) => {
185
+ setSelectedParts((prev) => prev.filter((p) => p.partId !== partId));
186
+ }, []);
187
+ const handleSendToCanvas = React.useCallback(() => {
188
+ if (generate8Dir) {
189
+ const frames = spriteGeneratorCore.generateAllDirections(currentAssembly, partsMapRef.current);
190
+ const sheet = spriteGeneratorCore.render8DirSpriteSheet(frames);
191
+ onSendToCanvas?.(sheet);
192
+ } else {
193
+ let img = spriteGeneratorCore.assembleSprite(currentAssembly, partsMapRef.current, direction);
194
+ if (projection === "iso25d") {
195
+ img = spriteGeneratorCore.applyIsometricProjection(img);
196
+ }
197
+ onSendToCanvas?.(img);
198
+ }
199
+ onClose?.();
200
+ }, [generate8Dir, currentAssembly, direction, projection, onSendToCanvas, onClose]);
201
+ const categories = React.useMemo(() => {
202
+ switch (tab) {
203
+ case "character":
204
+ return CHAR_CATEGORIES;
205
+ case "building":
206
+ return BUILDING_CATEGORIES;
207
+ case "animal":
208
+ return ANIMAL_CATEGORIES;
209
+ }
210
+ }, [tab]);
211
+ const paletteGroups = React.useMemo(() => {
212
+ switch (tab) {
213
+ case "character":
214
+ return [
215
+ {
216
+ label: t("spriteGeneratorPanel.skin", "Skin"),
217
+ options: palettesToOptions(characterGeneratorPresets.SKIN_PALETTES),
218
+ value: skinPalette,
219
+ set: setSkinPalette
220
+ },
221
+ {
222
+ label: t("spriteGeneratorPanel.hair", "Hair"),
223
+ options: palettesToOptions(characterGeneratorPresets.HAIR_PALETTES),
224
+ value: hairPalette,
225
+ set: setHairPalette
226
+ },
227
+ {
228
+ label: t("spriteGeneratorPanel.clothing", "Clothing"),
229
+ options: palettesToOptions(characterGeneratorPresets.CLOTHING_PALETTES),
230
+ value: clothPalette,
231
+ set: setClothPalette
232
+ }
233
+ ];
234
+ case "building":
235
+ return [
236
+ {
237
+ label: t("spriteGeneratorPanel.walls", "Walls"),
238
+ options: palettesToOptions(buildingGeneratorPresets.WALL_PALETTES),
239
+ value: wallPalette,
240
+ set: setWallPalette
241
+ },
242
+ {
243
+ label: t("spriteGeneratorPanel.roof", "Roof"),
244
+ options: palettesToOptions(buildingGeneratorPresets.ROOF_PALETTES),
245
+ value: roofPalette,
246
+ set: setRoofPalette
247
+ }
248
+ ];
249
+ case "animal":
250
+ return [
251
+ {
252
+ label: t("spriteGeneratorPanel.fur", "Fur"),
253
+ options: palettesToOptions(animalGeneratorPresets.FUR_PALETTES),
254
+ value: furPalette,
255
+ set: setFurPalette
256
+ }
257
+ ];
258
+ }
259
+ }, [tab, skinPalette, hairPalette, clothPalette, wallPalette, roofPalette, furPalette, t]);
260
+ return /* @__PURE__ */ jsxRuntime.jsx(
261
+ ui.NiceModal,
262
+ {
263
+ open: true,
264
+ onClose: onClose ?? (() => {
265
+ }),
266
+ title: t("spriteGeneratorPanel.spriteGenerator", "Sprite Generator"),
267
+ size: "xl",
268
+ children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: PixelEditor_module.default.genPanel, children: [
269
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: PixelEditor_module.default.genTabs, children: ["character", "building", "animal"].map((t2) => /* @__PURE__ */ jsxRuntime.jsxs(
270
+ ui.NiceButton,
271
+ {
272
+ className: `${PixelEditor_module.default.genTabBtn} ${tab === t2 ? PixelEditor_module.default.genTabBtnActive : ""}`,
273
+ variant: tab === t2 ? "primary" : "ghost",
274
+ size: "sm",
275
+ onClick: () => setTab(t2),
276
+ children: [
277
+ /* @__PURE__ */ jsxRuntime.jsx(
278
+ uiCore.NiceIcon,
279
+ {
280
+ name: t2 === "character" ? "user" : t2 === "building" ? "home" : "heart",
281
+ size: 14
282
+ }
283
+ ),
284
+ " ",
285
+ t2.charAt(0).toUpperCase() + t2.slice(1)
286
+ ]
287
+ },
288
+ t2
289
+ )) }),
290
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: PixelEditor_module.default.genBody, children: [
291
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: PixelEditor_module.default.genLeft, children: [
292
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: PixelEditor_module.default.panelSection, children: [
293
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: PixelEditor_module.default.panelTitle, children: /* @__PURE__ */ jsxRuntime.jsx("span", { children: t("spriteGeneratorPanel.presets", "Presets") }) }),
294
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: PixelEditor_module.default.genPresetGrid, children: presets.map((preset, i) => /* @__PURE__ */ jsxRuntime.jsx(
295
+ ui.NiceButton,
185
296
  {
186
- partId,
187
- offsetX: Math.floor(canvasW / 2) - Math.floor(((_b = (_a = part.pixels.S) === null || _a === void 0 ? void 0 : _a.width) !== null && _b !== void 0 ? _b : 8) / 2),
188
- offsetY: Math.floor(canvasH / 2) - Math.floor(((_d = (_c = part.pixels.S) === null || _c === void 0 ? void 0 : _c.height) !== null && _d !== void 0 ? _d : 8) / 2),
189
- visible: true,
297
+ className: `${PixelEditor_module.default.genPresetBtn} ${i === selectedPresetIdx ? PixelEditor_module.default.genPresetBtnActive : ""}`,
298
+ variant: i === selectedPresetIdx ? "primary" : "ghost",
299
+ size: "sm",
300
+ onClick: () => applyPreset(i),
301
+ title: preset.name,
302
+ children: preset.name
190
303
  },
191
- ];
192
- });
193
- }, [selectedParts, canvasW, canvasH]);
194
- /* ── Remove part ── */
195
- const removePart = React.useCallback((partId) => {
196
- setSelectedParts((prev) => prev.filter((p) => p.partId !== partId));
197
- }, []);
198
- /* ── Send to canvas ── */
199
- const handleSendToCanvas = React.useCallback(() => {
200
- if (generate8Dir) {
201
- const frames = spriteGeneratorCore.generateAllDirections(currentAssembly, partsMapRef.current);
202
- const sheet = spriteGeneratorCore.render8DirSpriteSheet(frames);
203
- onSendToCanvas === null || onSendToCanvas === void 0 ? void 0 : onSendToCanvas(sheet);
204
- }
205
- else {
206
- let img = spriteGeneratorCore.assembleSprite(currentAssembly, partsMapRef.current, direction);
207
- if (projection === 'iso25d') {
208
- img = spriteGeneratorCore.applyIsometricProjection(img);
209
- }
210
- onSendToCanvas === null || onSendToCanvas === void 0 ? void 0 : onSendToCanvas(img);
211
- }
212
- onClose === null || onClose === void 0 ? void 0 : onClose();
213
- }, [generate8Dir, currentAssembly, direction, projection, onSendToCanvas, onClose]);
214
- /* ── Categories for current tab ── */
215
- const categories = React.useMemo(() => {
216
- switch (tab) {
217
- case 'character':
218
- return CHAR_CATEGORIES;
219
- case 'building':
220
- return BUILDING_CATEGORIES;
221
- case 'animal':
222
- return ANIMAL_CATEGORIES;
223
- }
224
- }, [tab]);
225
- /* ── Available palette options ── */
226
- const paletteGroups = React.useMemo(() => {
227
- switch (tab) {
228
- case 'character':
229
- return [
230
- {
231
- label: t('spriteGeneratorPanel.skin', 'Skin'),
232
- options: palettesToOptions(characterGeneratorPresets.SKIN_PALETTES),
233
- value: skinPalette,
234
- set: setSkinPalette,
235
- },
304
+ i
305
+ )) })
306
+ ] }),
307
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: PixelEditor_module.default.panelSection, style: { flex: 1, overflowY: "auto" }, children: [
308
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: PixelEditor_module.default.panelTitle, children: /* @__PURE__ */ jsxRuntime.jsx("span", { children: t("spriteGeneratorPanel.parts", "Parts") }) }),
309
+ categories.map((cat) => {
310
+ const parts = spriteGeneratorCore.getPartsByCategory(cat);
311
+ if (parts.length === 0) {
312
+ return null;
313
+ }
314
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { marginBottom: 6 }, children: [
315
+ /* @__PURE__ */ jsxRuntime.jsx(
316
+ "div",
236
317
  {
237
- label: t('spriteGeneratorPanel.hair', 'Hair'),
238
- options: palettesToOptions(characterGeneratorPresets.HAIR_PALETTES),
239
- value: hairPalette,
240
- set: setHairPalette,
241
- },
242
- {
243
- label: t('spriteGeneratorPanel.clothing', 'Clothing'),
244
- options: palettesToOptions(characterGeneratorPresets.CLOTHING_PALETTES),
245
- value: clothPalette,
246
- set: setClothPalette,
247
- },
248
- ];
249
- case 'building':
250
- return [
251
- {
252
- label: t('spriteGeneratorPanel.walls', 'Walls'),
253
- options: palettesToOptions(buildingGeneratorPresets.WALL_PALETTES),
254
- value: wallPalette,
255
- set: setWallPalette,
256
- },
257
- {
258
- label: t('spriteGeneratorPanel.roof', 'Roof'),
259
- options: palettesToOptions(buildingGeneratorPresets.ROOF_PALETTES),
260
- value: roofPalette,
261
- set: setRoofPalette,
262
- },
263
- ];
264
- case 'animal':
265
- return [
318
+ style: {
319
+ fontSize: 9,
320
+ color: "var(--nice-text-muted)",
321
+ marginBottom: 2,
322
+ textTransform: "uppercase"
323
+ },
324
+ children: cat.replace(/([A-Z])/g, " $1").trim()
325
+ }
326
+ ),
327
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: PixelEditor_module.default.genPartGrid, children: parts.map((part) => {
328
+ const active = selectedParts.some(
329
+ (p) => p.partId === part.id && (p.visible ?? true)
330
+ );
331
+ return /* @__PURE__ */ jsxRuntime.jsx(
332
+ ui.NiceButton,
333
+ {
334
+ className: `${PixelEditor_module.default.miniBtn} ${PixelEditor_module.default.genPartBtn} ${active ? PixelEditor_module.default.miniBtnActive : ""}`,
335
+ variant: active ? "primary" : "ghost",
336
+ size: "sm",
337
+ onClick: () => active ? removePart(part.id) : addPart(part.id),
338
+ title: part.name,
339
+ children: part.name
340
+ },
341
+ part.id
342
+ );
343
+ }) })
344
+ ] }, cat);
345
+ })
346
+ ] })
347
+ ] }),
348
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: PixelEditor_module.default.genCenter, children: [
349
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: PixelEditor_module.default.genPreviewWrap, children: /* @__PURE__ */ jsxRuntime.jsx("canvas", { ref: previewRef, className: PixelEditor_module.default.genPreviewCanvas }) }),
350
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: PixelEditor_module.default.genDirGrid, children: spriteGeneratorCore.ALL_DIRECTIONS.map((d) => /* @__PURE__ */ jsxRuntime.jsx(
351
+ ui.NiceButton,
352
+ {
353
+ className: `${PixelEditor_module.default.miniBtn} ${direction === d ? PixelEditor_module.default.miniBtnActive : ""}`,
354
+ variant: direction === d ? "primary" : "ghost",
355
+ size: "sm",
356
+ onClick: () => setDirection(d),
357
+ children: d
358
+ },
359
+ d
360
+ )) }),
361
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: PixelEditor_module.default.genRow, children: [
362
+ /* @__PURE__ */ jsxRuntime.jsx("label", { style: { fontSize: 10, color: "var(--nice-text-muted)" }, children: t("spriteGeneratorPanel.projection", "Projection") }),
363
+ /* @__PURE__ */ jsxRuntime.jsx(
364
+ ui.NiceSelect,
365
+ {
366
+ className: PixelEditor_module.default.propSelect,
367
+ value: projection,
368
+ onChange: (val) => setProjection(val),
369
+ options: [
370
+ { value: "topDown", label: t("spriteGeneratorPanel.topDown", "Top-Down") },
371
+ { value: "sideView", label: t("spriteGeneratorPanel.sideView", "Side View") },
266
372
  {
267
- label: t('spriteGeneratorPanel.fur', 'Fur'),
268
- options: palettesToOptions(animalGeneratorPresets.FUR_PALETTES),
269
- value: furPalette,
270
- set: setFurPalette,
271
- },
272
- ];
273
- }
274
- }, [tab, skinPalette, hairPalette, clothPalette, wallPalette, roofPalette, furPalette, t]);
275
- /* ── Render ── */
276
- return (jsxRuntime.jsx(ui.NiceModal, { open: true, onClose: onClose !== null && onClose !== void 0 ? onClose : (() => { }), title: t('spriteGeneratorPanel.spriteGenerator', 'Sprite Generator'), size: "xl", children: jsxRuntime.jsxs("div", { className: PixelEditor_module.genPanel, children: [jsxRuntime.jsx("div", { className: PixelEditor_module.genTabs, children: ['character', 'building', 'animal'].map((t) => (jsxRuntime.jsxs(ui.NiceButton, { className: `${PixelEditor_module.genTabBtn} ${tab === t ? PixelEditor_module.genTabBtnActive : ''}`, variant: tab === t ? 'primary' : 'ghost', size: "sm", onClick: () => setTab(t), children: [jsxRuntime.jsx(uiCore.NiceIcon, { name: t === 'character' ? 'user' : t === 'building' ? 'home' : 'heart', size: 14 }), ' ', t.charAt(0).toUpperCase() + t.slice(1)] }, t))) }), jsxRuntime.jsxs("div", { className: PixelEditor_module.genBody, children: [jsxRuntime.jsxs("div", { className: PixelEditor_module.genLeft, children: [jsxRuntime.jsxs("div", { className: PixelEditor_module.panelSection, children: [jsxRuntime.jsx("div", { className: PixelEditor_module.panelTitle, children: jsxRuntime.jsx("span", { children: t('spriteGeneratorPanel.presets', 'Presets') }) }), jsxRuntime.jsx("div", { className: PixelEditor_module.genPresetGrid, children: presets.map((preset, i) => (jsxRuntime.jsx(ui.NiceButton, { className: `${PixelEditor_module.genPresetBtn} ${i === selectedPresetIdx ? PixelEditor_module.genPresetBtnActive : ''}`, variant: i === selectedPresetIdx ? 'primary' : 'ghost', size: "sm", onClick: () => applyPreset(i), title: preset.name, children: preset.name }, i))) })] }), jsxRuntime.jsxs("div", { className: PixelEditor_module.panelSection, style: { flex: 1, overflowY: 'auto' }, children: [jsxRuntime.jsx("div", { className: PixelEditor_module.panelTitle, children: jsxRuntime.jsx("span", { children: t('spriteGeneratorPanel.parts', 'Parts') }) }), categories.map((cat) => {
277
- const parts = spriteGeneratorCore.getPartsByCategory(cat);
278
- if (parts.length === 0) {
279
- return null;
280
- }
281
- return (jsxRuntime.jsxs("div", { style: { marginBottom: 6 }, children: [jsxRuntime.jsx("div", { style: {
282
- fontSize: 9,
283
- color: 'var(--nice-text-muted)',
284
- marginBottom: 2,
285
- textTransform: 'uppercase',
286
- }, children: cat.replace(/([A-Z])/g, ' $1').trim() }), jsxRuntime.jsx("div", { className: PixelEditor_module.genPartGrid, children: parts.map((part) => {
287
- const active = selectedParts.some((p) => { var _a; return p.partId === part.id && ((_a = p.visible) !== null && _a !== void 0 ? _a : true); });
288
- return (jsxRuntime.jsx(ui.NiceButton, { className: `${PixelEditor_module.miniBtn} ${PixelEditor_module.genPartBtn} ${active ? PixelEditor_module.miniBtnActive : ''}`, variant: active ? 'primary' : 'ghost', size: "sm", onClick: () => (active ? removePart(part.id) : addPart(part.id)), title: part.name, children: part.name }, part.id));
289
- }) })] }, cat));
290
- })] })] }), jsxRuntime.jsxs("div", { className: PixelEditor_module.genCenter, children: [jsxRuntime.jsx("div", { className: PixelEditor_module.genPreviewWrap, children: jsxRuntime.jsx("canvas", { ref: previewRef, className: PixelEditor_module.genPreviewCanvas }) }), jsxRuntime.jsx("div", { className: PixelEditor_module.genDirGrid, children: spriteGeneratorCore.ALL_DIRECTIONS.map((d) => (jsxRuntime.jsx(ui.NiceButton, { className: `${PixelEditor_module.miniBtn} ${direction === d ? PixelEditor_module.miniBtnActive : ''}`, variant: direction === d ? 'primary' : 'ghost', size: "sm", onClick: () => setDirection(d), children: d }, d))) }), jsxRuntime.jsxs("div", { className: PixelEditor_module.genRow, children: [jsxRuntime.jsx("label", { style: { fontSize: 10, color: 'var(--nice-text-muted)' }, children: t('spriteGeneratorPanel.projection', 'Projection') }), jsxRuntime.jsx(ui.NiceSelect, { className: PixelEditor_module.propSelect, value: projection, onChange: (val) => setProjection(val), options: [
291
- { value: 'topDown', label: t('spriteGeneratorPanel.topDown', 'Top-Down') },
292
- { value: 'sideView', label: t('spriteGeneratorPanel.sideView', 'Side View') },
293
- {
294
- value: 'iso25d',
295
- label: t('spriteGeneratorPanel.n25dIsometric', '2.5D Isometric'),
296
- },
297
- ] })] }), jsxRuntime.jsxs("div", { className: PixelEditor_module.genRow, children: [jsxRuntime.jsx("label", { style: { fontSize: 10, color: 'var(--nice-text-muted)' }, children: t('spriteGeneratorPanel.size', 'Size') }), jsxRuntime.jsx(ui.NiceNumberInput, { min: 8, max: 256, value: canvasW, onChange: (val) => setCanvasW(val !== null && val !== void 0 ? val : 32) }), jsxRuntime.jsx("span", { style: { fontSize: 10, color: 'var(--nice-text-muted)' }, children: "\u00D7" }), jsxRuntime.jsx(ui.NiceNumberInput, { min: 8, max: 256, value: canvasH, onChange: (val) => setCanvasH(val !== null && val !== void 0 ? val : 32) })] }), jsxRuntime.jsx(ui.NiceCheckbox, { checked: generate8Dir, onChange: (checked) => setGenerate8Dir(checked), label: t('spriteGeneratorPanel.generate8DirectionSheet', 'Generate 8-direction sheet'), className: PixelEditor_module.checkLabel })] }), jsxRuntime.jsxs("div", { className: PixelEditor_module.genRight, children: [jsxRuntime.jsxs("div", { className: PixelEditor_module.panelSection, children: [jsxRuntime.jsx("div", { className: PixelEditor_module.panelTitle, children: jsxRuntime.jsx("span", { children: t('spriteGeneratorPanel.colors', 'Colors') }) }), paletteGroups.map((group) => {
298
- var _a;
299
- return (jsxRuntime.jsxs("div", { style: { marginBottom: 6 }, children: [jsxRuntime.jsx("div", { style: { fontSize: 9, color: 'var(--nice-text-muted)', marginBottom: 2 }, children: group.label }), jsxRuntime.jsx(ui.NiceSelect, { className: PixelEditor_module.propSelect, value: group.value, onChange: (val) => group.set(val), options: group.options.map((opt) => ({
300
- value: opt.id,
301
- label: opt.name,
302
- })) }), jsxRuntime.jsx("div", { className: PixelEditor_module.genColorSwatches, children: (_a = group.options
303
- .find((o) => o.id === group.value)) === null || _a === void 0 ? void 0 : _a.colors.map((c, i) => (jsxRuntime.jsx("div", { className: PixelEditor_module.genColorSwatch, style: { backgroundColor: c }, title: c }, i))) })] }, group.label));
304
- })] }), jsxRuntime.jsxs("div", { className: PixelEditor_module.panelSection, style: { flex: 1, overflowY: 'auto' }, children: [jsxRuntime.jsx("div", { className: PixelEditor_module.panelTitle, children: jsxRuntime.jsx("span", { children: t('spriteGeneratorPanel.assembly', 'Assembly') }) }), selectedParts.map((ap, i) => {
305
- var _a, _b, _c, _d, _e;
306
- const part = partsMapRef.current.get(ap.partId);
307
- return (
308
- // A part can be placed twice (left and right leg, flipped), so its id
309
- // alone is not a unique key.
310
- jsxRuntime.jsxs("div", { className: PixelEditor_module.genAssemblyItem, children: [jsxRuntime.jsx(ui.NiceButton, { className: PixelEditor_module.btnIcon, variant: "ghost", size: "sm", onClick: () => togglePart(ap.partId), title: ((_a = ap.visible) !== null && _a !== void 0 ? _a : true)
311
- ? t('spriteGeneratorPanel.hide', 'Hide')
312
- : t('spriteGeneratorPanel.show', 'Show'), "aria-label": ((_b = ap.visible) !== null && _b !== void 0 ? _b : true)
313
- ? t('spriteGeneratorPanel.hide', 'Hide')
314
- : t('spriteGeneratorPanel.show', 'Show'), children: jsxRuntime.jsx(uiCore.NiceIcon, { name: ((_c = ap.visible) !== null && _c !== void 0 ? _c : true) ? 'eye' : 'eye-off', size: 14 }) }), jsxRuntime.jsx("span", { className: PixelEditor_module.genAssemblyName, children: (_d = part === null || part === void 0 ? void 0 : part.name) !== null && _d !== void 0 ? _d : ap.partId }), jsxRuntime.jsxs("span", { style: { fontSize: 9, color: 'var(--nice-text-muted)' }, children: ["z:", (_e = part === null || part === void 0 ? void 0 : part.zOrder) !== null && _e !== void 0 ? _e : 0] }), jsxRuntime.jsx(ui.NiceButton, { className: PixelEditor_module.btnIcon, variant: "ghost", size: "sm", onClick: () => removePart(ap.partId), title: t('spriteGeneratorPanel.remove', 'Remove'), "aria-label": t('spriteGeneratorPanel.remove', 'Remove'), children: jsxRuntime.jsx(uiCore.NiceIcon, { name: "close", size: 14 }) })] }, `${ap.partId}-${i}`));
315
- })] })] })] }), jsxRuntime.jsxs("div", { className: PixelEditor_module.genFooter, children: [jsxRuntime.jsx(ui.NiceButton, { className: PixelEditor_module.btnSecondary, variant: "ghost", onClick: onClose, children: t('spriteGeneratorPanel.cancel', 'Cancel') }), jsxRuntime.jsxs(ui.NiceButton, { className: PixelEditor_module.btnPrimary, variant: "primary", onClick: handleSendToCanvas, children: [jsxRuntime.jsx(uiCore.NiceIcon, { name: "clipboard", size: 14 }), ' ', t('spriteGeneratorPanel.sendToCanvas', 'Send to Canvas')] })] })] }) }));
373
+ value: "iso25d",
374
+ label: t("spriteGeneratorPanel.n25dIsometric", "2.5D Isometric")
375
+ }
376
+ ]
377
+ }
378
+ )
379
+ ] }),
380
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: PixelEditor_module.default.genRow, children: [
381
+ /* @__PURE__ */ jsxRuntime.jsx("label", { style: { fontSize: 10, color: "var(--nice-text-muted)" }, children: t("spriteGeneratorPanel.size", "Size") }),
382
+ /* @__PURE__ */ jsxRuntime.jsx(
383
+ ui.NiceNumberInput,
384
+ {
385
+ min: 8,
386
+ max: 256,
387
+ value: canvasW,
388
+ onChange: (val) => setCanvasW(val ?? 32)
389
+ }
390
+ ),
391
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontSize: 10, color: "var(--nice-text-muted)" }, children: "×" }),
392
+ /* @__PURE__ */ jsxRuntime.jsx(
393
+ ui.NiceNumberInput,
394
+ {
395
+ min: 8,
396
+ max: 256,
397
+ value: canvasH,
398
+ onChange: (val) => setCanvasH(val ?? 32)
399
+ }
400
+ )
401
+ ] }),
402
+ /* @__PURE__ */ jsxRuntime.jsx(
403
+ ui.NiceCheckbox,
404
+ {
405
+ checked: generate8Dir,
406
+ onChange: (checked) => setGenerate8Dir(checked),
407
+ label: t(
408
+ "spriteGeneratorPanel.generate8DirectionSheet",
409
+ "Generate 8-direction sheet"
410
+ ),
411
+ className: PixelEditor_module.default.checkLabel
412
+ }
413
+ )
414
+ ] }),
415
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: PixelEditor_module.default.genRight, children: [
416
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: PixelEditor_module.default.panelSection, children: [
417
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: PixelEditor_module.default.panelTitle, children: /* @__PURE__ */ jsxRuntime.jsx("span", { children: t("spriteGeneratorPanel.colors", "Colors") }) }),
418
+ paletteGroups.map((group) => /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { marginBottom: 6 }, children: [
419
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 9, color: "var(--nice-text-muted)", marginBottom: 2 }, children: group.label }),
420
+ /* @__PURE__ */ jsxRuntime.jsx(
421
+ ui.NiceSelect,
422
+ {
423
+ className: PixelEditor_module.default.propSelect,
424
+ value: group.value,
425
+ onChange: (val) => group.set(val),
426
+ options: group.options.map((opt) => ({
427
+ value: opt.id,
428
+ label: opt.name
429
+ }))
430
+ }
431
+ ),
432
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: PixelEditor_module.default.genColorSwatches, children: group.options.find((o) => o.id === group.value)?.colors.map((c, i) => /* @__PURE__ */ jsxRuntime.jsx(
433
+ "div",
434
+ {
435
+ className: PixelEditor_module.default.genColorSwatch,
436
+ style: { backgroundColor: c },
437
+ title: c
438
+ },
439
+ i
440
+ )) })
441
+ ] }, group.label))
442
+ ] }),
443
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: PixelEditor_module.default.panelSection, style: { flex: 1, overflowY: "auto" }, children: [
444
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: PixelEditor_module.default.panelTitle, children: /* @__PURE__ */ jsxRuntime.jsx("span", { children: t("spriteGeneratorPanel.assembly", "Assembly") }) }),
445
+ selectedParts.map((ap, i) => {
446
+ const part = partsMapRef.current.get(ap.partId);
447
+ return (
448
+ // A part can be placed twice (left and right leg, flipped), so its id
449
+ // alone is not a unique key.
450
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: PixelEditor_module.default.genAssemblyItem, children: [
451
+ /* @__PURE__ */ jsxRuntime.jsx(
452
+ ui.NiceButton,
453
+ {
454
+ className: PixelEditor_module.default.btnIcon,
455
+ variant: "ghost",
456
+ size: "sm",
457
+ onClick: () => togglePart(ap.partId),
458
+ title: ap.visible ?? true ? t("spriteGeneratorPanel.hide", "Hide") : t("spriteGeneratorPanel.show", "Show"),
459
+ "aria-label": ap.visible ?? true ? t("spriteGeneratorPanel.hide", "Hide") : t("spriteGeneratorPanel.show", "Show"),
460
+ children: /* @__PURE__ */ jsxRuntime.jsx(uiCore.NiceIcon, { name: ap.visible ?? true ? "eye" : "eye-off", size: 14 })
461
+ }
462
+ ),
463
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: PixelEditor_module.default.genAssemblyName, children: part?.name ?? ap.partId }),
464
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { style: { fontSize: 9, color: "var(--nice-text-muted)" }, children: [
465
+ "z:",
466
+ part?.zOrder ?? 0
467
+ ] }),
468
+ /* @__PURE__ */ jsxRuntime.jsx(
469
+ ui.NiceButton,
470
+ {
471
+ className: PixelEditor_module.default.btnIcon,
472
+ variant: "ghost",
473
+ size: "sm",
474
+ onClick: () => removePart(ap.partId),
475
+ title: t("spriteGeneratorPanel.remove", "Remove"),
476
+ "aria-label": t("spriteGeneratorPanel.remove", "Remove"),
477
+ children: /* @__PURE__ */ jsxRuntime.jsx(uiCore.NiceIcon, { name: "close", size: 14 })
478
+ }
479
+ )
480
+ ] }, `${ap.partId}-${i}`)
481
+ );
482
+ })
483
+ ] })
484
+ ] })
485
+ ] }),
486
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: PixelEditor_module.default.genFooter, children: [
487
+ /* @__PURE__ */ jsxRuntime.jsx(ui.NiceButton, { className: PixelEditor_module.default.btnSecondary, variant: "ghost", onClick: onClose, children: t("spriteGeneratorPanel.cancel", "Cancel") }),
488
+ /* @__PURE__ */ jsxRuntime.jsxs(ui.NiceButton, { className: PixelEditor_module.default.btnPrimary, variant: "primary", onClick: handleSendToCanvas, children: [
489
+ /* @__PURE__ */ jsxRuntime.jsx(uiCore.NiceIcon, { name: "clipboard", size: 14 }),
490
+ " ",
491
+ t("spriteGeneratorPanel.sendToCanvas", "Send to Canvas")
492
+ ] })
493
+ ] })
494
+ ] })
495
+ }
496
+ );
316
497
  };
317
- if (process.env.NODE_ENV !== 'production') {
318
- NiceSpriteGeneratorPanel.displayName = 'NiceSpriteGeneratorPanel';
498
+ if (process.env.NODE_ENV !== "production") {
499
+ NiceSpriteGeneratorPanel.displayName = "NiceSpriteGeneratorPanel";
319
500
  }
320
-
321
- module.exports = NiceSpriteGeneratorPanel;
501
+ exports.default = NiceSpriteGeneratorPanel;