mirror of
https://github.com/bluewave-labs/Checkmate.git
synced 2026-05-19 16:08:39 -05:00
ba0c89fc6c
Replace custom SVG icons and @mui/icons-material with lucide-react for consistent, lightweight icon management across the application. ## Changes - Add lucide-react package and remove @mui/icons-material - Create theme-aware Icon wrapper component with color resolution - Create iconMap.js for legacy icon name mappings - Migrate 64 components to use new Icon component - Remove 74 unused SVG files from assets/icons/ ## Benefits - Consistent icon API across the application - Smaller bundle size with tree-shakeable imports - Theme-aware color support via MUI theme paths - Simpler maintenance with single icon library
117 lines
3.2 KiB
React
117 lines
3.2 KiB
React
import PropTypes from "prop-types";
|
|
import { FormControlLabel, Checkbox as MuiCheckbox } from "@mui/material";
|
|
import { useTheme } from "@emotion/react";
|
|
import Icon from "../../Icon";
|
|
|
|
/**
|
|
* Checkbox Component
|
|
*
|
|
* A customized checkbox component using Material-UI that supports custom sizing,
|
|
* disabled states, and custom icons.
|
|
*
|
|
* @component
|
|
* @param {Object} props - Component properties
|
|
* @param {string} props.id - Unique identifier for the checkbox input
|
|
* @param {string} [props.name] - Optional name attribute for the checkbox
|
|
* @param {(string|React.ReactNode)} props.label - Label text or node for the checkbox
|
|
* @param {('small'|'medium'|'large')} [props.size='medium'] - Size of the checkbox icon
|
|
* @param {boolean} props.isChecked - Current checked state of the checkbox
|
|
* @param {string} [props.value] - Optional value associated with the checkbox
|
|
* @param {Function} [props.onChange] - Callback function triggered when checkbox state changes
|
|
* @param {boolean} [props.isDisabled] - Determines if the checkbox is disabled
|
|
*
|
|
* @returns {React.ReactElement} Rendered Checkbox component
|
|
*
|
|
* @example
|
|
* // Basic usage
|
|
* <Checkbox
|
|
* id="terms-checkbox"
|
|
* label="I agree to terms"
|
|
* isChecked={agreed}
|
|
* onChange={handleAgree}
|
|
* />
|
|
*
|
|
* @example
|
|
* // With custom size and disabled state
|
|
* <Checkbox
|
|
* id="advanced-checkbox"
|
|
* label="Advanced Option"
|
|
* size="large"
|
|
* isChecked={isAdvanced}
|
|
* isDisabled={!canModify}
|
|
* onChange={handleAdvancedToggle}
|
|
* />
|
|
*/
|
|
const Checkbox = ({
|
|
id,
|
|
name,
|
|
label,
|
|
size = "medium",
|
|
isChecked,
|
|
value,
|
|
onChange,
|
|
isDisabled,
|
|
}) => {
|
|
/* TODO move sizes to theme */
|
|
const sizes = { small: "14px", medium: "16px", large: "18px" };
|
|
const theme = useTheme();
|
|
return (
|
|
<FormControlLabel
|
|
className="checkbox-wrapper"
|
|
control={
|
|
<MuiCheckbox
|
|
checked={isDisabled ? false : isChecked}
|
|
name={name}
|
|
value={value}
|
|
onChange={onChange}
|
|
icon={<Icon name="Square" />}
|
|
checkedIcon={<Icon name="CheckSquare" />}
|
|
inputProps={{
|
|
"aria-label": "controlled checkbox",
|
|
id: id,
|
|
}}
|
|
sx={{
|
|
"&:hover": { backgroundColor: "transparent" },
|
|
"& svg": { width: sizes[size], height: sizes[size] },
|
|
}}
|
|
/>
|
|
}
|
|
label={label}
|
|
disabled={isDisabled}
|
|
sx={{
|
|
borderRadius: theme.shape.borderRadius,
|
|
p: theme.spacing(2.5),
|
|
"& .MuiButtonBase-root": {
|
|
width: theme.spacing(10),
|
|
p: 0,
|
|
mr: theme.spacing(6),
|
|
},
|
|
"&:not(:has(.Mui-disabled)):hover": {
|
|
backgroundColor: theme.palette.tertiary.main,
|
|
},
|
|
"& span.MuiTypography-root": {
|
|
fontSize: 13,
|
|
color: theme.palette.primary.contrastTextTertiary,
|
|
},
|
|
".MuiFormControlLabel-label.Mui-disabled": {
|
|
color: theme.palette.primary.contrastTextTertiary,
|
|
opacity: 0.25,
|
|
},
|
|
}}
|
|
/>
|
|
);
|
|
};
|
|
|
|
Checkbox.propTypes = {
|
|
id: PropTypes.string,
|
|
name: PropTypes.string,
|
|
label: PropTypes.oneOfType([PropTypes.string, PropTypes.node]).isRequired,
|
|
size: PropTypes.oneOf(["small", "medium", "large"]),
|
|
isChecked: PropTypes.bool.isRequired,
|
|
value: PropTypes.oneOfType([PropTypes.string, PropTypes.bool]),
|
|
onChange: PropTypes.func,
|
|
isDisabled: PropTypes.bool,
|
|
};
|
|
|
|
export default Checkbox;
|