diff --git a/.idea/.gitignore b/.idea/.gitignore
deleted file mode 100644
index 13566b8..0000000
--- a/.idea/.gitignore
+++ /dev/null
@@ -1,8 +0,0 @@
-# Default ignored files
-/shelf/
-/workspace.xml
-# Editor-based HTTP Client requests
-/httpRequests/
-# Datasource local storage ignored files
-/dataSources/
-/dataSources.local.xml
diff --git a/.idea/modules.xml b/.idea/modules.xml
deleted file mode 100644
index 6c06396..0000000
--- a/.idea/modules.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
deleted file mode 100644
index 35eb1dd..0000000
--- a/.idea/vcs.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/visualdiffer.github.com.iml b/.idea/visualdiffer.github.com.iml
deleted file mode 100644
index f97af92..0000000
--- a/.idea/visualdiffer.github.com.iml
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/Gemfile.lock b/Gemfile.lock
index ed2edc5..4535f66 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -88,7 +88,6 @@ CHECKSUMS
addressable (2.8.9)
base64 (0.3.0)
bigdecimal (4.0.1)
- bundler (4.0.11) sha256=5bcec0fb78302e48d02ee46f10ee6e6942be647ba5b44a6d1ddfda9a240ce785
colorator (1.1.0)
concurrent-ruby (1.3.5)
csv (3.3.5)
diff --git a/README.md b/README.md
index ccb57c4..439694d 100644
--- a/README.md
+++ b/README.md
@@ -7,10 +7,28 @@
### Tailwind
-Generate the `CSS` every time styles on `input.css` change
+Regenerate the CSS whenever `input.css` changes.
npx @tailwindcss/cli -i ./css/input.css -o css/theme.css
+### Images
+
+Reduce image size
+
+ find img/screenshots -type file -name '*.png' -exec pngquant -f --ext .png --quality=65-80 {} \;
+
+# Highlight rectangle
+
+See [contextMenuExclude.png](img/screenshots/folder/fileFilters/contextMenuExclude.png) or [traverseFileFilters.png](img/screenshots/folder/fileFilters/traverseFileFilters.png)
+
+To highlight a region in GIMP:
+
+1. Use the Ellipse/Rectangle Select Tool
+2. Select the area you want to keep
+3. Select → Feather — e.g., 30–50px for soft edges
+4. Invert the selection — `Select → Invert`
+5. Darken the surrounding area — `Colors → Brightness-Contrast`, set Brightness to -127
+
# Local Test
### Generate documentation for the Apple Help system
diff --git a/_includes/finderMetadata.md b/_includes/finderMetadata.md
index 057eeef..715ce90 100644
--- a/_includes/finderMetadata.md
+++ b/_includes/finderMetadata.md
@@ -19,7 +19,7 @@ The complete list of supported metadata
Compare all labels assigned to a file |
- Tags Available in macOS 10.9 or above |
+ Tags |
Compare all tags assigned to a file |
diff --git a/_includes/scripts.html b/_includes/scripts.html
index 31f96ca..0c9691f 100644
--- a/_includes/scripts.html
+++ b/_includes/scripts.html
@@ -24,4 +24,5 @@
{% endif %}
{% endcase %}
+
diff --git a/alignRules.md b/alignRules.md
index 1f8e574..e7dbcd5 100755
--- a/alignRules.md
+++ b/alignRules.md
@@ -142,7 +142,7 @@ This can be achieved using VisualDiffer 'user-defined alignment rules'.
You can create, edit or delete rules from Session Preferences Dialog
-
+{:.wiki-img}
More rules can be assigned to a VisualDiffer session comparison; they are evaluated from top to bottom.
@@ -150,7 +150,7 @@ More rules can be assigned to a VisualDiffer session comparison; they are evalua
When you add a new rule (or edit an existing one) you access the dialog shown below
-
+{:.wiki-img}
A rule has
@@ -199,7 +199,7 @@ Now if you save the rule and then run the comparison you obtain the result shown
But `002.jpg` and `002.RAW` files are not aligned because the `002.RAW` extension is uppercase; this can be easily fixed by ignoring the case on the right expression as shown in the figure below
-
+{:.wiki-img}
## [Test Rule](#test_rule)
diff --git a/colorsLegend.md b/colorsLegend.md
new file mode 100644
index 0000000..9ad0b49
--- /dev/null
+++ b/colorsLegend.md
@@ -0,0 +1,96 @@
+---
+permalink: colorsLegend.html
+layout: default
+
+# mainAnchor is used by Apple links
+mainAnchor: colorsLegend
+title: Colors Legend
+subtitle: Colors and icons used in folder and file comparison views
+---
+
+# [Folder Colors](#folder_colors)
+
+Folders are shown using different colors to quickly visualize the file comparison results.
+
+
+
+

+
Matched
+
All files identical on both sides
+
+
+

+
Has older
+
Contains files older than the other side
+
+
+

+
Modified
+
Contains modified files
+
+
+

+
Modified + older
+
Contains modified files and files older than the other side
+
+
+

+
Orphan
+
Files only on one side
+
+
+

+
Orphan + older
+
Orphan files and files older than the other side
+
+
+

+
Orphan + modified
+
Orphan files and modified files
+
+
+

+
Filtered / Empty
+
Matches active file filters or is empty
+
+
+
+# [File Colors](#file_colors)
+
+Line colors in the File Differ View are based on differences found.
+
+
+
+
+
Same
+
Left and right content is identical
+
+
+
+
Different
+
Left content differs from right
+
+
+
+
Missing left
+
Line present only on the right; missing on the left
+
+
+
+
Missing right
+
Line present only on the left; missing on the right
+
+
+
+
Merged
+
Content copied from the other side; file is marked as edited
+
+
+
+# [Difference Indicator](#difference_indicator)
+
+The narrow strip on the right side of the file diff view gives a bird's-eye view of all differences across the whole file.
+
+{:.wiki-img}
+
+Each colored mark corresponds to a difference section; the colors match those in the diff table. The current scroll position is shown as a highlighted band. Click anywhere on the indicator to jump directly to that part of the file.
diff --git a/css/input.css b/css/input.css
index cf5ba55..2dc284d 100644
--- a/css/input.css
+++ b/css/input.css
@@ -94,31 +94,111 @@ img.folder-legend {
max-height: 16px;
}
+.folder-legend-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(130px, 1fr));
+ gap: 12px;
+ margin: 1.25rem 0;
+}
+
+.folder-legend-card {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ text-align: center;
+ padding: 14px 10px 12px;
+ border: 1px solid #e2e8f0;
+ border-radius: 8px;
+ gap: 8px;
+ background: #f8fafc;
+}
+
+.folder-legend-card img {
+ object-fit: contain;
+}
+
+.folder-legend-card strong {
+ font-size: 0.82rem;
+ color: #1e293b;
+ line-height: 1.3;
+}
+
+.folder-legend-card span {
+ font-size: 0.75rem;
+ color: #64748b;
+ line-height: 1.4;
+}
+
+td.copy-cmd {
+ cursor: pointer;
+ white-space: nowrap;
+ user-select: none;
+}
+
+td.copy-cmd::after {
+ content: '';
+ display: inline-block;
+ width: 20px;
+ height: 20px;
+ margin-left: 7px;
+ vertical-align: middle;
+ opacity: 0;
+ transition: opacity 0.15s;
+ background-size: contain;
+ background-repeat: no-repeat;
+ background-position: center;
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23047857' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='9' y='9' width='13' height='13' rx='2' ry='2'/%3E%3Cpath d='M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1'/%3E%3C/svg%3E");
+}
+
+td.copy-cmd:hover::after {
+ opacity: 1;
+}
+
+td.copy-cmd.copied::after {
+ opacity: 1;
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23059669' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'/%3E%3C/svg%3E");
+}
+
+img.wiki-img {
+ max-width: 50%;
+ border: 1px solid #94a3b8;
+ border-radius: 4px;
+ background-color: #fff;
+ padding: 3px;
+}
+
table.file-legend tr td {
padding: 6px 10px;
}
-td.file-legend-same {
+.file-legend-same {
background-color: #0f172a;
color: #e2e8f0;
}
-td.file-legend-different {
+.file-legend-different {
background-color: #d1fadf;
}
-td.file-legend-missing-left {
+.file-legend-missing-left {
background-color: #e0f2fe;
}
-td.file-legend-missing-right {
+.file-legend-missing-right {
background-color: #fef9c3;
}
-td.file-legend-merged {
+.file-legend-merged {
background-color: #fef3c7;
}
+.file-legend-swatch {
+ width: 100%;
+ height: 20px;
+ border-radius: 3px;
+ border: 1px solid rgba(0,0,0,0.08);
+}
+
#main a[href^="https://"]::before,
#main a[href^="http://"]::before,
.link-https::before,
diff --git a/css/theme.css b/css/theme.css
index 5822a9b..b2f4ddf 100644
--- a/css/theme.css
+++ b/css/theme.css
@@ -1,4 +1,4 @@
-/*! tailwindcss v4.1.18 | MIT License | https://tailwindcss.com */
+/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */
@layer properties;
@layer theme, base, components, utilities;
@layer theme {
@@ -222,6 +222,12 @@
.sticky {
position: sticky;
}
+ .start {
+ inset-inline-start: var(--spacing);
+ }
+ .end {
+ inset-inline-end: var(--spacing);
+ }
.top-0 {
top: calc(var(--spacing) * 0);
}
@@ -887,6 +893,9 @@
.block {
display: block;
}
+ .contents {
+ display: contents;
+ }
.flex {
display: flex;
}
@@ -1200,6 +1209,10 @@
--tw-blur: blur(8px);
filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,);
}
+ .invert {
+ --tw-invert: invert(100%);
+ filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,);
+ }
.filter {
filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,);
}
@@ -1295,7 +1308,7 @@
}
.md\:left-1\/2 {
@media (width >= 48rem) {
- left: calc(1/2 * 100%);
+ left: calc(1 / 2 * 100%);
}
}
.md\:flex {
@@ -1315,7 +1328,7 @@
}
.md\:-translate-x-1\/2 {
@media (width >= 48rem) {
- --tw-translate-x: calc(calc(1/2 * 100%) * -1);
+ --tw-translate-x: calc(calc(1 / 2 * 100%) * -1);
translate: var(--tw-translate-x) var(--tw-translate-y);
}
}
@@ -1514,25 +1527,94 @@ img.folder-legend {
max-width: 16px;
max-height: 16px;
}
+.folder-legend-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(130px, 1fr));
+ gap: 12px;
+ margin: 1.25rem 0;
+}
+.folder-legend-card {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ text-align: center;
+ padding: 14px 10px 12px;
+ border: 1px solid #e2e8f0;
+ border-radius: 8px;
+ gap: 8px;
+ background: #f8fafc;
+}
+.folder-legend-card img {
+ object-fit: contain;
+}
+.folder-legend-card strong {
+ font-size: 0.82rem;
+ color: #1e293b;
+ line-height: 1.3;
+}
+.folder-legend-card span {
+ font-size: 0.75rem;
+ color: #64748b;
+ line-height: 1.4;
+}
+td.copy-cmd {
+ cursor: pointer;
+ white-space: nowrap;
+ user-select: none;
+}
+td.copy-cmd::after {
+ content: '';
+ display: inline-block;
+ width: 20px;
+ height: 20px;
+ margin-left: 7px;
+ vertical-align: middle;
+ opacity: 0;
+ transition: opacity 0.15s;
+ background-size: contain;
+ background-repeat: no-repeat;
+ background-position: center;
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23047857' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='9' y='9' width='13' height='13' rx='2' ry='2'/%3E%3Cpath d='M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1'/%3E%3C/svg%3E");
+}
+td.copy-cmd:hover::after {
+ opacity: 1;
+}
+td.copy-cmd.copied::after {
+ opacity: 1;
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23059669' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'/%3E%3C/svg%3E");
+}
+img.wiki-img {
+ max-width: 50%;
+ border: 1px solid #94a3b8;
+ border-radius: 4px;
+ background-color: #fff;
+ padding: 3px;
+}
table.file-legend tr td {
padding: 6px 10px;
}
-td.file-legend-same {
+.file-legend-same {
background-color: #0f172a;
color: #e2e8f0;
}
-td.file-legend-different {
+.file-legend-different {
background-color: #d1fadf;
}
-td.file-legend-missing-left {
+.file-legend-missing-left {
background-color: #e0f2fe;
}
-td.file-legend-missing-right {
+.file-legend-missing-right {
background-color: #fef9c3;
}
-td.file-legend-merged {
+.file-legend-merged {
background-color: #fef3c7;
}
+.file-legend-swatch {
+ width: 100%;
+ height: 20px;
+ border-radius: 3px;
+ border: 1px solid rgba(0,0,0,0.08);
+}
#main a[href^="https://"]::before, #main a[href^="http://"]::before, .link-https::before, .link-external::before {
font-family: "Font Awesome 6 Brands", "Font Awesome 6 Free";
padding-right: 0.35em;
diff --git a/faq.md b/faq.md
index f4d8684..a9c5b36 100644
--- a/faq.md
+++ b/faq.md
@@ -14,8 +14,7 @@ title: Frequently Asked Questions
-----
The VisualDiffer app doesn't directly offer a way to integrate with Finder, but you can use the Automator script available on [VisualDiffer Hub](https://github.com/visualdiffer).
-Download the script from [GitHub](https://github.com/visualdiffer/scripts/downloads), unzip it and double-click the workflow file to install.
-How to use it is described [here](https://github.com/visualdiffer/scripts).
+How to install and use it is described on the [Finder integration](finder.html) page.
[Use as External Diff Tool](#use_as_external_diff_tool)
=========================
@@ -32,8 +31,7 @@ VisualDiffer can be integrated with many applications thanks to the command-line
[VisualDiffer always prompts for a file open panel, why?](#visualdiffer_always_prompts_for_a_file_open_panel_why)
=======================================================
-Starting from version 1.4.2 VisualDiffer fully complies with
-[Apple sandboxing](https://developer.apple.com/library/mac/#documentation/Security/Conceptual/AppSandboxDesignGuide/AboutAppSandbox/AboutAppSandbox.html) rules and this introduced a different way to access the file system.
+VisualDiffer runs inside the [Apple sandbox](https://developer.apple.com/documentation/security/app_sandbox), which introduced a different way to access the file system.
[Open existing vdiff sessions](#open_existing_vdiff_sessions)
----------------------------
@@ -45,7 +43,6 @@ If VisualDiffer is used as an external diff tool you may need to manually add pa
[Customize the file date/time format in Folder Differ View](#customize_the_file_date_time_format_in_folder_differ_view)
=========================================================
-Since version 1.4.4 or above
By default the Folder Differ View shows for files and folders a long format containing seconds; currently this value can't be changed from the user interface but you can set it from the terminal.
diff --git a/fileDiff.md b/fileDiff.md
new file mode 100644
index 0000000..1bf31c5
--- /dev/null
+++ b/fileDiff.md
@@ -0,0 +1,145 @@
+---
+permalink: fileDiff.html
+layout: default
+
+# mainAnchor is used by Apple links
+mainAnchor: fileDiff
+title: File Diff View
+subtitle: Comparing and editing text files side by side
+---
+
+The file diff view shows two text files side by side with their differences highlighted. You can copy or delete lines to resolve differences and save the result.
+
+# [Main Areas](#main_areas)
+
+{:.wiki-img}
+
+**① Scope bar** — controls which lines are shown and toggles whitespace visibility. See [Scope Bar](#scope_bar).
+
+**② Diff panels** — the two file contents shown side by side. Each line is color-coded; see [Colors Legend](colorsLegend.html#file_colors).
+
+**③ Difference indicator** — the narrow strip on the right side gives a bird's-eye view of all differences in the file. Click anywhere on it to jump to that area. See [Colors Legend](colorsLegend.html#difference_indicator).
+
+**④ Info bar** — shows per-file metadata and lets you change the file encoding. See [Info Bar](#info_bar).
+
+# [Scope Bar](#scope_bar)
+
+The scope bar has two independent controls.
+
+**Show Whitespace** — when active, space, tab, and **line-ending characters** are drawn as visible symbols. This is particularly useful when comparing files with different line-ending conventions: **Unix (LF)** lines end with **¶**, while **DOS (CR+LF)** lines end with **¤**. With Show Whitespace enabled, the end-of-line markers are visible on every line, making it immediately clear which convention each file uses and where the two differ.
+
+The filter group is mutually exclusive:
+
+
+
+
+
+ | Segment |
+ Shows |
+
+
+
+
+ | All |
+ Every line in the file |
+
+
+ | Just Differences |
+ Only lines that differ between left and right |
+
+
+ | Just Matches |
+ Only lines that are identical on both sides |
+
+
+
+
+
+# [Info Bar](#info_bar)
+
+Each panel has an info bar at the bottom showing:
+
+- **Date and size** — the file's last modification date and byte count.
+- **Encoding** — the character encoding used to read the file. Click the popup to switch to a different encoding; the file is reloaded immediately with the new encoding.
+- **EOL** — the line ending format detected in the file (LF for Unix, CR+LF for Windows, CR for classic Mac).
+
+# [Copying and Deleting Lines](#copying_and_deleting_lines)
+
+These are the core editing actions. Select one or more lines first, then use the **Actions** menu:
+
+- **Copy Lines to Left** — copies the selected lines from the right panel to the left panel.
+- **Copy Lines to Right** — copies the selected lines from the left panel to the right panel.
+- **Delete Lines** — removes the selected lines from the active panel.
+
+After a copy or delete the affected panel is marked as modified. Save it with the **Save** button in the path bar above the panel, or via the standard File → Save.
+
+## [Selecting a Diff Section](#selecting_a_diff_section)
+
+A *section* is a contiguous block of differing lines. Two shortcuts in the Edit menu speed up selection:
+
+- **Select Section** — selects all lines belonging to the same diff section as the current row.
+- **Select Adjacent Sections** — extends the selection to include the immediately neighbouring sections above and below.
+
+# [Show Details](#show_details)
+
+**View → Show Details** opens a panel below the diff tables that shows the selected line at character level, highlighting exactly which characters differ. Hide it again from the same menu item or from the right-click menu inside the panel.
+
+> **Line-ending characters are always shown in the Details panel**, even when Show Whitespace is off. Unix lines end with **¶**, DOS lines end with **¤**. This makes it easy to identify the source of a difference that looks identical at first glance.
+
+# [Navigating Differences](#navigating_differences)
+
+Use the toolbar buttons (or the View menu) to move between differences:
+
+- **Previous Difference / Next Difference** — jumps to the previous or next differing section within the current file. When you reach the end of the file, if the diff was opened from a folder comparison session, VisualDiffer can automatically load the previous or next file pair that has differences. This behaviour is configured in **Preferences → Text → Difference Navigator**.
+
+# [Reload and Recompare](#reload_and_recompare)
+
+- **Reload Files** (View menu) — re-reads both files from disk without running a new comparison. Use this after an external application has modified a file.
+- **Recompare** (View menu) — re-reads both files and runs a fresh comparison. Use this after changing the session comparison options.
+
+# [Session Preferences](#session_preferences)
+
+Open the session preferences with the toolbar button or the **Actions** menu. The **Comparison** tab contains options that affect how differences are computed for this file pair.
+
+{:.wiki-img}
+
+
+
+
+
+ | Option |
+ Effect |
+
+
+
+
+ | Ignore Line Endings (DOS/Mac) |
+ Files that differ only in CR+LF vs LF vs CR are treated as identical |
+
+
+ | Ignore Leading Whitespace |
+ Spaces and tabs at the start of a line are ignored |
+
+
+ | Ignore Trailing Whitespace |
+ Spaces and tabs at the end of a line are ignored |
+
+
+ | Ignore Internal Whitespace |
+ Sequences of spaces and tabs within a line are treated as equivalent |
+
+
+ | Ignore Character Case |
+ Uppercase and lowercase letters are treated as identical |
+
+
+
+
+
+Changing any option triggers a recompare automatically.
+
+# [Other View Options](#other_view_options)
+
+- **Word Wrap** (View menu) — wraps long lines instead of requiring horizontal scrolling.
+- **Swap Sides** (View menu) — exchanges left and right, reversing the direction of the comparison.
+- **Set Left Read-Only / Set Right Read-Only** (View menu) — prevents editing on the chosen side.
diff --git a/fileFilters-evaluation.md b/fileFilters-evaluation.md
new file mode 100644
index 0000000..573e85d
--- /dev/null
+++ b/fileFilters-evaluation.md
@@ -0,0 +1,293 @@
+# File Filters — Wiki Page Evaluation
+
+> **For the wiki agent.** This document evaluates `fileFilters.md` and tells you exactly what
+> to add or improve. All content is described in full — you do not need to read the app source
+> code. Do NOT publish this file as a wiki page.
+
+---
+
+## 1. Current State of `fileFilters.md`
+
+The page exists (223 lines, permalink `fileFilters.html`). The site is Jekyll + kramdown.
+
+### Sections already present — do not rewrite unless noted
+
+| Section | Status |
+|---|---|
+| Opening File Filters | OK — references `toolbar.png` (generic; see screenshot gap §4) |
+| How Filters Work (Any/All, +/− buttons, rule structure) | OK — add Any/All example from §3b |
+| Name Filters — table with 6 comparators | OK — add "is like" examples from §3a |
+| Path Filters — table with 3 comparators, path example, Exclude mention | OK — add Exclude screenshot from §4, clarify where to right-click (§2e) |
+| File Size Filters | **INCOMPLETE** — missing comparator table, add content from §2a |
+| File Modification Date Filters — table with 4 comparators | OK |
+| Managing Filter Sets — ⊙ menu with 5 actions | OK — add session-vs-global note from §2d |
+| Folder Traversal | OK — add performance example from §3c |
+
+### Screenshots already in `img/screenshots/folder/fileFilters/`
+
+| File | Shows |
+|---|---|
+| `main.png` | Filter panel with active rules and logic operator |
+| `options.png` | Category dropdown (Name, Name Ignore Case, Path, Path Ignore Case, File Size, File Modification Date) |
+| `nameOptions.png` | Name comparators (contains, begins with, ends with, is, is not, is like) |
+| `pathOptions.png` | Path comparators (contains, is, ends with) |
+| `fileSizeOptions.png` | File size filter UI with size unit selector |
+| `fileDateOperators.png` | Date comparators (exactly, is not, before, after) |
+| `contextMenu.png` | ⊙ management menu (Fill with Defaults, Set Current as Defaults, Restore Factory Defaults, Copy to Clipboard, Paste from Clipboard) |
+| `traverseFileFilters.png` | Folder traversal option in Comparison tab |
+
+---
+
+## 2. Missing Sections — add this content
+
+### 2a. File Size comparator table — HIGH PRIORITY
+
+The current wiki text for File Size only says:
+> "Specify the size value and select the unit (Bytes, KB, MB, GB)."
+
+The app supports four comparators for File Size. Add a table identical in style to the other
+categories, placed between the `fileSizeOptions.png` image and the next section:
+
+| Comparator | Description |
+|---|---|
+| is | File size equals the specified value |
+| is not | File size does not equal the specified value |
+| is less than | File size is smaller than the specified value |
+| is greater than | File size is larger than the specified value |
+
+The existing screenshot `fileSizeOptions.png` already shows the file size UI; no new screenshot
+is needed for this section.
+
+### 2b. Default Filters — HIGH PRIORITY
+
+The page never tells the user what the factory defaults are. Add a callout or short paragraph
+(suggested placement: inside the "How Filters Work" section or as its own short section
+immediately after it).
+
+**Before adding this**, check `_includes/displayFiles.md` — it already lists the default
+filters. If that include is already rendered on a page accessible from fileFilters.md, add a
+cross-link instead of duplicating. If not, use the following content:
+
+---
+
+The factory default filters exclude version control directories and common system junk files:
+
+| Excluded item | Rule used |
+|---|---|
+| `.DS_Store` | Name is `.DS_Store` |
+| `*~` (backup files) | Name is like `*~` |
+| `CVS` | Name is like `CVS` |
+| `.svn` | Name is like `.svn` |
+| `.git` | Name is like `.git` |
+| `.hg` | Name is like `.hg` |
+| `.bzr` | Name is like `.bzr` |
+
+These are combined with `Any` (logical OR), so a file or folder is excluded if its name matches
+any one of these rules.
+
+---
+
+### 2c. Show Filtered Files — HIGH PRIORITY
+
+The page says nothing about what happens visually to filtered items or how to toggle their
+visibility. Add a new section after Filter Categories and before Managing Filter Sets.
+
+**Suggested section title:** `Show Filtered Files`
+
+**Content to add:**
+
+---
+
+By default, files and folders that match the active filters are hidden from the folder
+comparison view. You can make them visible without removing the filters:
+
+- **Via the View menu** — choose **Show Filtered Files** to display them. The menu item
+ toggles to **Hide Filtered Files** when they are visible.
+- **Via the scope bar** — the **Filtered** segment at the right end of the scope bar shows or
+ hides filtered items without opening any menu.
+
+When filtered items are shown, they appear with a distinct visual style (greyed out) so you
+can tell them apart from normal comparison results.
+
+> Filtered files are skipped during copy and delete operations even when they are visible.
+> To include them, select **Show Filtered Files** from the View menu.
+
+---
+
+Use the new screenshot `scopeBarFiltered.png` (see §4) to illustrate the scope bar with the
+Filtered segment visible. Optionally add `filteredInView.png` showing the greyed-out items
+in the folder view.
+
+### 2d. Session filters vs. global defaults — MEDIUM PRIORITY
+
+The opening paragraph already states:
+> "Filters are defined globally and apply to all sessions; each session can override them
+> with its own set."
+
+But the mechanism is never explained. Add a short note (as a callout or a sentence block)
+in the Managing Filter Sets section, after the action table:
+
+---
+
+**How session filters and global defaults relate:**
+
+Each open session keeps its own copy of the filter rules. Changes you make in the Session
+Preferences dialog affect only the current session. The ⊙ menu lets you synchronise
+between the session and the application-wide default:
+
+- **Set Current as Defaults** — saves the current session's filters as the new global
+ default, applied to every future new session.
+- **Fill with Defaults** — replaces the current session's filters with the global default,
+ discarding any local changes.
+- **Restore Factory Defaults** — clears the global default and reverts to the original
+ factory filters (see Default Filters section).
+
+---
+
+### 2e. Context menu "Exclude" — MEDIUM PRIORITY
+
+The Path Filters section already mentions the Exclude menu item but does not say where to
+find it. Replace or expand the existing sentence:
+
+> "The context menu item **Exclude** automatically adds a path filter for the selected folder."
+
+With:
+
+> Right-click any file or folder in the **folder comparison view** and choose **Exclude** from
+> the context menu. VisualDiffer automatically adds a `Path ends with ` rule
+> for the selected item to the current session's filters.
+
+Add the screenshot `contextMenuExclude.png` (see §4) immediately after this text.
+
+---
+
+## 3. Advanced Features That Need Clarifying Examples
+
+### 3a. "is like" — wildcard patterns — ADVANCED, ADD EXAMPLES
+
+The current text only says:
+> "`?` matches exactly one character and `*` matches zero or more characters"
+
+No examples are given. Add an example block immediately after that sentence, inside the Name
+Filters section:
+
+---
+
+`is like` uses **glob-style** patterns, not regular expressions. The `.` character has no
+special meaning — it matches a literal dot.
+
+| Pattern | Matches | Does NOT match |
+|---|---|---|
+| `*.tmp` | `build.tmp`, `cache.tmp` | `notes.txt` |
+| `test_??.swift` | `test_01.swift`, `test_ab.swift` | `test_1.swift` (only one character after `_`) |
+| `.*` | `.DS_Store`, `.gitignore`, `.env` | `readme.md` |
+| `backup*` | `backup.zip`, `backup_2024.tar.gz` | `mybackup.zip` (does not start with `backup`) |
+
+To match hidden files on macOS (names starting with a dot), use the pattern `.*` with
+**Name (Ignore Case) is like**.
+
+---
+
+### 3b. Any vs. All — compound rules — ADVANCED, ADD EXAMPLE
+
+The Any/All distinction is non-obvious when mixing different filter categories. Add a concrete
+example to the "How Filters Work" section, after the existing Any/All description:
+
+---
+
+**Example — exclude only large log files**
+
+*Goal:* exclude files that are *both* named `*.log` *and* larger than 10 MB.
+You do not want to exclude all `.log` files, and you do not want to exclude all large files.
+
+Set the operator to **All**, then add two rules:
+
+1. `Name (Ignore Case)` **is like** `*.log`
+2. `File Size` **is greater than** `10` MB
+
+With **All**, a file must satisfy *every* rule to be excluded. Only `.log` files larger than
+10 MB are filtered out.
+
+If you used **Any**, the filter would exclude *any* file whose name ends in `.log` *plus*
+*any* file larger than 10 MB — a much broader exclusion.
+
+---
+
+### 3c. Path filter + Folder Traversal — performance use case — ADVANCED, ADD EXAMPLE
+
+The Folder Traversal section explains the toggle but not *when* to use it. Expand the section
+with a practical scenario after the existing explanation:
+
+---
+
+**Example — completely skip build output directories**
+
+If your project has large `build/` or `DerivedData/` folders you never need to compare,
+you can exclude them *and* skip reading their contents entirely:
+
+1. Open the Session Preferences **File Filters** tab.
+2. Add a rule: `Name` **is** `build`
+ (add a second rule `Name is DerivedData` if needed, with operator set to **Any**)
+3. Switch to the **Comparison** tab.
+4. **Disable** the option **Traverse the folders that match the 'File Filters'**.
+
+With traversal disabled, VisualDiffer does not read the contents of matching folders at all.
+The scan is significantly faster on large trees.
+
+With traversal **enabled** (the default), filtered folders are hidden from the view but
+their contents are still read. This is useful when you want to hide a folder from the
+comparison results but still allow copy or delete actions on files inside it.
+
+---
+
+## 4. Screenshots to Take
+
+| Filename (suggested) | Section to use it in | What the screenshot must show |
+|---|---|---|
+| `toolbarFilterButton.png` | Opening File Filters | The folder comparison toolbar zoomed in on the filter icon button, with the button clearly visible. The current `toolbar.png` is a wide shot of the full toolbar and the filter button is hard to identify. Either replace it or add a focused crop. |
+| `scopeBarFiltered.png` | Show Filtered Files (new §2c) | The scope bar at the bottom of the folder comparison window. The **Filtered** segment on the right end of the bar must be visible. Ideal state: some files are filtered, so the segment is active/highlighted. |
+| `filteredInView.png` | Show Filtered Files (new §2c) — optional | The folder comparison view with Show Filtered Files active. Filtered items should be visible in the list with their greyed-out appearance, alongside normal (non-filtered) items so the contrast is clear. |
+| `contextMenuExclude.png` | Path Filters (§2e) | Right-click context menu open on a folder or file in the folder comparison view. The **Exclude** menu item must be visible in the menu. |
+
+---
+
+## 5. Cross-reference Checklist
+
+Before publishing changes, verify these related pages to avoid duplication:
+
+- [ ] `_includes/displayFiles.md` — already lists the default filters (.DS_Store, .git, etc.).
+ Read it. If that include is already rendered in a publicly visible page, use a Jekyll include
+ or a link from the Default Filters section instead of copy-pasting the list.
+- [ ] `preferences/folder.md` — check if the Folder Traversal option is documented there.
+ If yes, add a cross-link in the Folder Traversal section of fileFilters.md rather than
+ duplicating the explanation.
+- [ ] `preferences/confirmations.md` — contains "Include Filtered Items By Default"
+ (the preference that controls whether filtered files are included in copy/delete by default).
+ The new Show Filtered Files section should mention this preference and link to that page.
+- [ ] `colorsLegend.md` line 54 — references filtered folders in the color legend. After adding
+ the Show Filtered Files section, add a cross-link from colorsLegend.md to that new anchor.
+- [ ] `index.md` — the Table of Contents already links to File Filters. No change needed unless
+ you add sub-anchors you want to surface at the top level.
+
+---
+
+## 6. Suggested Final Page Structure
+
+```
+File Filters
+│
+├── Opening File Filters existing — OK (consider replacing toolbar.png)
+├── How Filters Work existing — add Any/All example (§3b)
+├── Default Filters NEW (§2b) — or reuse include from _includes/displayFiles.md
+├── Filter Categories
+│ ├── Name Filters existing — add "is like" examples (§3a)
+│ ├── Path Filters existing — add Exclude screenshot + clarify right-click (§2e)
+│ ├── File Size Filters existing — add comparator table (§2a)
+│ └── File Modification Date existing — OK
+├── Show Filtered Files NEW (§2c) — needs scopeBarFiltered.png
+├── Managing Filter Sets existing — add session-vs-global note (§2d)
+└── Folder Traversal existing — add Path+Traversal example (§3c)
+```
+
+Total new screenshots needed: 2 required (`scopeBarFiltered.png`, `contextMenuExclude.png`),
+2 optional (`toolbarFilterButton.png` crop, `filteredInView.png`).
diff --git a/fileFilters.md b/fileFilters.md
index eee1c57..228713f 100644
--- a/fileFilters.md
+++ b/fileFilters.md
@@ -8,57 +8,167 @@ title: File Filters
subtitle: Filters can be used to exclude files from comparison, copy and delete actions
---
-Files can be excluded from comparison by specifying filenames, relative paths, file sizes, and file modification dates.
+File filters let you exclude files and folders from comparison, copy and delete actions. Filters are defined globally and apply to all sessions; each session can override them with its own set.
-# Filename Filters
+# [Opening File Filters](#opening_file_filters)
-Available filters for filenames are shown below.
+Click the filter icon in the folder view toolbar to open the Session Preferences dialog on the **File Filters** tab.
+
+{:.wiki-img}
+
+# [How Filters Work](#how_filters_work)
+
+The panel shows the list of active rules and a logic operator that controls how they are combined.
+
+{:.wiki-img}
+
+- **Any** — a file is excluded if *at least one* rule matches (logical OR)
+- **All** — a file is excluded only if *all* rules match (logical AND)
+
+Use the **+** button at the end of a rule row to add a new rule below it, and the **−** button to remove it.
+
+**Example — exclude only large log files**
+
+*Goal:* exclude files that are *both* named `*.log` *and* larger than 10 MB.
+You do not want to exclude all `.log` files, and you do not want to exclude all large files.
+
+Set the operator to **All**, then add two rules:
+
+1. `Name (Ignore Case)` **is like** `*.log`
+2. `File Size` **is greater than** `10` MB
+
+With **All**, a file must satisfy *every* rule to be excluded. Only `.log` files larger than 10 MB are filtered out. If you used **Any**, the filter would exclude *any* file whose name ends in `.log` *plus* *any* file larger than 10 MB — a much broader exclusion.
+
+Each rule is made up of three parts: a **category**, a **comparator**, and a **value**.
+
+# [Default Filters](#default_filters)
+
+The factory-default filters exclude version control directories and common system junk files. See the [Comparison Method](comparisonMethods.html#show_filtered_files) page for the full list of excluded items (`.DS_Store`, `.git`, `.svn`, `.hg`, `.bzr`, CVS, and backup files matching `*~`).
+
+These rules are combined with **Any** (logical OR), so a file or folder is excluded if its name matches any one of them.
+
+# [Filter Categories](#filter_categories)
+
+{:.wiki-img}
+
+## [Name Filters](#name_filters)
+
+Available for categories **Name** (case-sensitive) and **Name (Ignore Case)** (case-insensitive).
+
+{:.wiki-img}
- | Comparator Filter |
+ Comparator |
Description |
- | Contains |
+ contains |
Filename contains the specified string |
- | Begins with |
+ begins with |
Filename begins with the specified string |
- | Ends with |
+ ends with |
Filename ends with the specified string |
- | Is |
+ is |
Filename is equal to the specified string |
- | Is not |
+ is not |
Filename is not equal to the specified string |
- | Is like |
- Filename equals the specified string
- ? and * are allowed as wildcard characters, where ? matches 1 character and * matches 0 or more characters |
+ is like |
+ Filename matches the specified pattern;
+ ? matches exactly one character and * matches zero or more characters |
+
+
+
+
+
+`is like` uses **glob-style** patterns, not regular expressions. The `.` character has no special meaning — it matches a literal dot.
+
+
+
+
+
+ | Pattern |
+ Matches |
+ Does NOT match |
+
+
+
+
+ *.tmp |
+ build.tmp, cache.tmp |
+ notes.txt |
+
+
+ test_??.swift |
+ test_01.swift, test_ab.swift |
+ test_1.swift (only one character after _) |
+
+
+ .* |
+ .DS_Store, .gitignore, .env |
+ readme.md |
+
+
+ backup* |
+ backup.zip, backup_2024.tar.gz |
+ mybackup.zip (does not start with backup) |
+
+
+
+
+
+To match hidden files on macOS (names starting with a dot), use the pattern `.*` with **Name (Ignore Case) is like**.
+
+## [Path Filters](#path_filters)
+
+Available for categories **Path** (case-sensitive) and **Path (Ignore Case)** (case-insensitive).
+The value is a path relative to the comparison root.
+
+{:.wiki-img}
+
+
+
+
+
+ | Comparator |
+ Description |
+
+
+
+
+ | contains |
+ Path contains the specified string |
+
+
+ | is |
+ Path is equal to the specified string |
+
+
+ | ends with |
+ Path ends with the specified string |
-# Path Filters
+**Example**
-It is possible to filter by specifying a path relative to the root; this allows you to exclude specific paths.
-Example:
+Left root path: /Users/dave/sources/
-Left root path: /Users/dave/sources/
-Folder content
/Users/dave/sources/
project_1
@@ -67,19 +177,171 @@ Folder content
src/
index.txt
-To exclude only the folder src under project_1 you can specify project_1/src as the path filter.
-The path is relative to root /Users/dave/sources/; you can use both folders and files as a path filter.
-The context menu item 'Exclude' automatically excludes folders as a path.
-Be careful not to add extra characters; the following paths will never be found:
+To exclude only the src folder under project_1, set the path filter value to project_1/src.
+The path is relative to the root /Users/dave/sources/; both folders and files are accepted as path values.
+Right-click any file or folder in the **folder comparison view** and choose **Exclude** from the context menu. VisualDiffer automatically adds a `Path ends with ` rule for the selected item to the current session's filters.
+
+{:.wiki-img}
+
+Be careful not to add extra characters; the following paths will never match:
project_1//src invalid, double slash
-project_1/src/ invalid, trailing slash
+project_1/src/ invalid, trailing slash
+
+## [File Size Filters](#file_size_filters)
+
+Available for category **File Size**. Applies to files only, not folders.
+Specify the size value and select the unit (Bytes, KB, MB, GB).
+
+{:.wiki-img}
+
+
+
+
+
+ | Comparator |
+ Description |
+
+
+
+
+ | is |
+ File size equals the specified value |
+
+
+ | is not |
+ File size does not equal the specified value |
+
+
+ | is less than |
+ File size is smaller than the specified value |
+
+
+ | is greater than |
+ File size is larger than the specified value |
+
+
+
+
+
+## [File Modification Date Filters](#file_modification_date_filters)
+
+Available for category **File Modification Date**. Applies to files only, not folders.
+
+{:.wiki-img}
+
+
+
+
+
+ | Comparator |
+ Description |
+
+
+
+
+ | exactly |
+ Modification date matches exactly |
+
+
+ | is not |
+ Modification date does not match |
+
+
+ | before |
+ Modification date is earlier than the specified date |
+
+
+ | after |
+ Modification date is later than the specified date |
+
+
+
+
+
+# [Show Filtered Files](#show_filtered_files)
+
+By default, files and folders that match the active filters are hidden from the folder comparison view. You can make them visible without removing the filters:
+
+- **Via the View menu** — choose **Show Filtered Files** to display them. The menu item toggles to **Hide Filtered Files** when they are visible.
+- **Via the scope bar** — the **Filtered** segment at the right end of the scope bar shows or hides filtered items without opening any menu.
+
+{:.wiki-img}
+
+When filtered items are shown, they appear with a distinct visual style so you can tell them apart from normal comparison results, as shown in the figure below.
+
+{:.wiki-img}
+
+> Filtered files are skipped during copy and delete operations even when they are visible. To include them by default, enable **Include Filtered Items By Default** in [Confirmations Preferences](preferences/confirmations.html).
+
+# [Managing Filter Sets](#managing_filter_sets)
+
+The **⊙** button in the top-right corner of the panel opens a menu to manage filter configurations.
+
+{:.wiki-img}
+
+
+
+
+
+ | Action |
+ Description |
+
+
+
+
+ | Fill with Defaults |
+ Loads the filters saved as your personal defaults |
+
+
+ | Set Current as Defaults |
+ Saves the current filter list as your personal defaults |
+
+
+ | Restore Factory Defaults |
+ Resets filters to the original factory defaults |
+
+
+ | Copy to Clipboard |
+ Copies the current filter configuration to the clipboard |
+
+
+ | Paste from Clipboard |
+ Applies a filter configuration previously copied to the clipboard |
+
+
+
+
+
+**How session filters and global defaults relate:**
+
+Each open session keeps its own copy of the filter rules. Changes you make in the Session Preferences dialog affect only the current session. The ⊙ menu lets you synchronise between the session and the application-wide default:
+
+- **Set Current as Defaults** — saves the current session's filters as the new global default, applied to every future new session.
+- **Fill with Defaults** — replaces the current session's filters with the global default, discarding any local changes.
+- **Restore Factory Defaults** — clears the global default and reverts to the original factory filters (see [Default Filters](#default_filters)).
+
+# [Folder Traversal](#folder_traversal)
+
+By default, folders matching the active filters are still traversed during comparison — they are hidden from the view but their contents are read.
+
+The option **Traverse the folders that match the 'File Filters'** in the **Comparison** tab controls this behaviour.
+
+When this option is **disabled**, folders matching the filters are not traversed at all. This makes the scan faster, but those folders will appear empty in the view even if they contain files.
+
+{:.wiki-img}
+
+**Example — completely skip build output directories**
+If your project has large `build/` or `DerivedData/` folders you never need to compare, you can exclude them *and* skip reading their contents entirely:
-# File Size Filters
+1. Open the Session Preferences **File Filters** tab.
+2. Add a rule: `Name` **is** `build`
+ (add a second rule `Name is DerivedData` if needed, with operator set to **Any**)
+3. Switch to the **Comparison** tab.
+4. **Disable** the option **Traverse the folders that match the 'File Filters'**.
-It is possible to specify files (not folders) to exclude based on their size expressed in bytes, KB, MB and GB.
+With traversal disabled, VisualDiffer does not read the contents of matching folders at all. The scan is significantly faster on large trees.
-# File Modification Date Filters
+With traversal **enabled** (the default), filtered folders are hidden from the view but their contents are still read. This is useful when you want to hide a folder from the comparison results but still allow copy or delete actions on files inside it.
-It is possible to specify files (not folders) to exclude based on their last modification date and time.
diff --git a/fileLegend.md b/fileLegend.md
deleted file mode 100755
index 1664f82..0000000
--- a/fileLegend.md
+++ /dev/null
@@ -1,48 +0,0 @@
----
-permalink: fileLegend.html
-layout: default
-
-# mainAnchor is used by Apple links
-mainAnchor: fileLegend
-title: File Colors Legend
-subtitle: Colors used in File Differ View
----
-
-Line colors in the File Differ View are based on differences found.
-
-
-
-
-
- | Color |
- Description |
-
-
-
-
- |
- Text content on left and right is the same |
-
-
-
- |
- Text content present on the left differs from text content present on the right |
-
-
-
- |
- Text content is present only on the right; on the left the line is missing |
-
-
-
- |
- Text content is present only on the left; on the right the line is missing |
-
-
-
- |
- Text content has been copied from the other side; this marks the document as edited and it can be saved |
-
-
-
-
diff --git a/finder.md b/finder.md
index e679c21..045c267 100755
--- a/finder.md
+++ b/finder.md
@@ -26,9 +26,7 @@ You don't need to run VisualDiffer and then select items to compare; if you are
Add to the Finder context menu (under Services) a new menu item to allow file and folder comparison.
## [How to Install](#how_to_install)
-- On Lion or above double-click the "Compare with VisualDiffer.workflow" file
-- On Snow Leopard you must manually copy the file `Compare with VisualDiffer.workflow` inside the directory `/Users/your account
-name/Library/Services`. If the directory `Services` doesn't exist you must create it.
+Double-click the "Compare with VisualDiffer.workflow" file to install it.
More details about installation are available here.
diff --git a/folderOperations.md b/folderOperations.md
new file mode 100644
index 0000000..c6d532e
--- /dev/null
+++ b/folderOperations.md
@@ -0,0 +1,105 @@
+---
+permalink: folderOperations.html
+layout: default
+
+# mainAnchor is used by Apple links
+mainAnchor: folderOperations
+title: Folder Operations
+subtitle: Copy, move, delete, sync, and date operations on files
+---
+
+All file operations in the folder comparison view are available from the **Actions** menu and from the right-click context menu. Most operations show a confirmation dialog before proceeding; confirmations can be turned off individually in **Preferences → Confirmations**.
+
+> Hold **⌥ Option** when clicking an Actions menu item that has a confirmation setting to force the dialog to appear, even if the confirmation has been disabled.
+
+# [Copy, Move, Delete](#copy_move_delete)
+
+**Copy Files** — copies the selected files from the active side to the other.
+
+**Move Files** — moves the selected files from the active side to the other. The source files are deleted after a successful copy.
+
+**Delete Files** — deletes the selected files from the active side.
+
+When a destination file already exists, VisualDiffer asks whether to replace it.
+
+## [Advanced Operations](#advanced_operations)
+
+Under **Actions → Advanced** you find two additional copy and move variants:
+
+- **Copy to Folder** — copies the selected files to a folder you choose from an open panel, instead of to the mirrored path on the other side.
+- **Move to Folder** — same as above but removes the source files after copying.
+- **Copy Metadata** — copies only the Finder metadata (labels and tags) of the selected files to the other side, without touching the file content.
+
+# [Sync Files](#sync_files)
+
+Sync is a smarter copy: it copies only the files that are **newer** or **orphan** (present on one side only). Use it to bring two folders up to date without touching files that are already identical.
+
+{:.wiki-img}
+
+The Sync dialog shows a preview tree of all files that will be copied before anything is changed.
+
+
+
+
+
+ | Option |
+ Description |
+
+
+
+
+ | Use selection |
+ Restricts the sync to the files currently selected in the folder view.
+ Disabled automatically when nothing is selected. |
+
+
+ | Sync both sides |
+ Copies newer and orphan files in both directions simultaneously.
+ When off, only files from the side you started the sync on are copied to the other. |
+
+
+
+
+
+The icon and description at the top of the dialog update in real time to reflect the current direction:
+
+- **→ right** — copies from left to right (default when started from the left tree).
+- **← left** — copies from right to left (default when started from the right tree).
+- **↔ both** — copies newer and orphan files in both directions when *Sync both sides* is on.
+
+Click **Sync** to start. A progress sheet shows the operation and reports any errors.
+
+# [Set Modification Date](#set_modification_date)
+
+This operation changes the modification date of the selected files. It is useful to fix timestamp mismatches without touching file content, for example after copying files across file systems that lose timestamp precision.
+
+{:.wiki-img}
+
+
+
+
+
+ | Option |
+ Description |
+
+
+
+
+ | Copy Date from the other side |
+ Sets the modification date of each selected file to match the date of
+ the corresponding file on the other side. |
+
+
+ | Set Date to |
+ Sets the modification date to a specific date and time you pick with
+ the date and time pickers. |
+
+
+ | Apply to all folder contents |
+ Visible only when the selection contains folders. When enabled, the
+ date change is applied recursively to every file and subfolder inside
+ the selected folders. |
+
+
+
+
diff --git a/folderView.md b/folderView.md
new file mode 100644
index 0000000..7bae305
--- /dev/null
+++ b/folderView.md
@@ -0,0 +1,145 @@
+---
+permalink: folderView.html
+layout: default
+
+# mainAnchor is used by Apple links
+mainAnchor: folderView
+title: Folder Compare View
+subtitle: Overview of the folder comparison window
+---
+
+The folder comparison window shows two directory trees side by side and lets you compare, navigate, and act on their contents.
+
+# [Main Areas](#main_areas)
+
+{:.wiki-img}
+
+**① Toolbar** — quick access to comparison, file operations, and session preferences.
+
+**② Path control** — shows the left and right root paths. Click to change a path, or drag a folder from Finder onto it.
+
+**③ Folder trees** — the two directory trees shown side by side. Files and folders are color-coded to reflect the comparison result; see [Colors Legend](colorsLegend.html) for details.
+
+**④ Scope bar** — filters what is shown in the trees. See [Scope Bar](#scope_bar) below.
+
+# [Scope Bar](#scope_bar)
+
+{:.wiki-img}
+
+The scope bar has three independent groups.
+
+## [Display Filter](#scope_bar_display_filter)
+
+The first group is a radio selector; only one choice is active at a time.
+
+
+
+
+
+ | Segment |
+ Shows |
+
+
+
+
+ | All |
+ Every file and folder regardless of comparison result |
+
+
+ | Only Mismatches |
+ Files that differ: newer on one side, modified content, or orphan |
+
+
+ | Only Matches |
+ Only identical files |
+
+
+ | No Orphans |
+ Mismatches and matches, but without files that exist on one side only |
+
+
+ | Only Orphans |
+ Only files present on one side only |
+
+
+
+
+
+## [Folders](#scope_bar_folders)
+
+The **Folders:** group contains two independent toggles that control folder visibility. Both can be active at the same time.
+
+
+
+
+
+ | Toggle |
+ Effect when active |
+
+
+
+
+ | Empty |
+ Shows folders that are empty on disk or whose entire contents are excluded
+ by the active file filters.
+ Empty folders are hidden by default. |
+
+
+ | No Orphans |
+ Hides folders that exist on one side only (orphan folders).
+ This only affects folder visibility; orphan files inside
+ non-orphan folders are still shown according to the display filter above. |
+
+
+
+
+
+## [Filtered](#scope_bar_filtered)
+
+The **Filtered** toggle shows or hides items excluded by the active file filters. See [Show Filtered Files](fileFilters.html#show_filtered_files) for details.
+
+# [Selecting Items](#selecting_items)
+
+The Edit menu provides several ways to select items in the active tree. Hold **⌥ Option** while opening the menu to reveal the **Both Sides** variant of each command, which acts on both trees at once.
+
+## [Select by Type](#select_by_type)
+
+- **Select All** — selects every visible item in the active tree.
+- **Select All Files** — selects only files, skipping folders.
+- **Select All Folders** — selects only folders, skipping files.
+
+## [Select Newer](#select_newer)
+
+Selects the files that have a more recent modification date than their counterpart on the other side. Choose the side from the submenu:
+
+- **Left Side** — selects files on the left that are newer than the corresponding right file.
+- **Right Side** — selects files on the right that are newer than the corresponding left file.
+- **Both Sides** — selects the newer file on each side simultaneously.
+
+## [Select Orphans](#select_orphans)
+
+Selects files that exist on one side only (no counterpart on the other side):
+
+- **Left Side** — selects orphans on the left.
+- **Right Side** — selects orphans on the right.
+- **Both Sides** — selects orphans on both sides simultaneously.
+
+## [Invert Selection](#invert_selection)
+
+Reverses the current selection in the active tree. Hold **⌥ Option** to invert the selection on both trees at once.
+
+# [Set as Base Folder](#set_as_base_folder)
+
+When a folder is selected you can narrow the comparison to just that folder by choosing **Set as Base Folder** from the Actions menu. This replaces the current root with the selected folder, effectively zooming in. Three variants are available:
+
+- **Set as Base Folder** — changes the root on the side where the selection is.
+- **Set as Base Folder on the Other Side** — changes the root on the opposite side.
+- **Set as Base Folder Both Sides** — changes both roots to the selected folder (useful when the same subfolder exists on both sides).
+
+# [Read-Only Mode](#read_only_mode)
+
+Choose **Set Left Read-Only** or **Set Right Read-Only** from the View menu to prevent accidental file operations on that side. A read-only side still participates in comparisons but copy, move, and delete actions targeting it are disabled.
+
+# [Swap Sides](#swap_sides)
+
+**Swap Sides** (View menu) exchanges the left and right paths, reversing the direction of the comparison without re-running it.
diff --git a/foldersLegend.md b/foldersLegend.md
deleted file mode 100755
index be6eb20..0000000
--- a/foldersLegend.md
+++ /dev/null
@@ -1,57 +0,0 @@
----
-permalink: foldersLegend.html
-layout: default
-
-# mainAnchor is used by Apple links
-mainAnchor: foldersLegend
-title: Folder Colors Legend
-subtitle: Folders icons assume colors based on their content or filter status
----
-
-Folders are shown using different colors to quickly visualize the file comparison results.
-
-
-
diff --git a/hiddenSessings.md b/hiddenSessings.md
deleted file mode 100644
index 63b668b..0000000
--- a/hiddenSessings.md
+++ /dev/null
@@ -1,46 +0,0 @@
----
-permalink: hiddenSessings.html
-layout: default
-
-# mainAnchor is used by Apple links
-mainAnchor: hiddenSessings
-title: Hidden settings
-subtitle: Settings not yet available from the preferences panel
----
-
-Hidden settings
-===
-
-Some settings aren't available from the preferences panel and must be set from the CLI.
-
-Comparison completed notification
---
-
-`showNotificationWhenWindowIsOnFront` (`boolean`, default `false`)
-
-If `true` the notification is always shown, otherwise only when the application window isn't in the foreground.
-
- defaults write com.visualdiffer showNotificationWhenWindowIsOnFront true
-
-Customize the file date/time format in Folder Differ View
---
-
-`folderViewDateFormat` (`string`, default taken from system locale settings)
-
-It is possible to change how time is shown in the Folder Differ View.
-
-Change format
--------------
-Open the terminal application and type:
-
- defaults write com.visualdiffer folderViewDateFormat HHmmss
-
-The example above sets the format to show only the time (without date); format patterns can be found at [Unicode Technical Standard #35](https://unicode.org/reports/tr35/tr35-6.html#Date_Format_Patterns).
-
-Restore default value
-===
-
-At any time it is possible to restore the default value by deleting the key:
-
- defaults delete com.visualdiffer showNotificationWhenWindowIsOnFront
- defaults delete com.visualdiffer folderViewDateFormat
diff --git a/hiddenSettings.md b/hiddenSettings.md
new file mode 100644
index 0000000..b712845
--- /dev/null
+++ b/hiddenSettings.md
@@ -0,0 +1,116 @@
+---
+permalink: hiddenSettings.html
+layout: default
+
+# mainAnchor is used by Apple links
+mainAnchor: hiddenSettings
+title: Hidden Settings
+subtitle: Settings not yet available from the preferences panel
+---
+
+Some settings are not exposed in the Preferences panel and must be configured from the terminal using the `defaults` command.
+
+**General pattern**
+
+ defaults write com.visualdiffer
+
+**Reset to default**
+
+ defaults delete com.visualdiffer
+
+Changes take effect the next time the application is launched.
+
+# [Settings](#settings)
+
+Click any row in the **Example** column to copy the full command to the clipboard.
+
+
+
+
+
+ | Key |
+ Default |
+ Description |
+ Example |
+
+
+
+
+ alwaysResolveSymlinks |
+ YES |
+ Resolve symbolic links when determining file paths. |
+
+ -bool false
+ |
+
+
+ colorsConfigPath |
+ — |
+ Path to a JSON file containing a custom color configuration.
+ Recommended location: ~/Library/Application Scripts/com.visualdiffer |
+
+ "/path/to/vd-colors.json"
+ |
+
+
+ defaultEncoding |
+ UTF-8 |
+ Default character encoding for opening text files.
+ The value is the CFStringEncoding integer identifier. |
+
+ -int 30
+ |
+
+
+ filesStatusBarShowMessageTimeout |
+ 3 |
+ Seconds a status bar message stays visible in the file diff view before the counters are restored. |
+
+ -int 5
+ |
+
+
+ foldersDifferenceNavigatorCenterInWindow |
+ YES |
+ Center the selected difference in the folder comparison window when navigating. |
+
+ -bool false
+ |
+
+
+ folderViewDateFormat |
+ ddMMyyHHmmss |
+ Date and time format used in the folder diff view.
+ Pattern syntax: Unicode Technical Standard #35 |
+
+ HHmmss
+ |
+
+
+ showNotificationWhenWindowIsOnFront |
+ NO |
+ When NO, completion notifications are shown only when the app is in the background.
+ When YES, notifications are always shown. |
+
+ -bool true
+ |
+
+
+ showRecentDocumentsList |
+ NO |
+ Show the Recent Documents popup menu on the main window. |
+
+ -bool true
+ |
+
+
+
+
diff --git a/img/screenshots/file/differenceIndicator.png b/img/screenshots/file/differenceIndicator.png
new file mode 100644
index 0000000..e9d9f4d
Binary files /dev/null and b/img/screenshots/file/differenceIndicator.png differ
diff --git a/img/screenshots/file/main.png b/img/screenshots/file/main.png
new file mode 100644
index 0000000..a7736bb
Binary files /dev/null and b/img/screenshots/file/main.png differ
diff --git a/img/screenshots/file/sessionPrefs.png b/img/screenshots/file/sessionPrefs.png
new file mode 100644
index 0000000..35f98ee
Binary files /dev/null and b/img/screenshots/file/sessionPrefs.png differ
diff --git a/img/screenshots/folder/align/main.png b/img/screenshots/folder/align/main.png
new file mode 100644
index 0000000..74293d9
Binary files /dev/null and b/img/screenshots/folder/align/main.png differ
diff --git a/img/screenshots/folder/align/rule.png b/img/screenshots/folder/align/rule.png
new file mode 100644
index 0000000..42876af
Binary files /dev/null and b/img/screenshots/folder/align/rule.png differ
diff --git a/img/screenshots/folder/align/ruleIgnoreCase.png b/img/screenshots/folder/align/ruleIgnoreCase.png
new file mode 100644
index 0000000..748d06b
Binary files /dev/null and b/img/screenshots/folder/align/ruleIgnoreCase.png differ
diff --git a/img/screenshots/folder/fileFilters/contextMenu.png b/img/screenshots/folder/fileFilters/contextMenu.png
new file mode 100644
index 0000000..f5674f1
Binary files /dev/null and b/img/screenshots/folder/fileFilters/contextMenu.png differ
diff --git a/img/screenshots/folder/fileFilters/contextMenuExclude.png b/img/screenshots/folder/fileFilters/contextMenuExclude.png
new file mode 100644
index 0000000..d69f8ee
Binary files /dev/null and b/img/screenshots/folder/fileFilters/contextMenuExclude.png differ
diff --git a/img/screenshots/folder/fileFilters/fileDateOperators.png b/img/screenshots/folder/fileFilters/fileDateOperators.png
new file mode 100644
index 0000000..4984927
Binary files /dev/null and b/img/screenshots/folder/fileFilters/fileDateOperators.png differ
diff --git a/img/screenshots/folder/fileFilters/fileSizeOptions.png b/img/screenshots/folder/fileFilters/fileSizeOptions.png
new file mode 100644
index 0000000..3784bd5
Binary files /dev/null and b/img/screenshots/folder/fileFilters/fileSizeOptions.png differ
diff --git a/img/screenshots/folder/fileFilters/filteredInView.png b/img/screenshots/folder/fileFilters/filteredInView.png
new file mode 100644
index 0000000..bc4676b
Binary files /dev/null and b/img/screenshots/folder/fileFilters/filteredInView.png differ
diff --git a/img/screenshots/folder/fileFilters/main.png b/img/screenshots/folder/fileFilters/main.png
new file mode 100644
index 0000000..e955d0f
Binary files /dev/null and b/img/screenshots/folder/fileFilters/main.png differ
diff --git a/img/screenshots/folder/fileFilters/nameOptions.png b/img/screenshots/folder/fileFilters/nameOptions.png
new file mode 100644
index 0000000..b6ea0c0
Binary files /dev/null and b/img/screenshots/folder/fileFilters/nameOptions.png differ
diff --git a/img/screenshots/folder/fileFilters/options.png b/img/screenshots/folder/fileFilters/options.png
new file mode 100644
index 0000000..d559f3c
Binary files /dev/null and b/img/screenshots/folder/fileFilters/options.png differ
diff --git a/img/screenshots/folder/fileFilters/pathOptions.png b/img/screenshots/folder/fileFilters/pathOptions.png
new file mode 100644
index 0000000..019e823
Binary files /dev/null and b/img/screenshots/folder/fileFilters/pathOptions.png differ
diff --git a/img/screenshots/folder/fileFilters/scopeBarFiltered.png b/img/screenshots/folder/fileFilters/scopeBarFiltered.png
new file mode 100644
index 0000000..746c817
Binary files /dev/null and b/img/screenshots/folder/fileFilters/scopeBarFiltered.png differ
diff --git a/img/screenshots/folder/fileFilters/toolbar.png b/img/screenshots/folder/fileFilters/toolbar.png
new file mode 100644
index 0000000..6789ead
Binary files /dev/null and b/img/screenshots/folder/fileFilters/toolbar.png differ
diff --git a/img/screenshots/folder/fileFilters/traverseFileFilters.png b/img/screenshots/folder/fileFilters/traverseFileFilters.png
new file mode 100644
index 0000000..f8b1d0c
Binary files /dev/null and b/img/screenshots/folder/fileFilters/traverseFileFilters.png differ
diff --git a/img/screenshots/folder/operations/sync.png b/img/screenshots/folder/operations/sync.png
new file mode 100644
index 0000000..31fcf35
Binary files /dev/null and b/img/screenshots/folder/operations/sync.png differ
diff --git a/img/screenshots/folder/operations/touch.png b/img/screenshots/folder/operations/touch.png
new file mode 100644
index 0000000..a97741b
Binary files /dev/null and b/img/screenshots/folder/operations/touch.png differ
diff --git a/img/screenshots/folder/view/folders/folder-000-open.png b/img/screenshots/folder/view/folders/folder-000-open.png
new file mode 100644
index 0000000..80bc81d
Binary files /dev/null and b/img/screenshots/folder/view/folders/folder-000-open.png differ
diff --git a/img/screenshots/folder/view/folders/folder-000-open@2x.png b/img/screenshots/folder/view/folders/folder-000-open@2x.png
new file mode 100644
index 0000000..42446a8
Binary files /dev/null and b/img/screenshots/folder/view/folders/folder-000-open@2x.png differ
diff --git a/img/screenshots/folder/view/folders/folder-000.png b/img/screenshots/folder/view/folders/folder-000.png
new file mode 100644
index 0000000..2424965
Binary files /dev/null and b/img/screenshots/folder/view/folders/folder-000.png differ
diff --git a/img/screenshots/folder/view/folders/folder-000@2x.png b/img/screenshots/folder/view/folders/folder-000@2x.png
new file mode 100644
index 0000000..230684d
Binary files /dev/null and b/img/screenshots/folder/view/folders/folder-000@2x.png differ
diff --git a/img/screenshots/folder/view/folders/folder-001-open.png b/img/screenshots/folder/view/folders/folder-001-open.png
new file mode 100644
index 0000000..454a314
Binary files /dev/null and b/img/screenshots/folder/view/folders/folder-001-open.png differ
diff --git a/img/screenshots/folder/view/folders/folder-001-open@2x.png b/img/screenshots/folder/view/folders/folder-001-open@2x.png
new file mode 100644
index 0000000..d6e728f
Binary files /dev/null and b/img/screenshots/folder/view/folders/folder-001-open@2x.png differ
diff --git a/img/screenshots/folder/view/folders/folder-001.png b/img/screenshots/folder/view/folders/folder-001.png
new file mode 100644
index 0000000..cbb6946
Binary files /dev/null and b/img/screenshots/folder/view/folders/folder-001.png differ
diff --git a/img/screenshots/folder/view/folders/folder-001@2x.png b/img/screenshots/folder/view/folders/folder-001@2x.png
new file mode 100644
index 0000000..66603b7
Binary files /dev/null and b/img/screenshots/folder/view/folders/folder-001@2x.png differ
diff --git a/img/screenshots/folder/view/folders/folder-010-open.png b/img/screenshots/folder/view/folders/folder-010-open.png
new file mode 100644
index 0000000..ed79d0e
Binary files /dev/null and b/img/screenshots/folder/view/folders/folder-010-open.png differ
diff --git a/img/screenshots/folder/view/folders/folder-010-open@2x.png b/img/screenshots/folder/view/folders/folder-010-open@2x.png
new file mode 100644
index 0000000..30e42ad
Binary files /dev/null and b/img/screenshots/folder/view/folders/folder-010-open@2x.png differ
diff --git a/img/screenshots/folder/view/folders/folder-010.png b/img/screenshots/folder/view/folders/folder-010.png
new file mode 100644
index 0000000..f531dab
Binary files /dev/null and b/img/screenshots/folder/view/folders/folder-010.png differ
diff --git a/img/screenshots/folder/view/folders/folder-010@2x.png b/img/screenshots/folder/view/folders/folder-010@2x.png
new file mode 100644
index 0000000..34f0934
Binary files /dev/null and b/img/screenshots/folder/view/folders/folder-010@2x.png differ
diff --git a/img/screenshots/folder/view/folders/folder-011-open.png b/img/screenshots/folder/view/folders/folder-011-open.png
new file mode 100644
index 0000000..3fbe26b
Binary files /dev/null and b/img/screenshots/folder/view/folders/folder-011-open.png differ
diff --git a/img/screenshots/folder/view/folders/folder-011-open@2x.png b/img/screenshots/folder/view/folders/folder-011-open@2x.png
new file mode 100644
index 0000000..4cfae45
Binary files /dev/null and b/img/screenshots/folder/view/folders/folder-011-open@2x.png differ
diff --git a/img/screenshots/folder/view/folders/folder-011.png b/img/screenshots/folder/view/folders/folder-011.png
new file mode 100644
index 0000000..6712eef
Binary files /dev/null and b/img/screenshots/folder/view/folders/folder-011.png differ
diff --git a/img/screenshots/folder/view/folders/folder-011@2x.png b/img/screenshots/folder/view/folders/folder-011@2x.png
new file mode 100644
index 0000000..e91253c
Binary files /dev/null and b/img/screenshots/folder/view/folders/folder-011@2x.png differ
diff --git a/img/screenshots/folder/view/folders/folder-100-open.png b/img/screenshots/folder/view/folders/folder-100-open.png
new file mode 100644
index 0000000..0bc3b4d
Binary files /dev/null and b/img/screenshots/folder/view/folders/folder-100-open.png differ
diff --git a/img/screenshots/folder/view/folders/folder-100-open@2x.png b/img/screenshots/folder/view/folders/folder-100-open@2x.png
new file mode 100644
index 0000000..f3c1bac
Binary files /dev/null and b/img/screenshots/folder/view/folders/folder-100-open@2x.png differ
diff --git a/img/screenshots/folder/view/folders/folder-100.png b/img/screenshots/folder/view/folders/folder-100.png
new file mode 100644
index 0000000..cee1e30
Binary files /dev/null and b/img/screenshots/folder/view/folders/folder-100.png differ
diff --git a/img/screenshots/folder/view/folders/folder-100@2x.png b/img/screenshots/folder/view/folders/folder-100@2x.png
new file mode 100644
index 0000000..3e554b0
Binary files /dev/null and b/img/screenshots/folder/view/folders/folder-100@2x.png differ
diff --git a/img/screenshots/folder/view/folders/folder-101-open.png b/img/screenshots/folder/view/folders/folder-101-open.png
new file mode 100644
index 0000000..afddc27
Binary files /dev/null and b/img/screenshots/folder/view/folders/folder-101-open.png differ
diff --git a/img/screenshots/folder/view/folders/folder-101-open@2x.png b/img/screenshots/folder/view/folders/folder-101-open@2x.png
new file mode 100644
index 0000000..a2d4551
Binary files /dev/null and b/img/screenshots/folder/view/folders/folder-101-open@2x.png differ
diff --git a/img/screenshots/folder/view/folders/folder-101.png b/img/screenshots/folder/view/folders/folder-101.png
new file mode 100644
index 0000000..84e6bd2
Binary files /dev/null and b/img/screenshots/folder/view/folders/folder-101.png differ
diff --git a/img/screenshots/folder/view/folders/folder-101@2x.png b/img/screenshots/folder/view/folders/folder-101@2x.png
new file mode 100644
index 0000000..82770c3
Binary files /dev/null and b/img/screenshots/folder/view/folders/folder-101@2x.png differ
diff --git a/img/screenshots/folder/view/folders/folder-110-open.png b/img/screenshots/folder/view/folders/folder-110-open.png
new file mode 100644
index 0000000..acea2aa
Binary files /dev/null and b/img/screenshots/folder/view/folders/folder-110-open.png differ
diff --git a/img/screenshots/folder/view/folders/folder-110-open@2x.png b/img/screenshots/folder/view/folders/folder-110-open@2x.png
new file mode 100644
index 0000000..4c11ed4
Binary files /dev/null and b/img/screenshots/folder/view/folders/folder-110-open@2x.png differ
diff --git a/img/screenshots/folder/view/folders/folder-110.png b/img/screenshots/folder/view/folders/folder-110.png
new file mode 100644
index 0000000..7016dff
Binary files /dev/null and b/img/screenshots/folder/view/folders/folder-110.png differ
diff --git a/img/screenshots/folder/view/folders/folder-110@2x.png b/img/screenshots/folder/view/folders/folder-110@2x.png
new file mode 100644
index 0000000..642587d
Binary files /dev/null and b/img/screenshots/folder/view/folders/folder-110@2x.png differ
diff --git a/img/screenshots/folder/view/folders/folder-111-open.png b/img/screenshots/folder/view/folders/folder-111-open.png
new file mode 100644
index 0000000..acea2aa
Binary files /dev/null and b/img/screenshots/folder/view/folders/folder-111-open.png differ
diff --git a/img/screenshots/folder/view/folders/folder-111-open@2x.png b/img/screenshots/folder/view/folders/folder-111-open@2x.png
new file mode 100644
index 0000000..4c11ed4
Binary files /dev/null and b/img/screenshots/folder/view/folders/folder-111-open@2x.png differ
diff --git a/img/screenshots/folder/view/folders/folder-111.png b/img/screenshots/folder/view/folders/folder-111.png
new file mode 100644
index 0000000..7016dff
Binary files /dev/null and b/img/screenshots/folder/view/folders/folder-111.png differ
diff --git a/img/screenshots/folder/view/folders/folder-111@2x.png b/img/screenshots/folder/view/folders/folder-111@2x.png
new file mode 100644
index 0000000..642587d
Binary files /dev/null and b/img/screenshots/folder/view/folders/folder-111@2x.png differ
diff --git a/img/screenshots/folder/view/folders/folder-999-open.png b/img/screenshots/folder/view/folders/folder-999-open.png
new file mode 100644
index 0000000..b4bda19
Binary files /dev/null and b/img/screenshots/folder/view/folders/folder-999-open.png differ
diff --git a/img/screenshots/folder/view/folders/folder-999-open@2x.png b/img/screenshots/folder/view/folders/folder-999-open@2x.png
new file mode 100644
index 0000000..2e45cc7
Binary files /dev/null and b/img/screenshots/folder/view/folders/folder-999-open@2x.png differ
diff --git a/img/screenshots/folder/view/folders/folder-999.png b/img/screenshots/folder/view/folders/folder-999.png
new file mode 100644
index 0000000..637bf72
Binary files /dev/null and b/img/screenshots/folder/view/folders/folder-999.png differ
diff --git a/img/screenshots/folder/view/folders/folder-999@2x.png b/img/screenshots/folder/view/folders/folder-999@2x.png
new file mode 100644
index 0000000..8fce4ba
Binary files /dev/null and b/img/screenshots/folder/view/folders/folder-999@2x.png differ
diff --git a/img/screenshots/folder/view/main.png b/img/screenshots/folder/view/main.png
new file mode 100644
index 0000000..21912c3
Binary files /dev/null and b/img/screenshots/folder/view/main.png differ
diff --git a/img/screenshots/folder/view/scopeBar.png b/img/screenshots/folder/view/scopeBar.png
new file mode 100644
index 0000000..f9672a7
Binary files /dev/null and b/img/screenshots/folder/view/scopeBar.png differ
diff --git a/img/ternaryop/vd/folders/folder-000-open.png b/img/ternaryop/vd/folders/folder-000-open.png
deleted file mode 100644
index 024948e..0000000
Binary files a/img/ternaryop/vd/folders/folder-000-open.png and /dev/null differ
diff --git a/img/ternaryop/vd/folders/folder-000-open@2x.png b/img/ternaryop/vd/folders/folder-000-open@2x.png
deleted file mode 100644
index 0fdc807..0000000
Binary files a/img/ternaryop/vd/folders/folder-000-open@2x.png and /dev/null differ
diff --git a/img/ternaryop/vd/folders/folder-000.png b/img/ternaryop/vd/folders/folder-000.png
deleted file mode 100644
index 9c54edc..0000000
Binary files a/img/ternaryop/vd/folders/folder-000.png and /dev/null differ
diff --git a/img/ternaryop/vd/folders/folder-000@2x.png b/img/ternaryop/vd/folders/folder-000@2x.png
deleted file mode 100644
index 8fb02ff..0000000
Binary files a/img/ternaryop/vd/folders/folder-000@2x.png and /dev/null differ
diff --git a/img/ternaryop/vd/folders/folder-001-open.png b/img/ternaryop/vd/folders/folder-001-open.png
deleted file mode 100644
index dd5564a..0000000
Binary files a/img/ternaryop/vd/folders/folder-001-open.png and /dev/null differ
diff --git a/img/ternaryop/vd/folders/folder-001-open@2x.png b/img/ternaryop/vd/folders/folder-001-open@2x.png
deleted file mode 100644
index 923da1e..0000000
Binary files a/img/ternaryop/vd/folders/folder-001-open@2x.png and /dev/null differ
diff --git a/img/ternaryop/vd/folders/folder-001.png b/img/ternaryop/vd/folders/folder-001.png
deleted file mode 100644
index 685aaec..0000000
Binary files a/img/ternaryop/vd/folders/folder-001.png and /dev/null differ
diff --git a/img/ternaryop/vd/folders/folder-001@2x.png b/img/ternaryop/vd/folders/folder-001@2x.png
deleted file mode 100644
index 836b556..0000000
Binary files a/img/ternaryop/vd/folders/folder-001@2x.png and /dev/null differ
diff --git a/img/ternaryop/vd/folders/folder-010-open.png b/img/ternaryop/vd/folders/folder-010-open.png
deleted file mode 100644
index 2ab5c93..0000000
Binary files a/img/ternaryop/vd/folders/folder-010-open.png and /dev/null differ
diff --git a/img/ternaryop/vd/folders/folder-010-open@2x.png b/img/ternaryop/vd/folders/folder-010-open@2x.png
deleted file mode 100644
index 72c9fcf..0000000
Binary files a/img/ternaryop/vd/folders/folder-010-open@2x.png and /dev/null differ
diff --git a/img/ternaryop/vd/folders/folder-010.png b/img/ternaryop/vd/folders/folder-010.png
deleted file mode 100644
index fd52395..0000000
Binary files a/img/ternaryop/vd/folders/folder-010.png and /dev/null differ
diff --git a/img/ternaryop/vd/folders/folder-010@2x.png b/img/ternaryop/vd/folders/folder-010@2x.png
deleted file mode 100644
index 74718a1..0000000
Binary files a/img/ternaryop/vd/folders/folder-010@2x.png and /dev/null differ
diff --git a/img/ternaryop/vd/folders/folder-011-open.png b/img/ternaryop/vd/folders/folder-011-open.png
deleted file mode 100644
index 7e9707f..0000000
Binary files a/img/ternaryop/vd/folders/folder-011-open.png and /dev/null differ
diff --git a/img/ternaryop/vd/folders/folder-011-open@2x.png b/img/ternaryop/vd/folders/folder-011-open@2x.png
deleted file mode 100644
index 6e13fd6..0000000
Binary files a/img/ternaryop/vd/folders/folder-011-open@2x.png and /dev/null differ
diff --git a/img/ternaryop/vd/folders/folder-011.png b/img/ternaryop/vd/folders/folder-011.png
deleted file mode 100644
index 435f426..0000000
Binary files a/img/ternaryop/vd/folders/folder-011.png and /dev/null differ
diff --git a/img/ternaryop/vd/folders/folder-011@2x.png b/img/ternaryop/vd/folders/folder-011@2x.png
deleted file mode 100644
index 29f76c1..0000000
Binary files a/img/ternaryop/vd/folders/folder-011@2x.png and /dev/null differ
diff --git a/img/ternaryop/vd/folders/folder-100-open.png b/img/ternaryop/vd/folders/folder-100-open.png
deleted file mode 100644
index b22e51a..0000000
Binary files a/img/ternaryop/vd/folders/folder-100-open.png and /dev/null differ
diff --git a/img/ternaryop/vd/folders/folder-100-open@2x.png b/img/ternaryop/vd/folders/folder-100-open@2x.png
deleted file mode 100644
index 4e52c98..0000000
Binary files a/img/ternaryop/vd/folders/folder-100-open@2x.png and /dev/null differ
diff --git a/img/ternaryop/vd/folders/folder-100.png b/img/ternaryop/vd/folders/folder-100.png
deleted file mode 100644
index 708fe84..0000000
Binary files a/img/ternaryop/vd/folders/folder-100.png and /dev/null differ
diff --git a/img/ternaryop/vd/folders/folder-100@2x.png b/img/ternaryop/vd/folders/folder-100@2x.png
deleted file mode 100644
index c7722a9..0000000
Binary files a/img/ternaryop/vd/folders/folder-100@2x.png and /dev/null differ
diff --git a/img/ternaryop/vd/folders/folder-101-open.png b/img/ternaryop/vd/folders/folder-101-open.png
deleted file mode 100644
index f886134..0000000
Binary files a/img/ternaryop/vd/folders/folder-101-open.png and /dev/null differ
diff --git a/img/ternaryop/vd/folders/folder-101-open@2x.png b/img/ternaryop/vd/folders/folder-101-open@2x.png
deleted file mode 100644
index 26bfc7b..0000000
Binary files a/img/ternaryop/vd/folders/folder-101-open@2x.png and /dev/null differ
diff --git a/img/ternaryop/vd/folders/folder-101.png b/img/ternaryop/vd/folders/folder-101.png
deleted file mode 100644
index 6bd7bf0..0000000
Binary files a/img/ternaryop/vd/folders/folder-101.png and /dev/null differ
diff --git a/img/ternaryop/vd/folders/folder-101@2x.png b/img/ternaryop/vd/folders/folder-101@2x.png
deleted file mode 100644
index 563c90a..0000000
Binary files a/img/ternaryop/vd/folders/folder-101@2x.png and /dev/null differ
diff --git a/img/ternaryop/vd/folders/folder-110-open.png b/img/ternaryop/vd/folders/folder-110-open.png
deleted file mode 100644
index 69bedb8..0000000
Binary files a/img/ternaryop/vd/folders/folder-110-open.png and /dev/null differ
diff --git a/img/ternaryop/vd/folders/folder-110-open@2x.png b/img/ternaryop/vd/folders/folder-110-open@2x.png
deleted file mode 100644
index bcffb58..0000000
Binary files a/img/ternaryop/vd/folders/folder-110-open@2x.png and /dev/null differ
diff --git a/img/ternaryop/vd/folders/folder-110.png b/img/ternaryop/vd/folders/folder-110.png
deleted file mode 100644
index 12d7e12..0000000
Binary files a/img/ternaryop/vd/folders/folder-110.png and /dev/null differ
diff --git a/img/ternaryop/vd/folders/folder-110@2x.png b/img/ternaryop/vd/folders/folder-110@2x.png
deleted file mode 100644
index dc58706..0000000
Binary files a/img/ternaryop/vd/folders/folder-110@2x.png and /dev/null differ
diff --git a/img/ternaryop/vd/folders/folder-111-open.png b/img/ternaryop/vd/folders/folder-111-open.png
deleted file mode 100644
index 69bedb8..0000000
Binary files a/img/ternaryop/vd/folders/folder-111-open.png and /dev/null differ
diff --git a/img/ternaryop/vd/folders/folder-111-open@2x.png b/img/ternaryop/vd/folders/folder-111-open@2x.png
deleted file mode 100644
index bcffb58..0000000
Binary files a/img/ternaryop/vd/folders/folder-111-open@2x.png and /dev/null differ
diff --git a/img/ternaryop/vd/folders/folder-111.png b/img/ternaryop/vd/folders/folder-111.png
deleted file mode 100644
index 12d7e12..0000000
Binary files a/img/ternaryop/vd/folders/folder-111.png and /dev/null differ
diff --git a/img/ternaryop/vd/folders/folder-111@2x.png b/img/ternaryop/vd/folders/folder-111@2x.png
deleted file mode 100644
index dc58706..0000000
Binary files a/img/ternaryop/vd/folders/folder-111@2x.png and /dev/null differ
diff --git a/img/ternaryop/vd/folders/folder-999-open.png b/img/ternaryop/vd/folders/folder-999-open.png
deleted file mode 100644
index da7c8f3..0000000
Binary files a/img/ternaryop/vd/folders/folder-999-open.png and /dev/null differ
diff --git a/img/ternaryop/vd/folders/folder-999-open@2x.png b/img/ternaryop/vd/folders/folder-999-open@2x.png
deleted file mode 100644
index c8bbe77..0000000
Binary files a/img/ternaryop/vd/folders/folder-999-open@2x.png and /dev/null differ
diff --git a/img/ternaryop/vd/folders/folder-999.png b/img/ternaryop/vd/folders/folder-999.png
deleted file mode 100644
index e242577..0000000
Binary files a/img/ternaryop/vd/folders/folder-999.png and /dev/null differ
diff --git a/img/ternaryop/vd/folders/folder-999@2x.png b/img/ternaryop/vd/folders/folder-999@2x.png
deleted file mode 100644
index ef31494..0000000
Binary files a/img/ternaryop/vd/folders/folder-999@2x.png and /dev/null differ
diff --git a/img/ternaryop/vd/screenshots/wiki/alignRule.png b/img/ternaryop/vd/screenshots/wiki/alignRule.png
deleted file mode 100644
index 129a538..0000000
Binary files a/img/ternaryop/vd/screenshots/wiki/alignRule.png and /dev/null differ
diff --git a/img/ternaryop/vd/screenshots/wiki/alignRuleIgnoreCase.png b/img/ternaryop/vd/screenshots/wiki/alignRuleIgnoreCase.png
deleted file mode 100644
index 59a62cc..0000000
Binary files a/img/ternaryop/vd/screenshots/wiki/alignRuleIgnoreCase.png and /dev/null differ
diff --git a/img/ternaryop/vd/screenshots/wiki/differenceIndicator.png b/img/ternaryop/vd/screenshots/wiki/differenceIndicator.png
deleted file mode 100644
index 943de33..0000000
Binary files a/img/ternaryop/vd/screenshots/wiki/differenceIndicator.png and /dev/null differ
diff --git a/img/ternaryop/vd/screenshots/wiki/sessionPrefAlignment.png b/img/ternaryop/vd/screenshots/wiki/sessionPrefAlignment.png
deleted file mode 100644
index 6e8e53e..0000000
Binary files a/img/ternaryop/vd/screenshots/wiki/sessionPrefAlignment.png and /dev/null differ
diff --git a/index.md b/index.md
index 5910410..aaa5294 100644
--- a/index.md
+++ b/index.md
@@ -6,19 +6,31 @@ noToc: true
fake_toc_title: Wiki Home
---
-Table of Contents
-=================
+Folder Compare
+==============
-* [Folder Colors Legend](foldersLegend.html)
-* [File Colors Legend](fileLegend.html)
+* [Colors Legend](colorsLegend.html)
+* [Folder Compare View](folderView.html)
+* [Folder Operations](folderOperations.html)
* [Comparison Methods](comparisonMethods.html)
-* [Integrate with other macOS applications](externalApps.html)
-* [Trusted Paths](trustedPaths.html)
* [Alignment Rules](alignRules.html)
+* [File Filters](fileFilters.html)
+
+File Diff
+=========
+
+* [File Diff View](fileDiff.html)
+
+Integration & Settings
+======================
+
+* [Trusted Paths](trustedPaths.html)
+* [Integrate with other macOS applications](externalApps.html)
Extra Features
==============
-* [Unix Shell Scripting Support](unixshell.html)
+* [visdiff — Command-Line Tool](unixshell.html)
+* [Hidden Settings](hiddenSettings.html)
* [Frequently Asked Questions](faq.html)
* [Integrate with macOS Finder context menu](finder.html)
diff --git a/js/copy-cmd.js b/js/copy-cmd.js
new file mode 100644
index 0000000..015d34b
--- /dev/null
+++ b/js/copy-cmd.js
@@ -0,0 +1,10 @@
+document.addEventListener('DOMContentLoaded', function () {
+ document.querySelectorAll('.copy-cmd').forEach(function (cell) {
+ cell.addEventListener('click', function () {
+ navigator.clipboard.writeText(cell.dataset.cmd).then(function () {
+ cell.classList.add('copied');
+ setTimeout(function () { cell.classList.remove('copied'); }, 1500);
+ });
+ });
+ });
+});
diff --git a/preferences/text.md b/preferences/text.md
index e033b91..48f1ddc 100644
--- a/preferences/text.md
+++ b/preferences/text.md
@@ -41,7 +41,7 @@ Show a symbol near the lines to indicate the type of difference.
-
+
# Tab Width
diff --git a/trustedPaths.md b/trustedPaths.md
index 1a26853..8da8601 100755
--- a/trustedPaths.md
+++ b/trustedPaths.md
@@ -11,7 +11,7 @@ subtitle: How to handle paths with Apple sandbox
[Why we need trusted paths](#why_we_need_trusted_paths)
=========================
-Starting from macOS Lion, applications run in the so-called [sandbox](https://developer.apple.com/library/mac/#documentation/Security/Conceptual/AppSandboxDesignGuide/AboutAppSandbox/AboutAppSandbox.html), an isolated and secure environment.
+Applications run in the so-called [sandbox](https://developer.apple.com/documentation/security/app_sandbox), an isolated and secure environment.
Applications accessing the file system (reading a file, listing a folder) need explicit permission from the user.
The user grants permission to access a file (or folder) by selecting it from a file panel or dragging the path to the application.
VisualDiffer prompts a file panel when it can't access a file due to a permission error; after the user selects it the path is stored as trusted so next time it isn't necessary to re-prompt.
diff --git a/unixshell.md b/unixshell.md
index 616011c..fc68b8f 100644
--- a/unixshell.md
+++ b/unixshell.md
@@ -4,67 +4,100 @@ layout: default
# mainAnchor is used by Apple links
mainAnchor: unixShell
-title: Unix Shell Scripting Support
-subtitle: Launching the UI from the Unix command line
+title: visdiff
+subtitle: Command-line tool for launching VisualDiffer from the terminal
---
-[Using visdiff](#using_visdiff)
-=============
-
-The /Applications/VisualDiffer.app/**Contents/Helpers** folder contains the executable file `visdiff` that integrates with VisualDiffer.app.
-You can launch `visdiff` to visually show a comparison of files or folders using the following syntax:
-
- visdiff
-
-**Note:** On versions older than 1.8.0 `visdiff` is located at `/Applications/VisualDiffer.app/Contents/Resources/visdiff`
-
-[Wait for document close](#wait_for_document_close)
-=======================
-
-If you need to wait until the user closes the diff document window (not necessarily quitting the application) associated with the visdiff command, you can pass the switch `--wait`.
-
-For example
+`visdiff` is a command-line tool bundled with VisualDiffer. It opens a comparison directly from the terminal without having to launch the app manually.
+
+The executable is located at:
+
+ /Applications/VisualDiffer.app/Contents/Helpers/visdiff
+
+# [Usage](#usage)
+
+ visdiff [options]
+
+Left and right must both be files or both be folders.
+
+# [Options](#options)
+
+
+
+
+
+ | Option |
+ Description |
+
+
+
+
+ --wait |
+ Block the terminal until the diff window is closed.
+ Useful when calling visdiff from a script or editor that needs to wait
+ for the comparison to finish before continuing. |
+
+
+ --focus |
+ After the diff window is closed, return focus to the application that
+ launched visdiff (for example, your terminal or editor).
+ Only effective when used together with --wait. |
+
+
+ --no-warning |
+ Suppress the sandbox warning printed to stderr on every run.
+ Useful in scripts where the warning would pollute the output. |
+
+
+ --version |
+ Print the visdiff version and exit. |
+
+
+
+
+
+## [Using --wait and --focus together](#wait_and_focus)
+
+`--focus` without `--wait` has no effect. The typical use case is integrating visdiff with an editor or script that needs to:
+
+1. open a diff,
+2. wait for the user to close it, and
+3. regain focus automatically when the diff window is closed.
{% highlight bash %}
-$ visdiff ~/original.txt ~/modified.txt --wait
+$ visdiff --wait --focus ~/original.txt ~/modified.txt
{% endhighlight %}
+Without `--focus`, VisualDiffer keeps focus after the window closes. With `--focus`, focus returns to the calling application.
-[Creating a symbolic link](#creating_a_symbolic_link)
-------------------------
+# [Creating a Symbolic Link](#creating_a_symbolic_link)
-VisualDiffer.app doesn't install the terminal application, but you can manually create the link to the shell command.
-It requires root access; from a terminal prompt type the command shown below.
+VisualDiffer does not install `visdiff` into a system path automatically (Apple's App Store guidelines do not allow it). You can create the link manually:
{% highlight bash %}
-$ sudo ln -s /Applications/VisualDiffer.app/Contents/Helpers/visdiff /usr/bin/visdiff
+$ sudo ln -s /Applications/VisualDiffer.app/Contents/Helpers/visdiff /usr/local/bin/visdiff
{% endhighlight %}
-Note: **VisualDiffer can't install the command line tool from its User Interface to comply with Apple's submission guidelines**
-
-[macOS sandbox, temporary files and annoying file open panel prompts](#macos_sandbox_temporary_files_and_annoying_file_open_panel_prompts)
-=================================================================
+# [Sandbox and Trusted Paths](#macos_sandbox_temporary_files_and_annoying_file_open_panel_prompts)
-VisualDiffer was sandboxed starting from version 1.4.2 and many users found using it very annoying because any comparison prompts to pick folders/files.
-This problem was fixed in version 1.4.3 by introducing the so-called "Trusted Paths"; please refer to [Trusted Paths](trustedPaths.html) for further details.
+`visdiff` runs inside the macOS sandbox. The first time it tries to open a path it has not seen before, VisualDiffer may prompt you to confirm access. To avoid repeated prompts, add the relevant paths in **Settings → Trusted Paths**. See [Trusted Paths](trustedPaths.html) for details.
-[How visdiff resolves relative paths](#relative_paths)
-========================================================
+The sandbox also prints a reminder to stderr on every run. Pass `--no-warning` to silence it once you have set up your trusted paths.
-`visdiff` is a sandboxed application. Because of that, even when you launch it from a regular terminal, relative paths are resolved from the home directory of the sandbox container, not from the current working directory of the shell.
+# [How visdiff Resolves Relative Paths](#relative_paths)
-This can make VisualDiffer report that a file does not exist because it looks for it in the wrong location.
+Because `visdiff` is sandboxed, it cannot read the shell's current working directory directly. Relative paths are resolved against the sandbox container, not against `$PWD`, which means they will likely fail.
-The most reliable solution is to expand the relative path with `$PWD` so the final path is built from the current working directory before `visdiff` receives it.
+The fix is to prepend `$PWD` to make the path absolute before passing it to visdiff:
Instead of:
{% highlight bash %}
-$ visdiff ../myfile.txt
+$ visdiff ../myfile.txt ~/reference.txt
{% endhighlight %}
Use:
{% highlight bash %}
-$ visdiff $PWD/../myfile.txt
+$ visdiff $PWD/../myfile.txt ~/reference.txt
{% endhighlight %}