/* 단가산출 다이어그램 — 자유 배치 */ .m02-cfdg { --cfdg-in: var(--color-accent); --cfdg-out: #c2610c; display: flex; flex-direction: column; gap: var(--spacing-8); min-width: 0; font-size: var(--text-body-sm); } :root[data-theme="dark"] .m02-cfdg { --cfdg-out: #e5a866; --cfdg-lift: #fff; } @media (prefers-color-scheme: dark) { :root:not([data-theme="light"]) .m02-cfdg { --cfdg-out: #e5a866; --cfdg-lift: #fff; } } .m02-cfdg__bar, .m02-cfdg__tools { display: flex; flex-wrap: wrap; align-items: center; gap: var(--spacing-8); } .m02-cfdg__tools { min-height: 1.75rem; } .m02-cfdg__title { font-size: var(--text-body); } .m02-cfdg__gap { flex: 1; } .m02-cfdg__zoom { min-width: 3rem; text-align: center; font-variant-numeric: tabular-nums; color: var(--color-text-secondary); } .m02-cfdg__note { color: var(--color-danger); } .m02-cfdg__hint { margin: 0; color: var(--color-text-muted); } /* 판 — 화면 위쪽 큰 영역 */ .m02-cfdg__view { position: relative; height: max(360px, 55vh); overflow: hidden; border: 1px solid var(--color-border); border-radius: var(--radius-lg); background-color: var(--color-canvas); background-image: radial-gradient( color-mix(in srgb, var(--color-text-muted) 35%, transparent) 1px, transparent 1px ); background-size: 20px 20px; cursor: grab; touch-action: none; } .m02-cfdg__world { position: absolute; inset: 0 auto auto 0; width: 1px; height: 1px; transform-origin: 0 0; } .m02-cfdg__lines { position: absolute; inset: 0 auto auto 0; width: 1px; height: 1px; overflow: visible; pointer-events: none; } /* 상자 — 종류별 기본 색 · 상자마다 바꾼 색(--cf-color) */ .m02-cfdg__box { position: absolute; display: flex; flex-direction: column; gap: var(--spacing-4); min-width: 11rem; max-width: 16rem; padding: 0 0 var(--spacing-8); border: 1px solid color-mix(in srgb, var(--cf-color) 55%, var(--color-border)); border-radius: var(--radius-lg); background: var(--color-surface); box-shadow: 0 1px 3px rgb(0 0 0 / 12%); cursor: pointer; } .m02-cfdg__box:focus-visible { outline: 2px solid var(--color-accent); outline-offset: 2px; } .m02-cfdg__box.is-selected { border: 2px solid var(--cf-color); box-shadow: 0 0 0 3px color-mix(in srgb, var(--cf-color) 22%, transparent); } .m02-cfdg__head { display: grid; grid-template-columns: 1fr auto; align-items: baseline; gap: 0 var(--spacing-8); padding: var(--spacing-4) var(--spacing-8); border-radius: var(--radius-lg) var(--radius-lg) 0 0; background: color-mix(in srgb, var(--cf-color) 16%, var(--color-surface)); cursor: move; } .m02-cfdg__kind { grid-column: 1; /* 어두운 화면은 종류 색을 밝게 섞음 */ color: color-mix(in srgb, var(--cf-color) 55%, var(--cfdg-lift, var(--cf-color))); font-size: var(--text-caption); font-weight: 600; } .m02-cfdg__unit { grid-column: 2; grid-row: 1; color: var(--color-text-secondary); font-size: var(--text-caption); } .m02-cfdg__name { grid-column: 1 / -1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .m02-cfdg__pills { display: flex; justify-content: space-between; gap: var(--spacing-8); padding: 0 var(--spacing-8); } .m02-cfdg__ins, .m02-cfdg__outs { display: flex; flex-direction: column; gap: var(--spacing-4); min-width: 0; } .m02-cfdg__outs { align-items: flex-end; } /* 알약 — 받는 파랑 · 내보내는 주황 · 빈 자리 회색 */ .m02-cfdg__pill { display: inline-flex; align-items: baseline; gap: var(--spacing-4); max-width: 9rem; padding: 0 var(--spacing-8); border: 1px solid var(--cfdg-in); border-radius: 999px; background: color-mix(in srgb, var(--cfdg-in) 12%, var(--color-surface)); color: var(--cfdg-in); font: inherit; font-size: var(--text-caption); cursor: pointer; white-space: nowrap; } .m02-cfdg__pill.is-out { border-color: var(--cfdg-out); background: color-mix(in srgb, var(--cfdg-out) 14%, var(--color-surface)); color: var(--cfdg-out); cursor: grab; touch-action: none; } .m02-cfdg__pill.is-empty { border-style: dashed; border-color: var(--color-text-muted); background: transparent; color: var(--color-text-muted); } .m02-cfdg__pill.is-chosen { box-shadow: 0 0 0 2px currentColor; } .m02-cfdg.is-linking .m02-cfdg__pill.is-target { box-shadow: 0 0 0 2px var(--cfdg-in); } .m02-cfdg__pill-name { overflow: hidden; text-overflow: ellipsis; } .m02-cfdg__pill-value { color: var(--color-text-secondary); font-variant-numeric: tabular-nums; } .m02-cfdg__pill-value:empty { display: none; } /* 선 — 굽은 선 */ .m02-cfdg__link { pointer-events: auto; cursor: pointer; } .m02-cfdg__hit { fill: none; stroke: transparent; stroke-width: 12; } .m02-cfdg__wire { fill: none; stroke: var(--color-text-muted); stroke-width: 1.5; } .m02-cfdg__link.is-strong .m02-cfdg__wire { stroke: var(--color-accent); stroke-width: 3; } .m02-cfdg__link.is-dim .m02-cfdg__wire { opacity: 0.25; } .m02-cfdg__drag { fill: none; stroke: var(--cfdg-out); stroke-width: 2; stroke-dasharray: 5 4; }