1+ document . addEventListener ( 'DOMContentLoaded' , function ( ) {
2+ const langToggle = document . getElementById ( 'langToggle' ) ;
3+ const htmlElement = document . querySelector ( 'html' ) ;
4+ const bodyElement = document . querySelector ( 'body' ) ;
5+
6+ const savedLang = localStorage . getItem ( 'preferredLang' ) || 'ar' ;
7+ setLanguage ( savedLang ) ;
8+
9+ langToggle . addEventListener ( 'click' , function ( ) {
10+ const currentLang = htmlElement . getAttribute ( 'lang' ) ;
11+ const newLang = currentLang === 'ar' ? 'en' : 'ar' ;
12+ setLanguage ( newLang ) ;
13+ localStorage . setItem ( 'preferredLang' , newLang ) ;
14+ } ) ;
15+
16+ function setLanguage ( lang ) {
17+ htmlElement . setAttribute ( 'lang' , lang ) ;
18+ htmlElement . setAttribute ( 'dir' , lang === 'ar' ? 'rtl' : 'ltr' ) ;
19+ bodyElement . setAttribute ( 'dir' , lang === 'ar' ? 'rtl' : 'ltr' ) ;
20+
21+ updateTexts ( lang ) ;
22+
23+ langToggle . textContent = lang === 'ar' ? 'EN' : 'AR' ;
24+ }
25+
26+ function updateTexts ( lang ) {
27+ const elements = document . querySelectorAll ( '[data-ar], [data-en]' ) ;
28+
29+ elements . forEach ( element => {
30+ const text = lang === 'ar' ?
31+ element . getAttribute ( 'data-ar' ) :
32+ element . getAttribute ( 'data-en' ) ;
33+
34+ if ( text ) {
35+ element . textContent = text ;
36+ }
37+ } ) ;
38+ }
39+
40+ const navToggle = document . querySelector ( '.nav-toggle' ) ;
41+ const navLinks = document . querySelector ( '.nav-links' ) ;
42+
43+ if ( navToggle ) {
44+ navToggle . addEventListener ( 'click' , function ( ) {
45+ navLinks . classList . toggle ( 'active' ) ;
46+ } ) ;
47+ }
48+
49+ document . querySelectorAll ( '.nav-link' ) . forEach ( link => {
50+ link . addEventListener ( 'click' , function ( ) {
51+ navLinks . classList . remove ( 'active' ) ;
52+ } ) ;
53+ } ) ;
54+
55+ window . addEventListener ( 'scroll' , function ( ) {
56+ const navbar = document . querySelector ( '.navbar' ) ;
57+ if ( window . scrollY > 50 ) {
58+ navbar . style . backgroundColor = 'rgba(255, 255, 255, 0.95)' ;
59+ navbar . style . backdropFilter = 'blur(10px)' ;
60+ } else {
61+ navbar . style . backgroundColor = 'var(--bg-color)' ;
62+ navbar . style . backdropFilter = 'none' ;
63+ }
64+ } ) ;
65+
66+ loadGitHubStats ( ) ;
67+
68+ function loadGitHubStats ( ) {
69+ fetch ( 'https://api.github.com/repos/wsl-iq/Python-Executable' )
70+ . then ( response => response . json ( ) )
71+ . then ( data => {
72+ document . getElementById ( 'stars' ) . textContent = data . stargazers_count ;
73+ document . getElementById ( 'forks' ) . textContent = data . forks_count ;
74+ document . getElementById ( 'watchers' ) . textContent = data . watchers_count ;
75+ } )
76+ . catch ( error => {
77+ console . error ( 'Error fetching GitHub data:' , error ) ;
78+ } ) ;
79+ }
80+
81+ const observerOptions = {
82+ threshold : 0.1 ,
83+ rootMargin : '0px 0px -50px 0px'
84+ } ;
85+
86+ const observer = new IntersectionObserver ( function ( entries ) {
87+ entries . forEach ( entry => {
88+ if ( entry . isIntersecting ) {
89+ entry . target . style . opacity = '1' ;
90+ entry . target . style . transform = 'translateY(0)' ;
91+ }
92+ } ) ;
93+ } , observerOptions ) ;
94+
95+ document . querySelectorAll ( '.feature-card, .download-card' ) . forEach ( card => {
96+ card . style . opacity = '0' ;
97+ card . style . transform = 'translateY(20px)' ;
98+ card . style . transition = 'opacity 0.5s ease, transform 0.5s ease' ;
99+ observer . observe ( card ) ;
100+ } ) ;
101+ } ) ;
0 commit comments