import { Entity, type Bounds, type BatchCircle } from '../tree/Entity'; import type { IRenderer } from '../renderer/IRenderer'; /** Construction options for {@link Circle}. */ export interface CircleOptions { /** Radius in local units. Default `0`. */ radius?: number; /** CSS fill color, or `null` for no fill. Default `'#38bdf8'`. */ fill?: string | null; /** CSS stroke color, or `null` for no stroke. Default `null`. */ stroke?: string | null; /** Stroke width in local units. Default `1`. */ strokeWidth?: number; } /** * A concrete circle primitive centered on its local origin `(0, 0)`. * Instantiate directly — no subclassing: * * @example * const dot = new Circle({ radius: 24, fill: '#f97316' }); * dot.set({ x: 100, y: 100 }); * scene.add(dot); * * The accessibility shadow box is sized to the circle's bounding square and * offset by `-radius` so it covers the drawn disc (whose center is the entity * origin). A solid-fill (unstroked) Circle opts into the point-batch fast path * via {@link getBatchCircle}; a stroked circle renders through the normal path. */ export declare class Circle extends Entity { fill: string | null; stroke: string | null; strokeWidth: number; private _radius; constructor(opts?: CircleOptions); get radius(): number; set radius(v: number); /** Keep the a11y box (a square around the centered disc) in sync with radius. */ private syncBox; getBounds(): Bounds; /** * A solid-fill, unstroked circle opts into the renderer's circle batch * (center = entity origin, radius scaled by world scale). A stroke needs the * exact Canvas path, so return `null` there. Read each frame, so an animated * `fill`/`radius` still batches. */ getBatchCircle(): BatchCircle | null; isPointInside(globalX: number, globalY: number): boolean; render(renderer: IRenderer): void; }