Skip to content

Commit 187f9cb

Browse files
Merge pull request #15 from felixgollnhuber/codex/layout-und-hintergrund-fixen
Fix manage page layout and clarify home and recent event copy
2 parents 3eaaf5c + b275527 commit 187f9cb

8 files changed

Lines changed: 69 additions & 14 deletions

File tree

public/tempoll-logo.png

213 KB
Loading

src/app/globals.css

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@
9191
@apply bg-background text-foreground;
9292
background-image:
9393
radial-gradient(circle at top, color-mix(in srgb, var(--primary) 10%, transparent) 0, transparent 34%),
94+
radial-gradient(circle at bottom, color-mix(in srgb, var(--primary) 8%, transparent) 0, transparent 30%),
9495
linear-gradient(180deg, color-mix(in srgb, white 55%, transparent) 0%, transparent 100%);
9596
}
9697
html {

src/app/manage/[token]/page.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ export default async function ManagePage({ params }: ManagePageProps) {
2323
}
2424

2525
return (
26-
<main className="app-shell flex-1 py-10 sm:py-14">
26+
<main className="app-shell flex-1 pt-10 pb-20 sm:pt-14 sm:pb-24">
2727
<RecentEventTracker
2828
slug={view.snapshot.slug}
2929
title={view.snapshot.title}

src/components/event-heatmap.tsx

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -731,7 +731,13 @@ export function EventHeatmap({
731731
);
732732

733733
return (
734-
<div className="grid min-w-0 gap-4 xl:grid-cols-[minmax(0,1fr)_250px]">
734+
<div
735+
data-slot="event-heatmap-layout"
736+
className={cn(
737+
"grid min-w-0 gap-4",
738+
showSidebar ? "xl:grid-cols-[minmax(0,1fr)_250px]" : "grid-cols-1",
739+
)}
740+
>
735741
<div className="min-w-0 space-y-4">
736742
<Card className="min-w-0 overflow-hidden">
737743
<CardHeader className="gap-3 p-4">

src/components/manage-event-client.test.tsx

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,17 @@ describe("ManageEventClient", () => {
125125
).toBeTruthy();
126126
});
127127

128+
it("renders the heatmap as a single content column when the embedded sidebar is disabled", () => {
129+
const view = createManageView();
130+
renderWithI18n(<ManageEventClient initialView={view} />);
131+
132+
const heatmapLayout = document.querySelector('[data-slot="event-heatmap-layout"]');
133+
134+
expect(heatmapLayout).not.toBeNull();
135+
expect(heatmapLayout).toHaveClass("grid-cols-1");
136+
expect(heatmapLayout?.className).not.toContain("xl:grid-cols-[minmax(0,1fr)_250px]");
137+
});
138+
128139
it("renders the heatmap and lets the organizer select a fixed date on closed events", () => {
129140
const view = createManageView({ status: "CLOSED" });
130141
renderWithI18n(<ManageEventClient initialView={view} />);

src/components/manage-event-client.tsx

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -360,15 +360,15 @@ export function ManageEventClient({ initialView }: ManageEventClientProps) {
360360
);
361361

362362
return (
363-
<div className="space-y-6">
364-
<Card>
363+
<div className="space-y-8">
364+
<Card className="overflow-hidden">
365365
<CardHeader>
366366
<CardTitle className="text-3xl">{messages.manageEvent.title}</CardTitle>
367367
<CardDescription>
368368
{messages.manageEvent.description}
369369
</CardDescription>
370370
</CardHeader>
371-
<CardContent className="grid gap-6 md:grid-cols-2">
371+
<CardContent className="grid gap-x-6 gap-y-5 lg:grid-cols-2 lg:items-end">
372372
<div className="space-y-2">
373373
<Label htmlFor="title">{messages.manageEvent.titleLabel}</Label>
374374
<Input id="title" value={title} onChange={(event) => setTitle(event.target.value)} />
@@ -388,7 +388,7 @@ export function ManageEventClient({ initialView }: ManageEventClientProps) {
388388
</SelectContent>
389389
</Select>
390390
</div>
391-
<div className="space-y-3 md:col-span-2">
391+
<div className="space-y-3 lg:col-span-2">
392392
<Button
393393
onClick={updateEvent}
394394
disabled={isPending || isClosingWithoutFixedDate}
@@ -406,8 +406,8 @@ export function ManageEventClient({ initialView }: ManageEventClientProps) {
406406
</CardContent>
407407
</Card>
408408

409-
<div className="grid gap-6 xl:grid-cols-[minmax(0,1fr)_320px] xl:items-start">
410-
<aside className="order-1 min-w-0 space-y-6 xl:order-2">
409+
<div className="grid gap-8 xl:grid-cols-[minmax(0,1fr)_22rem] xl:items-start">
410+
<aside className="order-1 min-w-0 space-y-5 xl:order-2">
411411
<Card>
412412
<CardHeader>
413413
<CardTitle>{messages.manageEvent.shareLinksTitle}</CardTitle>
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import { screen } from "@testing-library/react";
2+
import { beforeEach, describe, expect, it } from "vitest";
3+
4+
import { RecentEventsSection } from "./recent-events-section";
5+
import { renderWithI18n } from "@/test/render-with-i18n";
6+
7+
describe("RecentEventsSection", () => {
8+
beforeEach(() => {
9+
window.localStorage.clear();
10+
});
11+
12+
it("uses clear labels for the board and organizer actions", () => {
13+
window.localStorage.setItem(
14+
"tempoll_recent_events",
15+
JSON.stringify([
16+
{
17+
slug: "test-event",
18+
title: "Test event",
19+
lastViewedAt: "2026-03-28T20:35:00.000Z",
20+
publicUrl: "/e/test-event",
21+
manageUrl: "/manage/test-token",
22+
},
23+
]),
24+
);
25+
26+
renderWithI18n(<RecentEventsSection />, { locale: "de" });
27+
28+
expect(screen.getByRole("link", { name: "Board öffnen" })).toHaveAttribute(
29+
"href",
30+
"/e/test-event",
31+
);
32+
expect(screen.getByRole("link", { name: "Event verwalten" })).toHaveAttribute(
33+
"href",
34+
"/manage/test-token",
35+
);
36+
});
37+
});

src/lib/i18n/messages.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ export const en = {
5151
},
5252
home: {
5353
badge: "Self-hosted, realtime, account-free",
54-
title: "A cleaner When2Meet for modern teams.",
54+
title: "The clearer alternative to When2Meet.",
5555
description:
5656
"Create an event, share the link, and let people paint their availability on a live heatmap. The organizer gets a private manage page and everyone else can join with just a name.",
5757
primaryCta: "Create an event",
@@ -279,8 +279,8 @@ export const en = {
279279
"Open a public board or organizer page and it will appear here for quick access.",
280280
lastOpened: "Last opened {timestamp}",
281281
privateLinkSaved: "Private link saved",
282-
openPublic: "Open public",
283-
openOrganizer: "Open organizer",
282+
openPublic: "Open board",
283+
openOrganizer: "Manage event",
284284
remove: "Remove",
285285
},
286286
notFound: {
@@ -612,7 +612,7 @@ export const de: Messages = {
612612
},
613613
home: {
614614
badge: "Self-hosted, in Echtzeit, ohne Konto",
615-
title: "Ein übersichtlicheres When2Meet für moderne Teams.",
615+
title: "Die übersichtliche Alternative zu When2Meet.",
616616
description:
617617
"Erstelle ein Event, teile den Link und lass alle ihre Verfügbarkeit direkt auf einer Live-Heatmap markieren. Die organisierende Person erhält eine private Verwaltungsseite, alle anderen steigen nur mit einem Namen ein.",
618618
primaryCta: "Event erstellen",
@@ -849,8 +849,8 @@ export const de: Messages = {
849849
"Öffne ein öffentliches Board oder eine Organizer-Seite, dann erscheint es hier für den schnellen Zugriff.",
850850
lastOpened: "Zuletzt geöffnet {timestamp}",
851851
privateLinkSaved: "Privater Link gespeichert",
852-
openPublic: "Öffentlich öffnen",
853-
openOrganizer: "Organizer öffnen",
852+
openPublic: "Board öffnen",
853+
openOrganizer: "Event verwalten",
854854
remove: "Entfernen",
855855
},
856856
notFound: {

0 commit comments

Comments
 (0)