"use client"; // packages/react/checkbox/src/Checkbox.tsx import * as React from "react"; import { useComposedRefs } from "@radix-ui/react-compose-refs"; import { createContextScope } from "@radix-ui/react-context"; import { composeEventHandlers } from "@radix-ui/primitive"; import { useControllableState } from "@radix-ui/react-use-controllable-state"; import { usePrevious } from "@radix-ui/react-use-previous"; import { useSize } from "@radix-ui/react-use-size"; import { Presence } from "@radix-ui/react-presence"; import { Primitive } from "@radix-ui/react-primitive"; import { jsx, jsxs } from "react/jsx-runtime"; var CHECKBOX_NAME = "Checkbox"; var [createCheckboxContext, createCheckboxScope] = createContextScope(CHECKBOX_NAME); var [CheckboxProvider, useCheckboxContext] = createCheckboxContext(CHECKBOX_NAME); var Checkbox = React.forwardRef( (props, forwardedRef) => { const { __scopeCheckbox, name, checked: checkedProp, defaultChecked, required, disabled, value = "on", onCheckedChange, form, ...checkboxProps } = props; const [button, setButton] = React.useState(null); const composedRefs = useComposedRefs(forwardedRef, (node) => setButton(node)); const hasConsumerStoppedPropagationRef = React.useRef(false); const isFormControl = button ? form || !!button.closest("form") : true; const [checked = false, setChecked] = useControllableState({ prop: checkedProp, defaultProp: defaultChecked, onChange: onCheckedChange }); const initialCheckedStateRef = React.useRef(checked); React.useEffect(() => { const form2 = button?.form; if (form2) { const reset = () => setChecked(initialCheckedStateRef.current); form2.addEventListener("reset", reset); return () => form2.removeEventListener("reset", reset); } }, [button, setChecked]); return /* @__PURE__ */ jsxs(CheckboxProvider, { scope: __scopeCheckbox, state: checked, disabled, children: [ /* @__PURE__ */ jsx( Primitive.button, { type: "button", role: "checkbox", "aria-checked": isIndeterminate(checked) ? "mixed" : checked, "aria-required": required, "data-state": getState(checked), "data-disabled": disabled ? "" : void 0, disabled, value, ...checkboxProps, ref: composedRefs, onKeyDown: composeEventHandlers(props.onKeyDown, (event) => { if (event.key === "Enter") event.preventDefault(); }), onClick: composeEventHandlers(props.onClick, (event) => { setChecked((prevChecked) => isIndeterminate(prevChecked) ? true : !prevChecked); if (isFormControl) { hasConsumerStoppedPropagationRef.current = event.isPropagationStopped(); if (!hasConsumerStoppedPropagationRef.current) event.stopPropagation(); } }) } ), isFormControl && /* @__PURE__ */ jsx( BubbleInput, { control: button, bubbles: !hasConsumerStoppedPropagationRef.current, name, value, checked, required, disabled, form, style: { transform: "translateX(-100%)" }, defaultChecked: isIndeterminate(defaultChecked) ? false : defaultChecked } ) ] }); } ); Checkbox.displayName = CHECKBOX_NAME; var INDICATOR_NAME = "CheckboxIndicator"; var CheckboxIndicator = React.forwardRef( (props, forwardedRef) => { const { __scopeCheckbox, forceMount, ...indicatorProps } = props; const context = useCheckboxContext(INDICATOR_NAME, __scopeCheckbox); return /* @__PURE__ */ jsx(Presence, { present: forceMount || isIndeterminate(context.state) || context.state === true, children: /* @__PURE__ */ jsx( Primitive.span, { "data-state": getState(context.state), "data-disabled": context.disabled ? "" : void 0, ...indicatorProps, ref: forwardedRef, style: { pointerEvents: "none", ...props.style } } ) }); } ); CheckboxIndicator.displayName = INDICATOR_NAME; var BubbleInput = (props) => { const { control, checked, bubbles = true, defaultChecked, ...inputProps } = props; const ref = React.useRef(null); const prevChecked = usePrevious(checked); const controlSize = useSize(control); React.useEffect(() => { const input = ref.current; const inputProto = window.HTMLInputElement.prototype; const descriptor = Object.getOwnPropertyDescriptor(inputProto, "checked"); const setChecked = descriptor.set; if (prevChecked !== checked && setChecked) { const event = new Event("click", { bubbles }); input.indeterminate = isIndeterminate(checked); setChecked.call(input, isIndeterminate(checked) ? false : checked); input.dispatchEvent(event); } }, [prevChecked, checked, bubbles]); const defaultCheckedRef = React.useRef(isIndeterminate(checked) ? false : checked); return /* @__PURE__ */ jsx( "input", { type: "checkbox", "aria-hidden": true, defaultChecked: defaultChecked ?? defaultCheckedRef.current, ...inputProps, tabIndex: -1, ref, style: { ...props.style, ...controlSize, position: "absolute", pointerEvents: "none", opacity: 0, margin: 0 } } ); }; function isIndeterminate(checked) { return checked === "indeterminate"; } function getState(checked) { return isIndeterminate(checked) ? "indeterminate" : checked ? "checked" : "unchecked"; } var Root = Checkbox; var Indicator = CheckboxIndicator; export { Checkbox, CheckboxIndicator, Indicator, Root, createCheckboxScope }; //# sourceMappingURL=index.mjs.map