:root { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif; color: oklch(0.24 0.012 255); background: oklch(0.965 0.006 250); font-synthesis: none; --background: oklch(0.965 0.006 250); --surface: oklch(0.99 0.004 250); --surface-raised: oklch(1 0.003 250); --surface-muted: oklch(0.935 0.008 250); --text: oklch(0.24 0.012 255); --text-muted: oklch(0.52 0.018 255); --border: oklch(0.86 0.012 250); --border-strong: oklch(0.74 0.02 250); --accent: oklch(0.58 0.16 250); --accent-hover: oklch(0.52 0.17 250); --accent-soft: oklch(0.93 0.035 250); --success: oklch(0.54 0.13 155); --success-soft: oklch(0.93 0.04 155); --error: oklch(0.56 0.18 25); --error-soft: oklch(0.94 0.04 25); --warning: oklch(0.68 0.15 75); --focus: oklch(0.66 0.18 250); --shadow: 0 14px 40px oklch(0.32 0.025 250 / 0.08); } * { box-sizing: border-box; } body { margin: 0; min-width: 320px; min-height: 100vh; background: var(--background); color: var(--text); } button, input, select { font: inherit; } button, select, input[type="range"], .file-button { cursor: pointer; } button:focus-visible, input:focus-visible, select:focus-visible, .file-button:has(input:focus-visible) { outline: 3px solid color-mix(in oklch, var(--focus), transparent 50%); outline-offset: 2px; } button:disabled { cursor: not-allowed; opacity: 0.52; } h1, h2, h3, p { margin-block-start: 0; } h1 { margin-block-end: 0; font-size: 1.45rem; line-height: 1.15; letter-spacing: -0.025em; } h2 { margin-block-end: 0.45rem; font-size: 1.75rem; line-height: 1.15; letter-spacing: -0.035em; } h3 { margin-block-end: 0.25rem; font-size: 1rem; } .app-shell { width: min(1480px, 100%); min-height: 100vh; margin-inline: auto; padding: 28px clamp(18px, 3vw, 48px) 56px; } .app-header { display: flex; min-height: 62px; align-items: center; justify-content: space-between; gap: 24px; } .eyebrow { margin-block-end: 5px; color: var(--text-muted); font-size: 0.72rem; font-weight: 700; letter-spacing: 0.1em; text-transform: uppercase; } .status-stack { display: grid; width: 270px; gap: 5px; } .status { display: grid; width: 100%; min-height: 38px; place-items: center; padding: 8px 14px; border: 1px solid var(--border); border-radius: 999px; background: var(--surface); color: var(--text-muted); font-size: 0.84rem; text-align: center; transition: background-color 180ms cubic-bezier(0.22, 1, 0.36, 1), border-color 180ms cubic-bezier(0.22, 1, 0.36, 1); } .sync-status { min-height: 18px; color: var(--text-muted); font-size: 0.75rem; text-align: center; } .sync-status[data-tone="working"] { color: var(--accent-hover); } .sync-status[data-tone="success"] { color: var(--success); } .sync-status[data-tone="error"] { color: var(--error); } .status[data-tone="working"] { border-color: color-mix(in oklch, var(--accent), transparent 55%); background: var(--accent-soft); color: var(--accent-hover); } .status[data-tone="success"] { border-color: color-mix(in oklch, var(--success), transparent 55%); background: var(--success-soft); color: var(--success); } .status[data-tone="error"] { border-color: color-mix(in oklch, var(--error), transparent 55%); background: var(--error-soft); color: var(--error); } .step-nav { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); margin-block: 30px 42px; border-block-end: 1px solid var(--border); } .step-nav__item { display: flex; align-items: center; justify-content: center; gap: 10px; min-height: 54px; border: 0; border-block-end: 2px solid transparent; background: transparent; color: var(--text-muted); font-weight: 650; } .step-nav__item span { display: grid; width: 24px; height: 24px; place-items: center; border: 1px solid var(--border-strong); border-radius: 50%; font-size: 0.75rem; } .step-nav__item:hover { color: var(--text); } .step-nav__item.is-active { border-block-end-color: var(--accent); color: var(--accent); } .step-nav__item.is-active span { border-color: var(--accent); background: var(--accent); color: oklch(0.98 0.004 250); } .view[hidden] { display: none; } .section-heading { display: flex; align-items: end; justify-content: space-between; gap: 32px; margin-block-end: 28px; } .section-heading > div:first-child { max-width: 70ch; } .section-heading p:last-child { margin-block-end: 0; color: var(--text-muted); line-height: 1.55; } .section-heading--compact { align-items: center; } .reference-strip { display: flex; gap: 10px; margin-block-end: 18px; padding: 3px; overflow-x: auto; } .reference-strip[hidden] { display: none; } .reference-item { position: relative; flex: 0 0 220px; overflow: hidden; border: 1px solid var(--border); border-radius: 11px; background: var(--surface); } .reference-item.is-selected { border-color: var(--accent); box-shadow: 0 0 0 2px var(--accent-soft); } .reference-item__select { display: grid; width: 100%; min-height: 68px; grid-template-columns: 88px minmax(0, 1fr); align-items: center; gap: 10px; padding: 6px 30px 6px 6px; border: 0; background: transparent; color: var(--text); text-align: start; } .reference-item__select:hover { background: var(--surface-muted); } .reference-item__select img { width: 88px; height: 52px; border-radius: 6px; object-fit: cover; background: oklch(0.18 0.01 255); } .reference-item__select span, .reference-item__select strong, .reference-item__select small { display: block; min-width: 0; } .reference-item__select small { margin-block-start: 3px; overflow: hidden; color: var(--text-muted); font-size: 0.72rem; text-overflow: ellipsis; white-space: nowrap; } .reference-item__remove { position: absolute; inset-block-start: 5px; inset-inline-end: 5px; width: 26px; height: 26px; border: 0; border-radius: 6px; background: color-mix(in oklch, var(--surface), transparent 8%); color: var(--text-muted); line-height: 1; } .reference-item__remove:hover { background: var(--error-soft); color: var(--error); } .calibration-guide { margin-block-end: 18px; border: 1px solid var(--border); border-radius: 12px; background: var(--surface); } .calibration-guide summary { padding: 13px 16px; cursor: pointer; font-weight: 700; } .calibration-guide__content { display: grid; gap: 16px; padding: 0 16px 16px; border-block-start: 1px solid var(--border); } .calibration-guide ol { display: grid; gap: 9px; margin: 14px 0 0; padding-inline-start: 24px; } .calibration-guide li { padding-inline-start: 5px; } .calibration-guide li strong, .calibration-guide li span { display: block; } .calibration-guide li span { margin-block-start: 2px; color: var(--text-muted); font-size: 0.84rem; line-height: 1.45; } .pipeline-map { display: flex; flex-wrap: wrap; align-items: center; gap: 7px; color: var(--text-muted); font-size: 0.8rem; } .pipeline-map span { padding: 5px 8px; border: 1px solid var(--border); border-radius: 7px; background: var(--surface-muted); color: var(--text); font-weight: 650; } .pipeline-map b, .pipeline-map i { font-style: normal; font-weight: 500; } .button-row { display: flex; flex-wrap: wrap; align-items: center; justify-content: flex-end; gap: 9px; } .button, select, input[type="text"] { min-height: 40px; border: 1px solid var(--border-strong); border-radius: 9px; background: var(--surface-raised); color: var(--text); } .button { display: inline-flex; align-items: center; justify-content: center; padding: 8px 14px; font-weight: 650; white-space: nowrap; } .button:hover:not(:disabled) { border-color: var(--accent); } .button--primary { border-color: var(--accent); background: var(--accent); color: oklch(0.98 0.004 250); } .button--primary:hover:not(:disabled) { border-color: var(--accent-hover); background: var(--accent-hover); } .button--quiet { border-color: transparent; background: transparent; color: var(--text-muted); } .button--quiet:hover:not(:disabled) { border-color: var(--border); background: var(--surface-muted); color: var(--text); } select, input[type="text"] { padding-inline: 11px; } .file-button input { position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); } .source-list { display: grid; gap: 12px; } .source-row { display: grid; grid-template-columns: 220px minmax(220px, 1fr) auto; align-items: center; gap: 22px; padding: 14px; border: 1px solid var(--border); border-radius: 14px; background: var(--surface); transition: border-color 180ms cubic-bezier(0.22, 1, 0.36, 1), box-shadow 180ms cubic-bezier(0.22, 1, 0.36, 1); } .source-row.is-selected { border-color: color-mix(in oklch, var(--accent), transparent 35%); box-shadow: 0 0 0 3px color-mix(in oklch, var(--accent), transparent 88%); } .source-row__preview { aspect-ratio: 16 / 9; overflow: hidden; border-radius: 8px; background: oklch(0.18 0.01 255); } .source-row__preview video { width: 100%; height: 100%; object-fit: contain; } .source-row__info span { color: var(--text-muted); font-size: 0.72rem; font-weight: 700; letter-spacing: 0.08em; text-transform: uppercase; } .source-row__info h3 { margin-block: 5px; } .source-row__info p { margin: 0; color: var(--text-muted); font-size: 0.85rem; } .source-row__actions { display: flex; align-items: center; gap: 5px; } .empty-state { display: grid; place-items: center; gap: 8px; min-height: 260px; padding: 32px; color: var(--text-muted); text-align: center; } .empty-state strong { color: var(--text); font-size: 1rem; } .empty-state--wide { min-height: 300px; border: 1px dashed var(--border-strong); border-radius: 14px; background: color-mix(in oklch, var(--surface), transparent 30%); } .calibration-layout { display: grid; grid-template-columns: minmax(0, 1fr) 310px; min-height: 620px; overflow: hidden; border: 1px solid var(--border); border-radius: 16px; background: var(--surface); box-shadow: var(--shadow); } .canvas-stage { display: grid; min-width: 0; min-height: 620px; max-height: calc(100vh - 260px); place-items: center; overflow: auto; padding: 24px; background-color: oklch(0.91 0.008 250); background-image: linear-gradient(45deg, oklch(0.88 0.008 250) 25%, transparent 25%), linear-gradient(-45deg, oklch(0.88 0.008 250) 25%, transparent 25%), linear-gradient(45deg, transparent 75%, oklch(0.88 0.008 250) 75%), linear-gradient(-45deg, transparent 75%, oklch(0.88 0.008 250) 75%); background-position: 0 0, 0 8px, 8px -8px, -8px 0; background-size: 16px 16px; } #calibration-canvas { display: block; max-width: 100%; max-height: 100%; border-radius: 4px; box-shadow: 0 8px 30px oklch(0.2 0.02 255 / 0.2); cursor: crosshair; touch-action: none; } .inspector { display: flex; flex-direction: column; gap: 20px; padding: 24px; border-inline-start: 1px solid var(--border); background: var(--surface); } .field-stack { display: grid; gap: 7px; } .field-stack label, .range-label label { color: var(--text-muted); font-size: 0.78rem; font-weight: 700; } .hint { min-height: 58px; margin: 0; padding: 11px 12px; border: 1px solid var(--border); border-radius: 9px; background: var(--surface-muted); color: var(--text-muted); font-size: 0.82rem; line-height: 1.45; } .range-label { display: flex; justify-content: space-between; gap: 12px; } .range-label output { color: var(--text); font-variant-numeric: tabular-nums; font-weight: 700; } input[type="range"] { width: 100%; accent-color: var(--accent); } .inspector__section { min-height: 0; flex: 1; overflow: auto; border-block-start: 1px solid var(--border); padding-block-start: 18px; } .inspector__title { display: flex; align-items: center; justify-content: space-between; margin-block-end: 10px; } .inspector__title h3 { margin: 0; } .inspector__title span { display: grid; min-width: 24px; height: 24px; place-items: center; border-radius: 999px; background: var(--surface-muted); color: var(--text-muted); font-size: 0.75rem; } .region-list { display: grid; gap: 6px; } .region-row { display: flex; min-height: 48px; align-items: center; justify-content: space-between; gap: 10px; padding: 8px 9px; border-radius: 8px; } .region-row:hover { background: var(--surface-muted); } .region-row span { display: grid; gap: 2px; } .region-row strong { font-size: 0.84rem; } .region-row small { color: var(--text-muted); font-size: 0.72rem; } .icon-button { display: grid; width: 30px; height: 30px; place-items: center; border: 0; border-radius: 7px; background: transparent; color: var(--text-muted); font-size: 1.2rem; } .icon-button:hover { background: var(--error-soft); color: var(--error); } .muted-copy { color: var(--text-muted); font-size: 0.82rem; } .inspector__actions { display: grid; grid-template-columns: 1fr; gap: 8px; padding-block-start: 2px; } .results-list { display: grid; gap: 18px; } .unique-lines { overflow: hidden; border: 1px solid var(--border-strong); border-radius: 14px; background: var(--surface); } .unique-lines header { display: flex; align-items: center; justify-content: space-between; gap: 16px; padding: 14px 20px; border-block-end: 1px solid var(--border); } .unique-lines h3 { margin: 0; } .unique-lines header span { min-width: 28px; padding: 4px 8px; border-radius: 999px; background: var(--accent-soft); color: var(--accent); font-size: 0.75rem; font-weight: 750; text-align: center; } .unique-lines ol { margin: 0; padding: 0; list-style-position: inside; } .unique-lines li { padding: 11px 20px; border-block-end: 1px solid var(--border); font-family: ui-monospace, "SFMono-Regular", Consolas, monospace; font-size: 0.82rem; line-height: 1.5; } .unique-lines li:last-child { border-block-end: 0; } .result-group { overflow: hidden; border: 1px solid var(--border); border-radius: 14px; background: var(--surface); } .result-group > header { display: flex; align-items: center; justify-content: space-between; gap: 20px; padding: 18px 20px; border-block-end: 1px solid var(--border); } .result-group header h3 { margin-block-end: 3px; } .result-group header p { margin: 0; color: var(--text-muted); font-size: 0.82rem; } .result-badge { padding: 6px 9px; border-radius: 999px; font-size: 0.75rem; font-weight: 700; } .result-badge[data-tone="success"] { background: var(--success-soft); color: var(--success); } .result-badge[data-tone="error"] { background: var(--error-soft); color: var(--error); } .result-badge[data-tone="neutral"] { background: var(--surface-muted); color: var(--text-muted); } .result-error { margin: 0; padding: 22px 20px; color: var(--error); } .result-hint { margin: 0; padding: 22px 20px; color: var(--text-muted); } .diagnostics { border-block-start: 1px solid var(--border); } .diagnostics summary { padding: 13px 20px; cursor: pointer; color: var(--text-muted); font-size: 0.82rem; font-weight: 700; } .diagnostics__content { display: grid; grid-template-columns: minmax(260px, 0.9fr) minmax(420px, 1.4fr); gap: 18px; padding: 0 20px 20px; } .diagnostics__preview { align-self: start; overflow: hidden; border: 1px solid var(--border); border-radius: 9px; background: var(--surface-muted); } .diagnostics__preview img { display: block; width: 100%; height: auto; } .diagnostics__preview p { margin: 0; padding: 9px 11px; color: var(--text-muted); font-size: 0.74rem; } .stage-list { display: grid; gap: 7px; } .stage-row { display: grid; grid-template-columns: 11px minmax(130px, 0.45fr) minmax(180px, 1fr) 120px; align-items: center; gap: 10px; min-height: 58px; padding: 7px 9px; border: 1px solid var(--border); border-radius: 9px; } .stage-row__dot { width: 9px; height: 9px; border-radius: 50%; background: var(--border-strong); } .stage-row[data-status="found"] .stage-row__dot { background: var(--success); } .stage-row[data-status="not-found"] .stage-row__dot, .stage-row[data-status="error"] .stage-row__dot { background: var(--error); } .stage-row[data-status="skipped"] { opacity: 0.68; } .stage-row strong { font-size: 0.8rem; } .stage-row p { margin: 0; color: var(--text-muted); font-size: 0.74rem; line-height: 1.35; } .stage-row img { display: block; width: 120px; height: 42px; object-fit: contain; border-radius: 5px; background: oklch(0.18 0.01 255); } .stage-row__empty { color: var(--text-muted); font-size: 0.72rem; text-align: center; } table { width: 100%; border-collapse: collapse; font-size: 0.86rem; } th, td { padding: 12px 20px; border-block-end: 1px solid var(--border); text-align: start; } th { background: var(--surface-muted); color: var(--text-muted); font-size: 0.72rem; letter-spacing: 0.05em; text-transform: uppercase; } tbody tr:last-child td { border-block-end: 0; } td:nth-child(2), td:nth-child(3), td:nth-child(5) { font-variant-numeric: tabular-nums; font-weight: 650; } @media (max-width: 960px) { .section-heading { align-items: start; flex-direction: column; } .button-row { justify-content: flex-start; } .source-row { grid-template-columns: 180px 1fr; } .source-row__actions { grid-column: 1 / -1; justify-content: flex-end; } .calibration-layout { grid-template-columns: 1fr; } .diagnostics__content { grid-template-columns: 1fr; } .stage-row { grid-template-columns: 11px minmax(110px, 0.45fr) minmax(160px, 1fr) 100px; } .stage-row img { width: 100px; } .inspector { border-block-start: 1px solid var(--border); border-inline-start: 0; } } @media (max-width: 640px) { .app-shell { padding-inline: 14px; } .app-header { align-items: start; flex-direction: column; } .status-stack { width: 100%; } .step-nav { margin-block: 22px 30px; } .step-nav__item { flex-direction: column; gap: 5px; font-size: 0.76rem; } .source-row { grid-template-columns: 1fr; } .source-row__actions { grid-column: auto; flex-wrap: wrap; justify-content: flex-start; } .button-row, .button-row > * { width: 100%; } .canvas-stage { min-height: 360px; padding: 12px; } .result-group { overflow-x: auto; } .stage-row { grid-template-columns: 11px 1fr; } .stage-row p, .stage-row img, .stage-row__empty { grid-column: 2; } .stage-row img { width: 100%; height: 68px; } table { min-width: 680px; } } @media (prefers-color-scheme: dark) { :root { color: oklch(0.9 0.009 250); background: oklch(0.18 0.012 255); --background: oklch(0.18 0.012 255); --surface: oklch(0.225 0.014 255); --surface-raised: oklch(0.255 0.015 255); --surface-muted: oklch(0.28 0.016 255); --text: oklch(0.9 0.009 250); --text-muted: oklch(0.68 0.018 250); --border: oklch(0.34 0.018 255); --border-strong: oklch(0.43 0.022 255); --accent: oklch(0.7 0.15 250); --accent-hover: oklch(0.75 0.13 250); --accent-soft: oklch(0.3 0.05 250); --success: oklch(0.72 0.12 155); --success-soft: oklch(0.29 0.045 155); --error: oklch(0.72 0.15 25); --error-soft: oklch(0.3 0.05 25); --warning: oklch(0.78 0.13 75); --shadow: 0 18px 48px oklch(0.08 0.015 255 / 0.28); } .canvas-stage { background-color: oklch(0.16 0.01 255); background-image: linear-gradient(45deg, oklch(0.2 0.012 255) 25%, transparent 25%), linear-gradient(-45deg, oklch(0.2 0.012 255) 25%, transparent 25%), linear-gradient(45deg, transparent 75%, oklch(0.2 0.012 255) 75%), linear-gradient(-45deg, transparent 75%, oklch(0.2 0.012 255) 75%); } } @media (prefers-reduced-motion: reduce) { *, *::before, *::after { scroll-behavior: auto !important; transition-duration: 0.01ms !important; } }