## ADDED Requirements ### Requirement: Provide a new vertigo halo component in the three.js pipeline The system SHALL provide a new shader-driven component that renders a square halo-like tunnel surface inside the existing tresjs / three preview pipeline. #### Scenario: Render the component with defaults - **WHEN** the new component is rendered with default parameters - **THEN** it MUST display a visible square plane with a tunnel-like ring structure - **AND** it MUST render through three.js shader logic rather than DOM or CSS effects ### Requirement: Preserve the reference vertigo tunnel language without page interaction The component MUST preserve shader-friendly equivalents of the reference page's polar tunnel depth, ring segmentation, angular slicing, layered pulse waves, flash highlights, and dark-to-warm palette transitions, while excluding page-level interaction behavior. #### Scenario: Show autonomous pulse motion - **WHEN** the component animation is running - **THEN** the plane MUST show continuously moving ring pulses and highlight flashes without requiring any user input #### Scenario: Ignore preview pointer activity - **WHEN** a user moves, clicks, or drags the pointer in preview - **THEN** the component MUST continue its autonomous animation without pointer-specific visual response ### Requirement: Use a square ground plane with safe controls The component MUST use a square plane geometry, default to a ground-friendly orientation, fade the visible rings before the square boundary becomes visible, and expose safe controls for size, gradient speed, tunnel motion, density, glow, opacity, and palette. #### Scenario: Adjust motion and density controls - **WHEN** a developer changes size, gradient speed, tunnel speed, rotation speed, ring frequency, segment count, pulse intensity, flash intensity, edge glow, opacity, or color props - **THEN** the plane MUST update without requiring a remount #### Scenario: Fade rings before the square border appears - **WHEN** the animated rings expand toward the outer area of the plane - **THEN** they MUST fade out radially before the square outline becomes visible #### Scenario: Use gradient speed as radial animation direction - **WHEN** a developer sets `gradientSpeed` to a positive value - **THEN** the rings MUST expand outward faster as the value increases - **AND WHEN** `gradientSpeed` is negative - **THEN** the rings MUST shrink inward faster as the magnitude increases #### Scenario: Clamp invalid values - **WHEN** a developer passes invalid or extreme numeric values - **THEN** the component MUST clamp or fallback to safe values and continue rendering ### Requirement: Keep the implementation independent and component-scoped The new component MUST be added as a separate registry entry with shader source stored under `src/shader/vertigoHaloComponent/`, without replacing or modifying existing panel components or generic preview infrastructure. #### Scenario: Load the component registry - **WHEN** the dynamic component service loads its configured components - **THEN** the new `vertigoHaloComponent` MUST appear as a separate entry alongside existing components