SystemMessage

Data Display

대화 흐름 중간에 넣는 저채도 시스템 안내.

Usage

메시지 사이에 구분·이벤트 같은 시스템 안내를 넣을 때 사용한다.

import

import

import { SystemMessage } from '@mildang/design-system/unofficial/Chat';

SystemMessage 하나만 가져오면 SystemMessage.Content · SystemMessage.Parts 를 그 아래에서 쓸 수 있다.

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

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

Anatomy

tsx

import { SystemMessage } from '@mildang/design-system/unofficial/Chat';

export default function Example() {
  return (
    <SystemMessage.Content>
      <SystemMessage.Parts />
    </SystemMessage.Content>
  );
}

부품

필수 여부

반복

위치

SystemMessage.Content

필수

SystemMessage 안에 둔다.

SystemMessage.Parts

선택

SystemMessage.Content 안에 둔다(런타임 연결 시에만 필요).

  • Thread.Messages 의 SystemMessage 슬롯에 연결할 때는 Content 안에 Parts 를 둔다.
  • 직접 배치할 때는 Content 의 children 에 텍스트를 넣고 Parts 는 생략한다.

API Reference

SystemMessage Props

Prop

Type

Default

appearance

"pill" | "plain"

pill

SystemMessage.Content

appearance variant 를 입는 pill·텍스트 슬롯이다.

공개 Props 없음

SystemMessage.Parts

system-role 메시지 텍스트를 렌더한다.

Prop

Type

Default

children

(value: { part: EnrichedPartState; }) => ReactNode

지정 안 함

components

({ Empty?: EmptyMessagePartComponent | undefined; Text?: TextMessagePartComponent | undefined; Source?: SourceMessagePartComponent | undefined; Image?: ImageMessagePartComponent | undefined; File?: FileMessagePartComponent | undefined; Unstable_Audio?: Unstable_AudioMessagePartComponent | undefined; data?: { by_name?: Record<string, DataMessagePartComponent | undefined> | undefined; Fallback?: DataMessagePartComponent | undefined; } | undefined; Quote?: QuoteMessagePartComponent | undefined; generativeUI?: { components: GenerativeUIComponentRegistry; Fallback?: ComponentType<{ component: string; props?: unknown; }> | undefined; } | undefined; } & { Reasoning?: ReasoningMessagePartComponent | undefined; tools?: ({ by_name?: Record<string, ToolCallMessagePartComponent | undefined> | undefined; Fallback?: ComponentType<ToolCallMessagePartProps> | undefined; } | { Override: ComponentType<ToolCallMessagePartProps>; }) | undefined; ToolGroup?: ComponentType<PropsWithChildren<{ startIndex: number; endIndex: number; }>>; ReasoningGroup?: ReasoningGroupComponent; ChainOfThought?: never; }) | ({ Empty?: EmptyMessagePartComponent | undefined; Text?: TextMessagePartComponent | undefined; Source?: SourceMessagePartComponent | undefined; Image?: ImageMessagePartComponent | undefined; File?: FileMessagePartComponent | undefined; Unstable_Audio?: Unstable_AudioMessagePartComponent | undefined; data?: { by_name?: Record<string, DataMessagePartComponent | undefined> | undefined; Fallback?: DataMessagePartComponent | undefined; } | undefined; Quote?: QuoteMessagePartComponent | undefined; generativeUI?: { components: GenerativeUIComponentRegistry; Fallback?: ComponentType<{ component: string; props?: unknown; }> | undefined; } | undefined; } & { ChainOfThought: ComponentType; Reasoning?: never; tools?: never; ToolGroup?: never; ReasoningGroup?: never; })

지정 안 함

unstable_showEmptyOnNonTextEnd

boolean

true

같은 패밀리

@mildang/design-system/unofficial/Chat 에서 같이 내보내는 컴포넌트다.

예제

Pill

기본 형태 — 저채도 pill 배경에 텍스트를 담습니다.

import { SystemMessage } from '@mildang/design-system/unofficial/Chat';
import { css } from '@mildang/styled-system/css';

const stack = css({ display: 'flex', flexDirection: 'column', gap: '16' });

const SystemMessagePillExample = () => (
    <div className={stack}>
      <SystemMessage>
        <SystemMessage.Content>새 대화가 시작되었어요</SystemMessage.Content>
      </SystemMessage>
      <SystemMessage>
        <SystemMessage.Content>오후 3:24 · 밀당 선생님이 참여했어요</SystemMessage.Content>
      </SystemMessage>
    </div>
  );

export default SystemMessagePillExample;

Plain

배경 pill 없이 텍스트만 표시합니다.

import { SystemMessage } from '@mildang/design-system/unofficial/Chat';
import { css } from '@mildang/styled-system/css';

const stack = css({ display: 'flex', flexDirection: 'column', gap: '16' });

const SystemMessagePlainExample = () => (
    <div className={stack}>
      <SystemMessage appearance="plain">
        <SystemMessage.Content>2026년 8월 5일</SystemMessage.Content>
      </SystemMessage>
      <SystemMessage appearance="plain">
        <SystemMessage.Content>여기부터 읽지 않은 메시지</SystemMessage.Content>
      </SystemMessage>
    </div>
  );

export default SystemMessagePlainExample;

대화 흐름 안에서

위아래 메시지 사이에 삽입된 중앙 정렬 모습입니다.

import { css } from '@mildang/styled-system/css';
import { SystemMessage } from '@mildang/design-system/unofficial/Chat';

const SystemMessageInFlowExample = () => (
    <div className={css({ display: 'flex', flexDirection: 'column', gap: '8', maxWidth: 'chat.thread.maxWidth' })}>
      <div className={css({ alignSelf: 'flex-end', textStyle: 'chat-body', backgroundColor: 'neutral.ghostBg.base', borderRadius: '16', paddingX: '12', paddingY: '6' })}>
        안녕하세요!
      </div>
      <SystemMessage>
        <SystemMessage.Content>2026년 8월 5일</SystemMessage.Content>
      </SystemMessage>
      <div className={css({ alignSelf: 'flex-start', textStyle: 'chat-body', color: 'primary.text.base' })}>
        무엇을 도와드릴까요?
      </div>
    </div>
  );

export default SystemMessageInFlowExample;