seti-ramesesv1
Version:
Reusable components and context for Next.js apps
31 lines (28 loc) • 1.9 kB
JavaScript
import { jsxs, jsx } from 'react/jsx-runtime';
import { useState } from 'react';
import styles from '../../styles/Checkbox.module.css.js';
function Checkbox({ checked, defaultChecked = false, onChange, label, id, name, disabled = false, size = "medium", color = "default", labelPlacement = "right", }) {
const isControlled = checked !== undefined;
const [internalChecked, setInternalChecked] = useState(defaultChecked);
const currentChecked = isControlled ? checked : internalChecked;
const handleChange = (e) => {
const newChecked = e.target.checked;
if (!isControlled)
setInternalChecked(newChecked);
onChange?.(e, newChecked);
};
return (jsxs("label", { htmlFor: id, className: `${styles.label} ${styles[`label${capitalize(labelPlacement)}`]} ${disabled ? styles.disabled : styles.enabled}`, children: [jsx("input", { id: id, name: name, type: "checkbox", onChange: handleChange, disabled: disabled, className: styles.peer, ...(isControlled ? { checked: currentChecked } : { defaultChecked }) }), jsx("div", { className: `
${styles.box}
${styles[`${size}Box`]}
${currentChecked ? styles[`${color}Checked`] : ""}
${!disabled && !currentChecked ? styles[`hover${capitalize(color)}`] : ""}
`, children: jsx("svg", { className: `
${styles.icon}
${styles[`${currentChecked ? "checkedIcon" : "uncheckedIcon"}`]}
`, viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 3, strokeLinecap: "round", strokeLinejoin: "round", children: jsx("polyline", { points: "20 6 9 17 4 12" }) }) }), label && jsx("span", { className: `${styles.labelText} ${styles[`${size}Label`]}`, children: label })] }));
}
function capitalize(s) {
return s.charAt(0).toUpperCase() + s.slice(1);
}
export { Checkbox as default };
//# sourceMappingURL=Checkbox.js.map