You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

560 lines
10 KiB
CSS

/* frontend/styles/dashboard.css — 원본 dash.css + approve.css 의 대시보드 전용 규칙 이식
(공유 레이아웃/카드는 dash-base.css) */
@import "./dash-base.css";
/* ---------- 히어로 ---------- */
.hero {
background:
radial-gradient(95% 105% at 0% 0%, rgba(231, 128, 82, 0.22), transparent 56%),
radial-gradient(130% 130% at 100% 0%, rgba(255, 255, 255, 0.42), transparent 50%),
var(--glass);
-webkit-backdrop-filter: var(--blur);
backdrop-filter: var(--blur);
border: 1px solid var(--glass-brd);
box-shadow: var(--shadow), var(--glass-hi);
color: var(--ink);
}
.hero .ch h3 {
color: var(--ink);
}
.hero-spark {
display: inline-flex;
align-items: center;
gap: 7px;
font-size: 12px;
font-weight: 700;
letter-spacing: 0.02em;
color: #fff;
background: var(--coral);
border: 1px solid transparent;
padding: 5px 12px;
border-radius: 999px;
align-self: flex-start;
box-shadow: 0 5px 14px -5px var(--coral);
white-space: nowrap;
}
.hero-spark .ic {
width: 14px;
height: 14px;
}
.hero p.brief {
font-size: clamp(18px, 1.7vw, 22px);
line-height: 1.5;
letter-spacing: -0.02em;
margin: 16px 0 18px;
color: var(--ink);
max-width: 40ch;
}
.hero p.brief b {
color: var(--ink);
font-weight: 700;
border-bottom: 2px solid color-mix(in oklab, var(--coral) 60%, transparent);
padding-bottom: 1px;
}
.cmd {
display: flex;
align-items: center;
gap: 10px;
background: var(--glass-2);
border: 1px solid var(--glass-brd);
border-radius: 15px;
padding: 7px 7px 7px 16px;
margin-top: auto;
}
.cmd > svg:first-child {
color: var(--ink-2);
width: 18px;
height: 18px;
flex-shrink: 0;
}
.cmd input {
flex: 1;
min-width: 0;
border: none;
background: none;
outline: none;
color: var(--ink);
font-size: 14.5px;
}
.cmd input::placeholder {
color: var(--faint);
}
.cmd .send {
width: 38px;
height: 38px;
border-radius: 11px;
background: var(--fill);
color: var(--on-fill);
display: grid;
place-items: center;
flex-shrink: 0;
transition: filter 0.14s;
}
.cmd .send .ic {
width: 18px;
height: 18px;
}
.cmd .send:hover {
filter: brightness(1.05);
}
.cmd .send:disabled {
opacity: 0.4;
cursor: default;
}
.chips {
display: flex;
flex-wrap: wrap;
gap: 7px;
margin-top: 12px;
}
.chip {
display: inline-flex;
align-items: center;
gap: 7px;
font-size: 12.5px;
font-weight: 500;
color: var(--ink-2);
background: var(--glass-2);
border: 1px solid var(--glass-brd);
padding: 7px 12px;
border-radius: 999px;
transition: background 0.14s;
}
.chip .ic {
width: 14px;
height: 14px;
color: var(--muted);
}
.chip:hover {
background: var(--card-2);
}
/* ---------- 요약 카드 (approve.css mini-*) ---------- */
.appr .ico.lime {
background: var(--lime);
color: var(--lime-ink);
border-color: color-mix(in oklab, var(--lime-ink) 12%, transparent);
}
.appr .count.warm {
color: #fff;
background: var(--coral);
border-color: transparent;
}
.mini-list {
display: flex;
flex-direction: column;
margin-bottom: 12px;
}
.mini-row {
display: flex;
align-items: center;
gap: 9px;
padding: 9px 0;
border-top: 1px solid var(--line);
}
.mini-row:first-child {
border-top: none;
padding-top: 2px;
}
.mini-ic {
width: 26px;
height: 26px;
border-radius: 8px;
flex-shrink: 0;
display: grid;
place-items: center;
background: color-mix(in oklab, var(--tone, var(--blue)) 13%, transparent);
color: var(--tone, var(--blue));
}
.mini-ic .ic {
width: 13px;
height: 13px;
}
.mini-text {
flex: 1;
min-width: 0;
font-size: 12.5px;
font-weight: 600;
letter-spacing: -0.01em;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.mini-sub {
font-size: 10.5px;
color: var(--faint);
flex-shrink: 0;
white-space: nowrap;
}
.mini-cta {
margin-top: auto;
display: flex;
align-items: center;
justify-content: center;
gap: 7px;
padding: 11px;
border-radius: 13px;
background: var(--fill);
color: var(--on-fill);
font-size: 13px;
font-weight: 600;
text-decoration: none;
transition: filter 0.14s;
}
.mini-cta .ic {
width: 14px;
height: 14px;
}
.mini-cta:hover {
filter: brightness(1.12);
}
.appr-empty {
display: flex;
align-items: center;
gap: 10px;
font-size: 13px;
color: var(--ink-2);
line-height: 1.5;
background: linear-gradient(
100deg,
color-mix(in oklab, var(--green) 10%, transparent),
transparent 70%
),
var(--glass-2);
border: 1px solid color-mix(in oklab, var(--green) 28%, var(--glass-brd));
border-radius: var(--radius-sm);
padding: 13px 14px;
margin-bottom: 12px;
}
.ae-tick {
width: 24px;
height: 24px;
border-radius: 50%;
flex-shrink: 0;
display: grid;
place-items: center;
background: var(--green);
color: #fff;
}
.ae-tick .ic {
width: 12px;
height: 12px;
}
/* ---------- 오늘 일정 ---------- */
.sched {
display: flex;
flex-direction: column;
}
.ev {
display: flex;
gap: 13px;
padding: 13px 0;
border-top: 1px solid var(--line);
}
.ev:first-of-type {
border-top: none;
padding-top: 4px;
}
.ev-time {
font-family: var(--font-mono);
font-size: 13px;
font-weight: 500;
color: var(--ink-2);
width: 42px;
flex-shrink: 0;
padding-top: 1px;
}
.ev-body {
flex: 1;
min-width: 0;
position: relative;
padding-left: 15px;
}
.ev-body::before {
content: "";
position: absolute;
left: 0;
top: 4px;
bottom: 4px;
width: 3px;
border-radius: 3px;
background: var(--accent, var(--blue));
}
.ev-title {
font-size: 14px;
font-weight: 600;
letter-spacing: -0.01em;
line-height: 1.3;
}
.ev-meta {
font-size: 12px;
color: var(--muted);
margin-top: 3px;
display: flex;
align-items: center;
gap: 7px;
}
.ev-meta .dur {
color: var(--faint);
}
.ev .soon {
font-size: 10.5px;
font-weight: 700;
letter-spacing: 0.02em;
color: #fff;
background: var(--coral);
padding: 1px 7px;
border-radius: 999px;
align-self: flex-start;
margin-top: 1px;
flex-shrink: 0;
}
.sched-note {
margin-top: 12px;
display: flex;
gap: 9px;
align-items: flex-start;
background: var(--glass-2);
border: 1px solid var(--glass-brd);
border-radius: var(--radius-sm);
padding: 11px 13px;
font-size: 12.5px;
color: var(--ink-2);
line-height: 1.4;
}
.sched-note .ic {
width: 15px;
height: 15px;
color: var(--coral);
flex-shrink: 0;
margin-top: 1px;
}
/* ---------- 할 일 ---------- */
.tasks {
display: flex;
flex-direction: column;
gap: 8px;
}
.task {
display: flex;
align-items: center;
gap: 11px;
padding: 12px 13px;
border-radius: var(--radius-sm);
border: 1px solid var(--glass-brd);
background: var(--glass-2);
cursor: pointer;
text-decoration: none;
color: inherit;
transition: background 0.14s, border-color 0.14s;
}
.task:hover {
background: var(--card-2);
}
.task .box {
width: 21px;
height: 21px;
border-radius: 7px;
border: 2px solid var(--line-2);
display: grid;
place-items: center;
flex-shrink: 0;
color: transparent;
transition: all 0.14s;
}
.task .box .ic {
width: 13px;
height: 13px;
}
.task-body {
flex: 1;
min-width: 0;
}
.task-title {
font-size: 13.5px;
font-weight: 600;
letter-spacing: -0.01em;
line-height: 1.3;
}
.task-meta {
font-size: 11.5px;
color: var(--muted);
margin-top: 2px;
}
.task .prio {
font-size: 10.5px;
font-weight: 700;
flex-shrink: 0;
padding: 2px 8px;
border-radius: 999px;
}
.prio.high {
color: var(--coral);
background: color-mix(in oklab, var(--coral) 14%, transparent);
}
.prio.mid {
color: var(--amber);
background: color-mix(in oklab, var(--amber) 16%, transparent);
}
.prio.low {
color: var(--muted);
background: var(--card-2);
}
.task.focus {
background:
linear-gradient(90deg, color-mix(in oklab, var(--coral) 13%, transparent), transparent 58%),
var(--glass);
border-color: color-mix(in oklab, var(--coral) 38%, var(--glass-brd));
box-shadow: var(--shadow-sm), inset 3px 0 0 0 var(--coral);
}
.task.focus .task-title {
color: var(--ink);
font-weight: 700;
}
.task.focus .box {
border-color: var(--coral);
background: color-mix(in oklab, var(--coral) 14%, transparent);
}
.task.focus .focus-tag {
font-size: 10px;
font-weight: 700;
letter-spacing: 0.04em;
color: #fff;
background: var(--coral);
padding: 1px 7px;
border-radius: 999px;
flex-shrink: 0;
}
/* ---------- 목표 ---------- */
.goals {
display: flex;
flex-direction: column;
gap: 15px;
}
.goal-top {
display: flex;
justify-content: space-between;
align-items: flex-start;
gap: 8px;
margin-bottom: 7px;
}
.goal-title {
font-size: 13px;
font-weight: 600;
letter-spacing: -0.01em;
line-height: 1.3;
flex: 1;
min-width: 0;
}
.goal-pct {
flex-shrink: 0;
font-size: 13px;
font-weight: 700;
font-family: var(--font-mono);
}
.goal-bar {
height: 7px;
border-radius: 999px;
background: var(--card-2);
overflow: hidden;
}
.goal-bar i {
display: block;
height: 100%;
border-radius: 999px;
}
.goal-sub {
font-size: 11.5px;
color: var(--muted);
margin-top: 5px;
}
/* ---------- 진입 애니메이션 ---------- */
.entered .card {
animation: cardin 0.5s cubic-bezier(0.2, 0.7, 0.2, 1) both;
}
@keyframes cardin {
from {
opacity: 0;
transform: translateY(12px);
}
to {
opacity: 1;
transform: none;
}
}
/* ---------- 로딩 스켈레톤 ---------- */
.skel {
background: var(--card-2);
border-radius: 8px;
position: relative;
overflow: hidden;
}
.skel::after {
content: "";
position: absolute;
inset: 0;
background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.35), transparent);
transform: translateX(-100%);
animation: dash-shimmer 1.4s infinite;
}
@keyframes dash-shimmer {
to {
transform: translateX(100%);
}
}
.skel-title {
height: 40px;
width: 60%;
margin-top: 8px;
}
.skel-eyebrow {
height: 14px;
width: 180px;
}
.skel-head {
height: 20px;
width: 50%;
margin-bottom: 16px;
}
.skel-line {
height: 14px;
margin: 8px 0;
}
.skel-line.short {
width: 60%;
}
.skel-block {
height: 160px;
}
/* ---------- 에러 ---------- */
.dash-error {
display: flex;
flex-direction: column;
align-items: center;
gap: 12px;
padding: 48px 24px;
margin-top: 24px;
border-radius: var(--radius);
background: color-mix(in oklab, var(--coral) 7%, var(--card));
border: 1px solid color-mix(in oklab, var(--coral) 24%, transparent);
color: var(--ink-2);
text-align: center;
}
.dash-error .mini-cta {
margin-top: 0;
padding: 10px 18px;
}
@media (prefers-reduced-motion: reduce) {
.entered .card,
.skel::after {
animation: none !important;
}
}