Spiral Lattice
cellforge/cell-lattice-5FreeComponent
Counter-rotating spiral waves cross through the hex lattice, creating a fast core pulse and softer outer wake.
Install it
npx shadcn@latest add https://cellforge.dev/r/cell-lattice-5.jsonSource
1"use client";23import type { CSSProperties } from "react";45import { cx } from "@/components/ui/cellforge-core";6import { resolveDmxColorTokens } from "@/components/ui/cellforge-core";7import { styleOpacity, stylePx } from "@/components/ui/cellforge-core";8import { remapOpacityToTriplet } from "@/components/ui/cellforge-core";9import { dmxBloomRootActive, dmxDotBloomParts } from "@/components/ui/cellforge-core";10import { getPatternIndexes } from "@/components/ui/cellforge-core";11import { useCellForgePhases } from "@/components/ui/cellforge-hooks";12import { useCyclePhase } from "@/components/ui/cellforge-hooks";13import { usePrefersReducedMotion } from "@/components/ui/cellforge-hooks";14import type { CellForgeCommonProps } from "@/components/ui/cellforge-core";1516export type CellLattice5Props = CellForgeCommonProps;1718const ROW_COUNTS = [3, 4, 5, 4, 3] as const;19const BASE_OPACITY = 0.08;20const HIGH_OPACITY = 0.96;21const HEX_ROW_PITCH_RATIO = Math.sqrt(3) / 2;2223function hexPatternIndex(row: number, rowCount: number, col: number): number {24 return row * ROW_COUNTS[2] + Math.floor((ROW_COUNTS[2] - rowCount) / 2) + col;25}2627function clamp01(n: number | undefined) {28 if (n == null || !Number.isFinite(n)) {29 return;30 }31 return Math.min(1, Math.max(0, n));32}3334function pointForCell(row: number, col: number): { angle: number; radius: number } {35 const count = ROW_COUNTS[row] ?? 1;36 const x = col - (count - 1) / 2;37 const y = (row - 2) * HEX_ROW_PITCH_RATIO;38 return {39 angle: Math.atan2(y, x),40 radius: Math.sqrt(x * x + y * y)41 };42}4344function wavePeak(value: number): number {45 const wrapped = ((value % 1) + 1) % 1;46 return Math.max(0, 1 - Math.abs(wrapped * 2 - 1) / 0.55);47}4849function opacityForCell(row: number, col: number, phase: number): number {50 const { angle, radius } = pointForCell(row, col);51 const spiral = phase + radius * 0.18 + angle / (Math.PI * 2);52 const counterSpiral = phase * 0.72 - radius * 0.16 - angle / (Math.PI * 2);53 const a = wavePeak(spiral);54 const b = wavePeak(counterSpiral) * 0.55;55 const core = radius < 0.1 ? 0.54 + Math.sin(phase * Math.PI * 4) * 0.26 : 0;5657 return Math.min(HIGH_OPACITY, BASE_OPACITY + a * 0.7 + b * 0.42 + core);58}5960export function CellLattice5({61 size = 34,62 dotSize = 5,63 color = "currentColor",64 colorPreset,65 ariaLabel = "Loading",66 className,67 muted = false,68 bloom = false,69 halo = 0,70 dotClassName,71 dotShape = "circle",72 speed = 1.75,73 animated = true,74 hoverAnimated = false,75// … truncated
More from @cellforge
All 71 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| All CellForge Loadersall | @cellforge | Components | Free | no deps | |
| Core Spokescell-angle-1 | @cellforge | Components | Free | no deps | |
| Column Rakecell-angle-10 | @cellforge | Components | Free | no deps | |
| Shelf Descentcell-angle-11 | @cellforge | Components | Free | no deps | |
| Skew Driftcell-angle-12 | @cellforge | Components | Free | no deps | |
| Serpent Zipcell-angle-13 | @cellforge | Components | Free | no deps | |
| Pillar Sweepcell-angle-14 | @cellforge | Components | Free | no deps | |
| Tripod Handoffcell-angle-15 | @cellforge | Components | Free | no deps |
