diff --git a/src/app/(app)/signin/page.tsx b/src/app/(app)/signin/page.tsx index 288b46d..4a26650 100644 --- a/src/app/(app)/signin/page.tsx +++ b/src/app/(app)/signin/page.tsx @@ -9,6 +9,7 @@ import { useAuthConfig, useAuthRateLimit } from '@/contexts/AuthRateLimitContext import { showPrivacyModal } from '@/components/PrivacyModal'; import { GithubIcon } from '@/components/icons/Icons'; import { LoadingSpinner } from '@/components/Spinner'; +import { buttonClass } from '@/components/formPrimitives'; function SessionExpiredLoader({ setSessionExpired }: { setSessionExpired: (v: boolean) => void }) { const searchParams = useSearchParams(); @@ -196,10 +197,7 @@ function SignInContent() { type="submit" disabled={isAnyLoading} onClick={handleSignIn} - className="w-full rounded-lg bg-accent py-2 text-sm font-medium text-background - hover:bg-secondary-accent focus:outline-none focus:ring-2 focus:ring-accent - focus:ring-offset-2 disabled:opacity-50 transform transition-transform - duration-200 hover:scale-[1.02]" + className={buttonClass({ variant: 'primary', size: 'md', className: 'w-full hover:scale-[1.02]' })} > {loadingEmail ? : 'Connect'} @@ -210,11 +208,11 @@ function SignInContent() { type="button" disabled={isAnyLoading} onClick={handleGithubSignIn} - className="w-full rounded-lg bg-background py-2 text-sm font-medium text-foreground - hover:bg-offbase focus:outline-none focus:ring-2 focus:ring-accent - focus:ring-offset-2 disabled:opacity-50 border border-offbase - transform transition-transform duration-200 hover:scale-[1.02] - flex items-center justify-center gap-2" + className={buttonClass({ + variant: 'outline', + size: 'md', + className: 'w-full hover:scale-[1.02] flex items-center justify-center gap-2', + })} > {loadingGithub ? ( @@ -233,10 +231,7 @@ function SignInContent() { type="button" disabled={isAnyLoading} onClick={handleAnonymousContinue} - className="w-full rounded-lg bg-background py-2 text-sm font-medium text-foreground - hover:bg-offbase focus:outline-none focus:ring-2 focus:ring-accent - focus:ring-offset-2 disabled:opacity-50 border border-offbase - transform transition-transform duration-200 hover:scale-[1.02]" + className={buttonClass({ variant: 'outline', size: 'md', className: 'w-full hover:scale-[1.02]' })} > {loadingAnonymous ? : 'Continue anonymously'} diff --git a/src/app/(app)/signup/page.tsx b/src/app/(app)/signup/page.tsx index fafed41..9dfc205 100644 --- a/src/app/(app)/signup/page.tsx +++ b/src/app/(app)/signup/page.tsx @@ -8,6 +8,7 @@ import { getAuthClient } from '@/lib/client/auth-client'; import { useAuthConfig, useAuthRateLimit } from '@/contexts/AuthRateLimitContext'; import { showPrivacyModal } from '@/components/PrivacyModal'; import { LoadingSpinner } from '@/components/Spinner'; +import { buttonClass } from '@/components/formPrimitives'; import toast from 'react-hot-toast'; export default function SignUpPage() { @@ -151,7 +152,11 @@ export default function SignUpPage() { @@ -213,10 +218,7 @@ export default function SignUpPage() { type="submit" disabled={loading} onClick={handleSignUp} - className="w-full rounded-lg bg-accent py-2 text-sm font-medium text-background - hover:bg-secondary-accent focus:outline-none focus:ring-2 focus:ring-accent - focus:ring-offset-2 disabled:opacity-50 transform transition-transform - duration-200 hover:scale-[1.02]" + className={buttonClass({ variant: 'primary', size: 'md', className: 'w-full hover:scale-[1.02]' })} > {loading ? : 'Create Account'} diff --git a/src/components/CodeBlock.tsx b/src/components/CodeBlock.tsx index a887c96..c0881b5 100644 --- a/src/components/CodeBlock.tsx +++ b/src/components/CodeBlock.tsx @@ -2,6 +2,7 @@ import { useState } from 'react'; import { CopyIcon, CheckIcon } from '@/components/icons/Icons'; +import { buttonClass } from '@/components/formPrimitives'; export function CodeBlock({ children }: { children: string }) { const [copied, setCopied] = useState(false); @@ -20,9 +21,11 @@ export function CodeBlock({ children }: { children: string }) { diff --git a/src/components/ProgressCard.tsx b/src/components/ProgressCard.tsx index 2fd4e26..1713744 100644 --- a/src/components/ProgressCard.tsx +++ b/src/components/ProgressCard.tsx @@ -1,3 +1,5 @@ +import { buttonClass } from '@/components/formPrimitives'; + interface ProgressCardProps { progress: number; estimatedTimeRemaining?: string; @@ -52,7 +54,11 @@ export function ProgressCard({ @@ -1179,14 +1172,14 @@ export function SettingsModal({ className = '' }: { className?: string }) { @@ -1194,7 +1187,7 @@ export function SettingsModal({ className = '' }: { className?: string }) { @@ -1288,7 +1281,7 @@ export function SettingsModal({ className = '' }: { className?: string }) { <> @@ -1297,7 +1290,7 @@ export function SettingsModal({ className = '' }: { className?: string }) { @@ -1315,17 +1308,17 @@ export function SettingsModal({ className = '' }: { className?: string }) {

- - - diff --git a/src/components/admin/AdminFeaturesPanel.tsx b/src/components/admin/AdminFeaturesPanel.tsx index 92f3247..b404398 100644 --- a/src/components/admin/AdminFeaturesPanel.tsx +++ b/src/components/admin/AdminFeaturesPanel.tsx @@ -9,8 +9,7 @@ import { Badge, Section, ToggleRow, - btnPrimary, - btnSecondary, + buttonClass, inputClass, listboxButtonClass, listboxOptionClass, @@ -340,14 +339,14 @@ export function AdminFeaturesPanel() { diff --git a/src/components/admin/AdminProvidersPanel.tsx b/src/components/admin/AdminProvidersPanel.tsx index 6a0663d..847fef5 100644 --- a/src/components/admin/AdminProvidersPanel.tsx +++ b/src/components/admin/AdminProvidersPanel.tsx @@ -13,10 +13,7 @@ import { Field, Section, ToggleRow, - btnDanger, - btnOutline, - btnPrimary, - btnSecondary, + buttonClass, inputClass, listboxButtonClass, listboxOptionClass, @@ -261,7 +258,7 @@ export function AdminProvidersPanel() { {!editingId ? ( @@ -526,14 +523,14 @@ export function AdminProvidersPanel() {
diff --git a/src/components/doclist/DocumentList.tsx b/src/components/doclist/DocumentList.tsx index 4d5e2f9..431049b 100644 --- a/src/components/doclist/DocumentList.tsx +++ b/src/components/doclist/DocumentList.tsx @@ -14,6 +14,7 @@ import { CreateFolderDialog } from '@/components/doclist/CreateFolderDialog'; import { DocumentListSkeleton } from '@/components/doclist/DocumentListSkeleton'; import { Button } from '@headlessui/react'; import { DocumentUploader } from '@/components/documents/DocumentUploader'; +import { buttonClass } from '@/components/formPrimitives'; type DocumentToDelete = { id: string; @@ -331,7 +332,11 @@ export function DocumentList() {

Drag files on top of each other to make folders

diff --git a/src/components/reader/SegmentsSidebar.tsx b/src/components/reader/SegmentsSidebar.tsx index e7a84f1..085f836 100644 --- a/src/components/reader/SegmentsSidebar.tsx +++ b/src/components/reader/SegmentsSidebar.tsx @@ -8,6 +8,7 @@ import toast from 'react-hot-toast'; import { useTTS } from '@/contexts/TTSContext'; import { useConfig } from '@/contexts/ConfigContext'; import { RefreshIcon, InfoIcon } from '@/components/icons/Icons'; +import { buttonClass } from '@/components/formPrimitives'; import { ReaderSidebarShell } from '@/components/reader/ReaderSidebarShell'; import { compareSegmentLocators, locatorGroupKey, locatorIdentityKey } from '@/lib/shared/tts-locator'; import { buildSegmentKey, buildSegmentKeyPrefix } from '@/lib/shared/tts-segment-plan'; @@ -590,7 +591,11 @@ export function SegmentsSidebar({ isOpen, setIsOpen, documentId, epubBookRef }: aria-label="Clear segments cache" title="Clear cache for listed segments" disabled={isClearingSegments} - className="inline-flex items-center justify-center h-8 px-2 rounded-lg border border-offbase bg-base text-xs text-muted hover:bg-offbase hover:text-accent disabled:opacity-50 disabled:cursor-not-allowed transition-colors" + className={buttonClass({ + variant: 'secondary', + size: 'xs', + className: 'h-8 px-2 text-muted', + })} > {isClearingSegments ? 'Clearing…' : 'Clear'} @@ -599,7 +604,11 @@ export function SegmentsSidebar({ isOpen, setIsOpen, documentId, epubBookRef }: onClick={handleRefresh} aria-label="Refresh segments" title="Refresh" - className="inline-flex items-center justify-center w-8 h-8 rounded-lg border border-offbase bg-base text-muted hover:bg-offbase hover:text-accent transition-colors" + className={buttonClass({ + variant: 'secondary', + size: 'icon', + className: 'h-8 w-8 text-muted', + })} >