diff --git a/src/components/backgrounds/BackgroundRenderer.tsx b/src/components/backgrounds/BackgroundRenderer.tsx
index d9dcb27..d712f5d 100644
--- a/src/components/backgrounds/BackgroundRenderer.tsx
+++ b/src/components/backgrounds/BackgroundRenderer.tsx
@@ -92,7 +92,7 @@ export function BackgroundRenderer() {
0 ? `blur(${effectiveConfig.blur}px)` : undefined,
contain: 'strict',
diff --git a/src/components/ui/backgrounds/background-boxes.tsx b/src/components/ui/backgrounds/background-boxes.tsx
index 55b0350..62af05e 100644
--- a/src/components/ui/backgrounds/background-boxes.tsx
+++ b/src/components/ui/backgrounds/background-boxes.tsx
@@ -1,4 +1,4 @@
-import React, { useMemo } from 'react';
+import React, { useEffect, useRef, useMemo } from 'react';
import { sanitizeColor, clampNumber } from './types';
interface Props {
@@ -16,60 +16,150 @@ const COLORS = [
'#c4b5fd',
];
+function hexToRgb(hex: string): [number, number, number] {
+ const v = parseInt(hex.slice(1), 16);
+ return [(v >> 16) & 255, (v >> 8) & 255, v & 255];
+}
+
+interface CellData {
+ rgb: [number, number, number];
+ phase: number;
+ period: number;
+}
+
+// Pre-computed transform constants for skewX(-48deg) skewY(14deg) scale(0.675)
+const SKEW_X_TAN = Math.tan((-48 * Math.PI) / 180);
+const SKEW_Y_TAN = Math.tan((14 * Math.PI) / 180);
+const GRID_SCALE = 0.675;
+
+/**
+ * Animated boxes background rendered on a single