Skip to content
Open
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
12 changes: 11 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,2 +1,12 @@
# Sami-App
Sami App entwickeln

Responsive Web-App mit dunklem Sidebar-Layout und einem **Clone Builder** für:

- Python Clone Starter
- Instagram Clone Starter
- Facebook Clone Starter
- WhatsApp Clone Starter

## Start

Einfach `index.html` im Browser öffnen.
114 changes: 114 additions & 0 deletions index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
<!doctype html>
<html lang="de">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Sami App - Complete AI Suite</title>
<link rel="stylesheet" href="styles.css" />
</head>
<body>
<div class="app-shell">
<aside class="sidebar">
<header class="profile-card">
<div class="avatar">👤</div>
<h1>Sami Soliman</h1>
<p class="username">@sami20178</p>
<span class="level">⭐ Level 42</span>
</header>

<section class="stats-card">
<h2>Statistik</h2>
<ul>
<li><span>📊 XP</span><strong>12,450</strong></li>
<li><span>🎮 Spiele</span><strong>28</strong></li>
<li><span>💬 Chats</span><strong>156</strong></li>
<li><span>🎯 Achievements</span><strong>18</strong></li>
</ul>
</section>

<nav>
<p class="section-title">Navigation</p>
<button class="nav-item active" data-page="home">🏠 Home</button>

<details open>
<summary>🧠 AI Modus</summary>
<button class="nav-item" data-page="overview">📋 Übersicht</button>
<button class="nav-item" data-page="chat">💬 Chat</button>
<button class="nav-item" data-page="voice">🗣️ Voice Chat</button>
<button class="nav-item" data-page="images">🖼️ Bilder</button>
<button class="nav-item" data-page="code">💻 Code</button>
</details>

<details open>
<summary>🧰 Clone Builder</summary>
<button class="nav-item" data-page="clone-python">🐍 Python Clone</button>
<button class="nav-item" data-page="clone-instagram">📸 Instagram Clone</button>
<button class="nav-item" data-page="clone-facebook">👥 Facebook Clone</button>
<button class="nav-item" data-page="clone-whatsapp">💬 WhatsApp Clone</button>
</details>

<details>
<summary>🛠️ Tools</summary>
<button class="nav-item" data-page="calc">🧮 Rechner</button>
<button class="nav-item" data-page="chat-tool">💬 Chat</button>
<button class="nav-item" data-page="image-tool">🖼️ Bilder Generator</button>
</details>
</nav>
</aside>

<main class="content">
<section class="panel" data-panel="home">
<h2>Sami App Programmieren</h2>
<p>Wähle links einen Bereich aus, um direkt einen Projekt-Start zu sehen.</p>
</section>

<section class="panel hidden" data-panel="clone-python">
<h2>🐍 Python Clone Starter</h2>
<p>Ein minimaler Python-Projektstarter mit Modulstruktur und CLI-Einstieg.</p>
<pre><code>project/
app/
__init__.py
main.py
tests/
test_main.py
requirements.txt</code></pre>
</section>

<section class="panel hidden" data-panel="clone-instagram">
<h2>📸 Instagram Clone Starter</h2>
<p>Vorschlag für MVP-Module: Feed, Stories, Profile, Upload, Likes und Kommentare.</p>
<ul class="check-list">
<li>Auth (Signup/Login)</li>
<li>Feed + Post Cards</li>
<li>Story Bubble UI</li>
<li>Profile Grid + Follow Button</li>
</ul>
</section>

<section class="panel hidden" data-panel="clone-facebook">
<h2>👥 Facebook Clone Starter</h2>
<p>MVP-Struktur für Timeline, Freunde, Gruppen und Benachrichtigungen.</p>
<ul class="check-list">
<li>Home Timeline mit Posts</li>
<li>Freundesliste + Requests</li>
<li>Kommentare und Reaktionen</li>
<li>Notifications Panel</li>
</ul>
</section>

<section class="panel hidden" data-panel="clone-whatsapp">
<h2>💬 WhatsApp Clone Starter</h2>
<p>Realtime-Chat Fokus: Kontaktliste, Nachrichtenansicht und Status.</p>
<ul class="check-list">
<li>Chatliste links</li>
<li>Nachrichtenfenster rechts</li>
<li>Senden/Empfangen in Echtzeit</li>
<li>Zuletzt online / Typing Status</li>
</ul>
</section>
</main>
</div>

<script src="script.js"></script>
</body>
</html>
24 changes: 24 additions & 0 deletions script.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
const navButtons = document.querySelectorAll('.nav-item');
const panels = document.querySelectorAll('.panel');

function showPanel(pageKey) {
panels.forEach((panel) => {
const isTarget = panel.dataset.panel === pageKey;
panel.classList.toggle('hidden', !isTarget);
});
}

navButtons.forEach((button) => {
button.addEventListener('click', () => {
navButtons.forEach((item) => item.classList.remove('active'));
button.classList.add('active');
Comment on lines +13 to +14
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Avoid activating nav items with no matching panel

The click handler marks every .nav-item as active before verifying that a corresponding content panel exists, so clicking entries like overview, chat, or calc (which currently have no data-panel) leaves the previous panel visible while highlighting a different nav item. This creates a broken navigation state where sidebar and content are out of sync for most menu options.

Useful? React with 👍 / 👎.


const page = button.dataset.page;
if (!page) return;

const pageExists = [...panels].some((panel) => panel.dataset.panel === page);
if (pageExists) {
showPanel(page);
}
});
});
146 changes: 146 additions & 0 deletions styles.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,146 @@
:root {
--bg: #06080f;
--accent: #27b3ff;
--text: #e8f4ff;
--text-muted: #8eb3ce;
}

* { box-sizing: border-box; }

body {
margin: 0;
font-family: Inter, "Segoe UI", Arial, sans-serif;
color: var(--text);
background: radial-gradient(circle at top right, #0a1630 0, var(--bg) 55%);
}

.app-shell {
min-height: 100vh;
display: grid;
grid-template-columns: 340px 1fr;
}

.sidebar {
border-right: 2px solid var(--accent);
background: linear-gradient(180deg, rgba(0, 0, 0, 0.96), #04070f);
padding: 1rem;
overflow: auto;
}

.profile-card,
.stats-card {
border: 1px solid rgba(39, 179, 255, 0.75);
border-radius: 14px;
padding: 1rem;
margin-bottom: 1rem;
}

.profile-card {
background: linear-gradient(140deg, #1e9ce6, #1c6ea5);
text-align: center;
}

.avatar {
width: 76px;
height: 76px;
margin: 0 auto 0.75rem;
border-radius: 999px;
background: rgba(255, 255, 255, 0.18);
display: grid;
place-items: center;
font-size: 1.8rem;
}

.profile-card h1 { margin: 0; }
.username { color: #d3edff; margin: .4rem 0 .8rem; }
.level {
display: inline-block;
background: #ff657b;
padding: .35rem .9rem;
border-radius: 999px;
font-weight: 700;
}

.stats-card { background: #080c16; }
.stats-card h2 {
margin: 0 0 .6rem;
color: var(--accent);
text-transform: uppercase;
font-size: .9rem;
}
.stats-card ul { list-style: none; padding: 0; margin: 0; }
.stats-card li {
display: flex;
justify-content: space-between;
padding: .4rem 0;
}
.stats-card strong { color: var(--accent); }

.section-title {
color: var(--accent);
text-transform: uppercase;
font-weight: 700;
font-size: .82rem;
letter-spacing: .08em;
}

summary {
cursor: pointer;
padding: .9rem .7rem;
border-radius: 10px;
list-style: none;
}
summary::-webkit-details-marker { display: none; }

.nav-item {
width: 100%;
background: linear-gradient(90deg, #072034, #0f3048);
color: #eaf6ff;
border: 0;
border-radius: 12px;
font-size: 1rem;
text-align: left;
padding: .9rem 1rem;
margin: .3rem 0;
cursor: pointer;
}

.nav-item.active { background: linear-gradient(90deg, #30b7ff, #1d5f8c); }

.content {
padding: 1.2rem;
display: grid;
align-content: start;
gap: 1rem;
}

.panel {
background: rgba(12, 17, 29, .85);
border: 1px solid rgba(39, 179, 255, 0.45);
border-radius: 14px;
padding: 1rem 1.2rem;
}

.panel h2 { margin-top: 0; }
.panel p { color: var(--text-muted); }

pre {
background: #020409;
border-radius: 8px;
padding: .8rem;
overflow-x: auto;
border: 1px solid #0e3148;
}

.check-list { margin: 0; padding-left: 1.2rem; }
.check-list li { margin: .45rem 0; }
.hidden { display: none; }

@media (max-width: 900px) {
.app-shell { grid-template-columns: 1fr; }
.sidebar {
border-right: 0;
border-bottom: 2px solid var(--accent);
max-height: 60vh;
}
}