mirror of
git://f0xx.org/ac/ac-be-hub
synced 2026-07-29 04:59:44 +03:00
feat(hub): add Downloads and Documentation landing pages
Wire hub-downloads.js for stable OTA APK resolution, expand nav i18n, and add Session Studio download slot for alpha hub FR. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
67
assets/hub-downloads.js
Normal file
67
assets/hub-downloads.js
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
(function () {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
function setStatus(msg) {
|
||||||
|
var el = document.getElementById('hub-download-apk-status');
|
||||||
|
if (el) {
|
||||||
|
el.textContent = msg;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function resolveStableApkUrl() {
|
||||||
|
return fetch('/v0/ota/channel/stable.json', { cache: 'no-store' })
|
||||||
|
.then(function (r) {
|
||||||
|
if (!r.ok) {
|
||||||
|
throw new Error('stable channel HTTP ' + r.status);
|
||||||
|
}
|
||||||
|
return r.json();
|
||||||
|
})
|
||||||
|
.then(function (channel) {
|
||||||
|
var manifestUrl = channel && channel.manifestUrl;
|
||||||
|
if (!manifestUrl) {
|
||||||
|
throw new Error('stable.json missing manifestUrl');
|
||||||
|
}
|
||||||
|
return fetch(manifestUrl, { cache: 'no-store' }).then(function (r) {
|
||||||
|
if (!r.ok) {
|
||||||
|
throw new Error('manifest HTTP ' + r.status);
|
||||||
|
}
|
||||||
|
return r.json();
|
||||||
|
});
|
||||||
|
})
|
||||||
|
.then(function (manifest) {
|
||||||
|
var url = manifest && (manifest.apkUrl || manifest.bundleUrl);
|
||||||
|
if (!url) {
|
||||||
|
throw new Error('manifest missing apkUrl');
|
||||||
|
}
|
||||||
|
return url;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function wireApkButton() {
|
||||||
|
var btn = document.getElementById('hub-download-apk');
|
||||||
|
if (!btn) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
btn.addEventListener('click', function () {
|
||||||
|
btn.disabled = true;
|
||||||
|
setStatus('Resolving stable OTA channel…');
|
||||||
|
resolveStableApkUrl()
|
||||||
|
.then(function (url) {
|
||||||
|
setStatus('Downloading…');
|
||||||
|
window.location.href = url;
|
||||||
|
})
|
||||||
|
.catch(function (err) {
|
||||||
|
setStatus('APK unavailable — run builder OTA publish (stable). ' + (err.message || err));
|
||||||
|
})
|
||||||
|
.finally(function () {
|
||||||
|
btn.disabled = false;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (document.readyState === 'loading') {
|
||||||
|
document.addEventListener('DOMContentLoaded', wireApkButton);
|
||||||
|
} else {
|
||||||
|
wireApkButton();
|
||||||
|
}
|
||||||
|
})();
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
(function () {
|
(function () {
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
var PAGE_COUNT = 10;
|
var PAGE_COUNT = 13;
|
||||||
var scrollEl = null;
|
var scrollEl = null;
|
||||||
var railEl = null;
|
var railEl = null;
|
||||||
var currentPage = 1;
|
var currentPage = 1;
|
||||||
|
|||||||
@@ -3,10 +3,14 @@
|
|||||||
"nav.about": "About",
|
"nav.about": "About",
|
||||||
"nav.why": "Why",
|
"nav.why": "Why",
|
||||||
"nav.tech": "Technologies",
|
"nav.tech": "Technologies",
|
||||||
|
"nav.documentation": "Documentation",
|
||||||
"nav.resources": "Resources",
|
"nav.resources": "Resources",
|
||||||
"nav.people": "People",
|
"nav.people": "People",
|
||||||
"nav.culture": "Culture",
|
"nav.culture": "Culture",
|
||||||
"nav.pricing": "Pricing",
|
"nav.pricing": "Pricing",
|
||||||
|
"nav.downloads": "Downloads",
|
||||||
|
"nav.downloads_common": "Common",
|
||||||
|
"nav.downloads_others": "Others",
|
||||||
"nav.contact": "Contact us",
|
"nav.contact": "Contact us",
|
||||||
"nav.console": "Console",
|
"nav.console": "Console",
|
||||||
"nav.git": "Git",
|
"nav.git": "Git",
|
||||||
@@ -50,15 +54,34 @@
|
|||||||
"page4.lead": "Built for teams who need reliability, observability, and control — not another black box.",
|
"page4.lead": "Built for teams who need reliability, observability, and control — not another black box.",
|
||||||
"page5.title": "Technologies",
|
"page5.title": "Technologies",
|
||||||
"page5.lead": "WebRTC, Opus/Speex, WireGuard remote access, PHP consoles, and Docker CI pipelines.",
|
"page5.lead": "WebRTC, Opus/Speex, WireGuard remote access, PHP consoles, and Docker CI pipelines.",
|
||||||
"page6.title": "Resources",
|
"page6.title": "Documentation",
|
||||||
"page6.lead": "Documentation, deployment guides, and integration patterns for your environment.",
|
"page6.lead": "Project wiki, design reviews, specs, and operator guides.",
|
||||||
"page7.title": "People",
|
"page6.btn_wiki": "Project documentation",
|
||||||
"page7.lead": "Engineers and operators shipping cast, crash, and build workflows every day.",
|
"page6.btn_docs": "Other documents",
|
||||||
"page8.title": "Culture",
|
"page6.hint": "Wiki opens in Gitea; other documents lists ac-docs drafts, DRs, and specs.",
|
||||||
"page8.lead": "Open tooling, green master branches, and honest postmortems.",
|
"page7.title": "Downloads",
|
||||||
"page9.title": "Pricing",
|
"page7.lead": "Latest stable builds from the orchestration pipeline (next integration).",
|
||||||
"page9.lead": "Self-hosted core; enterprise options for SLA, SSO, and dedicated builders.",
|
"page7.btn_apk": "Android APK",
|
||||||
"page10.title": "Contact us",
|
"page7.btn_studio": "Session Studio",
|
||||||
"page10.lead": "Reach the maintainer for partnerships, support, or deployment help.",
|
"page7.hint": "APK matches the stable OTA channel signature and version.",
|
||||||
|
"page8.title": "Resources",
|
||||||
|
"page8.lead": "Source control, consoles, and integration entry points.",
|
||||||
|
"page8.btn_git": "Git Access",
|
||||||
|
"page8.hint": "Same Gitea browser as the left shell Git link.",
|
||||||
|
"page9.title": "People",
|
||||||
|
"page9.lead": "Engineers and operators shipping cast, crash, and build workflows every day.",
|
||||||
|
"page10.title": "Culture",
|
||||||
|
"page10.lead": "Open tooling, green master branches, and honest postmortems.",
|
||||||
|
"page11.title": "Pricing",
|
||||||
|
"page11.lead": "Self-hosted core; enterprise options for SLA, SSO, and dedicated builders.",
|
||||||
|
"page12.title": "Contact us",
|
||||||
|
"page12.lead": "Reach the maintainer for partnerships, support, or deployment help.",
|
||||||
|
"page13.title": "Document catalog",
|
||||||
|
"page13.lead": "ac-docs index — drafts, design reviews, specs, and operator guides.",
|
||||||
|
"page13.cat_drs": "Design reviews (DRs)",
|
||||||
|
"page13.cat_specs": "Specifications",
|
||||||
|
"page13.cat_drafts": "Drafts",
|
||||||
|
"page13.cat_guides": "Guides & ops",
|
||||||
|
"page13.hint": "Browse full tree in Gitea under ac-docs; PDF builds live in _pdf_build/.",
|
||||||
"footer.copyright": "© {holder}, {year}"
|
"footer.copyright": "© {holder}, {year}"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,10 +3,14 @@
|
|||||||
"nav.about": "О проекте",
|
"nav.about": "О проекте",
|
||||||
"nav.why": "Зачем",
|
"nav.why": "Зачем",
|
||||||
"nav.tech": "Технологии",
|
"nav.tech": "Технологии",
|
||||||
|
"nav.documentation": "Документация",
|
||||||
"nav.resources": "Ресурсы",
|
"nav.resources": "Ресурсы",
|
||||||
"nav.people": "Люди",
|
"nav.people": "Люди",
|
||||||
"nav.culture": "Культура",
|
"nav.culture": "Культура",
|
||||||
"nav.pricing": "Цены",
|
"nav.pricing": "Цены",
|
||||||
|
"nav.downloads": "Загрузки",
|
||||||
|
"nav.downloads_common": "Common",
|
||||||
|
"nav.downloads_others": "Others",
|
||||||
"nav.contact": "Контакты",
|
"nav.contact": "Контакты",
|
||||||
"nav.console": "Консоль",
|
"nav.console": "Консоль",
|
||||||
"nav.git": "Git",
|
"nav.git": "Git",
|
||||||
@@ -50,15 +54,34 @@
|
|||||||
"page4.lead": "Для команд, которым нужны надёжность, наблюдаемость и контроль — не чёрный ящик.",
|
"page4.lead": "Для команд, которым нужны надёжность, наблюдаемость и контроль — не чёрный ящик.",
|
||||||
"page5.title": "Технологии",
|
"page5.title": "Технологии",
|
||||||
"page5.lead": "WebRTC, Opus/Speex, WireGuard, PHP-консоли и Docker CI.",
|
"page5.lead": "WebRTC, Opus/Speex, WireGuard, PHP-консоли и Docker CI.",
|
||||||
"page6.title": "Ресурсы",
|
"page6.title": "Документация",
|
||||||
"page6.lead": "Документация, деплой и паттерны интеграции для вашей среды.",
|
"page6.lead": "Wiki проекта, DR, спецификации и руководства.",
|
||||||
"page7.title": "Люди",
|
"page6.btn_wiki": "Документация проекта",
|
||||||
"page7.lead": "Инженеры и операторы, которые каждый день развивают cast, crash и сборки.",
|
"page6.btn_docs": "Прочие документы",
|
||||||
"page8.title": "Культура",
|
"page6.hint": "Wiki в Gitea; каталог — черновики ac-docs, DR и specs.",
|
||||||
"page8.lead": "Открытые инструменты, зелёный master и честные postmortem.",
|
"page7.title": "Загрузки",
|
||||||
"page9.title": "Цены",
|
"page7.lead": "Последние stable-сборки из orchestration (ветка next).",
|
||||||
"page9.lead": "Self-hosted ядро; enterprise — SLA, SSO и выделенные builder-ы.",
|
"page7.btn_apk": "Android APK",
|
||||||
"page10.title": "Контакты",
|
"page7.btn_studio": "Session Studio",
|
||||||
"page10.lead": "Связь с maintainer: партнёрство, поддержка, помощь с деплоем.",
|
"page7.hint": "APK совпадает с stable OTA-каналом.",
|
||||||
|
"page8.title": "Ресурсы",
|
||||||
|
"page8.lead": "Исходники, консоли и точки интеграции.",
|
||||||
|
"page8.btn_git": "Git Access",
|
||||||
|
"page8.hint": "Тот же Gitea, что и ссылка Git в левой панели.",
|
||||||
|
"page9.title": "Люди",
|
||||||
|
"page9.lead": "Инженеры и операторы, которые каждый день развивают cast, crash и сборки.",
|
||||||
|
"page10.title": "Культура",
|
||||||
|
"page10.lead": "Открытые инструменты, зелёный master и честные postmortem.",
|
||||||
|
"page11.title": "Цены",
|
||||||
|
"page11.lead": "Self-hosted ядро; enterprise — SLA, SSO и выделенные builder-ы.",
|
||||||
|
"page12.title": "Контакты",
|
||||||
|
"page12.lead": "Связь с maintainer: партнёрство, поддержка, помощь с деплоем.",
|
||||||
|
"page13.title": "Каталог документов",
|
||||||
|
"page13.lead": "Индекс ac-docs — черновики, DR, specs и guides.",
|
||||||
|
"page13.cat_drs": "Design reviews (DRs)",
|
||||||
|
"page13.cat_specs": "Спецификации",
|
||||||
|
"page13.cat_drafts": "Черновики",
|
||||||
|
"page13.cat_guides": "Guides и ops",
|
||||||
|
"page13.hint": "Полное дерево в Gitea (ac-docs); PDF — _pdf_build/.",
|
||||||
"footer.copyright": "© {holder}, {year}"
|
"footer.copyright": "© {holder}, {year}"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -474,3 +474,59 @@
|
|||||||
.landing-scroll { scroll-behavior: auto; }
|
.landing-scroll { scroll-behavior: auto; }
|
||||||
.landing-rail { transition: none; }
|
.landing-rail { transition: none; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Downloads / documentation big rounded CTAs */
|
||||||
|
.landing-download-grid {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
gap: 16px;
|
||||||
|
margin: 20px 0 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.landing-download-btn {
|
||||||
|
min-width: 200px;
|
||||||
|
min-height: 56px;
|
||||||
|
padding: 16px 28px;
|
||||||
|
border-radius: 999px;
|
||||||
|
font-size: 1.05rem;
|
||||||
|
font-weight: 600;
|
||||||
|
text-align: center;
|
||||||
|
text-decoration: none;
|
||||||
|
display: inline-flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
transition: box-shadow 0.2s ease, transform 0.15s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.landing-download-btn:hover,
|
||||||
|
.landing-download-btn:focus-visible {
|
||||||
|
transform: translateY(-1px);
|
||||||
|
box-shadow: 0 0 30px rgba(61, 139, 253, 0.45);
|
||||||
|
}
|
||||||
|
|
||||||
|
.landing-download-hint {
|
||||||
|
margin-top: 8px;
|
||||||
|
font-size: 0.92rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.landing-docs-grid {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
|
||||||
|
gap: 16px;
|
||||||
|
margin-top: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.landing-docs-card h3 {
|
||||||
|
margin: 0 0 10px;
|
||||||
|
font-size: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.landing-docs-list {
|
||||||
|
margin: 0;
|
||||||
|
padding-left: 1.1rem;
|
||||||
|
line-height: 1.65;
|
||||||
|
}
|
||||||
|
|
||||||
|
.landing-docs-list a {
|
||||||
|
color: var(--accent, #3d8bfd);
|
||||||
|
}
|
||||||
|
|||||||
21
index.php
21
index.php
@@ -45,6 +45,7 @@ function hub_h(string $s): string {
|
|||||||
<script src="/app/androidcast_project/issues/assets/js/nav_shell.js" defer></script>
|
<script src="/app/androidcast_project/issues/assets/js/nav_shell.js" defer></script>
|
||||||
<script src="assets/hub-i18n.js" defer></script>
|
<script src="assets/hub-i18n.js" defer></script>
|
||||||
<script src="assets/hub-landing.js" defer></script>
|
<script src="assets/hub-landing.js" defer></script>
|
||||||
|
<script src="assets/hub-downloads.js" defer></script>
|
||||||
<script src="/app/androidcast_project/issues/assets/js/cookie_consent.js" defer></script>
|
<script src="/app/androidcast_project/issues/assets/js/cookie_consent.js" defer></script>
|
||||||
<script src="assets/analytics.config.js"></script>
|
<script src="assets/analytics.config.js"></script>
|
||||||
<script src="/app/androidcast_project/issues/assets/js/analytics.js" defer></script>
|
<script src="/app/androidcast_project/issues/assets/js/analytics.js" defer></script>
|
||||||
@@ -99,17 +100,25 @@ function hub_h(string $s): string {
|
|||||||
<a href="#" role="menuitem" data-goto-page="3" data-i18n="nav.about">About</a>
|
<a href="#" role="menuitem" data-goto-page="3" data-i18n="nav.about">About</a>
|
||||||
<a href="#" role="menuitem" data-goto-page="4" data-i18n="nav.why">Why</a>
|
<a href="#" role="menuitem" data-goto-page="4" data-i18n="nav.why">Why</a>
|
||||||
<a href="#" role="menuitem" data-goto-page="5" data-i18n="nav.tech">Technologies</a>
|
<a href="#" role="menuitem" data-goto-page="5" data-i18n="nav.tech">Technologies</a>
|
||||||
|
<a href="#" role="menuitem" data-goto-page="6" data-i18n="nav.documentation">Documentation</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="landing-menu-item">
|
<div class="landing-menu-item">
|
||||||
<button type="button" class="landing-menu-btn" aria-haspopup="true" aria-expanded="false" data-goto-page="6" data-i18n="nav.resources">Resources</button>
|
<button type="button" class="landing-menu-btn" aria-haspopup="true" aria-expanded="false" data-goto-page="8" data-i18n="nav.resources">Resources</button>
|
||||||
<div class="landing-dropdown" role="menu">
|
<div class="landing-dropdown" role="menu">
|
||||||
<a href="#" role="menuitem" data-goto-page="7" data-i18n="nav.people">People</a>
|
<a href="#" role="menuitem" data-goto-page="9" data-i18n="nav.people">People</a>
|
||||||
<a href="#" role="menuitem" data-goto-page="8" data-i18n="nav.culture">Culture</a>
|
<a href="#" role="menuitem" data-goto-page="10" data-i18n="nav.culture">Culture</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<a class="landing-menu-link" href="#" data-goto-page="9" data-i18n="nav.pricing">Pricing</a>
|
<a class="landing-menu-link" href="#" data-goto-page="11" data-i18n="nav.pricing">Pricing</a>
|
||||||
<a class="landing-menu-link" href="#" data-goto-page="10" data-i18n="nav.contact">Contact us</a>
|
<div class="landing-menu-item">
|
||||||
|
<button type="button" class="landing-menu-btn" aria-haspopup="true" aria-expanded="false" data-goto-page="7" data-i18n="nav.downloads">Downloads</button>
|
||||||
|
<div class="landing-dropdown" role="menu">
|
||||||
|
<a href="#" role="menuitem" data-goto-page="7" data-i18n="nav.downloads_common">Common</a>
|
||||||
|
<a href="#" role="menuitem" data-goto-page="8" data-i18n="nav.downloads_others">Others</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<a class="landing-menu-link" href="#" data-goto-page="12" data-i18n="nav.contact">Contact us</a>
|
||||||
</nav>
|
</nav>
|
||||||
<div class="landing-top-tools">
|
<div class="landing-top-tools">
|
||||||
<label class="toolbar-select hub-theme">
|
<label class="toolbar-select hub-theme">
|
||||||
@@ -188,7 +197,7 @@ function hub_h(string $s): string {
|
|||||||
<aside class="landing-rail" id="landing-rail" aria-label="Page navigation">
|
<aside class="landing-rail" id="landing-rail" aria-label="Page navigation">
|
||||||
<button type="button" class="landing-rail-handle" id="landing-rail-handle" data-i18n-aria="rail.handle" aria-label="Show page navigation"></button>
|
<button type="button" class="landing-rail-handle" id="landing-rail-handle" data-i18n-aria="rail.handle" aria-label="Show page navigation"></button>
|
||||||
<nav class="landing-rail-dots" aria-label="Pages">
|
<nav class="landing-rail-dots" aria-label="Pages">
|
||||||
<?php for ($p = 1; $p <= 10; $p++): ?>
|
<?php for ($p = 1; $p <= 13; $p++): ?>
|
||||||
<button type="button" class="landing-rail-dot<?= $p === 1 ? ' is-active' : '' ?>" data-page="<?= $p ?>" aria-label="Page <?= $p ?>"<?= $p === 1 ? ' aria-current="true"' : '' ?>></button>
|
<button type="button" class="landing-rail-dot<?= $p === 1 ? ' is-active' : '' ?>" data-page="<?= $p ?>" aria-label="Page <?= $p ?>"<?= $p === 1 ? ' aria-current="true"' : '' ?>></button>
|
||||||
<?php endfor; ?>
|
<?php endfor; ?>
|
||||||
</nav>
|
</nav>
|
||||||
|
|||||||
@@ -65,18 +65,45 @@
|
|||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section class="landing-page" id="landing-page-6" data-page="6" aria-label="Resources">
|
<section class="landing-page" id="landing-page-6" data-page="6" aria-label="Documentation">
|
||||||
<div class="landing-page-inner card card--lift">
|
<div class="landing-page-inner card card--lift">
|
||||||
<h2 data-i18n="page6.title">Resources</h2>
|
<h2 data-i18n="page6.title">Documentation</h2>
|
||||||
<p class="landing-lead" data-i18n="page6.lead">Documentation, deployment guides, and integration patterns for your environment.</p>
|
<p class="landing-lead" data-i18n="page6.lead">Project wiki, design reviews, specs, and operator guides.</p>
|
||||||
<p><a class="btn" href="issues/">Issues console</a> <a class="btn" href="build/">Builder</a> <a class="btn" href="git/">Git browser</a></p>
|
<div class="landing-download-grid">
|
||||||
|
<a class="landing-download-btn btn btn-primary" href="git/" target="_blank" rel="noopener" data-i18n="page6.btn_wiki">Project documentation</a>
|
||||||
|
<button type="button" class="landing-download-btn btn btn-primary" data-goto-page="13" data-i18n="page6.btn_docs">Other documents</button>
|
||||||
|
</div>
|
||||||
|
<p class="muted landing-download-hint" data-i18n="page6.hint">Wiki opens in Gitea; other documents lists ac-docs drafts, DRs, and specs.</p>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section class="landing-page" id="landing-page-7" data-page="7" aria-label="People">
|
<section class="landing-page" id="landing-page-7" data-page="7" aria-label="Downloads">
|
||||||
<div class="landing-page-inner card card--lift">
|
<div class="landing-page-inner card card--lift">
|
||||||
<h2 data-i18n="page7.title">People</h2>
|
<h2 data-i18n="page7.title">Downloads</h2>
|
||||||
<p class="landing-lead" data-i18n="page7.lead">Engineers and operators shipping cast, crash, and build workflows every day.</p>
|
<p class="landing-lead" data-i18n="page7.lead">Latest stable builds from the orchestration pipeline (<code>next</code> integration).</p>
|
||||||
|
<div class="landing-download-grid">
|
||||||
|
<button type="button" class="landing-download-btn btn btn-primary" id="hub-download-apk" data-i18n="page7.btn_apk">Android APK</button>
|
||||||
|
<a class="landing-download-btn btn btn-primary" href="/v0/downloads/ac-session-studio.jar" download data-i18n="page7.btn_studio">Session Studio</a>
|
||||||
|
</div>
|
||||||
|
<p class="muted landing-download-hint" id="hub-download-apk-status" data-i18n="page7.hint">APK matches the stable OTA channel signature and version.</p>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="landing-page" id="landing-page-8" data-page="8" aria-label="Resources">
|
||||||
|
<div class="landing-page-inner card card--lift">
|
||||||
|
<h2 data-i18n="page8.title">Resources</h2>
|
||||||
|
<p class="landing-lead" data-i18n="page8.lead">Source control, consoles, and integration entry points.</p>
|
||||||
|
<div class="landing-download-grid">
|
||||||
|
<a class="landing-download-btn btn btn-primary" href="git/" data-i18n="page8.btn_git">Git Access</a>
|
||||||
|
</div>
|
||||||
|
<p class="muted landing-download-hint" data-i18n="page8.hint">Same Gitea browser as the left shell Git link.</p>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="landing-page" id="landing-page-9" data-page="9" aria-label="People">
|
||||||
|
<div class="landing-page-inner card card--lift">
|
||||||
|
<h2 data-i18n="page9.title">People</h2>
|
||||||
|
<p class="landing-lead" data-i18n="page9.lead">Engineers and operators shipping cast, crash, and build workflows every day.</p>
|
||||||
<div class="landing-gallery">
|
<div class="landing-gallery">
|
||||||
<img src="https://images.unsplash.com/photo-1522071820081-009f0129c71c?w=400&h=300&fit=crop" alt="" loading="lazy" decoding="async">
|
<img src="https://images.unsplash.com/photo-1522071820081-009f0129c71c?w=400&h=300&fit=crop" alt="" loading="lazy" decoding="async">
|
||||||
<img src="https://images.unsplash.com/photo-1600880292203-757bb62b4baf?w=400&h=300&fit=crop" alt="" loading="lazy" decoding="async">
|
<img src="https://images.unsplash.com/photo-1600880292203-757bb62b4baf?w=400&h=300&fit=crop" alt="" loading="lazy" decoding="async">
|
||||||
@@ -84,18 +111,18 @@
|
|||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section class="landing-page" id="landing-page-8" data-page="8" aria-label="Culture">
|
<section class="landing-page" id="landing-page-10" data-page="10" aria-label="Culture">
|
||||||
<div class="landing-page-inner card card--lift">
|
<div class="landing-page-inner card card--lift">
|
||||||
<h2 data-i18n="page8.title">Culture</h2>
|
<h2 data-i18n="page10.title">Culture</h2>
|
||||||
<p class="landing-lead" data-i18n="page8.lead">Open tooling, green master branches, and honest postmortems.</p>
|
<p class="landing-lead" data-i18n="page10.lead">Open tooling, green master branches, and honest postmortems.</p>
|
||||||
<p class="muted">We ship on <code>next</code>, tag on <code>master</code>, and keep infra docs next to the code.</p>
|
<p class="muted">We ship on <code>next</code>, tag on <code>master</code>, and keep infra docs next to the code.</p>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section class="landing-page" id="landing-page-9" data-page="9" aria-label="Pricing">
|
<section class="landing-page" id="landing-page-11" data-page="11" aria-label="Pricing">
|
||||||
<div class="landing-page-inner card card--lift">
|
<div class="landing-page-inner card card--lift">
|
||||||
<h2 data-i18n="page9.title">Pricing</h2>
|
<h2 data-i18n="page11.title">Pricing</h2>
|
||||||
<p class="landing-lead" data-i18n="page9.lead">Self-hosted core; enterprise options for SLA, SSO, and dedicated builders.</p>
|
<p class="landing-lead" data-i18n="page11.lead">Self-hosted core; enterprise options for SLA, SSO, and dedicated builders.</p>
|
||||||
<div class="landing-price-grid">
|
<div class="landing-price-grid">
|
||||||
<div class="landing-price-card">
|
<div class="landing-price-card">
|
||||||
<h3>Community</h3>
|
<h3>Community</h3>
|
||||||
@@ -116,10 +143,10 @@
|
|||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section class="landing-page" id="landing-page-10" data-page="10" aria-label="Contact">
|
<section class="landing-page" id="landing-page-12" data-page="12" aria-label="Contact">
|
||||||
<div class="landing-page-inner card card--lift">
|
<div class="landing-page-inner card card--lift">
|
||||||
<h2 data-i18n="page10.title">Contact us</h2>
|
<h2 data-i18n="page12.title">Contact us</h2>
|
||||||
<p class="landing-lead" data-i18n="page10.lead">Reach the maintainer for partnerships, support, or deployment help.</p>
|
<p class="landing-lead" data-i18n="page12.lead">Reach the maintainer for partnerships, support, or deployment help.</p>
|
||||||
<form class="landing-contact-form" action="#" method="post" onsubmit="return false">
|
<form class="landing-contact-form" action="#" method="post" onsubmit="return false">
|
||||||
<label>Name<input type="text" name="name" autocomplete="name"></label>
|
<label>Name<input type="text" name="name" autocomplete="name"></label>
|
||||||
<label>Email<input type="email" name="email" autocomplete="email"></label>
|
<label>Email<input type="email" name="email" autocomplete="email"></label>
|
||||||
@@ -128,3 +155,46 @@
|
|||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
|
<section class="landing-page" id="landing-page-13" data-page="13" aria-label="Document catalog">
|
||||||
|
<div class="landing-page-inner card card--lift">
|
||||||
|
<h2 data-i18n="page13.title">Document catalog</h2>
|
||||||
|
<p class="landing-lead" data-i18n="page13.lead">ac-docs index — drafts, design reviews, specs, and operator guides (placeholder links).</p>
|
||||||
|
<div class="landing-docs-grid">
|
||||||
|
<article class="card card--lift landing-docs-card">
|
||||||
|
<h3 data-i18n="page13.cat_drs">Design reviews (DRs)</h3>
|
||||||
|
<ul class="landing-docs-list muted">
|
||||||
|
<li><a href="git/src/branch/next/ac-docs/DRs">Cluster monitoring DR</a></li>
|
||||||
|
<li><a href="git/src/branch/next/ac-docs/DRs">Live cast control plane</a></li>
|
||||||
|
<li><a href="git/src/branch/next/ac-docs/DRs">Repos reorganizing</a></li>
|
||||||
|
</ul>
|
||||||
|
</article>
|
||||||
|
<article class="card card--lift landing-docs-card">
|
||||||
|
<h3 data-i18n="page13.cat_specs">Specifications</h3>
|
||||||
|
<ul class="landing-docs-list muted">
|
||||||
|
<li><a href="git/src/branch/next/ac-docs/specs">Scaling spec</a></li>
|
||||||
|
<li><a href="git/src/branch/next/ac-docs/specs">URL shortener spec</a></li>
|
||||||
|
<li><a href="git/src/branch/next/ac-docs/specs">Cluster monitoring spec</a></li>
|
||||||
|
</ul>
|
||||||
|
</article>
|
||||||
|
<article class="card card--lift landing-docs-card">
|
||||||
|
<h3 data-i18n="page13.cat_drafts">Drafts</h3>
|
||||||
|
<ul class="landing-docs-list muted">
|
||||||
|
<li><a href="git/src/branch/next/ac-docs/drafts">Cluster orchestration</a></li>
|
||||||
|
<li><a href="git/src/branch/next/ac-docs/drafts">RBAC refactoring</a></li>
|
||||||
|
<li><a href="git/src/branch/next/ac-docs/drafts">RSSH routed egress</a></li>
|
||||||
|
</ul>
|
||||||
|
</article>
|
||||||
|
<article class="card card--lift landing-docs-card">
|
||||||
|
<h3 data-i18n="page13.cat_guides">Guides & ops</h3>
|
||||||
|
<ul class="landing-docs-list muted">
|
||||||
|
<li><a href="git/src/branch/next/ac-docs/GIT_FLOW.md">Git flow</a></li>
|
||||||
|
<li><a href="git/src/branch/next/ac-docs/INFRA.md">Infrastructure</a></li>
|
||||||
|
<li><a href="git/src/branch/next/ac-docs/BUILD_DEPLOY.md">Build & deploy</a></li>
|
||||||
|
<li><a href="git/src/branch/next/ac-docs/OTA.md">OTA</a></li>
|
||||||
|
</ul>
|
||||||
|
</article>
|
||||||
|
</div>
|
||||||
|
<p class="muted landing-download-hint" data-i18n="page13.hint">Browse full tree in Gitea under the ac-docs submodule; PDF builds live in repo _pdf_build/.</p>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|||||||
Reference in New Issue
Block a user