marimo-learn / _site /index.html
Haleshot's picture
relevant assets and workflow
1cce1df unverified
raw
history blame
30.3 kB
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Marimo Learn - Interactive Educational Notebooks</title>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
<style>
:root {
--eva-purple: #9a1eb3;
--eva-green: #00ff00;
--eva-orange: #ff6600;
--eva-blue: #0066ff;
--eva-red: #ff0000;
--eva-black: #111111;
--eva-dark: #222222;
--eva-terminal-bg: rgba(0, 0, 0, 0.85);
--eva-text: #e0e0e0;
--eva-border-radius: 4px;
--eva-transition: all 0.3s ease;
}
body {
background-color: var(--eva-black);
color: var(--eva-text);
font-family: 'Courier New', monospace;
margin: 0;
padding: 0;
line-height: 1.6;
}
.eva-container {
max-width: 1200px;
margin: 0 auto;
padding: 2rem;
}
.eva-header {
border-bottom: 2px solid var(--eva-green);
padding-bottom: 1rem;
margin-bottom: 2rem;
display: flex;
justify-content: space-between;
align-items: center;
position: sticky;
top: 0;
background-color: rgba(17, 17, 17, 0.95);
z-index: 100;
backdrop-filter: blur(5px);
padding-top: 1rem;
}
.eva-logo {
font-size: 2.5rem;
font-weight: bold;
color: var(--eva-green);
text-transform: uppercase;
letter-spacing: 2px;
text-shadow: 0 0 10px rgba(0, 255, 0, 0.5);
}
.eva-nav {
display: flex;
gap: 1.5rem;
}
.eva-nav a {
color: white;
text-decoration: none;
text-transform: uppercase;
font-size: 0.9rem;
letter-spacing: 1px;
transition: color 0.3s;
position: relative;
padding: 0.5rem 0;
}
.eva-nav a:hover {
color: var(--eva-green);
}
.eva-nav a:hover::after {
content: '';
position: absolute;
bottom: -5px;
left: 0;
width: 100%;
height: 2px;
background-color: var(--eva-green);
animation: scanline 1.5s linear infinite;
}
.eva-hero {
background-color: var(--eva-terminal-bg);
border: 1px solid var(--eva-green);
padding: 3rem 2rem;
margin-bottom: 3rem;
position: relative;
overflow: hidden;
border-radius: var(--eva-border-radius);
display: flex;
flex-direction: column;
align-items: flex-start;
background-image: linear-gradient(45deg, rgba(0, 0, 0, 0.9), rgba(0, 0, 0, 0.7)), url('https://raw.githubusercontent.com/marimo-team/marimo/main/docs/_static/marimo-logotype-thick.svg');
background-size: cover;
background-position: center;
background-blend-mode: overlay;
}
.eva-hero::before {
content: '';
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 2px;
background-color: var(--eva-green);
animation: scanline 3s linear infinite;
}
.eva-hero h1 {
font-size: 2.5rem;
margin-bottom: 1rem;
color: var(--eva-green);
text-transform: uppercase;
letter-spacing: 2px;
text-shadow: 0 0 10px rgba(0, 255, 0, 0.5);
}
.eva-hero p {
font-size: 1.1rem;
max-width: 800px;
margin-bottom: 2rem;
line-height: 1.8;
}
.eva-features {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 2rem;
margin-bottom: 3rem;
}
.eva-feature {
background-color: var(--eva-terminal-bg);
border: 1px solid var(--eva-blue);
padding: 1.5rem;
border-radius: var(--eva-border-radius);
transition: var(--eva-transition);
position: relative;
overflow: hidden;
}
.eva-feature:hover {
transform: translateY(-5px);
box-shadow: 0 10px 20px rgba(0, 102, 255, 0.2);
}
.eva-feature-icon {
font-size: 2rem;
margin-bottom: 1rem;
color: var(--eva-blue);
}
.eva-feature h3 {
font-size: 1.3rem;
margin-bottom: 1rem;
color: var(--eva-blue);
}
.eva-section-title {
font-size: 2rem;
color: var(--eva-green);
margin-bottom: 2rem;
text-transform: uppercase;
letter-spacing: 2px;
text-align: center;
position: relative;
padding-bottom: 1rem;
}
.eva-section-title::after {
content: '';
position: absolute;
bottom: 0;
left: 50%;
transform: translateX(-50%);
width: 100px;
height: 2px;
background-color: var(--eva-green);
}
.eva-courses {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(350px, 1fr));
gap: 2rem;
}
.eva-course {
background-color: var(--eva-terminal-bg);
border: 1px solid var(--eva-purple);
border-radius: var(--eva-border-radius);
transition: var(--eva-transition);
position: relative;
overflow: hidden;
}
.eva-course:hover {
transform: translateY(-5px);
box-shadow: 0 10px 20px rgba(154, 30, 179, 0.3);
}
.eva-course::after {
content: '';
position: absolute;
bottom: 0;
left: 0;
width: 100%;
height: 2px;
background-color: var(--eva-purple);
animation: scanline 2s linear infinite;
}
.eva-course-header {
padding: 1.5rem;
cursor: pointer;
display: flex;
justify-content: space-between;
align-items: center;
border-bottom: 1px solid rgba(154, 30, 179, 0.3);
}
.eva-course-title {
font-size: 1.5rem;
color: var(--eva-purple);
text-transform: uppercase;
letter-spacing: 1px;
margin: 0;
}
.eva-course-toggle {
color: var(--eva-purple);
font-size: 1.5rem;
transition: var(--eva-transition);
}
.eva-course-content {
padding: 0 1.5rem;
max-height: 0;
overflow: hidden;
transition: var(--eva-transition);
}
.eva-course.active .eva-course-content {
padding: 1.5rem;
max-height: 1000px;
}
.eva-course.active .eva-course-toggle {
transform: rotate(180deg);
}
.eva-course-description {
margin-bottom: 1.5rem;
font-size: 0.9rem;
line-height: 1.6;
}
.eva-notebooks {
margin-top: 1rem;
}
.eva-notebook {
margin-bottom: 0.75rem;
padding: 0.5rem;
border-left: 2px solid var(--eva-blue);
transition: var(--eva-transition);
display: flex;
align-items: center;
}
.eva-notebook:hover {
background-color: rgba(0, 102, 255, 0.1);
padding-left: 1rem;
}
.eva-notebook a {
color: white;
text-decoration: none;
display: block;
font-size: 0.9rem;
flex-grow: 1;
}
.eva-notebook a:hover {
color: var(--eva-blue);
}
.eva-notebook-number {
color: var(--eva-blue);
font-size: 0.8rem;
margin-right: 0.5rem;
opacity: 0.7;
min-width: 24px;
}
.eva-button {
display: inline-block;
background-color: transparent;
color: var(--eva-green);
border: 1px solid var(--eva-green);
padding: 0.7rem 1.5rem;
text-decoration: none;
text-transform: uppercase;
font-size: 0.9rem;
letter-spacing: 1px;
transition: var(--eva-transition);
cursor: pointer;
border-radius: var(--eva-border-radius);
position: relative;
overflow: hidden;
}
.eva-button:hover {
background-color: var(--eva-green);
color: var(--eva-black);
}
.eva-button::after {
content: '';
position: absolute;
top: 0;
left: -100%;
width: 100%;
height: 100%;
background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent);
transition: 0.5s;
}
.eva-button:hover::after {
left: 100%;
}
.eva-cta {
background-color: var(--eva-terminal-bg);
border: 1px solid var(--eva-orange);
padding: 3rem 2rem;
margin: 4rem 0;
text-align: center;
border-radius: var(--eva-border-radius);
position: relative;
overflow: hidden;
}
.eva-cta h2 {
font-size: 2rem;
color: var(--eva-orange);
margin-bottom: 1.5rem;
text-transform: uppercase;
}
.eva-cta p {
max-width: 600px;
margin: 0 auto 2rem;
font-size: 1.1rem;
}
.eva-cta .eva-button {
color: var(--eva-orange);
border-color: var(--eva-orange);
}
.eva-cta .eva-button:hover {
background-color: var(--eva-orange);
color: var(--eva-black);
}
.eva-footer {
margin-top: 4rem;
padding-top: 2rem;
border-top: 2px solid var(--eva-green);
display: flex;
justify-content: space-between;
align-items: center;
flex-wrap: wrap;
gap: 2rem;
}
.eva-footer-links {
display: flex;
gap: 1.5rem;
}
.eva-footer-links a {
color: var(--eva-text);
text-decoration: none;
transition: var(--eva-transition);
}
.eva-footer-links a:hover {
color: var(--eva-green);
}
.eva-footer-copyright {
font-size: 0.9rem;
}
.eva-search {
position: relative;
margin-bottom: 3rem;
}
.eva-search input {
width: 100%;
padding: 1rem;
background-color: var(--eva-terminal-bg);
border: 1px solid var(--eva-green);
color: var(--eva-text);
font-family: 'Courier New', monospace;
font-size: 1rem;
border-radius: var(--eva-border-radius);
outline: none;
transition: var(--eva-transition);
}
.eva-search input:focus {
box-shadow: 0 0 10px rgba(0, 255, 0, 0.3);
}
.eva-search input::placeholder {
color: rgba(224, 224, 224, 0.5);
}
.eva-search-icon {
position: absolute;
right: 1rem;
top: 50%;
transform: translateY(-50%);
color: var(--eva-green);
font-size: 1.2rem;
}
@keyframes scanline {
0% {
transform: translateX(-100%);
}
100% {
transform: translateX(100%);
}
}
@keyframes blink {
0%, 100% {
opacity: 1;
}
50% {
opacity: 0;
}
}
.eva-cursor {
display: inline-block;
width: 10px;
height: 1.2em;
background-color: var(--eva-green);
margin-left: 2px;
animation: blink 1s infinite;
vertical-align: middle;
}
@media (max-width: 768px) {
.eva-courses {
grid-template-columns: 1fr;
}
.eva-header {
flex-direction: column;
align-items: flex-start;
padding: 1rem;
}
.eva-nav {
margin-top: 1rem;
flex-wrap: wrap;
}
.eva-hero {
padding: 2rem 1rem;
}
.eva-hero h1 {
font-size: 2rem;
}
.eva-features {
grid-template-columns: 1fr;
}
.eva-footer {
flex-direction: column;
align-items: center;
text-align: center;
}
}
</style>
</head>
<body>
<div class="eva-container">
<header class="eva-header">
<div class="eva-logo">MARIMO LEARN</div>
<nav class="eva-nav">
<a href="#features">Features</a>
<a href="#courses">Courses</a>
<a href="#contribute">Contribute</a>
<a href="https://docs.marimo.io" target="_blank">Documentation</a>
<a href="https://github.com/marimo-team/learn" target="_blank">GitHub</a>
</nav>
</header>
<section class="eva-hero">
<h1>Interactive Learning with Marimo<span class="eva-cursor"></span></h1>
<p>
A curated collection of educational notebooks covering computer science,
mathematics, data science, and more. Built with marimo - the reactive
Python notebook that makes data exploration delightful.
</p>
<a href="#courses" class="eva-button">Explore Courses</a>
</section>
<section id="features">
<h2 class="eva-section-title">Why Marimo Learn?</h2>
<div class="eva-features">
<div class="eva-feature">
<div class="eva-feature-icon"><i class="fas fa-bolt"></i></div>
<h3>Reactive Notebooks</h3>
<p>Experience the power of reactive programming with marimo notebooks that automatically update when dependencies change.</p>
</div>
<div class="eva-feature">
<div class="eva-feature-icon"><i class="fas fa-code"></i></div>
<h3>Learn by Doing</h3>
<p>Interactive examples and exercises help you understand concepts through hands-on practice.</p>
</div>
<div class="eva-feature">
<div class="eva-feature-icon"><i class="fas fa-graduation-cap"></i></div>
<h3>Comprehensive Courses</h3>
<p>From Python basics to advanced optimization techniques, our courses cover a wide range of topics.</p>
</div>
</div>
</section>
<section id="courses">
<h2 class="eva-section-title">Explore Courses</h2>
<div class="eva-search">
<input type="text" id="courseSearch" placeholder="Search courses and notebooks...">
<span class="eva-search-icon"><i class="fas fa-search"></i></span>
</div>
<div class="eva-courses">
<div class="eva-course" data-course-id="optimization">
<div class="eva-course-header">
<h2 class="eva-course-title">Optimization</h2>
<span class="eva-course-toggle"><i class="fas fa-chevron-down"></i></span>
</div>
<div class="eva-course-content">
<p class="eva-course-description">This collection of marimo notebooks teaches you the basics of convex optimization.</p>
<div class="eva-notebooks">
<div class="eva-notebook">
<span class="eva-notebook-number">01</span>
<a href="optimization\01_least_squares.html" data-notebook-title="Least Squares">Least Squares</a>
</div>
<div class="eva-notebook">
<span class="eva-notebook-number">02</span>
<a href="optimization\02_linear_program.html" data-notebook-title="Linear Program">Linear Program</a>
</div>
<div class="eva-notebook">
<span class="eva-notebook-number">03</span>
<a href="optimization\03_minimum_fuel_optimal_control.html" data-notebook-title="Minimum Fuel Optimal Control">Minimum Fuel Optimal Control</a>
</div>
<div class="eva-notebook">
<span class="eva-notebook-number">04</span>
<a href="optimization\04_quadratic_program.html" data-notebook-title="Quadratic Program">Quadratic Program</a>
</div>
<div class="eva-notebook">
<span class="eva-notebook-number">05</span>
<a href="optimization\05_portfolio_optimization.html" data-notebook-title="Portfolio Optimization">Portfolio Optimization</a>
</div>
<div class="eva-notebook">
<span class="eva-notebook-number">06</span>
<a href="optimization\06_convex_optimization.html" data-notebook-title="Convex Optimization">Convex Optimization</a>
</div>
<div class="eva-notebook">
<span class="eva-notebook-number">07</span>
<a href="optimization\07_sdp.html" data-notebook-title="Sdp">Sdp</a>
</div>
</div>
</div>
</div>
<div class="eva-course" data-course-id="polars">
<div class="eva-course-header">
<h2 class="eva-course-title">Polars</h2>
<span class="eva-course-toggle"><i class="fas fa-chevron-down"></i></span>
</div>
<div class="eva-course-content">
<p class="eva-course-description">_🚧 This collection is a work in progress. Please help us add notebooks!_</p>
<div class="eva-notebooks">
<div class="eva-notebook">
<span class="eva-notebook-number">01</span>
<a href="polars\01_why_polars.html" data-notebook-title="Why Polars">Why Polars</a>
</div>
<div class="eva-notebook">
<span class="eva-notebook-number">02</span>
<a href="polars\04_basic_operations.html" data-notebook-title="Basic Operations">Basic Operations</a>
</div>
<div class="eva-notebook">
<span class="eva-notebook-number">03</span>
<a href="polars\12_aggregations.html" data-notebook-title="Aggregations">Aggregations</a>
</div>
<div class="eva-notebook">
<span class="eva-notebook-number">04</span>
<a href="polars\14_user_defined_functions.html" data-notebook-title="User Defined Functions">User Defined Functions</a>
</div>
</div>
</div>
</div>
<div class="eva-course" data-course-id="probability">
<div class="eva-course-header">
<h2 class="eva-course-title">Probability</h2>
<span class="eva-course-toggle"><i class="fas fa-chevron-down"></i></span>
</div>
<div class="eva-course-content">
<p class="eva-course-description">🚧 _This collection is a work in progress. Check back later for new noteboks._</p>
<div class="eva-notebooks">
<div class="eva-notebook">
<span class="eva-notebook-number">01</span>
<a href="probability\01_sets.html" data-notebook-title="Sets">Sets</a>
</div>
<div class="eva-notebook">
<span class="eva-notebook-number">02</span>
<a href="probability\02_axioms.html" data-notebook-title="Axioms">Axioms</a>
</div>
<div class="eva-notebook">
<span class="eva-notebook-number">03</span>
<a href="probability\03_probability_of_or.html" data-notebook-title="Probability Of Or">Probability Of Or</a>
</div>
<div class="eva-notebook">
<span class="eva-notebook-number">04</span>
<a href="probability\04_conditional_probability.html" data-notebook-title="Conditional Probability">Conditional Probability</a>
</div>
<div class="eva-notebook">
<span class="eva-notebook-number">05</span>
<a href="probability\05_independence.html" data-notebook-title="Independence">Independence</a>
</div>
<div class="eva-notebook">
<span class="eva-notebook-number">06</span>
<a href="probability\06_probability_of_and.html" data-notebook-title="Probability Of And">Probability Of And</a>
</div>
<div class="eva-notebook">
<span class="eva-notebook-number">07</span>
<a href="probability\07_law_of_total_probability.html" data-notebook-title="Law Of Total Probability">Law Of Total Probability</a>
</div>
<div class="eva-notebook">
<span class="eva-notebook-number">08</span>
<a href="probability\08_bayes_theorem.html" data-notebook-title="Bayes Theorem">Bayes Theorem</a>
</div>
<div class="eva-notebook">
<span class="eva-notebook-number">09</span>
<a href="probability\09_random_variables.html" data-notebook-title="Random Variables">Random Variables</a>
</div>
<div class="eva-notebook">
<span class="eva-notebook-number">10</span>
<a href="probability\10_probability_mass_function.html" data-notebook-title="Probability Mass Function">Probability Mass Function</a>
</div>
<div class="eva-notebook">
<span class="eva-notebook-number">11</span>
<a href="probability\11_expectation.html" data-notebook-title="Expectation">Expectation</a>
</div>
</div>
</div>
</div>
<div class="eva-course" data-course-id="python">
<div class="eva-course-header">
<h2 class="eva-course-title">Python</h2>
<span class="eva-course-toggle"><i class="fas fa-chevron-down"></i></span>
</div>
<div class="eva-course-content">
<p class="eva-course-description">This collection of marimo notebooks is designed to teach you the basics of the Python programming language.</p>
<div class="eva-notebooks">
<div class="eva-notebook">
<span class="eva-notebook-number">01</span>
<a href="python\001_numbers.html" data-notebook-title="Numbers">Numbers</a>
</div>
<div class="eva-notebook">
<span class="eva-notebook-number">02</span>
<a href="python\002_strings.html" data-notebook-title="Strings">Strings</a>
</div>
<div class="eva-notebook">
<span class="eva-notebook-number">03</span>
<a href="python\003_collections.html" data-notebook-title="Collections">Collections</a>
</div>
<div class="eva-notebook">
<span class="eva-notebook-number">04</span>
<a href="python\004_conditional_logic.html" data-notebook-title="Conditional Logic">Conditional Logic</a>
</div>
<div class="eva-notebook">
<span class="eva-notebook-number">05</span>
<a href="python\005_loops.html" data-notebook-title="Loops">Loops</a>
</div>
<div class="eva-notebook">
<span class="eva-notebook-number">06</span>
<a href="python\007_advanced_collections.html" data-notebook-title="Advanced Collections">Advanced Collections</a>
</div>
<div class="eva-notebook">
<span class="eva-notebook-number">07</span>
<a href="python\008_functions.html" data-notebook-title="Functions">Functions</a>
</div>
<div class="eva-notebook">
<span class="eva-notebook-number">08</span>
<a href="python\009_modules.html" data-notebook-title="Modules">Modules</a>
</div>
<div class="eva-notebook">
<span class="eva-notebook-number">09</span>
<a href="python\010_exceptions.html" data-notebook-title="Exceptions">Exceptions</a>
</div>
</div>
</div>
</div>
</div>
</section>
<section id="contribute" class="eva-cta">
<h2>Contribute to Marimo Learn</h2>
<p>
Help us expand our collection of educational notebooks. Whether you're an expert in machine learning,
statistics, or any other field, your contributions are welcome!
</p>
<a href="https://github.com/marimo-team/learn" target="_blank" class="eva-button">
<i class="fab fa-github"></i> Contribute on GitHub
</a>
</section>
<footer class="eva-footer">
<div class="eva-footer-copyright">
© 2024 Marimo Learn. Built with <a href="https://marimo.io" target="_blank" style="color: var(--eva-green);">marimo</a>.
</div>
<div class="eva-footer-links">
<a href="https://marimo.io" target="_blank">Marimo Website</a>
<a href="https://docs.marimo.io" target="_blank">Documentation</a>
<a href="https://github.com/marimo-team/learn" target="_blank">GitHub</a>
</div>
</footer>
</div>
<script>
document.addEventListener('DOMContentLoaded', function() {
// Terminal typing effect for hero text
const heroTitle = document.querySelector('.eva-hero h1');
const heroText = document.querySelector('.eva-hero p');
const cursor = document.querySelector('.eva-cursor');
const originalTitle = heroTitle.textContent;
const originalText = heroText.textContent.trim();
heroTitle.textContent = '';
heroText.textContent = '';
let titleIndex = 0;
let textIndex = 0;
function typeTitle() {
if (titleIndex < originalTitle.length) {
heroTitle.textContent += originalTitle.charAt(titleIndex);
titleIndex++;
setTimeout(typeTitle, 50);
} else {
cursor.style.display = 'none';
setTimeout(typeText, 500);
}
}
function typeText() {
if (textIndex < originalText.length) {
heroText.textContent += originalText.charAt(textIndex);
textIndex++;
setTimeout(typeText, 20);
}
}
typeTitle();
// Course toggle functionality
const courseHeaders = document.querySelectorAll('.eva-course-header');
courseHeaders.forEach(header => {
header.addEventListener('click', () => {
const course = header.parentElement;
course.classList.toggle('active');
});
});
// Search functionality
const searchInput = document.getElementById('courseSearch');
const courses = document.querySelectorAll('.eva-course');
const notebooks = document.querySelectorAll('.eva-notebook');
searchInput.addEventListener('input', function() {
const searchTerm = this.value.toLowerCase();
if (searchTerm === '') {
// Reset all visibility
courses.forEach(course => {
course.style.display = 'block';
course.classList.remove('active');
});
notebooks.forEach(notebook => {
notebook.style.display = 'flex';
});
return;
}
// First hide all courses
courses.forEach(course => {
course.style.display = 'none';
course.classList.remove('active');
});
// Then show courses and notebooks that match the search
let hasResults = false;
notebooks.forEach(notebook => {
const notebookTitle = notebook.querySelector('a').getAttribute('data-notebook-title').toLowerCase();
const matchesSearch = notebookTitle.includes(searchTerm);
notebook.style.display = matchesSearch ? 'flex' : 'none';
if (matchesSearch) {
const course = notebook.closest('.eva-course');
course.style.display = 'block';
course.classList.add('active');
hasResults = true;
}
});
// Also search course titles
courses.forEach(course => {
const courseTitle = course.querySelector('.eva-course-title').textContent.toLowerCase();
const courseDescription = course.querySelector('.eva-course-description').textContent.toLowerCase();
if (courseTitle.includes(searchTerm) || courseDescription.includes(searchTerm)) {
course.style.display = 'block';
course.classList.add('active');
hasResults = true;
}
});
});
// Open the first course by default
if (courses.length > 0) {
courses[0].classList.add('active');
}
// Smooth scrolling for anchor links
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
anchor.addEventListener('click', function(e) {
e.preventDefault();
const targetId = this.getAttribute('href');
const targetElement = document.querySelector(targetId);
if (targetElement) {
window.scrollTo({
top: targetElement.offsetTop - 100,
behavior: 'smooth'
});
}
});
});
});
</script>
</body>
</html>