{"version":3,"file":"index.cjs","sources":["../../../../src/components/ButtonGroup/ButtonGroup.tsx"],"sourcesContent":["import { forwardRef, useCallback, useState } from 'react';\nimport { Icon } from '@/components/Icon';\nimport { cn, cva } from '@/lib/cva';\nimport { ButtonGroupProps, SelectionValue } from './ButtonGroup.types';\nimport styles from './ButtonGroup.module.css';\n\nconst wrapperVariants = cva(styles.buttongroup, {\n  variants: {\n    type: {\n      default: styles['buttongroup_type_default'],\n      borderless: styles['buttongroup_type_borderless'],\n    },\n    fillWidth: {\n      true: styles['buttongroup_fillwidth'],\n    },\n  },\n  defaultVariants: { type: 'default' },\n});\n\nconst buttonVariants = cva(styles.button, {\n  variants: {\n    type: {\n      default: styles['button_type_default'],\n      borderless: styles['button_type_borderless'],\n    },\n    iconOnly: {\n      true: '',\n      false: '',\n    },\n    fillWidth: {\n      true: styles['button_fillwidth'],\n    },\n  },\n  compoundVariants: [\n    {\n      iconOnly: true,\n      type: 'default',\n      class: styles['button_icon-only_default'],\n    },\n    {\n      iconOnly: true,\n      type: 'borderless',\n      class: styles['button_icon-only_borderless'],\n    },\n  ],\n  defaultVariants: { type: 'default', iconOnly: false },\n});\n\nconst normalizeToSet = (value: SelectionValue | undefined): Set<string> => {\n  if (value === undefined) {\n    return new Set();\n  }\n  if (value instanceof Set) {\n    return new Set(value);\n  }\n  return new Set([value]);\n};\n\nconst isValueSelected = (value: string, selection: Set<string>): boolean => {\n  return selection.has(value);\n};\n\nexport const ButtonGroup = forwardRef<HTMLDivElement, ButtonGroupProps>(\n  (\n    {\n      options,\n      selected,\n      defaultSelected,\n      fillWidth = false,\n      onClick,\n      type = 'default',\n      iconOnly = false,\n      multiple = false,\n      className,\n      ...props\n    },\n    ref\n  ) => {\n    const [internalSelection, setInternalSelection] = useState<Set<string>>(() =>\n      normalizeToSet(defaultSelected)\n    );\n\n    // Use `selected` if the parent needs to own\n    // or sync the selection state management (controlled\n    // by consumer app)\n    // Use `defaultSelected` if the component can manage\n    // its own state independently (uncontrolled)\n    const isControlled = selected !== undefined;\n    const currentSelection = isControlled ? normalizeToSet(selected) : internalSelection;\n\n    const onButtonGroupClickCommonHandler = useCallback(\n      (value: string) => {\n        let newSelection: Set<string>;\n\n        if (multiple) {\n          newSelection = new Set(currentSelection);\n          if (newSelection.has(value)) {\n            newSelection.delete(value);\n          } else {\n            newSelection.add(value);\n          }\n        } else {\n          newSelection = new Set([value]);\n        }\n\n        if (!isControlled) {\n          setInternalSelection(newSelection);\n        }\n\n        // WARN: Single mode returns string\n        // while multiple mode returns Set (DS)\n        onClick?.(value, multiple ? newSelection : value);\n      },\n      [currentSelection, multiple, isControlled, onClick]\n    );\n\n    const buttons = options.map(\n      ({\n        value,\n        label,\n        icon,\n        className: optionClassName,\n        'aria-label': ariaLabel,\n        ...buttonProps\n      }) => {\n        const isActive = isValueSelected(value, currentSelection);\n\n        return (\n          <button\n            key={value}\n            type=\"button\"\n            className={cn(buttonVariants({ type, iconOnly, fillWidth }), optionClassName)}\n            aria-pressed={isActive}\n            onClick={() => onButtonGroupClickCommonHandler(value)}\n            {...buttonProps}\n            aria-label={ariaLabel ?? (iconOnly && icon ? icon.toString() : undefined)}\n          >\n            {iconOnly && icon ? (\n              <span\n                className={cn(\n                  styles.button__icon,\n                  type === 'borderless' && styles['button__icon_height_line']\n                )}\n              >\n                <Icon\n                  name={icon}\n                  size=\"sm\"\n                  aria-hidden\n                />\n              </span>\n            ) : (\n              label\n            )}\n          </button>\n        );\n      }\n    );\n\n    return (\n      <div\n        ref={ref}\n        {...props}\n        className={cn(wrapperVariants({ type, fillWidth }), className)}\n        role=\"group\"\n      >\n        {buttons}\n      </div>\n    );\n  }\n);\n\nButtonGroup.displayName = 'ButtonGroup';\n"],"names":["cva","styles","forwardRef","useState","useCallback","jsx","cn","Icon"],"mappings":"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"}