{ "$schema": "https://blode.co/ui/schema/registry-item.json", "name": "checkbox", "title": "Checkbox", "author": "Matthew Blode", "description": "A control that allows the user to toggle between checked and unchecked states.", "dependencies": ["@base-ui/react"], "files": [ { "path": "ui/checkbox.tsx", "content": "\"use client\";\n\nimport { Checkbox as CheckboxPrimitive } from \"@base-ui/react/checkbox\";\nimport * as React from \"react\";\n\nimport { cn } from \"@/lib/utils\";\n\nimport \"./checkbox.css\";\n\ntype CheckedState = boolean | \"indeterminate\";\n\nexport interface CheckboxProps extends Omit<\n React.ComponentProps,\n \"checked\" | \"defaultChecked\" | \"indeterminate\" | \"onCheckedChange\"\n> {\n checked?: CheckedState;\n defaultChecked?: CheckedState;\n hasError?: boolean;\n indeterminate?: boolean;\n onCheckedChange?: (checked: CheckedState) => void;\n}\n\nconst Checkbox = ({\n checked,\n className,\n defaultChecked,\n hasError,\n indeterminate,\n onCheckedChange,\n ...props\n}: CheckboxProps) => {\n const resolvedIndeterminate =\n indeterminate ?? (checked === \"indeterminate\" || defaultChecked === \"indeterminate\");\n\n return (\n onCheckedChange?.(nextChecked)}\n render={(renderProps, state) => {\n let dataState: \"indeterminate\" | \"checked\" | \"unchecked\" = \"unchecked\";\n if (state.indeterminate) {\n dataState = \"indeterminate\";\n } else if (state.checked) {\n dataState = \"checked\";\n }\n return ;\n }}\n {...props}\n >\n \n \n \n \n \n \n \n );\n};\n\nexport { Checkbox };\n", "type": "registry:ui", "target": "" }, { "path": "ui/checkbox.css", "content": ".ft-checkbox[data-state=\"checked\"] .ft-checkbox-polyline {\n stroke-dashoffset: 44;\n transition: stroke-dashoffset 250ms linear 0.2s;\n}\n\n.ft-checkbox:not([data-state=\"checked\"]) .ft-checkbox-polyline {\n stroke-dashoffset: 66;\n}\n\n.ft-checkbox .ft-checkbox-line {\n opacity: 0;\n transform: scaleX(0);\n transform-origin: center;\n transition:\n opacity 250ms ease,\n transform 250ms ease;\n}\n\n.ft-checkbox[data-state=\"indeterminate\"] .ft-checkbox-line {\n opacity: 1;\n transform: scaleX(1);\n transition:\n opacity 250ms ease 0.1s,\n transform 250ms ease 0.1s;\n}\n\n.ft-checkbox[data-state=\"indeterminate\"] .ft-checkbox-polyline {\n opacity: 0;\n}\n\n.ft-checkbox::after {\n position: absolute;\n inset: 0;\n content: \"\";\n background-color: var(--primary);\n border-radius: 6px;\n opacity: 0;\n transform-origin: center;\n scale: 0.5;\n transition: all 200ms linear;\n}\n\n.ft-checkbox[data-state=\"checked\"]::after,\n.ft-checkbox[data-state=\"indeterminate\"]::after {\n opacity: 1;\n scale: 1;\n}\n\n.ft-checkbox[data-state=\"checked\"]::before,\n.ft-checkbox[data-state=\"indeterminate\"]::before {\n border-color: var(--primary);\n}\n\n.ft-checkbox::before {\n position: absolute;\n inset: 0;\n content: \"\";\n border: 1px solid var(--input);\n border-radius: 6px;\n transform-origin: center;\n transition: all;\n}\n\n.ft-checkbox:hover::before {\n border-color: var(--input-hover, var(--input));\n}\n", "type": "registry:ui", "target": "" } ], "type": "registry:ui" }