diff --git a/images/manager.png b/images/manager.png new file mode 100644 index 0000000..ade0c43 Binary files /dev/null and b/images/manager.png differ diff --git a/images/manager_two.png b/images/manager_two.png deleted file mode 100644 index 1305733..0000000 Binary files a/images/manager_two.png and /dev/null differ diff --git a/package-lock.json b/package-lock.json index a35373d..4e0abdf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -27,10 +27,13 @@ "imagetools-core": "^3.2.3", "prettier": "^2.8.0", "prettier-plugin-svelte": "^2.8.1", + "qrious": "^4.0.2", "sass": "^1.55.0", + "semver": "^7.5.4", "sirv-cli": "^2.0.2", "svelte": "^3.54.0", "svelte-check": "^2.9.2", + "svelte-meta-tags": "^2.8.0", "tslib": "^2.4.1", "typescript": "^4.9.3", "vite": "^4.0.0", @@ -2693,6 +2696,12 @@ "node": ">=6" } }, + "node_modules/qrious": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/qrious/-/qrious-4.0.2.tgz", + "integrity": "sha512-xWPJIrK1zu5Ypn898fBp8RHkT/9ibquV2Kv24S/JY9VYEhMBMKur1gHVsOiNUh7PHP9uCgejjpZUHUIXXKoU/g==", + "dev": true + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -2929,6 +2938,15 @@ "node": ">=12.0.0" } }, + "node_modules/schema-dts": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/schema-dts/-/schema-dts-1.1.2.tgz", + "integrity": "sha512-MpNwH0dZJHinVxk9bT8XUdjKTxMYrA5bLtrrGmFA6PTLwlOKnhi67XoRd6/ty+Djt6ZC0slR57qFhZDNMI6DhQ==", + "dev": true, + "peerDependencies": { + "typescript": ">=4.1.0" + } + }, "node_modules/semiver": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/semiver/-/semiver-1.1.0.tgz", @@ -2939,9 +2957,9 @@ } }, "node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -3253,6 +3271,18 @@ "svelte": "^3.19.0 || ^4.0.0-next.0" } }, + "node_modules/svelte-meta-tags": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/svelte-meta-tags/-/svelte-meta-tags-2.8.0.tgz", + "integrity": "sha512-CgnNNk8iJv4Ks0iAqerfvtC+qjOq6WKDvUnV30ss8k80nVC4pD6I6fGnAg/ieOuRNL1uir49zosZzwPjAsjdAQ==", + "dev": true, + "dependencies": { + "schema-dts": "^1.1.2" + }, + "peerDependencies": { + "svelte": "^3.55.0 || ^4.0.0" + } + }, "node_modules/svelte-preprocess": { "version": "4.10.7", "resolved": "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-4.10.7.tgz", @@ -5464,6 +5494,12 @@ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "dev": true }, + "qrious": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/qrious/-/qrious-4.0.2.tgz", + "integrity": "sha512-xWPJIrK1zu5Ypn898fBp8RHkT/9ibquV2Kv24S/JY9VYEhMBMKur1gHVsOiNUh7PHP9uCgejjpZUHUIXXKoU/g==", + "dev": true + }, "queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -5609,6 +5645,13 @@ "source-map-js": ">=0.6.2 <2.0.0" } }, + "schema-dts": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/schema-dts/-/schema-dts-1.1.2.tgz", + "integrity": "sha512-MpNwH0dZJHinVxk9bT8XUdjKTxMYrA5bLtrrGmFA6PTLwlOKnhi67XoRd6/ty+Djt6ZC0slR57qFhZDNMI6DhQ==", + "dev": true, + "requires": {} + }, "semiver": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/semiver/-/semiver-1.1.0.tgz", @@ -5616,9 +5659,9 @@ "dev": true }, "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -5829,6 +5872,15 @@ "dev": true, "requires": {} }, + "svelte-meta-tags": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/svelte-meta-tags/-/svelte-meta-tags-2.8.0.tgz", + "integrity": "sha512-CgnNNk8iJv4Ks0iAqerfvtC+qjOq6WKDvUnV30ss8k80nVC4pD6I6fGnAg/ieOuRNL1uir49zosZzwPjAsjdAQ==", + "dev": true, + "requires": { + "schema-dts": "^1.1.2" + } + }, "svelte-preprocess": { "version": "4.10.7", "resolved": "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-4.10.7.tgz", diff --git a/package.json b/package.json index e3b153e..a2935ed 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,7 @@ "imagetools-core": "^3.2.3", "prettier": "^2.8.0", "prettier-plugin-svelte": "^2.8.1", + "qrious": "^4.0.2", "sass": "^1.55.0", "semver": "^7.5.4", "sirv-cli": "^2.0.2", @@ -44,4 +45,4 @@ "asciidoctor": "^2.2.6", "marked": "^4.1.1" } -} +} \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f40d281..6a6a2aa 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -58,6 +58,9 @@ devDependencies: prettier-plugin-svelte: specifier: ^2.8.1 version: 2.10.1(prettier@2.8.8)(svelte@3.59.2) + qrious: + specifier: ^4.0.2 + version: 4.0.2 sass: specifier: ^1.55.0 version: 1.64.1 @@ -1684,6 +1687,10 @@ packages: engines: {node: '>=6'} dev: true + /qrious@4.0.2: + resolution: {integrity: sha512-xWPJIrK1zu5Ypn898fBp8RHkT/9ibquV2Kv24S/JY9VYEhMBMKur1gHVsOiNUh7PHP9uCgejjpZUHUIXXKoU/g==} + dev: true + /queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} dev: true diff --git a/src/app.scss b/src/app.scss index 6bc733a..04b76f8 100644 --- a/src/app.scss +++ b/src/app.scss @@ -53,6 +53,7 @@ body { --grey-nine: hsla(240, 6%, 7%, 0.3); --grey-ten: hsl(230, 9.5%, 17.5%); --grey-eleven: hsl(208, 10%, 40%); + --red-one: hsl(333, 84%, 62%); --bezier-one: cubic-bezier(0.25, 0.46, 0.45, 0.94); --drop-shadow-one: 0px 4px 5px 0px rgba(0, 0, 0, 0.14), 0px 1px 10px 0px rgba(0, 0, 0, 0.12), 0px 2px 4px -1px rgba(0, 0, 0, 0.2); diff --git a/src/data/api/index.ts b/src/data/api/index.ts index a41251c..b5e45f1 100644 --- a/src/data/api/index.ts +++ b/src/data/api/index.ts @@ -1,11 +1,23 @@ import * as settings from './settings'; // API Endpoints -import type { Patch, Repository, Metadata, Asset } from '$lib/types'; +import type { + Patch, + Repository, + Metadata, + Asset, + TeamMember, + DonationPlatform, + CryptoWallet, + Social +} from '$lib/types'; -export type ReposData = Repository[]; +export type ReposData = { repositories: Repository[] }; export type PatchesData = { patches: Patch[]; packages: string[] }; export type ReleaseData = { metadata: Metadata; assets: Asset[] }; +export type TeamData = { members: TeamMember[] }; +export type DonationData = { wallets: CryptoWallet[]; platforms: DonationPlatform[] }; +export type SocialsData = { socials: Social[] }; async function get_json(endpoint: string) { const url = `${settings.api_base_url()}/${endpoint}`; @@ -13,7 +25,8 @@ async function get_json(endpoint: string) { } async function repositories(): Promise { - return await get_json('contributors').then((json) => json.repositories); + const json = await get_json('contributors'); + return { repositories: json.repositories }; } async function manager(): Promise { @@ -42,6 +55,21 @@ async function patches(): Promise { return { patches: json.patches, packages }; } +async function team(): Promise { + const json = await get_json('v2/team/members'); + return { members: json.members }; +} + +async function donate(): Promise { + const json = await get_json('v2/donations'); + return { wallets: json.donations.wallets, platforms: json.donations.links }; +} + +async function socials(): Promise { + const json = await get_json('v2/socials'); + return { socials: json.socials }; +} + export const staleTime = 5 * 60 * 1000; export const queries = { manager: { @@ -58,5 +86,20 @@ export const queries = { queryKey: ['repositories'], queryFn: repositories, staleTime + }, + team: { + queryKey: ['team'], + queryFn: team, + staleTime + }, + donate: { + queryKey: ['donate'], + queryFn: donate, + staleTime + }, + socials: { + queryKey: ['socials'], + queryFn: socials, + staleTime } }; diff --git a/src/layout/Footer/FooterHost.svelte b/src/layout/Footer/FooterHost.svelte index 066fbb1..6cb0872 100644 --- a/src/layout/Footer/FooterHost.svelte +++ b/src/layout/Footer/FooterHost.svelte @@ -3,13 +3,15 @@ import { quintOut } from 'svelte/easing'; import { queries } from '$data/api'; - import { friendlyName } from '$util/friendlyName'; import { createQuery } from '@tanstack/svelte-query'; + import { friendlyName } from '$util/friendlyName'; + import Query from '$lib/components/Query.svelte'; import FooterSection from './FooterSection.svelte'; - const query = createQuery(['repositories'], queries.repositories); + const repoQuery = createQuery(['repositories'], queries.repositories); + const socialsQuery = createQuery(['socials'], queries.socials); @@ -52,34 +54,37 @@
  • Download
  • Patches
  • Contributors
  • +
  • Donate
  • - - {#each data as { name }} -
  • - - {friendlyName(name)} - -
  • - {/each} + + {#if data} + {#each data.repositories as { name }} +
  • + + {friendlyName(name)} + +
  • + {/each} + {/if}
    - + + {#if data} + {#each data.socials as { name, url }} +
  • + {friendlyName(name)} +
  • + {/each} + {/if} +
    diff --git a/src/layout/Hero/HeroImage.svelte b/src/layout/Hero/HeroImage.svelte index d1f3e02..411b66a 100644 --- a/src/layout/Hero/HeroImage.svelte +++ b/src/layout/Hero/HeroImage.svelte @@ -1,17 +1,17 @@
    - +
    diff --git a/src/lib/components/Button.svelte b/src/lib/components/Button.svelte index 00845bb..4fd0660 100644 --- a/src/lib/components/Button.svelte +++ b/src/lib/components/Button.svelte @@ -39,7 +39,7 @@ color: var(--white); font-weight: 600; border: none; - border-radius: 12px; + border-radius: 100px; display: flex; justify-content: center; align-items: center; diff --git a/src/lib/components/Dialogue.svelte b/src/lib/components/Dialogue.svelte index 23eaad8..d639f9d 100644 --- a/src/lib/components/Dialogue.svelte +++ b/src/lib/components/Dialogue.svelte @@ -122,7 +122,6 @@ border-radius: 26px; background-color: var(--grey-six); display: flex; - user-select: none; gap: 5%; white-space: normal; display: flex; diff --git a/src/lib/components/Snackbar.svelte b/src/lib/components/Snackbar.svelte new file mode 100644 index 0000000..700e5c5 --- /dev/null +++ b/src/lib/components/Snackbar.svelte @@ -0,0 +1,61 @@ + + +{#if open} +
    +
    + +
    +
    +{/if} + + \ No newline at end of file diff --git a/src/lib/components/Spinner.svelte b/src/lib/components/Spinner.svelte index a3cc765..5f61521 100644 --- a/src/lib/components/Spinner.svelte +++ b/src/lib/components/Spinner.svelte @@ -11,17 +11,24 @@ } } - .spinner:before { - content: ''; - box-sizing: border-box; - width: 50px; - height: 50px; - border-radius: 50%; + .spinner { position: fixed; top: 50%; left: 50%; + width: 50px; + height: 50px; + transform: translate(-50%, -50%); + } + + .spinner:before { + content: ''; + box-sizing: border-box; + position: absolute; + width: 100%; + height: 100%; + border-radius: 50%; border: 4.5px solid transparent; border-top-color: var(--accent-color); animation: spinner 0.6s linear infinite; } - + \ No newline at end of file diff --git a/src/lib/components/Svg.svelte b/src/lib/components/Svg.svelte index 3ce173e..bf74a99 100644 --- a/src/lib/components/Svg.svelte +++ b/src/lib/components/Svg.svelte @@ -9,8 +9,8 @@ xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="none" viewBox="0 0 {viewBoxHeight} {viewBoxWidth}" - style:height={svgHeight+'px'} - style:width={svgWidth+'px'} + style:height={svgHeight + 'px'} + style:width={svgWidth + 'px'} > diff --git a/src/lib/types.ts b/src/lib/types.ts index 9e6a8e0..6cadea8 100644 --- a/src/lib/types.ts +++ b/src/lib/types.ts @@ -47,3 +47,29 @@ export interface Metadata { published_at: string; body: string; } + +export interface TeamMember { + login: string; + avatar_url: string; + html_url: string; + bio?: string; +} + +export interface CryptoWallet { + network: string; + currency_code: string; + address: string; + preferred: boolean; +} + +export interface DonationPlatform { + name: string; + url: string; + preferred: boolean; +} + + +export interface Social { + name: string + url: string +} \ No newline at end of file diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index 12a6393..0f3a0d2 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -105,10 +105,12 @@ - {#if $show_loading_animation} - - {:else} - - {/if} +
    + {#if $show_loading_animation} + + {:else} + + {/if} +
    diff --git a/src/routes/contributors/+page.svelte b/src/routes/contributors/+page.svelte index f52534b..5c08559 100644 --- a/src/routes/contributors/+page.svelte +++ b/src/routes/contributors/+page.svelte @@ -46,17 +46,17 @@

    Made possible by the community.

    -

    +

    Want to show up here? Become a contributor -

    +

    - {#each data as { contributors, name: repo }} + {#each data.repositories as { contributors, name: repo }}
    @@ -82,7 +82,7 @@ margin-bottom: 0.3rem; } - h4 { + p { text-align: center; color: var(--grey-four); } diff --git a/src/routes/donate/+page.svelte b/src/routes/donate/+page.svelte new file mode 100644 index 0000000..ac92c2c --- /dev/null +++ b/src/routes/donate/+page.svelte @@ -0,0 +1,323 @@ + + + + +
    +
    +
    +

    🎉 Support ReVanced

    +

    + ReVanced offers a variety of patches, including ad-blocking, custom themes, and innovative + features. All of which is completely open source and free of charge. Donating will allow + ReVanced maintain our servers and develop new features. +

    +
    +
    + +
    +
    +

    Donate

    + + + + +

    Meet the team

    + {#if data.members.length > 0} +
    + + {#each data.members.sort(() => (Math.random() > 0.5 ? -1 : 1)) as member, i} + + {/each} +
    + {/if} +
    +
    + + + + Cryptocurrencies + + Cryptocurrencies + +
    +
    + + {#each data.wallets as wallet} + + {/each} + +
    +
    + + + +
    + + + + QR Code + + {qrCodeDialogueName} Wallet + +
    + {qrCodeValue} + +
    +
    + + + + +
    + + + Address copied to clipboard + + +