import * as stylex from "@stylexjs/stylex";
import { type PropsWithChildren, createElement, memo } from "react";
import ToggleSliderInput from "./ToggleSliderInput";
import { switchConfig } from "./ToggleSliderInput.vars.stylex";
import { a11y, interaction } from "./mixins";
import { color, fontSize, size, transition } from "./tokens.stylex";
// TODO: ASK-UX maybe something like this?
// https://alvarotrigo.com/blog/toggle-switch-css/
export interface ToggleSwitchProps {
label: string;
name?: string;
disabled?: boolean;
/** HTML title attribute */
title?: string;
/** Maximum two lines of text. */
description?: string;
/** `value` and `onChange` are optional because we want to be able to use the control in an uncontrolled manner as well (for example, in forms) */
value?: boolean;
onChange?: (value: boolean) => void;
defaultChecked?: boolean;
}
const styles = stylex.create({
wrapper: {
color: color.white900,
cursor: "pointer",
display: "grid",
gridTemplateColumns: "auto 1fr",
alignItems: "center",
gap: `0 ${switchConfig.labelGap}`,
transition: `${transition.a11yOutline}`,
},
disabled: {
cursor: "not-allowed",
color: color.gray100,
},
label: {
textAlign: "left",
},
description: {
fontSize: fontSize.sub,
whiteSpace: "pre-line",
textAlign: "left",
color: color.gray100,
gridColumn: "2",
},
stack: {
display: "flex",
flexDirection: "column",
gap: size.px4,
},
});
export default memo(function ToggleSwitch(props: ToggleSwitchProps) {
return (
// biome-ignore lint/a11y/noLabelWithoutControl: is inside ToggleSliderInput
);
});
export type ToggleSwitchStackProps = PropsWithChildren;
export const ToggleSwitchStack = memo(function ToggleSwitchStack({
children,
}: ToggleSwitchStackProps) {
return createElement("div", stylex.props(styles.stack), children);
});