diff --git a/src/php/src/Api/Documentation/DocumentationController.php b/src/php/src/Api/Documentation/DocumentationController.php index cca3d08..8c7a3ad 100644 --- a/src/php/src/Api/Documentation/DocumentationController.php +++ b/src/php/src/Api/Documentation/DocumentationController.php @@ -34,6 +34,7 @@ class DocumentationController return match ($defaultUi) { 'swagger' => $this->swagger($request), 'redoc' => $this->redoc($request), + 'stoplight' => $this->stoplight($request), default => $this->scalar($request), }; } @@ -74,6 +75,19 @@ class DocumentationController ]); } + /** + * Show Stoplight Elements. + */ + public function stoplight(Request $request): View + { + $config = config('api-docs.ui.stoplight', []); + + return view('api-docs::stoplight', [ + 'specUrl' => route('api.docs.openapi.json'), + 'config' => $config, + ]); + } + /** * Get OpenAPI specification as JSON. */ diff --git a/src/php/src/Api/Documentation/Routes/docs.php b/src/php/src/Api/Documentation/Routes/docs.php index 5ff04e2..5531a77 100644 --- a/src/php/src/Api/Documentation/Routes/docs.php +++ b/src/php/src/Api/Documentation/Routes/docs.php @@ -20,6 +20,7 @@ Route::get('/', [DocumentationController::class, 'index'])->name('api.docs'); Route::get('/swagger', [DocumentationController::class, 'swagger'])->name('api.docs.swagger'); Route::get('/scalar', [DocumentationController::class, 'scalar'])->name('api.docs.scalar'); Route::get('/redoc', [DocumentationController::class, 'redoc'])->name('api.docs.redoc'); +Route::get('/stoplight', [DocumentationController::class, 'stoplight'])->name('api.docs.stoplight'); // OpenAPI specification routes Route::get('/openapi.json', [DocumentationController::class, 'openApiJson']) diff --git a/src/php/src/Api/Documentation/Views/stoplight.blade.php b/src/php/src/Api/Documentation/Views/stoplight.blade.php new file mode 100644 index 0000000..5afade9 --- /dev/null +++ b/src/php/src/Api/Documentation/Views/stoplight.blade.php @@ -0,0 +1,34 @@ + + + + + + + {{ config('api-docs.info.title', 'API Documentation') }} - Stoplight + + + + + + + + + diff --git a/src/php/src/Api/Documentation/config.php b/src/php/src/Api/Documentation/config.php index 0c43186..378898a 100644 --- a/src/php/src/Api/Documentation/config.php +++ b/src/php/src/Api/Documentation/config.php @@ -268,6 +268,13 @@ return [ 'hide_download_button' => false, 'hide_models' => false, ], + + // Stoplight Elements specific options + 'stoplight' => [ + 'theme' => 'dark', // 'dark' or 'light' + 'layout' => 'sidebar', // 'sidebar' or 'stacked' + 'hide_try_it' => false, + ], ], /* diff --git a/src/php/src/Api/Tests/Feature/DocumentationStoplightTest.php b/src/php/src/Api/Tests/Feature/DocumentationStoplightTest.php new file mode 100644 index 0000000..ace25a8 --- /dev/null +++ b/src/php/src/Api/Tests/Feature/DocumentationStoplightTest.php @@ -0,0 +1,21 @@ + 'stoplight']); + + $response = $this->get('/api/docs'); + + $response->assertOk(); + $response->assertSee('elements-api', false); + $response->assertSee('@stoplight/elements', false); +}); + +it('renders the dedicated Stoplight documentation route', function () { + $response = $this->get('/api/docs/stoplight'); + + $response->assertOk(); + $response->assertSee('elements-api', false); + $response->assertSee('@stoplight/elements', false); +}); diff --git a/src/php/src/Website/Api/Controllers/DocsController.php b/src/php/src/Website/Api/Controllers/DocsController.php index b1140da..6715927 100644 --- a/src/php/src/Website/Api/Controllers/DocsController.php +++ b/src/php/src/Website/Api/Controllers/DocsController.php @@ -65,6 +65,11 @@ class DocsController return view('api::redoc'); } + public function stoplight(): View + { + return view('api::stoplight'); + } + public function openapi(OpenApiGenerator $generator): JsonResponse { return response()->json($generator->generate()); diff --git a/src/php/src/Website/Api/Routes/web.php b/src/php/src/Website/Api/Routes/web.php index a545b4a..95713e8 100644 --- a/src/php/src/Website/Api/Routes/web.php +++ b/src/php/src/Website/Api/Routes/web.php @@ -28,6 +28,9 @@ Route::get('/scalar', [DocsController::class, 'scalar'])->name('api.scalar'); // ReDoc (three-panel API reference) Route::get('/redoc', [DocsController::class, 'redoc'])->name('api.redoc'); +// Stoplight Elements API reference +Route::get('/stoplight', [DocsController::class, 'stoplight'])->name('api.stoplight'); + // OpenAPI spec (rate limited - expensive to generate) Route::get('/openapi.json', [DocsController::class, 'openapi']) ->middleware('throttle:60,1') diff --git a/src/php/src/Website/Api/View/Blade/layouts/docs.blade.php b/src/php/src/Website/Api/View/Blade/layouts/docs.blade.php index 5500522..7fa53ab 100644 --- a/src/php/src/Website/Api/View/Blade/layouts/docs.blade.php +++ b/src/php/src/Website/Api/View/Blade/layouts/docs.blade.php @@ -81,7 +81,7 @@
diff --git a/src/php/src/Website/Api/View/Blade/stoplight.blade.php b/src/php/src/Website/Api/View/Blade/stoplight.blade.php new file mode 100644 index 0000000..ed4b32c --- /dev/null +++ b/src/php/src/Website/Api/View/Blade/stoplight.blade.php @@ -0,0 +1,23 @@ +@extends('layouts::docs') + +@section('title', 'Stoplight') +@section('description', 'Stoplight Elements API reference for the Core API.') + +@section('content') +
+ +
+@endsection + +@push('head') + +@endpush + +@push('scripts') + +@endpush