@if($page['props']['noindex'] ?? false)
@endif
{{-- Name only, never the version: this tag is served to anyone
who asks, and publishing the exact release tells a scanner
which advisories apply to this installation. What it buys
is ecosystem visibility — surveys like BuiltWith count
ProjectSend installs from this and nothing else. --}}
@if(app(\App\Modules\Platform\Attribution\Attribution::class)->visible())
@endif
{{-- The same name app.tsx suffixes every page title with, from the
same place: the site name in the shared props. Taking it from
APP_NAME instead would show one name in the tab until Inertia
hydrates and a different one after, on any installation whose
administrator renamed the site. --}}
{{ $page['props']['name'] ?? config('app.name', 'ProjectSend') }}
{{-- Which cookie holds this installation's CSRF token. Named after
the installation rather than the framework, so a neighbouring
Laravel app on the same hostname cannot overwrite it — and
there is nothing on the client that could work the name out. --}}
@routes
@viteReactRefresh
@php
// A page component may be shipped by an installed package
// under vendor///resources/js/pages/ instead of
// this app's own resources/js/pages/. This must stay in step
// with the client-side glob in resources/js/app.tsx — they
// are two halves of one lookup, and when they disagreed the
// page built cleanly, type-checked cleanly, and then answered
// 500 with "Unable to locate file in Vite manifest".
$pageComponentPath = "resources/js/pages/{$page['component']}.tsx";
if (! file_exists(base_path($pageComponentPath))) {
$packageMatch = glob(base_path("vendor/*/*/resources/js/pages/{$page['component']}.tsx"))[0] ?? null;
if ($packageMatch !== null) {
$pageComponentPath = ltrim(str_replace(base_path(), '', $packageMatch), '/');
}
}
@endphp
@vite(['resources/js/app.tsx', $pageComponentPath])
@inertiaHead
{{-- Operator-authored snippets (Community only). Raw by design —
see CustomAssetsBridge, which returns '' unless the edition
grants the capability and the module is actually installed.
This is the one root view for all three surfaces (public,
portal, staff), so it is the only place they need wiring. --}}
{!! app(\App\Modules\Platform\CustomAssets\CustomAssetsBridge::class)->render('head') !!}
{!! app(\App\Modules\Platform\CustomAssets\CustomAssetsBridge::class)->render('body_top') !!}
@inertia
{!! app(\App\Modules\Platform\CustomAssets\CustomAssetsBridge::class)->render('body_bottom') !!}