From f37b064de0837147e440abfa4253274f191dd55a Mon Sep 17 00:00:00 2001 From: ledchig Date: Sun, 4 Jan 2026 17:48:38 +0500 Subject: [PATCH] feat: add credits button to About page with dynamic contributor list and styling --- core/messages/about/en.ts | 13 + core/pages/about.ts | 47 ++- core/pages/contributors.ts | 662 +++++++++++++++++++++++++++++++++++++ web/pages/about.svelte | 274 ++++++++++++++- web/public/h+h-logo.png | Bin 0 -> 5067 bytes 5 files changed, 991 insertions(+), 5 deletions(-) create mode 100644 core/pages/contributors.ts create mode 100644 web/public/h+h-logo.png diff --git a/core/messages/about/en.ts b/core/messages/about/en.ts index f5733a40..4bf66c1d 100644 --- a/core/messages/about/en.ts +++ b/core/messages/about/en.ts @@ -1,10 +1,23 @@ import { i18n } from '../../i18n.ts' export const aboutMessages = i18n('about', { + allCiActionsAuthors: 'all CI actions authors', + allDependenciesAuthors: 'All our dependencies authors', + allNpmDependenciesAuthors: 'all npm dependencies authors', + closeCredits: 'Close credits', + companies: 'Companies', + contributors: 'Contributors', + credits: 'Credits', + devOpsTeam: 'manually list of people who helped with Docker images, nginx, etc', + evilMartians: 'Evil Martians', + hhLabs: 'h+h lab', opensource: 'This app is open source. Anyone, including developers and LLMs, can see exactly how it works and verify our promises.', + openSourceCommunity: 'Open Source Community', pageTitle: 'About', reportIssue: 'Report an issue', + slowReader: 'Slow Reader', + specialThanks: 'Special Thanks', version: 'App version', viewSources: 'View source code' }) diff --git a/core/pages/about.ts b/core/pages/about.ts index 4173010c..b9762a42 100644 --- a/core/pages/about.ts +++ b/core/pages/about.ts @@ -1,12 +1,55 @@ import { VERSION } from '@slowreader/api' +import { atom } from 'nanostores' import { createPage } from './common.ts' +import { contributorsMock } from './contributors.ts' + +export type Contributor = { + avatar_url: string + contributions: number + html_url: string + id: number + login: string + type: string +} + +const EXCLUDED_LOGINS = new Set(['actions-user', 'dependabot[bot]']) + +async function getContributors(): Promise { + let response = await fetch( + 'https://api.github.com/repos/hplush/slowreader/contributors' + ) + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`) + } + + let data = (await response.json()) as Contributor[] + return data.filter(contributor => !EXCLUDED_LOGINS.has(contributor.login)) +} export const aboutPage = createPage('about', () => { + let $credits = atom(null) + let $showCredits = atom(false) + + getContributors() + .then(data => { + $credits.set(data) + }) + .catch(() => { + $credits.set(contributorsMock) + }) + + function toggleCredits(): void { + $showCredits.set(!$showCredits.get()) + } + return { appVersion: VERSION, - exit() {}, - params: {} + credits: $credits, + exit() { }, + params: {}, + showCredits: $showCredits, + toggleCredits } }) diff --git a/core/pages/contributors.ts b/core/pages/contributors.ts new file mode 100644 index 00000000..7b6429bc --- /dev/null +++ b/core/pages/contributors.ts @@ -0,0 +1,662 @@ +export const contributorsMock = [ + { + "avatar_url": "https://avatars.githubusercontent.com/u/19343?v=4", + "contributions": 2700, + "events_url": "https://api.github.com/users/ai/events{/privacy}", + "followers_url": "https://api.github.com/users/ai/followers", + "following_url": "https://api.github.com/users/ai/following{/other_user}", + "gists_url": "https://api.github.com/users/ai/gists{/gist_id}", + "gravatar_id": "", + "html_url": "https://github.com/ai", + "id": 19343, + "login": "ai", + "node_id": "MDQ6VXNlcjE5MzQz", + "organizations_url": "https://api.github.com/users/ai/orgs", + "received_events_url": "https://api.github.com/users/ai/received_events", + "repos_url": "https://api.github.com/users/ai/repos", + "site_admin": false, + "starred_url": "https://api.github.com/users/ai/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/ai/subscriptions", + "type": "User", + "url": "https://api.github.com/users/ai", + "user_view_type": "public" + }, + { + "avatar_url": "https://avatars.githubusercontent.com/in/29110?v=4", + "contributions": 38, + "events_url": "https://api.github.com/users/dependabot%5Bbot%5D/events{/privacy}", + "followers_url": "https://api.github.com/users/dependabot%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/dependabot%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/dependabot%5Bbot%5D/gists{/gist_id}", + "gravatar_id": "", + "html_url": "https://github.com/apps/dependabot", + "id": 49699333, + "login": "dependabot[bot]", + "node_id": "MDM6Qm90NDk2OTkzMzM=", + "organizations_url": "https://api.github.com/users/dependabot%5Bbot%5D/orgs", + "received_events_url": "https://api.github.com/users/dependabot%5Bbot%5D/received_events", + "repos_url": "https://api.github.com/users/dependabot%5Bbot%5D/repos", + "site_admin": false, + "starred_url": "https://api.github.com/users/dependabot%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/dependabot%5Bbot%5D/subscriptions", + "type": "Bot", + "url": "https://api.github.com/users/dependabot%5Bbot%5D", + "user_view_type": "public" + }, + { + "avatar_url": "https://avatars.githubusercontent.com/u/146111474?v=4", + "contributions": 11, + "events_url": "https://api.github.com/users/ilyatitovich/events{/privacy}", + "followers_url": "https://api.github.com/users/ilyatitovich/followers", + "following_url": "https://api.github.com/users/ilyatitovich/following{/other_user}", + "gists_url": "https://api.github.com/users/ilyatitovich/gists{/gist_id}", + "gravatar_id": "", + "html_url": "https://github.com/ilyatitovich", + "id": 146111474, + "login": "ilyatitovich", + "node_id": "U_kgDOCLV78g", + "organizations_url": "https://api.github.com/users/ilyatitovich/orgs", + "received_events_url": "https://api.github.com/users/ilyatitovich/received_events", + "repos_url": "https://api.github.com/users/ilyatitovich/repos", + "site_admin": false, + "starred_url": "https://api.github.com/users/ilyatitovich/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/ilyatitovich/subscriptions", + "type": "User", + "url": "https://api.github.com/users/ilyatitovich", + "user_view_type": "public" + }, + { + "avatar_url": "https://avatars.githubusercontent.com/u/14779553?v=4", + "contributions": 5, + "events_url": "https://api.github.com/users/pshergie/events{/privacy}", + "followers_url": "https://api.github.com/users/pshergie/followers", + "following_url": "https://api.github.com/users/pshergie/following{/other_user}", + "gists_url": "https://api.github.com/users/pshergie/gists{/gist_id}", + "gravatar_id": "", + "html_url": "https://github.com/pshergie", + "id": 14779553, + "login": "pshergie", + "node_id": "MDQ6VXNlcjE0Nzc5NTUz", + "organizations_url": "https://api.github.com/users/pshergie/orgs", + "received_events_url": "https://api.github.com/users/pshergie/received_events", + "repos_url": "https://api.github.com/users/pshergie/repos", + "site_admin": false, + "starred_url": "https://api.github.com/users/pshergie/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/pshergie/subscriptions", + "type": "User", + "url": "https://api.github.com/users/pshergie", + "user_view_type": "public" + }, + { + "avatar_url": "https://avatars.githubusercontent.com/u/7286321?v=4", + "contributions": 5, + "events_url": "https://api.github.com/users/pekac/events{/privacy}", + "followers_url": "https://api.github.com/users/pekac/followers", + "following_url": "https://api.github.com/users/pekac/following{/other_user}", + "gists_url": "https://api.github.com/users/pekac/gists{/gist_id}", + "gravatar_id": "", + "html_url": "https://github.com/pekac", + "id": 7286321, + "login": "pekac", + "node_id": "MDQ6VXNlcjcyODYzMjE=", + "organizations_url": "https://api.github.com/users/pekac/orgs", + "received_events_url": "https://api.github.com/users/pekac/received_events", + "repos_url": "https://api.github.com/users/pekac/repos", + "site_admin": false, + "starred_url": "https://api.github.com/users/pekac/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/pekac/subscriptions", + "type": "User", + "url": "https://api.github.com/users/pekac", + "user_view_type": "public" + }, + { + "avatar_url": "https://avatars.githubusercontent.com/u/22644149?v=4", + "contributions": 5, + "events_url": "https://api.github.com/users/sashachabin/events{/privacy}", + "followers_url": "https://api.github.com/users/sashachabin/followers", + "following_url": "https://api.github.com/users/sashachabin/following{/other_user}", + "gists_url": "https://api.github.com/users/sashachabin/gists{/gist_id}", + "gravatar_id": "", + "html_url": "https://github.com/sashachabin", + "id": 22644149, + "login": "sashachabin", + "node_id": "MDQ6VXNlcjIyNjQ0MTQ5", + "organizations_url": "https://api.github.com/users/sashachabin/orgs", + "received_events_url": "https://api.github.com/users/sashachabin/received_events", + "repos_url": "https://api.github.com/users/sashachabin/repos", + "site_admin": false, + "starred_url": "https://api.github.com/users/sashachabin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/sashachabin/subscriptions", + "type": "User", + "url": "https://api.github.com/users/sashachabin", + "user_view_type": "public" + }, + { + "avatar_url": "https://avatars.githubusercontent.com/u/23486601?v=4", + "contributions": 4, + "events_url": "https://api.github.com/users/3timeslazy/events{/privacy}", + "followers_url": "https://api.github.com/users/3timeslazy/followers", + "following_url": "https://api.github.com/users/3timeslazy/following{/other_user}", + "gists_url": "https://api.github.com/users/3timeslazy/gists{/gist_id}", + "gravatar_id": "", + "html_url": "https://github.com/3timeslazy", + "id": 23486601, + "login": "3timeslazy", + "node_id": "MDQ6VXNlcjIzNDg2NjAx", + "organizations_url": "https://api.github.com/users/3timeslazy/orgs", + "received_events_url": "https://api.github.com/users/3timeslazy/received_events", + "repos_url": "https://api.github.com/users/3timeslazy/repos", + "site_admin": false, + "starred_url": "https://api.github.com/users/3timeslazy/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/3timeslazy/subscriptions", + "type": "User", + "url": "https://api.github.com/users/3timeslazy", + "user_view_type": "public" + }, + { + "avatar_url": "https://avatars.githubusercontent.com/u/38650298?v=4", + "contributions": 4, + "events_url": "https://api.github.com/users/sanchopanda/events{/privacy}", + "followers_url": "https://api.github.com/users/sanchopanda/followers", + "following_url": "https://api.github.com/users/sanchopanda/following{/other_user}", + "gists_url": "https://api.github.com/users/sanchopanda/gists{/gist_id}", + "gravatar_id": "", + "html_url": "https://github.com/sanchopanda", + "id": 38650298, + "login": "sanchopanda", + "node_id": "MDQ6VXNlcjM4NjUwMjk4", + "organizations_url": "https://api.github.com/users/sanchopanda/orgs", + "received_events_url": "https://api.github.com/users/sanchopanda/received_events", + "repos_url": "https://api.github.com/users/sanchopanda/repos", + "site_admin": false, + "starred_url": "https://api.github.com/users/sanchopanda/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/sanchopanda/subscriptions", + "type": "User", + "url": "https://api.github.com/users/sanchopanda", + "user_view_type": "public" + }, + { + "avatar_url": "https://avatars.githubusercontent.com/u/229588?v=4", + "contributions": 3, + "events_url": "https://api.github.com/users/ashlkv/events{/privacy}", + "followers_url": "https://api.github.com/users/ashlkv/followers", + "following_url": "https://api.github.com/users/ashlkv/following{/other_user}", + "gists_url": "https://api.github.com/users/ashlkv/gists{/gist_id}", + "gravatar_id": "", + "html_url": "https://github.com/ashlkv", + "id": 229588, + "login": "ashlkv", + "node_id": "MDQ6VXNlcjIyOTU4OA==", + "organizations_url": "https://api.github.com/users/ashlkv/orgs", + "received_events_url": "https://api.github.com/users/ashlkv/received_events", + "repos_url": "https://api.github.com/users/ashlkv/repos", + "site_admin": false, + "starred_url": "https://api.github.com/users/ashlkv/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/ashlkv/subscriptions", + "type": "User", + "url": "https://api.github.com/users/ashlkv", + "user_view_type": "public" + }, + { + "avatar_url": "https://avatars.githubusercontent.com/u/65916846?v=4", + "contributions": 3, + "events_url": "https://api.github.com/users/actions-user/events{/privacy}", + "followers_url": "https://api.github.com/users/actions-user/followers", + "following_url": "https://api.github.com/users/actions-user/following{/other_user}", + "gists_url": "https://api.github.com/users/actions-user/gists{/gist_id}", + "gravatar_id": "", + "html_url": "https://github.com/actions-user", + "id": 65916846, + "login": "actions-user", + "node_id": "MDQ6VXNlcjY1OTE2ODQ2", + "organizations_url": "https://api.github.com/users/actions-user/orgs", + "received_events_url": "https://api.github.com/users/actions-user/received_events", + "repos_url": "https://api.github.com/users/actions-user/repos", + "site_admin": false, + "starred_url": "https://api.github.com/users/actions-user/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/actions-user/subscriptions", + "type": "User", + "url": "https://api.github.com/users/actions-user", + "user_view_type": "public" + }, + { + "avatar_url": "https://avatars.githubusercontent.com/u/33755274?v=4", + "contributions": 3, + "events_url": "https://api.github.com/users/toplenboren/events{/privacy}", + "followers_url": "https://api.github.com/users/toplenboren/followers", + "following_url": "https://api.github.com/users/toplenboren/following{/other_user}", + "gists_url": "https://api.github.com/users/toplenboren/gists{/gist_id}", + "gravatar_id": "", + "html_url": "https://github.com/toplenboren", + "id": 33755274, + "login": "toplenboren", + "node_id": "MDQ6VXNlcjMzNzU1Mjc0", + "organizations_url": "https://api.github.com/users/toplenboren/orgs", + "received_events_url": "https://api.github.com/users/toplenboren/received_events", + "repos_url": "https://api.github.com/users/toplenboren/repos", + "site_admin": false, + "starred_url": "https://api.github.com/users/toplenboren/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/toplenboren/subscriptions", + "type": "User", + "url": "https://api.github.com/users/toplenboren", + "user_view_type": "public" + }, + { + "avatar_url": "https://avatars.githubusercontent.com/u/131331?v=4", + "contributions": 3, + "events_url": "https://api.github.com/users/Konfuze/events{/privacy}", + "followers_url": "https://api.github.com/users/Konfuze/followers", + "following_url": "https://api.github.com/users/Konfuze/following{/other_user}", + "gists_url": "https://api.github.com/users/Konfuze/gists{/gist_id}", + "gravatar_id": "", + "html_url": "https://github.com/Konfuze", + "id": 131331, + "login": "Konfuze", + "node_id": "MDQ6VXNlcjEzMTMzMQ==", + "organizations_url": "https://api.github.com/users/Konfuze/orgs", + "received_events_url": "https://api.github.com/users/Konfuze/received_events", + "repos_url": "https://api.github.com/users/Konfuze/repos", + "site_admin": false, + "starred_url": "https://api.github.com/users/Konfuze/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Konfuze/subscriptions", + "type": "User", + "url": "https://api.github.com/users/Konfuze", + "user_view_type": "public" + }, + { + "avatar_url": "https://avatars.githubusercontent.com/u/23308777?v=4", + "contributions": 2, + "events_url": "https://api.github.com/users/uuladzislau/events{/privacy}", + "followers_url": "https://api.github.com/users/uuladzislau/followers", + "following_url": "https://api.github.com/users/uuladzislau/following{/other_user}", + "gists_url": "https://api.github.com/users/uuladzislau/gists{/gist_id}", + "gravatar_id": "", + "html_url": "https://github.com/uuladzislau", + "id": 23308777, + "login": "uuladzislau", + "node_id": "MDQ6VXNlcjIzMzA4Nzc3", + "organizations_url": "https://api.github.com/users/uuladzislau/orgs", + "received_events_url": "https://api.github.com/users/uuladzislau/received_events", + "repos_url": "https://api.github.com/users/uuladzislau/repos", + "site_admin": false, + "starred_url": "https://api.github.com/users/uuladzislau/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/uuladzislau/subscriptions", + "type": "User", + "url": "https://api.github.com/users/uuladzislau", + "user_view_type": "public" + }, + { + "avatar_url": "https://avatars.githubusercontent.com/u/6684419?v=4", + "contributions": 2, + "events_url": "https://api.github.com/users/chafilin/events{/privacy}", + "followers_url": "https://api.github.com/users/chafilin/followers", + "following_url": "https://api.github.com/users/chafilin/following{/other_user}", + "gists_url": "https://api.github.com/users/chafilin/gists{/gist_id}", + "gravatar_id": "", + "html_url": "https://github.com/chafilin", + "id": 6684419, + "login": "chafilin", + "node_id": "MDQ6VXNlcjY2ODQ0MTk=", + "organizations_url": "https://api.github.com/users/chafilin/orgs", + "received_events_url": "https://api.github.com/users/chafilin/received_events", + "repos_url": "https://api.github.com/users/chafilin/repos", + "site_admin": false, + "starred_url": "https://api.github.com/users/chafilin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/chafilin/subscriptions", + "type": "User", + "url": "https://api.github.com/users/chafilin", + "user_view_type": "public" + }, + { + "avatar_url": "https://avatars.githubusercontent.com/u/73839778?v=4", + "contributions": 2, + "events_url": "https://api.github.com/users/Edward-Leopold/events{/privacy}", + "followers_url": "https://api.github.com/users/Edward-Leopold/followers", + "following_url": "https://api.github.com/users/Edward-Leopold/following{/other_user}", + "gists_url": "https://api.github.com/users/Edward-Leopold/gists{/gist_id}", + "gravatar_id": "", + "html_url": "https://github.com/Edward-Leopold", + "id": 73839778, + "login": "Edward-Leopold", + "node_id": "MDQ6VXNlcjczODM5Nzc4", + "organizations_url": "https://api.github.com/users/Edward-Leopold/orgs", + "received_events_url": "https://api.github.com/users/Edward-Leopold/received_events", + "repos_url": "https://api.github.com/users/Edward-Leopold/repos", + "site_admin": false, + "starred_url": "https://api.github.com/users/Edward-Leopold/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Edward-Leopold/subscriptions", + "type": "User", + "url": "https://api.github.com/users/Edward-Leopold", + "user_view_type": "public" + }, + { + "avatar_url": "https://avatars.githubusercontent.com/u/124433850?v=4", + "contributions": 2, + "events_url": "https://api.github.com/users/AnnaGolmakova/events{/privacy}", + "followers_url": "https://api.github.com/users/AnnaGolmakova/followers", + "following_url": "https://api.github.com/users/AnnaGolmakova/following{/other_user}", + "gists_url": "https://api.github.com/users/AnnaGolmakova/gists{/gist_id}", + "gravatar_id": "", + "html_url": "https://github.com/AnnaGolmakova", + "id": 124433850, + "login": "AnnaGolmakova", + "node_id": "U_kgDOB2q1ug", + "organizations_url": "https://api.github.com/users/AnnaGolmakova/orgs", + "received_events_url": "https://api.github.com/users/AnnaGolmakova/received_events", + "repos_url": "https://api.github.com/users/AnnaGolmakova/repos", + "site_admin": false, + "starred_url": "https://api.github.com/users/AnnaGolmakova/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/AnnaGolmakova/subscriptions", + "type": "User", + "url": "https://api.github.com/users/AnnaGolmakova", + "user_view_type": "public" + }, + { + "avatar_url": "https://avatars.githubusercontent.com/u/12436035?v=4", + "contributions": 2, + "events_url": "https://api.github.com/users/upteran/events{/privacy}", + "followers_url": "https://api.github.com/users/upteran/followers", + "following_url": "https://api.github.com/users/upteran/following{/other_user}", + "gists_url": "https://api.github.com/users/upteran/gists{/gist_id}", + "gravatar_id": "", + "html_url": "https://github.com/upteran", + "id": 12436035, + "login": "upteran", + "node_id": "MDQ6VXNlcjEyNDM2MDM1", + "organizations_url": "https://api.github.com/users/upteran/orgs", + "received_events_url": "https://api.github.com/users/upteran/received_events", + "repos_url": "https://api.github.com/users/upteran/repos", + "site_admin": false, + "starred_url": "https://api.github.com/users/upteran/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/upteran/subscriptions", + "type": "User", + "url": "https://api.github.com/users/upteran", + "user_view_type": "public" + }, + { + "avatar_url": "https://avatars.githubusercontent.com/u/47776594?v=4", + "contributions": 1, + "events_url": "https://api.github.com/users/baileys-li/events{/privacy}", + "followers_url": "https://api.github.com/users/baileys-li/followers", + "following_url": "https://api.github.com/users/baileys-li/following{/other_user}", + "gists_url": "https://api.github.com/users/baileys-li/gists{/gist_id}", + "gravatar_id": "", + "html_url": "https://github.com/baileys-li", + "id": 47776594, + "login": "baileys-li", + "node_id": "MDQ6VXNlcjQ3Nzc2NTk0", + "organizations_url": "https://api.github.com/users/baileys-li/orgs", + "received_events_url": "https://api.github.com/users/baileys-li/received_events", + "repos_url": "https://api.github.com/users/baileys-li/repos", + "site_admin": false, + "starred_url": "https://api.github.com/users/baileys-li/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/baileys-li/subscriptions", + "type": "User", + "url": "https://api.github.com/users/baileys-li", + "user_view_type": "public" + }, + { + "avatar_url": "https://avatars.githubusercontent.com/u/28816324?v=4", + "contributions": 1, + "events_url": "https://api.github.com/users/usmanyunusov/events{/privacy}", + "followers_url": "https://api.github.com/users/usmanyunusov/followers", + "following_url": "https://api.github.com/users/usmanyunusov/following{/other_user}", + "gists_url": "https://api.github.com/users/usmanyunusov/gists{/gist_id}", + "gravatar_id": "", + "html_url": "https://github.com/usmanyunusov", + "id": 28816324, + "login": "usmanyunusov", + "node_id": "MDQ6VXNlcjI4ODE2MzI0", + "organizations_url": "https://api.github.com/users/usmanyunusov/orgs", + "received_events_url": "https://api.github.com/users/usmanyunusov/received_events", + "repos_url": "https://api.github.com/users/usmanyunusov/repos", + "site_admin": false, + "starred_url": "https://api.github.com/users/usmanyunusov/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/usmanyunusov/subscriptions", + "type": "User", + "url": "https://api.github.com/users/usmanyunusov", + "user_view_type": "public" + }, + { + "avatar_url": "https://avatars.githubusercontent.com/u/52201?v=4", + "contributions": 1, + "events_url": "https://api.github.com/users/kossnocorp/events{/privacy}", + "followers_url": "https://api.github.com/users/kossnocorp/followers", + "following_url": "https://api.github.com/users/kossnocorp/following{/other_user}", + "gists_url": "https://api.github.com/users/kossnocorp/gists{/gist_id}", + "gravatar_id": "", + "html_url": "https://github.com/kossnocorp", + "id": 52201, + "login": "kossnocorp", + "node_id": "MDQ6VXNlcjUyMjAx", + "organizations_url": "https://api.github.com/users/kossnocorp/orgs", + "received_events_url": "https://api.github.com/users/kossnocorp/received_events", + "repos_url": "https://api.github.com/users/kossnocorp/repos", + "site_admin": false, + "starred_url": "https://api.github.com/users/kossnocorp/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/kossnocorp/subscriptions", + "type": "User", + "url": "https://api.github.com/users/kossnocorp", + "user_view_type": "public" + }, + { + "avatar_url": "https://avatars.githubusercontent.com/u/40913082?v=4", + "contributions": 1, + "events_url": "https://api.github.com/users/Kamino0/events{/privacy}", + "followers_url": "https://api.github.com/users/Kamino0/followers", + "following_url": "https://api.github.com/users/Kamino0/following{/other_user}", + "gists_url": "https://api.github.com/users/Kamino0/gists{/gist_id}", + "gravatar_id": "", + "html_url": "https://github.com/Kamino0", + "id": 40913082, + "login": "Kamino0", + "node_id": "MDQ6VXNlcjQwOTEzMDgy", + "organizations_url": "https://api.github.com/users/Kamino0/orgs", + "received_events_url": "https://api.github.com/users/Kamino0/received_events", + "repos_url": "https://api.github.com/users/Kamino0/repos", + "site_admin": false, + "starred_url": "https://api.github.com/users/Kamino0/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Kamino0/subscriptions", + "type": "User", + "url": "https://api.github.com/users/Kamino0", + "user_view_type": "public" + }, + { + "avatar_url": "https://avatars.githubusercontent.com/u/78731462?v=4", + "contributions": 1, + "events_url": "https://api.github.com/users/ninaTorgunakova/events{/privacy}", + "followers_url": "https://api.github.com/users/ninaTorgunakova/followers", + "following_url": "https://api.github.com/users/ninaTorgunakova/following{/other_user}", + "gists_url": "https://api.github.com/users/ninaTorgunakova/gists{/gist_id}", + "gravatar_id": "", + "html_url": "https://github.com/ninaTorgunakova", + "id": 78731462, + "login": "ninaTorgunakova", + "node_id": "MDQ6VXNlcjc4NzMxNDYy", + "organizations_url": "https://api.github.com/users/ninaTorgunakova/orgs", + "received_events_url": "https://api.github.com/users/ninaTorgunakova/received_events", + "repos_url": "https://api.github.com/users/ninaTorgunakova/repos", + "site_admin": false, + "starred_url": "https://api.github.com/users/ninaTorgunakova/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/ninaTorgunakova/subscriptions", + "type": "User", + "url": "https://api.github.com/users/ninaTorgunakova", + "user_view_type": "public" + }, + { + "avatar_url": "https://avatars.githubusercontent.com/u/6926262?v=4", + "contributions": 1, + "events_url": "https://api.github.com/users/nick318/events{/privacy}", + "followers_url": "https://api.github.com/users/nick318/followers", + "following_url": "https://api.github.com/users/nick318/following{/other_user}", + "gists_url": "https://api.github.com/users/nick318/gists{/gist_id}", + "gravatar_id": "", + "html_url": "https://github.com/nick318", + "id": 6926262, + "login": "nick318", + "node_id": "MDQ6VXNlcjY5MjYyNjI=", + "organizations_url": "https://api.github.com/users/nick318/orgs", + "received_events_url": "https://api.github.com/users/nick318/received_events", + "repos_url": "https://api.github.com/users/nick318/repos", + "site_admin": false, + "starred_url": "https://api.github.com/users/nick318/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/nick318/subscriptions", + "type": "User", + "url": "https://api.github.com/users/nick318", + "user_view_type": "public" + }, + { + "avatar_url": "https://avatars.githubusercontent.com/u/62427559?v=4", + "contributions": 1, + "events_url": "https://api.github.com/users/tainkrios/events{/privacy}", + "followers_url": "https://api.github.com/users/tainkrios/followers", + "following_url": "https://api.github.com/users/tainkrios/following{/other_user}", + "gists_url": "https://api.github.com/users/tainkrios/gists{/gist_id}", + "gravatar_id": "", + "html_url": "https://github.com/tainkrios", + "id": 62427559, + "login": "tainkrios", + "node_id": "MDQ6VXNlcjYyNDI3NTU5", + "organizations_url": "https://api.github.com/users/tainkrios/orgs", + "received_events_url": "https://api.github.com/users/tainkrios/received_events", + "repos_url": "https://api.github.com/users/tainkrios/repos", + "site_admin": false, + "starred_url": "https://api.github.com/users/tainkrios/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/tainkrios/subscriptions", + "type": "User", + "url": "https://api.github.com/users/tainkrios", + "user_view_type": "public" + }, + { + "avatar_url": "https://avatars.githubusercontent.com/u/193210?v=4", + "contributions": 1, + "events_url": "https://api.github.com/users/easing/events{/privacy}", + "followers_url": "https://api.github.com/users/easing/followers", + "following_url": "https://api.github.com/users/easing/following{/other_user}", + "gists_url": "https://api.github.com/users/easing/gists{/gist_id}", + "gravatar_id": "", + "html_url": "https://github.com/easing", + "id": 193210, + "login": "easing", + "node_id": "MDQ6VXNlcjE5MzIxMA==", + "organizations_url": "https://api.github.com/users/easing/orgs", + "received_events_url": "https://api.github.com/users/easing/received_events", + "repos_url": "https://api.github.com/users/easing/repos", + "site_admin": false, + "starred_url": "https://api.github.com/users/easing/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/easing/subscriptions", + "type": "User", + "url": "https://api.github.com/users/easing", + "user_view_type": "public" + }, + { + "avatar_url": "https://avatars.githubusercontent.com/u/167279?v=4", + "contributions": 1, + "events_url": "https://api.github.com/users/GreenTeaCake/events{/privacy}", + "followers_url": "https://api.github.com/users/GreenTeaCake/followers", + "following_url": "https://api.github.com/users/GreenTeaCake/following{/other_user}", + "gists_url": "https://api.github.com/users/GreenTeaCake/gists{/gist_id}", + "gravatar_id": "", + "html_url": "https://github.com/GreenTeaCake", + "id": 167279, + "login": "GreenTeaCake", + "node_id": "MDQ6VXNlcjE2NzI3OQ==", + "organizations_url": "https://api.github.com/users/GreenTeaCake/orgs", + "received_events_url": "https://api.github.com/users/GreenTeaCake/received_events", + "repos_url": "https://api.github.com/users/GreenTeaCake/repos", + "site_admin": false, + "starred_url": "https://api.github.com/users/GreenTeaCake/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/GreenTeaCake/subscriptions", + "type": "User", + "url": "https://api.github.com/users/GreenTeaCake", + "user_view_type": "public" + }, + { + "avatar_url": "https://avatars.githubusercontent.com/u/63065?v=4", + "contributions": 1, + "events_url": "https://api.github.com/users/devgru/events{/privacy}", + "followers_url": "https://api.github.com/users/devgru/followers", + "following_url": "https://api.github.com/users/devgru/following{/other_user}", + "gists_url": "https://api.github.com/users/devgru/gists{/gist_id}", + "gravatar_id": "", + "html_url": "https://github.com/devgru", + "id": 63065, + "login": "devgru", + "node_id": "MDQ6VXNlcjYzMDY1", + "organizations_url": "https://api.github.com/users/devgru/orgs", + "received_events_url": "https://api.github.com/users/devgru/received_events", + "repos_url": "https://api.github.com/users/devgru/repos", + "site_admin": false, + "starred_url": "https://api.github.com/users/devgru/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/devgru/subscriptions", + "type": "User", + "url": "https://api.github.com/users/devgru", + "user_view_type": "public" + }, + { + "avatar_url": "https://avatars.githubusercontent.com/u/254647?v=4", + "contributions": 1, + "events_url": "https://api.github.com/users/alsuren/events{/privacy}", + "followers_url": "https://api.github.com/users/alsuren/followers", + "following_url": "https://api.github.com/users/alsuren/following{/other_user}", + "gists_url": "https://api.github.com/users/alsuren/gists{/gist_id}", + "gravatar_id": "", + "html_url": "https://github.com/alsuren", + "id": 254647, + "login": "alsuren", + "node_id": "MDQ6VXNlcjI1NDY0Nw==", + "organizations_url": "https://api.github.com/users/alsuren/orgs", + "received_events_url": "https://api.github.com/users/alsuren/received_events", + "repos_url": "https://api.github.com/users/alsuren/repos", + "site_admin": false, + "starred_url": "https://api.github.com/users/alsuren/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/alsuren/subscriptions", + "type": "User", + "url": "https://api.github.com/users/alsuren", + "user_view_type": "public" + }, + { + "avatar_url": "https://avatars.githubusercontent.com/u/36270?v=4", + "contributions": 1, + "events_url": "https://api.github.com/users/Guria/events{/privacy}", + "followers_url": "https://api.github.com/users/Guria/followers", + "following_url": "https://api.github.com/users/Guria/following{/other_user}", + "gists_url": "https://api.github.com/users/Guria/gists{/gist_id}", + "gravatar_id": "", + "html_url": "https://github.com/Guria", + "id": 36270, + "login": "Guria", + "node_id": "MDQ6VXNlcjM2Mjcw", + "organizations_url": "https://api.github.com/users/Guria/orgs", + "received_events_url": "https://api.github.com/users/Guria/received_events", + "repos_url": "https://api.github.com/users/Guria/repos", + "site_admin": false, + "starred_url": "https://api.github.com/users/Guria/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/Guria/subscriptions", + "type": "User", + "url": "https://api.github.com/users/Guria", + "user_view_type": "public" + }, + { + "avatar_url": "https://avatars.githubusercontent.com/u/10295457?v=4", + "contributions": 1, + "events_url": "https://api.github.com/users/privorotskii/events{/privacy}", + "followers_url": "https://api.github.com/users/privorotskii/followers", + "following_url": "https://api.github.com/users/privorotskii/following{/other_user}", + "gists_url": "https://api.github.com/users/privorotskii/gists{/gist_id}", + "gravatar_id": "", + "html_url": "https://github.com/privorotskii", + "id": 10295457, + "login": "privorotskii", + "node_id": "MDQ6VXNlcjEwMjk1NDU3", + "organizations_url": "https://api.github.com/users/privorotskii/orgs", + "received_events_url": "https://api.github.com/users/privorotskii/received_events", + "repos_url": "https://api.github.com/users/privorotskii/repos", + "site_admin": false, + "starred_url": "https://api.github.com/users/privorotskii/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/privorotskii/subscriptions", + "type": "User", + "url": "https://api.github.com/users/privorotskii", + "user_view_type": "public" + } +] diff --git a/web/pages/about.svelte b/web/pages/about.svelte index 9e488db1..162043a9 100644 --- a/web/pages/about.svelte +++ b/web/pages/about.svelte @@ -1,9 +1,17 @@ - Slow Reader + {$t.slowReader} @@ -43,5 +66,250 @@ > {$t.reportIssue} + + +{#if $showCredits} + +{/if} + + diff --git a/web/public/h+h-logo.png b/web/public/h+h-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..255684d84c06542837d82b5243e569dc04c32797 GIT binary patch literal 5067 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 literal 0 HcmV?d00001