/* RAG-cut Design System — ui-ux-pro-max: Accessible & Ethical + Tech SaaS */ :root { --color-primary: #2563eb; --color-primary-hover: #1d4ed8; --color-secondary: #3b82f6; --color-cta: #f97316; --color-bg: #f8fafc; --color-surface: #ffffff; --color-border: #e2e8f0; --color-border-strong: #cbd5e1; --color-text: #1e293b; --color-text-muted: #64748b; --color-text-subtle: #94a3b8; --color-success: #16a34a; --color-error: #dc2626; --color-focus: #2563eb; --color-chunk-active: #eff6ff; --color-chunk-border: #93c5fd; --font-heading: "Space Grotesk", system-ui, sans-serif; --font-body: "DM Sans", system-ui, sans-serif; --font-mono: "JetBrains Mono", ui-monospace, monospace; --radius-sm: 6px; --radius-md: 8px; --radius-lg: 12px; --shadow-sm: 0 1px 2px rgba(15, 23, 42, 0.06); --shadow-md: 0 4px 12px rgba(15, 23, 42, 0.08); --space-1: 4px; --space-2: 8px; --space-3: 12px; --space-4: 16px; --space-5: 24px; --space-6: 32px; --transition: 180ms ease; --header-h: 64px; --sidebar-w: 300px; } @media (prefers-reduced-motion: reduce) { *, *::before, *::after { animation-duration: 0.01ms !important; transition-duration: 0.01ms !important; } } *, *::before, *::after { box-sizing: border-box; } html { font-size: 16px; scroll-behavior: smooth; } body { margin: 0; font-family: var(--font-body); color: var(--color-text); background: var(--color-bg); line-height: 1.5; min-height: 100dvh; } .sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0; } .skip-link { position: absolute; top: -100%; left: var(--space-4); z-index: 1000; padding: var(--space-2) var(--space-4); background: var(--color-primary); color: #fff; border-radius: var(--radius-sm); text-decoration: none; font-weight: 600; } .skip-link:focus { top: var(--space-2); } /* Header */ .app-header { position: sticky; top: 0; z-index: 100; display: flex; align-items: center; justify-content: space-between; height: var(--header-h); padding: 0 var(--space-5); background: var(--color-surface); border-bottom: 1px solid var(--color-border); box-shadow: var(--shadow-sm); } .brand { display: flex; align-items: center; gap: var(--space-3); } .brand-icon { color: var(--color-primary); flex-shrink: 0; } .brand h1 { margin: 0; font-family: var(--font-heading); font-size: 1.25rem; font-weight: 700; letter-spacing: -0.02em; } .brand-sub { margin: 0; font-size: 0.8125rem; color: var(--color-text-muted); } .badge { display: inline-flex; align-items: center; padding: var(--space-1) var(--space-3); border-radius: 999px; font-size: 0.8125rem; font-weight: 500; } .badge-idle { background: #f1f5f9; color: var(--color-text-muted); } .badge-loading { background: #fef3c7; color: #92400e; } .badge-success { background: #dcfce7; color: #166534; } .badge-error { background: #fee2e2; color: var(--color-error); } /* Layout */ .app-layout { display: grid; grid-template-columns: var(--sidebar-w) 1fr; min-height: calc(100dvh - var(--header-h)); } .config-panel { background: var(--color-surface); border-right: 1px solid var(--color-border); padding: var(--space-5); overflow-y: auto; max-height: calc(100dvh - var(--header-h)); } .panel-section { margin-bottom: var(--space-5); } .panel-section h2 { margin: 0 0 var(--space-3); font-family: var(--font-heading); font-size: 0.875rem; font-weight: 600; text-transform: uppercase; letter-spacing: 0.04em; color: var(--color-text-muted); } /* Dropzone */ .dropzone { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: var(--space-2); min-height: 140px; padding: var(--space-5); border: 2px dashed var(--color-border-strong); border-radius: var(--radius-lg); background: var(--color-bg); cursor: pointer; transition: border-color var(--transition), background var(--transition); text-align: center; } .dropzone:hover, .dropzone:focus-visible, .dropzone.dragover { border-color: var(--color-primary); background: #eff6ff; outline: none; } .dropzone:focus-visible { box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.35); } .dropzone svg { color: var(--color-text-subtle); } .dropzone-title { margin: 0; font-weight: 600; font-size: 0.9375rem; } .dropzone-hint { margin: 0; font-size: 0.8125rem; color: var(--color-text-muted); } .dropzone-file { margin: var(--space-2) 0 0; font-size: 0.8125rem; color: var(--color-primary); font-weight: 500; word-break: break-all; } /* Form */ .config-form { display: flex; flex-direction: column; gap: var(--space-3); } .field { display: flex; flex-direction: column; gap: var(--space-1); } .field-row { display: grid; grid-template-columns: 1fr 1fr; gap: var(--space-3); } .field label { font-size: 0.8125rem; font-weight: 500; color: var(--color-text); } .field input, .field select { height: 44px; padding: 0 var(--space-3); border: 1px solid var(--color-border-strong); border-radius: var(--radius-sm); font-family: var(--font-body); font-size: 0.9375rem; color: var(--color-text); background: var(--color-surface); transition: border-color var(--transition), box-shadow var(--transition); } .field input:focus, .field select:focus { outline: none; border-color: var(--color-primary); box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.2); } .helper { font-size: 0.75rem; color: var(--color-text-muted); } .mode-options { display: flex; flex-direction: column; gap: var(--space-3); } .hidden { display: none !important; } .auto-policy { display: flex; flex-direction: column; gap: var(--space-3); padding: var(--space-3); border: 1px solid var(--color-border); border-radius: var(--radius-md); background: #f8fafc; } .auto-policy-kicker { display: inline-flex; width: fit-content; padding: 2px 6px; border-radius: 4px; background: #dbeafe; color: #1e40af; font-family: var(--font-mono); font-size: 0.6875rem; font-weight: 700; letter-spacing: 0; } .auto-policy-title { margin: var(--space-2) 0 0; font-size: 0.875rem; font-weight: 600; color: var(--color-text); } .auto-policy-grid { display: grid; grid-template-columns: 1fr 1fr; gap: var(--space-2); margin: 0; } .auto-policy-grid div { min-width: 0; padding: var(--space-2); border: 1px solid var(--color-border); border-radius: var(--radius-sm); background: var(--color-surface); } .auto-policy-grid dt { margin: 0; font-size: 0.6875rem; color: var(--color-text-muted); } .auto-policy-grid dd { margin: 2px 0 0; font-size: 0.8125rem; font-weight: 600; color: var(--color-text); word-break: break-word; } /* Button */ .btn { display: inline-flex; align-items: center; justify-content: center; gap: var(--space-2); min-height: 44px; padding: 0 var(--space-4); border: none; border-radius: var(--radius-sm); font-family: var(--font-body); font-size: 0.9375rem; font-weight: 600; cursor: pointer; transition: background var(--transition), opacity var(--transition), transform 80ms ease; } .btn:active:not(:disabled) { transform: scale(0.98); } .btn:disabled { opacity: 0.5; cursor: not-allowed; } .btn-primary { background: var(--color-primary); color: #fff; width: 100%; } .btn-primary:hover:not(:disabled) { background: var(--color-primary-hover); } .btn-primary:focus-visible { outline: none; box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.4); } .btn-spinner { width: 18px; height: 18px; border: 2px solid rgba(255,255,255,0.3); border-top-color: #fff; border-radius: 50%; animation: spin 0.7s linear infinite; } @keyframes spin { to { transform: rotate(360deg); } } /* Stats */ .stats-grid { display: grid; grid-template-columns: 1fr 1fr; gap: var(--space-3); margin: 0; } .stats-grid div { padding: var(--space-3); background: var(--color-bg); border-radius: var(--radius-sm); border: 1px solid var(--color-border); } .stats-grid dt { margin: 0; font-size: 0.75rem; color: var(--color-text-muted); } .stats-grid dd { margin: var(--space-1) 0 0; font-family: var(--font-heading); font-size: 1.125rem; font-weight: 600; } .mono { font-family: var(--font-mono); font-size: 0.75rem !important; word-break: break-all; } /* History */ .history-header { display: flex; align-items: center; justify-content: space-between; gap: var(--space-2); margin-bottom: var(--space-2); } .history-header h2 { margin: 0; } .btn-ghost { background: transparent; color: var(--color-text-muted); border: 1px solid var(--color-border); width: auto; min-height: 32px; padding: 0 var(--space-3); font-size: 0.8125rem; font-weight: 500; } .btn-ghost:hover:not(:disabled) { background: var(--color-bg); color: var(--color-text); border-color: var(--color-border-strong); } .btn-sm { min-height: 32px; } .history-hint { margin: 0 0 var(--space-2); font-size: 0.75rem; color: var(--color-text-muted); } .history-list { display: flex; flex-direction: column; gap: var(--space-2); max-height: 280px; overflow-y: auto; } .history-item { display: flex; align-items: stretch; gap: var(--space-1); width: 100%; padding: var(--space-1); border: 1px solid var(--color-border); border-radius: var(--radius-sm); background: var(--color-surface); color: var(--color-text); transition: border-color var(--transition), background var(--transition); } .history-item:hover { border-color: var(--color-chunk-border); background: var(--color-chunk-active); } .history-item.active { border-color: var(--color-primary); background: var(--color-chunk-active); box-shadow: inset 3px 0 0 var(--color-primary); } .history-item-load { flex: 1; min-width: 0; display: flex; flex-direction: column; align-items: flex-start; gap: 2px; padding: var(--space-2); border: 0; background: transparent; text-align: left; cursor: pointer; font-family: var(--font-body); color: inherit; } .history-item-delete { flex-shrink: 0; align-self: center; margin-right: var(--space-1); min-height: 28px; padding: 0 var(--space-2); border: 1px solid transparent; border-radius: var(--radius-sm); background: transparent; color: var(--color-text-muted); font-family: var(--font-body); font-size: 0.75rem; cursor: pointer; transition: color var(--transition), border-color var(--transition), background var(--transition); } .history-item-delete:hover { color: #b42318; border-color: #fecdca; background: #fef3f2; } .history-item-name { font-size: 0.8125rem; font-weight: 600; word-break: break-all; line-height: 1.35; } .history-item-meta { font-size: 0.6875rem; color: var(--color-text-muted); font-family: var(--font-mono); } /* Workspace */ .workspace { padding: var(--space-5); overflow-y: auto; max-height: calc(100dvh - var(--header-h)); display: flex; flex-direction: column; gap: var(--space-4); min-height: 0; } .workspace:has(#workspacePane:not(.hidden)) { overflow: hidden; } .empty-state { flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: center; text-align: center; padding: var(--space-6); color: var(--color-text-muted); } .empty-state svg { color: var(--color-border-strong); margin-bottom: var(--space-4); } .empty-state h2 { margin: 0 0 var(--space-2); font-family: var(--font-heading); color: var(--color-text); } .empty-state p { max-width: 420px; margin: 0; } /* Workspace panes: original | chunk list | preview */ .workspace-pane { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 0.95fr) minmax(0, 1.15fr); gap: var(--space-4); flex: 1; min-height: 0; } .pane { display: flex; flex-direction: column; background: var(--color-surface); border: 1px solid var(--color-border); border-radius: var(--radius-lg); box-shadow: var(--shadow-sm); overflow: hidden; min-height: 0; max-height: 100%; } .pane-header { display: flex; align-items: center; justify-content: space-between; padding: var(--space-3) var(--space-4); border-bottom: 1px solid var(--color-border); background: var(--color-bg); } .pane-header h2 { margin: 0; font-family: var(--font-heading); font-size: 0.9375rem; font-weight: 600; } .pane-tag { font-size: 0.75rem; font-weight: 500; color: var(--color-text-muted); background: var(--color-surface); padding: 2px 8px; border-radius: 999px; border: 1px solid var(--color-border); } .pane-body { flex: 1; overflow: auto; padding: var(--space-4); min-height: 0; } .placeholder { color: var(--color-text-muted); font-size: 0.9375rem; } /* Original preview */ .original-docx { font-size: 0.9375rem; line-height: 1.6; } .original-docx img { max-width: 100%; height: auto; border-radius: var(--radius-sm); } .original-pdf { width: 100%; height: 100%; min-height: 240px; border: none; } .original-text { font-family: var(--font-mono); font-size: 0.8125rem; white-space: pre-wrap; word-break: break-word; color: var(--color-text); } .original-image { max-width: 100%; border-radius: var(--radius-sm); } /* Chunk list */ .chunk-list { padding: var(--space-2); display: flex; flex-direction: column; gap: var(--space-2); } .chunk-card { padding: var(--space-3); border: 1px solid var(--color-border); border-radius: var(--radius-md); background: var(--color-surface); cursor: pointer; transition: border-color var(--transition), background var(--transition), box-shadow var(--transition); text-align: left; width: 100%; font-family: inherit; } .chunk-card:hover { border-color: var(--color-chunk-border); background: #f8fafc; } .chunk-card:focus-visible { outline: none; box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.25); } .chunk-card.active { border-color: var(--color-primary); background: var(--color-chunk-active); box-shadow: var(--shadow-sm); } .chunk-card-header { display: flex; align-items: center; justify-content: space-between; gap: var(--space-2); margin-bottom: var(--space-2); } .chunk-index { font-family: var(--font-heading); font-weight: 600; font-size: 0.875rem; color: var(--color-primary); } .chunk-meta { font-size: 0.75rem; color: var(--color-text-muted); } .chunk-types { display: flex; flex-wrap: wrap; gap: var(--space-1); margin-bottom: var(--space-2); } .type-tag { font-size: 0.6875rem; font-weight: 500; padding: 2px 6px; border-radius: 4px; background: #f1f5f9; color: var(--color-text-muted); text-transform: uppercase; letter-spacing: 0.03em; } .type-tag-heading { background: #dbeafe; color: #1e40af; } .type-tag-image { background: #fce7f3; color: #9d174d; } .type-tag-table { background: #d1fae5; color: #065f46; } .type-tag-preview-only { background: #fef3c7; color: #92400e; } .chunk-snippet { font-size: 0.8125rem; color: var(--color-text-muted); line-height: 1.4; display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden; } /* Markdown preview (right pane) */ .pane-preview .markdown-body { font-size: 0.9375rem; line-height: 1.65; max-width: 75ch; } .markdown-body h1, .markdown-body h2, .markdown-body h3 { font-family: var(--font-heading); margin: 1.25em 0 0.5em; line-height: 1.3; } .markdown-body h1 { font-size: 1.375rem; } .markdown-body h2 { font-size: 1.125rem; } .markdown-body h3 { font-size: 1rem; } .markdown-body p { margin: 0.75em 0; } .markdown-body img { max-width: 100%; height: auto; border-radius: var(--radius-sm); border: 1px solid var(--color-border); margin: var(--space-3) 0; } .markdown-body table { width: 100%; border-collapse: collapse; font-size: 0.875rem; margin: var(--space-3) 0; } .markdown-body th, .markdown-body td { border: 1px solid var(--color-border); padding: var(--space-2) var(--space-3); text-align: left; } .markdown-body th { background: var(--color-bg); font-weight: 600; } .markdown-body code { font-family: var(--font-mono); font-size: 0.85em; background: #f1f5f9; padding: 2px 6px; border-radius: 4px; } /* Structured chunk blocks — images at original layout positions */ .chunk-blocks { display: flex; flex-direction: column; gap: var(--space-3); } .chunk-block-image { margin: 0; padding: var(--space-3); background: #f8fafc; border: 1px solid var(--color-border); border-radius: var(--radius-md); } .chunk-block-image img { display: block; max-width: 100%; height: auto; border-radius: var(--radius-sm); border: 1px solid var(--color-border); margin: var(--space-2) 0; } .chunk-block-image .block-context { font-size: 0.8125rem; font-weight: 600; color: var(--color-primary); margin-bottom: var(--space-2); } .chunk-block-image .ocr-caption { font-size: 0.8125rem; color: var(--color-text-muted); margin-top: var(--space-2); line-height: 1.45; } .block-meta { font-family: var(--font-mono); font-size: 0.6875rem; color: var(--color-text-subtle); margin-top: var(--space-1); } .chunk-block-heading { margin: var(--space-2) 0 var(--space-1); font-family: var(--font-heading); } .chunk-block-paragraph p { margin: 0; line-height: 1.6; } .chunk-block-table { overflow-x: auto; padding: var(--space-3); background: #f8fafc; border: 1px solid var(--color-border); border-radius: var(--radius-md); } .chunk-block-table .table-screenshot { margin: 0 0 var(--space-3); } .chunk-block-table .table-screenshot img { display: block; max-width: 100%; height: auto; border-radius: var(--radius-sm); border: 1px solid var(--color-border); } .chunk-block-table .table-markdown { overflow-x: auto; } .chunk-block-table .table-footnote { margin-top: var(--space-2); font-size: 0.8125rem; color: var(--color-text-muted); } .api-panel { background: var(--color-surface); border: 1px solid var(--color-border); border-radius: var(--radius-lg); padding: var(--space-4); } .recall-panel { background: var(--color-surface); border: 1px solid var(--color-border); border-radius: var(--radius-lg); padding: var(--space-4); } .recall-panel summary { cursor: pointer; font-weight: 600; font-family: var(--font-heading); } .recall-form { display: grid; grid-template-columns: minmax(240px, 1fr) 100px 140px; align-items: end; gap: var(--space-3); margin-top: var(--space-4); } .recall-form .field span { font-size: 0.8125rem; font-weight: 500; } .recall-submit { width: auto; } .recall-hint { margin: var(--space-3) 0; font-size: 0.8125rem; color: var(--color-text-muted); } .recall-results { display: flex; flex-direction: column; gap: var(--space-2); } .recall-result { display: grid; grid-template-columns: 36px minmax(0, 1fr) 64px; gap: var(--space-3); align-items: start; width: 100%; padding: var(--space-3); border: 1px solid var(--color-border); border-radius: var(--radius-md); background: var(--color-surface); color: var(--color-text); text-align: left; cursor: pointer; } .recall-result:hover { border-color: var(--color-primary); background: #f8fafc; } .recall-result-main { display: flex; flex-direction: column; gap: var(--space-1); min-width: 0; } .recall-result-main span { color: var(--color-text-muted); font-size: 0.8125rem; line-height: 1.4; } .recall-rank, .recall-score { font-family: var(--font-mono); font-size: 0.75rem; color: var(--color-primary); } .recall-score { text-align: right; } .api-panel summary { cursor: pointer; font-weight: 600; font-family: var(--font-heading); padding: var(--space-1) 0; } .api-panel summary:focus-visible { outline: 2px solid var(--color-focus); outline-offset: 2px; } .api-grid { display: grid; grid-template-columns: 1fr 1fr; gap: var(--space-4); margin-top: var(--space-4); } .api-grid h3 { margin: 0 0 var(--space-2); font-size: 0.8125rem; color: var(--color-text-muted); text-transform: uppercase; } .code-block { margin: 0; padding: var(--space-3); background: #0f172a; color: #e2e8f0; border-radius: var(--radius-sm); font-family: var(--font-mono); font-size: 0.75rem; line-height: 1.5; overflow: auto; max-height: 280px; white-space: pre-wrap; word-break: break-word; } /* Responsive */ @media (max-width: 1024px) { .app-layout { grid-template-columns: 1fr; } .config-panel { max-height: none; border-right: none; border-bottom: 1px solid var(--color-border); } .workspace-pane { grid-template-columns: 1fr; height: auto; } .workspace-pane .pane { max-height: 420px; } .api-grid { grid-template-columns: 1fr; } } @media (max-width: 768px) { .app-header { padding: 0 var(--space-4); } .workspace { padding: var(--space-4); } .field-row { grid-template-columns: 1fr; } .recall-form { grid-template-columns: 1fr; } }