@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,319 +1,258 @@
1
- 'use strict';
2
-
3
- var React = require('react');
4
-
5
- /**
6
- * yjsCollaboration.ts — Yjs/CRDT-based collaborative editing adapter
7
- *
8
- * Features:
9
- * - CRDT-based conflict-free state synchronization
10
- * - YMap, YArray, YText document structure for canvas state
11
- * - Awareness protocol for cursors, selections, presence
12
- * - Undo/Redo manager with CRDT-based tracking
13
- * - Offline support with automatic conflict resolution on reconnect
14
- * - Pluggable providers: WebSocket, WebRTC, IndexedDB persistence
15
- *
16
- * This module can be used standalone or as a transport for the existing
17
- * CollaborationTransport interface in collaboration.ts.
18
- */
19
- /* ── CRDT Operations ── */
20
- /**
21
- * Apply a canvas object change to the CRDT doc.
22
- * All changes propagate automatically to peers.
23
- */
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const React = require("react");
24
4
  function applyObjectChange(objectsMap, objectId, changes, doc) {
25
- doc.transact(() => {
26
- const existing = objectsMap.get(objectId);
27
- if (existing) {
28
- const updated = { ...existing, ...changes };
29
- objectsMap.set(objectId, updated);
30
- }
31
- });
5
+ doc.transact(() => {
6
+ const existing = objectsMap.get(objectId);
7
+ if (existing) {
8
+ const updated = { ...existing, ...changes };
9
+ objectsMap.set(objectId, updated);
10
+ }
11
+ });
32
12
  }
33
- /**
34
- * Add a new object to the CRDT document.
35
- */
36
13
  function addObject(objectsMap, object, doc) {
37
- doc.transact(() => {
38
- objectsMap.set(object.id, { ...object });
39
- });
14
+ doc.transact(() => {
15
+ objectsMap.set(object.id, { ...object });
16
+ });
40
17
  }
41
- /**
42
- * Remove an object from the CRDT document.
43
- */
44
18
  function removeObject(objectsMap, objectId, doc) {
45
- doc.transact(() => {
46
- objectsMap.delete(objectId);
47
- });
19
+ doc.transact(() => {
20
+ objectsMap.delete(objectId);
21
+ });
48
22
  }
49
- /**
50
- * Batch update multiple objects atomically.
51
- */
52
23
  function batchUpdate(objectsMap, updates, doc) {
53
- doc.transact(() => {
54
- for (const { id, changes } of updates) {
55
- const existing = objectsMap.get(id);
56
- if (existing) {
57
- objectsMap.set(id, { ...existing, ...changes });
58
- }
59
- }
60
- });
24
+ doc.transact(() => {
25
+ for (const { id, changes } of updates) {
26
+ const existing = objectsMap.get(id);
27
+ if (existing) {
28
+ objectsMap.set(id, { ...existing, ...changes });
29
+ }
30
+ }
31
+ });
61
32
  }
62
- /* ── Awareness Helpers ── */
63
- /**
64
- * Update local cursor position in awareness.
65
- */
66
33
  function updateCursor(awareness, x, y) {
67
- awareness.setLocalStateField('cursor', { x, y });
68
- awareness.setLocalStateField('lastSeen', Date.now());
34
+ awareness.setLocalStateField("cursor", { x, y });
35
+ awareness.setLocalStateField("lastSeen", Date.now());
69
36
  }
70
- /**
71
- * Update local selection in awareness.
72
- */
73
37
  function updateSelection(awareness, selectedIds) {
74
- awareness.setLocalStateField('selection', selectedIds);
38
+ awareness.setLocalStateField("selection", selectedIds);
75
39
  }
76
- /**
77
- * Get all remote presences (excluding self).
78
- */
79
40
  function getRemotePresences(awareness, localClientId) {
80
- const presences = [];
81
- awareness.getStates().forEach((state, clientId) => {
82
- if (clientId !== localClientId && state.userId) {
83
- presences.push(state);
84
- }
85
- });
86
- return presences;
41
+ const presences = [];
42
+ awareness.getStates().forEach((state, clientId) => {
43
+ if (clientId !== localClientId && state.userId) {
44
+ presences.push(state);
45
+ }
46
+ });
47
+ return presences;
87
48
  }
88
- /**
89
- * React hook for Yjs/CRDT-based collaborative canvas editing.
90
- *
91
- * Requires yjs and a provider (e.g., y-websocket) as peer dependencies.
92
- * Falls back gracefully if yjs is not installed — returns a local-only state.
93
- */
94
49
  function useYjsCollaboration(config) {
95
- const [objects, setObjects] = React.useState([]);
96
- const [presence, _setPresence] = React.useState([]);
97
- const [isConnected, setIsConnected] = React.useState(false);
98
- const [isSynced, setIsSynced] = React.useState(false);
99
- const [canUndo, setCanUndo] = React.useState(false);
100
- const [canRedo, setCanRedo] = React.useState(false);
101
- const docRef = React.useRef(null);
102
- const awarenessRef = React.useRef(null);
103
- const undoRef = React.useRef(null);
104
- const objectsMapRef = React.useRef(null);
105
- const providerRef = React.useRef(null);
106
- // Initialize Yjs doc and provider
107
- React.useEffect(() => {
108
- let cancelled = false;
109
- async function init() {
110
- var _a, _b;
111
- try {
112
- // Dynamic import — allows the package to be optional
113
- const Y = await Promise.resolve().then(function () { return require('../node_modules/yjs/dist/yjs.js'); });
114
- const doc = new Y.Doc();
115
- docRef.current = doc;
116
- const objectsMap = doc.getMap('objects');
117
- objectsMapRef.current = objectsMap;
118
- const awarenessLike = {
119
- _localState: {
120
- userId: config.userId,
121
- userName: config.userName,
122
- color: config.userColor,
123
- cursor: null,
124
- selection: [],
125
- activeTool: 'select',
126
- isTyping: false,
127
- lastSeen: Date.now(),
128
- },
129
- _states: new Map(),
130
- _listeners: new Map(),
131
- setLocalState(state) {
132
- this._localState = state;
133
- },
134
- setLocalStateField(field, value) {
135
- const self = this;
136
- if (self._localState) {
137
- self._localState[field] = value;
138
- }
139
- },
140
- getLocalState() {
141
- return this._localState;
142
- },
143
- getStates() {
144
- return this._states;
145
- },
146
- on(event, handler) {
147
- const self = this;
148
- if (!self._listeners.has(event)) {
149
- self._listeners.set(event, new Set());
150
- }
151
- self._listeners.get(event).add(handler);
152
- },
153
- off(event, handler) {
154
- var _a;
155
- (_a = this._listeners.get(event)) === null || _a === void 0 ? void 0 : _a.delete(handler);
156
- },
157
- destroy() {
158
- this._listeners.clear();
159
- },
160
- };
161
- awarenessRef.current = awarenessLike;
162
- // Setup undo manager
163
- try {
164
- const undoMgr = new Y.UndoManager(objectsMap);
165
- undoRef.current = undoMgr;
166
- undoMgr.on('stack-item-added', () => {
167
- if (!cancelled) {
168
- setCanUndo(undoMgr.canUndo());
169
- setCanRedo(undoMgr.canRedo());
170
- }
171
- });
172
- }
173
- catch (_c) {
174
- // UndoManager may not be available in all Yjs versions
175
- }
176
- // Observe changes
177
- objectsMap.observe(() => {
178
- if (!cancelled) {
179
- const objs = [];
180
- objectsMap.entries();
181
- const json = objectsMap.toJSON();
182
- for (const val of Object.values(json)) {
183
- if (val && typeof val === 'object' && 'id' in val) {
184
- objs.push(val);
185
- }
186
- }
187
- objs.sort((a, b) => a.zIndex - b.zIndex);
188
- setObjects(objs);
189
- }
190
- });
191
- // Connect provider
192
- if (config.provider.type === 'websocket' && config.provider.serverUrl) {
193
- try {
194
- const wsModule = await Promise.resolve().then(function () { return require('../node_modules/y-websocket/src/y-websocket.js'); });
195
- const provider = new wsModule.WebsocketProvider(config.provider.serverUrl, config.provider.roomId, doc);
196
- providerRef.current = provider;
197
- const providerWithEvents = provider;
198
- (_a = providerWithEvents.on) === null || _a === void 0 ? void 0 : _a.call(providerWithEvents, 'status', (e) => {
199
- if (!cancelled) {
200
- setIsConnected(e.status === 'connected');
201
- }
202
- });
203
- (_b = providerWithEvents.on) === null || _b === void 0 ? void 0 : _b.call(providerWithEvents, 'sync', (synced) => {
204
- if (!cancelled) {
205
- setIsSynced(synced);
206
- }
207
- });
208
- }
209
- catch (_d) {
210
- // y-websocket not installed — local-only mode
211
- setIsConnected(false);
212
- setIsSynced(true);
213
- }
214
- }
215
- else {
216
- setIsConnected(false);
217
- setIsSynced(true);
218
- }
50
+ const [objects, setObjects] = React.useState([]);
51
+ const [presence, _setPresence] = React.useState([]);
52
+ const [isConnected, setIsConnected] = React.useState(false);
53
+ const [isSynced, setIsSynced] = React.useState(false);
54
+ const [canUndo, setCanUndo] = React.useState(false);
55
+ const [canRedo, setCanRedo] = React.useState(false);
56
+ const docRef = React.useRef(null);
57
+ const awarenessRef = React.useRef(null);
58
+ const undoRef = React.useRef(null);
59
+ const objectsMapRef = React.useRef(null);
60
+ const providerRef = React.useRef(null);
61
+ React.useEffect(() => {
62
+ let cancelled = false;
63
+ async function init() {
64
+ try {
65
+ const Y = await Promise.resolve().then(() => require("../node_modules/yjs/dist/yjs.js"));
66
+ const doc = new Y.Doc();
67
+ docRef.current = doc;
68
+ const objectsMap = doc.getMap("objects");
69
+ objectsMapRef.current = objectsMap;
70
+ const awarenessLike = {
71
+ _localState: {
72
+ userId: config.userId,
73
+ userName: config.userName,
74
+ color: config.userColor,
75
+ cursor: null,
76
+ selection: [],
77
+ activeTool: "select",
78
+ isTyping: false,
79
+ lastSeen: Date.now()
80
+ },
81
+ _states: /* @__PURE__ */ new Map(),
82
+ _listeners: /* @__PURE__ */ new Map(),
83
+ setLocalState(state) {
84
+ this._localState = state;
85
+ },
86
+ setLocalStateField(field, value) {
87
+ const self = this;
88
+ if (self._localState) {
89
+ self._localState[field] = value;
219
90
  }
220
- catch (_e) {
221
- // yjs not installed — local-only fallback
222
- setIsConnected(false);
223
- setIsSynced(true);
91
+ },
92
+ getLocalState() {
93
+ return this._localState;
94
+ },
95
+ getStates() {
96
+ return this._states;
97
+ },
98
+ on(event, handler) {
99
+ const self = this;
100
+ if (!self._listeners.has(event)) {
101
+ self._listeners.set(event, /* @__PURE__ */ new Set());
224
102
  }
225
- }
226
- init();
227
- return () => {
228
- var _a, _b, _c, _d;
229
- cancelled = true;
230
- (_a = providerRef.current) === null || _a === void 0 ? void 0 : _a.destroy();
231
- (_b = awarenessRef.current) === null || _b === void 0 ? void 0 : _b.destroy();
232
- (_c = undoRef.current) === null || _c === void 0 ? void 0 : _c.destroy();
233
- (_d = docRef.current) === null || _d === void 0 ? void 0 : _d.destroy();
103
+ self._listeners.get(event).add(handler);
104
+ },
105
+ off(event, handler) {
106
+ this._listeners.get(event)?.delete(handler);
107
+ },
108
+ destroy() {
109
+ this._listeners.clear();
110
+ }
234
111
  };
235
- }, [
236
- config.provider.roomId,
237
- config.provider.serverUrl,
238
- config.provider.type,
239
- config.userId,
240
- config.userName,
241
- config.userColor,
242
- ]);
243
- const addObjectFn = React.useCallback((obj) => {
244
- if (objectsMapRef.current && docRef.current) {
245
- addObject(objectsMapRef.current, obj, docRef.current);
246
- }
247
- else {
248
- // Local-only fallback
249
- setObjects((prev) => [...prev, obj].sort((a, b) => a.zIndex - b.zIndex));
250
- }
251
- }, []);
252
- const updateObjectFn = React.useCallback((id, changes) => {
253
- if (objectsMapRef.current && docRef.current) {
254
- applyObjectChange(objectsMapRef.current, id, changes, docRef.current);
255
- }
256
- else {
257
- setObjects((prev) => prev.map((o) => (o.id === id ? { ...o, ...changes } : o)));
258
- }
259
- }, []);
260
- const removeObjectFn = React.useCallback((id) => {
261
- if (objectsMapRef.current && docRef.current) {
262
- removeObject(objectsMapRef.current, id, docRef.current);
263
- }
264
- else {
265
- setObjects((prev) => prev.filter((o) => o.id !== id));
266
- }
267
- }, []);
268
- const batchUpdateFn = React.useCallback((updates) => {
269
- if (objectsMapRef.current && docRef.current) {
270
- batchUpdate(objectsMapRef.current, updates, docRef.current);
112
+ awarenessRef.current = awarenessLike;
113
+ try {
114
+ const undoMgr = new Y.UndoManager(objectsMap);
115
+ undoRef.current = undoMgr;
116
+ undoMgr.on("stack-item-added", () => {
117
+ if (!cancelled) {
118
+ setCanUndo(undoMgr.canUndo());
119
+ setCanRedo(undoMgr.canRedo());
120
+ }
121
+ });
122
+ } catch {
271
123
  }
272
- else {
273
- setObjects((prev) => {
274
- const map = new Map(prev.map((o) => [o.id, o]));
275
- for (const { id, changes } of updates) {
276
- const existing = map.get(id);
277
- if (existing) {
278
- map.set(id, { ...existing, ...changes });
279
- }
280
- }
281
- return [...map.values()].sort((a, b) => a.zIndex - b.zIndex);
124
+ objectsMap.observe(() => {
125
+ if (!cancelled) {
126
+ const objs = [];
127
+ objectsMap.entries();
128
+ const json = objectsMap.toJSON();
129
+ for (const val of Object.values(json)) {
130
+ if (val && typeof val === "object" && "id" in val) {
131
+ objs.push(val);
132
+ }
133
+ }
134
+ objs.sort((a, b) => a.zIndex - b.zIndex);
135
+ setObjects(objs);
136
+ }
137
+ });
138
+ if (config.provider.type === "websocket" && config.provider.serverUrl) {
139
+ try {
140
+ const wsModule = await Promise.resolve().then(() => require("../node_modules/y-websocket/src/y-websocket.js"));
141
+ const provider = new wsModule.WebsocketProvider(
142
+ config.provider.serverUrl,
143
+ config.provider.roomId,
144
+ doc
145
+ );
146
+ providerRef.current = provider;
147
+ const providerWithEvents = provider;
148
+ providerWithEvents.on?.("status", (e) => {
149
+ if (!cancelled) {
150
+ setIsConnected(e.status === "connected");
151
+ }
282
152
  });
153
+ providerWithEvents.on?.("sync", (synced) => {
154
+ if (!cancelled) {
155
+ setIsSynced(synced);
156
+ }
157
+ });
158
+ } catch {
159
+ setIsConnected(false);
160
+ setIsSynced(true);
161
+ }
162
+ } else {
163
+ setIsConnected(false);
164
+ setIsSynced(true);
283
165
  }
284
- }, []);
285
- const updateCursorFn = React.useCallback((x, y) => {
286
- if (awarenessRef.current) {
287
- updateCursor(awarenessRef.current, x, y);
288
- }
289
- }, []);
290
- const updateSelectionFn = React.useCallback((ids) => {
291
- if (awarenessRef.current) {
292
- updateSelection(awarenessRef.current, ids);
293
- }
294
- }, []);
295
- const undoFn = React.useCallback(() => {
296
- var _a;
297
- (_a = undoRef.current) === null || _a === void 0 ? void 0 : _a.undo();
298
- }, []);
299
- const redoFn = React.useCallback(() => {
300
- var _a;
301
- (_a = undoRef.current) === null || _a === void 0 ? void 0 : _a.redo();
302
- }, []);
303
- return {
304
- state: { objects, presence, canUndo, canRedo, isConnected, isSynced },
305
- addObject: addObjectFn,
306
- updateObject: updateObjectFn,
307
- removeObject: removeObjectFn,
308
- batchUpdate: batchUpdateFn,
309
- updateCursor: updateCursorFn,
310
- updateSelection: updateSelectionFn,
311
- undo: undoFn,
312
- redo: redoFn,
313
- isConnected,
166
+ } catch {
167
+ setIsConnected(false);
168
+ setIsSynced(true);
169
+ }
170
+ }
171
+ init();
172
+ return () => {
173
+ cancelled = true;
174
+ providerRef.current?.destroy();
175
+ awarenessRef.current?.destroy();
176
+ undoRef.current?.destroy();
177
+ docRef.current?.destroy();
314
178
  };
179
+ }, [
180
+ config.provider.roomId,
181
+ config.provider.serverUrl,
182
+ config.provider.type,
183
+ config.userId,
184
+ config.userName,
185
+ config.userColor
186
+ ]);
187
+ const addObjectFn = React.useCallback((obj) => {
188
+ if (objectsMapRef.current && docRef.current) {
189
+ addObject(objectsMapRef.current, obj, docRef.current);
190
+ } else {
191
+ setObjects((prev) => [...prev, obj].sort((a, b) => a.zIndex - b.zIndex));
192
+ }
193
+ }, []);
194
+ const updateObjectFn = React.useCallback((id, changes) => {
195
+ if (objectsMapRef.current && docRef.current) {
196
+ applyObjectChange(objectsMapRef.current, id, changes, docRef.current);
197
+ } else {
198
+ setObjects((prev) => prev.map((o) => o.id === id ? { ...o, ...changes } : o));
199
+ }
200
+ }, []);
201
+ const removeObjectFn = React.useCallback((id) => {
202
+ if (objectsMapRef.current && docRef.current) {
203
+ removeObject(objectsMapRef.current, id, docRef.current);
204
+ } else {
205
+ setObjects((prev) => prev.filter((o) => o.id !== id));
206
+ }
207
+ }, []);
208
+ const batchUpdateFn = React.useCallback(
209
+ (updates) => {
210
+ if (objectsMapRef.current && docRef.current) {
211
+ batchUpdate(objectsMapRef.current, updates, docRef.current);
212
+ } else {
213
+ setObjects((prev) => {
214
+ const map = new Map(prev.map((o) => [o.id, o]));
215
+ for (const { id, changes } of updates) {
216
+ const existing = map.get(id);
217
+ if (existing) {
218
+ map.set(id, { ...existing, ...changes });
219
+ }
220
+ }
221
+ return [...map.values()].sort((a, b) => a.zIndex - b.zIndex);
222
+ });
223
+ }
224
+ },
225
+ []
226
+ );
227
+ const updateCursorFn = React.useCallback((x, y) => {
228
+ if (awarenessRef.current) {
229
+ updateCursor(awarenessRef.current, x, y);
230
+ }
231
+ }, []);
232
+ const updateSelectionFn = React.useCallback((ids) => {
233
+ if (awarenessRef.current) {
234
+ updateSelection(awarenessRef.current, ids);
235
+ }
236
+ }, []);
237
+ const undoFn = React.useCallback(() => {
238
+ undoRef.current?.undo();
239
+ }, []);
240
+ const redoFn = React.useCallback(() => {
241
+ undoRef.current?.redo();
242
+ }, []);
243
+ return {
244
+ state: { objects, presence, canUndo, canRedo, isConnected, isSynced },
245
+ addObject: addObjectFn,
246
+ updateObject: updateObjectFn,
247
+ removeObject: removeObjectFn,
248
+ batchUpdate: batchUpdateFn,
249
+ updateCursor: updateCursorFn,
250
+ updateSelection: updateSelectionFn,
251
+ undo: undoFn,
252
+ redo: redoFn,
253
+ isConnected
254
+ };
315
255
  }
316
-
317
256
  exports.addObject = addObject;
318
257
  exports.applyObjectChange = applyObjectChange;
319
258
  exports.batchUpdate = batchUpdate;
@@ -1,25 +1,15 @@
1
- 'use strict';
2
-
3
- /**
4
- * UI/UX Design Tools — Wireframes, mockups, prototyping,
5
- * design tokens, component library, responsive preview,
6
- * handoff, comments, versioning, Figma/Sketch/XD import, code export.
7
- *
8
- * PRO-4.6 — 13 items
9
- *
10
- * @module @nice2dev/ui-graphics/design/design-tools
11
- */
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
12
3
  const DEVICE_PRESETS = [
13
- { name: 'iPhone 15', width: 393, height: 852, devicePixelRatio: 3, type: 'phone' },
14
- { name: 'iPhone 15 Pro Max', width: 430, height: 932, devicePixelRatio: 3, type: 'phone' },
15
- { name: 'Samsung Galaxy S24', width: 360, height: 780, devicePixelRatio: 3, type: 'phone' },
16
- { name: 'Pixel 8', width: 412, height: 915, devicePixelRatio: 2.625, type: 'phone' },
17
- { name: 'iPad Air', width: 820, height: 1180, devicePixelRatio: 2, type: 'tablet' },
18
- { name: 'iPad Pro 12.9"', width: 1024, height: 1366, devicePixelRatio: 2, type: 'tablet' },
19
- { name: 'MacBook Pro 14"', width: 1512, height: 982, devicePixelRatio: 2, type: 'desktop' },
20
- { name: 'Desktop 1080p', width: 1920, height: 1080, devicePixelRatio: 1, type: 'desktop' },
21
- { name: 'Desktop 4K', width: 3840, height: 2160, devicePixelRatio: 2, type: 'desktop' },
22
- { name: 'Apple Watch Ultra', width: 205, height: 251, devicePixelRatio: 2, type: 'watch' },
4
+ { name: "iPhone 15", width: 393, height: 852, devicePixelRatio: 3, type: "phone" },
5
+ { name: "iPhone 15 Pro Max", width: 430, height: 932, devicePixelRatio: 3, type: "phone" },
6
+ { name: "Samsung Galaxy S24", width: 360, height: 780, devicePixelRatio: 3, type: "phone" },
7
+ { name: "Pixel 8", width: 412, height: 915, devicePixelRatio: 2.625, type: "phone" },
8
+ { name: "iPad Air", width: 820, height: 1180, devicePixelRatio: 2, type: "tablet" },
9
+ { name: 'iPad Pro 12.9"', width: 1024, height: 1366, devicePixelRatio: 2, type: "tablet" },
10
+ { name: 'MacBook Pro 14"', width: 1512, height: 982, devicePixelRatio: 2, type: "desktop" },
11
+ { name: "Desktop 1080p", width: 1920, height: 1080, devicePixelRatio: 1, type: "desktop" },
12
+ { name: "Desktop 4K", width: 3840, height: 2160, devicePixelRatio: 2, type: "desktop" },
13
+ { name: "Apple Watch Ultra", width: 205, height: 251, devicePixelRatio: 2, type: "watch" }
23
14
  ];
24
-
25
15
  exports.DEVICE_PRESETS = DEVICE_PRESETS;