Compare commits

..

5 commits

Author SHA1 Message Date
q3k 29c1252633 landing: do not mention how many tickets there are per space
Some checks failed
/ deploy (push) Failing after 54s
This seems like an internal detail, and is probably likely to change
(ie. we will issue more vouchers as they legitimately run out and if it
won't starve other spaces).
2025-04-13 19:46:57 +02:00
Dariusz Niemczyk 6da5da5bee
fox: add header margin to scroll
Some checks failed
/ deploy (push) Failing after 53s
2025-04-13 19:01:03 +02:00
Dariusz Niemczyk 103e343f22 fix: links
Some checks failed
/ deploy (push) Failing after 53s
2025-04-13 16:58:59 +00:00
q3k 2c0d70975a look: new favicon
Some checks failed
/ deploy (push) Failing after 53s
The wireframe render is barely visible on a light background. This turns
it into a silhouette (preserving our colour scheme) and rotates it by
~45 degrees to make it fill out the frame more.
2025-04-13 18:13:44 +02:00
q3k af1a4e6c74 look: move language selector to RHS, don't use country flags
Some checks failed
/ deploy (push) Failing after 1s
The language selection being a flag never sat right wight me:

 1. Its positioning next to 'CEBULACAMP' implied more that it's a
    cebula.camp logo or intrinsic flag of the event or something.
 2. I think it's the first site I've ever seen that has a language
    selector on the left hand side of the navigation bar.
 3. Using country flags as language icons is wrong [1].

[1] - just ask the Swiss or the Belgians.
2025-04-13 17:03:40 +02:00
8 changed files with 96 additions and 13 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.4 KiB

After

Width:  |  Height:  |  Size: 4.4 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 1.6 MiB

After

Width:  |  Height:  |  Size: 3.8 KiB

View file

@ -243,7 +243,7 @@ export default function LandingPage(
</> </>
</NewSection> </NewSection>
<NewSection id="faq"> <NewSection id="details">
<> <>
<div> <div>
<Heading>{t.details.title}</Heading> <Heading>{t.details.title}</Heading>

View file

@ -14,18 +14,17 @@ export function NavContainer({ children, title, }: { children: React.ReactNode,
<div className="container mx-auto px-4"> <div className="container mx-auto px-4">
<div className="flex items-center justify-between h-16"> <div className="flex items-center justify-between h-16">
<div className="flex gap-4"> <div className="flex gap-4">
<LanguageSelector />
<Link href="/" className="text-xl font-bold tracking-tighter hover:text-primary transition-colors"> <Link href="/" className="text-xl font-bold tracking-tighter hover:text-primary transition-colors">
<h1>{title}</h1> <h1>{title}</h1>
</Link> </Link>
</div> </div>
<div className="flex items-center"> <div className="flex items-center">
{children} {children}
<LanguageSelector />
<Button <Button
variant="ghost" variant="ghost"
size="icon" size="icon"
onClick={() => setTheme(theme === "dark" ? "light" : "dark")} onClick={() => setTheme(theme === "dark" ? "light" : "dark")}
className="ml-4"
> >
{theme === "dark" ? ( {theme === "dark" ? (
<SunIcon className="h-5 w-5" /> <SunIcon className="h-5 w-5" />

View file

@ -3,6 +3,8 @@
import { Lang } from "@/i18n/locales"; import { Lang } from "@/i18n/locales";
import Link from "next/link"; import Link from "next/link";
import { useParams, usePathname } from "next/navigation"; import { useParams, usePathname } from "next/navigation";
import { Button } from "./button";
import { LanguagesIcon } from "lucide-react";
export const LanguageSelector = () => { export const LanguageSelector = () => {
@ -15,10 +17,22 @@ export const LanguageSelector = () => {
} }
const lang = params?.locale || 'pl'; const lang = params?.locale || 'pl';
const changedLang = pathname.replace(`/${lang}`, `/${replacements[lang]}`) const otherLang = replacements[lang];
const changedLang = pathname.replace(`/${lang}`, `/${otherLang}`)
if (lang === 'pl') return (<> return (<>
<Link suppressHydrationWarning className="pt-1" href={changedLang}>🇬🇧</Link></>); <Button
if (lang === 'en') return (<> variant="ghost"
<Link suppressHydrationWarning className="pt-1" href={changedLang}>🇵🇱</Link></>); size="icon"
className="md:ml-6 w-15"
>
<Link
href={changedLang}
className="flex space-x-2 items-center"
>
<LanguagesIcon className="h-5 w-5 mr-1" />
<span>{otherLang.toUpperCase()}</span>
</Link>
</Button>
</>);
}; };

View file

@ -155,3 +155,7 @@
.z-max { .z-max {
z-index: 10000; z-index: 10000;
} }
section {
scroll-margin-top: calc(var(--spacing) * 16 + var(--spacing) * 4);
}

View file

@ -2,11 +2,10 @@ import { Sections } from "@/i18n/translations";
import { useLayoutEffect, useRef } from "react"; import { useLayoutEffect, useRef } from "react";
export const linksOrder: Array<Sections> = [ export const linksOrder: Array<Sections> = [
"details",
"title",
"about", "about",
"tickets", "tickets",
"cfp", "cfp",
"details",
"contact" "contact"
] ]

View file

@ -44,7 +44,7 @@ const pl = {
tickets: { tickets: {
title: "Bilety", title: "Bilety",
status: `Rusza sprzedaż pierwszej puli biletów na Cebula Camp 2025: Reaktywacja! status: `Rusza sprzedaż pierwszej puli biletów na Cebula Camp 2025: Reaktywacja!
Od 20 kwietnia 2025 r. będzie można kupić bilet. Każdy z sześciu polskich Hackerspaceów ma voucher, który pozwala im kupić bilety. Skontaktuj się więc z najbliższym HS i zarezerwuj swój bilet jak najszybciej! Od 20 kwietnia 2025 r. będzie można kupić bilet. Każdy z sześciu polskich Hackerspaceów ma voucher, który pozwala na zakup biletów. Skontaktuj się więc z najbliższym HS i zarezerwuj swój bilet jak najszybciej!
W miejscu, gdzie będzie nasz Camp, mamy do dyspozycji przestrzeń, którą wykorzystamy jako małe pole namiotowe. Jeżeli chcesz nocować w swoim namiocie, przy zakupie biletu dodaj nocleg na polu namiotowym jako dodatek do biletu. Nie pobieramy za to żadnych dodatkowych opłat, ale liczba miejsc jest ograniczona, a pula wspólna dla wszystkich.`, W miejscu, gdzie będzie nasz Camp, mamy do dyspozycji przestrzeń, którą wykorzystamy jako małe pole namiotowe. Jeżeli chcesz nocować w swoim namiocie, przy zakupie biletu dodaj nocleg na polu namiotowym jako dodatek do biletu. Nie pobieramy za to żadnych dodatkowych opłat, ale liczba miejsc jest ograniczona, a pula wspólna dla wszystkich.`,
link: "Kup bilet tutaj", link: "Kup bilet tutaj",