엔터프라이즈 컴포넌트 시스템 · 새 리소스

React Suite 디자인 시스템.

기본 React Suite 검토 캘린더입니다. 검증된 v6 CSS 변수, 날짜 셀 표시, 선택한 날짜의 일정, 모달 유효성 검사 및 명시적인 로컬 일정 관리 규칙을 포함합니다.

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

React Suite 디자인 시스템 인터페이스 미리보기

날짜를 선택해 로컬 일정을 확인하고, 모달에서 일정을 추가하거나 삭제하세요. 주말에는 일정을 추가할 수 없습니다.

팀 검토 캘린더전체 예시 열기
네이티브 React Suite 6.2.4 Calendar, Panel, Modal, Input, Message, Button, Tag. · 구현 레퍼런스
02

React Suite 디자인 시스템 디자인 참조

React Suite 6.2.4 컴파일된 스타일시트이며, 현재 v6 CSS 변수 문서를 기준으로 확인했습니다. 아래 값은 최초 정의 또는 기본 정의이며, 시맨틱 별칭은 다른 제공자 테마에서 다르게 해석될 수 있습니다. 캘린더의 독자적인 레이아웃 규칙은 별도로 표시했습니다.

타이포그래피

출처
이름 / 규칙값 / 구성용도
--rs-font-family-base-apple-system, BlinkMacSystemFont, Arial, Helvetica, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", STXihei, sans-serifCJK 글꼴 대체 항목을 포함한 시스템 글꼴 스택.
--rs-html-font-size16px루트 크기.
--rs-font-size-sm0.875rem루트 크기 16px 기준 14px, 기본 본문 크기.
--rs-font-size-md1rem기본 루트 크기에서 16px.
--rs-font-size-lg1.125rem기본 루트 크기에서 18px.
--rs-font-size-xl1.25rem기본 루트 크기에서 20px.
--rs-font-size-2xl1.5rem기본 루트 크기에서 24px.
--rs-line-height-mdcalc(20 / 14)기본 본문 비율.

간격 및 모서리 반경

출처
이름 / 규칙값 / 구성용도
--rs-spacing0.25rem기본 간격 단위.
--rs-padding-inline-md12px컴포넌트의 중간 크기 가로 패딩.
--rs-padding-block-md8px컴포넌트의 중간 크기 세로 패딩.
--rs-radius-sm0.25rem기본 루트 크기에서 4px.
--rs-radius-md0.375rem기본 루트 크기에서 6px.
--rs-radius-lg0.5rem기본 루트 크기에서 8px.
--rs-radius-xl0.75rem기본 루트 크기에서 12px.

기본 팔레트

출처
이름 / 규칙값 / 구성용도
--rs-primary-50#F2FAFF 기본 기본 팔레트 50단계.
--rs-primary-100#CCE9FF 기본 기본 팔레트 100단계.
--rs-primary-200#A6D7FF 기본 기본 팔레트 200단계.
--rs-primary-300#80C3FF 기본 기본 팔레트 300단계.
--rs-primary-400#59AFFF 기본 기본 팔레트 400단계.
--rs-primary-500#3498ff 기본 기본 팔레트 500단계.
--rs-primary-600#2589F5 기본 기본 팔레트 600단계.
--rs-primary-700#1675E0 기본 기본 팔레트 700단계.
--rs-primary-800#0A5DC2 기본 기본 팔레트 800단계.
--rs-primary-900#004299 기본 기본 팔레트 900단계.

시맨틱 배경과 상태

출처
이름 / 규칙값 / 구성용도
--rs-bg-cardvar(--rs-gray-0)캘린더 및 일정 배경.
--rs-bg-wellvar(--rs-gray-50)페이지 바깥쪽 배경.
--rs-bg-overlayvar(--rs-gray-0)모달 배경.
--rs-text-primaryvar(--rs-gray-800)일반 본문 텍스트.
--rs-text-secondaryvar(--rs-gray-600)메타데이터 및 도움말.
--rs-text-errorvar(--rs-color-red)유효성 검사 메시지.
--rs-border-primaryvar(--rs-gray-200)일정 구분선 및 패널 경계선.
--rs-btn-primary-bgvar(--rs-primary-500)기본 버튼 배경색.
--rs-btn-primary-textvar(--rs-gray-0)기본 버튼 텍스트.
--rs-state-focus-shadow0 0 0 2px rgb(from var(--rs-primary-500) r g b / 25%)포커스 강조.

캘린더 구성 방식

출처
이름 / 규칙값 / 구성용도
isoWeektrue캘린더 주간은 월요일에 시작합니다.
Initial datenew Date(2026, 9, 14)고정된 10월 예시이며, JavaScript의 월은 0부터 시작합니다.
Layout switch760px기존 단일 열 전환점.
Weekend rulegetDay() is 0 or 6기존 로컬 일정 정책이며 Calendar의 제한 사항은 아닙니다.
03

React Suite 디자인 시스템 완전 가이드

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

DESIGN-react-suite.md

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

가이드 다운로드

React Suite 디자인 시스템: 일정과 분리된 네이티브 캘린더

별도의 일정 목록을 갖춘 네이티브 캘린더

React Suite는 컴포넌트가 풍부한 애플리케이션을 대상으로 하며, Calendar와 같은 컨트롤과 더 넓은 작업 영역을 모두 제공합니다. 이 예제는 컴파일된 스타일시트와 함께 버전 6.2.4를 사용합니다. CustomProvider가 애플리케이션을 감싸고, Calendar, Panel, Modal 및 기타 컴포넌트는 rsuite에서 가져옵니다.

이 OpenDesign 가이드에서

이 캘린더는 연결된 일정 관리 서비스인 것처럼 동작하지 않습니다. 초기 샘플 일정 두 개를 표시하며, 로컬에서 항목을 추가하거나 삭제할 수 있습니다. 선택한 날짜와 일정 목록은 서로 다른 React 상태이므로, 날짜를 이동해도 일정이 변경되지 않습니다. 전체 App 소스에서 모든 상태 전이를 확인할 수 있습니다.

지원 사양 읽기

React Suite 디자인 시스템: v6 CSS 변수 참조

v6 CSS 변수 참조

이 사양은 오래된 Less 튜토리얼이 아니라 설치된 v6 CSS를 기준으로 합니다. 타이포그래피, 간격, 모서리 반경, 팔레트 및 시맨틱 역할은 모두 --rs 변수로 제공됩니다. 기본 본문은 작은 글자 크기인 0.875rem을 사용하며, 루트 크기는 16px로 유지됩니다. 이 차이로 인해 기본 컨트롤 영역이 16px 본문 콘텐츠보다 더 조밀해 보일 수 있습니다.

페이지는 --rs-bg-well을 배경으로 사용하고, 그 위에 --rs-bg-card 패널을 배치하며, 일정 구분선에는 --rs-border-primary를 사용합니다. 마커에는 primary-500을, 필드 오류에는 시맨틱 text-error 역할을 사용합니다. 이 참조에서는 텍스트와 배경의 별칭을 그대로 유지하므로, provider 테마에 따라 실제 값이 달라져도 각 역할을 쉽게 파악할 수 있습니다.

지원 사양 읽기

React Suite 디자인 시스템: 캘린더 주변에 라이브러리 스케일 적용하기

캘린더 주변에 라이브러리 스케일 적용하기

기본 루트 크기에서 실제 모서리 반경 스케일은 sm부터 xl까지 4px, 6px, 8px, 12px 값을 포함합니다. 기본 간격 단위는 0.25rem입니다. 제공된 CSS는 이를 장식용 팔레트처럼 다루지 않고, 주변 일정 및 도움말 콘텐츠에 실제 배경과 텍스트 변수를 사용합니다.

애플리케이션 제목은 줄 높이 1.2의 32px로 명시하고, 좁은 화면에서는 28px로 줄입니다. 세션 제목은 조밀한 일정 행에 맞도록 17px로 설정합니다. 이러한 페이지 설정은 라이브러리의 전역 글자 크기 변수를 덮어쓰지 않습니다. 따라서 Calendar 레이블과 모달 컨트롤은 네이티브 컴포넌트 크기를 유지합니다.

지원 사양 읽기

React Suite 디자인 시스템: UTC 날짜 오차 없이 선택 날짜 관리하기

UTC 오차 없이 선택한 날짜 제어하기

Calendar는 Date 값을 받고, onSelect는 선택된 값을 갱신합니다. isoWeek는 표시되는 주가 월요일에 시작하도록 합니다. 고정된 초기 값은 new Date(2026,9,14)이며, JavaScript의 월은 0부터 시작하므로 9는 10월을 뜻합니다. 이 페이지는 오늘 날짜를 나타내는 것이 아니라, 의도적으로 고정한 예시입니다.

키 생성 함수는 getFullYear, getMonth, getDate를 사용해 로컬 YYYY-MM-DD 키를 만듭니다. 시간대를 거치며 로컬 날짜가 달라질 수 있는 toISOString().slice(0,10)은 사용하지 않습니다. 이 레코드는 시간이 없는 날짜를 나타내므로, 암묵적인 UTC 변환을 추가하면 데이터에 없는 의미가 생깁니다.

지원 사양 읽기

React Suite 디자인 시스템: 날짜 마커 및 선택한 날짜의 콘텐츠

날짜 표시와 선택한 날짜의 콘텐츠

renderCell은 로컬 레코드에 해당 날짜의 항목이 있는지 확인하고 작은 이벤트 마커를 반환합니다. 마커는 보조적인 표시이며, 날짜를 선택하면 일정에 실제 제목이 표시됩니다. 색상 점만으로는 어떤 일정이 있는지 알 수 없고, 삭제할 항목도 정확히 선택할 수 없습니다.

컴팩트한 캘린더는 모바일 화면에서도 충분히 좁게 유지됩니다. 일정은 날짜 제목, 세션 카드, 로컬 추가 작업으로 구성된 별도의 Panel에 표시됩니다. 기존 760px 전환점에서는 Panel이 캘린더 아래로 이동합니다. 이 구성은 모든 캘린더 셀에 긴 이벤트 제목을 억지로 넣거나, 읽기 어려운 가로형 캘린더를 만드는 일을 방지합니다.

  1. Navigation review가 포함된 샘플 날짜를 선택합니다.
  2. 점에만 의존하지 말고 일정에서 세션 제목을 확인합니다.
  3. 세션을 삭제한 뒤 남은 레코드가 없으면 날짜 마커가 사라지는지 확인합니다.

지원 사양 읽기

React Suite 디자인 시스템: 애플리케이션 일정 규칙 명시하기

앱의 일정 관리 규칙 명시

getDay() 값이 0 또는 6이면 주말 일정 등록을 비활성화합니다. 일정에서 해당 규칙을 설명할 수 있도록 주말 날짜 자체는 선택할 수 있습니다. 주말을 선택하면 경고 메시지가 표시되고 추가 버튼은 비활성화됩니다. 이는 로컬 팀 정책이지 React Suite Calendar의 제한 사항이 아닙니다.

일정이 없는 평일에는 구체적인 빈 상태를 표시하고 추가 작업을 계속 사용할 수 있습니다. 세션을 삭제하면 레코드가 변경되고 로컬 알림이 표시됩니다. 참석자에게 알림을 보냈다고 주장하지 않습니다. Date 객체, 레코드 배열, 간단한 정책이 모두 소스에 드러나 있으므로 실제 제품에 맞게 의도적으로 교체할 수 있습니다.

지원 사양 읽기

React Suite 디자인 시스템: 유효성 검사를 포함한 간결한 입력 대화상자

유효성 검사를 포함한 간결한 항목 추가 대화상자

‘검토 세션 추가’를 열면 제목과 이전 오류가 모두 지워집니다. 모달은 Header, Title, Body, Footer 구성으로 만들며, 열림 상태와 onClose는 React 상태로 제어합니다. 입력 필드에는 실제로 연결된 레이블이 있고, 유효하지 않은 상태와 오류 설명도 제공됩니다. 공백을 제거한 제목이 세 글자 미만이면 모달을 닫지 않고 알림을 표시합니다.

유효한 항목을 제출하면 선택한 날짜에 기록 하나가 추가되고 모달이 닫히며 안내 메시지가 표시됩니다. Modal 컴포넌트는 Escape 키 처리와 포커스 관리 등 대화상자 동작을 담당합니다. 취소를 선택하면 작성 중인 내용만 닫힙니다. 애플리케이션은 자체 제목 규칙을 통과했는지 확인하기 전에 모달을 닫지 않습니다.

  • 취소하면 저장하지 않은 제목이 폐기됩니다.
  • 거부된 제목은 수정할 수 있도록 그대로 남습니다.
  • 유효한 제목을 입력하면 로컬 기록 하나가 추가되고 캘린더 표시가 업데이트됩니다.

지원 사양 읽기

React Suite 디자인 시스템: v6 스타일 및 전체 애플리케이션 불러오기

v6 스타일 및 전체 애플리케이션 불러오기

React 프로젝트에 [email protected]를 설치하고 rsuite/dist/rsuite.min.css를 가져옵니다. App 예제에는 해당 가져오기와 기존 style.css, CustomProvider 래퍼가 포함되어 있습니다. 설정 진입점은 React createRoot를 사용하며 원격 CDN에 의존하지 않습니다. 독립 실행형 미리보기에는 동일한 기본 컴포넌트와 CSS이 로컬로 번들링되어 있습니다.

React Suite는 리셋 스타일이 포함되지 않은 스타일시트 배포판도 제공합니다. 이 예제에서는 표준 스타일시트를 의도적으로 사용합니다. 두 배포판을 함께 사용하면 스타일이 중복되고 페이지에 어떤 리셋이 적용되는지 불분명해집니다. 기존 애플리케이션에서는 주변 스타일 아키텍처에 맞는 배포판을 선택하고 폼과 제목에 미치는 영향을 함께 확인하세요.

지원 사양 읽기

React Suite 디자인 시스템: 실제 캘린더에 필요한 추가 도메인 상태

실제 캘린더에 필요한 추가 도메인 상태

연결된 일정 관리 기능이라면 시간, 시간대, 참석자, 권한, 저장 결과가 필요합니다. 날짜만 다루는 이 예제에서는 그런 필드를 임의로 추가하거나 상태 업데이트에 성공했으니 초대도 전송됐다고 가장하지 않습니다. 푸터와 알림을 통해 로컬 범위임을 명확히 보여줍니다. 로컬 날짜 키 함수는 이 기록에 적합하지만, 시간대가 반영된 회의를 처리하기 위한 완전한 전략은 아닙니다.

원격 요청을 추가한다면 결과가 확인될 때까지 초안 모달을 열어 두거나 복구할 수 있는 오류를 표시하세요. 중복 제출을 막고 요청이 실패하더라도 선택한 날짜와 제목을 유지하세요. 라이브러리는 인터페이스 기본 요소를 제공하지만, 애플리케이션의 정확성은 이러한 요소를 실제 작업과 올바르게 연결하는 데 달려 있습니다.

지원 사양 읽기

React Suite 디자인 시스템 컴포넌트 예제

완성된 캘린더 및 일정 애플리케이션

날짜별 표시, 로컬 날짜 키, 모달 입력 흐름을 사용하는 제어형 Calendar.

jsx
import React,{useState} from 'react';
import {CustomProvider,Calendar,Panel,Button,Modal,Input,Message,Tag} from 'rsuite';
import 'rsuite/dist/rsuite.min.css';
import './style.css';
const key=d=>`${d.getFullYear()}-${String(d.getMonth()+1).padStart(2,'0')}-${String(d.getDate()).padStart(2,'0')}`;
export default function App(){const[date,setDate]=useState(new Date(2026,9,14)),[open,setOpen]=useState(false),[title,setTitle]=useState(''),[error,setError]=useState(''),[notice,setNotice]=useState(''),[events,setEvents]=useState([{id:1,date:'2026-10-14',title:'Navigation review'},{id:2,date:'2026-10-16',title:'Prototype handoff'}]);const selected=events.filter(e=>e.date===key(date));const weekend=[0,6].includes(date.getDay());function save(){if(title.trim().length<3){setError('Use at least three characters for the session title.');return;}setEvents([...events,{id:Date.now(),date:key(date),title:title.trim()}]);setOpen(false);setNotice('Added to the local calendar only. No invitation was sent.');}
return <CustomProvider><main className='schedule'><header><div><p className='eyebrow'>REACT SUITE / TEAM CADENCE</p><h1>Give the work a place in the week.</h1><p>Select a day to inspect its sessions. Weekend scheduling is disabled in this example.</p></div><Tag color='blue'>Local calendar</Tag></header>{notice&&<Message type='info' closable onClose={()=>setNotice('')}>{notice}</Message>}<div className='schedule-grid'><Panel bordered className='calendar-panel'><Calendar compact bordered isoWeek value={date} onSelect={setDate} renderCell={d=>events.some(e=>e.date===key(d))?<span className='event-dot' aria-label='Has a session'/>:null}/><p className='calendar-legend'><span className='event-dot'/> A date with one or more local sessions</p></Panel><Panel bordered className='agenda-panel'><p className='eyebrow'>{date.toLocaleDateString('en',{weekday:'long'})}</p><h2>{date.toLocaleDateString('en',{month:'long',day:'numeric',year:'numeric'})}</h2>{weekend&&<Message type='warning'>The sample team does not schedule weekend reviews.</Message>}<div className='agenda'>{selected.length?selected.map(e=><article key={e.id}><div><span className='event-kind'>Review session</span><h3>{e.title}</h3></div><Button appearance='subtle' size='sm' aria-label={'Remove '+e.title} onClick={()=>{setEvents(events.filter(x=>x.id!==e.id));setNotice('Removed from the local calendar. No attendee was notified.')}}>Remove</Button></article>):<div className='empty'><h3>No sessions for this day.</h3><p>Choose another date or add a local review session.</p></div>}</div><Button appearance='primary' disabled={weekend} onClick={()=>{setTitle('');setError('');setOpen(true)}}>Add review session</Button></Panel></div><footer>Native React Suite Calendar, Panel, Modal, Input, Message and Button. All dates are local calendar dates; no remote calendar connection.</footer><Modal open={open} onClose={()=>setOpen(false)} size='sm'><Modal.Header><Modal.Title>Add review session</Modal.Title></Modal.Header><Modal.Body><p>For {key(date)}. This adds a record only in the preview.</p><label htmlFor='session-title'>Session title</label><Input id='session-title' value={title} onChange={v=>{setTitle(v);setError('')}} aria-invalid={!!error} aria-describedby='title-error' autoFocus/>{error&&<p id='title-error' role='alert' className='field-error'>{error}</p>}</Modal.Body><Modal.Footer><Button onClick={()=>setOpen(false)} appearance='subtle'>Cancel</Button><Button onClick={save} appearance='primary'>Add locally</Button></Modal.Footer></Modal></main></CustomProvider>}

코드 참조

  • new Date의 월 값은 0부터 시작합니다.
  • 날짜 키에는 UTC 변환 대신 로컬 캘린더 필드를 사용합니다.
  • 주말 제한은 애플리케이션 동작입니다.

반응형 캘린더 레이아웃

기본 컴포넌트 주변에 실제 React Suite 시맨틱 변수를 사용합니다.

CSS
body{background:var(--rs-bg-well)}.schedule{max-width:1120px;margin:auto;padding:32px;color:var(--rs-text-primary)}header{display:flex;gap:24px;justify-content:space-between;align-items:start;margin-bottom:24px}h1{font-size:32px;line-height:1.2;letter-spacing:-.03em;max-width:650px;margin:8px 0 16px}h2{font-size:24px;line-height:1.3;margin:8px 0 24px}.eyebrow{font-size:11px;letter-spacing:.11em;font-weight:700;color:var(--rs-text-secondary)}.schedule-grid{display:grid;grid-template-columns:1.1fr 1fr;gap:24px;margin-top:20px}.calendar-panel,.agenda-panel{background:var(--rs-bg-card)}.calendar-panel .rs-panel-body{padding:20px}.event-dot{display:inline-block;width:6px;height:6px;border-radius:50%;background:var(--rs-primary-500)}.calendar-legend{font-size:12px;color:var(--rs-text-secondary);margin-top:16px}.calendar-legend .event-dot{margin-right:6px}.agenda{margin-bottom:24px}.agenda article{display:flex;align-items:center;justify-content:space-between;gap:12px;border-top:1px solid var(--rs-border-primary);padding:20px 0}.agenda h3{font-size:17px;line-height:1.3;margin:6px 0}.event-kind{color:var(--rs-text-secondary);font-size:12px}.empty{padding:24px 0;color:var(--rs-text-secondary)}footer{margin-top:24px;font-size:12px;color:var(--rs-text-secondary)}.field-error{color:var(--rs-text-error);font-size:13px;margin-top:8px}label{display:block;margin-bottom:8px;font-weight:600}@media(max-width:760px){.schedule{padding:20px 16px}.schedule-grid{grid-template-columns:1fr}header{flex-direction:column}h1{font-size:28px}.calendar-panel .rs-panel-body{padding:12px}}

코드 참조

  • 페이지 제목과 760px 중단점은 이 예제를 위해 별도로 정한 값입니다.
04

React Suite 디자인 시스템 에이전트 설정

구현 시작점

React 19 및 React Suite 6.2.4로 만든 기본 컴포넌트 예제입니다. 외부 캘린더 서비스는 사용하지 않습니다. 전체 애플리케이션과 스타일은 위에 제공되어 있습니다.

jsx
// Create the project first:
// npm create vite@latest react-suite-specimen -- --template react
// cd react-suite-specimen && npm install
// In a React project:
// npm install [email protected]
// Save the complete App example as App.jsx and the CSS example as style.css.
import React from 'react';
import {createRoot} from 'react-dom/client';
import App from './App.jsx';
createRoot(document.getElementById('root')).render(<App/>);
// index.html needs <div id="root"></div> and the Vite module entry.
// App.jsx imports rsuite/dist/rsuite.min.css and wraps CustomProvider.
// Keep the template index.html and replace its entry with the code above.
// npm run dev

프로젝트를 위한 프롬프트

에이전트 프롬프트
React Suite 6.2.4의 Calendar 및 일정 구성을 CustomProvider와 기본 스타일시트로 사용하세요. 요일 선택, 주말 비활성화 동작, 로컬 검토 항목을 위한 Modal/Input 흐름을 유지하세요. 선택한 날짜와 일정 항목은 애플리케이션 상태로 관리하고, 추가하기 전에 입력한 검토 정보를 검증하며, 취소 시 일정이 변경되지 않도록 하세요. 반응형 캘린더 레이아웃과 날짜별 일정 표시를 유지하세요. 캘린더 초대나 외부 일정 관리 서비스를 암시하지 마세요.
05

React Suite 디자인 시스템의 출처 및 범위

React Suite 6.2.4. 주말 정책과 예시 기록을 자체적으로 설정한 로컬 날짜 전용 캘린더이며, 초대나 외부 일정 관리 기능은 없습니다.