@designbasekorea/ui-contracts 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components.cjs +441 -0
- package/dist/components.d.ts +397 -0
- package/dist/components.d.ts.map +1 -0
- package/dist/components.js +435 -0
- package/dist/index.cjs +33 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/primitives.cjs +48 -0
- package/dist/primitives.d.ts +40 -0
- package/dist/primitives.d.ts.map +1 -0
- package/dist/primitives.js +43 -0
- package/package.json +46 -0
- package/src/components.ts +753 -0
- package/src/index.ts +18 -0
- package/src/primitives.ts +64 -0
|
@@ -0,0 +1,435 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 컴포넌트별 API 계약.
|
|
3
|
+
*
|
|
4
|
+
* 웹(@designbasekorea/ui-wc)과 React Native(@designbasekorea/ui-native)가
|
|
5
|
+
* 공유하는 컴포넌트의 variant/size/type 값은 전부 여기서 나온다.
|
|
6
|
+
* 한쪽에만 있는 컴포넌트(db-code-block, db-animation-background 등)는
|
|
7
|
+
* 여기에 넣지 않는다 — 공유하지 않는 것을 계약에 넣으면 계약이 죽는다.
|
|
8
|
+
*
|
|
9
|
+
* 값을 바꾸면 양쪽 구현이 동시에 타입 에러를 낸다. 그게 이 파일의 목적이다.
|
|
10
|
+
*/
|
|
11
|
+
import { FEEDBACK_TONES, RADIUS_SCALE, SIZE_SML, SIZE_XS_2XL, SIZE_XS_XL, } from './primitives.js';
|
|
12
|
+
// ─────────────────────────────────────────────────────────────
|
|
13
|
+
// Button
|
|
14
|
+
// ─────────────────────────────────────────────────────────────
|
|
15
|
+
export const BUTTON_VARIANTS = [
|
|
16
|
+
'primary',
|
|
17
|
+
'secondary',
|
|
18
|
+
'tertiary',
|
|
19
|
+
'destructive',
|
|
20
|
+
'ghost',
|
|
21
|
+
'accent',
|
|
22
|
+
];
|
|
23
|
+
/**
|
|
24
|
+
* 구 이름 → 현 이름. 버튼은 *동작*을 나타내므로 `destructive` 가 맞고,
|
|
25
|
+
* badge/chip/tooltip 등 *상태* 축은 `danger` 를 그대로 쓴다.
|
|
26
|
+
*
|
|
27
|
+
* 이미 배포된 `variant="danger"` 를 깨지 않기 위해 별칭을 남긴다.
|
|
28
|
+
* `coerceWithAliases` 가 이 표를 거쳐 정본 값으로 접는다.
|
|
29
|
+
*/
|
|
30
|
+
export const BUTTON_VARIANT_ALIASES = {
|
|
31
|
+
danger: 'destructive',
|
|
32
|
+
};
|
|
33
|
+
export const BUTTON_SIZES = SIZE_SML;
|
|
34
|
+
export const BUTTON_RADII = RADIUS_SCALE;
|
|
35
|
+
/** accent variant 에서만 의미가 있다 */
|
|
36
|
+
/**
|
|
37
|
+
* accent 버튼의 표현 방식.
|
|
38
|
+
*
|
|
39
|
+
* `primary` 가 먹색이 되면서 accent 가 브랜드 색을 쓰는 일상적인 버튼이 됐다.
|
|
40
|
+
* 그래서 기본은 `solid` 이고, 나머지는 의도적으로 고르는 장식이다.
|
|
41
|
+
* `prism` 은 테마의 프리즘 축(`--db-prism-*`)을 따르므로 프리셋을 바꾸면 함께 바뀐다.
|
|
42
|
+
*/
|
|
43
|
+
export const BUTTON_ACCENT_STYLES = ['solid', 'gradient', 'backlight', 'outline', 'prism'];
|
|
44
|
+
// ─────────────────────────────────────────────────────────────
|
|
45
|
+
// Input
|
|
46
|
+
// ─────────────────────────────────────────────────────────────
|
|
47
|
+
export const INPUT_SIZES = SIZE_SML;
|
|
48
|
+
/**
|
|
49
|
+
* 웹의 <input type> 에 대응한다. RN 에는 type 개념이 없고 keyboardType /
|
|
50
|
+
* secureTextEntry / autoComplete 조합으로 매핑되므로, RN 구현체는 이 값을
|
|
51
|
+
* 받아 내부적으로 변환한다. 값 집합 자체는 공유해야 API 가 통일된다.
|
|
52
|
+
*/
|
|
53
|
+
export const INPUT_TYPES = [
|
|
54
|
+
'text',
|
|
55
|
+
'email',
|
|
56
|
+
'password',
|
|
57
|
+
'url',
|
|
58
|
+
'search',
|
|
59
|
+
'tel',
|
|
60
|
+
'number',
|
|
61
|
+
];
|
|
62
|
+
// ─────────────────────────────────────────────────────────────
|
|
63
|
+
// Card
|
|
64
|
+
// ─────────────────────────────────────────────────────────────
|
|
65
|
+
/**
|
|
66
|
+
* 웹 기준으로 확정. RN 에 있던 elevated/outlined/filled 는 제거한다.
|
|
67
|
+
* (웹 db-card.scss 가 default/flat 만 구현하고 있고, 그림자·테두리 변형은
|
|
68
|
+
* 현재 hoverable/clickable 같은 별도 modifier 로 처리된다)
|
|
69
|
+
*/
|
|
70
|
+
export const CARD_VARIANTS = ['default', 'flat'];
|
|
71
|
+
export const CARD_SIZES = SIZE_SML;
|
|
72
|
+
// ─────────────────────────────────────────────────────────────
|
|
73
|
+
// Badge
|
|
74
|
+
// ─────────────────────────────────────────────────────────────
|
|
75
|
+
export const BADGE_VARIANTS = [
|
|
76
|
+
'primary',
|
|
77
|
+
'secondary',
|
|
78
|
+
'info',
|
|
79
|
+
'success',
|
|
80
|
+
'warning',
|
|
81
|
+
'danger',
|
|
82
|
+
];
|
|
83
|
+
export const BADGE_SIZES = SIZE_SML;
|
|
84
|
+
/**
|
|
85
|
+
* 표시 형태. 웹은 이 축을 `style` 이라고 불렀지만 `type` 으로 통일한다.
|
|
86
|
+
* (`style` 은 RN 에서 사실상 예약어이고, 나머지 컴포넌트도 `type` 을 쓴다)
|
|
87
|
+
*/
|
|
88
|
+
export const BADGE_TYPES = ['dot', 'number', 'text', 'outlined'];
|
|
89
|
+
// ─────────────────────────────────────────────────────────────
|
|
90
|
+
// Avatar
|
|
91
|
+
// ─────────────────────────────────────────────────────────────
|
|
92
|
+
export const AVATAR_SIZES = SIZE_XS_2XL;
|
|
93
|
+
export const AVATAR_VARIANTS = [
|
|
94
|
+
'default',
|
|
95
|
+
'primary',
|
|
96
|
+
'success',
|
|
97
|
+
'warning',
|
|
98
|
+
'danger',
|
|
99
|
+
'info',
|
|
100
|
+
];
|
|
101
|
+
export const AVATAR_STATUSES = ['online', 'offline', 'away', 'busy'];
|
|
102
|
+
// ─────────────────────────────────────────────────────────────
|
|
103
|
+
// Chip
|
|
104
|
+
// ─────────────────────────────────────────────────────────────
|
|
105
|
+
/**
|
|
106
|
+
* `outlined` 는 여기 없다. 색상 축(variant)과 테두리 축(outlined)이 섞여 있던 것을
|
|
107
|
+
* 분리했다 — outlined 는 별도 boolean prop 이며, 모든 색상과 조합 가능하다.
|
|
108
|
+
*/
|
|
109
|
+
export const CHIP_VARIANTS = [
|
|
110
|
+
'default',
|
|
111
|
+
'primary',
|
|
112
|
+
'success',
|
|
113
|
+
'warning',
|
|
114
|
+
'danger',
|
|
115
|
+
'info',
|
|
116
|
+
'neutral',
|
|
117
|
+
];
|
|
118
|
+
export const CHIP_SIZES = SIZE_SML;
|
|
119
|
+
// ─────────────────────────────────────────────────────────────
|
|
120
|
+
// Divider
|
|
121
|
+
// ─────────────────────────────────────────────────────────────
|
|
122
|
+
export const DIVIDER_COLORS = [
|
|
123
|
+
'primary',
|
|
124
|
+
'secondary',
|
|
125
|
+
'success',
|
|
126
|
+
'warning',
|
|
127
|
+
'danger',
|
|
128
|
+
'muted',
|
|
129
|
+
];
|
|
130
|
+
export const DIVIDER_ORIENTATIONS = ['horizontal', 'vertical'];
|
|
131
|
+
// ─────────────────────────────────────────────────────────────
|
|
132
|
+
// Spinner
|
|
133
|
+
// ─────────────────────────────────────────────────────────────
|
|
134
|
+
export const SPINNER_SIZES = SIZE_XS_XL;
|
|
135
|
+
/**
|
|
136
|
+
* RN 은 ActivityIndicator 가 circular 만 제공하므로 나머지는 직접 그려야 한다.
|
|
137
|
+
* 미구현 타입은 circular 로 폴백하되, 계약에서 빼지는 않는다.
|
|
138
|
+
*/
|
|
139
|
+
export const SPINNER_TYPES = ['circular', 'dots', 'bars', 'pulse', 'ripple'];
|
|
140
|
+
// ─────────────────────────────────────────────────────────────
|
|
141
|
+
// Toggle / Checkbox / Radio
|
|
142
|
+
// ─────────────────────────────────────────────────────────────
|
|
143
|
+
export const TOGGLE_SIZES = SIZE_SML;
|
|
144
|
+
/** 선택 상태의 시각적 톤. neutral 은 브랜드 컬러 없이 배경 레이어로 선택을 표현한다. */
|
|
145
|
+
export const TOGGLE_VARIANTS = ['default', 'neutral'];
|
|
146
|
+
export const CHECKBOX_SIZES = SIZE_SML;
|
|
147
|
+
export const RADIO_SIZES = SIZE_SML;
|
|
148
|
+
// ─────────────────────────────────────────────────────────────
|
|
149
|
+
// Alert / Toast
|
|
150
|
+
// ─────────────────────────────────────────────────────────────
|
|
151
|
+
/** `error` 아님 — danger 로 통일했다. FEEDBACK_TONES 참고. */
|
|
152
|
+
export const ALERT_VARIANTS = ['default', ...FEEDBACK_TONES];
|
|
153
|
+
export const ALERT_SIZES = SIZE_SML;
|
|
154
|
+
/**
|
|
155
|
+
* 웹은 이 축을 `status` attribute 로 불렀지만 `variant` 로 통일한다.
|
|
156
|
+
* 나머지 컴포넌트가 전부 variant 를 쓰는데 Toast 만 달랐다.
|
|
157
|
+
*/
|
|
158
|
+
export const TOAST_VARIANTS = ['default', ...FEEDBACK_TONES];
|
|
159
|
+
/**
|
|
160
|
+
* 웹 `toast()` 헬퍼가 이미 배포한 값 그대로다.
|
|
161
|
+
* RN 은 화면이 좁아 좌/중앙/우 차이가 작지만, 같은 이름을 받아야 코드가 옮겨진다.
|
|
162
|
+
*/
|
|
163
|
+
export const TOAST_POSITIONS = [
|
|
164
|
+
'top-left',
|
|
165
|
+
'top-center',
|
|
166
|
+
'top-right',
|
|
167
|
+
'bottom-left',
|
|
168
|
+
'bottom-center',
|
|
169
|
+
'bottom-right',
|
|
170
|
+
];
|
|
171
|
+
// ─────────────────────────────────────────────────────────────
|
|
172
|
+
// Modal / BottomSheet
|
|
173
|
+
// ─────────────────────────────────────────────────────────────
|
|
174
|
+
export const MODAL_SIZES = ['s', 'm', 'l', 'xl', 'full'];
|
|
175
|
+
export const BOTTOM_SHEET_VARIANTS = [
|
|
176
|
+
'default',
|
|
177
|
+
'persistent',
|
|
178
|
+
'temporary',
|
|
179
|
+
'fullscreen',
|
|
180
|
+
];
|
|
181
|
+
export const BOTTOM_SHEET_ANIMATIONS = ['slide', 'fade', 'scale', 'none'];
|
|
182
|
+
// ─────────────────────────────────────────────────────────────
|
|
183
|
+
// Tabs
|
|
184
|
+
// ─────────────────────────────────────────────────────────────
|
|
185
|
+
export const TABS_VARIANTS = ['default', 'pills'];
|
|
186
|
+
export const TABS_SIZES = SIZE_SML;
|
|
187
|
+
export const TABS_ORIENTATIONS = ['horizontal', 'vertical'];
|
|
188
|
+
// ─────────────────────────────────────────────────────────────
|
|
189
|
+
// Select
|
|
190
|
+
// ─────────────────────────────────────────────────────────────
|
|
191
|
+
export const SELECT_SIZES = SIZE_SML;
|
|
192
|
+
/** 드롭다운이 트리거 위/아래 중 어디에 펼쳐지는지 */
|
|
193
|
+
export const SELECT_POSITIONS = ['bottom', 'top'];
|
|
194
|
+
// ─────────────────────────────────────────────────────────────
|
|
195
|
+
// Navbar / BottomNavigation
|
|
196
|
+
// ─────────────────────────────────────────────────────────────
|
|
197
|
+
export const NAVBAR_VARIANTS = ['default', 'transparent'];
|
|
198
|
+
export const NAVBAR_SIZES = SIZE_SML;
|
|
199
|
+
/**
|
|
200
|
+
* RN 에는 CSS position 개념이 없다. sticky/fixed 는 네이티브에서 동일하게
|
|
201
|
+
* "스크롤과 무관하게 상단 고정" 으로 해석되고, static 만 스크롤을 따라간다.
|
|
202
|
+
*/
|
|
203
|
+
export const NAVBAR_POSITIONS = ['fixed', 'sticky', 'static'];
|
|
204
|
+
export const NAVIGATION_RAIL_SIZES = SIZE_SML;
|
|
205
|
+
export const NAVIGATION_RAIL_LABEL_DISPLAYS = ['tooltip', 'always'];
|
|
206
|
+
export const BOTTOM_NAV_SIZES = SIZE_SML;
|
|
207
|
+
export const BOTTOM_NAV_BACKGROUNDS = ['default', 'glass', 'transparent'];
|
|
208
|
+
// ─────────────────────────────────────────────────────────────
|
|
209
|
+
// SearchBar
|
|
210
|
+
// ─────────────────────────────────────────────────────────────
|
|
211
|
+
export const SEARCH_BAR_SIZES = SIZE_SML;
|
|
212
|
+
export const SEARCH_BAR_RECENT_LAYOUTS = ['vertical', 'horizontal'];
|
|
213
|
+
// ─────────────────────────────────────────────────────────────
|
|
214
|
+
// Skeleton
|
|
215
|
+
// ─────────────────────────────────────────────────────────────
|
|
216
|
+
export const SKELETON_VARIANTS = [
|
|
217
|
+
'text',
|
|
218
|
+
'circular',
|
|
219
|
+
'rectangular',
|
|
220
|
+
'rounded',
|
|
221
|
+
];
|
|
222
|
+
export const SKELETON_SIZES = SIZE_XS_XL;
|
|
223
|
+
// ─────────────────────────────────────────────────────────────
|
|
224
|
+
// ProgressBar
|
|
225
|
+
// ─────────────────────────────────────────────────────────────
|
|
226
|
+
export const PROGRESS_BAR_VARIANTS = ['default', 'primary', ...FEEDBACK_TONES];
|
|
227
|
+
export const PROGRESS_BAR_SIZES = SIZE_SML;
|
|
228
|
+
export const PROGRESS_BAR_STYLES = ['solid', 'striped', 'animated'];
|
|
229
|
+
// ─────────────────────────────────────────────────────────────
|
|
230
|
+
// 컴포넌트 로컬 enum 이관분
|
|
231
|
+
//
|
|
232
|
+
// 아래 상수들은 원래 각 ui-wc 컴포넌트 파일이 직접 선언하던 것이다.
|
|
233
|
+
// 같은 값을 두 곳에서 선언하면 한쪽에 값이 추가될 때 다른 쪽이 조용히 뒤처지므로
|
|
234
|
+
// 정본을 여기로 옮겼다. ui-native 는 필요한 것부터 이 상수를 채택한다.
|
|
235
|
+
// ─────────────────────────────────────────────────────────────
|
|
236
|
+
// db-accordion
|
|
237
|
+
export const ACCORDION_VARIANTS = ['default', 'bordered', 'separated', 'contained'];
|
|
238
|
+
export const ACCORDION_SIZES = SIZE_SML;
|
|
239
|
+
// db-banner
|
|
240
|
+
export const BANNER_VARIANTS = ['primary', 'secondary', 'tertiary', 'outline', 'image'];
|
|
241
|
+
export const BANNER_SIZES = SIZE_SML;
|
|
242
|
+
// db-breadcrumbs
|
|
243
|
+
export const BREADCRUMBS_VARIANTS = ['default', 'contained', 'underlined'];
|
|
244
|
+
export const BREADCRUMBS_SIZES = SIZE_SML;
|
|
245
|
+
// db-empty-state
|
|
246
|
+
export const EMPTY_STATE_VARIANTS = ['no-data', 'no-results', 'no-access', 'error', 'onboarding'];
|
|
247
|
+
export const EMPTY_STATE_SIZES = SIZE_SML;
|
|
248
|
+
// db-logo
|
|
249
|
+
export const LOGO_VARIANTS = ['default', 'original', 'primary', 'secondary', 'light', 'dark', 'white'];
|
|
250
|
+
export const LOGO_SIZES = ['xs', 's', 'm', 'l', 'xl'];
|
|
251
|
+
// db-menu-item
|
|
252
|
+
export const MENU_ITEM_VARIANTS = ['default', 'primary', 'success', 'warning', 'danger', 'info'];
|
|
253
|
+
export const MENU_ITEM_SIZES = SIZE_SML;
|
|
254
|
+
// db-pagination
|
|
255
|
+
export const PAGINATION_VARIANTS = ['default', 'outlined', 'minimal'];
|
|
256
|
+
export const PAGINATION_SIZES = SIZE_SML;
|
|
257
|
+
// db-kanban
|
|
258
|
+
export const KANBAN_SIZES = SIZE_SML;
|
|
259
|
+
// db-activity-heatmap
|
|
260
|
+
export const ACTIVITY_HEATMAP_SIZES = SIZE_SML;
|
|
261
|
+
export const ACTIVITY_HEATMAP_COLOR_SCHEMES = ['green', 'primary'];
|
|
262
|
+
// db-chat-message
|
|
263
|
+
export const CHAT_MESSAGE_ROLES = ['user', 'assistant', 'system'];
|
|
264
|
+
// db-ai-glow
|
|
265
|
+
export const AI_GLOW_VARIANTS = ['aurora', 'brand'];
|
|
266
|
+
export const AI_GLOW_STATES = ['thinking', 'working', 'listening'];
|
|
267
|
+
export const AI_GLOW_SIZES = SIZE_SML;
|
|
268
|
+
// db-chat-orb
|
|
269
|
+
export const CHAT_ORB_SIZES = SIZE_XS_XL;
|
|
270
|
+
export const CHAT_ORB_VARIANTS = ['aurora', 'ocean', 'emerald', 'violet', 'mono'];
|
|
271
|
+
export const CHAT_ORB_STATES = ['idle', 'thinking', 'listening'];
|
|
272
|
+
export const CHAT_ORB_THEMES = ['auto', 'light', 'dark'];
|
|
273
|
+
// db-chat-welcome
|
|
274
|
+
export const CHAT_WELCOME_ALIGNS = ['center', 'left'];
|
|
275
|
+
// db-chat-widget
|
|
276
|
+
export const CHAT_WIDGET_VIEWS = ['home', 'messages', 'conversation', 'help', 'article'];
|
|
277
|
+
export const CHAT_WIDGET_POSITIONS = ['bottom-right', 'bottom-left'];
|
|
278
|
+
// db-container
|
|
279
|
+
export const CONTAINER_SIZES = ['s', 'm', 'l', 'xl', 'full'];
|
|
280
|
+
export const CONTAINER_PADDINGS = ['none', 's', 'm', 'l', 'xl'];
|
|
281
|
+
// db-date-picker
|
|
282
|
+
export const DATE_PICKER_SIZES = SIZE_SML;
|
|
283
|
+
export const DATE_PICKER_VARIANTS = ['default', 'outlined', 'filled'];
|
|
284
|
+
// db-download-progress
|
|
285
|
+
export const DOWNLOAD_PROGRESS_STATUSES = ['downloading', 'paused', 'error', 'complete'];
|
|
286
|
+
export const DOWNLOAD_PROGRESS_POSITIONS = ['bottom-right', 'bottom-left', 'bottom-center', 'top-right', 'top-left', 'top-center'];
|
|
287
|
+
// db-drawer
|
|
288
|
+
export const DRAWER_POSITIONS = ['left', 'right', 'top', 'bottom'];
|
|
289
|
+
export const DRAWER_SIZES = ['s', 'm', 'l', 'xl', 'full'];
|
|
290
|
+
// db-dropdown
|
|
291
|
+
export const DROPDOWN_SIZES = SIZE_SML;
|
|
292
|
+
export const DROPDOWN_PLACEMENTS = ['bottom-left', 'bottom-right', 'top-left', 'top-right'];
|
|
293
|
+
export const DROPDOWN_TRIGGER_VARIANTS = ['primary', 'secondary', 'tertiary', 'danger', 'ghost'];
|
|
294
|
+
// db-dropzone
|
|
295
|
+
export const DROPZONE_SIZES = SIZE_SML;
|
|
296
|
+
export const DROPZONE_VARIANTS = ['default', 'outlined', 'filled'];
|
|
297
|
+
// db-email-verify
|
|
298
|
+
export const EMAIL_VERIFY_SIZES = SIZE_SML;
|
|
299
|
+
// db-file-uploader
|
|
300
|
+
export const FILE_UPLOADER_SIZES = SIZE_SML;
|
|
301
|
+
export const FILE_UPLOADER_VARIANTS = ['default', 'outlined', 'filled'];
|
|
302
|
+
// db-floating-action-button
|
|
303
|
+
export const FLOATING_ACTION_BUTTON_SIZES = SIZE_SML;
|
|
304
|
+
export const FLOATING_ACTION_BUTTON_VARIANTS = ['primary', 'secondary', 'tertiary'];
|
|
305
|
+
// db-footer
|
|
306
|
+
export const FOOTER_VARIANTS = ['default', 'compact', 'minimal'];
|
|
307
|
+
export const FOOTER_SIZES = SIZE_SML;
|
|
308
|
+
// db-indicator
|
|
309
|
+
export const INDICATOR_TYPES = ['dots', 'numbers', 'line', 'dot-line', 'slide', 'fill', 'combined'];
|
|
310
|
+
export const INDICATOR_SIZES = SIZE_SML;
|
|
311
|
+
export const INDICATOR_DIRECTIONS = ['horizontal', 'vertical'];
|
|
312
|
+
// db-lightbox
|
|
313
|
+
export const LIGHTBOX_SIZES = ['s', 'm', 'l', 'xl'];
|
|
314
|
+
// db-otp-input
|
|
315
|
+
export const OTP_INPUT_SIZES = SIZE_SML;
|
|
316
|
+
// db-page-header
|
|
317
|
+
export const PAGE_HEADER_VARIANTS = ['default', 'minimal'];
|
|
318
|
+
export const PAGE_HEADER_ALIGNS = ['center', 'left'];
|
|
319
|
+
// db-phone-verify
|
|
320
|
+
export const PHONE_VERIFY_SIZES = SIZE_SML;
|
|
321
|
+
// db-popover
|
|
322
|
+
export const POPOVER_PLACEMENTS = ['top', 'bottom', 'left', 'right', 'top-start', 'top-end', 'bottom-start', 'bottom-end', 'left-start', 'left-end', 'right-start', 'right-end'];
|
|
323
|
+
export const POPOVER_SIZES = SIZE_SML;
|
|
324
|
+
export const POPOVER_VARIANTS = ['default', 'primary', 'success', 'warning', 'danger', 'info'];
|
|
325
|
+
export const POPOVER_TRIGGERS = ['click', 'hover', 'focus', 'manual'];
|
|
326
|
+
// db-progress
|
|
327
|
+
export const PROGRESS_SIZES = SIZE_SML;
|
|
328
|
+
export const PROGRESS_VARIANTS = ['default', 'success', 'warning', 'danger'];
|
|
329
|
+
export const PROGRESS_CIRCULAR_STYLES = ['default', 'minimal'];
|
|
330
|
+
// db-section
|
|
331
|
+
export const SECTION_SIZES = SIZE_SML;
|
|
332
|
+
// db-sidebar
|
|
333
|
+
export const SIDEBAR_SIZES = SIZE_SML;
|
|
334
|
+
export const SIDEBAR_THEMES = ['default', 'dark', 'light'];
|
|
335
|
+
export const SIDEBAR_VARIANTS = ['default', 'wrapper'];
|
|
336
|
+
export const SIDEBAR_POSITIONS = ['left', 'right'];
|
|
337
|
+
export const SIDEBAR_PANEL_MODES = ['auto', 'adjacent', 'replace'];
|
|
338
|
+
export const SIDEBAR_CUSTOM_NAV_SLOTS = ['nav-top', 'nav', 'nav-bottom'];
|
|
339
|
+
// db-stat
|
|
340
|
+
export const STAT_SIZES = SIZE_SML;
|
|
341
|
+
export const STAT_VARIANTS = ['default', 'minimal', 'card', 'colored', 'iconBox'];
|
|
342
|
+
export const STAT_LAYOUTS = ['horizontal', 'vertical', 'reverse'];
|
|
343
|
+
export const STAT_COLORS = ['primary', 'secondary', 'success', 'warning', 'error', 'info', 'custom'];
|
|
344
|
+
// db-table
|
|
345
|
+
export const TABLE_SIZES = SIZE_SML;
|
|
346
|
+
export const TABLE_VARIANTS = ['default', 'striped', 'hoverable'];
|
|
347
|
+
// db-testimonial
|
|
348
|
+
export const TESTIMONIAL_VARIANTS = ['list', 'card', 'logo', 'image', 'text'];
|
|
349
|
+
// db-textarea
|
|
350
|
+
export const TEXTAREA_SIZES = SIZE_SML;
|
|
351
|
+
// db-time-picker
|
|
352
|
+
export const TIME_PICKER_SIZES = SIZE_SML;
|
|
353
|
+
export const TIME_PICKER_FORMATS = ['12h', '24h', '12h-with-seconds', '24h-with-seconds'];
|
|
354
|
+
/** TimePicker 드롭다운의 기준점. auto는 뷰포트 공간에 맞춰 상·하/좌·우를 계산한다. */
|
|
355
|
+
export const TIME_PICKER_DROPDOWN_POSITIONS = [
|
|
356
|
+
'auto',
|
|
357
|
+
'bottom-start',
|
|
358
|
+
'bottom-end',
|
|
359
|
+
'top-start',
|
|
360
|
+
'top-end',
|
|
361
|
+
];
|
|
362
|
+
// db-tooltip
|
|
363
|
+
export const TOOLTIP_POSITIONS = ['top', 'bottom', 'left', 'right', 'top-start', 'top-end', 'bottom-start', 'bottom-end', 'left-start', 'left-end', 'right-start', 'right-end'];
|
|
364
|
+
export const TOOLTIP_SIZES = SIZE_SML;
|
|
365
|
+
export const TOOLTIP_VARIANTS = ['default', 'primary', 'success', 'warning', 'danger', 'info'];
|
|
366
|
+
// db-top-banner
|
|
367
|
+
export const TOP_BANNER_VARIANTS = ['primary', 'white', 'dark'];
|
|
368
|
+
// db-two-factor
|
|
369
|
+
export const TWO_FACTOR_SIZES = SIZE_SML;
|
|
370
|
+
// ─────────────────────────────────────────────────────────────
|
|
371
|
+
// ui-wc 전용 컴포넌트 enum
|
|
372
|
+
//
|
|
373
|
+
// 웹 커스텀 엘리먼트도 attribute 를 통해 임의의 문자열을 받기 때문에,
|
|
374
|
+
// 공개 허용값과 런타임 fallback 을 같은 계약으로 유지한다.
|
|
375
|
+
// ─────────────────────────────────────────────────────────────
|
|
376
|
+
export const AD_BANNER_VARIANTS = ['primary', 'secondary', 'success', 'warning', 'error'];
|
|
377
|
+
export const AD_BANNER_SIZES = SIZE_SML;
|
|
378
|
+
export const ANIMATION_TEXT_SIZES = ['xs', 's', 'm', 'l', 'xl', '2xl', '3xl'];
|
|
379
|
+
export const ANIMATION_TEXT_ALIGNS = ['left', 'center', 'right', 'justify'];
|
|
380
|
+
export const APP_BADGE_SIZES = SIZE_SML;
|
|
381
|
+
export const AUDIO_PLAYER_VARIANTS = ['default', 'minimal', 'compact', 'full'];
|
|
382
|
+
export const AUDIO_PLAYER_SIZES = ['s', 'm', 'l', 'xl'];
|
|
383
|
+
export const CAROUSEL_VARIANTS = ['default', 'cards', 'gallery', 'hero', 'testimonial'];
|
|
384
|
+
export const CAROUSEL_SIZES = ['s', 'm', 'l', 'xl'];
|
|
385
|
+
export const COLOR_PICKER_SIZES = SIZE_SML;
|
|
386
|
+
export const COLOR_PICKER_POSITIONS = ['bottom-start', 'bottom-end', 'top-start', 'top-end'];
|
|
387
|
+
export const COLOR_SWATCH_SIZES = SIZE_SML;
|
|
388
|
+
export const CONFIRM_VARIANTS = ['default', 'info', 'success', 'warning', 'danger'];
|
|
389
|
+
export const CONFIRM_SIZES = SIZE_SML;
|
|
390
|
+
export const COUNTDOWN_VARIANTS = ['default', 'compact', 'minimal'];
|
|
391
|
+
export const COUNTDOWN_SIZES = SIZE_SML;
|
|
392
|
+
export const GRADIENT_VARIANTS = ['default', 'animated', 'mesh'];
|
|
393
|
+
export const GRADIENT_SIZES = ['s', 'm', 'l', 'xl', 'full'];
|
|
394
|
+
export const GRID_BACKGROUND_SIZES = SIZE_SML;
|
|
395
|
+
export const LABEL_SIZES = SIZE_SML;
|
|
396
|
+
export const LIST_VARIANTS = ['default', 'minimal', 'bordered', 'card', 'navigation'];
|
|
397
|
+
export const LIST_SIZES = SIZE_SML;
|
|
398
|
+
export const MARKDOWN_EDITOR_VARIANTS = ['default', 'filled', 'outlined'];
|
|
399
|
+
export const MARKDOWN_EDITOR_SIZES = SIZE_SML;
|
|
400
|
+
export const MARQUEE_VARIANTS = ['default', 'filled', 'outlined'];
|
|
401
|
+
export const MARQUEE_SIZES = SIZE_SML;
|
|
402
|
+
export const PROGRESS_STEP_SIZES = SIZE_SML;
|
|
403
|
+
export const RANDOM_GRADIENT_TONES = ['light', 'vivid', 'dark'];
|
|
404
|
+
export const RATING_VARIANTS = ['default', 'minimal', 'card', 'inline', 'large'];
|
|
405
|
+
export const RATING_SIZES = SIZE_SML;
|
|
406
|
+
export const REORDER_VARIANTS = ['default', 'bordered', 'filled', 'minimal'];
|
|
407
|
+
export const REORDER_SIZES = SIZE_SML;
|
|
408
|
+
export const SECTION_ALIGNS = ['left', 'center', 'right'];
|
|
409
|
+
export const SECTION_APP_DOWNLOAD_SIZES = SIZE_SML;
|
|
410
|
+
export const SECTION_CONTACT_SIZES = SIZE_SML;
|
|
411
|
+
export const SECTION_CTA_VARIANTS = ['default', 'dark', 'light', 'gradient', 'tinted'];
|
|
412
|
+
export const SECTION_CTA_SIZES = SIZE_SML;
|
|
413
|
+
export const SECTION_FAQ_SIZES = SIZE_SML;
|
|
414
|
+
export const SECTION_FEATURE_SIZES = SIZE_SML;
|
|
415
|
+
export const SECTION_FEATURE_GRID_SIZES = SIZE_SML;
|
|
416
|
+
export const SECTION_HERO_VARIANTS = ['default', 'showcase', 'split', 'overlay', 'centered'];
|
|
417
|
+
export const SECTION_LOGO_CLOUD_VARIANTS = ['grid', 'inline', 'minimal', 'marquee'];
|
|
418
|
+
export const SECTION_LOGO_CLOUD_SIZES = SIZE_SML;
|
|
419
|
+
export const SECTION_PRICING_SIZES = SIZE_SML;
|
|
420
|
+
export const SECTION_STATS_SIZES = SIZE_SML;
|
|
421
|
+
export const SECTION_TESTIMONIALS_VARIANTS = ['grid', 'list', 'carousel', 'cards'];
|
|
422
|
+
export const SECTION_TESTIMONIALS_SIZES = SIZE_SML;
|
|
423
|
+
export const SHARE_VARIANTS = ['button', 'dropdown', 'modal', 'inline'];
|
|
424
|
+
export const SHARE_SIZES = SIZE_SML;
|
|
425
|
+
export const SHARE_POSITIONS = ['top', 'bottom', 'left', 'right'];
|
|
426
|
+
export const SIGNATURE_VARIANTS = ['dashed', 'outlined'];
|
|
427
|
+
export const TIMELINE_VARIANTS = ['default', 'alternate', 'left', 'right'];
|
|
428
|
+
export const TIMELINE_SIZES = SIZE_SML;
|
|
429
|
+
export const TOOLBAR_VARIANTS = ['default', 'filled', 'outlined', 'ghost'];
|
|
430
|
+
export const TOOLBAR_SIZES = SIZE_SML;
|
|
431
|
+
export const TOOLBAR_POSITIONS = ['top', 'bottom', 'left', 'right', 'floating'];
|
|
432
|
+
export const VIDEO_PLAYER_VARIANTS = ['default', 'minimal', 'theater'];
|
|
433
|
+
export const VIDEO_PLAYER_SIZES = ['s', 'm', 'l', 'xl'];
|
|
434
|
+
export const YOUTUBE_PLAYER_VARIANTS = ['default', 'minimal', 'theater', 'full'];
|
|
435
|
+
export const YOUTUBE_PLAYER_SIZES = ['s', 'm', 'l', 'xl'];
|
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @designbasekorea/ui-contracts
|
|
4
|
+
*
|
|
5
|
+
* 웹(ui-wc)과 React Native(ui-native)가 공유하는 컴포넌트 API 계약.
|
|
6
|
+
*
|
|
7
|
+
* 소스는 하나도 공유하지 않는다 — 웹은 커스텀 엘리먼트 + CSS, RN 은 View/StyleSheet 라
|
|
8
|
+
* 구현을 공유할 방법이 없다. 대신 "무엇을 받아들이는가"는 공유한다.
|
|
9
|
+
* 그래야 디자이너가 말하는 variant 이름이 양쪽에서 같은 것을 가리킨다.
|
|
10
|
+
*
|
|
11
|
+
* 사용법:
|
|
12
|
+
* 웹 — `import { BUTTON_VARIANTS } from '@designbasekorea/ui-contracts'`
|
|
13
|
+
* attribute 문자열 검증에 배열을 그대로 쓴다.
|
|
14
|
+
* RN — `import type { ButtonVariant } from '@designbasekorea/ui-contracts'`
|
|
15
|
+
* prop 타입으로 쓴다.
|
|
16
|
+
*/
|
|
17
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
18
|
+
if (k2 === undefined) k2 = k;
|
|
19
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
20
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
21
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
22
|
+
}
|
|
23
|
+
Object.defineProperty(o, k2, desc);
|
|
24
|
+
}) : (function(o, m, k, k2) {
|
|
25
|
+
if (k2 === undefined) k2 = k;
|
|
26
|
+
o[k2] = m[k];
|
|
27
|
+
}));
|
|
28
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
29
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
30
|
+
};
|
|
31
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
32
|
+
__exportStar(require("./primitives.cjs"), exports);
|
|
33
|
+
__exportStar(require("./components.cjs"), exports);
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @designbasekorea/ui-contracts
|
|
3
|
+
*
|
|
4
|
+
* 웹(ui-wc)과 React Native(ui-native)가 공유하는 컴포넌트 API 계약.
|
|
5
|
+
*
|
|
6
|
+
* 소스는 하나도 공유하지 않는다 — 웹은 커스텀 엘리먼트 + CSS, RN 은 View/StyleSheet 라
|
|
7
|
+
* 구현을 공유할 방법이 없다. 대신 "무엇을 받아들이는가"는 공유한다.
|
|
8
|
+
* 그래야 디자이너가 말하는 variant 이름이 양쪽에서 같은 것을 가리킨다.
|
|
9
|
+
*
|
|
10
|
+
* 사용법:
|
|
11
|
+
* 웹 — `import { BUTTON_VARIANTS } from '@designbasekorea/ui-contracts'`
|
|
12
|
+
* attribute 문자열 검증에 배열을 그대로 쓴다.
|
|
13
|
+
* RN — `import type { ButtonVariant } from '@designbasekorea/ui-contracts'`
|
|
14
|
+
* prop 타입으로 쓴다.
|
|
15
|
+
*/
|
|
16
|
+
export * from './primitives.js';
|
|
17
|
+
export * from './components.js';
|
|
18
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @designbasekorea/ui-contracts
|
|
3
|
+
*
|
|
4
|
+
* 웹(ui-wc)과 React Native(ui-native)가 공유하는 컴포넌트 API 계약.
|
|
5
|
+
*
|
|
6
|
+
* 소스는 하나도 공유하지 않는다 — 웹은 커스텀 엘리먼트 + CSS, RN 은 View/StyleSheet 라
|
|
7
|
+
* 구현을 공유할 방법이 없다. 대신 "무엇을 받아들이는가"는 공유한다.
|
|
8
|
+
* 그래야 디자이너가 말하는 variant 이름이 양쪽에서 같은 것을 가리킨다.
|
|
9
|
+
*
|
|
10
|
+
* 사용법:
|
|
11
|
+
* 웹 — `import { BUTTON_VARIANTS } from '@designbasekorea/ui-contracts'`
|
|
12
|
+
* attribute 문자열 검증에 배열을 그대로 쓴다.
|
|
13
|
+
* RN — `import type { ButtonVariant } from '@designbasekorea/ui-contracts'`
|
|
14
|
+
* prop 타입으로 쓴다.
|
|
15
|
+
*/
|
|
16
|
+
export * from './primitives.js';
|
|
17
|
+
export * from './components.js';
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* 여러 컴포넌트가 공유하는 기본 스케일.
|
|
4
|
+
*
|
|
5
|
+
* 개별 컴포넌트가 자기만의 s/m/l 을 따로 선언하면 한쪽에서 값이 추가될 때
|
|
6
|
+
* 다른 쪽이 조용히 뒤처진다. 스케일은 여기서만 정의한다.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.RADIUS_SCALE = exports.FEEDBACK_TONES = exports.SIZE_XS_2XL = exports.SIZE_XS_XL = exports.SIZE_SML = void 0;
|
|
10
|
+
exports.coerceToContract = coerceToContract;
|
|
11
|
+
exports.coerceWithAliases = coerceWithAliases;
|
|
12
|
+
/** 표준 3단계 스케일 — 대부분의 컨트롤(Button, Input, Checkbox 등)이 사용한다 */
|
|
13
|
+
exports.SIZE_SML = ['s', 'm', 'l'];
|
|
14
|
+
/** 확장 5단계 스케일 — Spinner, Skeleton 등 시각 요소가 사용한다 */
|
|
15
|
+
exports.SIZE_XS_XL = ['xs', 's', 'm', 'l', 'xl'];
|
|
16
|
+
/** Avatar 전용 6단계 스케일 */
|
|
17
|
+
exports.SIZE_XS_2XL = ['xs', 's', 'm', 'l', 'xl', '2xl'];
|
|
18
|
+
/**
|
|
19
|
+
* 피드백 톤.
|
|
20
|
+
*
|
|
21
|
+
* ⚠️ `error` 가 아니라 `danger` 다. 디자인 토큰은 내부적으로 `feedback.error` 라는
|
|
22
|
+
* 키를 쓰지만, 컴포넌트 공개 API 는 danger 로 통일한다. 토큰 키와 API 이름이
|
|
23
|
+
* 다른 것은 의도된 것이며, 매핑은 각 구현체가 담당한다.
|
|
24
|
+
*/
|
|
25
|
+
exports.FEEDBACK_TONES = ['info', 'success', 'warning', 'danger'];
|
|
26
|
+
/** 둥글기 스케일 */
|
|
27
|
+
exports.RADIUS_SCALE = ['none', 's', 'm', 'l', 'pill'];
|
|
28
|
+
/**
|
|
29
|
+
* 계약 위반을 런타임에 잡기 위한 헬퍼.
|
|
30
|
+
*
|
|
31
|
+
* 웹 커스텀 엘리먼트는 attribute 로 임의의 문자열을 받으므로, 계약에 없는 값이
|
|
32
|
+
* 들어오면 기본값으로 되돌린다. RN 은 타입으로 막히니 이 헬퍼가 필요 없다.
|
|
33
|
+
*/
|
|
34
|
+
function coerceToContract(value, allowed, fallback) {
|
|
35
|
+
return value && allowed.includes(value)
|
|
36
|
+
? value
|
|
37
|
+
: fallback;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* `coerceToContract` 와 같지만, 계약에서 빠진 구 이름을 별칭표로 한 번 접는다.
|
|
41
|
+
* 이름을 바꾼 뒤에도 이미 배포된 마크업이 계속 동작하게 하는 용도다.
|
|
42
|
+
*/
|
|
43
|
+
function coerceWithAliases(value, allowed, aliases, fallback) {
|
|
44
|
+
if (value && !allowed.includes(value) && value in aliases) {
|
|
45
|
+
return aliases[value];
|
|
46
|
+
}
|
|
47
|
+
return coerceToContract(value, allowed, fallback);
|
|
48
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 여러 컴포넌트가 공유하는 기본 스케일.
|
|
3
|
+
*
|
|
4
|
+
* 개별 컴포넌트가 자기만의 s/m/l 을 따로 선언하면 한쪽에서 값이 추가될 때
|
|
5
|
+
* 다른 쪽이 조용히 뒤처진다. 스케일은 여기서만 정의한다.
|
|
6
|
+
*/
|
|
7
|
+
/** 표준 3단계 스케일 — 대부분의 컨트롤(Button, Input, Checkbox 등)이 사용한다 */
|
|
8
|
+
export declare const SIZE_SML: readonly ["s", "m", "l"];
|
|
9
|
+
export type SizeSML = (typeof SIZE_SML)[number];
|
|
10
|
+
/** 확장 5단계 스케일 — Spinner, Skeleton 등 시각 요소가 사용한다 */
|
|
11
|
+
export declare const SIZE_XS_XL: readonly ["xs", "s", "m", "l", "xl"];
|
|
12
|
+
export type SizeXsXl = (typeof SIZE_XS_XL)[number];
|
|
13
|
+
/** Avatar 전용 6단계 스케일 */
|
|
14
|
+
export declare const SIZE_XS_2XL: readonly ["xs", "s", "m", "l", "xl", "2xl"];
|
|
15
|
+
export type SizeXs2Xl = (typeof SIZE_XS_2XL)[number];
|
|
16
|
+
/**
|
|
17
|
+
* 피드백 톤.
|
|
18
|
+
*
|
|
19
|
+
* ⚠️ `error` 가 아니라 `danger` 다. 디자인 토큰은 내부적으로 `feedback.error` 라는
|
|
20
|
+
* 키를 쓰지만, 컴포넌트 공개 API 는 danger 로 통일한다. 토큰 키와 API 이름이
|
|
21
|
+
* 다른 것은 의도된 것이며, 매핑은 각 구현체가 담당한다.
|
|
22
|
+
*/
|
|
23
|
+
export declare const FEEDBACK_TONES: readonly ["info", "success", "warning", "danger"];
|
|
24
|
+
export type FeedbackTone = (typeof FEEDBACK_TONES)[number];
|
|
25
|
+
/** 둥글기 스케일 */
|
|
26
|
+
export declare const RADIUS_SCALE: readonly ["none", "s", "m", "l", "pill"];
|
|
27
|
+
export type RadiusScale = (typeof RADIUS_SCALE)[number];
|
|
28
|
+
/**
|
|
29
|
+
* 계약 위반을 런타임에 잡기 위한 헬퍼.
|
|
30
|
+
*
|
|
31
|
+
* 웹 커스텀 엘리먼트는 attribute 로 임의의 문자열을 받으므로, 계약에 없는 값이
|
|
32
|
+
* 들어오면 기본값으로 되돌린다. RN 은 타입으로 막히니 이 헬퍼가 필요 없다.
|
|
33
|
+
*/
|
|
34
|
+
export declare function coerceToContract<T extends readonly string[]>(value: string | null | undefined, allowed: T, fallback: T[number]): T[number];
|
|
35
|
+
/**
|
|
36
|
+
* `coerceToContract` 와 같지만, 계약에서 빠진 구 이름을 별칭표로 한 번 접는다.
|
|
37
|
+
* 이름을 바꾼 뒤에도 이미 배포된 마크업이 계속 동작하게 하는 용도다.
|
|
38
|
+
*/
|
|
39
|
+
export declare function coerceWithAliases<T extends readonly string[]>(value: string | null | undefined, allowed: T, aliases: Readonly<Record<string, T[number]>>, fallback: T[number]): T[number];
|
|
40
|
+
//# sourceMappingURL=primitives.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"primitives.d.ts","sourceRoot":"","sources":["../src/primitives.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,6DAA6D;AAC7D,eAAO,MAAM,QAAQ,0BAA2B,CAAC;AACjD,MAAM,MAAM,OAAO,GAAG,CAAC,OAAO,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC;AAEhD,mDAAmD;AACnD,eAAO,MAAM,UAAU,sCAAuC,CAAC;AAC/D,MAAM,MAAM,QAAQ,GAAG,CAAC,OAAO,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC;AAEnD,wBAAwB;AACxB,eAAO,MAAM,WAAW,6CAA8C,CAAC;AACvE,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC;AAErD;;;;;;GAMG;AACH,eAAO,MAAM,cAAc,mDAAoD,CAAC;AAChF,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC;AAE3D,cAAc;AACd,eAAO,MAAM,YAAY,0CAA2C,CAAC;AACrE,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;AAExD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,SAAS,MAAM,EAAE,EACxD,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAChC,OAAO,EAAE,CAAC,EACV,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,GACpB,CAAC,CAAC,MAAM,CAAC,CAIX;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,SAAS,MAAM,EAAE,EACzD,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAChC,OAAO,EAAE,CAAC,EACV,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAC5C,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,GACpB,CAAC,CAAC,MAAM,CAAC,CAKX"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 여러 컴포넌트가 공유하는 기본 스케일.
|
|
3
|
+
*
|
|
4
|
+
* 개별 컴포넌트가 자기만의 s/m/l 을 따로 선언하면 한쪽에서 값이 추가될 때
|
|
5
|
+
* 다른 쪽이 조용히 뒤처진다. 스케일은 여기서만 정의한다.
|
|
6
|
+
*/
|
|
7
|
+
/** 표준 3단계 스케일 — 대부분의 컨트롤(Button, Input, Checkbox 등)이 사용한다 */
|
|
8
|
+
export const SIZE_SML = ['s', 'm', 'l'];
|
|
9
|
+
/** 확장 5단계 스케일 — Spinner, Skeleton 등 시각 요소가 사용한다 */
|
|
10
|
+
export const SIZE_XS_XL = ['xs', 's', 'm', 'l', 'xl'];
|
|
11
|
+
/** Avatar 전용 6단계 스케일 */
|
|
12
|
+
export const SIZE_XS_2XL = ['xs', 's', 'm', 'l', 'xl', '2xl'];
|
|
13
|
+
/**
|
|
14
|
+
* 피드백 톤.
|
|
15
|
+
*
|
|
16
|
+
* ⚠️ `error` 가 아니라 `danger` 다. 디자인 토큰은 내부적으로 `feedback.error` 라는
|
|
17
|
+
* 키를 쓰지만, 컴포넌트 공개 API 는 danger 로 통일한다. 토큰 키와 API 이름이
|
|
18
|
+
* 다른 것은 의도된 것이며, 매핑은 각 구현체가 담당한다.
|
|
19
|
+
*/
|
|
20
|
+
export const FEEDBACK_TONES = ['info', 'success', 'warning', 'danger'];
|
|
21
|
+
/** 둥글기 스케일 */
|
|
22
|
+
export const RADIUS_SCALE = ['none', 's', 'm', 'l', 'pill'];
|
|
23
|
+
/**
|
|
24
|
+
* 계약 위반을 런타임에 잡기 위한 헬퍼.
|
|
25
|
+
*
|
|
26
|
+
* 웹 커스텀 엘리먼트는 attribute 로 임의의 문자열을 받으므로, 계약에 없는 값이
|
|
27
|
+
* 들어오면 기본값으로 되돌린다. RN 은 타입으로 막히니 이 헬퍼가 필요 없다.
|
|
28
|
+
*/
|
|
29
|
+
export function coerceToContract(value, allowed, fallback) {
|
|
30
|
+
return value && allowed.includes(value)
|
|
31
|
+
? value
|
|
32
|
+
: fallback;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* `coerceToContract` 와 같지만, 계약에서 빠진 구 이름을 별칭표로 한 번 접는다.
|
|
36
|
+
* 이름을 바꾼 뒤에도 이미 배포된 마크업이 계속 동작하게 하는 용도다.
|
|
37
|
+
*/
|
|
38
|
+
export function coerceWithAliases(value, allowed, aliases, fallback) {
|
|
39
|
+
if (value && !allowed.includes(value) && value in aliases) {
|
|
40
|
+
return aliases[value];
|
|
41
|
+
}
|
|
42
|
+
return coerceToContract(value, allowed, fallback);
|
|
43
|
+
}
|