diff --git a/style/style.css b/style/style.css index a59542c..1e08b79 100644 --- a/style/style.css +++ b/style/style.css @@ -1,412 +1,123 @@ :root { - --primary-color: #1E5149; - --bg-color: #FFFFFF; - --text-main: #222222; - --text-sub: #666666; - --border-color: #E5E7EB; - /* 매우 연한 회색 라인 */ - --hover-bg: #F9FAFB; + /* Design Tokens */ + --primary-color: #1E5149; --primary-lv-0: #e9eeed; --primary-lv-1: #D2DCDB; --primary-lv-8: #193833; + --bg-default: #FFFFFF; --bg-muted: #F9FAFB; + --text-main: #2D3748; --text-sub: #718096; --border-color: #E2E8F0; + --header-gradient: linear-gradient(90deg, #193833 0%, #1e5149 100%); + --ai-gradient: linear-gradient(180deg, #da8cf1 0%, #8bb1f2 100%); + --space-xs: 4px; --space-sm: 8px; --space-md: 16px; --space-lg: 32px; --space-xl: 64px; + --radius-sm: 4px; --radius-lg: 8px; + --fz-h1: 20px; --fz-h2: 16px; --fz-body: 13px; } -* { - margin: 0; - padding: 0; - box-sizing: border-box; -} +/* Base Reset */ +* { margin: 0; padding: 0; box-sizing: border-box; } +body { font-family: 'Pretendard', sans-serif; font-size: var(--fz-body); color: var(--text-main); background: var(--bg-default); min-height: 100vh; } +a { text-decoration: none; color: inherit; } +button { cursor: pointer; border: none; font-family: inherit; } -body { - font-family: 'Pretendard', sans-serif; - font-size: 13px; - color: var(--text-main); - background-color: var(--bg-color); - display: flex; - min-height: 100vh; -} +/* Components: Topbar */ +.topbar { width: 100%; background: var(--header-gradient); color: #fff; padding: 0 var(--space-lg); position: fixed; top: 0; height: 36px; display: flex; align-items: center; z-index: 1000; } +.topbar-header { margin-right: 60px; font-weight: 700; } +.nav-list { display: flex; list-style: none; gap: var(--space-sm); } +.nav-item { padding: 4px 8px; border-radius: 4px; color: rgba(255,255,255,0.8); transition: 0.2s; font-size: 14px; } +.nav-item:hover { background: var(--primary-lv-1); color: #fff; } +.nav-item.active { background: var(--primary-lv-0); color: var(--primary-color) !important; font-weight: 700; } -/* Topbar */ -.topbar { - width: 100%; - background-color: #1E5149; - /* sample.png 탑바 다크 슬레이트 배경색 */ - color: #FFFFFF; - padding: 0 1.5rem; - position: fixed; - top: 0; - left: 0; - height: 36px; - display: flex; - align-items: center; - z-index: 100; -} +/* Global Layout */ +.main-content { margin-top: 36px; padding: var(--space-lg) var(--space-xl); max-width: 1400px; margin-left: auto; margin-right: auto; } +header { display: flex; justify-content: space-between; align-items: flex-end; margin-bottom: var(--space-lg); padding-bottom: var(--space-sm); border-bottom: 1px solid var(--border-color); } +header h1 { font-size: var(--fz-h1); color: var(--primary-color); } -.topbar-header { - margin-right: 2.5rem; -} +/* Portal (Index) */ +.portal-container { display: flex; flex-direction: column; align-items: center; justify-content: center; height: calc(100vh - 36px); background: var(--bg-muted); padding: var(--space-lg); } +.portal-card { background: #fff; border: 1px solid var(--border-color); border-radius: 12px; padding: 40px; text-align: center; transition: 0.3s; width: 100%; max-width: 380px; box-shadow: 0 4px 6px rgba(0,0,0,0.05); } +.portal-card:hover { transform: translateY(-5px); border-color: var(--primary-color); box-shadow: 0 10px 20px rgba(0,0,0,0.1); } +.portal-card .icon { font-size: 32px; margin-bottom: 20px; width: 64px; height: 64px; background: var(--bg-muted); border-radius: 50%; display: flex; align-items: center; justify-content: center; transition: 0.3s; margin-left: auto; margin-right: auto; } +.portal-card:hover .icon { background: var(--primary-color); color: #fff; } -.topbar-header h2 { - font-size: 15px; - font-weight: 600; - letter-spacing: -0.3px; -} +/* Dashboard List & Console */ +.log-console { background:#000; color:#0f0; font-family:monospace; padding:15px; margin-bottom:20px; border-radius:4px; max-height:200px; overflow-y:auto; font-size:12px; } +.accordion-container { border-top: 1px solid var(--border-color); } +.accordion-list-header, .accordion-header { display: grid; grid-template-columns: 2.5fr 1fr 1fr 0.8fr 2fr; gap: var(--space-md); padding: var(--space-md) var(--space-lg); align-items: center; } +.accordion-list-header { font-size: 11px; font-weight: 700; color: var(--text-sub); border-bottom: 1px solid var(--text-main); } +.accordion-item { border-bottom: 1px solid var(--border-color); } +.accordion-item:hover { background: var(--primary-lv-0); } +.repo-title { font-weight: 700; color: var(--primary-color); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } +.repo-files { text-align: center; font-weight: 600; } +.repo-log { font-size: 11px; color: var(--text-sub); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } +.accordion-body { display: none; padding: var(--space-lg); background: var(--bg-muted); border-top: 1px solid var(--border-color); } +.accordion-item.active .accordion-body { display: block; } +.status-warning { background: #fff9e6; } .status-error { background: #fee9e7; } +.warning-text { color: #f21d0d !important; font-weight: 700; } -.nav-list { - list-style: none; - display: flex; - align-items: center; - height: 100%; -} +/* Mail Manager Refined */ +.mail-wrapper { display: flex; height: calc(100vh - 36px); margin-top: 36px; background: #fff; overflow: hidden; } +.mail-sidebar { width: 240px; border-right: 1px solid var(--border-color); padding: var(--space-md); background: var(--bg-muted); } +.project-select { width: 100%; padding: var(--space-sm); border-radius: var(--radius-sm); border: 1px solid var(--border-color); margin-bottom: var(--space-lg); font-weight: 700; background: #fff; } +.folder-item { padding: var(--space-sm) var(--space-md); border-radius: 4px; cursor: pointer; margin-bottom: 2px; font-weight: 500; display: flex; justify-content: space-between; } +.folder-item:hover { background: var(--primary-lv-0); } +.folder-item.active { background: var(--primary-color); color: #fff; } -.nav-item { - padding: 0 1rem; - height: 28px; - border-radius: 4px; - margin: 0 2px; - cursor: pointer; - transition: all 0.2s; - color: rgba(255, 255, 255, 0.7); - display: flex; - justify-content: center; - align-items: center; - gap: 6px; - font-size: 13px; -} +.mail-list-area { width: 380px; border-right: 1px solid var(--border-color); display: flex; flex-direction: column; } +.search-bar { padding: var(--space-md); border-bottom: 1px solid var(--border-color); background: var(--bg-muted); } +.search-bar input { width: 100%; padding: 8px; border-radius: 4px; border: 1px solid var(--border-color); margin-bottom: var(--space-sm); } +.mail-item { padding: var(--space-md); border-bottom: 1px solid var(--border-color); cursor: pointer; transition: 0.2s; } +.mail-item:hover { background: var(--bg-muted); } +.mail-item.active { background: #E9EEED; border-left: 4px solid var(--primary-color); } -.nav-item:hover, -.nav-item.active { - background-color: #E9EEED; - color: #1E5149; - font-weight: 500; -} +.mail-content-area { flex: 1; display: flex; flex-direction: column; overflow-y: auto; } +.mail-content-header { padding: var(--space-lg); border-bottom: 1px solid var(--border-color); } +.mail-body { padding: var(--space-lg); line-height: 1.6; min-height: 200px; } -/* Main Content */ -.main-content { - margin-top: 36px; - flex: 1; - padding: 2rem 2.5rem; - width: 100%; - max-width: 1400px; - margin-left: auto; - margin-right: auto; -} +.attachment-area { padding: var(--space-lg); border-top: 1px solid var(--border-color); background: var(--bg-muted); } +.attachment-item { display: flex; align-items: center; justify-content: space-between; background: #fff; padding: var(--space-sm) var(--space-md); border-radius: var(--radius-lg); border: 1px solid var(--border-color); margin-bottom: var(--space-sm); } +.file-info { display: flex; align-items: center; gap: var(--space-sm); flex: 1; } +.ai-recommend { font-size: 11px; color: #6d3dc2; background: #f1ecf9; padding: 2px 6px; border-radius: 4px; font-weight: 700; margin-left: 10px; } -header { - margin-bottom: 2rem; - display: flex; - justify-content: space-between; - align-items: flex-end; - padding-bottom: 0.8rem; - border-bottom: 1px solid var(--border-color); - /* 선 굵기와 색상 얇게 */ -} - -header h1 { - font-size: 18px; - font-weight: 700; - color: var(--primary-color); -} - -.admin-info { - color: var(--text-sub); - font-size: 12px; -} - -/* Multi-level Accordion (Minimalist/No Box Design) */ -.continent-group { - margin-bottom: 3rem; -} - -.continent-header { - color: var(--text-main); - padding: 0.5rem 0; - font-size: 16px; - font-weight: 700; - cursor: pointer; - display: flex; - justify-content: flex-start; - align-items: center; - border-bottom: 2px solid var(--text-main); - margin-bottom: 1rem; -} - -.continent-body { - display: none; -} - -.continent-group.active > .continent-body { - display: block; -} - -.country-group { - margin-bottom: 2rem; - padding-bottom: 2rem; - border-bottom: 1px dashed var(--border-color); /* 국가 사이 구분선 */ -} - -.country-group:last-child { - margin-bottom: 1rem; - padding-bottom: 0; - border-bottom: none; -} - -.country-header { - color: var(--primary-color); - padding: 0.5rem 0; - font-size: 14px; - font-weight: 700; - cursor: pointer; - display: flex; - justify-content: flex-start; - align-items: center; - margin-bottom: 0.5rem; -} - -.country-body { - display: none; - padding-left: 0.5rem; /* Slight indent instead of borders */ -} - -.country-group.active > .country-body { - display: block; -} - -.toggle-icon { - font-size: 10px; - margin-left: 8px; - color: #999; -} - -/* Accordion Styles (Projects - Row Based) */ -.accordion-container { - display: flex; - flex-direction: column; - width: 100%; -} - -.accordion-item { - border-bottom: 1px solid var(--border-color); -} - -.accordion-item:last-child { - border-bottom: none; -} - -.accordion-header { - display: grid; - grid-template-columns: 2.5fr 1fr 1fr 1fr 1fr 2fr; - gap: 1rem; - padding: 1rem 0; - cursor: pointer; - align-items: center; - background-color: transparent; - transition: opacity 0.2s; -} - -.accordion-item:hover .accordion-header { - opacity: 0.7; -} - -.accordion-item.active .accordion-header { - /* No border-bottom or background change for active */ -} - -.accordion-header > div { - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; -} - -.header-label { +.ai-log-console { + margin-top: var(--space-md); + background: #1a202c; /* dark gray */ + color: #a0aec0; + padding: var(--space-md); + border-radius: var(--radius-lg); + font-family: 'Courier New', Courier, monospace; font-size: 11px; - color: var(--text-sub); - margin-bottom: 3px; - display: block; - font-weight: 400; + line-height: 1.5; + max-height: 150px; + overflow-y: auto; } +.ai-log-console .log-entry { margin-bottom: 4px; border-left: 2px solid #4a5568; padding-left: 8px; } +.ai-log-console .highlight { color: #63b3ed; font-weight: 700; } +.ai-log-console .success { color: #48bb78; } -.header-value { - font-weight: 500; - font-size: 13px; - color: var(--text-main); -} +.btn-group { display: flex; gap: var(--space-xs); } +.btn-upload { padding: 6px 12px; border-radius: 4px; font-size: 11px; font-weight: 700; color: #fff; } +.btn-ai { background: var(--ai-gradient); } +.btn-normal { background: var(--primary-color); } +.btn-upload:hover { opacity: 0.9; transform: translateY(-1px); } -.accordion-body { - display: none; - padding: 1.5rem 0; - background-color: transparent; -} +/* File-specific Log Accordion */ +.file-log-area { display: none; width: 100%; margin-top: 10px; background: #1a202c; border-radius: 4px; padding: 12px; font-family: monospace; font-size: 11px; color: #cbd5e0; } +.file-log-area.active { display: block; } +.log-line { margin-bottom: 2px; } +.log-success { color: #48bb78; font-weight: 700; } +.log-info { color: #63b3ed; } -.accordion-item.active .accordion-body { - display: block; -} +/* Toggle Switch */ +.switch { position: relative; display: inline-block; width: 34px; height: 20px; } +.switch input { opacity: 0; width: 0; height: 0; } +.slider { position: absolute; cursor: pointer; top: 0; left: 0; right: 0; bottom: 0; background-color: #ccc; transition: .4s; border-radius: 20px; } +.slider:before { position: absolute; content: ""; height: 14px; width: 14px; left: 3px; bottom: 3px; background-color: white; transition: .4s; border-radius: 50%; } +input:checked + .slider { background: var(--ai-gradient); } +input:checked + .slider:before { transform: translateX(14px); } -.detail-grid { - display: grid; - grid-template-columns: 1fr 1fr; - gap: 3rem; -} +.ai-toggle-wrap { display: flex; align-items: center; gap: var(--space-sm); font-size: 12px; font-weight: 600; color: var(--text-sub); } +input:checked ~ .ai-label { color: #6d3dc2; } -.detail-section h4 { - margin-bottom: 1rem; - color: var(--text-main); - font-size: 13px; - font-weight: 600; - border-bottom: 1px solid var(--border-color); - padding-bottom: 0.5rem; -} +/* Utils */ +.sync-btn { background: var(--primary-color); color: #fff; padding: 8px 16px; border-radius: var(--radius-lg); font-weight: 700; } +.badge { background: #eee; padding: 2px 6px; border-radius: 4px; font-size: 11px; } +.toggle-icon { transition: 0.2s; } +.active > .continent-header .toggle-icon, .active > .country-header .toggle-icon { transform: rotate(180deg); } -/* Table Styles - Super Minimal Line Style */ -.data-table { - width: 100%; - border-collapse: collapse; -} - -.data-table th, -.data-table td { - padding: 8px 4px; - border-bottom: 1px solid var(--border-color); - text-align: left; -} - -.data-table th { - color: var(--text-sub); - font-weight: 400; - font-size: 12px; -} - -.data-table td { - font-size: 12px; - color: var(--text-main); -} - -.data-table tr:last-child td { - border-bottom: none; -} - -/* General Utilities */ -.badge { - background: #EEEEEE; - color: #555555; - padding: 2px 6px; - border-radius: 2px; - /* 라운드 거의 없앰 */ - font-size: 11px; - font-weight: 500; -} - -.status-up { - color: #D32F2F; - font-weight: 500; -} - -.status-down { - color: #1976D2; - font-weight: 500; -} - -/* Sync Button */ -.sync-btn { - background-color: var(--primary-color); - color: #FFFFFF; - border: 1px solid var(--primary-color); - padding: 6px 14px; - border-radius: 4px; - font-size: 12px; - font-weight: 600; - cursor: pointer; - transition: background-color 0.2s, opacity 0.2s; - margin-right: 1rem; - display: flex; - align-items: center; - gap: 6px; -} - -.sync-btn:hover { - background-color: #153A34; -} - -.sync-btn:disabled { - background-color: #A0B2AF; - border-color: #A0B2AF; - cursor: not-allowed; -} - -/* Spinner */ -.spinner { - display: none; - width: 12px; - height: 12px; - border: 2px solid rgba(255,255,255,0.3); - border-radius: 50%; - border-top-color: #fff; - animation: spin 1s ease-in-out infinite; -} - -@keyframes spin { - to { transform: rotate(360deg); } -} - -.sync-btn.loading .spinner { - display: inline-block; -} - -/* --- Responsive Design --- */ -@media screen and (max-width: 1024px) { - .accordion-header { - grid-template-columns: 2fr 1fr 1fr 1fr 1fr 1.5fr; - } -} - -@media screen and (max-width: 768px) { - .topbar { - overflow-x: auto; - white-space: nowrap; - padding: 0 1rem; - } - /* 스크롤바 숨김 */ - .topbar::-webkit-scrollbar { - display: none; - } - .main-content { - padding: 1.5rem 1rem; - } - header { - flex-direction: column; - align-items: flex-start; - gap: 0.5rem; - } - .detail-grid { - grid-template-columns: 1fr; - gap: 1.5rem; - } - /* 모바일에서 아코디언 헤더를 다단으로 배치 */ - .accordion-header { - grid-template-columns: 1fr 1fr; - row-gap: 1rem; - } - /* 프로젝트 명과 최근 로그는 공간을 넓게 쓰도록 설정 */ - .accordion-header > div:nth-child(1), - .accordion-header > div:nth-child(6) { - grid-column: span 2; - } - .continent-header { - font-size: 15px; - } -} - -@media screen and (max-width: 480px) { - /* 아주 작은 화면에서는 1열로 배치 */ - .accordion-header { - grid-template-columns: 1fr; - } - .accordion-header > div { - grid-column: span 1 !important; - } - .topbar-header h2 { - font-size: 13px; - margin-right: 1rem; - } - .nav-item { - padding: 0 0.5rem; - font-size: 12px; - } -} \ No newline at end of file