/**
 * avl-3d-layout.ts
 *
 * Pure math utilities for 3D positioning of AVL visualization nodes.
 * The 3D equivalent of avl-layout.ts (2D positioning helpers).
 *
 * @packageDocumentation
 */
import { QuadraticBezierCurve3 } from 'three';
export interface Position3D {
    x: number;
    y: number;
    z: number;
}
export interface ExprTreeNode3D {
    label: string;
    type: 'operator' | 'literal' | 'binding';
    children?: ExprTreeNode3D[];
}
export interface TreeLayoutResult {
    node: ExprTreeNode3D;
    position: Position3D;
}
/**
 * Refined palette following Almadar UI Beauty principles:
 * - No pure black: deep navy tint (#0c1222) instead of #0A0A1A
 * - 60-30-10 rule: 60% deep background, 30% muted blues/grays, 10% bright accents
 * - Desaturated for dark backgrounds: softer blues, warmer golds
 * - Depth through color layering: surfaces get progressively lighter
 */
export declare const AVL_3D_COLORS: {
    readonly orbitalSphere: "#161b2e";
    readonly orbitalRim: "#5b9bd5";
    readonly entityCore: "#f0c040";
    readonly entityCoreGlow: "#ffd866";
    readonly traitOrbit: "#5b9bd5";
    readonly traitOrbitHighlight: "#7ab8f5";
    readonly stateIdle: "#1e2a3a";
    readonly stateEdge: "#5b9bd5";
    readonly stateActive: "#4ecb71";
    readonly transitionArc: "#e0944a";
    readonly transitionArcHover: "#f0a860";
    readonly guardPass: "#4ecb71";
    readonly guardFail: "#f06060";
    readonly crossWire: "#a78bda";
    readonly crossWireGlow: "#c4a8f0";
    readonly pagePortal: "#40c8aa";
    readonly background: "#0c1222";
    readonly backgroundSurface: "#111a2e";
    readonly fog: "#0c1222";
    readonly sparkle: "#7ab8f5";
    readonly sparkleWarm: "#f0c040";
};
/**
 * Positions N nodes on a golden-ratio spiral in the XZ plane (y=0).
 * Used as initial positions for the force-directed layout.
 */
export declare function goldenSpiralPositions(count: number, baseRadius: number): Position3D[];
interface ForceEdge {
    from: number;
    to: number;
}
/**
 * Runs a simple force-directed simulation to cluster connected nodes.
 * Connected nodes attract, all nodes repel. Runs for a fixed number of iterations.
 *
 * @param count Number of nodes
 * @param edges Connections between nodes (indices)
 * @param baseRadius Approximate spread radius
 * @param iterations Simulation steps (default 80)
 */
export declare function forceDirectedPositions(count: number, edges: ForceEdge[], baseRadius: number, iterations?: number): Position3D[];
/**
 * Distributes N points on a sphere surface using Fibonacci lattice.
 * Produces near-uniform spacing regardless of count.
 */
export declare function fibonacciSpherePositions(count: number, radius: number): Position3D[];
/**
 * Evenly spaces N points on a tilted ring (elliptical orbit).
 * `tilt` is the ring's inclination in radians relative to the XZ plane.
 */
export declare function orbitRingPositions(count: number, radius: number, tilt: number): Position3D[];
/**
 * Creates a QuadraticBezierCurve3 between two 3D points with a control
 * point offset perpendicular to the from-to line. The offset direction
 * is computed in 3D using a cross product with the up vector.
 */
export declare function arcCurve3D(from: [number, number, number], to: [number, number, number], offset: number): QuadraticBezierCurve3;
/**
 * Creates a loop curve above a point for self-transitions.
 */
export declare function selfLoopCurve3D(position: [number, number, number], loopRadius: number): QuadraticBezierCurve3;
/**
 * Recursively positions an expression tree in 3D space.
 * Root at origin, children spread horizontally, depth goes downward (negative Y).
 */
export declare function treeLayout3D(node: ExprTreeNode3D, origin: Position3D, horizontalSpacing: number, verticalSpacing?: number): TreeLayoutResult[];
export declare const CAMERA_POSITIONS: {
    readonly application: {
        readonly position: [number, number, number];
        readonly target: [number, number, number];
    };
    readonly orbital: {
        readonly position: [number, number, number];
        readonly target: [number, number, number];
    };
    readonly trait: {
        readonly position: [number, number, number];
        readonly target: [number, number, number];
    };
    readonly transition: {
        readonly position: [number, number, number];
        readonly target: [number, number, number];
    };
};
export {};
