popover-07
Directory: popovers
Path: /src/lib/components/popovers/popover-07.svelte
<script lang="ts">
import Input from '../ui/input.svelte';
import Button from '$lib/components/ui/button.svelte';
import RiCodeFill from '~icons/ri/code-fill';
import RiFacebookFill from '~icons/ri/facebook-fill';
import RiMailLine from '~icons/ri/mail-line';
import RiTwitterXFill from '~icons/ri/twitter-x-fill';
import { Popover, PopoverContent, PopoverTrigger } from '$lib/components/ui/popover';
import {
Tooltip,
TooltipContent,
TooltipProvider,
TooltipTrigger
} from '$lib/components/ui/tooltip';
import { cn } from '$lib/utils';
import Check from 'lucide-svelte/icons/check';
import Copy from 'lucide-svelte/icons/copy';
let copied = $state(false);
let inputRef = $state<HTMLInputElement | null>(null);
function handleCopy() {
if (!inputRef) return;
navigator.clipboard.writeText(inputRef.value);
copied = true;
setTimeout(() => (copied = false), 1500);
}
</script>
<div class="flex flex-col gap-4">
<Popover>
<PopoverTrigger>
{#snippet child({ props })}
<Button variant="outline" {...props}>Share</Button>
{/snippet}
</PopoverTrigger>
<PopoverContent class="w-72">
<div class="flex flex-col gap-3 text-center">
<div class="text-sm font-medium">Share code</div>
<div class="flex flex-wrap justify-center gap-2">
<Button size="icon" variant="outline" aria-label="Embed">
<RiCodeFill class="size-4" stroke-width={2} aria-hidden="true" />
</Button>
<Button size="icon" variant="outline" aria-label="Share on Twitter">
<RiTwitterXFill class="size-4" stroke-width={2} aria-hidden="true" />
</Button>
<Button size="icon" variant="outline" aria-label="Share on Facebook">
<RiFacebookFill class="size-4" stroke-width={2} aria-hidden="true" />
</Button>
<Button size="icon" variant="outline" aria-label="Share via email">
<RiMailLine class="size-4" stroke-width={2} aria-hidden="true" />
</Button>
</div>
<div class="space-y-2">
<div class="relative">
<Input
bind:ref={inputRef}
id="input-53"
class="pe-9"
type="text"
value="https://originui-svelte.pages.dev/"
aria-label="Share link"
readonly
/>
<TooltipProvider delayDuration={0}>
<Tooltip>
<TooltipTrigger>
{#snippet child()}
<button
onclick={handleCopy}
class="absolute inset-y-0 end-0 flex h-full w-9 items-center justify-center rounded-e-lg border border-transparent text-muted-foreground/80 outline-offset-2 transition-colors hover:text-foreground focus-visible:text-foreground focus-visible:outline focus-visible:outline-2 focus-visible:outline-ring/70 disabled:pointer-events-none disabled:cursor-not-allowed"
aria-label={copied ? 'Copied' : 'Copy to clipboard'}
disabled={copied}
>
<div
class={cn(
'transition-all',
copied ? 'scale-100 opacity-100' : 'scale-0 opacity-0'
)}
>
<Check
class="stroke-emerald-500"
size={16}
stroke-width={2}
aria-hidden="true"
/>
</div>
<div
class={cn(
'absolute transition-all',
copied ? 'scale-0 opacity-0' : 'scale-100 opacity-100'
)}
>
<Copy size={16} stroke-width={2} aria-hidden="true" />
</div>
</button>
{/snippet}
</TooltipTrigger>
<TooltipContent class="px-2 py-1 text-xs">Copy to clipboard</TooltipContent>
</Tooltip>
</TooltipProvider>
</div>
</div>
</div>
</PopoverContent>
</Popover>
</div>
Discover/Contribute
Explore the original Origin UI or contribute by suggesting new components and improvements.