Glass Spotlight
einui/glass-spotlightFreeComponent
A spotlight component that highlights specific areas of the UI with a glass morphism effect.
Install it
npx shadcn@latest add https://ui.eindev.ir/r/glass-spotlight.jsonSource
1"use client"23import * as React from "react"4import { X, ChevronLeft, ChevronRight } from "lucide-react"5import { cn } from "@/lib/utils"67interface SpotlightStep {8 target: string // CSS selector9 title: string10 description: string11 placement?: "top" | "bottom" | "left" | "right"12}1314interface GlassSpotlightProps {15 steps: SpotlightStep[]16 open?: boolean17 onOpenChange?: (open: boolean) => void18 onComplete?: () => void19}2021function GlassSpotlight({ steps, open = false, onOpenChange, onComplete }: GlassSpotlightProps) {22 const [currentStep, setCurrentStep] = React.useState(0)23 const [targetRect, setTargetRect] = React.useState<DOMRect | null>(null)2425 const step = steps[currentStep]2627 React.useLayoutEffect(() => {28 if (!open || !step) return2930 const target = document.querySelector(step.target)31 if (target) {32 const rect = target.getBoundingClientRect()33 // eslint-disable-next-line react-hooks/set-state-in-effect34 setTargetRect(rect)35 target.scrollIntoView({ behavior: "smooth", block: "center" })36 }37 }, [open, step, currentStep])3839 React.useEffect(() => {40 const handleResize = () => {41 if (!step) return42 const target = document.querySelector(step.target)43 if (target) {44 setTargetRect(target.getBoundingClientRect())45 }46 }4748 window.addEventListener("resize", handleResize)49 return () => window.removeEventListener("resize", handleResize)50 }, [step])5152 const handleNext = () => {53 if (currentStep < steps.length - 1) {54 setCurrentStep((prev) => prev + 1)55 } else {56 onComplete?.()57 onOpenChange?.(false)58 setCurrentStep(0)59 }60 }6162 const handlePrev = () => {63 if (currentStep > 0) {64 setCurrentStep((prev) => prev - 1)65 }66 }6768 const handleClose = () => {69 onOpenChange?.(false)70 setCurrentStep(0)71 }7273 if (!open || !targetRect) return null7475 const padding = 876 const tooltipWidth = 3207778 // Calculate tooltip position79 let tooltipStyle: React.CSSProperties = {}80 const placement = step.placement || "bottom"8182 switch (placement) {83 case "top":84 tooltipStyle = {85 left: targetRect.left + targetRect.width / 2 - tooltipWidth / 2,86 bottom: window.innerHeight - targetRect.top + padding + 12,87 }88 break89 case "bottom":90 tooltipStyle = {91 left: targetRect.left + targetRect.width / 2 - tooltipWidth / 2,92 top: targetRect.bottom + padding + 12,93 }94 break95 case "left":96// … truncated
Files it writes
More from einui
All 44 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| Base Widgetbase-widget | einui | Components | Free | 1 dep | |
| Calendar Widgetscalendar-widget | einui | Components | Free | 1 dep | |
| Clock Widgetsclock-widget | einui | Components | Free | 1 dep | |
| Glass Alert Dialogglass-alert-dialog | einui | Components | Free | 1 dep | |
| Glass Avatarglass-avatar | einui | Components | Free | 1 dep | |
| Glass Badgeglass-badge | einui | Components | Free | 1 dep | |
| Glass Breadcrumbglass-breadcrumb | einui | Components | Free | 1 dep | |
| Glass Buttonglass-button | einui | Components | Free | 2 deps |
