e.stopPropagation()}
onDoubleClick={(e) => e.stopPropagation()}
@@ -541,7 +543,7 @@ function CollageCell({
ref={setDragRef}
{...listeners}
{...attributes}
- aria-label="Drag to reorder"
+ aria-label={t.a11y.dragToReorder}
className="bg-black/50 backdrop-blur-sm text-white rounded p-1 cursor-grab active:cursor-grabbing hover:bg-black/70 transition-colors"
>
@@ -553,7 +555,7 @@ function CollageCell({
{isSelected && image && !isLoading && (
- {phase === "processing" &&
}
+ {phase === "processing" &&
}
{phase === "processing" ? "Creating..." : `Create Collage (${imageCount} images)`}
diff --git a/apps/web/src/components/tools/color-palette-settings.tsx b/apps/web/src/components/tools/color-palette-settings.tsx
index 2af9cd3f..13e0cb3d 100644
--- a/apps/web/src/components/tools/color-palette-settings.tsx
+++ b/apps/web/src/components/tools/color-palette-settings.tsx
@@ -61,7 +61,7 @@ export function ColorPaletteSettings() {
disabled={!hasFile || processing}
className="w-full py-2.5 rounded-lg bg-primary text-primary-foreground font-medium disabled:opacity-50 disabled:cursor-not-allowed flex items-center justify-center gap-2"
>
- {processing &&
}
+ {processing &&
}
{processing ? ts.extracting : ts.submit}
diff --git a/apps/web/src/components/tools/color-settings.tsx b/apps/web/src/components/tools/color-settings.tsx
index 1453f76c..a727fc45 100644
--- a/apps/web/src/components/tools/color-settings.tsx
+++ b/apps/web/src/components/tools/color-settings.tsx
@@ -428,7 +428,7 @@ export function ColorSettings({ toolId, onPreviewFilter }: ColorSettingsProps) {
function SectionLabel({ children }: { children: React.ReactNode }) {
return (
-
+
{children}
);
@@ -457,7 +457,7 @@ function SliderControl({
{value}
diff --git a/apps/web/src/components/tools/colorize-settings.tsx b/apps/web/src/components/tools/colorize-settings.tsx
index 9dab9079..e11044a7 100644
--- a/apps/web/src/components/tools/colorize-settings.tsx
+++ b/apps/web/src/components/tools/colorize-settings.tsx
@@ -99,7 +99,7 @@ export function ColorizeSettings() {
onChange={(e) => setIntensity(Number(e.target.value))}
className="w-full mt-0.5"
/>
-
+
Lower values produce more muted, vintage-style colors.
@@ -152,7 +152,7 @@ export function ColorizeSettings() {
function SectionLabel({ children }: { children: React.ReactNode }) {
return (
-
+
{children}
);
diff --git a/apps/web/src/components/tools/compare-settings.tsx b/apps/web/src/components/tools/compare-settings.tsx
index 34f8f844..9b38015a 100644
--- a/apps/web/src/components/tools/compare-settings.tsx
+++ b/apps/web/src/components/tools/compare-settings.tsx
@@ -94,7 +94,7 @@ export function CompareSettings() {
disabled={!hasFile || !secondFile || processing}
className="w-full py-2.5 rounded-lg bg-primary text-primary-foreground font-medium disabled:opacity-50 disabled:cursor-not-allowed flex items-center justify-center gap-2"
>
- {processing &&
}
+ {processing &&
}
{processing ? "Comparing..." : "Compare"}
diff --git a/apps/web/src/components/tools/compose-settings.tsx b/apps/web/src/components/tools/compose-settings.tsx
index 911251c2..eed84a88 100644
--- a/apps/web/src/components/tools/compose-settings.tsx
+++ b/apps/web/src/components/tools/compose-settings.tsx
@@ -167,7 +167,7 @@ export function ComposeSettings() {
disabled={!hasFile || !overlayFile || processing}
className="w-full py-2.5 rounded-lg bg-primary text-primary-foreground font-medium disabled:opacity-50 disabled:cursor-not-allowed flex items-center justify-center gap-2"
>
- {processing &&
}
+ {processing &&
}
{processing ? "Processing..." : t.toolSettings.compose.submit}
diff --git a/apps/web/src/components/tools/enhance-faces-settings.tsx b/apps/web/src/components/tools/enhance-faces-settings.tsx
index 8ee5d994..5d7fbbdd 100644
--- a/apps/web/src/components/tools/enhance-faces-settings.tsx
+++ b/apps/web/src/components/tools/enhance-faces-settings.tsx
@@ -92,7 +92,7 @@ export function EnhanceFacesControls({
onChange={(e) => setStrength(Number(e.target.value))}
className="w-full mt-1"
/>
-
+
Subtle
Maximum
@@ -110,7 +110,7 @@ export function EnhanceFacesControls({
/>
Only enhance main face
-
+
For portraits - ignores background faces
@@ -133,7 +133,7 @@ export function EnhanceFacesControls({
onChange={(e) => setSensitivity(Number(e.target.value))}
className="w-full mt-1"
/>
-
+
Fewer faces
More faces
diff --git a/apps/web/src/components/tools/find-duplicates-results.tsx b/apps/web/src/components/tools/find-duplicates-results.tsx
index f1d77249..55a3e460 100644
--- a/apps/web/src/components/tools/find-duplicates-results.tsx
+++ b/apps/web/src/components/tools/find-duplicates-results.tsx
@@ -266,7 +266,7 @@ export function FindDuplicatesResults() {
if (!results) {
return (
-
+
Choose a detection mode and click "Scan" to find duplicates.
diff --git a/apps/web/src/components/tools/find-duplicates-settings.tsx b/apps/web/src/components/tools/find-duplicates-settings.tsx
index 00583c2c..6752992e 100644
--- a/apps/web/src/components/tools/find-duplicates-settings.tsx
+++ b/apps/web/src/components/tools/find-duplicates-settings.tsx
@@ -309,7 +309,7 @@ export function FindDuplicatesSettings() {
disabled={!hasFiles || scanning}
className="w-full py-2.5 rounded-lg bg-primary text-primary-foreground font-medium disabled:opacity-50 disabled:cursor-not-allowed flex items-center justify-center gap-2"
>
- {scanning &&
}
+ {scanning &&
}
{scanning
? uploadProgress < 100
? `Uploading... ${uploadProgress}%`
diff --git a/apps/web/src/components/tools/html-to-image-settings.tsx b/apps/web/src/components/tools/html-to-image-settings.tsx
index b9ee06b2..c4737402 100644
--- a/apps/web/src/components/tools/html-to-image-settings.tsx
+++ b/apps/web/src/components/tools/html-to-image-settings.tsx
@@ -175,7 +175,7 @@ export function HtmlToImageSettings() {
disabled={(store.mode === "url" ? !store.url : !store.htmlContent) || store.capturing}
className="inline-flex w-full items-center justify-center gap-2 rounded-lg bg-primary px-4 py-2.5 text-sm font-medium text-primary-foreground disabled:opacity-50"
>
- {store.capturing &&
}
+ {store.capturing &&
}
{store.capturing ? ts.capturing : ts.submit}
diff --git a/apps/web/src/components/tools/image-enhancement-settings.tsx b/apps/web/src/components/tools/image-enhancement-settings.tsx
index 648c5897..0861c124 100644
--- a/apps/web/src/components/tools/image-enhancement-settings.tsx
+++ b/apps/web/src/components/tools/image-enhancement-settings.tsx
@@ -285,7 +285,7 @@ export function ImageEnhancementControls({
)}
{/* Mode selector */}
-
+
{t.toolSettings.imageEnhancement.enhancementMode}
@@ -309,7 +309,7 @@ export function ImageEnhancementControls({
{/* Intensity slider */}
-
+
{t.toolSettings.imageEnhancement.intensity}
{intensity}%
@@ -337,6 +337,8 @@ export function ImageEnhancementControls({
))}
diff --git a/apps/web/src/components/tools/image-to-base64-settings.tsx b/apps/web/src/components/tools/image-to-base64-settings.tsx
index c7bc2884..979d2fc3 100644
--- a/apps/web/src/components/tools/image-to-base64-settings.tsx
+++ b/apps/web/src/components/tools/image-to-base64-settings.tsx
@@ -84,7 +84,7 @@ export function ImageToBase64Settings() {
{/* Output Format */}
Output Image Format
-
+
Convert before encoding to control MIME type and size
@@ -123,9 +123,7 @@ export function ImageToBase64Settings() {
onChange={(e) => setQuality(Number(e.target.value))}
className="w-full mt-1 accent-primary"
/>
-
- Lower quality = smaller base64 string
-
+
Lower quality = smaller base64 string
)}
@@ -141,7 +139,7 @@ export function ImageToBase64Settings() {
value={maxWidth}
onChange={(e) => setMaxWidth(Math.max(0, Number(e.target.value)))}
placeholder="0 = no limit"
- className="mt-1 w-full rounded bg-muted px-3 py-1.5 text-xs text-foreground placeholder:text-muted-foreground/50 outline-none"
+ className="mt-1 w-full rounded bg-muted px-3 py-1.5 text-xs text-foreground placeholder:text-muted-foreground outline-none"
/>
@@ -157,9 +155,9 @@ export function ImageToBase64Settings() {
value={maxHeight}
onChange={(e) => setMaxHeight(Math.max(0, Number(e.target.value)))}
placeholder="0 = no limit"
- className="mt-1 w-full rounded bg-muted px-3 py-1.5 text-xs text-foreground placeholder:text-muted-foreground/50 outline-none"
+ className="mt-1 w-full rounded bg-muted px-3 py-1.5 text-xs text-foreground placeholder:text-muted-foreground outline-none"
/>
-
+
Resize before encoding. Aspect ratio is preserved. 0 = no limit.
@@ -172,7 +170,7 @@ export function ImageToBase64Settings() {
disabled={!hasFiles || processing}
className="w-full py-2.5 rounded-lg bg-primary text-primary-foreground font-medium disabled:opacity-50 disabled:cursor-not-allowed flex items-center justify-center gap-2"
>
- {processing &&
}
+ {processing &&
}
{processing
? "Converting..."
: `Convert to Base64${files.length > 1 ? ` (${files.length})` : ""}`}
diff --git a/apps/web/src/components/tools/info-settings.tsx b/apps/web/src/components/tools/info-settings.tsx
index d5ada12f..7af8cfb6 100644
--- a/apps/web/src/components/tools/info-settings.tsx
+++ b/apps/web/src/components/tools/info-settings.tsx
@@ -133,7 +133,7 @@ export function InfoSettings() {
disabled={!hasFile || processing}
className="w-full py-2.5 rounded-lg bg-primary text-primary-foreground font-medium disabled:opacity-50 disabled:cursor-not-allowed flex items-center justify-center gap-2"
>
- {processing &&
}
+ {processing &&
}
{processing ? ts.reading : ts.readInfo}
diff --git a/apps/web/src/components/tools/meme-generator-settings.tsx b/apps/web/src/components/tools/meme-generator-settings.tsx
index b7b01c66..f348c282 100644
--- a/apps/web/src/components/tools/meme-generator-settings.tsx
+++ b/apps/web/src/components/tools/meme-generator-settings.tsx
@@ -267,7 +267,7 @@ function EditorSettings() {
>
{generating ? (
<>
-
+
Generating...
>
) : (
diff --git a/apps/web/src/components/tools/ocr-settings.tsx b/apps/web/src/components/tools/ocr-settings.tsx
index 1d4669c1..8492378a 100644
--- a/apps/web/src/components/tools/ocr-settings.tsx
+++ b/apps/web/src/components/tools/ocr-settings.tsx
@@ -34,7 +34,7 @@ const ENHANCE_DEFAULTS: Record
= {
function SectionLabel({ children }: { children: React.ReactNode }) {
return (
-
+
{children}
);
@@ -253,7 +253,7 @@ export function OcrSettings() {
@@ -264,7 +264,7 @@ export function OcrSettings() {