From 499a38ce1bec108cab97526db9d036de0ee8551f Mon Sep 17 00:00:00 2001 From: Ajax Davis Date: Fri, 16 Jan 2026 06:49:47 +1000 Subject: [PATCH] refactor: apply style guide compliance across auth, dashboard, and tool pages - Replace hardcoded color classes with design system tokens (error, success, warning, info) - Replace raw HTML inputs with Input component from @tpmjs/ui - Replace raw HTML buttons with Button component - Add eye/eyeOff icons for password visibility toggle - Add mail icon for verify-email page - Fix text colors to use semantic tokens (text-error, text-success, text-warning) - Fix background colors to use opacity tokens (bg-error/10, bg-success/10) - All pages now properly support dark mode through CSS custom properties --- .../src/app/(auth)/forgot-password/page.tsx | 16 ++-- apps/web/src/app/(auth)/sign-in/page.tsx | 62 +++----------- apps/web/src/app/(auth)/sign-up/page.tsx | 80 +++++-------------- apps/web/src/app/(auth)/verify-email/page.tsx | 15 +--- .../app/dashboard/settings/api-keys/page.tsx | 22 ++--- .../app/dashboard/settings/profile/page.tsx | 30 +++---- .../app/tool/[...slug]/ToolDetailClient.tsx | 25 +++--- apps/web/src/app/tool/broken/page.tsx | 12 +-- apps/web/src/app/tool/tool-search/page.tsx | 2 +- packages/ui/src/Icon/icons.ts | 12 +++ 10 files changed, 102 insertions(+), 174 deletions(-) diff --git a/apps/web/src/app/(auth)/forgot-password/page.tsx b/apps/web/src/app/(auth)/forgot-password/page.tsx index 84e5977..56b6bd7 100644 --- a/apps/web/src/app/(auth)/forgot-password/page.tsx +++ b/apps/web/src/app/(auth)/forgot-password/page.tsx @@ -1,5 +1,7 @@ 'use client'; +import { Button } from '@tpmjs/ui/Button/Button'; +import { Input } from '@tpmjs/ui/Input/Input'; import Link from 'next/link'; import { useState } from 'react'; @@ -54,7 +56,7 @@ export default function ForgotPasswordPage() {

-
+
Check your inbox and click the link to reset your password. The link will expire in 1 hour.
@@ -93,7 +95,7 @@ export default function ForgotPasswordPage() {
{error && ( -
+
{error}
)} @@ -102,24 +104,24 @@ export default function ForgotPasswordPage() { - setEmail(e.target.value)} required - className="w-full px-3 py-2 border border-border rounded-md bg-background text-foreground focus:outline-none focus:ring-2 focus:ring-foreground focus:border-transparent" placeholder="you@example.com" />
- +

diff --git a/apps/web/src/app/(auth)/sign-in/page.tsx b/apps/web/src/app/(auth)/sign-in/page.tsx index d23dc99..90ecfce 100644 --- a/apps/web/src/app/(auth)/sign-in/page.tsx +++ b/apps/web/src/app/(auth)/sign-in/page.tsx @@ -1,47 +1,11 @@ 'use client'; -import { signIn } from '@/lib/auth-client'; +import { Button } from '@tpmjs/ui/Button/Button'; +import { Icon } from '@tpmjs/ui/Icon/Icon'; +import { Input } from '@tpmjs/ui/Input/Input'; import Link from 'next/link'; import { useState } from 'react'; - -function EyeIcon({ className }: { className?: string }) { - return ( - - - - - ); -} - -function EyeOffIcon({ className }: { className?: string }) { - return ( - - - - ); -} +import { signIn } from '~/lib/auth-client'; export default function SignInPage() { const [email, setEmail] = useState(''); @@ -107,7 +71,7 @@ export default function SignInPage() {

{error && ( -
+
{error}
)} @@ -116,13 +80,12 @@ export default function SignInPage() { - setEmail(e.target.value)} required - className="w-full px-3 py-2 border border-border rounded-md bg-background text-foreground focus:outline-none focus:ring-2 focus:ring-foreground focus:border-transparent" placeholder="you@example.com" />
@@ -140,14 +103,14 @@ export default function SignInPage() {
- setPassword(e.target.value)} required - className="w-full px-3 py-2 pr-10 border border-border rounded-md bg-background text-foreground focus:outline-none focus:ring-2 focus:ring-foreground focus:border-transparent" placeholder="Enter your password" + className="pr-10" />
- +

diff --git a/apps/web/src/app/(auth)/sign-up/page.tsx b/apps/web/src/app/(auth)/sign-up/page.tsx index e050dc2..025da46 100644 --- a/apps/web/src/app/(auth)/sign-up/page.tsx +++ b/apps/web/src/app/(auth)/sign-up/page.tsx @@ -1,9 +1,12 @@ 'use client'; -import { signUp } from '@/lib/auth-client'; +import { Button } from '@tpmjs/ui/Button/Button'; +import { Icon } from '@tpmjs/ui/Icon/Icon'; +import { Input } from '@tpmjs/ui/Input/Input'; import { suggestUsername } from '@tpmjs/types/user'; import Link from 'next/link'; import { useCallback, useEffect, useState } from 'react'; +import { signUp } from '~/lib/auth-client'; interface UsernameCheckResult { available: boolean; @@ -173,7 +176,7 @@ export default function SignUpPage() {

{error && ( -
+
{error}
)} @@ -182,13 +185,12 @@ export default function SignUpPage() { - setName(e.target.value)} required - className="w-full px-3 py-2 border border-border rounded-md bg-background text-foreground focus:outline-none focus:ring-2 focus:ring-foreground focus:border-transparent" placeholder="Your name" />
@@ -201,7 +203,7 @@ export default function SignUpPage() {
@
- {/* Status indicator */}
{checkingUsername && ( - - - - + )} {!checkingUsername && usernameCheck?.available && ( - - - + )} {!checkingUsername && usernameCheck && !usernameCheck.available && username.length >= 3 && ( - - - + )}
{/* Username availability message */} {username.length >= 3 && usernameCheck && !usernameCheck.available && ( -

{usernameCheck.reason}

+

{usernameCheck.reason}

)} {username.length >= 3 && usernameCheck?.available && ( -

Username available

+

Username available

)} {username && (

@@ -289,13 +248,12 @@ export default function SignUpPage() { - setEmail(e.target.value)} required - className="w-full px-3 py-2 border border-border rounded-md bg-background text-foreground focus:outline-none focus:ring-2 focus:ring-foreground focus:border-transparent" placeholder="you@example.com" /> @@ -304,25 +262,25 @@ export default function SignUpPage() { - setPassword(e.target.value)} required minLength={8} - className="w-full px-3 py-2 border border-border rounded-md bg-background text-foreground focus:outline-none focus:ring-2 focus:ring-foreground focus:border-transparent" placeholder="At least 8 characters" /> - +

diff --git a/apps/web/src/app/(auth)/verify-email/page.tsx b/apps/web/src/app/(auth)/verify-email/page.tsx index 828607a..5de27de 100644 --- a/apps/web/src/app/(auth)/verify-email/page.tsx +++ b/apps/web/src/app/(auth)/verify-email/page.tsx @@ -1,22 +1,11 @@ +import { Icon } from '@tpmjs/ui/Icon/Icon'; import Link from 'next/link'; export default function VerifyEmailPage() { return (

- - - +
diff --git a/apps/web/src/app/dashboard/settings/api-keys/page.tsx b/apps/web/src/app/dashboard/settings/api-keys/page.tsx index ed245ee..cef13c2 100644 --- a/apps/web/src/app/dashboard/settings/api-keys/page.tsx +++ b/apps/web/src/app/dashboard/settings/api-keys/page.tsx @@ -2,6 +2,8 @@ import { Button } from '@tpmjs/ui/Button/Button'; import { Icon } from '@tpmjs/ui/Icon/Icon'; +import { Input } from '@tpmjs/ui/Input/Input'; +import { Textarea } from '@tpmjs/ui/Textarea/Textarea'; import { Table, TableBody, @@ -176,9 +178,9 @@ export default function ApiKeysPage(): React.ReactElement { } > {/* Info banner */} -
+
- +

These are your AI service credentials @@ -195,14 +197,14 @@ export default function ApiKeysPage(): React.ReactElement { {showImport && (

Import from .env

-