diff --git a/.gitignore b/.gitignore index 7f57002d22..85711510b9 100644 --- a/.gitignore +++ b/.gitignore @@ -29,6 +29,10 @@ npm-debug.log* yarn-debug.log* yarn-error.log* .pnpm-debug.log* +.codex-next-dev-*.log + +# local browser automation artifacts +.claude-playwright/ # env files (can opt-in for committing if needed) .env* diff --git a/messages/en.json b/messages/en.json index a3dd25ff20..62c72e6c9f 100644 --- a/messages/en.json +++ b/messages/en.json @@ -15,7 +15,8 @@ "createAccount": "Create account" }, "Sidebar": { - "title": "CRM Template for WhatsApp", + "title": "Decizyon CRM", + "operationalCommand": "Operational command", "dashboard": "Dashboard", "inbox": "Inbox", "notifications": "Notifications", diff --git a/messages/ko.json b/messages/ko.json index 7c54fc939e..b34a89bb99 100644 --- a/messages/ko.json +++ b/messages/ko.json @@ -15,7 +15,8 @@ "createAccount": "계정 만들기" }, "Sidebar": { - "title": "WhatsApp용 CRM 템플릿", + "title": "Decizyon CRM", + "operationalCommand": "운영 커맨드", "dashboard": "대시보드", "inbox": "인박스", "notifications": "알림", diff --git a/public/brand/decizyon-icon.png b/public/brand/decizyon-icon.png new file mode 100644 index 0000000000..3ebda7c660 Binary files /dev/null and b/public/brand/decizyon-icon.png differ diff --git a/public/brand/decizyon-tech-logo.png b/public/brand/decizyon-tech-logo.png new file mode 100644 index 0000000000..07e6644fcc Binary files /dev/null and b/public/brand/decizyon-tech-logo.png differ diff --git a/src/app/(auth)/forgot-password/page.tsx b/src/app/(auth)/forgot-password/page.tsx index d2a1784fb7..82bb6b317c 100644 --- a/src/app/(auth)/forgot-password/page.tsx +++ b/src/app/(auth)/forgot-password/page.tsx @@ -1,6 +1,7 @@ "use client"; import { useState } from "react"; +import Image from "next/image"; import Link from "next/link"; import { createClient } from "@/lib/supabase/client"; import { Button } from "@/components/ui/button"; @@ -13,7 +14,7 @@ import { CardHeader, CardTitle, } from "@/components/ui/card"; -import { MessageSquare, CheckCircle, ArrowLeft } from "lucide-react"; +import { CheckCircle, ArrowLeft } from "lucide-react"; export default function ForgotPasswordPage() { const [email, setEmail] = useState(""); @@ -77,10 +78,16 @@ export default function ForgotPasswordPage() {
-
- +
+ Decizyon
- Reset password + Reset password Enter your email and we'll send you a reset link diff --git a/src/app/(auth)/login/page.tsx b/src/app/(auth)/login/page.tsx index abef3c2d39..cfe4bf12e9 100644 --- a/src/app/(auth)/login/page.tsx +++ b/src/app/(auth)/login/page.tsx @@ -2,6 +2,7 @@ import { Suspense, useState } from "react"; import { useSearchParams } from "next/navigation"; +import Image from "next/image"; import Link from "next/link"; import { useTranslations } from "next-intl"; import { createClient } from "@/lib/supabase/client"; @@ -15,7 +16,7 @@ import { CardHeader, CardTitle, } from "@/components/ui/card"; -import { MessageSquare, UsersRound } from "lucide-react"; +import { UsersRound } from "lucide-react"; // `useSearchParams` opts the component out of static prerendering // unless it sits under a Suspense boundary. We split the form into @@ -78,14 +79,20 @@ function LoginPageInner() {
-
+
{inviteToken ? ( ) : ( - + Decizyon )}
- + {inviteToken ? t('titleAccept') : t('titleWelcome')} diff --git a/src/app/(auth)/signup/page.tsx b/src/app/(auth)/signup/page.tsx index 56985cdb2f..42092d2056 100644 --- a/src/app/(auth)/signup/page.tsx +++ b/src/app/(auth)/signup/page.tsx @@ -1,6 +1,7 @@ "use client"; import { Suspense, useState } from "react"; +import Image from "next/image"; import Link from "next/link"; import { useSearchParams } from "next/navigation"; import { createClient } from "@/lib/supabase/client"; @@ -14,7 +15,7 @@ import { CardHeader, CardTitle, } from "@/components/ui/card"; -import { MessageSquare, CheckCircle, UsersRound } from "lucide-react"; +import { CheckCircle, UsersRound } from "lucide-react"; // `useSearchParams` opts the component out of static prerendering // unless wrapped in Suspense — same pattern as /login. @@ -131,14 +132,20 @@ function SignupPageInner() {
-
+
{inviteToken ? ( ) : ( - + Decizyon )}
- + {inviteToken ? "Create account & join" : "Create account"} diff --git a/src/app/globals.css b/src/app/globals.css index ee8f58dac7..f9e2a007cf 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -88,10 +88,10 @@ :root, html[data-mode="dark"] { - --background: oklch(0.13 0.01 260); - --foreground: oklch(0.985 0 0); - --card: oklch(0.18 0.01 260); - --card-2: oklch(0.205 0.01 260); + --background: #061b22; + --foreground: #f7fafa; + --card: #082a32; + --card-2: #0c3640; --card-foreground: oklch(0.985 0 0); --popover: oklch(0.18 0.01 260); --popover-foreground: oklch(0.985 0 0); @@ -117,10 +117,10 @@ html[data-mode="dark"] { } html[data-mode="light"] { - --background: oklch(0.99 0.002 260); - --foreground: oklch(0.21 0.01 260); - --card: oklch(1 0 0); - --card-2: oklch(0.985 0.002 260); + --background: #f7fafa; + --foreground: #08202e; + --card: #ffffff; + --card-2: #eef5f5; --card-foreground: oklch(0.21 0.01 260); --popover: oklch(1 0 0); --popover-foreground: oklch(0.21 0.01 260); @@ -148,6 +148,19 @@ html[data-mode="light"] { /* ---- ACCENT: primary color ---- */ :root, +html[data-theme="decizyon"] { + --primary: #073b45; + --primary-foreground: #ffffff; + --primary-hover: #0b4f59; + --primary-soft: rgb(7 59 69 / 0.1); + --primary-soft-2: rgb(21 159 153 / 0.16); + --ring: #159f99; + --chart-1: #073b45; + --sidebar-primary: #073b45; + --sidebar-primary-foreground: #ffffff; + --sidebar-ring: #159f99; +} + html[data-theme="violet"] { --primary: oklch(0.526 0.247 293); --primary-foreground: oklch(0.985 0 0); @@ -227,4 +240,4 @@ html[data-theme="rose"] { html { @apply font-sans; } -} \ No newline at end of file +} diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 4a8c05a344..4342edc644 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -22,16 +22,16 @@ const inter = Inter({ export const metadata: Metadata = { title: { - default: "wacrm", - template: "%s — wacrm", + default: "Decizyon CRM", + template: "%s | Decizyon CRM", }, - description: "Self-hostable CRM template for WhatsApp.", + description: "CRM operacional para WhatsApp com identidade Decizyon.", robots: { index: false, follow: false, }, icons: { - icon: [{ url: "/icon" }], + icon: [{ url: "/brand/decizyon-icon.png" }], }, formatDetection: { email: false, diff --git a/src/components/layout/header.tsx b/src/components/layout/header.tsx index 18ac0b161f..99ac06a32c 100644 --- a/src/components/layout/header.tsx +++ b/src/components/layout/header.tsx @@ -68,9 +68,14 @@ export function Header({ onOpenSidebar }: HeaderProps) { > -

- {t(titleKey as string)} -

+
+

+ Decizyon CRM +

+

+ {t(titleKey as string)} +

+
diff --git a/src/components/layout/sidebar.tsx b/src/components/layout/sidebar.tsx index 5db7488056..f0ceeec574 100644 --- a/src/components/layout/sidebar.tsx +++ b/src/components/layout/sidebar.tsx @@ -1,6 +1,7 @@ "use client"; import Link from "next/link"; +import Image from "next/image"; import { usePathname } from "next/navigation"; import { useEffect } from "react"; import { cn } from "@/lib/utils"; @@ -188,12 +189,23 @@ export function Sidebar({ open = false, onClose }: SidebarProps) { close button is hidden since the sidebar is always-visible. */}
-
- +
+ +
+
+

+ Decizyon CRM +

+

+ {t("operationalCommand")} +

- - {t("title")} -