Files
dt-design-system/packages/hex-background/src/HexCamera.tsx
michael e74c285b70 Add storefront component migration: cards, badges, progress bars, animations, and React wrapper package
Major feature migration from dt-shopify-storefront into the design system:

- Card system: per-card color modes (normal/emphasis/warning/success/other),
  progress bars, full-bleed card body (card-body-flush), image bevel clip-paths,
  and visible structural borders at bevel corners
- Badge system: dt-card-badge with position-aware offsets for cards vs media frames
- Media frames: dt-bevel-media with inner surface fill, image clipping, and
  "MISSING MEDIA" placeholder for empty containers
- Interactive bevel buttons: dt-btn with hover/selected states and pulse animation
- Menu items: dt-menu-item with active states and level indentation
- Animations: scale-in, fade-in, slide-up, pulse, ping, spin keyframes
- Feature legend: CSS grid for product feature icons with state colors
- Scrollbar styling for DT brand
- New @dangerousthings/react package wrapping web CSS components
- New @dangerousthings/tailwind-preset package
- New @dangerousthings/hex-background package
- Desktop showcase rewritten in React with Tailwind CSS
- Mobile showcase updated with new screens (animations, filters, advanced cards)
- Tokens: added mode color tokens, RGB variants, and selected-state tokens

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 10:18:39 -08:00

37 lines
926 B
TypeScript

/**
* HexCamera — Orbiting camera for hexagon grid
*
* Continuously rotates around the grid center at a fixed radius and height.
*/
import {useRef} from 'react';
import {useFrame, useThree} from '@react-three/fiber';
export interface HexCameraProps {
/** Orbital rotation speed in radians per second @default 0.02 */
speed?: number;
/** Orbital distance from center @default 8 */
radius?: number;
/** Camera Y height @default 5 */
height?: number;
}
export function HexCamera({
speed = 0.02,
radius = 8,
height = 5,
}: HexCameraProps) {
const angleRef = useRef(0);
const {camera} = useThree();
useFrame((_state, delta) => {
angleRef.current = (angleRef.current + speed * delta) % (Math.PI * 2);
const x = Math.cos(angleRef.current) * radius;
const z = Math.sin(angleRef.current) * radius;
camera.position.set(x, height, z);
camera.lookAt(0, 0, 0);
});
return null;
}