نظم يومك
htmlv1MITنُشر ٤ أكتوبر ٢٠٢٦· ♥ 0 · ⬇ 1 · 💬 0
كود تنظيم يومي
<html lang="ar" dir="rtl">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>جدول المواعيد الشقي | Venom Designs</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Cairo:wght@400;600;700;800;900&display=swap" rel="stylesheet">
<script src="https://cdn.tailwindcss.com"></script>
<style>
:root{
--p1:#7c3aed;
--p2:#ec4899;
--p3:#f59e0b;
--p4:#06b6d4;
--p5:#22c55e;
--ink:#1b1035;
--muted:#6b6485;
}
*{box-sizing:border-box;}
html{-webkit-text-size-adjust:100%;}
body{
margin:0;
font-family:'Cairo',system-ui,-apple-system,'Segoe UI',sans-serif;
color:var(--ink);
background-color:#faf7ff;
background-image:
radial-gradient(900px 500px at 8% -8%, #ffe0f5 0%, transparent 60%),
radial-gradient(820px 460px at 100% 0%, #d5f6ff 0%, transparent 58%),
radial-gradient(900px 620px at 50% 118%, #fff2cc 0%, transparent 62%);
background-attachment:fixed;
min-height:100vh;
overflow-x:hidden;
-webkit-font-smoothing:antialiased;
}
/* ===== Decorative blobs ===== */
.blobs{position:fixed;inset:0;pointer-events:none;z-index:0;overflow:hidden;}
.blob{position:absolute;border-radius:50%;filter:blur(70px);opacity:.55;animation:floaty 16s ease-in-out infinite;}
.blob.b1{width:320px;height:320px;background:#f0abfc;top:-80px;inset-inline-start:-60px;}
.blob.b2{width:280px;height:280px;background:#7dd3fc;top:20%;inset-inline-end:-70px;animation-delay:-4s;}
.blob.b3{width:300px;height:300px;background:#fcd34d;bottom:-90px;inset-inline-start:30%;animation-delay:-8s;opacity:.45;}
@keyframes floaty{
0%,100%{transform:translate3d(0,0,0) scale(1);}
50%{transform:translate3d(0,-28px,0) scale(1.08);}
}
@media (prefers-reduced-motion:reduce){.blob{animation:none;}}
/* ===== Screens ===== */
.screen{display:none;position:relative;z-index:1;}
.screen.active{display:block;}
#setupScreen{padding:20px;}
#setupScreen.active{display:grid;place-items:center;min-height:100vh;}
/* ===== Setup card ===== */
.setup-card{
width:100%;max-width:540px;
background:rgba(255,255,255,.88);
backdrop-filter:blur(18px);-webkit-backdrop-filter:blur(18px);
border:2px solid #fff;
border-radius:32px;
padding:34px 28px 26px;
box-shadow:0 34px 70px -30px rgba(88,28,135,.55);
position:relative;overflow:hidden;
animation:pop .5s cubic-bezier(.2,.9,.3,1.4);
}
@keyframes pop{from{opacity:0;transform:translateY(24px) scale(.96);}to{opacity:1;transform:none;}}
.setup-card::before{
content:'';position:absolute;inset-inline:0;top:0;height:9px;
background:linear-gradient(90deg,#7c3aed,#ec4899,#f59e0b,#06b6d4,#22c55e);
}
.brand{text-align:center;margin-bottom:22px;}
.brand-badge{
width:74px;height:74px;margin:0 auto 12px;border-radius:24px;
display:grid;place-items:center;font-size:2rem;
background:linear-gradient(140deg,#7c3aed,#ec4899 60%,#f59e0b);
box-shadow:0 18px 34px -14px rgba(236,72,153,.85);
animation:wobble 3.5s ease-in-out infinite;
}
@keyframes wobble{0%,100%{transform:rotate(-4deg);}50%{transform:rotate(4deg);}}
.brand-title{
margin:0;font-size:1.75rem;font-weight:900;line-height:1.3;
background:linear-gradient(110deg,#7c3aed,#ec4899 50%,#f59e0b);
-webkit-background-clip:text;background-clip:text;color:transparent;
}
.brand-tag{
margin:8px 0 0;font-weight:800;font-size:.95rem;color:#8b5cf6;
background:#f5f0ff;display:inline-block;padding:6px 14px;border-radius:999px;
}
.field{display:block;margin-bottom:16px;}
.field > span{display:block;font-weight:800;font-size:.9rem;margin-bottom:8px;color:#3b2a63;}
.field input,.field select{
width:100%;padding:14px 16px;border-radius:16px;border:2px solid #ece6fb;
background:#fff;font-family:inherit;font-size:1rem;color:var(--ink);
transition:border-color .2s, box-shadow .2s;outline:none;
}
.field input::placeholder{color:#b3aacb;}
.field input:focus,.field select:focus{
border-color:#a855f7;box-shadow:0 0 0 5px rgba(168,85,247,.16);
}
/* ===== Buttons ===== */
.btn{
font-family:inherit;font-weight:800;border:none;border-radius:999px;cursor:pointer;
display:inline-flex;align-items:center;justify-content:center;gap:8px;
transition:transform .15s ease, box-shadow .2s ease, filter .2s ease;
font-size:.95rem;padding:12px 20px;line-height:1.2;
}
.btn:active{transform:translateY(1px) scale(.985);}
.btn-primary{
background:linear-gradient(120deg,#7c3aed,#ec4899 55%,#f59e0b);color:#fff;
box-shadow:0 16px 30px -14px rgba(124,58,237,.9);
}
.btn-primary:hover{filter:brightness(1.08);transform:translateY(-2px);}
.btn-lg{width:100%;padding:16px 22px;font-size:1.05rem;border-radius:18px;margin-top:6px;}
.btn-ghost{
background:#f4efff;color:#5b3fa8;border:2px solid #e6dbff;
}
.btn-ghost:hover{background:#ebe2ff;transform:translateY(-2px);}
.btn-mini{padding:9px 14px;font-size:.84rem;background:#fff;border:2px solid #ebe2ff;color:#5b3fa8;}
.btn-mini:hover{background:#f7f3ff;transform:translateY(-2px);}
.btn-mini.danger{color:#be123c;border-color:#ffd9e2;background:#fff5f7;}
.btn-mini.danger:hover{background:#ffe8ee;}
.setup-foot{
margin-top:20px;text-align:center;font-size:.8rem;font-weight:800;color:#a397c4;
}
.setup-foot b{color:#7c3aed;}
/* ===== App header ===== */
.app-header{
background:rgba(255,255,255,.8);
backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);
border-bottom:2px solid #fff;
padding:14px 16px 12px;
box-shadow:0 16px 40px -34px rgba(76,29,149,.9);
}
.hdr-inner{
max-width:1120px;margin:0 auto;display:flex;align-items:center;
justify-content:space-between;gap:14px;flex-wrap:wrap;
}
.logo{display:flex;align-items:center;gap:12px;}
.logo-mark{
width:50px;height:50px;border-radius:16px;display:grid;place-items:center;font-size:1.5rem;
background:linear-gradient(140deg,#7c3aed,#ec4899 60%,#f59e0b);
box-shadow:0 14px 26px -12px rgba(236,72,153,.9);
flex:none;
}
.logo h1{
margin:0;font-size:1.18rem;font-weight:900;line-height:1.25;
background:linear-gradient(110deg,#7c3aed,#ec4899 55%,#f59e0b);
-webkit-background-clip:text;background-clip:text;color:transparent;
}
.logo p{margin:2px 0 0;font-size:.74rem;font-weight:800;color:#a78bfa;}
.user-chip{
display:flex;align-items:center;gap:10px;background:#fff;border:2px solid #f0e9ff;
border-radius:999px;padding:7px 12px 7px 8px;box-shadow:0 12px 24px -18px rgba(88,28,135,.9);
}
.avatar{
width:38px;height:38px;border-radius:50%;display:grid;place-items:center;flex:none;
background:linear-gradient(140deg,#06b6d4,#22c55e);color:#fff;font-weight:900;font-size:1rem;
}
.u-info{display:flex;flex-direction:column;line-height:1.15;max-width:190px;}
.u-info strong{font-size:.86rem;font-weight:900;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.u-info span{font-size:.7rem;font-weight:700;color:var(--muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.icon-btn{
border:none;background:#f4efff;width:34px;height:34px;border-radius:50%;
cursor:pointer;font-size:.9rem;display:grid;place-items:center;transition:.2s;
}
.icon-btn:hover{background:#e9ddff;transform:rotate(-10deg);}
/* ===== Tabs ===== */
.tabs{
max-width:1120px;margin:14px auto 0;display:flex;gap:8px;overflow-x:auto;
padding:6px;background:rgba(244,239,255,.8);border-radius:999px;border:2px solid #fff;
scrollbar-width:none;
}
.tabs::-webkit-scrollbar{display:none;}
.tab{
border:none;background:transparent;font-family:inherit;font-weight:800;
padding:11px 18px;border-radius:999px;cursor:pointer;color:#5b4a86;
white-space:nowrap;transition:.25s;font-size:.9rem;
}
.tab:hover{background:#fff;color:#7c3aed;}
.tab.active{
background:linear-gradient(120deg,#7c3aed,#ec4899);color:#fff;
box-shadow:0 14px 24px -14px rgba(236,72,153,.95);
}
/* ===== Layout ===== */
.container{max-width:1120px;margin:0 auto;padding:20px 16px 60px;}
.panel{display:none;animation:fadeUp .35s ease;}
.panel.active{display:block;}
@keyframes fadeUp{from{opacity:0;transform:translateY(14px);}to{opacity:1;transform:none;}}
/* ===== Stats ===== */
.stats-row{
display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));
gap:12px;margin-bottom:20px;
}
.stat-card{
background:#fff;border:2px solid #fff;border-radius:22px;padding:14px 16px;
display:flex;align-items:center;gap:12px;
box-shadow:0 20px 34px -26px rgba(88,28,135,.9);
transition:transform .2s;
}
.stat-card:hover{transform:translateY(-3px);}
.s-ico{
width:44px;height:44px;border-radius:14px;display:grid;place-items:center;font-size:1.25rem;flex:none;
background:linear-gradient(140deg,#f5f0ff,#e6f9ff);
}
.stat-card b{display:block;font-size:1.3rem;font-weight:900;line-height:1;}
.stat-card span{font-size:.76rem;font-weight:700;color:var(--muted);}
.stat-card:nth-child(1) b{color:#7c3aed;}
.stat-card:nth-child(2) b{color:#ec4899;}
.stat-card:nth-child(3) b{color:#f59e0b;}
/* ===== Card ===== */
.card{
position:relative;background:rgba(255,255,255,.94);border:2px solid #fff;
border-radius:28px;padding:20px;margin-bottom:22px;overflow:hidden;
box-shadow:0 30px 60px -34px rgba(88,28,135,.6);
}
.watermark{
position:absolute;bottom:8px;inset-inline-end:-10px;font-size:5rem;font-weight:900;
color:#7c3aed;opacity:.05;transform:rotate(-16deg);pointer-events:none;
white-space:nowrap;letter-spacing:4px;z-index:0;user-select:none;
}
.card-head,.toolbar,.add-form,.table-wrap,.toggle-row,.quick-chips,.ex-off{position:relative;z-index:1;}
.card-head{
display:flex;justify-content:space-between;align-items:flex-start;
gap:12px;flex-wrap:wrap;margin-bottom:16px;
}
.card-head h2{
margin:0;font-size:1.28rem;font-weight:900;
background:linear-gradient(115deg,#7c3aed,#ec4899);
-webkit-background-clip:text;background-clip:text;color:transparent;
}
.who{display:flex;flex-wrap:wrap;gap:6px;margin:8px 0 0;}
.who-item{
background:#f5f0ff;border-radius:999px;padding:4px 11px;
font-size:.74rem;font-weight:800;color:#5b3fa8;
}
.head-actions{display:flex;gap:8px;align-items:center;flex-wrap:wrap;}
.venom-badge{
display:inline-flex;align-items:center;gap:6px;
background:linear-gradient(120deg,#1e1b4b,#7c3aed 60%,#ec4899);
color:#fff;font-weight:900;font-size:.75rem;padding:8px 14px;border-radius:999px;
letter-spacing:.6px;box-shadow:0 12px 22px -12px rgba(124,58,237,.95);white-space:nowrap;
}
.venom-badge::before{content:'🐍';font-size:.9rem;}
/* ===== Toolbar ===== */
.toolbar{display:flex;gap:8px;flex-wrap:wrap;align-items:center;margin-bottom:14px;}
.hint{font-size:.76rem;font-weight:700;color:#a397c4;}
/* ===== Tables ===== */
.table-wrap{
overflow:auto;border-radius:20px;border:2px solid #f0e9ff;background:#fff;
-webkit-overflow-scrolling:touch;
}
.grid-table{width:100%;border-collapse:separate;border-spacing:0;}
.list-table{min-width:520px;font-size:.9rem;}
.school-table{min-width:680px;font-size:.86rem;}
.grid-table th,.grid-table td{
border-bottom:1px solid #f4efff;border-inline-start:1px solid #f8f4ff;
padding:0;vertical-align:middle;
}
.grid-table thead th{
color:#fff;font-weight:900;font-size:.82rem;padding:10px 8px;text-align:center;
position:relative;
}
.grid-table thead th.corner{
background:linear-gradient(140deg,#3b0764,#7c3aed);
font-size:.78rem;text-align:center;padding:10px 12px;
position:sticky;right:0;z-index:5;white-space:nowrap;
}
.period-th{min-width:118px;}
.p-label{
font-size:.82rem;font-weight:900;outline:none;border-radius:6px;padding:2px 4px;
}
.p-time{font-size:.7rem;font-weight:700;opacity:.92;outline:none;margin-top:2px;padding:1px 4px;border-radius:6px;}
.p-label:hover,.p-time:hover{background:rgba(255,255,255,.22);}
.p-label:focus,.p-time:focus{background:rgba(255,255,255,.35);}
.grid-table tbody th.day-th{
background:linear-gradient(120deg,#fdf1ff,#eef7ff);
font-weight:900;font-size:.86rem;text-align:center;padding:12px 10px;
color:#4c1d95;position:sticky;right:0;z-index:4;white-space:nowrap;
border-inline-end:2px solid #ede4ff;
}
.cell-in{
min-height:54px;padding:10px 8px;outline:none;
display:flex;align-items:center;justify-content:center;text-align:center;
font-weight:700;font-size:.84rem;transition:background .2s, box-shadow .2s;
word-break:break-word;line-height:1.35;
}
.cell-in:focus{background:#fffbeb;box-shadow:inset 0 0 0 2px #f59e0b;}
.list-table thead th{
background:linear-gradient(120deg,#7c3aed,#a855f7);
color:#fff;font-weight:900;font-size:.82rem;padding:12px 14px;text-align:start;
}
.list-table td{padding:12px 14px;text-align:start;font-weight:700;font-size:.86rem;}
.list-table tbody tr:hover td{background:#fdfbff;}
.day-group td{
background:linear-gradient(90deg,#f6f0ff,#eef9ff 70%,#fff8e6);
padding:9px 14px;border-top:2px solid #efe7ff;
}
.day-pill{
display:inline-block;background:linear-gradient(120deg,#7c3aed,#ec4899);
color:#fff;font-weight:900;font-size:.78rem;padding:5px 14px;border-radius:999px;
box-shadow:0 8px 16px -10px rgba(236,72,153,.95);
}
.cnt{font-size:.72rem;font-weight:800;color:#9b8ec4;margin-inline-start:8px;}
.empty-row td{
color:#b3aacb;font-weight:700;font-size:.8rem;text-align:center;
background:#fdfbff;padding:14px;
}
.time-cell{font-weight:900;color:#7c3aed;white-space:nowrap;font-variant-numeric:tabular-nums;}
.subj-cell{font-weight:900;color:#1b1035;}
.dot{
display:inline-block;width:9px;height:9px;border-radius:50%;margin-inline-end:8px;
vertical-align:middle;
}
.del-btn{
border:none;background:#fff5f7;color:#e11d48;width:30px;height:30px;border-radius:10px;
cursor:pointer;font-weight:900;font-size:.8rem;transition:.2s;
}
.del-btn:hover{background:#ffe0e8;transform:scale(1.08);}
.wm-row td{
text-align:center;padding:11px!important;font-weight:900;font-size:.78rem;
letter-spacing:1.6px;color:#fff;
background:linear-gradient(90deg,#7c3aed,#ec4899 50%,#f59e0b);
text-shadow:0 1px 3px rgba(0,0,0,.25);
}
/* ===== Add forms ===== */
.add-form{
display:grid;grid-template-columns:repeat(auto-fit,minmax(148px,1fr));gap:10px;
margin:0 0 18px;padding:14px;border-radius:22px;
background:linear-gradient(120deg,#faf5ff,#eef9ff);
border:2px dashed #ddd0ff;
}
.add-form input,.add-form select{
width:100%;padding:12px 14px;border-radius:14px;border:2px solid #ece6fb;
background:#fff;font-family:inherit;font-size:.9rem;font-weight:700;color:var(--ink);
outline:none;transition:.2s;
}
.add-form input:focus,.add-form select:focus{border-color:#a855f7;box-shadow:0 0 0 4px rgba(168,85,247,.14);}
.add-form .btn{width:100%;}
/* ===== Toggle switch ===== */
.toggle-row{
display:flex;align-items:center;justify-content:space-between;gap:14px;flex-wrap:wrap;
background:linear-gradient(120deg,#fff7ed,#f0fdfa);
border:2px solid #fde8d0;border-radius:22px;padding:14px 16px;margin-bottom:16px;
}
.toggle-row b{font-size:.94rem;font-weight:900;}
.toggle-row p{margin:4px 0 0;font-size:.78rem;font-weight:700;color:var(--muted);}
.switch{position:relative;display:inline-block;width:62px;height:34px;flex:none;}
.switch input{opacity:0;width:0;height:0;}
.slider{
position:absolute;inset:0;cursor:pointer;border-radius:999px;
background:#e2d9f3;transition:.3s;
}
.slider::before{
content:'';position:absolute;height:26px;width:26px;border-radius:50%;background:#fff;
top:4px;inset-inline-start:4px;transition:.3s;box-shadow:0 4px 10px rgba(0,0,0,.2);
}
.switch input:checked + .slider{background:linear-gradient(120deg,#7c3aed,#ec4899);}
.switch input:checked + .slider::before{transform:translateX(-28px);}
html[dir="rtl"] .switch input:checked + .slider::before{transform:translateX(-28px);}
.ex-body{display:none;}
.card.ex-on .ex-body{display:block;}
.ex-off{display:block;}
.card.ex-on .ex-off{display:none;}
.ex-off{
text-align:center;padding:30px 16px;border-radius:22px;
background:repeating-linear-gradient(45deg,#fdfbff,#fdfbff 14px,#f8f3ff 14px,#f8f3ff 28px);
border:2px dashed #ddd0ff;
}
.ex-off h3{margin:0 0 6px;font-size:1.05rem;font-weight:900;color:#5b3fa8;}
.ex-off p{margin:0 0 14px;font-size:.84rem;font-weight:700;color:var(--muted);}
.quick-chips{display:flex;gap:8px;flex-wrap:wrap;margin:0 0 16px;}
.chip{
border:2px solid #e9ddff;background:#fff;color:#5b3fa8;font-family:inherit;
font-weight:800;font-size:.78rem;padding:7px 13px;border-radius:999px;cursor:pointer;transition:.2s;
}
.chip:hover{background:linear-gradient(120deg,#7c3aed,#ec4899);color:#fff;border-color:transparent;transform:translateY(-2px);}
/* ===== Footer ===== */
.site-foot{
text-align:center;padding:26px 16px 34px;font-weight:900;font-size:.82rem;color:#a397c4;
}
.site-foot b{
background:linear-gradient(110deg,#7c3aed,#ec4899);
-webkit-background-clip:text;background-clip:text;color:transparent;
}
/* ===== Toast ===== */
#toast{
position:fixed;bottom:22px;inset-inline-start:50%;transform:translate(50%,140%);
background:linear-gradient(120deg,#1e1b4b,#7c3aed);
color:#fff;font-weight:800;font-size:.88rem;padding:13px 22px;border-radius:999px;
box-shadow:0 22px 40px -18px rgba(30,27,75,.9);z-index:999;transition:transform .4s cubic-bezier(.2,.9,.3,1.3);
max-width:90vw;text-align:center;
}
#toast.show{transform:translate(50%,0);}
/* ===== Responsive ===== */
@media (max-width:720px){
.logo h1{font-size:1rem;}
.logo p{font-size:.68rem;}
.u-info{max-width:110px;}
.card{padding:15px;border-radius:24px;}
.card-head h2{font-size:1.1rem;}
.watermark{font-size:3.2rem;}
.add-form .btn{grid-column:1/-1;}
}
@media (max-width:420px){
.avatar{width:34px;height:34px;font-size:.9rem;}
.tab{padding:10px 14px;font-size:.82rem;}
.stat-card{padding:12px;}
}
/* ===== Print ===== */
@media print{
*{-webkit-print-color-adjust:exact!important;print-color-adjust:exact!important;}
body{background:#fff!important;background-image:none!important;}
.blobs,.app-header,.site-foot,.no-print{display:none!important;}
.screen{display:none!important;}
#appScreen{display:block!important;}
.panel{display:none!important;}
.panel.print-active{display:block!important;}
.container{padding:0!important;max-width:100%!important;margin:0!important;}
.card{
box-shadow:none!important;border:1.5px solid #e5e0f5!important;
margin:0 0 12px!important;page-break-inside:avoid;border-radius:14px!important;
}
.watermark{opacity:.07!important;}
.table-wrap{overflow:visible!important;border-radius:10px!important;}
.grid-table{min-width:0!important;}
.school-table{font-size:10px;}
.list-table{min-width:0!important;font-size:11px;}
.cell-in{min-height:38px;font-size:10px;}
.grid-table thead th.corner,.grid-table tbody th.day-th{position:static!important;}
.card-head h2{
background:none!important;-webkit-text-fill-color:#4c1d95!important;color:#4c1d95!important;
}
.logo h1,.site-foot b{
background:none!important;-webkit-text-fill-color:#7c3aed!important;color:#7c3aed!important;
}
}
</style>
</head>
<body>
<div class="blobs" aria-hidden="true">
<span class="blob b1"></span>
<span class="blob b2"></span>
<span class="blob b3"></span>
</div>
<!-- ============ SETUP SCREEN ============ -->
<section id="setupScreen" class="screen active">
<div class="setup-card">
<div class="brand">
<div class="brand-badge">🐍</div>
<h1 class="brand-title">جدول المواعيد الشقي</h1>
<p class="brand-tag">#هنقرفك بس عشان مصلحتك</p>
</div>
<form id="setupForm" autocomplete="off">
<label class="field">
<span>👤 الاسم بالكامل</span>
<input type="text" id="inName" placeholder="اكتب اسمك الثلاثي هنا" required>
</label>
<label class="field">
<span>🎓 السنة الدراسية</span>
<input type="text" id="inGrade" placeholder="مثال: الصف الثالث الثانوي / الفرقة الأولى" required>
</label>
<label class="field">
<span>🏫 اسم المدرسة / الجامعة</span>
<input type="text" id="inSchool" placeholder="مثال: مدرسة النيل الثانوية" required>
</label>
<button type="submit" class="btn btn-primary btn-lg">يلا نبدأ 🚀</button>
</form>
<div class="setup-foot">By <b>Venom Designs</b> • صنع بكل حب وقهوة ☕</div>
</div>
</section>
<!-- ============ APP ============ -->
<section id="appScreen" class="screen">
<header class="app-header no-print">
<div class="hdr-inner">
<div class="logo">
<span class="logo-mark">🐍</span>
<div>
<h1>جدول المواعيد الشقي</h1>
<p>#هنقرفك بس عشان مصلحتك</p>
</div>
</div>
<div class="user-chip">
<div class="avatar" id="avatar">؟</div>
<div class="u-info">
<strong id="uName">—</strong>
<span id="uMeta">—</span>
</div>
<button class="icon-btn" id="editProfileBtn" title="تعديل البيانات">✏️</button>
</div>
</div>
<nav class="tabs" id="tabs">
<button class="tab active" data-tab="school">🏫 جدول المدرسة</button>
<button class="tab" data-tab="lessons">📚 جدول الدروس</button>
<button class="tab" data-tab="exercises">🏋️ التمارين</button>
</nav>
</header>
<main class="container">
<!-- Stats -->
<div class="stats-row no-print">
<div class="stat-card">
<span class="s-ico">🏫</span>
<div><b id="statPeriods">7</b><span>حصة في اليوم</span></div>
</div>
<div class="stat-card">
<span class="s-ico">📚</span>
<div><b id="statLessons">0</b><span>درس في الأسبوع</span></div>
</div>
<div class="stat-card">
<span class="s-ico">🏋️</span>
<div><b id="statEx">0</b><span>تمرين مسجل</span></div>
</div>
</div>
<!-- ===== PANEL: SCHOOL ===== -->
<section class="panel active" id="panel-school">
<div class="card" id="card-school">
<div class="watermark" aria-hidden="true">Venom Designs</div>
<div class="card-head">
<div>
<h2>🏫 جدول المدرسة</h2>
<p class="who" id="whoSchool"></p>
</div>
<div class="head-actions">
<button class="btn btn-ghost no-print" data-print="school">🖨️ طباعة</button>
<div class="venom-badge">Venom Designs</div>
</div>
</div>
<div class="toolbar no-print">
<button class="btn btn-mini" id="addPeriod">➕ إضافة حصة</button>
<button class="btn btn-mini" id="removePeriod">➖ حذف آخر حصة</button>
<button class="btn btn-mini danger" id="clearSchool">🗑️ تفريغ الجدول</button>
<span class="hint">اضغط على أي خانة واكتب مادتك مباشرة ✍️</span>
</div>
<div class="table-wrap" id="schoolTableWrap"></div>
</div>
</section>
<!-- ===== PANEL: LESSONS ===== -->
<section class="panel" id="panel-lessons">
<div class="card" id="card-lessons">
<div class="watermark" aria-hidden="true">Venom Designs</div>
<div class="card-head">
<div>
<h2>📚 جدول الدروس</h2>
<p class="who" id="whoLessons"></p>
</div>
<div class="head-actions">
<button class="btn btn-ghost no-print" data-print="lessons">🖨️ طباعة</button>
<div class="venom-badge">Venom Designs</div>
</div>
</div>
<form class="add-form no-print" id="lessonForm" autocomplete="off">
<select id="lDay" aria-label="اليوم"></select>
<input type="time" id="lTime" aria-label="الوقت">
<input type="text" id="lSubject" placeholder="اسم الدرس (مثال: رياضيات)" required>
<input type="text" id="lTeacher" placeholder="اسم المدرس">
<input type="text" id="lPlace" placeholder="المكان / السنتر">
<button type="submit" class="btn btn-primary">➕ إضافة درس</button>
</form>
<div class="table-wrap" id="lessonsWrap"></div>
</div>
</section>
<!-- ===== PANEL: EXERCISES ===== -->
<section class="panel" id="panel-exercises">
<div class="card" id="card-exercises">
<div class="watermark" aria-hidden="true">Venom Designs</div>
<div class="card-head">
<div>
<h2>🏋️ التمارين الرياضية</h2>
<p class="who" id="whoEx"></p>
</div>
<div class="head-actions">
<button class="btn btn-ghost no-print" data-print="exercises">🖨️ طباعة</button>
<div class="venom-badge">Venom Designs</div>
</div>
</div>
<div class="toggle-row no-print">
<div>
<b>قسم التمارين (اختياري تمامًا)</b>
<p>لو بتحب رياضة أو جيم، فعّل القسم وابدأ تسجل تمارينك 💪 ولو مش عايزه سيبه مقفول.</p>
</div>
<label class="switch">
<input type="checkbox" id="exToggle">
<span class="slider"></span>
</label>
</div>
<div class="ex-off" id="exOff">
<h3>القسم مقفول 🙈</h3>
<p>فعّل المفتاح اللي فوق لو حابب تضيف جدول التمارين.</p>
<button class="btn btn-primary" id="exEnableBtn">فعّل قسم التمارين 💪</button>
</div>
<div class="ex-body">
<form class="add-form no-print" id="exForm" autocomplete="off">
<select id="eDay" aria-label="اليوم"></select>
<input type="time" id="eTime" aria-label="الوقت">
<input type="text" id="eName" placeholder="نوع التمرين (مثال: جيم / جري)" required>
<input type="text" id="ePlace" placeholder="المكان (النادي / البيت)">
<input type="text" id="eNote" placeholder="ملاحظات">
<button type="submit" class="btn btn-primary">➕ إضافة تمرين</button>
</form>
<div class="quick-chips no-print">
<button class="chip" data-quick="جيم وكارديو">🏋️ جيم</button>
<button class="chip" data-quick="جري">🏃 جري</button>
<button class="chip" data-quick="سباحة">🏊 سباحة</button>
<button class="chip" data-quick="كرة قدم">⚽ كرة قدم</button>
<button class="chip" data-quick="يوغا وتمدد">🧘 يوغا</button>
</div>
<div class="table-wrap" id="exWrap"></div>
</div>
</div>
</section>
</main>
<footer class="site-foot no-print">
صُنع بواسطة <b>Venom Designs</b> © <span id="year"></span> — كل جدول بيطلع من هنا عليه اسمنا 🐍
</footer>
</section>
<div id="toast" role="status" aria-live="polite"></div>
<script>
(function(){
'use strict';
/* ================= Constants ================= */
const STORE_KEY = 'venom_shaghy_schedule_v1';
const DAYS_SCHOOL = ['الأحد','الاثنين','الثلاثاء','الأربعاء','الخميس'];
const DAYS_WEEK = ['السبت','الأحد','الاثنين','الثلاثاء','الأربعاء','الخميس','الجمعة'];
const DEFAULT_PERIODS = [
{ label:'الحصة الأولى', time:'07:00' },
{ label:'الحصة الثانية', time:'08:00' },
{ label:'الحصة الثالثة', time:'09:00' },
{ label:'الحصة الرابعة', time:'10:00' },
{ label:'الحصة الخامسة', time:'11:00' },
{ label:'الحصة السادسة', time:'12:00' },
{ label:'الحصة السابعة', time:'01:00' }
];
/* ================= State ================= */
function defaultState(){
return {
profile: { name:'', grade:'', school:'' },
periods: DEFAULT_PERIODS.map(p => ({ label:p.label, time:p.time })),
school: {},
lessons: [],
exercises: { enabled:false, items: [] }
};
}
let state = defaultState();
/* ================= Utils ================= */
const $ = (id) => document.getElementById(id);
function esc(s){
return String(s === null || s === undefined ? '' : s).replace(/[&<>"']/g, c => ({
'&':'&','<':'<','>':'>','"':'"',"'":'''
}[c]));
}
function uid(){ return Math.random().toString(36).slice(2,10); }
function hashHue(str){
let h = 0;
str = String(str || '');
for (let i = 0; i < str.length; i++){ h = (h * 31 + str.charCodeAt(i)) % 360; }
return h;
}
function fmtTime(t){
if (!t) return '';
const m = /^(\d{1,2}):(\d{2})/.exec(t);
if (!m) return t;
let h = parseInt(m[1], 10);
const min = m[2];
const suffix = h >= 12 ? 'م' : 'ص';
h = h % 12; if (h === 0) h = 12;
return h + ':' + min + ' ' + suffix;
}
function save(){
try { localStorage.setItem(STORE_KEY, JSON.stringify(state)); } catch(e){}
}
function load(){
try {
const raw = localStorage.getItem(STORE_KEY);
if (!raw) return;
const parsed = JSON.parse(raw);
const base = defaultState();
state = {
profile: Object.assign(base.profile, parsed.profile || {}),
periods: Array.isArray(parsed.periods) && parsed.periods.length ? parsed.periods : base.periods,
school: parsed.school && typeof parsed.school === 'object' ? parsed.school : {},
lessons: Array.isArray(parsed.lessons) ? parsed.lessons : [],
exercises: {
enabled: !!(parsed.exercises && parsed.exercises.enabled),
items: (parsed.exercises && Array.isArray(parsed.exercises.items)) ? parsed.exercises.items : []
}
};
} catch(e){ state = defaultState(); }
}
let toastTimer = null;
function toast(msg){
const el = $('toast');
el.textContent = msg;
el.classList.add('show');
clearTimeout(toastTimer);
toastTimer = setTimeout(() => el.classList.remove('show'), 2300);
}
function dayOptions(selected){
return DAYS_WEEK.map(d =>
'<option value="' + d + '"' + (d === selected ? ' selected' : '') + '>' + d + '</option>'
).join('');
}
/* ================= Profile rendering ================= */
function whoHTML(){
const p = state.profile;
return '<span class="who-item">👤 ' + esc(p.name) + '</span>' +
'<span class="who-item">🎓 ' + esc(p.grade) + '</span>' +
'<span class="who-item">🏫 ' + esc(p.school) + '</span>';
}
function renderProfile(){
const p = state.profile;
$('uName').textContent = p.name || '—';
$('uMeta').textContent = (p.grade || '—') + ' • ' + (p.school || '—');
$('avatar').textContent = (p.name || '؟').trim().charAt(0) || '؟';
$('whoSchool').innerHTML = whoHTML();
$('whoLessons').innerHTML = whoHTML();
$('whoEx').innerHTML = whoHTML();
}
function renderStats(){
$('statPeriods').textContent = state.periods.length;
$('statLessons').textContent = state.lessons.length;
$('statEx').textContent = state.exercises.items.length;
}
/* ================= School table ================= */
function paintCell(el){
const val = el.textContent.trim();
const td = el.closest('td');
if (!td) return;
if (val){
const h = hashHue(val);
td.style.background = 'hsl(' + h + ' 92% 94%)';
td.style.borderInlineStart = '4px solid hsl(' + h + ' 85% 58%)';
el.style.color = 'hsl(' + h + ' 62% 24%)';
} else {
td.style.background = '';
td.style.borderInlineStart = '';
el.style.color = '';
}
}
function renderSchool(){
const wrap = $('schoolTableWrap');
const periods = state.periods;
const totalCols = periods.length + 1;
let head = '<tr>';
head += '<th class="corner">اليوم \\ الحصة</th>';
periods.forEach((p, i) => {
const h = (i * 47 + 265) % 360;
head += '<th class="period-th" style="background:linear-gradient(135deg,hsl(' + h + ' 80% 54%),hsl(' + ((h + 38) % 360) + ' 86% 60%))">' +
'<div class="p-label" contenteditable="true" data-field="label" data-period="' + i + '">' + esc(p.label) + '</div>' +
'<div class="p-time" contenteditable="true" data-field="time" data-period="' + i + '">' + esc(p.time) + '</div>' +
'</th>';
});
head += '</tr>';
let body = '';
DAYS_SCHOOL.forEach((day, di) => {
body += '<tr><th class="day-th">' + day + '</th>';
periods.forEach((p, pi) => {
const key = di + '-' + pi;
const val = state.school[key] || '';
let style = '';
if (val){
const h = hashHue(val);
style = ' style="background:hsl(' + h + ' 92% 94%);border-inline-start:4px solid hsl(' + h + ' 85% 58%)"';
}
const color = val ? ' style="color:hsl(' + hashHue(val) + ' 62% 24%)"' : '';
body += '<td' + style + '>' +
'<div class="cell-in" contenteditable="true" spellcheck="false" data-key="' + key + '"' + color + '>' + esc(val) + '</div>' +
'</td>';
});
body += '</tr>';
});
wrap.innerHTML =
'<table class="grid-table school-table">' +
'<thead>' + head + '</thead>' +
'<tbody>' + body + '</tbody>' +
'<tfoot><tr><td class="wm-row" colspan="' + totalCols + '">🐍 VENOM DESIGNS 🐍</td></tr></tfoot>' +
'</table>';
}
/* ================= Lessons table ================= */
function renderLessons(){
const wrap = $('lessonsWrap');
const cols = 5;
let rows = '';
DAYS_WEEK.forEach(day => {
const items = state.lessons
.filter(i => i.day === day)
.sort((a, b) => String(a.time || '').localeCompare(String(b.time || '')));
rows += '<tr class="day-group"><td colspan="' + cols + '">' +
'<span class="day-pill">' + day + '</span>' +
'<span class="cnt">' + items.length + ' درس</span>' +
'</td></tr>';
if (!items.length){
rows += '<tr class="empty-row"><td colspan="' + cols + '">فاضي! ضيف دروسك 🎒</td></tr>';
} else {
items.forEach(it => {
const h = hashHue(it.subject || 'x');
rows += '<tr>' +
'<td class="time-cell">' + (fmtTime(it.time) || '—') + '</td>' +
'<td class="subj-cell"><span class="dot" style="background:hsl(' + h + ' 85% 60%)"></span>' + esc(it.subject) + '</td>' +
'<td>' + (esc(it.teacher) || '—') + '</td>' +
'<td>' + (esc(it.place) || '—') + '</td>' +
'<td class="col-del no-print"><button class="del-btn" data-del-lesson="' + it.id + '" title="حذف">✕</button></td>' +
'</tr>';
});
}
});
wrap.innerHTML =
'<table class="grid-table list-table">' +
'<thead><tr>' +
'<th>الوقت</th><th>الدرس</th><th>المدرس</th><th>المكان</th>' +
'<th class="col-del no-print">حذف</th>' +
'</tr></thead>' +
'<tbody>' + rows + '</tbody>' +
'<tfoot><tr><td class="wm-row" colspan="' + cols + '">🐍 VENOM DESIGNS 🐍</td></tr></tfoot>' +
'</table>';
}
/* ================= Exercises table ================= */
function renderExercises(){
const card = $('card-exercises');
const enabled = state.exercises.enabled;
card.classList.toggle('ex-on', enabled);
$('exToggle').checked = enabled;
const cols = 5;
const wrap = $('exWrap');
if (!enabled){
wrap.innerHTML = '';
return;
}
let rows = '';
DAYS_WEEK.forEach(day => {
const items = state.exercises.items
.filter(i => i.day === day)
.sort((a, b) => String(a.time || '').localeCompare(String(b.time || '')));
rows += '<tr class="day-group"><td colspan="' + cols + '">' +
'<span class="day-pill">' + day + '</span>' +
'<span class="cnt">' + items.length + ' تمرين</span>' +
'</td></tr>';
if (!items.length){
rows += '<tr class="empty-row"><td colspan="' + cols + '">يوم راحة 💤</td></tr>';
} else {
items.forEach(it => {
const h = hashHue(it.name || 'x');
rows += '<tr>' +
'<td class="time-cell">' + (fmtTime(it.time) || '—') + '</td>' +
'<td class="subj-cell"><span class="dot" style="background:hsl(' + h + ' 85% 60%)"></span>' + esc(it.name) + '</td>' +
'<td>' + (esc(it.place) || '—') + '</td>' +
'<td>' + (esc(it.note) || '—') + '</td>' +
'<td class="col-del no-print"><button class="del-btn" data-del-ex="' + it.id + '" title="حذف">✕</button></td>' +
'</tr>';
});
}
});
wrap.innerHTML =
'<table class="grid-table list-table">' +
'<thead><tr>' +
'<th>الوقت</th><th>التمرين</th><th>المكان</th><th>ملاحظات</th>' +
'<th class="col-del no-print">حذف</th>' +
'</tr></thead>' +
'<tbody>' + rows + '</tbody>' +
'<tfoot><tr><td class="wm-row" colspan="' + cols + '">🐍 VENOM DESIGNS 🐍</td></tr></tfoot>' +
'</table>';
}
/* ================= Render all ================= */
function renderAll(){
renderProfile();
renderSchool();
renderLessons();
renderExercises();
renderStats();
}
/* ================= Screens ================= */
function showSetup(){
$('setupScreen').classList.add('active');
$('appScreen').classList.remove('active');
$('inName').value = state.profile.name || '';
$('inGrade').value = state.profile.grade || '';
$('inSchool').value = state.profile.school || '';
}
function showApp(){
$('setupScreen').classList.remove('active');
$('appScreen').classList.add('active');
renderAll();
}
function switchTab(name){
document.querySelectorAll('.tab').forEach(t =>
t.classList.toggle('active', t.dataset.tab === name));
document.querySelectorAll('.panel').forEach(p =>
p.classList.toggle('active', p.id === 'panel-' + name));
}
/* ================= Events ================= */
// Setup form
$('setupForm').addEventListener('submit', function(e){
e.preventDefault();
const name = $('inName').value.trim();
const grade = $('inGrade').value.trim();
const school = $('inSchool').value.trim();
if (!name || !grade || !school){
toast('كمّل البيانات كلها 🙏');
return;
}
state.profile = { name: name, grade: grade, school: school };
save();
showApp();
switchTab('school');
toast('أهلاً ' + name.split(' ')[0] + ' 👋 يلا نظّم يومك');
});
// Edit profile
$('editProfileBtn').addEventListener('click', function(){
showSetup();
toast('عدّل بياناتك ثم اضغط يلا نبدأ ✏️');
});
// Tabs
$('tabs').addEventListener('click', function(e){
const btn = e.target.closest('.tab');
if (!btn) return;
switchTab(btn.dataset.tab);
});
// Print
document.addEventListener('click', function(e){
const btn = e.target.closest('[data-print]');
if (!btn) return;
const name = btn.dataset.print;
document.querySelectorAll('.panel').forEach(p => p.classList.remove('print-active'));
const panel = $('panel-' + name);
if (panel) panel.classList.add('print-active');
window.print();
setTimeout(() => { if (panel) panel.classList.remove('print-active'); }, 800);
});
// ===== School table editing (delegation) =====
const schoolWrap = $('schoolTableWrap');
schoolWrap.addEventListener('input', function(e){
const el = e.target.closest('[contenteditable]');
if (!el) return;
if (el.dataset.key !== undefined && el.dataset.key !== ''){
const key = el.dataset.key;
const val = el.textContent.trim();
if (val) state.school[key] = val;
else delete state.school[key];
paintCell(el);
save();
} else if (el.dataset.field){
const idx = parseInt(el.dataset.period, 10);
if (state.periods[idx]){
state.periods[idx][el.dataset.field] = el.textContent.trim();
save();
}
}
});
// ===== School toolbar =====
$('addPeriod').addEventListener('click', function(){
if (state.periods.length >= 12){
toast('الجدول بقى مليان أوي 😅');
return;
}
const n = state.periods.length + 1;
state.periods.push({ label: 'الحصة ' + n, time: '' });
save(); renderSchool(); renderStats();
toast('تمت إضافة حصة جديدة ➕');
});
$('removePeriod').addEventListener('click', function(){
if (state.periods.length <= 1){
toast('لازم تفضل حصة واحدة على الأقل 😌');
return;
}
state.periods.pop();
save(); renderSchool(); renderStats();
toast('تم حذف آخر حصة ➖');
});
$('clearSchool').addEventListener('click', function(){
if (!confirm('متأكد إنك عايز تفرّغ جدول المدرسة كله؟')) return;
state.school = {};
save(); renderSchool();
toast('تم تفريغ جدول المدرسة 🗑️');
});
// ===== Lessons =====
$('lDay').innerHTML = dayOptions('السبت');
$('lessonForm').addEventListener('submit', function(e){
e.preventDefault();
const subject = $('lSubject').value.trim();
if (!subject){
toast('اكتب اسم الدرس الأول 😅');
return;
}
state.lessons.push({
id: uid(),
day: $('lDay').value,
time: $('lTime').value,
subject: subject,
teacher: $('lTeacher').value.trim(),
place: $('lPlace').value.trim()
});
save(); renderLessons(); renderStats();
$('lSubject').value = '';
$('lTeacher').value = '';
$('lPlace').value = '';
$('lTime').value = '';
toast('تمت إضافة الدرس ✅');
});
// ===== Exercises =====
$('eDay').innerHTML = dayOptions('السبت');
$('exToggle').addEventListener('change', function(){
state.exercises.enabled = this.checked;
save(); renderExercises();
toast(this.checked ? 'قسم التمارين اتفعّل 💪' : 'قسم التمارين اتقفل 🙈');
});
$('exEnableBtn').addEventListener('click', function(){
state.exercises.enabled = true;
save(); renderExercises();
toast('قسم التمارين اتفعّل 💪');
});
$('exForm').addEventListener('submit', function(e){
e.preventDefault();
const name = $('eName').value.trim();
if (!name){
toast('اكتب نوع التمرين الأول 💪');
return;
}
state.exercises.items.push({
id: uid(),
day: $('eDay').value,
time: $('eTime').value,
name: name,
place: $('ePlace').value.trim(),
note: $('eNote').value.trim()
});
save(); renderExercises(); renderStats();
$('eName').value = '';
$('ePlace').value = '';
$('eNote').value = '';
$('eTime').value = '';
toast('تمت إضافة التمرين ✅');
});
document.querySelectorAll('.chip').forEach(chip => {
chip.addEventListener('click', function(){
if (!state.exercises.enabled){
state.exercises.enabled = true;
save(); renderExercises();
}
$('eName').value = this.dataset.quick;
$('eName').focus();
});
});
// ===== Delete (delegation) =====
document.addEventListener('click', function(e){
const l = e.target.closest('[data-del-lesson]');
if (l){
const id = l.dataset.delLesson;
state.lessons = state.lessons.filter(i => i.id !== id);
save(); renderLessons(); renderStats();
toast('تم حذف الدرس 🗑️');
return;
}
const x = e.target.closest('[data-del-ex]');
if (x){
const id = x.dataset.delEx;
state.exercises.items = state.exercises.items.filter(i => i.id !== id);
save(); renderExercises(); renderStats();
toast('تم حذف التمرين 🗑️');
}
});
// ===== Contenteditable helpers =====
document.addEventListener('keydown', function(e){
if (e.target && e.target.isContentEditable && e.key === 'Enter'){
e.preventDefault();
e.target.blur();
}
});
document.addEventListener('paste', function(e){
if (e.target && e.target.isContentEditable){
e.preventDefault();
const text = (e.clipboardData || window.clipboardData).getData('text');
try { document.execCommand('insertText', false, text); } catch(err){}
}
});
/* ================= Init ================= */
$('year').textContent = new Date().getFullYear();
load();
if (state.profile && state.profile.name){
showApp();
} else {
showSetup();
}
window.addEventListener('beforeprint', function(){
if (!$('appScreen').classList.contains('active')){
document.querySelectorAll('.panel').forEach(p => p.classList.remove('print-active'));
}
});
})();
</script>
</body>
</html>
التعليقات (0)
سجّل الدخول للتعليق.