lighthouse

This commit is contained in:
Timo Knuth 2026-01-11 17:11:28 +01:00
parent d64459b200
commit 1f067e81f3
33 changed files with 1229 additions and 1229 deletions

View File

@ -209,7 +209,7 @@ export default function CryptoGenerator() {
Wallet Direct
</button>
</div>
<p className="text-xs text-slate-500 mt-2">
<p className="text-xs text-slate-600 mt-2">
{qrMode === 'universal'
? "Works with any phone camera. Opens blockchain explorer."
: "Requires scanning from a wallet app. Enables direct payment."}
@ -319,7 +319,7 @@ export default function CryptoGenerator() {
<Bitcoin className="w-4 h-4 text-slate-400 shrink-0" />
<span className="truncate capitalize">{currency}</span>
</h3>
<div className="text-xs text-slate-500 mt-1 truncate px-2">
<div className="text-xs text-slate-600 mt-1 truncate px-2">
{address || 'Wallet Address'}
</div>
</div>
@ -344,7 +344,7 @@ export default function CryptoGenerator() {
</Button>
</div>
<p className="text-xs text-slate-500 mt-4 text-center">
<p className="text-xs text-slate-600 mt-4 text-center">
Scanning copies the wallet address or opens a crypto app.
</p>
</div>

View File

@ -272,7 +272,7 @@ export default function EmailGenerator() {
</Button>
</div>
<p className="text-xs text-slate-500 mt-4 text-center">
<p className="text-xs text-slate-600 mt-4 text-center">
100% free. No signup required.
</p>
</div>

View File

@ -277,7 +277,7 @@ export default function EventGenerator() {
<span className="truncate">{title || 'Event Title'}</span>
</h3>
{(startDate) && (
<div className="text-xs text-slate-500 mt-1 flex items-center justify-center gap-1">
<div className="text-xs text-slate-600 mt-1 flex items-center justify-center gap-1">
<Clock className="w-3 h-3" />
{new Date(startDate).toLocaleDateString()}
</div>
@ -304,7 +304,7 @@ export default function EventGenerator() {
</Button>
</div>
<p className="text-xs text-slate-500 mt-4 text-center">
<p className="text-xs text-slate-600 mt-4 text-center">
Scanning adds the event to the user's calendar.
</p>
</div>

View File

@ -105,7 +105,7 @@ export default function FacebookGenerator() {
onChange={(e) => setUrl(e.target.value)}
className="h-12 text-base rounded-xl border-slate-200 focus:border-[#1877F2] focus:ring-[#1877F2]"
/>
<p className="text-xs text-slate-500 mt-2">Paste the full link to your profile, page, group, or post.</p>
<p className="text-xs text-slate-600 mt-2">Paste the full link to your profile, page, group, or post.</p>
</div>
</div>
@ -198,7 +198,7 @@ export default function FacebookGenerator() {
<Facebook className="w-4 h-4 text-slate-400 shrink-0" />
<span className="truncate">{url ? url.replace('https://', '') : 'facebook.com/...'}</span>
</h3>
<div className="text-xs text-slate-500 mt-1">Opens in Facebook App</div>
<div className="text-xs text-slate-600 mt-1">Opens in Facebook App</div>
</div>
</div>
@ -221,7 +221,7 @@ export default function FacebookGenerator() {
</Button>
</div>
<p className="text-xs text-slate-500 mt-4 text-center">
<p className="text-xs text-slate-600 mt-4 text-center">
Scanning redirects directly to the Facebook profile or page.
</p>
</div>

View File

@ -148,7 +148,7 @@ export default function GeolocationGenerator() {
/>
</div>
</div>
<p className="text-xs text-slate-500">
<p className="text-xs text-slate-600">
Tip: You can copy-paste coordinates directly from Google Maps.
(Right-click a location on standard Maps, then click the coordinates to copy).
</p>
@ -243,7 +243,7 @@ export default function GeolocationGenerator() {
<MapPin className="w-4 h-4 text-[#10B981] shrink-0" />
<span className="truncate">{latitude || 'Lat'}, {longitude || 'Long'}</span>
</h3>
<div className="text-xs text-slate-500 mt-1">Google Maps Location</div>
<div className="text-xs text-slate-600 mt-1">Google Maps Location</div>
</div>
</div>
@ -266,7 +266,7 @@ export default function GeolocationGenerator() {
</Button>
</div>
<p className="text-xs text-slate-500 mt-4 text-center">
<p className="text-xs text-slate-600 mt-4 text-center">
Scanning opens the location directly in Google Maps.
</p>
</div>

View File

@ -211,7 +211,7 @@ export default function GeolocationQRCodePage() {
<div className="absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2">
<MapPin className="w-8 h-8 text-red-500 drop-shadow-lg animate-bounce" />
</div>
<div className="absolute bottom-2 left-2 right-2 bg-white/90 p-2 rounded text-[10px] text-slate-500 font-mono text-center">
<div className="absolute bottom-2 left-2 right-2 bg-white/90 p-2 rounded text-[10px] text-slate-600 font-mono text-center">
40.7128° N, 74.0060° W
</div>
</div>

View File

@ -110,7 +110,7 @@ export default function InstagramGenerator() {
onChange={(e) => setUsername(e.target.value)}
className="h-12 text-base rounded-xl border-slate-200 focus:border-[#E1306C] focus:ring-[#E1306C]"
/>
<p className="text-xs text-slate-500 mt-2">Enter your username (without @) or paste full profile link.</p>
<p className="text-xs text-slate-600 mt-2">Enter your username (without @) or paste full profile link.</p>
</div>
</div>
@ -203,7 +203,7 @@ export default function InstagramGenerator() {
<Instagram className="w-4 h-4 text-slate-400 shrink-0" />
<span className="truncate">{username || '@username'}</span>
</h3>
<div className="text-xs text-slate-500 mt-1">Opens in Instagram</div>
<div className="text-xs text-slate-600 mt-1">Opens in Instagram</div>
</div>
</div>
@ -226,7 +226,7 @@ export default function InstagramGenerator() {
</Button>
</div>
<p className="text-xs text-slate-500 mt-4 text-center">
<p className="text-xs text-slate-600 mt-4 text-center">
Scanning redirects directly to your Instagram profile.
</p>
</div>

View File

@ -171,7 +171,7 @@ export default function PayPalGenerator() {
onChange={(e) => setPaypalId(e.target.value)}
className="h-12 text-base rounded-xl border-slate-200 focus:border-[#003087] focus:ring-[#003087]"
/>
<p className="text-xs text-slate-500 mt-2">
<p className="text-xs text-slate-600 mt-2">
{inputType === 'username'
? <>Find yours at <a href="https://paypal.me" target="_blank" rel="noopener noreferrer" className="text-[#003087] underline">paypal.me</a></>
: 'The email address linked to your PayPal account'
@ -293,7 +293,7 @@ export default function PayPalGenerator() {
<span className="truncate">{paypalId || 'Your PayPal'}</span>
</h3>
{amount && (
<p className="text-sm text-slate-500 mt-1">{amount} {currency}</p>
<p className="text-sm text-slate-600 mt-1">{amount} {currency}</p>
)}
</div>
</div>
@ -317,7 +317,7 @@ export default function PayPalGenerator() {
</Button>
</div>
<p className="text-xs text-slate-500 mt-4 text-center">
<p className="text-xs text-slate-600 mt-4 text-center">
Your PayPal link is encoded directly. Static and forever free.
</p>
</div>

View File

@ -106,7 +106,7 @@ export default function PhoneGenerator() {
onChange={(e) => setPhone(e.target.value)}
className="h-12 text-base rounded-xl border-slate-200 focus:border-[#1A1265] focus:ring-[#1A1265]"
/>
<p className="text-xs text-slate-500 mt-2">Enter with country code for best results (e.g. +1).</p>
<p className="text-xs text-slate-600 mt-2">Enter with country code for best results (e.g. +1).</p>
</div>
</div>
@ -221,7 +221,7 @@ export default function PhoneGenerator() {
</Button>
</div>
<p className="text-xs text-slate-500 mt-4 text-center">
<p className="text-xs text-slate-600 mt-4 text-center">
Scanning initiates a call on any mobile phone.
</p>
</div>

View File

@ -120,7 +120,7 @@ export default function SMSGenerator() {
onChange={(e) => setMessage(e.target.value)}
maxLength={160}
/>
<p className="text-xs text-slate-500 mt-2 text-right">{message.length}/160</p>
<p className="text-xs text-slate-600 mt-2 text-right">{message.length}/160</p>
</div>
</div>
</div>
@ -214,7 +214,7 @@ export default function SMSGenerator() {
<Phone className="w-4 h-4 text-slate-400 shrink-0" />
<span className="truncate">{phone || 'Number'}</span>
</h3>
<div className="flex items-center justify-center gap-2 mt-2 text-slate-500 text-xs">
<div className="flex items-center justify-center gap-2 mt-2 text-slate-600 text-xs">
<MessageSquare className="w-3 h-3" />
<span className="italic truncate">{message || 'Your message...'}</span>
</div>
@ -240,7 +240,7 @@ export default function SMSGenerator() {
</Button>
</div>
<p className="text-xs text-slate-500 mt-4 text-center">
<p className="text-xs text-slate-600 mt-4 text-center">
Opens the messaging app with text pre-filled.
</p>
</div>

View File

@ -152,7 +152,7 @@ export default function TeamsGenerator() {
onChange={(e) => setMeetingUrl(e.target.value)}
className="h-12 text-base rounded-xl border-slate-200 focus:border-[#6264A7] focus:ring-[#6264A7]"
/>
<p className="text-xs text-slate-500 mt-2">
<p className="text-xs text-slate-600 mt-2">
Copy the meeting link from your Teams calendar invite.
</p>
</div>
@ -166,7 +166,7 @@ export default function TeamsGenerator() {
onChange={(e) => setUserEmail(e.target.value)}
className="h-12 text-base rounded-xl border-slate-200 focus:border-[#6264A7] focus:ring-[#6264A7]"
/>
<p className="text-xs text-slate-500 mt-2">
<p className="text-xs text-slate-600 mt-2">
The person's work email to start a Teams chat.
</p>
</div>
@ -269,7 +269,7 @@ export default function TeamsGenerator() {
{linkType === 'meeting' ? 'Teams Meeting' : (userEmail || 'Teams Chat')}
</span>
</h3>
<p className="text-sm text-slate-500 mt-1">
<p className="text-sm text-slate-600 mt-1">
{linkType === 'meeting' ? 'Join Meeting' : 'Start Chat'}
</p>
</div>
@ -294,7 +294,7 @@ export default function TeamsGenerator() {
</Button>
</div>
<p className="text-xs text-slate-500 mt-4 text-center">
<p className="text-xs text-slate-600 mt-4 text-center">
Works with Microsoft Teams desktop and mobile apps.
</p>
</div>

View File

@ -200,7 +200,7 @@ export default function TeamsQRCodePage() {
</div>
<div>
<div className="font-bold text-slate-900 text-sm">Team Standup</div>
<div className="text-xs text-slate-500">Daily at 9:00 AM</div>
<div className="text-xs text-slate-600">Daily at 9:00 AM</div>
</div>
</div>
<div className="flex gap-2">

View File

@ -221,7 +221,7 @@ export default function TextGenerator() {
</Button>
</div>
<p className="text-xs text-slate-500 mt-4 text-center">
<p className="text-xs text-slate-600 mt-4 text-center">
Your text stays on your device. Nothing is sent to servers.
</p>
</div>

View File

@ -110,7 +110,7 @@ export default function TiktokGenerator() {
onChange={(e) => setUsername(e.target.value)}
className="h-12 text-base rounded-xl border-slate-200 focus:border-black focus:ring-black"
/>
<p className="text-xs text-slate-500 mt-2">Enter your TikTok handle (e.g. @charlidamelio).</p>
<p className="text-xs text-slate-600 mt-2">Enter your TikTok handle (e.g. @charlidamelio).</p>
</div>
</div>
@ -203,7 +203,7 @@ export default function TiktokGenerator() {
<Music className="w-4 h-4 text-slate-400 shrink-0" />
<span className="truncate">{username || '@username'}</span>
</h3>
<div className="text-xs text-slate-500 mt-1">Opens in TikTok</div>
<div className="text-xs text-slate-600 mt-1">Opens in TikTok</div>
</div>
</div>
@ -226,7 +226,7 @@ export default function TiktokGenerator() {
</Button>
</div>
<p className="text-xs text-slate-500 mt-4 text-center">
<p className="text-xs text-slate-600 mt-4 text-center">
Scanning redirects directly to your TikTok profile.
</p>
</div>

View File

@ -110,7 +110,7 @@ export default function TwitterGenerator() {
onChange={(e) => setUsername(e.target.value)}
className="h-12 text-base rounded-xl border-slate-200 focus:border-black focus:ring-black"
/>
<p className="text-xs text-slate-500 mt-2">Enter your X (Twitter) handle to create a profile link.</p>
<p className="text-xs text-slate-600 mt-2">Enter your X (Twitter) handle to create a profile link.</p>
</div>
</div>
@ -203,7 +203,7 @@ export default function TwitterGenerator() {
<Twitter className="w-4 h-4 text-slate-400 shrink-0" />
<span className="truncate">{username || '@username'}</span>
</h3>
<div className="text-xs text-slate-500 mt-1">Opens in X (Twitter)</div>
<div className="text-xs text-slate-600 mt-1">Opens in X (Twitter)</div>
</div>
</div>
@ -226,7 +226,7 @@ export default function TwitterGenerator() {
</Button>
</div>
<p className="text-xs text-slate-500 mt-4 text-center">
<p className="text-xs text-slate-600 mt-4 text-center">
Scanning redirects directly to the X profile.
</p>
</div>

View File

@ -104,7 +104,7 @@ export default function URLGenerator() {
onChange={(e) => setUrl(e.target.value)}
className="h-12 text-base rounded-xl border-slate-200 focus:border-[#4F46E5] focus:ring-[#4F46E5]"
/>
<p className="text-xs text-slate-500 mt-2">Include https:// for best results.</p>
<p className="text-xs text-slate-600 mt-2">Include https:// for best results.</p>
</div>
</div>
@ -219,7 +219,7 @@ export default function URLGenerator() {
</Button>
</div>
<p className="text-xs text-slate-500 mt-4 text-center">
<p className="text-xs text-slate-600 mt-4 text-center">
Your link is encoded directly. Static and forever free.
</p>
</div>

View File

@ -299,7 +299,7 @@ export default function VCardGenerator() {
<Contact className="w-4 h-4 text-slate-400 shrink-0" />
<span className="truncate">{firstName || 'First'} {lastName || 'Last'}</span>
</h3>
<div className="text-xs text-slate-500 mt-1 truncate">{company || 'Company Name'}</div>
<div className="text-xs text-slate-600 mt-1 truncate">{company || 'Company Name'}</div>
</div>
</div>
@ -322,7 +322,7 @@ export default function VCardGenerator() {
</Button>
</div>
<p className="text-xs text-slate-500 mt-4 text-center">
<p className="text-xs text-slate-600 mt-4 text-center">
Scanning adds this contact to the address book instantly.
</p>
</div>

View File

@ -115,7 +115,7 @@ export default function WhatsappGenerator() {
onChange={(e) => setPhone(e.target.value)}
className="h-12 text-base rounded-xl border-slate-200 focus:border-[#25D366] focus:ring-[#25D366]"
/>
<p className="text-xs text-slate-500 mt-2">Include country code (e.g. 1 for US, 44 for UK). No '+' symbol.</p>
<p className="text-xs text-slate-600 mt-2">Include country code (e.g. 1 for US, 44 for UK). No '+' symbol.</p>
</div>
<div>
@ -218,7 +218,7 @@ export default function WhatsappGenerator() {
<Phone className="w-4 h-4 text-slate-400 shrink-0" />
<span className="truncate">{phone ? `+${phone}` : 'Number'}</span>
</h3>
<div className="text-xs text-slate-500 mt-1">Starts WhatsApp Chat</div>
<div className="text-xs text-slate-600 mt-1">Starts WhatsApp Chat</div>
</div>
</div>
@ -241,7 +241,7 @@ export default function WhatsappGenerator() {
</Button>
</div>
<p className="text-xs text-slate-500 mt-4 text-center">
<p className="text-xs text-slate-600 mt-4 text-center">
Scanning starts a chat with this number instantly.
</p>
</div>

View File

@ -210,12 +210,12 @@ export default function WhatsappQRCodePage() {
{/* Chat Bubble Right */}
<div className="bg-[#DCF8C6] p-2 rounded-lg self-end mb-2 max-w-[80%] text-[10px] text-slate-800 shadow-sm">
Hi! I'd like to book an appointment.
<div className="text-[8px] text-slate-500 text-right mt-0.5">10:42 AM <span className="text-blue-500"></span></div>
<div className="text-[8px] text-slate-600 text-right mt-0.5">10:42 AM <span className="text-blue-500"></span></div>
</div>
{/* Chat Bubble Left */}
<div className="bg-white p-2 rounded-lg self-start max-w-[80%] text-[10px] text-slate-800 shadow-sm">
Sure! What time works for you?
<div className="text-[8px] text-slate-500 text-right mt-0.5">10:43 AM</div>
<div className="text-[8px] text-slate-600 text-right mt-0.5">10:43 AM</div>
</div>
</div>

View File

@ -282,7 +282,7 @@ export default function WiFiGenerator() {
</div>
<p className="text-xs text-slate-500 mt-4 text-center">
<p className="text-xs text-slate-600 mt-4 text-center">
Your credentials stay on your device. Nothing is sent to servers.
</p>
</div>

View File

@ -103,7 +103,7 @@ export default function YoutubeGenerator() {
onChange={(e) => setUrl(e.target.value)}
className="h-12 text-base rounded-xl border-slate-200 focus:border-[#FF0000] focus:ring-[#FF0000]"
/>
<p className="text-xs text-slate-500 mt-2">Paste a link to any video, channel, or playlist.</p>
<p className="text-xs text-slate-600 mt-2">Paste a link to any video, channel, or playlist.</p>
</div>
</div>
@ -196,7 +196,7 @@ export default function YoutubeGenerator() {
<Youtube className="w-4 h-4 text-slate-400 shrink-0" />
<span className="truncate">{url ? 'YouTube Content' : 'youtube.com'}</span>
</h3>
<div className="text-xs text-slate-500 mt-1">Opens in YouTube App</div>
<div className="text-xs text-slate-600 mt-1">Opens in YouTube App</div>
</div>
</div>
@ -219,7 +219,7 @@ export default function YoutubeGenerator() {
</Button>
</div>
<p className="text-xs text-slate-500 mt-4 text-center">
<p className="text-xs text-slate-600 mt-4 text-center">
Scanning redirects directly to the video or channel.
</p>
</div>

View File

@ -136,7 +136,7 @@ export default function ZoomGenerator() {
onChange={(e) => setMeetingId(e.target.value.replace(/\D/g, ''))}
className="h-12 text-base rounded-xl border-slate-200 focus:border-[#2D8CFF] focus:ring-[#2D8CFF]"
/>
<p className="text-xs text-slate-500 mt-2">The 10-11 digit meeting ID from your Zoom invite.</p>
<p className="text-xs text-slate-600 mt-2">The 10-11 digit meeting ID from your Zoom invite.</p>
</div>
<div>
@ -254,7 +254,7 @@ export default function ZoomGenerator() {
<span className="truncate">{formatMeetingId(meetingId) || 'Meeting ID'}</span>
</h3>
{passcode && (
<p className="text-sm text-slate-500 mt-1">Passcode: {passcode}</p>
<p className="text-sm text-slate-600 mt-1">Passcode: {passcode}</p>
)}
</div>
</div>
@ -278,7 +278,7 @@ export default function ZoomGenerator() {
</Button>
</div>
<p className="text-xs text-slate-500 mt-4 text-center">
<p className="text-xs text-slate-600 mt-4 text-center">
Your meeting ID is encoded directly. Static and forever free.
</p>
</div>

View File

@ -200,7 +200,7 @@ export default function ZoomQRCodePage() {
</div>
<div>
<div className="font-bold text-slate-900 text-sm">Team Standup</div>
<div className="text-xs text-slate-500">ID: 123 456 7890</div>
<div className="text-xs text-slate-600">ID: 123 456 7890</div>
</div>
</div>
<div className="flex gap-2">

View File

@ -47,7 +47,7 @@ const TOOLS = [
name: 'Text',
description: 'Display plain text',
href: '/tools/text-qr-code',
color: 'text-slate-500',
color: 'text-slate-600',
bg: 'bg-slate-50'
},
{
@ -240,7 +240,7 @@ export function FreeToolsGrid() {
<h3 className="text-base md:text-lg font-semibold text-slate-900 mb-0.5">
{tool.name}
</h3>
<p className="text-xs md:text-sm text-slate-500 text-center">
<p className="text-xs md:text-sm text-slate-600 text-center">
{tool.description}
</p>
</Link>