Files
eapim-portal/src/main/resources/static/sass/components/_modals.scss
T
Rinjae 53c3b0ee7e
eapim-portal CI / build (push) Has been cancelled
eapim-portal Test / test (push) Has been cancelled
포탈 암호화 모듈 추가: forge-crypto.min.js 라이브러리 도입
2026-09-02 16:59:25 +09:00

337 lines
6.3 KiB
SCSS

@use '../abstracts/variables' as *;
@use '../abstracts/color-functions' as *;
@use '../abstracts/mixins' as *;
// -----------------------------------------------------------------------------
// Modal styles - KJBank Design (Figma node 985:1912)
// Close button positioned outside the modal (top-right)
// Gradient header with light blue to white
// -----------------------------------------------------------------------------
// Modal backdrop
.modal-backdrop {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: #385670;
z-index: $z-index-modal-backdrop;
opacity: 0.9;
visibility: hidden;
transition: $transition-base;
&.show {
opacity: 0.9;
visibility: visible;
}
}
// Modal wrapper
.modal {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100vh;
z-index: $z-index-modal;
display: flex;
align-items: center;
justify-content: center;
padding: $spacing-lg;
opacity: 0;
visibility: hidden;
transition: opacity 0.3s ease, visibility 0.3s ease;
pointer-events: none;
overflow-y: auto;
&.show {
opacity: 1;
visibility: visible;
pointer-events: auto;
.modal-dialog {
transform: scale(1);
}
}
// Responsive adjustments
@media (max-width: $breakpoint-sm) {
padding: $spacing-md;
}
}
// Modal container (includes close button outside)
.modal-container {
position: relative;
max-width: 820px;
width: 100%;
// Size variations
&.modal-sm {
max-width: 500px;
}
&.modal-lg {
max-width: 1000px;
}
&.modal-xl {
max-width: 1200px;
}
@media (max-width: $breakpoint-sm) {
max-width: 100%;
}
}
// Close button - positioned outside modal (top-right)
.modal-close {
position: absolute;
top: 0;
right: 0;
transform: translate(100%, -100%);
width: 50px;
height: 50px;
background: #0049b4;
border: none;
border-radius: 50%;
color: $white;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
z-index: $z-index-modal;
transition: $transition-base;
box-shadow: $shadow-lg;
svg {
width: 14px;
height: 14px;
}
i {
font-size: 16px;
}
@media (max-width: $breakpoint-sm) {
width: 40px;
height: 40px;
svg {
width: 12px;
height: 12px;
}
i {
font-size: 14px;
}
}
}
// Modal dialog
.modal-dialog {
position: relative;
background: $white;
padding: 0 $spacing-lg;
border-radius: $border-radius-lg;
box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3);
max-width: 700px;
width: calc(100% - 2 * $spacing-lg);
max-height: 85vh;
display: flex;
flex-direction: column;
transform: scale(0.95);
transition: transform 0.3s ease;
z-index: $z-index-modal;
margin-left: auto;
margin-right: auto;
&.modal-fullscreen {
max-width: 100%;
max-height: 100%;
height: 100%;
margin: 0;
border-radius: 0;
}
@media (max-width: $breakpoint-sm) {
padding: 0;
}
}
// Modal header with gradient background
.modal-header {
padding: 30px 50px 20px;
display: flex;
align-items: center;
justify-content: space-between;
border-bottom: 1px solid black;
border-top-left-radius: $border-radius-lg;
border-top-right-radius: $border-radius-lg;
.modal-title {
font-size: $font-size-xl;
font-weight: $font-weight-semibold;
color: #212529;
margin: 0;
}
@media (max-width: $breakpoint-sm) {
padding: 20px 24px 16px;
.modal-title {
font-size: 18px;
}
}
}
// Modal body
.modal-body {
padding: 30px 50px;
flex: 1;
overflow-y: auto;
color: #212529;
font-size: 20px;
line-height: $line-height-normal;
// 한글은 기본값(normal)이면 음절 단위로 끊겨 "막지는 못합니 / 다" 처럼 잘린다.
// keep-all 로 어절(띄어쓰기) 단위 줄바꿈을 강제한다. 대신 공백 없는 긴 문자열(URL·키값)이
// 넘칠 수 있어 overflow-wrap 으로 그때만 강제 분리한다.
word-break: keep-all;
overflow-wrap: break-word;
p {
margin: 0;
&+p {
margin-top: $spacing-md;
}
}
// Center text variant
&.text-center {
text-align: center;
}
@media (max-width: $breakpoint-sm) {
padding: 20px 24px;
font-size: 16px;
}
}
// Modal footer with buttons
.modal-footer {
padding: 20px 50px 40px;
display: flex;
gap: 10px;
justify-content: center;
border-top: none;
&.modal-footer-end {
justify-content: flex-end;
}
&.modal-footer-between {
justify-content: space-between;
}
@media (max-width: $breakpoint-sm) {
padding: 16px 24px 24px;
flex-direction: row;
gap: 10px;
.btn,
.btn-modal-cancel,
.btn-modal-confirm {
min-width: 0;
height: 46px;
font-size: 15px;
}
}
}
.pop_input_field {
width: 100%;
padding: 12px $spacing-md;
border: 1px solid $border-gray;
border-radius: $border-radius-md;
font-size: $font-size-sm;
font-family: $font-family-primary;
transition: all 0.3s ease;
box-sizing: border-box;
&:focus {
outline: none;
border-color: $primary-blue;
box-shadow: 0 0 0 3px rgba($primary-blue, 0.1);
}
&::placeholder {
color: $text-light;
}
// Error state
&.error {
border-color: $accent-orange;
&:focus {
border-color: $accent-orange;
box-shadow: 0 0 0 3px rgba($accent-orange, 0.1);
}
}
}
// Alert modal
.modal-alert {
.modal-container {
max-width: 500px;
}
.modal-body {
text-align: center;
padding: $spacing-xl 50px;
.alert-icon {
width: 64px;
height: 64px;
margin: 0 auto $spacing-lg;
@include flex-center;
font-size: $font-size-2xl;
border-radius: $border-radius-circle;
&.alert-success {
background: rgba($accent-green, 0.1);
color: $accent-green;
}
&.alert-warning {
background: rgba($accent-yellow, 0.1);
color: $accent-yellow;
}
&.alert-danger {
background: rgba($accent-orange, 0.1);
color: $accent-orange;
}
&.alert-info {
background: rgba($primary-blue, 0.1);
color: $primary-blue;
}
}
.alert-title {
font-size: $font-size-xl;
font-weight: $font-weight-semibold;
margin-bottom: $spacing-sm;
color: $text-dark;
}
.alert-message {
color: $text-gray;
font-size: $font-size-base;
}
}
}