* { box-sizing: border-box; margin: 0; padding: 0; -webkit-tap-highlight-color: transparent; } html, body { height: 100%; height: 100dvh; overscroll-behavior-y: none; } body { font-family: var(--font-ui); background-color: var(--bg-color); color: var(--text-primary); line-height: 1.5; font-weight: 400; /* Disable text selection everywhere except inputs and AI responses */ user-select: none; -webkit-user-select: none; overflow: hidden; /* Prevent body scroll, handle scrolling in containers */ } /* Typography Base */ h1, h2, h3, h4, h5, h6 { font-weight: 600; letter-spacing: -0.02em; } /* Allow text selection in specific areas */ .selectable-text { user-select: text; -webkit-user-select: text; } /* --- Hide Scrollbars Globally (for non-Android browsers) --- */ *::-webkit-scrollbar, ::-webkit-scrollbar { display: none !important; width: 0 !important; height: 0 !important; background: transparent !important; } * { scrollbar-width: none !important; -ms-overflow-style: none !important; } /* ========================================= Fluid Dark Background Animation ========================================= */ body[data-bg-style="fluid-dark"] { background-color: #000000 !important; background-image: radial-gradient(circle at 85% 15%, rgba(80, 30, 20, 0.7) 0%, rgba(55, 20, 15, 0.4) 25%, transparent 45%), radial-gradient(circle at 20% 85%, rgba(65, 35, 25, 0.6) 0%, rgba(40, 20, 15, 0.3) 30%, transparent 55%), radial-gradient(circle at 10% 30%, rgba(20, 20, 25, 0.4) 0%, rgba(15, 15, 20, 0.15) 20%, transparent 35%) !important; background-size: 150% 150% !important; animation: fluid-bg-move 35s ease-in-out infinite alternate !important; } @keyframes fluid-bg-move { 0% { background-position: 0% 0%; } 50% { background-position: 100% 100%; } 100% { background-position: 0% 100%; } } body[data-bg-style="fluid-dark"] .aurora-background, body[data-bg-style="fluid-dark"] #ambient-light, body[data-bg-style="fluid-dark"]::before, body[data-bg-style="fluid-dark"]::after { display: none !important; animation: none !important; } /* ========================================= Aurora Background Animation ========================================= */ .aurora-background { position: fixed; inset: 0; z-index: -1; background: var(--bg-color); overflow: hidden; } .aurora-background::before, .aurora-background::after, .aurora-blob-3 { content: ''; position: absolute; width: 120vw; height: 120vh; border-radius: 50%; opacity: 0.4; animation: aurora-drift 15s ease-in-out infinite alternate; will-change: transform; } body::before, body::after { content: ""; position: fixed; top: -50%; left: -50%; width: 200%; height: 200%; z-index: -1; pointer-events: none; background: radial-gradient(circle at 50% 50%, rgba(100, 50, 200, 0.03) 0%, transparent 60%); animation: aurora-shift 20s infinite alternate linear; will-change: transform; } body::after { background: radial-gradient(circle at 30% 70%, rgba(50, 100, 200, 0.02) 0%, transparent 50%); animation: aurora-shift 25s infinite alternate-reverse linear; } body.sidebar-open::before, body.sidebar-open::after { animation-play-state: paused; } .aurora-background::before { /* Softer radial gradient replaces the need for filter: blur() */ background: radial-gradient(circle at center, var(--aurora-purple) 0%, transparent 60%); top: -20%; left: -10%; animation-delay: 0s; } .aurora-background::after { background: radial-gradient(circle at center, var(--aurora-teal) 0%, transparent 60%); bottom: -30%; right: -20%; animation-delay: -5s; } .aurora-blob-3 { background: radial-gradient(circle at center, var(--aurora-blue) 0%, transparent 60%); top: 10%; right: -10%; animation-delay: -10s; } @keyframes aurora-drift { 0% { transform: translate3d(0, 0, 0) scale(1); } 33% { transform: translate3d(8%, -10%, 0) scale(1.1); } 66% { transform: translate3d(-5%, 8%, 0) scale(0.9); } 100% { transform: translate3d(10%, -5%, 0) scale(1.05); } } /* ========================================= Core Layout Components ========================================= */ #app { display: flex; flex-direction: column; height: 100%; /* Fix iOS Safari dynamic viewport resizing jumping bug */ padding-top: var(--safe-area-top); padding-bottom: var(--safe-area-bottom); padding-left: var(--safe-area-left); padding-right: var(--safe-area-right); position: relative; } /* Ambient light effect for chat view */ #ambient-light { position: fixed; top: -20vh; right: -20vw; width: 140vw; height: 140vh; pointer-events: none; z-index: 0; background: conic-gradient(from 180deg at calc(100% - 10vw) 10vh, transparent 15deg, rgba(255, 255, 255, 0.10) 35deg, rgba(137, 207, 240, 0.05) 65deg, transparent 85deg); opacity: 1 !important; } .view-container { flex: 1; min-height: 0; /* Critical for nested flex overflow on Android WebView */ overflow-y: auto; -webkit-overflow-scrolling: touch; position: relative; scroll-behavior: smooth; padding-bottom: 140px; /* Space for bottom bar globally */ } body.in-chat-view .view-container { padding-bottom: 0px !important; /* Managed by #chat-messages instead to prevent double scrolling */ } .chat-overlay-header { position: sticky; top: 0; left: 0; right: 0; z-index: 10; padding: 16px 20px 16px 20px; margin-bottom: -16px; display: flex; align-items: flex-start; justify-content: space-between; pointer-events: none; } /* Bottom Tab Bar */ /* ========================================= Bottom Navigation & Tabs ========================================= */ .bottom-tab-bar { position: fixed; bottom: 0; left: 0; right: 0; z-index: 100; display: flex; justify-content: space-around; align-items: flex-end; padding: 60px 4px calc(8px + var(--safe-area-bottom)); background: linear-gradient(to bottom, transparent 0%, rgba(0,0,0,0.2) 20%, rgba(0,0,0,0.6) 40%, rgba(0,0,0,0.9) 60%, rgba(0,0,0,1) 80%); border: none; box-shadow: none; pointer-events: none; } .bottom-tab-bar > * { pointer-events: auto; } .bottom-tab-bar::before { display: none; } .tab-item { display: flex; flex-direction: column; align-items: center; justify-content: center; color: #777; /* Unselected color matching reference */ gap: 4px; flex: 1; cursor: pointer; transition: color 0.4s var(--ios-spring), transform 0.4s var(--ios-spring-bouncy), opacity 0.4s var(--ios-spring); will-change: transform; } .tab-item:active { transform: scale(0.85); opacity: 0.7; } .tab-item svg { width: 44px; height: 44px; fill: currentColor; transition: transform 0.4s var(--ios-spring-bouncy), fill 0.4s var(--ios-spring); } .tab-item.active { color: #d49afb; /* Purple glow text */ } .tab-item.active svg { fill: url(#active-icon-gradient); filter: drop-shadow(0 2px 8px rgba(182, 120, 242, 0.5)); transform: translateY(-2px); } /* Apple Capsule Input Area */ .input-capsule-container { position: fixed; bottom: calc(76px + var(--safe-area-bottom)); left: 8px; right: 8px; z-index: 90; } .input-capsule { display: flex; align-items: center; background: var(--chat-user-bg); border-radius: 28px; padding: 8px; min-height: 56px; border: 1px solid rgba(255, 255, 255, 0.1); box-shadow: 0 4px 16px rgba(0, 0, 0, 0.2); } .input-capsule textarea { flex: 1; background: transparent; border: none; color: var(--text-primary); font-family: var(--font-ui); font-size: 18px; resize: none; max-height: 120px; padding: 8px; outline: none; } .input-capsule textarea::placeholder { color: var(--text-secondary); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .icon-btn { width: 44px; height: 44px; flex-shrink: 0; background: transparent; border: none; border-radius: 50%; color: var(--text-primary); cursor: pointer; display: flex; align-items: center; justify-content: center; transition: transform 0.4s var(--ios-spring-bouncy), background-color 0.4s var(--ios-spring), opacity 0.4s var(--ios-spring), box-shadow 0.4s var(--ios-spring); will-change: transform; } .icon-btn:hover { background: rgba(255, 255, 255, 0.1); border-radius: 50%; } .icon-btn:active { transform: scale(0.85); opacity: 0.7; } .icon-btn.primary { background: var(--primary-accent); color: #fff; } /* ========================================= Siri Style Input Glow ========================================= */ .siri-capsule { position: relative; background: rgba(10, 10, 15, 0.25) !important; border: 1px solid rgba(255, 255, 255, 0.05) !important; border-top: 1px solid rgba(255, 255, 255, 0.15) !important; box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3), inset 0 0 20px rgba(255, 255, 255, 0.03) !important; border-radius: 32px !important; overflow: hidden; backdrop-filter: blur(30px) saturate(150%); -webkit-backdrop-filter: blur(30px) saturate(150%); } @keyframes siri-breathe { 0% { background-position: 0% 50%; opacity: 0.4; } 50% { background-position: 100% 50%; opacity: 0.7; } 100% { background-position: 0% 50%; opacity: 0.4; } } .siri-capsule::before { content: ""; position: absolute; bottom: -4px; left: 10%; right: 10%; height: 12px; background: linear-gradient(90deg, transparent 0%, rgba(50, 120, 255, 0.8) 20%, rgba(200, 50, 255, 0.8) 50%, rgba(255, 180, 50, 0.8) 80%, transparent 100%); background-size: 200% 200%; filter: blur(10px); opacity: 0.5; z-index: 0; border-radius: 50%; pointer-events: none; animation: siri-breathe 8s ease-in-out infinite; } .siri-capsule > * { position: relative; z-index: 1; /* Keep inputs above the glow */ } .input-capsule textarea { background: transparent !important; color: white !important; } /* ========================================= Chat Specific Styles ========================================= */ @keyframes bounce { 0%, 80%, 100% { transform: translateY(0); } 40% { transform: translateY(-6px); } } @keyframes message-slide-up { 0% { opacity: 0; transform: translateY(20px) scale(0.95); } 100% { opacity: 1; transform: translateY(0) scale(1); } } @keyframes message-drop-fly { 0% { opacity: 0; transform: translate3d(var(--start-x, -100px), var(--start-y, 200px), 0) scale(0.15, 0.15); border-radius: 50%; color: transparent; filter: drop-shadow(0 0 10px rgba(255,255,255,0.4)); } 30% { opacity: 1; transform: translate3d(calc(var(--start-x, -100px) * 0.4), calc(var(--start-y, 200px) * 0.7), 0) scale(0.3, 0.3); border-radius: 50%; color: transparent; filter: drop-shadow(0 0 5px rgba(255,255,255,0.2)); } 70% { transform: translate3d(0px, -10px, 0) scale(1.02, 0.98); border-radius: 20px 20px 4px 20px; color: rgba(255,255,255,0.5); } 100% { opacity: 1; transform: translate3d(0, 0, 0) scale(1, 1); border-radius: 20px 20px 4px 20px; color: var(--text-primary); filter: drop-shadow(0 0 0 transparent); } } .message-drop-anim { animation: message-drop-fly 1.5s cubic-bezier(0.2, 0.8, 0.2, 1) forwards; will-change: transform, opacity, border-radius, color, filter; transform-origin: bottom right; } .chat-bubble-user { background: rgba(40, 40, 45, 0.6); backdrop-filter: blur(25px) saturate(180%); -webkit-backdrop-filter: blur(25px) saturate(180%); border: 1px solid rgba(255, 255, 255, 0.08); border-top: 1px solid rgba(255, 255, 255, 0.15); box-shadow: 0 4px 15px rgba(0,0,0,0.3), inset 0 1px 0 rgba(255,255,255,0.05); padding: 12px 16px; border-radius: 20px 20px 4px 20px; font-size: 15px; color: var(--text-primary); line-height: 1.5; word-wrap: break-word; } .chat-bubble-ai { background: transparent; padding: 12px 16px 12px 4px; /* Slight left padding to breathe */ font-size: 15px; color: var(--text-primary); line-height: 1.6; word-wrap: break-word; animation: message-slide-up 0.5s var(--ios-spring-bouncy) forwards; will-change: transform, opacity; } .dot-bounce { display: inline-block; animation: bounce 1.4s infinite ease-in-out both; } .markdown-body p { margin-bottom: 8px; } .chat-bubble-ai > .markdown-body > p:first-of-type, .chat-bubble-ai.markdown-body > p:first-of-type { font-size: 1.05em; color: rgba(255, 255, 255, 0.98); margin-bottom: 16px; line-height: 1.6; } .markdown-body strong { font-weight: 600; color: #fff; } .tts-word { transition: background-color 0.1s ease, color 0.1s ease; } .tts-word.active { background-color: rgba(193, 131, 240, 0.4) !important; color: #fff !important; border-radius: 4px; } .markdown-body code { background: rgba(255,255,255,0.1); padding: 2px 4px; border-radius: 4px; font-family: var(--font-code); font-size: 13px; } .markdown-body pre { background: rgba(0,0,0,0.5); padding: 12px; border-radius: 8px; overflow-x: auto; margin: 12px 0; border: 1px solid rgba(255,255,255,0.1); } .markdown-body ul li p, .markdown-body ol li p { margin: 0; } .markdown-body a { color: #89CFF0; /* Baby Blue */ text-decoration: none; } .markdown-body a:hover { text-decoration: underline; } /* Tables inside AI responses */ .chat-bubble-ai.markdown-body table { width: 100%; border-collapse: collapse; margin: 16px 0; border-radius: 8px; overflow: hidden; box-shadow: 0 4px 15px rgba(0, 0, 0, 0.2); word-wrap: break-word; overflow-wrap: break-word; } @media (max-width: 768px) { .chat-bubble-ai.markdown-body table, .printable-document table, .article-document table { table-layout: fixed; } } .chat-bubble-ai.markdown-body th, .chat-bubble-ai.markdown-body td { border: 1px solid rgba(255, 255, 255, 0.1); padding: 12px 16px; text-align: left; } .chat-bubble-ai.markdown-body th { background-color: rgba(255, 255, 255, 0.1); font-weight: 600; color: #fff; } .chat-bubble-ai.markdown-body tr:nth-child(even) { background-color: rgba(255, 255, 255, 0.03); } .chat-bubble-ai.markdown-body tr:hover { background-color: rgba(255, 255, 255, 0.05); } .markdown-body img { max-width: 100%; height: auto; border-radius: 16px; margin: 12px 0; display: block; box-shadow: 0 4px 15px rgba(0, 0, 0, 0.3); border: 1px solid rgba(255, 255, 255, 0.1); background-color: rgba(255, 255, 255, 0.05); } /* Fade out images in AI responses towards the bottom to blend with text */ .chat-bubble-ai.markdown-body img, .chat-bubble-ai .markdown-body img { -webkit-mask-image: linear-gradient(to bottom, black 75%, transparent 100%); mask-image: linear-gradient(to bottom, black 75%, transparent 100%); margin-bottom: -8px; border-bottom: none; } .pdf-img-wrapper { position: relative; border-radius: 8px; border: 1px solid rgba(255, 255, 255, 0.1); background-color: rgba(255, 255, 255, 0.05); display: inline-block; max-width: 100%; } /* Image alignment classes for drag-and-drop text wrapping */ .markdown-body .pdf-img-wrapper.align-left { float: left; max-width: 45%; margin: 6px 20px 12px 0 !important; display: table !important; clear: none; } .markdown-body .pdf-img-wrapper.align-right { float: right; max-width: 45%; margin: 6px 0 12px 20px !important; display: table !important; clear: none; } .markdown-body .pdf-img-wrapper.align-center { display: table !important; margin: 16px auto !important; max-width: 100%; clear: both; } .markdown-body .pdf-img-wrapper img { margin: 0 !important; max-width: 100%; display: block; } /* Drag Ghost and Indicators */ .pdf-drag-ghost { position: fixed; pointer-events: none; opacity: 0.8; z-index: 100000; box-shadow: 0 16px 32px rgba(0,0,0,0.4); border: 2px solid var(--primary); border-radius: 16px; transform: translate(-50%, -50%); transition: transform 0.1s ease; } .pdf-drag-ghost.snapping { transition: all 0.2s cubic-bezier(0.2, 0.8, 0.2, 1); } .drop-target-left { box-shadow: inset 4px 0 0 var(--primary) !important; background: linear-gradient(90deg, rgba(182, 120, 242, 0.1) 0%, transparent 50%) !important; transition: all 0.2s ease; } .drop-target-right { box-shadow: inset -4px 0 0 var(--primary) !important; background: linear-gradient(270deg, rgba(182, 120, 242, 0.1) 0%, transparent 50%) !important; transition: all 0.2s ease; } .drop-target-center { box-shadow: inset 0 4px 0 var(--primary) !important; background: linear-gradient(180deg, rgba(182, 120, 242, 0.1) 0%, transparent 50%) !important; transition: all 0.2s ease; } /* ========================================= Sidebar Drawer (History) ========================================= */ .sidebar-overlay { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: rgba(0,0,0,0.7); z-index: 150; opacity: 0; pointer-events: none; transition: opacity 0.3s ease; } .sidebar-overlay.active { opacity: 1; pointer-events: auto; } .sidebar-drawer { position: fixed; top: 16px; left: 20px; width: 40px; height: 40px; border-radius: 20px; background: rgba(18, 18, 22, 0.97); border: 1px solid rgba(255, 255, 255, 0.08); box-shadow: 0 8px 32px rgba(0,0,0,0.5); z-index: 200; overflow: hidden; /* Morphing: same technique as Dynamic Island */ opacity: 0; pointer-events: none; -webkit-backface-visibility: hidden; backface-visibility: hidden; transform: translateZ(0); will-change: width, height, top, left, border-radius, opacity, transform; transition: width 0.5s cubic-bezier(0.3, 0.8, 0.1, 1.05), height 0.5s cubic-bezier(0.3, 0.8, 0.1, 1.05), top 0.5s cubic-bezier(0.3, 0.8, 0.1, 1.05), left 0.5s cubic-bezier(0.3, 0.8, 0.1, 1.05), border-radius 0.5s cubic-bezier(0.3, 0.8, 0.1, 1.05), opacity 0.2s ease, transform 0.5s ease; } .sidebar-drawer.active { top: 16px; left: 16px; width: 320px; height: calc(100% - 32px); border-radius: 24px; opacity: 1; pointer-events: auto; } .sidebar-drawer.active.fullscreen { top: 0; left: 0; width: 100%; height: 100%; border-radius: 0; border-color: transparent; } /* Hide the hamburger button when sidebar is open to create morph effect */ body.sidebar-open #open-sidebar-btn { opacity: 0; pointer-events: none; transform: scale(0.8); transition: opacity 0.3s ease, transform 0.3s ease; } #open-sidebar-btn { transition: opacity 0.3s ease, transform 0.3s ease; } /* Inner wrapper: fixed size prevents reflows during morph */ .sidebar-inner { width: 320px; height: 100%; position: absolute; top: 0; left: 0; display: flex; flex-direction: column; } .sidebar-drawer.fullscreen .sidebar-inner { width: 100%; } /* Tool Status Indicator for Deep Research */ .tool-status-indicator { display: flex; align-items: center; gap: 12px; padding: 12px 16px; background: rgba(var(--primary-color-rgb, 100, 100, 255), 0.1); border: 1px solid rgba(var(--primary-color-rgb, 100, 100, 255), 0.2); border-radius: 12px; margin-bottom: 16px; align-self: flex-start; color: var(--text-primary); font-size: 14px; font-weight: 500; animation: slideInUp 0.3s cubic-bezier(0.16, 1, 0.3, 1) forwards; } .gemini-sparkle-container { width: 24px; height: 24px; min-width: 24px; min-height: 24px; flex-shrink: 0; display: flex; align-items: center; justify-content: center; color: #A371F7; /* Gemini Purple */ animation: rotateSparkle 4s linear infinite; } .gemini-sparkle { width: 100%; height: 100%; } @keyframes rotateSparkle { 0% { transform: rotate(0deg) scale(1); } 50% { transform: rotate(180deg) scale(1.2); } 100% { transform: rotate(360deg) scale(1); } } .tool-status-text { background: linear-gradient(90deg, #A371F7, #1A73E8, #A371F7); background-size: 200% auto; -webkit-background-clip: text; -webkit-text-fill-color: transparent; animation: shineText 3s linear infinite; } @keyframes shineText { to { background-position: 200% center; } } .sidebar-header { padding: 30px 24px 20px 24px; display: flex; justify-content: space-between; align-items: center; border-bottom: 1px solid rgba(255,255,255,0.1); box-shadow: 0 4px 20px rgba(0,0,0,0.2); } .sidebar-header h2 { font-size: 22px; font-weight: 600; margin: 0; background: linear-gradient(90deg, #fff, #ddd); -webkit-background-clip: text; -webkit-text-fill-color: transparent; } .history-list { flex: 1; overflow-y: auto; padding: 16px; display: flex; flex-direction: column; gap: 12px; } /* Vollbild-Grid für die einzelnen Blöcke */ .sidebar-drawer.fullscreen .history-list { padding: 40px; display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 20px; } .history-group-header { grid-column: 1 / -1; font-size: 15px; font-weight: 500; color: #999; margin-top: 12px; margin-bottom: 2px; padding-left: 4px; } .markdown-body p { margin-top: 0; margin-bottom: 16px; line-height: 1.6; } .markdown-body ul, .markdown-body ol { padding-left: 12px; margin-top: 16px; margin-bottom: 24px; list-style-position: inside; } .markdown-body li { margin-bottom: 12px; line-height: 1.6; padding-left: 4px; } .markdown-body li::marker { color: #007aff; font-weight: bold; } .MathJax_Display { overflow-x: auto; overflow-y: hidden; padding: 1em 0; margin: 1em 0; background: rgba(255,255,255,0.03); border-radius: 8px; } .history-item { padding: 14px; border-radius: 20px; background: rgba(255, 255, 255, 0.04); border: 1px solid rgba(255, 255, 255, 0.05); cursor: pointer; transition: transform 0.1s ease, filter 0.1s ease, border-color 0.1s ease; will-change: transform; display: flex; flex-direction: column; min-height: 100px; flex-shrink: 0; } .history-item:hover { transform: translateY(-2px); filter: brightness(1.2); border-color: rgba(255,255,255,0.15); } .history-item.active { border-color: rgba(182, 120, 242, 0.4); box-shadow: inset 0 1px 2px rgba(255,255,255,0.2), 0 4px 20px rgba(182, 120, 242, 0.2); } .history-title { font-weight: 600; font-size: 14px; margin-bottom: 6px; display: flex; justify-content: space-between; align-items: center; } .history-actions { display: flex; gap: 4px; opacity: 0; } .history-item:hover .history-actions, .history-actions:focus-within { opacity: 1; } .chat-action-btn { background: none; border: none; padding: 6px; color: var(--text-secondary, #999); cursor: pointer; border-radius: 8px; transition: all 0.2s ease; display: flex; align-items: center; justify-content: center; } .chat-action-btn:hover { background: rgba(255,255,255,0.1); color: #fff; } .chat-action-btn.delete-btn:hover { background: rgba(255,60,60,0.15); color: #ff5555; } .history-preview { font-size: 12px; line-height: 1.4; color: var(--text-secondary); display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden; } .history-date { font-size: 12px; color: #888; margin-top: 12px; font-weight: 500; } /* ========================================= Dynamic Island Model Selector ========================================= */ .dynamic-island { position: relative; background: rgba(10, 10, 15, 0.4); backdrop-filter: blur(25px) saturate(150%); -webkit-backdrop-filter: blur(25px) saturate(150%); border: 1px solid rgba(255, 255, 255, 0.05); border-radius: 24px; margin: 0 auto; box-shadow: 0 4px 12px rgba(0,0,0,0.2); cursor: pointer; z-index: 1000; overflow: hidden; /* Collapsed dimensions */ width: max-content; min-width: 160px; max-width: calc(100vw - 120px); height: 40px; padding: 0; transition: width 0.5s cubic-bezier(0.3, 0.8, 0.1, 1.05), min-width 0.5s cubic-bezier(0.3, 0.8, 0.1, 1.05), height 0.5s cubic-bezier(0.3, 0.8, 0.1, 1.05), border-radius 0.5s cubic-bezier(0.3, 0.8, 0.1, 1.05), background 0.5s ease; } .dynamic-island.expanded { background: rgba(30, 30, 35, 0.95); backdrop-filter: blur(12px) saturate(150%); -webkit-backdrop-filter: blur(12px) saturate(150%); border-radius: 32px; box-shadow: 0 10px 30px rgba(0, 0, 0, 0.5); min-width: 250px; width: 250px; padding: 0; cursor: default; } .di-collapsed { position: relative; height: 100%; padding: 0 16px; display: flex; align-items: center; justify-content: center; gap: 8px; color: #fff; font-size: 14px; font-weight: 500; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; transition: opacity 0.3s ease 0.2s, transform 0.3s ease 0.2s; opacity: 1; pointer-events: none; /* Let the container handle clicks */ } .di-collapsed > span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .dynamic-island.expanded .di-collapsed { opacity: 0; transform: scale(0.8); transition: opacity 0.2s ease, transform 0.2s ease; } .di-expanded { position: absolute; top: 0; left: 0; right: 0; bottom: 0; display: flex; flex-direction: row; align-items: flex-start; overflow-x: auto; scroll-snap-type: x mandatory; -webkit-overflow-scrolling: touch; padding: 16px 0; opacity: 0; pointer-events: none; transition: opacity 0.15s ease, transform 0.15s ease; transform: scale(0.95) translateY(10px); } .di-expanded::-webkit-scrollbar { display: none; } .dynamic-island.expanded .di-expanded { opacity: 1; pointer-events: auto; transform: scale(1) translateY(0); transition: opacity 0.4s ease 0.2s, transform 0.4s ease 0.2s; } .dropdown-page { min-width: 100%; flex: 0 0 100%; scroll-snap-align: start; display: flex; flex-direction: column; padding: 0 12px; box-sizing: border-box; } .model-list-container { max-height: 160px; overflow-y: auto; overflow-x: hidden; padding-right: 4px; overscroll-behavior-y: contain; } .model-list-container::-webkit-scrollbar { width: 4px; } .model-list-container::-webkit-scrollbar-thumb { background: rgba(255, 255, 255, 0.15); border-radius: 4px; } .model-list-container::-webkit-scrollbar-thumb:hover { background: rgba(255, 255, 255, 0.3); } .dropdown-item { padding: 12px 16px; border-radius: 10px; color: #fff; font-size: 15px; font-weight: 500; cursor: pointer; display: flex; justify-content: space-between; align-items: center; transition: background 0.2s; text-align: left; } .dropdown-item:hover { background: rgba(255, 255, 255, 0.08); } .dropdown-item.selected { color: #d49afb; } .dropdown-divider { height: 1px; background: rgba(255, 255, 255, 0.1); margin: 6px 4px; } /* ========================================= iOS Style Controls (Toggles & Selects) ========================================= */ .ios-toggle { position: relative; width: 44px; height: 24px; appearance: none; background: rgba(255,255,255,0.2); border-radius: 12px; outline: none; cursor: pointer; transition: 0.3s; -webkit-appearance: none; } .ios-toggle:checked { background: var(--primary-accent); } .ios-toggle::after { content: ''; position: absolute; top: 2px; left: 2px; width: 20px; height: 20px; background: white; border-radius: 50%; transition: 0.3s; box-shadow: 0 2px 4px rgba(0,0,0,0.2); } .ios-toggle:checked::after { transform: translateX(20px); } .ios-select { background: rgba(255,255,255,0.1); border: 1px solid rgba(255,255,255,0.1); color: white; padding: 6px 30px 6px 14px; border-radius: 20px; font-family: var(--font-ui); font-size: 13px; font-weight: 500; outline: none; cursor: pointer; appearance: none; -webkit-appearance: none; background-image: url("data:image/svg+xml;charset=US-ASCII,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22292.4%22%20height%3D%22292.4%22%3E%3Cpath%20fill%3D%22%23FFFFFF%22%20d%3D%22M287%2069.4a17.6%2017.6%200%200%200-13-5.4H18.4c-5%200-9.3%201.8-12.9%205.4A17.6%2017.6%200%200%200%200%2082.2c0%205%201.8%209.3%205.4%2012.9l128%20127.9c3.6%203.6%207.8%205.4%2012.8%205.4s9.2-1.8%2012.8-5.4L287%2095c3.5-3.5%205.4-7.8%205.4-12.8%200-5-1.9-9.2-5.5-12.8z%22%2F%3E%3C%2Fsvg%3E"); background-repeat: no-repeat; background-position: right 10px top 50%; background-size: 10px auto; box-shadow: 0 4px 12px rgba(0,0,0,0.1); transition: background 0.2s; } .ios-select:hover { background-color: rgba(255,255,255,0.15); } .ios-select option { background-color: #1c1c1e; color: white; } /* ========================================= CUSTOM MODALS ========================================= */ @keyframes overlayFadeIn { from { opacity: 0; } to { opacity: 1; } } .custom-modal-overlay { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: rgba(10,10,12,0.85); /* Dark background without expensive blur */ z-index: 1000; display: flex; align-items: center; justify-content: center; opacity: 0; animation: overlayFadeIn 0.15s ease forwards; } .custom-modal-overlay.fade-out { animation: fadeOut 0.2s ease forwards; } .custom-modal { background: rgba(25, 25, 30, 0.95); border: 1px solid rgba(255, 255, 255, 0.1); box-shadow: 0 20px 40px rgba(0,0,0,0.5); border-radius: 20px; width: 90%; max-width: 320px; padding: 24px; opacity: 0; -webkit-backface-visibility: hidden; backface-visibility: hidden; transform: scale(0.9) translateZ(0); animation: modalPop 0.3s cubic-bezier(0.2, 0.8, 0.2, 1) forwards; } .custom-modal h3 { margin: 0 0 12px 0; font-size: 18px; font-weight: 600; } .custom-modal p { margin: 0 0 20px 0; font-size: 14px; color: var(--text-secondary); line-height: 1.4; } .custom-modal input { width: 100%; padding: 12px 16px; border-radius: 12px; border: 1px solid rgba(255,255,255,0.1); background: rgba(0,0,0,0.2); color: #fff; font-size: 16px; margin-bottom: 24px; outline: none; font-family: inherit; } .custom-modal input:focus { border-color: rgba(182, 120, 242, 0.5); } .modal-actions { display: flex; gap: 12px; justify-content: flex-end; } .modal-btn { padding: 10px 16px; border-radius: 10px; border: none; font-size: 14px; font-weight: 600; cursor: pointer; transition: all 0.2s; } .modal-btn.cancel { background: transparent; color: var(--text-secondary); } .modal-btn.cancel:hover { background: rgba(255,255,255,0.05); color: #fff; } .modal-btn.confirm { background: rgba(255,255,255,0.1); color: #fff; } .modal-btn.confirm:hover { background: rgba(255,255,255,0.2); } .modal-btn.confirm.danger { background: rgba(255,60,60,0.15); color: #ff5555; } .modal-btn.confirm.danger:hover { background: rgba(255,60,60,0.25); } @keyframes modalPop { 0% { transform: scale(0.9) translateZ(0); opacity: 0; } 100% { transform: scale(1) translateZ(0); opacity: 1; } } @keyframes fadeOut { 0% { opacity: 1; } 100% { opacity: 0; } } /* ========================================= Premium Apple-Style Animations ========================================= */ /* --- 1. Tab Bar Active Bounce --- */ @keyframes tab-icon-bounce { 0% { transform: translateY(-2px) scale(1); } 40% { transform: translateY(-2px) scale(1.15); } 100% { transform: translateY(-2px) scale(1); } } .tab-item.active svg { animation: tab-icon-bounce 0.4s cubic-bezier(0.34, 1.56, 0.64, 1); } /* --- 2. Send Button Animations --- */ /* Removed fog animations */ @keyframes send-spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } } .icon-btn.primary:active { transform: scale(0.7) !important; opacity: 0.8; transition: transform 0.1s cubic-bezier(0.32, 0.72, 0, 1), opacity 0.1s ease; } .icon-btn.primary.sending span { display: inline-block; animation: send-spin 0.6s cubic-bezier(0.32, 0.72, 0, 1) forwards; } /* --- 3. Staggered Chat Message Entrance --- */ @keyframes stagger-in { 0% { opacity: 0; transform: translateY(12px); } 100% { opacity: 1; transform: translateY(0); } } .chat-message-wrapper { animation: stagger-in 0.35s cubic-bezier(0.32, 0.72, 0, 1) both; will-change: transform, opacity; scroll-margin-top: 150px; /* Leave space above the message when scrolled into view */ } .chat-message-wrapper:nth-child(1) { animation-delay: 0.03s; } .chat-message-wrapper:nth-child(2) { animation-delay: 0.06s; } .chat-message-wrapper:nth-child(3) { animation-delay: 0.09s; } .chat-message-wrapper:nth-child(4) { animation-delay: 0.12s; } .chat-message-wrapper:nth-child(5) { animation-delay: 0.15s; } .chat-message-wrapper:nth-child(6) { animation-delay: 0.18s; } .chat-message-wrapper:nth-child(7) { animation-delay: 0.21s; } .chat-message-wrapper:nth-child(8) { animation-delay: 0.24s; } .chat-message-wrapper:nth-child(9) { animation-delay: 0.27s; } .chat-message-wrapper:nth-child(10) { animation-delay: 0.30s; } /* Beyond 10 messages: instant (no stagger needed for deep history) */ .chat-message-wrapper:nth-child(n+11) { animation-delay: 0.32s; } /* --- 4. Empty State Breathing --- */ @keyframes gentle-breathe { 0% { transform: scale(1); opacity: 0.85; } 50% { transform: scale(1.05); opacity: 1; } 100% { transform: scale(1); opacity: 0.85; } } @keyframes empty-fade-in { 0% { opacity: 0; transform: translateY(16px); } 100% { opacity: 1; transform: translateY(0); } } .empty-state-container { animation: empty-fade-in 0.5s cubic-bezier(0.32, 0.72, 0, 1) both; } .empty-state-emoji { display: inline-block; animation: gentle-breathe 3s ease-in-out infinite; will-change: transform, opacity; } .empty-state-text { animation: gentle-breathe 3s ease-in-out infinite; animation-delay: 0.5s; } /* --- 5. Input Focus Glow Enhancement --- */ .siri-capsule { transition: border-color 0.4s cubic-bezier(0.32, 0.72, 0, 1), box-shadow 0.4s cubic-bezier(0.32, 0.72, 0, 1); } .siri-capsule:focus-within { border-color: rgba(182, 120, 242, 0.3) !important; box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3), inset 0 0 20px rgba(255, 255, 255, 0.03), 0 0 0 1px rgba(182, 120, 242, 0.15) !important; } /* --- 6. Image Preview Pop-in --- */ @keyframes preview-pop { 0% { transform: scale(0); opacity: 0; } 70% { transform: scale(1.05); opacity: 1; } 100% { transform: scale(1); opacity: 1; } } .image-preview-pop { animation: preview-pop 0.35s cubic-bezier(0.34, 1.56, 0.64, 1) both; will-change: transform, opacity; } /* --- 7. View/Tab Switch Transitions --- */ @keyframes view-exit { 0% { opacity: 1; transform: translateX(0); } 100% { opacity: 0; transform: translateX(-20px); } } @keyframes view-enter { 0% { opacity: 0; transform: translateX(20px); } 100% { opacity: 1; transform: translateX(0); } } .view-exit-anim { animation: view-exit 0.15s ease forwards; will-change: transform, opacity; } .view-enter-anim { animation: view-enter 0.3s cubic-bezier(0.32, 0.72, 0, 1) forwards; will-change: transform, opacity; } /* ========================================= Responsive Sidebar Push Layout ========================================= */ @media (min-width: 768px) { .sidebar-overlay.active { display: none !important; /* Hide overlay so chat is interactive */ } .view-container { transition: margin-left 0.5s cubic-bezier(0.3, 0.8, 0.1, 1.05); } .input-capsule-container, .bottom-tab-bar { transition: left 0.5s cubic-bezier(0.3, 0.8, 0.1, 1.05); } body.sidebar-open .view-container { margin-left: 352px; /* 320px width + 16px left gap + 16px right gap */ } body.sidebar-open .input-capsule-container, body.sidebar-open .bottom-tab-bar { left: 352px; } } /* ========================================= Siri Knowledge Card ========================================= */ .siri-knowledge-card { display: flex; flex-direction: column; background: rgba(30, 30, 35, 0.7); backdrop-filter: blur(20px) saturate(180%); -webkit-backdrop-filter: blur(20px) saturate(180%); border: 1px solid rgba(255, 255, 255, 0.08); border-radius: 20px; overflow: hidden; margin: 16px 0; max-width: 400px; box-shadow: 0 8px 24px rgba(0, 0, 0, 0.3); transition: transform 0.2s ease, box-shadow 0.2s ease; } .siri-knowledge-card:hover { transform: translateY(-2px); box-shadow: 0 12px 32px rgba(0, 0, 0, 0.4); } .skc-image-wrapper { width: 100%; height: 220px; overflow: hidden; background: #111; } .skc-image-wrapper img { width: 100%; height: 100%; object-fit: cover; transition: transform 0.4s ease; } .siri-knowledge-card:hover .skc-image-wrapper img { transform: scale(1.05); } .skc-content { padding: 16px; display: flex; flex-direction: column; gap: 4px; } .skc-title { font-size: 16px; font-weight: 600; color: #fff; letter-spacing: -0.01em; } .skc-subtitle { font-size: 13px; font-weight: 500; color: rgba(255, 255, 255, 0.5); text-transform: uppercase; letter-spacing: 0.05em; } /* ========================================= Siri Hero Layout (like Apple Intelligence) ========================================= */ .siri-hero-card { display: flex; flex-direction: column; margin: 16px 0 24px 0; width: fit-content; max-width: 100%; } .siri-hero-header { display: flex; align-items: flex-start; justify-content: space-between; cursor: pointer; margin-bottom: 24px; } .siri-hero-title { font-family: 'New York', 'Times New Roman', Times, serif; font-size: 42px; line-height: 1.05; font-weight: 500; color: #fff; letter-spacing: -0.01em; margin-bottom: 0; text-shadow: 0 2px 10px rgba(0,0,0,0.5); flex: 1; } .siri-hero-toggle-icon { color: rgba(255, 255, 255, 0.4); transition: transform 0.4s cubic-bezier(0.25, 0.1, 0.25, 1); margin-left: 20px; margin-top: 8px; /* align nicely with the tall title */ flex-shrink: 0; } .siri-hero-header:hover .siri-hero-toggle-icon { color: rgba(255, 255, 255, 0.8); } .siri-hero-card.collapsed .siri-hero-toggle-icon { transform: rotate(180deg); } .siri-hero-image-wrapper { overflow: hidden; transition: max-height 0.5s cubic-bezier(0.25, 0.1, 0.25, 1), opacity 0.4s ease; max-height: 1000px; opacity: 1; border-radius: 20px; position: relative; width: fit-content; max-width: 100%; } .siri-hero-card.collapsed .siri-hero-image-wrapper { max-height: 0; opacity: 0; pointer-events: none; } .siri-hero-image-top { position: relative; z-index: 3; width: auto; max-width: 80vw; height: auto; max-height: 450px; border-radius: 12px; object-fit: contain; cursor: pointer; transition: transform 0.2s ease; } .siri-hero-image-top:active { transform: scale(0.98); } .wiki-svg-image { /* Inversion is handled via inline styles after canvas analysis */ } /* Siri Hero Swipe Gallery */ .siri-hero-card.has-gallery { width: fit-content; max-width: 100%; } .siri-hero-gallery { display: flex; overflow-x: auto; scroll-snap-type: x mandatory; gap: 16px; width: 100%; scrollbar-width: none; padding-bottom: 8px; } .siri-hero-gallery .siri-hero-image-top { flex: 0 0 auto; width: auto; scroll-snap-align: center; margin: 0; box-sizing: border-box; } .siri-hero-gallery::-webkit-scrollbar { display: none; } /* Mobile specific gallery logic to emulate phone gallery (100% width, no borders) */ @media (max-width: 768px) { .siri-hero-card.has-gallery { width: 100%; } .siri-hero-card.has-gallery .siri-hero-image-wrapper { width: 100%; border-radius: 16px; } .siri-hero-gallery { gap: 0; /* No gap so it feels like full pages */ } .siri-hero-gallery .siri-hero-image-top { flex: 0 0 100%; width: 100%; max-width: 100%; height: 60vh; /* Make it a nice tall mobile format */ max-height: 600px; object-fit: cover; /* Fill completely, no borders! */ object-position: center 15%; /* Focus on the upper third (where faces/heads usually are) to avoid cutting them off */ border-radius: 16px; } } /* Cinematic Fog Overlay */ .siri-hero-fog { position: absolute; inset: 0; pointer-events: none; z-index: 2; border-radius: 40px; /* Permanent soft edge blending into black */ box-shadow: inset 0 0 60px 30px rgba(0,0,0,1); } .siri-hero-fog::before, .siri-hero-fog::after { content: ""; position: absolute; inset: -50%; pointer-events: none; background-image: radial-gradient(circle at 40% 50%, transparent 40%, rgba(0,0,0,0.8) 70%); background-size: 100% 100%; animation: siriFogSpin 15s linear infinite; } .siri-hero-fog::after { background-image: radial-gradient(ellipse at 60% 40%, transparent 45%, rgba(0,0,0,0.7) 80%); animation: siriFogSpin 25s linear infinite reverse; } @keyframes siriFogSpin { 0% { transform: rotate(0deg) scale(1); } 50% { transform: rotate(180deg) scale(1.1); } 100% { transform: rotate(360deg) scale(1); } } .wiki-image-link { color: #89CFF0; cursor: pointer; text-decoration: underline; text-decoration-color: rgba(137, 207, 240, 0.4); text-decoration-thickness: 2px; text-underline-offset: 4px; transition: all 0.2s ease; padding: 0 2px; border-radius: 4px; } .wiki-image-link:hover { background: rgba(137, 207, 240, 0.15); text-decoration-color: rgba(137, 207, 240, 0.8); } /* Lightbox Overlay */ .lightbox-overlay { position: fixed; top: 0; left: 0; width: 100vw; height: 100vh; background: rgba(0, 0, 0, 0.9); backdrop-filter: blur(10px); -webkit-backdrop-filter: blur(10px); z-index: 99999; display: flex; align-items: center; justify-content: center; cursor: zoom-out; animation: fadeIn 0.2s ease-out forwards; } .lightbox-overlay img { max-width: 95vw; max-height: 95vh; object-fit: contain; border-radius: 12px; box-shadow: 0 30px 60px rgba(0,0,0,0.5); } @keyframes fadeIn { from { opacity: 0; transform: scale(1.05); } to { opacity: 1; transform: scale(1); } } /* ========================================= MathJax Support ========================================= */ mjx-container { max-width: 100%; overflow-x: auto; overflow-y: hidden; } mjx-container[display="true"] { background: rgba(255, 255, 255, 0.05); padding: 16px 20px; border-radius: 12px; font-size: 1.3em !important; border-left: 4px solid #007aff; margin: 20px 0 !important; box-shadow: 0 8px 24px rgba(0,0,0,0.2); display: block; } mjx-container:not([display="true"]) { font-size: 1.1em !important; color: #a6c8ff; padding: 0 2px; } .math-display-wrapper:hover .math-copy-btn { opacity: 1; } .math-copy-btn { position: absolute; top: 10px; right: 10px; background: rgba(255, 255, 255, 0.08); border: 1px solid rgba(255, 255, 255, 0.1); border-radius: 8px; color: rgba(255, 255, 255, 0.7); padding: 8px; cursor: pointer; opacity: 0; transition: all 0.2s var(--ios-spring); z-index: 10; display: flex; align-items: center; justify-content: center; } .math-copy-btn:hover { background: rgba(255, 255, 255, 0.15); color: #fff; transform: scale(1.05); } .math-copy-btn:active { transform: scale(0.95); } .math-copy-btn.copied { background: rgba(48, 209, 88, 0.2); color: #30D158; border-color: rgba(48, 209, 88, 0.3); opacity: 1; } .math-copy-btn.copied .icon-copy { display: none; } .math-copy-btn.copied .icon-check { display: block; } .chat-bubble-ai mjx-container { color: inherit; } /* ========================================= Function Plot (Coordinate Systems) ========================================= */ .function-plot-container, .plotly-container { width: 100%; min-height: 200px; background: #1c1c1e; /* Solid dark background to ensure visibility on white PDF paper */ border-radius: 16px; border: 1px solid rgba(255, 255, 255, 0.1); margin: 20px 0; overflow: hidden; position: relative; /* For the reset button */ box-shadow: inset 0 0 20px rgba(0, 0, 0, 0.5); } .plotly-container { height: 400px; } .function-plot-container svg { background: transparent !important; max-width: 100%; height: auto; /* Hide the top/bottom 2px to clip horizontal line artifacts generated by function-plot at boundaries */ clip-path: inset(2px 0px 2px 0px); } /* Override D3 / function-plot default colors for dark mode */ .function-plot-container text { fill: var(--text-secondary) !important; font-family: inherit !important; font-size: 11px !important; } .function-plot-container .domain { stroke: rgba(255, 255, 255, 0.3) !important; } .function-plot-container .tick line { stroke: rgba(255, 255, 255, 0.1) !important; } .function-plot-container .origin { stroke: rgba(255, 255, 255, 0.5) !important; stroke-width: 1.5px !important; } .function-plot-container .grid .tick line { stroke: rgba(255, 255, 255, 0.05) !important; } .function-plot-container .tick.integer-tick line { stroke: rgba(255, 255, 255, 0.35) !important; /* Brighter for whole numbers */ } .function-plot-container .tip { fill: #fff !important; } .function-plot-container .tip line { stroke: #ffffff !important; stroke-dasharray: 4,4; } .function-plot-container .top-right-legend { display: none !important; /* Hide default legend if any */ } /* Reset Button */ .plot-reset-btn { position: absolute; top: 10px; right: 10px; background: rgba(255, 255, 255, 0.1); border: 1px solid rgba(255, 255, 255, 0.2); color: #fff; border-radius: 8px; width: 32px; height: 32px; display: flex; align-items: center; justify-content: center; cursor: pointer; transition: all 0.2s ease; z-index: 10; backdrop-filter: blur(5px); } .plot-reset-btn:hover { background: rgba(255, 255, 255, 0.2); transform: scale(1.05); } .plot-reset-btn:active { transform: scale(0.9); } /* ========================================= Light Mode (Printer-friendly) Overrides These apply to PDF exports when dark mode is OFF ========================================= */ .printable-document:not(.dark-mode-doc) .function-plot-container, .printable-document:not(.dark-mode-doc) .plotly-container { background: transparent; border: 1px solid rgba(0, 0, 0, 0.1); box-shadow: none; } .printable-document:not(.dark-mode-doc) .function-plot-container text { fill: #000 !important; } .printable-document:not(.dark-mode-doc) .function-plot-container .domain { stroke: rgba(0, 0, 0, 0.4) !important; } .printable-document:not(.dark-mode-doc) .function-plot-container .tick line { stroke: rgba(0, 0, 0, 0.1) !important; } .printable-document:not(.dark-mode-doc) .function-plot-container .origin { stroke: rgba(0, 0, 0, 0.6) !important; } .printable-document:not(.dark-mode-doc) .function-plot-container .grid .tick line { stroke: rgba(0, 0, 0, 0.05) !important; } .printable-document:not(.dark-mode-doc) .function-plot-container .tick.integer-tick line { stroke: rgba(0, 0, 0, 0.25) !important; } .printable-document:not(.dark-mode-doc) .plot-reset-btn { background: rgba(0, 0, 0, 0.05); border: 1px solid rgba(0, 0, 0, 0.2); color: #000; } .printable-document:not(.dark-mode-doc) .plot-reset-btn:hover { background: rgba(0, 0, 0, 0.1); } /* If the AI bubble contains a siri-hero-card, remove the bubble background */ .chat-bubble-ai:has(.siri-hero-card) { background: transparent !important; box-shadow: none !important; border: none !important; backdrop-filter: none !important; -webkit-backdrop-filter: none !important; padding: 0 !important; } /* ========================================= PDF Modal ========================================= */ #pdf-modal { display: flex; justify-content: center; align-items: center; z-index: 10000; position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: rgba(0,0,0,0.8); } .pdf-modal-content { width: 95%; height: 90%; background: transparent; border: 1px solid rgba(255,255,255,0.1); border-radius: 16px; display: flex; flex-direction: column; overflow: hidden; box-shadow: 0 12px 32px rgba(0,0,0,0.8); } .pdf-modal-header { padding: 16px 24px; display: flex; justify-content: space-between; align-items: center; border-bottom: 1px solid rgba(255,255,255,0.05); background: var(--bg-primary); gap: 16px; flex-wrap: wrap; } #pdf-filename-input { flex: 1; max-width: 400px; text-align: center; background: rgba(255,255,255,0.05); border: 1px solid rgba(255,255,255,0.1); border-radius: 8px; color: white; padding: 6px 16px; font-size: 16px; font-family: var(--font-sans); outline: none; transition: background 0.2s; } #pdf-filename-input:focus { background: rgba(255,255,255,0.15); } .pdf-modal-body { display: flex; flex: 1; min-height: 0; /* Required to allow children to shrink inside a flex column */ overflow: hidden; } @media (max-width: 768px) { .pdf-modal-content { width: 100%; height: 100%; border-radius: 0; border: none; } .pdf-modal-header { padding: 12px 16px; } .pdf-modal-header h2 { font-size: 18px; margin: 0; } #pdf-filename-input { order: 3; min-width: 100%; margin-top: 8px; } .pdf-modal-body { flex-direction: column; } .pdf-preview-pane-wrapper { flex: 1; min-height: 50vh; } .pdf-chat-pane { flex: 1; border-left: none; border-top: 1px solid rgba(255,255,255,0.1); } } .pdf-preview-pane-wrapper { flex: 2; position: relative; background: #0d0f12; /* Black/Dark theme */ overflow: hidden; } .pdf-preview-pane-wrapper::before, .pdf-preview-pane-wrapper::after { content: ''; position: absolute; width: 600px; height: 600px; border-radius: 50%; opacity: 0.4; animation: aurora-drift 15s ease-in-out infinite alternate; pointer-events: none; z-index: 0; } .pdf-preview-pane-wrapper::before { top: -150px; left: -150px; background: radial-gradient(circle, rgba(66, 133, 244, 0.4) 0%, transparent 70%); } .pdf-preview-pane-wrapper::after { bottom: -150px; right: -150px; background: radial-gradient(circle, rgba(217, 101, 112, 0.3) 0%, transparent 70%); animation-delay: -5s; } .pdf-preview-pane { position: absolute; top: 0; left: 0; right: 0; bottom: 0; overflow-y: auto; overflow-x: hidden; padding: 40px; display: flex; justify-content: center; align-items: flex-start; } .printable-document { background: white; color: #000; width: 210mm; max-width: 100%; min-height: 297mm; padding: 40px; box-shadow: 0 4px 12px rgba(0,0,0,0.5); font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 11pt; line-height: 1.6; box-sizing: border-box; z-index: 1; /* Keep above aurora lights */ position: relative; /* Keep overlay inside paper */ } .printable-document h1 { color: #000; border: none; font-size: 26pt; /* Make title much larger */ font-weight: bold; text-align: left; margin-bottom: 24px; } .printable-document img { max-width: 250px; max-height: 300px; object-fit: cover; display: block; margin: 0 auto 24px auto; border-radius: 12px; box-shadow: 0 4px 12px rgba(0,0,0,0.15); } .printable-document h2, .printable-document h3, .printable-document h4, .printable-document h5, .printable-document h6 { color: #000; border: none; font-size: 12pt; font-weight: bold; } .printable-document strong, .printable-document b { color: #000; } .printable-document p, .printable-document li, .printable-document h1, .printable-document h2, .printable-document h3, .printable-document h4, .printable-document h5, .printable-document h6 { page-break-inside: avoid; break-inside: avoid; } .printable-document ul, .printable-document ol { list-style-position: outside; padding-left: 40px; margin-left: 0; } .printable-document li { margin-bottom: 8px; color: #000; } .printable-document li p { display: inline; margin: 0; } .printable-document code, .printable-document pre { background: #f4f4f4; color: #333; border: 1px solid #ddd; font-family: var(--font-code); font-size: 11pt; padding: 4px; border-radius: 4px; } .printable-document table { width: 100%; border-collapse: collapse; margin-bottom: 24px; page-break-inside: avoid; table-layout: fixed; word-wrap: break-word; overflow-wrap: break-word; } .printable-document th, .printable-document td { border: 1px solid #ddd; padding: 10px; text-align: left; } .printable-document th { background-color: #cccccc; font-weight: bold; } /* ========================================= PDF Dark Mode ========================================= */ .printable-document.dark-mode-doc { background: #1e1e1e; color: #fff; box-shadow: 0 4px 12px rgba(0,0,0,0.8); } .printable-document.dark-mode-doc h1, .printable-document.dark-mode-doc h2, .printable-document.dark-mode-doc h3, .printable-document.dark-mode-doc h4, .printable-document.dark-mode-doc h5, .printable-document.dark-mode-doc h6, .printable-document.dark-mode-doc p, .printable-document.dark-mode-doc strong, .printable-document.dark-mode-doc b { color: #eee; } .printable-document.dark-mode-doc li { color: #eee; } .printable-document.dark-mode-doc li::marker { color: #eee; } .printable-document.dark-mode-doc code, .printable-document.dark-mode-doc pre { background: #333; color: #eee; } .printable-document.dark-mode-doc th, .printable-document.dark-mode-doc td { border-color: #444; } .printable-document.dark-mode-doc th { background-color: #2a2a2a; } .pdf-chat-pane { flex: 1; min-height: 0; /* Prevents flex item from growing beyond its container */ background: rgba(13, 15, 18, 0.5); backdrop-filter: blur(24px) saturate(150%); -webkit-backdrop-filter: blur(24px) saturate(150%); border-left: 1px solid rgba(255,255,255,0.1); box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.05); display: flex; flex-direction: column; padding: 24px; } .pdf-chat-history { flex: 1; min-height: 0; /* Ensures overflow-y: auto works correctly when content grows */ overflow-y: auto; margin-bottom: 16px; display: flex; flex-direction: column; gap: 16px; } .pdf-chat-history .chat-msg { padding: 12px; border-radius: 12px; font-size: 14px; line-height: 1.4; } .pdf-chat-history .chat-msg.user { background: rgba(255,255,255,0.1); align-self: flex-end; } .pdf-chat-history .chat-msg.ai { background: rgba(137, 207, 240, 0.1); color: #89CFF0; align-self: flex-start; } .pdf-chat-input-wrapper { display: flex; gap: 8px; padding: 8px 16px; align-items: center; } #pdf-chat-input { flex: 1; background: transparent; border: none; color: var(--text-primary); font-size: 14px; outline: none; } /* ========================================= PDF Loading Skeleton ========================================= */ .pdf-loading-overlay { position: absolute; inset: 0; display: flex; flex-direction: column; padding: 40px; background: transparent; z-index: 5; } .pdf-loading-status { position: absolute; top: 250px; left: 50%; transform: translate(-50%, -50%); color: #000; background: linear-gradient(white, white) padding-box, linear-gradient(90deg, #3278ff, #c832ff, #ffb432) border-box; border: 2px solid transparent; border-radius: 20px; padding: 8px 24px; font-size: 18px; font-weight: bold; font-family: var(--font-sans); z-index: 10; animation: pulse-glow-border 2s infinite alternate; text-align: center; white-space: nowrap; } .printable-document.dark-mode-doc .pdf-loading-status { color: #fff; background: linear-gradient(#1e1e1e, #1e1e1e) padding-box, linear-gradient(90deg, #3278ff, #c832ff, #ffb432) border-box; } @keyframes pulse-glow-border { 0% { box-shadow: 0 0 8px rgba(200, 50, 255, 0.2); transform: translate(-50%, -50%) scale(0.98); } 100% { box-shadow: 0 0 20px rgba(200, 50, 255, 0.6); transform: translate(-50%, -50%) scale(1.02); } } .pdf-loading-skeleton { margin-top: 60px; display: flex; flex-direction: column; gap: 12px; filter: blur(4px); opacity: 0.6; } .pdf-loading-skeleton .skel-line { height: 14px; background: linear-gradient(90deg, #4b5563 25%, #9ca3af 50%, #4b5563 75%); background-size: 200% 100%; border-radius: 4px; opacity: 0; transform-origin: left; animation: skel-shimmer 2s infinite linear, skel-type-in 0.6s ease-out both; } .printable-document.dark-mode-doc .pdf-loading-skeleton .skel-line { background: linear-gradient(90deg, #9ca3af 25%, #e5e7eb 50%, #9ca3af 75%); background-size: 200% 100%; } @keyframes skel-shimmer { 0% { background-position: 200% 0; } 100% { background-position: -200% 0; } } @keyframes type-in { 0% { clip-path: inset(0 100% 0 0); opacity: 1; } 100% { clip-path: inset(0 0 0 0); opacity: 1; } } /* ========================================= Chat Timeline Minimap ========================================= */ .timeline-wrapper { position: fixed; right: 16px; top: 50%; transform: translateY(-50%); display: flex; flex-direction: column; align-items: flex-end; gap: 16px; z-index: 100; pointer-events: none; } .timeline-toggle-btn { position: fixed; top: 72px; /* Schräg rechts unterhalb des Neuer-Chat Buttons (welcher bei top 16px + height 40px endet) */ right: 16px; /* Selbe X-Achse wie die Timeline */ z-index: 101; pointer-events: auto; background: rgba(255, 255, 255, 0.05); backdrop-filter: blur(10px); border: 1px solid rgba(255, 255, 255, 0.1); border-radius: 50%; width: 28px; height: 28px; display: flex; align-items: center; justify-content: center; color: rgba(255, 255, 255, 0.6); cursor: pointer; transition: all 0.3s ease; } .timeline-toggle-btn:hover { background: rgba(255, 255, 255, 0.15); color: white; } .timeline-toggle-btn svg { transition: transform 0.4s cubic-bezier(0.25, 0.8, 0.25, 1); } .timeline-toggle-btn.collapsed svg { transform: rotate(180deg); } .chat-timeline-container { display: flex; flex-direction: column; gap: 8px; /* Increased vertical gap */ pointer-events: none; /* Let hover events pass through if not on a marker */ transition: opacity 0.3s ease, transform 0.4s cubic-bezier(0.25, 0.8, 0.25, 1); transform-origin: right center; } .timeline-wrapper.collapsed .chat-timeline-container { opacity: 0; transform: scaleX(0); pointer-events: none; } .timeline-marker-wrapper { position: relative; display: flex; align-items: center; justify-content: flex-end; pointer-events: auto; cursor: pointer; padding: 6px 0; /* Increased vertical padding */ } /* Massively increase the invisible touch/click area for mobile */ .timeline-marker-wrapper::before { content: ""; position: absolute; top: -12px; /* Expand hitbox further up */ bottom: -12px; /* Expand hitbox further down */ left: -24px; right: -8px; z-index: 1; } .timeline-marker { width: 14px; height: 3px; background: rgba(255, 255, 255, 0.2); border-radius: 2px; transition: all 0.3s cubic-bezier(0.25, 0.8, 0.25, 1); transform-origin: right center; } .timeline-marker-wrapper:hover .timeline-marker { width: 24px; background: rgba(255, 255, 255, 0.8); } .timeline-marker-wrapper.active .timeline-marker { width: 20px; background: rgba(255, 255, 255, 1); box-shadow: 0 0 8px rgba(255, 255, 255, 0.4); } .timeline-tooltip { position: absolute; right: 32px; background: rgba(30, 30, 30, 0.9); color: white; padding: 6px 12px; border-radius: 6px; font-size: 12px; white-space: nowrap; opacity: 0; visibility: hidden; transform: translateX(10px); transition: all 0.2s ease; pointer-events: none; border: 1px solid rgba(255, 255, 255, 0.1); box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3); max-width: 200px; overflow: hidden; text-overflow: ellipsis; } .timeline-marker-wrapper:hover .timeline-tooltip { opacity: 1; visibility: visible; transform: translateX(0); } @keyframes skel-shimmer { 0% { background-position: 200% 0; } 100% { background-position: -200% 0; } } @keyframes skel-type-in { 0% { opacity: 0; transform: scaleX(0); } 1% { opacity: 1; transform: scaleX(0); } 100% { opacity: 1; transform: scaleX(1); } } .gemini-skel-line { height: 14px; background: linear-gradient(90deg, rgba(255, 255, 255, 0.85) 25%, rgba(230, 200, 255, 0.95) 50%, rgba(255, 255, 255, 0.85) 75%); background-size: 200% 100%; border-radius: 4px; opacity: 0; transform-origin: left; box-shadow: 0 0 8px rgba(255, 255, 255, 0.2); animation: skel-shimmer 2.5s infinite linear, skel-type-in 1s ease-out both; } @keyframes pulse-status { 0% { opacity: 0.5; } 100% { opacity: 1; } } /* ========================================= Deep Research & PDF Report Styling ========================================= */ .pdf-document img { max-width: 100%; height: auto; object-fit: contain; border-radius: 16px; box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2); margin: 24px 0; display: block; } .pdf-document table { width: 100%; border-collapse: collapse; margin: 24px 0; font-size: 14px; border-radius: 12px; overflow: hidden; box-shadow: 0 4px 15px rgba(0, 0, 0, 0.05); } .pdf-document th, .pdf-document td { padding: 12px 16px; border-bottom: 1px solid rgba(0, 0, 0, 0.05); text-align: left; } .pdf-document th { background-color: rgba(0, 0, 0, 0.03); font-weight: 600; } .pdf-document tr:last-child td { border-bottom: none; } /* Dark mode overrides for PDF document */ .dark-mode-doc table { box-shadow: 0 4px 15px rgba(0, 0, 0, 0.2); } .dark-mode-doc th, .dark-mode-doc td { border-bottom: 1px solid rgba(255, 255, 255, 0.05); } .dark-mode-doc th { background-color: rgba(255, 255, 255, 0.05); } /* Hide details (like Gliederung/Table of contents) in PDF and Article views */ .printable-document details, .article-document details { display: none !important; } .source-highlight { background: rgba(137, 207, 240, 0.15) !important; border-left: 4px solid #89CFF0 !important; padding-left: 12px !important; border-radius: 4px; transition: all 0.3s ease; } /* ========================================= Article View Modal Styling ========================================= */ #article-view-modal { position: fixed; top: 0; left: 0; right: 0; bottom: 0; z-index: 10000; background: var(--bg-color); overflow-y: auto; flex-direction: column; } .article-modal-header { position: sticky; top: 0; left: 0; right: 0; height: 70px; background: rgba(var(--bg-color-rgb), 0.8); backdrop-filter: blur(12px); -webkit-backdrop-filter: blur(12px); display: flex; align-items: center; justify-content: space-between; padding: 0 24px; z-index: 100; border-bottom: 1px solid rgba(255, 255, 255, 0.05); } .article-actions { display: flex; gap: 12px; } .article-action-btn { padding: 8px 16px; border-radius: 20px; border: 1px solid rgba(255, 255, 255, 0.1); color: white; display: flex; align-items: center; gap: 8px; cursor: pointer; font-size: 14px; background: rgba(255, 255, 255, 0.05); transition: all 0.2s ease; } .article-action-btn:hover { background: rgba(255, 255, 255, 0.1); transform: translateY(-1px); } .article-modal-content { width: 100%; max-width: 800px; margin: 0 auto; padding: 60px 24px 120px 24px; } .article-document { font-size: 18px; line-height: 1.8; color: var(--text-primary); overflow-wrap: anywhere; word-break: break-word; word-wrap: break-word; } .article-document h1 { font-size: 2.5em; line-height: 1.2; margin-bottom: 40px; font-weight: 700; } .article-document h2 { font-size: 1.8em; margin-top: 60px; margin-bottom: 24px; font-weight: 600; } .article-document p { margin-bottom: 24px; } .article-document img { max-width: 100%; height: auto; border-radius: 12px; display: block; margin: 24px auto; } .article-document table { width: 100%; border-collapse: collapse; margin-bottom: 24px; table-layout: fixed; word-wrap: break-word; overflow-wrap: break-word; } .article-document th, .article-document td { border: 1px solid rgba(255,255,255,0.1); padding: 10px; text-align: left; } .article-document th { background-color: rgba(255,255,255,0.05); font-weight: bold; } @media (max-width: 850px) { .printable-document { padding: 24px; min-height: auto; } .article-modal-content { padding: 40px 16px 80px 16px; } } /* Hide chat-specific floating UI elements when not in Chat view, or when chat is empty */ body:not(.in-chat-view) #timeline-toggle-btn, body:not(.in-chat-view) #timeline-wrapper, body.chat-is-empty #timeline-toggle-btn, body.chat-is-empty #timeline-wrapper { display: none !important; } /* Removed hiding of aurora-background so it stays visible */ /* Vault Folder Styling (macOS inspired) */ .macos-folder { width: 100%; flex: 1; max-height: 80px; position: relative; transition: transform 0.2s cubic-bezier(0.2, 0.8, 0.2, 1); display: flex; align-items: center; justify-content: center; } .macos-folder > svg { width: 100%; height: 100%; position: absolute; top: 0; left: 0; filter: drop-shadow(0 4px 12px rgba(0,0,0,0.3)); } .folder-emoji-wrapper { z-index: 2; filter: drop-shadow(0 1px 1px rgba(255,255,255,0.4)); transform: translateY(12px); /* Shift down to center inside the main folder body (below the tab) */ pointer-events: none; } .folder-icon-engraved { /* Flat silhouette perfectly darkens the exact hue of the folder without turning gray */ color: rgba(0,0,0,0.3); } .icon-grid-item { width: 100%; aspect-ratio: 1; display: flex; align-items: center; justify-content: center; border-radius: 8px; cursor: pointer; color: rgba(255,255,255,0.7); transition: all 0.2s; } .icon-grid-item:hover { background: rgba(255,255,255,0.1); color: white; } .icon-grid-item.selected { background: var(--primary-color); color: white; } /* Custom Scrollbar for icon grid */ .icon-picker-grid::-webkit-scrollbar { width: 6px; } .icon-picker-grid::-webkit-scrollbar-track { background: transparent; } .icon-picker-grid::-webkit-scrollbar-thumb { background: rgba(255,255,255,0.2); border-radius: 3px; } .folder-edit-btn { position: absolute; top: -8px; right: -8px; width: 28px; height: 28px; border-radius: 50%; background: var(--surface-light); color: var(--text-color); border: 1px solid rgba(255,255,255,0.1); display: flex; align-items: center; justify-content: center; cursor: pointer; opacity: 0; transform: scale(0.8); transition: all 0.2s ease; z-index: 5; box-shadow: 0 4px 12px rgba(0,0,0,0.3); } .file-item:hover .folder-edit-btn { opacity: 1; transform: scale(1); } .folder-edit-btn:hover { background: var(--primary-color); color: white; } /* Folder Customization Popover */ .folder-popover { position: absolute; background: rgba(30, 30, 35, 0.95); backdrop-filter: blur(20px); -webkit-backdrop-filter: blur(20px); border: 1px solid rgba(255,255,255,0.1); border-radius: 16px; padding: 16px; width: 280px; z-index: 1000; box-shadow: 0 10px 40px rgba(0,0,0,0.5); display: flex; flex-direction: column; gap: 16px; transform-origin: top center; animation: popover-in 0.2s cubic-bezier(0.2, 0.8, 0.2, 1) forwards; } @keyframes popover-in { from { opacity: 0; transform: scale(0.95) translateY(-10px); } to { opacity: 1; transform: scale(1) translateY(0); } } .folder-popover h3 { font-size: 14px; font-weight: 600; margin: 0; color: var(--text-secondary); text-transform: uppercase; letter-spacing: 0.5px; } .folder-popover input[type="color"] { -webkit-appearance: none; border: none; width: 100%; height: 40px; border-radius: 8px; cursor: pointer; background: none; padding: 0; } .folder-popover input[type="color"]::-webkit-color-swatch-wrapper { padding: 0; } .folder-popover input[type="color"]::-webkit-color-swatch { border: 1px solid rgba(255,255,255,0.2); border-radius: 8px; } .folder-popover input[type="text"] { width: 100%; background: rgba(0,0,0,0.3); border: 1px solid rgba(255,255,255,0.1); border-radius: 8px; padding: 10px; color: white; font-size: 20px; text-align: center; outline: none; } .folder-popover input[type="text"]:focus { border-color: var(--primary-color); } /* ========================================= PDF Reading Mode ========================================= */ body.pdf-reading-mode { background: #000 !important; } body.pdf-reading-mode .aurora-background { display: none !important; } body.pdf-reading-mode::before, body.pdf-reading-mode::after { display: none !important; } body.pdf-reading-mode #chat-messages { max-width: 800px; margin: 0 auto; padding: 40px 24px 120px 24px !important; } body.pdf-reading-mode .chat-message-wrapper { max-width: 100%; align-self: center !important; width: 100%; } body.pdf-reading-mode .chat-bubble-user, body.pdf-reading-mode .chat-bubble-ai { background: transparent !important; border: none !important; box-shadow: none !important; padding: 0 !important; border-radius: 0 !important; font-size: 16px; line-height: 1.6; } body.pdf-reading-mode .chat-bubble-user { color: var(--text-secondary); font-size: 28px; font-weight: 700; margin-top: 40px; margin-bottom: 8px; letter-spacing: -0.02em; } body.pdf-reading-mode .ai-msg-actions { opacity: 0; transition: opacity 0.2s; } body.pdf-reading-mode .chat-message-wrapper:hover .ai-msg-actions { opacity: 1; } /* Dynamic Island PDF Title */ body.pdf-reading-mode .di-collapsed #current-model-display { font-size: 0; } body.pdf-reading-mode .di-collapsed #current-model-display::after { content: "PDF READER"; font-size: 14px; font-weight: 700; letter-spacing: 1px; } /* Input Collapse State */ .input-capsule-container, .bottom-tab-bar { transition: transform 0.4s cubic-bezier(0.2, 0.8, 0.2, 1), opacity 0.4s; } body.pdf-input-collapsed .input-capsule-container, body.pdf-input-collapsed .bottom-tab-bar { transform: translateY(150px); opacity: 0; pointer-events: none; } /* Light Mode PDF Theme */ body.pdf-reading-mode.pdf-light-mode { background: #f4f4f5 !important; color: #111827 !important; } body.pdf-reading-mode.pdf-light-mode .chat-overlay-header { background: linear-gradient(to bottom, rgba(244,244,245,1) 35%, rgba(244,244,245,0.9) 55%, rgba(244,244,245,0.6) 75%, rgba(244,244,245,0.2) 90%, rgba(244,244,245,0) 100%) !important; } #pdf-color-mode-btn { display: none !important; } body.pdf-reading-mode #pdf-color-mode-btn { display: flex !important; } body.pdf-reading-mode.pdf-light-mode .chat-bubble-user { color: #111827 !important; } body.pdf-reading-mode.pdf-light-mode .chat-bubble-ai { color: #374151 !important; } body.pdf-reading-mode.pdf-light-mode .markdown-body { color: #374151 !important; } body.pdf-reading-mode.pdf-light-mode .chat-bubble-ai > .markdown-body > p:first-of-type, body.pdf-reading-mode.pdf-light-mode .chat-bubble-ai.markdown-body > p:first-of-type { color: #111827 !important; } body.pdf-reading-mode.pdf-light-mode .pdf-top-btn { background: rgba(0,0,0,0.05) !important; border-color: rgba(0,0,0,0.1) !important; color: #111827 !important; } body.pdf-reading-mode.pdf-light-mode .di-collapsed { background: rgba(0,0,0,0.05) !important; border-color: rgba(0,0,0,0.1) !important; color: #111827 !important; } body.pdf-reading-mode.pdf-light-mode .di-collapsed svg { color: #111827 !important; } body.pdf-reading-mode.pdf-light-mode .markdown-body strong, body.pdf-reading-mode.pdf-light-mode .markdown-body b { color: #111827 !important; } body.pdf-reading-mode.pdf-light-mode .markdown-body li::marker { color: #111827 !important; } body.pdf-reading-mode.pdf-light-mode .timeline-toggle-btn { background: rgba(0, 0, 0, 0.05) !important; border-color: rgba(0, 0, 0, 0.1) !important; color: rgba(0, 0, 0, 0.6) !important; } body.pdf-reading-mode.pdf-light-mode .timeline-toggle-btn:hover { background: rgba(0, 0, 0, 0.15) !important; color: #111827 !important; } body.pdf-reading-mode.pdf-light-mode .timeline-marker { background: rgba(0, 0, 0, 0.2) !important; } body.pdf-reading-mode.pdf-light-mode .timeline-marker-wrapper:hover .timeline-marker { background: rgba(0, 0, 0, 0.6) !important; } body.pdf-reading-mode.pdf-light-mode .timeline-marker-wrapper.active .timeline-marker { background: rgba(0, 0, 0, 0.9) !important; box-shadow: 0 0 8px rgba(0, 0, 0, 0.2) !important; } body.pdf-reading-mode.pdf-light-mode .timeline-tooltip { background: rgba(244, 244, 245, 0.95) !important; color: #111827 !important; border-color: rgba(0, 0, 0, 0.1) !important; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1) !important; } /* --- Performance Utilities (Low-End Devices) --- */ .gpu-accelerated { transform: translateZ(0); will-change: transform; backface-visibility: hidden; } .contain-paint { contain: paint; } /* ========================================= History Dropdown (Long Press) ========================================= */ .history-dropdown { width: 100%; max-height: 0; overflow: hidden; opacity: 0; pointer-events: none; background: rgba(25, 25, 30, 0.95); border: 1px solid transparent; border-radius: 12px; display: flex; flex-direction: column; gap: 2px; transition: max-height 0.3s cubic-bezier(0.2, 0.8, 0.2, 1), opacity 0.3s cubic-bezier(0.2, 0.8, 0.2, 1), padding 0.3s cubic-bezier(0.2, 0.8, 0.2, 1), margin-top 0.3s cubic-bezier(0.2, 0.8, 0.2, 1), border-color 0.3s ease; padding: 0 6px; margin-top: 0; } .history-item.show-dropdown .history-dropdown { opacity: 1; pointer-events: auto; max-height: 120px; padding: 6px; margin-top: 8px; border-color: rgba(255, 255, 255, 0.1); } .history-dropdown-btn { background: transparent; border: none; color: var(--text-primary); padding: 12px 14px; font-size: 14px; font-weight: 500; font-family: var(--font-ui); text-align: left; border-radius: 8px; cursor: pointer; display: flex; align-items: center; gap: 12px; transition: all 0.2s ease; white-space: nowrap; } .history-dropdown-btn svg { opacity: 0.7; } .history-dropdown-btn:hover { background: rgba(255, 255, 255, 0.08); } .history-dropdown-btn.danger { color: #ff5555; } .history-dropdown-btn.danger svg { opacity: 0.9; } .history-dropdown-btn.danger:hover { background: rgba(255, 60, 60, 0.15); } .history-actions { display: none !important; } /* Erweitertes Denken (Extended Thinking) UI */ .ai-thought-process { margin: 10px 0 16px 0; background: rgba(255, 255, 255, 0.03); border: 1px solid rgba(255, 255, 255, 0.08); border-radius: 12px; overflow: hidden; transition: background 0.2s; } .ai-thought-process > summary { padding: 12px 14px; cursor: pointer; display: flex; align-items: center; justify-content: space-between; font-size: 13px; font-weight: 500; color: rgba(255, 255, 255, 0.6); list-style: none; /* Hide default arrow */ user-select: none; } .ai-thought-process > summary::-webkit-details-marker { display: none; } .ai-thought-process > summary:hover { background: rgba(255, 255, 255, 0.05); color: rgba(255, 255, 255, 0.8); } .ai-thought-process[open] > summary { border-bottom: 1px solid rgba(255, 255, 255, 0.08); } .ai-thought-process .chevron { transition: transform 0.3s ease; opacity: 0.6; } .ai-thought-process[open] .chevron { transform: rotate(180deg); } .thought-content { padding: 14px; font-size: 13.5px; line-height: 1.5; color: rgba(255, 255, 255, 0.5); font-family: monospace; background: rgba(0, 0, 0, 0.2); border-top: 1px solid rgba(0,0,0,0.2); } .thought-content p:first-child { margin-top: 0; } .thought-content p:last-child { margin-bottom: 0; } /* ========================================================================== Inline Text-Anmerkungen (Annotations) ========================================================================== */ .annotation-floating-btn { position: fixed; z-index: 1000; background: rgba(40, 100, 255, 0.95); backdrop-filter: blur(10px); -webkit-backdrop-filter: blur(10px); border: 1px solid rgba(255, 255, 255, 0.2); border-radius: 30px; padding: 12px 24px; color: white; font-size: 15px; font-weight: 600; display: flex; align-items: center; gap: 8px; cursor: pointer; box-shadow: 0 8px 30px rgba(0, 0, 0, 0.5), 0 0 20px rgba(40, 100, 255, 0.3); bottom: 150px; left: 50%; transform: translateX(-50%) translateY(20px); opacity: 0; pointer-events: none; transition: opacity 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275), transform 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275); } .annotation-floating-btn.visible { opacity: 1; transform: translateX(-50%) translateY(0); pointer-events: auto; } .annotation-floating-btn:hover { background: rgba(40, 40, 60, 0.9); } .ai-text-highlight { background-color: rgba(137, 207, 240, 0.3); /* Baby blue highlight */ border-radius: 4px; padding: 0 2px; margin: 0 -2px; color: inherit; cursor: pointer; border-bottom: 1px dashed rgba(137, 207, 240, 0.8); } .annotation-modal-overlay { position: fixed; inset: 0; background: rgba(0, 0, 0, 0.6); backdrop-filter: blur(4px); z-index: 9999; display: flex; align-items: center; justify-content: center; padding: 20px; } .annotation-modal { background: rgba(15, 15, 20, 0.8); backdrop-filter: blur(20px); -webkit-backdrop-filter: blur(20px); border: 1px solid rgba(255, 255, 255, 0.1); border-radius: 16px; width: 100%; max-width: 400px; padding: 20px; box-shadow: 0 10px 40px rgba(0, 0, 0, 0.5); display: flex; flex-direction: column; gap: 16px; } .annotation-modal h3 { margin: 0; font-size: 16px; color: rgba(255, 255, 255, 0.9); } .annotation-modal blockquote { margin: 0; padding: 8px 12px; background: rgba(255, 255, 255, 0.05); border-left: 3px solid #89CFF0; border-radius: 4px; font-size: 13px; color: rgba(255, 255, 255, 0.7); max-height: 80px; overflow-y: auto; font-style: italic; } .annotation-modal textarea { background: rgba(0, 0, 0, 0.2); border: 1px solid rgba(255, 255, 255, 0.1); border-radius: 12px; padding: 12px; color: white; font-family: inherit; font-size: 14px; resize: none; min-height: 80px; } .annotation-modal textarea:focus { outline: none; border-color: rgba(255, 255, 255, 0.3); } .annotation-modal-actions { display: flex; justify-content: flex-end; gap: 10px; } .annotation-chips-container { display: flex; flex-wrap: wrap; gap: 8px; padding: 8px 16px 0 16px; margin-bottom: -8px; /* overlap with chat input padding */ } .annotation-chip { background: rgba(137, 207, 240, 0.15); border: 1px solid rgba(137, 207, 240, 0.3); color: #89CFF0; border-radius: 16px; padding: 4px 10px; font-size: 12px; display: flex; align-items: center; gap: 6px; } .annotation-chip .remove-chip { background: none; border: none; color: inherit; cursor: pointer; padding: 0; display: flex; align-items: center; opacity: 0.7; } .annotation-chip .remove-chip:hover { opacity: 1; } @keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } } /* ========================================= TTS Player (Apple Music Style) ========================================= */ .tts-player-container { position: fixed; bottom: calc(140px + var(--safe-area-bottom)); /* Just above the input capsule */ left: 12px; right: 12px; z-index: 85; transition: transform 0.4s cubic-bezier(0.25, 0.8, 0.25, 1), opacity 0.4s ease, bottom 0.4s ease; pointer-events: none; } body.in-chat-view .tts-player-container { bottom: calc(160px + var(--safe-area-bottom)); /* A bit higher in chat view */ } .tts-player-container.collapsed { transform: translateY(150%); opacity: 0; pointer-events: none; } .tts-player-container:not(.collapsed) { transform: translateY(0); opacity: 1; pointer-events: auto; } @keyframes gemini-glow { 0% { background-position: 0% 50%; } 100% { background-position: 100% 50%; } } .tts-player-inner { background: linear-gradient(135deg, rgba(182, 120, 242, 0.15), rgba(255, 204, 0, 0.15)), rgba(20, 20, 25, 0.7); background-size: 300% 300%; backdrop-filter: blur(20px); -webkit-backdrop-filter: blur(20px); border: 1px solid rgba(255, 255, 255, 0.1); border-radius: 24px; box-shadow: 0 10px 40px rgba(0, 0, 0, 0.4), inset 0 1px 1px rgba(255,255,255,0.1); overflow: hidden; display: flex; flex-direction: column; padding: 8px 16px 16px 16px; touch-action: pan-y; /* Allow vertical drag */ transition: all 0.3s ease; } .tts-player-container.playing .tts-player-inner { animation: gemini-glow 4s linear infinite alternate; background: linear-gradient(135deg, rgba(182, 120, 242, 0.3), rgba(255, 204, 0, 0.3), rgba(182, 120, 242, 0.3), rgba(20, 20, 25, 0.8)); background-size: 300% 300%; } .tts-player-drag-handle { width: 36px; height: 4px; background: rgba(255, 255, 255, 0.3); border-radius: 2px; margin: 0 auto 12px auto; } .tts-player-content { display: flex; align-items: center; gap: 12px; } .tts-player-icon { width: 44px; height: 44px; border-radius: 10px; background: linear-gradient(135deg, #b678f2, #89CFF0); display: flex; align-items: center; justify-content: center; color: white; box-shadow: 0 4px 12px rgba(182, 120, 242, 0.3); flex-shrink: 0; } .tts-player-info { flex: 1; min-width: 0; /* for truncation */ } .tts-player-title { color: white; font-weight: 600; font-size: 15px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; line-height: 1.2; margin-bottom: 2px; } .tts-player-subtitle { color: rgba(255, 255, 255, 0.6); font-size: 12px; font-weight: 500; } .tts-player-controls { display: flex; align-items: center; gap: 8px; } .tts-btn { background: transparent; color: white; border: none; width: 36px; height: 36px; border-radius: 50%; display: flex; align-items: center; justify-content: center; cursor: pointer; transition: opacity 0.2s, background 0.2s; } .tts-btn:active { opacity: 0.6; } .tts-play-btn { background: rgba(255, 255, 255, 0.1); width: 44px; height: 44px; } .tts-rate-btn { background: rgba(255, 255, 255, 0.1); border: 1px solid rgba(255, 255, 255, 0.05); color: white; font-size: 12px; font-weight: 700; border-radius: 12px; padding: 4px 8px; cursor: pointer; margin-left: 4px; } /* ═══════════════════════════════════════════════════════════════════ GLASS VAULT — Premium Document View Redesign ═══════════════════════════════════════════════════════════════════ */ /* Wrapper */ #vault-glass-wrapper { width: 100%; box-sizing: border-box; padding: 20px 16px 140px 16px; max-width: 800px; margin: 0 auto; min-height: 100vh; display: flex; flex-direction: column; position: relative; } /* Big Ambient Title */ .vault-ambient-title { font-size: 36px; font-weight: 800; line-height: 1.15; margin: 0 0 8px 4px; pointer-events: none; user-select: none; white-space: pre-line; letter-spacing: -0.5px; /* Transparent gradient text */ background: linear-gradient(180deg, rgba(255,255,255,0.7) 0%, rgba(255,255,255,0.05) 100%); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; } /* Header bar */ .vault-header { position: relative; z-index: 10; display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 12px; margin-bottom: 20px; } .vault-header-sticky { position: sticky; top: -20px; z-index: 50; padding-top: 20px; padding-bottom: 32px; margin-top: -20px; margin-bottom: -12px !important; margin-left: -16px; margin-right: -16px; padding-left: 16px; padding-right: 16px; background: linear-gradient(to bottom, #000000 0%, #000000 60%, transparent 100%); pointer-events: none; } .vault-header-sticky > * { pointer-events: auto; } .vault-header-left { display: flex; flex-direction: column; max-width: 100%; } .vault-header-title { font-size: 28px; font-weight: 700; margin: 0; display: flex; align-items: center; gap: 8px; word-break: break-word; color: white; } .vault-header-sub { font-size: 13px; color: rgba(255,255,255,0.35); margin-top: 2px; } .vault-header-actions { display: flex; gap: 10px; flex-wrap: wrap; } /* Action buttons inside vault header */ .vault-action-btn { padding: 9px 16px; border-radius: 12px; font-weight: 600; font-size: 14px; display: flex; align-items: center; gap: 7px; cursor: pointer; border: 1px solid rgba(255,255,255,0.10); background: rgba(255,255,255,0.04); color: rgba(255,255,255,0.85); transition: opacity 0.2s, transform 0.15s; -webkit-tap-highlight-color: transparent; } .vault-action-btn:active { transform: scale(0.96); opacity: 0.8; } /* 2-Column Grid */ #vault-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 16px; flex-grow: 1; align-content: flex-start; width: 100%; } /* ── Glass Folder ─────────────────────────── */ .vault-folder { cursor: pointer; -webkit-tap-highlight-color: transparent; transition: transform 0.25s cubic-bezier(.22,.68,0,1.1), opacity 0.25s ease; will-change: auto; position: relative; min-width: 0; } .vault-folder:active { transform: scale(0.97); } .vault-folder-body { position: relative; width: 100%; aspect-ratio: 1.3; border-radius: 16px; overflow: visible; perspective: 800px; } /* Tab (top-left flap) on the BACK panel */ .vault-folder-back { position: absolute; inset: 0; z-index: 1; } .vault-folder-tab { position: absolute; top: -8px; left: 8px; width: 35%; height: 16px; background: linear-gradient(180deg, color-mix(in srgb, var(--folder-color) 25%, rgba(30,35,45,1)), color-mix(in srgb, var(--folder-color) 15%, rgba(20,25,35,1))); border-radius: 8px 8px 0 0; overflow: hidden; } .vault-folder-back-panel { position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: linear-gradient(to top, color-mix(in srgb, var(--folder-color) 40%, rgba(15,20,30,1)) 0%, color-mix(in srgb, var(--folder-color) 15%, rgba(10,15,25,1)) 100%); border-radius: 16px; box-shadow: inset 0 1px 2px rgba(255,255,255,0.05); overflow: hidden; } /* Papers sticking out */ .vault-folder-papers { position: absolute; top: -8px; left: 10%; right: 10%; height: 30%; z-index: 2; transition: transform 0.4s cubic-bezier(0.25, 0.8, 0.25, 1), opacity 0.3s ease; } .vault-folder-detail .vault-folder-papers { transform: translateY(-40px) scale(0.8); opacity: 0; } .vault-paper { position: absolute; bottom: 0; width: 100%; height: 100%; background: rgba(255, 255, 255, 0.9); border-radius: 4px 4px 0 0; box-shadow: 0 -2px 10px rgba(0,0,0,0.5); transform-origin: bottom center; } /* Main Front Panel */ .vault-folder-front { position: absolute; top: 10%; left: 0; right: 0; bottom: 0; background: linear-gradient(to top, color-mix(in srgb, var(--folder-color) 70%, transparent) 0%, color-mix(in srgb, var(--folder-color) 20%, transparent) 100%); border-radius: 12px 12px 16px 16px; border: 1px solid rgba(255,255,255,0.08); border-top: 1px solid rgba(255,255,255,0.25); box-shadow: 0 -4px 12px rgba(0,0,0,0.3), 0 8px 32px rgba(0,0,0,0.5), inset 0 1px 0 rgba(255,255,255,0.1); backdrop-filter: blur(12px); -webkit-backdrop-filter: blur(12px); z-index: 3; overflow: hidden; transform-origin: bottom; transform: rotateX(15deg); transition: transform 0.4s cubic-bezier(0.25, 0.8, 0.25, 1); } /* Icon overlay centered in folder */ .vault-folder-icon { position: absolute; inset: 0; display: flex; align-items: center; justify-content: center; opacity: 0.20; transform: translateY(4px); pointer-events: none; } .vault-folder-icon svg { width: 36px; height: 36px; color: rgba(255,255,255,0.9); } /* Folder name below */ .vault-folder-name { text-align: center; font-size: 13px; font-weight: 600; color: rgba(255,255,255,0.85); margin-top: 10px; text-shadow: 0 1px 4px rgba(0,0,0,0.5); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; padding: 0 4px; } /* Edit button on glass folder */ .vault-folder .folder-edit-btn { position: absolute; top: -6px; right: -6px; width: 26px; height: 26px; border-radius: 50%; background: rgba(30,30,40,0.85); color: rgba(255,255,255,0.7); border: 1px solid rgba(255,255,255,0.12); display: flex; align-items: center; justify-content: center; cursor: pointer; opacity: 0; transform: scale(0.8); transition: opacity 0.2s, transform 0.2s; z-index: 10; box-shadow: 0 4px 12px rgba(0,0,0,0.4); } .vault-folder:hover .folder-edit-btn, .vault-folder .folder-edit-btn.visible { opacity: 1; transform: scale(1); } /* Delete button on items */ .vault-item-delete { position: absolute; top: 6px; left: 6px; width: 24px; height: 24px; border-radius: 50%; background: rgba(255,50,50,0.2); color: #ff4444; border: none; display: flex; align-items: center; justify-content: center; cursor: pointer; opacity: 0; z-index: 10; padding: 0; transition: opacity 0.15s; } /* Hide edit/delete buttons for folders by default (in grid view) */ .vault-folder:not(.vault-folder-detail) > .folder-edit-btn, .vault-folder:not(.vault-folder-detail) > .vault-item-delete { display: none !important; } /* In detail view, make them visible and stacked ALWAYS ON THE RIGHT */ .vault-folder-detail > .folder-edit-btn, .vault-folder-detail > .vault-item-delete { display: flex !important; opacity: 1 !important; transform: scale(1) !important; position: absolute; width: 36px; height: 36px; border-radius: 50%; pointer-events: auto; box-shadow: 0 4px 12px rgba(0,0,0,0.4); z-index: 10; } .vault-folder-detail > .folder-edit-btn { top: 15%; right: -48px; left: auto; } .vault-folder-detail > .vault-item-delete { top: calc(15% + 48px); right: -48px; left: auto; } /* ── Glass File Card ─────────────────────────── */ /* When a file/folder is shown as a child inside a folder detail view, remove clip-path so the rotation doesn't cause the top to be cut off */ .vault-child-item .vault-file-body { clip-path: none !important; -webkit-clip-path: none !important; border-radius: 10px; /* restore rounded corners */ } .vault-child-item .vault-file-fold { display: none; /* fold doesn't make sense without clip-path */ } .vault-file { cursor: pointer; -webkit-tap-highlight-color: transparent; transition: transform 0.25s cubic-bezier(.22,.68,0,1.1), opacity 0.25s ease; will-change: auto; position: relative; width: 90px; flex-shrink: 0; /* for horizontal scrolling */ filter: drop-shadow(0 4px 8px rgba(0,0,0,0.12)); } .vault-file:active { transform: scale(0.97); } .vault-file-body { position: relative; width: 100%; aspect-ratio: 0.71; /* NO border-radius or background here. We use clip-path to perfectly cut the top right corner. */ /* The cut is 24px wide and 24px high. Since width is strictly 90px, we use 66px to avoid calc() bugs in Safari. */ clip-path: polygon(0 0, 66px 0, 100% 24px, 100% 100%, 0 100%); -webkit-clip-path: polygon(0 0, 66px 0, 100% 24px, 100% 100%, 0 100%); transform: translateZ(0); /* Force GPU to ensure Safari actually clips */ display: flex; flex-direction: column; } .vault-file-bg { position: absolute; inset: 0; border-radius: 10px; /* This preserves the other 3 rounded corners! */ background: #18181b; /* Dark theme card */ box-shadow: inset 0 0 0 1px rgba(255,255,255,0.08); z-index: 0; } .vault-file-top-bar { position: absolute; top: 1px; left: 1px; height: 4px; width: 65px; /* 66px - 1px left */ border-top-left-radius: 9px; z-index: 5; } /* File Type Colors */ .type-txt .vault-file-top-bar { background: linear-gradient(90deg, #ff4b2b, #ff416c); } .type-html .vault-file-top-bar { background: linear-gradient(90deg, #e34c26, #f06529); } .type-css .vault-file-top-bar { background: linear-gradient(90deg, #264de4, #2965f1); } .type-js .vault-file-top-bar { background: linear-gradient(90deg, #f7df1e, #f0db4f); } .type-json .vault-file-top-bar { background: linear-gradient(90deg, #d4d4d4, #a3a3a3); } .type-md .vault-file-top-bar { background: linear-gradient(90deg, #cb3837, #800080); } .type-pdf .vault-file-top-bar { background: #ff0000; } .type-docx .vault-file-top-bar { background: #2b579a; } .type-xls .vault-file-top-bar, .type-xlsx .vault-file-top-bar, .type-csv .vault-file-top-bar, .type-tsv .vault-file-top-bar { background: #217346; } .type-pptx .vault-file-top-bar { background: #d24726; } .type-xml .vault-file-top-bar, .type-yaml .vault-file-top-bar, .type-yml .vault-file-top-bar { background: linear-gradient(90deg, #ff00ff, #8a2be2); } .type-png .vault-file-top-bar, .type-jpg .vault-file-top-bar, .type-jpeg .vault-file-top-bar, .type-gif .vault-file-top-bar, .type-svg .vault-file-top-bar, .type-webp .vault-file-top-bar, .type-bmp .vault-file-top-bar, .type-ico .vault-file-top-bar, .type-tiff .vault-file-top-bar { background: linear-gradient(90deg, #ff007f, #ff8c00); } .type-mp3 .vault-file-top-bar, .type-wav .vault-file-top-bar, .type-ogg .vault-file-top-bar, .type-flac .vault-file-top-bar, .type-aac .vault-file-top-bar, .type-m4a .vault-file-top-bar { background: linear-gradient(90deg, #8a2be2, #4b0082); } .type-mp4 .vault-file-top-bar, .type-mkv .vault-file-top-bar, .type-avi .vault-file-top-bar, .type-mov .vault-file-top-bar, .type-wmv .vault-file-top-bar { background: linear-gradient(90deg, #1e90ff, #0000cd); } .type-zip .vault-file-top-bar, .type-rar .vault-file-top-bar, .type-7z .vault-file-top-bar, .type-tar .vault-file-top-bar, .type-gz .vault-file-top-bar { background: linear-gradient(90deg, #ffd700, #ff8c00); } .type-exe .vault-file-top-bar, .type-dmg .vault-file-top-bar { background: #888888; } /* The folded flap at top right */ .vault-file-fold { position: absolute; top: 0; right: 0; width: 34px; height: 34px; /* Dark fold gradient matching the dark card */ background: linear-gradient(to bottom left, transparent 16px, #27272a 16.5px, #18181b 100%); border-bottom-left-radius: 10px; filter: drop-shadow(-2px 2px 3px rgba(0,0,0,0.5)); z-index: 10; } /* Realistic Invoice Skeleton */ .vault-file-invoice { padding: 6px 6px; display: flex; flex-direction: column; width: 100%; height: 100%; box-sizing: border-box; } .vault-file-invoice-header { font-size: 4px; font-weight: 800; color: #1a1a1a; letter-spacing: -0.1px; margin-bottom: 3px; margin-left: 2px; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; } .vault-file-invoice-divider { height: 0.5px; background: #d0d0d0; margin: 2px 0; width: 100%; } .vault-file-invoice-bottom-divider { height: 1px; background: #d0d0d0; margin: 6px 0 2px 0; width: 100%; } .vault-file-invoice-row { display: flex; width: 100%; gap: 4px; margin: 3px 0; } .vault-file-invoice-col { flex: 1; display: flex; flex-direction: column; gap: 1.5px; } .skel-text { height: 1.5px; background: #e0e0e0; border-radius: 0.5px; } .skel-text.w-full { width: 100%; } .skel-text.w-3-4 { width: 75%; } .skel-text.w-1-2 { width: 50%; } .vault-file-invoice-table { display: flex; flex-direction: column; border: 0.5px solid #e0e0e0; margin: 4px 0; } .skel-table-header { height: 4px; background: #f0f0f0; border-bottom: 0.5px solid #e0e0e0; } .skel-table-row { height: 3px; border-bottom: 0.5px solid #f0f0f0; } .skel-table-row:last-child { border-bottom: none; } .skel-table-total { height: 4px; border-top: 0.5px solid #d0d0d0; margin-top: 1px; } .vault-file-invoice-footer { margin-top: auto; display: flex; flex-direction: column; gap: 1.5px; } .vault-file-icon { font-size: 28px; opacity: 0.5; margin-bottom: 4px; display: none; /* Hide old icon */ } .vault-file-content-slot { position: absolute; top: 14px; left: 8px; right: 8px; bottom: 8px; overflow: hidden; z-index: 2; display: flex; flex-direction: column; } .vault-file-preview-text { font-size: 5px; line-height: 1.4; font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; color: #a1a1aa; word-break: break-all; white-space: pre-wrap; text-align: left; } .vault-file-preview-generic { flex: 1; display: flex; align-items: center; justify-content: center; color: rgba(255,255,255,0.7); } .vault-file-preview-img { position: absolute; inset: 0; background-size: cover; background-position: center; opacity: 1; border-radius: 10px; /* Cut at top-right by container */ z-index: 2; } .vault-file-bottom-info { position: absolute; bottom: 0; left: 0; width: 100%; padding: 8px 8px 6px 8px; display: flex; flex-direction: column; z-index: 5; background: linear-gradient(to top, rgba(24,24,27,1) 0%, rgba(24,24,27,0) 100%); border-bottom-left-radius: 10px; border-bottom-right-radius: 10px; } .vault-file-ext-label { font-size: 11px; font-weight: 700; color: #ffffff; line-height: 1.1; margin-bottom: 2px; } .vault-file-name-label { font-size: 8px; color: #a1a1aa; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .vault-file-name { text-align: center; font-size: 12px; font-weight: 500; color: rgba(255,255,255,0.75); margin-top: 8px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; padding: 0 4px; } .vault-file-size { text-align: center; font-size: 10px; color: rgba(255,255,255,0.30); margin-top: 2px; } /* ── Empty State ─────────────────────────── */ .vault-empty { grid-column: 1 / -1; text-align: center; padding: 60px 20px; color: rgba(255,255,255,0.3); } .vault-empty-icon { font-size: 48px; margin-bottom: 16px; opacity: 0.35; } .vault-empty-title { font-size: 18px; font-weight: 500; color: rgba(255,255,255,0.6); margin-bottom: 8px; } .vault-empty-sub { font-size: 14px; } /* ── Skeleton ─────────────────────────── */ .vault-skeleton-item { aspect-ratio: 1.3; border-radius: 16px; background: rgba(255,255,255,0.03); animation: pulse 2s infinite; } /* ── Animations ─────────────────────────── */ /* Item fade-in (staggered via inline --delay) */ @keyframes vaultItemIn { from { opacity: 0; transform: translateY(20px); } to { opacity: 1; transform: translateY(0); } } .vault-item-enter { opacity: 0; animation: vaultItemIn 0.35s cubic-bezier(.22,.68,0,1.1) forwards; animation-delay: var(--delay, 0ms); } /* Fade out for navigation */ .vault-item-exit { transition: opacity 0.2s ease, transform 0.2s ease; opacity: 0 !important; transform: scale(0.95) !important; } /* Long-press: scale-up glow */ .vault-folder-pressing { transform: scale(1.03); } .vault-folder-pressing .vault-folder-front, .vault-folder-detail .vault-folder-front { transform: rotateX(35deg); box-shadow: 0 12px 40px rgba(0,0,0,0.6), inset 0 1px 0 rgba(255,255,255,0.2), 0 0 40px rgba(100,140,255,0.15); } /* Other items fade away during long-press */ .vault-item-hide { transition: opacity 0.3s ease, transform 0.3s ease; opacity: 0 !important; transform: scale(0.85) !important; pointer-events: none; } /* Detail mode: folder flies to position */ .vault-folder-detail { position: fixed !important; z-index: 100; transform: rotate(var(--folder-rot, -12deg)) !important; transform-origin: center center; } /* Detail mode overlay */ .vault-detail-overlay { position: fixed; inset: 0; z-index: 90; background: rgba(0,0,0,0.01); cursor: pointer; } /* Child items flying out from folder */ @keyframes vaultChildFlyOut { from { opacity: 0; transform: translate(var(--start-x, 0), var(--start-y, 0)) scale(0.3) rotate(0deg); } to { opacity: 1; transform: translate(0, 0) scale(1) rotate(var(--rot, 0deg)); } } .vault-child-enter { opacity: 0; animation: vaultChildFlyOut 0.5s cubic-bezier(0.2, 0.8, 0.2, 1) forwards; animation-delay: var(--delay, 0ms); } /* Child items flying back */ .vault-child-exit { transition: opacity 0.3s ease, transform 0.4s cubic-bezier(0.5, 0, 0.2, 1); transition-delay: var(--delay, 0ms); opacity: 0 !important; transform: translate(var(--start-x, 0), var(--start-y, 0)) scale(0.3) rotate(0deg) !important; } /* Items returning after back */ .vault-item-return { opacity: 0; transform: scale(0.85); animation: vaultItemReturn 0.35s cubic-bezier(.22,.68,0,1.1) forwards; animation-delay: var(--delay, 0ms); } @keyframes vaultItemReturn { from { opacity: 0; transform: scale(0.85); } to { opacity: 1; transform: scale(1); } } /* ========================================= Detective Board Cinematic Zoom Out ========================================= */ .detective-zoom-out { transform: scale(0.9) translateY(20px) !important; opacity: 0.5 !important; filter: blur(2px) !important; pointer-events: none !important; } .chat-layout { transition: transform 1.2s cubic-bezier(0.19, 1, 0.22, 1), opacity 1.2s ease, filter 1.2s ease; transform-origin: center top; } /* ── Timeline Layout ─────────────────────────── */ .vault-timeline-group { display: flex; flex-direction: column; margin-bottom: 24px; } .vault-timeline-header { position: relative; padding-left: 24px; margin-bottom: 16px; } .vault-timeline-line, .vault-timeline-line-content { position: absolute; left: 0; width: 2px; background-color: rgba(255, 255, 255, 0.1); } .vault-timeline-line { top: 6px; bottom: -16px; } .vault-timeline-header::before { content: ''; position: absolute; left: -2px; top: 6px; width: 6px; height: 2px; background-color: rgba(255, 255, 255, 0.3); } .vault-timeline-title { font-size: 15px; font-weight: 600; color: rgba(255,255,255,0.9); margin-bottom: 2px; } .vault-timeline-subtitle { font-size: 12px; color: rgba(255,255,255,0.5); } .vault-timeline-content { position: relative; padding-left: 24px; } .vault-timeline-line-content { top: 0; bottom: -24px; } .vault-timeline-group:last-child .vault-timeline-line-content { bottom: 0; } .vault-timeline-items { display: flex; gap: 16px; overflow-x: auto; padding-bottom: 12px; /* Hide scrollbar */ scrollbar-width: none; -ms-overflow-style: none; } .vault-timeline-items::-webkit-scrollbar { display: none; }