diff --git a/src/app/(app)/epub/[id]/page.tsx b/src/app/(app)/epub/[id]/page.tsx index 19e1806..f786c49 100644 --- a/src/app/(app)/epub/[id]/page.tsx +++ b/src/app/(app)/epub/[id]/page.tsx @@ -173,7 +173,7 @@ export default function EPUBPage() {

{error}

@@ -190,7 +190,7 @@ export default function EPUBPage() { left={ diff --git a/src/app/(app)/html/[id]/page.tsx b/src/app/(app)/html/[id]/page.tsx index 90fa49a..c85ea9e 100644 --- a/src/app/(app)/html/[id]/page.tsx +++ b/src/app/(app)/html/[id]/page.tsx @@ -160,7 +160,7 @@ export default function HTMLPage() {

{error}

@@ -177,7 +177,7 @@ export default function HTMLPage() { left={ diff --git a/src/app/(app)/pdf/[id]/page.tsx b/src/app/(app)/pdf/[id]/page.tsx index 7635833..1328995 100644 --- a/src/app/(app)/pdf/[id]/page.tsx +++ b/src/app/(app)/pdf/[id]/page.tsx @@ -255,7 +255,7 @@ export default function PDFViewerPage() { @@ -309,7 +309,7 @@ export default function PDFViewerPage() { return (
-
+
{showDetailedParseLoader ? (
@@ -331,7 +331,7 @@ export default function PDFViewerPage() {
@@ -354,7 +354,7 @@ export default function PDFViewerPage() {
) : ( -
+
@@ -384,7 +384,7 @@ export default function PDFViewerPage() { diff --git a/src/app/(app)/signin/page.tsx b/src/app/(app)/signin/page.tsx index fd46578..b89332b 100644 --- a/src/app/(app)/signin/page.tsx +++ b/src/app/(app)/signin/page.tsx @@ -188,7 +188,7 @@ function SignInContent() { type="submit" disabled={isAnyLoading} onClick={handleSignIn} - className={buttonClass({ variant: 'primary', size: 'md', className: 'w-full hover:scale-[1.02]' })} + className={buttonClass({ variant: 'primary', size: 'md', className: 'w-full' })} > {loadingEmail ? : 'Connect'} @@ -202,7 +202,7 @@ function SignInContent() { className={buttonClass({ variant: 'outline', size: 'md', - className: 'w-full hover:scale-[1.02] flex items-center justify-center gap-2', + className: 'w-full flex items-center justify-center gap-2', })} > {loadingGithub ? ( @@ -222,7 +222,7 @@ function SignInContent() { type="button" disabled={isAnyLoading} onClick={handleAnonymousContinue} - className={buttonClass({ variant: 'outline', size: 'md', className: 'w-full hover:scale-[1.02]' })} + className={buttonClass({ variant: 'outline', size: 'md', className: 'w-full' })} > {loadingAnonymous ? : 'Continue anonymously'} diff --git a/src/app/(app)/signup/page.tsx b/src/app/(app)/signup/page.tsx index 9d9fbf1..fec63de 100644 --- a/src/app/(app)/signup/page.tsx +++ b/src/app/(app)/signup/page.tsx @@ -234,7 +234,7 @@ export default function SignUpPage() { type="submit" disabled={loading} onClick={handleSignUp} - className={buttonClass({ variant: 'primary', size: 'md', className: 'w-full hover:scale-[1.02]' })} + className={buttonClass({ variant: 'primary', size: 'md', className: 'w-full' })} > {loading ? : 'Create Account'} diff --git a/src/components/AudiobookExportModal.tsx b/src/components/AudiobookExportModal.tsx index 314393e..e84f4dd 100644 --- a/src/components/AudiobookExportModal.tsx +++ b/src/components/AudiobookExportModal.tsx @@ -560,7 +560,7 @@ export function AudiobookExportModal({ disabled={chapters.length > 0 || settingsLocked} >
- + {format.toUpperCase()} @@ -568,7 +568,7 @@ export function AudiobookExportModal({ @@ -673,7 +673,7 @@ export function AudiobookExportModal({ className="flex-1 inline-flex justify-center rounded-lg bg-accent px-3 py-2 text-sm font-medium text-background hover:bg-secondary-accent focus:outline-none focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-2 - transform transition-transform duration-200 ease-in-out hover:scale-[1.01] disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:scale-100" + transform transition-transform duration-base ease-standard disabled:opacity-50 disabled:cursor-not-allowed" > Start Generation @@ -685,7 +685,7 @@ export function AudiobookExportModal({ className="flex-1 inline-flex justify-center rounded-lg bg-accent px-3 py-2 text-sm font-medium text-background hover:bg-secondary-accent focus:outline-none focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-2 - transform transition-transform duration-200 ease-in-out hover:scale-[1.01] disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:scale-100" + transform transition-transform duration-base ease-standard disabled:opacity-50 disabled:cursor-not-allowed" > Resume @@ -697,7 +697,7 @@ export function AudiobookExportModal({ className="inline-flex justify-center rounded-lg border border-red-500 bg-transparent px-3 py-2 text-sm font-medium text-red-500 hover:bg-red-500 hover:text-background focus:outline-none focus-visible:ring-2 focus-visible:ring-red-500 focus-visible:ring-offset-2 - transform transition-transform duration-200 ease-in-out hover:scale-[1.01]" + transform transition-transform duration-base ease-standard" title="Delete all generated chapters/pages for this document" > Reset @@ -760,7 +760,7 @@ export function AudiobookExportModal({ onChange(color)} - className="group/swatch relative w-full aspect-square rounded-full transition-transform duration-100 hover:scale-125 focus:outline-none focus-visible:ring-2 focus-visible:ring-offset-1" + className="group/swatch relative w-full aspect-square rounded-full transition-transform duration-fast focus:outline-none focus-visible:ring-2 focus-visible:ring-offset-1" style={{ backgroundColor: color, boxShadow: selected ? '0 0 0 2px var(--background), 0 0 0 4px var(--foreground)' : undefined, diff --git a/src/components/ConfirmDialog.tsx b/src/components/ConfirmDialog.tsx index 582a400..2b8af69 100644 --- a/src/components/ConfirmDialog.tsx +++ b/src/components/ConfirmDialog.tsx @@ -41,10 +41,10 @@ export function ConfirmDialog({ > @@ -55,14 +55,14 @@ export function ConfirmDialog({
- + @@ -90,7 +89,7 @@ export function ConfirmDialog({ className={buttonClass({ variant: isDangerous ? 'danger' : 'primary', size: 'sm', - className: 'text-wrap hover:scale-[1.04]', + className: 'text-wrap', })} onClick={onConfirm} > diff --git a/src/components/CookieConsentBanner.tsx b/src/components/CookieConsentBanner.tsx index b62a0fd..5c174c2 100644 --- a/src/components/CookieConsentBanner.tsx +++ b/src/components/CookieConsentBanner.tsx @@ -35,10 +35,10 @@ export function CookieConsentBanner() { { })}> @@ -95,14 +95,14 @@ export function PrivacyModal({ isOpen, onAccept, onDismiss }: PrivacyModalProps)
- + Continue @@ -195,10 +195,10 @@ export function showPrivacyModal(): void { @@ -209,14 +209,14 @@ export function showPrivacyModal(): void {
- + Close diff --git a/src/components/ProgressCard.tsx b/src/components/ProgressCard.tsx index a3543a4..c37eee4 100644 --- a/src/components/ProgressCard.tsx +++ b/src/components/ProgressCard.tsx @@ -57,7 +57,7 @@ export function ProgressCard({ className={buttonClass({ variant: 'ghost', size: 'xs', - className: 'shrink-0 hover:bg-background/50 hover:scale-[1.04]', + className: 'shrink-0 hover:bg-background/50', })} onClick={(e) => onCancel(e)} > @@ -68,7 +68,7 @@ export function ProgressCard({ {/* Progress bar */}
diff --git a/src/components/ProgressPopup.tsx b/src/components/ProgressPopup.tsx index 4e0c7db..8a8578c 100644 --- a/src/components/ProgressPopup.tsx +++ b/src/components/ProgressPopup.tsx @@ -32,10 +32,10 @@ export function ProgressPopup({ diff --git a/src/components/SettingsModal.tsx b/src/components/SettingsModal.tsx index aa552d9..0822cdf 100644 --- a/src/components/SettingsModal.tsx +++ b/src/components/SettingsModal.tsx @@ -142,11 +142,11 @@ export function SettingsTrigger({ return ( ); @@ -519,10 +519,10 @@ export function SettingsModal({ > @@ -533,14 +533,14 @@ export function SettingsModal({
- + {/* Header */}
@@ -666,7 +666,7 @@ export function SettingsModal({ @@ -782,7 +782,7 @@ export function SettingsModal({ @@ -908,7 +908,7 @@ export function SettingsModal({ return ( @@ -1052,7 +1052,7 @@ export function SettingsModal({ @@ -1278,19 +1278,19 @@ export function SettingsModal({

- {runtimeConfig.enableUserSignups && ( - )} - @@ -1439,7 +1439,7 @@ function SettingsChangelogPanel({
{enableUserSignups && ( - @@ -97,7 +97,7 @@ export function UserMenu({
diff --git a/src/components/doclist/views/ListView.tsx b/src/components/doclist/views/ListView.tsx index 676b157..7baaabf 100644 --- a/src/components/doclist/views/ListView.tsx +++ b/src/components/doclist/views/ListView.tsx @@ -62,7 +62,7 @@ function HeaderCell({ onSortChange(field, nextDir); }} className={ - 'flex items-center gap-1 px-2 py-1.5 text-[10px] uppercase tracking-wide font-semibold transition-colors duration-200 ease-out hover:text-accent ' + + 'flex items-center gap-1 px-2 py-1.5 text-[10px] uppercase tracking-wide font-semibold transition-colors duration-base ease-standard hover:text-accent ' + (active ? 'text-accent' : 'text-muted') + (align === 'right' ? ' justify-end' : '') + ' ' + @@ -131,7 +131,7 @@ function DocRow({ data-doc-tile aria-selected={isSelected} className={ - 'grid grid-cols-[minmax(0,1fr)_44px_72px_104px_28px] sm:grid-cols-[minmax(0,1fr)_56px_96px_140px_32px] items-center text-[12px] border-b border-offbase transition-colors duration-200 ease-out ' + + 'grid grid-cols-[minmax(0,1fr)_44px_72px_104px_28px] sm:grid-cols-[minmax(0,1fr)_56px_96px_140px_32px] items-center text-[12px] border-b border-offbase transition-colors duration-base ease-standard ' + (isSelected ? 'bg-offbase text-accent' : 'text-foreground hover:bg-offbase') + @@ -161,7 +161,7 @@ function DocRow({ e.stopPropagation(); onDeleteDoc(doc); }} - className="h-7 w-7 flex items-center justify-center text-muted hover:text-accent hover:bg-offbase hover:scale-[1.02] rounded transition-all duration-200 ease-out" + className="h-7 w-7 flex items-center justify-center text-muted hover:text-accent hover:bg-offbase rounded transition duration-base ease-standard" aria-label={`Delete ${doc.name}`} > diff --git a/src/components/doclist/window/FinderSidebar.tsx b/src/components/doclist/window/FinderSidebar.tsx index 0ecf12c..8e69493 100644 --- a/src/components/doclist/window/FinderSidebar.tsx +++ b/src/components/doclist/window/FinderSidebar.tsx @@ -56,7 +56,7 @@ function SidebarRow({ type="button" onClick={onClick} className={ - 'group w-full flex items-center gap-2 px-2 py-1 rounded-md text-[12px] border transform transition-all duration-200 ease-out text-left hover:scale-[1.01] ' + + 'group w-full flex items-center gap-2 px-2 py-1 rounded-md text-[12px] border transform transition duration-base ease-standard text-left ' + (active ? 'border-accent bg-offbase text-accent' : 'border-transparent bg-transparent text-foreground hover:border-accent hover:text-accent') + @@ -65,7 +65,7 @@ function SidebarRow({ > @@ -74,7 +74,7 @@ function SidebarRow({ {label} {typeof count === 'number' && count > 0 && ( {count} @@ -272,7 +272,7 @@ export function FinderSidebar({ rightSlot={( @@ -280,10 +280,10 @@ export function FinderSidebar({ @@ -370,7 +370,7 @@ export function FinderSidebar({ onPointerMove={onResizeMove} onPointerUp={onResizeEnd} onPointerCancel={onResizeEnd} - className="hidden md:block absolute top-0 right-0 h-full w-1 cursor-col-resize hover:bg-offbase active:bg-accent transition-colors duration-200 ease-out" + className="hidden md:block absolute top-0 right-0 h-full w-1 cursor-col-resize hover:bg-offbase active:bg-accent transition-colors duration-base ease-standard" /> ); diff --git a/src/components/doclist/window/FinderToolbar.tsx b/src/components/doclist/window/FinderToolbar.tsx index 4e57f18..cf461b5 100644 --- a/src/components/doclist/window/FinderToolbar.tsx +++ b/src/components/doclist/window/FinderToolbar.tsx @@ -54,7 +54,7 @@ const ICON_SIZES: Array<{ value: IconSize; label: string }> = [ // Match SettingsModal / UserMenu trigger sizing exactly so all bar buttons share one rhythm. const TOOLBAR_BTN = - 'inline-flex items-center py-1 px-2 rounded-md border bg-base text-xs transition-all duration-200 ease-out hover:scale-[1.01]'; + 'inline-flex items-center py-1 px-2 rounded-md border bg-base text-xs transition duration-base ease-standard'; const TOOLBAR_BTN_INACTIVE = 'border-offbase text-foreground hover:text-accent hover:border-accent hover:bg-offbase'; const TOOLBAR_BTN_ACTIVE = 'border-accent bg-offbase text-accent'; @@ -64,7 +64,7 @@ const TOOLBAR_BTN_ACTIVE = 'border-accent bg-offbase text-accent'; // matches the height of a standalone TOOLBAR_BTN. const PILL = 'inline-flex items-center rounded-md border border-offbase bg-base p-0.5 gap-0.5 shrink-0'; const PILL_SEGMENT = - 'inline-flex items-center justify-center rounded-[5px] text-xs transition-colors duration-200 ease-out'; + 'inline-flex items-center justify-center rounded-[5px] text-xs transition-colors duration-base ease-standard'; const PILL_SEGMENT_INACTIVE = 'text-muted hover:bg-offbase hover:text-accent'; const PILL_SEGMENT_ACTIVE = 'bg-offbase text-accent'; @@ -133,7 +133,7 @@ export function FinderToolbar({ {isIconsToggle && viewMode === 'icons' && (
{ICON_SIZES.map(({ value: sizeValue, label: sizeLabel }) => { @@ -204,7 +204,7 @@ export function FinderToolbar({
-
+
@@ -81,10 +81,10 @@ export function FinderWindow({
diff --git a/src/components/documents/DexieMigrationModal.tsx b/src/components/documents/DexieMigrationModal.tsx index be7bd30..96ade51 100644 --- a/src/components/documents/DexieMigrationModal.tsx +++ b/src/components/documents/DexieMigrationModal.tsx @@ -140,10 +140,10 @@ export function DexieMigrationModal({ (closeDisabled ? null : onComplete())}> @@ -154,14 +154,14 @@ export function DexieMigrationModal({
- + {title} @@ -192,7 +192,7 @@ export function DexieMigrationModal({ className="inline-flex justify-center rounded-lg bg-background px-3 py-1.5 text-sm font-medium text-foreground hover:bg-offbase focus:outline-none focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-2 - transform transition-transform duration-200 ease-in-out hover:scale-[1.04] hover:text-accent + transform transition-transform duration-base ease-standard hover:text-accent disabled:opacity-50" > Skip @@ -203,7 +203,7 @@ export function DexieMigrationModal({ className="inline-flex justify-center rounded-lg bg-accent px-3 py-1.5 text-sm font-medium text-background hover:bg-secondary-accent focus:outline-none focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-2 - transform transition-transform duration-200 ease-in-out hover:scale-[1.04] hover:text-background + transform transition-transform duration-base ease-standard hover:text-background disabled:opacity-50" > {isUploading ? 'Uploading…' : 'Upload'} diff --git a/src/components/documents/DocumentHeaderMenu.tsx b/src/components/documents/DocumentHeaderMenu.tsx index fc12776..ca8c6e3 100644 --- a/src/components/documents/DocumentHeaderMenu.tsx +++ b/src/components/documents/DocumentHeaderMenu.tsx @@ -49,7 +49,7 @@ export function DocumentHeaderMenu({ {onOpenSegments && ( )} {showAudiobookExport && onOpenAudiobook && ( )}
@@ -95,17 +95,17 @@ export function DocumentHeaderMenu({
- + diff --git a/src/components/documents/DocumentSelectionModal.tsx b/src/components/documents/DocumentSelectionModal.tsx index 9d6faa4..1ee240b 100644 --- a/src/components/documents/DocumentSelectionModal.tsx +++ b/src/components/documents/DocumentSelectionModal.tsx @@ -118,10 +118,10 @@ export function DocumentSelectionModal({ @@ -132,14 +132,14 @@ export function DocumentSelectionModal({
- + {variant === 'compact' ? (
- + {isUploading ? (

Uploading…

) : isConverting ? ( diff --git a/src/components/documents/ZoomControl.tsx b/src/components/documents/ZoomControl.tsx index b0d6a04..d220b4d 100644 --- a/src/components/documents/ZoomControl.tsx +++ b/src/components/documents/ZoomControl.tsx @@ -22,7 +22,7 @@ export function ZoomControl({ className={buttonClass({ variant: 'ghost', size: 'icon', - className: 'h-6 w-6 text-sm leading-none hover:scale-[1.09]', + className: 'h-6 w-6 text-sm leading-none', })} aria-label="Zoom out" > @@ -36,7 +36,7 @@ export function ZoomControl({ className={buttonClass({ variant: 'ghost', size: 'icon', - className: 'h-6 w-6 text-sm leading-none hover:scale-[1.09]', + className: 'h-6 w-6 text-sm leading-none', })} aria-label="Zoom in" > diff --git a/src/components/formPrimitives.tsx b/src/components/formPrimitives.tsx index 687fb7a..c42c3b4 100644 --- a/src/components/formPrimitives.tsx +++ b/src/components/formPrimitives.tsx @@ -39,7 +39,7 @@ export const inputClass = 'w-full rounded-md bg-background border border-offbase px-2.5 py-1.5 text-sm text-foreground focus:outline-none focus:ring-2 focus:ring-accent'; export const listboxButtonClass = - 'relative w-full cursor-pointer rounded-md bg-background border border-offbase py-1.5 pl-2.5 pr-9 text-left text-sm text-foreground focus:outline-none focus:ring-2 focus:ring-accent hover:bg-base transition-transform duration-200 ease-out hover:scale-[1.01]'; + 'relative w-full cursor-pointer rounded-md bg-background border border-offbase py-1.5 pl-2.5 pr-9 text-left text-sm text-foreground focus:outline-none focus:ring-2 focus:ring-accent hover:bg-base transition-colors duration-fast ease-standard'; export const listboxOptionsClass = 'z-50 w-[var(--button-width)] max-h-60 overflow-y-auto overscroll-contain rounded-md bg-background p-1 shadow-lg ring-1 ring-offbase focus:outline-none [--anchor-gap:0.25rem]'; export const listboxOptionClass = (active: boolean) => @@ -48,10 +48,10 @@ export const listboxOptionClass = (active: boolean) => export const segmentedGroupClass = 'grid gap-1 rounded-full border border-offbase bg-background p-1'; export const segmentedButtonClass = (active: boolean) => - `rounded-full px-2.5 py-1.5 text-xs font-medium transition-colors transition-transform duration-200 ease-out focus:outline-none focus-visible:ring-2 focus-visible:ring-accent ${ + `rounded-full px-2.5 py-1.5 text-xs font-medium transition-colors duration-fast ease-standard focus:outline-none focus-visible:ring-2 focus-visible:ring-accent ${ active - ? 'bg-accent text-background hover:scale-[1.01]' - : 'text-muted hover:bg-base hover:text-foreground hover:scale-[1.02]' + ? 'bg-accent text-background' + : 'text-muted hover:bg-base hover:text-foreground' }`; export function Section({ @@ -108,7 +108,7 @@ export function Card({ className?: string; }) { return ( -
+
{children}
); @@ -159,13 +159,13 @@ export function Switch({ aria-describedby={ariaDescribedBy} disabled={disabled} onClick={() => onChange(!checked)} - className={`relative inline-flex shrink-0 cursor-pointer items-center rounded-full border border-offbase transition-colors duration-200 ease-out focus:outline-none focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed ${s.track} ${ + className={`relative inline-flex shrink-0 cursor-pointer items-center rounded-full border border-offbase transition-colors duration-fast ease-standard focus:outline-none focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed ${s.track} ${ checked ? 'bg-accent' : 'bg-offbase' }`} >