@bigtablet/design-system 2.4.4 → 3.0.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,12 +1,463 @@
1
1
  import * as React$1 from 'react';
2
- import React__default from 'react';
2
+ import * as _react_spring_web from '@react-spring/web';
3
3
  import * as react_jsx_runtime from 'react/jsx-runtime';
4
+ import { LucideProps, LucideIcon } from 'lucide-react';
5
+ export { LucideIcon, LucideProps } from 'lucide-react';
6
+
7
+ /**
8
+ * ClassValue type for cn() utility
9
+ * Supports strings, numbers, booleans, arrays, and conditional objects
10
+ */
11
+ type ClassValue = string | number | boolean | undefined | null | ClassValue[] | Record<string, boolean | undefined | null>;
12
+ /**
13
+ * Utility for combining class names (clsx-like)
14
+ * Filters out falsy values and joins with space
15
+ *
16
+ * @example
17
+ * // String arguments
18
+ * cn("btn", "btn--primary")
19
+ * // "btn btn--primary"
20
+ *
21
+ * @example
22
+ * // Conditional with boolean
23
+ * cn("btn", isActive && "btn--active")
24
+ * // "btn btn--active" (if isActive is true)
25
+ *
26
+ * @example
27
+ * // Object syntax
28
+ * cn("btn", { "btn--active": isActive, "btn--disabled": isDisabled })
29
+ * // "btn btn--active" (if isActive is true, isDisabled is false)
30
+ *
31
+ * @example
32
+ * // Array syntax
33
+ * cn(["btn", "btn--primary"], className)
34
+ * // "btn btn--primary custom-class"
35
+ */
36
+ declare const cn: (...classes: ClassValue[]) => string;
37
+
38
+ declare function useFocusTrap(containerRef: React$1.RefObject<HTMLElement | null>, isActive: boolean): void;
39
+
40
+ /**
41
+ * 마우스 hover 시 spring 기반 lift 효과를 만든다. 카드/CTA 강조에 사용.
42
+ *
43
+ * @example
44
+ * ```tsx
45
+ * const { style, bind } = useSpringHover();
46
+ * return <animated.div style={style} {...bind}>...</animated.div>;
47
+ * ```
48
+ */
49
+ declare function useSpringHover({ scale, lift, }?: {
50
+ /** hover 시 scale 비율 (기본 1.02) */
51
+ scale?: number;
52
+ /** hover 시 Y축 이동 px (기본 -2 = 살짝 떠오름) */
53
+ lift?: number;
54
+ }): {
55
+ style: {
56
+ transform: _react_spring_web.SpringValue<string>;
57
+ };
58
+ bind: {
59
+ onMouseEnter: () => void;
60
+ onMouseLeave: () => void;
61
+ onFocus: () => void;
62
+ onBlur: () => void;
63
+ };
64
+ };
65
+
66
+ /**
67
+ * 컴포넌트가 마운트/언마운트되거나 visible 상태가 토글될 때 자연스러운 진입/퇴출을 만든다.
68
+ * Vercel/Linear 스타일의 부드러운 spring 모션.
69
+ *
70
+ * @example
71
+ * ```tsx
72
+ * const style = useSpringPresence({ visible: isOpen });
73
+ * return <animated.div style={style}>...</animated.div>;
74
+ * ```
75
+ */
76
+ declare function useSpringPresence({ visible, from, onExitComplete, }: {
77
+ /** 보이는 상태인지 — false면 사라짐 모션 */
78
+ visible: boolean;
79
+ /** 진입 시 시작 transform (기본: 아래에서 살짝 올라옴) */
80
+ from?: string;
81
+ /** exit 모션 완료 시 호출 — 부모에서 unmount 트리거용 */
82
+ onExitComplete?: () => void;
83
+ }): {
84
+ opacity: _react_spring_web.SpringValue<number>;
85
+ transform: _react_spring_web.SpringValue<string>;
86
+ };
87
+
88
+ interface AccordionItem {
89
+ key: string;
90
+ title: React$1.ReactNode;
91
+ content: React$1.ReactNode;
92
+ disabled?: boolean;
93
+ }
94
+ interface AccordionProps extends Omit<React$1.HTMLAttributes<HTMLDivElement>, "onChange"> {
95
+ /** 아이템 목록 */
96
+ items: AccordionItem[];
97
+ /** 여러 개 동시에 펼침 허용 (기본 false — 한 번에 하나) */
98
+ multiple?: boolean;
99
+ /** 기본으로 펼쳐진 키들 */
100
+ defaultOpenKeys?: string[];
101
+ /** 제어형: 펼쳐진 키들 */
102
+ openKeys?: string[];
103
+ /** 펼침/접힘 콜백 */
104
+ onChange?: (openKeys: string[]) => void;
105
+ }
106
+ /**
107
+ * 펼침/접힘 영역. FAQ, 설정 그룹, details 패턴.
108
+ *
109
+ * @example
110
+ * ```tsx
111
+ * <Accordion items={faqItems} multiple />
112
+ * ```
113
+ */
114
+ declare const Accordion: ({ items, multiple, defaultOpenKeys, openKeys: controlledKeys, onChange, className, ...props }: AccordionProps) => react_jsx_runtime.JSX.Element;
115
+
116
+ type AvatarSize = "xs" | "sm" | "md" | "lg" | "xl";
117
+ type AvatarShape = "circle" | "square";
118
+ interface AvatarProps extends React$1.HTMLAttributes<HTMLSpanElement> {
119
+ /** 이미지 URL */
120
+ src?: string;
121
+ /** alt 텍스트 (이미지일 때) 또는 initials 추출용 이름 */
122
+ name?: string;
123
+ /** 크기 (기본값: "md"). xs=24 / sm=32 / md=40 / lg=48 / xl=64 */
124
+ size?: AvatarSize;
125
+ /** 모양 (기본값: "circle") */
126
+ shape?: AvatarShape;
127
+ /** 색상 (기본값: navy accent) */
128
+ bgColor?: string;
129
+ }
130
+ /**
131
+ * 사용자 프로필 아바타. 이미지 없으면 이름의 initials로 fallback.
132
+ *
133
+ * @example
134
+ * ```tsx
135
+ * <Avatar src="/me.jpg" name="박상민" />
136
+ * <Avatar name="박상민" /> // initials "박"
137
+ * <Avatar name="Sangmin Park" size="lg" /> // initials "SP"
138
+ * ```
139
+ */
140
+ declare const Avatar: ({ src, name, size, shape, bgColor, className, style, ...props }: AvatarProps) => react_jsx_runtime.JSX.Element;
141
+
142
+ type BadgeVariant = "accent" | "neutral" | "info" | "success" | "warning" | "error";
143
+ type BadgeShape = "dot" | "count" | "label";
144
+ type BadgeSize = "sm" | "md" | "lg";
145
+ interface BadgeProps extends React$1.HTMLAttributes<HTMLSpanElement> {
146
+ /** 색상 variant (기본값: "accent") */
147
+ variant?: BadgeVariant;
148
+ /** 모양 (기본값: "label"). dot=점만 / count=숫자 / label=텍스트 */
149
+ shape?: BadgeShape;
150
+ /**
151
+ * 사이즈 (기본값: "md"). 웹 기본.
152
+ * - sm: 컴팩트 (아이콘 위 알림 dot, 모바일)
153
+ * - md: 일반 웹 (admin/marketing)
154
+ * - lg: 강조 (Hero 위 배지, 카테고리)
155
+ */
156
+ size?: BadgeSize;
157
+ /** count shape 일 때 표시할 숫자. max를 넘으면 "max+" */
158
+ count?: number;
159
+ /** count 최댓값 (기본 99) */
160
+ max?: number;
161
+ }
162
+ /**
163
+ * 작은 상태 표시. 카운트/dot/라벨 3가지 모양.
164
+ *
165
+ * @example
166
+ * ```tsx
167
+ * <Badge shape="dot" variant="error" />
168
+ * <Badge shape="count" count={5} />
169
+ * <Badge>New</Badge>
170
+ * ```
171
+ */
172
+ declare const Badge: ({ variant, shape, size, count, max, className, children, ...props }: BadgeProps) => react_jsx_runtime.JSX.Element;
173
+
174
+ interface BreadcrumbItem {
175
+ /** 표시 텍스트 */
176
+ label: React$1.ReactNode;
177
+ /** 클릭 시 이동할 URL. 없으면 현재 페이지로 간주 */
178
+ href?: string;
179
+ /** 클릭 콜백 (href 없이 사용 가능) */
180
+ onClick?: (e: React$1.MouseEvent<HTMLElement>) => void;
181
+ }
182
+ interface BreadcrumbProps extends React$1.HTMLAttributes<HTMLElement> {
183
+ /** 경로 아이템 배열. 마지막은 현재 페이지로 간주 */
184
+ items: BreadcrumbItem[];
185
+ /** 구분자 (기본값: ChevronRight 아이콘) */
186
+ separator?: React$1.ReactNode;
187
+ }
188
+ /**
189
+ * 페이지 위계 네비게이션. 마지막 아이템은 현재 페이지로 표시.
190
+ *
191
+ * @example
192
+ * ```tsx
193
+ * <Breadcrumb items={[
194
+ * { label: "홈", href: "/" },
195
+ * { label: "블로그", href: "/blog" },
196
+ * { label: "글 제목" },
197
+ * ]} />
198
+ * ```
199
+ */
200
+ declare const Breadcrumb: ({ items, separator, className, ...props }: BreadcrumbProps) => react_jsx_runtime.JSX.Element;
201
+
202
+ interface EmptyStateProps extends Omit<React$1.HTMLAttributes<HTMLDivElement>, "title"> {
203
+ /** 일러스트 영역 (아이콘/이미지 등) */
204
+ illustration?: React$1.ReactNode;
205
+ /** 제목 */
206
+ title?: React$1.ReactNode;
207
+ /** 보조 설명 */
208
+ description?: React$1.ReactNode;
209
+ /** 액션 영역 (Button 등) */
210
+ action?: React$1.ReactNode;
211
+ /** 크기 (기본 "md") */
212
+ size?: "sm" | "md" | "lg";
213
+ }
214
+ /**
215
+ * 빈 상태 표시 — 데이터 없음, 검색 결과 없음, 시작 가이드 등.
216
+ *
217
+ * @example
218
+ * ```tsx
219
+ * <EmptyState
220
+ * illustration={<InboxIcon size={64} />}
221
+ * title="받은 메일이 없습니다"
222
+ * description="새 메일이 오면 여기 표시됩니다."
223
+ * action={<Button>새 메일 작성</Button>}
224
+ * />
225
+ * ```
226
+ */
227
+ declare const EmptyState: ({ illustration, title, description, action, size, className, ...props }: EmptyStateProps) => react_jsx_runtime.JSX.Element;
228
+
229
+ interface MenuItem {
230
+ key: string;
231
+ label: React$1.ReactNode;
232
+ icon?: React$1.ReactNode;
233
+ disabled?: boolean;
234
+ /** 클릭 시 호출 — 자동으로 메뉴 닫힘 */
235
+ onSelect?: () => void;
236
+ /** destructive 액션 (삭제 등) — 빨간 텍스트 */
237
+ destructive?: boolean;
238
+ }
239
+ interface MenuProps {
240
+ /** 메뉴 아이템들 */
241
+ items: MenuItem[];
242
+ /** trigger 요소 — 클릭 시 메뉴 열림 */
243
+ trigger: React$1.ReactElement;
244
+ /** 정렬 (기본 "start") */
245
+ align?: "start" | "end";
246
+ }
247
+ /**
248
+ * 컨텍스트 메뉴. trigger 클릭 시 아래에 메뉴 표시. 외부 클릭/Esc로 닫힘.
249
+ * Form Dropdown과 다름 — 액션 메뉴 (Edit/Delete 등).
250
+ *
251
+ * @example
252
+ * ```tsx
253
+ * <Menu
254
+ * trigger={<IconButton icon={<MoreIcon />} />}
255
+ * items={[
256
+ * { key: "edit", label: "편집", onSelect: handleEdit },
257
+ * { key: "del", label: "삭제", onSelect: handleDel, destructive: true },
258
+ * ]}
259
+ * />
260
+ * ```
261
+ */
262
+ declare const Menu: ({ items, trigger, align }: MenuProps) => react_jsx_runtime.JSX.Element;
263
+
264
+ type NavBarVariant = "default" | "transparent" | "accent";
265
+ type NavBarLayout = "contained" | "fluid";
266
+ interface NavBarLocaleOption {
267
+ value: string;
268
+ label: string;
269
+ }
270
+ interface NavBarLocaleConfig {
271
+ /** 현재 선택된 locale 값 (예: "ko") */
272
+ current: string;
273
+ /** 가능한 옵션 */
274
+ options: NavBarLocaleOption[];
275
+ /** locale 변경 콜백 */
276
+ onChange: (next: string) => void;
277
+ /** 표시 라벨 — 기본은 옵션의 label, 미지정 시 short code 표시 */
278
+ hideLabel?: boolean;
279
+ }
280
+ interface NavBarProps extends React$1.HTMLAttributes<HTMLElement> {
281
+ /** 왼쪽 brand/로고 영역 */
282
+ brand?: React$1.ReactNode;
283
+ /** 중앙 또는 우측의 검색 영역 (TextField 등) */
284
+ searchSlot?: React$1.ReactNode;
285
+ /** 오른쪽 액션 영역 (IconButton, primary CTA Button 등) */
286
+ actions?: React$1.ReactNode;
287
+ /** i18n locale switcher (Globe 아이콘 + 드롭다운) */
288
+ locale?: NavBarLocaleConfig;
289
+ /** 우측 프로필 영역 (Avatar/ProfileButton) */
290
+ profile?: React$1.ReactNode;
291
+ /** actions / locale 와 profile 사이 수직 divider 표시 (기본 true, profile 있을 때만 표시) */
292
+ divider?: boolean;
293
+ /** 시각 variant — default(흰 bg + 회색 border), transparent(투명, hero 위에), accent(navy bg) */
294
+ variant?: NavBarVariant;
295
+ /** 레이아웃 — contained(max 1200, marketing) / fluid(full width, admin/dashboard) */
296
+ layout?: NavBarLayout;
297
+ /** sticky 고정 여부 */
298
+ sticky?: boolean;
299
+ }
300
+ /**
301
+ * 페이지 상단 네비게이션 바. 마케팅/B2C 헤더 + admin/dashboard 헤더 둘 다 지원.
302
+ *
303
+ * @example marketing
304
+ * ```tsx
305
+ * <NavBar brand={<Logo />} actions={<Button>로그인</Button>}>
306
+ * <NavLink href="/about">About</NavLink>
307
+ * <NavLink href="/blog" active>Blog</NavLink>
308
+ * </NavBar>
309
+ * ```
310
+ *
311
+ * @example admin/dashboard
312
+ * ```tsx
313
+ * <NavBar
314
+ * brand={<OrgButton />}
315
+ * searchSlot={<TextField placeholder="검색" />}
316
+ * actions={<IconButton icon={Calendar} aria-label="캘린더" />}
317
+ * locale={{ current: "ko", options: [...], onChange: setLocale }}
318
+ * profile={<Avatar name="박상민" />}
319
+ * />
320
+ * ```
321
+ */
322
+ declare const NavBar: ({ brand, searchSlot, actions, locale, profile, divider, variant, layout, sticky, className, children, ...props }: NavBarProps) => react_jsx_runtime.JSX.Element;
323
+ interface NavLinkProps extends React$1.AnchorHTMLAttributes<HTMLAnchorElement> {
324
+ /** 현재 활성 페이지 여부 */
325
+ active?: boolean;
326
+ }
327
+ declare const NavLink: ({ active, className, children, ...props }: NavLinkProps) => react_jsx_runtime.JSX.Element;
328
+
329
+ interface SidebarProps extends Omit<React$1.HTMLAttributes<HTMLElement>, "onChange"> {
330
+ /** 상단 brand 영역 (펼친 상태 로고) */
331
+ header?: React$1.ReactNode;
332
+ /** collapsed 상태 헤더 (보통 favicon). 미지정 시 collapsed 에서도 `header` 사용. */
333
+ headerCollapsed?: React$1.ReactNode;
334
+ /** 하단 영역 (사용자/설정/로그아웃 등) */
335
+ footer?: React$1.ReactNode;
336
+ /** collapsed 상태 (controlled) */
337
+ collapsed?: boolean;
338
+ /** collapsed 초기값 (uncontrolled). `collapsed` 미지정 시 사용. */
339
+ defaultCollapsed?: boolean;
340
+ /** collapsed 변경 콜백 (controlled/uncontrolled 모두에서 호출) */
341
+ onCollapsedChange?: (collapsed: boolean) => void;
342
+ /** 내장 collapse 토글 버튼 표시 (기본 true) */
343
+ collapsible?: boolean;
344
+ /** 토글 버튼 a11y label (기본 "사이드바 토글") */
345
+ toggleLabel?: string;
346
+ /** 너비 (기본 240px) */
347
+ width?: number;
348
+ /** collapsed 너비 (기본 64px) */
349
+ collapsedWidth?: number;
350
+ }
351
+ /**
352
+ * admin/dashboard 좌측 네비게이션.
353
+ * `SidebarItem` + `SidebarSection` 과 함께 사용.
354
+ *
355
+ * @example
356
+ * ```tsx
357
+ * <Sidebar
358
+ * header={<Logo />}
359
+ * headerCollapsed={<Favicon />}
360
+ * defaultCollapsed={false}
361
+ * >
362
+ * <SidebarItem icon={<HomeIcon />} active>홈</SidebarItem>
363
+ * </Sidebar>
364
+ * ```
365
+ */
366
+ declare const Sidebar: ({ header, headerCollapsed, footer, collapsed: collapsedProp, defaultCollapsed, onCollapsedChange, collapsible, toggleLabel, width, collapsedWidth, className, children, style, ...props }: SidebarProps) => react_jsx_runtime.JSX.Element;
367
+ interface SidebarItemProps extends React$1.ButtonHTMLAttributes<HTMLButtonElement> {
368
+ /** 왼쪽 아이콘 */
369
+ icon?: React$1.ReactNode;
370
+ /** 현재 활성 상태 */
371
+ active?: boolean;
372
+ /** 오른쪽 trailing (Badge 등) */
373
+ trailing?: React$1.ReactNode;
374
+ /** 링크 컴포넌트 (Next Link 등). `asChild` 패턴 — `as="a" href="..."` */
375
+ as?: "button" | "a";
376
+ /** as="a"일 때 사용 */
377
+ href?: string;
378
+ }
379
+ declare const SidebarItem: ({ icon, active, trailing, as, href, className, children, type, ...props }: SidebarItemProps) => react_jsx_runtime.JSX.Element;
380
+ interface SidebarSectionProps extends React$1.HTMLAttributes<HTMLDivElement> {
381
+ /** 섹션 라벨 (collapsed 상태에선 hidden) */
382
+ label?: string;
383
+ }
384
+ /** SidebarItem 그룹 라벨. collapsed에선 sr-only로 숨김. */
385
+ declare const SidebarSection: ({ label, className, children, ...props }: SidebarSectionProps) => react_jsx_runtime.JSX.Element;
386
+
387
+ type TabsVariant = "line" | "fills";
388
+ type TabsSize = "sm" | "md";
389
+ interface TabsProps extends Omit<React$1.HTMLAttributes<HTMLDivElement>, "onChange"> {
390
+ /** 제어형: 현재 활성 tab의 value */
391
+ value?: string;
392
+ /** 비제어형: 초기 활성 tab의 value */
393
+ defaultValue?: string;
394
+ /** value 변경 콜백 */
395
+ onValueChange?: (value: string) => void;
396
+ /** 시각 스타일 (기본값: "line"). line=하단 underline, pills=둥근 박스 */
397
+ variant?: TabsVariant;
398
+ /** 크기 (기본값: "md") */
399
+ size?: TabsSize;
400
+ }
401
+ /**
402
+ * 탭 컨테이너. TabList + TabPanel을 자식으로 받음.
403
+ * 컨텍스트로 value/onValueChange를 자식들에게 공유.
404
+ * - 제어형: `value` + `onValueChange`
405
+ * - 비제어형: `defaultValue`
406
+ */
407
+ declare const Tabs: ({ value: controlledValue, defaultValue, onValueChange, variant, size, className, children, ...props }: TabsProps) => react_jsx_runtime.JSX.Element;
408
+ interface TabListProps extends React$1.HTMLAttributes<HTMLDivElement> {
409
+ /** 스크린리더 라벨 */
410
+ ariaLabel?: string;
411
+ }
412
+ declare const TabList: ({ ariaLabel, className, children, ...props }: TabListProps) => react_jsx_runtime.JSX.Element;
413
+ interface TabProps extends Omit<React$1.ButtonHTMLAttributes<HTMLButtonElement>, "value"> {
414
+ /** 이 tab의 value */
415
+ value: string;
416
+ }
417
+ declare const Tab: ({ value, className, children, onClick, ...props }: TabProps) => react_jsx_runtime.JSX.Element;
418
+ interface TabPanelProps extends React$1.HTMLAttributes<HTMLDivElement> {
419
+ /** 이 panel을 활성화할 tab의 value */
420
+ value: string;
421
+ /** 비활성 panel을 unmount 할지 (기본 true). false면 display: none으로 유지 */
422
+ unmountInactive?: boolean;
423
+ }
424
+ declare const TabPanel: ({ value, unmountInactive, className, children, ...props }: TabPanelProps) => react_jsx_runtime.JSX.Element | null;
425
+
426
+ type TooltipPlacement = "top" | "bottom" | "left" | "right";
427
+ interface TooltipProps {
428
+ /** 툴팁 콘텐츠 */
429
+ content: React$1.ReactNode;
430
+ /** 위치 (기본값: "top") */
431
+ placement?: TooltipPlacement;
432
+ /** hover 후 지연 시간 ms (기본 200) */
433
+ delay?: number;
434
+ /** 비활성화 — children만 그대로 렌더, 툴팁 없음 */
435
+ disabled?: boolean;
436
+ children: React$1.ReactElement;
437
+ }
438
+ /**
439
+ * hover/focus 시 추가 정보를 보여주는 툴팁. react-spring fade+slide entrance.
440
+ *
441
+ * @example
442
+ * ```tsx
443
+ * <Tooltip content="저장하기">
444
+ * <IconButton icon={<SaveIcon />} />
445
+ * </Tooltip>
446
+ * ```
447
+ */
448
+ declare const Tooltip: ({ content, placement, delay, disabled, children, }: TooltipProps) => react_jsx_runtime.JSX.Element;
4
449
 
5
450
  declare const a11y: {
6
451
  readonly focusRing: "0 0 0 3px rgba(0, 0, 0, 0.15)";
7
452
  readonly focusRingError: "0 0 0 3px rgba(239, 68, 68, 0.15)";
8
453
  readonly focusRingSuccess: "0 0 0 3px rgba(16, 185, 129, 0.15)";
9
454
  readonly tapMinSize: "44px";
455
+ readonly tapTarget: {
456
+ readonly dense: "32px";
457
+ readonly compact: "40px";
458
+ readonly comfortable: "48px";
459
+ readonly spacious: "56px";
460
+ };
10
461
  };
11
462
 
12
463
  declare const baseBorderWidth: {
@@ -17,6 +468,7 @@ declare const baseBorderWidth: {
17
468
  declare const borderWidth: {
18
469
  readonly none: "0px";
19
470
  readonly standard: "1px";
471
+ readonly thick: "2px";
20
472
  readonly indicator: "2px";
21
473
  };
22
474
 
@@ -32,6 +484,7 @@ declare const baseColors: {
32
484
  readonly blue600: "#1A73E8";
33
485
  readonly neutral0: "#FFFFFF";
34
486
  readonly neutral50: "#F4F4F4";
487
+ readonly neutral100: "#F2F2F2";
35
488
  readonly neutral200: "#E5E5E5";
36
489
  readonly neutral300: "#999999";
37
490
  readonly neutral400: "#B3B3B3";
@@ -44,6 +497,16 @@ declare const baseColors: {
44
497
  readonly statusSuccess: "#10B981";
45
498
  readonly statusWarning: "#F59E0B";
46
499
  readonly statusInfo: "#3B82F6";
500
+ readonly navy50: "#F2F5F8";
501
+ readonly navy100: "#DDE3E9";
502
+ readonly navy200: "#B4C2CD";
503
+ readonly navy300: "#7AA5D2";
504
+ readonly navy400: "#5A8DCB";
505
+ readonly navy500: "#4C7CB6";
506
+ readonly navy600: "#47555E";
507
+ readonly navy700: "#3D4852";
508
+ readonly navy800: "#303841";
509
+ readonly navy900: "#1F2630";
47
510
  readonly alphaBlack5: "rgba(0, 0, 0, 0.05)";
48
511
  readonly alphaBlack8: "rgba(0, 0, 0, 0.08)";
49
512
  readonly alphaBlack12: "rgba(26, 26, 26, 0.12)";
@@ -93,6 +556,14 @@ declare const colors: {
93
556
  readonly warning: "#F59E0B";
94
557
  readonly info: "#3B82F6";
95
558
  };
559
+ readonly accent: {
560
+ readonly subtle: "#F2F5F8";
561
+ readonly muted: "#DDE3E9";
562
+ readonly light: "#7AA5D2";
563
+ readonly default: "#47555E";
564
+ readonly strong: "#303841";
565
+ readonly onSurface: "#FFFFFF";
566
+ };
96
567
  };
97
568
 
98
569
  declare const elevation: {
@@ -114,6 +585,14 @@ declare const motion: {
114
585
  readonly slide: "0.25s ease-in-out";
115
586
  readonly scale: "0.2s cubic-bezier(0.2, 0.8, 0.2, 1)";
116
587
  readonly state: "0.18s ease-in-out";
588
+ readonly enterFast: "0.15s cubic-bezier(0.16, 1, 0.3, 1)";
589
+ readonly enterBase: "0.2s cubic-bezier(0.16, 1, 0.3, 1)";
590
+ readonly exitFast: "0.12s cubic-bezier(0.4, 0, 1, 1)";
591
+ readonly exitBase: "0.15s cubic-bezier(0.4, 0, 1, 1)";
592
+ };
593
+ readonly easing: {
594
+ readonly enter: "cubic-bezier(0.16, 1, 0.3, 1)";
595
+ readonly exit: "cubic-bezier(0.4, 0, 1, 1)";
117
596
  };
118
597
  };
119
598
 
@@ -226,6 +705,7 @@ declare const baseTypography: {
226
705
  };
227
706
  readonly letterSpacing: {
228
707
  readonly normal: "0px";
708
+ readonly tight: "0.32px";
229
709
  };
230
710
  };
231
711
  declare const typography: {
@@ -448,8 +928,17 @@ interface AlertOptions {
448
928
  cancelText?: string;
449
929
  /** 취소 버튼 표시 여부 (기본값: false) */
450
930
  showCancel?: boolean;
931
+ /**
932
+ * Destructive 액션 여부. true 시 확인 버튼이 빨간 강조(danger)로 표시되고
933
+ * 취소 버튼은 outline으로 유지. 위험성을 시각적으로 표현해 사용자가 인지 가능.
934
+ * (Material/shadcn/Radix 표준 패턴)
935
+ * @default false
936
+ */
937
+ destructive?: boolean;
451
938
  /** 액션 버튼 정렬 (기본값: "right") */
452
939
  actionsAlign?: AlertActionsAlign;
940
+ /** 변형 아이콘 표시 여부 (기본값: false). 원하면 명시적으로 켜기 */
941
+ showIcon?: boolean;
453
942
  /** 확인 버튼 클릭 시 호출되는 콜백 */
454
943
  onConfirm?: () => void;
455
944
  /** 취소 버튼 클릭 시 호출되는 콜백 */
@@ -458,24 +947,13 @@ interface AlertOptions {
458
947
  interface AlertContextValue {
459
948
  showAlert: (options: AlertOptions) => void;
460
949
  }
461
- /**
462
- * AlertContext를 사용하는 훅.
463
- * Provider 외부에서 호출되면 오류를 던진다.
464
- * @returns alert 컨트롤러
465
- */
466
950
  declare const useAlert: () => AlertContextValue;
467
- /**
468
- * 알림 모달을 제어하는 Provider를 렌더링한다.
469
- * 내부 상태를 통해 AlertModal 표시와 확인/취소 흐름을 관리한다.
470
- * @param props Provider 속성
471
- * @returns 렌더링된 Provider와 모달
472
- */
473
951
  declare const AlertProvider: React$1.FC<{
474
952
  children: React$1.ReactNode;
475
953
  }>;
476
954
 
477
955
  type ButtonVariant = "filled" | "tonal" | "outline" | "text";
478
- type ButtonSize = "sm" | "md" | "xl";
956
+ type ButtonSize = "sm" | "md" | "lg" | "xl";
479
957
  interface ButtonProps extends React$1.ButtonHTMLAttributes<HTMLButtonElement> {
480
958
  /** 버튼 스타일 변형 (기본값: "filled") */
481
959
  variant?: ButtonVariant;
@@ -489,15 +967,21 @@ interface ButtonProps extends React$1.ButtonHTMLAttributes<HTMLButtonElement> {
489
967
  fullWidth?: boolean;
490
968
  /** border-radius 토큰 (기본값: "full") */
491
969
  radius?: "none" | "xs" | "sm" | "md" | "lg" | "xl" | "full";
970
+ /**
971
+ * 위험한 액션 (삭제/취소 등) — 빨간 강조.
972
+ * filled: 빨간 bg, outline: 빨간 텍스트/border, tonal: 빨간 wash.
973
+ */
974
+ danger?: boolean;
492
975
  }
493
976
  /**
494
977
  * 버튼을 렌더링한다.
495
- * Figma DS 기준 4가지 variant(filled/tonal/outline/text)와 3가지 size(sm/md/xl)를 지원한다.
978
+ * Figma DS 기준 4가지 variant(filled/tonal/outline/text)와 4가지 size(sm/md/lg/xl)를 지원한다.
496
979
  * @param props 버튼 속성
497
980
  * @returns 렌더링된 버튼 요소
498
981
  */
499
- declare const Button: ({ variant, size, leadingIcon, trailingIcon, fullWidth, radius, className, children, ...props }: ButtonProps) => react_jsx_runtime.JSX.Element;
982
+ declare const Button: ({ variant, size, leadingIcon, trailingIcon, fullWidth, radius, danger, className, children, ...props }: ButtonProps) => react_jsx_runtime.JSX.Element;
500
983
 
984
+ type CardVariant = "default" | "accent";
501
985
  interface CardProps extends React$1.HTMLAttributes<HTMLDivElement> {
502
986
  /** 카드 상단에 표시할 제목 */
503
987
  heading?: React$1.ReactNode;
@@ -509,6 +993,8 @@ interface CardProps extends React$1.HTMLAttributes<HTMLDivElement> {
509
993
  padding?: "none" | "sm" | "md" | "lg";
510
994
  /** 테두리 표시 여부 (기본값: false) */
511
995
  bordered?: boolean;
996
+ /** 카드 variant — "accent"는 navy bg + white text (강조 카드) */
997
+ variant?: CardVariant;
512
998
  }
513
999
  /**
514
1000
  * 카드 컴포넌트를 렌더링한다.
@@ -516,7 +1002,7 @@ interface CardProps extends React$1.HTMLAttributes<HTMLDivElement> {
516
1002
  * @param props 카드 속성
517
1003
  * @returns 렌더링된 카드 UI
518
1004
  */
519
- declare const Card: ({ heading, headingAs: HeadingTag, shadow, padding, bordered, className, children, ...props }: CardProps) => react_jsx_runtime.JSX.Element;
1005
+ declare const Card: ({ heading, headingAs: HeadingTag, shadow, padding, bordered, variant, className, children, ...props }: CardProps) => react_jsx_runtime.JSX.Element;
520
1006
 
521
1007
  interface CheckboxProps extends Omit<React$1.InputHTMLAttributes<HTMLInputElement>, "size"> {
522
1008
  /** 체크박스 옆에 표시할 라벨 */
@@ -539,26 +1025,34 @@ declare const Checkbox: {
539
1025
  displayName: string;
540
1026
  };
541
1027
 
542
- type ChipType = "basic" | "input" | "filter";
543
- interface ChipProps extends Omit<React__default.HTMLAttributes<HTMLDivElement>, "onClick"> {
544
- /** 유형 (기본값: "basic") */
1028
+ type ChipType = "basic" | "input" | "filter" | "static";
1029
+ type ChipSize = "sm" | "md";
1030
+ type ChipTone = "default" | "accent" | "info" | "success" | "warning" | "error";
1031
+ interface ChipProps extends Omit<React$1.HTMLAttributes<HTMLDivElement>, "onClick"> {
1032
+ /** 칩 유형 (기본값: "basic"). `static`은 비인터랙티브 라벨 (구 Tag 대체) */
545
1033
  type?: ChipType;
1034
+ /** 칩 크기 (미지정 시 기본 32px). "sm"=24px, "md"=28px */
1035
+ size?: ChipSize;
1036
+ /** 색조 (type=`static`에서만 적용). 카테고리/상태 라벨 색 구분 */
1037
+ tone?: ChipTone;
546
1038
  /** 라벨 텍스트 */
547
1039
  label: string;
548
1040
  /** 선택 상태 */
549
1041
  selected?: boolean;
550
- /** 삭제 가능 여부 (input 타입에서만 사용) */
1042
+ /** 삭제 가능 여부 (input / static 타입에서 사용) */
551
1043
  removable?: boolean;
552
1044
  /** 비활성화 상태 */
553
1045
  disabled?: boolean;
554
1046
  /** 팝업 열림 상태 (filter 타입에서 aria-expanded로 사용) */
555
1047
  open?: boolean;
1048
+ /** 왼쪽 아이콘 (static 타입에서 사용) */
1049
+ leadingIcon?: React$1.ReactNode;
556
1050
  /** 칩 클릭 시 콜백 */
557
- onClick?: (event: React__default.MouseEvent<HTMLButtonElement>) => void;
1051
+ onClick?: (event: React$1.MouseEvent<HTMLButtonElement>) => void;
558
1052
  /** 삭제 버튼 클릭 시 콜백 */
559
1053
  onRemove?: () => void;
560
1054
  }
561
- declare const Chip: ({ type, label, selected, removable, disabled, open, onClick, onRemove, className, ...props }: ChipProps) => react_jsx_runtime.JSX.Element;
1055
+ declare const Chip: ({ type, size, tone, label, selected, removable, disabled, open, leadingIcon, onClick, onRemove, className, ...props }: ChipProps) => react_jsx_runtime.JSX.Element;
562
1056
 
563
1057
  type DatePickerMode = "year-month" | "year-month-day";
564
1058
  type SelectableRange = "all" | "until-today";
@@ -607,7 +1101,7 @@ interface DatePickerProps {
607
1101
  }
608
1102
  /**
609
1103
  * 연/월/일 선택형 데이트 피커를 렌더링한다.
610
- * 내부적으로 DS Select 3개를 조합해 드롭다운 UX 일관성을 유지한다.
1104
+ * 내부적으로 DS Dropdown 3개를 조합해 드롭다운 UX 일관성을 유지한다.
611
1105
  */
612
1106
  declare const DatePicker: ({ label, value, onChange, mode, startYear, endYear: endYearProp, minDate, selectableRange, disabled, fullWidth, width, yearLabel, monthLabel, dayLabel, minDateSrFormat, selectableRangeUntilTodaySrText, }: DatePickerProps) => react_jsx_runtime.JSX.Element;
613
1107
 
@@ -656,7 +1150,9 @@ interface DropdownProps {
656
1150
  disabled?: boolean;
657
1151
  /** 드롭다운 크기 (기본값: "md") */
658
1152
  size?: DropdownSize;
659
- /** 컨테이너 전체 너비 차지 여부 */
1153
+ /**
1154
+ * @deprecated Dropdown 은 이제 항상 부모 너비를 채웁니다. 인라인 사용 시 부모를 `inline-block + width` 로 감싸세요.
1155
+ */
660
1156
  fullWidth?: boolean;
661
1157
  /** 루트 요소에 추가할 className */
662
1158
  className?: string;
@@ -675,34 +1171,26 @@ interface DropdownProps {
675
1171
  * @param props 드롭다운 속성
676
1172
  * @returns 렌더링된 드롭다운 UI
677
1173
  */
678
- declare const Dropdown: ({ id, label, placeholder, options, value, onChange, defaultValue, disabled, size, fullWidth, className, }: DropdownProps) => react_jsx_runtime.JSX.Element;
679
-
680
- type FABVariant = "primary" | "additive";
681
- interface FABProps extends React$1.ButtonHTMLAttributes<HTMLButtonElement> {
682
- /** FAB 스타일 변형 (기본값: "primary") */
683
- variant?: FABVariant;
684
- /** 표시할 아이콘 */
685
- icon: React$1.ReactNode;
686
- /** 접근성 레이블 (스크린 리더용, 아이콘 전용 버튼이므로 필수) */
687
- "aria-label": string;
688
- }
689
- /**
690
- * FAB(Floating Action Button)을 렌더링한다.
691
- * 화면에서 가장 중요한 단일 액션을 강조하는 플로팅 버튼이다.
692
- * @param props FAB 속성
693
- * @returns 렌더링된 FAB 요소
694
- */
695
- declare const FAB: ({ variant, icon, className, ...props }: FABProps) => react_jsx_runtime.JSX.Element;
1174
+ declare const Dropdown: ({ id, label, placeholder, options, value, onChange, defaultValue, disabled, size, className, }: DropdownProps) => react_jsx_runtime.JSX.Element;
696
1175
 
1176
+ type FileInputVariant = "button" | "preview";
697
1177
  interface FileInputProps extends React$1.InputHTMLAttributes<HTMLInputElement> {
698
- /** 파일 선택 버튼 라벨 텍스트 (기본값: "Choose file") */
1178
+ /** 파일 선택 버튼 라벨 / preview variant 빈 상태 텍스트 (기본값: "Choose file") */
699
1179
  label?: string;
700
1180
  /** 파일 선택 시 호출되는 콜백 */
701
1181
  onFiles?: (files: FileList | null) => void;
702
1182
  /** 입력 필드 아래에 표시할 도움말 텍스트 (예: "PDF, DOC 파일만 업로드 가능합니다") */
703
1183
  supportingText?: string;
704
- /** 이미지 파일 선택 시 썸네일 미리보기 표시 여부 (기본값: false) */
1184
+ /** 이미지 파일 선택 시 64×64 썸네일을 버튼 아래 나열 (variant="button" 전용) */
705
1185
  preview?: boolean;
1186
+ /**
1187
+ * 표시 형태 (기본값: "button").
1188
+ * - `"button"`: 일반 파일 선택 버튼. `preview=true` 면 아래에 작은 썸네일 표시.
1189
+ * - `"preview"`: 큰 박스 안에 이미지 채움 (avatar / 이미지 업로더 패턴). 단일 이미지.
1190
+ */
1191
+ variant?: FileInputVariant;
1192
+ /** variant="preview" 박스 크기 (px, 기본값: 160) */
1193
+ previewSize?: number;
706
1194
  }
707
1195
  /**
708
1196
  * 파일 입력 컴포넌트를 렌더링한다.
@@ -710,35 +1198,79 @@ interface FileInputProps extends React$1.InputHTMLAttributes<HTMLInputElement> {
710
1198
  * @param props 파일 입력 속성
711
1199
  * @returns 렌더링된 파일 입력 UI
712
1200
  */
713
- declare const FileInput: ({ label, onFiles, supportingText, preview, className, disabled, ...props }: FileInputProps) => react_jsx_runtime.JSX.Element;
1201
+ declare const FileInput: ({ label, onFiles, supportingText, preview, variant, previewSize, className, disabled, accept, onChange, ...props }: FileInputProps) => react_jsx_runtime.JSX.Element;
714
1202
 
1203
+ interface HeroAction {
1204
+ /** 버튼 라벨 */
1205
+ label: React$1.ReactNode;
1206
+ /** 클릭 핸들러 */
1207
+ onClick?: () => void;
1208
+ /** href 사용 시 anchor로 렌더링 */
1209
+ href?: string;
1210
+ }
1211
+ type HeroHeight = "sm" | "md" | "lg" | "full";
1212
+ type HeroAlign = "left" | "center" | "right";
1213
+ type HeroOverlay = boolean | "dark" | "light" | "navy";
1214
+ interface HeroProps extends Omit<React$1.HTMLAttributes<HTMLElement>, "title"> {
1215
+ /** 히어로 높이 (기본값: "md"). sm=320 / md=480 / lg=640 / full=100vh */
1216
+ height?: HeroHeight;
1217
+ /** 텍스트 정렬 (기본값: "left") */
1218
+ align?: HeroAlign;
1219
+ /** 배경 이미지 URL (CSS background-image로 사용) */
1220
+ backgroundImage?: string;
1221
+ /** 배경색 — backgroundImage 없을 때 또는 그 위에 색 적용 */
1222
+ backgroundColor?: string;
1223
+ /**
1224
+ * 텍스트 대비를 위한 오버레이.
1225
+ * - `true`/"dark": 위→아래 검정 그라데이션
1226
+ * - "light": 흰색 그라데이션
1227
+ * - "navy": Bigtablet brand navy 그라데이션 (marketing 강조)
1228
+ */
1229
+ overlay?: HeroOverlay;
1230
+ /** h1으로 렌더링되는 메인 제목 */
1231
+ title?: React$1.ReactNode;
1232
+ /** 제목 아래 부제목 */
1233
+ subtitle?: React$1.ReactNode;
1234
+ /** Eyebrow 텍스트 — 제목 위에 작게 표시되는 카테고리/태그 */
1235
+ eyebrow?: React$1.ReactNode;
1236
+ /** CTA 영역 (Button 등) */
1237
+ children?: React$1.ReactNode;
1238
+ /** 텍스트 색상 — 배경이 어두우면 흰색 권장 (기본값: "auto" — overlay가 dark면 white) */
1239
+ textColor?: "auto" | "inverse" | "default";
1240
+ /** Primary CTA — 미지정 시 children으로 직접 Button 전달 가능 */
1241
+ primaryAction?: HeroAction;
1242
+ /** Secondary CTA */
1243
+ secondaryAction?: HeroAction;
1244
+ }
715
1245
  /**
716
- * ⚠️ AUTO-GENERATED DO NOT EDIT MANUALLY
717
- * Run `node scripts/generate-icons.mjs` to regenerate.
718
- *
719
- * Source: @material-symbols/svg-300, @material-symbols/svg-400 (outlined)
720
- * Icons: 57 icons × 4 variants (weight 300/400 × fill/no-fill)
721
- * ViewBox: "0 -960 960 960" (Material Symbols standard)
1246
+ * 페이지 상단 히어로 섹션을 렌더링한다.
1247
+ * 배경 이미지/색상 + 오버레이 + 제목/부제목 + CTA 슬롯으로 구성.
1248
+ * @param props 히어로 속성
1249
+ * @returns 히어로 섹션
722
1250
  */
723
- type IconName = "add_a_photo" | "add_circle" | "add_lg" | "add_md" | "apartment" | "arrow_back" | "calendar_today" | "check" | "check_box" | "check_circle" | "close" | "close_small" | "cloud_download" | "cloud_upload" | "content_copy" | "delete_forever" | "edit" | "edit_note" | "error" | "event" | "fiber_manual_record" | "forward_5" | "group" | "groups" | "help" | "id" | "id_card" | "image" | "indeterminate_check_box" | "info" | "keyboard_arrow_down" | "keyboard_arrow_left" | "keyboard_arrow_right" | "keyboard_arrow_up" | "location_on" | "login" | "logout" | "more_vert" | "open_in_browser" | "open_in_new" | "pause" | "person" | "photo_camera" | "photo_library" | "play_arrow" | "replay_5" | "search" | "settings" | "share" | "speed_1_2x" | "speed_1_5x" | "speed_1_7x" | "speed_1x" | "speed_2x" | "stop" | "visibility" | "visibility_off";
724
- type IconWeight = 300 | 400;
1251
+ declare const Hero: ({ height, align, backgroundImage, backgroundColor, overlay, title, subtitle, eyebrow, textColor, primaryAction, secondaryAction, children, className, style, ...props }: HeroProps) => react_jsx_runtime.JSX.Element;
725
1252
 
726
- interface IconProps extends Omit<React$1.SVGProps<SVGSVGElement>, "fill"> {
727
- /** 아이콘 이름 */
728
- name: IconName;
729
- /** 아이콘 크기 (px, 기본값: 24) */
730
- size?: 20 | 24;
731
- /** 선의 굵기 (기본값: 400) */
732
- weight?: IconWeight;
733
- /** 채움 스타일 여부 (기본값: false) */
734
- fill?: boolean;
1253
+ interface IconProps extends Omit<LucideProps, "ref"> {
1254
+ /** lucide-react 아이콘 컴포넌트 */
1255
+ icon: LucideIcon;
735
1256
  }
736
1257
  /**
737
- * Material Symbols 기반 인라인 SVG 아이콘 컴포넌트.
738
- * weight(300/400) × fill(true/false) × size(20/24) 조합을 지원한다.
1258
+ * lucide-react 아이콘 wrapper.
1259
+ * aria-label이 없으면 aria-hidden을 자동 적용해 스크린리더 노이즈를 방지한다.
1260
+ *
1261
+ * @example
1262
+ * ```tsx
1263
+ * import { Icon } from "@bigtablet/design-system";
1264
+ * import { Search, X } from "lucide-react";
1265
+ *
1266
+ * <Icon icon={Search} size={20} />
1267
+ * <Icon icon={X} size={16} strokeWidth={2.5} aria-label="닫기" />
1268
+ * ```
1269
+ *
1270
+ * lucide-react 아이콘 전체 카탈로그: https://lucide.dev/icons/
739
1271
  */
740
1272
  declare const Icon: {
741
- ({ name, size, weight, fill, style, ...props }: IconProps): react_jsx_runtime.JSX.Element | null;
1273
+ ({ icon: IconComponent, ...props }: IconProps): react_jsx_runtime.JSX.Element;
742
1274
  displayName: string;
743
1275
  };
744
1276
 
@@ -770,7 +1302,7 @@ interface LinearProgressProps extends React.HTMLAttributes<HTMLDivElement> {
770
1302
  }
771
1303
  /**
772
1304
  * 선형 진행 표시기를 렌더링한다.
773
- * 현재 단계와 전체 단계를 기반으로 진행률을 시각적으로 표시한다.
1305
+ * `totalSteps + 1` dot (체크포인트) + 진행 바. Dot `i` 는 `i <= currentStep` 이면 채워짐.
774
1306
  * @param props 진행 표시기 속성
775
1307
  * @returns 렌더링된 진행 표시기 요소
776
1308
  */
@@ -789,10 +1321,12 @@ interface ListItemProps extends Omit<React$1.HTMLAttributes<HTMLDivElement>, "on
789
1321
  leadingElement?: React$1.ReactNode;
790
1322
  /** 오른쪽에 표시할 요소 (아이콘 버튼, 체크박스 등) */
791
1323
  trailingElement?: React$1.ReactNode;
792
- /** 요소 정렬 (기본값: "top") */
1324
+ /** 요소 정렬. 미지정 시 자동: OneLine(label ) → middle, multi-line → top */
793
1325
  alignment?: "top" | "middle";
794
1326
  /** 비활성화 상태 */
795
1327
  disabled?: boolean;
1328
+ /** 선택 상태 — accent.subtle 배경 + accent.default 좌측 인디케이터 */
1329
+ selected?: boolean;
796
1330
  /** 클릭 시 콜백 */
797
1331
  onClick?: (event: React$1.MouseEvent<HTMLDivElement>) => void;
798
1332
  }
@@ -802,8 +1336,45 @@ interface ListItemProps extends Omit<React$1.HTMLAttributes<HTMLDivElement>, "on
802
1336
  * @param props 리스트 아이템 속성
803
1337
  * @returns 렌더링된 리스트 아이템 UI
804
1338
  */
805
- declare const ListItem: ({ overline, label, supportingText, metadata, leadingElement, trailingElement, alignment, disabled, onClick, className, ...props }: ListItemProps) => react_jsx_runtime.JSX.Element;
1339
+ declare const ListItem: ({ overline, label, supportingText, metadata, leadingElement, trailingElement, alignment, disabled, selected, onClick, className, ...props }: ListItemProps) => react_jsx_runtime.JSX.Element;
806
1340
 
1341
+ type MediaCardImagePosition = "top" | "left" | "overlay";
1342
+ type MediaCardShadow = "none" | "sm" | "md" | "lg";
1343
+ interface MediaCardImage {
1344
+ src: string;
1345
+ alt: string;
1346
+ }
1347
+ interface MediaCardProps extends Omit<React$1.HTMLAttributes<HTMLDivElement>, "title"> {
1348
+ /** 이미지 정보 (src + alt). alt=""는 장식 이미지로 처리됨 */
1349
+ image: MediaCardImage;
1350
+ /** 이미지 위치 (기본값: "top"). overlay = 이미지 위에 텍스트가 얹힘 */
1351
+ imagePosition?: MediaCardImagePosition;
1352
+ /** 이미지 aspect-ratio (예: "16/9", "4/3", "1/1") */
1353
+ aspectRatio?: string;
1354
+ /** 카드 제목 */
1355
+ heading?: React$1.ReactNode;
1356
+ /** 제목 시맨틱 태그 (기본값: "h3") */
1357
+ headingAs?: "h2" | "h3" | "h4" | "h5" | "h6";
1358
+ /** Eyebrow — 제목 위 작은 라벨/카테고리 */
1359
+ eyebrow?: React$1.ReactNode;
1360
+ /** 카드 그림자 (기본값: "sm") */
1361
+ shadow?: MediaCardShadow;
1362
+ /** 테두리 표시 여부 (기본값: false) */
1363
+ bordered?: boolean;
1364
+ /** 카드 클릭 가능 여부 (hover 강조 + cursor) */
1365
+ clickable?: boolean;
1366
+ /** 메타 영역 (날짜/작성자/조회수 등) — 본문 아래 작은 텍스트 */
1367
+ meta?: React$1.ReactNode;
1368
+ }
1369
+ /**
1370
+ * 이미지가 포함된 카드를 렌더링한다.
1371
+ * Blog/News/Product 같은 B2C 콘텐츠 리스트에 사용한다.
1372
+ * @param props 카드 속성
1373
+ * @returns 이미지 카드
1374
+ */
1375
+ declare const MediaCard: ({ image, imagePosition, aspectRatio, heading, headingAs: HeadingTag, eyebrow, shadow, bordered, clickable, meta, children, className, ...props }: MediaCardProps) => react_jsx_runtime.JSX.Element;
1376
+
1377
+ type ModalFooterAlign = "end" | "between" | "start";
807
1378
  interface ModalProps extends Omit<React$1.HTMLAttributes<HTMLDivElement>, "title"> {
808
1379
  /** 모달 열림 여부 */
809
1380
  open: boolean;
@@ -811,20 +1382,30 @@ interface ModalProps extends Omit<React$1.HTMLAttributes<HTMLDivElement>, "title
811
1382
  onClose?: () => void;
812
1383
  /** 오버레이 클릭 시 닫기 여부 (기본값: true) */
813
1384
  closeOnOverlay?: boolean;
814
- /** 모달 패널 너비 (기본값: 520) */
1385
+ /** 모달 패널 너비 (기본값: 480) */
815
1386
  width?: number | string;
816
- /** 모달 헤더에 표시할 제목 */
1387
+ /** 모달 제목 (h2, heading_large_bold) */
817
1388
  title?: React$1.ReactNode;
1389
+ /** 제목 아래 본문 설명 — paragraph로 자동 wrap */
1390
+ description?: React$1.ReactNode;
1391
+ /** 하단 액션 영역 (Button들). 미지정 시 footer 영역 자체가 안 보임 */
1392
+ footer?: React$1.ReactNode;
1393
+ /** Footer 정렬 (기본값: "end"). between은 좌우 분리 패턴 (destructive 액션 등) */
1394
+ footerAlign?: ModalFooterAlign;
1395
+ /** 우상단 X 닫기 아이콘 표시 여부 (기본값: true) */
1396
+ showCloseIcon?: boolean;
1397
+ /** X 닫기 버튼 접근성 레이블 (기본값: "닫기") */
1398
+ closeLabel?: string;
818
1399
  /** 모달 접근성 레이블(기본값: title 또는 "Dialog") */
819
1400
  ariaLabel?: string;
820
1401
  }
821
1402
  /**
822
1403
  * 모달을 렌더링한다.
823
- * 포커스 트랩과 스크롤 잠금을 적용하고, 열림 상태에 따라 오버레이/패널을 구성한다.
1404
+ * react-spring 기반 진입/퇴출 모션 + 포커스 트랩 + 바디 스크롤 잠금.
824
1405
  * @param props 모달 속성
825
1406
  * @returns 열림 상태일 때 렌더링된 모달, 닫힘 상태면 null
826
1407
  */
827
- declare const Modal: ({ open, onClose, closeOnOverlay, width, title, children, className, ariaLabel, ...props }: ModalProps) => react_jsx_runtime.JSX.Element | null;
1408
+ declare const Modal: ({ open, onClose, closeOnOverlay, width, title, description, footer, footerAlign, showCloseIcon, closeLabel, children, className, ariaLabel, ...props }: ModalProps) => react_jsx_runtime.JSX.Element | null;
828
1409
 
829
1410
  interface OtpInputProps {
830
1411
  /** OTP 자릿수 (기본값: 6) */
@@ -896,6 +1477,24 @@ declare const Radio: {
896
1477
  displayName: string;
897
1478
  };
898
1479
 
1480
+ type SkeletonVariant = "text" | "title" | "avatar" | "rect";
1481
+ interface SkeletonProps extends Omit<React$1.HTMLAttributes<HTMLDivElement>, "children"> {
1482
+ /** 스켈레톤 모양 (기본값: "text") */
1483
+ variant?: SkeletonVariant;
1484
+ /** CSS width 값 (예: "100%", 200, "16rem"). variant=avatar는 width=height로 사용 */
1485
+ width?: number | string;
1486
+ /** CSS height 값 */
1487
+ height?: number | string;
1488
+ /** border-radius 토큰 (sm/md/lg) 또는 임의 CSS 값 */
1489
+ radius?: "sm" | "md" | "lg" | "full" | string;
1490
+ }
1491
+ /**
1492
+ * 로딩 상태를 표현하는 스켈레톤 플레이스홀더를 렌더링한다.
1493
+ * @param props 스켈레톤 속성
1494
+ * @returns 스켈레톤 요소
1495
+ */
1496
+ declare const Skeleton: ({ variant, width, height, radius, className, style, ...props }: SkeletonProps) => react_jsx_runtime.JSX.Element;
1497
+
899
1498
  interface SpinnerProps {
900
1499
  /** 스피너 크기(px) (기본값: 24) */
901
1500
  size?: number;
@@ -903,14 +1502,97 @@ interface SpinnerProps {
903
1502
  ariaLabel?: string;
904
1503
  }
905
1504
  /**
906
- * 스피너를 렌더링한다.
907
- * 크기와 접근성 레이블을 적용한 상태 표시용 요소를 반환한다.
1505
+ * 스피너를 렌더링한다. 12개 bar 가 방사형으로 배치되어 페이드 인/아웃 으로 회전하는 효과.
1506
+ * Vercel/iOS 스타일 클래식 border-spin 보다 부드럽고 미니멀.
908
1507
  * @param props 스피너 속성
909
1508
  * @returns 렌더링된 스피너 요소
910
1509
  */
911
1510
  declare const Spinner: ({ size, ariaLabel }: SpinnerProps) => react_jsx_runtime.JSX.Element;
912
1511
 
913
- type TextFieldSize = "sm" | "md";
1512
+ type TableSize = "sm" | "md" | "lg";
1513
+ interface TableColumn<T extends object> {
1514
+ /** 컬럼 식별자 — `data[key]` 자동 렌더링에도 쓰임 */
1515
+ key: string;
1516
+ /** thead에 표시할 헤더 텍스트 */
1517
+ header: React$1.ReactNode;
1518
+ /** 셀 렌더 함수. 없으면 `item[key]` 자동 렌더 */
1519
+ render?: (item: T, index: number) => React$1.ReactNode;
1520
+ /** CSS width 값 (예: "120px", "20%") */
1521
+ width?: string;
1522
+ /** 정렬 (기본값: "left") */
1523
+ align?: "left" | "center" | "right";
1524
+ }
1525
+ interface TableProps<T extends object> {
1526
+ /** 컬럼 정의 */
1527
+ columns: TableColumn<T>[];
1528
+ /** 표시할 데이터 배열 */
1529
+ data: T[];
1530
+ /** 행의 고유 key 추출 함수 */
1531
+ keyExtractor: (item: T, index: number) => string | number;
1532
+ /** 데이터 없을 때 표시 (기본값: "데이터가 없습니다") */
1533
+ emptyMessage?: React$1.ReactNode;
1534
+ /** 로딩 상태 — 헤더 유지, 바디만 스켈레톤 */
1535
+ isLoading?: boolean;
1536
+ /** 로딩 시 스켈레톤 행 개수 (기본값: 5) */
1537
+ skeletonRows?: number;
1538
+ /** 테이블 크기 (기본값: "md") */
1539
+ size?: TableSize;
1540
+ /** 행 hover 강조 (기본값: true) */
1541
+ hoverable?: boolean;
1542
+ /** thead sticky 고정 (기본값: false) */
1543
+ stickyHeader?: boolean;
1544
+ /** 스크린 리더용 테이블 레이블 */
1545
+ ariaLabel?: string;
1546
+ /** 루트 wrapper에 추가할 className */
1547
+ className?: string;
1548
+ /** 행 클릭 콜백 */
1549
+ onRowClick?: (item: T, index: number) => void;
1550
+ }
1551
+ /**
1552
+ * 데이터 테이블을 렌더링한다. 로딩 중에는 헤더 유지, 바디에 스켈레톤 행을 표시한다.
1553
+ * @param props 테이블 속성
1554
+ * @returns 테이블 컴포넌트
1555
+ */
1556
+ declare const Table: <T extends object>({ columns, data, keyExtractor, emptyMessage, isLoading, skeletonRows, size, hoverable, stickyHeader, ariaLabel, className, onRowClick, }: TableProps<T>) => react_jsx_runtime.JSX.Element;
1557
+
1558
+ type ThemeMode = "light" | "dark" | "system";
1559
+ type ResolvedTheme = "light" | "dark";
1560
+ interface ThemeContextValue {
1561
+ /** 현재 선택된 모드 (system 포함) */
1562
+ mode: ThemeMode;
1563
+ /** 실제로 적용된 테마 (system은 prefers-color-scheme으로 해석됨) */
1564
+ resolved: ResolvedTheme;
1565
+ /** 모드 변경 */
1566
+ setMode: (mode: ThemeMode) => void;
1567
+ }
1568
+ /**
1569
+ * ThemeProvider 안에서 호출. mode/resolved/setMode를 반환.
1570
+ * Provider 외부에서 호출하면 에러를 던진다.
1571
+ */
1572
+ declare const useTheme: () => ThemeContextValue;
1573
+ interface ThemeProviderProps {
1574
+ /** 초기 테마 (기본값: "system") */
1575
+ defaultMode?: ThemeMode;
1576
+ /** localStorage 키 (기본값: "bt-theme"). null이면 저장 안 함 */
1577
+ storageKey?: string | null;
1578
+ /** 적용 대상 element selector (기본값: document.documentElement) */
1579
+ targetSelector?: string;
1580
+ children: React$1.ReactNode;
1581
+ }
1582
+ /**
1583
+ * Bigtablet DS 테마 컨텍스트를 제공한다.
1584
+ * `data-theme` attribute를 root element에 적용해서 CSS 변수 레이어를 전환한다.
1585
+ *
1586
+ * @example
1587
+ * ```tsx
1588
+ * <ThemeProvider defaultMode="system">
1589
+ * <App />
1590
+ * </ThemeProvider>
1591
+ * ```
1592
+ */
1593
+ declare const ThemeProvider: React$1.FC<ThemeProviderProps>;
1594
+
1595
+ type TextFieldSize = "sm" | "md" | "lg";
914
1596
  interface TextFieldProps extends Omit<React$1.InputHTMLAttributes<HTMLInputElement>, "size" | "onChange" | "value" | "defaultValue"> {
915
1597
  /** 입력 필드 크기 (기본값: "md") */
916
1598
  size?: TextFieldSize;
@@ -1034,4 +1716,154 @@ interface TopLoadingProps {
1034
1716
  */
1035
1717
  declare const TopLoading: ({ progress, color, height, isLoading, ariaLabel, }: TopLoadingProps) => react_jsx_runtime.JSX.Element | null;
1036
1718
 
1037
- export { AlertProvider, Button, type ButtonProps, Card, type CardProps, Checkbox, type CheckboxProps, Chip, type ChipProps, type ChipType, DatePicker, type DatePickerProps, Divider, type DividerProps, Dropdown, type DropdownOption, type DropdownProps, type DropdownSize, FAB, type FABProps, type FABVariant, FileInput, type FileInputProps, Icon, IconButton, type IconButtonProps, type IconButtonSize, type IconButtonVariant, type IconName, type IconProps, type IconWeight, LinearProgress, type LinearProgressProps, ListItem, type ListItemProps, Modal, type ModalProps, OtpInput, type OtpInputProps, Pagination, type PaginationProps, Radio, type RadioProps, Dropdown as Select, type DropdownOption as SelectOption, type DropdownProps as SelectProps, Spinner, type SpinnerProps, TextField, type TextFieldProps, ToastProvider, Toggle, type ToggleProps, TopLoading, type TopLoadingProps, a11y, baseBorderWidth, baseColors, baseTypography, borderWidth, breakpoints, colors, elevation, motion, opacity, radius, skeleton, spacing, typography, useAlert, useToast, zIndex };
1719
+ type ContainerSize = "sm" | "md" | "lg" | "xl" | "full";
1720
+ interface ContainerProps extends React$1.HTMLAttributes<HTMLDivElement> {
1721
+ /**
1722
+ * max-width 크기
1723
+ * - sm: 640px | md: 768px | lg: 1024px | xl: 1200px | full: 100%
1724
+ * @default "xl"
1725
+ */
1726
+ size?: ContainerSize;
1727
+ /** 가운데 정렬 (기본 true) */
1728
+ center?: boolean;
1729
+ /** 렌더링할 HTML 요소 */
1730
+ as?: React$1.ElementType;
1731
+ }
1732
+ /**
1733
+ * max-width 제한 + 반응형 수평 패딩을 가진 컨테이너.
1734
+ * 모든 마케팅/서비스 페이지의 기본 wrapper.
1735
+ *
1736
+ * @example
1737
+ * ```tsx
1738
+ * <Container size="xl">
1739
+ * <HeroSection />
1740
+ * <FeatureGrid />
1741
+ * </Container>
1742
+ * ```
1743
+ */
1744
+ declare const Container: ({ size, center, as: Tag, className, children, ...props }: ContainerProps) => react_jsx_runtime.JSX.Element;
1745
+
1746
+ type SectionSpacing = "xs" | "sm" | "md" | "lg" | "xl";
1747
+ type SectionBg = "default" | "dim" | "accent" | "navy" | "transparent";
1748
+ interface SectionProps extends React$1.HTMLAttributes<HTMLElement> {
1749
+ /**
1750
+ * 수직 패딩 크기
1751
+ * - xs: 32px | sm: 48px | md: 64px | lg: 96px | xl: 128px
1752
+ * @default "md"
1753
+ */
1754
+ spacing?: SectionSpacing;
1755
+ /**
1756
+ * 배경색 변형
1757
+ * - default: bg-solid | dim: bg-solid-dim | accent: accent-subtle | navy: accent-default
1758
+ * @default "default"
1759
+ */
1760
+ bg?: SectionBg;
1761
+ /** 렌더링할 HTML 요소 */
1762
+ as?: React$1.ElementType;
1763
+ }
1764
+ /**
1765
+ * 마케팅 페이지의 섹션 단위. 수직 여백 + 배경색 variants.
1766
+ *
1767
+ * @example
1768
+ * ```tsx
1769
+ * <Section spacing="lg" bg="dim">
1770
+ * <Container>
1771
+ * <h2>Features</h2>
1772
+ * <FeatureGrid />
1773
+ * </Container>
1774
+ * </Section>
1775
+ * ```
1776
+ */
1777
+ declare const Section: ({ spacing, bg, as: Tag, className, children, ...props }: SectionProps) => react_jsx_runtime.JSX.Element;
1778
+
1779
+ type StackDirection = "vertical" | "horizontal";
1780
+ type StackAlign = "start" | "center" | "end" | "stretch";
1781
+ type StackJustify = "start" | "center" | "end" | "between" | "around" | "evenly";
1782
+ type StackGap = 0 | 2 | 4 | 8 | 12 | 16 | 20 | 24 | 32 | 40 | 48;
1783
+ type StackWrap = "nowrap" | "wrap" | "wrap-reverse";
1784
+ interface StackProps extends React$1.HTMLAttributes<HTMLDivElement> {
1785
+ /**
1786
+ * flex 방향
1787
+ * @default "vertical"
1788
+ */
1789
+ direction?: StackDirection;
1790
+ /**
1791
+ * 아이템 간격 (px)
1792
+ * @default 16
1793
+ */
1794
+ gap?: StackGap;
1795
+ /** 교차축 정렬 (align-items) */
1796
+ align?: StackAlign;
1797
+ /** 주축 정렬 (justify-content) */
1798
+ justify?: StackJustify;
1799
+ /** flex-wrap */
1800
+ wrap?: StackWrap;
1801
+ /** 렌더링할 HTML 요소 */
1802
+ as?: React$1.ElementType;
1803
+ }
1804
+ /**
1805
+ * Flex 기반 1D 레이아웃 컨테이너.
1806
+ * 수직(column) / 수평(row) 스택 + 간격/정렬 제어.
1807
+ *
1808
+ * @example
1809
+ * ```tsx
1810
+ * <Stack direction="horizontal" gap={16} align="center">
1811
+ * <Icon name="star" />
1812
+ * <span>Rating</span>
1813
+ * </Stack>
1814
+ *
1815
+ * <Stack gap={24}>
1816
+ * <Card />
1817
+ * <Card />
1818
+ * </Stack>
1819
+ * ```
1820
+ */
1821
+ declare const Stack: ({ direction, gap, align, justify, wrap, as: Tag, className, children, style, ...props }: StackProps) => react_jsx_runtime.JSX.Element;
1822
+
1823
+ type GridCols = 1 | 2 | 3 | 4 | 5 | 6 | "auto";
1824
+ type GridGap = 0 | 4 | 8 | 12 | 16 | 20 | 24 | 32 | 40 | 48;
1825
+ interface GridProps extends React$1.HTMLAttributes<HTMLDivElement> {
1826
+ /**
1827
+ * 열 수. "auto" = auto-fill (minColWidth 사용)
1828
+ * @default 3
1829
+ */
1830
+ cols?: GridCols;
1831
+ /**
1832
+ * auto-fill 모드일 때 최소 열 너비
1833
+ * @default "280px"
1834
+ */
1835
+ minColWidth?: string;
1836
+ /**
1837
+ * 아이템 간격 (px). gap과 rowGap/colGap 동시 적용.
1838
+ * @default 24
1839
+ */
1840
+ gap?: GridGap;
1841
+ /** 행 간격 (gap을 override) */
1842
+ rowGap?: GridGap;
1843
+ /** 열 간격 (gap을 override) */
1844
+ colGap?: GridGap;
1845
+ /** 반응형 — compact(< 600px)에서 강제 1열 (기본 true) */
1846
+ singleColOnMobile?: boolean;
1847
+ /** 렌더링할 HTML 요소 */
1848
+ as?: React$1.ElementType;
1849
+ }
1850
+ /**
1851
+ * CSS Grid 기반 2D 레이아웃 컨테이너.
1852
+ * 고정 열 수 또는 auto-fill 반응형 그리드.
1853
+ *
1854
+ * @example
1855
+ * ```tsx
1856
+ * // 3열 고정
1857
+ * <Grid cols={3} gap={24}>
1858
+ * <Card /><Card /><Card />
1859
+ * </Grid>
1860
+ *
1861
+ * // auto-fill (최소 280px)
1862
+ * <Grid cols="auto" minColWidth="280px" gap={16}>
1863
+ * {products.map(p => <MediaCard key={p.id} {...p} />)}
1864
+ * </Grid>
1865
+ * ```
1866
+ */
1867
+ declare const Grid: ({ cols, minColWidth, gap, rowGap, colGap, singleColOnMobile, as: Tag, className, children, style, ...props }: GridProps) => react_jsx_runtime.JSX.Element;
1868
+
1869
+ export { Accordion, type AccordionItem, type AccordionProps, AlertProvider, Avatar, type AvatarProps, type AvatarShape, type AvatarSize, Badge, type BadgeProps, type BadgeShape, type BadgeSize, type BadgeVariant, Breadcrumb, type BreadcrumbItem, type BreadcrumbProps, Button, type ButtonProps, Card, type CardProps, Checkbox, type CheckboxProps, Chip, type ChipProps, type ChipSize, type ChipTone, type ChipType, Container, type ContainerProps, type ContainerSize, DatePicker, type DatePickerProps, Divider, type DividerProps, Dropdown, type DropdownOption, type DropdownProps, type DropdownSize, EmptyState, type EmptyStateProps, 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, 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, Radio, type RadioProps, type ResolvedTheme, Section, type SectionBg, type SectionProps, type SectionSpacing, Sidebar, SidebarItem, type SidebarItemProps, 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, Tabs, type TabsProps, type TabsSize, type TabsVariant, TextField, type TextFieldProps, 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, motion, opacity, radius, skeleton, spacing, typography, useAlert, useFocusTrap, useSpringHover, useSpringPresence, useTheme, useToast, zIndex };