Skip to content

Commit 5b7c6b4

Browse files
authored
Improve button UX with consistent hover states and pointer cursor (#2005)
1 parent fe989cc commit 5b7c6b4

File tree

13 files changed

+47
-43
lines changed

13 files changed

+47
-43
lines changed

apps/mail/components/create/create-email.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,7 @@ export function CreateEmail({
209209
<div className="flex min-h-screen flex-col items-center justify-center gap-1">
210210
<div className="flex w-[750px] justify-start">
211211
<DialogClose asChild className="flex">
212-
<button className="dark:bg-panelDark flex items-center gap-1 rounded-lg bg-[#F0F0F0] px-2 py-1.5 cursor-pointer">
212+
<button className="dark:bg-panelDark flex items-center gap-1 rounded-lg bg-[#F0F0F0] px-2 py-1 hover:bg-gray-100 dark:hover:bg-[#404040] transition-colors cursor-pointer">
213213
<X className="fill-muted-foreground mt-0.5 h-3.5 w-3.5 dark:fill-[#929292]" />
214214
<span className="text-muted-foreground text-sm font-medium dark:text-white">
215215
esc

apps/mail/components/create/email-composer.tsx

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -635,22 +635,22 @@ export function EmailComposer({
635635
<div className="flex gap-2">
636636
<button
637637
tabIndex={-1}
638-
className="flex h-full items-center gap-2 text-sm font-medium text-[#8C8C8C] hover:text-[#A8A8A8]"
638+
className="flex h-full items-center gap-2 text-sm font-medium text-[#8C8C8C] hover:text-[#A8A8A8] hover:bg-gray-50 dark:hover:bg-[#404040] transition-colors cursor-pointer rounded-sm px-1 py-0.5"
639639
onClick={() => setShowCc(!showCc)}
640640
>
641641
<span>Cc</span>
642642
</button>
643643
<button
644644
tabIndex={-1}
645-
className="flex h-full items-center gap-2 text-sm font-medium text-[#8C8C8C] hover:text-[#A8A8A8]"
645+
className="flex h-full items-center gap-2 text-sm font-medium text-[#8C8C8C] hover:text-[#A8A8A8] hover:bg-gray-50 dark:hover:bg-[#404040] transition-colors cursor-pointer rounded-sm px-1 py-0.5"
646646
onClick={() => setShowBcc(!showBcc)}
647647
>
648648
<span>Bcc</span>
649649
</button>
650650
{onClose && (
651651
<button
652652
tabIndex={-1}
653-
className="flex h-full items-center gap-2 text-sm font-medium text-[#8C8C8C] hover:text-[#A8A8A8]"
653+
className="flex h-full items-center gap-2 text-sm font-medium text-[#8C8C8C] hover:text-[#A8A8A8] hover:bg-gray-50 dark:hover:bg-[#404040] transition-colors cursor-pointer rounded-sm px-1 py-0.5"
654654
onClick={handleClose}
655655
>
656656
<X className="h-3.5 w-3.5 fill-[#9A9A9A]" />
@@ -705,6 +705,7 @@ export function EmailComposer({
705705
<button
706706
onClick={handleGenerateSubject}
707707
disabled={isLoading || isGeneratingSubject || messageLength < 1}
708+
className="hover:bg-gray-50 dark:hover:bg-[#404040] transition-colors cursor-pointer rounded p-1"
708709
>
709710
<div className="flex items-center justify-center gap-2.5 pl-0.5">
710711
<div className="flex h-5 items-center justify-center gap-1 rounded-sm">
@@ -787,7 +788,7 @@ export function EmailComposer({
787788
onChange={handleScheduleChange}
788789
onValidityChange={handleScheduleValidityChange}
789790
/>
790-
<Button variant={'secondary'} size={'xs'} onClick={() => fileInputRef.current?.click()}>
791+
<Button variant={'secondary'} size={'xs'} onClick={() => fileInputRef.current?.click()} className="bg-background border hover:bg-gray-50 dark:hover:bg-[#404040] transition-colors cursor-pointer">
791792
<Plus className="h-3 w-3 fill-[#9A9A9A]" />
792793
<span className="hidden px-0.5 text-sm md:block">Add</span>
793794
</Button>
@@ -819,7 +820,7 @@ export function EmailComposer({
819820
<Popover modal={true}>
820821
<PopoverTrigger asChild>
821822
<button
822-
className="focus-visible:ring-ring flex items-center gap-1.5 rounded-md border border-[#E7E7E7] bg-white/5 px-2 py-1 text-sm hover:bg-white/10 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 dark:border-[#2B2B2B]"
823+
className="focus-visible:ring-ring flex items-center gap-1.5 rounded-md border border-[#E7E7E7] bg-white/5 px-2 py-1 text-sm hover:bg-white/10 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 dark:border-[#2B2B2B] cursor-pointer"
823824
aria-label={`View ${attachments.length} attached ${pluralize('file', attachments.length)}`}
824825
>
825826
<Paperclip className="h-3.5 w-3.5 text-[#9A9A9A]" />
@@ -917,7 +918,7 @@ export function EmailComposer({
917918
toast.error('Failed to remove attachment');
918919
}
919920
}}
920-
className="focus-visible:ring-ring ml-1 flex h-6 w-6 shrink-0 items-center justify-center rounded-full bg-transparent hover:bg-black/5 focus-visible:outline-none focus-visible:ring-2"
921+
className="focus-visible:ring-ring ml-1 flex h-6 w-6 shrink-0 items-center justify-center rounded-full bg-transparent hover:bg-black/5 focus-visible:outline-none focus-visible:ring-2 cursor-pointer"
921922
aria-label={`Remove ${file.name}`}
922923
>
923924
<XIcon className="text-muted-foreground h-3.5 w-3.5 hover:text-black dark:text-[#9B9B9B] dark:hover:text-white" />
@@ -939,7 +940,7 @@ export function EmailComposer({
939940
variant="ghost"
940941
size="icon"
941942
onClick={() => setToggleToolbar(!toggleToolbar)}
942-
className={`h-auto w-auto rounded p-1.5 ${toggleToolbar ? 'bg-muted' : 'bg-background'} border`}
943+
className={`h-auto w-auto rounded p-1.5 ${toggleToolbar ? 'bg-muted' : 'bg-background'} border hover:bg-gray-50 dark:hover:bg-[#404040] transition-colors cursor-pointer`}
943944
>
944945
<Type className="h-4 w-4" />
945946
</Button>
@@ -976,7 +977,7 @@ export function EmailComposer({
976977
<Button
977978
size={'xs'}
978979
variant={'ghost'}
979-
className="border border-[#8B5CF6]"
980+
className="border border-[#8B5CF6] cursor-pointer"
980981
onClick={async () => {
981982
if (!subjectInput.trim()) {
982983
await handleGenerateSubject();
@@ -1013,10 +1014,10 @@ export function EmailComposer({
10131014
</DialogDescription>
10141015
</DialogHeader>
10151016
<DialogFooter className="mt-2">
1016-
<Button variant="outline" onClick={cancelLeave}>
1017+
<Button variant="outline" onClick={cancelLeave} className="cursor-pointer">
10171018
Stay
10181019
</Button>
1019-
<Button variant="destructive" onClick={confirmLeave}>
1020+
<Button variant="destructive" onClick={confirmLeave} className="cursor-pointer">
10201021
Leave
10211022
</Button>
10221023
</DialogFooter>
@@ -1038,6 +1039,7 @@ export function EmailComposer({
10381039
onClick={() => {
10391040
setShowAttachmentWarning(false);
10401041
}}
1042+
className="cursor-pointer"
10411043
>
10421044
Recheck
10431045
</Button>
@@ -1046,6 +1048,7 @@ export function EmailComposer({
10461048
setShowAttachmentWarning(false);
10471049
void proceedWithSend();
10481050
}}
1051+
className="cursor-pointer"
10491052
>
10501053
Send Anyway
10511054
</Button>
@@ -1137,7 +1140,7 @@ const ContentPreview = ({
11371140
</div>
11381141
<div className="flex justify-end gap-2 p-2">
11391142
<button
1140-
className="flex h-7 items-center gap-0.5 overflow-hidden rounded-md border bg-red-700 px-1.5 text-sm shadow-sm hover:bg-red-800 dark:border-none"
1143+
className="flex h-7 items-center gap-0.5 overflow-hidden rounded-md border bg-red-700 px-1.5 text-sm shadow-sm hover:bg-red-800 dark:border-none cursor-pointer transition-colors"
11411144
onClick={async () => {
11421145
if (onReject) {
11431146
await onReject();
@@ -1150,7 +1153,7 @@ const ContentPreview = ({
11501153
<span>Reject</span>
11511154
</button>
11521155
<button
1153-
className="flex h-7 items-center gap-0.5 overflow-hidden rounded-md border bg-green-700 px-1.5 text-sm shadow-sm hover:bg-green-800 dark:border-none"
1156+
className="flex h-7 items-center gap-0.5 overflow-hidden rounded-md border bg-green-700 px-1.5 text-sm shadow-sm hover:bg-green-800 dark:border-none cursor-pointer transition-colors"
11541157
onClick={async () => {
11551158
if (onAccept) {
11561159
await onAccept(content);

apps/mail/components/create/schedule-send-picker.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,7 @@ export const ScheduleSendPicker: React.FC<ScheduleSendPickerProps> = ({
182182
type="button"
183183
onClick={handleToggleScheduling}
184184
className={cn(
185-
'flex items-center gap-1 rounded-md border px-2 py-1 text-sm hover:bg-accent',
185+
'flex items-center gap-1 rounded-md border px-2 py-1 text-sm bg-background hover:bg-gray-50 dark:hover:bg-[#404040] transition-colors cursor-pointer',
186186
className,
187187
)}
188188
>

apps/mail/components/create/template-button.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,7 @@ const TemplateButtonComponent: React.FC<TemplateButtonProps> = ({
196196
<>
197197
<DropdownMenu open={menuOpen} onOpenChange={setMenuOpen}>
198198
<DropdownMenuTrigger asChild>
199-
<Button size={'xs'} variant={'secondary'} disabled={isSaving}>
199+
<Button type="button" size={'xs'} variant={'secondary'} className="bg-background border hover:bg-gray-50 dark:hover:bg-[#404040] transition-colors cursor-pointer" disabled={isSaving}>
200200
Templates
201201
</Button>
202202
</DropdownMenuTrigger>

apps/mail/components/mail/mail-display.tsx

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -351,8 +351,9 @@ type ActionButtonProps = {
351351
const ActionButton = ({ onClick, icon, text, shortcut }: ActionButtonProps) => {
352352
return (
353353
<button
354+
type="button"
354355
onClick={onClick}
355-
className="inline-flex h-7 items-center justify-center gap-1 overflow-hidden rounded-md border bg-white px-1.5 dark:border-none dark:bg-[#313131]"
356+
className="inline-flex h-7 items-center justify-center gap-1 overflow-hidden rounded-md border bg-white px-1.5 dark:border-none dark:bg-[#313131] cursor-pointer hover:bg-gray-100 dark:hover:bg-[#3d3d3d] transition-colors"
356357
>
357358
{icon}
358359
<div className="flex items-center justify-center gap-2.5 pl-0.5 pr-1">
@@ -1349,7 +1350,7 @@ const MailDisplay = ({ emailData, index, totalEmails, demo, threadAttachments }:
13491350
<Popover open={openDetailsPopover} onOpenChange={handlePopoverChange}>
13501351
<PopoverTrigger asChild>
13511352
<button
1352-
className="hover:bg-iconLight/10 dark:hover:bg-iconDark/20 flex items-center gap-2 rounded-md p-2"
1353+
className="hover:bg-iconLight/10 dark:hover:bg-iconDark/20 flex items-center gap-2 rounded-md p-2 cursor-pointer"
13531354
onClick={(e) => {
13541355
e.stopPropagation();
13551356
e.preventDefault();
@@ -1494,7 +1495,7 @@ const MailDisplay = ({ emailData, index, totalEmails, demo, threadAttachments }:
14941495
e.stopPropagation();
14951496
e.preventDefault();
14961497
}}
1497-
className="inline-flex h-7 w-7 items-center justify-center gap-1 overflow-hidden rounded-md bg-white focus:outline-none focus:ring-0 dark:bg-[#313131]"
1498+
className="inline-flex h-7 w-7 items-center justify-center gap-1 overflow-hidden rounded-md bg-white hover:bg-gray-100 focus:outline-none focus:ring-0 dark:bg-[#313131] dark:hover:bg-[#3d3d3d] cursor-pointer transition-colors"
14981499
>
14991500
<ThreeDots className="fill-iconLight dark:fill-iconDark" />
15001501
</button>

apps/mail/components/mail/mail.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -485,9 +485,9 @@ export function MailLayout() {
485485
refetchThreads();
486486
}}
487487
variant="ghost"
488-
className="md:h-fit md:px-2"
488+
className="md:h-fit md:px-2 hover:bg-accent/50"
489489
>
490-
<RefreshCcw className="text-muted-foreground h-4 w-4 cursor-pointer" />
490+
<RefreshCcw className="text-muted-foreground h-4 w-4" />
491491
</Button>
492492
{mail.bulkSelected.length > 0 ? (
493493
<div className="flex items-center gap-2">

apps/mail/components/mail/thread-display.tsx

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -732,7 +732,7 @@ export function ThreadDisplay() {
732732
<div className="mt-4 grid grid-cols-1 gap-2 xl:grid-cols-2">
733733
<button
734734
onClick={toggleAISidebar}
735-
className="inline-flex h-7 items-center justify-center gap-0.5 overflow-hidden rounded-lg border bg-white px-2 dark:border-none dark:bg-[#313131]"
735+
className="inline-flex h-7 items-center justify-center gap-0.5 overflow-hidden rounded-lg border bg-white px-2 dark:border-none dark:bg-[#313131] hover:bg-gray-100 dark:hover:bg-[#404040] transition-colors cursor-pointer"
736736
>
737737
<Sparkles className="mr-1 h-3.5 w-3.5 fill-[#959595]" />
738738
<div className="flex items-center justify-center gap-2.5 px-0.5">
@@ -743,7 +743,7 @@ export function ThreadDisplay() {
743743
</button>
744744
<button
745745
onClick={() => setIsComposeOpen('true')}
746-
className="inline-flex h-7 items-center justify-center gap-0.5 overflow-hidden rounded-lg border bg-white px-2 dark:border-none dark:bg-[#313131]"
746+
className="inline-flex h-7 items-center justify-center gap-0.5 overflow-hidden rounded-lg border bg-white px-2 dark:border-none dark:bg-[#313131] hover:bg-gray-100 dark:hover:bg-[#404040] transition-colors cursor-pointer"
747747
>
748748
<Mail className="mr-1 h-3.5 w-3.5 fill-[#959595]" />
749749
<div className="flex items-center justify-center gap-2.5 px-0.5">
@@ -802,7 +802,7 @@ export function ThreadDisplay() {
802802
setMode('replyAll');
803803
setActiveReplyId(emailData?.latest?.id ?? '');
804804
}}
805-
className="inline-flex h-7 items-center justify-center gap-1 overflow-hidden rounded-lg border bg-white px-1.5 dark:border-none dark:bg-[#313131]"
805+
className="inline-flex h-7 items-center justify-center gap-1 overflow-hidden rounded-lg border bg-white px-1.5 dark:border-none dark:bg-[#313131] hover:bg-gray-100 dark:hover:bg-[#404040] transition-colors cursor-pointer"
806806
>
807807
<Reply className="fill-muted-foreground dark:fill-[#9B9B9B]" />
808808
<div className="flex items-center justify-center gap-2.5 pl-0.5 pr-1">
@@ -817,7 +817,7 @@ export function ThreadDisplay() {
817817
<TooltipTrigger asChild>
818818
<button
819819
onClick={handleToggleStar}
820-
className="inline-flex h-7 w-7 items-center justify-center gap-1 overflow-hidden rounded-lg bg-white dark:bg-[#313131]"
820+
className="inline-flex h-7 w-7 items-center justify-center gap-1 overflow-hidden rounded-lg bg-white dark:bg-[#313131] hover:bg-gray-100 dark:hover:bg-[#404040] transition-colors cursor-pointer"
821821
>
822822
<Star
823823
className={cn(
@@ -842,7 +842,7 @@ export function ThreadDisplay() {
842842
<TooltipTrigger asChild>
843843
<button
844844
onClick={() => moveThreadTo('archive')}
845-
className="inline-flex h-7 w-7 items-center justify-center gap-1 overflow-hidden rounded-lg bg-white dark:bg-[#313131]"
845+
className="inline-flex h-7 w-7 items-center justify-center gap-1 overflow-hidden rounded-lg bg-white dark:bg-[#313131] hover:bg-gray-100 dark:hover:bg-[#404040] transition-colors cursor-pointer"
846846
>
847847
<Archive className="fill-iconLight dark:fill-iconDark" />
848848
</button>
@@ -859,7 +859,7 @@ export function ThreadDisplay() {
859859
<TooltipTrigger asChild>
860860
<button
861861
onClick={() => moveThreadTo('bin')}
862-
className="inline-flex h-7 w-7 items-center justify-center gap-1 overflow-hidden rounded-lg border border-[#FCCDD5] bg-[#FDE4E9] dark:border-[#6E2532] dark:bg-[#411D23]"
862+
className="inline-flex h-7 w-7 items-center justify-center gap-1 overflow-hidden rounded-lg border border-[#FCCDD5] bg-[#FDE4E9] hover:bg-[#fccdd5]/70 dark:border-[#6E2532] dark:bg-[#411D23] dark:hover:bg-[#6E2532]/70 cursor-pointer transition-colors"
863863
>
864864
<Trash className="fill-[#F43F5E]" />
865865
</button>
@@ -873,7 +873,7 @@ export function ThreadDisplay() {
873873

874874
<DropdownMenu>
875875
<DropdownMenuTrigger asChild>
876-
<button type="button" aria-label="Thread actions" aria-haspopup="menu" className="inline-flex h-7 w-7 items-center justify-center gap-1 overflow-hidden rounded-lg bg-white cursor-pointer focus:outline-hidden focus:ring-0 dark:bg-[#313131]">
876+
<button type="button" aria-label="Thread actions" aria-haspopup="menu" className="inline-flex h-7 w-7 items-center justify-center gap-1 overflow-hidden rounded-lg bg-white cursor-pointer focus:outline-hidden focus:ring-0 dark:bg-[#313131] transition-colors">
877877
<ThreeDots className="fill-iconLight dark:fill-iconDark" />
878878
</button>
879879
</DropdownMenuTrigger>

apps/mail/components/ui/app-sidebar.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ function ComposeButton() {
200200
<DialogDescription></DialogDescription>
201201

202202
<DialogTrigger asChild>
203-
<button type="button" className="relative mb-1.5 inline-flex h-8 w-full items-center justify-center gap-1 self-stretch overflow-hidden rounded-lg border border-gray-200 bg-[#006FFE] text-black dark:border-none dark:text-white cursor-pointer">
203+
<button type="button" className="relative mb-1.5 inline-flex h-8 w-full items-center justify-center gap-1 self-stretch overflow-hidden rounded-lg border border-gray-200 bg-[#006FFE] text-black dark:border-none dark:text-white cursor-pointer hover:bg-[#0056CC] dark:hover:bg-[#0056CC] transition-colors">
204204
{state === 'collapsed' && !isMobile ? (
205205
<PencilCompose className="mt-0.5 fill-white text-black" />
206206
) : (

apps/mail/components/ui/button.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ const buttonVariants = cva(
1818
main: 'bg-muted text-primary',
1919
// A button that resembles a dropdownItem
2020
dropdownItem:
21-
'cursor-default select-none gap-2 rounded-sm text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground hover:bg-accent',
21+
'select-none gap-2 rounded-sm text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground hover:bg-accent',
2222
},
2323
size: {
2424
dropdownItem: 'px-2 py-1.5',

0 commit comments

Comments
 (0)