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