feat(M02-일위대가조합): 조합 다이어그램 - 로직별 넣을 값 → 로직 카드 → 비용 구분 칸 · 미리 보기와 값 한 벌 · 카드 누르면 단가산출 로직 화면
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01D2nUMUMTsqm93PbQtipo6c
This commit is contained in:
@@ -0,0 +1,311 @@
|
||||
.m02-labordg {
|
||||
--dg-노무비: #2f9e8f;
|
||||
--dg-재료비: #d98a1d;
|
||||
--dg-경비: #8a63d2;
|
||||
--dg-값: #7a8699;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: var(--spacing-8);
|
||||
font-size: var(--text-body-sm);
|
||||
color: var(--color-text-body);
|
||||
}
|
||||
|
||||
.m02-labordg__bar {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
align-items: center;
|
||||
gap: var(--spacing-8);
|
||||
}
|
||||
|
||||
.m02-labordg__zoom {
|
||||
min-width: 3em;
|
||||
font-weight: var(--font-weight-bold);
|
||||
}
|
||||
|
||||
.m02-labordg__hint {
|
||||
color: var(--color-text-muted);
|
||||
}
|
||||
|
||||
.m02-labordg__viewport {
|
||||
position: relative;
|
||||
height: clamp(320px, 62vh, 640px);
|
||||
border: 1px solid var(--color-border);
|
||||
border-radius: var(--radius-cards);
|
||||
background: var(--color-surface);
|
||||
overflow: hidden;
|
||||
cursor: default;
|
||||
}
|
||||
|
||||
.m02-labordg__viewport.is-space,
|
||||
.m02-labordg__viewport.is-panning {
|
||||
cursor: grab;
|
||||
}
|
||||
|
||||
.m02-labordg__viewport.is-panning {
|
||||
cursor: grabbing;
|
||||
}
|
||||
|
||||
.m02-labordg__world {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: max-content;
|
||||
transform-origin: 0 0;
|
||||
}
|
||||
|
||||
.m02-labordg__lines {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
.m02-labordg__grid {
|
||||
position: relative;
|
||||
display: grid;
|
||||
column-gap: 0;
|
||||
row-gap: 0;
|
||||
padding: var(--spacing-16);
|
||||
}
|
||||
|
||||
.m02-labordg__head {
|
||||
padding: var(--spacing-4) var(--spacing-8);
|
||||
font-weight: var(--font-weight-bold);
|
||||
}
|
||||
|
||||
.m02-labordg__head.is-bin,
|
||||
.m02-labordg__cell {
|
||||
border-left: 2px solid var(--dg-노무비);
|
||||
border-right: 2px solid var(--dg-노무비);
|
||||
}
|
||||
|
||||
.m02-labordg__head.is-bin {
|
||||
border-top: 2px solid var(--dg-노무비);
|
||||
border-radius: var(--radius-cards) var(--radius-cards) 0 0;
|
||||
text-align: center;
|
||||
background: color-mix(in srgb, var(--dg-노무비) 22%, var(--color-surface));
|
||||
}
|
||||
|
||||
.m02-labordg__cell {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
min-height: 4rem;
|
||||
padding: var(--spacing-4) var(--spacing-8);
|
||||
background: color-mix(in srgb, var(--dg-노무비) 8%, var(--color-surface));
|
||||
border-bottom: 1px solid var(--color-border);
|
||||
}
|
||||
|
||||
.m02-labordg__cell.is-total {
|
||||
border-bottom: 2px solid var(--dg-노무비);
|
||||
border-radius: 0 0 var(--radius-cards) var(--radius-cards);
|
||||
font-weight: var(--font-weight-bold);
|
||||
}
|
||||
|
||||
.m02-labordg__cell.is-zero {
|
||||
opacity: 0.45;
|
||||
}
|
||||
|
||||
.m02-labordg__cell-name {
|
||||
color: var(--color-text-secondary);
|
||||
}
|
||||
|
||||
.m02-labordg__cell-amount {
|
||||
font-weight: var(--font-weight-bold);
|
||||
}
|
||||
|
||||
.m02-labordg__head.is-재료비,
|
||||
.m02-labordg__cell.is-재료비 {
|
||||
border-color: var(--dg-재료비);
|
||||
}
|
||||
|
||||
.m02-labordg__head.is-재료비 {
|
||||
background: color-mix(in srgb, var(--dg-재료비) 22%, var(--color-surface));
|
||||
}
|
||||
|
||||
.m02-labordg__cell.is-재료비 {
|
||||
background: color-mix(in srgb, var(--dg-재료비) 8%, var(--color-surface));
|
||||
}
|
||||
|
||||
.m02-labordg__head.is-경비,
|
||||
.m02-labordg__cell.is-경비 {
|
||||
border-color: var(--dg-경비);
|
||||
}
|
||||
|
||||
.m02-labordg__head.is-경비 {
|
||||
background: color-mix(in srgb, var(--dg-경비) 22%, var(--color-surface));
|
||||
}
|
||||
|
||||
.m02-labordg__cell.is-경비 {
|
||||
background: color-mix(in srgb, var(--dg-경비) 8%, var(--color-surface));
|
||||
}
|
||||
|
||||
.m02-labordg__head.is-값,
|
||||
.m02-labordg__cell.is-값 {
|
||||
border-color: var(--dg-값);
|
||||
}
|
||||
|
||||
.m02-labordg__head.is-값 {
|
||||
background: color-mix(in srgb, var(--dg-값) 22%, var(--color-surface));
|
||||
}
|
||||
|
||||
.m02-labordg__cell.is-값 {
|
||||
background: color-mix(in srgb, var(--dg-값) 8%, var(--color-surface));
|
||||
}
|
||||
|
||||
/* 넣을 값 묶음 */
|
||||
.m02-labordg__group {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: stretch;
|
||||
justify-content: center;
|
||||
gap: var(--spacing-4);
|
||||
padding: var(--spacing-8);
|
||||
min-width: 13rem;
|
||||
}
|
||||
|
||||
.m02-labordg__pill {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
gap: var(--spacing-8);
|
||||
padding: 2px var(--spacing-8);
|
||||
border: 1px solid var(--color-border);
|
||||
border-radius: var(--radius-pills);
|
||||
background: var(--color-surface-raised);
|
||||
color: inherit;
|
||||
font: inherit;
|
||||
text-align: left;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.m02-labordg__pill.is-empty {
|
||||
border: 2px dashed var(--color-danger);
|
||||
}
|
||||
|
||||
.m02-labordg__pill.is-empty .m02-labordg__pill-value {
|
||||
color: var(--color-danger);
|
||||
font-weight: var(--font-weight-bold);
|
||||
}
|
||||
|
||||
.m02-labordg__pill-name {
|
||||
font-weight: var(--font-weight-medium);
|
||||
}
|
||||
|
||||
.m02-labordg__pill:focus-visible,
|
||||
.m02-labordg__card:focus-visible {
|
||||
outline: 2px solid var(--color-focus-ring);
|
||||
}
|
||||
|
||||
.m02-labordg__pill.is-hot {
|
||||
border-color: var(--color-primary);
|
||||
background: color-mix(in srgb, var(--color-primary) 18%, var(--color-surface));
|
||||
}
|
||||
|
||||
/* 로직 카드 — 둥근 카드 */
|
||||
.m02-labordg__card {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-self: center;
|
||||
gap: 2px;
|
||||
margin: var(--spacing-8) 0;
|
||||
padding: var(--spacing-8) var(--spacing-12);
|
||||
border: 2px solid var(--color-border);
|
||||
border-radius: 1.2rem;
|
||||
background: var(--color-surface-raised);
|
||||
color: inherit;
|
||||
font: inherit;
|
||||
text-align: left;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.m02-labordg__card:hover {
|
||||
border-color: var(--color-primary);
|
||||
}
|
||||
|
||||
.m02-labordg__card.is-stop {
|
||||
border-style: dashed;
|
||||
border-color: var(--color-danger);
|
||||
}
|
||||
|
||||
.m02-labordg__card-key {
|
||||
color: var(--color-text-muted);
|
||||
}
|
||||
|
||||
.m02-labordg__card-name {
|
||||
font-size: var(--text-body);
|
||||
}
|
||||
|
||||
.m02-labordg__card-unit {
|
||||
color: var(--color-text-secondary);
|
||||
}
|
||||
|
||||
.m02-labordg__card-out {
|
||||
margin-top: 2px;
|
||||
font-weight: var(--font-weight-bold);
|
||||
}
|
||||
|
||||
/* 선 */
|
||||
.m02-labordg__wire {
|
||||
fill: none;
|
||||
stroke: var(--color-border);
|
||||
stroke-width: 2;
|
||||
}
|
||||
|
||||
.m02-labordg__out {
|
||||
fill: none;
|
||||
stroke: var(--dg-노무비);
|
||||
stroke-width: 2.5;
|
||||
}
|
||||
|
||||
.m02-labordg__out.is-재료비 {
|
||||
stroke: var(--dg-재료비);
|
||||
}
|
||||
|
||||
.m02-labordg__out.is-경비 {
|
||||
stroke: var(--dg-경비);
|
||||
}
|
||||
|
||||
.m02-labordg__out.is-값 {
|
||||
stroke: var(--dg-값);
|
||||
}
|
||||
|
||||
.m02-labordg__out.is-zero {
|
||||
opacity: 0.2;
|
||||
}
|
||||
|
||||
.m02-labordg__same {
|
||||
fill: none;
|
||||
stroke: var(--color-text-muted);
|
||||
stroke-width: 1.5;
|
||||
stroke-dasharray: 4 4;
|
||||
opacity: 0.55;
|
||||
}
|
||||
|
||||
.m02-labordg__same.is-hot {
|
||||
stroke: var(--color-primary);
|
||||
stroke-width: 2.5;
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.m02-labordg__none {
|
||||
margin: var(--spacing-16);
|
||||
color: var(--color-text-muted);
|
||||
}
|
||||
|
||||
/* 다이어그램에서 눌러 찾아온 미리 보기 입력 칸 */
|
||||
.m02-labor__flash {
|
||||
outline: 3px solid var(--color-primary);
|
||||
outline-offset: 2px;
|
||||
animation: m02-labor-flash 0.4s ease-in-out 3;
|
||||
}
|
||||
|
||||
@keyframes m02-labor-flash {
|
||||
50% {
|
||||
outline-color: transparent;
|
||||
}
|
||||
}
|
||||
|
||||
.m02-labor__dg > summary {
|
||||
cursor: pointer;
|
||||
font-weight: var(--font-weight-bold);
|
||||
}
|
||||
Reference in New Issue
Block a user