@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.26",
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.9",
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
- <Link
32
- href={hrefFindId}
33
- className="auth-login-find-account-button auth-find-id-button"
34
- >
35
- <span>{texts?.findId ?? "아이디 찾기"}</span>
36
- </Link>
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
- <Button.Rounded
63
- as={Link}
64
- href={hrefSignup}
65
- className="auth-login-signup-button"
66
- priority="tertiary"
67
- size="small"
68
- >
69
- {texts?.signup ?? "회원가입"}
70
- </Button.Rounded>
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;