{"version":3,"file":"toggle-group.mjs","sources":["../src/toggle-group/ToggleGroupRoot.ts","../src/toggle-group/ToggleGroupItem.ts","../src/toggle-group/ToggleGroupItem.vue","../src/toggle-group/ToggleGroupRoot.vue"],"sourcesContent":["import { computed, type MaybeRefOrGetter, type Ref } from 'vue'\nimport { type Direction, useDirection } from '../direction/index.ts'\nimport { createContext, useControllableStateV2 } from '../hooks/index.ts'\nimport { type RovingFocusGroupRootProps, useRovingFocusGroupRoot } from '../roving-focus/index.ts'\nimport { type EmitsToHookProps, mergePrimitiveAttrs, type PrimitiveDefaultProps, type RadixPrimitiveReturns } from '../shared/index.ts'\n\nexport type ToggleGroupType = 'single' | 'multiple' | undefined\n\nexport interface ToggleGroupProps<T extends ToggleGroupType> extends ToggleGroupImplProps {\n  type?: T\n\n  value?: T extends 'multiple' ? ToggleGroupMultipleProps['value'] : ToggleGroupSingleProps['value']\n\n  defaultValue?: T extends 'multiple' ? ToggleGroupMultipleProps['defaultValue'] : ToggleGroupSingleProps['defaultValue']\n}\n\nexport const DEFAULT_TOGGLE_GROUP_PROPS = {\n  disabled: undefined,\n  rovingFocus: undefined,\n  loop: undefined,\n} satisfies PrimitiveDefaultProps<ToggleGroupProps<ToggleGroupType>>\n\ntype SingleValue = ToggleGroupSingleProps['value']\ntype MultipleValue = ToggleGroupMultipleProps['value']\ntype Value<T extends ToggleGroupType> = T extends 'multiple' ? MultipleValue : SingleValue\ntype DefValue<T extends ToggleGroupType> = T extends 'multiple' ? Exclude<SingleValue, undefined> : MultipleValue\ntype EmitValue<T> = T extends 'multiple' ? Exclude<ToggleGroupMultipleProps['value'], undefined> : Exclude<ToggleGroupSingleProps['value'], undefined>\n\nexport type ToggleGroupEmits<T extends ToggleGroupType> = {\n  /**\n   * The callback that fires when the state of the toggle group changes.\n   */\n  'update:value': [value: EmitValue<T> ]\n}\n\ninterface ToggleGroupSingleProps {\n  /**\n   * The controlled stateful value of the item that is pressed.\n   */\n  value?: string\n  /**\n   * The value of the item that is pressed when initially rendered. Use\n   * `defaultValue` if you do not need to control the state of a toggle group.\n   */\n  defaultValue?: string\n}\n\ninterface ToggleGroupMultipleProps {\n  /**\n   * The controlled stateful value of the items that are pressed.\n   */\n  value?: string[]\n  /**\n   * The value of the items that are pressed when initially rendered. Use\n   * `defaultValue` if you do not need to control the state of a toggle group.\n   */\n  defaultValue?: string[]\n}\n\ninterface ToggleGroupImplProps {\n  /**\n   * Whether the group is disabled from user interaction.\n   * @defaultValue false\n   */\n  disabled?: boolean\n  /**\n   * Whether the group should maintain roving focus of its buttons.\n   * @defaultValue true\n   */\n  rovingFocus?: boolean\n  loop?: RovingFocusGroupRootProps['loop']\n  orientation?: RovingFocusGroupRootProps['orientation']\n  dir?: RovingFocusGroupRootProps['dir']\n}\n\nexport interface ToggleGroupContext {\n  rovingFocus: boolean\n  disabled: () => boolean | undefined\n\n  type: ToggleGroupType\n  value: Ref<string[]>\n  onItemActivate: (value: string) => void\n  onItemDeactivate: (value: string) => void\n}\n\nexport const [provideToggleGroupContext, useToggleGroupContext] = createContext<ToggleGroupContext>('ToggleGroup')\n\nexport interface UseToggleGroupProps<T extends ToggleGroupType> extends EmitsToHookProps<ToggleGroupEmits<T>> {\n  type?: T\n  value?: () => T extends 'multiple' ? ToggleGroupMultipleProps['value'] : ToggleGroupSingleProps['value']\n  defaultValue?: T extends 'multiple' ? ToggleGroupMultipleProps['defaultValue'] : ToggleGroupSingleProps['defaultValue']\n\n  disabled?: () => boolean | undefined\n  rovingFocus?: boolean\n  loop?: RovingFocusGroupRootProps['loop']\n  orientation?: RovingFocusGroupRootProps['orientation']\n  dir?: MaybeRefOrGetter<Direction | undefined>\n}\n\nconst TYPE_MULTIPLE = 'multiple' as const satisfies ToggleGroupType\n\nexport function useToggleGroup<T extends ToggleGroupType>(props: UseToggleGroupProps<T>): RadixPrimitiveReturns {\n  const isMultiple = props.type === TYPE_MULTIPLE\n  const {\n    disabled = () => undefined,\n    rovingFocus = true,\n    loop = true,\n    defaultValue = isMultiple ? [] : undefined,\n  } = props\n\n  const value = useControllableStateV2<Value<T>, EmitValue<T>, DefValue<T>>(\n    props.value,\n    props.onUpdateValue,\n    defaultValue as DefValue<T>,\n  )\n\n  const direction = useDirection(props.dir)\n\n  provideToggleGroupContext({\n    type: props.type,\n    value: isMultiple\n      ? value as Ref<string[]>\n      : computed<string[]>(() => value.value ? [value.value as string] : []),\n    onItemActivate: isMultiple\n      ? (itemValue) => {\n          value.value = [...value.value || [], itemValue] as DefValue<T>\n        }\n      : (itemValue) => {\n          value.value = itemValue as DefValue<T>\n        },\n    onItemDeactivate: isMultiple\n      ? (itemValue) => {\n          value.value = ((value.value || []) as string[]).filter(value => value !== itemValue) as DefValue<T>\n        }\n      : () => {\n          value.value = '' as DefValue<T>\n        },\n    rovingFocus,\n    disabled,\n  })\n\n  const rovingFocusGroupRoot = rovingFocus\n    ? useRovingFocusGroupRoot({\n      orientation: props.orientation,\n      dir: direction,\n      loop,\n    })\n    : undefined\n\n  return {\n    attrs(extraAttrs = []) {\n      const primitiveAttrs = {\n        role: 'group',\n        dir: direction.value,\n      }\n\n      if (rovingFocusGroupRoot) {\n        return rovingFocusGroupRoot.attrs([primitiveAttrs, ...extraAttrs])\n      }\n\n      if (extraAttrs.length > 0) {\n        mergePrimitiveAttrs(primitiveAttrs, extraAttrs)\n      }\n\n      return primitiveAttrs\n    },\n  }\n}\n","import type { PrimitiveDefaultProps, PrimitiveElAttrs, RadixPrimitiveReturns } from '../shared/index.ts'\nimport { computed, type MaybeRefOrGetter, toValue } from 'vue'\nimport { useRovingFocusGroupItem } from '../roving-focus/index.ts'\nimport { mergePrimitiveAttrs } from '../shared/index.ts'\nimport { type ToggleProps, useToggle, type UseToggleProps } from '../toggle/index.ts'\nimport { useToggleGroupContext } from './ToggleGroupRoot.ts'\n\nexport interface ToggleGroupItemProps extends Omit<ToggleProps, 'pressed' | 'defaultPressed'> {\n  /**\n   * A string value for the toggle group item. All items within a toggle group should use a unique value.\n   */\n  value: string\n}\n\nexport const DEFAULT_TOGGLE_GROUP_ITEM_PROPS = {\n  as: 'button',\n  disabled: undefined,\n} satisfies PrimitiveDefaultProps<ToggleGroupItemProps>\n\nexport interface UseToggleGroupItemProps extends Omit<UseToggleProps, 'pressed' | 'defaultPressed' | 'onUpdatePressed'> {\n  value: MaybeRefOrGetter<string>\n}\n\nexport function useToggleGroupItem(props: UseToggleGroupItemProps): RadixPrimitiveReturns {\n  const context = useToggleGroupContext('ToggleGroupItem')\n  const pressed = computed(() => {\n    const _value = toValue(props.value)\n    return context.value.value.includes(_value)\n  })\n  const disabled = computed(() => context.disabled() || props.disabled?.())\n\n  const toggle = useToggle({\n    pressed() {\n      return pressed.value\n    },\n    onUpdatePressed(pressed) {\n      if (pressed) {\n        context.onItemActivate(toValue(props.value))\n      }\n      else {\n        context.onItemDeactivate(toValue(props.value))\n      }\n    },\n    disabled() {\n      return disabled.value\n    },\n  })\n\n  const rovingFocusGroupItem = context.rovingFocus\n    ? useRovingFocusGroupItem({\n      focusable() {\n        return !disabled.value\n      },\n      active() {\n        return pressed.value\n      },\n    })\n    : undefined\n\n  return {\n    attrs(extraAttrs = []) {\n      const attrs = context.type === 'multiple'\n        ? {}\n        : {\n            'role': 'radio',\n            'aria-checked': pressed.value,\n            'aria-pressed': undefined,\n          }\n\n      const extraAttrsList: PrimitiveElAttrs[] = [toggle.attrs()]\n\n      if (rovingFocusGroupItem) {\n        extraAttrsList.push(rovingFocusGroupItem.attrs())\n      }\n\n      if (extraAttrs && extraAttrs.length > 0) {\n        extraAttrsList.push(...extraAttrs)\n      }\n\n      if (extraAttrsList.length > 0) {\n        mergePrimitiveAttrs(attrs, extraAttrsList)\n      }\n\n      return attrs\n    },\n  }\n}\n","<script setup lang=\"ts\">\nimport { Primitive } from '../primitive/index.ts'\nimport { convertPropsToHookProps, normalizeAttrs } from '../shared/index.ts'\nimport { DEFAULT_TOGGLE_GROUP_ITEM_PROPS, type ToggleGroupItemProps, useToggleGroupItem } from './ToggleGroupItem.ts'\n\ndefineOptions({\n  name: 'ToggleGroupItem',\n  inheritAttrs: false,\n})\n\nconst props = withDefaults(defineProps<ToggleGroupItemProps>(), DEFAULT_TOGGLE_GROUP_ITEM_PROPS)\n\nconst toggleGroupItem = useToggleGroupItem(convertPropsToHookProps(\n  props,\n  ['value', 'disabled'],\n))\n</script>\n\n<template>\n  <Primitive v-bind=\"normalizeAttrs(toggleGroupItem.attrs([$attrs, { as }]))\">\n    <slot />\n  </Primitive>\n</template>\n","<script setup lang=\"ts\" generic=\"T extends ToggleGroupType = undefined\">\nimport { Primitive } from '../primitive/index.ts'\nimport { convertPropsToHookProps, type EmitsToHookProps, normalizeAttrs } from '../shared/index.ts'\nimport {\n  DEFAULT_TOGGLE_GROUP_PROPS,\n  type ToggleGroupEmits,\n  type ToggleGroupProps,\n  type ToggleGroupType,\n  useToggleGroup,\n} from './ToggleGroupRoot.ts'\n\ndefineOptions({\n  name: 'ToggleGroup',\n  inheritAttrs: false,\n})\n\nconst props = withDefaults(defineProps<ToggleGroupProps<T>>(), DEFAULT_TOGGLE_GROUP_PROPS)\nconst emit = defineEmits<ToggleGroupEmits<T>>()\n\nconst toggleGroup = useToggleGroup(convertPropsToHookProps(\n  props,\n  ['value', 'disabled', 'dir'],\n  (): Required<EmitsToHookProps<ToggleGroupEmits<T>>> => ({\n    onUpdateValue(value) {\n      emit('update:value', value)\n    },\n  }),\n))\n</script>\n\n<template>\n  <Primitive v-bind=\"normalizeAttrs(toggleGroup.attrs([$attrs]))\">\n    <slot />\n  </Primitive>\n</template>\n"],"names":["value","pressed"],"mappings":"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"}