mirror of
https://github.com/Stirling-Tools/Stirling-PDF.git
synced 2025-09-18 17:39:24 +00:00
60 lines
1.5 KiB
TypeScript
60 lines
1.5 KiB
TypeScript
![]() |
import { Button, Group, Stack, Text } from "@mantine/core";
|
||
|
|
||
|
export interface ButtonOption<T> {
|
||
|
value: T;
|
||
|
label: string;
|
||
|
disabled?: boolean;
|
||
|
}
|
||
|
|
||
|
interface ButtonSelectorProps<T> {
|
||
|
value: T | undefined;
|
||
|
onChange: (value: T) => void;
|
||
|
options: ButtonOption<T>[];
|
||
|
label?: string;
|
||
|
disabled?: boolean;
|
||
|
fullWidth?: boolean;
|
||
|
}
|
||
|
|
||
|
const ButtonSelector = <T extends string>({
|
||
|
value,
|
||
|
onChange,
|
||
|
options,
|
||
|
label = undefined,
|
||
|
disabled = false,
|
||
|
fullWidth = true,
|
||
|
}: ButtonSelectorProps<T>) => {
|
||
|
return (
|
||
|
<Stack gap='var(--mantine-spacing-sm)'>
|
||
|
{/* Label (if it exists) */}
|
||
|
{label && <Text style={{
|
||
|
fontSize: "var(--mantine-font-size-sm)",
|
||
|
lineHeight: "var(--mantine-line-height-sm)",
|
||
|
fontWeight: "var(--font-weight-medium)",
|
||
|
}}>{label}</Text>}
|
||
|
|
||
|
{/* Buttons */}
|
||
|
<Group gap='4px'>
|
||
|
{options.map((option) => (
|
||
|
<Button
|
||
|
key={option.value}
|
||
|
variant={value === option.value ? 'filled' : 'outline'}
|
||
|
color={value === option.value ? 'var(--color-primary-500)' : 'var(--text-muted)'}
|
||
|
onClick={() => onChange(option.value)}
|
||
|
disabled={disabled || option.disabled}
|
||
|
style={{
|
||
|
flex: fullWidth ? 1 : undefined,
|
||
|
height: 'auto',
|
||
|
minHeight: '2.5rem',
|
||
|
fontSize: 'var(--mantine-font-size-sm)'
|
||
|
}}
|
||
|
>
|
||
|
{option.label}
|
||
|
</Button>
|
||
|
))}
|
||
|
</Group>
|
||
|
</Stack>
|
||
|
);
|
||
|
};
|
||
|
|
||
|
export default ButtonSelector;
|