Image Zoom
more-shadcn-noair/image-zoomFreeComponent
A component to zoom into images in an overlay.
Live preview
live · rendered by the registry
Rendered by more-shadcn-noair on their own page — this is the component running, not a screenshot of it.Install it
npx shadcn@latest add https://more-shadcn.noair.fun/r/image-zoom.jsonSource
1<script lang="ts">2 import { writable } from 'svelte/store';3 import { setImageZoomContext, type ZoomImageData } from './ctx';4 import { fade } from 'svelte/transition';5 import { onMount, onDestroy, type Snippet } from 'svelte';6 import { Button } from '$lib/components/ui/button';7 import { X, ChevronLeft, ChevronRight } from '@lucide/svelte';8 import { cn } from '$UTILS$';910 let {11 class: className,12 children13 }: {14 class?: string;15 children?: Snippet;16 } = $props();1718 const registeredImagesStore = writable<ZoomImageData[]>([]);19 const currentImageIndexStore = writable<number | null>(null);20 const openStore = writable(false);2122 let registeredImages = $state<ZoomImageData[]>([]);23 let currentImageIndex = $state<number | null>(null);24 let isOpen = $state(false);2526 $effect(() => {27 registeredImages = $registeredImagesStore;28 currentImageIndex = $currentImageIndexStore;29 isOpen = $openStore;30 });3132 const currentImageData = $derived(33 currentImageIndex !== null ? registeredImages[currentImageIndex] : null34 );35 const hasMultipleImages = $derived(registeredImages.length > 1);36 const hasPrevious = $derived(currentImageIndex !== null && currentImageIndex > 0);37 const hasNext = $derived(38 currentImageIndex !== null && currentImageIndex < registeredImages.length - 139 );4041 function registerImage(imageData: Omit<ZoomImageData, 'index'>) {42 const index = $registeredImagesStore.length;43 $registeredImagesStore = [...$registeredImagesStore, { ...imageData, index }];44 return index;45 }4647 function openImage(index: number) {48 $currentImageIndexStore = index;49 $openStore = true;50 }5152 function nextImage() {53 if (currentImageIndex !== null && hasNext) {54 $currentImageIndexStore = currentImageIndex + 1;55 }56 }5758 function prevImage() {59 if (currentImageIndex !== null && hasPrevious) {60 $currentImageIndexStore = currentImageIndex - 1;61 }62 }6364 function closeZoom() {65 $openStore = false;66 $currentImageIndexStore = null;67 }6869 setImageZoomContext({70 registeredImages: registeredImagesStore,71 currentImageIndex: currentImageIndexStore,72 open: openStore,73 registerImage,74 openImage,75 nextImage,76 prevImage77 });7879 function handleKeydown(event: KeyboardEvent) {80 if (!isOpen) return;81 if (event.key === 'Escape') closeZoom();82 if (event.key === 'ArrowLeft') prevImage();83 if (event.key === 'ArrowRight') nextImage();84 }85</script>8687<svelte:window onkeydown={handleKeydown} />8889// … truncated
What it pulls in
Other registry items
More from more-shadcn-noair
All 43 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| Audioaudio | more-shadcn-noair | Components | Free | no deps | |
| Audio Waveaudio-wave | more-shadcn-noair | Components | Free | no deps | |
| Autocompleteautocomplete | more-shadcn-noair | Components | Free | no deps | |
| Bannerbanner | more-shadcn-noair | Components | Free | no deps | |
| Big Calendarbig-calendar | more-shadcn-noair | Components | Free | no deps | |
| Bottom Navigationbottom-nav | more-shadcn-noair | Components | Free | no deps | |
| Canvascanvas | more-shadcn-noair | Components | Free | no deps | |
| Chipchip | more-shadcn-noair | Components | Free | no deps |
