:root { --bg: #eef2f0; --surface: #fffefa; --surface-muted: #f5f7f4; --ink: #18221f; --muted: #66736f; --line: #d8e0dc; --line-strong: #bdc9c4; --accent: #27675a; --accent-dark: #1d4e45; --accent-soft: #e7f1ed; --warn: #8a5a10; --warn-soft: #fff4d8; --ok: #146c43; --ok-soft: #e8f6ed; --bad: #9f2f24; --bad-soft: #fdebea; --shadow: 0 16px 34px rgba(36, 54, 49, 0.08); font-family: Aptos, "PingFang SC", "Microsoft YaHei", ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; font-variant-numeric: tabular-nums; } * { box-sizing: border-box; } html { height: 100%; scroll-behavior: smooth; overflow: hidden; } body { height: 100%; margin: 0; overflow: hidden; background: var(--bg); color: var(--ink); } button, input, select, textarea { font: inherit; } .app-shell { width: min(1680px, calc(100vw - 32px)); height: 100dvh; margin: 0 auto; padding: 14px 0 16px; display: grid; grid-template-rows: auto minmax(0, 1fr); gap: 12px; overflow: hidden; } .topbar, .panel { background: var(--surface); border: 1px solid var(--line); border-radius: 8px; box-shadow: var(--shadow); } .topbar { display: flex; align-items: center; justify-content: flex-start; gap: 18px; min-height: 68px; padding: 0 16px; } .brand-block { min-width: 0; display: flex; align-items: center; gap: 10px; } .brand-logo { display: block; width: 190px; height: 52px; object-fit: cover; object-position: center; border-radius: 4px; background: #ffffff; } .top-nav { min-width: 0; height: 100%; flex: 1 1 auto; display: flex; align-items: stretch; } .top-nav-item { display: flex; align-items: center; min-height: 68px; padding: 0 18px; border-bottom: 3px solid transparent; color: var(--muted); font-size: 15px; font-weight: 800; white-space: nowrap; } .top-nav-item.is-active { color: var(--accent-dark); border-bottom-color: var(--accent); background: var(--accent-soft); } .title-block { min-width: 220px; display: grid; gap: 2px; } .eyebrow { color: var(--accent); font-size: 12px; font-weight: 700; letter-spacing: 0; } h1, h2, h3, h4, p { margin: 0; } h1 { font-size: 24px; line-height: 1.18; letter-spacing: 0; } h2 { font-size: 16px; line-height: 1.3; } h3 { font-size: 15px; line-height: 1.35; } h4 { color: #33433e; font-size: 13px; font-weight: 700; } p, .muted, .hint { color: var(--muted); } .top-actions, .actions, .task-card-actions { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; } .top-actions { margin-left: auto; justify-content: flex-end; flex-wrap: nowrap; } .state, .task-pill { flex: 0 0 auto; border-radius: 6px; font-size: 12px; font-weight: 700; line-height: 1; } .state { padding: 8px 10px; background: #edf0ee; color: var(--muted); } .state-ok { color: var(--ok); background: var(--ok-soft); } .state-warn { color: var(--warn); background: var(--warn-soft); } .state-bad { color: var(--bad); background: var(--bad-soft); } .status-icon { min-height: 36px; display: inline-flex; align-items: center; gap: 7px; border: 1px solid var(--line-strong); border-radius: 8px; padding: 0 10px; background: #ffffff; color: var(--ink); cursor: pointer; transition: background-color 180ms ease, border-color 180ms ease, color 180ms ease, transform 180ms ease; } .status-icon:hover { border-color: #a9bdb5; background: var(--accent-soft); color: var(--accent-dark); } .status-icon:active { transform: translateY(1px); } .status-icon.state-ok { border-color: #9fc6b5; background: var(--ok-soft); } .status-icon.state-warn { border-color: #e4c98d; } .status-icon.state-bad { border-color: #efb4af; background: var(--bad-soft); } .status-icon.state-ok .status-icon-value { color: var(--ok); } .status-icon.state-warn .status-icon-value { color: var(--warn); } .status-icon.state-bad .status-icon-value { color: var(--bad); } .status-icon-glyph { width: 18px; color: currentColor; font-size: 18px; font-weight: 800; line-height: 1; text-align: center; } .status-icon-label { font-size: 12px; font-weight: 800; white-space: nowrap; } .status-icon-value { color: var(--muted); font-size: 12px; white-space: nowrap; } button { min-height: 36px; border: 1px solid var(--accent); border-radius: 6px; padding: 0 14px; background: var(--accent); color: #ffffff; cursor: pointer; transition: background-color 180ms ease, border-color 180ms ease, transform 180ms ease; } button:hover { background: var(--accent-dark); border-color: var(--accent-dark); } button:active { transform: translateY(1px); } button:focus-visible, input:focus-visible, select:focus-visible, textarea:focus-visible, summary:focus-visible { outline: 3px solid rgba(39, 103, 90, 0.22); outline-offset: 2px; } .secondary { color: var(--ink); background: #ffffff; border-color: var(--line-strong); } .secondary:hover { color: var(--accent-dark); background: var(--accent-soft); border-color: #a9bdb5; } .danger-button { min-height: 30px; border-color: #e0aaa4; padding: 0 10px; color: var(--bad); background: var(--bad-soft); font-size: 12px; } .danger-button:hover { border-color: #c97870; color: #ffffff; background: var(--bad); } button:disabled { opacity: 0.52; cursor: not-allowed; } input, select { width: 100%; border: 1px solid var(--line-strong); border-radius: 6px; padding: 8px 9px; color: var(--ink); background: #ffffff; } textarea { width: 100%; resize: none; border: 1px solid var(--line-strong); border-radius: 8px; padding: 12px; color: var(--ink); background: #fcfdfb; font: 13px/1.55 "SFMono-Regular", Consolas, "Liberation Mono", Menlo, monospace; } #rawInstruction { min-height: 0; height: 100%; } .hint { margin-top: 10px; font-size: 13px; line-height: 1.5; } .workbench-grid { display: grid; grid-template-columns: minmax(300px, 0.9fr) minmax(320px, 0.82fr) minmax(460px, 1.35fr); gap: 12px; align-items: stretch; min-height: 0; overflow: hidden; } .panel { min-width: 0; min-height: 0; padding: 14px; display: grid; grid-template-rows: auto minmax(0, 1fr); gap: 12px; overflow: hidden; } .instruction-panel { grid-template-rows: auto minmax(0, 1fr) auto; } .instruction-panel .actions { justify-content: center; } .detail-panel { grid-template-rows: auto auto minmax(0, 1fr); } .panel-head { min-height: 32px; display: flex; align-items: center; justify-content: space-between; gap: 12px; } .detail-panel-actions { display: flex; align-items: center; justify-content: flex-end; gap: 8px; flex-wrap: wrap; } .task-stages { min-width: 0; padding: 2px 0 0; } .task-stage-flow { position: relative; display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 8px; } .task-stage-flow::before { content: ''; position: absolute; z-index: 0; top: 22px; right: 12%; left: 12%; height: 1px; background: var(--line-strong); } .task-stage-card { position: relative; z-index: 1; min-width: 0; min-height: 116px; display: grid; align-content: start; gap: 7px; padding: 9px; border: 1px solid var(--line); border-radius: 8px; background: var(--surface-muted); } .task-stage-card.is-active { border-color: #e4c98d; background: var(--warn-soft); } .task-stage-card.is-complete { border-color: #9fc6b5; background: var(--ok-soft); } .task-stage-card.is-failed { border-color: #efb4af; background: var(--bad-soft); } .task-stage-heading { min-width: 0; display: flex; align-items: flex-start; gap: 7px; } .task-stage-index { flex: 0 0 auto; width: 24px; height: 24px; display: grid; place-items: center; border: 1px solid var(--line-strong); border-radius: 50%; color: var(--muted); background: #ffffff; font: 11px/1 "SFMono-Regular", Consolas, "Liberation Mono", Menlo, monospace; } .task-stage-card.is-active .task-stage-index { border-color: #d6b56e; color: var(--warn); } .task-stage-card.is-complete .task-stage-index { border-color: #83b59d; color: var(--ok); } .task-stage-card.is-failed .task-stage-index { border-color: #dc9188; color: var(--bad); } .task-stage-title-block { min-width: 0; display: grid; gap: 2px; } .task-stage-title { color: var(--ink); font-size: 12px; line-height: 1.25; white-space: nowrap; } .task-stage-current { min-width: 0; overflow: hidden; color: var(--muted); font-size: 11px; line-height: 1.25; text-overflow: ellipsis; white-space: nowrap; } .task-stage-card.is-active .task-stage-current { color: var(--warn); } .task-stage-card.is-complete .task-stage-current { color: var(--ok); } .task-stage-card.is-failed .task-stage-current { color: var(--bad); } .task-stage-statuses { display: flex; flex-wrap: wrap; gap: 4px; } .task-stage-status { display: inline-flex; align-items: center; min-height: 20px; padding: 2px 5px; border: 1px solid var(--line); border-radius: 4px; color: var(--muted); background: #ffffff; font-size: 10px; line-height: 1.2; white-space: nowrap; } .task-stage-status.is-current { border-color: #d6b56e; color: var(--warn); background: #fffaf0; font-weight: 800; } .task-stage-card.is-complete .task-stage-status.is-current { border-color: #83b59d; color: var(--ok); background: #f5fcf7; } .task-stage-card.is-failed .task-stage-status.is-current { border-color: #dc9188; color: var(--bad); background: #fff7f6; } .task-stage-note { min-height: 28px; color: var(--muted); font-size: 10px; line-height: 1.4; } .task-stage-card.is-failed .task-stage-note { color: var(--bad); } .task-cards, .task-detail { min-height: 0; max-height: none; overflow: auto; padding-right: 2px; } .task-cards { display: grid; align-content: start; gap: 8px; } .task-card { display: grid; gap: 7px; padding: 9px 10px; border: 1px solid var(--line); border-left: 3px solid transparent; border-radius: 8px; background: var(--surface-muted); cursor: pointer; transition: background-color 180ms ease, border-color 180ms ease, transform 180ms ease; } .task-card:hover { border-color: #b8c8c0; border-left-color: var(--accent); background: #fbfcfa; } .task-card.is-selected { border-color: #9fb9ae; border-left-color: var(--accent); background: var(--accent-soft); } .task-card-head { display: flex; align-items: center; justify-content: space-between; gap: 10px; } .task-card-title-wrap { min-width: 0; display: grid; gap: 5px; } .task-card-status { display: flex; align-items: center; justify-content: flex-end; align-self: center; } .task-card-status .task-pill { padding: 5px 8px; } .task-card-title { min-width: 0; font-size: 14px; line-height: 1.25; overflow-wrap: anywhere; } .task-id { color: var(--muted); font: 11px/1.25 "SFMono-Regular", Consolas, "Liberation Mono", Menlo, monospace; overflow-wrap: anywhere; } .task-card-message { color: var(--muted); font-size: 12px; line-height: 1.25; } .task-pill { padding: 6px 8px; background: #edf0ee; color: var(--muted); } .task-pill.running, .task-pill.accepted, .task-pill.queued, .task-pill.awaiting_confirmation, .task-pill.confirmed, .task-pill.paused, .task-pill.created, .task-pill.waiting_extension { color: var(--warn); background: var(--warn-soft); } .task-pill.completed { color: var(--ok); background: var(--ok-soft); } .task-pill.is-failure, .task-pill.blocked, .task-pill.saved_unverified, .task-pill.parse_failed, .task-pill.parse_blocked { color: var(--bad); background: var(--bad-soft); } .task-card-actions button { min-height: 26px; padding: 0 9px; font-size: 12px; } .task-empty, .detail-empty { padding: 14px; color: var(--muted); font-size: 13px; border: 1px dashed var(--line-strong); border-radius: 8px; background: #fbfcfa; } .task-detail { height: 100%; overflow: hidden; display: grid; grid-template-rows: minmax(140px, 0.9fr) minmax(180px, 1.1fr); gap: 10px; } .task-output-panel { min-height: 0; display: grid; grid-template-rows: auto minmax(0, 1fr); gap: 6px; } .task-output-label { color: var(--muted); font-size: 12px; font-weight: 800; letter-spacing: 0.02em; } .receipt-hero { display: grid; grid-template-columns: minmax(0, 1.1fr) minmax(220px, 0.9fr); gap: 16px; padding: 14px; border: 1px solid #7db39c; border-radius: 8px; background: #e5f7ec; box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.72); } .receipt-hero-main { min-width: 0; display: grid; gap: 5px; } .receipt-hero-main strong { color: var(--ok); font-size: 28px; line-height: 1.05; overflow-wrap: anywhere; } .receipt-hero-main p { color: #226244; font-size: 13px; font-weight: 700; } .receipt-hero-meta { min-width: 0; display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px; align-content: center; } .receipt-hero-meta .detail-field strong { color: var(--ink); font-size: 14px; } .detail-hero { display: flex; align-items: flex-start; justify-content: space-between; gap: 14px; padding-bottom: 12px; border-bottom: 1px solid var(--line); } .detail-hero-main { min-width: 0; display: grid; gap: 5px; } .detail-label, .metric span, .detail-field span, .mini-table-head span { color: var(--muted); font-size: 12px; font-weight: 700; } .detail-hero-main strong { font-size: 18px; line-height: 1.25; overflow-wrap: anywhere; } .detail-hero-main p { font-size: 13px; line-height: 1.45; } .detail-hero-meta { min-width: 220px; display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px; align-content: start; } .metric-strip { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); border: 1px solid var(--line); border-radius: 8px; background: var(--surface-muted); } .metric { min-width: 0; display: grid; gap: 4px; padding: 10px; border-right: 1px solid var(--line); } .metric:last-child { border-right: 0; } .metric strong { min-width: 0; font-size: 14px; line-height: 1.35; overflow-wrap: anywhere; } .detail-block { display: grid; gap: 10px; padding-top: 12px; border-top: 1px solid var(--line); } .receipt-block { padding: 12px; border: 1px solid #9fc6b5; border-radius: 8px; background: #edf8f1; } .receipt-grid { display: grid; grid-template-columns: 1.2fr 1fr 1fr 1fr; gap: 10px 14px; } .receipt-grid .detail-field strong { color: var(--ok); font-size: 16px; } .receipt-title { color: var(--ok); font-size: 13px; font-weight: 700; line-height: 1.4; } .field-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 10px 14px; } .detail-field { min-width: 0; display: grid; gap: 4px; } .detail-field strong { min-width: 0; font-size: 14px; line-height: 1.35; overflow-wrap: anywhere; } .detail-split { display: grid; grid-template-columns: 1.1fr 0.9fr; gap: 12px; } .detail-subblock { min-width: 0; display: grid; align-content: start; gap: 8px; } .mini-table { border: 1px solid var(--line); border-radius: 8px; overflow: hidden; background: #ffffff; } .mini-table-row { display: grid; grid-auto-flow: column; grid-auto-columns: minmax(0, 1fr); border-top: 1px solid var(--line); } .mini-table-row:first-child { border-top: 0; } .mini-table-row span { min-width: 0; padding: 8px 10px; font-size: 13px; line-height: 1.35; overflow-wrap: anywhere; } .mini-table-head { background: var(--surface-muted); } .room-list { display: flex; gap: 8px; flex-wrap: wrap; } .room-chip { display: inline-flex; align-items: center; gap: 6px; min-height: 34px; padding: 0 10px; border: 1px solid var(--line); border-radius: 6px; background: #ffffff; font-size: 13px; } .room-chip span { color: var(--muted); } .finance-total { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 10px 0 0; color: var(--muted); font-size: 13px; } .finance-total strong { color: var(--ink); font-size: 18px; } .task-steps { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 8px; } .task-step { min-width: 0; display: flex; align-items: center; gap: 7px; padding: 8px; border: 1px solid var(--line); border-radius: 8px; background: #ffffff; color: var(--muted); font-size: 12px; } .task-step strong { min-width: 0; overflow-wrap: anywhere; } .step-dot { width: 9px; height: 9px; flex: 0 0 auto; border-radius: 50%; background: #b8c3be; } .task-step.done { color: var(--ok); background: var(--ok-soft); } .task-step.done .step-dot { background: var(--ok); } .task-step.active { color: var(--warn); background: var(--warn-soft); } .task-step.active .step-dot { background: var(--warn); } .task-step.blocked { color: var(--bad); background: var(--bad-soft); } .task-step.blocked .step-dot { background: var(--bad); } .progress-note, .detail-note { font-size: 13px; line-height: 1.5; } .detail-alert { display: grid; gap: 6px; padding: 10px; border: 1px solid #efb4af; border-radius: 8px; color: var(--bad); background: var(--bad-soft); } .detail-alert p { color: inherit; font-size: 13px; line-height: 1.45; } .task-log, .task-json-output { height: 100%; min-height: 0; max-height: none; margin: 0; overflow: auto; padding: 14px; border: 1px solid #263a34; border-radius: 8px; background: #0d1512; color: #d7f8e7; box-shadow: inset 0 0 0 1px rgba(122, 194, 157, 0.08); font: 12px/1.65 "SFMono-Regular", Consolas, "Liberation Mono", Menlo, monospace; white-space: pre-wrap; word-break: break-word; } .task-json-output { border-color: #1f3a46; background: #080d0b; color: #bfe9ff; } @media (max-width: 1120px) { .workbench-grid { grid-template-columns: minmax(260px, 0.9fr) minmax(240px, 0.76fr) minmax(340px, 1.25fr); } } @media (max-width: 920px) { .app-shell { width: min(100vw - 20px, 760px); padding-top: 10px; } .topbar { display: grid; gap: 0; padding: 0 12px 12px; } .top-nav { min-height: 52px; } .top-nav-item { min-height: 52px; } .task-stage-flow { grid-template-columns: 1fr; } .task-stage-flow::before { display: none; } .top-actions { align-items: stretch; } .top-actions button, .top-actions .state { flex: 1 1 140px; } .field-grid, .receipt-hero, .detail-hero, .receipt-grid, .detail-split, .metric-strip, .task-steps { grid-template-columns: 1fr; } .detail-hero { display: grid; } .detail-hero-meta { min-width: 0; } .workbench-grid { grid-template-columns: minmax(220px, 0.85fr) minmax(220px, 0.8fr) minmax(300px, 1.2fr); overflow-x: auto; } .metric { border-right: 0; border-bottom: 1px solid var(--line); } .metric:last-child { border-bottom: 0; } .task-cards, .task-detail { max-height: none; } } :root { --login-bg: #f4f5f7; } /* Component display rules must never override the native hidden attribute. */ [hidden] { display: none !important; } .login-panel { min-height: calc(100vh - 110px); display: grid; place-items: center; padding: 48px 24px; background: var(--login-bg); } .login-card { width: min(420px, 100%); padding: 34px; border: 1px solid rgba(20, 24, 32, .12); border-radius: 18px; background: #fff; box-shadow: 0 18px 60px rgba(20, 24, 32, .12); } .login-card h1 { margin: 6px 0 8px; } .login-card form { display: grid; gap: 14px; margin-top: 24px; } .login-card label { display: grid; gap: 7px; font-size: 13px; color: #4c5563; } .login-card input { width: 100%; box-sizing: border-box; min-height: 42px; padding: 0 12px; border: 1px solid #ccd2dc; border-radius: 9px; font: inherit; } .login-card button { min-height: 44px; border: 0; border-radius: 9px; background: #111827; color: #fff; font: inherit; cursor: pointer; } .login-error { min-height: 20px; margin: 0; color: #b42318; font-size: 13px; } .auth-state { max-width: 180px; overflow: hidden; color: #5d6673; font-size: 12px; text-overflow: ellipsis; white-space: nowrap; } .logout-button { border: 1px solid #ccd2dc; border-radius: 8px; padding: 8px 11px; background: #fff; color: #394150; cursor: pointer; }