@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500;700&display=swap'); @import "tailwindcss"; html, body, #root { overscroll-behavior: none; } @theme { --font-sans: "Inter", ui-sans-serif, system-ui, sans-serif; --font-mono: "JetBrains Mono", ui-monospace, SFMono-Regular, monospace; /* Photoshop-like UI tokens */ --color-ps-bg: #323232; --color-ps-panel: #292929; --color-ps-header: #3c3c3c; --color-ps-border: #1a1a1a; --color-ps-workspace: #535353; --color-ps-accent: #31a8ff; --color-ps-text: #e8e8e8; --color-ps-muted: #999999; --color-ps-input: #1e1e1e; --color-ps-input-border: #4a4a4a; } /* ── Photoshop-style workspace ── */ .ps-workspace-bg { background-color: var(--color-ps-workspace); overscroll-behavior: none; } .ps-canvas-checker { background-color: #666; background-image: linear-gradient(45deg, #5a5a5a 25%, transparent 25%), linear-gradient(-45deg, #5a5a5a 25%, transparent 25%), linear-gradient(45deg, transparent 75%, #5a5a5a 75%), linear-gradient(-45deg, transparent 75%, #5a5a5a 75%); background-size: 16px 16px; background-position: 0 0, 0 8px, 8px -8px, -8px 0; } .ps-toolbar { width: 42px; background: var(--color-ps-bg); border-right: 1px solid var(--color-ps-border); flex-shrink: 0; } .ps-tool-btn { display: flex; align-items: center; justify-content: center; width: 42px; height: 42px; color: #b8b8b8; cursor: pointer; border: none; background: transparent; transition: background 0.1s, color 0.1s; position: relative; } .ps-tool-btn:hover { background: #404040; color: #fff; } .ps-tool-btn.active { background: #1a1a1a; color: var(--color-ps-accent); } .ps-tool-btn.active::before { content: ''; position: absolute; left: 0; top: 0; bottom: 0; width: 2px; background: var(--color-ps-accent); } .ps-options-bar { height: 36px; background: var(--color-ps-header); border-bottom: 1px solid var(--color-ps-border); display: flex; align-items: center; padding: 0 12px; gap: 12px; flex-shrink: 0; color: var(--color-ps-text); font-size: 11px; } .ps-status-bar { height: 26px; background: var(--color-ps-bg); border-top: 1px solid var(--color-ps-border); display: flex; align-items: center; justify-content: space-between; padding: 0 10px; flex-shrink: 0; color: var(--color-ps-muted); font-size: 11px; } .ps-panel { width: 280px; background: var(--color-ps-panel); border-left: 1px solid var(--color-ps-border); display: flex; flex-direction: column; flex-shrink: 0; height: 100%; overflow: hidden; } .ps-sidebar-stack { display: flex; flex-direction: column; width: 280px; height: 100%; flex-shrink: 0; border-left: 1px solid var(--color-ps-border); background: var(--color-ps-panel); overflow: hidden; } .ps-export-sidebar { display: flex; flex-direction: column; width: 300px; height: 100%; flex-shrink: 0; border-left: 1px solid var(--color-ps-border); background: var(--color-ps-panel); overflow: hidden; } .ps-preview-toolbar { height: 36px; background: var(--color-ps-header); border-bottom: 1px solid var(--color-ps-border); display: flex; align-items: center; justify-content: space-between; padding: 0 12px; gap: 12px; flex-shrink: 0; } .ps-preview-zoom-btn { width: 22px; height: 22px; display: flex; align-items: center; justify-content: center; background: #383838; border: 1px solid #4a4a4a; border-radius: 2px; color: #ccc; font-size: 12px; font-weight: 700; cursor: pointer; } .ps-preview-zoom-btn:hover:not(:disabled) { background: #444; border-color: rgba(49, 168, 255, 0.35); } .ps-preview-zoom-btn:disabled { opacity: 0.35; cursor: not-allowed; } .ps-preview-preset-btn { padding: 2px 8px; font-size: 10px; border: 1px solid #4a4a4a; border-radius: 2px; background: #383838; color: #999; cursor: pointer; } .ps-preview-preset-btn:hover { color: #ccc; } .ps-preview-preset-btn.active { background: #1a3a4f; border-color: rgba(49, 168, 255, 0.5); color: var(--color-ps-accent); } .ps-panel-section { display: flex; flex-direction: column; min-height: 0; border-bottom: 1px solid var(--color-ps-border); } .ps-panel-section.collapsed { flex: 0 0 auto; } /* 展开的模块等分侧栏剩余高度 */ .ps-panel-section:not(.collapsed) { flex: 1 1 0; min-height: 0; } .ps-panel-section:not(.collapsed)>.ps-panel-scroll { flex: 1 1 0; min-height: 0; } /* 面板内容区:可滚动、隐藏滚动条 */ .ps-panel-scroll { overflow-y: auto; overflow-x: hidden; overscroll-behavior: contain; scrollbar-width: none; -ms-overflow-style: none; } .ps-panel-scroll::-webkit-scrollbar { display: none; width: 0; height: 0; } .ps-panel-header { height: 28px; background: var(--color-ps-header); border-bottom: 1px solid var(--color-ps-border); display: flex; align-items: center; padding: 0 10px; gap: 6px; flex-shrink: 0; color: var(--color-ps-text); font-size: 11px; font-weight: 600; letter-spacing: 0.02em; user-select: none; } .ps-panel-header-toggle { width: 100%; border: none; margin: 0; cursor: pointer; transition: background 0.1s; font-family: inherit; } .ps-panel-header-toggle:hover { background: #454545; } .ps-panel-section.collapsed .ps-panel-header-toggle { border-bottom: none; } .ps-panel-body { color: var(--color-ps-text); overscroll-behavior: none; min-width: 0; } .ps-panel-body input[type="number"], .ps-panel-body input[type="text"], .ps-panel-body textarea, .ps-panel-body select { background: var(--color-ps-input); border-color: var(--color-ps-input-border); color: var(--color-ps-text); } .ps-panel-body input[type="number"]:focus, .ps-panel-body input[type="text"]:focus, .ps-panel-body textarea:focus, .ps-panel-body select:focus { border-color: var(--color-ps-accent); outline: none; } .ps-panel-body label { color: var(--color-ps-muted); } .ps-panel-body h4, .ps-panel-body h5 { color: var(--color-ps-accent); } .ps-field-label { display: block; font-size: 10px; font-weight: 600; color: #777; margin-bottom: 0.25rem; } .ps-field { width: 100%; padding: 0.375rem 0.625rem; background: var(--color-ps-input); border: 1px solid var(--color-ps-input-border); border-radius: 0.25rem; font-size: 0.75rem; color: var(--color-ps-text); } .ps-field.font-mono { font-family: var(--font-mono); } .ps-field:focus { border-color: var(--color-ps-accent); outline: none; } .ps-field:disabled { opacity: 0.5; cursor: not-allowed; } .color-input { --color-input-radius: 0.25rem; --color-input-border: var(--color-ps-input-border); --color-input-size: calc(0.75rem * 1.5 + 0.375rem * 2); -webkit-appearance: none; appearance: none; box-sizing: border-box; width: var(--color-input-size); height: var(--color-input-size); min-height: var(--color-input-size); padding: 0; border: 1px solid var(--color-input-border); border-radius: var(--color-input-radius); background: transparent; cursor: pointer; overflow: hidden; flex-shrink: 0; vertical-align: middle; } .color-input:focus { border-color: var(--color-ps-accent); outline: none; } .color-input::-webkit-color-swatch-wrapper { padding: 0; margin: 0; width: 100%; height: 100%; border: none; } .color-input::-webkit-color-swatch { border: none; border-radius: 0; width: 100%; height: 100%; } .color-input::-moz-color-swatch { border: none; border-radius: 0; width: 100%; height: 100%; } .ps-section-title { font-size: 10px; font-weight: 700; color: var(--color-ps-accent); text-transform: uppercase; letter-spacing: 0.05em; display: flex; align-items: center; gap: 0.375rem; } .ps-section-divider { border-top: 1px solid #3a3a3a; padding-top: 0.75rem; } .ps-btn { padding: 0.375rem 0.625rem; background: #383838; border: 1px solid #4a4a4a; color: #ccc; font-size: 0.75rem; font-weight: 600; border-radius: 0.25rem; cursor: pointer; transition: background 0.1s, border-color 0.1s, color 0.1s; display: inline-flex; align-items: center; justify-content: center; gap: 0.25rem; } .ps-btn:hover { background: #444; border-color: rgba(49, 168, 255, 0.35); } .ps-btn.active { background: #1a3a4f; border-color: rgba(49, 168, 255, 0.5); color: var(--color-ps-accent); } .ps-btn-primary { background: #1a4a6e; border-color: rgba(49, 168, 255, 0.55); color: #e8f4ff; } .ps-btn-primary:hover:not(:disabled) { background: #1f5680; border-color: rgba(49, 168, 255, 0.75); color: #fff; } .ps-btn-primary:disabled { opacity: 0.4; cursor: not-allowed; } /* Photoshop 风格弹窗 */ .ps-modal-overlay { position: fixed; inset: 0; z-index: 9000; display: flex; align-items: center; justify-content: center; padding: 1rem; background: rgba(0, 0, 0, 0.65); backdrop-filter: blur(2px); } .ps-modal { width: 100%; max-width: 22rem; background: var(--color-ps-panel); border: 1px solid var(--color-ps-border); border-radius: 0.375rem; box-shadow: 0 16px 48px rgba(0, 0, 0, 0.55); overflow: hidden; } .ps-modal-header { display: flex; align-items: center; justify-content: space-between; gap: 0.5rem; height: 2.25rem; padding: 0 0.75rem; background: var(--color-ps-header); border-bottom: 1px solid var(--color-ps-border); } .ps-modal-title { font-size: 11px; font-weight: 600; color: var(--color-ps-text); letter-spacing: 0.02em; } .ps-modal-close { padding: 0.25rem; color: #888; border-radius: 0.25rem; cursor: pointer; transition: color 0.1s, background 0.1s; } .ps-modal-close:hover { color: #ccc; background: #454545; } .ps-modal-body { padding: 0.875rem; color: var(--color-ps-text); } .ps-modal-footer { display: flex; justify-content: flex-end; gap: 0.5rem; padding: 0.625rem 0.875rem; border-top: 1px solid #3a3a3a; background: #242424; } .visibility-rule-summary { display: flex; align-items: center; gap: 0.375rem; min-width: 0; padding: 0.5rem 0.625rem; background: #262626; border: 1px solid #3a3a3a; border-radius: 0.25rem; transition: border-color 0.1s, background 0.1s; } .visibility-rule-summary:hover { border-color: rgba(49, 168, 255, 0.35); background: #2a2a2a; } .visibility-rule-summary-btn { flex: 1; min-width: 0; text-align: left; background: none; border: none; padding: 0; cursor: pointer; color: inherit; font: inherit; } .visibility-rule-summary-text { font-size: 10px; line-height: 1.45; color: #ccc; word-break: break-all; } .visibility-rule-summary-text .var-token { font-family: var(--font-mono); color: var(--color-ps-accent); font-weight: 600; } .ps-toggle-group { display: flex; border-radius: 0.25rem; border: 1px solid #4a4a4a; padding: 2px; background: #2a2a2a; } .ps-toggle-btn { padding: 0.375rem; border-radius: 0.125rem; cursor: pointer; color: #777; transition: background 0.1s, color 0.1s; border: none; background: transparent; } .ps-toggle-btn:hover { color: #ccc; } .ps-toggle-btn.active { background: #1a3a4f; color: var(--color-ps-accent); } .ps-range { width: 100%; accent-color: var(--color-ps-accent); height: 4px; cursor: pointer; } .ps-checkbox { accent-color: var(--color-ps-accent); width: 14px; height: 14px; border-radius: 2px; cursor: pointer; } .ps-layer-item { display: flex; align-items: center; justify-content: space-between; padding: 4px 8px; font-size: 11px; cursor: pointer; user-select: none; border-bottom: 1px solid #222; color: #ccc; transition: background 0.1s; } .ps-layer-item:hover { background: #383838; } .ps-layer-item.selected { background: #3d4f5f; color: #fff; } .ps-marquee-select { position: absolute; border: 1px solid #31a8ff; background: rgba(49, 168, 255, 0.12); box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.25); pointer-events: none; z-index: 9999; } .ps-selection-ring { outline: 1px solid var(--color-ps-accent); outline-offset: 0; } .ps-handle { position: absolute; width: 8px; height: 8px; background: #fff; border: 1px solid var(--color-ps-accent); z-index: 50; touch-action: none; } .ps-design-canvas-touch { touch-action: pan-x pan-y; } .ps-design-canvas-touch [data-label-element], .ps-design-canvas-touch .ps-handle, .ps-design-canvas-touch .touch-none { touch-action: none; } .ps-status-bar-compact { font-size: 10px; gap: 8px; padding: 0 8px; } @media (max-width: 1023px) { .ps-handle { width: 18px; height: 18px; } .ps-status-bar { flex-wrap: nowrap; } } .ps-zoom-control { display: flex; align-items: center; gap: 2px; background: #1e1e1e; border: 1px solid #4a4a4a; border-radius: 2px; padding: 1px; } .ps-zoom-btn { display: flex; align-items: center; justify-content: center; width: 22px; height: 20px; color: #b8b8b8; background: transparent; border: none; cursor: pointer; border-radius: 1px; } .ps-zoom-btn:hover { background: #404040; color: #fff; } /* Elegant Bento Dotted Background Pattern */ .bg-bento-dots { background-color: #f8fafc; background-image: radial-gradient(#cbd5e1 1px, transparent 1px); background-size: 24px 24px; } /* ── Mobile layout (< 768px) ── */ @media (max-width: 767px) { /* Mobile export flow */ .mobile-export-view { flex: 1 1 auto; display: flex; flex-direction: column; min-height: 0; height: 100%; background: #f1f5f9; } .mobile-export-header { padding-top: calc(12px + env(safe-area-inset-top, 0px)); } .mobile-export-back { display: flex; align-items: center; justify-content: center; width: 40px; height: 40px; margin: -4px 0; border: none; border-radius: 10px; background: transparent; color: #e2e8f0; cursor: pointer; flex-shrink: 0; } .mobile-export-back:active { background: rgba(255, 255, 255, 0.1); } .mobile-export-steps { display: flex; align-items: center; justify-content: center; gap: 0; padding: 12px 16px; background: #fff; border-bottom: 1px solid #e2e8f0; flex-shrink: 0; } .mobile-export-step { display: flex; flex-direction: column; align-items: center; gap: 4px; font-size: 11px; font-weight: 600; color: #94a3b8; min-width: 52px; } .mobile-export-step.active { color: #4f46e5; } .mobile-export-step.done { color: #059669; } .mobile-export-step-line { flex: 1; max-width: 40px; height: 2px; background: #e2e8f0; margin: 0 4px; margin-bottom: 18px; } .mobile-step-badge { display: flex; align-items: center; justify-content: center; width: 24px; height: 24px; border-radius: 999px; background: #f1f5f9; color: #94a3b8; font-size: 12px; font-weight: 700; } .mobile-step-badge.active { background: #eef2ff; color: #4f46e5; border: 2px solid #818cf8; } .mobile-step-badge.done { background: #ecfdf5; color: #059669; border: none; } .mobile-export-content { flex: 1 1 auto; min-height: 0; overflow-y: auto; -webkit-overflow-scrolling: touch; padding: 16px; padding-bottom: 20px; display: block; } .mobile-export-content>.mobile-export-card+.mobile-export-card { margin-top: 16px; } .mobile-export-card { flex-shrink: 0; background: #fff; border-radius: 16px; padding: 0; overflow: visible; box-shadow: 0 1px 3px rgba(15, 23, 42, 0.06); border: 1px solid #e2e8f0; } .mobile-export-card-body { padding: 18px 18px 20px; min-width: 0; } .mobile-export-card-locked { opacity: 0.72; } .mobile-export-card-head { display: flex; align-items: flex-start; gap: 10px; padding: 14px 18px; background: linear-gradient(180deg, #f8fafc 0%, #f1f5f9 100%); border-bottom: 1px solid #e8edf3; border-radius: 16px 16px 0 0; } .mobile-export-card-head h2 { font-size: 14px; font-weight: 700; color: #0f172a; line-height: 1.25; } .mobile-export-card-head p { font-size: 12px; color: #64748b; margin-top: 2px; } .mobile-export-icon-btn { display: flex; align-items: center; justify-content: center; flex-shrink: 0; width: 36px; height: 36px; border: 1px solid #e2e8f0; border-radius: 10px; background: #fff; color: #4f46e5; cursor: pointer; } .mobile-export-icon-btn:active { background: #eef2ff; border-color: #c7d2fe; } .mobile-export-hint { font-size: 14px; line-height: 1.5; color: #94a3b8; text-align: center; padding: 20px 12px; margin: 0; background: #f8fafc; border-radius: 12px; border: 1px dashed #e2e8f0; } .mobile-upload-zone { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 12px; min-height: 128px; padding: 24px 12px; text-align: center; cursor: pointer; border: none; border-radius: 0; background: transparent; transition: opacity 0.15s; } .mobile-upload-zone.active { opacity: 0.65; } .mobile-file-card { display: flex; flex-direction: column; align-items: stretch; gap: 12px; min-width: 0; width: 100%; padding: 0; background: transparent; border: none; border-radius: 0; } .mobile-secondary-btn { display: inline-flex; align-items: center; justify-content: center; gap: 6px; min-height: 44px; padding: 0 16px; font-size: 13px; font-weight: 600; color: #475569; background: #fff; border: 1px solid #e2e8f0; border-radius: 10px; cursor: pointer; } .mobile-secondary-btn:active { background: #f8fafc; } .mobile-text-btn { display: inline-flex; align-items: center; gap: 4px; min-height: 40px; padding: 0 12px; font-size: 13px; font-weight: 600; border: none; border-radius: 8px; background: transparent; cursor: pointer; } .mobile-text-btn.danger { color: #e11d48; } .mobile-text-btn.danger:active { background: #fff1f2; } .mobile-field { display: block; width: 100%; min-height: 44px; padding: 10px 12px; font-size: 15px; color: #0f172a; background: #fff; border: 1px solid #e2e8f0; border-radius: 10px; -webkit-appearance: none; appearance: none; } .mobile-field:focus { outline: none; border-color: #818cf8; box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.15); } .mobile-field-label { display: block; font-size: 12px; font-weight: 600; color: #64748b; margin-bottom: 6px; } .mobile-mapping-list { display: flex; flex-direction: column; } .mobile-mapping-row { display: flex; flex-direction: column; gap: 8px; padding: 16px 0; border-bottom: 1px solid #f1f5f9; } .mobile-mapping-row:last-child { padding-bottom: 0; border-bottom: none; } .mobile-field-plain { background: #f8fafc; border-color: transparent; } .mobile-field-plain:focus { background: #fff; border-color: #c7d2fe; box-shadow: none; } .mobile-export-stats { display: grid; grid-template-columns: repeat(3, 1fr); gap: 8px; margin-top: 4px; } .mobile-export-stat { display: flex; flex-direction: column; align-items: center; padding: 14px 10px; background: #f8fafc; border-radius: 12px; border: 1px solid #e2e8f0; } .mobile-export-stat-value { font-size: 18px; font-weight: 800; color: #4f46e5; line-height: 1.1; } .mobile-export-stat-label { font-size: 10px; font-weight: 600; color: #94a3b8; margin-top: 4px; text-align: center; } .mobile-export-props-card:not(.is-open) .mobile-export-props-head { border-bottom: none; border-radius: 16px; } .mobile-export-props-head { width: 100%; border: none; cursor: pointer; font: inherit; color: inherit; } .mobile-export-props-head:disabled { cursor: default; } .mobile-export-props-head:not(:disabled):active { background: linear-gradient(180deg, #f1f5f9 0%, #e8edf3 100%); } .mobile-paper-section-title { font-size: 12px; font-weight: 700; color: #475569; margin: 0 0 8px; } .color-input { --color-input-radius: 10px; --color-input-border: #e2e8f0; --color-input-size: 44px; } .color-input:focus { border-color: #818cf8; box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.15); } .mobile-export-footer { flex-shrink: 0; padding: 12px 16px; padding-bottom: calc(12px + env(safe-area-inset-bottom, 0px)); background: rgba(255, 255, 255, 0.92); border-top: 1px solid #e2e8f0; backdrop-filter: blur(10px); } .mobile-export-footer-hint { font-size: 12px; color: #94a3b8; text-align: center; margin-bottom: 8px; } .mobile-export-submit { display: flex; align-items: center; justify-content: center; gap: 8px; width: 100%; min-height: 50px; padding: 0 20px; font-size: 15px; font-weight: 700; color: #fff; background: linear-gradient(135deg, #6366f1 0%, #4f46e5 100%); border: none; border-radius: 14px; cursor: pointer; box-shadow: 0 4px 14px rgba(79, 70, 229, 0.35); transition: opacity 0.15s, transform 0.1s; } .mobile-export-submit:active:not(:disabled) { transform: scale(0.98); } .mobile-export-submit:disabled { background: #cbd5e1; color: #94a3b8; box-shadow: none; cursor: not-allowed; } .mobile-template-header { flex-direction: column; align-items: stretch !important; gap: 8px !important; } .mobile-template-header.mobile-template-header-row { flex-direction: row !important; flex-wrap: nowrap !important; align-items: center !important; justify-content: space-between !important; gap: 12px !important; } .mobile-template-header h1 span:first-child { font-size: 12px; } .mobile-template-actions { width: 100%; flex-wrap: nowrap; gap: 10px; } .mobile-template-actions .mobile-primary-btn { flex: 1; min-width: 0; } .mobile-template-actions .mobile-icon-btn:active { transform: scale(0.97); } .mobile-design-block { flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 24px; text-align: center; gap: 16px; } } @media (min-width: 768px) { .mobile-only { display: none !important; } .mobile-export-view { display: none !important; } }