1
0
mirror of git://f0xx.org/android_cast synced 2026-07-29 03:38:52 +03:00

landing sync, multipage

This commit is contained in:
Anton Afanasyeu
2026-06-06 12:09:34 +02:00
parent cd2e69ad6b
commit 5c2458dfcd
8 changed files with 1022 additions and 93 deletions

View File

@@ -11,16 +11,19 @@ unset($__platformDir);
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Android Cast — Project hub</title>
<title>Android Cast — Landing</title>
<script>
(function () {
var t = localStorage.getItem('crash_console_theme');
if (t === 'light' || t === 'dark') document.documentElement.setAttribute('data-theme', t);
var l = localStorage.getItem('crash_console_lang');
if (l === 'en' || l === 'ru') document.documentElement.setAttribute('lang', l);
})();
</script>
<link rel="stylesheet" href="/app/androidcast_project/crashes/assets/css/app.css">
<link rel="stylesheet" href="hub.css?v=20260532globe">
<link rel="stylesheet" href="hub-logo-layers.css?v=20260532globe">
<link rel="stylesheet" href="hub.css?v=20260606landing">
<link rel="stylesheet" href="hub-logo-layers.css?v=20260606landing">
<link rel="stylesheet" href="hub-landing.css?v=20260606landing">
<script type="importmap">
{
"imports": {
@@ -28,10 +31,12 @@ unset($__platformDir);
}
}
</script>
<script src="assets/hub-i18n.js" defer></script>
<script src="assets/hub-landing.js" defer></script>
<script src="assets/analytics.config.js"></script>
<script src="/app/androidcast_project/crashes/assets/js/analytics.js" defer></script>
</head>
<body class="hub-page">
<body class="hub-page hub-landing">
<div id="lcd-alphabet-host" hidden aria-hidden="true"></div>
<div id="overtime-alphabet-host" hidden aria-hidden="true"></div>
<div id="quartz-alphabet-host" hidden aria-hidden="true"></div>
@@ -69,100 +74,90 @@ unset($__platformDir);
</div>
</section>
</div>
<div class="shell hub-shell">
<main class="main-pane hub-main">
<header class="hub-header">
<div class="hub-brand">
<img class="hub-logo-mark" src="assets/hub-logo-transparent.svg" alt="" width="112" height="84" decoding="async">
<div class="hub-title-with-thunder">
<h1 class="hub-title">Android Cast</h1>
<img class="hub-thunder" src="assets/hub-thunder.svg?v=20260527z" alt="" decoding="async">
</div>
<header class="landing-top" id="landing-top">
<a class="landing-top-logo" href="?page=1" data-goto-page="1">
<img src="assets/hub-logo-transparent.svg" alt="" width="36" height="27" decoding="async">
<strong>Android Cast</strong>
</a>
<nav class="landing-top-nav" aria-label="Landing menu">
<div class="landing-menu-item">
<button type="button" class="landing-menu-btn" aria-haspopup="true" aria-expanded="false" data-goto-page="2" data-i18n="nav.androidcast">AndroidCast</button>
<div class="landing-dropdown" role="menu">
<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="5" data-i18n="nav.tech">Technologies</a>
</div>
<p class="muted hub-subtitle">Project hub</p>
<label class="toolbar-select hub-theme">
<span>Theme</span>
<select id="theme-select" aria-label="UI theme">
<option value="dark">Dark</option>
<option value="light">Light</option>
</select>
</label>
</header>
</div>
<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>
<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="8" data-i18n="nav.culture">Culture</a>
</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="10" data-i18n="nav.contact">Contact us</a>
</nav>
<div class="landing-top-tools">
<label class="toolbar-select hub-theme">
<span data-i18n="theme.label">Theme</span>
<select id="theme-select" aria-label="UI theme">
<option value="dark">Dark</option>
<option value="light">Light</option>
</select>
</label>
<div class="locale-picker" data-i18n-title="lang.label" title="Language">
<span class="locale-flag" id="locale-flag" aria-hidden="true">🇬🇧</span>
<span class="locale-code" id="locale-code" aria-hidden="true">EN</span>
<select class="lang-select locale-picker__select" id="lang-select" data-i18n-aria="lang.label" aria-label="Language">
<option value="en">EN</option>
<option value="ru">RU</option>
</select>
</div>
</div>
</header>
<div class="landing-frame">
<nav class="nav-pane landing-left" id="landing-nav-pane" aria-label="Android Cast apps">
<button type="button" class="nav-handle" id="landing-nav-handle" data-i18n-aria="nav.toggle" data-i18n-title="nav.toggle" aria-label="Navigation" title="Navigation">
<span class="nav-icon nav-icon--menu" aria-hidden="true"></span>
</button>
<ul class="nav-list">
<li><a href="git/" class="nav-link"><span class="nav-icon nav-icon--git"></span><span class="nav-label" data-i18n="nav.git">Git</span></a></li>
<li><a href="crashes/?view=tickets" class="nav-link"><span class="nav-icon nav-icon--tickets"></span><span class="nav-label" data-i18n="nav.tickets">Tickets</span></a></li>
<li><a href="crashes/?view=reports" class="nav-link"><span class="nav-icon nav-icon--reports"></span><span class="nav-label" data-i18n="nav.crashes">Crashes</span></a></li>
<li><a href="graphs/" class="nav-link"><span class="nav-icon nav-icon--graphs"></span><span class="nav-label" data-i18n="nav.graphs">Graphs</span></a></li>
<li><a href="crashes/?view=remote_access" class="nav-link"><span class="nav-icon nav-icon--reports"></span><span class="nav-label" data-i18n="nav.remote">Remote access</span></a></li>
<li><a href="build/" class="nav-link"><span class="nav-icon nav-icon--builder"></span><span class="nav-label" data-i18n="nav.builder">Builder</span></a></li>
</ul>
</nav>
<main class="landing-scroll" id="landing-scroll" tabindex="-1">
<?php require __DIR__ . '/landing-pages.inc.php'; ?>
</main>
</div>
<nav class="hub-nav-dock" id="hub-nav-dock" aria-label="Android Cast apps">
<a class="hub-card card card--lift" href="git/">
<span class="hub-card-icon" aria-hidden="true">
<span class="nav-icon nav-icon--git"></span>
</span>
<span class="hub-card-label">AndroidCast git</span>
</a>
<a class="hub-card card card--lift" href="crashes/?view=tickets">
<span class="hub-card-icon" aria-hidden="true">
<span class="nav-icon nav-icon--tickets"></span>
</span>
<span class="hub-card-label">AndroidCast tickets</span>
</a>
<a class="hub-card card card--lift" href="crashes/?view=reports">
<span class="hub-card-icon" aria-hidden="true">
<span class="nav-icon nav-icon--reports"></span>
</span>
<span class="hub-card-label">AndroidCast crashes</span>
</a>
<a class="hub-card card card--lift" href="graphs/">
<span class="hub-card-icon" aria-hidden="true">
<span class="nav-icon nav-icon--graphs"></span>
</span>
<span class="hub-card-label">AndroidCast graphs</span>
</a>
<a class="hub-card card card--lift" href="crashes/?view=remote_access">
<span class="hub-card-icon" aria-hidden="true">
<span class="nav-icon nav-icon--reports"></span>
</span>
<span class="hub-card-label">Remote access</span>
</a>
<a class="hub-card card card--lift" href="build/">
<span class="hub-card-icon" aria-hidden="true">
<span class="nav-icon nav-icon--builder"></span>
</span>
<span class="hub-card-label">AndroidCast builder</span>
</a>
</nav>
<?php platform_render_footer(['use_i18n' => false]); ?>
<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>
<nav class="landing-rail-dots" aria-label="Pages">
<?php for ($p = 1; $p <= 10; $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>
<?php endfor; ?>
</nav>
</aside>
<?php platform_render_footer([
'use_i18n' => false,
'extra_class' => 'bottom-bar',
]); ?>
<script>
(function () {
var GLOBE_VIEW = { imgW: 1920, imgH: 1080, cx: 720, cy: 560, r: 330 };
function globeCoverRect() {
var vw = window.innerWidth;
var vh = window.innerHeight;
var scale = Math.max(vw / GLOBE_VIEW.imgW, vh / GLOBE_VIEW.imgH);
var drawW = GLOBE_VIEW.imgW * scale;
var drawH = GLOBE_VIEW.imgH * scale;
var offX = (vw - drawW) / 2;
var offY = (vh - drawH) / 2;
var left = offX + (GLOBE_VIEW.cx - GLOBE_VIEW.r) * scale;
var top = offY + (GLOBE_VIEW.cy - GLOBE_VIEW.r) * scale;
var bottom = offY + (GLOBE_VIEW.cy + GLOBE_VIEW.r) * scale;
var right = offX + (GLOBE_VIEW.cx + GLOBE_VIEW.r) * scale;
return { left: left, top: top, bottom: bottom, right: right, width: right - left, height: bottom - top };
var footerLeft = document.querySelector('.platform-footer__left');
if (footerLeft) {
footerLeft.setAttribute('data-i18n', 'footer.copyright');
footerLeft.setAttribute('data-holder', 'Anton Afanaasyeu');
footerLeft.setAttribute('data-year', '2026 - current');
}
function layoutHubNavDock() {
var dock = document.getElementById('hub-nav-dock');
if (!dock) return;
var globe = globeCoverRect();
var dockW = Math.min(300, Math.max(210, globe.width * 0.38));
dock.style.width = dockW + 'px';
dock.style.left = globe.left + 'px';
dock.style.top = globe.top + 'px';
dock.style.height = globe.height + 'px';
dock.style.display = 'flex';
dock.style.flexDirection = 'column';
dock.style.flexWrap = 'nowrap';
dock.style.gap = '5px';
dock.style.justifyContent = 'flex-end';
}
layoutHubNavDock();
window.addEventListener('resize', layoutHubNavDock);
})();
</script>
<script>
@@ -185,7 +180,7 @@ unset($__platformDir);
var supportsLayout = !!(window.CSS && CSS.supports && CSS.supports('object-fit', 'cover'));
var logoEnabled = !!(stage && supportsSvg && supportsLayout);
var logoBuild = '20260532globe';
var logoBuild = '20260606landing';
function hubAsset(rel) {
var link = document.querySelector('link[href*="hub.css"]');