Initial commit: igny8 project

This commit is contained in:
igny8
2025-11-09 10:27:02 +00:00
commit 60b8188111
27265 changed files with 4360521 additions and 0 deletions

View File

@@ -0,0 +1,199 @@
import { ReactNode } from "react";
interface ListProps {
children: ReactNode;
variant?: "unordered" | "ordered" | "horizontal" | "button" | "icon" | "checkbox" | "radio";
className?: string;
}
export const List: React.FC<ListProps> = ({
children,
variant = "unordered",
className = "",
}) => {
const baseClasses = "rounded-lg border border-gray-200 bg-white dark:border-gray-800 dark:bg-white/[0.03] sm:w-fit";
if (variant === "ordered") {
return (
<ol className={`flex flex-col list-decimal ${baseClasses} ${className}`}>
{children}
</ol>
);
}
if (variant === "horizontal") {
return (
<ul className={`flex flex-col md:flex-row ${baseClasses} ${className}`}>
{children}
</ul>
);
}
if (variant === "button") {
return (
<ul className={`w-full overflow-hidden rounded-lg border border-gray-200 bg-white dark:border-gray-800 dark:bg-white/[0.03] sm:w-[228px] flex flex-col ${className}`}>
{children}
</ul>
);
}
return (
<ul className={`flex flex-col ${baseClasses} ${className}`}>
{children}
</ul>
);
};
interface ListItemProps {
children: ReactNode;
variant?: "unordered" | "ordered" | "horizontal" | "button" | "icon" | "checkbox" | "radio";
onClick?: () => void;
disabled?: boolean;
className?: string;
}
export const ListItem: React.FC<ListItemProps> = ({
children,
variant = "unordered",
onClick,
disabled = false,
className = "",
}) => {
if (variant === "button") {
return (
<li className={`border-b border-gray-200 last:border-b-0 dark:border-gray-800 ${className}`}>
<button
className={`flex w-full items-center gap-3 px-3 py-2.5 text-sm font-medium text-gray-500 hover:bg-brand-50 hover:text-brand-500 dark:text-gray-400 dark:hover:bg-brand-500/[0.12] dark:hover:text-brand-400 ${disabled ? "disabled:opacity-50" : ""}`}
onClick={onClick}
disabled={disabled}
type="button"
>
{children}
</button>
</li>
);
}
if (variant === "horizontal") {
return (
<li className={`flex items-center gap-2 border-b border-gray-200 px-3 py-2.5 text-sm text-gray-500 last:border-0 dark:border-gray-800 dark:text-gray-400 md:border-b-0 md:border-r ${className}`}>
{children}
</li>
);
}
return (
<li className={`flex items-center gap-2 border-b border-gray-200 px-3 py-2.5 text-sm text-gray-500 last:border-b-0 dark:border-gray-800 dark:text-gray-400 ${className}`}>
{children}
</li>
);
};
interface ListDotProps {
className?: string;
}
export const ListDot: React.FC<ListDotProps> = ({ className = "" }) => {
return (
<span className={`ml-2 block h-[3px] w-[3px] rounded-full bg-gray-500 dark:bg-gray-400 ${className}`}></span>
);
};
interface ListIconProps {
children: ReactNode;
className?: string;
}
export const ListIcon: React.FC<ListIconProps> = ({
children,
className = "",
}) => {
return (
<span className={`text-brand-500 dark:text-brand-400 ${className}`}>
{children}
</span>
);
};
interface ListCheckboxItemProps {
id: string;
label: string;
checked?: boolean;
disabled?: boolean;
onChange?: (checked: boolean) => void;
className?: string;
}
export const ListCheckboxItem: React.FC<ListCheckboxItemProps> = ({
id,
label,
checked = false,
disabled = false,
onChange,
className = "",
}) => {
return (
<li className={`border-b border-gray-200 px-3 py-2.5 last:border-b-0 dark:border-gray-800 ${className}`}>
<div className="flex items-center gap-2">
<label className="flex items-center space-x-3 group cursor-pointer">
<div className="relative w-5 h-5">
<input
id={id}
className="w-5 h-5 appearance-none cursor-pointer dark:border-gray-700 border border-gray-300 checked:border-transparent rounded-md checked:bg-brand-500 disabled:opacity-60"
type="checkbox"
checked={checked}
disabled={disabled}
onChange={(e) => onChange?.(e.target.checked)}
/>
</div>
</label>
<label htmlFor={id} className="flex items-center text-sm text-gray-500 cursor-pointer select-none dark:text-gray-400">
{label}
</label>
</div>
</li>
);
};
interface ListRadioItemProps {
id: string;
name: string;
value: string;
label: string;
checked?: boolean;
onChange?: (value: string) => void;
className?: string;
}
export const ListRadioItem: React.FC<ListRadioItemProps> = ({
id,
name,
value,
label,
checked = false,
onChange,
className = "",
}) => {
return (
<li className={`border-b border-gray-200 px-3 py-2.5 last:border-b-0 dark:border-gray-800 ${className}`}>
<label htmlFor={id} className="flex cursor-pointer select-none items-center text-sm text-gray-500 dark:text-gray-400">
<span className="relative">
<input
id={id}
className="sr-only"
type="radio"
value={value}
name={name}
checked={checked}
onChange={(e) => onChange?.(e.target.value)}
/>
<span className={`mr-2 flex h-4 w-4 items-center justify-center rounded-full border ${checked ? "border-brand-500 bg-brand-500" : "bg-transparent border-gray-300 dark:border-gray-700"}`}>
<span className="h-1.5 w-1.5 rounded-full bg-white dark:bg-[#1e2636]"></span>
</span>
</span>
{label}
</label>
</li>
);
};