Cursor Player
cursorjs-ui/cursor-playerFreeBlock
A free compound component for starting, pausing, resuming, and stopping cursor.js demos.
Install it
npx shadcn@latest add https://cursorjs.com/r/cursor-player.jsonSource
1'use client';23import * as React from 'react';4import { Pause, Play, Square } from 'lucide-react';5import { Slot } from 'radix-ui';67import { Button } from '@/components/ui/button';8import { cn } from '@/lib/utils';9import { type CursorPlayerRuntime, useCursorPlayer } from './use-cursor-player';1011interface CursorPlayerRootProps<TCursor extends CursorPlayerRuntime> {12 createCursor: (anchorElement: HTMLElement) => TCursor;13 buildSequence: (cursor: TCursor, anchorElement: HTMLElement) => void;14 onError?: (error: unknown) => void;15 children: React.ReactNode;16}1718interface CursorPlayerPartProps extends React.HTMLAttributes<HTMLDivElement> {19 asChild?: boolean;20}2122type CursorPlayerHotspot = 'top-left' | 'center' | { x: number; y: number };2324interface CursorPlayerCursorProps extends CursorPlayerPartProps {25 hotspot?: CursorPlayerHotspot;26}2728interface CursorPlayerButtonProps extends React.ComponentProps<typeof Button> {29 children?: React.ReactNode;30}3132interface CursorPlayerIconProps extends React.HTMLAttributes<HTMLElement> {33 asChild?: boolean;34 children?: React.ReactNode;35}3637const CursorPlayerContext = React.createContext<CursorPlayerContextValue | null>(null);3839function useCursorPlayerContext() {40 const value = React.useContext(CursorPlayerContext);4142 if (!value) {43 throw new Error('CursorPlayer components must be used inside <CursorPlayer>.');44 }4546 return value;47}4849function isPlayVisible(state: CursorPlayerContextValue['state']) {50 return state !== 'running';51}5253function isPauseVisible(state: CursorPlayerContextValue['state']) {54 return state === 'running';55}5657type CursorPlayerContextValue = ReturnType<typeof useCursorPlayer>;58type CursorPlayerRootComponent = <TCursor extends CursorPlayerRuntime>(59 props: CursorPlayerRootProps<TCursor>,60) => React.ReactElement;6162const CursorPlayerRoot: CursorPlayerRootComponent = ({63 createCursor,64 buildSequence,65 onError,66 children,67}) => {68 const controls = useCursorPlayer({ createCursor, buildSequence, onError });6970 return <CursorPlayerContext.Provider value={controls}>{children}</CursorPlayerContext.Provider>;71};7273function getHotspotPosition(hotspot: CursorPlayerHotspot | undefined): {74 left: string;75 top: string;76} {77 if (hotspot === 'center') {78 return { left: '50%', top: '50%' };79 }8081 if (hotspot && typeof hotspot === 'object') {82 return { left: `${hotspot.x}px`, top: `${hotspot.y}px` };83 }8485 return { left: '0px', top: '0px' };86}8788function CursorPlayerCursor({89 className,90// … truncated
What it pulls in
npm packages
Other registry items
