@uniai-fe/uds-templates 0.5.26 → 0.5.28
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/styles.css
CHANGED
|
@@ -967,17 +967,27 @@
|
|
|
967
967
|
|
|
968
968
|
.auth-login-find-account-button {
|
|
969
969
|
flex: 1;
|
|
970
|
+
background: none;
|
|
971
|
+
border: 0;
|
|
972
|
+
cursor: pointer;
|
|
970
973
|
font-size: 13px;
|
|
971
974
|
line-height: 1em;
|
|
972
975
|
font-weight: 400;
|
|
973
976
|
padding-inline: var(--spacing-padding-1);
|
|
977
|
+
text-decoration: none;
|
|
974
978
|
}
|
|
975
979
|
.auth-login-find-account-button:hover {
|
|
976
980
|
color: var(--color-primary-standard);
|
|
977
981
|
}
|
|
982
|
+
.auth-login-find-account-button:disabled {
|
|
983
|
+
cursor: default;
|
|
984
|
+
}
|
|
978
985
|
.auth-login-find-account-button span {
|
|
979
986
|
color: var(--color-label-standard);
|
|
980
987
|
}
|
|
988
|
+
.auth-login-find-account-button:disabled span {
|
|
989
|
+
color: var(--color-label-neutral);
|
|
990
|
+
}
|
|
981
991
|
|
|
982
992
|
.auth-find-id-button {
|
|
983
993
|
text-align: right;
|
|
@@ -1705,6 +1715,7 @@
|
|
|
1705
1715
|
|
|
1706
1716
|
.cctv-video-overlay-header-upper,
|
|
1707
1717
|
.cctv-video-overlay-header-lower {
|
|
1718
|
+
min-width: 0;
|
|
1708
1719
|
display: flex;
|
|
1709
1720
|
align-items: center;
|
|
1710
1721
|
justify-content: space-between;
|
|
@@ -1733,6 +1744,7 @@
|
|
|
1733
1744
|
}
|
|
1734
1745
|
|
|
1735
1746
|
.cctv-video-close-button {
|
|
1747
|
+
flex: 0 0 auto;
|
|
1736
1748
|
width: 36px;
|
|
1737
1749
|
height: 36px;
|
|
1738
1750
|
border-radius: 50%;
|
|
@@ -1745,16 +1757,27 @@
|
|
|
1745
1757
|
}
|
|
1746
1758
|
|
|
1747
1759
|
.cctv-video-overlay-title {
|
|
1760
|
+
min-width: 0;
|
|
1761
|
+
max-width: 100%;
|
|
1762
|
+
overflow: hidden;
|
|
1748
1763
|
font-weight: 600;
|
|
1749
1764
|
color: var(--color-common-99);
|
|
1750
1765
|
line-height: 1.5em;
|
|
1751
1766
|
}
|
|
1767
|
+
.cctv-video-overlay-title span {
|
|
1768
|
+
display: block;
|
|
1769
|
+
min-width: 0;
|
|
1770
|
+
overflow: hidden;
|
|
1771
|
+
text-overflow: ellipsis;
|
|
1772
|
+
white-space: nowrap;
|
|
1773
|
+
}
|
|
1752
1774
|
|
|
1753
1775
|
.cctv-video-header-title {
|
|
1754
1776
|
font-size: var(--font-heading-large-size);
|
|
1755
1777
|
}
|
|
1756
1778
|
|
|
1757
1779
|
.cctv-video-footer-title {
|
|
1780
|
+
flex: 1 1 auto;
|
|
1758
1781
|
font-size: var(--font-heading-xsmall-size);
|
|
1759
1782
|
}
|
|
1760
1783
|
|
|
@@ -1792,6 +1815,7 @@
|
|
|
1792
1815
|
}
|
|
1793
1816
|
|
|
1794
1817
|
.cctv-video-overlay-footer {
|
|
1818
|
+
min-width: 0;
|
|
1795
1819
|
display: flex;
|
|
1796
1820
|
align-items: center;
|
|
1797
1821
|
justify-content: space-between;
|
|
@@ -1800,6 +1824,7 @@
|
|
|
1800
1824
|
}
|
|
1801
1825
|
|
|
1802
1826
|
.cctv-video-open-button {
|
|
1827
|
+
flex: 0 0 auto;
|
|
1803
1828
|
display: flex;
|
|
1804
1829
|
align-items: center;
|
|
1805
1830
|
justify-content: center;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@uniai-fe/uds-templates",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.28",
|
|
4
4
|
"description": "UNIAI Design System; UI Templates Package",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"private": false,
|
|
@@ -70,7 +70,7 @@
|
|
|
70
70
|
},
|
|
71
71
|
"devDependencies": {
|
|
72
72
|
"@svgr/webpack": "^8.1.0",
|
|
73
|
-
"@tanstack/react-query": "^5.100.
|
|
73
|
+
"@tanstack/react-query": "^5.100.10",
|
|
74
74
|
"@types/node": "^24.12.3",
|
|
75
75
|
"@types/react": "^19.2.14",
|
|
76
76
|
"@types/react-dom": "^19.2.3",
|
|
@@ -38,6 +38,7 @@ export default function AuthLoginContainer({
|
|
|
38
38
|
{/* 링크 옵션이 부분적으로만 넘어와도 내부에서 존재하는 항목만 렌더링한다. */}
|
|
39
39
|
<AuthLoginLinkButtons
|
|
40
40
|
linkOptions={linkOptions}
|
|
41
|
+
isSubmitting={fieldOptions.isSubmitting}
|
|
41
42
|
texts={texts}
|
|
42
43
|
onFindPasswordClick={onFindPasswordLinkClick}
|
|
43
44
|
/>
|
|
@@ -7,17 +7,20 @@ import type { AuthLoginLinkButtonsProps } from "../types";
|
|
|
7
7
|
* @component
|
|
8
8
|
* @param {AuthLoginLinkButtonsProps} props
|
|
9
9
|
* @param {AuthLoginLinkOptions} [props.linkOptions] 계정 관련 링크 옵션
|
|
10
|
+
* @param {boolean} [props.isSubmitting] 외부 로그인 요청 pending 여부
|
|
10
11
|
* @param {AuthLoginLinkTexts} [props.texts] 링크/버튼 문구 옵션
|
|
11
12
|
* @param {() => void} [props.onFindPasswordClick] 비밀번호 찾기 커스텀 클릭 핸들러
|
|
12
13
|
*/
|
|
13
14
|
export default function AuthLoginLinkButtons({
|
|
14
15
|
linkOptions,
|
|
16
|
+
isSubmitting,
|
|
15
17
|
texts,
|
|
16
18
|
onFindPasswordClick,
|
|
17
19
|
}: AuthLoginLinkButtonsProps) {
|
|
18
20
|
const hrefFindId = linkOptions?.find?.id;
|
|
19
21
|
const hrefFindPassword = linkOptions?.find?.password;
|
|
20
22
|
const hrefSignup = linkOptions?.signup;
|
|
23
|
+
const isLinkInteractionDisabled = Boolean(isSubmitting);
|
|
21
24
|
|
|
22
25
|
if (!hrefFindId && !hrefFindPassword && !hrefSignup) {
|
|
23
26
|
return null;
|
|
@@ -27,14 +30,23 @@ export default function AuthLoginLinkButtons({
|
|
|
27
30
|
<div className="auth-login-util-container">
|
|
28
31
|
{(hrefFindId || hrefFindPassword) && (
|
|
29
32
|
<div className="auth-login-find-account">
|
|
30
|
-
{hrefFindId &&
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
33
|
+
{hrefFindId &&
|
|
34
|
+
(isLinkInteractionDisabled ? (
|
|
35
|
+
<button
|
|
36
|
+
type="button"
|
|
37
|
+
className="auth-login-find-account-button auth-find-id-button"
|
|
38
|
+
disabled
|
|
39
|
+
>
|
|
40
|
+
<span>{texts?.findId ?? "아이디 찾기"}</span>
|
|
41
|
+
</button>
|
|
42
|
+
) : (
|
|
43
|
+
<Link
|
|
44
|
+
href={hrefFindId}
|
|
45
|
+
className="auth-login-find-account-button auth-find-id-button"
|
|
46
|
+
>
|
|
47
|
+
<span>{texts?.findId ?? "아이디 찾기"}</span>
|
|
48
|
+
</Link>
|
|
49
|
+
))}
|
|
38
50
|
{hrefFindId && hrefFindPassword && <Divider />}
|
|
39
51
|
{/* 비밀번호 찾기 링크가 있을 때만 버튼/링크를 선택적으로 노출한다. */}
|
|
40
52
|
{hrefFindPassword &&
|
|
@@ -42,10 +54,19 @@ export default function AuthLoginLinkButtons({
|
|
|
42
54
|
<button
|
|
43
55
|
type="button"
|
|
44
56
|
className="auth-login-find-account-button auth-find-password-button"
|
|
57
|
+
disabled={isLinkInteractionDisabled}
|
|
45
58
|
onClick={onFindPasswordClick}
|
|
46
59
|
>
|
|
47
60
|
<span>{texts?.findPassword ?? "비밀번호 찾기"}</span>
|
|
48
61
|
</button>
|
|
62
|
+
) : isLinkInteractionDisabled ? (
|
|
63
|
+
<button
|
|
64
|
+
type="button"
|
|
65
|
+
className="auth-login-find-account-button auth-find-password-button"
|
|
66
|
+
disabled
|
|
67
|
+
>
|
|
68
|
+
<span>{texts?.findPassword ?? "비밀번호 찾기"}</span>
|
|
69
|
+
</button>
|
|
49
70
|
) : (
|
|
50
71
|
<Link
|
|
51
72
|
href={hrefFindPassword}
|
|
@@ -59,15 +80,27 @@ export default function AuthLoginLinkButtons({
|
|
|
59
80
|
{hrefSignup && (
|
|
60
81
|
<div className="auth-login-signup">
|
|
61
82
|
{/* 회원가입 링크가 있을 때만 signup CTA를 유지한다. */}
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
83
|
+
{isLinkInteractionDisabled ? (
|
|
84
|
+
<Button.Rounded
|
|
85
|
+
type="button"
|
|
86
|
+
disabled
|
|
87
|
+
className="auth-login-signup-button"
|
|
88
|
+
priority="tertiary"
|
|
89
|
+
size="small"
|
|
90
|
+
>
|
|
91
|
+
{texts?.signup ?? "회원가입"}
|
|
92
|
+
</Button.Rounded>
|
|
93
|
+
) : (
|
|
94
|
+
<Button.Rounded
|
|
95
|
+
as={Link}
|
|
96
|
+
href={hrefSignup}
|
|
97
|
+
className="auth-login-signup-button"
|
|
98
|
+
priority="tertiary"
|
|
99
|
+
size="small"
|
|
100
|
+
>
|
|
101
|
+
{texts?.signup ?? "회원가입"}
|
|
102
|
+
</Button.Rounded>
|
|
103
|
+
)}
|
|
71
104
|
</div>
|
|
72
105
|
)}
|
|
73
106
|
</div>
|
|
@@ -28,18 +28,30 @@
|
|
|
28
28
|
.auth-login-find-account-button {
|
|
29
29
|
flex: 1;
|
|
30
30
|
|
|
31
|
+
background: none;
|
|
32
|
+
border: 0;
|
|
33
|
+
cursor: pointer;
|
|
31
34
|
font-size: 13px;
|
|
32
35
|
line-height: 1em;
|
|
33
36
|
font-weight: 400;
|
|
34
37
|
padding-inline: var(--spacing-padding-1);
|
|
38
|
+
text-decoration: none;
|
|
35
39
|
|
|
36
40
|
&:hover {
|
|
37
41
|
color: var(--color-primary-standard);
|
|
38
42
|
}
|
|
39
43
|
|
|
44
|
+
&:disabled {
|
|
45
|
+
cursor: default;
|
|
46
|
+
}
|
|
47
|
+
|
|
40
48
|
span {
|
|
41
49
|
color: var(--color-label-standard);
|
|
42
50
|
}
|
|
51
|
+
|
|
52
|
+
&:disabled span {
|
|
53
|
+
color: var(--color-label-neutral);
|
|
54
|
+
}
|
|
43
55
|
}
|
|
44
56
|
|
|
45
57
|
.auth-find-id-button {
|
|
@@ -353,6 +353,7 @@ export interface AuthLoginLinkOptions {
|
|
|
353
353
|
/**
|
|
354
354
|
* 로그인 링크 버튼 props
|
|
355
355
|
* @property {AuthLoginLinkOptions} [linkOptions] 계정 관련 링크 옵션
|
|
356
|
+
* @property {boolean} [isSubmitting] 외부 로그인 요청 pending 여부
|
|
356
357
|
* @property {AuthLoginLinkTexts} [texts] 링크/버튼 문구 옵션
|
|
357
358
|
* @property {() => void} [onFindPasswordClick] 비밀번호 찾기 링크버튼 클릭 콜백 이벤트
|
|
358
359
|
*/
|
|
@@ -361,6 +362,10 @@ export interface AuthLoginLinkButtonsProps {
|
|
|
361
362
|
* 계정 관련 링크 옵션
|
|
362
363
|
*/
|
|
363
364
|
linkOptions?: AuthLoginLinkOptions;
|
|
365
|
+
/**
|
|
366
|
+
* 외부 로그인 요청 pending 여부
|
|
367
|
+
*/
|
|
368
|
+
isSubmitting?: boolean;
|
|
364
369
|
/**
|
|
365
370
|
* 링크/버튼 문구 옵션
|
|
366
371
|
*/
|
|
@@ -53,6 +53,7 @@
|
|
|
53
53
|
|
|
54
54
|
.cctv-video-overlay-header-upper,
|
|
55
55
|
.cctv-video-overlay-header-lower {
|
|
56
|
+
min-width: 0;
|
|
56
57
|
display: flex;
|
|
57
58
|
align-items: center;
|
|
58
59
|
justify-content: space-between;
|
|
@@ -82,6 +83,7 @@
|
|
|
82
83
|
}
|
|
83
84
|
|
|
84
85
|
.cctv-video-close-button {
|
|
86
|
+
flex: 0 0 auto;
|
|
85
87
|
width: 36px;
|
|
86
88
|
height: 36px;
|
|
87
89
|
border-radius: 50%;
|
|
@@ -95,14 +97,26 @@
|
|
|
95
97
|
}
|
|
96
98
|
|
|
97
99
|
.cctv-video-overlay-title {
|
|
100
|
+
min-width: 0;
|
|
101
|
+
max-width: 100%;
|
|
102
|
+
overflow: hidden;
|
|
98
103
|
font-weight: 600;
|
|
99
104
|
color: var(--color-common-99);
|
|
100
105
|
line-height: 1.5em;
|
|
106
|
+
|
|
107
|
+
span {
|
|
108
|
+
display: block;
|
|
109
|
+
min-width: 0;
|
|
110
|
+
overflow: hidden;
|
|
111
|
+
text-overflow: ellipsis;
|
|
112
|
+
white-space: nowrap;
|
|
113
|
+
}
|
|
101
114
|
}
|
|
102
115
|
.cctv-video-header-title {
|
|
103
116
|
font-size: var(--font-heading-large-size);
|
|
104
117
|
}
|
|
105
118
|
.cctv-video-footer-title {
|
|
119
|
+
flex: 1 1 auto;
|
|
106
120
|
font-size: var(--font-heading-xsmall-size);
|
|
107
121
|
}
|
|
108
122
|
|
|
@@ -141,6 +155,7 @@
|
|
|
141
155
|
}
|
|
142
156
|
|
|
143
157
|
.cctv-video-overlay-footer {
|
|
158
|
+
min-width: 0;
|
|
144
159
|
display: flex;
|
|
145
160
|
align-items: center;
|
|
146
161
|
justify-content: space-between;
|
|
@@ -149,6 +164,7 @@
|
|
|
149
164
|
}
|
|
150
165
|
|
|
151
166
|
.cctv-video-open-button {
|
|
167
|
+
flex: 0 0 auto;
|
|
152
168
|
display: flex;
|
|
153
169
|
align-items: center;
|
|
154
170
|
justify-content: center;
|