@nice2dev/ui-graphics 1.3.14 → 1.3.16

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,305 +1,254 @@
1
- 'use strict';
2
-
3
- var pixelEditorUtils = require('./pixelEditorUtils.js');
4
-
5
- /**
6
- * spriteGeneratorCore.ts — Core generator engine for assembling pixel art
7
- * sprites from modular parts (heads, torsos, limbs, accessories).
8
- *
9
- * Supports: characters, animals, buildings with skeleton integration,
10
- * 8-directional rendering, and 2.5D isometric projection.
11
- */
12
- const ALL_DIRECTIONS = ['S', 'SE', 'E', 'NE', 'N', 'NW', 'W', 'SW'];
13
- /* ════════════════════════════════════════════════════════════════
14
- PART PIXEL DATA HELPERS
15
- ════════════════════════════════════════════════════════════════ */
16
- /** Create PartPixelData from a compact row array */
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const pixelEditorUtils = require("./pixelEditorUtils.js");
4
+ const ALL_DIRECTIONS = ["S", "SE", "E", "NE", "N", "NW", "W", "SW"];
17
5
  function createPartData(width, height, rows, palette) {
18
- var _a;
19
- const data = [];
20
- for (let y = 0; y < height; y++) {
21
- const row = rows[y] || [];
22
- for (let x = 0; x < width; x++) {
23
- data.push((_a = row[x]) !== null && _a !== void 0 ? _a : -1);
24
- }
6
+ const data = [];
7
+ for (let y = 0; y < height; y++) {
8
+ const row = rows[y] || [];
9
+ for (let x = 0; x < width; x++) {
10
+ data.push(row[x] ?? -1);
25
11
  }
26
- return { width, height, data, palette };
12
+ }
13
+ return { width, height, data, palette };
27
14
  }
28
- /** Mirror part data horizontally */
29
15
  function mirrorPartH(part) {
30
- const { width, height, data, palette } = part;
31
- const mirrored = new Array(data.length);
32
- for (let y = 0; y < height; y++) {
33
- for (let x = 0; x < width; x++) {
34
- mirrored[y * width + x] = data[y * width + (width - 1 - x)];
35
- }
16
+ const { width, height, data, palette } = part;
17
+ const mirrored = new Array(data.length);
18
+ for (let y = 0; y < height; y++) {
19
+ for (let x = 0; x < width; x++) {
20
+ mirrored[y * width + x] = data[y * width + (width - 1 - x)];
36
21
  }
37
- return { width, height, data: mirrored, palette };
22
+ }
23
+ return { width, height, data: mirrored, palette };
38
24
  }
39
- /** Generate mirrored directions from existing ones */
40
25
  function generateMirroredDirections(pixels) {
41
- const result = { ...pixels };
42
- const mirrorPairs = [
43
- ['E', 'W'],
44
- ['NE', 'NW'],
45
- ['SE', 'SW'],
46
- ];
47
- for (const [from, to] of mirrorPairs) {
48
- if (result[from] && !result[to]) {
49
- result[to] = mirrorPartH(result[from]);
50
- }
51
- else if (result[to] && !result[from]) {
52
- result[from] = mirrorPartH(result[to]);
53
- }
26
+ const result = { ...pixels };
27
+ const mirrorPairs = [
28
+ ["E", "W"],
29
+ ["NE", "NW"],
30
+ ["SE", "SW"]
31
+ ];
32
+ for (const [from, to] of mirrorPairs) {
33
+ if (result[from] && !result[to]) {
34
+ result[to] = mirrorPartH(result[from]);
35
+ } else if (result[to] && !result[from]) {
36
+ result[from] = mirrorPartH(result[to]);
54
37
  }
55
- return result;
38
+ }
39
+ return result;
56
40
  }
57
- /* ════════════════════════════════════════════════════════════════
58
- RENDERING ENGINE
59
- ════════════════════════════════════════════════════════════════ */
60
41
  function hexToRgba(hex) {
61
- const m = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})?$/i.exec(hex);
62
- if (!m) {
63
- return [0, 0, 0, 255];
64
- }
65
- return [
66
- parseInt(m[1], 16),
67
- parseInt(m[2], 16),
68
- parseInt(m[3], 16),
69
- m[4] ? parseInt(m[4], 16) : 255,
70
- ];
42
+ const m = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})?$/i.exec(hex);
43
+ if (!m) {
44
+ return [0, 0, 0, 255];
45
+ }
46
+ return [
47
+ parseInt(m[1], 16),
48
+ parseInt(m[2], 16),
49
+ parseInt(m[3], 16),
50
+ m[4] ? parseInt(m[4], 16) : 255
51
+ ];
71
52
  }
72
- /** Render a single part onto an ImageData */
73
53
  function renderPart(target, part, direction, offsetX, offsetY, colorOverrides, flipH = false) {
74
- var _a;
75
- const pixelData = part.pixels[direction] || part.pixels.S;
76
- if (!pixelData) {
77
- return;
78
- }
79
- const { width, height, data, palette } = pixelData;
80
- for (let y = 0; y < height; y++) {
81
- for (let x = 0; x < width; x++) {
82
- const idx = data[y * width + x];
83
- if (idx < 0) {
84
- continue;
85
- }
86
- const colorHex = (_a = colorOverrides === null || colorOverrides === void 0 ? void 0 : colorOverrides[idx]) !== null && _a !== void 0 ? _a : palette[idx];
87
- if (!colorHex) {
88
- continue;
89
- }
90
- const color = hexToRgba(colorHex);
91
- const px = flipH ? offsetX + width - 1 - x : offsetX + x;
92
- const py = offsetY + y;
93
- if (px >= 0 && px < target.width && py >= 0 && py < target.height) {
94
- pixelEditorUtils.setPixel(target, px, py, color);
95
- }
96
- }
54
+ const pixelData = part.pixels[direction] || part.pixels.S;
55
+ if (!pixelData) {
56
+ return;
57
+ }
58
+ const { width, height, data, palette } = pixelData;
59
+ for (let y = 0; y < height; y++) {
60
+ for (let x = 0; x < width; x++) {
61
+ const idx = data[y * width + x];
62
+ if (idx < 0) {
63
+ continue;
64
+ }
65
+ const colorHex = colorOverrides?.[idx] ?? palette[idx];
66
+ if (!colorHex) {
67
+ continue;
68
+ }
69
+ const color = hexToRgba(colorHex);
70
+ const px = flipH ? offsetX + width - 1 - x : offsetX + x;
71
+ const py = offsetY + y;
72
+ if (px >= 0 && px < target.width && py >= 0 && py < target.height) {
73
+ pixelEditorUtils.setPixel(target, px, py, color);
74
+ }
97
75
  }
76
+ }
98
77
  }
99
- /** Assemble all parts into a single frame */
100
- function assembleSprite(assembly, parts, direction = 'S') {
101
- const img = new ImageData(assembly.canvasWidth, assembly.canvasHeight);
102
- // Sort by z-order
103
- const sorted = [...assembly.parts]
104
- .filter((ap) => ap.visible !== false)
105
- .sort((a, b) => {
106
- var _a, _b;
107
- const partA = parts.get(a.partId);
108
- const partB = parts.get(b.partId);
109
- return ((_a = partA === null || partA === void 0 ? void 0 : partA.zOrder) !== null && _a !== void 0 ? _a : 0) - ((_b = partB === null || partB === void 0 ? void 0 : partB.zOrder) !== null && _b !== void 0 ? _b : 0);
110
- });
111
- for (const ap of sorted) {
112
- const part = parts.get(ap.partId);
113
- if (!part) {
114
- continue;
115
- }
116
- renderPart(img, part, direction, ap.offsetX, ap.offsetY, ap.colorOverrides, ap.flipH);
78
+ function assembleSprite(assembly, parts, direction = "S") {
79
+ const img = new ImageData(assembly.canvasWidth, assembly.canvasHeight);
80
+ const sorted = [...assembly.parts].filter((ap) => ap.visible !== false).sort((a, b) => {
81
+ const partA = parts.get(a.partId);
82
+ const partB = parts.get(b.partId);
83
+ return (partA?.zOrder ?? 0) - (partB?.zOrder ?? 0);
84
+ });
85
+ for (const ap of sorted) {
86
+ const part = parts.get(ap.partId);
87
+ if (!part) {
88
+ continue;
117
89
  }
118
- return img;
90
+ renderPart(img, part, direction, ap.offsetX, ap.offsetY, ap.colorOverrides, ap.flipH);
91
+ }
92
+ return img;
119
93
  }
120
- /** Generate all 8 directions for an assembly */
121
94
  function generateAllDirections(assembly, parts, directions = ALL_DIRECTIONS) {
122
- const result = new Map();
123
- for (const dir of directions) {
124
- result.set(dir, assembleSprite(assembly, parts, dir));
125
- }
126
- return result;
95
+ const result = /* @__PURE__ */ new Map();
96
+ for (const dir of directions) {
97
+ result.set(dir, assembleSprite(assembly, parts, dir));
98
+ }
99
+ return result;
127
100
  }
128
- /* ════════════════════════════════════════════════════════════════
129
- 2.5D ISOMETRIC PROJECTION
130
- ════════════════════════════════════════════════════════════════ */
131
- /** Apply 2.5D isometric transformation to an ImageData */
132
101
  function applyIsometricProjection(source, tiltAngle = 30) {
133
- const rads = (tiltAngle * Math.PI) / 180;
134
- const cosA = Math.cos(rads);
135
- const sinA = Math.sin(rads);
136
- const sw = source.width;
137
- const sh = source.height;
138
- // Output dimensions: wider and shorter
139
- const dw = Math.ceil(sw * 1.5);
140
- const dh = Math.ceil(sh * cosA + sw * sinA * 0.5);
141
- const result = new ImageData(dw, dh);
142
- const cx = sw / 2;
143
- const cy = sh;
144
- const dx = dw / 2;
145
- const dy = dh;
146
- for (let sy = 0; sy < sh; sy++) {
147
- for (let sx = 0; sx < sw; sx++) {
148
- const si = (sy * sw + sx) * 4;
149
- if (source.data[si + 3] === 0) {
150
- continue;
151
- }
152
- // Isometric transform
153
- const rx = sx - cx;
154
- const ry = sy - cy;
155
- const isoX = Math.round(dx + rx - ry * sinA * 0.5);
156
- const isoY = Math.round(dy + ry * cosA);
157
- if (isoX >= 0 && isoX < dw && isoY >= 0 && isoY < dh) {
158
- const di = (isoY * dw + isoX) * 4;
159
- result.data[di] = source.data[si];
160
- result.data[di + 1] = source.data[si + 1];
161
- result.data[di + 2] = source.data[si + 2];
162
- result.data[di + 3] = source.data[si + 3];
163
- }
164
- }
102
+ const rads = tiltAngle * Math.PI / 180;
103
+ const cosA = Math.cos(rads);
104
+ const sinA = Math.sin(rads);
105
+ const sw = source.width;
106
+ const sh = source.height;
107
+ const dw = Math.ceil(sw * 1.5);
108
+ const dh = Math.ceil(sh * cosA + sw * sinA * 0.5);
109
+ const result = new ImageData(dw, dh);
110
+ const cx = sw / 2;
111
+ const cy = sh;
112
+ const dx = dw / 2;
113
+ const dy = dh;
114
+ for (let sy = 0; sy < sh; sy++) {
115
+ for (let sx = 0; sx < sw; sx++) {
116
+ const si = (sy * sw + sx) * 4;
117
+ if (source.data[si + 3] === 0) {
118
+ continue;
119
+ }
120
+ const rx = sx - cx;
121
+ const ry = sy - cy;
122
+ const isoX = Math.round(dx + rx - ry * sinA * 0.5);
123
+ const isoY = Math.round(dy + ry * cosA);
124
+ if (isoX >= 0 && isoX < dw && isoY >= 0 && isoY < dh) {
125
+ const di = (isoY * dw + isoX) * 4;
126
+ result.data[di] = source.data[si];
127
+ result.data[di + 1] = source.data[si + 1];
128
+ result.data[di + 2] = source.data[si + 2];
129
+ result.data[di + 3] = source.data[si + 3];
130
+ }
165
131
  }
166
- return result;
132
+ }
133
+ return result;
167
134
  }
168
- /** Render 8-direction sprite sheet (all directions in a strip) */
169
135
  function render8DirSpriteSheet(frames, columns = 8) {
170
- const dirs = ALL_DIRECTIONS;
171
- const firstFrame = frames.get('S') || frames.values().next().value;
172
- if (!firstFrame) {
173
- return new ImageData(1, 1);
174
- }
175
- const fw = firstFrame.width;
176
- const fh = firstFrame.height;
177
- const rows = Math.ceil(dirs.length / columns);
178
- const sheet = new ImageData(fw * columns, fh * rows);
179
- let col = 0;
180
- let row = 0;
181
- for (const dir of dirs) {
182
- const frame = frames.get(dir);
183
- if (frame) {
184
- for (let y = 0; y < fh; y++) {
185
- for (let x = 0; x < fw; x++) {
186
- const si = (y * fw + x) * 4;
187
- const dx = col * fw + x;
188
- const dy = row * fh + y;
189
- const di = (dy * sheet.width + dx) * 4;
190
- sheet.data[di] = frame.data[si];
191
- sheet.data[di + 1] = frame.data[si + 1];
192
- sheet.data[di + 2] = frame.data[si + 2];
193
- sheet.data[di + 3] = frame.data[si + 3];
194
- }
195
- }
196
- }
197
- col++;
198
- if (col >= columns) {
199
- col = 0;
200
- row++;
136
+ const dirs = ALL_DIRECTIONS;
137
+ const firstFrame = frames.get("S") || frames.values().next().value;
138
+ if (!firstFrame) {
139
+ return new ImageData(1, 1);
140
+ }
141
+ const fw = firstFrame.width;
142
+ const fh = firstFrame.height;
143
+ const rows = Math.ceil(dirs.length / columns);
144
+ const sheet = new ImageData(fw * columns, fh * rows);
145
+ let col = 0;
146
+ let row = 0;
147
+ for (const dir of dirs) {
148
+ const frame = frames.get(dir);
149
+ if (frame) {
150
+ for (let y = 0; y < fh; y++) {
151
+ for (let x = 0; x < fw; x++) {
152
+ const si = (y * fw + x) * 4;
153
+ const dx = col * fw + x;
154
+ const dy = row * fh + y;
155
+ const di = (dy * sheet.width + dx) * 4;
156
+ sheet.data[di] = frame.data[si];
157
+ sheet.data[di + 1] = frame.data[si + 1];
158
+ sheet.data[di + 2] = frame.data[si + 2];
159
+ sheet.data[di + 3] = frame.data[si + 3];
201
160
  }
161
+ }
162
+ }
163
+ col++;
164
+ if (col >= columns) {
165
+ col = 0;
166
+ row++;
202
167
  }
203
- return sheet;
168
+ }
169
+ return sheet;
204
170
  }
205
- /* ════════════════════════════════════════════════════════════════
206
- RECOLOR SYSTEM
207
- ════════════════════════════════════════════════════════════════ */
208
- /** Shift hue of a hex color */
209
171
  function shiftHue(hex, degrees) {
210
- const rgba = hexToRgba(hex);
211
- const [r, g, b] = rgba;
212
- // RGB → HSL
213
- const rf = r / 255, gf = g / 255, bf = b / 255;
214
- const max = Math.max(rf, gf, bf), min = Math.min(rf, gf, bf);
215
- const l = (max + min) / 2;
216
- let h = 0, s = 0;
217
- if (max !== min) {
218
- const d = max - min;
219
- s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
220
- if (max === rf) {
221
- h = ((gf - bf) / d + (gf < bf ? 6 : 0)) / 6;
222
- }
223
- else if (max === gf) {
224
- h = ((bf - rf) / d + 2) / 6;
225
- }
226
- else {
227
- h = ((rf - gf) / d + 4) / 6;
228
- }
172
+ const rgba = hexToRgba(hex);
173
+ const [r, g, b] = rgba;
174
+ const rf = r / 255, gf = g / 255, bf = b / 255;
175
+ const max = Math.max(rf, gf, bf), min = Math.min(rf, gf, bf);
176
+ const l = (max + min) / 2;
177
+ let h = 0, s = 0;
178
+ if (max !== min) {
179
+ const d = max - min;
180
+ s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
181
+ if (max === rf) {
182
+ h = ((gf - bf) / d + (gf < bf ? 6 : 0)) / 6;
183
+ } else if (max === gf) {
184
+ h = ((bf - rf) / d + 2) / 6;
185
+ } else {
186
+ h = ((rf - gf) / d + 4) / 6;
229
187
  }
230
- // Shift hue
231
- h = ((h * 360 + degrees) % 360) / 360;
232
- if (h < 0) {
233
- h += 1;
188
+ }
189
+ h = (h * 360 + degrees) % 360 / 360;
190
+ if (h < 0) {
191
+ h += 1;
192
+ }
193
+ const hue2rgb = (p, q, t) => {
194
+ if (t < 0) {
195
+ t += 1;
234
196
  }
235
- // HSL → RGB
236
- const hue2rgb = (p, q, t) => {
237
- if (t < 0) {
238
- t += 1;
239
- }
240
- if (t > 1) {
241
- t -= 1;
242
- }
243
- if (t < 1 / 6) {
244
- return p + (q - p) * 6 * t;
245
- }
246
- if (t < 1 / 2) {
247
- return q;
248
- }
249
- if (t < 2 / 3) {
250
- return p + (q - p) * (2 / 3 - t) * 6;
251
- }
252
- return p;
253
- };
254
- let nr, ng, nb;
255
- if (s === 0) {
256
- nr = ng = nb = l;
197
+ if (t > 1) {
198
+ t -= 1;
199
+ }
200
+ if (t < 1 / 6) {
201
+ return p + (q - p) * 6 * t;
257
202
  }
258
- else {
259
- const q = l < 0.5 ? l * (1 + s) : l + s - l * s;
260
- const p = 2 * l - q;
261
- nr = hue2rgb(p, q, h + 1 / 3);
262
- ng = hue2rgb(p, q, h);
263
- nb = hue2rgb(p, q, h - 1 / 3);
203
+ if (t < 1 / 2) {
204
+ return q;
264
205
  }
265
- const toH = (n) => Math.round(n * 255)
266
- .toString(16)
267
- .padStart(2, '0');
268
- return `#${toH(nr)}${toH(ng)}${toH(nb)}`;
206
+ if (t < 2 / 3) {
207
+ return p + (q - p) * (2 / 3 - t) * 6;
208
+ }
209
+ return p;
210
+ };
211
+ let nr, ng, nb;
212
+ if (s === 0) {
213
+ nr = ng = nb = l;
214
+ } else {
215
+ const q = l < 0.5 ? l * (1 + s) : l + s - l * s;
216
+ const p = 2 * l - q;
217
+ nr = hue2rgb(p, q, h + 1 / 3);
218
+ ng = hue2rgb(p, q, h);
219
+ nb = hue2rgb(p, q, h - 1 / 3);
220
+ }
221
+ const toH = (n) => Math.round(n * 255).toString(16).padStart(2, "0");
222
+ return `#${toH(nr)}${toH(ng)}${toH(nb)}`;
269
223
  }
270
- /** Generate recolor map from a base palette */
271
224
  function generateRecolorMap(basePalette, hueShift, _saturationScale = 1, _lightnessShift = 0) {
272
- const map = {};
273
- for (let i = 0; i < basePalette.length; i++) {
274
- map[i] = shiftHue(basePalette[i], hueShift);
275
- }
276
- return map;
225
+ const map = {};
226
+ for (let i = 0; i < basePalette.length; i++) {
227
+ map[i] = shiftHue(basePalette[i], hueShift);
228
+ }
229
+ return map;
277
230
  }
278
- /* ════════════════════════════════════════════════════════════════
279
- PART REGISTRY
280
- ════════════════════════════════════════════════════════════════ */
281
- const _partRegistry = new Map();
231
+ const _partRegistry = /* @__PURE__ */ new Map();
282
232
  function registerPart(part) {
283
- _partRegistry.set(part.id, part);
233
+ _partRegistry.set(part.id, part);
284
234
  }
285
235
  function getPart(id) {
286
- return _partRegistry.get(id);
236
+ return _partRegistry.get(id);
287
237
  }
288
238
  function getPartsByCategory(category) {
289
- return [..._partRegistry.values()].filter((p) => p.category === category);
239
+ return [..._partRegistry.values()].filter((p) => p.category === category);
290
240
  }
291
241
  function getPartsBySlot(slot) {
292
- return [..._partRegistry.values()].filter((p) => p.slot === slot);
242
+ return [..._partRegistry.values()].filter((p) => p.slot === slot);
293
243
  }
294
244
  function getAllParts() {
295
- return [..._partRegistry.values()];
245
+ return [..._partRegistry.values()];
296
246
  }
297
247
  function registerParts(parts) {
298
- for (const p of parts) {
299
- registerPart(p);
300
- }
248
+ for (const p of parts) {
249
+ registerPart(p);
250
+ }
301
251
  }
302
-
303
252
  exports.ALL_DIRECTIONS = ALL_DIRECTIONS;
304
253
  exports.applyIsometricProjection = applyIsometricProjection;
305
254
  exports.assembleSprite = assembleSprite;