import styled, { css, keyframes } from 'styled-components'; import SelectIcon from '../assets/img/icon/icon-select.png'; import CloseUrl from '../assets/img/icon/icon-close.png'; import SelectIcon2 from '../assets/img/icon/icon-select2.png'; import IconCalendar from '../assets/img/icon/icon-date.png'; import IconArrow from '../assets/img/icon/icon-arrow.png'; import { Link } from 'react-router-dom'; export const Container = styled.div` background: url(${props => props.$bgimg}) 50% 50%; background-size: cover; min-height: 100vh; height: 100%; padding: ${props => props.$padding || 0}; display: ${props => props.type}; ${props => { if (props.type) { return ` align-items:${props.$align || 'flex-start'}; justify-content:${props.$justify || 'flex-start'}; `; } }} `; export const HeaderContainer = styled.div` width: 280px; flex: 0 0 280px; background: #141414; min-height: 100vh; align-self: stretch; `; export const ContentContainer = styled.div` min-height: calc(100vh - 58px); width: 100%; padding: 55px 60px; background: #fff; `; export const FullContainer = styled.div` min-height: 100vh; width: 100%; max-width: calc(100% - 280px); `; export const TextInput = styled.input` border: 1px solid #e0e0e0; border-radius: 5px; width: ${props => props.width || '100%'}; padding: ${props => props.$padding || '5px 15px'}; line-height: 18px; font-size: ${props => props.fontSize || '14px'}; &::placeholder { color: #b8b8b8; } &:disabled { color: #cccccc; background: #f6f6f6; } &:focus { border: 1px solid #2c2c2c; } `; export const SelectInput = styled.select` border: 1px solid #e4e4e4; border-radius: 5px; position: relative; height: 40px; padding: 5px 40px 5px 15px; background: url('${SelectIcon}') no-repeat right 50% #fff; font-size: 14px; width: ${props => props.width || 'auto'}; &:disabled { color: ${props => props.color || '#cccccc'}; background: url('${SelectIcon}') no-repeat right 50% ${props => props.background_color || '#f6f6f6'}; } `; export const FormCenteredContainer = styled.div` display: flex; justify-content: center; align-items: center; width: calc(100vw - 400px); height: calc(100vh - 500px); /* 상단 영역 높이에 따라 조정 (헤더+필터 영역) */ padding: 20px; overflow: auto; min-height: 100px; `; export const Textarea = styled.textarea` &:focus { border: 1px solid #2c2c2c; } outline-color: #d9d9d9; padding: 10px; `; export const FormBox = styled.div` background: #fff; width: 486px; padding: 75px 45px; text-align: center; border-radius: 30px; color: #8d8d8d; `; export const AlertText = styled.div` font-size: 14px; padding-left: 10px; color: #fe565e; `; export const AccountTitle = styled.h2` color: #2c2c2c; text-align: center; margin-bottom: 45px; font-size: 32px; font-weight: 700; `; export const FormWrapper = styled.form` display: flex; flex-flow: ${props => props.$flow}; gap: 20px; text-align: left; `; export const Label = styled.div` font-size: 14px; font-weight: 600; ${props => props.require && css` &:after { content: '*'; color: #fe565e; margin-left: 5px; } `} `; export const InputLabel = styled.span` display: inline-block; min-width: fit-content; font-weight: 600; ${props => props.$require && css` &:after { content: '*'; color: #fe565e; margin-left: 5px; } `} `; export const InputItem = styled.div` display: flex; flex-flow: column; gap: 10px; `; export const Notice = styled.span` font-size: 12px; font-weight: 300; color: ${props => props.$color || '#999'} !important; margin-top: 10px; display: block; `; export const BtnWrapper = styled.div` width: ${props => props.width}; display: flex; position: relative; flex-flow: ${props => props.$flow}; justify-content: ${props => props.$justify}; gap: ${props => props.$gap}; margin-top: ${props => props.$marginTop}; margin-bottom: ${props => props.$marginBottom}; padding-top: ${props => props.$paddingTop}; `; /** * 버튼 그룹을 위한 스타일드 컴포넌트 */ export const ButtonGroupWrapper = styled.div` width: ${props => props.width}; display: flex; position: relative; flex-flow: ${props => props.$flow}; justify-content: ${props => props.$justify}; gap: ${props => props.$gap}; margin-top: ${props => props.$marginTop}; margin-bottom: ${props => props.$marginBottom}; padding-top: ${props => props.$paddingTop}; `; export const Title = styled.h2` font-size: 30px; font-weight: 700; margin-bottom: 30px; text-align: ${props => props.$align || 'left'}; `; // table export const TableInfo = styled.div` display: flex; justify-content: flex-end; margin-bottom: 14px; position: relative; ${props => props.$align && css` align-items: ${props.$align}; `} ${SelectInput} { width: 86px; height: 24px; padding: 0 20px 0 10px; color: #686868; font-size: 13px; font-weight: 400; background: url(${SelectIcon2}) right center no-repeat; } `; export const ListTitle = styled.h3` font-size: 24px; font-weight: 600; position: absolute; left: 0; `; export const ListCount = styled.div` position: absolute; display: flex; left: 0; top: 50%; transform: translate(0, -50%); color: #686868; gap: 20px; span { color: #333; font-weight: 500; } `; export const TableInfoContent = styled.div` position: absolute; display: flex; left: 0; top: 50%; transform: translate(0, -50%); color: #686868; gap: 20px; span { color: #333; font-weight: 500; } `; export const HeaderPaginationContainer = styled.div` position: absolute; display: flex; left: 0; top: 50%; transform: translate(0, -50%); `; export const ListOption = styled.div` display: flex; gap: 10px; button { min-width: max-content; padding: 0 10px; height: 24px; font-size: 13px; font-weight: 500; border-radius: 3px; } `; export const MailTitle = styled.td``; export const TableContent = styled.td``; export const TableStyle = styled.table` font-size: 13px; position: relative; &:before { content: ''; width: 100%; height: 1px; background: #000; display: block; top: 0; position: absolute; left: 0; } tr:last-child { border-bottom: 1px solid #e8eaec; } th, td { border-top: 1px solid #e8eaec; border-left: 1px solid #e8eaec; letter-spacing: 0; vertical-align: middle; padding: 5px 10px; line-height: 1.4; } th:last-child, td:last-child { border-right: 1px solid #e8eaec; } th { height: 40px; background: #f6f6f6; text-align: center; font-weight: bold; font-size: 13px; } td { text-align: center; height: 40px; word-break: break-all; font-weight: 400; } button { font-size: 13px; width: 52px; min-width: max-content; padding: 0 10px; height: 24px; } ${SelectInput} { height: 24px; width: calc(100% - 30px); padding: 0 30px 0 10px; } tr.table-line { th, td { border-top: 1px solid #999; } } input[type='checkbox'] ~ label { padding-left: 0; &:before { position: relative; transform: translate(0, 0); } } ${MailTitle} { text-align: left; } ${TableContent} { white-space: nowrap; text-overflow: ellipsis; } `; export const TableWrapper = styled.div` min-width: 680px; overflow: auto; &::-webkit-scrollbar { height: 10px; } &::-webkit-scrollbar-thumb { background: #666666; } &::-webkit-scrollbar-track { background: #d9d9d9; } ${TableStyle} { width: 100%; min-width: max-content; } `; export const PopupTableWrapper = styled.div` min-width: 680px; overflow: auto; &::-webkit-scrollbar { height: 10px; } &::-webkit-scrollbar-thumb { background: #666666; } &::-webkit-scrollbar-track { background: #d9d9d9; } `; export const State = styled.span` color: ${props => props.color || '#2c2c2c'}; `; // 지표 탭 export const IndexTableWrap = styled.div` width: 100%; min-width: 680px; overflow: auto; &::-webkit-scrollbar { height: 4px; } &::-webkit-scrollbar-thumb { background: #666666; } &::-webkit-scrollbar-track { background: #d9d9d9; } ${TableStyle} { width: 100%; min-width: max-content; th { &.cell-nru { background: #f0f0f0; border-left: 1px solid #aaa; border-right: 1px solid #aaa; } } td { &.blank { background: #f9f9f9; } &.cell-nru { background: #fafafa; border-left: 1px solid #aaa; border-right: 1px solid #aaa; } &.text-left { text-align: left; } } } /*20231205 유저지표 테이블 변경으로 인한 NRU css수정*/ tbody { .cell-nru-th td:nth-child(2) { background: #fafafa; border-left: 1px solid #aaa; border-right: 1px solid #aaa; } } `; //date-picker export const InputGroup = styled.div` display: flex; align-items: center; gap: 5px; `; const InputGroup2 = styled.div` display: flex; flex-flow: column; gap: 5px; `; export const DateGroup = styled.div` display: flex; flex-flow: column; gap: 5px; `; export const DatePickerWrapper = styled.div` display: flex; flex-wrap: wrap; gap: 5px 0; align-items: center; .datepicker { width: 160px; border: 1px solid #e0e0e0; padding: 5px 40px 5px 15px; border-radius: 5px; line-height: 18px; font-size: 14px; height: 35px; background: url(${IconCalendar}) center right no-repeat #fff; &::placeholder { color: #b8b8b8; } &:disabled { background: url(${IconCalendar}) center right no-repeat #f6f6f6; color: #cccccc; } } ${InputGroup} { display: flex; gap: 0; ${SelectInput} { margin-left: 5px; } } .react-datepicker-popper[data-placement^='bottom'] .react-datepicker__triangle::after { border-bottom-color: #fff; } .calendar { .react-datepicker__header { background: #fff; } .btn-prev, .btn-next { width: 26px; height: 26px; overflow: hidden; } .btn-prev { background: url(${IconArrow}) 0 50% no-repeat; } .btn-next { background: url(${IconArrow}) -26px 50% no-repeat; } .calendar-top { button { margin: 0 10px; } select { font-size: 16px; padding: 10px 0; } } .react-datepicker__day-names > div:first-child, .react-datepicker__week > div:first-child { color: #ff0000; } .react-datepicker__day-names > div:last-child, .react-datepicker__week > div:last-child { color: #256bfa; } } span { padding: 0 10px; } `; // modal export const ModalText = styled.div` font-size: 20px; line-height: 30px; text-align: ${props => props.$align}; font-weight: 600; padding: 10px 0 40px; white-space: pre-wrap; word-break: break-word; word-wrap: break-word; max-width: ${props => props.$maxWidth || '500px'}; `; export const ButtonClose = styled.button` width: 16px; height: 16px; background: url(${CloseUrl}) 50% 50% no-repeat; `; export const SearchBarAlert = styled.div` width: 100%; color: #d60000; margin-top: ${props => props.$marginTop}; padding: ${props => props.$padding}; text-align: ${props => props.$align}; `; const loadingAnimation = keyframes` 0% { background-position: -200px 0; } 100% { background-position: calc(200px + 100%) 0; } `; export const Skeleton = styled.div` background: linear-gradient(90deg, #e0e0e0 25%, #f8f8f8 50%, #e0e0e0 75% ); background-size: 400% 100%; animation: ${loadingAnimation} 1.5s infinite ease-in-out; border-radius: 4px; width: ${({ width }) => width || '100%'}; height: ${({ height }) => height || '20px'}; margin-bottom: ${({ spacing }) => spacing || '10px'}; `; // Skeleton 이미지 영역 // export const SkeletonImg = styled.div` // background: linear-gradient(90deg, // #e0e0e0 25%, // #f8f8f8 50%, // #e0e0e0 75% // ); // background-size: 400% 100%; // animation: ${loadingAnimation} 1.5s infinite ease-in-out; // border-radius: 50%; // margin-right: 15px; // position: relative; // width: ${({ width }) => width || '150px'}; // height: ${({ height }) => height || '150px'}; // margin-bottom: ${({ spacing }) => spacing || '10px'}; // `; const radialLoadingAnimation = keyframes` 0% { background-position: -200px 0%; } 100% { background-position: calc(200px + 100%) 0%; } `; export const SkeletonImg = styled.div` background: radial-gradient(circle, #f8f8f8, #e0e0e0, #f8f8f8); background-size: 200% 200%; // animation: ${radialLoadingAnimation} 2s infinite ease-in-out; border-radius: 50%; width: ${({ width }) => width || '100px'}; height: ${({ height }) => height || '100px'}; `; export const DetailMessage = styled(Link)` color: #61a2d0; text-decoration: underline; `; export const PopupMessage = styled(Link)` color: #61a2d0; text-decoration: underline; `; export const TableDetailRow = styled.tr` background-color: #f8f9fa; `; export const TableDetailContainer = styled.div` padding: 15px; background-color: #f8f9fa; `; export const TableDetailFlex = styled.div` display: flex; gap: 20px; flex-wrap: wrap; `; export const TableDetailColumn = styled.div` flex: 1 1 48%; min-width: 300px; `; export const DetailTableInfo = styled.table` width: 100%; border-collapse: collapse; margin-bottom: 15px; font-size: 12px; th, td { border: 1px solid #ddd; padding: 8px; text-align: left; } th { background-color: #f1f1f1; font-weight: bold; } tr:nth-child(even) { background-color: #f8f8f8; } `; export const TableActionButton = styled.button` cursor: pointer; background: #4a89dc; color: white; border: none; border-radius: 3px; padding: 2px 5px; font-size: 13px; min-width: max-content; width: 80px; height: 24px; &:hover { background: #3a70bc; } `; export const SearchbarStyle = styled.div` width: 100%; display: flex; flex-wrap: wrap; font-size: 14px; padding: 20px; border-radius: 8px; border: 1px solid #ddd; margin: 0 0 40px; flex-flow: ${props => props.direction}; gap: ${props => (props.direction === 'column' ? '20px' : '20px 0')}; `; export const SearchItem = styled.div` display: flex; align-items: center; gap: 20px; margin-right: 50px; ${TextInput}, ${SelectInput} { height: 35px; } ${TextInput} { padding: 0 10px; max-width: 400px; } `; export const DownloadContainer = styled.div` display: flex; align-items: center; gap: 10px; `; export const SearchRow = styled.div` display: flex; flex-wrap: wrap; gap: 20px 0; ${props => props.direction === 'column' && css` &:last-child { border-top: 1px solid #e0e0e0; padding-top: 15px; margin-top: 15px; } `} `; export const TabScroll = styled.div` width: 100%; overflow: auto; `; export const TabItem = styled(Link)` display: inline-flex; width: 150px; height: 30px; justify-content: center; align-items: center; background: #f9f9f9; border-left: 1px solid #d9d9d9; &:hover { background: #888; color: #fff; } ${props => props.$state === 'active' && ` background: #888; color: #fff;`} `; export const TabWrapper = styled.ul` display: flex; li:first-child { ${TabItem} { border-left: 0; } } `; export const CircularProgressWrapper = styled.div` display: flex; align-items: center; justify-content: center; `; export const TotalRow = styled.tr` background-color: #f8f8f8; font-weight: bold; td { padding: 10px; border-bottom: 1px solid #ddd; } `; export const ImagePreview = styled.img` width: 100%; height: 180px; object-fit: contain; border-radius: 4px 4px 0 0; background-color: #f6f6f6; `;