Remove Vuepress site
@ -1,13 +0,0 @@
|
|||||||
root = true
|
|
||||||
|
|
||||||
[*]
|
|
||||||
end_of_line = lf
|
|
||||||
indent_style = tab
|
|
||||||
indent_size = 4
|
|
||||||
charset = utf-8
|
|
||||||
trim_trailing_whitespace = true
|
|
||||||
insert_final_newline = true
|
|
||||||
|
|
||||||
[*.yml]
|
|
||||||
indent_style = space
|
|
||||||
indent_size = 2
|
|
@ -1 +0,0 @@
|
|||||||
!.vuepress
|
|
32
.eslintrc.js
@ -1,32 +0,0 @@
|
|||||||
module.exports = {
|
|
||||||
env: {
|
|
||||||
browser: true,
|
|
||||||
es6: true,
|
|
||||||
},
|
|
||||||
|
|
||||||
extends: ["vuepress", "prettier"],
|
|
||||||
plugins: ["vue", "prettier", "markdown"],
|
|
||||||
|
|
||||||
parserOptions: {
|
|
||||||
ecmaVersion: 2018,
|
|
||||||
parser: "babel-eslint",
|
|
||||||
sourceType: "module",
|
|
||||||
},
|
|
||||||
|
|
||||||
rules: {
|
|
||||||
"prettier/prettier": [
|
|
||||||
"error",
|
|
||||||
{
|
|
||||||
endOfLine: "auto",
|
|
||||||
},
|
|
||||||
],
|
|
||||||
"import/no-unresolved": [
|
|
||||||
2,
|
|
||||||
{
|
|
||||||
ignore: ["^@"],
|
|
||||||
},
|
|
||||||
],
|
|
||||||
curly: ["error", "all"],
|
|
||||||
"vue/multi-word-component-names": "off"
|
|
||||||
},
|
|
||||||
};
|
|
13
.github/ISSUE_TEMPLATE/config.yml
vendored
@ -1,13 +0,0 @@
|
|||||||
contact_links:
|
|
||||||
- name: ⚠️ Application issue
|
|
||||||
url: https://github.com/tachiyomiorg/tachiyomi/issues/new/choose
|
|
||||||
about: Issues and requests about the app itself should be opened in the tachiyomi repository instead
|
|
||||||
- name: ⚠️ Extension/source issue
|
|
||||||
url: https://github.com/tachiyomiorg/tachiyomi-extensions/issues/new/choose
|
|
||||||
about: Issues and requests for extensions and sources should be opened in the tachiyomi-extensions repository instead
|
|
||||||
- name: 📦 Tachiyomi extensions
|
|
||||||
url: https://tachiyomi.org/extensions
|
|
||||||
about: List of all available extensions with download links
|
|
||||||
- name: 🖥️ Tachiyomi website
|
|
||||||
url: https://tachiyomi.org/help/
|
|
||||||
about: Guides, troubleshooting, and answers to common questions
|
|
59
.github/ISSUE_TEMPLATE/report_issue.yml
vendored
@ -1,59 +0,0 @@
|
|||||||
name: 🐞 Issue report
|
|
||||||
description: Report an issue with tachiyomi.org
|
|
||||||
labels: [Bug]
|
|
||||||
body:
|
|
||||||
|
|
||||||
- type: checkboxes
|
|
||||||
id: acknowledgements
|
|
||||||
attributes:
|
|
||||||
label: Acknowledgements
|
|
||||||
description: Read this carefully, we will close and ignore your issue if you skimmed through this.
|
|
||||||
options:
|
|
||||||
- label: I have searched the existing issues and this is a new ticket, **NOT** a duplicate or related to another open issue.
|
|
||||||
required: true
|
|
||||||
- label: I have written a short but informative title.
|
|
||||||
required: true
|
|
||||||
- label: I will fill out all of the requested information in this form.
|
|
||||||
required: true
|
|
||||||
|
|
||||||
- type: textarea
|
|
||||||
id: reproduce-steps
|
|
||||||
attributes:
|
|
||||||
label: Steps to reproduce
|
|
||||||
description: Provide an example of the issue.
|
|
||||||
placeholder: |
|
|
||||||
Example:
|
|
||||||
1. First step
|
|
||||||
2. Second step
|
|
||||||
3. Issue here
|
|
||||||
validations:
|
|
||||||
required: true
|
|
||||||
|
|
||||||
- type: textarea
|
|
||||||
id: expected-behavior
|
|
||||||
attributes:
|
|
||||||
label: Expected behavior
|
|
||||||
description: Explain what you should expect to happen.
|
|
||||||
placeholder: |
|
|
||||||
Example:
|
|
||||||
"This should happen..."
|
|
||||||
validations:
|
|
||||||
required: true
|
|
||||||
|
|
||||||
- type: textarea
|
|
||||||
id: actual-behavior
|
|
||||||
attributes:
|
|
||||||
label: Actual behavior
|
|
||||||
description: Explain what actually happens.
|
|
||||||
placeholder: |
|
|
||||||
Example:
|
|
||||||
"This happened instead..."
|
|
||||||
validations:
|
|
||||||
required: true
|
|
||||||
|
|
||||||
- type: textarea
|
|
||||||
id: other-details
|
|
||||||
attributes:
|
|
||||||
label: Other details
|
|
||||||
placeholder: |
|
|
||||||
Additional details and attachments.
|
|
35
.github/ISSUE_TEMPLATE/request_feature.yml
vendored
@ -1,35 +0,0 @@
|
|||||||
name: ⭐ Feature request
|
|
||||||
description: Suggest a feature to improve tachiyomi.org
|
|
||||||
labels: [Feature request]
|
|
||||||
body:
|
|
||||||
|
|
||||||
- type: checkboxes
|
|
||||||
id: acknowledgements
|
|
||||||
attributes:
|
|
||||||
label: Acknowledgements
|
|
||||||
description: Read this carefully, we will close and ignore your issue if you skimmed through this.
|
|
||||||
options:
|
|
||||||
- label: I have searched the existing issues and this is a new ticket, **NOT** a duplicate or related to another open issue.
|
|
||||||
required: true
|
|
||||||
- label: I have written a short but informative title.
|
|
||||||
required: true
|
|
||||||
- label: I will fill out all of the requested information in this form.
|
|
||||||
required: true
|
|
||||||
|
|
||||||
- type: textarea
|
|
||||||
id: feature-description
|
|
||||||
attributes:
|
|
||||||
label: Describe your suggested feature
|
|
||||||
description: How can the website be improved?
|
|
||||||
placeholder: |
|
|
||||||
Example:
|
|
||||||
"It should work like this..."
|
|
||||||
validations:
|
|
||||||
required: true
|
|
||||||
|
|
||||||
- type: textarea
|
|
||||||
id: other-details
|
|
||||||
attributes:
|
|
||||||
label: Other details
|
|
||||||
placeholder: |
|
|
||||||
Additional details and attachments.
|
|
111
.github/assets/tachiyomi-handbrake-profile.json
vendored
@ -1,111 +0,0 @@
|
|||||||
{
|
|
||||||
"PresetList": [
|
|
||||||
{
|
|
||||||
"AlignAVStart": false,
|
|
||||||
"AudioCopyMask": [
|
|
||||||
"copy:aac",
|
|
||||||
"copy:ac3",
|
|
||||||
"copy:dtshd",
|
|
||||||
"copy:dts",
|
|
||||||
"copy:mp3",
|
|
||||||
"copy:truehd",
|
|
||||||
"copy:flac",
|
|
||||||
"copy:eac3"
|
|
||||||
],
|
|
||||||
"AudioEncoderFallback": "ac3",
|
|
||||||
"AudioLanguageList": [],
|
|
||||||
"AudioList": [
|
|
||||||
{
|
|
||||||
"AudioBitrate": 128,
|
|
||||||
"AudioCompressionLevel": 0.0,
|
|
||||||
"AudioEncoder": "av_aac",
|
|
||||||
"AudioMixdown": "stereo",
|
|
||||||
"AudioNormalizeMixLevel": false,
|
|
||||||
"AudioSamplerate": "auto",
|
|
||||||
"AudioTrackQualityEnable": false,
|
|
||||||
"AudioTrackQuality": -1.0,
|
|
||||||
"AudioTrackGainSlider": 0.0,
|
|
||||||
"AudioTrackDRCSlider": 0.0
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"AudioSecondaryEncoderMode": true,
|
|
||||||
"AudioTrackSelectionBehavior": "first",
|
|
||||||
"ChapterMarkers": false,
|
|
||||||
"ChildrenArray": [],
|
|
||||||
"Default": false,
|
|
||||||
"FileFormat": "av_webm",
|
|
||||||
"Folder": false,
|
|
||||||
"FolderOpen": false,
|
|
||||||
"Mp4HttpOptimize": false,
|
|
||||||
"Mp4iPodCompatible": false,
|
|
||||||
"PictureAutoCrop": true,
|
|
||||||
"PictureBottomCrop": 0,
|
|
||||||
"PictureLeftCrop": 0,
|
|
||||||
"PictureRightCrop": 0,
|
|
||||||
"PictureTopCrop": 0,
|
|
||||||
"PictureDARWidth": 512,
|
|
||||||
"PictureDeblockPreset": "off",
|
|
||||||
"PictureDeblockTune": "medium",
|
|
||||||
"PictureDeblockCustom": "strength=strong:thresh=20:blocksize=8",
|
|
||||||
"PictureDeinterlaceFilter": "decomb",
|
|
||||||
"PictureCombDetectPreset": "default",
|
|
||||||
"PictureCombDetectCustom": "",
|
|
||||||
"PictureDeinterlacePreset": "default",
|
|
||||||
"PictureDeinterlaceCustom": "",
|
|
||||||
"PictureDenoiseCustom": "",
|
|
||||||
"PictureDenoiseFilter": "off",
|
|
||||||
"PictureDenoisePreset": "light",
|
|
||||||
"PictureDenoiseTune": "none",
|
|
||||||
"PictureSharpenCustom": "",
|
|
||||||
"PictureSharpenFilter": "off",
|
|
||||||
"PictureSharpenPreset": "medium",
|
|
||||||
"PictureSharpenTune": "none",
|
|
||||||
"PictureDetelecine": "off",
|
|
||||||
"PictureDetelecineCustom": "",
|
|
||||||
"PictureItuPAR": false,
|
|
||||||
"PictureKeepRatio": true,
|
|
||||||
"PictureLooseCrop": false,
|
|
||||||
"PictureModulus": 2,
|
|
||||||
"PicturePAR": "auto",
|
|
||||||
"PicturePARWidth": 3452,
|
|
||||||
"PicturePARHeight": 4369,
|
|
||||||
"PictureWidth": 0,
|
|
||||||
"PictureHeight": 0,
|
|
||||||
"PictureForceHeight": 0,
|
|
||||||
"PictureForceWidth": 0,
|
|
||||||
"PresetName": "Tachiyomi HandBrake Profile",
|
|
||||||
"Type": 1,
|
|
||||||
"UsesPictureFilters": true,
|
|
||||||
"UsesPictureSettings": 0,
|
|
||||||
"SubtitleAddCC": false,
|
|
||||||
"SubtitleAddForeignAudioSearch": true,
|
|
||||||
"SubtitleAddForeignAudioSubtitle": false,
|
|
||||||
"SubtitleBurnBehavior": "foreign",
|
|
||||||
"SubtitleBurnBDSub": false,
|
|
||||||
"SubtitleBurnDVDSub": false,
|
|
||||||
"SubtitleLanguageList": [],
|
|
||||||
"SubtitleTrackSelectionBehavior": "none",
|
|
||||||
"VideoAvgBitrate": 0,
|
|
||||||
"VideoColorMatrixCode": 0,
|
|
||||||
"VideoEncoder": "VP9",
|
|
||||||
"VideoFramerate": "24",
|
|
||||||
"VideoFramerateMode": "pfr",
|
|
||||||
"VideoGrayScale": false,
|
|
||||||
"VideoScaler": "swscale",
|
|
||||||
"VideoPreset": "medium",
|
|
||||||
"VideoTune": "",
|
|
||||||
"VideoLevel": "auto",
|
|
||||||
"VideoOptionExtra": "",
|
|
||||||
"VideoQualityType": 2,
|
|
||||||
"VideoQualitySlider": 21.0,
|
|
||||||
"VideoQSVDecode": false,
|
|
||||||
"VideoQSVAsyncDepth": 4,
|
|
||||||
"VideoTwoPass": true,
|
|
||||||
"VideoTurboTwoPass": false,
|
|
||||||
"x264UseAdvancedOptions": false
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"VersionMajor": 42,
|
|
||||||
"VersionMicro": 0,
|
|
||||||
"VersionMinor": 0
|
|
||||||
}
|
|
10
.github/renovate.json
vendored
@ -1,10 +0,0 @@
|
|||||||
{
|
|
||||||
"extends": [
|
|
||||||
"config:base"
|
|
||||||
],
|
|
||||||
"schedule": ["every sunday"],
|
|
||||||
"ignoreDeps": [
|
|
||||||
"vue monorepo",
|
|
||||||
"vue"
|
|
||||||
]
|
|
||||||
}
|
|
23
.gitignore
vendored
@ -1,23 +0,0 @@
|
|||||||
# OS generated files #
|
|
||||||
######################
|
|
||||||
.DS_Store
|
|
||||||
.DS_Store?
|
|
||||||
._*
|
|
||||||
.Spotlight-V100
|
|
||||||
.Trashes
|
|
||||||
ehthumbs.db
|
|
||||||
Thumbs.db
|
|
||||||
|
|
||||||
# Node
|
|
||||||
node_modules/
|
|
||||||
npm-debug.log
|
|
||||||
|
|
||||||
# Compiled site
|
|
||||||
/public/
|
|
||||||
|
|
||||||
# Ignore Visual Studio Code files
|
|
||||||
*.code-workspace
|
|
||||||
.vscode/launch.json
|
|
||||||
|
|
||||||
# Ignore theme_eject folder
|
|
||||||
theme_eject/
|
|
@ -1 +0,0 @@
|
|||||||
18
|
|
2
.npmrc
@ -1,2 +0,0 @@
|
|||||||
# Workaround for Webpack 4 + Node 17+: https://github.com/webpack/webpack/issues/14532
|
|
||||||
node-options="--openssl-legacy-provider"
|
|
@ -1,9 +0,0 @@
|
|||||||
{
|
|
||||||
"tabWidth": 4,
|
|
||||||
"useTabs": true,
|
|
||||||
"printWidth": 120,
|
|
||||||
"trailingComma": "es5",
|
|
||||||
"bracketSpacing": true,
|
|
||||||
"htmlWhitespaceSensitivity": "ignore",
|
|
||||||
"endOfLine": "auto"
|
|
||||||
}
|
|
47
.stylintrc
@ -1,47 +0,0 @@
|
|||||||
{
|
|
||||||
"blocks": false,
|
|
||||||
"brackets": "never",
|
|
||||||
"colons": "never",
|
|
||||||
"colors": "always",
|
|
||||||
"commaSpace": "always",
|
|
||||||
"commentSpace": "always",
|
|
||||||
"cssLiteral": "never",
|
|
||||||
"customProperties": [],
|
|
||||||
"depthLimit": false,
|
|
||||||
"duplicates": true,
|
|
||||||
"efficient": "always",
|
|
||||||
"exclude": [],
|
|
||||||
"extendPref": "@extends",
|
|
||||||
"globalDupe": true,
|
|
||||||
"groupOutputByFile": true,
|
|
||||||
"indentPref": false,
|
|
||||||
"leadingZero": "always",
|
|
||||||
"maxErrors": false,
|
|
||||||
"maxWarnings": false,
|
|
||||||
"mixed": true,
|
|
||||||
"mixins": [],
|
|
||||||
"namingConvention": false,
|
|
||||||
"namingConventionStrict": false,
|
|
||||||
"none": "always",
|
|
||||||
"noImportant": false,
|
|
||||||
"parenSpace": "never",
|
|
||||||
"placeholders": "always",
|
|
||||||
"prefixVarsWithDollar": "always",
|
|
||||||
"quotePref": false,
|
|
||||||
"reporterOptions": {
|
|
||||||
"columns": ["lineData", "severity", "description", "rule"],
|
|
||||||
"columnSplitter": " ",
|
|
||||||
"showHeaders": false,
|
|
||||||
"truncate": true
|
|
||||||
},
|
|
||||||
"semicolons": "never",
|
|
||||||
"sortOrder": ["grouped", "alphabetical"],
|
|
||||||
"stackedProperties": "never",
|
|
||||||
"trailingWhitespace": "never",
|
|
||||||
"universal": false,
|
|
||||||
"valid": true,
|
|
||||||
"zeroUnits": "never",
|
|
||||||
"zIndexNormalize": false,
|
|
||||||
"stylusSupremacy.selectorSeparator": ",\n",
|
|
||||||
"stylusSupremacy.insertNewLineAroundBlocks": "root"
|
|
||||||
}
|
|
@ -1 +0,0 @@
|
|||||||
nodejs lts-hydrogen
|
|
@ -1,126 +0,0 @@
|
|||||||
# Contributor Covenant Code of Conduct
|
|
||||||
|
|
||||||
## Our Pledge
|
|
||||||
|
|
||||||
We as members, contributors, and leaders pledge to make participation in our
|
|
||||||
community a harassment-free experience for everyone, regardless of age, body
|
|
||||||
size, visible or invisible disability, ethnicity, sex characteristics, gender
|
|
||||||
identity and expression, level of experience, education, socio-economic status,
|
|
||||||
nationality, personal appearance, race, caste, color, religion, or sexual identity
|
|
||||||
and orientation.
|
|
||||||
|
|
||||||
We pledge to act and interact in ways that contribute to an open, welcoming,
|
|
||||||
diverse, inclusive, and healthy community.
|
|
||||||
|
|
||||||
## Our Standards
|
|
||||||
|
|
||||||
Examples of behavior that contributes to a positive environment for our
|
|
||||||
community include:
|
|
||||||
|
|
||||||
* Demonstrating empathy and kindness toward other people
|
|
||||||
* Being respectful of differing opinions, viewpoints, and experiences
|
|
||||||
* Giving and gracefully accepting constructive feedback
|
|
||||||
* Accepting responsibility and apologizing to those affected by our mistakes,
|
|
||||||
and learning from the experience
|
|
||||||
* Focusing on what is best not just for us as individuals, but for the
|
|
||||||
overall community
|
|
||||||
|
|
||||||
Examples of unacceptable behavior include:
|
|
||||||
|
|
||||||
* The use of sexualized language or imagery, and sexual attention or
|
|
||||||
advances of any kind
|
|
||||||
* Trolling, insulting or derogatory comments, and personal or political attacks
|
|
||||||
* Public or private harassment
|
|
||||||
* Publishing others' private information, such as a physical or email
|
|
||||||
address, without their explicit permission
|
|
||||||
* Other conduct which could reasonably be considered inappropriate in a
|
|
||||||
professional setting
|
|
||||||
|
|
||||||
## Enforcement Responsibilities
|
|
||||||
|
|
||||||
Community moderators are responsible for clarifying and enforcing our standards of
|
|
||||||
acceptable behavior and will take appropriate and fair corrective action in
|
|
||||||
response to any behavior that they deem inappropriate, threatening, offensive,
|
|
||||||
or harmful.
|
|
||||||
|
|
||||||
Community moderators have the right and responsibility to remove, edit, or reject
|
|
||||||
comments, commits, code, wiki edits, issues, and other contributions that are
|
|
||||||
not aligned to this Code of Conduct, and will communicate reasons for moderation
|
|
||||||
decisions when appropriate.
|
|
||||||
|
|
||||||
## Scope
|
|
||||||
|
|
||||||
This Code of Conduct applies within all community spaces, and also applies when
|
|
||||||
an individual is officially representing the community in public spaces.
|
|
||||||
Examples of representing our community include using an official e-mail address,
|
|
||||||
posting via an official social media account, or acting as an appointed
|
|
||||||
representative at an online or offline event.
|
|
||||||
|
|
||||||
## Enforcement
|
|
||||||
|
|
||||||
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
|
||||||
reported to the community moderators responsible for enforcement at
|
|
||||||
the [Tachiyomi Discord server](https://discord.gg/tachiyomi).
|
|
||||||
All complaints will be reviewed and investigated promptly and fairly.
|
|
||||||
|
|
||||||
All community moderators are obligated to respect the privacy and security of the
|
|
||||||
reporter of any incident.
|
|
||||||
|
|
||||||
## Enforcement Guidelines
|
|
||||||
|
|
||||||
Community moderators will follow these Community Impact Guidelines in determining
|
|
||||||
the consequences for any action they deem in violation of this Code of Conduct:
|
|
||||||
|
|
||||||
### 1. Correction
|
|
||||||
|
|
||||||
**Community Impact**: Use of inappropriate language or other behavior deemed
|
|
||||||
unprofessional or unwelcome in the community.
|
|
||||||
|
|
||||||
**Consequence**: A private, written warning from community moderators, providing
|
|
||||||
clarity around the nature of the violation and an explanation of why the
|
|
||||||
behavior was inappropriate. A public apology may be requested.
|
|
||||||
|
|
||||||
### 2. Warning
|
|
||||||
|
|
||||||
**Community Impact**: A violation through a single incident or series
|
|
||||||
of actions.
|
|
||||||
|
|
||||||
**Consequence**: A warning with consequences for continued behavior. No
|
|
||||||
interaction with the people involved, including unsolicited interaction with
|
|
||||||
those enforcing the Code of Conduct, for a specified period of time. This
|
|
||||||
includes avoiding interactions in community spaces as well as external channels
|
|
||||||
like social media. Violating these terms may lead to a temporary or
|
|
||||||
permanent ban.
|
|
||||||
|
|
||||||
### 3. Temporary Ban
|
|
||||||
|
|
||||||
**Community Impact**: A serious violation of community standards, including
|
|
||||||
sustained inappropriate behavior.
|
|
||||||
|
|
||||||
**Consequence**: A temporary ban from any sort of interaction or public
|
|
||||||
communication with the community for a specified period of time. No public or
|
|
||||||
private interaction with the people involved, including unsolicited interaction
|
|
||||||
with those enforcing the Code of Conduct, is allowed during this period.
|
|
||||||
Violating these terms may lead to a permanent ban.
|
|
||||||
|
|
||||||
### 4. Permanent Ban
|
|
||||||
|
|
||||||
**Community Impact**: Demonstrating a pattern of violation of community
|
|
||||||
standards, including sustained inappropriate behavior, harassment of an
|
|
||||||
individual, or aggression toward or disparagement of classes of individuals.
|
|
||||||
|
|
||||||
**Consequence**: A permanent ban from any sort of public interaction within
|
|
||||||
the community.
|
|
||||||
|
|
||||||
## Attribution
|
|
||||||
|
|
||||||
This Code of Conduct is adapted from the [Contributor Covenant](https://www.contributor-covenant.org/),
|
|
||||||
version 2.1, available at
|
|
||||||
[v2.1](https://www.contributor-covenant.org/version/2/1/code_of_conduct.html).
|
|
||||||
|
|
||||||
Community Impact Guidelines were inspired by
|
|
||||||
[Mozilla's code of conduct enforcement ladder](https://github.com/mozilla/diversity).
|
|
||||||
|
|
||||||
For answers to common questions about this code of conduct, see the FAQ at
|
|
||||||
[FAQ](https://www.contributor-covenant.org/faq). Translations are available
|
|
||||||
at [translations](https://www.contributor-covenant.org/translations).
|
|
113
CONTRIBUTING.md
@ -1,113 +0,0 @@
|
|||||||
# Tachiyomi Website Contributing Guide
|
|
||||||
|
|
||||||
Before submitting your contribution, please make sure to take a moment and read through the following guidelines:
|
|
||||||
|
|
||||||
- [Code of Conduct](./CODE_OF_CONDUCT.md)
|
|
||||||
- [Development Setup](#development-setup)
|
|
||||||
- [Project Structure](#project-structure)
|
|
||||||
- [Images and Videos guidelines](#images-and-videos-guidelines)
|
|
||||||
|
|
||||||
## Development Setup
|
|
||||||
|
|
||||||
You will need [Node.js](http://nodejs.org) **version 12+**, and [npm](https://docs.npmjs.com/try-the-latest-stable-version-of-npm) **version 7+**.
|
|
||||||
|
|
||||||
After cloning the repo, run:
|
|
||||||
|
|
||||||
``` bash
|
|
||||||
# Installs any dependencies needed.
|
|
||||||
$ npm install
|
|
||||||
```
|
|
||||||
|
|
||||||
To run the project now, run:
|
|
||||||
|
|
||||||
``` bash
|
|
||||||
# This command start a local server you can access and edit live.
|
|
||||||
$ npm run serve
|
|
||||||
```
|
|
||||||
|
|
||||||
### Commonly used NPM scripts
|
|
||||||
|
|
||||||
``` bash
|
|
||||||
# This command will generate a static site inside a public directory in your project.
|
|
||||||
$ npm run build
|
|
||||||
|
|
||||||
# This command will lint your files.
|
|
||||||
$ npm run lint
|
|
||||||
```
|
|
||||||
|
|
||||||
**Please make sure to have `npm run build` pass successfully before submitting a PR.** Although the same tests will be run against your PR on the CI server, it is better to have it working locally.
|
|
||||||
|
|
||||||
## Project Structure
|
|
||||||
|
|
||||||
- **`public`**: contains built files for distribution. Note this directory is only updated when a release happens or when you run the build command. Changes to this folder will not carry over with Git.
|
|
||||||
|
|
||||||
- **`src`**: contains the main code files.
|
|
||||||
|
|
||||||
- **`.vuepress`**: contains the main code files.
|
|
||||||
|
|
||||||
- **`components`**: this contains all the `.vue` components used on the website.
|
|
||||||
|
|
||||||
- **`config`**: contains complementary files for `config.js`.
|
|
||||||
|
|
||||||
- `navBar.js`: config for navigation bar.
|
|
||||||
|
|
||||||
- `plugins.js`: config for plugins.
|
|
||||||
|
|
||||||
- `sideBar.js`: config for sidebar.
|
|
||||||
|
|
||||||
- **`public`**: contains the static images/videos/scripts you'll want to use for the website.
|
|
||||||
|
|
||||||
- **`store`**: this contains the data store file used to connect features like downloads to main app and its forks.
|
|
||||||
|
|
||||||
- **`styles`**: all the projects style files are contained here.
|
|
||||||
|
|
||||||
- **`theme`**: this contains the extended Vuepress theme files.
|
|
||||||
|
|
||||||
- [`config.js`](https://vuepress.vuejs.org/guide/basic-config.html#config-file): main config file for Vuepress.
|
|
||||||
|
|
||||||
- `constants.js`: all reused variables/constants is stored here.
|
|
||||||
|
|
||||||
- [`enhanceApp.js`](https://vuepress.vuejs.org/guide/basic-config.html#app-level-enhancements): this file is the place to install Vue plugins, register components and directives, etc.
|
|
||||||
|
|
||||||
- **`download`**: contains the markdown file for the `/download/` page.
|
|
||||||
|
|
||||||
- **`extensions`**: contains the markdown file for the `/extensions/` page.
|
|
||||||
|
|
||||||
- **`forks`**: contains the markdown files for the `/forks/...` pages.
|
|
||||||
|
|
||||||
- **`help`**: contains the markdown files for all the `/help/...` pages.
|
|
||||||
|
|
||||||
- **`sandbox`**: contains the markdown files for the `/sandbox/...` pages.
|
|
||||||
|
|
||||||
- `README.md`: markdown file for the front-page.
|
|
||||||
|
|
||||||
- `package.json`: contains information about which plugins are installed in the project.
|
|
||||||
|
|
||||||
## Images and Videos guidelines
|
|
||||||
|
|
||||||
### Common
|
|
||||||
- Use the Android Emulator
|
|
||||||
|
|
||||||
- Use the white theme
|
|
||||||
|
|
||||||
- Preferably use local source or a self-hosted extension
|
|
||||||
- If you are going to show a manga
|
|
||||||
|
|
||||||
- Resize to have a width of 648px
|
|
||||||
|
|
||||||
### Images
|
|
||||||
- Use `.webp` format
|
|
||||||
|
|
||||||
### Videos
|
|
||||||
- Use `.webm` format
|
|
||||||
- Encode it with our [HandBrake profile](.github/assets/tachiyomi-handbrake-profile.json)
|
|
||||||
|
|
||||||
- Remove audio track
|
|
||||||
|
|
||||||
## Credits
|
|
||||||
|
|
||||||
Thank you to all the people who have already contributed!
|
|
||||||
|
|
||||||
<a href="https://github.com/tachiyomiorg/website/graphs/contributors">
|
|
||||||
<img src="https://contrib.rocks/image?repo=tachiyomiorg/website" />
|
|
||||||
</a>
|
|
373
LICENSE
@ -1,373 +0,0 @@
|
|||||||
Mozilla Public License Version 2.0
|
|
||||||
==================================
|
|
||||||
|
|
||||||
1. Definitions
|
|
||||||
--------------
|
|
||||||
|
|
||||||
1.1. "Contributor"
|
|
||||||
means each individual or legal entity that creates, contributes to
|
|
||||||
the creation of, or owns Covered Software.
|
|
||||||
|
|
||||||
1.2. "Contributor Version"
|
|
||||||
means the combination of the Contributions of others (if any) used
|
|
||||||
by a Contributor and that particular Contributor's Contribution.
|
|
||||||
|
|
||||||
1.3. "Contribution"
|
|
||||||
means Covered Software of a particular Contributor.
|
|
||||||
|
|
||||||
1.4. "Covered Software"
|
|
||||||
means Source Code Form to which the initial Contributor has attached
|
|
||||||
the notice in Exhibit A, the Executable Form of such Source Code
|
|
||||||
Form, and Modifications of such Source Code Form, in each case
|
|
||||||
including portions thereof.
|
|
||||||
|
|
||||||
1.5. "Incompatible With Secondary Licenses"
|
|
||||||
means
|
|
||||||
|
|
||||||
(a) that the initial Contributor has attached the notice described
|
|
||||||
in Exhibit B to the Covered Software; or
|
|
||||||
|
|
||||||
(b) that the Covered Software was made available under the terms of
|
|
||||||
version 1.1 or earlier of the License, but not also under the
|
|
||||||
terms of a Secondary License.
|
|
||||||
|
|
||||||
1.6. "Executable Form"
|
|
||||||
means any form of the work other than Source Code Form.
|
|
||||||
|
|
||||||
1.7. "Larger Work"
|
|
||||||
means a work that combines Covered Software with other material, in
|
|
||||||
a separate file or files, that is not Covered Software.
|
|
||||||
|
|
||||||
1.8. "License"
|
|
||||||
means this document.
|
|
||||||
|
|
||||||
1.9. "Licensable"
|
|
||||||
means having the right to grant, to the maximum extent possible,
|
|
||||||
whether at the time of the initial grant or subsequently, any and
|
|
||||||
all of the rights conveyed by this License.
|
|
||||||
|
|
||||||
1.10. "Modifications"
|
|
||||||
means any of the following:
|
|
||||||
|
|
||||||
(a) any file in Source Code Form that results from an addition to,
|
|
||||||
deletion from, or modification of the contents of Covered
|
|
||||||
Software; or
|
|
||||||
|
|
||||||
(b) any new file in Source Code Form that contains any Covered
|
|
||||||
Software.
|
|
||||||
|
|
||||||
1.11. "Patent Claims" of a Contributor
|
|
||||||
means any patent claim(s), including without limitation, method,
|
|
||||||
process, and apparatus claims, in any patent Licensable by such
|
|
||||||
Contributor that would be infringed, but for the grant of the
|
|
||||||
License, by the making, using, selling, offering for sale, having
|
|
||||||
made, import, or transfer of either its Contributions or its
|
|
||||||
Contributor Version.
|
|
||||||
|
|
||||||
1.12. "Secondary License"
|
|
||||||
means either the GNU General Public License, Version 2.0, the GNU
|
|
||||||
Lesser General Public License, Version 2.1, the GNU Affero General
|
|
||||||
Public License, Version 3.0, or any later versions of those
|
|
||||||
licenses.
|
|
||||||
|
|
||||||
1.13. "Source Code Form"
|
|
||||||
means the form of the work preferred for making modifications.
|
|
||||||
|
|
||||||
1.14. "You" (or "Your")
|
|
||||||
means an individual or a legal entity exercising rights under this
|
|
||||||
License. For legal entities, "You" includes any entity that
|
|
||||||
controls, is controlled by, or is under common control with You. For
|
|
||||||
purposes of this definition, "control" means (a) the power, direct
|
|
||||||
or indirect, to cause the direction or management of such entity,
|
|
||||||
whether by contract or otherwise, or (b) ownership of more than
|
|
||||||
fifty percent (50%) of the outstanding shares or beneficial
|
|
||||||
ownership of such entity.
|
|
||||||
|
|
||||||
2. License Grants and Conditions
|
|
||||||
--------------------------------
|
|
||||||
|
|
||||||
2.1. Grants
|
|
||||||
|
|
||||||
Each Contributor hereby grants You a world-wide, royalty-free,
|
|
||||||
non-exclusive license:
|
|
||||||
|
|
||||||
(a) under intellectual property rights (other than patent or trademark)
|
|
||||||
Licensable by such Contributor to use, reproduce, make available,
|
|
||||||
modify, display, perform, distribute, and otherwise exploit its
|
|
||||||
Contributions, either on an unmodified basis, with Modifications, or
|
|
||||||
as part of a Larger Work; and
|
|
||||||
|
|
||||||
(b) under Patent Claims of such Contributor to make, use, sell, offer
|
|
||||||
for sale, have made, import, and otherwise transfer either its
|
|
||||||
Contributions or its Contributor Version.
|
|
||||||
|
|
||||||
2.2. Effective Date
|
|
||||||
|
|
||||||
The licenses granted in Section 2.1 with respect to any Contribution
|
|
||||||
become effective for each Contribution on the date the Contributor first
|
|
||||||
distributes such Contribution.
|
|
||||||
|
|
||||||
2.3. Limitations on Grant Scope
|
|
||||||
|
|
||||||
The licenses granted in this Section 2 are the only rights granted under
|
|
||||||
this License. No additional rights or licenses will be implied from the
|
|
||||||
distribution or licensing of Covered Software under this License.
|
|
||||||
Notwithstanding Section 2.1(b) above, no patent license is granted by a
|
|
||||||
Contributor:
|
|
||||||
|
|
||||||
(a) for any code that a Contributor has removed from Covered Software;
|
|
||||||
or
|
|
||||||
|
|
||||||
(b) for infringements caused by: (i) Your and any other third party's
|
|
||||||
modifications of Covered Software, or (ii) the combination of its
|
|
||||||
Contributions with other software (except as part of its Contributor
|
|
||||||
Version); or
|
|
||||||
|
|
||||||
(c) under Patent Claims infringed by Covered Software in the absence of
|
|
||||||
its Contributions.
|
|
||||||
|
|
||||||
This License does not grant any rights in the trademarks, service marks,
|
|
||||||
or logos of any Contributor (except as may be necessary to comply with
|
|
||||||
the notice requirements in Section 3.4).
|
|
||||||
|
|
||||||
2.4. Subsequent Licenses
|
|
||||||
|
|
||||||
No Contributor makes additional grants as a result of Your choice to
|
|
||||||
distribute the Covered Software under a subsequent version of this
|
|
||||||
License (see Section 10.2) or under the terms of a Secondary License (if
|
|
||||||
permitted under the terms of Section 3.3).
|
|
||||||
|
|
||||||
2.5. Representation
|
|
||||||
|
|
||||||
Each Contributor represents that the Contributor believes its
|
|
||||||
Contributions are its original creation(s) or it has sufficient rights
|
|
||||||
to grant the rights to its Contributions conveyed by this License.
|
|
||||||
|
|
||||||
2.6. Fair Use
|
|
||||||
|
|
||||||
This License is not intended to limit any rights You have under
|
|
||||||
applicable copyright doctrines of fair use, fair dealing, or other
|
|
||||||
equivalents.
|
|
||||||
|
|
||||||
2.7. Conditions
|
|
||||||
|
|
||||||
Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
|
|
||||||
in Section 2.1.
|
|
||||||
|
|
||||||
3. Responsibilities
|
|
||||||
-------------------
|
|
||||||
|
|
||||||
3.1. Distribution of Source Form
|
|
||||||
|
|
||||||
All distribution of Covered Software in Source Code Form, including any
|
|
||||||
Modifications that You create or to which You contribute, must be under
|
|
||||||
the terms of this License. You must inform recipients that the Source
|
|
||||||
Code Form of the Covered Software is governed by the terms of this
|
|
||||||
License, and how they can obtain a copy of this License. You may not
|
|
||||||
attempt to alter or restrict the recipients' rights in the Source Code
|
|
||||||
Form.
|
|
||||||
|
|
||||||
3.2. Distribution of Executable Form
|
|
||||||
|
|
||||||
If You distribute Covered Software in Executable Form then:
|
|
||||||
|
|
||||||
(a) such Covered Software must also be made available in Source Code
|
|
||||||
Form, as described in Section 3.1, and You must inform recipients of
|
|
||||||
the Executable Form how they can obtain a copy of such Source Code
|
|
||||||
Form by reasonable means in a timely manner, at a charge no more
|
|
||||||
than the cost of distribution to the recipient; and
|
|
||||||
|
|
||||||
(b) You may distribute such Executable Form under the terms of this
|
|
||||||
License, or sublicense it under different terms, provided that the
|
|
||||||
license for the Executable Form does not attempt to limit or alter
|
|
||||||
the recipients' rights in the Source Code Form under this License.
|
|
||||||
|
|
||||||
3.3. Distribution of a Larger Work
|
|
||||||
|
|
||||||
You may create and distribute a Larger Work under terms of Your choice,
|
|
||||||
provided that You also comply with the requirements of this License for
|
|
||||||
the Covered Software. If the Larger Work is a combination of Covered
|
|
||||||
Software with a work governed by one or more Secondary Licenses, and the
|
|
||||||
Covered Software is not Incompatible With Secondary Licenses, this
|
|
||||||
License permits You to additionally distribute such Covered Software
|
|
||||||
under the terms of such Secondary License(s), so that the recipient of
|
|
||||||
the Larger Work may, at their option, further distribute the Covered
|
|
||||||
Software under the terms of either this License or such Secondary
|
|
||||||
License(s).
|
|
||||||
|
|
||||||
3.4. Notices
|
|
||||||
|
|
||||||
You may not remove or alter the substance of any license notices
|
|
||||||
(including copyright notices, patent notices, disclaimers of warranty,
|
|
||||||
or limitations of liability) contained within the Source Code Form of
|
|
||||||
the Covered Software, except that You may alter any license notices to
|
|
||||||
the extent required to remedy known factual inaccuracies.
|
|
||||||
|
|
||||||
3.5. Application of Additional Terms
|
|
||||||
|
|
||||||
You may choose to offer, and to charge a fee for, warranty, support,
|
|
||||||
indemnity or liability obligations to one or more recipients of Covered
|
|
||||||
Software. However, You may do so only on Your own behalf, and not on
|
|
||||||
behalf of any Contributor. You must make it absolutely clear that any
|
|
||||||
such warranty, support, indemnity, or liability obligation is offered by
|
|
||||||
You alone, and You hereby agree to indemnify every Contributor for any
|
|
||||||
liability incurred by such Contributor as a result of warranty, support,
|
|
||||||
indemnity or liability terms You offer. You may include additional
|
|
||||||
disclaimers of warranty and limitations of liability specific to any
|
|
||||||
jurisdiction.
|
|
||||||
|
|
||||||
4. Inability to Comply Due to Statute or Regulation
|
|
||||||
---------------------------------------------------
|
|
||||||
|
|
||||||
If it is impossible for You to comply with any of the terms of this
|
|
||||||
License with respect to some or all of the Covered Software due to
|
|
||||||
statute, judicial order, or regulation then You must: (a) comply with
|
|
||||||
the terms of this License to the maximum extent possible; and (b)
|
|
||||||
describe the limitations and the code they affect. Such description must
|
|
||||||
be placed in a text file included with all distributions of the Covered
|
|
||||||
Software under this License. Except to the extent prohibited by statute
|
|
||||||
or regulation, such description must be sufficiently detailed for a
|
|
||||||
recipient of ordinary skill to be able to understand it.
|
|
||||||
|
|
||||||
5. Termination
|
|
||||||
--------------
|
|
||||||
|
|
||||||
5.1. The rights granted under this License will terminate automatically
|
|
||||||
if You fail to comply with any of its terms. However, if You become
|
|
||||||
compliant, then the rights granted under this License from a particular
|
|
||||||
Contributor are reinstated (a) provisionally, unless and until such
|
|
||||||
Contributor explicitly and finally terminates Your grants, and (b) on an
|
|
||||||
ongoing basis, if such Contributor fails to notify You of the
|
|
||||||
non-compliance by some reasonable means prior to 60 days after You have
|
|
||||||
come back into compliance. Moreover, Your grants from a particular
|
|
||||||
Contributor are reinstated on an ongoing basis if such Contributor
|
|
||||||
notifies You of the non-compliance by some reasonable means, this is the
|
|
||||||
first time You have received notice of non-compliance with this License
|
|
||||||
from such Contributor, and You become compliant prior to 30 days after
|
|
||||||
Your receipt of the notice.
|
|
||||||
|
|
||||||
5.2. If You initiate litigation against any entity by asserting a patent
|
|
||||||
infringement claim (excluding declaratory judgment actions,
|
|
||||||
counter-claims, and cross-claims) alleging that a Contributor Version
|
|
||||||
directly or indirectly infringes any patent, then the rights granted to
|
|
||||||
You by any and all Contributors for the Covered Software under Section
|
|
||||||
2.1 of this License shall terminate.
|
|
||||||
|
|
||||||
5.3. In the event of termination under Sections 5.1 or 5.2 above, all
|
|
||||||
end user license agreements (excluding distributors and resellers) which
|
|
||||||
have been validly granted by You or Your distributors under this License
|
|
||||||
prior to termination shall survive termination.
|
|
||||||
|
|
||||||
************************************************************************
|
|
||||||
* *
|
|
||||||
* 6. Disclaimer of Warranty *
|
|
||||||
* ------------------------- *
|
|
||||||
* *
|
|
||||||
* Covered Software is provided under this License on an "as is" *
|
|
||||||
* basis, without warranty of any kind, either expressed, implied, or *
|
|
||||||
* statutory, including, without limitation, warranties that the *
|
|
||||||
* Covered Software is free of defects, merchantable, fit for a *
|
|
||||||
* particular purpose or non-infringing. The entire risk as to the *
|
|
||||||
* quality and performance of the Covered Software is with You. *
|
|
||||||
* Should any Covered Software prove defective in any respect, You *
|
|
||||||
* (not any Contributor) assume the cost of any necessary servicing, *
|
|
||||||
* repair, or correction. This disclaimer of warranty constitutes an *
|
|
||||||
* essential part of this License. No use of any Covered Software is *
|
|
||||||
* authorized under this License except under this disclaimer. *
|
|
||||||
* *
|
|
||||||
************************************************************************
|
|
||||||
|
|
||||||
************************************************************************
|
|
||||||
* *
|
|
||||||
* 7. Limitation of Liability *
|
|
||||||
* -------------------------- *
|
|
||||||
* *
|
|
||||||
* Under no circumstances and under no legal theory, whether tort *
|
|
||||||
* (including negligence), contract, or otherwise, shall any *
|
|
||||||
* Contributor, or anyone who distributes Covered Software as *
|
|
||||||
* permitted above, be liable to You for any direct, indirect, *
|
|
||||||
* special, incidental, or consequential damages of any character *
|
|
||||||
* including, without limitation, damages for lost profits, loss of *
|
|
||||||
* goodwill, work stoppage, computer failure or malfunction, or any *
|
|
||||||
* and all other commercial damages or losses, even if such party *
|
|
||||||
* shall have been informed of the possibility of such damages. This *
|
|
||||||
* limitation of liability shall not apply to liability for death or *
|
|
||||||
* personal injury resulting from such party's negligence to the *
|
|
||||||
* extent applicable law prohibits such limitation. Some *
|
|
||||||
* jurisdictions do not allow the exclusion or limitation of *
|
|
||||||
* incidental or consequential damages, so this exclusion and *
|
|
||||||
* limitation may not apply to You. *
|
|
||||||
* *
|
|
||||||
************************************************************************
|
|
||||||
|
|
||||||
8. Litigation
|
|
||||||
-------------
|
|
||||||
|
|
||||||
Any litigation relating to this License may be brought only in the
|
|
||||||
courts of a jurisdiction where the defendant maintains its principal
|
|
||||||
place of business and such litigation shall be governed by laws of that
|
|
||||||
jurisdiction, without reference to its conflict-of-law provisions.
|
|
||||||
Nothing in this Section shall prevent a party's ability to bring
|
|
||||||
cross-claims or counter-claims.
|
|
||||||
|
|
||||||
9. Miscellaneous
|
|
||||||
----------------
|
|
||||||
|
|
||||||
This License represents the complete agreement concerning the subject
|
|
||||||
matter hereof. If any provision of this License is held to be
|
|
||||||
unenforceable, such provision shall be reformed only to the extent
|
|
||||||
necessary to make it enforceable. Any law or regulation which provides
|
|
||||||
that the language of a contract shall be construed against the drafter
|
|
||||||
shall not be used to construe this License against a Contributor.
|
|
||||||
|
|
||||||
10. Versions of the License
|
|
||||||
---------------------------
|
|
||||||
|
|
||||||
10.1. New Versions
|
|
||||||
|
|
||||||
Mozilla Foundation is the license steward. Except as provided in Section
|
|
||||||
10.3, no one other than the license steward has the right to modify or
|
|
||||||
publish new versions of this License. Each version will be given a
|
|
||||||
distinguishing version number.
|
|
||||||
|
|
||||||
10.2. Effect of New Versions
|
|
||||||
|
|
||||||
You may distribute the Covered Software under the terms of the version
|
|
||||||
of the License under which You originally received the Covered Software,
|
|
||||||
or under the terms of any subsequent version published by the license
|
|
||||||
steward.
|
|
||||||
|
|
||||||
10.3. Modified Versions
|
|
||||||
|
|
||||||
If you create software not governed by this License, and you want to
|
|
||||||
create a new license for such software, you may create and use a
|
|
||||||
modified version of this License if you rename the license and remove
|
|
||||||
any references to the name of the license steward (except to note that
|
|
||||||
such modified license differs from this License).
|
|
||||||
|
|
||||||
10.4. Distributing Source Code Form that is Incompatible With Secondary
|
|
||||||
Licenses
|
|
||||||
|
|
||||||
If You choose to distribute Source Code Form that is Incompatible With
|
|
||||||
Secondary Licenses under the terms of this version of the License, the
|
|
||||||
notice described in Exhibit B of this License must be attached.
|
|
||||||
|
|
||||||
Exhibit A - Source Code Form License Notice
|
|
||||||
-------------------------------------------
|
|
||||||
|
|
||||||
This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
||||||
|
|
||||||
If it is not possible or desirable to put the notice in a particular
|
|
||||||
file, then You may include the notice in a location (such as a LICENSE
|
|
||||||
file in a relevant directory) where a recipient would be likely to look
|
|
||||||
for such a notice.
|
|
||||||
|
|
||||||
You may add additional accurate notices of copyright ownership.
|
|
||||||
|
|
||||||
Exhibit B - "Incompatible With Secondary Licenses" Notice
|
|
||||||
---------------------------------------------------------
|
|
||||||
|
|
||||||
This Source Code Form is "Incompatible With Secondary Licenses", as
|
|
||||||
defined by the Mozilla Public License, v. 2.0.
|
|
55
README.md
@ -1,55 +0,0 @@
|
|||||||
<div>
|
|
||||||
<p align="center">
|
|
||||||
<img src="./src/.vuepress/public/icons/logo.png" height="100px">
|
|
||||||
</p>
|
|
||||||
<h1 align="center">Tachiyomi Website</h1>
|
|
||||||
<p align="center">
|
|
||||||
<a href="https://discord.gg/tachiyomi">
|
|
||||||
<img src="https://img.shields.io/discord/349436576037732353.svg?label=Discord&labelColor=7289da&color=2c2f33&style=flat" alt="Discord">
|
|
||||||
</a>
|
|
||||||
<br>
|
|
||||||
<a title="Netlify deployment" href="https://app.netlify.com/sites/tachiyomiorg/deploys">
|
|
||||||
<img src="https://api.netlify.com/api/v1/badges/95d9e2f8-42ae-4e40-8c99-82b870c51e1a/deploy-status">
|
|
||||||
</a>
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
## Contributing
|
|
||||||
|
|
||||||
Pull requests are welcome. For major changes, please open an issue first to discuss what you would like to change.
|
|
||||||
|
|
||||||
- [Code of Conduct](./CODE_OF_CONDUCT.md)
|
|
||||||
- [Contributing guide](./CONTRIBUTING.md)
|
|
||||||
- [Project style guide](https://tachiyomi.org/sandbox/style-guide/)
|
|
||||||
|
|
||||||
If you have any questions, then [join our Discord server](https://discord.gg/tachiyomi).
|
|
||||||
|
|
||||||
## Repositories
|
|
||||||
|
|
||||||
<div>
|
|
||||||
<p align="center">
|
|
||||||
<a href="https://github.com/tachiyomiorg/tachiyomi/">
|
|
||||||
<img src="https://github-readme-stats.vercel.app/api/pin/?username=tachiyomiorg&repo=tachiyomi&bg_color=0000&text_color=777&hide_border=true" alt="Android App">
|
|
||||||
</a>
|
|
||||||
<a href="https://github.com/tachiyomiorg/tachiyomi-extensions/">
|
|
||||||
<img src="https://github-readme-stats.vercel.app/api/pin/?username=tachiyomiorg&repo=tachiyomi-extensions&bg_color=0000&text_color=777&hide_border=true" alt="App Extensions">
|
|
||||||
</a>
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
## License
|
|
||||||
|
|
||||||
Copyright (C) 2018 The Tachiyomi Open Source Project
|
|
||||||
|
|
||||||
This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
||||||
|
|
||||||
## Credits
|
|
||||||
|
|
||||||
Thank you to all the people who have already contributed!
|
|
||||||
|
|
||||||
<a href="https://github.com/tachiyomiorg/website/graphs/contributors">
|
|
||||||
<img src="https://contrib.rocks/image?repo=tachiyomiorg/website" />
|
|
||||||
</a>
|
|
35333
package-lock.json
generated
60
package.json
@ -1,60 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "tachiyomi-website",
|
|
||||||
"version": "1.0.0",
|
|
||||||
"description": "Official website for the Tachiyomi app.",
|
|
||||||
"license": "MPL-2.0",
|
|
||||||
"private": true,
|
|
||||||
"repository": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "git+https://github.com/tachiyomiorg/website.git"
|
|
||||||
},
|
|
||||||
"bugs": {
|
|
||||||
"url": "https://github.com/tachiyomiorg/website/issues"
|
|
||||||
},
|
|
||||||
"homepage": "https://github.com/tachiyomiorg/website#readme",
|
|
||||||
"scripts": {
|
|
||||||
"build": "npm run lint && vuepress build src",
|
|
||||||
"lint": "eslint --fix 'src/.vuepress/**/*.{js,vue}' --no-ignore",
|
|
||||||
"serve": "vuepress dev src"
|
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"@mr-hope/vuepress-plugin-sitemap": "1.30.0",
|
|
||||||
"@vuepress/plugin-active-header-links": "1.9.9",
|
|
||||||
"@vuepress/plugin-back-to-top": "1.9.9",
|
|
||||||
"@vuepress/plugin-pwa": "1.9.9",
|
|
||||||
"axios": "0.26.1",
|
|
||||||
"core-js": "2.6.12",
|
|
||||||
"docsearch.js": "2.6.3",
|
|
||||||
"element-ui": "2.15.14",
|
|
||||||
"lodash.groupby": "4.6.0",
|
|
||||||
"marked": "4.2.12",
|
|
||||||
"material-design-icons-iconfont": "6.7.0",
|
|
||||||
"moment": "2.29.4",
|
|
||||||
"vue": "2.7.14",
|
|
||||||
"vue-agile": "2.0.0",
|
|
||||||
"vue-material-design-icons": "5.1.2",
|
|
||||||
"vue-moment": "4.1.0",
|
|
||||||
"vue-sweetalert2": "5.0.5",
|
|
||||||
"vuepress": "1.9.10",
|
|
||||||
"vuepress-plugin-clean-urls": "1.1.2",
|
|
||||||
"vuepress-plugin-container": "2.1.5",
|
|
||||||
"vuepress-plugin-dehydrate": "1.1.5",
|
|
||||||
"vuepress-plugin-element-ui": "1.1.0",
|
|
||||||
"vuepress-plugin-google-analytics-4": "0.1.1",
|
|
||||||
"vuepress-plugin-robots": "1.0.1",
|
|
||||||
"vuepress-plugin-zooming": "1.1.8",
|
|
||||||
"vuex": "3.6.2"
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"babel-eslint": "10.1.0",
|
|
||||||
"eslint": "7.32.0",
|
|
||||||
"eslint-config-vuepress": "3.10.0",
|
|
||||||
"eslint-plugin-markdown": "3.0.1",
|
|
||||||
"eslint-plugin-promise": "6.1.1",
|
|
||||||
"eslint-plugin-vue": "9.17.0",
|
|
||||||
"prettier": "2.8.8",
|
|
||||||
"sass": "1.66.1",
|
|
||||||
"sass-loader": "10.4.1",
|
|
||||||
"webpack": "4.46.0"
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,25 +0,0 @@
|
|||||||
<script>
|
|
||||||
export default {
|
|
||||||
name: "CarouselItem",
|
|
||||||
props: {
|
|
||||||
name: {
|
|
||||||
type: String,
|
|
||||||
default: "carousel-cell",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
};
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<template>
|
|
||||||
<div :id="name" class="slide">
|
|
||||||
<slot />
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
.slide {
|
|
||||||
align-items: center;
|
|
||||||
display: flex;
|
|
||||||
justify-content: center;
|
|
||||||
}
|
|
||||||
</style>
|
|
@ -1,108 +0,0 @@
|
|||||||
<script>
|
|
||||||
export default {
|
|
||||||
name: "CarouselWrapper",
|
|
||||||
props: {
|
|
||||||
name: {
|
|
||||||
type: String,
|
|
||||||
default: "carousel",
|
|
||||||
},
|
|
||||||
config: {
|
|
||||||
type: Object,
|
|
||||||
default() {
|
|
||||||
return {
|
|
||||||
navButtons: true,
|
|
||||||
centerMode: true,
|
|
||||||
};
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
};
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<template>
|
|
||||||
<VueAgile :id="name" :options="config">
|
|
||||||
<slot />
|
|
||||||
<template #prevButton>
|
|
||||||
<MaterialIcon icon="navigate_next" />
|
|
||||||
</template>
|
|
||||||
<template #nextButton>
|
|
||||||
<MaterialIcon icon="navigate_next" />
|
|
||||||
</template>
|
|
||||||
</VueAgile>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
.agile {
|
|
||||||
background: #f0f4f8;
|
|
||||||
border-radius: 1em;
|
|
||||||
margin-bottom: 1rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.agile__nav-button {
|
|
||||||
background: hsla(0, 0%, 100%, 0.75);
|
|
||||||
border: none;
|
|
||||||
color: rgba(44, 62, 80);
|
|
||||||
cursor: pointer;
|
|
||||||
font-size: 24px;
|
|
||||||
height: 50px;
|
|
||||||
top: 50%;
|
|
||||||
transform: translateY(-50%);
|
|
||||||
position: absolute;
|
|
||||||
transition-duration: 0.3s;
|
|
||||||
width: 50px;
|
|
||||||
border-radius: 99em;
|
|
||||||
}
|
|
||||||
|
|
||||||
.agile__nav-button:hover {
|
|
||||||
background-color: rgba(0, 0, 0, 0.5);
|
|
||||||
opacity: 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
.agile__nav-button--prev {
|
|
||||||
left: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.agile__nav-button--prev i {
|
|
||||||
transform: rotateZ(180deg);
|
|
||||||
}
|
|
||||||
|
|
||||||
.agile__nav-button--next {
|
|
||||||
right: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.agile__dots {
|
|
||||||
bottom: 10px;
|
|
||||||
left: 50%;
|
|
||||||
position: absolute;
|
|
||||||
transform: translateX(-50%);
|
|
||||||
}
|
|
||||||
|
|
||||||
.agile__dot {
|
|
||||||
margin: 0 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.agile__dot button {
|
|
||||||
background-color: hsla(0, 0%, 100%, 0.75);
|
|
||||||
border: 1px solid hsla(0, 0%, 100%, 0.75);
|
|
||||||
border-radius: 50%;
|
|
||||||
cursor: pointer;
|
|
||||||
display: block;
|
|
||||||
height: 10px;
|
|
||||||
font-size: 0;
|
|
||||||
line-height: 0;
|
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
transition-duration: 0.3s;
|
|
||||||
width: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.agile__dot--current button {
|
|
||||||
background-color: rgba(44, 62, 80);
|
|
||||||
border-color: rgba(44, 62, 80);
|
|
||||||
}
|
|
||||||
|
|
||||||
.agile__dot button:hover {
|
|
||||||
background-color: rgba(44, 62, 80);
|
|
||||||
border-color: rgba(44, 62, 80);
|
|
||||||
}
|
|
||||||
</style>
|
|
@ -1,169 +0,0 @@
|
|||||||
<script>
|
|
||||||
import { GITHUB_PREVIEW_RELEASE, GITHUB_STABLE_RELEASE } from "../constants";
|
|
||||||
|
|
||||||
export default {
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
tagName: "0.00.0",
|
|
||||||
browserDownloadUrl: "",
|
|
||||||
previewTagName: "r0000",
|
|
||||||
previewbrowserDownloadUrl: "",
|
|
||||||
};
|
|
||||||
},
|
|
||||||
|
|
||||||
async mounted() {
|
|
||||||
try {
|
|
||||||
const { data } = await this.$store.dispatch("getStableReleaseData");
|
|
||||||
const apkAsset = data.assets.find((a) => /^tachiyomi-v\d+\.\d+\.\d+.apk/.test(a.name));
|
|
||||||
this.$data.tagName = data.tag_name.slice(1);
|
|
||||||
this.$data.browserDownloadUrl = apkAsset.browser_download_url;
|
|
||||||
} catch (e) {
|
|
||||||
console.error(e);
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
const { data } = await this.$store.dispatch("getPreviewReleaseData");
|
|
||||||
const apkAsset = data.assets.find((a) => /^tachiyomi-r\d{4,}.apk/.test(a.name));
|
|
||||||
this.$data.previewTagName = data.tag_name;
|
|
||||||
this.$data.previewbrowserDownloadUrl = apkAsset.browser_download_url;
|
|
||||||
} catch (e) {
|
|
||||||
console.error(e);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
methods: {
|
|
||||||
downloadStable() {
|
|
||||||
this.$swal({
|
|
||||||
title: "Downloading",
|
|
||||||
html: `Started downloading <strong>Tachiyomi Stable</strong>`,
|
|
||||||
icon: "success",
|
|
||||||
focusConfirm: false,
|
|
||||||
focusCancel: false,
|
|
||||||
timer: 3000,
|
|
||||||
timerProgressBar: true,
|
|
||||||
showClass: {
|
|
||||||
popup: "animate__animated animate__faster animate__pulse",
|
|
||||||
},
|
|
||||||
hideClass: {
|
|
||||||
popup: "animate__animated animate__faster animate__zoomOut",
|
|
||||||
},
|
|
||||||
});
|
|
||||||
window.location.assign(this.$data.browserDownloadUrl || GITHUB_STABLE_RELEASE);
|
|
||||||
window.ga("send", "event", "Action", "Download", "Tachiyomi");
|
|
||||||
},
|
|
||||||
downloadPreview() {
|
|
||||||
this.$swal({
|
|
||||||
icon: "warning",
|
|
||||||
title: "Are you sure?",
|
|
||||||
html: `
|
|
||||||
<strong>Tachiyomi Preview</strong> is not recommended if you're not willing to test for – and endure – issues.
|
|
||||||
<div class="note">
|
|
||||||
<p>
|
|
||||||
Read more about Tachiyomi Preview
|
|
||||||
<a href="../help/faq/#what-is-tachiyomi-preview" rel="help">here</a>.
|
|
||||||
</p>
|
|
||||||
</div>`,
|
|
||||||
confirmButtonText: "I am sure.",
|
|
||||||
showCloseButton: true,
|
|
||||||
showCancelButton: false,
|
|
||||||
showClass: {
|
|
||||||
popup: "animate__animated animate__headShake",
|
|
||||||
},
|
|
||||||
hideClass: {
|
|
||||||
popup: "animate__animated animate__faster animate__zoomOut",
|
|
||||||
},
|
|
||||||
customClass: {
|
|
||||||
content: "swal2-downloadPreview_content",
|
|
||||||
},
|
|
||||||
// eslint-disable-next-line no-shadow
|
|
||||||
}).then((result) => {
|
|
||||||
if (result.value) {
|
|
||||||
this.$swal({
|
|
||||||
icon: "success",
|
|
||||||
title: "Downloading",
|
|
||||||
html: `Started downloading <strong>Tachiyomi Preview</strong>`,
|
|
||||||
confirmButtonText: "Dismiss",
|
|
||||||
showCloseButton: false,
|
|
||||||
showCancelButton: false,
|
|
||||||
timer: 3000,
|
|
||||||
timerProgressBar: true,
|
|
||||||
showClass: {
|
|
||||||
popup: "animate__animated animate__faster animate__pulse",
|
|
||||||
},
|
|
||||||
hideClass: {
|
|
||||||
popup: "animate__animated animate__faster animate__zoomOut",
|
|
||||||
},
|
|
||||||
});
|
|
||||||
window.location.assign(this.$data.previewbrowserDownloadUrl || GITHUB_PREVIEW_RELEASE);
|
|
||||||
window.ga("send", "event", "Action", "Download", "Tachiyomi Preview");
|
|
||||||
}
|
|
||||||
});
|
|
||||||
},
|
|
||||||
},
|
|
||||||
};
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<template>
|
|
||||||
<div id="DownloadButtons">
|
|
||||||
<ElButton type="success" icon="el-icon-download" @click="downloadStable" @keyup.enter="downloadStable">
|
|
||||||
<span class="spacing">Stable</span>
|
|
||||||
<br />
|
|
||||||
<span class="downloadTag">{{ $data.tagName }}</span>
|
|
||||||
</ElButton>
|
|
||||||
<ElButton type="warning" icon="el-icon-cpu" @click="downloadPreview" @keyup.enter="downloadPreview">
|
|
||||||
<span class="spacing">Preview</span>
|
|
||||||
<br />
|
|
||||||
<span class="downloadTag">{{ $data.previewTagName }}</span>
|
|
||||||
</ElButton>
|
|
||||||
<span class="versionNotice">
|
|
||||||
Requires
|
|
||||||
<strong>Android 6.0</strong>
|
|
||||||
or higher.
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<style lang="stylus">
|
|
||||||
#DownloadButtons
|
|
||||||
text-align center
|
|
||||||
.el-button
|
|
||||||
font-size 1.125rem
|
|
||||||
margin 0.1em !important
|
|
||||||
padding 12px 32px
|
|
||||||
width 10em
|
|
||||||
&:focus
|
|
||||||
box-shadow 0 0 30px #b1aeae52, 0 0 0 1px #fff, 0 0 0 3px rgba(50, 100, 150, 0.4)
|
|
||||||
outline none
|
|
||||||
&--success
|
|
||||||
background-color $accentColor
|
|
||||||
border-color $accentColor
|
|
||||||
&:hover
|
|
||||||
background-color lighten($accentColor, 10%)
|
|
||||||
border-color lighten($accentColor, 10%)
|
|
||||||
.downloadTag
|
|
||||||
color lighten($accentColor, 75%)
|
|
||||||
&--warning
|
|
||||||
background-color $accentColorSecondary
|
|
||||||
border-color $accentColorSecondary
|
|
||||||
&:hover
|
|
||||||
background-color lighten($accentColorSecondary, 10%)
|
|
||||||
border-color lighten($accentColorSecondary, 10%)
|
|
||||||
.downloadTag
|
|
||||||
color lighten($accentColorSecondary, 75%)
|
|
||||||
.spacing
|
|
||||||
margin-right 16px
|
|
||||||
.downloadTag
|
|
||||||
font-size 0.7em
|
|
||||||
margin-top 2px
|
|
||||||
.versionNotice
|
|
||||||
display block
|
|
||||||
font-size 0.9rem
|
|
||||||
@media (max-width: $MQMobile)
|
|
||||||
.el-button
|
|
||||||
width 8.2em
|
|
||||||
padding 12px 28px
|
|
||||||
.swal2-
|
|
||||||
&downloadPreview_
|
|
||||||
&content
|
|
||||||
.note
|
|
||||||
text-align center
|
|
||||||
</style>
|
|
@ -1,68 +0,0 @@
|
|||||||
<script>
|
|
||||||
import { langName, simpleLangName } from "../scripts/languages";
|
|
||||||
|
|
||||||
export default {
|
|
||||||
props: ["extensions"],
|
|
||||||
emits: ["filters"],
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
filters: {
|
|
||||||
search: "",
|
|
||||||
lang: [],
|
|
||||||
nsfw: "Don't care",
|
|
||||||
sort: "Ascending",
|
|
||||||
},
|
|
||||||
};
|
|
||||||
},
|
|
||||||
watch: {
|
|
||||||
filters: {
|
|
||||||
handler(value) {
|
|
||||||
this.$emit("filters", this.filters);
|
|
||||||
},
|
|
||||||
deep: true,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
simpleLangName,
|
|
||||||
langName,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
</script>
|
|
||||||
<template>
|
|
||||||
<span class="filters-list">
|
|
||||||
<ElInput v-model="filters.search" placeholder="Search extensions by name or ID..." clearable />
|
|
||||||
|
|
||||||
<ElSelect v-model="filters.lang" placeholder="Show specific languages..." multiple clearable>
|
|
||||||
<ElOption
|
|
||||||
v-for="[group] in extensions"
|
|
||||||
:key="group.lang"
|
|
||||||
:label="group.lang === 'en' ? simpleLangName(group.lang) : langName(group.lang)"
|
|
||||||
:value="group.lang"
|
|
||||||
/>
|
|
||||||
</ElSelect>
|
|
||||||
|
|
||||||
<div>
|
|
||||||
Sort by
|
|
||||||
<ElRadioGroup v-model="filters.sort">
|
|
||||||
<ElRadioButton label="Ascending"></ElRadioButton>
|
|
||||||
<ElRadioButton label="Descending"></ElRadioButton>
|
|
||||||
</ElRadioGroup>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div>
|
|
||||||
Display extensions with NSFW content?
|
|
||||||
<ElRadioGroup v-model="filters.nsfw">
|
|
||||||
<ElRadioButton label="Yes"></ElRadioButton>
|
|
||||||
<ElRadioButton label="No"></ElRadioButton>
|
|
||||||
<ElRadioButton label="Don't care"></ElRadioButton>
|
|
||||||
</ElRadioGroup>
|
|
||||||
</div>
|
|
||||||
</span>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<style lang="stylus">
|
|
||||||
.filters-list
|
|
||||||
display flex
|
|
||||||
flex-direction column
|
|
||||||
row-gap 1rem
|
|
||||||
</style>
|
|
@ -1,55 +0,0 @@
|
|||||||
<script>
|
|
||||||
import { langName, simpleLangName } from "../scripts/languages";
|
|
||||||
import ExtensionItem from "./ExtensionItem.vue";
|
|
||||||
|
|
||||||
export default {
|
|
||||||
components: { ExtensionItem },
|
|
||||||
props: ["list", "totalCount"],
|
|
||||||
computed: {
|
|
||||||
groupName: function () {
|
|
||||||
const firstItem = this.list[0];
|
|
||||||
return firstItem.lang === "en" ? simpleLangName(firstItem.lang) : langName(firstItem.lang);
|
|
||||||
},
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
simpleLangName,
|
|
||||||
langName,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
</script>
|
|
||||||
<template>
|
|
||||||
<div class="extension-group">
|
|
||||||
<h3>
|
|
||||||
{{ groupName }}
|
|
||||||
|
|
||||||
<span class="extensions-total">
|
|
||||||
Total:
|
|
||||||
<span class="extensions-total-sum">
|
|
||||||
{{ totalCount }}
|
|
||||||
</span>
|
|
||||||
</span>
|
|
||||||
</h3>
|
|
||||||
<div
|
|
||||||
v-for="extension in list"
|
|
||||||
:id="extension.pkg.replace('eu.kanade.tachiyomi.extension.', '')"
|
|
||||||
:key="extension.apk"
|
|
||||||
class="anchor"
|
|
||||||
>
|
|
||||||
<ExtensionItem :item="extension" />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
<style lang="stylus">
|
|
||||||
.extensions-total
|
|
||||||
float right
|
|
||||||
&-sum
|
|
||||||
color $accentColor
|
|
||||||
|
|
||||||
.anchor
|
|
||||||
margin-top -3.9em
|
|
||||||
padding-bottom 0.2em
|
|
||||||
padding-top 4.5em
|
|
||||||
|
|
||||||
&:first-child
|
|
||||||
border-top 1px solid $borderColor
|
|
||||||
</style>
|
|
@ -1,104 +0,0 @@
|
|||||||
<script>
|
|
||||||
export default {
|
|
||||||
props: ["item"],
|
|
||||||
computed: {
|
|
||||||
pkgId: function () {
|
|
||||||
return this.item.pkg.replace("eu.kanade.tachiyomi.extension.", "");
|
|
||||||
},
|
|
||||||
pkgName: function () {
|
|
||||||
return this.item.name.split(": ")[1];
|
|
||||||
},
|
|
||||||
pkgVersion: function () {
|
|
||||||
return "v" + this.item.version;
|
|
||||||
},
|
|
||||||
iconUrl: function () {
|
|
||||||
return `https://raw.githubusercontent.com/tachiyomiorg/tachiyomi-extensions/repo/icon/${this.item.pkg}.png`;
|
|
||||||
},
|
|
||||||
apkUrl: function () {
|
|
||||||
return `https://raw.githubusercontent.com/tachiyomiorg/tachiyomi-extensions/repo/apk/${this.item.apk}`;
|
|
||||||
},
|
|
||||||
},
|
|
||||||
};
|
|
||||||
</script>
|
|
||||||
<template>
|
|
||||||
<div v-if="item" class="extension">
|
|
||||||
<a :href="`#${pkgId}`" class="header-anchor" aria-hidden="true" @click.stop>#</a>
|
|
||||||
<img class="extension-icon" :src="iconUrl" loading="lazy" width="42" height="42" />
|
|
||||||
<div class="extension-text">
|
|
||||||
<div class="upper">
|
|
||||||
{{ pkgName }}
|
|
||||||
<Badge :text="pkgVersion" />
|
|
||||||
</div>
|
|
||||||
<div class="lower">
|
|
||||||
{{ pkgId }}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<a :href="apkUrl" class="extension-download" title="Download APK" download>
|
|
||||||
<MaterialIcon icon="cloud_download" />
|
|
||||||
<span>Download</span>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
<style lang="stylus">
|
|
||||||
.extension
|
|
||||||
align-items center
|
|
||||||
display flex
|
|
||||||
padding 0.4em 1.5em
|
|
||||||
.header-anchor
|
|
||||||
padding-left 0.2em
|
|
||||||
padding-right 0.2em
|
|
||||||
font-size 1.4em
|
|
||||||
opacity 0
|
|
||||||
&:hover .header-anchor
|
|
||||||
opacity 1
|
|
||||||
.extension-icon
|
|
||||||
margin-right 0.5em
|
|
||||||
.extension-text
|
|
||||||
flex 1
|
|
||||||
.upper
|
|
||||||
font-weight: 600
|
|
||||||
.badge
|
|
||||||
font-weight: 400
|
|
||||||
margin-left 8px
|
|
||||||
.lower
|
|
||||||
color #6c757d
|
|
||||||
font-family monospace
|
|
||||||
font-size 0.9rem
|
|
||||||
.extension-download
|
|
||||||
margin-right 0.5em
|
|
||||||
padding-left 1rem
|
|
||||||
padding-right 1rem
|
|
||||||
padding-top .5rem
|
|
||||||
padding-bottom .5rem
|
|
||||||
font-weight 700
|
|
||||||
border-radius 4px
|
|
||||||
color white
|
|
||||||
background-color $accentColor
|
|
||||||
border 1px solid $accentColor
|
|
||||||
.material-icons
|
|
||||||
color white
|
|
||||||
max-width 18px
|
|
||||||
&:hover
|
|
||||||
background-color white
|
|
||||||
color $accentColor
|
|
||||||
text-decoration none
|
|
||||||
.material-icons
|
|
||||||
color $accentColor
|
|
||||||
@media (max-width 767px)
|
|
||||||
padding 0.4em 0em
|
|
||||||
.extension-text .lower,
|
|
||||||
.extension-download span
|
|
||||||
display none
|
|
||||||
@media (max-width 767px)
|
|
||||||
.extension
|
|
||||||
border 1px solid $borderColor
|
|
||||||
border-radius 8px
|
|
||||||
|
|
||||||
.extension-download
|
|
||||||
background-color $accentColor
|
|
||||||
&:target
|
|
||||||
.extension
|
|
||||||
background-color $containerBackground
|
|
||||||
border-radius 8px
|
|
||||||
transition 500ms background-color
|
|
||||||
</style>
|
|
@ -1,30 +0,0 @@
|
|||||||
<script>
|
|
||||||
import ExtensionGroup from "./ExtensionGroup.vue";
|
|
||||||
|
|
||||||
export default {
|
|
||||||
components: { ExtensionGroup },
|
|
||||||
props: ["extensions"],
|
|
||||||
computed: {
|
|
||||||
totalCount() {
|
|
||||||
return this.extensions.reduce((sum, item) => sum + item.length, 0);
|
|
||||||
},
|
|
||||||
},
|
|
||||||
};
|
|
||||||
</script>
|
|
||||||
<template>
|
|
||||||
<div class="extension-list">
|
|
||||||
<div v-for="group in extensions" :key="group[0].lang">
|
|
||||||
<ExtensionGroup :list="group" :total-count="totalCount" />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
<style lang="stylus">
|
|
||||||
.extension-list
|
|
||||||
h3
|
|
||||||
padding-bottom 0.75em
|
|
||||||
border-bottom 1px solid $borderColor
|
|
||||||
> div
|
|
||||||
&:not(:first-of-type)
|
|
||||||
.extensions-total
|
|
||||||
display none
|
|
||||||
</style>
|
|
@ -1,103 +0,0 @@
|
|||||||
<script>
|
|
||||||
import axios from "axios";
|
|
||||||
import groupBy from "lodash.groupby";
|
|
||||||
import { GITHUB_EXTENSION_JSON } from "../constants";
|
|
||||||
import { simpleLangName } from "../scripts/languages";
|
|
||||||
import ExtensionFilters from "./ExtensionFilters.vue";
|
|
||||||
import ExtensionList from "./ExtensionList.vue";
|
|
||||||
|
|
||||||
export default {
|
|
||||||
components: { ExtensionList, ExtensionFilters },
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
extensions: [],
|
|
||||||
filters: {
|
|
||||||
search: "",
|
|
||||||
lang: [],
|
|
||||||
nsfw: "Don't care",
|
|
||||||
sort: "Ascending",
|
|
||||||
},
|
|
||||||
loading: true,
|
|
||||||
observer: null,
|
|
||||||
};
|
|
||||||
},
|
|
||||||
computed: {
|
|
||||||
filteredExtensions() {
|
|
||||||
const { extensions, filters } = this;
|
|
||||||
|
|
||||||
const filtered = [];
|
|
||||||
|
|
||||||
for (const group of extensions) {
|
|
||||||
let filteredGroup = filters.lang.length ? (filters.lang.includes(group[0].lang) ? group : []) : group;
|
|
||||||
|
|
||||||
if (filters.search) {
|
|
||||||
filteredGroup = filteredGroup.filter(
|
|
||||||
(ext) =>
|
|
||||||
ext.name.toLowerCase().includes(filters.search.toLowerCase()) ||
|
|
||||||
ext.sources.some((source) => source.id.includes(filters.search))
|
|
||||||
);
|
|
||||||
}
|
|
||||||
filteredGroup = filteredGroup.filter((ext) =>
|
|
||||||
filters.nsfw === "Don't care" ? true : ext.nsfw === (filters.nsfw === "Yes" ? 1 : 0)
|
|
||||||
);
|
|
||||||
|
|
||||||
if (filters.sort && filters.sort === "Descending") {
|
|
||||||
filteredGroup = filteredGroup.reverse();
|
|
||||||
}
|
|
||||||
if (filteredGroup.length) {
|
|
||||||
filtered.push(filteredGroup);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return filtered;
|
|
||||||
},
|
|
||||||
},
|
|
||||||
async beforeMount() {
|
|
||||||
const { data } = await axios.get(GITHUB_EXTENSION_JSON);
|
|
||||||
const values = Object.values(groupBy(data, "lang"));
|
|
||||||
values.sort(this.sortLanguages);
|
|
||||||
this.$data.extensions = values;
|
|
||||||
|
|
||||||
this.$nextTick(() => {
|
|
||||||
this.loading = false;
|
|
||||||
});
|
|
||||||
},
|
|
||||||
updated() {
|
|
||||||
if (window.location.hash) {
|
|
||||||
window.location.replace(window.location.hash);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
sortLanguages(a, b) {
|
|
||||||
const langA = simpleLangName(a[0].lang);
|
|
||||||
const langB = simpleLangName(b[0].lang);
|
|
||||||
if (langA === "All" && langB === "English") {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
if (langA === "English" && langB === "All") {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
if (langA === "English") {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
if (langB === "English") {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
if (langA < langB) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
if (langA > langB) {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
},
|
|
||||||
},
|
|
||||||
};
|
|
||||||
</script>
|
|
||||||
<template>
|
|
||||||
<div v-if="loading" v-loading.lock="loading" style="min-height: 200px"></div>
|
|
||||||
<div v-else>
|
|
||||||
<ExtensionFilters :extensions="extensions" @filters="filters = $event" />
|
|
||||||
<ExtensionList :extensions="filteredExtensions" />
|
|
||||||
</div>
|
|
||||||
</template>
|
|
@ -1,129 +0,0 @@
|
|||||||
<script>
|
|
||||||
import axios from "axios";
|
|
||||||
|
|
||||||
export default {
|
|
||||||
props: {
|
|
||||||
forkName: {
|
|
||||||
type: String,
|
|
||||||
required: true,
|
|
||||||
},
|
|
||||||
downloadForkLabel: {
|
|
||||||
type: String,
|
|
||||||
default: "Download",
|
|
||||||
},
|
|
||||||
downloadForkLink: {
|
|
||||||
type: String,
|
|
||||||
required: true,
|
|
||||||
},
|
|
||||||
downloadForkStyle: {
|
|
||||||
type: String,
|
|
||||||
default: "",
|
|
||||||
},
|
|
||||||
githubForkLabel: {
|
|
||||||
type: String,
|
|
||||||
default: "GitHub",
|
|
||||||
},
|
|
||||||
githubForkLink: {
|
|
||||||
type: String,
|
|
||||||
required: true,
|
|
||||||
},
|
|
||||||
githubForkStyle: {
|
|
||||||
type: String,
|
|
||||||
default: "",
|
|
||||||
},
|
|
||||||
androidVersion: {
|
|
||||||
type: String,
|
|
||||||
default: "5.0",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
tagName: "",
|
|
||||||
browserDownloadUrl: "",
|
|
||||||
};
|
|
||||||
},
|
|
||||||
|
|
||||||
async mounted() {
|
|
||||||
const { data } = await axios.get(this.$props.downloadForkLink);
|
|
||||||
// Maybe eventually some release has more than the apk in assets.
|
|
||||||
const apkAsset = data.assets.find((a) => a.name.includes(".apk"));
|
|
||||||
// Set the values.
|
|
||||||
this.$data.tagName = data.tag_name;
|
|
||||||
this.$data.browserDownloadUrl = apkAsset.browser_download_url;
|
|
||||||
},
|
|
||||||
|
|
||||||
methods: {
|
|
||||||
downloadFork() {
|
|
||||||
this.$swal({
|
|
||||||
title: "Downloading",
|
|
||||||
text: `${this.$props.forkName} is being downloaded.`,
|
|
||||||
icon: "success",
|
|
||||||
focusConfirm: false,
|
|
||||||
focusCancel: false,
|
|
||||||
timer: 5000,
|
|
||||||
timerProgressBar: true,
|
|
||||||
customClass: {
|
|
||||||
confirmButton: "download-confirm-button",
|
|
||||||
container: "download-container",
|
|
||||||
},
|
|
||||||
showClass: {
|
|
||||||
popup: "animated pulse faster",
|
|
||||||
},
|
|
||||||
hideClass: {
|
|
||||||
popup: "animated zoomOut faster",
|
|
||||||
},
|
|
||||||
});
|
|
||||||
window.location.assign(this.$data.browserDownloadUrl || this.$props.githubForkLink + "/releases/latest");
|
|
||||||
window.ga("send", "event", "Action", "Download", this.$props.forkName);
|
|
||||||
},
|
|
||||||
},
|
|
||||||
};
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<template>
|
|
||||||
<div class="downloadContainer">
|
|
||||||
<button class="downloadForkButton" :style="downloadForkStyle" @click="downloadFork">
|
|
||||||
{{ downloadForkLabel }}
|
|
||||||
</button>
|
|
||||||
<button class="githubForkButton" :style="githubForkStyle" :onclick="'window.open(\'' + githubForkLink + '\')'">
|
|
||||||
{{ githubForkLabel }}
|
|
||||||
</button>
|
|
||||||
<br />
|
|
||||||
<span class="versionNotice">
|
|
||||||
Requires
|
|
||||||
<strong>Android {{ androidVersion }}</strong>
|
|
||||||
or higher.
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<style lang="stylus">
|
|
||||||
.downloadContainer
|
|
||||||
user-select none
|
|
||||||
text-align center
|
|
||||||
margin 0.3125rem
|
|
||||||
.downloadForkButton
|
|
||||||
.githubForkButton
|
|
||||||
border-radius $buttonBorderRadius
|
|
||||||
border-style none
|
|
||||||
color white
|
|
||||||
font-family $fontButton
|
|
||||||
font-size 1.125em
|
|
||||||
height 3rem
|
|
||||||
margin 0.3125rem
|
|
||||||
padding 0.625 2em
|
|
||||||
width 8.5rem
|
|
||||||
&:focus
|
|
||||||
outline none
|
|
||||||
outline-style none
|
|
||||||
&:hover
|
|
||||||
cursor pointer
|
|
||||||
text-decoration none !important
|
|
||||||
background-image linear-gradient(rgba(0, 0, 0, 0.1), rgba(0, 0, 0, 0.1))
|
|
||||||
.downloadForkButton
|
|
||||||
background-color $accentColor
|
|
||||||
.githubForkButton
|
|
||||||
background-color #181818
|
|
||||||
&:hover
|
|
||||||
background-color lighten(#181818, 15)
|
|
||||||
</style>
|
|
@ -1,27 +0,0 @@
|
|||||||
<script>
|
|
||||||
import PageEdit from "@theme/components/PageEdit.vue";
|
|
||||||
import Layout from "@theme/layouts/Layout.vue";
|
|
||||||
|
|
||||||
export default {
|
|
||||||
components: { PageEdit, Layout },
|
|
||||||
};
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<template>
|
|
||||||
<Layout :class="$frontmatter.title">
|
|
||||||
<main class="page">
|
|
||||||
<slot name="top" />
|
|
||||||
|
|
||||||
<Content class="theme-default-content" />
|
|
||||||
<PageEdit />
|
|
||||||
|
|
||||||
<slot name="bottom" />
|
|
||||||
</main>
|
|
||||||
</Layout>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<style lang="stylus">
|
|
||||||
.page
|
|
||||||
padding-bottom 2rem
|
|
||||||
display block
|
|
||||||
</style>
|
|
@ -1,257 +0,0 @@
|
|||||||
<script>
|
|
||||||
import AlgoliaSearchBox from "@theme/components/AlgoliaSearchBox.vue";
|
|
||||||
import NavBar from "@theme/components/NavBar.vue";
|
|
||||||
import PageFooter from "@theme/components/PageFooter.vue";
|
|
||||||
import ClipboardListIcon from "vue-material-design-icons/ClipboardList.vue";
|
|
||||||
import ClipboardSearchIcon from "vue-material-design-icons/ClipboardSearch.vue";
|
|
||||||
import FaqIcon from "vue-material-design-icons/FrequentlyAskedQuestions.vue";
|
|
||||||
import LifebuoyIcon from "vue-material-design-icons/Lifebuoy.vue";
|
|
||||||
import SourceForkIcon from "vue-material-design-icons/SourceFork.vue";
|
|
||||||
|
|
||||||
export default {
|
|
||||||
components: {
|
|
||||||
NavBar,
|
|
||||||
PageFooter,
|
|
||||||
AlgoliaSearchBox,
|
|
||||||
ClipboardListIcon,
|
|
||||||
SourceForkIcon,
|
|
||||||
LifebuoyIcon,
|
|
||||||
ClipboardSearchIcon,
|
|
||||||
FaqIcon,
|
|
||||||
},
|
|
||||||
|
|
||||||
computed: {
|
|
||||||
data() {
|
|
||||||
return this.$page.frontmatter;
|
|
||||||
},
|
|
||||||
|
|
||||||
algolia() {
|
|
||||||
return this.$themeLocaleConfig.algolia || this.$site.themeConfig.algolia || {};
|
|
||||||
},
|
|
||||||
|
|
||||||
isAlgoliaSearch() {
|
|
||||||
return this.algolia && this.algolia.apiKey && this.algolia.indexName;
|
|
||||||
},
|
|
||||||
},
|
|
||||||
};
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<template>
|
|
||||||
<div class="theme-container help-page">
|
|
||||||
<NavBar />
|
|
||||||
<main class="page">
|
|
||||||
<div class="theme-custom-content content__default">
|
|
||||||
<slot name="top" />
|
|
||||||
|
|
||||||
<Content class="theme-custom-content" />
|
|
||||||
|
|
||||||
<Content slot-key="center" />
|
|
||||||
|
|
||||||
<AlgoliaSearchBox :options="algolia" />
|
|
||||||
|
|
||||||
<div v-if="data.help && data.help.length" class="row help">
|
|
||||||
<div v-for="(helpItem, index) in data.help" :key="index" class="column helpItem">
|
|
||||||
<a v-if="helpItem.link" :href="helpItem.link" tabindex="1">
|
|
||||||
<div class="card" :class="'card__' + helpItem.title">
|
|
||||||
<header v-if="helpItem.faq">
|
|
||||||
<FaqIcon />
|
|
||||||
<h3>{{ helpItem.title }}</h3>
|
|
||||||
</header>
|
|
||||||
<header v-else-if="helpItem.fixProblems">
|
|
||||||
<ClipboardSearchIcon />
|
|
||||||
<h3>{{ helpItem.title }}</h3>
|
|
||||||
</header>
|
|
||||||
<header v-else-if="helpItem.guides">
|
|
||||||
<ClipboardListIcon />
|
|
||||||
<h3>{{ helpItem.title }}</h3>
|
|
||||||
</header>
|
|
||||||
<header v-else-if="helpItem.forks">
|
|
||||||
<SourceForkIcon />
|
|
||||||
<h3>{{ helpItem.title }}</h3>
|
|
||||||
</header>
|
|
||||||
<header v-else-if="helpItem.contribution">
|
|
||||||
<LifebuoyIcon />
|
|
||||||
<h3>{{ helpItem.title }}</h3>
|
|
||||||
</header>
|
|
||||||
<header v-else-if="helpItem.icon">
|
|
||||||
<MaterialIcon :icon="helpItem.icon" icon-only />
|
|
||||||
<h3>{{ helpItem.title }}</h3>
|
|
||||||
</header>
|
|
||||||
<p>{{ helpItem.description }}</p>
|
|
||||||
</div>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<slot name="bottom" />
|
|
||||||
</div>
|
|
||||||
</main>
|
|
||||||
<PageFooter />
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<style lang="stylus">
|
|
||||||
.help-page
|
|
||||||
.page
|
|
||||||
padding-left 0 !important
|
|
||||||
padding-bottom 2rem
|
|
||||||
display block
|
|
||||||
.theme-custom-content
|
|
||||||
max-width 75rem
|
|
||||||
margin 0 auto
|
|
||||||
padding 2rem 2.5rem
|
|
||||||
*
|
|
||||||
box-sizing border-box
|
|
||||||
h1
|
|
||||||
text-align center
|
|
||||||
.header-anchor
|
|
||||||
display none
|
|
||||||
h3
|
|
||||||
.header-anchor
|
|
||||||
display none
|
|
||||||
.content__center
|
|
||||||
text-align center
|
|
||||||
margin-bottom 2rem
|
|
||||||
.algolia-search-wrapper
|
|
||||||
width 100%
|
|
||||||
text-align center
|
|
||||||
margin-bottom 5rem
|
|
||||||
.algolia-autocomplete
|
|
||||||
width 50%
|
|
||||||
input
|
|
||||||
background #ffffff url('/assets/img/search.83621669.svg') 0.6rem 0.9rem no-repeat
|
|
||||||
background-size 1rem
|
|
||||||
box-shadow 0 0 30px rgba(177, 174, 174, 0.322)
|
|
||||||
border 1px solid #cfd4db
|
|
||||||
font-size 1.2rem
|
|
||||||
height 3rem
|
|
||||||
width 100%
|
|
||||||
.card
|
|
||||||
background-color white
|
|
||||||
border-bottom 1px solid transparent
|
|
||||||
border-radius 6px
|
|
||||||
box-shadow 0 0 30px #b1aeae52
|
|
||||||
color $accentColor
|
|
||||||
height 100%
|
|
||||||
overflow hidden
|
|
||||||
padding 0.5rem
|
|
||||||
text-align center
|
|
||||||
user-select none
|
|
||||||
width auto
|
|
||||||
header
|
|
||||||
margin-top 1.25rem
|
|
||||||
white-space nowrap
|
|
||||||
.material-icons,
|
|
||||||
.material-design-icon
|
|
||||||
display contents
|
|
||||||
font-size 2.5em
|
|
||||||
color $accentColorSecondary
|
|
||||||
.material-design-icon > .material-design-icon__svg
|
|
||||||
position relative
|
|
||||||
> span
|
|
||||||
display block
|
|
||||||
span
|
|
||||||
h3
|
|
||||||
display inline-block
|
|
||||||
margin-left 1.8rem
|
|
||||||
margin-bottom 0
|
|
||||||
h3
|
|
||||||
margin 10px
|
|
||||||
p
|
|
||||||
color #566573
|
|
||||||
font-weight 400
|
|
||||||
font-size 0.95rem
|
|
||||||
&:hover
|
|
||||||
border-bottom 2px solid $accentColor
|
|
||||||
border-bottom-left-radius 0
|
|
||||||
border-bottom-right-radius 0
|
|
||||||
position relative
|
|
||||||
.material-design-icon
|
|
||||||
color $accentColor
|
|
||||||
.column
|
|
||||||
border 1px solid #cfd4db
|
|
||||||
border-radius 6px
|
|
||||||
&:hover
|
|
||||||
border-bottom none
|
|
||||||
a:focus
|
|
||||||
box-shadow none
|
|
||||||
outline none
|
|
||||||
.card
|
|
||||||
box-shadow 0 0 30px #b1aeae52, 0 0 0 1px #fff, 0 0 0 3px rgba(50, 100, 150, 0.4)
|
|
||||||
outline none
|
|
||||||
.row
|
|
||||||
display grid
|
|
||||||
grid-template-columns repeat(5, 1fr)
|
|
||||||
grid-auto-rows 1fr
|
|
||||||
grid-gap 1rem
|
|
||||||
&:after
|
|
||||||
content ""
|
|
||||||
display table
|
|
||||||
clear both
|
|
||||||
|
|
||||||
@media screen and (max-width $MQMobile)
|
|
||||||
.help-page
|
|
||||||
.page
|
|
||||||
.theme-custom-content
|
|
||||||
padding 2rem 0.75rem
|
|
||||||
padding-bottom 0
|
|
||||||
h1
|
|
||||||
margin-bottom 0.5rem
|
|
||||||
.content__center
|
|
||||||
margin-top 0
|
|
||||||
padding-top 0
|
|
||||||
.algolia-search-wrapper
|
|
||||||
width 100%
|
|
||||||
margin-bottom 1rem
|
|
||||||
.algolia-autocomplete
|
|
||||||
width 100%
|
|
||||||
padding 0.4rem 0.65rem
|
|
||||||
input
|
|
||||||
width 100%
|
|
||||||
left 0
|
|
||||||
.column
|
|
||||||
margin 0.4rem 0.6rem
|
|
||||||
.card
|
|
||||||
height auto
|
|
||||||
width auto
|
|
||||||
header
|
|
||||||
margin-top 1rem
|
|
||||||
.material-icons,
|
|
||||||
.material-design-icon
|
|
||||||
font-size 1.6em
|
|
||||||
span
|
|
||||||
display inline-block
|
|
||||||
h3
|
|
||||||
margin-left 0
|
|
||||||
margin-bottom 0
|
|
||||||
h3
|
|
||||||
font-size 1.5rem
|
|
||||||
display inline-block
|
|
||||||
margin 0
|
|
||||||
p
|
|
||||||
font-size 1rem
|
|
||||||
&:hover
|
|
||||||
border-bottom 2px solid #cfd4db
|
|
||||||
border-bottom-left-radius 6px
|
|
||||||
border-bottom-right-radius 6px
|
|
||||||
position inherit
|
|
||||||
top unset
|
|
||||||
.material-design-icon
|
|
||||||
color $accentColorSecondary
|
|
||||||
.row
|
|
||||||
grid-template-columns repeat(1, 1fr)
|
|
||||||
.navbar
|
|
||||||
padding-left 1rem
|
|
||||||
.logo
|
|
||||||
margin-right 0
|
|
||||||
.can-hide
|
|
||||||
display block
|
|
||||||
.sidebar-button
|
|
||||||
display none
|
|
||||||
.site-name.can-hide
|
|
||||||
display none
|
|
||||||
.nav-links.can-hide
|
|
||||||
.nav-item,
|
|
||||||
.repo-link
|
|
||||||
padding-left 0.8em
|
|
||||||
</style>
|
|
@ -1,48 +0,0 @@
|
|||||||
<script>
|
|
||||||
/**
|
|
||||||
* For material icon references use https://material.io/resources/icons/
|
|
||||||
* Code example: <MaterialIcon icon="android" />
|
|
||||||
*/
|
|
||||||
export default {
|
|
||||||
props: {
|
|
||||||
iconOnly: {
|
|
||||||
type: Boolean,
|
|
||||||
default: false,
|
|
||||||
},
|
|
||||||
name: {
|
|
||||||
type: String,
|
|
||||||
default: "",
|
|
||||||
},
|
|
||||||
icon: {
|
|
||||||
type: String,
|
|
||||||
default: "",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
};
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<template>
|
|
||||||
<i v-if="iconOnly" :class="name" class="material-icons">{{ icon }}</i>
|
|
||||||
<div v-else :class="name" class="material-holder">
|
|
||||||
<i class="material-icons">{{ icon }}</i>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<style lang="scss">
|
|
||||||
$material-design-icons-font-directory-path: "~material-design-icons-iconfont/dist/fonts/";
|
|
||||||
@import "~material-design-icons-iconfont/src/material-design-icons";
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<style lang="stylus">
|
|
||||||
.material-holder
|
|
||||||
color #476582
|
|
||||||
margin 0
|
|
||||||
font-size 0.85em
|
|
||||||
border-radius 3px
|
|
||||||
display inline
|
|
||||||
|
|
||||||
.material-icons
|
|
||||||
font-size 1.35em
|
|
||||||
position relative
|
|
||||||
top 0.2rem
|
|
||||||
</style>
|
|
@ -1,127 +0,0 @@
|
|||||||
<script>
|
|
||||||
/**
|
|
||||||
* Code example: <NavigationText item="library"/>
|
|
||||||
*/
|
|
||||||
export default {
|
|
||||||
props: {
|
|
||||||
item: {
|
|
||||||
type: String,
|
|
||||||
required: true,
|
|
||||||
},
|
|
||||||
entry: {
|
|
||||||
type: String,
|
|
||||||
default: "",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
computed: {
|
|
||||||
nav() {
|
|
||||||
// prettier-ignore
|
|
||||||
return {
|
|
||||||
/* Menus */
|
|
||||||
library: { text: "Library", icon: "collections_bookmark" },
|
|
||||||
updates: { text: "Updates", icon: "new_releases" },
|
|
||||||
history: { text: "History", icon: "history" },
|
|
||||||
browse: { text: "Browse", icon: "explore" },
|
|
||||||
more: { text: "More", icon: "more_horiz" },
|
|
||||||
/* Actions */
|
|
||||||
update_library: { text: "Update library", icon: "refresh" },
|
|
||||||
search: { text: "Search", icon: "search" },
|
|
||||||
filter: { text: "Filter", icon: "filter_list" },
|
|
||||||
edit: { text: "EDIT", icon:"edit" },
|
|
||||||
delete: { text: "DELETE", icon:"delete" },
|
|
||||||
language: { text: "Filter", icon:"translate" },
|
|
||||||
/* More */
|
|
||||||
downloaded_only: { text: "Downloaded only", icon: "cloud_off" },
|
|
||||||
download_queue: { text: "Download queue", icon: "get_app" },
|
|
||||||
categories: { text: "Categories", icon: "label" },
|
|
||||||
settings: { text: "Settings", icon: "settings" },
|
|
||||||
about: { text: "About", icon: "info" },
|
|
||||||
help: { text: "Help", icon: "help" },
|
|
||||||
source_migration: { text: "Source migration", icon: "compare_arrows" },
|
|
||||||
/* Settings */
|
|
||||||
settings_general: { text: "General", icon: "tune" },
|
|
||||||
settings_library: { text: "Library", icon: "collections_bookmark" },
|
|
||||||
settings_reader: { text: "Reader", icon: "chrome_reader_mode" },
|
|
||||||
settings_downloads: { text: "Downloads", icon: "get_app" },
|
|
||||||
settings_tracking: { text: "Tracking", icon: "autorenew" },
|
|
||||||
settings_browse: { text: "Browse", icon: "explore" },
|
|
||||||
settings_backup: { text: "Backup and Restore", icon: "settings_backup_restore" },
|
|
||||||
settings_security: { text: "Security", icon: "security" },
|
|
||||||
settings_advanced: { text: "Advanced", icon: "code" },
|
|
||||||
/* Library info */
|
|
||||||
bookmark: { text: "Add to library", icon: "favorite_border" },
|
|
||||||
bookmarked: { text: "In library", icon: "favorite" },
|
|
||||||
set_categories: { text: "Set categories", icon: "label" },
|
|
||||||
share: { text: "Share", icon: "share" },
|
|
||||||
webview: { text: "WebView", icon: "public" },
|
|
||||||
/* Browse */
|
|
||||||
button_latest: { text: "LATEST" },
|
|
||||||
button_browse: { text: "BROWSE" },
|
|
||||||
tab_sources: { text: "SOURCES" },
|
|
||||||
tab_extensions: { text: "EXTENSIONS" },
|
|
||||||
sources: { text: "Sources" },
|
|
||||||
latest: { text: "Latest" },
|
|
||||||
extensions: { text: "Extensions" },
|
|
||||||
migrate: { text: "Migrate" },
|
|
||||||
/* Misc */
|
|
||||||
install: { text: "INSTALL", class: "ext-installation" },
|
|
||||||
reorder: { text: "Reorder", icon: "reorder" },
|
|
||||||
overflow: { text: "Overflow", icon: "more_vert" },
|
|
||||||
/* Forks */
|
|
||||||
neko: { text: "Neko", internalClass: "nav-tachiyomi_neko" },
|
|
||||||
tachiyomij2k: { text: "TachiyomiJ2K", link: "/forks/Neko" },
|
|
||||||
tachiyomiaz: { text: "TachiyomiAZ", link: "/forks/TachiyomiAZ" },
|
|
||||||
tachiyomisy: { text: "TachiyomiSY", link: "/forks/TachiyomiSY" },
|
|
||||||
}[this.item];
|
|
||||||
},
|
|
||||||
},
|
|
||||||
};
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<template>
|
|
||||||
<span v-if="nav.link" id="NavigationVue" class="app-navigation" :class="nav.class" title="App navigation">
|
|
||||||
<a class="app-link" :href="nav.link + entry">
|
|
||||||
<MaterialIcon v-if="nav.icon" class="app-icon" :icon="nav.icon" />
|
|
||||||
<span class="app-label" :class="nav.internalClass">{{ nav.text }}</span>
|
|
||||||
<slot />
|
|
||||||
</a>
|
|
||||||
</span>
|
|
||||||
<span v-else id="NavigationVue" class="app-navigation" :class="nav.class" title="App navigation">
|
|
||||||
<MaterialIcon v-if="nav.icon" class="app-icon" :icon="nav.icon" />
|
|
||||||
<span class="app-label" :class="nav.internalClass">{{ nav.text }}</span>
|
|
||||||
<slot />
|
|
||||||
</span>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<style lang="stylus">
|
|
||||||
#NavigationVue
|
|
||||||
&.app-navigation
|
|
||||||
white-space pre
|
|
||||||
font-size 0
|
|
||||||
.app-icon,
|
|
||||||
.app-label
|
|
||||||
color darken($accentColor, 25%)
|
|
||||||
font-weight 500
|
|
||||||
font-size 1rem
|
|
||||||
.app-icon
|
|
||||||
vertical-align top
|
|
||||||
padding-right 0.25rem
|
|
||||||
.app-link
|
|
||||||
&:hover
|
|
||||||
cursor pointer
|
|
||||||
text-decoration none !important
|
|
||||||
.app-icon,
|
|
||||||
.app-label
|
|
||||||
color $accentColor
|
|
||||||
.app-image
|
|
||||||
max-height 1.5em
|
|
||||||
vertical-align sub
|
|
||||||
&:hover
|
|
||||||
cursor default
|
|
||||||
|
|
||||||
blockquote
|
|
||||||
.app-navigation
|
|
||||||
.app-icon,
|
|
||||||
.app-label
|
|
||||||
color inherit !important
|
|
||||||
</style>
|
|
@ -1,63 +0,0 @@
|
|||||||
<script>
|
|
||||||
/**
|
|
||||||
* Code example: <ReleaseDate preview />
|
|
||||||
*/
|
|
||||||
export default {
|
|
||||||
props: {
|
|
||||||
stable: {
|
|
||||||
type: Boolean,
|
|
||||||
default: false,
|
|
||||||
},
|
|
||||||
preview: {
|
|
||||||
type: Boolean,
|
|
||||||
default: false,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
stablePublishRelative: "at an unknown time",
|
|
||||||
stablePublishExact: "Can't connect to GitHub.",
|
|
||||||
previewPublishRelative: "at an unknown time",
|
|
||||||
previewPublishExact: "Can't connect to GitHub.",
|
|
||||||
};
|
|
||||||
},
|
|
||||||
|
|
||||||
async mounted() {
|
|
||||||
try {
|
|
||||||
const { data } = await this.$store.dispatch("getStableReleaseData");
|
|
||||||
this.$data.stablePublishRelative = this.$moment(data.published_at).fromNow();
|
|
||||||
this.$data.stablePublishExact = this.$moment(data.published_at).format("dddd, MMMM Do YYYY [at] HH:mm");
|
|
||||||
} catch (e) {
|
|
||||||
console.error(e);
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
const { data } = await this.$store.dispatch("getPreviewReleaseData");
|
|
||||||
this.$data.previewPublishRelative = this.$moment(data.published_at).fromNow();
|
|
||||||
this.$data.previewPublishExact = this.$moment(data.published_at).format("dddd, MMMM Do YYYY [at] HH:mm");
|
|
||||||
} catch (e) {
|
|
||||||
console.error(e);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
};
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<template>
|
|
||||||
<div v-if="stable" class="buildTime">
|
|
||||||
<ElTooltip :content="stablePublishExact" placement="top" :open-delay="250">
|
|
||||||
<span>{{ stablePublishRelative }}</span>
|
|
||||||
</ElTooltip>
|
|
||||||
</div>
|
|
||||||
<div v-else-if="preview" class="buildTime">
|
|
||||||
<ElTooltip :content="previewPublishExact" placement="bottom-end" :open-delay="250">
|
|
||||||
<span>{{ previewPublishRelative }}</span>
|
|
||||||
</ElTooltip>
|
|
||||||
</div>
|
|
||||||
<span v-else>You need to specify props.</span>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<style lang="stylus" scoped>
|
|
||||||
.buildTime
|
|
||||||
font-weight 500
|
|
||||||
display inline-block
|
|
||||||
</style>
|
|
@ -1,77 +0,0 @@
|
|||||||
<script>
|
|
||||||
/**
|
|
||||||
* Code example: <VersionTag preview />
|
|
||||||
*/
|
|
||||||
export default {
|
|
||||||
props: {
|
|
||||||
stable: {
|
|
||||||
type: Boolean,
|
|
||||||
default: false,
|
|
||||||
},
|
|
||||||
fileName: {
|
|
||||||
type: Boolean,
|
|
||||||
default: false,
|
|
||||||
},
|
|
||||||
preview: {
|
|
||||||
type: Boolean,
|
|
||||||
default: false,
|
|
||||||
},
|
|
||||||
previewFileName: {
|
|
||||||
type: Boolean,
|
|
||||||
default: false,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
tagName: "0.00.0",
|
|
||||||
previewTagName: "r0000",
|
|
||||||
};
|
|
||||||
},
|
|
||||||
|
|
||||||
async mounted() {
|
|
||||||
try {
|
|
||||||
const { data } = await this.$store.dispatch("getStableReleaseData");
|
|
||||||
this.$data.tagName = data.tag_name.slice(1);
|
|
||||||
} catch (e) {
|
|
||||||
console.error(e);
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
const { data } = await this.$store.dispatch("getPreviewReleaseData");
|
|
||||||
this.$data.previewTagName = data.tag_name;
|
|
||||||
} catch (e) {
|
|
||||||
console.error(e);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
};
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<template>
|
|
||||||
<span v-if="stable" class="downloadTag">{{ $data.tagName }}</span>
|
|
||||||
<span v-else-if="fileName" class="fileNameContainer" title="File name">
|
|
||||||
<MaterialIcon class="fileNameIcon" icon="get_app" />
|
|
||||||
<span class="fileName">tachiyomi-v{{ $data.tagName }}.apk</span>
|
|
||||||
<slot />
|
|
||||||
</span>
|
|
||||||
<span v-else-if="preview" class="downloadTag">{{ $data.previewTagName }}</span>
|
|
||||||
<span v-else-if="previewFileName" class="fileNameContainer" title="File name">
|
|
||||||
<MaterialIcon class="fileNameIcon" icon="get_app" />
|
|
||||||
<span class="fileName">tachiyomi-{{ $data.previewTagName }}.apk</span>
|
|
||||||
<slot />
|
|
||||||
</span>
|
|
||||||
<span v-else>You need to specify props.</span>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<style lang="stylus" scoped>
|
|
||||||
.fileNameContainer
|
|
||||||
white-space nowrap
|
|
||||||
.fileNameIcon,
|
|
||||||
.fileName
|
|
||||||
color #23638f
|
|
||||||
font-weight 500
|
|
||||||
font-size 1em
|
|
||||||
.fileNameIcon
|
|
||||||
vertical-align top
|
|
||||||
&:hover
|
|
||||||
cursor default
|
|
||||||
</style>
|
|
@ -1,52 +0,0 @@
|
|||||||
<script>
|
|
||||||
import { marked } from "marked";
|
|
||||||
|
|
||||||
export default {
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
whatsNew: "Failed to load data from GitHub.",
|
|
||||||
};
|
|
||||||
},
|
|
||||||
|
|
||||||
async mounted() {
|
|
||||||
try {
|
|
||||||
const { data } = await this.$store.dispatch("getStableReleaseData");
|
|
||||||
this.$data.whatsNew = marked(data.body).replace(
|
|
||||||
/(?<=\(|(, ))@(.*?)(?=\)|(, ))/g,
|
|
||||||
"<a href='https://github.com/$2' target='_blank' rel='noopener'>@$2</a>"
|
|
||||||
);
|
|
||||||
} catch (e) {
|
|
||||||
console.error(e);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
};
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<template>
|
|
||||||
<div class="guide whatsNew">
|
|
||||||
<p class="title">
|
|
||||||
<MaterialIcon icon="new_releases" />
|
|
||||||
What's new
|
|
||||||
</p>
|
|
||||||
<!-- eslint-disable-next-line vue/no-v-html -->
|
|
||||||
<div v-html="whatsNew"></div>
|
|
||||||
<div class="note">
|
|
||||||
<p>
|
|
||||||
View the full release
|
|
||||||
<a href="https://github.com/tachiyomiorg/tachiyomi/releases/latest" target="_blank" rel="noopener">
|
|
||||||
here
|
|
||||||
</a>
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<style lang="stylus">
|
|
||||||
.whatsNew
|
|
||||||
.title
|
|
||||||
text-align center
|
|
||||||
div
|
|
||||||
white-space
|
|
||||||
h3
|
|
||||||
font-size 1.1rem
|
|
||||||
</style>
|
|
@ -1,52 +0,0 @@
|
|||||||
const navBarConfig = require("./config/navBar");
|
|
||||||
const pluginsConfig = require("./config/plugins");
|
|
||||||
const sideBarConfig = require("./config/sideBar");
|
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
dest: "./public",
|
|
||||||
temp: "./node_modules/.temp/theme",
|
|
||||||
|
|
||||||
title: "Tachiyomi",
|
|
||||||
description: "Free and open source manga reader for Android",
|
|
||||||
|
|
||||||
// prettier-ignore
|
|
||||||
head: [
|
|
||||||
// Embed headers
|
|
||||||
["link", { rel: "icon", href: "/favicon.ico" }],
|
|
||||||
["meta", { name: "theme-color", content: "#2e84bf" }],
|
|
||||||
["meta", { prefix: "og: http://ogp.me/ns#", property: "og:image", content: "https://tachiyomi.org/icons/logo.png" }],
|
|
||||||
['meta', { name: 'viewport', content: 'width=device-width, initial-scale=1.0' }],
|
|
||||||
// Custom headers
|
|
||||||
["link", { rel: "preconnect", href: "https://fonts.gstatic.com", crossorigin:""}],
|
|
||||||
["link", { rel: "stylesheet", href: "https://fonts.googleapis.com/css?family=Open+Sans"}],
|
|
||||||
["script", {src: "/scripts/remove_service_worker.js"}],
|
|
||||||
],
|
|
||||||
|
|
||||||
themeConfig: {
|
|
||||||
logo: "/icons/logo.svg",
|
|
||||||
repo: "tachiyomiorg/tachiyomi",
|
|
||||||
docsRepo: "tachiyomiorg/website",
|
|
||||||
docsDir: "src",
|
|
||||||
docsBranch: "main",
|
|
||||||
smoothScroll: true,
|
|
||||||
algolia: {
|
|
||||||
apiKey: "fc1c45b5a3835e1882cbbf0751dfe705",
|
|
||||||
indexName: "tachiyomi",
|
|
||||||
},
|
|
||||||
searchPlaceholder: "Search...",
|
|
||||||
editLinks: true,
|
|
||||||
editLinkText: "Help us improve this page",
|
|
||||||
lastUpdated: "Last updated",
|
|
||||||
nav: navBarConfig,
|
|
||||||
sidebar: {
|
|
||||||
"/help/guides/": sideBarConfig.default,
|
|
||||||
"/help/faq/": sideBarConfig.default,
|
|
||||||
"/help/contribution": sideBarConfig.default,
|
|
||||||
"/extensions": sideBarConfig.default,
|
|
||||||
"/forks": sideBarConfig.default,
|
|
||||||
"/sandbox": sideBarConfig.sandbox,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
plugins: pluginsConfig,
|
|
||||||
extraWatchFiles: [".vuepress/config/plugins.js", ".vuepress/config/navBar.js", ".vuepress/config/sideBar.js"],
|
|
||||||
};
|
|
@ -1,6 +0,0 @@
|
|||||||
module.exports = [
|
|
||||||
{ text: "Home", link: "/" },
|
|
||||||
{ text: "Help Center", link: "/help/" },
|
|
||||||
{ text: "Download", link: "/download/" },
|
|
||||||
{ text: "Extensions", link: "/extensions/" },
|
|
||||||
];
|
|
@ -1,132 +0,0 @@
|
|||||||
module.exports = [
|
|
||||||
[
|
|
||||||
"@mr-hope/vuepress-plugin-sitemap",
|
|
||||||
{
|
|
||||||
hostname: "https://tachiyomi.org",
|
|
||||||
},
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"@vuepress/last-updated",
|
|
||||||
{
|
|
||||||
transformer: (timestamp, lang) => {
|
|
||||||
const moment = require("moment");
|
|
||||||
moment.locale(lang);
|
|
||||||
return moment(timestamp).fromNow();
|
|
||||||
},
|
|
||||||
},
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"vuepress-plugin-robots",
|
|
||||||
{
|
|
||||||
host: "https://tachiyomi.org",
|
|
||||||
allowAll: true,
|
|
||||||
sitemap: "/sitemap.xml",
|
|
||||||
},
|
|
||||||
],
|
|
||||||
["@vuepress/back-to-top"],
|
|
||||||
[
|
|
||||||
"google-analytics-4",
|
|
||||||
{
|
|
||||||
gtag: "G-2CBXXM1Y86",
|
|
||||||
},
|
|
||||||
],
|
|
||||||
["vuepress-plugin-dehydrate"],
|
|
||||||
[
|
|
||||||
"@vuepress/active-header-links",
|
|
||||||
{
|
|
||||||
sidebarLinkSelector: ".sidebar-link",
|
|
||||||
headerAnchorSelector: ".header-anchor",
|
|
||||||
},
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"@vuepress/pwa",
|
|
||||||
{
|
|
||||||
serviceWorker: false,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"vuepress-plugin-clean-urls",
|
|
||||||
{
|
|
||||||
normalSuffix: "/",
|
|
||||||
},
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"vuepress-plugin-zooming",
|
|
||||||
{
|
|
||||||
selector: ".theme-default-content img.zoomable",
|
|
||||||
delay: 1000,
|
|
||||||
options: {
|
|
||||||
bgColor: "black",
|
|
||||||
bgOpacity: "0.8",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
],
|
|
||||||
["vuepress-plugin-element-ui"],
|
|
||||||
[
|
|
||||||
"vuepress-plugin-container",
|
|
||||||
{
|
|
||||||
type: "c-tip",
|
|
||||||
before: (info) => `<div class="custom-block c-tip"><h4 class="c-title">${info}</h4>`,
|
|
||||||
after: "</div>",
|
|
||||||
defaultTitle: "",
|
|
||||||
},
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"vuepress-plugin-container",
|
|
||||||
{
|
|
||||||
type: "c-warning",
|
|
||||||
before: (info) => `<div class="custom-block c-warning"><h4 class="c-title">${info}</h4>`,
|
|
||||||
after: "</div>",
|
|
||||||
defaultTitle: "",
|
|
||||||
},
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"vuepress-plugin-container",
|
|
||||||
{
|
|
||||||
type: "c-danger",
|
|
||||||
before: (info) => `<div class="custom-block c-danger"><h4 class="c-title">${info}</h4>`,
|
|
||||||
after: "</div>",
|
|
||||||
defaultTitle: "",
|
|
||||||
},
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"vuepress-plugin-container",
|
|
||||||
{
|
|
||||||
type: "expander",
|
|
||||||
before: (info) => `<details class="expander"><summary class="expansion">${info}</summary>`,
|
|
||||||
after: "</details>",
|
|
||||||
},
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"vuepress-plugin-container",
|
|
||||||
{
|
|
||||||
type: "guide",
|
|
||||||
before: (info) => `<div class="guide"><p class="title">${info}</p>`,
|
|
||||||
after: "</div>",
|
|
||||||
},
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"vuepress-plugin-container",
|
|
||||||
{
|
|
||||||
type: "videolink",
|
|
||||||
before: "<div class='videolink'>",
|
|
||||||
after: "</div>",
|
|
||||||
},
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"vuepress-plugin-container",
|
|
||||||
{
|
|
||||||
type: "guide-empty",
|
|
||||||
before: "<div class='guide g-empty'>",
|
|
||||||
after: "</div>",
|
|
||||||
},
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"vuepress-plugin-container",
|
|
||||||
{
|
|
||||||
type: "note",
|
|
||||||
before: "<div class='note'><p>",
|
|
||||||
after: "</div></p>",
|
|
||||||
},
|
|
||||||
],
|
|
||||||
];
|
|
@ -1,39 +0,0 @@
|
|||||||
module.exports = {
|
|
||||||
default: [
|
|
||||||
{
|
|
||||||
title: "Frequently Asked Questions",
|
|
||||||
path: "/help/faq/",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: "Guides",
|
|
||||||
collapsable: false,
|
|
||||||
sidebarDepth: 2,
|
|
||||||
children: [
|
|
||||||
"/help/guides/getting-started",
|
|
||||||
"/help/guides/troubleshooting",
|
|
||||||
"/help/guides/source-migration",
|
|
||||||
"/help/guides/backups",
|
|
||||||
"/help/guides/tracking",
|
|
||||||
"/help/guides/categories",
|
|
||||||
"/help/guides/local-manga",
|
|
||||||
"/help/guides/reader-settings",
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: "Tachiyomi",
|
|
||||||
collapsable: false,
|
|
||||||
sidebarDepth: 2,
|
|
||||||
children: ["/help/contribution", "/download/", "/extensions/", "/forks/"],
|
|
||||||
},
|
|
||||||
],
|
|
||||||
sandbox: [
|
|
||||||
"/",
|
|
||||||
{
|
|
||||||
title: "Sandbox",
|
|
||||||
path: "/sandbox/",
|
|
||||||
collapsable: false,
|
|
||||||
sidebarDepth: 2,
|
|
||||||
children: ["/sandbox/style-guide", "/sandbox/element-ui"],
|
|
||||||
},
|
|
||||||
],
|
|
||||||
};
|
|
@ -1,6 +0,0 @@
|
|||||||
export const GITHUB_EXTENSION_JSON =
|
|
||||||
"https://raw.githubusercontent.com/tachiyomiorg/tachiyomi-extensions/repo/index.json";
|
|
||||||
export const GITHUB_STABLE_API = "https://api.github.com/repos/tachiyomiorg/tachiyomi/releases/latest";
|
|
||||||
export const GITHUB_STABLE_RELEASE = "https://github.com/tachiyomiorg/tachiyomi/releases/latest";
|
|
||||||
export const GITHUB_PREVIEW_API = "https://api.github.com/repos/tachiyomiorg/android-app-preview/releases/latest";
|
|
||||||
export const GITHUB_PREVIEW_RELEASE = "https://github.com/tachiyomiorg/android-app-preview/releases/latest";
|
|
@ -1,39 +0,0 @@
|
|||||||
import "./styles/animate.css";
|
|
||||||
import "./styles/sweetalert2.css";
|
|
||||||
import "vue-material-design-icons/styles.css";
|
|
||||||
import Element from "element-ui";
|
|
||||||
import { VueAgile } from "vue-agile";
|
|
||||||
import VueMoment from "vue-moment";
|
|
||||||
import VueSweetalert2 from "vue-sweetalert2";
|
|
||||||
import store from "./store";
|
|
||||||
|
|
||||||
const redirectList = [
|
|
||||||
{
|
|
||||||
path: "/help/guides/troubleshooting-problems/",
|
|
||||||
redirect: "/help/guides/troubleshooting/",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
path: "/help/guides/reading-local-manga/",
|
|
||||||
redirect: "/help/guides/local-manga/",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
path: "/help/guides/creating-backups/",
|
|
||||||
redirect: "/help/guides/backups/",
|
|
||||||
},
|
|
||||||
];
|
|
||||||
|
|
||||||
export default ({
|
|
||||||
Vue, // the version of Vue being used in the VuePress app
|
|
||||||
options, // the options for the root Vue instance
|
|
||||||
router, // the router instance for the app
|
|
||||||
siteData, // site metadata
|
|
||||||
}) => {
|
|
||||||
// eslint-disable-next-line vue/match-component-file-name
|
|
||||||
Vue.component("VueAgile", VueAgile);
|
|
||||||
Vue.use(VueSweetalert2);
|
|
||||||
Vue.use(VueMoment);
|
|
||||||
Vue.use(Element);
|
|
||||||
Vue.mixin({ store });
|
|
||||||
// Reroute to new pages
|
|
||||||
router.addRoutes(redirectList);
|
|
||||||
};
|
|
@ -1 +0,0 @@
|
|||||||
tachiyomi.org
|
|
Before Width: | Height: | Size: 4.1 KiB |
Before Width: | Height: | Size: 4.7 KiB |
Before Width: | Height: | Size: 5.7 KiB |
Before Width: | Height: | Size: 6.0 KiB |
@ -1,21 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<!-- Generator: Adobe Illustrator 21.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
|
||||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
|
||||||
viewBox="0 0 108 108" style="enable-background:new 0 0 108 108;" xml:space="preserve">
|
|
||||||
<style type="text/css">
|
|
||||||
.st0{fill:#CE2828;}
|
|
||||||
.st1{fill:#F7D009;}
|
|
||||||
.st2{fill:#E40F85;}
|
|
||||||
</style>
|
|
||||||
<path class="st0" d="M28.5,54.5c0-6.8,2.7-13.3,7.5-18c4.8-4.8,11.3-7.5,18-7.5s13.3,2.7,18,7.5c4.8,4.8,7.5,11.3,7.5,18
|
|
||||||
s-2.7,13.3-7.5,18C67.3,77.3,60.8,80,54,80s-13.3-2.7-18-7.5C31.2,67.8,28.5,61.3,28.5,54.5"/>
|
|
||||||
<path d="M34.1,54.5c-0.1-4.3,1.2-8.5,3.6-11.9c2.5-3.5,6-6.1,10-7.4c4.1-1.3,8.4-1.3,12.5,0c4.1,1.3,7.6,3.9,10,7.4
|
|
||||||
c2.5,3.5,3.7,7.7,3.6,11.9c0.1,4.3-1.2,8.5-3.6,11.9c-2.5,3.5-6,6.1-10,7.4c-4.1,1.3-8.4,1.3-12.5,0c-4.1-1.3-7.6-3.9-10-7.4
|
|
||||||
C35.2,63,34,58.8,34.1,54.5"/>
|
|
||||||
<path class="st1" d="M51,47.5c0.9,0,2.5-2.8,2.5-3.7c0-0.9-3.2-3.3-7.8-3.3c-6.4,0-8.1,4.5-8.1,7.1c0,2.7,0.8,5.8,7.6,7.9
|
|
||||||
c1.8,0.6,4.6,1.5,4.6,3.8c0,1.9-2.1,2.9-4.4,2.9c-6.7,0-6.2-6.3-6.7-6.3c-0.3,0-1.9,1.5-1.9,4.2c0,5,4.5,7.3,9,7.3
|
|
||||||
c6.6,0,9.2-4.5,9.2-8.1c0-2.9-1.3-6.2-7.9-8.3c-1.7-0.6-4.8-1.4-4.8-3.7c0-1.9,2-2.6,3.6-2.6C48.9,44.7,50.2,47.5,51,47.5z"/>
|
|
||||||
<path class="st2" d="M56.7,66.3c0,0.8,0,1.2,0.8,1.2c6.9,0,14-8.9,13.7-18c0-1.3,0.1-2.4-0.5-2.4h-2.8c-0.3,0-1.1-0.1-1.1,0.4
|
|
||||||
c0,0.5,0.3,1.9,0.3,3.4c0,2.4-0.8,6.2-2.1,6.2c-0.6,0-3.7-3.5-3.7-7.2c0-0.9,0.3-1.9,0.3-2.4c0-0.6-0.7-0.5-1.1-0.5h-2.6
|
|
||||||
c-1.2,0-1.2,0-1.2,1.4c0,8.8,5.5,11,5.5,12.3c0,0.3-0.9,1.5-4.5,1.5c-0.8,0-0.9,0.9-0.9,1.3V66.3z"/>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 1.6 KiB |
Before Width: | Height: | Size: 2.4 KiB |
Before Width: | Height: | Size: 38 KiB |
Before Width: | Height: | Size: 48 KiB |
Before Width: | Height: | Size: 108 KiB |
Before Width: | Height: | Size: 108 KiB |
Before Width: | Height: | Size: 108 KiB |
Before Width: | Height: | Size: 107 KiB |
Before Width: | Height: | Size: 50 KiB |
Before Width: | Height: | Size: 50 KiB |
Before Width: | Height: | Size: 51 KiB |
Before Width: | Height: | Size: 50 KiB |
Before Width: | Height: | Size: 59 KiB |
Before Width: | Height: | Size: 68 KiB |
Before Width: | Height: | Size: 50 KiB |
Before Width: | Height: | Size: 50 KiB |
Before Width: | Height: | Size: 39 KiB |
Before Width: | Height: | Size: 50 KiB |
Before Width: | Height: | Size: 68 KiB |
Before Width: | Height: | Size: 68 KiB |
Before Width: | Height: | Size: 71 KiB |
Before Width: | Height: | Size: 68 KiB |
Before Width: | Height: | Size: 164 KiB |
Before Width: | Height: | Size: 164 KiB |
Before Width: | Height: | Size: 113 KiB |
Before Width: | Height: | Size: 112 KiB |
Before Width: | Height: | Size: 48 KiB |
Before Width: | Height: | Size: 49 KiB |
@ -1 +0,0 @@
|
|||||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 19.82 17.59"><defs><style>.cls-1{fill:none;stroke:#e5422b;stroke-miterlimit:10;}.cls-2{fill:#e5422b;}</style></defs><title>icon-danger</title><g id="Layer_2" data-name="Layer 2"><path class="cls-1" d="M9.06,2,.73,16.39A1.09,1.09,0,0,0,1.67,18H18.33a1.09,1.09,0,0,0,.94-1.63L10.94,2A1.08,1.08,0,0,0,9.06,2Z" transform="translate(-0.09 -0.92)"/></g><g id="Layer_3" data-name="Layer 3"><rect class="cls-2" x="9.09" y="13.63" width="1.66" height="1.66" rx="0.26"/><path class="cls-2" d="M8.66,6.65,9.13,13a.29.29,0,0,0,.29.28h1.17a.29.29,0,0,0,.29-.28l.47-6.39a.3.3,0,0,0-.3-.33H9A.3.3,0,0,0,8.66,6.65Z" transform="translate(-0.09 -0.92)"/></g></svg>
|
|
Before Width: | Height: | Size: 699 B |
@ -1 +0,0 @@
|
|||||||
<svg id="Layer_2" data-name="Layer 2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 11.57 18.64"><defs><style>.cls-1,.cls-2{fill:none;stroke:#184cef;stroke-linecap:round;stroke-miterlimit:10;}.cls-1{stroke-width:1.2px;}.cls-2{stroke-width:1.1px;}</style></defs><title>bulb-icon</title><path class="cls-1" d="M12.5,12.76V11.65a1.84,1.84,0,0,1,.72-1.45,5.19,5.19,0,1,0-6.43,0,1.86,1.86,0,0,1,.71,1.45v1" transform="translate(-4.21 -0.37)"/><line class="cls-2" x1="2.99" y1="14.13" x2="8.58" y2="14.13"/><line class="cls-2" x1="3.56" y1="16.13" x2="8.01" y2="16.13"/><line class="cls-2" x1="5.17" y1="18.09" x2="6.41" y2="18.09"/><path class="cls-2" d="M10.36,3.25A2.31,2.31,0,0,1,12,4a2.46,2.46,0,0,1,.71,1.67" transform="translate(-4.21 -0.37)"/></svg>
|
|
Before Width: | Height: | Size: 753 B |
@ -1 +0,0 @@
|
|||||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 19.82 17.59"><defs><style>.cls-1{fill:none;stroke:#b29400;stroke-miterlimit:10;}.cls-2{fill:#b29400;}</style></defs><title>icon-danger-shit-colour</title><g id="Layer_2" data-name="Layer 2"><path class="cls-1" d="M9.06,2,.73,16.39A1.09,1.09,0,0,0,1.67,18H18.33a1.09,1.09,0,0,0,.94-1.63L10.94,2A1.08,1.08,0,0,0,9.06,2Z" transform="translate(-0.09 -0.92)"/></g><g id="Layer_3" data-name="Layer 3"><rect class="cls-2" x="9.09" y="13.63" width="1.66" height="1.66" rx="0.26"/><path class="cls-2" d="M8.66,6.65,9.13,13a.29.29,0,0,0,.29.28h1.17a.29.29,0,0,0,.29-.28l.47-6.39a.3.3,0,0,0-.3-.33H9A.3.3,0,0,0,8.66,6.65Z" transform="translate(-0.09 -0.92)"/></g></svg>
|
|
Before Width: | Height: | Size: 711 B |
@ -1,27 +0,0 @@
|
|||||||
<svg
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
|
||||||
aria-hidden="true"
|
|
||||||
focusable="false"
|
|
||||||
preserveAspectRatio="xMidYMid meet"
|
|
||||||
viewBox="0 0 256 256"
|
|
||||||
>
|
|
||||||
<defs>
|
|
||||||
<radialGradient
|
|
||||||
id="IconifyId-1783bed17af-30b546-3"
|
|
||||||
cx="50%"
|
|
||||||
cy="-50%"
|
|
||||||
fx="50%"
|
|
||||||
fy="-50%"
|
|
||||||
r="100%"
|
|
||||||
>
|
|
||||||
<stop stop-color="#20C6B7" offset="0%" />
|
|
||||||
<stop stop-color="#4D9ABF" offset="100%" />
|
|
||||||
</radialGradient>
|
|
||||||
</defs>
|
|
||||||
<path
|
|
||||||
d="M185.532 88.839l-.094-.04a.396.396 0 0 1-.154-.087a.734.734 0 0 1-.187-.621l5.167-31.553l24.229 24.209l-25.198 10.709a.555.555 0 0 1-.22.04h-.101a.694.694 0 0 1-.134-.114a11.468 11.468 0 0 0-3.308-2.543zm35.144-1.923l25.906 25.878c5.38 5.381 8.075 8.065 9.057 11.177c.147.46.267.921.361 1.395l-61.913-26.192a4.868 4.868 0 0 0-.1-.04c-.248-.1-.535-.214-.535-.467c0-.254.294-.374.541-.474l.08-.034l26.603-11.243zm34.268 46.756c-1.337 2.51-3.944 5.114-8.355 9.527l-29.209 29.17l-37.777-7.858l-.2-.04c-.335-.054-.689-.114-.689-.414a11.387 11.387 0 0 0-4.378-7.965c-.154-.154-.113-.394-.067-.615c0-.033 0-.066.014-.093l7.105-43.571l.026-.147c.04-.334.1-.721.401-.721a11.566 11.566 0 0 0 7.754-4.44c.06-.067.1-.14.18-.18c.214-.1.468 0 .689.093l64.5 27.254h.006zm-44.28 45.407l-48.031 47.978l8.22-50.475l.014-.067a.905.905 0 0 1 .04-.193c.067-.16.24-.227.408-.294l.08-.034c1.8-.767 3.392-1.95 4.646-3.451c.16-.187.354-.368.601-.401c.064-.01.13-.01.194 0l33.82 6.944l.007-.007zm-58.198 58.133l-5.414 5.408l-59.854-86.408a2.831 2.831 0 0 0-.067-.094c-.093-.127-.194-.253-.173-.4c.006-.107.073-.2.147-.28l.066-.087c.18-.268.335-.535.502-.822l.133-.233l.02-.02c.094-.16.18-.314.341-.401c.14-.067.335-.04.488-.007l66.311 13.66c.186.03.36.105.508.22c.087.088.107.181.127.288a11.735 11.735 0 0 0 6.871 7.845c.187.093.107.3.02.52a1.588 1.588 0 0 0-.1.301c-.835 5.074-8 48.726-9.926 60.51zm-11.309 11.29c-3.99 3.946-6.343 6.035-9.003 6.877a13.382 13.382 0 0 1-8.06 0c-3.115-.989-5.809-3.672-11.19-9.054l-60.108-60.042l15.7-24.323a1 1 0 0 1 .268-.314c.167-.12.408-.066.608 0a16.285 16.285 0 0 0 10.948-.554c.18-.066.361-.113.502.014c.07.064.133.135.187.213l60.148 87.19v-.007zm-94.156-68.008l-13.789-13.773l27.23-11.604a.562.562 0 0 1 .221-.047c.227 0 .361.227.481.434c.274.42.564.83.87 1.229l.086.106c.08.114.027.227-.053.334l-15.04 23.321h-.006zM27.11 160.625L9.665 143.199c-2.968-2.964-5.12-5.114-6.617-6.963l53.043 10.99l.2.033c.328.053.69.113.69.42c0 .334-.395.488-.73.614l-.153.067l-28.988 12.265zM0 127.275a13.34 13.34 0 0 1 .602-3.304c.989-3.112 3.676-5.796 9.063-11.177l22.324-22.3a14524.43 14524.43 0 0 0 30.92 44.647c.18.24.38.507.174.707c-.976 1.075-1.952 2.25-2.64 3.526c-.075.163-.19.306-.335.413c-.087.054-.18.034-.28.014h-.014L0 127.269v.007zm37.965-42.75l30.017-29.984c2.82 1.235 13.087 5.568 22.27 9.44c6.952 2.939 13.288 5.61 15.28 6.477c.2.08.381.16.468.36c.053.12.027.274 0 .401a13.363 13.363 0 0 0 3.496 12.205c.2.2 0 .487-.174.734l-.094.14l-30.478 47.157c-.08.134-.154.247-.288.334c-.16.1-.387.053-.575.007a15.215 15.215 0 0 0-3.629-.494c-1.096 0-2.286.2-3.489.42h-.007c-.133.02-.254.047-.36-.033a1.403 1.403 0 0 1-.301-.34L37.965 84.525zm36.08-36.04l38.86-38.817c5.38-5.375 8.074-8.065 11.188-9.047a13.382 13.382 0 0 1 8.061 0c3.115.982 5.808 3.672 11.189 9.047l8.422 8.413l-27.638 42.756a1.035 1.035 0 0 1-.274.32c-.167.114-.401.067-.602 0a14.028 14.028 0 0 0-12.833 2.471c-.18.187-.448.08-.675-.02c-3.61-1.569-31.682-13.42-35.699-15.122zm83.588-24.542l25.52 25.49l-6.15 38.044v.1a.9.9 0 0 1-.053.254c-.067.133-.201.16-.335.2a12.237 12.237 0 0 0-3.662 1.823a1.029 1.029 0 0 0-.134.113c-.074.08-.147.154-.267.167a.763.763 0 0 1-.288-.047l-38.887-16.504l-.073-.034c-.248-.1-.542-.22-.542-.474a14.664 14.664 0 0 0-2.072-6.109c-.187-.307-.394-.627-.234-.941l27.177-42.082zM131.352 81.4l36.454 15.423c.2.093.421.18.508.387a.707.707 0 0 1 0 .38c-.107.535-.2 1.142-.2 1.757v1.021c0 .254-.261.36-.502.46l-.073.027c-5.775 2.464-81.076 34.538-81.19 34.538c-.113 0-.234 0-.347-.113c-.2-.2 0-.48.18-.735l.094-.133l29.957-46.335l.053-.08c.174-.281.375-.595.696-.595l.3.047c.682.093 1.284.18 1.892.18c4.545 0 8.756-2.21 11.296-5.989c.06-.1.137-.19.227-.267c.18-.133.448-.066.655.027zm-41.748 61.324l82.079-34.965s.12 0 .234.114c.447.447.828.747 1.196 1.028l.18.113c.168.094.335.2.348.374c0 .067 0 .107-.013.167l-7.032 43.144l-.027.174c-.046.333-.093.714-.407.714a11.558 11.558 0 0 0-9.177 5.655l-.034.053c-.093.154-.18.3-.334.38c-.14.068-.32.041-.468.008l-65.455-13.487c-.067-.013-1.016-3.465-1.09-3.472z"
|
|
||||||
fill="url(#IconifyId-1783bed17af-30b546-3)"
|
|
||||||
/>
|
|
||||||
<rect x="0" y="0" width="256" height="256" fill="rgba(0, 0, 0, 0)" />
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 4.5 KiB |
Before Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 2.4 KiB |
Before Width: | Height: | Size: 5.6 KiB |
Before Width: | Height: | Size: 9.3 KiB |
@ -1,23 +0,0 @@
|
|||||||
<?xml version="1.0" standalone="no"?>
|
|
||||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
|
|
||||||
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
|
|
||||||
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
|
|
||||||
width="288.000000pt" height="288.000000pt" viewBox="0 0 288.000000 288.000000"
|
|
||||||
preserveAspectRatio="xMidYMid meet">
|
|
||||||
|
|
||||||
<g transform="translate(0.000000,288.000000) scale(0.100000,-0.100000)"
|
|
||||||
fill="#2E84BF" stroke="none">
|
|
||||||
<path d="M1412 2513 l-183 -3 8 -98 c4 -53 8 -119 8 -147 l0 -50 -410 0 -410
|
|
||||||
0 3 -179 3 -179 67 7 c152 14 1015 18 1462 7 256 -7 472 -14 480 -16 13 -4 15
|
|
||||||
20 15 178 l0 182 -383 -4 c-210 -2 -398 0 -418 3 l-35 7 3 150 c3 128 1 149
|
|
||||||
-12 147 -8 -1 -97 -4 -198 -5z"/>
|
|
||||||
<path d="M845 1744 c-128 -50 -160 -67 -158 -81 1 -10 22 -73 47 -140 58 -153
|
|
||||||
124 -384 166 -578 18 -82 34 -151 35 -153 2 -2 83 25 182 60 l179 63 -12 60
|
|
||||||
c-35 168 -248 836 -267 834 -7 -1 -84 -30 -172 -65z"/>
|
|
||||||
<path d="M1781 1643 c-104 -417 -229 -832 -271 -901 l-19 -31 -173 -3 c-200
|
|
||||||
-3 -913 9 -943 16 -19 5 -20 0 -20 -180 l0 -186 50 6 c28 3 518 9 1090 12
|
|
||||||
l1040 7 0 176 0 176 -85 -7 c-47 -3 -195 -7 -329 -7 -191 -1 -242 2 -238 12 3
|
|
||||||
6 22 50 42 97 65 152 296 863 284 874 -4 4 -326 94 -365 103 -20 4 -24 -7 -63
|
|
||||||
-164z"/>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 1.2 KiB |
@ -1,13 +0,0 @@
|
|||||||
if ("serviceWorker" in navigator) {
|
|
||||||
console.log("Checking for service worker...");
|
|
||||||
navigator.serviceWorker.getRegistrations().then((registrations) => {
|
|
||||||
if (registrations.length < 1) {
|
|
||||||
console.log("Found no service worker!");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
registrations.forEach((registration) => {
|
|
||||||
registration.unregister();
|
|
||||||
console.log("Removed service worker!");
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
@ -1,16 +0,0 @@
|
|||||||
export function simpleLangName(code) {
|
|
||||||
if (code === "all") {
|
|
||||||
return "All";
|
|
||||||
}
|
|
||||||
const namesInEnglish = new Intl.DisplayNames(["en"], { type: "language" });
|
|
||||||
return namesInEnglish.of(code);
|
|
||||||
}
|
|
||||||
|
|
||||||
export function langName(code) {
|
|
||||||
if (code === "all") {
|
|
||||||
return "All";
|
|
||||||
}
|
|
||||||
const namesInEnglish = new Intl.DisplayNames(["en"], { type: "language" });
|
|
||||||
const namesInNative = new Intl.DisplayNames([code], { type: "language" });
|
|
||||||
return `${namesInEnglish.of(code)} - ${namesInNative.of(code)}`;
|
|
||||||
}
|
|