Spaces:
Running
Running
| import gradio as gr | |
| import os | |
| # Define the CSS once to avoid duplication (rest of CSS remains the same) | |
| CSS_STYLES = """ | |
| .gradio-container footer { display: none !important; } | |
| .logo-container{ display: inline-flex; justify-content: center; align-items: center; column-gap: 12px;} | |
| .logo-container .cyphertech { max-width:8rem; width:100%; height: auto; object-fit: contain; } | |
| .logo-container .seperator:after{ font-size: 3.5em; content: "|"; color: #fff; font-weight: 500; font-family: auto; } | |
| .logo-container .askcyph { max-width: 13rem; width:100%; height: auto; object-fit: contain; } | |
| /* Fix for keeping focus on input */ | |
| .chat-interface textarea { | |
| caret-color: auto !important; | |
| } | |
| /* Loader Styles */ | |
| #page-loader { | |
| position: fixed; | |
| top: 0; | |
| left: 0; | |
| width: 100%; | |
| height: 100%; | |
| background: linear-gradient(135deg, #001a2d 0%, #002a4d 100%); | |
| z-index: 3147483647; | |
| display: flex; | |
| justify-content: center; | |
| align-items: center; | |
| transition: opacity 0.5s ease-out; | |
| } | |
| #page-loader.hide { | |
| opacity: 0 !important; | |
| pointer-events: none !important; | |
| } | |
| #page-loader.remove { | |
| display: none !important; | |
| } | |
| .loader-content { | |
| text-align: center; | |
| } | |
| .loader-logo { | |
| width: 100%; | |
| height: auto; | |
| max-width: 275px; | |
| object-fit: contain; | |
| opacity: 0; | |
| animation: fadeInLogo 1s ease-in-out forwards; | |
| object-fit: contain; | |
| } | |
| .spinner-container { | |
| margin-top: 30px; | |
| position: relative; | |
| width: 80px; | |
| height: 80px; | |
| margin-left: auto; | |
| margin-right: auto; | |
| } | |
| .spinner { | |
| width: 80px; | |
| height: 80px; | |
| border: 4px solid rgba(255, 255, 255, 0.1); | |
| border-top-color: #0071bb; | |
| border-radius: 50%; | |
| animation: spin 1s linear infinite; | |
| } | |
| .spinner-inner { | |
| position: absolute; | |
| top: 10px; | |
| left: 10px; | |
| width: 60px; | |
| height: 60px; | |
| border: 3px solid transparent; | |
| border-top-color: #00a8ff; | |
| border-radius: 50%; | |
| animation: spin 0.7s linear infinite reverse; | |
| } | |
| .loading-text { | |
| margin-top: 20px; | |
| color: #fff; | |
| font-size: 18px; | |
| font-weight: 300; | |
| opacity: 0; | |
| animation: fadeInText 1s ease-in-out 0.5s forwards; | |
| } | |
| .loading-dots { | |
| display: inline-block; | |
| width: 20px; | |
| text-align: left; | |
| } | |
| .loading-dots::after { | |
| content: '.'; | |
| animation: dots 1.5s steps(4, end) infinite; | |
| } | |
| @keyframes spin { | |
| 0% { transform: rotate(0deg); } | |
| 100% { transform: rotate(360deg); } | |
| } | |
| @keyframes fadeInLogo { | |
| 0% { | |
| opacity: 0; | |
| transform: translateY(-20px); | |
| } | |
| 100% { | |
| opacity: 1; | |
| transform: translateY(0); | |
| } | |
| } | |
| @keyframes fadeInText { | |
| 0% { opacity: 0; } | |
| 100% { opacity: 1; } | |
| } | |
| @keyframes dots { | |
| 0%, 20% { content: '.'; } | |
| 40% { content: '..'; } | |
| 60% { content: '...'; } | |
| 80%, 100% { content: ''; } | |
| } | |
| .progress-bar { | |
| width: 200px; | |
| height: 4px; | |
| background: rgba(255, 255, 255, 0.1); | |
| border-radius: 2px; | |
| margin: 20px auto; | |
| overflow: hidden; | |
| opacity: 0; | |
| animation: fadeInText 1s ease-in-out 0.8s forwards; | |
| } | |
| .progress-fill { | |
| height: 100%; | |
| background: linear-gradient(90deg, #0071bb 0%, #00a8ff 100%); | |
| border-radius: 2px; | |
| width: 0%; | |
| animation: progressAnimation 4.5s ease-out forwards; | |
| } | |
| @keyframes progressAnimation { | |
| 0% { width: 0%; } | |
| 20% { width: 25%; } | |
| 40% { width: 45%; } | |
| 60% { width: 65%; } | |
| 80% { width: 85%; } | |
| 100% { width: 100%; } | |
| } | |
| #welcome-banner-overlay { | |
| display: none; | |
| position: fixed; | |
| top: 0; | |
| left: 0; | |
| width: 100%; | |
| height: 100%; | |
| background-color: rgba(0,0,0,0.5); | |
| z-index: 1999; | |
| } | |
| #welcome-banner-text { | |
| display: none; | |
| position: fixed; | |
| top: 50%; | |
| left: 50%; | |
| transform: translate(-50%, -50%); | |
| max-width: 800px; | |
| width: 80%; | |
| height: 73vh; | |
| z-index: 2000; | |
| background-color: rgba(0,113,187,0.6); | |
| box-shadow: 0 10px 25px rgba(0,0,0,0.2); | |
| border-radius: 8px; | |
| border-left: 4px solid #0071bb; | |
| flex-direction: column; | |
| padding: 15px; | |
| } | |
| #welcome-banner-header { | |
| padding-bottom: 10px; | |
| border-bottom: 1px solid rgba(255,255,255,0.2); | |
| } | |
| #welcome-banner-content { | |
| overflow-y: auto; | |
| padding: 0 15px; | |
| flex-grow: 1; | |
| max-height: calc(70vh - 100px); | |
| } | |
| #welcome-banner-footer { | |
| padding-top: 10px; | |
| margin-top: 10px; | |
| border-top: 1px solid rgba(255,255,255,0.2); | |
| text-align: right; | |
| } | |
| #ok-banner { | |
| padding: 8px 20px; | |
| background-color: transparent; | |
| color: white; | |
| border: 1px solid white; | |
| border-radius: 4px; | |
| cursor: pointer; | |
| font-weight: bold; | |
| transition: all 0.2s ease; | |
| } | |
| #ok-banner:hover { | |
| background-color: rgba(255,255,255,0.1); | |
| } | |
| #close-banner { | |
| position: absolute; | |
| top: 10px; | |
| right: 10px; | |
| cursor: pointer; | |
| font-weight: bold; | |
| font-size: 20px; | |
| color: #666; | |
| z-index: 10; | |
| width: 30px; | |
| height: 30px; | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| border-radius: 50%; | |
| background-color: #f0f0f0; | |
| transition: all 0.2s ease; | |
| } | |
| #close-banner:hover { | |
| background-color: #ddd; | |
| color: #333; | |
| } | |
| /* Help button styling */ | |
| .help-button-container { | |
| position: fixed; | |
| bottom: 50px; | |
| left: 20px; | |
| z-index: 1000; | |
| } | |
| .help-button { | |
| background-color: #0071bb !important; | |
| color: white !important; | |
| border: none; | |
| border-radius: 50%; | |
| width: 50px; | |
| height: 50px; | |
| font-size: 24px !important; | |
| cursor: pointer; | |
| box-shadow: 0 4px 8px rgba(0,0,0,0.2) !important; | |
| display: flex !important; | |
| align-items: center !important; | |
| justify-content: center !important; | |
| transition: all 0.3s ease; | |
| } | |
| .help-button:hover { | |
| background-color: #005a94; | |
| transform: scale(1.05); | |
| box-shadow: 0 6px 12px rgba(0,0,0,0.3); | |
| } | |
| .footer{ width:100%; margin: 10px 0; background-color: initial; color: #fff; text-align: center; font-size: 1rem; font-style=bold; } | |
| .footer a{ color: #fff !important } | |
| .footer { | |
| text-align: center; | |
| padding: 3rem 0 2rem; | |
| margin-top: 4rem; | |
| border-top: 1px solid #2a2a2a; | |
| color: #a0a0a0; | |
| } | |
| .footer a { | |
| color: #a0a0a0 !important; | |
| text-decoration: none; | |
| } | |
| .footer a:hover { | |
| color: #ffffff !important; | |
| } | |
| /* Change orange button and slider color to #0071bb */ | |
| .primary-button { background-color: #0071bb !important; } | |
| button.primary { background-color: #0071bb !important; } | |
| .gradio-button.primary { background-color: #0071bb !important; } | |
| /* Improved slider styling */ | |
| .slider_input_container { | |
| --slider-color: #0071bb !important; | |
| } | |
| /* Target all slider thumbs */ | |
| input[type=range]::-webkit-slider-thumb { | |
| background: #0071bb !important; | |
| border-color: #0071bb !important; | |
| } | |
| input[type=range]::-moz-range-thumb { | |
| background: #0071bb !important; | |
| border-color: #0071bb !important; | |
| } | |
| input[type=range]::-ms-thumb { | |
| background: #0071bb !important; | |
| border-color: #0071bb !important; | |
| } | |
| /* Fix for slider track fill */ | |
| .gradio-slider .svelte-1cl284s { | |
| background-color: #0071bb !important; | |
| } | |
| /* Target Gradio's slider elements more specifically */ | |
| .gradio-slider [data-testid="slider-handle"] { | |
| background-color: #0071bb !important; | |
| } | |
| .gradio-slider [data-testid="slider-track-filled"], | |
| .gradio-slider .track-fill, | |
| .gradio-slider .track-progress { | |
| background-color: #0071bb !important; | |
| } | |
| /* Target the slider track */ | |
| .gradio-slider [data-testid="slider-track"] { | |
| background-color: #ddd !important; | |
| } | |
| /* Target any element with slider-related class names */ | |
| div[class*="slider"] div[class*="filled"], | |
| div[class*="slider"] div[class*="progress"], | |
| div[class*="slider"] div[class*="track-fill"], | |
| div[class*="slider"] div[class*="track-progress"] { | |
| background-color: #0071bb !important; | |
| } | |
| /* Change focus outline color */ | |
| *:focus-visible { outline-color: #0071bb !important; } | |
| /* Change checkbox and radio button colors */ | |
| input[type="checkbox"]:checked, input[type="radio"]:checked { | |
| background-color: #0071bb !important; | |
| border-color: #0071bb !important; | |
| } | |
| /* Change progress bar color */ | |
| progress::-webkit-progress-value { background-color: #0071bb !important; } | |
| progress::-moz-progress-bar { background-color: #0071bb !important; } | |
| progress { color: #0071bb !important; } | |
| /* Change link color */ | |
| a { color: #0071bb !important; } | |
| /* Change selection color */ | |
| ::selection { background-color: #0071bb33 !important; } | |
| @media(max-width: 500px){ | |
| #welcome-banner-text { | |
| max-width: 90%; | |
| } | |
| } | |
| #huggingface-space-header{ | |
| display: none !important; | |
| } | |
| /* Scrollbar styling for welcome dialog */ | |
| #welcome-banner-text > div:nth-child(2)::-webkit-scrollbar { | |
| width: 8px; | |
| } | |
| #welcome-banner-text > div:nth-child(2)::-webkit-scrollbar-track { | |
| background: rgba(255,255,255,0.1); | |
| border-radius: 4px; | |
| } | |
| #welcome-banner-text > div:nth-child(2)::-webkit-scrollbar-thumb { | |
| background: rgba(255,255,255,0.3); | |
| border-radius: 4px; | |
| } | |
| #welcome-banner-text > div:nth-child(2)::-webkit-scrollbar-thumb:hover { | |
| background: rgba(255,255,255,0.5); | |
| } | |
| """ | |
| custom_theme = gr.themes.Default( | |
| primary_hue="blue", # This changes the primary color to blue | |
| secondary_hue="blue", | |
| neutral_hue="slate", | |
| ).set( | |
| loader_color="#0071bb", # Your specific blue color for loader | |
| button_primary_background_fill="#0071bb", | |
| button_primary_background_fill_hover="#005a94", | |
| button_primary_text_color="white", | |
| slider_color="#0071bb", | |
| checkbox_background_color_selected="#0071bb", | |
| checkbox_border_color_selected="#0071bb", | |
| ) | |
| token = os.environ["TOKEN"] | |
| model=os.environ["MODEL"] | |
| loaded_demo = gr.load(model, src="spaces", token=token) | |
| with gr.Blocks(fill_height=True,css=CSS_STYLES,theme=custom_theme,js=""" | |
| () => { | |
| document.title ='AskCyph™ Chat - Cypher Tech Inc.'; | |
| const link = document.querySelector("link[rel~='icon']") || document.createElement('link'); | |
| link.type = 'image/svg+xml'; | |
| link.rel = 'icon'; | |
| link.href = 'https://cms.cypherchat.app/uploads/favicon_8bc904ca6b.svg'; | |
| document.getElementsByTagName('head')[0].appendChild(link); | |
| } | |
| """,) as demo: | |
| loaded_demo.render() | |
| demo.launch(show_api=False, show_error=False, quiet=True, debug=False) |