From 34c52a5fc298cd621c5350e6d359b8b2cd84ab5a Mon Sep 17 00:00:00 2001 From: bernardhanna Date: Fri, 1 May 2026 09:37:06 +0100 Subject: [PATCH 1/3] Hide embedded PDF chrome where supported and improve iframe sizing. Made-with: Cursor --- .../partials/roadmap-pdf-embed.blade.php | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/resources/views/training/partials/roadmap-pdf-embed.blade.php b/resources/views/training/partials/roadmap-pdf-embed.blade.php index 219dd8d95..01813bd6c 100644 --- a/resources/views/training/partials/roadmap-pdf-embed.blade.php +++ b/resources/views/training/partials/roadmap-pdf-embed.blade.php @@ -1,17 +1,25 @@ @props([ 'url', ]) +@php + // Strip any fragment from stored URL for the "open in new tab" link. + $tabUrl = \Illuminate\Support\Str::before($url, '#'); + // Adobe-style PDF open parameters: hide toolbar/side panes in many Chromium viewers. + // Safari / iOS often ignore these; users can use "Open in new tab" for the native viewer. + $embedSrc = $tabUrl.'#toolbar=0&navpanes=0&scrollbar=1&view=FitH'; +@endphp

- + {{ __('Open roadmap PDF in a new tab') }} — {{ __('if the preview does not load in your browser.') }} From fb78f2c446fd51baa6499eb51ef1a3086f12fd3a Mon Sep 17 00:00:00 2001 From: bernardhanna Date: Fri, 1 May 2026 09:43:44 +0100 Subject: [PATCH 2/3] feat(training): PDF.js roadmap viewer and responsive inline SVGs - Add same-origin PDF proxy and minimal PDF.js viewer for DDP roadmap embed - Fall back to direct PDF iframe for other roadmap URLs - Scale oversized inline SVGs (infer viewBox from width/height) and constrain with CSS - Allow long links in rich content to wrap (break-words) Made-with: Cursor --- .../TrainingRoadmapPdfController.php | 51 +++++++++++++++ .../partials/roadmap-pdf-embed.blade.php | 9 ++- .../views/training/roadmap-pdfjs.blade.php | 65 +++++++++++++++++++ resources/views/training/show.blade.php | 27 +++++++- routes/web.php | 5 ++ 5 files changed, 153 insertions(+), 4 deletions(-) create mode 100644 app/Http/Controllers/TrainingRoadmapPdfController.php create mode 100644 resources/views/training/roadmap-pdfjs.blade.php diff --git a/app/Http/Controllers/TrainingRoadmapPdfController.php b/app/Http/Controllers/TrainingRoadmapPdfController.php new file mode 100644 index 000000000..72899ccd0 --- /dev/null +++ b/app/Http/Controllers/TrainingRoadmapPdfController.php @@ -0,0 +1,51 @@ +get(self::ROADMAP_SOURCE); + + if (! $response->successful()) { + abort(502, 'Unable to load roadmap PDF.'); + } + + return $response->body(); + } + ); + + return response($bytes, 200, [ + 'Content-Type' => 'application/pdf', + 'Content-Disposition' => 'inline; filename="DDP_toolkit_roadmap.pdf"', + 'Cache-Control' => 'public, max-age=3600', + ]); + } + + /** + * Minimal PDF.js viewer (no site chrome) for iframe embedding on training pages. + */ + public function viewer() + { + return response() + ->view('training.roadmap-pdfjs') + ->header('X-Frame-Options', 'SAMEORIGIN'); + } +} diff --git a/resources/views/training/partials/roadmap-pdf-embed.blade.php b/resources/views/training/partials/roadmap-pdf-embed.blade.php index 01813bd6c..c037de629 100644 --- a/resources/views/training/partials/roadmap-pdf-embed.blade.php +++ b/resources/views/training/partials/roadmap-pdf-embed.blade.php @@ -4,9 +4,12 @@ @php // Strip any fragment from stored URL for the "open in new tab" link. $tabUrl = \Illuminate\Support\Str::before($url, '#'); - // Adobe-style PDF open parameters: hide toolbar/side panes in many Chromium viewers. - // Safari / iOS often ignore these; users can use "Open in new tab" for the native viewer. - $embedSrc = $tabUrl.'#toolbar=0&navpanes=0&scrollbar=1&view=FitH'; + // Same-origin PDF.js viewer for the allowlisted DDP roadmap (see TrainingRoadmapPdfController). + // Other URLs keep the direct PDF iframe with viewer chrome hints. + $ddpRoadmapBase = 'https://codeweek-resources.s3.eu-west-1.amazonaws.com/+discover-digital-toolkit/DDP_toolkit_roadmap.pdf'; + $usePdfjsViewer = strtolower(rtrim($tabUrl, '/')) === strtolower(rtrim($ddpRoadmapBase, '/')); + $fragment = '#toolbar=0&navpanes=0&scrollbar=1&view=FitH'; + $embedSrc = $usePdfjsViewer ? route('training.roadmap_pdf_viewer') : $tabUrl.$fragment; @endphp