Build a single self-contained HTML file (no build step, no external assets other than the Three.js CDN) that renders an interactive 3D scene. The scene must contain a breakable, self-healing icosahedral crystal with the following exact specifications.
1. Scene & Renderer Setup

Use Three.js r128+ loaded from a CDN. Set up a WebGLRenderer with antialiasing, sRGB output encoding, and ACES Filmic tone mapping with exposure of 1.1.
Enable shadow maps (PCFSoft). Set pixel ratio to Math.min(window.devicePixelRatio, 2).
Implement full window resize handling that preserves aspect ratio and avoids distortion.

2. Camera & Controls

PerspectiveCamera (50° FOV) positioned at (0, 2, 6) looking at origin.
Implement custom orbit controls from scratch (do NOT rely on OrbitControls being available): left-drag orbits, scroll zooms (clamped between distance 3 and 12), with inertial damping that decays smoothly after release.

3. The Central Object

An icosahedron (radius 1.5) rendered with a physically-based material: base color #BFE3FF (pale cyan-blue), metalness 0.3, roughness 0.15, with a procedurally generated environment map (use a PMREMGenerator on a gradient scene, no external HDR). The low roughness plus the bright env map should give crisp, light-colored reflections.
The crystal must slowly rotate on a tilted axis.

4. Shatter Mechanic (the hard part)

On click (raycast hit on the crystal), the icosahedron must fracture into its individual triangular faces. Each face becomes an independent rigid fragment.
Each fragment must fly outward along its face normal with randomized angular velocity and a gravity-influenced parabolic trajectory.
Fragments must fade in opacity as they travel.
After 3 seconds, all fragments must smoothly interpolate back to their original positions and rotations (ease-in-out), reassembling the crystal perfectly. This reassembly must be frame-rate independent (use delta time, not frame count).

5. Lighting (bright, fully specified — the scene must NOT read dark)

Use these exact colors and intensities. The combined illumination should make the crystal clearly visible with bright highlights and only soft shadows. If anything looks dim, raise intensities rather than lowering them.

Background / clear color: warm off-white #F2EFE9 (set scene.background to this, not black). The procedural environment-map gradient should run from #FFF6E0 (warm top) to #BFD4F2 (cool bottom).
Key light: DirectionalLight, color #FFF4E2 (warm white), intensity 3.2, positioned at (5, 8, 5), targeting the origin. This casts the shadows onto the ground plane.
Warm rim light: DirectionalLight (or SpotLight), color #FF9E55 (amber), intensity 1.4, positioned at (-6, 3, -4) to backlight one edge.
Cool rim light: DirectionalLight (or SpotLight), color #5AA9FF (sky blue), intensity 1.4, positioned at (6, 2, -6) on the opposite side.
Hemisphere fill: HemisphereLight, sky color #FFFFFF, ground color #C9D6E5, intensity 1.1, to lift the shadow areas so nothing goes pure black.
Ambient fill: AmbientLight, color #FFFFFF, intensity 0.45, as a final flat lift across the whole scene.
Ground plane: a large plane using a MeshStandardMaterial in light grey #E4E2DD, roughness 0.9, receiving (but not casting) shadows. Keep shadow opacity soft — a ShadowMaterial at opacity ~0.25, or a shadow.bias of -0.0005 to avoid harsh dark patches.
Tone mapping note: keep ACES Filmic but raise renderer.toneMappingExposure to 1.25 if the scene still looks underexposed.

6. Particles

When the crystal shatters, emit ~200 GPU-friendly point particles from the break origin that drift, twinkle (vary size/opacity over time), and fade out. Color the particles with a warm-to-cool gradient — randomly assign each particle a color between #FFD27A (warm gold) and #9FD0FF (cool blue) so they stay bright against the light background.

7. UI Overlay

A minimal HUD showing live FPS and a fragment count, styled cleanly with CSS, positioned top-left, non-blocking to pointer events on the canvas.

8. Constraints

Single .html file. All JS inline. Must run by opening directly in a browser.
No memory leaks: properly dispose geometries/materials of fragments if regenerated.
Code must be commented at each major section.

Success criteria for comparison: correctness of the shatter-and-reassemble math; smoothness and frame-independence of animation; visual quality of materials and lighting; robustness of the hand-rolled controls; clean code organization.