마이페이지 이용자 관리 , 인증키 관리 반응형으로 수정

This commit is contained in:
hong
2026-07-27 14:31:51 +09:00
parent 6434d48b05
commit c2d84bb024
12 changed files with 535 additions and 633 deletions
+196 -141
View File
@@ -2996,6 +2996,10 @@ body.design-survey-active .global-header {
transform: translateY(-2px); transform: translateY(-2px);
color: #fff; color: #fff;
} }
.btn-action-primary.md {
font-size: 14px;
padding: 11px 45px;
}
@media (max-width: 768px) { @media (max-width: 768px) {
.btn-action-primary { .btn-action-primary {
font-size: 15px; font-size: 15px;
@@ -15558,6 +15562,19 @@ input[type=checkbox]:checked + .custom-checkbox {
background: none; background: none;
font-family: "Spoqa Han Sans Neo", "Noto Sans KR", sans-serif; font-family: "Spoqa Han Sans Neo", "Noto Sans KR", sans-serif;
} }
@media (max-width: 768px) {
.step1-wrap .s1-title,
.step1-wrap .s2-title,
.step1-wrap .s3-title,
.step2-wrap .s1-title,
.step2-wrap .s2-title,
.step2-wrap .s3-title,
.step3-wrap .s1-title,
.step3-wrap .s2-title,
.step3-wrap .s3-title {
font-size: 23px !important;
}
}
.step1-wrap .s1-progress-card, .step1-wrap .s1-progress-card,
.step2-wrap .s1-progress-card, .step2-wrap .s1-progress-card,
.step3-wrap .s1-progress-card { .step3-wrap .s1-progress-card {
@@ -15648,6 +15665,20 @@ input[type=checkbox]:checked + .custom-checkbox {
flex-shrink: 0; flex-shrink: 0;
color: #b0bec5; color: #b0bec5;
} }
.step1-wrap .s1-step-circle img,
.step2-wrap .s1-step-circle img,
.step3-wrap .s1-step-circle img {
display: block;
object-fit: contain;
}
@media (max-width: 768px) {
.step1-wrap .s1-step-circle img,
.step2-wrap .s1-step-circle img,
.step3-wrap .s1-step-circle img {
width: 24px !important;
height: 24px !important;
}
}
@media (max-width: 768px) { @media (max-width: 768px) {
.step1-wrap .s1-step-circle, .step1-wrap .s1-step-circle,
.step2-wrap .s1-step-circle, .step2-wrap .s1-step-circle,
@@ -15674,16 +15705,16 @@ input[type=checkbox]:checked + .custom-checkbox {
.step1-wrap .s1-step-svg, .step1-wrap .s1-step-svg,
.step2-wrap .s1-step-svg, .step2-wrap .s1-step-svg,
.step3-wrap .s1-step-svg { .step3-wrap .s1-step-svg {
width: 20px; width: 24px !important;
height: 20px; height: 24px !important;
} }
} }
@media (max-width: 480px) { @media (max-width: 480px) {
.step1-wrap .s1-step-svg, .step1-wrap .s1-step-svg,
.step2-wrap .s1-step-svg, .step2-wrap .s1-step-svg,
.step3-wrap .s1-step-svg { .step3-wrap .s1-step-svg {
width: 16px; width: 18px !important;
height: 16px; height: 18px !important;
} }
} }
.step1-wrap .s1-step-num, .step1-wrap .s1-step-num,
@@ -16149,6 +16180,7 @@ input[type=checkbox]:checked + .custom-checkbox {
.step2-wrap .s2-category-carousel-container { .step2-wrap .s2-category-carousel-container {
gap: 6px; gap: 6px;
margin-bottom: 16px; margin-bottom: 16px;
margin-top: 40px;
} }
} }
.step2-wrap .s2-category-list-wrapper { .step2-wrap .s2-category-list-wrapper {
@@ -16365,7 +16397,7 @@ input[type=checkbox]:checked + .custom-checkbox {
transform: translateY(-5px); transform: translateY(-5px);
box-shadow: 0px 8px 12px rgba(194, 194, 194, 0.4); box-shadow: 0px 8px 12px rgba(194, 194, 194, 0.4);
background: linear-gradient(to bottom, #50caff, #2088ff); background: linear-gradient(to bottom, #50caff, #2088ff);
border-color: transparent; border: none;
} }
.step2-wrap .s2-api-card:hover .s2-api-card-badge, .step2-wrap .s2-api-card:focus .s2-api-card-badge { .step2-wrap .s2-api-card:hover .s2-api-card-badge, .step2-wrap .s2-api-card:focus .s2-api-card-badge {
background-color: #d8f0ff; background-color: #d8f0ff;
@@ -18246,10 +18278,19 @@ input[type=checkbox]:checked + .custom-checkbox {
margin: 40px auto 100px; margin: 40px auto 100px;
font-family: "Spoqa Han Sans Neo", "Noto Sans CJK KR", sans-serif; font-family: "Spoqa Han Sans Neo", "Noto Sans CJK KR", sans-serif;
} }
@media (max-width: 768px) {
.app-management-layout {
flex-direction: column;
gap: 20px;
margin: 20px auto 50px;
padding: 0 16px;
}
}
.app-management-content { .app-management-content {
flex: 1; flex: 1;
min-width: 0; min-width: 0;
width: 100%;
} }
.app-management-header { .app-management-header {
@@ -18258,6 +18299,14 @@ input[type=checkbox]:checked + .custom-checkbox {
align-items: center; align-items: center;
margin-bottom: 24px; margin-bottom: 24px;
} }
@media (max-width: 768px) {
.app-management-header {
margin-bottom: 16px;
}
.app-management-header h2 {
font-size: 20px !important;
}
}
.app-management-header h2 { .app-management-header h2 {
font-size: 24px; font-size: 24px;
font-weight: 700; font-weight: 700;
@@ -18306,6 +18355,15 @@ input[type=checkbox]:checked + .custom-checkbox {
color: inherit; color: inherit;
transition: transform 0.2s ease, box-shadow 0.2s ease; transition: transform 0.2s ease, box-shadow 0.2s ease;
} }
@media (max-width: 768px) {
.app-card-figma {
height: auto;
padding: 16px;
border-radius: 12px;
flex-direction: row;
align-items: flex-start;
}
}
.app-card-figma:hover { .app-card-figma:hover {
transform: translateY(-2px); transform: translateY(-2px);
box-shadow: 0px 6px 15px rgba(192, 192, 192, 0.35); box-shadow: 0px 6px 15px rgba(192, 192, 192, 0.35);
@@ -18322,6 +18380,13 @@ input[type=checkbox]:checked + .custom-checkbox {
align-items: center; align-items: center;
flex-shrink: 0; flex-shrink: 0;
} }
@media (max-width: 768px) {
.app-card-icon-box {
width: 56px;
height: 56px;
border-radius: 8px;
}
}
.app-card-icon-box img, .app-card-icon-box img,
.app-card-icon-box svg { .app-card-icon-box svg {
width: 46px; width: 46px;
@@ -18329,6 +18394,13 @@ input[type=checkbox]:checked + .custom-checkbox {
object-fit: cover; object-fit: cover;
border-radius: 4px; border-radius: 4px;
} }
@media (max-width: 768px) {
.app-card-icon-box img,
.app-card-icon-box svg {
width: 36px;
height: 36px;
}
}
.app-card-info { .app-card-info {
flex: 1; flex: 1;
@@ -18337,6 +18409,11 @@ input[type=checkbox]:checked + .custom-checkbox {
gap: 10px; gap: 10px;
min-width: 0; min-width: 0;
} }
@media (max-width: 768px) {
.app-card-info {
gap: 6px;
}
}
.app-card-header { .app-card-header {
display: flex; display: flex;
@@ -18353,6 +18430,11 @@ input[type=checkbox]:checked + .custom-checkbox {
overflow: hidden; overflow: hidden;
text-overflow: ellipsis; text-overflow: ellipsis;
} }
@media (max-width: 768px) {
.app-card-title {
font-size: 14px;
}
}
.app-card-badge-container { .app-card-badge-container {
display: flex; display: flex;
@@ -18376,6 +18458,10 @@ input[type=checkbox]:checked + .custom-checkbox {
background: #fdf4d4; background: #fdf4d4;
color: #ef9546; color: #ef9546;
} }
.app-card-badge.badge-requested {
background: #ffebeb;
color: #f43f5e;
}
.app-card-badge.badge-approved { .app-card-badge.badge-approved {
background: #1b4ab7; background: #1b4ab7;
color: #ffffff; color: #ffffff;
@@ -18395,6 +18481,11 @@ input[type=checkbox]:checked + .custom-checkbox {
flex: 1; flex: 1;
min-width: 0; min-width: 0;
} }
@media (max-width: 768px) {
.app-card-desc {
font-size: 12px;
}
}
.app-card-footer-row { .app-card-footer-row {
display: flex; display: flex;
@@ -18403,6 +18494,13 @@ input[type=checkbox]:checked + .custom-checkbox {
width: 100%; width: 100%;
min-width: 0; min-width: 0;
} }
@media (max-width: 768px) {
.app-card-footer-row {
flex-direction: column;
align-items: flex-start;
gap: 4px;
}
}
.app-card-expected-date { .app-card-expected-date {
font-size: 14px; font-size: 14px;
@@ -18411,6 +18509,12 @@ input[type=checkbox]:checked + .custom-checkbox {
flex-shrink: 0; flex-shrink: 0;
white-space: nowrap; white-space: nowrap;
} }
@media (max-width: 768px) {
.app-card-expected-date {
margin-left: 0;
font-size: 11px;
}
}
.app-card-expected-date { .app-card-expected-date {
font-size: 12px; font-size: 12px;
@@ -21534,7 +21638,7 @@ input[type=checkbox]:checked + .custom-checkbox {
justify-content: center; justify-content: center;
cursor: pointer; cursor: pointer;
font-weight: 700; font-weight: 700;
height: 39px; height: 55px;
width: 120px; width: 120px;
border-radius: 10px; border-radius: 10px;
font-size: 14px; font-size: 14px;
@@ -21594,11 +21698,9 @@ input[type=checkbox]:checked + .custom-checkbox {
} }
} }
.user-management-container { .user-management-container {
max-width: 1280px;
margin: 0 auto;
padding: 48px 0; padding: 48px 0;
margin-bottom: 40px; margin-bottom: 40px;
min-height: 750px; min-height: 650px;
} }
@media (max-width: 768px) { @media (max-width: 768px) {
.user-management-container { .user-management-container {
@@ -21674,14 +21776,6 @@ input[type=checkbox]:checked + .custom-checkbox {
padding: 0 29px; padding: 0 29px;
gap: 10px; gap: 10px;
} }
@media (max-width: 768px) {
.user-management-container .board-table--user-list .board-table-header,
.user-management-container .board-table--user-list .board-table-row {
display: flex;
padding: 15px;
min-width: auto;
}
}
.user-management-container .board-table--user-list .header-cell, .user-management-container .board-table--user-list .header-cell,
.user-management-container .board-table--user-list .row-cell { .user-management-container .board-table--user-list .row-cell {
padding: 0; padding: 0;
@@ -22016,150 +22110,111 @@ input[type=checkbox]:checked + .custom-checkbox {
display: contents; display: contents;
} }
.user-management-container .table-controls .total-count { .user-management-container .table-controls .total-count {
order: 1; order: 1 !important;
text-align: left; display: flex !important;
font-size: 16px; align-items: center !important;
color: #000000; width: 100% !important;
padding-bottom: 6px; text-align: left !important;
border-bottom: 1.5px solid #212529; font-size: 16px !important;
color: #000000 !important;
padding-bottom: 6px !important;
border-bottom: 1.5px solid #212529 !important;
margin-bottom: 0 !important;
} }
.user-management-container .table-controls .total-count strong { .user-management-container .table-controls .total-count strong {
color: #0049b4; color: #0049b4 !important;
font-weight: 700; font-weight: 700 !important;
font-size: 16px; font-size: 16px !important;
} }
.user-management-container .table-controls .search-box { .user-management-container .table-controls .search-box {
order: 4; order: 2 !important;
width: 100%; width: 100% !important;
margin-top: 10px !important;
} }
.user-management-container .table-controls .search-box .btn { .user-management-container .table-controls .search-box .btn {
display: flex; display: flex !important;
align-items: center; align-items: center !important;
justify-content: center; justify-content: center !important;
width: 100%; width: 100% !important;
height: 44px; height: 44px !important;
margin-top: 0 !important;
} }
.user-management-container .list-table { .user-management-container .board-table--user-list {
order: 2; order: 3 !important;
background: transparent;
border-radius: 0;
overflow: visible;
}
.user-management-container .board-table--user-list .board-table-header {
display: none !important;
}
.user-management-container .board-table--user-list .board-table-row {
display: flex !important;
flex-direction: column !important;
align-items: flex-start !important;
height: auto !important;
padding: 20px 15px !important;
gap: 12px !important;
border-bottom: 1px solid #e2e8f0 !important;
background: #FFFFFF; background: #FFFFFF;
border-radius: 12px; margin-bottom: 10px;
overflow: visible;
} }
.user-management-container .list-table .list-table-header { .user-management-container .board-table--user-list .board-table-row .row-cell {
display: flex;
align-items: center;
height: 40px;
padding: 0 8px;
background: #3BA4ED;
border-radius: 8px 8px 0 0;
}
.user-management-container .list-table .list-table-header .header-cell {
font-size: 14px;
font-weight: 700;
color: #FFFFFF;
padding: 0 4px;
justify-content: center;
}
.user-management-container .list-table .list-table-header .header-cell:nth-child(1) {
display: none;
}
.user-management-container .list-table .list-table-header .header-cell:nth-child(2) {
width: 60px !important;
min-width: 60px;
flex: none;
}
.user-management-container .list-table .list-table-header .header-cell:nth-child(3) {
flex: 1 !important;
min-width: 80px;
}
.user-management-container .list-table .list-table-header .header-cell:nth-child(4) {
width: 39px !important;
min-width: 39px;
flex: none;
}
.user-management-container .list-table .list-table-header .header-cell:nth-child(5) {
width: 61px !important;
min-width: 61px;
flex: none;
}
.user-management-container .list-table .list-table-header .header-cell:nth-child(6) {
display: flex !important; display: flex !important;
width: 40px !important; justify-content: flex-start !important;
min-width: 40px; width: 100% !important;
flex: none; font-size: 14px !important;
color: #212529 !important;
padding: 0 !important;
white-space: normal !important;
} }
.user-management-container .list-table .list-table-body { .user-management-container .board-table--user-list .board-table-row .row-cell::before {
display: flex; content: attr(data-label) !important;
flex-direction: column; display: inline-block !important;
font-weight: 500 !important;
color: #64748b !important;
margin-right: 15px !important;
min-width: 70px !important;
flex-shrink: 0 !important;
} }
.user-management-container .list-table .list-table-row { .user-management-container .board-table--user-list .board-table-row .row-cell[data-label=NO] {
display: flex; display: none !important;
flex-direction: row;
align-items: center;
height: 40px;
padding: 0 8px;
gap: 0;
position: relative;
} }
.user-management-container .list-table .list-table-row:nth-child(even) { .user-management-container .board-table--user-list .board-table-row .row-cell[data-label=성명] {
background-color: #EDF5FD; font-size: 16px !important;
font-weight: 600 !important;
color: #0f172a !important;
margin-bottom: 4px;
} }
.user-management-container .list-table .list-table-row:nth-child(odd) { .user-management-container .board-table--user-list .board-table-row .row-cell[data-label=성명]::before {
background-color: #FFFFFF; display: none !important;
} }
.user-management-container .list-table .list-table-row:hover { .user-management-container .board-table--user-list .board-table-row .row-cell[data-label=성명] a {
background-color: rgba(0, 73, 180, 0.08); color: #0f172a !important;
} font-weight: 600 !important;
.user-management-container .list-table .list-table-row .row-cell {
font-size: 13px;
font-weight: 400;
color: #212529;
padding: 0 4px;
justify-content: center;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.user-management-container .list-table .list-table-row .row-cell::before {
display: none;
}
.user-management-container .list-table .list-table-row .row-cell:nth-child(1) {
display: none;
}
.user-management-container .list-table .list-table-row .row-cell:nth-child(2) {
width: 60px !important;
min-width: 60px;
flex: none;
}
.user-management-container .list-table .list-table-row .row-cell:nth-child(2) a {
color: #212529;
text-decoration: none; text-decoration: none;
font-size: 13px;
} }
.user-management-container .list-table .list-table-row .row-cell:nth-child(3) { .user-management-container .board-table--user-list .board-table-row .row-cell[data-label=성명] a:hover {
flex: 1 !important; color: #2a69de !important;
min-width: 80px;
justify-content: flex-start;
} }
.user-management-container .list-table .list-table-row .row-cell:nth-child(4) { .user-management-container .board-table--user-list .board-table-row .row-cell.row-actions {
width: 39px !important; margin-top: 0;
min-width: 39px; padding-top: 0 !important;
flex: none; border-top: none;
justify-content: flex-end !important;
} }
.user-management-container .list-table .list-table-row .row-cell:nth-child(5) { .user-management-container .board-table--user-list .board-table-row .row-cell.row-actions.has-actions {
width: 61px !important; margin-top: 8px;
min-width: 61px; padding-top: 12px !important;
flex: none; border-top: 1px dashed #e2e8f0;
} }
.user-management-container .list-table .list-table-row .row-cell:nth-child(6), .user-management-container .list-table .list-table-row .row-cell.row-actions { .user-management-container .board-table--user-list .board-table-row .row-cell.row-actions::before {
display: flex !important; display: none !important;
width: 40px !important;
min-width: 40px;
flex: none;
justify-content: center;
overflow: visible;
} }
.user-management-container .list-table .list-table-row .row-actions { .user-management-container .board-table--user-list .board-table-row .row-cell.row-actions .actions-desktop {
display: none !important;
}
.user-management-container .board-table--user-list .board-table-row .row-cell.row-actions .actions-mobile {
display: flex !important; display: flex !important;
} }
.user-management-container .user-empty-state { .user-management-container .user-empty-state {
@@ -22175,7 +22230,7 @@ input[type=checkbox]:checked + .custom-checkbox {
font-size: 14px; font-size: 14px;
} }
.user-management-container .pagination { .user-management-container .pagination {
order: 3; order: 4 !important;
gap: 13px; gap: 13px;
padding: 24px 0; padding: 24px 0;
} }
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
@@ -598,6 +598,11 @@
color: #fff; color: #fff;
} }
&.md {
font-size: 14px;
padding: 11px 45px;
}
@include respond-to('sm') { @include respond-to('sm') {
font-size: 15px; font-size: 15px;
@@ -255,11 +255,19 @@
max-width: 1200px; max-width: 1200px;
margin: 40px auto 100px; margin: 40px auto 100px;
font-family: 'Spoqa Han Sans Neo', 'Noto Sans CJK KR', sans-serif; font-family: 'Spoqa Han Sans Neo', 'Noto Sans CJK KR', sans-serif;
@media (max-width: $breakpoint-sm) {
flex-direction: column;
gap: 20px;
margin: 20px auto 50px;
padding: 0 16px;
}
} }
.app-management-content { .app-management-content {
flex: 1; flex: 1;
min-width: 0; min-width: 0;
width: 100%;
} }
.app-management-header { .app-management-header {
@@ -268,6 +276,14 @@
align-items: center; align-items: center;
margin-bottom: 24px; margin-bottom: 24px;
@media (max-width: $breakpoint-sm) {
margin-bottom: 16px;
h2 {
font-size: 20px !important;
}
}
h2 { h2 {
font-size: 24px; font-size: 24px;
font-weight: 700; font-weight: 700;
@@ -318,6 +334,14 @@
color: inherit; color: inherit;
transition: transform 0.2s ease, box-shadow 0.2s ease; transition: transform 0.2s ease, box-shadow 0.2s ease;
@media (max-width: $breakpoint-sm) {
height: auto;
padding: 16px;
border-radius: 12px;
flex-direction: row;
align-items: flex-start;
}
&:hover { &:hover {
transform: translateY(-2px); transform: translateY(-2px);
box-shadow: 0px 6px 15px rgba(192, 192, 192, 0.35); box-shadow: 0px 6px 15px rgba(192, 192, 192, 0.35);
@@ -335,12 +359,23 @@
align-items: center; align-items: center;
flex-shrink: 0; flex-shrink: 0;
@media (max-width: $breakpoint-sm) {
width: 56px;
height: 56px;
border-radius: 8px;
}
img, img,
svg { svg {
width: 46px; width: 46px;
height: 46px; height: 46px;
object-fit: cover; object-fit: cover;
border-radius: 4px; border-radius: 4px;
@media (max-width: $breakpoint-sm) {
width: 36px;
height: 36px;
}
} }
} }
@@ -350,6 +385,10 @@
flex-direction: column; flex-direction: column;
gap: 10px; gap: 10px;
min-width: 0; min-width: 0;
@media (max-width: $breakpoint-sm) {
gap: 6px;
}
} }
.app-card-header { .app-card-header {
@@ -366,6 +405,10 @@
white-space: nowrap; white-space: nowrap;
overflow: hidden; overflow: hidden;
text-overflow: ellipsis; text-overflow: ellipsis;
@media (max-width: $breakpoint-sm) {
font-size: 14px;
}
} }
.app-card-badge-container { .app-card-badge-container {
@@ -391,6 +434,11 @@
color: #ef9546; color: #ef9546;
} }
&.badge-requested {
background: #ffebeb;
color: #f43f5e;
}
&.badge-approved { &.badge-approved {
background: #1b4ab7; background: #1b4ab7;
color: #ffffff; color: #ffffff;
@@ -411,6 +459,10 @@
text-overflow: ellipsis; text-overflow: ellipsis;
flex: 1; flex: 1;
min-width: 0; min-width: 0;
@media (max-width: $breakpoint-sm) {
font-size: 12px;
}
} }
.app-card-footer-row { .app-card-footer-row {
@@ -419,6 +471,12 @@
align-items: center; align-items: center;
width: 100%; width: 100%;
min-width: 0; min-width: 0;
@media (max-width: $breakpoint-sm) {
flex-direction: column;
align-items: flex-start;
gap: 4px;
}
} }
.app-card-expected-date { .app-card-expected-date {
@@ -427,7 +485,13 @@
margin-left: 16px; margin-left: 16px;
flex-shrink: 0; flex-shrink: 0;
white-space: nowrap; white-space: nowrap;
@media (max-width: $breakpoint-sm) {
margin-left: 0;
font-size: 11px;
}
} }
.app-card-expected-date { .app-card-expected-date {
font-size: 12px; font-size: 12px;
color: #64748b; color: #64748b;
@@ -456,4 +520,4 @@
color: #64748b; color: #64748b;
margin: 0; margin: 0;
} }
} }
@@ -2938,6 +2938,10 @@ input[type="checkbox"]:checked+.custom-checkbox {
border: none; border: none;
background: none; background: none;
font-family: 'Spoqa Han Sans Neo', 'Noto Sans KR', sans-serif; font-family: 'Spoqa Han Sans Neo', 'Noto Sans KR', sans-serif;
@media (max-width: $breakpoint-sm) {
font-size: 23px !important;
}
} }
// ── 진행 단계 카드 ── // ── 진행 단계 카드 ──
@@ -3015,6 +3019,16 @@ input[type="checkbox"]:checked+.custom-checkbox {
flex-shrink: 0; flex-shrink: 0;
color: #b0bec5; // SVG currentColor 비활성 색상 color: #b0bec5; // SVG currentColor 비활성 색상
img {
display: block;
object-fit: contain;
@media (max-width: $breakpoint-sm) {
width: 24px !important;
height: 24px !important;
}
}
@media (max-width: 768px) { @media (max-width: 768px) {
width: 44px; width: 44px;
height: 44px; height: 44px;
@@ -3032,13 +3046,13 @@ input[type="checkbox"]:checked+.custom-checkbox {
flex-shrink: 0; flex-shrink: 0;
@media (max-width: 768px) { @media (max-width: 768px) {
width: 20px; width: 24px !important;
height: 20px; height: 24px !important;
} }
@media (max-width: 480px) { @media (max-width: 480px) {
width: 16px; width: 18px !important;
height: 16px; height: 18px !important;
} }
} }
@@ -3467,6 +3481,7 @@ input[type="checkbox"]:checked+.custom-checkbox {
@media (max-width: 768px) { @media (max-width: 768px) {
gap: 6px; gap: 6px;
margin-bottom: 16px; margin-bottom: 16px;
margin-top: 40px;
} }
} }
@@ -3707,7 +3722,7 @@ input[type="checkbox"]:checked+.custom-checkbox {
transform: translateY(-5px); transform: translateY(-5px);
box-shadow: 0px 8px 12px rgba(194, 194, 194, 0.4); box-shadow: 0px 8px 12px rgba(194, 194, 194, 0.4);
background: linear-gradient(to bottom, #50caff, #2088ff); background: linear-gradient(to bottom, #50caff, #2088ff);
border-color: transparent; border: none;
.s2-api-card-badge { .s2-api-card-badge {
background-color: #d8f0ff; background-color: #d8f0ff;
@@ -4406,4 +4421,4 @@ input[type="checkbox"]:checked+.custom-checkbox {
color: #ffffff; color: #ffffff;
} }
} }
} }
@@ -9,11 +9,9 @@
// User Management Container (List Page) // User Management Container (List Page)
.user-management-container { .user-management-container {
max-width: 1280px;
margin: 0 auto;
padding: $spacing-3xl 0; padding: $spacing-3xl 0;
margin-bottom: $spacing-2xl; margin-bottom: $spacing-2xl;
min-height: 750px; // Ensure the footer doesn't float when content is short min-height: 650px; // Ensure the footer doesn't float when content is short
@media (max-width: $breakpoint-sm) { @media (max-width: $breakpoint-sm) {
padding: $spacing-lg $spacing-md; padding: $spacing-lg $spacing-md;
@@ -109,12 +107,6 @@
grid-template-columns: 24px 112px 1fr 100px 100px 287px; grid-template-columns: 24px 112px 1fr 100px 100px 287px;
padding: 0 29px; // Match standard board-table padding padding: 0 29px; // Match standard board-table padding
gap: 10px; gap: 10px;
@media (max-width: $breakpoint-sm) {
display: flex;
padding: 15px;
min-width: auto;
}
} }
.header-cell, .header-cell,
@@ -505,198 +497,134 @@
display: contents; display: contents;
.total-count { .total-count {
order: 1; order: 1 !important;
text-align: left; display: flex !important;
font-size: 16px; align-items: center !important;
color: $black; width: 100% !important;
padding-bottom: 6px; text-align: left !important;
border-bottom: 1.5px solid #212529; font-size: 16px !important;
color: $black !important;
padding-bottom: 6px !important;
border-bottom: 1.5px solid #212529 !important;
margin-bottom: 0 !important;
strong { strong {
color: #0049b4; color: #0049b4 !important;
font-weight: $font-weight-bold; font-weight: $font-weight-bold !important;
font-size: 16px; font-size: 16px !important;
} }
} }
// 이용자 추가 버튼 - 테이블 아래로 이동 // 이용자 추가 버튼 (검색창 위치와 동일하게 총건수 바로 아래에 노출하도록 순서 조정)
.search-box { .search-box {
order: 4; order: 2 !important;
width: 100%; width: 100% !important;
margin-top: 10px !important;
.btn { .btn {
display: flex; display: flex !important;
align-items: center; align-items: center !important;
justify-content: center; justify-content: center !important;
width: 100%; width: 100% !important;
height: 44px; height: 44px !important;
margin-top: 0 !important;
} }
} }
} }
// List Table - 모바일 디자인 (코너 라운드 적용) // List Table - 모바일 디자인 (Q&A 세로 카드형 레이아웃 적용)
.list-table { .board-table--user-list {
order: 2; order: 3 !important;
background: $white; background: transparent;
border-radius: $border-radius-lg; border-radius: 0;
overflow: visible; // dropdown이 보이도록 변경 overflow: visible;
// Header - 모바일에서 표시 (Figma: 40px 높이, #3BA4ED 배경) .board-table-header {
.list-table-header { display: none !important; // 헤더는 모바일에서 숨김
display: flex;
align-items: center;
height: 40px;
padding: 0 8px;
background: #3BA4ED;
border-radius: $border-radius-md $border-radius-md 0 0;
.header-cell {
font-size: 14px;
font-weight: $font-weight-bold;
color: $white;
padding: 0 4px;
justify-content: center;
// NO 컬럼 - 모바일에서 숨김
&:nth-child(1) {
display: none;
}
// 성명 컬럼 - 60px
&:nth-child(2) {
width: 60px !important;
min-width: 60px;
flex: none;
}
// 이메일 아이디 컬럼 - flex 1
&:nth-child(3) {
flex: 1 !important;
min-width: 80px;
}
// 권한 컬럼 - 39px
&:nth-child(4) {
width: 39px !important;
min-width: 39px;
flex: none;
}
// 계정상태 컬럼 - 61px
&:nth-child(5) {
width: 61px !important;
min-width: 61px;
flex: none;
}
// 설정 컬럼 - 모바일에서 표시 (40px)
&:nth-child(6) {
display: flex !important;
width: 40px !important;
min-width: 40px;
flex: none;
}
}
} }
// Body .board-table-row {
.list-table-body { display: flex !important;
display: flex; flex-direction: column !important;
flex-direction: column; align-items: flex-start !important;
} height: auto !important;
padding: 20px 15px !important;
// Row - 모바일 디자인 (Figma: 40px 높이) gap: 12px !important;
.list-table-row { border-bottom: 1px solid #e2e8f0 !important;
display: flex; background: $white;
flex-direction: row; margin-bottom: 10px;
align-items: center;
height: 40px;
padding: 0 8px;
gap: 0;
position: relative; // dropdown positioning
// 짝수/홀수 배경색
&:nth-child(even) {
background-color: #EDF5FD;
}
&:nth-child(odd) {
background-color: $white;
}
&:hover {
background-color: rgba($primary-blue, 0.08);
}
.row-cell { .row-cell {
font-size: 13px; display: flex !important;
font-weight: $font-weight-regular; justify-content: flex-start !important;
color: #212529; width: 100% !important;
padding: 0 4px; font-size: 14px !important;
justify-content: center; color: #212529 !important;
white-space: nowrap; padding: 0 !important;
overflow: hidden; white-space: normal !important;
text-overflow: ellipsis;
// data-label 숨김
&::before { &::before {
display: none; content: attr(data-label) !important;
display: inline-block !important;
font-weight: 500 !important;
color: #64748b !important;
margin-right: 15px !important;
min-width: 70px !important;
flex-shrink: 0 !important;
} }
// NO 컬럼 - 모바일에서 숨김 // NO 컬럼 - 모바일 숨김
&:nth-child(1) { &[data-label="NO"] {
display: none; display: none !important;
} }
// 성명 컬럼 - 60px // 성명 컬럼 - 제목처럼 크게 노출 (라벨 제거)
&:nth-child(2) { &[data-label="성명"] {
width: 60px !important; font-size: 16px !important;
min-width: 60px; font-weight: 600 !important;
flex: none; color: #0f172a !important;
margin-bottom: 4px;
&::before {
display: none !important;
}
a { a {
color: #212529; color: #0f172a !important;
font-weight: 600 !important;
text-decoration: none; text-decoration: none;
font-size: 13px;
&:hover {
color: #2a69de !important;
}
} }
} }
// 이메일 아이디 컬럼 - flex 1 // 설정 버튼 배치 (액션이 있을 때만 경계점선 표시)
&:nth-child(3) {
flex: 1 !important;
min-width: 80px;
justify-content: flex-start;
}
// 권한 컬럼 - 39px
&:nth-child(4) {
width: 39px !important;
min-width: 39px;
flex: none;
}
// 계정상태 컬럼 - 61px
&:nth-child(5) {
width: 61px !important;
min-width: 61px;
flex: none;
}
// 설정 컬럼 (row-actions) - 모바일에서 표시 (40px)
&:nth-child(6),
&.row-actions { &.row-actions {
display: flex !important; margin-top: 0;
width: 40px !important; padding-top: 0 !important;
min-width: 40px; border-top: none;
flex: none; justify-content: flex-end !important;
justify-content: center;
overflow: visible;
}
}
// row-actions 클래스 표시 &.has-actions {
.row-actions { margin-top: 8px;
display: flex !important; padding-top: 12px !important;
border-top: 1px dashed #e2e8f0;
}
&::before {
display: none !important;
}
.actions-desktop {
display: none !important;
}
.actions-mobile {
display: flex !important;
}
}
} }
} }
} }
@@ -718,9 +646,9 @@
} }
} }
// Pagination - 모바일 디자인 (테이블 다음, 버튼 이전) // Pagination - 모바일 디자인 (테이블 다음)
.pagination { .pagination {
order: 3; order: 4 !important;
gap: 13px; gap: 13px;
padding: $spacing-lg 0; padding: $spacing-lg 0;
@@ -11,208 +11,8 @@
</div> </div>
</section> </section>
<th:block layout:fragment="contentFragment"> <th:block layout:fragment="contentFragment">
<style>
/* App Card Figma Styles */
.app-management-layout {
display: flex;
gap: 36px;
max-width: 1200px;
margin: 40px auto 100px;
font-family: 'Spoqa Han Sans Neo', 'Noto Sans CJK KR', sans-serif;
}
.app-management-content {
flex: 1;
min-width: 0;
}
.app-management-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 24px;
}
.app-management-header h2 {
font-size: 24px;
font-weight: 700;
color: #000;
margin: 0;
}
.btn-app-create-figma {
background-color: #2a69de;
color: #ffffff;
border-radius: 7px;
padding: 0 20px;
width: 122px;
height: 35px;
display: flex;
justify-content: center;
align-items: center;
font-size: 12px;
font-weight: 700;
border: none;
cursor: pointer;
text-decoration: none;
transition: background-color 0.2s;
}
.btn-app-create-figma:hover {
background-color: #1b4ab7;
}
.app-list-container-figma {
display: flex;
flex-direction: column;
gap: 20px;
}
.app-card-figma {
display: flex;
align-items: center;
gap: 14px;
height: 107px;
padding: 20px 31px 20px 17px;
background: #ffffff;
border: 1px solid #dfdfdf;
border-radius: 20px;
box-shadow: 0px 4px 5.45px rgba(192, 192, 192, 0.25);
text-decoration: none;
color: inherit;
transition: transform 0.2s ease, box-shadow 0.2s ease;
}
.app-card-figma:hover {
transform: translateY(-2px);
box-shadow: 0px 6px 15px rgba(192, 192, 192, 0.35);
}
.app-card-icon-box {
width: 68px;
height: 67px;
background: #f9f9f9;
border: 1px solid #dee3e7;
border-radius: 10px;
display: flex;
justify-content: center;
align-items: center;
flex-shrink: 0;
}
.app-card-icon-box img,
.app-card-icon-box svg {
width: 46px;
height: 46px;
object-fit: cover;
border-radius: 4px;
}
.app-card-info {
flex: 1;
display: flex;
flex-direction: column;
gap: 10px;
min-width: 0;
}
.app-card-header {
display: flex;
justify-content: space-between;
align-items: center;
}
.app-card-title {
font-size: 16px;
font-weight: 500;
color: #000;
margin: 0;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.app-card-badge {
height: 20px;
border-radius: 5px;
padding: 0 8px;
font-size: 10px;
font-weight: 500;
display: flex;
align-items: center;
justify-content: center;
white-space: nowrap;
}
.app-card-badge.status-pending {
background: #fdf4d4;
color: #ef9546;
}
.app-card-badge.status-approved {
background: #1b4ab7;
color: #ffffff;
}
.app-card-badge.status-inactive {
background: #f3f4f6;
color: #6b7280;
}
.app-card-desc {
font-size: 14px;
color: #64748b;
margin: 0;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
flex: 1;
min-width: 0;
}
.app-card-footer-row {
display: flex;
justify-content: space-between;
align-items: center;
width: 100%;
min-width: 0;
}
.app-card-expected-date {
font-size: 14px;
color: #64748b;
margin-left: 16px;
flex-shrink: 0;
white-space: nowrap;
}
.app-list-empty-figma {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 60px 0;
background: #ffffff;
border: 1px solid #dfdfdf;
border-radius: 20px;
text-align: center;
}
.app-list-empty-figma h3 {
font-size: 18px;
color: #000;
margin: 16px 0 8px;
}
.app-list-empty-figma p {
font-size: 14px;
color: #64748b;
margin: 0;
}
</style>
<div class="signup-guide-v2"> <div class="signup-guide-v2">
<div class="service-main app-management-layout"> <div class="service-main container" style="padding-top: 70px;">
<!-- Sidebar --> <!-- Sidebar -->
<th:block th:replace="~{fragment/djbank/service_sidebar :: sidebar('apiKey')}"></th:block> <th:block th:replace="~{fragment/djbank/service_sidebar :: sidebar('apiKey')}"></th:block>
@@ -223,7 +23,7 @@
<div class="app-management-header"> <div class="app-management-header">
<h2>인증 키 관리</h2> <h2>인증 키 관리</h2>
<div sec:authorize="hasRole('ROLE_API_KEY_REQUEST')"> <div sec:authorize="hasRole('ROLE_API_KEY_REQUEST')">
<button type="button" class="btn-app-create-figma" id="requestApiKey"> <button type="button" class="btn-action-primary md" id="requestApiKey">
앱 생성 앱 생성
</button> </button>
</div> </div>
@@ -255,7 +55,8 @@
<!-- App Name --> <!-- App Name -->
<h3 class="app-card-title" th:text="${request.clientName}">앱 이름</h3> <h3 class="app-card-title" th:text="${request.clientName}">앱 이름</h3>
<!-- Status Badge --> <!-- Status Badge -->
<span class="app-card-badge status-pending" <span class="app-card-badge"
th:classappend="${request.approval != null and request.approval.approvalStatus != null and request.approval.approvalStatus.toString() == 'REQUESTED' ? 'badge-requested' : 'badge-pending'}"
th:text="${request.approval != null and request.approval.approvalStatus != null ? request.approval.approvalStatus.description : '승인대기'}"> th:text="${request.approval != null and request.approval.approvalStatus != null ? request.approval.approvalStatus.description : '승인대기'}">
승인대기 승인대기
</span> </span>
@@ -266,11 +67,16 @@
th:text="${request.appDescription != null ? request.appDescription : '설명 없음'}"> th:text="${request.appDescription != null ? request.appDescription : '설명 없음'}">
앱 설명이 여기에 표시됩니다. 앱 설명이 여기에 표시됩니다.
</p> </p>
<!-- Expected date or placeholder to keep structure aligned -->
<span class="app-card-expected-date" <span class="app-card-expected-date"
th:if="${request.approval != null and request.approval.expectEndDate != null and #strings.length(request.approval.expectEndDate) >= 8}" th:if="${request.approval != null and request.approval.expectEndDate != null and #strings.length(request.approval.expectEndDate) >= 8}"
th:text="|예상 완료일 : ${#strings.substring(request.approval.expectEndDate,4,6)}월 ${#strings.substring(request.approval.expectEndDate,6,8)}일 (${request.approval.expectEndDateDayOfWeek})|"> th:text="|예상 완료일 : ${#strings.substring(request.approval.expectEndDate,4,6)}월 ${#strings.substring(request.approval.expectEndDate,6,8)}일 (${request.approval.expectEndDateDayOfWeek})|">
예상 완료일 : 05월 30일 (토) 예상 완료일 : 05월 30일 (토)
</span> </span>
<span class="app-card-expected-date"
th:unless="${request.approval != null and request.approval.expectEndDate != null and #strings.length(request.approval.expectEndDate) >= 8}">
예상 완료일 : -
</span>
</div> </div>
</div> </div>
</a> </a>
@@ -300,7 +106,7 @@
<h3 class="app-card-title" th:text="${apikey.clientname}">앱 이름</h3> <h3 class="app-card-title" th:text="${apikey.clientname}">앱 이름</h3>
<!-- Status Badge --> <!-- Status Badge -->
<span class="app-card-badge" <span class="app-card-badge"
th:classappend="${apikey.appstatus == '1' ? 'status-approved' : apikey.appstatus == '0' ? 'status-inactive' : 'status-pending'}" th:classappend="${apikey.appstatus == '1' ? 'badge-approved' : apikey.appstatus == '0' ? 'badge-inactive' : 'badge-pending'}"
th:text="${apikey.appstatus == '1' ? '승인' : apikey.appstatus == '0' ? '비활성화' : '승인대기'}"> th:text="${apikey.appstatus == '1' ? '승인' : apikey.appstatus == '0' ? '비활성화' : '승인대기'}">
승인 승인
</span> </span>
@@ -361,4 +167,4 @@
</th:block> </th:block>
</body> </body>
</html> </html>
@@ -13,7 +13,7 @@
<th:block layout:fragment="contentFragment"> <th:block layout:fragment="contentFragment">
<div class="signup-guide-v2 figma-register-wrapper"> <div class="signup-guide-v2 figma-register-wrapper">
<div class="service-main app-management-layout"> <div class="service-main container" style="padding-top: 70px;">
<!-- Sidebar --> <!-- Sidebar -->
<th:block th:replace="~{fragment/djbank/service_sidebar :: sidebar('apiKey')}"></th:block> <th:block th:replace="~{fragment/djbank/service_sidebar :: sidebar('apiKey')}"></th:block>
@@ -29,10 +29,19 @@
<!-- Progress Steps Card --> <!-- Progress Steps Card -->
<div class="s1-progress-card"> <div class="s1-progress-card">
<div class="s1-steps"> <div class="s1-steps">
<!-- Step 1 Active: 앱 정보 입력 --> <!-- Step 1 Active: 앱 정보 입력 (document icon) -->
<div class="s1-step s1-step--active"> <div class="s1-step s1-step--active">
<div class="s1-step-circle"> <div class="s1-step-circle">
<img th:src="@{/img/apikey_step1.png}" alt="앱 정보 입력" width="36" height="36"> <svg class="s1-step-svg" width="26" height="26" viewBox="0 0 24 24" fill="none"
xmlns="http://www.w3.org/2000/svg">
<rect x="3" y="5" width="18" height="14" rx="2" stroke="currentColor" stroke-width="1.8" />
<line x1="7" y1="9" x2="17" y2="9" stroke="currentColor" stroke-width="1.8"
stroke-linecap="round" />
<line x1="7" y1="12" x2="14" y2="12" stroke="currentColor" stroke-width="1.8"
stroke-linecap="round" />
<line x1="7" y1="15" x2="11" y2="15" stroke="currentColor" stroke-width="1.8"
stroke-linecap="round" />
</svg>
</div> </div>
<span class="s1-step-num">1단계</span> <span class="s1-step-num">1단계</span>
<span class="s1-step-name">앱 정보 입력</span> <span class="s1-step-name">앱 정보 입력</span>
@@ -40,10 +49,16 @@
<div class="s1-step-line"></div> <div class="s1-step-line"></div>
<!-- Step 2: API 선택 --> <!-- Step 2: API 선택 (chain link icon) -->
<div class="s1-step"> <div class="s1-step">
<div class="s1-step-circle"> <div class="s1-step-circle">
<img th:src="@{/img/apikey_step2.png}" alt="API 선택" width="36" height="36"> <svg class="s1-step-svg" width="26" height="26" viewBox="0 0 24 24" fill="none"
xmlns="http://www.w3.org/2000/svg">
<path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71" stroke="currentColor"
stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" />
<path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71" stroke="currentColor"
stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" />
</svg>
</div> </div>
<span class="s1-step-num">2단계</span> <span class="s1-step-num">2단계</span>
<span class="s1-step-name">API 선택</span> <span class="s1-step-name">API 선택</span>
@@ -51,10 +66,22 @@
<div class="s1-step-line"></div> <div class="s1-step-line"></div>
<!-- Step 3: 앱 생성 완료 --> <!-- Step 3: 앱 생성 완료 (rocket icon) -->
<div class="s1-step"> <div class="s1-step">
<div class="s1-step-circle"> <div class="s1-step-circle">
<img th:src="@{/img/apikey_step3.png}" alt="앱 생성 완료" width="36" height="36"> <svg class="s1-step-svg" width="26" height="26" viewBox="0 0 24 24" fill="none"
xmlns="http://www.w3.org/2000/svg">
<path
d="M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 0 0-2.91-.09z"
stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" />
<path
d="M12 15l-3-3a22 22 0 0 1 2-3.95A12.88 12.88 0 0 1 22 2c0 2.72-.78 7.5-6 11a22.35 22.35 0 0 1-4 2z"
stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" />
<path d="M9 12H4s.55-3.03 2-4c1.62-1.08 5 0 5 0" stroke="currentColor" stroke-width="1.6"
stroke-linecap="round" stroke-linejoin="round" />
<path d="M12 15v5s3.03-.55 4-2c1.08-1.62 0-5 0-5" stroke="currentColor" stroke-width="1.6"
stroke-linecap="round" stroke-linejoin="round" />
</svg>
</div> </div>
<span class="s1-step-num">3단계</span> <span class="s1-step-num">3단계</span>
<span class="s1-step-name">앱 생성 완료</span> <span class="s1-step-name">앱 생성 완료</span>
@@ -382,4 +409,4 @@
</th:block> </th:block>
</body> </body>
</html> </html>
@@ -1,118 +1,120 @@
<!DOCTYPE html> <!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" <html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"
xmlns:sec="http://www.thymeleaf.org/extras/spring-security" xmlns:sec="http://www.thymeleaf.org/extras/spring-security" xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout" layout:decorate="~{layout/djbank_title_layout}"> layout:decorate="~{layout/djbank_title_layout}">
<body> <body>
<section layout:fragment="title"> <section layout:fragment="title">
<div class="page-title-banner"> <div class="page-title-banner">
<img th:src="@{/img/img_title_bg.png}" class="title-image"> <img th:src="@{/img/img_title_bg.png}" class="title-image">
<h1>앱관리</h1> <h1>앱관리</h1>
</div> </div>
</section> </section>
<th:block layout:fragment="contentFragment"> <th:block layout:fragment="contentFragment">
<div class="signup-guide-v2 figma-register-wrapper"> <div class="signup-guide-v2 figma-register-wrapper">
<div class="service-main app-management-layout"> <div class="service-main container">
<!-- Left Sidebar (Service Sidebar) --> <!-- Left Sidebar (Service Sidebar) -->
<th:block th:replace="~{fragment/djbank/service_sidebar :: sidebar('apiKey')}"></th:block> <th:block th:replace="~{fragment/djbank/service_sidebar :: sidebar('apiKey')}"></th:block>
<!-- Content Area --> <!-- Content Area -->
<div class="app-management-content"> <div class="app-management-content">
<!-- 모든 스타일은 step2-wrap 안에서만 적용 --> <!-- 모든 스타일은 step2-wrap 안에서만 적용 -->
<div class="step2-wrap"> <div class="step2-wrap">
<!-- Title --> <!-- Title -->
<h2 class="s2-title">앱생성</h2> <h2 class="s2-title">앱생성</h2>
<!-- Progress Steps Card --> <!-- Progress Steps Card -->
<div class="s1-progress-card"> <div class="s1-progress-card">
<div class="s1-steps"> <div class="s1-steps">
<!-- Step 1: 앱 정보 입력 (completed) --> <!-- Step 1: 앱 정보 입력 (completed) -->
<div class="s1-step"> <div class="s1-step">
<div class="s1-step-circle"> <div class="s1-step-circle">
<!-- 입력폼 아이콘 --> <!-- 입력폼 아이콘 -->
<svg class="s1-step-svg" width="26" height="26" viewBox="0 0 24 24" fill="none" <svg class="s1-step-svg" width="26" height="26" viewBox="0 0 24 24" fill="none"
xmlns="http://www.w3.org/2000/svg"> xmlns="http://www.w3.org/2000/svg">
<rect x="3" y="5" width="18" height="14" rx="2" stroke="currentColor" stroke-width="1.8" /> <rect x="3" y="5" width="18" height="14" rx="2" stroke="currentColor" stroke-width="1.8" />
<line x1="7" y1="9" x2="17" y2="9" stroke="currentColor" stroke-width="1.8" <line x1="7" y1="9" x2="17" y2="9" stroke="currentColor" stroke-width="1.8"
stroke-linecap="round" /> stroke-linecap="round" />
<line x1="7" y1="12" x2="14" y2="12" stroke="currentColor" stroke-width="1.8" <line x1="7" y1="12" x2="14" y2="12" stroke="currentColor" stroke-width="1.8"
stroke-linecap="round" /> stroke-linecap="round" />
<line x1="7" y1="15" x2="11" y2="15" stroke="currentColor" stroke-width="1.8" <line x1="7" y1="15" x2="11" y2="15" stroke="currentColor" stroke-width="1.8"
stroke-linecap="round" /> stroke-linecap="round" />
</svg> </svg>
</div>
<span class="s1-step-num">1단계</span>
<span class="s1-step-name">앱 정보 입력</span>
</div> </div>
<span class="s1-step-num">1단계</span>
<span class="s1-step-name">앱 정보 입력</span>
</div>
<div class="s1-step-line"></div> <div class="s1-step-line"></div>
<!-- Step 2 Active: API 선택 (chain link icon) --> <!-- Step 2 Active: API 선택 (chain link icon) -->
<div class="s1-step s1-step--active"> <div class="s1-step s1-step--active">
<div class="s1-step-circle"> <div class="s1-step-circle">
<!-- 체인링크/API 아이콘 --> <!-- 체인링크/API 아이콘 -->
<svg class="s1-step-svg" width="26" height="26" viewBox="0 0 24 24" fill="none" <svg class="s1-step-svg" width="26" height="26" viewBox="0 0 24 24" fill="none"
xmlns="http://www.w3.org/2000/svg"> xmlns="http://www.w3.org/2000/svg">
<path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71" stroke="currentColor" <path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71" stroke="currentColor"
stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" /> stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" />
<path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71" stroke="currentColor" <path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71" stroke="currentColor"
stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" /> stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" />
</svg> </svg>
</div>
<span class="s1-step-num">2단계</span>
<span class="s1-step-name">API 선택</span>
</div> </div>
<span class="s1-step-num">2단계</span>
<span class="s1-step-name">API 선택</span>
</div>
<div class="s1-step-line"></div> <div class="s1-step-line"></div>
<!-- Step 3: 앱 생성 완료 (rocket icon) --> <!-- Step 3: 앱 생성 완료 (rocket icon) -->
<div class="s1-step"> <div class="s1-step">
<div class="s1-step-circle"> <div class="s1-step-circle">
<!-- 로켓 아이콘 --> <!-- 로켓 아이콘 -->
<svg class="s1-step-svg" width="26" height="26" viewBox="0 0 24 24" fill="none" <svg class="s1-step-svg" width="26" height="26" viewBox="0 0 24 24" fill="none"
xmlns="http://www.w3.org/2000/svg"> xmlns="http://www.w3.org/2000/svg">
<path <path
d="M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 0 0-2.91-.09z" d="M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 0 0-2.91-.09z"
stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" /> stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" />
<path <path
d="M12 15l-3-3a22 22 0 0 1 2-3.95A12.88 12.88 0 0 1 22 2c0 2.72-.78 7.5-6 11a22.35 22.35 0 0 1-4 2z" d="M12 15l-3-3a22 22 0 0 1 2-3.95A12.88 12.88 0 0 1 22 2c0 2.72-.78 7.5-6 11a22.35 22.35 0 0 1-4 2z"
stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" /> stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" />
<path d="M9 12H4s.55-3.03 2-4c1.62-1.08 5 0 5 0" stroke="currentColor" stroke-width="1.6" <path d="M9 12H4s.55-3.03 2-4c1.62-1.08 5 0 5 0" stroke="currentColor" stroke-width="1.6"
stroke-linecap="round" stroke-linejoin="round" /> stroke-linecap="round" stroke-linejoin="round" />
<path d="M12 15v5s3.03-.55 4-2c1.08-1.62 0-5 0-5" stroke="currentColor" stroke-width="1.6" <path d="M12 15v5s3.03-.55 4-2c1.08-1.62 0-5 0-5" stroke="currentColor" stroke-width="1.6"
stroke-linecap="round" stroke-linejoin="round" /> stroke-linecap="round" stroke-linejoin="round" />
</svg> </svg>
</div>
<span class="s1-step-num">3단계</span>
<span class="s1-step-name">앱 생성 완료</span>
</div> </div>
<span class="s1-step-num">3단계</span>
<span class="s1-step-name">앱 생성 완료</span>
</div> </div>
</div> </div>
</div>
<!-- API 선택 공용 모듈 --> <!-- API 선택 공용 모듈 -->
<th:block th:replace="~{fragment/api_selector :: apiSelector(${apiServices}, ${apiKeyRegistration.selectedApis}, '/myapikey/register/step2', '/myapikey/register/step2/save')}"/> <th:block
th:replace="~{fragment/api_selector :: apiSelector(${apiServices}, ${apiKeyRegistration.selectedApis}, '/myapikey/register/step2', '/myapikey/register/step2/save')}" />
<!-- Bottom Navigation Actions --> <!-- Bottom Navigation Actions -->
<div class="s2-actions"> <div class="s2-actions">
<button type="button" id="btnPrevStep" class="s2-btn-prev"> <button type="button" id="btnPrevStep" class="s2-btn-prev">
이전 이전
</button> </button>
<button type="submit" form="apiSelectorForm" class="s2-btn-save"> <button type="submit" form="apiSelectorForm" class="s2-btn-save">
다음 다음
</button> </button>
</div> </div>
</div><!-- /step2-wrap --> </div><!-- /step2-wrap -->
</div>
</div> </div>
</div> </div>
</div> </th:block>
</th:block>
<!-- 화면 전체 오버레이/플로팅은 body 직속(pagePopups)으로 렌더 → wrapper transform·overflow 영향 없이 뷰포트 기준 중앙 정렬 --> <!-- 화면 전체 오버레이/플로팅은 body 직속(pagePopups)으로 렌더 → wrapper transform·overflow 영향 없이 뷰포트 기준 중앙 정렬 -->
<section layout:fragment="pagePopups"> <section layout:fragment="pagePopups">
<th:block th:replace="~{fragment/api_selector :: apiSelectorPopups}"/> <th:block th:replace="~{fragment/api_selector :: apiSelectorPopups}" />
</section> </section>
</body> </body>
</html>
</html>
@@ -5,7 +5,7 @@
<body> <body>
<th:block layout:fragment="contentFragment"> <th:block layout:fragment="contentFragment">
<div class="service-main" style="padding-top: 40px;"> <div class="container service-main" style="padding-top: 70px;">
<!-- Sidebar --> <!-- Sidebar -->
<th:block th:replace="~{fragment/djbank/service_sidebar :: sidebar('users')}"></th:block> <th:block th:replace="~{fragment/djbank/service_sidebar :: sidebar('users')}"></th:block>
@@ -13,7 +13,7 @@
<section class="service-content"> <section class="service-content">
<section class="user-management-container" style="padding-top: 0;"> <section class="user-management-container">
<!-- App List Title Section --> <!-- App List Title Section -->
<div class="table-controls"> <div class="table-controls">
@@ -59,7 +59,7 @@
<div class="row-cell" data-label="계정상태" th:text="${user.userStatus.getDescription()}"> <div class="row-cell" data-label="계정상태" th:text="${user.userStatus.getDescription()}">
활성 활성
</div> </div>
<div class="row-cell row-actions"> <div class="row-cell row-actions" th:classappend="${user.roleCode != null and user.id != currentUserId} ? 'has-actions'">
<!-- Current User --> <!-- Current User -->
<span class="user-current-badge" th:if="${user.id == currentUserId}"> <span class="user-current-badge" th:if="${user.id == currentUserId}">
<i class="fas fa-user-check"></i> 현재 사용자 <i class="fas fa-user-check"></i> 현재 사용자