@bigtablet/design-system 3.4.1 → 3.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import * as React$1 from 'react';
2
+ import { Ref } from 'react';
2
3
  import * as _react_spring_web from '@react-spring/web';
3
4
  import { LucideProps, LucideIcon } from 'lucide-react';
4
5
  export { LucideIcon, LucideProps } from 'lucide-react';
@@ -195,6 +196,69 @@ interface BadgeProps extends React$1.HTMLAttributes<HTMLSpanElement> {
195
196
  */
196
197
  declare const Badge: ({ variant, shape, size, appearance, count, max, className, children, ...props }: BadgeProps) => React$1.JSX.Element;
197
198
 
199
+ interface EmptyStateProps extends Omit<React$1.HTMLAttributes<HTMLDivElement>, "title"> {
200
+ /** 일러스트 영역 (아이콘/이미지 등) */
201
+ illustration?: React$1.ReactNode;
202
+ /** 제목 */
203
+ title?: React$1.ReactNode;
204
+ /** 보조 설명 */
205
+ description?: React$1.ReactNode;
206
+ /** 액션 영역 (Button 등) */
207
+ action?: React$1.ReactNode;
208
+ /** 크기 (기본 "md") */
209
+ size?: "sm" | "md" | "lg";
210
+ }
211
+ /**
212
+ * 빈 상태 표시 - 데이터 없음, 검색 결과 없음, 시작 가이드 등.
213
+ *
214
+ * @example
215
+ * ```tsx
216
+ * <EmptyState
217
+ * illustration={<InboxIcon size={64} />}
218
+ * title="받은 메일이 없습니다"
219
+ * description="새 메일이 오면 여기 표시됩니다."
220
+ * action={<Button>새 메일 작성</Button>}
221
+ * />
222
+ * ```
223
+ */
224
+ declare const EmptyState: ({ illustration, title, description, action, size, className, ...props }: EmptyStateProps) => React$1.JSX.Element;
225
+
226
+ type ErrorStateVariant = "page" | "widget";
227
+ interface ErrorStateProps extends Omit<React$1.HTMLAttributes<HTMLDivElement>, "title"> {
228
+ /** 제목 (기본 "문제가 발생했습니다") */
229
+ title?: React$1.ReactNode;
230
+ /** 보조 설명 */
231
+ description?: React$1.ReactNode;
232
+ /** 아이콘/일러스트 (미지정 시 기본 경고 아이콘. `null` 로 숨김) */
233
+ icon?: React$1.ReactNode;
234
+ /** 액션 영역 (재시도 버튼 등) */
235
+ action?: React$1.ReactNode;
236
+ /**
237
+ * 레이아웃 모드 (기본 "page").
238
+ * - `page`: 전체 화면/영역 채움 - error boundary fallback. 큰 아이콘 + 넉넉한 패딩 + min-height.
239
+ * - `widget`: 인라인 컴팩트 - 위젯/카드 내부 error fallback. 작은 아이콘 + 좁은 패딩.
240
+ */
241
+ variant?: ErrorStateVariant;
242
+ }
243
+ /**
244
+ * 에러 상태 표시 - error boundary / 데이터 로드 실패 / 위젯 에러 fallback.
245
+ * `EmptyState` 의 형제. `status-error` 토큰 사용 (하드코딩 없음).
246
+ *
247
+ * @example
248
+ * ```tsx
249
+ * // 페이지 전체 (error boundary)
250
+ * <ErrorState
251
+ * title="페이지를 불러오지 못했습니다"
252
+ * description="잠시 후 다시 시도해 주세요."
253
+ * action={<Button onClick={retry}>다시 시도</Button>}
254
+ * />
255
+ *
256
+ * // 위젯 인라인
257
+ * <ErrorState variant="widget" title="불러오기 실패" action={<Button size="sm" onClick={retry}>재시도</Button>} />
258
+ * ```
259
+ */
260
+ declare const ErrorState: ({ title, description, icon, action, variant, className, ...props }: ErrorStateProps) => React$1.JSX.Element;
261
+
198
262
  interface BottomNavProps extends Omit<React$1.HTMLAttributes<HTMLElement>, "onChange"> {
199
263
  /** 스크린 리더 레이블 (기본 "주요 메뉴") */
200
264
  ariaLabel?: string;
@@ -279,69 +343,6 @@ interface BreadcrumbProps extends React$1.HTMLAttributes<HTMLElement> {
279
343
  */
280
344
  declare const Breadcrumb: ({ items, separator, className, ...props }: BreadcrumbProps) => React$1.JSX.Element;
281
345
 
282
- interface EmptyStateProps extends Omit<React$1.HTMLAttributes<HTMLDivElement>, "title"> {
283
- /** 일러스트 영역 (아이콘/이미지 등) */
284
- illustration?: React$1.ReactNode;
285
- /** 제목 */
286
- title?: React$1.ReactNode;
287
- /** 보조 설명 */
288
- description?: React$1.ReactNode;
289
- /** 액션 영역 (Button 등) */
290
- action?: React$1.ReactNode;
291
- /** 크기 (기본 "md") */
292
- size?: "sm" | "md" | "lg";
293
- }
294
- /**
295
- * 빈 상태 표시 - 데이터 없음, 검색 결과 없음, 시작 가이드 등.
296
- *
297
- * @example
298
- * ```tsx
299
- * <EmptyState
300
- * illustration={<InboxIcon size={64} />}
301
- * title="받은 메일이 없습니다"
302
- * description="새 메일이 오면 여기 표시됩니다."
303
- * action={<Button>새 메일 작성</Button>}
304
- * />
305
- * ```
306
- */
307
- declare const EmptyState: ({ illustration, title, description, action, size, className, ...props }: EmptyStateProps) => React$1.JSX.Element;
308
-
309
- type ErrorStateVariant = "page" | "widget";
310
- interface ErrorStateProps extends Omit<React$1.HTMLAttributes<HTMLDivElement>, "title"> {
311
- /** 제목 (기본 "문제가 발생했습니다") */
312
- title?: React$1.ReactNode;
313
- /** 보조 설명 */
314
- description?: React$1.ReactNode;
315
- /** 아이콘/일러스트 (미지정 시 기본 경고 아이콘. `null` 로 숨김) */
316
- icon?: React$1.ReactNode;
317
- /** 액션 영역 (재시도 버튼 등) */
318
- action?: React$1.ReactNode;
319
- /**
320
- * 레이아웃 모드 (기본 "page").
321
- * - `page`: 전체 화면/영역 채움 - error boundary fallback. 큰 아이콘 + 넉넉한 패딩 + min-height.
322
- * - `widget`: 인라인 컴팩트 - 위젯/카드 내부 error fallback. 작은 아이콘 + 좁은 패딩.
323
- */
324
- variant?: ErrorStateVariant;
325
- }
326
- /**
327
- * 에러 상태 표시 - error boundary / 데이터 로드 실패 / 위젯 에러 fallback.
328
- * `EmptyState` 의 형제. `status-error` 토큰 사용 (하드코딩 없음).
329
- *
330
- * @example
331
- * ```tsx
332
- * // 페이지 전체 (error boundary)
333
- * <ErrorState
334
- * title="페이지를 불러오지 못했습니다"
335
- * description="잠시 후 다시 시도해 주세요."
336
- * action={<Button onClick={retry}>다시 시도</Button>}
337
- * />
338
- *
339
- * // 위젯 인라인
340
- * <ErrorState variant="widget" title="불러오기 실패" action={<Button size="sm" onClick={retry}>재시도</Button>} />
341
- * ```
342
- */
343
- declare const ErrorState: ({ title, description, icon, action, variant, className, ...props }: ErrorStateProps) => React$1.JSX.Element;
344
-
345
346
  interface MenuItem {
346
347
  key: string;
347
348
  label: React$1.ReactNode;
@@ -544,7 +545,7 @@ interface TabProps extends Omit<React$1.ButtonHTMLAttributes<HTMLButtonElement>,
544
545
  /** 이 tab의 value */
545
546
  value: string;
546
547
  }
547
- declare const Tab: ({ value, className, children, onClick, ...props }: TabProps) => React$1.JSX.Element;
548
+ declare const Tab: ({ value, className, children, onClick, onKeyDown, ...props }: TabProps) => React$1.JSX.Element;
548
549
  interface TabPanelProps extends React$1.HTMLAttributes<HTMLDivElement> {
549
550
  /** 이 panel을 활성화할 tab의 value */
550
551
  value: string;
@@ -1089,76 +1090,6 @@ declare const zIndex: {
1089
1090
  readonly level5: 1000;
1090
1091
  };
1091
1092
 
1092
- type AlertVariant = "info" | "success" | "warning" | "error";
1093
- type AlertActionsAlign = "left" | "center" | "right";
1094
- interface AlertOptions {
1095
- /** 알림 스타일 변형 (기본값: "info") */
1096
- variant?: AlertVariant;
1097
- /** 알림 제목 */
1098
- title?: React$1.ReactNode;
1099
- /** 알림 본문 메시지 */
1100
- message?: React$1.ReactNode;
1101
- /** 확인 버튼 텍스트 (기본값: "확인") */
1102
- confirmText?: string;
1103
- /** 취소 버튼 텍스트 (기본값: "취소") */
1104
- cancelText?: string;
1105
- /** 취소 버튼 표시 여부 (기본값: false) */
1106
- showCancel?: boolean;
1107
- /**
1108
- * Destructive 액션 여부. true 시 확인 버튼이 빨간 강조(danger)로 표시되고
1109
- * 취소 버튼은 outline으로 유지. 위험성을 시각적으로 표현해 사용자가 인지 가능.
1110
- * (Material/shadcn/Radix 표준 패턴)
1111
- * @default false
1112
- */
1113
- destructive?: boolean;
1114
- /** 액션 버튼 정렬 (기본값: "right") */
1115
- actionsAlign?: AlertActionsAlign;
1116
- /** 변형 아이콘 표시 여부 (기본값: false). 원하면 명시적으로 켜기 */
1117
- showIcon?: boolean;
1118
- /** 확인 버튼 클릭 시 호출되는 콜백 */
1119
- onConfirm?: () => void;
1120
- /** 취소 버튼 클릭 시 호출되는 콜백 */
1121
- onCancel?: () => void;
1122
- }
1123
- interface AlertContextValue {
1124
- showAlert: (options: AlertOptions) => void;
1125
- }
1126
- declare const useAlert: () => AlertContextValue;
1127
- declare const AlertProvider: React$1.FC<{
1128
- children: React$1.ReactNode;
1129
- }>;
1130
-
1131
- type ButtonVariant = "filled" | "tonal" | "outline" | "text";
1132
- type ButtonSize = "sm" | "md" | "lg" | "xl";
1133
- interface ButtonProps extends React$1.ButtonHTMLAttributes<HTMLButtonElement> {
1134
- /** 버튼 스타일 변형 (기본값: "filled") */
1135
- variant?: ButtonVariant;
1136
- /** 버튼 크기 (기본값: "md") */
1137
- size?: ButtonSize;
1138
- /** 버튼 앞에 표시할 아이콘 */
1139
- leadingIcon?: React$1.ReactNode;
1140
- /** 버튼 뒤에 표시할 아이콘 */
1141
- trailingIcon?: React$1.ReactNode;
1142
- /** 버튼이 컨테이너의 전체 너비를 차지할지 여부 */
1143
- fullWidth?: boolean;
1144
- /** border-radius 토큰 (기본값: "full") */
1145
- radius?: "none" | "xs" | "sm" | "md" | "lg" | "xl" | "full";
1146
- /**
1147
- * 위험한 액션 (삭제/취소 등) - 빨간 강조.
1148
- * filled: 빨간 bg, outline: 빨간 텍스트/border, tonal: 빨간 wash.
1149
- */
1150
- danger?: boolean;
1151
- /** 루트 button 요소 ref (React 19 ref-as-prop) */
1152
- ref?: React$1.Ref<HTMLButtonElement>;
1153
- }
1154
- /**
1155
- * 버튼을 렌더링한다.
1156
- * Figma DS 기준 4가지 variant(filled/tonal/outline/text)와 4가지 size(sm/md/lg/xl)를 지원한다.
1157
- * @param props 버튼 속성
1158
- * @returns 렌더링된 버튼 요소
1159
- */
1160
- declare const Button: ({ variant, size, leadingIcon, trailingIcon, fullWidth, radius, danger, type, ref, className, children, ...props }: ButtonProps) => React$1.JSX.Element;
1161
-
1162
1093
  type CardVariant = "default" | "accent" | "glass" | "outlined";
1163
1094
  type CardFooterAlign = "start" | "between" | "end";
1164
1095
  interface CardProps extends React$1.HTMLAttributes<HTMLDivElement> {
@@ -1196,27 +1127,6 @@ interface CardProps extends React$1.HTMLAttributes<HTMLDivElement> {
1196
1127
  */
1197
1128
  declare const Card: ({ heading, headingAs: HeadingTag, shadow, padding, bordered, variant, interactive, footer, footerAlign, ref, className, children, ...props }: CardProps) => React$1.JSX.Element;
1198
1129
 
1199
- interface CheckboxProps extends Omit<React$1.InputHTMLAttributes<HTMLInputElement>, "size"> {
1200
- /** 체크박스 옆에 표시할 라벨 */
1201
- label?: React$1.ReactNode;
1202
- /** 중간 선택(indeterminate) 상태 여부 */
1203
- indeterminate?: boolean;
1204
- /** 에러 상태 여부 */
1205
- error?: boolean;
1206
- /** 입력 요소 참조 */
1207
- ref?: React$1.Ref<HTMLInputElement>;
1208
- }
1209
- /**
1210
- * 체크박스를 렌더링한다.
1211
- * Figma DS 기준 3가지 타입(Unselected/Checked/Indeterminate)과 state layer overlay를 지원한다.
1212
- * @param props 체크박스 속성
1213
- * @returns 렌더링된 체크박스 UI
1214
- */
1215
- declare const Checkbox: {
1216
- ({ label, indeterminate, error, className, ref, ...props }: CheckboxProps): React$1.JSX.Element;
1217
- displayName: string;
1218
- };
1219
-
1220
1130
  type ChipType = "basic" | "input" | "filter" | "static";
1221
1131
  type ChipSize = "sm" | "md";
1222
1132
  type ChipTone = "default" | "accent" | "info" | "success" | "warning" | "error";
@@ -1243,65 +1153,10 @@ interface ChipProps extends Omit<React$1.HTMLAttributes<HTMLDivElement>, "onClic
1243
1153
  onClick?: (event: React$1.MouseEvent<HTMLButtonElement>) => void;
1244
1154
  /** 삭제 버튼 클릭 시 콜백 */
1245
1155
  onRemove?: () => void;
1156
+ /** 삭제 버튼 접근성 레이블 (기본값: "{label} 제거") - 칩이 여러 개일 때 대상 구분용 */
1157
+ removeLabel?: string;
1246
1158
  }
1247
- declare const Chip: ({ type, size, tone, label, selected, removable, disabled, open, leadingIcon, onClick, onRemove, className, ...props }: ChipProps) => React$1.JSX.Element;
1248
-
1249
- type DatePickerMode = "year-month" | "year-month-day";
1250
- type SelectableRange = "all" | "until-today";
1251
- interface DatePickerBaseProps {
1252
- /** 데이트 피커 위에 표시할 라벨 텍스트 */
1253
- label?: string;
1254
- /** 제어형 날짜 값 ("YYYY-MM" 또는 "YYYY-MM-DD" 형식) */
1255
- value?: string;
1256
- /** 선택 모드 (기본값: "year-month-day") */
1257
- mode?: DatePickerMode;
1258
- /** 연도 선택 범위 시작 (기본값: 1950) */
1259
- startYear?: number;
1260
- /** 연도 선택 범위 끝 (기본값: 현재 연도 + 10) */
1261
- endYear?: number;
1262
- /** 선택 가능한 최소 날짜 ("YYYY-MM-DD" 형식) */
1263
- minDate?: string;
1264
- /** 선택 가능한 날짜 범위 ("all": 제한 없음, "until-today": 오늘까지) */
1265
- selectableRange?: SelectableRange;
1266
- /** 비활성화 여부 */
1267
- disabled?: boolean;
1268
- /** 데이트 피커가 컨테이너의 전체 너비를 차지할지 여부 */
1269
- fullWidth?: boolean;
1270
- /**
1271
- * 데이트 피커의 커스텀 너비
1272
- * @deprecated `fullWidth` 사용 또는 CSS로 처리
1273
- */
1274
- width?: number | string;
1275
- /** 연도 select의 라벨/플레이스홀더 (기본값: "Year") */
1276
- yearLabel?: string;
1277
- /** 월 select의 라벨/플레이스홀더 (기본값: "Month") */
1278
- monthLabel?: string;
1279
- /** 일 select의 라벨/플레이스홀더 (기본값: "Day") */
1280
- dayLabel?: string;
1281
- /**
1282
- * minDate 설정 시 스크린리더에 전달할 안내 문구 포맷.
1283
- * `{date}` 자리에 minDate 값이 치환됩니다. (기본값: "Minimum date: {date}")
1284
- */
1285
- minDateSrFormat?: string;
1286
- /**
1287
- * selectableRange="until-today" 설정 시 스크린리더에 전달할 안내 문구.
1288
- * (기본값: "Selectable up to today")
1289
- */
1290
- selectableRangeUntilTodaySrText?: string;
1291
- }
1292
- type DatePickerCallbacks = {
1293
- onValueChange: (value: string) => void;
1294
- onChange?: (value: string) => void;
1295
- } | {
1296
- onValueChange?: (value: string) => void;
1297
- onChange: (value: string) => void;
1298
- };
1299
- type DatePickerProps = DatePickerBaseProps & DatePickerCallbacks;
1300
- /**
1301
- * 연/월/일 선택형 데이트 피커를 렌더링한다.
1302
- * 내부적으로 DS Dropdown 3개를 조합해 드롭다운 UX 일관성을 유지한다.
1303
- */
1304
- declare const DatePicker: ({ label, value, onValueChange, onChange, mode, startYear, endYear: endYearProp, minDate, selectableRange, disabled, fullWidth, width, yearLabel, monthLabel, dayLabel, minDateSrFormat, selectableRangeUntilTodaySrText, }: DatePickerProps) => React$1.JSX.Element;
1159
+ declare const Chip: ({ type, size, tone, label, selected, removable, disabled, open, leadingIcon, onClick, onRemove, removeLabel, className, ...props }: ChipProps) => React$1.JSX.Element;
1305
1160
 
1306
1161
  interface DividerProps extends React$1.HTMLAttributes<HTMLHRElement> {
1307
1162
  /** 구분선 두께 (기본값: "standard") */
@@ -1315,159 +1170,6 @@ interface DividerProps extends React$1.HTMLAttributes<HTMLHRElement> {
1315
1170
  */
1316
1171
  declare const Divider: ({ weight, className, ...props }: DividerProps) => React$1.JSX.Element;
1317
1172
 
1318
- /** Drawer 가 미끄러져 들어오는 방향 (top 은 범위 외) */
1319
- type DrawerPlacement = "left" | "right" | "bottom";
1320
- interface DrawerProps extends Omit<React$1.HTMLAttributes<HTMLDivElement>, "title" | "onClick" | "onKeyDown" | "role"> {
1321
- /** 드로어 열림 여부 */
1322
- open: boolean;
1323
- /** 드로어 닫기 콜백 */
1324
- onClose?: () => void;
1325
- /** 슬라이드 방향 (기본값: "right") */
1326
- placement?: DrawerPlacement;
1327
- /** 패널 크기 - left/right 는 너비, bottom 은 높이 (기본값: 360). number ⇒ px */
1328
- size?: number | string;
1329
- /** 드로어 제목 (헤더 h2, heading_small_bold) */
1330
- title?: React$1.ReactNode;
1331
- /** 하단 액션 영역 (Button들). 미지정 시 footer 영역 자체가 안 보임 */
1332
- footer?: React$1.ReactNode;
1333
- /** 오버레이 클릭 시 닫기 여부 (기본값: true) */
1334
- closeOnOverlay?: boolean;
1335
- /** 우상단 X 닫기 아이콘 표시 여부 (기본값: true) */
1336
- showCloseIcon?: boolean;
1337
- /** X 닫기 버튼 접근성 레이블 (기본값: "닫기") */
1338
- closeLabel?: string;
1339
- /** 드로어 접근성 레이블 (title 없을 때 사용, 기본값: "Dialog") */
1340
- ariaLabel?: string;
1341
- }
1342
- /**
1343
- * 화면 가장자리에서 미끄러져 들어오는 패널(Drawer)을 렌더링한다.
1344
- * react-spring 기반 방향별 슬라이드 진입/퇴출 + 포커스 트랩 + 바디 스크롤 잠금.
1345
- *
1346
- * @param props 드로어 속성
1347
- * @returns 열림 상태일 때 렌더링된 드로어, 닫힘 상태면 null
1348
- */
1349
- declare const Drawer: {
1350
- ({ open, onClose, placement, size, title, footer, closeOnOverlay, showCloseIcon, closeLabel, ariaLabel, children, className, ...props }: DrawerProps): React$1.JSX.Element | null;
1351
- displayName: string;
1352
- };
1353
-
1354
- type DropdownSize = "sm" | "md" | "lg";
1355
- interface DropdownOption {
1356
- value: string;
1357
- label: string;
1358
- disabled?: boolean;
1359
- /** 옵션 아래에 표시할 보조 텍스트 */
1360
- supportingText?: string;
1361
- /** 옵션 왼쪽 아이콘 */
1362
- leadingIcon?: React$1.ReactNode;
1363
- /** 옵션 오른쪽 아이콘 (미지정 시 선택 상태에 체크 아이콘 자동 표시) */
1364
- trailingIcon?: React$1.ReactNode;
1365
- /** 아이템 아래 구분선 표시 여부 */
1366
- showDivider?: boolean;
1367
- }
1368
- /** single/multiple 공통 속성 */
1369
- interface DropdownCommonProps {
1370
- /** 드롭다운 요소의 id (미입력 시 자동 생성) */
1371
- id?: string;
1372
- /** 드롭다운 위에 표시할 플로팅 라벨 텍스트 */
1373
- label?: string;
1374
- /** 선택 전 표시할 플레이스홀더 (기본값: "Select…") */
1375
- placeholder?: string;
1376
- /** 표시할 옵션 목록 */
1377
- options: DropdownOption[];
1378
- /** 비활성화 여부 */
1379
- disabled?: boolean;
1380
- /** 드롭다운 크기 (기본값: "md") */
1381
- size?: DropdownSize;
1382
- /**
1383
- * @deprecated Dropdown 은 이제 항상 부모 너비를 채웁니다. 인라인 사용 시 부모를 `inline-block + width` 로 감싸세요.
1384
- */
1385
- fullWidth?: boolean;
1386
- /** 루트 요소에 추가할 className */
1387
- className?: string;
1388
- /**
1389
- * @deprecated variant는 더 이상 지원되지 않습니다. Dropdown은 outline 스타일만 사용합니다.
1390
- */
1391
- variant?: "outline" | "filled" | "ghost";
1392
- /**
1393
- * @deprecated textAlign은 더 이상 지원되지 않습니다.
1394
- */
1395
- textAlign?: "left" | "center";
1396
- /**
1397
- * 검색 가능 여부. 활성화 시 열린 패널 상단에 검색 입력이 표시되고, 옵션 `label` 부분 일치로 필터링됩니다.
1398
- * (기본값: false)
1399
- */
1400
- searchable?: boolean;
1401
- /** 검색 입력의 placeholder (기본값: "검색…") */
1402
- searchPlaceholder?: string;
1403
- /** 필터 결과가 0개일 때 표시할 텍스트 (기본값: "결과 없음") */
1404
- emptyText?: string;
1405
- /** 멀티 선택 요약 텍스트 (기본값: "N개 선택") */
1406
- selectedSummary?: (count: number) => string;
1407
- }
1408
- /** 단일 선택 (기본) */
1409
- interface DropdownSingleProps extends DropdownCommonProps {
1410
- /** 다중 선택 모드 (기본값: false) */
1411
- multiple?: false;
1412
- /** 제어형 선택 값 */
1413
- value?: string | null;
1414
- /** 값 변경 콜백 (canonical). 선택된 값과 전체 옵션 객체를 전달합니다. */
1415
- onValueChange?: (value: string | null, option?: DropdownOption | null) => void;
1416
- /** @deprecated `onValueChange` 를 사용하세요. */
1417
- onChange?: (value: string | null, option?: DropdownOption | null) => void;
1418
- /** 비제어형 초기 선택 값 */
1419
- defaultValue?: string | null;
1420
- }
1421
- /** 다중 선택 */
1422
- interface DropdownMultipleProps extends DropdownCommonProps {
1423
- /** 다중 선택 모드 */
1424
- multiple: true;
1425
- /** 제어형 선택 값 목록 */
1426
- value?: string[];
1427
- /** 값 변경 콜백 (canonical). 선택된 값 목록과 옵션 객체 목록을 전달합니다. */
1428
- onValueChange?: (values: string[], options: DropdownOption[]) => void;
1429
- /** @deprecated `onValueChange` 를 사용하세요. */
1430
- onChange?: (values: string[], options: DropdownOption[]) => void;
1431
- /** 비제어형 초기 선택 값 목록 */
1432
- defaultValue?: string[];
1433
- }
1434
- type DropdownProps = DropdownSingleProps | DropdownMultipleProps;
1435
- /**
1436
- * 드롭다운 컴포넌트를 렌더링한다.
1437
- * 제어형/비제어형 상태를 지원하며, 키보드/마우스 상호작용과 정적 라벨을 관리한다.
1438
- * `searchable` 로 라벨 부분 일치 검색을, `multiple` 로 다중 선택을 opt-in 할 수 있다.
1439
- * @param props 드롭다운 속성
1440
- * @returns 렌더링된 드롭다운 UI
1441
- */
1442
- declare const Dropdown: (props: DropdownProps) => React$1.JSX.Element;
1443
-
1444
- type FileInputVariant = "button" | "preview";
1445
- interface FileInputProps extends React$1.InputHTMLAttributes<HTMLInputElement> {
1446
- /** 파일 선택 버튼 라벨 / preview variant 빈 상태 텍스트 (기본값: "Choose file") */
1447
- label?: string;
1448
- /** 파일 선택 시 호출되는 콜백 */
1449
- onFiles?: (files: FileList | null) => void;
1450
- /** 입력 필드 아래에 표시할 도움말 텍스트 (예: "PDF, DOC 파일만 업로드 가능합니다") */
1451
- supportingText?: string;
1452
- /** 이미지 파일 선택 시 64×64 썸네일을 버튼 아래 나열 (variant="button" 전용) */
1453
- preview?: boolean;
1454
- /**
1455
- * 표시 형태 (기본값: "button").
1456
- * - `"button"`: 일반 파일 선택 버튼. `preview=true` 면 아래에 작은 썸네일 표시.
1457
- * - `"preview"`: 큰 박스 안에 이미지 채움 (avatar / 이미지 업로더 패턴). 단일 이미지.
1458
- */
1459
- variant?: FileInputVariant;
1460
- /** variant="preview" 박스 크기 (px, 기본값: 160) */
1461
- previewSize?: number;
1462
- }
1463
- /**
1464
- * 파일 입력 컴포넌트를 렌더링한다.
1465
- * 내부 input 변경을 감지해 파일 목록을 콜백으로 전달한다.
1466
- * @param props 파일 입력 속성
1467
- * @returns 렌더링된 파일 입력 UI
1468
- */
1469
- declare const FileInput: ({ label, onFiles, supportingText, preview, variant, previewSize, className, disabled, accept, onChange, ...props }: FileInputProps) => React$1.JSX.Element;
1470
-
1471
1173
  interface HeroAction {
1472
1174
  /** 버튼 라벨 */
1473
1175
  label: React$1.ReactNode;
@@ -1541,42 +1243,6 @@ declare const Icon: {
1541
1243
  displayName: string;
1542
1244
  };
1543
1245
 
1544
- type IconButtonVariant = "standard" | "filled" | "tonal" | "outlined";
1545
- type IconButtonSize = "sm" | "md";
1546
- interface IconButtonProps extends React$1.ButtonHTMLAttributes<HTMLButtonElement> {
1547
- /** 아이콘 버튼 스타일 변형 (기본값: "standard") */
1548
- variant?: IconButtonVariant;
1549
- /** 아이콘 버튼 크기 (기본값: "md") */
1550
- size?: IconButtonSize;
1551
- /** 표시할 아이콘 */
1552
- icon: React$1.ReactNode;
1553
- /** 루트 button 요소 ref (React 19 ref-as-prop) */
1554
- ref?: React$1.Ref<HTMLButtonElement>;
1555
- }
1556
- /**
1557
- * 아이콘만 표시하는 버튼을 렌더링한다.
1558
- * Figma DS 기준 4가지 variant(standard/filled/tonal/outlined)와 2가지 size(sm/md)를 지원한다.
1559
- * @param props 아이콘 버튼 속성
1560
- * @returns 렌더링된 아이콘 버튼 요소
1561
- */
1562
- declare const IconButton: ({ variant, size, icon, type, ref, className, ...props }: IconButtonProps) => React$1.JSX.Element;
1563
-
1564
- interface LinearProgressProps extends React.HTMLAttributes<HTMLDivElement> {
1565
- /** 전체 단계 수 */
1566
- totalSteps: number;
1567
- /** 현재 단계 (0부터 totalSteps까지) */
1568
- currentStep: number;
1569
- /** 접근성 레이블 (스크린 리더용) */
1570
- "aria-label": string;
1571
- }
1572
- /**
1573
- * 선형 진행 표시기를 렌더링한다.
1574
- * `totalSteps + 1` 개 dot (체크포인트) + 진행 바. Dot `i` 는 `i <= currentStep` 이면 채워짐.
1575
- * @param props 진행 표시기 속성
1576
- * @returns 렌더링된 진행 표시기 요소
1577
- */
1578
- declare const LinearProgress: ({ totalSteps, currentStep, className, ...props }: LinearProgressProps) => React$1.JSX.Element;
1579
-
1580
1246
  interface ListItemProps extends Omit<React$1.HTMLAttributes<HTMLDivElement>, "onClick"> {
1581
1247
  /** 오버라인 (상단 작은 글씨). 문자열 또는 노드(강조/링크/아이콘) */
1582
1248
  overline?: React$1.ReactNode;
@@ -1643,204 +1309,13 @@ interface MediaCardProps extends Omit<React$1.HTMLAttributes<HTMLDivElement>, "t
1643
1309
  */
1644
1310
  declare const MediaCard: ({ image, imagePosition, aspectRatio, heading, headingAs: HeadingTag, eyebrow, shadow, bordered, clickable, meta, children, className, ...props }: MediaCardProps) => React$1.JSX.Element;
1645
1311
 
1646
- type ModalFooterAlign = "end" | "between" | "start";
1647
- interface ModalProps extends Omit<React$1.HTMLAttributes<HTMLDivElement>, "title" | "onClick" | "onKeyDown" | "role"> {
1648
- /** 모달 열림 여부 */
1649
- open: boolean;
1650
- /** 모달 닫기 콜백 */
1651
- onClose?: () => void;
1652
- /** 오버레이 클릭 시 닫기 여부 (기본값: true) */
1653
- closeOnOverlay?: boolean;
1654
- /** 모달 패널 너비 (기본값: 480) */
1655
- width?: number | string;
1656
- /** 모달 제목 (h2, heading_large_bold) */
1657
- title?: React$1.ReactNode;
1658
- /** 제목 아래 본문 설명 - paragraph로 자동 wrap */
1659
- description?: React$1.ReactNode;
1660
- /** 하단 액션 영역 (Button들). 미지정 시 footer 영역 자체가 안 보임 */
1661
- footer?: React$1.ReactNode;
1662
- /** Footer 정렬 (기본값: "end"). between은 좌우 분리 패턴 (destructive 액션 등) */
1663
- footerAlign?: ModalFooterAlign;
1664
- /** 우상단 X 닫기 아이콘 표시 여부 (기본값: true) */
1665
- showCloseIcon?: boolean;
1666
- /** X 닫기 버튼 접근성 레이블 (기본값: "닫기") */
1667
- closeLabel?: string;
1668
- /** 모달 접근성 레이블(기본값: title 또는 "Dialog") */
1669
- ariaLabel?: string;
1670
- }
1671
- /**
1672
- * 모달을 렌더링한다.
1673
- * react-spring 기반 진입/퇴출 모션 + 포커스 트랩 + 바디 스크롤 잠금.
1674
- * @param props 모달 속성
1675
- * @returns 열림 상태일 때 렌더링된 모달, 닫힘 상태면 null
1676
- */
1677
- declare const Modal: ({ open, onClose, closeOnOverlay, width, title, description, footer, footerAlign, showCloseIcon, closeLabel, children, className, ariaLabel, ...props }: ModalProps) => React$1.JSX.Element | null;
1678
-
1679
- interface OtpInputProps {
1680
- /** OTP 자릿수 (기본값: 6) */
1681
- length?: 4 | 6;
1682
- /** 제어형 값 */
1683
- value?: string;
1684
- /** 값 변경 콜백 (canonical) */
1685
- onValueChange?: (value: string) => void;
1686
- /** @deprecated `onValueChange` 를 사용하세요. */
1687
- onChange?: (value: string) => void;
1688
- /** 에러 상태 */
1689
- error?: boolean;
1690
- /** 비활성화 */
1691
- disabled?: boolean;
1692
- /** 하단 도움말 텍스트 */
1693
- supportingText?: string;
1694
- /** 첫 번째 입력에 자동 포커스 */
1695
- autoFocus?: boolean;
1696
- /** 접근성 레이블 */
1697
- ariaLabel?: string;
1698
- /** 추가 className */
1699
- className?: string;
1700
- }
1701
- /**
1702
- * OTP 입력 컴포넌트를 렌더링한다.
1703
- * 각 자리를 개별 입력으로 분리하고, 자동 포커스 이동·붙여넣기를 지원한다.
1704
- * @param props OTP 입력 속성
1705
- * @returns 렌더링된 OTP 입력 요소
1706
- */
1707
- declare const OtpInput: {
1708
- ({ length, value, onValueChange, onChange, error, disabled, supportingText, autoFocus, ariaLabel, className, }: OtpInputProps): React$1.JSX.Element;
1709
- displayName: string;
1710
- };
1711
-
1712
- interface PaginationBaseProps {
1713
- /** 현재 페이지 번호 (1-based) */
1714
- page: number;
1715
- /** 전체 페이지 수 */
1716
- totalPages: number;
1717
- /** 이전 페이지 버튼 aria-label (기본값: "Previous page") */
1718
- prevLabel?: string;
1719
- /** 다음 페이지 버튼 aria-label (기본값: "Next page") */
1720
- nextLabel?: string;
1721
- }
1722
- type PaginationCallbacks = {
1723
- onPageChange: (page: number) => void;
1724
- onChange?: (page: number) => void;
1725
- } | {
1726
- onPageChange?: (page: number) => void;
1727
- onChange: (page: number) => void;
1728
- };
1729
- type PaginationProps = PaginationBaseProps & PaginationCallbacks;
1730
- /**
1731
- * 페이지네이션을 렌더링한다.
1732
- * 이전/다음 버튼과 페이지 목록을 구성해 전달된 콜백으로 페이지 변경을 전달한다.
1733
- * @param props 페이지네이션 속성
1734
- * @returns 렌더링된 페이지네이션 UI
1735
- */
1736
- declare const Pagination: ({ page, totalPages, onPageChange, onChange, prevLabel, nextLabel, }: PaginationProps) => React$1.JSX.Element;
1737
-
1738
- interface RadioProps extends Omit<React$1.InputHTMLAttributes<HTMLInputElement>, "size"> {
1739
- /** 라디오 버튼 옆에 표시할 라벨 */
1740
- label?: React$1.ReactNode;
1741
- /** 라디오 버튼 크기 (기본값: "md"). `RadioGroup` 안에서는 그룹 size 가 기본값. */
1742
- size?: "sm" | "md" | "lg";
1743
- /** 입력 요소 참조 */
1744
- ref?: React$1.Ref<HTMLInputElement>;
1745
- }
1746
- /**
1747
- * 라디오 버튼을 렌더링한다.
1748
- * `RadioGroup` 안에서는 그룹 컨텍스트(name/value/size/disabled)를 자동 수신하고,
1749
- * 밖에서는 native radio 로 standalone 동작한다 (기존 동작 유지).
1750
- * @param props 라디오 속성
1751
- * @returns 렌더링된 라디오 UI
1752
- */
1753
- declare const Radio: {
1754
- ({ label, size: sizeProp, className, ref, value, checked, onChange, name: nameProp, disabled: disabledProp, ...props }: RadioProps): React$1.JSX.Element;
1755
- displayName: string;
1756
- };
1757
-
1758
- type RadioGroupSize = "sm" | "md" | "lg";
1759
- type RadioGroupOrientation = "vertical" | "horizontal";
1760
- interface RadioGroupProps extends Omit<React$1.HTMLAttributes<HTMLDivElement>, "onChange"> {
1761
- /** 제어형: 선택된 value */
1762
- value?: string;
1763
- /** 비제어형: 초기 선택 value */
1764
- defaultValue?: string;
1765
- /** value 변경 콜백 */
1766
- onValueChange?: (value: string) => void;
1767
- /** 라디오 그룹 name (미지정 시 자동 생성) */
1768
- name?: string;
1769
- /** 그룹 라벨 (radiogroup 의 접근성 레이블) */
1770
- label?: React$1.ReactNode;
1771
- /** 라벨/옵션 아래 보조 설명. error 일 때 에러 색 */
1772
- supportingText?: React$1.ReactNode;
1773
- /** 에러 상태 */
1774
- error?: boolean;
1775
- /** 그룹 사이즈 — 자식 Radio 에 전파 (기본값: "md") */
1776
- size?: RadioGroupSize;
1777
- /** 배치 방향 (기본값: "vertical") */
1778
- orientation?: RadioGroupOrientation;
1779
- /** 그룹 전체 비활성화 */
1780
- disabled?: boolean;
1781
- /** `Radio` 들 */
1782
- children: React$1.ReactNode;
1783
- }
1784
- /**
1785
- * `Radio` 들을 묶는 합성 래퍼. Context 로 name/value/size/disabled 를 공유한다.
1786
- * native `input[type=radio]` 라 같은 name 공유 시 브라우저가 방향키 이동을 기본 제공한다.
1787
- *
1788
- * - 제어형: `value` + `onValueChange`
1789
- * - 비제어형: `defaultValue`
1790
- *
1791
- * @example
1792
- * ```tsx
1793
- * <RadioGroup label="크기" defaultValue="md" onValueChange={setSize}>
1794
- * <Radio value="sm" label="작게" />
1795
- * <Radio value="md" label="보통" />
1796
- * <Radio value="lg" label="크게" />
1797
- * </RadioGroup>
1798
- * ```
1799
- */
1800
- declare const RadioGroup: {
1801
- ({ value: controlledValue, defaultValue, onValueChange, name: nameProp, label, supportingText, error, size, orientation, disabled, className, children, ...props }: RadioGroupProps): React$1.JSX.Element;
1802
- displayName: string;
1803
- };
1804
-
1805
- type SkeletonVariant = "text" | "title" | "avatar" | "rect";
1806
- interface SkeletonProps extends Omit<React$1.HTMLAttributes<HTMLDivElement>, "children"> {
1807
- /** 스켈레톤 모양 (기본값: "text") */
1808
- variant?: SkeletonVariant;
1809
- /** CSS width 값 (예: "100%", 200, "16rem"). variant=avatar는 width=height로 사용 */
1810
- width?: number | string;
1811
- /** CSS height 값 */
1812
- height?: number | string;
1813
- /** border-radius 토큰 (sm/md/lg) 또는 임의 CSS 값 */
1814
- radius?: "sm" | "md" | "lg" | "full" | string;
1815
- }
1816
- /**
1817
- * 로딩 상태를 표현하는 스켈레톤 플레이스홀더를 렌더링한다.
1818
- * @param props 스켈레톤 속성
1819
- * @returns 스켈레톤 요소
1820
- */
1821
- declare const Skeleton: ({ variant, width, height, radius, className, style, ...props }: SkeletonProps) => React$1.JSX.Element;
1822
-
1823
- interface SpinnerProps {
1824
- /** 스피너 크기(px) (기본값: 24) */
1825
- size?: number;
1826
- /** 스피너 접근성 레이블 (기본값: "Loading") */
1827
- ariaLabel?: string;
1828
- }
1829
- /**
1830
- * 스피너를 렌더링한다. 12개 bar 가 방사형으로 배치되어 페이드 인/아웃 으로 회전하는 효과.
1831
- * Vercel/iOS 스타일 - 클래식 border-spin 보다 부드럽고 미니멀.
1832
- * @param props 스피너 속성
1833
- * @returns 렌더링된 스피너 요소
1834
- */
1835
- declare const Spinner: ({ size, ariaLabel }: SpinnerProps) => React$1.JSX.Element;
1836
-
1837
- type TableSize = "sm" | "md" | "lg";
1838
- type TableSortDirection = "asc" | "desc";
1839
- interface TableSort {
1840
- /** 정렬 중인 컬럼의 `TableColumn.key` */
1841
- key: string;
1842
- /** 정렬 방향 */
1843
- direction: TableSortDirection;
1312
+ type TableSize = "sm" | "md" | "lg";
1313
+ type TableSortDirection = "asc" | "desc";
1314
+ interface TableSort {
1315
+ /** 정렬 중인 컬럼의 `TableColumn.key` */
1316
+ key: string;
1317
+ /** 정렬 방향 */
1318
+ direction: TableSortDirection;
1844
1319
  }
1845
1320
  interface TableColumn<T extends object> {
1846
1321
  /** 컬럼 식별자 - `data[key]` 자동 렌더링에도 쓰임 */
@@ -1893,70 +1368,556 @@ type TableProps<T extends object> = {
1893
1368
  stickyHeader?: boolean;
1894
1369
  /** 스크린 리더용 테이블 레이블 */
1895
1370
  ariaLabel?: string;
1896
- /** 루트 wrapper에 추가할 className */
1371
+ /** 루트 wrapper에 추가할 className */
1372
+ className?: string;
1373
+ /** 행 클릭 콜백 */
1374
+ onRowClick?: (item: T, index: number) => void;
1375
+ /**
1376
+ * clickable 행(onRowClick)의 동작 설명. 각 clickable 행에 `aria-describedby` 로 연결된다 (기본값: "클릭 가능한 행").
1377
+ * 행마다 셀 데이터가 이미 행을 식별하므로 여기엔 동작만 담으면 된다 (예: "선택하면 상세 항목으로 이동").
1378
+ * `""`(빈 문자열)로 두면 힌트를 붙이지 않는다.
1379
+ * `aria-label` 대신 `aria-describedby` 를 쓰는 이유: `<tr>` 의 `aria-label`/`role="button"` 은 행/셀의
1380
+ * accessible name 을 덮거나 셀을 presentational 로 만들어 스크린리더가 셀 데이터를 못 읽는다.
1381
+ */
1382
+ rowClickHint?: string;
1383
+ /** 현재 정렬 상태 (제어형). `undefined` 는 정렬 없음 */
1384
+ sort?: TableSort;
1385
+ /** 정렬 가능한 헤더 클릭 시 발화 (none→asc→desc→none 순환). DS는 데이터를 직접 정렬하지 않음 - 정렬된 `data` 를 다시 전달해야 함 */
1386
+ onSortChange?: (sort: TableSort | undefined) => void;
1387
+ /** 전체 선택 체크박스 aria-label (기본값: "전체 선택") */
1388
+ selectAllAriaLabel?: string;
1389
+ /** 개별 행 선택 체크박스 aria-label (기본값: (i) => `${i+1}번째 행 선택`) */
1390
+ selectRowAriaLabel?: (index: number) => string;
1391
+ } & TableSelectionProps<T>;
1392
+ /**
1393
+ * 데이터 테이블을 렌더링한다. 로딩 중에는 헤더 유지, 바디에 스켈레톤 행을 표시한다.
1394
+ * @param props 테이블 속성
1395
+ * @returns 테이블 컴포넌트
1396
+ */
1397
+ declare const Table: <T extends object>({ columns, data, keyExtractor, emptyMessage, isLoading, skeletonRows, size, hoverable, stickyHeader, ariaLabel, className, onRowClick, rowClickHint, sort, onSortChange, selectAllAriaLabel, selectRowAriaLabel, selectable, rowKey, selectedKeys, onSelectionChange, }: TableProps<T>) => React$1.JSX.Element;
1398
+
1399
+ type AlertVariant = "info" | "success" | "warning" | "error";
1400
+ type AlertActionsAlign = "left" | "center" | "right";
1401
+ interface AlertOptions {
1402
+ /** 알림 스타일 변형 (기본값: "info") */
1403
+ variant?: AlertVariant;
1404
+ /** 알림 제목 */
1405
+ title?: React$1.ReactNode;
1406
+ /** 알림 본문 메시지 */
1407
+ message?: React$1.ReactNode;
1408
+ /** 확인 버튼 텍스트 (기본값: "확인") */
1409
+ confirmText?: string;
1410
+ /** 취소 버튼 텍스트 (기본값: "취소") */
1411
+ cancelText?: string;
1412
+ /** 취소 버튼 표시 여부 (기본값: false) */
1413
+ showCancel?: boolean;
1414
+ /**
1415
+ * Destructive 액션 여부. true 시 확인 버튼이 빨간 강조(danger)로 표시되고
1416
+ * 취소 버튼은 outline으로 유지. 위험성을 시각적으로 표현해 사용자가 인지 가능.
1417
+ * (Material/shadcn/Radix 표준 패턴)
1418
+ * @default false
1419
+ */
1420
+ destructive?: boolean;
1421
+ /** 액션 버튼 정렬 (기본값: "right") */
1422
+ actionsAlign?: AlertActionsAlign;
1423
+ /** 변형 아이콘 표시 여부 (기본값: false). 원하면 명시적으로 켜기 */
1424
+ showIcon?: boolean;
1425
+ /** 확인 버튼 클릭 시 호출되는 콜백 */
1426
+ onConfirm?: () => void;
1427
+ /** 취소 버튼 클릭 시 호출되는 콜백 */
1428
+ onCancel?: () => void;
1429
+ /**
1430
+ * 오버레이 클릭으로 닫기 허용 여부 (기본값: true).
1431
+ * destructive 확인처럼 실수 닫힘을 막아야 하면 false 로.
1432
+ */
1433
+ closeOnOverlay?: boolean;
1434
+ }
1435
+ interface AlertContextValue {
1436
+ showAlert: (options: AlertOptions) => void;
1437
+ }
1438
+ declare const useAlert: () => AlertContextValue;
1439
+ declare const AlertProvider: React$1.FC<{
1440
+ children: React$1.ReactNode;
1441
+ }>;
1442
+
1443
+ interface LinearProgressProps extends React.HTMLAttributes<HTMLDivElement> {
1444
+ /** 전체 단계 수 */
1445
+ totalSteps: number;
1446
+ /** 현재 단계 (0부터 totalSteps까지) */
1447
+ currentStep: number;
1448
+ /** 접근성 레이블 (스크린 리더용) */
1449
+ "aria-label": string;
1450
+ }
1451
+ /**
1452
+ * 선형 진행 표시기를 렌더링한다.
1453
+ * `totalSteps + 1` 개 dot (체크포인트) + 진행 바. Dot `i` 는 `i <= currentStep` 이면 채워짐.
1454
+ * @param props 진행 표시기 속성
1455
+ * @returns 렌더링된 진행 표시기 요소
1456
+ */
1457
+ declare const LinearProgress: ({ totalSteps, currentStep, className, ...props }: LinearProgressProps) => React$1.JSX.Element;
1458
+
1459
+ type SkeletonVariant = "text" | "title" | "avatar" | "rect";
1460
+ interface SkeletonProps extends Omit<React$1.HTMLAttributes<HTMLDivElement>, "children"> {
1461
+ /** 스켈레톤 모양 (기본값: "text") */
1462
+ variant?: SkeletonVariant;
1463
+ /** CSS width 값 (예: "100%", 200, "16rem"). variant=avatar는 width=height로 사용 */
1464
+ width?: number | string;
1465
+ /** CSS height 값 */
1466
+ height?: number | string;
1467
+ /** border-radius 토큰 (sm/md/lg) 또는 임의 CSS 값 */
1468
+ radius?: "sm" | "md" | "lg" | "full" | string;
1469
+ }
1470
+ /**
1471
+ * 로딩 상태를 표현하는 스켈레톤 플레이스홀더를 렌더링한다.
1472
+ * @param props 스켈레톤 속성
1473
+ * @returns 스켈레톤 요소
1474
+ */
1475
+ declare const Skeleton: ({ variant, width, height, radius, className, style, ...props }: SkeletonProps) => React$1.JSX.Element;
1476
+
1477
+ interface SpinnerProps {
1478
+ /** 스피너 크기(px) (기본값: 24) */
1479
+ size?: number;
1480
+ /** 스피너 접근성 레이블 (기본값: "Loading") */
1481
+ ariaLabel?: string;
1482
+ }
1483
+ /**
1484
+ * 스피너를 렌더링한다. 12개 bar 가 방사형으로 배치되어 페이드 인/아웃 으로 회전하는 효과.
1485
+ * Vercel/iOS 스타일 - 클래식 border-spin 보다 부드럽고 미니멀.
1486
+ * @param props 스피너 속성
1487
+ * @returns 렌더링된 스피너 요소
1488
+ */
1489
+ declare const Spinner: ({ size, ariaLabel }: SpinnerProps) => React$1.JSX.Element;
1490
+
1491
+ interface ToastProviderProps {
1492
+ /** 앱 루트에서 감싸는 자식 요소 */
1493
+ children: React$1.ReactNode;
1494
+ /** 최대 동시 표시 토스트 수 (기본값: 5) */
1495
+ maxCount?: number;
1496
+ /** 토스트 닫기 버튼의 aria-label (기본값: "Close") */
1497
+ closeAriaLabel?: string;
1498
+ }
1499
+ /**
1500
+ * 토스트 컨텍스트를 제공하는 Provider를 렌더링한다.
1501
+ * 앱 최상단에서 children을 감싸야 useToast 훅을 사용할 수 있다.
1502
+ * @param props Provider 속성
1503
+ * @returns 렌더링된 Provider와 토스트 컨테이너
1504
+ */
1505
+ declare const ToastProvider: ({ children, maxCount, closeAriaLabel, }: ToastProviderProps) => React$1.JSX.Element;
1506
+
1507
+ /**
1508
+ * 토스트 메시지를 표시하는 훅.
1509
+ * ToastProvider 내부에서만 사용할 수 있다.
1510
+ * @returns 토스트 메시지 표시 함수 객체
1511
+ */
1512
+ declare const useToast: () => {
1513
+ /** 성공 메시지를 표시한다 */
1514
+ success: (message: string, duration?: number) => void;
1515
+ /** 오류 메시지를 표시한다 */
1516
+ error: (message: string, duration?: number) => void;
1517
+ /** 경고 메시지를 표시한다 */
1518
+ warning: (message: string, duration?: number) => void;
1519
+ /** 정보 메시지를 표시한다 */
1520
+ info: (message: string, duration?: number) => void;
1521
+ /** 기본 메시지를 표시한다 */
1522
+ message: (message: string, duration?: number) => void;
1523
+ };
1524
+
1525
+ interface TopLoadingProps {
1526
+ /** 진행률 (0-100). undefined면 indeterminate 모드 */
1527
+ progress?: number;
1528
+ /** 로딩바 색상 (기본: primary) */
1529
+ color?: string;
1530
+ /** 로딩바 높이 (기본: 3px) */
1531
+ height?: number;
1532
+ /** 표시 여부 */
1533
+ isLoading?: boolean;
1534
+ /** 프로그레스 바의 접근성 레이블 (기본값: "Page loading") */
1535
+ ariaLabel?: string;
1536
+ }
1537
+ /**
1538
+ * 상단 로딩바를 렌더링한다.
1539
+ * 표시 여부와 진행률에 따라 determinate/indeterminate 상태를 구성한다.
1540
+ * @param props 로딩바 속성
1541
+ * @returns 렌더링된 로딩바 요소 또는 null
1542
+ */
1543
+ declare const TopLoading: ({ progress, color, height, isLoading, ariaLabel, }: TopLoadingProps) => React$1.JSX.Element | null;
1544
+
1545
+ interface CheckboxProps extends Omit<React$1.InputHTMLAttributes<HTMLInputElement>, "size"> {
1546
+ /** 체크박스 옆에 표시할 라벨 */
1547
+ label?: React$1.ReactNode;
1548
+ /** 중간 선택(indeterminate) 상태 여부 */
1549
+ indeterminate?: boolean;
1550
+ /** 에러 상태 여부 */
1551
+ error?: boolean;
1552
+ /** 입력 요소 참조 */
1553
+ ref?: React$1.Ref<HTMLInputElement>;
1554
+ }
1555
+ /**
1556
+ * 체크박스를 렌더링한다.
1557
+ * Figma DS 기준 3가지 타입(Unselected/Checked/Indeterminate)과 state layer overlay를 지원한다.
1558
+ * @param props 체크박스 속성
1559
+ * @returns 렌더링된 체크박스 UI
1560
+ */
1561
+ declare const Checkbox: {
1562
+ ({ label, indeterminate, error, className, ref, ...props }: CheckboxProps): React$1.JSX.Element;
1563
+ displayName: string;
1564
+ };
1565
+
1566
+ type DatePickerMode = "year-month" | "year-month-day";
1567
+ type SelectableRange = "all" | "until-today";
1568
+ interface DatePickerBaseProps {
1569
+ /** 데이트 피커 위에 표시할 라벨 텍스트 */
1570
+ label?: string;
1571
+ /** 제어형 날짜 값 ("YYYY-MM" 또는 "YYYY-MM-DD" 형식) */
1572
+ value?: string;
1573
+ /** 선택 모드 (기본값: "year-month-day") */
1574
+ mode?: DatePickerMode;
1575
+ /** 연도 선택 범위 시작 (기본값: 1950) */
1576
+ startYear?: number;
1577
+ /** 연도 선택 범위 끝 (기본값: 현재 연도 + 10) */
1578
+ endYear?: number;
1579
+ /** 선택 가능한 최소 날짜 ("YYYY-MM-DD" 형식) */
1580
+ minDate?: string;
1581
+ /** 선택 가능한 날짜 범위 ("all": 제한 없음, "until-today": 오늘까지) */
1582
+ selectableRange?: SelectableRange;
1583
+ /** 비활성화 여부 */
1584
+ disabled?: boolean;
1585
+ /** 데이트 피커가 컨테이너의 전체 너비를 차지할지 여부 */
1586
+ fullWidth?: boolean;
1587
+ /**
1588
+ * 데이트 피커의 커스텀 너비
1589
+ * @deprecated `fullWidth` 사용 또는 CSS로 처리
1590
+ */
1591
+ width?: number | string;
1592
+ /** 연도 select의 라벨/플레이스홀더 (기본값: "Year") */
1593
+ yearLabel?: string;
1594
+ /** 월 select의 라벨/플레이스홀더 (기본값: "Month") */
1595
+ monthLabel?: string;
1596
+ /** 일 select의 라벨/플레이스홀더 (기본값: "Day") */
1597
+ dayLabel?: string;
1598
+ /**
1599
+ * minDate 설정 시 스크린리더에 전달할 안내 문구 포맷.
1600
+ * `{date}` 자리에 minDate 값이 치환됩니다. (기본값: "Minimum date: {date}")
1601
+ */
1602
+ minDateSrFormat?: string;
1603
+ /**
1604
+ * selectableRange="until-today" 설정 시 스크린리더에 전달할 안내 문구.
1605
+ * (기본값: "Selectable up to today")
1606
+ */
1607
+ selectableRangeUntilTodaySrText?: string;
1608
+ }
1609
+ type DatePickerCallbacks = {
1610
+ onValueChange: (value: string) => void;
1611
+ onChange?: (value: string) => void;
1612
+ } | {
1613
+ onValueChange?: (value: string) => void;
1614
+ onChange: (value: string) => void;
1615
+ };
1616
+ type DatePickerProps = DatePickerBaseProps & DatePickerCallbacks;
1617
+ /**
1618
+ * 연/월/일 선택형 데이트 피커를 렌더링한다.
1619
+ * 내부적으로 DS Dropdown 3개를 조합해 드롭다운 UX 일관성을 유지한다.
1620
+ */
1621
+ declare const DatePicker: ({ label, value, onValueChange, onChange, mode, startYear, endYear: endYearProp, minDate, selectableRange, disabled, fullWidth, width, yearLabel, monthLabel, dayLabel, minDateSrFormat, selectableRangeUntilTodaySrText, }: DatePickerProps) => React$1.JSX.Element;
1622
+
1623
+ type DropdownSize = "sm" | "md" | "lg";
1624
+ interface DropdownOption {
1625
+ value: string;
1626
+ label: string;
1627
+ disabled?: boolean;
1628
+ /** 옵션 아래에 표시할 보조 텍스트 */
1629
+ supportingText?: string;
1630
+ /** 옵션 왼쪽 아이콘 */
1631
+ leadingIcon?: React$1.ReactNode;
1632
+ /** 옵션 오른쪽 아이콘 (미지정 시 선택 상태에 체크 아이콘 자동 표시) */
1633
+ trailingIcon?: React$1.ReactNode;
1634
+ /** 아이템 아래 구분선 표시 여부 */
1635
+ showDivider?: boolean;
1636
+ }
1637
+ /** single/multiple 공통 속성 */
1638
+ interface DropdownCommonProps {
1639
+ /** 드롭다운 요소의 id (미입력 시 자동 생성) */
1640
+ id?: string;
1641
+ /** 드롭다운 위에 표시할 플로팅 라벨 텍스트 */
1642
+ label?: string;
1643
+ /** 선택 전 표시할 플레이스홀더 (기본값: "Select…") */
1644
+ placeholder?: string;
1645
+ /** 표시할 옵션 목록 */
1646
+ options: DropdownOption[];
1647
+ /** 비활성화 여부 */
1648
+ disabled?: boolean;
1649
+ /** 드롭다운 크기 (기본값: "md") */
1650
+ size?: DropdownSize;
1651
+ /**
1652
+ * @deprecated Dropdown 은 이제 항상 부모 너비를 채웁니다. 인라인 사용 시 부모를 `inline-block + width` 로 감싸세요.
1653
+ */
1654
+ fullWidth?: boolean;
1655
+ /** 루트 요소에 추가할 className */
1656
+ className?: string;
1657
+ /**
1658
+ * @deprecated variant는 더 이상 지원되지 않습니다. Dropdown은 outline 스타일만 사용합니다.
1659
+ */
1660
+ variant?: "outline" | "filled" | "ghost";
1661
+ /**
1662
+ * @deprecated textAlign은 더 이상 지원되지 않습니다.
1663
+ */
1664
+ textAlign?: "left" | "center";
1665
+ /**
1666
+ * 검색 가능 여부. 활성화 시 열린 패널 상단에 검색 입력이 표시되고, 옵션 `label` 부분 일치로 필터링됩니다.
1667
+ * (기본값: false)
1668
+ */
1669
+ searchable?: boolean;
1670
+ /** 검색 입력의 placeholder (기본값: "검색…") */
1671
+ searchPlaceholder?: string;
1672
+ /** 필터 결과가 0개일 때 표시할 텍스트 (기본값: "결과 없음") */
1673
+ emptyText?: string;
1674
+ /** 멀티 선택 요약 텍스트 (기본값: "N개 선택") */
1675
+ selectedSummary?: (count: number) => string;
1676
+ /**
1677
+ * 네이티브 폼 제출 참여용 name. 지정 시 선택 값이 hidden input 으로 렌더되어
1678
+ * `<form>` POST 에 포함됩니다 (multiple 은 같은 name 의 hidden input 반복).
1679
+ */
1680
+ name?: string;
1681
+ }
1682
+ /** 단일 선택 (기본) */
1683
+ interface DropdownSingleProps extends DropdownCommonProps {
1684
+ /** 다중 선택 모드 (기본값: false) */
1685
+ multiple?: false;
1686
+ /** 제어형 선택 값 */
1687
+ value?: string | null;
1688
+ /** 값 변경 콜백 (canonical). 선택된 값과 전체 옵션 객체를 전달합니다. */
1689
+ onValueChange?: (value: string | null, option?: DropdownOption | null) => void;
1690
+ /** @deprecated `onValueChange` 를 사용하세요. */
1691
+ onChange?: (value: string | null, option?: DropdownOption | null) => void;
1692
+ /** 비제어형 초기 선택 값 */
1693
+ defaultValue?: string | null;
1694
+ }
1695
+ /** 다중 선택 */
1696
+ interface DropdownMultipleProps extends DropdownCommonProps {
1697
+ /** 다중 선택 모드 */
1698
+ multiple: true;
1699
+ /** 제어형 선택 값 목록 */
1700
+ value?: string[];
1701
+ /** 값 변경 콜백 (canonical). 선택된 값 목록과 옵션 객체 목록을 전달합니다. */
1702
+ onValueChange?: (values: string[], options: DropdownOption[]) => void;
1703
+ /** @deprecated `onValueChange` 를 사용하세요. */
1704
+ onChange?: (values: string[], options: DropdownOption[]) => void;
1705
+ /** 비제어형 초기 선택 값 목록 */
1706
+ defaultValue?: string[];
1707
+ }
1708
+ type DropdownProps = DropdownSingleProps | DropdownMultipleProps;
1709
+ /**
1710
+ * 드롭다운 컴포넌트를 렌더링한다.
1711
+ * 제어형/비제어형 상태를 지원하며, 키보드/마우스 상호작용과 정적 라벨을 관리한다.
1712
+ * `searchable` 로 라벨 부분 일치 검색을, `multiple` 로 다중 선택을 opt-in 할 수 있다.
1713
+ * @param props 드롭다운 속성
1714
+ * @returns 렌더링된 드롭다운 UI
1715
+ */
1716
+ declare const Dropdown: (props: DropdownProps) => React$1.JSX.Element;
1717
+
1718
+ type FileInputVariant = "button" | "preview";
1719
+ interface FileInputProps extends React$1.InputHTMLAttributes<HTMLInputElement> {
1720
+ /** 파일 선택 버튼 라벨 / preview variant 빈 상태 텍스트 (기본값: "Choose file") */
1721
+ label?: string;
1722
+ /** 파일 선택 시 호출되는 콜백 */
1723
+ onFiles?: (files: FileList | null) => void;
1724
+ /** 입력 필드 아래에 표시할 도움말 텍스트 (예: "PDF, DOC 파일만 업로드 가능합니다") */
1725
+ supportingText?: string;
1726
+ /** 이미지 파일 선택 시 64×64 썸네일을 버튼 아래 나열 (variant="button" 전용) */
1727
+ preview?: boolean;
1728
+ /**
1729
+ * 표시 형태 (기본값: "button").
1730
+ * - `"button"`: 일반 파일 선택 버튼. `preview=true` 면 아래에 작은 썸네일 표시.
1731
+ * - `"preview"`: 큰 박스 안에 이미지 채움 (avatar / 이미지 업로더 패턴). 단일 이미지.
1732
+ */
1733
+ variant?: FileInputVariant;
1734
+ /** variant="preview" 박스 크기 (px, 기본값: 160) */
1735
+ previewSize?: number;
1736
+ }
1737
+ /**
1738
+ * 파일 입력 컴포넌트를 렌더링한다.
1739
+ * 내부 input 변경을 감지해 파일 목록을 콜백으로 전달한다.
1740
+ * @param props 파일 입력 속성
1741
+ * @returns 렌더링된 파일 입력 UI
1742
+ */
1743
+ declare const FileInput: ({ label, onFiles, supportingText, preview, variant, previewSize, className, disabled, accept, onChange, ...props }: FileInputProps) => React$1.JSX.Element;
1744
+
1745
+ /**
1746
+ * 정사각 이미지 크롭의 좌표 계산. 화면 조작(드래그 이동량 + 확대 배율)을 원본 픽셀 기준
1747
+ * 정사각 영역으로 환산하는 순수 함수만 모은다 — canvas / DOM 을 모르므로 그대로 단위 테스트
1748
+ * 할 수 있다.
1749
+ *
1750
+ * 좌표 규약:
1751
+ * - 뷰포트는 한 변이 `viewportSize` 인 정사각형이고, 이미지는 그 중앙을 기준으로 놓인다.
1752
+ * - `offset` 은 이미지 중심이 뷰포트 중심에서 얼마나 밀렸는지(CSS px). 오른쪽/아래가 +.
1753
+ * - 배율은 항상 `cover` 배율 × zoom 이라 zoom=1 이면 이미지가 뷰포트를 정확히 덮는다.
1754
+ */
1755
+ /** 이미지 중심의 이동량(CSS px) */
1756
+ interface CropOffset {
1757
+ x: number;
1758
+ y: number;
1759
+ }
1760
+ /** 원본 이미지의 natural 크기(px) */
1761
+ interface CropImageSize {
1762
+ width: number;
1763
+ height: number;
1764
+ }
1765
+ /** 원본 픽셀 기준 정사각 크롭 영역 (`canvas.drawImage` 의 source 인자로 그대로 사용) */
1766
+ interface CropRect {
1767
+ x: number;
1768
+ y: number;
1769
+ size: number;
1770
+ }
1771
+
1772
+ interface ImageCropperHandle {
1773
+ /** 현재 보이는 정사각 영역을 잘라 Blob 으로 돌려준다. 소비자의 "적용" 버튼에서 호출. */
1774
+ crop: () => Promise<Blob>;
1775
+ /** 배율·위치를 초기 상태(전체가 보이는 zoom=min, 중앙)로 되돌린다. */
1776
+ reset: () => void;
1777
+ }
1778
+ interface ImageCropperProps {
1779
+ /** 크롭/리셋을 호출할 imperative 핸들 (React 19 ref-as-prop). */
1780
+ ref?: Ref<ImageCropperHandle>;
1781
+ /** 크롭할 이미지. `File`/`Blob`(로컬) 또는 이미지 URL 문자열. */
1782
+ src: File | Blob | string;
1783
+ /** 결과물 한 변 길이(px). 기본 512. */
1784
+ outputSize?: number;
1785
+ /** 결과 MIME. `"auto"`(기본)는 PNG 는 PNG 로, 나머지는 JPEG 로 통일. */
1786
+ outputType?: "auto" | "image/jpeg" | "image/png" | "image/webp";
1787
+ /** JPEG/WebP 인코딩 품질(0~1). 기본 0.92. */
1788
+ quality?: number;
1789
+ /** 원형 가이드(아바타용). 기본 false(둥근 사각형 가이드). */
1790
+ circular?: boolean;
1791
+ /** 뷰포트 한 변 길이(px). 기본 240. */
1792
+ viewportSize?: number;
1793
+ /** 최소 배율. 기본 1(이미지가 뷰포트를 딱 덮음). */
1794
+ minZoom?: number;
1795
+ /** 최대 배율. 기본 3. */
1796
+ maxZoom?: number;
1797
+ /** 이미지 로드 완료 시. */
1798
+ onReady?: (size: CropImageSize) => void;
1799
+ /** 이미지 디코딩 실패 시(손상 파일 등). */
1800
+ onError?: () => void;
1801
+ className?: string;
1802
+ /** 뷰포트 접근성 레이블. 기본 "이미지 위치와 배율 조정". */
1803
+ label?: string;
1804
+ }
1805
+ /**
1806
+ * 업로드 전에 이미지에서 보일 정사각 영역을 정하는 크로퍼. 뷰포트 안에서 **드래그(또는 방향키)**
1807
+ * 로 위치를, **휠·슬라이더·+/- 버튼(또는 `+`/`-` 키)** 으로 배율을 맞춘다. 모달은 포함하지
1808
+ * 않으므로 소비자가 `Modal` 등으로 감싸고, 적용 버튼에서 `ref.crop()` 을 호출해 Blob 을 받는다.
1809
+ *
1810
+ * ```tsx
1811
+ * const cropperRef = useRef<ImageCropperHandle>(null);
1812
+ * <ImageCropper ref={cropperRef} src={file} circular />
1813
+ * // 적용:
1814
+ * const blob = await cropperRef.current!.crop();
1815
+ * ```
1816
+ *
1817
+ * 원격 URL 을 넘기면 `canvas.drawImage` 가 서버의 CORS(`Access-Control-Allow-Origin`)에
1818
+ * 의존한다 — 확실히 자르려면 로컬 `File`/`Blob` 을 권장한다.
1819
+ */
1820
+ declare function ImageCropper({ ref, src, outputSize, outputType, quality, circular, viewportSize, minZoom, maxZoom, onReady, onError, className, label, }: ImageCropperProps): React$1.JSX.Element;
1821
+
1822
+ interface OtpInputProps {
1823
+ /** OTP 자릿수 (기본값: 6) */
1824
+ length?: 4 | 6;
1825
+ /** 제어형 값 */
1826
+ value?: string;
1827
+ /** 값 변경 콜백 (canonical) */
1828
+ onValueChange?: (value: string) => void;
1829
+ /** @deprecated `onValueChange` 를 사용하세요. */
1830
+ onChange?: (value: string) => void;
1831
+ /** 에러 상태 */
1832
+ error?: boolean;
1833
+ /** 비활성화 */
1834
+ disabled?: boolean;
1835
+ /** 하단 도움말 텍스트 */
1836
+ supportingText?: string;
1837
+ /** 첫 번째 입력에 자동 포커스 */
1838
+ autoFocus?: boolean;
1839
+ /** 접근성 레이블 */
1840
+ ariaLabel?: string;
1841
+ /** 추가 className */
1897
1842
  className?: string;
1898
- /** 행 클릭 콜백 */
1899
- onRowClick?: (item: T, index: number) => void;
1900
- /**
1901
- * clickable 행(onRowClick)의 동작 설명. 각 clickable 행에 `aria-describedby` 로 연결된다 (기본값: "클릭 가능한 행").
1902
- * 행마다 셀 데이터가 이미 행을 식별하므로 여기엔 동작만 담으면 된다 (예: "선택하면 상세 항목으로 이동").
1903
- * `""`(빈 문자열)로 두면 힌트를 붙이지 않는다.
1904
- * `aria-label` 대신 `aria-describedby` 를 쓰는 이유: `<tr>` 의 `aria-label`/`role="button"` 은 행/셀의
1905
- * accessible name 을 덮거나 셀을 presentational 로 만들어 스크린리더가 셀 데이터를 못 읽는다.
1906
- */
1907
- rowClickHint?: string;
1908
- /** 현재 정렬 상태 (제어형). `undefined` 는 정렬 없음 */
1909
- sort?: TableSort;
1910
- /** 정렬 가능한 헤더 클릭 시 발화 (none→asc→desc→none 순환). DS는 데이터를 직접 정렬하지 않음 - 정렬된 `data` 를 다시 전달해야 함 */
1911
- onSortChange?: (sort: TableSort | undefined) => void;
1912
- /** 전체 선택 체크박스 aria-label (기본값: "전체 선택") */
1913
- selectAllAriaLabel?: string;
1914
- /** 개별 행 선택 체크박스 aria-label (기본값: (i) => `${i+1}번째 행 선택`) */
1915
- selectRowAriaLabel?: (index: number) => string;
1916
- } & TableSelectionProps<T>;
1843
+ }
1917
1844
  /**
1918
- * 데이터 테이블을 렌더링한다. 로딩 중에는 헤더 유지, 바디에 스켈레톤 행을 표시한다.
1919
- * @param props 테이블 속성
1920
- * @returns 테이블 컴포넌트
1845
+ * OTP 입력 컴포넌트를 렌더링한다.
1846
+ * 자리를 개별 입력으로 분리하고, 자동 포커스 이동·붙여넣기를 지원한다.
1847
+ * @param props OTP 입력 속성
1848
+ * @returns 렌더링된 OTP 입력 요소
1921
1849
  */
1922
- declare const Table: <T extends object>({ columns, data, keyExtractor, emptyMessage, isLoading, skeletonRows, size, hoverable, stickyHeader, ariaLabel, className, onRowClick, rowClickHint, sort, onSortChange, selectAllAriaLabel, selectRowAriaLabel, selectable, rowKey, selectedKeys, onSelectionChange, }: TableProps<T>) => React$1.JSX.Element;
1850
+ declare const OtpInput: {
1851
+ ({ length, value, onValueChange, onChange, error, disabled, supportingText, autoFocus, ariaLabel, className, }: OtpInputProps): React$1.JSX.Element;
1852
+ displayName: string;
1853
+ };
1923
1854
 
1924
- type ThemeMode = "light" | "dark" | "system";
1925
- type ResolvedTheme = "light" | "dark";
1926
- interface ThemeContextValue {
1927
- /** 현재 선택된 모드 (system 포함) */
1928
- mode: ThemeMode;
1929
- /** 실제로 적용된 테마 (system은 prefers-color-scheme으로 해석됨) */
1930
- resolved: ResolvedTheme;
1931
- /** 모드 변경 */
1932
- setMode: (mode: ThemeMode) => void;
1855
+ interface RadioProps extends Omit<React$1.InputHTMLAttributes<HTMLInputElement>, "size"> {
1856
+ /** 라디오 버튼 옆에 표시할 라벨 */
1857
+ label?: React$1.ReactNode;
1858
+ /** 라디오 버튼 크기 (기본값: "md"). `RadioGroup` 안에서는 그룹 size 가 기본값. */
1859
+ size?: "sm" | "md" | "lg";
1860
+ /** 입력 요소 참조 */
1861
+ ref?: React$1.Ref<HTMLInputElement>;
1933
1862
  }
1934
1863
  /**
1935
- * ThemeProvider 안에서 호출. mode/resolved/setMode를 반환.
1936
- * Provider 외부에서 호출하면 에러를 던진다.
1864
+ * 라디오 버튼을 렌더링한다.
1865
+ * `RadioGroup` 안에서는 그룹 컨텍스트(name/value/size/disabled)를 자동 수신하고,
1866
+ * 밖에서는 native radio 로 standalone 동작한다 (기존 동작 유지).
1867
+ * @param props 라디오 속성
1868
+ * @returns 렌더링된 라디오 UI
1937
1869
  */
1938
- declare const useTheme: () => ThemeContextValue;
1939
- interface ThemeProviderProps {
1940
- /** 초기 테마 (기본값: "system") */
1941
- defaultMode?: ThemeMode;
1942
- /** localStorage 키 (기본값: "bt-theme"). null이면 저장 안 함 */
1943
- storageKey?: string | null;
1944
- /** 적용 대상 element selector (기본값: document.documentElement) */
1945
- targetSelector?: string;
1870
+ declare const Radio: {
1871
+ ({ label, size: sizeProp, className, ref, value, checked, onChange, name: nameProp, disabled: disabledProp, ...props }: RadioProps): React$1.JSX.Element;
1872
+ displayName: string;
1873
+ };
1874
+
1875
+ type RadioGroupSize = "sm" | "md" | "lg";
1876
+ type RadioGroupOrientation = "vertical" | "horizontal";
1877
+ interface RadioGroupProps extends Omit<React$1.HTMLAttributes<HTMLDivElement>, "onChange"> {
1878
+ /** 제어형: 선택된 value */
1879
+ value?: string;
1880
+ /** 비제어형: 초기 선택 value */
1881
+ defaultValue?: string;
1882
+ /** value 변경 콜백 */
1883
+ onValueChange?: (value: string) => void;
1884
+ /** 라디오 그룹 name (미지정 시 자동 생성) */
1885
+ name?: string;
1886
+ /** 그룹 라벨 (radiogroup 의 접근성 레이블) */
1887
+ label?: React$1.ReactNode;
1888
+ /** 라벨/옵션 아래 보조 설명. error 일 때 에러 색 */
1889
+ supportingText?: React$1.ReactNode;
1890
+ /** 에러 상태 */
1891
+ error?: boolean;
1892
+ /** 그룹 사이즈 — 자식 Radio 에 전파 (기본값: "md") */
1893
+ size?: RadioGroupSize;
1894
+ /** 배치 방향 (기본값: "vertical") */
1895
+ orientation?: RadioGroupOrientation;
1896
+ /** 그룹 전체 비활성화 */
1897
+ disabled?: boolean;
1898
+ /** `Radio` 들 */
1946
1899
  children: React$1.ReactNode;
1947
1900
  }
1948
1901
  /**
1949
- * Bigtablet DS 테마 컨텍스트를 제공한다.
1950
- * `data-theme` attribute를 root element에 적용해서 CSS 변수 레이어를 전환한다.
1902
+ * `Radio` 들을 묶는 합성 래퍼. Context 로 name/value/size/disabled 를 공유한다.
1903
+ * native `input[type=radio]` 같은 name 공유 브라우저가 방향키 이동을 기본 제공한다.
1904
+ *
1905
+ * - 제어형: `value` + `onValueChange`
1906
+ * - 비제어형: `defaultValue`
1951
1907
  *
1952
1908
  * @example
1953
1909
  * ```tsx
1954
- * <ThemeProvider defaultMode="system">
1955
- * <App />
1956
- * </ThemeProvider>
1910
+ * <RadioGroup label="크기" defaultValue="md" onValueChange={setSize}>
1911
+ * <Radio value="sm" label="작게" />
1912
+ * <Radio value="md" label="보통" />
1913
+ * <Radio value="lg" label="크게" />
1914
+ * </RadioGroup>
1957
1915
  * ```
1958
1916
  */
1959
- declare const ThemeProvider: React$1.FC<ThemeProviderProps>;
1917
+ declare const RadioGroup: {
1918
+ ({ value: controlledValue, defaultValue, onValueChange, name: nameProp, label, supportingText, error, size, orientation, disabled, className, children, ...props }: RadioGroupProps): React$1.JSX.Element;
1919
+ displayName: string;
1920
+ };
1960
1921
 
1961
1922
  type TextFieldSize = "sm" | "md" | "lg";
1962
1923
  /**
@@ -2061,102 +2022,259 @@ interface TextareaProps extends Omit<React$1.TextareaHTMLAttributes<HTMLTextArea
2061
2022
  ref?: React$1.Ref<HTMLTextAreaElement>;
2062
2023
  }
2063
2024
  /**
2064
- * 멀티라인 텍스트 입력. `TextField` 와 동일한 시각/토큰 + textarea 특화 기능.
2065
- * auto-grow (`minRows`/`maxRows`), 글자 수 카운터, resize 제어, 한글 IME 정책 지원.
2025
+ * 멀티라인 텍스트 입력. `TextField` 와 동일한 시각/토큰 + textarea 특화 기능.
2026
+ * auto-grow (`minRows`/`maxRows`), 글자 수 카운터, resize 제어, 한글 IME 정책 지원.
2027
+ *
2028
+ * @example
2029
+ * ```tsx
2030
+ * <Textarea label="내용" minRows={3} maxRows={8} maxLength={500} showCounter
2031
+ * onChangeAction={(v) => setContent(v)} />
2032
+ * ```
2033
+ */
2034
+ declare const Textarea: {
2035
+ ({ id, label, showLabel, supportingText, error, fullWidth, size, className, onValueChange, onChangeAction, imeStrategy, value, defaultValue, transformValue, rows, minRows, maxRows, showCounter, resize, maxLength, ref, ...props }: TextareaProps): React$1.JSX.Element;
2036
+ displayName: string;
2037
+ };
2038
+
2039
+ interface ToggleProps extends Omit<React$1.ButtonHTMLAttributes<HTMLButtonElement>, "onChange"> {
2040
+ /** 제어형 토글 상태 */
2041
+ checked?: boolean;
2042
+ /** 비제어형 초기 토글 상태 */
2043
+ defaultChecked?: boolean;
2044
+ /** 상태 변경 콜백 (canonical) */
2045
+ onCheckedChange?: (checked: boolean) => void;
2046
+ /** @deprecated `onCheckedChange` 를 사용하세요. */
2047
+ onChange?: (checked: boolean) => void;
2048
+ /** 토글 크기 (기본값: "sm") */
2049
+ size?: "sm" | "md";
2050
+ /** 비활성화 여부 */
2051
+ disabled?: boolean;
2052
+ /** 토글 접근성 레이블(스크린 리더용) */
2053
+ ariaLabel: string;
2054
+ /** 버튼 요소 참조 */
2055
+ ref?: React$1.Ref<HTMLButtonElement>;
2056
+ }
2057
+ /**
2058
+ * 토글을 렌더링한다.
2059
+ * 제어형/비제어형 상태를 판별해 토글 로직을 수행하고 버튼 형태의 토글 UI를 반환한다.
2060
+ * @param props 토글 속성
2061
+ * @returns 렌더링된 토글 요소
2062
+ */
2063
+ declare const Toggle: {
2064
+ ({ checked, defaultChecked, onCheckedChange, onChange, size, disabled, className, ariaLabel, ref, ...props }: ToggleProps): React$1.JSX.Element;
2065
+ displayName: string;
2066
+ };
2067
+
2068
+ type ButtonVariant = "filled" | "tonal" | "outline" | "text";
2069
+ type ButtonSize = "sm" | "md" | "lg" | "xl";
2070
+ /** button/anchor 공통 스타일·콘텐츠 props */
2071
+ interface ButtonBaseProps {
2072
+ /** 버튼 스타일 변형 (기본값: "filled") */
2073
+ variant?: ButtonVariant;
2074
+ /** 버튼 크기 (기본값: "md") */
2075
+ size?: ButtonSize;
2076
+ /** 버튼 앞에 표시할 아이콘 */
2077
+ leadingIcon?: React$1.ReactNode;
2078
+ /** 버튼 뒤에 표시할 아이콘 */
2079
+ trailingIcon?: React$1.ReactNode;
2080
+ /** 버튼이 컨테이너의 전체 너비를 차지할지 여부 */
2081
+ fullWidth?: boolean;
2082
+ /** border-radius 토큰 (기본값: "full") */
2083
+ radius?: "none" | "xs" | "sm" | "md" | "lg" | "xl" | "full";
2084
+ /**
2085
+ * 위험한 액션 (삭제/취소 등) - 빨간 강조.
2086
+ * filled: 빨간 bg, outline: 빨간 텍스트/border, tonal: 빨간 wash.
2087
+ */
2088
+ danger?: boolean;
2089
+ /**
2090
+ * 비활성화. button 은 native `disabled`, anchor 는 `aria-disabled`+`tabIndex=-1`+
2091
+ * 클릭 차단으로 처리(anchor 엔 native disabled 가 없으므로).
2092
+ */
2093
+ disabled?: boolean;
2094
+ }
2095
+ /** `<button>` 으로 렌더링 (기본) */
2096
+ interface ButtonAsButton extends ButtonBaseProps, Omit<React$1.ButtonHTMLAttributes<HTMLButtonElement>, keyof ButtonBaseProps> {
2097
+ /** 렌더링할 요소 (기본값: "button") */
2098
+ as?: "button";
2099
+ /** button 렌더 시엔 href 를 허용하지 않음 (href 만 주면 anchor 로 분기되도록) */
2100
+ href?: never;
2101
+ /** 루트 button 요소 ref (React 19 ref-as-prop) */
2102
+ ref?: React$1.Ref<HTMLButtonElement>;
2103
+ }
2104
+ /** `<a>` 로 렌더링 - 링크 시맨틱(우클릭 새 탭·미들클릭·SR 링크 안내) */
2105
+ interface ButtonAsAnchor extends ButtonBaseProps, Omit<React$1.AnchorHTMLAttributes<HTMLAnchorElement>, keyof ButtonBaseProps> {
2106
+ /** anchor 로 렌더링 - 생략 가능(href 만 줘도 anchor 로 분기) */
2107
+ as?: "a";
2108
+ /** 링크 대상 (anchor 필수) */
2109
+ href: string;
2110
+ /** 루트 anchor 요소 ref (React 19 ref-as-prop) */
2111
+ ref?: React$1.Ref<HTMLAnchorElement>;
2112
+ }
2113
+ /**
2114
+ * Button props - `as`/`href` 에 따라 button 또는 anchor 로 렌더링되는 discriminated union.
2115
+ * `as` 미지정 시 기본 `<button>` (기존 동작과 100% 호환).
2116
+ */
2117
+ type ButtonProps = ButtonAsButton | ButtonAsAnchor;
2118
+ /**
2119
+ * 버튼을 렌더링한다.
2120
+ * Figma DS 기준 4가지 variant(filled/tonal/outline/text)와 4가지 size(sm/md/lg/xl)를 지원한다.
2121
+ * `as="a"` (또는 `href` 지정) 시 동일 스타일의 anchor 로 렌더링한다.
2122
+ * @param props 버튼 속성
2123
+ * @returns 렌더링된 button 또는 anchor 요소
2124
+ */
2125
+ declare const Button: (props: ButtonProps) => React$1.JSX.Element;
2126
+
2127
+ type IconButtonVariant = "standard" | "filled" | "tonal" | "outlined";
2128
+ type IconButtonSize = "sm" | "md";
2129
+ interface IconButtonProps extends React$1.ButtonHTMLAttributes<HTMLButtonElement> {
2130
+ /** 아이콘 버튼 스타일 변형 (기본값: "standard") */
2131
+ variant?: IconButtonVariant;
2132
+ /** 아이콘 버튼 크기 (기본값: "md") */
2133
+ size?: IconButtonSize;
2134
+ /** 표시할 아이콘 */
2135
+ icon: React$1.ReactNode;
2136
+ /** 루트 button 요소 ref (React 19 ref-as-prop) */
2137
+ ref?: React$1.Ref<HTMLButtonElement>;
2138
+ }
2139
+ /**
2140
+ * 아이콘만 표시하는 버튼을 렌더링한다.
2141
+ * Figma DS 기준 4가지 variant(standard/filled/tonal/outlined)와 2가지 size(sm/md)를 지원한다.
2142
+ * @param props 아이콘 버튼 속성
2143
+ * @returns 렌더링된 아이콘 버튼 요소
2144
+ */
2145
+ declare const IconButton: ({ variant, size, icon, type, ref, className, ...props }: IconButtonProps) => React$1.JSX.Element;
2146
+
2147
+ interface PaginationBaseProps {
2148
+ /** 현재 페이지 번호 (1-based) */
2149
+ page: number;
2150
+ /** 전체 페이지 수 */
2151
+ totalPages: number;
2152
+ /** 이전 페이지 버튼 aria-label (기본값: "Previous page") */
2153
+ prevLabel?: string;
2154
+ /** 다음 페이지 버튼 aria-label (기본값: "Next page") */
2155
+ nextLabel?: string;
2156
+ }
2157
+ type PaginationCallbacks = {
2158
+ onPageChange: (page: number) => void;
2159
+ onChange?: (page: number) => void;
2160
+ } | {
2161
+ onPageChange?: (page: number) => void;
2162
+ onChange: (page: number) => void;
2163
+ };
2164
+ type PaginationProps = PaginationBaseProps & PaginationCallbacks;
2165
+ /**
2166
+ * 페이지네이션을 렌더링한다.
2167
+ * 이전/다음 버튼과 페이지 목록을 구성해 전달된 콜백으로 페이지 변경을 전달한다.
2168
+ * @param props 페이지네이션 속성
2169
+ * @returns 렌더링된 페이지네이션 UI
2170
+ */
2171
+ declare const Pagination: ({ page, totalPages, onPageChange, onChange, prevLabel, nextLabel, }: PaginationProps) => React$1.JSX.Element;
2172
+
2173
+ /** Drawer 가 미끄러져 들어오는 방향 (top 은 범위 외) */
2174
+ type DrawerPlacement = "left" | "right" | "bottom";
2175
+ interface DrawerProps extends Omit<React$1.HTMLAttributes<HTMLDivElement>, "title" | "onClick" | "onKeyDown" | "role"> {
2176
+ /** 드로어 열림 여부 */
2177
+ open: boolean;
2178
+ /** 드로어 닫기 콜백 */
2179
+ onClose?: () => void;
2180
+ /** 슬라이드 방향 (기본값: "right") */
2181
+ placement?: DrawerPlacement;
2182
+ /** 패널 크기 - left/right 는 너비, bottom 은 높이 (기본값: 360). number ⇒ px */
2183
+ size?: number | string;
2184
+ /** 드로어 제목 (헤더 h2, heading_small_bold) */
2185
+ title?: React$1.ReactNode;
2186
+ /** 하단 액션 영역 (Button들). 미지정 시 footer 영역 자체가 안 보임 */
2187
+ footer?: React$1.ReactNode;
2188
+ /** 오버레이 클릭 시 닫기 여부 (기본값: true) */
2189
+ closeOnOverlay?: boolean;
2190
+ /** 우상단 X 닫기 아이콘 표시 여부 (기본값: true) */
2191
+ showCloseIcon?: boolean;
2192
+ /** X 닫기 버튼 접근성 레이블 (기본값: "닫기") */
2193
+ closeLabel?: string;
2194
+ /** 드로어 접근성 레이블 (title 없을 때 사용, 기본값: "Dialog") */
2195
+ ariaLabel?: string;
2196
+ }
2197
+ /**
2198
+ * 화면 가장자리에서 미끄러져 들어오는 패널(Drawer)을 렌더링한다.
2199
+ * react-spring 기반 방향별 슬라이드 진입/퇴출 + 포커스 트랩 + 바디 스크롤 잠금.
2066
2200
  *
2067
- * @example
2068
- * ```tsx
2069
- * <Textarea label="내용" minRows={3} maxRows={8} maxLength={500} showCounter
2070
- * onChangeAction={(v) => setContent(v)} />
2071
- * ```
2201
+ * @param props 드로어 속성
2202
+ * @returns 열림 상태일 때 렌더링된 드로어, 닫힘 상태면 null
2072
2203
  */
2073
- declare const Textarea: {
2074
- ({ id, label, showLabel, supportingText, error, fullWidth, size, className, onValueChange, onChangeAction, imeStrategy, value, defaultValue, transformValue, rows, minRows, maxRows, showCounter, resize, maxLength, ref, ...props }: TextareaProps): React$1.JSX.Element;
2204
+ declare const Drawer: {
2205
+ ({ open, onClose, placement, size, title, footer, closeOnOverlay, showCloseIcon, closeLabel, ariaLabel, children, className, ...props }: DrawerProps): React$1.ReactPortal | null;
2075
2206
  displayName: string;
2076
2207
  };
2077
2208
 
2078
- interface ToastProviderProps {
2079
- /** 루트에서 감싸는 자식 요소 */
2080
- children: React$1.ReactNode;
2081
- /** 최대 동시 표시 토스트 수 (기본값: 5) */
2082
- maxCount?: number;
2083
- /** 토스트 닫기 버튼의 aria-label (기본값: "Close") */
2084
- closeAriaLabel?: string;
2209
+ type ModalFooterAlign = "end" | "between" | "start";
2210
+ interface ModalProps extends Omit<React$1.HTMLAttributes<HTMLDivElement>, "title" | "onClick" | "onKeyDown" | "role"> {
2211
+ /** 모달 열림 여부 */
2212
+ open: boolean;
2213
+ /** 모달 닫기 콜백 */
2214
+ onClose?: () => void;
2215
+ /** 오버레이 클릭 시 닫기 여부 (기본값: true) */
2216
+ closeOnOverlay?: boolean;
2217
+ /** 모달 패널 너비 (기본값: 480) */
2218
+ width?: number | string;
2219
+ /** 모달 제목 (h2, heading_large_bold) */
2220
+ title?: React$1.ReactNode;
2221
+ /** 제목 아래 본문 설명 - paragraph로 자동 wrap */
2222
+ description?: React$1.ReactNode;
2223
+ /** 하단 액션 영역 (Button들). 미지정 시 footer 영역 자체가 안 보임 */
2224
+ footer?: React$1.ReactNode;
2225
+ /** Footer 정렬 (기본값: "end"). between은 좌우 분리 패턴 (destructive 액션 등) */
2226
+ footerAlign?: ModalFooterAlign;
2227
+ /** 우상단 X 닫기 아이콘 표시 여부 (기본값: true) */
2228
+ showCloseIcon?: boolean;
2229
+ /** X 닫기 버튼 접근성 레이블 (기본값: "닫기") */
2230
+ closeLabel?: string;
2231
+ /** 모달 접근성 레이블(기본값: title 또는 "Dialog") */
2232
+ ariaLabel?: string;
2085
2233
  }
2086
2234
  /**
2087
- * 토스트 컨텍스트를 제공하는 Provider를 렌더링한다.
2088
- * 최상단에서 children을 감싸야 useToast 훅을 사용할 있다.
2089
- * @param props Provider 속성
2090
- * @returns 렌더링된 Provider와 토스트 컨테이너
2091
- */
2092
- declare const ToastProvider: ({ children, maxCount, closeAriaLabel, }: ToastProviderProps) => React$1.JSX.Element;
2093
-
2094
- /**
2095
- * 토스트 메시지를 표시하는 훅.
2096
- * ToastProvider 내부에서만 사용할 수 있다.
2097
- * @returns 토스트 메시지 표시 함수 객체
2235
+ * 모달을 렌더링한다.
2236
+ * react-spring 기반 진입/퇴출 모션 + 포커스 트랩 + 바디 스크롤 잠금.
2237
+ * @param props 모달 속성
2238
+ * @returns 열림 상태일 때 렌더링된 모달, 닫힘 상태면 null
2098
2239
  */
2099
- declare const useToast: () => {
2100
- /** 성공 메시지를 표시한다 */
2101
- success: (message: string, duration?: number) => void;
2102
- /** 오류 메시지를 표시한다 */
2103
- error: (message: string, duration?: number) => void;
2104
- /** 경고 메시지를 표시한다 */
2105
- warning: (message: string, duration?: number) => void;
2106
- /** 정보 메시지를 표시한다 */
2107
- info: (message: string, duration?: number) => void;
2108
- /** 기본 메시지를 표시한다 */
2109
- message: (message: string, duration?: number) => void;
2110
- };
2240
+ declare const Modal: ({ open, onClose, closeOnOverlay, width, title, description, footer, footerAlign, showCloseIcon, closeLabel, children, className, ariaLabel, ...props }: ModalProps) => React$1.ReactPortal | null;
2111
2241
 
2112
- interface ToggleProps extends Omit<React$1.ButtonHTMLAttributes<HTMLButtonElement>, "onChange"> {
2113
- /** 제어형 토글 상태 */
2114
- checked?: boolean;
2115
- /** 비제어형 초기 토글 상태 */
2116
- defaultChecked?: boolean;
2117
- /** 상태 변경 콜백 (canonical) */
2118
- onCheckedChange?: (checked: boolean) => void;
2119
- /** @deprecated `onCheckedChange` 를 사용하세요. */
2120
- onChange?: (checked: boolean) => void;
2121
- /** 토글 크기 (기본값: "sm") */
2122
- size?: "sm" | "md";
2123
- /** 비활성화 여부 */
2124
- disabled?: boolean;
2125
- /** 토글 접근성 레이블(스크린 리더용) */
2126
- ariaLabel: string;
2127
- /** 버튼 요소 참조 */
2128
- ref?: React$1.Ref<HTMLButtonElement>;
2242
+ type ThemeMode = "light" | "dark" | "system";
2243
+ type ResolvedTheme = "light" | "dark";
2244
+ interface ThemeContextValue {
2245
+ /** 현재 선택된 모드 (system 포함) */
2246
+ mode: ThemeMode;
2247
+ /** 실제로 적용된 테마 (system은 prefers-color-scheme으로 해석됨) */
2248
+ resolved: ResolvedTheme;
2249
+ /** 모드 변경 */
2250
+ setMode: (mode: ThemeMode) => void;
2129
2251
  }
2130
2252
  /**
2131
- * 토글을 렌더링한다.
2132
- * 제어형/비제어형 상태를 판별해 토글 로직을 수행하고 버튼 형태의 토글 UI를 반환한다.
2133
- * @param props 토글 속성
2134
- * @returns 렌더링된 토글 요소
2253
+ * ThemeProvider 안에서 호출. mode/resolved/setMode를 반환.
2254
+ * Provider 외부에서 호출하면 에러를 던진다.
2135
2255
  */
2136
- declare const Toggle: {
2137
- ({ checked, defaultChecked, onCheckedChange, onChange, size, disabled, className, ariaLabel, ref, ...props }: ToggleProps): React$1.JSX.Element;
2138
- displayName: string;
2139
- };
2140
-
2141
- interface TopLoadingProps {
2142
- /** 진행률 (0-100). undefined면 indeterminate 모드 */
2143
- progress?: number;
2144
- /** 로딩바 색상 (기본: primary) */
2145
- color?: string;
2146
- /** 로딩바 높이 (기본: 3px) */
2147
- height?: number;
2148
- /** 표시 여부 */
2149
- isLoading?: boolean;
2150
- /** 프로그레스 바의 접근성 레이블 (기본값: "Page loading") */
2151
- ariaLabel?: string;
2256
+ declare const useTheme: () => ThemeContextValue;
2257
+ interface ThemeProviderProps {
2258
+ /** 초기 테마 (기본값: "system") */
2259
+ defaultMode?: ThemeMode;
2260
+ /** localStorage 키 (기본값: "bt-theme"). null이면 저장 안 함 */
2261
+ storageKey?: string | null;
2262
+ /** 적용 대상 element selector (기본값: document.documentElement) */
2263
+ targetSelector?: string;
2264
+ children: React$1.ReactNode;
2152
2265
  }
2153
2266
  /**
2154
- * 상단 로딩바를 렌더링한다.
2155
- * 표시 여부와 진행률에 따라 determinate/indeterminate 상태를 구성한다.
2156
- * @param props 로딩바 속성
2157
- * @returns 렌더링된 로딩바 요소 또는 null
2267
+ * Bigtablet DS 테마 컨텍스트를 제공한다.
2268
+ * `data-theme` attribute를 root element에 적용해서 CSS 변수 레이어를 전환한다.
2269
+ *
2270
+ * @example
2271
+ * ```tsx
2272
+ * <ThemeProvider defaultMode="system">
2273
+ * <App />
2274
+ * </ThemeProvider>
2275
+ * ```
2158
2276
  */
2159
- declare const TopLoading: ({ progress, color, height, isLoading, ariaLabel, }: TopLoadingProps) => React$1.JSX.Element | null;
2277
+ declare const ThemeProvider: React$1.FC<ThemeProviderProps>;
2160
2278
 
2161
2279
  type ContainerSize = "sm" | "md" | "lg" | "xl" | "full";
2162
2280
  interface ContainerProps extends React$1.HTMLAttributes<HTMLDivElement> {
@@ -2187,6 +2305,54 @@ interface ContainerProps extends React$1.HTMLAttributes<HTMLDivElement> {
2187
2305
  */
2188
2306
  declare const Container: ({ size, center, as: Tag, ref, className, children, ...props }: ContainerProps) => React$1.JSX.Element;
2189
2307
 
2308
+ type GridCols = 1 | 2 | 3 | 4 | 5 | 6 | "auto";
2309
+ type GridGap = 0 | 4 | 8 | 12 | 16 | 20 | 24 | 32 | 40 | 48;
2310
+ interface GridProps extends React$1.HTMLAttributes<HTMLDivElement> {
2311
+ /**
2312
+ * 열 수. "auto" = auto-fill (minColWidth 사용)
2313
+ * @default 3
2314
+ */
2315
+ cols?: GridCols;
2316
+ /**
2317
+ * auto-fill 모드일 때 최소 열 너비
2318
+ * @default "280px"
2319
+ */
2320
+ minColWidth?: string;
2321
+ /**
2322
+ * 아이템 간격 (px). gap과 rowGap/colGap 동시 적용.
2323
+ * @default 24
2324
+ */
2325
+ gap?: GridGap;
2326
+ /** 행 간격 (gap을 override) */
2327
+ rowGap?: GridGap;
2328
+ /** 열 간격 (gap을 override) */
2329
+ colGap?: GridGap;
2330
+ /** 반응형 - compact(< 600px)에서 강제 1열 (기본 true) */
2331
+ singleColOnMobile?: boolean;
2332
+ /** 렌더링할 HTML 요소 */
2333
+ as?: React$1.ElementType;
2334
+ /** 루트 요소 ref (React 19 ref-as-prop) */
2335
+ ref?: React$1.Ref<HTMLElement>;
2336
+ }
2337
+ /**
2338
+ * CSS Grid 기반 2D 레이아웃 컨테이너.
2339
+ * 고정 열 수 또는 auto-fill 반응형 그리드.
2340
+ *
2341
+ * @example
2342
+ * ```tsx
2343
+ * // 3열 고정
2344
+ * <Grid cols={3} gap={24}>
2345
+ * <Card /><Card /><Card />
2346
+ * </Grid>
2347
+ *
2348
+ * // auto-fill (최소 280px)
2349
+ * <Grid cols="auto" minColWidth="280px" gap={16}>
2350
+ * {products.map(p => <MediaCard key={p.id} {...p} />)}
2351
+ * </Grid>
2352
+ * ```
2353
+ */
2354
+ declare const Grid: ({ cols, minColWidth, gap, rowGap, colGap, singleColOnMobile, as: Tag, ref, className, children, style, ...props }: GridProps) => React$1.JSX.Element;
2355
+
2190
2356
  type SectionSpacing = "xs" | "sm" | "md" | "lg" | "xl";
2191
2357
  type SectionBg = "default" | "dim" | "accent" | "inverted" | "transparent";
2192
2358
  interface SectionProps extends React$1.HTMLAttributes<HTMLElement> {
@@ -2268,52 +2434,4 @@ interface StackProps extends React$1.HTMLAttributes<HTMLDivElement> {
2268
2434
  */
2269
2435
  declare const Stack: ({ direction, gap, align, justify, wrap, as: Tag, ref, className, children, style, ...props }: StackProps) => React$1.JSX.Element;
2270
2436
 
2271
- type GridCols = 1 | 2 | 3 | 4 | 5 | 6 | "auto";
2272
- type GridGap = 0 | 4 | 8 | 12 | 16 | 20 | 24 | 32 | 40 | 48;
2273
- interface GridProps extends React$1.HTMLAttributes<HTMLDivElement> {
2274
- /**
2275
- * 열 수. "auto" = auto-fill (minColWidth 사용)
2276
- * @default 3
2277
- */
2278
- cols?: GridCols;
2279
- /**
2280
- * auto-fill 모드일 때 최소 열 너비
2281
- * @default "280px"
2282
- */
2283
- minColWidth?: string;
2284
- /**
2285
- * 아이템 간격 (px). gap과 rowGap/colGap 동시 적용.
2286
- * @default 24
2287
- */
2288
- gap?: GridGap;
2289
- /** 행 간격 (gap을 override) */
2290
- rowGap?: GridGap;
2291
- /** 열 간격 (gap을 override) */
2292
- colGap?: GridGap;
2293
- /** 반응형 - compact(< 600px)에서 강제 1열 (기본 true) */
2294
- singleColOnMobile?: boolean;
2295
- /** 렌더링할 HTML 요소 */
2296
- as?: React$1.ElementType;
2297
- /** 루트 요소 ref (React 19 ref-as-prop) */
2298
- ref?: React$1.Ref<HTMLElement>;
2299
- }
2300
- /**
2301
- * CSS Grid 기반 2D 레이아웃 컨테이너.
2302
- * 고정 열 수 또는 auto-fill 반응형 그리드.
2303
- *
2304
- * @example
2305
- * ```tsx
2306
- * // 3열 고정
2307
- * <Grid cols={3} gap={24}>
2308
- * <Card /><Card /><Card />
2309
- * </Grid>
2310
- *
2311
- * // auto-fill (최소 280px)
2312
- * <Grid cols="auto" minColWidth="280px" gap={16}>
2313
- * {products.map(p => <MediaCard key={p.id} {...p} />)}
2314
- * </Grid>
2315
- * ```
2316
- */
2317
- declare const Grid: ({ cols, minColWidth, gap, rowGap, colGap, singleColOnMobile, as: Tag, ref, className, children, style, ...props }: GridProps) => React$1.JSX.Element;
2318
-
2319
- export { Accordion, type AccordionItem, type AccordionProps, AlertProvider, Avatar, type AvatarProps, type AvatarShape, type AvatarSize, Badge, type BadgeProps, type BadgeShape, type BadgeSize, type BadgeVariant, BottomNav, BottomNavItem, type BottomNavItemProps, type BottomNavProps, BottomNavSpacer, Breadcrumb, type BreadcrumbItem, type BreadcrumbProps, Button, type ButtonProps, Card, type CardFooterAlign, type CardProps, type CardVariant, Checkbox, type CheckboxProps, Chip, type ChipProps, type ChipSize, type ChipTone, type ChipType, Container, type ContainerProps, type ContainerSize, DatePicker, type DatePickerProps, Divider, type DividerProps, Drawer, type DrawerPlacement, type DrawerProps, Dropdown, type DropdownOption, type DropdownProps, type DropdownSize, EmptyState, type EmptyStateProps, ErrorState, type ErrorStateProps, type ErrorStateVariant, FileInput, type FileInputProps, Grid, type GridCols, type GridGap, type GridProps, Hero, type HeroAction, type HeroAlign, type HeroHeight, type HeroOverlay, type HeroProps, Icon, IconButton, type IconButtonProps, type IconButtonSize, type IconButtonVariant, type IconProps, type ImeStrategy, LinearProgress, type LinearProgressProps, ListItem, type ListItemProps, MediaCard, type MediaCardImage, type MediaCardImagePosition, type MediaCardProps, type MediaCardShadow, Menu, type MenuItem, type MenuProps, Modal, type ModalProps, NavBar, type NavBarLayout, type NavBarLocaleConfig, type NavBarLocaleOption, type NavBarProps, type NavBarVariant, NavLink, type NavLinkProps, OtpInput, type OtpInputProps, Pagination, type PaginationProps, Popover, type PopoverPlacement, type PopoverProps, Radio, RadioGroup, type RadioGroupOrientation, type RadioGroupProps, type RadioGroupSize, type RadioProps, type ResolvedTheme, Section, type SectionBg, type SectionProps, type SectionSpacing, Sidebar, SidebarItem, type SidebarItemProps, type SidebarMode, type SidebarProps, SidebarSection, type SidebarSectionProps, Skeleton, type SkeletonProps, type SkeletonVariant, Spinner, type SpinnerProps, Stack, type StackAlign, type StackDirection, type StackGap, type StackJustify, type StackProps, type StackWrap, Tab, TabList, type TabListProps, TabPanel, type TabPanelProps, type TabProps, Table, type TableColumn, type TableProps, type TableSize, type TableSort, type TableSortDirection, Tabs, type TabsProps, type TabsSize, type TabsVariant, TextField, type TextFieldProps, type TextFieldSize, Textarea, type TextareaProps, type TextareaResize, type TextareaSize, type ThemeMode, ThemeProvider, type ThemeProviderProps, ToastProvider, Toggle, type ToggleProps, Tooltip, type TooltipPlacement, type TooltipProps, TopLoading, type TopLoadingProps, a11y, baseBorderWidth, baseColors, baseTypography, borderWidth, breakpoints, cn, colors, elevation, iconSize, motion, opacity, radius, skeleton, spacing, typography, useAlert, useFocusTrap, useReducedMotion, useSpringHover, useSpringPresence, useTheme, useToast, zIndex };
2437
+ export { Accordion, type AccordionItem, type AccordionProps, AlertProvider, Avatar, type AvatarProps, type AvatarShape, type AvatarSize, Badge, type BadgeProps, type BadgeShape, type BadgeSize, type BadgeVariant, BottomNav, BottomNavItem, type BottomNavItemProps, type BottomNavProps, BottomNavSpacer, Breadcrumb, type BreadcrumbItem, type BreadcrumbProps, Button, type ButtonProps, Card, type CardFooterAlign, type CardProps, type CardVariant, Checkbox, type CheckboxProps, Chip, type ChipProps, type ChipSize, type ChipTone, type ChipType, Container, type ContainerProps, type ContainerSize, type CropImageSize, type CropOffset, type CropRect, DatePicker, type DatePickerProps, Divider, type DividerProps, Drawer, type DrawerPlacement, type DrawerProps, Dropdown, type DropdownOption, type DropdownProps, type DropdownSize, EmptyState, type EmptyStateProps, ErrorState, type ErrorStateProps, type ErrorStateVariant, FileInput, type FileInputProps, Grid, type GridCols, type GridGap, type GridProps, Hero, type HeroAction, type HeroAlign, type HeroHeight, type HeroOverlay, type HeroProps, Icon, IconButton, type IconButtonProps, type IconButtonSize, type IconButtonVariant, type IconProps, ImageCropper, type ImageCropperHandle, type ImageCropperProps, type ImeStrategy, LinearProgress, type LinearProgressProps, ListItem, type ListItemProps, MediaCard, type MediaCardImage, type MediaCardImagePosition, type MediaCardProps, type MediaCardShadow, Menu, type MenuItem, type MenuProps, Modal, type ModalProps, NavBar, type NavBarLayout, type NavBarLocaleConfig, type NavBarLocaleOption, type NavBarProps, type NavBarVariant, NavLink, type NavLinkProps, OtpInput, type OtpInputProps, Pagination, type PaginationProps, Popover, type PopoverPlacement, type PopoverProps, Radio, RadioGroup, type RadioGroupOrientation, type RadioGroupProps, type RadioGroupSize, type RadioProps, type ResolvedTheme, Section, type SectionBg, type SectionProps, type SectionSpacing, Sidebar, SidebarItem, type SidebarItemProps, type SidebarMode, type SidebarProps, SidebarSection, type SidebarSectionProps, Skeleton, type SkeletonProps, type SkeletonVariant, Spinner, type SpinnerProps, Stack, type StackAlign, type StackDirection, type StackGap, type StackJustify, type StackProps, type StackWrap, Tab, TabList, type TabListProps, TabPanel, type TabPanelProps, type TabProps, Table, type TableColumn, type TableProps, type TableSize, type TableSort, type TableSortDirection, Tabs, type TabsProps, type TabsSize, type TabsVariant, TextField, type TextFieldProps, type TextFieldSize, Textarea, type TextareaProps, type TextareaResize, type TextareaSize, type ThemeMode, ThemeProvider, type ThemeProviderProps, ToastProvider, Toggle, type ToggleProps, Tooltip, type TooltipPlacement, type TooltipProps, TopLoading, type TopLoadingProps, a11y, baseBorderWidth, baseColors, baseTypography, borderWidth, breakpoints, cn, colors, elevation, iconSize, motion, opacity, radius, skeleton, spacing, typography, useAlert, useFocusTrap, useReducedMotion, useSpringHover, useSpringPresence, useTheme, useToast, zIndex };