{"version":3,"sources":["../src/Toggle/Toggle.tsx"],"sourcesContent":["import * as React from 'react';\nimport { clsx } from 'clsx';\n\nexport interface ToggleProps {\n  /**\n   * The label for the toggle\n   */\n  label?: string;\n  /**\n   * Whether the toggle is on\n   */\n  checked?: boolean;\n  /**\n   * Callback when toggle state changes\n   */\n  onChange?: (checked: boolean) => void;\n  /**\n   * Whether the toggle is disabled\n   */\n  disabled?: boolean;\n  /**\n   * Custom className\n   */\n  className?: string;\n  /**\n   * Custom style\n   */\n  style?: React.CSSProperties;\n  /**\n   * Test ID for testing\n   */\n  'data-testid'?: string;\n  /**\n   * Name attribute for form submission\n   */\n  name?: string;\n  /**\n   * Value attribute for form submission\n   */\n  value?: string;\n}\n\nconst toggleContainerStyles: React.CSSProperties = {\n  width: '40px',\n  height: '24px',\n  borderRadius: '16px',\n  border: '1px solid',\n  position: 'relative',\n  cursor: 'pointer',\n  transition: 'all 0.2s ease-in-out',\n};\n\nconst knobStyles: React.CSSProperties = {\n  width: '18px',\n  height: '18px',\n  borderRadius: '50%',\n  position: 'absolute',\n  top: '50%',\n  transform: 'translateY(-50%)',\n  transition: 'all 0.2s ease-in-out',\n};\n\nconst labelStyles: React.CSSProperties = {\n  fontSize: '13px',\n  color: '#2f2f2f',\n  cursor: 'pointer',\n  userSelect: 'none' as const,\n  fontFamily: \"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\",\n};\n\nconst wrapperStyles: React.CSSProperties = {\n  display: 'flex',\n  alignItems: 'center',\n  gap: '8px',\n};\n\n/**\n * Toggle component - Arbor Design System\n *\n * A toggle switch input with label support.\n */\nexport const Toggle = React.forwardRef<HTMLInputElement, ToggleProps>(\n  (\n    {\n      label,\n      checked = false,\n      onChange,\n      disabled = false,\n      className,\n      style,\n      'data-testid': dataTestId,\n      name,\n      value,\n    },\n    ref\n  ) => {\n    const [isFocused, setIsFocused] = React.useState(false);\n    const [isHovered, setIsHovered] = React.useState(false);\n    const [isActive, setIsActive] = React.useState(false);\n    const toggleId = React.useId();\n\n    const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n      if (!disabled) {\n        onChange?.(e.target.checked);\n      }\n    };\n\n    // Container styles based on state\n    const getContainerStyles = (): React.CSSProperties => {\n      if (disabled) {\n        return {\n          ...toggleContainerStyles,\n          backgroundColor: checked ? '#d1d1d1' : '#ffffff',\n          borderColor: checked ? '#d1d1d1' : '#d1d1d1',\n          cursor: 'not-allowed',\n        };\n      }\n\n      if (checked) {\n        if (isActive && isFocused) {\n          return {\n            ...toggleContainerStyles,\n            backgroundColor: '#024002',\n            borderColor: '#024002',\n            boxShadow: '0px 0px 0px 3px #3cad51',\n          };\n        }\n        if (isActive) {\n          return {\n            ...toggleContainerStyles,\n            backgroundColor: '#024002',\n            borderColor: '#024002',\n          };\n        }\n        if (isHovered) {\n          return {\n            ...toggleContainerStyles,\n            backgroundColor: '#005700',\n            borderColor: '#005700',\n          };\n        }\n        if (isFocused) {\n          return {\n            ...toggleContainerStyles,\n            backgroundColor: '#0b800b',\n            borderColor: '#0b800b',\n            boxShadow: '0px 0px 0px 3px #3cad51',\n          };\n        }\n        return {\n          ...toggleContainerStyles,\n          backgroundColor: '#0b800b',\n          borderColor: '#0b800b',\n        };\n      } else {\n        if (isActive && isFocused) {\n          return {\n            ...toggleContainerStyles,\n            backgroundColor: '#efefef',\n            borderColor: '#2f2f2f',\n            boxShadow: '0px 0px 0px 3px #3cad51',\n          };\n        }\n        if (isActive) {\n          return {\n            ...toggleContainerStyles,\n            backgroundColor: '#efefef',\n            borderColor: '#2f2f2f',\n          };\n        }\n        if (isHovered) {\n          return {\n            ...toggleContainerStyles,\n            backgroundColor: '#f8f8f8',\n            borderColor: '#595959',\n          };\n        }\n        if (isFocused) {\n          return {\n            ...toggleContainerStyles,\n            backgroundColor: '#ffffff',\n            borderColor: '#7e7e7e',\n            boxShadow: '0px 0px 0px 3px #3cad51',\n          };\n        }\n        return {\n          ...toggleContainerStyles,\n          backgroundColor: '#ffffff',\n          borderColor: '#7e7e7e',\n        };\n      }\n    };\n\n    // Knob styles based on state\n    const getKnobStyles = (): React.CSSProperties => {\n      const baseKnob = {\n        ...knobStyles,\n        left: checked ? '18px' : '2px',\n      };\n\n      if (disabled) {\n        return {\n          ...baseKnob,\n          backgroundColor: checked ? '#f8f8f8' : '#d1d1d1',\n        };\n      }\n\n      if (checked) {\n        if (isActive) {\n          return {\n            ...baseKnob,\n            backgroundColor: '#efefef',\n          };\n        }\n        if (isHovered) {\n          return {\n            ...baseKnob,\n            backgroundColor: '#f8f8f8',\n          };\n        }\n        return {\n          ...baseKnob,\n          backgroundColor: '#ffffff',\n        };\n      } else {\n        if (isActive) {\n          return {\n            ...baseKnob,\n            backgroundColor: '#2f2f2f',\n          };\n        }\n        if (isHovered) {\n          return {\n            ...baseKnob,\n            backgroundColor: '#595959',\n          };\n        }\n        return {\n          ...baseKnob,\n          backgroundColor: '#7e7e7e',\n        };\n      }\n    };\n\n    return (\n      <div\n        className={clsx('arbor-toggle-wrapper', className)}\n        style={{ ...wrapperStyles, ...style }}\n        data-testid={dataTestId}\n      >\n        <input\n          ref={ref}\n          id={toggleId}\n          type=\"checkbox\"\n          checked={checked}\n          onChange={handleChange}\n          onFocus={() => setIsFocused(true)}\n          onBlur={() => setIsFocused(false)}\n          disabled={disabled}\n          name={name}\n          value={value}\n          style={{\n            position: 'absolute',\n            opacity: 0,\n            width: 0,\n            height: 0,\n          }}\n          aria-checked={checked}\n        />\n        <label\n          htmlFor={toggleId}\n          onMouseEnter={() => !disabled && setIsHovered(true)}\n          onMouseLeave={() => !disabled && setIsHovered(false)}\n          onMouseDown={() => !disabled && setIsActive(true)}\n          onMouseUp={() => !disabled && setIsActive(false)}\n          style={{\n            display: 'flex',\n            alignItems: 'center',\n            gap: '8px',\n            cursor: disabled ? 'not-allowed' : 'pointer',\n          }}\n        >\n          <div style={getContainerStyles()}>\n            <div style={getKnobStyles()} />\n          </div>\n          {label && (\n            <span\n              style={{\n                ...labelStyles,\n                color: disabled ? '#7e7e7e' : '#2f2f2f',\n                cursor: disabled ? 'not-allowed' : 'pointer',\n              }}\n            >\n              {label}\n            </span>\n          )}\n        </label>\n      </div>\n    );\n  }\n);\n\nToggle.displayName = 'Toggle';\n"],"mappings":"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","names":[]}