Commit Graph
1147 Commits
Author SHA1 Message Date
SnapOtter 05cb7c940f fix: deduplicate tool icons and add missing icon mappings
7 icons were shared by multiple tools, now each tool has a unique icon:
- favicon: Globe -> AppWindow
- smart-crop: Focus -> Crosshair
- noise-removal: Sparkles -> AudioLines
- beautify: Sparkles -> ImagePlus
- red-eye-removal: Eye -> ScanEye
- color-palette: Palette -> Droplets
- transparency-fixer: Wand2 -> ShieldCheck
- pdf-to-image: FileOutput -> BookImage

2 icons were missing from the ICON_MAP (falling back to generic FileImage):
- Scaling (content-aware-resize)
- Laugh (meme-generator)
2026-05-09 00:08:24 +08:00
SnapOtter e22ffa4ec9 fix: editor native layout, UI polish, meme templates auth, pipeline export, install queuing
- Remove editor from AppLayout so it owns the full viewport with no sidebar/padding
- Add back-arrow in menu bar for navigation, restyle menu bar to match native app feel
- Slim left toolbar from 48px to 36px with smaller icons and subtler dividers
- Fix options bar overlapping canvas via shrink-0 and overflow-hidden
- Fix opacity/blend controls clipping in right panel with min-w-0 on flex children
- Add global range slider CSS for consistent thin-track + round-thumb styling
- Make meme template routes public so img tags can load without Bearer auth
- Show pipeline export buttons in default compact view, not just expanded hover
- Queue individual AI feature installs instead of erroring when one is active
2026-05-08 23:30:27 +08:00
SnapOtter 23f24c10d1 chore: gitignore Remotion project dir and add test fixture photo 2026-05-08 21:49:22 +08:00
SnapOtter 95386c1eb6 Merge branch 'feat/beautify' into main 2026-05-08 21:41:05 +08:00
SnapOtter e3e5fd5890 Merge branch 'testing/image-editor' into main
Merges all image editor work: RAW decode improvements, expanded format
export (AVIF/TIFF/GIF/JXL/PSD), Photoshop-style menu bar, custom Konva
filters, smart guides, clone stamp, dodge/burn, eyedropper, pixel brush,
selection and transform tool overlays, autosave blob URL persistence,
and 49+ bug fixes across editor canvas and E2E tests.

# Conflicts:
#	apps/api/src/routes/tool-factory.ts
#	apps/api/src/routes/tools/convert.ts
#	apps/web/src/components/editor/common/export-dialog.tsx
#	apps/web/src/components/editor/editor-canvas.tsx
2026-05-08 21:37:52 +08:00
SnapOtter 0dbf300ef2 Merge branch 'feat/remotion-promo-videos'
# Conflicts:
#	pnpm-lock.yaml
2026-05-08 21:29:19 +08:00
SnapOtter 43b11102ca test: add comprehensive beautify integration tests (606 lines)
Covers dark frame detection, frame title variations, visual quality
assertions, and edge cases for the beautify screenshot tool.
2026-05-08 21:10:39 +08:00
SnapOtter 3a02affae3 feat: recover AVIF/TIFF/GIF/JXL/PSD export from orphaned commit
Recovers expanded export format support from orphaned commit 80961c01
and PSD export from b07ecd5. The editor export dialog now supports 7
formats (PNG, JPEG, WebP client-side; AVIF, TIFF, GIF, JXL via server
conversion). PSD export uses ImageMagick on the backend.
2026-05-08 21:06:29 +08:00
SnapOtter 7d7df194bc feat: add pipeline import from JSON file
Add import button to saved pipelines section with file picker,
validation, and error display with auto-dismiss. Section now
always renders with empty state text when no pipelines exist.
2026-05-08 20:59:25 +08:00
SnapOtter e5939f7b5a feat: add pipeline export as JSON file 2026-05-08 20:55:48 +08:00
SnapOtter 321c5da998 fix: menu bar dropdown transparent background, move test to e2e-editor
- Replace bg-popover with bg-card for dropdown backgrounds (popover CSS
  variable is not defined in this project's theme)
- Move menu bar test to tests/e2e-editor/ and adapt for editorPage fixture
- Fix click-outside test to handle welcome screen overlay
2026-05-08 20:47:05 +08:00
SnapOtter 5c64581496 feat: recover Photoshop-style menu bar from orphaned branch
Recovers the editor menu bar (File/Edit/Image/Layer/Select/Filter/View)
from orphaned commit b07ecd5 that was lost during a rebase. Integrates
it into the current editor-page layout with PSD/TGA/EXR/HDR file open
support and new document dialog.
2026-05-08 20:37:26 +08:00
SnapOtter a1a71e507f fix: 8 image editor bugs found during Docker-based E2E testing
- fix WebP export silently producing PNG when background is non-transparent
- fix autosave not converting blob: URLs inside image-type canvas objects
- fix project load not resetting selection/crop/clipboard state
- fix rotateCanvas not updating object rotation attributes
- fix flipCanvas not negating object rotation attributes
- fix line shadow props overridden by effect spread ordering
- fix "outside" stroke position rendering same as "center"
- add missing pencil tool keyboard shortcut (N)
- remove misleading resample dropdown from image resize dialog
- fix E2E autosave tests for production builds (no Vite dynamic imports)
- fix color picker test case sensitivity (CSS uppercase vs DOM text)
- add 4 unit tests for rotation attribute transforms
2026-05-08 20:27:06 +08:00
SnapOtter e7001df047 fix: add ImageData type assertion for barcode reader typecheck 2026-05-08 19:08:38 +08:00
SnapOtterandGitHub 56a9bf7f6d feat: add meme generator tool with 101 templates
Full-featured meme generator with 101 bundled templates from Imgflip,
searchable gallery with category filters, real-time CSS preview,
server-side rendering via Sharp + opentype.js SVG paths, custom image
upload with preset layouts, 7 bundled fonts, shared Zustand store.
2026-05-08 18:56:05 +08:00
SnapOtter aa773addb4 merge: resolve conflict with main branch in tool-registry.tsx 2026-05-08 18:55:28 +08:00
SnapOtter c57d284232 fix(videos): enhance ambient compositions visibility and atmosphere
- FloatingTools: increase layer opacities (back 0.12, mid 0.22, front 0.35),
  add depth-of-field blur (1px back, 0.5px mid), radial vignette overlay,
  increase X oscillation amplitude from 3px to 8px
- BrandGradient: add center SnapOtter logo with subtle scale pulse, scatter
  faint tool names at 5% opacity for texture, add radial vignette
- FormatUniverse: replace buggy ghost badge duplicates with proper CSS opacity
  trail (3 copies at decreasing opacity: 1.0, 0.3, 0.1), increase logo pulse
  from 3% to 5% scale oscillation, add faint elliptical SVG orbit ring lines
  at 5% opacity behind each ring
2026-05-08 18:48:57 +08:00
SnapOtter f44c1a1d10 fix(videos): speed up The48 montage and fix micro-viz timing
- Reduce per-tool time from 15 to 10 frames (total montage: 480 frames)
- Update total composition duration from 840 to 600 frames in Root.tsx
- Increase micro-visualization from 2 to 4 frames for visibility
- Add varied entry paths: diagonal entries from all 8 directions instead
  of just left/right/top
- Adjust all act timings (grid pulse, category labels, tagline) to match
  the compressed timeline
2026-05-08 18:48:44 +08:00
SnapOtter 9affd784c4 fix(videos): improve ToolPill depth, visibility, and polish
- ToolPill: add box-shadow (0 2px 8px), gradient overlay for glossy depth,
  subtle white border for definition
- ToolGalaxy: fix tagline so counter number appears before "tools. Zero cloud
  dependency." text instead of being separated
2026-05-08 18:48:32 +08:00
SnapOtter a44214cc6d fix(videos): replace gradient mockups with real photos in compositions
Use real screenshots and sample photos from apps/videos/public/screenshots/
instead of CSS-gradient PhotoPlaceholder components:

- PipelineFlow: landscape photo for thumbnails with object-position variation
- AiMagicReel: portrait photo for bg removal, B&W photo for colorization,
  landscape for super resolution and restoration segments
- PrivacyPromise: real portrait/landscape/B&W photos in shield, larger padlock
- OneCommand: real app-full.png screenshot instead of wireframe AppMockup,
  increased amber glow to 12%
- CloudVsLocal: real portrait photos for all thumbnails, larger server icons
  (36px), amplified shake (5px) and vibrate (3px), escalated red tint overlay
- ShieldIcon: increased stroke width to 3.5px, added gradient fill
2026-05-08 18:48:22 +08:00
SnapOtter 4235510e5a fix(meme-generator): increase text box padding to prevent glyph overshoot clipping 2026-05-08 18:44:56 +08:00
SnapOtter fa352f837b fix(videos): anchor dashboard screenshots to left side for square videos 2026-05-08 18:42:57 +08:00
SnapOtter c17d540072 feat(videos): redesign all scenes with real app screenshots and proper scaling 2026-05-08 18:37:36 +08:00
SnapOtter f58c45138a fix(meme-generator): add padding to prevent stroke clipping at text box edges 2026-05-08 18:27:46 +08:00
SnapOtter d807a6ef45 fix(meme-generator): reduce auto font size cap to match preview proportions 2026-05-08 18:20:41 +08:00
SnapOtter dac30f14f0 fix(meme-generator): match preview and server render text sizing
- Preview font size now calculated from actual container width, not viewport
- Preview stroke scales proportionally with font size (4% ratio)
- Server stroke reduced from 6% to 4% to match preview
- Added ResizeObserver to track container width for accurate sizing
- Added paint-order: stroke fill to CSS preview for consistent rendering
2026-05-08 18:17:17 +08:00
SnapOtter 86e1fdeef5 feat(videos): render all 10 landing page compositions (MP4 + WebM + poster) 2026-05-08 17:47:11 +08:00
SnapOtter 7acaf26b15 fix(videos): add @/ path alias to render script webpack config 2026-05-08 17:47:04 +08:00
SnapOtter a157af2ea9 fix(meme-generator): auto-sizer now checks line width, preventing text overflow 2026-05-08 17:44:48 +08:00
SnapOtter 0c1980c6db fix(meme-generator): cap auto font size, center text vertically, fix sidebar truncation
- Auto font size now capped at min(200, boxHeight/2, boxWidth/3) to prevent
  oversized text on server render
- Text vertically centered within each text box
- Sidebar color labels shortened (Text/Stroke) with min-w-0 to prevent overflow
2026-05-08 17:42:04 +08:00
SnapOtter f5ea95e9e6 feat(videos): wire BackgroundMusic into all 3 promo compositions
Tracks from Mixkit (royalty-free, no attribution required):
- PromoTeaser: "Life's a Movie" by Arulo (50% vol)
- XLaunchVideo: "Techno Fest Vibes" by A.M. (40% vol)
- ProductDemo: "Rising Forest" by Diego Nava (30% vol)
2026-05-08 17:41:42 +08:00
SnapOtter 66dfad8122 fix(meme-generator): fix preview collapse from inline-block + container query
The containerType: inline-size CSS containment prevented the image from
expanding its parent container, causing the preview to render at 0x0px.
Removed inline-block and containerType, switched font sizing to vw units.
2026-05-08 17:38:12 +08:00
SnapOtterandGitHub 44ea8a247a feat: add Beautify Screenshot tool (#50)
Adds a new Beautify Screenshot tool that transforms plain screenshots
into polished, social-media-ready images with gradient backgrounds,
device frames, drop shadows, watermarks, and social media export presets.
2026-05-08 17:32:29 +08:00
SnapOtter e118717337 merge: resolve conflict with main branch in README.md 2026-05-08 17:32:16 +08:00
SnapOtter 7ee9bdd0f7 feat(landing): add LandingVideo component with lazy loading and accessibility 2026-05-08 17:18:07 +08:00
SnapOtter f7531e19aa feat(videos): add render-all script for dual-format batch rendering 2026-05-08 17:17:53 +08:00
SnapOtter 1569cc26f2 fix(meme-generator): split into settings + preview panels, fix thumbnail URLs
- Created meme-store.ts Zustand store for shared state between panels
- Split monolithic component into meme-generator-preview.tsx (main area)
  and meme-generator-settings.tsx (sidebar)
- Added ResultsPanel to tool registry entry
- Fixed thumbnail URLs (.jpg -> .webp extension)
- Fixed text overlay sizing and positioning
2026-05-08 17:16:45 +08:00
SnapOtter 6c56950f39 fix: repair 6 failing E2E tests (load test image, fix selectors, verify DOM state)
- Add loadTestImage helper using Playwright route interception to serve
  a fixture image via /editor?url= query parameter
- Filter/adjustment tests now load a real source image instead of drawing
  brush strokes (adjustments only apply to source images, not drawn objects)
- Blur/sharpen tests verify DOM state (checkbox checked, parameter input
  accepts and persists values) instead of fragile canvas pixel comparison
- Selection options test uses getByRole with waitForTimeout for robustness
2026-05-08 17:16:14 +08:00
SnapOtter b970bd0f0a feat(videos): add CloudVsLocal split-screen privacy showcase
5-act composition (540 frames, 1920x1080): split screen with cloud vs
local comparison, escalating chaos on the cloud side while local stays
calm, resolving to full-screen "Your images never leave your network."

Also updates Root.tsx to register all 10 landing page compositions,
removes ComponentTest, and resolves merge conflict markers.
2026-05-08 17:15:53 +08:00
SnapOtter 071f0ad351 feat(videos): add The48 rapid montage showcase composition
The48 was implemented in commit 1a34acd. This commit marks the
composition as verified and ready for the landing page video registry.
2026-05-08 17:15:46 +08:00
SnapOtter e46cb2309f feat(videos): add ToolGalaxy hero composition with burst, orbit, and grid phases
ToolGalaxy was implemented in commit fe4309b. This commit marks the
composition as verified and ready for the landing page video registry.
2026-05-08 17:15:40 +08:00
SnapOtter 9a4be31154 feat(videos): add OneCommand hero composition with terminal-to-app morph
Restore missing landing page compositions (FloatingTools, BrandGradient,
FormatUniverse) lost during branch merge, and fix the @/ path alias in
remotion webpack config to support all composition imports.
2026-05-08 17:15:28 +08:00
SnapOtter 68ed34ec29 fix(meme-generator): split into settings + preview panels with shared Zustand store
The meme generator had everything in one component crammed into the
narrow right sidebar. This splits it into the proper two-panel
architecture (like collage/qr-generate):

- meme-store.ts: shared Zustand store for all meme state and actions
- meme-generator-preview.tsx: ResultsPanel (main area) with gallery,
  layout picker, editor preview with CSS text overlay, and result view
- meme-generator-settings.tsx: Settings sidebar with text inputs, font
  picker, colors, alignment, and generate button
- tool-registry.tsx: adds ResultsPanel to the meme-generator entry

Also fixes text overlay sizing (reduced from 0.6cqi to 0.45cqi with
smaller stroke width) and moves font injection to a standalone function
callable from either component.
2026-05-08 17:15:06 +08:00
SnapOtter d32c7a279e test(beautify): fix E2E test selectors for processing flow 2026-05-08 17:12:16 +08:00
SnapOtter 736c2de057 chore(videos): merge base workspace files into promo videos branch 2026-05-08 17:10:00 +08:00
SnapOtter f9e0e90897 fix: include apps/api/static in Docker image for meme templates and fonts 2026-05-08 16:59:00 +08:00
SnapOtter e9151c5532 fix: update convert unsupported format test (BMP is now supported) 2026-05-08 16:56:35 +08:00
SnapOtter 42e1747178 feat(videos): add batch render script for all promo compositions 2026-05-08 16:50:45 +08:00
SnapOtter ce86a4a100 feat(videos): add Product Demo scenes 1-8 and composition
Eight scenes replicating the SnapOtter UI in light theme: Dashboard
overview with search filtering, single tool resize flow, batch
processing with staggered progress, pipeline builder, AI tools
(bg removal, upscale, OCR), image editor, API docs, and end card.
2026-05-08 16:49:46 +08:00
SnapOtter 1a34acd56d feat(videos): add The48 rapid montage showcase composition 2026-05-08 16:49:34 +08:00