attractor-react 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.
- package/README.md +954 -0
- package/dist/attractor-react.cjs +76 -0
- package/dist/attractor-react.js +11360 -0
- package/dist/types/cjs/index.d.ts +4 -0
- package/dist/types/cjs/lib/App.d.ts +5 -0
- package/dist/types/cjs/lib/components/AttractorCanvas.d.ts +27 -0
- package/dist/types/cjs/lib/components/AttractorPanel.d.ts +30 -0
- package/dist/types/cjs/lib/components/CodeBlock.d.ts +4 -0
- package/dist/types/cjs/lib/components/StyledSlider.d.ts +13 -0
- package/dist/types/cjs/lib/components/WallpaperDownload.d.ts +11 -0
- package/dist/types/cjs/lib/components/ZoomControls.d.ts +1 -0
- package/dist/types/cjs/lib/components/ui/animated-theme-toggler.d.ts +16 -0
- package/dist/types/cjs/lib/components/ui/badge.d.ts +7 -0
- package/dist/types/cjs/lib/components/ui/button.d.ts +8 -0
- package/dist/types/cjs/lib/components/ui/label.d.ts +3 -0
- package/dist/types/cjs/lib/components/ui/scroll-area.d.ts +5 -0
- package/dist/types/cjs/lib/components/ui/select.d.ts +15 -0
- package/dist/types/cjs/lib/components/ui/separator.d.ts +3 -0
- package/dist/types/cjs/lib/components/ui/slider.d.ts +3 -0
- package/dist/types/cjs/lib/components/ui/switch.d.ts +5 -0
- package/dist/types/cjs/lib/components/ui/tooltip.d.ts +6 -0
- package/dist/types/cjs/lib/integrate.d.ts +16 -0
- package/dist/types/cjs/lib/providers/ThemeToggle.d.ts +11 -0
- package/dist/types/cjs/lib/systems.d.ts +26 -0
- package/dist/types/cjs/lib/utils.d.ts +2 -0
- package/dist/types/cjs/main.d.ts +1 -0
- package/dist/types/index.d.ts +4 -0
- package/dist/types/lib/App.d.ts +5 -0
- package/dist/types/lib/components/AttractorCanvas.d.ts +27 -0
- package/dist/types/lib/components/AttractorPanel.d.ts +30 -0
- package/dist/types/lib/components/CodeBlock.d.ts +4 -0
- package/dist/types/lib/components/StyledSlider.d.ts +13 -0
- package/dist/types/lib/components/WallpaperDownload.d.ts +11 -0
- package/dist/types/lib/components/ZoomControls.d.ts +1 -0
- package/dist/types/lib/components/ui/animated-theme-toggler.d.ts +16 -0
- package/dist/types/lib/components/ui/badge.d.ts +7 -0
- package/dist/types/lib/components/ui/button.d.ts +8 -0
- package/dist/types/lib/components/ui/label.d.ts +3 -0
- package/dist/types/lib/components/ui/scroll-area.d.ts +5 -0
- package/dist/types/lib/components/ui/select.d.ts +15 -0
- package/dist/types/lib/components/ui/separator.d.ts +3 -0
- package/dist/types/lib/components/ui/slider.d.ts +3 -0
- package/dist/types/lib/components/ui/switch.d.ts +5 -0
- package/dist/types/lib/components/ui/tooltip.d.ts +6 -0
- package/dist/types/lib/integrate.d.ts +16 -0
- package/dist/types/lib/providers/ThemeToggle.d.ts +11 -0
- package/dist/types/lib/systems.d.ts +26 -0
- package/dist/types/lib/utils.d.ts +2 -0
- package/dist/types/main.d.ts +1 -0
- package/package.json +81 -0
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { AttractorCanvas } from "./lib/components/AttractorCanvas";
|
|
2
|
+
export { AttractorPanel } from "./lib/components/AttractorPanel";
|
|
3
|
+
export { getSystem, systems } from "./lib/systems";
|
|
4
|
+
export type { AttractorLimits, AttractorParams, AttractorSystem, EqFn, Vector3, } from "./lib/systems";
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { AttractorSystem } from "../systems";
|
|
2
|
+
import * as THREE from "three";
|
|
3
|
+
interface AttractorCanvasProps {
|
|
4
|
+
autoRotate: boolean;
|
|
5
|
+
backgroundColor?: string;
|
|
6
|
+
colorSpeed: number;
|
|
7
|
+
onSceneReady?: (data: {
|
|
8
|
+
camera: THREE.PerspectiveCamera;
|
|
9
|
+
renderer: THREE.WebGLRenderer;
|
|
10
|
+
scene: THREE.Scene;
|
|
11
|
+
}) => void;
|
|
12
|
+
params: number[];
|
|
13
|
+
pointSize: number;
|
|
14
|
+
resetKey: number;
|
|
15
|
+
speed: number;
|
|
16
|
+
stepsPerFrame: number;
|
|
17
|
+
system: AttractorSystem;
|
|
18
|
+
}
|
|
19
|
+
export declare function frameCamera(): void;
|
|
20
|
+
/**
|
|
21
|
+
* Zoom the camera by one small incremental step.
|
|
22
|
+
* -1 = zoom out (move away), 1 = zoom in (move closer).
|
|
23
|
+
* Each call moves the camera ~6% of its current distance from the orbit target.
|
|
24
|
+
*/
|
|
25
|
+
export declare function zoomCamera(direction: number): void;
|
|
26
|
+
export declare function AttractorCanvas({ autoRotate, backgroundColor, colorSpeed, onSceneReady, params, pointSize, resetKey, speed, stepsPerFrame, system, }: AttractorCanvasProps): import("react").JSX.Element;
|
|
27
|
+
export {};
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { AttractorSystem } from "../systems";
|
|
2
|
+
interface AttractorPanelProps {
|
|
3
|
+
autoRotate: boolean;
|
|
4
|
+
backgroundColor?: string;
|
|
5
|
+
colorSpeed: number;
|
|
6
|
+
mobileOpen?: boolean;
|
|
7
|
+
onAutoRotateChange: (value: boolean) => void;
|
|
8
|
+
onBackgroundColorChange?: (value: string) => void;
|
|
9
|
+
onCloseMobile?: () => void;
|
|
10
|
+
onColorSpeedChange: (value: number) => void;
|
|
11
|
+
onParamChange: (index: number, value: number) => void;
|
|
12
|
+
onPointSizeChange: (value: number) => void;
|
|
13
|
+
onReset: () => void;
|
|
14
|
+
onResetAfterChange?: (value: number) => void;
|
|
15
|
+
onShare: () => void;
|
|
16
|
+
onSpeedChange: (value: number) => void;
|
|
17
|
+
onStepsChange: (value: number) => void;
|
|
18
|
+
onSystemChange: (id: string) => void;
|
|
19
|
+
onWallpaperDownload?: () => void;
|
|
20
|
+
params: number[];
|
|
21
|
+
pointSize: number;
|
|
22
|
+
resetAfter: number;
|
|
23
|
+
selectedId: string;
|
|
24
|
+
speed: number;
|
|
25
|
+
stepsPerFrame: number;
|
|
26
|
+
system: AttractorSystem;
|
|
27
|
+
systems: AttractorSystem[];
|
|
28
|
+
}
|
|
29
|
+
export declare function AttractorPanel({ autoRotate, backgroundColor, colorSpeed, mobileOpen, onAutoRotateChange, onBackgroundColorChange, onCloseMobile, onColorSpeedChange, onParamChange, onPointSizeChange, onReset, onResetAfterChange, onShare, onSpeedChange, onStepsChange, onSystemChange, onWallpaperDownload, params, pointSize, resetAfter, selectedId, speed, stepsPerFrame, system, systems, }: AttractorPanelProps): import("react").JSX.Element;
|
|
30
|
+
export {};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
interface StyledSliderProps {
|
|
2
|
+
color?: string;
|
|
3
|
+
format?: (v: number) => string;
|
|
4
|
+
label?: string;
|
|
5
|
+
max: number;
|
|
6
|
+
min: number;
|
|
7
|
+
onChange: (v: number) => void;
|
|
8
|
+
step: number;
|
|
9
|
+
value: number;
|
|
10
|
+
valueSuffix?: string;
|
|
11
|
+
}
|
|
12
|
+
declare function StyledSlider({ color, format, label, max, min, onChange, step, value, valueSuffix, }: StyledSliderProps): import("react").JSX.Element;
|
|
13
|
+
export default StyledSlider;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import * as THREE from "three";
|
|
2
|
+
interface WallpaperDownloadProps {
|
|
3
|
+
camera: THREE.PerspectiveCamera | undefined;
|
|
4
|
+
onClose: () => void;
|
|
5
|
+
open: boolean;
|
|
6
|
+
renderer: null | THREE.WebGLRenderer;
|
|
7
|
+
scene: null | THREE.Scene;
|
|
8
|
+
systemId: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function WallpaperDownload({ camera, onClose, open, renderer, scene, systemId, }: WallpaperDownloadProps): import("react").JSX.Element | null;
|
|
11
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function ZoomControls(): import("react").JSX.Element;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export type TransitionVariant = "circle" | "diamond" | "hexagon" | "rectangle" | "square" | "star" | "triangle";
|
|
2
|
+
interface AnimatedThemeTogglerProps extends React.ComponentPropsWithoutRef<"button"> {
|
|
3
|
+
duration?: number;
|
|
4
|
+
/** When true, the transition expands from the viewport center instead of the button center. */
|
|
5
|
+
fromCenter?: boolean;
|
|
6
|
+
/** Called on toggle. Pair with `theme` for controlled usage. */
|
|
7
|
+
onThemeChange?: (theme: "dark" | "light") => void;
|
|
8
|
+
/**
|
|
9
|
+
* Controlled theme value. When provided, the parent owns persistence
|
|
10
|
+
* (e.g. `next-themes`) and this component will not write to localStorage.
|
|
11
|
+
*/
|
|
12
|
+
theme?: "dark" | "light";
|
|
13
|
+
variant?: TransitionVariant;
|
|
14
|
+
}
|
|
15
|
+
export declare const AnimatedThemeToggler: ({ className, duration, fromCenter, onThemeChange, theme, variant, ...props }: AnimatedThemeTogglerProps) => import("react").JSX.Element;
|
|
16
|
+
export {};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { useRender } from "@base-ui/react/use-render";
|
|
2
|
+
import { type VariantProps } from "class-variance-authority";
|
|
3
|
+
declare const badgeVariants: (props?: ({
|
|
4
|
+
variant?: "default" | "link" | "destructive" | "ghost" | "outline" | "secondary" | null | undefined;
|
|
5
|
+
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
6
|
+
declare function Badge({ className, render, variant, ...props }: useRender.ComponentProps<"span"> & VariantProps<typeof badgeVariants>): import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>>;
|
|
7
|
+
export { Badge, badgeVariants };
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Button as ButtonPrimitive } from "@base-ui/react/button";
|
|
2
|
+
import { type VariantProps } from "class-variance-authority";
|
|
3
|
+
declare const buttonVariants: (props?: ({
|
|
4
|
+
size?: "default" | "icon" | "icon-lg" | "icon-sm" | "icon-xs" | "lg" | "sm" | "xs" | null | undefined;
|
|
5
|
+
variant?: "default" | "link" | "destructive" | "ghost" | "outline" | "secondary" | null | undefined;
|
|
6
|
+
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
7
|
+
declare function Button({ className, size, variant, ...props }: ButtonPrimitive.Props & VariantProps<typeof buttonVariants>): import("react").JSX.Element;
|
|
8
|
+
export { Button, buttonVariants };
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { ScrollArea as ScrollAreaPrimitive } from "@base-ui/react/scroll-area";
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
declare function ScrollArea({ children, className, ...props }: ScrollAreaPrimitive.Root.Props): React.JSX.Element;
|
|
4
|
+
declare function ScrollBar({ className, orientation, ...props }: ScrollAreaPrimitive.Scrollbar.Props): React.JSX.Element;
|
|
5
|
+
export { ScrollArea, ScrollBar };
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Select as SelectPrimitive } from "@base-ui/react/select";
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
declare const Select: typeof SelectPrimitive.Root;
|
|
4
|
+
declare function SelectGroup({ className, ...props }: SelectPrimitive.Group.Props): React.JSX.Element;
|
|
5
|
+
declare function SelectValue({ className, ...props }: SelectPrimitive.Value.Props): React.JSX.Element;
|
|
6
|
+
declare function SelectTrigger({ children, className, size, ...props }: SelectPrimitive.Trigger.Props & {
|
|
7
|
+
size?: "default" | "sm";
|
|
8
|
+
}): React.JSX.Element;
|
|
9
|
+
declare function SelectContent({ align, alignItemWithTrigger, alignOffset, children, className, side, sideOffset, ...props }: SelectPrimitive.Popup.Props & Pick<SelectPrimitive.Positioner.Props, "align" | "alignItemWithTrigger" | "alignOffset" | "side" | "sideOffset">): React.JSX.Element;
|
|
10
|
+
declare function SelectLabel({ className, ...props }: SelectPrimitive.GroupLabel.Props): React.JSX.Element;
|
|
11
|
+
declare function SelectItem({ children, className, ...props }: SelectPrimitive.Item.Props): React.JSX.Element;
|
|
12
|
+
declare function SelectSeparator({ className, ...props }: SelectPrimitive.Separator.Props): React.JSX.Element;
|
|
13
|
+
declare function SelectScrollUpButton({ className, ...props }: React.ComponentProps<typeof SelectPrimitive.ScrollUpArrow>): React.JSX.Element;
|
|
14
|
+
declare function SelectScrollDownButton({ className, ...props }: React.ComponentProps<typeof SelectPrimitive.ScrollDownArrow>): React.JSX.Element;
|
|
15
|
+
export { Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, };
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { Tooltip as TooltipPrimitive } from "@base-ui/react/tooltip";
|
|
2
|
+
declare function TooltipProvider({ delay, ...props }: TooltipPrimitive.Provider.Props): import("react").JSX.Element;
|
|
3
|
+
declare function Tooltip({ ...props }: TooltipPrimitive.Root.Props): import("react").JSX.Element;
|
|
4
|
+
declare function TooltipTrigger({ ...props }: TooltipPrimitive.Trigger.Props): import("react").JSX.Element;
|
|
5
|
+
declare function TooltipContent({ align, alignOffset, children, className, side, sideOffset, ...props }: TooltipPrimitive.Popup.Props & Pick<TooltipPrimitive.Positioner.Props, "align" | "alignOffset" | "side" | "sideOffset">): import("react").JSX.Element;
|
|
6
|
+
export { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger };
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Vector3 } from "./systems";
|
|
2
|
+
import type { AttractorSystem } from "./systems";
|
|
3
|
+
/**
|
|
4
|
+
* Integrate from `initCoord` for `steps` steps of size `dt`.
|
|
5
|
+
* Returns a flat Float32Array of [x0,y0,z0, x1,y1,z1, ...].
|
|
6
|
+
*/
|
|
7
|
+
export declare function integrate(system: AttractorSystem, steps: number, dt: number, paramsOverride?: number[]): Float32Array;
|
|
8
|
+
/**
|
|
9
|
+
* Continues a trajectory from existing data.
|
|
10
|
+
* If `paramsOverride` is provided, uses it instead of system.params.defaults.
|
|
11
|
+
* Returns the new points appended as a Float32Array.
|
|
12
|
+
*/
|
|
13
|
+
export declare function continueIntegrate(system: AttractorSystem, lastState: Vector3, steps: number, dt: number, paramsOverride?: number[]): {
|
|
14
|
+
data: Float32Array;
|
|
15
|
+
lastState: Vector3;
|
|
16
|
+
};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
type Theme = "dark" | "light";
|
|
2
|
+
interface ThemeContextValue {
|
|
3
|
+
setTheme: (theme: Theme) => void;
|
|
4
|
+
theme: Theme;
|
|
5
|
+
}
|
|
6
|
+
export declare function ThemeProvider({ children }: {
|
|
7
|
+
children: React.ReactNode;
|
|
8
|
+
}): import("react").JSX.Element;
|
|
9
|
+
export declare function useTheme(): ThemeContextValue;
|
|
10
|
+
export declare function ThemeToggle(): import("react").JSX.Element;
|
|
11
|
+
export {};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export type Vector3 = [number, number, number];
|
|
2
|
+
export interface AttractorParams {
|
|
3
|
+
defaults: number[];
|
|
4
|
+
max: number[];
|
|
5
|
+
min: number[];
|
|
6
|
+
names: string[];
|
|
7
|
+
steps?: number[];
|
|
8
|
+
}
|
|
9
|
+
export interface AttractorLimits {
|
|
10
|
+
xlim?: [number, number];
|
|
11
|
+
ylim?: [number, number];
|
|
12
|
+
zlim?: [number, number];
|
|
13
|
+
}
|
|
14
|
+
export type EqFn = (x: number, y: number, z: number, params: number[]) => [number, number, number];
|
|
15
|
+
export interface AttractorSystem {
|
|
16
|
+
color: string;
|
|
17
|
+
equation: (state: Vector3, params: number[]) => Vector3;
|
|
18
|
+
id: string;
|
|
19
|
+
initCoord: Vector3;
|
|
20
|
+
limits?: AttractorLimits;
|
|
21
|
+
name: string;
|
|
22
|
+
params: AttractorParams;
|
|
23
|
+
}
|
|
24
|
+
export declare const systems: AttractorSystem[];
|
|
25
|
+
export declare function getSystem(id: string): AttractorSystem | undefined;
|
|
26
|
+
export declare const systemIds: string[];
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import "./index.css";
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { AttractorCanvas } from "./lib/components/AttractorCanvas";
|
|
2
|
+
export { AttractorPanel } from "./lib/components/AttractorPanel";
|
|
3
|
+
export { getSystem, systems } from "./lib/systems";
|
|
4
|
+
export type { AttractorLimits, AttractorParams, AttractorSystem, EqFn, Vector3, } from "./lib/systems";
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { AttractorSystem } from "../systems";
|
|
2
|
+
import * as THREE from "three";
|
|
3
|
+
interface AttractorCanvasProps {
|
|
4
|
+
autoRotate: boolean;
|
|
5
|
+
backgroundColor?: string;
|
|
6
|
+
colorSpeed: number;
|
|
7
|
+
onSceneReady?: (data: {
|
|
8
|
+
camera: THREE.PerspectiveCamera;
|
|
9
|
+
renderer: THREE.WebGLRenderer;
|
|
10
|
+
scene: THREE.Scene;
|
|
11
|
+
}) => void;
|
|
12
|
+
params: number[];
|
|
13
|
+
pointSize: number;
|
|
14
|
+
resetKey: number;
|
|
15
|
+
speed: number;
|
|
16
|
+
stepsPerFrame: number;
|
|
17
|
+
system: AttractorSystem;
|
|
18
|
+
}
|
|
19
|
+
export declare function frameCamera(): void;
|
|
20
|
+
/**
|
|
21
|
+
* Zoom the camera by one small incremental step.
|
|
22
|
+
* -1 = zoom out (move away), 1 = zoom in (move closer).
|
|
23
|
+
* Each call moves the camera ~6% of its current distance from the orbit target.
|
|
24
|
+
*/
|
|
25
|
+
export declare function zoomCamera(direction: number): void;
|
|
26
|
+
export declare function AttractorCanvas({ autoRotate, backgroundColor, colorSpeed, onSceneReady, params, pointSize, resetKey, speed, stepsPerFrame, system, }: AttractorCanvasProps): import("react").JSX.Element;
|
|
27
|
+
export {};
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { AttractorSystem } from "../systems";
|
|
2
|
+
interface AttractorPanelProps {
|
|
3
|
+
autoRotate: boolean;
|
|
4
|
+
backgroundColor?: string;
|
|
5
|
+
colorSpeed: number;
|
|
6
|
+
mobileOpen?: boolean;
|
|
7
|
+
onAutoRotateChange: (value: boolean) => void;
|
|
8
|
+
onBackgroundColorChange?: (value: string) => void;
|
|
9
|
+
onCloseMobile?: () => void;
|
|
10
|
+
onColorSpeedChange: (value: number) => void;
|
|
11
|
+
onParamChange: (index: number, value: number) => void;
|
|
12
|
+
onPointSizeChange: (value: number) => void;
|
|
13
|
+
onReset: () => void;
|
|
14
|
+
onResetAfterChange?: (value: number) => void;
|
|
15
|
+
onShare: () => void;
|
|
16
|
+
onSpeedChange: (value: number) => void;
|
|
17
|
+
onStepsChange: (value: number) => void;
|
|
18
|
+
onSystemChange: (id: string) => void;
|
|
19
|
+
onWallpaperDownload?: () => void;
|
|
20
|
+
params: number[];
|
|
21
|
+
pointSize: number;
|
|
22
|
+
resetAfter: number;
|
|
23
|
+
selectedId: string;
|
|
24
|
+
speed: number;
|
|
25
|
+
stepsPerFrame: number;
|
|
26
|
+
system: AttractorSystem;
|
|
27
|
+
systems: AttractorSystem[];
|
|
28
|
+
}
|
|
29
|
+
export declare function AttractorPanel({ autoRotate, backgroundColor, colorSpeed, mobileOpen, onAutoRotateChange, onBackgroundColorChange, onCloseMobile, onColorSpeedChange, onParamChange, onPointSizeChange, onReset, onResetAfterChange, onShare, onSpeedChange, onStepsChange, onSystemChange, onWallpaperDownload, params, pointSize, resetAfter, selectedId, speed, stepsPerFrame, system, systems, }: AttractorPanelProps): import("react").JSX.Element;
|
|
30
|
+
export {};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
interface StyledSliderProps {
|
|
2
|
+
color?: string;
|
|
3
|
+
format?: (v: number) => string;
|
|
4
|
+
label?: string;
|
|
5
|
+
max: number;
|
|
6
|
+
min: number;
|
|
7
|
+
onChange: (v: number) => void;
|
|
8
|
+
step: number;
|
|
9
|
+
value: number;
|
|
10
|
+
valueSuffix?: string;
|
|
11
|
+
}
|
|
12
|
+
declare function StyledSlider({ color, format, label, max, min, onChange, step, value, valueSuffix, }: StyledSliderProps): import("react").JSX.Element;
|
|
13
|
+
export default StyledSlider;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import * as THREE from "three";
|
|
2
|
+
interface WallpaperDownloadProps {
|
|
3
|
+
camera: THREE.PerspectiveCamera | undefined;
|
|
4
|
+
onClose: () => void;
|
|
5
|
+
open: boolean;
|
|
6
|
+
renderer: null | THREE.WebGLRenderer;
|
|
7
|
+
scene: null | THREE.Scene;
|
|
8
|
+
systemId: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function WallpaperDownload({ camera, onClose, open, renderer, scene, systemId, }: WallpaperDownloadProps): import("react").JSX.Element | null;
|
|
11
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function ZoomControls(): import("react").JSX.Element;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export type TransitionVariant = "circle" | "diamond" | "hexagon" | "rectangle" | "square" | "star" | "triangle";
|
|
2
|
+
interface AnimatedThemeTogglerProps extends React.ComponentPropsWithoutRef<"button"> {
|
|
3
|
+
duration?: number;
|
|
4
|
+
/** When true, the transition expands from the viewport center instead of the button center. */
|
|
5
|
+
fromCenter?: boolean;
|
|
6
|
+
/** Called on toggle. Pair with `theme` for controlled usage. */
|
|
7
|
+
onThemeChange?: (theme: "dark" | "light") => void;
|
|
8
|
+
/**
|
|
9
|
+
* Controlled theme value. When provided, the parent owns persistence
|
|
10
|
+
* (e.g. `next-themes`) and this component will not write to localStorage.
|
|
11
|
+
*/
|
|
12
|
+
theme?: "dark" | "light";
|
|
13
|
+
variant?: TransitionVariant;
|
|
14
|
+
}
|
|
15
|
+
export declare const AnimatedThemeToggler: ({ className, duration, fromCenter, onThemeChange, theme, variant, ...props }: AnimatedThemeTogglerProps) => import("react").JSX.Element;
|
|
16
|
+
export {};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { useRender } from "@base-ui/react/use-render";
|
|
2
|
+
import { type VariantProps } from "class-variance-authority";
|
|
3
|
+
declare const badgeVariants: (props?: ({
|
|
4
|
+
variant?: "default" | "link" | "destructive" | "ghost" | "outline" | "secondary" | null | undefined;
|
|
5
|
+
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
6
|
+
declare function Badge({ className, render, variant, ...props }: useRender.ComponentProps<"span"> & VariantProps<typeof badgeVariants>): import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>>;
|
|
7
|
+
export { Badge, badgeVariants };
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Button as ButtonPrimitive } from "@base-ui/react/button";
|
|
2
|
+
import { type VariantProps } from "class-variance-authority";
|
|
3
|
+
declare const buttonVariants: (props?: ({
|
|
4
|
+
size?: "default" | "icon" | "icon-lg" | "icon-sm" | "icon-xs" | "lg" | "sm" | "xs" | null | undefined;
|
|
5
|
+
variant?: "default" | "link" | "destructive" | "ghost" | "outline" | "secondary" | null | undefined;
|
|
6
|
+
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
7
|
+
declare function Button({ className, size, variant, ...props }: ButtonPrimitive.Props & VariantProps<typeof buttonVariants>): import("react").JSX.Element;
|
|
8
|
+
export { Button, buttonVariants };
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { ScrollArea as ScrollAreaPrimitive } from "@base-ui/react/scroll-area";
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
declare function ScrollArea({ children, className, ...props }: ScrollAreaPrimitive.Root.Props): React.JSX.Element;
|
|
4
|
+
declare function ScrollBar({ className, orientation, ...props }: ScrollAreaPrimitive.Scrollbar.Props): React.JSX.Element;
|
|
5
|
+
export { ScrollArea, ScrollBar };
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Select as SelectPrimitive } from "@base-ui/react/select";
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
declare const Select: typeof SelectPrimitive.Root;
|
|
4
|
+
declare function SelectGroup({ className, ...props }: SelectPrimitive.Group.Props): React.JSX.Element;
|
|
5
|
+
declare function SelectValue({ className, ...props }: SelectPrimitive.Value.Props): React.JSX.Element;
|
|
6
|
+
declare function SelectTrigger({ children, className, size, ...props }: SelectPrimitive.Trigger.Props & {
|
|
7
|
+
size?: "default" | "sm";
|
|
8
|
+
}): React.JSX.Element;
|
|
9
|
+
declare function SelectContent({ align, alignItemWithTrigger, alignOffset, children, className, side, sideOffset, ...props }: SelectPrimitive.Popup.Props & Pick<SelectPrimitive.Positioner.Props, "align" | "alignItemWithTrigger" | "alignOffset" | "side" | "sideOffset">): React.JSX.Element;
|
|
10
|
+
declare function SelectLabel({ className, ...props }: SelectPrimitive.GroupLabel.Props): React.JSX.Element;
|
|
11
|
+
declare function SelectItem({ children, className, ...props }: SelectPrimitive.Item.Props): React.JSX.Element;
|
|
12
|
+
declare function SelectSeparator({ className, ...props }: SelectPrimitive.Separator.Props): React.JSX.Element;
|
|
13
|
+
declare function SelectScrollUpButton({ className, ...props }: React.ComponentProps<typeof SelectPrimitive.ScrollUpArrow>): React.JSX.Element;
|
|
14
|
+
declare function SelectScrollDownButton({ className, ...props }: React.ComponentProps<typeof SelectPrimitive.ScrollDownArrow>): React.JSX.Element;
|
|
15
|
+
export { Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, };
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { Tooltip as TooltipPrimitive } from "@base-ui/react/tooltip";
|
|
2
|
+
declare function TooltipProvider({ delay, ...props }: TooltipPrimitive.Provider.Props): import("react").JSX.Element;
|
|
3
|
+
declare function Tooltip({ ...props }: TooltipPrimitive.Root.Props): import("react").JSX.Element;
|
|
4
|
+
declare function TooltipTrigger({ ...props }: TooltipPrimitive.Trigger.Props): import("react").JSX.Element;
|
|
5
|
+
declare function TooltipContent({ align, alignOffset, children, className, side, sideOffset, ...props }: TooltipPrimitive.Popup.Props & Pick<TooltipPrimitive.Positioner.Props, "align" | "alignOffset" | "side" | "sideOffset">): import("react").JSX.Element;
|
|
6
|
+
export { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger };
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Vector3 } from "./systems";
|
|
2
|
+
import type { AttractorSystem } from "./systems";
|
|
3
|
+
/**
|
|
4
|
+
* Integrate from `initCoord` for `steps` steps of size `dt`.
|
|
5
|
+
* Returns a flat Float32Array of [x0,y0,z0, x1,y1,z1, ...].
|
|
6
|
+
*/
|
|
7
|
+
export declare function integrate(system: AttractorSystem, steps: number, dt: number, paramsOverride?: number[]): Float32Array;
|
|
8
|
+
/**
|
|
9
|
+
* Continues a trajectory from existing data.
|
|
10
|
+
* If `paramsOverride` is provided, uses it instead of system.params.defaults.
|
|
11
|
+
* Returns the new points appended as a Float32Array.
|
|
12
|
+
*/
|
|
13
|
+
export declare function continueIntegrate(system: AttractorSystem, lastState: Vector3, steps: number, dt: number, paramsOverride?: number[]): {
|
|
14
|
+
data: Float32Array;
|
|
15
|
+
lastState: Vector3;
|
|
16
|
+
};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
type Theme = "dark" | "light";
|
|
2
|
+
interface ThemeContextValue {
|
|
3
|
+
setTheme: (theme: Theme) => void;
|
|
4
|
+
theme: Theme;
|
|
5
|
+
}
|
|
6
|
+
export declare function ThemeProvider({ children }: {
|
|
7
|
+
children: React.ReactNode;
|
|
8
|
+
}): import("react").JSX.Element;
|
|
9
|
+
export declare function useTheme(): ThemeContextValue;
|
|
10
|
+
export declare function ThemeToggle(): import("react").JSX.Element;
|
|
11
|
+
export {};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export type Vector3 = [number, number, number];
|
|
2
|
+
export interface AttractorParams {
|
|
3
|
+
defaults: number[];
|
|
4
|
+
max: number[];
|
|
5
|
+
min: number[];
|
|
6
|
+
names: string[];
|
|
7
|
+
steps?: number[];
|
|
8
|
+
}
|
|
9
|
+
export interface AttractorLimits {
|
|
10
|
+
xlim?: [number, number];
|
|
11
|
+
ylim?: [number, number];
|
|
12
|
+
zlim?: [number, number];
|
|
13
|
+
}
|
|
14
|
+
export type EqFn = (x: number, y: number, z: number, params: number[]) => [number, number, number];
|
|
15
|
+
export interface AttractorSystem {
|
|
16
|
+
color: string;
|
|
17
|
+
equation: (state: Vector3, params: number[]) => Vector3;
|
|
18
|
+
id: string;
|
|
19
|
+
initCoord: Vector3;
|
|
20
|
+
limits?: AttractorLimits;
|
|
21
|
+
name: string;
|
|
22
|
+
params: AttractorParams;
|
|
23
|
+
}
|
|
24
|
+
export declare const systems: AttractorSystem[];
|
|
25
|
+
export declare function getSystem(id: string): AttractorSystem | undefined;
|
|
26
|
+
export declare const systemIds: string[];
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import "./index.css";
|
package/package.json
ADDED
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "attractor-react",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Interactive 3D strange attractor visualization with real-time parameter control",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/attractor-react.cjs",
|
|
7
|
+
"module": "./dist/attractor-react.js",
|
|
8
|
+
"types": "./dist/types/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"import": {
|
|
12
|
+
"types": "./dist/types/index.d.ts",
|
|
13
|
+
"default": "./dist/attractor-react.js"
|
|
14
|
+
},
|
|
15
|
+
"require": {
|
|
16
|
+
"types": "./dist/types/cjs/index.d.ts",
|
|
17
|
+
"default": "./dist/attractor-react.cjs"
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
"./styles.css": "./dist/styles.css",
|
|
21
|
+
"./package.json": "./package.json"
|
|
22
|
+
},
|
|
23
|
+
"files": [
|
|
24
|
+
"dist"
|
|
25
|
+
],
|
|
26
|
+
"dependencies": {
|
|
27
|
+
"@base-ui/react": "^1.6.0",
|
|
28
|
+
"@fontsource-variable/geist": "^5.3.0",
|
|
29
|
+
"@hono/node-server": "^2.0.11",
|
|
30
|
+
"@tailwindcss/vite": "^4.3.3",
|
|
31
|
+
"class-variance-authority": "^0.7.1",
|
|
32
|
+
"clsx": "^2.1.1",
|
|
33
|
+
"highlight.js": "^11.11.1",
|
|
34
|
+
"lucide-react": "^1.26.0",
|
|
35
|
+
"react": "^19.2.8",
|
|
36
|
+
"react-dom": "^19.2.8",
|
|
37
|
+
"shadcn": "^4.14.1",
|
|
38
|
+
"tailwind-merge": "^3.6.0",
|
|
39
|
+
"tailwindcss": "^4.3.3",
|
|
40
|
+
"three": "^0.175.0",
|
|
41
|
+
"three-stdlib": "^2.36.1",
|
|
42
|
+
"tw-animate-css": "^1.4.0"
|
|
43
|
+
},
|
|
44
|
+
"peerDependencies": {
|
|
45
|
+
"react": "^19.0.0",
|
|
46
|
+
"react-dom": "^19.0.0"
|
|
47
|
+
},
|
|
48
|
+
"peerDependenciesMeta": {
|
|
49
|
+
"@radix-ui/react-slot": {
|
|
50
|
+
"optional": true
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
"devDependencies": {
|
|
54
|
+
"@eslint/js": "^10.0.1",
|
|
55
|
+
"@types/react": "^19.2.17",
|
|
56
|
+
"@types/react-dom": "^19.2.3",
|
|
57
|
+
"@types/three": "^0.175.0",
|
|
58
|
+
"@typescript-eslint/eslint-plugin": "^8.65.0",
|
|
59
|
+
"@typescript-eslint/parser": "^8.65.0",
|
|
60
|
+
"@vitejs/plugin-react": "^4.7.0",
|
|
61
|
+
"eslint": "^10.8.0",
|
|
62
|
+
"eslint-config-prettier": "^10.1.8",
|
|
63
|
+
"eslint-plugin-perfectionist": "^5.10.0",
|
|
64
|
+
"eslint-plugin-prettier": "^5.5.6",
|
|
65
|
+
"prettier": "^3.9.6",
|
|
66
|
+
"typescript": "^5.9.3",
|
|
67
|
+
"vite": "^6.4.3"
|
|
68
|
+
},
|
|
69
|
+
"scripts": {
|
|
70
|
+
"dev": "vite",
|
|
71
|
+
"build": "tsc && vite build",
|
|
72
|
+
"build:esm": "vite build --config vite.esm.config.ts",
|
|
73
|
+
"build:cjs": "vite build --config vite.cjs.config.ts",
|
|
74
|
+
"build:types": "tsc --declaration --emitDeclarationOnly --outDir dist/types --noEmit false",
|
|
75
|
+
"build:types:cjs": "tsc --declaration --emitDeclarationOnly --outDir dist/types/cjs --noEmit false",
|
|
76
|
+
"build:package": "rm -rf dist dist-esm dist-cjs && npm run build:esm -- --outDir dist-esm && npm run build:cjs -- --outDir dist-cjs && npm run build:types && npm run build:types:cjs && mkdir -p dist && cp -r dist-esm/* dist/ && cp -r dist-cjs/* dist/ && rm -rf dist-esm dist-cjs",
|
|
77
|
+
"lint": "eslint src/",
|
|
78
|
+
"lint:fix": "eslint src/ --fix",
|
|
79
|
+
"preview": "vite preview"
|
|
80
|
+
}
|
|
81
|
+
}
|