{"version":3,"file":"collapsible.mjs","sources":["../src/collapsible/CollapsibleRoot.ts","../src/collapsible/CollapsibleContent.ts","../src/collapsible/CollapsibleContent.vue","../src/collapsible/CollapsibleRoot.vue","../src/collapsible/CollapsibleTrigger.ts","../src/collapsible/CollapsibleTrigger.vue"],"sourcesContent":["import type { Ref } from 'vue'\nimport { createContext, useControllableStateV2, useId } from '../hooks/index.ts'\nimport { type EmitsToHookProps, mergePrimitiveAttrs, type PrimitiveDefaultProps, type RadixPrimitiveReturns } from '../shared/index.ts'\n\nexport interface CollapsibleRootProps {\n  defaultOpen?: boolean\n  open?: boolean\n  disabled?: boolean\n}\n\nexport const DEFAULT_COLLAPSIBLE_ROOT_PROPS = {\n  defaultOpen: undefined,\n  open: undefined,\n  disabled: undefined,\n} satisfies PrimitiveDefaultProps<CollapsibleRootProps>\n\nexport type CollapsibleRootEmits = {\n  'update:open': [value: boolean]\n}\n\nexport interface CollapsibleContext {\n  contentId: string\n  disabled: () => boolean | undefined\n  open: Ref<boolean>\n  onOpenToggle: () => void\n}\n\nexport const [provideCollapsibleContext, useCollapsibleContext] = createContext<CollapsibleContext>('Collapsible')\n\nexport interface UseCollapsibleRootProps extends EmitsToHookProps<CollapsibleRootEmits> {\n  open?: () => boolean | undefined\n  defaultOpen?: boolean\n  disabled?: () => boolean | undefined\n}\n\nexport function useCollapsibleRoot(props: UseCollapsibleRootProps): RadixPrimitiveReturns {\n  const {\n    disabled = () => undefined,\n    defaultOpen = false,\n  } = props\n\n  const open = useControllableStateV2(props.open, props.onUpdateOpen, defaultOpen)\n\n  provideCollapsibleContext({\n    contentId: useId(),\n    disabled,\n    open,\n    onOpenToggle() {\n      open.value = !open.value\n    },\n  })\n\n  return {\n    attrs(extraAttrs) {\n      const attrs = {\n        'data-state': open.value ? 'open' : 'closed',\n        'data-disabled': disabled() ? '' : undefined,\n      }\n\n      if (extraAttrs && extraAttrs.length > 0) {\n        mergePrimitiveAttrs(attrs, extraAttrs)\n      }\n\n      return attrs\n    },\n  }\n}\n","import { computed, type CSSProperties, nextTick, onMounted, type Ref, shallowRef } from 'vue'\nimport { usePresence } from '../presence/index.ts'\nimport { mergePrimitiveAttrs, type PrimitiveDefaultProps, type RadixPrimitiveGetAttrs, type RadixPrimitiveReturns } from '../shared/index.ts'\nimport { useCollapsibleContext } from './CollapsibleRoot.ts'\n\nexport interface CollapsibleContentProps {\n  /**\n   * Used to force mounting when more control is needed. Useful when\n   * controlling animation with Vue animation libraries.\n   */\n  forceMount?: boolean\n}\n\nexport const DEFAULT_COLLAPSIBLE_CONTENT_PROPS = {\n  forceMount: undefined,\n} satisfies PrimitiveDefaultProps<CollapsibleContentProps>\n\nexport interface UseCollapsibleContentProps {\n  el?: Ref<HTMLElement | undefined>\n  forceMount?: boolean\n}\n\nexport function useCollapsibleContent(props: UseCollapsibleContentProps): RadixPrimitiveReturns<{\n  isOpen: 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 = useCollapsibleContext('CollapsibleContent')\n\n  let originalStyles: Pick<CSSStyleDeclaration, 'transitionDuration' | 'animationName'>\n\n  const isPresent = props.forceMount\n    ? shallowRef(true)\n    : usePresence(el, context.open, () => {\n      const node = el.value\n      if (!node)\n        return\n\n      const nodeStyle = node.style\n\n      originalStyles = originalStyles || {\n        transitionDuration: nodeStyle.transitionDuration,\n        animationName: nodeStyle.animationName,\n      }\n\n      // block any animations/transitions so the element renders at its full dimensions\n      nodeStyle.transitionDuration = '0s'\n      nodeStyle.animationName = 'none'\n\n      // get width and height from full dimensions\n      const rect = node.getBoundingClientRect()\n      nodeStyle.setProperty('--radix-collapsible-content-height', `${rect.height}px`)\n      nodeStyle.setProperty('--radix-collapsible-content-width', `${rect.width}px`)\n\n      // kick off any animations/transitions that were originally set up if it isn't the initial mount\n      nodeStyle.transitionDuration = originalStyles.transitionDuration\n      nodeStyle.animationName = originalStyles.animationName\n    })\n\n  // when opening we want it to immediately open to retrieve dimensions\n  // when closing we delay `present` to retrieve dimensions before closing\n  const isOpen = computed(() => isPresent.value || context.open.value)\n  const _isOpen = isOpen.value\n\n  const lockAnimationStyles = shallowRef<CSSProperties | undefined>(\n    _isOpen\n      ? { transitionDuration: '0s !important', animationName: 'none !important' }\n      : undefined,\n  )\n\n  onMounted(async () => {\n    if (!_isOpen)\n      return\n\n    const node = el.value\n    if (!node)\n      return\n\n    lockAnimationStyles.value = undefined\n    await nextTick()\n\n    const nodeStyle = node.style\n\n    originalStyles = originalStyles || {\n      transitionDuration: nodeStyle.transitionDuration,\n      animationName: nodeStyle.animationName,\n    }\n\n    // block any animations/transitions so the element renders at its full dimensions\n    nodeStyle.transitionDuration = '0s'\n    nodeStyle.animationName = 'none'\n\n    // get width and height from full dimensions\n    const rect = node.getBoundingClientRect()\n    nodeStyle.setProperty('--radix-collapsible-content-height', `${rect.height}px`)\n    nodeStyle.setProperty('--radix-collapsible-content-width', `${rect.width}px`)\n  })\n\n  return {\n    isOpen,\n    attrs(extraAttrs) {\n      const attrs = {\n        'elRef': setElRef,\n        'id': context.contentId,\n        'data-state': context.open.value ? 'open' : 'closed',\n        'data-disabled': context.disabled() ? '' : undefined,\n        'hidden': !isOpen.value,\n        'style': {\n          '--radix-collapsible-content-height': '0px',\n          '--radix-collapsible-content-width': '0px',\n          ...lockAnimationStyles.value,\n        },\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 CollapsibleContentProps, DEFAULT_COLLAPSIBLE_CONTENT_PROPS, useCollapsibleContent } from './CollapsibleContent.ts'\n\ndefineOptions({\n  name: 'CollapsibleContent',\n  inheritAttrs: false,\n})\n\nconst props = withDefaults(defineProps<CollapsibleContentProps>(), DEFAULT_COLLAPSIBLE_CONTENT_PROPS)\n\nconst collapsibleContent = useCollapsibleContent(convertPropsToHookProps(props))\n</script>\n\n<template>\n  <Primitive v-bind=\"normalizeAttrs(collapsibleContent.attrs([$attrs]))\">\n    <slot v-if=\"collapsibleContent.isOpen.value\" />\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 { type CollapsibleRootEmits, type CollapsibleRootProps, DEFAULT_COLLAPSIBLE_ROOT_PROPS, useCollapsibleRoot } from './CollapsibleRoot.ts'\n\ndefineOptions({\n  name: 'CollapsibleRoot',\n  inheritAttrs: false,\n})\n\nconst props = withDefaults(defineProps<CollapsibleRootProps>(), DEFAULT_COLLAPSIBLE_ROOT_PROPS)\nconst emit = defineEmits<CollapsibleRootEmits>()\n\nconst collapsibleRoot = useCollapsibleRoot(convertPropsToHookProps(\n  props,\n  ['disabled', 'open'],\n  (): Required<EmitsToHookProps<CollapsibleRootEmits>> => ({\n    onUpdateOpen(value) {\n      emit('update:open', value)\n    },\n  }),\n))\n</script>\n\n<template>\n  <Primitive v-bind=\"normalizeAttrs(collapsibleRoot.attrs([$attrs]))\">\n    <slot />\n  </Primitive>\n</template>\n","import type { PrimitiveProps } from '../primitive/index.ts'\nimport type { RadixPrimitiveReturns } from '../shared/index.ts'\nimport { mergePrimitiveAttrs } from '../shared/index.ts'\nimport { useCollapsibleContext } from './CollapsibleRoot.ts'\n\nexport interface CollapsibleTriggerProps {\n  as?: PrimitiveProps['as']\n}\n\nexport function useCollapsibleTrigger(): RadixPrimitiveReturns {\n  const context = useCollapsibleContext('CollapsibleTrigger')\n\n  function onClick(event: MouseEvent) {\n    if (event.defaultPrevented)\n      return\n    context.onOpenToggle()\n  }\n\n  return {\n    attrs(extraAttrs) {\n      const _disabled = context.disabled()\n      const _open = context.open.value\n      const attrs = {\n        'type': 'button',\n        'aria-controls': context.contentId,\n        'aria-expanded': _open,\n        'data-state': _open ? 'open' : 'closed',\n        'data-disabled': _disabled ? '' : undefined,\n        'disabled': _disabled,\n        'onClick': 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 { Primitive } from '../primitive/index.ts'\nimport { normalizeAttrs } from '../shared/index.ts'\nimport { type CollapsibleTriggerProps, useCollapsibleTrigger } from './CollapsibleTrigger.ts'\n\ndefineOptions({\n  name: 'CollapsibleTrigger',\n  inheritAttrs: false,\n})\n\nwithDefaults(defineProps<CollapsibleTriggerProps>(), {\n  as: 'button',\n})\nconst collapsibleTrigger = useCollapsibleTrigger()\n</script>\n\n<template>\n  <Primitive v-bind=\"normalizeAttrs(collapsibleTrigger.attrs([$attrs, { as }]))\">\n    <slot />\n  </Primitive>\n</template>\n"],"names":[],"mappings":"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"}