@vib3code/sdk 2.0.1
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.
- package/CHANGELOG.md +118 -0
- package/DOCS/BLUEPRINT_EXECUTION_PLAN_2026-01-07.md +34 -0
- package/DOCS/CI_TESTING.md +38 -0
- package/DOCS/CLI_ONBOARDING.md +75 -0
- package/DOCS/CONTROL_REFERENCE.md +64 -0
- package/DOCS/DEV_TRACK_ANALYSIS.md +77 -0
- package/DOCS/DEV_TRACK_PLAN_2026-01-07.md +42 -0
- package/DOCS/DEV_TRACK_SESSION_2026-01-31.md +220 -0
- package/DOCS/ENV_SETUP.md +189 -0
- package/DOCS/EXPORT_FORMATS.md +417 -0
- package/DOCS/GPU_DISPOSAL_GUIDE.md +21 -0
- package/DOCS/LICENSING_TIERS.md +275 -0
- package/DOCS/MASTER_PLAN_2026-01-31.md +570 -0
- package/DOCS/OBS_SETUP_GUIDE.md +98 -0
- package/DOCS/PROJECT_SETUP.md +66 -0
- package/DOCS/RENDERER_LIFECYCLE.md +40 -0
- package/DOCS/REPO_MANIFEST.md +121 -0
- package/DOCS/SESSION_014_PLAN.md +195 -0
- package/DOCS/SESSION_LOG_2026-01-07.md +56 -0
- package/DOCS/STRATEGIC_BLUEPRINT_2026-01-07.md +72 -0
- package/DOCS/SYSTEM_AUDIT_2026-01-30.md +738 -0
- package/DOCS/SYSTEM_INVENTORY.md +520 -0
- package/DOCS/TELEMETRY_EXPORTS.md +34 -0
- package/DOCS/WEBGPU_STATUS.md +38 -0
- package/DOCS/XR_BENCHMARKS.md +608 -0
- package/LICENSE +21 -0
- package/README.md +426 -0
- package/docs/.nojekyll +0 -0
- package/docs/01-dissolution_of_euclidean_hegemony.html +346 -0
- package/docs/02-hyperspatial_ego_death.html +346 -0
- package/docs/03-post_cartesian_sublime.html +346 -0
- package/docs/04-crystalline_void_meditation.html +346 -0
- package/docs/05-quantum_decoherence_ballet.html +346 -0
- package/docs/06-dissolution_of_euclidean_hegemony.html +346 -0
- package/docs/07-hyperspatial_ego_death.html +346 -0
- package/docs/08-post_cartesian_sublime.html +346 -0
- package/docs/09-crystalline_void_meditation.html +346 -0
- package/docs/10-quantum_decoherence_ballet.html +346 -0
- package/docs/11-dissolution_of_euclidean_hegemony.html +346 -0
- package/docs/12-hyperspatial_ego_death.html +346 -0
- package/docs/13-post_cartesian_sublime.html +346 -0
- package/docs/index.html +794 -0
- package/docs/test-hub.html +441 -0
- package/docs/url-state.js +102 -0
- package/docs/vib3-exports/01-quantum-quantum-tetrahedron-lattice.html +489 -0
- package/docs/vib3-exports/02-quantum-quantum-hypersphere-matrix.html +489 -0
- package/docs/vib3-exports/03-quantum-quantum-hypertetra-fractal.html +489 -0
- package/docs/vib3-exports/04-faceted-faceted-crystal-structure.html +407 -0
- package/docs/vib3-exports/05-faceted-faceted-klein-bottle.html +407 -0
- package/docs/vib3-exports/06-faceted-faceted-hypertetra-torus.html +407 -0
- package/docs/vib3-exports/07-holographic-holographic-wave-field.html +457 -0
- package/docs/vib3-exports/08-holographic-holographic-hypersphere-sphere.html +457 -0
- package/docs/vib3-exports/09-holographic-holographic-hypertetra-crystal.html +457 -0
- package/docs/vib3-exports/index.html +238 -0
- package/docs/webgpu-live.html +702 -0
- package/package.json +367 -0
- package/src/advanced/AIPresetGenerator.js +777 -0
- package/src/advanced/MIDIController.js +703 -0
- package/src/advanced/OffscreenWorker.js +1051 -0
- package/src/advanced/WebGPUCompute.js +1051 -0
- package/src/advanced/WebXRRenderer.js +680 -0
- package/src/agent/cli/AgentCLI.js +615 -0
- package/src/agent/cli/index.js +14 -0
- package/src/agent/index.js +73 -0
- package/src/agent/mcp/MCPServer.js +950 -0
- package/src/agent/mcp/index.js +9 -0
- package/src/agent/mcp/tools.js +548 -0
- package/src/agent/telemetry/EventStream.js +669 -0
- package/src/agent/telemetry/Instrumentation.js +618 -0
- package/src/agent/telemetry/TelemetryExporters.js +427 -0
- package/src/agent/telemetry/TelemetryService.js +464 -0
- package/src/agent/telemetry/index.js +52 -0
- package/src/benchmarks/BenchmarkRunner.js +381 -0
- package/src/benchmarks/MetricsCollector.js +299 -0
- package/src/benchmarks/index.js +9 -0
- package/src/benchmarks/scenes.js +259 -0
- package/src/cli/index.js +675 -0
- package/src/config/ApiConfig.js +88 -0
- package/src/core/CanvasManager.js +217 -0
- package/src/core/ErrorReporter.js +117 -0
- package/src/core/ParameterMapper.js +333 -0
- package/src/core/Parameters.js +396 -0
- package/src/core/RendererContracts.js +200 -0
- package/src/core/UnifiedResourceManager.js +370 -0
- package/src/core/VIB3Engine.js +636 -0
- package/src/core/renderers/FacetedRendererAdapter.js +32 -0
- package/src/core/renderers/HolographicRendererAdapter.js +29 -0
- package/src/core/renderers/QuantumRendererAdapter.js +29 -0
- package/src/core/renderers/RendererLifecycleManager.js +63 -0
- package/src/creative/ColorPresetsSystem.js +980 -0
- package/src/creative/ParameterTimeline.js +1061 -0
- package/src/creative/PostProcessingPipeline.js +1113 -0
- package/src/creative/TransitionAnimator.js +683 -0
- package/src/export/CSSExporter.js +226 -0
- package/src/export/CardGeneratorBase.js +279 -0
- package/src/export/ExportManager.js +580 -0
- package/src/export/FacetedCardGenerator.js +279 -0
- package/src/export/HolographicCardGenerator.js +543 -0
- package/src/export/LottieExporter.js +552 -0
- package/src/export/QuantumCardGenerator.js +315 -0
- package/src/export/SVGExporter.js +519 -0
- package/src/export/ShaderExporter.js +903 -0
- package/src/export/TradingCardGenerator.js +3055 -0
- package/src/export/TradingCardManager.js +181 -0
- package/src/export/VIB3PackageExporter.js +559 -0
- package/src/export/index.js +14 -0
- package/src/export/systems/TradingCardSystemFaceted.js +494 -0
- package/src/export/systems/TradingCardSystemHolographic.js +452 -0
- package/src/export/systems/TradingCardSystemQuantum.js +411 -0
- package/src/faceted/FacetedSystem.js +963 -0
- package/src/features/CollectionManager.js +433 -0
- package/src/gallery/CollectionManager.js +240 -0
- package/src/gallery/GallerySystem.js +485 -0
- package/src/geometry/GeometryFactory.js +314 -0
- package/src/geometry/GeometryLibrary.js +72 -0
- package/src/geometry/buffers/BufferBuilder.js +338 -0
- package/src/geometry/buffers/index.js +18 -0
- package/src/geometry/generators/Crystal.js +420 -0
- package/src/geometry/generators/Fractal.js +298 -0
- package/src/geometry/generators/KleinBottle.js +197 -0
- package/src/geometry/generators/Sphere.js +192 -0
- package/src/geometry/generators/Tesseract.js +160 -0
- package/src/geometry/generators/Tetrahedron.js +225 -0
- package/src/geometry/generators/Torus.js +304 -0
- package/src/geometry/generators/Wave.js +341 -0
- package/src/geometry/index.js +142 -0
- package/src/geometry/warp/HypersphereCore.js +211 -0
- package/src/geometry/warp/HypertetraCore.js +386 -0
- package/src/geometry/warp/index.js +57 -0
- package/src/holograms/HolographicVisualizer.js +1073 -0
- package/src/holograms/RealHolographicSystem.js +966 -0
- package/src/holograms/variantRegistry.js +69 -0
- package/src/integrations/FigmaPlugin.js +854 -0
- package/src/integrations/OBSMode.js +754 -0
- package/src/integrations/ThreeJsPackage.js +660 -0
- package/src/integrations/TouchDesignerExport.js +552 -0
- package/src/integrations/frameworks/Vib3React.js +591 -0
- package/src/integrations/frameworks/Vib3Svelte.js +654 -0
- package/src/integrations/frameworks/Vib3Vue.js +628 -0
- package/src/llm/LLMParameterInterface.js +240 -0
- package/src/llm/LLMParameterUI.js +577 -0
- package/src/math/Mat4x4.js +708 -0
- package/src/math/Projection.js +341 -0
- package/src/math/Rotor4D.js +637 -0
- package/src/math/Vec4.js +476 -0
- package/src/math/constants.js +164 -0
- package/src/math/index.js +68 -0
- package/src/math/projections.js +54 -0
- package/src/math/rotations.js +196 -0
- package/src/quantum/QuantumEngine.js +906 -0
- package/src/quantum/QuantumVisualizer.js +1103 -0
- package/src/reactivity/ReactivityConfig.js +499 -0
- package/src/reactivity/ReactivityManager.js +586 -0
- package/src/reactivity/SpatialInputSystem.js +1783 -0
- package/src/reactivity/index.js +93 -0
- package/src/render/CommandBuffer.js +465 -0
- package/src/render/MultiCanvasBridge.js +340 -0
- package/src/render/RenderCommand.js +514 -0
- package/src/render/RenderResourceRegistry.js +523 -0
- package/src/render/RenderState.js +552 -0
- package/src/render/RenderTarget.js +512 -0
- package/src/render/ShaderLoader.js +253 -0
- package/src/render/ShaderProgram.js +599 -0
- package/src/render/UnifiedRenderBridge.js +496 -0
- package/src/render/backends/WebGLBackend.js +1108 -0
- package/src/render/backends/WebGPUBackend.js +1409 -0
- package/src/render/commands/CommandBufferExecutor.js +607 -0
- package/src/render/commands/RenderCommandBuffer.js +661 -0
- package/src/render/commands/index.js +17 -0
- package/src/render/index.js +367 -0
- package/src/scene/Disposable.js +498 -0
- package/src/scene/MemoryPool.js +618 -0
- package/src/scene/Node4D.js +697 -0
- package/src/scene/ResourceManager.js +599 -0
- package/src/scene/Scene4D.js +540 -0
- package/src/scene/index.js +98 -0
- package/src/schemas/error.schema.json +84 -0
- package/src/schemas/extension.schema.json +88 -0
- package/src/schemas/index.js +214 -0
- package/src/schemas/parameters.schema.json +142 -0
- package/src/schemas/tool-pack.schema.json +44 -0
- package/src/schemas/tool-response.schema.json +127 -0
- package/src/shaders/common/fullscreen.vert.glsl +5 -0
- package/src/shaders/common/fullscreen.vert.wgsl +17 -0
- package/src/shaders/common/geometry24.glsl +65 -0
- package/src/shaders/common/geometry24.wgsl +54 -0
- package/src/shaders/common/rotation4d.glsl +85 -0
- package/src/shaders/common/rotation4d.wgsl +86 -0
- package/src/shaders/common/uniforms.glsl +44 -0
- package/src/shaders/common/uniforms.wgsl +48 -0
- package/src/shaders/faceted/faceted.frag.glsl +129 -0
- package/src/shaders/faceted/faceted.frag.wgsl +164 -0
- package/src/shaders/holographic/holographic.frag.glsl +406 -0
- package/src/shaders/holographic/holographic.frag.wgsl +185 -0
- package/src/shaders/quantum/quantum.frag.glsl +513 -0
- package/src/shaders/quantum/quantum.frag.wgsl +361 -0
- package/src/testing/ParallelTestFramework.js +519 -0
- package/src/testing/__snapshots__/exportFormats.test.js.snap +24 -0
- package/src/testing/exportFormats.test.js +8 -0
- package/src/testing/projections.test.js +14 -0
- package/src/testing/rotations.test.js +37 -0
- package/src/ui/InteractivityMenu.js +516 -0
- package/src/ui/StatusManager.js +96 -0
- package/src/ui/adaptive/renderers/webgpu/BufferLayout.ts +252 -0
- package/src/ui/adaptive/renderers/webgpu/PolytopeInstanceBuffer.ts +144 -0
- package/src/ui/adaptive/renderers/webgpu/TripleBufferedUniform.ts +170 -0
- package/src/ui/adaptive/renderers/webgpu/WebGPURenderer.ts +735 -0
- package/src/ui/adaptive/renderers/webgpu/index.ts +112 -0
- package/src/variations/VariationManager.js +431 -0
- package/src/viewer/AudioReactivity.js +505 -0
- package/src/viewer/CardBending.js +481 -0
- package/src/viewer/GalleryUI.js +832 -0
- package/src/viewer/ReactivityManager.js +590 -0
- package/src/viewer/TradingCardExporter.js +600 -0
- package/src/viewer/ViewerPortal.js +374 -0
- package/src/viewer/index.js +12 -0
- package/src/wasm/WasmLoader.js +296 -0
- package/src/wasm/index.js +132 -0
- package/tools/agentic/mcpTools.js +88 -0
- package/tools/cli/agent-cli.js +92 -0
- package/tools/export/formats.js +24 -0
- package/tools/math/rotation-baseline.mjs +64 -0
- package/tools/shader-sync-verify.js +937 -0
- package/tools/telemetry/manifestPipeline.js +141 -0
- package/tools/telemetry/telemetryEvents.js +35 -0
- package/types/adaptive-sdk.d.ts +185 -0
- package/types/advanced/AIPresetGenerator.d.ts +81 -0
- package/types/advanced/MIDIController.d.ts +100 -0
- package/types/advanced/OffscreenWorker.d.ts +82 -0
- package/types/advanced/WebGPUCompute.d.ts +52 -0
- package/types/advanced/WebXRRenderer.d.ts +77 -0
- package/types/advanced/index.d.ts +46 -0
- package/types/core/ErrorReporter.d.ts +50 -0
- package/types/core/VIB3Engine.d.ts +204 -0
- package/types/creative/ColorPresetsSystem.d.ts +91 -0
- package/types/creative/ParameterTimeline.d.ts +74 -0
- package/types/creative/PostProcessingPipeline.d.ts +109 -0
- package/types/creative/TransitionAnimator.d.ts +71 -0
- package/types/creative/index.d.ts +35 -0
- package/types/integrations/FigmaPlugin.d.ts +46 -0
- package/types/integrations/OBSMode.d.ts +74 -0
- package/types/integrations/ThreeJsPackage.d.ts +62 -0
- package/types/integrations/TouchDesignerExport.d.ts +36 -0
- package/types/integrations/Vib3React.d.ts +74 -0
- package/types/integrations/Vib3Svelte.d.ts +63 -0
- package/types/integrations/Vib3Vue.d.ts +55 -0
- package/types/integrations/index.d.ts +52 -0
- package/types/reactivity/SpatialInputSystem.d.ts +173 -0
- package/types/reactivity/index.d.ts +394 -0
- package/types/render/CommandBuffer.d.ts +169 -0
- package/types/render/RenderCommand.d.ts +312 -0
- package/types/render/RenderState.d.ts +279 -0
- package/types/render/RenderTarget.d.ts +254 -0
- package/types/render/ShaderProgram.d.ts +277 -0
- package/types/render/UnifiedRenderBridge.d.ts +143 -0
- package/types/render/WebGLBackend.d.ts +168 -0
- package/types/render/WebGPUBackend.d.ts +186 -0
- package/types/render/index.d.ts +141 -0
|
@@ -0,0 +1,654 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* VIB3+ Svelte Component Wrapper
|
|
3
|
+
*
|
|
4
|
+
* Generates Svelte component source code and writable store definitions
|
|
5
|
+
* for embedding VIB3+ 4D visualizations in Svelte applications.
|
|
6
|
+
*
|
|
7
|
+
* Usage (generated component):
|
|
8
|
+
* <Vib3Visualizer system="quantum" hue={200} saturation={0.8} />
|
|
9
|
+
*
|
|
10
|
+
* Usage (generated store):
|
|
11
|
+
* import { vib3Store } from '@vib3/svelte';
|
|
12
|
+
* $vib3Store.setParameter('hue', 270);
|
|
13
|
+
*
|
|
14
|
+
* NOTE: This module generates Svelte source code strings and package structures.
|
|
15
|
+
* The output is intended for use in a Svelte or SvelteKit project.
|
|
16
|
+
*
|
|
17
|
+
* @module Vib3SvelteWrapper
|
|
18
|
+
* @version 1.0.0
|
|
19
|
+
* @license All Rights Reserved - Clear Seas Solutions LLC
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* VIB3+ parameter definitions for Svelte prop declarations.
|
|
24
|
+
* @constant {Object}
|
|
25
|
+
*/
|
|
26
|
+
const VIB3_SVELTE_PROPS = {
|
|
27
|
+
system: { type: 'string', default: "'quantum'" },
|
|
28
|
+
geometry: { type: 'number', default: 0 },
|
|
29
|
+
hue: { type: 'number', default: 200 },
|
|
30
|
+
saturation: { type: 'number', default: 0.8 },
|
|
31
|
+
intensity: { type: 'number', default: 0.5 },
|
|
32
|
+
speed: { type: 'number', default: 1.0 },
|
|
33
|
+
gridDensity: { type: 'number', default: 15 },
|
|
34
|
+
morphFactor: { type: 'number', default: 1.0 },
|
|
35
|
+
chaos: { type: 'number', default: 0.2 },
|
|
36
|
+
dimension: { type: 'number', default: 3.5 },
|
|
37
|
+
rot4dXY: { type: 'number', default: 0 },
|
|
38
|
+
rot4dXZ: { type: 'number', default: 0 },
|
|
39
|
+
rot4dYZ: { type: 'number', default: 0 },
|
|
40
|
+
rot4dXW: { type: 'number', default: 0 },
|
|
41
|
+
rot4dYW: { type: 'number', default: 0 },
|
|
42
|
+
rot4dZW: { type: 'number', default: 0 }
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Numeric parameter names for batch updates.
|
|
47
|
+
* @constant {string[]}
|
|
48
|
+
*/
|
|
49
|
+
const NUMERIC_PROP_NAMES = Object.keys(VIB3_SVELTE_PROPS).filter(
|
|
50
|
+
k => VIB3_SVELTE_PROPS[k].type === 'number'
|
|
51
|
+
);
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Svelte wrapper for VIB3+ visualization engine.
|
|
55
|
+
*
|
|
56
|
+
* Provides static methods that generate Svelte component source code,
|
|
57
|
+
* store definitions, and full NPM package structures for the @vib3/svelte package.
|
|
58
|
+
*
|
|
59
|
+
* @class
|
|
60
|
+
*/
|
|
61
|
+
export class Vib3SvelteWrapper {
|
|
62
|
+
/**
|
|
63
|
+
* Returns a Svelte component source code string (.svelte format).
|
|
64
|
+
*
|
|
65
|
+
* The generated component:
|
|
66
|
+
* - Declares all VIB3 parameters as exported props
|
|
67
|
+
* - Uses $: reactive declarations to sync props to the engine
|
|
68
|
+
* - Initializes VIB3Engine in onMount
|
|
69
|
+
* - Destroys the engine in onDestroy
|
|
70
|
+
* - Dispatches 'ready' and 'error' events
|
|
71
|
+
* - Exposes engine methods via bind:this
|
|
72
|
+
*
|
|
73
|
+
* @returns {string} Complete Svelte component source code
|
|
74
|
+
* @example
|
|
75
|
+
* const componentCode = Vib3SvelteWrapper.getComponent();
|
|
76
|
+
* // Write to src/lib/Vib3Visualizer.svelte
|
|
77
|
+
*/
|
|
78
|
+
static getComponent() {
|
|
79
|
+
return `<script>
|
|
80
|
+
import { onMount, onDestroy, createEventDispatcher } from 'svelte';
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* VIB3+ Visualizer Svelte Component
|
|
84
|
+
*
|
|
85
|
+
* Renders a VIB3+ 4D visualization. Accepts all VIB3 parameters as props.
|
|
86
|
+
*
|
|
87
|
+
* @fires ready - When the engine is initialized. Detail: VIB3Engine instance.
|
|
88
|
+
* @fires error - On initialization failure. Detail: Error object.
|
|
89
|
+
*
|
|
90
|
+
* @example
|
|
91
|
+
* <Vib3Visualizer system="quantum" hue={200} saturation={0.8} on:ready={handleReady} />
|
|
92
|
+
*/
|
|
93
|
+
|
|
94
|
+
const dispatch = createEventDispatcher();
|
|
95
|
+
|
|
96
|
+
// ---- Props ----
|
|
97
|
+
/** @type {string} Active visualization system */
|
|
98
|
+
export let system = 'quantum';
|
|
99
|
+
/** @type {number} Geometry variant (0-23) */
|
|
100
|
+
export let geometry = 0;
|
|
101
|
+
/** @type {number} Color hue (0-360) */
|
|
102
|
+
export let hue = 200;
|
|
103
|
+
/** @type {number} Color saturation (0-1) */
|
|
104
|
+
export let saturation = 0.8;
|
|
105
|
+
/** @type {number} Visual intensity (0-1) */
|
|
106
|
+
export let intensity = 0.5;
|
|
107
|
+
/** @type {number} Animation speed (0.1-3) */
|
|
108
|
+
export let speed = 1.0;
|
|
109
|
+
/** @type {number} Pattern density (4-100) */
|
|
110
|
+
export let gridDensity = 15;
|
|
111
|
+
/** @type {number} Shape interpolation (0-2) */
|
|
112
|
+
export let morphFactor = 1.0;
|
|
113
|
+
/** @type {number} Randomness level (0-1) */
|
|
114
|
+
export let chaos = 0.2;
|
|
115
|
+
/** @type {number} 4D projection distance (3.0-4.5) */
|
|
116
|
+
export let dimension = 3.5;
|
|
117
|
+
/** @type {number} XY plane rotation (radians) */
|
|
118
|
+
export let rot4dXY = 0;
|
|
119
|
+
/** @type {number} XZ plane rotation (radians) */
|
|
120
|
+
export let rot4dXZ = 0;
|
|
121
|
+
/** @type {number} YZ plane rotation (radians) */
|
|
122
|
+
export let rot4dYZ = 0;
|
|
123
|
+
/** @type {number} XW hyperplane rotation (radians) */
|
|
124
|
+
export let rot4dXW = 0;
|
|
125
|
+
/** @type {number} YW hyperplane rotation (radians) */
|
|
126
|
+
export let rot4dYW = 0;
|
|
127
|
+
/** @type {number} ZW hyperplane rotation (radians) */
|
|
128
|
+
export let rot4dZW = 0;
|
|
129
|
+
/** @type {string} Container CSS width */
|
|
130
|
+
export let width = '100%';
|
|
131
|
+
/** @type {string} Container CSS height */
|
|
132
|
+
export let height = '400px';
|
|
133
|
+
/** @type {string} Additional CSS classes */
|
|
134
|
+
export let className = '';
|
|
135
|
+
/** @type {boolean} Prefer WebGPU backend */
|
|
136
|
+
export let preferWebGPU = false;
|
|
137
|
+
/** @type {boolean} Enable debug logging */
|
|
138
|
+
export let debug = false;
|
|
139
|
+
|
|
140
|
+
// ---- Internal State ----
|
|
141
|
+
let containerEl;
|
|
142
|
+
let engine = null;
|
|
143
|
+
let initialized = false;
|
|
144
|
+
const containerId = 'vib3-svelte-' + Math.random().toString(36).substring(2, 11);
|
|
145
|
+
|
|
146
|
+
// ---- Lifecycle ----
|
|
147
|
+
onMount(async () => {
|
|
148
|
+
try {
|
|
149
|
+
// Dynamic import so the Svelte component works in SSR
|
|
150
|
+
const { VIB3Engine } = await import('@vib3/core');
|
|
151
|
+
|
|
152
|
+
engine = new VIB3Engine({ preferWebGPU, debug });
|
|
153
|
+
const success = await engine.initialize(containerId);
|
|
154
|
+
|
|
155
|
+
if (!success) {
|
|
156
|
+
throw new Error('VIB3Engine initialization failed');
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
await engine.switchSystem(system);
|
|
160
|
+
syncParams();
|
|
161
|
+
|
|
162
|
+
initialized = true;
|
|
163
|
+
dispatch('ready', engine);
|
|
164
|
+
} catch (err) {
|
|
165
|
+
console.error('[Vib3Visualizer] Initialization error:', err);
|
|
166
|
+
dispatch('error', err);
|
|
167
|
+
}
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
onDestroy(() => {
|
|
171
|
+
if (engine) {
|
|
172
|
+
engine.destroy();
|
|
173
|
+
engine = null;
|
|
174
|
+
}
|
|
175
|
+
initialized = false;
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
// ---- Reactive Synchronization ----
|
|
179
|
+
function syncParams() {
|
|
180
|
+
if (!engine || !initialized) return;
|
|
181
|
+
engine.setParameters({
|
|
182
|
+
geometry, hue, saturation, intensity, speed,
|
|
183
|
+
gridDensity, morphFactor, chaos, dimension,
|
|
184
|
+
rot4dXY, rot4dXZ, rot4dYZ, rot4dXW, rot4dYW, rot4dZW
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
// React to system change
|
|
189
|
+
$: if (initialized && engine) {
|
|
190
|
+
engine.switchSystem(system);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
// React to parameter changes
|
|
194
|
+
$: if (initialized && engine) {
|
|
195
|
+
// This block re-runs whenever any listed variable changes
|
|
196
|
+
void (geometry, hue, saturation, intensity, speed,
|
|
197
|
+
gridDensity, morphFactor, chaos, dimension,
|
|
198
|
+
rot4dXY, rot4dXZ, rot4dYZ, rot4dXW, rot4dYW, rot4dZW);
|
|
199
|
+
syncParams();
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
// ---- Public API (accessible via bind:this) ----
|
|
203
|
+
|
|
204
|
+
/** @returns {object|null} The underlying VIB3Engine instance */
|
|
205
|
+
export function getEngine() {
|
|
206
|
+
return engine;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/** @returns {boolean} Whether the engine has been initialized */
|
|
210
|
+
export function isInitialized() {
|
|
211
|
+
return initialized;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
/** Randomize all visualization parameters */
|
|
215
|
+
export function randomize() {
|
|
216
|
+
if (engine && initialized) engine.randomizeAll();
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
/** Reset parameters to defaults */
|
|
220
|
+
export function reset() {
|
|
221
|
+
if (engine && initialized) engine.resetAll();
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
/** Export current engine state */
|
|
225
|
+
export function exportState() {
|
|
226
|
+
return engine ? engine.exportState() : null;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
/** Import an engine state object */
|
|
230
|
+
export async function importState(state) {
|
|
231
|
+
if (engine) await engine.importState(state);
|
|
232
|
+
}
|
|
233
|
+
<\/script>
|
|
234
|
+
|
|
235
|
+
<div
|
|
236
|
+
id={containerId}
|
|
237
|
+
bind:this={containerEl}
|
|
238
|
+
class="vib3-visualizer {className}"
|
|
239
|
+
style="width:{width};height:{height};position:relative;overflow:hidden;background:#000"
|
|
240
|
+
/>
|
|
241
|
+
|
|
242
|
+
<style>
|
|
243
|
+
.vib3-visualizer {
|
|
244
|
+
position: relative;
|
|
245
|
+
overflow: hidden;
|
|
246
|
+
background: #000;
|
|
247
|
+
}
|
|
248
|
+
</style>
|
|
249
|
+
`;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
/**
|
|
253
|
+
* Returns a Svelte writable store definition for VIB3+ state management.
|
|
254
|
+
*
|
|
255
|
+
* The generated store:
|
|
256
|
+
* - Uses Svelte's writable store pattern
|
|
257
|
+
* - Holds engine reference, initialization state, current system, and all parameters
|
|
258
|
+
* - Provides helper methods: setParameter, setParameters, switchSystem, randomize, reset
|
|
259
|
+
* - Automatically syncs store state to the engine
|
|
260
|
+
*
|
|
261
|
+
* @returns {string} Complete Svelte store source code
|
|
262
|
+
* @example
|
|
263
|
+
* const storeCode = Vib3SvelteWrapper.getStore();
|
|
264
|
+
* // Write to src/lib/vib3Store.js
|
|
265
|
+
*/
|
|
266
|
+
static getStore() {
|
|
267
|
+
return `import { writable, derived, get } from 'svelte/store';
|
|
268
|
+
|
|
269
|
+
/**
|
|
270
|
+
* VIB3+ Svelte Store
|
|
271
|
+
*
|
|
272
|
+
* Manages VIB3Engine state as a Svelte writable store.
|
|
273
|
+
* Provides reactive state and methods for controlling the visualization.
|
|
274
|
+
*
|
|
275
|
+
* @example
|
|
276
|
+
* import { vib3Store, vib3Actions } from '$lib/vib3Store';
|
|
277
|
+
*
|
|
278
|
+
* // Subscribe to state
|
|
279
|
+
* $: console.log($vib3Store.parameters.hue);
|
|
280
|
+
*
|
|
281
|
+
* // Update parameter
|
|
282
|
+
* vib3Actions.setParameter('hue', 270);
|
|
283
|
+
*
|
|
284
|
+
* // Switch system
|
|
285
|
+
* vib3Actions.switchSystem('holographic');
|
|
286
|
+
*/
|
|
287
|
+
|
|
288
|
+
/** @type {import('svelte/store').Writable} */
|
|
289
|
+
export const vib3Store = writable({
|
|
290
|
+
/** @type {object|null} VIB3Engine instance */
|
|
291
|
+
engine: null,
|
|
292
|
+
/** @type {boolean} Whether the engine is initialized */
|
|
293
|
+
initialized: false,
|
|
294
|
+
/** @type {string} Current active system */
|
|
295
|
+
system: 'quantum',
|
|
296
|
+
/** @type {object} Current visualization parameters */
|
|
297
|
+
parameters: {
|
|
298
|
+
geometry: 0,
|
|
299
|
+
hue: 200,
|
|
300
|
+
saturation: 0.8,
|
|
301
|
+
intensity: 0.5,
|
|
302
|
+
speed: 1.0,
|
|
303
|
+
gridDensity: 15,
|
|
304
|
+
morphFactor: 1.0,
|
|
305
|
+
chaos: 0.2,
|
|
306
|
+
dimension: 3.5,
|
|
307
|
+
rot4dXY: 0, rot4dXZ: 0, rot4dYZ: 0,
|
|
308
|
+
rot4dXW: 0, rot4dYW: 0, rot4dZW: 0
|
|
309
|
+
}
|
|
310
|
+
});
|
|
311
|
+
|
|
312
|
+
/**
|
|
313
|
+
* Derived store: whether the engine is ready for commands
|
|
314
|
+
* @type {import('svelte/store').Readable<boolean>}
|
|
315
|
+
*/
|
|
316
|
+
export const vib3Ready = derived(vib3Store, ($store) => $store.initialized);
|
|
317
|
+
|
|
318
|
+
/**
|
|
319
|
+
* Derived store: current visualization system name
|
|
320
|
+
* @type {import('svelte/store').Readable<string>}
|
|
321
|
+
*/
|
|
322
|
+
export const vib3System = derived(vib3Store, ($store) => $store.system);
|
|
323
|
+
|
|
324
|
+
/**
|
|
325
|
+
* Derived store: current visualization parameters
|
|
326
|
+
* @type {import('svelte/store').Readable<object>}
|
|
327
|
+
*/
|
|
328
|
+
export const vib3Params = derived(vib3Store, ($store) => $store.parameters);
|
|
329
|
+
|
|
330
|
+
/**
|
|
331
|
+
* Action creators for the VIB3 store.
|
|
332
|
+
* These mutate the store and sync changes to the engine.
|
|
333
|
+
*/
|
|
334
|
+
export const vib3Actions = {
|
|
335
|
+
/**
|
|
336
|
+
* Initialize the engine and connect it to the store.
|
|
337
|
+
* Call this once after the container element is in the DOM.
|
|
338
|
+
*
|
|
339
|
+
* @param {string} containerId - DOM element ID to mount VIB3 into
|
|
340
|
+
* @param {object} [options={}] - Engine constructor options
|
|
341
|
+
* @returns {Promise<boolean>} Whether initialization succeeded
|
|
342
|
+
*/
|
|
343
|
+
async initialize(containerId, options = {}) {
|
|
344
|
+
const { VIB3Engine } = await import('@vib3/core');
|
|
345
|
+
|
|
346
|
+
const engine = new VIB3Engine({
|
|
347
|
+
preferWebGPU: options.preferWebGPU || false,
|
|
348
|
+
debug: options.debug || false
|
|
349
|
+
});
|
|
350
|
+
|
|
351
|
+
const success = await engine.initialize(containerId);
|
|
352
|
+
if (success) {
|
|
353
|
+
const allParams = engine.getAllParameters();
|
|
354
|
+
vib3Store.set({
|
|
355
|
+
engine,
|
|
356
|
+
initialized: true,
|
|
357
|
+
system: engine.getCurrentSystem(),
|
|
358
|
+
parameters: { ...allParams }
|
|
359
|
+
});
|
|
360
|
+
}
|
|
361
|
+
return success;
|
|
362
|
+
},
|
|
363
|
+
|
|
364
|
+
/**
|
|
365
|
+
* Set a single visualization parameter.
|
|
366
|
+
* @param {string} name - Parameter name
|
|
367
|
+
* @param {number} value - Parameter value
|
|
368
|
+
*/
|
|
369
|
+
setParameter(name, value) {
|
|
370
|
+
const state = get(vib3Store);
|
|
371
|
+
if (state.engine && state.initialized) {
|
|
372
|
+
state.engine.setParameter(name, value);
|
|
373
|
+
vib3Store.update(s => ({
|
|
374
|
+
...s,
|
|
375
|
+
parameters: { ...s.parameters, [name]: value }
|
|
376
|
+
}));
|
|
377
|
+
}
|
|
378
|
+
},
|
|
379
|
+
|
|
380
|
+
/**
|
|
381
|
+
* Set multiple visualization parameters at once.
|
|
382
|
+
* @param {object} params - Object of name/value parameter pairs
|
|
383
|
+
*/
|
|
384
|
+
setParameters(params) {
|
|
385
|
+
const state = get(vib3Store);
|
|
386
|
+
if (state.engine && state.initialized) {
|
|
387
|
+
state.engine.setParameters(params);
|
|
388
|
+
vib3Store.update(s => ({
|
|
389
|
+
...s,
|
|
390
|
+
parameters: { ...s.parameters, ...params }
|
|
391
|
+
}));
|
|
392
|
+
}
|
|
393
|
+
},
|
|
394
|
+
|
|
395
|
+
/**
|
|
396
|
+
* Switch to a different visualization system.
|
|
397
|
+
* @param {string} newSystem - 'quantum' | 'faceted' | 'holographic'
|
|
398
|
+
* @returns {Promise<boolean>} Whether the switch succeeded
|
|
399
|
+
*/
|
|
400
|
+
async switchSystem(newSystem) {
|
|
401
|
+
const state = get(vib3Store);
|
|
402
|
+
if (state.engine && state.initialized) {
|
|
403
|
+
const success = await state.engine.switchSystem(newSystem);
|
|
404
|
+
if (success) {
|
|
405
|
+
vib3Store.update(s => ({
|
|
406
|
+
...s,
|
|
407
|
+
system: newSystem,
|
|
408
|
+
parameters: { ...state.engine.getAllParameters() }
|
|
409
|
+
}));
|
|
410
|
+
}
|
|
411
|
+
return success;
|
|
412
|
+
}
|
|
413
|
+
return false;
|
|
414
|
+
},
|
|
415
|
+
|
|
416
|
+
/** Randomize all parameters */
|
|
417
|
+
randomize() {
|
|
418
|
+
const state = get(vib3Store);
|
|
419
|
+
if (state.engine && state.initialized) {
|
|
420
|
+
state.engine.randomizeAll();
|
|
421
|
+
vib3Store.update(s => ({
|
|
422
|
+
...s,
|
|
423
|
+
parameters: { ...state.engine.getAllParameters() }
|
|
424
|
+
}));
|
|
425
|
+
}
|
|
426
|
+
},
|
|
427
|
+
|
|
428
|
+
/** Reset parameters to defaults */
|
|
429
|
+
reset() {
|
|
430
|
+
const state = get(vib3Store);
|
|
431
|
+
if (state.engine && state.initialized) {
|
|
432
|
+
state.engine.resetAll();
|
|
433
|
+
vib3Store.update(s => ({
|
|
434
|
+
...s,
|
|
435
|
+
parameters: { ...state.engine.getAllParameters() }
|
|
436
|
+
}));
|
|
437
|
+
}
|
|
438
|
+
},
|
|
439
|
+
|
|
440
|
+
/** Export the current engine state */
|
|
441
|
+
exportState() {
|
|
442
|
+
const state = get(vib3Store);
|
|
443
|
+
return state.engine ? state.engine.exportState() : null;
|
|
444
|
+
},
|
|
445
|
+
|
|
446
|
+
/** Import an engine state object */
|
|
447
|
+
async importState(stateObj) {
|
|
448
|
+
const state = get(vib3Store);
|
|
449
|
+
if (state.engine) {
|
|
450
|
+
await state.engine.importState(stateObj);
|
|
451
|
+
vib3Store.update(s => ({
|
|
452
|
+
...s,
|
|
453
|
+
system: state.engine.getCurrentSystem(),
|
|
454
|
+
parameters: { ...state.engine.getAllParameters() }
|
|
455
|
+
}));
|
|
456
|
+
}
|
|
457
|
+
},
|
|
458
|
+
|
|
459
|
+
/** Start reactivity processing */
|
|
460
|
+
startReactivity() {
|
|
461
|
+
const state = get(vib3Store);
|
|
462
|
+
if (state.engine) state.engine.startReactivity();
|
|
463
|
+
},
|
|
464
|
+
|
|
465
|
+
/** Stop reactivity processing */
|
|
466
|
+
stopReactivity() {
|
|
467
|
+
const state = get(vib3Store);
|
|
468
|
+
if (state.engine) state.engine.stopReactivity();
|
|
469
|
+
},
|
|
470
|
+
|
|
471
|
+
/**
|
|
472
|
+
* Feed audio levels into reactivity.
|
|
473
|
+
* @param {number} bass - Bass level (0-1)
|
|
474
|
+
* @param {number} mid - Mid level (0-1)
|
|
475
|
+
* @param {number} high - High level (0-1)
|
|
476
|
+
*/
|
|
477
|
+
setAudioInput(bass, mid, high) {
|
|
478
|
+
const state = get(vib3Store);
|
|
479
|
+
if (state.engine) state.engine.setAudioInput(bass, mid, high);
|
|
480
|
+
},
|
|
481
|
+
|
|
482
|
+
/** Destroy the engine and reset the store */
|
|
483
|
+
destroy() {
|
|
484
|
+
const state = get(vib3Store);
|
|
485
|
+
if (state.engine) {
|
|
486
|
+
state.engine.destroy();
|
|
487
|
+
}
|
|
488
|
+
vib3Store.set({
|
|
489
|
+
engine: null,
|
|
490
|
+
initialized: false,
|
|
491
|
+
system: 'quantum',
|
|
492
|
+
parameters: {
|
|
493
|
+
geometry: 0, hue: 200, saturation: 0.8, intensity: 0.5,
|
|
494
|
+
speed: 1.0, gridDensity: 15, morphFactor: 1.0, chaos: 0.2,
|
|
495
|
+
dimension: 3.5, rot4dXY: 0, rot4dXZ: 0, rot4dYZ: 0,
|
|
496
|
+
rot4dXW: 0, rot4dYW: 0, rot4dZW: 0
|
|
497
|
+
}
|
|
498
|
+
});
|
|
499
|
+
}
|
|
500
|
+
};
|
|
501
|
+
`;
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
/**
|
|
505
|
+
* Generates a complete NPM package structure for @vib3/svelte.
|
|
506
|
+
*
|
|
507
|
+
* @returns {Object.<string, string|object>} Map of file path to file content
|
|
508
|
+
*/
|
|
509
|
+
static generatePackage() {
|
|
510
|
+
return {
|
|
511
|
+
'package.json': {
|
|
512
|
+
name: '@vib3/svelte',
|
|
513
|
+
version: '1.0.0',
|
|
514
|
+
description: 'Svelte components for VIB3+ 4D Visualization Engine',
|
|
515
|
+
svelte: 'src/index.js',
|
|
516
|
+
main: 'dist/index.js',
|
|
517
|
+
module: 'src/index.js',
|
|
518
|
+
types: 'dist/index.d.ts',
|
|
519
|
+
files: ['dist/', 'src/'],
|
|
520
|
+
scripts: {
|
|
521
|
+
build: 'svelte-kit sync && svelte-package',
|
|
522
|
+
dev: 'vite dev',
|
|
523
|
+
prepublishOnly: 'npm run build'
|
|
524
|
+
},
|
|
525
|
+
peerDependencies: {
|
|
526
|
+
svelte: '>=4.0.0',
|
|
527
|
+
'@vib3/core': '>=1.0.0'
|
|
528
|
+
},
|
|
529
|
+
devDependencies: {
|
|
530
|
+
'@sveltejs/kit': '^2.0.0',
|
|
531
|
+
'@sveltejs/package': '^2.0.0',
|
|
532
|
+
svelte: '^4.0.0',
|
|
533
|
+
vite: '^5.0.0'
|
|
534
|
+
},
|
|
535
|
+
keywords: ['vib3', 'svelte', 'sveltekit', '4d', 'visualization', 'webgl', 'webgpu', 'shader'],
|
|
536
|
+
license: 'MIT',
|
|
537
|
+
repository: {
|
|
538
|
+
type: 'git',
|
|
539
|
+
url: 'https://github.com/clear-seas/vib3-svelte'
|
|
540
|
+
},
|
|
541
|
+
author: 'Clear Seas Solutions LLC'
|
|
542
|
+
},
|
|
543
|
+
|
|
544
|
+
'src/index.js': `/**
|
|
545
|
+
* @vib3/svelte - Svelte bindings for VIB3+ 4D Visualization Engine
|
|
546
|
+
* @module @vib3/svelte
|
|
547
|
+
*/
|
|
548
|
+
export { default as Vib3Visualizer } from './Vib3Visualizer.svelte';
|
|
549
|
+
export { vib3Store, vib3Ready, vib3System, vib3Params, vib3Actions } from './vib3Store.js';
|
|
550
|
+
`,
|
|
551
|
+
|
|
552
|
+
'src/Vib3Visualizer.svelte': Vib3SvelteWrapper.getComponent(),
|
|
553
|
+
|
|
554
|
+
'src/vib3Store.js': Vib3SvelteWrapper.getStore(),
|
|
555
|
+
|
|
556
|
+
'README.md': `# @vib3/svelte
|
|
557
|
+
|
|
558
|
+
Svelte components and stores for the VIB3+ 4D Visualization Engine.
|
|
559
|
+
|
|
560
|
+
## Installation
|
|
561
|
+
|
|
562
|
+
\`\`\`bash
|
|
563
|
+
npm install @vib3/svelte @vib3/core svelte
|
|
564
|
+
\`\`\`
|
|
565
|
+
|
|
566
|
+
## Quick Start
|
|
567
|
+
|
|
568
|
+
### Component Usage
|
|
569
|
+
|
|
570
|
+
\`\`\`svelte
|
|
571
|
+
<script>
|
|
572
|
+
import { Vib3Visualizer } from '@vib3/svelte';
|
|
573
|
+
|
|
574
|
+
function handleReady(event) {
|
|
575
|
+
console.log('VIB3 ready:', event.detail);
|
|
576
|
+
}
|
|
577
|
+
</script>
|
|
578
|
+
|
|
579
|
+
<Vib3Visualizer
|
|
580
|
+
system="quantum"
|
|
581
|
+
hue={200}
|
|
582
|
+
saturation={0.8}
|
|
583
|
+
geometry={5}
|
|
584
|
+
width="100%"
|
|
585
|
+
height="600px"
|
|
586
|
+
on:ready={handleReady}
|
|
587
|
+
/>
|
|
588
|
+
\`\`\`
|
|
589
|
+
|
|
590
|
+
### Store Usage
|
|
591
|
+
|
|
592
|
+
\`\`\`svelte
|
|
593
|
+
<script>
|
|
594
|
+
import { onMount } from 'svelte';
|
|
595
|
+
import { vib3Store, vib3Actions, vib3Ready } from '@vib3/svelte';
|
|
596
|
+
|
|
597
|
+
onMount(async () => {
|
|
598
|
+
await vib3Actions.initialize('vib3-container');
|
|
599
|
+
});
|
|
600
|
+
</script>
|
|
601
|
+
|
|
602
|
+
<div id="vib3-container" style="width:100%;height:400px" />
|
|
603
|
+
|
|
604
|
+
{#if $vib3Ready}
|
|
605
|
+
<button on:click={() => vib3Actions.switchSystem('quantum')}>Quantum</button>
|
|
606
|
+
<button on:click={() => vib3Actions.switchSystem('faceted')}>Faceted</button>
|
|
607
|
+
<button on:click={() => vib3Actions.randomize()}>Randomize</button>
|
|
608
|
+
<input type="range" min="0" max="360"
|
|
609
|
+
value={$vib3Store.parameters.hue}
|
|
610
|
+
on:input={(e) => vib3Actions.setParameter('hue', Number(e.target.value))} />
|
|
611
|
+
{/if}
|
|
612
|
+
\`\`\`
|
|
613
|
+
|
|
614
|
+
## Props
|
|
615
|
+
|
|
616
|
+
| Prop | Type | Default | Description |
|
|
617
|
+
|------|------|---------|-------------|
|
|
618
|
+
| system | string | 'quantum' | Active system |
|
|
619
|
+
| geometry | number | 0 | Geometry variant (0-23) |
|
|
620
|
+
| hue | number | 200 | Color hue (0-360) |
|
|
621
|
+
| saturation | number | 0.8 | Color saturation (0-1) |
|
|
622
|
+
| intensity | number | 0.5 | Visual intensity (0-1) |
|
|
623
|
+
| speed | number | 1.0 | Animation speed (0.1-3) |
|
|
624
|
+
| gridDensity | number | 15 | Pattern density (4-100) |
|
|
625
|
+
| morphFactor | number | 1.0 | Shape interpolation (0-2) |
|
|
626
|
+
| chaos | number | 0.2 | Randomness (0-1) |
|
|
627
|
+
| dimension | number | 3.5 | Projection distance (3.0-4.5) |
|
|
628
|
+
| rot4dXY-ZW | number | 0 | 6D rotation angles (radians) |
|
|
629
|
+
| width | string | '100%' | Container width |
|
|
630
|
+
| height | string | '400px' | Container height |
|
|
631
|
+
|
|
632
|
+
## License
|
|
633
|
+
|
|
634
|
+
MIT - Clear Seas Solutions LLC
|
|
635
|
+
`
|
|
636
|
+
};
|
|
637
|
+
}
|
|
638
|
+
|
|
639
|
+
/**
|
|
640
|
+
* Returns the Svelte prop definitions.
|
|
641
|
+
* @returns {Object} Prop definition map
|
|
642
|
+
*/
|
|
643
|
+
static getPropDefs() {
|
|
644
|
+
return { ...VIB3_SVELTE_PROPS };
|
|
645
|
+
}
|
|
646
|
+
|
|
647
|
+
/**
|
|
648
|
+
* Returns the list of numeric parameter prop names.
|
|
649
|
+
* @returns {string[]}
|
|
650
|
+
*/
|
|
651
|
+
static getNumericPropNames() {
|
|
652
|
+
return [...NUMERIC_PROP_NAMES];
|
|
653
|
+
}
|
|
654
|
+
}
|