├── .github └── dependabot.yml ├── .gitignore ├── README.md ├── package-lock.json ├── package.json └── src ├── .gitignore ├── .vuepress ├── config.js ├── public │ ├── .well-known │ │ └── assetlinks.json │ ├── icon │ │ ├── android-icon-144x144.png │ │ ├── android-icon-192x192.png │ │ ├── android-icon-36x36.png │ │ ├── android-icon-48x48.png │ │ ├── android-icon-72x72.png │ │ ├── android-icon-96x96.png │ │ ├── apple-icon-114x114.png │ │ ├── apple-icon-120x120.png │ │ ├── apple-icon-144x144.png │ │ ├── apple-icon-152x152.png │ │ ├── apple-icon-180x180.png │ │ ├── apple-icon-57x57.png │ │ ├── apple-icon-60x60.png │ │ ├── apple-icon-72x72.png │ │ ├── apple-icon-76x76.png │ │ ├── apple-icon-precomposed.png │ │ ├── apple-icon.png │ │ ├── browserconfig.xml │ │ ├── favicon-16x16.png │ │ ├── favicon-32x32.png │ │ ├── favicon-96x96.png │ │ ├── favicon.ico │ │ ├── manifest.json │ │ ├── ms-icon-144x144.png │ │ ├── ms-icon-150x150.png │ │ ├── ms-icon-310x310.png │ │ └── ms-icon-70x70.png │ ├── images │ │ ├── Appearance.png │ │ ├── Chat.png │ │ ├── Experimental.png │ │ └── General.png │ └── logo.png └── theme │ ├── LICENSE │ ├── components │ ├── AlgoliaSearchBox.vue │ ├── Download.vue │ ├── DropdownLink.vue │ ├── DropdownTransition.vue │ ├── Home.vue │ ├── NavLink.vue │ ├── NavLinks.vue │ ├── Navbar.vue │ ├── Page.vue │ ├── PageEdit.vue │ ├── PageNav.vue │ ├── Sidebar.vue │ ├── SidebarButton.vue │ ├── SidebarGroup.vue │ ├── SidebarLink.vue │ └── SidebarLinks.vue │ ├── global-components │ └── Badge.vue │ ├── index.js │ ├── layouts │ ├── 404.vue │ └── Layout.vue │ ├── noopModule.js │ ├── styles │ ├── arrow.styl │ ├── code.styl │ ├── config.styl │ ├── custom-blocks.styl │ ├── index.styl │ ├── mobile.styl │ ├── palette.styl │ ├── toc.styl │ └── wrapper.styl │ └── util │ └── index.js ├── README.md ├── changelog.md ├── download.md ├── features.md ├── privacy.md └── zh-hans ├── README.md └── download.md /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | 4 | # Maintain dependencies for npm 5 | - package-ecosystem: "npm" 6 | directory: "/" 7 | schedule: 8 | interval: "daily" 9 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | /.vscode 3 | /node_modules -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # nekogram-files 2 | Websites for Nekogram. 3 | 4 | Check out the source code of Nekogram at [here](https://github.com/Nekogram/Nekogram). 5 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "scripts": { 3 | "dev": "vuepress dev src", 4 | "build": "vuepress build src" 5 | }, 6 | "devDependencies": { 7 | "@vuepress/plugin-google-analytics": "^1.9.10", 8 | "@vuepress/plugin-medium-zoom": "^1.9.10", 9 | "vuepress": "^1.9.10", 10 | "vuepress-plugin-autometa": "^0.1.13", 11 | "vuepress-plugin-clean-urls": "^1.1.2", 12 | "vuepress-plugin-sitemap": "^2.3.1" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/.gitignore: -------------------------------------------------------------------------------- 1 | /.vuepress/dist -------------------------------------------------------------------------------- /src/.vuepress/config.js: -------------------------------------------------------------------------------- 1 | const langMap = { 2 | "zh-Hans": "zh-cn", 3 | } 4 | 5 | var timestampCache = {} 6 | 7 | module.exports = { 8 | evergreen: true, 9 | base: '/', 10 | title: 'Nekogram', 11 | head: [ 12 | ['link', { 13 | rel: 'stylesheet', 14 | href: 'https://fonts.googleapis.com/css?family=Roboto+Mono&display=swap', 15 | media: 'print', 16 | onload: "this.media='all'" 17 | }], 18 | ['link', { 19 | rel: 'stylesheet', 20 | href: 'https://raw.rikka.app/css/SourceCodePro-BDC.css', 21 | media: 'print', 22 | onload: "this.media='all'" 23 | }], 24 | ['link', { 25 | rel: 'stylesheet', 26 | href: 'https://cdn.jsdelivr.net/gh/RikkaW/webfonts@4/css/Roboto-VF.css', 27 | media: 'print', 28 | onload: "this.media='all'" 29 | }], 30 | ['link', { 31 | rel: 'stylesheet', 32 | href: 'https://cdn.jsdelivr.net/gh/RikkaW/webfonts@4/css/NotoSansCJK-SC-VF.css', 33 | media: 'print', 34 | onload: "this.media='all'" 35 | }], 36 | ['link', { 37 | rel: 'stylesheet', 38 | href: 'https://cdn.jsdelivr.net/gh/RikkaW/webfonts@4/css/NotoSansCJK-TC-VF.css', 39 | media: 'print', 40 | onload: "this.media='all'" 41 | }], 42 | ['link', { rel: 'apple-touch-icon', size: '57x57', href: '/icon/apple-icon-57x57.png' }], 43 | ['link', { rel: 'apple-touch-icon', size: '60x60', href: '/icon/apple-icon-60x60.png' }], 44 | ['link', { rel: 'apple-touch-icon', size: '72x72', href: '/icon/apple-icon-72x72.png' }], 45 | ['link', { rel: 'apple-touch-icon', size: '76x76', href: '/icon/apple-icon-76x76.png' }], 46 | ['link', { rel: 'apple-touch-icon', size: '114x114', href: '/icon/apple-icon-114x114.png' }], 47 | ['link', { rel: 'apple-touch-icon', size: '120x120', href: '/icon/apple-icon-120x120.png' }], 48 | ['link', { rel: 'apple-touch-icon', size: '144x144', href: '/icon/apple-icon-144x144.png' }], 49 | ['link', { rel: 'apple-touch-icon', size: '152x152', href: '/icon/apple-icon-152x152.png' }], 50 | ['link', { rel: 'apple-touch-icon', size: '180x180', href: '/icon/apple-icon-180x180.png' }], 51 | ['link', { rel: 'icon', type: 'image/png', size: '192x192', href: '/icon/android-icon-192x192.png' }], 52 | ['link', { rel: 'icon', type: 'image/png', size: '32x32', href: '/icon/favicon-32x32.png' }], 53 | ['link', { rel: 'icon', type: 'image/png', size: '96x96', href: '/icon/favicon-96x96.png' }], 54 | ['link', { rel: 'icon', type: 'image/png', size: '16x16', href: '/icon/favicon-16x16.png' }], 55 | ['script', { async: true, src: 'https://www.googletagmanager.com/gtag/js?id=G-BFBNXGKZQW' }], 56 | ['script', {}, ["window.dataLayer = window.dataLayer || [];\nfunction gtag(){dataLayer.push(arguments);}\ngtag('js', new Date());\ngtag('config', 'G-BFBNXGKZQW');"]], 57 | ], 58 | locales: { 59 | '/': { 60 | lang: 'en' 61 | }, 62 | '/zh-hans/': { 63 | lang: 'zh-Hans' 64 | }, 65 | }, 66 | themeConfig: { 67 | locales: { 68 | '/': { 69 | selectText: 'Languages', 70 | label: 'English', 71 | nav: getNavbar('/', 'Features', 'Download', 'Changelog', 'Translations'), 72 | }, 73 | '/zh-hans/': { 74 | selectText: '语言', 75 | label: '简体中文', 76 | editLinkText: '在 GitHub 上编辑此页', 77 | nav: getNavbar('/zh-hans/', '特性', '下载', '更新日志', '翻译'), 78 | } 79 | }, 80 | displayAllHeaders: true, 81 | sidebarDepth: 2, 82 | repo: 'https://github.com/Nekogram/Nekogram', 83 | docsRepo: 'https://github.com/Nekogram/files', 84 | docsBranch: 'main', 85 | docsDir: 'src', 86 | editLinks: true 87 | }, 88 | plugins: [ 89 | [ 90 | 'sitemap', 91 | { 92 | hostname: 'https://nekogram.app', 93 | exclude: ['/404.html'], 94 | } 95 | ], 96 | [ 97 | 'clean-urls', 98 | { 99 | normalSuffix: '/', 100 | indexSuffix: '/', 101 | notFoundPath: '/404.html' 102 | } 103 | ], 104 | [ 105 | 'autometa', 106 | { 107 | site: { 108 | name: 'Nekogram', 109 | }, 110 | canonical_base: 'https://nekogram.app', 111 | } 112 | ], 113 | ['@vuepress/medium-zoom'] 114 | ] 115 | } 116 | 117 | function getNavbar(prefix, features, download, changelog, translations) { 118 | return [ 119 | //{ text: features, link: `${prefix}features.html` }, 120 | { text: download, link: `${prefix}download/` }, 121 | { text: changelog, link: `/changelog/` }, 122 | { text: translations, link: `https://neko.crowdin.com/nekogram` }, 123 | ] 124 | } 125 | -------------------------------------------------------------------------------- /src/.vuepress/public/.well-known/assetlinks.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "relation": ["delegate_permission/common.handle_all_urls"], 4 | "target": { 5 | "namespace": "android_app", 6 | "package_name": "tw.nekomimi.nekogram", 7 | "sha256_cert_fingerprints": 8 | ["5C:E9:32:B9:70:19:9F:BD:A2:AA:E7:BF:21:E1:AD:9E:70:B0:80:9A:7B:1A:C9:4C:06:99:F5:D5:AD:A8:33:13"] 9 | } 10 | }, 11 | { 12 | "relation": ["delegate_permission/common.handle_all_urls"], 13 | "target": { 14 | "namespace": "android_app", 15 | "package_name": "tw.nekomimi.nekogram.beta", 16 | "sha256_cert_fingerprints": 17 | ["5C:E9:32:B9:70:19:9F:BD:A2:AA:E7:BF:21:E1:AD:9E:70:B0:80:9A:7B:1A:C9:4C:06:99:F5:D5:AD:A8:33:13"] 18 | } 19 | } 20 | ] -------------------------------------------------------------------------------- /src/.vuepress/public/icon/android-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nekogram/files/324a76a5eb37461fc20d7d62a5782924e45ae8b9/src/.vuepress/public/icon/android-icon-144x144.png -------------------------------------------------------------------------------- /src/.vuepress/public/icon/android-icon-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nekogram/files/324a76a5eb37461fc20d7d62a5782924e45ae8b9/src/.vuepress/public/icon/android-icon-192x192.png -------------------------------------------------------------------------------- /src/.vuepress/public/icon/android-icon-36x36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nekogram/files/324a76a5eb37461fc20d7d62a5782924e45ae8b9/src/.vuepress/public/icon/android-icon-36x36.png -------------------------------------------------------------------------------- /src/.vuepress/public/icon/android-icon-48x48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nekogram/files/324a76a5eb37461fc20d7d62a5782924e45ae8b9/src/.vuepress/public/icon/android-icon-48x48.png -------------------------------------------------------------------------------- /src/.vuepress/public/icon/android-icon-72x72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nekogram/files/324a76a5eb37461fc20d7d62a5782924e45ae8b9/src/.vuepress/public/icon/android-icon-72x72.png -------------------------------------------------------------------------------- /src/.vuepress/public/icon/android-icon-96x96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nekogram/files/324a76a5eb37461fc20d7d62a5782924e45ae8b9/src/.vuepress/public/icon/android-icon-96x96.png -------------------------------------------------------------------------------- /src/.vuepress/public/icon/apple-icon-114x114.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nekogram/files/324a76a5eb37461fc20d7d62a5782924e45ae8b9/src/.vuepress/public/icon/apple-icon-114x114.png -------------------------------------------------------------------------------- /src/.vuepress/public/icon/apple-icon-120x120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nekogram/files/324a76a5eb37461fc20d7d62a5782924e45ae8b9/src/.vuepress/public/icon/apple-icon-120x120.png -------------------------------------------------------------------------------- /src/.vuepress/public/icon/apple-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nekogram/files/324a76a5eb37461fc20d7d62a5782924e45ae8b9/src/.vuepress/public/icon/apple-icon-144x144.png -------------------------------------------------------------------------------- /src/.vuepress/public/icon/apple-icon-152x152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nekogram/files/324a76a5eb37461fc20d7d62a5782924e45ae8b9/src/.vuepress/public/icon/apple-icon-152x152.png -------------------------------------------------------------------------------- /src/.vuepress/public/icon/apple-icon-180x180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nekogram/files/324a76a5eb37461fc20d7d62a5782924e45ae8b9/src/.vuepress/public/icon/apple-icon-180x180.png -------------------------------------------------------------------------------- /src/.vuepress/public/icon/apple-icon-57x57.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nekogram/files/324a76a5eb37461fc20d7d62a5782924e45ae8b9/src/.vuepress/public/icon/apple-icon-57x57.png -------------------------------------------------------------------------------- /src/.vuepress/public/icon/apple-icon-60x60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nekogram/files/324a76a5eb37461fc20d7d62a5782924e45ae8b9/src/.vuepress/public/icon/apple-icon-60x60.png -------------------------------------------------------------------------------- /src/.vuepress/public/icon/apple-icon-72x72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nekogram/files/324a76a5eb37461fc20d7d62a5782924e45ae8b9/src/.vuepress/public/icon/apple-icon-72x72.png -------------------------------------------------------------------------------- /src/.vuepress/public/icon/apple-icon-76x76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nekogram/files/324a76a5eb37461fc20d7d62a5782924e45ae8b9/src/.vuepress/public/icon/apple-icon-76x76.png -------------------------------------------------------------------------------- /src/.vuepress/public/icon/apple-icon-precomposed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nekogram/files/324a76a5eb37461fc20d7d62a5782924e45ae8b9/src/.vuepress/public/icon/apple-icon-precomposed.png -------------------------------------------------------------------------------- /src/.vuepress/public/icon/apple-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nekogram/files/324a76a5eb37461fc20d7d62a5782924e45ae8b9/src/.vuepress/public/icon/apple-icon.png -------------------------------------------------------------------------------- /src/.vuepress/public/icon/browserconfig.xml: -------------------------------------------------------------------------------- 1 | 2 | #ffffff -------------------------------------------------------------------------------- /src/.vuepress/public/icon/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nekogram/files/324a76a5eb37461fc20d7d62a5782924e45ae8b9/src/.vuepress/public/icon/favicon-16x16.png -------------------------------------------------------------------------------- /src/.vuepress/public/icon/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nekogram/files/324a76a5eb37461fc20d7d62a5782924e45ae8b9/src/.vuepress/public/icon/favicon-32x32.png -------------------------------------------------------------------------------- /src/.vuepress/public/icon/favicon-96x96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nekogram/files/324a76a5eb37461fc20d7d62a5782924e45ae8b9/src/.vuepress/public/icon/favicon-96x96.png -------------------------------------------------------------------------------- /src/.vuepress/public/icon/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nekogram/files/324a76a5eb37461fc20d7d62a5782924e45ae8b9/src/.vuepress/public/icon/favicon.ico -------------------------------------------------------------------------------- /src/.vuepress/public/icon/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "App", 3 | "icons": [ 4 | { 5 | "src": "\/android-icon-36x36.png", 6 | "sizes": "36x36", 7 | "type": "image\/png", 8 | "density": "0.75" 9 | }, 10 | { 11 | "src": "\/android-icon-48x48.png", 12 | "sizes": "48x48", 13 | "type": "image\/png", 14 | "density": "1.0" 15 | }, 16 | { 17 | "src": "\/android-icon-72x72.png", 18 | "sizes": "72x72", 19 | "type": "image\/png", 20 | "density": "1.5" 21 | }, 22 | { 23 | "src": "\/android-icon-96x96.png", 24 | "sizes": "96x96", 25 | "type": "image\/png", 26 | "density": "2.0" 27 | }, 28 | { 29 | "src": "\/android-icon-144x144.png", 30 | "sizes": "144x144", 31 | "type": "image\/png", 32 | "density": "3.0" 33 | }, 34 | { 35 | "src": "\/android-icon-192x192.png", 36 | "sizes": "192x192", 37 | "type": "image\/png", 38 | "density": "4.0" 39 | } 40 | ] 41 | } -------------------------------------------------------------------------------- /src/.vuepress/public/icon/ms-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nekogram/files/324a76a5eb37461fc20d7d62a5782924e45ae8b9/src/.vuepress/public/icon/ms-icon-144x144.png -------------------------------------------------------------------------------- /src/.vuepress/public/icon/ms-icon-150x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nekogram/files/324a76a5eb37461fc20d7d62a5782924e45ae8b9/src/.vuepress/public/icon/ms-icon-150x150.png -------------------------------------------------------------------------------- /src/.vuepress/public/icon/ms-icon-310x310.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nekogram/files/324a76a5eb37461fc20d7d62a5782924e45ae8b9/src/.vuepress/public/icon/ms-icon-310x310.png -------------------------------------------------------------------------------- /src/.vuepress/public/icon/ms-icon-70x70.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nekogram/files/324a76a5eb37461fc20d7d62a5782924e45ae8b9/src/.vuepress/public/icon/ms-icon-70x70.png -------------------------------------------------------------------------------- /src/.vuepress/public/images/Appearance.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nekogram/files/324a76a5eb37461fc20d7d62a5782924e45ae8b9/src/.vuepress/public/images/Appearance.png -------------------------------------------------------------------------------- /src/.vuepress/public/images/Chat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nekogram/files/324a76a5eb37461fc20d7d62a5782924e45ae8b9/src/.vuepress/public/images/Chat.png -------------------------------------------------------------------------------- /src/.vuepress/public/images/Experimental.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nekogram/files/324a76a5eb37461fc20d7d62a5782924e45ae8b9/src/.vuepress/public/images/Experimental.png -------------------------------------------------------------------------------- /src/.vuepress/public/images/General.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nekogram/files/324a76a5eb37461fc20d7d62a5782924e45ae8b9/src/.vuepress/public/images/General.png -------------------------------------------------------------------------------- /src/.vuepress/public/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nekogram/files/324a76a5eb37461fc20d7d62a5782924e45ae8b9/src/.vuepress/public/logo.png -------------------------------------------------------------------------------- /src/.vuepress/theme/LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2018-present, Yuxi (Evan) You 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /src/.vuepress/theme/components/AlgoliaSearchBox.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 73 | 74 | 168 | -------------------------------------------------------------------------------- /src/.vuepress/theme/components/Download.vue: -------------------------------------------------------------------------------- 1 | 5 | 6 | -------------------------------------------------------------------------------- /src/.vuepress/theme/components/DropdownLink.vue: -------------------------------------------------------------------------------- 1 | 51 | 52 | 78 | 79 | 180 | -------------------------------------------------------------------------------- /src/.vuepress/theme/components/DropdownTransition.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 28 | 29 | 34 | -------------------------------------------------------------------------------- /src/.vuepress/theme/components/Home.vue: -------------------------------------------------------------------------------- 1 | 63 | 64 | 91 | 92 | 199 | -------------------------------------------------------------------------------- /src/.vuepress/theme/components/NavLink.vue: -------------------------------------------------------------------------------- 1 | 19 | 20 | 50 | -------------------------------------------------------------------------------- /src/.vuepress/theme/components/NavLinks.vue: -------------------------------------------------------------------------------- 1 | 35 | 36 | 117 | 118 | 150 | -------------------------------------------------------------------------------- /src/.vuepress/theme/components/Navbar.vue: -------------------------------------------------------------------------------- 1 | 38 | 39 | 87 | 88 | 133 | -------------------------------------------------------------------------------- /src/.vuepress/theme/components/Page.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 23 | 24 | 32 | -------------------------------------------------------------------------------- /src/.vuepress/theme/components/PageEdit.vue: -------------------------------------------------------------------------------- 1 | 14 | 95 | 143 | -------------------------------------------------------------------------------- /src/.vuepress/theme/components/PageNav.vue: -------------------------------------------------------------------------------- 1 | 15 | 100 | 121 | -------------------------------------------------------------------------------- /src/.vuepress/theme/components/Sidebar.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 22 | 23 | 60 | -------------------------------------------------------------------------------- /src/.vuepress/theme/components/SidebarButton.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 28 | -------------------------------------------------------------------------------- /src/.vuepress/theme/components/SidebarGroup.vue: -------------------------------------------------------------------------------- 1 | 55 | 56 | 71 | 72 | 130 | -------------------------------------------------------------------------------- /src/.vuepress/theme/components/SidebarLink.vue: -------------------------------------------------------------------------------- 1 | 95 | 96 | 126 | -------------------------------------------------------------------------------- /src/.vuepress/theme/components/SidebarLinks.vue: -------------------------------------------------------------------------------- 1 | 23 | 24 | 100 | -------------------------------------------------------------------------------- /src/.vuepress/theme/global-components/Badge.vue: -------------------------------------------------------------------------------- 1 | 25 | 26 | 45 | -------------------------------------------------------------------------------- /src/.vuepress/theme/index.js: -------------------------------------------------------------------------------- 1 | const path = require('path') 2 | 3 | // Theme API. 4 | module.exports = (options, ctx) => ({ 5 | alias() { 6 | const { themeConfig, siteConfig } = ctx 7 | // resolve algolia 8 | const isAlgoliaSearch = ( 9 | themeConfig.algolia 10 | || Object.keys(siteConfig.locales && themeConfig.locales || {}) 11 | .some(base => themeConfig.locales[base].algolia) 12 | ) 13 | return { 14 | '@AlgoliaSearchBox': isAlgoliaSearch 15 | ? path.resolve(__dirname, 'components/AlgoliaSearchBox.vue') 16 | : path.resolve(__dirname, 'noopModule.js') 17 | } 18 | }, 19 | 20 | plugins: [ 21 | ['@vuepress/active-header-links', options.activeHeaderLinks], 22 | '@vuepress/search', 23 | '@vuepress/plugin-nprogress', 24 | ['container', { 25 | type: 'tip', 26 | defaultTitle: { 27 | '/zh/': '提示' 28 | } 29 | }], 30 | ['container', { 31 | type: 'warning', 32 | defaultTitle: { 33 | '/zh/': '注意' 34 | } 35 | }], 36 | ['container', { 37 | type: 'danger', 38 | defaultTitle: { 39 | '/zh/': '警告' 40 | } 41 | }], 42 | ['container', { 43 | type: 'details', 44 | before: info => `
${info ? `${info}` : ''}\n`, 45 | after: () => '
\n' 46 | }] 47 | ] 48 | }) 49 | -------------------------------------------------------------------------------- /src/.vuepress/theme/layouts/404.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 27 | -------------------------------------------------------------------------------- /src/.vuepress/theme/layouts/Layout.vue: -------------------------------------------------------------------------------- 1 | 49 | 50 | 151 | -------------------------------------------------------------------------------- /src/.vuepress/theme/noopModule.js: -------------------------------------------------------------------------------- 1 | export default {} 2 | -------------------------------------------------------------------------------- /src/.vuepress/theme/styles/arrow.styl: -------------------------------------------------------------------------------- 1 | @require './config' 2 | 3 | .arrow 4 | display inline-block 5 | width 0 6 | height 0 7 | &.up 8 | border-left 4px solid transparent 9 | border-right 4px solid transparent 10 | border-bottom 6px solid $arrowBgColor 11 | &.down 12 | border-left 4px solid transparent 13 | border-right 4px solid transparent 14 | border-top 6px solid $arrowBgColor 15 | &.right 16 | border-top 4px solid transparent 17 | border-bottom 4px solid transparent 18 | border-left 6px solid $arrowBgColor 19 | &.left 20 | border-top 4px solid transparent 21 | border-bottom 4px solid transparent 22 | border-right 6px solid $arrowBgColor 23 | -------------------------------------------------------------------------------- /src/.vuepress/theme/styles/code.styl: -------------------------------------------------------------------------------- 1 | {$contentClass} 2 | code 3 | color lighten($textColor, 20%) 4 | padding 0.25rem 0.5rem 5 | margin 0 6 | font-size 0.85em 7 | background-color rgba(27,31,35,0.05) 8 | border-radius 3px 9 | .token 10 | &.deleted 11 | color #EC5975 12 | &.inserted 13 | color $accentColor 14 | 15 | {$contentClass} 16 | pre, pre[class*="language-"] 17 | line-height 1.4 18 | padding 1.25rem 1.5rem 19 | margin 0.85rem 0 20 | background-color $codeBgColor 21 | border-radius 6px 22 | overflow auto 23 | code 24 | color #fff 25 | padding 0 26 | background-color transparent 27 | border-radius 0 28 | 29 | div[class*="language-"] 30 | position relative 31 | background-color $codeBgColor 32 | border-radius 6px 33 | .highlight-lines 34 | user-select none 35 | padding-top 1.3rem 36 | position absolute 37 | top 0 38 | left 0 39 | width 100% 40 | line-height 1.4 41 | .highlighted 42 | background-color rgba(0, 0, 0, 66%) 43 | pre, pre[class*="language-"] 44 | background transparent 45 | position relative 46 | z-index 1 47 | &::before 48 | position absolute 49 | z-index 3 50 | top 0.8em 51 | right 1em 52 | font-size 0.75rem 53 | color rgba(255, 255, 255, 0.4) 54 | &:not(.line-numbers-mode) 55 | .line-numbers-wrapper 56 | display none 57 | &.line-numbers-mode 58 | .highlight-lines .highlighted 59 | position relative 60 | &:before 61 | content ' ' 62 | position absolute 63 | z-index 3 64 | left 0 65 | top 0 66 | display block 67 | width $lineNumbersWrapperWidth 68 | height 100% 69 | background-color rgba(0, 0, 0, 66%) 70 | pre 71 | padding-left $lineNumbersWrapperWidth + 1 rem 72 | vertical-align middle 73 | .line-numbers-wrapper 74 | position absolute 75 | top 0 76 | width $lineNumbersWrapperWidth 77 | text-align center 78 | color rgba(255, 255, 255, 0.3) 79 | padding 1.25rem 0 80 | line-height 1.4 81 | br 82 | user-select none 83 | .line-number 84 | position relative 85 | z-index 4 86 | user-select none 87 | font-size 0.85em 88 | &::after 89 | content '' 90 | position absolute 91 | z-index 2 92 | top 0 93 | left 0 94 | width $lineNumbersWrapperWidth 95 | height 100% 96 | border-radius 6px 0 0 6px 97 | border-right 1px solid rgba(0, 0, 0, 66%) 98 | background-color $codeBgColor 99 | 100 | 101 | for lang in $codeLang 102 | div{'[class~="language-' + lang + '"]'} 103 | &:before 104 | content ('' + lang) 105 | 106 | div[class~="language-javascript"] 107 | &:before 108 | content "js" 109 | 110 | div[class~="language-typescript"] 111 | &:before 112 | content "ts" 113 | 114 | div[class~="language-markup"] 115 | &:before 116 | content "html" 117 | 118 | div[class~="language-markdown"] 119 | &:before 120 | content "md" 121 | 122 | div[class~="language-json"]:before 123 | content "json" 124 | 125 | div[class~="language-ruby"]:before 126 | content "rb" 127 | 128 | div[class~="language-python"]:before 129 | content "py" 130 | 131 | div[class~="language-bash"]:before 132 | content "sh" 133 | 134 | div[class~="language-php"]:before 135 | content "php" 136 | 137 | @import '~prismjs/themes/prism-tomorrow.css' 138 | -------------------------------------------------------------------------------- /src/.vuepress/theme/styles/config.styl: -------------------------------------------------------------------------------- 1 | $contentClass = '.theme-default-content' 2 | -------------------------------------------------------------------------------- /src/.vuepress/theme/styles/custom-blocks.styl: -------------------------------------------------------------------------------- 1 | .custom-block 2 | .custom-block-title 3 | font-weight 600 4 | margin-bottom -0.4rem 5 | &.tip, &.warning, &.danger 6 | padding .1rem 1.5rem 7 | border-left-width .5rem 8 | border-left-style solid 9 | margin 1rem 0 10 | &.tip 11 | background-color #f3f5f7 12 | border-color #42b983 13 | &.warning 14 | background-color rgba(255,229,100,.3) 15 | border-color darken(#ffe564, 35%) 16 | color darken(#ffe564, 70%) 17 | .custom-block-title 18 | color darken(#ffe564, 50%) 19 | a 20 | color $textColor 21 | &.danger 22 | background-color #ffe6e6 23 | border-color darken(red, 20%) 24 | color darken(red, 70%) 25 | .custom-block-title 26 | color darken(red, 40%) 27 | a 28 | color $textColor 29 | &.details 30 | display block 31 | position relative 32 | border-radius 2px 33 | margin 1.6em 0 34 | padding 1.6em 35 | background-color #eee 36 | h4 37 | margin-top 0 38 | figure, p 39 | &:last-child 40 | margin-bottom 0 41 | padding-bottom 0 42 | summary 43 | outline none 44 | cursor pointer 45 | 46 | 47 | -------------------------------------------------------------------------------- /src/.vuepress/theme/styles/index.styl: -------------------------------------------------------------------------------- 1 | @require './config' 2 | @require './code' 3 | @require './custom-blocks' 4 | @require './arrow' 5 | @require './wrapper' 6 | @require './toc' 7 | 8 | code 9 | overflow: auto 10 | word-wrap:break-word 11 | 12 | body 13 | font-family Roboto, sans-serif 14 | 15 | body:lang(zh-hans) 16 | font-family Roboto, 'Noto Sans SC', sans-serif 17 | 18 | body:lang(zh-hant) 19 | font-family Roboto, 'Noto Sans TC', sans-serif 20 | 21 | em 22 | font-style italic 23 | font-variation-settings "ital" 1 24 | 25 | html, body 26 | padding 0 27 | margin 0 28 | background-color #fff 29 | 30 | body 31 | -webkit-font-smoothing antialiased 32 | -moz-osx-font-smoothing grayscale 33 | font-size 16px 34 | color $textColor 35 | 36 | .page 37 | padding-left $sidebarWidth 38 | 39 | .navbar 40 | position fixed 41 | z-index 20 42 | top 0 43 | left 0 44 | right 0 45 | height $navbarHeight 46 | background-color hsla(0,0%,100%,.72) 47 | box-sizing border-box 48 | border-bottom 1px solid $borderColor 49 | backdrop-filter saturate(180%) blur(20px) 50 | 51 | .sidebar-mask 52 | position fixed 53 | z-index 9 54 | top 0 55 | left 0 56 | width 100vw 57 | height 100vh 58 | display none 59 | 60 | .sidebar 61 | font-size 16px 62 | background-color hsla(0,0%,100%,.72) 63 | width $sidebarWidth 64 | position fixed 65 | z-index 10 66 | margin 0 67 | top $navbarHeight 68 | left 0 69 | bottom 0 70 | box-sizing border-box 71 | border-right 1px solid $borderColor 72 | overflow-y auto 73 | backdrop-filter saturate(180%) blur(20px) 74 | 75 | {$contentClass}:not(.custom) 76 | @extend $wrapper 77 | > *:first-child 78 | margin-top $navbarHeight 79 | 80 | a:hover 81 | text-decoration underline 82 | 83 | p.demo 84 | padding 1rem 1.5rem 85 | border 1px solid #ddd 86 | border-radius 4px 87 | 88 | img 89 | max-width 100% 90 | 91 | {$contentClass}.custom 92 | padding 0 93 | margin 0 94 | 95 | img 96 | max-width 100% 97 | 98 | a 99 | font-weight 500 100 | color $accentColor 101 | text-decoration none 102 | 103 | p a code 104 | font-weight 400 105 | color $accentColor 106 | 107 | kbd 108 | background #eee 109 | border solid 0.15rem #ddd 110 | border-bottom solid 0.25rem #ddd 111 | border-radius 0.15rem 112 | padding 0 0.15em 113 | 114 | blockquote 115 | font-size 1rem 116 | color #999; 117 | border-left .2rem solid #dfe2e5 118 | margin 1rem 0 119 | padding .25rem 0 .25rem 1rem 120 | 121 | & > p 122 | margin 0 123 | 124 | ul, ol 125 | padding-left 1.2em 126 | 127 | strong 128 | font-weight 600 129 | 130 | h1, h2, h3, h4, h5, h6 131 | font-weight 600 132 | line-height 1.25 133 | 134 | {$contentClass}:not(.custom) > & 135 | margin-top (0.5rem - $navbarHeight) 136 | padding-top ($navbarHeight + 1rem) 137 | margin-bottom 0 138 | 139 | &:first-child 140 | margin-top -1.5rem 141 | margin-bottom 1rem 142 | 143 | + p, + pre, + .custom-block 144 | margin-top 2rem 145 | 146 | &:hover .header-anchor 147 | opacity: 1 148 | 149 | h1 150 | font-size 2.2rem 151 | 152 | h2 153 | font-size 1.65rem 154 | padding-bottom .3rem 155 | border-bottom 1px solid $borderColor 156 | 157 | h3 158 | font-size 1.35rem 159 | 160 | a.header-anchor 161 | font-size 0.85em 162 | float left 163 | margin-left -0.87em 164 | padding-right 0.23em 165 | margin-top 0.125em 166 | opacity 0 167 | 168 | &:hover 169 | text-decoration none 170 | 171 | code, kbd, .line-number 172 | font-family 'Roboto Mono', 'Source Code Pro BDC', monospace 173 | 174 | p, ul, ol 175 | line-height 1.7 176 | 177 | hr 178 | border 0 179 | border-top 1px solid $borderColor 180 | 181 | table 182 | border-collapse collapse 183 | margin 1rem 0 184 | display: block 185 | overflow-x: auto 186 | 187 | tr 188 | border-top 1px solid #dfe2e5 189 | 190 | &:nth-child(2n) 191 | background-color #f6f8fa 192 | 193 | th, td 194 | border 1px solid #dfe2e5 195 | padding .6em 1em 196 | 197 | .theme-container 198 | &.sidebar-open 199 | .sidebar-mask 200 | display: block 201 | 202 | &.no-navbar 203 | {$contentClass}:not(.custom) > h1, h2, h3, h4, h5, h6 204 | margin-top 1.5rem 205 | padding-top 0 206 | 207 | .sidebar 208 | top 0 209 | 210 | 211 | @media (min-width: ($MQMobile + 1px)) 212 | .theme-container.no-sidebar 213 | .sidebar 214 | display none 215 | 216 | .page 217 | padding-left 0 218 | 219 | * { 220 | -webkit-tap-highlight-color: transparent; 221 | } 222 | 223 | @require 'mobile.styl' 224 | -------------------------------------------------------------------------------- /src/.vuepress/theme/styles/mobile.styl: -------------------------------------------------------------------------------- 1 | @require './config' 2 | 3 | $mobileSidebarWidth = $sidebarWidth * 0.82 4 | 5 | // narrow desktop / iPad 6 | @media (max-width: $MQNarrow) 7 | .sidebar 8 | font-size 15px 9 | width $mobileSidebarWidth 10 | .page 11 | padding-left $mobileSidebarWidth 12 | 13 | // wide mobile 14 | @media (max-width: $MQMobile) 15 | .sidebar 16 | top 0 17 | padding-top $navbarHeight 18 | transform translateX(-100%) 19 | transition transform .2s ease 20 | .page 21 | padding-left 0 22 | .theme-container 23 | &.sidebar-open 24 | .sidebar 25 | transform translateX(0) 26 | &.no-navbar 27 | .sidebar 28 | padding-top: 0 29 | 30 | // narrow mobile 31 | @media (max-width: $MQMobileNarrow) 32 | h1 33 | font-size 1.9rem 34 | {$contentClass} 35 | div[class*="language-"] 36 | margin 0.85rem -1.5rem 37 | border-radius 0 38 | -------------------------------------------------------------------------------- /src/.vuepress/theme/styles/palette.styl: -------------------------------------------------------------------------------- 1 | $accentColor = #01579B 2 | $textColor = #2c3e50 3 | $borderColor = #eaecef 4 | $codeBgColor = #282c34 -------------------------------------------------------------------------------- /src/.vuepress/theme/styles/toc.styl: -------------------------------------------------------------------------------- 1 | .table-of-contents 2 | .badge 3 | vertical-align middle 4 | -------------------------------------------------------------------------------- /src/.vuepress/theme/styles/wrapper.styl: -------------------------------------------------------------------------------- 1 | $wrapper 2 | max-width $contentWidth 3 | margin 0 auto 4 | padding 2rem 2.5rem 5 | @media (max-width: $MQNarrow) 6 | padding 2rem 7 | @media (max-width: $MQMobileNarrow) 8 | padding 1.5rem 9 | 10 | -------------------------------------------------------------------------------- /src/.vuepress/theme/util/index.js: -------------------------------------------------------------------------------- 1 | export const hashRE = /#.*$/ 2 | export const extRE = /\.(md|html)$/ 3 | export const endingSlashRE = /\/$/ 4 | export const outboundRE = /^[a-z]+:/i 5 | 6 | export function normalize (path) { 7 | return decodeURI(path) 8 | .replace(hashRE, '') 9 | .replace(extRE, '') 10 | } 11 | 12 | export function getHash (path) { 13 | const match = path.match(hashRE) 14 | if (match) { 15 | return match[0] 16 | } 17 | } 18 | 19 | export function isExternal (path) { 20 | return outboundRE.test(path) 21 | } 22 | 23 | export function isMailto (path) { 24 | return /^mailto:/.test(path) 25 | } 26 | 27 | export function isTel (path) { 28 | return /^tel:/.test(path) 29 | } 30 | 31 | export function ensureExt (path) { 32 | if (isExternal(path)) { 33 | return path 34 | } 35 | const hashMatch = path.match(hashRE) 36 | const hash = hashMatch ? hashMatch[0] : '' 37 | const normalized = normalize(path) 38 | 39 | if (endingSlashRE.test(normalized)) { 40 | return path 41 | } 42 | return normalized + '.html' + hash 43 | } 44 | 45 | export function isActive (route, path) { 46 | const routeHash = route.hash 47 | const linkHash = getHash(path) 48 | if (linkHash && routeHash !== linkHash) { 49 | return false 50 | } 51 | const routePath = normalize(route.path) 52 | const pagePath = normalize(path) 53 | return routePath === pagePath 54 | } 55 | 56 | export function resolvePage (pages, rawPath, base) { 57 | if (isExternal(rawPath)) { 58 | return { 59 | type: 'external', 60 | path: rawPath 61 | } 62 | } 63 | if (base) { 64 | rawPath = resolvePath(rawPath, base) 65 | } 66 | const path = normalize(rawPath) 67 | for (let i = 0; i < pages.length; i++) { 68 | if (normalize(pages[i].regularPath) === path) { 69 | return Object.assign({}, pages[i], { 70 | type: 'page', 71 | path: ensureExt(pages[i].path) 72 | }) 73 | } 74 | } 75 | console.error(`[vuepress] No matching page found for sidebar item "${rawPath}"`) 76 | return {} 77 | } 78 | 79 | function resolvePath (relative, base, append) { 80 | const firstChar = relative.charAt(0) 81 | if (firstChar === '/') { 82 | return relative 83 | } 84 | 85 | if (firstChar === '?' || firstChar === '#') { 86 | return base + relative 87 | } 88 | 89 | const stack = base.split('/') 90 | 91 | // remove trailing segment if: 92 | // - not appending 93 | // - appending to trailing slash (last segment is empty) 94 | if (!append || !stack[stack.length - 1]) { 95 | stack.pop() 96 | } 97 | 98 | // resolve relative path 99 | const segments = relative.replace(/^\//, '').split('/') 100 | for (let i = 0; i < segments.length; i++) { 101 | const segment = segments[i] 102 | if (segment === '..') { 103 | stack.pop() 104 | } else if (segment !== '.') { 105 | stack.push(segment) 106 | } 107 | } 108 | 109 | // ensure leading slash 110 | if (stack[0] !== '') { 111 | stack.unshift('') 112 | } 113 | 114 | return stack.join('/') 115 | } 116 | 117 | /** 118 | * @param { Page } page 119 | * @param { string } regularPath 120 | * @param { SiteData } site 121 | * @param { string } localePath 122 | * @returns { SidebarGroup } 123 | */ 124 | export function resolveSidebarItems (page, regularPath, site, localePath) { 125 | const { pages, themeConfig } = site 126 | 127 | const localeConfig = localePath && themeConfig.locales 128 | ? themeConfig.locales[localePath] || themeConfig 129 | : themeConfig 130 | 131 | const pageSidebarConfig = page.frontmatter.sidebar || localeConfig.sidebar || themeConfig.sidebar 132 | if (pageSidebarConfig === 'auto') { 133 | return resolveHeaders(page) 134 | } 135 | 136 | const sidebarConfig = localeConfig.sidebar || themeConfig.sidebar 137 | if (!sidebarConfig) { 138 | return [] 139 | } else { 140 | const { base, config } = resolveMatchingConfig(regularPath, sidebarConfig) 141 | return config 142 | ? config.map(item => resolveItem(item, pages, base)) 143 | : [] 144 | } 145 | } 146 | 147 | /** 148 | * @param { Page } page 149 | * @returns { SidebarGroup } 150 | */ 151 | function resolveHeaders (page) { 152 | const headers = groupHeaders(page.headers || []) 153 | return [{ 154 | type: 'group', 155 | collapsable: false, 156 | title: page.title, 157 | path: null, 158 | children: headers.map(h => ({ 159 | type: 'auto', 160 | title: h.title, 161 | basePath: page.path, 162 | path: page.path + '#' + h.slug, 163 | children: h.children || [] 164 | })) 165 | }] 166 | } 167 | 168 | export function groupHeaders (headers) { 169 | // group h3s under h2 170 | headers = headers.map(h => Object.assign({}, h)) 171 | let lastH2 172 | headers.forEach(h => { 173 | if (h.level === 2) { 174 | lastH2 = h 175 | } else if (lastH2) { 176 | (lastH2.children || (lastH2.children = [])).push(h) 177 | } 178 | }) 179 | return headers.filter(h => h.level === 2) 180 | } 181 | 182 | export function resolveNavLinkItem (linkItem) { 183 | return Object.assign(linkItem, { 184 | type: linkItem.items && linkItem.items.length ? 'links' : 'link' 185 | }) 186 | } 187 | 188 | /** 189 | * @param { Route } route 190 | * @param { Array | Array | [link: string]: SidebarConfig } config 191 | * @returns { base: string, config: SidebarConfig } 192 | */ 193 | export function resolveMatchingConfig (regularPath, config) { 194 | if (Array.isArray(config)) { 195 | return { 196 | base: '/', 197 | config: config 198 | } 199 | } 200 | for (const base in config) { 201 | if (ensureEndingSlash(regularPath).indexOf(encodeURI(base)) === 0) { 202 | return { 203 | base, 204 | config: config[base] 205 | } 206 | } 207 | } 208 | return {} 209 | } 210 | 211 | function ensureEndingSlash (path) { 212 | return /(\.html|\/)$/.test(path) 213 | ? path 214 | : path + '/' 215 | } 216 | 217 | function resolveItem (item, pages, base, groupDepth = 1) { 218 | if (typeof item === 'string') { 219 | return resolvePage(pages, item, base) 220 | } else if (Array.isArray(item)) { 221 | return Object.assign(resolvePage(pages, item[0], base), { 222 | title: item[1] 223 | }) 224 | } else { 225 | if (groupDepth > 3) { 226 | console.error( 227 | '[vuepress] detected a too deep nested sidebar group.' 228 | ) 229 | } 230 | const children = item.children || [] 231 | if (children.length === 0 && item.path) { 232 | return Object.assign(resolvePage(pages, item.path, base), { 233 | title: item.title 234 | }) 235 | } 236 | return { 237 | type: 'group', 238 | path: item.path, 239 | title: item.title, 240 | sidebarDepth: item.sidebarDepth, 241 | children: children.map(child => resolveItem(child, pages, base, groupDepth + 1)), 242 | collapsable: item.collapsable !== false 243 | } 244 | } 245 | } 246 | -------------------------------------------------------------------------------- /src/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | home: true 3 | heroImage: /logo.png 4 | description: Nekogram is an open-source third-party Telegram client with not many but useful mods 5 | actionText: Download 6 | actionLink: /download/ 7 | secondaryActionText: Channel 8 | secondaryActionLink: https://t.me/nekoupdates 9 | features: 10 | - title: Appearance 11 | details: Use your avatar as drawer header background, use system emojis, let the status bar be transparent, and more. 12 | - title: Chats 13 | details: Set sticker size, let folders be shown on the forward page and pause video automatically when switched to the background. 14 | - title: Translator 15 | details: Translate messages and articles, with multiple translation engines to choose from. 16 | footer: Copyright © 2023 NekoWorkshop ‧ Made with ❤️ 17 | --- 18 | -------------------------------------------------------------------------------- /src/changelog.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | ## 10.2.6 (2023-11-08) 4 | 5 | - Bug fixes and other improvements 6 | 7 | ## 10.2.3 (2023-11-02) 8 | 9 | - Bug fixes and other improvements 10 | 11 | ## 10.2.2 (2023-11-01) 12 | 13 | - Bug fixes and other improvements 14 | 15 | ## 10.2.0 (2023-10-30) 16 | 17 | - 18 | - Bug fixes and other improvements 19 | 20 | ## 10.1.1.1 (2023-10-14) 21 | 22 | - Bug fixes and other improvements 23 | 24 | ## 10.1.1 (2023-09-24) 25 | 26 | - 27 | - Bug fixes and other improvements 28 | 29 | ## 10.0.9 (2023-09-18) 30 | 31 | - Bug fixes and other improvements 32 | 33 | ## 10.0.8 (2023-09-15) 34 | 35 | - Backup Neko Settings with Cloud Settings 36 | - Bug fixes and other improvements 37 | 38 | ## 10.0.5 (2023-09-07) 39 | 40 | - Allow replacing forward with quick forward menu 41 | - Set "delete own messages" to only delete messages before a date 42 | - Bug fixes and other improvements 43 | 44 | ## 10.0.4 (2023-08-27) 45 | 46 | - Bug fixes and other improvements 47 | 48 | ## 10.0.1 (2023-08-20) 49 | 50 | - 51 | 52 | ## 9.7.6 (2023-08-07) 53 | 54 | - Bug fixes and other improvements 55 | 56 | ## 9.7.4 (2023-08-05) 57 | 58 | - Stories 59 | - Bug fixes and other improvements 60 | 61 | ## 9.6.7 (2023-06-02) 62 | 63 | - Bug fixes and other improvements 64 | 65 | ## 9.6.5 (2023-05-05) 66 | 67 | - Bug fixes and other improvements 68 | 69 | ## 9.6.3 (2023-04-28) 70 | 71 | - Bug fixes and other improvements 72 | 73 | ## 9.6.2 (2023-04-26) 74 | 75 | - 76 | - Scan QR Codes on images directly in chat 77 | - Bug fixes and other improvements 78 | 79 | ## 9.5.8 (2023-04-06) 80 | 81 | - Redesigned forward menu 82 | - Bug fixes and other improvements 83 | 84 | ## 9.5.7 (2023-03-31) 85 | 86 | - Bug fixes and other improvements 87 | 88 | ## 9.5.6 (2023-03-24) 89 | 90 | - Bug fixes and other improvements 91 | 92 | ## 9.5.3 (2023-03-14) 93 | 94 | - Bug fixes and other improvements 95 | 96 | ## 9.5.2 (2023-03-11) 97 | 98 | - Bug fixes and other improvements 99 | 100 | ## 9.5.0 (2023-03-08) 101 | 102 | - 103 | 104 | ## 9.4.8 (2023-02-27) 105 | 106 | - Bug fixes and other improvements 107 | 108 | ## 9.4.5 (2023-02-25) 109 | 110 | - 111 | 112 | ## 9.3.3.1 (2023-01-13) 113 | 114 | - Customize emoji sets 115 | - Bug fixes and other improvements 116 | 117 | ## 9.3.3 (2023-01-04) 118 | 119 | - Bug fixes and other improvements 120 | 121 | ## 9.3.2 (2022-12-31) 122 | 123 | - 124 | 125 | ## 9.2.2 (2022-12-09) 126 | 127 | - 128 | 129 | ## 9.1.6 (2022-11-27) 130 | 131 | - "Hide 'All Chats' tab" is back 132 | - Option to disable sticker packs auto-reorder 133 | - Bug fixes and other improvements 134 | 135 | ## 9.1.3 (2022-11-12) 136 | 137 | - Bug fixes and other improvements 138 | 139 | ## 9.1.2 (2022-11-07) 140 | 141 | - 142 | - "Set a reminder" in message context menu 143 | 144 | ## 9.0.2 (2022-09-21) 145 | 146 | ## 9.0.0 (2022-09-17) 147 | 148 | - 149 | - Themed icon support for more icons by @RKBDI 150 | 151 | ## 8.9.3.1 (2022-08-22) 152 | 153 | - Added Save to Downloads to Download Manager 154 | - Updated monet theme to 8.9.0 155 | - Fixed Use system emoji 156 | 157 | ## 8.9.3 (2022-08-15) 158 | 159 | - Bug fixes and other improvements 160 | 161 | ## 8.9.2 (2022-08-14) 162 | 163 | - 164 | 165 | ## 8.8.5.1 (2022-07-11) 166 | 167 | - Updated monet theme to 4.1.0 168 | - Fixed some crashes 169 | 170 | ## 8.8.5 (2022-07-04) 171 | 172 | - Bug fixes and other improvements 173 | 174 | ## 8.8.4 (2022-06-28) 175 | 176 | - Bug fixes and other improvements 177 | 178 | ## 8.8.3 (2022-06-23) 179 | 180 | - Bug fixes and other improvements 181 | 182 | ## 8.8.2 (2022-06-21) 183 | 184 | - [**Telegram Premium**](https://telegram.org/blog/700-million-and-premium) 185 | - Eight new app icons made by [@RKBDI](https://t.me/RKBDI) 186 | - New markdown parser with syntax highlight and link support 187 | - Bug fixes and other improvements 188 | 189 | ## 8.7.4.4 (2022-05-21) 190 | 191 | - Fix crashes 192 | 193 | ## 8.7.4.3 (2022-05-18) 194 | 195 | - Bug fixes and other improvements 196 | 197 | ## 8.7.4.2 (2022-05-07) 198 | 199 | - Allow hide time on stickers 200 | - Add support for `tg://user?id=user_id` link 201 | - New folder icons 202 | - Bug fixes and other improvements 203 | 204 | ## 8.7.4.1 (2022-04-30) 205 | 206 | - Enable/Disable auto tanslate per dialog 207 | - Bug fixes and other improvements 208 | 209 | ## 8.7.4 (2022-04-29) 210 | 211 | - Set passcode for each account and hide them 212 | - Translator improvements 213 | - Bug fixes and other improvements 214 | 215 | ## 8.7.2 (2022-04-23) 216 | 217 | - Bug fixes and other improvements 218 | 219 | ## 8.7.1 (2022-04-22) 220 | 221 | - Built-in [monet themes](https://github.com/c3r5b8/Telegram-Monet) for Android 12+ 222 | - Bug fixes and other improvements 223 | 224 | ## 8.7.0 (2022-04-17) 225 | 226 | - 227 | - Copy links to any Neko Settings options 228 | - Bug fixes and other improvements 229 | 230 | ## 8.6.2.1 (2022-03-27) 231 | 232 | - Bug fixes and other improvements 233 | 234 | ## 8.6.2 (2022-03-21) 235 | 236 | - Keep formatting when copy-pasting text in chat 237 | 238 | ## 8.6.1 (2022-03-13) 239 | 240 | - Fixed pasting photos from clipboard 241 | - Enabled blur for all devices and themes 242 | - Bug fixes and other improvements 243 | 244 | ## 8.6.0 (2022-03-12) 245 | 246 | #### Telegram side 247 | 248 | - 249 | 250 | #### Nekogram side 251 | 252 | - Added undo and redo options 253 | - Added disable markdown option 254 | - Allow copy bot button title/url/callback 255 | - Allow editing existing text urls 256 | - Preview hex colors like #ffb3ba 257 | - Navigate through clicked reply with page down button 258 | - Bug fixes and other improvements 259 | 260 | ## 8.5.4 (2022-02-16) 261 | 262 | - Bug fixes and other improvements 263 | 264 | ## 8.5.2 (2022-02-12) 265 | 266 | - **Auto Translate** — Translating messages in other languages automatically 267 | - Fixed saving video stickers to gallery 268 | 269 | ## 8.5.1 (2022-02-04) 270 | 271 | - Bug fixes and other improvements 272 | 273 | ## 8.5.0 (2022-02-02) 274 | 275 | - 276 | 277 | ## 8.4.4.1 (2022-01-28) 278 | 279 | - Allow customize message double tap action 280 | - Bug fixes and other improvements 281 | 282 | ## 8.4.4 (2022-01-19) 283 | 284 | - Allow set icons for chat folders 285 | - Bug fixes and other improvements 286 | 287 | ## 8.4.3 (2022-01-10) 288 | 289 | - Add accessibility support for reactions 290 | - Allow copy and paste photos from clipboard 291 | - "Save to downloads" now shows a notification instead of a progress dialog 292 | - Bug fixes and other improvements 293 | 294 | #### Android 12 only: 295 | 296 | - Use `CallStyle` notifications for calls 297 | - Allow sending photos from notification quick reply 298 | - Allow drop photos in to chat to send 299 | 300 | ## 8.4.2 (2021-12-31) 301 | 302 | - 303 | 304 | ## 8.3.1.2 (2021-12-24) 305 | 306 | - Fixed calls and notifications on Android 12 307 | - Fixed some accessbility bugs (Thanks to @sashablr_1994) 308 | - Bug fixes and other improvements 309 | 310 | ## 8.3.1.1 (2021-12-19) 311 | 312 | - Added support for login with QR code 313 | - Added an option to use an external translator instead of the built-in one 314 | - Fixed "Delete downloaded file" is not shown for videos 315 | - Fixed in-app YouTube player 316 | - Bug fixes and other improvements 317 | 318 | ## 8.3.1 (2021-12-10) 319 | 320 | - Bug fixes and other improvements 321 | 322 | ## 8.3.0 (2021-12-07) 323 | 324 | - 325 | 326 | ## 8.2.7.1 (2021-11-24) 327 | 328 | - Fixed lots of accessbility bugs (Thanks to @sashablr_1994) 329 | - Bug fixes and other improvements 330 | -------------------------------------------------------------------------------- /src/download.md: -------------------------------------------------------------------------------- 1 | # Download 2 | 3 | **Requirement:** Android 5.0+ 4 | 5 | [GitHub](https://github.com/Nekogram/Nekogram/releases) 6 | 7 | [Telegram Channel](https://t.me/NekogramAPKs) 8 | 9 | ::: tip 10 | Install "universal" version in case you don't know which APK to install. 11 | ::: 12 | 13 | [Google Play](https://play.google.com/store/apps/details?id=tw.nekomimi.nekogram) 14 | -------------------------------------------------------------------------------- /src/features.md: -------------------------------------------------------------------------------- 1 | # Features (incomplete) 2 | 3 | **NOTE: This page wasn't updated for more than a year.** 4 | This page contains a list of features in Nekogram. 5 | 6 | ## General modifications 7 | 8 | - Play wav files as music in app 9 | - Call style notification support for Android 12+ 10 | - Use system fonts everywhere 11 | - Show ping time when adding proxy 12 | - Use biometric prompt for passcode unlock 13 | - Built-in Chinese languages 14 | - Use notification instead of dialog when saving multiple files 15 | - Login with the bot token 16 | - Login by scanning QRCode with another device 17 | - Login to test servers 18 | - Keep formatting when copy-pasting text 19 | - Improved accessibility experience 20 | - Max 8 accounts 21 | - Allow setting media keeping time to 1 day 22 | - Code syntax highlighting 23 | - Label mutual contacts in the contact list 24 | - Long press to mention with the name instead of username 25 | - Show music file size in messages 26 | - Color picker in the photo editor 27 | - Check "delete for ..." by default 28 | - Show audio player for voice messages 29 | - Copy-paste or drag and drop photos to send 30 | - Send files with URLs through Telegram server 31 | - Long press on the chat title bar to open the search 32 | - Undo and redo button in the text editor 33 | - Allow disabling markdown parser temporarily 34 | - Quick forward without the quote button 35 | - Enhanced share alert with remove caption and hide sender option 36 | - Replaced RGBA with HEX color in theme editor 37 | - Removed mini profile dialog in join requests list 38 | - Select between two messages 39 | - Jump to the beginning message 40 | - Reply return stack 41 | - Show pinned messages again after hiding 42 | - Create text mentions 43 | - Delete all messages of you in groups 44 | - View admin list and default permission of groups 45 | - Option to lock app instantly 46 | - Enabled auto-fill for passcode inputs 47 | - Built-in proxy with Cloudflare 48 | - Hide the phone number on the profile page 49 | - Built-in monet themes for Android 12+ 50 | - Show DC id in photo viewer 51 | - Show ID and user DC id in profile 52 | - Show upload date of profile photo in photo viewer 53 | - Fast link for every customization options 54 | 55 | ## Neko settings 56 | 57 | ### General 58 | 59 | #### Translator types 60 | 61 | - In messsage 62 | - Popup dialog 63 | - External app 64 | 65 | #### Translator providers 66 | 67 | - Google Translate 68 | - Yandex Translate 69 | - Microsoft Translator 70 | - DeepL Translate 71 | - Lingocloud 72 | 73 | ![General neko settings screenshot](/images/General.png) 74 | 75 | ### Appearance 76 | 77 | ![Appearance neko settings screenshot](/images/Appearance.png) 78 | 79 | ### Chat 80 | 81 | ![Chat neko settings screenshot](/images/Chat.png) 82 | 83 | ### Experimental 84 | 85 | ![Experimental neko settings screenshot](/images/Experimental.png) 86 | -------------------------------------------------------------------------------- /src/privacy.md: -------------------------------------------------------------------------------- 1 | # Privacy Policy 2 | 3 | Last updated: January 25, 2022 4 | 5 | This Privacy Policy describes Our policies and procedures on the collection, use and disclosure of Your information when You use the Service and tells You about Your privacy rights and how the law protects You. 6 | 7 | We use Your Personal data to provide and improve the Service. By using the Service, You agree to the collection and use of information in accordance with this Privacy Policy. 8 | 9 | # Interpretation and Definitions 10 | 11 | ## Interpretation 12 | 13 | The words of which the initial letter is capitalized have meanings defined under the following conditions. The following definitions shall have the same meaning regardless of whether they appear in singular or in plural. 14 | 15 | ## Definitions 16 | 17 | For the purposes of this Privacy Policy: 18 | 19 | - __Account__ means a unique account created for You to access our Service or parts of our Service. 20 | 21 | - __Affiliate__ means an entity that controls, is controlled by or is under common control with a party, where "control" means ownership of 50% or more of the shares, equity interest or other securities entitled to vote for election of directors or other managing authority. 22 | - __Application__ means the software program provided by the Company downloaded by You on any electronic device, named Nekogram 23 | 24 | 25 | - __Company__ (referred to as either "the Company", "We", "Us" or "Our" in this Agreement) refers to Nekogram. 26 | 27 | 28 | 29 | - __Country__ refers to: Hong Kong SAR China 30 | 31 | - __Device__ means any device that can access the Service such as a computer, a cellphone or a digital tablet. 32 | 33 | 34 | - __Personal Data__ is any information that relates to an identified or identifiable individual. 35 | 36 | 37 | 38 | 39 | - __Service__ refers to the Application. 40 | 41 | - __Service Provider__ means any natural or legal person who processes the data on behalf of the Company. It refers to third-party companies or individuals employed by the Company to facilitate the Service, to provide the Service on behalf of the Company, to perform services related to the Service or to assist the Company in analyzing how the Service is used. 42 | 43 | 44 | - __Usage Data__ refers to data collected automatically, either generated by the use of the Service or from the Service infrastructure itself (for example, the duration of a page visit). 45 | 46 | - __You__ means the individual accessing or using the Service, or the company, or other legal entity on behalf of which such individual is accessing or using the Service, as applicable. 47 | 48 | 49 | 50 | # Collecting and Using Your Personal Data 51 | 52 | ## Types of Data Collected 53 | 54 | ### Personal Data 55 | 56 | While using Our Service, We may ask You to provide Us with certain personally identifiable information that can be used to contact or identify You. Personally identifiable information may include, but is not limited to: 57 | 58 | - Email address 59 | - First name and last name 60 | - Phone number 61 | 62 | 63 | 64 | - Usage Data 65 | 66 | 67 | 68 | ### Usage Data 69 | 70 | Usage Data is collected automatically when using the Service. 71 | 72 | Usage Data may include information such as Your Device's Internet Protocol address (e.g. IP address), browser type, browser version, the pages of our Service that You visit, the time and date of Your visit, the time spent on those pages, unique device identifiers and other diagnostic data. 73 | 74 | When You access the Service by or through a mobile device, We may collect certain information automatically, including, but not limited to, the type of mobile device You use, Your mobile device unique ID, the IP address of Your mobile device, Your mobile operating system, the type of mobile Internet browser You use, unique device identifiers and other diagnostic data. 75 | 76 | We may also collect information that Your browser sends whenever You visit our Service or when You access the Service by or through a mobile device. 77 | 78 | 79 | 80 | 81 | 82 | ### Information Collected while Using the Application 83 | 84 | While using Our Application, in order to provide features of Our Application, We may collect, with Your prior permission: 85 | 86 | - Information regarding your location 87 | - Information from your Device's phone book (contacts list) 88 | - Pictures and other information from your Device's camera and photo library 89 | 90 | We use this information to provide features of Our Service, to improve and customize Our Service. The information may be uploaded to the Company's servers and/or a Service Provider's server or it may be simply stored on Your device. 91 | 92 | You can enable or disable access to this information at any time, through Your Device settings. 93 | 94 | 95 | 96 | 97 | 98 | ## Use of Your Personal Data 99 | 100 | The Company may use Personal Data for the following purposes: 101 | 102 | - __To provide and maintain our Service__, including to monitor the usage of our Service. 103 | - __To manage Your Account:__ to manage Your registration as a user of the Service. The Personal Data You provide can give You access to different functionalities of the Service that are available to You as a registered user. 104 | - __For the performance of a contract:__ the development, compliance and undertaking of the purchase contract for the products, items or services You have purchased or of any other contract with Us through the Service. 105 | - __To contact You:__ To contact You by email, telephone calls, SMS, or other equivalent forms of electronic communication, such as a mobile application's push notifications regarding updates or informative communications related to the functionalities, products or contracted services, including the security updates, when necessary or reasonable for their implementation. 106 | - __To provide You__ with news, special offers and general information about other goods, services and events which we offer that are similar to those that you have already purchased or enquired about unless You have opted not to receive such information. 107 | - __To manage Your requests:__ To attend and manage Your requests to Us. 108 | 109 | - __For business transfers:__ We may use Your information to evaluate or conduct a merger, divestiture, restructuring, reorganization, dissolution, or other sale or transfer of some or all of Our assets, whether as a going concern or as part of bankruptcy, liquidation, or similar proceeding, in which Personal Data held by Us about our Service users is among the assets transferred. 110 | - __For other purposes__: We may use Your information for other purposes, such as data analysis, identifying usage trends, determining the effectiveness of our promotional campaigns and to evaluate and improve our Service, products, services, marketing and your experience. 111 | 112 | We may share Your personal information in the following situations: 113 | 114 | - __With Service Providers:__ We may share Your personal information with Service Providers to monitor and analyze the use of our Service, to contact You. 115 | - __For business transfers:__ We may share or transfer Your personal information in connection with, or during negotiations of, any merger, sale of Company assets, financing, or acquisition of all or a portion of Our business to another company. 116 | - __With Affiliates:__ We may share Your information with Our affiliates, in which case we will require those affiliates to honor this Privacy Policy. Affiliates include Our parent company and any other subsidiaries, joint venture partners or other companies that We control or that are under common control with Us. 117 | - __With business partners:__ We may share Your information with Our business partners to offer You certain products, services or promotions. 118 | - __With other users:__ when You share personal information or otherwise interact in the public areas with other users, such information may be viewed by all users and may be publicly distributed outside. 119 | - __With Your consent__: We may disclose Your personal information for any other purpose with Your consent. 120 | 121 | ## Retention of Your Personal Data 122 | 123 | The Company will retain Your Personal Data only for as long as is necessary for the purposes set out in this Privacy Policy. We will retain and use Your Personal Data to the extent necessary to comply with our legal obligations (for example, if we are required to retain your data to comply with applicable laws), resolve disputes, and enforce our legal agreements and policies. 124 | 125 | The Company will also retain Usage Data for internal analysis purposes. Usage Data is generally retained for a shorter period of time, except when this data is used to strengthen the security or to improve the functionality of Our Service, or We are legally obligated to retain this data for longer time periods. 126 | 127 | ## Transfer of Your Personal Data 128 | 129 | Your information, including Personal Data, is processed at the Company's operating offices and in any other places where the parties involved in the processing are located. It means that this information may be transferred to — and maintained on — computers located outside of Your state, province, country or other governmental jurisdiction where the data protection laws may differ than those from Your jurisdiction. 130 | 131 | Your consent to this Privacy Policy followed by Your submission of such information represents Your agreement to that transfer. 132 | 133 | The Company will take all steps reasonably necessary to ensure that Your data is treated securely and in accordance with this Privacy Policy and no transfer of Your Personal Data will take place to an organization or a country unless there are adequate controls in place including the security of Your data and other personal information. 134 | 135 | ## Disclosure of Your Personal Data 136 | 137 | ### Business Transactions 138 | 139 | If the Company is involved in a merger, acquisition or asset sale, Your Personal Data may be transferred. We will provide notice before Your Personal Data is transferred and becomes subject to a different Privacy Policy. 140 | 141 | ### Law enforcement 142 | 143 | Under certain circumstances, the Company may be required to disclose Your Personal Data if required to do so by law or in response to valid requests by public authorities (e.g. a court or a government agency). 144 | 145 | ### Other legal requirements 146 | 147 | The Company may disclose Your Personal Data in the good faith belief that such action is necessary to: 148 | 149 | - Comply with a legal obligation 150 | - Protect and defend the rights or property of the Company 151 | - Prevent or investigate possible wrongdoing in connection with the Service 152 | - Protect the personal safety of Users of the Service or the public 153 | - Protect against legal liability 154 | 155 | ## Security of Your Personal Data 156 | 157 | The security of Your Personal Data is important to Us, but remember that no method of transmission over the Internet, or method of electronic storage is 100% secure. While We strive to use commercially acceptable means to protect Your Personal Data, We cannot guarantee its absolute security. 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | # Children's Privacy 171 | 172 | Our Service does not address anyone under the age of 13. We do not knowingly collect personally identifiable information from anyone under the age of 13. If You are a parent or guardian and You are aware that Your child has provided Us with Personal Data, please contact Us. If We become aware that We have collected Personal Data from anyone under the age of 13 without verification of parental consent, We take steps to remove that information from Our servers. 173 | 174 | If We need to rely on consent as a legal basis for processing Your information and Your country requires consent from a parent, We may require Your parent's consent before We collect and use that information. 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | # Links to Other Websites 183 | 184 | Our Service may contain links to other websites that are not operated by Us. If You click on a third party link, You will be directed to that third party's site. We strongly advise You to review the Privacy Policy of every site You visit. 185 | 186 | We have no control over and assume no responsibility for the content, privacy policies or practices of any third party sites or services. 187 | 188 | # Changes to this Privacy Policy 189 | 190 | We may update Our Privacy Policy from time to time. We will notify You of any changes by posting the new Privacy Policy on this page. 191 | 192 | We will let You know via email and/or a prominent notice on Our Service, prior to the change becoming effective and update the "Last updated" date at the top of this Privacy Policy. 193 | 194 | You are advised to review this Privacy Policy periodically for any changes. Changes to this Privacy Policy are effective when they are posted on this page. 195 | 196 | # Contact Us 197 | 198 | If you have any questions about this Privacy Policy, You can contact us: 199 | 200 | 201 | - By email: nekoworkshop@protonmail.com 202 | -------------------------------------------------------------------------------- /src/zh-hans/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | home: true 3 | heroImage: /logo.png 4 | description: Nekogram 是一个修改不多但都很有用的开源第三方 Telegram 客户端 5 | actionText: 下载 6 | actionLink: /zh-hans/download.html 7 | secondaryActionText: 频道 8 | secondaryActionLink: https://t.me/nekoupdates 9 | features: 10 | - title: 外观 11 | details: 使用您的头像作为抽屉背景、使用系统字体或表情符号、让状态栏透明等等。 12 | - title: 聊天 13 | details: 设置贴纸大小、让文件夹显示在转发页面、切换到后台时自动暂停视频。 14 | - title: 翻译 15 | details: 翻译消息和文章,有多种翻译引擎可供选择。 16 | footer: Copyright © 2022 NekoWorkshop ‧ Made with ❤️ 17 | --- 18 | -------------------------------------------------------------------------------- /src/zh-hans/download.md: -------------------------------------------------------------------------------- 1 | # 下载 2 | 3 | **需求:** Android 5.0 以上设备 4 | 5 | [GitHub](https://github.com/Nekogram/Nekogram/releases) 6 | 7 | [Telegram 频道](https://t.me/NekogramAPKs) 8 | 9 | ::: tip 10 | 如果您不知道要安装哪一个 APK,请安装“universal”版本。 11 | ::: 12 | 13 | [Google Play](https://play.google.com/store/apps/details?id=tw.nekomimi.nekogram) 14 | --------------------------------------------------------------------------------