@nice2dev/ui-3d 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 (108) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/cjs/collaborative/collaborativeScene.js +160 -206
  3. package/dist/cjs/core/editorAsk.js +51 -41
  4. package/dist/cjs/core/i18n.js +13 -14
  5. package/dist/cjs/core/threeCompat.js +29 -42
  6. package/dist/cjs/dance/DanceBridge.js +148 -177
  7. package/dist/cjs/dance/DanceScoreEngine.js +209 -221
  8. package/dist/cjs/dance/PoseDetector.js +302 -275
  9. package/dist/cjs/index.js +110 -113
  10. package/dist/cjs/material/MaterialEditor.module.css.js +242 -5
  11. package/dist/cjs/material/NiceMaterialEditor.js +1213 -757
  12. package/dist/cjs/material/materialEditorTypes.js +35 -49
  13. package/dist/cjs/material/materialEditorUtils.js +684 -747
  14. package/dist/cjs/material/materialNodeDefinitions.js +1411 -1459
  15. package/dist/cjs/model/ModelEditor.js +90 -40
  16. package/dist/cjs/model/ModelEditor.module.css.js +257 -5
  17. package/dist/cjs/model/ModelEditorLeftPanel.js +126 -47
  18. package/dist/cjs/model/ModelEditorMenuBar.js +359 -32
  19. package/dist/cjs/model/ModelEditorRightPanel.js +647 -131
  20. package/dist/cjs/model/ModelEditorSubComponents.js +277 -112
  21. package/dist/cjs/model/ModelEditorTimeline.js +232 -34
  22. package/dist/cjs/model/ModelEditorToolbar.js +170 -14
  23. package/dist/cjs/model/ModelEditorViewport.js +231 -39
  24. package/dist/cjs/model/ModelViewer.js +388 -63
  25. package/dist/cjs/model/ModelViewer.module.css.js +77 -5
  26. package/dist/cjs/model/NiceArmatureEditor.js +473 -274
  27. package/dist/cjs/model/NiceMorphTargetEditor.js +333 -227
  28. package/dist/cjs/model/NiceOctree.js +372 -320
  29. package/dist/cjs/model/NicePhysicsSimulation.js +528 -298
  30. package/dist/cjs/model/NiceProceduralGeometry.js +673 -300
  31. package/dist/cjs/model/NiceTerrainEditor.js +595 -385
  32. package/dist/cjs/model/NiceWeightPainter.js +384 -261
  33. package/dist/cjs/model/NiceXRPreview.js +385 -308
  34. package/dist/cjs/model/cadModeUtils.js +103 -106
  35. package/dist/cjs/model/editorShortcuts.js +171 -194
  36. package/dist/cjs/model/modelEditorTypes.js +100 -118
  37. package/dist/cjs/model/modelEditorUtils.js +1061 -1146
  38. package/dist/cjs/model/simsModeUtils.js +1023 -1053
  39. package/dist/cjs/model/useModelEditor.js +1977 -1933
  40. package/dist/cjs/model/useModelViewer.js +633 -665
  41. package/dist/cjs/nice2dev-ui-3d.css +1 -1
  42. package/dist/cjs/particle/NiceParticleEditor.js +1186 -571
  43. package/dist/cjs/particle/ParticleEditor.module.css.js +122 -5
  44. package/dist/cjs/particle/particleEditorTypes.js +62 -70
  45. package/dist/cjs/particle/particleEditorUtils.js +998 -1013
  46. package/dist/cjs/rendering/NiceCascadedShadows.js +381 -259
  47. package/dist/cjs/rendering/NiceRenderExport.js +424 -337
  48. package/dist/cjs/rendering/NiceSSAO.js +454 -337
  49. package/dist/cjs/rendering/NiceSSR.js +387 -261
  50. package/dist/cjs/rendering/NiceWebGPURenderer.js +359 -230
  51. package/dist/cjs/uv/NiceUVEditor.js +787 -550
  52. package/dist/cjs/uv/UVEditor.module.css.js +53 -5
  53. package/dist/cjs/uv/uvEditorTypes.js +59 -76
  54. package/dist/cjs/uv/uvEditorUtils.js +501 -575
  55. package/dist/esm/collaborative/collaborativeScene.js +163 -205
  56. package/dist/esm/core/editorAsk.js +53 -40
  57. package/dist/esm/core/i18n.js +15 -13
  58. package/dist/esm/core/threeCompat.js +18 -26
  59. package/dist/esm/dance/DanceBridge.js +151 -176
  60. package/dist/esm/dance/DanceScoreEngine.js +211 -220
  61. package/dist/esm/dance/PoseDetector.js +304 -274
  62. package/dist/esm/index.js +258 -36
  63. package/dist/esm/material/MaterialEditor.module.css.js +242 -3
  64. package/dist/esm/material/NiceMaterialEditor.js +1215 -756
  65. package/dist/esm/material/materialEditorTypes.js +45 -48
  66. package/dist/esm/material/materialEditorUtils.js +713 -746
  67. package/dist/esm/material/materialNodeDefinitions.js +1415 -1458
  68. package/dist/esm/model/ModelEditor.js +91 -39
  69. package/dist/esm/model/ModelEditor.module.css.js +257 -3
  70. package/dist/esm/model/ModelEditorLeftPanel.js +126 -45
  71. package/dist/esm/model/ModelEditorMenuBar.js +359 -30
  72. package/dist/esm/model/ModelEditorRightPanel.js +634 -114
  73. package/dist/esm/model/ModelEditorSubComponents.js +265 -94
  74. package/dist/esm/model/ModelEditorTimeline.js +232 -32
  75. package/dist/esm/model/ModelEditorToolbar.js +170 -12
  76. package/dist/esm/model/ModelEditorViewport.js +231 -37
  77. package/dist/esm/model/ModelViewer.js +389 -62
  78. package/dist/esm/model/ModelViewer.module.css.js +77 -3
  79. package/dist/esm/model/NiceArmatureEditor.js +462 -258
  80. package/dist/esm/model/NiceMorphTargetEditor.js +322 -211
  81. package/dist/esm/model/NiceOctree.js +361 -304
  82. package/dist/esm/model/NicePhysicsSimulation.js +517 -282
  83. package/dist/esm/model/NiceProceduralGeometry.js +667 -284
  84. package/dist/esm/model/NiceTerrainEditor.js +584 -369
  85. package/dist/esm/model/NiceWeightPainter.js +373 -245
  86. package/dist/esm/model/NiceXRPreview.js +374 -292
  87. package/dist/esm/model/cadModeUtils.js +95 -88
  88. package/dist/esm/model/editorShortcuts.js +172 -193
  89. package/dist/esm/model/modelEditorTypes.js +90 -100
  90. package/dist/esm/model/modelEditorUtils.js +1056 -1128
  91. package/dist/esm/model/simsModeUtils.js +1021 -1035
  92. package/dist/esm/model/useModelEditor.js +1946 -1920
  93. package/dist/esm/model/useModelViewer.js +619 -647
  94. package/dist/esm/nice2dev-ui-3d.css +1 -1
  95. package/dist/esm/particle/NiceParticleEditor.js +1188 -570
  96. package/dist/esm/particle/ParticleEditor.module.css.js +122 -3
  97. package/dist/esm/particle/particleEditorTypes.js +69 -69
  98. package/dist/esm/particle/particleEditorUtils.js +1027 -1012
  99. package/dist/esm/rendering/NiceCascadedShadows.js +370 -243
  100. package/dist/esm/rendering/NiceRenderExport.js +413 -321
  101. package/dist/esm/rendering/NiceSSAO.js +450 -328
  102. package/dist/esm/rendering/NiceSSR.js +383 -252
  103. package/dist/esm/rendering/NiceWebGPURenderer.js +326 -214
  104. package/dist/esm/uv/NiceUVEditor.js +788 -549
  105. package/dist/esm/uv/UVEditor.module.css.js +53 -3
  106. package/dist/esm/uv/uvEditorTypes.js +68 -75
  107. package/dist/esm/uv/uvEditorUtils.js +515 -557
  108. package/package.json +7 -12
package/CHANGELOG.md CHANGED
@@ -1,5 +1,18 @@
1
1
  # @nice2dev/ui-3d — Changelog
2
2
 
3
+ ## 1.3.17
4
+
5
+ No changes in this release.
6
+
7
+ ## 1.3.16
8
+
9
+ ### Patch Changes
10
+
11
+ - dd48c3d: Built with Vite instead of rollup (the dependency audit allows no advisories, and rollup's node-resolve plugin
12
+ pulls one with no fixed release). The published files are the same — a module per source file in `dist/esm` and
13
+ `dist/cjs`, the same entries, the same stylesheet names — with esbuild's `/* @__PURE__ */` marks on JSX calls,
14
+ which help an app's tree-shaking.
15
+
3
16
  ## 1.3.15
4
17
 
5
18
  No changes in this release.
@@ -1,217 +1,171 @@
1
- 'use strict';
2
-
3
- /**
4
- * Collaborative 3D Scene — Multi-user 3D scene editing via Yjs CRDT + WebRTC data channel.
5
- *
6
- * Pattern follows collaborativeDiagram.ts / collaborativePresentation.ts:
7
- * - Yjs document with shared types (YMap, YArray)
8
- * - Awareness protocol for cursor/selection presence
9
- * - Provider abstraction (WebRTC, WebSocket, IndexedDB)
10
- * - UndoManager integration
11
- *
12
- * @module @nice2dev/ui-3d/collaborative
13
- */
14
- /* ================================================================
15
- SYNC HELPERS
16
- ================================================================ */
17
- /** Convert a Yjs objects map to SharedSceneObject[]. */
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
18
3
  function syncYjsToScene(objectsMap) {
19
- const json = objectsMap.toJSON();
20
- return Object.values(json);
4
+ const json = objectsMap.toJSON();
5
+ return Object.values(json);
21
6
  }
22
- /** Write SharedSceneObject[] into Yjs objects map. */
23
7
  function syncSceneToYjs(objects, objectsMap, doc) {
24
- doc.transact(() => {
25
- // Remove objects not in the new list
26
- const newIds = new Set(objects.map((o) => o.id));
27
- const existing = objectsMap.toJSON();
28
- for (const key of Object.keys(existing)) {
29
- if (!newIds.has(key)) {
30
- objectsMap.delete(key);
31
- }
32
- }
33
- // Upsert
34
- for (const obj of objects) {
35
- objectsMap.set(obj.id, obj);
36
- }
37
- });
8
+ doc.transact(() => {
9
+ const newIds = new Set(objects.map((o) => o.id));
10
+ const existing = objectsMap.toJSON();
11
+ for (const key of Object.keys(existing)) {
12
+ if (!newIds.has(key)) {
13
+ objectsMap.delete(key);
14
+ }
15
+ }
16
+ for (const obj of objects) {
17
+ objectsMap.set(obj.id, obj);
18
+ }
19
+ });
38
20
  }
39
- /**
40
- * useCollaborativeScene — Yjs-powered multi-user 3D scene editing.
41
- *
42
- * Usage:
43
- * ```ts
44
- * const { state, actions } = useCollaborativeScene({
45
- * createYDoc: () => new Y.Doc(),
46
- * createProvider: (doc, cfg) => new WebrtcProvider(cfg.room, doc),
47
- * createUndoManager: (scope) => new Y.UndoManager(scope),
48
- * providerConfig: { type: 'webrtc', room: 'scene-1' },
49
- * user: { id: 'u1', name: 'Alice', color: 'var(--nice-danger, #e74c3c)' },
50
- * });
51
- * ```
52
- */
53
21
  function useCollaborativeScene(options) {
54
- // This follows the exact same architecture as useCollaborativePresentation.
55
- // Implementation uses React refs for YDoc/provider and useState for reactive state.
56
- // All mutations go through doc.transact() for atomicity.
57
- const { createYDoc, createProvider, createUndoManager, providerConfig, user, initialObjects } = options;
58
- // Lazy-init refs (avoid re-creation on re-render)
59
- let docRef = null;
60
- let providerRef = null;
61
- let undoRef = null;
62
- // State (would use useState in real React hook — simplified for pure TS export)
63
- const stateSnapshot = {
64
- objects: initialObjects !== null && initialObjects !== void 0 ? initialObjects : [],
65
- collaborators: [],
66
- collaboratorSelections: new Map(),
67
- collaboratorTransforming: new Map(),
68
- collaboratorCameras: new Map(),
69
- connected: false,
70
- synced: false,
71
- };
72
- function getDoc() {
73
- if (!docRef) {
74
- docRef = createYDoc();
75
- }
76
- return docRef;
77
- }
78
- function getObjectsMap() {
79
- return getDoc().getMap('objects');
22
+ const { createYDoc, createProvider, createUndoManager, providerConfig, user, initialObjects } = options;
23
+ let docRef = null;
24
+ let providerRef = null;
25
+ let undoRef = null;
26
+ const stateSnapshot = {
27
+ objects: initialObjects ?? [],
28
+ collaborators: [],
29
+ collaboratorSelections: /* @__PURE__ */ new Map(),
30
+ collaboratorTransforming: /* @__PURE__ */ new Map(),
31
+ collaboratorCameras: /* @__PURE__ */ new Map(),
32
+ connected: false,
33
+ synced: false
34
+ };
35
+ function getDoc() {
36
+ if (!docRef) {
37
+ docRef = createYDoc();
80
38
  }
81
- // ── Actions ─────────────────────────────────────────────
82
- function generateId() {
83
- return `obj_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`;
39
+ return docRef;
40
+ }
41
+ function getObjectsMap() {
42
+ return getDoc().getMap("objects");
43
+ }
44
+ function generateId() {
45
+ return `obj_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`;
46
+ }
47
+ const actions = {
48
+ addObject(obj) {
49
+ const id = generateId();
50
+ const full = { ...obj, id };
51
+ getDoc().transact(() => {
52
+ getObjectsMap().set(id, full);
53
+ });
54
+ return id;
55
+ },
56
+ updateObject(id, patch) {
57
+ const map = getObjectsMap();
58
+ const existing = map.get(id);
59
+ if (!existing) {
60
+ return;
61
+ }
62
+ getDoc().transact(() => {
63
+ map.set(id, { ...existing, ...patch, id });
64
+ });
65
+ },
66
+ deleteObject(id) {
67
+ getDoc().transact(() => {
68
+ getObjectsMap().delete(id);
69
+ });
70
+ },
71
+ reparentObject(id, newParentId) {
72
+ actions.updateObject(id, { parentId: newParentId });
73
+ },
74
+ setTransform(id, transform) {
75
+ actions.updateObject(id, { transform });
76
+ },
77
+ setVisibility(id, visible) {
78
+ actions.updateObject(id, { visible });
79
+ },
80
+ setMaterial(id, material) {
81
+ actions.updateObject(id, { material });
82
+ },
83
+ setSelectedObjects(ids) {
84
+ providerRef?.awareness.setLocalStateField("selectedObjects", ids);
85
+ },
86
+ setTransformingObject(id) {
87
+ providerRef?.awareness.setLocalStateField("transformingObject", id);
88
+ },
89
+ setCamera(cam) {
90
+ providerRef?.awareness.setLocalStateField("camera", cam);
91
+ },
92
+ undo() {
93
+ undoRef?.undo();
94
+ },
95
+ redo() {
96
+ undoRef?.redo();
97
+ },
98
+ get canUndo() {
99
+ return undoRef?.canUndo() ?? false;
100
+ },
101
+ get canRedo() {
102
+ return undoRef?.canRedo() ?? false;
103
+ },
104
+ async connect() {
105
+ const doc = getDoc();
106
+ const objectsMap = getObjectsMap();
107
+ if (initialObjects && objectsMap.toJSON() && Object.keys(objectsMap.toJSON()).length === 0) {
108
+ syncSceneToYjs(initialObjects, objectsMap, doc);
109
+ }
110
+ providerRef = createProvider(doc, providerConfig);
111
+ providerRef.awareness.setLocalState({
112
+ user,
113
+ selectedObjects: [],
114
+ transformingObject: null,
115
+ camera: null
116
+ });
117
+ undoRef = createUndoManager([objectsMap]);
118
+ objectsMap.observe(() => {
119
+ stateSnapshot.objects = syncYjsToScene(objectsMap);
120
+ });
121
+ providerRef.awareness.on("change", () => {
122
+ const states = providerRef.awareness.getStates();
123
+ const collabs = [];
124
+ const selections = /* @__PURE__ */ new Map();
125
+ const transforming = /* @__PURE__ */ new Map();
126
+ const cameras = /* @__PURE__ */ new Map();
127
+ states.forEach((s, clientId) => {
128
+ if (clientId === providerRef.awareness.clientID) {
129
+ return;
130
+ }
131
+ const state = s;
132
+ if (state.user) {
133
+ collabs.push(state.user);
134
+ }
135
+ if (state.selectedObjects) {
136
+ selections.set(clientId, state.selectedObjects);
137
+ }
138
+ if (state.transformingObject !== void 0) {
139
+ transforming.set(clientId, state.transformingObject);
140
+ }
141
+ if (state.camera) {
142
+ cameras.set(clientId, state.camera);
143
+ }
144
+ });
145
+ stateSnapshot.collaborators = collabs;
146
+ stateSnapshot.collaboratorSelections = selections;
147
+ stateSnapshot.collaboratorTransforming = transforming;
148
+ stateSnapshot.collaboratorCameras = cameras;
149
+ });
150
+ providerRef.on("synced", () => {
151
+ stateSnapshot.synced = true;
152
+ });
153
+ await providerRef.connect();
154
+ stateSnapshot.connected = true;
155
+ },
156
+ disconnect() {
157
+ providerRef?.disconnect();
158
+ providerRef?.destroy();
159
+ providerRef = null;
160
+ undoRef = null;
161
+ docRef?.destroy();
162
+ docRef = null;
163
+ stateSnapshot.connected = false;
164
+ stateSnapshot.synced = false;
84
165
  }
85
- const actions = {
86
- addObject(obj) {
87
- const id = generateId();
88
- const full = { ...obj, id };
89
- getDoc().transact(() => {
90
- getObjectsMap().set(id, full);
91
- });
92
- return id;
93
- },
94
- updateObject(id, patch) {
95
- const map = getObjectsMap();
96
- const existing = map.get(id);
97
- if (!existing) {
98
- return;
99
- }
100
- getDoc().transact(() => {
101
- map.set(id, { ...existing, ...patch, id });
102
- });
103
- },
104
- deleteObject(id) {
105
- getDoc().transact(() => {
106
- getObjectsMap().delete(id);
107
- });
108
- },
109
- reparentObject(id, newParentId) {
110
- actions.updateObject(id, { parentId: newParentId });
111
- },
112
- setTransform(id, transform) {
113
- actions.updateObject(id, { transform });
114
- },
115
- setVisibility(id, visible) {
116
- actions.updateObject(id, { visible });
117
- },
118
- setMaterial(id, material) {
119
- actions.updateObject(id, { material });
120
- },
121
- setSelectedObjects(ids) {
122
- providerRef === null || providerRef === void 0 ? void 0 : providerRef.awareness.setLocalStateField('selectedObjects', ids);
123
- },
124
- setTransformingObject(id) {
125
- providerRef === null || providerRef === void 0 ? void 0 : providerRef.awareness.setLocalStateField('transformingObject', id);
126
- },
127
- setCamera(cam) {
128
- providerRef === null || providerRef === void 0 ? void 0 : providerRef.awareness.setLocalStateField('camera', cam);
129
- },
130
- undo() {
131
- undoRef === null || undoRef === void 0 ? void 0 : undoRef.undo();
132
- },
133
- redo() {
134
- undoRef === null || undoRef === void 0 ? void 0 : undoRef.redo();
135
- },
136
- get canUndo() {
137
- var _a;
138
- return (_a = undoRef === null || undoRef === void 0 ? void 0 : undoRef.canUndo()) !== null && _a !== void 0 ? _a : false;
139
- },
140
- get canRedo() {
141
- var _a;
142
- return (_a = undoRef === null || undoRef === void 0 ? void 0 : undoRef.canRedo()) !== null && _a !== void 0 ? _a : false;
143
- },
144
- async connect() {
145
- const doc = getDoc();
146
- const objectsMap = getObjectsMap();
147
- // Seed initial objects
148
- if (initialObjects && objectsMap.toJSON() && Object.keys(objectsMap.toJSON()).length === 0) {
149
- syncSceneToYjs(initialObjects, objectsMap, doc);
150
- }
151
- // Create provider
152
- providerRef = createProvider(doc, providerConfig);
153
- // Set awareness
154
- providerRef.awareness.setLocalState({
155
- user,
156
- selectedObjects: [],
157
- transformingObject: null,
158
- camera: null,
159
- });
160
- // Create undo manager
161
- undoRef = createUndoManager([objectsMap]);
162
- // Listen for changes
163
- objectsMap.observe(() => {
164
- stateSnapshot.objects = syncYjsToScene(objectsMap);
165
- });
166
- providerRef.awareness.on('change', () => {
167
- const states = providerRef.awareness.getStates();
168
- const collabs = [];
169
- const selections = new Map();
170
- const transforming = new Map();
171
- const cameras = new Map();
172
- states.forEach((s, clientId) => {
173
- if (clientId === providerRef.awareness.clientID) {
174
- return;
175
- }
176
- const state = s;
177
- if (state.user) {
178
- collabs.push(state.user);
179
- }
180
- if (state.selectedObjects) {
181
- selections.set(clientId, state.selectedObjects);
182
- }
183
- if (state.transformingObject !== undefined) {
184
- transforming.set(clientId, state.transformingObject);
185
- }
186
- if (state.camera) {
187
- cameras.set(clientId, state.camera);
188
- }
189
- });
190
- stateSnapshot.collaborators = collabs;
191
- stateSnapshot.collaboratorSelections = selections;
192
- stateSnapshot.collaboratorTransforming = transforming;
193
- stateSnapshot.collaboratorCameras = cameras;
194
- });
195
- providerRef.on('synced', () => {
196
- stateSnapshot.synced = true;
197
- });
198
- await providerRef.connect();
199
- stateSnapshot.connected = true;
200
- },
201
- disconnect() {
202
- providerRef === null || providerRef === void 0 ? void 0 : providerRef.disconnect();
203
- providerRef === null || providerRef === void 0 ? void 0 : providerRef.destroy();
204
- providerRef = null;
205
- undoRef = null;
206
- docRef === null || docRef === void 0 ? void 0 : docRef.destroy();
207
- docRef = null;
208
- stateSnapshot.connected = false;
209
- stateSnapshot.synced = false;
210
- },
211
- };
212
- return { state: stateSnapshot, actions };
166
+ };
167
+ return { state: stateSnapshot, actions };
213
168
  }
214
-
215
169
  exports.syncSceneToYjs = syncSceneToYjs;
216
170
  exports.syncYjsToScene = syncYjsToScene;
217
171
  exports.useCollaborativeScene = useCollaborativeScene;
@@ -1,48 +1,58 @@
1
- 'use strict';
2
-
3
- var jsxRuntime = require('react/jsx-runtime');
4
- var ui = require('@nice2dev/ui');
5
- var React = require('react');
6
-
7
- /**
8
- * The library's dialogs in place of `window.prompt` / `window.confirm` for the editor hooks,
9
- * which hold state but render nothing: `ask` resolves with the answer (`null` when cancelled)
10
- * and `pendingAsk` is the open question, for the editor component to pass to
11
- * {@link EditorAskDialog}. One question at a time: a new one settles the open one as cancelled.
12
- */
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const jsxRuntime = require("react/jsx-runtime");
4
+ const ui = require("@nice2dev/ui");
5
+ const React = require("react");
13
6
  function useEditorAsk() {
14
- const [pendingAsk, setPendingAsk] = React.useState(null);
15
- const pendingRef = React.useRef(null);
16
- const ask = React.useCallback((kind, text, defaultValue) => new Promise((resolve) => {
17
- var _a;
18
- (_a = pendingRef.current) === null || _a === void 0 ? void 0 : _a.answer(null);
19
- const next = {
20
- kind,
21
- text,
22
- defaultValue,
23
- answer: (value) => {
24
- if (pendingRef.current === next) {
25
- pendingRef.current = null;
26
- setPendingAsk(null);
27
- }
28
- resolve(value);
29
- },
30
- };
31
- pendingRef.current = next;
32
- setPendingAsk(next);
33
- }), []);
34
- return { pendingAsk, ask };
7
+ const [pendingAsk, setPendingAsk] = React.useState(null);
8
+ const pendingRef = React.useRef(null);
9
+ const ask = React.useCallback(
10
+ (kind, text, defaultValue) => new Promise((resolve) => {
11
+ pendingRef.current?.answer(null);
12
+ const next = {
13
+ kind,
14
+ text,
15
+ defaultValue,
16
+ answer: (value) => {
17
+ if (pendingRef.current === next) {
18
+ pendingRef.current = null;
19
+ setPendingAsk(null);
20
+ }
21
+ resolve(value);
22
+ }
23
+ };
24
+ pendingRef.current = next;
25
+ setPendingAsk(next);
26
+ }),
27
+ []
28
+ );
29
+ return { pendingAsk, ask };
35
30
  }
36
- /** Shows the question {@link useEditorAsk} is waiting on, if any. */
37
31
  const EditorAskDialog = ({ ask }) => {
38
- if (!ask) {
39
- return null;
32
+ if (!ask) {
33
+ return null;
34
+ }
35
+ if (ask.kind === "confirm") {
36
+ return /* @__PURE__ */ jsxRuntime.jsx(
37
+ ui.NiceConfirmDialog,
38
+ {
39
+ visible: true,
40
+ message: ask.text,
41
+ onAccept: () => ask.answer(""),
42
+ onReject: () => ask.answer(null)
43
+ }
44
+ );
45
+ }
46
+ return /* @__PURE__ */ jsxRuntime.jsx(
47
+ ui.NicePromptDialog,
48
+ {
49
+ open: true,
50
+ title: ask.text,
51
+ defaultValue: ask.defaultValue,
52
+ onSubmit: (value) => ask.answer(value),
53
+ onCancel: () => ask.answer(null)
40
54
  }
41
- if (ask.kind === 'confirm') {
42
- return (jsxRuntime.jsx(ui.NiceConfirmDialog, { visible: true, message: ask.text, onAccept: () => ask.answer(''), onReject: () => ask.answer(null) }));
43
- }
44
- return (jsxRuntime.jsx(ui.NicePromptDialog, { open: true, title: ask.text, defaultValue: ask.defaultValue, onSubmit: (value) => ask.answer(value), onCancel: () => ask.answer(null) }));
55
+ );
45
56
  };
46
-
47
57
  exports.EditorAskDialog = EditorAskDialog;
48
58
  exports.useEditorAsk = useEditorAsk;
@@ -1,19 +1,18 @@
1
- 'use strict';
2
-
3
- var jsxRuntime = require('react/jsx-runtime');
4
- var ui = require('@nice2dev/ui');
5
- var React = require('react');
6
-
7
- /** `null` outside this package's provider: the global translator applies. */
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const jsxRuntime = require("react/jsx-runtime");
4
+ const ui = require("@nice2dev/ui");
5
+ const React = require("react");
8
6
  const NiceI18nContext = /* @__PURE__ */ React.createContext(null);
9
- /** Overrides the app's global translator for the 3D controls below it. */
10
- const NiceI18nProvider = ({ t, children }) => (jsxRuntime.jsx(NiceI18nContext.Provider, { value: t, children: children }));
7
+ const NiceI18nProvider = ({ t, children }) => /* @__PURE__ */ jsxRuntime.jsx(NiceI18nContext.Provider, { value: t, children });
11
8
  function useNiceTranslation() {
12
- const own = React.useContext(NiceI18nContext);
13
- const { t: global } = ui.useNiceTranslation();
14
- const t = React.useMemo(() => own !== null && own !== void 0 ? own : ((key, defaultValue) => global(key, defaultValue)), [own, global]);
15
- return { t };
9
+ const own = React.useContext(NiceI18nContext);
10
+ const { t: global } = ui.useNiceTranslation();
11
+ const t = React.useMemo(
12
+ () => own ?? ((key, defaultValue) => global(key, defaultValue)),
13
+ [own, global]
14
+ );
15
+ return { t };
16
16
  }
17
-
18
17
  exports.NiceI18nProvider = NiceI18nProvider;
19
18
  exports.useNiceTranslation = useNiceTranslation;
@@ -1,52 +1,39 @@
1
- 'use strict';
2
-
3
- var THREE = require('three');
4
-
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const THREE = require("three");
5
4
  function _interopNamespaceDefault(e) {
6
- var n = Object.create(null);
7
- if (e) {
8
- Object.keys(e).forEach(function (k) {
9
- if (k !== 'default') {
10
- var d = Object.getOwnPropertyDescriptor(e, k);
11
- Object.defineProperty(n, k, d.get ? d : {
12
- enumerable: true,
13
- get: function () { return e[k]; }
14
- });
15
- }
5
+ const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
6
+ if (e) {
7
+ for (const k in e) {
8
+ if (k !== "default") {
9
+ const d = Object.getOwnPropertyDescriptor(e, k);
10
+ Object.defineProperty(n, k, d.get ? d : {
11
+ enumerable: true,
12
+ get: () => e[k]
16
13
  });
14
+ }
17
15
  }
18
- n.default = e;
19
- return Object.freeze(n);
16
+ }
17
+ n.default = e;
18
+ return Object.freeze(n);
20
19
  }
21
-
22
- var THREE__namespace = /*#__PURE__*/_interopNamespaceDefault(THREE);
23
-
24
- /**
25
- * three.js r183 deprecated `Clock` (for `Timer`) and folds `PCFSoftShadowMap` into
26
- * `PCFShadowMap`; both log a console warning there. The peer range starts at r150, which has
27
- * neither `Timer` in its core nor the softer `PCFShadowMap`, so the choice follows the revision.
28
- */
20
+ const THREE__namespace = /* @__PURE__ */ _interopNamespaceDefault(THREE);
29
21
  const REVISION = Number.parseInt(THREE__namespace.REVISION, 10);
30
22
  const MODERN = REVISION >= 183;
31
- /** Soft shadows without the r183 deprecation warning; older three keeps `PCFSoftShadowMap`. */
32
- const SOFT_SHADOW_MAP = MODERN
33
- ? THREE__namespace.PCFShadowMap
34
- : THREE__namespace.PCFSoftShadowMap;
35
- /** `Timer` where three has deprecated `Clock`, `Clock` before. */
23
+ const SOFT_SHADOW_MAP = MODERN ? THREE__namespace.PCFShadowMap : THREE__namespace.PCFSoftShadowMap;
36
24
  function createFrameClock() {
37
- const TimerCtor = THREE__namespace.Timer;
38
- if (MODERN && TimerCtor) {
39
- const timer = new TimerCtor();
40
- return {
41
- getDelta: () => {
42
- timer.update();
43
- return timer.getDelta();
44
- },
45
- };
46
- }
47
- const clock = new THREE__namespace.Clock();
48
- return { getDelta: () => clock.getDelta() };
25
+ const TimerCtor = THREE__namespace.Timer;
26
+ if (MODERN && TimerCtor) {
27
+ const timer = new TimerCtor();
28
+ return {
29
+ getDelta: () => {
30
+ timer.update();
31
+ return timer.getDelta();
32
+ }
33
+ };
34
+ }
35
+ const clock = new THREE__namespace.Clock();
36
+ return { getDelta: () => clock.getDelta() };
49
37
  }
50
-
51
38
  exports.SOFT_SHADOW_MAP = SOFT_SHADOW_MAP;
52
39
  exports.createFrameClock = createFrameClock;