{"version":3,"file":"Switch.cjs","sources":["../../../src/components/Switch/Switch.tsx"],"sourcesContent":["import { useId, useUncontrolled } from '@raikou/hooks';\nimport {\n  Box,\n  BoxProps,\n  createVarsResolver,\n  ElementProps,\n  extractStyleProps,\n  factory,\n  Factory,\n  getRadius,\n  getSize,\n  getThemeColor,\n  RaikouColor,\n  RaikouRadius,\n  RaikouSize,\n  StylesApiProps,\n  useProps,\n  useStyles,\n} from '../../core';\nimport { InlineInput, InlineInputStylesNames } from '../InlineInput';\nimport { useSwitchGroupContext } from './SwitchGroup.context';\nimport { SwitchGroup } from './SwitchGroup/SwitchGroup';\nimport {\n  SwitchInputStyle,\n  SwitchRootStyle,\n  SwitchThumbStyle,\n  SwitchTrackLabelStyle,\n  SwitchTrackStyle,\n} from './Switch.css';\n\nexport type SwitchStylesNames =\n  | 'root'\n  | 'track'\n  | 'trackLabel'\n  | 'thumb'\n  | 'input'\n  | InlineInputStylesNames;\nexport type SwitchCssVariables = {\n  root:\n    | '--switch-radius'\n    | '--switch-height'\n    | '--switch-width'\n    | '--switch-thumb-size'\n    | '--switch-label-font-size'\n    | '--switch-track-label-padding'\n    | '--switch-color';\n};\n\nexport interface SwitchProps\n  extends BoxProps,\n    StylesApiProps<SwitchFactory>,\n    ElementProps<'input', 'size' | 'children'> {\n  /** Id used to bind input and label, if not passed, unique id will be generated instead */\n  id?: string;\n\n  /** Content of the `label` associated with the radio */\n  label?: React.ReactNode;\n\n  /** Inner label when the `Switch` is in unchecked state */\n  offLabel?: React.ReactNode;\n\n  /** Inner label when the `Switch` is in checked state */\n  onLabel?: React.ReactNode;\n\n  /** Key of `theme.colors` or any valid CSS color to set input color in checked state, `theme.primaryColor` by default */\n  color?: RaikouColor;\n\n  /** Controls size of all elements */\n  size?: RaikouSize | (string & {});\n\n  /** Key of `theme.radius` or any valid CSS value to set `border-radius,` \"xl\" by default */\n  radius?: RaikouRadius;\n\n  /** Props passed down to the root element */\n  wrapperProps?: Record<string, any>;\n\n  /** Icon inside the thumb of the switch */\n  thumbIcon?: React.ReactNode;\n\n  /** Position of the label relative to the input, `'right'` by default */\n  labelPosition?: 'left' | 'right';\n\n  /** Description displayed below the label */\n  description?: React.ReactNode;\n\n  /** Error displayed below the label */\n  error?: React.ReactNode;\n\n  /** Assigns ref of the root element */\n  rootRef?: React.ForwardedRef<HTMLDivElement>;\n}\n\nexport type SwitchFactory = Factory<{\n  props: SwitchProps;\n  ref: HTMLInputElement;\n  stylesNames: SwitchStylesNames;\n  vars: SwitchCssVariables;\n  staticComponents: {\n    Group: typeof SwitchGroup;\n  };\n}>;\n\nconst defaultProps: Partial<SwitchProps> = {\n  labelPosition: 'right',\n};\n\nconst varsResolver = createVarsResolver<SwitchFactory>((theme, { radius, color, size }) => ({\n  root: {\n    '--switch-radius': radius === undefined ? undefined : getRadius(radius),\n    '--switch-height': getSize(size, 'switch-height'),\n    '--switch-width': getSize(size, 'switch-width'),\n    '--switch-thumb-size': getSize(size, 'switch-thumb-size'),\n    '--switch-label-font-size': getSize(size, 'switch-label-font-size'),\n    '--switch-track-label-padding': getSize(size, 'switch-track-label-padding'),\n    '--switch-color': color ? getThemeColor(color, theme) : undefined,\n  },\n}));\n\nexport const Switch = factory<SwitchFactory>((_props, ref) => {\n  const props = useProps('Switch', defaultProps, _props);\n  const {\n    classNames,\n    className,\n    style,\n    styles,\n    unstyled,\n    vars,\n    color,\n    label,\n    offLabel,\n    onLabel,\n    id,\n    size,\n    radius,\n    wrapperProps,\n    thumbIcon,\n    checked,\n    defaultChecked,\n    onChange,\n    labelPosition,\n    description,\n    error,\n    disabled,\n    variant,\n    rootRef,\n    mod,\n    ...others\n  } = props;\n\n  const ctx = useSwitchGroupContext();\n  const _size = size || ctx?.size;\n\n  const getStyles = useStyles<SwitchFactory>({\n    name: 'Switch',\n    props,\n    classes: {\n      root: SwitchRootStyle,\n      track: SwitchTrackStyle,\n      trackLabel: SwitchTrackLabelStyle,\n      thumb: SwitchThumbStyle,\n      input: SwitchInputStyle,\n    },\n    className,\n    style,\n    classNames,\n    styles,\n    unstyled,\n    vars,\n    varsResolver,\n  });\n\n  const { styleProps, rest } = extractStyleProps(others);\n  const uuid = useId(id);\n\n  const contextProps = ctx\n    ? {\n        checked: ctx.value.includes(rest.value as string),\n        onChange: ctx.onChange,\n      }\n    : {};\n\n  const [_checked, handleChange] = useUncontrolled({\n    value: contextProps.checked ?? checked,\n    defaultValue: defaultChecked,\n    finalValue: false,\n  });\n\n  return (\n    <InlineInput\n      {...getStyles('root')}\n      __staticSelector=\"Switch\"\n      __stylesApiProps={props}\n      id={uuid}\n      size={_size}\n      labelPosition={labelPosition}\n      label={label}\n      description={description}\n      error={error}\n      disabled={disabled}\n      bodyElement=\"label\"\n      labelElement=\"span\"\n      classNames={classNames}\n      styles={styles}\n      unstyled={unstyled}\n      data-checked={contextProps.checked || checked || undefined}\n      variant={variant}\n      ref={rootRef}\n      mod={mod}\n      {...styleProps}\n      {...wrapperProps}\n    >\n      <input\n        {...rest}\n        disabled={disabled}\n        checked={_checked}\n        data-checked={contextProps.checked || checked || undefined}\n        onChange={(event) => {\n          ctx ? contextProps.onChange?.(event) : onChange?.(event);\n          handleChange(event.currentTarget.checked);\n        }}\n        id={uuid}\n        ref={ref}\n        type=\"checkbox\"\n        role=\"switch\"\n        {...getStyles('input')}\n      />\n\n      <Box\n        aria-hidden=\"true\"\n        mod={{ error, 'label-position': labelPosition, 'without-labels': !onLabel && !offLabel }}\n        {...getStyles('track')}\n      >\n        <Box component=\"span\" mod=\"reduce-motion\" {...getStyles('thumb')}>\n          {thumbIcon}\n        </Box>\n        <span {...getStyles('trackLabel')}>{_checked ? onLabel : offLabel}</span>\n      </Box>\n    </InlineInput>\n  );\n});\n\nSwitch.displayName = '@raikou/core/Switch';\nSwitch.Group = SwitchGroup;\n"],"names":["createVarsResolver","getRadius","getSize","getThemeColor","factory","useProps","useSwitchGroupContext","useStyles","SwitchRootStyle","SwitchTrackStyle","SwitchTrackLabelStyle","SwitchThumbStyle","SwitchInputStyle","extractStyleProps","useId","useUncontrolled","jsxs","InlineInput","jsx","Box","SwitchGroup"],"mappings":"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"}