@bigtablet/design-system 2.5.0 → 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,8 +993,8 @@ interface CardProps extends React$1.HTMLAttributes<HTMLDivElement> {
509
993
  padding?: "none" | "sm" | "md" | "lg";
510
994
  /** 테두리 표시 여부 (기본값: false) */
511
995
  bordered?: boolean;
512
- /** hover 살짝 떠오르는 효과 (기본값: false) */
513
- hoverable?: boolean;
996
+ /** 카드 variant "accent"는 navy bg + white text (강조 카드) */
997
+ variant?: CardVariant;
514
998
  }
515
999
  /**
516
1000
  * 카드 컴포넌트를 렌더링한다.
@@ -518,7 +1002,7 @@ interface CardProps extends React$1.HTMLAttributes<HTMLDivElement> {
518
1002
  * @param props 카드 속성
519
1003
  * @returns 렌더링된 카드 UI
520
1004
  */
521
- declare const Card: ({ heading, headingAs: HeadingTag, shadow, padding, bordered, hoverable, 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;
522
1006
 
523
1007
  interface CheckboxProps extends Omit<React$1.InputHTMLAttributes<HTMLInputElement>, "size"> {
524
1008
  /** 체크박스 옆에 표시할 라벨 */
@@ -541,26 +1025,34 @@ declare const Checkbox: {
541
1025
  displayName: string;
542
1026
  };
543
1027
 
544
- type ChipType = "basic" | "input" | "filter";
545
- interface ChipProps extends Omit<React__default.HTMLAttributes<HTMLDivElement>, "onClick"> {
546
- /** 유형 (기본값: "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 대체) */
547
1033
  type?: ChipType;
1034
+ /** 칩 크기 (미지정 시 기본 32px). "sm"=24px, "md"=28px */
1035
+ size?: ChipSize;
1036
+ /** 색조 (type=`static`에서만 적용). 카테고리/상태 라벨 색 구분 */
1037
+ tone?: ChipTone;
548
1038
  /** 라벨 텍스트 */
549
1039
  label: string;
550
1040
  /** 선택 상태 */
551
1041
  selected?: boolean;
552
- /** 삭제 가능 여부 (input 타입에서만 사용) */
1042
+ /** 삭제 가능 여부 (input / static 타입에서 사용) */
553
1043
  removable?: boolean;
554
1044
  /** 비활성화 상태 */
555
1045
  disabled?: boolean;
556
1046
  /** 팝업 열림 상태 (filter 타입에서 aria-expanded로 사용) */
557
1047
  open?: boolean;
1048
+ /** 왼쪽 아이콘 (static 타입에서 사용) */
1049
+ leadingIcon?: React$1.ReactNode;
558
1050
  /** 칩 클릭 시 콜백 */
559
- onClick?: (event: React__default.MouseEvent<HTMLButtonElement>) => void;
1051
+ onClick?: (event: React$1.MouseEvent<HTMLButtonElement>) => void;
560
1052
  /** 삭제 버튼 클릭 시 콜백 */
561
1053
  onRemove?: () => void;
562
1054
  }
563
- 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;
564
1056
 
565
1057
  type DatePickerMode = "year-month" | "year-month-day";
566
1058
  type SelectableRange = "all" | "until-today";
@@ -609,7 +1101,7 @@ interface DatePickerProps {
609
1101
  }
610
1102
  /**
611
1103
  * 연/월/일 선택형 데이트 피커를 렌더링한다.
612
- * 내부적으로 DS Select 3개를 조합해 드롭다운 UX 일관성을 유지한다.
1104
+ * 내부적으로 DS Dropdown 3개를 조합해 드롭다운 UX 일관성을 유지한다.
613
1105
  */
614
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;
615
1107
 
@@ -658,7 +1150,9 @@ interface DropdownProps {
658
1150
  disabled?: boolean;
659
1151
  /** 드롭다운 크기 (기본값: "md") */
660
1152
  size?: DropdownSize;
661
- /** 컨테이너 전체 너비 차지 여부 */
1153
+ /**
1154
+ * @deprecated Dropdown 은 이제 항상 부모 너비를 채웁니다. 인라인 사용 시 부모를 `inline-block + width` 로 감싸세요.
1155
+ */
662
1156
  fullWidth?: boolean;
663
1157
  /** 루트 요소에 추가할 className */
664
1158
  className?: string;
@@ -677,34 +1171,26 @@ interface DropdownProps {
677
1171
  * @param props 드롭다운 속성
678
1172
  * @returns 렌더링된 드롭다운 UI
679
1173
  */
680
- declare const Dropdown: ({ id, label, placeholder, options, value, onChange, defaultValue, disabled, size, fullWidth, className, }: DropdownProps) => react_jsx_runtime.JSX.Element;
681
-
682
- type FABVariant = "primary" | "additive";
683
- interface FABProps extends React$1.ButtonHTMLAttributes<HTMLButtonElement> {
684
- /** FAB 스타일 변형 (기본값: "primary") */
685
- variant?: FABVariant;
686
- /** 표시할 아이콘 */
687
- icon: React$1.ReactNode;
688
- /** 접근성 레이블 (스크린 리더용, 아이콘 전용 버튼이므로 필수) */
689
- "aria-label": string;
690
- }
691
- /**
692
- * FAB(Floating Action Button)을 렌더링한다.
693
- * 화면에서 가장 중요한 단일 액션을 강조하는 플로팅 버튼이다.
694
- * @param props FAB 속성
695
- * @returns 렌더링된 FAB 요소
696
- */
697
- 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;
698
1175
 
1176
+ type FileInputVariant = "button" | "preview";
699
1177
  interface FileInputProps extends React$1.InputHTMLAttributes<HTMLInputElement> {
700
- /** 파일 선택 버튼 라벨 텍스트 (기본값: "Choose file") */
1178
+ /** 파일 선택 버튼 라벨 / preview variant 빈 상태 텍스트 (기본값: "Choose file") */
701
1179
  label?: string;
702
1180
  /** 파일 선택 시 호출되는 콜백 */
703
1181
  onFiles?: (files: FileList | null) => void;
704
1182
  /** 입력 필드 아래에 표시할 도움말 텍스트 (예: "PDF, DOC 파일만 업로드 가능합니다") */
705
1183
  supportingText?: string;
706
- /** 이미지 파일 선택 시 썸네일 미리보기 표시 여부 (기본값: false) */
1184
+ /** 이미지 파일 선택 시 64×64 썸네일을 버튼 아래 나열 (variant="button" 전용) */
707
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;
708
1194
  }
709
1195
  /**
710
1196
  * 파일 입력 컴포넌트를 렌더링한다.
@@ -712,35 +1198,79 @@ interface FileInputProps extends React$1.InputHTMLAttributes<HTMLInputElement> {
712
1198
  * @param props 파일 입력 속성
713
1199
  * @returns 렌더링된 파일 입력 UI
714
1200
  */
715
- 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;
716
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
+ }
717
1245
  /**
718
- * ⚠️ AUTO-GENERATED DO NOT EDIT MANUALLY
719
- * Run `node scripts/generate-icons.mjs` to regenerate.
720
- *
721
- * Source: @material-symbols/svg-300, @material-symbols/svg-400 (outlined)
722
- * Icons: 57 icons × 4 variants (weight 300/400 × fill/no-fill)
723
- * ViewBox: "0 -960 960 960" (Material Symbols standard)
1246
+ * 페이지 상단 히어로 섹션을 렌더링한다.
1247
+ * 배경 이미지/색상 + 오버레이 + 제목/부제목 + CTA 슬롯으로 구성.
1248
+ * @param props 히어로 속성
1249
+ * @returns 히어로 섹션
724
1250
  */
725
- 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";
726
- 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;
727
1252
 
728
- interface IconProps extends Omit<React$1.SVGProps<SVGSVGElement>, "fill"> {
729
- /** 아이콘 이름 */
730
- name: IconName;
731
- /** 아이콘 크기 (px, 기본값: 24) */
732
- size?: 20 | 24;
733
- /** 선의 굵기 (기본값: 400) */
734
- weight?: IconWeight;
735
- /** 채움 스타일 여부 (기본값: false) */
736
- fill?: boolean;
1253
+ interface IconProps extends Omit<LucideProps, "ref"> {
1254
+ /** lucide-react 아이콘 컴포넌트 */
1255
+ icon: LucideIcon;
737
1256
  }
738
1257
  /**
739
- * Material Symbols 기반 인라인 SVG 아이콘 컴포넌트.
740
- * 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/
741
1271
  */
742
1272
  declare const Icon: {
743
- ({ name, size, weight, fill, style, ...props }: IconProps): react_jsx_runtime.JSX.Element | null;
1273
+ ({ icon: IconComponent, ...props }: IconProps): react_jsx_runtime.JSX.Element;
744
1274
  displayName: string;
745
1275
  };
746
1276
 
@@ -772,7 +1302,7 @@ interface LinearProgressProps extends React.HTMLAttributes<HTMLDivElement> {
772
1302
  }
773
1303
  /**
774
1304
  * 선형 진행 표시기를 렌더링한다.
775
- * 현재 단계와 전체 단계를 기반으로 진행률을 시각적으로 표시한다.
1305
+ * `totalSteps + 1` dot (체크포인트) + 진행 바. Dot `i` 는 `i <= currentStep` 이면 채워짐.
776
1306
  * @param props 진행 표시기 속성
777
1307
  * @returns 렌더링된 진행 표시기 요소
778
1308
  */
@@ -791,10 +1321,12 @@ interface ListItemProps extends Omit<React$1.HTMLAttributes<HTMLDivElement>, "on
791
1321
  leadingElement?: React$1.ReactNode;
792
1322
  /** 오른쪽에 표시할 요소 (아이콘 버튼, 체크박스 등) */
793
1323
  trailingElement?: React$1.ReactNode;
794
- /** 요소 정렬 (기본값: "top") */
1324
+ /** 요소 정렬. 미지정 시 자동: OneLine(label ) → middle, multi-line → top */
795
1325
  alignment?: "top" | "middle";
796
1326
  /** 비활성화 상태 */
797
1327
  disabled?: boolean;
1328
+ /** 선택 상태 — accent.subtle 배경 + accent.default 좌측 인디케이터 */
1329
+ selected?: boolean;
798
1330
  /** 클릭 시 콜백 */
799
1331
  onClick?: (event: React$1.MouseEvent<HTMLDivElement>) => void;
800
1332
  }
@@ -804,8 +1336,45 @@ interface ListItemProps extends Omit<React$1.HTMLAttributes<HTMLDivElement>, "on
804
1336
  * @param props 리스트 아이템 속성
805
1337
  * @returns 렌더링된 리스트 아이템 UI
806
1338
  */
807
- 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;
808
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";
809
1378
  interface ModalProps extends Omit<React$1.HTMLAttributes<HTMLDivElement>, "title"> {
810
1379
  /** 모달 열림 여부 */
811
1380
  open: boolean;
@@ -813,20 +1382,30 @@ interface ModalProps extends Omit<React$1.HTMLAttributes<HTMLDivElement>, "title
813
1382
  onClose?: () => void;
814
1383
  /** 오버레이 클릭 시 닫기 여부 (기본값: true) */
815
1384
  closeOnOverlay?: boolean;
816
- /** 모달 패널 너비 (기본값: 520) */
1385
+ /** 모달 패널 너비 (기본값: 480) */
817
1386
  width?: number | string;
818
- /** 모달 헤더에 표시할 제목 */
1387
+ /** 모달 제목 (h2, heading_large_bold) */
819
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;
820
1399
  /** 모달 접근성 레이블(기본값: title 또는 "Dialog") */
821
1400
  ariaLabel?: string;
822
1401
  }
823
1402
  /**
824
1403
  * 모달을 렌더링한다.
825
- * 포커스 트랩과 스크롤 잠금을 적용하고, 열림 상태에 따라 오버레이/패널을 구성한다.
1404
+ * react-spring 기반 진입/퇴출 모션 + 포커스 트랩 + 바디 스크롤 잠금.
826
1405
  * @param props 모달 속성
827
1406
  * @returns 열림 상태일 때 렌더링된 모달, 닫힘 상태면 null
828
1407
  */
829
- 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;
830
1409
 
831
1410
  interface OtpInputProps {
832
1411
  /** OTP 자릿수 (기본값: 6) */
@@ -898,6 +1477,24 @@ declare const Radio: {
898
1477
  displayName: string;
899
1478
  };
900
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
+
901
1498
  interface SpinnerProps {
902
1499
  /** 스피너 크기(px) (기본값: 24) */
903
1500
  size?: number;
@@ -905,14 +1502,97 @@ interface SpinnerProps {
905
1502
  ariaLabel?: string;
906
1503
  }
907
1504
  /**
908
- * 스피너를 렌더링한다.
909
- * 크기와 접근성 레이블을 적용한 상태 표시용 요소를 반환한다.
1505
+ * 스피너를 렌더링한다. 12개 bar 가 방사형으로 배치되어 페이드 인/아웃 으로 회전하는 효과.
1506
+ * Vercel/iOS 스타일 클래식 border-spin 보다 부드럽고 미니멀.
910
1507
  * @param props 스피너 속성
911
1508
  * @returns 렌더링된 스피너 요소
912
1509
  */
913
1510
  declare const Spinner: ({ size, ariaLabel }: SpinnerProps) => react_jsx_runtime.JSX.Element;
914
1511
 
915
- 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";
916
1596
  interface TextFieldProps extends Omit<React$1.InputHTMLAttributes<HTMLInputElement>, "size" | "onChange" | "value" | "defaultValue"> {
917
1597
  /** 입력 필드 크기 (기본값: "md") */
918
1598
  size?: TextFieldSize;
@@ -1036,4 +1716,154 @@ interface TopLoadingProps {
1036
1716
  */
1037
1717
  declare const TopLoading: ({ progress, color, height, isLoading, ariaLabel, }: TopLoadingProps) => react_jsx_runtime.JSX.Element | null;
1038
1718
 
1039
- 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 };