Updated docs with QR Codes
All checks were successful
Ascently - Docs Deploy / build-and-push (push) Successful in 4m26s
All checks were successful
Ascently - Docs Deploy / build-and-push (push) Successful in 4m26s
This commit is contained in:
@@ -27,7 +27,11 @@
|
||||
"dependencies": {
|
||||
"@astrojs/node": "^9.5.0",
|
||||
"@astrojs/starlight": "^0.36.1",
|
||||
"astro": "^5.14.5",
|
||||
"astro": "^5.14.6",
|
||||
"qrcode": "^1.5.4",
|
||||
"sharp": "^0.34.4"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/qrcode": "^1.5.5"
|
||||
}
|
||||
}
|
||||
|
||||
488
docs/pnpm-lock.yaml
generated
488
docs/pnpm-lock.yaml
generated
File diff suppressed because it is too large
Load Diff
159
docs/src/components/DownloadButtons.astro
Normal file
159
docs/src/components/DownloadButtons.astro
Normal file
@@ -0,0 +1,159 @@
|
||||
---
|
||||
import { Tabs, TabItem } from "@astrojs/starlight/components";
|
||||
import { Card, CardGrid } from "@astrojs/starlight/components";
|
||||
import { LinkButton } from "@astrojs/starlight/components";
|
||||
import QRCode from "./QRCode.astro";
|
||||
import { downloadLinks, requirements } from "../config";
|
||||
|
||||
interface Props {
|
||||
showQR?: boolean;
|
||||
}
|
||||
|
||||
const { showQR = false } = Astro.props;
|
||||
|
||||
const hasLink = (link: string | undefined) => link && link.trim() !== "";
|
||||
---
|
||||
|
||||
<Tabs syncKey="platform">
|
||||
<TabItem label="Android" icon="laptop">
|
||||
<CardGrid>
|
||||
{
|
||||
hasLink(downloadLinks.android.releases) && (
|
||||
<Card title="Direct APK Download" icon="download">
|
||||
<p>Download the latest APK from the Releases page.</p>
|
||||
<p style="text-align: center;">
|
||||
<LinkButton
|
||||
href={downloadLinks.android.releases}
|
||||
variant="primary"
|
||||
icon="external"
|
||||
>
|
||||
Download APK
|
||||
</LinkButton>
|
||||
</p>
|
||||
{showQR && (
|
||||
<p style="text-align: center;">
|
||||
<QRCode
|
||||
data={downloadLinks.android.releases}
|
||||
size={200}
|
||||
alt="QR code for APK download"
|
||||
/>
|
||||
</p>
|
||||
)}
|
||||
</Card>
|
||||
)
|
||||
}
|
||||
|
||||
{
|
||||
hasLink(downloadLinks.android.obtainium) && (
|
||||
<Card title="Obtainium" icon="setting">
|
||||
<p>Use Obtainium for automatic updates.</p>
|
||||
<p style="text-align: center;">
|
||||
<LinkButton
|
||||
href={downloadLinks.android.obtainium}
|
||||
variant="primary"
|
||||
icon="external"
|
||||
>
|
||||
Get on Obtainium
|
||||
</LinkButton>
|
||||
</p>
|
||||
{showQR && (
|
||||
<p style="text-align: center;">
|
||||
<QRCode
|
||||
data={downloadLinks.android.obtainium}
|
||||
size={200}
|
||||
alt="QR code for Obtainium"
|
||||
/>
|
||||
</p>
|
||||
)}
|
||||
</Card>
|
||||
)
|
||||
}
|
||||
|
||||
{
|
||||
hasLink(downloadLinks.android.playStore) && (
|
||||
<Card title="Google Play Store" icon="rocket">
|
||||
<p>Download from the official Google Play Store.</p>
|
||||
<p style="text-align: center;">
|
||||
<LinkButton
|
||||
href={downloadLinks.android.playStore}
|
||||
variant="primary"
|
||||
icon="external"
|
||||
>
|
||||
Get on Play Store
|
||||
</LinkButton>
|
||||
</p>
|
||||
{showQR && (
|
||||
<p style="text-align: center;">
|
||||
<QRCode
|
||||
data={downloadLinks.android.playStore}
|
||||
size={200}
|
||||
alt="QR code for Play Store"
|
||||
/>
|
||||
</p>
|
||||
)}
|
||||
</Card>
|
||||
)
|
||||
}
|
||||
</CardGrid>
|
||||
|
||||
<p><strong>Requirements:</strong> {requirements.android}</p>
|
||||
</TabItem>
|
||||
|
||||
<TabItem label="iOS" icon="apple">
|
||||
<CardGrid>
|
||||
{
|
||||
hasLink(downloadLinks.ios.appStore) && (
|
||||
<Card title="App Store" icon="apple">
|
||||
<p>Download from the official App Store.</p>
|
||||
<p style="text-align: center;">
|
||||
<LinkButton
|
||||
href={downloadLinks.ios.appStore}
|
||||
variant="primary"
|
||||
icon="external"
|
||||
>
|
||||
Download on App Store
|
||||
</LinkButton>
|
||||
</p>
|
||||
{showQR && (
|
||||
<p style="text-align: center;">
|
||||
<QRCode
|
||||
data={downloadLinks.ios.appStore}
|
||||
size={200}
|
||||
alt="QR code for App Store"
|
||||
/>
|
||||
</p>
|
||||
)}
|
||||
</Card>
|
||||
)
|
||||
}
|
||||
|
||||
{
|
||||
hasLink(downloadLinks.ios.testFlight) && (
|
||||
<Card title="TestFlight Beta" icon="rocket">
|
||||
<p>Join the TestFlight beta program.</p>
|
||||
<p style="text-align: center;">
|
||||
<LinkButton
|
||||
href={downloadLinks.ios.testFlight}
|
||||
variant="secondary"
|
||||
icon="external"
|
||||
>
|
||||
Join TestFlight
|
||||
</LinkButton>
|
||||
</p>
|
||||
{showQR && (
|
||||
<p style="text-align: center;">
|
||||
<QRCode
|
||||
data={downloadLinks.ios.testFlight}
|
||||
size={200}
|
||||
alt="QR code for TestFlight"
|
||||
/>
|
||||
</p>
|
||||
)}
|
||||
</Card>
|
||||
)
|
||||
}
|
||||
</CardGrid>
|
||||
|
||||
<p><strong>Requirements:</strong> {requirements.ios}</p>
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
96
docs/src/components/QRCode.astro
Normal file
96
docs/src/components/QRCode.astro
Normal file
@@ -0,0 +1,96 @@
|
||||
---
|
||||
import * as QR from "qrcode";
|
||||
|
||||
interface Props {
|
||||
data: string;
|
||||
size?: number;
|
||||
alt?: string;
|
||||
}
|
||||
|
||||
const { data, size = 200, alt = "QR Code" } = Astro.props;
|
||||
|
||||
// Generate QR code for dark mode
|
||||
let darkModeQR = "";
|
||||
try {
|
||||
darkModeQR = await QR.toDataURL(data, {
|
||||
width: size,
|
||||
margin: 2,
|
||||
color: {
|
||||
dark: "#FFBF00",
|
||||
light: "#17181C",
|
||||
},
|
||||
});
|
||||
} catch (err) {
|
||||
console.error("Failed to generate dark mode QR code:", err);
|
||||
}
|
||||
|
||||
// Generate QR code for light mode
|
||||
let lightModeQR = "";
|
||||
try {
|
||||
lightModeQR = await QR.toDataURL(data, {
|
||||
width: size,
|
||||
margin: 2,
|
||||
color: {
|
||||
dark: "#F24B3C",
|
||||
light: "#FFFFFF",
|
||||
},
|
||||
});
|
||||
} catch (err) {
|
||||
console.error("Failed to generate light mode QR code:", err);
|
||||
}
|
||||
|
||||
const uniqueId = `qr-${Math.random().toString(36).substr(2, 9)}`;
|
||||
---
|
||||
|
||||
{
|
||||
(darkModeQR || lightModeQR) && (
|
||||
<img
|
||||
id={uniqueId}
|
||||
src={lightModeQR}
|
||||
alt={alt}
|
||||
width={size}
|
||||
height={size}
|
||||
data-light-src={lightModeQR}
|
||||
data-dark-src={darkModeQR}
|
||||
style="margin: auto;"
|
||||
/>
|
||||
)
|
||||
}
|
||||
|
||||
<script>
|
||||
function updateQRCodes() {
|
||||
const theme = document.documentElement.getAttribute("data-theme");
|
||||
const qrImages = document.querySelectorAll(
|
||||
"img[data-light-src][data-dark-src]",
|
||||
);
|
||||
|
||||
qrImages.forEach((img) => {
|
||||
const lightSrc = img.getAttribute("data-light-src");
|
||||
const darkSrc = img.getAttribute("data-dark-src");
|
||||
|
||||
if (theme === "dark" && darkSrc) {
|
||||
img.setAttribute("src", darkSrc);
|
||||
} else if (lightSrc) {
|
||||
img.setAttribute("src", lightSrc);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
updateQRCodes();
|
||||
|
||||
const observer = new MutationObserver((mutations) => {
|
||||
mutations.forEach((mutation) => {
|
||||
if (
|
||||
mutation.type === "attributes" &&
|
||||
mutation.attributeName === "data-theme"
|
||||
) {
|
||||
updateQRCodes();
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
observer.observe(document.documentElement, {
|
||||
attributes: true,
|
||||
attributeFilter: ["data-theme"],
|
||||
});
|
||||
</script>
|
||||
17
docs/src/config.ts
Normal file
17
docs/src/config.ts
Normal file
@@ -0,0 +1,17 @@
|
||||
export const requirements = {
|
||||
android: "Android 12+",
|
||||
ios: "iOS 17+",
|
||||
} as const;
|
||||
|
||||
export const downloadLinks = {
|
||||
android: {
|
||||
releases: "https://git.atri.dad/atridad/Ascently/releases",
|
||||
obtainium:
|
||||
"https://apps.obtainium.imranr.dev/redirect?r=obtainium://add/https://git.atri.dad/atridad/Ascently/releases",
|
||||
playStore: "https://google.com",
|
||||
},
|
||||
ios: {
|
||||
appStore: "https://apps.apple.com/ca/app/ascently/id6753959144",
|
||||
testFlight: "https://testflight.apple.com/join/E2DYRGH8",
|
||||
},
|
||||
} as const;
|
||||
@@ -1,26 +0,0 @@
|
||||
---
|
||||
title: Download
|
||||
description: Get Ascently on your Android or iOS device
|
||||
---
|
||||
|
||||
## Android
|
||||
|
||||
### Option 1: Direct APK Download
|
||||
Download the latest APK from the [Releases page](https://git.atri.dad/atridad/Ascently/releases).
|
||||
|
||||
### Option 2: Obtainium
|
||||
Use Obtainium for automatic updates:
|
||||
|
||||
[<img src="https://github.com/ImranR98/Obtainium/blob/main/assets/graphics/badge_obtainium.png?raw=true" alt="Obtainium" height="41">](https://apps.obtainium.imranr.dev/redirect?r=obtainium://app/%7B%22id%22%3A%22com.atridad.ascently%22%2C%22url%22%3A%22https%3A%2F%2Fgit.atri.dad%2Fatridad%2FAscently%2Freleases%22%2C%22author%22%3A%22git.atri.dad%22%2C%22name%22%3A%22Ascently%22%2C%22preferredApkIndex%22%3A0%2C%22additionalSettings%22%3A%22%7B%5C%22intermediateLink%5C%22%3A%5B%5D%2C%5C%22customLinkFilterRegex%5C%22%3A%5C%22%5C%22%2C%5C%22filterByLinkText%5C%22%3Afalse%2C%5C%22skipSort%5C%22%3Afalse%2C%5C%22reverseSort%5C%22%3Afalse%2C%5C%22sortByLastLinkSegment%5C%22%3Afalse%2C%5C%22versionExtractWholePage%5C%22%3Afalse%2C%5C%22requestHeader%5C%22%3A%5B%7B%5C%22requestHeader%5C%22%3A%5C%22User-Agent%3A%20Mozilla%2F5.0%20(Linux%3B%20Android%2010%3B%20K)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F114.0.0.0%20Mobile%20Safari%2F537.36%5C%22%7D%5D%2C%5C%22defaultPseudoVersioningMethod%5C%22%3A%5C%22partialAPKHash%5C%22%2C%5C%22trackOnly%5C%22%3Afalse%2C%5C%22versionExtractionRegEx%5C%22%3A%5C%22%5C%22%2C%5C%22matchGroupToUse%5C%22%3A%5C%22%5C%22%2C%5C%22versionDetection%5C%22%3Afalse%2C%5C%22useVersionCodeAsOSVersion%5C%22%3Afalse%2C%5C%22apkFilterRegEx%5C%22%3A%5C%22%5C%22%2C%5C%22invertAPKFilter%5C%22%3Afalse%2C%5C%22autoApkFilterByArch%5C%22%3Atrue%2C%5C%22appName%5C%22%3A%5C%22Ascently%5C%22%2C%5C%22appAuthor%5C%22%3A%5C%22%5C%22%2C%5C%22shizukuPretendToBeGooglePlay%5C%22%3Afalse%2C%5C%22allowInsecure%5C%22%3Afalse%2C%5C%22exemptFromBackgroundUpdates%5C%22%3Afalse%2C%5C%22skipUpdateNotifications%5C%22%3Afalse%2C%5C%22about%5C%22%3A%5C%22%5C%22%2C%5C%22refreshBeforeDownload%5C%22%3Afalse%7D%22%2C%22overrideSource%22%3Anull%7D)
|
||||
|
||||
## iOS
|
||||
|
||||
### App Store
|
||||
Download from the app store [here](https://apps.apple.com/ca/app/ascently/id6753959144)
|
||||
|
||||
### TestFlight Beta
|
||||
Join the TestFlight beta [here](https://testflight.apple.com/join/E2DYRGH8)
|
||||
|
||||
## Requirements
|
||||
|
||||
- **Android 12+** or **iOS 17+**
|
||||
10
docs/src/content/docs/download.mdx
Normal file
10
docs/src/content/docs/download.mdx
Normal file
@@ -0,0 +1,10 @@
|
||||
---
|
||||
title: Download
|
||||
description: Get Ascently on your Android or iOS device
|
||||
---
|
||||
|
||||
import DownloadButtons from '../../components/DownloadButtons.astro';
|
||||
|
||||
Get Ascently on your device and start tracking your climbs today!
|
||||
|
||||
<DownloadButtons showQR={true} />
|
||||
Reference in New Issue
Block a user