Infinity Trace
cellforge/cell-angle-17FreeComponent
A stepped head and tail follow a single 10-cell path: left base up to the apex, down the right rim, then through (4,4) → center → (4,2) for a crossing loop.
Install it
npx shadcn@latest add https://cellforge.dev/r/cell-angle-17.jsonSource
1"use client";23import type { CSSProperties } from "react";45import { cx } from "@/components/ui/cellforge-core";6import { resolveDmxColorTokens } from "@/components/ui/cellforge-core";7import { useCellForgePhases } from "@/components/ui/cellforge-hooks";8import { styleOpacity, stylePx } from "@/components/ui/cellforge-core";9import { remapOpacityToTriplet } from "@/components/ui/cellforge-core";10import { dmxBloomRootActive, dmxDotBloomParts } from "@/components/ui/cellforge-core";11import { useCyclePhase } from "@/components/ui/cellforge-hooks";12import { usePrefersReducedMotion } from "@/components/ui/cellforge-hooks";13import type { CellForgeCommonProps } from "@/components/ui/cellforge-core";1415export type CellAngle17Props = CellForgeCommonProps;1617const MATRIX_SIZE = 7;18const BASE_OPACITY = 0.06;19const HIGH_OPACITY = 0.95;2021const TRIANGLE_CELLS = new Set([22 "1,3",23 "2,2",24 "2,4",25 "3,1",26 "3,3",27 "3,5",28 "4,0",29 "4,2",30 "4,4",31 "4,6"32]);3334/**35 * Visits every triangle cell once per lap: up the left rim to the apex, down the right rim,36 * then cuts through (4,4) → center → (4,2) — reads as a crossing “∞” on the silhouette.37 */38const INFINITY_PATH: ReadonlyArray<readonly [number, number]> = [39 [4, 0],40 [3, 1],41 [2, 2],42 [1, 3],43 [2, 4],44 [3, 5],45 [4, 6],46 [4, 4],47 [3, 3],48 [4, 2]49];5051const PATH_LEN = INFINITY_PATH.length;52const TRAIL_SPAN = 4.35;5354function isWithinTriangleMask(row: number, col: number): boolean {55 if (row < 0 || row >= MATRIX_SIZE || col < 0 || col >= MATRIX_SIZE) {56 return false;57 }5859 return TRIANGLE_CELLS.has(`${row},${col}`);60}6162function pathIndex(row: number, col: number): number | null {63 for (let i = 0; i < PATH_LEN; i += 1) {64 const [pr, pc] = INFINITY_PATH[i]!;65 if (pr === row && pc === col) {66 return i;67 }68 }69 return null;70}7172function modF(n: number, m: number): number {73 return ((n % m) + m) % m;74}7576function behindAlongPath(s: number, i: number, L: number): number {77 return modF(s - i, L);78}7980function smoothstep01(edge0: number, edge1: number, x: number): number {81 if (edge1 <= edge0) {82 return x >= edge1 ? 1 : 0;83 }84 const t = Math.max(0, Math.min(1, (x - edge0) / (edge1 - edge0)));85 return t * t * (3 - 2 * t);86}8788function opacityForCell(row: number, col: number, phase: number): number {89 const idx = pathIndex(row, col);90 if (idx === null) {91 return 0;92 }9394 const s = phase * PATH_LEN;95 const d = behindAlongPath(s, idx, PATH_LEN);96// … 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 |
