Date Picker
날짜 또는 기간을 선택합니다. 로그 조회·리포트 기간처럼 '오늘 기준 최근 N일' 프리셋을 함께 제공합니다.
1. Default
날짜 하나를 고르는 기본 필드입니다.
HTML
<div class="datepicker"><label>시작일</label><button type="button" class="field-btn" aria-haspopup="dialog" aria-expanded="false"><span class="placeholder">날짜 선택</span><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="18" height="18" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M4 7a2 2 0 0 1 2 -2h12a2 2 0 0 1 2 2v12a2 2 0 0 1 -2 2h-12a2 2 0 0 1 -2 -2v-12"/><path d="M16 3v4"/><path d="M8 3v4"/><path d="M4 11h16"/><path d="M11 15h1"/><path d="M12 15v3"/></svg></button></div>CSS · .datepicker, .calendar
/* JS Design System v0.6 · .datepicker, .calendar · 토큰(var(--*))은 assets/style.css :root 참고 */
.datepicker{display:inline-flex;flex-direction:column;gap:6px;position:relative;font-size:14px}
.datepicker label{font-weight:600}
.datepicker .field-btn{display:inline-flex;align-items:center;gap:8px;height:44px;padding:0 14px;min-width:240px;border:1px solid var(--border-strong);border-radius:var(--radius-md);background:var(--bg-surface);font:inherit;font-size:14px;color:var(--text-primary);cursor:pointer;text-align:left}
.datepicker .field-btn:hover{border-color:var(--border-strong)}
.datepicker .field-btn svg{width:18px;height:18px;color:var(--text-tertiary);margin-left:auto}
.datepicker .field-btn .placeholder{color:var(--text-disabled)}
.datepicker .field-btn .sep{color:var(--text-disabled)}
.datepicker.open .field-btn{border-color:var(--border-focus)}
.datepicker .calendar{position:absolute;top:calc(100% + 4px);left:0;z-index:5;display:none}
.datepicker.open .calendar{display:block}
.calendar{width:296px;padding:12px;background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-lg);box-shadow:var(--shadow-2);font-size:12px}
.calendar .cal-head{display:flex;align-items:center;justify-content:space-between;font-weight:600;padding:0 4px 8px}
.calendar .cal-head button{border:0;background:transparent;font:inherit;cursor:pointer;width:28px;height:28px;border-radius:6px;color:var(--text-secondary)}
.calendar .cal-head button:hover{background:var(--bg-subtle)}
.calendar .cal-head button{display:grid;place-items:center}
.calendar .cal-head button svg{width:16px;height:16px}
.calendar .cal-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:2px;text-align:center}
.calendar .dow{font-size:12px;color:var(--text-tertiary);padding:4px 0;font-weight:600}
.calendar .day{height:34px;border:0;border-radius:6px;background:transparent;font:inherit;font-size:12px;color:var(--text-primary);cursor:pointer}
.calendar .day:hover{background:var(--bg-subtle)}
.calendar .day.muted{color:var(--text-disabled)}
.calendar .day.today{font-weight:700;color:var(--accent-text)}
.calendar .day.in-range{background:var(--accent-subtle);border-radius:0}
.calendar .day.on{background:var(--accent);color:var(--accent-on);font-weight:600}
.calendar .day[disabled]{opacity:.35;cursor:not-allowed}
.calendar .cal-foot{display:flex;justify-content:flex-end;gap:6px;padding-top:10px;margin-top:6px;border-top:1px solid var(--border-default)}React · @jiran/ds-react
import { DatePicker } from "@jiran/ds-react";
export default function Example() {
return <DatePicker label="시작일" />;
}2. Field
닫힌 상태. 값이 없으면 플레이스홀더, 기간은 ~ 구분.
HTML
<div class="datepicker"><label>시작일</label><button type="button" class="field-btn" aria-haspopup="dialog" aria-expanded="false"><span class="placeholder">날짜 선택</span><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="18" height="18" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M4 7a2 2 0 0 1 2 -2h12a2 2 0 0 1 2 2v12a2 2 0 0 1 -2 2h-12a2 2 0 0 1 -2 -2v-12"/><path d="M16 3v4"/><path d="M8 3v4"/><path d="M4 11h16"/><path d="M11 15h1"/><path d="M12 15v3"/></svg></button></div>
<div class="datepicker"><label>조회 기간</label><button type="button" class="field-btn" aria-haspopup="dialog" aria-expanded="false">2026-09-01 <span class="sep">~</span> 2026-09-07<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="18" height="18" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M4 7a2 2 0 0 1 2 -2h12a2 2 0 0 1 2 2v12a2 2 0 0 1 -2 2h-12a2 2 0 0 1 -2 -2v-12"/><path d="M16 3v4"/><path d="M8 3v4"/><path d="M4 11h16"/><path d="M11 15h1"/><path d="M12 15v3"/></svg></button></div>CSS · .datepicker, .calendar
/* JS Design System v0.6 · .datepicker, .calendar · 토큰(var(--*))은 assets/style.css :root 참고 */
.datepicker{display:inline-flex;flex-direction:column;gap:6px;position:relative;font-size:14px}
.datepicker label{font-weight:600}
.datepicker .field-btn{display:inline-flex;align-items:center;gap:8px;height:44px;padding:0 14px;min-width:240px;border:1px solid var(--border-strong);border-radius:var(--radius-md);background:var(--bg-surface);font:inherit;font-size:14px;color:var(--text-primary);cursor:pointer;text-align:left}
.datepicker .field-btn:hover{border-color:var(--border-strong)}
.datepicker .field-btn svg{width:18px;height:18px;color:var(--text-tertiary);margin-left:auto}
.datepicker .field-btn .placeholder{color:var(--text-disabled)}
.datepicker .field-btn .sep{color:var(--text-disabled)}
.datepicker.open .field-btn{border-color:var(--border-focus)}
.datepicker .calendar{position:absolute;top:calc(100% + 4px);left:0;z-index:5;display:none}
.datepicker.open .calendar{display:block}
.calendar{width:296px;padding:12px;background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-lg);box-shadow:var(--shadow-2);font-size:12px}
.calendar .cal-head{display:flex;align-items:center;justify-content:space-between;font-weight:600;padding:0 4px 8px}
.calendar .cal-head button{border:0;background:transparent;font:inherit;cursor:pointer;width:28px;height:28px;border-radius:6px;color:var(--text-secondary)}
.calendar .cal-head button:hover{background:var(--bg-subtle)}
.calendar .cal-head button{display:grid;place-items:center}
.calendar .cal-head button svg{width:16px;height:16px}
.calendar .cal-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:2px;text-align:center}
.calendar .dow{font-size:12px;color:var(--text-tertiary);padding:4px 0;font-weight:600}
.calendar .day{height:34px;border:0;border-radius:6px;background:transparent;font:inherit;font-size:12px;color:var(--text-primary);cursor:pointer}
.calendar .day:hover{background:var(--bg-subtle)}
.calendar .day.muted{color:var(--text-disabled)}
.calendar .day.today{font-weight:700;color:var(--accent-text)}
.calendar .day.in-range{background:var(--accent-subtle);border-radius:0}
.calendar .day.on{background:var(--accent);color:var(--accent-on);font-weight:600}
.calendar .day[disabled]{opacity:.35;cursor:not-allowed}
.calendar .cal-foot{display:flex;justify-content:flex-end;gap:6px;padding-top:10px;margin-top:6px;border-top:1px solid var(--border-default)}React · @jiran/ds-react
import { DatePicker } from "@jiran/ds-react";
export default function Example() {
return (
<>
<DatePicker label="시작일" />
<DatePicker label="조회 기간" mode="range" defaultValue={{ start: new Date(2026, 8, 1), end: new Date(2026, 8, 7) }} />
</>
);
}3. Calendar
열린 상태의 달력. 오늘(.today), 선택(.on), 다른 달(.muted), 선택 불가([disabled]).
2026년 9월
일월화수목금토
HTML
<div class="calendar" role="dialog" aria-label="날짜 선택">
<div class="cal-head"><button type="button" aria-label="이전 달"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M15 6l-6 6l6 6"/></svg></button><span>2026년 9월</span><button type="button" aria-label="다음 달"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M9 6l6 6l-6 6"/></svg></button></div>
<div class="cal-grid">
<span class="dow">일</span><span class="dow">월</span><span class="dow">화</span><span class="dow">수</span><span class="dow">목</span><span class="dow">금</span><span class="dow">토</span>
<button type="button" class="day muted">30</button><button type="button" class="day muted">31</button><button type="button" class="day">1</button><button type="button" class="day">2</button><button type="button" class="day">3</button><button type="button" class="day">4</button><button type="button" class="day">5</button>
<button type="button" class="day">6</button><button type="button" class="day on today" aria-selected="true">7</button><button type="button" class="day">8</button><button type="button" class="day">9</button><button type="button" class="day">10</button><button type="button" class="day">11</button><button type="button" class="day">12</button>
<button type="button" class="day">13</button><button type="button" class="day">14</button><button type="button" class="day">15</button><button type="button" class="day">16</button><button type="button" class="day">17</button><button type="button" class="day">18</button><button type="button" class="day">19</button>
<button type="button" class="day">20</button><button type="button" class="day">21</button><button type="button" class="day">22</button><button type="button" class="day">23</button><button type="button" class="day">24</button><button type="button" class="day">25</button><button type="button" class="day">26</button>
<button type="button" class="day">27</button><button type="button" class="day">28</button><button type="button" class="day">29</button><button type="button" class="day">30</button><button type="button" class="day muted" disabled>1</button><button type="button" class="day muted" disabled>2</button><button type="button" class="day muted" disabled>3</button>
</div>
<div class="cal-foot"><button type="button" class="btn sm text">오늘</button><button type="button" class="btn sm primary">적용</button></div>
</div>CSS · .datepicker, .calendar
/* JS Design System v0.6 · .datepicker, .calendar · 토큰(var(--*))은 assets/style.css :root 참고 */
.datepicker{display:inline-flex;flex-direction:column;gap:6px;position:relative;font-size:14px}
.datepicker label{font-weight:600}
.datepicker .field-btn{display:inline-flex;align-items:center;gap:8px;height:44px;padding:0 14px;min-width:240px;border:1px solid var(--border-strong);border-radius:var(--radius-md);background:var(--bg-surface);font:inherit;font-size:14px;color:var(--text-primary);cursor:pointer;text-align:left}
.datepicker .field-btn:hover{border-color:var(--border-strong)}
.datepicker .field-btn svg{width:18px;height:18px;color:var(--text-tertiary);margin-left:auto}
.datepicker .field-btn .placeholder{color:var(--text-disabled)}
.datepicker .field-btn .sep{color:var(--text-disabled)}
.datepicker.open .field-btn{border-color:var(--border-focus)}
.datepicker .calendar{position:absolute;top:calc(100% + 4px);left:0;z-index:5;display:none}
.datepicker.open .calendar{display:block}
.calendar{width:296px;padding:12px;background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-lg);box-shadow:var(--shadow-2);font-size:12px}
.calendar .cal-head{display:flex;align-items:center;justify-content:space-between;font-weight:600;padding:0 4px 8px}
.calendar .cal-head button{border:0;background:transparent;font:inherit;cursor:pointer;width:28px;height:28px;border-radius:6px;color:var(--text-secondary)}
.calendar .cal-head button:hover{background:var(--bg-subtle)}
.calendar .cal-head button{display:grid;place-items:center}
.calendar .cal-head button svg{width:16px;height:16px}
.calendar .cal-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:2px;text-align:center}
.calendar .dow{font-size:12px;color:var(--text-tertiary);padding:4px 0;font-weight:600}
.calendar .day{height:34px;border:0;border-radius:6px;background:transparent;font:inherit;font-size:12px;color:var(--text-primary);cursor:pointer}
.calendar .day:hover{background:var(--bg-subtle)}
.calendar .day.muted{color:var(--text-disabled)}
.calendar .day.today{font-weight:700;color:var(--accent-text)}
.calendar .day.in-range{background:var(--accent-subtle);border-radius:0}
.calendar .day.on{background:var(--accent);color:var(--accent-on);font-weight:600}
.calendar .day[disabled]{opacity:.35;cursor:not-allowed}
.calendar .cal-foot{display:flex;justify-content:flex-end;gap:6px;padding-top:10px;margin-top:6px;border-top:1px solid var(--border-default)}React · @jiran/ds-react
import { useState } from "react";
import { Button, Calendar } from "@jiran/ds-react";
const TODAY = new Date(2026, 8, 7);
export default function Example() {
const [month, setMonth] = useState(new Date(2026, 8, 1));
const [value, setValue] = useState<Date | null>(TODAY);
return (
<Calendar
month={month}
onMonthChange={setMonth}
value={value}
onSelect={setValue}
today={TODAY}
max={new Date(2026, 8, 30)}
footer={
<>
<Button size="sm" variant="text" onClick={() => { setMonth(new Date(2026, 8, 1)); setValue(TODAY); }}>오늘</Button>
<Button size="sm">적용</Button>
</>
}
/>
);
}4. Range
기간 선택. 시작·끝은 .on, 사이는 .in-range.
2026년 9월
일월화수목금토
HTML
<div class="calendar" role="dialog" aria-label="날짜 선택">
<div class="cal-head"><button type="button" aria-label="이전 달"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M15 6l-6 6l6 6"/></svg></button><span>2026년 9월</span><button type="button" aria-label="다음 달"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M9 6l6 6l-6 6"/></svg></button></div>
<div class="cal-grid">
<span class="dow">일</span><span class="dow">월</span><span class="dow">화</span><span class="dow">수</span><span class="dow">목</span><span class="dow">금</span><span class="dow">토</span>
<button type="button" class="day muted">30</button><button type="button" class="day muted">31</button><button type="button" class="day on" aria-selected="true">1</button><button type="button" class="day in-range">2</button><button type="button" class="day in-range">3</button><button type="button" class="day in-range">4</button><button type="button" class="day in-range">5</button>
<button type="button" class="day in-range">6</button><button type="button" class="day on today" aria-selected="true">7</button><button type="button" class="day">8</button><button type="button" class="day">9</button><button type="button" class="day">10</button><button type="button" class="day">11</button><button type="button" class="day">12</button>
<button type="button" class="day">13</button><button type="button" class="day">14</button><button type="button" class="day">15</button><button type="button" class="day">16</button><button type="button" class="day">17</button><button type="button" class="day">18</button><button type="button" class="day">19</button>
<button type="button" class="day">20</button><button type="button" class="day">21</button><button type="button" class="day">22</button><button type="button" class="day">23</button><button type="button" class="day">24</button><button type="button" class="day">25</button><button type="button" class="day">26</button>
<button type="button" class="day">27</button><button type="button" class="day">28</button><button type="button" class="day">29</button><button type="button" class="day">30</button><button type="button" class="day muted">1</button><button type="button" class="day muted">2</button><button type="button" class="day muted">3</button>
</div>
<div class="cal-foot"><button type="button" class="btn sm text" data-preset="7">최근 7일</button><button type="button" class="btn sm text" data-preset="30">최근 30일</button><button type="button" class="btn sm primary">적용</button></div>
</div>CSS · .datepicker, .calendar
/* JS Design System v0.6 · .datepicker, .calendar · 토큰(var(--*))은 assets/style.css :root 참고 */
.datepicker{display:inline-flex;flex-direction:column;gap:6px;position:relative;font-size:14px}
.datepicker label{font-weight:600}
.datepicker .field-btn{display:inline-flex;align-items:center;gap:8px;height:44px;padding:0 14px;min-width:240px;border:1px solid var(--border-strong);border-radius:var(--radius-md);background:var(--bg-surface);font:inherit;font-size:14px;color:var(--text-primary);cursor:pointer;text-align:left}
.datepicker .field-btn:hover{border-color:var(--border-strong)}
.datepicker .field-btn svg{width:18px;height:18px;color:var(--text-tertiary);margin-left:auto}
.datepicker .field-btn .placeholder{color:var(--text-disabled)}
.datepicker .field-btn .sep{color:var(--text-disabled)}
.datepicker.open .field-btn{border-color:var(--border-focus)}
.datepicker .calendar{position:absolute;top:calc(100% + 4px);left:0;z-index:5;display:none}
.datepicker.open .calendar{display:block}
.calendar{width:296px;padding:12px;background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-lg);box-shadow:var(--shadow-2);font-size:12px}
.calendar .cal-head{display:flex;align-items:center;justify-content:space-between;font-weight:600;padding:0 4px 8px}
.calendar .cal-head button{border:0;background:transparent;font:inherit;cursor:pointer;width:28px;height:28px;border-radius:6px;color:var(--text-secondary)}
.calendar .cal-head button:hover{background:var(--bg-subtle)}
.calendar .cal-head button{display:grid;place-items:center}
.calendar .cal-head button svg{width:16px;height:16px}
.calendar .cal-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:2px;text-align:center}
.calendar .dow{font-size:12px;color:var(--text-tertiary);padding:4px 0;font-weight:600}
.calendar .day{height:34px;border:0;border-radius:6px;background:transparent;font:inherit;font-size:12px;color:var(--text-primary);cursor:pointer}
.calendar .day:hover{background:var(--bg-subtle)}
.calendar .day.muted{color:var(--text-disabled)}
.calendar .day.today{font-weight:700;color:var(--accent-text)}
.calendar .day.in-range{background:var(--accent-subtle);border-radius:0}
.calendar .day.on{background:var(--accent);color:var(--accent-on);font-weight:600}
.calendar .day[disabled]{opacity:.35;cursor:not-allowed}
.calendar .cal-foot{display:flex;justify-content:flex-end;gap:6px;padding-top:10px;margin-top:6px;border-top:1px solid var(--border-default)}React · @jiran/ds-react
import { useState } from "react";
import { Button, Calendar, type DateRange } from "@jiran/ds-react";
const TODAY = new Date(2026, 8, 7);
const daysAgo = (n: number) => new Date(TODAY.getFullYear(), TODAY.getMonth(), TODAY.getDate() - n);
export default function Example() {
const [month, setMonth] = useState(new Date(2026, 8, 1));
const [range, setRange] = useState<DateRange>({ start: new Date(2026, 8, 1), end: TODAY });
const pick = (d: Date) => setRange((r) => (!r.end ? (d < r.start ? { start: d, end: r.start } : { start: r.start, end: d }) : { start: d, end: null }));
return (
<Calendar
month={month}
onMonthChange={setMonth}
mode="range"
value={range}
onSelect={pick}
today={TODAY}
footer={
<>
<Button size="sm" variant="text" onClick={() => setRange({ start: daysAgo(6), end: TODAY })}>최근 7일</Button>
<Button size="sm" variant="text" onClick={() => setRange({ start: daysAgo(29), end: TODAY })}>최근 30일</Button>
<Button size="sm">적용</Button>
</>
}
/>
);
}Props
HTML 에서는 클래스와 속성으로, React(@jiran/ds-react)에서는 같은 이름의 prop(variant · size …)으로 변형·상태를 지정합니다.
| Prop / Class | Type · Values | Default | Description |
|---|---|---|---|
| .datepicker | container | — | label + .field-btn(+ .calendar). 열림은 .open |
| .field-btn | button | — | 값 표시 트리거. 기간은 .sep 로 구분 |
| .calendar | popover | — | .cal-head + .cal-grid(.dow ×7, .day ×42) + .cal-foot |
| .day.on / .in-range / .today / .muted | state | — | 선택 / 기간 사이 / 오늘 / 다른 달 |
| disabled | attribute | — | 선택 불가 날짜 |
Usage
React: @jiran/ds-react 패키지를 설치하고 style.css 를 한 번 import 하면 위 React 탭 코드를 그대로 쓸 수 있습니다(React Package). HTML: assets/style.css 를 연결하고(일부만 필요하면 아래 컴포넌트 CSS 복사), 동작이 필요하면 assets/ds.js 를 함께 넣습니다 — 이 페이지의 프리뷰가 그 스크립트로 동작합니다. 색은 전부 토큰(var(--accent) 등)을 참조하므로 --accent-* 만 제품 컬러로 바꾸면 됩니다.
React @jiran/ds-react
npm i @jiran/ds-react
// main.tsx — 앱 진입점에서 한 번
import "@jiran/ds-react/style.css";
// 컴포넌트
import { Calendar, DatePicker, formatDate } from "@jiran/ds-react";HTML
<!-- 1) 토큰 + 전체 컴포넌트 스타일 한 번에 연결 -->
<link rel="stylesheet" href="assets/style.css">
<!-- 동작(드롭다운·탭·달력·표 정렬/선택·토스트 등) — 순수 JS 한 파일. React 제품은 불필요 -->
<script src="assets/ds.js" defer></script>
<!-- 2) 또는 아래 "Component CSS" 만 프로젝트 CSS 에 붙이고,
:root 토큰은 Foundations › Design Token 에서 복사 -->Component CSS .datepicker, .calendar
/* JS Design System v0.6 · .datepicker, .calendar · 토큰(var(--*))은 assets/style.css :root 참고 */
.datepicker{display:inline-flex;flex-direction:column;gap:6px;position:relative;font-size:14px}
.datepicker label{font-weight:600}
.datepicker .field-btn{display:inline-flex;align-items:center;gap:8px;height:44px;padding:0 14px;min-width:240px;border:1px solid var(--border-strong);border-radius:var(--radius-md);background:var(--bg-surface);font:inherit;font-size:14px;color:var(--text-primary);cursor:pointer;text-align:left}
.datepicker .field-btn:hover{border-color:var(--border-strong)}
.datepicker .field-btn svg{width:18px;height:18px;color:var(--text-tertiary);margin-left:auto}
.datepicker .field-btn .placeholder{color:var(--text-disabled)}
.datepicker .field-btn .sep{color:var(--text-disabled)}
.datepicker.open .field-btn{border-color:var(--border-focus)}
.datepicker .calendar{position:absolute;top:calc(100% + 4px);left:0;z-index:5;display:none}
.datepicker.open .calendar{display:block}
.calendar{width:296px;padding:12px;background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-lg);box-shadow:var(--shadow-2);font-size:12px}
.calendar .cal-head{display:flex;align-items:center;justify-content:space-between;font-weight:600;padding:0 4px 8px}
.calendar .cal-head button{border:0;background:transparent;font:inherit;cursor:pointer;width:28px;height:28px;border-radius:6px;color:var(--text-secondary)}
.calendar .cal-head button:hover{background:var(--bg-subtle)}
.calendar .cal-head button{display:grid;place-items:center}
.calendar .cal-head button svg{width:16px;height:16px}
.calendar .cal-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:2px;text-align:center}
.calendar .dow{font-size:12px;color:var(--text-tertiary);padding:4px 0;font-weight:600}
.calendar .day{height:34px;border:0;border-radius:6px;background:transparent;font:inherit;font-size:12px;color:var(--text-primary);cursor:pointer}
.calendar .day:hover{background:var(--bg-subtle)}
.calendar .day.muted{color:var(--text-disabled)}
.calendar .day.today{font-weight:700;color:var(--accent-text)}
.calendar .day.in-range{background:var(--accent-subtle);border-radius:0}
.calendar .day.on{background:var(--accent);color:var(--accent-on);font-weight:600}
.calendar .day[disabled]{opacity:.35;cursor:not-allowed}
.calendar .cal-foot{display:flex;justify-content:flex-end;gap:6px;padding-top:10px;margin-top:6px;border-top:1px solid var(--border-default)}