Skip to content
Merged

seo #17

Show file tree
Hide file tree
Changes from all commits
Commits
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 hackclock/app/favicon.ico
Binary file not shown.
18 changes: 16 additions & 2 deletions hackclock/app/layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,11 @@ export const metadata: Metadata = {
description:
"Run hackathons with a synchronized control room, live countdowns, multi-phase event flows, stage screens, and six-character room codes.",
applicationName: "hackTime",
icons: {
icon: "/favicon.ico",
shortcut: "/favicon.ico",
Comment on lines +22 to +23
Copy link

Copilot AI Apr 2, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There are now two favicons at /public/favicon.ico and /app/favicon.ico. In the App Router, app/favicon.ico also serves /favicon.ico, which can conflict with the icons.icon: "/favicon.ico" setting here (and make it unclear which file is actually served). Recommend keeping a single source of truth (either remove the public favicon and rely on app/favicon.ico, or remove app/favicon.ico and keep the public asset) and align the icons config accordingly.

Suggested change
icon: "/favicon.ico",
shortcut: "/favicon.ico",

Copilot uses AI. Check for mistakes.
apple: "/logo.svg",
},
keywords: [
"hackathon timer",
"hackathon control room",
Expand All @@ -27,7 +32,9 @@ export const metadata: Metadata = {
"hackathon software",
"participant room code",
],
authors: [{ name: "GitHub Community SRMIST" }],
authors: [{ name: "GitHub Community SRM", url: "https://githubsrmist.in" }],
creator: "GitHub Community SRM",
publisher: "GitHub Community SRM",
category: "productivity",
alternates: {
canonical: "/",
Expand All @@ -38,7 +45,14 @@ export const metadata: Metadata = {
"Coordinate organizers, AV teams, and participants with live countdowns, timed announcements, and shared room codes.",
url: "/",
siteName: "hackTime",
images: ["/og-image.JPG"],
images: [
{
url: "/og-image.JPG",
width: 1200,
height: 630,
alt: "hackTime Open Graph social frame",
},
],
locale: "en_US",
type: "website",
},
Expand Down
13 changes: 5 additions & 8 deletions hackclock/app/login/page.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
"use client";

import { useEffect, useMemo, useState } from 'react';
import Image from 'next/image';
import { useRouter, useSearchParams } from 'next/navigation';
import { signIn } from 'next-auth/react';
import { Clock, AtSign, Lock, LogIn, Users, Hash, UserPlus, ArrowRight, ShieldCheck, User, Image as ImageIcon } from 'lucide-react';
Copy link

Copilot AI Apr 2, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Clock is still imported from lucide-react, but it no longer appears to be used in this component after swapping the logo over to next/image. This will likely trip ESLint/TypeScript unused import checks; remove Clock if it’s no longer needed.

Suggested change
import { Clock, AtSign, Lock, LogIn, Users, Hash, UserPlus, ArrowRight, ShieldCheck, User, Image as ImageIcon } from 'lucide-react';
import { AtSign, Lock, LogIn, Users, Hash, UserPlus, ArrowRight, ShieldCheck, User, Image as ImageIcon } from 'lucide-react';

Copilot uses AI. Check for mistakes.
Expand Down Expand Up @@ -153,9 +154,7 @@ export default function LoginPage() {

<header className="h-16 flex justify-between items-center px-8 border-b" style={{ borderColor: 'rgba(255,255,255,0.06)', backgroundColor: 'rgba(28,28,28,0.5)' }}>
<div className="flex items-center gap-3">
<div className="w-6 h-6 rounded flex items-center justify-center" style={{ background: 'linear-gradient(135deg, #5D00FF, #FF2E9A)' }}>
<Clock size={14} strokeWidth={3} className="text-white" />
</div>
<Image src="/logo.svg" alt="hackTime logo" width={24} height={24} className="rounded" priority />
<h2 className="text-lg font-bold tracking-tight" style={{ color: '#E6E6E6' }}>hackTime</h2>
</div>
<div className="flex items-center gap-6 text-sm font-medium" style={{ color: '#A0A0A0' }}>
Expand All @@ -178,9 +177,7 @@ export default function LoginPage() {
<main className="flex-1 flex flex-col items-center justify-center p-4 z-10">

<div className="flex flex-col items-center mb-8">
<div className="w-12 h-12 rounded-xl flex items-center justify-center mb-4 border shadow-lg" style={{ backgroundColor: '#1C1C1C', borderColor: 'rgba(255,255,255,0.06)' }}>
<Clock size={24} style={{ color: '#FF2E9A' }} />
</div>
<Image src="/logo.svg" alt="hackTime logo" width={48} height={48} className="mb-4 rounded-xl border shadow-lg" style={{ borderColor: 'rgba(255,255,255,0.06)' }} priority />
<h1 className="text-3xl font-black tracking-tight mb-2" style={{ color: '#E6E6E6' }}>hackTime</h1>
<p className="text-[10px] font-bold tracking-[0.2em] uppercase" style={{ color: '#A0A0A0' }}>Terminal Session Authentication</p>
</div>
Expand All @@ -205,8 +202,8 @@ export default function LoginPage() {
setError('');
}}
className={`flex-1 py-4 text-xs font-bold tracking-wider uppercase transition-colors border-t-2 ${activeTab === tab
? ''
: 'hover:bg-[#1C1C1C]/50 hover:text-white'
? ''
: 'hover:bg-[#1C1C1C]/50 hover:text-white'
}`}
style={activeTab === tab
? { color: '#FF2E9A', backgroundColor: '#1C1C1C', borderColor: '#FF2E9A' }
Expand Down
31 changes: 26 additions & 5 deletions hackclock/app/page.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import type { Metadata } from "next";
import Image from "next/image";
import Link from "next/link";
import {
ArrowRight,
Expand Down Expand Up @@ -105,13 +106,22 @@ export const metadata: Metadata = {
alternates: {
canonical: "/",
},
creator: "GitHub Community SRM",
publisher: "GitHub Community SRM",
openGraph: {
title: "Hackathon Control Room, Countdown Timer & Stage View",
description:
"A synchronized control room for organizers, AV teams, and participants running hackathons and live event timelines.",
url: siteUrl,
siteName: "hackTime",
images: ["/og-image.JPG"],
images: [
{
url: "/og-image.JPG",
width: 1200,
height: 630,
alt: "hackTime Open Graph social frame",
},
],
type: "website",
},
twitter: {
Expand Down Expand Up @@ -146,7 +156,7 @@ export default function Home() {
},
creator: {
"@type": "Organization",
name: "GitHub Community SRMIST",
name: "GitHub Community SRM",
url: "https://githubsrmist.in",
},
featureList: [
Expand Down Expand Up @@ -181,9 +191,7 @@ export default function Home() {
<header className="sticky top-0 z-20 border-b border-white/8 bg-[#0F0F10]/85 backdrop-blur-xl">
<div className="mx-auto flex h-16 w-full max-w-7xl items-center justify-between px-4 sm:px-6 lg:px-8">
<Link href="/" className="group inline-flex items-center gap-2">
<div className="flex h-7 w-7 items-center justify-center rounded-md bg-linear-to-br from-[#5D00FF] to-[#FF2E9A]">
<Clock size={14} className="text-white" strokeWidth={2.5} />
</div>
<Image src="/logo.svg" alt="hackTime logo" width={28} height={28} className="rounded-md" priority />
<span className="text-sm font-semibold tracking-tight text-white group-hover:text-[#CFFF04] transition-colors">
hackTime
</span>
Expand Down Expand Up @@ -236,6 +244,19 @@ export default function Home() {
</Link>
</div>

<p className="mt-5 text-xs text-[#A0A0A0]">
Created by{" "}
<a
href="https://githubsrmist.in"
target="_blank"
rel="noopener noreferrer"
className="font-semibold text-[#E6E6E6] underline-offset-4 transition-colors hover:text-[#CFFF04] hover:underline"
>
GitHub Community SRM
</a>
.
</p>

<div className="mt-10 grid gap-3 sm:grid-cols-2 xl:grid-cols-4">
{[
"6-character room codes",
Expand Down
31 changes: 15 additions & 16 deletions hackclock/components/ui/Sidebar.tsx
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
"use client";

import Link from 'next/link';
import Image from 'next/image';
import { usePathname, useRouter } from 'next/navigation';
import { useSession } from 'next-auth/react';
import { useState, useEffect, useRef } from 'react';
import { LayoutGrid, Clock, Network, Monitor, XCircle, X, Terminal } from 'lucide-react';
import { LayoutGrid, Clock, Network, Monitor, XCircle, X } from 'lucide-react';
import JoinRoomControls from '@/components/ui/JoinRoomControls';

interface SidebarProps {
Expand All @@ -17,7 +18,7 @@ export default function Sidebar({ onNavItemClick }: SidebarProps) {
const { data: session, update } = useSession();
const stageTransitionTimeoutRef = useRef<number | null>(null);
const lastClearedRoomRef = useRef<string | null>(null);

// Dynamic State for both Organizers and Guests
const [currentRoomId, setCurrentRoomId] = useState<string | null>(null);
const [currentRoomName, setCurrentRoomName] = useState<string | null>(null);
Expand Down Expand Up @@ -208,29 +209,27 @@ export default function Sidebar({ onNavItemClick }: SidebarProps) {
<aside className={`w-full h-full backdrop-blur-2xl flex flex-col z-20 overflow-y-auto transition-all duration-200 ${isStageTransitioning ? '-translate-x-full opacity-0 scale-[0.98]' : 'translate-x-0 opacity-100 scale-100'}`} style={{ backgroundColor: 'rgba(15,15,16,0.8)', borderRight: '1px solid rgba(255,255,255,0.06)' }}>
<div className="h-20 flex items-center justify-between px-8 shrink-0" style={{ borderBottom: '1px solid rgba(255,255,255,0.06)' }}>
<h2 className="text-xl font-bold tracking-tight flex items-center gap-2" style={{ color: '#E6E6E6' }}>
<div className="w-6 h-6 rounded-lg flex items-center justify-center" style={{ background: 'linear-gradient(135deg, #5D00FF, #FF2E9A)' }}>
<Terminal size={14} className="text-white" />
</div>
<Image src="/logo.svg" alt="hackTime logo" width={24} height={24} className="rounded-lg" />
hackTime
</h2>
<button className="lg:hidden transition-colors hover:text-white" style={{ color: '#A0A0A0' }} onClick={onNavItemClick}>
<X size={20} />
</button>
</div>

<div className="px-6 py-6" style={{ borderBottom: '1px solid rgba(255,255,255,0.06)' }}>
{currentRoomId ? (
<div className="p-4 rounded-[20px] relative group overflow-hidden" style={{ backgroundColor: 'rgba(28,28,28,0.6)', border: '1px solid rgba(255,46,154,0.15)', boxShadow: '0 8px 32px rgba(255,46,154,0.06)' }}>
<p className="text-[9px] uppercase font-bold tracking-[0.15em] mb-1.5 flex items-center gap-2" style={{ color: '#FF2E9A' }}>
<span className="w-1.5 h-1.5 rounded-full animate-pulse" style={{ backgroundColor: '#FF2E9A' }}></span>
{isGuest ? 'GUEST NODE' : 'ACTIVE HACKATHON'}
<span className="w-1.5 h-1.5 rounded-full animate-pulse" style={{ backgroundColor: '#FF2E9A' }}></span>
{isGuest ? 'GUEST NODE' : 'ACTIVE HACKATHON'}
</p>
<p className="text-sm font-semibold truncate" style={{ color: '#E6E6E6' }}>{currentRoomName || 'Session Loading...'}</p>
<p className="text-[10px] font-mono tracking-widest mt-1 opacity-50" style={{ color: '#A0A0A0' }}>{currentRoomId}</p>
{isGuest && <p className="text-[10px] font-medium mt-1 truncate" style={{ color: '#FF2E9A' }}>{guestName}</p>}

<button onClick={handleDisconnect} className="absolute right-3 top-3 opacity-0 group-hover:opacity-100 transition-all hover:text-[#F43F5E]" style={{ color: '#A0A0A0' }}>
<XCircle size={16} />
<XCircle size={16} />
</button>
</div>
) : (
Expand All @@ -247,8 +246,8 @@ export default function Sidebar({ onNavItemClick }: SidebarProps) {
const isActive = pathname.startsWith(item.href) && item.href !== '/';
return (
<li key={item.name}>
<Link
href={item.href}
<Link
href={item.href}
onClick={(e) => {
const shouldAnimateStageExit = item.name === 'Stage Mode' && item.href.startsWith('/room/') && item.href.endsWith('/stage');

Expand All @@ -260,12 +259,12 @@ export default function Sidebar({ onNavItemClick }: SidebarProps) {
onNavItemClick?.();
}}
className={`flex items-center gap-3.5 px-4 py-3 rounded-xl text-sm font-semibold tracking-wide transition-all group`}
style={isActive
style={isActive
? { backgroundColor: 'rgba(255,46,154,0.08)', color: '#FF2E9A', boxShadow: 'inset 0 0 20px rgba(255,46,154,0.04)' }
: { color: '#A0A0A0' }
}
onMouseEnter={(e) => { if (!isActive) { e.currentTarget.style.color = '#E6E6E6'; e.currentTarget.style.backgroundColor = 'rgba(255,255,255,0.04)'; }}}
onMouseLeave={(e) => { if (!isActive) { e.currentTarget.style.color = '#A0A0A0'; e.currentTarget.style.backgroundColor = 'transparent'; }}}
onMouseEnter={(e) => { if (!isActive) { e.currentTarget.style.color = '#E6E6E6'; e.currentTarget.style.backgroundColor = 'rgba(255,255,255,0.04)'; } }}
onMouseLeave={(e) => { if (!isActive) { e.currentTarget.style.color = '#A0A0A0'; e.currentTarget.style.backgroundColor = 'transparent'; } }}
>
<item.icon size={18} style={{ color: isActive ? '#FF2E9A' : '#6B7280' }} />
{item.name}
Expand All @@ -285,7 +284,7 @@ export default function Sidebar({ onNavItemClick }: SidebarProps) {
description="Join an active hackathon with a room ID. We'll route you straight into the live clock view."
buttonLabel="Connect Terminal"
onSuccess={onNavItemClick}
className="w-full py-3 rounded-xl font-bold text-[10px] transition-all flex justify-center items-center gap-2 tracking-[0.1em] uppercase shadow-lg active:scale-95"
className="w-full py-3 rounded-xl font-bold text-[10px] transition-all flex justify-center items-center gap-2 tracking-widest uppercase shadow-lg active:scale-95"
style={{ backgroundColor: 'rgba(255,255,255,0.04)', border: '1px solid rgba(255,255,255,0.06)', color: '#A0A0A0' }}
/>
</div>
Expand Down
Binary file added hackclock/public/favicon.ico
Binary file not shown.
1 change: 0 additions & 1 deletion hackclock/public/file.svg

This file was deleted.

1 change: 0 additions & 1 deletion hackclock/public/globe.svg

This file was deleted.

18 changes: 18 additions & 0 deletions hackclock/public/logo.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 0 additions & 1 deletion hackclock/public/next.svg

This file was deleted.

1 change: 0 additions & 1 deletion hackclock/public/vercel.svg

This file was deleted.

1 change: 0 additions & 1 deletion hackclock/public/window.svg

This file was deleted.