From 77cec2875c789debbc3f49f425501d2e65223d1f Mon Sep 17 00:00:00 2001 From: jalel Date: Sun, 14 Dec 2025 20:53:36 +0000 Subject: [PATCH] Add QR Code Generator tool - Generate QR codes from text, URLs, email, phone, SMS, WiFi - Customizable size (128-512px) and colors - Error correction level options (L, M, Q, H) - Download as PNG or SVG - Copy QR code image to clipboard - Quick templates for common use cases - Client-side only using qrcode.js library --- app/Http/Controllers/ToolController.php | 11 + resources/views/home.blade.php | 5 + resources/views/tools/qr-code.blade.php | 416 ++++++++++++++++++++++++ routes/web.php | 2 + tests/Feature/WebRoutesTest.php | 32 +- 5 files changed, 461 insertions(+), 5 deletions(-) create mode 100644 resources/views/tools/qr-code.blade.php diff --git a/app/Http/Controllers/ToolController.php b/app/Http/Controllers/ToolController.php index 13d83e9..bf92814 100644 --- a/app/Http/Controllers/ToolController.php +++ b/app/Http/Controllers/ToolController.php @@ -75,6 +75,12 @@ public function index(): View 'route' => 'tools.regex', 'icon' => 'regex', ], + [ + 'name' => 'QR Code Generator', + 'description' => 'Generate QR codes for URLs, text, and more', + 'route' => 'tools.qr-code', + 'icon' => 'qrcode', + ], ]; return view('home', compact('tools')); @@ -134,4 +140,9 @@ public function regex(): View { return view('tools.regex'); } + + public function qrCode(): View + { + return view('tools.qr-code'); + } } diff --git a/resources/views/home.blade.php b/resources/views/home.blade.php index c2600f0..d653103 100644 --- a/resources/views/home.blade.php +++ b/resources/views/home.blade.php @@ -90,6 +90,11 @@ @break + @case('qrcode') + + + + @break @endswitch
diff --git a/resources/views/tools/qr-code.blade.php b/resources/views/tools/qr-code.blade.php new file mode 100644 index 0000000..f48406f --- /dev/null +++ b/resources/views/tools/qr-code.blade.php @@ -0,0 +1,416 @@ +@extends('layouts.app') + +@section('title', 'QR Code Generator - Create QR Codes Online Free | Dev Tools') +@section('meta_description', 'Free online QR code generator. Create QR codes for URLs, text, email, phone numbers. Customize colors and size. Download as PNG instantly.') +@section('meta_keywords', 'qr code generator, create qr code, qr code maker, free qr code, qr code online, generate qr code, custom qr code, qr code download') + +@push('schema') + +@endpush + +@section('content') +
+
+
+

QR Code Generator

+

Generate QR codes for URLs, text, and more

+
+ ← Back +
+ +
+ +
+
+ + +

+ characters +

+
+ + +
+ +
+ + + + + +
+
+ + +
+ + +
+ +
+ + +
+ 128px + 512px +
+
+ + +
+
+ +
+ + +
+
+
+ +
+ + +
+
+
+ + +
+ + +
+
+
+
+ + +
+
+ + +
+ +
+ + +
+ + +
+ + + +
+
+
+ + +
+

About QR Codes

+
+

URL: Link directly to websites

+

Email: Use mailto:email@example.com

+

Phone: Use tel:+1234567890

+

SMS: Use sms:+1234567890?body=message

+

WiFi: Use WIFI:T:WPA;S:NetworkName;P:Password;;

+
+
+ + +
+

Error Correction Levels

+
    +
  • L (Low): 7% - Smallest QR code
  • +
  • M (Medium): 15% - Good balance
  • +
  • Q (Quartile): 25% - Better recovery
  • +
  • H (High): 30% - Best for logos
  • +
+
+
+
+
+@endsection + +@push('scripts') + + +@endpush diff --git a/routes/web.php b/routes/web.php index 7c8961e..d0fbca7 100644 --- a/routes/web.php +++ b/routes/web.php @@ -17,6 +17,7 @@ Route::get('/url', [ToolController::class, 'url'])->name('url'); Route::get('/code-editor', [ToolController::class, 'codeEditor'])->name('code-editor'); Route::get('/regex', [ToolController::class, 'regex'])->name('regex'); + Route::get('/qr-code', [ToolController::class, 'qrCode'])->name('qr-code'); }); // Static Pages @@ -38,6 +39,7 @@ ['loc' => route('tools.url'), 'priority' => '0.8', 'changefreq' => 'monthly'], ['loc' => route('tools.code-editor'), 'priority' => '0.9', 'changefreq' => 'monthly'], ['loc' => route('tools.regex'), 'priority' => '0.8', 'changefreq' => 'monthly'], + ['loc' => route('tools.qr-code'), 'priority' => '0.8', 'changefreq' => 'monthly'], ['loc' => route('about'), 'priority' => '0.5', 'changefreq' => 'monthly'], ['loc' => route('privacy'), 'priority' => '0.3', 'changefreq' => 'yearly'], ]; diff --git a/tests/Feature/WebRoutesTest.php b/tests/Feature/WebRoutesTest.php index 71c4bf8..51db2f7 100644 --- a/tests/Feature/WebRoutesTest.php +++ b/tests/Feature/WebRoutesTest.php @@ -29,6 +29,7 @@ public function test_home_page_displays_all_tools(): void $response->assertSee('URL Encoder'); $response->assertSee('Code Editor'); $response->assertSee('Regex Tester'); + $response->assertSee('QR Code Generator'); } public function test_home_page_has_tool_links(): void @@ -46,6 +47,7 @@ public function test_home_page_has_tool_links(): void $response->assertSee('href="' . route('tools.url') . '"', false); $response->assertSee('href="' . route('tools.code-editor') . '"', false); $response->assertSee('href="' . route('tools.regex') . '"', false); + $response->assertSee('href="' . route('tools.qr-code') . '"', false); } public function test_csv_tool_page_loads(): void @@ -252,9 +254,29 @@ public function test_regex_tool_has_required_elements(): void $response->assertSee('Match Details'); } + public function test_qr_code_tool_page_loads(): void + { + $response = $this->get('/tools/qr-code'); + + $response->assertStatus(200); + $response->assertSee('QR Code Generator'); + $response->assertSee('Generate QR codes for URLs, text, and more'); + } + + public function test_qr_code_tool_has_required_elements(): void + { + $response = $this->get('/tools/qr-code'); + + $response->assertStatus(200); + $response->assertSee('Content'); + $response->assertSee('Quick Templates'); + $response->assertSee('Download PNG'); + $response->assertSee('Error Correction'); + } + public function test_all_pages_have_navigation(): void { - $pages = ['/', '/tools/csv', '/tools/yaml', '/tools/markdown', '/tools/sql', '/tools/base64', '/tools/uuid', '/tools/hash', '/tools/url', '/tools/code-editor', '/tools/regex']; + $pages = ['/', '/tools/csv', '/tools/yaml', '/tools/markdown', '/tools/sql', '/tools/base64', '/tools/uuid', '/tools/hash', '/tools/url', '/tools/code-editor', '/tools/regex', '/tools/qr-code']; foreach ($pages as $page) { $response = $this->get($page); @@ -266,7 +288,7 @@ public function test_all_pages_have_navigation(): void public function test_all_pages_have_theme_toggle(): void { - $pages = ['/', '/tools/csv', '/tools/yaml', '/tools/markdown', '/tools/sql', '/tools/base64', '/tools/uuid', '/tools/hash', '/tools/url', '/tools/code-editor', '/tools/regex']; + $pages = ['/', '/tools/csv', '/tools/yaml', '/tools/markdown', '/tools/sql', '/tools/base64', '/tools/uuid', '/tools/hash', '/tools/url', '/tools/code-editor', '/tools/regex', '/tools/qr-code']; foreach ($pages as $page) { $response = $this->get($page); @@ -279,7 +301,7 @@ public function test_all_pages_have_theme_toggle(): void public function test_all_pages_load_vite_assets(): void { // Code editor uses standalone template without Vite - $pages = ['/', '/tools/csv', '/tools/yaml', '/tools/markdown', '/tools/sql', '/tools/base64', '/tools/uuid', '/tools/hash', '/tools/url', '/tools/regex']; + $pages = ['/', '/tools/csv', '/tools/yaml', '/tools/markdown', '/tools/sql', '/tools/base64', '/tools/uuid', '/tools/hash', '/tools/url', '/tools/regex', '/tools/qr-code']; foreach ($pages as $page) { $response = $this->get($page); @@ -292,7 +314,7 @@ public function test_all_pages_load_vite_assets(): void public function test_all_tool_pages_have_back_link(): void { // Code editor uses standalone template with home link instead of back - $toolPages = ['/tools/csv', '/tools/yaml', '/tools/markdown', '/tools/sql', '/tools/base64', '/tools/uuid', '/tools/hash', '/tools/url', '/tools/regex']; + $toolPages = ['/tools/csv', '/tools/yaml', '/tools/markdown', '/tools/sql', '/tools/base64', '/tools/uuid', '/tools/hash', '/tools/url', '/tools/regex', '/tools/qr-code']; foreach ($toolPages as $page) { $response = $this->get($page); @@ -345,7 +367,7 @@ public function test_api_routes_reject_get_requests(): void public function test_pages_have_csrf_token(): void { - $pages = ['/tools/csv', '/tools/yaml', '/tools/markdown', '/tools/sql', '/tools/base64', '/tools/uuid', '/tools/hash', '/tools/url', '/tools/code-editor']; + $pages = ['/tools/csv', '/tools/yaml', '/tools/markdown', '/tools/sql', '/tools/base64', '/tools/uuid', '/tools/hash', '/tools/url', '/tools/code-editor', '/tools/qr-code']; foreach ($pages as $page) { $response = $this->get($page);