Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
52 commits
Select commit Hold shift + click to select a range
69a3993
FUAC Fix
Pranav00076 Aug 4, 2026
2927f6c
Merge pull request #147 from Pranav00076/feat/ui-glassmorphism
Pranav00076 Aug 4, 2026
cc0af3c
Revert "Feat/UI glassmorphism"
Pranav00076 Aug 4, 2026
1f404a9
Merge pull request #148 from Omnikon-Org/revert-147-feat/ui-glassmorp…
Pranav00076 Aug 4, 2026
a934a5f
Leaderboard
Pranav00076 Aug 4, 2026
b4f3fed
Merge pull request #149 from Pranav00076/feat/ui-glassmorphism
Pranav00076 Aug 4, 2026
7751d44
Leader
Pranav00076 Aug 4, 2026
e60abf9
Merge branch 'feat/ui-glassmorphism' of https://github.com/Pranav0007…
Pranav00076 Aug 4, 2026
03485e9
Merge pull request #150 from Pranav00076/feat/ui-glassmorphism
Pranav00076 Aug 4, 2026
6e62ee8
fixes
Pranav00076 Aug 4, 2026
8c3f180
Merge pull request #151 from Pranav00076/feat/ui-glassmorphism
Pranav00076 Aug 4, 2026
dce60c3
ads
Pranav00076 Aug 4, 2026
296f718
Merge pull request #152 from Pranav00076/feat/ui-glassmorphism
Pranav00076 Aug 4, 2026
311660c
added ads.txt
Pranav00076 Aug 4, 2026
3d9c5c4
Merge branch 'Omnikon-Org:main' into feat/ui-glassmorphism
Pranav00076 Aug 4, 2026
6c496fb
Merge pull request #153 from Pranav00076/feat/ui-glassmorphism
Pranav00076 Aug 4, 2026
2085376
ads
Pranav00076 Aug 4, 2026
42bfd4f
Merge branch 'Omnikon-Org:main' into feat/ui-glassmorphism
Pranav00076 Aug 4, 2026
642283b
Merge pull request #154 from Pranav00076/feat/ui-glassmorphism
Pranav00076 Aug 4, 2026
fd395b0
More Ads
Pranav00076 Aug 4, 2026
0cca781
Merge branch 'feat/ui-glassmorphism' of https://github.com/Pranav0007…
Pranav00076 Aug 4, 2026
2788d6c
Merge pull request #155 from Pranav00076/feat/ui-glassmorphism
Pranav00076 Aug 4, 2026
b1781e6
api fixes
Pranav00076 Aug 5, 2026
8e40452
Merge branch 'feat/ui-glassmorphism' of https://github.com/Pranav0007…
Pranav00076 Aug 5, 2026
670b5e8
Merge pull request #156 from Pranav00076/feat/ui-glassmorphism
Pranav00076 Aug 5, 2026
940e641
Usage Optimisation
Pranav00076 Aug 5, 2026
8d1b4e8
Merge pull request #157 from Pranav00076/feat/ui-glassmorphism
Pranav00076 Aug 5, 2026
a0e54b7
Exposed secrets Fix
Pranav00076 Aug 5, 2026
1470ba8
Merge pull request #158 from Pranav00076/feat/ui-glassmorphism
Pranav00076 Aug 5, 2026
9216a19
UI Glitch- Image Path fix
Pranav00076 Aug 5, 2026
9cdaa8f
Merge branch 'feat/ui-glassmorphism' of https://github.com/Pranav0007…
Pranav00076 Aug 5, 2026
1eb8421
Merge pull request #159 from Pranav00076/feat/ui-glassmorphism
Pranav00076 Aug 5, 2026
121b320
bugs fix
Pranav00076 Aug 5, 2026
b5f4aad
Merge branch 'feat/ui-glassmorphism' of https://github.com/Pranav0007…
Pranav00076 Aug 5, 2026
d82cfeb
Merge pull request #160 from Pranav00076/feat/ui-glassmorphism
Pranav00076 Aug 5, 2026
312d038
202345
Pranav00076 Aug 5, 2026
b395dc4
Merge branch 'feat/ui-glassmorphism' of https://github.com/Pranav0007…
Pranav00076 Aug 5, 2026
8f77ef4
Merge pull request #161 from Pranav00076/feat/ui-glassmorphism
Pranav00076 Aug 5, 2026
9c0c8a5
tailwind cdn fix
Pranav00076 Aug 5, 2026
c7c0155
Merge pull request #162 from Pranav00076/feat/ui-glassmorphism
Pranav00076 Aug 5, 2026
4487b4e
Secrets removed from version control.
Pranav00076 Aug 5, 2026
4a5590d
Merge pull request #163 from Pranav00076/feat/ui-glassmorphism
Pranav00076 Aug 5, 2026
cdac570
hh
Pranav00076 Aug 5, 2026
4f6f481
reverted
Pranav00076 Aug 5, 2026
4a7bb98
Merge pull request #164 from Pranav00076/feat/ui-glassmorphism
Pranav00076 Aug 5, 2026
44ae4e6
refactor: move all site pages into pages/ directory
Yuvraj-Sarathe Aug 5, 2026
818c94c
fix: serve custom cursor images from public/ with absolute paths
Yuvraj-Sarathe Aug 5, 2026
7defb62
fix: ambassador referral and admin links after pages restructure
Yuvraj-Sarathe Aug 5, 2026
9739914
chore: remove old root-level cursor directory after move to public/
Yuvraj-Sarathe Aug 5, 2026
946f6d6
security: keep API secrets server-side, never ship to the browser
Yuvraj-Sarathe Aug 5, 2026
cfe2741
Merge pull request #165 from Omnikon-Org/fix/pages-restructure-and-se…
Yuvraj-Sarathe Aug 5, 2026
f701c33
rewards changes
Pranav00076 Aug 9, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file modified .DS_Store
Binary file not shown.
38 changes: 38 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
# ============================================================
# Omnikon Website — environment variables
# Copy this file to `.env` and fill in your values.
# NEVER commit `.env` — it is gitignored.
# ============================================================

# --- Firebase Web config (PUBLIC BY DESIGN) ---
# Firebase web API keys are public identifiers, not secrets: the browser
# needs them to use Firebase Auth. Security comes from Firestore rules,
# not from hiding these. They are emitted to public/env-public.json.
FIREBASE_API_KEY=
FIREBASE_AUTH_DOMAIN=
FIREBASE_PROJECT_ID=
FIREBASE_STORAGE_BUCKET=
FIREBASE_MESSAGING_SENDER_ID=
FIREBASE_APP_ID=

# --- Supabase (anon key is PUBLIC BY DESIGN) ---
# The anon key is meant to be embedded in clients; Supabase Row Level
# Security protects the data. Also emitted to public/env-public.json.
SUPABASE_URL=
SUPABASE_ANON_KEY=

# --- SECRETS — server-side ONLY ---
# Consumed exclusively by Vercel serverless functions in api/.
# NEVER emitted to public/env-public.json; NEVER referenced in client code.

# HuggingFace inference token — used by api/chat.js (chatbot proxy).
HF_TOKEN=

# Blog admin secret — validated by api/blog-insert.js, never client-side.
ADMIN_SECRET=

# --- CI-only secret ---
# GitHub Personal Access Token with repo read access, used by
# .github/workflows/update_projects.yml to refresh github_summary.json.
# Not used by the website at runtime.
GIT_OMNIKON_ALL=
2 changes: 1 addition & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ jobs:
- uses: actions/checkout@v4

- name: Check HTML exists
run: test -f index.html
run: test -f pages/index.html

- name: Check CSS exists
run: test -f style.css
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ dist-ssr/
*.env
env.json
public/env-public.json
public/env-public*.json

# IDEs, Editors & OS files
.DS_Store
Expand Down
8 changes: 8 additions & 0 deletions .vite/deps/_metadata.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"hash": "f3206e1b",
"configHash": "aa4833a8",
"lockfileHash": "e3b0c442",
"browserHash": "5587a14b",
"optimized": {},
"chunks": {}
}
3 changes: 3 additions & 0 deletions .vite/deps/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"type": "module"
}
1 change: 1 addition & 0 deletions ads.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
google.com, pub-8663425706426895, DIRECT, f08c47fec0942fa0
57 changes: 57 additions & 0 deletions api/blog-insert.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
// api/blog-insert.js
// Vercel Serverless Function: publishes a blog post to Supabase.
// ADMIN_SECRET is validated server-side (process.env) — it never exists
// in any file served to the browser.

export default async function handler(req, res) {
if (req.method === 'OPTIONS') {
res.setHeader('Access-Control-Allow-Origin', '*');
res.setHeader('Access-Control-Allow-Methods', 'POST,OPTIONS');
res.setHeader('Access-Control-Allow-Headers', 'Content-Type');
res.status(200).end();
return;
}

if (req.method !== 'POST') {
return res.status(405).json({ error: 'Method not allowed' });
}

const { secret, blog } = req.body || {};
const adminSecret = process.env.ADMIN_SECRET;

if (!adminSecret || !secret || secret !== adminSecret) {
return res.status(403).json({ error: 'Unauthorized' });
}

const supabaseUrl = (process.env.SUPABASE_URL || '').replace(/\/+$/, '');
const supabaseKey = process.env.SUPABASE_ANON_KEY;

if (!supabaseUrl || !supabaseKey) {
return res.status(503).json({ error: 'Blog service is not configured' });
}

try {
const response = await fetch(`${supabaseUrl}/rest/v1/blogs`, {
method: 'POST',
headers: {
apikey: supabaseKey,
Authorization: `Bearer ${supabaseKey}`,
'Content-Type': 'application/json',
Prefer: 'return=representation'
},
body: JSON.stringify(blog || {})
});

const data = await response.json();
if (!response.ok) {
if (response.status === 409 || (data && data.code === '23505')) {
return res.status(409).json({ error: 'This article has already been added to the database.' });
}
return res.status(response.status).json(data);
}
return res.status(200).json(data[0] || data);
} catch (e) {
console.error('Blog insert error:', e);
return res.status(502).json({ error: 'Blog service unavailable' });
}
}
40 changes: 40 additions & 0 deletions api/chat.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
// api/chat.js
// Vercel Serverless Function: proxies chat completions to the HuggingFace
// inference router. HF_TOKEN stays server-side (process.env) and is never
// shipped to or fetched by the browser.

export default async function handler(req, res) {
if (req.method === 'OPTIONS') {
res.setHeader('Access-Control-Allow-Origin', '*');
res.setHeader('Access-Control-Allow-Methods', 'POST,OPTIONS');
res.setHeader('Access-Control-Allow-Headers', 'Content-Type');
res.status(200).end();
return;
}

if (req.method !== 'POST') {
return res.status(405).json({ error: 'Method not allowed' });
}

const token = process.env.HF_TOKEN;
if (!token) {
return res.status(503).json({ error: 'AI service is not configured' });
}

try {
const response = await fetch('https://router.huggingface.co/v1/chat/completions', {
method: 'POST',
headers: {
Authorization: `Bearer ${token}`,
'Content-Type': 'application/json'
},
body: JSON.stringify(req.body || {})
});

const data = await response.json();
return res.status(response.ok ? 200 : response.status).json(data);
} catch (e) {
console.error('Chat proxy error:', e);
return res.status(502).json({ error: 'AI service unavailable' });
}
}
2 changes: 1 addition & 1 deletion assets/admin.js
Original file line number Diff line number Diff line change
Expand Up @@ -611,7 +611,7 @@ async function loadAdminCampaigns() {
<span class="px-2 py-0.5 ${c.status === 'active' ? 'bg-primary/20 text-primary' : 'bg-surface-variant text-on-surface-variant'} text-[10px] font-bold rounded uppercase">${c.status || 'active'}</span>
</div>
<p class="text-xs text-on-surface-variant">${c.description || ''}</p>
<p class="text-[10px] font-mono text-accent mt-1">Target: ${c.target || 10} refs | Multiplier: ${c.multiplier || '1x'} | Reward: ${c.reward || 'Swag'}</p>
<p class="text-[10px] font-mono text-accent mt-1">Target: ${c.target || 10} refs | Multiplier: ${c.multiplier || '1x'} | Reward: ${c.reward || 'Certificate & Recognition'}</p>
</div>
<button onclick="toggleCampaign('${c.id}', '${c.status === 'active' ? 'inactive' : 'active'}')" class="self-start sm:self-auto px-3 py-1.5 bg-surface-elevation border border-surface-variant text-xs font-mono text-on-surface hover:border-primary transition-colors cursor-pointer">
${c.status === 'active' ? 'Deactivate' : 'Activate'}
Expand Down
18 changes: 9 additions & 9 deletions assets/ambassador.js
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ document.addEventListener('DOMContentLoaded', () => {
}

if (profile.role === 'admin') {
window.location.replace('/admin.html');
window.location.replace('/pages/admin.html');
return;
}

Expand Down Expand Up @@ -240,7 +240,7 @@ async function loadCampaigns(ambassadorId) {
}

container.innerHTML = campaigns.map(c => {
const campaignLink = window.location.origin + `/r.html?id=${ambassadorId || 'DEMO'}&campaign=${encodeURIComponent(c.title || c.id)}`;
const campaignLink = window.location.origin + `/pages/r.html?id=${ambassadorId || 'DEMO'}&campaign=${encodeURIComponent(c.title || c.id)}`;
return `
<div class="glass-panel p-6 border border-surface-variant/50 relative overflow-hidden flex flex-col justify-between">
<div class="mb-4">
Expand All @@ -251,7 +251,7 @@ async function loadCampaigns(ambassadorId) {
<h3 class="text-xl font-bold text-on-surface mb-2">${c.title}</h3>
<p class="text-xs text-on-surface-variant leading-relaxed mb-4">${c.description || 'Drive registrations and earn bonus rewards.'}</p>
<div class="p-3 bg-background/50 border border-surface-variant/40 rounded text-xs font-mono text-primary flex items-center justify-between">
<span class="truncate">Reward: ${c.reward || 'Swag Kit & Certificate'}</span>
<span class="truncate">Reward: ${c.reward || 'Verified Certificate & Recognition'}</span>
</div>
</div>
<button onclick="copySpecificCampaignLink('${campaignLink}')" class="w-full py-2 bg-primary/10 hover:bg-primary/20 border border-primary text-primary text-xs font-mono transition-colors glow-hover flex items-center justify-center gap-2">
Expand All @@ -269,11 +269,11 @@ function loadRewardsAndBadges(profile) {
const verified = profile.verifiedRegistrations || 0;

const tiers = [
{ name: 'Bronze', count: 0, reward: 'Ambassador Onboarding & Digital Badge', icon: 'military_tech', color: 'text-amber-600' },
{ name: 'Silver', count: 5, reward: 'Official Certificate of Appreciation & Discord VIP Role', icon: 'workspace_premium', color: 'text-slate-400' },
{ name: 'Gold', count: 15, reward: 'Omnikon Exclusive Swag Kit (T-Shirt, Stickers, Sipper)', icon: 'stars', color: 'text-yellow-400' },
{ name: 'Platinum', count: 30, reward: 'Direct Interview Call for Omnikon Core Team & Paid Internships', icon: 'diamond', color: 'text-cyan-400' },
{ name: 'Cyber Master', count: 50, reward: 'Sponsored Hackathon Pass, Cash Prize Pool & Trophy', icon: 'trophy', color: 'text-primary' }
{ name: 'Bronze', count: 0, reward: 'Ambassador Onboarding, Digital Badge & Community Access', icon: 'military_tech', color: 'text-amber-600' },
{ name: 'Silver', count: 5, reward: 'Official Certificate of Appreciation & Discord Community Leader Role', icon: 'workspace_premium', color: 'text-slate-400' },
{ name: 'Gold', count: 15, reward: 'Certificate of Excellence & Networking with Core Tech Mentors', icon: 'stars', color: 'text-yellow-400' },
{ name: 'Platinum', count: 30, reward: 'Certificate of Distinction & Regional Leadership Opportunities', icon: 'diamond', color: 'text-cyan-400' },
{ name: 'Cyber Master', count: 50, reward: 'Certificate of Honor, Omnikon Core Recommendation & Website Spotlight', icon: 'trophy', color: 'text-primary' }
];

const tierContainer = document.getElementById('rewards-tier-list');
Expand Down Expand Up @@ -428,7 +428,7 @@ window.copyReferralLink = function() {
return;
}

const link = window.location.origin + '/r.html?id=' + idEl.textContent;
const link = window.location.origin + '/pages/r.html?id=' + idEl.textContent;
navigator.clipboard.writeText(link).then(() => {
showToast('Referral link copied to clipboard!');
});
Expand Down
23 changes: 0 additions & 23 deletions assets/common-styles.css
Original file line number Diff line number Diff line change
@@ -1,28 +1,5 @@
/* Common Styles Extracted from Inline HTML Blocks */

/* --- CORE FOUC PROTECTIONS --- */
/* Prevent layout trash before Tailwind CDN compiles */
[hidden], .hidden { display: none; }
img { max-width: 100%; height: auto; }
img[src*="LogoOmnikon"], img[alt*="Omnikon Logo"] {
max-width: 40px !important;
max-height: 40px !important;
width: 40px !important;
height: 40px !important;
object-fit: cover !important;
display: inline-block !important;
}
img[alt*="Avatar"], img[src*="avatar"], .avatar-box, #ambassador-avatar {
max-width: 48px !important;
max-height: 48px !important;
width: 48px !important;
height: 48px !important;
border-radius: 9999px !important;
object-fit: cover !important;
display: inline-block !important;
overflow: hidden !important;
}
/* ----------------------------- */
html {
scroll-behavior: smooth;
}
Expand Down
21 changes: 16 additions & 5 deletions assets/db.js
Original file line number Diff line number Diff line change
Expand Up @@ -178,7 +178,7 @@ export async function getActiveCampaigns() {
title: 'Omnikon National Tech Hackathon 2026',
description: 'Empower student developers by referring participants to the premier national hackathon.',
target: 20,
reward: 'Exclusive Swag & Certificate',
reward: 'Verified Certificate & Recognition',
status: 'active',
multiplier: '1.5x'
}];
Expand All @@ -190,7 +190,7 @@ export async function getActiveCampaigns() {
title: 'Omnikon National Tech Hackathon 2026',
description: 'Empower student developers by referring participants to the premier national hackathon.',
target: 20,
reward: 'Exclusive Swag & Certificate',
reward: 'Verified Certificate & Recognition',
status: 'active',
multiplier: '1.5x'
}];
Expand Down Expand Up @@ -292,12 +292,23 @@ export async function getSystemAnalytics() {
// ── Leaderboard ──────────────────────────────────────────
export async function getLeaderboard(limit = 100) {
const db = await getDb();
let snapshot;
try {
const snapshot = await db.collection('users')
snapshot = await db.collection('users')
.where('role', '==', 'ambassador')
.where('status', '==', 'active')
.get();

} catch (err) {
console.warn("Primary users query failed, checking fallback queries/collections:", err);
try {
snapshot = await db.collection('leaderboard').get();
} catch (fallbackErr) {
console.error("Error in getLeaderboard:", fallbackErr);
return [];
}
}

try {
let data = snapshot.docs.map(doc => doc.data());

data.sort((a, b) => {
Expand All @@ -314,7 +325,7 @@ export async function getLeaderboard(limit = 100) {

return data.slice(0, limit);
} catch (err) {
console.error("Error in getLeaderboard:", err);
console.error("Error processing leaderboard data:", err);
return [];
}
}
2 changes: 1 addition & 1 deletion assets/hackathon-window.js
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ class HackathonWindow {
const titleContainer = document.createElement('div');
titleContainer.className = 'hackathon-window-title';
titleContainer.innerHTML = `
<img src="./public/LogoOmnikon.jpeg" alt="Omnikon" />
<img src="/LogoOmnikon.jpeg" alt="Omnikon" />
Omnikon National Tech Hackathon 2026
`;

Expand Down
30 changes: 21 additions & 9 deletions assets/leaderboard.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,33 +18,45 @@ document.addEventListener('DOMContentLoaded', async () => {
let rowStyles = "hover:bg-surface-variant/10 transition-colors";
let icon = "";

let badgeHtml = '';
if (rank === 1) {
rankStyles = "text-yellow-400 font-bold drop-shadow-[0_0_8px_rgba(250,204,21,0.8)]";
rowStyles = "bg-yellow-400/5 hover:bg-yellow-400/10 border-l-2 border-yellow-400";
icon = '<span class="material-symbols-outlined text-[14px] align-middle mr-1 text-yellow-400">workspace_premium</span>';
badgeHtml = '<span class="px-1.5 py-0.5 text-[9px] bg-yellow-400/20 text-yellow-300 border border-yellow-400/30 rounded font-mono font-bold uppercase">Top 1 Featured</span>';
} else if (rank === 2) {
rankStyles = "text-gray-300 font-bold";
rowStyles = "bg-gray-300/5 hover:bg-gray-300/10 border-l-2 border-gray-300";
badgeHtml = '<span class="px-1.5 py-0.5 text-[9px] bg-gray-300/20 text-gray-300 border border-gray-300/30 rounded font-mono font-bold uppercase">Top 2 Featured</span>';
} else if (rank === 3) {
rankStyles = "text-amber-600 font-bold";
rowStyles = "bg-amber-600/5 hover:bg-amber-600/10 border-l-2 border-amber-600";
badgeHtml = '<span class="px-1.5 py-0.5 text-[9px] bg-amber-600/20 text-amber-500 border border-amber-600/30 rounded font-mono font-bold uppercase">Top 3 Featured</span>';
}

return `
<tr class="border-b border-surface-variant/30 ${rowStyles}">
<td class="px-6 py-4 font-mono text-sm ${rankStyles}">
<td class="px-3 sm:px-6 py-3 sm:py-4 font-mono text-xs sm:text-sm ${rankStyles} whitespace-nowrap">
${icon}#${rank}
</td>
<td class="px-6 py-4 flex items-center gap-3">
<img src="${amb.photoURL || '/LogoOmnikon.jpeg'}" class="w-8 h-8 rounded-full border border-surface-variant object-cover">
<div>
<p class="font-bold text-on-surface">${amb.name || 'Anonymous'}</p>
<p class="text-[10px] text-primary font-mono">${amb.ambassadorId || '---'}</p>
<td class="px-3 sm:px-6 py-3 sm:py-4">
<div class="flex items-center gap-2 sm:gap-3">
<img src="${amb.photoURL || '/LogoOmnikon.jpeg'}" class="w-7 h-7 sm:w-8 sm:h-8 rounded-full border border-surface-variant object-cover shrink-0" alt="Avatar">
<div class="min-w-0">
<div class="flex items-center gap-2 flex-wrap">
<p class="font-bold text-on-surface text-xs sm:text-sm truncate">${amb.name || 'Anonymous'}</p>
${badgeHtml}
</div>
<div class="flex items-center gap-1.5 flex-wrap">
<span class="text-[10px] text-primary font-mono">${amb.ambassadorId || '---'}</span>
<span class="text-[10px] text-on-surface-variant md:hidden font-sans truncate max-w-[140px] sm:max-w-[200px]">• ${amb.college || '---'}</span>
</div>
</div>
</div>
</td>
<td class="px-6 py-4 text-sm text-on-surface-variant">${amb.college || '---'}</td>
<td class="px-6 py-4 text-right">
<span class="inline-flex items-center justify-center bg-surface-variant/50 text-on-surface font-mono text-sm px-3 py-1 rounded border border-surface-variant">
<td class="px-3 sm:px-6 py-3 sm:py-4 text-xs sm:text-sm text-on-surface-variant hidden md:table-cell">${amb.college || '---'}</td>
<td class="px-3 sm:px-6 py-3 sm:py-4 text-right whitespace-nowrap">
<span class="inline-flex items-center justify-center bg-surface-variant/50 text-on-surface font-mono text-xs sm:text-sm px-2.5 sm:px-3 py-0.5 sm:py-1 rounded border border-surface-variant font-bold">
${amb.verifiedRegistrations || 0}
</span>
</td>
Expand Down
4 changes: 2 additions & 2 deletions auth.js
Original file line number Diff line number Diff line change
Expand Up @@ -255,7 +255,7 @@
}
}

const avatarUrl = user.photoURL || './public/LogoOmnikon.jpeg';
const avatarUrl = user.photoURL || '/LogoOmnikon.jpeg';
authWidget.innerHTML = `
<div class="flex items-center gap-1.5 sm:gap-3">
<img class="w-7 h-7 sm:w-8 sm:h-8 rounded-full border border-primary object-cover shrink-0" src="${avatarUrl}" alt="Profile">
Expand All @@ -272,7 +272,7 @@
if (window.showGlobalLoader) window.showGlobalLoader('LOGGING_OUT...');
await auth.signOut();
sessionStorage.clear();
window.location.href = '/index.html';
window.location.href = '/pages/index.html';
} catch(err) {
console.error("Logout error:", err);
if (window.hideGlobalLoader) window.hideGlobalLoader();
Expand Down
Loading
Loading