Commit Graph
881 Commits
Author SHA1 Message Date
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
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 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 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 736c2de057 chore(videos): merge base workspace files into promo videos branch 2026-05-08 17:10:00 +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
SnapOtter d59be53709 feat(videos): add XLaunchVideo composition with all 7 scenes 2026-05-08 16:44:54 +08:00
SnapOtter 30ad822853 feat(videos): add X Launch scenes 5-7 (Privacy, Features, CTA) 2026-05-08 16:44:46 +08:00
SnapOtter fe4309bad9 feat(videos): add ToolGalaxy hero composition with burst, orbit, and grid phases 2026-05-08 16:44:13 +08:00
SnapOtter ccf4653b96 feat(videos): add X Launch scenes 1-4 (Hook, Terminal, ToolGrid, AI) 2026-05-08 16:43:54 +08:00
SnapOtter dd73a8a50a fix: resolve 41 bugs and wire 21 unimplemented features in image editor
Canvas rendering:
- Fix Konva filter application order (filters before cache)
- Implement 6 missing filters (motionBlur, radialBlur, surfaceBlur, vignette, grain, sharpen)
- Implement exposure, vibrance, warmth adjustments as custom Konva filters
- Apply layer blend modes via globalCompositeOperation
- Apply object effects (drop shadow, outer glow, stroke) to all shapes
- Mount SmartGuidesOverlay during move tool drag
- Clip pixel grid to visible viewport (200-line cap for performance)

Store logic:
- resizeImage now scales all objects proportionally (points, radii, fontSize)
- rotate/flip/trim handle line/arrow points arrays and center-based objects
- applyCrop creates cropped source image via offscreen canvas
- invertSelection creates mask from bounds when no mask exists
- cutObjects uses single atomic set() to prevent race conditions
- sendToBack respects layer ordering in multi-layer documents
- Add batchNudge() and commitHistory() for undoable nudge operations
- Add updateLayerThumbnail() method

Tool hooks:
- Fix clone stamp/dodge/burn perf (toDataURL only on mouseUp, not every move)
- Fix magic wand zoom/pixelRatio with explicit stage.toCanvas() viewport
- Fix eyedropper sampling with unzoomed canvas export
- Fix selection tool stale closure via isDrawingRef
- Implement polygonal lasso (click-to-place vertices, double-click to close)
- Implement selection subtract mode (geometric and mask-based)
- Implement gradient live preview during drag
- Fix transform/move tool to persist changes and handle ellipse/polygon/star

UI wiring:
- Mount rulers and guidelines in editor page
- Wire histogram with live canvas imageData
- Wire autosave recovery with blob-to-dataURL conversion
- Wire fill dialog to Shift+Backspace shortcut
- Wire eyedropper and transform options to options bar
- Fix history panel undo/redo button reactive state via useSyncExternalStore
- Fix layer row name click to select layer (timer-based click/dblclick)
- Fix zoom animation coordinate drift with progressive store sync
- Fix copy merged to use Konva stage composite export

Tests:
- 49 new unit tests (store fixes + konva filters)
- 8 new E2E test files with 39 test cases
2026-05-08 16:43:27 +08:00
SnapOtter 85acce7e16 feat(videos): add PromoTeaser square and vertical compositions 2026-05-08 16:41:44 +08:00
SnapOtter 210bf9cded feat(videos): add all 5 Promo Teaser scene components 2026-05-08 16:41:04 +08:00
SnapOtter 666880b158 fix: add missing Color Blindness Simulation and Beautify to landing page tool list 2026-05-08 16:39:48 +08:00
SnapOtter 7ff96a6515 feat(videos): add ToolGrid and BeforeAfter components 2026-05-08 16:39:03 +08:00
SnapOtter 43fbb23f19 feat(videos): add LogoReveal and GitHubCTA components 2026-05-08 16:38:39 +08:00
SnapOtter 72b0077a57 feat(videos): add OneCommand hero composition with terminal-to-app morph 2026-05-08 16:38:28 +08:00
SnapOtter 818348beac feat(videos): add AppMockup simplified UI component 2026-05-08 16:38:23 +08:00
SnapOtter c0e769c1fa feat(videos): add TerminalWindow component with macOS chrome 2026-05-08 16:38:18 +08:00
SnapOtter 41a3b9a97b feat(videos): add RotatingTaglines and GradientMesh components 2026-05-08 16:38:03 +08:00
SnapOtter 1702492ef3 feat(videos): add FeaturePill, ProgressBar, NumberPunch components 2026-05-08 16:37:41 +08:00
SnapOtter e3187f1740 feat(videos): add Terminal component with typing + output animation 2026-05-08 16:37:16 +08:00
SnapOtter e8e5cfde39 feat(videos): add AppWindow component with macOS traffic light chrome 2026-05-08 16:37:00 +08:00
SnapOtter ac33e4ac3c feat(videos): add BackgroundMusic component with fade-in/fade-out 2026-05-08 16:35:31 +08:00
SnapOtter 89eec108fe feat(videos): add PrivacyPromise hero loop with shield draw animation 2026-05-08 16:34:30 +08:00
SnapOtter 07003b7ba3 feat(videos): add ShieldIcon SVG component with evolvePath draw animation 2026-05-08 16:34:26 +08:00
SnapOtter 3d9324b82a chore: update tool count to 50 across all references 2026-05-08 16:33:12 +08:00
SnapOtter 466ef1efb1 docs(beautify): add API docs, OpenAPI spec, LLM docs, update README
Add beautify tool endpoint to OpenAPI spec with full parameter
documentation. Add tool to REST API docs Layout & Composition table.
Update tool count from 49 to 50 across README, docs homepage,
architecture docs, VitePress config, OpenAPI spec, and LLM docs
generator.
2026-05-08 16:31:43 +08:00
SnapOtter ac67b8471d feat(videos): add AiMagicReel before/after transformation composition 2026-05-08 16:30:31 +08:00
SnapOtter 53b717243b fix(meme-generator): add opentype.js types, fix no-dropzone registry test 2026-05-08 16:29:44 +08:00
SnapOtter 9497e0b7fc feat(beautify): add frontend settings component with presets and live preview 2026-05-08 16:26:09 +08:00
SnapOtter 54a73e1791 feat(videos): add PipelineFlow composition with batch mode 2026-05-08 16:24:28 +08:00
SnapOtter 136a4a0752 Merge branch 'feat/format-support-expansion'
# Conflicts:
#	README.md
#	apps/web/src/components/layout/app-layout.tsx
2026-05-08 16:21:11 +08:00
SnapOtter b5c75610eb feat(meme-generator): add frontend component with gallery, editor, and result phases 2026-05-08 16:19:06 +08:00
SnapOtter a90ba372df feat(beautify): add HTTP route, process pipeline, and pipeline registration 2026-05-08 16:17:17 +08:00
SnapOtter 6ec3a51fa4 feat(meme-generator): add meme generation API route with template and custom image modes
Custom route handler supporting template mode (JSON body with templateId)
and custom image mode (multipart upload). Registers process function for
pipeline compatibility. Includes 18 integration tests.
2026-05-08 16:13:34 +08:00
SnapOtter 69e107fbab feat(beautify): add device frame assets and PNG frame compositing 2026-05-08 16:12:46 +08:00
SnapOtter 447ef3a07e feat(videos): add shared animation components (grain, clip reveal, tool pill, counter, etc.) 2026-05-08 16:12:05 +08:00