@nice2dev/ui-3d 1.0.0 → 1.0.2

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 (204) hide show
  1. package/CHANGELOG.md +115 -1
  2. package/dist/cjs/collaborative/collaborativeScene.js +210 -0
  3. package/dist/cjs/collaborative/collaborativeScene.js.map +1 -0
  4. package/dist/cjs/core/i18n.js +3 -3
  5. package/dist/cjs/core/i18n.js.map +1 -1
  6. package/dist/cjs/dance/DanceBridge.js +162 -0
  7. package/dist/cjs/dance/DanceBridge.js.map +1 -0
  8. package/dist/cjs/dance/DanceScoreEngine.js +210 -0
  9. package/dist/cjs/dance/DanceScoreEngine.js.map +1 -0
  10. package/dist/cjs/dance/PoseDetector.js +199 -0
  11. package/dist/cjs/dance/PoseDetector.js.map +1 -0
  12. package/dist/cjs/index.js +254 -0
  13. package/dist/cjs/index.js.map +1 -1
  14. package/dist/cjs/material/MaterialEditor.module.css.js +6 -0
  15. package/dist/cjs/material/MaterialEditor.module.css.js.map +1 -0
  16. package/dist/cjs/material/NiceMaterialEditor.js +737 -0
  17. package/dist/cjs/material/NiceMaterialEditor.js.map +1 -0
  18. package/dist/cjs/material/materialEditorTypes.js +73 -0
  19. package/dist/cjs/material/materialEditorTypes.js.map +1 -0
  20. package/dist/cjs/material/materialEditorUtils.js +841 -0
  21. package/dist/cjs/material/materialEditorUtils.js.map +1 -0
  22. package/dist/cjs/material/materialNodeDefinitions.js +1285 -0
  23. package/dist/cjs/material/materialNodeDefinitions.js.map +1 -0
  24. package/dist/cjs/model/ModelEditor.js +4 -1
  25. package/dist/cjs/model/ModelEditor.js.map +1 -1
  26. package/dist/cjs/model/ModelEditor.module.css.js +1 -1
  27. package/dist/cjs/model/ModelEditorLeftPanel.js +5 -4
  28. package/dist/cjs/model/ModelEditorLeftPanel.js.map +1 -1
  29. package/dist/cjs/model/ModelEditorMenuBar.js +8 -3
  30. package/dist/cjs/model/ModelEditorMenuBar.js.map +1 -1
  31. package/dist/cjs/model/ModelEditorRightPanel.js +27 -26
  32. package/dist/cjs/model/ModelEditorRightPanel.js.map +1 -1
  33. package/dist/cjs/model/ModelEditorSubComponents.js +20 -16
  34. package/dist/cjs/model/ModelEditorSubComponents.js.map +1 -1
  35. package/dist/cjs/model/ModelEditorTimeline.js +5 -4
  36. package/dist/cjs/model/ModelEditorTimeline.js.map +1 -1
  37. package/dist/cjs/model/ModelEditorToolbar.js +4 -3
  38. package/dist/cjs/model/ModelEditorToolbar.js.map +1 -1
  39. package/dist/cjs/model/ModelEditorViewport.js +2 -2
  40. package/dist/cjs/model/ModelEditorViewport.js.map +1 -1
  41. package/dist/cjs/model/ModelViewer.js +68 -0
  42. package/dist/cjs/model/ModelViewer.js.map +1 -0
  43. package/dist/cjs/model/ModelViewer.module.css.js +6 -0
  44. package/dist/cjs/model/ModelViewer.module.css.js.map +1 -0
  45. package/dist/cjs/model/NiceArmatureEditor.js +255 -0
  46. package/dist/cjs/model/NiceArmatureEditor.js.map +1 -0
  47. package/dist/cjs/model/NiceMorphTargetEditor.js +206 -0
  48. package/dist/cjs/model/NiceMorphTargetEditor.js.map +1 -0
  49. package/dist/cjs/model/NiceOctree.js +339 -0
  50. package/dist/cjs/model/NiceOctree.js.map +1 -0
  51. package/dist/cjs/model/NicePhysicsSimulation.js +283 -0
  52. package/dist/cjs/model/NicePhysicsSimulation.js.map +1 -0
  53. package/dist/cjs/model/NiceProceduralGeometry.js +269 -0
  54. package/dist/cjs/model/NiceProceduralGeometry.js.map +1 -0
  55. package/dist/cjs/model/NiceTerrainEditor.js +343 -0
  56. package/dist/cjs/model/NiceTerrainEditor.js.map +1 -0
  57. package/dist/cjs/model/NiceWeightPainter.js +258 -0
  58. package/dist/cjs/model/NiceWeightPainter.js.map +1 -0
  59. package/dist/cjs/model/NiceXRPreview.js +269 -0
  60. package/dist/cjs/model/NiceXRPreview.js.map +1 -0
  61. package/dist/cjs/model/cadModeUtils.js +130 -0
  62. package/dist/cjs/model/cadModeUtils.js.map +1 -0
  63. package/dist/cjs/model/editorShortcuts.js +187 -0
  64. package/dist/cjs/model/editorShortcuts.js.map +1 -0
  65. package/dist/cjs/model/modelEditorTypes.js +11 -0
  66. package/dist/cjs/model/modelEditorTypes.js.map +1 -1
  67. package/dist/cjs/model/modelEditorUtils.js +1049 -0
  68. package/dist/cjs/model/modelEditorUtils.js.map +1 -0
  69. package/dist/cjs/model/simsModeUtils.js +358 -0
  70. package/dist/cjs/model/simsModeUtils.js.map +1 -0
  71. package/dist/cjs/model/useModelEditor.js +319 -115
  72. package/dist/cjs/model/useModelEditor.js.map +1 -1
  73. package/dist/cjs/model/useModelViewer.js +634 -0
  74. package/dist/cjs/model/useModelViewer.js.map +1 -0
  75. package/dist/cjs/nice2dev-ui-3d.css +1 -1
  76. package/dist/cjs/particle/NiceParticleEditor.js +526 -0
  77. package/dist/cjs/particle/NiceParticleEditor.js.map +1 -0
  78. package/dist/cjs/particle/ParticleEditor.module.css.js +6 -0
  79. package/dist/cjs/particle/ParticleEditor.module.css.js.map +1 -0
  80. package/dist/cjs/particle/particleEditorTypes.js +92 -0
  81. package/dist/cjs/particle/particleEditorTypes.js.map +1 -0
  82. package/dist/cjs/particle/particleEditorUtils.js +1084 -0
  83. package/dist/cjs/particle/particleEditorUtils.js.map +1 -0
  84. package/dist/cjs/rendering/NiceCascadedShadows.js +266 -0
  85. package/dist/cjs/rendering/NiceCascadedShadows.js.map +1 -0
  86. package/dist/cjs/rendering/NiceRenderExport.js +341 -0
  87. package/dist/cjs/rendering/NiceRenderExport.js.map +1 -0
  88. package/dist/cjs/rendering/NiceSSAO.js +359 -0
  89. package/dist/cjs/rendering/NiceSSAO.js.map +1 -0
  90. package/dist/cjs/rendering/NiceSSR.js +277 -0
  91. package/dist/cjs/rendering/NiceSSR.js.map +1 -0
  92. package/dist/cjs/rendering/NiceWebGPURenderer.js +215 -0
  93. package/dist/cjs/rendering/NiceWebGPURenderer.js.map +1 -0
  94. package/dist/cjs/ui/dist/index.js +50089 -0
  95. package/dist/cjs/ui/dist/index.js.map +1 -0
  96. package/dist/cjs/uv/NiceUVEditor.js +520 -0
  97. package/dist/cjs/uv/NiceUVEditor.js.map +1 -0
  98. package/dist/cjs/uv/UVEditor.module.css.js +6 -0
  99. package/dist/cjs/uv/UVEditor.module.css.js.map +1 -0
  100. package/dist/cjs/uv/uvEditorTypes.js +98 -0
  101. package/dist/cjs/uv/uvEditorTypes.js.map +1 -0
  102. package/dist/cjs/uv/uvEditorUtils.js +670 -0
  103. package/dist/cjs/uv/uvEditorUtils.js.map +1 -0
  104. package/dist/esm/collaborative/collaborativeScene.js +206 -0
  105. package/dist/esm/collaborative/collaborativeScene.js.map +1 -0
  106. package/dist/esm/dance/DanceBridge.js +158 -0
  107. package/dist/esm/dance/DanceBridge.js.map +1 -0
  108. package/dist/esm/dance/DanceScoreEngine.js +207 -0
  109. package/dist/esm/dance/DanceScoreEngine.js.map +1 -0
  110. package/dist/esm/dance/PoseDetector.js +195 -0
  111. package/dist/esm/dance/PoseDetector.js.map +1 -0
  112. package/dist/esm/index.js +35 -1
  113. package/dist/esm/index.js.map +1 -1
  114. package/dist/esm/material/MaterialEditor.module.css.js +4 -0
  115. package/dist/esm/material/MaterialEditor.module.css.js.map +1 -0
  116. package/dist/esm/material/NiceMaterialEditor.js +734 -0
  117. package/dist/esm/material/NiceMaterialEditor.js.map +1 -0
  118. package/dist/esm/material/materialEditorTypes.js +62 -0
  119. package/dist/esm/material/materialEditorTypes.js.map +1 -0
  120. package/dist/esm/material/materialEditorUtils.js +811 -0
  121. package/dist/esm/material/materialEditorUtils.js.map +1 -0
  122. package/dist/esm/material/materialNodeDefinitions.js +1280 -0
  123. package/dist/esm/material/materialNodeDefinitions.js.map +1 -0
  124. package/dist/esm/model/ModelEditor.js +4 -2
  125. package/dist/esm/model/ModelEditor.js.map +1 -1
  126. package/dist/esm/model/ModelEditor.module.css.js +1 -1
  127. package/dist/esm/model/ModelEditorLeftPanel.js +5 -4
  128. package/dist/esm/model/ModelEditorLeftPanel.js.map +1 -1
  129. package/dist/esm/model/ModelEditorMenuBar.js +8 -3
  130. package/dist/esm/model/ModelEditorMenuBar.js.map +1 -1
  131. package/dist/esm/model/ModelEditorRightPanel.js +27 -26
  132. package/dist/esm/model/ModelEditorRightPanel.js.map +1 -1
  133. package/dist/esm/model/ModelEditorSubComponents.js +17 -13
  134. package/dist/esm/model/ModelEditorSubComponents.js.map +1 -1
  135. package/dist/esm/model/ModelEditorTimeline.js +5 -4
  136. package/dist/esm/model/ModelEditorTimeline.js.map +1 -1
  137. package/dist/esm/model/ModelEditorToolbar.js +4 -3
  138. package/dist/esm/model/ModelEditorToolbar.js.map +1 -1
  139. package/dist/esm/model/ModelEditorViewport.js +2 -2
  140. package/dist/esm/model/ModelEditorViewport.js.map +1 -1
  141. package/dist/esm/model/ModelViewer.js +65 -0
  142. package/dist/esm/model/ModelViewer.js.map +1 -0
  143. package/dist/esm/model/ModelViewer.module.css.js +4 -0
  144. package/dist/esm/model/ModelViewer.module.css.js.map +1 -0
  145. package/dist/esm/model/NiceArmatureEditor.js +233 -0
  146. package/dist/esm/model/NiceArmatureEditor.js.map +1 -0
  147. package/dist/esm/model/NiceMorphTargetEditor.js +184 -0
  148. package/dist/esm/model/NiceMorphTargetEditor.js.map +1 -0
  149. package/dist/esm/model/NiceOctree.js +317 -0
  150. package/dist/esm/model/NiceOctree.js.map +1 -0
  151. package/dist/esm/model/NicePhysicsSimulation.js +261 -0
  152. package/dist/esm/model/NicePhysicsSimulation.js.map +1 -0
  153. package/dist/esm/model/NiceProceduralGeometry.js +242 -0
  154. package/dist/esm/model/NiceProceduralGeometry.js.map +1 -0
  155. package/dist/esm/model/NiceTerrainEditor.js +321 -0
  156. package/dist/esm/model/NiceTerrainEditor.js.map +1 -0
  157. package/dist/esm/model/NiceWeightPainter.js +236 -0
  158. package/dist/esm/model/NiceWeightPainter.js.map +1 -0
  159. package/dist/esm/model/NiceXRPreview.js +247 -0
  160. package/dist/esm/model/NiceXRPreview.js.map +1 -0
  161. package/dist/esm/model/cadModeUtils.js +103 -0
  162. package/dist/esm/model/cadModeUtils.js.map +1 -0
  163. package/dist/esm/model/editorShortcuts.js +185 -0
  164. package/dist/esm/model/editorShortcuts.js.map +1 -0
  165. package/dist/esm/model/modelEditorTypes.js +11 -0
  166. package/dist/esm/model/modelEditorTypes.js.map +1 -1
  167. package/dist/esm/model/modelEditorUtils.js +997 -0
  168. package/dist/esm/model/modelEditorUtils.js.map +1 -0
  169. package/dist/esm/model/simsModeUtils.js +325 -0
  170. package/dist/esm/model/simsModeUtils.js.map +1 -0
  171. package/dist/esm/model/useModelEditor.js +204 -0
  172. package/dist/esm/model/useModelEditor.js.map +1 -1
  173. package/dist/esm/model/useModelViewer.js +613 -0
  174. package/dist/esm/model/useModelViewer.js.map +1 -0
  175. package/dist/esm/nice2dev-ui-3d.css +1 -1
  176. package/dist/esm/particle/NiceParticleEditor.js +523 -0
  177. package/dist/esm/particle/NiceParticleEditor.js.map +1 -0
  178. package/dist/esm/particle/ParticleEditor.module.css.js +4 -0
  179. package/dist/esm/particle/ParticleEditor.module.css.js.map +1 -0
  180. package/dist/esm/particle/particleEditorTypes.js +84 -0
  181. package/dist/esm/particle/particleEditorTypes.js.map +1 -0
  182. package/dist/esm/particle/particleEditorUtils.js +1054 -0
  183. package/dist/esm/particle/particleEditorUtils.js.map +1 -0
  184. package/dist/esm/rendering/NiceCascadedShadows.js +244 -0
  185. package/dist/esm/rendering/NiceCascadedShadows.js.map +1 -0
  186. package/dist/esm/rendering/NiceRenderExport.js +319 -0
  187. package/dist/esm/rendering/NiceRenderExport.js.map +1 -0
  188. package/dist/esm/rendering/NiceSSAO.js +337 -0
  189. package/dist/esm/rendering/NiceSSAO.js.map +1 -0
  190. package/dist/esm/rendering/NiceSSR.js +255 -0
  191. package/dist/esm/rendering/NiceSSR.js.map +1 -0
  192. package/dist/esm/rendering/NiceWebGPURenderer.js +193 -0
  193. package/dist/esm/rendering/NiceWebGPURenderer.js.map +1 -0
  194. package/dist/esm/ui/dist/index.js +49686 -0
  195. package/dist/esm/ui/dist/index.js.map +1 -0
  196. package/dist/esm/uv/NiceUVEditor.js +518 -0
  197. package/dist/esm/uv/NiceUVEditor.js.map +1 -0
  198. package/dist/esm/uv/UVEditor.module.css.js +4 -0
  199. package/dist/esm/uv/UVEditor.module.css.js.map +1 -0
  200. package/dist/esm/uv/uvEditorTypes.js +88 -0
  201. package/dist/esm/uv/uvEditorTypes.js.map +1 -0
  202. package/dist/esm/uv/uvEditorUtils.js +621 -0
  203. package/dist/esm/uv/uvEditorUtils.js.map +1 -0
  204. package/package.json +3 -4
package/CHANGELOG.md CHANGED
@@ -1,4 +1,73 @@
1
- # Changelog
1
+ # @nice2dev/ui-3d — Changelog
2
+
3
+ All notable changes to the 3D model editor package.
4
+
5
+ ## [Unreleased] — OmniVerk Professional Roadmap
6
+
7
+ ### Planned — Spatial/CAD Integration (PRO-2)
8
+
9
+ - **Shared Object Model** — wspólne typy SpatialObject3D dla edytorów 2D i 3D
10
+ - **2D↔3D Extrusion** — automatyczna ekstruzja z floor plan do modelu 3D
11
+ - **3D→2D Projection** — rzutowanie 3D na plan piętra
12
+ - **Quick Switch** — przycisk "Edit in 2D/3D" z zachowaniem kontekstu
13
+ - **Split View Mode** — równoczesna edycja 2D/3D obok siebie
14
+ - **Cross-Editor Undo** — wspólny undo stack między edytorami
15
+
16
+ ### Planned — Professional CAD Features (PRO-2.3)
17
+
18
+ - **Parametric Constraints** — wymiarowe ograniczenia (prostopadłość, równoległość)
19
+ - **Boolean Operations** — union, subtract, intersect z podglądem
20
+ - **Section Views** — przekroje z kreskowaniem
21
+ - **Drawing Sheets** — eksport technicznych rysunków (DXF/DWG/PDF)
22
+ - **BOM Generation** — automatyczne zestawienia materiałów
23
+
24
+ ### Planned — BIM/AEC Features (PRO-2.4)
25
+
26
+ - **IFC Import/Export** — pełna obsługa Industry Foundation Classes
27
+ - **MEP Routing** — HVAC, hydraulika, elektryka
28
+ - **Clash Detection** — wykrywanie kolizji między systemami
29
+
30
+ ---
31
+
32
+ ## [1.0.1] — 2026-03-25
33
+
34
+ ### Added (FAZA 7.3)
35
+
36
+ - **UV Editor** — texture mapping on 3D models
37
+ - **Node-based material editor** — visual shader creation (node graph)
38
+ - **Armature/Rig editor** — skeleton editing
39
+ - **Weight painting** — bone influence painting on vertices
40
+ - **Morph targets / blend shapes** — face animations
41
+ - **Map/Level/Terrain editor** — scene/map creation from 3D elements, save/load
42
+ - **Physics simulation** — Ammo.js / Rapier integration
43
+ - **Particle systems editor** — particle effect creation
44
+ - **Procedural geometry** — tree, terrain, building generation
45
+ - **VR/AR preview mode** — WebXR scene preview
46
+ - **Octree ray-casting** — faster collision detection for large scenes
47
+ - **WebGPU renderer** — Three.js r170+ WebGPU backend
48
+ - **Real-time shadows** — CSM, PCF soft shadows
49
+ - **Screen-space reflections (SSR)** — screen-space reflections
50
+ - **Ambient occlusion (SSAO/HBAO)** — ambient lighting
51
+ - **Render to PNG/EXR** — render export with transparency
52
+
53
+ ### Tests
54
+
55
+ - 89 unit tests in 5 files: sceneGraph CRUD, transformMath, materialEditor, uvEditor, particleEditor
56
+ - E2E tests: wireframe preview, tabs, features, formats
57
+
58
+ ---
59
+
60
+ ## [1.0.0] — 2025-06-01
61
+
62
+ Initial production release — Blender-style 3D model editor powered by Three.js.
63
+
64
+ - Scene graph / hierarchy editor
65
+ - Transform gizmos (move, rotate, scale)
66
+ - Material editor (PBR, standard)
67
+ - Import: GLTF, GLB, OBJ, FBX, STL, 3DS
68
+ - Export: GLTF, GLB, OBJ, STL
69
+ - Light presets, environment maps
70
+ - Camera controls (orbit, fly, walk)
2
71
 
3
72
  All notable changes to `@nice2dev/ui-3d` will be documented in this file.
4
73
 
@@ -7,6 +76,51 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
76
 
8
77
  ---
9
78
 
79
+ ## [1.1.0] — 2026-06-16
80
+
81
+ ### 🚀 Major Feature Release
82
+
83
+ CAD mode, Sims-style building mode, dance integration, and full editor decomposition.
84
+
85
+ ### New Modes
86
+
87
+ - **CAD Mode** (`cadModeUtils.ts`) — precision engineering mode with snapping, measurement tools, constraints, dimensioning
88
+ - **Sims Building Mode** (`simsModeUtils.ts`) — room-based building with wall placement, floor plans, furniture snapping, grid alignment
89
+
90
+ ### Dance Integration (`dance/`)
91
+
92
+ - **DanceBridge** — bridge layer for connecting pose data to 3D animations
93
+ - **DanceScoreEngine** — real-time dance scoring with hit detection and combo tracking
94
+ - **PoseDetector** — webcam-based human pose detection component for dance games
95
+
96
+ ### Editor Sub-components
97
+
98
+ - **ModelEditorLeftPanel** — scene hierarchy and asset browser sidebar
99
+ - **ModelEditorMenuBar** — file/edit/view/tools menu bar
100
+ - **ModelEditorRightPanel** — properties inspector panel
101
+ - **ModelEditorSubComponents** — shared editor sub-components
102
+ - **ModelEditorTimeline** — keyframe animation timeline
103
+ - **ModelEditorToolbar** — toolbar with transform and tool selection
104
+ - **ModelEditorViewport** — 3D viewport with gizmos and selection
105
+ - **ModelViewer.module.css / ModelEditor.module.css** — CSS Modules styling
106
+
107
+ ### Hooks
108
+
109
+ - `useModelEditor` — hook for editor state management (selection, tools, undo/redo)
110
+ - `useModelViewer` — hook for viewer state (camera, loading, materials)
111
+
112
+ ### Utilities
113
+
114
+ - `modelEditorTypes.ts` — TypeScript types for all editor state and operations
115
+ - `modelEditorUtils.ts` — helper utilities (transforms, intersections, serialization)
116
+ - `editorShortcuts.ts` — keyboard shortcut definitions and handler registration
117
+
118
+ ### i18n
119
+
120
+ - Added internationalization support (`core/i18n.tsx`) with translatable editor labels
121
+
122
+ ---
123
+
10
124
  ## [1.0.0] — 2026-03-17
11
125
 
12
126
  ### 🧊 Initial Release
@@ -0,0 +1,210 @@
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[]. */
18
+ function syncYjsToScene(objectsMap) {
19
+ const json = objectsMap.toJSON();
20
+ return Object.values(json);
21
+ }
22
+ /** Write SharedSceneObject[] into Yjs objects map. */
23
+ 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
+ // Upsert
33
+ for (const obj of objects) {
34
+ objectsMap.set(obj.id, obj);
35
+ }
36
+ });
37
+ }
38
+ /**
39
+ * useCollaborativeScene — Yjs-powered multi-user 3D scene editing.
40
+ *
41
+ * Usage:
42
+ * ```ts
43
+ * const { state, actions } = useCollaborativeScene({
44
+ * createYDoc: () => new Y.Doc(),
45
+ * createProvider: (doc, cfg) => new WebrtcProvider(cfg.room, doc),
46
+ * createUndoManager: (scope) => new Y.UndoManager(scope),
47
+ * providerConfig: { type: 'webrtc', room: 'scene-1' },
48
+ * user: { id: 'u1', name: 'Alice', color: '#e74c3c' },
49
+ * });
50
+ * ```
51
+ */
52
+ function useCollaborativeScene(options) {
53
+ // This follows the exact same architecture as useCollaborativePresentation.
54
+ // Implementation uses React refs for YDoc/provider and useState for reactive state.
55
+ // All mutations go through doc.transact() for atomicity.
56
+ const { createYDoc, createProvider, createUndoManager, providerConfig, user, initialObjects } = options;
57
+ // Lazy-init refs (avoid re-creation on re-render)
58
+ let docRef = null;
59
+ let providerRef = null;
60
+ let undoRef = null;
61
+ // State (would use useState in real React hook — simplified for pure TS export)
62
+ const stateSnapshot = {
63
+ objects: initialObjects !== null && initialObjects !== void 0 ? initialObjects : [],
64
+ collaborators: [],
65
+ collaboratorSelections: new Map(),
66
+ collaboratorTransforming: new Map(),
67
+ collaboratorCameras: new Map(),
68
+ connected: false,
69
+ synced: false,
70
+ };
71
+ function getDoc() {
72
+ if (!docRef)
73
+ docRef = createYDoc();
74
+ return docRef;
75
+ }
76
+ function getObjectsMap() {
77
+ return getDoc().getMap('objects');
78
+ }
79
+ // ── Actions ─────────────────────────────────────────────
80
+ function generateId() {
81
+ return `obj_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`;
82
+ }
83
+ const actions = {
84
+ addObject(obj) {
85
+ const id = generateId();
86
+ const full = { ...obj, id };
87
+ getDoc().transact(() => {
88
+ getObjectsMap().set(id, full);
89
+ });
90
+ return id;
91
+ },
92
+ updateObject(id, patch) {
93
+ const map = getObjectsMap();
94
+ const existing = map.get(id);
95
+ if (!existing)
96
+ return;
97
+ getDoc().transact(() => {
98
+ map.set(id, { ...existing, ...patch, id });
99
+ });
100
+ },
101
+ deleteObject(id) {
102
+ getDoc().transact(() => {
103
+ getObjectsMap().delete(id);
104
+ });
105
+ },
106
+ reparentObject(id, newParentId) {
107
+ actions.updateObject(id, { parentId: newParentId });
108
+ },
109
+ setTransform(id, transform) {
110
+ actions.updateObject(id, { transform });
111
+ },
112
+ setVisibility(id, visible) {
113
+ actions.updateObject(id, { visible });
114
+ },
115
+ setMaterial(id, material) {
116
+ actions.updateObject(id, { material });
117
+ },
118
+ setSelectedObjects(ids) {
119
+ providerRef === null || providerRef === void 0 ? void 0 : providerRef.awareness.setLocalStateField('selectedObjects', ids);
120
+ },
121
+ setTransformingObject(id) {
122
+ providerRef === null || providerRef === void 0 ? void 0 : providerRef.awareness.setLocalStateField('transformingObject', id);
123
+ },
124
+ setCamera(cam) {
125
+ providerRef === null || providerRef === void 0 ? void 0 : providerRef.awareness.setLocalStateField('camera', cam);
126
+ },
127
+ undo() {
128
+ undoRef === null || undoRef === void 0 ? void 0 : undoRef.undo();
129
+ },
130
+ redo() {
131
+ undoRef === null || undoRef === void 0 ? void 0 : undoRef.redo();
132
+ },
133
+ get canUndo() {
134
+ var _a;
135
+ return (_a = undoRef === null || undoRef === void 0 ? void 0 : undoRef.canUndo()) !== null && _a !== void 0 ? _a : false;
136
+ },
137
+ get canRedo() {
138
+ var _a;
139
+ return (_a = undoRef === null || undoRef === void 0 ? void 0 : undoRef.canRedo()) !== null && _a !== void 0 ? _a : false;
140
+ },
141
+ async connect() {
142
+ const doc = getDoc();
143
+ const objectsMap = getObjectsMap();
144
+ // Seed initial objects
145
+ if (initialObjects && objectsMap.toJSON() && Object.keys(objectsMap.toJSON()).length === 0) {
146
+ syncSceneToYjs(initialObjects, objectsMap, doc);
147
+ }
148
+ // Create provider
149
+ providerRef = createProvider(doc, providerConfig);
150
+ // Set awareness
151
+ providerRef.awareness.setLocalState({
152
+ user,
153
+ selectedObjects: [],
154
+ transformingObject: null,
155
+ camera: null,
156
+ });
157
+ // Create undo manager
158
+ undoRef = createUndoManager([objectsMap]);
159
+ // Listen for changes
160
+ objectsMap.observe(() => {
161
+ stateSnapshot.objects = syncYjsToScene(objectsMap);
162
+ });
163
+ providerRef.awareness.on('change', () => {
164
+ const states = providerRef.awareness.getStates();
165
+ const collabs = [];
166
+ const selections = new Map();
167
+ const transforming = new Map();
168
+ const cameras = new Map();
169
+ states.forEach((s, clientId) => {
170
+ if (clientId === providerRef.awareness.clientID)
171
+ return;
172
+ const state = s;
173
+ if (state.user)
174
+ collabs.push(state.user);
175
+ if (state.selectedObjects)
176
+ selections.set(clientId, state.selectedObjects);
177
+ if (state.transformingObject !== undefined)
178
+ transforming.set(clientId, state.transformingObject);
179
+ if (state.camera)
180
+ cameras.set(clientId, state.camera);
181
+ });
182
+ stateSnapshot.collaborators = collabs;
183
+ stateSnapshot.collaboratorSelections = selections;
184
+ stateSnapshot.collaboratorTransforming = transforming;
185
+ stateSnapshot.collaboratorCameras = cameras;
186
+ });
187
+ providerRef.on('synced', () => {
188
+ stateSnapshot.synced = true;
189
+ });
190
+ await providerRef.connect();
191
+ stateSnapshot.connected = true;
192
+ },
193
+ disconnect() {
194
+ providerRef === null || providerRef === void 0 ? void 0 : providerRef.disconnect();
195
+ providerRef === null || providerRef === void 0 ? void 0 : providerRef.destroy();
196
+ providerRef = null;
197
+ undoRef = null;
198
+ docRef === null || docRef === void 0 ? void 0 : docRef.destroy();
199
+ docRef = null;
200
+ stateSnapshot.connected = false;
201
+ stateSnapshot.synced = false;
202
+ },
203
+ };
204
+ return { state: stateSnapshot, actions };
205
+ }
206
+
207
+ exports.syncSceneToYjs = syncSceneToYjs;
208
+ exports.syncYjsToScene = syncYjsToScene;
209
+ exports.useCollaborativeScene = useCollaborativeScene;
210
+ //# sourceMappingURL=collaborativeScene.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collaborativeScene.js","sources":["../../../src/collaborative/collaborativeScene.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -1,13 +1,13 @@
1
1
  'use strict';
2
2
 
3
3
  var jsxRuntime = require('react/jsx-runtime');
4
- var React = require('react');
4
+ var Ae = require('react');
5
5
 
6
6
  const fallback = (_key, defaultValue) => defaultValue;
7
- const NiceI18nContext = React.createContext(fallback);
7
+ const NiceI18nContext = Ae.createContext(fallback);
8
8
  const NiceI18nProvider = ({ t, children }) => (jsxRuntime.jsx(NiceI18nContext.Provider, { value: t, children: children }));
9
9
  function useNiceTranslation() {
10
- const t = React.useContext(NiceI18nContext);
10
+ const t = Ae.useContext(NiceI18nContext);
11
11
  return { t };
12
12
  }
13
13
 
@@ -1 +1 @@
1
- {"version":3,"file":"i18n.js","sources":["../../../src/core/i18n.tsx"],"sourcesContent":[null],"names":["createContext","_jsx","useContext"],"mappings":";;;;;AAqBA,MAAM,QAAQ,GAAoB,CAAC,IAAY,EAAE,YAAoB,KAAK,YAAY;AAEtF,MAAM,eAAe,GAAGA,mBAAa,CAAkB,QAAQ,CAAC;AAOzD,MAAM,gBAAgB,GAAoC,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,MAC/EC,cAAA,CAAC,eAAe,CAAC,QAAQ,EAAA,EAAC,KAAK,EAAE,CAAC,EAAA,QAAA,EAAG,QAAQ,EAAA,CAA4B;SAG3D,kBAAkB,GAAA;AAChC,IAAA,MAAM,CAAC,GAAGC,gBAAU,CAAC,eAAe,CAAC;IACrC,OAAO,EAAE,CAAC,EAAE;AACd;;;;;"}
1
+ {"version":3,"file":"i18n.js","sources":["../../../src/core/i18n.tsx"],"sourcesContent":[null],"names":["createContext","_jsx","useContext"],"mappings":";;;;;AAqBA,MAAM,QAAQ,GAAoB,CAAC,IAAY,EAAE,YAAoB,KAAK,YAAY;AAEtF,MAAM,eAAe,GAAGA,gBAAa,CAAkB,QAAQ,CAAC;AAOzD,MAAM,gBAAgB,GAAoC,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,MAC/EC,cAAA,CAAC,eAAe,CAAC,QAAQ,EAAA,EAAC,KAAK,EAAE,CAAC,EAAA,QAAA,EAAG,QAAQ,EAAA,CAA4B;SAG3D,kBAAkB,GAAA;AAChC,IAAA,MAAM,CAAC,GAAGC,aAAU,CAAC,eAAe,CAAC;IACrC,OAAO,EAAE,CAAC,EAAE;AACd;;;;;"}
@@ -0,0 +1,162 @@
1
+ 'use strict';
2
+
3
+ var Ae = require('react');
4
+ var DanceScoreEngine = require('./DanceScoreEngine.js');
5
+
6
+ /**
7
+ * DanceBridge — Connects choreography DSL (ui-graphics) ↔ pose detection (ui-3d) ↔ audio sync (ui-audio)
8
+ *
9
+ * Orchestrates a dance session: plays audio, runs reference choreography,
10
+ * captures live poses, and scores accuracy — all in sync.
11
+ */
12
+ // ── Bridge engine (non-React) ───────────────────────────────────
13
+ class DanceBridge {
14
+ constructor(config, callbacks = {}) {
15
+ this._state = 'idle';
16
+ this.startTime = 0;
17
+ this.pausedAt = 0;
18
+ this.pauseAccum = 0;
19
+ this.nextBeatIdx = 0;
20
+ this.config = config;
21
+ this.callbacks = callbacks;
22
+ this.engine = new DanceScoreEngine.DanceScoreEngine(config.scoreConfig);
23
+ this.engine.loadReference(config.reference);
24
+ const frames = config.reference.frames;
25
+ this.duration = frames.length > 0
26
+ ? frames[frames.length - 1].timestamp_sec
27
+ : 0;
28
+ }
29
+ get state() { return this._state; }
30
+ get elapsed() {
31
+ if (this._state === 'idle' || this._state === 'countdown')
32
+ return 0;
33
+ if (this._state === 'paused')
34
+ return (this.pausedAt - this.startTime - this.pauseAccum) / 1000;
35
+ if (this._state === 'finished')
36
+ return this.duration;
37
+ return (performance.now() - this.startTime - this.pauseAccum) / 1000;
38
+ }
39
+ get combo() {
40
+ return this.engine.getResult().combo;
41
+ }
42
+ start() {
43
+ var _a;
44
+ const countdownMs = ((_a = this.config.countdownSec) !== null && _a !== void 0 ? _a : 3) * 1000;
45
+ this.setState('countdown');
46
+ setTimeout(() => {
47
+ this.engine.reset();
48
+ this.startTime = performance.now();
49
+ this.pauseAccum = 0;
50
+ this.nextBeatIdx = 0;
51
+ this.setState('playing');
52
+ }, countdownMs);
53
+ }
54
+ pause() {
55
+ if (this._state !== 'playing')
56
+ return;
57
+ this.pausedAt = performance.now();
58
+ this.setState('paused');
59
+ }
60
+ resume() {
61
+ if (this._state !== 'paused')
62
+ return;
63
+ this.pauseAccum += performance.now() - this.pausedAt;
64
+ this.setState('playing');
65
+ }
66
+ stop() {
67
+ var _a, _b;
68
+ this.setState('finished');
69
+ const result = this.engine.getResult();
70
+ (_b = (_a = this.callbacks).onFinish) === null || _b === void 0 ? void 0 : _b.call(_a, result);
71
+ return result;
72
+ }
73
+ feedFrame(frame) {
74
+ var _a, _b, _c, _d, _e, _f;
75
+ if (this._state !== 'playing')
76
+ return null;
77
+ const elapsed = this.elapsed;
78
+ const offset = (_b = (_a = this.config.beatSync) === null || _a === void 0 ? void 0 : _a.offsetSec) !== null && _b !== void 0 ? _b : 0;
79
+ const adjustedFrame = {
80
+ ...frame,
81
+ timestamp_sec: elapsed + offset,
82
+ };
83
+ // Check for beats
84
+ this.checkBeats(elapsed);
85
+ // Report progress
86
+ if (this.duration > 0) {
87
+ (_d = (_c = this.callbacks).onProgress) === null || _d === void 0 ? void 0 : _d.call(_c, Math.min(elapsed / this.duration, 1));
88
+ }
89
+ // Score
90
+ const score = this.engine.scoreFrame(adjustedFrame);
91
+ (_f = (_e = this.callbacks).onScore) === null || _f === void 0 ? void 0 : _f.call(_e, score);
92
+ // Auto-finish at end of reference
93
+ if (elapsed >= this.duration) {
94
+ this.stop();
95
+ }
96
+ return score;
97
+ }
98
+ checkBeats(elapsed) {
99
+ var _a, _b, _c;
100
+ const beats = (_a = this.config.beatSync) === null || _a === void 0 ? void 0 : _a.beats;
101
+ if (!beats)
102
+ return;
103
+ while (this.nextBeatIdx < beats.length && beats[this.nextBeatIdx] <= elapsed) {
104
+ (_c = (_b = this.callbacks).onBeat) === null || _c === void 0 ? void 0 : _c.call(_b, this.nextBeatIdx, beats[this.nextBeatIdx]);
105
+ this.nextBeatIdx++;
106
+ }
107
+ }
108
+ setState(state) {
109
+ var _a, _b;
110
+ this._state = state;
111
+ (_b = (_a = this.callbacks).onStateChange) === null || _b === void 0 ? void 0 : _b.call(_a, state);
112
+ }
113
+ }
114
+ // ── React hook: useDanceBridge ──────────────────────────────────
115
+ function useDanceBridge(config, callbacks) {
116
+ const bridgeRef = Ae.useRef(null);
117
+ const [state, setState] = Ae.useState('idle');
118
+ const [lastScore, setLastScore] = Ae.useState(null);
119
+ const [result, setResult] = Ae.useState(null);
120
+ const [combo, setCombo] = Ae.useState(0);
121
+ const [progress, setProgress] = Ae.useState(0);
122
+ Ae.useEffect(() => {
123
+ if (!config) {
124
+ bridgeRef.current = null;
125
+ return;
126
+ }
127
+ bridgeRef.current = new DanceBridge(config, {
128
+ ...callbacks,
129
+ onStateChange(s) { var _a; setState(s); (_a = callbacks === null || callbacks === void 0 ? void 0 : callbacks.onStateChange) === null || _a === void 0 ? void 0 : _a.call(callbacks, s); },
130
+ onScore(score) { var _a; setLastScore(score); (_a = callbacks === null || callbacks === void 0 ? void 0 : callbacks.onScore) === null || _a === void 0 ? void 0 : _a.call(callbacks, score); },
131
+ onFinish(r) { var _a; setResult(r); (_a = callbacks === null || callbacks === void 0 ? void 0 : callbacks.onFinish) === null || _a === void 0 ? void 0 : _a.call(callbacks, r); },
132
+ onProgress(p) { var _a; setProgress(p); (_a = callbacks === null || callbacks === void 0 ? void 0 : callbacks.onProgress) === null || _a === void 0 ? void 0 : _a.call(callbacks, p); },
133
+ });
134
+ return () => { bridgeRef.current = null; };
135
+ // eslint-disable-next-line react-hooks/exhaustive-deps
136
+ }, [config]);
137
+ const start = Ae.useCallback(() => { var _a; (_a = bridgeRef.current) === null || _a === void 0 ? void 0 : _a.start(); }, []);
138
+ const pause = Ae.useCallback(() => { var _a; (_a = bridgeRef.current) === null || _a === void 0 ? void 0 : _a.pause(); }, []);
139
+ const resume = Ae.useCallback(() => { var _a; (_a = bridgeRef.current) === null || _a === void 0 ? void 0 : _a.resume(); }, []);
140
+ const stop = Ae.useCallback(() => { var _a, _b; return (_b = (_a = bridgeRef.current) === null || _a === void 0 ? void 0 : _a.stop()) !== null && _b !== void 0 ? _b : null; }, []);
141
+ const feedFrame = Ae.useCallback((frame) => {
142
+ var _a, _b;
143
+ const score = (_b = (_a = bridgeRef.current) === null || _a === void 0 ? void 0 : _a.feedFrame(frame)) !== null && _b !== void 0 ? _b : null;
144
+ if (bridgeRef.current)
145
+ setCombo(bridgeRef.current.combo);
146
+ return score;
147
+ }, []);
148
+ return { start, pause, resume, stop, feedFrame, state, lastScore, result, combo, progress };
149
+ }
150
+ // ── Utility: Convert @nice2dev/ui-audio RhythmResponse to BeatSync ──
151
+ function rhythmToBeatSync(rhythm, offsetSec = 0) {
152
+ return {
153
+ bpm: rhythm.tempoBpm,
154
+ beats: rhythm.beatsSeconds,
155
+ offsetSec,
156
+ };
157
+ }
158
+
159
+ exports.DanceBridge = DanceBridge;
160
+ exports.rhythmToBeatSync = rhythmToBeatSync;
161
+ exports.useDanceBridge = useDanceBridge;
162
+ //# sourceMappingURL=DanceBridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DanceBridge.js","sources":["../../../src/dance/DanceBridge.ts"],"sourcesContent":[null],"names":["DanceScoreEngine","useRef","useState","useEffect","useCallback"],"mappings":";;;;;AAAA;;;;;AAKG;AA6DH;MAEa,WAAW,CAAA;IAWtB,WAAA,CAAY,MAAyB,EAAE,SAAA,GAAkC,EAAE,EAAA;QAPnE,IAAA,CAAA,MAAM,GAAsB,MAAM;QAClC,IAAA,CAAA,SAAS,GAAG,CAAC;QACb,IAAA,CAAA,QAAQ,GAAG,CAAC;QACZ,IAAA,CAAA,UAAU,GAAG,CAAC;QACd,IAAA,CAAA,WAAW,GAAG,CAAC;AAIrB,QAAA,IAAI,CAAC,MAAM,GAAG,MAAM;AACpB,QAAA,IAAI,CAAC,SAAS,GAAG,SAAS;QAC1B,IAAI,CAAC,MAAM,GAAG,IAAIA,iCAAgB,CAAC,MAAM,CAAC,WAAW,CAAC;QACtD,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,SAAS,CAAC;AAE3C,QAAA,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM;AACtC,QAAA,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,MAAM,GAAG;cAC5B,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;cAC1B,CAAC;IACP;IAEA,IAAI,KAAK,KAAwB,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC;AAErD,IAAA,IAAI,OAAO,GAAA;QACT,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,IAAI,IAAI,CAAC,MAAM,KAAK,WAAW;AAAE,YAAA,OAAO,CAAC;AACnE,QAAA,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ;AAAE,YAAA,OAAO,CAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,UAAU,IAAI,IAAI;AAC9F,QAAA,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU;YAAE,OAAO,IAAI,CAAC,QAAQ;AACpD,QAAA,OAAO,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,UAAU,IAAI,IAAI;IACtE;AAEA,IAAA,IAAI,KAAK,GAAA;QACP,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,KAAK;IACtC;IAEA,KAAK,GAAA;;AACH,QAAA,MAAM,WAAW,GAAG,CAAC,CAAA,EAAA,GAAA,IAAI,CAAC,MAAM,CAAC,YAAY,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,EAAA,GAAI,CAAC,IAAI,IAAI;AAC1D,QAAA,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC;QAE1B,UAAU,CAAC,MAAK;AACd,YAAA,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;AACnB,YAAA,IAAI,CAAC,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE;AAClC,YAAA,IAAI,CAAC,UAAU,GAAG,CAAC;AACnB,YAAA,IAAI,CAAC,WAAW,GAAG,CAAC;AACpB,YAAA,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;QAC1B,CAAC,EAAE,WAAW,CAAC;IACjB;IAEA,KAAK,GAAA;AACH,QAAA,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS;YAAE;AAC/B,QAAA,IAAI,CAAC,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE;AACjC,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;IACzB;IAEA,MAAM,GAAA;AACJ,QAAA,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ;YAAE;QAC9B,IAAI,CAAC,UAAU,IAAI,WAAW,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,QAAQ;AACpD,QAAA,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;IAC1B;IAEA,IAAI,GAAA;;AACF,QAAA,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC;QACzB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE;QACtC,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,IAAI,CAAC,SAAS,EAAC,QAAQ,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAA,IAAA,CAAA,EAAA,EAAG,MAAM,CAAC;AACjC,QAAA,OAAO,MAAM;IACf;AAEA,IAAA,SAAS,CAAC,KAAkB,EAAA;;AAC1B,QAAA,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS;AAAE,YAAA,OAAO,IAAI;AAE1C,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO;AAC5B,QAAA,MAAM,MAAM,GAAG,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,SAAS,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,EAAA,GAAI,CAAC;AACnD,QAAA,MAAM,aAAa,GAAgB;AACjC,YAAA,GAAG,KAAK;YACR,aAAa,EAAE,OAAO,GAAG,MAAM;SAChC;;AAGD,QAAA,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;;AAGxB,QAAA,IAAI,IAAI,CAAC,QAAQ,GAAG,CAAC,EAAE;YACrB,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,IAAI,CAAC,SAAS,EAAC,UAAU,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAA,IAAA,CAAA,EAAA,EAAG,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QACnE;;QAGA,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,aAAa,CAAC;QACnD,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,IAAI,CAAC,SAAS,EAAC,OAAO,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAA,IAAA,CAAA,EAAA,EAAG,KAAK,CAAC;;AAG/B,QAAA,IAAI,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE;YAC5B,IAAI,CAAC,IAAI,EAAE;QACb;AAEA,QAAA,OAAO,KAAK;IACd;AAEQ,IAAA,UAAU,CAAC,OAAe,EAAA;;QAChC,MAAM,KAAK,GAAG,CAAA,EAAA,GAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,KAAK;AACzC,QAAA,IAAI,CAAC,KAAK;YAAE;AACZ,QAAA,OAAO,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,OAAO,EAAE;AAC5E,YAAA,CAAA,EAAA,GAAA,MAAA,IAAI,CAAC,SAAS,EAAC,MAAM,mDAAG,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAClE,IAAI,CAAC,WAAW,EAAE;QACpB;IACF;AAEQ,IAAA,QAAQ,CAAC,KAAwB,EAAA;;AACvC,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;QACnB,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,IAAI,CAAC,SAAS,EAAC,aAAa,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAA,IAAA,CAAA,EAAA,EAAG,KAAK,CAAC;IACvC;AACD;AAED;AAEM,SAAU,cAAc,CAC5B,MAAgC,EAChC,SAAgC,EAAA;AAEhC,IAAA,MAAM,SAAS,GAAGC,SAAM,CAAqB,IAAI,CAAC;IAClD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAGC,WAAQ,CAAoB,MAAM,CAAC;IAC7D,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAGA,WAAQ,CAAoB,IAAI,CAAC;IACnE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAGA,WAAQ,CAA4B,IAAI,CAAC;IACrE,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAGA,WAAQ,CAAC,CAAC,CAAC;IACrC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAGA,WAAQ,CAAC,CAAC,CAAC;IAE3CC,YAAS,CAAC,MAAK;QACb,IAAI,CAAC,MAAM,EAAE;AAAE,YAAA,SAAS,CAAC,OAAO,GAAG,IAAI;YAAE;QAAQ;AACjD,QAAA,SAAS,CAAC,OAAO,GAAG,IAAI,WAAW,CAAC,MAAM,EAAE;AAC1C,YAAA,GAAG,SAAS;YACZ,aAAa,CAAC,CAAC,EAAA,EAAA,IAAA,EAAA,CAAA,CAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA,EAAA,GAAA,SAAS,aAAT,SAAS,KAAA,MAAA,GAAA,MAAA,GAAT,SAAS,CAAE,aAAa,0DAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAChE,OAAO,CAAC,KAAK,EAAA,EAAA,IAAA,EAAA,CAAA,CAAI,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA,EAAA,GAAA,SAAS,aAAT,SAAS,KAAA,MAAA,GAAA,MAAA,GAAT,SAAS,CAAE,OAAO,0DAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACpE,QAAQ,CAAC,CAAC,EAAA,EAAA,IAAA,EAAA,CAAA,CAAI,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA,EAAA,GAAA,SAAS,aAAT,SAAS,KAAA,MAAA,GAAA,MAAA,GAAT,SAAS,CAAE,QAAQ,0DAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YACvD,UAAU,CAAC,CAAC,EAAA,EAAA,IAAA,EAAA,CAAA,CAAI,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA,EAAA,GAAA,SAAS,aAAT,SAAS,KAAA,MAAA,GAAA,MAAA,GAAT,SAAS,CAAE,UAAU,0DAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9D,SAAA,CAAC;QACF,OAAO,MAAK,EAAG,SAAS,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC;;AAE5C,IAAA,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;IAEZ,MAAM,KAAK,GAAGC,cAAW,CAAC,MAAK,EAAA,IAAA,EAAA,CAAA,CAAG,MAAA,SAAS,CAAC,OAAO,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IACpE,MAAM,KAAK,GAAGA,cAAW,CAAC,MAAK,EAAA,IAAA,EAAA,CAAA,CAAG,MAAA,SAAS,CAAC,OAAO,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IACpE,MAAM,MAAM,GAAGA,cAAW,CAAC,MAAK,EAAA,IAAA,EAAA,CAAA,CAAG,MAAA,SAAS,CAAC,OAAO,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IACtE,MAAM,IAAI,GAAGA,cAAW,CAAC,MAAK,EAAA,IAAA,EAAA,EAAA,EAAA,CAAA,CAAC,OAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,SAAS,CAAC,OAAO,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,IAAI,EAAE,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,EAAA,GAAI,IAAI,CAAA,CAAA,CAAA,EAAE,EAAE,CAAC;AAErE,IAAA,MAAM,SAAS,GAAGA,cAAW,CAAC,CAAC,KAAkB,KAAI;;AACnD,QAAA,MAAM,KAAK,GAAG,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,SAAS,CAAC,OAAO,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,SAAS,CAAC,KAAK,CAAC,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,EAAA,GAAI,IAAI;QACzD,IAAI,SAAS,CAAC,OAAO;AAAE,YAAA,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC;AACxD,QAAA,OAAO,KAAK;IACd,CAAC,EAAE,EAAE,CAAC;IAEN,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE;AAC7F;AAEA;SAEgB,gBAAgB,CAAC,MAAoD,EAAE,SAAS,GAAG,CAAC,EAAA;IAClG,OAAO;QACL,GAAG,EAAE,MAAM,CAAC,QAAQ;QACpB,KAAK,EAAE,MAAM,CAAC,YAAY;QAC1B,SAAS;KACV;AACH;;;;;;"}