@import "tailwindcss/theme"; @import "tailwindcss/utilities"; @theme { --color-brand-50: #eff6ff; --color-brand-100: #dbeafe; --color-brand-200: #bfdbfe; --color-brand-300: #93c5fd; --color-brand-400: #60a5fa; --color-brand-500: #3b82f6; --color-brand-600: #2563eb; } :root { --app-bg: #fbfbfc; --panel-bg: #ffffff; --panel-soft: #f8fafc; --accent: #E57300; --accent-hover: #ff8c00; --accent-soft: rgba(229, 115, 0, 0.12); --text-primary: #0f172a; --text-secondary: #475569; --grid-line: #e2e8f0; --success: #10b981; --warning: #f59e0b; --danger: #ef4444; --shadow-sm: 0 2px 4px rgba(0,0,0,0.02); --shadow-md: 0 8px 16px -4px rgba(0,0,0,0.04); --shadow-lg: 0 12px 24px -8px rgba(0,0,0,0.08); --radius-sm: 6px; --radius-md: 10px; --radius-lg: 16px; --font-sans: 'Inter', system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; } *, *::before, *::after { box-sizing: border-box; } html, body, #root { height: 100%; margin: 0; } body { background: var(--app-bg); color: var(--text-primary); font-family: var(--font-sans); -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } .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; } button, input, textarea { font: inherit; } button { border: 0; background: none; color: inherit; } .app-shell { min-height: 100%; background: var(--app-bg); } .app-shell.is-studio { height: 100%; overflow: hidden; } .app-header { height: 60px; padding: 0 24px; display: flex; align-items: center; justify-content: space-between; background: var(--panel-bg); border-bottom: 1px solid var(--grid-line); position: sticky; top: 0; z-index: 30; } .app-brand { display: inline-flex; align-items: center; gap: 12px; cursor: pointer; } .app-brand-mark { width: 34px; height: 34px; display: inline-flex; align-items: center; justify-content: center; background: var(--accent); color: #fff; border-radius: 0; font-weight: 700; } .app-brand-copy { display: flex; flex-direction: column; align-items: flex-start; gap: 2px; } .app-brand-copy strong { font-size: 15px; } .app-brand-copy small { font-size: 12px; color: var(--text-secondary); } .app-header-nav { display: flex; align-items: center; gap: 8px; } .btn { display: inline-flex; align-items: center; justify-content: center; gap: 8px; min-height: 38px; padding: 0 16px; border-radius: var(--radius-sm); border: 1px solid var(--grid-line); background: var(--panel-bg); color: var(--text-primary); font-weight: 500; cursor: pointer; transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1); box-shadow: var(--shadow-sm); } .btn:hover { background: var(--panel-soft); transform: translateY(-1px); box-shadow: var(--shadow-md); } .btn:active { transform: translateY(0); } .btn-primary { background: var(--accent); color: #fff; border-color: var(--accent); box-shadow: 0 4px 12px rgba(229, 115, 0, 0.25); } .btn-primary:hover { background: var(--accent-hover); border-color: var(--accent-hover); box-shadow: 0 6px 16px rgba(229, 115, 0, 0.35); } .btn-sm { min-height: 32px; padding: 0 12px; font-size: 13px; border-radius: var(--radius-sm); } .btn-ghost { color: var(--text-secondary); } .btn-export { min-width: 104px; } .glass { background: rgba(255, 255, 255, 0.7); backdrop-filter: blur(16px); -webkit-backdrop-filter: blur(16px); border: 1px solid rgba(255, 255, 255, 0.6); box-shadow: var(--shadow-md); border-radius: var(--radius-md); } .glass-pill { background: rgba(255, 255, 255, 0.85); backdrop-filter: blur(12px); -webkit-backdrop-filter: blur(12px); border: 1px solid rgba(226, 232, 240, 0.7); box-shadow: var(--shadow-lg); border-radius: 9999px; } .gradient-text { background: linear-gradient(135deg, var(--accent), #ff9d00); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; color: transparent; } .upload-section, .processing-view, .health-dashboard { padding: 32px 24px 48px; } .upload-section { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 24px; } .upload-hero { max-width: 760px; text-align: center; } .upload-hero h1 { margin: 0 0 12px; font-size: clamp(2rem, 4vw, 3.5rem); line-height: 1.05; } .upload-hero p { margin: 0; color: var(--text-secondary); font-size: 16px; line-height: 1.65; } .upload-zone { width: min(100%, 720px); padding: 52px 32px; border: 2px dashed rgba(229, 115, 0, 0.4); border-radius: var(--radius-lg); background: rgba(255, 255, 255, 0.6); backdrop-filter: blur(8px); -webkit-backdrop-filter: blur(8px); display: flex; flex-direction: column; align-items: center; gap: 12px; cursor: pointer; transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); box-shadow: var(--shadow-sm); } .upload-zone:hover, .upload-zone.drag-over { border-color: var(--accent); background: rgba(255, 255, 255, 0.9); transform: translateY(-2px); box-shadow: 0 12px 24px -8px rgba(229, 115, 0, 0.15); } .upload-zone.is-uploading { border-style: solid; border-color: rgba(229, 115, 0, 0.7); box-shadow: 0 0 0 4px rgba(229, 115, 0, 0.12); } .upload-zone:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; } .upload-zone input { display: none; } .upload-zone-icon { width: 56px; height: 56px; display: inline-flex; align-items: center; justify-content: center; border-radius: 0; background: rgba(0, 168, 168, 0.08); font-size: 26px; } .upload-zone h3, .upload-zone p, .jobs-header h2, .processing-view h2, .health-header h2, .studio-table-card-header h4 { margin: 0; } .upload-zone p { color: var(--text-secondary); } .upload-meta { margin-top: 6px; display: inline-flex; align-items: center; gap: 10px; color: var(--text-secondary); font-size: 12px; } .upload-meta span { padding: 2px 8px; border: 1px solid rgba(226, 232, 240, 0.8); border-radius: 999px; background: rgba(248, 250, 252, 0.8); } .upload-errors { width: min(100%, 720px); display: flex; flex-direction: column; gap: 8px; } .upload-error-item { padding: 10px 12px; border-radius: var(--radius-sm); border: 1px solid rgba(220, 38, 38, 0.2); background: rgba(220, 38, 38, 0.08); color: #991b1b; font-size: 13px; } .pipeline-steps { width: min(100%, 900px); display: grid; grid-template-columns: repeat(auto-fit, minmax(140px, 1fr)); gap: 12px; } .pipeline-step { display: flex; align-items: center; gap: 10px; min-height: 44px; padding: 10px 12px; border-radius: var(--radius-sm); background: rgba(255, 255, 255, 0.7); backdrop-filter: blur(4px); border: 1px solid rgba(226, 232, 240, 0.8); color: var(--text-secondary); font-weight: 500; box-shadow: var(--shadow-sm); } .step-num { width: 24px; height: 24px; border-radius: 0; background: rgba(0, 168, 168, 0.1); color: var(--accent); display: inline-flex; align-items: center; justify-content: center; font-size: 12px; font-weight: 700; } .upload-queue { width: min(100%, 720px); padding: 16px; } .upload-queue-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 10px; } .upload-queue-header h3 { margin: 0; font-size: 15px; } .upload-queue-header span { color: var(--text-secondary); font-size: 12px; } .upload-queue-list { display: flex; flex-direction: column; gap: 8px; } .upload-queue-item { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 10px; border: 1px solid var(--grid-line); border-radius: var(--radius-sm); background: rgba(255, 255, 255, 0.85); } .upload-queue-name { font-size: 14px; font-weight: 600; } .upload-queue-meta { font-size: 12px; color: var(--text-secondary); text-transform: capitalize; } .upload-queue-actions { display: inline-flex; align-items: center; gap: 8px; } .upload-guide { width: min(100%, 900px); padding: 16px; } .upload-guide h3 { margin: 0 0 12px; font-size: 15px; } .upload-guide-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px; } .upload-guide-item { border: 1px solid var(--grid-line); border-radius: var(--radius-sm); background: rgba(255, 255, 255, 0.85); padding: 10px 12px; } .upload-guide-item strong { display: block; font-size: 13px; margin-bottom: 4px; } .upload-guide-item p { margin: 0; color: var(--text-secondary); font-size: 13px; line-height: 1.45; } .jobs-section { padding: 0 24px 48px; } .jobs-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 16px; } .jobs-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); gap: 16px; } .job-card { background: var(--panel-bg); border: 1px solid var(--grid-line); border-radius: var(--radius-md); overflow: hidden; cursor: pointer; box-shadow: var(--shadow-sm); transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1); } .job-card:hover { transform: translateY(-2px); box-shadow: var(--shadow-md); border-color: var(--accent-soft); } .job-card-thumb { width: 100%; height: 180px; object-fit: contain; display: block; background: var(--panel-soft); } .job-card-body { padding: 14px; display: flex; align-items: center; justify-content: space-between; gap: 12px; } .job-card-name { font-weight: 600; } .job-card-meta { margin-top: 4px; color: var(--text-secondary); font-size: 13px; } .badge { display: inline-flex; align-items: center; justify-content: center; min-height: 24px; padding: 0 10px; border-radius: 0; font-size: 12px; font-weight: 600; } .badge-done { color: var(--success); background: rgba(22, 163, 74, 0.1); } .processing-view { min-height: calc(100vh - 60px); display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 16px; text-align: center; } .processing-view p { margin: 0; color: var(--text-secondary); } .spinner { width: 52px; height: 52px; border-radius: 0; border: 3px solid rgba(0, 168, 168, 0.15); border-top-color: var(--accent); animation: spin 0.8s linear infinite; } @keyframes spin { to { transform: rotate(360deg); } } @keyframes pulse-badge { 0%, 100% { box-shadow: none; } 50% { box-shadow: none; } } .health-dashboard { max-width: 1200px; margin: 0 auto; } .health-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 24px; } .health-uptime, .health-stat-sub, .health-dot, .health-empty, .health-loading, .health-error-time, .health-error-msg, .health-stat-label { color: var(--text-secondary); } .health-status-dot, .health-dot { width: 8px; height: 8px; border-radius: 0; display: inline-block; } .health-status-dot.online, .health-dot.success { background: var(--success); } .health-dot.error { background: var(--danger); } .health-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 16px; } .health-card { padding: 20px; border-radius: 0; background: var(--panel-bg); border: 1px solid var(--grid-line); } .health-card h3 { margin: 0 0 16px; font-size: 13px; letter-spacing: 0.04em; text-transform: uppercase; color: var(--text-secondary); } .health-card-errors { grid-column: 1 / -1; } .health-stats-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px; } .health-stat-card { padding: 14px; border-radius: 0; background: var(--app-bg); border: 1px solid var(--grid-line); } .health-stat-card.accent .health-stat-value { color: var(--accent); } .health-stat-card.success .health-stat-value { color: var(--success); } .health-stat-card.error .health-stat-value { color: var(--danger); } .health-stat-value { font-size: 28px; font-weight: 700; } .health-donut-wrap { width: 160px; height: 160px; margin: 0 auto 12px; } .health-donut { width: 100%; height: 100%; } .health-donut-legend { display: flex; justify-content: center; gap: 16px; font-size: 13px; } .health-error-list { display: flex; flex-direction: column; gap: 8px; } .health-error-item { display: grid; grid-template-columns: 120px 1fr 90px; gap: 10px; padding: 12px; border-radius: 0; background: rgba(220, 38, 38, 0.06); border: 1px solid rgba(220, 38, 38, 0.14); } .health-error-job { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-weight: 600; } .studio-shell { height: 100vh; overflow: hidden; background: var(--app-bg); } .studio-header { position: fixed; inset: 0 0 auto 0; height: 60px; padding: 0 20px; display: grid; grid-template-columns: 1fr auto 1fr; align-items: center; gap: 16px; background: var(--panel-bg); border-bottom: 1px solid var(--grid-line); z-index: 60; } .studio-header-brand, .studio-header-actions { display: flex; align-items: center; gap: 12px; } .studio-header-actions { justify-content: flex-end; } .studio-brand-button { color: var(--text-primary); font-weight: 700; font-size: 16px; cursor: pointer; } .studio-header-file { color: var(--text-secondary); font-size: 13px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .studio-header-pill { min-height: 38px; padding: 0 14px; border-radius: 0; background: var(--panel-soft); display: inline-flex; align-items: center; justify-content: center; gap: 14px; color: var(--text-secondary); font-size: 13px; justify-self: center; } .studio-workspace { height: calc(100vh - 60px); margin-top: 60px; display: flex; overflow: hidden; } .studio-pane-wrap { min-width: 0; flex: 1 1 auto; } .studio-pane-wrap-right { flex: 1 1 0; } .studio-panel { height: 100%; background: var(--panel-bg); } .studio-document-pane, .studio-grid-pane { display: flex; flex-direction: column; min-width: 0; } .studio-splitter { width: 4px; background: var(--grid-line); cursor: col-resize; transition: none; flex: 0 0 4px; } .studio-splitter:hover { background: var(--accent); } .studio-toolbar, .studio-grid-context { position: sticky; top: 0; z-index: 12; } .studio-grid-context { background: var(--panel-bg); } .studio-document-pane { position: relative; } .studio-palette { position: absolute; z-index: 100; display: flex; flex-direction: column; background: rgba(255, 255, 255, 0.85); backdrop-filter: blur(20px); -webkit-backdrop-filter: blur(20px); border: 1px solid rgba(255, 255, 255, 0.6); box-shadow: var(--shadow-lg); border-radius: var(--radius-lg); overflow: hidden; min-width: 240px; min-height: 200px; } .palette-header { height: 12px; width: 100%; cursor: grab; display: flex; align-items: center; justify-content: center; padding-top: 6px; } .palette-header:active { cursor: grabbing; } .palette-drag-dot { width: 32px; height: 4px; background: var(--text-secondary); opacity: 0.2; border-radius: 2px; } .palette-content { flex: 1; overflow: auto; padding: 8px 16px 16px; display: flex; flex-direction: column; gap: 14px; } .palette-resize-handle { position: absolute; bottom: 4px; right: 4px; width: 12px; height: 12px; cursor: nwse-resize; border-right: 2px solid var(--text-secondary); border-bottom: 2px solid var(--text-secondary); opacity: 0.15; } .studio-threshold-control { display: flex; flex-direction: column; gap: 8px; } .studio-threshold-label { font-size: 13px; color: var(--text-secondary); } .studio-threshold-row { display: flex; align-items: center; gap: 12px; } .studio-threshold-row input[type="range"] { width: 100%; accent-color: var(--accent); } .studio-threshold-value { min-width: 36px; color: var(--text-secondary); font-variant-numeric: tabular-nums; } .studio-toolbar-toggles { display: flex; flex-wrap: wrap; gap: 8px; } .studio-toggle { min-height: 34px; padding: 0 12px; border-radius: var(--radius-sm); border: 1px solid var(--grid-line); background: var(--panel-bg); color: var(--text-secondary); font-weight: 500; cursor: pointer; transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1); } .studio-toggle:hover { background: var(--panel-soft); color: var(--text-primary); } .studio-toggle.is-active { background: var(--accent); border-color: var(--accent); color: #fff; } .studio-document-scroll, .studio-grid-scroll { min-height: 0; overflow: auto; } .studio-document-stack { padding: 16px; display: flex; flex-direction: column; gap: 24px; } .document-page { display: flex; flex-direction: column; gap: 10px; } .document-page-meta { color: var(--text-secondary); font-size: 12px; text-transform: uppercase; letter-spacing: 0.06em; } .document-page-card { background: var(--panel-bg); border-radius: 0; box-shadow: none; overflow: hidden; width: fit-content; max-width: 100%; } .document-stage { display: block; } .document-stage canvas { display: block; } .studio-grid-context { min-height: 52px; padding: 0 18px; display: flex; align-items: center; justify-content: space-between; border-bottom: 1px solid var(--grid-line); color: var(--text-secondary); font-size: 13px; } .studio-grid-scroll { padding: 18px; background: var(--app-bg); } .studio-table-card { background: var(--panel-bg); border-radius: 0; border: 1px solid rgba(229, 231, 235, 0.9); overflow: hidden; box-shadow: none; } .studio-table-card + .studio-table-card { margin-top: 16px; } .studio-table-card.is-active { box-shadow: none; border-color: var(--accent); border-width: 2px; } .studio-table-card-header { padding: 16px 18px; border-bottom: 1px solid var(--grid-line); } .studio-table-card-header p { margin: 4px 0 0; color: var(--text-secondary); font-size: 13px; } .studio-table-scroll { overflow: auto; } .studio-table-grid { width: 100%; border-collapse: collapse; table-layout: fixed; background: var(--panel-bg); } .studio-cell { min-width: 110px; min-height: 44px; padding: 10px 12px; border: 1px solid var(--grid-line); vertical-align: top; background: var(--panel-bg); outline: none; position: relative; } .studio-cell:hover { background: rgba(251, 211, 141, 0.18); } .studio-cell.is-active { background: rgba(0, 168, 168, 0.1); box-shadow: none; } .studio-cell.is-empty, .studio-cell-missing { background: repeating-linear-gradient( 135deg, #f3f4f6 0, #f3f4f6 8px, #ffffff 8px, #ffffff 16px ); } .studio-cell.is-editing { padding: 0; } .studio-cell-text { display: block; white-space: pre-wrap; word-break: break-word; } .studio-grid-editor { width: 100%; min-height: 66px; padding: 10px 12px; border: 0; outline: none; resize: none; background: rgba(0, 168, 168, 0.06); color: var(--text-primary); } .studio-empty-state { padding: 40px 16px; text-align: center; color: var(--text-secondary); background: var(--panel-bg); border: 1px solid var(--grid-line); border-radius: 0; } .studio-toast { position: fixed; transform: translate(-50%, 8px); padding: 8px 12px; border-radius: 0; background: rgba(31, 41, 55, 0.92); color: #fff; font-size: 12px; pointer-events: none; z-index: 80; } @media (max-width: 1100px) { .studio-header { grid-template-columns: 1fr; height: auto; min-height: 60px; padding: 12px 16px; } .studio-header-pill { justify-self: stretch; flex-wrap: wrap; } .studio-header-actions { justify-content: flex-start; flex-wrap: wrap; } .studio-workspace { height: auto; min-height: calc(100vh - 60px); flex-direction: column; margin-top: 104px; } .studio-pane-wrap { flex-basis: auto !important; } .studio-panel { height: auto; min-height: 50vh; } .studio-splitter { width: 100%; height: 4px; cursor: row-resize; } } @media (max-width: 720px) { .app-header, .jobs-section, .upload-section, .processing-view, .health-dashboard { padding-left: 16px; padding-right: 16px; } .app-header { padding-top: 8px; padding-bottom: 8px; height: auto; min-height: 60px; flex-direction: column; gap: 12px; align-items: stretch; } .app-header-nav { flex-wrap: wrap; } .health-stats-grid, .health-grid, .jobs-grid { grid-template-columns: 1fr; } .health-error-item { grid-template-columns: 1fr; } .pipeline-steps { grid-template-columns: repeat(2, minmax(0, 1fr)); } .upload-zone { padding: 34px 16px; } .upload-queue-item { align-items: flex-start; flex-direction: column; } .upload-guide-grid { grid-template-columns: 1fr; } } @keyframes boomerang { 0% { transform: translateX(0) rotate(0deg); } 45% { transform: translateX(120px) rotate(360deg); } 55% { transform: translateX(120px) rotate(360deg); } 100% { transform: translateX(0) rotate(0deg); } } .fedora-boomerang { display: inline-block; animation: boomerang 2s ease-in-out infinite; animation-delay: 8s; /* Every 10s roughly, 2s anim + 8s wait */ }