Skip to content
Merged
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
17 changes: 2 additions & 15 deletions app/globals.css
Original file line number Diff line number Diff line change
@@ -1,20 +1,7 @@
@import "tailwindcss";

Copy link

Copilot AI Dec 12, 2025

Choose a reason for hiding this comment

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

The custom Tailwind variants for dark and darkest modes lack documentation explaining their purpose and usage. Consider adding comments that explain these variants work by checking for .dark or .darkest classes on a parent element, and that the ThemeToggle component is responsible for applying these classes to the html element.

Suggested change
/*
* Custom Tailwind variants for dark and darkest modes.
* These variants work by checking for `.dark` or `.darkest` classes on a parent element.
* The ThemeToggle component is responsible for applying these classes to the <html> element.
*/

Copilot uses AI. Check for mistakes.
:root {
--background: #ffffff;
--foreground: #000000;
}

@theme inline {
--color-background: var(--background);
--color-foreground: var(--foreground);
--font-sans: var(--font-inter);
}

body {
background: var(--background);
color: var(--foreground);
}
@variant dark (.dark &);
@variant darkest (.darkest &);

Comment on lines +3 to 5
Copy link

Copilot AI Dec 12, 2025

Choose a reason for hiding this comment

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

The dark mode implementation uses custom Tailwind variants (dark: and darkest:) that require the corresponding class to be added to the html element. However, there's no mechanism in place to add these classes. The theme variants defined in globals.css expect a parent element with .dark or .darkest class, but the html element in layout.tsx doesn't have any class attribute. Without the ThemeToggle component adding these classes dynamically, the dark mode styling will never be applied.

Suggested change
@variant dark (.dark &);
@variant darkest (.darkest &);

Copilot uses AI. Check for mistakes.
/* Scroll reveal animations */
.reveal {
Expand Down
11 changes: 3 additions & 8 deletions app/layout.tsx
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
import type { Metadata } from "next";
import { Inter } from "next/font/google";
import "./globals.css";
import Header from "@/components/Header";
import Footer from "@/components/Footer";
import ClientLayout from "@/components/ClientLayout";

const inter = Inter({
subsets: ["latin"],
Expand Down Expand Up @@ -57,12 +56,8 @@ export default function RootLayout({
}>) {
return (
<html lang="en" className="scroll-smooth">
Copy link

Copilot AI Dec 12, 2025

Choose a reason for hiding this comment

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

The html element needs to support theme class names for the dark mode variants to work. Since the custom Tailwind variants are defined as '.dark &' and '.darkest &', the html element should have a mechanism to receive 'dark' or 'darkest' class dynamically. Consider updating this to include theme class handling, potentially by making this a client component or using a theme provider pattern.

Copilot uses AI. Check for mistakes.
<body className={`${inter.variable} font-sans antialiased`}>
<Header />
<main>
{children}
</main>
<Footer />
<body className={`${inter.variable} font-sans antialiased bg-white dark:bg-[#36393f] darkest:bg-black text-black dark:text-white darkest:text-white`}>
Copy link

Copilot AI Dec 12, 2025

Choose a reason for hiding this comment

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

The implementation uses Discord-inspired color values (like #2f3136, #36393f, #40444b, #b9bbbe) for dark mode. While these are recognizable Discord colors, consider documenting this design decision or creating named color constants in a theme configuration file for better maintainability and to make it easier to adjust the theme in the future.

Suggested change
<body className={`${inter.variable} font-sans antialiased bg-white dark:bg-[#36393f] darkest:bg-black text-black dark:text-white darkest:text-white`}>
{/* Uses Discord-inspired dark mode color. See tailwind.config.js for 'discord-dark' color definition. */}
<body className={`${inter.variable} font-sans antialiased bg-white dark:bg-discord-dark darkest:bg-black text-black dark:text-white darkest:text-white`}>

Copilot uses AI. Check for mistakes.
<ClientLayout>{children}</ClientLayout>
</body>
</html>
);
Expand Down
28 changes: 14 additions & 14 deletions app/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -11,35 +11,35 @@ export default function Home() {
return (
<>
{/* Hero Section */}
<section className="relative min-h-[85vh] flex items-center justify-center px-6 border-b border-black/10 overflow-hidden">
<section className="relative min-h-[85vh] flex items-center justify-center px-6 border-b border-black/10 dark:border-[#202225] darkest:border-white/10 overflow-hidden">
{/* Hero Image with Parallax */}
<ParallaxHero />

<div className="relative z-10 max-w-4xl mx-auto text-center animate-fade-in">
<h1 className="text-5xl md:text-6xl font-bold tracking-tight mb-4 animate-slide-up">
<h1 className="text-5xl md:text-6xl font-bold tracking-tight mb-4 animate-slide-up text-black dark:text-white darkest:text-white">
AustroVis
</h1>
<p className="text-lg md:text-xl text-black/70 mb-6 max-w-2xl mx-auto animate-slide-up" style={{ animationDelay: '0.1s' }}>
<p className="text-lg md:text-xl text-black/70 dark:text-[#b9bbbe] darkest:text-white/70 mb-6 max-w-2xl mx-auto animate-slide-up" style={{ animationDelay: '0.1s' }}>
A community of researchers, students, and practitioners interested in data visualization and visual analytics in Austria.
</p>
<div className="flex flex-col sm:flex-row gap-3 justify-center animate-slide-up" style={{ animationDelay: '0.2s' }}>
<a
href="/register"
className="px-6 py-2.5 bg-black text-white font-medium rounded-md hover:bg-black/80 hover:scale-105 transition-all text-sm"
className="px-6 py-2.5 bg-black dark:bg-white darkest:bg-white text-white dark:text-black darkest:text-black font-medium rounded-md hover:bg-black/80 dark:hover:bg-white/90 darkest:hover:bg-white/90 hover:scale-105 transition-all text-sm"
>
Register Now
</a>
<a
href="#events"
className="px-6 py-2.5 border border-black/20 font-medium rounded-md hover:border-black/40 hover:scale-105 transition-all text-sm"
className="px-6 py-2.5 border border-black/20 dark:border-white/20 darkest:border-white/20 font-medium rounded-md hover:border-black/40 dark:hover:border-white/40 darkest:hover:border-white/40 hover:scale-105 transition-all text-sm text-black dark:text-white darkest:text-white"
>
View Events
</a>
<a
href="https://discord.gg/rbkSzsxP47"
target="_blank"
rel="noopener noreferrer"
className="px-6 py-2.5 border border-black/20 font-medium rounded-md hover:border-black/40 hover:scale-105 transition-all text-sm"
className="px-6 py-2.5 border border-black/20 dark:border-white/20 darkest:border-white/20 font-medium rounded-md hover:border-black/40 dark:hover:border-white/40 darkest:hover:border-white/40 hover:scale-105 transition-all text-sm text-black dark:text-white darkest:text-white"
>
Join Discord
</a>
Expand All @@ -51,11 +51,11 @@ export default function Home() {
<section id="about" className="py-16 px-6">
<ScrollReveal>
<div className="max-w-4xl mx-auto text-center">
<h2 className="text-3xl font-bold mb-3">About the AustroVis Workshop</h2>
<p className="text-base text-black/70 mb-4">
<h2 className="text-3xl font-bold mb-3 text-black dark:text-white darkest:text-white">About the AustroVis Workshop</h2>
<p className="text-base text-black/70 dark:text-[#b9bbbe] darkest:text-white/70 mb-4">
The workshop brings together the visualization community in Austria to share knowledge and build connections.
</p>
<p className="text-base text-black/70">
<p className="text-base text-black/70 dark:text-[#b9bbbe] darkest:text-white/70">
The AustroVis Workshop covers a wide range of topics in visualization, from fundamental visualization principles to advanced techniques in interactive visualization, visual analytics, and machine learning visualization.
</p>
</div>
Expand All @@ -66,7 +66,7 @@ export default function Home() {
<section id="events" className="py-16 px-6">
<div className="max-w-7xl mx-auto">
<ScrollReveal>
<h2 className="text-3xl font-bold mb-8">Upcoming Events</h2>
<h2 className="text-3xl font-bold mb-8 text-black dark:text-white darkest:text-white">Upcoming Events</h2>
</ScrollReveal>
{upcomingEvents.length > 0 ? (
<div className="grid grid-cols-1 md:grid-cols-2 gap-6">
Expand All @@ -78,7 +78,7 @@ export default function Home() {
</div>
) : (
<ScrollReveal>
<p className="text-black/60 text-lg">
<p className="text-black/60 dark:text-[#b9bbbe] darkest:text-white/60 text-lg">
No upcoming events scheduled at the moment. Stay tuned!
</p>
</ScrollReveal>
Expand All @@ -87,10 +87,10 @@ export default function Home() {
</section>

{/* Past Events */}
<section className="py-16 px-6 bg-black/2">
<section className="py-16 px-6 bg-black/2 dark:bg-[#2f3136] darkest:bg-black/50">
<div className="max-w-7xl mx-auto">
<ScrollReveal>
<h2 className="text-3xl font-bold mb-8">Past Events</h2>
<h2 className="text-3xl font-bold mb-8 text-black dark:text-white darkest:text-white">Past Events</h2>
</ScrollReveal>
{pastEvents.length > 0 ? (
<div className="grid grid-cols-1 md:grid-cols-2 gap-6">
Expand All @@ -102,7 +102,7 @@ export default function Home() {
</div>
) : (
<ScrollReveal>
<p className="text-black/60 text-lg">
<p className="text-black/60 dark:text-[#b9bbbe] darkest:text-white/60 text-lg">
No past events yet. Check back soon!
</p>
</ScrollReveal>
Expand Down
50 changes: 25 additions & 25 deletions app/register/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -71,10 +71,10 @@ export default function RegisterPage() {

if (!nextEvent) {
return (
<main className="min-h-screen bg-white pt-32 pb-16 px-4">
<main className="min-h-screen bg-white dark:bg-[#36393f] darkest:bg-black pt-32 pb-16 px-4">
<div className="max-w-2xl mx-auto text-center">
<h1 className="text-4xl font-bold text-black mb-4">Registration</h1>
<p className="text-lg text-black/60">
<h1 className="text-4xl font-bold text-black dark:text-white darkest:text-white mb-4">Registration</h1>
<p className="text-lg text-black/60 dark:text-[#b9bbbe] darkest:text-white/60">
No upcoming events are scheduled at the moment. Please check back later.
</p>
</div>
Expand All @@ -83,22 +83,22 @@ export default function RegisterPage() {
}

return (
<main className="min-h-screen bg-white pt-32 pb-16 px-4">
<main className="min-h-screen bg-white dark:bg-[#36393f] darkest:bg-black pt-32 pb-16 px-4">
<div className="max-w-2xl mx-auto">
<div className="mb-8 text-center">
<h1 className="text-4xl font-bold text-black mb-4">Register for the {nextEvent.title}</h1>
<div className="bg-black/5 border border-black/10 rounded-lg p-6 mb-8">
<p className="text-lg text-black mb-2">
<h1 className="text-4xl font-bold text-black dark:text-white darkest:text-white mb-4">Register for the {nextEvent.title}</h1>
<div className="bg-black/5 dark:bg-[#2f3136] darkest:bg-white/5 border border-black/10 dark:border-[#40444b] darkest:border-white/20 rounded-lg p-6 mb-8">
<p className="text-lg text-black dark:text-white darkest:text-white mb-2">
<span className="font-semibold">Date:</span> {nextEvent.date.toLocaleDateString('en-US', {
year: 'numeric',
month: 'long',
day: 'numeric'
})}
</p>
<p className="text-lg text-black mb-2">
<p className="text-lg text-black dark:text-white darkest:text-white mb-2">
<span className="font-semibold">Location:</span> {nextEvent.university}, {nextEvent.location}
</p>
<p className="text-black/70">{nextEvent.description}</p>
<p className="text-black/70 dark:text-[#b9bbbe] darkest:text-white/70">{nextEvent.description}</p>
</div>
</div>

Expand All @@ -109,22 +109,22 @@ export default function RegisterPage() {
)}

{submitted ? (
<div className="bg-green-50 border border-green-200 rounded-lg p-8 text-center">
<h2 className="text-2xl font-bold text-green-900 mb-4">Thank You!</h2>
<p className="text-green-800 mb-4">
<div className="bg-green-50 dark:bg-green-900/20 darkest:bg-green-900/20 border border-green-200 dark:border-green-700 darkest:border-green-700 rounded-lg p-8 text-center">
<h2 className="text-2xl font-bold text-green-900 dark:text-green-400 darkest:text-green-400 mb-4">Thank You!</h2>
<p className="text-green-800 dark:text-green-300 darkest:text-green-300 mb-4">
Your registration has been received. We&apos;ll get back to you soon with more details.
</p>
<button
onClick={() => setSubmitted(false)}
className="text-black hover:text-black/70 underline"
className="text-black dark:text-white darkest:text-white hover:text-black/70 dark:hover:text-white/70 darkest:hover:text-white/70 underline"
>
Submit another registration
</button>
</div>
) : (
<form onSubmit={handleSubmit} className="border border-black/10 rounded-lg p-8">
<form onSubmit={handleSubmit} className="border border-black/10 dark:border-[#40444b] darkest:border-white/20 rounded-lg p-8 bg-white dark:bg-[#2f3136] darkest:bg-black">
<div className="mb-6">
<label htmlFor="name" className="block text-sm font-semibold text-black mb-2">
<label htmlFor="name" className="block text-sm font-semibold text-black dark:text-white darkest:text-white mb-2">
Name (Presenter) <span className="text-red-500">*</span>
</label>
<input
Expand All @@ -134,13 +134,13 @@ export default function RegisterPage() {
required
value={formData.name}
onChange={handleChange}
className="w-full px-4 py-2 border border-black/20 rounded-lg focus:ring-2 focus:ring-black focus:border-black outline-none transition"
className="w-full px-4 py-2 border border-black/20 dark:border-[#40444b] darkest:border-white/20 rounded-lg focus:ring-2 focus:ring-black dark:focus:ring-white darkest:focus:ring-white focus:border-black dark:focus:border-white darkest:focus:border-white outline-none transition bg-white dark:bg-[#1e1f22] darkest:bg-[#0a0a0a] text-black dark:text-white darkest:text-white placeholder:text-black/40 dark:placeholder:text-[#72767d] darkest:placeholder:text-white/40"
Copy link

Copilot AI Dec 12, 2025

Choose a reason for hiding this comment

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

The className strings are becoming extremely long and difficult to maintain due to the repetition of dark: and darkest: variants. Consider extracting commonly used color combinations into reusable CSS classes or using a library like clsx/classnames with constants for repeated patterns to improve maintainability and readability.

Copilot uses AI. Check for mistakes.
placeholder="Your full name"
/>
</div>

<div className="mb-6">
<label htmlFor="talkTitle" className="block text-sm font-semibold text-black mb-2">
<label htmlFor="talkTitle" className="block text-sm font-semibold text-black dark:text-white darkest:text-white mb-2">
Talk Title <span className="text-red-500">*</span>
</label>
<input
Expand All @@ -150,13 +150,13 @@ export default function RegisterPage() {
required
value={formData.talkTitle}
onChange={handleChange}
className="w-full px-4 py-2 border border-black/20 rounded-lg focus:ring-2 focus:ring-black focus:border-black outline-none transition"
className="w-full px-4 py-2 border border-black/20 dark:border-[#40444b] darkest:border-white/20 rounded-lg focus:ring-2 focus:ring-black dark:focus:ring-white darkest:focus:ring-white focus:border-black dark:focus:border-white darkest:focus:border-white outline-none transition bg-white dark:bg-[#1e1f22] darkest:bg-[#0a0a0a] text-black dark:text-white darkest:text-white placeholder:text-black/40 dark:placeholder:text-[#72767d] darkest:placeholder:text-white/40"
placeholder="Title of your presentation"
/>
</div>

<div className="mb-6">
<label htmlFor="description" className="block text-sm font-semibold text-black mb-2">
<label htmlFor="description" className="block text-sm font-semibold text-black dark:text-white darkest:text-white mb-2">
Short Description <span className="text-red-500">*</span>
</label>
<textarea
Expand All @@ -166,22 +166,22 @@ export default function RegisterPage() {
value={formData.description}
onChange={handleChange}
rows={4}
className="w-full px-4 py-2 border border-black/20 rounded-lg focus:ring-2 focus:ring-black focus:border-black outline-none transition resize-none"
className="w-full px-4 py-2 border border-black/20 dark:border-[#40444b] darkest:border-white/20 rounded-lg focus:ring-2 focus:ring-black dark:focus:ring-white darkest:focus:ring-white focus:border-black dark:focus:border-white darkest:focus:border-white outline-none transition resize-none bg-white dark:bg-[#1e1f22] darkest:bg-[#0a0a0a] text-black dark:text-white darkest:text-white placeholder:text-black/40 dark:placeholder:text-[#72767d] darkest:placeholder:text-white/40"
placeholder="Brief description of your talk (200-300 words)"
/>
</div>

<div className="mb-8">
<label htmlFor="expectations" className="block text-sm font-semibold text-black mb-2">
What do you expect? <span className="text-black/40">(Optional)</span>
<label htmlFor="expectations" className="block text-sm font-semibold text-black dark:text-white darkest:text-white mb-2">
What do you expect? <span className="text-black/40 dark:text-white/40 darkest:text-white/40">(Optional)</span>
</label>
<textarea
id="expectations"
name="expectations"
value={formData.expectations}
onChange={handleChange}
rows={3}
className="w-full px-4 py-2 border border-black/20 rounded-lg focus:ring-2 focus:ring-black focus:border-black outline-none transition resize-none"
className="w-full px-4 py-2 border border-black/20 dark:border-[#40444b] darkest:border-white/20 rounded-lg focus:ring-2 focus:ring-black dark:focus:ring-white darkest:focus:ring-white focus:border-black dark:focus:border-white darkest:focus:border-white outline-none transition resize-none bg-white dark:bg-[#1e1f22] darkest:bg-[#0a0a0a] text-black dark:text-white darkest:text-white placeholder:text-black/40 dark:placeholder:text-[#72767d] darkest:placeholder:text-white/40"
placeholder="Share your expectations for the workshop..."
/>
</div>
Expand All @@ -190,13 +190,13 @@ export default function RegisterPage() {
<button
type="submit"
disabled={isSubmitting}
className="flex-1 bg-black text-white font-semibold py-3 px-6 rounded-lg hover:bg-black/80 transition-colors disabled:opacity-50 disabled:cursor-not-allowed"
className="flex-1 bg-black dark:bg-white darkest:bg-white text-white dark:text-black darkest:text-black font-semibold py-3 px-6 rounded-lg hover:bg-black/80 dark:hover:bg-white/80 darkest:hover:bg-white/80 transition-colors disabled:opacity-50 disabled:cursor-not-allowed"
>
{isSubmitting ? 'Submitting...' : 'Submit Registration'}
</button>
<a
href="/"
className="flex-1 border border-black/20 text-black font-semibold py-3 px-6 rounded-lg hover:border-black/40 transition-colors text-center"
className="flex-1 border border-black/20 dark:border-[#40444b] darkest:border-white/20 text-black dark:text-white darkest:text-white font-semibold py-3 px-6 rounded-lg hover:border-black/40 dark:hover:border-white/40 darkest:hover:border-white/40 transition-colors text-center"
>
Cancel
</a>
Expand Down
19 changes: 19 additions & 0 deletions components/ClientLayout.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
'use client';

import { ReactNode } from 'react';
import Header from './Header';
import Footer from './Footer';
import ThemeToggle from './ThemeToggle';
Comment thread
velitchko marked this conversation as resolved.

export default function ClientLayout({ children }: { children: ReactNode }) {
return (
<>
<Header />
<main>
{children}
</main>
<Footer />
<ThemeToggle />
</>
);
}
Loading