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

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);
color: #fff;
}
.btn-action-primary.md {
font-size: 14px;
padding: 11px 45px;
}
@media (max-width: 768px) {
.btn-action-primary {
font-size: 15px;
@@ -15558,6 +15562,19 @@ input[type=checkbox]:checked + .custom-checkbox {
background: none;
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,
.step2-wrap .s1-progress-card,
.step3-wrap .s1-progress-card {
@@ -15648,6 +15665,20 @@ input[type=checkbox]:checked + .custom-checkbox {
flex-shrink: 0;
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) {
.step1-wrap .s1-step-circle,
.step2-wrap .s1-step-circle,
@@ -15674,16 +15705,16 @@ input[type=checkbox]:checked + .custom-checkbox {
.step1-wrap .s1-step-svg,
.step2-wrap .s1-step-svg,
.step3-wrap .s1-step-svg {
width: 20px;
height: 20px;
width: 24px !important;
height: 24px !important;
}
}
@media (max-width: 480px) {
.step1-wrap .s1-step-svg,
.step2-wrap .s1-step-svg,
.step3-wrap .s1-step-svg {
width: 16px;
height: 16px;
width: 18px !important;
height: 18px !important;
}
}
.step1-wrap .s1-step-num,
@@ -16149,6 +16180,7 @@ input[type=checkbox]:checked + .custom-checkbox {
.step2-wrap .s2-category-carousel-container {
gap: 6px;
margin-bottom: 16px;
margin-top: 40px;
}
}
.step2-wrap .s2-category-list-wrapper {
@@ -16365,7 +16397,7 @@ input[type=checkbox]:checked + .custom-checkbox {
transform: translateY(-5px);
box-shadow: 0px 8px 12px rgba(194, 194, 194, 0.4);
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 {
background-color: #d8f0ff;
@@ -18246,10 +18278,19 @@ input[type=checkbox]:checked + .custom-checkbox {
margin: 40px auto 100px;
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 {
flex: 1;
min-width: 0;
width: 100%;
}
.app-management-header {
@@ -18258,6 +18299,14 @@ input[type=checkbox]:checked + .custom-checkbox {
align-items: center;
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 {
font-size: 24px;
font-weight: 700;
@@ -18306,6 +18355,15 @@ input[type=checkbox]:checked + .custom-checkbox {
color: inherit;
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 {
transform: translateY(-2px);
box-shadow: 0px 6px 15px rgba(192, 192, 192, 0.35);
@@ -18322,6 +18380,13 @@ input[type=checkbox]:checked + .custom-checkbox {
align-items: center;
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 svg {
width: 46px;
@@ -18329,6 +18394,13 @@ input[type=checkbox]:checked + .custom-checkbox {
object-fit: cover;
border-radius: 4px;
}
@media (max-width: 768px) {
.app-card-icon-box img,
.app-card-icon-box svg {
width: 36px;
height: 36px;
}
}
.app-card-info {
flex: 1;
@@ -18337,6 +18409,11 @@ input[type=checkbox]:checked + .custom-checkbox {
gap: 10px;
min-width: 0;
}
@media (max-width: 768px) {
.app-card-info {
gap: 6px;
}
}
.app-card-header {
display: flex;
@@ -18353,6 +18430,11 @@ input[type=checkbox]:checked + .custom-checkbox {
overflow: hidden;
text-overflow: ellipsis;
}
@media (max-width: 768px) {
.app-card-title {
font-size: 14px;
}
}
.app-card-badge-container {
display: flex;
@@ -18376,6 +18458,10 @@ input[type=checkbox]:checked + .custom-checkbox {
background: #fdf4d4;
color: #ef9546;
}
.app-card-badge.badge-requested {
background: #ffebeb;
color: #f43f5e;
}
.app-card-badge.badge-approved {
background: #1b4ab7;
color: #ffffff;
@@ -18395,6 +18481,11 @@ input[type=checkbox]:checked + .custom-checkbox {
flex: 1;
min-width: 0;
}
@media (max-width: 768px) {
.app-card-desc {
font-size: 12px;
}
}
.app-card-footer-row {
display: flex;
@@ -18403,6 +18494,13 @@ input[type=checkbox]:checked + .custom-checkbox {
width: 100%;
min-width: 0;
}
@media (max-width: 768px) {
.app-card-footer-row {
flex-direction: column;
align-items: flex-start;
gap: 4px;
}
}
.app-card-expected-date {
font-size: 14px;
@@ -18411,6 +18509,12 @@ input[type=checkbox]:checked + .custom-checkbox {
flex-shrink: 0;
white-space: nowrap;
}
@media (max-width: 768px) {
.app-card-expected-date {
margin-left: 0;
font-size: 11px;
}
}
.app-card-expected-date {
font-size: 12px;
@@ -21534,7 +21638,7 @@ input[type=checkbox]:checked + .custom-checkbox {
justify-content: center;
cursor: pointer;
font-weight: 700;
height: 39px;
height: 55px;
width: 120px;
border-radius: 10px;
font-size: 14px;
@@ -21594,11 +21698,9 @@ input[type=checkbox]:checked + .custom-checkbox {
}
}
.user-management-container {
max-width: 1280px;
margin: 0 auto;
padding: 48px 0;
margin-bottom: 40px;
min-height: 750px;
min-height: 650px;
}
@media (max-width: 768px) {
.user-management-container {
@@ -21674,14 +21776,6 @@ input[type=checkbox]:checked + .custom-checkbox {
padding: 0 29px;
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 .row-cell {
padding: 0;
@@ -22016,150 +22110,111 @@ input[type=checkbox]:checked + .custom-checkbox {
display: contents;
}
.user-management-container .table-controls .total-count {
order: 1;
text-align: left;
font-size: 16px;
color: #000000;
padding-bottom: 6px;
border-bottom: 1.5px solid #212529;
order: 1 !important;
display: flex !important;
align-items: center !important;
width: 100% !important;
text-align: left !important;
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 {
color: #0049b4;
font-weight: 700;
font-size: 16px;
color: #0049b4 !important;
font-weight: 700 !important;
font-size: 16px !important;
}
.user-management-container .table-controls .search-box {
order: 4;
width: 100%;
order: 2 !important;
width: 100% !important;
margin-top: 10px !important;
}
.user-management-container .table-controls .search-box .btn {
display: flex;
align-items: center;
justify-content: center;
width: 100%;
height: 44px;
display: flex !important;
align-items: center !important;
justify-content: center !important;
width: 100% !important;
height: 44px !important;
margin-top: 0 !important;
}
.user-management-container .list-table {
order: 2;
.user-management-container .board-table--user-list {
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;
border-radius: 12px;
overflow: visible;
margin-bottom: 10px;
}
.user-management-container .list-table .list-table-header {
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) {
.user-management-container .board-table--user-list .board-table-row .row-cell {
display: flex !important;
width: 40px !important;
min-width: 40px;
flex: none;
justify-content: flex-start !important;
width: 100% !important;
font-size: 14px !important;
color: #212529 !important;
padding: 0 !important;
white-space: normal !important;
}
.user-management-container .list-table .list-table-body {
display: flex;
flex-direction: column;
.user-management-container .board-table--user-list .board-table-row .row-cell::before {
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;
}
.user-management-container .list-table .list-table-row {
display: flex;
flex-direction: row;
align-items: center;
height: 40px;
padding: 0 8px;
gap: 0;
position: relative;
.user-management-container .board-table--user-list .board-table-row .row-cell[data-label=NO] {
display: none !important;
}
.user-management-container .list-table .list-table-row:nth-child(even) {
background-color: #EDF5FD;
.user-management-container .board-table--user-list .board-table-row .row-cell[data-label=성명] {
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) {
background-color: #FFFFFF;
.user-management-container .board-table--user-list .board-table-row .row-cell[data-label=성명]::before {
display: none !important;
}
.user-management-container .list-table .list-table-row:hover {
background-color: rgba(0, 73, 180, 0.08);
}
.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;
.user-management-container .board-table--user-list .board-table-row .row-cell[data-label=성명] a {
color: #0f172a !important;
font-weight: 600 !important;
text-decoration: none;
font-size: 13px;
}
.user-management-container .list-table .list-table-row .row-cell:nth-child(3) {
flex: 1 !important;
min-width: 80px;
justify-content: flex-start;
.user-management-container .board-table--user-list .board-table-row .row-cell[data-label=성명] a:hover {
color: #2a69de !important;
}
.user-management-container .list-table .list-table-row .row-cell:nth-child(4) {
width: 39px !important;
min-width: 39px;
flex: none;
.user-management-container .board-table--user-list .board-table-row .row-cell.row-actions {
margin-top: 0;
padding-top: 0 !important;
border-top: none;
justify-content: flex-end !important;
}
.user-management-container .list-table .list-table-row .row-cell:nth-child(5) {
width: 61px !important;
min-width: 61px;
flex: none;
.user-management-container .board-table--user-list .board-table-row .row-cell.row-actions.has-actions {
margin-top: 8px;
padding-top: 12px !important;
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 {
display: flex !important;
width: 40px !important;
min-width: 40px;
flex: none;
justify-content: center;
overflow: visible;
.user-management-container .board-table--user-list .board-table-row .row-cell.row-actions::before {
display: none !important;
}
.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;
}
.user-management-container .user-empty-state {
@@ -22175,7 +22230,7 @@ input[type=checkbox]:checked + .custom-checkbox {
font-size: 14px;
}
.user-management-container .pagination {
order: 3;
order: 4 !important;
gap: 13px;
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;
}
&.md {
font-size: 14px;
padding: 11px 45px;
}
@include respond-to('sm') {
font-size: 15px;
@@ -255,11 +255,19 @@
max-width: 1200px;
margin: 40px auto 100px;
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 {
flex: 1;
min-width: 0;
width: 100%;
}
.app-management-header {
@@ -268,6 +276,14 @@
align-items: center;
margin-bottom: 24px;
@media (max-width: $breakpoint-sm) {
margin-bottom: 16px;
h2 {
font-size: 20px !important;
}
}
h2 {
font-size: 24px;
font-weight: 700;
@@ -318,6 +334,14 @@
color: inherit;
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 {
transform: translateY(-2px);
box-shadow: 0px 6px 15px rgba(192, 192, 192, 0.35);
@@ -335,12 +359,23 @@
align-items: center;
flex-shrink: 0;
@media (max-width: $breakpoint-sm) {
width: 56px;
height: 56px;
border-radius: 8px;
}
img,
svg {
width: 46px;
height: 46px;
object-fit: cover;
border-radius: 4px;
@media (max-width: $breakpoint-sm) {
width: 36px;
height: 36px;
}
}
}
@@ -350,6 +385,10 @@
flex-direction: column;
gap: 10px;
min-width: 0;
@media (max-width: $breakpoint-sm) {
gap: 6px;
}
}
.app-card-header {
@@ -366,6 +405,10 @@
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
@media (max-width: $breakpoint-sm) {
font-size: 14px;
}
}
.app-card-badge-container {
@@ -391,6 +434,11 @@
color: #ef9546;
}
&.badge-requested {
background: #ffebeb;
color: #f43f5e;
}
&.badge-approved {
background: #1b4ab7;
color: #ffffff;
@@ -411,6 +459,10 @@
text-overflow: ellipsis;
flex: 1;
min-width: 0;
@media (max-width: $breakpoint-sm) {
font-size: 12px;
}
}
.app-card-footer-row {
@@ -419,6 +471,12 @@
align-items: center;
width: 100%;
min-width: 0;
@media (max-width: $breakpoint-sm) {
flex-direction: column;
align-items: flex-start;
gap: 4px;
}
}
.app-card-expected-date {
@@ -427,7 +485,13 @@
margin-left: 16px;
flex-shrink: 0;
white-space: nowrap;
@media (max-width: $breakpoint-sm) {
margin-left: 0;
font-size: 11px;
}
}
.app-card-expected-date {
font-size: 12px;
color: #64748b;
@@ -2938,6 +2938,10 @@ input[type="checkbox"]:checked+.custom-checkbox {
border: none;
background: none;
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;
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) {
width: 44px;
height: 44px;
@@ -3032,13 +3046,13 @@ input[type="checkbox"]:checked+.custom-checkbox {
flex-shrink: 0;
@media (max-width: 768px) {
width: 20px;
height: 20px;
width: 24px !important;
height: 24px !important;
}
@media (max-width: 480px) {
width: 16px;
height: 16px;
width: 18px !important;
height: 18px !important;
}
}
@@ -3467,6 +3481,7 @@ input[type="checkbox"]:checked+.custom-checkbox {
@media (max-width: 768px) {
gap: 6px;
margin-bottom: 16px;
margin-top: 40px;
}
}
@@ -3707,7 +3722,7 @@ input[type="checkbox"]:checked+.custom-checkbox {
transform: translateY(-5px);
box-shadow: 0px 8px 12px rgba(194, 194, 194, 0.4);
background: linear-gradient(to bottom, #50caff, #2088ff);
border-color: transparent;
border: none;
.s2-api-card-badge {
background-color: #d8f0ff;
@@ -9,11 +9,9 @@
// User Management Container (List Page)
.user-management-container {
max-width: 1280px;
margin: 0 auto;
padding: $spacing-3xl 0;
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) {
padding: $spacing-lg $spacing-md;
@@ -109,12 +107,6 @@
grid-template-columns: 24px 112px 1fr 100px 100px 287px;
padding: 0 29px; // Match standard board-table padding
gap: 10px;
@media (max-width: $breakpoint-sm) {
display: flex;
padding: 15px;
min-width: auto;
}
}
.header-cell,
@@ -505,201 +497,137 @@
display: contents;
.total-count {
order: 1;
text-align: left;
font-size: 16px;
color: $black;
padding-bottom: 6px;
border-bottom: 1.5px solid #212529;
order: 1 !important;
display: flex !important;
align-items: center !important;
width: 100% !important;
text-align: left !important;
font-size: 16px !important;
color: $black !important;
padding-bottom: 6px !important;
border-bottom: 1.5px solid #212529 !important;
margin-bottom: 0 !important;
strong {
color: #0049b4;
font-weight: $font-weight-bold;
font-size: 16px;
color: #0049b4 !important;
font-weight: $font-weight-bold !important;
font-size: 16px !important;
}
}
// 이용자 추가 버튼 - 테이블 아래로 이동
// 이용자 추가 버튼 (검색창 위치와 동일하게 총건수 바로 아래에 노출하도록 순서 조정)
.search-box {
order: 4;
width: 100%;
order: 2 !important;
width: 100% !important;
margin-top: 10px !important;
.btn {
display: flex;
align-items: center;
justify-content: center;
width: 100%;
height: 44px;
}
}
}
// List Table - 모바일 디자인 (코너 라운드 적용)
.list-table {
order: 2;
background: $white;
border-radius: $border-radius-lg;
overflow: visible; // dropdown이 보이도록 변경
// Header - 모바일에서 표시 (Figma: 40px 높이, #3BA4ED 배경)
.list-table-header {
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;
align-items: center !important;
justify-content: center !important;
width: 100% !important;
height: 44px !important;
margin-top: 0 !important;
}
}
}
// Body
.list-table-body {
display: flex;
flex-direction: column;
// List Table - 모바일 디자인 (Q&A 세로 카드형 레이아웃 적용)
.board-table--user-list {
order: 3 !important;
background: transparent;
border-radius: 0;
overflow: visible;
.board-table-header {
display: none !important; // 헤더는 모바일에서 숨김
}
// Row - 모바일 디자인 (Figma: 40px 높이)
.list-table-row {
display: flex;
flex-direction: row;
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);
}
.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: $white;
margin-bottom: 10px;
.row-cell {
font-size: 13px;
font-weight: $font-weight-regular;
color: #212529;
padding: 0 4px;
justify-content: center;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
display: flex !important;
justify-content: flex-start !important;
width: 100% !important;
font-size: 14px !important;
color: #212529 !important;
padding: 0 !important;
white-space: normal !important;
// data-label 숨김
&::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 컬럼 - 모바일에서 숨김
&:nth-child(1) {
display: none;
// NO 컬럼 - 모바일 숨김
&[data-label="NO"] {
display: none !important;
}
// 성명 컬럼 - 60px
&:nth-child(2) {
width: 60px !important;
min-width: 60px;
flex: none;
// 성명 컬럼 - 제목처럼 크게 노출 (라벨 제거)
&[data-label="성명"] {
font-size: 16px !important;
font-weight: 600 !important;
color: #0f172a !important;
margin-bottom: 4px;
&::before {
display: none !important;
}
a {
color: #212529;
color: #0f172a !important;
font-weight: 600 !important;
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 {
display: flex !important;
width: 40px !important;
min-width: 40px;
flex: none;
justify-content: center;
overflow: visible;
}
margin-top: 0;
padding-top: 0 !important;
border-top: none;
justify-content: flex-end !important;
&.has-actions {
margin-top: 8px;
padding-top: 12px !important;
border-top: 1px dashed #e2e8f0;
}
// row-actions 클래스 표시
.row-actions {
&::before {
display: none !important;
}
.actions-desktop {
display: none !important;
}
.actions-mobile {
display: flex !important;
}
}
}
}
}
// Empty State - 모바일 조정
.user-empty-state {
@@ -718,9 +646,9 @@
}
}
// Pagination - 모바일 디자인 (테이블 다음, 버튼 이전)
// Pagination - 모바일 디자인 (테이블 다음)
.pagination {
order: 3;
order: 4 !important;
gap: 13px;
padding: $spacing-lg 0;
@@ -11,208 +11,8 @@
</div>
</section>
<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="service-main app-management-layout">
<div class="service-main container" style="padding-top: 70px;">
<!-- Sidebar -->
<th:block th:replace="~{fragment/djbank/service_sidebar :: sidebar('apiKey')}"></th:block>
@@ -223,7 +23,7 @@
<div class="app-management-header">
<h2>인증 키 관리</h2>
<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>
</div>
@@ -255,7 +55,8 @@
<!-- App Name -->
<h3 class="app-card-title" th:text="${request.clientName}">앱 이름</h3>
<!-- 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 : '승인대기'}">
승인대기
</span>
@@ -266,11 +67,16 @@
th:text="${request.appDescription != null ? request.appDescription : '설명 없음'}">
앱 설명이 여기에 표시됩니다.
</p>
<!-- Expected date or placeholder to keep structure aligned -->
<span class="app-card-expected-date"
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})|">
예상 완료일 : 05월 30일 (토)
</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>
</a>
@@ -300,7 +106,7 @@
<h3 class="app-card-title" th:text="${apikey.clientname}">앱 이름</h3>
<!-- Status 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' ? '비활성화' : '승인대기'}">
승인
</span>
@@ -13,7 +13,7 @@
<th:block layout:fragment="contentFragment">
<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 -->
<th:block th:replace="~{fragment/djbank/service_sidebar :: sidebar('apiKey')}"></th:block>
@@ -29,10 +29,19 @@
<!-- Progress Steps Card -->
<div class="s1-progress-card">
<div class="s1-steps">
<!-- Step 1 Active: 앱 정보 입력 -->
<!-- Step 1 Active: 앱 정보 입력 (document icon) -->
<div class="s1-step s1-step--active">
<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>
<span class="s1-step-num">1단계</span>
<span class="s1-step-name">앱 정보 입력</span>
@@ -40,10 +49,16 @@
<div class="s1-step-line"></div>
<!-- Step 2: API 선택 -->
<!-- Step 2: API 선택 (chain link icon) -->
<div class="s1-step">
<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>
<span class="s1-step-num">2단계</span>
<span class="s1-step-name">API 선택</span>
@@ -51,10 +66,22 @@
<div class="s1-step-line"></div>
<!-- Step 3: 앱 생성 완료 -->
<!-- Step 3: 앱 생성 완료 (rocket icon) -->
<div class="s1-step">
<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>
<span class="s1-step-num">3단계</span>
<span class="s1-step-name">앱 생성 완료</span>
@@ -1,7 +1,7 @@
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"
xmlns:sec="http://www.thymeleaf.org/extras/spring-security"
xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout" layout:decorate="~{layout/djbank_title_layout}">
xmlns:sec="http://www.thymeleaf.org/extras/spring-security" xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
layout:decorate="~{layout/djbank_title_layout}">
<body>
<section layout:fragment="title">
@@ -12,7 +12,7 @@
</section>
<th:block layout:fragment="contentFragment">
<div class="signup-guide-v2 figma-register-wrapper">
<div class="service-main app-management-layout">
<div class="service-main container">
<!-- Left Sidebar (Service Sidebar) -->
<th:block th:replace="~{fragment/djbank/service_sidebar :: sidebar('apiKey')}"></th:block>
@@ -92,7 +92,8 @@
</div>
<!-- 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 -->
<div class="s2-actions">
@@ -115,4 +116,5 @@
<th:block th:replace="~{fragment/api_selector :: apiSelectorPopups}" />
</section>
</body>
</html>
@@ -5,7 +5,7 @@
<body>
<th:block layout:fragment="contentFragment">
<div class="service-main" style="padding-top: 40px;">
<div class="container service-main" style="padding-top: 70px;">
<!-- Sidebar -->
<th:block th:replace="~{fragment/djbank/service_sidebar :: sidebar('users')}"></th:block>
@@ -13,7 +13,7 @@
<section class="service-content">
<section class="user-management-container" style="padding-top: 0;">
<section class="user-management-container">
<!-- App List Title Section -->
<div class="table-controls">
@@ -59,7 +59,7 @@
<div class="row-cell" data-label="계정상태" th:text="${user.userStatus.getDescription()}">
활성
</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 -->
<span class="user-current-badge" th:if="${user.id == currentUserId}">
<i class="fas fa-user-check"></i> 현재 사용자