Skip to content
Merged
Show file tree
Hide file tree
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
5 changes: 5 additions & 0 deletions web-app/assets/moon.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
20 changes: 20 additions & 0 deletions web-app/assets/sun.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
15 changes: 10 additions & 5 deletions web-app/css/styles.css
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,6 @@ body {
}

.container {
max-width: 1200px;
margin: 0 auto;
padding: 0 20px;
}
Expand All @@ -138,11 +137,9 @@ body {

.navbar .container {
display: flex;
justify-content: space-between;
justify-content:space-around;
align-items: center;
gap: 2rem;
}

.navbar-brand {
display: flex;
align-items: baseline;
Expand Down Expand Up @@ -557,8 +554,9 @@ body {
display: flex;
gap: 1.05rem;
justify-content: center;
align-items: center;
flex-wrap: wrap;
margin-bottom: 1.1rem;
/* margin-bottom: 1.1rem; */
animation: fadeInUp 0.7s ease 0.4s both;
}

Expand Down Expand Up @@ -1235,6 +1233,12 @@ body {
max-width: 600px;
margin: 0 auto;
}
.search-box-container{
display: flex;
align-items: center;
justify-content: center;
margin: 20px;
}

.search-box {
position: relative;
Expand All @@ -1244,6 +1248,7 @@ body {
padding: 0.5rem 1.5rem;
display: flex;
align-items: center;
justify-content: center;
gap: 1rem;
transition: var(--transition);
}
Expand Down
149 changes: 58 additions & 91 deletions web-app/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -797,72 +797,74 @@
🚀 Skip to main content
</a>
<!-- Navigation -->
<nav aria-label="Primary" class="navbar">
<div class="container nav-wrapper">
<!-- LEFT -->
<div class="navbar-brand">
<nav aria-label="Primary" class="navbar">
<div class="container nav-wrapper">
<!-- LEFT -->
<div class="navbar-brand">
<a class="logo-wrap" href="#">
<!-- LOGO IMAGE -->
<img alt="PyMini Logo" class="navbar-logo" src="/assets/logo.png"/>
<!-- TEXT -->
<div class="logo-text">
<span class="logo-py">py</span>
<span class="logo-mini">.mini</span>
<span class="logo-parens">()</span>
<span class="logo-py">py</span>
<span class="logo-mini">.mini</span>
<span class="logo-parens">()</span>
</div>
<!-- SMALL TAGLINE -->
<span class="logo-tagline">
games, math &amp; terminal toys
</span>
games, math &amp; terminal toys
</span>
</a>
</div>
<!-- CENTER SEARCH -->
<div class="search-box">
<i class="fas fa-search"></i>
<input aria-label="Search projects" id="searchInput" placeholder="Search projects or games..." type="text"/>
</div>
<!-- RIGHT -->
<div class="nav-controls">
<button aria-label="Mute sounds" class="sound-toggle" id="soundToggle" type="button">
<i class="fas fa-volume-up"></i>

<div class="container1">
<div aria-label="Project categories" class="hero-features" role="tablist">
<button aria-selected="true" class="feature-badge tab active" data-category="all" role="tab" tabindex="0">
<span class="feature-icon"><i data-lucide="star"></i></span>
<span class="feature-label">all</span>
</button>
<button aria-selected="false" class="feature-badge tab" data-category="games" role="tab" tabindex="-1">
<span class="feature-icon"><i data-lucide="gamepad-2"></i></span>
<span class="feature-label">games</span>
</button>
<button aria-label="Switch theme" class="theme-toggle" id="themeToggle" type="button">
<i class="fas fa-moon"></i>
<button aria-selected="false" class="feature-badge tab" data-category="math" role="tab" tabindex="-1">
<span class="feature-icon"><i data-lucide="hash"></i></span>
<span class="feature-label">math</span>
</button>
<button aria-selected="false" class="feature-badge tab" data-category="utilities" role="tab" tabindex="-1">
<span class="feature-icon"><i data-lucide="lock"></i></span>
<span class="feature-label">utilities</span>
</button>
<button aria-selected="false" class="feature-badge tab" data-category="playground" id="playgroundTab" role="tab" tabindex="-1">
<span class="feature-icon"><i data-lucide="terminal"></i></span>
<span class="feature-label">playground</span>
</button>
<button class="btn-random-project" id="randomProjectBtn" title="Discover a random project!">
launch random →
</button>
</div>
</div>

<!-- RIGHT -->
<div class="nav-controls">
<button aria-label="Mute sounds" class="sound-toggle" id="soundToggle" type="button">
<i class="fas fa-volume-up"></i>
</button>
<button aria-label="Switch theme" class="theme-toggle" id="themeToggle" type="button">
<i class="fas fa-moon"></i>
</button>
</div>

</nav>
<!-- CENTER SEARCH -->
<div class="search-box-container">
<div class="search-box">
<i class="fas fa-search"></i>
<input aria-label="Search projects" id="searchInput" placeholder="Search projects or games..." type="text"/>
</div>
</div>
<!-- ── Sticky Category Filter Bar ─────────────────────────────── -->
<!-- Appears below navbar when user scrolls past the hero section -->
<div aria-label="Project categories (sticky)" class="sticky-filter-bar" id="stickyFilterBar" role="tablist">
<div class="sticky-filter-inner">
<button aria-selected="true" class="sticky-tab active" data-sticky-category="all" role="tab" tabindex="0">
<i aria-hidden="true" data-lucide="layout-grid"></i>
<span>all</span>
</button>
<button aria-selected="false" class="sticky-tab" data-sticky-category="games" role="tab" tabindex="-1">
<i aria-hidden="true" data-lucide="gamepad-2"></i>
<span>games</span>
</button>
<button aria-selected="false" class="sticky-tab" data-sticky-category="math" role="tab" tabindex="-1">
<i aria-hidden="true" data-lucide="hash"></i>
<span>math</span>
</button>
<button aria-selected="false" class="sticky-tab" data-sticky-category="utilities" role="tab" tabindex="-1">
<i aria-hidden="true" data-lucide="lock"></i>
<span>utilities</span>
</button>
<button aria-selected="false" class="sticky-tab" data-sticky-category="playground" role="tab" tabindex="-1">
<i aria-hidden="true" data-lucide="terminal"></i>
<span>playground</span>
</button>
<button aria-selected="false" class="sticky-tab" data-sticky-category="favorites" role="tab" tabindex="-1">
<i aria-hidden="true" class="fas fa-star"></i>
<span>favorites</span>
</button>
</div>
</div>

<main id="main-content" tabindex="-1">
<section class="hero-section" aria-label="Welcome">
<div class="hero-background"></div>
Expand All @@ -871,50 +873,15 @@
<h2 class="hero-title">Learn Python the Fun Way!</h2>
<p class="hero-subtitle">25+ Mini Projects • Beautiful UI • Beginner Friendly • Zero Dependencies</p>

<div aria-label="Project categories" class="hero-features" role="tablist">
<button aria-selected="true" class="feature-badge tab active" data-category="all" role="tab" tabindex="0">
<span class="feature-icon"><i data-lucide="layout-grid"></i></span>
<span class="feature-label">all</span>
</button>
<button aria-selected="false" class="feature-badge tab" data-category="games" role="tab" tabindex="-1">
<span class="feature-icon"><i data-lucide="gamepad-2"></i></span>
<span class="feature-label">games</span>
</button>
<button aria-selected="false" class="feature-badge tab" data-category="math" role="tab" tabindex="-1">
<span class="feature-icon"><i data-lucide="hash"></i></span>
<span class="feature-label">math</span>
</button>
<button aria-selected="false" class="feature-badge tab" data-category="utilities" role="tab" tabindex="-1">
<span class="feature-icon"><i data-lucide="lock"></i></span>
<span class="feature-label">utilities</span>
</button>
<!--
PLAYGROUND TAB
data-category="playground" is detected by main.js
and delegates to window.playgroundAPI instead of
running applyCategoryFilter().
-->
<button aria-selected="false" class="feature-badge tab" data-category="playground" id="playgroundTab" role="tab" tabindex="-1">
<span class="feature-icon"><i data-lucide="terminal"></i></span>
<span class="feature-label">playground</span>
</button>
<button aria-selected="false" class="feature-badge tab" data-category="favorites" role="tab" tabindex="-1">
<span class="feature-icon"><i class="fas fa-star"></i></span>
<span class="feature-label">favorites</span>
</button>
</div>

<button class="btn-random-project" id="randomProjectBtn" title="Discover a random project!">
launch random →
</button>
</div>
</div>

</section>

<section class="projects-section">
<div class="container">
<div class="projects-grid">
<div class="project-card" data-category="games" data-project="blackjack(21)">


<section class="projects-section">
<div class="container">
<div class="projects-grid">
<div class="project-card" data-category="games" data-project="blackjack(21)">
<div class="card-icon">🃏</div>
<h3>BlackJack21</h3>
<p>Beat the dealer!</p>
Expand Down
8 changes: 4 additions & 4 deletions web-app/js/main.js
Original file line number Diff line number Diff line change
Expand Up @@ -105,8 +105,8 @@ document.addEventListener('DOMContentLoaded', function () {
syncThemeColor(savedTheme);
themeToggle.innerHTML =
savedTheme === 'light'
? '<i class="fas fa-sun" aria-hidden="true"></i>'
: '<i class="fas fa-moon" aria-hidden="true"></i>';
? '<img src="assets/sun.svg" alt="" aria-hidden="true" class="theme-icon">'
: '<img src="assets/moon.svg" alt="" aria-hidden="true" class="theme-icon">';
updateThemeToggleAria(savedTheme === 'light');

themeToggle.addEventListener('click', function () {
Expand All @@ -119,8 +119,8 @@ document.addEventListener('DOMContentLoaded', function () {

themeToggle.innerHTML =
newTheme === 'light'
? '<i class="fas fa-sun" aria-hidden="true"></i>'
: '<i class="fas fa-moon" aria-hidden="true"></i>';
? '<img src="assets/sun.svg" alt="" aria-hidden="true" class="theme-icon">'
: '<img src="assets/moon.svg" alt="" aria-hidden="true" class="theme-icon">';
updateThemeToggleAria(newTheme === 'light');
});
}
Expand Down
Loading