mirror of
https://github.com/shadcn-ui/ui.git
synced 2026-07-01 00:24:20 +00:00
* feat(v4): update home page * fix * fix: cards * feat(v4): charts page * feat: update pages * feat: colors * fix * feat: add docs * feat: mdx work * fix * fix * fix: sidebar * fix: lint * feat: updates * feat: update components * feat: fix docs * fix: responsive * feat: implement cmdk * fix: update navigation menu demo * fix: code style * fix: themes * feat: implement blocks page * fix: docs config * refactor * fix: outputFileTracingIncludes * fix * fix: output * fix * fix: registry * refactor: move docs * debug: docs * debug * revert * fix: mjs * deps: pin fumadocs * debug * fix: downgrade next * fix: index page * refactor: move mdx components * fix: remove copy button * fix * was it zod * yes it was * remove copy page * fix: color page * fix: colors page * fix: meta colors * fix: copy button * feat: sync registry * fix: registry build script * feat: update port * feat: clean up examples * fix * fix: mobile nav * fix: blur for mobile * fix: sidebar nav * feat: update examples * fix: build scripts * feat: update components * feat: restyle * fix: types * fix: styles * fix: margins * fix: screenshots * fix * feat: update theme * fix: charts nav * fix: image * feat: optimize images * fix: menu * fix: card * fix: border * check * feat: implement charts page * fix: charts * fix: og images * feat: extend touch * fix: static * fix: sizing * fix: mobile screenshots * fix: page nav * fix * feat: update favicon * fix: theme selector * fix: feedback * fix: sink * docs: update * fix: styles * chore: update registry * fix: command * fix * fix: minor updates * fix: typography on smaller devices * fix: format * fix: remove unused icon * feat: update favicon * fix: typography * docs: typography page * fix: steps
57 lines
2.2 KiB
TypeScript
57 lines
2.2 KiB
TypeScript
"use client"
|
|
|
|
import { Check, Clipboard } from "lucide-react"
|
|
import { toast } from "sonner"
|
|
|
|
import { type Color } from "@/lib/colors"
|
|
import { trackEvent } from "@/lib/events"
|
|
import { useColors } from "@/hooks/use-colors"
|
|
import { useCopyToClipboard } from "@/hooks/use-copy-to-clipboard"
|
|
|
|
export function Color({ color }: { color: Color }) {
|
|
const { format, setLastCopied, lastCopied } = useColors()
|
|
const { isCopied, copyToClipboard } = useCopyToClipboard({ timeout: 0 })
|
|
|
|
return (
|
|
<button
|
|
key={color.hex}
|
|
className="group relative flex aspect-[3/1] w-full flex-1 cursor-pointer flex-col gap-2 text-(--text) sm:aspect-[2/3] sm:h-auto sm:w-auto [&>svg]:absolute [&>svg]:top-4 [&>svg]:right-4 [&>svg]:z-10 [&>svg]:h-3.5 [&>svg]:w-3.5 [&>svg]:opacity-0 [&>svg]:transition-opacity"
|
|
data-last-copied={lastCopied === color[format]}
|
|
style={
|
|
{
|
|
"--bg": `${color.oklch}`,
|
|
"--text": color.foreground,
|
|
} as React.CSSProperties
|
|
}
|
|
onClick={() => {
|
|
copyToClipboard(color[format])
|
|
trackEvent({
|
|
name: "copy_color",
|
|
properties: {
|
|
color: color.id,
|
|
value: color[format],
|
|
format,
|
|
},
|
|
})
|
|
setLastCopied(color[format])
|
|
toast.success(`Copied ${color[format]} to clipboard.`)
|
|
}}
|
|
>
|
|
{isCopied ? (
|
|
<Check className="group-hover:opacity-100 group-data-[last-copied=true]:opacity-100" />
|
|
) : (
|
|
<Clipboard className="group-hover:opacity-100" />
|
|
)}
|
|
<div className="border-ghost after:border-input w-full flex-1 rounded-md bg-(--bg) after:rounded-lg md:rounded-lg" />
|
|
<div className="flex w-full flex-col items-center justify-center gap-1">
|
|
<span className="text-muted-foreground group-hover:text-foreground group-data-[last-copied=true]:text-primary font-mono text-xs tabular-nums transition-colors sm:hidden xl:flex">
|
|
{color.className}
|
|
</span>
|
|
<span className="text-muted-foreground group-hover:text-foreground group-data-[last-copied=true]:text-primary hidden font-mono text-xs tabular-nums transition-colors sm:flex xl:hidden">
|
|
{color.scale}
|
|
</span>
|
|
</div>
|
|
</button>
|
|
)
|
|
}
|