82 lines
3.9 KiB
PHP
82 lines
3.9 KiB
PHP
<!DOCTYPE html>
|
|
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
|
|
@php
|
|
$seoTitle = $title ?? config('app.name');
|
|
$seoDescription = $description ?? 'A blog powered by ' . config('app.name') . '.';
|
|
$seoCanonical = $canonical ?? url()->current();
|
|
$seoImage = $image ?? asset('images/og-default.png');
|
|
$seoType = $type ?? 'website';
|
|
@endphp
|
|
|
|
<title>{{ $seoTitle }}</title>
|
|
<meta name="description" content="{{ $seoDescription }}">
|
|
<link rel="canonical" href="{{ $seoCanonical }}">
|
|
|
|
{{-- Open Graph --}}
|
|
<meta property="og:site_name" content="{{ config('app.name') }}">
|
|
<meta property="og:type" content="{{ $seoType }}">
|
|
<meta property="og:title" content="{{ $seoTitle }}">
|
|
<meta property="og:description" content="{{ $seoDescription }}">
|
|
<meta property="og:url" content="{{ $seoCanonical }}">
|
|
@if ($seoImage)
|
|
<meta property="og:image" content="{{ $seoImage }}">
|
|
@endif
|
|
|
|
{{-- Twitter --}}
|
|
<meta name="twitter:card" content="{{ $seoImage ? 'summary_large_image' : 'summary' }}">
|
|
<meta name="twitter:title" content="{{ $seoTitle }}">
|
|
<meta name="twitter:description" content="{{ $seoDescription }}">
|
|
@if ($seoImage)
|
|
<meta name="twitter:image" content="{{ $seoImage }}">
|
|
@endif
|
|
|
|
<link rel="alternate" type="application/rss+xml" title="{{ config('app.name') }} Feed" href="{{ route('blog.feed') }}">
|
|
<link rel="icon" type="image/svg+xml" href="{{ asset('favicon.svg') }}">
|
|
|
|
@stack('jsonld')
|
|
|
|
@fonts
|
|
|
|
@vite(['resources/css/app.css', 'resources/js/app.js'])
|
|
</head>
|
|
<body class="min-h-screen bg-white text-neutral-900 antialiased">
|
|
<header class="border-b border-neutral-200">
|
|
<div class="mx-auto flex max-w-3xl items-center justify-between px-6 py-6">
|
|
<a href="{{ route('blog.index') }}" class="flex shrink-0 items-center gap-2 text-lg font-semibold tracking-tight">
|
|
<x-logo class="h-8 w-8 shrink-0 text-neutral-900" />
|
|
<span class="whitespace-nowrap">{{ config('app.name') }}</span>
|
|
</a>
|
|
<nav class="flex shrink-0 gap-6 text-sm text-neutral-600">
|
|
<a href="{{ route('blog.index') }}" class="hover:text-neutral-900 hover:underline underline-offset-4">Blog</a>
|
|
<a href="{{ route('tools.index') }}" class="hover:text-neutral-900 hover:underline underline-offset-4">Tools</a>
|
|
<a href="{{ route('mcp-servers.index') }}" class="hover:text-neutral-900 hover:underline underline-offset-4">MCP Servers</a>
|
|
<a href="{{ route('skills.index') }}" class="hover:text-neutral-900 hover:underline underline-offset-4">Skills</a>
|
|
</nav>
|
|
</div>
|
|
</header>
|
|
|
|
<main class="mx-auto max-w-3xl px-6 py-10">
|
|
{{ $slot }}
|
|
</main>
|
|
|
|
<footer class="mt-16 border-t border-neutral-200">
|
|
<div class="mx-auto flex max-w-3xl flex-col gap-4 px-6 py-8 text-sm text-neutral-500 sm:flex-row sm:items-center sm:justify-between">
|
|
<p>© {{ now()->year }} {{ config('app.name') }}</p>
|
|
|
|
<nav class="flex flex-wrap gap-x-6 gap-y-2">
|
|
@foreach ($footerPages ?? [] as $footerPage)
|
|
<a href="{{ route('pages.show', $footerPage) }}" class="hover:text-neutral-900 hover:underline underline-offset-4">
|
|
{{ $footerPage->title }}
|
|
</a>
|
|
@endforeach
|
|
<a href="{{ route('api.docs') }}" class="hover:text-neutral-900 hover:underline underline-offset-4">API</a>
|
|
</nav>
|
|
</div>
|
|
</footer>
|
|
</body>
|
|
</html>
|