kanban / src /components /editor /basic /AlignSelector.tsx
Leon4gr45's picture
Deploy magic-resume as Docker Space (port 3000)
c30ea2a verified
Raw
History Blame Contribute Delete
3.54 kB
import React from "react";
import { cn } from "@/lib/utils";
interface AlignSelectorProps {
value: "left" | "center" | "right";
onChange: (value: "left" | "center" | "right") => void;
}
const AlignSelector: React.FC<AlignSelectorProps> = ({ value, onChange }) => {
const layouts = [
{
value: "left",
icon: (
<svg
width="48"
height="48"
viewBox="0 0 48 48"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<circle cx="15" cy="24" r="6" className="fill-current" />
<rect x="27" y="21" width="15" height="2" className="fill-current" />
<rect x="27" y="25" width="12" height="2" className="fill-current" />
<rect x="27" y="29" width="13" height="2" className="fill-current" />
</svg>
),
tooltip: "左对齐",
},
{
value: "center",
icon: (
<svg
width="48"
height="48"
viewBox="0 0 48 48"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<circle cx="24" cy="15" r="6" className="fill-current" />
<rect
x="16.5"
y="27"
width="15"
height="2"
className="fill-current"
/>
<rect x="18" y="31" width="12" height="2" className="fill-current" />
<rect x="17" y="35" width="14" height="2" className="fill-current" />
</svg>
),
tooltip: "居中",
},
{
value: "right",
icon: (
<svg
width="48"
height="48"
viewBox="0 0 48 48"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<circle cx="33" cy="24" r="6" className="fill-current" />
<rect x="6" y="21" width="15" height="2" className="fill-current" />
<rect x="9" y="25" width="12" height="2" className="fill-current" />
<rect x="8" y="29" width="13" height="2" className="fill-current" />
</svg>
),
tooltip: "右对齐",
},
];
return (
<div className="grid grid-cols-3 gap-3">
{layouts.map((layout) => (
<button
key={layout.value}
onClick={() => onChange(layout.value as "left" | "center" | "right")}
title={layout.tooltip}
className={cn(
"group relative flex flex-col items-center justify-center p-3 rounded-xl border-2 transition-all duration-200",
"hover:scale-[1.02] active:scale-[0.98]",
value === layout.value
? "border-primary bg-primary/5 text-primary shadow-sm"
: "border-transparent bg-secondary/40 text-muted-foreground hover:bg-secondary hover:text-foreground"
)}
>
{/* Icon wrapper to control size */}
<div className="w-10 h-10 flex items-center justify-center">
{React.cloneElement(layout.icon as React.ReactElement, {
width: "100%",
height: "100%",
className: "fill-current"
})}
</div>
{/* <span className="text-[10px] mt-2 font-medium opacity-80">
{layout.tooltip}
</span> */}
{value === layout.value && (
<div className="absolute inset-0 rounded-xl ring-2 ring-primary ring-offset-2 ring-offset-background opacity-0 animate-in fade-in zoom-in-95 duration-200 fill-mode-forwards" />
)}
</button>
))}
</div>
);
};
export default AlignSelector;