|
|
""" |
|
|
Configuration Settings Module |
|
|
|
|
|
This module contains configuration settings and constants |
|
|
for the drug discovery application. |
|
|
""" |
|
|
|
|
|
|
|
|
DRUG_SMILES = [ |
|
|
"CC1=CC=C(C=C1)C(C)NC(=O)C2=CC=C(C=C2)Cl", |
|
|
"CC1=CC=C(C=C1)C(C)NC(=O)C2=CC=C(C=C2)F", |
|
|
"CC1=CC=C(C=C1)C(C)NC(=O)C2=CC=C(C=C2)Br", |
|
|
"CC1=CC=C(C=C1)C(C)NC(=O)C2=CC=C(C=C2)I", |
|
|
"CC1=CC=C(C=C1)C(C)NC(=O)C2=CC=C(C=C2)[N+](=O)[O-]", |
|
|
] |
|
|
|
|
|
|
|
|
COMMON_SMILES = [ |
|
|
"C[C@H](N)C(=O)O", |
|
|
"CC(=O)OC1=CC=CC=C1C(=O)O", |
|
|
"CCN(CC)CC", |
|
|
"c1ccccc1O", |
|
|
"CC(C)CC(=O)O", |
|
|
"CN1C=NC2=C1N=CN2", |
|
|
"O=C(O)C1=CC=CC=C1", |
|
|
"C1CCCCC1", |
|
|
"CC(=O)N1CCCCC1", |
|
|
] |
|
|
|
|
|
|
|
|
AI_MODEL = "openai/gpt-oss-20b" |
|
|
AI_MAX_TOKENS = 512 |
|
|
AI_TEMPERATURE = 0.7 |
|
|
AI_TOP_P = 0.9 |
|
|
|
|
|
|
|
|
DEFAULT_SMILES = "C[C@H](N)C(=O)O" |
|
|
DEFAULT_VARIATIONS_COUNT = 12 |
|
|
DEFAULT_GRID_COLUMNS = 4 |
|
|
MAX_GRID_COLUMNS = 8 |
|
|
MIN_VARIATIONS = 6 |
|
|
MAX_VARIATIONS = 24 |
|
|
|
|
|
|
|
|
MOLECULE_IMAGE_SIZE = (300, 300) |
|
|
PREVIEW_IMAGE_SIZE = (200, 200) |
|
|
GALLERY_IMAGE_SIZE = (200, 200) |
|
|
VARIATION_IMAGE_SIZES = [(150, 150), (180, 180), (200, 200), (160, 160)] |
|
|
|
|
|
|
|
|
CUSTOM_CSS = """ |
|
|
/* Full width layout */ |
|
|
.gradio-container { |
|
|
max-width: 100% !important; |
|
|
width: 100% !important; |
|
|
} |
|
|
|
|
|
.gradio-container .container { |
|
|
max-width: 100% !important; |
|
|
width: 100% !important; |
|
|
} |
|
|
|
|
|
/* Ensure rows use full width */ |
|
|
.gr-row { |
|
|
width: 100% !important; |
|
|
max-width: 100% !important; |
|
|
} |
|
|
|
|
|
.gr-column { |
|
|
width: 100% !important; |
|
|
max-width: 100% !important; |
|
|
} |
|
|
|
|
|
/* Make images responsive to zoom */ |
|
|
.gr-image { |
|
|
width: 100% !important; |
|
|
height: auto !important; |
|
|
max-width: 100% !important; |
|
|
object-fit: contain !important; |
|
|
} |
|
|
|
|
|
/* Responsive text scaling */ |
|
|
.gr-markdown { |
|
|
width: 100% !important; |
|
|
max-width: 100% !important; |
|
|
word-wrap: break-word !important; |
|
|
overflow-wrap: break-word !important; |
|
|
} |
|
|
|
|
|
/* Left column spacing */ |
|
|
.gr-column:first-child { |
|
|
padding-right: 20px; |
|
|
min-width: 300px; |
|
|
} |
|
|
|
|
|
/* Right column spacing */ |
|
|
.gr-column:last-child { |
|
|
padding-left: 20px; |
|
|
min-width: 400px; |
|
|
} |
|
|
#main_structure { |
|
|
border: none; |
|
|
border-radius: 12px; |
|
|
background: transparent; |
|
|
width: 100%; |
|
|
max-width: 100%; |
|
|
height: auto; |
|
|
max-height: 350px; |
|
|
overflow: hidden; |
|
|
object-fit: contain; |
|
|
margin: 5px 0; |
|
|
/* Make responsive to zoom */ |
|
|
min-height: 200px; |
|
|
resize: both; |
|
|
} |
|
|
|
|
|
/* Seamless properties display */ |
|
|
.seamless-properties { |
|
|
background: transparent; |
|
|
border: none; |
|
|
padding: 8px 0; |
|
|
margin: 5px 0; |
|
|
font-size: 13px; |
|
|
color: #e2e8f0; |
|
|
text-align: left; |
|
|
line-height: 1.4; |
|
|
/* Make responsive to zoom */ |
|
|
width: 100%; |
|
|
max-width: 100%; |
|
|
overflow-wrap: break-word; |
|
|
word-wrap: break-word; |
|
|
} |
|
|
|
|
|
.seamless-properties h1, .seamless-properties h2, .seamless-properties h3 { |
|
|
margin: 0 0 8px 0; |
|
|
color: #f7fafc; |
|
|
font-weight: bold; |
|
|
} |
|
|
|
|
|
.seamless-properties p { |
|
|
margin: 4px 0; |
|
|
color: #e2e8f0; |
|
|
} |
|
|
|
|
|
.seamless-properties ul { |
|
|
margin: 4px 0; |
|
|
padding-left: 20px; |
|
|
color: #e2e8f0; |
|
|
} |
|
|
|
|
|
.seamless-properties li { |
|
|
color: #e2e8f0; |
|
|
} |
|
|
|
|
|
.seamless-properties strong { |
|
|
color: #f7fafc; |
|
|
font-weight: bold; |
|
|
} |
|
|
|
|
|
.seamless-properties em { |
|
|
color: #a0aec0; |
|
|
font-style: italic; |
|
|
} |
|
|
|
|
|
#variations_gallery { |
|
|
border: none; |
|
|
border-radius: 12px; |
|
|
background: transparent; |
|
|
max-height: 300px; |
|
|
overflow-y: auto; |
|
|
margin: 5px 0; |
|
|
} |
|
|
|
|
|
#variations_container { |
|
|
margin-top: 5px; |
|
|
} |
|
|
|
|
|
#variations_gallery .gallery-item { |
|
|
border: 1px solid #4a5568; |
|
|
border-radius: 8px; |
|
|
margin: 3px; |
|
|
transition: all 0.3s ease; |
|
|
background: #1a202c; |
|
|
/* Better aspect ratio for chemical structures */ |
|
|
aspect-ratio: 1.3 / 1; |
|
|
min-width: 200px; |
|
|
max-width: 250px; |
|
|
} |
|
|
|
|
|
#variations_gallery .gallery-item:hover { |
|
|
border-color: #68d391; |
|
|
transform: scale(1.05); |
|
|
box-shadow: 0 4px 12px rgba(104, 211, 145, 0.3); |
|
|
background: #2d3748; |
|
|
} |
|
|
|
|
|
/* Ensure images fill the wider cells properly */ |
|
|
#variations_gallery .gallery-item img { |
|
|
width: 100%; |
|
|
height: 100%; |
|
|
object-fit: contain; |
|
|
border-radius: 6px; |
|
|
} |
|
|
|
|
|
#variations_container { |
|
|
max-height: 600px; |
|
|
overflow-y: auto; |
|
|
padding: 10px; |
|
|
} |
|
|
|
|
|
#selected_smiles, #selected_style { |
|
|
background: #f5f5f5; |
|
|
border: 1px solid #ddd; |
|
|
border-radius: 5px; |
|
|
} |
|
|
|
|
|
.page-info { |
|
|
text-align: center; |
|
|
font-weight: bold; |
|
|
color: #666; |
|
|
} |
|
|
|
|
|
.grid-controls { |
|
|
background: #f0f0f0; |
|
|
padding: 10px; |
|
|
border-radius: 8px; |
|
|
margin: 10px 0; |
|
|
} |
|
|
|
|
|
/* Compact properties display */ |
|
|
.compact-properties { |
|
|
background: #2d3748; |
|
|
border: 1px solid #4a5568; |
|
|
border-radius: 8px; |
|
|
padding: 15px; |
|
|
margin: 10px 0; |
|
|
font-size: 13px; |
|
|
color: #e2e8f0 !important; |
|
|
text-align: left; |
|
|
min-height: 60px; |
|
|
max-height: 200px; |
|
|
overflow-y: auto; |
|
|
line-height: 1.4; |
|
|
} |
|
|
|
|
|
.compact-properties h1, .compact-properties h2, .compact-properties h3 { |
|
|
margin: 0 0 8px 0; |
|
|
color: #f7fafc !important; |
|
|
font-weight: bold; |
|
|
} |
|
|
|
|
|
.compact-properties p { |
|
|
margin: 4px 0; |
|
|
color: #e2e8f0 !important; |
|
|
} |
|
|
|
|
|
.compact-properties ul { |
|
|
margin: 4px 0; |
|
|
padding-left: 20px; |
|
|
color: #e2e8f0 !important; |
|
|
} |
|
|
|
|
|
.compact-properties li { |
|
|
color: #e2e8f0 !important; |
|
|
} |
|
|
|
|
|
.compact-properties strong { |
|
|
color: #f7fafc !important; |
|
|
font-weight: bold; |
|
|
} |
|
|
|
|
|
.compact-properties em { |
|
|
color: #a0aec0 !important; |
|
|
font-style: italic; |
|
|
} |
|
|
|
|
|
/* Force text visibility - override any conflicting styles */ |
|
|
.compact-properties * { |
|
|
color: #e2e8f0 !important; |
|
|
} |
|
|
|
|
|
.compact-properties h1, .compact-properties h2, .compact-properties h3, .compact-properties strong { |
|
|
color: #f7fafc !important; |
|
|
} |
|
|
|
|
|
/* Ensure markdown content is visible */ |
|
|
.compact-properties .markdown { |
|
|
color: #e2e8f0 !important; |
|
|
} |
|
|
|
|
|
.compact-properties .markdown h1, .compact-properties .markdown h2, .compact-properties .markdown h3 { |
|
|
color: #f7fafc !important; |
|
|
} |
|
|
|
|
|
.compact-properties .markdown strong { |
|
|
color: #f7fafc !important; |
|
|
} |
|
|
|
|
|
/* Popup notification system */ |
|
|
.notification-popup { |
|
|
position: fixed; |
|
|
top: 20px; |
|
|
right: 20px; |
|
|
background: #2d3748; |
|
|
color: #e2e8f0; |
|
|
padding: 12px 20px; |
|
|
border-radius: 8px; |
|
|
border-left: 4px solid #68d391; |
|
|
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3); |
|
|
z-index: 1000; |
|
|
font-size: 14px; |
|
|
font-weight: 500; |
|
|
max-width: 300px; |
|
|
opacity: 0; |
|
|
transform: translateX(100%); |
|
|
transition: all 0.3s ease-in-out; |
|
|
} |
|
|
|
|
|
.notification-popup.show { |
|
|
opacity: 1; |
|
|
transform: translateX(0); |
|
|
} |
|
|
|
|
|
.notification-popup.error { |
|
|
border-left-color: #f56565; |
|
|
} |
|
|
|
|
|
.notification-popup.warning { |
|
|
border-left-color: #ed8936; |
|
|
} |
|
|
|
|
|
.notification-popup.info { |
|
|
border-left-color: #4299e1; |
|
|
} |
|
|
|
|
|
/* Success notification */ |
|
|
.notification-popup.success { |
|
|
border-left-color: #68d391; |
|
|
} |
|
|
|
|
|
/* Auto-hide animation */ |
|
|
.notification-popup.auto-hide { |
|
|
animation: slideOut 0.3s ease-in-out 2.5s forwards; |
|
|
} |
|
|
|
|
|
@keyframes slideOut { |
|
|
to { |
|
|
opacity: 0; |
|
|
transform: translateX(100%); |
|
|
} |
|
|
} |
|
|
|
|
|
/* Spacer styling */ |
|
|
.spacer { |
|
|
margin: 20px 0; |
|
|
opacity: 0.3; |
|
|
} |
|
|
|
|
|
/* Notification container */ |
|
|
#notification-container { |
|
|
position: fixed; |
|
|
top: 20px; |
|
|
right: 20px; |
|
|
z-index: 1000; |
|
|
pointer-events: none; |
|
|
} |
|
|
|
|
|
/* Temporary notification display */ |
|
|
.temp-notification { |
|
|
background: #2d3748; |
|
|
color: #e2e8f0; |
|
|
padding: 12px 20px; |
|
|
border-radius: 8px; |
|
|
border-left: 4px solid #68d391; |
|
|
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3); |
|
|
margin-bottom: 10px; |
|
|
font-size: 14px; |
|
|
font-weight: 500; |
|
|
max-width: 300px; |
|
|
opacity: 1; |
|
|
transform: translateX(0); |
|
|
transition: all 0.3s ease-in-out; |
|
|
pointer-events: auto; |
|
|
} |
|
|
|
|
|
.temp-notification.error { |
|
|
border-left-color: #f56565; |
|
|
} |
|
|
|
|
|
.temp-notification.warning { |
|
|
border-left-color: #ed8936; |
|
|
} |
|
|
|
|
|
.temp-notification.info { |
|
|
border-left-color: #4299e1; |
|
|
} |
|
|
|
|
|
.temp-notification.success { |
|
|
border-left-color: #68d391; |
|
|
} |
|
|
""" |
|
|
|