Popover
페이지 조작을 유지하며 실행 요소에 상호작용 가능한 내용을 붙입니다.
용법
기준 요소에 연결된
주변 배치가 바뀌어도 팝업을 실행 요소에 붙여 둡니다.
주변 배치가 바뀌어도 팝업을 실행 요소에 붙여 둡니다.
<!-- Popover / Anchored -->
<script setup lang="ts">
import { PopoverRoot, PopoverTrigger, PopoverContent, PopoverArrow, PopoverTitle, PopoverDescription, PopoverClose } from '@sectile/vue/popover'
import { TextField } from '@sectile/vue/text'
</script>
<template>
<PopoverRoot side="bottom" align="center" :close-on-interact-outside="false">
<PopoverTrigger>Edit profile</PopoverTrigger>
<PopoverContent>
<PopoverArrow />
<PopoverTitle>Profile details</PopoverTitle>
<PopoverDescription>Change the public display name.</PopoverDescription>
<label>Display name <TextField default-value="Sectile" /></label>
<PopoverClose>Save changes</PopoverClose>
</PopoverContent>
</PopoverRoot>
</template>외부 상태 관리
현재 값은 부모가 관리하고, 허용된 변경을 컴포넌트에 다시 전달합니다.
현재 값은 부모가 관리하고, 허용된 변경을 컴포넌트에 다시 전달합니다.
<!-- Popover / Controlled -->
<script setup lang="ts">
import { PopoverRoot, PopoverTrigger, PopoverContent, PopoverArrow, PopoverTitle, PopoverDescription, PopoverClose } from '@sectile/vue/popover'
import { ref } from 'vue'
const open = ref(false)
</script>
<template>
<PopoverRoot v-model:open="open" side="bottom" align="center">
<PopoverTrigger>Edit profile</PopoverTrigger>
<PopoverContent>
<PopoverArrow />
<PopoverTitle>Profile details</PopoverTitle>
<PopoverDescription>Change the public display name.</PopoverDescription>
<PopoverClose>Save changes</PopoverClose>
</PopoverContent>
</PopoverRoot>
</template>예시
화면 경계 회피
원하는 위치가 화면을 벗어나면 팝업을 반대편으로 옮기거나 안쪽으로 밀어 넣습니다.
원하는 위치가 화면을 벗어나면 팝업을 반대편으로 옮기거나 안쪽으로 밀어 넣습니다.
<!-- Popover / Collision -->
<script setup lang="ts">
import { PopoverRoot, PopoverTrigger, PopoverContent, PopoverArrow, PopoverTitle, PopoverDescription, PopoverClose } from '@sectile/vue/popover'
</script>
<template>
<PopoverRoot
side="right"
align="center"
:collision-padding="16"
:avoid-collisions="true"
:close-on-interact-outside="false"
>
<PopoverTrigger>Edit profile</PopoverTrigger>
<PopoverContent>
<PopoverArrow />
<PopoverTitle>Profile details</PopoverTitle>
<PopoverDescription>Flip or shift when space runs out.</PopoverDescription>
<PopoverClose>Done</PopoverClose>
</PopoverContent>
</PopoverRoot>
</template>외부 조작
closeOnInteractOutside로 콘텐츠 밖의 포인터 조작이 컴포넌트를 닫을지 정합니다. interactOutsideExclusions에 넣은 요소는 모달에서도 계속 조작할 수 있으며 외부 조작 판정에서 제외됩니다. 조건부로 유지하려면 interact-outside 이벤트에서 preventDefault()를 호출합니다.
<PopoverRoot
:interact-outside-exclusions="[ignoredElement]"
@interact-outside="(event) => {
if (event.isInside(temporarilyIgnoredElement)) event.preventDefault()
}"
/>Floating 위치
이 컴포넌트는 공통 위치 엔진을 사용합니다. 실시간 위치 예시에서 side, align, 간격, 충돌 경계, strategy, tracking을 바꾸며 계산 결과를 확인할 수 있습니다.
API
Vue 패키지: @sectile/vue/popover
PopoverRootPopoverTriggerPopoverAnchorPopoverPortalPopoverContentPopoverTitlePopoverDescriptionPopoverClosePopoverArrow
Props
PopoverRootProps
align기준 요소를 중심으로 팝업 내용을 정렬할 위치입니다.
arrowPadding화살표와 팝업 가장자리 사이에 둘 최소 간격입니다.
autoFocus열릴 때 컴포넌트 안으로 포커스를 옮길지 여부입니다.
avoidCollisions팝업이 화면 안에 남도록 위치를 뒤집거나 이동할지 여부입니다.
closeOnInteractOutside콘텐츠 밖을 조작하면 닫을지 여부입니다.
collisionBoundary팝업을 화면 안에 유지할 때 사용할 경계입니다.
collisionPadding팝업과 충돌 경계 사이에 둘 간격입니다.
defaultOpen컴포넌트가 관리하는 초기 열림 상태입니다.
disabled사용자 조작을 막을지 여부입니다.
hideWhenDetached기준 요소가 레이아웃에서 벗어나면 팝업을 숨길지 여부입니다.
initialFocus컴포넌트가 열릴 때 포커스를 받을 요소 또는 요소를 반환하는 함수입니다.
interactOutsideExclusions계속 조작할 수 있는 외부 조작 판정 제외 요소 목록입니다.
label보조 기술이 읽는 컨트롤 이름입니다.
modal열린 콘텐츠가 주변 페이지 조작을 막을지 여부입니다.
open연결된 팝업이나 펼침 영역이 열려 있는지 여부입니다.
position실행 요소를 기준으로 팝업 위치를 계산할지 여부입니다.
restoreFocus열린 콘텐츠를 닫을 때 실행 요소로 포커스를 되돌릴지 여부입니다.
side기준 요소를 중심으로 팝업을 우선 배치할 방향입니다.
sideOffset팝업과 기준 요소 사이 거리입니다.
strategy기준 요소에 연결된 콘텐츠의 CSS 위치 전략입니다.
tracking기준 요소에 연결된 콘텐츠가 열린 동안 위치를 갱신할 방식입니다.
trapFocus열린 콘텐츠 안에 키보드 포커스를 유지할지 여부입니다.
unmountOnExit닫힘 모션이 끝난 뒤 presence 관리 콘텐츠를 DOM에서 제거할지 여부입니다.
PopoverPartProps
as이 파트가 렌더링할 요소 또는 컴포넌트입니다.
asChild하나뿐인 자식 요소에 파트 속성을 직접 합칠지 여부입니다.
PopoverPortalProps
deferTeleport 대상을 현재 mount 또는 update tick이 끝날 때 찾을지 여부입니다.
disabled사용자 조작을 막을지 여부입니다.
to포털 콘텐츠를 옮길 대상입니다.
슬롯
PopoverRootSlotProps
disabled사용자 조작을 막을지 여부입니다.
open연결된 팝업이나 펼침 영역이 열려 있는지 여부입니다.
기타 타입
PopoverOpenChangeHandler
type PopoverOpenChangeHandler = PopupFactoryOptions['onOpenChange']PopoverInteractOutsideHandler
type PopoverInteractOutsideHandler = NonNullable<PopupFactoryOptions['onInteractOutside']>파트
공통 범위: [data-scope="popover"]. 컴포넌트 내부로 스타일을 제한할 때 파트 선택자와 함께 사용합니다.
| 파트 | 선택자 | 역할 | 추가 속성 |
|---|---|---|---|
trigger | [data-part="trigger"] | 연결된 콘텐츠를 열고 닫거나 활성화합니다. | — |
anchor | [data-part="anchor"] | 떠 있는 콘텐츠의 배치 기준을 제공합니다. | — |
content | [data-part="content"] | 현재 상태에 맞는 컴포넌트 콘텐츠를 담습니다. | — |
title | [data-part="title"] | 연결된 콘텐츠의 제목을 표시합니다. | — |
description | [data-part="description"] | 연결된 콘텐츠나 결정 내용을 설명합니다. | — |
close | [data-part="close"] | 현재 화면을 닫거나 해제합니다. | — |
arrow | [data-part="arrow"] | 떠 있는 콘텐츠와 기준점을 시각적으로 연결합니다. | — |
키보드 동작
| 키 | 동작 |
|---|---|
| Enter / Space | 실행 요소나 포커스된 작업을 실행합니다. |
| Tab / Shift+Tab | 사용 가능한 컨트롤 사이를 이동하며 모달 내용은 포커스를 내부에 유지합니다. |
| Escape | 팝업을 닫고 설정된 경우 포커스를 복원합니다. |
접근성
실행 요소가 열림 상태와 팝업 연결을 노출하고 선택적인 제목과 설명이 떠 있는 내용의 이름을 제공합니다.
관련 WAI-ARIA 패턴에서 호스트 접근성 규칙을 확인할 수 있습니다.
