From ca50b94e4e71fbc85410bdce17815dbb7b562bee Mon Sep 17 00:00:00 2001 From: josh Date: Thu, 29 Jan 2026 06:32:05 +0000 Subject: [PATCH 1/3] fix: design system cleanup - replace old orange accent (#FF6B00) with gold (#d4b08c) - convert gray-* colors to white/* opacity variants - fix vault modal from light to dark theme - update ui components to match dark design system --- apps/web/app/[locale]/[code]/page.tsx | 18 +++--- apps/web/app/[locale]/share/page.tsx | 34 +++++----- apps/web/app/[locale]/vault/vault/modal.tsx | 50 +++++++-------- .../web/app/[locale]/vault/vault/password.tsx | 2 +- apps/web/app/[locale]/vault/vault/tags.tsx | 63 +++++++++++++++++++ apps/web/components/beams.tsx | 8 +-- apps/web/components/command.tsx | 2 +- apps/web/components/generator.tsx | 4 +- apps/web/components/icons.tsx | 6 +- apps/web/components/import.tsx | 4 +- apps/web/components/language.tsx | 2 +- apps/web/components/share.tsx | 16 ++--- apps/web/components/tags.tsx | 4 +- apps/web/components/totp.tsx | 4 +- apps/web/components/ui/button.tsx | 6 +- apps/web/components/ui/card.tsx | 10 +-- apps/web/components/ui/checkbox.tsx | 4 +- apps/web/components/ui/input.tsx | 2 +- apps/web/components/ui/modal.tsx | 4 +- apps/web/components/ui/select.tsx | 2 +- apps/web/components/ui/textarea.tsx | 2 +- apps/web/components/ui/toggle.tsx | 4 +- 22 files changed, 157 insertions(+), 94 deletions(-) diff --git a/apps/web/app/[locale]/[code]/page.tsx b/apps/web/app/[locale]/[code]/page.tsx index 8e8ab0d..b660366 100644 --- a/apps/web/app/[locale]/[code]/page.tsx +++ b/apps/web/app/[locale]/[code]/page.tsx @@ -134,7 +134,7 @@ export default function ClaimPage({ const highlighted = secret?.type === "text" ? highlight(secret.value) : null; return ( -
+
-

+

{titles(status)}

placeholder

@@ -177,7 +177,7 @@ export default function ClaimPage({ @@ -207,7 +207,7 @@ export default function ClaimPage({
{t("create")} @@ -226,7 +226,7 @@ export default function ClaimPage({ {secret.label && ( <>

{t("label")}

-

{secret.label}

+

{secret.label}

)}
@@ -270,7 +270,7 @@ export default function ClaimPage({ @@ -279,13 +279,13 @@ export default function ClaimPage({ <>

{t("filename")}

-

{secret.filename}

+

{secret.filename}

@@ -293,7 +293,7 @@ export default function ClaimPage({ ) : null} {secret && secret.remaining > 0 && ( -

+

{secret.remaining} {t("remaining")}

)} diff --git a/apps/web/app/[locale]/share/page.tsx b/apps/web/app/[locale]/share/page.tsx index 8d4cf6c..2aec2e2 100644 --- a/apps/web/app/[locale]/share/page.tsx +++ b/apps/web/app/[locale]/share/page.tsx @@ -119,7 +119,7 @@ export default function SharePage() { const canSubmit = mode === "text" ? !!secret : !!file; return ( -
+
-

+

{t("title")}

{t("subtitle")}

@@ -152,7 +152,7 @@ export default function SharePage() { onClick={() => setMode("text")} className={`px-4 py-2 text-xs tracking-widest transition-colors border ${ mode === "text" - ? "bg-[#FF6B00] text-black border-[#FF6B00]" + ? "bg-[#d4b08c] text-black border-[#d4b08c]" : "border-white/10 text-white/40 hover:text-white hover:border-white/30" }`} > @@ -163,7 +163,7 @@ export default function SharePage() { onClick={() => setMode("file")} className={`px-4 py-2 text-xs tracking-widest transition-colors border ${ mode === "file" - ? "bg-[#FF6B00] text-black border-[#FF6B00]" + ? "bg-[#d4b08c] text-black border-[#d4b08c]" : "border-white/10 text-white/40 hover:text-white hover:border-white/30" }`} > @@ -180,7 +180,7 @@ export default function SharePage() { value={label} onChange={(e) => setLabel(e.target.value)} placeholder={t("labelPlaceholder")} - className="w-full bg-transparent border border-white/10 px-4 py-3 text-white placeholder:text-white/20 focus:outline-none focus:border-[#FF6B00] transition-colors font-mono text-sm" + className="w-full bg-transparent border border-white/10 px-4 py-3 text-white placeholder:text-white/20 focus:outline-none focus:border-[#d4b08c] transition-colors font-mono text-sm" />
@@ -194,7 +194,7 @@ export default function SharePage() { value={secret} onChange={(e) => setSecret(e.target.value)} placeholder={t("secretPlaceholder")} - className="w-full h-full bg-transparent border border-white/10 px-4 py-3 text-white placeholder:text-white/20 focus:outline-none focus:border-[#FF6B00] transition-colors resize-none font-mono text-sm" + className="w-full h-full bg-transparent border border-white/10 px-4 py-3 text-white placeholder:text-white/20 focus:outline-none focus:border-[#d4b08c] transition-colors resize-none font-mono text-sm" /> ) : (
@@ -221,7 +221,7 @@ export default function SharePage() { />
{file ? ( -

{file.name}

+

{file.name}

) : ( <>

{t("dropzone")}

@@ -247,7 +247,7 @@ export default function SharePage() { onClick={() => setViews(n)} className={`flex-1 h-9 text-sm transition-colors ${ views === n - ? "bg-[#FF6B00] text-black" + ? "bg-[#d4b08c] text-black" : "border border-white/10 text-white/40 hover:text-white hover:border-white/30" }`} > @@ -268,7 +268,7 @@ export default function SharePage() { onClick={() => setTtl(v)} className={`flex-1 h-9 text-sm transition-colors ${ ttl === v - ? "bg-[#FF6B00] text-black" + ? "bg-[#d4b08c] text-black" : "border border-white/10 text-white/40 hover:text-white hover:border-white/30" }`} > @@ -281,15 +281,15 @@ export default function SharePage() {
  • - + {t("security.encrypted")}
  • - + {t("security.server")}
  • - + {t("security.destruct")}
@@ -297,7 +297,7 @@ export default function SharePage() { @@ -311,7 +311,7 @@ export default function SharePage() { }} >
-

{t("success")}

+

{t("success")}

@@ -333,7 +333,7 @@ export default function SharePage() { diff --git a/apps/web/app/[locale]/vault/vault/modal.tsx b/apps/web/app/[locale]/vault/vault/modal.tsx index 8f98249..a97878c 100644 --- a/apps/web/app/[locale]/vault/vault/modal.tsx +++ b/apps/web/app/[locale]/vault/vault/modal.tsx @@ -5,8 +5,8 @@ import type { ItemType } from "@/lib/generated/prisma/enums"; import type { VaultItem } from "./store"; import { fieldConfigs } from "./fields"; import { typeIcons, typeIconsLarge, typeLabels, typeColors } from "./icons"; -import { PasswordFieldLight } from "./password"; -import { TagInputLight } from "./tags"; +import { PasswordField } from "./password"; +import { TagInput } from "./tags"; interface Props { item?: VaultItem | null; @@ -83,11 +83,11 @@ export function ItemModal({ item, defaulttype, onSave, onDelete, onRestore, onCl } function renderField(field: (typeof fields)[0]) { - const inputClass = "w-full bg-white border border-stone-200 rounded-xl px-4 py-3 text-base text-stone-900 placeholder:text-stone-400 focus:outline-none focus:ring-2 focus:ring-orange-500/40 focus:border-orange-500 transition-all read-only:bg-stone-50 read-only:text-stone-500"; + const inputClass = "w-full bg-white/5 border border-white/10 rounded-xl px-4 py-3 text-base text-white placeholder:text-white/40 focus:outline-none focus:ring-2 focus:ring-[#d4b08c]/40 focus:border-[#d4b08c] transition-all read-only:bg-white/[0.02] read-only:text-white/50"; return (
- + {field.type === "textarea" ? (