## ADDED Requirements ### Requirement: Render a standalone liquid bubble mass The system SHALL provide a 3D liquid bubble component that renders as a standalone liquid body with internal bubbles, without relying on an outer container shell or liquid wave simulation. #### Scenario: Render default liquid bubble component - **WHEN** the component is rendered with default parameters - **THEN** it MUST display a visible liquid body with internal bubbles - **AND** it MUST NOT require a separate outer shell mesh to read as complete - **AND** its top surface MUST remain visually stable instead of animating as a wave ### Requirement: Support rectangular and cylindrical liquid volumes The component MUST support rectangular and cylindrical liquid body shapes through the same integration entry. #### Scenario: Render rectangular liquid volume - **WHEN** a developer selects the rectangular shape mode - **THEN** the liquid body MUST render as a box-like volume and keep bubbles constrained within that volume #### Scenario: Render cylindrical liquid volume - **WHEN** a developer selects the cylindrical shape mode - **THEN** the liquid body MUST render as a cylinder-like volume and keep bubbles constrained within that volume ### Requirement: Animate bubbles with bottom-origin rise behavior The component MUST reproduce the reference fizz rhythm by animating bubbles that originate near the bottom region, rise upward, drift slightly, and recycle continuously. #### Scenario: Show clustered bottom-origin bubbling - **WHEN** the component is rendered with bubbling enabled by default - **THEN** bubbles MUST appear to emerge from several lower-region nucleation-like areas instead of an entirely uniform spawn field #### Scenario: Recycle bubbles after top fade - **WHEN** a bubble reaches the upper fade region - **THEN** it MUST fade out and re-enter the lifecycle from the lower region without requiring component remount ### Requirement: Preserve shader-friendly versions of the reference bubble cues The component MUST express the reference bubble feel through shader-friendly equivalents of size variance, subtle wobble, slight growth over lifetime, and bright edge/highlight cues. #### Scenario: Vary bubble size and motion - **WHEN** the bubble system is running - **THEN** visible bubbles MUST not all share the exact same size, speed, or horizontal drift pattern #### Scenario: Render bubble highlight cues - **WHEN** a bubble is visible on screen - **THEN** its rendered appearance MUST include more than a flat solid disc, such as a rim, highlight, or soft inner fill that suggests refraction ### Requirement: Exclude interactive and burst effects from the first version The first version MUST not implement click-driven spawning, cursor-driven disturbance, sparkle bursts, or page-level ambient effect layers from the reference demo. #### Scenario: Ignore pointer interaction - **WHEN** a user moves or clicks the pointer in preview - **THEN** the component MUST continue its default bubbling behavior without creating interaction-specific particles or burst effects ### Requirement: Expose simplified tuning controls with safe bounds The component MUST expose a simplified control set for shape, size, liquid color, opacity, bubble count, bubble speed, bubble size, and bubble spread, and it MUST clamp invalid values to safe non-breaking ranges. #### Scenario: Adjust bubble density and speed - **WHEN** a developer updates `bubbleCount` or `bubbleSpeed` - **THEN** the visible bubbling density or rise tempo MUST change without requiring component remount #### Scenario: Clamp invalid values - **WHEN** a developer passes invalid or extreme values for key numeric props - **THEN** the component MUST clamp or fallback to safe values and continue rendering ### Requirement: Keep implementation inside the three.js canvas pipeline The component MUST implement its liquid and bubble behavior through tresjs/three geometry, materials, and shader logic in canvas. #### Scenario: Validate rendering path - **WHEN** the component is loaded through the project preview pipeline - **THEN** all liquid shading and bubble motion MUST be produced by three.js-side rendering logic rather than DOM or CSS animation ### Requirement: Store shader source in component-scoped files and register the component in service config Shader source code MUST be stored under `src/shader/liquidBubbleComponent/`, and the component MUST be registered through `src/dcsConfig.ts` with usable defaults and configuration controls. #### Scenario: Organize shader files - **WHEN** the liquid bubble component introduces custom shader logic - **THEN** the shader source MUST be read from component-scoped vertex and fragment files instead of inline shader strings in the Vue component #### Scenario: Load component from config registry - **WHEN** the dynamic component service loads its component list - **THEN** the liquid bubble component MUST be available through `src/dcsConfig.ts` without modifying the generic preview view files