/* ============================================================================== 1. DESIGN TOKENS (CSS VARIABLES) ============================================================================== */ :root { --bg-page: #221f1f; --bg-card: #2d2929; --bg-surface: #1e1b1b; --bg-surface-hover: #242020; --bg-button: #383333; --bg-button-hover: #443e3e; --gold: #dba70e; --gold-hover: #e8b625; --gold-border: rgba(219, 167, 14, 0.4); --gold-border-subtle: rgba(219, 167, 14, 0.25); --gold-glow: rgba(219, 167, 14, 0.3); --text-primary: #ffffff; --text-body: #f5f5f5; --text-muted: #cfc8c8; } /* ============================================================================== 2. GLOBAL LAYOUT & BASE STYLES ============================================================================== */ html { background-color: var(--bg-page) !important; color: var(--text-body) !important; min-height: 100vh !important; overflow-y: scroll !important; /* Always displays the vertical scrollbar on the right */ scrollbar-gutter: stable; scrollbar-width: thin !important; scrollbar-color: #554e4e #1a1717 !important; } body { background-color: var(--bg-page) !important; color: var(--text-body) !important; min-height: 100vh !important; margin: 0 !important; padding: 0 !important; overflow-x: hidden !important; } gradio-app { background-color: var(--bg-page) !important; color: var(--text-body) !important; min-height: 100vh !important; } /* Custom Visible Scrollbar for Webkit/Blink (Chrome, Edge, Safari, Opera, Brave) */ ::-webkit-scrollbar { width: 12px !important; height: 12px !important; } ::-webkit-scrollbar-track { background: #1a1717 !important; border-left: 1px solid rgba(219, 167, 14, 0.25) !important; } ::-webkit-scrollbar-thumb { background: #443e3e !important; border-radius: 6px !important; border: 2px solid #1a1717 !important; } ::-webkit-scrollbar-thumb:hover { background: var(--gold) !important; } #main-layout { max-width: 820px !important; margin: 12px auto 24px auto !important; gap: 12px !important; } h1 { text-align: center; color: var(--gold) !important; font-weight: 800 !important; letter-spacing: 0.5px; font-size: clamp(22px, 3vh, 30px) !important; margin: 6px 0 2px 0 !important; white-space: nowrap !important; } h2 { text-align: center; color: var(--text-body) !important; font-weight: 400 !important; font-size: 13.5px !important; opacity: 0.85; margin: 0 !important; } /* ============================================================================== 3. MODULAR UI CARDS & HEADER CONTROLS ============================================================================== */ .ui-card { background-color: var(--bg-card) !important; border: 1px solid var(--gold-border) !important; border-radius: 10px !important; padding: 16px 20px !important; box-shadow: 0 4px 14px rgba(0, 0, 0, 0.45) !important; } h3, .card-title { color: var(--gold) !important; font-size: 16px !important; font-weight: 700 !important; letter-spacing: 0.8px !important; margin: 0 !important; } .card-header-row { display: flex !important; flex-direction: row !important; flex-wrap: nowrap !important; justify-content: space-between !important; align-items: center !important; width: 100% !important; margin-bottom: 12px !important; } .record-btn-col { flex: 0 0 auto !important; width: auto !important; min-width: 0 !important; margin: 0 0 0 auto !important; display: flex !important; align-items: center !important; justify-content: flex-end !important; } .record-yourself-btn { background: var(--bg-button) !important; border: 1px solid var(--gold-border) !important; color: var(--text-body) !important; font-size: 12.5px !important; font-weight: 700 !important; letter-spacing: 0.6px !important; border-radius: 6px !important; height: 32px !important; padding: 0 14px !important; white-space: nowrap !important; display: inline-flex !important; align-items: center !important; justify-content: center !important; width: auto !important; cursor: pointer !important; transition: all 0.2s ease !important; box-shadow: 0 2px 6px rgba(0, 0, 0, 0.35) !important; } .record-yourself-btn:hover { background: var(--bg-button-hover) !important; border-color: var(--gold) !important; color: var(--text-primary) !important; transform: translateY(-1px) !important; box-shadow: 0 4px 12px var(--gold-glow) !important; } /* ============================================================================== 4. PRIMARY ACTION BUTTONS ============================================================================== */ .translate-btn, .modal-done-btn, button.primary { background: linear-gradient(135deg, var(--gold) 0%, #be9007 100%) !important; color: #221f1f !important; font-weight: 800 !important; font-size: 18px !important; letter-spacing: 0.5px !important; border: none !important; border-radius: 8px !important; height: 48px !important; width: 100% !important; box-shadow: 0 3px 12px var(--gold-glow) !important; transition: all 0.2s ease !important; margin: 6px 0 !important; cursor: pointer !important; } .translate-btn:hover, .modal-done-btn:hover, button.primary:hover { background: linear-gradient(135deg, var(--gold-hover) 0%, var(--gold) 100%) !important; transform: translateY(-1px) !important; box-shadow: 0 5px 18px rgba(219, 167, 14, 0.45) !important; } /* ============================================================================== 5. EXAMPLES SECTION ============================================================================== */ .examples-row { margin-top: 0; } .examples-row-second { margin-top: 14px !important; } .examples-row, .examples-row *, .examples-row video, .examples-row .wrap, .examples-row .mirror-wrap, .examples-row .mirror { transform: none !important; } .examples-row > div { min-width: 0 !important; gap: 6px !important; } .example-title { color: var(--gold) !important; font-size: 18px !important; font-weight: 700 !important; text-align: center !important; margin: 0 0 0 0 !important; text-transform: uppercase !important; letter-spacing: 1px !important; text-shadow: 0 0 2px var(--gold) !important; } .examples-row .gradio-html, .examples-row .html-container { min-height: auto !important; padding: 0 !important; margin: 0 !important; } .example-btn { background: var(--bg-button) !important; color: var(--text-body) !important; border: 1px solid rgba(219, 167, 14, 0.35) !important; border-radius: 6px !important; font-weight: 600 !important; font-size: 13px !important; margin-top: 8px !important; padding: 7px 10px !important; width: 100% !important; transition: all 0.2s ease !important; cursor: pointer !important; } .example-btn:hover { background: var(--gold) !important; color: #221f1f !important; border-color: var(--gold) !important; transform: translateY(-1px) !important; } /* ============================================================================== 6. TRANSLATION GRADIO OVERRIDES ============================================================================== */ #translation-card .block, #translation-card .gradio-html, #translation-card .html-container, #translation-display { background: transparent !important; border: none !important; box-shadow: none !important; padding: 0 !important; margin: 0 !important; width: 100% !important; } #translation-card .wrap, #translation-card [data-testid="loading-status"], #translation-card .eta-bar, #translation-card .progress-level { display: none !important; } /* Dedicated Gray Container for Translation */ .translation-content-box { display: flex !important; flex-direction: column !important; align-items: center !important; justify-content: center !important; min-height: 90px !important; padding: 16px 20px !important; background: radial-gradient(circle at center, #353030 0%, #242020 100%) !important; border-radius: 8px !important; border: 1px solid var(--gold-border-subtle) !important; box-shadow: inset 0 1px 4px rgba(0, 0, 0, 0.4) !important; width: 100% !important; box-sizing: border-box !important; } /* Clean White Centered Translation Text */ .translation-text { color: var(--text-primary) !important; font-size: clamp(24px, 3.5vh, 32px) !important; font-weight: 800 !important; letter-spacing: 1.5px !important; text-transform: uppercase !important; text-align: center !important; line-height: 1.2 !important; margin: 0 !important; width: 100% !important; } /* Loading Spinner Container & Keyframes */ .loading-container { display: flex !important; flex-direction: column !important; align-items: center !important; justify-content: center !important; padding: 8px 0 !important; } .pulse-spinner { width: 32px !important; height: 32px !important; border: 3px solid rgba(219, 167, 14, 0.2) !important; border-top: 3px solid var(--gold) !important; border-right: 3px solid var(--text-primary) !important; border-radius: 50% !important; animation: spinRing 0.9s cubic-bezier(0.55, 0.15, 0.45, 0.85) infinite !important; box-shadow: 0 0 12px var(--gold-glow) !important; } @keyframes spinRing { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } } /* ============================================================================== 7. VIDEO UPLOAD DROPZONE & ACTIVE VIDEO ROW ============================================================================== */ .compact-dropzone { background-color: var(--bg-surface) !important; border: 2px dashed var(--gold-border) !important; border-radius: 10px !important; padding: 20px 24px !important; min-height: 155px !important; max-height: 50vh; transition: all 0.2s ease !important; overflow: hidden !important; display: flex !important; align-items: center !important; justify-content: center !important; position: relative !important; } .compact-dropzone:hover { border-color: var(--gold) !important; background-color: var(--bg-surface-hover) !important; } /* Hide native file input element */ .compact-dropzone input[type="file"], .compact-dropzone [data-testid="file-upload"], input[type="file"] { display: none !important; visibility: hidden !important; opacity: 0 !important; position: absolute !important; pointer-events: none !important; } .compact-dropzone .upload-container, .compact-dropzone > div:not([data-testid="file-upload"]) { min-height: 130px !important; padding: 12px 18px !important; display: flex !important; align-items: center !important; justify-content: center !important; width: 100% !important; } .compact-dropzone button { padding: 10px 22px !important; font-size: 14px !important; font-weight: 700 !important; } /* Active Video Info Row (Video Name on Left, Action Buttons Aligned Right, strictly single line) */ .video-info-row { background: var(--bg-surface) !important; border: 1.5px solid var(--gold-border) !important; border-radius: 10px !important; padding: 10px 16px !important; min-height: 58px !important; display: flex !important; flex-direction: row !important; flex-wrap: nowrap !important; align-items: center !important; justify-content: space-between !important; gap: 12px !important; width: 100% !important; box-sizing: border-box !important; } .video-info-row > .video-name-col, .video-info-row > .prose, .video-info-row > div:first-child { flex: 1 1 auto !important; min-width: 0 !important; width: auto !important; margin: 0 !important; display: flex !important; align-items: center !important; } .video-info-row > .video-name-col p, .video-info-row > .prose p { margin: 0 !important; padding: 0 !important; display: flex !important; align-items: center !important; white-space: nowrap !important; } .video-name-badge { color: var(--text-body) !important; font-size: 15px !important; font-weight: 600 !important; overflow: hidden !important; text-overflow: ellipsis !important; white-space: nowrap !important; display: flex !important; align-items: center !important; } /* Action buttons in Video Info Row */ .video-info-row > button, .preview-modal-btn, .change-vid-btn { border-radius: 8px !important; height: 40px !important; padding: 0 16px !important; font-size: 13.5px !important; font-weight: 700 !important; cursor: pointer !important; transition: all 0.2s ease !important; display: inline-flex !important; align-items: center !important; justify-content: center !important; white-space: nowrap !important; box-shadow: 0 2px 8px rgba(0, 0, 0, 0.35) !important; flex: 0 0 auto !important; width: auto !important; } .preview-modal-btn { background: #332f2f !important; color: var(--text-body) !important; border: 1px solid var(--gold) !important; margin: 0 0 0 auto !important; } .preview-modal-btn:hover { background: #3f3939 !important; border-color: var(--gold-hover) !important; transform: translateY(-1px) !important; box-shadow: 0 4px 12px var(--gold-glow) !important; } .change-vid-btn { background: #2a2525 !important; border: 1px solid var(--gold-border) !important; color: var(--gold) !important; margin: 0 !important; } .change-vid-btn:hover { background: rgba(219, 167, 14, 0.18) !important; border-color: var(--gold) !important; color: var(--text-primary) !important; transform: translateY(-1px) !important; } /* ============================================================================== 8. INFORMATION CARD & ADVANCED DEMO LINK ============================================================================== */ .info-content { display: flex !important; align-items: center !important; justify-content: space-between !important; gap: 20px !important; } .info-text { color: var(--text-muted) !important; font-size: 12.5px !important; line-height: 1.55 !important; margin: 0 !important; flex: 1 1 auto !important; } .info-markdown { color: var(--text-muted) !important; font-size: 13.5px !important; line-height: 1.65 !important; margin-top: 6px !important; } .info-markdown h1 { color: var(--gold) !important; font-size: 18px !important; font-weight: 700 !important; text-align: left !important; white-space: normal !important; margin: 8px 0 10px 0 !important; letter-spacing: 0.5px !important; } .info-markdown h2 { color: var(--gold) !important; font-size: 15px !important; font-weight: 700 !important; text-align: left !important; opacity: 1 !important; margin: 18px 0 8px 0 !important; letter-spacing: 0.4px !important; border-bottom: 1px solid rgba(219, 167, 14, 0.2) !important; padding-bottom: 4px !important; } .info-markdown h3 { color: #f0eae4 !important; font-size: 14px !important; font-weight: 600 !important; text-align: left !important; margin: 12px 0 4px 0 !important; } .info-markdown p { color: var(--text-muted) !important; font-size: 13.5px !important; line-height: 1.65 !important; margin: 0 0 10px 0 !important; } .info-markdown strong { color: var(--text-primary) !important; font-weight: 600 !important; } .info-markdown a { color: var(--gold) !important; text-decoration: underline !important; text-underline-offset: 3px !important; transition: color 0.15s ease !important; } .info-markdown a:hover { color: var(--gold-hover) !important; text-decoration: underline !important; } .info-markdown ul, .info-markdown ol { margin: 6px 0 12px 22px !important; padding-left: 0 !important; color: var(--text-muted) !important; } .info-markdown li { margin-bottom: 5px !important; line-height: 1.55 !important; color: var(--text-muted) !important; } .info-markdown blockquote { border-left: 3px solid var(--gold) !important; background: rgba(219, 167, 14, 0.08) !important; padding: 10px 14px !important; margin: 12px 0 !important; border-radius: 0 6px 6px 0 !important; color: #ded7d7 !important; } .info-markdown blockquote p { margin: 0 !important; color: #ded7d7 !important; } .advanced-demo-link { display: inline-flex !important; flex-direction: column !important; align-items: center !important; justify-content: center !important; text-align: center !important; background: rgba(219, 167, 14, 0.14) !important; color: var(--gold) !important; border: 1.5px solid var(--gold) !important; border-radius: 10px !important; padding: 10px 18px !important; gap: 2px !important; text-decoration: none !important; white-space: nowrap !important; transition: all 0.2s ease !important; flex-shrink: 0 !important; box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3) !important; cursor: pointer !important; } .advanced-demo-link:hover { background: var(--gold) !important; color: #221f1f !important; transform: translateY(-1px) !important; box-shadow: 0 4px 14px rgba(219, 167, 14, 0.35) !important; } .advanced-demo-link .adv-line { display: block !important; line-height: 1.25 !important; text-transform: uppercase !important; } .advanced-demo-link .adv-line-1 { font-size: 13px !important; font-weight: 800 !important; letter-spacing: 1.2px !important; } .advanced-demo-link .adv-line-2 { font-size: 11.5px !important; font-weight: 700 !important; letter-spacing: 1px !important; opacity: 0.95 !important; } .advanced-demo-link .adv-line-3 { font-size: 14px !important; font-weight: 800 !important; letter-spacing: 1.2px !important; margin-top: 1px !important; } /* ============================================================================== 9. FULLSCREEN MODAL (WEBCAM RECORDING & TRIMMING) ============================================================================== */ .modal-overlay { position: fixed !important; top: 0 !important; left: 0 !important; right: 0 !important; bottom: 0 !important; width: 100vw !important; height: 100vh !important; background: rgba(0, 0, 0, 0.85) !important; backdrop-filter: blur(10px) !important; -webkit-backdrop-filter: blur(10px) !important; z-index: 99999 !important; display: flex !important; align-items: center !important; justify-content: center !important; padding: 20px !important; box-sizing: border-box !important; } .modal-dialog-card { background-color: #262222 !important; border: 1.5px solid var(--gold) !important; border-radius: 16px !important; max-width: 680px !important; width: 95% !important; max-height: 90vh !important; overflow-y: auto !important; padding: 20px 24px !important; box-shadow: 0 20px 50px rgba(0, 0, 0, 0.95) !important; box-sizing: border-box !important; display: flex !important; flex-direction: column !important; gap: 14px !important; animation: modalScaleIn 0.22s cubic-bezier(0.16, 1, 0.3, 1) !important; } @keyframes modalScaleIn { 0% { opacity: 0; transform: scale(0.92); } 100% { opacity: 1; transform: scale(1); } } .modal-header-row { display: flex !important; justify-content: space-between !important; align-items: center !important; width: 100% !important; border-bottom: 1px solid rgba(219, 167, 14, 0.3) !important; padding-bottom: 10px !important; } .modal-title { color: #ffffff !important; font-size: 18px !important; font-weight: 700 !important; margin: 0 !important; } .modal-close-col { flex: 0 0 auto !important; min-width: 36px !important; margin-left: auto !important; display: flex !important; align-items: center !important; justify-content: flex-end !important; } .modal-close-icon { background: transparent !important; border: none !important; color: var(--gold) !important; font-size: 24px !important; font-weight: bold !important; cursor: pointer !important; width: 36px !important; height: 36px !important; padding: 0 !important; display: flex !important; align-items: center !important; justify-content: center !important; border-radius: 6px !important; transition: all 0.2s ease !important; } .modal-close-icon:hover { color: var(--text-primary) !important; background-color: var(--gold-border-subtle) !important; transform: scale(1.1) !important; } .modal-video-player { width: 100% !important; display: flex !important; flex-direction: column !important; margin: 0 !important; border-radius: 8px !important; } .modal-video-player video { max-height: 38vh !important; width: 100% !important; object-fit: contain !important; border-radius: 8px !important; } /* Normal video playback: strictly no flip across all video players */ video, .modal-video-player video { transform: none !important; } /* Mirror ONLY the live webcam stream during recording */ .modal-video-player [data-testid="webcam"] video, .modal-video-player .record video, .modal-video-player video:not([src]) { transform: scaleX(-1) !important; } .modal-footer-col, .modal-footer-row { width: 100% !important; margin-top: 14px !important; display: flex !important; flex-direction: column !important; gap: 10px !important; align-items: stretch !important; } .modal-footer-col button, .modal-footer-row button, .modal-done-btn { width: 100% !important; box-sizing: border-box !important; } /* Subtle discreet restart session button in bottom-right */ .restart-row { margin-top: 18px !important; display: flex !important; justify-content: flex-end !important; width: 100% !important; } .restart-btn { background: transparent !important; color: #736b6b !important; border: 1px solid #3d3737 !important; border-radius: 6px !important; font-size: 12px !important; font-weight: 500 !important; padding: 4px 12px !important; height: 30px !important; cursor: pointer !important; transition: all 0.2s ease !important; opacity: 0.75 !important; } .restart-btn:hover { color: #ded7d7 !important; border-color: #696262 !important; background: rgba(255, 255, 255, 0.05) !important; opacity: 1 !important; } /* ============================================================================== 10. SCROLLABLE HEADER WITH GOLD BADGES & RESPONSIVE DESIGN ============================================================================== */ .app-header-html, .app-header-html.block, .app-header-html .html-container { background: transparent !important; border: none !important; box-shadow: none !important; padding: 0 !important; margin: 0 !important; width: 100% !important; min-height: auto !important; } .app-header-container { display: flex !important; flex-direction: row !important; align-items: center !important; justify-content: space-between !important; width: 100% !important; margin: 6px 0 4px 0 !important; gap: 16px !important; box-sizing: border-box !important; } .header-titles { flex: 1 1 auto !important; text-align: center !important; min-width: 0 !important; display: flex !important; flex-direction: column !important; align-items: center !important; justify-content: center !important; } .app-title { text-align: center !important; color: var(--gold) !important; font-weight: 800 !important; letter-spacing: 0.5px !important; font-size: clamp(19px, 2.4vw, 27px) !important; margin: 0 0 3px 0 !important; line-height: 1.2 !important; white-space: normal !important; } .app-subtitle { text-align: center !important; color: var(--text-body) !important; font-weight: 400 !important; font-size: 13.5px !important; opacity: 0.85 !important; margin: 0 !important; line-height: 1.3 !important; } /* Gold Box Badges Aligned to the Content Left & Right */ .header-badge { flex: 0 0 180px !important; width: 180px !important; max-width: 180px !important; height: 80px !important; max-height: 80px !important; box-sizing: border-box !important; background-color: var(--bg-page) !important; border: 1.5px solid var(--gold) !important; border-radius: 9px !important; padding: 0px !important; box-shadow: 0 3px 12px rgba(0, 0, 0, 0.4), 0 0 8px rgba(212, 175, 55, 0.3) !important; display: inline-flex !important; align-items: center !important; justify-content: center !important; transition: transform 0.2s ease, box-shadow 0.2s ease, border-color 0.2s ease !important; overflow: hidden !important; } .header-badge:hover { transform: translateY(-2px) !important; border-color: var(--gold-hover) !important; box-shadow: 0 6px 18px rgba(0, 0, 0, 0.45), 0 0 14px var(--gold-glow) !important; } .header-badge a { display: flex !important; align-items: center !important; justify-content: center !important; width: 100% !important; height: 100% !important; text-decoration: none !important; line-height: 0 !important; } .header-badge-img { max-height: 80px !important; max-width: 180px !important; width: auto !important; height: auto !important; display: block !important; object-fit: contain !important; margin: auto !important; padding: 15px 15px !important; } @media (max-width: 650px) { .app-header-container { flex-wrap: wrap !important; justify-content: center !important; gap: 10px !important; } .header-titles { order: 1 !important; width: 100% !important; margin-bottom: 4px !important; } .header-badge-left { order: 2 !important; } .header-badge-right { order: 3 !important; } .examples-row { flex-direction: column !important; } .examples-row > div { width: 100% !important; } } /* ============================================================================== 11. SHOW KEYPOINTS BUTTON & MODAL ============================================================================== */ .show-keypoints-btn { background: linear-gradient(135deg, #383333 0%, #2a2626 100%) !important; border: 1.5px solid var(--gold) !important; color: var(--gold) !important; font-weight: 800 !important; font-size: 18px !important; letter-spacing: 0.5px !important; border-radius: 8px !important; height: 48px !important; width: 100% !important; box-shadow: 0 3px 12px rgba(0, 0, 0, 0.4), 0 0 10px var(--gold-border-subtle) !important; transition: all 0.2s ease !important; margin: 14px 0 0 0 !important; cursor: pointer !important; display: flex !important; align-items: center !important; justify-content: center !important; } .show-keypoints-btn:hover { background: var(--gold) !important; color: #1e1b1b !important; transform: translateY(-1px) !important; box-shadow: 0 5px 18px var(--gold-glow) !important; } .keypoints-video-player video { max-height: 52vh !important; width: 100% !important; object-fit: contain !important; border-radius: 8px !important; }