Build a runnable browser-based boids simulation with plain HTML, CSS, and JavaScript.

Hard requirements:
- The main runnable interface is index.html at the repo root.
- Use separate files:
  - index.html
  - style.css
  - scripts/state.js
  - scripts/boid.js
  - scripts/view.js
  - scripts/main.js
- Do not use build tools or external libraries.
- Do not use ES modules; wire scripts with <script src="..."></script> tags.
- Render 100s of fast-moving, colorful boids on a 2D canvas.
- No configuration UI—only a fullscreen canvas filling the page.
- Ensure the scripts load and run with no syntax/wiring errors.
- Use window.BoidsApp as a single global namespace. No import/export.

Wiring/API contract across files:
- scripts/state.js: define window.BoidsApp = window.BoidsApp || {} once.
  - App.params: numBoids (250-400), maxSpeed (2-4 px/frame), maxForce (0.03-0.08), perception (35-60), separationDist (12-24).
  - App.state: { boids: [], canvas: null, ctx: null, dpr: 1, width: 0, height: 0, lastTime: 0 }
  - App.util: { rand(min,max), clamp(v,min,max), limitMag(vx,vy,max) -> returns tuple (vx,vy) }
- scripts/boid.js: define App.Boid class with:
  - constructor(x, y): randomly initialize velocity and hue in [0..360).
  - update(boids, params, width, height): compute steering with separation, alignment, cohesion; apply limit; wrap-around edges.
  - draw(ctx): draws a small triangle oriented by velocity, filled with HSL hue color; optionally stroke for visibility.
- scripts/view.js:
  - App.resizeCanvas(canvas, state): sets DPR-aware size to window.innerWidth/innerHeight and updates state.{width,height,dpr}.
  - App.render(state): clears canvas and draws all boids by calling boid.draw(ctx).
- scripts/main.js:
  - Bootstraps on window load:
    - Grabs #boids canvas, sets App.state.canvas/ctx, calls App.resizeCanvas.
    - Creates App.state.boids = Array.from({length: App.params.numBoids}, ...) placing boids randomly in bounds.
    - Animation loop with requestAnimationFrame: updates all boids then App.render(state). Fast and smooth.
    - window.onresize -> App.resizeCanvas.
  - No other UI; canvas covers full window area.
- index.html:
  - Contains a single canvas#boids.
  - CSS linked via <link rel="stylesheet" href="style.css">.
  - Scripts included at end of body in this exact order:
      <script src="scripts/state.js"></script>
      <script src="scripts/boid.js"></script>
      <script src="scripts/view.js"></script>
      <script src="scripts/main.js"></script>

Return ONLY the full file content for your unit, and put the target path on the first line as:
PATH: <path>
