@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,156 +1,157 @@
1
- import { resolveCssColor } from '@nice2dev/ui-core';
2
- import React from 'react';
3
-
4
- /**
5
- * minimap.ts — Zoom navigator / minimap component for editors.
6
- *
7
- * Provides a small overview of the full canvas with a viewport indicator
8
- * that can be dragged to navigate around the document.
9
- */
10
- // ── Component ───────────────────────────────────────────────────
11
- /** Zoom navigator / minimap showing a scaled-down view of the full document. */
12
- const Minimap = ({ canvasRef, imageDataUrl, documentWidth, documentHeight, viewport, onViewportChange, config = {}, className = '', }) => {
13
- const { width: mapW = 160, height: mapH = 120, visible = true, position = 'bottom-right', opacity = 0.85, } = config;
14
- const minimapCanvasRef = React.useRef(null);
15
- const isDragging = React.useRef(false);
16
- const scaleX = mapW / (documentWidth || 1);
17
- const scaleY = mapH / (documentHeight || 1);
18
- const scale = Math.min(scaleX, scaleY);
19
- // Draw minimap
20
- React.useEffect(() => {
21
- // inside the effect: it draws with this run's viewport, scale and size
22
- const drawViewport = (ctx) => {
23
- // Draw viewport rect
24
- const vx = viewport.x * scale;
25
- const vy = viewport.y * scale;
26
- const vw = viewport.width * scale;
27
- const vh = viewport.height * scale;
28
- ctx.strokeStyle = resolveCssColor('var(--nice-primary-tint-80, rgba(59, 130, 246, 0.8))', ctx.canvas);
29
- ctx.lineWidth = 1.5;
30
- ctx.strokeRect(vx, vy, vw, vh);
31
- // Dim areas outside viewport
32
- ctx.fillStyle = resolveCssColor('var(--nice-overlay-30, rgba(0, 0, 0, 0.3))', ctx.canvas);
33
- // Top
34
- ctx.fillRect(0, 0, mapW, vy);
35
- // Bottom
36
- ctx.fillRect(0, vy + vh, mapW, mapH - vy - vh);
37
- // Left
38
- ctx.fillRect(0, vy, vx, vh);
39
- // Right
40
- ctx.fillRect(vx + vw, vy, mapW - vx - vw, vh);
41
- };
42
- if (!visible) {
43
- return;
44
- }
45
- const canvas = minimapCanvasRef.current;
46
- if (!canvas) {
47
- return;
48
- }
49
- const ctx = canvas.getContext('2d');
50
- if (!ctx) {
51
- return;
52
- }
53
- ctx.clearRect(0, 0, mapW, mapH);
54
- // Draw background
55
- ctx.fillStyle = resolveCssColor('var(--nice-bg, #1a1a2e)', ctx.canvas);
56
- ctx.fillRect(0, 0, mapW, mapH);
57
- // Draw document content
58
- if (canvasRef === null || canvasRef === void 0 ? void 0 : canvasRef.current) {
59
- const sw = documentWidth * scale;
60
- const sh = documentHeight * scale;
61
- ctx.drawImage(canvasRef.current, 0, 0, documentWidth, documentHeight, 0, 0, sw, sh);
62
- }
63
- else if (imageDataUrl) {
64
- const img = new Image();
65
- img.onload = () => {
66
- const sw = documentWidth * scale;
67
- const sh = documentHeight * scale;
68
- ctx.drawImage(img, 0, 0, sw, sh);
69
- drawViewport(ctx);
70
- };
71
- img.src = imageDataUrl;
72
- return;
73
- }
74
- drawViewport(ctx);
75
- }, [
76
- visible,
77
- canvasRef,
78
- imageDataUrl,
79
- viewport,
80
- documentWidth,
81
- documentHeight,
82
- scale,
83
- mapW,
84
- mapH,
85
- ]);
86
- const handlePointerDown = (e) => {
87
- isDragging.current = true;
88
- updateViewportFromPointer(e);
89
- e.target.setPointerCapture(e.pointerId);
90
- };
91
- const handlePointerMove = (e) => {
92
- if (!isDragging.current) {
93
- return;
94
- }
95
- updateViewportFromPointer(e);
96
- };
97
- const handlePointerUp = () => {
98
- isDragging.current = false;
1
+ import { resolveCssColor } from "@nice2dev/ui-core";
2
+ import React from "react";
3
+ const Minimap = ({
4
+ canvasRef,
5
+ imageDataUrl,
6
+ documentWidth,
7
+ documentHeight,
8
+ viewport,
9
+ onViewportChange,
10
+ config = {},
11
+ className = ""
12
+ }) => {
13
+ const {
14
+ width: mapW = 160,
15
+ height: mapH = 120,
16
+ visible = true,
17
+ position = "bottom-right",
18
+ opacity = 0.85
19
+ } = config;
20
+ const minimapCanvasRef = React.useRef(null);
21
+ const isDragging = React.useRef(false);
22
+ const scaleX = mapW / (documentWidth || 1);
23
+ const scaleY = mapH / (documentHeight || 1);
24
+ const scale = Math.min(scaleX, scaleY);
25
+ React.useEffect(() => {
26
+ const drawViewport = (ctx2) => {
27
+ const vx = viewport.x * scale;
28
+ const vy = viewport.y * scale;
29
+ const vw = viewport.width * scale;
30
+ const vh = viewport.height * scale;
31
+ ctx2.strokeStyle = resolveCssColor(
32
+ "var(--nice-primary-tint-80, rgba(59, 130, 246, 0.8))",
33
+ ctx2.canvas
34
+ );
35
+ ctx2.lineWidth = 1.5;
36
+ ctx2.strokeRect(vx, vy, vw, vh);
37
+ ctx2.fillStyle = resolveCssColor("var(--nice-overlay-30, rgba(0, 0, 0, 0.3))", ctx2.canvas);
38
+ ctx2.fillRect(0, 0, mapW, vy);
39
+ ctx2.fillRect(0, vy + vh, mapW, mapH - vy - vh);
40
+ ctx2.fillRect(0, vy, vx, vh);
41
+ ctx2.fillRect(vx + vw, vy, mapW - vx - vw, vh);
99
42
  };
100
- function updateViewportFromPointer(e) {
101
- var _a;
102
- const rect = (_a = minimapCanvasRef.current) === null || _a === void 0 ? void 0 : _a.getBoundingClientRect();
103
- if (!rect || !onViewportChange) {
104
- return;
105
- }
106
- const mx = e.clientX - rect.left;
107
- const my = e.clientY - rect.top;
108
- const docX = mx / scale - viewport.width / 2;
109
- const docY = my / scale - viewport.height / 2;
110
- onViewportChange({
111
- x: Math.max(0, Math.min(documentWidth - viewport.width, docX)),
112
- y: Math.max(0, Math.min(documentHeight - viewport.height, docY)),
113
- width: viewport.width,
114
- height: viewport.height,
115
- });
116
- }
117
43
  if (!visible) {
118
- return null;
44
+ return;
119
45
  }
120
- const positionStyles = {
121
- 'top-left': { top: 8, left: 8 },
122
- 'top-right': { top: 8, right: 8 },
123
- 'bottom-left': { bottom: 8, left: 8 },
124
- 'bottom-right': { bottom: 8, right: 8 },
125
- };
126
- return React.createElement('div', {
127
- className: `nice-minimap ${className}`,
128
- style: {
129
- position: 'absolute',
130
- ...positionStyles[position],
131
- opacity,
132
- borderRadius: 4,
133
- overflow: 'hidden',
134
- border: '1px solid var(--nice-overlay-light-20, rgba(255, 255, 255, 0.2))',
135
- cursor: 'crosshair',
136
- zIndex: 100,
137
- },
138
- }, React.createElement('canvas', {
139
- ref: minimapCanvasRef,
140
- width: mapW,
141
- height: mapH,
142
- onPointerDown: handlePointerDown,
143
- onPointerMove: handlePointerMove,
144
- onPointerUp: handlePointerUp,
145
- style: { display: 'block' },
146
- }));
46
+ const canvas = minimapCanvasRef.current;
47
+ if (!canvas) {
48
+ return;
49
+ }
50
+ const ctx = canvas.getContext("2d");
51
+ if (!ctx) {
52
+ return;
53
+ }
54
+ ctx.clearRect(0, 0, mapW, mapH);
55
+ ctx.fillStyle = resolveCssColor("var(--nice-bg, #1a1a2e)", ctx.canvas);
56
+ ctx.fillRect(0, 0, mapW, mapH);
57
+ if (canvasRef?.current) {
58
+ const sw = documentWidth * scale;
59
+ const sh = documentHeight * scale;
60
+ ctx.drawImage(canvasRef.current, 0, 0, documentWidth, documentHeight, 0, 0, sw, sh);
61
+ } else if (imageDataUrl) {
62
+ const img = new Image();
63
+ img.onload = () => {
64
+ const sw = documentWidth * scale;
65
+ const sh = documentHeight * scale;
66
+ ctx.drawImage(img, 0, 0, sw, sh);
67
+ drawViewport(ctx);
68
+ };
69
+ img.src = imageDataUrl;
70
+ return;
71
+ }
72
+ drawViewport(ctx);
73
+ }, [
74
+ visible,
75
+ canvasRef,
76
+ imageDataUrl,
77
+ viewport,
78
+ documentWidth,
79
+ documentHeight,
80
+ scale,
81
+ mapW,
82
+ mapH
83
+ ]);
84
+ const handlePointerDown = (e) => {
85
+ isDragging.current = true;
86
+ updateViewportFromPointer(e);
87
+ e.target.setPointerCapture(e.pointerId);
88
+ };
89
+ const handlePointerMove = (e) => {
90
+ if (!isDragging.current) {
91
+ return;
92
+ }
93
+ updateViewportFromPointer(e);
94
+ };
95
+ const handlePointerUp = () => {
96
+ isDragging.current = false;
97
+ };
98
+ function updateViewportFromPointer(e) {
99
+ const rect = minimapCanvasRef.current?.getBoundingClientRect();
100
+ if (!rect || !onViewportChange) {
101
+ return;
102
+ }
103
+ const mx = e.clientX - rect.left;
104
+ const my = e.clientY - rect.top;
105
+ const docX = mx / scale - viewport.width / 2;
106
+ const docY = my / scale - viewport.height / 2;
107
+ onViewportChange({
108
+ x: Math.max(0, Math.min(documentWidth - viewport.width, docX)),
109
+ y: Math.max(0, Math.min(documentHeight - viewport.height, docY)),
110
+ width: viewport.width,
111
+ height: viewport.height
112
+ });
113
+ }
114
+ if (!visible) {
115
+ return null;
116
+ }
117
+ const positionStyles = {
118
+ "top-left": { top: 8, left: 8 },
119
+ "top-right": { top: 8, right: 8 },
120
+ "bottom-left": { bottom: 8, left: 8 },
121
+ "bottom-right": { bottom: 8, right: 8 }
122
+ };
123
+ return React.createElement(
124
+ "div",
125
+ {
126
+ className: `nice-minimap ${className}`,
127
+ style: {
128
+ position: "absolute",
129
+ ...positionStyles[position],
130
+ opacity,
131
+ borderRadius: 4,
132
+ overflow: "hidden",
133
+ border: "1px solid var(--nice-overlay-light-20, rgba(255, 255, 255, 0.2))",
134
+ cursor: "crosshair",
135
+ zIndex: 100
136
+ }
137
+ },
138
+ React.createElement("canvas", {
139
+ ref: minimapCanvasRef,
140
+ width: mapW,
141
+ height: mapH,
142
+ onPointerDown: handlePointerDown,
143
+ onPointerMove: handlePointerMove,
144
+ onPointerUp: handlePointerUp,
145
+ style: { display: "block" }
146
+ })
147
+ );
147
148
  };
148
- // ── Hook ────────────────────────────────────────────────────────
149
- /** Hook for managing minimap visibility state. */
150
149
  function useMinimap(initialVisible = true) {
151
- const [visible, setVisible] = React.useState(initialVisible);
152
- const toggle = React.useCallback(() => setVisible((v) => !v), []);
153
- return { visible, setVisible, toggle };
150
+ const [visible, setVisible] = React.useState(initialVisible);
151
+ const toggle = React.useCallback(() => setVisible((v) => !v), []);
152
+ return { visible, setVisible, toggle };
154
153
  }
155
-
156
- export { Minimap, useMinimap };
154
+ export {
155
+ Minimap,
156
+ useMinimap
157
+ };
@@ -1,127 +1,117 @@
1
- import React from 'react';
2
-
3
- /**
4
- * plugins.ts — Plugin system for @nice2dev/ui-graphics editors.
5
- *
6
- * Allows third-party extensions to register custom tools, filters,
7
- * export formats, and UI panels for any editor.
8
- */
9
- // ── Plugin Registry ─────────────────────────────────────────────
1
+ import React from "react";
10
2
  class PluginRegistryImpl {
11
- constructor() {
12
- this.plugins = new Map();
13
- this.listeners = new Map();
3
+ constructor() {
4
+ this.plugins = /* @__PURE__ */ new Map();
5
+ this.listeners = /* @__PURE__ */ new Map();
6
+ }
7
+ /** Register a plugin. Calls onInit if defined. */
8
+ register(plugin) {
9
+ if (this.plugins.has(plugin.id)) {
10
+ console.warn(`[PluginRegistry] Plugin "${plugin.id}" already registered, replacing.`);
11
+ this.unregister(plugin.id);
14
12
  }
15
- /** Register a plugin. Calls onInit if defined. */
16
- register(plugin) {
17
- var _a;
18
- if (this.plugins.has(plugin.id)) {
19
- console.warn(`[PluginRegistry] Plugin "${plugin.id}" already registered, replacing.`);
20
- this.unregister(plugin.id);
21
- }
22
- this.plugins.set(plugin.id, plugin);
23
- (_a = plugin.onInit) === null || _a === void 0 ? void 0 : _a.call(plugin);
24
- this.emit('register', plugin);
13
+ this.plugins.set(plugin.id, plugin);
14
+ plugin.onInit?.();
15
+ this.emit("register", plugin);
16
+ }
17
+ /** Unregister a plugin. Calls onDestroy if defined. */
18
+ unregister(pluginId) {
19
+ const plugin = this.plugins.get(pluginId);
20
+ if (plugin) {
21
+ plugin.onDestroy?.();
22
+ this.plugins.delete(pluginId);
23
+ this.emit("unregister", plugin);
25
24
  }
26
- /** Unregister a plugin. Calls onDestroy if defined. */
27
- unregister(pluginId) {
28
- var _a;
29
- const plugin = this.plugins.get(pluginId);
30
- if (plugin) {
31
- (_a = plugin.onDestroy) === null || _a === void 0 ? void 0 : _a.call(plugin);
32
- this.plugins.delete(pluginId);
33
- this.emit('unregister', plugin);
34
- }
25
+ }
26
+ /** Get a registered plugin by ID. */
27
+ get(pluginId) {
28
+ return this.plugins.get(pluginId);
29
+ }
30
+ /** Get all registered plugins. */
31
+ getAll() {
32
+ return Array.from(this.plugins.values());
33
+ }
34
+ /** Get plugins for a specific editor type. */
35
+ getForEditor(editor) {
36
+ return this.getAll().filter(
37
+ (p) => !p.editors || p.editors.length === 0 || p.editors.includes(editor)
38
+ );
39
+ }
40
+ /** Get all tools from plugins for a specific editor. */
41
+ getTools(editor) {
42
+ return this.getForEditor(editor).flatMap((p) => p.tools ?? []);
43
+ }
44
+ /** Get all filters from plugins for a specific editor. */
45
+ getFilters(editor) {
46
+ return this.getForEditor(editor).flatMap((p) => p.filters ?? []);
47
+ }
48
+ /** Get all exporters from plugins for a specific editor. */
49
+ getExporters(editor) {
50
+ return this.getForEditor(editor).flatMap((p) => p.exporters ?? []);
51
+ }
52
+ /** Get all panels from plugins for a specific editor. */
53
+ getPanels(editor) {
54
+ return this.getForEditor(editor).flatMap((p) => p.panels ?? []);
55
+ }
56
+ /** Get all menu actions from plugins for a specific editor. */
57
+ getMenuActions(editor) {
58
+ return this.getForEditor(editor).flatMap((p) => p.menuActions ?? []);
59
+ }
60
+ /** Subscribe to registry events. */
61
+ on(event, handler) {
62
+ if (!this.listeners.has(event)) {
63
+ this.listeners.set(event, /* @__PURE__ */ new Set());
35
64
  }
36
- /** Get a registered plugin by ID. */
37
- get(pluginId) {
38
- return this.plugins.get(pluginId);
39
- }
40
- /** Get all registered plugins. */
41
- getAll() {
42
- return Array.from(this.plugins.values());
43
- }
44
- /** Get plugins for a specific editor type. */
45
- getForEditor(editor) {
46
- return this.getAll().filter((p) => !p.editors || p.editors.length === 0 || p.editors.includes(editor));
47
- }
48
- /** Get all tools from plugins for a specific editor. */
49
- getTools(editor) {
50
- return this.getForEditor(editor).flatMap((p) => { var _a; return (_a = p.tools) !== null && _a !== void 0 ? _a : []; });
51
- }
52
- /** Get all filters from plugins for a specific editor. */
53
- getFilters(editor) {
54
- return this.getForEditor(editor).flatMap((p) => { var _a; return (_a = p.filters) !== null && _a !== void 0 ? _a : []; });
55
- }
56
- /** Get all exporters from plugins for a specific editor. */
57
- getExporters(editor) {
58
- return this.getForEditor(editor).flatMap((p) => { var _a; return (_a = p.exporters) !== null && _a !== void 0 ? _a : []; });
59
- }
60
- /** Get all panels from plugins for a specific editor. */
61
- getPanels(editor) {
62
- return this.getForEditor(editor).flatMap((p) => { var _a; return (_a = p.panels) !== null && _a !== void 0 ? _a : []; });
63
- }
64
- /** Get all menu actions from plugins for a specific editor. */
65
- getMenuActions(editor) {
66
- return this.getForEditor(editor).flatMap((p) => { var _a; return (_a = p.menuActions) !== null && _a !== void 0 ? _a : []; });
67
- }
68
- /** Subscribe to registry events. */
69
- on(event, handler) {
70
- if (!this.listeners.has(event)) {
71
- this.listeners.set(event, new Set());
72
- }
73
- this.listeners.get(event).add(handler);
74
- return () => { var _a; return (_a = this.listeners.get(event)) === null || _a === void 0 ? void 0 : _a.delete(handler); };
75
- }
76
- emit(event, plugin) {
77
- var _a;
78
- (_a = this.listeners.get(event)) === null || _a === void 0 ? void 0 : _a.forEach((h) => h(plugin));
79
- }
80
- /** Clear all plugins. */
81
- clear() {
82
- var _a;
83
- for (const plugin of this.plugins.values()) {
84
- (_a = plugin.onDestroy) === null || _a === void 0 ? void 0 : _a.call(plugin);
85
- }
86
- this.plugins.clear();
65
+ this.listeners.get(event).add(handler);
66
+ return () => this.listeners.get(event)?.delete(handler);
67
+ }
68
+ emit(event, plugin) {
69
+ this.listeners.get(event)?.forEach((h) => h(plugin));
70
+ }
71
+ /** Clear all plugins. */
72
+ clear() {
73
+ for (const plugin of this.plugins.values()) {
74
+ plugin.onDestroy?.();
87
75
  }
76
+ this.plugins.clear();
77
+ }
88
78
  }
89
- /** Global plugin registry singleton. */
90
79
  const PluginRegistry = new PluginRegistryImpl();
91
- // ── React Hook ──────────────────────────────────────────────────
92
- /** React hook that returns plugins for a specific editor, re-renders on changes. */
93
80
  function usePlugins(editor) {
94
- const [, setTick] = React.useState(0);
95
- React.useEffect(() => {
96
- const unsub1 = PluginRegistry.on('register', () => setTick((t) => t + 1));
97
- const unsub2 = PluginRegistry.on('unregister', () => setTick((t) => t + 1));
98
- return () => {
99
- unsub1();
100
- unsub2();
101
- };
102
- }, []);
103
- return {
104
- plugins: PluginRegistry.getForEditor(editor),
105
- tools: PluginRegistry.getTools(editor),
106
- filters: PluginRegistry.getFilters(editor),
107
- exporters: PluginRegistry.getExporters(editor),
108
- panels: PluginRegistry.getPanels(editor),
109
- menuActions: PluginRegistry.getMenuActions(editor),
81
+ const [, setTick] = React.useState(0);
82
+ React.useEffect(() => {
83
+ const unsub1 = PluginRegistry.on("register", () => setTick((t) => t + 1));
84
+ const unsub2 = PluginRegistry.on("unregister", () => setTick((t) => t + 1));
85
+ return () => {
86
+ unsub1();
87
+ unsub2();
110
88
  };
89
+ }, []);
90
+ return {
91
+ plugins: PluginRegistry.getForEditor(editor),
92
+ tools: PluginRegistry.getTools(editor),
93
+ filters: PluginRegistry.getFilters(editor),
94
+ exporters: PluginRegistry.getExporters(editor),
95
+ panels: PluginRegistry.getPanels(editor),
96
+ menuActions: PluginRegistry.getMenuActions(editor)
97
+ };
111
98
  }
112
- // ── Plugin Context (React) ──────────────────────────────────────
113
99
  const PluginContext = /* @__PURE__ */ React.createContext(PluginRegistry);
114
100
  const NicePluginProvider = ({ plugins, children }) => {
115
- React.useEffect(() => {
116
- if (plugins) {
117
- plugins.forEach((p) => PluginRegistry.register(p));
118
- return () => plugins.forEach((p) => PluginRegistry.unregister(p.id));
119
- }
120
- }, [plugins]);
121
- return React.createElement(PluginContext.Provider, { value: PluginRegistry }, children);
101
+ React.useEffect(() => {
102
+ if (plugins) {
103
+ plugins.forEach((p) => PluginRegistry.register(p));
104
+ return () => plugins.forEach((p) => PluginRegistry.unregister(p.id));
105
+ }
106
+ }, [plugins]);
107
+ return React.createElement(PluginContext.Provider, { value: PluginRegistry }, children);
122
108
  };
123
109
  function usePluginRegistry() {
124
- return React.useContext(PluginContext);
110
+ return React.useContext(PluginContext);
125
111
  }
126
-
127
- export { NicePluginProvider, PluginRegistry, usePluginRegistry, usePlugins };
112
+ export {
113
+ NicePluginProvider,
114
+ PluginRegistry,
115
+ usePluginRegistry,
116
+ usePlugins
117
+ };