diff --git a/apps/demo/src/demo-banner.tsx b/apps/demo/src/demo-banner.tsx index 65baf0c2..8cab7c42 100644 --- a/apps/demo/src/demo-banner.tsx +++ b/apps/demo/src/demo-banner.tsx @@ -14,7 +14,7 @@ export function DemoBanner() { href="https://docs.snapotter.com/guide/getting-started" target="_blank" rel="noopener noreferrer" - className="font-semibold underline underline-offset-2 hover:text-primary-subtle" + className="font-semibold underline underline-offset-2 hover:no-underline" > Self-host SnapOtter {" "} @@ -23,7 +23,7 @@ export function DemoBanner() { ))} @@ -273,7 +273,7 @@ const safeStringsJson = JSON.stringify(toolGridStrings).replace(/ {t(locale, "home.toolGrid.reset")} @@ -304,7 +304,7 @@ const safeStringsJson = JSON.stringify(toolGridStrings).replace(/ {workflow.label} - {workflow.metric} + {workflow.metric} {workflow.description} @@ -411,13 +411,13 @@ const safeStringsJson = JSON.stringify(toolGridStrings).replace(/ {t(locale, "home.toolGrid.requestTool")} {t(locale, "home.toolGrid.requestSuffix")} - + {t(locale, "home.toolGrid.browseCatalog")} ${escapeHtml(reason)}` + ? `${escapeHtml(reason)}` : ""; return ` @@ -580,7 +580,7 @@ const safeStringsJson = JSON.stringify(toolGridStrings).replace(/ { const inner = (
-

+

{stat.value}

{stat.label}

diff --git a/apps/landing/src/pages/404.astro b/apps/landing/src/pages/404.astro index 954b8770..55441274 100644 --- a/apps/landing/src/pages/404.astro +++ b/apps/landing/src/pages/404.astro @@ -19,7 +19,7 @@ const locale = "en";
-

{t(locale, "notFound.code")}

+

{t(locale, "notFound.code")}

{t(locale, "notFound.title")}

diff --git a/apps/landing/src/pages/[...locale]/alternatives/[slug].astro b/apps/landing/src/pages/[...locale]/alternatives/[slug].astro index d13039db..3841b507 100644 --- a/apps/landing/src/pages/[...locale]/alternatives/[slug].astro +++ b/apps/landing/src/pages/[...locale]/alternatives/[slug].astro @@ -115,7 +115,7 @@ const allJsonLd = [breadcrumbJsonLd, ...(faqJsonLd ? [faqJsonLd] : [])];
- + {alt.category}

@@ -160,7 +160,7 @@ const allJsonLd = [breadcrumbJsonLd, ...(faqJsonLd ? [faqJsonLd] : [])];   - SnapOtter + SnapOtter {alt.competitor} @@ -196,7 +196,7 @@ const allJsonLd = [breadcrumbJsonLd, ...(faqJsonLd ? [faqJsonLd] : [])]; href={source.url} target="_blank" rel="noopener noreferrer" - class="text-primary transition-colors hover:text-primary-dark" + class="text-primary-ink transition-colors hover:text-primary-ink-strong" > {source.label} diff --git a/apps/landing/src/pages/[...locale]/alternatives/index.astro b/apps/landing/src/pages/[...locale]/alternatives/index.astro index f84fee62..e82d7da0 100644 --- a/apps/landing/src/pages/[...locale]/alternatives/index.astro +++ b/apps/landing/src/pages/[...locale]/alternatives/index.astro @@ -91,7 +91,7 @@ const formatReviewDate = (date: string) => href={localizeHref(locale, `/alternatives/${alt.slug}`)} class="group flex flex-col rounded-xl border border-border bg-surface p-6 transition-all hover:border-primary hover:shadow-md" > - {alt.category} + {alt.category} {alt.competitorOpenSource ? t(locale, "altIndex.card.versus", { competitor: alt.competitor }) @@ -103,7 +103,7 @@ const formatReviewDate = (date: string) => {t(locale, "altIndex.card.reviewed", { date: formatReviewDate(alt.lastReviewed) })} - + {t(locale, "altIndex.card.compare")} diff --git a/apps/landing/src/pages/[...locale]/contact.astro b/apps/landing/src/pages/[...locale]/contact.astro index 33338e84..818a5e5f 100644 --- a/apps/landing/src/pages/[...locale]/contact.astro +++ b/apps/landing/src/pages/[...locale]/contact.astro @@ -90,7 +90,7 @@ const subjects = [

- {t(locale, "contact.emailPrefix")} contact@snapotter.com + {t(locale, "contact.emailPrefix")} contact@snapotter.com

diff --git a/apps/landing/src/pages/[...locale]/enterprise.astro b/apps/landing/src/pages/[...locale]/enterprise.astro index 0dd0f824..5489c937 100644 --- a/apps/landing/src/pages/[...locale]/enterprise.astro +++ b/apps/landing/src/pages/[...locale]/enterprise.astro @@ -96,10 +96,10 @@ const permissionMatrix = { }; const storageProviders = [ - { name: t(locale, "enterprise.storage.provider.awsS3"), color: "text-[#FF9900]" }, + { name: t(locale, "enterprise.storage.provider.awsS3"), color: "text-[#996306]" }, { name: t(locale, "enterprise.storage.provider.minio"), color: "text-[#C72C48]" }, - { name: t(locale, "enterprise.storage.provider.r2"), color: "text-[#F6821F]" }, - { name: t(locale, "enterprise.storage.provider.local"), color: "text-primary" }, + { name: t(locale, "enterprise.storage.provider.r2"), color: "text-[#B45309]" }, + { name: t(locale, "enterprise.storage.provider.local"), color: "text-primary-ink" }, ]; const deploymentTargets = [ @@ -273,10 +273,10 @@ const xSvg =
- {t(locale, "enterprise.identity.supportedProviders")} + {t(locale, "enterprise.identity.supportedProviders")}
{identityProviders.map((provider) => ( - + {provider} @@ -286,7 +286,7 @@ const xSvg = - {t(locale, "enterprise.identity.mfaEnforced")} + {t(locale, "enterprise.identity.mfaEnforced")}
@@ -304,7 +304,7 @@ const xSvg =
- {t(locale, "enterprise.permissions.matrix")} + {t(locale, "enterprise.permissions.matrix")} @@ -407,7 +407,7 @@ const xSvg = diff --git a/apps/landing/src/pages/[...locale]/privacy.astro b/apps/landing/src/pages/[...locale]/privacy.astro index 8bbd89b0..84829c85 100644 --- a/apps/landing/src/pages/[...locale]/privacy.astro +++ b/apps/landing/src/pages/[...locale]/privacy.astro @@ -131,7 +131,7 @@ const breadcrumbJsonLd = { {t(locale, "privacy.contact.pre")} contact@snapotter.com . diff --git a/apps/landing/src/pages/[...locale]/terms.astro b/apps/landing/src/pages/[...locale]/terms.astro index 5632c8e5..0ba66fba 100644 --- a/apps/landing/src/pages/[...locale]/terms.astro +++ b/apps/landing/src/pages/[...locale]/terms.astro @@ -80,7 +80,7 @@ const breadcrumbJsonLd = { {t(locale, "terms.license.item4.pre")} contact@snapotter.com @@ -134,7 +134,7 @@ const breadcrumbJsonLd = { {t(locale, "terms.contact.pre")} contact@snapotter.com . diff --git a/apps/landing/src/pages/[...locale]/tools/[section]/index.astro b/apps/landing/src/pages/[...locale]/tools/[section]/index.astro index 9f0e08c3..887c0067 100644 --- a/apps/landing/src/pages/[...locale]/tools/[section]/index.astro +++ b/apps/landing/src/pages/[...locale]/tools/[section]/index.astro @@ -104,7 +104,7 @@ const toolDesc = (id: string, fallback: string) => toolStrings[id]?.description
{toolName(tool.id, tool.name)}

{toolDesc(tool.id, tool.description)}

- + {t(locale, "common.learnMore")} diff --git a/apps/landing/src/pages/[...locale]/tools/index.astro b/apps/landing/src/pages/[...locale]/tools/index.astro index 29143411..2eb11f65 100644 --- a/apps/landing/src/pages/[...locale]/tools/index.astro +++ b/apps/landing/src/pages/[...locale]/tools/index.astro @@ -173,7 +173,7 @@ const collectionJsonLd = { data-modality={m.id} class:list={[ "tools-mod-btn shrink-0 rounded-full px-4 py-1.5 text-sm font-medium transition-colors", - m.id === "all" ? "bg-primary text-white" : "border border-border bg-surface hover:bg-background-alt", + m.id === "all" ? "bg-primary text-foreground" : "border border-border bg-surface hover:bg-background-alt", ]} > {m.label} ({m.count}) @@ -263,7 +263,7 @@ const collectionJsonLd = {

{toolDesc(tool.id, tool.description)}

- + {t(locale, "common.learnMore")} @@ -341,7 +341,7 @@ const collectionJsonLd = { const on = b.getAttribute("data-modality") === activeMod; b.className = "tools-mod-btn shrink-0 rounded-full px-4 py-1.5 text-sm font-medium transition-colors " + - (on ? "bg-primary text-white" : "border border-border bg-surface hover:bg-background-alt"); + (on ? "bg-primary text-foreground" : "border border-border bg-surface hover:bg-background-alt"); } }; diff --git a/apps/landing/src/pages/self-hosted/[slug].astro b/apps/landing/src/pages/self-hosted/[slug].astro index 576dca17..75387ffb 100644 --- a/apps/landing/src/pages/self-hosted/[slug].astro +++ b/apps/landing/src/pages/self-hosted/[slug].astro @@ -81,7 +81,7 @@ const allJsonLd = [breadcrumbJsonLd, ...(faqJsonLd ? [faqJsonLd] : [])];

{uc.h1}

{uc.intro}

{uc.isAiBundle && ( -

+

Local AI, one-time bundle install

)} @@ -119,12 +119,12 @@ const allJsonLd = [breadcrumbJsonLd, ...(faqJsonLd ? [faqJsonLd] : [])];
{uc.toolRoutes.map((route, i) => ( - + Open the {uc.toolIds[i]} tool ))} {alt && ( - + Compare with {alt.competitor} )} @@ -135,7 +135,7 @@ const allJsonLd = [breadcrumbJsonLd, ...(faqJsonLd ? [faqJsonLd] : [])]; {uc.sources.map((s, i) => ( {i > 0 && ", "} - {s.label} + {s.label} ))}

diff --git a/apps/landing/src/pages/self-hosted/index.astro b/apps/landing/src/pages/self-hosted/index.astro index 8a0ef66a..586aa955 100644 --- a/apps/landing/src/pages/self-hosted/index.astro +++ b/apps/landing/src/pages/self-hosted/index.astro @@ -32,7 +32,7 @@ const description = {uc.h1} {uc.intro} - Read more → + Read more → ))}
diff --git a/apps/landing/src/pages/tools/[section]/[tool].astro b/apps/landing/src/pages/tools/[section]/[tool].astro index 8f9c6527..e1537710 100644 --- a/apps/landing/src/pages/tools/[section]/[tool].astro +++ b/apps/landing/src/pages/tools/[section]/[tool].astro @@ -340,7 +340,7 @@ const allJsonLd = [breadcrumbJsonLd, softwareJsonLd]; /> {t.name}

{t.description}

- + Learn more diff --git a/apps/landing/src/styles/globals.css b/apps/landing/src/styles/globals.css index a8eeb609..0de88808 100644 --- a/apps/landing/src/styles/globals.css +++ b/apps/landing/src/styles/globals.css @@ -35,6 +35,8 @@ html { --color-primary-light: #F09550; --color-primary-dark: #C06520; --color-primary-subtle: #FFF5ED; + --color-primary-ink: #A85518; + --color-primary-ink-strong: #8F4712; /* Neutrals -- Warm Cream & Stone (sandy riverbank) */ --color-background: #FAFAF7; @@ -59,8 +61,8 @@ html { --color-terminal-green: #4ADE80; /* Semantic */ - --color-success: #2D9D78; - --color-danger: #D44C47; + --color-success: #1E7B5C; + --color-danger: #BE3A35; /* Fonts */ --font-display: "Bricolage Grotesque", system-ui, sans-serif; @@ -281,7 +283,7 @@ code, pre, kbd { /* ─── BUTTONS ─── */ .btn-primary { background: linear-gradient(135deg, var(--color-primary) 0%, var(--color-primary-light) 100%); - color: white; + color: var(--color-foreground); transition: box-shadow 0.2s, transform 0.1s; } .btn-primary:hover { @@ -318,7 +320,7 @@ code, pre, kbd { .code-block .code-string { color: #C3E88D; } .code-block .code-flag { color: #82AAFF; } .code-block .code-url { color: #89DDFF; } -.code-block .code-comment { color: #546E7A; } +.code-block .code-comment { color: #7E99A8; } /* ─── SECTION DIVIDER ─── */ .section-divider { @@ -343,7 +345,7 @@ code, pre, kbd { z-index: 100; padding: 0.5rem 1rem; background: var(--color-primary); - color: white; + color: var(--color-foreground); border-radius: 0 0 0.5rem 0.5rem; transition: top 0.2s; } diff --git a/apps/web/src/components/automate/template-card.tsx b/apps/web/src/components/automate/template-card.tsx index 877aff8e..c4f31f5e 100644 --- a/apps/web/src/components/automate/template-card.tsx +++ b/apps/web/src/components/automate/template-card.tsx @@ -32,7 +32,7 @@ export function TemplateCard({ template, onUse }: TemplateCardProps) { className="text-start" data-testid={`template-use-${template.id}`} > - {name} + {name} {description ? ( {description} ) : null} diff --git a/apps/web/src/components/common/before-after-slider.tsx b/apps/web/src/components/common/before-after-slider.tsx index 95974730..1516745b 100644 --- a/apps/web/src/components/common/before-after-slider.tsx +++ b/apps/web/src/components/common/before-after-slider.tsx @@ -302,7 +302,7 @@ export function BeforeAfterSlider({ Original: {formatSize(beforeSize)} - + Processed: {formatSize(afterSize)} {savingsPercent !== null && Number(savingsPercent) > 0 && ( ({savingsPercent}% smaller) diff --git a/apps/web/src/components/common/collapsible-section.tsx b/apps/web/src/components/common/collapsible-section.tsx index d538dd55..e08853bd 100644 --- a/apps/web/src/components/common/collapsible-section.tsx +++ b/apps/web/src/components/common/collapsible-section.tsx @@ -29,7 +29,9 @@ export function CollapsibleSection({ )} {title} - {warning && } + {warning && ( + + )} {badge && ( {badge} diff --git a/apps/web/src/components/common/dropzone.tsx b/apps/web/src/components/common/dropzone.tsx index 1c451531..20a918f1 100644 --- a/apps/web/src/components/common/dropzone.tsx +++ b/apps/web/src/components/common/dropzone.tsx @@ -334,7 +334,7 @@ export function Dropzone({ e.stopPropagation(); setShowBulkModal(true); }} - className="text-xs text-primary hover:text-primary/80" + className="text-xs text-primary-ink hover:text-primary-ink-strong" > {t.dropzone.importMultipleUrls} @@ -343,7 +343,7 @@ export function Dropzone({ {hasMultipleFiles && (
- + {currentFiles.length} files selected diff --git a/apps/web/src/components/common/image-viewer.tsx b/apps/web/src/components/common/image-viewer.tsx index 02e0fe52..648cf06c 100644 --- a/apps/web/src/components/common/image-viewer.tsx +++ b/apps/web/src/components/common/image-viewer.tsx @@ -224,7 +224,7 @@ export function ImageViewer({
diff --git a/apps/web/src/components/common/review-panel.tsx b/apps/web/src/components/common/review-panel.tsx index 52e98443..cee1b988 100644 --- a/apps/web/src/components/common/review-panel.tsx +++ b/apps/web/src/components/common/review-panel.tsx @@ -123,14 +123,14 @@ export function ReviewPanel({ {/* Success indicator */}
- + {t.toolPage.conversionComplete}
{/* Batch partial failure summary */} {hasBatchStats && failedCount > 0 && (
- + {format(t.toolPage.batchPartialSuccess, { success: successCount, @@ -157,7 +157,7 @@ export function ReviewPanel({ {sizeDelta > 0 && (
{t.toolPage.saved} - {sizeDelta}% + {sizeDelta}%
)}
@@ -173,7 +173,7 @@ export function ReviewPanel({ @@ -200,7 +200,7 @@ export function ReviewPanel({ {/* Result already auto-saved to the library: show where it went instead of the manual save link (avoids duplicate saves). */} {!isDataOutput && savedLibraryFileId && ( -
+
{t.toolPage.savedToFiles} @@ -219,7 +219,7 @@ export function ReviewPanel({ className={cn( "text-xs flex items-center gap-1.5 transition-colors", saveStatus === "saved" - ? "text-emerald-600 dark:text-emerald-400" + ? "text-success-ink" : "text-muted-foreground hover:text-foreground disabled:opacity-50", )} > @@ -271,7 +271,7 @@ export function ReviewPanel({
{t.toolPage.backToTools} diff --git a/apps/web/src/components/common/side-by-side-comparison.tsx b/apps/web/src/components/common/side-by-side-comparison.tsx index bf0e18dc..c3e94f9f 100644 --- a/apps/web/src/components/common/side-by-side-comparison.tsx +++ b/apps/web/src/components/common/side-by-side-comparison.tsx @@ -92,7 +92,7 @@ export function SideBySideComparison({ {/* Size savings */} {savingsPercent !== null && (

0 ? "text-green-600 dark:text-green-400" : "text-red-500"}`} + className={`text-sm font-medium ${Number(savingsPercent) > 0 ? "text-success-ink" : "text-destructive-ink"}`} > {Number(savingsPercent) > 0 ? format(t.toolSettings["optimize-for-web"].smaller, { percent: savingsPercent }) diff --git a/apps/web/src/components/common/tool-card.tsx b/apps/web/src/components/common/tool-card.tsx index 5dfa0436..49fe5ee6 100644 --- a/apps/web/src/components/common/tool-card.tsx +++ b/apps/web/src/components/common/tool-card.tsx @@ -59,6 +59,16 @@ const SECTION_COLOR_MAP: Record = Object.fromEntries( SECTIONS.map((s) => [s.id, s.color]), ); +// Darkened per-section text colors: the vivid section colors sit below the +// WCAG AA 4.5:1 floor as small text on the 12.5% tint chips (issue #557). +const SECTION_INK_MAP: Record = { + image: "#0B61ED", + video: "#D31212", + audio: "#0B7C57", + pdf: "#7942F5", + files: "#996306", +}; + export function ToolCard({ tool, variant = "compact", @@ -95,7 +105,7 @@ export function ToolCard({ className="text-[10px] px-1.5 py-0.5 rounded-full font-medium shrink-0" style={{ backgroundColor: `${sectionColor}20`, - color: sectionColor, + color: SECTION_INK_MAP[section] ?? "#3D3832", }} > {SECTIONS.find((s) => s.id === section)?.name ?? section} @@ -139,7 +149,7 @@ export function ToolCard({ {sectionBadge} {tool.experimental && ( - + {t.common.experimental} )} @@ -178,7 +188,7 @@ export function ToolCard({ {sectionBadge} {tool.experimental && ( - + {t.common.experimental} )} diff --git a/apps/web/src/components/common/url-import-modal.tsx b/apps/web/src/components/common/url-import-modal.tsx index af010bb8..68389f4e 100644 --- a/apps/web/src/components/common/url-import-modal.tsx +++ b/apps/web/src/components/common/url-import-modal.tsx @@ -22,7 +22,7 @@ function StatusIcon({ status }: { status: UrlImportEntry["status"] }) { case "fetching": return ; case "ready": - return ; + return ; case "failed": return ; } diff --git a/apps/web/src/components/common/zoom-toolbar.tsx b/apps/web/src/components/common/zoom-toolbar.tsx index 30c2ee1a..582bdaad 100644 --- a/apps/web/src/components/common/zoom-toolbar.tsx +++ b/apps/web/src/components/common/zoom-toolbar.tsx @@ -94,7 +94,7 @@ export function ZoomToolbar({ title={t.a11y.pan} aria-label={t.a11y.pan} aria-pressed={handToolActive} - className={`${btn} ${handToolActive ? "bg-primary/10 text-primary hover:text-primary" : ""}`} + className={`${btn} ${handToolActive ? "bg-primary/10 text-primary-ink hover:text-primary-ink" : ""}`} > diff --git a/apps/web/src/components/editor/common/export-dialog.tsx b/apps/web/src/components/editor/common/export-dialog.tsx index b029cab1..54ba86d2 100644 --- a/apps/web/src/components/editor/common/export-dialog.tsx +++ b/apps/web/src/components/editor/common/export-dialog.tsx @@ -568,7 +568,7 @@ export function ExportDialog({ onClose }: { onClose: () => void }) { height: canvasSize.height, })) } - className="mt-1 text-[10px] text-primary hover:underline" + className="mt-1 text-[10px] text-primary-ink hover:underline" > Reset to original size ({canvasSize.width} x {canvasSize.height}) @@ -826,7 +826,7 @@ export function AutosaveRecoveryBanner({ return (

- + Recovered unsaved work from {timeStr}.
)} diff --git a/apps/web/src/components/editor/panels/history-panel.tsx b/apps/web/src/components/editor/panels/history-panel.tsx index acefcfab..5bfcacf4 100644 --- a/apps/web/src/components/editor/panels/history-panel.tsx +++ b/apps/web/src/components/editor/panels/history-panel.tsx @@ -210,7 +210,7 @@ export function HistoryPanel() { className={cn( "flex items-center gap-2 w-full px-2 py-1.5 text-start text-xs transition-colors", isCurrent && "bg-primary/10 text-foreground font-medium", - isFuture && "text-muted-foreground/40", + isFuture && "text-muted-foreground", !isCurrent && !isFuture && "text-muted-foreground hover:bg-muted hover:text-foreground", diff --git a/apps/web/src/components/editor/panels/layers-panel.tsx b/apps/web/src/components/editor/panels/layers-panel.tsx index 9d5c8082..cb484d16 100644 --- a/apps/web/src/components/editor/panels/layers-panel.tsx +++ b/apps/web/src/components/editor/panels/layers-panel.tsx @@ -653,7 +653,7 @@ function LayerContextMenu({ item.disabled ? "text-muted-foreground/40 cursor-not-allowed" : "text-foreground hover:bg-muted", - item.label === "Delete" && !item.disabled && "text-red-500", + item.label === "Delete" && !item.disabled && "text-destructive-ink", )} > diff --git a/apps/web/src/components/features/feature-install-prompt.tsx b/apps/web/src/components/features/feature-install-prompt.tsx index d00a5f46..c70bfa1d 100644 --- a/apps/web/src/components/features/feature-install-prompt.tsx +++ b/apps/web/src/components/features/feature-install-prompt.tsx @@ -218,7 +218,7 @@ export function FeatureInstallPrompt({ const statusClass = isCandidateInstalled ? "bg-emerald-500/10 text-emerald-700 dark:text-emerald-300" : isCandidateInstalling || isCandidateQueued - ? "bg-primary/10 text-primary" + ? "bg-primary/10 text-primary-ink" : candidate.status === "error" ? "bg-destructive/10 text-destructive" : "bg-muted text-muted-foreground"; diff --git a/apps/web/src/components/feedback/feedback-dialog.tsx b/apps/web/src/components/feedback/feedback-dialog.tsx index ec8a3376..0de8a67f 100644 --- a/apps/web/src/components/feedback/feedback-dialog.tsx +++ b/apps/web/src/components/feedback/feedback-dialog.tsx @@ -241,14 +241,14 @@ export function FeedbackDialog({ href={buildToolRequestDiscussionUrl(searchQuery ?? "")} target="_blank" rel="noopener noreferrer" - className="text-primary hover:underline" + className="text-primary-ink hover:underline" > {t.feedback.searchMissDiscussionsFallback}

) : (
- +

{t.feedback.thanksTitle}

{t.feedback.thanksDescription}

@@ -313,7 +313,7 @@ export function FeedbackDialog({ className={cn( "py-2 rounded-lg border text-sm font-medium transition-colors", sentiment === value - ? "border-primary bg-primary/10 text-primary" + ? "border-primary bg-primary/10 text-primary-ink" : "border-border text-muted-foreground hover:bg-muted hover:text-foreground", )} > diff --git a/apps/web/src/components/feedback/tool-feedback-prompt.tsx b/apps/web/src/components/feedback/tool-feedback-prompt.tsx index 6ca3bc8a..5442f3e1 100644 --- a/apps/web/src/components/feedback/tool-feedback-prompt.tsx +++ b/apps/web/src/components/feedback/tool-feedback-prompt.tsx @@ -194,9 +194,7 @@ export function ToolFeedbackPrompt({
)} - {thanks && ( -

{t.feedback.quickThanks}

- )} + {thanks &&

{t.feedback.quickThanks}

}
-

- {t.files.fileDetailsHeading} -

+

{t.files.fileDetailsHeading}

diff --git a/apps/web/src/components/files/file-list-item.tsx b/apps/web/src/components/files/file-list-item.tsx index 614d19eb..86a0150c 100644 --- a/apps/web/src/components/files/file-list-item.tsx +++ b/apps/web/src/components/files/file-list-item.tsx @@ -69,7 +69,7 @@ export function FileListItem({ file, disabled }: FileListItemProps) { {/* Tool chain */} {file.toolChain.length > 0 && ( - + {file.toolChain.map(toolName).join(" → ")} )} diff --git a/apps/web/src/components/files/file-upload-area.tsx b/apps/web/src/components/files/file-upload-area.tsx index b9285c6e..285dd88b 100644 --- a/apps/web/src/components/files/file-upload-area.tsx +++ b/apps/web/src/components/files/file-upload-area.tsx @@ -49,7 +49,7 @@ export function FileUploadArea() {
{uploadProgress !== null && uploadProgress > 0 && ( - {uploadProgress}% + {uploadProgress}% )}
) : ( diff --git a/apps/web/src/components/help/help-dialog.tsx b/apps/web/src/components/help/help-dialog.tsx index b7da0947..3e8ab39d 100644 --- a/apps/web/src/components/help/help-dialog.tsx +++ b/apps/web/src/components/help/help-dialog.tsx @@ -118,7 +118,7 @@ export function HelpDialog({ open, onClose }: HelpDialogProps) { href="https://github.com/snapotter-hq/snapotter" target="_blank" rel="noopener noreferrer" - className="flex items-center gap-1.5 text-sm text-primary hover:underline" + className="flex items-center gap-1.5 text-sm text-primary-ink hover:underline" > {t.help.resources.githubLink} @@ -127,7 +127,7 @@ export function HelpDialog({ open, onClose }: HelpDialogProps) { href="https://github.com/snapotter-hq/snapotter/issues" target="_blank" rel="noopener noreferrer" - className="flex items-center gap-1.5 text-sm text-primary hover:underline" + className="flex items-center gap-1.5 text-sm text-primary-ink hover:underline" > {t.help.resources.reportIssueLink} @@ -136,7 +136,7 @@ export function HelpDialog({ open, onClose }: HelpDialogProps) { href="https://docs.snapotter.com/" target="_blank" rel="noopener noreferrer" - className="flex items-center gap-1.5 text-sm text-primary hover:underline" + className="flex items-center gap-1.5 text-sm text-primary-ink hover:underline" > {t.help.resources.docsLink} @@ -145,7 +145,7 @@ export function HelpDialog({ open, onClose }: HelpDialogProps) { href="/api/docs" target="_blank" rel="noopener noreferrer" - className="flex items-center gap-1.5 text-sm text-primary hover:underline" + className="flex items-center gap-1.5 text-sm text-primary-ink hover:underline" > {t.help.resources.apiRefLink} diff --git a/apps/web/src/components/layout/top-nav.tsx b/apps/web/src/components/layout/top-nav.tsx index 70f420f3..c478092f 100644 --- a/apps/web/src/components/layout/top-nav.tsx +++ b/apps/web/src/components/layout/top-nav.tsx @@ -79,6 +79,7 @@ export function TopNav({
{breadcrumb.modalityTab ? ( @@ -204,7 +205,7 @@ export function TopNav({ {link.label} {link.badge && ( - + {link.badge} )} diff --git a/apps/web/src/components/onboarding/usage-survey-overlay.tsx b/apps/web/src/components/onboarding/usage-survey-overlay.tsx index 0554e263..1b74c20b 100644 --- a/apps/web/src/components/onboarding/usage-survey-overlay.tsx +++ b/apps/web/src/components/onboarding/usage-survey-overlay.tsx @@ -205,7 +205,7 @@ export function UsageSurveyOverlay() { className={cn( "flex items-center gap-2 rounded-lg border px-3 py-2.5 text-sm font-medium text-start transition-colors", usageType === value - ? "border-primary bg-primary/10 text-primary" + ? "border-primary bg-primary/10 text-primary-ink" : "border-border text-foreground hover:bg-muted", wide && "col-span-2 justify-center", )} @@ -238,7 +238,7 @@ export function UsageSurveyOverlay() { className={cn( "flex items-center gap-2 rounded-lg border px-3 py-2.5 text-sm font-medium text-start transition-colors", importantAreas.includes(value) - ? "border-primary bg-primary/10 text-primary" + ? "border-primary bg-primary/10 text-primary-ink" : "border-border text-foreground hover:bg-muted", wide && "col-span-2 justify-center", )} @@ -270,7 +270,7 @@ export function UsageSurveyOverlay() { className={cn( "rounded-lg border px-3 py-2.5 text-sm font-medium text-start transition-colors", installMethod === value - ? "border-primary bg-primary/10 text-primary" + ? "border-primary bg-primary/10 text-primary-ink" : "border-border text-foreground hover:bg-muted", )} > diff --git a/apps/web/src/components/settings/ai-features-section.tsx b/apps/web/src/components/settings/ai-features-section.tsx index 1c86c873..03cabc7f 100644 --- a/apps/web/src/components/settings/ai-features-section.tsx +++ b/apps/web/src/components/settings/ai-features-section.tsx @@ -405,7 +405,7 @@ function ImportBundleSection({ onImported }: { onImported: () => void }) {

{feedback.message}

diff --git a/apps/web/src/components/settings/settings-dialog.tsx b/apps/web/src/components/settings/settings-dialog.tsx index ea6665b2..81405b13 100644 --- a/apps/web/src/components/settings/settings-dialog.tsx +++ b/apps/web/src/components/settings/settings-dialog.tsx @@ -437,7 +437,7 @@ function GeneralSection() { {/* User info */}
-
+
{loading ? ( ) : ( @@ -516,9 +516,7 @@ function GeneralSection() { {saveMsg} @@ -837,9 +835,7 @@ function SystemSection() { {saveMsg} @@ -1045,9 +1041,7 @@ function SecuritySection() { role="alert" className={cn( "text-sm", - message.type === "error" - ? "text-destructive" - : "text-green-600 dark:text-green-400", + message.type === "error" ? "text-destructive" : "text-success-ink", )} > {message.text} @@ -1347,7 +1341,7 @@ export function AdminSecuritySettings() { {saveMsg.text} @@ -1614,7 +1608,7 @@ function PeopleSection() { "text-sm px-3 py-2 rounded-lg", actionMsg.type === "error" ? "bg-destructive/10 text-destructive" - : "bg-green-500/10 text-green-600 dark:text-green-400", + : "bg-green-500/10 text-success-ink", )} > {actionMsg.text} @@ -1715,7 +1709,7 @@ function PeopleSection() { className={cn( "shrink-0 p-2 rounded-lg border border-border transition-colors", pwCopied - ? "text-green-500 bg-green-500/10" + ? "text-success-ink bg-green-500/10" : "text-muted-foreground hover:bg-muted hover:text-foreground", )} title={ @@ -1778,7 +1772,7 @@ function PeopleSection() { setShowGeneratedPw(true); setPwCopied(false); }} - className="flex items-center gap-1.5 px-3 py-2 rounded-lg border border-primary/30 bg-primary/10 text-xs text-primary hover:bg-primary/20 font-medium transition-colors" + className="flex items-center gap-1.5 px-3 py-2 rounded-lg border border-primary/30 bg-primary/10 text-xs text-primary-ink hover:bg-primary/20 font-medium transition-colors" > {t.changePassword.generateButton} @@ -1801,7 +1795,7 @@ function PeopleSection() {
{showGeneratedPw && !pwCopied && ( -

+

{t.settings.people.copyPasswordWarning}

@@ -1894,7 +1888,7 @@ function PeopleSection() { /> @@ -1942,7 +1936,7 @@ function PeopleSection() { {isMobile ? ( <> {/* Mobile card layout */} -
+
{u.username.charAt(0).toUpperCase()}
@@ -1966,7 +1960,7 @@ function PeopleSection() { className={cn( "inline-block px-2 py-0.5 rounded text-xs font-semibold uppercase tracking-wide", u.role === "admin" - ? "bg-primary/15 text-primary" + ? "bg-primary/15 text-primary-ink" : "bg-muted text-muted-foreground", )} > @@ -1980,7 +1974,7 @@ function PeopleSection() { <> {/* Desktop row layout */}
-
+
{u.username.charAt(0).toUpperCase()}
@@ -2004,7 +1998,7 @@ function PeopleSection() { className={cn( "inline-block px-2 py-0.5 rounded text-xs font-semibold uppercase tracking-wide", u.role === "admin" - ? "bg-primary/15 text-primary" + ? "bg-primary/15 text-primary-ink" : "bg-muted text-muted-foreground", )} > @@ -2282,7 +2276,11 @@ function ApiKeysSection() { title="Copy" aria-label={t.common.copy} > - {copied ? : } + {copied ? ( + + ) : ( + + )}

{t.settings.apiKeys.keyWarning}

@@ -2311,7 +2309,7 @@ function ApiKeysSection() {

)} {k.expiresAt && ( - + Expires {new Date(k.expiresAt).toLocaleDateString()} )} @@ -2502,7 +2500,7 @@ function TeamsSection() { "text-sm px-3 py-2 rounded-lg", actionMsg.type === "error" ? "bg-destructive/10 text-destructive" - : "bg-green-500/10 text-green-600 dark:text-green-400", + : "bg-green-500/10 text-success-ink", )} > {actionMsg.text} @@ -2603,7 +2601,7 @@ function TeamsSection() { @@ -2917,7 +2915,7 @@ function RolesSection() { "text-sm px-3 py-2 rounded-lg", actionMsg.type === "error" ? "bg-destructive/10 text-destructive" - : "bg-green-500/10 text-green-600 dark:text-green-400", + : "bg-green-500/10 text-success-ink", )} > {actionMsg.text} @@ -3095,7 +3093,7 @@ function RolesSection() { {t.settings.roles.builtInBadge} )} - + {role.userCount} user{role.userCount !== 1 ? "s" : ""}
@@ -3595,7 +3593,7 @@ function AboutSection() {
- SnapOtter + SnapOtter

{t.settings.about.appDescription}

@@ -3620,7 +3618,7 @@ function AboutSection() { href="https://github.com/snapotter-hq/snapotter" target="_blank" rel="noopener noreferrer" - className="text-sm text-primary hover:underline" + className="text-sm text-primary-ink hover:underline" > {t.settings.about.githubLink} @@ -3628,7 +3626,7 @@ function AboutSection() { href="https://docs.snapotter.com/" target="_blank" rel="noopener noreferrer" - className="text-sm text-primary hover:underline" + className="text-sm text-primary-ink hover:underline" > {t.settings.about.docsLink} @@ -3636,7 +3634,7 @@ function AboutSection() { href="/api/docs" target="_blank" rel="noopener noreferrer" - className="text-sm text-primary hover:underline" + className="text-sm text-primary-ink hover:underline" > {t.settings.about.apiRefLink} diff --git a/apps/web/src/components/settings/two-factor-settings.tsx b/apps/web/src/components/settings/two-factor-settings.tsx index 6c7a2da8..965c2cdc 100644 --- a/apps/web/src/components/settings/two-factor-settings.tsx +++ b/apps/web/src/components/settings/two-factor-settings.tsx @@ -198,7 +198,7 @@ export function TwoFactorSettings() {
- + {row.completed} diff --git a/apps/web/src/components/tools/ai-canvas-expand-settings.tsx b/apps/web/src/components/tools/ai-canvas-expand-settings.tsx index 033b04d7..279d581c 100644 --- a/apps/web/src/components/tools/ai-canvas-expand-settings.tsx +++ b/apps/web/src/components/tools/ai-canvas-expand-settings.tsx @@ -208,7 +208,7 @@ export function AiCanvasExpandSettings() {

)} - {error &&

{error}

} + {error &&

{error}

} {processing ? ( Download diff --git a/apps/web/src/components/tools/aspect-pad-settings.tsx b/apps/web/src/components/tools/aspect-pad-settings.tsx index c822431a..00a84c40 100644 --- a/apps/web/src/components/tools/aspect-pad-settings.tsx +++ b/apps/web/src/components/tools/aspect-pad-settings.tsx @@ -65,7 +65,7 @@ export function AspectPadSettings() {

{s.colorHint}

- {error &&

{error}

} + {error &&

{error}

} {processing ? (
- {error &&

{error}

} + {error &&

{error}

} {processing ? (
- {error &&

{error}

} + {error &&

{error}

} {processing ? (
- {error &&

{error}

} + {error &&

{error}

} {processing ? ( - {error &&

{error}

} + {error &&

{error}

} {/* Result preview */} {resultUrl && ( @@ -147,7 +147,7 @@ export function BarcodeGenerateSettings() { href={resultUrl} download="barcode.png" data-testid="barcode-generate-download" - className="w-full py-2.5 rounded-lg border border-primary text-primary font-medium flex items-center justify-center gap-2 hover:bg-primary/5" + className="w-full py-2.5 rounded-lg border border-primary text-primary-ink font-medium flex items-center justify-center gap-2 hover:bg-primary/5" > {ts.download} diff --git a/apps/web/src/components/tools/barcode-read-settings.tsx b/apps/web/src/components/tools/barcode-read-settings.tsx index 4a4fc3e1..d9b26b4e 100644 --- a/apps/web/src/components/tools/barcode-read-settings.tsx +++ b/apps/web/src/components/tools/barcode-read-settings.tsx @@ -45,11 +45,11 @@ const FORMAT_LABELS: Record = { /** Badge colors by barcode family. */ function getBadgeColor(type: string): string { if (type.includes("QR") || type === "Aztec" || type === "DataMatrix" || type === "MaxiCode") - return "bg-primary/15 text-primary-dark dark:text-primary-light"; + return "bg-primary/15 text-primary-ink"; if (type.includes("EAN") || type.includes("UPC") || type.includes("DataBar")) - return "bg-green-500/15 text-green-600 dark:text-green-400"; + return "bg-green-500/15 text-success-ink"; if (type === "PDF417") return "bg-purple-500/15 text-purple-600 dark:text-purple-400"; - return "bg-amber-500/15 text-amber-600 dark:text-amber-400"; + return "bg-amber-500/15 text-amber-700 dark:text-amber-400"; } function SectionLabel({ children }: { children: React.ReactNode }) { @@ -264,7 +264,7 @@ export function BarcodeReadSettings() { {/* Error */} - {error &&

{error}

} + {error &&

{error}

} {/* Process button / progress */} {processing ? ( @@ -360,7 +360,7 @@ export function BarcodeReadSettings() { title="Copy value" > {copiedIndex === idx ? ( - + ) : ( )} diff --git a/apps/web/src/components/tools/beautify-settings.tsx b/apps/web/src/components/tools/beautify-settings.tsx index 9b2bb70d..0642614a 100644 --- a/apps/web/src/components/tools/beautify-settings.tsx +++ b/apps/web/src/components/tools/beautify-settings.tsx @@ -1374,7 +1374,7 @@ export function BeautifySettings({ onBackgroundImage={handleBgImageChange} /> - {displayError &&

{displayError}

} + {displayError &&

{displayError}

} {processing ? ( Download diff --git a/apps/web/src/components/tools/blur-background-settings.tsx b/apps/web/src/components/tools/blur-background-settings.tsx index a0309872..cbcfbbf9 100644 --- a/apps/web/src/components/tools/blur-background-settings.tsx +++ b/apps/web/src/components/tools/blur-background-settings.tsx @@ -92,7 +92,7 @@ export function BlurBackgroundSettings() { onClick={() => setOutputFormat(fmt)} className={`rounded-lg border py-2 px-2 text-xs font-medium uppercase transition-colors ${ outputFormat === fmt - ? "border-primary bg-primary/10 text-primary" + ? "border-primary bg-primary/10 text-primary-ink" : "border-border text-muted-foreground hover:border-primary/50" }`} > diff --git a/apps/web/src/components/tools/blur-faces-settings.tsx b/apps/web/src/components/tools/blur-faces-settings.tsx index 2d594ef9..2d1ab8c1 100644 --- a/apps/web/src/components/tools/blur-faces-settings.tsx +++ b/apps/web/src/components/tools/blur-faces-settings.tsx @@ -114,9 +114,9 @@ export function BlurFacesSettings() {
- {error &&

{error}

} + {error &&

{error}

} - {warning &&

{warning}

} + {warning &&

{warning}

} {/* Size info */} {originalSize != null && processedSize != null && ( @@ -153,7 +153,7 @@ export function BlurFacesSettings() { href={downloadUrl} download data-testid="blur-faces-download" - className="w-full py-2.5 rounded-lg border border-primary text-primary font-medium flex items-center justify-center gap-2 hover:bg-primary/5" + className="w-full py-2.5 rounded-lg border border-primary text-primary-ink font-medium flex items-center justify-center gap-2 hover:bg-primary/5" > {t.common.download} diff --git a/apps/web/src/components/tools/blur-pad-settings.tsx b/apps/web/src/components/tools/blur-pad-settings.tsx index 797b6f65..8d79cd53 100644 --- a/apps/web/src/components/tools/blur-pad-settings.tsx +++ b/apps/web/src/components/tools/blur-pad-settings.tsx @@ -65,7 +65,7 @@ export function BlurPadSettings() { />
- {error &&

{error}

} + {error &&

{error}

} {processing ? (
- {error &&

{error}

} + {error &&

{error}

} {processing ? ( - {error &&

{error}

} + {error &&

{error}

} {processing ? ( Download diff --git a/apps/web/src/components/tools/bulk-rename-settings.tsx b/apps/web/src/components/tools/bulk-rename-settings.tsx index 0627c78e..e60b008e 100644 --- a/apps/web/src/components/tools/bulk-rename-settings.tsx +++ b/apps/web/src/components/tools/bulk-rename-settings.tsx @@ -119,7 +119,7 @@ export function BulkRenameSettings() {
)} - {error &&

{error}

} + {error &&

{error}

}
- {error &&

{error}

} + {error &&

{error}

} {processing ? (
- {error &&

{error}

} + {error &&

{error}

} {processing ? ( {t.common.download} diff --git a/apps/web/src/components/tools/circle-crop-settings.tsx b/apps/web/src/components/tools/circle-crop-settings.tsx index b4be67cf..30061e79 100644 --- a/apps/web/src/components/tools/circle-crop-settings.tsx +++ b/apps/web/src/components/tools/circle-crop-settings.tsx @@ -238,7 +238,7 @@ export function CircleCropSettings() { />
- {error &&

{error}

} + {error &&

{error}

} {processing ? ( {t.common.download} diff --git a/apps/web/src/components/tools/collage-preview.tsx b/apps/web/src/components/tools/collage-preview.tsx index c4eb7c1a..ad1eacb1 100644 --- a/apps/web/src/components/tools/collage-preview.tsx +++ b/apps/web/src/components/tools/collage-preview.tsx @@ -137,7 +137,7 @@ function UploadArea() {
- {error &&

{error}

} + {error &&

{error}

} {originalSize != null && processedSize != null && (
@@ -158,7 +158,7 @@ export function ColorBlindnessSettings() { href={downloadUrl} download data-testid="color-blindness-download" - className="w-full py-2.5 rounded-lg border border-primary text-primary font-medium flex items-center justify-center gap-2 hover:bg-primary/5" + className="w-full py-2.5 rounded-lg border border-primary text-primary-ink font-medium flex items-center justify-center gap-2 hover:bg-primary/5" > {t.common.download} diff --git a/apps/web/src/components/tools/color-palette-settings.tsx b/apps/web/src/components/tools/color-palette-settings.tsx index ff1be741..250db8b3 100644 --- a/apps/web/src/components/tools/color-palette-settings.tsx +++ b/apps/web/src/components/tools/color-palette-settings.tsx @@ -130,7 +130,7 @@ export function ColorPaletteSettings() { {processing ? ts.extracting : ts.submit} - {error &&

{error}

} + {error &&

{error}

} {colors.length > 0 && (
@@ -157,7 +157,7 @@ export function ColorPaletteSettings() { data-testid="color-palette-copy-css" > {copiedExport === "css" ? ( - + ) : ( )} @@ -170,7 +170,7 @@ export function ColorPaletteSettings() { data-testid="color-palette-copy-json" > {copiedExport === "json" ? ( - + ) : ( )} @@ -196,7 +196,7 @@ export function ColorPaletteSettings() { {color} {copiedIdx === i ? ( - + ) : ( )} diff --git a/apps/web/src/components/tools/color-settings.tsx b/apps/web/src/components/tools/color-settings.tsx index a727fc45..9941b9f6 100644 --- a/apps/web/src/components/tools/color-settings.tsx +++ b/apps/web/src/components/tools/color-settings.tsx @@ -275,7 +275,9 @@ export function ColorControls({ > {channelsOpen ? : } Color Channels - {hasChannelChanges && modified} + {hasChannelChanges && ( + modified + )} {channelsOpen && (
@@ -285,7 +287,7 @@ export function ColorControls({ onChange={setRed} min={0} max={200} - color="text-red-500" + color="text-destructive-ink" />
)} @@ -379,7 +381,7 @@ export function ColorSettings({ toolId, onPreviewFilter }: ColorSettingsProps) {
- {error &&

{error}

} + {error &&

{error}

} {originalSize != null && processedSize != null && (
@@ -414,7 +416,7 @@ export function ColorSettings({ toolId, onPreviewFilter }: ColorSettingsProps) { href={downloadUrl} download data-testid="adjust-colors-download" - className="w-full py-2.5 rounded-lg border border-primary text-primary font-medium flex items-center justify-center gap-2 hover:bg-primary/5" + className="w-full py-2.5 rounded-lg border border-primary text-primary-ink font-medium flex items-center justify-center gap-2 hover:bg-primary/5" > Download diff --git a/apps/web/src/components/tools/colorize-settings.tsx b/apps/web/src/components/tools/colorize-settings.tsx index e11044a7..bc7c6f6f 100644 --- a/apps/web/src/components/tools/colorize-settings.tsx +++ b/apps/web/src/components/tools/colorize-settings.tsx @@ -104,7 +104,7 @@ export function ColorizeSettings() {

- {error &&

{error}

} + {error &&

{error}

} {originalSize != null && processedSize != null && (
@@ -140,7 +140,7 @@ export function ColorizeSettings() { href={downloadUrl} download data-testid="colorize-download" - className="w-full py-2.5 rounded-lg border border-primary text-primary font-medium flex items-center justify-center gap-2 hover:bg-primary/5" + className="w-full py-2.5 rounded-lg border border-primary text-primary-ink font-medium flex items-center justify-center gap-2 hover:bg-primary/5" > Download diff --git a/apps/web/src/components/tools/compare-settings.tsx b/apps/web/src/components/tools/compare-settings.tsx index db7aa6a1..8a0675e3 100644 --- a/apps/web/src/components/tools/compare-settings.tsx +++ b/apps/web/src/components/tools/compare-settings.tsx @@ -72,7 +72,7 @@ export function CompareSettings() {
- {error &&

{error}

} + {error &&

{error}

} {similarity !== null && (
@@ -101,7 +101,7 @@ export function CompareSettings() { href={downloadUrl} download data-testid="compare-download" - className="w-full py-2.5 rounded-lg border border-primary text-primary font-medium flex items-center justify-center gap-2 hover:bg-primary/5" + className="w-full py-2.5 rounded-lg border border-primary text-primary-ink font-medium flex items-center justify-center gap-2 hover:bg-primary/5" > Download Diff Image diff --git a/apps/web/src/components/tools/compose-settings.tsx b/apps/web/src/components/tools/compose-settings.tsx index 4c75c60a..1b17794b 100644 --- a/apps/web/src/components/tools/compose-settings.tsx +++ b/apps/web/src/components/tools/compose-settings.tsx @@ -151,7 +151,7 @@ export function ComposeSettings() {
- {error &&

{error}

} + {error &&

{error}

} {originalSize != null && processedSize != null && (
@@ -176,7 +176,7 @@ export function ComposeSettings() { href={downloadUrl} download data-testid="compose-download" - className="w-full py-2.5 rounded-lg border border-primary text-primary font-medium flex items-center justify-center gap-2 hover:bg-primary/5" + className="w-full py-2.5 rounded-lg border border-primary text-primary-ink font-medium flex items-center justify-center gap-2 hover:bg-primary/5" > Download diff --git a/apps/web/src/components/tools/compress-pdf-settings.tsx b/apps/web/src/components/tools/compress-pdf-settings.tsx index 80289b77..18bddb05 100644 --- a/apps/web/src/components/tools/compress-pdf-settings.tsx +++ b/apps/web/src/components/tools/compress-pdf-settings.tsx @@ -51,15 +51,15 @@ export function CompressPdfSettings() {

{s.bestEffortHint}

)} - {error &&

{error}

} + {error &&

{error}

} {targetMet === false && ( -

+

{format(s.targetMissed, { target: targetLabel, size: achievedLabel })}

)} {targetMet === true && ( -

+

{format(s.targetReached, { target: targetLabel, size: achievedLabel })}

)} diff --git a/apps/web/src/components/tools/compress-settings.tsx b/apps/web/src/components/tools/compress-settings.tsx index fde7e00b..5794e19d 100644 --- a/apps/web/src/components/tools/compress-settings.tsx +++ b/apps/web/src/components/tools/compress-settings.tsx @@ -206,7 +206,7 @@ export function CompressSettings() { {/* Error */} - {error &&

{error}

} + {error &&

{error}

} {/* Size info */} {originalSize != null && processedSize != null && ( @@ -255,7 +255,7 @@ export function CompressSettings() { href={downloadUrl} download data-testid="compress-download" - className="w-full py-2.5 rounded-lg border border-primary text-primary font-medium flex items-center justify-center gap-2 hover:bg-primary/5" + className="w-full py-2.5 rounded-lg border border-primary text-primary-ink font-medium flex items-center justify-center gap-2 hover:bg-primary/5" > {t.common.download} diff --git a/apps/web/src/components/tools/compress-video-settings.tsx b/apps/web/src/components/tools/compress-video-settings.tsx index 80fcbf2d..a5177311 100644 --- a/apps/web/src/components/tools/compress-video-settings.tsx +++ b/apps/web/src/components/tools/compress-video-settings.tsx @@ -65,7 +65,7 @@ export function CompressVideoSettings() {
- {error &&

{error}

} + {error &&

{error}

} {processing ? ( - {error &&

{error}

} + {error &&

{error}

} {processing ? ( Download diff --git a/apps/web/src/components/tools/conversion-preset-settings.tsx b/apps/web/src/components/tools/conversion-preset-settings.tsx index 75217532..ddc1e79b 100644 --- a/apps/web/src/components/tools/conversion-preset-settings.tsx +++ b/apps/web/src/components/tools/conversion-preset-settings.tsx @@ -130,7 +130,7 @@ export function ConversionPresetSettings() {
)} - {error &&

{error}

} + {error &&

{error}

} {processing ? ( {t.common.download} diff --git a/apps/web/src/components/tools/convert-audio-settings.tsx b/apps/web/src/components/tools/convert-audio-settings.tsx index a7bb5a32..cb4196b9 100644 --- a/apps/web/src/components/tools/convert-audio-settings.tsx +++ b/apps/web/src/components/tools/convert-audio-settings.tsx @@ -128,7 +128,7 @@ export function ConvertAudioSettings() {
- {error &&

{error}

} + {error &&

{error}

} {processing ? (
- {error &&

{error}

} + {error &&

{error}

} {processing ? (
- {error &&

{error}

} + {error &&

{error}

} {processing ? ( {/* Error */} - {error &&

{error}

} + {error &&

{error}

} {/* Size info */} {originalSize != null && processedSize != null && ( @@ -213,7 +213,7 @@ export function ConvertSettings() { href={downloadUrl} download data-testid="convert-download" - className="w-full py-2.5 rounded-lg border border-primary text-primary font-medium flex items-center justify-center gap-2 hover:bg-primary/5" + className="w-full py-2.5 rounded-lg border border-primary text-primary-ink font-medium flex items-center justify-center gap-2 hover:bg-primary/5" > {t.common.download} diff --git a/apps/web/src/components/tools/convert-spreadsheet-settings.tsx b/apps/web/src/components/tools/convert-spreadsheet-settings.tsx index ab397363..47d035ae 100644 --- a/apps/web/src/components/tools/convert-spreadsheet-settings.tsx +++ b/apps/web/src/components/tools/convert-spreadsheet-settings.tsx @@ -65,7 +65,7 @@ export function ConvertSpreadsheetSettings() {

{s.hint}

- {error &&

{error}

} + {error &&

{error}

} {processing ? (
- {error &&

{error}

} + {error &&

{error}

} {processing ? ( - {error &&

{error}

} + {error &&

{error}

} {processing ? ( - {error &&

{error}

} + {error &&

{error}

} {processing ? ( {/* Error */} - {error &&

{error}

} + {error &&

{error}

} {/* Process */} {processing ? ( @@ -396,7 +396,7 @@ export function CropSettings({ href={downloadUrl} download data-testid="crop-download" - className="w-full py-2.5 rounded-lg border border-primary text-primary font-medium flex items-center justify-center gap-2 hover:bg-primary/5" + className="w-full py-2.5 rounded-lg border border-primary text-primary-ink font-medium flex items-center justify-center gap-2 hover:bg-primary/5" > {t.common.download} diff --git a/apps/web/src/components/tools/crop-video-settings.tsx b/apps/web/src/components/tools/crop-video-settings.tsx index e343fd28..4d96bbb2 100644 --- a/apps/web/src/components/tools/crop-video-settings.tsx +++ b/apps/web/src/components/tools/crop-video-settings.tsx @@ -88,7 +88,7 @@ export function CropVideoSettings() { /> - {error &&

{error}

} + {error &&

{error}

} {processing ? ( )} - {error &&

{error}

} + {error &&

{error}

} {processing ? ( - {error &&

{error}

} + {error &&

{error}

} {processing ? ( - {error &&

{error}

} + {error &&

{error}

} {processing ? ( {t.common.download} diff --git a/apps/web/src/components/tools/edit-metadata-settings.tsx b/apps/web/src/components/tools/edit-metadata-settings.tsx index 5c48aeb8..f289c474 100644 --- a/apps/web/src/components/tools/edit-metadata-settings.tsx +++ b/apps/web/src/components/tools/edit-metadata-settings.tsx @@ -587,9 +587,9 @@ export function EditMetadataSettings() {
{gpsCoords && (
- +
-

+

Location data found

@@ -659,13 +659,13 @@ export function EditMetadataSettings() { {form.keywords.map((kw) => ( {kw} @@ -783,7 +783,7 @@ export function EditMetadataSettings() { @@ -820,7 +820,7 @@ export function EditMetadataSettings() {

)} - {error &&

{error}

} + {error &&

{error}

} {/* Changes summary */} {hasFile && changes.total > 0 && !processing && ( @@ -866,7 +866,7 @@ export function EditMetadataSettings() { href={downloadUrl} download data-testid="edit-metadata-download" - className="w-full py-2.5 rounded-lg border border-primary text-primary font-medium flex items-center justify-center gap-2 hover:bg-primary/5" + className="w-full py-2.5 rounded-lg border border-primary text-primary-ink font-medium flex items-center justify-center gap-2 hover:bg-primary/5" > Download diff --git a/apps/web/src/components/tools/embed-subtitles-settings.tsx b/apps/web/src/components/tools/embed-subtitles-settings.tsx index aa268ca8..c5f90cfd 100644 --- a/apps/web/src/components/tools/embed-subtitles-settings.tsx +++ b/apps/web/src/components/tools/embed-subtitles-settings.tsx @@ -35,7 +35,7 @@ export function EmbedSubtitlesSettings() {

{s.languageHint}

- {error &&

{error}

} + {error &&

{error}

} {processing ? ( {/* Error */} - {error &&

{error}

} + {error &&

{error}

} {/* Size info */} {originalSize != null && processedSize != null && ( @@ -209,7 +209,7 @@ export function EnhanceFacesSettings() { href={downloadUrl} download data-testid="enhance-faces-download" - className="w-full py-2.5 rounded-lg border border-primary text-primary font-medium flex items-center justify-center gap-2 hover:bg-primary/5" + className="w-full py-2.5 rounded-lg border border-primary text-primary-ink font-medium flex items-center justify-center gap-2 hover:bg-primary/5" > Download diff --git a/apps/web/src/components/tools/epub-convert-settings.tsx b/apps/web/src/components/tools/epub-convert-settings.tsx index c37cfde8..83d0cc89 100644 --- a/apps/web/src/components/tools/epub-convert-settings.tsx +++ b/apps/web/src/components/tools/epub-convert-settings.tsx @@ -49,7 +49,7 @@ export function EpubConvertSettings() {

{s.hint}

- {error &&

{error}

} + {error &&

{error}

} {processing ? ( {error}

} + {error &&

{error}

} {/* Size info */} {currentEntry?.originalSize != null && @@ -621,7 +621,7 @@ export function EraseObjectSettings({ href={currentEntry.processedUrl} download data-testid="erase-object-download" - className="w-full py-2.5 rounded-lg border border-primary text-primary font-medium flex items-center justify-center gap-2 hover:bg-primary/5" + className="w-full py-2.5 rounded-lg border border-primary text-primary-ink font-medium flex items-center justify-center gap-2 hover:bg-primary/5" > Download diff --git a/apps/web/src/components/tools/excel-to-pdf-settings.tsx b/apps/web/src/components/tools/excel-to-pdf-settings.tsx index 6cb8d1f0..290f306d 100644 --- a/apps/web/src/components/tools/excel-to-pdf-settings.tsx +++ b/apps/web/src/components/tools/excel-to-pdf-settings.tsx @@ -25,7 +25,7 @@ export function ExcelToPdfSettings() { return (
- {error &&

{error}

} + {error &&

{error}

} {processing ? (
- {error &&

{error}

} + {error &&

{error}

} {processing ? ( {s.rangeHint}

- {error &&

{error}

} + {error &&

{error}

} {processing ? ( - {error &&

{error}

} + {error &&

{error}

} {processing ? ( - {error &&

{error}

} + {error &&

{error}

} {processing ? ( - {error &&

{error}

} + {error &&

{error}

} {processing ? ( - {error &&

{error}

} + {error &&

{error}

} {busy ? ( Download Favicons ZIP diff --git a/apps/web/src/components/tools/find-duplicates-results.tsx b/apps/web/src/components/tools/find-duplicates-results.tsx index 6e06e1ce..b7b567c5 100644 --- a/apps/web/src/components/tools/find-duplicates-results.tsx +++ b/apps/web/src/components/tools/find-duplicates-results.tsx @@ -27,19 +27,21 @@ function OverviewGrid() {
Duplicate groups: - {results.duplicateGroups.length} + + {results.duplicateGroups.length} +
Unique: - {results.uniqueImages} + {results.uniqueImages}
{results.spaceSaveable > 0 && ( <>
Space saveable: - + {formatFileSize(results.spaceSaveable)}
@@ -50,7 +52,7 @@ function OverviewGrid() { {results.duplicateGroups.length === 0 ? (
- +

No duplicates found

@@ -147,7 +149,7 @@ function DetailComparison() {

- + {Math.max(...group.files.map((f) => f.similarity))}% Similar
@@ -228,7 +230,7 @@ function DetailComparison() { {file.format.toUpperCase()} Similarity {file.similarity}% diff --git a/apps/web/src/components/tools/find-duplicates-settings.tsx b/apps/web/src/components/tools/find-duplicates-settings.tsx index 81bca59a..58b24e77 100644 --- a/apps/web/src/components/tools/find-duplicates-settings.tsx +++ b/apps/web/src/components/tools/find-duplicates-settings.tsx @@ -276,7 +276,7 @@ export function FindDuplicatesSettings() { {activeDesc &&

{activeDesc}

} - {error &&

{error}

} + {error &&

{error}

} {/* Scan button + progress */} {!results && ( @@ -317,16 +317,18 @@ export function FindDuplicatesSettings() {
Duplicate groups - {results.duplicateGroups.length} + + {results.duplicateGroups.length} +
Unique images - {results.uniqueImages} + {results.uniqueImages}
{results.spaceSaveable > 0 && (
Space saveable - + {formatFileSize(results.spaceSaveable)}
@@ -334,14 +336,16 @@ export function FindDuplicatesSettings() { {results.skippedFiles && results.skippedFiles.length > 0 && (
Skipped - {results.skippedFiles.length} + + {results.skippedFiles.length} +
)}
{results.skippedFiles && results.skippedFiles.length > 0 && (
- + {results.skippedFiles.length} file{results.skippedFiles.length > 1 ? "s" : ""} could not be analyzed @@ -369,7 +373,7 @@ export function FindDuplicatesSettings() { - {error &&

{error}

} + {error &&

{error}

} ); } diff --git a/apps/web/src/components/tools/image-to-pdf-settings.tsx b/apps/web/src/components/tools/image-to-pdf-settings.tsx index 8f797623..dc9c1abc 100644 --- a/apps/web/src/components/tools/image-to-pdf-settings.tsx +++ b/apps/web/src/components/tools/image-to-pdf-settings.tsx @@ -97,7 +97,7 @@ function PdfPagePreview({ {/* Empty state placeholder */} {!imgUrl && (
- No image + No image
)} @@ -365,7 +365,7 @@ export function ImageToPdfSettings() { imgUrl={entries[selectedIndex]?.blobUrl ?? entries[0]?.blobUrl ?? null} /> - {error &&

{error}

} + {error &&

{error}

} {busy ? ( {collate ? "Download PDF" : "Download ZIP"} @@ -409,8 +409,8 @@ export function ImageToPdfSettings() { data-testid="image-to-pdf-compression-result" className={`text-xs px-3 py-2 rounded ${ compressionResult.targetMet - ? "bg-green-500/10 text-green-600" - : "bg-amber-500/10 text-amber-600" + ? "bg-green-500/10 text-success-ink" + : "bg-amber-500/10 text-amber-700 dark:text-amber-400" }`} > {compressionResult.targetMet ? ( diff --git a/apps/web/src/components/tools/images-to-video-settings.tsx b/apps/web/src/components/tools/images-to-video-settings.tsx index 78ddd518..8df9c9fc 100644 --- a/apps/web/src/components/tools/images-to-video-settings.tsx +++ b/apps/web/src/components/tools/images-to-video-settings.tsx @@ -72,7 +72,7 @@ export function ImagesToVideoSettings() { /> - {error &&

{error}

} + {error &&

{error}

} {processing ? ( - {error &&

{error}

} + {error &&

{error}

} {info && (
diff --git a/apps/web/src/components/tools/json-xml-settings.tsx b/apps/web/src/components/tools/json-xml-settings.tsx index 5fa2687d..1cc4a163 100644 --- a/apps/web/src/components/tools/json-xml-settings.tsx +++ b/apps/web/src/components/tools/json-xml-settings.tsx @@ -38,7 +38,7 @@ export function JsonXmlSettings() { {s.pretty} - {error &&

{error}

} + {error &&

{error}

} {processing ? ( - {error &&

{error}

} + {error &&

{error}

} {processing ? ( )} - {error &&

{error}

} + {error &&

{error}

} {processing ? ( {t.common.download} @@ -267,7 +267,7 @@ function CopyBlock({ onClick={onCopy} className="flex items-center gap-1 text-xs text-muted-foreground hover:text-foreground" > - {copied ? : } + {copied ? : } Copy
diff --git a/apps/web/src/components/tools/markdown-to-docx-settings.tsx b/apps/web/src/components/tools/markdown-to-docx-settings.tsx index d354b329..731ee42b 100644 --- a/apps/web/src/components/tools/markdown-to-docx-settings.tsx +++ b/apps/web/src/components/tools/markdown-to-docx-settings.tsx @@ -25,7 +25,7 @@ export function MarkdownToDocxSettings() { return (
- {error &&

{error}

} + {error &&

{error}

} {processing ? (

{s.hint}

- {error &&

{error}

} + {error &&

{error}

} {processing ? (

{s.hint}

- {error &&

{error}

} + {error &&

{error}

} {processing ? ( window.location.reload()} - className="text-xs text-primary hover:underline" + className="text-xs text-primary-ink hover:underline" > Retry diff --git a/apps/web/src/components/tools/merge-audio-settings.tsx b/apps/web/src/components/tools/merge-audio-settings.tsx index 535f549c..ea14d619 100644 --- a/apps/web/src/components/tools/merge-audio-settings.tsx +++ b/apps/web/src/components/tools/merge-audio-settings.tsx @@ -41,7 +41,7 @@ export function MergeAudioSettings() {

{s["order-hint"]}

- {error &&

{error}

} + {error &&

{error}

} {processing ? ( - {error &&

{error}

} + {error &&

{error}

} {processing ? ( )} - {error &&

{error}

} + {error &&

{error}

} {processing ? (

{s.hint}

- {error &&

{error}

} + {error &&

{error}

} {processing ? ( - {error &&

{error}

} + {error &&

{error}

} {processing ? (
- {error &&

{error}

} + {error &&

{error}

} {processing ? ( +

AI denoising on GIF files processes only the first frame. For animated GIFs, use the Quick or Balanced tier.

)} {/* Error */} - {error &&

{error}

} + {error &&

{error}

} {/* Size info */} {originalSize != null && processedSize != null && ( @@ -286,7 +286,7 @@ export function NoiseRemovalSettings() { href={downloadUrl} download data-testid="noise-removal-download" - className="w-full py-2.5 rounded-lg border border-primary text-primary font-medium flex items-center justify-center gap-2 hover:bg-primary/5" + className="w-full py-2.5 rounded-lg border border-primary text-primary-ink font-medium flex items-center justify-center gap-2 hover:bg-primary/5" > Download diff --git a/apps/web/src/components/tools/normalize-audio-settings.tsx b/apps/web/src/components/tools/normalize-audio-settings.tsx index 46c1b3c8..d277c590 100644 --- a/apps/web/src/components/tools/normalize-audio-settings.tsx +++ b/apps/web/src/components/tools/normalize-audio-settings.tsx @@ -27,7 +27,7 @@ export function NormalizeAudioSettings() {

{s.hint}

- {error &&

{error}

} + {error &&

{error}

} {processing ? (
- {error &&

{error}

} + {error &&

{error}

} {processing ? ( onChange(option.value)} className={`rounded-lg border px-2 py-2 text-xs font-medium transition-colors disabled:cursor-not-allowed disabled:opacity-50 ${ quality === option.value - ? "border-primary bg-primary/10 text-primary" + ? "border-primary bg-primary/10 text-primary-ink" : "border-border text-muted-foreground hover:border-primary/50" }`} > diff --git a/apps/web/src/components/tools/ocr-settings.tsx b/apps/web/src/components/tools/ocr-settings.tsx index 698fbbb4..b3de4dbb 100644 --- a/apps/web/src/components/tools/ocr-settings.tsx +++ b/apps/web/src/components/tools/ocr-settings.tsx @@ -333,7 +333,7 @@ export function OcrSettings() { > {langOpen ? : } Language - + {langLabel} @@ -353,7 +353,7 @@ export function OcrSettings() { {/* Error */} - {error &&

{error}

} + {error &&

{error}

} {/* Process button / progress */} {processing ? ( diff --git a/apps/web/src/components/tools/optimize-for-web-settings.tsx b/apps/web/src/components/tools/optimize-for-web-settings.tsx index 1524482e..0d022ba1 100644 --- a/apps/web/src/components/tools/optimize-for-web-settings.tsx +++ b/apps/web/src/components/tools/optimize-for-web-settings.tsx @@ -338,7 +338,7 @@ export function OptimizeForWebSettings() { {savings != null && (
0 ? "text-green-500" : "text-red-500" + Number(savings) > 0 ? "text-success-ink" : "text-destructive-ink" }`} > {Number(savings) > 0 ? `${savings}% smaller` : `${Math.abs(Number(savings))}% larger`} @@ -348,7 +348,7 @@ export function OptimizeForWebSettings() { )} {/* Error */} - {error &&

{error}

} + {error &&

{error}

} {/* Process / Download */} {processing ? ( @@ -374,7 +374,7 @@ export function OptimizeForWebSettings() { Download diff --git a/apps/web/src/components/tools/organize-pdf-settings.tsx b/apps/web/src/components/tools/organize-pdf-settings.tsx index ee78971e..8f812c59 100644 --- a/apps/web/src/components/tools/organize-pdf-settings.tsx +++ b/apps/web/src/components/tools/organize-pdf-settings.tsx @@ -42,7 +42,7 @@ export function OrganizePdfSettings() {

{s.orderHint}

- {error &&

{error}

} + {error &&

{error}

} {processing ? ( {spec.flag} @@ -622,7 +622,7 @@ export function PassportPhotoSettings() { setSearchQuery(""); }} className={`w-full flex items-center gap-2 px-3 py-1.5 text-xs transition-colors border-b border-border ${ - isCustom ? "bg-primary/10 text-primary" : "text-foreground hover:bg-muted" + isCustom ? "bg-primary/10 text-primary-ink" : "text-foreground hover:bg-muted" }`} > {"\u2699\uFE0F"} @@ -690,7 +690,7 @@ export function PassportPhotoSettings() { onClick={() => setDocumentType(type)} className={`py-2 px-2 rounded-lg border text-xs font-medium transition-colors capitalize ${ documentType === type - ? "border-primary bg-primary/10 text-primary" + ? "border-primary bg-primary/10 text-primary-ink" : "border-border text-muted-foreground hover:border-primary/50" }`} > @@ -803,7 +803,7 @@ export function PassportPhotoSettings() { }} className={`py-1.5 px-2.5 rounded-lg border text-xs font-medium transition-colors ${ maxFileSizeKb === preset.value - ? "border-primary bg-primary/10 text-primary" + ? "border-primary bg-primary/10 text-primary-ink" : "border-border text-muted-foreground hover:border-primary/50" }`} > @@ -838,9 +838,9 @@ export function PassportPhotoSettings() { {/* Errors */} - {analyzeError &&

{analyzeError}

} - {generateError &&

{generateError}

} - {error &&

{error}

} + {analyzeError &&

{analyzeError}

} + {generateError &&

{generateError}

} + {error &&

{error}

} {/* Analyze progress */} {analyzing && ( @@ -1190,11 +1190,13 @@ export function PassportPhotoPreview() { {complianceChecks.map((check) => (
{check.pass ? ( - + ) : ( - + )} - {check.label} + + {check.label} + {!check.pass && ( - {check.detail} )} @@ -1205,7 +1207,7 @@ export function PassportPhotoPreview() { {/* Generated result notification */} {generateResult && ( -
+
Photo generated. Download from the left panel.
diff --git a/apps/web/src/components/tools/pdf-metadata-settings.tsx b/apps/web/src/components/tools/pdf-metadata-settings.tsx index f7602542..840ee7e6 100644 --- a/apps/web/src/components/tools/pdf-metadata-settings.tsx +++ b/apps/web/src/components/tools/pdf-metadata-settings.tsx @@ -91,7 +91,7 @@ export function PdfMetadataSettings() { />
- {error &&

{error}

} + {error &&

{error}

} {processing ? (
- {error &&

{error}

} + {error &&

{error}

} {processing ? ( store.selectAllPages()} - className="text-xs text-primary hover:underline" + className="text-xs text-primary-ink hover:underline" > Select All @@ -172,7 +172,7 @@ export function PdfToImagePreview() { diff --git a/apps/web/src/components/tools/pdf-to-image-settings.tsx b/apps/web/src/components/tools/pdf-to-image-settings.tsx index f1eb0981..d4ebaa69 100644 --- a/apps/web/src/components/tools/pdf-to-image-settings.tsx +++ b/apps/web/src/components/tools/pdf-to-image-settings.tsx @@ -213,7 +213,7 @@ export function PdfToImageSettings() { {/* Error */} - {store.error &&

{store.error}

} + {store.error &&

{store.error}

} {/* Convert button */} @@ -627,7 +629,7 @@ function BgTypeButton({ onClick={onClick} className={`flex items-center gap-1.5 px-2.5 py-1.5 rounded-lg border text-xs font-medium transition-colors ${ active - ? "border-primary bg-primary/10 text-primary" + ? "border-primary bg-primary/10 text-primary-ink" : "border-border text-muted-foreground hover:border-primary/50" }`} > @@ -904,8 +906,8 @@ export function RemoveBgSettings({ onBgPreview }: RemoveBgSettingsProps = {}) { {/* Errors */} - {error &&

{error}

} - {effectsError &&

{effectsError}

} + {error &&

{error}

} + {effectsError &&

{effectsError}

} {/* Size info */} {originalSize != null && processedSize != null && !processing && ( diff --git a/apps/web/src/components/tools/remove-gif-background-settings.tsx b/apps/web/src/components/tools/remove-gif-background-settings.tsx index 020b254c..d99d7d42 100644 --- a/apps/web/src/components/tools/remove-gif-background-settings.tsx +++ b/apps/web/src/components/tools/remove-gif-background-settings.tsx @@ -277,7 +277,7 @@ export function RemoveGifBackgroundSettings() {

{s.frameNote}

- {error &&

{error}

} + {error &&

{error}

} {processing ? ( {s.pagesHint}

- {error &&

{error}

} + {error &&

{error}

} {processing ? ( - {error &&

{error}

} + {error &&

{error}

} {processing ? (

{s.hint}

- {error &&

{error}

} + {error &&

{error}

} {processing ? ( - {error &&

{error}

} + {error &&

{error}

} {originalSize != null && processedSize != null && (
@@ -173,7 +173,7 @@ export function ReplaceColorSettings() { href={downloadUrl} download data-testid="replace-color-download" - className="w-full py-2.5 rounded-lg border border-primary text-primary font-medium flex items-center justify-center gap-2 hover:bg-primary/5" + className="w-full py-2.5 rounded-lg border border-primary text-primary-ink font-medium flex items-center justify-center gap-2 hover:bg-primary/5" > Download diff --git a/apps/web/src/components/tools/resize-settings.tsx b/apps/web/src/components/tools/resize-settings.tsx index 041e8a80..47e901aa 100644 --- a/apps/web/src/components/tools/resize-settings.tsx +++ b/apps/web/src/components/tools/resize-settings.tsx @@ -495,7 +495,7 @@ export function ResizeSettings() { {/* Error */} - {error &&

{error}

} + {error &&

{error}

} {/* Process button */} {processing ? ( @@ -526,7 +526,7 @@ export function ResizeSettings() { href={downloadUrl} download data-testid="resize-download" - className="w-full py-2.5 rounded-lg border border-primary text-primary font-medium flex items-center justify-center gap-2 hover:bg-primary/5" + className="w-full py-2.5 rounded-lg border border-primary text-primary-ink font-medium flex items-center justify-center gap-2 hover:bg-primary/5" > {t.common.download} diff --git a/apps/web/src/components/tools/resize-video-settings.tsx b/apps/web/src/components/tools/resize-video-settings.tsx index b7bf9552..c2e7d97c 100644 --- a/apps/web/src/components/tools/resize-video-settings.tsx +++ b/apps/web/src/components/tools/resize-video-settings.tsx @@ -94,7 +94,7 @@ export function ResizeVideoSettings() { )} - {error &&

{error}

} + {error &&

{error}

} {processing ? ( {/* Error */} - {error &&

{error}

} + {error &&

{error}

} {/* Size info */} {originalSize != null && processedSize != null && ( @@ -280,7 +280,7 @@ export function RestorePhotoSettings() { href={downloadUrl} download data-testid="restore-photo-download" - className="w-full py-2.5 rounded-lg border border-primary text-primary font-medium flex items-center justify-center gap-2 hover:bg-primary/5" + className="w-full py-2.5 rounded-lg border border-primary text-primary-ink font-medium flex items-center justify-center gap-2 hover:bg-primary/5" > Download diff --git a/apps/web/src/components/tools/reverse-audio-settings.tsx b/apps/web/src/components/tools/reverse-audio-settings.tsx index 9f64236f..8910ae6e 100644 --- a/apps/web/src/components/tools/reverse-audio-settings.tsx +++ b/apps/web/src/components/tools/reverse-audio-settings.tsx @@ -25,7 +25,7 @@ export function ReverseAudioSettings() { return (
- {error &&

{error}

} + {error &&

{error}

} {processing ? (

{s.hint}

- {error &&

{error}

} + {error &&

{error}

} {processing ? ( {s["max-hint"]}

- {error &&

{error}

} + {error &&

{error}

} {processing ? ( {s.rangeHint}

- {error &&

{error}

} + {error &&

{error}

} {processing ? ( {/* Error */} - {error &&

{error}

} + {error &&

{error}

} {/* Process */} {processing ? ( diff --git a/apps/web/src/components/tools/rotate-video-settings.tsx b/apps/web/src/components/tools/rotate-video-settings.tsx index d4a22aa5..fc57bfa6 100644 --- a/apps/web/src/components/tools/rotate-video-settings.tsx +++ b/apps/web/src/components/tools/rotate-video-settings.tsx @@ -48,7 +48,7 @@ export function RotateVideoSettings() { - {error &&

{error}

} + {error &&

{error}

} {processing ? ( )} - {error &&

{error}

} + {error &&

{error}

} {originalSize != null && processedSize != null && (
@@ -385,7 +385,7 @@ export function SharpeningSettings() { href={downloadUrl} download data-testid="sharpening-download" - className="w-full py-2.5 rounded-lg border border-primary text-primary font-medium flex items-center justify-center gap-2 hover:bg-primary/5" + className="w-full py-2.5 rounded-lg border border-primary text-primary-ink font-medium flex items-center justify-center gap-2 hover:bg-primary/5" > Download diff --git a/apps/web/src/components/tools/silence-removal-settings.tsx b/apps/web/src/components/tools/silence-removal-settings.tsx index c4fa77b9..bfe0ac00 100644 --- a/apps/web/src/components/tools/silence-removal-settings.tsx +++ b/apps/web/src/components/tools/silence-removal-settings.tsx @@ -61,7 +61,7 @@ export function SilenceRemovalSettings() { />
- {error &&

{error}

} + {error &&

{error}

} {processing ? ( - {error &&

{error}

} + {error &&

{error}

} {processing ? ( )} - {error &&

{error}

} + {error &&

{error}

} {processing ? ( - {error &&

{error}

} + {error &&

{error}

} {processing ? ( )} - {error &&

{error}

} + {error &&

{error}

} {processing ? ( )} - {tileWarning &&

{tileWarning}

} + {tileWarning && ( +

{tileWarning}

+ )} - {error &&

{error}

} + {error &&

{error}

}
@@ -624,7 +624,7 @@ export function AutomatePage() { {hasFile && !hasProcessed && currentEntry?.status === "failed" && (
-

+

{currentEntry.error ?? t.toolPage.processingFailed}

@@ -651,7 +651,7 @@ export function AutomatePage() { /> {error && ( -
+
{error}
@@ -690,7 +690,7 @@ export function AutomatePage() { @@ -699,7 +699,7 @@ export function AutomatePage() { @@ -782,14 +782,14 @@ export function AutomatePage() {
{importError && ( -
+
{importError}
@@ -803,7 +803,7 @@ export function AutomatePage() {
-
+
🦦

{t.changePassword.sidebarTitle}

-

{t.changePassword.sidebarDescription}

+

{t.changePassword.sidebarDescription}

diff --git a/apps/web/src/pages/files-page.tsx b/apps/web/src/pages/files-page.tsx index a8ec9045..35a1030f 100644 --- a/apps/web/src/pages/files-page.tsx +++ b/apps/web/src/pages/files-page.tsx @@ -39,7 +39,7 @@ export function FilesPage() { onClick={() => setActiveTab("recent")} className={`flex-1 py-2.5 text-sm font-medium text-center transition-colors ${ activeTab === "recent" - ? "text-primary border-b-2 border-primary" + ? "text-primary-ink border-b-2 border-primary" : "text-muted-foreground" }`} > @@ -50,7 +50,7 @@ export function FilesPage() { onClick={() => setActiveTab("upload")} className={`flex-1 py-2.5 text-sm font-medium text-center transition-colors ${ activeTab === "upload" - ? "text-primary border-b-2 border-primary" + ? "text-primary-ink border-b-2 border-primary" : "text-muted-foreground" }`} > diff --git a/apps/web/src/pages/home-page.tsx b/apps/web/src/pages/home-page.tsx index a844b99d..fce87032 100644 --- a/apps/web/src/pages/home-page.tsx +++ b/apps/web/src/pages/home-page.tsx @@ -250,7 +250,7 @@ function HomeSearchBar({ }} placeholder={placeholder} aria-label={placeholder} - className="w-full ps-11 pe-20 py-2.5 rounded-lg border border-border bg-card text-sm text-foreground placeholder:text-muted-foreground/60 focus:outline-none focus:ring-2 focus:ring-primary/30 focus:border-primary/40 transition-shadow" + className="w-full ps-11 pe-20 py-2.5 rounded-lg border border-border bg-card text-sm text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-primary/30 focus:border-primary/40 transition-shadow" /> {value ? ( ))} @@ -335,7 +333,7 @@ function RequestToolAffordance({ : t.homePage.requestToolBelowResults; const promptVariant: FeedbackPromptVariant = variant === "empty" ? "search-empty-v1" : "search-results-v1"; - const className = "inline-flex items-center gap-1.5 text-sm text-primary hover:underline"; + const className = "inline-flex items-center gap-1.5 text-sm text-primary-ink hover:underline"; if (analyticsOn) { return ( @@ -391,7 +389,11 @@ function SearchResults({ analyticsOn={analyticsOn} onRequest={onRequest} /> - @@ -478,7 +480,7 @@ function AllTabContent({ {/* Pinned */} {pinnedTools.length > 0 && (
-

+

{t.homePage.pinned}

@@ -492,7 +494,7 @@ function AllTabContent({ {/* Recent */} {recentTools.length > 0 && (
-

+

{t.homePage.recent}

@@ -555,7 +557,7 @@ function AllTabContent({ const tools = categoryMap.get(category.id) ?? []; return (
-

+

{getCategoryName(t, category.id, category.name)}

@@ -592,7 +594,7 @@ function CategoryGrid({ groupedTools }: { groupedTools: Map }) { const tools = groupedTools.get(category.id) ?? []; return (
-

+

{getCategoryName(t, category.id, category.name)}

diff --git a/apps/web/src/pages/login-page.tsx b/apps/web/src/pages/login-page.tsx index fc353d6c..49a905f6 100644 --- a/apps/web/src/pages/login-page.tsx +++ b/apps/web/src/pages/login-page.tsx @@ -27,7 +27,7 @@ function RotatingPhrase() { return (

- SnapOtter + SnapOtter

{t.auth.login}

@@ -260,7 +260,7 @@ export function LoginPage() { {oidcEnabled && (
-
+

{t.auth.heroTitle}

-

{t.auth.heroSubtitle}

+

{t.auth.heroSubtitle}

diff --git a/apps/web/src/pages/not-found-page.tsx b/apps/web/src/pages/not-found-page.tsx index 277991d4..5ab81108 100644 --- a/apps/web/src/pages/not-found-page.tsx +++ b/apps/web/src/pages/not-found-page.tsx @@ -7,7 +7,7 @@ export function NotFoundPage() { return (
-

404

+

404

{t.common.pageNotFound}

{t.common.pageNotFoundDescription}

; + return ; case "failed": return ; case "processing": @@ -161,7 +161,7 @@ function FileSelectionInfo({ @@ -198,7 +198,7 @@ function FileSelectionInfo({ @@ -910,12 +910,12 @@ export function ToolPage() {
- +

{t.toolPage.conversionComplete}

{processedFileName}

{processedSize != null && ( -

+

{processedFileType} · {formatFileSize(processedSize)}

)} @@ -1016,7 +1016,7 @@ export function ToolPage() {

{ext} · {formatFileSize(fsize)}

-

{t.toolPage.previewUnavailable}

+

{t.toolPage.previewUnavailable}

); @@ -1144,7 +1144,7 @@ export function ToolPage() {
{t(locale, "enterprise.comparison.cloudHeader")} - SnapOtter {t(locale, "enterprise.comparison.selfHostedHeader")} + SnapOtter {t(locale, "enterprise.comparison.selfHostedHeader")}