:root { --bg-page: #f4f6fb; --bg-panel: #ffffff; --bg-soft: #eef2f8; --text-main: #142033; --text-muted: #5a6b87; --border: #d7deeb; --primary: #0f766e; --primary-2: #0ea5e9; --danger: #c2410c; --shadow: 0 16px 35px rgba(20, 32, 51, 0.08); --radius: 14px; --sidebar-width: 340px; } body[data-theme='night'] { --bg-page: #0f1422; --bg-panel: #161c2d; --bg-soft: #202944; --text-main: #e5edf8; --text-muted: #9aa9c3; --border: #2e3b5d; --primary: #8b5cf6; --primary-2: #22d3ee; --danger: #fb7185; --shadow: 0 20px 40px rgba(0, 0, 0, 0.35); } body[data-theme='ocean'] { --bg-page: #e9f8f8; --bg-panel: #f7ffff; --bg-soft: #dff1f4; --text-main: #0b2f39; --text-muted: #3e6874; --border: #b7d9e1; --primary: #0b8ba1; --primary-2: #0ea5e9; --danger: #be3d2a; } body[data-theme='sunset'] { --bg-page: #fff2ea; --bg-panel: #fffaf7; --bg-soft: #ffe5d6; --text-main: #3b1f1a; --text-muted: #7d5348; --border: #f0c4ae; --primary: #db5a42; --primary-2: #f59e0b; --danger: #b91c1c; } * { box-sizing: border-box; } html, body { height: 100%; margin: 0; } body { font-family: 'Manrope', 'Segoe UI', sans-serif; color: var(--text-main); background: radial-gradient(circle at 15% 10%, color-mix(in oklab, var(--primary) 12%, transparent) 0, transparent 30%), radial-gradient(circle at 95% 90%, color-mix(in oklab, var(--primary-2) 12%, transparent) 0, transparent 34%), var(--bg-page); overflow: hidden; } .app-container { display: grid; grid-template-columns: var(--sidebar-width) 1fr; height: 100vh; } .glass-panel { background: color-mix(in oklab, var(--bg-panel) 88%, transparent); backdrop-filter: blur(8px); border: 1px solid color-mix(in oklab, var(--border) 88%, white 12%); } #control-panel { position: relative; z-index: 5; padding: 20px; overflow-y: auto; border-right: 1px solid var(--border); box-shadow: var(--shadow); transition: transform 0.26s ease, opacity 0.26s ease, padding 0.26s ease, max-height 0.26s ease; } .panel-header { display: flex; gap: 12px; align-items: center; margin-bottom: 18px; } .logo-icon { width: 48px; height: 48px; border-radius: 12px; overflow: hidden; box-shadow: 0 10px 20px color-mix(in oklab, var(--primary-2) 30%, transparent); } .header-text h1 { margin: 0; font-size: 1.1rem; letter-spacing: 0.02em; } .subtitle { margin: 2px 0 0; font-size: 0.82rem; color: var(--text-muted); } .panel-toggle-btn { margin-left: auto; height: 34px; padding: 0 9px; font-size: 0.78rem; } .control-sections { display: flex; flex-direction: column; gap: 14px; } .control-section { background: var(--bg-panel); border: 1px solid var(--border); border-radius: var(--radius); padding: 14px; } .control-section h3 { margin: 0 0 12px; font-size: 0.78rem; letter-spacing: 0.08em; color: var(--text-muted); text-transform: uppercase; } .file-ops-section .button-grid { gap: 8px; margin-bottom: 7px; } .file-ops-section .btn { height: 40px; line-height: 1.1; } .button-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 9px; margin-bottom: 8px; } .button-grid.three-col { grid-template-columns: 1fr 1fr 1fr; } .button-grid.one-col { grid-template-columns: 1fr; } .btn { user-select: none; border: 1px solid var(--border); background: var(--bg-panel); color: var(--text-main); border-radius: 10px; height: 38px; padding: 0 10px; font-family: inherit; font-weight: 700; font-size: 0.83rem; cursor: pointer; display: inline-flex; align-items: center; justify-content: center; gap: 8px; transition: transform 0.18s ease, box-shadow 0.18s ease, border-color 0.18s ease, filter 0.18s ease; } .btn:hover { transform: translateY(-1px); border-color: color-mix(in oklab, var(--primary) 35%, var(--border)); box-shadow: 0 8px 16px color-mix(in oklab, var(--text-main) 14%, transparent); } .btn:disabled { opacity: 0.5; cursor: not-allowed; box-shadow: none; transform: none; } .btn-primary { background: linear-gradient(135deg, var(--primary), var(--primary-2)); color: #fff; border-color: transparent; box-shadow: 0 8px 20px color-mix(in oklab, var(--primary) 35%, transparent); } .btn-primary:hover { box-shadow: 0 10px 24px color-mix(in oklab, var(--primary) 45%, transparent); } .btn-danger { color: var(--danger); background: color-mix(in oklab, var(--danger) 10%, var(--bg-panel)); border-color: color-mix(in oklab, var(--danger) 35%, var(--border)); } .btn.active { background: color-mix(in oklab, var(--primary) 20%, var(--bg-panel)); border-color: color-mix(in oklab, var(--primary) 45%, var(--border)); } .full-width { width: 100%; } .btn-icon { line-height: 1; } .input-group { margin-bottom: 10px; } .input-group label { display: block; margin-bottom: 6px; font-size: 0.8rem; font-weight: 700; color: var(--text-muted); } .insert-position-grid { display: grid; grid-template-columns: 1fr 120px; gap: 8px; margin-bottom: 8px; } .ui-switches { display: grid; gap: 6px; } .ui-switch { display: flex; align-items: center; gap: 8px; font-size: 0.82rem; color: var(--text-main); font-weight: 700; } .ui-switch input[type='checkbox'] { accent-color: var(--primary); } input[type='number'], input[type='text'], select { width: 100%; height: 36px; border: 1px solid var(--border); background: var(--bg-panel); color: var(--text-main); border-radius: 10px; padding: 0 10px; font-family: inherit; font-size: 0.9rem; } #groupFilter, #themeSelect, #multiOrder, #groupOrderList { cursor: pointer; } input[type='color'] { width: 100%; height: 36px; border: 1px solid var(--border); border-radius: 10px; background: var(--bg-panel); padding: 4px; } input:focus, select:focus, textarea:focus { outline: 2px solid color-mix(in oklab, var(--primary-2) 28%, transparent); border-color: color-mix(in oklab, var(--primary-2) 45%, var(--border)); } input[type='range'] { width: 100%; } #viewport { z-index: 1; position: relative; overflow: hidden; cursor: grab; touch-action: none; background: linear-gradient(90deg, color-mix(in oklab, var(--text-main) 6%, transparent) 1px, transparent 1px), linear-gradient(180deg, color-mix(in oklab, var(--text-main) 6%, transparent) 1px, transparent 1px), color-mix(in oklab, var(--bg-page) 75%, white 25%); background-size: 28px 28px; } #viewport:active { cursor: grabbing; } #collage-area { position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); display: grid; gap: 4px; border-radius: 10px; box-shadow: 0 10px 26px color-mix(in oklab, var(--text-main) 12%, transparent); } .active-skins-badge { position: absolute; top: 10px; left: 50%; transform: translateX(-50%); z-index: 4; pointer-events: none; padding: 6px 12px; border-radius: 999px; border: 1px solid var(--border); background: color-mix(in oklab, var(--bg-panel) 84%, transparent); color: var(--text-main); font-size: 0.78rem; font-weight: 800; letter-spacing: 0.02em; box-shadow: 0 6px 14px color-mix(in oklab, var(--text-main) 10%, transparent); backdrop-filter: blur(4px); } #collage-area.tight { border-radius: 0; box-shadow: none; background: transparent !important; } #collage-area.tight .skin-item { border-radius: 0; } #collage-area.tight .skin-item:hover { transform: none; } .skin-item { position: relative; border-radius: 6px; border: 0; outline: 1px solid transparent; background-size: cover; background-position: top center; background-repeat: no-repeat; cursor: pointer; touch-action: manipulation; transition: 0.18s ease; } .skin-item:hover { outline-color: color-mix(in oklab, var(--primary) 65%, var(--primary-2)); transform: scale(1.01); } .skin-item.selected { outline-color: var(--primary); box-shadow: inset 0 0 0 3px color-mix(in oklab, var(--primary) 26%, transparent); } .skin-item.show-pos-hint::after { content: '#' attr(data-grid-pos); position: absolute; top: 6px; right: 6px; z-index: 2; background: color-mix(in oklab, #111 78%, transparent); color: #fff; border: 1px solid color-mix(in oklab, #fff 24%, transparent); border-radius: 999px; padding: 3px 8px; font-size: 0.72rem; font-weight: 800; line-height: 1; pointer-events: none; } .skin-item.search-hit { outline-color: #2563eb; box-shadow: inset 0 0 0 3px color-mix(in oklab, #2563eb 24%, transparent), 0 0 0 1px color-mix(in oklab, #2563eb 65%, transparent); } .search-badge { position: absolute; top: 6px; left: 6px; background: color-mix(in oklab, #2563eb 92%, white 8%); color: #fff; border-radius: 999px; font-weight: 800; font-size: 0.7rem; line-height: 1; padding: 4px 8px; letter-spacing: 0.02em; } .skin-item.placeholder { display: grid; place-items: center; background: var(--bg-soft); border: 1px dashed color-mix(in oklab, var(--border) 85%, var(--text-muted)); color: var(--text-muted); font-weight: 800; letter-spacing: 0.02em; } .skin-item.placeholder.search-hit { color: #1d4ed8; font-weight: 900; } .empty-state { position: absolute; inset: 0; display: grid; place-content: center; text-align: center; color: var(--text-muted); gap: 8px; } .empty-state.hidden { display: none; } .empty-icon { font-size: 2.6rem; } .floating-panel { position: fixed; left: 50%; bottom: 16px; transform: translate(-50%, 120%); transition: transform 0.25s ease; padding: 10px 12px; border-radius: 12px; border: 1px solid var(--border); box-shadow: var(--shadow); display: flex; align-items: center; gap: 12px; z-index: 30; } .floating-panel.visible { transform: translate(-50%, 0); } .selection-info { font-size: 0.85rem; font-weight: 700; color: var(--text-muted); } .button-group { display: flex; gap: 8px; } .modal-overlay { visibility: hidden; pointer-events: none; position: fixed; inset: 0; display: flex; align-items: center; justify-content: center; background: color-mix(in oklab, black 55%, transparent); z-index: 100; padding: 16px; opacity: 0; transition: opacity 0.2s ease; } .modal-overlay.active { visibility: visible; pointer-events: auto; opacity: 1; } .modal-content { width: min(760px, 100%); background: var(--bg-panel); border: 1px solid var(--border); border-radius: 16px; box-shadow: var(--shadow); } .modal-header, .modal-footer { padding: 14px 16px; display: flex; align-items: center; justify-content: space-between; } .modal-footer { justify-content: flex-end; gap: 10px; } .modal-body { padding: 0 16px 12px; } .modal-hint { margin: 8px 0 0; font-size: 0.8rem; color: var(--text-muted); } .modal-close { width: 32px; height: 32px; border-radius: 50%; border: 1px solid var(--border); background: var(--bg-panel); color: var(--text-main); cursor: pointer; } .processor-preview { height: 360px; background: #0f172a; display: grid; place-items: center; } .processor-preview img { max-width: 100%; max-height: 100%; } .stitch-preview { height: min(72vh, 680px); overflow: auto; background: #0f172a; } .stitch-preview img { width: auto; height: auto; max-width: 100%; max-height: none; object-fit: contain; display: block; margin: 0 auto; } .input-row { display: grid; grid-template-columns: 1fr 1fr auto; gap: 10px; align-items: end; } .insert-meta-panel { margin-top: 10px; padding-top: 10px; border-top: 1px solid var(--border); } #loading-overlay { z-index: 120; } .loader-container { background: var(--bg-panel); border-radius: 14px; padding: 18px 20px; text-align: center; border: 1px solid var(--border); width: min(420px, 100%); } .spinner { width: 36px; height: 36px; border-radius: 50%; border: 3px solid color-mix(in oklab, var(--primary) 20%, var(--border)); border-top-color: var(--primary-2); margin: 0 auto 10px; animation: spin 0.9s linear infinite; } @keyframes spin { to { transform: rotate(360deg); } } .loading-text { font-size: 0.78rem; letter-spacing: 0.08em; color: var(--text-muted); font-weight: 800; margin-bottom: 8px; } .loading-progress-label { font-size: 0.78rem; color: var(--text-main); font-weight: 700; margin-bottom: 8px; } .loading-progress-track { width: 100%; height: 10px; border-radius: 999px; background: color-mix(in oklab, var(--bg-soft) 80%, var(--border)); overflow: hidden; } .loading-progress-bar { height: 100%; width: 0%; background: linear-gradient(90deg, var(--primary), var(--primary-2)); transition: width 0.16s linear; } .loading-progress-detail { min-height: 1.1em; margin-top: 8px; font-size: 0.75rem; color: var(--text-muted); } .floating-action { display: none; position: fixed; top: 12px; left: 12px; z-index: 60; box-shadow: var(--shadow); } .sidebar-scrim, .mobile-quickbar { display: none; } body.sidebar-collapsed .app-container { grid-template-columns: 0 1fr; } body.sidebar-collapsed #control-panel { transform: translateX(-110%); opacity: 0; pointer-events: none; } body.sidebar-collapsed #btnToggleSidebarFab { display: inline-flex !important; } body.ui-compact #control-panel { padding: 14px; } body.ui-compact .control-section { padding: 10px; } body.ui-compact .btn { height: 34px; font-size: 0.78rem; } body.ui-contrast { --border: color-mix(in oklab, black 28%, var(--text-main)); --text-muted: color-mix(in oklab, var(--text-main) 72%, var(--bg-panel)); } @media (max-width: 980px) { .app-container { grid-template-columns: 1fr; grid-template-rows: auto 1fr; } #control-panel { border-right: 0; border-bottom: 1px solid var(--border); max-height: 44vh; } .button-grid, .button-grid.three-col { grid-template-columns: 1fr; } .input-row { grid-template-columns: 1fr; } .insert-position-grid { grid-template-columns: 1fr; } body.sidebar-collapsed .app-container { grid-template-columns: 1fr; grid-template-rows: 0 1fr; } body.sidebar-collapsed #control-panel { max-height: 0; padding-top: 0; padding-bottom: 0; border-bottom: 0; } } .hint-text { margin-top: 6px; font-size: 0.78rem; color: var(--text-muted); } .group-order-list { height: 148px; overflow-y: auto; border: 1px solid var(--border); border-radius: 10px; background: var(--bg-panel); padding: 6px; display: flex; flex-direction: column; gap: 6px; touch-action: pan-y; } .group-order-item { min-height: 34px; display: flex; align-items: center; gap: 10px; padding: 7px 9px; border-radius: 8px; border: 1px solid color-mix(in oklab, var(--border) 80%, transparent); background: color-mix(in oklab, var(--bg-panel) 88%, var(--bg-page)); cursor: default; user-select: none; transition: transform 160ms ease, background 160ms ease, border-color 160ms ease, box-shadow 160ms ease; } .group-order-item:hover { border-color: color-mix(in oklab, var(--primary) 35%, var(--border)); } .group-order-item.selected { border-color: color-mix(in oklab, var(--primary) 55%, var(--border)); background: color-mix(in oklab, var(--primary) 16%, var(--bg-panel)); box-shadow: 0 0 0 2px color-mix(in oklab, var(--primary) 18%, transparent); } .group-order-item.dragging { transform: scale(1.02); } .group-order-handle { width: 24px; height: 24px; display: inline-flex; align-items: center; justify-content: center; border-radius: 6px; border: 1px solid color-mix(in oklab, var(--border) 85%, transparent); background: color-mix(in oklab, var(--bg-soft) 72%, var(--bg-panel)); color: var(--text-muted); cursor: grab; font-size: 0.7rem; font-weight: 800; letter-spacing: 0.05em; touch-action: none; } .group-order-item.dragging .group-order-handle { cursor: grabbing; } .group-order-rank { width: 24px; height: 24px; display: inline-flex; align-items: center; justify-content: center; border-radius: 999px; font-size: 0.75rem; font-weight: 800; color: var(--text-muted); background: color-mix(in oklab, var(--bg-page) 70%, var(--bg-panel)); } .group-order-name { font-size: 0.86rem; font-weight: 700; color: var(--text-main); } textarea { width: 100%; min-height: 104px; border: 1px solid var(--border); background: var(--bg-panel); color: var(--text-main); border-radius: 10px; padding: 8px 10px; font-family: inherit; font-size: 0.85rem; line-height: 1.35; resize: vertical; } .markdown-preview { border: 1px solid var(--border); border-radius: 10px; background: var(--bg-panel); padding: 10px; max-height: 240px; overflow: auto; font-size: 0.84rem; line-height: 1.45; } .markdown-preview pre, .markdown-preview code { font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', monospace; } .markdown-preview pre { margin: 8px 0; padding: 8px; border-radius: 8px; background: color-mix(in oklab, var(--bg-soft) 78%, var(--bg-panel)); border: 1px solid var(--border); overflow: auto; } .markdown-preview h1, .markdown-preview h2, .markdown-preview h3 { margin: 8px 0 4px; } .markdown-preview p, .markdown-preview ul { margin: 6px 0; } #autoOrderInput { white-space: pre; } #autoOrderMissing { min-height: 86px; color: var(--text-muted); } .auto-suggestion-list { margin-top: 8px; display: flex; flex-direction: column; gap: 6px; } .suggest-row { background: color-mix(in oklab, var(--bg-panel) 80%, var(--bg-page)); border: 1px solid var(--border); border-radius: 8px; padding: 6px 8px; } .suggest-title { font-size: 0.76rem; color: var(--text-muted); margin-bottom: 5px; word-break: break-word; } .suggest-chips { display: flex; flex-wrap: wrap; gap: 6px; } .suggest-chip { border: 1px solid color-mix(in oklab, var(--primary) 40%, var(--border)); background: color-mix(in oklab, var(--primary) 14%, var(--bg-panel)); color: var(--text-main); border-radius: 999px; padding: 4px 10px; font-size: 0.75rem; cursor: pointer; } .suggest-chip:hover { border-color: color-mix(in oklab, var(--primary) 60%, var(--border)); } .tab-switcher { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 8px; margin-bottom: 12px; } .tab-btn.active { background: linear-gradient(135deg, var(--primary), var(--primary-2)); color: #fff; border-color: transparent; } .tab-panel { display: none; } .tab-panel.active { display: flex; } .hidden { display: none !important; } .ocr-workspace { z-index: 2; overflow: auto; padding: 22px; background: radial-gradient(circle at 10% 8%, color-mix(in oklab, var(--primary) 14%, transparent), transparent 32%), radial-gradient(circle at 88% 90%, color-mix(in oklab, var(--primary-2) 14%, transparent), transparent 36%), color-mix(in oklab, var(--bg-page) 78%, white 22%); } .profile-workspace { z-index: 2; padding: 0; background: #0f172a; } .profile-frame { width: 100%; height: 100%; border: 0; display: block; background: #0f172a; } .ocr-workspace-header h2 { margin: 0 0 6px; } .ocr-workspace-header p { margin: 0 0 14px; color: var(--text-muted); font-size: 0.9rem; } .ocr-results { display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: 12px; } .ocr-result-card { border: 1px solid var(--border); border-radius: 12px; background: var(--bg-panel); padding: 8px; box-shadow: var(--shadow); } .ocr-result-card img { width: 100%; border-radius: 8px; border: 1px solid var(--border); display: block; } .ocr-result-meta { margin-top: 8px; font-size: 0.8rem; color: var(--text-muted); font-weight: 700; } @media (max-width: 980px) { .tab-switcher { grid-template-columns: 1fr; } } #viewport, .ocr-workspace, .profile-workspace { grid-column: 2; grid-row: 1; min-height: 0; } @media (max-width: 980px) { #viewport, .ocr-workspace, .profile-workspace { grid-column: 1; grid-row: 2; } } .drawer-scrim { position: fixed; inset: 0; background: color-mix(in oklab, black 50%, transparent); opacity: 0; visibility: hidden; pointer-events: none; transition: opacity 0.24s ease; z-index: 40; } .drawer-scrim.open { opacity: 1; visibility: visible; pointer-events: auto; } .utility-drawer { position: fixed; top: 0; right: 0; width: 400px; max-width: calc(100vw - 18px); height: 100vh; z-index: 41; transform: translateX(105%); transition: transform 0.24s ease; border-left: 1px solid var(--border); box-shadow: -16px 0 30px color-mix(in oklab, var(--text-main) 24%, transparent); padding: 14px; overflow: hidden; display: flex; flex-direction: column; gap: 12px; } .utility-drawer.open { transform: translateX(0); } .utility-drawer-header { display: flex; align-items: center; justify-content: space-between; border-bottom: 1px solid var(--border); padding-bottom: 8px; } .utility-drawer-header h3 { margin: 0; font-size: 0.95rem; letter-spacing: 0.03em; } .utility-section { border: 1px solid var(--border); border-radius: 12px; background: color-mix(in oklab, var(--bg-panel) 92%, transparent); padding: 10px; } .utility-section label { font-size: 0.8rem; font-weight: 700; color: var(--text-muted); } .drawer-search-row { display: grid; grid-template-columns: 1fr auto; gap: 8px; margin-top: 6px; } .utility-row { display: flex; align-items: center; justify-content: space-between; gap: 8px; margin-bottom: 8px; } .utility-row h4 { margin: 0; font-size: 0.85rem; } .utility-actions { display: flex; gap: 8px; } .bin-list { max-height: 52vh; overflow: auto; border: 1px dashed var(--border); border-radius: 10px; padding: 6px; display: flex; flex-direction: column; gap: 6px; } .bin-empty { color: var(--text-muted); font-size: 0.82rem; text-align: center; padding: 12px 8px; } .bin-item { border: 1px solid var(--border); border-radius: 10px; padding: 8px; display: grid; grid-template-columns: 52px 1fr auto; gap: 8px; align-items: center; background: var(--bg-panel); } .bin-item.selected { border-color: color-mix(in oklab, var(--primary) 55%, var(--border)); box-shadow: 0 0 0 2px color-mix(in oklab, var(--primary) 18%, transparent); } .bin-item-preview { width: 52px; height: 52px; border-radius: 8px; object-fit: cover; border: 1px solid var(--border); background: var(--bg-soft); } .bin-item-preview.placeholder { display: grid; place-items: center; font-size: 0.68rem; font-weight: 700; color: var(--text-muted); } .bin-item-body { min-width: 0; } .bin-item-name { font-size: 0.82rem; font-weight: 700; color: var(--text-main); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .bin-item-meta { font-size: 0.72rem; color: var(--text-muted); } @media (max-width: 980px) { .utility-drawer { width: 100vw; max-width: 100vw; } }