{canToggleVisibility && (
-
+ isVisible={isContentVisible}
+ onToggle={onToggleVisibility}
+ />
)}
diff --git a/src/components/ui/VisibilityToggle.tsx b/src/components/ui/VisibilityToggle.tsx
new file mode 100644
index 000000000..47a8c53e8
--- /dev/null
+++ b/src/components/ui/VisibilityToggle.tsx
@@ -0,0 +1,31 @@
+import { Eye, EyeOff } from 'lucide-react';
+import clsx from 'clsx';
+import { useTranslation } from 'react-i18next';
+
+interface VisibilityToggleProps {
+ className?: string;
+ isVisible: boolean;
+ onToggle(): void;
+}
+
+export default function VisibilityToggle({ className, isVisible, onToggle }: VisibilityToggleProps) {
+ const { t } = useTranslation();
+
+ return (
+
+ );
+}
diff --git a/src/i18n/locales/en.json b/src/i18n/locales/en.json
index f29c40ccc..6ef7b700c 100644
--- a/src/i18n/locales/en.json
+++ b/src/i18n/locales/en.json
@@ -159,7 +159,7 @@
"confirmDeleteGroupNested": "Confirm Delete Group & All Nested Albums",
"deleteAlbum": "Delete Album",
"deleteGroup": "Delete Group",
- "importLightroom": "Import Lightroom Collections…",
+ "importLightroom": "Import Lightroom Catalog…",
"lightroomCatalog": "Lightroom Catalog",
"moveHere": "Move Here",
"moveTo": "Move To...",
@@ -1530,7 +1530,7 @@
"rootImages": "Images: {{images}}, missing: {{missing}}",
"skippedOther": "Books, slideshows, prints and web galleries, not imported: {{total}}",
"smartCollections": "Smart collections, not imported: {{total}}",
- "title": "Import Lightroom Collections"
+ "title": "Import Lightroom Catalog"
},
"negativeConversion": {
"blueWeight": "Blue (Yellow)",
@@ -1641,6 +1641,46 @@
"yAxis": "Y Axis",
"zoomInTooltip": "Zoom In",
"zoomOutTooltip": "Zoom Out"
+ },
+ "lightroomDevelop": {
+ "title": "Photo edits",
+ "hint": "Review each photo before importing. Supported Lightroom settings are converted to RapidRoom controls; the appearance can differ. Originals and the catalog stay unchanged.",
+ "reading": "Reading photo edits…",
+ "selectAvailable": "Select available photos",
+ "clearSelection": "Clear selection",
+ "replaceEdits": "Replace saved RapidRoom edits on selected photos",
+ "importRatings": "Import catalog star ratings",
+ "replaceRatings": "Replace saved RapidRoom ratings on selected photos",
+ "preserved": "Saved RapidRoom edits and ratings are preserved unless you choose to replace them.",
+ "cardMode": "Card mode is read-only. Copy the photos to a local folder before importing edits.",
+ "selected": "Selected: {{selected}} of {{total}} photos",
+ "apply": "Import selected photo edits",
+ "details": "Changes to import",
+ "unsupported": "Not transferred: {{items}}",
+ "existing": "Saved RapidRoom metadata",
+ "newPhoto": "New photo",
+ "virtualCopy": "Virtual copy",
+ "rating": "Catalog rating: {{rating}} stars",
+ "noRating": "No catalog rating",
+ "missing": "Photo not found",
+ "previous": "Previous",
+ "next": "Next",
+ "page": "Page {{page}} of {{total}}",
+ "empty": "This catalog has no photo edits to import.",
+ "result": "Imported: {{imported}}. Preserved: {{preserved}}. New virtual copies: {{virtualCopies}}.",
+ "noAdjustments": "No supported adjustments.",
+ "fields": {
+ "whiteBalance": "white balance without an as-shot reference",
+ "profileLook": "profile color and lookup tables",
+ "cameraProfile": "camera profile",
+ "masks": "local masks",
+ "aiMasks": "AI masks",
+ "lensProfile": "Adobe lens profile",
+ "pointColor": "point color",
+ "orientationAndCrop": "unsupported orientation and crop",
+ "virtualCopyName": "virtual-copy name (shown here only)"
+ },
+ "refresh": "Refresh preview"
}
},
"settings": {
diff --git a/src/utils/adjustments.ts b/src/utils/adjustments.ts
index e02aa5b75..15c737a85 100644
--- a/src/utils/adjustments.ts
+++ b/src/utils/adjustments.ts
@@ -385,6 +385,8 @@ export interface SectionVisibility {
basic: boolean;
curves: boolean;
color: boolean;
+ colorGrading: boolean;
+ colorMixer: boolean;
details: boolean;
effects: boolean;
}
@@ -490,6 +492,8 @@ export const INITIAL_MASK_ADJUSTMENTS: MaskAdjustments = {
basic: true,
curves: true,
color: true,
+ colorGrading: true,
+ colorMixer: true,
details: true,
effects: true,
},
@@ -587,6 +591,8 @@ export const INITIAL_ADJUSTMENTS: Adjustments = {
basic: true,
curves: true,
color: true,
+ colorGrading: true,
+ colorMixer: true,
details: true,
effects: true,
},
@@ -1020,5 +1026,15 @@ export const ADJUSTMENT_SECTION_TOOLS: Record
(ADJUSTMENT_SECTION_TOOLS[section] ?? []).map((tool) => tool.id);
+export const showSectionAndTools = (visibility: SectionVisibility, section: string): SectionVisibility => ({
+ ...visibility,
+ ...Object.fromEntries(
+ getAdjustmentSectionToolIds(section)
+ .filter((id) => id in visibility)
+ .map((id) => [id, true]),
+ ),
+ [section]: true,
+});
+
export const getAdjustmentToolOrder = (section: string, toolOrder?: Record): string[] =>
reconcileOrder(getAdjustmentSectionToolIds(section), toolOrder?.[section]);