Initial AI-generated site
This commit is contained in:
+413
@@ -0,0 +1,413 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html lang="he" dir="rtl">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>מרכז האיקידו הישראלי | כפר סבא</title>
|
||||||
|
<meta name="description" content="מרכז האיקידו הישראלי בכפר סבא - מתחם אימונים חדשני ותוסס. בואו לגלות את אומנות הלחימה היפנית במרכז המוביל בישראל.">
|
||||||
|
<meta property="og:title" content="מרכז האיקידו הישראלי | כפר סבא">
|
||||||
|
<meta property="og:description" content="מתחם אימונים חדשני ותוסס לאומנות האיקידו">
|
||||||
|
<meta property="og:type" content="website">
|
||||||
|
<link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><circle cx='50' cy='50' r='45' fill='%23E63946' stroke='%231D3557' stroke-width='4'/><path d='M50 20 L50 80 M30 50 L70 50' stroke='%23F1FAEE' stroke-width='6' stroke-linecap='round'/></svg>">
|
||||||
|
<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=Heebo:wght@300;400;700;900&family=Rubik:wght@400;700&display=swap" rel="stylesheet">
|
||||||
|
<link rel="stylesheet" href="style.css">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<a href="#main-content" class="skip-link">דלג לתוכן הראשי</a>
|
||||||
|
|
||||||
|
<nav class="nav" aria-label="ניווט ראשי">
|
||||||
|
<div class="nav__inner">
|
||||||
|
<a href="#" class="nav__logo" aria-label="מרכז האיקידו - דף הבית">
|
||||||
|
<svg viewBox="0 0 50 50" width="48" height="48" aria-hidden="true">
|
||||||
|
<circle cx="25" cy="25" r="23" fill="var(--accent)" stroke="var(--dark)" stroke-width="2"/>
|
||||||
|
<path d="M25 8 L25 42 M13 25 L37 25" stroke="var(--light)" stroke-width="3" stroke-linecap="round"/>
|
||||||
|
</svg>
|
||||||
|
<span>מרכז האיקידו</span>
|
||||||
|
</a>
|
||||||
|
<button class="nav__toggle" aria-expanded="false" aria-controls="nav-menu" aria-label="תפריט">
|
||||||
|
<span></span>
|
||||||
|
<span></span>
|
||||||
|
<span></span>
|
||||||
|
</button>
|
||||||
|
<ul id="nav-menu" class="nav__menu">
|
||||||
|
<li><a href="#about">אודות</a></li>
|
||||||
|
<li><a href="#training">אימונים</a></li>
|
||||||
|
<li><a href="#philosophy">הפילוסופיה</a></li>
|
||||||
|
<li><a href="#contact">צור קשר</a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
<header class="hero">
|
||||||
|
<div class="hero__bg">
|
||||||
|
<div class="hero__circle hero__circle--1"></div>
|
||||||
|
<div class="hero__circle hero__circle--2"></div>
|
||||||
|
<div class="hero__circle hero__circle--3"></div>
|
||||||
|
<svg class="hero__enso" viewBox="0 0 200 200" aria-hidden="true">
|
||||||
|
<circle cx="100" cy="100" r="80" fill="none" stroke="var(--accent)" stroke-width="8" stroke-dasharray="502" stroke-dashoffset="50" stroke-linecap="round"/>
|
||||||
|
</svg>
|
||||||
|
</div>
|
||||||
|
<div class="hero__content">
|
||||||
|
<p class="hero__subtitle reveal">כפר סבא</p>
|
||||||
|
<h1 class="hero__title reveal">
|
||||||
|
<span class="hero__title-main">מרכז האיקידו</span>
|
||||||
|
<span class="hero__title-sub">הישראלי</span>
|
||||||
|
</h1>
|
||||||
|
<p class="hero__tagline reveal">מתחם אימונים חדשני ותוסס</p>
|
||||||
|
<a href="#contact" class="hero__cta reveal">התחילו את המסע</a>
|
||||||
|
</div>
|
||||||
|
<div class="hero__scroll" aria-hidden="true">
|
||||||
|
<span>גללו למטה</span>
|
||||||
|
<svg viewBox="0 0 24 24" width="24" height="24">
|
||||||
|
<path d="M12 4 L12 20 M6 14 L12 20 L18 14" stroke="currentColor" stroke-width="2" fill="none" stroke-linecap="round"/>
|
||||||
|
</svg>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<main id="main-content">
|
||||||
|
<section id="about" class="about">
|
||||||
|
<div class="about__inner">
|
||||||
|
<div class="about__visual reveal">
|
||||||
|
<svg viewBox="0 0 300 400" aria-hidden="true" class="about__illustration">
|
||||||
|
<defs>
|
||||||
|
<linearGradient id="grad1" x1="0%" y1="0%" x2="100%" y2="100%">
|
||||||
|
<stop offset="0%" style="stop-color:var(--accent);stop-opacity:1" />
|
||||||
|
<stop offset="100%" style="stop-color:var(--secondary);stop-opacity:1" />
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
<rect x="20" y="50" width="260" height="300" rx="8" fill="var(--dark)" opacity="0.1"/>
|
||||||
|
<circle cx="150" cy="150" r="60" fill="url(#grad1)" opacity="0.8"/>
|
||||||
|
<path d="M100 280 Q150 220 200 280" stroke="var(--accent)" stroke-width="4" fill="none"/>
|
||||||
|
<line x1="150" y1="100" x2="150" y2="200" stroke="var(--light)" stroke-width="3"/>
|
||||||
|
<circle cx="150" cy="90" r="15" fill="var(--secondary)"/>
|
||||||
|
<path d="M120 140 L150 170 L180 140" stroke="var(--light)" stroke-width="3" fill="none" stroke-linecap="round"/>
|
||||||
|
<path d="M130 180 L150 200 L170 180" stroke="var(--light)" stroke-width="2" fill="none" stroke-linecap="round"/>
|
||||||
|
</svg>
|
||||||
|
</div>
|
||||||
|
<div class="about__content">
|
||||||
|
<h2 class="section-title reveal">אודות המרכז</h2>
|
||||||
|
<p class="about__text reveal">
|
||||||
|
מרכז האיקידו הישראלי בכפר סבא הוא בית לאומנות הלחימה היפנית העתיקה.
|
||||||
|
אנו מציעים סביבת אימונים מודרנית המשלבת מסורת עם חדשנות,
|
||||||
|
בהנחיית מדריכים מוסמכים בעלי ניסיון בינלאומי.
|
||||||
|
</p>
|
||||||
|
<p class="about__text reveal">
|
||||||
|
המתחם שלנו מאובזר באולם אימונים מרווח עם ריצוף טאטאמי מקצועי,
|
||||||
|
חדרי הלבשה נוחים, ואווירה תומכת המעודדת צמיחה אישית והתפתחות.
|
||||||
|
</p>
|
||||||
|
<div class="about__stats reveal">
|
||||||
|
<div class="stat">
|
||||||
|
<span class="stat__number" data-target="15">0</span>
|
||||||
|
<span class="stat__label">שנות ניסיון</span>
|
||||||
|
</div>
|
||||||
|
<div class="stat">
|
||||||
|
<span class="stat__number" data-target="500">0</span>
|
||||||
|
<span class="stat__suffix">+</span>
|
||||||
|
<span class="stat__label">מתאמנים</span>
|
||||||
|
</div>
|
||||||
|
<div class="stat">
|
||||||
|
<span class="stat__number" data-target="8">0</span>
|
||||||
|
<span class="stat__label">מדריכים</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section id="training" class="training">
|
||||||
|
<div class="training__inner">
|
||||||
|
<h2 class="section-title section-title--light reveal">תוכניות אימונים</h2>
|
||||||
|
<div class="training__grid">
|
||||||
|
<article class="training-card training-card--featured reveal">
|
||||||
|
<div class="training-card__badge">מומלץ למתחילים</div>
|
||||||
|
<div class="training-card__icon">
|
||||||
|
<svg viewBox="0 0 60 60" aria-hidden="true">
|
||||||
|
<circle cx="30" cy="20" r="12" fill="var(--accent)"/>
|
||||||
|
<path d="M15 55 L30 35 L45 55" fill="none" stroke="var(--accent)" stroke-width="3"/>
|
||||||
|
</svg>
|
||||||
|
</div>
|
||||||
|
<h3 class="training-card__title">קורס יסודות</h3>
|
||||||
|
<p class="training-card__desc">
|
||||||
|
קורס מקיף לחסרי ניסיון קודם. למדו את העקרונות הבסיסיים,
|
||||||
|
נפילות בטוחות (אוקמי), ותנועות היסוד של האיקידו.
|
||||||
|
הקורס כולל 12 מפגשים שבועיים.
|
||||||
|
</p>
|
||||||
|
<span class="training-card__age">גילאי 16+ | ללא ניסיון קודם</span>
|
||||||
|
</article>
|
||||||
|
|
||||||
|
<article class="training-card reveal">
|
||||||
|
<div class="training-card__icon">
|
||||||
|
<svg viewBox="0 0 60 60" aria-hidden="true">
|
||||||
|
<circle cx="30" cy="30" r="25" fill="none" stroke="var(--secondary)" stroke-width="3"/>
|
||||||
|
<path d="M30 10 L30 50 M10 30 L50 30" stroke="var(--secondary)" stroke-width="3"/>
|
||||||
|
</svg>
|
||||||
|
</div>
|
||||||
|
<h3 class="training-card__title">מתקדמים</h3>
|
||||||
|
<p class="training-card__desc">
|
||||||
|
העמקה בטכניקות מורכבות, עבודה עם נשק מסורתי
|
||||||
|
(ג׳ו, בוקן, טאנטו),
|
||||||
|
והכנה לבחינות דירוג.
|
||||||
|
</p>
|
||||||
|
<span class="training-card__age">דרגת 5 קיו ומעלה</span>
|
||||||
|
</article>
|
||||||
|
|
||||||
|
<article class="training-card reveal">
|
||||||
|
<div class="training-card__icon">
|
||||||
|
<svg viewBox="0 0 60 60" aria-hidden="true">
|
||||||
|
<circle cx="20" cy="25" r="10" fill="var(--accent)"/>
|
||||||
|
<circle cx="40" cy="25" r="8" fill="var(--secondary)"/>
|
||||||
|
<path d="M15 50 Q30 40 45 50" fill="none" stroke="var(--accent)" stroke-width="3"/>
|
||||||
|
</svg>
|
||||||
|
</div>
|
||||||
|
<h3 class="training-card__title">ילדים ונוער</h3>
|
||||||
|
<p class="training-card__desc">
|
||||||
|
פיתוח ביטחון עצמי, ריכוז וכושר גופני דרך משחק ותרגול מותאם גיל.
|
||||||
|
בסביבה בטוחה ומעודדת.
|
||||||
|
</p>
|
||||||
|
<span class="training-card__age">גילאי 6–15</span>
|
||||||
|
</article>
|
||||||
|
|
||||||
|
<article class="training-card reveal">
|
||||||
|
<div class="training-card__icon">
|
||||||
|
<svg viewBox="0 0 60 60" aria-hidden="true">
|
||||||
|
<rect x="15" y="15" width="30" height="30" rx="5" fill="none" stroke="var(--accent)" stroke-width="3"/>
|
||||||
|
<circle cx="30" cy="30" r="8" fill="var(--secondary)"/>
|
||||||
|
</svg>
|
||||||
|
</div>
|
||||||
|
<h3 class="training-card__title">אימון אישי</h3>
|
||||||
|
<p class="training-card__desc">
|
||||||
|
מפגשים פרטיים עם מדריך בכיר להתקדמות מואצת,
|
||||||
|
תיקון טכני, או הכנה לבחינות דירוג.
|
||||||
|
</p>
|
||||||
|
<span class="training-card__age">בתיאום מראש</span>
|
||||||
|
</article>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section id="philosophy" class="philosophy">
|
||||||
|
<div class="philosophy__inner">
|
||||||
|
<div class="philosophy__content">
|
||||||
|
<h2 class="section-title reveal">הדרך של האיקידו</h2>
|
||||||
|
<blockquote class="philosophy__quote reveal">
|
||||||
|
<p>״האיקידו אינה טכניקה להילחם באויב ולהביסו.
|
||||||
|
היא הדרך להרמוניה עם העולם ולהפוך את כל בני האדם למשפחה אחת.״</p>
|
||||||
|
<cite>— מוריהיי אואשיבה, מייסד האיקידו</cite>
|
||||||
|
</blockquote>
|
||||||
|
<div class="philosophy__principles">
|
||||||
|
<div class="principle reveal">
|
||||||
|
<div class="principle__icon">
|
||||||
|
<svg viewBox="0 0 40 40" aria-hidden="true">
|
||||||
|
<circle cx="20" cy="20" r="18" fill="none" stroke="var(--accent)" stroke-width="2"/>
|
||||||
|
<path d="M20 8 C25 15, 25 25, 20 32 C15 25, 15 15, 20 8" fill="var(--accent)" opacity="0.6"/>
|
||||||
|
</svg>
|
||||||
|
</div>
|
||||||
|
<h3>הרמוניה</h3>
|
||||||
|
<p>התמזגות עם אנרגיית היריב במקום התנגדות ישירה</p>
|
||||||
|
</div>
|
||||||
|
<div class="principle reveal">
|
||||||
|
<div class="principle__icon">
|
||||||
|
<svg viewBox="0 0 40 40" aria-hidden="true">
|
||||||
|
<path d="M20 5 L35 35 L5 35 Z" fill="none" stroke="var(--secondary)" stroke-width="2"/>
|
||||||
|
<circle cx="20" cy="25" r="5" fill="var(--secondary)"/>
|
||||||
|
</svg>
|
||||||
|
</div>
|
||||||
|
<h3>מרכוז</h3>
|
||||||
|
<p>שמירה על יציבות פנימית וחיצונית בכל מצב</p>
|
||||||
|
</div>
|
||||||
|
<div class="principle reveal">
|
||||||
|
<div class="principle__icon">
|
||||||
|
<svg viewBox="0 0 40 40" aria-hidden="true">
|
||||||
|
<circle cx="20" cy="20" r="15" fill="none" stroke="var(--accent)" stroke-width="2" stroke-dasharray="5,5"/>
|
||||||
|
<circle cx="20" cy="20" r="8" fill="var(--accent)" opacity="0.4"/>
|
||||||
|
<circle cx="20" cy="20" r="3" fill="var(--accent)"/>
|
||||||
|
</svg>
|
||||||
|
</div>
|
||||||
|
<h3>זרימה</h3>
|
||||||
|
<p>תנועה מתמשכת ומעגלית המנצלת את כוח התנופה</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="philosophy__visual reveal">
|
||||||
|
<div class="tomoe" aria-hidden="true">
|
||||||
|
<div class="tomoe__magatama tomoe__magatama--1"></div>
|
||||||
|
<div class="tomoe__magatama tomoe__magatama--2"></div>
|
||||||
|
<div class="tomoe__magatama tomoe__magatama--3"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="schedule">
|
||||||
|
<div class="schedule__inner">
|
||||||
|
<h2 class="section-title reveal">לוח אימונים</h2>
|
||||||
|
<div class="schedule__table-wrap reveal">
|
||||||
|
<div class="schedule__scroll-hint" aria-hidden="true">
|
||||||
|
<span>← גלילה →</span>
|
||||||
|
</div>
|
||||||
|
<table class="schedule__table">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th scope="col">יום</th>
|
||||||
|
<th scope="col">בוקר</th>
|
||||||
|
<th scope="col">צהריים</th>
|
||||||
|
<th scope="col">ערב</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<th scope="row">ראשון</th>
|
||||||
|
<td>—</td>
|
||||||
|
<td class="schedule__cell--kids">ילדים 16:00</td>
|
||||||
|
<td class="schedule__cell--adult">מבוגרים 19:30</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th scope="row">שני</th>
|
||||||
|
<td class="schedule__cell--adult">מתקדמים 07:00</td>
|
||||||
|
<td>—</td>
|
||||||
|
<td class="schedule__cell--adult">מתחילים 18:30</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th scope="row">שלישי</th>
|
||||||
|
<td>—</td>
|
||||||
|
<td class="schedule__cell--kids">נוער 17:00</td>
|
||||||
|
<td class="schedule__cell--adult">מבוגרים 20:00</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th scope="row">רביעי</th>
|
||||||
|
<td class="schedule__cell--adult">מתקדמים 07:00</td>
|
||||||
|
<td>—</td>
|
||||||
|
<td class="schedule__cell--adult">כללי 19:00</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th scope="row">חמישי</th>
|
||||||
|
<td>—</td>
|
||||||
|
<td class="schedule__cell--kids">ילדים 16:00</td>
|
||||||
|
<td class="schedule__cell--adult">נשק 20:00</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th scope="row">שישי</th>
|
||||||
|
<td class="schedule__cell--special">אימון פתוח 09:00</td>
|
||||||
|
<td>—</td>
|
||||||
|
<td>—</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
<p class="schedule__note reveal">* הלוח עשוי להשתנות בחגים ובחופשות. צרו קשר לאישור.</p>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section id="contact" class="contact">
|
||||||
|
<div class="contact__inner">
|
||||||
|
<div class="contact__info reveal">
|
||||||
|
<h2 class="section-title">בואו להתאמן</h2>
|
||||||
|
<p class="contact__text">
|
||||||
|
מוזמנים לשיעור ניסיון ללא התחייבות.
|
||||||
|
צרו קשר ונתאם מועד שמתאים לכם.
|
||||||
|
</p>
|
||||||
|
<address class="contact__details">
|
||||||
|
<div class="contact__item">
|
||||||
|
<svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true">
|
||||||
|
<path d="M12 2C8 2 5 5 5 9c0 5 7 13 7 13s7-8 7-13c0-4-3-7-7-7z" fill="none" stroke="currentColor" stroke-width="2"/>
|
||||||
|
<circle cx="12" cy="9" r="2.5" fill="currentColor"/>
|
||||||
|
</svg>
|
||||||
|
<span><!-- הזינו כתובת בפועל --><strong>[כתובת המרכז]</strong></span>
|
||||||
|
</div>
|
||||||
|
<div class="contact__item">
|
||||||
|
<svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true">
|
||||||
|
<path d="M22 16.92v3a2 2 0 01-2.18 2 19.79 19.79 0 01-8.63-3.07 19.5 19.5 0 01-6-6 19.79 19.79 0 01-3.07-8.67A2 2 0 014.11 2h3a2 2 0 012 1.72 12.84 12.84 0 00.7 2.81 2 2 0 01-.45 2.11L8.09 9.91a16 16 0 006 6l1.27-1.27a2 2 0 012.11-.45 12.84 12.84 0 002.81.7A2 2 0 0122 16.92z" fill="none" stroke="currentColor" stroke-width="2"/>
|
||||||
|
</svg>
|
||||||
|
<a href="tel:+972-0-000-0000"><!-- הזינו טלפון בפועל --><strong>[טלפון]</strong></a>
|
||||||
|
</div>
|
||||||
|
<div class="contact__item">
|
||||||
|
<svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true">
|
||||||
|
<rect x="2" y="4" width="20" height="16" rx="2" fill="none" stroke="currentColor" stroke-width="2"/>
|
||||||
|
<path d="M22 6L12 13 2 6" fill="none" stroke="currentColor" stroke-width="2"/>
|
||||||
|
</svg>
|
||||||
|
<a href="mailto:info@example.com"><!-- הזינו אימייל בפועל --><strong>[אימייל]</strong></a>
|
||||||
|
</div>
|
||||||
|
</address>
|
||||||
|
<p class="contact__social-note">עקבו אחרינו:</p>
|
||||||
|
<div class="contact__social">
|
||||||
|
<a href="#" class="social-link" aria-label="פייסבוק (הקישור יעודכן בקרוב)">
|
||||||
|
<svg viewBox="0 0 24 24" width="28" height="28">
|
||||||
|
<path d="M18 2h-3a5 5 0 00-5 5v3H7v4h3v8h4v-8h3l1-4h-4V7a1 1 0 011-1h3z" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||||
|
</svg>
|
||||||
|
</a>
|
||||||
|
<a href="#" class="social-link" aria-label="אינסטגרם (הקישור יעודכן בקרוב)">
|
||||||
|
<svg viewBox="0 0 24 24" width="28" height="28">
|
||||||
|
<rect x="2" y="2" width="20" height="20" rx="5" fill="none" stroke="currentColor" stroke-width="2"/>
|
||||||
|
<circle cx="12" cy="12" r="4" fill="none" stroke="currentColor" stroke-width="2"/>
|
||||||
|
<circle cx="18" cy="6" r="1" fill="currentColor"/>
|
||||||
|
</svg>
|
||||||
|
</a>
|
||||||
|
<a href="#" class="social-link" aria-label="יוטיוב (הקישור יעודכן בקרוב)">
|
||||||
|
<svg viewBox="0 0 24 24" width="28" height="28">
|
||||||
|
<path d="M22.54 6.42a2.78 2.78 0 00-1.94-2C18.88 4 12 4 12 4s-6.88 0-8.6.46a2.78 2.78 0 00-1.94 2A29 29 0 001 12a29 29 0 00.46 5.58 2.78 2.78 0 001.94 2c1.72.46 8.6.46 8.6.46s6.88 0 8.6-.46a2.78 2.78 0 001.94-2A29 29 0 0023 12a29 29 0 00-.46-5.58z" fill="none" stroke="currentColor" stroke-width="2"/>
|
||||||
|
<polygon points="9.75,15.02 15.5,12 9.75,8.98" fill="currentColor"/>
|
||||||
|
</svg>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<form class="contact__form reveal" action="#" method="post" novalidate>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="name">שם מלא <span class="required" aria-hidden="true">*</span></label>
|
||||||
|
<input type="text" id="name" name="name" required autocomplete="name" aria-describedby="name-error">
|
||||||
|
<span id="name-error" class="form-error" role="alert"></span>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="email">דוא״ל <span class="required" aria-hidden="true">*</span></label>
|
||||||
|
<input type="email" id="email" name="email" required autocomplete="email" aria-describedby="email-error">
|
||||||
|
<span id="email-error" class="form-error" role="alert"></span>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="phone">טלפון</label>
|
||||||
|
<input type="tel" id="phone" name="phone" autocomplete="tel">
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="interest">מתעניין/ת ב...</label>
|
||||||
|
<select id="interest" name="interest">
|
||||||
|
<option value="">בחרו אפשרות</option>
|
||||||
|
<option value="beginner">קורס יסודות</option>
|
||||||
|
<option value="advanced">אימון מתקדמים</option>
|
||||||
|
<option value="kids">ילדים ונוער</option>
|
||||||
|
<option value="private">אימון אישי</option>
|
||||||
|
<option value="trial">שיעור ניסיון</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div class="form-group form-group--full">
|
||||||
|
<label for="message">הודעה</label>
|
||||||
|
<textarea id="message" name="message" rows="4"></textarea>
|
||||||
|
</div>
|
||||||
|
<button type="submit" class="form-submit">שלחו הודעה</button>
|
||||||
|
<div class="form-status" role="status" aria-live="polite"></div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</main>
|
||||||
|
|
||||||
|
<footer class="footer">
|
||||||
|
<div class="footer__inner">
|
||||||
|
<div class="footer__logo">
|
||||||
|
<svg viewBox="0 0 50 50" width="40" height="40" aria-hidden="true">
|
||||||
|
<circle cx="25" cy="25" r="23" fill="var(--accent)" stroke="var(--light)" stroke-width="2"/>
|
||||||
|
<path d="M25 8 L25 42 M13 25 L37 25" stroke="var(--light)" stroke-width="3" stroke-linecap="round"/>
|
||||||
|
</svg>
|
||||||
|
<span>מרכז האיקידו הישראלי</span>
|
||||||
|
</div>
|
||||||
|
<nav class="footer__nav" aria-label="ניווט תחתון">
|
||||||
|
<a href="#about">אודות</a>
|
||||||
|
<a href="#training">אימונים</a>
|
||||||
|
<a href="#philosophy">פילוסופיה</a>
|
||||||
|
<a href="#contact">צור קשר</a>
|
||||||
|
</nav>
|
||||||
|
<p class="footer__copy">© <span id="current-year">2024</span> מרכז האיקידו הישראלי. כל הזכויות שמורות.</p>
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
|
|
||||||
|
<script src="script.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -0,0 +1,301 @@
|
|||||||
|
(function() {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
// Check for reduced motion preference
|
||||||
|
const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;
|
||||||
|
|
||||||
|
// Set current year in footer
|
||||||
|
const yearEl = document.getElementById('current-year');
|
||||||
|
if (yearEl) {
|
||||||
|
yearEl.textContent = new Date().getFullYear();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Navigation scroll behavior
|
||||||
|
const nav = document.querySelector('.nav');
|
||||||
|
let lastScrollY = window.scrollY;
|
||||||
|
let ticking = false;
|
||||||
|
|
||||||
|
function updateNav() {
|
||||||
|
const currentScrollY = window.scrollY;
|
||||||
|
|
||||||
|
if (currentScrollY > 100) {
|
||||||
|
nav.classList.add('nav--scrolled');
|
||||||
|
} else {
|
||||||
|
nav.classList.remove('nav--scrolled');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (currentScrollY > lastScrollY && currentScrollY > 500) {
|
||||||
|
nav.classList.add('nav--hidden');
|
||||||
|
} else {
|
||||||
|
nav.classList.remove('nav--hidden');
|
||||||
|
}
|
||||||
|
|
||||||
|
lastScrollY = currentScrollY;
|
||||||
|
ticking = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
window.addEventListener('scroll', function() {
|
||||||
|
if (!ticking) {
|
||||||
|
requestAnimationFrame(updateNav);
|
||||||
|
ticking = true;
|
||||||
|
}
|
||||||
|
}, { passive: true });
|
||||||
|
|
||||||
|
// Mobile menu toggle
|
||||||
|
const navToggle = document.querySelector('.nav__toggle');
|
||||||
|
const navMenu = document.querySelector('.nav__menu');
|
||||||
|
|
||||||
|
if (navToggle && navMenu) {
|
||||||
|
navToggle.addEventListener('click', function() {
|
||||||
|
const isExpanded = this.getAttribute('aria-expanded') === 'true';
|
||||||
|
this.setAttribute('aria-expanded', !isExpanded);
|
||||||
|
navMenu.classList.toggle('is-open');
|
||||||
|
});
|
||||||
|
|
||||||
|
// Close mobile menu on link click
|
||||||
|
navMenu.querySelectorAll('a').forEach(link => {
|
||||||
|
link.addEventListener('click', function() {
|
||||||
|
navToggle.setAttribute('aria-expanded', 'false');
|
||||||
|
navMenu.classList.remove('is-open');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fade out scroll indicator after delay
|
||||||
|
const heroScroll = document.querySelector('.hero__scroll');
|
||||||
|
if (heroScroll && !prefersReducedMotion) {
|
||||||
|
setTimeout(() => {
|
||||||
|
heroScroll.classList.add('is-faded');
|
||||||
|
}, 4000);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reveal animations with Intersection Observer
|
||||||
|
const revealElements = document.querySelectorAll('.reveal');
|
||||||
|
|
||||||
|
if (prefersReducedMotion) {
|
||||||
|
// Show all elements immediately if reduced motion is preferred
|
||||||
|
revealElements.forEach(el => {
|
||||||
|
el.classList.add('is-visible');
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
let revealDelay = 0;
|
||||||
|
|
||||||
|
const revealObserver = new IntersectionObserver((entries) => {
|
||||||
|
entries.forEach((entry) => {
|
||||||
|
if (entry.isIntersecting) {
|
||||||
|
// Use a stagger based on when elements enter viewport
|
||||||
|
setTimeout(() => {
|
||||||
|
entry.target.classList.add('is-visible');
|
||||||
|
}, revealDelay);
|
||||||
|
revealDelay += 80;
|
||||||
|
|
||||||
|
// Reset delay after a batch
|
||||||
|
setTimeout(() => {
|
||||||
|
revealDelay = 0;
|
||||||
|
}, 500);
|
||||||
|
|
||||||
|
revealObserver.unobserve(entry.target);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}, {
|
||||||
|
threshold: 0.15,
|
||||||
|
rootMargin: '0px 0px -40px 0px'
|
||||||
|
});
|
||||||
|
|
||||||
|
revealElements.forEach(el => revealObserver.observe(el));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Animated counters
|
||||||
|
function animateCounter(element, target, duration = 1800) {
|
||||||
|
if (prefersReducedMotion) {
|
||||||
|
element.textContent = target;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const start = performance.now();
|
||||||
|
|
||||||
|
function updateCounter(currentTime) {
|
||||||
|
const elapsed = currentTime - start;
|
||||||
|
const progress = Math.min(elapsed / duration, 1);
|
||||||
|
|
||||||
|
// Ease out cubic
|
||||||
|
const easeOut = 1 - Math.pow(1 - progress, 3);
|
||||||
|
const current = Math.floor(easeOut * target);
|
||||||
|
|
||||||
|
element.textContent = current;
|
||||||
|
|
||||||
|
if (progress < 1) {
|
||||||
|
requestAnimationFrame(updateCounter);
|
||||||
|
} else {
|
||||||
|
element.textContent = target;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
requestAnimationFrame(updateCounter);
|
||||||
|
}
|
||||||
|
|
||||||
|
const statNumbers = document.querySelectorAll('.stat__number');
|
||||||
|
|
||||||
|
const statsObserver = new IntersectionObserver((entries) => {
|
||||||
|
entries.forEach(entry => {
|
||||||
|
if (entry.isIntersecting) {
|
||||||
|
const target = parseInt(entry.target.dataset.target, 10);
|
||||||
|
animateCounter(entry.target, target);
|
||||||
|
statsObserver.unobserve(entry.target);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}, {
|
||||||
|
threshold: 0.5
|
||||||
|
});
|
||||||
|
|
||||||
|
statNumbers.forEach(stat => statsObserver.observe(stat));
|
||||||
|
|
||||||
|
// Smooth scroll for anchor links
|
||||||
|
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
|
||||||
|
anchor.addEventListener('click', function(e) {
|
||||||
|
const href = this.getAttribute('href');
|
||||||
|
if (href === '#') return;
|
||||||
|
|
||||||
|
e.preventDefault();
|
||||||
|
const target = document.querySelector(href);
|
||||||
|
|
||||||
|
if (target) {
|
||||||
|
const navHeight = nav ? nav.offsetHeight : 0;
|
||||||
|
const targetPosition = target.getBoundingClientRect().top + window.scrollY - navHeight - 20;
|
||||||
|
|
||||||
|
window.scrollTo({
|
||||||
|
top: targetPosition,
|
||||||
|
behavior: prefersReducedMotion ? 'auto' : 'smooth'
|
||||||
|
});
|
||||||
|
|
||||||
|
// Set focus for accessibility
|
||||||
|
target.setAttribute('tabindex', '-1');
|
||||||
|
target.focus({ preventScroll: true });
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// Hero title animation
|
||||||
|
if (!prefersReducedMotion) {
|
||||||
|
const heroTitle = document.querySelector('.hero__title');
|
||||||
|
if (heroTitle) {
|
||||||
|
heroTitle.style.opacity = '0';
|
||||||
|
heroTitle.style.transform = 'translateY(30px)';
|
||||||
|
|
||||||
|
setTimeout(() => {
|
||||||
|
heroTitle.style.transition = 'opacity 0.8s ease, transform 0.8s ease';
|
||||||
|
heroTitle.style.opacity = '1';
|
||||||
|
heroTitle.style.transform = 'translateY(0)';
|
||||||
|
}, 200);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Email validation helper
|
||||||
|
function isValidEmail(email) {
|
||||||
|
return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Form submission handling
|
||||||
|
const contactForm = document.querySelector('.contact__form');
|
||||||
|
const formStatus = document.querySelector('.form-status');
|
||||||
|
|
||||||
|
if (contactForm && formStatus) {
|
||||||
|
const nameInput = document.getElementById('name');
|
||||||
|
const emailInput = document.getElementById('email');
|
||||||
|
const nameError = document.getElementById('name-error');
|
||||||
|
const emailError = document.getElementById('email-error');
|
||||||
|
|
||||||
|
// Clear error on input
|
||||||
|
if (nameInput && nameError) {
|
||||||
|
nameInput.addEventListener('input', function() {
|
||||||
|
this.removeAttribute('aria-invalid');
|
||||||
|
nameError.textContent = '';
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (emailInput && emailError) {
|
||||||
|
emailInput.addEventListener('input', function() {
|
||||||
|
this.removeAttribute('aria-invalid');
|
||||||
|
emailError.textContent = '';
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
contactForm.addEventListener('submit', function(e) {
|
||||||
|
e.preventDefault();
|
||||||
|
|
||||||
|
const submitBtn = this.querySelector('.form-submit');
|
||||||
|
const originalText = submitBtn.textContent;
|
||||||
|
let isValid = true;
|
||||||
|
|
||||||
|
// Validate name
|
||||||
|
if (nameInput && !nameInput.value.trim()) {
|
||||||
|
isValid = false;
|
||||||
|
nameInput.setAttribute('aria-invalid', 'true');
|
||||||
|
if (nameError) nameError.textContent = 'נא להזין שם מלא';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Validate email
|
||||||
|
if (emailInput) {
|
||||||
|
if (!emailInput.value.trim()) {
|
||||||
|
isValid = false;
|
||||||
|
emailInput.setAttribute('aria-invalid', 'true');
|
||||||
|
if (emailError) emailError.textContent = 'נא להזין כתובת דוא״ל';
|
||||||
|
} else if (!isValidEmail(emailInput.value.trim())) {
|
||||||
|
isValid = false;
|
||||||
|
emailInput.setAttribute('aria-invalid', 'true');
|
||||||
|
if (emailError) emailError.textContent = 'כתובת דוא״ל לא תקינה';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isValid) {
|
||||||
|
formStatus.textContent = 'נא לתקן את השגיאות בטופס';
|
||||||
|
formStatus.className = 'form-status form-status--error';
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
submitBtn.textContent = 'שולח...';
|
||||||
|
submitBtn.disabled = true;
|
||||||
|
formStatus.textContent = '';
|
||||||
|
|
||||||
|
// Simulate form submission
|
||||||
|
setTimeout(() => {
|
||||||
|
submitBtn.textContent = 'נשלח בהצלחה! ✓';
|
||||||
|
submitBtn.style.background = 'var(--tertiary)';
|
||||||
|
formStatus.textContent = 'ההודעה נשלחה בהצלחה. ניצור איתכם קשר בהקדם.';
|
||||||
|
formStatus.className = 'form-status form-status--success';
|
||||||
|
|
||||||
|
setTimeout(() => {
|
||||||
|
submitBtn.textContent = originalText;
|
||||||
|
submitBtn.style.background = '';
|
||||||
|
submitBtn.disabled = false;
|
||||||
|
contactForm.reset();
|
||||||
|
formStatus.textContent = '';
|
||||||
|
formStatus.className = 'form-status';
|
||||||
|
}, 4000);
|
||||||
|
}, 1500);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Keyboard navigation enhancement
|
||||||
|
document.addEventListener('keydown', function(e) {
|
||||||
|
if (e.key === 'Escape' && navToggle && navMenu) {
|
||||||
|
navToggle.setAttribute('aria-expanded', 'false');
|
||||||
|
navMenu.classList.remove('is-open');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Detect scroll on table
|
||||||
|
const tableWrap = document.querySelector('.schedule__table-wrap');
|
||||||
|
const scrollHint = document.querySelector('.schedule__scroll-hint');
|
||||||
|
|
||||||
|
if (tableWrap && scrollHint) {
|
||||||
|
tableWrap.addEventListener('scroll', function() {
|
||||||
|
if (this.scrollLeft > 10) {
|
||||||
|
scrollHint.style.opacity = '0';
|
||||||
|
} else {
|
||||||
|
scrollHint.style.opacity = '1';
|
||||||
|
}
|
||||||
|
}, { passive: true });
|
||||||
|
}
|
||||||
|
|
||||||
|
})();
|
||||||
Reference in New Issue
Block a user