앱 관리 디자인 수정

This commit is contained in:
현성필
2025-11-17 14:17:34 +09:00
parent a074bd578a
commit ab2fca5419
18 changed files with 108 additions and 173 deletions
+41 -43
View File
@@ -4188,9 +4188,6 @@ select.form-control {
.faq-accordion .faq-item.active .faq-question { .faq-accordion .faq-item.active .faq-question {
color: #0049b4; color: #0049b4;
} }
.faq-accordion .faq-item.active .faq-question::before {
background: linear-gradient(135deg, #0049b4 0%, #c3dfea 100%);
}
.faq-accordion .faq-item.active .faq-question .faq-icon { .faq-accordion .faq-item.active .faq-question .faq-icon {
transform: rotate(180deg); transform: rotate(180deg);
color: #0049b4; color: #0049b4;
@@ -4288,7 +4285,7 @@ select.form-control {
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
background: linear-gradient(135deg, #0049b4 0%, #c3dfea 100%); background: #0049b4;
color: #FFFFFF; color: #FFFFFF;
border-radius: 50%; border-radius: 50%;
font-size: 14px; font-size: 14px;
@@ -8633,50 +8630,34 @@ select.form-control {
@media (max-width: 768px) { @media (max-width: 768px) {
.form-actions { .form-actions {
flex-direction: column; flex-direction: column;
width: 100%; padding: 0 16px 16px;
gap: 8px;
} }
}
@media (max-width: 768px) {
.form-actions .btn,
.form-actions .btn-primary, .form-actions .btn-primary,
.form-actions .btn-secondary { .form-actions .btn-secondary,
.form-actions .btn-cancel {
width: 100%; width: 100%;
min-height: 48px;
padding: 14px 24px;
font-size: 16px;
justify-content: center; justify-content: center;
} }
} .form-actions .btn .icon,
.form-actions .btn-primary, .form-actions .btn-primary .icon,
.form-actions .btn-secondary { .form-actions .btn-secondary .icon,
display: inline-flex; .form-actions .btn-cancel .icon {
align-items: center; font-size: 18px;
gap: 8px; }
padding: 12px 24px; .form-actions .btn svg,
border-radius: 8px; .form-actions .btn-primary svg,
font-size: 16px; .form-actions .btn-secondary svg,
font-weight: 500; .form-actions .btn-cancel svg {
transition: all 0.3s ease; width: 18px;
text-decoration: none; height: 18px;
border: none; }
cursor: pointer;
}
.form-actions .btn-primary .icon,
.form-actions .btn-secondary .icon {
font-size: 18px;
}
.form-actions .btn-primary {
background: linear-gradient(135deg, #0049b4 0%, #c3dfea 100%);
color: #FFFFFF;
box-shadow: 0 4px 12px rgba(75, 155, 255, 0.1);
}
.form-actions .btn-primary:hover {
transform: translateY(-2px);
box-shadow: 0 8px 24px rgba(75, 155, 255, 0.15);
}
.form-actions .btn-secondary {
background: #FFFFFF;
color: #1A1A2E;
border: 1px solid #E2E8F0;
}
.form-actions .btn-secondary:hover {
background: #F8FAFC;
border-color: #0049b4;
color: #0049b4;
} }
.register-result { .register-result {
@@ -8890,6 +8871,14 @@ select.form-control {
gap: 16px; gap: 16px;
flex-wrap: wrap; flex-wrap: wrap;
} }
@media (max-width: 768px) {
.result-actions {
flex-direction: column;
align-items: stretch;
gap: 8px;
padding: 0 16px;
}
}
.result-actions .btn-primary, .result-actions .btn-primary,
.result-actions .btn-secondary { .result-actions .btn-secondary {
display: inline-flex; display: inline-flex;
@@ -8908,6 +8897,15 @@ select.form-control {
.result-actions .btn-secondary .icon { .result-actions .btn-secondary .icon {
font-size: 18px; font-size: 18px;
} }
@media (max-width: 768px) {
.result-actions .btn-primary,
.result-actions .btn-secondary {
width: 100%;
min-height: 48px;
padding: 14px 24px;
justify-content: center;
}
}
.result-actions .btn-primary { .result-actions .btn-primary {
background: linear-gradient(135deg, #0049b4 0%, #c3dfea 100%); background: linear-gradient(135deg, #0049b4 0%, #c3dfea 100%);
color: #FFFFFF; color: #FFFFFF;
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -23,9 +23,9 @@
.faq-question { .faq-question {
color: $primary-blue; color: $primary-blue;
&::before { //&::before {
background: $gradient-primary; // background: $gradient-primary;
} //}
.faq-icon { .faq-icon {
transform: rotate(180deg); transform: rotate(180deg);
@@ -128,7 +128,7 @@
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
background: $gradient-primary; background: $primary-blue;
color: $white; color: $white;
border-radius: $border-radius-circle; border-radius: $border-radius-circle;
font-size: $font-size-sm; font-size: $font-size-sm;
@@ -1004,54 +1004,30 @@
@media (max-width: $breakpoint-sm) { @media (max-width: $breakpoint-sm) {
flex-direction: column; flex-direction: column;
width: 100%; padding: 0 $spacing-md $spacing-md;
.btn-primary,
.btn-secondary {
width: 100%;
justify-content: center;
}
}
.btn-primary,
.btn-secondary {
display: inline-flex;
align-items: center;
gap: $spacing-sm; gap: $spacing-sm;
padding: 12px 24px;
border-radius: $border-radius-md;
font-size: $font-size-base;
font-weight: $font-weight-medium;
transition: $transition-base;
text-decoration: none;
border: none;
cursor: pointer;
.icon {
font-size: 18px;
}
} }
.btn-primary { // Button styles for mobile
background: $gradient-primary; .btn,
color: $white; .btn-primary,
box-shadow: $shadow-md; .btn-secondary,
.btn-cancel {
@media (max-width: $breakpoint-sm) {
width: 100%;
min-height: 48px;
padding: 14px $spacing-lg;
font-size: $font-size-base;
justify-content: center;
&:hover { .icon {
transform: translateY(-2px); font-size: 18px;
box-shadow: $shadow-lg; }
}
}
.btn-secondary { svg {
background: $white; width: 18px;
color: $text-dark; height: 18px;
border: 1px solid $border-gray; }
&:hover {
background: $gray-bg;
border-color: $primary-blue;
color: $primary-blue;
} }
} }
} }
@@ -1303,6 +1279,13 @@
gap: $spacing-md; gap: $spacing-md;
flex-wrap: wrap; flex-wrap: wrap;
@media (max-width: $breakpoint-sm) {
flex-direction: column;
align-items: stretch;
gap: $spacing-sm;
padding: 0 $spacing-md;
}
.btn-primary, .btn-primary,
.btn-secondary { .btn-secondary {
display: inline-flex; display: inline-flex;
@@ -1320,6 +1303,13 @@
.icon { .icon {
font-size: 18px; font-size: 18px;
} }
@media (max-width: $breakpoint-sm) {
width: 100%;
min-height: 48px;
padding: 14px $spacing-lg;
justify-content: center;
}
} }
.btn-primary { .btn-primary {
@@ -285,59 +285,6 @@
flex-wrap: wrap; flex-wrap: wrap;
gap: $spacing-xs; gap: $spacing-xs;
align-items: center; align-items: center;
.btn-action {
display: inline-flex;
align-items: center;
gap: 4px;
padding: 6px 12px;
font-size: $font-size-xs;
font-weight: $font-weight-medium;
border: none;
border-radius: $border-radius-md;
cursor: pointer;
transition: $transition-base;
white-space: nowrap;
&.btn-sm {
padding: 4px 10px;
font-size: 11px;
}
&.btn-primary {
background-color: $primary-blue;
color: $white;
&:hover {
background-color: darken($primary-blue, 10%);
box-shadow: $shadow-sm;
}
}
&.btn-danger {
background-color: $accent-orange;
color: $white;
&:hover {
background-color: darken($accent-orange, 10%);
box-shadow: $shadow-sm;
}
}
&.btn-warning {
background-color: $accent-yellow;
color: $gray-800;
&:hover {
background-color: darken($accent-yellow, 10%);
box-shadow: $shadow-sm;
}
}
&:active {
transform: scale(0.98);
}
}
} }
// Empty State // Empty State
@@ -19,7 +19,7 @@
class="btn btn-primary" class="btn btn-primary"
id="requestApiKey"> id="requestApiKey">
<i class="fas fa-plus"></i> <i class="fas fa-plus"></i>
<span>앱 생성하기</span> <span>앱 생성하기</span>
</button> </button>
</div> </div>
</div> </div>
@@ -180,10 +180,10 @@
<!-- Action Buttons --> <!-- Action Buttons -->
<div class="form-actions"> <div class="form-actions">
<a th:href="@{/myapikey/modify/cancel(clientId=${apiKeyModification.clientId})}" class="btn-cancel"> <a th:href="@{/myapikey/modify/cancel(clientId=${apiKeyModification.clientId})}" class="btn btn-cancel">
취소 취소
</a> </a>
<button type="submit" class="btn-primary"> <button type="submit" class="btn btn-primary">
다음 단계 다음 단계
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"> <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
<polyline points="9 18 15 12 9 6"></polyline> <polyline points="9 18 15 12 9 6"></polyline>
@@ -374,4 +374,4 @@
</th:block> </th:block>
</body> </body>
</html> </html>
@@ -129,11 +129,11 @@
<!-- Form Actions --> <!-- Form Actions -->
<div class="form-actions"> <div class="form-actions">
<!-- Save and go back button --> <!-- Save and go back button -->
<button type="submit" formaction="/myapikey/modify/step2/save" class="btn-secondary" id="btnPrevStep"> <button type="submit" formaction="/myapikey/modify/step2/save" class="btn btn-secondary" id="btnPrevStep">
<span class="icon"></span> <span class="icon"></span>
이전 단계 이전 단계
</button> </button>
<button type="submit" class="btn-primary" id="btnNext"> <button type="submit" class="btn btn-primary" id="btnNext">
저장 저장
<span class="icon"></span> <span class="icon"></span>
</button> </button>
@@ -53,11 +53,11 @@
<!-- Action Buttons --> <!-- Action Buttons -->
<div class="result-actions"> <div class="result-actions">
<a th:href="@{/myapikey}" class="btn-secondary"> <a th:href="@{/myapikey}" class="btn btn-secondary">
<span class="icon">📋</span> <span class="icon">📋</span>
API Key 목록으로 API Key 목록으로
</a> </a>
<a th:href="@{/myapikey/api_key_request/history}" class="btn-primary"> <a th:href="@{/myapikey/api_key_request/history}" class="btn btn-primary">
<span class="icon">📄</span> <span class="icon">📄</span>
요청 내역 확인 요청 내역 확인
</a> </a>
@@ -79,7 +79,7 @@
</p> </p>
</div> </div>
<div class="result-actions"> <div class="result-actions">
<a th:href="@{/myapikey}" class="btn-primary"> <a th:href="@{/myapikey}" class="btn btn-primary">
목록으로 돌아가기 목록으로 돌아가기
</a> </a>
</div> </div>
@@ -149,4 +149,4 @@
</th:block> </th:block>
</body> </body>
</html> </html>
@@ -177,11 +177,11 @@
<!-- Form Actions --> <!-- Form Actions -->
<div class="form-actions"> <div class="form-actions">
<a href="/myapikey" class="btn-secondary" id="btnCancel"> <a href="/myapikey" class="btn btn-secondary" id="btnCancel">
<span class="icon"></span> <span class="icon"></span>
취소 취소
</a> </a>
<button type="submit" class="btn-primary"> <button type="submit" class="btn btn-primary">
다음 단계 다음 단계
<span class="icon"></span> <span class="icon"></span>
</button> </button>
@@ -115,11 +115,11 @@
<!-- Form Actions --> <!-- Form Actions -->
<div class="form-actions"> <div class="form-actions">
<button type="button" id="btnPrevStep" class="btn-secondary"> <button type="button" id="btnPrevStep" class="btn btn-secondary">
<span class="icon"></span> <span class="icon"></span>
이전 단계 이전 단계
</button> </button>
<button type="submit" class="btn-primary"> <button type="submit" class="btn btn-primary">
저장 저장
<span class="icon"></span> <span class="icon"></span>
</button> </button>
@@ -53,7 +53,7 @@
<!-- Action Buttons --> <!-- Action Buttons -->
<div class="result-actions"> <div class="result-actions">
<a href="/myapikey" class="btn-secondary"> <a href="/myapikey" class="btn btn-secondary">
<span class="icon">📋</span> <span class="icon">📋</span>
API Key 목록으로 API Key 목록으로
</a> </a>
@@ -75,10 +75,10 @@
</p> </p>
</div> </div>
<div class="result-actions"> <div class="result-actions">
<a href="/myapikey/register/step1" class="btn-secondary"> <a href="/myapikey/register/step1" class="btn btn-secondary">
다시 시도 다시 시도
</a> </a>
<a href="/myapikey" class="btn-primary"> <a href="/myapikey" class="btn btn-primary">
목록으로 목록으로
</a> </a>
</div> </div>
@@ -147,14 +147,14 @@
<div class="detail-actions"> <div class="detail-actions">
<button type="button" <button type="button"
sec:authorize="hasRole('ROLE_API_KEY_REQUEST')" sec:authorize="hasRole('ROLE_API_KEY_REQUEST')"
class="btn-cancel" class="btn btn-secondary"
th:if="${appRequest.approval != null and appRequest.approval.approvalStatus != null and th:if="${appRequest.approval != null and appRequest.approval.approvalStatus != null and
(appRequest.approval.approvalStatus.toString() == 'PENDING' or appRequest.approval.approvalStatus.toString() == 'REQUESTED')}" (appRequest.approval.approvalStatus.toString() == 'PENDING' or appRequest.approval.approvalStatus.toString() == 'REQUESTED')}"
th:data-request-id="${appRequest.id}" th:data-request-id="${appRequest.id}"
onclick="cancelRequestById(this)"> onclick="cancelRequestById(this)">
신청 취소 신청 취소
</button> </button>
<a th:href="@{/myapikey}" class="btn-secondary"> <a th:href="@{/myapikey}" class="btn btn-primary">
목록으로 목록으로
</a> </a>
</div> </div>
@@ -178,20 +178,20 @@
</div> </div>
<!-- Action Buttons --> <!-- Action Buttons -->
<div class="detail-actions"> <div class="form-actions">
<a sec:authorize="hasRole('ROLE_API_KEY_REQUEST')" <a sec:authorize="hasRole('ROLE_API_KEY_REQUEST')"
class="btn-action btn-primary" class="btn btn-primary"
th:href="@{/myapikey/modify/step1(clientId=${apiKey.clientid})}"> th:href="@{/myapikey/modify/step1(clientId=${apiKey.clientid})}">
수정 수정
</a> </a>
<button type="button" <button type="button"
sec:authorize="hasRole('ROLE_API_KEY_REQUEST')" sec:authorize="hasRole('ROLE_API_KEY_REQUEST')"
class="btn-action btn-danger" class="btn btn-danger"
th:data-client-id="${apiKey.clientid}" th:data-client-id="${apiKey.clientid}"
onclick="deleteApiKeyFromButton(this)"> onclick="deleteApiKeyFromButton(this)">
인증키 삭제 인증키 삭제
</button> </button>
<a th:href="@{/myapikey}" class="btn-secondary"> <a th:href="@{/myapikey}" class="btn btn-secondary">
목록으로 목록으로
</a> </a>
</div> </div>
@@ -101,7 +101,7 @@
<!-- Action Buttons --> <!-- Action Buttons -->
<div class="detail-actions"> <div class="detail-actions">
<a th:href="@{/users}" class="btn-secondary"> <a th:href="@{/users}" class="btn btn-secondary">
<i class="fas fa-list"></i> 목록으로 <i class="fas fa-list"></i> 목록으로
</a> </a>
</div> </div>
@@ -72,13 +72,13 @@
<!-- Action Buttons --> <!-- Action Buttons -->
<div class="user-action-buttons" th:if="${user.roleCode != null and user.id != currentUserId}"> <div class="user-action-buttons" th:if="${user.roleCode != null and user.id != currentUserId}">
<button type="button" class="btn-action btn-sm btn-secondary inactivate_user" <button type="button" class="btn btn-sm btn-secondary inactivate_user"
th:if="${user.userStatus.toString() == 'ACTIVE'}" th:if="${user.userStatus.toString() == 'ACTIVE'}"
th:data-user-id="${user.id}" th:data-user-id="${user.id}"
th:data-user-name="${user.maskedUserName}"> th:data-user-name="${user.maskedUserName}">
비활성화 비활성화
</button> </button>
<button type="button" class="btn-action btn-sm btn-primary activate_user" <button type="button" class="btn btn-sm btn-primary activate_user"
th:if="${user.userStatus.toString() != 'ACTIVE'}" th:if="${user.userStatus.toString() != 'ACTIVE'}"
th:data-user-id="${user.id}" th:data-user-id="${user.id}"
th:data-user-name="${user.maskedUserName}"> th:data-user-name="${user.maskedUserName}">
@@ -90,7 +90,7 @@
th:data-user-email="${user.maskedEmailAddr}"> th:data-user-email="${user.maskedEmailAddr}">
초대취소 초대취소
</button> </button>
<button type="button" class="btn-action btn-sm btn-warning assign_manager" <button type="button" class="btn btn-sm btn-warning assign_manager"
th:if="${user.userStatus.toString() == 'ACTIVE' && user.roleCode.toString() == 'ROLE_CORP_USER'}" th:if="${user.userStatus.toString() == 'ACTIVE' && user.roleCode.toString() == 'ROLE_CORP_USER'}"
th:data-user-id="${user.id}" th:data-user-id="${user.id}"
th:data-user-name="${user.maskedUserName}" th:data-user-name="${user.maskedUserName}"