Skip to content

Commit b403378

Browse files
committed
feat(emcn): button-group
1 parent c869cd4 commit b403378

File tree

30 files changed

+344
-222
lines changed

30 files changed

+344
-222
lines changed

apps/sim/app/(auth)/components/cta-button.tsx renamed to apps/sim/app/(auth)/components/branded-button.tsx

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@ import { forwardRef, useState } from 'react'
44
import { ArrowRight, ChevronRight, Loader2 } from 'lucide-react'
55
import { Button, type ButtonProps as EmcnButtonProps } from '@/components/emcn'
66
import { cn } from '@/lib/core/utils/cn'
7-
import { useCtaButtonClass } from '@/hooks/use-cta-button-class'
7+
import { useBrandedButtonClass } from '@/hooks/use-branded-button-class'
88

9-
export interface CTAButtonProps extends Omit<EmcnButtonProps, 'variant' | 'size'> {
9+
export interface BrandedButtonProps extends Omit<EmcnButtonProps, 'variant' | 'size'> {
1010
/** Shows loading spinner and disables button */
1111
loading?: boolean
1212
/** Text to show when loading (appends "..." automatically) */
@@ -18,22 +18,22 @@ export interface CTAButtonProps extends Omit<EmcnButtonProps, 'variant' | 'size'
1818
}
1919

2020
/**
21-
* Branded CTA button for auth and status pages.
21+
* Branded button for auth and status pages.
2222
* Automatically detects whitelabel customization and applies appropriate styling.
2323
*
2424
* @example
2525
* ```tsx
2626
* // Primary branded button with arrow
27-
* <CTAButton onClick={handleSubmit}>Sign In</CTAButton>
27+
* <BrandedButton onClick={handleSubmit}>Sign In</BrandedButton>
2828
*
2929
* // Loading state
30-
* <CTAButton loading loadingText="Signing in">Sign In</CTAButton>
30+
* <BrandedButton loading loadingText="Signing in">Sign In</BrandedButton>
3131
*
3232
* // Without arrow animation
33-
* <CTAButton showArrow={false}>Continue</CTAButton>
33+
* <BrandedButton showArrow={false}>Continue</BrandedButton>
3434
* ```
3535
*/
36-
export const CTAButton = forwardRef<HTMLButtonElement, CTAButtonProps>(
36+
export const BrandedButton = forwardRef<HTMLButtonElement, BrandedButtonProps>(
3737
(
3838
{
3939
children,
@@ -49,7 +49,7 @@ export const CTAButton = forwardRef<HTMLButtonElement, CTAButtonProps>(
4949
},
5050
ref
5151
) => {
52-
const buttonClass = useCtaButtonClass()
52+
const buttonClass = useBrandedButtonClass()
5353
const [isHovered, setIsHovered] = useState(false)
5454

5555
const handleMouseEnter = (e: React.MouseEvent<HTMLButtonElement>) => {
@@ -65,8 +65,8 @@ export const CTAButton = forwardRef<HTMLButtonElement, CTAButtonProps>(
6565
return (
6666
<Button
6767
ref={ref}
68-
variant='cta'
69-
size='cta'
68+
variant='branded'
69+
size='branded'
7070
disabled={disabled || loading}
7171
onMouseEnter={handleMouseEnter}
7272
onMouseLeave={handleMouseLeave}
@@ -97,4 +97,4 @@ export const CTAButton = forwardRef<HTMLButtonElement, CTAButtonProps>(
9797
}
9898
)
9999

100-
CTAButton.displayName = 'CTAButton'
100+
BrandedButton.displayName = 'BrandedButton'

apps/sim/app/(auth)/components/sso-login-button.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ export function SSOLoginButton({
3434
}
3535

3636
const primaryBtnClasses = cn(
37-
primaryClassName || 'cta-button-gradient',
37+
primaryClassName || 'branded-button-gradient',
3838
'flex w-full items-center justify-center gap-2 rounded-[10px] border font-medium text-[15px] text-white transition-all duration-200'
3939
)
4040

apps/sim/app/(auth)/components/status-page-layout.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ export interface StatusPageLayoutProps {
3030
* title="Page Not Found"
3131
* description="The page you're looking for doesn't exist."
3232
* >
33-
* <CTAButton onClick={() => router.push('/')}>Return to Home</CTAButton>
33+
* <BrandedButton onClick={() => router.push('/')}>Return to Home</BrandedButton>
3434
* </StatusPageLayout>
3535
* ```
3636
*/

apps/sim/app/(auth)/login/login-form.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ export default function LoginPage({
105105
const [password, setPassword] = useState('')
106106
const [passwordErrors, setPasswordErrors] = useState<string[]>([])
107107
const [showValidationError, setShowValidationError] = useState(false)
108-
const [buttonClass, setButtonClass] = useState('cta-button-gradient')
108+
const [buttonClass, setButtonClass] = useState('branded-button-gradient')
109109
const [isButtonHovered, setIsButtonHovered] = useState(false)
110110

111111
const [callbackUrl, setCallbackUrl] = useState('/workspace')
@@ -146,9 +146,9 @@ export default function LoginPage({
146146
const brandAccent = computedStyle.getPropertyValue('--brand-accent-hex').trim()
147147

148148
if (brandAccent && brandAccent !== '#6f3dfa') {
149-
setButtonClass('cta-button-custom')
149+
setButtonClass('branded-button-custom')
150150
} else {
151-
setButtonClass('cta-button-gradient')
151+
setButtonClass('branded-button-gradient')
152152
}
153153
}
154154

apps/sim/app/(auth)/reset-password/reset-password-form.tsx

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ export function RequestResetForm({
2727
statusMessage,
2828
className,
2929
}: RequestResetFormProps) {
30-
const [buttonClass, setButtonClass] = useState('cta-button-gradient')
30+
const [buttonClass, setButtonClass] = useState('branded-button-gradient')
3131
const [isButtonHovered, setIsButtonHovered] = useState(false)
3232

3333
useEffect(() => {
@@ -36,9 +36,9 @@ export function RequestResetForm({
3636
const brandAccent = computedStyle.getPropertyValue('--brand-accent-hex').trim()
3737

3838
if (brandAccent && brandAccent !== '#6f3dfa') {
39-
setButtonClass('cta-button-custom')
39+
setButtonClass('branded-button-custom')
4040
} else {
41-
setButtonClass('cta-button-gradient')
41+
setButtonClass('branded-button-gradient')
4242
}
4343
}
4444

@@ -138,7 +138,7 @@ export function SetNewPasswordForm({
138138
const [validationMessage, setValidationMessage] = useState('')
139139
const [showPassword, setShowPassword] = useState(false)
140140
const [showConfirmPassword, setShowConfirmPassword] = useState(false)
141-
const [buttonClass, setButtonClass] = useState('cta-button-gradient')
141+
const [buttonClass, setButtonClass] = useState('branded-button-gradient')
142142
const [isButtonHovered, setIsButtonHovered] = useState(false)
143143

144144
useEffect(() => {
@@ -147,9 +147,9 @@ export function SetNewPasswordForm({
147147
const brandAccent = computedStyle.getPropertyValue('--brand-accent-hex').trim()
148148

149149
if (brandAccent && brandAccent !== '#6f3dfa') {
150-
setButtonClass('cta-button-custom')
150+
setButtonClass('branded-button-custom')
151151
} else {
152-
setButtonClass('cta-button-gradient')
152+
setButtonClass('branded-button-gradient')
153153
}
154154
}
155155

apps/sim/app/(auth)/signup/signup-form.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ function SignupFormContent({
9595
const [showEmailValidationError, setShowEmailValidationError] = useState(false)
9696
const [redirectUrl, setRedirectUrl] = useState('')
9797
const [isInviteFlow, setIsInviteFlow] = useState(false)
98-
const [buttonClass, setButtonClass] = useState('cta-button-gradient')
98+
const [buttonClass, setButtonClass] = useState('branded-button-gradient')
9999
const [isButtonHovered, setIsButtonHovered] = useState(false)
100100

101101
const [name, setName] = useState('')
@@ -128,9 +128,9 @@ function SignupFormContent({
128128
const brandAccent = computedStyle.getPropertyValue('--brand-accent-hex').trim()
129129

130130
if (brandAccent && brandAccent !== '#6f3dfa') {
131-
setButtonClass('cta-button-custom')
131+
setButtonClass('branded-button-custom')
132132
} else {
133-
setButtonClass('cta-button-gradient')
133+
setButtonClass('branded-button-gradient')
134134
}
135135
}
136136

apps/sim/app/(auth)/sso/sso-form.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ export default function SSOForm() {
5757
const [email, setEmail] = useState('')
5858
const [emailErrors, setEmailErrors] = useState<string[]>([])
5959
const [showEmailValidationError, setShowEmailValidationError] = useState(false)
60-
const [buttonClass, setButtonClass] = useState('cta-button-gradient')
60+
const [buttonClass, setButtonClass] = useState('branded-button-gradient')
6161
const [callbackUrl, setCallbackUrl] = useState('/workspace')
6262

6363
useEffect(() => {
@@ -96,9 +96,9 @@ export default function SSOForm() {
9696
const brandAccent = computedStyle.getPropertyValue('--brand-accent-hex').trim()
9797

9898
if (brandAccent && brandAccent !== '#6f3dfa') {
99-
setButtonClass('cta-button-custom')
99+
setButtonClass('branded-button-custom')
100100
} else {
101-
setButtonClass('cta-button-gradient')
101+
setButtonClass('branded-button-gradient')
102102
}
103103
}
104104

apps/sim/app/(auth)/verify/verify-content.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,17 +58,17 @@ function VerificationForm({
5858
setCountdown(30)
5959
}
6060

61-
const [buttonClass, setButtonClass] = useState('cta-button-gradient')
61+
const [buttonClass, setButtonClass] = useState('branded-button-gradient')
6262

6363
useEffect(() => {
6464
const checkCustomBrand = () => {
6565
const computedStyle = getComputedStyle(document.documentElement)
6666
const brandAccent = computedStyle.getPropertyValue('--brand-accent-hex').trim()
6767

6868
if (brandAccent && brandAccent !== '#6f3dfa') {
69-
setButtonClass('cta-button-custom')
69+
setButtonClass('branded-button-custom')
7070
} else {
71-
setButtonClass('cta-button-gradient')
71+
setButtonClass('branded-button-gradient')
7272
}
7373
}
7474

apps/sim/app/_styles/globals.css

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -553,23 +553,23 @@ input[type="search"]::-ms-clear {
553553
animation: placeholder-pulse 1.5s ease-in-out infinite;
554554
}
555555

556-
.cta-button-gradient {
556+
.branded-button-gradient {
557557
background: linear-gradient(to bottom, #8357ff, #6f3dfa) !important;
558558
border-color: #6f3dfa !important;
559559
box-shadow: inset 0 2px 4px 0 #9b77ff !important;
560560
}
561561

562-
.cta-button-gradient:hover {
562+
.branded-button-gradient:hover {
563563
background: linear-gradient(to bottom, #8357ff, #6f3dfa) !important;
564564
opacity: 0.9;
565565
}
566566

567-
.cta-button-custom {
567+
.branded-button-custom {
568568
background: var(--brand-primary-hex) !important;
569569
border-color: var(--brand-primary-hex) !important;
570570
}
571571

572-
.cta-button-custom:hover {
572+
.branded-button-custom:hover {
573573
background: var(--brand-primary-hover-hex) !important;
574574
border-color: var(--brand-primary-hover-hex) !important;
575575
}

apps/sim/app/chat/components/auth/email/email-auth.tsx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import { quickValidateEmail } from '@/lib/messaging/email/validation'
1010
import { inter } from '@/app/_styles/fonts/inter/inter'
1111
import { soehne } from '@/app/_styles/fonts/soehne/soehne'
1212
import AuthBackground from '@/app/(auth)/components/auth-background'
13-
import { CTAButton } from '@/app/(auth)/components/cta-button'
13+
import { BrandedButton } from '@/app/(auth)/components/branded-button'
1414
import { SupportFooter } from '@/app/(auth)/components/support-footer'
1515
import Nav from '@/app/(landing)/components/nav/nav'
1616

@@ -245,9 +245,9 @@ export default function EmailAuth({ identifier, onAuthSuccess }: EmailAuthProps)
245245
)}
246246
</div>
247247

248-
<CTAButton type='submit' loading={isSendingOtp} loadingText='Sending Code'>
248+
<BrandedButton type='submit' loading={isSendingOtp} loadingText='Sending Code'>
249249
Continue
250-
</CTAButton>
250+
</BrandedButton>
251251
</form>
252252
) : (
253253
<div className='space-y-6'>
@@ -293,14 +293,14 @@ export default function EmailAuth({ identifier, onAuthSuccess }: EmailAuthProps)
293293
</div>
294294
)}
295295

296-
<CTAButton
296+
<BrandedButton
297297
onClick={() => handleVerifyOtp()}
298298
disabled={otpValue.length !== 6}
299299
loading={isVerifyingOtp}
300300
loadingText='Verifying'
301301
>
302302
Verify Email
303-
</CTAButton>
303+
</BrandedButton>
304304

305305
<div className='text-center'>
306306
<p className='text-muted-foreground text-sm'>

0 commit comments

Comments
 (0)