@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/README.md +113 -218
- package/dist/index.css +8886 -649
- package/dist/index.d.ts +908 -78
- package/dist/index.js +1810 -1018
- 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,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
|
-
/**
|
|
513
|
-
|
|
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,
|
|
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
|
-
|
|
546
|
-
|
|
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:
|
|
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
|
|
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,
|
|
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
|
-
/** 이미지 파일 선택 시
|
|
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
|
-
*
|
|
719
|
-
*
|
|
720
|
-
*
|
|
721
|
-
*
|
|
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
|
-
|
|
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<
|
|
729
|
-
/** 아이콘
|
|
730
|
-
|
|
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
|
-
*
|
|
740
|
-
*
|
|
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
|
-
({
|
|
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
|
-
/** 요소
|
|
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
|
-
/** 모달 패널 너비 (기본값:
|
|
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
|
|
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
|
-
|
|
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 };
|