테스트 환경 인증번호 동적 표시 및 Sass 3.0 호환성 개선

This commit is contained in:
Rinjae
2026-01-18 19:33:53 +09:00
parent 359af7ec5c
commit 3754d97f21
74 changed files with 814 additions and 170 deletions
@@ -2,7 +2,7 @@ package com.eactive.apim.portal.apps.auth.service;
public interface AuthNumberService {
void sendRequestAuthNumber(String recipientKey, String msgType);
String sendRequestAuthNumber(String recipientKey, String msgType);
boolean verifyAuthNumber(String recipientKey, String authNumber);
}
@@ -40,10 +40,11 @@ public class AuthNumberServiceImpl implements AuthNumberService {
/**
* @param recipientKey
* @param msgType
* @return 생성된 인증번호
*/
@Override
@Transactional(noRollbackFor = AuthNumberException.class)
public void sendRequestAuthNumber(String recipientKey, String msgType) {
public String sendRequestAuthNumber(String recipientKey, String msgType) {
logger.info("Sending auth number to: {} via {}", recipientKey, msgType);
validateResendTime(recipientKey);
@@ -55,6 +56,8 @@ public class AuthNumberServiceImpl implements AuthNumberService {
storage.saveAuthNumber(recipientKey, authNumber,
LocalDateTime.now().plusSeconds(authNumberExpirationTime));
return authNumber;
}
@Override
@@ -18,6 +18,8 @@ public class ValidationResponse {
private boolean isPersonalAccount;
private boolean isCorporateAccount;
private String authNumber; // 테스트 환경 인증번호
public ValidationResponse(boolean isValid, String message) {
this.isValid = isValid;
this.message = message;
@@ -41,9 +41,10 @@ public class AuthFacadeImpl implements AuthFacade {
}
try {
authNumberService.sendRequestAuthNumber(recipientKey, msgType);
String generatedAuthNumber = authNumberService.sendRequestAuthNumber(recipientKey, msgType);
response.setValid(true);
response.setMessage("인증번호를 발송하였습니다.");
response.setAuthNumber(generatedAuthNumber); // 테스트 환경에서 인증번호 표시용
} catch (Exception e) {
response.setValid(false);
response.setMessage(e.getMessage());
@@ -7,6 +7,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ModelAttribute;
import com.eactive.apim.portal.portalproperty.service.PortalPropertyService;
import com.eactive.apim.portal.config.PortalProperties;
@ControllerAdvice
public class GlobalControllerAdvice {
@@ -17,6 +18,9 @@ public class GlobalControllerAdvice {
@Autowired
private PortalPropertyService portalPropertyService;
@Autowired
private PortalProperties portalProperties;
@ModelAttribute("breadcrumb")
public List<Map> addBreadcrumbToModel(HttpServletRequest request) {
String currentPath = request.getRequestURI();
@@ -39,4 +43,19 @@ public class GlobalControllerAdvice {
);
return "true".equalsIgnoreCase(value);
}
@ModelAttribute("showTestAuthNotice")
public boolean showTestAuthNotice() {
return portalProperties.isTestAuthNoticeEnabled();
}
@ModelAttribute("testAuthNumber")
public String getTestAuthNumber() {
if (portalProperties.isTestAuthNoticeEnabled()) {
String authVirtualCode = portalProperties.getAuthVirtualCode();
// 고정 인증번호가 있으면 반환, 없으면 "random" 표시
return (authVirtualCode != null && !authVirtualCode.isEmpty()) ? authVirtualCode : "random";
}
return null;
}
}
@@ -25,6 +25,8 @@ public class PortalProperties {
private String authVirtualCode = "";
private boolean testAuthNoticeEnabled = false;
private Map<RoleCode, List<String>> portalSecurity;
private FileProperties file = new FileProperties();
+1
View File
@@ -38,6 +38,7 @@ gateway:
portal:
auth-virtual-code: 654321
test-auth-notice-enabled: true
proxy:
targets:
+2 -1
View File
@@ -38,7 +38,8 @@ gateway:
portal:
logging:
log-path: d:/kjb-logs
auth-virtual-code: 654321
# auth-virtual-code 제거 - gf63는 랜덤 인증번호 사용
test-auth-notice-enabled: true
proxy:
targets:
@@ -38,6 +38,7 @@ portal:
logging:
log-path: C:\eactive\logs
auth-virtual-code: 654321
test-auth-notice-enabled: true
proxy:
targets:
+3
View File
@@ -18,6 +18,9 @@ spring:
thymeleaf:
cache: false
portal:
test-auth-notice-enabled: false # prod 환경: UI 안내 미표시
proxy:
targets:
stg: http://inter-dapiwas01.k-bank.com:7090/monitoring
+1
View File
@@ -16,6 +16,7 @@ spring:
cache: false
portal:
test-auth-notice-enabled: true
# 검증 단계에선 사용하지 않음
# auth-virtual-code: 654321
+1
View File
@@ -76,6 +76,7 @@ portal:
auth-ttl: 300
auth:
resend_limit_seconds: 30
test-auth-notice-enabled: true # 기본값: true (대부분의 개발환경에서 UI 안내 표시)
user-approval: true
password-expiration-days: 90
+131 -94
View File
@@ -1106,7 +1106,7 @@ body.design-survey-active .global-header {
transition: all 0.3s ease;
}
.mobile-drawer .drawer-welcome .btn-drawer-login:hover {
background: rgb(0, 52.3166666667, 129);
background: rgb(0, 65.7, 162);
}
.mobile-drawer .drawer-welcome.authenticated {
flex-direction: row;
@@ -2269,7 +2269,7 @@ body.design-survey-active .global-header {
color: #FFFFFF;
}
.btn-success:hover {
background: rgb(68.4897959184, 194.5102040816, 93.693877551);
background: rgb(83.2897959184, 199.3102040816, 106.493877551);
transform: translateY(-3px);
}
.btn-danger {
@@ -2277,7 +2277,7 @@ body.design-survey-active .global-header {
color: #FFFFFF;
}
.btn-danger:hover {
background: #ff3838;
background: rgb(255, 70.8, 70.8);
transform: translateY(-3px);
}
.btn-ghost {
@@ -2543,7 +2543,7 @@ body.design-survey-active .global-header {
.action-btn-delete:hover {
transform: translateY(-2px);
box-shadow: 0 4px 12px rgba(75, 155, 255, 0.1);
background: rgb(255, 81.5, 81.5);
background: rgb(255, 88.9, 88.9);
}
.action-btn-delete:active {
transform: translateY(0);
@@ -2661,7 +2661,7 @@ body.design-survey-active .global-header {
background: #a4d6ea;
}
.btn-input-action.btn-change:hover {
background: rgb(122.5625, 195.3303571429, 224.4375);
background: rgb(131.6625, 199.4303571429, 226.5375);
transform: translateY(-2px);
box-shadow: 0 4px 12px rgba(75, 155, 255, 0.1);
}
@@ -2749,7 +2749,7 @@ body.design-survey-active .global-header {
}
.status-badge.status-processing {
background: rgba(255, 217, 61, 0.1);
color: rgb(163, 131.0721649485, 0);
color: rgb(221.2, 177.8721649485, 0);
}
.status-badge.status-failed {
background: rgba(255, 107, 107, 0.1);
@@ -2789,7 +2789,7 @@ body.design-survey-active .global-header {
}
.status-badge-header.status-processing {
background: rgba(255, 217, 61, 0.1);
color: rgb(163, 131.0721649485, 0);
color: rgb(221.2, 177.8721649485, 0);
}
.badge-sm {
@@ -3214,25 +3214,25 @@ body.design-survey-active .global-header {
}
}
.common-section-box, .app-list-container, .register-result, .register-form-container {
.common-section-box, .app-list-container, .register-form-container, .register-result {
background-color: #f6f9fb;
border-radius: 12px;
padding: 30px 45px;
}
@media (max-width: 768px) {
.common-section-box, .app-list-container, .register-result, .register-form-container {
.common-section-box, .app-list-container, .register-form-container, .register-result {
padding: 24px;
}
}
.common-title-bar, .user-management-container .table-controls, .app-list-title-section, .register-title-bar {
.common-title-bar, .app-list-title-section, .register-title-bar {
background-color: #f6f9fb;
border-radius: 12px;
padding: 14px 45px;
margin-bottom: 30px;
}
@media (max-width: 768px) {
.common-title-bar, .user-management-container .table-controls, .app-list-title-section, .register-title-bar {
.common-title-bar, .app-list-title-section, .register-title-bar {
background-color: transparent;
border-radius: 0;
padding: 20px 20px 0;
@@ -3240,7 +3240,7 @@ body.design-survey-active .global-header {
border-bottom: 1.5px solid #212529;
}
}
.common-title-bar .common-title, .user-management-container .table-controls .common-title, .app-list-title-section .common-title, .register-title-bar .common-title {
.common-title-bar .common-title, .app-list-title-section .common-title, .register-title-bar .common-title {
font-family: "Spoqa Han Sans Neo", "SpoqaHanSans", "Noto Sans KR", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
font-size: 22px;
font-weight: 700;
@@ -3248,7 +3248,7 @@ body.design-survey-active .global-header {
margin: 0;
}
@media (max-width: 768px) {
.common-title-bar .common-title, .user-management-container .table-controls .common-title, .app-list-title-section .common-title, .register-title-bar .common-title {
.common-title-bar .common-title, .app-list-title-section .common-title, .register-title-bar .common-title {
font-size: 16px;
color: #000000;
margin-bottom: 4px;
@@ -3284,13 +3284,13 @@ body.design-survey-active .global-header {
display: inline;
}
}
.common-title-bar .common-subtitle, .user-management-container .table-controls .common-subtitle, .app-list-title-section .common-subtitle, .register-title-bar .common-subtitle {
.common-title-bar .common-subtitle, .app-list-title-section .common-subtitle, .register-title-bar .common-subtitle {
font-size: 16px;
font-weight: 400;
color: #515151;
}
@media (max-width: 768px) {
.common-title-bar .common-subtitle, .user-management-container .table-controls .common-subtitle, .app-list-title-section .common-subtitle, .register-title-bar .common-subtitle {
.common-title-bar .common-subtitle, .app-list-title-section .common-subtitle, .register-title-bar .common-subtitle {
font-size: 12px;
color: #515151;
display: inline;
@@ -3979,7 +3979,7 @@ select.form-control {
.file-upload-wrapper .file-remove-btn:hover {
transform: translateY(-2px);
box-shadow: 0 4px 12px rgba(75, 155, 255, 0.1);
background: rgb(255, 81.5, 81.5);
background: rgb(255, 88.9, 88.9);
}
.file-upload-wrapper .file-remove-btn:active {
transform: translateY(0);
@@ -4300,7 +4300,7 @@ select.form-control {
transition: all 0.3s ease;
}
.form-actions--with-withdrawal .withdrawal-link:hover {
background: rgb(208.9090909091, 231.9545454545, 242.5909090909);
background: rgb(210.2090909091, 232.6045454545, 242.9409090909);
}
.form-actions--with-withdrawal .withdrawal-link img {
width: 22px;
@@ -4455,7 +4455,7 @@ select.form-control {
text-decoration: underline;
}
.notice-content-box a:hover {
color: rgb(0, 52.3166666667, 129);
color: rgb(0, 65.7, 162);
}
.form-row--content .form-label-wrapper {
@@ -5246,7 +5246,7 @@ select.form-control {
font-size: 16px;
}
.drawer-logout-btn:hover {
background: #ff3838;
background: rgb(255, 70.8, 70.8);
transform: translateY(-2px);
box-shadow: 0 8px 24px rgba(75, 155, 255, 0.15);
}
@@ -5693,19 +5693,19 @@ select.form-control {
background-color: #DADADA;
}
.list-table-btn--default:hover {
background-color: rgb(205.25, 205.25, 205.25);
background-color: rgb(207.1, 207.1, 207.1);
}
.list-table-btn--primary {
background-color: #A4D6EA;
}
.list-table-btn--primary:hover {
background-color: rgb(143.28125, 204.6651785714, 229.21875);
background-color: rgb(147.83125, 206.7151785714, 230.26875);
}
.list-table-btn--secondary {
background-color: #CDD4F0;
}
.list-table-btn--secondary:hover {
background-color: rgb(185.3846153846, 195.1307692308, 234.1153846154);
background-color: rgb(187.8846153846, 197.2807692308, 234.8653846154);
}
.table-pagination {
@@ -6337,7 +6337,7 @@ select.form-control {
.alert.alert-error {
background: rgba(255, 107, 107, 0.1);
border: 1px solid rgba(255, 107, 107, 0.3);
color: #ff3838;
color: rgb(255, 70.8, 70.8);
align-items: center;
}
.alert.alert-error svg {
@@ -6351,7 +6351,7 @@ select.form-control {
.alert.alert-success {
background: rgba(107, 207, 127, 0.1);
border: 1px solid rgba(107, 207, 127, 0.3);
color: rgb(51.9183673469, 160.0816326531, 73.5510204082);
color: rgb(61.5183673469, 189.6816326531, 87.1510204082);
}
.alert.alert-info {
background: rgba(0, 73, 180, 0.1);
@@ -6632,6 +6632,46 @@ select.form-control {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18' height='17' viewBox='0 0 18 17' fill='none'%3E%3Cpath d='M1 6.5L9 1L17 6.5V15C17 15.5304 16.7893 16.0391 16.4142 16.4142C16.0391 16.7893 15.5304 17 15 17H3C2.46957 17 1.96086 16.7893 1.58579 16.4142C1.21071 16.0391 1 15.5304 1 15V6.5Z' stroke='%230049B4' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
}
.test-env-notice {
margin-top: 8px;
padding: 12px 16px;
background-color: #FFF4E6;
border: 1px solid #FFB84D;
border-radius: 4px;
}
.test-env-notice__content {
display: flex;
align-items: flex-start;
gap: 8px;
}
.test-env-notice__icon {
flex-shrink: 0;
margin-top: 2px;
width: 20px;
height: 20px;
}
.test-env-notice__text-container {
flex: 1;
}
.test-env-notice__title {
margin: 0;
font-size: 14px;
color: #E65100;
font-weight: 500;
}
.test-env-notice__description {
margin: 4px 0 0 0;
font-size: 13px;
color: #5D4037;
line-height: 1.5;
}
.test-env-notice__auth-code {
color: #E65100;
font-family: monospace;
font-size: 14px;
font-weight: bold;
}
.hero-carousel-section {
position: relative;
width: 100%;
@@ -6813,7 +6853,7 @@ select.form-control {
transition: all 0.3s ease;
}
.btn-hero-signup:hover {
background: rgb(0, 52.3166666667, 129);
background: rgb(0, 65.7, 162);
transform: translateY(-2px);
box-shadow: 0 4px 12px rgba(0, 73, 180, 0.3);
}
@@ -7497,7 +7537,7 @@ select.form-control {
}
}
.api-showcase .btn-all-apis:hover {
background: rgb(0, 106.8584070796, 175);
background: rgb(0, 124.2, 203.4);
}
.api-showcase .btn-all-apis:hover svg {
transform: translateX(4px);
@@ -7810,14 +7850,14 @@ select.form-control {
color: #FFFFFF;
}
.info-section .action-btn-primary:hover {
background: rgb(0, 52.3166666667, 129);
background: rgb(0, 65.7, 162);
}
.info-section .action-btn-secondary {
background: #00ACDD;
color: #FFFFFF;
}
.info-section .action-btn-secondary:hover {
background: rgb(0, 132.3076923077, 170);
background: rgb(0, 154.8, 198.9);
}
.info-section .info-image {
flex: 1;
@@ -8159,7 +8199,7 @@ select.form-control {
}
}
.support-center .support-card--notice:hover {
background: rgb(0, 62.6583333333, 154.5);
background: rgb(0, 69.35, 171);
}
.support-center .support-card--faq, .support-center .support-card--qna {
width: 388px;
@@ -8577,7 +8617,7 @@ select.form-control {
transition: all 0.3s ease;
}
.signup-cta-section .btn-signup-cta:hover {
background: rgb(0, 106.8584070796, 175);
background: rgb(0, 124.2, 203.4);
transform: translateY(-2px);
box-shadow: 0 4px 12px rgba(0, 138, 226, 0.3);
}
@@ -9599,10 +9639,10 @@ select.form-control {
line-height: 1;
}
.login-button:hover {
background: rgb(0, 62.6583333333, 154.5);
background: rgb(0, 69.35, 171);
}
.login-button:active {
background: rgb(0, 52.3166666667, 129);
background: rgb(0, 65.7, 162);
}
.login-button:disabled {
opacity: 0.6;
@@ -10127,11 +10167,11 @@ select.form-control {
}
.auth-request-button:hover,
.auth-verify-button:hover {
background: rgb(143.28125, 204.6651785714, 229.21875);
background: rgb(147.83125, 206.7151785714, 230.26875);
}
.auth-request-button:active,
.auth-verify-button:active {
background: rgb(122.5625, 195.3303571429, 224.4375);
background: rgb(131.6625, 199.4303571429, 226.5375);
}
.auth-request-button:disabled,
.auth-verify-button:disabled {
@@ -10148,7 +10188,7 @@ select.form-control {
}
}
.account-recovery-card .form-actions, .account-recovery-card .form-actions-center {
.account-recovery-card .form-actions {
display: flex;
justify-content: center;
gap: 20px;
@@ -10157,9 +10197,8 @@ select.form-control {
border-top: none;
background: transparent;
}
.account-recovery-card .form-actions .cancel-button, .account-recovery-card .form-actions-center .cancel-button,
.account-recovery-card .form-actions .submit-button,
.account-recovery-card .form-actions-center .submit-button {
.account-recovery-card .form-actions .cancel-button,
.account-recovery-card .form-actions .submit-button {
width: 200px;
height: 60px;
padding: 10px;
@@ -10176,39 +10215,38 @@ select.form-control {
justify-content: center;
text-decoration: none;
}
.account-recovery-card .form-actions .cancel-button, .account-recovery-card .form-actions-center .cancel-button {
.account-recovery-card .form-actions .cancel-button {
color: #5f666c;
background: #e5e7eb;
}
.account-recovery-card .form-actions .cancel-button:hover, .account-recovery-card .form-actions-center .cancel-button:hover {
background: rgb(214.5869565217, 217.6956521739, 223.9130434783);
.account-recovery-card .form-actions .cancel-button:hover {
background: rgb(215.8869565217, 218.8956521739, 224.9130434783);
}
.account-recovery-card .form-actions .cancel-button:active, .account-recovery-card .form-actions-center .cancel-button:active {
background: rgb(200.1739130435, 204.3913043478, 212.8260869565);
.account-recovery-card .form-actions .cancel-button:active {
background: rgb(202.7739130435, 206.7913043478, 214.8260869565);
}
.account-recovery-card .form-actions .submit-button, .account-recovery-card .form-actions-center .submit-button {
.account-recovery-card .form-actions .submit-button {
color: #FFFFFF;
background: #0049B4;
}
.account-recovery-card .form-actions .submit-button:hover, .account-recovery-card .form-actions-center .submit-button:hover {
background: rgb(0, 62.6583333333, 154.5);
.account-recovery-card .form-actions .submit-button:hover {
background: rgb(0, 69.35, 171);
}
.account-recovery-card .form-actions .submit-button:active, .account-recovery-card .form-actions-center .submit-button:active {
background: rgb(0, 52.3166666667, 129);
.account-recovery-card .form-actions .submit-button:active {
background: rgb(0, 65.7, 162);
}
.account-recovery-card .form-actions .submit-button:disabled, .account-recovery-card .form-actions-center .submit-button:disabled {
.account-recovery-card .form-actions .submit-button:disabled {
opacity: 0.6;
cursor: not-allowed;
}
@media (max-width: 576px) {
.account-recovery-card .form-actions, .account-recovery-card .form-actions-center {
.account-recovery-card .form-actions {
flex-direction: column;
gap: 12px;
padding: 24px 0;
}
.account-recovery-card .form-actions .cancel-button, .account-recovery-card .form-actions-center .cancel-button,
.account-recovery-card .form-actions .submit-button,
.account-recovery-card .form-actions-center .submit-button {
.account-recovery-card .form-actions .cancel-button,
.account-recovery-card .form-actions .submit-button {
width: 100%;
height: 50px;
font-size: 16px;
@@ -10406,7 +10444,7 @@ select.form-control {
transition: color 0.3s ease;
}
.result-info-box .info-text .info-link:hover {
color: rgb(0, 52.3166666667, 129);
color: rgb(0, 65.7, 162);
}
@media (max-width: 576px) {
.result-info-box .info-text {
@@ -10521,15 +10559,14 @@ select.form-control {
border-radius: 8px;
margin-top: 8px;
}
.account-recovery-card .form-actions, .account-recovery-card .form-actions-center {
.account-recovery-card .form-actions {
flex-direction: row;
gap: 21px;
margin-top: 24px;
padding: 24px 0;
}
.account-recovery-card .form-actions .cancel-button, .account-recovery-card .form-actions-center .cancel-button,
.account-recovery-card .form-actions .submit-button,
.account-recovery-card .form-actions-center .submit-button {
.account-recovery-card .form-actions .cancel-button,
.account-recovery-card .form-actions .submit-button {
flex: 1;
min-width: 144px;
height: 40px;
@@ -10537,11 +10574,11 @@ select.form-control {
font-weight: 700;
border-radius: 8px;
}
.account-recovery-card .form-actions .cancel-button, .account-recovery-card .form-actions-center .cancel-button {
.account-recovery-card .form-actions .cancel-button {
background: #e5e7eb;
color: #5f666c;
}
.account-recovery-card .form-actions .submit-button, .account-recovery-card .form-actions-center .submit-button {
.account-recovery-card .form-actions .submit-button {
background: #0049b4;
color: #ffffff;
}
@@ -12151,7 +12188,7 @@ input[type=checkbox]:checked + .custom-checkbox {
transform: scale(0.95);
}
.register-form-container .form-actions, .register-form-container .form-actions-center {
.register-form-container .form-actions {
justify-content: space-between;
padding: 0 24px 24px;
margin-top: 40px;
@@ -12159,13 +12196,13 @@ input[type=checkbox]:checked + .custom-checkbox {
padding-top: 0;
}
@media (max-width: 768px) {
.register-form-container .form-actions, .register-form-container .form-actions-center {
.register-form-container .form-actions {
padding: 0 16px 16px;
}
}
@media (max-width: 768px) {
.apikey-register-container > .form-actions, .apikey-register-container > .form-actions-center {
.apikey-register-container > .form-actions {
display: flex;
flex-direction: row !important;
justify-content: center !important;
@@ -12175,7 +12212,7 @@ input[type=checkbox]:checked + .custom-checkbox {
margin-top: 0;
background-color: transparent;
}
.apikey-register-container > .form-actions .btn-submit, .apikey-register-container > .form-actions-center .btn-submit {
.apikey-register-container > .form-actions .btn-submit {
width: 144px !important;
height: 40px !important;
min-height: 40px;
@@ -12185,12 +12222,12 @@ input[type=checkbox]:checked + .custom-checkbox {
border-radius: 8px !important;
flex-shrink: 0;
}
.apikey-register-container > .form-actions .btn-submit.btn-secondary, .apikey-register-container > .form-actions-center .btn-submit.btn-secondary {
.apikey-register-container > .form-actions .btn-submit.btn-secondary {
background-color: #e5e7eb !important;
color: #5f666c !important;
border: none !important;
}
.apikey-register-container > .form-actions .btn-submit.btn-primary, .apikey-register-container > .form-actions-center .btn-submit.btn-primary {
.apikey-register-container > .form-actions .btn-submit.btn-primary {
background-color: #0049b4 !important;
color: #FFFFFF !important;
border: none !important;
@@ -13054,7 +13091,7 @@ input[type=checkbox]:checked + .custom-checkbox {
transition: background 0.2s ease;
}
.btn-copy-action:hover {
background: rgb(122.5625, 195.3303571429, 224.4375);
background: rgb(131.6625, 199.4303571429, 226.5375);
}
@media (max-width: 768px) {
.btn-copy-action {
@@ -13081,7 +13118,7 @@ input[type=checkbox]:checked + .custom-checkbox {
transition: background 0.2s ease;
}
.btn-view-secret:hover {
background: rgb(20.6074766355, 140.8177570093, 224.3925233645);
background: rgb(31.8897196262, 151.4130841121, 234.5102803738);
}
.btn-view-secret svg {
width: 20px;
@@ -13266,7 +13303,7 @@ input[type=checkbox]:checked + .custom-checkbox {
border-radius: 8px;
}
.btn-copy-action:hover {
background: rgb(122.5625, 195.3303571429, 224.4375);
background: rgb(131.6625, 199.4303571429, 226.5375);
}
.btn-view-secret {
width: 100% !important;
@@ -13282,7 +13319,7 @@ input[type=checkbox]:checked + .custom-checkbox {
height: 16px;
}
.btn-view-secret:hover {
background: rgb(20.6074766355, 140.8177570093, 224.3925233645);
background: rgb(31.8897196262, 151.4130841121, 234.5102803738);
}
#revealedSecretBox {
width: 100%;
@@ -13792,7 +13829,7 @@ input[type=checkbox]:checked + .custom-checkbox {
}
}
.btn-notice-list:hover {
background: rgb(214.5869565217, 217.6956521739, 223.9130434783);
background: rgb(215.8869565217, 218.8956521739, 224.9130434783);
}
.btn-notice-list:active {
transform: scale(0.98);
@@ -14352,7 +14389,7 @@ input[type=checkbox]:checked + .custom-checkbox {
}
}
.btn-inquiry-list:hover {
background: rgb(214.5869565217, 217.6956521739, 223.9130434783);
background: rgb(215.8869565217, 218.8956521739, 224.9130434783);
}
.btn-inquiry-list:active {
transform: scale(0.98);
@@ -14385,7 +14422,7 @@ input[type=checkbox]:checked + .custom-checkbox {
}
}
.btn-inquiry-edit:hover {
background: rgb(0, 62.6583333333, 154.5);
background: rgb(0, 69.35, 171);
}
.btn-inquiry-edit:active {
transform: scale(0.98);
@@ -14418,7 +14455,7 @@ input[type=checkbox]:checked + .custom-checkbox {
}
}
.btn-inquiry-delete:hover {
background: rgb(210.9493670886, 36.5506329114, 53.2594936709);
background: rgb(217.9841772152, 41.3658227848, 58.2873417722);
}
.btn-inquiry-delete:active {
transform: scale(0.98);
@@ -14490,7 +14527,7 @@ input[type=checkbox]:checked + .custom-checkbox {
margin-left: 8px;
}
.file-upload-inline .btn-remove-file-inline:hover {
background: rgb(189.2151898734, 32.7848101266, 47.7721518987);
background: rgb(209.4151898734, 36.2848101266, 52.8721518987);
}
.file-upload-inline .btn-remove-file-inline svg {
width: 12px;
@@ -14522,7 +14559,7 @@ input[type=checkbox]:checked + .custom-checkbox {
}
}
.file-upload-inline .btn-file-attach:hover {
background: rgb(21.6317757009, 146.6504672897, 233.5682242991);
background: rgb(37.3117757009, 153.9304672897, 235.0082242991);
}
.file-upload-inline .btn-file-attach svg {
width: 22px;
@@ -14558,7 +14595,7 @@ input[type=checkbox]:checked + .custom-checkbox {
.inquiry-form-container .form-row {
padding: 16px 0;
}
.inquiry-form-container .form-actions, .inquiry-form-container .form-actions-center {
.inquiry-form-container .form-actions {
display: flex;
flex-direction: row !important;
justify-content: center !important;
@@ -14567,7 +14604,7 @@ input[type=checkbox]:checked + .custom-checkbox {
padding: 32px 0 0;
margin-top: 16px;
}
.inquiry-form-container .form-actions .btn, .inquiry-form-container .form-actions-center .btn {
.inquiry-form-container .form-actions .btn {
width: auto !important;
min-width: 80px;
padding: 0 16px;
@@ -14576,21 +14613,21 @@ input[type=checkbox]:checked + .custom-checkbox {
border-radius: 8px;
flex: 0 0 auto;
}
.inquiry-form-container .form-actions .btn-secondary, .inquiry-form-container .form-actions-center .btn-secondary {
.inquiry-form-container .form-actions .btn-secondary {
background: #E5E7EB;
color: #5F666C;
border: none;
}
.inquiry-form-container .form-actions .btn-secondary:hover, .inquiry-form-container .form-actions-center .btn-secondary:hover {
background: rgb(214.5869565217, 217.6956521739, 223.9130434783);
.inquiry-form-container .form-actions .btn-secondary:hover {
background: rgb(215.8869565217, 218.8956521739, 224.9130434783);
}
.inquiry-form-container .form-actions .btn-primary, .inquiry-form-container .form-actions-center .btn-primary {
.inquiry-form-container .form-actions .btn-primary {
background: #0049b4;
color: #FFFFFF;
border: none;
}
.inquiry-form-container .form-actions .btn-primary:hover, .inquiry-form-container .form-actions-center .btn-primary:hover {
background: rgb(0, 62.6583333333, 154.5);
.inquiry-form-container .form-actions .btn-primary:hover {
background: rgb(0, 69.35, 171);
}
.inquiry-form-container .file-upload-inline .file-input-display {
min-height: 50px;
@@ -15698,7 +15735,7 @@ input[type=checkbox]:checked + .custom-checkbox {
transition: all 0.3s ease;
}
.org-file-remove:hover {
background: #ff3838;
background: rgb(255, 70.8, 70.8);
}
.org-file-notice {
@@ -16251,7 +16288,7 @@ input[type=checkbox]:checked + .custom-checkbox {
border: 1px solid #E2E8F0;
padding: 32px;
}
.form-actions, .form-actions-center {
.form-actions {
display: none;
}
.file-upload-wrapper .file-upload-btn,
@@ -16531,7 +16568,7 @@ input[type=checkbox]:checked + .custom-checkbox {
}
.status-indicator.status-active {
background-color: rgba(107, 207, 127, 0.1);
color: rgb(68.4897959184, 194.5102040816, 93.693877551);
color: rgb(83.2897959184, 199.3102040816, 106.493877551);
}
.status-indicator.status-active .status-dot {
background-color: #6BCF7F;
@@ -16958,10 +16995,10 @@ input[type=checkbox]:checked + .custom-checkbox {
.org-register-container {
padding: 24px 16px;
}
.org-register-container .common-title-bar, .org-register-container .register-title-bar, .org-register-container .app-list-title-section, .org-register-container .user-management-container .table-controls, .user-management-container .org-register-container .table-controls {
.org-register-container .common-title-bar, .org-register-container .user-management-container .table-controls, .user-management-container .org-register-container .table-controls {
margin-bottom: 24px;
}
.org-register-container .common-title-bar h3, .org-register-container .register-title-bar h3, .org-register-container .app-list-title-section h3, .org-register-container .user-management-container .table-controls h3, .user-management-container .org-register-container .table-controls h3 {
.org-register-container .common-title-bar h3, .org-register-container .user-management-container .table-controls h3, .user-management-container .org-register-container .table-controls h3 {
font-size: 20px;
}
.org-register-container .register-form-container {
@@ -16970,7 +17007,7 @@ input[type=checkbox]:checked + .custom-checkbox {
background: transparent !important;
padding: 0 !important;
}
.org-register-container .form-actions, .org-register-container .form-actions-center {
.org-register-container .form-actions {
display: flex;
flex-direction: row !important;
justify-content: center !important;
@@ -16978,12 +17015,12 @@ input[type=checkbox]:checked + .custom-checkbox {
padding: 32px 0 0;
margin-top: 0;
}
.org-register-container .form-actions .form-actions-buttons, .org-register-container .form-actions-center .form-actions-buttons {
.org-register-container .form-actions .form-actions-buttons {
width: 100%;
display: flex;
justify-content: center;
}
.org-register-container .form-actions .form-actions-buttons .btn, .org-register-container .form-actions-center .form-actions-buttons .btn {
.org-register-container .form-actions .form-actions-buttons .btn {
display: flex;
align-items: center;
justify-content: center;
@@ -17428,7 +17465,7 @@ body.commission-print-page .btn-primary:hover {
padding: 20px;
}
@media (max-width: 768px) {
.terms-container .common-title-bar, .terms-container .register-title-bar, .terms-container .app-list-title-section, .terms-container .user-management-container .table-controls, .user-management-container .terms-container .table-controls {
.terms-container .common-title-bar {
display: none;
}
}
@@ -18283,7 +18320,7 @@ body.commission-print-page .btn-primary:hover {
transition: background 0.2s ease, transform 0.2s ease;
}
.signup-guide__btn:hover {
background: rgb(0, 52.3166666667, 129);
background: rgb(0, 65.7, 162);
transform: translateY(-2px);
}
.signup-guide__btn:active {
File diff suppressed because one or more lines are too long
@@ -0,0 +1,22 @@
// Color functions compatibility layer for Dart Sass 3.0.0
// Replaces deprecated global darken() function
@use 'sass:color';
@use 'sass:math';
@use 'variables' as *;
/// Darken a color by reducing lightness
/// @param {Color} $color - The color to darken
/// @param {Number} $amount - The amount to darken (percentage)
/// @return {Color} - The darkened color
@function darken($color, $amount) {
@return color.scale($color, $lightness: -$amount);
}
/// Lighten a color by increasing lightness
/// @param {Color} $color - The color to lighten
/// @param {Number} $amount - The amount to lighten (percentage)
/// @return {Color} - The lightened color
@function lighten($color, $amount) {
@return color.scale($color, $lightness: $amount);
}
@@ -2,6 +2,8 @@
// This file contains all application-wide SASS mixins
// -----------------------------------------------------------------------------
@use 'variables' as *;
// Media query mixins
@mixin respond-to($breakpoint) {
@if $breakpoint == 'xs' {
@@ -1,3 +1,7 @@
@use '../abstracts/variables' as *;
@use '../abstracts/color-functions' as *;
@use '../abstracts/mixins' as *;
// -----------------------------------------------------------------------------
// Animation keyframes and utilities
// -----------------------------------------------------------------------------
@@ -1,3 +1,7 @@
@use '../abstracts/variables' as *;
@use '../abstracts/color-functions' as *;
@use '../abstracts/mixins' as *;
@font-face {
font-family: 'Spoqa Han Sans Neo';
font-weight: 700;
@@ -63,4 +67,4 @@
src:url('/font/kjb/HGGGothicssi80g.woff') format('woff'),
url('/font/kjb/HGGGothicssi80g.woff2') format('woff2'),
url('/font/kjb/HGGGothicssi80g.ttf') format('truetype');
}
}
@@ -1,3 +1,7 @@
@use '../abstracts/variables' as *;
@use '../abstracts/color-functions' as *;
@use '../abstracts/mixins' as *;
// -----------------------------------------------------------------------------
// Reset and normalize styles
// -----------------------------------------------------------------------------
@@ -97,4 +101,4 @@ section, summary {
::-moz-selection {
background-color: rgba($primary-blue, 0.2);
color: $text-dark;
}
}
@@ -1,3 +1,7 @@
@use '../abstracts/variables' as *;
@use '../abstracts/color-functions' as *;
@use '../abstracts/mixins' as *;
// -----------------------------------------------------------------------------
// Basic typography styles
// -----------------------------------------------------------------------------
@@ -1,3 +1,7 @@
@use '../abstracts/variables' as *;
@use '../abstracts/color-functions' as *;
@use '../abstracts/mixins' as *;
// -----------------------------------------------------------------------------
// Utility classes
// -----------------------------------------------------------------------------
@@ -1,3 +1,7 @@
@use '../abstracts/variables' as *;
@use '../abstracts/color-functions' as *;
@use '../abstracts/mixins' as *;
// -----------------------------------------------------------------------------
// Accordion Component - FAQ and Collapsible Sections
// Figma Design: node 984-2146
@@ -1,3 +1,7 @@
@use '../abstracts/variables' as *;
@use '../abstracts/color-functions' as *;
@use '../abstracts/mixins' as *;
// -----------------------------------------------------------------------------
// Alert Components
// Used in: Form validation, system messages, notifications
@@ -1,3 +1,7 @@
@use '../abstracts/variables' as *;
@use '../abstracts/color-functions' as *;
@use '../abstracts/mixins' as *;
@charset "utf-8";
// =============================================================================
@@ -1,3 +1,7 @@
@use '../abstracts/variables' as *;
@use '../abstracts/color-functions' as *;
@use '../abstracts/mixins' as *;
// -----------------------------------------------------------------------------
// Badge Component Styles - Status badges and labels
// -----------------------------------------------------------------------------
@@ -1,3 +1,7 @@
@use '../abstracts/variables' as *;
@use '../abstracts/color-functions' as *;
@use '../abstracts/mixins' as *;
// -----------------------------------------------------------------------------
// Breadcrumb Navigation Component
// Based on Figma: node 1339-3649
@@ -1,3 +1,7 @@
@use '../abstracts/variables' as *;
@use '../abstracts/color-functions' as *;
@use '../abstracts/mixins' as *;
// -----------------------------------------------------------------------------
// Button styles - Modern vibrant design
// -----------------------------------------------------------------------------
@@ -1,3 +1,7 @@
@use '../abstracts/variables' as *;
@use '../abstracts/color-functions' as *;
@use '../abstracts/mixins' as *;
// -----------------------------------------------------------------------------
// Card styles - Modern vibrant design
// -----------------------------------------------------------------------------
@@ -1,3 +1,7 @@
@use '../abstracts/variables' as *;
@use '../abstracts/color-functions' as *;
@use '../abstracts/mixins' as *;
// -----------------------------------------------------------------------------
// CTA (Call to Action) section styles
// -----------------------------------------------------------------------------
@@ -1,3 +1,7 @@
@use '../abstracts/variables' as *;
@use '../abstracts/color-functions' as *;
@use '../abstracts/mixins' as *;
// -----------------------------------------------------------------------------
// Form styles
// -----------------------------------------------------------------------------
@@ -1,3 +1,7 @@
@use '../abstracts/variables' as *;
@use '../abstracts/color-functions' as *;
@use '../abstracts/mixins' as *;
// -----------------------------------------------------------------------------
// Header Authentication Component Styles
// Login/Logout button groups and user profile dropdown
@@ -1,3 +1,7 @@
@use '../abstracts/variables' as *;
@use '../abstracts/color-functions' as *;
@use '../abstracts/mixins' as *;
// -----------------------------------------------------------------------------
// Modal styles - KJBank Design (Figma node 985:1912)
// Close button positioned outside the modal (top-right)
@@ -1,3 +1,7 @@
@use '../abstracts/variables' as *;
@use '../abstracts/color-functions' as *;
@use '../abstracts/mixins' as *;
// -----------------------------------------------------------------------------
// Navigation component styles
// -----------------------------------------------------------------------------
@@ -236,4 +240,4 @@
padding: 0 $spacing-sm;
color: $text-gray;
}
}
}
@@ -1,8 +1,10 @@
@use '../abstracts/variables' as *;
@use '../abstracts/color-functions' as *;
@use '../abstracts/mixins' as *;
// Page Title Banner Component
// Reusable banner for page titles across the portal
@import '../abstracts/variables';
@import '../abstracts/mixins';
.page-title-banner {
background: #E9F8FF;
@@ -1,3 +1,7 @@
@use '../abstracts/variables' as *;
@use '../abstracts/color-functions' as *;
@use '../abstracts/mixins' as *;
// -----------------------------------------------------------------------------
// Pagination Component
// Based on Figma design: node-id=985-1102
@@ -99,4 +103,4 @@ $pagination-text-disabled: #adb5bd;
justify-content: center;
padding: $spacing-lg 0;
margin-top: $spacing-lg;
}
}
@@ -1,3 +1,7 @@
@use '../abstracts/variables' as *;
@use '../abstracts/color-functions' as *;
@use '../abstracts/mixins' as *;
// -----------------------------------------------------------------------------
// Partners section styles
// -----------------------------------------------------------------------------
@@ -5,4 +9,4 @@
.partners {
padding: $spacing-5xl 0;
background: $white;
}
}
@@ -1,3 +1,7 @@
@use '../abstracts/variables' as *;
@use '../abstracts/color-functions' as *;
@use '../abstracts/mixins' as *;
// ============================================
// Password Input Popup Component
// Extends base modal styles from _modals.scss
@@ -1,3 +1,7 @@
@use '../abstracts/variables' as *;
@use '../abstracts/color-functions' as *;
@use '../abstracts/mixins' as *;
// -----------------------------------------------------------------------------
// Table Component Styles - Reusable table designs
// -----------------------------------------------------------------------------
@@ -0,0 +1,50 @@
@use '../abstracts/variables' as *;
@use '../abstracts/color-functions' as *;
@use '../abstracts/mixins' as *;
// Test environment notice styles
.test-env-notice {
margin-top: 8px;
padding: 12px 16px;
background-color: #FFF4E6;
border: 1px solid #FFB84D;
border-radius: 4px;
&__content {
display: flex;
align-items: flex-start;
gap: 8px;
}
&__icon {
flex-shrink: 0;
margin-top: 2px;
width: 20px;
height: 20px;
}
&__text-container {
flex: 1;
}
&__title {
margin: 0;
font-size: 14px;
color: #E65100;
font-weight: 500;
}
&__description {
margin: 4px 0 0 0;
font-size: 13px;
color: #5D4037;
line-height: 1.5;
}
&__auth-code {
color: #E65100;
font-family: monospace;
font-size: 14px;
font-weight: bold;
}
}
@@ -1,3 +1,7 @@
@use '../abstracts/variables' as *;
@use '../abstracts/color-functions' as *;
@use '../abstracts/mixins' as *;
// -----------------------------------------------------------------------------
// Container and section styles
// -----------------------------------------------------------------------------
@@ -1,3 +1,7 @@
@use '../abstracts/variables' as *;
@use '../abstracts/color-functions' as *;
@use '../abstracts/mixins' as *;
// -----------------------------------------------------------------------------
// Footer Styles - Figma Design Implementation
// -----------------------------------------------------------------------------
@@ -1,3 +1,7 @@
@use '../abstracts/variables' as *;
@use '../abstracts/color-functions' as *;
@use '../abstracts/mixins' as *;
// -----------------------------------------------------------------------------
// Grid system - Modern responsive layout
// -----------------------------------------------------------------------------
@@ -295,4 +299,4 @@
@include respond-to('md') {
grid-template-columns: 1fr;
}
}
}
@@ -1,3 +1,7 @@
@use '../abstracts/variables' as *;
@use '../abstracts/color-functions' as *;
@use '../abstracts/mixins' as *;
// -----------------------------------------------------------------------------
// Header styles - Modern & Responsive Design
// -----------------------------------------------------------------------------
+54 -51
View File
@@ -1,73 +1,76 @@
// -----------------------------------------------------------------------------
// Main SASS Entry Point - Version 2 (Modern Vibrant Design)
// Based on design/styles-v2.css
// Dart Sass 3.0.0 compatible with @use instead of @import
// -----------------------------------------------------------------------------
@charset "utf-8";
// 1. Configuration and helpers (no CSS output)
@import 'abstracts/variables';
@import 'abstracts/mixins';
@use 'abstracts/variables' as *;
@use 'abstracts/color-functions' as *; // Dart Sass 3.0.0 compatibility
@use 'abstracts/mixins' as *;
// 2. Base styles
@import 'base/reset';
@import 'base/typography';
@import 'base/animations';
@import "base/kjb-font";
@use 'base/reset' as *;
@use 'base/typography' as *;
@use 'base/animations' as *;
@use 'base/kjb-font' as *;
// 3. Layout
@import 'layout/header';
@import 'layout/footer';
@import 'layout/grid';
@import 'layout/container';
@use 'layout/header' as *;
@use 'layout/footer' as *;
@use 'layout/grid' as *;
@use 'layout/container' as *;
// 4. Components
@import 'components/buttons';
@import 'components/badges';
@import 'components/cards';
@import 'components/apikey-common';
@import 'components/forms';
@import 'components/modals';
@import 'components/navigation';
@import 'components/partners';
@import 'components/cta';
@import 'components/password-popup';
@import 'components/header-auth';
@import 'components/tables';
@import 'components/accordion';
@import 'components/page-title-banner';
@import 'components/alerts';
@import 'components/pagination';
@import 'components/breadcrumb';
@use 'components/buttons' as *;
@use 'components/badges' as *;
@use 'components/cards' as *;
@use 'components/apikey-common' as *;
@use 'components/forms' as *;
@use 'components/modals' as *;
@use 'components/navigation' as *;
@use 'components/partners' as *;
@use 'components/cta' as *;
@use 'components/password-popup' as *;
@use 'components/header-auth' as *;
@use 'components/tables' as *;
@use 'components/accordion' as *;
@use 'components/page-title-banner' as *;
@use 'components/alerts' as *;
@use 'components/pagination' as *;
@use 'components/breadcrumb' as *;
@use 'components/test-env-notice' as *;
// 5. Page-specific styles
@import 'pages/index';
@import 'pages/home';
@import 'pages/api-portal';
@import 'pages/api-market';
@import 'pages/documentation';
@import 'pages/login';
@import 'pages/account-recovery';
@import 'pages/signup-selection';
@import 'pages/mypage';
@import 'pages/apikey-register';
@import 'pages/apikey-detail';
@import 'pages/apikey-list';
@import 'pages/notice';
@import 'pages/inquiry';
@import 'pages/org-register';
@import 'pages/partnership';
@import 'pages/user-management';
@import 'pages/commission';
@import 'pages/terms-agreements';
@import 'pages/service';
@import 'pages/api-statistics';
@use 'pages/index' as *;
@use 'pages/home' as *;
@use 'pages/api-portal' as *;
@use 'pages/api-market' as *;
@use 'pages/documentation' as *;
@use 'pages/login' as *;
@use 'pages/account-recovery' as *;
@use 'pages/signup-selection' as *;
@use 'pages/mypage' as *;
@use 'pages/apikey-register' as *;
@use 'pages/apikey-detail' as *;
@use 'pages/apikey-list' as *;
@use 'pages/notice' as *;
@use 'pages/inquiry' as *;
@use 'pages/org-register' as *;
@use 'pages/partnership' as *;
@use 'pages/user-management' as *;
@use 'pages/commission' as *;
@use 'pages/terms-agreements' as *;
@use 'pages/service' as *;
@use 'pages/api-statistics' as *;
// 6. Themes
@import 'themes/dark';
@use 'themes/dark' as *;
// 7. Utilities (should be last)
@import 'base/utilities';
@use 'base/utilities' as *;
// 8. Vendor overrides
@import 'vendors/overrides';
@use 'vendors/overrides' as *;
@@ -1,3 +1,7 @@
@use '../abstracts/variables' as *;
@use '../abstracts/color-functions' as *;
@use '../abstracts/mixins' as *;
// -----------------------------------------------------------------------------
// Account Recovery Page Styles (Find ID / Reset Password) - Figma: 1029-2249
// Matches terms_agreements.html tab design for consistency
@@ -1,3 +1,7 @@
@use '../abstracts/variables' as *;
@use '../abstracts/color-functions' as *;
@use '../abstracts/mixins' as *;
// -----------------------------------------------------------------------------
// API Market Page - Modern Sidebar + Card Grid Layout
// Reference: design/api-market.html
@@ -1,7 +1,11 @@
@use '../abstracts/variables' as *;
@use '../abstracts/color-functions' as *;
@use '../abstracts/mixins' as *;
// -----------------------------------------------------------------------------
// API Portal page specific styles
// -----------------------------------------------------------------------------
.api-portal-page {
// Any API portal-specific styles go here
}
}
@@ -1,3 +1,7 @@
@use '../abstracts/variables' as *;
@use '../abstracts/color-functions' as *;
@use '../abstracts/mixins' as *;
// -----------------------------------------------------------------------------
// API Statistics Page Styles
// -----------------------------------------------------------------------------
@@ -1,3 +1,8 @@
@use '../abstracts/variables' as *;
@use '../abstracts/color-functions' as *;
@use '../abstracts/mixins' as *;
@use '../components/apikey-common' as *;
@charset "utf-8";
// ====================================
@@ -1,3 +1,8 @@
@use '../abstracts/variables' as *;
@use '../abstracts/color-functions' as *;
@use '../abstracts/mixins' as *;
@use '../components/apikey-common' as *;
@charset "utf-8";
// ====================================
@@ -1,3 +1,8 @@
@use '../abstracts/variables' as *;
@use '../abstracts/color-functions' as *;
@use '../abstracts/mixins' as *;
@use '../components/apikey-common' as *;
// -----------------------------------------------------------------------------
// API Key Registration Wizard Styles
// Reference: apps/mypage/apiKeyRegisterStep1.html, Step2, Step3
@@ -2159,5 +2164,3 @@ input[type="checkbox"]:checked + .custom-checkbox {
}
// .compound-input and .section-divider moved to components/_forms.scss
@@ -1,8 +1,10 @@
@use '../abstracts/variables' as *;
@use '../abstracts/color-functions' as *;
@use '../abstracts/mixins' as *;
// Commission Pages Styles
// 수수료 관리 청구서 출력 페이지 스타일
@import '../abstracts/variables';
@import '../abstracts/mixins';
// ==================== Commission Management Page ====================
@@ -1,7 +1,11 @@
@use '../abstracts/variables' as *;
@use '../abstracts/color-functions' as *;
@use '../abstracts/mixins' as *;
// -----------------------------------------------------------------------------
// Documentation page specific styles
// -----------------------------------------------------------------------------
.documentation-page {
// Any documentation-specific styles go here
}
}
@@ -1,7 +1,11 @@
@use '../abstracts/variables' as *;
@use '../abstracts/color-functions' as *;
@use '../abstracts/mixins' as *;
// -----------------------------------------------------------------------------
// Home page specific styles
// -----------------------------------------------------------------------------
.home-page {
// Any home-specific styles go here
}
}
@@ -1,3 +1,7 @@
@use '../abstracts/variables' as *;
@use '../abstracts/color-functions' as *;
@use '../abstracts/mixins' as *;
// -----------------------------------------------------------------------------
// Hero Carousel Section - Figma Design
// -----------------------------------------------------------------------------
@@ -2125,4 +2129,3 @@
background: #DDDDDD;
}
}
@@ -1,3 +1,7 @@
@use '../abstracts/variables' as *;
@use '../abstracts/color-functions' as *;
@use '../abstracts/mixins' as *;
// -----------------------------------------------------------------------------
// Inquiry (Q&A) Pages - List, Detail, and Form Views
// -----------------------------------------------------------------------------
@@ -1,3 +1,7 @@
@use '../abstracts/variables' as *;
@use '../abstracts/color-functions' as *;
@use '../abstracts/mixins' as *;
// -----------------------------------------------------------------------------
// Login Page Styles - Figma Design Implementation
// -----------------------------------------------------------------------------
@@ -1,3 +1,7 @@
@use '../abstracts/variables' as *;
@use '../abstracts/color-functions' as *;
@use '../abstracts/mixins' as *;
// -----------------------------------------------------------------------------
// MyPage Styles
// Used in: mypage profile pages (updateCorporateManager, updatePersonalUser, etc.)
@@ -1,3 +1,7 @@
@use '../abstracts/variables' as *;
@use '../abstracts/color-functions' as *;
@use '../abstracts/mixins' as *;
// -----------------------------------------------------------------------------
// Notice Pages - List and Detail Views
// -----------------------------------------------------------------------------
@@ -1,8 +1,11 @@
@use '../abstracts/variables' as *;
@use '../abstracts/color-functions' as *;
@use '../abstracts/mixins' as *;
@use '../components/apikey-common' as *;
// Organization Registration Page Styles
// Modern design for corporate registration flow
@import '../abstracts/variables';
@import '../abstracts/mixins';
// Main Registration Container
.org-register-page {
@@ -1,3 +1,7 @@
@use '../abstracts/variables' as *;
@use '../abstracts/color-functions' as *;
@use '../abstracts/mixins' as *;
// -----------------------------------------------------------------------------
// Partnership Form Page - Modern Design
// -----------------------------------------------------------------------------
@@ -1,3 +1,7 @@
@use '../abstracts/variables' as *;
@use '../abstracts/color-functions' as *;
@use '../abstracts/mixins' as *;
// -----------------------------------------------------------------------------
// Service Introduction Page Styles
// Figma Design 기반 - 광주은행 오픈뱅크 플랫폼 소개 페이지
@@ -1,3 +1,7 @@
@use '../abstracts/variables' as *;
@use '../abstracts/color-functions' as *;
@use '../abstracts/mixins' as *;
// -----------------------------------------------------------------------------
// Signup Selection Page Styles - Figma Design Implementation
// -----------------------------------------------------------------------------
@@ -1,3 +1,7 @@
@use '../abstracts/variables' as *;
@use '../abstracts/color-functions' as *;
@use '../abstracts/mixins' as *;
// -----------------------------------------------------------------------------
// Terms and Agreements Page - Modern Design (Figma: 3003-1988)
// 이용약관 개인정보처리방침 페이지
@@ -1,3 +1,7 @@
@use '../abstracts/variables' as *;
@use '../abstracts/color-functions' as *;
@use '../abstracts/mixins' as *;
// -----------------------------------------------------------------------------
// User Management Pages - Modern Card-Based Layout
// Styles for user list and user detail pages
@@ -1,6 +1,10 @@
@use '../abstracts/variables' as *;
@use '../abstracts/color-functions' as *;
@use '../abstracts/mixins' as *;
// -----------------------------------------------------------------------------
// Dark theme styles (optional)
// -----------------------------------------------------------------------------
// Dark theme variables can be defined here
// This file can be left empty if dark theme is not needed yet
// This file can be left empty if dark theme is not needed yet
+5 -1
View File
@@ -1,6 +1,10 @@
@use '../abstracts/variables' as *;
@use '../abstracts/color-functions' as *;
@use '../abstracts/mixins' as *;
// -----------------------------------------------------------------------------
// Vendor library overrides
// -----------------------------------------------------------------------------
// Place any third-party library style overrides here
// This file can be left empty if no vendor libraries are used
// This file can be left empty if no vendor libraries are used
@@ -69,6 +69,11 @@
</div>
</div>
<!-- 테스트 환경 안내 메시지 -->
<div class="form-group">
<th:block th:replace="~{fragment/test-env-auth-notice :: smsNotice}"></th:block>
</div>
<!-- Auth Number Input -->
<div class="form-group auth-number-group" id="authNumberGroup" style="display: none;">
<label for="authNumber" class="form-label">인증번호 입력<span class="required-badge">필수</span></label>
@@ -187,6 +192,11 @@
$('#loadingOverlay').fadeOut(200);
if (response.valid) {
// 테스트 환경 인증번호 표시
if (response.authNumber) {
displayTestAuthNotice(response.authNumber);
}
customPopups.showAlert(response.message || '인증번호가 발송되었습니다.', 'success');
// 휴대폰 번호 필드 비활성화
@@ -295,6 +305,33 @@
window.location.href = '/login';
});
// 테스트 환경 안내 메시지 표시
function displayTestAuthNotice(authNumber) {
const noticeHtml = `
<div class="test-env-notice" style="margin-top: 12px; padding: 12px 16px; background-color: #FFF4E6; border: 1px solid #FFB84D; border-radius: 4px;">
<div class="test-env-notice__content" style="display: flex; align-items: flex-start; gap: 8px;">
<svg class="test-env-notice__icon" style="flex-shrink: 0; margin-top: 2px; width: 20px; height: 20px;" viewBox="0 0 20 20" fill="none">
<path d="M10 0C4.48 0 0 4.48 0 10C0 15.52 4.48 20 10 20C15.52 20 20 15.52 20 10C20 4.48 15.52 0 10 0ZM11 15H9V13H11V15ZM11 11H9V5H11V11Z" fill="#FF9800"/>
</svg>
<div class="test-env-notice__text-container" style="flex: 1;">
<p style="margin: 0; font-size: 14px; color: #E65100; font-weight: 500;">테스트 환경 안내</p>
<p style="margin: 4px 0 0 0; font-size: 13px; color: #5D4037; line-height: 1.5;">
현재 테스트 환경입니다. 실제로 SMS가 발송되지 않으며, 인증번호는
<strong style="color: #E65100; font-family: monospace; font-size: 14px; font-weight: bold;">${authNumber}</strong>
입니다.
</p>
</div>
</div>
</div>
`;
// 기존 안내 메시지 제거 후 새로 추가
$('.test-env-notice').remove();
$('<div class="test-auth-notice-container"></div>')
.html(noticeHtml)
.insertAfter($('.phone-input-group').closest('.form-group'));
}
// 기존 휴대폰 번호 복원
$(document).ready(function() {
const savedMobileNumber = $('#mobileNumber').val();
@@ -82,6 +82,16 @@
</div>
</div>
</div>
<!-- 테스트 환경 안내 메시지 -->
<div class="info1 pt28">
<div class="info_line">
<div class="info_box1">
<th:block th:replace="~{fragment/test-env-auth-notice :: smsNotice}"></th:block>
</div>
</div>
</div>
<!-- 인증번호 입력 -->
<div class="info1 pt28 auth-number-container" id="authNumberContainer">
<p class="title w_tit">
@@ -236,8 +246,45 @@
countdownInterval = setInterval(updateRemainingTime, 1000);
}
function displayTestAuthNotice(authNumber) {
const noticeHtml = `
<div class="test-env-notice" style="margin-top: 12px; padding: 12px 16px; background-color: #FFF4E6; border: 1px solid #FFB84D; border-radius: 4px;">
<div class="test-env-notice__content" style="display: flex; align-items: flex-start; gap: 8px;">
<svg class="test-env-notice__icon" style="flex-shrink: 0; margin-top: 2px; width: 20px; height: 20px;" viewBox="0 0 20 20" fill="none">
<path d="M10 0C4.48 0 0 4.48 0 10C0 15.52 4.48 20 10 20C15.52 20 20 15.52 20 10C20 4.48 15.52 0 10 0ZM11 15H9V13H11V15ZM11 11H9V5H11V11Z" fill="#FF9800"/>
</svg>
<div class="test-env-notice__text-container" style="flex: 1;">
<p style="margin: 0; font-size: 14px; color: #E65100; font-weight: 500;">테스트 환경 안내</p>
<p style="margin: 4px 0 0 0; font-size: 13px; color: #5D4037; line-height: 1.5;">
현재 테스트 환경입니다. 실제로 SMS가 발송되지 않으며, 인증번호는
<strong style="color: #E65100; font-family: monospace; font-size: 14px; font-weight: bold;">${authNumber}</strong>
입니다.
</p>
</div>
</div>
</div>
`;
// 기존 안내 메시지 제거
$('.test-env-notice').remove();
// 인증번호 입력 container 바로 앞에 안내 메시지 삽입
const authNumberContainer = document.getElementById('authNumberContainer');
if (authNumberContainer) {
const noticeDiv = document.createElement('div');
noticeDiv.className = 'test-auth-notice-container info1 pt28';
noticeDiv.innerHTML = `<div class="info_line"><div class="info_box1">${noticeHtml}</div></div>`;
authNumberContainer.parentNode.insertBefore(noticeDiv, authNumberContainer);
}
}
function handleAuthNumberRequest(response) {
if (response.valid) {
// 테스트 환경 인증번호 표시
if (response.authNumber) {
displayTestAuthNotice(response.authNumber);
}
// Disable mobile number related fields
let form = $('#accountForm');
let mobilePrefix = form.find('.select_mobile_prefix');
@@ -88,6 +88,11 @@
</div>
</div>
<!-- 테스트 환경 안내 메시지 -->
<div class="form-group">
<th:block th:replace="~{fragment/test-env-auth-notice :: smsNotice}"></th:block>
</div>
<!-- Auth Number Input -->
<div class="form-group auth-number-group" id="authNumberGroup" style="display: none;">
<label for="authNumber" class="form-label">인증번호 입력<span class="required-badge">필수</span></label>
@@ -228,6 +233,11 @@
$('#loadingOverlay').fadeOut(200);
if (response.valid) {
// 테스트 환경 인증번호 표시
if (response.authNumber) {
displayTestAuthNotice(response.authNumber);
}
customPopups.showAlert(response.message || '인증번호가 발송되었습니다.', 'success');
// 휴대폰 번호 필드 비활성화
@@ -348,6 +358,33 @@
window.location.href = '/login';
});
// 테스트 환경 안내 메시지 표시
function displayTestAuthNotice(authNumber) {
const noticeHtml = `
<div class="test-env-notice" style="margin-top: 12px; padding: 12px 16px; background-color: #FFF4E6; border: 1px solid #FFB84D; border-radius: 4px;">
<div class="test-env-notice__content" style="display: flex; align-items: flex-start; gap: 8px;">
<svg class="test-env-notice__icon" style="flex-shrink: 0; margin-top: 2px; width: 20px; height: 20px;" viewBox="0 0 20 20" fill="none">
<path d="M10 0C4.48 0 0 4.48 0 10C0 15.52 4.48 20 10 20C15.52 20 20 15.52 20 10C20 4.48 15.52 0 10 0ZM11 15H9V13H11V15ZM11 11H9V5H11V11Z" fill="#FF9800"/>
</svg>
<div class="test-env-notice__text-container" style="flex: 1;">
<p style="margin: 0; font-size: 14px; color: #E65100; font-weight: 500;">테스트 환경 안내</p>
<p style="margin: 4px 0 0 0; font-size: 13px; color: #5D4037; line-height: 1.5;">
현재 테스트 환경입니다. 실제로 SMS가 발송되지 않으며, 인증번호는
<strong style="color: #E65100; font-family: monospace; font-size: 14px; font-weight: bold;">${authNumber}</strong>
입니다.
</p>
</div>
</div>
</div>
`;
// 기존 안내 메시지 제거 후 새로 추가
$('.test-env-notice').remove();
$('<div class="test-auth-notice-container"></div>')
.html(noticeHtml)
.insertAfter($('.phone-input-group').closest('.form-group'));
}
// 기존 휴대폰 번호 복원
$(document).ready(function() {
const savedMobileNumber = $('#mobileNumber').val();
@@ -86,6 +86,15 @@
</button>
</div>
</div>
<!-- 테스트 환경 안내 메시지 -->
<div class="form-row">
<div class="form-label-wrapper label-offset"></div>
<div class="form-field-wrapper">
<th:block th:replace="~{fragment/test-env-auth-notice :: smsNotice}"></th:block>
</div>
</div>
<div class="form-row" id="authNumberContainer" style="display: none;">
<div class="form-label-wrapper label-offset">
<span class="form-label-text">인증번호 입력</span> <span class="required-badge">필수</span>
@@ -209,9 +218,47 @@
}
}
// 테스트 환경 안내 메시지 표시
function displayTestAuthNotice(authNumber) {
const noticeHtml = `
<div class="test-env-notice" style="margin-top: 12px; padding: 12px 16px; background-color: #FFF4E6; border: 1px solid #FFB84D; border-radius: 4px;">
<div class="test-env-notice__content" style="display: flex; align-items: flex-start; gap: 8px;">
<svg class="test-env-notice__icon" style="flex-shrink: 0; margin-top: 2px; width: 20px; height: 20px;" viewBox="0 0 20 20" fill="none">
<path d="M10 0C4.48 0 0 4.48 0 10C0 15.52 4.48 20 10 20C15.52 20 20 15.52 20 10C20 4.48 15.52 0 10 0ZM11 15H9V13H11V15ZM11 11H9V5H11V11Z" fill="#FF9800"/>
</svg>
<div class="test-env-notice__text-container" style="flex: 1;">
<p style="margin: 0; font-size: 14px; color: #E65100; font-weight: 500;">테스트 환경 안내</p>
<p style="margin: 4px 0 0 0; font-size: 13px; color: #5D4037; line-height: 1.5;">
현재 테스트 환경입니다. 실제로 SMS가 발송되지 않으며, 인증번호는
<strong style="color: #E65100; font-family: monospace; font-size: 14px; font-weight: bold;">${authNumber}</strong>
입니다.
</p>
</div>
</div>
</div>
`;
// 기존 안내 메시지 제거
$('.test-env-notice').remove();
// 인증번호 container의 이전 위치에 안내 메시지 삽입
const authContainer = document.getElementById('authNumberContainer');
if (authContainer) {
const noticeDiv = document.createElement('div');
noticeDiv.className = 'form-row';
noticeDiv.innerHTML = `<div class="form-label-wrapper label-offset"></div><div class="form-field-wrapper">${noticeHtml}</div>`;
authContainer.parentNode.insertBefore(noticeDiv, authContainer);
}
}
// 인증번호 요청 후 처리 함수
function handleAuthNumberRequest(response) {
if (response.valid) {
// 테스트 환경 인증번호 표시
if (response.authNumber) {
displayTestAuthNotice(response.authNumber);
}
let authButton = document.querySelector(".btn_auth");
if (authButton) authButton.disabled = true;
@@ -33,6 +33,14 @@
</div>
</div>
<!-- 테스트 환경 안내 메시지 -->
<div class="form-row">
<div class="form-label-wrapper label-offset"></div>
<div class="form-field-wrapper">
<th:block th:replace="~{fragment/test-env-auth-notice :: emailNotice}"></th:block>
</div>
</div>
<div class="form-row" style="margin-bottom: 0">
<div class="form-label-wrapper label-offset">
<span class="form-label-text">&nbsp;</span>
@@ -136,6 +144,39 @@
}, 1000);
}
// 테스트 환경 안내 메시지 표시
function displayTestAuthNotice(authNumber) {
const noticeHtml = `
<div class="test-env-notice" style="margin-top: 12px; padding: 12px 16px; background-color: #FFF4E6; border: 1px solid #FFB84D; border-radius: 4px;">
<div class="test-env-notice__content" style="display: flex; align-items: flex-start; gap: 8px;">
<svg class="test-env-notice__icon" style="flex-shrink: 0; margin-top: 2px; width: 20px; height: 20px;" viewBox="0 0 20 20" fill="none">
<path d="M10 0C4.48 0 0 4.48 0 10C0 15.52 4.48 20 10 20C15.52 20 20 15.52 20 10C20 4.48 15.52 0 10 0ZM11 15H9V13H11V15ZM11 11H9V5H11V11Z" fill="#FF9800"/>
</svg>
<div class="test-env-notice__text-container" style="flex: 1;">
<p style="margin: 0; font-size: 14px; color: #E65100; font-weight: 500;">테스트 환경 안내</p>
<p style="margin: 4px 0 0 0; font-size: 13px; color: #5D4037; line-height: 1.5;">
현재 테스트 환경입니다. 실제로 이메일이 발송되지 않으며, 인증번호는
<strong style="color: #E65100; font-family: monospace; font-size: 14px; font-weight: bold;">${authNumber}</strong>
입니다.
</p>
</div>
</div>
</div>
`;
// 기존 안내 메시지 제거
$('.test-env-notice').remove();
// authCodeContainer 바로 앞에 안내 메시지 삽입
const authCodeContainer = document.getElementById('authCodeContainer');
if (authCodeContainer) {
const noticeDiv = document.createElement('div');
noticeDiv.className = 'form-row';
noticeDiv.innerHTML = `<div class="form-label-wrapper label-offset"></div><div class="form-field-wrapper">${noticeHtml}</div>`;
authCodeContainer.parentNode.insertBefore(noticeDiv, authCodeContainer);
}
}
// 인증코드 받기 버튼 클릭
$('.btn_send_code').on('click', function(e) {
e.preventDefault();
@@ -154,6 +195,11 @@
[csrfHeaderName]: csrfToken
},
success: function(response) {
// 테스트 환경 인증번호 표시
if (response.authNumber) {
displayTestAuthNotice(response.authNumber);
}
customPopups.showAlert('인증코드가 이메일로 발송되었습니다.');
$('#authCodeContainer').slideDown(300);
$('#authCode').prop('readonly', false);
@@ -48,6 +48,14 @@
</div>
</div>
<!-- 테스트 환경 안내 메시지 -->
<div class="org-form-group">
<label class="org-form-label"></label>
<div class="org-form-input-wrapper">
<th:block th:replace="~{fragment/test-env-auth-notice :: smsNotice}"></th:block>
</div>
</div>
<!-- 인증번호 입력 -->
<div class="org-form-group" id="authNumberContainer" style="display: none;">
<label class="org-form-label">
@@ -181,9 +189,47 @@
}
}
// 테스트 환경 안내 메시지 표시
function displayTestAuthNotice(authNumber) {
const noticeHtml = `
<div class="test-env-notice" style="margin-top: 12px; padding: 12px 16px; background-color: #FFF4E6; border: 1px solid #FFB84D; border-radius: 4px;">
<div class="test-env-notice__content" style="display: flex; align-items: flex-start; gap: 8px;">
<svg class="test-env-notice__icon" style="flex-shrink: 0; margin-top: 2px; width: 20px; height: 20px;" viewBox="0 0 20 20" fill="none">
<path d="M10 0C4.48 0 0 4.48 0 10C0 15.52 4.48 20 10 20C15.52 20 20 15.52 20 10C20 4.48 15.52 0 10 0ZM11 15H9V13H11V15ZM11 11H9V5H11V11Z" fill="#FF9800"/>
</svg>
<div class="test-env-notice__text-container" style="flex: 1;">
<p style="margin: 0; font-size: 14px; color: #E65100; font-weight: 500;">테스트 환경 안내</p>
<p style="margin: 4px 0 0 0; font-size: 13px; color: #5D4037; line-height: 1.5;">
현재 테스트 환경입니다. 실제로 SMS가 발송되지 않으며, 인증번호는
<strong style="color: #E65100; font-family: monospace; font-size: 14px; font-weight: bold;">${authNumber}</strong>
입니다.
</p>
</div>
</div>
</div>
`;
// 기존 안내 메시지 제거
$('.test-env-notice').remove();
// 인증번호 container의 이전 위치에 안내 메시지 삽입
const authContainer = document.getElementById('authNumberContainer');
if (authContainer) {
const noticeDiv = document.createElement('div');
noticeDiv.className = 'org-form-group';
noticeDiv.innerHTML = `<label class="org-form-label"></label><div class="org-form-input-wrapper">${noticeHtml}</div>`;
authContainer.parentNode.insertBefore(noticeDiv, authContainer);
}
}
// 인증번호 요청 후 처리 함수
function handleAuthNumberRequest(response) {
if (response.valid) {
// 테스트 환경 인증번호 표시
if (response.authNumber) {
displayTestAuthNotice(response.authNumber);
}
let authButton = document.querySelector('.btn_auth');
let authContainer = document.getElementById('authNumberContainer');
@@ -0,0 +1,44 @@
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<body>
<!-- SMS 인증번호 안내 메시지 -->
<th:block th:fragment="smsNotice">
<div th:if="${showTestAuthNotice and testAuthNumber != null}" class="test-env-notice">
<div class="test-env-notice__content">
<svg class="test-env-notice__icon" viewBox="0 0 20 20" fill="none">
<path d="M10 0C4.48 0 0 4.48 0 10C0 15.52 4.48 20 10 20C15.52 20 20 15.52 20 10C20 4.48 15.52 0 10 0ZM11 15H9V13H11V15ZM11 11H9V5H11V11Z" fill="#FF9800"/>
</svg>
<div class="test-env-notice__text-container">
<p class="test-env-notice__title">테스트 환경 안내</p>
<p class="test-env-notice__description">
현재 테스트 환경입니다. 실제로 SMS가 발송되지 않으며, 인증번호는
<strong class="test-env-notice__auth-code" th:text="${testAuthNumber}">654321</strong>
입니다.
</p>
</div>
</div>
</div>
</th:block>
<!-- 이메일 인증번호 안내 메시지 -->
<th:block th:fragment="emailNotice">
<div th:if="${showTestAuthNotice and testAuthNumber != null}" class="test-env-notice">
<div class="test-env-notice__content">
<svg class="test-env-notice__icon" viewBox="0 0 20 20" fill="none">
<path d="M10 0C4.48 0 0 4.48 0 10C0 15.52 4.48 20 10 20C15.52 20 20 15.52 20 10C20 4.48 15.52 0 10 0ZM11 15H9V13H11V15ZM11 11H9V5H11V11Z" fill="#FF9800"/>
</svg>
<div class="test-env-notice__text-container">
<p class="test-env-notice__title">테스트 환경 안내</p>
<p class="test-env-notice__description">
현재 테스트 환경입니다. 실제로 이메일이 발송되지 않으며, 인증번호는
<strong class="test-env-notice__auth-code" th:text="${testAuthNumber}">654321</strong>
입니다.
</p>
</div>
</div>
</div>
</th:block>
</body>
</html>