Project Linting (#209)

* More setup for ESLint

* Initial linting

* Fix: "Unexpected use of 'location': no-restricted-globals"

* Fix: "Prop 'sidebarItems' should define at least its type"

* Fix: "import/no-unresolved"

* Fix: "import/no-extraneous-dependencies"

* Fix: "Unexpected require() 'global-require'"

* Fix: "vue/require-prop-types"

* Line disable: "radix"

* Line disable: "no-param-reassign"

* Line disable: "no-shadow"

This should usually be an actual problem but I don't think so in this case as the next prompt is basically just a one-action warning.

* Add markdown linting support

* Replace single quotes with double

* Fix indentation for all files

* Fix second level quotation marks

* Change accordingly

I'd still rather keep 4-tab for MD when applicable though, the alternative is a non-standard 3-space indent, which makes three different indentations to keep track of.
This commit is contained in:
Soitora 2020-05-21 04:47:01 +02:00 committed by GitHub
parent 8c2459d492
commit b520d4e448
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
42 changed files with 5704 additions and 3998 deletions

1
.eslintignore Normal file
View File

@ -0,0 +1 @@
!.vuepress

View File

@ -5,18 +5,28 @@
}, },
"extends": [ "extends": [
"plugin:vue/essential", "plugin:vue/essential",
"vuepress", "airbnb-base",
"prettier" "prettier",
"vuepress"
], ],
"globals": {
"Atomics": "readonly",
"SharedArrayBuffer": "readonly"
},
"parserOptions": { "parserOptions": {
"ecmaVersion": 2018, "ecmaVersion": 2018,
"sourceType": "module" "sourceType": "module"
}, },
"plugins": [ "plugins": [
"vue", "vue",
"prettier" "prettier",
"markdown"
], ],
"rules": { "rules": {
"prettier/prettier": ["error"] "prettier/prettier": "error",
"import/no-unresolved": [
2,
{ "ignore": ["^@"] }
]
} }
} }

View File

@ -31,6 +31,6 @@ jobs:
deploy_key: ${{ secrets.ACTIONS_DEPLOY_KEY }} deploy_key: ${{ secrets.ACTIONS_DEPLOY_KEY }}
publish_branch: gh-pages publish_branch: gh-pages
publish_dir: ./public publish_dir: ./public
user_name: 'github-actions[bot]' user_name: "github-actions[bot]"
user_email: 'github-actions[bot]@users.noreply.github.com' user_email: "github-actions[bot]@users.noreply.github.com"
commit_message: ${{ github.event.head_commit.message }} commit_message: ${{ github.event.head_commit.message }}

View File

@ -1,47 +1,47 @@
{ {
"blocks": false, "blocks": false,
"brackets": "never", "brackets": "never",
"colons": "never", "colons": "never",
"colors": "always", "colors": "always",
"commaSpace": "always", "commaSpace": "always",
"commentSpace": "always", "commentSpace": "always",
"cssLiteral": "never", "cssLiteral": "never",
"customProperties": [], "customProperties": [],
"depthLimit": false, "depthLimit": false,
"duplicates": true, "duplicates": true,
"efficient": "always", "efficient": "always",
"exclude": [], "exclude": [],
"extendPref": "@extends", "extendPref": "@extends",
"globalDupe": true, "globalDupe": true,
"groupOutputByFile": true, "groupOutputByFile": true,
"indentPref": false, "indentPref": false,
"leadingZero": "always", "leadingZero": "always",
"maxErrors": false, "maxErrors": false,
"maxWarnings": false, "maxWarnings": false,
"mixed": true, "mixed": true,
"mixins": [], "mixins": [],
"namingConvention": false, "namingConvention": false,
"namingConventionStrict": false, "namingConventionStrict": false,
"none": "always", "none": "always",
"noImportant": false, "noImportant": false,
"parenSpace": "never", "parenSpace": "never",
"placeholders": "always", "placeholders": "always",
"prefixVarsWithDollar": "always", "prefixVarsWithDollar": "always",
"quotePref": false, "quotePref": false,
"reporterOptions": { "reporterOptions": {
"columns": ["lineData", "severity", "description", "rule"], "columns": ["lineData", "severity", "description", "rule"],
"columnSplitter": " ", "columnSplitter": " ",
"showHeaders": false, "showHeaders": false,
"truncate": true "truncate": true
}, },
"semicolons": "never", "semicolons": "never",
"sortOrder": ["grouped", "alphabetical"], "sortOrder": ["grouped", "alphabetical"],
"stackedProperties": "never", "stackedProperties": "never",
"trailingWhitespace": "never", "trailingWhitespace": "never",
"universal": false, "universal": false,
"valid": true, "valid": true,
"zeroUnits": "never", "zeroUnits": "never",
"zIndexNormalize": false, "zIndexNormalize": false,
"stylusSupremacy.selectorSeparator": ",\n", "stylusSupremacy.selectorSeparator": ",\n",
"stylusSupremacy.insertNewLineAroundBlocks": "root" "stylusSupremacy.insertNewLineAroundBlocks": "root"
} }

View File

@ -1,9 +1,11 @@
<h1 align="center"><img src="./src/.vuepress/public/assets/media/tachiyomi.png">Tachiyomi Website</h1> <div>
<p align="center"> <h1 align="center"><img src="./src/.vuepress/public/assets/media/tachiyomi.png">Tachiyomi Website</h1>
<a href="https://discord.gg/tachiyomi"> <p align="center">
<img src="https://img.shields.io/discord/349436576037732353.svg?label=Discord&labelColor=7289da&color=2c2f33&style=flat" alt="Discord"> <a href="https://discord.gg/tachiyomi">
</a> <img src="https://img.shields.io/discord/349436576037732353.svg?label=Discord&labelColor=7289da&color=2c2f33&style=flat" alt="Discord">
</p> </a>
</p>
</div>
## Contributing ## Contributing
@ -18,8 +20,8 @@ Pull requests are welcome. For major changes, please open an issue first to disc
## License ## License
Copyright (C) 2018 The Tachiyomi Open Source Project Copyright (C) 2018 The Tachiyomi Open Source Project
This Source Code Form is subject to the terms of the Mozilla Public 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 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/. file, You can obtain one at http://mozilla.org/MPL/2.0/.

257
package-lock.json generated
View File

@ -2189,6 +2189,12 @@
"object.assign": "^4.1.0" "object.assign": "^4.1.0"
} }
}, },
"bail": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz",
"integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==",
"dev": true
},
"balanced-match": { "balanced-match": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
@ -2873,6 +2879,24 @@
"supports-color": "^5.3.0" "supports-color": "^5.3.0"
} }
}, },
"character-entities": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz",
"integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==",
"dev": true
},
"character-entities-legacy": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz",
"integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==",
"dev": true
},
"character-reference-invalid": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz",
"integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==",
"dev": true
},
"chardet": { "chardet": {
"version": "0.7.0", "version": "0.7.0",
"resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz",
@ -3099,6 +3123,12 @@
"integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
"dev": true "dev": true
}, },
"collapse-white-space": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz",
"integrity": "sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==",
"dev": true
},
"collection-visit": { "collection-visit": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
@ -4716,6 +4746,17 @@
} }
} }
}, },
"eslint-plugin-markdown": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/eslint-plugin-markdown/-/eslint-plugin-markdown-1.0.2.tgz",
"integrity": "sha512-BfvXKsO0K+zvdarNc801jsE/NTLmig4oKhZ1U3aSUgTf2dB/US5+CrfGxMsCK2Ki1vS1R3HPok+uYpufFndhzw==",
"dev": true,
"requires": {
"object-assign": "^4.0.1",
"remark-parse": "^5.0.0",
"unified": "^6.1.2"
}
},
"eslint-plugin-node": { "eslint-plugin-node": {
"version": "10.0.0", "version": "10.0.0",
"resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-10.0.0.tgz", "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-10.0.0.tgz",
@ -6490,6 +6531,22 @@
} }
} }
}, },
"is-alphabetical": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz",
"integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==",
"dev": true
},
"is-alphanumerical": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz",
"integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==",
"dev": true,
"requires": {
"is-alphabetical": "^1.0.0",
"is-decimal": "^1.0.0"
}
},
"is-arguments": { "is-arguments": {
"version": "1.0.4", "version": "1.0.4",
"resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz",
@ -6580,6 +6637,12 @@
"integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==",
"dev": true "dev": true
}, },
"is-decimal": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz",
"integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==",
"dev": true
},
"is-descriptor": { "is-descriptor": {
"version": "0.1.6", "version": "0.1.6",
"resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
@ -6638,6 +6701,12 @@
"is-extglob": "^2.1.1" "is-extglob": "^2.1.1"
} }
}, },
"is-hexadecimal": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz",
"integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==",
"dev": true
},
"is-installed-globally": { "is-installed-globally": {
"version": "0.3.2", "version": "0.3.2",
"resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz", "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz",
@ -6784,12 +6853,24 @@
"integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=",
"dev": true "dev": true
}, },
"is-whitespace-character": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz",
"integrity": "sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==",
"dev": true
},
"is-windows": { "is-windows": {
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
"integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
"dev": true "dev": true
}, },
"is-word-character": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.4.tgz",
"integrity": "sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==",
"dev": true
},
"is-wsl": { "is-wsl": {
"version": "1.1.0", "version": "1.1.0",
"resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz",
@ -7111,8 +7192,7 @@
"lodash.orderby": { "lodash.orderby": {
"version": "4.6.0", "version": "4.6.0",
"resolved": "https://registry.npmjs.org/lodash.orderby/-/lodash.orderby-4.6.0.tgz", "resolved": "https://registry.npmjs.org/lodash.orderby/-/lodash.orderby-4.6.0.tgz",
"integrity": "sha1-5pfwTOXXhSL1TZM4syuBozk+TrM=", "integrity": "sha1-5pfwTOXXhSL1TZM4syuBozk+TrM="
"dev": true
}, },
"lodash.padstart": { "lodash.padstart": {
"version": "4.6.1", "version": "4.6.1",
@ -7146,8 +7226,7 @@
"lodash.throttle": { "lodash.throttle": {
"version": "4.1.1", "version": "4.1.1",
"resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz",
"integrity": "sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ=", "integrity": "sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ="
"dev": true
}, },
"lodash.uniq": { "lodash.uniq": {
"version": "4.5.0", "version": "4.5.0",
@ -7247,6 +7326,12 @@
"object-visit": "^1.0.0" "object-visit": "^1.0.0"
} }
}, },
"markdown-escapes": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz",
"integrity": "sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==",
"dev": true
},
"markdown-it": { "markdown-it": {
"version": "8.4.2", "version": "8.4.2",
"resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.4.2.tgz", "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.4.2.tgz",
@ -8375,6 +8460,20 @@
"safe-buffer": "^5.1.1" "safe-buffer": "^5.1.1"
} }
}, },
"parse-entities": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-1.2.2.tgz",
"integrity": "sha512-NzfpbxW/NPrzZ/yYSoQxyqUZMZXIdCfE0OIN4ESsnptHJECoUk3FZktxNuzQf4tjt5UEopnxpYJbvYuxIFDdsg==",
"dev": true,
"requires": {
"character-entities": "^1.0.0",
"character-entities-legacy": "^1.0.0",
"character-reference-invalid": "^1.0.0",
"is-alphanumerical": "^1.0.0",
"is-decimal": "^1.0.0",
"is-hexadecimal": "^1.0.0"
}
},
"parse-json": { "parse-json": {
"version": "2.2.0", "version": "2.2.0",
"resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
@ -9627,6 +9726,29 @@
"integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=",
"dev": true "dev": true
}, },
"remark-parse": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-5.0.0.tgz",
"integrity": "sha512-b3iXszZLH1TLoyUzrATcTQUZrwNl1rE70rVdSruJFlDaJ9z5aMkhrG43Pp68OgfHndL/ADz6V69Zow8cTQu+JA==",
"dev": true,
"requires": {
"collapse-white-space": "^1.0.2",
"is-alphabetical": "^1.0.0",
"is-decimal": "^1.0.0",
"is-whitespace-character": "^1.0.0",
"is-word-character": "^1.0.0",
"markdown-escapes": "^1.0.0",
"parse-entities": "^1.1.0",
"repeat-string": "^1.5.4",
"state-toggle": "^1.0.0",
"trim": "0.0.1",
"trim-trailing-lines": "^1.0.0",
"unherit": "^1.0.4",
"unist-util-remove-position": "^1.0.0",
"vfile-location": "^2.0.0",
"xtend": "^4.0.1"
}
},
"remove-trailing-separator": { "remove-trailing-separator": {
"version": "1.1.0", "version": "1.1.0",
"resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
@ -9712,6 +9834,12 @@
"is-finite": "^1.0.0" "is-finite": "^1.0.0"
} }
}, },
"replace-ext": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz",
"integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=",
"dev": true
},
"request": { "request": {
"version": "2.88.2", "version": "2.88.2",
"resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
@ -10665,6 +10793,12 @@
"integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==", "integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==",
"dev": true "dev": true
}, },
"state-toggle": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz",
"integrity": "sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==",
"dev": true
},
"static-extend": { "static-extend": {
"version": "0.1.2", "version": "0.1.2",
"resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
@ -11268,12 +11402,30 @@
"punycode": "^2.1.0" "punycode": "^2.1.0"
} }
}, },
"trim": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz",
"integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=",
"dev": true
},
"trim-newlines": { "trim-newlines": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz",
"integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=",
"dev": true "dev": true
}, },
"trim-trailing-lines": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.3.tgz",
"integrity": "sha512-4ku0mmjXifQcTVfYDfR5lpgV7zVqPg6zV9rdZmwOPqq0+Zq19xDqEgagqVbc4pOOShbncuAOIs59R3+3gcF3ZA==",
"dev": true
},
"trough": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz",
"integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==",
"dev": true
},
"true-case-path": { "true-case-path": {
"version": "1.0.3", "version": "1.0.3",
"resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz", "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz",
@ -11380,6 +11532,16 @@
} }
} }
}, },
"unherit": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz",
"integrity": "sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==",
"dev": true,
"requires": {
"inherits": "^2.0.0",
"xtend": "^4.0.0"
}
},
"unicode-canonical-property-names-ecmascript": { "unicode-canonical-property-names-ecmascript": {
"version": "1.0.4", "version": "1.0.4",
"resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz",
@ -11408,6 +11570,20 @@
"integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==",
"dev": true "dev": true
}, },
"unified": {
"version": "6.2.0",
"resolved": "https://registry.npmjs.org/unified/-/unified-6.2.0.tgz",
"integrity": "sha512-1k+KPhlVtqmG99RaTbAv/usu85fcSRu3wY8X+vnsEhIxNP5VbVIDiXnLqyKIG+UMdyTg0ZX9EI6k2AfjJkHPtA==",
"dev": true,
"requires": {
"bail": "^1.0.0",
"extend": "^3.0.0",
"is-plain-obj": "^1.1.0",
"trough": "^1.0.0",
"vfile": "^2.0.0",
"x-is-string": "^0.1.0"
}
},
"union-value": { "union-value": {
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz",
@ -11459,6 +11635,45 @@
"crypto-random-string": "^2.0.0" "crypto-random-string": "^2.0.0"
} }
}, },
"unist-util-is": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz",
"integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==",
"dev": true
},
"unist-util-remove-position": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-1.1.4.tgz",
"integrity": "sha512-tLqd653ArxJIPnKII6LMZwH+mb5q+n/GtXQZo6S6csPRs5zB0u79Yw8ouR3wTw8wxvdJFhpP6Y7jorWdCgLO0A==",
"dev": true,
"requires": {
"unist-util-visit": "^1.1.0"
}
},
"unist-util-stringify-position": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-1.1.2.tgz",
"integrity": "sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ==",
"dev": true
},
"unist-util-visit": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz",
"integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==",
"dev": true,
"requires": {
"unist-util-visit-parents": "^2.0.0"
}
},
"unist-util-visit-parents": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz",
"integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==",
"dev": true,
"requires": {
"unist-util-is": "^3.0.0"
}
},
"universalify": { "universalify": {
"version": "0.1.2", "version": "0.1.2",
"resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
@ -11776,6 +11991,33 @@
"extsprintf": "^1.2.0" "extsprintf": "^1.2.0"
} }
}, },
"vfile": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/vfile/-/vfile-2.3.0.tgz",
"integrity": "sha512-ASt4mBUHcTpMKD/l5Q+WJXNtshlWxOogYyGYYrg4lt/vuRjC1EFQtlAofL5VmtVNIZJzWYFJjzGWZ0Gw8pzW1w==",
"dev": true,
"requires": {
"is-buffer": "^1.1.4",
"replace-ext": "1.0.0",
"unist-util-stringify-position": "^1.0.0",
"vfile-message": "^1.0.0"
}
},
"vfile-location": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-2.0.6.tgz",
"integrity": "sha512-sSFdyCP3G6Ka0CEmN83A2YCMKIieHx0EDaj5IDP4g1pa5ZJ4FJDvpO0WODLxo4LUX4oe52gmSCK7Jw4SBghqxA==",
"dev": true
},
"vfile-message": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-1.1.1.tgz",
"integrity": "sha512-1WmsopSGhWt5laNir+633LszXvZ+Z/lxveBf6yhGsqnQIhlhzooZae7zV6YVM1Sdkw68dtAW3ow0pOdPANugvA==",
"dev": true,
"requires": {
"unist-util-stringify-position": "^1.1.1"
}
},
"vm-browserify": { "vm-browserify": {
"version": "1.1.2", "version": "1.1.2",
"resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz",
@ -11792,7 +12034,6 @@
"version": "1.1.3", "version": "1.1.3",
"resolved": "https://registry.npmjs.org/vue-agile/-/vue-agile-1.1.3.tgz", "resolved": "https://registry.npmjs.org/vue-agile/-/vue-agile-1.1.3.tgz",
"integrity": "sha512-RnvKK6ZoXNAk2Q6h/ux+bhqYs4uflFew3xcsNfysQa+GVLKHfizAaeKHJndqGjSXA+qg+kJuYd4RDY/ry8RY4w==", "integrity": "sha512-RnvKK6ZoXNAk2Q6h/ux+bhqYs4uflFew3xcsNfysQa+GVLKHfizAaeKHJndqGjSXA+qg+kJuYd4RDY/ry8RY4w==",
"dev": true,
"requires": { "requires": {
"lodash.orderby": "^4.6.0", "lodash.orderby": "^4.6.0",
"lodash.throttle": "^4.1.1" "lodash.throttle": "^4.1.1"
@ -12624,6 +12865,12 @@
"async-limiter": "~1.0.0" "async-limiter": "~1.0.0"
} }
}, },
"x-is-string": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/x-is-string/-/x-is-string-0.1.0.tgz",
"integrity": "sha1-R0tQhlrzpJqcRlfwWs0UVFj3fYI=",
"dev": true
},
"xdg-basedir": { "xdg-basedir": {
"version": "4.0.0", "version": "4.0.0",
"resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz",

View File

@ -16,13 +16,16 @@
"@vuepress/plugin-google-analytics": "^1.5.0", "@vuepress/plugin-google-analytics": "^1.5.0",
"eslint": "^6.8.0", "eslint": "^6.8.0",
"eslint-config-airbnb": "^18.1.0", "eslint-config-airbnb": "^18.1.0",
"eslint-config-airbnb-base": "^14.1.0",
"eslint-config-prettier": "^6.11.0", "eslint-config-prettier": "^6.11.0",
"eslint-config-vuepress": "^2.2.0", "eslint-config-vuepress": "^2.2.0",
"eslint-plugin-import": "^2.20.2",
"eslint-plugin-markdown": "^1.0.2",
"eslint-plugin-prettier": "^3.1.3", "eslint-plugin-prettier": "^3.1.3",
"eslint-plugin-vue": "^6.2.2",
"node-sass": "^4.14.1", "node-sass": "^4.14.1",
"prettier": "^2.0.5", "prettier": "^2.0.5",
"sass-loader": "^8.0.2", "sass-loader": "^8.0.2",
"vue-agile": "^1.1.3",
"vuepress": "^1.5.0", "vuepress": "^1.5.0",
"vuepress-plugin-clean-urls": "^1.1.1", "vuepress-plugin-clean-urls": "^1.1.1",
"vuepress-plugin-container": "^2.1.3" "vuepress-plugin-container": "^2.1.3"
@ -33,6 +36,7 @@
"lodash.groupby": "^4.6.0", "lodash.groupby": "^4.6.0",
"lodash.sortby": "^4.7.0", "lodash.sortby": "^4.7.0",
"material-design-icons": "^3.0.1", "material-design-icons": "^3.0.1",
"vue-agile": "^1.1.3",
"vue-material-design-icons": "^4.6.0", "vue-material-design-icons": "^4.6.0",
"vue-sweetalert2": "^3.0.5", "vue-sweetalert2": "^3.0.5",
"vuepress-plugin-sitemap": "^2.3.1" "vuepress-plugin-sitemap": "^2.3.1"

View File

@ -16,18 +16,18 @@ export default {
props: { props: {
name: { name: {
type: String, type: String,
default: "carousel" default: "carousel",
}, },
config: { config: {
type: Object, type: Object,
default: function() { default() {
return { return {
navButtons: true, navButtons: true,
centerMode: true centerMode: true,
}; };
} },
} },
} },
}; };
</script> </script>

View File

@ -10,9 +10,9 @@ export default {
props: { props: {
name: { name: {
type: String, type: String,
default: "carousel-cell" default: "carousel-cell",
} },
} },
}; };
</script> </script>

View File

@ -15,35 +15,34 @@ import axios from "axios";
const RELEASE_URL = const RELEASE_URL =
"https://api.github.com/repos/inorichi/tachiyomi/releases/latest"; "https://api.github.com/repos/inorichi/tachiyomi/releases/latest";
const PREVIEW_URL = const PREVIEW_URL = "https://tachiyomi.kanade.eu/latest";
"https://tachiyomi.kanade.eu/latest";
export default { export default {
props: { props: {
downloadStableTag: { downloadStableTag: {
type: String, type: String,
required: true required: true,
}, },
downloadPreviewTag: { downloadPreviewTag: {
type: String, type: String,
required: true required: true,
}, },
downloadStableLabel: { downloadStableLabel: {
type: String, type: String,
default: "Stable" default: "Stable",
}, },
downloadPreviewLabel: { downloadPreviewLabel: {
type: String, type: String,
default: "Preview" default: "Preview",
}, },
downloadStableUrl: { downloadStableUrl: {
type: String, type: String,
default: undefined default: undefined,
}, },
downloadPreviewUrl: { downloadPreviewUrl: {
type: String, type: String,
default: undefined default: undefined,
} },
}, },
data() { data() {
@ -56,7 +55,7 @@ export default {
async mounted() { async mounted() {
const { data } = await axios.get(RELEASE_URL); const { data } = await axios.get(RELEASE_URL);
// Maybe eventually some release has more than the apk in assets. // Maybe eventually some release has more than the apk in assets.
const apkAsset = data.assets.find(a => a.name.includes(".apk")); const apkAsset = data.assets.find((a) => a.name.includes(".apk"));
// Set the values. // Set the values.
this.$data.tagName = data.tag_name; this.$data.tagName = data.tag_name;
this.$data.browserDownloadUrl = apkAsset.browser_download_url; this.$data.browserDownloadUrl = apkAsset.browser_download_url;
@ -66,7 +65,7 @@ export default {
downloadStable() { downloadStable() {
this.$swal({ this.$swal({
title: "Downloading", title: "Downloading",
text: this.downloadStableLabel + " version is being downloaded.", text: `${this.downloadStableLabel} version is being downloaded.`,
icon: "success", icon: "success",
focusConfirm: false, focusConfirm: false,
focusCancel: false, focusCancel: false,
@ -74,24 +73,32 @@ export default {
timerProgressBar: true, timerProgressBar: true,
customClass: { customClass: {
confirmButton: "download-confirm-button", confirmButton: "download-confirm-button",
container: "download-container" container: "download-container",
}, },
showClass: { showClass: {
popup: "animated pulse faster" popup: "animated pulse faster",
}, },
hideClass: { hideClass: {
popup: "animated zoomOut faster" popup: "animated zoomOut faster",
} },
}); });
window.location.assign( window.location.assign(
this.$props.downloadStableUrl || this.$data.browserDownloadUrl || RELEASE_URL this.$props.downloadStableUrl ||
this.$data.browserDownloadUrl ||
RELEASE_URL
);
window.ga(
"send",
"event",
"Action",
"Download",
this.downloadStableTag
); );
window.ga("send", "event", "Action", "Download", this.downloadStableTag);
}, },
downloadPreview() { downloadPreview() {
this.$swal({ this.$swal({
title: "Downloading", title: "Downloading",
text: this.downloadPreviewLabel + " version is being downloaded.", text: `${this.downloadPreviewLabel} version is being downloaded.`,
icon: "success", icon: "success",
focusConfirm: false, focusConfirm: false,
focusCancel: false, focusCancel: false,
@ -99,21 +106,27 @@ export default {
timerProgressBar: true, timerProgressBar: true,
customClass: { customClass: {
confirmButton: "download-confirm-button", confirmButton: "download-confirm-button",
container: "download-container" container: "download-container",
}, },
showClass: { showClass: {
popup: "animated pulse faster" popup: "animated pulse faster",
}, },
hideClass: { hideClass: {
popup: "animated zoomOut faster" popup: "animated zoomOut faster",
} },
}); });
window.location.assign( window.location.assign(
this.$props.downloadPreviewUrl || PREVIEW_URL this.$props.downloadPreviewUrl || PREVIEW_URL
); );
window.ga("send", "event", "Action", "Download", this.downloadPreviewTag); window.ga(
} "send",
} "event",
"Action",
"Download",
this.downloadPreviewTag
);
},
},
}; };
</script> </script>

View File

@ -54,24 +54,26 @@ const EXTENSION_JSON =
export default { export default {
data() { data() {
return { return {
extensions: [] extensions: [],
}; };
}, },
async beforeMount() { async beforeMount() {
const { data } = await axios.get(EXTENSION_JSON); const { data } = await axios.get(EXTENSION_JSON);
const values = Object.values(groupBy(data, "lang")); const values = Object.values(groupBy(data, "lang"));
this.$data.extensions = sortBy(values, [g => this.langName(g[0].lang)]); this.$data.extensions = sortBy(values, [
(g) => this.langName(g[0].lang),
]);
}, },
updated() { updated() {
if (location.hash) { if (window.ocation.hash) {
location.replace(location.hash); window.location.replace(window.location.hash);
} }
}, },
methods: { methods: {
langName: code => langName: (code) =>
code === "all" code === "all"
? "All" ? "All"
: `${ISO6391.getName(code)} (${ISO6391.getNativeName(code)})`, : `${ISO6391.getName(code)} (${ISO6391.getNativeName(code)})`,
@ -79,9 +81,9 @@ export default {
const pkgName = pkg.substring(0, pkg.lastIndexOf(".")); const pkgName = pkg.substring(0, pkg.lastIndexOf("."));
return `https://raw.githubusercontent.com/inorichi/tachiyomi-extensions/repo/icon/${pkgName}.png`; return `https://raw.githubusercontent.com/inorichi/tachiyomi-extensions/repo/icon/${pkgName}.png`;
}, },
apkUrl: apk => apkUrl: (apk) =>
`https://raw.githubusercontent.com/inorichi/tachiyomi-extensions/repo/apk/${apk}` `https://raw.githubusercontent.com/inorichi/tachiyomi-extensions/repo/apk/${apk}`,
} },
}; };
</script> </script>

View File

@ -1,9 +1,17 @@
<template> <template>
<div class="downloadContainer"> <div class="downloadContainer">
<button class="downloadForkButton" :style="downloadForkStyle" @click="downloadFork"> <button
class="downloadForkButton"
:style="downloadForkStyle"
@click="downloadFork"
>
{{ downloadForkLabel }} {{ downloadForkLabel }}
</button> </button>
<button class="githubForkButton" :style="githubForkStyle" :onclick="githubForkLink"> <button
class="githubForkButton"
:style="githubForkStyle"
:onclick="githubForkLink"
>
{{ githubForkLabel }} {{ githubForkLabel }}
</button> </button>
</div> </div>
@ -16,44 +24,44 @@ export default {
props: { props: {
forkName: { forkName: {
type: String, type: String,
required: true required: true,
}, },
downloadForkLabel: { downloadForkLabel: {
type: String, type: String,
default: "Download" default: "Download",
}, },
downloadForkLink: { downloadForkLink: {
type: String, type: String,
required: true required: true,
}, },
downloadForkStyle: { downloadForkStyle: {
type: String, type: String,
default: "" default: "",
}, },
githubForkLabel: { githubForkLabel: {
type: String, type: String,
default: "GitHub" default: "GitHub",
}, },
githubForkLink: { githubForkLink: {
type: String, type: String,
required: true required: true,
}, },
githubForkStyle: { githubForkStyle: {
type: String, type: String,
default: "" default: "",
} },
}, },
data() { data() {
return { return {
tagName: "", tagName: "",
browserDownloadUrl: "" browserDownloadUrl: "",
}; };
}, },
async mounted() { async mounted() {
const { data } = await axios.get(this.$props.downloadForkLink); const { data } = await axios.get(this.$props.downloadForkLink);
// Maybe eventually some release has more than the apk in assets. // Maybe eventually some release has more than the apk in assets.
const apkAsset = data.assets.find(a => a.name.includes(".apk")); const apkAsset = data.assets.find((a) => a.name.includes(".apk"));
// Set the values. // Set the values.
this.$data.tagName = data.tag_name; this.$data.tagName = data.tag_name;
this.$data.browserDownloadUrl = apkAsset.browser_download_url; this.$data.browserDownloadUrl = apkAsset.browser_download_url;
@ -63,7 +71,7 @@ export default {
downloadFork() { downloadFork() {
this.$swal({ this.$swal({
title: "Downloading", title: "Downloading",
text: this.$props.forkName + " is being downloaded.", text: `${this.$props.forkName} is being downloaded.`,
icon: "success", icon: "success",
focusConfirm: false, focusConfirm: false,
focusCancel: false, focusCancel: false,
@ -71,21 +79,27 @@ export default {
timerProgressBar: true, timerProgressBar: true,
customClass: { customClass: {
confirmButton: "download-confirm-button", confirmButton: "download-confirm-button",
container: "download-container" container: "download-container",
}, },
showClass: { showClass: {
popup: "animated pulse faster" popup: "animated pulse faster",
}, },
hideClass: { hideClass: {
popup: "animated zoomOut faster" popup: "animated zoomOut faster",
} },
}); });
window.location.assign( window.location.assign(
this.$data.browserDownloadUrl || this.$props.downloadForkLink this.$data.browserDownloadUrl || this.$props.downloadForkLink
); );
window.ga("send", "event", "Action", "Download", this.$props.forkName); window.ga(
} "send",
} "event",
"Action",
"Download",
this.$props.forkName
);
},
},
}; };
</script> </script>

View File

@ -1,27 +1,23 @@
<template> <template>
<Layout :class="$frontmatter.title"> <Layout :class="$frontmatter.title">
<main class="page"> <main class="page">
<slot name="top" /> <slot name="top" />
<Content class="theme-default-content" /> <Content class="theme-default-content" />
<PageEdit /> <PageEdit />
<PageNav v-bind="{ sidebarItems }" /> <slot name="bottom" />
<slot name="bottom" />
</main> </main>
</Layout> </Layout>
</template> </template>
<script> <script>
import Layout from '@theme/layouts/Layout.vue' import Layout from "@theme/layouts/Layout.vue";
import PageEdit from '@theme/components/PageEdit.vue' import PageEdit from "@theme/components/PageEdit.vue";
import PageNav from '@theme/components/PageNav.vue'
export default { export default {
components: { PageEdit, PageNav, Layout }, components: { PageEdit, Layout },
props: ['sidebarItems'] };
}
</script> </script>
<style lang="stylus"> <style lang="stylus">

View File

@ -158,209 +158,209 @@ export default {
<style lang="stylus"> <style lang="stylus">
.help-page .help-page
.page .page
padding-left 0 !important padding-left 0 !important
padding-bottom 2rem padding-bottom 2rem
display block display block
.theme-custom-content .theme-custom-content
max-width 75rem max-width 75rem
margin 0 auto margin 0 auto
padding 2rem 2.5rem padding 2rem 2.5rem
* *
box-sizing border-box box-sizing border-box
h1 h1
text-align center text-align center
.header-anchor .header-anchor
display none display none
h3 h3
.header-anchor .header-anchor
display none display none
.content__center .content__center
text-align center text-align center
margin-bottom 2rem margin-bottom 2rem
.algolia-search-wrapper .algolia-search-wrapper
width 100% width 100%
text-align center text-align center
margin-bottom 5rem margin-bottom 5rem
.algolia-autocomplete .algolia-autocomplete
width 50% width 50%
input input
background #ffffff url('/assets/img/search.83621669.svg') 0.6rem 0.9rem no-repeat background #ffffff url('/assets/img/search.83621669.svg') 0.6rem 0.9rem no-repeat
background-size 1rem background-size 1rem
box-shadow 0 0 30px rgba(177, 174, 174, 0.322) box-shadow 0 0 30px rgba(177, 174, 174, 0.322)
border 1px solid #cfd4db border 1px solid #cfd4db
font-size 1.2rem font-size 1.2rem
height 3rem height 3rem
width 100% width 100%
.card .card
background-color white background-color white
border-bottom 1px solid transparent border-bottom 1px solid transparent
border-radius 6px border-radius 6px
box-shadow 0 0 30px #b1aeae52 box-shadow 0 0 30px #b1aeae52
color $accentColor color $accentColor
height 100% height 100%
overflow hidden overflow hidden
padding 0.5rem padding 0.5rem
text-align center text-align center
user-select none user-select none
width auto width auto
header header
margin-top 1.25rem margin-top 1.25rem
white-space nowrap white-space nowrap
.material-icons, .material-icons,
.material-design-icon .material-design-icon
display contents display contents
font-size 2.5em font-size 2.5em
color $accentColorSecondary color $accentColorSecondary
.material-design-icon > .material-design-icon__svg .material-design-icon > .material-design-icon__svg
position relative position relative
span span
display block display block
.icon.outbound .icon.outbound
display inline-block display inline-block
visibility hidden visibility hidden
vertical-align baseline vertical-align baseline
right 10px right 10px
h3 h3
display inline-block display inline-block
margin-left 1.8rem margin-left 1.8rem
margin-bottom 0 margin-bottom 0
h3 h3
margin 10px margin 10px
p p
color #566573 color #566573
font-weight 400 font-weight 400
font-size 0.95rem font-size 0.95rem
&:hover &:hover
border-bottom 2px solid $accentColor border-bottom 2px solid $accentColor
border-bottom-left-radius 0 border-bottom-left-radius 0
border-bottom-right-radius 0 border-bottom-right-radius 0
position relative position relative
.material-design-icon .material-design-icon
color $accentColor color $accentColor
&.discord-icon &.discord-icon
color $discordAccentColor color $discordAccentColor
&.reddit-icon &.reddit-icon
color $redditAccentColor color $redditAccentColor
&.github-icon &.github-icon
color $githubAccentColor color $githubAccentColor
.icon.outbound .icon.outbound
visibility visible visibility visible
&__Discord:hover &__Discord:hover
border-bottom 2px solid $discordAccentColor border-bottom 2px solid $discordAccentColor
h3 h3
color $discordAccentColor color $discordAccentColor
&__Reddit:hover &__Reddit:hover
border-bottom 2px solid $redditAccentColor border-bottom 2px solid $redditAccentColor
h3 h3
color $redditAccentColor color $redditAccentColor
&__GitHub:hover &__GitHub:hover
border-bottom 2px solid $githubAccentColor border-bottom 2px solid $githubAccentColor
h3 h3
color $githubAccentColor color $githubAccentColor
.column .column
border 1px solid #cfd4db border 1px solid #cfd4db
border-radius 6px border-radius 6px
&:hover &:hover
border-bottom none border-bottom none
a:focus a:focus
box-shadow none box-shadow none
outline none outline none
.card .card
box-shadow 0 0 30px #b1aeae52, 0 0 0 1px #fff, 0 0 0 3px rgba(50, 100, 150, 0.4) box-shadow 0 0 30px #b1aeae52, 0 0 0 1px #fff, 0 0 0 3px rgba(50, 100, 150, 0.4)
outline none outline none
.row .row
display grid display grid
grid-template-columns repeat(4, 1fr) grid-template-columns repeat(4, 1fr)
grid-auto-rows 1fr grid-auto-rows 1fr
grid-gap 1rem grid-gap 1rem
&:after &:after
content '' content ""
display table display table
clear both clear both
@media screen and (max-width $MQMobile) @media screen and (max-width $MQMobile)
.help-page .help-page
.page .page
.theme-custom-content .theme-custom-content
padding 2rem 0.75rem padding 2rem 0.75rem
padding-bottom 0 padding-bottom 0
h1 h1
margin-bottom 0.5rem margin-bottom 0.5rem
.content__center .content__center
margin-top 0 margin-top 0
padding-top 0 padding-top 0
.algolia-search-wrapper .algolia-search-wrapper
width 100% width 100%
margin-bottom 1rem margin-bottom 1rem
.algolia-autocomplete .algolia-autocomplete
width 100% width 100%
padding 0.4rem 0.65rem padding 0.4rem 0.65rem
input input
width 100% width 100%
left 0 left 0
.column .column
margin 0.4rem 0.6rem margin 0.4rem 0.6rem
.card .card
height auto height auto
width auto width auto
header header
margin-top 1rem margin-top 1rem
.material-icons, .material-icons,
.material-design-icon .material-design-icon
font-size 1.6em font-size 1.6em
&.discord-icon &.discord-icon
color $discordAccentColor color $discordAccentColor
&.reddit-icon &.reddit-icon
color $redditAccentColor color $redditAccentColor
&.github-icon &.github-icon
color $githubAccentColor color $githubAccentColor
span span
display inline-block display inline-block
.icon.outbound .icon.outbound
visibility visible visibility visible
right 0 right 0
top -4px top -4px
h3 h3
margin-left 0 margin-left 0
margin-bottom 0 margin-bottom 0
h3 h3
font-size 1.5rem font-size 1.5rem
display inline-block display inline-block
margin 0 margin 0
p p
font-size 1rem font-size 1rem
&:hover &:hover
border-bottom 2px solid #cfd4db border-bottom 2px solid #cfd4db
border-bottom-left-radius 6px border-bottom-left-radius 6px
border-bottom-right-radius 6px border-bottom-right-radius 6px
position inherit position inherit
top unset top unset
.material-design-icon .material-design-icon
color $accentColorSecondary color $accentColorSecondary
&__Discord &__Discord
h3 h3
color $discordAccentColor color $discordAccentColor
&__Reddit &__Reddit
h3 h3
color $redditAccentColor color $redditAccentColor
&__GitHub &__GitHub
h3 h3
color $githubAccentColor color $githubAccentColor
.row .row
grid-template-columns repeat(1, 1fr) grid-template-columns repeat(1, 1fr)
.navbar .navbar
padding-left 1rem padding-left 1rem
.logo .logo
margin-right 0 margin-right 0
.can-hide .can-hide
display block display block
.sidebar-button .sidebar-button
display none display none
.site-name.can-hide .site-name.can-hide
display none display none
.nav-links.can-hide .nav-links.can-hide
.nav-item, .nav-item,
.repo-link .repo-link
padding-left 0.8em padding-left 0.8em
</style> </style>

View File

@ -14,17 +14,17 @@ export default {
props: { props: {
iconOnly: { iconOnly: {
type: Boolean, type: Boolean,
default: false default: false,
}, },
name: { name: {
type: String, type: String,
default: "" default: "",
}, },
iconName: { iconName: {
type: String, type: String,
required: true required: true,
} },
} },
}; };
</script> </script>
@ -37,7 +37,7 @@ export default {
display inline display inline
.material-icons .material-icons
font-family 'Material Icons' font-family "Material Icons"
font-size 1.35em font-size 1.35em
font-style normal font-style normal
position relative position relative
@ -50,7 +50,6 @@ export default {
white-space nowrap white-space nowrap
word-wrap normal word-wrap normal
direction ltr direction ltr
font-feature-settings 'liga' font-feature-settings "liga"
-webkit-font-smoothing antialiased -webkit-font-smoothing antialiased
</style> </style>

View File

@ -1,13 +1,27 @@
<template> <template>
<span v-if="nav.link" class="app-navigation" :class="nav.class" title="App navigation"> <span
v-if="nav.link"
class="app-navigation"
:class="nav.class"
title="App navigation"
>
<a class="app-link" :href="nav.link + entry"> <a class="app-link" :href="nav.link + entry">
<MaterialIcon v-if="nav.icon" class="app-icon" :iconName="nav.icon" /> <MaterialIcon
v-if="nav.icon"
class="app-icon"
:icon-name="nav.icon"
/>
<span class="app-label">{{ nav.text }}</span> <span class="app-label">{{ nav.text }}</span>
<slot /> <slot />
</a> </a>
</span> </span>
<span v-else class="app-navigation" :class="nav.class" title="App navigation"> <span
<MaterialIcon v-if="nav.icon" class="app-icon" :iconName="nav.icon" /> v-else
class="app-navigation"
:class="nav.class"
title="App navigation"
>
<MaterialIcon v-if="nav.icon" class="app-icon" :icon-name="nav.icon" />
<span class="app-label">{{ nav.text }}</span> <span class="app-label">{{ nav.text }}</span>
<slot /> <slot />
</span> </span>

View File

@ -1,6 +1,6 @@
<template> <template>
<span v-if="fileName" class="fileNameContainer" title="File name"> <span v-if="fileName" class="fileNameContainer" title="File name">
<MaterialIcon class="fileNameIcon" iconName="get_app" /> <MaterialIcon class="fileNameIcon" icon-name="get_app" />
<span class="fileName">tachiyomi-{{ this.$data.tagName }}.apk</span> <span class="fileName">tachiyomi-{{ this.$data.tagName }}.apk</span>
<slot /> <slot />
</span> </span>
@ -18,8 +18,8 @@ const RELEASE_URL =
export default { export default {
props: { props: {
fileName: { fileName: {
type: Boolean type: Boolean,
} },
}, },
data() { data() {

View File

@ -1,52 +1,53 @@
module.exports = { const pluginsConfig = require("./config/plugins");
dest: './public', const navBarConfig = require("./config/navBar");
temp: './node_modules/.temp/theme', const sideBarConfig = require("./config/sideBar");
title: 'Tachiyomi', module.exports = {
description: 'Free and open source manga reader for Android', dest: "./public",
temp: "./node_modules/.temp/theme",
title: "Tachiyomi",
description: "Free and open source manga reader for Android",
// prettier-ignore // prettier-ignore
head: [ head: [
// Embed headers // Embed headers
['link', { rel: 'icon', href: '/favicon.ico' }], ["link", { rel: "icon", href: "/favicon.ico" }],
['link', { rel: 'manifest', href: '/manifest.json' }], ["link", { rel: "manifest", href: "/manifest.json" }],
['meta', { name: 'theme-color', content: '#2e84bf' }], ["meta", { name: "theme-color", content: "#2e84bf" }],
['meta', { prefix: 'og: http://ogp.me/ns#', property: 'og:image', content: 'https://tachiyomi.org/icons/logo.png' }], ["meta", { prefix: "og: http://ogp.me/ns#", property: "og:image", content: "https://tachiyomi.org/icons/logo.png" }],
// Custom headers // Custom headers
['link', { rel: 'preconnect', href: 'https://fonts.gstatic.com', crossorigin:''}], ["link", { rel: "preconnect", href: "https://fonts.gstatic.com", crossorigin:""}],
['link', { rel: 'stylesheet', href: 'https://fonts.googleapis.com/css?family=Open+Sans'}], ["link", { rel: "stylesheet", href: "https://fonts.googleapis.com/css?family=Open+Sans"}],
], ],
themeConfig: { themeConfig: {
logo: '/icons/logo.svg', logo: "/icons/logo.svg",
repo: 'inorichi/tachiyomi', repo: "inorichi/tachiyomi",
docsRepo: 'tachiyomiorg/website', docsRepo: "tachiyomiorg/website",
docsDir: 'src', docsDir: "src",
smoothScroll: true, smoothScroll: true,
algolia: { algolia: {
apiKey: 'fc1c45b5a3835e1882cbbf0751dfe705', apiKey: "fc1c45b5a3835e1882cbbf0751dfe705",
indexName: 'tachiyomi' indexName: "tachiyomi",
}, },
searchPlaceholder: 'Search...', searchPlaceholder: "Search...",
editLinks: true, editLinks: true,
editLinkText: 'Help us improve this page', editLinkText: "Help us improve this page",
lastUpdated: 'Last Updated', lastUpdated: "Last Updated",
nav: require('./config/nav'), nav: navBarConfig,
sidebar: { sidebar: {
'/help/guides/': require('./config/sidebar/guides'), "/help/guides/": sideBarConfig.guides,
'/help/faq/': require('./config/sidebar/faq'), "/help/faq/": sideBarConfig.faq,
'/help/contribution': require('./config/sidebar/contribution'), "/help/contribution": sideBarConfig.contribution,
'/extensions': require('./config/sidebar/extensions'), "/extensions": sideBarConfig.extensions,
'/forks': require('./config/sidebar/forks') "/forks": sideBarConfig.forks,
} },
}, },
plugins: require('./config/plugins'), plugins: pluginsConfig,
extraWatchFiles: [ extraWatchFiles: [
'.vuepress/config/nav.js', ".vuepress/config/plugins.js",
'.vuepress/config/plugins.js', ".vuepress/config/navBar.js",
'.vuepress/config/sidebar/guides.js', ".vuepress/config/sideBar.js",
'.vuepress/config/sidebar/faq.js', ],
'.vuepress/config/sidebar/contribution.js', };
'.vuepress/config/sidebar/extensions.js'
]
}

View File

@ -3,50 +3,50 @@ module.exports = [
[ [
"clean-urls", "clean-urls",
{ {
normalSuffix: "/" normalSuffix: "/",
} },
], ],
[ [
"@vuepress/google-analytics", "@vuepress/google-analytics",
{ {
ga: "UA-148212082-1" ga: "UA-148212082-1",
} },
], ],
[ [
"vuepress-plugin-container", "vuepress-plugin-container",
{ {
type: "expander", type: "expander",
before: info => before: (info) =>
`<details class="expander"><summary class="expansion">${info}</summary>`, `<details class="expander"><summary class="expansion">${info}</summary>`,
after: "</details>" after: "</details>",
} },
], ],
[ [
"vuepress-plugin-container", "vuepress-plugin-container",
{ {
type: "guide", type: "guide",
before: info => `<div class="guide"><p class="title">${info}</p>`, before: (info) => `<div class="guide"><p class="title">${info}</p>`,
after: "</div>" after: "</div>",
} },
], ],
[ [
"vuepress-plugin-container", "vuepress-plugin-container",
{ {
type: "aside", type: "aside",
defaultTitle: "" defaultTitle: "",
} },
], ],
[ [
"vuepress-plugin-container", "vuepress-plugin-container",
{ {
type: "aside-guide", type: "aside-guide",
defaultTitle: "" defaultTitle: "",
} },
], ],
[ [
"vuepress-plugin-sitemap", "vuepress-plugin-sitemap",
{ {
hostname: "https://tachiyomi.org" hostname: "https://tachiyomi.org",
} },
] ],
]; ];

View File

@ -0,0 +1,148 @@
module.exports = {
guides: [
"/",
{
title: "Guides",
collapsable: false,
sidebarDepth: 2,
children: [
{
title: "General",
collapsable: false,
sidebarDepth: 2,
children: [
"/help/guides/getting-started",
"/help/guides/source-problems",
"/help/guides/source-migration",
"/help/guides/creating-backups",
"/help/guides/reading-local-manga",
"/help/guides/categories",
],
},
{
title: "Settings",
collapsable: false,
sidebarDepth: 2,
children: [
"/help/guides/settings/general",
"/help/guides/settings/reader",
"/help/guides/settings/downloads",
"/help/guides/settings/tracking",
"/help/guides/settings/backup",
"/help/guides/settings/advanced",
],
},
],
},
{
title: "Frequently Asked Questions",
path: "/help/faq/",
},
{
title: "Forks",
path: "/forks/",
},
{
title: "Contribution",
path: "/help/contribution",
},
{
title: "Available extensions",
path: "/extensions/",
},
],
faq: [
"/",
{
title: "Frequently Asked Questions",
path: "/help/faq/",
},
{
title: "Guides",
path: "/help/guides/getting-started",
},
{
title: "Forks",
path: "/forks/",
},
{
title: "Contribution",
path: "/help/contribution",
},
{
title: "Available extensions",
path: "/extensions/",
},
],
contribution: [
"/",
{
title: "Contribution",
collapsable: false,
sidebarDepth: 1,
children: ["/help/contribution"],
},
{
title: "Frequently Asked Questions",
path: "/help/faq/",
},
{
title: "Guides",
path: "/help/guides/getting-started",
},
{
title: "Forks",
path: "/forks/",
},
{
title: "Available extensions",
path: "/extensions/",
},
],
extensions: [
"/",
{
title: "Available extensions",
path: "/extensions/",
},
{
title: "Frequently Asked Questions",
path: "/help/faq/",
},
{
title: "Guides",
path: "/help/guides/getting-started",
},
{
title: "Forks",
path: "/forks/",
},
{
title: "Contribution",
path: "/help/contribution",
},
],
forks: [
"/",
{
title: "Forks",
path: "/forks/",
},
{
title: "Frequently Asked Questions",
path: "/help/faq/",
},
{
title: "Guides",
path: "/help/guides/getting-started",
},
{
title: "Contribution",
path: "/help/contribution",
},
{
title: "Available extensions",
path: "/extensions/",
},
],
};

View File

@ -1,27 +0,0 @@
module.exports = [
'/',
{
title: 'Contribution',
collapsable: false,
sidebarDepth: 1,
children: [
'/help/contribution'
]
},
{
title: 'Frequently Asked Questions',
path: '/help/faq/',
},
{
title: 'Guides',
path: '/help/guides/getting-started',
},
{
title: 'Forks',
path: '/forks/'
},
{
title: 'Available extensions',
path: '/extensions/'
}
];

View File

@ -1,23 +0,0 @@
module.exports = [
'/',
{
title: 'Available extensions',
path: '/extensions/'
},
{
title: 'Frequently Asked Questions',
path: '/help/faq/',
},
{
title: 'Guides',
path: '/help/guides/getting-started',
},
{
title: 'Forks',
path: '/forks/'
},
{
title: 'Contribution',
path: '/help/contribution'
}
];

View File

@ -1,23 +0,0 @@
module.exports = [
'/',
{
title: 'Frequently Asked Questions',
path: '/help/faq/'
},
{
title: 'Guides',
path: '/help/guides/getting-started',
},
{
title: 'Forks',
path: '/forks/'
},
{
title: 'Contribution',
path: '/help/contribution'
},
{
title: 'Available extensions',
path: '/extensions/'
}
];

View File

@ -1,23 +0,0 @@
module.exports = [
'/',
{
title: 'Forks',
path: '/forks/'
},
{
title: 'Frequently Asked Questions',
path: '/help/faq/',
},
{
title: 'Guides',
path: '/help/guides/getting-started',
},
{
title: 'Contribution',
path: '/help/contribution'
},
{
title: 'Available extensions',
path: '/extensions/'
}
];

View File

@ -1,52 +0,0 @@
module.exports = [
'/',
{
title: 'Guides',
collapsable: false,
sidebarDepth: 2,
children: [
{
title: 'General',
collapsable: false,
sidebarDepth: 2,
children: [
'/help/guides/getting-started',
'/help/guides/source-problems',
'/help/guides/source-migration',
'/help/guides/creating-backups',
'/help/guides/reading-local-manga',
'/help/guides/categories'
]
},
{
title: 'Settings',
collapsable: false,
sidebarDepth: 2,
children: [
'/help/guides/settings/general',
'/help/guides/settings/reader',
'/help/guides/settings/downloads',
'/help/guides/settings/tracking',
'/help/guides/settings/backup',
'/help/guides/settings/advanced'
]
}
]
},
{
title: 'Frequently Asked Questions',
path: '/help/faq/',
},
{
title: 'Forks',
path: '/forks/'
},
{
title: 'Contribution',
path: '/help/contribution'
},
{
title: 'Available extensions',
path: '/extensions/'
}
];

View File

@ -1,18 +1,18 @@
import './styles/fonts.styl' import "./styles/fonts.styl";
import './styles/animate.css' import "./styles/animate.css";
import 'sweetalert2/dist/sweetalert2.min.css'; import "./styles/sweetalert2.css";
import 'vue-material-design-icons/styles.css'; import "vue-material-design-icons/styles.css";
import { VueAgile } from 'vue-agile'; import { VueAgile } from "vue-agile";
import VueSweetalert2 from 'vue-sweetalert2'; import VueSweetalert2 from "vue-sweetalert2";
export default ({ export default ({
Vue, // the version of Vue being used in the VuePress app Vue, // the version of Vue being used in the VuePress app
options, // the options for the root Vue instance options, // the options for the root Vue instance
router, // the router instance for the app router, // the router instance for the app
siteData // site metadata siteData, // site metadata
}) => { }) => {
// eslint-disable-next-line vue/match-component-file-name // eslint-disable-next-line vue/match-component-file-name
Vue.component('Agile', VueAgile); Vue.component("Agile", VueAgile);
Vue.use(VueSweetalert2); Vue.use(VueSweetalert2);
}; };

View File

@ -1,23 +1,23 @@
{ {
"name": "Tachiyomi", "name": "Tachiyomi",
"short_name": "Tachiyomi", "short_name": "Tachiyomi",
"description": "Free and open source manga reader for Android.", "description": "Free and open source manga reader for Android.",
"lang": "en-US", "lang": "en-US",
"theme_color": "#2e84bf", "theme_color": "#2e84bf",
"background_color": "#ffffff", "background_color": "#ffffff",
"start_url": "/", "start_url": "/",
"display": "standalone", "display": "standalone",
"orientation": "portrait-primary", "orientation": "portrait-primary",
"icons": [ "icons": [
{ {
"src": "/icons/android-chrome-192x192.png", "src": "/icons/android-chrome-192x192.png",
"sizes": "192x192", "sizes": "192x192",
"type": "image/png" "type": "image/png"
}, },
{ {
"src": "/icons/android-chrome-512x512.png", "src": "/icons/android-chrome-512x512.png",
"sizes": "512x512", "sizes": "512x512",
"type": "image/png" "type": "image/png"
} }
] ]
} }

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,6 @@
@font-face @font-face
font-family 'Material Icons' font-family "Material Icons"
font-style normal font-style normal
font-weight 400 font-weight 400
src url('~material-design-icons/iconfont/MaterialIcons-Regular.eot') src url("~material-design-icons/iconfont/MaterialIcons-Regular.eot")
src local('Material Icons'), local('MaterialIcons-Regular'), url('~material-design-icons/iconfont/MaterialIcons-Regular.woff2') format('woff2'), url('~material-design-icons/iconfont/MaterialIcons-Regular.woff') format('woff'), url('~material-design-icons/iconfont/MaterialIcons-Regular.ttf') format('truetype'), url('~material-design-icons/iconfont/MaterialIcons-Regular.svg#MaterialIcons-Regular') format('svg') src local("Material Icons"), local("MaterialIcons-Regular"), url("~material-design-icons/iconfont/MaterialIcons-Regular.woff2") format("woff2"), url("~material-design-icons/iconfont/MaterialIcons-Regular.woff") format("woff"), url("~material-design-icons/iconfont/MaterialIcons-Regular.ttf") format("truetype"), url("~material-design-icons/iconfont/MaterialIcons-Regular.svg#MaterialIcons-Regular") format("svg")

View File

@ -72,7 +72,7 @@ font-feature-settings()
font-weight normal font-weight normal
&::before &::before
&::after &::after
content '' content ""
left 0 left 0
position absolute position absolute
&::before &::before

View File

@ -23,8 +23,8 @@ $MQNarrow = 959px
$MQMobile = 767px $MQMobile = 767px
$MQMobileNarrow = 419px $MQMobileNarrow = 419px
// Fonts // Fonts
$buttonFontFamily = 'Open Sans', Roboto, -apple-system, BlinkMacSystemFont, Segoe UI, Oxygen, Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif $buttonFontFamily = "Open Sans", Roboto, -apple-system, BlinkMacSystemFont, Segoe UI, Oxygen, Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif
$codeFontFamily = source-code-pro, Menlo, Monaco, Consolas, 'Courier New', monospace $codeFontFamily = source-code-pro, Menlo, Monaco, Consolas, "Courier New", monospace
// Forks // Forks
$nekoAccentColor = #3DDA83 $nekoAccentColor = #3DDA83
$j2kAccentColor = $accentColor $j2kAccentColor = $accentColor

File diff suppressed because it is too large Load Diff

View File

@ -1,182 +1,195 @@
<template> <template>
<form <form
id="search-form" id="search-form"
class="algolia-search-wrapper search-box" class="algolia-search-wrapper search-box"
role="search" role="search"
> >
<input <input
id="algolia-search-input" id="algolia-search-input"
class="search-query" class="search-query"
:placeholder="placeholder" :placeholder="placeholder"
> />
</form> </form>
</template> </template>
<script> <script>
export default { export default {
name: 'AlgoliaSearchBox', name: "AlgoliaSearchBox",
props: ['options'], props: {
options: {
type: Object,
default: () => {},
},
},
data () { data() {
return { return {
placeholder: undefined placeholder: undefined,
} };
}, },
watch: { watch: {
$lang (newValue) { $lang(newValue) {
this.update(this.options, newValue) this.update(this.options, newValue);
}, },
options (newValue) { options(newValue) {
this.update(newValue, this.$lang) this.update(newValue, this.$lang);
} },
}, },
mounted () { mounted() {
this.initialize(this.options, this.$lang) this.initialize(this.options, this.$lang);
this.placeholder = this.$site.themeConfig.searchPlaceholder || '' this.placeholder = this.$site.themeConfig.searchPlaceholder || "";
}, },
methods: { methods: {
initialize (userOptions, lang) { initialize(userOptions, lang) {
Promise.all([ Promise.all([
import(/* webpackChunkName: "docsearch" */ 'docsearch.js/dist/cdn/docsearch.min.js'), import(
import(/* webpackChunkName: "docsearch" */ 'docsearch.js/dist/cdn/docsearch.min.css') /* webpackChunkName: "docsearch" */ "docsearch.js/dist/cdn/docsearch.min.js"
]).then(([docsearch]) => { ),
docsearch = docsearch.default import(
const { algoliaOptions = {}} = userOptions /* webpackChunkName: "docsearch" */ "docsearch.js/dist/cdn/docsearch.min.css"
docsearch(Object.assign( ),
{}, ]).then(([docsearch]) => {
userOptions, // eslint-disable-next-line no-param-reassign
{ docsearch = docsearch.default;
inputSelector: '#algolia-search-input', const { algoliaOptions = {} } = userOptions;
// #697 Make docsearch work well at i18n mode. docsearch({
algoliaOptions: Object.assign({ ...userOptions,
'facetFilters': [`lang:${lang}`].concat(algoliaOptions.facetFilters || []) inputSelector: "#algolia-search-input",
}, algoliaOptions), // #697 Make docsearch work well at i18n mode.
handleSelected: (input, event, suggestion) => { algoliaOptions: {
const { pathname, hash } = new URL(suggestion.url) facetFilters: [`lang:${lang}`].concat(
const routepath = pathname.replace(this.$site.base, '/') algoliaOptions.facetFilters || []
this.$router.push(`${routepath}${hash}`) ),
} ...algoliaOptions,
} },
)) handleSelected: (input, event, suggestion) => {
}) const { pathname, hash } = new URL(suggestion.url);
}, const routepath = pathname.replace(
this.$site.base,
"/"
);
this.$router.push(`${routepath}${hash}`);
},
});
});
},
update (options, lang) { update(options, lang) {
this.$el.innerHTML = '<input id="algolia-search-input" class="search-query">' this.$el.innerHTML =
this.initialize(options, lang) '<input id="algolia-search-input" class="search-query">';
} this.initialize(options, lang);
} },
} },
};
</script> </script>
<style lang="stylus"> <style lang="stylus">
.algolia-search-wrapper .algolia-search-wrapper
& > span & > span
vertical-align middle vertical-align middle
&.search-box &.search-box
input input
border-radius 6px border-radius 6px
.algolia-autocomplete .algolia-autocomplete
line-height normal line-height normal
.ds-dropdown-menu .ds-dropdown-menu
background-color #fff background-color #fff
border 1px solid #dde0e5 border 1px solid #dde0e5
border-radius 4px border-radius 4px
font-size 16px font-size 16px
margin 6px 0 0 margin 6px 0 0
padding 12px padding 12px
text-align left text-align left
&:before &:before
border-color #dde0e5 border-color #dde0e5
[class*=ds-dataset-] [class*=ds-dataset-]
border none border none
padding 0 padding 0
.ds-suggestions .ds-suggestions
margin-top 0 margin-top 0
.ds-suggestion .ds-suggestion
border-bottom none border-bottom none
.algolia-docsearch-suggestion--text .algolia-docsearch-suggestion--text
font-size 0.7em font-size 0.7em
.algolia-docsearch-suggestion--highlight .algolia-docsearch-suggestion--highlight
color $accentColor color $accentColor
font-weight 600 font-weight 600
background rgba(143,187,237,0.05) background rgba(143,187,237,0.05)
padding 0 padding 0
.algolia-docsearch-suggestion .algolia-docsearch-suggestion
border-color $borderColor border-color $borderColor
padding 0 padding 0
.algolia-docsearch-suggestion--category-header .algolia-docsearch-suggestion--category-header
border 0px border 0px
border-bottom 1px solid #EAECEF border-bottom 1px solid #EAECEF
padding 5px 10px padding 5px 10px
margin-top 0 margin-top 0
background transparent background transparent
color $textColor color $textColor
font-weight 400 font-weight 400
.algolia-docsearch-suggestion--highlight .algolia-docsearch-suggestion--highlight
background rgba(255, 255, 255, 0.6) background rgba(255, 255, 255, 0.6)
.algolia-docsearch-suggestion--wrapper .algolia-docsearch-suggestion--wrapper
padding 0 padding 0
padding-top 0.5rem padding-top 0.5rem
.algolia-docsearch-suggestion--title .algolia-docsearch-suggestion--title
font-weight 500 font-weight 500
margin-bottom 0 margin-bottom 0
color $textColor color $textColor
.algolia-docsearch-suggestion--subcategory-column .algolia-docsearch-suggestion--subcategory-column
vertical-align top vertical-align top
padding 5px 7px 5px 5px padding 5px 7px 5px 5px
border-color $borderColor border-color $borderColor
background #fff background #fff
&:after &:after
display none display none
.algolia-docsearch-suggestion--subcategory-column-text .algolia-docsearch-suggestion--subcategory-column-text
color lighten($accentColorSecondary, 40%) color lighten($accentColorSecondary, 40%)
font-weight 400 font-weight 400
.algolia-docsearch-footer .algolia-docsearch-footer
border-color $borderColor border-color $borderColor
.ds-cursor .algolia-docsearch-suggestion--content .ds-cursor .algolia-docsearch-suggestion--content
background-color #e7edf3 !important background-color #e7edf3 !important
color $textColor color $textColor
@media (min-width: $MQMobile) @media (min-width: $MQMobile)
.algolia-search-wrapper .algolia-search-wrapper
.algolia-autocomplete .algolia-autocomplete
.algolia-docsearch-suggestion .algolia-docsearch-suggestion
.algolia-docsearch-suggestion--subcategory-column .algolia-docsearch-suggestion--subcategory-column
float none float none
width 150px width 150px
min-width 150px min-width 150px
display table-cell display table-cell
.algolia-docsearch-suggestion--content .algolia-docsearch-suggestion--content
float none float none
display table-cell display table-cell
width 100% width 100%
vertical-align top vertical-align top
.ds-dropdown-menu .ds-dropdown-menu
min-width 515px !important min-width 515px !important
@media (max-width: $MQMobile) @media (max-width: $MQMobile)
.algolia-search-wrapper .algolia-search-wrapper
.ds-dropdown-menu .ds-dropdown-menu
min-width calc(100vw - 4rem) !important min-width calc(100vw - 4rem) !important
max-width calc(100vw - 4rem) !important max-width calc(100vw - 4rem) !important
.algolia-docsearch-suggestion--wrapper .algolia-docsearch-suggestion--wrapper
padding 5px 7px 5px 5px !important padding 5px 7px 5px 5px !important
.algolia-docsearch-suggestion--subcategory-column .algolia-docsearch-suggestion--subcategory-column
padding 0 !important padding 0 !important
background white !important background white !important
.algolia-docsearch-suggestion--subcategory-column-text:after .algolia-docsearch-suggestion--subcategory-column-text:after
content " > " content " > "
font-size 10px font-size 10px
line-height 14.4px line-height 14.4px
display inline-block display inline-block
width 5px width 5px
margin -3px 3px 0 margin -3px 3px 0
vertical-align middle vertical-align middle
</style> </style>

View File

@ -230,6 +230,7 @@ export default {
popup: popup:
"animate__animated animate__faster animate__zoomOut", "animate__animated animate__faster animate__zoomOut",
}, },
// eslint-disable-next-line no-shadow
}).then((result) => { }).then((result) => {
if (result.value) { if (result.value) {
this.$swal({ this.$swal({

View File

@ -1,95 +1,114 @@
<template> <template>
<header class="navbar"> <header class="navbar">
<SidebarButton @toggle-sidebar="$emit('toggle-sidebar')" /> <SidebarButton @toggle-sidebar="$emit('toggle-sidebar')" />
<RouterLink <RouterLink :to="$localePath" class="home-link">
:to="$localePath" <img
class="home-link" v-if="$site.themeConfig.logo"
> class="logo"
<img :src="$withBase($site.themeConfig.logo)"
v-if="$site.themeConfig.logo" :alt="$siteTitle"
class="logo" />
:src="$withBase($site.themeConfig.logo)" <span
:alt="$siteTitle" v-if="$siteTitle"
> ref="siteName"
<span class="site-name"
v-if="$siteTitle" :class="{ 'can-hide': $site.themeConfig.logo }"
ref="siteName" >{{ $siteTitle }}</span
class="site-name" >
:class="{ 'can-hide': $site.themeConfig.logo }" </RouterLink>
>{{ $siteTitle }}</span>
</RouterLink>
<div <div
class="links" class="links"
:style="linksWrapMaxWidth ? { :style="
'max-width': linksWrapMaxWidth + 'px' linksWrapMaxWidth
} : {}" ? {
> 'max-width': linksWrapMaxWidth + 'px',
<div v-if="$page.frontmatter.hideSearch"/> }
<AlgoliaSearchBox : {}
v-else-if="isAlgoliaSearch" "
:options="algolia" >
/> <div v-if="$page.frontmatter.hideSearch" />
<SearchBox v-else-if="$site.themeConfig.search !== false && $page.frontmatter.search !== false" /> <AlgoliaSearchBox v-else-if="isAlgoliaSearch" :options="algolia" />
<NavLinks class="can-hide" /> <SearchBox
</div> v-else-if="
</header> $site.themeConfig.search !== false &&
$page.frontmatter.search !== false
"
/>
<NavLinks class="can-hide" />
</div>
</header>
</template> </template>
<script> <script>
import AlgoliaSearchBox from './AlgoliaSearchBox.vue' import SearchBox from "@SearchBox";
import SearchBox from '@SearchBox' import SidebarButton from "@theme/components/SidebarButton.vue";
import SidebarButton from '@theme/components/SidebarButton.vue' import NavLinks from "@theme/components/NavLinks.vue";
import NavLinks from '@theme/components/NavLinks.vue' import AlgoliaSearchBox from "./AlgoliaSearchBox.vue";
export default { export default {
name: 'Navbar', name: "Navbar",
components: { components: {
SidebarButton, SidebarButton,
NavLinks, NavLinks,
SearchBox, SearchBox,
AlgoliaSearchBox AlgoliaSearchBox,
}, },
data () { data() {
return { return {
linksWrapMaxWidth: null linksWrapMaxWidth: null,
} };
}, },
computed: { computed: {
algolia () { algolia() {
return this.$themeLocaleConfig.algolia || this.$site.themeConfig.algolia || {} return (
}, this.$themeLocaleConfig.algolia ||
this.$site.themeConfig.algolia ||
{}
);
},
isAlgoliaSearch () { isAlgoliaSearch() {
return this.algolia && this.algolia.apiKey && this.algolia.indexName return (
} this.algolia && this.algolia.apiKey && this.algolia.indexName
}, );
},
},
mounted () { mounted() {
const MOBILE_DESKTOP_BREAKPOINT = 719 // refer to config.styl const MOBILE_DESKTOP_BREAKPOINT = 719; // refer to config.styl
const NAVBAR_VERTICAL_PADDING = parseInt(css(this.$el, 'paddingLeft')) + parseInt(css(this.$el, 'paddingRight')) const NAVBAR_VERTICAL_PADDING =
const handleLinksWrapWidth = () => { // eslint-disable-next-line radix
if (document.documentElement.clientWidth < MOBILE_DESKTOP_BREAKPOINT) { parseInt(css(this.$el, "paddingLeft")) +
this.linksWrapMaxWidth = null // eslint-disable-next-line radix
} else { parseInt(css(this.$el, "paddingRight"));
this.linksWrapMaxWidth = this.$el.offsetWidth - NAVBAR_VERTICAL_PADDING const handleLinksWrapWidth = () => {
- (this.$refs.siteName && this.$refs.siteName.offsetWidth || 0) if (
} document.documentElement.clientWidth < MOBILE_DESKTOP_BREAKPOINT
} ) {
handleLinksWrapWidth() this.linksWrapMaxWidth = null;
window.addEventListener('resize', handleLinksWrapWidth, false) } else {
} this.linksWrapMaxWidth =
} this.$el.offsetWidth -
NAVBAR_VERTICAL_PADDING -
((this.$refs.siteName && this.$refs.siteName.offsetWidth) ||
0);
}
};
handleLinksWrapWidth();
window.addEventListener("resize", handleLinksWrapWidth, false);
},
};
function css (el, property) { function css(el, property) {
// NOTE: Known bug, will return 'auto' if style value is 'auto' // NOTE: Known bug, will return "auto" if style value is "auto"
const win = el.ownerDocument.defaultView const win = el.ownerDocument.defaultView;
// null means not to return pseudo styles // null means not to return pseudo styles
return win.getComputedStyle(el, null)[property] return win.getComputedStyle(el, null)[property];
} }
</script> </script>
@ -98,44 +117,44 @@ $navbar-vertical-padding = 0.7rem
$navbar-horizontal-padding = 1.5rem $navbar-horizontal-padding = 1.5rem
.navbar .navbar
padding $navbar-vertical-padding $navbar-horizontal-padding padding $navbar-vertical-padding $navbar-horizontal-padding
line-height $navbarHeight - 1.4rem line-height $navbarHeight - 1.4rem
a, span, img a, span, img
display inline-block display inline-block
.logo .logo
height $navbarHeight - 1.4rem height $navbarHeight - 1.4rem
min-width $navbarHeight - 1.4rem min-width $navbarHeight - 1.4rem
margin-right 0.8rem margin-right 0.8rem
vertical-align top vertical-align top
.site-name .site-name
font-size 1.3rem font-size 1.3rem
font-weight 600 font-weight 600
color $textColor color $textColor
position relative position relative
.links .links
padding-left 1.5rem padding-left 1.5rem
box-sizing border-box box-sizing border-box
background-color white background-color white
white-space nowrap white-space nowrap
font-size 0.9rem font-size 0.9rem
position absolute position absolute
right $navbar-horizontal-padding right $navbar-horizontal-padding
top $navbar-vertical-padding top $navbar-vertical-padding
display flex display flex
.search-box .search-box
flex: 0 0 auto flex: 0 0 auto
vertical-align top vertical-align top
@media (max-width: $MQMobile) @media (max-width: $MQMobile)
.navbar .navbar
padding-left 4rem padding-left 4rem
.can-hide .can-hide
display none display none
.links .links
padding-left 1.5rem padding-left 1.5rem
.site-name .site-name
width calc(100vw - 9.4rem) width calc(100vw - 9.4rem)
overflow hidden overflow hidden
white-space nowrap white-space nowrap
text-overflow ellipsis text-overflow ellipsis
</style> </style>

View File

@ -1,3 +1,3 @@
module.exports = { module.exports = {
extend: "@vuepress/theme-default" extend: "@vuepress/theme-default",
}; };

View File

@ -6,14 +6,14 @@ buttonDownload: Download
buttonGuides: User guide buttonGuides: User guide
buttonGuidesLink: /help/guides/getting-started buttonGuidesLink: /help/guides/getting-started
features: features:
- title: Tracking - title: Tracking
details: Automatically keep track of your manga with MyAnimeList, AniList, Kitsu, Shikimori, and Bangumi. details: Automatically keep track of your manga with MyAnimeList, AniList, Kitsu, Shikimori, and Bangumi.
image: Library image: Library
- title: Extensions - title: Extensions
details: Online reading from sources such as MangaDex, MangaKakalot and hundreds more. details: Online reading from sources such as MangaDex, MangaKakalot and hundreds more.
image: Browse image: Browse
- title: Customization - title: Customization
details: A configurable reader with multiple viewers, reading directions and other settings. details: A configurable reader with multiple viewers, reading directions and other settings.
image: Manga image: Manga
footer: Apache Licensed | Copyright © 2015-present Javier Tomás footer: Apache Licensed | Copyright © 2015-present Javier Tomás
--- ---

View File

@ -47,6 +47,6 @@ Visit our translation project [here](https://hosted.weblate.org/projects/tachiyo
## Donation ## Donation
If you can't contribute code or translations but you still wish to help, then you can choose to contribute directly to the projects founder, [Inorichi](https://github.com/inorichi/) by using the button below, or going [directly to Ko-Fi](https://ko-fi.com/inorichi). If you can't contribute code or translations but you still wish to help, then you can choose to contribute directly to the projects founder, [Inorichi](https://github.com/inorichi/) by using the button below, or going [directly to Ko-Fi](https://ko-fi.com/inorichi).
*** ***
<a href='https://ko-fi.com/inorichi' target='_blank' rel='noopener'> <a href="https://ko-fi.com/inorichi" target="_blank" rel="noopener">
<img height='36' style='border:0px;height:36px;' src='https://cdn.ko-fi.com/cdn/kofi1.png?v=2' border='0' alt='Buy Me a Coffee at ko-fi.com' /> <img height="36" style="border:0px;height:36px;" src="https://cdn.ko-fi.com/cdn/kofi1.png?v=2" border="0" alt="Buy Me a Coffee at ko-fi.com" />
</a> </a>

View File

@ -36,40 +36,40 @@ All examples are illustrations and may not reflect what actually happens.
<Carousel name="carousel-scale-type"> <Carousel name="carousel-scale-type">
<CarouselItem> <CarouselItem>
<figure class="centered"> <figure class="centered">
<h4>Fit screen</h4> <h4>Fit screen</h4>
<p>Will fit either to width or height depending on image resolution</p> <p>Will fit either to width or height depending on image resolution</p>
<img height="400" intrinsicsize="208x500" width="260" :src="$withBase('/assets/media/fitscreen.png')"> <img height="400" intrinsicsize="208x500" width="260" :src="$withBase('/assets/media/fitscreen.png')">
</figure> </figure>
</CarouselItem> </CarouselItem>
<CarouselItem> <CarouselItem>
<figure class="centered"> <figure class="centered">
<h4>Stretch</h4> <h4>Stretch</h4>
<img height="400" intrinsicsize="208x500" width="260" :src="$withBase('/assets/media/stretch.png')"> <img height="400" intrinsicsize="208x500" width="260" :src="$withBase('/assets/media/stretch.png')">
</figure> </figure>
</CarouselItem> </CarouselItem>
<CarouselItem> <CarouselItem>
<figure class="centered"> <figure class="centered">
<h4>Fit width</h4> <h4>Fit width</h4>
<img height="400" intrinsicsize="208x500" width="260" :src="$withBase('/assets/media/fitwidth.png')"> <img height="400" intrinsicsize="208x500" width="260" :src="$withBase('/assets/media/fitwidth.png')">
</figure> </figure>
</CarouselItem> </CarouselItem>
<CarouselItem> <CarouselItem>
<figure class="centered"> <figure class="centered">
<h4>Fit height</h4> <h4>Fit height</h4>
<img height="400" intrinsicsize="208x500" width="260" :src="$withBase('/assets/media/fitheight.png')"> <img height="400" intrinsicsize="208x500" width="260" :src="$withBase('/assets/media/fitheight.png')">
</figure> </figure>
</CarouselItem> </CarouselItem>
<CarouselItem> <CarouselItem>
<figure class="centered"> <figure class="centered">
<h4>Original size</h4> <h4>Original size</h4>
<p>Will be either zoom in or out depending on image resolution</p> <p>Will be either zoom in or out depending on image resolution</p>
<img height="400" intrinsicsize="208x500" width="260" :src="$withBase('/assets/media/originalsize.png')"> <img height="400" intrinsicsize="208x500" width="260" :src="$withBase('/assets/media/originalsize.png')">
</figure> </figure>
</CarouselItem> </CarouselItem>
<CarouselItem> <CarouselItem>
<figure class="centered"> <figure class="centered">
<h4>Smart fit</h4> <h4>Smart fit</h4>
<p>Fits to the longest side of the image</p> <p>Fits to the longest side of the image</p>
<img height="400" intrinsicsize="208x500" width="260" :src="$withBase('/assets/media/smartfit.png')"> <img height="400" intrinsicsize="208x500" width="260" :src="$withBase('/assets/media/smartfit.png')">
</figure> </figure>
</CarouselItem> </CarouselItem>
@ -90,23 +90,23 @@ All examples are illustrations
<Carousel name="carousel-zoom-start-position"> <Carousel name="carousel-zoom-start-position">
<CarouselItem> <CarouselItem>
<figure class="centered"> <figure class="centered">
<h4>Left</h4> <h4>Left</h4>
<p>Will start at the left side of the page.</p> <p>Will start at the left side of the page.</p>
<img height="400" intrinsicsize="208x500" width="260" :src="$withBase('/assets/media/zoomstartpositionleft.png')"> <img height="400" intrinsicsize="208x500" width="260" :src="$withBase('/assets/media/zoomstartpositionleft.png')">
</figure> </figure>
</CarouselItem> </CarouselItem>
<CarouselItem> <CarouselItem>
<figure class="centered"> <figure class="centered">
<h4>Right</h4> <h4>Right</h4>
<p>Will start at the right side of the page.</p> <p>Will start at the right side of the page.</p>
<img height="400" intrinsicsize="208x500" width="260" :src="$withBase('/assets/media/zoomstartpositionright.png')"> <img height="400" intrinsicsize="208x500" width="260" :src="$withBase('/assets/media/zoomstartpositionright.png')">
</figure> </figure>
</CarouselItem> </CarouselItem>
<CarouselItem> <CarouselItem>
<figure class="centered"> <figure class="centered">
<h4>Center</h4> <h4>Center</h4>
<p>Will start at the center of the page.</p> <p>Will start at the center of the page.</p>
<img height="400" intrinsicsize="208x500" width="260" :src="$withBase('/assets/media/zoomstartpositioncenter.png')"> <img height="400" intrinsicsize="208x500" width="260" :src="$withBase('/assets/media/zoomstartpositioncenter.png')">
</figure> </figure>
</CarouselItem> </CarouselItem>
</Carousel> </Carousel>
@ -126,16 +126,16 @@ This allows you to control what color the background should be in reader. Backgr
<Carousel name="carousel-background-color"> <Carousel name="carousel-background-color">
<CarouselItem> <CarouselItem>
<figure class="centered"> <figure class="centered">
<img height="400" intrinsicsize="208x500" width="260" :src="$withBase('/assets/media/backgroundcolorblack.png')"> <img height="400" intrinsicsize="208x500" width="260" :src="$withBase('/assets/media/backgroundcolorblack.png')">
<h4>Black</h4> <h4>Black</h4>
<p>Surrounds page with black. With an AMOLED screen you can save battery by using this.</p> <p>Surrounds page with black. With an AMOLED screen you can save battery by using this.</p>
</figure> </figure>
</CarouselItem> </CarouselItem>
<CarouselItem> <CarouselItem>
<figure class="centered"> <figure class="centered">
<img height="400" intrinsicsize="208x500" width="260" :src="$withBase('/assets/media/backgroundcolorwhite.png')"> <img height="400" intrinsicsize="208x500" width="260" :src="$withBase('/assets/media/backgroundcolorwhite.png')">
<h4>White</h4> <h4>White</h4>
<p>Surrounds page with white. Makes pages seemless with the screen.</p> <p>Surrounds page with white. Makes pages seemless with the screen.</p>
</figure> </figure>
</CarouselItem> </CarouselItem>
</Carousel> </Carousel>
@ -172,14 +172,14 @@ Tries to remove excess white borders
<Carousel name="carousel-crop-borders"> <Carousel name="carousel-crop-borders">
<CarouselItem> <CarouselItem>
<figure class="centered"> <figure class="centered">
<h4>With Crop borders on</h4> <h4>With Crop borders on</h4>
<img height="400" intrinsicsize="208x500" width="260" :src="$withBase('/assets/media/withcropborder.png')"> <img height="400" intrinsicsize="208x500" width="260" :src="$withBase('/assets/media/withcropborder.png')">
</figure> </figure>
</CarouselItem> </CarouselItem>
<CarouselItem> <CarouselItem>
<figure class="centered"> <figure class="centered">
<h4>With Crop borders off</h4> <h4>With Crop borders off</h4>
<img height="400" intrinsicsize="208x500" width="260" :src="$withBase('/assets/media/withoutcropborder.png')"> <img height="400" intrinsicsize="208x500" width="260" :src="$withBase('/assets/media/withoutcropborder.png')">
</figure> </figure>
</CarouselItem> </CarouselItem>
</Carousel> </Carousel>

View File

@ -12,8 +12,7 @@ Migration is the process of moving manga from one source to another while keepin
1. Go to <Navigation item="more"/> and tap <Navigation item="source_migration"/>. 1. Go to <Navigation item="more"/> and tap <Navigation item="source_migration"/>.
1. Select the **Source** you're migrating from. 1. Select the **Source** you're migrating from.
1. Find and select the title that you want to migrate. 1. Find and select the title that you want to migrate.
> **Tachiyomi** will do a global search of all the sources you have installed and enabled. If you don't find the manga you want, try searching for other titles it might go under.
**Tachiyomi** will do a global search of all the sources you have installed and enabled. If you don't find the manga you want, try searching for other titles it might go under.
1. Once you find the manga you want to migrate, select it and then choose which data you want to transfer over, and you're done. 1. Once you find the manga you want to migrate, select it and then choose which data you want to transfer over, and you're done.
::: :::

View File

@ -54,9 +54,9 @@ In this case it is a problem with the site.
You can open WebView in two of the following ways: You can open WebView in two of the following ways:
* If you already have a manga in **Library** * If you already have a manga in **Library**
* Open the manga in **Library**, then click on the <Navigation item="webview"/> on the **INFO** tab. * Open the manga in **Library**, then click on the <Navigation item="webview"/> on the **INFO** tab.
* If you don't have manga in **Library** * If you don't have manga in **Library**
* Go to <Navigation item="browse"/> and click on **BROWSE** beside the source. Then open a manga and click on <Navigation item="webview"/>. * Go to <Navigation item="browse"/> and click on **BROWSE** beside the source. Then open a manga and click on <Navigation item="webview"/>.
Once in WebView, you will see a webpage and a bar on top with an arrow at the left side, pointing to the left edge of your screen. Once in WebView, you will see a webpage and a bar on top with an arrow at the left side, pointing to the left edge of your screen.
If there is no CAPTCHA on the webpage, initiate one by tapping a manga title, if possible. Once a CAPTCHA is shown, solve it. After that, use the aforementioned back arrow on the bar at the top of your screen to go back to your manga. Please do not use the back button on your phone as it does not work as expected. If there is no CAPTCHA on the webpage, initiate one by tapping a manga title, if possible. Once a CAPTCHA is shown, solve it. After that, use the aforementioned back arrow on the bar at the top of your screen to go back to your manga. Please do not use the back button on your phone as it does not work as expected.