/* --- Global Variables --- */ :root { --primary-color: #2c3e50; /* 진한 남색 */ --secondary-color: #34495e; /* 조금 더 연한 남색 */ --accent-color: #e67e22; /* 주황색 포인트 */ --white-color: #ffffff; --light-gray: #f8f9fa; --text-color: #343a40; } /* --- 게시판 목록 (Board List) --- */ .bo-list-container { padding: 20px 0; } .bo-list-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 20px; padding-bottom: 15px; border-bottom: 2px solid var(--primary-color); } .bo-list-total { font-size: 16px; color: var(--secondary-color); } .bo-list-buttons a, .bo-list-buttons button { display: inline-flex; align-items: center; justify-content: center; padding: 8px 18px; border-radius: 6px; text-decoration: none; font-weight: 700; transition: all 0.3s ease; margin-left: 8px; cursor: pointer; } .bo-list-buttons .btn-write { background-color: var(--primary-color); color: var(--white-color); border: 1px solid var(--primary-color); } .bo-list-buttons .btn-write:hover { background-color: var(--secondary-color); } .bo-list-buttons .btn-admin { background-color: #fff; color: var(--accent-color); border: 1px solid var(--accent-color); } .bo-list-buttons .btn-admin:hover { background-color: var(--accent-color); color: var(--white-color); } .list-chk-all { margin-bottom: 10px; padding: 10px; background-color: var(--light-gray); border-radius: 6px; } .bo-list-item { display: flex; align-items: center; padding: 20px 15px; border-bottom: 1px solid #e9ecef; transition: background-color 0.2s; } .bo-list-item:hover { background-color: var(--light-gray); } .bo-list-item.is-notice { background-color: #fffaf5; border-left: 3px solid var(--accent-color); } .item-chk { flex-shrink: 0; margin-right: 15px; } .item-main { flex-grow: 1; min-width: 0; } .item-subject { margin-bottom: 8px; white-space: nowrap; } .item-notice-badge { display: inline-block; background-color: var(--accent-color); color: var(--white-color); font-size: 12px; font-weight: 700; padding: 2px 8px; border-radius: 4px; margin-right: 8px; vertical-align: middle; } .item-category { display: inline-block; background-color: #e9ecef; color: var(--secondary-color); font-size: 12px; font-weight: 700; padding: 2px 8px; border-radius: 4px; margin-right: 8px; vertical-align: middle; text-decoration: none; } .item-title { font-size: 18px; font-weight: 700; color: var(--primary-color); text-decoration: none; vertical-align: middle; } .item-title:hover { text-decoration: underline; } .item-comment-count { font-size: 14px; font-weight: 700; color: var(--accent-color); margin-left: 6px; vertical-align: middle; } .item-new-icon { display: inline-block; background: #e67e22; color: white; font-size: 10px; width: 16px; height: 16px; line-height: 16px; text-align: center; border-radius: 50%; margin-left: 6px; font-weight: bold; vertical-align: middle; } .item-meta { font-size: 14px; color: #868e96; } .item-meta span { margin-right: 12px; } .item-meta span:not(:last-child)::after { content: '|'; margin-left: 12px; color: #dee2e6; } .empty-list { padding: 80px 20px; text-align: center; color: #868e96; font-size: 18px; border-bottom: 1px solid #e9ecef; } .bo-list-footer { margin-top: 20px; text-align: right; } .bo-list-footer .btn-admin { padding: 6px 12px; font-size: 14px; background-color: #6c757d; color: white; border: 1px solid #6c757d; border-radius: 4px; cursor: pointer; } .bo-list-footer .btn-admin:hover { background-color: #5a6268; } .bo-pagination { display: flex; justify-content: center; margin-top: 40px; } .pg_wrap { display: flex; gap: 5px; } .pg_page, .pg_current, .pg_start, .pg_prev, .pg_next, .pg_end { display: inline-block; min-width: 32px; height: 32px; line-height: 30px; padding: 0 5px; text-align: center; border: 1px solid #dee2e6; border-radius: 4px; text-decoration: none; color: var(--secondary-color); background-color: #fff; } .pg_page:hover, .pg_start:hover, .pg_prev:hover, .pg_next:hover, .pg_end:hover { background-color: #f8f9fa; } .pg_current { background-color: var(--primary-color); color: #fff; border-color: var(--primary-color); font-weight: 700; } .bo-search-box { margin-top: 40px; padding: 20px; background-color: var(--light-gray); border-radius: 8px; text-align: center; } .bo-search-box form { display: flex; justify-content: center; align-items: center; gap: 10px; } .bo-search-box select, .bo-search-box .sch-input { padding: 10px; border: 1px solid #ced4da; border-radius: 4px; font-size: 16px; } .bo-search-box .sch-input { width: 300px; } .bo-search-box .sch-btn { padding: 10px 20px; background-color: var(--secondary-color); color: #fff; border: none; border-radius: 4px; font-size: 16px; font-weight: 700; cursor: pointer; } .bo-search-box .sch-btn:hover { background-color: var(--primary-color); } /* 💡 [수정] 체크박스 스타일 수정 (원본 숨김, 커스텀 표시) */ .selec_chk { position: absolute; top: 0; left: 0; width: 0; height: 0; opacity: 0; outline: 0; z-index: -1; overflow: hidden; } .chk_box { position: relative; display: inline-block; } .chk_box input[type="checkbox"] + label { position: relative; padding-left: 25px; /* 체크박스 공간 확보 */ color: #676e70; cursor: pointer; line-height: 20px; display: inline-block; } .chk_box input[type="checkbox"] + label:hover { color: #2172f8; } .chk_box input[type="checkbox"] + label span { position: absolute; top: 0; left: 0; width: 18px; height: 18px; display: block; background: #fff; border: 1px solid #d0d4df; border-radius: 3px; } .chk_box input[type="checkbox"]:checked + label { color: #000; } .chk_box input[type="checkbox"]:checked + label span { background: url('data:image/svg+xml;utf8,') no-repeat center center; background-color: var(--primary-color); border-color: var(--primary-color); } /* --- 📌 게시판 쓰기 (Board Write) --- */ #bo_w { padding: 20px 0; max-width: 900px; margin: 0 auto; } #bo_w .write_div { margin-bottom: 30px; } #bo_w .frm_label { display: block; font-size: 18px; font-weight: 700; color: var(--secondary-color); margin-bottom: 12px; } #bo_w .frm_input { width: 100%; padding: 12px 15px; font-size: 16px; border: 1px solid #ced4da; border-radius: 6px; background-color: #fff; color: var(--text-color); transition: border-color 0.2s, box-shadow 0.2s; } #bo_w .frm_input:focus { border-color: var(--primary-color); box-shadow: 0 0 0 3px rgba(44, 62, 80, 0.1); outline: none; } #bo_w .cke_chrome { border-radius: 6px !important; border: 1px solid #ced4da !important; overflow: hidden; } .file_upload_grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); gap: 20px; } .file_preview_wrapper { position: relative; width: 100%; padding-top: 56.25%; /* 16:9 비율 */ border: 2px dashed #ced4da; border-radius: 8px; background-color: var(--light-gray); transition: border-color 0.3s; } .file_preview_wrapper:hover { border-color: var(--primary-color); } .file_preview { position: absolute; top: 0; left: 0; width: 100%; height: 100%; display: flex; justify-content: center; align-items: center; cursor: pointer; background-size: cover; background-position: center; background-repeat: no-repeat; } .file_preview.is-video { background-image: url('data:image/svg+xml;utf8,'); background-size: 48px; background-color: #e9ecef; } .preview_text { color: #868e96; font-weight: 500; padding: 0 10px; text-align: center; word-break: break-all; } .preview_info { position: absolute; bottom: 10px; left: 10px; right: 10px; background-color: rgba(0, 0, 0, 0.6); color: white; padding: 8px 12px; border-radius: 6px; font-size: 14px; display: flex; justify-content: space-between; align-items: center; } .current_file_name { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 70%; } .preview_info .file_del label { color: #ffc107; text-decoration: none; } .preview_info .file_del label:hover { text-decoration: underline; } #bo_w .btn_confirm { text-align: right; margin-top: 40px; padding-top: 30px; border-top: 1px solid #e9ecef; } #bo_w .btn_confirm .btn { display: inline-flex; align-items: center; justify-content: center; min-width: 120px; padding: 12px 28px; border-radius: 6px; text-decoration: none; font-weight: 700; font-size: 16px; transition: all 0.3s ease; margin-left: 8px; border: 1px solid; cursor: pointer; line-height: 1; } #bo_w .btn_confirm .btn_cancel { background-color: #6c757d; color: var(--white-color); border-color: #6c757d; } #bo_w .btn_confirm .btn_cancel:hover { background-color: #5a6268; } #bo_w .btn_confirm .btn_submit { background-color: var(--primary-color); color: var(--white-color); border-color: var(--primary-color); } #bo_w .btn_confirm .btn_submit:hover { background-color: var(--secondary-color); } /* 💡 [최종 수정] CSS 충돌을 피하는 안정적인 커스텀 라디오 버튼 스타일 */ .option_group { display: flex; gap: 20px; align-items: center; } .option_group label { display: inline-flex; /* 내부 요소 정렬을 위해 inline-flex 사용 */ align-items: center; gap: 8px; font-size: 16px; cursor: pointer; position: relative; /* 내부 input 위치의 기준점 */ } /* 1. 실제 라디오 버튼은 시각적으로 완전히 숨깁니다. (스크린 리더는 인식 가능) */ .option_group input[type="radio"] { position: absolute; opacity: 0; width: 0; height: 0; margin-bottom: 10px; } /* 2. 커스텀 라디오 버튼 역할을 할 span 요소의 기본 모양(바깥 원)을 만듭니다. */ .option_group .custom-radio { display: inline-block; width: 20px; height: 20px; border: 2px solid #ced4da; border-radius: 50%; background-color: #fff; transition: all 0.2s ease; flex-shrink: 0; /* 크기가 줄어들지 않도록 설정 */ } /* 3. 마우스를 올렸을 때 테두리 색상 변경 */ .option_group label:hover .custom-radio { border-color: var(--secondary-color); } /* 4. 실제 라디오 버튼이 체크되었을 때, span의 테두리 색상을 변경합니다. */ .option_group input[type="radio"]:checked + .custom-radio { border-color: var(--primary-color); } /* 5. 키보드 포커스를 받았을 때의 시각적 피드백 (웹 접근성) */ .option_group input[type="radio"]:focus-visible + .custom-radio { box-shadow: 0 0 0 3px rgba(44, 62, 80, 0.2); } /* 6. 체크되었을 때, 안쪽에 체크 표시(V)를 만듭니다. */ .option_group .custom-radio::after { content: ''; display: block; width: 5px; height: 10px; border: solid var(--primary-color); border-width: 0 3px 3px 0; transform: translate(5px, 2px) rotate(45deg) scale(0); /* 기본적으로 숨김 */ opacity: 0; transition: all 0.2s ease-in-out; } /* 7. 실제 라디오 버튼이 체크되었을 때, 체크 표시를 나타나게 합니다. */ .option_group input[type="radio"]:checked + .custom-radio::after { transform: translate(5px, 2px) rotate(45deg) scale(1); /* 보이게 함 */ opacity: 1; } /* 8. disabled 상태일 때의 스타일 */ .option_group input[type="radio"]:disabled + .custom-radio { background-color: #e9ecef; border-color: #dee2e6; cursor: not-allowed; } .option_group input[type="radio"]:disabled:checked + .custom-radio::after { border-color: #868e96; } .option_group input[type="radio"]:disabled ~ span { color: #868e96; } /* 날짜 선택 그룹 스타일 */ .date_picker_group { display: flex; align-items: center; gap: 15px; background-color: #f8f9fa; padding: 20px; border-radius: 8px; } .date_picker_group .date_item { flex: 1; } .date_picker_group .frm_label { font-size: 16px; margin-bottom: 8px; } .date_picker_group .datepicker { background-color: white; } .date_picker_group .date_divider { font-size: 20px; font-weight: 700; color: #868e96; padding-top: 30px; } /* --- 📌 게시판 보기 (Board View) --- */ #bo_v { padding: 20px 0; max-width: 900px; margin: 0 auto; } #bo_v h2 { font-size: 20px; font-weight: 700; color: var(--primary-color); margin-bottom: 20px; } #bo_v_title { font-size: 32px; font-weight: 900; color: var(--primary-color); margin-bottom: 20px; line-height: 1.4; word-break: keep-all; } #bo_v_info { display: flex; align-items: center; gap: 20px; padding-bottom: 25px; margin-bottom: 35px; border-bottom: 1px solid #e9ecef; font-size: 14px; color: #868e96; } #bo_v_info h3 { font-size: 20px; font-weight: 700; color: var(--primary-color); margin-bottom: 20px; } #bo_v_info strong { font-weight: 700; color: var(--secondary-color); margin-bottom: 10px; } #bo_v_info span { display: inline-flex; align-items: center; gap: 6px; } #bo_v_atc { padding-bottom: 50px; margin-bottom: 50px; border-bottom: 1px solid #e9ecef; } #bo_v_atc h3 { font-size: 20px; font-weight: 700; color: var(--primary-color); margin-bottom: 20px; } #bo_v_main_visual { margin-bottom: 40px; border-radius: 12px; overflow: hidden; background-color: #000; } #bo_v_main_visual img, #bo_v_main_visual video { display: block; width: 100%; height: auto; } #bo_v_con { line-height: 1.8; font-size: 16px; color: var(--text-color); min-height: 100px; } #bo_v_con img { max-width: 100%; height: auto; border-radius: 8px; margin: 20px 0; } #bo_v_gallery { margin-top: 40px; padding-top: 40px; border-top: 1px solid #e9ecef; } #bo_v_gallery h3 { font-size: 20px; font-weight: 700; color: var(--primary-color); margin-bottom: 20px; } .gallery_grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); gap: 15px; } .gallery_grid a { display: block; border-radius: 8px; overflow: hidden; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08); transition: transform 0.3s ease, box-shadow 0.3s ease; cursor: pointer; background-color: #f8f9fa; aspect-ratio: 1 / 1; } .gallery_grid a:hover { transform: translateY(-5px); box-shadow: 0 8px 20px rgba(0, 0, 0, 0.12); } .gallery_grid img { width: 100%; height: 100%; object-fit: cover; } .gallery_item_other { background-color: #f8f9fa; border: 1px solid #e9ecef; border-radius: 8px; padding: 15px; display: flex; align-items: center; justify-content: center; text-align: center; aspect-ratio: 1 / 1; } .view_file_link { text-decoration: none; color: var(--secondary-color); font-weight: 500; } .view_file_link .fa { margin-right: 8px; } #bo_v_bot { margin-bottom: 60px; } #bo_v_bot .btn_area { display: flex; justify-content: flex-end; gap: 10px; margin-top: 30px; } #bo_v_bot a, #bo_v_bot button { display: inline-flex; align-items: center; justify-content: center; padding: 10px 24px; border-radius: 6px; text-decoration: none; font-weight: 700; font-size: 15px; transition: all 0.3s ease; border: 1px solid; cursor: pointer; } #bo_v_bot .btn_b01 { background-color: #6c757d; color: var(--white-color); border-color: #6c757d; } #bo_v_bot .btn_b02 { background-color: var(--primary-color); color: var(--white-color); border-color: var(--primary-color); } #bo_v_bot .btn_b01:hover { background-color: #5a6268; } #bo_v_bot .btn_b02:hover { background-color: var(--secondary-color); } /* --- 📌 [통합] 이미지 라이트박스 스타일 --- */ .image_lightbox { display: none; position: fixed; z-index: 9999; left: 0; top: 0; width: 100%; height: 100%; background-color: rgba(0, 0, 0, 0.85); justify-content: center; align-items: center; animation: fadeIn 0.3s; } .lightbox_content { max-width: 90%; max-height: 90%; object-fit: contain; animation: zoomIn 0.3s; } .lightbox_close { position: absolute; top: 20px; right: 40px; color: #fff; font-size: 40px; font-weight: bold; transition: 0.3s; cursor: pointer; } .lightbox_close:hover { color: #bbb; } @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } } @keyframes zoomIn { from { transform: scale(0.8); } to { transform: scale(1); } } /* --- 📌 반응형 스타일 --- */ @media (max-width: 768px) { .bo-list-bottom-wrapper { display: flex; flex-direction: column; gap: 30px; margin-top: 20px; } .bo-pagination, .bo-search-box { margin-top: 0; } .bo-search-box { padding: 15px; } .bo-search-box form { flex-direction: column; align-items: stretch; gap: 10px; } .bo-search-box .sch-input { width: 100%; } .date_picker_group { flex-direction: column; align-items: stretch; gap: 20px; } .date_picker_group .date_divider { padding-top: 0; text-align: center; transform: rotate(90deg); margin: -5px 0; } } /* 💡 [추가] 뷰 모드 전환 스타일 */ #bo_list_body[data-view-mode="card"] .list-view { display: none; } #bo_list_body[data-view-mode="card"] .bo-card-item { display: flex; } /* 카드형 아이템 보이기 */ #bo_list_body[data-view-mode="list"] .bo-card-item { display: none; } /* 카드형 아이템 숨기기 */ #bo_list_body[data-view-mode="list"] .bo-list-item { display: flex; } /* 목록형 아이템 보이기 */ /* 기본값 (JS 로드 전 깜빡임 방지) */ .bo-card-item, .bo-list-item { display: none; } /* 💡 [추가] 수정/삭제 버튼 스타일 */ .btn-action { display: inline-block; padding: 4px 12px; font-size: 13px; font-weight: 700; border-radius: 4px; text-decoration: none; transition: all 0.2s; border: 1px solid transparent; white-space: nowrap; cursor: pointer; } .btn-action.btn-modify { background-color: #f8f9fa; color: #495057; border-color: #dee2e6; } .btn-action.btn-modify:hover { background-color: #e9ecef; } .btn-action.btn-delete { background-color: #fff5f5; color: #e53e3e; border-color: #f5c6cb; } .btn-action.btn-delete:hover { background-color: #fed7d7; } /* 버튼 그룹 간격 조정 */ .action-group { display: flex; gap: 5px; } /* 💡 [추가] 카드형 리스트 그리드 스타일 */ #bo_list_body[data-view-mode="card"] { display: grid; grid-template-columns: repeat(4, 1fr); /* PC: 4개 고정 */ gap: 20px; } /* 카드형 아이템 스타일 */ .bo-card-item { flex-direction: column; /* 세로 정렬 */ border: 1px solid #eee; border-radius: 8px; overflow: hidden; background: #fff; transition: transform 0.2s, box-shadow 0.2s; position: relative; /* 체크박스 위치 기준 */ } .bo-card-item:hover { transform: translateY(-5px); box-shadow: 0 5px 15px rgba(0,0,0,0.1); } .card-link { display: block; text-decoration: none; color: inherit; } .card-thumbnail { position: relative; padding-top: 65%; /* 썸네일 비율 */ overflow: hidden; background: #f9f9f9; } .card-thumbnail img { position: absolute; top: 0; left: 0; width: 100%; height: 100%; object-fit: cover; } .card-content-preview { position: absolute; top: 0; left: 0; width: 100%; height: 100%; display: flex; align-items: center; justify-content: center; padding: 20px; text-align: center; color: #888; font-size: 14px; } .card-info { padding: 15px; } .card-subject { font-size: 16px; font-weight: bold; margin-bottom: 10px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .card-status-wrapper { margin-top: 10px; } .card-actions { padding: 10px 15px; border-top: 1px solid #eee; display: flex; justify-content: space-between; align-items: center; } /* 💡 [추가] 카드형 체크박스 스타일 */ .card-chk { position: absolute; top: 10px; left: 10px; z-index: 10; } /* 반응형 처리 */ @media (max-width: 1200px) { #bo_list_body[data-view-mode="card"] { grid-template-columns: repeat(3, 1fr); } } @media (max-width: 768px) { #bo_list_body[data-view-mode="card"] { grid-template-columns: repeat(2, 1fr); } } @media (max-width: 480px) { #bo_list_body[data-view-mode="card"] { grid-template-columns: 1fr; } } /* 💡 [추가] 커스텀 체크박스 스타일 */ .option_group input[type="checkbox"] { position: absolute; opacity: 0; width: 0; height: 0; } .option_group .custom-checkbox { display: inline-block; width: 20px; height: 20px; border: 2px solid #ced4da; border-radius: 4px; /* 라디오와 구분되게 사각형으로 */ background-color: #fff; transition: all 0.2s ease; flex-shrink: 0; position: relative; } .option_group label:hover .custom-checkbox { border-color: var(--secondary-color); } .option_group input[type="checkbox"]:checked + .custom-checkbox { border-color: var(--primary-color); background-color: var(--primary-color); } .option_group input[type="checkbox"]:focus-visible + .custom-checkbox { box-shadow: 0 0 0 3px rgba(44, 62, 80, 0.2); } .option_group .custom-checkbox::after { content: ''; position: absolute; left: 5px; top: 1px; width: 6px; height: 11px; border: solid white; border-width: 0 3px 3px 0; transform: rotate(45deg) scale(0); opacity: 0; transition: all 0.2s ease-in-out; } .option_group input[type="checkbox"]:checked + .custom-checkbox::after { transform: rotate(45deg) scale(1); opacity: 1; } .option_group input[type="checkbox"]:disabled + .custom-checkbox { background-color: #e9ecef; border-color: #dee2e6; cursor: not-allowed; } .option_group input[type="checkbox"]:disabled:checked + .custom-checkbox { background-color: #adb5bd; border-color: #adb5bd; } .option_group input[type="checkbox"]:disabled:checked + .custom-checkbox::after { border-color: #fff; }