{"version":3,"file":"checkbox.mjs","sources":["../src/checkbox/utils.ts","../src/checkbox/CheckboxRoot.ts","../src/checkbox/CheckboxBubbleInput.vue","../src/checkbox/CheckboxIndicator.ts","../src/checkbox/CheckboxIndicator.vue","../src/checkbox/CheckboxRoot.vue"],"sourcesContent":["import type { CheckedState } from './CheckboxRoot.ts'\n\nexport function isIndeterminate(checked?: CheckedState): checked is 'indeterminate' {\n  return checked === 'indeterminate'\n}\n\nexport function getState(checked: CheckedState) {\n  return isIndeterminate(checked) ? 'indeterminate' : checked ? 'checked' : 'unchecked'\n}\n","import type { PrimitiveProps } from '../primitive/index.ts'\nimport type { EmitsToHookProps, PrimitiveDefaultProps, PrimitiveElAttrs, RadixPrimitiveReturns } from '../shared/index.ts'\nimport { onWatcherCleanup, type Ref, shallowRef, watchEffect } from 'vue'\nimport { createContext, type MutableRefObject, useControllableStateV2, useRef } from '../hooks/index.ts'\nimport { mergePrimitiveAttrs } from '../shared/index.ts'\nimport { getState, isIndeterminate } from './utils.ts'\n\nexport interface CheckboxRootProps {\n  as?: PrimitiveProps['as']\n  checked?: CheckedState\n  defaultChecked?: CheckedState\n  disabled?: boolean\n  required?: boolean\n  value?: string\n  name?: string\n}\n\nexport const DEFAULT_CHECKBOX_ROOT_PROPS = {\n  as: 'button',\n  value: 'on',\n  checked: undefined,\n  defaultChecked: undefined,\n  disabled: undefined,\n  required: undefined,\n} satisfies PrimitiveDefaultProps<CheckboxRootProps>\n\nexport type CheckboxRootEmits = {\n  'update:checked': [value: CheckedState]\n}\n\nexport type CheckedState = boolean | 'indeterminate'\n\nexport interface CheckboxContext {\n  checked: Ref<CheckedState>\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<CheckedState>\n    defaultChecked: boolean | undefined\n    required: () => boolean | undefined\n    disabled: () => boolean | undefined\n  }\n}\n\nexport const [provideCheckboxContext, useCheckboxContext] = createContext<CheckboxContext>('Checkbox')\n\nexport interface UseCheckboxRootProps extends EmitsToHookProps<CheckboxRootEmits> {\n  control?: Ref<HTMLButtonElement | undefined>\n  checked?: () => CheckedState | undefined\n  defaultChecked?: CheckedState | undefined\n  disabled?: () => boolean | undefined\n  required?: () => boolean | undefined\n  value?: () => string\n  name?: () => string | undefined\n}\n\nexport function useCheckboxRoot(props: UseCheckboxRootProps): 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  // 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 ?? false)\n\n  const initialCheckedStateRef = checked.value\n\n  watchEffect(() => {\n    const form = control.value?.form\n    if (!form)\n      return\n\n    const reset = () => {\n      checked.value = initialCheckedStateRef\n    }\n\n    form.addEventListener('reset', reset)\n\n    onWatcherCleanup(() => {\n      form.removeEventListener('reset', reset)\n    })\n  })\n\n  function onKeydown(event: KeyboardEvent) {\n    if (event.defaultPrevented)\n      return\n    // According to WAI ARIA, Checkboxes don't activate on enter keypress\n    if (event.key === 'Enter')\n      event.preventDefault()\n  }\n\n  function onClick(event: MouseEvent) {\n    if (event.defaultPrevented)\n      return\n    checked.value = isIndeterminate(checked.value) ? true : !checked.value\n\n    if (!isFormControl.value)\n      return\n\n    bubbles.value = !event.cancelBubble\n  }\n\n  provideCheckboxContext({\n    disabled,\n    checked,\n    bubbleInput: {\n      control,\n      bubbles,\n      isFormControl,\n      name,\n      value,\n      checked,\n      defaultChecked: isIndeterminate(props.defaultChecked) ? false : props.defaultChecked,\n      required,\n      disabled,\n    },\n  })\n\n  return {\n    attrs(extraAttrs) {\n      const _disabled = disabled()\n      const attrs: PrimitiveElAttrs = {\n        'elRef': setElRef,\n        'type': 'button',\n        'role': 'checkbox',\n        'aria-checked': isIndeterminate(checked.value) ? 'mixed' : checked.value,\n        'aria-required': required(),\n        'data-state': getState(checked.value),\n        'data-disabled': _disabled ? '' : undefined,\n        'disabled': _disabled,\n        'value': value(),\n        onKeydown,\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 { useCheckboxContext } from './CheckboxRoot.ts'\nimport { isIndeterminate } from './utils.ts'\n\ndefineOptions({\n  name: 'CheckboxBubbleInput',\n})\n\nconst bubbleInput = useCheckboxContext('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    input.indeterminate = isIndeterminate(checked)\n    setChecked.call(input, isIndeterminate(checked) ? false : 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    :name=\"bubbleInput.name()\"\n    :value=\"bubbleInput.value()\"\n    :required=\"bubbleInput.required()\"\n    tabindex=\"-1\"\n    :checked=\"isIndeterminate(bubbleInput.checked.value) ? false : bubbleInput.defaultChecked\"\n    :style=\"{\n      position: 'absolute',\n      pointerEvents: 'none',\n      opacity: 0,\n      margin: 0,\n    }\"\n  >\n</template>\n","import type { PrimitiveProps } from '../primitive/index.ts'\nimport type { PrimitiveDefaultProps, PrimitiveElAttrs, RadixPrimitiveGetAttrs, RadixPrimitiveReturns } from '../shared/index.ts'\nimport { type Ref, shallowRef } from 'vue'\nimport { usePresence } from '../presence/index.ts'\nimport { mergePrimitiveAttrs } from '../shared/index.ts'\nimport { useCheckboxContext } from './CheckboxRoot.ts'\nimport { getState, isIndeterminate } from './utils.ts'\n\nexport interface CheckboxIndicatorProps {\n  as?: PrimitiveProps['as']\n  /**\n   * Used to force mounting when more control is needed. Useful when\n   * controlling animation with React animation libraries.\n   */\n  forceMount?: boolean\n}\n\nexport const DEFAULT_CHECKBOX_INDICATOR_PROPS = {\n  as: 'span',\n  forceMount: undefined,\n} satisfies PrimitiveDefaultProps<CheckboxIndicatorProps>\n\nexport interface UseCheckboxIndicatorProps {\n  el?: Ref<HTMLElement | undefined>\n  forceMount?: boolean\n}\n\nexport function useCheckboxIndicator(props: UseCheckboxIndicatorProps): RadixPrimitiveReturns<{\n  isPresent: Ref<boolean>\n  attrs: RadixPrimitiveGetAttrs\n}> {\n  const el = props.el || shallowRef<HTMLElement>()\n  const setElRef = props.el ? undefined : (value: HTMLElement | undefined) => el.value = value\n\n  const context = useCheckboxContext('CheckboxIndicator')\n\n  const isPresent = props.forceMount ? shallowRef(true) : usePresence(el, () => isIndeterminate(context.checked.value) || context.checked.value === true)\n\n  const style = {\n    pointerEvents: 'none',\n  } as const\n\n  return {\n    isPresent,\n    attrs(extraAttrs) {\n      const attrs: PrimitiveElAttrs = {\n        'elRef': setElRef,\n        'data-state': getState(context.checked.value),\n        'data-disabled': context.disabled() ? '' : undefined,\n        'style': style,\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 { convertPropsToHookProps, normalizeAttrs } from '../shared/index.ts'\nimport { type CheckboxIndicatorProps, DEFAULT_CHECKBOX_INDICATOR_PROPS, useCheckboxIndicator } from './CheckboxIndicator.ts'\n\ndefineOptions({\n  name: 'CheckboxIndicator',\n  inheritAttrs: false,\n})\n\nconst props = withDefaults(defineProps<CheckboxIndicatorProps>(), DEFAULT_CHECKBOX_INDICATOR_PROPS)\n\nconst checkboxIndicator = useCheckboxIndicator(convertPropsToHookProps(props))\n</script>\n\n<template>\n  <Primitive\n    v-if=\"checkboxIndicator.isPresent.value\"\n    v-bind=\"normalizeAttrs(checkboxIndicator.attrs([$attrs, { as }]))\"\n  >\n    <slot />\n  </Primitive>\n</template>\n","<script setup lang=\"ts\">\nimport { Primitive } from '../primitive/index.ts'\nimport { convertPropsToHookProps, type EmitsToHookProps, normalizeAttrs } from '../shared/index.ts'\nimport {\n  type CheckboxRootEmits,\n  type CheckboxRootProps,\n  DEFAULT_CHECKBOX_ROOT_PROPS,\n  useCheckboxRoot,\n} from './CheckboxRoot.ts'\n\ndefineOptions({\n  name: 'Checkbox',\n  inheritAttrs: false,\n})\n\nconst props = withDefaults(defineProps<CheckboxRootProps>(), DEFAULT_CHECKBOX_ROOT_PROPS)\n\nconst emit = defineEmits<CheckboxRootEmits>()\n\nconst checkboxRoot = useCheckboxRoot(convertPropsToHookProps(\n  props,\n  ['checked', 'disabled', 'required', 'value', 'name'],\n  (): Required<EmitsToHookProps<CheckboxRootEmits>> => ({\n    onUpdateChecked(checked) {\n      emit('update:checked', checked)\n    },\n  }),\n))\n</script>\n\n<template>\n  <Primitive v-bind=\"normalizeAttrs(checkboxRoot.attrs([$attrs, { as }]))\">\n    <slot />\n  </Primitive>\n</template>\n"],"names":["value"],"mappings":"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"}