Skip to content

Commit 415f39f

Browse files
groundwaterclaude
andauthored
Redesign website with real screenshots and interactive dock showcase (#76)
* Rename bundle identifiers from com.yellowgreenfruit to org.ghostvm Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * Add automated screenshot capture and composite pipeline - UI testing mode (--ui-testing) for GhostVMHelper: mock window with configurable wallpaper (--wallpaper) and content overlays (--content-image) - New GhostVMHelperUITests target captures focused popover/sheet screenshots and full helper window variants - ScreenshotExporter utility saves test captures to filesystem - composite-screenshots.swift composites window captures onto desktop wallpaper with rounded corners and drop shadows - `make screenshots` runs full pipeline: capture + composite + JPEG conversion - QueuedFilesPanel expands to fit up to 10 files before scrolling - HelperToolbar exposes showSharedFolderEditor() for UI test triggering Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * Redesign website landing page with real screenshots Replace placeholder images with composited screenshots from UI tests. Streamline copy across all landing sections. Remove SecuritySection (merged into FeatureGrid). Feature cards now show focused popover captures with Sequoia vibrancy. Hero shows clean VM window on Sequoia desktop. Integration section shows VS Code fullscreen in a VM. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * Remove context menu screenshot from automation section Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * Redesign VM icon showcase with animated dock, icon types, and mini app previews Adds interactive dock animation showing custom VM icons (clone, stack, glass, preset) with window previews for each workspace. Includes mini renders of Terminal, VS Code, Slack, Safari, Firefox, Finder, and Messages. Extracts macOS system icons (Finder, Safari, VS Code) and wallpapers for dock display. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * Remove redundant subtitle text from icon showcase section Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 76863e1 commit 415f39f

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

59 files changed

+1187
-345
lines changed

Makefile

Lines changed: 52 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ XCODE_CONFIG ?= Release
1414
BUILD_DIR = build/xcode
1515
APP_NAME = GhostVM
1616

17-
.PHONY: all cli app clean help run launch generate test framework dist tools debug-tools dmg ghosttools-icon ghostvm-icon debug website website-build sparkle-tools sparkle-sign
17+
.PHONY: all cli app clean help run launch generate test framework dist tools debug-tools dmg ghosttools-icon ghostvm-icon debug website website-build sparkle-tools sparkle-sign capture composite screenshots
1818

1919
all: help
2020

@@ -95,6 +95,54 @@ launch: app
9595
test: $(XCODE_PROJECT)
9696
xcodebuild test -project $(XCODE_PROJECT) -scheme GhostVMTests -destination 'platform=macOS'
9797

98+
# Generate website screenshots from UI tests
99+
# Step 1: capture — runs XCUITests, saves raw PNGs to build/screenshots/
100+
# Step 2: composite — processes raw captures into final website images
101+
SCREENSHOT_RAW = $(BUILD_DIR)/screenshots
102+
SCREENSHOT_DEST = Website/public/images/screenshots
103+
UITEST_CONTAINER = $(HOME)/Library/Containers/org.ghostvm.ghostvm.uitests.xctrunner/Data/tmp/GhostVM-Screenshots
104+
HELPER_UITEST_CONTAINER = $(HOME)/Library/Containers/org.ghostvm.ghostvm.helper.uitests.xctrunner/Data/tmp/GhostVM-Screenshots
105+
106+
# Capture raw screenshots from XCUITests → build/screenshots/
107+
capture: $(XCODE_PROJECT)
108+
@rm -rf "$(UITEST_CONTAINER)" "$(HELPER_UITEST_CONTAINER)"
109+
xcodebuild build-for-testing -project $(XCODE_PROJECT) -scheme GhostVMUITests \
110+
-derivedDataPath $(BUILD_DIR) -destination 'platform=macOS'
111+
xcodebuild build-for-testing -project $(XCODE_PROJECT) -scheme GhostVMHelperUITests \
112+
-derivedDataPath $(BUILD_DIR) -destination 'platform=macOS'
113+
xcodebuild test-without-building -project $(XCODE_PROJECT) -scheme GhostVMUITests \
114+
-derivedDataPath $(BUILD_DIR) -destination 'platform=macOS' \
115+
-only-testing:GhostVMUITests/ScreenshotTests
116+
xcodebuild test-without-building -project $(XCODE_PROJECT) -scheme GhostVMHelperUITests \
117+
-derivedDataPath $(BUILD_DIR) -destination 'platform=macOS' \
118+
-only-testing:GhostVMHelperUITests/HelperScreenshotTests
119+
@mkdir -p "$(SCREENSHOT_RAW)"
120+
@if [ -d "$(UITEST_CONTAINER)" ]; then cp "$(UITEST_CONTAINER)"/*.png "$(SCREENSHOT_RAW)/"; fi
121+
@if [ -d "$(HELPER_UITEST_CONTAINER)" ]; then cp "$(HELPER_UITEST_CONTAINER)"/*.png "$(SCREENSHOT_RAW)/"; fi
122+
@echo "Raw captures saved to $(SCREENSHOT_RAW)/:"
123+
@ls -1 "$(SCREENSHOT_RAW)"/ 2>/dev/null | while read f; do echo " $$f"; done
124+
125+
# Composite raw captures into final website images → Website/public/images/screenshots/
126+
composite:
127+
@if [ ! -d "$(SCREENSHOT_RAW)" ]; then echo "No raw captures found. Run 'make capture' first."; exit 1; fi
128+
@mkdir -p "$(SCREENSHOT_DEST)"
129+
@cp "$(SCREENSHOT_RAW)"/*.png "$(SCREENSHOT_DEST)/"
130+
@# Composite helper-window captures onto host desktop wallpaper (before flattening — needs alpha)
131+
swift scripts/composite-screenshots.swift Resources "$(SCREENSHOT_DEST)"
132+
@# Flatten all PNGs to RGB (remove alpha transparency artifacts)
133+
@for f in "$(SCREENSHOT_DEST)"/*.png; do \
134+
python3 -c "from PIL import Image; img=Image.open('$$f'); img.convert('RGB').save('$$f')" 2>/dev/null; \
135+
done
136+
@# Convert composites to JPEG for web
137+
@for f in "$(SCREENSHOT_DEST)/multiple-vms.png" "$(SCREENSHOT_DEST)/vm-integration.png" "$(SCREENSHOT_DEST)/hero-screenshot.png"; do \
138+
sips -s format jpeg -s formatOptions 85 "$$f" --out "$${f%.png}.jpg" >/dev/null 2>&1 && rm "$$f"; \
139+
done
140+
@echo "Website images saved to $(SCREENSHOT_DEST)/:"
141+
@ls -1 "$(SCREENSHOT_DEST)"/ 2>/dev/null | while read f; do echo " $$f"; done
142+
143+
# Full pipeline: capture + composite
144+
screenshots: capture composite
145+
98146
# GhostTools settings
99147
GHOSTTOOLS_DIR = macOS/GhostTools
100148
GHOSTTOOLS_BUILD_DIR = $(BUILD_DIR)/GhostTools
@@ -371,6 +419,9 @@ help:
371419
@echo " make run - Build and run attached to terminal"
372420
@echo " make launch - Build and launch detached"
373421
@echo " make test - Run unit tests"
422+
@echo " make capture - Capture raw screenshots from UI tests → build/screenshots/"
423+
@echo " make composite - Composite raw captures into website images"
424+
@echo " make screenshots - Full pipeline: capture + composite"
374425
@echo " make tools - Build GhostTools guest agent"
375426
@echo " make debug-tools - Build GhostTools debug binary (lldb-compatible with macOS 15)"
376427
@echo " make dmg - Create GhostTools.dmg"

Resources/Desktop-Redwood.png

11.2 MB

Resources/Desktop-Sequoia.png

4.77 MB

Resources/Fullscreen-Code.png

1.22 MB

Resources/Fullscreen-Terminal.png

642 KB

Resources/Window-Code.png

805 KB

Resources/Window-Terminal.png

716 KB

Website/next.config.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
import type { NextConfig } from "next";
22

33
const nextConfig: NextConfig = {
4-
output: "export",
4+
...(process.env.NODE_ENV === "production" && { output: "export" }),
55
images: {
6-
loader: "custom",
7-
loaderFile: "./image-loader.ts",
6+
unoptimized: true,
87
},
8+
devIndicators: false,
99
};
1010

1111
export default nextConfig;
52.8 KB
165 KB

0 commit comments

Comments
 (0)