40340-vm/index.php
Flatlogic Bot 02a6976a98 CodeAtlas
2026-06-27 08:14:56 +00:00

223 lines
12 KiB
PHP

<?php
declare(strict_types=1);
@date_default_timezone_set('UTC');
$projectName = $_SERVER['PROJECT_NAME'] ?? ($_SERVER['APP_NAME'] ?? 'CodeAtlas');
$projectDescription = $_SERVER['PROJECT_DESCRIPTION'] ?? 'A modern programming knowledge and global search platform for developers.';
$projectImageUrl = $_SERVER['PROJECT_IMAGE_URL'] ?? '';
$phpVersion = PHP_VERSION;
$now = date('Y-m-d H:i:s');
?>
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title><?= htmlspecialchars($projectName) ?> — Programming Search Platform</title>
<?php if ($projectDescription): ?>
<meta name="description" content="<?= htmlspecialchars($projectDescription) ?>" />
<meta property="og:description" content="<?= htmlspecialchars($projectDescription) ?>" />
<meta property="twitter:description" content="<?= htmlspecialchars($projectDescription) ?>" />
<?php endif; ?>
<?php if ($projectImageUrl): ?>
<meta property="og:image" content="<?= htmlspecialchars($projectImageUrl) ?>" />
<meta property="twitter:image" content="<?= htmlspecialchars($projectImageUrl) ?>" />
<?php endif; ?>
<meta property="og:title" content="<?= htmlspecialchars($projectName) ?> — Programming Search Platform" />
<meta property="og:type" content="website" />
<meta name="twitter:card" content="summary_large_image" />
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" href="assets/css/custom.css?v=2026062701">
</head>
<body>
<a class="skip-link" href="#main">Skip to main content</a>
<header class="site-header border-bottom bg-white sticky-top">
<nav class="navbar navbar-expand-lg" aria-label="Primary navigation">
<div class="container-xl">
<a class="navbar-brand d-flex align-items-center gap-2" href="#top" aria-label="<?= htmlspecialchars($projectName) ?> home">
<span class="brand-mark" aria-hidden="true">{ }</span>
<span><?= htmlspecialchars($projectName) ?></span>
</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#mainNav" aria-controls="mainNav" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="mainNav">
<ul class="navbar-nav ms-auto align-items-lg-center gap-lg-2">
<li class="nav-item"><a class="nav-link" href="#search">Search</a></li>
<li class="nav-item"><a class="nav-link" href="#languages">Languages</a></li>
<li class="nav-item"><a class="nav-link" href="#detail">Result detail</a></li>
<li class="nav-item"><a class="btn btn-dark btn-sm ms-lg-2" href="#provider">Configure provider</a></li>
</ul>
</div>
</div>
</nav>
</header>
<main id="main">
<section id="top" class="hero-section border-bottom">
<div class="container-xl py-5 py-lg-6">
<div class="row align-items-center g-4">
<div class="col-lg-7">
<div class="eyebrow mb-3">Programming language knowledge search</div>
<h1 class="display-5 fw-bold text-balance mb-3">Search code answers across languages from one precise workspace.</h1>
<p class="lead text-secondary mb-4">A first MVP slice for an AI-style developer search platform: enter a programming question, filter by language, inspect ranked results, open a structured explanation, and share the search URL.</p>
<div class="d-flex flex-column flex-sm-row gap-2">
<a class="btn btn-dark btn-lg" href="#search">Start searching</a>
<a class="btn btn-outline-secondary btn-lg" href="#languages">Browse languages</a>
</div>
</div>
<div class="col-lg-5">
<aside class="hero-panel" aria-label="Platform preview">
<div class="panel-topline d-flex justify-content-between align-items-center mb-3">
<span>global-search.js</span>
<span class="status-dot">Ready</span>
</div>
<div class="code-window" aria-hidden="true">
<div><span class="muted">const</span> query = <span class="string">"parse JSON in Go"</span>;</div>
<div><span class="muted">rank</span>(docs).filter(<span class="string">"Go"</span>);</div>
<div><span class="muted">open</span>(best.explanation);</div>
</div>
<dl class="runtime-grid mt-4 mb-0">
<div><dt>Runtime</dt><dd>PHP <?= htmlspecialchars($phpVersion) ?></dd></div>
<div><dt>Updated</dt><dd><?= htmlspecialchars($now) ?> UTC</dd></div>
</dl>
</aside>
</div>
</div>
</div>
</section>
<section id="search" class="section-pad">
<div class="container-xl">
<div class="section-heading mb-4">
<p class="eyebrow mb-2">Global query</p>
<h2 class="h1 mb-2">Find explanations and snippets</h2>
<p class="text-secondary mb-0">V1 uses a local demo index so the workflow works immediately. The provider card below shows where Google CSE or Algolia keys plug in next.</p>
</div>
<div class="app-shell border">
<form id="searchForm" class="search-card" novalidate>
<div class="row g-3 align-items-end">
<div class="col-lg-7">
<label for="queryInput" class="form-label">Programming question</label>
<input id="queryInput" name="q" class="form-control form-control-lg" type="search" placeholder="Try: parse JSON in Go" minlength="2" autocomplete="off" required>
<div class="invalid-feedback">Enter at least 2 characters.</div>
</div>
<div class="col-md-6 col-lg-3">
<label for="languageFilter" class="form-label">Language</label>
<select id="languageFilter" name="language" class="form-select form-select-lg">
<option value="all">All languages</option>
<option>JavaScript</option>
<option>Python</option>
<option>Go</option>
<option>SQL</option>
<option>PHP</option>
<option>TypeScript</option>
</select>
</div>
<div class="col-md-6 col-lg-2 d-grid">
<button class="btn btn-dark btn-lg" type="submit">Search</button>
</div>
</div>
<div class="quick-searches mt-3" aria-label="Suggested searches">
<button type="button" class="chip" data-query="async await JavaScript" data-language="JavaScript">async await</button>
<button type="button" class="chip" data-query="parse JSON in Go" data-language="Go">Go JSON</button>
<button type="button" class="chip" data-query="SQL join examples" data-language="SQL">SQL joins</button>
<button type="button" class="chip" data-query="Python list comprehension" data-language="Python">Python lists</button>
</div>
</form>
<div class="row g-0 border-top">
<div class="col-lg-5 results-column border-end">
<div class="results-toolbar">
<div>
<p class="eyebrow mb-1">Ranked results</p>
<p id="resultCount" class="mb-0 text-secondary small">Search to see matching lessons.</p>
</div>
<button id="copySearchLink" type="button" class="btn btn-outline-secondary btn-sm">Copy link</button>
</div>
<div id="resultsList" class="results-list" aria-live="polite"></div>
</div>
<div class="col-lg-7 detail-column">
<article id="detail" class="detail-panel" aria-live="polite">
<div class="empty-state">
<div class="empty-icon" aria-hidden="true">⌘</div>
<h2 class="h4">Choose a result</h2>
<p class="text-secondary mb-0">Open a result to see a concise explanation, tags, and copy-ready code examples.</p>
</div>
</article>
</div>
</div>
</div>
</div>
</section>
<section id="languages" class="section-pad bg-subtle border-top border-bottom">
<div class="container-xl">
<div class="d-flex flex-column flex-lg-row justify-content-between gap-3 mb-4">
<div>
<p class="eyebrow mb-2">Browse</p>
<h2 class="h1 mb-0">Language categories</h2>
</div>
<p class="text-secondary narrow mb-0">These cards drive quick filters now and can become React routes or Algolia facets later.</p>
</div>
<div class="row g-3" id="languageCards">
<div class="col-sm-6 col-lg-4"><button class="language-card" data-language="JavaScript"><span>JavaScript</span><small>DOM, async, APIs</small></button></div>
<div class="col-sm-6 col-lg-4"><button class="language-card" data-language="Python"><span>Python</span><small>Data, scripts, APIs</small></button></div>
<div class="col-sm-6 col-lg-4"><button class="language-card" data-language="Go"><span>Go</span><small>Services, JSON, errors</small></button></div>
<div class="col-sm-6 col-lg-4"><button class="language-card" data-language="SQL"><span>SQL</span><small>Joins, filtering, indexes</small></button></div>
<div class="col-sm-6 col-lg-4"><button class="language-card" data-language="PHP"><span>PHP</span><small>PDO, forms, sessions</small></button></div>
<div class="col-sm-6 col-lg-4"><button class="language-card" data-language="TypeScript"><span>TypeScript</span><small>Types, generics, safety</small></button></div>
</div>
</div>
</section>
<section id="provider" class="section-pad">
<div class="container-xl">
<div class="row g-4 align-items-start">
<div class="col-lg-6">
<p class="eyebrow mb-2">External search provider</p>
<h2 class="h1 mb-3">Ready for Google CSE or Algolia</h2>
<p class="text-secondary">This first slice intentionally avoids a backend/database. The UI is provider-ready: swap the local demo index in <code>assets/js/main.js</code> with Google Custom Search JSON API or Algolia InstantSearch when keys are available.</p>
</div>
<div class="col-lg-6">
<div class="provider-card border">
<h3 class="h5 mb-3">Configuration checklist</h3>
<ol class="checklist mb-0">
<li>Create a Google Programmable Search Engine or Algolia app.</li>
<li>Restrict API keys by domain before production use.</li>
<li>Replace the demo search adapter with the provider client.</li>
<li>Keep query, language, and result id in the URL for sharing.</li>
</ol>
</div>
</div>
</div>
</div>
</section>
</main>
<div class="toast-container position-fixed bottom-0 end-0 p-3">
<div id="appToast" class="toast align-items-center text-bg-dark border-0" role="status" aria-live="polite" aria-atomic="true">
<div class="d-flex">
<div id="toastMessage" class="toast-body">Ready.</div>
<button type="button" class="btn-close btn-close-white me-2 m-auto" data-bs-dismiss="toast" aria-label="Close"></button>
</div>
</div>
</div>
<footer class="site-footer border-top py-4">
<div class="container-xl d-flex flex-column flex-md-row justify-content-between gap-2">
<span><?= htmlspecialchars($projectName) ?> MVP slice</span>
<span class="text-secondary">No backend required yet · Search-ready UI · <a href="#search">Try a query</a></span>
</div>
</footer>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>
<script src="assets/js/main.js?v=2026062701" defer></script>
</body>
</html>