{"mappings":";;;;AAAA;;;;;;;;;;CAUC;;;AAiGM,SAAS,0CACd,KAA2C,EAC3C,KAAkB,EAClB,GAAmB;IAEnB,MAAM,cAAC,UAAU,EAAC,GAAG;IACrB,MAAM,aAAC,SAAS,eAAE,WAAW,EAAC,GAAG,CAAA,GAAA,yCAAQ,EACvC;QACE,GAAG,KAAK;QACR,SAAS,CAAA,GAAA,yCAAI,EAAE,MAAM,MAAM,EAAE,MAAM,OAAO;IAC5C,GACA;IAGF,OAAO;mBACL;oBACA;QACA,YAAY,MAAM,UAAU,IAAI;QAChC,aAAa,CAAA,GAAA,yCAAS,EAAE,aAAa;YACnC,gBAAgB;QAClB;IACF;AACF","sources":["packages/react-aria/src/button/useToggleButton.ts"],"sourcesContent":["/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {\n  AnchorHTMLAttributes,\n  ButtonHTMLAttributes,\n  ElementType,\n  HTMLAttributes,\n  InputHTMLAttributes,\n  RefObject\n} from 'react';\nimport {\n  AriaBaseButtonProps,\n  AriaButtonElementTypeProps,\n  ButtonAria,\n  ButtonProps,\n  useButton\n} from './useButton';\nimport {chain} from '../utils/chain';\nimport {DOMAttributes} from '@react-types/shared';\nimport {mergeProps} from '../utils/mergeProps';\nimport {ToggleState} from 'react-stately/useToggleState';\n\nexport interface ToggleButtonProps extends ButtonProps {\n  /** Whether the element should be selected (controlled). */\n  isSelected?: boolean;\n  /** Whether the element should be selected (uncontrolled). */\n  defaultSelected?: boolean;\n  /** Handler that is called when the element's selection state changes. */\n  onChange?: (isSelected: boolean) => void;\n}\n\nexport interface AriaToggleButtonProps<T extends ElementType = 'button'>\n  extends\n    ToggleButtonProps,\n    Omit<\n      AriaBaseButtonProps,\n      | 'aria-current'\n      | 'form'\n      | 'formAction'\n      | 'formEncType'\n      | 'formMethod'\n      | 'formNoValidate'\n      | 'formTarget'\n      | 'name'\n      | 'value'\n      | 'type'\n    >,\n    AriaButtonElementTypeProps<T> {}\n\nexport interface AriaToggleButtonOptions<E extends ElementType> extends Omit<\n  AriaToggleButtonProps<E>,\n  'children'\n> {}\n\nexport interface ToggleButtonAria<T> extends ButtonAria<T> {\n  /** Whether the button is selected. */\n  isSelected: boolean;\n  /** Whether the button is disabled. */\n  isDisabled: boolean;\n}\n\n// Order with overrides is important: 'button' should be default\nexport function useToggleButton(\n  props: AriaToggleButtonOptions<'button'>,\n  state: ToggleState,\n  ref: RefObject<HTMLButtonElement | null>\n): ToggleButtonAria<ButtonHTMLAttributes<HTMLButtonElement>>;\nexport function useToggleButton(\n  props: AriaToggleButtonOptions<'a'>,\n  state: ToggleState,\n  ref: RefObject<HTMLAnchorElement | null>\n): ToggleButtonAria<AnchorHTMLAttributes<HTMLAnchorElement>>;\nexport function useToggleButton(\n  props: AriaToggleButtonOptions<'div'>,\n  state: ToggleState,\n  ref: RefObject<HTMLDivElement | null>\n): ToggleButtonAria<HTMLAttributes<HTMLDivElement>>;\nexport function useToggleButton(\n  props: AriaToggleButtonOptions<'input'>,\n  state: ToggleState,\n  ref: RefObject<HTMLInputElement | null>\n): ToggleButtonAria<InputHTMLAttributes<HTMLInputElement>>;\nexport function useToggleButton(\n  props: AriaToggleButtonOptions<'span'>,\n  state: ToggleState,\n  ref: RefObject<HTMLSpanElement | null>\n): ToggleButtonAria<HTMLAttributes<HTMLSpanElement>>;\nexport function useToggleButton(\n  props: AriaToggleButtonOptions<ElementType>,\n  state: ToggleState,\n  ref: RefObject<Element | null>\n): ToggleButtonAria<DOMAttributes>;\n/**\n * Provides the behavior and accessibility implementation for a toggle button component.\n * ToggleButtons allow users to toggle a selection on or off, for example switching between two\n * states or modes.\n */\nexport function useToggleButton(\n  props: AriaToggleButtonOptions<ElementType>,\n  state: ToggleState,\n  ref: RefObject<any>\n): ToggleButtonAria<HTMLAttributes<any>> {\n  const {isSelected} = state;\n  const {isPressed, buttonProps} = useButton(\n    {\n      ...props,\n      onPress: chain(state.toggle, props.onPress)\n    },\n    ref\n  );\n\n  return {\n    isPressed,\n    isSelected,\n    isDisabled: props.isDisabled || false,\n    buttonProps: mergeProps(buttonProps, {\n      'aria-pressed': isSelected\n    })\n  };\n}\n"],"names":[],"version":3,"file":"useToggleButton.mjs.map"}