커뮤니케이션 플랫폼 · 새 리소스

Twilio Paste 디자인 시스템.

Paste의 테마 및 버튼 규칙과 검증된 간격 체계를 적용해 알림 초안을 작성하고, 메시지 편집·검토·실제 전송을 명확히 구분하세요.

OpenDesign 가이드9개 챕터참조 항목 40개독자적 적용 가이드
01

Twilio Paste 디자인 시스템 인터페이스 미리보기

콘텐츠를 편집하고 휴대폰 미리보기를 확인한 다음 별도의 로컬 스냅샷을 준비하세요.

알림 초안 작성 도구전체 예시 열기
업스트림 Paste 크기 조정 및 버튼 상태 규칙을 오프라인으로 해석한 HTML입니다. 기본 런타임이나 메시징 서비스가 아닙니다. · 구현 레퍼런스
02

Twilio Paste 디자인 시스템 디자인 레퍼런스

업스트림 twilio-labs/Paste 소스를 확인했습니다. 아래 값은 YAML 토큰 이름과 JavaScript 방식의 이름을 구분합니다. 이 레퍼런스는 독립적인 Paste DSys 포크를 Twilio 문서로 소개하지 않습니다.

간격 별칭

출처
이름 / 규칙값 / 구성용도
space100.125rem16px 루트 기준 2px.
space200.25rem16px 루트 기준 4px.
space300.5rem필드 사이 간격 8px.
space400.75rem컨트롤 안쪽 여백 12px.
space501rem근접 요소 그룹 간격 16px.
space601.25rem20px.
space701.5rem섹션 간격 24px.
space902rem큰 그룹 간격 32px.
space1303rem더 큰 영역 간격 48px.

글꼴 크기 별칭

출처
이름 / 규칙값 / 구성용도
fontSize200.75rem기본 루트 크기에서 12px.
fontSize300.875rem본문 크기 옵션 14px.
fontSize401rem본문 크기 옵션 16px.
fontSize601.25rem제목 크기 옵션 20px.
fontSize701.5rem제목 크기 옵션 24px.
fontSize902rem디스플레이 크기 옵션 32px.

줄 높이

출처
이름 / 규칙값 / 구성용도
lineHeight20 / lineHeight301.25rem작은 텍스트용 20px.
lineHeight401.5rem16px 텍스트용 24px.
lineHeight601.75rem20px 텍스트용 28px.
lineHeight702rem24px 텍스트용 32px.

모서리 반경

출처
이름 / 규칙값 / 구성용도
borderRadius102px가장 작은 모서리 반경.
borderRadius204px작은 컨트롤 반경.
borderRadius308px작은 크기와 중간 크기 사이의 반경.
borderRadius4012px중간 반경입니다.
borderRadiusCircle50%원형으로 만들려면 너비와 높이가 같아야 합니다.
borderRadiusPill100px원형과 구별되는 알약형 반경.

텍스트 역할과 조합

출처
이름 / 규칙값 / 구성용도
colorTextpalette-gray-100기본 본문 텍스트입니다. 연결된 팔레트에서는 #121c2d로 표시됩니다.
colorTextWeakpalette-gray-60보조 텍스트입니다. #606b85로 표시됩니다.
colorTextLinkpalette-blue-60링크입니다. #0263e0으로 표시됩니다.
colorTextErrorpalette-red-60오류 텍스트입니다. #db132a로 표시됩니다.
colorTextSuccesspalette-green-70성공 텍스트입니다. #0e7c3a로 표시됩니다.
colorTextWeakerpalette-gray-40소스에서는 일반 활성 텍스트로 사용하지 말라고 경고합니다.

버튼 동작

출처
이름 / 규칙값 / 구성용도
variantprimary / secondary / destructive / link and other explicit variants예시에서는 기본 제출 버튼과 보조 토글 버튼을 사용합니다.
typebutton by default폼 제출을 위해 submit을 명시적으로 설정하세요.
pressedSecondary family only테마 토글에는 보조 버튼을 사용하세요.
loadingaria-busy and disabled control behavior실제로 대기 중인 작업에만 사용하세요.
as="a"Requires href탐색 링크는 비활성화 또는 로딩 상태의 버튼을 지원하지 않습니다.
tabIndex0 or -1양수 탭 인덱스는 허용되지 않습니다.

테마 이름

출처
이름 / 규칙값 / 구성용도
default / darkTheme variants테마는 명시적으로 선택합니다.
twilio / twilio-darkSeparate variants모든 변형이 기본값과 같다고 설명하지 마세요.
sendgrid / evergreenAdditional variants브랜드 색상을 임의의 장식으로 사용하지 말고 의도에 따라 선택하세요.
03

Twilio Paste 디자인 시스템 전체 가이드

실제 인터페이스를 위해 이 시스템을 선택하고 적용하고 검토하는 실용 가이드.

DESIGN-twilio-paste.md

완전한 안내와 구현 시작점, 소스 링크.

가이드 다운로드

Twilio Paste 디자인 시스템: 문서화 포크와 혼동하지 않고 업스트림 시스템 사용하기

Twilio 소스와 독립적인 후속 프로젝트

Paste는 twilio-labs 저장소에서 공개됩니다. 확인 과정에서 기존 paste.twilio.design 문서 경로는 해당 저장소로 리디렉션되었습니다. 별도로 호스팅되는 Paste DSys 사이트는 Twilio와 관계없는 독립 포크라고 설명합니다. 따라서 이 가이드의 토큰 값과 컴포넌트 동작은 업스트림 소스 파일을 기준으로 합니다.

이 OpenDesign 가이드에서

알림 작성 도구는 정적인 버튼 모음으로는 담아낼 수 없는 여러 상태를 보여 주는 유용한 예시입니다. 편집 가능한 콘텐츠, 검토 확인, 준비된 스냅샷, 전송 전에 명확히 구분된 경계가 이에 해당합니다. 이 미리보기에서는 Twilio API를 호출하지 않습니다.

지원 사양 읽기

Twilio Paste 디자인 시스템: 접미사를 선택하기 전에 간격 척도 확인하기

토큰 숫자는 이름이지 픽셀 값이 아닙니다

space30은 0.5rem이고 space70은 1.5rem입니다. 30과 70은 척도에서의 위치를 나타내는 접미사이지 30px와 70px를 뜻하지 않습니다. 루트 크기가 16px일 때 작성 도구는 레이블과 필드 사이에 8px, 컨트롤 내부에 12px, 영역 사이에 24px를 사용할 수 있습니다.

YAML 소스에서는 하이픈이 포함된 이름을 사용합니다. 레퍼런스 표에는 Paste 사용자가 쓰는 JavaScript 방식의 이름과 해당 이름에 대응하는 해석값이 함께 표시되어 있습니다. rem 단위 값은 루트 글꼴 크기에 따라 달라지므로, 이에 대응하는 픽셀 값을 브라우저에서 항상 동일하게 측정되는 값으로 간주해서는 안 됩니다.

지원 사양 읽기

Twilio Paste 디자인 시스템: 글꼴 크기와 별도의 줄 높이 토큰 조합하기

척도에서 글꼴 크기와 줄 높이가 같은 숫자라고 볼 수 없습니다

글꼴 크기와 줄 높이 별칭은 서로 별개입니다. fontSize30은 기본 루트에서 14px이고 lineHeight30은 20px입니다. fontSize70은 24px이며 줄 높이 옵션은 32px입니다. 이러한 조합은 레이블과 여러 줄 콘텐츠를 읽기 쉽게 하면서 모든 섹션이 커다란 마케팅용 제목처럼 보이지 않도록 합니다.

내장된 예시에서는 시스템 산세리프 글꼴 스택과 애플리케이션 자체의 휴대폰 일러스트를 사용합니다. 두 요소 모두 설명을 위한 예시입니다. 독점 글꼴 파일은 재배포하지 않으며, 휴대폰 프레임 크기를 Paste 토큰으로 제시하지 않습니다.

지원 사양 읽기

Twilio Paste 디자인 시스템: 의미에 따른 텍스트 역할에는 대비 제약이 있습니다

흐린 텍스트와 비활성화된 텍스트는 다릅니다

업스트림 색상 소스에는 역할별 대비 조합이 기록되어 있습니다. 기본 텍스트, 보조 텍스트, 오류 메시지, 성공 메시지는 각각 의도된 전경색 역할이 다릅니다. 약한 텍스트 역할에는 일반 활성 컨트롤에 사용하지 말라는 경고가 있습니다. 흐린 글자 수 표시라고 해서 사용 가능한 회색 중 가장 옅은 색을 적용해서는 안 됩니다.

예시에서는 파란색으로 동작을 강조하고 어두운 중성 텍스트로 메시지를 전달합니다. 사용자가 버튼을 눌렀다고 준비된 초안이 녹색으로 바뀌지는 않습니다. 상태 메시지는 로컬 스냅샷이 생성되었음을 설명합니다. 예시의 값은 연결된 팔레트에 따른 것이며, 다른 테마 변형에서는 다르게 표시될 수 있습니다.

지원 사양 읽기

Twilio Paste 디자인 시스템: 테마 선택은 명시적인 상태 변경입니다

제공 업체 변형과 애플리케이션 배경

Theme은 Provider와 Consumer, 명명된 테마 객체와 유틸리티를 내보냅니다. 현재 변형 상수에는 default, dark, twilio, twilio-dark, sendgrid, evergreen이 포함됩니다. 이 예제는 의도적으로 default와 dark 사이에서만 전환합니다.

애플리케이션에서 관리하는 기본 컨트롤은 Provider가 변경될 때 이에 맞는 표면 스타일이 필요합니다. Provider는 Paste 컴포넌트에 테마를 적용할 수 있지만, 모든 외부 위젯의 스타일을 자동으로 바꾸지는 않습니다. 제공된 코드는 주변의 전경색과 배경색을 명시적으로 설정하고, textarea가 애플리케이션에서 관리하는 컨트롤임을 밝힙니다.

지원 사양 읽기

Twilio Paste 디자인 시스템 지원되는 버튼 계열에만 눌림 상태 사용

동작, 탐색, 대기 중인 작업은 각각 다른 계약을 따릅니다

Button 구현은 특정 prop 조합의 유효성을 검사합니다. 테마 전환에는 pressed와 함께 secondary를 사용합니다. 컴포넌트의 기본 type이 button이므로 폼 동작에는 type="submit"을 지정합니다. 앵커 형태의 버튼에는 href가 필요하며, 비활성화된 동작이나 로딩 중인 동작으로 취급할 수 없습니다.

  • 초안을 준비할 때는 primary를, 별도로 동작하는 테마 전환에는 secondary를 사용합니다.
  • 탐색에는 링크를 사용하고, 이에 대응하는 앵커 형태가 아닌 버튼에 href를 추가하지 마세요.
  • 실제로 작업이 대기 중일 때만 loading을 사용하세요. 이 상태는 로딩 중 동작과 비활성화 동작을 모두 바꿉니다.
  • 양수 tabIndex는 피하세요. 구현에서 지원하는 값은 0과 -1뿐입니다.

지원 사양 읽기

Twilio Paste 디자인 시스템 편집 가능한 문구와 검토 완료된 스냅샷 분리

실제 동작에 충실한 흐름

실시간 미리보기에는 현재 textarea 값이 반영됩니다. 준비된 문구는 별도로 저장하며, 유효성 검사를 마친 뒤에만 변경됩니다. 다시 편집하더라도 이전에 준비한 스냅샷이 조용히 덮어써져서는 안 됩니다. 검토 확인란은 로컬에서 동작을 보여 주기 위한 것이며, 수신자의 동의나 법적 준수를 입증하지 않습니다.

  1. 라벨이 있는 textarea에 내용을 작성합니다.
  2. 현재 메시지를 검토하고 로컬 검토 확인란을 선택합니다.
  3. 메시징 서비스를 호출하지 않고 스냅샷을 준비합니다.
  4. 다시 편집한 뒤 새 스냅샷을 준비하기 전에 초안과 준비된 문구를 비교합니다.

지원 사양 읽기

Twilio Paste 디자인 시스템 휴대폰 모형을 해석하지 않아도 이해할 수 있는 피드백 제공

일러스트 외부에 라벨과 텍스트 피드백 표시

textarea에는 눈에 보이는 라벨이 있으며, 글자 수 및 오류 설명과 연결되어 있습니다. 글자 수는 유니코드 코드 포인트를 기준으로 하며, SMS 분할 방식이나 인코딩, 비용을 측정한다고 주장하지 않습니다. 준비된 결과도 예시용 기기 외부에 일반 텍스트로 표시됩니다.

유효성 검사에서 메시지가 비어 있거나 검토 확인이 누락된 경우 이를 알려야 합니다. 상태 영역은 메시지가 전달된 것처럼 가장하지 않고 로컬 처리 결과를 알립니다. 좁은 뷰포트에서도 모든 기본 컨트롤과 버튼의 키보드 포커스가 보입니다.

지원 사양 읽기

Twilio Paste 디자인 시스템 오프라인 해석과 별도로 패키지 검증

제공된 예제로 확인할 수 있는 내용

설정에는 실제 Paste Theme 및 Button 패키지를 불러오며, 완전한 React 구성을 제공합니다. 기본 폼 컨트롤은 검증되지 않은 컴포넌트 API의 기능이라고 잘못 설명하지 않고 애플리케이션에서 관리한다고 명시합니다. 포함된 버전은 외부 CDN에 의존하지 않는 오프라인 HTML 해석입니다.

서비스에 사용하기 전에 peer dependencies를 해결하고 기본 예제를 빌드한 다음, 메시지를 전송할 실제 백엔드 경계를 추가하세요. 로컬 미리보기 테스트가 성공해도 편집기 동작만 확인된 것이며, 프로덕션 메시징 연동이나 Twilio 전송을 입증하는 것은 아닙니다.

지원 사양 읽기

Twilio Paste 디자인 시스템 컴포넌트 예제

완전한 독립형 인터랙티브 예제

문서 전체를 index.html로 저장한 뒤 브라우저에서 여세요. 상위 Paste의 스케일과 버튼 상태 규칙을 오프라인으로 HTML 해석한 예제이며, 기본 런타임이나 메시징 서비스가 아닙니다.

html
<!doctype html><html lang="en"><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Paste notification draft studio</title><style>
*{box-sizing:border-box}body{margin:0;background:#f4f4f6;color:#121c2d;font:14px/20px Arial,sans-serif}header{background:#121c2d;color:white;padding:20px 32px;display:flex;justify-content:space-between;gap:16px}.brand{font-weight:700;letter-spacing:.02em}header small{color:#cacdd8}main{max-width:1000px;padding:32px;margin:auto}h1{font-size:28px;line-height:40px;margin:0 0 8px}h2{font-size:18px;line-height:28px;margin:0 0 16px}.intro{color:#606b85;margin:0 0 32px}.layout{display:grid;grid-template-columns:minmax(0,1fr) 280px;gap:32px}form{background:white;border:1px solid #e1e3ea;border-radius:8px;padding:24px}label{display:block;font-weight:600}textarea{width:100%;font:16px/24px Arial,sans-serif;border:1px solid #8891aa;border-radius:4px;padding:12px;margin-top:8px;resize:vertical;min-height:150px}textarea:focus,button:focus-visible,input:focus-visible{outline:3px solid #0263e0;outline-offset:3px}.count{color:#606b85;font-size:12px;line-height:20px}.review{display:flex;align-items:start;gap:8px;margin-top:24px}.review label{font-weight:400}.review input{width:16px;height:16px;accent-color:#0263e0}button{font:600 14px/20px Arial,sans-serif;cursor:pointer;border:1px solid #0263e0;border-radius:4px;padding:10px 16px;background:#0263e0;color:white}button:hover{background:#043cb5}button.secondary{background:white;color:#0263e0}.error{color:#ad1111;min-height:20px}aside{text-align:center}.phone{margin:auto;background:white;border:8px solid #121c2d;border-radius:32px;min-height:400px;padding:24px 12px;box-shadow:0 12px 32px #121c2d14}.notch{width:72px;height:5px;background:#121c2d;border-radius:8px;margin:0 auto 24px}.sender{font-size:12px;color:#606b85;padding-bottom:16px;border-bottom:1px solid #e1e3ea}.bubble{background:#ebf4ff;border-radius:12px;padding:12px;margin-top:24px;text-align:left;white-space:pre-wrap;overflow-wrap:anywhere;min-height:70px}.caption{font-size:12px;color:#606b85}.prepared{padding:24px;background:#fff;border:1px solid #e1e3ea;border-radius:8px;margin-top:24px}.prepared p{white-space:pre-wrap;overflow-wrap:anywhere}.status{color:#606b85;font-size:12px}.foot{font-size:12px;color:#606b85;margin-top:24px}@media(max-width:650px){header{padding:16px}main{padding:24px 16px}.layout{grid-template-columns:1fr}.phone{max-width:250px;min-height:300px}form{padding:20px}.intro{margin-bottom:24px}}
</style><header><span class="brand">Paste / Message studio</span><small>Local preview</small></header><main><h1>Notification draft</h1><p class="intro">Write the message. Review the copy. Keep a prepared version.</p><div class="layout"><div><form id="composer" novalidate><h2>Compose your message</h2><label for="message">Message</label><textarea id="message" aria-describedby="count error">Your appointment is confirmed for Thursday at 10:00.</textarea><p id="count" class="count"></p><div class="review"><input id="reviewed" type="checkbox"><label for="reviewed">I reviewed this draft</label></div><p id="error" class="error" role="alert"></p><button>Prepare local draft</button></form><section class="prepared"><h2>Prepared copy</h2><p id="snapshot">No draft prepared yet.</p><p class="status" id="status" role="status">Nothing has been sent.</p></section></div><aside><div class="phone" aria-label="Illustrative phone preview"><div class="notch"></div><div class="sender">Sample service · Preview</div><div class="bubble" id="bubble"></div></div><p class="caption">Live preview of the editable message</p></aside></div><p class="foot">HTML interpretation of upstream Paste · Counts Unicode code points, not SMS segments · No messaging connection</p></main><script>
const $=id=>document.getElementById(id);function update(){$('bubble').textContent=$('message').value||'Your message will appear here.';$('count').textContent=Array.from($('message').value).length+' Unicode code points. Not an SMS segment estimate.'}$('message').oninput=()=>{update();$('reviewed').checked=false};$('composer').onsubmit=e=>{e.preventDefault();$('error').textContent='';$('message').removeAttribute('aria-invalid');if(!$('message').value.trim()){$('error').textContent='Write a message before preparing a draft.';$('message').setAttribute('aria-invalid','true');$('message').focus();return}if(!$('reviewed').checked){$('error').textContent='Confirm that you reviewed the message.';$('reviewed').focus();return}$('snapshot').textContent=$('message').value.trim();$('status').textContent='Draft prepared locally. Nothing was sent.'};update();
</script></html>

코드 참조

  • 휴대폰 패널에는 초안 스냅샷이 표시됩니다. SMS는 전송되지 않습니다. 기본 Paste Theme 및 Button 동작은 별도의 React 예제가 필요합니다.

실제 Paste 테마와 버튼 상태를 적용한 로컬 초안

Theme.Provider가 작성기 전체를 감쌉니다. secondary의 pressed 상태는 미리보기 테마를 바꾸고, primary 제출 버튼은 애플리케이션 유효성 검사를 마친 뒤 스냅샷을 준비합니다. 라벨, textarea, 확인란은 기본 애플리케이션 컨트롤임을 명시합니다.

jsx
// npm install @twilio-paste/button @twilio-paste/theme react react-dom
import React, {useState} from 'react';
import {createRoot} from 'react-dom/client';
import {Theme} from '@twilio-paste/theme';
import {Button} from '@twilio-paste/button';
// Native textarea and labels are application-owned; this is not Paste TextArea.
function Composer() {
  const [message,setMessage] = useState('Your appointment is confirmed for Thursday at 10:00.');
  const [snapshot,setSnapshot] = useState('');
  const [error,setError] = useState('');
  const [confirmed,setConfirmed] = useState(false);
  const [mode,setMode] = useState('default');
  const length = Array.from(message).length;
  const background = mode === 'dark' ? '#121c2d' : '#ffffff';
  const foreground = mode === 'dark' ? '#ffffff' : '#121c2d';
  function prepare(event) {
    event.preventDefault();
    if (!message.trim()) return setError('Write a message before preparing a draft.');
    if (!confirmed) return setError('Confirm that you reviewed the message.');
    setError(''); setSnapshot(message.trim());
  }
  return <Theme.Provider theme={mode}>
    <main style={{padding:24,background,color:foreground,maxWidth:760,margin:'auto'}}>
      <h1>Notification draft</h1>
      <Button variant="secondary" pressed={mode==='dark'} onClick={() => setMode(mode==='dark'?'default':'dark')}>Dark preview</Button>
      <form onSubmit={prepare}>
        <label htmlFor="message" style={{display:'block',marginTop:24}}>Message</label>
        <textarea id="message" rows={5} value={message} onChange={e=>{setMessage(e.target.value);setConfirmed(false);}}
          aria-describedby="count error" aria-invalid={!!error}
          style={{width:'100%',padding:12,margin:'8px 0',font:'inherit',borderRadius:4}} />
        <p id="count">{length} Unicode code points. This is not an SMS segment estimate.</p>
        <label><input type="checkbox" checked={confirmed} onChange={e=>setConfirmed(e.target.checked)} /> I reviewed this draft</label>
        <p id="error" role="alert">{error}</p>
        <Button variant="primary" type="submit">Prepare local draft</Button>
      </form>
      <section aria-label="Prepared draft" style={{marginTop:24}}>
        <h2>Prepared copy</h2>
        <p style={{whiteSpace:'pre-wrap'}}>{snapshot || 'No draft prepared yet.'}</p>
        <p role="status">{snapshot ? 'Draft prepared locally. Nothing was sent.' : ''}</p>
      </section>
    </main>
  </Theme.Provider>;
}
createRoot(document.getElementById('root')).render(<Composer />);

코드 참조

  • 이 예제는 기본 컨트롤이 Paste TextArea 컴포넌트라고 의도적으로 주장하지 않습니다.
  • 글자 수 표시는 유니코드 코드 포인트를 셉니다. SMS 분할 수, 인코딩 단위 또는 과금 사용량을 나타내지 않습니다.
  • 기본 패키지 예제는 소스 코드를 확인했으며, 오프라인 HTML 미리보기는 별도로 테스트했습니다.
04

Twilio Paste 디자인 시스템 에이전트 설정

구현 시작점

루트 요소가 포함된 위의 전체 React 항목을 사용하세요. 모듈식 패키지는 기본 Provider와 Button을 제공하므로, 호환되는 peer dependencies를 선택하고 확인된 버전을 애플리케이션 lockfile에 고정하세요.

bash
npm install @twilio-paste/button @twilio-paste/theme react react-dom

프로젝트를 위한 프롬프트

에이전트 프롬프트
Paste Theme.Provider와 Button을 사용해 알림 초안 편집기를 만드세요. secondary pressed 토글 동작, rem 간격, 출처가 확인된 텍스트 역할, 분리된 초안 및 스냅샷 상태를 유지하세요. SMS 분할 수나 전송 결과를 임의로 만들어 내지 마세요.
05

Twilio Paste 디자인 시스템 출처와 범위

상위 Paste를 독립적으로 참조하는 OpenDesign입니다. Paste DSys는 별도의 비제휴 포크입니다. 이 예제에서는 메시지를 전송하지 않습니다.