Bitcoin motion
bitcoin-ui/bitcoin-motionFreeComponent
Accessible confirmation, mempool, proof-of-work, UTXO, and Merkle motion primitives.
Install it
npx shadcn@latest add https://raw.githubusercontent.com/dennisonbertram/bitcoin-ui/main/public/r/bitcoin-motion.jsonSource
1"use client";23import {4 useId,5 useState,6 type ComponentProps,7 type CSSProperties,8} from "react";910import {11 clampPercent,12 formatFeeRate,13 formatSats,14 formatWeight,15 truncateMiddle,16 type SatoshiValue,17} from "@/lib/bitcoin";18import { componentClasses } from "@/lib/utils";1920import styles from "./bitcoin-motion.module.css";21import type { BitcoinVisualProps } from "./shared";2223type MotionProps = BitcoinVisualProps & {24 /** Pauses motion without changing the represented state. @default false */25 paused?: boolean;26};2728type MotionStyle = CSSProperties & {29 "--motion-column"?: number;30 "--motion-index"?: number;31 "--motion-lane"?: number;32};3334export type AnimatedConfirmationsProps = Omit<35 ComponentProps<"div">,36 "children"37> &38 MotionProps & {39 confirmations: number;40 /** Confirmation target represented by the relay. @default 6 */41 target?: number;42 };4344export function AnimatedConfirmations({45 confirmations,46 target = 6,47 paused,48 unstyled,49 className,50 ...props51}: AnimatedConfirmationsProps) {52 const safeTarget = Math.max(1, Math.floor(target));53 const safeConfirmations = Math.max(0, Math.floor(confirmations));54 const boundedConfirmations = Math.min(safeConfirmations, safeTarget);55 const remaining = Math.max(0, safeTarget - boundedConfirmations);56 const complete = boundedConfirmations >= safeTarget;57 const valueText = complete58 ? `${safeConfirmations} confirmations, finality target reached`59 : `${boundedConfirmations} of ${safeTarget} confirmations`;6061 return (62 <div63 data-slot="animated-confirmations"64 data-state={complete ? "complete" : "confirming"}65 data-paused={paused || undefined}66 data-unstyled={unstyled || undefined}67 className={componentClasses(68 unstyled,69 styles.confirmations,70 className,71 )}72 {...props}73 >74 <header className={componentClasses(unstyled, styles.motionHeader)}>75 <span>Confirmation relay</span>76 <output aria-live="polite">77 {boundedConfirmations} / {safeTarget}78 </output>79 </header>80 <div81 data-slot="animated-confirmations-progress"82 role="progressbar"83 aria-label="Transaction confirmation relay"84 aria-valuemin={0}85 aria-valuemax={safeTarget}86 aria-valuenow={boundedConfirmations}87 aria-valuetext={valueText}88 className={componentClasses(unstyled, styles.confirmationProgress)}89 >90 <ol91// … truncated
What it pulls in
Other registry items
Files it writes
More from bitcoin-ui
All 23 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| Address displayaddress-display | bitcoin-ui | Components | Free | no deps | |
| Bitcoin amountbitcoin-amount | bitcoin-ui | Components | Free | no deps | |
| Bitcoin searchbitcoin-search | bitcoin-ui | Components | Free | 1 dep | |
| Block cardblock-card | bitcoin-ui | Components | Free | 1 dep | |
| Block listblock-list | bitcoin-ui | Components | Free | no deps | |
| Confirmation progressconfirmation-progress | bitcoin-ui | Components | Free | no deps | |
| Difficulty adjustmentdifficulty-adjustment | bitcoin-ui | Components | Free | no deps | |
| Fee estimatesfee-estimates | bitcoin-ui | Components | Free | 1 dep |
