엔터프라이즈 제품 디자인 · 신규 리소스

Duet 디자인 시스템.

날짜 범위 워크플로를 통해 Duet의 LocalTapiola 색상 및 간격 스케일을 살펴보세요. ISO 날짜 값, 명시적인 범위 유효성 검사, 구성 요소 포커스 메서드, 별도의 오픈 소스 선택기 경계를 다룹니다.

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

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

출발일과 귀국일을 설정하고, 잘못된 기간을 확인한 뒤 시작일과 종료일을 포함한 날짜 수를 계산해 보세요.

여행 기간 계획 도구전체 예시 열기
기본 Duet 테마의 값을 확인해 적용하고 기본 날짜 입력을 사용한 오프라인 HTML 해석입니다. Duet 달력 런타임이 아닙니다. · 구현 레퍼런스
02

Duet 디자인 시스템 디자인 참고 자료

Duet 공개 문서 스냅샷: 기본 시스템 구성 요소, LocalTapiola 기본 토큰, 문서화된 10.7.0/CDN 통합을 담았습니다. 별도 배포되는 @duetds/date-picker 1.x 패키지가 아닙니다. 일부 반경 토큰은 아직 검토 중으로 표시되어 있습니다.

기본 테마와 Turva 테마의 역할

출처
이름 / 규칙값 / 구성용도
--color-primary#0077b3 LocalTapiola 동작 색상.
--color-primary-dark#004b81 더 어두운 상호작용 상태.
--color-primary-darker#00619b 링크 역할.
--color-primary-light#c6e1ee 기간 강조색.
--color-secondary#082a4d 본문 텍스트.
--color-primary-turva#e61740 별도 테마인 Turva의 동작 색상.
--color-danger#d61c52 유효성 검사.
--radius-default4px입력 요소와 컨테이너.
--radius-pill20rem버튼.
--radius-medium8px; In Review프로덕션 사용이 가능하다고 주장하지 마세요.

간격 토큰

출처
이름 / 규칙값 / 구성용도
--space-xxx-small2px좁은 간격.
--space-xx-small4px좁은 간격.
--space-x-small8px좁은 간격.
--space-small12px작은 간격.
--space-medium16px기본 간격.
--space-large20px구성 요소 사이 간격.
--space-x-large28px넓은 간격.
--space-xx-large36px버튼의 가로 안쪽 여백.
--space-xxx-large48px섹션.
--size-layout-max-width1110px문서에 명시된 레이아웃 최대 너비.

글꼴 크기 체계

출처
이름 / 규칙값 / 구성용도
$font-size-medium16px / 1rem본문 및 H5.
$font-size-large20px / 1.25remH4.
$font-size-x-large24px / 1.5remH3.
$font-size-xx-large36px / 2.25remH2.
$font-size-xxx-large48px / 3remH1.
$font-size-xxxx-large72px / 4.5remH0.

날짜 선택기 계약

출처
이름 / 규칙값 / 구성용도
value / min / maxYYYY-MM-DD strings화면 표시 텍스트가 아닌 ISO 값으로 저장합니다.
duetChangedetail.value and detail.valueAsDate선택한 날짜 이벤트.
validitybadInput / valueMissing / rangeOverflow / rangeUnderflow / customError확인한 뒤 적용하세요.
setFocus()Promise<void>입력 요소에 포커스를 둡니다. 호스트의 focus()는 사용하지 않습니다.
show() / hide()Promise<void>달력 및 포커스 관리.
languageDeprecatedhtml lang을 사용합니다.
disallow-weekendsBoolean구성 요소 단위로 제외합니다.

동작 속성

출처
이름 / 규칙값 / 구성용도
variation="primary"Main action화면마다 주요 동작은 하나만 둡니다.
submitBoolean, default false양식 제출을 명시적으로 선택하도록 합니다.
urlAnchor destination탐색 의미.
expand100% container넓은 동작 영역.
themedefault / turva / inherited empty브랜드 선택.
margin="none"Remove automatic margin간격은 애플리케이션에서 제어합니다.
03

Duet 디자인 시스템 전체 가이드

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

DESIGN-duet.md

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

가이드 다운로드

Duet 디자인 시스템 Duet 기본 시스템과 오픈 소스 선택기는 서로 별개입니다

예시와 함께 패키지 계약을 명시합니다

Duet은 테마가 적용된 구성 요소와 기반 요소를 통해 LocalTapiola와 Turva를 지원합니다. 별도로 배포되는 @duetds/date-picker 프로젝트는 범위가 더 좁은 오픈 소스 배포판입니다. 태그 이름이 같더라도 속성, 현지화 설정 또는 CSS 변수를 최신 기본 디자인 시스템과 서로 바꿔 쓸 수 있는 것은 아닙니다.

이 OpenDesign 가이드에서

이 페이지의 통합 코드는 기본 시스템을 대상으로 합니다. 오프라인 미리보기는 기본 날짜 입력과 링크된 Duet 토큰을 바탕으로 한 독자적인 스타일을 사용합니다. 기간 규칙을 보여 주지만 Duet의 달력 팝업이나 키보드 동작 모델을 실행한다고 주장하지 않습니다.

지원 사양 읽기

Duet 디자인 시스템 브랜드 파랑과 상태 빨강은 용도가 다릅니다

강조색 하나를 바꾸는 대신 테마를 사용합니다

기본 LocalTapiola 테마는 파란색 동작 색상과 짙은 파란색 본문 텍스트를 조합합니다. Turva에는 별도의 빨간색 동작 색상과 보조 텍스트 역할이 있습니다. 동작 색상만 바꾸면 나머지 테마 관계가 빠집니다. 현재 표에서는 이전 Turva 색조 중 일부도 더 이상 사용하지 않는 것으로 표시합니다. 과거 팔레트 항목을 모두 복사하면 이미 폐기된 지침이 그대로 남게 됩니다.

자체 제작한 여행 날짜 예시에서는 다음 동작에 파란색을 사용하고, 선택한 기간을 수정해야 할 때만 빨간색을 사용합니다. 이는 일정 계획을 보여 주는 예시이지, 보험 추천이나 견적 또는 구매 안내가 아닙니다.

지원 사양 읽기

Duet 디자인 시스템 16px 본문 크기를 기준으로 위계를 구성합니다

모든 화면에서 제목을 크게 표시할 필요는 없습니다

Duet의 표에는 큰 크기 구간에서 16, 20, 24, 36, 48, 72px 단계가 있습니다. 화면 안에 삽입되는 계획 패널에는 24px 단계를 사용해 동작과 날짜 레이블을 눈에 띄게 합니다. 마케팅용 72px 크기는 소형 양식의 기본값이 아닙니다.

LocalTapiola와 Turva의 글꼴 패키지는 서로 별도의 에셋입니다. 오프라인 해석에서는 시스템 기본 글꼴을 사용하며 브랜드 글꼴 파일을 포함하지 않습니다. 사용 승인을 받은 애플리케이션은 문서에 명시된 글꼴 경로를 통해 적절한 글꼴 모음을 불러온 다음, 이에 맞는 굵기 토큰을 사용해야 합니다.

지원 사양 읽기

Duet 디자인 시스템 실제 20px 및 28px 단계를 사용합니다

Duet은 일반적인 8px 간격 체계가 아닙니다

익숙한 2의 거듭제곱 간격 외에도 12, 20, 28, 36px가 포함되어 있습니다. 이러한 중간 간격은 시스템의 형태 리듬을 맞출 때 중요합니다. 가로 레이아웃에서는 두 필드 사이에 20px 간격을 사용하고, 세로로 쌓을 때는 각 레이블이 해당 필드와 함께 이동하도록 하세요. 예시의 중단점은 애플리케이션에서 정하는 값입니다.

기본 컨트롤 모서리에는 4px를 사용하고, 버튼에는 필 모서리 반경을 사용합니다. 토큰 참조에 있는 일부 최신 컨테이너 모서리 반경 값은 명시적으로 검토 중(In Review)입니다. 이 가이드에서는 나열된 토큰을 모두 승인된 것으로 다루지 않고 해당 상태를 그대로 유지합니다.

지원 사양 읽기

Duet 디자인 시스템 ISO 값을 저장하고 표시 형식을 설명하세요

지역화된 표시 문자열을 데이터로 파싱하지 마세요

컴포넌트의 값과 범위에는 YYYY-MM-DD를 사용합니다. 선택한 날짜 이벤트에는 문자열과 Date 객체가 모두 포함됩니다. 비교와 저장에는 문자열을 사용하고, 필드에 지역화된 형식으로 표시하는 것은 프레젠테이션의 문제로 다루세요. 문서 언어가 현재 지역화를 적용하는 진입점이며, 기존 language 속성은 더 이상 사용되지 않습니다.

이 예제에서는 2027년 6월에 해당하는 날짜만 허용합니다. 이렇게 고정된 범위를 사용하면 테스트를 일관성 있게 수행할 수 있으며, 이는 예시에서만 적용되는 제약입니다. 실제 프로덕션 양식에서는 제품 규칙에 따라 허용 범위를 정하고 필드 옆에 해당 규칙을 설명해야 합니다.

지원 사양 읽기

Duet 디자인 시스템 날짜가 유효해도 범위가 유효한 것은 아닙니다

각 필드가 유효한지 확인한 뒤 날짜 간 관계를 검사하세요

컴포넌트의 유효성 객체는 각 필드의 오류를 설명합니다. 출발일보다 이른 귀국일도 유효한 달력 날짜일 수 있으므로, 애플리케이션에서 두 날짜를 별도로 검사해야 합니다. 기본 예제에서는 명확한 오류를 표시하고 setFocus()를 사용합니다. 이는 내부 입력 요소에 포커스를 이동하는 문서화된 메서드입니다.

날짜 수는 양 끝 날짜를 포함해 셉니다. 출발일과 귀국일이 같으면 달력상 하루입니다. UTC 자정 기준으로 ISO 날짜를 변환하면 서머타임 변경으로 인해 달력상 하루의 기간이 소수점 값이 되는 일을 방지할 수 있습니다. 이 계산은 애플리케이션에서 직접 구현한 로직이며 Duet의 요금 규칙이 아닙니다.

  1. 시작일이나 종료일이 없거나, 형식이 잘못되었거나, 허용 범위를 벗어난 경우 거부하세요.
  2. 귀국일이 출발일보다 이른 경우 거부하세요.
  3. 수정이 필요한 필드로 포커스를 이동하세요.
  4. 두 검사를 모두 통과한 뒤에만 양 끝 날짜를 포함한 범위를 준비하세요.

지원 사양 읽기

Duet 디자인 시스템 기본 작업 버튼이 제출을 의미하지는 않습니다

Duet은 submit 속성으로 제출 여부를 명시합니다

메인 시스템 버튼은 submit을 사용해 양식 제출을 명시적으로 선택하며, 기본값은 false입니다. 제공된 구성 예제는 클릭 동작으로 로컬 결과를 준비하므로 해당 속성이 필요하지 않습니다. 이동할 목적지가 있다면 url을 사용하세요. 그러면 앵커 의미가 적용됩니다.

두 입력 중 하나라도 변경되면 미리보기에서 준비된 메시지를 지웁니다. 그렇지 않으면 방문자가 이미 값을 바꿨는데도 해당 메시지가 그 값을 확인해 주는 것처럼 보일 수 있습니다. 비동기 작업이 없으므로 스피너는 표시하지 않습니다.

  • 기본 준비 작업은 하나만 사용하세요.
  • 결과가 로컬에서 생성된다는 점을 명시하세요.
  • 성공을 나타내는 문구를 재사용해 정책이 생성된 것처럼 보이게 하지 마세요.

지원 사양 읽기

Duet 디자인 시스템 메인 시스템 에셋은 호환되는 세트로 고정하세요

이 샘플은 문서화된 특정 시점의 스냅샷이며, 최신 버전을 보장하지 않습니다

검토한 사용법 페이지에는 컴포넌트 10.7.0과 CSS 5.1.4가 기재되어 있지만, 검색 색인 스냅샷에는 이미 더 최신 릴리스가 언급되어 있습니다. 이 예제에서는 직접 검토한 두 버전을 함께 사용합니다. 프로덕션에 적용할 때는 하나의 릴리스를 선택하고, 여기에 맞는 CSS, 글꼴 및 컴포넌트 동작을 확인하세요.

날짜 필드는 커스텀 요소입니다. 메서드를 호출하기 전에 해당 요소의 정의가 완료될 때까지 기다리고, duetChange에 리스너를 연결한 뒤, 네이티브 change 이벤트를 가정하지 말고 문서화된 페이로드를 읽으세요. 메인 시스템 CDN 모듈과 독립형 피커를 같은 페이지에서 함께 사용하지 마세요. 둘 다 같은 태그를 정의합니다.

지원 사양 읽기

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

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

문서 전체를 index.html로 저장한 뒤 브라우저에서 여세요. 네이티브 날짜 입력을 사용해 오프라인에서 HTML를 해석하고 검증된 Duet 기본 테마 값을 적용한 예제이며, Duet 캘린더 런타임은 아닙니다.

html
<!doctype html><html lang="en"><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Duet travel period interpretation</title><style>*{box-sizing:border-box}body{margin:0;background:#f0f7fa;color:#082a4d;font:16px/1.5 system-ui,sans-serif}main{max-width:1000px;margin:auto;padding:36px 28px}.eyebrow{font-size:12px;letter-spacing:2px;text-transform:uppercase;margin-bottom:12px}h1{font-size:36px;line-height:1.2;font-weight:600;margin:0 0 20px}p{margin:0 0 20px}.hero{display:grid;grid-template-columns:1fr 300px;gap:28px;align-items:center;margin-bottom:28px}.art{height:170px;position:relative;overflow:hidden;border-radius:50%;background:#c6e1ee}.sun{position:absolute;top:25px;right:60px;width:36px;height:36px;border-radius:50%;background:white}.hill{position:absolute;background:#0077b3;width:210px;height:170px;bottom:-95px;left:-10px;transform:rotate(25deg);border-radius:24px}.hill.two{left:135px;background:#00619b;bottom:-110px;transform:rotate(-25deg)}.road{position:absolute;width:150px;height:200px;border:12px solid white;border-radius:50%;top:65px;left:95px;transform:rotate(25deg)}.card{background:white;border-radius:4px;padding:28px;box-shadow:0 2px 8px #082a4d0d;display:grid;grid-template-columns:1fr 230px;gap:28px}h2{font-size:24px;line-height:1.3;margin:0 0 20px}.fields{display:grid;grid-template-columns:1fr 1fr;gap:20px}label{display:block;font-weight:600;margin-bottom:8px}input{width:100%;max-width:100%;min-width:0;border:1px solid #909599;border-radius:4px;font:inherit;color:inherit;padding:12px;background:white}input[aria-invalid=true]{border-color:#d61c52}button{background:#0077b3;color:white;border:0;border-radius:20rem;padding:12px 36px;font:600 16px/1.5 system-ui;cursor:pointer}button:hover{background:#004b81}button:focus-visible,input:focus-visible{outline:3px solid #082a4d;outline-offset:3px}.error{font-size:14px;color:#d61c52;min-height:24px;margin:8px 0 20px}.calendar{background:#f0f7fa;border-radius:4px;padding:20px}.calendar strong{display:block;margin-bottom:12px}.grid{display:grid;grid-template-columns:repeat(7,1fr);gap:4px;font-size:12px;text-align:center}.grid span{padding:3px 0}.grid .in-range{background:#c6e1ee}.grid .endpoint{background:#0077b3;color:white;border-radius:50%}.caption{font-size:12px;margin:12px 0 0}.result{margin-top:20px;background:#e4f1f7;padding:20px;border-radius:4px}.result:empty{display:none}.boundary{font-size:12px;margin-top:28px}.hint{font-size:14px}@media(max-width:650px){main{padding:24px 16px}.hero{grid-template-columns:1fr}.art{display:none}h1{font-size:28px}.card{grid-template-columns:1fr;padding:20px}.fields{grid-template-columns:1fr;gap:16px}.calendar{max-width:300px;width:100%}button{width:100%;padding:12px 20px}}
</style><main><div class="hero"><div><div class="eyebrow">Travel period planner</div><h1>Make time for a change of scenery.</h1><p>Choose a departure and return date to explore an inclusive calendar-day count.</p></div><div class="art" aria-hidden="true"><div class="sun"></div><div class="hill"></div><div class="hill two"></div><div class="road"></div></div></div><div class="card"><section><h2>When will you travel?</h2><p class="hint" id="hint">Use dates from 1–30 June 2027. This fixed month is for demonstration.</p><form novalidate><div class="fields"><div><label for="start">Departure</label><input id="start" type="date" min="2027-06-01" max="2027-06-30" value="2027-06-10" required aria-describedby="hint error"></div><div><label for="end">Return</label><input id="end" type="date" min="2027-06-01" max="2027-06-30" value="2027-06-17" required aria-describedby="hint error"></div></div><div class="error" id="error" role="alert"></div><button type="submit">Prepare date range</button></form></section><aside class="calendar"><strong>June 2027</strong><div class="grid" id="calendar" aria-hidden="true"></div><p class="caption" id="range-caption">10–17 June selected</p></aside></div><div class="result" id="result" role="status"></div><p class="boundary">Independent HTML interpretation of Duet tokens with native date fields. The calendar image is a non-interactive range overview. No insurance quote, booking or policy is created.</p></main><script>const start=document.querySelector('#start'),end=document.querySelector('#end'),result=document.querySelector('#result'),error=document.querySelector('#error');function valid(){return start.validity.valid&&end.validity.valid&&start.value&&end.value&&end.value>=start.value}function draw(){let days=['M','T','W','T','F','S','S'].map(d=>'<span>'+d+'</span>').join('')+'<span></span>';for(let i=1;i<=30;i++){let iso='2027-06-'+String(i).padStart(2,'0'),range=valid()&&iso>=start.value&&iso<=end.value,edge=range&&(iso===start.value||iso===end.value);days+='<span class="'+(edge?'endpoint':range?'in-range':'')+'">'+i+'</span>'}document.querySelector('#calendar').innerHTML=days;document.querySelector('#range-caption').textContent=valid()?start.value+' to '+end.value:'Choose a valid range to highlight it.'}function changed(){result.textContent='';error.textContent='';start.removeAttribute('aria-invalid');end.removeAttribute('aria-invalid');draw()}[start,end].forEach(el=>el.oninput=changed);document.querySelector('form').onsubmit=e=>{e.preventDefault();let bad;if(!start.value||!start.validity.valid){error.textContent='Choose a departure date in June 2027.';bad=start}else if(!end.value||!end.validity.valid){error.textContent='Choose a return date in June 2027.';bad=end}else if(end.value<start.value){error.textContent='Return must be on or after departure.';bad=end}if(bad){bad.setAttribute('aria-invalid','true');bad.focus();result.textContent='';return}const days=(Date.parse(end.value+'T00:00:00Z')-Date.parse(start.value+'T00:00:00Z'))/86400000+1;result.textContent=days+' calendar '+(days===1?'day':'days')+', including departure and return. Local draft: '+start.value+' to '+end.value+'. No policy created.'};draw();</script></html>

코드 참조

  • 이 문서에서는 브라우저 기본 날짜 컨트롤을 사용합니다. 별도의 Duet 예제에서는 메인 시스템 피커를 사용합니다. 이를 독립형 오픈 소스 날짜 피커 패키지와 혼동하지 마세요.

메인 시스템 Date Picker 두 개의 유효성을 검사합니다

레이블이 있는 필드 두 개, 6월 날짜 범위 제한, 순서가 올바른 양 끝 날짜, 오류가 있는 피커로 포커스 이동, 양 끝 날짜를 포함한 날짜 수 계산.

html
<!doctype html><html lang="en"><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title>Date range draft</title>
<link rel="stylesheet" href="https://cdn.duetds.com/api/css/5.1.4/lib/duet.min.css">
<script type="module" src="https://cdn.duetds.com/api/components/10.7.0/lib/duet/duet.esm.js"></script>
<style>main{max-width:680px;margin:auto;padding:28px}.range{display:grid;grid-template-columns:1fr 1fr;gap:20px}@media(max-width:576px){.range{grid-template-columns:1fr}}</style>
<main><h1>Choose a travel period</h1><p>Demonstration only. No insurance is quoted or purchased.</p><div class="range">
<duet-date-picker id="start" label="Departure" required expand value="2027-06-10" min="2027-06-01" max="2027-06-30"></duet-date-picker>
<duet-date-picker id="end" label="Return" required expand value="2027-06-17" min="2027-06-01" max="2027-06-30"></duet-date-picker></div>
<duet-button id="prepare" variation="primary">Prepare date range</duet-button>
<p id="result" role="status"></p></main><script type="module">
await customElements.whenDefined('duet-date-picker');
const start=document.querySelector('#start'),end=document.querySelector('#end'),result=document.querySelector('#result');
function error(picker){const v=picker.validity;if(!picker.value)return 'Choose a date.';if(v&&!v.valid)return 'Choose a valid date in June 2027.';return '';}
function validate(){start.error=error(start);end.error=error(end);if(!start.error&&!end.error&&end.value<start.value)end.error='Return must be on or after departure.';return !start.error&&!end.error;}
[start,end].forEach(p=>p.addEventListener('duetChange',()=>{result.textContent='';validate()}));
document.querySelector('#prepare').addEventListener('click',async()=>{if(!validate()){await(start.error?start:end).setFocus();return;}const a=Date.parse(start.value+'T00:00:00Z'),b=Date.parse(end.value+'T00:00:00Z');result.textContent=`Local range: ${start.value} to ${end.value}, ${(b-a)/86400000+1} calendar days inclusive. No policy created.`;});
</script></html>

코드 참조

  • 이 예제에서는 메인 시스템 CDN을 통해 @duetds/components를 사용하며, @duetds/date-picker 1.x는 사용하지 않습니다.
  • 시작일과 종료일이 같은 범위는 양 끝 날짜를 포함해 하루입니다.
  • UTC 연산을 사용하면 날짜 수 계산에서 서머타임 오프셋을 피할 수 있습니다.
04

Duet 디자인 시스템 AI 에이전트 설정

구현 시작점

검토한 통합 페이지에 명시된 버전을 사용한 메인 시스템 CDN 구성 전체입니다. 공개 검색 스냅샷에는 더 최신 버전도 표시되어 있으므로, 이것이 최신이라고 가정하지 말고 호환되는 릴리스를 고정하세요. 글꼴은 이 문서에서 재배포하지 않습니다.

html
<!doctype html><html lang="en"><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title>Date range draft</title>
<link rel="stylesheet" href="https://cdn.duetds.com/api/css/5.1.4/lib/duet.min.css">
<script type="module" src="https://cdn.duetds.com/api/components/10.7.0/lib/duet/duet.esm.js"></script>
<style>main{max-width:680px;margin:auto;padding:28px}.range{display:grid;grid-template-columns:1fr 1fr;gap:20px}@media(max-width:576px){.range{grid-template-columns:1fr}}</style>
<main><h1>Choose a travel period</h1><p>Demonstration only. No insurance is quoted or purchased.</p><div class="range">
<duet-date-picker id="start" label="Departure" required expand value="2027-06-10" min="2027-06-01" max="2027-06-30"></duet-date-picker>
<duet-date-picker id="end" label="Return" required expand value="2027-06-17" min="2027-06-01" max="2027-06-30"></duet-date-picker></div>
<duet-button id="prepare" variation="primary">Prepare date range</duet-button>
<p id="result" role="status"></p></main><script type="module">
await customElements.whenDefined('duet-date-picker');
const start=document.querySelector('#start'),end=document.querySelector('#end'),result=document.querySelector('#result');
function error(picker){const v=picker.validity;if(!picker.value)return 'Choose a date.';if(v&&!v.valid)return 'Choose a valid date in June 2027.';return '';}
function validate(){start.error=error(start);end.error=error(end);if(!start.error&&!end.error&&end.value<start.value)end.error='Return must be on or after departure.';return !start.error&&!end.error;}
[start,end].forEach(p=>p.addEventListener('duetChange',()=>{result.textContent='';validate()}));
document.querySelector('#prepare').addEventListener('click',async()=>{if(!validate()){await(start.error?start:end).setFocus();return;}const a=Date.parse(start.value+'T00:00:00Z'),b=Date.parse(end.value+'T00:00:00Z');result.textContent=`Local range: ${start.value} to ${end.value}, ${(b-a)/86400000+1} calendar days inclusive. No policy created.`;});
</script></html>

프로젝트를 위한 프롬프트

에이전트 프롬프트
레이블이 있는 Date Picker 두 개, ISO 값, 유효성 검사를 사용해 Duet 메인 시스템의 날짜 범위를 구성하세요. 양 끝 날짜의 순서는 별도로 검사하고, 오류가 있으면 setFocus를 호출하며, 기본 로컬 준비 작업을 명시적으로 사용하세요. 같은 페이지에서 독립형 피커 패키지는 사용하지 마세요.
05

Duet 디자인 시스템 출처 및 범위

독립적인 OpenDesign 참고 자료입니다. 독창적인 일정 계획 예제로, 정책, 예약 또는 견적을 생성하지 않습니다. 메인 시스템 Duet과 별도의 오픈 소스 날짜 피커는 서로 다른 계약을 따릅니다.