@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/README.md +113 -218
- package/dist/index.css +8934 -607
- package/dist/index.d.ts +908 -76
- package/dist/index.js +1809 -1016
- package/dist/styles/a11y/_index.scss +64 -4
- package/dist/styles/border-width/_index.scss +1 -0
- package/dist/styles/colors/_index.scss +238 -38
- package/dist/styles/elevation/_index.scss +36 -5
- package/dist/styles/motion/_index.scss +19 -4
- package/dist/styles/skeleton/_index.scss +5 -3
- package/dist/styles/typography/_index.scss +71 -0
- package/dist/vanilla/bigtablet.min.css +1 -1
- package/package.json +29 -28
package/dist/index.d.ts
CHANGED
|
@@ -1,12 +1,463 @@
|
|
|
1
1
|
import * as React$1 from 'react';
|
|
2
|
-
import
|
|
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)와
|
|
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
|
-
|
|
544
|
-
|
|
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:
|
|
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
|
|
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,
|
|
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
|
-
/** 이미지 파일 선택 시
|
|
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
|
-
*
|
|
717
|
-
*
|
|
718
|
-
*
|
|
719
|
-
*
|
|
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
|
-
|
|
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<
|
|
727
|
-
/** 아이콘
|
|
728
|
-
|
|
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
|
-
*
|
|
738
|
-
*
|
|
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
|
-
({
|
|
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
|
-
/** 요소
|
|
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
|
-
/** 모달 패널 너비 (기본값:
|
|
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
|
|
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
|
-
|
|
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 };
|