diff --git a/app/Http/Controllers/ToolController.php b/app/Http/Controllers/ToolController.php
index 13d83e9..eb8c3a2 100644
--- a/app/Http/Controllers/ToolController.php
+++ b/app/Http/Controllers/ToolController.php
@@ -75,6 +75,60 @@ public function index(): View
'route' => 'tools.regex',
'icon' => 'regex',
],
+ [
+ 'name' => 'Base Converter',
+ 'description' => 'Convert between binary, octal, decimal, and hex',
+ 'route' => 'tools.base-converter',
+ 'icon' => 'calculator',
+ ],
+ [
+ 'name' => 'Slug Generator',
+ 'description' => 'Convert text to URL-friendly slugs',
+ 'route' => 'tools.slug-generator',
+ 'icon' => 'slug',
+ ],
+ [
+ 'name' => 'Color Picker',
+ 'description' => 'Pick colors and convert between HEX, RGB, HSL, CMYK',
+ 'route' => 'tools.color-picker',
+ 'icon' => 'color',
+ ],
+ [
+ 'name' => 'QR Code Generator',
+ 'description' => 'Generate QR codes for URLs, text, and more',
+ 'route' => 'tools.qr-code',
+ 'icon' => 'qrcode',
+ ],
+ [
+ 'name' => 'HTML Entity Encoder',
+ 'description' => 'Encode/decode HTML entities and special characters',
+ 'route' => 'tools.html-entity',
+ 'icon' => 'html-entity',
+ ],
+ [
+ 'name' => 'Text Case Converter',
+ 'description' => 'Convert text to camelCase, snake_case, and more',
+ 'route' => 'tools.text-case',
+ 'icon' => 'text-case',
+ ],
+ [
+ 'name' => 'Password Generator',
+ 'description' => 'Generate secure random passwords',
+ 'route' => 'tools.password',
+ 'icon' => 'key',
+ ],
+ [
+ 'name' => 'Lorem Ipsum Generator',
+ 'description' => 'Generate placeholder text for designs',
+ 'route' => 'tools.lorem',
+ 'icon' => 'text',
+ ],
+ [
+ 'name' => 'Cron Parser',
+ 'description' => 'Parse and explain cron expressions',
+ 'route' => 'tools.cron',
+ 'icon' => 'clock',
+ ],
];
return view('home', compact('tools'));
@@ -134,4 +188,49 @@ public function regex(): View
{
return view('tools.regex');
}
+
+ public function baseConverter(): View
+ {
+ return view('tools.base-converter');
+ }
+
+ public function slugGenerator(): View
+ {
+ return view('tools.slug-generator');
+ }
+
+ public function colorPicker(): View
+ {
+ return view('tools.color-picker');
+ }
+
+ public function qrCode(): View
+ {
+ return view('tools.qr-code');
+ }
+
+ public function htmlEntity(): View
+ {
+ return view('tools.html-entity');
+ }
+
+ public function textCase(): View
+ {
+ return view('tools.text-case');
+ }
+
+ public function password(): View
+ {
+ return view('tools.password-generator');
+ }
+
+ public function lorem(): View
+ {
+ return view('tools.lorem-ipsum');
+ }
+
+ public function cron(): View
+ {
+ return view('tools.cron-parser');
+ }
}
diff --git a/resources/views/home.blade.php b/resources/views/home.blade.php
index c2600f0..2a21f80 100644
--- a/resources/views/home.blade.php
+++ b/resources/views/home.blade.php
@@ -90,6 +90,53 @@
@break
+
+ @case('calculator')
+
+
+
+ @break
+ @case('slug')
+
+
+
+ @break
+ @case('color')
+
+
+
+ @break
+ @case('qrcode')
+
+
+
+ @break
+ @case('html-entity')
+
+
+
+ @break
+ @case('text-case')
+
+
+
+
+ @break
+ @case('key')
+
+
+
+ @break
+ @case('text')
+
+
+
+ @break
+ @case('clock')
+
+
+
+ @break
@endswitch
diff --git a/resources/views/tools/base-converter.blade.php b/resources/views/tools/base-converter.blade.php
new file mode 100644
index 0000000..d871911
--- /dev/null
+++ b/resources/views/tools/base-converter.blade.php
@@ -0,0 +1,335 @@
+@extends('layouts.app')
+
+@section('title', 'Base Converter - Binary, Octal, Decimal, Hex | Dev Tools')
+@section('meta_description', 'Free online number base converter. Convert between binary, octal, decimal, and hexadecimal. Instant conversion with bit visualization.')
+@section('meta_keywords', 'base converter, binary converter, hex converter, octal converter, decimal to binary, binary to hex, number base, radix converter')
+
+@push('schema')
+
+@endpush
+
+@section('content')
+
+
+
+
Base Converter
+
Convert between binary, octal, decimal, and hexadecimal
+
+
← Back
+
+
+
+
+
+
+
+
+ Binary (Base 2)
+ 0-1
+
+
+
+
+
+
+
+
+ Octal (Base 8)
+ 0-7
+
+
+
+
+
+
+
+
+ Decimal (Base 10)
+ 0-9
+
+
+
+
+
+
+
+
+ Hexadecimal (Base 16)
+ 0-9, A-F
+
+
+
+
+
+
+
+ Clear All
+
+
+
+
+
+
+
+
Bit Visualization
+
+
Enter a number to see bit visualization
+
+ bits
+
+
+
+
+
+
Quick Examples
+
+
+ 255
+ Max byte
+
+
+ 256
+ 2^8
+
+
+ 1024
+ 1 KB
+
+
+ 65535
+ Max 16-bit
+
+
+
+
+
+
+
Formatted Output
+
+
+ Binary:
+ 0b
+
+
+ Octal:
+ 0o
+
+
+ Decimal:
+
+
+
+ Hex:
+ 0x
+
+
+
Enter a number to see formatted output
+
+
+
+
+
Base Reference
+
+
Binary (2): Uses 0 and 1
+
Octal (8): Uses 0-7
+
Decimal (10): Uses 0-9
+
Hexadecimal (16): Uses 0-9 and A-F
+
+
+
+
+
+@endsection
+
+@push('scripts')
+
+@endpush
diff --git a/resources/views/tools/color-picker.blade.php b/resources/views/tools/color-picker.blade.php
new file mode 100644
index 0000000..d3cde18
--- /dev/null
+++ b/resources/views/tools/color-picker.blade.php
@@ -0,0 +1,490 @@
+@extends('layouts.app')
+
+@section('title', 'Color Picker & Converter - HEX, RGB, HSL, CMYK | Dev Tools')
+@section('meta_description', 'Free online color picker and converter. Convert between HEX, RGB, HSL, and CMYK color formats. Generate color palettes and complementary colors.')
+@section('meta_keywords', 'color picker, color converter, hex to rgb, rgb to hex, hsl converter, cmyk converter, color palette, color tool, web colors')
+
+@push('schema')
+
+@endpush
+
+@section('content')
+
+
+
+
Color Picker & Converter
+
Convert between HEX, RGB, HSL, and CMYK formats
+
+
← Back
+
+
+
+
+
+
+
+
Color Picker
+
+
+
+
+
+ Random Color
+
+
+ Reset
+
+
+
+
+
+
+
+
+
+
+
+
+
Color Harmony
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Click any color to copy its HEX value
+
+
+
+
+
Color Info
+
+
+
+ Brightness:
+
+
+
+ Luminance:
+
+
+
+ Suggested Text:
+
+
+
+
+
+
+
+
Common Colors
+
+
+
+
+
+
+
+
+
+
+@endsection
+
+@push('scripts')
+
+@endpush
diff --git a/resources/views/tools/cron-parser.blade.php b/resources/views/tools/cron-parser.blade.php
new file mode 100644
index 0000000..475ef07
--- /dev/null
+++ b/resources/views/tools/cron-parser.blade.php
@@ -0,0 +1,547 @@
+@extends('layouts.app')
+
+@section('title', 'Cron Expression Parser - Explain & Validate Cron Jobs | Dev Tools')
+@section('meta_description', 'Free online cron expression parser. Understand cron syntax, validate expressions, see next run times, and get human-readable explanations of your cron schedules.')
+@section('meta_keywords', 'cron parser, cron expression, cron validator, cron schedule, crontab, cron syntax, cron job, cron generator, cron explainer, cron next run')
+
+@push('schema')
+
+@endpush
+
+@section('content')
+
+
+
+
Cron Expression Parser
+
Parse and explain cron expressions with next run times
+
+
← Back
+
+
+
+
+
+
Cron Expression
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Syntax Reference
+
+
+
Field Values
+
+
+
+ Minute
+ 0-59
+
+
+ Hour
+ 0-23
+
+
+ Day of Month
+ 1-31
+
+
+ Month
+ 1-12
+
+
+ Day of Week
+ 0-6 (Sun-Sat)
+
+
+
+
+
+
Special Characters
+
+
+
+ *
+ Any value
+
+
+ ,
+ Value list (1,3,5)
+
+
+ -
+ Range (1-5)
+
+
+ /
+ Step (*/15)
+
+
+
+
+
+
+
+
+
+@endsection
+
+@push('scripts')
+
+@endpush
diff --git a/resources/views/tools/html-entity.blade.php b/resources/views/tools/html-entity.blade.php
new file mode 100644
index 0000000..b253fd2
--- /dev/null
+++ b/resources/views/tools/html-entity.blade.php
@@ -0,0 +1,419 @@
+@extends('layouts.app')
+
+@section('title', 'HTML Entity Encoder/Decoder - Free Online Tool | Dev Tools')
+@section('meta_description', 'Free online HTML entity encoder and decoder. Convert special characters to HTML entities and decode them back. Supports named and numeric entities.')
+@section('meta_keywords', 'html entity encoder, html entity decoder, encode html, decode html entities, html special characters, free html tool')
+
+@push('schema')
+
+@endpush
+
+@section('content')
+
+
+
+
HTML Entity Encoder/Decoder
+
Encode special characters to HTML entities or decode them back to text
+
+
← Back
+
+
+
+
+
+
+ Encoding Mode:
+
+ Named Entities (&)
+ Numeric Entities (&)
+ Hex Entities (&)
+
+
+
+
+ Encode all characters
+
+
+
+
+
+
+
+
+
+ Input
+
+ Clear
+
+
+
+
+
+
+
+
+ Encode
+
+
+ Decode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Input length:
+
+
+ Output length:
+
+
+
+
+
+
+
+
+
Common HTML Entities
+
+
+
+
+
+
Entity Reference
+
+
+
+
+ Special Characters
+
+
+ Punctuation
+
+
+ Math Symbols
+
+
+ Currency
+
+
+ Arrows
+
+
+
+
+
+
+
+ Character
+ Named
+ Numeric
+ Hex
+ Description
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+@endsection
+
+@push('scripts')
+
+@endpush
diff --git a/resources/views/tools/lorem-ipsum.blade.php b/resources/views/tools/lorem-ipsum.blade.php
new file mode 100644
index 0000000..a62ae33
--- /dev/null
+++ b/resources/views/tools/lorem-ipsum.blade.php
@@ -0,0 +1,304 @@
+@extends('layouts.app')
+
+@section('title', 'Lorem Ipsum Generator - Placeholder Text Generator | Dev Tools')
+@section('meta_description', 'Free online Lorem Ipsum generator. Generate placeholder text by paragraphs, sentences, or words. Perfect for mockups, wireframes, and design projects.')
+@section('meta_keywords', 'lorem ipsum generator, placeholder text, dummy text, lipsum, filler text, mockup text, design placeholder, random text generator')
+
+@push('schema')
+
+@endpush
+
+@section('content')
+
+
+
+
Lorem Ipsum Generator
+
Generate placeholder text for designs and mockups
+
+
← Back
+
+
+
+
+
+
Options
+
+
+
+
+
+
+ Count:
+
+
+
+ 1
+
+
+
+
+
+
+
+ Start with "Lorem ipsum..."
+
+
+
+
+ Generate
+
+
+
+
+
+
+
+
+
+
+@endsection
+
+@push('scripts')
+
+@endpush
diff --git a/resources/views/tools/password-generator.blade.php b/resources/views/tools/password-generator.blade.php
new file mode 100644
index 0000000..c87db0c
--- /dev/null
+++ b/resources/views/tools/password-generator.blade.php
@@ -0,0 +1,446 @@
+@extends('layouts.app')
+
+@section('title', 'Password Generator - Secure Random Passwords | Dev Tools')
+@section('meta_description', 'Free online secure password generator. Create strong, random passwords with customizable length and character options. Uses cryptographic randomness.')
+@section('meta_keywords', 'password generator, secure password, random password, strong password, password creator, crypto random, password tool')
+
+@push('schema')
+
+@endpush
+
+@section('content')
+
+
+
+
Password Generator
+
Generate secure random passwords
+
+
← Back
+
+
+
+
+
+
Generated Password
+
+
+
+
+
+ Generate Password
+
+
+
+
+
+ Password History
+
+ Clear
+
+
+
+
+
+
+
Bulk Generate
+
+
+
+ Generate Multiple
+
+
+
+
+
+
+
+
+
+
+
Quick Presets
+
+
+ PIN Code
+ 4 digits, numbers only
+
+
+ Simple
+ 8 chars, letters & numbers
+
+
+ Strong
+ 16 chars, all character types
+
+
+ Paranoid
+ 32 chars, all character types
+
+
+
+
+
+
+@endsection
+
+@push('scripts')
+
+@endpush
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
+
+
+
+
+
+
+
Content
+
+
+ characters
+
+
+
+
+
+
Quick Templates
+
+
+ URL
+
+
+ Email
+
+
+ Phone
+
+
+ SMS
+
+
+ WiFi
+
+
+
+
+
+
+
Options
+
+
+
+
+
+ Size: px
+
+
+
+ 128px
+ 512px
+
+
+
+
+
+
+
+
+ Error Correction
+
+ Low (7%)
+ Medium (15%)
+ Quartile (25%)
+ High (30%)
+
+
+
+
+
+
+
+
+
+
Generated QR Code
+
+
+
+
+
+ Enter content to generate QR code
+
+
+
+
+
+
+
+
+
+
+ Download PNG
+
+
+
+
+
+ Download SVG
+
+
+
+
+
+ Copy Image
+
+
+
+
+
+
+
+
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/resources/views/tools/slug-generator.blade.php b/resources/views/tools/slug-generator.blade.php
new file mode 100644
index 0000000..9e07b15
--- /dev/null
+++ b/resources/views/tools/slug-generator.blade.php
@@ -0,0 +1,328 @@
+@extends('layouts.app')
+
+@section('title', 'Slug Generator - Create URL-Friendly Slugs | Dev Tools')
+@section('meta_description', 'Free online slug generator. Convert text to URL-friendly slugs. Customize separators, case, and transliteration options.')
+@section('meta_keywords', 'slug generator, url slug, seo slug, friendly url, text to slug, slug maker, url generator, permalink generator')
+
+@push('schema')
+
+@endpush
+
+@section('content')
+
+
+
+
Slug Generator
+
Convert text to URL-friendly slugs
+
+
← Back
+
+
+
+
+
+
+
Input Text
+
+
+ characters
+
+
+
+
+
+
Options
+
+
+
+
+
Separator
+
+
+ Hyphen (-)
+
+
+ Underscore (_)
+
+
+ Dot (.)
+
+
+ None
+
+
+
+
+
+
+
Case
+
+
+ lowercase
+
+
+ UPPERCASE
+
+
+ Preserve
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Generated Slug
+
+
+
+ Copy
+
+
+
+ characters
+
+
+
+
+
+
URL Preview
+
+ https://example.com/
+
+
+
+
+
+
Try Examples
+
+
+ Hello World! This is a Test
+
+
+ Les écoles françaises sont géniales
+
+
+ Product #123 - Special Edition (2024)
+
+
+
+
+
+
+
What is a Slug?
+
+ A slug is a URL-friendly version of a string, typically used in permalinks. It contains only lowercase letters, numbers, and hyphens, making URLs more readable and SEO-friendly.
+
+
+
+
+
+@endsection
+
+@push('scripts')
+
+@endpush
diff --git a/resources/views/tools/text-case.blade.php b/resources/views/tools/text-case.blade.php
new file mode 100644
index 0000000..039cdd3
--- /dev/null
+++ b/resources/views/tools/text-case.blade.php
@@ -0,0 +1,305 @@
+@extends('layouts.app')
+
+@section('title', 'Text Case Converter - camelCase, snake_case, Title Case | Dev Tools')
+@section('meta_description', 'Free online text case converter. Convert text to lowercase, UPPERCASE, Title Case, camelCase, snake_case, kebab-case, PascalCase, and more.')
+@section('meta_keywords', 'text case converter, camelcase converter, snake case, kebab case, title case, uppercase, lowercase, pascal case, text transformer')
+
+@push('schema')
+
+@endpush
+
+@section('content')
+
+
+
+
Text Case Converter
+
Convert text between different case formats
+
+
← Back
+
+
+
+
+
+
+ Input Text
+
+ Clear
+
+
+
+
+
+ characters
+ words
+ lines
+
+
+
+
+
+
+ Output
+
+ Copy to clipboard
+
+
+
+
+
+
+
+
+
+
+
Quick Actions
+
+
+ lowercase
+
+
+ UPPERCASE
+
+
+ camelCase
+
+
+ snake_case
+
+
+
+
+
+
+@endsection
+
+@push('scripts')
+
+@endpush
diff --git a/routes/web.php b/routes/web.php
index 7c8961e..ee8cb4e 100644
--- a/routes/web.php
+++ b/routes/web.php
@@ -17,6 +17,18 @@
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('/base-converter', [ToolController::class, 'baseConverter'])->name('base-converter');
+ Route::get('/slug-generator', [ToolController::class, 'slugGenerator'])->name('slug-generator');
+ Route::get('/color-picker', [ToolController::class, 'colorPicker'])->name('color-picker');
+
+ Route::get('/qr-code', [ToolController::class, 'qrCode'])->name('qr-code');
+
+ Route::get('/html-entity', [ToolController::class, 'htmlEntity'])->name('html-entity');
+ Route::get('/text-case', [ToolController::class, 'textCase'])->name('text-case');
+ Route::get('/password', [ToolController::class, 'password'])->name('password');
+ Route::get('/lorem', [ToolController::class, 'lorem'])->name('lorem');
+ Route::get('/cron', [ToolController::class, 'cron'])->name('cron');
});
// Static Pages
@@ -38,6 +50,18 @@
['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.base-converter'), 'priority' => '0.8', 'changefreq' => 'monthly'],
+ ['loc' => route('tools.slug-generator'), 'priority' => '0.8', 'changefreq' => 'monthly'],
+ ['loc' => route('tools.color-picker'), 'priority' => '0.8', 'changefreq' => 'monthly'],
+
+ ['loc' => route('tools.qr-code'), 'priority' => '0.8', 'changefreq' => 'monthly'],
+
+ ['loc' => route('tools.html-entity'), 'priority' => '0.8', 'changefreq' => 'monthly'],
+ ['loc' => route('tools.text-case'), 'priority' => '0.8', 'changefreq' => 'monthly'],
+ ['loc' => route('tools.password'), 'priority' => '0.8', 'changefreq' => 'monthly'],
+ ['loc' => route('tools.lorem'), 'priority' => '0.8', 'changefreq' => 'monthly'],
+ ['loc' => route('tools.cron'), '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..ae1bc1b 100644
--- a/tests/Feature/WebRoutesTest.php
+++ b/tests/Feature/WebRoutesTest.php
@@ -29,6 +29,18 @@ public function test_home_page_displays_all_tools(): void
$response->assertSee('URL Encoder');
$response->assertSee('Code Editor');
$response->assertSee('Regex Tester');
+
+ $response->assertSee('Base Converter');
+ $response->assertSee('Slug Generator');
+ $response->assertSee('Color Picker');
+
+ $response->assertSee('QR Code Generator');
+
+ $response->assertSee('HTML Entity Encoder');
+ $response->assertSee('Text Case Converter');
+ $response->assertSee('Password Generator');
+ $response->assertSee('Lorem Ipsum Generator');
+ $response->assertSee('Cron Parser');
}
public function test_home_page_has_tool_links(): void
@@ -46,6 +58,18 @@ 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.base-converter') . '"', false);
+ $response->assertSee('href="' . route('tools.slug-generator') . '"', false);
+ $response->assertSee('href="' . route('tools.color-picker') . '"', false);
+
+ $response->assertSee('href="' . route('tools.qr-code') . '"', false);
+
+ $response->assertSee('href="' . route('tools.html-entity') . '"', false);
+ $response->assertSee('href="' . route('tools.text-case') . '"', false);
+ $response->assertSee('href="' . route('tools.password') . '"', false);
+ $response->assertSee('href="' . route('tools.lorem') . '"', false);
+ $response->assertSee('href="' . route('tools.cron') . '"', false);
}
public function test_csv_tool_page_loads(): void
@@ -252,9 +276,191 @@ public function test_regex_tool_has_required_elements(): void
$response->assertSee('Match Details');
}
+
+ public function test_base_converter_page_loads(): void
+ {
+ $response = $this->get('/tools/base-converter');
+
+ $response->assertStatus(200);
+ $response->assertSee('Base Converter');
+ $response->assertSee('Convert between binary, octal, decimal, and hexadecimal');
+ }
+
+ public function test_base_converter_has_required_elements(): void
+ {
+ $response = $this->get('/tools/base-converter');
+
+ $response->assertStatus(200);
+ $response->assertSee('Binary');
+ $response->assertSee('Octal');
+ $response->assertSee('Decimal');
+ $response->assertSee('Hexadecimal');
+ }
+
+ public function test_slug_generator_page_loads(): void
+ {
+ $response = $this->get('/tools/slug-generator');
+
+ $response->assertStatus(200);
+ $response->assertSee('Slug Generator');
+ $response->assertSee('Convert text to URL-friendly slugs');
+ }
+
+ public function test_slug_generator_has_required_elements(): void
+ {
+ $response = $this->get('/tools/slug-generator');
+
+ $response->assertStatus(200);
+ $response->assertSee('Input Text');
+ $response->assertSee('Generated Slug');
+ $response->assertSee('Separator');
+ $response->assertSee('Hyphen');
+ }
+
+ public function test_color_picker_page_loads(): void
+ {
+ $response = $this->get('/tools/color-picker');
+
+ $response->assertStatus(200);
+ $response->assertSee('Color Picker');
+ $response->assertSee('Convert between HEX, RGB, HSL, and CMYK');
+ }
+
+ public function test_color_picker_has_required_elements(): void
+ {
+ $response = $this->get('/tools/color-picker');
+
+ $response->assertStatus(200);
+ $response->assertSee('HEX');
+ $response->assertSee('RGB');
+ $response->assertSee('HSL');
+ $response->assertSee('CMYK');
+ $response->assertSee('Color Harmony');
+ }
+
+ 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_html_entity_tool_page_loads(): void
+ {
+ $response = $this->get('/tools/html-entity');
+
+ $response->assertStatus(200);
+ $response->assertSee('HTML Entity Encoder/Decoder');
+ $response->assertSee('Encode special characters to HTML entities or decode them back to text');
+ }
+
+ public function test_html_entity_tool_has_required_elements(): void
+ {
+ $response = $this->get('/tools/html-entity');
+
+ $response->assertStatus(200);
+ $response->assertSee('Encode');
+ $response->assertSee('Decode');
+ $response->assertSee('Common HTML Entities');
+ $response->assertSee('Entity Reference');
+ }
+
+ public function test_text_case_tool_page_loads(): void
+ {
+ $response = $this->get('/tools/text-case');
+
+ $response->assertStatus(200);
+ $response->assertSee('Text Case Converter');
+ $response->assertSee('Convert text between different case formats');
+ }
+
+ public function test_text_case_tool_has_required_elements(): void
+ {
+ $response = $this->get('/tools/text-case');
+
+ $response->assertStatus(200);
+ $response->assertSee('Input Text');
+ $response->assertSee('Convert To');
+ $response->assertSee('camelCase');
+ $response->assertSee('snake_case');
+ }
+
+ public function test_password_tool_page_loads(): void
+ {
+ $response = $this->get('/tools/password');
+
+ $response->assertStatus(200);
+ $response->assertSee('Password Generator');
+ $response->assertSee('Generate secure random passwords');
+ }
+
+ public function test_password_tool_has_required_elements(): void
+ {
+ $response = $this->get('/tools/password');
+
+ $response->assertStatus(200);
+ $response->assertSee('Generated Password');
+ $response->assertSee('Strength');
+ $response->assertSee('Options');
+ $response->assertSee('Quick Presets');
+ }
+
+ public function test_lorem_tool_page_loads(): void
+ {
+ $response = $this->get('/tools/lorem');
+
+ $response->assertStatus(200);
+ $response->assertSee('Lorem Ipsum Generator');
+ $response->assertSee('Generate placeholder text');
+ }
+
+ public function test_lorem_tool_has_required_elements(): void
+ {
+ $response = $this->get('/tools/lorem');
+
+ $response->assertStatus(200);
+ $response->assertSee('Paragraphs');
+ $response->assertSee('Sentences');
+ $response->assertSee('Words');
+ $response->assertSee('Generate');
+ }
+
+ public function test_cron_tool_page_loads(): void
+ {
+ $response = $this->get('/tools/cron');
+
+ $response->assertStatus(200);
+ $response->assertSee('Cron Expression Parser');
+ $response->assertSee('Parse and explain cron expressions');
+ }
+
+ public function test_cron_tool_has_required_elements(): void
+ {
+ $response = $this->get('/tools/cron');
+
+ $response->assertStatus(200);
+ $response->assertSee('Cron Expression');
+ $response->assertSee('Common Patterns');
+ $response->assertSee('Syntax Reference');
+ $response->assertSee('Next Run Times');
+ }
+
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/base-converter', '/tools/slug-generator', '/tools/color-picker', '/tools/qr-code', '/tools/html-entity', '/tools/text-case', '/tools/password', '/tools/lorem', '/tools/cron'];
foreach ($pages as $page) {
$response = $this->get($page);
@@ -266,7 +472,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/base-converter', '/tools/slug-generator', '/tools/color-picker', '/tools/qr-code', '/tools/html-entity', '/tools/text-case', '/tools/password', '/tools/lorem', '/tools/cron'];
foreach ($pages as $page) {
$response = $this->get($page);
@@ -279,7 +485,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/base-converter', '/tools/slug-generator', '/tools/color-picker', '/tools/qr-code', '/tools/html-entity', '/tools/text-case', '/tools/password', '/tools/lorem', '/tools/cron'];
foreach ($pages as $page) {
$response = $this->get($page);
@@ -292,7 +498,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/base-converter', '/tools/slug-generator', '/tools/color-picker', '/tools/qr-code', '/tools/html-entity', '/tools/text-case', '/tools/password', '/tools/lorem', '/tools/cron'];
foreach ($toolPages as $page) {
$response = $this->get($page);
@@ -345,7 +551,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/base-converter', '/tools/slug-generator', '/tools/color-picker', '/tools/qr-code', '/tools/html-entity', '/tools/text-case', '/tools/password', '/tools/lorem', '/tools/cron'];
foreach ($pages as $page) {
$response = $this->get($page);