From d337d5efde9b9a1a4bd604e60ae600407aa88122 Mon Sep 17 00:00:00 2001 From: "Mr. Guy" Date: Tue, 10 Mar 2026 00:46:59 -0400 Subject: [PATCH 1/7] Update frontend/tailwind.config.js --- frontend/tailwind.config.js | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/frontend/tailwind.config.js b/frontend/tailwind.config.js index 03a8160..f2efb98 100644 --- a/frontend/tailwind.config.js +++ b/frontend/tailwind.config.js @@ -25,7 +25,35 @@ export default { light: '#34d399', dark: '#059669', } - } + }, + boxShadow: { + 'glow': '0 0 20px rgba(14, 165, 233, 0.3)', + 'glow-lg': '0 0 30px rgba(14, 165, 233, 0.4)', + 'glow-agent': '0 0 20px rgba(16, 185, 129, 0.3)', + 'glow-lg-agent': '0 0 30px rgba(16, 185, 129, 0.4)', + 'soft': '0 2px 15px -3px rgba(0, 0, 0, 0.07), 0 10px 20px -2px rgba(0, 0, 0, 0.04)', + 'card': '0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)', + 'card-hover': '0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)', + }, + animation: { + 'pulse-slow': 'pulse 3s cubic-bezier(0.4, 0, 0.6, 1) infinite', + 'float': 'float 3s ease-in-out infinite', + 'shine': 'shine 2s linear infinite', + }, + keyframes: { + float: { + '0%, 100%': { transform: 'translateY(0)' }, + '50%': { transform: 'translateY(-5px)' }, + }, + shine: { + '0%': { backgroundPosition: '200% center' }, + '100%': { backgroundPosition: '-200% center' }, + }, + }, + backgroundImage: { + 'gradient-radial': 'radial-gradient(var(--tw-gradient-stops))', + 'gradient-conic': 'conic-gradient(from 180deg at 50% 50%, var(--tw-gradient-stops))', + }, }, }, plugins: [], From dbe7853f7239afeebe7c8dd93e4cde96289fa9da Mon Sep 17 00:00:00 2001 From: "Mr. Guy" Date: Tue, 10 Mar 2026 00:46:59 -0400 Subject: [PATCH 2/7] Update frontend/src/index.css --- frontend/src/index.css | 68 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/frontend/src/index.css b/frontend/src/index.css index d534b6d..9eb8e82 100644 --- a/frontend/src/index.css +++ b/frontend/src/index.css @@ -16,6 +16,19 @@ html.light body { @apply bg-gray-100 text-gray-900; } + + /* Smooth focus transitions */ + *:focus { + @apply outline-none transition-all duration-200; + } + + *:focus-visible { + @apply ring-2 ring-claw-500 ring-offset-2 ring-offset-gray-900; + } + + html.light *:focus-visible { + @apply ring-offset-gray-100; + } } @layer utilities { @@ -54,6 +67,33 @@ background: rgba(0, 0, 0, 0.3); } + /* Glassmorphism utilities */ + .glass { + @apply backdrop-blur-md bg-white/10 border border-white/20; + } + + .glass-dark { + @apply backdrop-blur-md bg-gray-900/50 border border-gray-700/50; + } + + /* Gradient text */ + .text-gradient { + @apply bg-clip-text text-transparent bg-gradient-to-r from-claw-400 to-claw-600; + } + + .text-gradient-agent { + @apply bg-clip-text text-transparent bg-gradient-to-r from-agent-light to-agent; + } + + /* Gradient backgrounds */ + .bg-gradient-claw { + @apply bg-gradient-to-r from-claw-500 to-claw-600; + } + + .bg-gradient-agent { + @apply bg-gradient-to-r from-agent-light to-agent; + } + /* Toast animation */ @keyframes slideIn { from { @@ -122,6 +162,34 @@ border-radius: 8px; } + /* Button glow effect */ + .btn-glow { + @apply relative overflow-hidden; + } + + .btn-glow::before { + content: ''; + @apply absolute inset-0 bg-gradient-to-r from-transparent via-white/20 to-transparent -translate-x-full; + } + + .btn-glow:hover::before { + @apply animate-shine; + } + + /* Smooth transitions for interactive elements */ + .transition-smooth { + @apply transition-all duration-200 ease-out; + } + + /* Hover scale effect */ + .hover-scale { + @apply transition-transform duration-200; + } + + .hover-scale:hover { + @apply scale-105; + } + /* Markdown content styles */ .markdown-content p { margin-bottom: 0.5em; From 636f38159a5f7b923792136d3ca4f3943ab00ca2 Mon Sep 17 00:00:00 2001 From: "Mr. Guy" Date: Tue, 10 Mar 2026 00:47:00 -0400 Subject: [PATCH 3/7] Update frontend/src/components/Login.jsx --- frontend/src/components/Login.jsx | 210 +++++++++++++++++------------- 1 file changed, 121 insertions(+), 89 deletions(-) diff --git a/frontend/src/components/Login.jsx b/frontend/src/components/Login.jsx index b4ea955..9a0a232 100644 --- a/frontend/src/components/Login.jsx +++ b/frontend/src/components/Login.jsx @@ -56,30 +56,40 @@ export default function Login({ onLogin }) {
-
+ {/* Background decoration */} +
+
+
+
+ +
{/* Theme Toggle - Top Right */}
-
+
-

ClawChat 🤖

+

+ ClawChat 🤖 +

Chat platform built for OpenClaw agents

-

- {mode === 'login' ? 'Sign In' : 'Create Account'} -

+
+

+ {mode === 'login' ? 'Sign In' : 'Create Account'} +

- {mode === 'register' && ( -
- - -
- )} + {mode === 'register' && ( +
+ + +
+ )} - {error && ( -
- {error} -
- )} - -
-
- - setFormData({ ...formData, username: e.target.value })} - className={`w-full px-4 py-3 border rounded-lg focus:outline-none focus:ring-2 focus:ring-claw-500 ${ - isDark - ? 'bg-gray-800 border-gray-700 text-white placeholder-gray-500' - : 'bg-white border-gray-300 text-gray-900 placeholder-gray-400' - }`} - placeholder="Enter username" - required - /> -
+ {error && ( +
+ {error} +
+ )} - {formData.type === 'agent' && mode === 'login' && ( +
- + setFormData({ ...formData, agentKey: e.target.value })} - className={`w-full px-4 py-3 border rounded-lg focus:outline-none focus:ring-2 focus:ring-agent ${ + value={formData.username} + onChange={(e) => setFormData({ ...formData, username: e.target.value })} + className={`w-full px-4 py-3 border rounded-xl focus:outline-none focus:ring-2 focus:ring-claw-500 focus:border-transparent transition-all ${ isDark - ? 'bg-gray-800 border-gray-700 text-white placeholder-gray-500' - : 'bg-white border-gray-300 text-gray-900 placeholder-gray-400' + ? 'bg-gray-700/50 border-gray-600 text-white placeholder-gray-500 focus:bg-gray-700' + : 'bg-gray-50 border-gray-300 text-gray-900 placeholder-gray-400 focus:bg-white' }`} - placeholder="Enter agent key" + placeholder="Enter username" + required />
- )} - -
+ {formData.type === 'agent' && mode === 'login' && ( +
+ + setFormData({ ...formData, agentKey: e.target.value })} + className={`w-full px-4 py-3 border rounded-xl focus:outline-none focus:ring-2 focus:ring-agent focus:border-transparent transition-all ${ + isDark + ? 'bg-gray-700/50 border-gray-600 text-white placeholder-gray-500 focus:bg-gray-700' + : 'bg-gray-50 border-gray-300 text-gray-900 placeholder-gray-400 focus:bg-white' + }`} + placeholder="Enter agent key" + /> +
+ )} + + + +
); From 1c18b652ec849cd5318642db6bc5617839771691 Mon Sep 17 00:00:00 2001 From: "Mr. Guy" Date: Tue, 10 Mar 2026 00:47:00 -0400 Subject: [PATCH 4/7] Update frontend/src/components/Sidebar.jsx --- frontend/src/components/Sidebar.jsx | 96 ++++++++++++++++------------- 1 file changed, 52 insertions(+), 44 deletions(-) diff --git a/frontend/src/components/Sidebar.jsx b/frontend/src/components/Sidebar.jsx index 9c15695..13e2749 100644 --- a/frontend/src/components/Sidebar.jsx +++ b/frontend/src/components/Sidebar.jsx @@ -27,16 +27,16 @@ export default function Sidebar({ channels, users, currentChannel, onChannelSele return ( <>
+ isDark ? 'bg-gray-800/95' : 'bg-white/95 border-r border-gray-200' + } backdrop-blur-sm`}> {/* Header */} -
-
-
- +
+
+
+
-

ClawChat

+

ClawChat

{onlineUsers.length} online

@@ -50,9 +50,10 @@ export default function Sidebar({ channels, users, currentChannel, onChannelSele }`}>Channels @@ -67,22 +68,22 @@ export default function Sidebar({ channels, users, currentChannel, onChannelSele From c96413e76423137495a1737ce7ebf8516787cfe9 Mon Sep 17 00:00:00 2001 From: "Mr. Guy" Date: Tue, 10 Mar 2026 00:47:01 -0400 Subject: [PATCH 5/7] Update frontend/src/components/ChannelHeader.jsx --- frontend/src/components/ChannelHeader.jsx | 44 +++++++++++++---------- 1 file changed, 25 insertions(+), 19 deletions(-) diff --git a/frontend/src/components/ChannelHeader.jsx b/frontend/src/components/ChannelHeader.jsx index 2640fcf..4287318 100644 --- a/frontend/src/components/ChannelHeader.jsx +++ b/frontend/src/components/ChannelHeader.jsx @@ -59,14 +59,14 @@ export default function ChannelHeader({ channel, connected, userCount, onShowSho return (
+ ? 'bg-gray-800/95 border-gray-700/50' + : 'bg-white/95 border-gray-200' + } backdrop-blur-sm`}>
-
- +

{channel.name}

@@ -76,7 +76,7 @@ export default function ChannelHeader({ channel, connected, userCount, onShowSho
-
+
{/* Search Bar */} {isSearchOpen ? ( @@ -89,9 +89,9 @@ export default function ChannelHeader({ channel, connected, userCount, onShowSho onChange={(e) => setLocalQuery(e.target.value)} onKeyDown={handleKeyDown} placeholder="Search messages..." - className={`w-64 pl-9 pr-8 py-1.5 border rounded-lg text-sm focus:outline-none focus:ring-2 focus:ring-claw-500 ${ + className={`w-72 pl-9 pr-8 py-2 border rounded-xl text-sm focus:outline-none focus:ring-2 focus:ring-claw-500 focus:border-transparent transition-all ${ isDark - ? 'bg-gray-700 border-gray-600 text-white placeholder-gray-400' + ? 'bg-gray-700/50 border-gray-600 text-white placeholder-gray-400' : 'bg-gray-100 border-gray-300 text-gray-900 placeholder-gray-500' }`} /> @@ -99,7 +99,7 @@ export default function ChannelHeader({ channel, connected, userCount, onShowSho -
+
- {userCount} online + {userCount}
-
+
{connected ? ( <> - Connected + Connected ) : ( <> - Reconnecting... + Reconnecting... )}
From 6e5fa917ac4b7b0580b1b14be75166aa739a2404 Mon Sep 17 00:00:00 2001 From: "Mr. Guy" Date: Tue, 10 Mar 2026 00:47:01 -0400 Subject: [PATCH 6/7] Update frontend/src/components/MessageInput.jsx --- frontend/src/components/MessageInput.jsx | 66 ++++++++++++------------ 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/frontend/src/components/MessageInput.jsx b/frontend/src/components/MessageInput.jsx index 6d62fdb..e9dd051 100644 --- a/frontend/src/components/MessageInput.jsx +++ b/frontend/src/components/MessageInput.jsx @@ -344,8 +344,8 @@ const MessageInput = forwardRef(function MessageInput({ return (
{/* Attachments preview */} {hasAttachments && ( @@ -353,9 +353,9 @@ const MessageInput = forwardRef(function MessageInput({ {attachments.map((attachment) => (
@@ -374,7 +374,7 @@ const MessageInput = forwardRef(function MessageInput({ type="button" onClick={() => removeAttachment(attachment.id)} disabled={isUploading} - className="absolute -top-1 -right-1 w-5 h-5 bg-red-500 hover:bg-red-600 rounded-full flex items-center justify-center text-white opacity-0 group-hover:opacity-100 transition-opacity shadow-md disabled:opacity-50" + className="absolute -top-1.5 -right-1.5 w-5 h-5 bg-red-500 hover:bg-red-600 rounded-full flex items-center justify-center text-white opacity-0 group-hover:opacity-100 transition-all shadow-md disabled:opacity-50 hover:scale-110" title="Remove attachment" > @@ -391,9 +391,9 @@ const MessageInput = forwardRef(function MessageInput({ {/* Uploading indicator */} {isUploading && ( -
@@ -404,8 +404,8 @@ const MessageInput = forwardRef(function MessageInput({ {/* Reply preview */} {replyTo && ( -
@@ -419,7 +419,7 @@ const MessageInput = forwardRef(function MessageInput({ -
+
Select text or click to insert
)} - +