diff --git a/package.json b/package.json
index 0545857..3dbe3c7 100644
--- a/package.json
+++ b/package.json
@@ -5,6 +5,7 @@
"type": "module",
"scripts": {
"dev": "gen-branches && vite",
+ "dev": "node scripts/gen-branches.cjs && vite",
"build": "tsc -b && vite build",
"lint": "eslint .",
"preview": "vite preview",
@@ -28,4 +29,4 @@
"typescript-eslint": "^8.11.0",
"vite": "^5.4.10"
}
-}
+}
\ No newline at end of file
diff --git a/src/generated/branches.ts b/src/generated/branches.ts
index 7a56c3b..2cf7652 100644
--- a/src/generated/branches.ts
+++ b/src/generated/branches.ts
@@ -2,170 +2,682 @@
import type { BranchData } from "../types";
const data: BranchData = {
- "generatedAt": "2026-04-26T22:06:42.722Z",
- "currentBranch": "",
+ "generatedAt": "2026-05-26T12:09:11.294Z",
+ "currentBranch": "stars-green-johnny-update-team1-bracha",
"mainBranch": "master",
"branches": [
+ {
+ "name": "ChavivaSeiff",
+ "parentBranch": null,
+ "shortHash": "",
+ "lastCommitMessage": "",
+ "isMergedIntoParent": false,
+ "isCurrent": false
+ },
+ {
+ "name": "Eti-NewJoke",
+ "parentBranch": null,
+ "shortHash": "",
+ "lastCommitMessage": "",
+ "isMergedIntoParent": false,
+ "isCurrent": false
+ },
+ {
+ "name": "Eti-Orenbach",
+ "parentBranch": null,
+ "shortHash": "",
+ "lastCommitMessage": "",
+ "isMergedIntoParent": false,
+ "isCurrent": false
+ },
+ {
+ "name": "Hilla_Arye",
+ "parentBranch": null,
+ "shortHash": "",
+ "lastCommitMessage": "",
+ "isMergedIntoParent": false,
+ "isCurrent": false
+ },
+ {
+ "name": "Hilla_Arye_2",
+ "parentBranch": null,
+ "shortHash": "",
+ "lastCommitMessage": "",
+ "isMergedIntoParent": false,
+ "isCurrent": false
+ },
+ {
+ "name": "Maayan-Bukrits",
+ "parentBranch": null,
+ "shortHash": "",
+ "lastCommitMessage": "",
+ "isMergedIntoParent": false,
+ "isCurrent": false
+ },
+ {
+ "name": "MaayanBaba",
+ "parentBranch": null,
+ "shortHash": "",
+ "lastCommitMessage": "",
+ "isMergedIntoParent": false,
+ "isCurrent": false
+ },
+ {
+ "name": "RivkaBarashi",
+ "parentBranch": null,
+ "shortHash": "",
+ "lastCommitMessage": "",
+ "isMergedIntoParent": false,
+ "isCurrent": false
+ },
+ {
+ "name": "Shira-Shemesh",
+ "parentBranch": null,
+ "shortHash": "",
+ "lastCommitMessage": "",
+ "isMergedIntoParent": false,
+ "isCurrent": false
+ },
+ {
+ "name": "ShiraShemesh2",
+ "parentBranch": null,
+ "shortHash": "",
+ "lastCommitMessage": "",
+ "isMergedIntoParent": false,
+ "isCurrent": false
+ },
+ {
+ "name": "Vcomm",
+ "parentBranch": null,
+ "shortHash": "",
+ "lastCommitMessage": "",
+ "isMergedIntoParent": false,
+ "isCurrent": false
+ },
+ {
+ "name": "Vcomm_1",
+ "parentBranch": null,
+ "shortHash": "",
+ "lastCommitMessage": "",
+ "isMergedIntoParent": false,
+ "isCurrent": false
+ },
+ {
+ "name": "Vcomm_2",
+ "parentBranch": null,
+ "shortHash": "",
+ "lastCommitMessage": "",
+ "isMergedIntoParent": false,
+ "isCurrent": false
+ },
+ {
+ "name": "Vcomm_3",
+ "parentBranch": null,
+ "shortHash": "",
+ "lastCommitMessage": "",
+ "isMergedIntoParent": false,
+ "isCurrent": false
+ },
+ {
+ "name": "Vcomm_3_noaNew",
+ "parentBranch": null,
+ "shortHash": "",
+ "lastCommitMessage": "",
+ "isMergedIntoParent": false,
+ "isCurrent": false
+ },
+ {
+ "name": "ayala-joke2",
+ "parentBranch": null,
+ "shortHash": "",
+ "lastCommitMessage": "",
+ "isMergedIntoParent": false,
+ "isCurrent": false
+ },
+ {
+ "name": "ayala-oshri-stars-green-johnny-update-team1",
+ "parentBranch": null,
+ "shortHash": "",
+ "lastCommitMessage": "",
+ "isMergedIntoParent": false,
+ "isCurrent": false
+ },
+ {
+ "name": "ayala-samson",
+ "parentBranch": null,
+ "shortHash": "",
+ "lastCommitMessage": "",
+ "isMergedIntoParent": false,
+ "isCurrent": false
+ },
+ {
+ "name": "hadar-gerafi",
+ "parentBranch": null,
+ "shortHash": "",
+ "lastCommitMessage": "",
+ "isMergedIntoParent": false,
+ "isCurrent": false
+ },
+ {
+ "name": "hadas-karasenti",
+ "parentBranch": null,
+ "shortHash": "",
+ "lastCommitMessage": "",
+ "isMergedIntoParent": false,
+ "isCurrent": false
+ },
+ {
+ "name": "johnny-update-3",
+ "parentBranch": null,
+ "shortHash": "",
+ "lastCommitMessage": "",
+ "isMergedIntoParent": false,
+ "isCurrent": false
+ },
+ {
+ "name": "johnny-update-team3-Eti_Munk",
+ "parentBranch": null,
+ "shortHash": "",
+ "lastCommitMessage": "",
+ "isMergedIntoParent": false,
+ "isCurrent": false
+ },
+ {
+ "name": "kiter-2-RachelWeinberger",
+ "parentBranch": null,
+ "shortHash": "",
+ "lastCommitMessage": "",
+ "isMergedIntoParent": false,
+ "isCurrent": false
+ },
+ {
+ "name": "kitera",
+ "parentBranch": null,
+ "shortHash": "",
+ "lastCommitMessage": "",
+ "isMergedIntoParent": false,
+ "isCurrent": false
+ },
+ {
+ "name": "kiteria-1",
+ "parentBranch": null,
+ "shortHash": "",
+ "lastCommitMessage": "",
+ "isMergedIntoParent": false,
+ "isCurrent": false
+ },
+ {
+ "name": "kiteria-1-chedvaf",
+ "parentBranch": null,
+ "shortHash": "",
+ "lastCommitMessage": "",
+ "isMergedIntoParent": false,
+ "isCurrent": false
+ },
+ {
+ "name": "kiteria-1-efrat",
+ "parentBranch": null,
+ "shortHash": "",
+ "lastCommitMessage": "",
+ "isMergedIntoParent": false,
+ "isCurrent": false
+ },
+ {
+ "name": "kiteria-2",
+ "parentBranch": null,
+ "shortHash": "",
+ "lastCommitMessage": "",
+ "isMergedIntoParent": false,
+ "isCurrent": false
+ },
+ {
+ "name": "kiteria-2-yehudit",
+ "parentBranch": null,
+ "shortHash": "",
+ "lastCommitMessage": "",
+ "isMergedIntoParent": false,
+ "isCurrent": false
+ },
+ {
+ "name": "kiteria-3",
+ "parentBranch": null,
+ "shortHash": "",
+ "lastCommitMessage": "",
+ "isMergedIntoParent": false,
+ "isCurrent": false
+ },
+ {
+ "name": "kiteria-3-Ayelet",
+ "parentBranch": null,
+ "shortHash": "",
+ "lastCommitMessage": "",
+ "isMergedIntoParent": false,
+ "isCurrent": false
+ },
+ {
+ "name": "kiteria-3-ester",
+ "parentBranch": null,
+ "shortHash": "",
+ "lastCommitMessage": "",
+ "isMergedIntoParent": false,
+ "isCurrent": false
+ },
+ {
+ "name": "kiteria-3_RachelPanet",
+ "parentBranch": null,
+ "shortHash": "",
+ "lastCommitMessage": "",
+ "isMergedIntoParent": false,
+ "isCurrent": false
+ },
+ {
+ "name": "kiteria_chedva",
+ "parentBranch": null,
+ "shortHash": "",
+ "lastCommitMessage": "",
+ "isMergedIntoParent": false,
+ "isCurrent": false
+ },
+ {
+ "name": "maayan-vecomm-1-vecomm",
+ "parentBranch": null,
+ "shortHash": "",
+ "lastCommitMessage": "",
+ "isMergedIntoParent": false,
+ "isCurrent": false
+ },
+ {
+ "name": "maayan2",
+ "parentBranch": null,
+ "shortHash": "",
+ "lastCommitMessage": "",
+ "isMergedIntoParent": false,
+ "isCurrent": false
+ },
{
"name": "master",
"parentBranch": null,
+ "shortHash": "0c10217",
+ "lastCommitMessage": "fix: instructions branch names",
+ "isMergedIntoParent": false,
+ "isCurrent": false
+ },
+ {
+ "name": "mayanSJoke",
+ "parentBranch": null,
"shortHash": "",
"lastCommitMessage": "",
"isMergedIntoParent": false,
"isCurrent": false
},
{
- "name": "diamond",
- "parentBranch": "master",
- "shortHash": "234",
- "lastCommitMessage": "diamond",
+ "name": "noa_gabay",
+ "parentBranch": null,
+ "shortHash": "",
+ "lastCommitMessage": "",
"isMergedIntoParent": false,
"isCurrent": false
},
{
- "name": "red",
- "parentBranch": "diamond",
- "shortHash": "23444",
- "lastCommitMessage": "moshe",
+ "name": "shani",
+ "parentBranch": null,
+ "shortHash": "",
+ "lastCommitMessage": "",
"isMergedIntoParent": false,
"isCurrent": false
},
{
- "name": "miri",
- "parentBranch": "red",
- "shortHash": "23444",
- "lastCommitMessage": "miri",
+ "name": "shani2",
+ "parentBranch": null,
+ "shortHash": "",
+ "lastCommitMessage": "",
"isMergedIntoParent": false,
"isCurrent": false
},
{
- "name": "roch",
- "parentBranch": "red",
- "shortHash": "23444",
- "lastCommitMessage": "roch ",
+ "name": "shiraGidi",
+ "parentBranch": null,
+ "shortHash": "",
+ "lastCommitMessage": "",
"isMergedIntoParent": false,
"isCurrent": false
},
{
- "name": "roch",
- "parentBranch": "red",
- "shortHash": "23444",
- "lastCommitMessage": "roch ",
+ "name": "sola",
+ "parentBranch": null,
+ "shortHash": "",
+ "lastCommitMessage": "",
"isMergedIntoParent": false,
"isCurrent": false
},
{
- "name": "avi nos",
- "parentBranch": "red",
- "shortHash": "23444",
- "lastCommitMessage": "roch ",
- "isMergedIntoParent": true,
+ "name": "sola3",
+ "parentBranch": null,
+ "shortHash": "",
+ "lastCommitMessage": "",
+ "isMergedIntoParent": false,
"isCurrent": false
},
{
- "name": "shia cjss s",
- "parentBranch": "red",
- "shortHash": "23444",
- "lastCommitMessage": "roch ",
+ "name": "sola4",
+ "parentBranch": null,
+ "shortHash": "",
+ "lastCommitMessage": "",
"isMergedIntoParent": false,
"isCurrent": false
},
{
- "name": "blue",
- "parentBranch": "diamond",
- "shortHash": "23444",
- "lastCommitMessage": "moshe",
+ "name": "sola_sola1",
+ "parentBranch": null,
+ "shortHash": "",
+ "lastCommitMessage": "",
"isMergedIntoParent": false,
"isCurrent": false
},
{
- "name": "red",
- "parentBranch": "diamond",
- "shortHash": "23444",
- "lastCommitMessage": "moshe",
+ "name": "sola_sola1_carmi",
+ "parentBranch": null,
+ "shortHash": "",
+ "lastCommitMessage": "",
"isMergedIntoParent": false,
- "isCurrent": true
+ "isCurrent": false
+ },
+ {
+ "name": "sola_sola1_malka",
+ "parentBranch": null,
+ "shortHash": "",
+ "lastCommitMessage": "",
+ "isMergedIntoParent": false,
+ "isCurrent": false
+ },
+ {
+ "name": "sola_sola1_ruti",
+ "parentBranch": null,
+ "shortHash": "",
+ "lastCommitMessage": "",
+ "isMergedIntoParent": false,
+ "isCurrent": false
+ },
+ {
+ "name": "sola_sola1_sari",
+ "parentBranch": null,
+ "shortHash": "",
+ "lastCommitMessage": "",
+ "isMergedIntoParent": false,
+ "isCurrent": false
+ },
+ {
+ "name": "sola_sola1_shifraZ",
+ "parentBranch": null,
+ "shortHash": "",
+ "lastCommitMessage": "",
+ "isMergedIntoParent": false,
+ "isCurrent": false
+ },
+ {
+ "name": "sola_sola2",
+ "parentBranch": null,
+ "shortHash": "",
+ "lastCommitMessage": "",
+ "isMergedIntoParent": false,
+ "isCurrent": false
+ },
+ {
+ "name": "sola_sola2-Tamar",
+ "parentBranch": null,
+ "shortHash": "",
+ "lastCommitMessage": "",
+ "isMergedIntoParent": false,
+ "isCurrent": false
+ },
+ {
+ "name": "sola_sola2_gili",
+ "parentBranch": null,
+ "shortHash": "",
+ "lastCommitMessage": "",
+ "isMergedIntoParent": false,
+ "isCurrent": false
+ },
+ {
+ "name": "sola_sola2_hadas",
+ "parentBranch": null,
+ "shortHash": "",
+ "lastCommitMessage": "",
+ "isMergedIntoParent": false,
+ "isCurrent": false
+ },
+ {
+ "name": "sola_sola2_tamarD",
+ "parentBranch": null,
+ "shortHash": "",
+ "lastCommitMessage": "",
+ "isMergedIntoParent": false,
+ "isCurrent": false
+ },
+ {
+ "name": "sola_sola2_yehudit",
+ "parentBranch": null,
+ "shortHash": "",
+ "lastCommitMessage": "",
+ "isMergedIntoParent": false,
+ "isCurrent": false
+ },
+ {
+ "name": "sola_sola3_Efrat_Madmon",
+ "parentBranch": null,
+ "shortHash": "",
+ "lastCommitMessage": "",
+ "isMergedIntoParent": false,
+ "isCurrent": false
+ },
+ {
+ "name": "sola_sola3_saralevin",
+ "parentBranch": null,
+ "shortHash": "",
+ "lastCommitMessage": "",
+ "isMergedIntoParent": false,
+ "isCurrent": false
+ },
+ {
+ "name": "sola_sola3_yaeli",
+ "parentBranch": null,
+ "shortHash": "",
+ "lastCommitMessage": "",
+ "isMergedIntoParent": false,
+ "isCurrent": false
+ },
+ {
+ "name": "stars",
+ "parentBranch": null,
+ "shortHash": "",
+ "lastCommitMessage": "",
+ "isMergedIntoParent": false,
+ "isCurrent": false
+ },
+ {
+ "name": "stars-green",
+ "parentBranch": null,
+ "shortHash": "",
+ "lastCommitMessage": "",
+ "isMergedIntoParent": false,
+ "isCurrent": false
+ },
+ {
+ "name": "stars-green-bat-sheva-bloch",
+ "parentBranch": null,
+ "shortHash": "",
+ "lastCommitMessage": "",
+ "isMergedIntoParent": false,
+ "isCurrent": false
+ },
+ {
+ "name": "stars-green-johnny-update-team1",
+ "parentBranch": null,
+ "shortHash": "0c10217",
+ "lastCommitMessage": "fix: instructions branch names",
+ "isMergedIntoParent": false,
+ "isCurrent": false
+ },
+ {
+ "name": "stars-green-johnny-update-team1-Tamar",
+ "parentBranch": null,
+ "shortHash": "",
+ "lastCommitMessage": "",
+ "isMergedIntoParent": false,
+ "isCurrent": false
+ },
+ {
+ "name": "stars-green-johnny-update-team1-Yael",
+ "parentBranch": null,
+ "shortHash": "",
+ "lastCommitMessage": "",
+ "isMergedIntoParent": false,
+ "isCurrent": false
},
{
- "name": "star",
+ "name": "stars-green-johnny-update-team1-bracha",
"parentBranch": "master",
- "shortHash": "23454",
- "lastCommitMessage": "yos",
- "isMergedIntoParent": true,
+ "shortHash": "f0c8976",
+ "lastCommitMessage": "fix: resolve sync syntax error and update student list",
+ "isMergedIntoParent": false,
+ "isCurrent": true
+ },
+ {
+ "name": "stars-green-johnny-update-team2",
+ "parentBranch": null,
+ "shortHash": "0c10217",
+ "lastCommitMessage": "fix: instructions branch names",
+ "isMergedIntoParent": false,
"isCurrent": false
},
{
- "name": "green",
- "parentBranch": "star",
- "shortHash": "23454",
- "lastCommitMessage": "green",
- "isMergedIntoParent": true,
+ "name": "stars-green-johnny-update-team2-LitalShamanov",
+ "parentBranch": null,
+ "shortHash": "",
+ "lastCommitMessage": "",
+ "isMergedIntoParent": false,
"isCurrent": false
},
{
- "name": "tut",
- "parentBranch": "green",
- "shortHash": "23454",
- "lastCommitMessage": "green",
- "isMergedIntoParent": true,
+ "name": "stars-green-johnny-update-team3",
+ "parentBranch": null,
+ "shortHash": "",
+ "lastCommitMessage": "",
+ "isMergedIntoParent": false,
"isCurrent": false
},
{
- "name": "brach",
- "parentBranch": "green",
- "shortHash": "23454",
- "lastCommitMessage": "green",
- "isMergedIntoParent": true,
+ "name": "stars-green-johnny-update-team3-Zehavi",
+ "parentBranch": null,
+ "shortHash": "",
+ "lastCommitMessage": "",
+ "isMergedIntoParent": false,
"isCurrent": false
},
{
- "name": "yochi",
- "parentBranch": "green",
- "shortHash": "23454",
- "lastCommitMessage": "green",
- "isMergedIntoParent": true,
+ "name": "stars-green-johnny-update-team3-chanaMoshayev",
+ "parentBranch": null,
+ "shortHash": "",
+ "lastCommitMessage": "",
+ "isMergedIntoParent": false,
"isCurrent": false
},
{
- "name": "sjn cjknd",
- "parentBranch": "green",
- "shortHash": "23454",
- "lastCommitMessage": "green",
- "isMergedIntoParent": true,
+ "name": "stars-green-jonny-update-miryam-dahari",
+ "parentBranch": null,
+ "shortHash": "",
+ "lastCommitMessage": "",
+ "isMergedIntoParent": false,
"isCurrent": false
},
{
- "name": "yellow",
- "parentBranch": "star",
- "shortHash": "23454",
- "lastCommitMessage": "yellow fkgnlfg df",
- "isMergedIntoParent": true,
+ "name": "tamar-levi-branch",
+ "parentBranch": null,
+ "shortHash": "",
+ "lastCommitMessage": "",
+ "isMergedIntoParent": false,
+ "isCurrent": false
+ },
+ {
+ "name": "team/vcomm/sub/vcomm3/noagabay",
+ "parentBranch": null,
+ "shortHash": "",
+ "lastCommitMessage": "",
+ "isMergedIntoParent": false,
+ "isCurrent": false
+ },
+ {
+ "name": "tovi",
+ "parentBranch": null,
+ "shortHash": "",
+ "lastCommitMessage": "",
+ "isMergedIntoParent": false,
"isCurrent": false
},
{
- "name": "hjdf df",
- "parentBranch": "yellow",
- "shortHash": "23454",
- "lastCommitMessage": "yellow fkgnlfg df",
- "isMergedIntoParent": true,
+ "name": "vcomm/vcomm-1/ShiraShemesh",
+ "parentBranch": null,
+ "shortHash": "",
+ "lastCommitMessage": "",
+ "isMergedIntoParent": false,
"isCurrent": false
},
{
- "name": "gfkj dfkn",
- "parentBranch": "yellow",
- "shortHash": "23454",
- "lastCommitMessage": "yellow fkgnlfg df",
- "isMergedIntoParent": true,
+ "name": "vcomm/vcomm-1/ShiraShemesh2",
+ "parentBranch": null,
+ "shortHash": "",
+ "lastCommitMessage": "",
+ "isMergedIntoParent": false,
"isCurrent": false
},
{
- "name": "fldngk df",
- "parentBranch": "yellow",
- "shortHash": "23454",
- "lastCommitMessage": "yellow fkgnlfg df",
- "isMergedIntoParent": true,
+ "name": "vcomm/vcomm-1/tova",
+ "parentBranch": null,
+ "shortHash": "",
+ "lastCommitMessage": "",
+ "isMergedIntoParent": false,
"isCurrent": false
},
+ {
+ "name": "vcomm/vcomm-1/tovi",
+ "parentBranch": null,
+ "shortHash": "",
+ "lastCommitMessage": "",
+ "isMergedIntoParent": false,
+ "isCurrent": false
+ },
+ {
+ "name": "vcomm/vcomm-1/tovi-joke2",
+ "parentBranch": null,
+ "shortHash": "",
+ "lastCommitMessage": "",
+ "isMergedIntoParent": false,
+ "isCurrent": false
+ },
+ {
+ "name": "vcomm/vcomm3/ayalaKlein",
+ "parentBranch": null,
+ "shortHash": "",
+ "lastCommitMessage": "",
+ "isMergedIntoParent": false,
+ "isCurrent": false
+ },
+ {
+ "name": "yonny",
+ "parentBranch": null,
+ "shortHash": "",
+ "lastCommitMessage": "",
+ "isMergedIntoParent": false,
+ "isCurrent": false
+ },
+ {
+ "name": "yonny-update-saraRafalowitz",
+ "parentBranch": null,
+ "shortHash": "",
+ "lastCommitMessage": "",
+ "isMergedIntoParent": false,
+ "isCurrent": false
+ }
]
};
diff --git a/src/index.css b/src/index.css
index 031d4ad..272934c 100644
--- a/src/index.css
+++ b/src/index.css
@@ -184,7 +184,7 @@ body {
display: flex;
flex-direction: column;
gap: 0;
- margin: 1rem 0;
+ margin: 1rem 0;
}
.branch-level {
diff --git a/src/students/ayala oshri/Card.tsx b/src/students/ayala oshri/Card.tsx
new file mode 100644
index 0000000..620fe63
--- /dev/null
+++ b/src/students/ayala oshri/Card.tsx
@@ -0,0 +1,24 @@
+import styles from "./styles.module.css";
+import { CardProps } from "../../types";
+
+export default function MyCard({ student, onClick }: CardProps) {
+ return (
+
+ {/* Decorative bubbles */}
+
+
+
+
+
+ {/* Duck icon */}
+
🛁
+
+
{student.jokeTitle}
+
{student.name}
+
+
+ לחץ לצחוק 🫧
+
+
+ );
+}
\ No newline at end of file
diff --git a/src/students/ayala oshri/JokePage.tsx b/src/students/ayala oshri/JokePage.tsx
new file mode 100644
index 0000000..79428d8
--- /dev/null
+++ b/src/students/ayala oshri/JokePage.tsx
@@ -0,0 +1,59 @@
+import styles from "./styles.module.css";
+import { PageProps } from "../../types";
+
+export default function MyJokePage({ onBack }: PageProps) {
+ return (
+
+ {/* Animated bubbles background */}
+
+ {[...Array(12)].map((_, i) => (
+
+ ))}
+
+
+ {/* Decorative top row */}
+
+ 🐥
+ 🛁
+ 🫧
+ 🚿
+ 🐥
+
+
+ {/* Joke card */}
+
+
+ ?
+
הבדיחה
+
+
+
+
למה למתכנתים לוקח הרבה זמן להתקלח?
+
+
+
+
+
+
+ כי על השמפו כתוב:
+ לחפוף, לשטוף, ולחזור על הפעולה.
+
+
+
+
+
+ ← חזרה
+
+
+ );
+}
diff --git a/src/students/ayala oshri/styles.module.css b/src/students/ayala oshri/styles.module.css
new file mode 100644
index 0000000..ae96202
--- /dev/null
+++ b/src/students/ayala oshri/styles.module.css
@@ -0,0 +1,411 @@
+/* ================================================
+ 🛁 BATH TIME KITSCH THEME
+ Bright, bubbly, playful – because code needs baths too
+ ================================================ */
+
+@import url('https://fonts.googleapis.com/css2?family=Fredoka+One&family=Varela+Round&display=swap');
+
+/* ── CSS Variables ─────────────────────────── */
+:root {
+ --bath-blue: #b3e5fc;
+ --bath-teal: #4dd0e1;
+ --bath-sky: #e1f5fe;
+ --foam-white: #ffffff;
+ --duck-yellow: #fff176;
+ --duck-orange: #ffb300;
+ --bubble-pink: #f8bbd0;
+ --bubble-lavender: #e1bee7;
+ --soft-mint: #c8e6c9;
+ --text-deep: #1a3a4a;
+ --text-mid: #2d6a8a;
+ --shadow-blue: rgba(77, 208, 225, 0.35);
+ --radius-card: 28px;
+ --radius-pill: 50px;
+}
+
+/* ── CARD ──────────────────────────────────── */
+.card {
+ position: relative;
+ overflow: hidden;
+ direction: rtl;
+ font-family: 'Fredoka One', 'Varela Round', sans-serif;
+
+ /* Bath-tile checkerboard feel via gradient mesh */
+ background:
+ radial-gradient(ellipse at 20% 20%, #e0f7fa 0%, transparent 55%),
+ radial-gradient(ellipse at 80% 80%, #fce4ec 0%, transparent 55%),
+ radial-gradient(ellipse at 80% 20%, #f3e5f5 0%, transparent 50%),
+ radial-gradient(ellipse at 20% 80%, #e8f5e9 0%, transparent 50%),
+ #dff6fd;
+
+ border: 3px solid var(--bath-teal);
+ border-radius: var(--radius-card);
+ padding: 32px 28px 24px;
+ min-width: 240px;
+ max-width: 320px;
+ cursor: pointer;
+ box-shadow:
+ 0 8px 32px var(--shadow-blue),
+ 0 2px 8px rgba(0,0,0,0.08),
+ inset 0 1px 0 rgba(255,255,255,0.9);
+
+ transition: transform 0.22s cubic-bezier(.34,1.56,.64,1),
+ box-shadow 0.22s ease;
+}
+
+/* Wet-glass shimmer overlay */
+.card::before {
+ content: '';
+ position: absolute;
+ inset: 0;
+ background: linear-gradient(
+ 135deg,
+ rgba(255,255,255,0.55) 0%,
+ rgba(255,255,255,0.05) 50%,
+ rgba(180,230,250,0.15) 100%
+ );
+ pointer-events: none;
+ border-radius: var(--radius-card);
+}
+
+/* Wavy bottom border */
+.card::after {
+ content: '';
+ position: absolute;
+ bottom: 0; left: 0; right: 0;
+ height: 48px;
+ background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 400 48'%3E%3Cpath d='M0 24 Q50 0 100 24 T200 24 T300 24 T400 24 V48 H0Z' fill='%234dd0e1' opacity='0.18'/%3E%3C/svg%3E") repeat-x bottom;
+ pointer-events: none;
+}
+
+.card:hover {
+ transform: translateY(-6px) scale(1.02);
+ box-shadow:
+ 0 18px 48px var(--shadow-blue),
+ 0 4px 12px rgba(0,0,0,0.1),
+ inset 0 1px 0 rgba(255,255,255,0.9);
+}
+
+.card:active {
+ transform: translateY(-2px) scale(0.99);
+}
+
+/* ── Duck icon ─────────────────────────────── */
+.duckIcon {
+ font-size: 2.6rem;
+ text-align: center;
+ margin-bottom: 10px;
+ filter: drop-shadow(0 3px 6px rgba(0,0,0,0.12));
+ animation: wobble 2.8s ease-in-out infinite;
+}
+
+@keyframes wobble {
+ 0%, 100% { transform: rotate(-5deg) scale(1); }
+ 50% { transform: rotate(5deg) scale(1.07); }
+}
+
+/* ── Card Title ────────────────────────────── */
+.title {
+ font-family: 'Fredoka One', sans-serif;
+ font-size: 1.4rem;
+ color: var(--text-deep);
+ text-align: center;
+ margin: 0 0 10px;
+ line-height: 1.3;
+ text-shadow: 0 2px 0 rgba(255,255,255,0.8);
+ letter-spacing: 0.02em;
+}
+
+/* ── Student Name ──────────────────────────── */
+.name {
+ font-family: 'Varela Round', sans-serif;
+ font-size: 0.95rem;
+ color: var(--text-mid);
+ text-align: center;
+ margin: 0;
+ background: rgba(255,255,255,0.65);
+ padding: 4px 16px;
+ border-radius: var(--radius-pill);
+ display: inline-block;
+ width: 100%;
+ box-sizing: border-box;
+ backdrop-filter: blur(4px);
+}
+
+/* ── Card footer ───────────────────────────── */
+.cardFooter {
+ margin-top: 16px;
+ text-align: center;
+}
+
+.clickHint {
+ font-family: 'Varela Round', sans-serif;
+ font-size: 0.8rem;
+ color: var(--bath-teal);
+ background: rgba(255,255,255,0.7);
+ padding: 3px 14px;
+ border-radius: var(--radius-pill);
+ border: 1.5px dashed var(--bath-teal);
+ animation: pulse 2s ease-in-out infinite;
+}
+
+@keyframes pulse {
+ 0%, 100% { opacity: 1; }
+ 50% { opacity: 0.55; }
+}
+
+/* ── Bubble decorations on card ────────────── */
+.bubble {
+ position: absolute;
+ border-radius: 50%;
+ background: radial-gradient(circle at 35% 35%, rgba(255,255,255,0.85), rgba(180,235,255,0.3));
+ border: 1.5px solid rgba(100,210,240,0.5);
+ pointer-events: none;
+ animation: floatBubble 3.5s ease-in-out infinite alternate;
+}
+
+@keyframes floatBubble {
+ 0% { transform: translateY(0) scale(1); opacity: 0.7; }
+ 100% { transform: translateY(-6px) scale(1.1); opacity: 1; }
+}
+
+
+/* ════════════════════════════════════════════
+ 🛁 JOKE PAGE
+ ════════════════════════════════════════════ */
+
+.jokePage {
+ position: relative;
+ direction: rtl;
+ font-family: 'Fredoka One', 'Varela Round', sans-serif;
+ min-height: 100vh;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ padding: 32px 20px;
+ overflow: hidden;
+
+ /* Sky-blue + foam gradient background */
+ background:
+ radial-gradient(ellipse at 15% 15%, #fff9c4 0%, transparent 40%),
+ radial-gradient(ellipse at 85% 85%, #f8bbd0 0%, transparent 40%),
+ radial-gradient(ellipse at 85% 15%, #b3e5fc 0%, transparent 45%),
+ radial-gradient(ellipse at 15% 85%, #c8e6c9 0%, transparent 45%),
+ linear-gradient(160deg, #e1f5fe 0%, #fce4ec 50%, #e8f5e9 100%);
+}
+
+/* ── Floating animated bubbles bg ─────────── */
+.bubblesContainer {
+ position: absolute;
+ inset: 0;
+ pointer-events: none;
+ overflow: hidden;
+}
+
+.floatingBubble {
+ position: absolute;
+ bottom: -40px;
+ border-radius: 50%;
+ background: radial-gradient(circle at 35% 30%, rgba(255,255,255,0.9), rgba(180,235,255,0.25));
+ border: 1.5px solid rgba(120,210,240,0.45);
+ animation: rise linear infinite;
+}
+
+@keyframes rise {
+ 0% { transform: translateY(0) scale(0.8); opacity: 0; }
+ 10% { opacity: 0.7; }
+ 90% { opacity: 0.5; }
+ 100% { transform: translateY(-110vh) scale(1.15); opacity: 0; }
+}
+
+/* ── Top decorative emoji row ──────────────── */
+.topDecor {
+ display: flex;
+ gap: 18px;
+ font-size: 1.8rem;
+ margin-bottom: 28px;
+ position: relative;
+ z-index: 2;
+ filter: drop-shadow(0 2px 4px rgba(0,0,0,0.12));
+}
+
+.topDecor span {
+ animation: bounce 1.8s ease-in-out infinite;
+}
+.topDecor span:nth-child(2) { animation-delay: 0.2s; }
+.topDecor span:nth-child(3) { animation-delay: 0.4s; }
+.topDecor span:nth-child(4) { animation-delay: 0.6s; }
+.topDecor span:nth-child(5) { animation-delay: 0.8s; }
+
+@keyframes bounce {
+ 0%, 100% { transform: translateY(0); }
+ 50% { transform: translateY(-8px); }
+}
+
+/* ── Main Joke Card ────────────────────────── */
+.jokeCard {
+ position: relative;
+ z-index: 2;
+ background:
+ radial-gradient(ellipse at 10% 10%, rgba(255,255,255,0.9) 0%, transparent 60%),
+ rgba(255,255,255,0.75);
+ backdrop-filter: blur(12px);
+ -webkit-backdrop-filter: blur(12px);
+ border: 3px solid var(--bath-teal);
+ border-radius: 36px;
+ padding: 36px 40px;
+ max-width: 480px;
+ width: 100%;
+ box-shadow:
+ 0 16px 48px rgba(77,208,225,0.28),
+ 0 4px 16px rgba(0,0,0,0.08),
+ inset 0 2px 0 rgba(255,255,255,0.95);
+
+ /* Entrance animation */
+ animation: slideUp 0.55s cubic-bezier(.34,1.56,.64,1) both;
+}
+
+@keyframes slideUp {
+ from { opacity: 0; transform: translateY(40px) scale(0.95); }
+ to { opacity: 1; transform: translateY(0) scale(1); }
+}
+
+/* Wavy top ribbon */
+.jokeCard::before {
+ content: '';
+ position: absolute;
+ top: 0; left: 0; right: 0;
+ height: 54px;
+ background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 480 54'%3E%3Cpath d='M0 32 Q60 8 120 32 T240 32 T360 32 T480 32 V0 H0Z' fill='%234dd0e1' opacity='0.22'/%3E%3C/svg%3E") no-repeat top;
+ border-radius: 36px 36px 0 0;
+ pointer-events: none;
+}
+
+/* ── Joke header ───────────────────────────── */
+.jokeHeader {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ gap: 10px;
+ margin-bottom: 20px;
+}
+
+.questionMark {
+ width: 38px;
+ height: 38px;
+ background: linear-gradient(135deg, var(--duck-yellow), var(--duck-orange));
+ border-radius: 50%;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 1.3rem;
+ font-weight: bold;
+ color: #5d4000;
+ box-shadow: 0 3px 10px rgba(255,179,0,0.35);
+ line-height: 38px;
+ text-align: center;
+}
+
+.jokeLabel {
+ font-family: 'Fredoka One', sans-serif;
+ font-size: 1.2rem;
+ color: var(--text-mid);
+ margin: 0;
+ letter-spacing: 0.04em;
+}
+
+/* ── Question block ────────────────────────── */
+.questionBlock {
+ background: linear-gradient(135deg, #e3f7ff, #f0fbff);
+ border-radius: 20px;
+ padding: 20px 24px;
+ border: 2px solid rgba(77,208,225,0.4);
+ margin-bottom: 18px;
+}
+
+.jokeQuestion {
+ font-family: 'Fredoka One', sans-serif;
+ font-size: 1.25rem;
+ color: var(--text-deep);
+ text-align: center;
+ margin: 0;
+ line-height: 1.55;
+ text-shadow: 0 1px 0 rgba(255,255,255,0.8);
+}
+
+/* ── Divider ───────────────────────────────── */
+.dividerRow {
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ margin: 6px 0 18px;
+}
+
+.dividerLine {
+ flex: 1;
+ height: 2px;
+ background: linear-gradient(90deg, transparent, var(--bath-teal), transparent);
+ border-radius: 2px;
+}
+
+.dividerEmoji {
+ font-size: 1.1rem;
+}
+
+/* ── Answer block ──────────────────────────── */
+.answerBlock {
+ background: linear-gradient(135deg, #fff8e1, #fffde7);
+ border-radius: 20px;
+ padding: 20px 24px;
+ border: 2px solid rgba(255,202,40,0.45);
+}
+
+.jokeAnswer {
+ font-family: 'Varela Round', sans-serif;
+ font-size: 1.1rem;
+ color: var(--text-deep);
+ text-align: center;
+ margin: 0;
+ line-height: 1.7;
+}
+
+.jokeAnswer strong {
+ font-family: 'Fredoka One', sans-serif;
+ font-size: 1.15rem;
+ color: #b45309;
+ display: block;
+ margin-top: 6px;
+}
+
+/* ── Back button ───────────────────────────── */
+.backButton {
+ position: relative;
+ z-index: 2;
+ margin-top: 28px;
+ padding: 12px 36px;
+ font-family: 'Fredoka One', sans-serif;
+ font-size: 1.05rem;
+ color: var(--foam-white);
+ background: linear-gradient(135deg, var(--bath-teal) 0%, #26c6da 100%);
+ border: none;
+ border-radius: var(--radius-pill);
+ cursor: pointer;
+ box-shadow:
+ 0 6px 20px rgba(77,208,225,0.45),
+ 0 2px 6px rgba(0,0,0,0.1);
+ letter-spacing: 0.04em;
+ transition: transform 0.18s cubic-bezier(.34,1.56,.64,1),
+ box-shadow 0.18s ease;
+}
+
+.backButton:hover {
+ transform: translateY(-3px) scale(1.04);
+ box-shadow:
+ 0 12px 28px rgba(77,208,225,0.5),
+ 0 4px 10px rgba(0,0,0,0.1);
+}
+
+.backButton:active {
+ transform: scale(0.97);
+}
diff --git a/src/students/bracha-pappenheim/Card.tsx b/src/students/bracha-pappenheim/Card.tsx
new file mode 100644
index 0000000..ebf5191
--- /dev/null
+++ b/src/students/bracha-pappenheim/Card.tsx
@@ -0,0 +1,11 @@
+import styles from "./styles.module.css";
+import { CardProps } from "../../types";
+
+export default function BrachaCard({ student, onClick }: CardProps) {
+ return (
+
+
{student.jokeTitle}
+
{student.name}
+
+ );
+}
\ No newline at end of file
diff --git a/src/students/bracha-pappenheim/JokePage.tsx b/src/students/bracha-pappenheim/JokePage.tsx
new file mode 100644
index 0000000..a1a523a
--- /dev/null
+++ b/src/students/bracha-pappenheim/JokePage.tsx
@@ -0,0 +1,13 @@
+import styles from "./styles.module.css";
+import { PageProps } from "../../types";
+
+export default function brachaJokePage({ onBack }: PageProps) {
+ return (
+
+
בדיחה מאד מצחיקה למתכנת סטלן
+
מה קורה כשמתכנת סטלן מנסה לדאבג (Debug) קוד?
+ הוא מוצא באג, בוהה בו עשר דקות, ואז אומר: "וואו אחי... בעצם, מי אמר שזו טעות? אולי זה פשוט ה-Feature של היקום..."
+
← חזרה
+
+ );
+}
\ No newline at end of file
diff --git a/src/students/bracha-pappenheim/styles.module.css b/src/students/bracha-pappenheim/styles.module.css
new file mode 100644
index 0000000..d85c3a8
--- /dev/null
+++ b/src/students/bracha-pappenheim/styles.module.css
@@ -0,0 +1,95 @@
+/* סגנון כללי לדף הבדיחה */
+.jokePage {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ min-height: 200px;
+ padding: 2rem;
+ background-color: #1e1e24;
+ color: #f4f4f6;
+ border-radius: 16px;
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.25);
+ max-width: 600px;
+ margin: 2rem auto;
+ text-align: center;
+ font-family: system-ui, -apple-system, sans-serif;
+ border: 1px solid #3a3a45;
+}
+
+/* כותרת או טקסט מודגש בתוך הדף */
+.jokePage p:first-of-type {
+ font-size: 1.4rem;
+ font-weight: 700;
+ color: #4ade80;
+ margin-bottom: 1.5rem;
+}
+
+/* תוכן הבדיחה עצמה */
+.jokePage p:last-of-type {
+ font-size: 1.15rem;
+ line-height: 1.6;
+ color: #e2e8f0;
+ margin-bottom: 2rem;
+ background: #2d2d38;
+ padding: 1.5rem;
+ border-radius: 12px;
+ border-right: 4px solid #4ade80; /* הדגשה בצד ימין בגלל העברית */
+}
+
+/* כפתור חזרה */
+.jokePage button {
+ background-color: transparent;
+ color: #a78bfa; /* סגול בהיר */
+ border: 2px solid #a78bfa;
+ padding: 0.6rem 1.5rem;
+ font-size: 1rem;
+ font-weight: 600;
+ border-radius: 8px;
+ cursor: pointer;
+ transition: all 0.3s ease;
+}
+
+.jokePage button:hover {
+ background-color: #a78bfa;
+ color: #1e1e24;
+ box-shadow: 0 0 15px rgba(167, 139, 250, 0.4);
+ transform: translateY(-2px);
+}
+
+/* --- עיצוב לכרטיס הבדיחה (BrachaCard) --- */
+
+.card {
+ background: #25252f;
+ border: 1px solid #3f3f46;
+ border-radius: 12px;
+ padding: 1.5rem;
+ margin: 1rem auto;
+ max-width: 400px;
+ cursor: pointer;
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
+}
+
+/* אפקט ריחוף על הכרטיס */
+.card:hover {
+ transform: translateY(-4px);
+ border-color: #60a5fa; /* כחול מודרני בטעינה */
+ box-shadow: 0 10px 20px rgba(0, 0, 0, 0.3), 0 0 8px rgba(96, 165, 250, 0.2);
+}
+
+/* כותרת הבדיחה בכרטיס */
+.title {
+ margin: 0 0 0.75rem 0;
+ font-size: 1.25rem;
+ color: #f3f4f6;
+ font-weight: 600;
+}
+
+/* שם הסטודנט */
+.name {
+ margin: 0;
+ font-size: 0.95rem;
+ color: #9ca3af;
+ font-style: italic;
+}
\ No newline at end of file
diff --git a/src/students/index.ts b/src/students/index.ts
index 5be78e7..a8d82e2 100644
--- a/src/students/index.ts
+++ b/src/students/index.ts
@@ -5,11 +5,28 @@ import DanaDuviJokePage from "./dana-duvi/JokePage";
import ChaniChanzinCard from "./chani-chanzin/Card";
import ChaniChanzinJokePage from "./chani-chanzin/JokePage";
+import YaelCard from "./yael-shoham/Card";
+import YaelJokePage from "./yael-shoham/JokePage";
+
+import AyalaOshriCard from "./ayala oshri/Card";
+import AyalaOshriJokePage from "./ayala oshri/JokePage";
+import BrachaCard from "./bracha-pappenheim/Card";
+import brachaJokePage from "./bracha-pappenheim/JokePage";
+
+import TamarCard from "./tamar-lev/Card";
+import TamarJokePage from "./tamar-lev/JokePage";
// ⚠️ סדר הרשימה חייב להיות לפי סדר האלף-בית העברי לפי שם המשפחה.
// כל תלמידה מוסיפה את עצמה במקום הנכון ידנית.
-// אסור להשתמש בפונקציית-sort!
+// אסור להשתמש בפונקציית-sort!
const students: Student[] = [
+ {
+ id: "bracha-pappenheim",
+ name: "ברכה פפנהיים",
+ jokeTitle: "שלום וברכה!",
+ CardComponent: BrachaCard,
+ JokePageComponent: brachaJokePage,
+ },
{
id: "dana-duvi",
name: "דנה דובי",
@@ -17,6 +34,13 @@ const students: Student[] = [
CardComponent: DanaDuviCard,
JokePageComponent: DanaDuviJokePage,
},
+ {
+ id: "Yael-Shoham",
+ name: "יעל שהם",
+ jokeTitle: "הילד המדבר",
+ CardComponent: YaelCard,
+ JokePageComponent: YaelJokePage,
+ },
{
id: "chani-chanzin",
name: "חני חנזין",
@@ -24,6 +48,21 @@ const students: Student[] = [
CardComponent: ChaniChanzinCard,
JokePageComponent: ChaniChanzinJokePage,
},
+ {
+ id: "Tamar-Lev",
+ name: "תמר לב",
+ jokeTitle: "החושך והאור",
+ CardComponent: TamarCard,
+ JokePageComponent: TamarJokePage,
+ },
+ {
+ id: "ayala-oshri",
+ name: "אילה עושרי",
+ jokeTitle: "לולאה אינסופית",
+ CardComponent: AyalaOshriCard,
+ JokePageComponent: AyalaOshriJokePage,
+ }
+
];
export default students;
diff --git a/src/students/tamar-lev/Card.tsx b/src/students/tamar-lev/Card.tsx
new file mode 100644
index 0000000..258d700
--- /dev/null
+++ b/src/students/tamar-lev/Card.tsx
@@ -0,0 +1,11 @@
+import styles from "./styles.module.css";
+import { CardProps } from "../../types";
+
+export default function TamarCard({ student, onClick }: CardProps) {
+ return (
+
+
{student.jokeTitle}
+
{student.name}
+
+ );
+}
\ No newline at end of file
diff --git a/src/students/tamar-lev/JokePage.tsx b/src/students/tamar-lev/JokePage.tsx
new file mode 100644
index 0000000..2daaf60
--- /dev/null
+++ b/src/students/tamar-lev/JokePage.tsx
@@ -0,0 +1,12 @@
+import styles from "./styles.module.css";
+import { PageProps } from "../../types";
+
+export default function TamarJokePage({ onBack }: PageProps) {
+ return (
+
+
למה מתכנתים מעדיפים מצב חשוך?
+
כי האור מושך באגים!
+
← חזרה
+
+ );
+}
\ No newline at end of file
diff --git a/src/students/tamar-lev/styles.module.css b/src/students/tamar-lev/styles.module.css
new file mode 100644
index 0000000..ab1d8d2
--- /dev/null
+++ b/src/students/tamar-lev/styles.module.css
@@ -0,0 +1,82 @@
+/* עיצוב לעמוד הבדיחה הראשי */
+.jokePage {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ min-height: 50vh;
+ background-color: #1a1a1a; /* רקע כהה */
+ color: #ffffff; /* טקסט לבן */
+ padding: 40px;
+ border-radius: 12px;
+ box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3);
+ text-align: center;
+ font-family: sans-serif;
+}
+
+/* עיצוב פסקאות הטקסט בתוך העמוד */
+.jokePage p {
+ font-size: 1.5rem;
+ margin: 15px 0;
+ line-height: 1.6;
+}
+
+/* הפסקה של התשובה (הפאנץ' ליין) */
+.jokePage p:nth-of-type(2) {
+ font-weight: bold;
+ color: #4caf50; /* צבע ירוק להדגשת התשובה */
+}
+
+/* עיצוב כפתור החזרה */
+.jokePage button {
+ margin-top: 30px;
+ padding: 10px 25px;
+ font-size: 1rem;
+ background-color: #333333;
+ color: #ffffff;
+ border: 1px solid #555555;
+ border-radius: 6px;
+ cursor: pointer;
+ transition: background-color 0.2s ease, transform 0.1s ease;
+}
+
+.jokePage button:hover {
+ background-color: #444444;
+ transform: scale(1.05);
+}
+
+/* ========================================== */
+
+/* עיצוב לכרטיס הבדיחה (ברשימה הראשית) */
+.card {
+ background-color: #242424;
+ border: 1px solid #333333;
+ border-radius: 8px;
+ padding: 20px;
+ margin: 15px;
+ cursor: pointer;
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
+ transition: transform 0.2s ease, box-shadow 0.2s ease;
+ text-align: right; /* התאמה לעברית */
+}
+
+/* אפקט ריחוף מעל הכרטיס */
+.card:hover {
+ transform: translateY(-5px);
+ box-shadow: 0 6px 16px rgba(0, 0, 0, 0.25);
+ border-color: #4caf50; /* הדגשת המסגרת בריחוף */
+}
+
+/* עיצוב הכותרת בתוך הכרטיס */
+.title {
+ font-size: 1.25rem;
+ color: #ffffff;
+ margin: 0 0 10px 0;
+}
+
+/* עיצוב שם התלמיד בתחתית הכרטיס */
+.name {
+ font-size: 0.9rem;
+ color: #888888;
+ margin: 0;
+}
\ No newline at end of file
diff --git a/src/students/yael-shoham/Card.tsx b/src/students/yael-shoham/Card.tsx
new file mode 100644
index 0000000..a911460
--- /dev/null
+++ b/src/students/yael-shoham/Card.tsx
@@ -0,0 +1,21 @@
+import styles from "./styles.module.css";
+
+export default function YaelCard({ onClick }: any) {
+ return (
+
+
+ 👦
+
+
+
הילד המדבר
+
+
+ יעל שהם
+
+
+
+ לקרוא בדיחה ✨
+
+
+ );
+}
\ No newline at end of file
diff --git a/src/students/yael-shoham/JokePage.tsx b/src/students/yael-shoham/JokePage.tsx
new file mode 100644
index 0000000..63af5e5
--- /dev/null
+++ b/src/students/yael-shoham/JokePage.tsx
@@ -0,0 +1,25 @@
+import styles from "./styles.module.css";
+
+export default function YaelJokePage({ onBack }: any) {
+ return (
+
+
👦 💬 ✨
+
+
+
+
אמא שואלת:
+
"למה אתה תמיד מדבר עם עצמך?"
+
+
+
+
הילד עונה:
+
"כי אני אוהב לדבר עם אנשים חכמים!"
+
+
+
+
+ ← חזרה
+
+
+ );
+}
\ No newline at end of file
diff --git a/src/students/yael-shoham/styles.module.css b/src/students/yael-shoham/styles.module.css
new file mode 100644
index 0000000..687841a
--- /dev/null
+++ b/src/students/yael-shoham/styles.module.css
@@ -0,0 +1,185 @@
+/* רקע כללי עם גרדיאנט עדין ויוקרתי */
+.pageWrapper {
+ min-height: 100vh;
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ padding: 40px 20px;
+ font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
+ direction: rtl;
+}
+
+/* כותרת האייקונים למעלה */
+.decorIcons {
+ font-size: 2.5rem;
+ margin-bottom: 30px;
+ filter: drop-shadow(0 5px 15px rgba(0,0,0,0.2));
+}
+
+/* קונטיינר מרכזי שמאגד הכל */
+.jokeContainer {
+ width: 100%;
+ max-width: 600px;
+ background: rgba(255, 255, 255, 0.95);
+ border-radius: 30px;
+ padding: 40px;
+ box-shadow: 0 20px 50px rgba(0,0,0,0.3);
+ display: flex;
+ flex-direction: column;
+ gap: 25px;
+}
+
+/* עיצוב הבועות של השאלה והתשובה */
+.questionBox, .answerBox {
+ padding: 20px 25px;
+ border-radius: 20px;
+ position: relative;
+ transition: transform 0.3s ease;
+}
+
+.questionBox {
+ background-color: #f0f4ff;
+ border-right: 5px solid #4a90e2;
+ align-self: flex-start;
+ width: 90%;
+}
+
+.answerBox {
+ background-color: #fff9e6;
+ border-right: 5px solid #f5a623;
+ align-self: flex-end;
+ width: 90%;
+}
+
+.questionBox:hover, .answerBox:hover {
+ transform: translateY(-5px);
+}
+
+/* תוויות הדובר (אמא / ילד) */
+.dialogLabel, .dialogLabelAnswer {
+ font-size: 0.9rem;
+ font-weight: bold;
+ margin-bottom: 8px;
+ display: block;
+}
+
+.dialogLabel { color: #2c5282; }
+.dialogLabelAnswer { color: #744210; }
+
+/* הטקסט המרכזי של הבדיחה */
+.textMain {
+ font-size: 1.4rem;
+ color: #2d3748;
+ margin: 0;
+ line-height: 1.4;
+}
+
+/* כפתור חזרה מעוצב */
+.backButton {
+ margin-top: 20px;
+ padding: 15px 40px;
+ background: #4a90e2;
+ color: white;
+ border: none;
+ border-radius: 50px;
+ font-size: 1.1rem;
+ font-weight: bold;
+ cursor: pointer;
+ box-shadow: 0 10px 20px rgba(74, 144, 226, 0.4);
+ transition: all 0.3s ease;
+}
+
+.backButton:hover {
+ background: #357abd;
+ transform: scale(1.05);
+ box-shadow: 0 15px 25px rgba(74, 144, 226, 0.5);
+}
+
+/* קונטיינר הכרטיסייה במפה */
+.cardContainer {
+ background: white;
+ border-radius: 20px;
+ padding: 24px;
+ text-align: center;
+ box-shadow: 0 10px 25px rgba(0, 0, 0, 0.08);
+ border: 1px solid #e2e8f0;
+ cursor: pointer;
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 12px;
+ position: relative;
+ overflow: hidden;
+}
+
+/* אפקט ריחוף משגע לכרטיסייה */
+.cardContainer:hover {
+ transform: translateY(-8px);
+ box-shadow: 0 20px 35px rgba(102, 126, 234, 0.15);
+ border-color: #667eea;
+}
+
+/* בועת האייקון בכרטיסייה */
+.iconBubble {
+ width: 60px;
+ height: 60px;
+ background: #f0f4ff;
+ border-radius: 50%;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 1.8rem;
+ transition: transform 0.3s ease;
+}
+
+.cardContainer:hover .iconBubble {
+ transform: scale(1.1) rotate(5deg);
+ background: #667eea;
+}
+
+/* כותרת הבדיחה בכרטיסייה */
+.cardTitle {
+ font-size: 1.25rem;
+ font-weight: 700;
+ color: #1a202c;
+ margin: 0;
+}
+
+/* תג השם שלך */
+.authorBadge {
+ background: #edf2f7;
+ padding: 4px 12px;
+ border-radius: 30px;
+ font-size: 0.85rem;
+ font-weight: 600;
+ color: #4a5568;
+}
+
+.cardContainer:hover .authorBadge {
+ background: #764ba2;
+ color: white;
+}
+
+/* כפתור כניסה קטן בכרטיסייה */
+.actionButton {
+ margin-top: 8px;
+ width: 100%;
+ padding: 10px;
+ background: #f7fafc;
+ border: 1px solid #e2e8f0;
+ border-radius: 12px;
+ font-size: 0.9rem;
+ font-weight: bold;
+ color: #4a90e2;
+ cursor: pointer;
+ transition: all 0.2s ease;
+}
+
+.cardContainer:hover .actionButton {
+ background: #4a90e2;
+ color: white;
+ border-color: #4a90e2;
+}
\ No newline at end of file