Files
Aislo/M02_MasterTemplete/M02_MasterTemplete_Labor_Diagram.css
T
eomsangdonandClaude Opus 5.5 d847f724cf feat(M02): 일위대가 상세 부품 — 담은 로직 표 · 입력 모달 · 자재목록 표 · 다이어그램 calc 값 · 미리 보기 지움(39-3 C3 · C4 · C6)
- 새 Labor_Detail.ts(mountLaborDetail · 차례 = 정보 → 담은 로직 → 자재목록 → 다이어그램 · 고칠 때마다 calc 를 뒤에서 · 최신 답만 · 같은 로직 · 자재 두 번 막음)
- 새 Labor_Input.ts(담은 로직 줄 입력 모달 · 빈 칸 = 자동값 · 메모 · 수량 = 이은 칸 / 손 입력 / 면적산출에서 잇기 · 사라진 입력값 알림 · 자재 수량 모달)
- 새 Labor_Rows.ts(작은 글 「지역 서울 · 수량 B6 = 12.5㎡」 · 빈 값 n 붉게 · 금액 칸 넷 두 줄(위 기준 · 아래 반영) · 합계 줄 · 보기 갈래는 손잡이 없이)
- Labor_Api.ts: labor 문서 · calc 답 모양 · calcLabor · fetchLogicInputs · previewCombo 지움
- Labor_Diagram.ts: buildDiagramData → buildLaborDiagram(줄 입력값 + calc · 수량 있으면 반영 · 없으면 기준 표기 · 자재목록 카드 하나 → 재료비 · 알약 = 입력 모달)
- 미리 보기 지움: Labor_Preview.ts · M02 preview 길 · Combo_Store.preview · 옛 조합 상세의 미리 보기 · 다이어그램 칸
- 시험: test_m02_labor_diagram 새 모양 · test_m01_combo 미리 보기 시험은 같은 계산(combo_preview)을 바로 부름

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MgChuAcyBqUkhHMTXomQC7
2026-10-04 17:42:59 +09:00

322 lines
6.5 KiB
CSS

.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);
}
/* 39-3 — 자동값 알약(넣은 값 없음 · 기울임) · 자재목록 카드(누름 없음) */
.m02-labordg__pill.is-auto .m02-labordg__pill-value {
font-style: italic;
color: var(--color-text-secondary);
}
.m02-labordg__card.is-material {
cursor: default;
}