From b2ecf60a13a868d8f7c22bf2ab1c40d724f8b499 Mon Sep 17 00:00:00 2001 From: Dries Augustyns Date: Sat, 6 Dec 2025 10:06:11 +0100 Subject: [PATCH] Improve UI/UX Consistency --- .../src/components/EmailEditor/Toolbar.tsx | 2 +- apps/web/src/components/QuickStart.tsx | 9 +- apps/web/src/components/WorkflowBuilder.tsx | 26 +- apps/web/src/pages/contacts/index.tsx | 4 +- apps/web/src/pages/segments/index.tsx | 278 +++++++++--------- apps/web/src/pages/settings/index.tsx | 4 +- apps/web/src/pages/templates/index.tsx | 35 +-- apps/web/src/pages/workflows/index.tsx | 6 +- packages/ui/src/components/atoms/Button.tsx | 10 +- 9 files changed, 185 insertions(+), 189 deletions(-) diff --git a/apps/web/src/components/EmailEditor/Toolbar.tsx b/apps/web/src/components/EmailEditor/Toolbar.tsx index 2e326e7..0b78b54 100644 --- a/apps/web/src/components/EmailEditor/Toolbar.tsx +++ b/apps/web/src/components/EmailEditor/Toolbar.tsx @@ -474,7 +474,7 @@ export function Toolbar({editor, onInsertVariable, onInsertImage, canUploadImage type="button" onMouseDown={e => e.preventDefault()} onClick={handleColorClick} - className="w-8 h-8 rounded border-2 border-neutral-300 hover:border-neutral-500 hover:scale-110 transition-all relative group" + className="w-8 h-8 rounded border-2 border-neutral-300 hover:border-neutral-500 hover:scale-105 transition-all relative group" style={{backgroundColor: color}} title={color} > diff --git a/apps/web/src/components/QuickStart.tsx b/apps/web/src/components/QuickStart.tsx index 26f6b36..7509afa 100644 --- a/apps/web/src/components/QuickStart.tsx +++ b/apps/web/src/components/QuickStart.tsx @@ -28,16 +28,16 @@ function HelpResources() {

Need help?

- + - +
@@ -237,7 +237,6 @@ export function QuickStart({setupState, isLoading}: QuickStartProps) { diff --git a/apps/web/src/components/WorkflowBuilder.tsx b/apps/web/src/components/WorkflowBuilder.tsx index 9388b3e..7534fcb 100644 --- a/apps/web/src/components/WorkflowBuilder.tsx +++ b/apps/web/src/components/WorkflowBuilder.tsx @@ -133,9 +133,9 @@ function AddStepNode({data}: {data: {label: string; onClick?: () => void}}) { }} /> -
-
- +
+
+
{data.label &&
{data.label}
}
@@ -192,26 +192,30 @@ function CustomNode({ {/* Action buttons - shown on hover */} {showActions && data.type !== 'TRIGGER' && (
- - + + +
)} diff --git a/apps/web/src/pages/contacts/index.tsx b/apps/web/src/pages/contacts/index.tsx index 95bdbe5..2e62298 100644 --- a/apps/web/src/pages/contacts/index.tsx +++ b/apps/web/src/pages/contacts/index.tsx @@ -289,7 +289,7 @@ export default function ContactsPage() {
@@ -334,7 +334,7 @@ export default function ContactsPage() {
diff --git a/apps/web/src/pages/segments/index.tsx b/apps/web/src/pages/segments/index.tsx index c508a80..52c7bd2 100644 --- a/apps/web/src/pages/segments/index.tsx +++ b/apps/web/src/pages/segments/index.tsx @@ -72,147 +72,149 @@ export default function SegmentsPage() {
- {/* Header */} -
-
-

Segments

-

- Create dynamic audience groups based on contact attributes and behaviors -

+ {/* Header */} +
+
+

Segments

+

+ Create dynamic audience groups based on contact attributes and behaviors +

+
+ + +
- - - + + {/* Warning if too many segments */} + {showLimitWarning && ( + + + + Showing first {segments?.length} segments. Consider archiving old segments to improve performance. + + + )} + + {/* Segments Grid */} + {isLoading ? ( +
+
+ + + + +

Loading segments...

+
+
+ ) : segments?.length === 0 ? ( + + +
+ +

No segments yet

+

+ Create your first segment to group contacts based on attributes and behaviors +

+ + + +
+
+
+ ) : ( +
+ {segments?.map(segment => ( + + +
+
+ {segment.name} + {segment.description && ( + {segment.description} + )} +
+
+
+ +
+ {/* Stats */} +
+
+ + Members +
+ {segment.memberCount} +
+ +
+
+ + Filters +
+ + {countFiltersInCondition(segment.condition)} + +
+ + {/* Actions */} +
+ + + + +
+ + {/* Metadata */} +
+ Created {new Date(segment.createdAt).toLocaleDateString()} +
+
+
+
+ ))} +
+ )}
- {/* Warning if too many segments */} - {showLimitWarning && ( - - - - Showing first {segments?.length} segments. Consider archiving old segments to improve performance. - - - )} - - {/* Segments Grid */} - {isLoading ? ( -
-
- - - - -

Loading segments...

-
-
- ) : segments?.length === 0 ? ( - - -
- -

No segments yet

-

- Create your first segment to group contacts based on attributes and behaviors -

- - - -
-
-
- ) : ( -
- {segments?.map(segment => ( - - -
-
- {segment.name} - {segment.description && {segment.description}} -
-
-
- -
- {/* Stats */} -
-
- - Members -
- {segment.memberCount} -
- -
-
- - Filters -
- - {countFiltersInCondition(segment.condition)} - -
- - {/* Actions */} -
- - - - -
- - {/* Metadata */} -
- Created {new Date(segment.createdAt).toLocaleDateString()} -
-
-
-
- ))} -
- )} -
- - - + + ); } diff --git a/apps/web/src/pages/settings/index.tsx b/apps/web/src/pages/settings/index.tsx index ca49552..9c116d1 100644 --- a/apps/web/src/pages/settings/index.tsx +++ b/apps/web/src/pages/settings/index.tsx @@ -545,9 +545,9 @@ export default function Settings() {
diff --git a/apps/web/src/pages/templates/index.tsx b/apps/web/src/pages/templates/index.tsx index ad970de..076b3f5 100644 --- a/apps/web/src/pages/templates/index.tsx +++ b/apps/web/src/pages/templates/index.tsx @@ -126,39 +126,30 @@ export default function TemplatesPage() { {/* Type Filter */}
- - - +
@@ -246,7 +237,7 @@ export default function TemplatesPage() { setShowDeleteDialog(true); }} > - + diff --git a/apps/web/src/pages/workflows/index.tsx b/apps/web/src/pages/workflows/index.tsx index 62944f0..081711e 100644 --- a/apps/web/src/pages/workflows/index.tsx +++ b/apps/web/src/pages/workflows/index.tsx @@ -220,9 +220,9 @@ export default function WorkflowsPage() { onClick={() => handleToggleEnabled(workflow.id, workflow.enabled)} > {workflow.enabled ? ( - + ) : ( - + )} @@ -238,7 +238,7 @@ export default function WorkflowsPage() { setShowDeleteDialog(true); }} > - + diff --git a/packages/ui/src/components/atoms/Button.tsx b/packages/ui/src/components/atoms/Button.tsx index 9b55b13..75596f5 100644 --- a/packages/ui/src/components/atoms/Button.tsx +++ b/packages/ui/src/components/atoms/Button.tsx @@ -5,14 +5,14 @@ import * as React from 'react'; import {cn} from '../../lib'; const buttonVariants = cva( - 'inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 cursor-pointer', + 'inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 cursor-pointer', { variants: { variant: { - default: 'bg-neutral-900 text-neutral-50 shadow hover:bg-neutral-900/90', - destructive: 'bg-red-500 text-neutral-50 shadow-sm hover:bg-red-500/90', - outline: 'border border-neutral-200 bg-white shadow-sm hover:bg-neutral-100 hover:text-neutral-900', - secondary: 'bg-neutral-100 text-neutral-900 shadow-sm hover:bg-neutral-100/80', + default: 'bg-neutral-900 text-neutral-50 shadow hover:bg-neutral-900/90 hover:shadow-md', + destructive: 'bg-red-500 text-neutral-50 shadow-sm hover:bg-red-500/90 hover:shadow-md', + outline: 'border border-neutral-200 bg-white shadow-sm hover:bg-neutral-100 hover:text-neutral-900 hover:shadow-md', + secondary: 'bg-neutral-100 text-neutral-900 shadow-sm hover:bg-neutral-100/80 hover:shadow-md', ghost: 'hover:bg-neutral-100 hover:text-neutral-900', link: 'text-neutral-900 underline-offset-4 hover:underline', },