/* ====== 대시보드 ====== */
.dash-view{display:flex;flex-direction:column;height:100%;min-height:0;}
.dash-toolbar{display:flex;align-items:center;gap:14px;padding:12px 24px;border-bottom:1px solid var(--line);background:var(--surface);}
.dash-tabs{display:flex;gap:4px;}
.dash-tab{padding:7px 14px;border-radius:8px;font-size:13px;font-weight:600;color:var(--ink-3);display:flex;align-items:center;gap:7px;}
.dash-tab.active{background:var(--blue-50);color:var(--blue-600);}
.dash-tab:hover:not(.active){background:var(--line-soft);color:var(--ink-1);}
.dash-tab .star{font-size:13px;}
.dash-meta{font-size:12px;color:var(--ink-3);}
.dash-canvas-scroll{flex:1;overflow:auto;min-height:0;background:var(--bg);position:relative;}
.dash-canvas{position:relative;margin:0 auto;padding:22px;min-height:100%;}
.dash-grid-bg{position:absolute;inset:22px;background-image:radial-gradient(circle,#D9DFEA 1px,transparent 1px);background-size:calc((100% )/12) 100%;opacity:0;transition:.2s;pointer-events:none;}
.dash-canvas.editing .dash-grid-bg{opacity:.5;background-image:linear-gradient(to right,rgba(27,91,215,.06) 1px,transparent 1px);}

/* 스냅 가이드 (자석 정렬선) */
.snap-guide{position:absolute;background:none;z-index:50;pointer-events:none;}
.snap-guide.v{top:0;bottom:0;width:0;border-left:1.5px dashed var(--blue-500);}
.snap-guide.h{left:0;right:0;height:0;border-top:1.5px dashed var(--blue-500);}
.snap-guide::before{content:'';position:absolute;width:5px;height:5px;border-radius:50%;background:var(--blue-500);}
.snap-guide.v::before{top:-2px;left:-3.2px;}
.snap-guide.h::before{left:-2px;top:-3.2px;}

/* 카드 */
.dash-card{position:absolute;background:var(--surface);border:1px solid var(--line);border-radius:14px;box-shadow:var(--sh-1);display:flex;flex-direction:column;overflow:hidden;transition:box-shadow .15s,border-color .15s;}
.dash-card:hover{box-shadow:var(--sh-2);}
.dash-card.dragging{box-shadow:var(--sh-3);border-color:var(--blue-400);z-index:30;transition:none;cursor:grabbing;}
.dash-card.resizing{box-shadow:var(--sh-3);border-color:var(--blue-400);z-index:30;transition:none;}
.dash-card-head{display:flex;align-items:center;gap:9px;padding:12px 13px 9px;flex:0 0 auto;}
.dash-card.editing .dash-card-head{cursor:grab;}
.dash-card-head .grip{color:var(--ink-4);display:none;}
.dash-card.editing .dash-card-head .grip{display:flex;}
.dash-card-head .grip svg{width:15px;height:15px;}
.dash-card-head .vic{width:28px;height:28px;border-radius:7px;background:var(--blue-50);color:var(--blue-600);display:flex;align-items:center;justify-content:center;flex:0 0 auto;}
.dash-card-head .vic svg{width:15px;height:15px;}
.dash-card-head .t{font-size:13.5px;font-weight:700;color:var(--ink-1);line-height:1.25;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.dash-card-head .d{font-size:10.5px;color:var(--ink-3);margin-top:1px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.dash-card-tools{margin-left:auto;display:flex;align-items:center;gap:4px;flex:0 0 auto;}
.dash-card-tools .ico-btn{width:28px;height:28px;border-radius:7px;display:flex;align-items:center;justify-content:center;color:var(--ink-3);}
.dash-card-tools .ico-btn:hover{background:var(--line-soft);color:var(--ink-1);}
.dash-card-tools .ico-btn svg{width:15px;height:15px;}
.dash-card-body{flex:1;min-height:0;overflow:auto;padding:4px 15px 15px;}
.dash-card-period{display:inline-flex;align-items:center;gap:5px;font-size:10.5px;color:var(--ink-3);background:var(--line-soft);padding:3px 8px;border-radius:6px;margin:0 15px 8px;width:max-content;}
.dash-card-period svg{width:12px;height:12px;}
.resize-handle{position:absolute;right:2px;bottom:2px;width:18px;height:18px;cursor:nwse-resize;display:none;align-items:flex-end;justify-content:flex-end;color:var(--ink-4);}
.dash-card.editing .resize-handle{display:flex;}
.resize-handle svg{width:12px;height:12px;}

/* 카드 메뉴 */
.card-menu{position:absolute;top:38px;right:10px;background:#fff;border:1px solid var(--line);border-radius:10px;box-shadow:var(--sh-3);padding:5px;z-index:40;width:170px;}
.card-menu button{display:flex;align-items:center;gap:9px;width:100%;padding:8px 10px;border-radius:7px;font-size:12.5px;color:var(--ink-2);text-align:left;}
.card-menu button:hover{background:var(--line-soft);color:var(--ink-1);}
.card-menu button.danger:hover{background:#FBE9EB;color:var(--neg);}
.card-menu button svg{width:15px;height:15px;}
.card-menu .sep{height:1px;background:var(--line-soft);margin:4px 6px;}

/* 빈 대시보드 */
.dash-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;text-align:center;color:var(--ink-3);}
.dash-empty .ic{width:64px;height:64px;border-radius:18px;background:var(--surface);border:1px solid var(--line);display:flex;align-items:center;justify-content:center;margin-bottom:16px;box-shadow:var(--sh-1);}
.dash-empty .ic svg{width:30px;height:30px;color:var(--blue-400);}
.dash-empty h3{font-size:17px;color:var(--ink-1);margin:0 0 6px;}
.dash-empty p{font-size:13px;margin:0 0 20px;max-width:340px;}

/* 컴포넌트 추가 패널(drawer) */
.add-drawer-scrim{position:fixed;inset:0;background:rgba(11,27,64,.30);z-index:55;animation:fade .15s;}
.add-drawer{position:fixed;top:0;right:0;bottom:0;width:360px;background:var(--surface);box-shadow:var(--sh-3);z-index:56;display:flex;flex-direction:column;animation:slideIn .22s cubic-bezier(.2,.8,.3,1);}
@keyframes slideIn{from{transform:translateX(100%);}to{transform:none;}}
.add-drawer-head{padding:18px 20px;border-bottom:1px solid var(--line);display:flex;align-items:center;gap:10px;}
.add-drawer-head h3{margin:0;font-size:15.5px;font-weight:700;}
.add-drawer-head svg{width:18px;height:18px;flex:0 0 auto;}
.add-drawer-head .x{margin-left:auto;width:30px;height:30px;border-radius:8px;display:flex;align-items:center;justify-content:center;color:var(--ink-3);}
.add-drawer-head .x:hover{background:var(--line-soft);}
.add-drawer-search{padding:14px 20px 6px;}
.add-drawer-list{flex:1;overflow:auto;padding:10px 14px 20px;display:flex;flex-direction:column;gap:9px;}
.add-comp-card{display:flex;align-items:center;gap:11px;padding:12px;border:1px solid var(--line);border-radius:11px;transition:.13s;}
.add-comp-card:hover{border-color:var(--blue-400);background:var(--blue-50);}
.add-comp-card.added{opacity:.55;}
.add-comp-card .vic{width:34px;height:34px;border-radius:9px;background:var(--blue-50);color:var(--blue-600);display:flex;align-items:center;justify-content:center;flex:0 0 auto;}
.add-comp-card .vic svg{width:17px;height:17px;}
.add-comp-card .info{flex:1;min-width:0;}
.add-comp-card .info .t{font-size:13px;font-weight:600;color:var(--ink-1);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.add-comp-card .info .m{font-size:11px;color:var(--ink-3);margin-top:2px;}
.add-comp-card .add-btn{width:30px;height:30px;border-radius:8px;background:var(--blue-600);color:#fff;display:flex;align-items:center;justify-content:center;flex:0 0 auto;}
.add-comp-card .add-btn svg{width:16px;height:16px;}
.add-comp-card.added .add-btn{background:var(--pos);}
