Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
321 changes: 321 additions & 0 deletions shiny_web/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,321 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Dynamo</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}

body {
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
line-height: 1.6;
color: #333;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
min-height: 100vh;
overflow-x: hidden;
}

.container {
max-width: 1200px;
margin: 0 auto;
padding: 2rem;
}

header {
text-align: center;
margin-bottom: 4rem;
animation: fadeInDown 1s ease-out;
}

.logo {
width: 120px;
height: 120px;
margin: 0 auto 2rem;
background: linear-gradient(45deg, #ff6b6b, #4ecdc4);
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
font-size: 3rem;
color: white;
font-weight: bold;
box-shadow: 0 20px 40px rgba(0,0,0,0.1);
transition: transform 0.3s ease;
}

.logo:hover {
transform: rotate(10deg) scale(1.05);
}

h1 {
font-size: 3.5rem;
font-weight: 700;
color: white;
text-shadow: 2px 2px 4px rgba(0,0,0,0.3);
margin-bottom: 1rem;
}

.subtitle {
font-size: 1.3rem;
color: rgba(255,255,255,0.9);
font-weight: 300;
max-width: 600px;
margin: 0 auto;
}

.applications {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(450px, 1fr));
gap: 3rem;
margin-top: 4rem;
}

.app-card {
background: rgba(255,255,255,0.95);
backdrop-filter: blur(10px);
border-radius: 20px;
padding: 3rem;
text-align: center;
box-shadow: 0 25px 50px rgba(0,0,0,0.15);
transition: all 0.3s ease;
position: relative;
overflow: hidden;
}

.app-card::before {
content: '';
position: absolute;
top: 0;
left: -100%;
width: 100%;
height: 100%;
background: linear-gradient(90deg, transparent, rgba(255,255,255,0.4), transparent);
transition: left 0.5s ease;
}

.app-card:hover::before {
left: 100%;
}

.app-card:hover {
transform: translateY(-10px);
box-shadow: 0 35px 70px rgba(0,0,0,0.2);
}

.app-image {
max-width: 20%;
height: auto;
}

.app-card:hover .app-icon {
transform: scale(1.1) rotate(5deg);
}

.app-title {
font-size: 2rem;
font-weight: 600;
color: #2c3e50;
margin-bottom: 1rem;
}

.app-description {
color: #7f8c8d;
font-size: 1.1rem;
line-height: 1.6;
margin-bottom: 2rem;
}

.app-link {
display: inline-block;
background: linear-gradient(45deg, #667eea, #764ba2);
color: white;
text-decoration: none;
padding: 1rem 2.5rem;
border-radius: 50px;
font-weight: 600;
font-size: 1.1rem;
transition: all 0.3s ease;
box-shadow: 0 10px 30px rgba(102, 126, 234, 0.3);
}

.app-link:hover {
transform: translateY(-3px);
box-shadow: 0 15px 40px rgba(102, 126, 234, 0.4);
background: linear-gradient(45deg, #764ba2, #667eea);
}

.features {
display: flex;
justify-content: space-around;
margin: 1.5rem 0;
flex-wrap: wrap;
gap: 1rem;
}

.feature-tag {
background: rgba(102, 126, 234, 0.1);
color: #667eea;
padding: 0.5rem 1rem;
border-radius: 20px;
font-size: 0.9rem;
font-weight: 500;
}

.floating-elements {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
pointer-events: none;
z-index: -1;
}

.floating-circle {
position: absolute;
border-radius: 50%;
background: rgba(255,255,255,0.1);
animation: float 6s ease-in-out infinite;
}

.circle1 {
width: 80px;
height: 80px;
top: 10%;
left: 10%;
animation-delay: 0s;
}

.circle2 {
width: 120px;
height: 120px;
top: 20%;
right: 10%;
animation-delay: 2s;
}

.circle3 {
width: 60px;
height: 60px;
bottom: 10%;
left: 15%;
animation-delay: 4s;
}

@keyframes fadeInDown {
from {
opacity: 0;
transform: translateY(-50px);
}
to {
opacity: 1;
transform: translateY(0);
}
}

@keyframes float {
0%, 100% {
transform: translateY(0px);
}
50% {
transform: translateY(-20px);
}
}

@media (max-width: 768px) {
.applications {
grid-template-columns: 1fr;
gap: 2rem;
}

.app-card {
padding: 2rem;
}

h1 {
font-size: 2.5rem;
}

.subtitle {
font-size: 1.1rem;
}
}
</style>
</head>
<body>
<div class="floating-elements">
<div class="floating-circle circle1"></div>
<div class="floating-circle circle2"></div>
<div class="floating-circle circle3"></div>
</div>

<div class="container">
<header>
<img src="../docs/_static/logo.png" alt="logo" class="app-image">
<h1>Dynamo apps</h1>
<p class="subtitle">Mapping Transcriptomic Vector Fields of Single Cells</p>
</header>

<div class="applications">
<div class="app-card app1">
<h2 class="app-title">in silico perturbation</h2>
<p class="app-description">
In the dynamo Cell paper, we introduced the analytical form of a vector field. This permits in
silico perturbation predictions of expression for each gene in each cell and the cell fate diversions
after genetic perturbations. In particular, we demonstrated the predictive power of hematopoietic fate
trajectory predictions after genetic perturbations.
</p>
<a href="https://aristoteleo.shinyapps.io/perturbation_silico/" class="app-link">Launch in silico perturbation</a>
</div>

<div class="app-card app2">
<h2 class="app-title">Most probably path predictions</h2>
<p class="app-description">
The least action path (LAP) is a principled method that has previously been used in
theoretical efforts to predict the most probable path a cell will follow during fate transition.
Specifically, the optimal path between any two cell states is searched by variating the continuous
path connecting the source state to the target while minimizing its action and updating the associated
transition time. The resultant least action path has the highest transition probability and is
associated with a particular transition time. Once the LAP is identified, we can focus only on TFs
and rank them by the path integral of the mean square displacement (MSD) of gene expression with
respect to the initial expression to identify key transcription factors of the associated cell fate
transitions.
</p>
<a href="https://aristoteleo.shinyapps.io/lap_silico/" class="app-link">Launch LAP</a>
</div>
</div>
</div>

<script>
// Add some interactive animations
document.addEventListener('DOMContentLoaded', function() {
const cards = document.querySelectorAll('.app-card');

cards.forEach((card, index) => {
card.style.animation = `fadeInUp 0.8s ease-out ${index * 0.2}s both`;
});
});

// Add fadeInUp animation
const style = document.createElement('style');
style.textContent = `
@keyframes fadeInUp {
from {
opacity: 0;
transform: translateY(50px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
`;
document.head.appendChild(style);
</script>
</body>
</html>
Loading