This component no longer exists. It was in ns-ui’s manifest when we first indexed it and is not there now — the registry served its inventory on 2026-08-07 and this item was not on it. The install command below will fail. It is kept here because a tutorial somewhere still tells people to run it.
Compare Crack Seam
ns-ui/compare-crack-seamRemovedComponent
Before/after comparison slider whose divider is a living Voronoi crack seam — fast drags spawn branching micro-fissures, slow drags heal them shut, and release settles with a 1px specular glint traveling the fracture.
Live preview
live · rendered by the registry
Rendered by ns-ui on their own page — this is the component running, not a screenshot of it.Install it
npx shadcn@latest add https://design.helpmarq.com/r/compare-crack-seam.jsonSource
1"use client";23import { useEffect, useRef, type ReactNode } from "react";45type Pt = { x: number; y: number };6type Fissure = {7 /** origin x relative to the handle (seam offset at spawn) */8 ox: number;9 /** origin y in pane coordinates */10 oy: number;11 /** polyline relative to the origin */12 pts: Pt[];13 len: number;14 alpha: number;15 born: number;16 /** timestamp retraction started; 0 while still held open */17 retract: number;18};1920const HANDLE_W = 40;21const GROW_MS = 90;22const RETRACT_MS = 300;23const GLINT_MS = 450;24const GLINT_LEN = 56;25const SPRING_K = 170; // s^-226const SPRING_C = 2 * 0.85 * Math.sqrt(SPRING_K); // zeta 0.85 — taut, no wobble2728const clamp = (v: number, lo: number, hi: number) => Math.min(hi, Math.max(lo, v));29const easeOut = (t: number) => 1 - (1 - t) ** 3;3031function parseColor(raw: string): { r: number; g: number; b: number } | null {32 const v = raw.trim();33 if (v.startsWith("#")) {34 const hex = v.slice(1);35 if (hex.length === 3) {36 const r = parseInt(hex[0] + hex[0], 16);37 const g = parseInt(hex[1] + hex[1], 16);38 const b = parseInt(hex[2] + hex[2], 16);39 if (Number.isNaN(r) || Number.isNaN(g) || Number.isNaN(b)) return null;40 return { r, g, b };41 }42 if (hex.length >= 6) {43 const r = parseInt(hex.slice(0, 2), 16);44 const g = parseInt(hex.slice(2, 4), 16);45 const b = parseInt(hex.slice(4, 6), 16);46 if (Number.isNaN(r) || Number.isNaN(g) || Number.isNaN(b)) return null;47 return { r, g, b };48 }49 return null;50 }51 const m = v.match(/rgba?\(\s*([\d.]+)[,\s]+([\d.]+)[,\s]+([\d.]+)/i);52 if (!m) return null;53 return { r: Number(m[1]), g: Number(m[2]), b: Number(m[3]) };54}5556/** dart-throwing Poisson disc — relaxes min distance if the pane is crowded */57function poissonPoints(w: number, h: number, count: number, minDist: number): Pt[] {58 const pts: Pt[] = [];59 let d = minDist;60 let attempts = 0;61 while (pts.length < count && attempts < 6000) {62 attempts++;63 const c = { x: Math.random() * w, y: Math.random() * h };64 let ok = true;65 for (const q of pts) {66 const dx = q.x - c.x;67 const dy = q.y - c.y;68 if (dx * dx + dy * dy < d * d) {69 ok = false;70 break;71 }72 }73 if (ok) pts.push(c);74 if (attempts % 1500 === 0) d *= 0.85;75 }76 return pts;77}7879/**80 * Nearest and second-nearest seeds to (x, y). Their perpendicular bisector is81 * the half-plane boundary between the two Voronoi cells — the exact wall the82// … truncated
