Toolvana: production-ready media tools platform (CodeIgniter 4)
- 134-tool registry with programmatic SEO (unique titles/H1/descriptions, JSON-LD graphs, sitemap index, canonical 301 enforcement via required filter) - DB-backed job queue (SKIP LOCKED) with drivers: Ffmpeg, Images (GD), Pdf (qpdf/gs/poppler), Youtube (thumbnails), Qr (server-side PNG) - Security: SSRF guard, MIME validation, rate limits, API-key auth, bcrypt admin login, security headers - Admin panel: dashboard, tools/categories/guides CRUD, SEO audit, analytics, job inspector with retry, system health, feature flags - Docker deployment (nginx + web/api FPM pools + scalable workers), PHPUnit suite (19 tests / 1139 assertions), PWA manifest + service worker
This commit is contained in:
@@ -0,0 +1,87 @@
|
||||
<!doctype html>
|
||||
<html lang="<?= esc(service('request')->getLocale()) ?>">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title><?= $seo->renderTitle() ?></title>
|
||||
<meta name="description" content="">
|
||||
<?= $seo->renderHead() ?>
|
||||
<link rel="stylesheet" href="/assets/css/app.css">
|
||||
<link rel="icon" href="/favicon.svg" type="image/svg+xml">
|
||||
<link rel="manifest" href="/manifest.webmanifest">
|
||||
<link rel="search" type="application/opensearchdescription+xml" href="/opensearch.xml" title="<?= esc(config('Site')->name) ?>">
|
||||
<script type="application/ld+json"><?= $seo->renderJsonLd() ?></script>
|
||||
</head>
|
||||
<body>
|
||||
<a class="skip-link" href="#main">Skip to content</a>
|
||||
|
||||
<header class="site-header">
|
||||
<div class="inner">
|
||||
<a class="logo" href="/">
|
||||
<span class="logo-mark" aria-hidden="true"><?= icon('layers') ?></span>
|
||||
<span><?= esc(config('Site')->name) ?></span>
|
||||
</a>
|
||||
<button class="nav-toggle" id="nav-toggle" aria-expanded="false" aria-controls="main-nav" aria-label="Open menu"><?= icon('menu') ?></button>
|
||||
<nav class="main-nav" id="main-nav" aria-label="Main navigation">
|
||||
<?php foreach (service('finder')->categories() as $c): ?>
|
||||
<a href="/<?= esc($c['slug']) ?>"><?= esc($c['name']) ?></a>
|
||||
<?php endforeach ?>
|
||||
<a href="/blog">Guides</a>
|
||||
<a href="/tools">All Tools</a>
|
||||
</nav>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<main id="main">
|
||||
<?= $viewContent ?? '' ?>
|
||||
</main>
|
||||
|
||||
<footer class="site-footer">
|
||||
<div class="wrap footer-cols">
|
||||
<div>
|
||||
<a class="logo" href="/" style="margin-bottom:.6rem">
|
||||
<span class="logo-mark" aria-hidden="true"><?= icon('layers') ?></span>
|
||||
<span><?= esc(config('Site')->name) ?></span>
|
||||
</a>
|
||||
<p style="color:var(--ink-500);max-width:34ch;margin-top:.6rem"><?= esc(config('Site')->tagline) ?> <?= esc(config('Site')->description) ?></p>
|
||||
</div>
|
||||
<div>
|
||||
<h4>Categories</h4>
|
||||
<ul>
|
||||
<?php foreach (service('finder')->categories() as $c): ?>
|
||||
<li><a href="/<?= esc($c['slug']) ?>"><?= esc($c['name']) ?></a></li>
|
||||
<?php endforeach ?>
|
||||
</ul>
|
||||
</div>
|
||||
<div>
|
||||
<h4>Popular</h4>
|
||||
<ul>
|
||||
<li><a href="/youtube-to-mp3">YouTube to MP3</a></li>
|
||||
<li><a href="/video-compressor">Video Compressor</a></li>
|
||||
<li><a href="/jpg-to-png">JPG to PNG</a></li>
|
||||
<li><a href="/pdf-merger">PDF Merger</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div>
|
||||
<h4>About</h4>
|
||||
<ul>
|
||||
<li><a href="/blog">Guides</a></li>
|
||||
<li><a href="/privacy">Privacy Policy</a></li>
|
||||
<li><a href="/terms">Terms of Service</a></li>
|
||||
<li><a href="/dmca">DMCA / Copyright</a></li>
|
||||
<li><a href="/contact">Contact</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="wrap footer-bottom">
|
||||
<span>© <?= date('Y') ?> <?= esc(config('Site')->name) ?>. All rights reserved.</span>
|
||||
<span>Files are processed temporarily and deleted automatically.</span>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
<script src="/assets/js/app.js" defer></script>
|
||||
<?php if (! empty($pageScript)): ?>
|
||||
<script src="/assets/js/<?= esc($pageScript) ?>.js" defer></script>
|
||||
<?php endif ?>
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user