Spaces:
Running
Running
Download src/styles/global.css from Luca448/APP-Backend: direct link, hf CLI and curl.
- Browser
- Download file 108 kB
-
https://huggingface.co/spaces/Luca448/APP-Backend/resolve/main/src/styles/global.css
- Command line
-
hf download hf://spaces/Luca448/APP-Backend/src/styles/global.css
-
curl -L -o global.css https://huggingface.co/spaces/Luca448/APP-Backend/resolve/main/src/styles/global.css
108 kB
| * { | |
| 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 ; | |
| width: 0 ; | |
| height: 0 ; | |
| background: transparent ; | |
| } | |
| * { | |
| scrollbar-width: none ; | |
| -ms-overflow-style: none ; | |
| } | |
| /* ========================================= | |
| Fluid Dark Background Animation | |
| ========================================= */ | |
| body[data-bg-style="fluid-dark"] { | |
| background-color: #000000 ; | |
| 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%) ; | |
| background-size: 150% 150% ; | |
| animation: fluid-bg-move 35s ease-in-out infinite alternate ; | |
| } | |
| @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 ; | |
| animation: none ; | |
| } | |
| /* ========================================= | |
| 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 ; | |
| } | |
| .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 ; /* 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) ; | |
| border: 1px solid rgba(255, 255, 255, 0.05) ; | |
| border-top: 1px solid rgba(255, 255, 255, 0.15) ; | |
| box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3), inset 0 0 20px rgba(255, 255, 255, 0.03) ; | |
| border-radius: 32px ; | |
| 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 ; | |
| color: white ; | |
| } | |
| /* ========================================= | |
| 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) ; | |
| color: #fff ; | |
| 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 ; | |
| display: table ; | |
| clear: none; | |
| } | |
| .markdown-body .pdf-img-wrapper.align-right { | |
| float: right; | |
| max-width: 45%; | |
| margin: 6px 0 12px 20px ; | |
| display: table ; | |
| clear: none; | |
| } | |
| .markdown-body .pdf-img-wrapper.align-center { | |
| display: table ; | |
| margin: 16px auto ; | |
| max-width: 100%; | |
| clear: both; | |
| } | |
| .markdown-body .pdf-img-wrapper img { | |
| margin: 0 ; | |
| 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) ; | |
| background: linear-gradient(90deg, rgba(182, 120, 242, 0.1) 0%, transparent 50%) ; | |
| transition: all 0.2s ease; | |
| } | |
| .drop-target-right { | |
| box-shadow: inset -4px 0 0 var(--primary) ; | |
| background: linear-gradient(270deg, rgba(182, 120, 242, 0.1) 0%, transparent 50%) ; | |
| transition: all 0.2s ease; | |
| } | |
| .drop-target-center { | |
| box-shadow: inset 0 4px 0 var(--primary) ; | |
| background: linear-gradient(180deg, rgba(182, 120, 242, 0.1) 0%, transparent 50%) ; | |
| 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) ; | |
| 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) ; | |
| 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) ; | |
| } | |
| /* --- 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 ; /* 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 ; | |
| border-left: 4px solid #007aff; | |
| margin: 20px 0 ; | |
| box-shadow: 0 8px 24px rgba(0,0,0,0.2); | |
| display: block; | |
| } | |
| mjx-container:not([display="true"]) { | |
| font-size: 1.1em ; | |
| 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 ; | |
| 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) ; | |
| font-family: inherit ; | |
| font-size: 11px ; | |
| } | |
| .function-plot-container .domain { | |
| stroke: rgba(255, 255, 255, 0.3) ; | |
| } | |
| .function-plot-container .tick line { | |
| stroke: rgba(255, 255, 255, 0.1) ; | |
| } | |
| .function-plot-container .origin { | |
| stroke: rgba(255, 255, 255, 0.5) ; | |
| stroke-width: 1.5px ; | |
| } | |
| .function-plot-container .grid .tick line { | |
| stroke: rgba(255, 255, 255, 0.05) ; | |
| } | |
| .function-plot-container .tick.integer-tick line { | |
| stroke: rgba(255, 255, 255, 0.35) ; /* Brighter for whole numbers */ | |
| } | |
| .function-plot-container .tip { | |
| fill: #fff ; | |
| } | |
| .function-plot-container .tip line { | |
| stroke: #ffffff ; | |
| stroke-dasharray: 4,4; | |
| } | |
| .function-plot-container .top-right-legend { | |
| display: none ; /* 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 ; | |
| } | |
| .printable-document:not(.dark-mode-doc) .function-plot-container .domain { | |
| stroke: rgba(0, 0, 0, 0.4) ; | |
| } | |
| .printable-document:not(.dark-mode-doc) .function-plot-container .tick line { | |
| stroke: rgba(0, 0, 0, 0.1) ; | |
| } | |
| .printable-document:not(.dark-mode-doc) .function-plot-container .origin { | |
| stroke: rgba(0, 0, 0, 0.6) ; | |
| } | |
| .printable-document:not(.dark-mode-doc) .function-plot-container .grid .tick line { | |
| stroke: rgba(0, 0, 0, 0.05) ; | |
| } | |
| .printable-document:not(.dark-mode-doc) .function-plot-container .tick.integer-tick line { | |
| stroke: rgba(0, 0, 0, 0.25) ; | |
| } | |
| .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 ; | |
| box-shadow: none ; | |
| border: none ; | |
| backdrop-filter: none ; | |
| -webkit-backdrop-filter: none ; | |
| padding: 0 ; | |
| } | |
| /* ========================================= | |
| 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 ; | |
| } | |
| .source-highlight { | |
| background: rgba(137, 207, 240, 0.15) ; | |
| border-left: 4px solid #89CFF0 ; | |
| padding-left: 12px ; | |
| 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 ; | |
| } | |
| /* 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 ; | |
| } | |
| body.pdf-reading-mode .aurora-background { | |
| display: none ; | |
| } | |
| body.pdf-reading-mode::before, | |
| body.pdf-reading-mode::after { | |
| display: none ; | |
| } | |
| body.pdf-reading-mode #chat-messages { | |
| max-width: 800px; | |
| margin: 0 auto; | |
| padding: 40px 24px 120px 24px ; | |
| } | |
| body.pdf-reading-mode .chat-message-wrapper { | |
| max-width: 100%; | |
| align-self: center ; | |
| width: 100%; | |
| } | |
| body.pdf-reading-mode .chat-bubble-user, | |
| body.pdf-reading-mode .chat-bubble-ai { | |
| background: transparent ; | |
| border: none ; | |
| box-shadow: none ; | |
| padding: 0 ; | |
| border-radius: 0 ; | |
| 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 ; | |
| color: #111827 ; | |
| } | |
| 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%) ; | |
| } | |
| #pdf-color-mode-btn { | |
| display: none ; | |
| } | |
| body.pdf-reading-mode #pdf-color-mode-btn { | |
| display: flex ; | |
| } | |
| body.pdf-reading-mode.pdf-light-mode .chat-bubble-user { | |
| color: #111827 ; | |
| } | |
| body.pdf-reading-mode.pdf-light-mode .chat-bubble-ai { | |
| color: #374151 ; | |
| } | |
| body.pdf-reading-mode.pdf-light-mode .markdown-body { | |
| color: #374151 ; | |
| } | |
| 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 ; | |
| } | |
| body.pdf-reading-mode.pdf-light-mode .pdf-top-btn { | |
| background: rgba(0,0,0,0.05) ; | |
| border-color: rgba(0,0,0,0.1) ; | |
| color: #111827 ; | |
| } | |
| body.pdf-reading-mode.pdf-light-mode .di-collapsed { | |
| background: rgba(0,0,0,0.05) ; | |
| border-color: rgba(0,0,0,0.1) ; | |
| color: #111827 ; | |
| } | |
| body.pdf-reading-mode.pdf-light-mode .di-collapsed svg { | |
| color: #111827 ; | |
| } | |
| body.pdf-reading-mode.pdf-light-mode .markdown-body strong, | |
| body.pdf-reading-mode.pdf-light-mode .markdown-body b { | |
| color: #111827 ; | |
| } | |
| body.pdf-reading-mode.pdf-light-mode .markdown-body li::marker { | |
| color: #111827 ; | |
| } | |
| body.pdf-reading-mode.pdf-light-mode .timeline-toggle-btn { | |
| background: rgba(0, 0, 0, 0.05) ; | |
| border-color: rgba(0, 0, 0, 0.1) ; | |
| color: rgba(0, 0, 0, 0.6) ; | |
| } | |
| body.pdf-reading-mode.pdf-light-mode .timeline-toggle-btn:hover { | |
| background: rgba(0, 0, 0, 0.15) ; | |
| color: #111827 ; | |
| } | |
| body.pdf-reading-mode.pdf-light-mode .timeline-marker { | |
| background: rgba(0, 0, 0, 0.2) ; | |
| } | |
| body.pdf-reading-mode.pdf-light-mode .timeline-marker-wrapper:hover .timeline-marker { | |
| background: rgba(0, 0, 0, 0.6) ; | |
| } | |
| body.pdf-reading-mode.pdf-light-mode .timeline-marker-wrapper.active .timeline-marker { | |
| background: rgba(0, 0, 0, 0.9) ; | |
| box-shadow: 0 0 8px rgba(0, 0, 0, 0.2) ; | |
| } | |
| body.pdf-reading-mode.pdf-light-mode .timeline-tooltip { | |
| background: rgba(244, 244, 245, 0.95) ; | |
| color: #111827 ; | |
| border-color: rgba(0, 0, 0, 0.1) ; | |
| box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1) ; | |
| } | |
| /* --- 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 ; | |
| } | |
| /* 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 ; | |
| 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 ; | |
| } | |
| /* 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 ; | |
| opacity: 1 ; | |
| transform: scale(1) ; | |
| 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 ; | |
| -webkit-clip-path: none ; | |
| 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 ; | |
| transform: scale(0.95) ; | |
| } | |
| /* 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 ; | |
| transform: scale(0.85) ; | |
| pointer-events: none; | |
| } | |
| /* Detail mode: folder flies to position */ | |
| .vault-folder-detail { | |
| position: fixed ; | |
| z-index: 100; | |
| transform: rotate(var(--folder-rot, -12deg)) ; | |
| 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 ; | |
| transform: translate(var(--start-x, 0), var(--start-y, 0)) scale(0.3) rotate(0deg) ; | |
| } | |
| /* 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) ; | |
| opacity: 0.5 ; | |
| filter: blur(2px) ; | |
| pointer-events: none ; | |
| } | |
| .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; | |
| } |