/* ontic-ui 부품 v0.3 — 이름 o-*, 토큰만 쓴다(숫자 색 금지). 부품 목록 · 쓰는 법 = registry.json, 원칙 = DESIGN.md 밀도(실측 근거 DESIGN.md): 본문 13px · 컨트롤 28px · 표 줄 32px · 모서리 4. 깊이: 면은 선만, 떠 있는 층만 --lift. 서명: 청연필(후보, --draft 점선) → 먹(확정, --ink 실선) → 인주(결재, --seal 도장). 붉은색은 도장 모양에만. */ /* ── 도장 · 결재란 — 서명 요소 ─────────────────────────────── */ /* 도장: 사람이 결재했다는 표시. 이름 앞 두 글자를 인주 테두리 안에 새긴다. 크기 --sm 16 · 기본 22 · --lg 36 */ .o-seal{display:inline-grid;place-items:center;flex:none;width:22px;height:22px;border:1.5px solid var(--seal);border-radius:var(--r-1);color:var(--seal);background:var(--paper);font:700 9px/1 var(--sans);letter-spacing:-.04em;writing-mode:horizontal-tb;transform:rotate(-4deg);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--seal) 18%,transparent)} .o-seal--sm{width:16px;height:16px;font-size:0;border-width:1.5px} .o-seal--sm::after{content:"";width:6px;height:6px;background:var(--seal);border-radius:1px} .o-seal--lg{width:36px;height:36px;font-size:13px;border-width:2px} .o-seal--void{border-style:dashed;border-color:var(--void);color:var(--void);transform:none;box-shadow:none} /* 결재란: 제안 → 검토 → 결재 칸. 칸마다 역할 · 도장 또는 대기 · 시각 */ .o-approval{display:inline-grid;grid-auto-flow:column;grid-auto-columns:minmax(64px,auto);border:1px solid var(--rule-2);border-radius:var(--r-2);background:var(--paper);overflow:hidden;font-size:var(--t-11)} .o-approval__cell{display:grid;grid-template-rows:20px 36px 16px;justify-items:center;align-items:center;border-left:1px solid var(--rule-2);padding:0 var(--s-2) 2px} .o-approval__cell:first-child{border-left:0} .o-approval__role{width:calc(100% + var(--s-4));height:20px;display:grid;place-items:center;background:var(--well);border-bottom:1px solid var(--rule-2);color:var(--pencil);font-weight:500} .o-approval__who{font:500 var(--t-11) var(--sans);color:var(--graphite)} .o-approval__when{font:400 10px var(--mono);color:var(--faint)} .o-approval__wait{width:22px;height:22px;border:1.5px dashed var(--draft);border-radius:var(--r-1)} .o-approval__agent{font:600 10px var(--mono);letter-spacing:.06em;color:var(--draft)} /* ── 머리띠 ─────────────────────────────────────────────── */ .o-topbar{position:sticky;top:0;z-index:20;height:var(--bar);display:flex;align-items:center;gap:var(--s-5);padding:0 var(--s-4);background:color-mix(in srgb,var(--paper) 92%,transparent);backdrop-filter:saturate(1.4) blur(10px);border-bottom:1px solid var(--rule)} .o-wordmark{display:inline-flex;align-items:center;gap:8px;font:700 var(--t-13)/1 var(--mono);letter-spacing:.16em;color:var(--ink);text-decoration:none;flex:none} .o-wordmark::before{content:"";width:12px;height:12px;border:2px solid var(--seal);border-radius:2px;transform:rotate(-4deg);background:linear-gradient(var(--seal),var(--seal)) center/4px 4px no-repeat} .o-topbar__nav{display:flex;gap:var(--s-5);font-size:var(--t-13)} .o-topbar__nav a{color:var(--graphite);text-decoration:none}.o-topbar__nav a:hover{color:var(--ink)} .o-topbar__end{margin-left:auto;display:flex;align-items:center;gap:var(--s-3);opacity:0;transition:opacity var(--d-2) var(--ease)} .o-topbar__end.is-ready{opacity:1} .o-who{font:400 var(--t-12) var(--mono);color:var(--pencil);max-width:220px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap} /* ── 버튼 ─────────────────────────────────────────────── */ .o-btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;height:var(--h-md);padding:0 10px;border-radius:var(--r-2);border:1px solid transparent;font:500 var(--t-13)/1 var(--sans);letter-spacing:-.005em;white-space:nowrap;text-decoration:none;cursor:pointer;transition:background-color var(--d-1) var(--ease),border-color var(--d-1) var(--ease),color var(--d-1) var(--ease),transform var(--d-1) var(--ease)} .o-btn:active{transform:translateY(1px)} .o-btn:disabled,.o-btn[aria-disabled=true]{opacity:.42;cursor:not-allowed;transform:none} .o-btn--primary{background:var(--ink);color:var(--paper)}.o-btn--primary:hover:not(:disabled){background:var(--graphite)} .o-btn--secondary{background:var(--paper);color:var(--ink);border-color:var(--rule-2);box-shadow:0 1px 0 var(--rule)}.o-btn--secondary:hover:not(:disabled){border-color:var(--rule-3)} .o-btn--ghost{background:transparent;color:var(--graphite)}.o-btn--ghost:hover:not(:disabled){background:var(--well);color:var(--ink)} /* 결재 버튼: 누르면 기록이 남는다 — 먹 바탕 + 인주 도장 표시 */ .o-btn--seal{background:var(--ink);color:var(--paper)} .o-btn--seal::before{content:"";width:10px;height:10px;border:1.5px solid var(--seal);border-radius:2px;background:linear-gradient(var(--seal),var(--seal)) center/4px 4px no-repeat;transform:rotate(-4deg)} .o-btn--seal:hover:not(:disabled){background:var(--graphite)} /* 후보를 정하러 가는 버튼: 청연필 */ .o-btn--draft{background:var(--draft-wash);color:var(--draft-ink);border-color:color-mix(in srgb,var(--draft) 30%,transparent)}.o-btn--draft:hover:not(:disabled){border-color:var(--draft)} .o-btn--danger{background:var(--paper);color:var(--alert);border-color:color-mix(in srgb,var(--alert) 30%,transparent)}.o-btn--danger:hover:not(:disabled){background:var(--alert-wash)} .o-btn--sm{height:var(--h-sm);padding:0 8px;font-size:var(--t-12)} .o-btn--lg{height:var(--h-xl);padding:0 var(--s-4);font-size:var(--t-14)} .o-btn--link{height:auto;padding:2px 4px;background:none;color:var(--draft-ink);font-size:var(--t-12)}.o-btn--link:hover{text-decoration:underline} /* ── 입력 ─────────────────────────────────────────────── */ .o-input,.o-textarea,.o-select{width:100%;min-height:var(--h-md);padding:0 9px;border-radius:var(--r-2);border:1px solid var(--rule-2);background:var(--paper);color:var(--ink);font-size:var(--t-13);box-shadow:inset 0 1px 0 var(--rule);transition:border-color var(--d-1) var(--ease),box-shadow var(--d-1) var(--ease)} .o-textarea{padding:6px 9px;line-height:1.5;resize:vertical} .o-select{padding-right:26px;appearance:none;background-image:linear-gradient(45deg,transparent 50%,var(--pencil) 50%),linear-gradient(135deg,var(--pencil) 50%,transparent 50%);background-position:calc(100% - 13px) 52%,calc(100% - 9px) 52%;background-size:4px 4px;background-repeat:no-repeat;cursor:pointer} .o-input::placeholder,.o-textarea::placeholder{color:var(--faint)} .o-input:hover,.o-textarea:hover,.o-select:hover{border-color:var(--rule-3)} .o-input:focus,.o-textarea:focus,.o-select:focus{outline:0;border-color:var(--draft);box-shadow:0 0 0 3px var(--draft-wash)} .o-search{position:relative;display:block}.o-search .o-input{padding-left:28px;padding-right:32px;background:var(--well);border-color:transparent;box-shadow:none} .o-search::before{content:"";position:absolute;left:9px;top:50%;width:9px;height:9px;margin-top:-6px;border:1.5px solid var(--pencil);border-radius:50%;pointer-events:none} .o-search::after{content:"";position:absolute;left:17px;top:50%;width:2px;height:2px;margin-top:2px;background:var(--pencil);box-shadow:1px 1px 0 var(--pencil),2px 2px 0 var(--pencil);pointer-events:none} .o-search .o-input:focus{background:var(--paper);border-color:var(--draft)} .o-kbd{display:inline-grid;place-items:center;min-width:18px;height:18px;padding:0 4px;border-radius:var(--r-1);border:1px solid var(--rule-2);border-bottom-width:2px;background:var(--paper);font:500 var(--t-11) var(--mono);color:var(--pencil)} .o-search .o-kbd{position:absolute;right:6px;top:50%;transform:translateY(-50%)} /* ── 칩 — 청연필(후보) → 먹(확정) → 인주(결재) ─────────────── */ .o-chips{display:flex;flex-wrap:wrap;gap:4px;align-items:center} .o-chip{display:inline-flex;align-items:center;gap:5px;height:20px;padding:0 6px;border-radius:var(--r-1);border:1px solid var(--rule-2);background:var(--paper);color:var(--graphite);font:500 var(--t-11)/1 var(--sans);white-space:nowrap} .o-chip--dom{background:var(--well);border-color:transparent;color:var(--graphite)} .o-chip--key{border-color:var(--ink);color:var(--ink);font:600 10px/1 var(--mono);letter-spacing:.04em;height:18px;padding:0 4px} .o-chip--fk{color:var(--graphite);font:500 var(--t-11)/1 var(--mono)} .o-chip--draft{border:1px dashed var(--draft);background:var(--draft-wash);color:var(--draft-ink)} .o-chip--seal{border-color:var(--rule-2);color:var(--ink)} .o-chip--seal::before{content:"";width:8px;height:8px;border:1.5px solid var(--seal);border-radius:1px;background:linear-gradient(var(--seal),var(--seal)) center/3px 3px no-repeat;transform:rotate(-4deg)} .o-chip--void{border:1px dotted var(--void);color:var(--pencil);text-decoration:line-through;text-decoration-color:var(--void)} .o-chip--tag{background:var(--well);border-color:transparent;color:var(--graphite)}.o-chip--tag::before{content:"#";color:var(--faint)} .o-chip--owner{border-radius:999px;font:500 var(--t-11)/1 var(--mono)} .o-chip--masked{height:16px;padding:0 4px;border-color:transparent;background:var(--alert-wash);color:var(--alert);font-size:10px} /* ── 글 · 경로 · 상태 문구 ──────────────────────────────── */ .o-label{display:block;font:500 var(--t-11)/1.4 var(--sans);color:var(--pencil);letter-spacing:.01em} .o-muted{color:var(--pencil);font-size:var(--t-12)} .o-crumbs{display:flex;flex-wrap:wrap;align-items:center;gap:4px;font:400 var(--t-11) var(--mono);color:var(--pencil)} .o-crumbs__sep{color:var(--faint)} .o-desc{color:var(--graphite);font-size:var(--t-12);display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden} .o-empty{padding:var(--s-8) var(--s-4);text-align:center;color:var(--pencil);font-size:var(--t-12)} .o-empty strong{display:block;color:var(--ink);font-weight:600;font-size:var(--t-13);margin-bottom:2px} .o-alert{display:flex;flex-direction:column;gap:2px;padding:10px var(--s-3);border-radius:var(--r-2);border:1px solid var(--rule-2);border-left:3px solid var(--graphite);background:var(--paper);font-size:var(--t-12)} .o-alert strong{font-weight:600;font-size:var(--t-13)} .o-alert--error{border-color:color-mix(in srgb,var(--alert) 25%,transparent);border-left-color:var(--alert);background:var(--alert-wash);color:var(--alert)} .o-alert--error strong{color:var(--alert)} /* ── 면 · 머리 ─────────────────────────────────────────── */ .o-panel{background:var(--paper);border:1px solid var(--rule);border-radius:var(--r-3);padding:var(--s-3) var(--s-4) var(--s-4)} .o-panel__head{display:flex;align-items:baseline;justify-content:space-between;gap:var(--s-3);min-height:28px;margin:0 0 var(--s-2);border-bottom:1px solid var(--rule)} .o-panel__title{font-size:var(--t-12);font-weight:650;color:var(--graphite);letter-spacing:.01em} .o-pagehead{display:flex;flex-direction:column;gap:2px;margin-bottom:var(--s-5)} .o-pagehead__title{font-size:var(--t-20);letter-spacing:-.02em;line-height:1.25;font-weight:700} .o-pagehead__lead{color:var(--pencil);font-size:var(--t-12);max-width:720px} .o-entity{padding:0 0 var(--s-4);border-bottom:1px solid var(--rule)} .o-entity__title{margin:4px 0 var(--s-2);font:600 var(--t-24)/1.15 var(--mono);letter-spacing:-.02em;overflow-wrap:anywhere} .o-entity__facts{display:flex;flex-wrap:wrap;gap:0;margin-top:var(--s-3);border:1px solid var(--rule);border-radius:var(--r-2);background:var(--paper)} .o-entity__facts>*{padding:6px var(--s-3);border-left:1px solid var(--rule);font-size:var(--t-11);color:var(--pencil)} .o-entity__facts>*:first-child{border-left:0} .o-entity__facts strong{display:block;font:600 var(--t-14) var(--mono);color:var(--ink);font-variant-numeric:tabular-nums} /* ── 숫자 — 카드 대신 장부의 한 칸 ───────────────────────── */ .o-stat{display:flex;flex-direction:column;gap:0;padding:var(--s-2) var(--s-4) var(--s-2) 0;color:var(--ink);text-decoration:none;border-right:1px solid var(--rule)} .o-stat:last-child{border-right:0} a.o-stat:hover .o-stat__value{color:var(--draft-ink)} .o-stat__label{font:500 var(--t-11) var(--sans);color:var(--pencil)} .o-stat__value{font:600 var(--t-24)/1.15 var(--mono);letter-spacing:-.04em;font-variant-numeric:tabular-nums;margin-top:2px;transition:color var(--d-1)} .o-stat__meta{font-size:var(--t-11);color:var(--pencil)} /* 진행 막대: 결재된 몫(먹) · 남은 후보(청연필 빗금) */ .o-progress{display:flex;height:6px;border-radius:1px;overflow:hidden;background:repeating-linear-gradient(-45deg,var(--draft-wash) 0 3px,color-mix(in srgb,var(--draft) 28%,var(--draft-wash)) 3px 4px)} .o-progress__done{background:var(--ink)} /* ── 정할 것 대기열 — 홈의 초점 ──────────────────────────── */ .o-queue{display:flex;flex-direction:column;border:1px solid var(--rule);border-radius:var(--r-3);background:var(--paper);overflow:hidden} .o-queue__head{display:grid;grid-template-columns:1fr auto;align-items:end;gap:var(--s-2) var(--s-4);padding:var(--s-4) var(--s-4) var(--s-3)} .o-queue__count{font:600 var(--t-48)/.9 var(--mono);letter-spacing:-.06em;color:var(--draft-ink);font-variant-numeric:tabular-nums} .o-queue__count small{margin-left:6px;font:500 var(--t-13) var(--sans);letter-spacing:0;color:var(--pencil)} .o-queue__lead{grid-column:1/-1;font-size:var(--t-12);color:var(--pencil);max-width:560px} .o-queue__head .o-progress{grid-column:1/-1} .o-queue__row{display:grid;grid-template-columns:minmax(0,1fr) 72px 120px auto;align-items:center;gap:var(--s-3);min-height:40px;padding:0 var(--s-4);border-top:1px solid var(--rule);font-size:var(--t-12);color:var(--pencil)} .o-queue__row:hover{background:color-mix(in srgb,var(--draft-wash) 45%,transparent)} .o-queue__name{font:500 var(--t-13) var(--mono);color:var(--ink);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-decoration:none}a.o-queue__name:hover{text-decoration:underline} .o-queue__n{font:600 var(--t-13) var(--mono);color:var(--draft-ink);text-align:right;font-variant-numeric:tabular-nums} /* ── 결과 줄 · 사실 목록 · 순위 목록 ──────────────────────── */ /* 결과 한 줄: 카드가 아니라 장부의 줄. 고른 줄은 왼쪽 먹 띠 */ .o-result{position:relative;display:grid;grid-template-columns:minmax(0,1fr) auto;gap:1px var(--s-3);width:100%;text-align:left;padding:7px var(--s-3) 7px var(--s-4);background:var(--paper);border:0;border-bottom:1px solid var(--rule);border-radius:0;color:var(--ink);cursor:pointer;transition:background-color var(--d-1) var(--ease)} .o-result:hover{background:var(--desk)} .o-result.is-active{background:var(--draft-wash)} .o-result.is-active::before{content:"";position:absolute;left:0;top:0;bottom:0;width:3px;background:var(--ink)} .o-result>.o-crumbs{grid-column:1/-1;order:2} .o-result__name{font:500 var(--t-13) var(--mono);overflow:hidden;text-overflow:ellipsis;white-space:nowrap} .o-result__meta{font-size:var(--t-11);color:var(--pencil);text-align:right;white-space:nowrap;align-self:center} .o-result__match{grid-column:1/-1;order:3;font:400 var(--t-11) var(--mono);color:var(--draft-ink)} .o-result>.o-desc,.o-result>.o-chips{grid-column:1/-1;order:4} .o-facts{display:grid;grid-template-columns:max-content 1fr;gap:0 var(--s-4);margin:0;font-size:var(--t-12)} .o-facts dt,.o-facts dd{padding:5px 0;border-bottom:1px solid var(--rule)} .o-facts dt{color:var(--pencil)}.o-facts dd{margin:0;overflow-wrap:anywhere} .o-rank{list-style:none;margin:0;padding:0} .o-rank li{display:flex;justify-content:space-between;align-items:center;gap:var(--s-3);min-height:30px;border-top:1px solid var(--rule);font-size:var(--t-12)} .o-rank li:first-child{border-top:0} .o-rank a{font-family:var(--mono);text-decoration:none}.o-rank a:hover{text-decoration:underline} /* ── 탭 ─────────────────────────────────────────────── */ .o-tabs{display:flex;gap:var(--s-4);border-bottom:1px solid var(--rule);overflow-x:auto;scrollbar-width:none} .o-tabs a{position:relative;display:inline-flex;align-items:center;gap:5px;height:36px;color:var(--pencil);text-decoration:none;font-size:var(--t-13);font-weight:500;white-space:nowrap} .o-tabs a:hover{color:var(--ink)} .o-tabs a[aria-selected=true]{color:var(--ink);font-weight:600} .o-tabs a[aria-selected=true]::after{content:"";position:absolute;left:0;right:0;bottom:-1px;height:2px;background:var(--ink)} .o-tabs__count{font:500 var(--t-11) var(--mono);color:var(--faint)} /* ── 표 ─────────────────────────────────────────────── */ .o-table-wrap{overflow-x:auto} .o-table{width:100%;border-collapse:collapse;font-size:var(--t-12)} .o-table th{height:var(--row-head);padding:0 var(--s-3);text-align:left;font:600 var(--t-11) var(--sans);color:var(--pencil);background:var(--desk);border-top:1px solid var(--rule);border-bottom:1px solid var(--rule-2);white-space:nowrap} .o-table th:first-child{padding-left:var(--s-2)} .o-table td{height:var(--row);padding:4px var(--s-3);border-bottom:1px solid var(--rule);vertical-align:middle;overflow-wrap:anywhere} .o-table td:first-child{padding-left:var(--s-2)} .o-table tbody tr:hover td{background:var(--desk)} .o-table .is-ok{color:var(--ok);font-weight:500}.o-table .is-no{color:var(--alert)} .o-table--sample td{white-space:nowrap;max-width:240px;overflow:hidden;text-overflow:ellipsis;font:400 var(--t-11) var(--mono)} .o-table--sample td,.o-table--sample th{border-right:1px solid var(--rule)} .o-cell-null{color:var(--faint);font-style:italic} .o-cell-masked{color:var(--alert);letter-spacing:.15em} /* ── 연결 줄(표 사이 연결 하나) ────────────────────────── */ .o-edge{display:grid;grid-template-columns:1fr auto;gap:2px var(--s-3);align-items:center;padding:10px 0;border-bottom:1px solid var(--rule)} .o-edge:last-child{border-bottom:0} .o-edge__path{font:500 var(--t-12) var(--mono);overflow-wrap:anywhere} .o-edge__why{grid-column:1/-1;font-size:var(--t-11);color:var(--pencil)} .o-edge__said{grid-column:1/-1;font-size:var(--t-12);color:var(--graphite)} .o-edge__said::before{content:"“";color:var(--faint)}.o-edge__said::after{content:"”";color:var(--faint)} .o-edge__actions{grid-column:1/-1;display:flex;gap:var(--s-2);margin-top:4px} /* ── 결정 장부 — 누가 · 언제 · 무슨 말로 · 도장 ───────────── */ .o-ledger{list-style:none;margin:0;padding:0} .o-ledger__item{position:relative;display:grid;grid-template-columns:88px minmax(0,1fr) 28px;gap:1px var(--s-3);padding:10px 0;border-top:1px solid var(--rule)} .o-ledger__item:first-child{border-top:0} .o-ledger__time{grid-row:1/span 3;font:400 var(--t-11)/1.7 var(--mono);color:var(--pencil)} .o-ledger__what{display:flex;align-items:center;gap:var(--s-2);font:500 var(--t-12) var(--mono);overflow-wrap:anywhere} .o-ledger__said{font-size:var(--t-12);color:var(--graphite)} .o-ledger__said::before{content:"“";color:var(--faint)}.o-ledger__said::after{content:"”";color:var(--faint)} .o-ledger__by{font:400 var(--t-11) var(--mono);color:var(--pencil)} .o-ledger__what,.o-ledger__said,.o-ledger__by{grid-column:2} .o-ledger__item>.o-seal{grid-column:3;grid-row:1/span 2;align-self:start} .o-ledger__item--approved .o-ledger__what::before{content:"";flex:none;width:16px;border-top:2px solid var(--ink)} .o-ledger__item--rejected .o-ledger__what{color:var(--pencil);text-decoration:line-through;text-decoration-color:var(--void)} .o-ledger__item--rejected .o-ledger__what::before{content:"";flex:none;width:16px;border-top:2px dotted var(--void)} .o-ledger__item--edit .o-ledger__what::before{content:"";flex:none;width:8px;height:8px;border-radius:1px;background:var(--well);border:1px solid var(--rule-3)} /* ── 범례 ─────────────────────────────────────────────── */ .o-legend{display:flex;flex-wrap:wrap;gap:var(--s-4);font-size:var(--t-11);color:var(--graphite)} .o-legend__item{display:inline-flex;align-items:center;gap:6px} .o-legend__item::before{content:"";width:20px;border-top:1.5px solid var(--graphite)} .o-legend__item[data-kind=candidate]::before{border-top:2px dashed var(--draft)} .o-legend__item[data-kind=approved]::before{width:20px;height:8px;border-top:0;background:linear-gradient(var(--ink),var(--ink)) 0 50%/100% 2px no-repeat,linear-gradient(var(--seal),var(--seal)) 50% 50%/6px 6px no-repeat} .o-legend__item[data-kind=rejected]::before{border-top:2px dotted var(--void)} .o-legend__item[data-kind=use]::before{border-top:1px solid var(--rule-3)} /* ── 설명 · 소유자 · 태그 ─────────────────────────────── */ .o-meta{display:flex;flex-direction:column} .o-meta__row{display:grid;grid-template-columns:64px minmax(0,1fr) auto;gap:var(--s-3);align-items:start;padding:5px 0;border-bottom:1px solid var(--rule)} .o-meta__row:last-child{border-bottom:0} .o-meta__label{font:500 var(--t-11)/20px var(--sans);color:var(--pencil)} .o-meta__value{display:flex;flex-wrap:wrap;gap:4px;align-items:center;min-height:20px;font-size:var(--t-13)} .o-meta__value p{white-space:pre-wrap;max-width:720px;color:var(--ink)} .o-meta__empty{color:var(--faint);font-size:var(--t-12)} .o-edit{display:flex;flex-wrap:wrap;gap:var(--s-2);align-items:flex-start;padding:5px 0} .o-edit .o-input,.o-edit .o-textarea{flex:1 1 320px;width:auto} .o-edit__err{flex-basis:100%;color:var(--alert);font-size:var(--t-11)}.o-edit__err:empty{display:none} /* ── 왼쪽 메뉴 · 탐색 트리 ─────────────────────────────── */ .o-nav{display:flex;flex-direction:column;gap:1px} .o-nav a{position:relative;display:flex;align-items:center;gap:8px;height:var(--h-md);padding:0 10px;border-radius:var(--r-2);color:var(--graphite);text-decoration:none;font-size:var(--t-13);font-weight:500} .o-nav a:hover{background:var(--well);color:var(--ink)} .o-nav a[aria-current=true]{background:var(--paper);color:var(--ink);font-weight:600;box-shadow:0 0 0 1px var(--rule-2),0 1px 0 var(--rule-2)} .o-tree{display:flex;flex-direction:column;gap:0;font-size:var(--t-12)} .o-tree__group{margin:var(--s-4) 8px var(--s-1);font:600 var(--t-11) var(--sans);color:var(--faint);letter-spacing:.02em} .o-tree__group:first-child{margin-top:0} .o-tree__item{display:flex;justify-content:space-between;gap:var(--s-2);height:26px;align-items:center;padding:0 8px;border-radius:var(--r-2);color:var(--graphite);text-decoration:none} .o-tree__item span:first-child{overflow:hidden;text-overflow:ellipsis;white-space:nowrap} .o-tree__item:hover{background:var(--well);color:var(--ink)} .o-tree__item.is-active{background:var(--well-hover);color:var(--ink);font-weight:600}.o-tree__item.is-active .o-tree__count{color:var(--graphite)} .o-tree__count{font:400 var(--t-11) var(--mono);color:var(--faint);font-variant-numeric:tabular-nums} /* ── 도구 줄 · 규칙 한 줄 ──────────────────────────────── */ .o-toolbar{display:flex;flex-wrap:wrap;align-items:center;gap:var(--s-2) var(--s-4);margin-bottom:var(--s-2);font-size:var(--t-12);color:var(--graphite)} .o-toolbar label{display:inline-flex;align-items:center;gap:6px;cursor:pointer} .o-toolbar input[type=checkbox]{accent-color:var(--ink);width:13px;height:13px} .o-toolbar .o-legend{margin-left:auto} .o-code-row{display:block;margin-top:6px;padding:5px 9px;border-radius:var(--r-2);background:var(--well);font:400 var(--t-11) var(--mono);color:var(--graphite);overflow-wrap:anywhere} /* ── 계보 캔버스(lineage.js) — 모눈 위 도면. 선은 청연필 → 먹, 결재된 선 가운데 인주 ── */ .o-canvas{position:relative;height:min(62dvh,560px);border:1px solid var(--rule);border-radius:var(--r-3);overflow:hidden;background:var(--paper)} .o-canvas--tall{height:min(74dvh,760px)} .lg{background-image:linear-gradient(color-mix(in srgb,var(--draft) 7%,transparent) 1px,transparent 1px),linear-gradient(90deg,color-mix(in srgb,var(--draft) 7%,transparent) 1px,transparent 1px);background-size:24px 24px;touch-action:none} .lg-svg{display:block;width:100%;height:100%;cursor:grab;user-select:none}.lg-svg.grabbing{cursor:grabbing} .lg-colhead{font:600 10.5px var(--mono);fill:var(--faint);letter-spacing:.08em} .lg-card{fill:var(--paper);stroke:var(--rule-3);stroke-width:1} .lg-bar{fill:var(--rule-3)} .lg-kind{font:500 10px var(--sans);fill:var(--pencil)} .lg-title{font:500 12.5px var(--mono);fill:var(--ink)} .lg-sub{font:400 10.5px var(--sans);fill:var(--pencil)} .lg-node{cursor:pointer;outline:0} .lg-node:hover .lg-card{stroke:var(--ink)} .lg-node:focus-visible .lg-card{stroke:var(--draft);stroke-width:2} .lg-node.domain .lg-card{fill:var(--ink);stroke:var(--ink)}.lg-node.domain .lg-bar{fill:var(--seal)}.lg-node.domain .lg-title{fill:var(--paper);font-family:var(--sans);font-weight:650}.lg-node.domain .lg-kind,.lg-node.domain .lg-sub{fill:var(--faint)} .lg-node.project .lg-bar{fill:var(--graphite)}.lg-node.project .lg-title{font-family:var(--sans);font-weight:650} .lg-node.service .lg-bar{fill:var(--rule-3)} .lg-node.store .lg-bar,.lg-node.table .lg-bar{fill:var(--graphite)} .lg-node.todo .lg-card{stroke:var(--draft);stroke-dasharray:5 3}.lg-node.todo .lg-bar{fill:var(--draft)} .lg-node.focus .lg-card{stroke:var(--ink);stroke-width:2}.lg-node.focus .lg-bar{fill:var(--ink)} .lg-node.more .lg-card{fill:var(--desk);stroke-dasharray:3 3}.lg-node.more .lg-title{font-family:var(--sans);font-weight:650} .lg-line{fill:none;stroke-width:1.25;transition:opacity var(--d-1)} .lg-hit{fill:none;stroke:transparent;stroke-width:12}.lg-edge.click .lg-hit{cursor:pointer} .lg-edge.use .lg-line{stroke:var(--rule-3)}.lg-head.use{fill:var(--rule-3)} .lg-edge.fk .lg-line{stroke:var(--graphite)}.lg-head.fk{fill:var(--graphite)} .lg-edge.candidate .lg-line{stroke:var(--draft);stroke-dasharray:5 4;stroke-width:1.5}.lg-head.candidate{fill:var(--draft)} .lg-edge.approved .lg-line{stroke:var(--ink);stroke-width:2}.lg-head.approved{fill:var(--ink)} .lg-stamp{fill:var(--paper);stroke:var(--seal);stroke-width:1.5}.lg-stamp-dot{fill:var(--seal)} .lg-edge.rejected .lg-line{stroke:var(--void);stroke-dasharray:2 4}.lg-head.rejected{fill:var(--void)} .lg-edge.dim .lg-line{opacity:.14}.lg-edge.hot .lg-line{stroke-width:2.5} .lg-tools{position:absolute;right:var(--s-3);bottom:var(--s-3);display:flex;gap:2px;padding:3px;background:var(--paper);border-radius:var(--r-3);box-shadow:var(--lift)} .lg-tools button{min-width:28px;height:24px;padding:0 7px;border:0;border-radius:var(--r-2);background:none;font:500 var(--t-11) var(--sans);color:var(--graphite);cursor:pointer} .lg-tools button:hover{background:var(--well);color:var(--ink)} .lg-hint{position:absolute;left:var(--s-4);bottom:var(--s-3);margin:0;font-size:var(--t-11);color:var(--faint)} @media(max-width:720px){ .o-topbar{gap:var(--s-3);padding:0 var(--s-3)}.o-topbar__nav,.o-who{display:none} .o-meta__row{grid-template-columns:1fr auto}.o-meta__label{grid-column:1/-1;line-height:1.4} .o-ledger__item{grid-template-columns:1fr 28px}.o-ledger__time{grid-row:auto;grid-column:1}.o-ledger__what,.o-ledger__said,.o-ledger__by{grid-column:1}.o-ledger__item>.o-seal{grid-column:2;grid-row:1} .o-queue__row{grid-template-columns:minmax(0,1fr) auto auto;padding:6px var(--s-3)}.o-queue__row .o-progress{display:none} .o-stat{padding-right:var(--s-3)}.o-stat:nth-child(2n){border-right:0} .o-canvas,.o-canvas--tall{height:68dvh} } /* ── 앱 틀(v0.4): 왼쪽 사이드바 + 바탕 위에 뜬 본문 패널 + 떠 있는 창 ───────────────────────── 사이드바는 바탕(desk) 위에 그대로 두고, 일하는 면만 종이(paper) 한 장으로 띄운다. 머리는 패널 안 얇은 줄 하나. */ .o-icon{width:16px;height:16px;flex:none;color:currentColor} .o-shell{display:grid;grid-template-columns:232px minmax(0,1fr);height:100dvh;background:var(--desk);overflow:hidden} .o-side{display:flex;flex-direction:column;gap:2px;min-height:0;padding:var(--s-2) var(--s-2) var(--s-2) var(--s-3);overflow:auto} .o-side__brand{display:flex;align-items:center;gap:8px;height:var(--h-xl);padding:0 6px;border-radius:var(--r-2)} .o-side__brand .o-wordmark{flex:none} .o-side__scope{position:relative;flex:1;min-width:0;display:flex;align-items:center} .o-side__scope select{appearance:none;width:100%;height:var(--h-md);padding:0 22px 0 8px;border:0;border-radius:var(--r-2);background:transparent;font:500 var(--t-12) var(--sans);color:var(--pencil);text-overflow:ellipsis;cursor:pointer} .o-side__scope select:hover{background:var(--well-hover);color:var(--ink)} .o-side__scope .o-icon{position:absolute;right:6px;width:12px;height:12px;color:var(--faint);pointer-events:none} .o-side__search{display:flex;align-items:center;gap:8px;height:var(--h-md);margin:2px 0 var(--s-2);padding:0 8px;border:1px solid var(--rule);border-radius:var(--r-2);background:var(--paper);color:var(--faint);font-size:var(--t-13);cursor:text} .o-side__search input{flex:1;min-width:0;border:0;outline:0;background:transparent;font:inherit;color:var(--ink)} .o-side__search:focus-within{border-color:var(--draft);box-shadow:var(--focus)} .o-side__search input:focus-visible{box-shadow:none}.o-side__search input::-webkit-search-cancel-button{display:none} /* 고리는 바깥 칸 하나만 */ .o-side__section{margin:var(--s-4) 0 2px;padding:0 8px;font-size:var(--t-11);font-weight:600;color:var(--faint);letter-spacing:.02em} .o-side__item{display:flex;align-items:center;gap:10px;height:30px;padding:0 8px;border:0;border-radius:var(--r-2);background:none;color:var(--graphite);text-decoration:none;font:500 var(--t-13) var(--sans);text-align:left;cursor:pointer} .o-side__item .o-icon{color:var(--pencil)} .o-side__item:hover{background:var(--well-hover);color:var(--ink)} .o-side__item[aria-current=true]{background:var(--well-hover);color:var(--ink);font-weight:600} .o-side__item[aria-current=true] .o-icon{color:var(--ink)} .o-side__item .o-kbd{margin-left:auto} .o-side__item .o-side__count{margin-left:auto;font:500 var(--t-11) var(--mono);color:var(--draft)} .o-side__foot{margin-top:auto;display:flex;flex-direction:column;gap:2px;padding-top:var(--s-2);border-top:1px solid var(--rule)} .o-side__me{display:flex;align-items:center;gap:8px;height:36px;padding:0 4px 0 8px;font:400 var(--t-12) var(--mono);color:var(--pencil)} .o-side__me>span{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap} .o-iconbtn{display:inline-grid;place-items:center;width:var(--h-md);height:var(--h-md);flex:none;border:0;border-radius:var(--r-2);background:none;color:var(--pencil);cursor:pointer;text-decoration:none} .o-iconbtn:hover{background:var(--well-hover);color:var(--ink)} .o-frame{position:relative;display:flex;flex-direction:column;min-width:0;min-height:0;margin:var(--s-2) var(--s-2) var(--s-2) 0;background:var(--paper);border:1px solid var(--rule);border-radius:var(--r-4);box-shadow:0 1px 2px rgba(21,23,28,.04);overflow:hidden} .o-framehead{display:flex;align-items:center;gap:var(--s-3);flex:none;height:44px;padding:0 var(--s-4) 0 var(--s-5);border-bottom:1px solid var(--rule)} .o-framehead__path{display:flex;align-items:center;gap:6px;min-width:0;font-size:var(--t-13);color:var(--pencil)} .o-framehead__path>*{white-space:nowrap;overflow:hidden;text-overflow:ellipsis} .o-framehead__path a{color:var(--pencil);text-decoration:none}.o-framehead__path a:hover{color:var(--ink)} .o-framehead__path>:last-child{color:var(--ink);font-weight:600} .o-framehead__sep{color:var(--faint);flex:none} .o-framehead__end{margin-left:auto;display:flex;align-items:center;gap:var(--s-2)} .o-frame__body{flex:1;min-height:0;overflow:auto;padding:var(--s-8) var(--s-10) var(--s-12)} .o-frame__body--flush{padding:0} .o-float{position:absolute;right:var(--s-4);bottom:var(--s-4);z-index:30;display:flex;flex-direction:column;width:min(480px,calc(100% - 32px));height:min(620px,calc(100% - 72px));background:var(--paper);border:1px solid var(--rule-2);border-radius:var(--r-4);box-shadow:var(--lift);overflow:hidden} .o-float[hidden]{display:none} .o-float__head{display:flex;align-items:center;gap:var(--s-2);height:44px;flex:none;padding:0 var(--s-2) 0 var(--s-4);border-bottom:1px solid var(--rule)} .o-float__title{font-size:var(--t-13);font-weight:600} .o-float__head .o-chat-model{margin-right:auto} .o-float__body{flex:1;min-height:0;overflow:auto;padding:var(--s-4)} .o-float .o-composer{border-top:1px solid var(--rule)} .o-float .o-table th,.o-float .o-table td{white-space:nowrap} /* 좁은 창에서 글자를 쪼개지 말고 표를 옆으로 넘긴다(o-table-wrap 이 스크롤) */ @media(max-width:820px){ .o-shell{grid-template-columns:minmax(0,1fr);grid-template-rows:auto minmax(0,1fr);height:auto;min-height:100dvh;overflow:visible} .o-side{min-width:0} .o-side{flex-direction:row;flex-wrap:wrap;align-items:center;gap:4px;padding:var(--s-2) var(--s-3);overflow:visible} .o-side__brand{width:100%}.o-side__search{flex:1 1 100%;margin:0} .o-side__section,.o-side__me>span{display:none} .o-side__foot{margin:0;flex-direction:row;border:0;padding:0} .o-frame{margin:0 var(--s-2) var(--s-2);min-height:70dvh} .o-frame__body{padding:var(--s-5) var(--s-4) var(--s-8)} .o-frame>.o-float{position:fixed;inset:auto 8px 8px;width:auto;height:min(80dvh,620px)} .o-side .o-kbd{display:none} } /* ── 작업대(v0.5): 위 막대 + 아이콘 줄 + 칸 메뉴 + 본문 — 저장소 · 표처럼 오래 들여다보는 화면. 판 하나(띄우지 않음), 칸은 선으로만 나눈다 ── */ .o-app{display:grid;grid-template:"bar bar bar" 48px "rail menu main" minmax(0,1fr)/48px 248px minmax(0,1fr);height:100dvh;background:var(--paper);overflow:hidden} .o-app--nomenu{grid-template:"bar bar" 48px "rail main" minmax(0,1fr)/48px minmax(0,1fr)} .o-app__bar{grid-area:bar;display:flex;align-items:center;gap:var(--s-3);min-width:0;padding:0 var(--s-3) 0 var(--s-4);border-bottom:1px solid var(--rule)} .o-app__bar .o-search{flex:0 1 320px;margin-left:auto} .o-app__end{display:flex;align-items:center;gap:var(--s-2)} .o-app__bar .o-crumbs{flex-wrap:nowrap;gap:6px;min-width:0;font:400 var(--t-13) var(--sans);color:var(--pencil)} /* 기존 o-crumbs(작은 경로 글)를 위 막대 안에서만 키운다 */ .o-app__bar .o-crumbs a{color:inherit;text-decoration:none;white-space:nowrap}.o-app__bar .o-crumbs a:hover{color:var(--ink)} .o-app__bar .o-crumbs>:last-child{color:var(--ink);font-weight:600} .o-app__bar .o-crumbs__sep{color:var(--rule-3);flex:none} .o-rail{grid-area:rail;display:flex;flex-direction:column;align-items:center;gap:2px;padding:var(--s-2) 0;border-right:1px solid var(--rule);background:var(--desk)} .o-rail a{display:grid;place-items:center;width:32px;height:32px;border-radius:var(--r-3);color:var(--pencil)} .o-rail a:hover{background:var(--well-hover);color:var(--ink)} .o-rail a[aria-current=true]{background:var(--paper);color:var(--ink);box-shadow:0 0 0 1px var(--rule-2)} .o-rail__sep{width:20px;height:1px;margin:6px 0;background:var(--rule-2)} .o-rail__end{margin-top:auto} .o-secmenu{grid-area:menu;display:flex;flex-direction:column;min-height:0;overflow:auto;padding:var(--s-3) var(--s-2) var(--s-6);border-right:1px solid var(--rule);background:var(--desk)} .o-secmenu__head{display:flex;flex-direction:column;gap:2px;padding:2px var(--s-2) var(--s-3);margin-bottom:var(--s-1);border-bottom:1px solid var(--rule)} .o-secmenu__title{font-size:var(--t-14);font-weight:650;color:var(--ink)} .o-secmenu__meta{font:400 var(--t-11) var(--mono);color:var(--pencil)} .o-secmenu__label{padding:var(--s-4) var(--s-2) var(--s-1);font:500 10.5px var(--mono);letter-spacing:.08em;text-transform:uppercase;color:var(--faint)} .o-secmenu__item{display:flex;align-items:center;gap:8px;min-height:28px;padding:0 var(--s-2);border-radius:var(--r-2);color:var(--graphite);text-decoration:none;font-size:var(--t-13)} .o-secmenu__item .o-icon{width:14px;height:14px;color:var(--faint)} .o-secmenu__item:hover{background:var(--well-hover);color:var(--ink)} .o-secmenu__item[aria-current=true]{background:var(--well-hover);color:var(--ink);font-weight:600} .o-secmenu__item[aria-current=true] .o-icon{color:var(--ink)} .o-secmenu__item>span:first-of-type{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap} .o-secmenu__item--sub{min-height:26px;font-size:var(--t-12)} .o-secmenu__find{display:flex;align-items:center;gap:6px;height:28px;margin:var(--s-1) 0;padding:0 var(--s-2);border:1px solid var(--rule);border-radius:var(--r-2);background:var(--paper);color:var(--faint);font-size:var(--t-12)} .o-badge{display:inline-flex;align-items:center;height:18px;padding:0 6px;border:1px solid var(--rule-2);border-radius:var(--r-1);font:500 10.5px var(--mono);color:var(--pencil);white-space:nowrap} .o-badge--alert{border-color:color-mix(in srgb,var(--alert) 40%,transparent);background:var(--alert-wash);color:var(--alert)} .o-badge--draft{border-color:color-mix(in srgb,var(--draft) 40%,transparent);background:var(--draft-wash);color:var(--draft-ink)} .o-badge--ok{border-color:color-mix(in srgb,var(--ok) 35%,transparent);color:var(--ok)} .o-badge .o-icon{width:11px;height:11px;margin-right:4px} .o-btn--primary .o-kbd{background:transparent;border-color:rgba(255,255,255,.35);color:inherit} .o-main{grid-area:main;display:flex;flex-direction:column;min-width:0;min-height:0} .o-main__body{flex:1;min-height:0;overflow:auto;padding:var(--s-8) var(--s-10) var(--s-12)} .o-main__body>h1{font-size:var(--t-24);margin-bottom:var(--s-1)} .o-main__lead{margin-bottom:var(--s-6);color:var(--pencil);font-size:var(--t-13)} .o-main__body h2{margin:var(--s-8) 0 var(--s-3);font-size:var(--t-16)} /* ── 데이터 격자: 열린 표 탭 · 도구 줄 · 격자 · 아래 줄 (Supabase Table Editor 식, 읽기 전용) ── */ .o-filetabs{display:flex;flex:none;height:38px;background:var(--desk);border-bottom:1px solid var(--rule);overflow-x:auto;scrollbar-width:none} .o-filetabs a{display:inline-flex;align-items:center;gap:6px;padding:0 var(--s-4);border-right:1px solid var(--rule);color:var(--pencil);text-decoration:none;font-size:var(--t-12);white-space:nowrap} .o-filetabs a .o-icon{width:13px;height:13px} .o-filetabs a:hover{color:var(--ink)} .o-filetabs a[aria-selected=true]{background:var(--paper);color:var(--ink);font-weight:600;margin-bottom:-1px;border-bottom:1px solid var(--paper)} .o-gridbar{display:flex;flex:none;align-items:center;gap:var(--s-2);height:44px;padding:0 var(--s-3);border-bottom:1px solid var(--rule)} .o-gridbar__find{display:flex;flex:1;align-items:center;gap:8px;min-width:0;height:28px;padding:0 var(--s-2);color:var(--faint);font-size:var(--t-13)} .o-gridbar__find span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap} .o-gridbar .o-btn .o-icon{width:13px;height:13px} .o-gridbar__sep{width:1px;height:20px;background:var(--rule-2)} .o-grid-wrap{flex:1;min-height:0;overflow:auto} .o-grid{border-collapse:separate;border-spacing:0;min-width:100%;font:400 var(--t-12)/1 var(--mono);color:var(--graphite)} .o-grid th{position:sticky;top:0;z-index:1;height:34px;padding:0 var(--s-3);background:var(--desk);border-bottom:1px solid var(--rule-2);border-right:1px solid var(--rule);text-align:left;white-space:nowrap;font-weight:400} .o-grid td{height:32px;max-width:280px;min-width:120px;padding:0 var(--s-3);border-bottom:1px solid var(--rule);border-right:1px solid var(--rule);white-space:nowrap;overflow:hidden;text-overflow:ellipsis} .o-grid tbody tr:hover td{background:var(--desk)} .o-grid th.o-grid__check,.o-grid td.o-grid__check{width:36px;min-width:36px;padding:0;text-align:center} .o-grid__check input{accent-color:var(--ink);width:13px;height:13px;vertical-align:middle} .o-grid__name{font:600 var(--t-12) var(--sans);color:var(--ink)} .o-grid__type{margin-left:6px;font:400 var(--t-11) var(--mono);color:var(--faint)} .o-grid__key{width:12px;height:12px;margin-right:6px;vertical-align:-2px;color:var(--pencil)} .o-grid__key--fk{color:var(--draft)} .o-grid .o-cell-masked{color:var(--alert)} .o-grid__foot{display:flex;flex:none;align-items:center;gap:var(--s-3);height:40px;padding:0 var(--s-3);border-top:1px solid var(--rule);font-size:var(--t-12);color:var(--pencil)} .o-grid__foot .o-badge{margin-left:auto} .o-grid__pager{display:flex;align-items:center;gap:6px} .o-grid__pager input{width:40px;height:24px;padding:0 6px;border:1px solid var(--rule-2);border-radius:var(--r-2);font:inherit;text-align:center} /* ── 고칠 것 카드(Supabase Advisor 식): 갈래 · 무게 · 한 줄 · 근거 · 할 일 ── */ .o-advisor{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:var(--s-3)} .o-advisor__card{display:flex;flex-direction:column;gap:var(--s-2);min-height:150px;padding:var(--s-4);border:1px solid var(--rule-2);border-radius:var(--r-4);background:var(--paper)} .o-advisor__card--high{border-color:color-mix(in srgb,var(--alert) 30%,transparent);background:color-mix(in srgb,var(--alert-wash) 45%,var(--paper))} .o-advisor__head{display:flex;align-items:center;gap:8px;font:500 var(--t-11) var(--mono);letter-spacing:.06em;text-transform:uppercase;color:var(--pencil)} .o-advisor__head .o-badge{margin-left:auto} .o-advisor__card--high .o-advisor__head .o-icon{color:var(--alert)} .o-advisor__title{margin-top:auto;font-size:var(--t-13);font-weight:600;color:var(--ink)} .o-advisor__why{font-size:var(--t-12);color:var(--pencil);line-height:1.5} .o-advisor__why code{font-size:var(--t-11);padding:1px 4px;border:1px solid var(--rule);border-radius:var(--r-1);background:var(--desk)} @media(max-width:820px){ .o-app,.o-app--nomenu{grid-template:"bar" 48px "rail" auto "menu" auto "main" minmax(70dvh,1fr)/minmax(0,1fr);height:auto;min-height:100dvh;overflow:visible} .o-rail{flex-direction:row;justify-content:flex-start;padding:4px 8px;border-right:0;border-bottom:1px solid var(--rule);overflow-x:auto} .o-rail__sep{width:1px;height:20px;margin:0 6px}.o-rail__end{margin:0 0 0 auto} .o-secmenu{max-height:40dvh;border-right:0;border-bottom:1px solid var(--rule)} .o-app__bar .o-search{display:none} .o-app__bar .o-crumbs{overflow:hidden}.o-app__bar .o-crumbs>:not(:last-child){display:none} .o-gridbar{flex-wrap:wrap;height:auto;padding:6px var(--s-3)}.o-gridbar__find{flex-basis:100%} .o-main__body{padding:var(--s-5) var(--s-4) var(--s-8)} } /* ── 작업대 본문 + 오른쪽 칸(산출물 · 속성 · 다음에 할 일) ── */ .o-main__cols{display:grid;grid-template-columns:minmax(0,1fr) 300px;flex:1;min-height:0} .o-main__cols>.o-main__body{min-width:0} .o-main__aside{display:flex;flex-direction:column;gap:var(--s-6);min-height:0;overflow:auto;padding:var(--s-8) var(--s-5);border-left:1px solid var(--rule);background:var(--desk)} .o-main__aside h2{margin:0 0 var(--s-2);font-size:var(--t-12);font-weight:600;color:var(--pencil)} .o-secmenu__count{margin-left:auto;font:400 var(--t-11) var(--mono);color:var(--faint)} /* ── 타일 격자: Space 하나 = 카드 한 장(이름 · 한 줄 · 상태 · 별칭). 숫자 · 건강은 넣지 않는다 ── */ .o-tiles{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:var(--s-3)} .o-tile{display:flex;flex-direction:column;gap:var(--s-2);min-height:120px;padding:var(--s-4);border:1px solid var(--rule-2);border-radius:var(--r-4);background:var(--paper);color:inherit;text-decoration:none;transition:border-color var(--d-1) var(--ease),box-shadow var(--d-1) var(--ease)} .o-tile:hover{border-color:var(--rule-3);box-shadow:0 1px 2px rgba(21,23,28,.06)} .o-tile__name{display:flex;align-items:center;gap:6px;font-size:var(--t-14);font-weight:650;color:var(--ink)} .o-tile__name .o-icon{color:var(--faint)} .o-tile__line{font-size:var(--t-13);color:var(--graphite);line-height:1.5;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden} .o-tile__foot{display:flex;flex-wrap:wrap;gap:6px;margin-top:auto} /* ── 문서 본문: 제목 · 문단 · 목록 · 코드 · 표 (마크다운을 옮긴 글) ── */ .o-prose{max-width:760px;font-size:var(--t-14);line-height:1.75;color:var(--graphite)} .o-prose h1{font-size:var(--t-24);margin:0 0 var(--s-4);color:var(--ink)} .o-prose h2{font-size:var(--t-16);margin:var(--s-8) 0 var(--s-2);color:var(--ink)} .o-prose h3{font-size:var(--t-14);margin:var(--s-6) 0 var(--s-2);color:var(--ink)} .o-prose p{margin:0 0 var(--s-3)} .o-prose ul,.o-prose ol{margin:0 0 var(--s-3);padding-left:1.4em}.o-prose li{margin:2px 0} .o-prose code{padding:1px 5px;border:1px solid var(--rule);border-radius:var(--r-1);background:var(--desk)} .o-prose a{color:var(--draft-ink)} /* ── 관계 그림(SVG): 상자 · 머리 · PK/FK 알약 · 선(후보 = 점선) · 가운데 강조 ── */ .o-graph text{font-size:11px;fill:var(--graphite)} .o-graph{display:block;width:100%;height:auto;border:1px solid var(--rule);border-radius:var(--r-3);background:var(--desk);font-family:var(--sans)} .o-graph__node{fill:var(--paper);stroke:var(--rule-3)} .o-graph a:hover .o-graph__node{stroke:var(--ink)} .o-graph__node--focus{fill:var(--ink);stroke:var(--ink)} .o-graph__node--focus~text{fill:var(--paper)} .o-graph__node--edge{stroke:var(--ink);stroke-width:2} .o-graph__text{font-size:11px;fill:var(--graphite)} .o-graph__head{font-size:12px;font-weight:600;fill:var(--ink)} .o-graph__group{font-size:10.5px;font-family:var(--mono);letter-spacing:.06em;fill:var(--faint)} .o-graph__pill{font:700 9px var(--mono);fill:var(--pencil)}.o-graph__pill--fk{fill:var(--draft)} .o-graph__line{fill:none;stroke:var(--rule-3);stroke-width:1.25} .o-graph__line--draft{stroke:var(--draft);stroke-dasharray:4 3} .o-graph__more{font-size:11px;fill:var(--faint)} @media(max-width:820px){.o-main__cols{grid-template-columns:minmax(0,1fr)}.o-main__aside{border-left:0;border-top:1px solid var(--rule)}}