Prevents corepack from downloading pnpm 11 in Docker, which has a new
security policy (ERR_PNPM_IGNORED_BUILDS) incompatible with how this
project's builds are configured. Locks to the version used locally.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
pnpm 11 reads onlyBuiltDependencies from pnpm-workspace.yaml, but it
wasn't being copied into the builder layer before install ran.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
pnpm 11 no longer reads the "pnpm" field from package.json; settings
belong in pnpm-workspace.yaml. Also adds msw to the allowlist which
was missing from the existing file.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
pnpm 11 blocks install scripts by default; explicitly allowlist the three
transitive deps that need to run their build scripts.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Removes the @valknarthing/pastel-wasm WASM dependency and replaces it
with a self-contained TypeScript implementation of all color operations
(parsing, conversion, manipulation, gradients, palette generation).
Adds eslint-plugin-react-hooks which was missing from devDependencies.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Visual cron expression editor with field-by-field builder, presets
select, human-readable description, and live schedule preview showing
next occurrences. Registered in tools registry with CronIcon.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Smaller variant for buttons that sit next to section labels in card headers
(Preview, Color, Results rows). Applied to QRPreview, FontPreview,
ColorManipulation, and FileConverter.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Extract shared actionBtn and iconBtn constants into lib/utils/styles.ts
and replace all 11 local definitions across tool components.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Cryptographically secure generator for 5 types:
- Password: configurable charset + entropy strength meter
- UUID: crypto.randomUUID()
- API Key: hex/base62/base64url with optional prefix
- Hash: SHA-1/256/512 of custom input or random data
- Token: variable byte-length in hex or base64url
All using Web Crypto API — nothing leaves the browser.
Registered in lib/tools.tsx with RandomIcon (dice).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
logoStamp and pathFlicker defined at global CSS scope (outside @theme)
so they are always emitted. Logo uses sharp stamp+bounce entrance with
flickering path reveals.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Use scaleIn/fadeIn keyframes from globals.css for the SVG entrance
animation and path group fade-ins.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Drop richColors, apply dark glass background with subtle per-type
border tints (primary/success, red/error, amber/warning, blue/info).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Also restore scroll handling to ExportPanel and PresetLibrary, and
remove maxHeight cap from CodeSnippet in ExportPanel.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Value input now takes full width on its own row; unit selects and
swap button sit on a separate row below, each taking equal flex space.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Shared components (components/ui/):
- slider-row.tsx: SliderRow — label + display value + Slider, replaces
inline slider blocks in FileConverter, QROptions
- color-input.tsx: ColorInput — color swatch + hex text input pair,
replaces repeated inline patterns in QROptions, KeyframeProperties,
FaviconGenerator
Media tool (FileConverter.tsx):
- Remove all shadcn Select/SelectTrigger/SelectContent/SelectItem
- Replace with native <select> + selectCls (matches AnimationSettings
and all other tools)
- Use SliderRow for video/audio bitrate and image quality sliders
- Net: -6 shadcn Select trees, consistent with every other tool
QROptions.tsx:
- Use SliderRow for margin slider (remove raw Slider import)
- Use ColorInput for foreground + background color pairs
KeyframeProperties.tsx:
- Use ColorInput for background color pair (keep local SliderRow which
has a different layout with number input)
FaviconGenerator.tsx:
- Use ColorInput for background + theme color pairs
AnimationSettings.tsx:
- Remove dead bg-[#1a1a2e] per-option className (global CSS handles
select option styling via bg-popover)
Delete:
- components/media/ConversionOptions.tsx — dead code (no imports),
contained the shadcn Label/Input/Select/Slider patterns being replaced
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
ToolCard: larger icon (w-11 h-11) with violet glow on hover, top shimmer
accent line, primary-tinted badges, arrow in glass pill, stronger border/
shadow on hover, all badges shown, overflow-hidden for clean rendering
ToolsGrid: gap-4, section heading with module count callout, max-w-5xl
Stats: align to max-w-5xl, horizontal layout per stat (icon + value/label),
rounder icon container w-9 h-9
Hero: warm up CTA button with ambient bg-primary/[0.07] fill at rest
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>