@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; } } }