From 276fbad45e0d2f5fd5b8fdd5c1de62e203bdfdf5 Mon Sep 17 00:00:00 2001 From: Dmytro Stanchiev Date: Tue, 21 Apr 2026 20:24:04 -0400 Subject: [PATCH] chore: legacy cleanup Signed-off-by: Dmytro Stanchiev --- src/app/auth/error/page.tsx | 6 +- src/app/auth/signin/sign-in-form.tsx | 10 ++- src/app/auth/signout/page.tsx | 6 +- src/app/globals.css | 93 ------------------------ src/app/layout.tsx | 7 +- src/app/manifest.ts | 6 +- src/components/drag-drop-container.tsx | 2 +- src/components/location-autocomplete.tsx | 4 +- src/components/settings-panel.tsx | 10 +-- tests/legacy-design-migration.test.ts | 68 +++++++++++++++++ 10 files changed, 95 insertions(+), 117 deletions(-) create mode 100644 tests/legacy-design-migration.test.ts diff --git a/src/app/auth/error/page.tsx b/src/app/auth/error/page.tsx index a779658..a9a04d7 100644 --- a/src/app/auth/error/page.tsx +++ b/src/app/auth/error/page.tsx @@ -24,8 +24,8 @@ function ErrorMessage() { export default function AuthErrorPage() { return ( -
-
+
+

Authentication Error

@@ -39,7 +39,7 @@ export default function AuthErrorPage() {
diff --git a/src/app/auth/signin/sign-in-form.tsx b/src/app/auth/signin/sign-in-form.tsx index f5c3f89..36bb041 100644 --- a/src/app/auth/signin/sign-in-form.tsx +++ b/src/app/auth/signin/sign-in-form.tsx @@ -144,16 +144,18 @@ export function SignInForm({ providers }: SignInFormProps) { initial={{ opacity: 0, y: 16 }} animate={{ opacity: 1, y: 0 }} transition={{ duration: 0.3 }} - className="glass-strong p-8 max-w-sm w-full" + className="w-full max-w-sm rounded-[10px] bg-card p-8 shadow-[0_0_0_1px_rgba(0,0,0,0.08),0_12px_40px_rgba(0,0,0,0.12)]" > {/* Header */}

- Sign in to unlock AI-powered event creation + Sign in to keep AI capture and your event timeline in sync

{/* Provider buttons */} @@ -193,7 +195,7 @@ export function SignInForm({ providers }: SignInFormProps) { )} {/* Divider + guest link */} -
+
-
+
+

Sign Out

@@ -37,7 +37,7 @@ export default function SignOutPage() {

-
+
Signed in as
diff --git a/src/app/globals.css b/src/app/globals.css index 1a2958b..ab9f289 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -227,99 +227,6 @@ } @layer utilities { - .glass-surface { - background: linear-gradient( - 180deg, - oklch(1 0 0 / 0.78), - oklch(0.985 0.003 247 / 0.92) - ); - border: 1px solid oklch(0.89 0.005 247 / 0.95); - border-radius: calc(var(--radius) + 0.5rem); - box-shadow: 0 10px 30px oklch(0.3 0.01 260 / 0.08); - backdrop-filter: blur(18px) saturate(1.08); - } - .dark .glass-surface { - background: linear-gradient( - 180deg, - oklch(0.23 0.015 265 / 0.72), - oklch(0.18 0.012 265 / 0.88) - ); - border-color: oklch(1 0 0 / 0.09); - box-shadow: 0 18px 40px oklch(0 0 0 / 0.35); - } - .glass-panel { - background: linear-gradient( - 180deg, - oklch(1 0 0 / 0.84), - oklch(0.992 0.002 247 / 0.96) - ); - border: 1px solid oklch(0.89 0.005 247 / 0.95); - border-radius: calc(var(--radius) + 0.75rem); - box-shadow: 0 14px 36px oklch(0.3 0.01 260 / 0.08); - backdrop-filter: blur(20px) saturate(1.08); - } - .dark .glass-panel { - background: linear-gradient( - 180deg, - oklch(0.22 0.014 265 / 0.78), - oklch(0.17 0.012 265 / 0.9) - ); - border-color: oklch(1 0 0 / 0.1); - box-shadow: 0 22px 48px oklch(0 0 0 / 0.36); - } - .glass-subtle { - background: oklch(0.98 0.003 247 / 0.72); - border: 1px solid oklch(0.9 0.004 247 / 0.95); - border-radius: calc(var(--radius) + 0.5rem); - backdrop-filter: blur(14px); - } - .dark .glass-subtle { - background: oklch(0.25 0.012 265 / 0.42); - border-color: oklch(1 0 0 / 0.08); - } - /* Light: subtle card with border; Dark: glass panel */ - .glass { - background: oklch(1 0 0 / 0.7); - border: 1px solid oklch(0.87 0.005 247); - border-radius: var(--radius); - } - .dark .glass { - background: oklch(1 0 0 / 0.04); - border-color: oklch(1 0 0 / 0.07); - backdrop-filter: blur(12px); - } - .glass-card { - background: linear-gradient( - 180deg, - oklch(1 0 0 / 0.72), - oklch(0.99 0.002 247 / 0.94) - ); - border: 1px solid oklch(0.9 0.005 247 / 0.95); - border-radius: calc(var(--radius) + 0.25rem); - box-shadow: 0 8px 20px oklch(0.3 0.01 260 / 0.06); - backdrop-filter: blur(16px) saturate(1.06); - } - .dark .glass-card { - background: linear-gradient( - 180deg, - oklch(0.24 0.015 265 / 0.52), - oklch(0.18 0.012 265 / 0.72) - ); - border-color: oklch(1 0 0 / 0.08); - box-shadow: 0 14px 32px oklch(0 0 0 / 0.26); - } - .glass-strong { - background: oklch(0.995 0.001 247 / 0.97); - border: 1px solid oklch(0.88 0.006 247); - border-radius: var(--radius); - box-shadow: 0 2px 8px oklch(0.3 0.01 260 / 0.08); - } - .dark .glass-strong { - backdrop-filter: blur(20px) saturate(1.2); - background: oklch(1 0 0 / 0.07); - border-color: oklch(1 0 0 / 0.1); - box-shadow: 0 4px 20px oklch(0 0 0 / 0.3); - } } @utility scrollbar-none { diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 7728a8a..05b7e3c 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -16,8 +16,8 @@ const geistMono = Geist_Mono({ }); export const metadata: Metadata = { - title: "Local iCal", - description: "Local iCal editor for calendar events", + title: "Local Calendar", + description: "Event timeline console with AI capture", creator: "Dmytro Stanchiev", }; @@ -43,7 +43,8 @@ export default function RootLayout({ closeButton richColors toastOptions={{ - className: "glass-strong", + className: + "rounded-[10px] bg-card text-card-foreground shadow-[0_0_0_1px_rgba(0,0,0,0.08),0_12px_40px_rgba(0,0,0,0.12)]", }} /> diff --git a/src/app/manifest.ts b/src/app/manifest.ts index a4d95bf..cf8de0d 100644 --- a/src/app/manifest.ts +++ b/src/app/manifest.ts @@ -2,9 +2,9 @@ import type { MetadataRoute } from "next"; export default function manifest(): MetadataRoute.Manifest { return { - name: "local-ical PWA", - short_name: "local-ical", - description: "Local iCal editor with AI features", + name: "Local Calendar", + short_name: "local-cal", + description: "Event timeline console with AI capture", start_url: "/", display: "standalone", background_color: "#ffffff", diff --git a/src/components/drag-drop-container.tsx b/src/components/drag-drop-container.tsx index db1d2da..d8397a8 100644 --- a/src/components/drag-drop-container.tsx +++ b/src/components/drag-drop-container.tsx @@ -70,7 +70,7 @@ export const DragDropContainer = ({ animate={{ opacity: 1 }} exit={{ opacity: 0 }} transition={{ duration: 0.15 }} - className="absolute inset-0 z-40 rounded-xl border-2 border-dashed border-primary/50 bg-primary/5 backdrop-blur-sm flex items-center justify-center" + className="absolute inset-0 z-40 flex items-center justify-center rounded-[10px] border-2 border-dashed border-primary/40 bg-background/92" >
diff --git a/src/components/location-autocomplete.tsx b/src/components/location-autocomplete.tsx index ce0bf04..d2b07e3 100644 --- a/src/components/location-autocomplete.tsx +++ b/src/components/location-autocomplete.tsx @@ -189,7 +189,7 @@ const ServerLocationInput = ({ value={value} /> {showSuggestions ? ( -
+
{suggestions.map((suggestion) => { const suggestionKey = @@ -198,7 +198,7 @@ const ServerLocationInput = ({ return (
-
+
Direct create preference
@@ -161,7 +161,7 @@ export function SettingsPanel({ : `${valuePrefix}: off`}
-
+
AI integrations
diff --git a/tests/legacy-design-migration.test.ts b/tests/legacy-design-migration.test.ts new file mode 100644 index 0000000..f64372b --- /dev/null +++ b/tests/legacy-design-migration.test.ts @@ -0,0 +1,68 @@ +import { describe, expect, test } from "bun:test"; +import { readFileSync } from "node:fs"; + +const read = (path: string) => readFileSync(path, "utf8"); + +describe("legacy design migration", () => { + test("global styles remove obsolete glass helpers once console surfaces take over", () => { + const source = read("src/app/globals.css"); + + expect(source).not.toContain(".glass-surface"); + expect(source).not.toContain(".glass-panel"); + expect(source).not.toContain(".glass-subtle"); + expect(source).not.toContain(".glass-card"); + expect(source).not.toContain(".glass-strong"); + }); + + test("layout metadata and toast surface use redesign language", () => { + const layout = read("src/app/layout.tsx"); + const manifest = read("src/app/manifest.ts"); + + expect(layout).not.toContain("Local iCal"); + expect(layout).not.toContain("editor for calendar events"); + expect(layout).not.toContain("glass-strong"); + expect(manifest).not.toContain("local-ical"); + expect(manifest).not.toContain("Local iCal editor"); + }); + + test("auth screens use console surfaces instead of old glass cards", () => { + const signIn = read("src/app/auth/signin/sign-in-form.tsx"); + const signOut = read("src/app/auth/signout/page.tsx"); + const errorPage = read("src/app/auth/error/page.tsx"); + + expect(signIn).not.toContain("glass-strong"); + expect(signOut).not.toContain("glass-strong"); + expect(errorPage).not.toContain("glass-strong"); + expect(signIn).not.toContain("rounded-2xl"); + expect(signOut).not.toContain("rounded-2xl"); + expect(errorPage).not.toContain("rounded-2xl"); + }); + + test("auth and app copy use timeline-first language", () => { + const signIn = read("src/app/auth/signin/sign-in-form.tsx"); + const errorPage = read("src/app/auth/error/page.tsx"); + const settings = read("src/components/settings-panel.tsx"); + + expect(signIn).not.toContain("Local iCal"); + expect(signIn).not.toContain("event creation"); + expect(errorPage).not.toContain("Homepage"); + expect(settings).not.toContain("review modal"); + }); + + test("overlay surfaces use console framing instead of blur-heavy legacy treatments", () => { + const autocomplete = read("src/components/location-autocomplete.tsx"); + const dragDrop = read("src/components/drag-drop-container.tsx"); + + expect(autocomplete).not.toContain("backdrop-blur-sm"); + expect(autocomplete).toContain("rounded-[10px]"); + expect(dragDrop).not.toContain("rounded-xl"); + expect(dragDrop).not.toContain("backdrop-blur-sm"); + expect(dragDrop).toContain("rounded-[10px]"); + }); + + test("settings internal rows drop the old bordered mini-card treatment", () => { + const settings = read("src/components/settings-panel.tsx"); + + expect(settings).not.toContain("rounded-xl border border-border/60 bg-muted/35"); + }); +});