@toolproof-core/visualization 1.0.0

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.
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/_lib/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/_lib/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,23 @@
1
+ import React from "react";
2
+ import * as THREE from "three";
3
+ type OrbitControlsLike = {
4
+ target: THREE.Vector3;
5
+ };
6
+ export type PortalInteractionPolicy = "none" | "activate-only" | "deactivate-only" | "toggle";
7
+ export interface PortalProps {
8
+ isActive: boolean;
9
+ setIsActive: (active: boolean) => void;
10
+ /**
11
+ * Controls whether user gestures can change portal active state.
12
+ * Defaults to "toggle" to preserve existing behavior.
13
+ */
14
+ interactionPolicy?: PortalInteractionPolicy;
15
+ orbitControlsRef?: React.RefObject<OrbitControlsLike | null>;
16
+ onTransitionComplete?: (active: boolean) => void;
17
+ targetScale?: number;
18
+ onScaleAnimationEnd?: () => void;
19
+ children?: React.ReactNode;
20
+ }
21
+ export default function Portal({ isActive, setIsActive, interactionPolicy, orbitControlsRef, onTransitionComplete, targetScale, onScaleAnimationEnd, children, }: PortalProps): import("react/jsx-runtime").JSX.Element;
22
+ export {};
23
+ //# sourceMappingURL=Portal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Portal.d.ts","sourceRoot":"","sources":["../../src/primitives/Portal.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA6C,MAAM,OAAO,CAAC;AAClE,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAW/B,KAAK,iBAAiB,GAAG;IACvB,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC;CACvB,CAAC;AAMF,MAAM,MAAM,uBAAuB,GAC/B,MAAM,GACN,eAAe,GACf,iBAAiB,GACjB,QAAQ,CAAC;AAEb,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC;;;OAGG;IACH,iBAAiB,CAAC,EAAE,uBAAuB,CAAC;IAC5C,gBAAgB,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAAC;IAC7D,oBAAoB,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IACjD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mBAAmB,CAAC,EAAE,MAAM,IAAI,CAAC;IACjC,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B;AA6BD,MAAM,CAAC,OAAO,UAAU,MAAM,CAAC,EAC7B,QAAQ,EACR,WAAW,EACX,iBAA4B,EAC5B,gBAAgB,EAChB,oBAAoB,EACpB,WAAe,EACf,mBAAmB,EACnB,QAAQ,GACT,EAAE,WAAW,2CAuLb"}
@@ -0,0 +1,102 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import React, { useEffect, useLayoutEffect, useRef } from "react";
3
+ import * as THREE from "three";
4
+ import { useFrame, useThree } from "@react-three/fiber";
5
+ import { Environment, MeshPortalMaterial, Sparkles, Stars, } from "@react-three/drei";
6
+ import gsap from "gsap";
7
+ const PortalRing = ({ radius, rotation = 0, speed = 1 }) => {
8
+ const ringRef = useRef(null);
9
+ useFrame((state) => {
10
+ if (ringRef.current) {
11
+ ringRef.current.rotation.z = state.clock.elapsedTime * speed + rotation;
12
+ }
13
+ });
14
+ return (_jsxs("mesh", { ref: ringRef, children: [_jsx("torusGeometry", { args: [radius, 0.08, 16, 100] }), _jsx("meshStandardMaterial", { color: "#00d4ff", emissive: "#00d4ff", emissiveIntensity: 2, transparent: true, opacity: 0.8 })] }));
15
+ };
16
+ export default function Portal({ isActive, setIsActive, interactionPolicy = "toggle", orbitControlsRef, onTransitionComplete, targetScale = 1, onScaleAnimationEnd, children, }) {
17
+ const portalMaterial = useRef(null);
18
+ const groupRef = useRef(null);
19
+ const { camera } = useThree();
20
+ const onTransitionCompleteRef = useRef(undefined);
21
+ useEffect(() => {
22
+ onTransitionCompleteRef.current = onTransitionComplete;
23
+ }, [onTransitionComplete]);
24
+ /* useLayoutEffect(() => {
25
+ if (groupRef.current) {
26
+ gsap.to(groupRef.current.scale, {
27
+ x: isActive ? targetScale : 0,
28
+ y: isActive ? targetScale : 0,
29
+ z: isActive ? targetScale : 0,
30
+ duration: 1,
31
+ ease: "back.out(1.7)",
32
+ onComplete: onScaleAnimationEnd,
33
+ });
34
+ }
35
+ }, [isActive, targetScale, onScaleAnimationEnd]); */
36
+ // useLayoutEffect(() => {
37
+ // if (!portalMaterial.current) return;
38
+ // gsap.to(portalMaterial.current, {
39
+ // blend: isActive ? 1 : 0,
40
+ // duration: 0.7,
41
+ // ease: "power2.inOut",
42
+ // });
43
+ // }, [isActive]);
44
+ // useLayoutEffect(() => {
45
+ // const targetPos = isActive
46
+ // ? new THREE.Vector3(5, 5, 10)
47
+ // : new THREE.Vector3(10, 10, 0);
48
+ // const targetLookAt = isActive
49
+ // ? new THREE.Vector3(0, 0, 20)
50
+ // : new THREE.Vector3(0, 0, 0);
51
+ // const tl = gsap.timeline({
52
+ // defaults: { duration: 1.5, ease: "power3.inOut" },
53
+ // onComplete: () => onTransitionCompleteRef.current?.(isActive),
54
+ // });
55
+ // tl.to(camera.position, {
56
+ // x: targetPos.x,
57
+ // y: targetPos.y,
58
+ // z: targetPos.z,
59
+ // });
60
+ // const orbitControls = orbitControlsRef?.current ?? null;
61
+ // if (orbitControls) {
62
+ // tl.to(
63
+ // orbitControls.target,
64
+ // {
65
+ // x: targetLookAt.x,
66
+ // y: targetLookAt.y,
67
+ // z: targetLookAt.z,
68
+ // },
69
+ // 0,
70
+ // );
71
+ // }
72
+ // return () => {
73
+ // tl.kill();
74
+ // };
75
+ // }, [isActive, camera, orbitControlsRef]);
76
+ const handleDoubleClick = (e) => {
77
+ let nextActive = null;
78
+ switch (interactionPolicy) {
79
+ case "none":
80
+ return;
81
+ case "toggle":
82
+ nextActive = !isActive;
83
+ break;
84
+ case "activate-only":
85
+ nextActive = isActive ? null : true;
86
+ break;
87
+ case "deactivate-only":
88
+ nextActive = isActive ? false : null;
89
+ break;
90
+ default:
91
+ // Defensive: if a consumer passes an unknown value, preserve legacy toggle.
92
+ nextActive = !isActive;
93
+ break;
94
+ }
95
+ if (nextActive === null)
96
+ return;
97
+ e.stopPropagation();
98
+ setIsActive(nextActive);
99
+ };
100
+ return (_jsxs("group", { ref: groupRef, children: [_jsx(PortalRing, { radius: 8.5, rotation: 0, speed: 0.3 }), _jsx(PortalRing, { radius: 9, rotation: Math.PI / 4, speed: -0.2 }), _jsx(PortalRing, { radius: 9.5, rotation: Math.PI / 2, speed: 0.15 }), _jsx(Sparkles, { count: 100, size: 3, scale: [20, 20, 6], speed: 0.5, color: "#00d4ff" }), _jsxs("mesh", { onDoubleClick: handleDoubleClick, children: [_jsx("circleGeometry", { args: [8, 64] }), _jsxs(MeshPortalMaterial, { ref: portalMaterial, side: THREE.DoubleSide, transparent: true, blur: 0.3, resolution: 512, children: [_jsx("ambientLight", { intensity: 0.3 }), _jsx("pointLight", { position: [0, 5, 5], intensity: 2, color: "#00d4ff" }), _jsx("pointLight", { position: [0, -5, 5], intensity: 1, color: "#8b5cf6" }), _jsx(Environment, { preset: "night" }), _jsxs("mesh", { children: [_jsx("sphereGeometry", { args: [30, 64, 64] }), _jsx("meshStandardMaterial", { color: "#050520", side: THREE.BackSide })] }), _jsxs("mesh", { children: [_jsx("sphereGeometry", { args: [28, 32, 32] }), _jsx("meshBasicMaterial", { color: "#1a0a30", transparent: true, opacity: 0.5, side: THREE.BackSide })] }), _jsx(Stars, { radius: 25, depth: 50, count: 3000, factor: 4, saturation: 0.5, fade: true, speed: 1 }), _jsx("group", { children: children }), _jsx(Sparkles, { count: 200, size: 2, scale: [20, 20, 20], speed: 0.3, color: "#ffffff" })] })] }), _jsxs("mesh", { children: [_jsx("ringGeometry", { args: [7.8, 8.2, 64] }), _jsx("meshBasicMaterial", { color: "#00d4ff", transparent: true, opacity: 0.8, side: THREE.DoubleSide })] }), _jsxs("mesh", { children: [_jsx("ringGeometry", { args: [8, 8.5, 64] }), _jsx("meshBasicMaterial", { color: "#00d4ff", transparent: true, opacity: 0.4, side: THREE.DoubleSide })] })] }));
101
+ }
102
+ //# sourceMappingURL=Portal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Portal.js","sourceRoot":"","sources":["../../src/primitives/Portal.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ import type { NucleusBaseSmall } from '@toolproof-core/lib/types';
2
+ import type { ReactNode } from 'react';
3
+ import * as THREE from 'three';
4
+ import type { ThreeElements } from '@react-three/fiber';
5
+ export type RingMeshConfig = {
6
+ geometry: THREE.BufferGeometry;
7
+ material: THREE.Material | THREE.Material[];
8
+ };
9
+ export type RingGuideConfig = {
10
+ /** Number of segments for the circle polyline. */
11
+ segments?: number;
12
+ /** Y offset for the guide relative to ring center. */
13
+ y?: number;
14
+ /** Provide your own material if you want full control. */
15
+ material?: THREE.LineBasicMaterial;
16
+ /** Convenience when not providing a material. */
17
+ color?: THREE.ColorRepresentation;
18
+ /** Convenience when not providing a material. Defaults to 0.35. */
19
+ opacity?: number;
20
+ };
21
+ export type RingOfMeshesProps<TItem extends NucleusBaseSmall = NucleusBaseSmall> = {
22
+ items: readonly TItem[];
23
+ ringRadius: number;
24
+ ringRotation?: [number, number, number];
25
+ /**
26
+ * Optional angular range (in radians) to distribute items across, instead of a full 2π ring.
27
+ * When provided:
28
+ * - count === 1: item is placed at the midpoint of the range
29
+ * - count > 1: items are evenly distributed from start → end
30
+ */
31
+ angleRange?: {
32
+ start: number;
33
+ end: number;
34
+ };
35
+ /**
36
+ * Optional visual guide (circle line) drawn through the centers of the meshes.
37
+ * - Omit/undefined/false: do not render.
38
+ * - Provide config object: render with given config.
39
+ */
40
+ ringGuide?: false | RingGuideConfig;
41
+ meshConfig: RingMeshConfig;
42
+ getMeshConfig?: (item: TItem, index: number) => RingMeshConfig;
43
+ getMeshProps?: (item: TItem, index: number) => ThreeElements['mesh'];
44
+ getItemGroupProps?: (item: TItem, index: number) => ThreeElements['group'];
45
+ /**
46
+ * Optional slot rendered after the mesh inside each positioned item group.
47
+ * Keeps this component focused on layout + mesh while allowing callers
48
+ * to render labels/overlays without duplicating ring math.
49
+ */
50
+ renderItemChildren?: (item: TItem, index: number) => ReactNode;
51
+ };
52
+ export declare function RingOfMeshes<TItem extends NucleusBaseSmall = NucleusBaseSmall>(props: RingOfMeshesProps<TItem>): import("react/jsx-runtime").JSX.Element | null;
53
+ //# sourceMappingURL=RingOfMeshes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RingOfMeshes.d.ts","sourceRoot":"","sources":["../../src/primitives/RingOfMeshes.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGxD,MAAM,MAAM,cAAc,GAAG;IACzB,QAAQ,EAAE,KAAK,CAAC,cAAc,CAAC;IAC/B,QAAQ,EAAE,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;CAC/C,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC1B,kDAAkD;IAClD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,sDAAsD;IACtD,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,0DAA0D;IAC1D,QAAQ,CAAC,EAAE,KAAK,CAAC,iBAAiB,CAAC;IACnC,iDAAiD;IACjD,KAAK,CAAC,EAAE,KAAK,CAAC,mBAAmB,CAAC;IAClC,mEAAmE;IACnE,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,iBAAiB,CAAC,KAAK,SAAS,gBAAgB,GAAG,gBAAgB,IAAI;IAC/E,KAAK,EAAE,SAAS,KAAK,EAAE,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAExC;;;;;OAKG;IACH,UAAU,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5C;;;;OAIG;IACH,SAAS,CAAC,EAAE,KAAK,GAAG,eAAe,CAAC;IACpC,UAAU,EAAE,cAAc,CAAC;IAC3B,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,KAAK,cAAc,CAAC;IAC/D,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,KAAK,aAAa,CAAC,MAAM,CAAC,CAAC;IACrE,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,KAAK,aAAa,CAAC,OAAO,CAAC,CAAC;IAE3E;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,KAAK,SAAS,CAAC;CAClE,CAAC;AAEF,wBAAgB,YAAY,CAAC,KAAK,SAAS,gBAAgB,GAAG,gBAAgB,EAAE,KAAK,EAAE,iBAAiB,CAAC,KAAK,CAAC,kDA4F9G"}
@@ -0,0 +1,67 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useMemo } from 'react';
3
+ import * as THREE from 'three';
4
+ export function RingOfMeshes(props) {
5
+ const { items, ringRadius, ringRotation = [0, 0, 0], angleRange, meshConfig, ringGuide, getMeshConfig, getMeshProps, getItemGroupProps, renderItemChildren, } = props;
6
+ const count = items.length;
7
+ const showRingGuide = ringGuide != null && ringGuide !== false;
8
+ const ringGuideConfig = showRingGuide ? ringGuide : undefined;
9
+ const ringGuideProvidedMaterial = ringGuideConfig?.material;
10
+ const ringGuideColor = ringGuideConfig?.color;
11
+ const ringGuideOpacity = ringGuideConfig?.opacity;
12
+ const ringGuideSegments = ringGuideConfig?.segments ?? 128;
13
+ const ringGuideY = ringGuideConfig?.y ?? 0;
14
+ const ringGuideGeometry = useMemo(() => {
15
+ if (!showRingGuide || count === 0)
16
+ return null;
17
+ const points = [];
18
+ for (let i = 0; i < ringGuideSegments; i++) {
19
+ const angle = (i / ringGuideSegments) * Math.PI * 2;
20
+ points.push(new THREE.Vector3(Math.cos(angle) * ringRadius, ringGuideY, Math.sin(angle) * ringRadius));
21
+ }
22
+ const geometry = new THREE.BufferGeometry();
23
+ geometry.setFromPoints(points);
24
+ return geometry;
25
+ }, [showRingGuide, count, ringGuideSegments, ringGuideY, ringRadius]);
26
+ const ringGuideMaterial = useMemo(() => {
27
+ if (!showRingGuide || count === 0)
28
+ return null;
29
+ if (ringGuideProvidedMaterial)
30
+ return ringGuideProvidedMaterial;
31
+ const opacity = ringGuideOpacity ?? 0.35;
32
+ return new THREE.LineBasicMaterial({
33
+ color: ringGuideColor ?? 'white',
34
+ transparent: opacity < 1,
35
+ opacity,
36
+ });
37
+ }, [showRingGuide, count, ringGuideProvidedMaterial, ringGuideOpacity, ringGuideColor]);
38
+ useEffect(() => {
39
+ return () => {
40
+ ringGuideGeometry?.dispose();
41
+ if (showRingGuide && ringGuideProvidedMaterial == null) {
42
+ ringGuideMaterial?.dispose();
43
+ }
44
+ };
45
+ }, [ringGuideGeometry, ringGuideMaterial, showRingGuide, ringGuideProvidedMaterial]);
46
+ if (count === 0)
47
+ return null;
48
+ return (_jsxs("group", { rotation: ringRotation, children: [showRingGuide && ringGuideGeometry && ringGuideMaterial ? (_jsx("lineLoop", { geometry: ringGuideGeometry, material: ringGuideMaterial })) : null, items.map((item, index) => {
49
+ const angle = (() => {
50
+ if (angleRange) {
51
+ const { start, end } = angleRange;
52
+ if (count <= 1)
53
+ return (start + end) / 2;
54
+ const t = index / (count - 1);
55
+ return start + t * (end - start);
56
+ }
57
+ return (index / count) * Math.PI * 2;
58
+ })();
59
+ const x = Math.cos(angle) * ringRadius;
60
+ const z = Math.sin(angle) * ringRadius;
61
+ const resolvedMeshConfig = getMeshConfig ? getMeshConfig(item, index) : meshConfig;
62
+ const rawGroupProps = getItemGroupProps ? getItemGroupProps(item, index) : undefined;
63
+ const rawMeshProps = getMeshProps ? getMeshProps(item, index) : undefined;
64
+ return (_jsxs("group", { ...rawGroupProps, position: [x, 0, z], children: [_jsx("mesh", { ...rawMeshProps, geometry: resolvedMeshConfig.geometry, material: resolvedMeshConfig.material }), renderItemChildren ? renderItemChildren(item, index) : null] }, item.identity));
65
+ })] }));
66
+ }
67
+ //# sourceMappingURL=RingOfMeshes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RingOfMeshes.js","sourceRoot":"","sources":["../../src/primitives/RingOfMeshes.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ import type { NucleusBaseSmall } from '@toolproof-core/lib/types';
2
+ import type { ReactNode } from 'react';
3
+ import * as THREE from 'three';
4
+ import type { ThreeElements } from '@react-three/fiber';
5
+ export type SpokeMeshConfig = {
6
+ geometry: THREE.BufferGeometry;
7
+ material: THREE.Material | THREE.Material[];
8
+ };
9
+ export type SpokeGuideConfig = {
10
+ /** Provide your own material if you want full control. */
11
+ material?: THREE.LineBasicMaterial;
12
+ /** Convenience when not providing a material. */
13
+ color?: THREE.ColorRepresentation;
14
+ /** Convenience when not providing a material. Defaults to 0.35. */
15
+ opacity?: number;
16
+ };
17
+ export type SpokeOfMeshesProps<TItem extends NucleusBaseSmall = NucleusBaseSmall> = {
18
+ items: readonly TItem[];
19
+ /** World position for the origin-nearest mesh (items[0]). */
20
+ originNearestPosition: [number, number, number];
21
+ /** Direction in which the line extends. Will be normalized internally. */
22
+ direction: [number, number, number];
23
+ /** Optional rotation around the anchor position. */
24
+ spokeRotation?: [number, number, number];
25
+ /** Optional visual guide (straight line) drawn through the centers of the meshes. */
26
+ spokeGuide?: false | SpokeGuideConfig;
27
+ meshConfig: SpokeMeshConfig;
28
+ getMeshConfig?: (item: TItem, index: number) => SpokeMeshConfig;
29
+ getMeshProps?: (item: TItem, index: number) => ThreeElements['mesh'];
30
+ getItemGroupProps?: (item: TItem, index: number) => ThreeElements['group'];
31
+ /**
32
+ * Explicit spacing between adjacent meshes.
33
+ * If omitted, spacing is derived from `meshConfig.geometry` bounding sphere.
34
+ */
35
+ itemSpacing?: number;
36
+ /** Multiplier applied when deriving spacing from geometry. */
37
+ itemSpacingMultiplier?: number;
38
+ /** Optional slot rendered after the mesh inside each positioned item group. */
39
+ renderItemChildren?: (item: TItem, index: number) => ReactNode;
40
+ };
41
+ export declare function SpokeOfMeshes<TItem extends NucleusBaseSmall = NucleusBaseSmall>(props: SpokeOfMeshesProps<TItem>): import("react/jsx-runtime").JSX.Element | null;
42
+ //# sourceMappingURL=SpokeOfMeshes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SpokeOfMeshes.d.ts","sourceRoot":"","sources":["../../src/primitives/SpokeOfMeshes.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGxD,MAAM,MAAM,eAAe,GAAG;IAC1B,QAAQ,EAAE,KAAK,CAAC,cAAc,CAAC;IAC/B,QAAQ,EAAE,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;CAC/C,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC3B,0DAA0D;IAC1D,QAAQ,CAAC,EAAE,KAAK,CAAC,iBAAiB,CAAC;IACnC,iDAAiD;IACjD,KAAK,CAAC,EAAE,KAAK,CAAC,mBAAmB,CAAC;IAClC,mEAAmE;IACnE,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,kBAAkB,CAAC,KAAK,SAAS,gBAAgB,GAAG,gBAAgB,IAAI;IAChF,KAAK,EAAE,SAAS,KAAK,EAAE,CAAC;IAExB,6DAA6D;IAC7D,qBAAqB,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAEhD,0EAA0E;IAC1E,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAEpC,oDAAoD;IACpD,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAEzC,qFAAqF;IACrF,UAAU,CAAC,EAAE,KAAK,GAAG,gBAAgB,CAAC;IAEtC,UAAU,EAAE,eAAe,CAAC;IAC5B,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,KAAK,eAAe,CAAC;IAChE,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,KAAK,aAAa,CAAC,MAAM,CAAC,CAAC;IACrE,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,KAAK,aAAa,CAAC,OAAO,CAAC,CAAC;IAE3E;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,8DAA8D;IAC9D,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAE/B,+EAA+E;IAC/E,kBAAkB,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,KAAK,SAAS,CAAC;CAClE,CAAC;AAEF,wBAAgB,aAAa,CAAC,KAAK,SAAS,gBAAgB,GAAG,gBAAgB,EAAE,KAAK,EAAE,kBAAkB,CAAC,KAAK,CAAC,kDAiHhH"}
@@ -0,0 +1,78 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useMemo } from 'react';
3
+ import * as THREE from 'three';
4
+ export function SpokeOfMeshes(props) {
5
+ const { items, originNearestPosition, direction, spokeRotation: spokeRotation = [0, 0, 0], spokeGuide, meshConfig, getMeshConfig, getMeshProps, getItemGroupProps, renderItemChildren, itemSpacing, itemSpacingMultiplier, } = props;
6
+ const count = items.length;
7
+ const showSpokeGuide = spokeGuide != null && spokeGuide !== false;
8
+ const spokeGuideConfig = showSpokeGuide ? spokeGuide : undefined;
9
+ const spokeGuideProvidedMaterial = spokeGuideConfig?.material;
10
+ const spokeGuideColor = spokeGuideConfig?.color;
11
+ const spokeGuideOpacity = spokeGuideConfig?.opacity;
12
+ const directionUnit = useMemo(() => {
13
+ const [dx, dy, dz] = direction;
14
+ const vec = new THREE.Vector3(dx, dy, dz);
15
+ if (vec.lengthSq() < 1e-12) {
16
+ vec.set(1, 0, 0);
17
+ }
18
+ else {
19
+ vec.normalize();
20
+ }
21
+ return vec;
22
+ }, [direction]);
23
+ const resolvedItemSpacing = useMemo(() => {
24
+ if (typeof itemSpacing === 'number' && Number.isFinite(itemSpacing) && itemSpacing > 0) {
25
+ return itemSpacing;
26
+ }
27
+ const geometry = meshConfig.geometry;
28
+ if (!geometry.boundingSphere) {
29
+ geometry.computeBoundingSphere();
30
+ }
31
+ const radius = geometry.boundingSphere?.radius;
32
+ const diameter = typeof radius === 'number' && Number.isFinite(radius) && radius > 0 ? radius * 2 : 1;
33
+ const mult = typeof itemSpacingMultiplier === 'number' && Number.isFinite(itemSpacingMultiplier) && itemSpacingMultiplier > 0 ? itemSpacingMultiplier : 1.0;
34
+ return diameter * mult;
35
+ }, [itemSpacing, itemSpacingMultiplier, meshConfig.geometry]);
36
+ const spokeGuideGeometry = useMemo(() => {
37
+ if (!showSpokeGuide || count < 2)
38
+ return null;
39
+ const start = new THREE.Vector3(0, 0, 0);
40
+ const end = directionUnit.clone().multiplyScalar(resolvedItemSpacing * (count - 1));
41
+ const geometry = new THREE.BufferGeometry();
42
+ geometry.setFromPoints([start, end]);
43
+ return geometry;
44
+ }, [showSpokeGuide, count, directionUnit, resolvedItemSpacing]);
45
+ const spokeGuideMaterial = useMemo(() => {
46
+ if (!showSpokeGuide || count < 2)
47
+ return null;
48
+ if (spokeGuideProvidedMaterial)
49
+ return spokeGuideProvidedMaterial;
50
+ const opacity = spokeGuideOpacity ?? 0.35;
51
+ return new THREE.LineBasicMaterial({
52
+ color: spokeGuideColor ?? 'white',
53
+ transparent: opacity < 1,
54
+ opacity,
55
+ });
56
+ }, [showSpokeGuide, count, spokeGuideProvidedMaterial, spokeGuideOpacity, spokeGuideColor]);
57
+ useEffect(() => {
58
+ return () => {
59
+ spokeGuideGeometry?.dispose();
60
+ if (showSpokeGuide && spokeGuideProvidedMaterial == null) {
61
+ spokeGuideMaterial?.dispose();
62
+ }
63
+ };
64
+ }, [spokeGuideGeometry, spokeGuideMaterial, showSpokeGuide, spokeGuideProvidedMaterial]);
65
+ if (count === 0)
66
+ return null;
67
+ return (_jsxs("group", { position: originNearestPosition, rotation: spokeRotation, children: [showSpokeGuide && spokeGuideGeometry && spokeGuideMaterial ? (_jsx("lineSegments", { geometry: spokeGuideGeometry, material: spokeGuideMaterial })) : null, items.map((item, index) => {
68
+ const offset = resolvedItemSpacing * index;
69
+ const x = directionUnit.x * offset;
70
+ const y = directionUnit.y * offset;
71
+ const z = directionUnit.z * offset;
72
+ const resolvedMeshConfig = getMeshConfig ? getMeshConfig(item, index) : meshConfig;
73
+ const rawGroupProps = getItemGroupProps ? getItemGroupProps(item, index) : undefined;
74
+ const rawMeshProps = getMeshProps ? getMeshProps(item, index) : undefined;
75
+ return (_jsx("group", { position: [x, y, z], children: _jsxs("group", { ...rawGroupProps, children: [_jsx("mesh", { ...rawMeshProps, geometry: resolvedMeshConfig.geometry, material: resolvedMeshConfig.material }), renderItemChildren ? renderItemChildren(item, index) : null] }) }, item.identity));
76
+ })] }));
77
+ }
78
+ //# sourceMappingURL=SpokeOfMeshes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SpokeOfMeshes.js","sourceRoot":"","sources":["../../src/primitives/SpokeOfMeshes.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ import { type RuntimeCameraConfig } from './RuntimeView.js';
2
+ import { type PortalInteractionPolicy } from '../primitives/Portal.js';
3
+ import React from 'react';
4
+ import { OrbitControls } from '@react-three/drei';
5
+ export type SpaceId = 'genesis' | 'strategy';
6
+ export type PortalDescriptor = {
7
+ id: string;
8
+ from: SpaceId;
9
+ to: SpaceId;
10
+ position: [number, number, number];
11
+ rotation: [number, number, number];
12
+ scale: number;
13
+ visible: boolean;
14
+ };
15
+ export type RuntimeControllerStatus = {
16
+ activeSpace: SpaceId;
17
+ portal?: PortalDescriptor;
18
+ isTransitioning: boolean;
19
+ };
20
+ export type RuntimeControllerHandle = {
21
+ setActiveSpace: (space: SpaceId) => void;
22
+ transitionTo: (space: SpaceId, opts?: {
23
+ via?: 'portal';
24
+ portalId?: string;
25
+ }) => void;
26
+ getStatus: () => RuntimeControllerStatus;
27
+ subscribeStatus: (listener: (status: RuntimeControllerStatus) => void) => () => void;
28
+ };
29
+ type OrbitControlsImpl = React.ElementRef<typeof OrbitControls>;
30
+ export type RuntimeControllerRenderSpaceArgs = {
31
+ activeSpace: SpaceId;
32
+ orbitControlsRef: React.RefObject<OrbitControlsImpl | null>;
33
+ setPortal: (portal?: PortalDescriptor) => void;
34
+ };
35
+ export type RuntimeControllerProps = {
36
+ initialSpace: SpaceId;
37
+ cameraConfig: RuntimeCameraConfig;
38
+ renderSpace: (args: RuntimeControllerRenderSpaceArgs) => React.ReactNode;
39
+ background?: string;
40
+ /**
41
+ * Controls whether the user can activate/deactivate the runtime portal via gesture.
42
+ * Defaults to "toggle" to preserve existing behavior.
43
+ */
44
+ portalInteractionPolicy?: PortalInteractionPolicy;
45
+ };
46
+ declare const _default: React.ForwardRefExoticComponent<RuntimeControllerProps & React.RefAttributes<RuntimeControllerHandle>>;
47
+ export default _default;
48
+ //# sourceMappingURL=RuntimeController.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RuntimeController.d.ts","sourceRoot":"","sources":["../../src/runtime/RuntimeController.tsx"],"names":[],"mappings":"AAEA,OAAoB,EAAE,KAAK,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACzE,OAAe,EAAE,KAAK,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAC/E,OAAO,KAA4D,MAAM,OAAO,CAAC;AAEjF,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD,MAAM,MAAM,OAAO,GAAG,SAAS,GAAG,UAAU,CAAC;AAE7C,MAAM,MAAM,gBAAgB,GAAG;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,OAAO,CAAC;IACd,EAAE,EAAE,OAAO,CAAC;IACZ,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IAClC,WAAW,EAAE,OAAO,CAAC;IACrB,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,eAAe,EAAE,OAAO,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IAClC,cAAc,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACzC,YAAY,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE;QAAE,GAAG,CAAC,EAAE,QAAQ,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IACrF,SAAS,EAAE,MAAM,uBAAuB,CAAC;IACzC,eAAe,EAAE,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,uBAAuB,KAAK,IAAI,KAAK,MAAM,IAAI,CAAC;CACxF,CAAC;AAEF,KAAK,iBAAiB,GAAG,KAAK,CAAC,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC;AAEhE,MAAM,MAAM,gCAAgC,GAAG;IAC3C,WAAW,EAAE,OAAO,CAAC;IACrB,gBAAgB,EAAE,KAAK,CAAC,SAAS,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAAC;IAC5D,SAAS,EAAE,CAAC,MAAM,CAAC,EAAE,gBAAgB,KAAK,IAAI,CAAC;CAClD,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACjC,YAAY,EAAE,OAAO,CAAC;IACtB,YAAY,EAAE,mBAAmB,CAAC;IAClC,WAAW,EAAE,CAAC,IAAI,EAAE,gCAAgC,KAAK,KAAK,CAAC,SAAS,CAAC;IACzE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,uBAAuB,CAAC,EAAE,uBAAuB,CAAC;CACrD,CAAC;;AAEF,wBA6GG"}
@@ -0,0 +1,81 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import RuntimeView, {} from './RuntimeView.js';
4
+ import Portal, {} from '../primitives/Portal.js';
5
+ import React, { useState, useRef, useEffect, useMemo, useCallback } from 'react';
6
+ import * as THREE from 'three';
7
+ import { OrbitControls } from '@react-three/drei';
8
+ export default React.forwardRef(function RuntimeController(props, ref) {
9
+ const [activeSpace, setActiveSpaceState] = useState(props.initialSpace);
10
+ const [portalDescriptor, setPortalDescriptor] = useState(undefined);
11
+ const [isTransitioning, setIsTransitioning] = useState(false);
12
+ const [isPortalActive, setIsPortalActive] = useState(false);
13
+ const orbitControlsRef = useRef(null);
14
+ const cameraRef = useRef(null);
15
+ const listenersRef = useRef(new Set());
16
+ const setPortal = useCallback((portal) => {
17
+ setPortalDescriptor(portal);
18
+ }, []);
19
+ const status = useMemo(() => {
20
+ return {
21
+ activeSpace,
22
+ // portal: portalDescriptor,
23
+ isTransitioning,
24
+ };
25
+ }, [activeSpace, isTransitioning, portalDescriptor]);
26
+ useEffect(() => {
27
+ for (const listener of listenersRef.current) {
28
+ listener(status);
29
+ }
30
+ }, [status]);
31
+ const setActiveSpace = useCallback((space) => {
32
+ setIsTransitioning(false);
33
+ setIsPortalActive(false);
34
+ setActiveSpaceState(space);
35
+ }, []);
36
+ const transitionTo = useCallback((space, opts) => {
37
+ if (space === activeSpace)
38
+ return;
39
+ if (opts?.via === 'portal') {
40
+ const canUsePortal = !!portalDescriptor?.visible &&
41
+ portalDescriptor.from === activeSpace &&
42
+ portalDescriptor.to === space &&
43
+ (!opts.portalId || portalDescriptor.id === opts.portalId);
44
+ if (canUsePortal) {
45
+ setIsTransitioning(true);
46
+ setIsPortalActive(true);
47
+ return;
48
+ }
49
+ }
50
+ setActiveSpace(space);
51
+ }, [activeSpace, portalDescriptor, setActiveSpace]);
52
+ React.useImperativeHandle(ref, () => ({
53
+ setActiveSpace,
54
+ transitionTo,
55
+ getStatus: () => status,
56
+ subscribeStatus: (listener) => {
57
+ listenersRef.current.add(listener);
58
+ listener(status);
59
+ return () => {
60
+ listenersRef.current.delete(listener);
61
+ };
62
+ },
63
+ }), [setActiveSpace, status, transitionTo]);
64
+ const showPortal = !!portalDescriptor?.visible && portalDescriptor.from === activeSpace;
65
+ return (_jsxs(RuntimeView, { cameraConfig: props.cameraConfig, orbitControlsRef: orbitControlsRef, cameraRef: cameraRef, background: props.background ?? 'skyblue', children: [props.renderSpace({ activeSpace, orbitControlsRef, setPortal }), showPortal && portalDescriptor ? (_jsx("group", { position: portalDescriptor.position, rotation: portalDescriptor.rotation, scale: portalDescriptor.scale, children: _jsx(Portal, { isActive: isPortalActive, setIsActive: (active) => {
66
+ setIsPortalActive(active);
67
+ setIsTransitioning(active);
68
+ }, interactionPolicy: props.portalInteractionPolicy ?? 'toggle', orbitControlsRef: orbitControlsRef, onTransitionComplete: (active) => {
69
+ if (!active) {
70
+ setIsTransitioning(false);
71
+ setIsPortalActive(false);
72
+ return;
73
+ }
74
+ // Transition finished: commit to the destination space.
75
+ const destination = portalDescriptor.to;
76
+ setIsTransitioning(false);
77
+ setIsPortalActive(false);
78
+ setActiveSpaceState(destination);
79
+ } }) })) : null] }));
80
+ });
81
+ //# sourceMappingURL=RuntimeController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RuntimeController.js","sourceRoot":"","sources":["../../src/runtime/RuntimeController.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type React from 'react';
2
+ import { OrbitControls } from '@react-three/drei';
3
+ import { type XRStore } from '@react-three/xr';
4
+ import * as THREE from 'three';
5
+ export type RuntimeCameraConfig = {
6
+ position: [number, number, number];
7
+ target: [number, number, number];
8
+ fov: number;
9
+ };
10
+ type OrbitControlsImpl = React.ElementRef<typeof OrbitControls>;
11
+ export declare const runtimeXrStore: XRStore;
12
+ export default function RuntimeView(props: {
13
+ children: React.ReactNode;
14
+ cameraConfig: RuntimeCameraConfig;
15
+ orbitControlsRef?: React.RefObject<OrbitControlsImpl | null>;
16
+ cameraRef?: React.RefObject<THREE.Camera | null>;
17
+ background?: string;
18
+ }): import("react/jsx-runtime").JSX.Element;
19
+ export {};
20
+ //# sourceMappingURL=RuntimeView.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RuntimeView.d.ts","sourceRoot":"","sources":["../../src/runtime/RuntimeView.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAA4B,KAAK,OAAO,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,MAAM,MAAM,mBAAmB,GAAG;IAC9B,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,GAAG,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,KAAK,iBAAiB,GAAG,KAAK,CAAC,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC;AAEhE,eAAO,MAAM,cAAc,EAAE,OAAyB,CAAC;AAuBvD,MAAM,CAAC,OAAO,UAAU,WAAW,CAAC,KAAK,EAAE;IACvC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,YAAY,EAAE,mBAAmB,CAAC;IAClC,gBAAgB,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAAC;IAC7D,SAAS,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACjD,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB,2CA8CA"}