/* ============================================================================= * B01_Dashboard_UI_Style_Projects.css * 프로젝트 목록 · 상세(PLAN 548) — 색 · 간격은 대시보드 셸 변수(--b01-*) · 없으면 공용 테마 값. * ========================================================================== */ .b01-proj, .b01-pd { --pj-accent: var(--b01-accent, var(--color-primary, #1f7a4d)); --pj-accent-soft: var(--b01-accent-soft, color-mix(in srgb, var(--pj-accent) 12%, transparent)); --pj-surface: var(--b01-card, var(--color-surface, #fff)); --pj-sunken: var(--b01-bg, var(--color-surface-sunken, #eef0f3)); --pj-border: var(--b01-line, var(--color-border, #e6e8ec)); --pj-text: var(--b01-text, var(--color-text, #1f2328)); --pj-muted: var(--b01-muted, var(--color-text-muted, #6b7280)); --pj-radius: var(--b01-radius, var(--radius-cards, 12px)); --pj-gap: var(--spacing-16, 14px); --pj-road: var(--pj-accent); --pj-plan: #2f5fbf; --pj-stab: #c26a0f; --pj-warn: #d97706; --pj-danger: var(--b01-alert, var(--color-danger, #e5484d)); color: var(--pj-text); font-size: var(--text-body-sm, 13.5px); } /* ── 머리 · 툴바 ─────────────────────────────────────────────────────────── */ .b01-proj-head, .b01-pd-head { display: flex; align-items: center; gap: 10px; margin-bottom: 12px; flex-wrap: wrap; } .b01-proj-head h2, .b01-pd-head h2 { margin: 0; font-size: 19px; } .b01-proj-count { color: var(--pj-muted); } .b01-proj-sp { flex: 1; } .b01-proj-tools { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; margin-bottom: 12px; } .b01-proj-search { width: 220px; padding: 5px 10px; border: 1px solid var(--pj-border); border-radius: 7px; background: var(--pj-surface); color: var(--pj-text); font: inherit; } .b01-proj-select { padding: 3px 8px; border: 1px solid var(--pj-border); border-radius: 14px; background: var(--pj-surface); color: var(--pj-text); font: inherit; } .b01-proj-chip { border: 1px solid var(--pj-border); border-radius: 14px; padding: 2px 10px; background: var(--pj-surface); color: var(--pj-text); font: inherit; cursor: pointer; } .b01-proj-chip.is-on { border-color: var(--pj-accent); color: var(--pj-accent); background: var(--pj-accent-soft); } .b01-proj-chip.is-soon { opacity: 0.5; border-style: dashed; } .b01-proj-seg { display: inline-flex; border: 1px solid var(--pj-border); border-radius: 8px; overflow: hidden; } .b01-proj-seg button { border: 0; padding: 5px 11px; background: var(--pj-surface); color: var(--pj-text); font: inherit; cursor: pointer; } .b01-proj-seg button.is-on { background: var(--pj-accent); color: #fff; } .b01-proj-empty { color: var(--pj-muted); padding: 24px 0; text-align: center; } .b01-proj-mini { color: var(--pj-muted); font-size: 12px; } /* ── 배지 · 막대 · 점 ────────────────────────────────────────────────────── */ .b01-proj-badge { display: inline-block; font-size: 11px; font-weight: 600; border-radius: 5px; padding: 0 6px; margin-right: 6px; color: var(--pj-road); background: color-mix(in srgb, var(--pj-road) 13%, transparent); } .b01-proj-badge--plan { color: var(--pj-plan); background: color-mix(in srgb, var(--pj-plan) 13%, transparent); } .b01-proj-badge--stability { color: var(--pj-stab); background: color-mix(in srgb, var(--pj-stab) 13%, transparent); } .b01-proj-badge--erosion { color: var(--pj-muted); background: var(--pj-sunken); } .b01-proj-bar { display: inline-block; width: 90px; height: 6px; border-radius: 4px; background: var(--pj-sunken); overflow: hidden; vertical-align: middle; } .b01-proj-bar i { display: block; height: 100%; background: var(--pj-accent); } .b01-proj-dots { display: flex; gap: 4px; margin: 6px 0 2px; } .b01-proj-dots i { width: 8px; height: 8px; border-radius: 50%; background: var(--pj-sunken); border: 1px solid var(--pj-border); } .b01-proj-dots i.is-done { background: var(--pj-accent); border-color: var(--pj-accent); } .b01-proj-dots i.is-cur { border: 2px solid var(--pj-accent); background: var(--pj-surface); } .b01-proj-dots i.is-stale { background: var(--pj-warn); border-color: var(--pj-warn); } .b01-proj-stalled { color: var(--pj-warn); font-size: 11.5px; margin-left: 6px; } /* ── 카드 ────────────────────────────────────────────────────────────────── */ .b01-proj-cards { display: grid; grid-template-columns: repeat(auto-fill, minmax(230px, 1fr)); gap: var(--pj-gap); } .b01-proj-card { background: var(--pj-surface); border: 1px solid var(--pj-border); border-radius: var(--pj-radius); overflow: hidden; cursor: pointer; transition: box-shadow 0.15s, border-color 0.15s; } .b01-proj-card:hover, .b01-proj-card:focus-visible { border-color: var(--pj-accent); box-shadow: 0 2px 10px rgb(16 24 40 / 8%); outline: none; } .b01-proj-thumb { display: block; width: 100%; height: 64px; background: color-mix(in srgb, var(--pj-road) 9%, var(--pj-surface)); } .b01-proj-col .b01-proj-thumb { height: 44px; } .b01-proj-card--plan .b01-proj-thumb { background: color-mix(in srgb, var(--pj-plan) 9%, var(--pj-surface)); } .b01-proj-card--stability .b01-proj-thumb { background: color-mix(in srgb, var(--pj-stab) 9%, var(--pj-surface)); } .b01-proj-thumb path { fill: none; stroke: #c0392b; stroke-width: 2.5; stroke-linejoin: round; vector-effect: non-scaling-stroke; } .b01-proj-card--plan .b01-proj-thumb path { stroke: var(--pj-plan); } .b01-proj-card--stability .b01-proj-thumb path { stroke: var(--pj-stab); } .b01-proj-card__body { padding: 8px 10px 9px; } .b01-proj-card__name { display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .b01-proj-card__line { margin-top: 2px; } .b01-proj-card .b01-proj-bar { width: 100%; margin-top: 5px; } .b01-proj-card__meta { display: flex; justify-content: space-between; gap: 6px; color: var(--pj-muted); font-size: 11.5px; margin-top: 5px; } /* ── 표 ──────────────────────────────────────────────────────────────────── */ .b01-proj-table { position: relative; background: var(--pj-surface); border: 1px solid var(--pj-border); border-radius: var(--pj-radius); overflow: visible; } .b01-proj-table table { width: 100%; border-collapse: collapse; } .b01-proj-table th, .b01-proj-table td { padding: 9px 12px; text-align: left; border-bottom: 1px solid var(--pj-border); } .b01-proj-table th { color: var(--pj-muted); font-weight: 600; font-size: 12px; background: var(--pj-sunken); } .b01-proj-row { cursor: pointer; } .b01-proj-row:hover td, .b01-proj-row:focus-visible td { background: var(--pj-accent-soft); } .b01-proj-row:focus-visible { outline: none; } .b01-proj-prog span:last-child { margin-left: 8px; } .b01-proj-more { border: 0; background: none; color: var(--pj-muted); font-size: 16px; cursor: pointer; padding: 0 6px; } /* 삭제 = 끝 줄(수정 뒤 구분선 다음) */ .b01-proj-menu__context-menu .ui-ctx-menu__item:last-child:not(:first-child) { color: var(--pj-danger); } /* ── 칸반 ────────────────────────────────────────────────────────────────── */ .b01-proj-kanban { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)) minmax(0, 0.8fr); gap: 12px; align-items: start; } .b01-proj-col { background: var(--pj-sunken); border-radius: var(--pj-radius); padding: 10px; } .b01-proj-col h4 { display: flex; gap: 6px; align-items: center; margin: 0 0 8px; font-size: 13px; } .b01-proj-col__list { display: grid; gap: 8px; } .b01-proj-col[data-board="done"] h4 { cursor: pointer; } .b01-proj-col[data-board="done"] .b01-proj-card { opacity: 0.75; } .b01-proj-col.is-folded .b01-proj-col__list { display: none; } .b01-proj-fold { margin-left: auto; color: var(--pj-muted); font-size: 11.5px; font-weight: 400; } @media (max-width: 900px) { .b01-proj-kanban { grid-template-columns: 1fr 1fr; } } /* ── 상세 ────────────────────────────────────────────────────────────────── */ .b01-pd-crumb { border: 0; background: none; padding: 0; color: var(--pj-muted); font: inherit; font-size: 12px; cursor: pointer; margin-bottom: 4px; } .b01-pd-head { position: relative; } .b01-pd-pane { background: var(--pj-surface); border: 1px solid var(--pj-border); border-radius: var(--pj-radius); padding: 14px 16px; margin-bottom: var(--pj-gap); } .b01-pd-pane h3 { margin: 0 0 10px; font-size: 14px; } .b01-pd-steps { display: grid; grid-template-columns: repeat(var(--n, 7), minmax(0, 1fr)); gap: 6px; } .b01-pd-step { border: 1px solid var(--pj-border); border-radius: 9px; padding: 7px 4px; background: var(--pj-surface); color: var(--pj-text); font: inherit; font-size: 11.5px; text-align: center; cursor: pointer; } .b01-pd-step:hover { border-color: var(--pj-accent); } .b01-pd-step span { display: grid; place-items: center; width: 20px; height: 20px; margin: 0 auto 4px; border-radius: 50%; background: var(--pj-sunken); color: var(--pj-muted); font-size: 11px; font-weight: 700; } .b01-pd-step b { font-weight: 500; } .b01-pd-step.is-done span { background: var(--pj-accent); color: #fff; } .b01-pd-step.is-cur { border-color: var(--pj-accent); background: var(--pj-accent-soft); } .b01-pd-step.is-cur span { background: var(--pj-surface); color: var(--pj-accent); border: 2px solid var(--pj-accent); } .b01-pd-step.is-stale span { background: #d97706; color: #fff; } .b01-pd-grid { display: grid; grid-template-columns: 1.55fr 1fr; gap: var(--pj-gap); align-items: start; } .b01-pd-grid.is-single { grid-template-columns: 1fr; } .b01-pd-grid.is-single > .b01-pd-col:first-child { display: none; } .b01-pd-map { display: block; width: 100%; height: auto; border-radius: 8px; background: var(--pj-sunken); } .b01-pd-map__line { fill: none; stroke: #c0392b; stroke-width: 3.5; stroke-linejoin: round; } .b01-pd-map__end { fill: #fff; stroke: #c0392b; stroke-width: 2; } .b01-pd-map__label { font-size: 12px; fill: #1f2328; paint-order: stroke; stroke: #fff; stroke-width: 3px; } .b01-pd-kpis { display: flex; flex-wrap: wrap; gap: 22px; margin-top: 10px; } .b01-pd-kpi b { display: block; font-size: 22px; font-variant-numeric: tabular-nums; line-height: 1.2; } .b01-pd-kpi span { color: var(--pj-muted); font-size: 12px; } .b01-pd-kv { display: grid; grid-template-columns: 96px 1fr; gap: 6px 10px; } .b01-pd-kv span { color: var(--pj-muted); } .b01-pd-link { display: flex; align-items: center; gap: 8px; padding: 6px 0; border-top: 1px solid var(--pj-border); } .b01-pd-link:first-of-type { border-top: 0; } .b01-pd-timeline { border-left: 2px solid var(--pj-border); margin-left: 4px; padding-left: 12px; } .b01-pd-timeline div { position: relative; padding: 4px 0; font-size: 12.5px; } .b01-pd-timeline div::before { content: ""; position: absolute; left: -17px; top: 10px; width: 8px; height: 8px; border-radius: 50%; background: var(--pj-accent); } @media (max-width: 900px) { .b01-pd-grid { grid-template-columns: 1fr; } .b01-pd-steps { grid-template-columns: repeat(4, minmax(0, 1fr)); } }