@x-plat/design-system 0.8.3 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/AutoResizeTextArea/index.cjs +140 -4
- package/dist/components/AutoResizeTextArea/index.css +38 -0
- package/dist/components/AutoResizeTextArea/index.d.cts +4 -0
- package/dist/components/AutoResizeTextArea/index.d.ts +4 -0
- package/dist/components/AutoResizeTextArea/index.js +140 -4
- package/dist/components/Badge/index.cjs +5 -1
- package/dist/components/Badge/index.css +1 -0
- package/dist/components/Badge/index.d.cts +1 -0
- package/dist/components/Badge/index.d.ts +1 -0
- package/dist/components/Badge/index.js +5 -1
- package/dist/components/Box/index.d.cts +3 -0
- package/dist/components/Box/index.d.ts +3 -0
- package/dist/components/Chart/index.cjs +7 -6
- package/dist/components/Chart/index.d.cts +12 -1
- package/dist/components/Chart/index.d.ts +12 -1
- package/dist/components/Chart/index.js +7 -6
- package/dist/components/ChatInput/index.cjs +150 -9
- package/dist/components/ChatInput/index.css +38 -0
- package/dist/components/ChatInput/index.d.cts +9 -0
- package/dist/components/ChatInput/index.d.ts +9 -0
- package/dist/components/ChatInput/index.js +151 -10
- package/dist/components/CheckBox/index.cjs +137 -6
- package/dist/components/CheckBox/index.css +40 -0
- package/dist/components/CheckBox/index.d.cts +13 -2
- package/dist/components/CheckBox/index.d.ts +13 -2
- package/dist/components/CheckBox/index.js +137 -6
- package/dist/components/Chip/index.d.cts +2 -0
- package/dist/components/Chip/index.d.ts +2 -0
- package/dist/components/DatePicker/index.cjs +76 -62
- package/dist/components/DatePicker/index.css +38 -31
- package/dist/components/DatePicker/index.js +42 -28
- package/dist/components/Drawer/index.d.cts +1 -0
- package/dist/components/Drawer/index.d.ts +1 -0
- package/dist/components/FieldMessage/index.cjs +183 -0
- package/dist/components/FieldMessage/index.css +37 -0
- package/dist/components/FieldMessage/index.d.cts +37 -0
- package/dist/components/FieldMessage/index.d.ts +37 -0
- package/dist/components/FieldMessage/index.js +154 -0
- package/dist/components/FileUpload/index.cjs +135 -8
- package/dist/components/FileUpload/index.css +38 -0
- package/dist/components/FileUpload/index.d.cts +9 -0
- package/dist/components/FileUpload/index.d.ts +9 -0
- package/dist/components/FileUpload/index.js +135 -8
- package/dist/components/ImageSelector/index.cjs +153 -11
- package/dist/components/ImageSelector/index.css +38 -0
- package/dist/components/ImageSelector/index.d.cts +6 -0
- package/dist/components/ImageSelector/index.d.ts +6 -0
- package/dist/components/ImageSelector/index.js +153 -11
- package/dist/components/Input/index.cjs +38 -25
- package/dist/components/Input/index.css +38 -31
- package/dist/components/Input/index.d.cts +7 -8
- package/dist/components/Input/index.d.ts +7 -8
- package/dist/components/Input/index.js +36 -23
- package/dist/components/NotificationBadge/index.cjs +5 -1
- package/dist/components/NotificationBadge/index.css +1 -0
- package/dist/components/NotificationBadge/index.d.cts +6 -2
- package/dist/components/NotificationBadge/index.d.ts +6 -2
- package/dist/components/NotificationBadge/index.js +5 -1
- package/dist/components/Pagination/index.cjs +6 -2
- package/dist/components/Pagination/index.css +1 -0
- package/dist/components/Pagination/index.d.cts +13 -2
- package/dist/components/Pagination/index.d.ts +13 -2
- package/dist/components/Pagination/index.js +6 -2
- package/dist/components/Progress/index.cjs +6 -2
- package/dist/components/Progress/index.css +1 -0
- package/dist/components/Progress/index.d.cts +11 -2
- package/dist/components/Progress/index.d.ts +11 -2
- package/dist/components/Progress/index.js +6 -2
- package/dist/components/Radio/index.cjs +158 -10
- package/dist/components/Radio/index.css +40 -0
- package/dist/components/Radio/index.d.cts +14 -2
- package/dist/components/Radio/index.d.ts +14 -2
- package/dist/components/Radio/index.js +158 -10
- package/dist/components/Select/index.cjs +139 -13
- package/dist/components/Select/index.css +38 -0
- package/dist/components/Select/index.d.cts +8 -1
- package/dist/components/Select/index.d.ts +8 -1
- package/dist/components/Select/index.js +139 -13
- package/dist/components/Skeleton/index.d.cts +3 -0
- package/dist/components/Skeleton/index.d.ts +3 -0
- package/dist/components/Spinner/index.cjs +6 -2
- package/dist/components/Spinner/index.css +1 -0
- package/dist/components/Spinner/index.d.cts +8 -2
- package/dist/components/Spinner/index.d.ts +8 -2
- package/dist/components/Spinner/index.js +6 -2
- package/dist/components/Steps/index.cjs +6 -2
- package/dist/components/Steps/index.css +11 -0
- package/dist/components/Steps/index.d.cts +9 -2
- package/dist/components/Steps/index.d.ts +9 -2
- package/dist/components/Steps/index.js +6 -2
- package/dist/components/Switch/index.cjs +146 -6
- package/dist/components/Switch/index.css +40 -0
- package/dist/components/Switch/index.d.cts +13 -2
- package/dist/components/Switch/index.d.ts +13 -2
- package/dist/components/Switch/index.js +146 -6
- package/dist/components/Tab/index.cjs +4 -3
- package/dist/components/Tab/index.d.cts +12 -1
- package/dist/components/Tab/index.d.ts +12 -1
- package/dist/components/Tab/index.js +4 -3
- package/dist/components/Tag/index.cjs +5 -3
- package/dist/components/Tag/index.d.cts +12 -2
- package/dist/components/Tag/index.d.ts +12 -2
- package/dist/components/Tag/index.js +5 -3
- package/dist/components/TextArea/index.cjs +138 -2
- package/dist/components/TextArea/index.css +38 -0
- package/dist/components/TextArea/index.d.cts +6 -0
- package/dist/components/TextArea/index.d.ts +6 -0
- package/dist/components/TextArea/index.js +138 -2
- package/dist/components/Tooltip/index.cjs +4 -2
- package/dist/components/Tooltip/index.d.cts +11 -1
- package/dist/components/Tooltip/index.d.ts +11 -1
- package/dist/components/Tooltip/index.js +4 -2
- package/dist/components/index.cjs +479 -408
- package/dist/components/index.css +59 -31
- package/dist/components/index.d.cts +3 -0
- package/dist/components/index.d.ts +3 -0
- package/dist/components/index.js +262 -194
- package/dist/index.cjs +484 -413
- package/dist/index.css +59 -31
- package/dist/index.d.cts +3 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +264 -196
- package/dist/status-g_KP3qT6.d.cts +8 -0
- package/dist/status-g_KP3qT6.d.ts +8 -0
- package/dist/validation-Dqo1zqhT.d.cts +13 -0
- package/dist/validation-Dqo1zqhT.d.ts +13 -0
- package/guidelines/AGENT_PROMPT.md +15 -0
- package/guidelines/components/card.md +3 -3
- package/guidelines/components/feedback.md +1 -1
- package/guidelines/components/form.md +26 -0
- package/guidelines/components/navigation.md +16 -15
- package/guidelines/components/overlay.md +43 -4
- package/package.json +1 -1
|
@@ -1,14 +1,24 @@
|
|
|
1
1
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
2
|
import React from 'react';
|
|
3
3
|
|
|
4
|
-
type
|
|
4
|
+
type TagVariant = "neutral" | "categorical";
|
|
5
5
|
type TagSize = "sm" | "md" | "lg";
|
|
6
6
|
interface TagProps {
|
|
7
7
|
children: React.ReactNode;
|
|
8
|
-
|
|
8
|
+
/** 태그 배색. `categorical` 은 `colorIndex` 로 계열 색을 고른다 */
|
|
9
|
+
variant?: TagVariant;
|
|
10
|
+
/**
|
|
11
|
+
* @deprecated 모양 변형은 `variant` 로 받는다. `type` 은 상태 색 전용이다.
|
|
12
|
+
* 기존 사용처가 깨지지 않도록 계속 받는다 — 둘 다 주면 `variant` 가 이긴다.
|
|
13
|
+
*/
|
|
14
|
+
type?: TagVariant;
|
|
15
|
+
/** 주면 오른쪽에 닫기 버튼이 생긴다. 제거 가능한 태그로 쓸 때 */
|
|
9
16
|
onClose?: () => void;
|
|
17
|
+
/** 태그 크기 */
|
|
10
18
|
size?: TagSize;
|
|
19
|
+
/** 흐리게 표시하고 닫기 버튼을 막는다 */
|
|
11
20
|
disabled?: boolean;
|
|
21
|
+
/** variant 가 categorical 일 때 쓸 계열 색 번호 (1~8) */
|
|
12
22
|
colorIndex?: number;
|
|
13
23
|
}
|
|
14
24
|
declare const Tag: {
|
|
@@ -913,20 +913,22 @@ import { jsx as jsx295, jsxs as jsxs189 } from "react/jsx-runtime";
|
|
|
913
913
|
var Tag = (props) => {
|
|
914
914
|
const {
|
|
915
915
|
children,
|
|
916
|
-
|
|
916
|
+
variant,
|
|
917
|
+
type,
|
|
917
918
|
onClose,
|
|
918
919
|
size = "md",
|
|
919
920
|
disabled = false,
|
|
920
921
|
colorIndex
|
|
921
922
|
} = props;
|
|
923
|
+
const shape = variant ?? type ?? "neutral";
|
|
922
924
|
return /* @__PURE__ */ jsxs189(
|
|
923
925
|
"span",
|
|
924
926
|
{
|
|
925
927
|
className: clsx_default(
|
|
926
928
|
"lib-xplat-tag",
|
|
927
|
-
|
|
929
|
+
shape,
|
|
928
930
|
size,
|
|
929
|
-
|
|
931
|
+
shape === "categorical" && colorIndex !== void 0 && `cat-${colorIndex}`,
|
|
930
932
|
disabled && "disabled"
|
|
931
933
|
),
|
|
932
934
|
children: [
|
|
@@ -53,29 +53,165 @@ function clsx() {
|
|
|
53
53
|
}
|
|
54
54
|
var clsx_default = clsx;
|
|
55
55
|
|
|
56
|
-
// src/
|
|
56
|
+
// src/tokens/svg/status/ErrorIcon.tsx
|
|
57
57
|
var import_jsx_runtime = require("react/jsx-runtime");
|
|
58
|
+
var ErrorIcon = () => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
|
|
59
|
+
"svg",
|
|
60
|
+
{
|
|
61
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
62
|
+
width: "1em",
|
|
63
|
+
height: "1em",
|
|
64
|
+
viewBox: "0 0 16 16",
|
|
65
|
+
fill: "none",
|
|
66
|
+
children: [
|
|
67
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("g", { clipPath: "url(#clip0_1196_9603)", children: [
|
|
68
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
69
|
+
"path",
|
|
70
|
+
{
|
|
71
|
+
d: "M9.57588 5.57559C9.81019 5.34127 10.19 5.34127 10.4243 5.57559C10.6586 5.8099 10.6586 6.18971 10.4243 6.42402L8.84854 7.9998L10.4243 9.57559C10.6586 9.8099 10.6586 10.1897 10.4243 10.424C10.19 10.6583 9.81019 10.6583 9.57588 10.424L8.0001 8.84824L6.42432 10.424C6.19 10.6583 5.81019 10.6583 5.57588 10.424C5.34156 10.1897 5.34156 9.8099 5.57588 9.57559L7.15166 7.9998L5.57588 6.42402C5.34156 6.18971 5.34156 5.8099 5.57588 5.57559C5.81019 5.34127 6.19 5.34127 6.42432 5.57559L8.0001 7.15137L9.57588 5.57559Z",
|
|
72
|
+
fill: "currentColor"
|
|
73
|
+
}
|
|
74
|
+
),
|
|
75
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
76
|
+
"path",
|
|
77
|
+
{
|
|
78
|
+
fillRule: "evenodd",
|
|
79
|
+
clipRule: "evenodd",
|
|
80
|
+
d: "M8.0001 0.733398C12.0131 0.73361 15.2671 3.98679 15.2673 7.9998C15.2672 12.0129 12.0131 15.2668 8.0001 15.267C3.98701 15.2669 0.733016 12.0129 0.73291 7.9998C0.733051 3.98674 3.98704 0.733539 8.0001 0.733398ZM8.0001 1.9334C4.64978 1.93354 1.93383 4.64948 1.93369 7.9998C1.9338 11.3502 4.64975 14.0669 8.0001 14.067C11.3504 14.0668 14.0672 11.3501 14.0673 7.9998C14.0671 4.64953 11.3504 1.93361 8.0001 1.9334Z",
|
|
81
|
+
fill: "currentColor"
|
|
82
|
+
}
|
|
83
|
+
)
|
|
84
|
+
] }),
|
|
85
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("defs", { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("clipPath", { id: "clip0_1196_9603", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("rect", { width: "16", height: "16", fill: "white" }) }) })
|
|
86
|
+
]
|
|
87
|
+
}
|
|
88
|
+
);
|
|
89
|
+
var ErrorIcon_default = ErrorIcon;
|
|
90
|
+
|
|
91
|
+
// src/tokens/svg/status/InfoIcon.tsx
|
|
92
|
+
var import_jsx_runtime2 = require("react/jsx-runtime");
|
|
93
|
+
var InfoIcon = () => /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
|
|
94
|
+
"svg",
|
|
95
|
+
{
|
|
96
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
97
|
+
width: "1em",
|
|
98
|
+
height: "1em",
|
|
99
|
+
viewBox: "0 0 16 16",
|
|
100
|
+
fill: "none",
|
|
101
|
+
children: [
|
|
102
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("g", { clipPath: "url(#clip0_1188_11261)", children: [
|
|
103
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
104
|
+
"path",
|
|
105
|
+
{
|
|
106
|
+
d: "M8.00156 7.39999C8.33293 7.39999 8.60156 7.66862 8.60156 7.99999V10.6664C8.60156 10.9978 8.33293 11.2664 8.00156 11.2664C7.67019 11.2664 7.40156 10.9978 7.40156 10.6664V7.99999C7.40156 7.66862 7.67019 7.39999 8.00156 7.39999Z",
|
|
107
|
+
fill: "currentColor"
|
|
108
|
+
}
|
|
109
|
+
),
|
|
110
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
111
|
+
"path",
|
|
112
|
+
{
|
|
113
|
+
d: "M8.00859 4.73358C8.3398 4.73378 8.60859 5.00233 8.60859 5.33358C8.60849 5.66474 8.33973 5.93338 8.00859 5.93358H8.00156C7.67026 5.93358 7.40167 5.66486 7.40156 5.33358C7.40156 5.00221 7.67019 4.73358 8.00156 4.73358H8.00859Z",
|
|
114
|
+
fill: "currentColor"
|
|
115
|
+
}
|
|
116
|
+
),
|
|
117
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
118
|
+
"path",
|
|
119
|
+
{
|
|
120
|
+
fillRule: "evenodd",
|
|
121
|
+
clipRule: "evenodd",
|
|
122
|
+
d: "M8.00156 0.733582C12.0146 0.733793 15.2686 3.98697 15.2688 7.99999C15.2686 12.013 12.0146 15.267 8.00156 15.2672C3.98848 15.267 0.734481 12.0131 0.734375 7.99999C0.734516 3.98693 3.9885 0.733722 8.00156 0.733582ZM8.00156 1.93358C4.65124 1.93372 1.9353 4.64967 1.93516 7.99999C1.93526 11.3503 4.65122 14.067 8.00156 14.0672C11.3518 14.067 14.0686 11.3503 14.0688 7.99999C14.0686 4.64971 11.3518 1.93379 8.00156 1.93358Z",
|
|
123
|
+
fill: "currentColor"
|
|
124
|
+
}
|
|
125
|
+
)
|
|
126
|
+
] }),
|
|
127
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("defs", { children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("clipPath", { id: "clip0_1188_11261", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("rect", { width: "16", height: "16", fill: "white" }) }) })
|
|
128
|
+
]
|
|
129
|
+
}
|
|
130
|
+
);
|
|
131
|
+
var InfoIcon_default = InfoIcon;
|
|
132
|
+
|
|
133
|
+
// src/tokens/svg/status/SuccessIcon.tsx
|
|
134
|
+
var import_jsx_runtime3 = require("react/jsx-runtime");
|
|
135
|
+
var SuccessIcon = () => /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
136
|
+
"svg",
|
|
137
|
+
{
|
|
138
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
139
|
+
width: "1em",
|
|
140
|
+
height: "1em",
|
|
141
|
+
viewBox: "0 0 16 16",
|
|
142
|
+
fill: "none",
|
|
143
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
144
|
+
"path",
|
|
145
|
+
{
|
|
146
|
+
d: "M12.9084 3.57597C13.1426 3.34172 13.5225 3.34185 13.7568 3.57597C13.9911 3.81028 13.9911 4.19009 13.7568 4.4244L6.424 11.758C6.31157 11.8703 6.15869 11.9337 5.99978 11.9338C5.8409 11.9337 5.68798 11.8703 5.57556 11.758L2.24197 8.4244C2.00782 8.19018 2.00795 7.81028 2.24197 7.57597C2.47626 7.34167 2.85609 7.34172 3.09041 7.57597L5.999 10.4846L12.9084 3.57597Z",
|
|
147
|
+
fill: "currentColor"
|
|
148
|
+
}
|
|
149
|
+
)
|
|
150
|
+
}
|
|
151
|
+
);
|
|
152
|
+
var SuccessIcon_default = SuccessIcon;
|
|
153
|
+
|
|
154
|
+
// src/components/FieldMessage/FieldMessage.tsx
|
|
155
|
+
var import_jsx_runtime4 = require("react/jsx-runtime");
|
|
156
|
+
var ICON = {
|
|
157
|
+
default: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(InfoIcon_default, {}),
|
|
158
|
+
success: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(SuccessIcon_default, {}),
|
|
159
|
+
warning: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(InfoIcon_default, {}),
|
|
160
|
+
error: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(ErrorIcon_default, {})
|
|
161
|
+
};
|
|
162
|
+
var FieldMessage = (props) => {
|
|
163
|
+
const { validations } = props;
|
|
164
|
+
if (!validations || validations.length === 0) return null;
|
|
165
|
+
return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "lib-xplat-field-message-wrap", children: validations.map((v, idx) => /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
|
|
166
|
+
"div",
|
|
167
|
+
{
|
|
168
|
+
className: clsx_default("lib-xplat-field-message", v.status),
|
|
169
|
+
children: [
|
|
170
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "icon", children: ICON[v.status] }),
|
|
171
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { children: v.message })
|
|
172
|
+
]
|
|
173
|
+
},
|
|
174
|
+
`${v.message}_${idx}`
|
|
175
|
+
)) });
|
|
176
|
+
};
|
|
177
|
+
FieldMessage.displayName = "FieldMessage";
|
|
178
|
+
var Field = (props) => {
|
|
179
|
+
const { validations, children } = props;
|
|
180
|
+
if (!validations || validations.length === 0) return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_jsx_runtime4.Fragment, { children });
|
|
181
|
+
return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: "lib-xplat-field", children: [
|
|
182
|
+
children,
|
|
183
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)(FieldMessage, { validations })
|
|
184
|
+
] });
|
|
185
|
+
};
|
|
186
|
+
Field.displayName = "Field";
|
|
187
|
+
var hasError = (validations) => !!validations?.some((v) => v.status === "error");
|
|
188
|
+
|
|
189
|
+
// src/components/TextArea/TextArea.tsx
|
|
190
|
+
var import_jsx_runtime5 = require("react/jsx-runtime");
|
|
58
191
|
var TextArea = import_react.default.forwardRef(
|
|
59
192
|
(props, ref) => {
|
|
60
193
|
const {
|
|
61
194
|
className,
|
|
62
195
|
size = "md",
|
|
196
|
+
validations,
|
|
63
197
|
resize = "vertical",
|
|
64
198
|
rows = 3,
|
|
65
199
|
disabled,
|
|
66
200
|
...textareaProps
|
|
67
201
|
} = props;
|
|
68
|
-
|
|
202
|
+
const control = /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: clsx_default("lib-xplat-textarea-wrap", className), children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
69
203
|
"textarea",
|
|
70
204
|
{
|
|
71
205
|
...textareaProps,
|
|
72
206
|
ref,
|
|
73
207
|
rows,
|
|
74
208
|
disabled,
|
|
209
|
+
"aria-invalid": hasError(validations) || void 0,
|
|
75
210
|
className: clsx_default("lib-xplat-textarea", size, disabled && "disabled"),
|
|
76
211
|
style: { resize }
|
|
77
212
|
}
|
|
78
213
|
) });
|
|
214
|
+
return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(Field, { validations, children: control });
|
|
79
215
|
}
|
|
80
216
|
);
|
|
81
217
|
TextArea.displayName = "TextArea";
|
|
@@ -1,3 +1,41 @@
|
|
|
1
|
+
/* src/components/FieldMessage/fieldMessage.scss */
|
|
2
|
+
.lib-xplat-field {
|
|
3
|
+
display: flex;
|
|
4
|
+
flex-direction: column;
|
|
5
|
+
gap: var(--spacing-space-2);
|
|
6
|
+
}
|
|
7
|
+
.lib-xplat-field-message-wrap {
|
|
8
|
+
display: flex;
|
|
9
|
+
gap: var(--spacing-space-2);
|
|
10
|
+
margin-left: var(--spacing-space-1);
|
|
11
|
+
}
|
|
12
|
+
.lib-xplat-field-message-wrap > .lib-xplat-field-message {
|
|
13
|
+
display: flex;
|
|
14
|
+
gap: var(--spacing-space-1);
|
|
15
|
+
font-family: var(--semantic-typo-caption-2-r-font);
|
|
16
|
+
font-size: var(--semantic-typo-caption-2-r-size);
|
|
17
|
+
line-height: var(--semantic-typo-caption-2-r-lh);
|
|
18
|
+
font-weight: var(--semantic-typo-caption-2-r-weight);
|
|
19
|
+
letter-spacing: var(--semantic-typo-caption-2-r-ls);
|
|
20
|
+
align-items: center;
|
|
21
|
+
user-select: none;
|
|
22
|
+
}
|
|
23
|
+
.lib-xplat-field-message-wrap > .lib-xplat-field-message.default {
|
|
24
|
+
color: var(--semantic-icon-secondary);
|
|
25
|
+
}
|
|
26
|
+
.lib-xplat-field-message-wrap > .lib-xplat-field-message.success {
|
|
27
|
+
color: var(--semantic-text-success);
|
|
28
|
+
}
|
|
29
|
+
.lib-xplat-field-message-wrap > .lib-xplat-field-message.warning {
|
|
30
|
+
color: var(--semantic-text-warning);
|
|
31
|
+
}
|
|
32
|
+
.lib-xplat-field-message-wrap > .lib-xplat-field-message.error {
|
|
33
|
+
color: var(--semantic-text-error);
|
|
34
|
+
}
|
|
35
|
+
.lib-xplat-field-message-wrap > .lib-xplat-field-message > .icon {
|
|
36
|
+
font-size: var(--semantic-typo-label-2-m-size);
|
|
37
|
+
}
|
|
38
|
+
|
|
1
39
|
/* src/components/TextArea/textArea.scss */
|
|
2
40
|
.lib-xplat-textarea-wrap {
|
|
3
41
|
display: flex;
|
|
@@ -1,11 +1,17 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { T as TextareaAttributes } from '../../attributes-DJIWir_0.cjs';
|
|
3
|
+
import { V as Validation } from '../../validation-Dqo1zqhT.cjs';
|
|
3
4
|
|
|
4
5
|
type TextAreaSize = "sm" | "md" | "lg";
|
|
5
6
|
type TextAreaResize = "none" | "vertical" | "horizontal" | "both";
|
|
6
7
|
interface TextAreaProps extends Omit<TextareaAttributes, "size"> {
|
|
8
|
+
/** 안쪽 여백과 글자 크기 */
|
|
7
9
|
size?: TextAreaSize;
|
|
10
|
+
/** 컨트롤 아래에 표시할 검증 메시지. DS 폼 컴포넌트 공통 */
|
|
11
|
+
validations?: Validation[];
|
|
12
|
+
/** 사용자가 크기를 조절할 방향 */
|
|
8
13
|
resize?: TextAreaResize;
|
|
14
|
+
/** 기본으로 보일 줄 수 */
|
|
9
15
|
rows?: number;
|
|
10
16
|
}
|
|
11
17
|
declare const TextArea: React.ForwardRefExoticComponent<TextAreaProps & React.RefAttributes<HTMLTextAreaElement>>;
|
|
@@ -1,11 +1,17 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { T as TextareaAttributes } from '../../attributes-DJIWir_0.js';
|
|
3
|
+
import { V as Validation } from '../../validation-Dqo1zqhT.js';
|
|
3
4
|
|
|
4
5
|
type TextAreaSize = "sm" | "md" | "lg";
|
|
5
6
|
type TextAreaResize = "none" | "vertical" | "horizontal" | "both";
|
|
6
7
|
interface TextAreaProps extends Omit<TextareaAttributes, "size"> {
|
|
8
|
+
/** 안쪽 여백과 글자 크기 */
|
|
7
9
|
size?: TextAreaSize;
|
|
10
|
+
/** 컨트롤 아래에 표시할 검증 메시지. DS 폼 컴포넌트 공통 */
|
|
11
|
+
validations?: Validation[];
|
|
12
|
+
/** 사용자가 크기를 조절할 방향 */
|
|
8
13
|
resize?: TextAreaResize;
|
|
14
|
+
/** 기본으로 보일 줄 수 */
|
|
9
15
|
rows?: number;
|
|
10
16
|
}
|
|
11
17
|
declare const TextArea: React.ForwardRefExoticComponent<TextAreaProps & React.RefAttributes<HTMLTextAreaElement>>;
|
|
@@ -17,29 +17,165 @@ function clsx() {
|
|
|
17
17
|
}
|
|
18
18
|
var clsx_default = clsx;
|
|
19
19
|
|
|
20
|
+
// src/tokens/svg/status/ErrorIcon.tsx
|
|
21
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
22
|
+
var ErrorIcon = () => /* @__PURE__ */ jsxs(
|
|
23
|
+
"svg",
|
|
24
|
+
{
|
|
25
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
26
|
+
width: "1em",
|
|
27
|
+
height: "1em",
|
|
28
|
+
viewBox: "0 0 16 16",
|
|
29
|
+
fill: "none",
|
|
30
|
+
children: [
|
|
31
|
+
/* @__PURE__ */ jsxs("g", { clipPath: "url(#clip0_1196_9603)", children: [
|
|
32
|
+
/* @__PURE__ */ jsx(
|
|
33
|
+
"path",
|
|
34
|
+
{
|
|
35
|
+
d: "M9.57588 5.57559C9.81019 5.34127 10.19 5.34127 10.4243 5.57559C10.6586 5.8099 10.6586 6.18971 10.4243 6.42402L8.84854 7.9998L10.4243 9.57559C10.6586 9.8099 10.6586 10.1897 10.4243 10.424C10.19 10.6583 9.81019 10.6583 9.57588 10.424L8.0001 8.84824L6.42432 10.424C6.19 10.6583 5.81019 10.6583 5.57588 10.424C5.34156 10.1897 5.34156 9.8099 5.57588 9.57559L7.15166 7.9998L5.57588 6.42402C5.34156 6.18971 5.34156 5.8099 5.57588 5.57559C5.81019 5.34127 6.19 5.34127 6.42432 5.57559L8.0001 7.15137L9.57588 5.57559Z",
|
|
36
|
+
fill: "currentColor"
|
|
37
|
+
}
|
|
38
|
+
),
|
|
39
|
+
/* @__PURE__ */ jsx(
|
|
40
|
+
"path",
|
|
41
|
+
{
|
|
42
|
+
fillRule: "evenodd",
|
|
43
|
+
clipRule: "evenodd",
|
|
44
|
+
d: "M8.0001 0.733398C12.0131 0.73361 15.2671 3.98679 15.2673 7.9998C15.2672 12.0129 12.0131 15.2668 8.0001 15.267C3.98701 15.2669 0.733016 12.0129 0.73291 7.9998C0.733051 3.98674 3.98704 0.733539 8.0001 0.733398ZM8.0001 1.9334C4.64978 1.93354 1.93383 4.64948 1.93369 7.9998C1.9338 11.3502 4.64975 14.0669 8.0001 14.067C11.3504 14.0668 14.0672 11.3501 14.0673 7.9998C14.0671 4.64953 11.3504 1.93361 8.0001 1.9334Z",
|
|
45
|
+
fill: "currentColor"
|
|
46
|
+
}
|
|
47
|
+
)
|
|
48
|
+
] }),
|
|
49
|
+
/* @__PURE__ */ jsx("defs", { children: /* @__PURE__ */ jsx("clipPath", { id: "clip0_1196_9603", children: /* @__PURE__ */ jsx("rect", { width: "16", height: "16", fill: "white" }) }) })
|
|
50
|
+
]
|
|
51
|
+
}
|
|
52
|
+
);
|
|
53
|
+
var ErrorIcon_default = ErrorIcon;
|
|
54
|
+
|
|
55
|
+
// src/tokens/svg/status/InfoIcon.tsx
|
|
56
|
+
import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
57
|
+
var InfoIcon = () => /* @__PURE__ */ jsxs2(
|
|
58
|
+
"svg",
|
|
59
|
+
{
|
|
60
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
61
|
+
width: "1em",
|
|
62
|
+
height: "1em",
|
|
63
|
+
viewBox: "0 0 16 16",
|
|
64
|
+
fill: "none",
|
|
65
|
+
children: [
|
|
66
|
+
/* @__PURE__ */ jsxs2("g", { clipPath: "url(#clip0_1188_11261)", children: [
|
|
67
|
+
/* @__PURE__ */ jsx2(
|
|
68
|
+
"path",
|
|
69
|
+
{
|
|
70
|
+
d: "M8.00156 7.39999C8.33293 7.39999 8.60156 7.66862 8.60156 7.99999V10.6664C8.60156 10.9978 8.33293 11.2664 8.00156 11.2664C7.67019 11.2664 7.40156 10.9978 7.40156 10.6664V7.99999C7.40156 7.66862 7.67019 7.39999 8.00156 7.39999Z",
|
|
71
|
+
fill: "currentColor"
|
|
72
|
+
}
|
|
73
|
+
),
|
|
74
|
+
/* @__PURE__ */ jsx2(
|
|
75
|
+
"path",
|
|
76
|
+
{
|
|
77
|
+
d: "M8.00859 4.73358C8.3398 4.73378 8.60859 5.00233 8.60859 5.33358C8.60849 5.66474 8.33973 5.93338 8.00859 5.93358H8.00156C7.67026 5.93358 7.40167 5.66486 7.40156 5.33358C7.40156 5.00221 7.67019 4.73358 8.00156 4.73358H8.00859Z",
|
|
78
|
+
fill: "currentColor"
|
|
79
|
+
}
|
|
80
|
+
),
|
|
81
|
+
/* @__PURE__ */ jsx2(
|
|
82
|
+
"path",
|
|
83
|
+
{
|
|
84
|
+
fillRule: "evenodd",
|
|
85
|
+
clipRule: "evenodd",
|
|
86
|
+
d: "M8.00156 0.733582C12.0146 0.733793 15.2686 3.98697 15.2688 7.99999C15.2686 12.013 12.0146 15.267 8.00156 15.2672C3.98848 15.267 0.734481 12.0131 0.734375 7.99999C0.734516 3.98693 3.9885 0.733722 8.00156 0.733582ZM8.00156 1.93358C4.65124 1.93372 1.9353 4.64967 1.93516 7.99999C1.93526 11.3503 4.65122 14.067 8.00156 14.0672C11.3518 14.067 14.0686 11.3503 14.0688 7.99999C14.0686 4.64971 11.3518 1.93379 8.00156 1.93358Z",
|
|
87
|
+
fill: "currentColor"
|
|
88
|
+
}
|
|
89
|
+
)
|
|
90
|
+
] }),
|
|
91
|
+
/* @__PURE__ */ jsx2("defs", { children: /* @__PURE__ */ jsx2("clipPath", { id: "clip0_1188_11261", children: /* @__PURE__ */ jsx2("rect", { width: "16", height: "16", fill: "white" }) }) })
|
|
92
|
+
]
|
|
93
|
+
}
|
|
94
|
+
);
|
|
95
|
+
var InfoIcon_default = InfoIcon;
|
|
96
|
+
|
|
97
|
+
// src/tokens/svg/status/SuccessIcon.tsx
|
|
98
|
+
import { jsx as jsx3 } from "react/jsx-runtime";
|
|
99
|
+
var SuccessIcon = () => /* @__PURE__ */ jsx3(
|
|
100
|
+
"svg",
|
|
101
|
+
{
|
|
102
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
103
|
+
width: "1em",
|
|
104
|
+
height: "1em",
|
|
105
|
+
viewBox: "0 0 16 16",
|
|
106
|
+
fill: "none",
|
|
107
|
+
children: /* @__PURE__ */ jsx3(
|
|
108
|
+
"path",
|
|
109
|
+
{
|
|
110
|
+
d: "M12.9084 3.57597C13.1426 3.34172 13.5225 3.34185 13.7568 3.57597C13.9911 3.81028 13.9911 4.19009 13.7568 4.4244L6.424 11.758C6.31157 11.8703 6.15869 11.9337 5.99978 11.9338C5.8409 11.9337 5.68798 11.8703 5.57556 11.758L2.24197 8.4244C2.00782 8.19018 2.00795 7.81028 2.24197 7.57597C2.47626 7.34167 2.85609 7.34172 3.09041 7.57597L5.999 10.4846L12.9084 3.57597Z",
|
|
111
|
+
fill: "currentColor"
|
|
112
|
+
}
|
|
113
|
+
)
|
|
114
|
+
}
|
|
115
|
+
);
|
|
116
|
+
var SuccessIcon_default = SuccessIcon;
|
|
117
|
+
|
|
118
|
+
// src/components/FieldMessage/FieldMessage.tsx
|
|
119
|
+
import { Fragment, jsx as jsx4, jsxs as jsxs3 } from "react/jsx-runtime";
|
|
120
|
+
var ICON = {
|
|
121
|
+
default: /* @__PURE__ */ jsx4(InfoIcon_default, {}),
|
|
122
|
+
success: /* @__PURE__ */ jsx4(SuccessIcon_default, {}),
|
|
123
|
+
warning: /* @__PURE__ */ jsx4(InfoIcon_default, {}),
|
|
124
|
+
error: /* @__PURE__ */ jsx4(ErrorIcon_default, {})
|
|
125
|
+
};
|
|
126
|
+
var FieldMessage = (props) => {
|
|
127
|
+
const { validations } = props;
|
|
128
|
+
if (!validations || validations.length === 0) return null;
|
|
129
|
+
return /* @__PURE__ */ jsx4("div", { className: "lib-xplat-field-message-wrap", children: validations.map((v, idx) => /* @__PURE__ */ jsxs3(
|
|
130
|
+
"div",
|
|
131
|
+
{
|
|
132
|
+
className: clsx_default("lib-xplat-field-message", v.status),
|
|
133
|
+
children: [
|
|
134
|
+
/* @__PURE__ */ jsx4("div", { className: "icon", children: ICON[v.status] }),
|
|
135
|
+
/* @__PURE__ */ jsx4("span", { children: v.message })
|
|
136
|
+
]
|
|
137
|
+
},
|
|
138
|
+
`${v.message}_${idx}`
|
|
139
|
+
)) });
|
|
140
|
+
};
|
|
141
|
+
FieldMessage.displayName = "FieldMessage";
|
|
142
|
+
var Field = (props) => {
|
|
143
|
+
const { validations, children } = props;
|
|
144
|
+
if (!validations || validations.length === 0) return /* @__PURE__ */ jsx4(Fragment, { children });
|
|
145
|
+
return /* @__PURE__ */ jsxs3("div", { className: "lib-xplat-field", children: [
|
|
146
|
+
children,
|
|
147
|
+
/* @__PURE__ */ jsx4(FieldMessage, { validations })
|
|
148
|
+
] });
|
|
149
|
+
};
|
|
150
|
+
Field.displayName = "Field";
|
|
151
|
+
var hasError = (validations) => !!validations?.some((v) => v.status === "error");
|
|
152
|
+
|
|
20
153
|
// src/components/TextArea/TextArea.tsx
|
|
21
|
-
import { jsx } from "react/jsx-runtime";
|
|
154
|
+
import { jsx as jsx5 } from "react/jsx-runtime";
|
|
22
155
|
var TextArea = React.forwardRef(
|
|
23
156
|
(props, ref) => {
|
|
24
157
|
const {
|
|
25
158
|
className,
|
|
26
159
|
size = "md",
|
|
160
|
+
validations,
|
|
27
161
|
resize = "vertical",
|
|
28
162
|
rows = 3,
|
|
29
163
|
disabled,
|
|
30
164
|
...textareaProps
|
|
31
165
|
} = props;
|
|
32
|
-
|
|
166
|
+
const control = /* @__PURE__ */ jsx5("div", { className: clsx_default("lib-xplat-textarea-wrap", className), children: /* @__PURE__ */ jsx5(
|
|
33
167
|
"textarea",
|
|
34
168
|
{
|
|
35
169
|
...textareaProps,
|
|
36
170
|
ref,
|
|
37
171
|
rows,
|
|
38
172
|
disabled,
|
|
173
|
+
"aria-invalid": hasError(validations) || void 0,
|
|
39
174
|
className: clsx_default("lib-xplat-textarea", size, disabled && "disabled"),
|
|
40
175
|
style: { resize }
|
|
41
176
|
}
|
|
42
177
|
) });
|
|
178
|
+
return /* @__PURE__ */ jsx5(Field, { validations, children: control });
|
|
43
179
|
}
|
|
44
180
|
);
|
|
45
181
|
TextArea.displayName = "TextArea";
|
|
@@ -72,10 +72,12 @@ var Tooltip = (props) => {
|
|
|
72
72
|
children,
|
|
73
73
|
title,
|
|
74
74
|
description,
|
|
75
|
-
|
|
75
|
+
variant,
|
|
76
|
+
type,
|
|
76
77
|
follow = false,
|
|
77
78
|
disabled = false
|
|
78
79
|
} = props;
|
|
80
|
+
const shape = variant ?? type ?? "dark";
|
|
79
81
|
const triggerRef = import_react.default.useRef(null);
|
|
80
82
|
const tooltipRef = import_react.default.useRef(null);
|
|
81
83
|
const [visible, setVisible] = import_react.default.useState(false);
|
|
@@ -185,7 +187,7 @@ var Tooltip = (props) => {
|
|
|
185
187
|
{
|
|
186
188
|
ref: tooltipRef,
|
|
187
189
|
role: "tooltip",
|
|
188
|
-
className: clsx_default("lib-xplat-tooltip",
|
|
190
|
+
className: clsx_default("lib-xplat-tooltip", shape),
|
|
189
191
|
style: { position: "fixed", left: pos.left, top: pos.top },
|
|
190
192
|
children: [
|
|
191
193
|
title && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "tooltip-title", children: title }),
|
|
@@ -1,10 +1,19 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
|
|
3
|
+
type TooltipVariant = "dark" | "light";
|
|
3
4
|
interface TooltipProps {
|
|
4
5
|
children: React.ReactNode;
|
|
6
|
+
/** 말풍선 첫 줄. 굵게 표시된다 */
|
|
5
7
|
title?: React.ReactNode;
|
|
8
|
+
/** 말풍선 본문. title 과 둘 중 하나는 있어야 뜬다 */
|
|
6
9
|
description?: React.ReactNode;
|
|
7
|
-
|
|
10
|
+
/** 말풍선 배색 */
|
|
11
|
+
variant?: TooltipVariant;
|
|
12
|
+
/**
|
|
13
|
+
* @deprecated 모양 변형은 `variant` 로 받는다. `type` 은 상태 색 전용이다.
|
|
14
|
+
* 기존 사용처가 깨지지 않도록 계속 받는다 — 둘 다 주면 `variant` 가 이긴다.
|
|
15
|
+
*/
|
|
16
|
+
type?: TooltipVariant;
|
|
8
17
|
/**
|
|
9
18
|
* 커서를 따라다닌다. 기본값은 `false` — 트리거 요소 기준으로 고정된다
|
|
10
19
|
* (PopOver/Dropdown/Select 와 같은 방식).
|
|
@@ -13,6 +22,7 @@ interface TooltipProps {
|
|
|
13
22
|
* 아이콘처럼 대상이 작은 경우는 고정이 읽기 편하다.
|
|
14
23
|
*/
|
|
15
24
|
follow?: boolean;
|
|
25
|
+
/** 말풍선을 띄우지 않는다 */
|
|
16
26
|
disabled?: boolean;
|
|
17
27
|
}
|
|
18
28
|
declare const Tooltip: React.FC<TooltipProps>;
|
|
@@ -1,10 +1,19 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
|
|
3
|
+
type TooltipVariant = "dark" | "light";
|
|
3
4
|
interface TooltipProps {
|
|
4
5
|
children: React.ReactNode;
|
|
6
|
+
/** 말풍선 첫 줄. 굵게 표시된다 */
|
|
5
7
|
title?: React.ReactNode;
|
|
8
|
+
/** 말풍선 본문. title 과 둘 중 하나는 있어야 뜬다 */
|
|
6
9
|
description?: React.ReactNode;
|
|
7
|
-
|
|
10
|
+
/** 말풍선 배색 */
|
|
11
|
+
variant?: TooltipVariant;
|
|
12
|
+
/**
|
|
13
|
+
* @deprecated 모양 변형은 `variant` 로 받는다. `type` 은 상태 색 전용이다.
|
|
14
|
+
* 기존 사용처가 깨지지 않도록 계속 받는다 — 둘 다 주면 `variant` 가 이긴다.
|
|
15
|
+
*/
|
|
16
|
+
type?: TooltipVariant;
|
|
8
17
|
/**
|
|
9
18
|
* 커서를 따라다닌다. 기본값은 `false` — 트리거 요소 기준으로 고정된다
|
|
10
19
|
* (PopOver/Dropdown/Select 와 같은 방식).
|
|
@@ -13,6 +22,7 @@ interface TooltipProps {
|
|
|
13
22
|
* 아이콘처럼 대상이 작은 경우는 고정이 읽기 편하다.
|
|
14
23
|
*/
|
|
15
24
|
follow?: boolean;
|
|
25
|
+
/** 말풍선을 띄우지 않는다 */
|
|
16
26
|
disabled?: boolean;
|
|
17
27
|
}
|
|
18
28
|
declare const Tooltip: React.FC<TooltipProps>;
|
|
@@ -36,10 +36,12 @@ var Tooltip = (props) => {
|
|
|
36
36
|
children,
|
|
37
37
|
title,
|
|
38
38
|
description,
|
|
39
|
-
|
|
39
|
+
variant,
|
|
40
|
+
type,
|
|
40
41
|
follow = false,
|
|
41
42
|
disabled = false
|
|
42
43
|
} = props;
|
|
44
|
+
const shape = variant ?? type ?? "dark";
|
|
43
45
|
const triggerRef = React.useRef(null);
|
|
44
46
|
const tooltipRef = React.useRef(null);
|
|
45
47
|
const [visible, setVisible] = React.useState(false);
|
|
@@ -149,7 +151,7 @@ var Tooltip = (props) => {
|
|
|
149
151
|
{
|
|
150
152
|
ref: tooltipRef,
|
|
151
153
|
role: "tooltip",
|
|
152
|
-
className: clsx_default("lib-xplat-tooltip",
|
|
154
|
+
className: clsx_default("lib-xplat-tooltip", shape),
|
|
153
155
|
style: { position: "fixed", left: pos.left, top: pos.top },
|
|
154
156
|
children: [
|
|
155
157
|
title && /* @__PURE__ */ jsx("div", { className: "tooltip-title", children: title }),
|