Commit Graph

143 Commits

Author SHA1 Message Date
d6e01e4bf5 fix: make all tool grid cards the same height
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-28 17:53:02 +01:00
36c02cea55 polish: unit labels in parentheses, export panel styling, remove unused gradient utilities
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-28 17:38:48 +01:00
0f5e67a007 fix: remove duplicate className attribute in AnimationSettings cubic-bezier labels
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-28 17:35:57 +01:00
d0e8ae322f style: move units into label text in KeyframeProperties SliderRow
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-28 17:33:03 +01:00
0e95b7e543 fix: track animation ended state and wire preview controls correctly
- Replace boolean paused with AnimState ('playing'|'paused'|'ended')
- Use onAnimationEnd to detect when finite animations finish
- Play re-enables after end and restarts the animation (replay)
- Pause only active while playing; Restart always available
- Config changes auto-restart preview so edits are instantly visible

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-28 17:17:20 +01:00
27c7372a31 style: match ToggleGroup style to QR preview (outline variant, h-6 compact items)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-28 17:13:47 +01:00
1a517c4655 style: replace speed Select with ToggleGroup in AnimationPreview
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-28 17:12:04 +01:00
f4ee557e26 fix: preset thumbnails no longer conflict with main preview animation
- Inject only @keyframes (not .animated class rule) per preset thumbnail
  so the main preview's .animated rule cannot override them
- Drive thumbnail animation entirely via inline style properties
- Remove isActive/currentName — presets should never appear selected

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-28 17:08:22 +01:00
eeef3283c8 feat: add CSS Animation Editor tool
Comprehensive visual editor for CSS @keyframe animations:
- AnimationSettings: name, duration, delay, easing (incl. cubic-bezier), iteration, direction, fill-mode
- KeyframeTimeline: drag-to-reposition keyframe markers, click-track to add, delete selected
- KeyframeProperties: per-keyframe transform (translate/rotate/scale/skew), opacity, background-color, border-radius, blur, brightness via sliders
- AnimationPreview: live preview on box/circle/text element with play/pause/restart and speed control (0.25×–2×)
- PresetLibrary: 22 presets across Entrance/Exit/Attention/Special categories with animated thumbnails
- ExportPanel: plain CSS and Tailwind v4 @utility formats with copy and download

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-28 14:17:04 +01:00
4a0aa85859 fix: popover color 2026-02-28 13:46:36 +01:00
6a586b936a style: replace emoji heart with primary Heart icon and polish Valknar link
- Swap 💜 for a filled Lucide Heart icon in text-primary in both Footer and AppSidebar
- Style Valknar link with animated underline (decoration-primary on hover)
- Add sidebar footer with copyright, Heart, Valknar link, and GitFork source link
- Add author field to package.json

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-28 12:20:28 +01:00
0d731e56da fix: sidebar bg opacity 2026-02-28 12:01:37 +01:00
c9c7d22766 seo: add meta description (tool.summary) to all tool pages
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-28 10:34:42 +01:00
bc9e30c918 style: constrain description width in AppPage; add description to sidebar items
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-28 10:01:33 +01:00
28747a6c8f refactor: extract ColorManipulation component and pass icon/summary to AppPage
- Rename ColorPage → ColorManipulation (no AppPage wrapper inside)
- Move AppPage + title/description/icon to color/page.tsx, consistent with other tools
- AppPage now accepts icon prop directly; removes internal usePathname lookup and 'use client'
- All tool pages pass tool.summary as description and tool.icon as icon

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-28 09:57:06 +01:00
82649f6674 fix: remove sidebar tool description 2026-02-28 09:09:16 +01:00
f917891a31 feat: add QR code generator tool
Add a sixth tool with live SVG preview, customizable foreground/background
colors, error correction level, margin control, and export as PNG (256–2048px)
or SVG. URL params enable shareable state. All processing runs client-side
via the qrcode package.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-28 00:58:57 +01:00
695ba434e2 feat: add comment wrapping to ASCII art tool
Add comment style selector (shadcn Select) to wrap generated ASCII art
with language-appropriate comment syntax (// # -- ; /* */ <!-- --> """).
Refactor preview controls to use shadcn ToggleGroup, Tooltip, and Badge.
Alignment is disabled when a comment style is active.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 19:11:25 +01:00
a400f694fe refactor: externalize tool definitions and polish app shell
- Create lib/tools.tsx as single source of truth for all tool metadata
  (title, shortTitle, navTitle, description, summary, icon, etc.)
- Update AppSidebar to render nav from centralized tools list with
  descriptions, remove collapse footer button
- Update AppHeader with sidebar collapse toggle, tool short title,
  and app logo; remove breadcrumbs
- Update AppPage to auto-resolve tool icon from pathname
- Update ToolsGrid/ToolCard to use shared tools data, remove per-card
  gradients for uniform styling
- Add per-tool HTML title via metadata exports (title template in root
  layout)
- Style landing page and 404 headings with primary theme color
- Add Toolbox icon to hero CTA, GitFork icon link in footer
- Remove footer from error page and "View on Dev" buttons
- Extract ColorPage client component for RSC metadata compatibility

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 17:46:54 +01:00
5a0d1863ec chore: cleanup 2026-02-27 16:34:27 +01:00
83586c8bbb fix: export menu buttons size 2026-02-27 13:53:08 +01:00
bd08951717 fix: popover color 2026-02-27 13:49:25 +01:00
ee7e5ec06c refactor: streamline, refine and polish 2026-02-27 12:51:28 +01:00
efe3c81576 chore: cleanup 2026-02-27 08:47:44 +01:00
782923f2e0 feat: refactor theme, add tailwind-scrollbar, and improve UI components
- Removed manual theme switching logic and ThemeProvider
- Installed and configured tailwind-scrollbar plugin
- Updated FileConverter and ConversionOptions to use shadcn Input
- Refactored FontSelector to use shadcn Tabs
- Simplified global styles and adjusted glassmorphic effects
2026-02-26 22:22:32 +01:00
a3ef948600 docs: update README and GEMINI with favicon app and PWA info 2026-02-26 18:39:15 +01:00
283855d7a3 fix: icon.png size 2026-02-26 18:24:11 +01:00
c8ff0e5dae fix(media): use processed inputFile for SVG conversion 2026-02-26 18:20:02 +01:00
8a9ff3582f fix(media): handle SVG inputs using browser Canvas pre-conversion for ImageMagick WASM 2026-02-26 18:15:41 +01:00
f20cedffd5 feat: convert app to PWA with offline support and service worker 2026-02-26 18:01:33 +01:00
1d72f34b65 style: streamline media app upload component with favicon app styling 2026-02-26 17:52:41 +01:00
1f1b138089 feat: add Favicon Generator app with ImageMagick WASM support 2026-02-26 17:48:16 +01:00
d99c88df0e fix(media): truncate long filename in download button 2026-02-26 17:12:27 +01:00
0db8ea8773 refactor: remove favorite and copy features from units converter 2026-02-26 12:40:03 +01:00
e1406f427e refactor: rename figlet app to ascii and update all references 2026-02-26 12:31:10 +01:00
484423f299 refactor: rename pastel app to color and update all references 2026-02-26 12:19:22 +01:00
061ea1d806 feat: unify pastel application into single playground and remove standalone pages 2026-02-26 12:07:21 +01:00
225a9ad7fb fix: upload card 2026-02-25 21:44:34 +01:00
311d80bd41 fix: figlet text input card 2026-02-25 21:32:05 +01:00
84bc70b442 fix: ffmpeg import 2026-02-25 20:51:45 +01:00
3a1e0153ac Update postinstall script for FFmpeg 0.12.10
Update the postinstall script to copy from the correct FFmpeg core version path.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-02-25 20:40:06 +01:00
40214d9748 Upgrade FFmpeg to latest version (0.12.10)
Updated @ffmpeg/core from 0.12.6 to 0.12.10 and updated CDN URL references.
The newer version may have better Turbopack compatibility.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-02-25 20:39:18 +01:00
87f1384175 Fix FFmpeg WASM loading: use CDN instead of local files
The 'Cannot find module as expression is too dynamic' error occurs at runtime
when FFmpeg tries to dynamically load the core module. Using CDN URLs bypasses
this bundler issue entirely since absolute URLs don't require bundler analysis.

Switched to jsdelivr CDN for FFmpeg core and WASM files - this is a proven
approach used by many projects.

Fixes: wasmLoader.ts runtime error on media conversion

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-02-25 20:36:45 +01:00
6d4426037c Fix FFmpeg import: use direct import like ImageMagick
Import FFmpeg at module level instead of dynamic import. The build now
compiles cleanly without Turbopack bundler warnings.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-02-25 20:29:55 +01:00
3a8b409d1d Fix FFmpeg WASM bundler error: use runtime import instead of static analysis
The @ffmpeg/ffmpeg package has internal dynamic imports that Turbopack
cannot statically analyze, but they work fine at runtime. This change
moves the import to the loadFFmpeg function where it's needed, allowing
Turbopack to skip static analysis and let the bundler resolve it at runtime.

Fixes: Cannot find module as expression is too dynamic error

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-02-25 20:27:53 +01:00
b5812c97b4 fix: handle FFmpeg dynamic import more gracefully
- lazy-load FFmpeg class to avoid static analysis issues
- add proper null checks for FFmpeg instance
- use initFFmpeg() helper to manage async initialization
- fixes bundler 'too dynamic' error with static-friendly approach

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-02-25 20:24:24 +01:00
45a48abc91 fix: resolve FFmpeg WASM loader dynamic import error
- moved FFmpeg and initializeImageMagick imports to top level (static)
- removed dynamic imports that caused bundler analysis issues
- simplified ImageMagick initialization
- fixes: 'Cannot find module as expression is too dynamic' error

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-02-25 20:22:04 +01:00
dd71130977 fix: conversion options styling 2026-02-25 20:20:04 +01:00
b560dcbc8e refactor: streamline media converter UI and layout
- consolidated file upload and metadata display in single card
- replaced complex FormatSelector with simple shadcn Select component
- inlined all conversion options without toggle display
- restructured layout to 2-column grid matching pastel app pattern:
  - left column: upload and conversion options
  - right column: conversion results
- removed unused components (FileInfo, FormatSelector, ConversionOptionsPanel)
- cleaned up imports and simplified component hierarchy

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-02-25 19:59:22 +01:00
56cdb1ae4a fix: remove media conversion presets 2026-02-25 19:20:22 +01:00