{"version":3,"file":"switch.mjs","sources":["../src/switch/SwitchRoot.ts","../src/switch/SwitchBubbleInput.vue","../src/switch/SwitchRoot.vue","../src/switch/SwitchThumb.ts","../src/switch/SwitchThumb.vue"],"sourcesContent":["import type { PrimitiveProps } from '../primitive/index.ts'\nimport { type Ref, shallowRef } from 'vue'\nimport { createContext, type MutableRefObject, useControllableStateV2, useRef } from '../hooks/index.ts'\nimport { type EmitsToHookProps, mergePrimitiveAttrs, type PrimitiveDefaultProps, type RadixPrimitiveReturns } from '../shared/index.ts'\n\nexport interface SwitchRootProps {\n  as?: PrimitiveProps['as']\n  checked?: boolean\n  defaultChecked?: boolean\n  required?: boolean\n\n  disabled?: boolean\n  value?: string\n  name?: string\n}\n\nexport const DEFAULT_SWITCH_ROOT_PROPS = {\n  as: 'button',\n  checked: undefined,\n  defaultChecked: undefined,\n  value: 'on',\n  required: undefined,\n  disabled: undefined,\n} satisfies PrimitiveDefaultProps<SwitchRootProps>\n\nexport type SwitchRootEmits = {\n  'update:checked': [checked: boolean]\n}\n\nexport interface SwitchRootContext {\n  checked: Ref<boolean>\n  disabled: () => boolean | undefined\n  bubbleInput: {\n    control: Ref<HTMLButtonElement | undefined>\n    bubbles: MutableRefObject<boolean>\n    isFormControl: MutableRefObject<boolean>\n    name: () => string | undefined\n    value: () => string\n    checked: Ref<boolean>\n    required: () => boolean | undefined\n    disabled: () => boolean | undefined\n  }\n}\n\nexport const [provideSwitchContext, useSwitchContext] = createContext<SwitchRootContext>('Switch')\n\nexport interface UseSwitchRootProps extends EmitsToHookProps<SwitchRootEmits> {\n  control?: Ref<HTMLButtonElement | undefined>\n  checked?: () => boolean | undefined\n  defaultChecked?: boolean\n  disabled?: () => boolean | undefined\n  required?: () => boolean | undefined\n  value?: () => string\n  name?: () => string | undefined\n}\n\nexport function useSwitchRoot(props: UseSwitchRootProps): RadixPrimitiveReturns {\n  const {\n    disabled = () => undefined,\n    required = () => undefined,\n    value = () => 'on',\n    name = () => undefined,\n  } = props\n\n  const control = props.control || shallowRef<HTMLButtonElement>()\n  const setElRef = props.control ? undefined : (value: HTMLElement | undefined) => control.value = value as HTMLButtonElement\n\n  const bubbles = useRef(true)\n\n  // We set this to true by default so that events bubble to forms without JS (SSR)\n  const isFormControl = useRef(false)\n  const checked = useControllableStateV2(props.checked, props.onUpdateChecked, props.defaultChecked)\n\n  function onClick(event: MouseEvent) {\n    if (event.defaultPrevented)\n      return\n    checked.value = !checked.value\n\n    if (isFormControl.value) {\n      bubbles.value = !event.cancelBubble\n    }\n  }\n\n  provideSwitchContext({\n    checked,\n    disabled,\n    bubbleInput: {\n      control,\n      bubbles,\n      isFormControl,\n      name,\n      value,\n      checked,\n      required,\n      disabled,\n    },\n  })\n\n  return {\n    attrs(extraAttrs) {\n      const _disabled = disabled()\n      const _checked = checked.value\n      const attrs = {\n        'elRef': setElRef,\n        'type': 'button',\n        'role': 'switch',\n        'aria-checked': _checked,\n        'aria-required': required(),\n        'data-state': _checked ? 'checked' : 'unchecked',\n        'data-disabled': _disabled ? '' : undefined,\n        'disabled': _disabled,\n        'value': value(),\n        onClick,\n      }\n\n      if (extraAttrs && extraAttrs.length > 0) {\n        mergePrimitiveAttrs(attrs, extraAttrs)\n      }\n\n      return attrs\n    },\n  }\n}\n","<script setup lang=\"ts\">\nimport { watch } from 'vue'\nimport { useSwitchContext } from './SwitchRoot.ts'\n\ndefineOptions({\n  name: 'SwitchBubbleInput',\n})\n\nconst bubbleInput = useSwitchContext('CheckboxBubbleInput').bubbleInput\nbubbleInput.isFormControl.value = true\n\nlet input: HTMLInputElement | undefined\nfunction setElRef(vNode: any) {\n  input = vNode\n}\n\n// TODO: Check if this is the correct way to create a change event\n// const initChecked = isIndeterminate(props.checked) ? false : props.checked\n\n// Bubble checked change to parents (e.g form change event)\nwatch(bubbleInput.checked, (checked, prevChecked) => {\n  if (!input)\n    return\n\n  const inputProto = window.HTMLInputElement.prototype\n  const descriptor = Object.getOwnPropertyDescriptor(inputProto, 'checked') as PropertyDescriptor\n  const setChecked = descriptor.set\n\n  if (prevChecked !== checked && setChecked) {\n    // TODO: Check if this is the correct way to create a change event\n    const inputEvent = new Event('input', { bubbles: bubbleInput.bubbles.value })\n    const changeEvent = new Event('change', { bubbles: bubbleInput.bubbles.value })\n    setChecked.call(input, checked)\n    input.dispatchEvent(inputEvent)\n    input.dispatchEvent(changeEvent)\n  }\n})\n</script>\n\n<template>\n  <input\n    :ref=\"setElRef\"\n    type=\"checkbox\"\n    aria-hidden=\"true\"\n    tabindex=\"-1\"\n    :name=\"bubbleInput.name()\"\n    :value=\"bubbleInput.value()\"\n    :checked=\"bubbleInput.checked.value\"\n    :required=\"bubbleInput.required()\"\n    :style=\"{\n      position: 'absolute',\n      pointerEvents: 'none',\n      opacity: 0,\n      margin: 0,\n    }\"\n  >\n</template>\n","<script setup lang=\"ts\">\nimport { Primitive } from '../primitive/index.ts'\nimport { convertPropsToHookProps, type EmitsToHookProps, normalizeAttrs } from '../shared/index.ts'\nimport { DEFAULT_SWITCH_ROOT_PROPS, type SwitchRootEmits, type SwitchRootProps, useSwitchRoot } from './SwitchRoot.ts'\n\ndefineOptions({\n  name: 'SwitchRoot',\n  inheritAttrs: false,\n})\n\nconst props = withDefaults(defineProps<SwitchRootProps>(), DEFAULT_SWITCH_ROOT_PROPS)\nconst emit = defineEmits<SwitchRootEmits>()\n\nconst switchRoot = useSwitchRoot(convertPropsToHookProps(\n  props,\n  ['checked', 'disabled', 'required', 'value', 'name'],\n  (): Required<EmitsToHookProps<SwitchRootEmits>> => ({\n    onUpdateChecked(checked) {\n      emit('update:checked', checked)\n    },\n  }),\n))\n</script>\n\n<template>\n  <Primitive v-bind=\"normalizeAttrs(switchRoot.attrs([$attrs, { as }]))\">\n    <slot />\n  </Primitive>\n</template>\n","import type { PrimitiveProps } from '../primitive/index.ts'\nimport type { PrimitiveDefaultProps, RadixPrimitiveReturns } from '../shared/index.ts'\nimport { mergePrimitiveAttrs } from '../shared/index.ts'\nimport { useSwitchContext } from './SwitchRoot.ts'\n\nexport interface SwitchThumbProps {\n  as?: PrimitiveProps['as']\n}\n\nexport const DEFAULT_SWITCH_THUMB_PROPS = {\n  as: 'span',\n} satisfies PrimitiveDefaultProps<SwitchThumbProps>\n\nexport function useSwitchThumb(): RadixPrimitiveReturns {\n  const context = useSwitchContext('SwitchThumb')\n\n  return {\n    attrs(extraAttrs) {\n      const attrs = {\n        'data-state': context.checked.value ? 'checked' : 'unchecked',\n      }\n\n      if (extraAttrs && extraAttrs.length > 0) {\n        mergePrimitiveAttrs(attrs, extraAttrs)\n      }\n\n      return attrs\n    },\n  }\n}\n","<script setup lang=\"ts\">\nimport { Primitive } from '../primitive/index.ts'\nimport { normalizeAttrs } from '../shared/index.ts'\nimport { DEFAULT_SWITCH_THUMB_PROPS, type SwitchThumbProps, useSwitchThumb } from './SwitchThumb.ts'\n\ndefineOptions({\n  name: 'SwitchThumb',\n  inheritAttrs: false,\n})\n\nwithDefaults(defineProps<SwitchThumbProps>(), DEFAULT_SWITCH_THUMB_PROPS)\n\nconst context = useSwitchThumb()\n</script>\n\n<template>\n  <Primitive v-bind=\"normalizeAttrs(context.attrs([$attrs, { as }]))\">\n    <slot />\n  </Primitive>\n</template>\n"],"names":["value"],"mappings":"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"}