Skip to content

[Phase 5] React Frontend Core #7

@Sakeeb91

Description

@Sakeeb91

Objective

Build interactive React frontend with core visualization components and API integration.

Deliverables

  • IsingVisualizer - Heatmap of spin configuration
  • ControlPanel - Temperature, size, sampler controls
  • useSimulationStore - Zustand state management
  • API service for backend communication
  • Responsive layout with Tailwind CSS

Files to Create

File Description
frontend/src/components/IsingVisualizer.tsx Plotly heatmap component
frontend/src/components/ControlPanel.tsx Parameter controls
frontend/src/store/simulationStore.ts Zustand store
frontend/src/services/api.ts API client
frontend/src/App.tsx Main layout

Core Implementation

// frontend/src/components/IsingVisualizer.tsx
import Plot from 'react-plotly.js';

interface Props {
  spins: number[][];
  size: number;
}

export const IsingVisualizer: React.FC<Props> = ({ spins, size }) => (
  <Plot
    data={[{
      z: spins,
      type: 'heatmap',
      colorscale: [[0, '#3b82f6'], [1, '#ef4444']],
      showscale: false,
    }]}
    layout={{
      width: 400, height: 400,
      margin: { t: 20, b: 20, l: 20, r: 20 },
      xaxis: { visible: false },
      yaxis: { visible: false },
    }}
    config={{ displayModeBar: false }}
  />
);
// frontend/src/store/simulationStore.ts
import { create } from 'zustand';

interface SimulationState {
  temperature: number;
  latticeSize: number;
  spins: number[][] | null;
  isRunning: boolean;
  samplerType: 'mcmc' | 'diffusion';
  setTemperature: (t: number) => void;
  setLatticeSize: (s: number) => void;
  setSpins: (s: number[][]) => void;
}

export const useSimulationStore = create<SimulationState>((set) => ({
  temperature: 2.27,
  latticeSize: 32,
  spins: null,
  isRunning: false,
  samplerType: 'diffusion',
  setTemperature: (temperature) => set({ temperature }),
  setLatticeSize: (latticeSize) => set({ latticeSize }),
  setSpins: (spins) => set({ spins }),
}));

Verification

  • Render 32x32 lattice in < 100ms
  • Temperature slider updates store immediately
  • API errors show user-friendly messages
  • Layout responsive on mobile

Definition of Done

  • All components render without errors
  • TypeScript compiles with no errors
  • Store state persists across component rerenders
  • API calls succeed and update UI

Dependencies

  • Phase 0: Foundation
  • Phase 1: Backend sampling endpoints

Related

Meta issue: #1

Metadata

Metadata

Assignees

No one assigned

    Labels

    frontendFrontend/UI workphaseImplementation phase

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions