Upload 13 files
Browse files- static/create.html +25 -2
- static/dashboard.html +4 -2
- static/forgot-password.html +4 -2
- static/index.html +4 -2
- static/login.html +4 -2
- static/messages.html +4 -2
- static/profile.html +5 -3
- static/project.html +4 -2
- static/reset-password.html +4 -2
- static/signup.html +31 -3
static/create.html
CHANGED
|
@@ -214,7 +214,10 @@ textarea{ resize:vertical; min-height:100px; }
|
|
| 214 |
background: var(--bg); border-top:1px solid var(--line);
|
| 215 |
padding: 6px 4px calc(6px + env(safe-area-inset-bottom));
|
| 216 |
box-shadow: 0 -2px 14px rgba(10,10,10,0.05);
|
|
|
|
|
|
|
| 217 |
}
|
|
|
|
| 218 |
.bn-item{
|
| 219 |
flex:1; display:flex; flex-direction:column; align-items:center; gap:3px;
|
| 220 |
padding:6px 2px; border-radius:12px; color: var(--muted-soft);
|
|
@@ -434,7 +437,8 @@ function renderBottomNav(active){
|
|
| 434 |
dashboard: '<svg viewBox="0 0 24 24"><rect x="3" y="3" width="7" height="9" rx="1.5"/><rect x="14" y="3" width="7" height="5" rx="1.5"/><rect x="14" y="12" width="7" height="9" rx="1.5"/><rect x="3" y="16" width="7" height="5" rx="1.5"/></svg>',
|
| 435 |
messages: '<svg viewBox="0 0 24 24"><path d="M21 15a2 2 0 01-2 2H8l-5 4V5a2 2 0 012-2h14a2 2 0 012 2z"/></svg>',
|
| 436 |
profile: '<svg viewBox="0 0 24 24"><circle cx="12" cy="8" r="4"/><path d="M4 21c0-4.4 3.6-8 8-8s8 3.6 8 8"/></svg>',
|
| 437 |
-
login: '<svg viewBox="0 0 24 24"><path d="M15 3h4a2 2 0 012 2v14a2 2 0 01-2 2h-4M10 17l5-5-5-5M15 12H3"/></svg>'
|
|
|
|
| 438 |
};
|
| 439 |
let tabs = [
|
| 440 |
{ key:'browse', href:'index.html', label:'\u0627\u0633\u062a\u0643\u0634\u0641' },
|
|
@@ -447,11 +451,30 @@ function renderBottomNav(active){
|
|
| 447 |
} else {
|
| 448 |
tabs.push({ key:'login', href:'login.html', label:'\u062f\u062e\u0648\u0644' });
|
| 449 |
}
|
|
|
|
| 450 |
const nav = document.createElement('div');
|
| 451 |
nav.id = 'bottom-nav';
|
| 452 |
nav.className = 'bottom-nav';
|
| 453 |
nav.innerHTML = tabs.map(t => `<a class="bn-item ${t.key===active?'active':''}" href="${t.href}">${icons[t.key]}<span>${t.label}</span></a>`).join('');
|
| 454 |
document.body.appendChild(nav);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 455 |
}
|
| 456 |
|
| 457 |
function renderFooter(){
|
|
@@ -460,7 +483,7 @@ function renderFooter(){
|
|
| 460 |
el.id = 'global-footer-note';
|
| 461 |
el.className = 'footer-note';
|
| 462 |
el.style.cssText = 'margin-top:8px;';
|
| 463 |
-
el.innerHTML = '\u0646\u064a\u0651\u0629 \u0648\u0633\u064a\u0637 \u062a\u0648\u0627\u0635\u0644 \u0641\u0642\u0637 \u00b7 <a href="terms.html" style="text-decoration:underline;">\u0627\u0644\u0634\u0631\u0648\u0637 \u0648\u0627\u0644\u0623\u062d\u0643\u0627\u0645</a>';
|
| 464 |
document.body.appendChild(el);
|
| 465 |
}
|
| 466 |
|
|
|
|
| 214 |
background: var(--bg); border-top:1px solid var(--line);
|
| 215 |
padding: 6px 4px calc(6px + env(safe-area-inset-bottom));
|
| 216 |
box-shadow: 0 -2px 14px rgba(10,10,10,0.05);
|
| 217 |
+
transform: translateY(0); transition: transform .28s cubic-bezier(.4,0,.2,1);
|
| 218 |
+
will-change: transform;
|
| 219 |
}
|
| 220 |
+
.bottom-nav.bn-hidden{ transform: translateY(100%); }
|
| 221 |
.bn-item{
|
| 222 |
flex:1; display:flex; flex-direction:column; align-items:center; gap:3px;
|
| 223 |
padding:6px 2px; border-radius:12px; color: var(--muted-soft);
|
|
|
|
| 437 |
dashboard: '<svg viewBox="0 0 24 24"><rect x="3" y="3" width="7" height="9" rx="1.5"/><rect x="14" y="3" width="7" height="5" rx="1.5"/><rect x="14" y="12" width="7" height="9" rx="1.5"/><rect x="3" y="16" width="7" height="5" rx="1.5"/></svg>',
|
| 438 |
messages: '<svg viewBox="0 0 24 24"><path d="M21 15a2 2 0 01-2 2H8l-5 4V5a2 2 0 012-2h14a2 2 0 012 2z"/></svg>',
|
| 439 |
profile: '<svg viewBox="0 0 24 24"><circle cx="12" cy="8" r="4"/><path d="M4 21c0-4.4 3.6-8 8-8s8 3.6 8 8"/></svg>',
|
| 440 |
+
login: '<svg viewBox="0 0 24 24"><path d="M15 3h4a2 2 0 012 2v14a2 2 0 01-2 2h-4M10 17l5-5-5-5M15 12H3"/></svg>',
|
| 441 |
+
about: '<svg viewBox="0 0 24 24"><circle cx="12" cy="12" r="9"/><path d="M12 8v5M12 16h.01"/></svg>'
|
| 442 |
};
|
| 443 |
let tabs = [
|
| 444 |
{ key:'browse', href:'index.html', label:'\u0627\u0633\u062a\u0643\u0634\u0641' },
|
|
|
|
| 451 |
} else {
|
| 452 |
tabs.push({ key:'login', href:'login.html', label:'\u062f\u062e\u0648\u0644' });
|
| 453 |
}
|
| 454 |
+
tabs.push({ key:'about', href:'about.html', label:'\u062a\u0648\u0627\u0635\u0644' });
|
| 455 |
const nav = document.createElement('div');
|
| 456 |
nav.id = 'bottom-nav';
|
| 457 |
nav.className = 'bottom-nav';
|
| 458 |
nav.innerHTML = tabs.map(t => `<a class="bn-item ${t.key===active?'active':''}" href="${t.href}">${icons[t.key]}<span>${t.label}</span></a>`).join('');
|
| 459 |
document.body.appendChild(nav);
|
| 460 |
+
initBottomNavAutoHide(nav);
|
| 461 |
+
}
|
| 462 |
+
|
| 463 |
+
function initBottomNavAutoHide(nav){
|
| 464 |
+
let lastY = window.scrollY, ticking = false;
|
| 465 |
+
window.addEventListener('scroll', () => {
|
| 466 |
+
if(ticking) return;
|
| 467 |
+
ticking = true;
|
| 468 |
+
requestAnimationFrame(() => {
|
| 469 |
+
const y = window.scrollY;
|
| 470 |
+
const delta = y - lastY;
|
| 471 |
+
if(y < 40){ nav.classList.remove('bn-hidden'); }
|
| 472 |
+
else if(delta > 6){ nav.classList.add('bn-hidden'); }
|
| 473 |
+
else if(delta < -6){ nav.classList.remove('bn-hidden'); }
|
| 474 |
+
lastY = y;
|
| 475 |
+
ticking = false;
|
| 476 |
+
});
|
| 477 |
+
}, { passive:true });
|
| 478 |
}
|
| 479 |
|
| 480 |
function renderFooter(){
|
|
|
|
| 483 |
el.id = 'global-footer-note';
|
| 484 |
el.className = 'footer-note';
|
| 485 |
el.style.cssText = 'margin-top:8px;';
|
| 486 |
+
el.innerHTML = '\u0646\u064a\u0651\u0629 \u0648\u0633\u064a\u0637 \u062a\u0648\u0627\u0635\u0644 \u0641\u0642\u0637 \u00b7 <a href="terms.html" style="text-decoration:underline;">\u0627\u0644\u0634\u0631\u0648\u0637 \u0648\u0627\u0644\u0623\u062d\u0643\u0627\u0645</a> \u00b7 <a href="about.html" style="text-decoration:underline;">\u062a\u0648\u0627\u0635\u0644 \u0645\u0639\u0627\u0646\u0627</a>';
|
| 487 |
document.body.appendChild(el);
|
| 488 |
}
|
| 489 |
|
static/dashboard.html
CHANGED
|
@@ -378,7 +378,8 @@ function renderBottomNav(active){
|
|
| 378 |
dashboard: '<svg viewBox="0 0 24 24"><rect x="3" y="3" width="7" height="9" rx="1.5"/><rect x="14" y="3" width="7" height="5" rx="1.5"/><rect x="14" y="12" width="7" height="9" rx="1.5"/><rect x="3" y="16" width="7" height="5" rx="1.5"/></svg>',
|
| 379 |
messages: '<svg viewBox="0 0 24 24"><path d="M21 15a2 2 0 01-2 2H8l-5 4V5a2 2 0 012-2h14a2 2 0 012 2z"/></svg>',
|
| 380 |
profile: '<svg viewBox="0 0 24 24"><circle cx="12" cy="8" r="4"/><path d="M4 21c0-4.4 3.6-8 8-8s8 3.6 8 8"/></svg>',
|
| 381 |
-
login: '<svg viewBox="0 0 24 24"><path d="M15 3h4a2 2 0 012 2v14a2 2 0 01-2 2h-4M10 17l5-5-5-5M15 12H3"/></svg>'
|
|
|
|
| 382 |
};
|
| 383 |
let tabs = [
|
| 384 |
{ key:'browse', href:'index.html', label:'\u0627\u0633\u062a\u0643\u0634\u0641' },
|
|
@@ -391,6 +392,7 @@ function renderBottomNav(active){
|
|
| 391 |
} else {
|
| 392 |
tabs.push({ key:'login', href:'login.html', label:'\u062f\u062e\u0648\u0644' });
|
| 393 |
}
|
|
|
|
| 394 |
const nav = document.createElement('div');
|
| 395 |
nav.id = 'bottom-nav';
|
| 396 |
nav.className = 'bottom-nav';
|
|
@@ -423,7 +425,7 @@ function renderFooter(){
|
|
| 423 |
el.id = 'global-footer-note';
|
| 424 |
el.className = 'footer-note';
|
| 425 |
el.style.cssText = 'margin-top:8px;';
|
| 426 |
-
el.innerHTML = '\u0646\u064a\u0651\u0629 \u0648\u0633\u064a\u0637 \u062a\u0648\u0627\u0635\u0644 \u0641\u0642\u0637 \u00b7 <a href="terms.html" style="text-decoration:underline;">\u0627\u0644\u0634\u0631\u0648\u0637 \u0648\u0627\u0644\u0623\u062d\u0643\u0627\u0645</a>';
|
| 427 |
document.body.appendChild(el);
|
| 428 |
}
|
| 429 |
|
|
|
|
| 378 |
dashboard: '<svg viewBox="0 0 24 24"><rect x="3" y="3" width="7" height="9" rx="1.5"/><rect x="14" y="3" width="7" height="5" rx="1.5"/><rect x="14" y="12" width="7" height="9" rx="1.5"/><rect x="3" y="16" width="7" height="5" rx="1.5"/></svg>',
|
| 379 |
messages: '<svg viewBox="0 0 24 24"><path d="M21 15a2 2 0 01-2 2H8l-5 4V5a2 2 0 012-2h14a2 2 0 012 2z"/></svg>',
|
| 380 |
profile: '<svg viewBox="0 0 24 24"><circle cx="12" cy="8" r="4"/><path d="M4 21c0-4.4 3.6-8 8-8s8 3.6 8 8"/></svg>',
|
| 381 |
+
login: '<svg viewBox="0 0 24 24"><path d="M15 3h4a2 2 0 012 2v14a2 2 0 01-2 2h-4M10 17l5-5-5-5M15 12H3"/></svg>',
|
| 382 |
+
about: '<svg viewBox="0 0 24 24"><circle cx="12" cy="12" r="9"/><path d="M12 8v5M12 16h.01"/></svg>'
|
| 383 |
};
|
| 384 |
let tabs = [
|
| 385 |
{ key:'browse', href:'index.html', label:'\u0627\u0633\u062a\u0643\u0634\u0641' },
|
|
|
|
| 392 |
} else {
|
| 393 |
tabs.push({ key:'login', href:'login.html', label:'\u062f\u062e\u0648\u0644' });
|
| 394 |
}
|
| 395 |
+
tabs.push({ key:'about', href:'about.html', label:'\u062a\u0648\u0627\u0635\u0644' });
|
| 396 |
const nav = document.createElement('div');
|
| 397 |
nav.id = 'bottom-nav';
|
| 398 |
nav.className = 'bottom-nav';
|
|
|
|
| 425 |
el.id = 'global-footer-note';
|
| 426 |
el.className = 'footer-note';
|
| 427 |
el.style.cssText = 'margin-top:8px;';
|
| 428 |
+
el.innerHTML = '\u0646\u064a\u0651\u0629 \u0648\u0633\u064a\u0637 \u062a\u0648\u0627\u0635\u0644 \u0641\u0642\u0637 \u00b7 <a href="terms.html" style="text-decoration:underline;">\u0627\u0644\u0634\u0631\u0648\u0637 \u0648\u0627\u0644\u0623\u062d\u0643\u0627\u0645</a> \u00b7 <a href="about.html" style="text-decoration:underline;">\u062a\u0648\u0627\u0635\u0644 \u0645\u0639\u0627\u0646\u0627</a>';
|
| 429 |
document.body.appendChild(el);
|
| 430 |
}
|
| 431 |
|
static/forgot-password.html
CHANGED
|
@@ -378,7 +378,8 @@ function renderBottomNav(active){
|
|
| 378 |
dashboard: '<svg viewBox="0 0 24 24"><rect x="3" y="3" width="7" height="9" rx="1.5"/><rect x="14" y="3" width="7" height="5" rx="1.5"/><rect x="14" y="12" width="7" height="9" rx="1.5"/><rect x="3" y="16" width="7" height="5" rx="1.5"/></svg>',
|
| 379 |
messages: '<svg viewBox="0 0 24 24"><path d="M21 15a2 2 0 01-2 2H8l-5 4V5a2 2 0 012-2h14a2 2 0 012 2z"/></svg>',
|
| 380 |
profile: '<svg viewBox="0 0 24 24"><circle cx="12" cy="8" r="4"/><path d="M4 21c0-4.4 3.6-8 8-8s8 3.6 8 8"/></svg>',
|
| 381 |
-
login: '<svg viewBox="0 0 24 24"><path d="M15 3h4a2 2 0 012 2v14a2 2 0 01-2 2h-4M10 17l5-5-5-5M15 12H3"/></svg>'
|
|
|
|
| 382 |
};
|
| 383 |
let tabs = [
|
| 384 |
{ key:'browse', href:'index.html', label:'\u0627\u0633\u062a\u0643\u0634\u0641' },
|
|
@@ -391,6 +392,7 @@ function renderBottomNav(active){
|
|
| 391 |
} else {
|
| 392 |
tabs.push({ key:'login', href:'login.html', label:'\u062f\u062e\u0648\u0644' });
|
| 393 |
}
|
|
|
|
| 394 |
const nav = document.createElement('div');
|
| 395 |
nav.id = 'bottom-nav';
|
| 396 |
nav.className = 'bottom-nav';
|
|
@@ -423,7 +425,7 @@ function renderFooter(){
|
|
| 423 |
el.id = 'global-footer-note';
|
| 424 |
el.className = 'footer-note';
|
| 425 |
el.style.cssText = 'margin-top:8px;';
|
| 426 |
-
el.innerHTML = '\u0646\u064a\u0651\u0629 \u0648\u0633\u064a\u0637 \u062a\u0648\u0627\u0635\u0644 \u0641\u0642\u0637 \u00b7 <a href="terms.html" style="text-decoration:underline;">\u0627\u0644\u0634\u0631\u0648\u0637 \u0648\u0627\u0644\u0623\u062d\u0643\u0627\u0645</a>';
|
| 427 |
document.body.appendChild(el);
|
| 428 |
}
|
| 429 |
|
|
|
|
| 378 |
dashboard: '<svg viewBox="0 0 24 24"><rect x="3" y="3" width="7" height="9" rx="1.5"/><rect x="14" y="3" width="7" height="5" rx="1.5"/><rect x="14" y="12" width="7" height="9" rx="1.5"/><rect x="3" y="16" width="7" height="5" rx="1.5"/></svg>',
|
| 379 |
messages: '<svg viewBox="0 0 24 24"><path d="M21 15a2 2 0 01-2 2H8l-5 4V5a2 2 0 012-2h14a2 2 0 012 2z"/></svg>',
|
| 380 |
profile: '<svg viewBox="0 0 24 24"><circle cx="12" cy="8" r="4"/><path d="M4 21c0-4.4 3.6-8 8-8s8 3.6 8 8"/></svg>',
|
| 381 |
+
login: '<svg viewBox="0 0 24 24"><path d="M15 3h4a2 2 0 012 2v14a2 2 0 01-2 2h-4M10 17l5-5-5-5M15 12H3"/></svg>',
|
| 382 |
+
about: '<svg viewBox="0 0 24 24"><circle cx="12" cy="12" r="9"/><path d="M12 8v5M12 16h.01"/></svg>'
|
| 383 |
};
|
| 384 |
let tabs = [
|
| 385 |
{ key:'browse', href:'index.html', label:'\u0627\u0633\u062a\u0643\u0634\u0641' },
|
|
|
|
| 392 |
} else {
|
| 393 |
tabs.push({ key:'login', href:'login.html', label:'\u062f\u062e\u0648\u0644' });
|
| 394 |
}
|
| 395 |
+
tabs.push({ key:'about', href:'about.html', label:'\u062a\u0648\u0627\u0635\u0644' });
|
| 396 |
const nav = document.createElement('div');
|
| 397 |
nav.id = 'bottom-nav';
|
| 398 |
nav.className = 'bottom-nav';
|
|
|
|
| 425 |
el.id = 'global-footer-note';
|
| 426 |
el.className = 'footer-note';
|
| 427 |
el.style.cssText = 'margin-top:8px;';
|
| 428 |
+
el.innerHTML = '\u0646\u064a\u0651\u0629 \u0648\u0633\u064a\u0637 \u062a\u0648\u0627\u0635\u0644 \u0641\u0642\u0637 \u00b7 <a href="terms.html" style="text-decoration:underline;">\u0627\u0644\u0634\u0631\u0648\u0637 \u0648\u0627\u0644\u0623\u062d\u0643\u0627\u0645</a> \u00b7 <a href="about.html" style="text-decoration:underline;">\u062a\u0648\u0627\u0635\u0644 \u0645\u0639\u0627\u0646\u0627</a>';
|
| 429 |
document.body.appendChild(el);
|
| 430 |
}
|
| 431 |
|
static/index.html
CHANGED
|
@@ -410,7 +410,8 @@ function renderBottomNav(active){
|
|
| 410 |
dashboard: '<svg viewBox="0 0 24 24"><rect x="3" y="3" width="7" height="9" rx="1.5"/><rect x="14" y="3" width="7" height="5" rx="1.5"/><rect x="14" y="12" width="7" height="9" rx="1.5"/><rect x="3" y="16" width="7" height="5" rx="1.5"/></svg>',
|
| 411 |
messages: '<svg viewBox="0 0 24 24"><path d="M21 15a2 2 0 01-2 2H8l-5 4V5a2 2 0 012-2h14a2 2 0 012 2z"/></svg>',
|
| 412 |
profile: '<svg viewBox="0 0 24 24"><circle cx="12" cy="8" r="4"/><path d="M4 21c0-4.4 3.6-8 8-8s8 3.6 8 8"/></svg>',
|
| 413 |
-
login: '<svg viewBox="0 0 24 24"><path d="M15 3h4a2 2 0 012 2v14a2 2 0 01-2 2h-4M10 17l5-5-5-5M15 12H3"/></svg>'
|
|
|
|
| 414 |
};
|
| 415 |
let tabs = [
|
| 416 |
{ key:'browse', href:'index.html', label:'\u0627\u0633\u062a\u0643\u0634\u0641' },
|
|
@@ -423,6 +424,7 @@ function renderBottomNav(active){
|
|
| 423 |
} else {
|
| 424 |
tabs.push({ key:'login', href:'login.html', label:'\u062f\u062e\u0648\u0644' });
|
| 425 |
}
|
|
|
|
| 426 |
const nav = document.createElement('div');
|
| 427 |
nav.id = 'bottom-nav';
|
| 428 |
nav.className = 'bottom-nav';
|
|
@@ -455,7 +457,7 @@ function renderFooter(){
|
|
| 455 |
el.id = 'global-footer-note';
|
| 456 |
el.className = 'footer-note';
|
| 457 |
el.style.cssText = 'margin-top:8px;';
|
| 458 |
-
el.innerHTML = '\u0646\u064a\u0651\u0629 \u0648\u0633\u064a\u0637 \u062a\u0648\u0627\u0635\u0644 \u0641\u0642\u0637 \u00b7 <a href="terms.html" style="text-decoration:underline;">\u0627\u0644\u0634\u0631\u0648\u0637 \u0648\u0627\u0644\u0623\u062d\u0643\u0627\u0645</a>';
|
| 459 |
document.body.appendChild(el);
|
| 460 |
}
|
| 461 |
|
|
|
|
| 410 |
dashboard: '<svg viewBox="0 0 24 24"><rect x="3" y="3" width="7" height="9" rx="1.5"/><rect x="14" y="3" width="7" height="5" rx="1.5"/><rect x="14" y="12" width="7" height="9" rx="1.5"/><rect x="3" y="16" width="7" height="5" rx="1.5"/></svg>',
|
| 411 |
messages: '<svg viewBox="0 0 24 24"><path d="M21 15a2 2 0 01-2 2H8l-5 4V5a2 2 0 012-2h14a2 2 0 012 2z"/></svg>',
|
| 412 |
profile: '<svg viewBox="0 0 24 24"><circle cx="12" cy="8" r="4"/><path d="M4 21c0-4.4 3.6-8 8-8s8 3.6 8 8"/></svg>',
|
| 413 |
+
login: '<svg viewBox="0 0 24 24"><path d="M15 3h4a2 2 0 012 2v14a2 2 0 01-2 2h-4M10 17l5-5-5-5M15 12H3"/></svg>',
|
| 414 |
+
about: '<svg viewBox="0 0 24 24"><circle cx="12" cy="12" r="9"/><path d="M12 8v5M12 16h.01"/></svg>'
|
| 415 |
};
|
| 416 |
let tabs = [
|
| 417 |
{ key:'browse', href:'index.html', label:'\u0627\u0633\u062a\u0643\u0634\u0641' },
|
|
|
|
| 424 |
} else {
|
| 425 |
tabs.push({ key:'login', href:'login.html', label:'\u062f\u062e\u0648\u0644' });
|
| 426 |
}
|
| 427 |
+
tabs.push({ key:'about', href:'about.html', label:'\u062a\u0648\u0627\u0635\u0644' });
|
| 428 |
const nav = document.createElement('div');
|
| 429 |
nav.id = 'bottom-nav';
|
| 430 |
nav.className = 'bottom-nav';
|
|
|
|
| 457 |
el.id = 'global-footer-note';
|
| 458 |
el.className = 'footer-note';
|
| 459 |
el.style.cssText = 'margin-top:8px;';
|
| 460 |
+
el.innerHTML = '\u0646\u064a\u0651\u0629 \u0648\u0633\u064a\u0637 \u062a\u0648\u0627\u0635\u0644 \u0641\u0642\u0637 \u00b7 <a href="terms.html" style="text-decoration:underline;">\u0627\u0644\u0634\u0631\u0648\u0637 \u0648\u0627\u0644\u0623\u062d\u0643\u0627\u0645</a> \u00b7 <a href="about.html" style="text-decoration:underline;">\u062a\u0648\u0627\u0635\u0644 \u0645\u0639\u0627\u0646\u0627</a>';
|
| 461 |
document.body.appendChild(el);
|
| 462 |
}
|
| 463 |
|
static/login.html
CHANGED
|
@@ -383,7 +383,8 @@ function renderBottomNav(active){
|
|
| 383 |
dashboard: '<svg viewBox="0 0 24 24"><rect x="3" y="3" width="7" height="9" rx="1.5"/><rect x="14" y="3" width="7" height="5" rx="1.5"/><rect x="14" y="12" width="7" height="9" rx="1.5"/><rect x="3" y="16" width="7" height="5" rx="1.5"/></svg>',
|
| 384 |
messages: '<svg viewBox="0 0 24 24"><path d="M21 15a2 2 0 01-2 2H8l-5 4V5a2 2 0 012-2h14a2 2 0 012 2z"/></svg>',
|
| 385 |
profile: '<svg viewBox="0 0 24 24"><circle cx="12" cy="8" r="4"/><path d="M4 21c0-4.4 3.6-8 8-8s8 3.6 8 8"/></svg>',
|
| 386 |
-
login: '<svg viewBox="0 0 24 24"><path d="M15 3h4a2 2 0 012 2v14a2 2 0 01-2 2h-4M10 17l5-5-5-5M15 12H3"/></svg>'
|
|
|
|
| 387 |
};
|
| 388 |
let tabs = [
|
| 389 |
{ key:'browse', href:'index.html', label:'\u0627\u0633\u062a\u0643\u0634\u0641' },
|
|
@@ -396,6 +397,7 @@ function renderBottomNav(active){
|
|
| 396 |
} else {
|
| 397 |
tabs.push({ key:'login', href:'login.html', label:'\u062f\u062e\u0648\u0644' });
|
| 398 |
}
|
|
|
|
| 399 |
const nav = document.createElement('div');
|
| 400 |
nav.id = 'bottom-nav';
|
| 401 |
nav.className = 'bottom-nav';
|
|
@@ -428,7 +430,7 @@ function renderFooter(){
|
|
| 428 |
el.id = 'global-footer-note';
|
| 429 |
el.className = 'footer-note';
|
| 430 |
el.style.cssText = 'margin-top:8px;';
|
| 431 |
-
el.innerHTML = '\u0646\u064a\u0651\u0629 \u0648\u0633\u064a\u0637 \u062a\u0648\u0627\u0635\u0644 \u0641\u0642\u0637 \u00b7 <a href="terms.html" style="text-decoration:underline;">\u0627\u0644\u0634\u0631\u0648\u0637 \u0648\u0627\u0644\u0623\u062d\u0643\u0627\u0645</a>';
|
| 432 |
document.body.appendChild(el);
|
| 433 |
}
|
| 434 |
|
|
|
|
| 383 |
dashboard: '<svg viewBox="0 0 24 24"><rect x="3" y="3" width="7" height="9" rx="1.5"/><rect x="14" y="3" width="7" height="5" rx="1.5"/><rect x="14" y="12" width="7" height="9" rx="1.5"/><rect x="3" y="16" width="7" height="5" rx="1.5"/></svg>',
|
| 384 |
messages: '<svg viewBox="0 0 24 24"><path d="M21 15a2 2 0 01-2 2H8l-5 4V5a2 2 0 012-2h14a2 2 0 012 2z"/></svg>',
|
| 385 |
profile: '<svg viewBox="0 0 24 24"><circle cx="12" cy="8" r="4"/><path d="M4 21c0-4.4 3.6-8 8-8s8 3.6 8 8"/></svg>',
|
| 386 |
+
login: '<svg viewBox="0 0 24 24"><path d="M15 3h4a2 2 0 012 2v14a2 2 0 01-2 2h-4M10 17l5-5-5-5M15 12H3"/></svg>',
|
| 387 |
+
about: '<svg viewBox="0 0 24 24"><circle cx="12" cy="12" r="9"/><path d="M12 8v5M12 16h.01"/></svg>'
|
| 388 |
};
|
| 389 |
let tabs = [
|
| 390 |
{ key:'browse', href:'index.html', label:'\u0627\u0633\u062a\u0643\u0634\u0641' },
|
|
|
|
| 397 |
} else {
|
| 398 |
tabs.push({ key:'login', href:'login.html', label:'\u062f\u062e\u0648\u0644' });
|
| 399 |
}
|
| 400 |
+
tabs.push({ key:'about', href:'about.html', label:'\u062a\u0648\u0627\u0635\u0644' });
|
| 401 |
const nav = document.createElement('div');
|
| 402 |
nav.id = 'bottom-nav';
|
| 403 |
nav.className = 'bottom-nav';
|
|
|
|
| 430 |
el.id = 'global-footer-note';
|
| 431 |
el.className = 'footer-note';
|
| 432 |
el.style.cssText = 'margin-top:8px;';
|
| 433 |
+
el.innerHTML = '\u0646\u064a\u0651\u0629 \u0648\u0633\u064a\u0637 \u062a\u0648\u0627\u0635\u0644 \u0641\u0642\u0637 \u00b7 <a href="terms.html" style="text-decoration:underline;">\u0627\u0644\u0634\u0631\u0648\u0637 \u0648\u0627\u0644\u0623\u062d\u0643\u0627\u0645</a> \u00b7 <a href="about.html" style="text-decoration:underline;">\u062a\u0648\u0627\u0635\u0644 \u0645\u0639\u0627\u0646\u0627</a>';
|
| 434 |
document.body.appendChild(el);
|
| 435 |
}
|
| 436 |
|
static/messages.html
CHANGED
|
@@ -382,7 +382,8 @@ function renderBottomNav(active){
|
|
| 382 |
dashboard: '<svg viewBox="0 0 24 24"><rect x="3" y="3" width="7" height="9" rx="1.5"/><rect x="14" y="3" width="7" height="5" rx="1.5"/><rect x="14" y="12" width="7" height="9" rx="1.5"/><rect x="3" y="16" width="7" height="5" rx="1.5"/></svg>',
|
| 383 |
messages: '<svg viewBox="0 0 24 24"><path d="M21 15a2 2 0 01-2 2H8l-5 4V5a2 2 0 012-2h14a2 2 0 012 2z"/></svg>',
|
| 384 |
profile: '<svg viewBox="0 0 24 24"><circle cx="12" cy="8" r="4"/><path d="M4 21c0-4.4 3.6-8 8-8s8 3.6 8 8"/></svg>',
|
| 385 |
-
login: '<svg viewBox="0 0 24 24"><path d="M15 3h4a2 2 0 012 2v14a2 2 0 01-2 2h-4M10 17l5-5-5-5M15 12H3"/></svg>'
|
|
|
|
| 386 |
};
|
| 387 |
let tabs = [
|
| 388 |
{ key:'browse', href:'index.html', label:'\u0627\u0633\u062a\u0643\u0634\u0641' },
|
|
@@ -395,6 +396,7 @@ function renderBottomNav(active){
|
|
| 395 |
} else {
|
| 396 |
tabs.push({ key:'login', href:'login.html', label:'\u062f\u062e\u0648\u0644' });
|
| 397 |
}
|
|
|
|
| 398 |
const nav = document.createElement('div');
|
| 399 |
nav.id = 'bottom-nav';
|
| 400 |
nav.className = 'bottom-nav';
|
|
@@ -427,7 +429,7 @@ function renderFooter(){
|
|
| 427 |
el.id = 'global-footer-note';
|
| 428 |
el.className = 'footer-note';
|
| 429 |
el.style.cssText = 'margin-top:8px;';
|
| 430 |
-
el.innerHTML = '\u0646\u064a\u0651\u0629 \u0648\u0633\u064a\u0637 \u062a\u0648\u0627\u0635\u0644 \u0641\u0642\u0637 \u00b7 <a href="terms.html" style="text-decoration:underline;">\u0627\u0644\u0634\u0631\u0648\u0637 \u0648\u0627\u0644\u0623\u062d\u0643\u0627\u0645</a>';
|
| 431 |
document.body.appendChild(el);
|
| 432 |
}
|
| 433 |
|
|
|
|
| 382 |
dashboard: '<svg viewBox="0 0 24 24"><rect x="3" y="3" width="7" height="9" rx="1.5"/><rect x="14" y="3" width="7" height="5" rx="1.5"/><rect x="14" y="12" width="7" height="9" rx="1.5"/><rect x="3" y="16" width="7" height="5" rx="1.5"/></svg>',
|
| 383 |
messages: '<svg viewBox="0 0 24 24"><path d="M21 15a2 2 0 01-2 2H8l-5 4V5a2 2 0 012-2h14a2 2 0 012 2z"/></svg>',
|
| 384 |
profile: '<svg viewBox="0 0 24 24"><circle cx="12" cy="8" r="4"/><path d="M4 21c0-4.4 3.6-8 8-8s8 3.6 8 8"/></svg>',
|
| 385 |
+
login: '<svg viewBox="0 0 24 24"><path d="M15 3h4a2 2 0 012 2v14a2 2 0 01-2 2h-4M10 17l5-5-5-5M15 12H3"/></svg>',
|
| 386 |
+
about: '<svg viewBox="0 0 24 24"><circle cx="12" cy="12" r="9"/><path d="M12 8v5M12 16h.01"/></svg>'
|
| 387 |
};
|
| 388 |
let tabs = [
|
| 389 |
{ key:'browse', href:'index.html', label:'\u0627\u0633\u062a\u0643\u0634\u0641' },
|
|
|
|
| 396 |
} else {
|
| 397 |
tabs.push({ key:'login', href:'login.html', label:'\u062f\u062e\u0648\u0644' });
|
| 398 |
}
|
| 399 |
+
tabs.push({ key:'about', href:'about.html', label:'\u062a\u0648\u0627\u0635\u0644' });
|
| 400 |
const nav = document.createElement('div');
|
| 401 |
nav.id = 'bottom-nav';
|
| 402 |
nav.className = 'bottom-nav';
|
|
|
|
| 429 |
el.id = 'global-footer-note';
|
| 430 |
el.className = 'footer-note';
|
| 431 |
el.style.cssText = 'margin-top:8px;';
|
| 432 |
+
el.innerHTML = '\u0646\u064a\u0651\u0629 \u0648\u0633\u064a\u0637 \u062a\u0648\u0627\u0635\u0644 \u0641\u0642\u0637 \u00b7 <a href="terms.html" style="text-decoration:underline;">\u0627\u0644\u0634\u0631\u0648\u0637 \u0648\u0627\u0644\u0623\u062d\u0643\u0627\u0645</a> \u00b7 <a href="about.html" style="text-decoration:underline;">\u062a\u0648\u0627\u0635\u0644 \u0645\u0639\u0627\u0646\u0627</a>';
|
| 433 |
document.body.appendChild(el);
|
| 434 |
}
|
| 435 |
|
static/profile.html
CHANGED
|
@@ -424,7 +424,8 @@ function renderBottomNav(active){
|
|
| 424 |
dashboard: '<svg viewBox="0 0 24 24"><rect x="3" y="3" width="7" height="9" rx="1.5"/><rect x="14" y="3" width="7" height="5" rx="1.5"/><rect x="14" y="12" width="7" height="9" rx="1.5"/><rect x="3" y="16" width="7" height="5" rx="1.5"/></svg>',
|
| 425 |
messages: '<svg viewBox="0 0 24 24"><path d="M21 15a2 2 0 01-2 2H8l-5 4V5a2 2 0 012-2h14a2 2 0 012 2z"/></svg>',
|
| 426 |
profile: '<svg viewBox="0 0 24 24"><circle cx="12" cy="8" r="4"/><path d="M4 21c0-4.4 3.6-8 8-8s8 3.6 8 8"/></svg>',
|
| 427 |
-
login: '<svg viewBox="0 0 24 24"><path d="M15 3h4a2 2 0 012 2v14a2 2 0 01-2 2h-4M10 17l5-5-5-5M15 12H3"/></svg>'
|
|
|
|
| 428 |
};
|
| 429 |
let tabs = [
|
| 430 |
{ key:'browse', href:'index.html', label:'\u0627\u0633\u062a\u0643\u0634\u0641' },
|
|
@@ -437,6 +438,7 @@ function renderBottomNav(active){
|
|
| 437 |
} else {
|
| 438 |
tabs.push({ key:'login', href:'login.html', label:'\u062f\u062e\u0648\u0644' });
|
| 439 |
}
|
|
|
|
| 440 |
const nav = document.createElement('div');
|
| 441 |
nav.id = 'bottom-nav';
|
| 442 |
nav.className = 'bottom-nav';
|
|
@@ -469,7 +471,7 @@ function renderFooter(){
|
|
| 469 |
el.id = 'global-footer-note';
|
| 470 |
el.className = 'footer-note';
|
| 471 |
el.style.cssText = 'margin-top:8px;';
|
| 472 |
-
el.innerHTML = '\u0646\u064a\u0651\u0629 \u0648\u0633\u064a\u0637 \u062a\u0648\u0627\u0635\u0644 \u0641\u0642\u0637 \u00b7 <a href="terms.html" style="text-decoration:underline;">\u0627\u0644\u0634\u0631\u0648\u0637 \u0648\u0627\u0644\u0623\u062d\u0643\u0627\u0645</a>';
|
| 473 |
document.body.appendChild(el);
|
| 474 |
}
|
| 475 |
|
|
@@ -543,7 +545,7 @@ async function load(){
|
|
| 543 |
function renderHeader(p){
|
| 544 |
const me = API.user();
|
| 545 |
const isMe = me && me.id === p.id;
|
| 546 |
-
const roleLabel = p.role === 'owner' ? 'صاحب مشاريع' : p.role === 'investor' ? 'مستثمر' : 'صاحب مشاريع ومستثمر';
|
| 547 |
const stars = p.ratingAvg ? `⭐ ${p.ratingAvg} (${p.ratingCount} تقييم)` : 'لسه من غير تقييمات';
|
| 548 |
document.getElementById('profile-header').innerHTML = `
|
| 549 |
<div style="display:flex; align-items:center; gap:16px; flex-wrap:wrap;">
|
|
|
|
| 424 |
dashboard: '<svg viewBox="0 0 24 24"><rect x="3" y="3" width="7" height="9" rx="1.5"/><rect x="14" y="3" width="7" height="5" rx="1.5"/><rect x="14" y="12" width="7" height="9" rx="1.5"/><rect x="3" y="16" width="7" height="5" rx="1.5"/></svg>',
|
| 425 |
messages: '<svg viewBox="0 0 24 24"><path d="M21 15a2 2 0 01-2 2H8l-5 4V5a2 2 0 012-2h14a2 2 0 012 2z"/></svg>',
|
| 426 |
profile: '<svg viewBox="0 0 24 24"><circle cx="12" cy="8" r="4"/><path d="M4 21c0-4.4 3.6-8 8-8s8 3.6 8 8"/></svg>',
|
| 427 |
+
login: '<svg viewBox="0 0 24 24"><path d="M15 3h4a2 2 0 012 2v14a2 2 0 01-2 2h-4M10 17l5-5-5-5M15 12H3"/></svg>',
|
| 428 |
+
about: '<svg viewBox="0 0 24 24"><circle cx="12" cy="12" r="9"/><path d="M12 8v5M12 16h.01"/></svg>'
|
| 429 |
};
|
| 430 |
let tabs = [
|
| 431 |
{ key:'browse', href:'index.html', label:'\u0627\u0633\u062a\u0643\u0634\u0641' },
|
|
|
|
| 438 |
} else {
|
| 439 |
tabs.push({ key:'login', href:'login.html', label:'\u062f\u062e\u0648\u0644' });
|
| 440 |
}
|
| 441 |
+
tabs.push({ key:'about', href:'about.html', label:'\u062a\u0648\u0627\u0635\u0644' });
|
| 442 |
const nav = document.createElement('div');
|
| 443 |
nav.id = 'bottom-nav';
|
| 444 |
nav.className = 'bottom-nav';
|
|
|
|
| 471 |
el.id = 'global-footer-note';
|
| 472 |
el.className = 'footer-note';
|
| 473 |
el.style.cssText = 'margin-top:8px;';
|
| 474 |
+
el.innerHTML = '\u0646\u064a\u0651\u0629 \u0648\u0633\u064a\u0637 \u062a\u0648\u0627\u0635\u0644 \u0641\u0642\u0637 \u00b7 <a href="terms.html" style="text-decoration:underline;">\u0627\u0644\u0634\u0631\u0648\u0637 \u0648\u0627\u0644\u0623\u062d\u0643\u0627\u0645</a> \u00b7 <a href="about.html" style="text-decoration:underline;">\u062a\u0648\u0627\u0635\u0644 \u0645\u0639\u0627\u0646\u0627</a>';
|
| 475 |
document.body.appendChild(el);
|
| 476 |
}
|
| 477 |
|
|
|
|
| 545 |
function renderHeader(p){
|
| 546 |
const me = API.user();
|
| 547 |
const isMe = me && me.id === p.id;
|
| 548 |
+
const roleLabel = p.role === 'owner' ? 'صاحب مشاريع' : p.role === 'investor' ? 'مستثمر' : p.role === 'broker' ? 'عارض (وسيط)' : 'صاحب مشاريع ومستثمر';
|
| 549 |
const stars = p.ratingAvg ? `⭐ ${p.ratingAvg} (${p.ratingCount} تقييم)` : 'لسه من غير تقييمات';
|
| 550 |
document.getElementById('profile-header').innerHTML = `
|
| 551 |
<div style="display:flex; align-items:center; gap:16px; flex-wrap:wrap;">
|
static/project.html
CHANGED
|
@@ -447,7 +447,8 @@ function renderBottomNav(active){
|
|
| 447 |
dashboard: '<svg viewBox="0 0 24 24"><rect x="3" y="3" width="7" height="9" rx="1.5"/><rect x="14" y="3" width="7" height="5" rx="1.5"/><rect x="14" y="12" width="7" height="9" rx="1.5"/><rect x="3" y="16" width="7" height="5" rx="1.5"/></svg>',
|
| 448 |
messages: '<svg viewBox="0 0 24 24"><path d="M21 15a2 2 0 01-2 2H8l-5 4V5a2 2 0 012-2h14a2 2 0 012 2z"/></svg>',
|
| 449 |
profile: '<svg viewBox="0 0 24 24"><circle cx="12" cy="8" r="4"/><path d="M4 21c0-4.4 3.6-8 8-8s8 3.6 8 8"/></svg>',
|
| 450 |
-
login: '<svg viewBox="0 0 24 24"><path d="M15 3h4a2 2 0 012 2v14a2 2 0 01-2 2h-4M10 17l5-5-5-5M15 12H3"/></svg>'
|
|
|
|
| 451 |
};
|
| 452 |
let tabs = [
|
| 453 |
{ key:'browse', href:'index.html', label:'\u0627\u0633\u062a\u0643\u0634\u0641' },
|
|
@@ -460,6 +461,7 @@ function renderBottomNav(active){
|
|
| 460 |
} else {
|
| 461 |
tabs.push({ key:'login', href:'login.html', label:'\u062f\u062e\u0648\u0644' });
|
| 462 |
}
|
|
|
|
| 463 |
const nav = document.createElement('div');
|
| 464 |
nav.id = 'bottom-nav';
|
| 465 |
nav.className = 'bottom-nav';
|
|
@@ -492,7 +494,7 @@ function renderFooter(){
|
|
| 492 |
el.id = 'global-footer-note';
|
| 493 |
el.className = 'footer-note';
|
| 494 |
el.style.cssText = 'margin-top:8px;';
|
| 495 |
-
el.innerHTML = '\u0646\u064a\u0651\u0629 \u0648\u0633\u064a\u0637 \u062a\u0648\u0627\u0635\u0644 \u0641\u0642\u0637 \u00b7 <a href="terms.html" style="text-decoration:underline;">\u0627\u0644\u0634\u0631\u0648\u0637 \u0648\u0627\u0644\u0623\u062d\u0643\u0627\u0645</a>';
|
| 496 |
document.body.appendChild(el);
|
| 497 |
}
|
| 498 |
|
|
|
|
| 447 |
dashboard: '<svg viewBox="0 0 24 24"><rect x="3" y="3" width="7" height="9" rx="1.5"/><rect x="14" y="3" width="7" height="5" rx="1.5"/><rect x="14" y="12" width="7" height="9" rx="1.5"/><rect x="3" y="16" width="7" height="5" rx="1.5"/></svg>',
|
| 448 |
messages: '<svg viewBox="0 0 24 24"><path d="M21 15a2 2 0 01-2 2H8l-5 4V5a2 2 0 012-2h14a2 2 0 012 2z"/></svg>',
|
| 449 |
profile: '<svg viewBox="0 0 24 24"><circle cx="12" cy="8" r="4"/><path d="M4 21c0-4.4 3.6-8 8-8s8 3.6 8 8"/></svg>',
|
| 450 |
+
login: '<svg viewBox="0 0 24 24"><path d="M15 3h4a2 2 0 012 2v14a2 2 0 01-2 2h-4M10 17l5-5-5-5M15 12H3"/></svg>',
|
| 451 |
+
about: '<svg viewBox="0 0 24 24"><circle cx="12" cy="12" r="9"/><path d="M12 8v5M12 16h.01"/></svg>'
|
| 452 |
};
|
| 453 |
let tabs = [
|
| 454 |
{ key:'browse', href:'index.html', label:'\u0627\u0633\u062a\u0643\u0634\u0641' },
|
|
|
|
| 461 |
} else {
|
| 462 |
tabs.push({ key:'login', href:'login.html', label:'\u062f\u062e\u0648\u0644' });
|
| 463 |
}
|
| 464 |
+
tabs.push({ key:'about', href:'about.html', label:'\u062a\u0648\u0627\u0635\u0644' });
|
| 465 |
const nav = document.createElement('div');
|
| 466 |
nav.id = 'bottom-nav';
|
| 467 |
nav.className = 'bottom-nav';
|
|
|
|
| 494 |
el.id = 'global-footer-note';
|
| 495 |
el.className = 'footer-note';
|
| 496 |
el.style.cssText = 'margin-top:8px;';
|
| 497 |
+
el.innerHTML = '\u0646\u064a\u0651\u0629 \u0648\u0633\u064a\u0637 \u062a\u0648\u0627\u0635\u0644 \u0641\u0642\u0637 \u00b7 <a href="terms.html" style="text-decoration:underline;">\u0627\u0644\u0634\u0631\u0648\u0637 \u0648\u0627\u0644\u0623\u062d\u0643\u0627\u0645</a> \u00b7 <a href="about.html" style="text-decoration:underline;">\u062a\u0648\u0627\u0635\u0644 \u0645\u0639\u0627\u0646\u0627</a>';
|
| 498 |
document.body.appendChild(el);
|
| 499 |
}
|
| 500 |
|
static/reset-password.html
CHANGED
|
@@ -378,7 +378,8 @@ function renderBottomNav(active){
|
|
| 378 |
dashboard: '<svg viewBox="0 0 24 24"><rect x="3" y="3" width="7" height="9" rx="1.5"/><rect x="14" y="3" width="7" height="5" rx="1.5"/><rect x="14" y="12" width="7" height="9" rx="1.5"/><rect x="3" y="16" width="7" height="5" rx="1.5"/></svg>',
|
| 379 |
messages: '<svg viewBox="0 0 24 24"><path d="M21 15a2 2 0 01-2 2H8l-5 4V5a2 2 0 012-2h14a2 2 0 012 2z"/></svg>',
|
| 380 |
profile: '<svg viewBox="0 0 24 24"><circle cx="12" cy="8" r="4"/><path d="M4 21c0-4.4 3.6-8 8-8s8 3.6 8 8"/></svg>',
|
| 381 |
-
login: '<svg viewBox="0 0 24 24"><path d="M15 3h4a2 2 0 012 2v14a2 2 0 01-2 2h-4M10 17l5-5-5-5M15 12H3"/></svg>'
|
|
|
|
| 382 |
};
|
| 383 |
let tabs = [
|
| 384 |
{ key:'browse', href:'index.html', label:'\u0627\u0633\u062a\u0643\u0634\u0641' },
|
|
@@ -391,6 +392,7 @@ function renderBottomNav(active){
|
|
| 391 |
} else {
|
| 392 |
tabs.push({ key:'login', href:'login.html', label:'\u062f\u062e\u0648\u0644' });
|
| 393 |
}
|
|
|
|
| 394 |
const nav = document.createElement('div');
|
| 395 |
nav.id = 'bottom-nav';
|
| 396 |
nav.className = 'bottom-nav';
|
|
@@ -423,7 +425,7 @@ function renderFooter(){
|
|
| 423 |
el.id = 'global-footer-note';
|
| 424 |
el.className = 'footer-note';
|
| 425 |
el.style.cssText = 'margin-top:8px;';
|
| 426 |
-
el.innerHTML = '\u0646\u064a\u0651\u0629 \u0648\u0633\u064a\u0637 \u062a\u0648\u0627\u0635\u0644 \u0641\u0642\u0637 \u00b7 <a href="terms.html" style="text-decoration:underline;">\u0627\u0644\u0634\u0631\u0648\u0637 \u0648\u0627\u0644\u0623\u062d\u0643\u0627\u0645</a>';
|
| 427 |
document.body.appendChild(el);
|
| 428 |
}
|
| 429 |
|
|
|
|
| 378 |
dashboard: '<svg viewBox="0 0 24 24"><rect x="3" y="3" width="7" height="9" rx="1.5"/><rect x="14" y="3" width="7" height="5" rx="1.5"/><rect x="14" y="12" width="7" height="9" rx="1.5"/><rect x="3" y="16" width="7" height="5" rx="1.5"/></svg>',
|
| 379 |
messages: '<svg viewBox="0 0 24 24"><path d="M21 15a2 2 0 01-2 2H8l-5 4V5a2 2 0 012-2h14a2 2 0 012 2z"/></svg>',
|
| 380 |
profile: '<svg viewBox="0 0 24 24"><circle cx="12" cy="8" r="4"/><path d="M4 21c0-4.4 3.6-8 8-8s8 3.6 8 8"/></svg>',
|
| 381 |
+
login: '<svg viewBox="0 0 24 24"><path d="M15 3h4a2 2 0 012 2v14a2 2 0 01-2 2h-4M10 17l5-5-5-5M15 12H3"/></svg>',
|
| 382 |
+
about: '<svg viewBox="0 0 24 24"><circle cx="12" cy="12" r="9"/><path d="M12 8v5M12 16h.01"/></svg>'
|
| 383 |
};
|
| 384 |
let tabs = [
|
| 385 |
{ key:'browse', href:'index.html', label:'\u0627\u0633\u062a\u0643\u0634\u0641' },
|
|
|
|
| 392 |
} else {
|
| 393 |
tabs.push({ key:'login', href:'login.html', label:'\u062f\u062e\u0648\u0644' });
|
| 394 |
}
|
| 395 |
+
tabs.push({ key:'about', href:'about.html', label:'\u062a\u0648\u0627\u0635\u0644' });
|
| 396 |
const nav = document.createElement('div');
|
| 397 |
nav.id = 'bottom-nav';
|
| 398 |
nav.className = 'bottom-nav';
|
|
|
|
| 425 |
el.id = 'global-footer-note';
|
| 426 |
el.className = 'footer-note';
|
| 427 |
el.style.cssText = 'margin-top:8px;';
|
| 428 |
+
el.innerHTML = '\u0646\u064a\u0651\u0629 \u0648\u0633\u064a\u0637 \u062a\u0648\u0627\u0635\u0644 \u0641\u0642\u0637 \u00b7 <a href="terms.html" style="text-decoration:underline;">\u0627\u0644\u0634\u0631\u0648\u0637 \u0648\u0627\u0644\u0623\u062d\u0643\u0627\u0645</a> \u00b7 <a href="about.html" style="text-decoration:underline;">\u062a\u0648\u0627\u0635\u0644 \u0645\u0639\u0627\u0646\u0627</a>';
|
| 429 |
document.body.appendChild(el);
|
| 430 |
}
|
| 431 |
|
static/signup.html
CHANGED
|
@@ -225,7 +225,10 @@ textarea{ resize:vertical; min-height:100px; }
|
|
| 225 |
background: var(--bg); border-top:1px solid var(--line);
|
| 226 |
padding: 6px 4px calc(6px + env(safe-area-inset-bottom));
|
| 227 |
box-shadow: 0 -2px 14px rgba(10,10,10,0.05);
|
|
|
|
|
|
|
| 228 |
}
|
|
|
|
| 229 |
.bn-item{
|
| 230 |
flex:1; display:flex; flex-direction:column; align-items:center; gap:3px;
|
| 231 |
padding:6px 2px; border-radius:12px; color: var(--muted-soft);
|
|
@@ -300,6 +303,11 @@ img,video{ max-width:100%; height:auto; }
|
|
| 300 |
<div class="role-title">الاتنين</div>
|
| 301 |
<div class="role-desc">أعرض مشروعي وكمان أستكشف فرص تانية</div>
|
| 302 |
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 303 |
</div>
|
| 304 |
</div>
|
| 305 |
|
|
@@ -444,7 +452,8 @@ function renderBottomNav(active){
|
|
| 444 |
dashboard: '<svg viewBox="0 0 24 24"><rect x="3" y="3" width="7" height="9" rx="1.5"/><rect x="14" y="3" width="7" height="5" rx="1.5"/><rect x="14" y="12" width="7" height="9" rx="1.5"/><rect x="3" y="16" width="7" height="5" rx="1.5"/></svg>',
|
| 445 |
messages: '<svg viewBox="0 0 24 24"><path d="M21 15a2 2 0 01-2 2H8l-5 4V5a2 2 0 012-2h14a2 2 0 012 2z"/></svg>',
|
| 446 |
profile: '<svg viewBox="0 0 24 24"><circle cx="12" cy="8" r="4"/><path d="M4 21c0-4.4 3.6-8 8-8s8 3.6 8 8"/></svg>',
|
| 447 |
-
login: '<svg viewBox="0 0 24 24"><path d="M15 3h4a2 2 0 012 2v14a2 2 0 01-2 2h-4M10 17l5-5-5-5M15 12H3"/></svg>'
|
|
|
|
| 448 |
};
|
| 449 |
let tabs = [
|
| 450 |
{ key:'browse', href:'index.html', label:'\u0627\u0633\u062a\u0643\u0634\u0641' },
|
|
@@ -457,11 +466,30 @@ function renderBottomNav(active){
|
|
| 457 |
} else {
|
| 458 |
tabs.push({ key:'login', href:'login.html', label:'\u062f\u062e\u0648\u0644' });
|
| 459 |
}
|
|
|
|
| 460 |
const nav = document.createElement('div');
|
| 461 |
nav.id = 'bottom-nav';
|
| 462 |
nav.className = 'bottom-nav';
|
| 463 |
nav.innerHTML = tabs.map(t => `<a class="bn-item ${t.key===active?'active':''}" href="${t.href}">${icons[t.key]}<span>${t.label}</span></a>`).join('');
|
| 464 |
document.body.appendChild(nav);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 465 |
}
|
| 466 |
|
| 467 |
function renderFooter(){
|
|
@@ -470,7 +498,7 @@ function renderFooter(){
|
|
| 470 |
el.id = 'global-footer-note';
|
| 471 |
el.className = 'footer-note';
|
| 472 |
el.style.cssText = 'margin-top:8px;';
|
| 473 |
-
el.innerHTML = '\u0646\u064a\u0651\u0629 \u0648\u0633\u064a\u0637 \u062a\u0648\u0627\u0635\u0644 \u0641\u0642\u0637 \u00b7 <a href="terms.html" style="text-decoration:underline;">\u0627\u0644\u0634\u0631\u0648\u0637 \u0648\u0627\u0644\u0623\u062d\u0643\u0627\u0645</a>';
|
| 474 |
document.body.appendChild(el);
|
| 475 |
}
|
| 476 |
|
|
@@ -523,7 +551,7 @@ let selectedRole = 'both';
|
|
| 523 |
|
| 524 |
function updateRoleUI(){
|
| 525 |
document.querySelectorAll('.role-card').forEach(c => c.classList.toggle('active', c.dataset.role === selectedRole));
|
| 526 |
-
document.getElementById('owner-fields').style.display = (selectedRole === 'owner' || selectedRole === 'both') ? 'block' : 'none';
|
| 527 |
document.getElementById('investor-fields').style.display = (selectedRole === 'investor' || selectedRole === 'both') ? 'block' : 'none';
|
| 528 |
}
|
| 529 |
document.querySelectorAll('.role-card').forEach(card => {
|
|
|
|
| 225 |
background: var(--bg); border-top:1px solid var(--line);
|
| 226 |
padding: 6px 4px calc(6px + env(safe-area-inset-bottom));
|
| 227 |
box-shadow: 0 -2px 14px rgba(10,10,10,0.05);
|
| 228 |
+
transform: translateY(0); transition: transform .28s cubic-bezier(.4,0,.2,1);
|
| 229 |
+
will-change: transform;
|
| 230 |
}
|
| 231 |
+
.bottom-nav.bn-hidden{ transform: translateY(100%); }
|
| 232 |
.bn-item{
|
| 233 |
flex:1; display:flex; flex-direction:column; align-items:center; gap:3px;
|
| 234 |
padding:6px 2px; border-radius:12px; color: var(--muted-soft);
|
|
|
|
| 303 |
<div class="role-title">الاتنين</div>
|
| 304 |
<div class="role-desc">أعرض مشروعي وكمان أستكشف فرص تانية</div>
|
| 305 |
</div>
|
| 306 |
+
<div class="role-card" data-role="broker">
|
| 307 |
+
<div class="role-icon">🤝</div>
|
| 308 |
+
<div class="role-title">عارض (وسيط)</div>
|
| 309 |
+
<div class="role-desc">هعرض مشاريع لأصحابها بالنيابة عنهم</div>
|
| 310 |
+
</div>
|
| 311 |
</div>
|
| 312 |
</div>
|
| 313 |
|
|
|
|
| 452 |
dashboard: '<svg viewBox="0 0 24 24"><rect x="3" y="3" width="7" height="9" rx="1.5"/><rect x="14" y="3" width="7" height="5" rx="1.5"/><rect x="14" y="12" width="7" height="9" rx="1.5"/><rect x="3" y="16" width="7" height="5" rx="1.5"/></svg>',
|
| 453 |
messages: '<svg viewBox="0 0 24 24"><path d="M21 15a2 2 0 01-2 2H8l-5 4V5a2 2 0 012-2h14a2 2 0 012 2z"/></svg>',
|
| 454 |
profile: '<svg viewBox="0 0 24 24"><circle cx="12" cy="8" r="4"/><path d="M4 21c0-4.4 3.6-8 8-8s8 3.6 8 8"/></svg>',
|
| 455 |
+
login: '<svg viewBox="0 0 24 24"><path d="M15 3h4a2 2 0 012 2v14a2 2 0 01-2 2h-4M10 17l5-5-5-5M15 12H3"/></svg>',
|
| 456 |
+
about: '<svg viewBox="0 0 24 24"><circle cx="12" cy="12" r="9"/><path d="M12 8v5M12 16h.01"/></svg>'
|
| 457 |
};
|
| 458 |
let tabs = [
|
| 459 |
{ key:'browse', href:'index.html', label:'\u0627\u0633\u062a\u0643\u0634\u0641' },
|
|
|
|
| 466 |
} else {
|
| 467 |
tabs.push({ key:'login', href:'login.html', label:'\u062f\u062e\u0648\u0644' });
|
| 468 |
}
|
| 469 |
+
tabs.push({ key:'about', href:'about.html', label:'\u062a\u0648\u0627\u0635\u0644' });
|
| 470 |
const nav = document.createElement('div');
|
| 471 |
nav.id = 'bottom-nav';
|
| 472 |
nav.className = 'bottom-nav';
|
| 473 |
nav.innerHTML = tabs.map(t => `<a class="bn-item ${t.key===active?'active':''}" href="${t.href}">${icons[t.key]}<span>${t.label}</span></a>`).join('');
|
| 474 |
document.body.appendChild(nav);
|
| 475 |
+
initBottomNavAutoHide(nav);
|
| 476 |
+
}
|
| 477 |
+
|
| 478 |
+
function initBottomNavAutoHide(nav){
|
| 479 |
+
let lastY = window.scrollY, ticking = false;
|
| 480 |
+
window.addEventListener('scroll', () => {
|
| 481 |
+
if(ticking) return;
|
| 482 |
+
ticking = true;
|
| 483 |
+
requestAnimationFrame(() => {
|
| 484 |
+
const y = window.scrollY;
|
| 485 |
+
const delta = y - lastY;
|
| 486 |
+
if(y < 40){ nav.classList.remove('bn-hidden'); }
|
| 487 |
+
else if(delta > 6){ nav.classList.add('bn-hidden'); }
|
| 488 |
+
else if(delta < -6){ nav.classList.remove('bn-hidden'); }
|
| 489 |
+
lastY = y;
|
| 490 |
+
ticking = false;
|
| 491 |
+
});
|
| 492 |
+
}, { passive:true });
|
| 493 |
}
|
| 494 |
|
| 495 |
function renderFooter(){
|
|
|
|
| 498 |
el.id = 'global-footer-note';
|
| 499 |
el.className = 'footer-note';
|
| 500 |
el.style.cssText = 'margin-top:8px;';
|
| 501 |
+
el.innerHTML = '\u0646\u064a\u0651\u0629 \u0648\u0633\u064a\u0637 \u062a\u0648\u0627\u0635\u0644 \u0641\u0642\u0637 \u00b7 <a href="terms.html" style="text-decoration:underline;">\u0627\u0644\u0634\u0631\u0648\u0637 \u0648\u0627\u0644\u0623\u062d\u0643\u0627\u0645</a> \u00b7 <a href="about.html" style="text-decoration:underline;">\u062a\u0648\u0627\u0635\u0644 \u0645\u0639\u0627\u0646\u0627</a>';
|
| 502 |
document.body.appendChild(el);
|
| 503 |
}
|
| 504 |
|
|
|
|
| 551 |
|
| 552 |
function updateRoleUI(){
|
| 553 |
document.querySelectorAll('.role-card').forEach(c => c.classList.toggle('active', c.dataset.role === selectedRole));
|
| 554 |
+
document.getElementById('owner-fields').style.display = (selectedRole === 'owner' || selectedRole === 'both' || selectedRole === 'broker') ? 'block' : 'none';
|
| 555 |
document.getElementById('investor-fields').style.display = (selectedRole === 'investor' || selectedRole === 'both') ? 'block' : 'none';
|
| 556 |
}
|
| 557 |
document.querySelectorAll('.role-card').forEach(card => {
|