ResponsivePopover

Feedback & Status

화면 크기에 따라 Popover나 Dialog로 여는 반응형 오버레이.

Usage

같은 짧은 작업을 데스크톱에서는 Popover, 모바일에서는 Dialog로 제공할 때 사용한다.

import

import

import { ResponsivePopover } from '@mildang/design-system/ResponsivePopover';

예제를 복사해 쓸 때 필요한 준비

@mildang/styled-system 은 이 저장소에서 Panda 가 생성하는 산출물이다. 저장소 안에서는 turbo run ship 이후 쓸 수 있고, 패키지 소비자는 자기 Panda 산출물이나 다른 레이아웃 수단으로 바꿔야 한다.

API Reference

ResponsivePopover Props

Prop

Type

Default

children
필수

ReactNode

지정 안 함

breakpoint

"xs" | "sm" | "md" | "lg" | "xl"

md

defaultOpen

boolean

지정 안 함

dialogSize

"xs" | "sm" | "md" | "lg" | "xl" | "full"

sm

modal

boolean

false

onOpenChange

(open: boolean) => void

지정 안 함

open

boolean

지정 안 함

예제

기본 사용

데스크탑은 Popover, 모바일은 Dialog 로 자동 전환되는 compound 컴포넌트다. DatePicker 처럼 화면 크기별로 위치 제약이 다른 곳에 쓴다.

 'use client';

import { useState } from 'react';
import { Button } from '@mildang/design-system/Button';
import { ResponsivePopover } from '@mildang/design-system/ResponsivePopover';
import { css } from '@mildang/styled-system/css';

const contentCard = css({ backgroundColor: 'neutral.surface.low', borderRadius: '16', overflow: 'hidden', width: '320px' });
const bodyStyle = css({ p: '24', minHeight: '120px' });
const footerStyle = css({ display: 'flex', justifyContent: 'flex-end', gap: '8', px: '24', py: '16' });

export default function ResponsivePopoverExample() {
  const [open, setOpen] = useState(false);
  return (
    <div style={{ padding: 24 }}>
      <ResponsivePopover open={open} onOpenChange={setOpen}>
      <ResponsivePopover.Trigger asChild>
        <Button variant="primary" size="lg">열기</Button>
      </ResponsivePopover.Trigger>
      <ResponsivePopover.Content aria-label="예시 팝업" className={contentCard}>
        <ResponsivePopover.Body className={bodyStyle}>
          <p style={{ marginTop: 0 }}>여기에 원하는 컨텐츠를 넣어 사용합니다.</p>
          <p style={{ marginBottom: 0, fontSize: 12, color: '#888' }}>
            뷰포트 너비를 바꿔보세요 (≥ 960px = Popover, &lt; 960px = Dialog)
          </p>
        </ResponsivePopover.Body>
        <ResponsivePopover.Footer className={footerStyle}>
          <Button variant="quaternary" size="lg" onClick={() => setOpen(false)}>취소</Button>
          <Button variant="primary" size="lg" onClick={() => setOpen(false)}>확인</Button>
        </ResponsivePopover.Footer>
      </ResponsivePopover.Content>
      </ResponsivePopover>
    </div>
  );
}