Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
15a3bfc
Deploy: sync from develop
github-actions[bot] Nov 30, 2025
dc0cb43
Merge pull request #3 from GhDj/deploy/20251130-151348
GhDj Nov 30, 2025
834fd21
Merge pull request #4 from GhDj/develop
GhDj Nov 30, 2025
0abaf1c
Merge pull request #7 from GhDj/develop
GhDj Nov 30, 2025
f84e19c
Merge develop into main
GhDj Dec 1, 2025
cff4880
Merge develop into main - restore vite.config.js
GhDj Dec 1, 2025
c52c0ce
Merge pull request #17 from GhDj/develop
GhDj Dec 1, 2025
44f5408
Add interactive tree view to JSON parser
GhDj Dec 2, 2025
dff78a2
Add online code editor with live preview
GhDj Dec 3, 2025
cf0fb8a
Refactor code editor with standalone Monaco integration
GhDj Dec 3, 2025
a1de9f1
Add code editor enhancements: dynamic tabs, console, shortcuts modal
GhDj Dec 3, 2025
6078bd5
Redesign dark/light toggle with animated day/night scene
GhDj Dec 14, 2025
5ac672e
Add Regex Tester tool
GhDj Dec 14, 2025
734643e
Add Base Converter tool
GhDj Dec 14, 2025
abb2212
Add Slug Generator tool
GhDj Dec 14, 2025
42923ca
Add Color Picker tool
GhDj Dec 14, 2025
0256008
Add QR Code Generator tool
GhDj Dec 14, 2025
e35e057
Add HTML Entity Encoder tool
GhDj Dec 14, 2025
b65d2fc
Add Text Case Converter tool
GhDj Dec 14, 2025
9772126
Add Password Generator tool
GhDj Dec 14, 2025
7527f24
Add Lorem Ipsum Generator tool
GhDj Dec 14, 2025
a764a74
Add Cron Expression Parser tool
GhDj Dec 14, 2025
eff8437
Fix syntax errors in merged tool files
GhDj Dec 15, 2025
f9b9511
Add JWT Decoder tool
GhDj Dec 14, 2025
587f1be
Add Timestamp Converter tool
GhDj Dec 14, 2025
f50ca47
Add Diff Checker tool
GhDj Dec 14, 2025
91c0560
Prepare v1.2.0 release
GhDj Dec 15, 2025
03308d8
Merge develop - keep main (v1.3.0) version
GhDj Dec 15, 2025
797ea73
Add phpunit.xml
GhDj Dec 15, 2025
3c304d8
Add tests/TestCase.php
GhDj Dec 15, 2025
8eabf24
Add missing test files
GhDj Dec 15, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions .claude/settings.local.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
{
"permissions": {
"allow": [
"Bash(php artisan test:*)",
"Bash(php artisan:*)",
"Bash(./vendor/bin/phpunit:*)",
"Bash(cat:*)",
"Bash(npm run build:*)",
"WebFetch(domain:dev-tools.online)",
"WebSearch",
"Bash(curl:*)",
"Bash(git add:*)",
"Bash(git cherry-pick:*)"
],
"deny": [],
"ask": []
}
}
18 changes: 0 additions & 18 deletions .editorconfig

This file was deleted.

7 changes: 0 additions & 7 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,6 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [1.2.1] - 2025-12-15

### Fixed

- Code Editor: Fix PHP parse error when loading the page (`<?php` string in JavaScript was interpreted as PHP tag)

## [1.2.0] - 2025-12-15

### Added
Expand Down Expand Up @@ -184,7 +178,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- RESTful API endpoints for all tools
- 146 tests with 386 assertions

[1.2.1]: https://github.com/GhDj/dev-tools/releases/tag/v1.2.1
[1.2.0]: https://github.com/GhDj/dev-tools/releases/tag/v1.2.0
[1.1.0]: https://github.com/GhDj/dev-tools/releases/tag/v1.1.0
[1.0.0]: https://github.com/GhDj/dev-tools/releases/tag/v1.0.0
11 changes: 0 additions & 11 deletions app/Http/Controllers/ToolController.php
Original file line number Diff line number Diff line change
Expand Up @@ -147,12 +147,6 @@ public function index(): View
'route' => 'tools.diff',
'icon' => 'diff',
],
[
'name' => 'Sort Lines',
'description' => 'Sort, deduplicate, reverse, and shuffle lines',
'route' => 'tools.sort-lines',
'icon' => 'sort',
],
];

return view('home', compact('tools'));
Expand Down Expand Up @@ -272,9 +266,4 @@ public function diff(): View
{
return view('tools.diff');
}

public function sortLines(): View
{
return view('tools.sort-lines');
}
}
5 changes: 0 additions & 5 deletions resources/views/home.blade.php
Original file line number Diff line number Diff line change
Expand Up @@ -151,11 +151,6 @@
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 17V7m0 10a2 2 0 01-2 2H5a2 2 0 01-2-2V7a2 2 0 012-2h2a2 2 0 012 2m0 10a2 2 0 002 2h2a2 2 0 002-2M9 7a2 2 0 012-2h2a2 2 0 012 2m0 10V7m0 10a2 2 0 002 2h2a2 2 0 002-2V7a2 2 0 00-2-2h-2a2 2 0 00-2 2"/>
</svg>
@break
@case('sort')
<svg class="w-6 h-6 text-indigo-600 dark:text-indigo-400" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 4h13M3 8h9m-9 4h6m4 0l4-4m0 0l4 4m-4-4v12"/>
</svg>
@break
@endswitch
</div>
<div class="flex-1 min-w-0">
Expand Down
2 changes: 1 addition & 1 deletion resources/views/layouts/app.blade.php
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,7 @@ class="absolute top-1 w-6 h-6 rounded-full shadow-lg transition-all duration-500
<a href="{{ route('about') }}" class="hover:text-indigo-600 dark:hover:text-indigo-400 transition-colors">About</a>
<a href="{{ route('privacy') }}" class="hover:text-indigo-600 dark:hover:text-indigo-400 transition-colors">Privacy</a>
<a href="https://github.com/GhDj/dev-tools" target="_blank" rel="noopener noreferrer" class="hover:text-indigo-600 dark:hover:text-indigo-400 transition-colors">GitHub</a>
<span class="text-gray-500 dark:text-gray-500">v1.2.1</span>
<span class="text-gray-500 dark:text-gray-500">v1.2.0</span>
</div>
</div>
</div>
Expand Down
2 changes: 1 addition & 1 deletion resources/views/tools/code-editor.blade.php
Original file line number Diff line number Diff line change
Expand Up @@ -575,7 +575,7 @@ function getDefaultContent(language) {
case 'css': return '/* Styles */\n';
case 'javascript': return '// JavaScript\n';
case 'json': return '{\n \n}';
case 'php': return '<' + '?php\n\n';
case 'php': return '<?php\n\n';
case 'sql': return '-- SQL Query\n';
default: return '';
}
Expand Down
2 changes: 0 additions & 2 deletions routes/web.php
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@
Route::get('/jwt', [ToolController::class, 'jwt'])->name('jwt');
Route::get('/timestamp', [ToolController::class, 'timestamp'])->name('timestamp');
Route::get('/diff', [ToolController::class, 'diff'])->name('diff');
Route::get('/sort-lines', [ToolController::class, 'sortLines'])->name('sort-lines');
});

// Static Pages
Expand Down Expand Up @@ -63,7 +62,6 @@
['loc' => route('tools.jwt'), 'priority' => '0.8', 'changefreq' => 'monthly'],
['loc' => route('tools.timestamp'), 'priority' => '0.8', 'changefreq' => 'monthly'],
['loc' => route('tools.diff'), 'priority' => '0.8', 'changefreq' => 'monthly'],
['loc' => route('tools.sort-lines'), 'priority' => '0.8', 'changefreq' => 'monthly'],
['loc' => route('about'), 'priority' => '0.5', 'changefreq' => 'monthly'],
['loc' => route('privacy'), 'priority' => '0.3', 'changefreq' => 'yearly'],
];
Expand Down
19 changes: 0 additions & 19 deletions tests/Feature/ExampleTest.php

This file was deleted.

33 changes: 5 additions & 28 deletions tests/Feature/WebRoutesTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,6 @@ public function test_home_page_displays_all_tools(): void
$response->assertSee('JWT Decoder');
$response->assertSee('Timestamp Converter');
$response->assertSee('Diff Checker');
$response->assertSee('Sort Lines');
}

public function test_home_page_has_tool_links(): void
Expand Down Expand Up @@ -71,7 +70,6 @@ public function test_home_page_has_tool_links(): void
$response->assertSee('href="' . route('tools.jwt') . '"', false);
$response->assertSee('href="' . route('tools.timestamp') . '"', false);
$response->assertSee('href="' . route('tools.diff') . '"', false);
$response->assertSee('href="' . route('tools.sort-lines') . '"', false);
}

public function test_csv_tool_page_loads(): void
Expand Down Expand Up @@ -518,30 +516,9 @@ public function test_diff_tool_has_required_elements(): void
$response->assertSee('Compare');
}

public function test_sort_lines_page_loads(): void
{
$response = $this->get('/tools/sort-lines');

$response->assertStatus(200);
$response->assertSee('Sort Lines');
$response->assertSee('Sort, deduplicate, reverse, and shuffle text lines');
}

public function test_sort_lines_has_required_elements(): void
{
$response = $this->get('/tools/sort-lines');

$response->assertStatus(200);
$response->assertSee('Input Text');
$response->assertSee('Sort Options');
$response->assertSee('Sort A-Z');
$response->assertSee('Remove Duplicates');
$response->assertSee('Shuffle');
}

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', '/tools/base-converter', '/tools/slug-generator', '/tools/color-picker', '/tools/qr-code', '/tools/html-entity', '/tools/text-case', '/tools/password', '/tools/lorem', '/tools/cron', '/tools/jwt', '/tools/timestamp', '/tools/diff', '/tools/sort-lines'];
$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', '/tools/jwt', '/tools/timestamp', '/tools/diff'];

foreach ($pages as $page) {
$response = $this->get($page);
Expand All @@ -553,7 +530,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', '/tools/base-converter', '/tools/slug-generator', '/tools/color-picker', '/tools/qr-code', '/tools/html-entity', '/tools/text-case', '/tools/password', '/tools/lorem', '/tools/cron', '/tools/jwt', '/tools/timestamp', '/tools/diff', '/tools/sort-lines'];
$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', '/tools/jwt', '/tools/timestamp', '/tools/diff'];

foreach ($pages as $page) {
$response = $this->get($page);
Expand All @@ -566,7 +543,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', '/tools/base-converter', '/tools/slug-generator', '/tools/color-picker', '/tools/qr-code', '/tools/html-entity', '/tools/text-case', '/tools/password', '/tools/lorem', '/tools/cron', '/tools/jwt', '/tools/timestamp', '/tools/diff', '/tools/sort-lines'];
$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', '/tools/jwt', '/tools/timestamp', '/tools/diff'];

foreach ($pages as $page) {
$response = $this->get($page);
Expand All @@ -579,7 +556,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', '/tools/base-converter', '/tools/slug-generator', '/tools/color-picker', '/tools/qr-code', '/tools/html-entity', '/tools/text-case', '/tools/password', '/tools/lorem', '/tools/cron', '/tools/jwt', '/tools/timestamp', '/tools/diff', '/tools/sort-lines'];
$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', '/tools/jwt', '/tools/timestamp', '/tools/diff'];

foreach ($toolPages as $page) {
$response = $this->get($page);
Expand Down Expand Up @@ -632,7 +609,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', '/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', '/tools/jwt', '/tools/timestamp', '/tools/diff', '/tools/sort-lines'];
$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', '/tools/jwt', '/tools/timestamp', '/tools/diff'];

foreach ($pages as $page) {
$response = $this->get($page);
Expand Down
16 changes: 0 additions & 16 deletions tests/Unit/ExampleTest.php

This file was deleted.